11-9 戦闘1 自分の行動
同人誌について
この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。
(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)
説明と全体コード
「src/mymod/scene_battle/battle/my.py」の説明です。戦闘の計算をおこなうモジュールです。
自分が攻撃側の場合の計算です。おこなっていることは、次のとおりです。
選択したメニューが「ESCAPE」なら、逃走判定をおこなう。
選択したメニューがそれ以外なら、各値を設定する。
MPが足りていなければ、処理を打ち切る。
MPが足りていれば、行動するのでSEを鳴らす。
回復の場合は計算して結果を返す。
ダメージの場合は計算して結果を返す。
import random
from ... import data
from . import util
# 実行 自分
def exec(action: str) -> data.battle.Res:
res = data.battle.Res(action)
a = data.action
# 逃走
if action == a.ESCAPE:
res.is_escape = True
res.success_escape = random.randrange(2) == 0 # 1/2
return res
# その他の行動
m = data.game.data
e = data.enemy.enemy_now
mp = pow = df = 0
if action == a.SWORD:
pow = m.at
df = e.df
if action == a.FIRE:
res.se = data.audio.MAGIC
n = m.items.fire.count
mp = n * 30
pow = 25 + n * 25
df = e.df // 4
if action == a.HEAL:
res.se = data.audio.HEAL
n = m.items.fire.count
mp = n * 20
pow = 100 + n * 50
# MPが足りているか確認して終了/消費
if m.mp < mp: return res
res.success_mp = True
m.mp -= mp
# 回復の場合
if action == data.action.HEAL:
heal = random.randrange(pow // 2, pow)
m.hp = min(m.hp_max, m.hp + heal)
res.res_num = heal
return res
# ダメージの場合
damage = util.calc_damage(pow, df)
e.hp = max(0, e.hp - damage)
res.res_num = damage
return res
インポート部分
まずは、インポート部分を示します。
import random
from ... import data
from . import util
`data` `game`パッケージを読み込みます。
また、同じ階層の`util`モジュールを読み込みます。
自分側の行動の実行1 冒頭処理
自分側の行動をおこなう`exec()`関数です。まずは冒頭だけを示します。
# 実行 自分
def exec(action: str) -> data.battle.Res:
res = data.battle.Res(action)
a = data.action
`action`を引数にして、`Res`クラスのインスタンスを作成して、変数`res`に代入します。この変数`res`に、このあとの処理で戦闘結果を格納します。
また`data.action`モジュールの参照を、変数`a`に格納します。変数`a`は、このあとのプログラムを短く書くために使います。
自分側の行動の実行2 逃走
メニューで選んだ行動が逃走`ESCAPE`の場合は、逃走の正否を判定します。
# 逃走
if action == a.ESCAPE:
res.is_escape = True
res.success_escape = random.randrange(2) == 0 # 1/2
return res
自分側の行動の実行3 選択メニューによる分岐
逃走`ESCAPE`以外の行動を選んだときの処理です。選んだ行動に応じて、計算に使う値を設定します。
# その他の行動
m = data.game.data
e = data.enemy.enemy_now
mp = pow = df = 0
if action == a.SWORD:
pow = m.at
df = e.df
if action == a.FIRE:
res.se = data.audio.MAGIC
n = m.items.fire.count
mp = n * 30
pow = 25 + n * 25
df = e.df // 4
if action == a.HEAL:
res.se = data.audio.HEAL
n = m.items.fire.count
mp = n * 20
pow = 100 + n * 50
自分側の行動の実行4 MP判定
MPが足りているか確認します。足りていない場合は処理を打ち切ります。
# MPが足りているか確認して終了/消費
if m.mp < mp: return res
res.success_mp = True
m.mp -= mp
自分側の行動の実行5 回復
選んだ行動が回復`HEAL`の場合の処理です。
# 回復の場合
if action == data.action.HEAL:
heal = random.randrange(pow // 2, pow)
m.hp = min(m.hp_max, m.hp + heal)
res.res_num = heal
return res
HPを回復して、MPを減らします。そして処理を終了します。
自分側の行動の実行6 ダメージ
ダメージの計算をして、結果を返します。ダメージの計算は`util.calc_damage()`関数でおこないます。
# ダメージの場合
damage = util.calc_damage(pow, df)
e.hp = max(0, e.hp - damage)
res.res_num = damage
return res
次の内容については省略します。こちらは同人誌をご覧ください。
11-10 戦闘2 敵側の行動
11-11 戦闘3 ユーティリティ
11-12 エフェクト1 管理
11-13 エフェクト2 行動用
11-14 エフェクト3 その他
同人誌について
この連載は、同人誌『PythonとPygameで作る レトロ風RPG 全コード』を一部抜粋して編集したものです。
同人誌本編には、ゲーム本体のソースコードや、各種のサンプルコード、Windowsで実行できるEXEファイルが付属しています。PDFで290ページの本になります。ぜひ、こちらもご購入ください。
(2024-03-28:ver1.0.4 に更新、2024-03-10:ver1.0.3 に更新)
このnoteの記事と、Webページに一部抜粋版を掲載しています。
技術系同人誌など まとめページ
この記事が気に入ったらサポートをしてみませんか?