diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/complete.moon | 37 | ||||
| -rw-r--r-- | src/conf.lua | 6 | ||||
| -rw-r--r-- | src/dispatch.moon | 72 | ||||
| -rw-r--r-- | src/ext.lua | 72 | ||||
| -rw-r--r-- | src/game.moon | 131 | ||||
| -rw-r--r-- | src/global.moon | 22 | ||||
| -rw-r--r-- | src/graph.lua | 191 | ||||
| -rw-r--r-- | src/layers.moon | 151 | ||||
| -rw-r--r-- | src/level1.moon | 56 | ||||
| -rw-r--r-- | src/level10.moon | 54 | ||||
| -rw-r--r-- | src/level11.moon | 83 | ||||
| -rw-r--r-- | src/level12.moon | 83 | ||||
| -rw-r--r-- | src/level2.moon | 43 | ||||
| -rw-r--r-- | src/level3.moon | 40 | ||||
| -rw-r--r-- | src/level3p2.moon | 44 | ||||
| -rw-r--r-- | src/level4.moon | 52 | ||||
| -rw-r--r-- | src/level5.moon | 52 | ||||
| -rw-r--r-- | src/level6.moon | 56 | ||||
| -rw-r--r-- | src/level7.moon | 56 | ||||
| -rw-r--r-- | src/level8.moon | 56 | ||||
| -rw-r--r-- | src/level9.moon | 56 | ||||
| -rw-r--r-- | src/main.moon | 36 | ||||
| -rw-r--r-- | src/manager.moon | 9 | ||||
| -rw-r--r-- | src/startscreen.moon | 12 | ||||
| -rw-r--r-- | src/ui.moon | 70 |
25 files changed, 1540 insertions, 0 deletions
diff --git a/src/complete.moon b/src/complete.moon new file mode 100644 index 0000000..f1af550 --- /dev/null +++ b/src/complete.moon @@ -0,0 +1,37 @@ +mod = ... + +mod.create_scene = () -> + ret = am.group! + ret\append(mod.starfield!) + ret ^ am.translate(0,0) ^ am.rotate(0) ^ am.sprite("data/complete.png") + ret + +stars = { + "data/star1.png" + "data/star2.png" + "data/star3.png" +} + +mod.starfield = () -> + ret = am.group! + ret\action(coroutine.create(() -> + while true + --Randomly create stars with a 0.01 chance + if math.random() < 0.2 + star_y = math.random(-256,256) + star_sprite = stars[math.random(#stars)] + star = am.translate(-512,star_y) ^ am.scale(1) ^ am.sprite(star_sprite) + starspeed = math.random(20,50) + star\action(coroutine.create(() -> + while star.x <= 550 + star.x += starspeed + coroutine.yield! + ret\remove(star) + coroutine.yield true + )) + ret\append(star) + coroutine.yield! + )) + ret + +mod diff --git a/src/conf.lua b/src/conf.lua new file mode 100644 index 0000000..d56dc89 --- /dev/null +++ b/src/conf.lua @@ -0,0 +1,6 @@ +title = "Global Game Jam 2020" +author = "Alex Pickering" +shortname = "ggj20" +version = "1.0.0" +support_email = "alex@cogarr.net" +copyright_message = "Copyright © 2019 Alexander M. Pickering." diff --git a/src/dispatch.moon b/src/dispatch.moon new file mode 100644 index 0000000..49a4ba1 --- /dev/null +++ b/src/dispatch.moon @@ -0,0 +1,72 @@ +--Control utilities +state = require "global" +ui = require "ui" +mod = ... + +mod.window_to_normal = (pos) -> + nx = pos.x - state.win.left + ny = pos.y - state.win.top + vec2(nx,-ny) + +mod.normal_to_window = (pos) -> + print("in:",pos) + nx = pos.x + state.win.left + ny = -(pos.y) + state.win.top + print("out:",nx,ny) + vec2(nx,ny) + +state.layers\action(coroutine.create(()-> + while true + if state.win\mouse_pressed("left") + pos = state.win\mouse_position! + --print("Mouse pos:",pos) + npos = mod.window_to_normal(pos) + --print("newpos:", mod.window_to_normal(pos)) + gridx, gridy = math.floor(npos.x / 32), math.floor(npos.y / 32) + l = state.selected_layer + --print("Looking at active layer:",l) + tile = l\get_tile(gridx,gridy) + --print("tile:",tile) + if tile and tile.type.cantoggle --we want to remove + l\clear_square(gridx,gridy) + state.money += l.cost + state.play(77430200) + else + if state.money >= l.cost and not tile + state.play(77430200) + state.money -= l.cost + l\toggle_square(gridx,gridy) + state.update! + l\print_grid! + else + state.play(4807804) + if (state.win\key_pressed("1") or state.win\key_pressed("kp_1")) and state.layer_tbl[1] + print("setting selected layer to 1") + state.selected_layer.node.hidden = true + state.selected_layer = state.layer_tbl[1] + state.selected_layer.node.hidden = false + ui.reload_ui_layers! + elseif (state.win\key_pressed("2") or state.win\key_pressed("kp_2")) and state.layer_tbl[2] + print("setting selected layer to 2") + state.selected_layer.node.hidden = true + state.selected_layer = state.layer_tbl[2] + state.selected_layer.node.hidden = false + ui.reload_ui_layers! + elseif (state.win\key_pressed("3") or state.win\key_pressed("kp_3")) and state.layer_tbl[3] + state.selected_layer.node.hidden = true + state.selected_layer = state.layer_tbl[3] + state.selected_layer.node.hidden = false + ui.reload_ui_layers! + elseif (state.win\key_pressed("4") or state.win\key_pressed("kp_4")) and state.layer_tbl[4] + print("setting selected layer to 4") + state.selected_layer.node.hidden = true + state.selected_layer = state.layer_tbl[4] + state.selected_layer.node.hidden = false + ui.reload_ui_layers! + --for layernum, layer in pairs state.layer_tbl do + --if state.selected_layer == layer + --state.selecte + coroutine.yield! +)) + +mod diff --git a/src/ext.lua b/src/ext.lua new file mode 100644 index 0000000..85d4ef7 --- /dev/null +++ b/src/ext.lua @@ -0,0 +1,72 @@ +-- Override tostring to display more info about the table +local old_tostring = tostring +local numtabs = 0 +local printed_tables = {} +--print = log +-- + --for obj in *@physobjs + --bp.add(t,obj.offset.x,obj.offset.y,obj.size.x,obj.size.y) + +local function tostring_helper(el) + assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el)) + local mt = getmetatable(el) + if mt and mt.__tostring then + return mt.__tostring(el) + elseif printed_tables[el] == true then + return old_tostring(el) + else + printed_tables[el] = true + numtabs = numtabs + 1 + local strbuilder = {"{"} + for k,v in pairs(el) do + local key,value + if type(k) == "table" then + key = tostring_helper(k) + else + key = old_tostring(k) + end + if type(v) == "table" then + value = tostring_helper(v) + else + value = old_tostring(v) + end + strbuilder[#strbuilder + 1] = string.format("%s%s : %s", string.rep("\t",numtabs), key, value) + end + strbuilder[#strbuilder + 1] = string.rep("\t",numtabs - 1) .. "}" + numtabs = numtabs - 1 + return table.concat(strbuilder,"\n") + end + +end +function tostring(el) + printed_tables = {} + if type(el) == "table" then + return tostring_helper(el) + end + return old_tostring(el) +end + +function checktype(item,t) + if type(item) ~= t then + error("Was not call with corret type",3) + end +end + +-- Functions to save my hands +function printf(fmt, ...) + print(string.format(fmt,...)) +end +function errorf(fmt, ...) + --Our error isn't actually in this function, it's 1 above us (1) = 2 + error(string.format(fmt,...),2) +end +function assertf(bool, fmt, ...) + assert(type(fmt) == "string", "Assertf arg #2 was \"" .. type(fmt) .. "\", expected string") + if not bool then + args = {fmt} + for k,v in ipairs({...}) do + table.insert(args,tostring(v)) + end + error(string.format(unpack(args)),2) + end +end diff --git a/src/game.moon b/src/game.moon new file mode 100644 index 0000000..037511a --- /dev/null +++ b/src/game.moon @@ -0,0 +1,131 @@ +state = require "global" +level1 = require "level1" +level2 = require "level2" +level3 = require "level3" +level3p2 = require"level3p2" +level4 = require "level4" +level5 = require "level5" +level6 = require "level6" +level7 = require "level7" +level8 = require "level8" +level9 = require "level9" +level10 = require "level10" +level11 = require "level11" +level12 = require "level12" +game_complete = require "complete" +ui = require "ui" +mod = ... + +mod.ship_move_in_co = () -> + while true + while ui.manager_talking + coroutine.yield! + state.ship("sprite").color = vec4(1,1,1,1) + state.game_grid.hidden = true + state.layers.hidden = true + dist = state.ship("position").x - (state.win.left + 256) - 3 + if dist > 3 + state.ship("position").x = state.ship("position").x - (20*math.sin(dist / 512)) + else + state.ship("sprite").color = vec4(0.5, 0.5, 0.5, 1) + state.game_grid.hidden = false + state.layers.hidden = false + break + coroutine.yield! + coroutine.yield true + +mod.ship_move_out_co = () -> + start_pos = state.ship("position").x + state.layers.hidden=true + state.game_grid.hidden =true + while true + print("Doing ship move out co...") + state.ship("sprite").color = vec4(1,1,1,1) + dist = state.ship("position").x - (state.win.left - 600 - 3) + if dist > 3 + state.ship("position").x = state.ship("position").x - (20*math.sin(-start_pos / 512)) + else + break + coroutine.yield! + state.move_out_done = true + coroutine.yield true + +mod.hint_mouse = () -> + mousepos = state.win\mouse_position! + mod.mouse_hint("position").x = mousepos.x + mod.mouse_hint("position").y = mousepos.y + +mod.gen_scene = () -> + state.selected_state = "electrical" + state.game_background = am.translate(0,0) ^ am.rotate(0) ^ am.scale(2) ^ am.sprite("data/space.jpg") + state.game_grid = am.translate(0,0) ^ am.scale(2) ^ am.rotate(0) ^ am.sprite("data/numbered_grid.png")\tag("sprite") + --state.game_grid = am.translate(0,0) ^ am.scale(2) ^ am.rotate(0) ^ am.sprite("data/grid.png")\tag("sprite") + state.game_grid("sprite").color = vec4(1,1,1,0.2) + state.ship = am.translate(1024,0)\tag("position") ^ am.scale(1) ^ am.rotate(math.pi / 2) ^ (am.sprite("data/test_ship.png")\tag("sprite")) + state.money = 100 + gui = ui.make_ui! + ret = am.group! ^ {state.game_background, state.ship, state.game_grid, state.layers, gui} + state.layers.hidden = true + state.game_grid.hidden = true + state.mouse_hint = am.translate(0,0)\tag("position") ^ am.scale(1) ^ am.text("hint hint")\tag("sprite") + state.mouse_hint\action(coroutine.create(() -> + while true + state.mouse_hint("position").y -= 1 + state.mouse_hint("sprite").color.a -= 0.01 + coroutine.yield! + )) + state.ship\action(coroutine.create(() -> + ui.manager_say("Welcome to the drydocks, newbie. We're here to fix\nships as cheaply as possible. I'll start you off\nhooking up broken fuel lines.") + while not state.move_out_done or ui.manager_talking + coroutine.yield! + level1.setup_level! + while not state.move_out_done or ui.manager_talking + coroutine.yield! + ui.manager_say("If there are multiple tanks, you only need to\nconnect thrusters to one of them.") + level2.setup_level! + while not state.move_out_done or ui.manager_talking + coroutine.yield! + level3.setup_level! + while not state.move_out_done or ui.manager_talking + coroutine.yield! + level3p2.setup_level! + while not state.move_out_done or ui.manager_talking + coroutine.yield! + ui.manager_say("I think you're ready for the big time, use [1]\nand [2] to toggle between the fuel and electrical\ngrid. Ion thrusters need power to operate.") + level4.setup_level! + while not state.move_out_done or ui.manager_talking + coroutine.yield! + ui.manager_say("The credits from salvageing components from one grid\ncan be used in the other grid.") + level5.setup_level! + while not state.move_out_done or ui.manager_talking + coroutine.yield! + level6.setup_level! + while not state.move_out_done or ui.manager_talking + coroutine.yield! + level7.setup_level! + while not state.move_out_done or ui.manager_talking + coroutine.yield! + level8.setup_level! + while not state.move_out_done or ui.manager_talking + coroutine.yield! + ui.manager_say("Some ships use generators instead of batteries.\nConnect the generator to the fuel and the ion\nthrusters.") + level9.setup_level! + while not state.move_out_done or ui.manager_talking + coroutine.yield! + level10.setup_level! + while not state.move_out_done or ui.manager_talking + coroutine.yield! + ui.manager_say("Some ships have laser weapons, they need High\nvoltage power, which can't be next to regular\nvoltage or it'll interfere.") + level11.setup_level! + while not state.move_out_done or ui.manager_talking + coroutine.yield! + ui.manager_say("Ah, we're at the last ship already. You must have\nbeen quite clever to make it this far.") + level12.setup_level! + while not state.move_out_done or ui.manager_talking + coroutine.yield! + state.win.scene = game_complete.create_scene! + + )) + --state.ship\action(coroutine.create(ship_move_in_co)) + ret + diff --git a/src/global.moon b/src/global.moon new file mode 100644 index 0000000..1e62e16 --- /dev/null +++ b/src/global.moon @@ -0,0 +1,22 @@ +--Hodls global state + +mod = ... + +mod.screen_width = 1024 +mod.screen_height = 512 + +mod.layers = am.group! +mod.current_level = 0 +mod.layer_tbl = {} +mod.add_layer = (layer) -> + mod.layers\append(layer.node) + table.insert(mod.layer_tbl,layer) + +mod.clear_layers = () -> + mod.layers\remove_all! + mod.layer_tbl = {} + +mod.play = (seed) -> + mod.layers\action(am.play(seed,false,1,1)) + +mod diff --git a/src/graph.lua b/src/graph.lua new file mode 100644 index 0000000..96d0ea4 --- /dev/null +++ b/src/graph.lua @@ -0,0 +1,191 @@ +-- ====================================================================== +-- Copyright (c) 2012 RapidFire Studio Limited +-- All Rights Reserved. +-- http://www.rapidfirestudio.com + +-- Permission is hereby granted, free of charge, to any person obtaining +-- a copy of this software and associated documentation files (the +-- "Software"), to deal in the Software without restriction, including +-- without limitation the rights to use, copy, modify, merge, publish, +-- distribute, sublicense, and/or sell copies of the Software, and to +-- permit persons to whom the Software is furnished to do so, subject to +-- the following conditions: + +-- The above copyright notice and this permission notice shall be +-- included in all copies or substantial portions of the Software. + +-- 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 OR COPYRIGHT HOLDERS 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. +-- ====================================================================== +-- Modifications & updates for ggj20, Alexander Pickering +print("requireing graph...") +mod = ... + +---------------------------------------------------------------- +-- local variables +---------------------------------------------------------------- + +local INF = 1/0 +local cachedPaths = nil + +---------------------------------------------------------------- +-- local functions +---------------------------------------------------------------- + +function dist ( x1, y1, x2, y2 ) + + return math.sqrt ( ((x2 - x1)^ 2 ) + ((y2 - y1) ^ 2 ) ) +end + +function dist_between ( nodeA, nodeB ) + + return dist ( nodeA.x, nodeA.y, nodeB.x, nodeB.y ) +end + +function heuristic_cost_estimate ( nodeA, nodeB ) + + return dist ( nodeA.x, nodeA.y, nodeB.x, nodeB.y ) +end + +function is_valid_node ( node, neighbor ) + + return true +end + +function lowest_f_score ( set, f_score ) + + local lowest, bestNode = INF, nil + for _, node in ipairs ( set ) do + local score = f_score [ node ] + if score < lowest then + lowest, bestNode = score, node + end + end + return bestNode +end + +function neighbor_nodes ( theNode, nodes ) + + local neighbors = {} + for _, node in ipairs ( nodes ) do + if theNode ~= node and is_valid_node ( theNode, node ) then + table.insert ( neighbors, node ) + end + end + return neighbors +end + +function not_in ( set, theNode ) + + for _, node in ipairs ( set ) do + if node == theNode then return false end + end + return true +end + +function remove_node ( set, theNode ) + + for i, node in ipairs ( set ) do + if node == theNode then + set [ i ] = set [ #set ] + set [ #set ] = nil + break + end + end +end + +function unwind_path ( flat_path, map, current_node ) + + if map [ current_node ] then + table.insert ( flat_path, 1, map [ current_node ] ) + return unwind_path ( flat_path, map, map [ current_node ] ) + else + return flat_path + end +end + +------------------------------------------------------------------ +---- pathfinding functions +------------------------------------------------------------------ + +function a_star ( start, goal, nodes, valid_node_func ) + + local closedset = {} + local openset = { start } + local came_from = {} + + if valid_node_func then is_valid_node = valid_node_func end + + local g_score, f_score = {}, {} + g_score [ start ] = 0 + f_score [ start ] = g_score [ start ] + heuristic_cost_estimate ( start, goal ) + + while #openset > 0 do + + local current = lowest_f_score ( openset, f_score ) + if current == goal then + local path = unwind_path ( {}, came_from, goal ) + table.insert ( path, goal ) + return path + end + + remove_node ( openset, current ) + table.insert ( closedset, current ) + + local neighbors = neighbor_nodes ( current, nodes ) + for _, neighbor in ipairs ( neighbors ) do + if not_in ( closedset, neighbor ) then + + local tentative_g_score = g_score [ current ] + dist_between ( current, neighbor ) + + if not_in ( openset, neighbor ) or tentative_g_score < g_score [ neighbor ] then + came_from [ neighbor ] = current + g_score [ neighbor ] = tentative_g_score + f_score [ neighbor ] = g_score [ neighbor ] + heuristic_cost_estimate ( neighbor, goal ) + if not_in ( openset, neighbor ) then + table.insert ( openset, neighbor ) + end + end + end + end + end + return nil -- no valid path +end + +---------------------------------------------------------------- +-- exposed functions +---------------------------------------------------------------- + +function clear_cached_paths () + + cachedPaths = nil +end + +function distance ( x1, y1, x2, y2 ) + + return dist ( x1, y1, x2, y2 ) +end + +function mod.path ( start, goal, nodes, ignore_cache, valid_node_func ) + + if not cachedPaths then cachedPaths = {} end + if not cachedPaths [ start ] then + cachedPaths [ start ] = {} + elseif cachedPaths [ start ] [ goal ] and not ignore_cache then + return cachedPaths [ start ] [ goal ] + end + + local resPath = a_star ( start, goal, nodes, valid_node_func ) + if not cachedPaths [ start ] [ goal ] and not ignore_cache then + cachedPaths [ start ] [ goal ] = resPath + end + + return resPath +end + +return mod diff --git a/src/layers.moon b/src/layers.moon new file mode 100644 index 0000000..6b6de6f --- /dev/null +++ b/src/layers.moon @@ -0,0 +1,151 @@ +--Keeps track of layers +state = require "global" +disp = require "dispatch" +graph = require "graph" +mod = ... + +class Icon + new: (squaretype,position,layer) => + @type = squaretype + @node = am.group! ^ {am.translate(position.x + 16, position.y - 16) ^ am.scale(1) ^ am.rotate(0) ^ am.sprite(@type.img_src)} + layer.node\append(@node) + @x = position.x + @y = position.y + + __tostring: => + return string.format("<%s at (%d, %d)>",@type.type,@x,@y) + + +prototypes = {} +class IconPrototype + new: (squaretype,img,cantoggle) => + @type = squaretype + @img_src = img + prototypes[@type] = @ + @cantoggle = cantoggle + totile: (x,y,layer) => + ret = Icon(@,vec2(x,y),layer) + ret + +IconPrototype("liquid fuel thruster","data/icon_engine.png",false) +IconPrototype("ion thruster","data/icon_ionthrust.png",false) +IconPrototype("fuel pipe","data/pipe1111.png",true) +IconPrototype("liquid fuel tank","data/icon_fueltank.png",false) +IconPrototype("electric wire","data/icon_wire.png",true) +IconPrototype("generator", "data/icon_generator.png",false) +IconPrototype("battery","data/icon_battery.png",false) +IconPrototype("high volt cabel","data/icon_high_voltage.png",true) +IconPrototype("high volt source","data/icon_hv_source.png",false) +IconPrototype("laser beam","data/icon_laser_turret.png",false) + +mod.check_paths = (tbl) -> + for k, path in pairs(tbl) + pathresult = graph.path(path[1],path[2],path[3],true,mod.Layer.tiles_adjacent) + if pathresult == nil + print("Failed to find path from",path[1], "to",path[2]) + return false + return true + +mod.check_hv_paths = (tbl) -> + for k, path in pairs(tbl) + pathresult = graph.path(path[1],path[2],path[3],true,mod.Layer.hv_tiles_adjacent) + print("pathresult was:",pathresult) + if pathresult == nil + print("Failed to find path from",path[1], "to",path[2]) + return false + return true + +electricals = { + ["electric wire"]: true + ["generator"]: true + ["ion thruster"]: true +} +hvs = { + ["high volt cabel"]: true + ["high volt source"]: true + ["laser beam"]: true +} + +class Layer + new: (layername, default_node, node_cost, layer_icon) => + @name = layername + @grid = {} + @node = am.group! + @nodelist = {} --A node least to easily remove all of them + @default = default_node + @icon = layer_icon + @cost = node_cost + print("Setting node action") + + mark_square: (x,y,proto) => + print("Marking square:",x,y) + assert(proto,"Marking a square on a layer must have a type") + assert(prototypes[proto], "Unkown square type:" .. proto) + gpos = disp.normal_to_window(vec2(x*32,y*32)) + item = prototypes[proto]\totile(gpos.x, gpos.y, @) + @grid[x] = @grid[x] or {} + @grid[x][y] = item + item + + tiles_adjacent: (node, neighbor) -> + xdist = math.abs(neighbor.x - node.x) + ydist = math.abs(neighbor.y - node.y) + dist = ( xdist ^ 2) + (ydist ^ 2) + ret = false + if dist == (32 ^ 2) + ret = true + ret + + hv_tiles_adjacent: (node,neighbor) -> + if mod.Layer.tiles_adjacent(node,neighbor) + print("neighbor type.type:",neighbor.type.type) + if hvs[node.type.type] and electricals[neighbor.type.type] + error("High volt-normal error") + return true + else + return false + + get_tile: (x,y) => + if @grid[x] and @grid[x][y] + return @grid[x][y] + return nil + + flat_tiles: => + ret = {} + for _,row in pairs @grid + for _,peice in pairs row + table.insert(ret,peice) + ret + + clear_square: (x,y) => + t = @get_tile(x,y) + @node\remove(t.node) + @grid[x][y] = nil + print("Clearing:",t) + + toggle_square: (x,y,t) => + t = @get_tile(x,y) + if t + @clear_square(x,y) + else + @mark_square(x,y,t or @default) + + print_grid: => + for row = 1, math.floor((state.win.bottom - state.win.top) / 32) + this_row = {} + for col = 1, math.floor((state.win.right - state.win.left) / 32) + if @grid[row] and @grid[row][col] + table.insert(this_row,"1") + else + table.insert(this_row,"0") + print(table.concat(this_row)) + +mod.Layer = Layer + +mod.create_layer = (layername) -> + ret = Layer(layername) + +mod.gen_scene = () -> + mod.node = am.group! + +mod diff --git a/src/level1.moon b/src/level1.moon new file mode 100644 index 0000000..a77814e --- /dev/null +++ b/src/level1.moon @@ -0,0 +1,56 @@ +layer = require "layers" +game = require "game" +state = require "global" +graph = require "graph" +disp = require "dispatch" +import Layer from layer +ui = require "ui" +print("In level1, Layer is", Layer) +for k,v in pairs layer + print(k,":",v) +mod = ... + +mod.setup_level = () -> + state.current_level = 1 + --ret = am.group! + state.clear_layers! + elayer = Layer("fuel","fuel pipe",50,"data/layer_fuel.png") + state.add_layer(elayer) + state.ship("sprite").source = "data/level_1.png" + state.money = 200 + state.ship\action(coroutine.create(game.ship_move_in_co)) + elayer\mark_square(9,8,"liquid fuel thruster") + elayer\mark_square(6,8,"liquid fuel tank") + elayer\mark_square(7,8,"fuel pipe") + --Hint fuel pipe + tp = disp.normal_to_window(vec2((8*32)+16,(8*32)+16)) + fuel_hint = am.translate(tp) ^ am.sprite("data/pipe1111_hint.png")\tag "sprite" + elayer.node\append(fuel_hint) + should_hint = true + fuel_hint\action(coroutine.create(() -> + while should_hint + alpha = 0 + for i = 1,256,10 + fuel_hint("sprite").color = vec4(1,1,1,i/256) + coroutine.yield! + for i = 1,256,10 + fuel_hint("sprite").color = vec4(1,1,1,1 - (i/256)) + coroutine.yield! + )) + + + state.selected_layer = elayer + state.update = () -> + print("Game level updated!") + flat_tiles = elayer\flat_tiles! + path1 = graph.path(elayer\get_tile(6,8),elayer\get_tile(9,8),flat_tiles,true,elayer.tiles_adjacent) + --path2 = graph.path(elayer\get_tile(6,8),elayer\get_tile(9,7),flat_tiles,false,elayer.tiles_adjacent) + print("path:",path1, path2) + --print("selected layer:",state.active_layer) + if path1 + state.ship\action(coroutine.create(game.ship_move_out_co)) + ui.reload_ui_layers! + + --ret ^ elayer.node + --ret +mod diff --git a/src/level10.moon b/src/level10.moon new file mode 100644 index 0000000..bc05d8a --- /dev/null +++ b/src/level10.moon @@ -0,0 +1,54 @@ +layer = require "layers" +game = require "game" +state = require "global" +graph = require "graph" +import Layer from layer +ui = require "ui" + +mod = ... + +mod.setup_level = () -> + state.current_level = 9 + --ret = am.group! + state.move_out_done = false + state.clear_layers! + flayer = Layer("fuel","fuel pipe",50,"data/layer_fuel.png") + elayer = Layer("electric","electric wire",10,"data/layer_electric.png") + state.add_layer(flayer) + state.add_layer(elayer) + state.money = 360 + state.ship("position").x = 800 + state.ship\action(coroutine.create(game.ship_move_in_co)) + state.ship("sprite").source = "data/level_10.png" + t1 = elayer\mark_square(21,5,"ion thruster") + t2 = elayer\mark_square(21,7,"ion thruster") + t3 = elayer\mark_square(21,8,"ion thruster") + t4 = elayer\mark_square(21,10,"ion thruster") + + t5 = flayer\mark_square(5,8,"generator") + t6 = elayer\mark_square(5,8,"generator") + + t7 = flayer\mark_square(18,8,"generator") + t8 = elayer\mark_square(18,8,"generator") + + p1 = flayer\mark_square(10,8,"liquid fuel tank") + + elayer.node.hidden = true + state.selected_layer = flayer + state.update = () -> + ftiles = flayer\flat_tiles! + etiles = elayer\flat_tiles! + + paths = { + {t1,t6,etiles}, + {t2,t6,etiles}, + {t3,t6,etiles}, + {t4,t6,etiles}, + {t5,p1,ftiles} + } + if layer.check_paths(paths) + state.ship\action(coroutine.create(game.ship_move_out_co)) + + ui.reload_ui_layers! + +mod diff --git a/src/level11.moon b/src/level11.moon new file mode 100644 index 0000000..ebf33b1 --- /dev/null +++ b/src/level11.moon @@ -0,0 +1,83 @@ +layer = require "layers" +game = require "game" +state = require "global" +graph = require "graph" +import Layer from layer +ui = require "ui" + +mod = ... + +mod.setup_level = () -> + state.current_level = 10 + --ret = am.group! + state.move_out_done = false + state.clear_layers! + flayer = Layer("fuel","fuel pipe",50,"data/layer_fuel.png") + elayer = Layer("electric","electric wire",10,"data/layer_electric.png") + hlayer = Layer("high voltage","high volt cabel",30,"data/layer_hv.png") + state.add_layer(flayer) + state.add_layer(elayer) + state.add_layer(hlayer) + --state.money = 500 + state.money = 800 + state.ship("position").x = 800 + state.ship\action(coroutine.create(game.ship_move_in_co)) + state.ship("sprite").source = "data/level_11.png" + t1 = elayer\mark_square(20,6,"ion thruster") + t2 = elayer\mark_square(20,9,"ion thruster") + + --flayer\mark_square(8,4,"") + t3 = hlayer\mark_square(10,8,"high volt source") + hlayer\mark_square(10,9,"high volt cabel") + hlayer\mark_square(10,10,"high volt cabel") + hlayer\mark_square(9,10,"high volt cabel") + + t4 = flayer\mark_square(13,8,"generator") + t5 = elayer\mark_square(13,8,"generator") + + t6 = hlayer\mark_square(8,4,"laser beam") + t7 = hlayer\mark_square(8,5,"laser beam") + t8 = hlayer\mark_square(8,10,"laser beam") + t9 = hlayer\mark_square(8,11,"laser beam") + + p1 = flayer\mark_square(7,7,"liquid fuel tank") + + + elayer.node.hidden = true + hlayer.node.hidden = true + state.selected_layer = flayer + state.update = () -> + ftiles = flayer\flat_tiles! + etiles = elayer\flat_tiles! + --Mege the etiles into the ftiles layer so we can check + --that hv cabels are not next to normal cables + htiles = hlayer\flat_tiles! + for _,t in pairs etiles + table.insert(htiles,t) + --table.merge(htiles,etiles) + --table.merge(htiles,hlayer\flat_tiles!) + print("htiles before path finding:",htiles) + paths,paths2 = nil,nil + pass,err = pcall(() -> + paths = layer.check_paths{ + {t1,t5,etiles}, + {t2,t5,etiles}, + {t4,p1,ftiles}, + } + paths2 = layer.check_hv_paths{ + {t6,t3,htiles}, + {t7,t3,htiles}, + {t8,t3,htiles} + {t9,t3,htiles} + } + print("paths:",paths) + print("paths2 is",paths2) + return (paths and paths2) + ) + print("pass:",pass,"err:",err) + if pass and err + state.ship\action(coroutine.create(game.ship_move_out_co)) + + ui.reload_ui_layers! + +mod diff --git a/src/level12.moon b/src/level12.moon new file mode 100644 index 0000000..a1cf1e5 --- /dev/null +++ b/src/level12.moon @@ -0,0 +1,83 @@ +layer = require "layers" +game = require "game" +state = require "global" +graph = require "graph" +import Layer from layer +ui = require "ui" + +mod = ... + +mod.setup_level = () -> + state.current_level = 10 + --ret = am.group! + state.move_out_done = false + state.clear_layers! + flayer = Layer("fuel","fuel pipe",50,"data/layer_fuel.png") + elayer = Layer("electric","electric wire",10,"data/layer_electric.png") + hlayer = Layer("high voltage","high volt cabel",30,"data/layer_hv.png") + state.add_layer(flayer) + state.add_layer(elayer) + state.add_layer(hlayer) + --state.money = 500 + state.money = 1460 + state.ship("position").x = 800 + state.ship\action(coroutine.create(game.ship_move_in_co)) + state.ship("sprite").source = "data/level_12.png" + t1 = flayer\mark_square(9,12,"liquid fuel tank") + + t2 = flayer\mark_square(24,6,"generator") + t3 = elayer\mark_square(24,6,"generator") + + t4 = flayer\mark_square(26,6,"liquid fuel thruster") + t5 = flayer\mark_square(26,8,"liquid fuel thruster") + t6 = flayer\mark_square(26,10,"liquid fuel thruster") + + t7 = elayer\mark_square(24,4,"ion thruster") + t8 = elayer\mark_square(20,3,"ion thruster") + t9 = elayer\mark_square(15,3,"ion thruster") + t10 = elayer\mark_square(19,9,"ion thruster") + t11 = elayer\mark_square(19,12,"battery") + + t12 = hlayer\mark_square(16,8,"high volt source") + t13 = hlayer\mark_square(8,5,"laser beam") + + elayer.node.hidden = true + hlayer.node.hidden = true + state.selected_layer = flayer + state.update = () -> + ftiles = flayer\flat_tiles! + etiles = elayer\flat_tiles! + --Mege the etiles into the ftiles layer so we can check + --that hv cabels are not next to normal cables + htiles = hlayer\flat_tiles! + for _,t in pairs etiles + table.insert(htiles,t) + --table.merge(htiles,etiles) + --table.merge(htiles,hlayer\flat_tiles!) + print("htiles before path finding:",htiles) + paths,paths2 = nil,nil + pass,err = pcall(() -> + paths = layer.check_paths{ + {t10,t11,etiles}, + {t7,t3,etiles}, + {t8,t3,etiles}, + {t9,t3,etiles}, + {t2,t1,ftiles}, + {t4,t1,ftiles}, + {t5,t1,ftiles}, + {t6,t1,ftiles}, + } + paths2 = layer.check_hv_paths{ + {t12,t13,htiles}, + } + print("paths:",paths) + print("paths2 is",paths2) + return (paths and paths2) + ) + print("pass:",pass,"err:",err) + if pass and err + state.ship\action(coroutine.create(game.ship_move_out_co)) + + ui.reload_ui_layers! + +mod diff --git a/src/level2.moon b/src/level2.moon new file mode 100644 index 0000000..3355a77 --- /dev/null +++ b/src/level2.moon @@ -0,0 +1,43 @@ +layer = require "layers" +game = require "game" +state = require "global" +graph = require "graph" +import Layer from layer +ui = require "ui" + +mod = ... + +mod.setup_level = () -> + state.current_level = 2 + --ret = am.group! + state.move_out_done = false + state.clear_layers! + elayer = Layer("fuel","fuel pipe",50,"data/layer_fuel.png") + state.add_layer(elayer) + state.money = 150 + state.ship("position").x = 800 + state.ship\action(coroutine.create(game.ship_move_in_co)) + state.ship("sprite").source = "data/level_2.png" + t1 = elayer\mark_square(11,8,"liquid fuel thruster") + t2 = elayer\mark_square(11,7,"liquid fuel thruster") + p1 = elayer\mark_square(6,6,"liquid fuel tank") + p2 = elayer\mark_square(6,9,"liquid fuel tank") + elayer\mark_square(9,7,"fuel pipe") + elayer\mark_square(9,8,"fuel pipe") + elayer\mark_square(10,8,"fuel pipe") + state.selected_layer = elayer + print("About to set update...") + state.update = () -> + print("Game level updated!") + flat_tiles = elayer\flat_tiles! + path1 = graph.path(t1,p1,flat_tiles,false,elayer.tiles_adjacent) + path2 = graph.path(t1,p2,flat_tiles,false,elayer.tiles_adjacent) + path3 = graph.path(t2,p1,flat_tiles,false,elayer.tiles_adjacent) + path4 = graph.path(t2,p2,flat_tiles,false,elayer.tiles_adjacent) + --print("selected layer:",state.active_layer) + if (path1 or path2) and (path3 or path4) + state.ship\action(coroutine.create(game.ship_move_out_co)) + print("Set update function") + ui.reload_ui_layers! + +mod diff --git a/src/level3.moon b/src/level3.moon new file mode 100644 index 0000000..1ca0b7a --- /dev/null +++ b/src/level3.moon @@ -0,0 +1,40 @@ +layer = require "layers" +game = require "game" +state = require "global" +graph = require "graph" +import Layer from layer +ui = require "ui" + +mod = ... + +mod.setup_level = () -> + state.current_level = 3 + --ret = am.group! + state.move_out_done = false + state.clear_layers! + elayer = Layer("fuel","fuel pipe",50,"data/layer_fuel.png") + state.add_layer(elayer) + state.money = 100 + state.ship("position").x = 800 + state.ship\action(coroutine.create(game.ship_move_in_co)) + state.ship("sprite").source = "data/level_3.png" + t1 = elayer\mark_square(11,8,"liquid fuel thruster") + t2 = elayer\mark_square(11,7,"liquid fuel thruster") + p1 = elayer\mark_square(6,6,"liquid fuel tank") + p2 = elayer\mark_square(6,9,"liquid fuel tank") + elayer\mark_square(9,7,"fuel pipe") + elayer\mark_square(9,8,"fuel pipe") + elayer\mark_square(10,8,"fuel pipe") + state.selected_layer = elayer + state.update = () -> + flat_tiles = elayer\flat_tiles! + path1 = graph.path(t1,p1,flat_tiles,false,elayer.tiles_adjacent) + path2 = graph.path(t1,p2,flat_tiles,false,elayer.tiles_adjacent) + path3 = graph.path(t2,p1,flat_tiles,false,elayer.tiles_adjacent) + path4 = graph.path(t2,p2,flat_tiles,false,elayer.tiles_adjacent) + --print("selected layer:",state.active_layer) + if (path1 or path2) and (path3 or path4) + state.ship\action(coroutine.create(game.ship_move_out_co)) + ui.reload_ui_layers! + +mod diff --git a/src/level3p2.moon b/src/level3p2.moon new file mode 100644 index 0000000..363e3ce --- /dev/null +++ b/src/level3p2.moon @@ -0,0 +1,44 @@ +layer = require "layers" +game = require "game" +state = require "global" +graph = require "graph" +import Layer from layer +ui = require "ui" + +mod = ... + +mod.setup_level = () -> + state.current_level = 3.5 + --ret = am.group! + state.move_out_done = false + state.clear_layers! + elayer = Layer("fuel","fuel pipe",50,"data/layer_fuel.png") + state.add_layer(elayer) + state.money = 0 + state.ship("position").x = 800 + state.ship\action(coroutine.create(game.ship_move_in_co)) + state.ship("sprite").source = "data/level_3p2.png" + t1 = elayer\mark_square(9,4,"liquid fuel thruster") + t2 = elayer\mark_square(9,10,"liquid fuel thruster") + p1 = elayer\mark_square(6,7,"liquid fuel tank") + elayer\mark_square(8,4,"fuel pipe") + elayer\mark_square(6,4,"fuel pipe") + elayer\mark_square(6,6,"fuel pipe") + + elayer\mark_square(6,8,"fuel pipe") + elayer\mark_square(6,9,"fuel pipe") + elayer\mark_square(7,10,"fuel pipe") + elayer\mark_square(8,10,"fuel pipe") + state.selected_layer = elayer + state.update = () -> + flat_tiles = elayer\flat_tiles! + + paths = layer.check_paths{ + {t1,p1,flat_tiles}, + {t2,p1,flat_tiles} + } + if paths + state.ship\action(coroutine.create(game.ship_move_out_co)) + ui.reload_ui_layers! + +mod diff --git a/src/level4.moon b/src/level4.moon new file mode 100644 index 0000000..7157874 --- /dev/null +++ b/src/level4.moon @@ -0,0 +1,52 @@ +layer = require "layers" +game = require "game" +state = require "global" +graph = require "graph" +import Layer from layer +ui = require "ui" + +mod = ... + +mod.setup_level = () -> + state.current_level = 4 + --ret = am.group! + state.move_out_done = false + state.clear_layers! + flayer = Layer("fuel","fuel pipe",50,"data/layer_fuel.png") + elayer = Layer("electric","electric wire",10,"data/layer_electric.png") + state.add_layer(flayer) + state.add_layer(elayer) + state.money = 110 + state.ship("position").x = 800 + state.ship\action(coroutine.create(game.ship_move_in_co)) + state.ship("sprite").source = "data/level_4.png" + t1 = flayer\mark_square(11,8,"liquid fuel thruster") + t2 = flayer\mark_square(11,7,"liquid fuel thruster") + p1 = flayer\mark_square(7,8,"liquid fuel tank") + flayer\mark_square(10,8,"fuel pipe") + + t3 = elayer\mark_square(9,5,"ion thruster") + t4 = elayer\mark_square(9,10,"ion thruster") + p2 = elayer\mark_square(7,7,"battery") + elayer\mark_square(7,6,"electric wire") + elayer\mark_square(7,8,"electric wire") + elayer\mark_square(7,9,"electric wire") + elayer\mark_square(8,10,"electric wire") + elayer\mark_square(7,5,"electric wire") + elayer\mark_square(8,5,"electric wire") + + elayer.node.hidden = true + state.selected_layer = flayer + state.update = () -> + flat_tiles = flayer\flat_tiles! + flat_tiles2 = elayer\flat_tiles! + path1 = graph.path(t1,p1,flat_tiles,true,flayer.tiles_adjacent) + path2 = graph.path(t2,p1,flat_tiles,true,flayer.tiles_adjacent) + path3 = graph.path(t3,p2,flat_tiles2,true,flayer.tiles_adjacent) + path4 = graph.path(t4,p2,flat_tiles2,true,flayer.tiles_adjacent) + if path1 and path2 and path3 and path4 + state.ship\action(coroutine.create(game.ship_move_out_co)) + + ui.reload_ui_layers! + +mod diff --git a/src/level5.moon b/src/level5.moon new file mode 100644 index 0000000..9fbd7cd --- /dev/null +++ b/src/level5.moon @@ -0,0 +1,52 @@ +layer = require "layers" +game = require "game" +state = require "global" +graph = require "graph" +import Layer from layer +ui = require "ui" + +mod = ... + +mod.setup_level = () -> + state.current_level = 5 + --ret = am.group! + state.move_out_done = false + state.clear_layers! + flayer = Layer("fuel","fuel pipe",50,"data/layer_fuel.png") + elayer = Layer("electric","electric wire",10,"data/layer_electric.png") + state.add_layer(flayer) + state.add_layer(elayer) + state.money = 90 + state.ship("position").x = 800 + state.ship\action(coroutine.create(game.ship_move_in_co)) + state.ship("sprite").source = "data/level_5.png" + t1 = flayer\mark_square(11,8,"liquid fuel thruster") + t2 = flayer\mark_square(11,7,"liquid fuel thruster") + p1 = flayer\mark_square(7,8,"liquid fuel tank") + flayer\mark_square(10,8,"fuel pipe") + + t3 = elayer\mark_square(9,5,"ion thruster") + t4 = elayer\mark_square(9,10,"ion thruster") + p2 = elayer\mark_square(7,7,"battery") + elayer\mark_square(7,6,"electric wire") + elayer\mark_square(7,8,"electric wire") + elayer\mark_square(7,9,"electric wire") + elayer\mark_square(8,10,"electric wire") + elayer\mark_square(7,5,"electric wire") + elayer\mark_square(8,5,"electric wire") + + elayer.node.hidden = true + state.selected_layer = flayer + state.update = () -> + flat_tiles = flayer\flat_tiles! + flat_tiles2 = elayer\flat_tiles! + path1 = graph.path(t1,p1,flat_tiles,true,flayer.tiles_adjacent) + path2 = graph.path(t2,p1,flat_tiles,true,flayer.tiles_adjacent) + path3 = graph.path(t3,p2,flat_tiles2,true,flayer.tiles_adjacent) + path4 = graph.path(t4,p2,flat_tiles2,true,flayer.tiles_adjacent) + if path1 and path2 and path3 and path4 + state.ship\action(coroutine.create(game.ship_move_out_co)) + + ui.reload_ui_layers! + +mod diff --git a/src/level6.moon b/src/level6.moon new file mode 100644 index 0000000..f01bb0b --- /dev/null +++ b/src/level6.moon @@ -0,0 +1,56 @@ +layer = require "layers" +game = require "game" +state = require "global" +graph = require "graph" +import Layer from layer +ui = require "ui" + +mod = ... + +mod.setup_level = () -> + state.current_level = 6 + --ret = am.group! + state.move_out_done = false + state.clear_layers! + flayer = Layer("fuel","fuel pipe",50,"data/layer_fuel.png") + elayer = Layer("electric","electric wire",10,"data/layer_electric.png") + state.add_layer(flayer) + state.add_layer(elayer) + state.money = 90 + (50*5) + state.ship("position").x = 800 + state.ship\action(coroutine.create(game.ship_move_in_co)) + state.ship("sprite").source = "data/level_6.png" + t1 = flayer\mark_square(15,4,"liquid fuel thruster") + flayer\mark_square(14,4,"fuel pipe") + t2 = flayer\mark_square(15,6,"liquid fuel thruster") + flayer\mark_square(14,6,"fuel pipe") + t3 = flayer\mark_square(15,9,"liquid fuel thruster") + flayer\mark_square(14,9,"fuel pipe") + t4 = flayer\mark_square(15,11,"liquid fuel thruster") + flayer\mark_square(14,11,"fuel pipe") + p1 = flayer\mark_square(7,8,"liquid fuel tank") + for i = 4,11 do + flayer\mark_square(13,i,"fuel pipe") + + t5 = elayer\mark_square(11,6,"ion thruster") + t6 = elayer\mark_square(11,9,"ion thruster") + p2 = elayer\mark_square(3,7,"battery") + + elayer.node.hidden = true + state.selected_layer = flayer + state.update = () -> + flat_tiles = flayer\flat_tiles! + flat_tiles2 = elayer\flat_tiles! + path1 = graph.path(t1,p1,flat_tiles,true,flayer.tiles_adjacent) + path2 = graph.path(t2,p1,flat_tiles,true,flayer.tiles_adjacent) + path3 = graph.path(t3,p1,flat_tiles,true,flayer.tiles_adjacent) + path4 = graph.path(t4,p1,flat_tiles,true,flayer.tiles_adjacent) + + path5 = graph.path(t5,p2,flat_tiles2,true,flayer.tiles_adjacent) + path6 = graph.path(t6,p2,flat_tiles2,true,flayer.tiles_adjacent) + if path1 and path2 and path3 and path4 and path5 and path6 + state.ship\action(coroutine.create(game.ship_move_out_co)) + + ui.reload_ui_layers! + +mod diff --git a/src/level7.moon b/src/level7.moon new file mode 100644 index 0000000..14a3dc3 --- /dev/null +++ b/src/level7.moon @@ -0,0 +1,56 @@ +layer = require "layers" +game = require "game" +state = require "global" +graph = require "graph" +import Layer from layer +ui = require "ui" + +mod = ... + +mod.setup_level = () -> + state.current_level = 7 + --ret = am.group! + state.move_out_done = false + state.clear_layers! + flayer = Layer("fuel","fuel pipe",50,"data/layer_fuel.png") + elayer = Layer("electric","electric wire",10,"data/layer_electric.png") + state.add_layer(flayer) + state.add_layer(elayer) + state.money = 190 + state.ship("position").x = 800 + state.ship\action(coroutine.create(game.ship_move_in_co)) + state.ship("sprite").source = "data/level_7.png" + t1 = flayer\mark_square(15,4,"liquid fuel thruster") + flayer\mark_square(14,4,"fuel pipe") + t2 = flayer\mark_square(15,6,"liquid fuel thruster") + flayer\mark_square(14,6,"fuel pipe") + t3 = flayer\mark_square(15,9,"liquid fuel thruster") + flayer\mark_square(14,9,"fuel pipe") + t4 = flayer\mark_square(15,11,"liquid fuel thruster") + flayer\mark_square(14,11,"fuel pipe") + p1 = flayer\mark_square(7,8,"liquid fuel tank") + for i = 4,11 do + flayer\mark_square(13,i,"fuel pipe") + + t5 = elayer\mark_square(11,6,"ion thruster") + t6 = elayer\mark_square(11,9,"ion thruster") + p2 = elayer\mark_square(3,7,"battery") + + elayer.node.hidden = true + state.selected_layer = flayer + state.update = () -> + flat_tiles = flayer\flat_tiles! + flat_tiles2 = elayer\flat_tiles! + path1 = graph.path(t1,p1,flat_tiles,true,flayer.tiles_adjacent) + path2 = graph.path(t2,p1,flat_tiles,true,flayer.tiles_adjacent) + path3 = graph.path(t3,p1,flat_tiles,true,flayer.tiles_adjacent) + path4 = graph.path(t4,p1,flat_tiles,true,flayer.tiles_adjacent) + + path5 = graph.path(t5,p2,flat_tiles2,true,flayer.tiles_adjacent) + path6 = graph.path(t6,p2,flat_tiles2,true,flayer.tiles_adjacent) + if path1 and path2 and path3 and path4 and path5 and path6 + state.ship\action(coroutine.create(game.ship_move_out_co)) + + ui.reload_ui_layers! + +mod diff --git a/src/level8.moon b/src/level8.moon new file mode 100644 index 0000000..0a9ce96 --- /dev/null +++ b/src/level8.moon @@ -0,0 +1,56 @@ +layer = require "layers" +game = require "game" +state = require "global" +graph = require "graph" +import Layer from layer +ui = require "ui" + +mod = ... + +mod.setup_level = () -> + state.current_level = 8 + --ret = am.group! + state.move_out_done = false + state.clear_layers! + flayer = Layer("fuel","fuel pipe",50,"data/layer_fuel.png") + elayer = Layer("electric","electric wire",10,"data/layer_electric.png") + state.add_layer(flayer) + state.add_layer(elayer) + state.money = 40 + state.ship("position").x = 800 + state.ship\action(coroutine.create(game.ship_move_in_co)) + state.ship("sprite").source = "data/level_8.png" + t1 = flayer\mark_square(15,4,"liquid fuel thruster") + flayer\mark_square(14,4,"fuel pipe") + t2 = flayer\mark_square(15,6,"liquid fuel thruster") + flayer\mark_square(14,6,"fuel pipe") + t3 = flayer\mark_square(15,9,"liquid fuel thruster") + flayer\mark_square(14,9,"fuel pipe") + t4 = flayer\mark_square(15,11,"liquid fuel thruster") + flayer\mark_square(14,11,"fuel pipe") + p1 = flayer\mark_square(7,8,"liquid fuel tank") + for i = 4,11 do + flayer\mark_square(13,i,"fuel pipe") + + t5 = elayer\mark_square(11,6,"ion thruster") + t6 = elayer\mark_square(11,9,"ion thruster") + p2 = elayer\mark_square(3,7,"battery") + + elayer.node.hidden = true + state.selected_layer = flayer + state.update = () -> + flat_tiles = flayer\flat_tiles! + flat_tiles2 = elayer\flat_tiles! + path1 = graph.path(t1,p1,flat_tiles,true,flayer.tiles_adjacent) + path2 = graph.path(t2,p1,flat_tiles,true,flayer.tiles_adjacent) + path3 = graph.path(t3,p1,flat_tiles,true,flayer.tiles_adjacent) + path4 = graph.path(t4,p1,flat_tiles,true,flayer.tiles_adjacent) + + path5 = graph.path(t5,p2,flat_tiles2,true,flayer.tiles_adjacent) + path6 = graph.path(t6,p2,flat_tiles2,true,flayer.tiles_adjacent) + if path1 and path2 and path3 and path4 and path5 and path6 + state.ship\action(coroutine.create(game.ship_move_out_co)) + + ui.reload_ui_layers! + +mod diff --git a/src/level9.moon b/src/level9.moon new file mode 100644 index 0000000..aab46b1 --- /dev/null +++ b/src/level9.moon @@ -0,0 +1,56 @@ +layer = require "layers" +game = require "game" +state = require "global" +graph = require "graph" +import Layer from layer +ui = require "ui" + +mod = ... + +mod.setup_level = () -> + state.current_level = 9 + --ret = am.group! + state.move_out_done = false + state.clear_layers! + flayer = Layer("fuel","fuel pipe",50,"data/layer_fuel.png") + elayer = Layer("electric","electric wire",10,"data/layer_electric.png") + state.add_layer(flayer) + state.add_layer(elayer) + state.money = 840 + state.ship("position").x = 800 + state.ship\action(coroutine.create(game.ship_move_in_co)) + state.ship("sprite").source = "data/level_9.png" + t1 = flayer\mark_square(21,5,"liquid fuel thruster") + t2 = elayer\mark_square(21,6,"ion thruster") + t3 = flayer\mark_square(21,7,"liquid fuel thruster") + t4 = flayer\mark_square(21,8,"liquid fuel thruster") + t5 = elayer\mark_square(21,9,"ion thruster") + t6 = flayer\mark_square(21,10,"liquid fuel thruster") + + t7 = flayer\mark_square(13,8,"generator") + t8 = elayer\mark_square(13,8,"generator") + + p1 = flayer\mark_square(7,7,"liquid fuel tank") + + elayer.node.hidden = true + state.selected_layer = flayer + state.update = () -> + flat_tiles = flayer\flat_tiles! + flat_tiles2 = elayer\flat_tiles! + + path1 = graph.path(t1,p1,flat_tiles,true,flayer.tiles_adjacent) + path3 = graph.path(t3,p1,flat_tiles,true,flayer.tiles_adjacent) + path4 = graph.path(t4,p1,flat_tiles,true,flayer.tiles_adjacent) + path6 = graph.path(t6,p1,flat_tiles,true,flayer.tiles_adjacent) + + path5 = graph.path(t5,t8,flat_tiles2,true,flayer.tiles_adjacent) + path2 = graph.path(t2,t8,flat_tiles2,true,flayer.tiles_adjacent) + + path7 = graph.path(t7,p1,flat_tiles,true,flayer.tiles_adjacent) + + if path1 and path2 and path3 and path4 and path5 and path6 and path7 + state.ship\action(coroutine.create(game.ship_move_out_co)) + + ui.reload_ui_layers! + +mod diff --git a/src/main.moon b/src/main.moon new file mode 100644 index 0000000..b90c819 --- /dev/null +++ b/src/main.moon @@ -0,0 +1,36 @@ +--Theme: repair +--Game: drydock - repair space ships (?) +require "ext" +print("Hello, world!") +ss = require "startscreen" +game = require "game" +state = require "global" +level_1 = require "level1" +complete = require "complete" +mod = ... + +state.win = am.window { + title: "ggj20", + width: state.screen_width, + height: state.screen_height, + clear_color: vec4(0, 0, 0, 1) +} + + +r1 = ss.gen_scene! +--r1\append(complete.starfield!) +state.win.scene = r1 +r1\action(coroutine.create(() -> + while true + if state.win\key_down("space") + state.win.scene = am.group! ^ {game.gen_scene!, level_1.setup_level!} + coroutine.yield! +)) + + + +-- This is a comment +-- to make sure that errors +-- are rewritten correctly + +--error("success!") diff --git a/src/manager.moon b/src/manager.moon new file mode 100644 index 0000000..f6d2b3f --- /dev/null +++ b/src/manager.moon @@ -0,0 +1,9 @@ +-- manage overlay text + +mod = ... + +mod.talk = (text) -> + --pass + + +mod diff --git a/src/startscreen.moon b/src/startscreen.moon new file mode 100644 index 0000000..9c92758 --- /dev/null +++ b/src/startscreen.moon @@ -0,0 +1,12 @@ +--start screen + +mod = ... + +mod.gen_scene = () -> + node = am.group! + background = am.translate(0,0) ^ am.scale(1) ^ am.sprite("data/ph_start_screen.png") + text = am.translate(0,-100) ^ am.text("Press space to start") + node ^ {background, text} + node + + diff --git a/src/ui.moon b/src/ui.moon new file mode 100644 index 0000000..4adcde0 --- /dev/null +++ b/src/ui.moon @@ -0,0 +1,70 @@ +--UI things +state = require "global" +disp = require "dispatch" +mod = ... + +money_text +credits_ui +layers = am.group! +mod.managerstuff +mod.manager_text +mod.manager_talking = true +mod.make_ui = () -> + to = disp.normal_to_window(vec2(100,25)) + money_bg = am.translate(to) ^ am.scale(1) ^ am.rotate(0) ^ am.sprite("data/money_background.png") + money_text = am.translate(to) ^ am.scale(1) ^ am.rotate(0) ^ am.text("")\tag "sprite" + mod.managerstuff = am.group! + manager_portrait = am.translate(-512 + 128,-128) ^ am.scale(1) ^ am.rotate(0) ^ am.sprite("data/manage_portrait.png") + manager_background = am.translate(0,-128) ^ am.scale(1) ^ am.rotate(0) ^ am.sprite("data/manage_chatbox.png") + mod.manager_text = am.translate(-256 + 32,-256 + 90) ^ am.scale(1) ^ am.rotate(0) ^ am.text("This is some text",vec4(1,1,1,1),"left","top")\tag("text") + print("mod.manager_text is:",mod.manager_text) + continue_text = am.translate(-256 + 32,-256 + 32) ^ am.scale(1) ^ am.rotate(0) ^ am.text("Press space to continue...",vec4(0,0,0,1),"left","top") + mod.managerstuff\append(manager_portrait) + mod.managerstuff\append(manager_background) + mod.managerstuff\append(mod.manager_text) + mod.managerstuff\append(continue_text) + mod.managerstuff.hidden = true + money_text\action(coroutine.create(() -> + while true + money_text("sprite").text = string.format("%d credits", state.money) + coroutine.yield! + )) + ret = am.group! ^ {money_bg, money_text, layers, mod.managerstuff} + credits_ui = ret + ret + +mod.reload_ui_layers = () -> + layer_sprites = {} + for i,layer in pairs state.layer_tbl + if state.current_level < 4 then + layer.hidden = true -- hide layer selection until lvl 5 + else + layer.hidden = false + selected_layer = am.translate(state.win.right-32,128 - (64*i))\tag("position") ^ am.rotate(0) ^ am.sprite(layer.icon) + selected_layer\append(am.sprite("data/selected_layer_outline.png")\tag("outline")) + selected_layer("outline").color = vec4(0.4,0.4,0.4,1) + layers\append(selected_layer) + if state.selected_layer == layer + selected_layer("outline").color = vec4(1,1,1,1) + + + +mod.hide_ui = () -> + credits_ui.hidden = true + +mod.hide_ui = () -> + credits_ui.hidden = false + +mod.manager_say = (text) -> + mod.managerstuff.hidden = false + print("Setting text:",text) + mod.manager_text("text").text = text + mod.manager_talking = true + mod.managerstuff\action(coroutine.create(() -> + while not state.win\key_pressed("space") + coroutine.yield! + mod.managerstuff.hidden = true + mod.manager_talking = false + )) + print("Completed doing manager say stuff") +mod |
