aboutsummaryrefslogtreecommitdiff
path: root/src/room.moon
diff options
context:
space:
mode:
authorAlexander M Pickering <alex@cogarr.net>2024-01-29 16:20:10 -0600
committerAlexander M Pickering <alex@cogarr.net>2024-01-29 16:20:10 -0600
commitc2926c5ec74d7e37da395c8c32a7ff2b4cae7d06 (patch)
treeac2bb208dab1274cdc5e9059ffe014ae19181a4c /src/room.moon
downloadfools_rush_in-c2926c5ec74d7e37da395c8c32a7ff2b4cae7d06.tar.gz
fools_rush_in-c2926c5ec74d7e37da395c8c32a7ff2b4cae7d06.tar.bz2
fools_rush_in-c2926c5ec74d7e37da395c8c32a7ff2b4cae7d06.zip
All the files
Diffstat (limited to 'src/room.moon')
-rw-r--r--src/room.moon152
1 files changed, 152 insertions, 0 deletions
diff --git a/src/room.moon b/src/room.moon
new file mode 100644
index 0000000..e578f50
--- /dev/null
+++ b/src/room.moon
@@ -0,0 +1,152 @@
+-- Room, can contain one or more parties
+-- When things like abilities happen, they always happen on the room.
+main = require "main"
+char = require "char"
+import Character from char
+mod = ...
+
+-- Each room has 8 position, 4 for players, 4 for enemies
+-- Room types:
+-- normal : p p p p e e e e
+-- 4 3 2 1 1 2 3 4
+-- surrounded: e e p p p p e e
+-- 2 1 1 2 2 1 1 2
+-- 3 3 3 3
+-- 4 4 4 4
+-- ambush : e p p e e p p e
+-- 1 1 1 1 1 1 1 1
+-- 2 2 2 2 2 2 2 2
+-- 3 3 3 3 3 3 3 3
+-- 4 4 4 4 4 4 4 4
+-- skirmish: e p e p e p e p
+-- 1 1 1 1 1 1 1 1
+-- 2 2 2 2 2 2 2 2
+-- 3 3 3 3 3 3 3 3
+-- 4 4 4 4 4 4 4 4
+
+class Room
+ @children = {}
+ new: (data) =>
+ @parties = {}
+ @actions_taken = {}
+ @special = {}
+ @node = am.group!
+ @data = data or {locations: {{},{},{},{},{},{},{},{}}}
+ for position, ptbl in pairs(@data.locations)
+ for pid, character in pairs(ptbl)
+ if character.uname
+ --player character
+ ptbl[pid] = main.world.player_party\member(character.uname)
+ else
+ ptbl[pid] = Character.deserialize(character)
+
+ add_party: (party) =>
+ table.insert(@parties,party)
+
+ at_location: (n) ->
+ return @data.locations[n]
+
+ generate: (...) ->
+ mod.SimpleRoom!
+
+ @__inherited: (child) =>
+ assert(child.distribute_party, "Rooms must be able to distribute parties")
+ @@.children[child.__name] = child
+ mod[child.__name] = child
+
+ serialize: () =>
+ ser_tbl = {
+ name:@@__name,
+ data:@data
+ }
+ --Rewrite locations to serialize characters
+ for position, ptbl in pairs(ser_tbl.data.locations)
+ for pid, character in pairs(ptbl)
+ if character.uname
+ ptbl[pid] = {uname:character.uname}
+ else
+ ptbl[pid] = character\serialize!
+ ret = am.to_json(ser_tbl)
+ ret
+
+ deserialize: (data) ->
+ tbl = am.parse_json(data)
+ typ = mod.Room.children[tbl.name]
+ typ(tbl.data)
+
+ __tostring: () =>
+ return string.format("<%s>",@@__name)
+
+class LobbyRoom extends Room
+ new: (...) =>
+ super(...)
+ @floor_y = -208
+ @node\append(am.sprite("data/lobby_bg.png"))
+ load:() =>
+ main.root("bg")\append(@node)
+ unload:() =>
+ main.root("bg")\remove(@node)
+
+ distribute_party: (...) =>
+ {}
+
+ enemy_location_of: (position) =>
+ assert(position, "Position my not be nil")
+ ((main.width/9) * position)
+
+ player_location_of: (position) =>
+ error("lobbyroom player_position_of")
+ assert(position, "Position may not be nil")
+ -((main.width/9) * position)
+
+class CampRoom extends Room
+ new: (...) =>
+ super(...)
+ @floor_y = -207
+ @node\append(am.sprite("data/camp.png"))
+ @data.locations = {{},{},{},{},{},{},{},{}}
+ load:() =>
+ main.root("bg")\append(@node)
+
+ unload:() =>
+ main.root("bg")\remove(@node)
+
+ distribute_party: (playerparty) =>
+ for _,player in pairs(playerparty)
+ table.insert(ret[player.position],player)
+
+class SimpleRoom extends Room
+ new: (...) =>
+ super(...)
+ @floor_y = -207
+ @node\append(am.sprite("data/room.png"))
+ load:() =>
+ main.root("bg")\append(@node)
+
+ unload:() =>
+ main.root("bg")\remove(@node)
+
+ distribute_party:(playerparty, enemyparty) =>
+ for _,player in pairs(playerparty.members)
+ loc = @data.locations[5-player.data.position]
+ table.insert(loc,player)
+ player\set_location(loc)
+ for _,enemy in pairs(enemyparty.members)
+ loc = @data.locations[enemy.data.position+4]
+ table.insert(loc,enemy)
+ enemy\set_location(loc)
+
+ player_location_of: (position) =>
+ assert(position, "Position may not be nil")
+ -((main.width/9) * position)
+
+ enemy_location_of: (position) =>
+ assert(position, "Position my not be nil")
+ ((main.width/9) * position)
+
+
+
+mod.Room = Room
+mod.SimpleRoom = SimpleRoom
+
+mod