CODE Python RPG

独学でPythonでRPGを作成する(第48回)宿屋に泊まる

投稿日:

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

前回は町の人々の質問に対して「はい」「いいえ」を返すようにしました。

今回は宿屋に泊まります。(HPMPを全快にする)

目次

  1. 人物シート
  2. charaの変更
  3. moveの変更
  4. 演出
  5. 最後に

人物シート

宿屋に泊まるようにします。
※宿屋に泊まると言っても
 HPMPを全快にするだけです(^_^;)

スプレッドシートの人物シートで
言葉を以下の赤枠のようにします。

変更後

*「ようこそ 旅の宿に。
*「ひと晩 10ゴールドですが
  お泊まりに なりますか?
#yesno
#yesrest
*「それでは ごゆっくり
  おやすみください。
#page
*「おはようございます。
  では いってらっしゃいませ。
#no
*「さようなら 旅の人。
  お気をつけて 旅を
  つづけられますように。
#end

 

変更前

*「ようこそ 旅の宿に。
*「ひと晩 10ゴールドですが
  お泊まりに なりますか?
#yesno
#yes
*「それでは ごゆっくり
  おやすみください。
#no
*「さようなら 旅の人。
  お気をつけて 旅を
  つづけられますように。
#end

※会話の内容はこちら
 参考にさせて頂きました。

 

「#yesrest」を追加しました。

#yesrest:「はい」を選択した時に
     宿屋に泊まる
として使います。

※「はい」選択する時
 「#yes」か「#yesrest」の
 どちらかが言葉に
 出てくるようにします。

「#yesrest」は
画面に表示させません。

 

人物シートは以上です。

 

 

charaの変更

chara.pyを変更します。

class Brave(Chara):
(省略)

    def rest(self): # 寝た時
        self.hp = self.maxhp
        self.mp = self.maxmp

HPMPをMAXにするメソッドを
追加しました。

宿屋に泊まった時は
このメソッドを呼び出します。

 

あと、宿屋と関係ないですが
resetメソッドから
self.invalid_sukara()
self.invalid_rukani()
を削除しました。

呪文効果を消す時は
spell_resetメソッドを
使います。

class Chara():
(省略)

    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() # ラリホー、ラリホーマの効果を消す

class Brave(Chara):
(省略)

    def reset(self):
        self.maxhp = int(chara1_maxhp[1])
        self.hp = self.maxhp
        self.mp = self.maxmp
        # self.invalid_sukara() # 削除
        # self.invalid_rukani() # 削除

resetメソッドは
ゲームオーバーの時に
呼び出します。

この時に
spell_resetメソッドも
同時に呼び出します。
spell_resetは
 戦闘終了時にも
 呼び出します。

 

charaの変更は以上です。

 

 

moveの変更

move.pyを変更します。

まずグローバル変数を追加します。

talk_flag = False # 会話中か(会話中は動かない)
talk_end = False # 会話の最後か(aを押したら会話が終わりか)
talk_mes = [] # 会話の内容
talk_line = 0 # セリフの行数(talk_mesの何行目か)
talk_start = 0 # セリフを表示する最初の行数(会話の途中の場合は会話の途中の行数)
talk_yesno = False # yesnoクエスチョン中か
talk_yesno_i = 0 # yesnoクエスチョンの位置 0:はい、1:いいえ
rest_flag = False # 寝る選択をしたかどうか
rest_flag = False # 寝る選択をしたかどうか

を追加しています。

宿屋に泊まる選択をした時に
「rest_flag」をTrueにします。

 

宿屋に泊まる選択をした時、
会話に「"#yesrest"」が
出てきます。

この時に
「rest_flag」をTrueにします。

def move_player(key, player, people):
(省略)

    else: # 会話中
        if key[K_a] == 1:
            if talk_end: # 会話の最後でaを押したら会話終了(会話情報をリセット)
                talk_end = False
                talk_mes = []
                talk_flag = False
                talk_start = 0
                # talk_yesno_i = 0 # yesnoの▶︎をはいの位置に戻す
                talk_yesno = False
            else: # 会話の途中でaを押したら続きの会話を表示する
                talk_start = talk_line + 1 # #pageの次の行から表示する
        if talk_yesno: # yesnoクエスチョン中
            if key[K_UP] == 1:
                talk_yesno_i = 0
            elif key[K_DOWN] == 1:
                talk_yesno_i = 1
            elif key[K_a] == 1:
                talk_start = talk_line
                if talk_yesno_i == 0:
                    while True:
                        talk_start += 1
                        if talk_mes[talk_start] == "#yes":
                            talk_start += 1
                            break

                        #####追加#####
                        elif talk_mes[talk_start] == "#yesrest":
                            rest_flag = True
                            player.rest()
                            talk_start += 1
                            break
                        #####追加#####

                elif talk_yesno_i == 1:
                    while True:
                        talk_start += 1
                        if talk_mes[talk_start] == "#no":
                            talk_start += 1
                            break
                talk_yesno_i = 0 # ▶︎をはいの位置に戻す(複数回、回答する時用)
                talk_yesno = False
elif talk_mes[talk_start] == "#yesrest":
    rest_flag = True
    player.rest()
    talk_start += 1
    break

を追加しています。

restメソッドを
呼び出してHPMPを
全快にします。

先程も記載しましたが
「はい」を選択したら
「#yes」か「#yesrest」の
どちらかが言葉に出てきます。

宿屋に泊まる時は
「#yesrest」が出てきます。

 

talk_yesno_i = 0 # ▶︎をはいの位置に戻す(複数回、回答する時用)
talk_yesno = False

最後に「talk_yesno_i = 0」を
追加しました。

一回の会話で複数回の
「はい」「いいえ」が
出てくる時に、
最初に「いいえ」を
選択すると2回目の時に
「▶︎」の位置が
「いいえ」で表示されるからです。

 

ひとまず宿屋に泊まることが
出来るようになりました。

 

 

演出

宿屋に泊まった時に
画面に少し演出を加えます。

具体的には階段に移動した時の
画面の切り替えをそのまま利用します。

move.py

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

    while True:
(省略)

        if idx == 1:
            idx = move_player(key, player, people)
            draw_map(screen, fontS, player, people)
            if rest_flag: # 追加
                idx = 2 # 追加
                tmr = 0 # 追加
        elif idx == 2: # 画面切り替え(階段)
            draw_map(screen, fontS, player, people)
            if 1 <= tmr and tmr <= 5:
                h = 80*tmr
                pygame.draw.rect(screen, BLACK, [0, 0, 880, h]) # 上側を閉じていく
                pygame.draw.rect(screen, BLACK, [0, 720-h, 880, h]) # 下側を閉じていく
            if tmr == 5:
                if rest_flag: # 休んでいる時なら会話を進める
                    talk_start = talk_line + 1
            if 6 <= tmr and tmr <= 9:
                h = 80*(10-tmr)
                pygame.draw.rect(screen, BLACK, [0, 0, 880, h]) # 上側を開いていく
                pygame.draw.rect(screen, BLACK, [0, 720-h, 880, h]) # 下側を開いていく
            if tmr == 10:
                rest_flag = False
                idx = 1
                tmr = 0 # 一応
if idx == 1:
    idx = move_player(key, player, people)
    draw_map(screen, fontS, player, people)
    if rest_flag: # 追加
        idx = 2 # 追加
        tmr = 0 # 追加

「rest_flag」がTrueの時
(宿屋に泊まった時)
idxを2にします。

idxの2はほぼそのまま利用しますが
以下を変えています。

if tmr == 5:
    if rest_flag: # 休んでいる時なら会話を進める
        talk_start = talk_line + 1

言葉を1行進めます。

抜粋

*「それでは ごゆっくり
  おやすみください。
#page
*「おはようございます。
  では いってらっしゃいませ。

画面が切り替わった後は
「おはようございます〜」
が表示されるようにします。

※「#page」があるので
 本来はaキーを
 押下する必要がありますが
 ここでは何も押さなくても
 次の言葉に移るようにします。

「#page」がないと
 「はい」を選択したら
 「おはようございます〜」まで
 一気に表示されてしまいます。

if tmr == 10:
    rest_flag = False
    idx = 1
    tmr = 0 # 一応

最後に元に戻します。

 

以下のようになります。

 

 

という感じで、今回は以上です!(`・ω・´)

 

 

最後に

今回は宿屋に泊まるようにしました。

次回は移動中のコマンドやパラメータを表示するようにします。

まとめサイトへ

 

 

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

 

 

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

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