From 185adc1e0e7b4a85195fdaaf7c82d3bac5d2f7fa Mon Sep 17 00:00:00 2001 From: Fox Date: Mon, 5 Dec 2022 17:55:06 +1000 Subject: [PATCH 1/3] Mouse drag KP5 clears selection Confirm on exit --- Autarky2/Autarky2.love | Bin 65396541 -> 65420669 bytes Autarky2/constants.lua | 3 ++ Autarky2/draw.lua | 23 ++++++++-- Autarky2/functions.lua | 2 + Autarky2/gui.lua | 8 ++-- Autarky2/main.lua | 63 ++++++++++++++++++++++++---- Autarky2/people.lua | 93 +++++++++++++++++++++-------------------- 7 files changed, 131 insertions(+), 61 deletions(-) diff --git a/Autarky2/Autarky2.love b/Autarky2/Autarky2.love index 1963ba7f00ae2963b75b3c57c9fc0d60218505de..96b0f793ed6750d9dd3b47dd59c4351c427e9093 100644 GIT binary patch delta 39828 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 O6SN>uGW|MIdi+1-nuzQG delta 15533 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 M5&1XHV?;#%3#KP@q5uE@ diff --git a/Autarky2/constants.lua b/Autarky2/constants.lua index fe0d3c8..bbfb95f 100644 --- a/Autarky2/constants.lua +++ b/Autarky2/constants.lua @@ -21,6 +21,9 @@ function constants.load() MAP = {} SHOW_OPTIONS = false MARKET_RESOLVED = false + + MOUSE_DOWN_X = nil + MOUSE_DOWN_Y = nil SCREEN_STACK = {} IMAGES = {} diff --git a/Autarky2/draw.lua b/Autarky2/draw.lua index 51b194f..b0de48b 100644 --- a/Autarky2/draw.lua +++ b/Autarky2/draw.lua @@ -99,10 +99,6 @@ function draw.daynight() -- love.graphics.setColor(1,1,1,1) -- love.graphics.points(100,100,200,200,300,300,400,400) end - - - - end function draw.graphs() @@ -238,4 +234,23 @@ function draw.imageQueue() end end +function draw.optionScreen() + tax_rate_up_button:show() + tax_rate_down_button:show() + close_options_button:show() + exit_game_button:hide() + + love.graphics.setColor(1,1,1,1) + love.graphics.print(SALES_TAX, 300, 415) +end + +function draw.exitScreen() + tax_rate_up_button:hide() + tax_rate_down_button:hide() + close_options_button:hide() + + exit_game_button:show() + +end + return draw diff --git a/Autarky2/functions.lua b/Autarky2/functions.lua index 3220c53..ab9c795 100644 --- a/Autarky2/functions.lua +++ b/Autarky2/functions.lua @@ -101,6 +101,8 @@ function functions.getTileXY(row, col) end function functions.getDrawXY(person) + -- returns the screen x/y + -- used to detect mouse interactions local row = person.row local col = person.col local x = person.x diff --git a/Autarky2/gui.lua b/Autarky2/gui.lua index d39a8b4..a9045a2 100644 --- a/Autarky2/gui.lua +++ b/Autarky2/gui.lua @@ -23,9 +23,11 @@ function gui.load() if SALES_TAX < 0 then SALES_TAX = 0 end end - - - + exit_game_button = gspot:button('Exit game', {x = 225, y = 400, w = 100, h = gspot.style.unit}) + exit_game_button.click = function(this, x, y, button) + cf.RemoveScreen(SCREEN_STACK) + --! can invoke the 'quit' option here for safety + end end diff --git a/Autarky2/main.lua b/Autarky2/main.lua index 98459dd..54ab193 100644 --- a/Autarky2/main.lua +++ b/Autarky2/main.lua @@ -33,7 +33,9 @@ require 'gui' function love.keyreleased( key, scancode ) if key == "escape" then - cf.RemoveScreen(SCREEN_STACK) + if cf.CurrentScreenName(SCREEN_STACK) ~= "ExitGame" then + cf.RemoveScreen(SCREEN_STACK) + end end if key == "space" then -- pause @@ -130,6 +132,8 @@ function love.keyreleased( key, scancode ) ZOOMFACTOR = 1 TRANSLATEX = SCREEN_WIDTH / 2 TRANSLATEY = SCREEN_HEIGHT / 2 + + people.unselectAll() end end @@ -152,6 +156,16 @@ function love.keypressed( key, scancode, isrepeat ) end function love.mousemoved( x, y, dx, dy, istouch ) + local wx, wy = cam:toWorld(x, y) -- converts screen x/y to world x/y + + if love.mouse.isDown(1) then + if MOUSE_DOWN_X == nil then + -- start the drag operation + MOUSE_DOWN_X = wx + MOUSE_DOWN_Y = wy + end + end + if love.mouse.isDown(3) then TRANSLATEX = TRANSLATEX - dx TRANSLATEY = TRANSLATEY - dy @@ -185,6 +199,24 @@ end function love.mousereleased( x, y, button, istouch, presses ) local wx, wy = cam:toWorld(x, y) -- converts screen x/y to world x/y lovelyToasts.mousereleased(wx, wy, button) + + if MOUSE_DOWN_X ~= nil and button == 1 then + + -- cycle through persons and select all inside bounding box + for _, person in pairs(PERSONS) do + local x2, y2 = fun.getDrawXY(person) + if x2 > MOUSE_DOWN_X and x2 < wx then + if y2 > MOUSE_DOWN_Y and y2 < wy then + person.isSelected = true + end + end + end + end + + -- used for mouse box dragging thingy + MOUSE_DOWN_X = nil + MOUSE_DOWN_Y = nil + end function love.wheelmoved(x, y) @@ -201,7 +233,7 @@ end function love.load() - love.window.setMode(800, 600, {resizable = true, display = 1, fullscreen = true}) + love.window.setMode(800, 600, {resizable = true, display = 1}) res.setGame(1920, 1080) SCREEN_WIDTH = 1920 @@ -213,6 +245,7 @@ function love.load() love.keyboard.setKeyRepeat(true) love.keyboard.setKeyRepeat(true) + cf.AddScreen("ExitGame", SCREEN_STACK) cf.AddScreen("World", SCREEN_STACK) fun.initialiseMap() -- initialises 2d map with nils @@ -246,6 +279,20 @@ function love.draw() tax_rate_up_button:hide() tax_rate_down_button:hide() close_options_button:hide() + exit_game_button:hide() + + if currentscreen == "World" then + -- do the mouse dragging thingy + if MOUSE_DOWN_X ~= nil then + -- draw box + local x, y = love.mouse.getPosition() + local wx, wy = cam:toWorld(x, y) -- converts screen x/y to world x/y + local boxwidth = wx - MOUSE_DOWN_X + local boxheight = wy - MOUSE_DOWN_Y + love.graphics.setColor(1,1,1,1) + love.graphics.rectangle("line", MOUSE_DOWN_X, MOUSE_DOWN_Y, boxwidth, boxheight) + end + end if currentscreen == "Graphs" then draw.graphs() @@ -253,14 +300,14 @@ function love.draw() else close_graph_button:hide() end + cam:detach() elseif currentscreen == "Options" then - tax_rate_up_button:show() - tax_rate_down_button:show() - close_options_button:show() - - love.graphics.setColor(1,1,1,1) - love.graphics.print(SALES_TAX, 300, 415) + draw.optionScreen() + elseif currentscreen == "ExitGame" then + draw.exitScreen() + else + error("Current screen is " .. currentscreen) end lovelyToasts.draw() diff --git a/Autarky2/people.lua b/Autarky2/people.lua index e3a205e..8578b7e 100644 --- a/Autarky2/people.lua +++ b/Autarky2/people.lua @@ -346,6 +346,42 @@ local function makeBid(person, stocknumber, maxqty) fun.getRandomMarketXY(person) end +local function bidForFood(person) + local wealth = person.stock[enum.stockWealth] + + -- determine bid price + local bidprice = marketplace.determineCommodityPrice(person.beliefRange[enum.stockFood]) + bidprice = cf.round(bidprice, 2) + + -- determine bid qty + local maxqtycanafford = wealth / bidprice + local maxqtycanhold = 14 - person.stock[enum.stockFood] + local maxqtytobuy = math.min(maxqtycanafford, maxqtycanhold) + local bidqty = marketplace.determineQty(maxqtytobuy, person.stockPriceHistory[enum.stockFood]) -- accepts nil history + bidqty = cf.round(bidqty) + + -- register the bid + marketplace.createBid(enum.stockFood, bidqty, bidprice, person.guid) + + -- set destination = market + fun.getRandomMarketXY(person) +end + +local function genericSellOutputStock(person, stockoutput) + local maxqtytosell = person.stock[stockoutput] + local askqty = marketplace.determineQty(maxqtytosell, person.stockPriceHistory[stockoutput]) -- commodity, maxQty, commodityKnowledge + askqty = cf.round(askqty) + + -- determine ask price + local askprice = marketplace.determineCommodityPrice(person.beliefRange[stockoutput]) + askprice = cf.round(askprice) + -- register the ask + marketplace.createAsk(stockoutput, askqty, askprice, person.guid) + + -- set destination = market + fun.getRandomMarketXY(person) +end + function people.doMarketplace() -- determine if they need to buy/sell @@ -354,24 +390,7 @@ function people.doMarketplace() -- food if person.stock[enum.stockFood] < 7 and person.occupation ~= enum.jobFarmer then -- try to buy food - local wealth = person.stock[enum.stockWealth] - - -- determine bid price - local bidprice = marketplace.determineCommodityPrice(person.beliefRange[enum.stockFood]) - bidprice = cf.round(bidprice, 2) - - -- determine bid qty - local maxqtycanafford = wealth / bidprice - local maxqtycanhold = 14 - person.stock[enum.stockFood] - local maxqtytobuy = math.min(maxqtycanafford, maxqtycanhold) - local bidqty = marketplace.determineQty(maxqtytobuy, person.stockPriceHistory[enum.stockFood]) -- accepts nil history - bidqty = cf.round(bidqty) - - -- register the bid - marketplace.createBid(enum.stockFood, bidqty, bidprice, person.guid) - - -- set destination = market - fun.getRandomMarketXY(person) + bidForFood(person) end -- buy herbs @@ -392,42 +411,17 @@ function people.doMarketplace() local stockinput = person.occupationstockinput -- stock type local wealth = person.stock[enum.stockWealth] if stockinput ~= nil and stockinput < 7 then - local bidprice = marketplace.determineCommodityPrice(person.beliefRange[stockinput]) - bidprice = cf.round(bidprice) - local maxqtycanafford = wealth / bidprice - local maxqtycanhold = 14 - person.stock[stockinput] - local maxqtytobuy = math.min(maxqtycanafford, maxqtycanhold) - local bidqty = marketplace.determineQty(maxqtytobuy, person.stockPriceHistory[stockinput]) -- accepts nil history - bidqty = cf.round(bidqty) - marketplace.createBid(stockinput, bidqty, bidprice, person.guid) - - -- set destination = market - fun.getRandomMarketXY(person) + makeBid(person, stockinput) --! need to test this end -- generic stock sell -- make an ask (sell) local stockoutput = person.occupationstockoutput -- stock type if stockoutput ~= nil and person.stock[stockoutput] >= STOCK_QTY_SELLPOINT[stockoutput] then - local maxqtytosell = person.stock[stockoutput] - local askqty = marketplace.determineQty(maxqtytosell, person.stockPriceHistory[stockoutput]) -- commodity, maxQty, commodityKnowledge - askqty = cf.round(askqty) - - -- determine ask price - local askprice = marketplace.determineCommodityPrice(person.beliefRange[stockoutput]) - askprice = cf.round(askprice) - -- register the ask - marketplace.createAsk(stockoutput, askqty, askprice, person.guid) - - -- set destination = market - fun.getRandomMarketXY(person) - - -- if stockoutput == enum.stockHerbs then - -- print("Tried to sell herbs for $" .. askprice) - -- end + genericSellOutputStock(person, stockoutput) --! need to test this end - --! need something about buying luxuries (wants) + --! need something about buying luxuries (wants/comfort) end -- resolve bids/asks after all persons have had a chance to update orders @@ -576,5 +570,12 @@ function people.getOccupationCount() return result end +function people.unselectAll() + -- ensure all persons are unselected + for _, person in pairs(PERSONS) do + person.isSelected = false + end +end + return people From d1eef7abe88cd0034c588fa9e985f335b2268a40 Mon Sep 17 00:00:00 2001 From: Fox Date: Mon, 5 Dec 2022 18:14:13 +1000 Subject: [PATCH 2/3] Lots of bug fixing --- Autarky2/constants.lua | 4 +- Autarky2/lib/resolution_solution.lua | 220 +++++++++++++-------------- Autarky2/main.lua | 22 ++- 3 files changed, 131 insertions(+), 115 deletions(-) diff --git a/Autarky2/constants.lua b/Autarky2/constants.lua index bbfb95f..0e2d736 100644 --- a/Autarky2/constants.lua +++ b/Autarky2/constants.lua @@ -15,13 +15,13 @@ function constants.load() TRANSLATEX = cf.round(SCREEN_WIDTH / 2) -- starts the camera in the middle of the ocean TRANSLATEY = cf.round(SCREEN_HEIGHT / 2) -- need to round because this is working with pixels - ZOOMFACTOR = 1 + ZOOMFACTOR = 0.95 GAME_LOG_DRAWX = SCREEN_WIDTH - 275 MAP = {} SHOW_OPTIONS = false MARKET_RESOLVED = false - + MOUSE_DOWN_X = nil MOUSE_DOWN_Y = nil diff --git a/Autarky2/lib/resolution_solution.lua b/Autarky2/lib/resolution_solution.lua index eb9b29b..7ca1432 100644 --- a/Autarky2/lib/resolution_solution.lua +++ b/Autarky2/lib/resolution_solution.lua @@ -9,31 +9,31 @@ local rs = { _NAME = "Resolution Solution", _LICENSE = "The Unlicense", _LICENSE_TEXT = [[ -This is free and unencumbered software released into the public domain. - -Anyone is free to copy, modify, publish, use, compile, sell, or -distribute this software, either in source code form or as a compiled -binary, for any purpose, commercial or non-commercial, and by any -means. - -In jurisdictions that recognize copyright laws, the author or authors -of this software dedicate any and all copyright interest in the -software to the public domain. We make this dedication for the benefit -of the public at large and to the detriment of our heirs and -successors. We intend this dedication to be an overt act of -relinquishment in perpetuity of all present and future rights to this -software under copyright law. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -For more information, please refer to -]] + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + For more information, please refer to + ]] } -- Callback functions, that will be triggered when window size is changed @@ -114,7 +114,7 @@ rs.update = function() -- scale for game virtual size local scaleWidth, scaleHeight - + -- offset for black bars local xOff, yOff @@ -126,110 +126,110 @@ rs.update = function() -- get aspect of window and virtual game size local gameAspect = gameWidth / gameHeight local windowAspect = windowWidth / windowHeight - + -- check rs.gameChanged() callback local oldGameAspect = rs.gameAspect - + -- check rs.windowChanged() callback local oldWindowAspect = rs.windowAspect - + -- scale mode local scaleMode = rs.scaleMode - + -- Game zone local gameZone = rs.gameZone - + if scaleMode == 1 then -- if window height > game height; create black bars on top and bottom if gameAspect > windowAspect then local scale = windowWidth / gameWidth - + local barHeight = math.abs((gameHeight * scale - windowHeight) / 2) - + scaleWidth, scaleHeight = scale, scale - + x1, y1, w1, h1 = 0, 0, windowWidth, barHeight x2, y2, w2, h2 = 0, windowHeight, windowWidth, barHeight * -1 - + xOff, yOff = 0, windowHeight / 2 - (scale * gameHeight) / 2 -- if window width > game width; create bars on left and right sides elseif gameAspect < windowAspect then local scale = windowHeight / gameHeight - + local barWidth = math.abs((gameWidth * scale - windowWidth) / 2) - + scaleWidth, scaleHeight = scale, scale - + x1, y1, w1, h1 = 0, 0, barWidth, windowHeight x2, y2, w2, h2 = windowWidth, 0, barWidth * -1, windowHeight - + xOff = windowWidth / 2 - (scale * gameWidth) / 2 yOff = 0 else -- if window and game size equal scaleWidth, scaleHeight = 1, 1 - + x1, y1, w1, h1 = 0, 0, 0, 0 x2, y2, w2, h2 = 0, 0, 0, 0 - + xOff, yOff = 0, 0 end -- end aspect scaling method end -- end scaleMode == 1 - + -- stretch scaling method; 2 which fills entire window if scaleMode == 2 then - + scaleWidth = windowWidth / gameWidth scaleHeight = windowHeight / gameHeight - + x1, y1, w1, h1 = 0, 0, 0, 0 x2, y2, w2, h2 = 0, 0, 0, 0 - + xOff, yOff = 0, 0 - + --[[ centerX, centerY = gam topLeft, topRight = 0 bottomLeft, bottomRight = 0 - leftCenterX, rightCenterX = - topCenterY, bottomCenterY = + leftCenterX, rightCenterX = + topCenterY, bottomCenterY = --]] - + end -- end stretch scaling method -- write all changes to library - + -- black bars rs.x1, rs.y1, rs.w1, rs.h1 = x1, y1, w1, h1 rs.x2, rs.y2, rs.w2, rs.h2 = x2, y2, w2, h2 - + -- offset generated for black bars rs.xOff, rs.yOff = xOff, yOff - + -- scale rs.scaleWidth, rs.scaleHeight = scaleWidth, scaleHeight - + -- window size rs.windowWidth, rs.windowHeight = windowWidth, windowHeight - + -- aspects rs.gameAspect, rs.windowAspect = gameAspect, windowAspect - + -- game zone - + gameZone.x = xOff gameZone.y = yOff gameZone.w = windowWidth - (xOff * 2) gameZone.h = windowHeight - (yOff * 2) - + -- Call rs.gameChanged() if virtual game size is changed if oldGameAspect ~= gameAspect then rs.gameChanged() end - + -- Call rs.windowChanged() if window size is changed if oldWindowAspect ~= windowAspect then rs.windowChanged() @@ -240,16 +240,16 @@ end rs.start = function() -- Start scaling graphics until rs.stop(). -- Everything inside this function will be scaled to fit virtual game size - + -- prepare to scale love.graphics.push() - + -- reset transformation love.graphics.origin() -- set offset, based on size of black bars love.graphics.translate(rs.xOff, rs.yOff) - + -- scale game love.graphics.scale(rs.scaleWidth, rs.scaleHeight) end @@ -257,7 +257,7 @@ end rs.stop = function() -- Stop scaling caused by rs.start() -- and draw black bars, if needed. - + -- stop scaling love.graphics.pop() @@ -267,10 +267,10 @@ end -- end rs.stop rs.unscaleStart = function() -- Reset scaling with love.origin() until rs.unscaleStop(). -- With that you can, for example, draw ui with custom scaling. - + -- start unscaling love.graphics.push() - + -- reset coordinates and scaling love.graphics.origin() end @@ -278,7 +278,7 @@ end rs.unscaleStop = function() -- Stop scaling caused by rs.unscaleStart(). -- With that you can, for example, draw ui with custom scaling. - + -- stop unscaling love.graphics.pop() end @@ -323,18 +323,18 @@ rs.drawBlackBars = function() -- Function that will draw back bars. -- Can be called outside of rs.start rs.stop. -- Might be useful when you need just to draw black bars, without scaling via rs.start. - + -- do nothing if we don't need draw bars or we in aspect scaling mode (1; with black bars) if not rs.drawBars or rs.scaleMode ~= 1 then return end - + -- get colors, that was before rs.stop() function local r, g, b, a = love.graphics.getColor() - + -- prepare to draw black bars love.graphics.push() - + -- reset transformation love.graphics.origin() @@ -345,10 +345,10 @@ rs.drawBlackBars = function() love.graphics.rectangle("fill", rs.x1, rs.y1, rs.w1, rs.h1) -- draw right or bottom most love.graphics.rectangle("fill", rs.x2, rs.y2, rs.w2, rs.h2) - + -- return original colors that was before rs.stop() love.graphics.setColor(r, g, b, a) - + -- end black bars rendering love.graphics.pop() end @@ -361,7 +361,7 @@ end rs.switchScaleMode = function() -- Function to switch in-between scale modes. - if rs.scaleMode ~= 1 then + if rs.scaleMode ~= 1 then rs.scaleMode = 1 -- aspect mode else rs.scaleMode = 2 -- stretch mode @@ -389,7 +389,7 @@ end rs.switchDrawBars = function() -- Turn of/off rendering for black bars. - + rs.drawBars = not rs.drawBars end @@ -403,17 +403,17 @@ rs.isMouseInside = function() if rs.scaleMode == 2 then return true end - + -- get mouse coordinates local mouseX, mouseY = love.mouse.getPosition() - + -- get offset -- also, as will be mentioned in rs.toGame, there will some rounding/missmath with float coordinates; -- rs.toGame don't do anything with that, you should take care about this, but here -- for convenience, this function simply round to nearest integer, which should take care about edge cases; -- if you have any suggestion, etc, feel free add issue ticket/pull request at library's github page, provided in rs.__URL local xOff, yOff = math.floor(rs.xOff + 0.5), math.floor(rs.yOff + 0.5) - + -- get window size local windowWidth = rs.windowWidth local windowHeight = rs.windowHeight @@ -434,7 +434,7 @@ rs.toGame = function(x, y) -- Translate coordinates from non-scaled values to scaled; -- e.g translate real mouse coordinates into scaled so you can check -- for example, area to check collisions with object and cursor; - + -- ALSO, NOTE: don't forget about math precition and rounding, because with some scaling value -- using something like "rs.toGame(love.mouse.getPosition())" coordinates may produce: x -0.31 y -0.10 -- when you may expect just 0, 0 @@ -451,7 +451,7 @@ rs.toGameX = function(x) return (x - rs.xOff) / rs.scaleWidth end -rs.toGameY = function(y) +rs.toGameY = function(y) -- Translate y coordinate from non-scaled to scaled -- e.g translate real mouse coordinates into scaled so you can check -- for example, area to check collisions with object and cursor; @@ -460,10 +460,10 @@ rs.toGameY = function(y) end rs.toScreen = function(x, y) - -- Thanslate coordinates from scaled to non scaled. + -- Translate coordinates from scaled to non scaled. -- e.g translate x and y of object inside scaled area -- to, for example, set cursor position to that object - + return (x * rs.scaleWidth) + rs.xOff, (y * rs.scaleHeight) + rs.yOff end @@ -471,7 +471,7 @@ rs.toScreenX = function(x) -- Thanslate x coordinate from scaled to non scaled. -- e.g translate x of object inside scaled area -- to, for example, set cursor position to that object - + return (x * rs.scaleWidth) + rs.xOff end @@ -479,7 +479,7 @@ rs.toScreenY = function(y) -- Thanslate y coordinate from scaled to non scaled. -- e.g translate y of object inside scaled area -- to, for example, set cursor position to that object - + return (y * rs.scaleHeight) + rs.yOff end @@ -554,20 +554,20 @@ end love.keypressed = function(key) -- set randow virtual size if key == "q" then rs.setGame(love.math.random(800, 1920), love.math.random(600, 1080)) end - + -- switch scale mode if key == "w" then rs.switchScaleMode() end - + -- reset virtual size if key == "r" then rs.setGame(1280, 720) end end local isMouseUnder = function(x, y, w, h) -- function to check if mouse under something - + -- get scaled to game mouse position local mx, my = rs.toGame(love.mouse.getPosition()) - + -- check if cursor under if mx >= x and -- left my >= y and -- top @@ -575,25 +575,25 @@ local isMouseUnder = function(x, y, w, h) my <= y + h then -- bottom return true end - + return false - + end love.update = function(dt) -- update library rs.update() - + -- count timer timer = timer + dt - + -- set timer to zero if it reach limit if timer > timerLimit then timer = 0 end -- move rectangle in circle -- x coordinate dx = x * math.sin(timer) + 150 + (rs.gameWidth / 10) - + -- y coordinate dy = y * math.cos(timer) + 150 + (rs.gameHeight / 10) @@ -603,7 +603,7 @@ love.update = function(dt) -- this will be used to determine is mouse under rectangle in love.draw underRectangle = isMouseUnder(dx, dy, dw, dh) - + -- message/instructions message = "Does mouse touch moving rectangle?: " .. tostring(underRectangle) .. "\n" .. "Press Q to change virtual size: w" .. tostring(rs.gameWidth) .. " h" .. tostring(rs.gameHeight) .. "\n" .. @@ -618,66 +618,66 @@ love.update = function(dt) -- set cursor to moving rectangle; that how you can use toScreen() function if love.keyboard.isDown("space") then love.mouse.setPosition(rs.toScreen(dx, dy)) end - + -- set non-moving rectangle to cursor; that how you can use toGame() function - if love.keyboard.isDown("s") then + if love.keyboard.isDown("s") then rectangle[1] = rs.toGameX(love.mouse.getX()) rectangle[2] = rs.toGameY(love.mouse.getY()) end end - + love.draw = function() rs.start() - + -- set color for example image love.graphics.setColor(1, 1, 1, 1) love.graphics.draw(image) - + -- change color of moving rectangle, if you touch it with cursor or not if underRectangle then love.graphics.setColor(0, 1, 0) else love.graphics.setColor(1, 0, 0) end - + -- draw moving rectangle love.graphics.rectangle("line", dx, dy, dw, dh) - + -- set color for "cursor" which will follow cursor love.graphics.setColor(1, 0.4, 0.9, 1) - + -- draw "cursor" translated to in-game coordinates love.graphics.rectangle("fill", rs.toGameX(love.mouse.getX()), rs.toGameY(love.mouse.getY()), 10, 10) - + -- set color for non-moving rectangle love.graphics.setColor(0, 0, 0, 1) - + -- draw non-moving rectangle love.graphics.rectangle("line", unpack(rectangle)) - + rs.unscaleStart() -- example how you can use "unscale" function -- with that you can draw custom ui, that you don't want to scale with library itself -- or maybe with that create nice rendering for string, in pair with rs.window/gameChanged - + -- draw semi-transparent background for "I'm unscaled!" string -- set i't color to black and make transparent love.graphics.setColor(0, 0, 0, 0.5) -- get width and height for that background love.graphics.rectangle("fill", rs.windowWidth - (rs.xOff + 100), rs.windowHeight - (rs.yOff + 100), love.graphics.newFont():getWidth("I'm unscaled!"), love.graphics.newFont():getHeight("I'm unscaled!")) - + -- draw "I'm unscaled!" string -- add offset for it, so it will be not drawed under black bars love.graphics.setColor(1, 1, 1, 1) love.graphics.print("I'm unscaled!", rs.windowWidth - (rs.xOff + 100), rs.windowHeight - (rs.yOff + 100)) - + rs.unscaleStop() rs.stop() - + -- draw explaination/instruction love.graphics.setColor(0, 0, 0, 0.4) -- count how much string have new lines and use them to determine height oh string love.graphics.rectangle("fill", 0, 0, love.graphics.newFont():getWidth(message), love.graphics.newFont():getHeight(message) * select(2, string.gsub(message, "\n", "\n"))) - love.graphics.setColor(1, 1, 1, 1) + love.graphics.setColor(1, 1, 1, 1) love.graphics.print(message) end --]] @@ -772,5 +772,5 @@ ALso, this function uses same rules as rs.stop, meaning rs.drawBars = false will result in rs.drawBlackBars will be not rendered. * Now rs.stop will draw black bars via rs.drawBlackBars. --]=] - ---]] \ No newline at end of file + +--]] diff --git a/Autarky2/main.lua b/Autarky2/main.lua index 54ab193..14dce5f 100644 --- a/Autarky2/main.lua +++ b/Autarky2/main.lua @@ -33,7 +33,9 @@ require 'gui' function love.keyreleased( key, scancode ) if key == "escape" then - if cf.CurrentScreenName(SCREEN_STACK) ~= "ExitGame" then + if cf.CurrentScreenName(SCREEN_STACK) == "ExitGame" then + cf.AddScreen("World", SCREEN_STACK) + else cf.RemoveScreen(SCREEN_STACK) end end @@ -129,7 +131,7 @@ function love.keyreleased( key, scancode ) end if key == "kp5" then - ZOOMFACTOR = 1 + ZOOMFACTOR = 0.95 TRANSLATEX = SCREEN_WIDTH / 2 TRANSLATEY = SCREEN_HEIGHT / 2 @@ -173,7 +175,17 @@ function love.mousemoved( x, y, dx, dy, istouch ) end function love.mousepressed( x, y, button, istouch, presses ) + + print(x,y) + print(res.toGame(x,y)) + print(res.toScreen(x,y)) + local wx, wy = cam:toWorld(x, y) -- converts screen x/y to world x/y + local zx, zy = cam:toWorld(res.toScreenX(x), res.toScreenY(y)) + + print(wx, wy) + print(zx, zy) + print("++++") gspot:mousepress(wx, wy, button) @@ -229,6 +241,7 @@ function love.wheelmoved(x, y) end if ZOOMFACTOR < 0.8 then ZOOMFACTOR = 0.8 end if ZOOMFACTOR > 3 then ZOOMFACTOR = 3 end + print("Zoom factor = " .. ZOOMFACTOR) end function love.load() @@ -388,8 +401,11 @@ function love.update(dt) end end - cam:setPos(TRANSLATEX, TRANSLATEY) + end + + if currentscreen == "World" or currentscreen == "Graphs" then cam:setZoom(ZOOMFACTOR) + cam:setPos(TRANSLATEX, TRANSLATEY) end lovelyToasts.update(dt) From 2dd59481a87eb38a5088bf7b67904e9d45aff9d7 Mon Sep 17 00:00:00 2001 From: Fox Date: Mon, 5 Dec 2022 20:50:02 +1000 Subject: [PATCH 3/3] Removed buttons --- Autarky2/draw.lua | 69 ++++++++++++++++++++++++++--------------------- Autarky2/gui.lua | 7 ++++- Autarky2/main.lua | 28 +++++++++++-------- 3 files changed, 61 insertions(+), 43 deletions(-) diff --git a/Autarky2/draw.lua b/Autarky2/draw.lua index b0de48b..2ae2b37 100644 --- a/Autarky2/draw.lua +++ b/Autarky2/draw.lua @@ -1,5 +1,26 @@ draw = {} +function draw.topBar() + -- draw world hours + love.graphics.setColor(1,1,1,1) + local str = "Time: " .. WORLD_HOURS .. ":00 Day: " .. WORLD_DAYS .. " Treasury: $" .. TREASURY .. " " + if PAUSED then str = str .. "PAUSED" end + love.graphics.print(str, 10, 10) + + -- draw villager counts + local occupationtable = people.getOccupationCount() + local str = "Farmers: " .. occupationtable[enum.jobFarmer] .. ". " + str = str .. "Healers: " .. occupationtable[enum.jobHealer] .. ". " + str = str .. "Woodsmen: " .. occupationtable[enum.jobWoodsman] .. ". " + str = str .. "Builders: " .. occupationtable[enum.jobBuilder] .. ". " + love.graphics.print(str, (SCREEN_WIDTH / 2) - 250, 10) + + -- draw more counts on the far right margin + local str = "Villagers available: " .. #PERSONS .. " Villagers quit: " .. PERSONS_LEFT + love.graphics.print(str, SCREEN_WIDTH - 300, 10) + +end + function draw.world() -- draw the map including structures @@ -12,8 +33,6 @@ function draw.world() for col = 1, NUMBER_OF_COLS do for row = 1, NUMBER_OF_ROWS do - -- drawx = LEFT_MARGIN + (col -1) * TILE_SIZE - -- drawy = TOP_MARGIN + (row - 1) * TILE_SIZE local drawx, drawy = fun.getTileXY(row, col) -- the grid border/outline @@ -44,25 +63,6 @@ function draw.world() end end - -- draw world hours - love.graphics.setColor(1,1,1,1) - local str = "Time: " .. WORLD_HOURS .. ":00 Day: " .. WORLD_DAYS .. " Treasury: $" .. TREASURY .. " " - if PAUSED then str = str .. "PAUSED" end - love.graphics.print(str, 10, 10) - - -- draw villager counts - local occupationtable = people.getOccupationCount() - local str = "Farmers: " .. occupationtable[enum.jobFarmer] .. ". " - str = str .. "Healers: " .. occupationtable[enum.jobHealer] .. ". " - str = str .. "Woodsmen: " .. occupationtable[enum.jobWoodsman] .. ". " - str = str .. "Builders: " .. occupationtable[enum.jobBuilder] .. ". " - love.graphics.print(str, (SCREEN_WIDTH / 2) - 250, 10) - - -- draw more counts on the far right margin - local str = "Villagers available: " .. #PERSONS .. " Villagers quit: " .. PERSONS_LEFT - love.graphics.print(str, SCREEN_WIDTH - 300, 10) - - end function draw.daynight() @@ -214,6 +214,8 @@ function draw.graphs() local yvalue = drawy - HISTORY_PRICE[enum.stockHerbs][i] love.graphics.points(drawx, yvalue) end + + love.graphics.print("Press ESCAPE to exit", SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2) end function draw.imageQueue() @@ -235,22 +237,27 @@ function draw.imageQueue() end function draw.optionScreen() - tax_rate_up_button:show() - tax_rate_down_button:show() - close_options_button:show() - exit_game_button:hide() - - love.graphics.setColor(1,1,1,1) - love.graphics.print(SALES_TAX, 300, 415) + -- tax_rate_up_button:show() + -- tax_rate_down_button:show() + -- close_options_button:show() + -- exit_game_button:hide() + -- + -- love.graphics.setColor(1,1,1,1) + -- love.graphics.print(SALES_TAX, 300, 415) + + love.graphics.print("Press ESCAPE to exit", SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2) + end -function draw.exitScreen() +function draw.exitScreen() tax_rate_up_button:hide() tax_rate_down_button:hide() close_options_button:hide() - exit_game_button:show() - + -- exit_game_button:show() + + love.graphics.print("Press ENTER to exit", SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2) + end return draw diff --git a/Autarky2/gui.lua b/Autarky2/gui.lua index a9045a2..8937e0c 100644 --- a/Autarky2/gui.lua +++ b/Autarky2/gui.lua @@ -23,7 +23,12 @@ function gui.load() if SALES_TAX < 0 then SALES_TAX = 0 end end - exit_game_button = gspot:button('Exit game', {x = 225, y = 400, w = 100, h = gspot.style.unit}) + + local y = SCREEN_HEIGHT / 2 + local w = 100 + local x = (SCREEN_WIDTH / 2) - (w / 2) + + exit_game_button = gspot:button('Exit game', {x = x, y = y, w = w, h = gspot.style.unit * 2}) exit_game_button.click = function(this, x, y, button) cf.RemoveScreen(SCREEN_STACK) --! can invoke the 'quit' option here for safety diff --git a/Autarky2/main.lua b/Autarky2/main.lua index 14dce5f..348b974 100644 --- a/Autarky2/main.lua +++ b/Autarky2/main.lua @@ -39,6 +39,11 @@ function love.keyreleased( key, scancode ) cf.RemoveScreen(SCREEN_STACK) end end + if key == "return" then + if cf.CurrentScreenName(SCREEN_STACK) == "ExitGame" then + cf.RemoveScreen(SCREEN_STACK) + end + end if key == "space" then -- pause PAUSED = not PAUSED @@ -176,16 +181,7 @@ end function love.mousepressed( x, y, button, istouch, presses ) - print(x,y) - print(res.toGame(x,y)) - print(res.toScreen(x,y)) - local wx, wy = cam:toWorld(x, y) -- converts screen x/y to world x/y - local zx, zy = cam:toWorld(res.toScreenX(x), res.toScreenY(y)) - - print(wx, wy) - print(zx, zy) - print("++++") gspot:mousepress(wx, wy, button) @@ -246,7 +242,9 @@ end function love.load() - love.window.setMode(800, 600, {resizable = true, display = 1}) + local width, height = love.window.getDesktopDimensions(1) + love.window.setMode(width, height, {resizable = true, display = 1}) + -- love.window.setMode(800, 600, {resizable = true, display = 2}) res.setGame(1920, 1080) SCREEN_WIDTH = 1920 @@ -269,6 +267,8 @@ function love.load() fun.RecordHistoryStock() cam = Camera.new(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2, 1) + cam:setZoom(ZOOMFACTOR) + cam:setPos(TRANSLATEX, TRANSLATEY) gui.load() @@ -309,12 +309,18 @@ function love.draw() if currentscreen == "Graphs" then draw.graphs() - close_graph_button:show() + -- close_graph_button:show() else close_graph_button:hide() end cam:detach() + + -- this happens after the camera is detached + if currentscreen == "World" then + draw.topBar() + end + elseif currentscreen == "Options" then draw.optionScreen() elseif currentscreen == "ExitGame" then