import numpy as np from game_server.resource.configdb.avatar_config import AvatarConfig from game_server.resource.configdb.stage_config import StageConfig from game_server.resource import ResourceManager from rail_proto.lib import ( BattleEndStatus, PVEBattleResultCsReq, SceneCastSkillCsReq, SceneCastSkillScRsp, SceneBattleInfo, SceneMonsterWave, SceneMonster, SceneEntityInfo, BattleBuff, Avatar, ) class BattleManager: def __init__(self, player): self.player = player self.player.next_battle_id += 1 self.battle_id: int = self.player.next_battle_id self.round_limit: int = 0 self.stage_id: int = 0 self.battle_end_status: BattleEndStatus = BattleEndStatus.BATTLE_END_NONE # list & dict self.stages: list[StageConfig] = [] self.entity_monster: list[SceneEntityInfo] = [] #self.buffs: list[MazeBuff] = [] self.battle_result: PVEBattleResultCsReq | None = None def GetBattleLineup(self): return [ self.player.avatar_manager.get(avatar_id).ToBattleProto(index,self.player) for index, avatar_id in enumerate(self.player.lineup_manager.get(self.player.data.cur_lineup, None).avatar_list) ] def GetBattleMonster(self): return [ SceneMonsterWave( battle_stage_id=monster_list.StageID, battle_wave_id=index, monster_list=[ SceneMonster( monster_id=id ) for monster_dict in monster_list.MonsterList for monster, id in monster_dict.items() if id > 0 ] ) for index, monster_list in enumerate(self.stages) ] def GetMazeBuffs(self, msg: SceneCastSkillCsReq)-> list[BattleBuff]: buffs = [] for index, avatar_id in enumerate(self.player.lineup_manager.get(self.player.data.cur_lineup, None).avatar_list): if avatar_id == 1407 and msg.attacked_by_entity_id >> 20 != 1407 or avatar_id == 1407 and msg.attacked_by_entity_id >> 20 == 1407 and msg.skill_index == 0: continue for buff,lv in ResourceManager.instance().find_by_index(AvatarConfig,avatar_id).MazeBuffs.items(): buffs.append(BattleBuff( id=buff, level=lv, owner_index=index, wave_flag=0xffffffff )) return buffs def EnterBattle(self, msg: SceneCastSkillCsReq, targets: list[int]) -> SceneCastSkillScRsp: self.stages: list[StageConfig] = [] for entity_id in targets: entity_data = self.player.scene_manager.entities.get(entity_id) if entity_data: stage = ResourceManager.instance().find_by_index(StageConfig, entity_data.npc_monster.event_id * 10) if not stage: stage = ResourceManager.instance().find_by_index(StageConfig, entity_data.npc_monster.event_id) if stage: self.stages.append(stage) self.entity_monster.append(entity_data) if self.stages: self.stage_id = self.stages[0].StageID return SceneCastSkillScRsp( retcode=0, cast_entity_id=msg.cast_entity_id, battle_info=SceneBattleInfo( rounds_limit=self.round_limit, world_level=self.player.data.world_level, logic_random_seed=np.random.randint(1, np.iinfo(np.int32).max, dtype=np.int32), stage_id=self.stage_id, battle_id=self.battle_id, battle_avatar_list=self.GetBattleLineup(), monster_wave_list=self.GetBattleMonster(), buff_list=self.GetMazeBuffs(msg) ) ) return SceneCastSkillScRsp()