Files
neonsr/game_server/game/battle/battle_manager.py
2025-04-16 16:25:31 +08:00

80 lines
3.1 KiB
Python

import numpy as np
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
)
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 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()
)
)
return SceneCastSkillScRsp()