ゲームキャラクターの開発
CoddyのGDScriptジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 64/65。
チャレンジ
中級ロールプレイングゲームのキャラクターを作成します。抽象クラスのCharacter、それを拡張する3つのクラス、そしてキャラクターが習得するアビリティです。
character.gdのCharacterは@abstractクラスです。
- プロパティ:
character_name(コンストラクターから取得)、levelは1、max_healthとhealthは100.0、max_manaとmanaは50、strength、intelligence、agilityは10、defenseは5、そしてArray[Ability]型のabilities。体力の値はfloatで、その他のステータスはintです。 - シグナル
defeated(character_name: String)。 - 抽象メソッド
class_title() -> Stringとattack_power() -> float。 level_up() -> String:レベルが+1、最大体力が+10、最大マナが+5、strength、intelligence、agility、defenseがそれぞれ+1されます。体力とマナは最大値まで回復します。NAME reached level N!を返します。attack(target):NAME attacks TARGETを出力し、その後target.take_damage(attack_power())を返します。take_damage(amount) -> float:ダメージはamount - defense * 0.5ですが、最低でも1.0です。体力はその分減少し、0.0を下回ることはありません。小数点以下1桁でNAME takes D damage (HP H)を出力し、この攻撃で体力が0になった場合はdefeatedを発行して、ダメージを返します。is_alive():体力が0より大きいかどうかを返します。learn_ability(ability)はabilitiesに追加します。use_ability(index, target) -> float:indexがabilitiesの範囲外の場合、NAME has no ability INDEXを出力して0.0を返します。それ以外の場合は、アビリティのuse()が返す値を返します。_to_string():NAME the TITLE (level L): HP H/MAX, mana M/MAX, STR S, INT I, AGI A, DEF Dを返します。体力は小数点以下1桁で表示します。
各サブクラスは親のコンストラクターを呼び出してから、独自の初期ステータスを設定します(その他のステータスは基底クラスの値を保持します)。class_title()はクラス名を返し、level_up()はsuper()を使ってオーバーライドします。
Warrior:体力150.0、マナ30、strength15、intelligence5、defense8。攻撃力はstrength * 1.2。レベルアップ時にさらにstrengthが+2、最大体力が+10されます(体力は全回復)。Mage:体力80.0、マナ150、strength5、intelligence20、defense3。攻撃力はintelligence * 0.4。通常攻撃の後、マナが5回復します(最大値を超えません)。レベルアップ時にさらにintelligenceが+2、最大マナが+15されます(マナは全回復)。Rogue:体力100.0、マナ60、strength12、intelligence8、agility18、defense4。攻撃力はstrength * 0.5 + agility * 0.7。レベルアップ時にさらにagilityが+2されます。
ability.gdのAbility:コンストラクターはability_name、mana_cost(int)、damage(float)を受け取ります。ユーザーのマナがコストを下回っている場合、use(user, target) -> floatはUSER does not have enough mana for ABILITYを出力して0.0を返します。それ以外の場合はマナを消費し、USER casts ABILITY on TARGETを出力して、target.take_damage(damage + user.intelligence * 0.5)を返します。
提供されたコードは、各キャラクターのdefeatedシグナルに接続し、NAME is defeated!を出力します。次の入力に対する:
hero warrior|Aragorn
hero rogue|Orc
attack Aragorn|Orc
attack Orc|Aragorn
level Aragorn
status Aragorn出力は次のとおりです。
Aragorn attacks Orc
Orc takes 16.0 damage (HP 84.0)
Orc attacks Aragorn
Aragorn takes 14.6 damage (HP 135.4)
Aragorn reached level 2!
Aragorn the Warrior (level 2): HP 170.0/170.0, mana 35/35, STR 18, INT 6, AGI 11, DEF 9コードはcharacter.gd、warrior.gd、mage.gd、rogue.gd、ability.gdに記述します。main.gdには提供された入出力コードがあり、編集できません。
自分で試してみよう
extends Node
func _ready():
# 提供された入出力コード:そのままにしてください
var heroes := {}
var line := OS.read_string_from_stdin()
while line != "":
var parts := line.split(" ", true, 1)
var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
match parts[0]:
"hero":
var hero: Character
match f[0]:
"warrior":
hero = Warrior.new(f[1])
"mage":
hero = Mage.new(f[1])
"rogue":
hero = Rogue.new(f[1])
hero.defeated.connect(func(who): print(who, " is defeated!"))
heroes[f[1]] = hero
"learn":
heroes[f[0]].learn_ability(Ability.new(f[1], int(f[2]), float(f[3])))
"attack":
heroes[f[0]].attack(heroes[f[1]])
"cast":
heroes[f[0]].use_ability(int(f[1]), heroes[f[2]])
"level":
print(heroes[f[0]].level_up())
"status":
print(heroes[f[0]])
line = OS.read_string_from_stdin()
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: GDScriptオンラインコンパイラ