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の値を返す
という感じです。
流れとしては、
- idを指定して、イベント呼び出し
- 直下のflagタグを見て、発生条件をチェック
- 発生するのであれば、matterのlabel属性が"init"であるものを実行
- 画面からキー入力があった場合、msgのyes,no,def属性を見て、ラベルジャンプを繰り返す
- ラベルジャンプが"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()