RPGにおけるスクリプト2

この前のスクリプトは、

  • 条件分岐がない
  • ラベルがない

ということで、ゲームを作るのに、
使えないスクリプトであることが判明しました…!(´∀`;
 
というのは例えば、

階段を降りますか?
 Yes→降りる
 No→降りない

ということもできません(´Д`;
 
ということで、こんなスクリプトに改造してみました。

<?xml version="1.0" encoding="UTF-8" ?>

<root>
	<!-- 宝箱スクリプト -->
	<event id="1">
		<flag nif="1" />
		<matter label="init">
			<msg yes="main" no="finish">
				たからばこがあります。あけますか?
			</msg>
		</matter>
		<matter label="main">
			<msg def="finish">
				%value%えんをゲット!
			</msg>
			<value type="money">500</value>
			<flag on="1" />
		</matter>
	</event>
	<!-- シーン遷移スクリプト -->
	<event id="1000">
		<matter label="init">
			<msg yes="main" no="finish">
				フィールドにいどうしますか。
			</msg>
		</matter>
		<matter label="main">
			<msg def="finish" />
			<!-- シーンID=1の(6,6)に移動 -->
			<value type="scene">1,6,6</value>
		</matter>
	</event>
</root>

改造したところは、

  • matterの属性をラベルに変更
  • msgの属性に条件分岐を行う、yes,no属性を追加。条件分岐しない場合はdef属性を設定
  • yes,no属性の値にはラベルを指定する
  • ベントラベルはvalueの値を返す

という感じです。
 
流れとしては、

  1. idを指定して、イベント呼び出し
  2. 直下のflagタグを見て、発生条件をチェック
  3. 発生するのであれば、matterのlabel属性が"init"であるものを実行
  4. 画面からキー入力があった場合、msgのyes,no,def属性を見て、ラベルジャンプを繰り返す
  5. ラベルジャンプが"finish"になったら、イベント処理終了

です。
 
 
まあ、だんだんゲーム作っているのか、スクリプト作っているのか、
分からなくなってきましたが…(´Д`;
 
これをPythonで読み込む場合はこんなソースです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from xml.dom.minidom import parse, parseString

class XMLLoader:
	def __init__(self):
		self.map = {}
		self.rootTag = ""
	def initialize(self):
		self.map = {}
		self.rootTag = ""
	def load(self, filepath, rootTag):
		self.rootTag = rootTag
		dom = parse(filepath) # parse an XML file by name
		self.parse(dom, None, None, None)
		dom.unlink()
	def parse(self, dom, map, key, childMap):
		for node in dom.childNodes:
			if(node.nodeType == node.ELEMENT_NODE):
				# ELEMENT
				if(key != node.tagName):
					childMap = None
				key = node.tagName
				# ATTRIBUTE
				if(key == self.rootTag):
					# ルートタグ
					tmpMap = {}
					self.map[node.getAttribute("id")] = self.parse(node, tmpMap, key, None)
				elif(key == "matter"):
					tmpMap = {}
					map[node.getAttribute("label")] = self.parse(node, tmpMap, key, None)
				elif(key == "flag"):
					tmpMap = {}
					if node.hasAttribute("if"):
						tmpMap["if"] = node.getAttribute("if")
					if node.hasAttribute("nif"):
						tmpMap["nif"] = node.getAttribute("nif")
					if node.hasAttribute("on"):
						tmpMap["on"] = node.getAttribute("on")
					if node.hasAttribute("off"):
						tmpMap["off"] = node.getAttribute("off")
					map["flag"] = tmpMap
				elif(key == "msg"):
					tmpMap = {}
					if node.hasAttribute("yes"):
						tmpMap["yes"] = node.getAttribute("yes")
					if node.hasAttribute("no"):
						tmpMap["no"] = node.getAttribute("no")
					if node.hasAttribute("def"):
						# デフォルト
						tmpMap["def"] = node.getAttribute("def")
					map["msg"] = self.parse(node, tmpMap, "text", None)
				elif(key == "value"):
					tmpMap = {}
					if node.hasAttribute("type"):
						tmpMap["type"] = node.getAttribute("type")
					map["value"] = self.parse(node, tmpMap, "text", None)
				elif(key == "scene"):
					map["scene"] = {
						"id": node.getAttribute("id"),
						"posx": node.getAttribute("posx"),
						"posy": node.getAttribute("posy")
					}
				else:
					self.parse(node, map, "text", None)
			elif(node.nodeType == node.TEXT_NODE):
				# TEXT
				txt = node.data.strip()
				if(txt != ""):
					map[key] = txt
		return map

def main():
	xl = XMLLoader()
	xl.load("event.xml", "event")
	print xl.map

if __name__ == "__main__":
	main()