《旅行青蛙》的程式碼揭祕,攻略,體驗
看到很多人對物品的使用上的很多猜測,很多都不是很準確。
為了理解你們的呱究竟在幹什麼,逆向遊戲程式邏輯,提取各種資料。
這裡相當於動用了 上帝視角 來解答這些問題。
- 呱真的在旅行麼?
- 呱是如何選擇旅行路徑的?
- 呱是如何旅行的?
- 呱在每條路上的耗時是怎麼計算的?
- 呱離家出走了怎麼辦?
- 道路有哪些屬性?
- 每件物品都有什麼效果?
- 如何科學使用物品?
- 旅途中會帶回哪些明信片?
- 旅途中會帶回哪些特產?
- 朋友什麼時候會來訪?
- 朋友來訪應該投喂什麼?
- 三葉草多久會長好?
- 四葉草獲得的概率是?
- 抽獎球的概率是?
- 如何獲得成就?
- 有沒有免費獲得三葉草的方法?
呱真的在旅行麼?
不得不佩服遊戲的設計者,為了追求真實,實現了一套非常完整的旅行模擬系統,有嚴謹的旅遊路線設計。
因為旅行的過程並不展示給使用者,我原本以為邏輯會十分簡單。發現這套旅行模擬系統的時候,我也有些驚訝,也促使我深入研究這款遊戲的邏輯。
下面的解釋中間會用到少量計算機圖論 (graph theory) 的術語,但應該還是很直觀。
呱是如何選擇旅行路徑的?
程式內建東、西、南、北四個區域,呱會選擇一個地區旅行
每個區域的設計都是一個連通的無向圖 (connected undirected graph),而呱的旅行路線就是在圖上某兩個點之間走出一條路徑 (path)。
通過逆向手段,我提取出了程式中的資訊,花了一些時間用 Graphviz 生成了每個地圖的樣子。
如果大家有興趣的話,我可以把原始資料上傳到 Github
圖上的每個節點 (vertex) 都代表了一個地點。每個地點都有可能被蛙經過,並觸發一些事件。
除了普通的地點外,還有四種特殊的地點會影響呱旅行的路線:
- START 起始點(帽綠色)
- GOAL 目的地(桃紅色)
- PATH 途徑地(橘黃色)
- DETOUR 繞路地(淺黃色)
連線節點之間的是邊 (edge),代表連線地點的路,這些路上也會觸發 遇上夥伴、拍攝照片 等事件。
每次開始旅行的時候,根據老母親(?)打包的物品,呱都會:
選擇目的地
攜帶特點食物或道具可以影響到地區的選擇,有些物品可以增加特定地區的被選概率,甚至可以直接確定選擇的地區。在一個區域內的目的地的選擇同樣取決於所攜帶的道具。具體每件物體效果會在後面提到。
選擇途徑地
途徑地由目的地決定,每個地點都有對應的途徑地,程式碼中對此的描述是當地的縣府 / 交通樞紐。
- 選擇繞路地
這個很有意思,我猜測作者的目的是為了讓旅途更有多樣性,每次路途會額外新增幾個地區內繞路地點,攜帶物品對決定繞路地似乎沒有影響。 - 生成經過所有地點的旅行路徑
運用了圖論很經典的連通圖找最短路徑 Dijkstra 演算法,配合途徑地和繞路地的邏輯,最終計算出旅行路徑。
目的地是怎麼選擇的?
具體目的地的選擇就和攜帶的道具相關,每個物品對應目的地的優先順序與 區域加成 疊加就能獲得每個地點被選擇的概率。
每個目的地的 區域加成 初始值都為 30,道具的 決定地區 屬性值可以提升對應地區內目的地的 區域加成,從而增加區域內所有的目的地被選擇的概率。
部分道具可以直接限制選擇到規定的地區 (D)。
呱是如何旅行的?
確定了地點之後,呱會開始旅行:
- 攜帶物品會決定蛙最長能旅行多久,6 ~ 72 小時不等。
- 初始體力由攜帶物品決定,以 100 為基數提升。
- 物品的具體屬性參考下面的圖鑑
- 經過圖上的一條路(邊)的時候,道路的地形屬性和所攜帶的物品屬性互相作用,會決定呱實際消耗的時間和體力。
- 路上可能會遇見小夥伴,會在之後的旅行中結伴而行,從而出現在明信片中。
- 根據路途屬性,有一定概率會寄相關的明信片。
- 當體力不支的時候,蛙必須停下來休息 3 小時,休息完之後體力會恢復到 100。休息時間也算作旅行時間。
- 當到達目的或者旅行時間耗盡的時候,蛙就會回家。1.回家時會攜帶三葉草和抽獎券。2.如果在時間耗盡前到達了目的地,蛙會在此基礎上帶回當地特產和收藏品。
所以如果你的蛙很久都沒回家,回家了也沒有帶土特產,可能是路途上多次體力不支,暈倒在路邊。
呱在每條路上的耗時是怎麼計算的?
呱離家出走了怎麼辦?
如果長時間沒有準備便當,包裡和桌上都沒有食物,呱會憤然離家出走(どこかへ出かけています)。
這個時候在桌子上放上吃的,呱就會在 5~30 分鐘內回家。
有趣的是,離家出走也算作成就計算中的旅行次數……emmmm。
道路有哪些屬性?
連線不同地點之間的每條路 (edge) 都有以下幾個屬性
- 地形
四種地形分別是 普通、大海、山地、洞穴 - 耗時
途徑這條路的體力和時間損耗,分為基礎耗時和地形增加耗時
呱需要跋山涉水自然會耗時久一點 - 明信片概率
明信片上不同元素出現的概率
據說所有的地圖元素都有真實原型 - 遇見夥伴
遇見特定夥伴的概率
具體如下,不能再詳細了:
每件物品都有什麼效果?
奉上這張吐血整理的物品效果圖鑑:
有五類不同的物品
- 便當
商店購買或者抽獎獲得的食物 - 幸運符
除了四葉草和可以購買的幸 (tǔ) 運 (háo) 鈴之外,都要抽獎獲得 - 道具
商店購買 - 特產
呱旅遊時獲得 - 收藏品
特別的特產,通常在縣府獲得,無法使用
屬性分類:
HP
- 最大時間(小時)
決定蛙的旅行時間 - 初始體力提升(%)
增加一開始一鼓作氣能旅行的距離 - 隨機體力提升(%)
隨機額外增加體力提升的最高百分點
- 最大時間(小時)
物品機率
- 三葉草
獲得三葉草數量 - 額外隨機三葉草
隨機額外獲得的最大三葉草數量 - 抽獎券
獎券數量 - 物品數量增多
增加獲得目的地收藏品的概率
- 三葉草
決定地區
對應地區被選中的概率,如果值為 D 則可以直接決定目的地所在區域- 移動速度
根據地形不同,提升移動速度,減少途徑所耗費的時間,在相同旅行時間內可以走更遠 - 朋友
遇到特定旅行夥伴的概率 - 遭遇地形
途徑特定地形時候獲得相應明信片的概率 - FLAG 屬性
立一些特定的 Flag,主要影響成就係統,下面會寫到
如何科學使用物品?
這裡用幾個例子來展示物品和路線結合的效果
- 決定想去的地區
攜帶的便當和抽獎獲得的護身符(お守り)可以提升選擇特定地區的概率。 抽獎獲得的車票(きっぷ)可以直接決定所去到的地區。
例:想去北方,使用北國きっぷ。 - 影響路途的距離和時間
帶 最大時間 值高的食物吃走得遠,帶 體力提升 值高的食物吃走得快耗時少。 - 快速通過沿途路線的地形
帶有地區速度加成的食物或者道具,可以增加特定地形的移動速度。
不同物品的 移動速度 效果可以疊加,詳情檢視上面的解釋。 - 匹配在道路上遇到的夥伴
如果在途徑會遭遇夥伴的道路,特定物品可以增加實際遭遇概率
例:抽獎抽到的黃色ぼうろ(餅乾)可以增加路途中遇到螃蟹的機率。
綜合運用(敲黑板!!!)
呱想去秋田県男鹿市看燈塔
- 在地圖上找到 秋田県(3022) 在北方。
- 便當選擇 あさつきのピロシキ (蔥餅?)可以提升去北方的概率。
- 攜帶 青色のお守り (藍色護身符)可以提升去北方的概率。
- 如果有 北國きっぷ(北方車票?)可以直接決定去北方,上面的便當和護身符可以換別的。
- 通過目的地概率表發現攜帶各類帳篷前往 3022 目的地的概率更高。
- 檢視可能的路線發現從起始點 3000 到 3022 之間會途徑很多山路。
- 攜帶 ハイテクテント (高階帳篷?)增加山地移動速度更顯著。
- 如果還有空餘,可以帶上 よつ葉(四葉草)或者 幸運の鈴,提升帶回物品的概率。
旅途中會帶回哪些明信片?
途徑每條道路上會遇到的明信片元素都有很明確的概率。
普通的明信片是自動合成的。根據道路元素、所攜帶道具、遇到的同行小夥伴,程式會選擇合適的背景、前景和呱和小夥伴的 pose,合成完整的明信片。粗略計算,有 120 種左右的組合。
有一些帶有特定的故事情節明信片是單張繪製的,這裡也可以看出遊戲製作者的用心:迷路和小夥伴看地圖通常出現在地圖的邊緣,冷清下水道一般出現在四通八達的城市交通樞紐。
旅途中會帶回哪些特產?
上面提到了,成功到達目的地(GOAL)的時候才會獲得特產,收藏品的獲得概率是 15%,其他物品的概率如下:
遊戲程式碼中有收藏品收集三次必定成功的設定,但是實際上並未啟用,可能在之後的版本中會引入
朋友什麼時候會來訪?
蝸牛、蜜蜂和烏龜會時不時來訪。來訪停留的時間 180~270 分鐘。
蜜蜂需要有至少 3 件收藏品才會出現,烏龜需要有至少 6 件收藏品。
朋友來訪應該投喂什麼?
給來訪的朋友投喂會獲得三葉草和抽獎券的回禮:
在此基礎上,投喂帶有稀有 FLAG 屬性的物品會多獲得 20 根三葉草,多獲得 1~4 張抽獎券。
朋友會記住最近三次的食品。連續投喂同一種物品,獲得回禮的數量會降低。
為了達到最好效果,最好換四種不同的禮物輪流投喂,具體可以參照下面的喜好表格:
三葉草多久會長好?
每一根都是獨立重生的。最短 5 分鐘 (300 秒),最長 4 小時 (14400 秒) 重生。
四葉草獲得的概率是?
完成教程後會自動誕生第一顆四葉草,除此之外,每一根三葉草重生的時候都有 1% 的概率成為四葉草。
抽獎球的概率是?
- 白:60%
- 藍:27%
- 綠:9%
- 紅:3%
- 金:1%
如何獲得成就?
蛙旅行的時候會立一些 Flag,我從程式碼中整理了一下觸發的條件:
這也是玄學錯誤迷信的一個地方。使用稱呼對遊戲其他部分沒有任何影響,不會改變獲得物品和明信片獲得概率,也不會影響出門時長。