diff --git a/quests/exceptions.yml b/quests/exceptions.yml index 6ffe5f5..1cabbca 100644 --- a/quests/exceptions.yml +++ b/quests/exceptions.yml @@ -1,6 +1,142 @@ exceptions: - condition: command: - - '`' - hints: - - '!! 不需要輸入上下引號 !!' + - '[\uff21-\uff3a\uff41-\uff5a]' + responses: + - type: narrative + content: + - '!! 請使用半形英文字母 !!' + + - condition: + command: + - ' ' + responses: + - type: narrative + content: + - '!! 請使用半形空格 !!' + + - condition: + or: + - command: + - '`' + - command: + - \' + responses: + - type: narrative + content: + - '!! 不需要輸入上下引號 !!' + + - condition: + command: + - ^echo\S$ + responses: + - type: narrative + content: + - '!! `echo` 後面要加空格 !!' + + - condition: + command: + - ^cd\S$ + responses: + - type: narrative + content: + - '!! `cd` 後面要加空格 !!' + + - condition: + command: + - ^ls\S$ + responses: + - type: narrative + content: + - '!! `ls` 後面要加空格 !!' + + - condition: + command: + - ^cat\S$ + responses: + - type: narrative + content: + - '!! `cat` 後面要加空格 !!' + + - condition: + command: + - ^touch\S$ + responses: + - type: narrative + content: + - '!! `touch` 後面要加空格 !!' + + - condition: + not: + command: + - ^rmdir$ + command: + - ^rm\S$ + responses: + - type: narrative + content: + - '!! `rm` 後面要加空格 !!' + + - condition: + command: + - ^mv\S$ + responses: + - type: narrative + content: + - '!! `mv` 後面要加空格 !!' + + - condition: + command: + - ^mkdir\S$ + responses: + - type: narrative + content: + - '!! `mkdir` 後面要加空格 !!' + + - condition: + command: + - ^rmdir\S$ + responses: + - type: narrative + content: + - '!! `rmdir` 後面要加空格 !!' + + - condition: + command: + - ^cp\S$ + responses: + - type: narrative + content: + - '!! `cp` 後面要加空格 !!' + + - condition: + command: + - ^[Ii1]s$ + responses: + - type: narrative + content: + - '!! `ls` 的首字母是小寫的 `L` !!' + + - condition: + command: + - 嗨 + responses: + - type: narrative + content: + - '嗨~' + + - condition: + command: + - folderl + responses: + - type: narrative + content: + - '`folder1` 的 `1` 是數字 `1`,不是小寫的 `L` !!' + + - condition: + command: + - filel + responses: + - type: narrative + content: + - '`file1` 的 `1` 是數字 `1`,不是小寫的 `L` !!' diff --git a/quests/explore/game.yml b/quests/explore/game.yml index 5aa292e..cc65698 100644 --- a/quests/explore/game.yml +++ b/quests/explore/game.yml @@ -42,13 +42,6 @@ stages: content: - 請先回到 `/home/commander/` 資料夾 - 輸入 `cd ~` 來返回 `/home/commander/` 資料夾 - - condition: - command: - - ^[Ii]s$ - responses: - - type: narrative - content: - - '!! `ls` 的首字母是小寫的 `L`,不是 `I` !!' responses: - content: - 你應該能看到資料夾中的內容了。 diff --git a/quests/get-started/game.yml b/quests/get-started/game.yml index 9fd00fb..ba3e277 100644 --- a/quests/get-started/game.yml +++ b/quests/get-started/game.yml @@ -7,6 +7,7 @@ instruction: | 在畫面的中間可以看到終端機和提示兩個區塊。 請你在終端機中的 `commander:~ $` 後面輸入 `echo start` 並按下 Enter 來開始教程。 + !! 注意:不需要輸入上下引號 !! stages: - id: start @@ -65,6 +66,7 @@ stages: hints: - ➤ 按下 `Ctrl + C` 能夠中斷指令 - ➤ 劇情進行時可以按下 `Enter` 來快速跳過 + - ➤ 輸入 `echo finish` 來結束這一關 - id: END task: 結束關卡 diff --git a/quests/helloworld/game.yml b/quests/helloworld/game.yml index 05e382a..259dac5 100644 --- a/quests/helloworld/game.yml +++ b/quests/helloworld/game.yml @@ -12,9 +12,9 @@ stages: task: 輸入 `echo help` 來朗誦咒語 condition: pwd: - - '^/home/commander$' + - ^/home/commander$ command: - - echo [Hh]elp + - ^echo [Hh]elp$ responses: - type: narrative content: @@ -39,9 +39,9 @@ stages: - help condition: pwd: - - '^/home/commander$' + - ^/home/commander$ command: - - ls + - ^ls$ responses: - type: narrative content: @@ -65,9 +65,9 @@ stages: - find-scroll condition: pwd: - - '^/home/commander$' + - ^/home/commander$ command: - - cat forgotten_scroll.txt + - ^cat forgotten_scroll.txt$ responses: - type: dialogue speaker: Unix 精靈 @@ -83,9 +83,9 @@ stages: - read-forgotten-scroll condition: pwd: - - '^/home/commander$' + - ^/home/commander$ command: - - echo [Hh]ello\s*[Ww]orld + - ^echo [Hh]ello\s*[Ww]orld$ responses: - type: narrative content: diff --git a/quests/path/game.yml b/quests/path/game.yml index dca6f75..69c312b 100644 --- a/quests/path/game.yml +++ b/quests/path/game.yml @@ -64,13 +64,12 @@ stages: - ^/home/commander/folder2$ exceptions: - condition: - not: - pwd: - - ^/home/commander/folder1$ + pwd: + - ^/home/commander$ responses: - type: narrative content: - - 請先回到 `folder1` 資料夾,並用指定的方式進入 `folder2` 資料夾。 + - 輸入 `cd folder2` 來進入 `folder2` 資料夾 responses: - content: - 你成功的用相對路徑進入了 `folder2` 資料夾。 diff --git a/server/src/game/commandHandler.js b/server/src/game/commandHandler.js index 4b271ff..e7c5b66 100644 --- a/server/src/game/commandHandler.js +++ b/server/src/game/commandHandler.js @@ -122,7 +122,7 @@ export default class CommandHandler extends SessionHandler { async run() { try { this.quest = await Quest.findById(this.session.quest) - const stages = this.getUnlockedComponents(this.quest.stages) + const stages = this.getStages() if (stages.length === 0) { logger.warn('stage not found', { session: this.session.id }) return {} diff --git a/server/src/game/sessionHandler.js b/server/src/game/sessionHandler.js index a9b89f0..e3e4af0 100644 --- a/server/src/game/sessionHandler.js +++ b/server/src/game/sessionHandler.js @@ -25,8 +25,13 @@ export default class SessionHandler { ) } + getStages() { + const unlockedStages = this.getUnlockedComponents(this.quest.stages) + return unlockedStages.filter((s) => !this.isCompleted(s)) + } + getNewTasks() { - const stages = this.getUnlockedComponents(this.quest.stages) + const stages = this.getStages() return stages .filter((s) => s.task) .filter((s) => !this.session.tasks.some((t) => t.id === s.id))