-- Game context: contains all relevant objects for running game GameContext = {} GameContext.__index = GameContext function GameContext:new(assetLoader, inputManager) self = setmetatable({}, GameContext) self.assetLoader = assetLoader self.inputManager = inputManager self.roomManager = nil self.players = {} self.projectiles = {} self.drops = {} return self end function GameContext:reset() self.projectiles = {} self.drops = {} self:resetCombatants() end function GameContext:addPlayer(name, index) local asset = self.assetLoader:loadCharacter(name) local combatant = Combatant:new(asset, self) combatant.playerIdx = index combatant.color = Config.PLAYER_COLORS[index] combatant.behavior = Behaviors.player:new(combatant) if asset.config and asset.config.defaultWeapon then local weaponAsset = self.assetLoader:loadWeapon(asset.config.defaultWeapon.name) local weapon = Weapon:new( weaponAsset, asset.config.defaultWeapon.attackSkill, asset.config.defaultWeapon.chargeSkill ) combatant:equipWeapon(weapon) end if asset.config.defensiveSkill then combatant:equipSkill(PlayerSkillSlot.DEFENSIVE, asset.config.defensiveSkill) end table.insert(self.players, combatant) end function GameContext:addEnemy(spawner, enemy) local asset = self.assetLoader:loadEnemy(enemy) local x, y = self.roomManager:findFloor(spawner.x, spawner.y, asset.config.height or 32) local combatant = Combatant:new(asset, self) combatant.team = CombatantTeam.ENEMY combatant.x = x combatant.y = y combatant.behavior = Behaviors[asset.config.behavior]:new(combatant) table.insert(self.combatants, combatant) end function GameContext:addRandomEnemy(spawner) local enemyName = Utils.pickRandomKeyFromWeightedTable(spawner.enemies) self:addEnemy(spawner, enemyName) end function GameContext:resetCombatants() self.combatants = {} local spawnX, spawnY = self.roomManager:findPlayerSpawnPosition() for i, player in ipairs(self.players) do player.x = spawnX + ((#self.players - i) * player.width) player.y = spawnY - player.height player.velX = 0 player.velY = 0 player.activeSkills = {} player.skillCooldown = 0 player.isCharging = false player.chargeTime = 0 player.facing = 1 player.moveX = 0 player.behavior.roomCollision = self.roomManager.currentRoomCollision player.behavior.disableTimer = Config.PLAYER_SPAWN_TIME player.behavior.spawnTimer = Config.PLAYER_SPAWN_TIME table.insert(self.combatants, player) end end function GameContext:loadRoom(room) self.roomManager:loadRoom(room) self:reset() if self.roomManager.currentRoomConfig.spawners ~= nil then for _, spawner in ipairs(self.roomManager.currentRoomConfig.spawners) do self:addRandomEnemy(spawner) end end end