PrismatiXEngine
故事與素材

變數與條件

記錄玩家的選擇,依分數和旗標播放不同結尾。

English

這章接著修改第一個故事:記下玩家選了哪條路,最後播放不同的文字。

宣告變數

prismatix.json 加入:

{
  "gameCatalog": "Content/game.pxgame"
}

建立 Content/game.pxgame

{
  "format": "PrismatiXGame",
  "schemaRevision": 2,
  "variables": [
    {"name": "score", "type": "integer", "default": 0, "scope": "session"},
    {"name": "visitedWindow", "type": "boolean", "default": false, "scope": "session"},
    {"name": "route", "type": "string", "default": "none", "scope": "session"},
    {"name": "volumeHint", "type": "number", "default": 0.5, "scope": "session"}
  ],
  "gallery": [],
  "unlockables": []
}

已有 game catalog 時,直接把變數加進原本的 variables,保留畫廊與解鎖設定。

integer 是整數,number 可以帶小數,booleantruefalsestring 是文字。default 的型別要相符。這裡的 volumeHint 只是示範小數變數,不會改變遊戲音量。

記錄選項

stars 分支開頭加入:

[set score=1]
[set visitedWindow=true]
[set route="stars"]

story 分支開頭加入:

[set score=0]
[set visitedWindow=false]
[set route="story"]

set 一次設定一個值,也接受 [set name=score value=1]。它不計算右邊的算式,因此不能用 [set score=score+1] 加分;計算請用 Extensionctx.variables.get/set

依條件顯示結尾

finish 段落、原本結尾台詞之前,加入:

[if visitedWindow and score >= 1]
[id ending.window]
你記住了今晚第一顆星的位置。
[else]
[id ending.book]
你記住了故事開始的那一句話。
[endif]

每個 if 都要接 endifelse 可以省略。條件可以巢狀排列,用縮排會比較好讀,但仍須寫出每個 endif

這段是旁白;前面若有 @guide,先留一個空白行結束說話者設定。

條件運算式

[if (score + 2) >= 3 and not (route == "story")]
條件成立。
[endif]

[if visitedWindow || score > 2]
至少一個條件成立。
[endif]

運算優先順序由低到高是 or||and&&==!=、比較大小、加減、乘除與餘數。一元運算支援 not! 和負號;需要改變順序時加括號。

比較相等用 ==,不是 ===。字串加引號,布林運算使用布林值,算術使用數值。變數名稱允許 -,所以減法要寫成 score - 1,避免 score-1 被當成另一個變數名稱。

session 與 profile

session 保存這次劇情的狀態,例如路線、分數和暫時旗標;讀檔或回溯時會回到對應狀態。

profile 用來保存跨遊戲進度,例如已解鎖內容。分支中的暫時變數通常選 session;永久解鎖才使用 profile 或對應的 progress API。

測試分支

prismatix validate my-game
prismatix dev my-game

分別走兩條路,確認結尾文字不同。把 score 暫時改成文字值時,驗證應指出型別錯誤;使用尚未宣告的變數也要先補上宣告。

作品發行後若要改變數名稱或型別,請安排存檔遷移,並用舊版測試存檔確認能讀取。

實作參考:Story 編譯器條件解析器Game schema

On this page