-- 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