💨

RPGコモンイベントのindentとは

2024/05/17に公開

indentは、RPGツクールMVのイベントコマンドにおいて、イベントコマンドのネスト(入れ子)構造を示すために使用されます。特に、条件分岐やループなど、複数のコマンドがネストされる状況で重要です。

indentの役割

indentは、イベントコマンドがどのレベルのネストにあるかを示します。ネストレベルは、0から始まり、ネストされるごとに1ずつ増加します。これにより、RPGツクールMVはイベントコマンドの階層構造を理解し、適切に処理できます。

例えば、条件分岐 (IfCommand) の場合、true_branchfalse_branch に含まれるコマンドの indent は、IfCommand 自身の indent よりも1つ高くなります。

以下に、条件分岐を含むイベントの例を示します。

イベントの定義

class IfCommand(EventCommand):
    def __init__(self, condition, true_branch=None, false_branch=None):
        parameters = [condition]
        super().__init__(111, parameters)
        self.true_branch = true_branch if true_branch else []
        self.false_branch = false_branch if false_branch else []

    def add_true_command(self, command):
        command.indent = self.indent + 1
        self.true_branch.append(command)

    def add_false_command(self, command):
        command.indent = self.indent + 1
        self.false_branch.append(command)

    def to_dict(self):
        true_branch_dicts = [cmd.to_dict() for cmd in self.true_branch]
        false_branch_dicts = [cmd.to_dict() for cmd in self.false_branch]

        return {
            "code": self.code,
            "parameters": self.parameters,
            "indent": self.indent,
            "true_branch": true_branch_dicts,
            "false_branch": false_branch_dicts
        }

class CommonEvent:
    def __init__(self, event_id, name, trigger=0, switch_id=0):
        self.id = event_id
        self.name = name
        self.trigger = trigger
        self.switch_id = switch_id
        self.list = []

    def add_command(self, command):
        self.list.append(command)

    def to_dict(self):
        event_list = []
        for cmd in self.list:
            event_list.append(cmd.to_dict())
            if isinstance(cmd, IfCommand):
                event_list.extend(cmd.true_branch)
                if cmd.false_branch:
                    event_list.append({"code": 411, "indent": cmd.indent + 1})
                    event_list.extend(cmd.false_branch)
                event_list.append({"code": 412, "indent": cmd.indent + 1})
        return {
            "id": self.id,
            "name": self.name,
            "trigger": self.trigger,
            "switchId": self.switch_id,
            "list": event_list
        }

class CommonEvents:
    def __init__(self):
        self.events = []

    def add_event(self, event):
        self.events.append(event)

    def to_json(self, file_path):
        data = [event.to_dict() for event in self.events]
        with open(file_path, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=2)

if __name__ == "__main__":
    common_events = CommonEvents()

    # イベント1を作成
    event1 = CommonEvent(1, "Morning Assembly")
    event1.add_command(ShowText("Teacher", "Good morning, students! Today we have a special announcement."))
    event1.add_command(Wait(60))
    
    # 条件分岐の追加
    if_command = IfCommand("Variable 1 == 1")
    if_command.add_true_command(ShowText("Teacher", "Let's begin the class."))
    if_command.add_false_command(ShowText("Teacher", "Please take your seats."))
    
    event1.add_command(if_command)
    common_events.add_event(event1)

    # イベント2を作成
    event2 = CommonEvent(2, "Lunch Break")
    event2.add_command(ShowText("Friend", "Let's go to the cafeteria together!"))
    common_events.add_event(event2)

    # 他のイベントを追加...

    # jsonファイルを生成
    common_events.to_json("common_events.json")

出力されるjson

このコードを実行すると、以下のようなjsonファイルが生成されます。

[
  {
    "id": 1,
    "name": "Morning Assembly",
    "trigger": 0,
    "switchId": 0,
    "list": [
      {
        "code": 101,
        "parameters": ["Teacher", 0, 0, 2, "Good morning, students! Today we have a special announcement."],
        "indent": 0
      },
      {
        "code": 230,
        "parameters": [60],
        "indent": 0
      },
      {
        "code": 111,
        "parameters": ["Variable 1 == 1"],
        "indent": 0,
        "true_branch": [
          {
            "code": 101,
            "parameters": ["Teacher", 0, 0, 2, "Let's begin the class."],
            "indent": 1
          }
        ],
        "false_branch": [
          {
            "code": 101,
            "parameters": ["Teacher", 0, 0, 2, "Please take your seats."],
            "indent": 1
          }
        ]
      },
      {
        "code": 411,
        "indent": 1
      },
      {
        "code": 412,
        "indent": 1
      }
    ]
  },
  {
    "id": 2,
    "name": "Lunch Break",
    "trigger": 0,
    "switchId": 0,
    "list": [
      {
        "code": 101,
        "parameters": ["Friend", 0, 0, 2, "Let's go to the cafeteria together!"],
        "indent": 0
      }
    ]
  }
]

このjsonファイルは、RPGツクールMVで直接使用できる形式になっています。indentを使うことで、コマンドのネスト構造が正しく反映されています。

Discussion