CODE Python RPG

独学でPythonでRPGを作成する(第40回)補助系の呪文を追加(5)

投稿日:

こんにちは。
「Pythonでつくる ゲーム開発 入門講座」の
Chapter11,12(本格RPGを作ろう!全編・後編)を基にRPGを作っていきます。

前回は補助系の呪文のマヌーサを追加しました。

今回も同じく補助系の呪文ラリホー・ラリホーマを追加します。
(全て記載できていないので、今回と次回で追加します)

目次

  1. 呪文シート
  2. charaの変更
  3. battleの変更
  4. 最後に

呪文シート

「ラリホー」は
相手を眠り状態にします。
眠り状態ですと
攻撃などが出来なくなります。

以下のページを参考にさせて頂きました。
呪文の効果はこちら
呪文の説明はこちら

ラリホーは敵1グループ
ラリホーマは敵1体
が対象です。

また、ラリホーは相手に使う為
成功率を設けます。

ラリホーは成功率を75%(上限値を75)
ラリホーマは成功率を90%(上限値を90)
にします。
※下限は使いません。
※補助系の場合、上限・下限は
 成功率に使います。

 

シートは以上です。

 

 

charaの変更

最初に変数を追加します。

有効ターン数を格納する変数です。
回数を格納する変数は用意しません。
※眠り状態の時にラリホーが効いても
 有効ターンが変わるのみです。

class Chara():
    def __init__(self):
(省略)
        self.turn_sleep = 0 # ラリホー、ラリホーマ(眠り状態)の有効ターン
        self.flag_sleep = False # ラリホー、ラリホーマにかかっているか(眠り状態か)

ラリホーもラリホーマも
眠り状態は同じなので
同じ変数を使います。

 

 

ラリホー

ラリホーのメソッドを追加します。

ついでに前回のマヌーサのメソッドを
変えます。

特に理由はありません。。
※判定の順番を変えるだけで
 やっていることは同じです。

変更前

class Chara():
(省略)

    def manusa(self, target): # マヌーサ
        if target.flag_manusa:
            target.turn_manusa = random.randint(4, 5) # 効果の残りターン
            return 1 # 既にマヌーサにかかっている
        else:
            if random.randint(0, 99) < spell_up_dict["マヌーサ"]: # 呪文の上限値が成功率
                target.flag_manusa = True
                target.turn_manusa = random.randint(4, 5) # 効果の残りターン
                return 2
            else: # 効かなかった
                return -1

変更後

class Chara():
(省略)

    def manusa(self, target): # マヌーサ
        if random.randint(0, 99) < spell_up_dict["マヌーサ"]: # 呪文の上限値が成功率
            target.turn_manusa = random.randint(4, 5) # 効果の残りターン
            if target.flag_manusa:
                return 1 # 既にマヌーサにかかっている
            else:
                target.flag_manusa = True
                return 2
        else: # 効かなかった
            return -1
    def invalid_manusa(self):
        self.turn_manusa = 0
        self.flag_manusa = False

    def rariho(self, target): # ラリホー
        if random.randint(0, 99) < spell_up_dict["ラリホー"]: # 呪文の上限値が成功率
            target.turn_sleep = random.randint(4, 5) # 効果の残りターン
            if target.flag_sleep:
                return 1 # 既にラリホーにかかっている
            else:
                target.flag_sleep = True
                return 2
        else: # 効かなかった
            return -1
    def rarihoma(self, target): # ラリホーマ
        if random.randint(0, 99) < spell_up_dict["ラリホーマ"]: # 呪文の上限値が成功率
            target.turn_sleep = random.randint(4, 5) # 効果の残りターン
            if target.flag_sleep:
                return 1 # 既にラリホーにかかっている
            else:
                target.flag_sleep = True
                return 2
        else: # 効かなかった
            return -1
    def invalid_sleep(self):
        self.turn_sleep = 0
        self.flag_sleep = False

 

マヌーサもラリホーも
やっていることは同じです。

if random.randint(0, 99) < spell_up_dict["ラリホー"]:

・呪文が効いたか確認(成功率より小さい値か)

target.turn_sleep = random.randint(4, 5) # 効果の残りターン

・効いたら有効ターンを設定(更新)

if target.flag_sleep:
    return 1 # 既にラリホーにかかっている
else:
    target.flag_sleep = True
    return 2

・flag_sleepを更新

といった感じです。

あと、invalid_sleepメソッドで
眠り状態を無効にします。

    def invalid_sleep(self):
        self.turn_sleep = 0
        self.flag_sleep = False

 

そしてspell_resetメソッドで
呼び出します。

    def spell_reset(self):
        self.invalid_sukara()
        self.invalid_rukani()
        self.check_dfs()
        self.turn_baikiruto = 0 # バイキルトの残りターン
        self.turn_henatos = 0 # ヘナトスの残りターン
        self.atk = self.get_atk() # 攻撃力を元に戻す
        self.invalid_manusa() # マヌーサの効果を消す
        self.invalid_sleep() # ラリホー、ラリホーマの効果を消す

 

 

呪文を使う

呪文を使う時のメソッドuse_spellを
変更します。

    def use_spell(self, str_spell, target, spell_target_no):
        # 戻り値が-1は状態変化の呪文
(省略)

        elif str_spell == "ラリホー":
            tmp = self.rariho(target)
            if tmp == -1:
                message = target.name + " には きかなかった!"
            elif tmp == 1:
                message = target.name + "は ねむっている!"
            elif tmp == 2:
                message = target.name + "を ねむらせた!"
            return -1, message
        elif str_spell == "ラリホーマ":
            tmp = self.rarihoma(target)
            if tmp == -1:
                message = target.name + " には きかなかった!"
            elif tmp == 1:
                message = target.name + "は ねむっている!"
            elif tmp == 2:
                message = target.name + "を ねむらせた!"
            return -1, message

 

chara.pyは以上です。

 

 

battleの変更

battle.pyを変更します。

補助呪文の残りターンを確認する
check_spell_effect関数に
ラリホーを追加します。

def check_spell_effect(player):
(省略)

        if obj.turn_sleep != 0:
            obj.turn_sleep -= 1
            if obj.turn_sleep == 0:
                check_message.append(obj.name + " はめをさました!")
                obj.invalid_sleep() # ラリホー効果を消す

 

今までのメッセージは
「マヌーサの効果が消えた」
のように「〜の効果が消えた」と
していました。

が、今回は変えて
「〜はめをさました」に
しました。

かかっている呪文が
ラリホーかラリホーマか
分からないので。。(^_^;)

 

次に、眠り状態の相手に
攻撃をした時に、
たまに目を覚ますようにします。

変更前

def main(screen, clock, font, fontS, player, area):
(省略)

        elif idx == 12: # プレイヤーの攻撃
(省略)

            if tmr == 11:
                btl_exp += do_attack(btl_enemy, dmg, turn_obj)
                check_monster()
            if tmr == 16:
                init_message()
                idx = 24 # ターンの確認

変更後

def main(screen, clock, font, fontS, player, area):
(省略)

        elif idx == 12: # プレイヤーの攻撃
(省略)

            if tmr == 11:
                tmp_exp = do_attack(btl_enemy, dmg, turn_obj)
                if dmg != 0 and tmp_exp == 0 and monster[btl_enemy].flag_sleep: # 攻撃した かつ 生きている かつ 眠っている
                    if random.randint(0, 99) < 55: # 55%以下の確率で目を覚ます
                        monster[btl_enemy].invalid_sleep() # 眠り状態を無効
                        set_message(monster[btl_enemy].name + " はめをさました!")
                btl_exp += tmp_exp
                check_monster()
            if tmr == 16:
                init_message()
                idx = 24 # ターンの確認

 

if dmg != 0 and tmp_exp == 0 and monster[btl_enemy].flag_sleep: # 攻撃した かつ 生きている かつ 眠っている

攻撃した相手が目を覚ます条件は
・相手に攻撃が当たる
・攻撃した相手が生きている
・攻撃した相手が眠り状態
の3つをand条件にしています。

if random.randint(0, 99) < 55: # 55%以下の確率で目を覚ます
    monster[btl_enemy].invalid_sleep() # 眠り状態を無効
    set_message(monster[btl_enemy].name + " はめをさました!")

目を覚ます条件を満たしたら
55%以下の確率で目を覚ます
ようにしています。

 

また、全モンスターが
眠り状態の場合は
100%逃げられるようにします。

変更前

def main(screen, clock, font, fontS, player, area):
(省略)

        elif idx == 14: # 逃げられる?
            draw_battle(screen, fontS, turn_obj, player)
            if tmr == 1:
                set_message(player.name + " は逃げ出した!")
            if tmr == 5:
                if btl_start == 1 or random.randint(0, 99) < escape_rate:
                    idx = 22 # 戦闘終了
                else:
                    set_message("しかし、まわりこまれてしまった!")
            if tmr == 10:
                init_message()
                btl_start = 2 # 不意打ちと同じ状態にする
                idx = 23 # ターンセット
                tmr = 0

変更後

def main(screen, clock, font, fontS, player, area):
(省略)

        elif idx == 14: # 逃げられる?
            draw_battle(screen, fontS, turn_obj, player)
            if tmr == 1:
                set_message(player.name + " は逃げ出した!")
            if tmr == 5:
                flag_s = True
                for mon in monster:
                    if not mon.flag_sleep:
                        flag_s = False
                        break
                if flag_s or btl_start == 1 or random.randint(0, 99) < escape_rate: # 全員寝ている か 先制攻撃 は逃げられる
                    idx = 22 # 戦闘終了
                else:
                    set_message("しかし、まわりこまれてしまった!")
            if tmr == 10:
                init_message()
                btl_start = 2 # 不意打ちと同じ状態にする
                idx = 23 # ターンセット
                tmr = 0

 

flag_s = True
for mon in monster:
    if not mon.flag_sleep:
        flag_s = False
        break

全モンスターが眠り状態か
確認しています。

if flag_s or btl_start == 1 or random.randint(0, 99) < escape_rate: # 全員寝ている か 先制攻撃 は逃げられる
    idx = 22 # 戦闘終了

全モンスターが眠り状態の場合を
逃げられる条件に追加しています。

 

 

最後に、眠り状態のモンスターは
攻撃にしないようにします。

が、ちょっと今回は以上にします。。(´・ω・`)

 

 

最後に

今回は相手に使う補助系の呪文ラリホーを追加しました。
ただ、中途半端になってしまったので
残りを次回で追加します。

まとめサイトへ

 

 

【ご注意】
プログラムやデータなどは著作権法により保護されています。
著作者の許諾を得ずに、プログラムおよびデータそのものまたは改変したものを
配布したり販売したりすることはできません。
また、これらを利用して発生した損害などに関して、著作者は一切責任を負いません。

 

 

-CODE, Python, RPG
-, , , , , , , ,

Copyright© kerublog , 2022 All Rights Reserved Powered by STINGER.