CODE Python RPG

独学でPythonでRPGを作成する(第62回)構成を変える(2)

更新日:

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

前回は少しプログラムの構成を変更しました。

今回も前回の続きでプログラムの構成を変更・修正していきます。
その他、バグ修正もします。

目次

  1. message.py
  2. 作成
  3. 使用
  4. バグ修正
  5. maps.py
  6. 最後に

message.py

今回、1つ新しくファイルを作成します。

これはメッセージ枠を
作るためのファイルにします。

以下のような枠です。

 

他にもコマンドなどの枠も
こちらで作成するようにします。

 

なので、messageという名前は
適切ではありませんが、、
これでいってみます。

 

 

作成

というわけで
message.pyを作成します。

import pygame
from pygame.locals import *

# 色の定義
WHITE = (255, 255, 255)
WARNING = (255, 191, 0)
DANGER = (255, 101, 101)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
BLINK = [(224,255,255), (192,240,255), (128,224,255), (64,192,255), (128,224,255), (192,240,255)] # 選択中の戦闘コマンドなどを点滅させる


def draw_text(bg, txt, x, y, fnt, col): # 影付き文字の表示
    sur = fnt.render(txt, True, BLACK)
    bg.blit(sur, [x+1, y+2])
    sur = fnt.render(txt, True, col)
    bg.blit(sur, [x, y])

# メッセージの表示処理
def init_message(message):
    for i in range(5):
        message[i] = ""
    return message

def set_message(msg, message):
    for i in range(5):
        if message[i] == "":
            message[i] = msg
            return message
    for i in range(4): # 下が最新のメッセージ
        message[i] = message[i+1]
    message[4] = msg
    return message

文字の表示に必要な
定数や関数です。

init_message
set_message
はbattle.pyのみで
move.pyでは
使っていませんでしたが
使うようにします。

 

 

draw_frame_mes

枠を作成する関数を
作っていきます。

最初にメッセージ枠です。

引数はbgとcolです。

bgは
screen = pygame.display.set_mode((880, 720))
のscreenです。

colは枠の色です。

def draw_frame_mes(bg, col): # メッセージ枠
    x_m_i = bg.get_width()*0.1/2 # x座標の開始位置
    x_m_w = bg.get_width()*0.9 # 横幅
    y_m_i = bg.get_height()*0.6 # y座標の開始位置
    y_m_h = bg.get_height()*0.4-10 # 高さ
    x_m_i_t = x_m_i + 30 # テキストのx座標の開始位置
    y_m_i_t = y_m_i + 30 # テキストのy座標の開始位置
    pygame.draw.rect(bg, BLACK, [x_m_i, y_m_i, x_m_w, y_m_h], 0, 5) # 枠
    pygame.draw.rect(bg, col, [x_m_i, y_m_i, x_m_w, y_m_h], 2, 5) # 枠
    return x_m_i_t, y_m_i_t

 

↓の枠です。

 

return x_m_i_t, y_m_i_t
戻り値は後述します。

 

 

draw_frame_cmd

次にコマンド枠です。

引数はdraw_frame_mesと同じです。

def draw_frame_cmd(bg, col): # 移動中のコマンド枠
    x_c_i = bg.get_width()*0.05 # x座標の開始位置
    x_c_w = bg.get_width()*0.4 # 横幅
    y_c_i = bg.get_height()*0.05 # y座標の開始位置
    y_c_h = bg.get_height()*0.25 # 高さ
    x_c_i_t = x_c_i + 50 # テキストのx座標の開始位置
    y_c_i_t = y_c_i + 30 # テキストのy座標の開始位置
    pygame.draw.rect(bg, BLACK, [x_c_i, y_c_i, x_c_w, y_c_h], 0, 5) # 枠
    pygame.draw.rect(bg, col, [x_c_i, y_c_i, x_c_w, y_c_h], 2, 5) # 枠
    return x_c_w, x_c_i_t, y_c_i_t

 

↓の枠です。

 

return x_m_i_t, y_m_i_t
戻り値は後述します。

 

 

draw_frame_cmd_p(他)

続いて呪文を使うときの枠です。
3つあります。

また、引数にbgやcolの他に、
playerやsel_p_yを加えています。

キャラの人数、
キャラが使える呪文の数
によって
枠の大きさが変わる為です。

def draw_frame_cmd_p(bg, col, player): # 移動中のコマンド枠(誰が使う?)
    x_c_i = bg.get_width()*0.05 # x座標の開始位置
    x_c_w = bg.get_width()*0.4 # 横幅
    y_c_i = bg.get_height()*0.05 # y座標の開始位置
    y_c_h = 50 * (1+len(player)) + 30 # 高さ 1+は「じゅもん」 50=30(枠内の開始位置or文字間隔)+20(文字の大きさ) 30=最後の間隔
    pygame.draw.rect(bg, BLACK, [x_c_i+x_c_w/2, y_c_i, x_c_w/2, y_c_h], 0, 5) # 枠
    pygame.draw.rect(bg, col, [x_c_i+x_c_w/2, y_c_i, x_c_w/2, y_c_h], 2, 5) # 枠
    pygame.draw.line(bg, col, [x_c_i+x_c_w/2, y_c_i+65], [x_c_i+x_c_w, y_c_i+65], 2) # 線 65=30(枠内の開始位置)+20(文字の大きさ)+15(文字間隔の半分)

def draw_frame_sel_u(bg, col, player, sel_p_y): # 移動中のコマンド枠(何を使う?)
    x_c_i = bg.get_width()*0.05 # x座標の開始位置
    x_c_w = bg.get_width()*0.4 # 横幅
    y_c_i = bg.get_height()*0.05 # y座標の開始位置
    y_c_h = 50 * len(player[sel_p_y[0]].mas_move_spell) + 30 # 50=30(枠内の開始位置or文字間隔)+20(文字の大きさ) 30=最後の間隔
    pygame.draw.rect(bg, BLACK, [x_c_i+x_c_w, y_c_i, x_c_w/2, y_c_h], 0, 5) # 枠
    pygame.draw.rect(bg, col, [x_c_i+x_c_w, y_c_i, x_c_w/2, y_c_h], 2, 5) # 枠
    pygame.draw.line(bg, col, [x_c_i+x_c_w, y_c_i+65], [x_c_i+x_c_w, y_c_i+65], 2) # 線 65=30(枠内の開始位置)+20(文字の大きさ)+15(文字間隔の半分)

def draw_frame_sel_t(bg, col, player): # 移動中のコマンド枠(誰に使う?)
    x_c_i = bg.get_width()*0.05 # x座標の開始位置
    x_c_w = bg.get_width()*0.4 # 横幅
    y_c_i = bg.get_height()*0.05 # y座標の開始位置
    y_c_h = 50 * (1+len(player)) + 30 # 高さ 1+は「だれに」 50=30(枠内の開始位置or文字間隔)+20(文字の大きさ) 30=最後の間隔
    pygame.draw.rect(bg, BLACK, [x_c_i+x_c_w*1.5, y_c_i, x_c_w/2, y_c_h], 0, 5) # 枠
    pygame.draw.rect(bg, col, [x_c_i+x_c_w*1.5, y_c_i, x_c_w/2, y_c_h], 2, 5) # 枠
    pygame.draw.line(bg, col, [x_c_i+x_c_w*1.5, y_c_i+65], [x_c_i+x_c_w*2, y_c_i+65], 2) # 線 65=30(枠内の開始位置)+20(文字の大きさ)+15(文字間隔の半分)

 

↓の3つの枠です。

 

 

draw_frame_move_para

最後に各キャラの
パラメータ枠です。

こちらの引数は3つです。

def draw_frame_move_para(bg, col, player): # 移動中のパラメータ枠
    x_b = bg.get_width()*0.15 # 一人分の幅

    # x座標の開始位置 + 横幅 = 0.95にする(右端を0.05空ける)
    if len(player) == 1:
        x_p_i = bg.get_width()*0.8 # x座標の開始位置
        x_p_w = x_b # 横幅
    elif len(player) == 2:
        x_p_i = bg.get_width()*0.65 # x座標の開始位置
        x_p_w = x_b * 2 # 横幅
    elif len(player) == 3:
        x_p_i = bg.get_width()*0.5 # x座標の開始位置
        x_p_w = x_b * 3 # 横幅
    elif len(player) == 4:
        x_p_i = bg.get_width()*0.35 # x座標の開始位置
        x_p_w = x_b * 4 # 横幅
    y_p_i = bg.get_height()*0.75 # y座標の開始位置
    y_p_h = bg.get_height()*0.25-20 # 高さ
    x_p_i_t = [] # テキストのx座標の開始位置
    y_p_i_t = y_p_i + 20 # テキストのy座標の開始位置
    for i in range(len(player)):
        x_p_i_t.append(x_p_i + x_b*i + 20) # テキストのx座標の開始位置
    pygame.draw.rect(bg, BLACK, [x_p_i, y_p_i, x_p_w, y_p_h], 0, 5) # 枠
    pygame.draw.rect(bg, col, [x_p_i, y_p_i, x_p_w, y_p_h], 2, 5) # 枠
    pygame.draw.line(bg, col, [x_p_i, y_p_i+48], [x_p_i+x_p_w, y_p_i+48], 2) # 枠
    return x_p_i_t, y_p_i_t

 

↓の枠です。

 

return x_p_i_t, y_p_i_t
戻り値は後述します。
※x_p_i_tはリストです。

 

今回、作成するのは以上です。

 

 

使用

message.pyで
作成した関数を使用します。

import chara, message
(省略)

msg = [""]*5 # 移動メッセージ

battle.pyと同様に
msgにはメッセージを格納します。

 

なお、今回変更するのは
move.pyのみです。

近いうちに
battle.pyの枠も
message.pyの関数を
使用するようにしたいと
思います。

  

 

draw_frame_mes

メッセージ枠です。

変更前

def draw_message(bg, fnt, player):
    global talk_line, talk_end, talk_yesno, rest_flag
(省略)

    x_i = bg.get_width()*0.1/2 # x座標の開始位置
    x_w = bg.get_width()*0.9 # 横幅
    y_i = bg.get_height()*0.6 # y座標の開始位置
    y_h = bg.get_height()*0.4-10 # 高さ
    x_i_t = x_i + 30 # テキストのx座標の開始位置
    y_i_t = y_i + 30 # テキストのy座標の開始位置
    pygame.draw.rect(bg, BLACK, [x_i, y_i, x_w, y_h], 0, 5) # 枠
    pygame.draw.rect(bg, col, [x_i, y_i, x_w, y_h], 2, 5) # 枠

変更後

def draw_message(bg, fnt, player):
    global talk_line, talk_end, talk_yesno, rest_flag
(省略)

    x_m_i_t, y_m_i_t = message.draw_frame_mes(bg, col)

枠のところを関数に変えただけです。

あと、戻り値を「▼」などで
利用します。

def draw_message(bg, fnt, player):
(省略)

    while True:
(省略)

        elif talk_mes[talk_line] == "#page": # 会話の途中を表示している(会話の続きがある)
            if tmr%5 != 0: # 点滅
                draw_text(bg, "{}".format("▼"), x_m_i_t, y_m_i_t+30*i, fnt, col)
                i += 1
(省略)

        else:
            draw_text(bg, "{}".format(talk_mes[talk_line]), x_i_t, y_i_t+30*i, fnt, col)
            i += 1

 

draw_textは、そのうち
message.pyだけで
利用するようにしたいと
思っていますが、ひとまず
こんな感じです。

 

もう一箇所、draw_frame_mesを
利用します。

変更前はこちら(前回)です。

変更後

def draw_para(bg, fnt, player):
(省略)

        if spell_flag[3]: # 呪文発動
            # 使う:player[sel_p_y[0]]
            # 呪文:player[sel_p_y[0]].mas_move_spell[sel_p_y[1]]
            # 対象:player[sel_p_y[2]]
            if not spell_flag[4]:

                spell_target_no = chara.get_spell_target(player[sel_p_y[0]].mas_move_spell[sel_p_y[1]])
                spell_point, spell_message = player[sel_p_y[0]].use_spell(player[sel_p_y[0]].mas_move_spell[sel_p_y[1]], player[sel_p_y[2]], spell_target_no)
                msg = message.set_message(player[sel_p_y[0]].name + "は " + player[sel_p_y[0]].mas_move_spell[sel_p_y[1]] + " を となえた!", msg)
                msg = message.set_message(spell_message, msg)
                if spell_point != -1: # 回復系、-1は補助系
                    player[sel_p_y[2]].hp += spell_point
                    if player[sel_p_y[2]].hp > player[sel_p_y[2]].maxhp:
                        player[sel_p_y[2]].hp = player[sel_p_y[2]].maxhp
                spell_flag[4] = True
        
        if spell_flag[4]:
            x_m_i_t, y_m_i_t = message.draw_frame_mes(bg, col)
            for i in range(5): # 移動メッセージの表示
                draw_text(bg, f"{msg[i]}", x_m_i_t, y_m_i_t+i*40, fnt, col)

 

if spell_flag[4]:
    x_m_i_t, y_m_i_t = message.draw_frame_mes(bg, col)

枠の作成に関数を利用しています。

また、他にも少し変更しています。

msg = message.set_message(player[sel_p_y[0]].name + "は " + player[sel_p_y[0]].mas_move_spell[sel_p_y[1]] + " を となえた!", msg)
msg = message.set_message(spell_message, msg)

前回の最後に変数spell_messageを
グローバル変数にする必要があると
記載しましたが、
set_message関数を利用して
msgに格納するようにします。

for i in range(5): # 移動メッセージの表示
    draw_text(bg, f"{msg[i]}", x_m_i_t, y_m_i_t+i*40, fnt, col)

で、メッセージを表示します。

 

あと、
"MPがたりない!"
が抜けていますが後述します。

 

draw_frame_mesは以上です。

 

 

draw_frame_cmd

コマンド枠です。

変更前

def draw_para(bg, fnt, player):
    global cmd_flag, spell_flag, sel_p_y
(省略)

    x_c_i = bg.get_width()*0.05 # x座標の開始位置
    x_c_w = bg.get_width()*0.4 # 横幅
    y_c_i = bg.get_height()*0.05 # y座標の開始位置
    y_c_h = bg.get_height()*0.25 # 高さ
    x_c_i_t = x_c_i + 50 # テキストのx座標の開始位置
    y_c_i_t = y_c_i + 30 # テキストのy座標の開始位置
    pygame.draw.rect(bg, BLACK, [x_c_i, y_c_i, x_c_w, y_c_h], 0, 5) # 枠
    pygame.draw.rect(bg, col, [x_c_i, y_c_i, x_c_w, y_c_h], 2, 5) # 枠

変更後

def draw_para(bg, fnt, player):
    global msg # 追加
    global cmd_flag, spell_flag, sel_p_y
(省略)

    x_c_w, x_c_i_t, y_c_i_t = message.draw_frame_cmd(bg, col)

 

draw_frame_mesと同様に
枠作成に関数を利用したのみです。

for i in range(3):
    for j in range(2):
        draw_text(bg, COMMAND[i][j], x_c_i_t+j*x_c_w/2, y_c_i_t+i*50, fnt, col)

戻り値は「はなす」などのコマンドや
「▶」などを表示するのに利用します。

 

draw_frame_cmdは以上です。

 

 

draw_frame_cmd_p(他)

呪文を使うときの枠です。

3つあります。
draw_frame_cmd_p
draw_frame_sel_u
draw_frame_sel_t

ここも枠作成を関数したのみなので
変更後のみ記載します。

def draw_para(bg, fnt, player):
(省略)

    x_c_w, x_c_i_t, y_c_i_t = message.draw_frame_cmd(bg, col)
    for i in range(3):
        for j in range(2):
            draw_text(bg, COMMAND[i][j], x_c_i_t+j*x_c_w/2, y_c_i_t+i*50, fnt, col)
    if tmr%5 != 0:
        draw_text(bg, "▶︎", x_c_i_t-50+cmd_x*x_c_w/2, y_c_i_t+cmd_y*50, fnt, col)
    if spell_flag[0]: # コマンドで「じゅもん」が選択された
        message.draw_frame_cmd_p(bg, col, player)
        draw_text(bg, COMMAND[cmd_y][cmd_x], x_c_i_t+cmd_x*x_c_w/2, y_c_i_t+cmd_y*50, fnt, col) # cmd_x=1,cmd_y=0
        for i, p in enumerate(player):
            draw_text(bg, p.name, x_c_i_t+cmd_x*x_c_w/2, y_c_i_t+(i+1)*50, fnt, col) # i=0は「じゅもん」
        if spell_flag[1]: # 使用者が選択された(選択されたプレイヤーの添字:sel_p_y[0])
            if len(player[sel_p_y[0]].mas_move_spell) == 0: # 移動中の呪文を覚えていないなら
                if not spell_flag[4]:
                    msg = message.set_message(player[sel_p_y[0]].name + "は 移動中の呪文を覚えていない", msg)
                    spell_flag[4] = True
            else: # 呪文の選択画面
                message.draw_frame_sel_u(bg, col, player, sel_p_y)
                for i, s in enumerate(player[sel_p_y[0]].mas_move_spell):
                    draw_text(bg, s, x_c_i_t+cmd_x*x_c_w, y_c_i_t+i*50, fnt, col)
                if spell_flag[2]: # 呪文が選択された(選択された呪文の添字:sel_p_y[1]) 対象の選択
                    if player[sel_p_y[0]].check_mp(player[sel_p_y[0]].mas_move_spell[sel_p_y[1]]): # mpが足りていたら
                        message.draw_frame_sel_t(bg, col, player)
                        draw_text(bg, "だれに", x_c_i_t+x_c_w*1.5, y_c_i_t, fnt, col)
                        for i, p in enumerate(player):
                            draw_text(bg, p.name, x_c_i_t+x_c_w*1.5, y_c_i_t+(i+1)*50, fnt, col) # i=0は「だれに」

                        if tmr%5 != 0:
                            draw_text(bg, "▶︎", x_c_i_t-50+x_c_w*1.5, y_c_i_t+(sel_p_y[2]+1)*50, fnt, col) # 呪文選択中は呪文の左に▶︎を点滅(+1はだれに)
                        draw_text(bg, "▶︎", x_c_i_t-50+x_c_w, y_c_i_t+(sel_p_y[1])*50, fnt, col) # 呪文を選択した後は常に呪文の左に▶︎
                    else:
                        if not spell_flag[4]:
                            msg = message.set_message("MPがたりない!", msg)
                            spell_flag[4] = True
                else:
                    if tmr%5 != 0:
                        draw_text(bg, "▶︎", x_c_i_t-50+x_c_w, y_c_i_t+(sel_p_y[1])*50, fnt, col) # 呪文選択中は呪文の左に▶︎を点滅
            draw_text(bg, "▶︎", x_c_i_t-50+x_c_w/2, y_c_i_t+(sel_p_y[0]+1)*50, fnt, col) # 呪文使用者を選択した後は常に名前の左に▶︎
        else:
            if tmr%5 != 0:
                draw_text(bg, "▶︎", x_c_i_t-50+x_c_w/2, y_c_i_t+(sel_p_y[0]+1)*50, fnt, col) # 呪文使用者を選択中は名前の左に▶︎を点滅(+1はじゅもん)

 

枠作成とは違うところで
いくつか修正していますが
後述します。

 

 

draw_frame_move_para

キャラのパラメータ枠です。

ここも枠作成を関数にしたのみなので
変更後のみ記載します。

def draw_para(bg, fnt, player):
(省略)

    else: # いずれのコマンドも選択されていない時はステータスを表示
        x_p_i_t, y_p_i_t = message.draw_frame_move_para(bg, col, player)
        for i, p in enumerate(player):
            # x_p_i_t.append(x_p_i + x_b*i + 20) # テキストのx座標の開始位置 ←削除
            draw_text(bg, "{}".format(p.name), x_p_i_t[i], y_p_i_t, fnt, col)
            if len(str(p.hp)) == 3:
                draw_text(bg, mojimoji.han_to_zen("H{}".format(p.hp)), x_p_i_t[i], y_p_i_t+36, fnt, col)
            elif len(str(p.hp)) == 2:
                draw_text(bg, mojimoji.han_to_zen("H {}".format(p.hp)), x_p_i_t[i], y_p_i_t+36, fnt, col)
            elif len(str(p.hp)) == 1:
                draw_text(bg, mojimoji.han_to_zen("H  {}".format(p.hp)), x_p_i_t[i], y_p_i_t+36, fnt, col)

            if len(str(p.mp)) == 3:
                draw_text(bg, mojimoji.han_to_zen("M{}".format(p.mp)), x_p_i_t[i], y_p_i_t+66, fnt, col)
            elif len(str(p.mp)) == 2:
                draw_text(bg, mojimoji.han_to_zen("M {}".format(p.mp)), x_p_i_t[i], y_p_i_t+66, fnt, col)
            elif len(str(p.mp)) == 1:
                draw_text(bg, mojimoji.han_to_zen("M  {}".format(p.mp)), x_p_i_t[i], y_p_i_t+66, fnt, col)
            
            if len(str(p.lv)) == 2:
                draw_text(bg, mojimoji.han_to_zen("L:{}".format(p.lv)), x_p_i_t[i], y_p_i_t+96, fnt, col)
            elif len(str(p.lv)) == 1:
                draw_text(bg, mojimoji.han_to_zen("L: {}".format(p.lv)), x_p_i_t[i], y_p_i_t+96, fnt, col)

ここは他は変更していません。

 

 

バグ修正

draw_frame_cmd_pなどの修正のところで
枠作成とは違うところを
いくつか修正しました。

・呪文を覚えていないキャラ選択時
・MPが足りない呪文選択時
について修正しています。

 

呪文を覚えていないキャラを
選択すると
無限ループしていたので
修正しています。

if len(player[sel_p_y[0]].mas_move_spell) == 0: # 移動中の呪文を覚えていないなら
    if not spell_flag[4]:
        msg = message.set_message(player[sel_p_y[0]].name + "は 移動中の呪文を覚えていない", msg)
        spell_flag[4] = True

if not spell_flag[4]:
の条件を追加しています。
※spell_flag[4]は前回追加しました。
※これがTrueの時に
 「a」や「b」を押下すると
 メッセージ枠を閉じます。

呪文を覚えていないときは
spell_flag[4]をTrueにして
メッセージ枠を閉じられるように
しました。

 

もう一箇所、
"MPがたりない!"
です。

今までのように呪文を使ってから
MPの有無を判定すると
対象を選択した後に
表示されることになります。

これを呪文を選択した時に
判定するように変更します。

 

対象を選んだ後ではなく

呪文を選択した時に
MPの有無を判定する。

 

まず、chara.pyの
check_mpと
use_spellを
少し変更します。

変更前

class Chara():
(省略)

    def check_mp(self, str_spell):
        if self.mp < spell_usemp_dict[str_spell]:
            return False
        else:
            self.mp -= spell_usemp_dict[str_spell] # 消費mp
            return True

変更後

class Chara():
(省略)

    def check_mp(self, str_spell):
        if self.mp < spell_usemp_dict[str_spell]:
            return False
        else:
            return True
    def use_spell(self, str_spell, target, spell_target_no): # デフォルト値を取らない引数がデフォルト値を取る引数の後になっているとエラーになる
        self.mp -= spell_usemp_dict[str_spell] # 消費mp
self.mp -= spell_usemp_dict[str_spell] # 消費mp

をcheck_mpではなく
use_spellにしました。
check_mpはmpの有無を確認するのみ
 実際に呪文を使うuse_spellで
 mpを消費するようにしました。

 

else:
    if not spell_flag[4]:
        msg = message.set_message("MPがたりない!", msg)
        spell_flag[4] = True

if spell_flag[2]:
のところで、check_mpで
mpの有無のみを確認して
mpが足りなければ、
spell_flag[4]をTrueにして
メッセージ枠を閉じられるように
しました。

 

 

maps.py

maps.pyも少し変更しました。

変更前

class Maps():
    def get_map(self, num, player):

変更後

def get_map(self, num, player):

クラスを辞めました。

 

これに伴い
one_hour_dungeon.py
も少し変更しました。

# maps = maps.Maps() # 削除

def main():
(省略)

        elif idx == 2: # マップと人々の設定
            n_map = maps.get_map(area, player)

クラスではないので
maps = maps.Maps()
を削除しました。

mapsの名前は同じなので
n_map = maps.get_map(area, player)
に変更はありません。

 

 

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

 

 

最後に

今回も機能はあまり変わりませんが
構成を少し変えました。

他の枠や、battle.pyの枠も
そのうちmessage.pyで作成するにしたいと思います。

次回はまた何かを修正したいと思います。

まとめサイトへ

 

 

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

 

 

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

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