C .
ODE
G
AMELET
# CgEventsRoguelike 專門為 Roguelike 遊戲設計的事件表擴充包。把「卡片定義 + 卡片實體容器」這兩件事拆開做透徹,讓所有「抽卡、發牌、戰利品池、商店進貨、背包合成、保底機制」都能用 GUI 動作組合出來。 ## 它解決的是什麼問題 Roguelike 遊戲的核心循環不外乎兩件事: 1. **這張卡是什麼?** —— 火球的傷害是多少、稀有度是哪一級、抽到的權重是多少(卡片的種類定義)。 2. **這張卡現在在誰那邊?** —— 在抽牌堆、手牌、棄牌堆、玩家擁有清單、商店貨架、背包(卡片實體的容器與流轉)。 純事件表要做這兩件事,得手算總權重、用迴圈累減、處理不重複、動態維護容器,還得區分「種類」與「實體」(手上兩張一模一樣的卡)。對只熟悉 GUI 的創作者來說門檻很高。 `CgEventsRoguelike` 把上述能力切成兩個正交模組: - **卡片字典(Catalog)** —— 定義「有哪些卡種」的字典。每個卡種有 kindId、weight(抽中機率)、maxCopies(持有上限)、data(基礎資料)。三種抽法:等權抽樣、保底抽、分層抽。 - **牌堆(Stack)** —— 裝實體卡片的容器(有序、可重複)。每張卡有自動的 instanceId,可獨立攜帶 data(用來表達升級、詞綴等實體狀態)。 - **橋接動詞** —— 一個動作從字典加權抽 N 個 → 自動生成實體推入牌堆。 - **「順便推入牌堆」可選模式** —— 6 個抽法動作都可勾選,抽完直接寫進指定牌堆。少寫一個動作、多人時少送一次封包。 ## 適合什麼場景 **STS 三堆戰鬥**:永久牌組 → 戰前複製到抽牌堆 + 洗牌 → 抽 5 進手牌 → 打牌進棄牌堆 → 結束回合洗回。 **升級三選一**:技能字典中加權抽 3 個 kindId 不重複當候選 → 玩家選一張 → 進入「玩家技能」牌堆。同卡多次選到可以堆疊(用 data 表達升級狀態)。 **戰利品池跨玩家共池**:一個戰利品池配上「每個玩家擁有」的對照堆 + 字典裡的同種上限(普通×5、稀有×1)→ 玩家點抽即可,自動避開達上限的卡種。 **商店每日進貨**:開店時從字典加權抽 3 件商品到貨架 → 玩家點商品買走 → 對應格子變空 → 補貨按鈕清空貨架重抽。 **背包合成**:玩家背包中數鐵 ≥1 且水 ≥1 才能合成藥水 → 消耗素材 → 推入藥水。檢查 + 否則觸發 處理素材不足。 **保底抽卡**:「保底:抽卡」一個動作搞定,自動維護進度變數,達 N 次未中強制保底。 **分層戰利品**:「分層抽」一個動作搞定。先依權重選池(普通 70% / 稀有 25% / 傳說 5%),再從該池內抽。深度感由開發者用「卡片字典:設定權重」動態調整即可。 **牌堆構築**:玩家擁有的牌組就是一個 Stack,新獲得的卡 push 進去,刪除 / 升級單張靠 instanceId 精準操作。 ## 設計理念 **字典 vs 容器分離**。字典回答「卡種長什麼樣」、容器回答「現在誰拿著哪幾張」。這個切法讓「抽卡 → 生成實體 → 進入容器」變成 3 個獨立可組合的步驟,而不是糾纏成一團。 **實體有 instanceId**。Stack 內每張卡有獨立 instanceId(自動生成,全域唯一),可以表達「兩張一模一樣的火球」、「升級到不同等級的同卡」、「精準刪除某張」等情境,不會跟 kindId 混淆。 **資料欄位(data)支援 GUI 編輯**。建立卡種或升級單張時不必手寫 JSON 字串,直接用 GUI 加列(key + 型別 + 值)即可。 **錯誤訊息就是教學**。用錯時控制台跳出帶建議的中文警告(開發模式才顯示),引導用正確的元件組合。 **動作不做條件判斷**。所有分支邏輯靠檢查 + 「否則觸發事件」,這是事件表本來就推薦的條件分支寫法。 ## 一個最直接的例子 升級三選一(用橋接動詞): 1. 建立技能字典(一次性,定義有哪些技能) 2. 玩家升級時:「橋接:從字典生成實體進牌堆」抽 3 個不重複到「候選」牌堆 3. UI 顯示 3 個按鈕對應 3 張候選 → 玩家點選 → 該張 Transfer 到「玩家技能」 整個流程都是 GUI 動作組合,不用碰一行程式碼。 ## 開始使用 - **5 分鐘上手教學**:見同目錄下 `TUTORIAL.md` - **完整互動範例**:[CgEventsRoguelike 模組專案](https://code.gamelet.com/edit/CgEventsRoguelike) 下 `test/examples/` - `basic_draw.events`:基本抽 / 打 / 自動洗回 - `loot_pool.events`:跨玩家共池戰利品(依字典 maxCopies 過濾) - `level_up_choice.events`:升級三選一 + 升級單張 - `deck_battle.events`:STS 戰鬥三堆完整循環 - `shop.events`:商店進貨 / 買走 / 補貨 - `crafting.events`:背包合成(多素材 Check + 消耗 + 產出) - `pity_draw.events`:保底抽卡(CatalogPityRollRL 一個動作搞定) - `pity_draw_legacy.events`:舊版保底寫法(5 個 event 拼裝),保留供新舊對照 - `tier_loot.events`:分層戰利品(CatalogTierRollRL + 順便推入戰利品包) - **元件分類**:事件表編輯器中位於 **Roguelike / 卡片字典**(含 保底、分層抽 子分類)、**Roguelike / 牌堆**、**Roguelike / 橋接** ## 作者 **[cook1470](/profile/cook1470)**
# TWCleaner 本專案的目的是清理 [TwilightWarsLib](/edit/TwilightWarsLib) 在遊玩過程中產生的物件,載入就會生效。 如有任何問題可在[Discord群組](https://discord.gg/seJwuzCbWq)詢問。 ## 參數及功能 ```typescript const config: { // 預設為 true // 在遊戲結束後,是否要將 Game local 的參考移除(實作方法有風險,遊戲模組更新後可能會失效) clearGameLocalCache: boolean, // 預設為 true // 在遊戲結束時,是否要將 Actor local message index registry 對 Game 的參考移除(實作方法有風險,遊戲模組更新後可能會失效) clearActorLocalMsgIndexReg: boolean, // 預設為 false // 在遊戲結束後,是否取消將遊戲過程中透過 CG.Base.resourceManager.createGAFMovieClip() 產生的 GAF.GAFMovieClip 物件銷毀 donotCleanGAFMovieClip: boolean, // 預設為 false // 是否印出 debug log showGCMessage: boolean } // 執行此 function 可避免透過 CG.Base.resourceManager.createGAFMovieClip() 產生的 GAF.GAFMovieClip 物件在遊戲結束後被銷毀 function markNotClean(obj: GAF.GAFMovieClip): void // 執行此 function 可刪除 Actor local message index registry 的 key(實作方法有風險,遊戲模組更新後可能會失效) function deleteActorMessageTableKey(key: string): void // 只有在參數 showGCMessage 為 true 時才會被執行 // 執行此 function 可在 obj 被 GC 時,在 Console 印出 name log function showGCMessage(name: string, obj: any): void ``` ## 清理項目 1. 銷毀遊戲過程中產生的 GAF - 在遊戲結束後,銷毀遊戲過程中透過 CG.Base.resourceManager.createGAFMovieClip() 產生的 GAF.GAFMovieClip 物件 1. 清除 Game local 的參考 - 在遊戲結束後,清除 Game local 中的 instance 參考,使得可以不需要等下一場遊戲開始才能釋放 Game 1. 清除 Actor local 中的 message index registry 對 Game 的參考 - 在遊戲結束時,清除 Actor local 中的 message index registry 對 Game 的參考(Game 本身發出訊息或是死亡進入觀戰時就會殘留) 1. 釋放 Pool 中的物件 - 在遊戲過程中釋放 Pool 中的物件,避免存在過多的顯示物件 1. 銷毀 ArmorBoard - 補上在遊戲結束後 game.ui.dispose() 中沒有呼叫的 this.armorBoard.dispose() 1. 銷毀 SlideBoard 中可能的 clip - 銷毀在遊戲結束後,SlideBoard 的 subclasses 可能存在的 this.clip 1. 清除 WatcherController, BugParasiteNetwork 對 Game 的參考 - 這些 class 在各自的 local 中都會保留 instance 參考,因此在 dispose() 時清除它們對 Game 的參考 1. 避免 CG.TWLibLib.libs.openDialogWithTabManager() 中的 React cache 保留對 Game 的參考 - 替換掉參數 options.onClose 以解除 React component 中對 props 的參考間接保留對 Game 的參考 ## Authors **[EnhProject](/profile/EnhProject)** - **[不會取名字](/profile/buhuechuminzu)** - **[雪姬](/profile/setsuki)**
# 光暈戰記【奧賽羅】 腦抽做的,跟甚麼都沒有差不多<br> 因為接下來要忙別的,沒空處理垃圾,就隨便公開當參考了<br> 不過這專案有滿多地方都有改善空間的<br> <hr> <font size="5"><b>【技能說明】</b></font> <ul> <li>【奧賽羅】沒有戰術技能,技能組以七陣營為主,技能說明請移步<a href="https://docs.google.com/spreadsheets/d/1GAJctoQ3f1A_DutUhTHeSFdPY4ex0_U-cUnnuCS5-_g/">花靈宮資料庫</a>。</li> <li>本專案中,天影、皇家、盜賊幫、無魂軍玩家造成傷害時,增加傷害量20%的hp。</li> <li>玩家使用花靈宮時,聲望將降至500;使用智械兵團時,聲望將降至1000。</li> <li>任意角色受到中毒傷害後皆會解毒,且發動雷池7秒後會受到1點系統傷害。</li> </ul> —— 同時,本專案中更改了以下技能的持續時間 ——<br> <ul> <li>霜寒之鋒(3) | 霧隱遁音(4) | 永恆凍土(5) | 花影迷蹤(6)</li> <li>血祭(10) | 鐵骨功(7)</li> </ul> <hr> <font size="5"><b>【特別鳴謝】</b></font> 嘎姆站長:<a href="https://gamelet.online/user/113321052805704333314@google/">小哈</a><br> <br> 模組作者:<a href="https://code.gamelet.com/profile/cook1470">酷可</a>(Exp)、<a href="https://code.gamelet.com/profile/LoliPrincessNina">妮娜</a>(FairyEvents)、<a href="https://gamelet.online/user/cat_black/">UAN</a>(WovenFatesPerformanceModule)<br> <br> 陣營作者:<a href="https://gamelet.online/user/ht9896886/">H.T</a>(<a href="https://thief-mission.gamelet.online/">盜賊幫</a>)、<a href="https://gamelet.online/user/nina/">妮娜</a>(<a href="https://flowerfairypalace.gamelet.online/">花靈宮</a>)、<a href="https://gamelet.online/user/104311478002758573151@google/">ĄŊʏᴇᴇᴇᴇᴇɴ</a>(<a href="https://zombies-legion.gamelet.online/">無魂軍</a>)、<a href="https://gamelet.online/user/amk_2/">淇</a>(<a href="https://mechanoids.gamelet.online/">智械兵團</a>)、<a href="https://gamelet.online/user/117336754650487480063@google/">千翎</a>(<a href="https://test-chinatsu.gamelet.online/">蒼鎧營</a>)<br> <br> 音樂來源:<a href="https://www.youtube.com/@uniquegear">ユニークギア</a><br> <br> 音頻來源:<a href="https://soundeffect-lab.info/">効果音ラボ</a><br> <hr>
# TWPerfPatch 本模組為 `TwilightWarsLib` 的效能優化補丁。只要在專案中載入模組,優化邏輯即會自動生效,無需手動初始化。 ## 優化項目 ### 1\. GAF 動畫循環控制 (GAFMovieClip) * **自動切斷循環**:執行 `stop()` 時會同步停止 `requestAnimationFrame` 遞迴,確保動畫停止時不再消耗 CPU 運算資源。 * **重啟時間校正**:在執行 `play()` 時重置時間戳記,確保動畫從停止處精準接續播放。 * **記憶體壓力優化**:透過手動管理動畫回呼函式,大幅減少重複產生暫存資料造成的記憶體堆積。 ### 2\. 深度資源清理 (Game Destroy) * **強制遞迴清理**:覆寫 `destroy` 邏輯並預設開啟 `children: true`,確保場景銷毀時會自動連同所有子物件掃描並清理乾淨。 * **紋理引用釋放**:預設開啟 `texture: true`,在場景銷毀時主動釋放該場景佔用的圖片資源(Texture),提升系統回收記憶體的效率。 * **背景循環掃描**:在執行 `dispose()` 時進行深度掃描,確保所有層級中還在執行的動畫循環皆已關閉。 ## 注意事項 (Disclaimer) * **非官方補丁**:本模組非由 `TwilightWarsLib` 官方開發,屬於第三方效能優化。 * **使用風險**:本補丁會直接修改函式庫的原型邏輯(Prototype)。 * **副作用說明**:由於強制開啟了銷毀子物件與紋理的功能,若專案中有「跨場景共用且未重新加載」的圖片資源,可能導致顯示異常。建議載入後完整測試一次場景切換流程。 * **優化程度說明**:本補丁並非 100% 解決所有洩漏問題。目前仍有部分潛在的 `requestAnimationFrame` 調用深埋於函式庫內部難以追蹤,且部分 `GAFTexture` 仍可能存在無法被完全釋放的情況,僅能就目前已知路徑進行最大化優化。 ## Authors **[cook1470](/profile/cook1470)**
# WovenFatesPerformanceModule WovenFatesPerformanceModule 是一組為 **平生願** 專案整理的演出用擴充模組,主要有以下功能: - **Dialogue**:對話框、選項、對話履歷與相關互動觸發 - **Notebook**:可建立、開關、增刪條目並支援翻頁演出的筆記本系統 - **Typing Animation**:可直接顯示於畫面,或掛載到顯示屏上的逐字動畫特效 - **Damage Telegraph Zone**:可打斷的傷害預警區域 - **Vision Zone**:可偵測並被障礙遮擋的視野區域。 這個模組的目標不是提供底層框架,而是補足事件表中常用的 **演出能力和機制**。 讓對話、筆記、提示文字與資訊呈現能更直接地接入任務流程,並設計更有趣的關卡。 具體使用效果可以參考平生願重製版:https://woven-fates.gamelet.online/ --- **本模組依賴 CgEventsExp + CgEventsLib + TwillightWarsLib + TwillightWarsEvents + TwillightWarsEventsEXP。** --- # DIALOGUE ## Action: - **建立對話框** 建立對話框 UI,初始化對話介面的版面、文字區與顯示結構,作為後續顯示台詞與操作履歷的基礎。 - **顯示對話內容** 更新對話框中的角色名稱與台詞內容,用於一般劇情推進與對話演出。 - **顯示對話選項** 顯示可供玩家選擇的對話選項視窗,支援自訂選項內容、位置、字體與外框樣式,可選擇是否等待玩家作答。 - **開啟對話履歷** 開啟對話紀錄視窗,讓玩家查看先前已顯示過的對話內容。 - **關閉對話履歷** 關閉對話紀錄視窗,回到一般對話流程。 ## Trigger: - **選中對話選項** 在玩家選中對話選項後觸發,可取得選項視窗 ID 與選中的值,方便把選項結果接回事件表邏輯。 - **滑鼠滾輪觸發** 監聽滑鼠滾輪輸入,可用於開關對話履歷、切換頁面或其他 UI 滾輪互動。 --- # NOTEBOOK ## Action: - **建立筆記本** 建立筆記本 UI 與控制器,初始化封面、頁面、目錄、條目內容、圖片區與翻頁機制。 - **開關筆記本** 控制筆記本的開啟、關閉或切換狀態,可用於劇情中隨時調出或收起筆記本介面。 - **新增筆記條目** 將新條目加入筆記本,支援標題、左右頁內容與圖片資料,適合用於調查、線索收集與資訊整理。 - **刪除筆記條目** 依照條目 ID 或索引刪除指定條目,可用於更新資料、覆蓋舊資訊或同步任務進度。 - **顯示筆記條目** 顯示指定條目內容,或切回筆記本目錄頁,並配合翻頁效果切換內容。 ## Trigger: - **筆記本事件觸發** 監聽筆記本的開啟、關閉、回到目錄與選中特定條目等事件,可直接把玩家閱讀行為接入事件表。 --- # TYPING ANIMATION ## Action: - **特效逐字動畫** 在畫面上顯示逐字出現的文字,並可搭配音效、晃動與淡出等效果,用於提示、旁白、內心獨白或特殊文字演出。 - **建立逐字動畫顯示屏** 建立可重用的逐字動畫顯示區,支援背景、行距、最大行數、堆疊方向與推動動畫設定,可讓多條逐字訊息依序堆疊顯示,而不互相重疊。 --- # DAMAGE TELEGRAPH ZONE ## Action: - **建立傷害預警區域** 建立矩形、扇形或圓形傷害預警區域,時間到便會對符合敘述的角色造成一次或持續傷害。 - **打斷傷害預警區域** 打斷特定ID的傷害預警區域。 --- # VISION ZONE ## Action: - **建立視野區域** 建立扇型或圓形視野區域,並可偵測在區域內的角色。 - **設定視野區域顏色** 設定特定ID的視野區域顏色和顯示與否。 ## Trigger: - **視野區域偵測** 當角色碰到視野區域時觸發。 ---
# 更好的光暈戰記事件表擴充模組(TWEventsBetterExp) 本模組延續 [**TwilightWarsEventsExp**](https://code.gamelet.com/edit/TwilightWarsEventsExp)(以下簡稱 EXP)的概念所設計,並基於 [**TwilightWarsEvents**](https://code.gamelet.com/edit/TwilightWarsEvents) 建立,用於擴充 [**光暈戰記**](https://twilightwars.gamelet.online/) 事件表功能的模組。 由於 **EXP** 過於混雜,為優化模組架構與性能,將逐步進行程式碼重構,剔除許多不必要,或與 **TwilightWarsEvents** 重疊的功能,保留真正需要的功能。 程式碼搬遷將會是一個持續性的工程,如果你有建議可以優先搬遷的功能,歡迎直接告訴我。 本模組的所有功能都放在 **光暈戰記 (BetterExp)** 目錄底下,且所有功能皆有 (BetterExp) 後綴。 ## 注意事項 即使是作用相同的功能,由於程式碼重構的關係,使用上 **EXP** 還是會和本模組有所差異,沒辦法直接將資料無痛轉移,因此你應該將其視為兩個不同的模組。 如果你是曾使用過 **EXP** 的開發者,如今想要開發新的專案,會建議不要安裝 **EXP** 而改安裝此模組。 ## 玩家社群 ### Discord - [**嘎姆討論區**](https://discord.gg/hZKQzRfPJM):於 2021/05/08 創立的非官方社群,主要用於討論嘎姆擂台的相關資訊。 ## 作者 **酷可**:[**Code.Gamelet**](/profile/114899766849308759711@google)、[**Gamelet.Online**](https://gamelet.online/user/114899766849308759711@google/board)、[**Youtube**](https://www.youtube.com/@cook1470)
# P2P檔案分享 ## TL;DR EnhServer與TURN伺服器不會記錄你傳輸之資料,擔心隱私或資安問題請自行考慮後再決定是否使用本專案。 檔案最大應為 (2GiB - 2MiB) (已測試chrome/edge、firefox),若超過建議是採用壓縮檔分包個別傳輸。 註: - Windows的GB是GiB,即1024^3 Bytes - Linux的GB是1000^3 Bytes ## 使用須知 本專案使用WebRTC傳輸資料,藉由EnhServer協助使用者交換連線資訊,以順利建立連線。 本專案無需於EnhServer註冊帳號便可直接使用。 本專案由 **[雪姬](/profile/setsuki)** 提供STUN/TURNS伺服器,最大100Mbps總中轉頻寬。 伺服器可能並不算穩定,若有問題可至 [Discord 群組](https://discord.gg/seJwuzCbWq) 提醒我修復伺服器。 (TURNS為有加密之TURN伺服器,自建預設無加密,有需要可以使用ACME Client/Certbot向Let's encrypt申請證書以啟用加密) 若想要使用自有的STUN/TURN伺服器,請參閱 [Coturn Project on Github](https://github.com/coturn/coturn) 學習如何使用。 也可以自行建立自己的EnhServer,確保流量都可受自己控制,原始碼開源於 [EnhServer-monorepo on github](https://github.com/setsuk1/EnhServer-monorepo) 上。 ## 起因 有時想臨時分享檔案,但又擔心透過雲端硬碟傳遞資料沒有隱私。 因此建立起此專案,可以不讓第三方擁有自己的資料。 雖然也可透過EnhServer提供之訊息交換功能傳遞分塊。 但一來會對EnhServer的頻寬與記憶體帶來挑戰,二來則是瀏覽器端不便對資料進行處理。 再加上會帶來一些些複雜度,於是便透過WebRTC簡化這個流程。 ## 細節 (不關心可跳過) 首先先了解何為WebRTC。 WebRTC為於網路上實現之實時通訊。 需要兩類資料以建立連線:SDP資訊(offer/answer)與ICE資訊(IP、port、etc.) 首先使用者雙方須先交換SDP資訊,此部分如同連線之鑰匙與鎖,雙方不匹配就無法成功建立連線,該部分由EnhServer中轉。 當SDP交換完成時,雙方會各自向STUN/TURN伺服器取得可使用的連線資訊(ICE Candidate)。 之後會再透過EnhServer交換ICE資訊,並嘗試建立起連線。 而取得資訊可以透過兩類協議:STUN協議、TURN協議。 前者用來產生端到端連線,沒有任何中轉,但是對網路(NAT類型)有所要求。 後者則是透過一中轉伺服器轉發流量到對方一側,對NAT類型無要求,連線成功率提高許多,通常於STUN失敗時使用。 ## References MDN(Mozilla Developer Network Web docs) - **[RTCPeerConnection API](https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/RTCPeerConnection)** - **[RTCDataChannel API](https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel)** - **[RTCDataChannel Example](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Simple_RTCDataChannel_sample)** iT邦幫忙 - **[菜雞前端邁入網頁即時通訊(WebRTC)之旅](https://ithelp.ithome.com.tw/users/20129521/ironman/3138)** ## Authors **[雪姬](/profile/setsuki)** **[不會取名字](/profile/buhuechuminzu)**
ⒸCode.Gamelet.com | Privacy Policy | Terms of Service