diff options
| author | Alexander M Pickering <alex@cogarr.net> | 2024-01-29 16:20:10 -0600 |
|---|---|---|
| committer | Alexander M Pickering <alex@cogarr.net> | 2024-01-29 16:20:10 -0600 |
| commit | c2926c5ec74d7e37da395c8c32a7ff2b4cae7d06 (patch) | |
| tree | ac2bb208dab1274cdc5e9059ffe014ae19181a4c /src/room.moon | |
| download | fools_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.moon | 152 |
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 |
