98 lines
3.9 KiB
Python
98 lines
3.9 KiB
Python
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() |