aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/complete.moon37
-rw-r--r--src/conf.lua6
-rw-r--r--src/dispatch.moon72
-rw-r--r--src/ext.lua72
-rw-r--r--src/game.moon131
-rw-r--r--src/global.moon22
-rw-r--r--src/graph.lua191
-rw-r--r--src/layers.moon151
-rw-r--r--src/level1.moon56
-rw-r--r--src/level10.moon54
-rw-r--r--src/level11.moon83
-rw-r--r--src/level12.moon83
-rw-r--r--src/level2.moon43
-rw-r--r--src/level3.moon40
-rw-r--r--src/level3p2.moon44
-rw-r--r--src/level4.moon52
-rw-r--r--src/level5.moon52
-rw-r--r--src/level6.moon56
-rw-r--r--src/level7.moon56
-rw-r--r--src/level8.moon56
-rw-r--r--src/level9.moon56
-rw-r--r--src/main.moon36
-rw-r--r--src/manager.moon9
-rw-r--r--src/startscreen.moon12
-rw-r--r--src/ui.moon70
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