私はしばらくの間取り組んできたゲームを持っています。コアは C++ ですが、スクリプトと Attacks/StatusEffects/Items などには Python を使用しています。
私は、必要な動作を得るために eval を使用する必要があるコーナーに自分自身をコード化しました。それがどのように発生しているかは次のとおりです。
次のように、攻撃を特定するために使用する xml ドキュメントがあります。
<Attack name="Megiddo Flare" mp="144" accuracy="1.5" targetting="EnemyParty">
<Flags>
<IgnoreElements/>
<Unreflectable/>
<ConstantDamage/>
<LockedTargetting/>
</Flags>
<Components>
<ElementalWeightComponent>
<Element name="Fire" weight="0.5"/>
</ElementalWeightComponent>
<ConstantDamageCalculatorComponent damage="9995" index="DamageCalculatorComponent"/>
</Components>
</Attack>
このファイルを Python で解析し、攻撃をビルドします。各攻撃は、さまざまな動作を実装するための任意の数のコンポーネントで構成されます。この攻撃の場合、DamageCalculatorComponent を実装して、Python に ConstantDamage バリアントを使用するように指示します。これらすべてのコンポーネントをスクリプト ファイルに実装します。これは、私が頻繁に使用するコンポーネント タイプに適しています。その特定のコンポーネント バリアントを使用する唯一の攻撃になる攻撃がいくつかあります。コンポーネントをスクリプト ファイルに追加するのではなく、xml ファイルで Component クラスを指定できるようにしたいと考えました。
たとえば、ファイナルファンタジーの古典的なホワイトウィンド攻撃を実装する場合(攻撃者のHPの量だけチームのHPを回復します)
<Attack name="White Wind" mp="41" targetting="AnyParty">
<Flags>
<LockedTargetting/>
</Flags>
<Components>
<CustomComponent index="DamageCalculatorComponent">
<![CDATA[
class WhiteWindDamageComponent(DamageCalculatorComponent):
def __init__(self, Owner):
DamageCalculatorComponent.__init__(self, Owner)
def CalculateDamage(self, Action, Mechanics):
Dmg = 0
character = Action.GetUsers().GetFirst()
SM = character.GetComponent("StatManagerComponent")
if (SM != None):
Dmg = -SM.GetCurrentHP()
return Dmg
return WhiteWindDamageComponent(Owner)
]]>
</CustomComponent>
</Components>
</Attack>
これを行うためのより良い方法があるのではないかと思っていましたか?私が確認できる他の唯一の方法は、考えられるすべてのコンポーネント バリアント定義を Python ファイルに入れ、コンポーネント クリエーターを展開して追加のバリアントをチェックすることです。使い捨てのコンポーネントには少し無駄に思えます。型を動的に生成するためのより良い/安全な代替手段、またはおそらく私が見ていない別の解決策はありますか?
前もって感謝します