下面的代码是一个片段,用于接收集群大小(遭遇难度)、玩家所在游戏的行为以及玩家从数据库中选择敌人并创建它们。这呈现了假设玩家处于第1幕和第1级的测试用例,并使用了为测试目的编写的单个技能。
EnemyDatabase={'1':{'1':{'Cultist':{'spawn':{'spawnrate':[0, 100], 'ClusterValue':2, 'EnemyLevelRange':(1, 3), 'HpPerLevel':20, 'XpPerLevel':2},
'Fighter':{MaxHp:50, death_function:monster_death},
'Skill':{'type' : 'low', 'TitanicOnslaught':(1, 1, .1, .2, 2)},
'Corpse':{'DrainValue':None, 'XpValue':10, 'PreviouslyDrained':[False, False]},
'AI':BasicMonster,
'Object':{'name':'Cultist'}}}}}
SkillDatabase={'TitanicOnslaught':{'function':CastTitanicOnslaught, 'flags':['melee']}}
def GatherSpawnPool(PlayerLevel, EnemyDatabase):
SpawnDict={}
for key, value in EnemyDatabase[str(GameProgression.Act)]:
if int(key)<=PlayerLevel:
i=key
for key, value in EnemyDatabase[str(GameProgression.Act)][i]:
SpawnDict.update({key:value})
return SpawnDict
def MobSelector(SpawnPool):
#Select the enemies that will be spawned for this encounter from the spawn pool
i=0
EnemiesToSpawn=[]
while i <= EncounterClusterSize:
num=random.randrange(0.001, 100)
for key in SpawnPool:
if num >= SpawnPool[key]['spawn']['spawnrate'][0] and num <= SpawnPool[key]['spawn']['spawnrate'][1]:
EnemiesToSpawn.append(key)
i+= SpawnPool[key]['spawn']['ClusterValue']
return EnemiesToSpawn
def DynamicVariable(VarName, Value):
return exec Varname+Value
def SkillFactory(SkillValues, SkillDatabase):
if SkillValues['type']=='low':
EntitySkills=[]
for key, value in SkillValues:
Flags=[]
for x in SkillDatabase[key][flags]:
Flags.append(exec x+"=True")
EntitySkills.append(exec key+"=Skill(function=SkillDatabase[key]['function'], arguments=value, flags=Flags, **SkillValues['other'])")
SkillStuff=LowActorSkill(AvailableSkills=EntitySkills, Cooldowns=[0 **len(EntitySkills)])
return SkillStuff
exec ""
elif SkillValues['type']=='high':
pass
def SpawnMobs(MobsToSpawn, SpawnPool, SkillDatabase):
SpawnedEnemies=[]
for enemy in MobsToSpawn:
FighterComponent=Fighter(**SpawnPool[enemy]['Fighter'])
CorpseComponent=Corpse(**SpawnPool[enemy]['Corpse'])
SkillComponent=SkillFactory(SpawnPool[enemy]['Skill'], SkillDatabase)
SpawnedEnemies.append(exec enemy + "=Object(ai=SpawnPool[enemy]['AI'], fighter=FighterComponent, corpse=CorpseComponent, skill=SkillComponent, **SpawnPool['enemy']['Object'])")
return SpawnedEnemies
def MobFactory():
global player, SkillDatabase, EnemyDatabase
SpawnPool=GatherSpawnPool(player.level, EnemyDatabase)
MobsToSpawn=MobSelector(SpawnPool)
SpawnedMobs=SpawnMobs(MobsToSpawnl, SpawnPool, SkillDatabase)
#FUNCTION TO PICK SPOTS FOR THE ENEMIES TO GO AND EDIT THEIR MAPX AND MAPY GOES HERE
return SpawnedMobs
代码显然不起作用,因为我使用exec语句作为参数,但我无法找到解决方法。目标从数据库中选择的敌人获得信息,以创建字符串所指示的技能对象。我知道动态命名变量通常是不好的做法,但它们永远不会被显式引用。游戏AI模块将扫描轮到它的实体的所有可用能力(只有25种可能性),并根据其可用的操作运行适当的流程。我的问题是上面的代码如何将动态命名和创建的对象附加到列表中?我确信这段代码中还有一些其他的小错误,但我真的无法测试这些错误,直到我通过这一点。此外,我相信有很多方法可以加快或改进它,但现在我正在“让它工作,让它正确,让它快速”中的“让它运转”部分
请随意编辑这个问题,因为我不是最擅长解释自己的人,同时也让它与社区更相关。