C .
ODE
G
AMELET
<div align="center"> <img src="https://a.gamelet.online/gassets/asset/HeiwaEvents/HeiwaEvents.Thumbnail_Clear/heiwa_no_jikenshu_transparentX.png" alt="HeiwaEvents Cover" width="60%"/> </div> <br/> <div align="center"> # 世界ヘイワ <a href="https://gamelet.online/user/XMoiswnX_Official" target="_blank"><img src="https://gamelet.online/clients/assets/v1/img/gamelet_icon.png" height="16" style="vertical-align:middle"/><span style="vertical-align:middle"> 嘎姆擂台</span></a> <span style="vertical-align:middle">&nbsp;|&nbsp;</span> <a href="/profile/112096057923977127327@google" target="_blank"><img src="https://code.gamelet.com/img/logo_v1_100.png" height="16" style="vertical-align:middle"/><span style="vertical-align:middle"> 摳的嘎姆</span></a> <span style="vertical-align:middle">&nbsp;|&nbsp;</span> <a href="https://discord.gg/qBrDVXCPA3" target="_blank"><img src="https://cdn.simpleicons.org/discord/5865F2" height="16" style="vertical-align:middle"/><span style="vertical-align:middle"> Discord 群組</span></a> </div> --- <details> <summary> <a class="mat-raised-button mat-primary">可用模組</a> </summary> - 動作 - 角色 - **設定角色屬性** - 可修改血量、能量、生命次數、團隊號碼、體重、拳頭傷害力、發光範圍、聲望、分數、硬幣、體型縮放、命中半徑、面向、重生間隔與其他數值屬性。 - **設定角色狀態** - 可修改護甲耗損、中毒、友傷、地圖傳送、光印標記、光印返回、被動位移、血色、擊退、龍捲風抗性、血中帶毒、浮空、血條顯示與技能狀態。 - **設定角色身分與外觀** - 可修改角色陣營、顯示名字、暱稱文字樣式、外型與照妖鏡頭部造型,並可從其他角色複製外型。 - **角色裝備武器** - 提供另一手與兩隻手等手位設定。 - **角色切換武器** - 提供另一手、第一手、第二手等手位切換。 - **角色切換預設武器** - 可只恢復指定手的預設武器而不切換目前手,並支援兩隻手。 - **角色移到相對位置** - 依照目標角色的位置與方向,把角色移到指定相對位置。 - **角色交換位置** - 交換兩個角色的位置,並可控制面向處理。 - **角色推拉目標** - 依照距離設定推開或拉近目標角色。 - **打斷集氣** - 可強制打斷指定角色或多位角色正在進行的集氣,讓技能不會放出,並可選擇退還或不退還集氣氣力。 - 技能 - **施展技能** - 可讓指定角色或多位角色(含玩家)直接發動指定技能,內建完整技能清單,並可設定施展延遲。 - 遊戲 - **觸發天啟事件** - 觸發指定天啟,並可輸出成功狀態、種類與原因。 - **顯示通知** - 可顯示右上角遊戲通知,支援一般、警告、錯誤、自訂顏色與文字樣式。 - **設定玩家控制鎖** - 可鎖定或解除玩家的移動、攻擊、切換武器、裝填、拾取互動、丟棄、跳躍、面向、背包與記分板操作,並可在鎖定背包或記分板時關閉既有介面、阻止再次開啟。 - 任務 - **設定計時器** - 可開始、繼續、暫停或關閉任務計時器,支援倒數、正計時、顯示圖層與文字樣式,並可輸出操作結果。 - 道具 - **設定拳譜書掉落** - 可在指定位置產生綁定拳譜的拳譜書,支援位置、拳譜與道具代碼,拾取時依遊戲的拳譜書領取條件處理。 - **給予拳譜** - 可讓指定玩家角色學會指定拳譜或增加拳譜經驗。 - 特效 - **老花畫面** - 可套用畫面像素化特效,支援指定目標角色、畫面圖層、模糊強度與特效代碼。 - **移除特效** - 可依目標角色與特效代碼移除指定《へいわの事件集》特效,或清除全部指定種類的《へいわの事件集》特效。 - 檢查 - 角色 - **角色屬性** - 檢查角色血量、能量、生命次數、分數、硬幣、體型縮放、命中半徑、面向與其他數值屬性;可新增多筆屬性檢查,支援全部符合 / 任一符合,並可輸出目前數值。 - **角色武器** - 提供另一手、兩隻手、武器列表、武器代碼、預設武器判定與手位結果輸出。 - **角色集氣狀態** - 檢查角色是否正在集氣,並可檢查武器類型、集氣等級、集氣時間,並可輸出集氣等級、武器類型與集氣毫秒。 - **角色相對關係** - 檢查兩個角色之間的距離、角度、方向與目標存活狀態,並可輸出角度、距離與方向結果。 - **技能狀態** - 檢查角色是否正在進行(已釋放的)技能,進行中或未進行皆可比對指定技能代碼(內建完整技能清單),並可輸出目前技能代碼。 - **角色戰鬥對象** - 讀取 AI 角色目前正在追擊/攻擊的戰鬥對象,可判定有/無目標、比對指定目標代碼、要求目標存活,並可輸出目標代碼、是否有目標、與目標距離與目標陣營。 - 遊戲 - **玩家控制鎖狀態** - 檢查玩家的移動、攻擊、切換武器、裝填、拾取互動、丟棄、跳躍、面向、背包或記分板操作,目前是否被玩家控制鎖鎖定,並支援任一操作判定。 - 任務 - **計時器進度** - 檢查任務計時器的已經過時間、剩餘時間或時間總長,並可輸出目前數值、執行狀態與計時器代碼。 - 觸發 - 角色 - **角色開始集氣** - 在角色開始集氣時觸發,可篩選武器類型與集氣等級。 - **技能狀態結束** - 在角色已釋放的技能效果狀態結束的瞬間觸發,可用角色描述篩選,並輸出結束的技能種類與角色代碼。 - 遊戲 - **天啟狀態變更** - 在天啟狀態變更時觸發,可篩選天啟種類並輸出相關資料。 - 任務 - **計時器時間到** - 在倒數計時器歸零時觸發,可依計時器代碼篩選並輸出計時器代碼。 </details> --- <div align="center"> ## 靈感來源 TwilightWarsEvents by [Haskasu](https://code.gamelet.com/profile/Haskasu) TwilightWarsEventsExp by [cook1470](https://code.gamelet.com/profile/cook1470) TWEventsBetterExp by [cook1470](https://code.gamelet.com/profile/cook1470) </div>
# 花靈宮模組 - 作者 **[妮娜](/profile/LoliPrincessNina)** - 使用此模組為你的專案增加新的陣營和技能 - 注意電腦AI使用技能時有機會比較蠢 - 過快使用技能將會有概率出BUG - 此為測試版本,有BUG很正常 - 查詢及回報請到<b><a href="https://gamelet.online/user/nina/board">我的留言板</a></b> # 說明 - 為了方便各位照搬/測試花靈宮的任務,此處將填上花靈宮裡所有用到的觸發/檢查/動作 - 有相當一部分代碼是來自TwilightWarsEventsExp和CgEventsExp(下方不列出;部分存在變更,與原版有差異) - 若希望使用以上觸發/檢查/動作,請用原版,此處不會有更新 ## 目前提供支援的有: ## 陣營 - 花靈宮 - 盜賊幫 - 無魂軍 - 智械兵團 - 蒼鎧營 <!-- --> ## 觸發 #### 角色 - 角色說話 - 人物受傷(內建排除傷害類型/傷害數值比對) #### 武器道具 - 使用消耗型道具(可儲存道具變數) #### 技能 - 發動技能 <!-- --> ## 檢查 #### 技能 - 角色技能狀態 - 手持武器技能 #### 角色 - 角色狀態附加 - 角色面向某物 - 角色燃燒狀態 - 角色B是否角色A的敵人 - 角色是否可直視某點/物 #### 地圖 - 可行走座標 - 兩點之間的距離 #### 存讀 - 儲存變數 - 在陣列中找到字串 - 以符號分離字串 - 是否存在專案資源 #### 地圖機關 - 燭火機關狀態 - 找出所有地圖機關(迴圈) <!-- --> ## 動作 - 筆記 #### 角色 - 新增角色 - 角色漂浮能力 - 設定角色演員 - 移動角色位置 - 設定角色大小 - 角色可否攻擊 - 角色死亡訊息 - 人物停止說話 - 角色特殊屬性 - 取得玩家陣營演員角色 - 角色醉酒管理 - 角色反彈子彈 - 放下旗幟 - 鎖定面向方向 - 傳送角色加血訊息 - 傳送角色傷害訊息 - 傳送角色閃現至定點訊息 - 設定最大血量 #### 技能 - 角色結束技能 - 限制使用技能 - 設定武器技能 - 傳送技能訊息(欲自定義參數可在此處查看:<a href="https://docs.google.com/spreadsheets/d/1GAJctoQ3f1A_DutUhTHeSFdPY4ex0_U-cUnnuCS5-_g/edit?usp=sharing">技能參數</a>) - 白鳥拳 - 正/反旋風劈掌 - 千手如來 - 百裂拳 - 元氣玉 - 釋放拳法 #### 任務流程 - 跳出系統訊息 - 更多遊戲規則 - 角色對己說話 - 改變任務代碼 #### 存讀 - 工作階段儲存空間數據庫存取 - 以符號分離字串 - 定義Json變數 - 轉換Json為字串 - 轉換Json為物件 - 預載單一資源 #### 特效 - 聖光術 - 角色燃燒狀態 - 應用攻擊屬性 - 震地 - 吸血/血刃 - 劍氣光彈 - 地圖痕跡 - 冰氣 - 火箭 - 快跳文字 - 光環 - 衝擊波 - 地圖動畫 - 擊退人物 - 光印 - 冷卻 - 防護罩 - 防護罩泡泡 - 冰魂護盾 - 血滴 - 自動移除動畫 - 反衝箭 - 定時炸彈 - 空心虛線圓 #### 武器道具 - 背包道具設定 - 攜帶式道具設定 - 切換預設武器 - 切換至另一手 - 裝填武器彈藥 - 新增任務道具 - 新增武器道具 - 人物裝備道具 - 人物裝備武器 - 移除武器道具 - 玩家背包道具擁有的數量 - 設定花靈宮道具 - 遊戲道具配置 #### 地圖 - 隨機可行走座標 #### 隨機 - 隨機設定陣營 - 隨機角色演員 - 隨機使用技能 - 隨機物件代碼 - 隨機字串 - 隨機角色 #### 陣營 - 設定陣營/暱稱/技能圖示 - 新增陣營 - 改變陣營色彩風格(4個子項被拆分成2個新動作) - 回朔至初始陣營 #### 地圖機關 - 控制燭火機關 - 新增可推石塊 - 新增告示牌(NPC角色包括同人陣營選項)
# TwilightWarsLib A Top-down view shooting game framework. ## Getting Started These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. To start a .event ```typescript CG.TwilightWarsLib.initialize() .then(() => { CG.TwilightWarsLib.events.startEvents('test/test.events', 'arena'); }) ``` To manually setup the game: ```typescript CG.TwilightWarsLib.initialize() .then(() => let mapSource = 'test/test.twmap'; CG.Base.resourceManager.addAppSource(mapSource); CG.Base.resourceManager.load(() => { let mapResource = new CG.TWMap.resources.MapResource(); mapResource.importBase64(CG.Base.resourceManager.getText(mapSource)); mapResource.loadTextures(() => { CG.Base.pixi.initialize(600, 500); let game = new CG.TwilightWarsLib.games.Game(); CG.Base.pixi.root.addChild(game); game.initResources(mapResource); game.start(); console.log('tw game created'); let me = new CG.TwilightWarsLib.games.actors.Actor(game, 'me'); game.addActor(me, new MyActorController(me), 32, 100, 0, null); game.gameCamera.setFocus(me); game.interface.setMe(me); let ai = new CG.TwilightWarsLib.games.actors.Actor(game, 'ai'); ai.camp = CG.TwilightWarsLib.games.datas.Camp.CAMP2; ai.actorClip.headClip.clip.gotoAndStop(5); game.addActor(ai, new CG.TwilightWarsLib.games.actors.controllers.AIController(ai), 160, 300, 0, null); game.createStuff(null, 64 + 16, 128 + 16, CG.TwilightWarsLib.games.items.StuffInfo.getByCode('sword'), game.stuffManager.useNextStuffId(), true); }); }); }) ``` ## Versioning We use [SemVer](http://semver.org/) for versioning. ## Authors * **[Haskasu](/profile/Haskasu)** ## Acknowledgments * Hat tip to anyone who's code was used * Inspiration * etc
# CgEventsRoguelike 專門為 Roguelike 遊戲設計的事件表擴充包。把「卡片定義 + 卡片實體容器」這兩件事拆開做透徹,讓所有「抽卡、發牌、戰利品池、商店進貨、背包合成、保底機制」都能用 GUI 動作組合出來。 ## 它解決的是什麼問題 Roguelike 遊戲的核心循環不外乎兩件事: 1. **這張卡是什麼?** —— 火球的傷害是多少、稀有度是哪一級、抽到的權重是多少(卡片的種類定義)。 2. **這張卡現在在誰那邊?** —— 在抽牌堆、手牌、棄牌堆、玩家擁有清單、商店貨架、背包(卡片實體的容器與流轉)。 純事件表要做這兩件事,得手算總權重、用迴圈累減、處理不重複、動態維護容器,還得區分「種類」與「實體」(手上兩張一模一樣的卡)。對只熟悉 GUI 的創作者來說門檻很高。 `CgEventsRoguelike` 把上述能力切成兩個正交模組: - **卡片字典(Catalog)** —— 定義「有哪些卡種」的字典。每個卡種有 kindId、weight(抽中機率)、maxCopies(持有上限)、data(基礎資料)。三種抽法:等權抽樣、保底抽、分層抽。 - **牌堆(Stack)** —— 裝實體卡片的容器(有序、可重複)。每張卡有自動的 instanceId,可獨立攜帶 data(用來表達升級、詞綴等實體狀態)。 - **橋接動詞** —— 一個動作從字典加權抽 N 個 → 自動生成實體推入牌堆。也可改成「指定卡種」模式,直接生成同一張卡 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)**
# 更好的 CG 事件表通用擴充模組(CgEventsBetterExp) 本模組延續 [**CgEventsExp**](https://code.gamelet.com/edit/CgEventsExp)(以下簡稱 EXP)的概念所設計,用於擴充 CG 事件表的**通用**功能——只依賴事件表引擎與 `CG.Base`,與特定遊戲、特定函式庫(如光暈戰記)皆無關,任何 CG 專案都能安裝使用。 由於 **EXP** 過於混雜,為優化模組架構與性能,將逐步進行程式碼重構,剔除許多不必要、或與平台官方功能重疊的功能,保留真正需要的功能。 程式碼搬遷將會是一個持續性的工程,如果你有建議可以優先搬遷的功能,歡迎直接告訴我。 本模組的所有功能都放在 **通用 (BetterExp)** 目錄底下,且所有功能皆有 (BetterExp) 後綴。 > 光暈戰記相依的事件表擴充,請改用 **TWEventsBetterExp**;本模組專注於純通用功能。 ## 注意事項 即使是作用相同的功能,由於程式碼重構的關係,使用上 **EXP** 還是會和本模組有所差異,沒辦法直接將資料無痛轉移,因此你應該將其視為兩個不同的模組。 如果你是曾使用過 **EXP** 的開發者,如今想要開發新的專案,會建議不要安裝 **EXP** 而改安裝此模組。 ## 作者 **酷可**:[**Code.Gamelet**](/profile/114899766849308759711@google)、[**Gamelet.Online**](https://gamelet.online/user/114899766849308759711@google/board)、[**Youtube**](https://www.youtube.com/@cook1470)
# 光暈戰記 RPG 事件表模組(TwilightWarsRPGEvents) 此專案為 **[TwilightWarsLib](/edit/TwilightWarsLib)** 的 RPG 功能擴充模組。 大量自訂義的資料型態,搭配少量光暈本身的功能,主要是為了省略在光暈製作一個 RPG 任務時,還要先用一堆事件來製作相關系統、功能的步驟,而誕生的模組。 本專案的所有功能,皆是建立在任務為開放式房間、可多人遊玩,且可跨事件表的前提下製作,也就是說整個專案共用同一個玩家資料,故如果要製作更多不同的 RPG 任務,請另建新的專案製作。 有任何問題或 BUG,歡迎於討論區提出、回報。 <font color=red>**安裝此模組後,事件表會增加一些變數保留字,請避免在宣告全域變數時,使用下列名稱:**</font> **itemInfo, questInfo, {玩家代碼}_quests, {玩家代碼}_inventories, {玩家代碼}_equipmentSlot, {玩家代碼}_datas** <font color=red>**本模組不具備任何界面顯示功能,如有需要可直接安裝 [TwilightWarsRPGGUIEvents](https://code.gamelet.com/edit/TwilightWarsRPGGUIEvents) 模組,提供些許的 GUI 樣式可供使用。**</font> # 主要功能介紹 - [存讀檔功能](#存讀檔功能) <font color=grey>*ps.自動存檔、本機存/讀檔*</font> - [任務系統](#任務系統) - [自訂道具](#自訂道具) - [背包/裝備欄](#背包/裝備欄) - [跨事件表傳送](#跨事件表傳送) ## 存讀檔功能 本專案所有會更動玩家資料的動作,在變更玩家資料後,皆會**自動將資料儲存到專案資料庫**中。 專案任務作者只需要在玩家進入戰場後,使用動作來讀取資料即可,原則上並不需要考慮存檔的問題。 若有需要,本模組也提供於本機存讀檔的功能,但不建議使用於多人遊戲中,且讓玩家可以於本機存讀檔,可能會增加玩家隨意更改資料的風險。 提供可自訂玩家資料的功能,可設定例如等級、經驗值、金錢、稱號等屬性,修改數值時會自動存檔,也可隨時使用變數讀取數值。 ```typescript // 假設儲存玩家的代碼為 instance {instance.code}_datas // 使用此變數名稱可以得到該玩家的所有自訂資料。 // 若無設定資料類別,於後方加上 .資料名稱 即可取得該自訂資料的數值,例如: {instance.code}_datas.level // 可以取得該玩家,自訂資料 level 的數值。 {instance.code}_datas.money // 可以取得該玩家,自訂資料 money 的數值。 // 若有設定資料類別,於後方加上 .資料類別.資料名稱 即可取得該自訂資料的數值,例如: {instance.code}_datas.profile.level // 可以取得該玩家,資料類別 profile,裡面 level 的數值。 {instance.code}_datas.profile.money // 可以取得該玩家,資料類別 profile,裡面 money 的數值。 ``` ## 任務系統 提供可以**儲存玩家任務狀態**的功能,每個任務皆需要有不同的任務代碼,而主要的任務狀態有「未接取」、「進行中」、「已完成」。 每個任務在玩家進行中的狀態時,皆還可以**設定任務的進度**,進度的數量沒有限制,且也可以自訂進度的名稱,以及隨時更改進度的值,例如在設定某個玩家的任務狀態為「進行中」的同時,可以設定該任務的進度有「探索:0」,每當玩家到指定的地點探索後,可以讓該任務的探索進度增加,或是為擊殺型的任務時,在玩家擊殺目標對象後,使擊殺進度增加,最後在嘗試回報任務的事件中,可以在檢查的部分加上「檢查任務進度」,來檢查該任務的進度是否達到目標,以執行回報任務後會觸發的動作。 由於任務進度的數量並沒有限制,所以專案作者也可以為某個任務同時設定多個進度,並檢查所有的進度都要完成時,任務才會完成。 如在初始化時有執行過動作**「設置系統變數」**,可使用變數讀取任務資訊,可以參考下列格式: ```json // 假設儲存任務資訊的變數名稱為 questInfo,它會儲存所有任務的預設資訊。※ 詳細請看動作「設置系統變數」 {questInfo.questCode} // 將 questCode 改為自訂的任務代碼,可以取得該任務的所有資料。 {questInfo.main_0.name} // 可以取得任務代碼為 main_0 的名稱。 {questInfo.main_0.description} // 可以取得任務代碼為 main_0 的描述。 {questInfo.main_0.category} // 可以取得任務代碼為 main_0 的類別。 {questInfo.main_0.datas} // 可以取得任務代碼為 main_0 的自訂屬性,於後方加上 .屬性名稱 即可取得該自訂屬性,例如: {questInfo.main_0.datas.returnActor} // 可以取得該任務中,自訂屬性 returnActor 的資料。 ``` 如需要在事件表中,使用變數讀取玩家任務資料,可以參考下列格式: ```json // 假設儲存玩家的代碼為 instance {instance.code}_quests // 使用此變數名稱可以得到該玩家的所有任務資料。 {instance.code}_quests.questCode // 將 questCode 改為自訂的任務代碼,可以取得玩家對於該任務的資料。 // 若是讀取該玩家未曾接取過的任務,則會得到 undefined,也無法讀取下列資料。 {instance.code}_quests.main_0.state // 取得該玩家任務代碼為 main_0 的任務狀態。(數字) // 0 - 未接取, 1 - 進行中, 2 - 已完成 {instance.code}_quests.main_0.progress // 取得該玩家任務代碼為 main_0 的當前進度資料。 // 預設為空物件 {},需使用動作「設置任務進度」設置進度後,才會有內容可以讀取。 {instance.code}_quests.main_0.progress.talk // 取得該玩家任務代碼為 main_0 的 talk 進度值。(數字) {instance.code}_quests.main_1.progress.kills // 取得該玩家任務代碼為 main_1 的 kills 進度值。(數字) ``` ## 自訂道具 提供可以**自定義道具**的動作,可設定道具的名稱、描述、最大堆疊數量、物品樣式,以及其他自訂屬性,例如傷害力、防禦力、恢復力、可否裝備等。 至於定義物品道具的部分,請專門開一個事件表,將所有定義物品道具的動作放在裡面,並在玩家進入專案時執行一次即可,不需要每個事件表都重新放置動作。 或是可以直接在專案的進入點,加上 new ItemInfo 來定義物品。 ```typescript /** * @param {string} code 物品代碼 * @param {string} maxStack 最高堆疊數量 * @param {string} name 物品名稱 * @param {string} description 物品描述 * @param {string} stuffCode 物品外觀道具代碼 * @param {object} datas 自訂物品屬性 * @param {string} alias 物品圖示的資源別名 * @param {string} linkage 資源的鏈接名稱 */ new ItemInfo(code: string, maxStack: number, name?: string, description?: string, stuffCode?: string, datas?: { [key: string]: number }, alias?: string, linkage?: string) // 例如以下,創建一個 apple,最高可堆疊 10 個,手持時的武器為拳頭,datas 包含了 health 為 10。 new ItemInfo('apple', 10, '蘋果', '香甜可口的水果,散發著一股淡淡的香味。', 'kongfu', datas: { 'health': 10 }); ``` 如在初始化時有執行過動作**「設置系統變數」**,可使用變數讀取物品資訊,可以參考下列格式: ```typescript // 假設儲存物品資訊的變數名稱為 itemInfo,它會儲存所有物品道具的預設資訊。※ 詳細請看動作「設置系統變數」 {itemInfo.itemCode} // 將 itemCode 改為自訂的物品代碼,可以取得該物品的所有資料。 {itemInfo.apple.name} // 可以取得物品代碼為 apple 的名稱。 {itemInfo.apple.description} // 可以取得物品代碼為 apple 的描述。 {itemInfo.apple.datas} // 可以取得物品代碼為 apple 的自訂屬性,於後方加上 .屬性名稱 即可取得該自訂屬性,例如: {itemInfo.apple.datas.health} // 可以取得該物品中,自訂屬性 health 的數值。 ``` ## 背包/裝備欄 提供以**陣列為架構的背包系統**,並且可以為每個玩家**設置多個不同的背包**,可用裝備不同種類的物品,或是其他用途。 每個背包都可以**設置容量**,來決定這個背包可以裝多少組物品,當給予玩家物品時,若該物品的數量超過最大堆疊數量,則無法在同一欄位填裝,會自動尋找空位放入,直到背包沒有容量,且沒有可以堆疊的物品為止,並且會回傳多餘的物品數量,讓專案作者自行決定多餘的物品要怎麼處裡,例如直接丟棄,或是詢問玩家是否要替換背包中的物品,又或者是新增一個暫存用的背包,當物品數量過多時會自動裝入等等。 除了給予物品以外,也可以移除物品,移除時可以決定要不要指定背包中的哪一格,或是不指定,直接移除背包中指定物品代碼的物品。 提供可以檢查玩家背包物品數量的功能,可用於檢查玩家是否持有指定物品,且數量是否有達到條件,除了指定物品代碼以外,也可以檢查該物品的屬性是否符合條件。 提供裝備欄系統,可以自訂玩家的裝備欄狀態,以及各部位的名稱,並且裝備上物品道具,並且提供檢查**「檢查裝備欄物品」**,可檢查玩家某個裝備欄的物品,是否符合條件,例如是否為背包上的某一物品,或是符合某些物品代碼、屬性等,也可以單純檢查該裝備欄是否存在物品道具。 裝備欄的資料是直接儲存於背包資料中,故讀取背包資料時,會自動建置裝備欄的資料。 另外也提供了簡易的整理背包功能,專案作者可以讓玩家自行使用,或是在背包物品改變時使用。 如需要在事件表中,使用變數讀取玩家背包資料,可以參考下列格式: ```typescript // 假設儲存玩家的代碼為 instance {instance.code}_inventories // 使用此變數名稱可以得到該玩家的所有背包資料。 {instance.code}_inventories.inventoryCode // 將 inventoryCode 改為自訂的背包代碼,可以取得該背包的所有資料。 {instance.code}_inventories.myBag.slots // 可以取得背包代碼為 myBag 的容量大小。 {instance.code}_inventories.myBag.items // 可以取得背包代碼為 myBag 的所有物品資料。 {instance.code}_inventories.myBag.items.index // 可以取得該背包中,第 index 格的所有資料,index 請改為數字。 // index 是從 0 開始計算,故第一格為 0,第二格為 1,依此類推。 {instance.code}_inventories.myBag.items.0.item // 可以取得該背包中,第 0 格的物品資料。 {instance.code}_inventories.myBag.items.0.quantity // 可以取得該背包中,第 0 格的物品數量。 {instance.code}_inventories.myBag.items.0.equipped // 可以取得該背包中,第 0 格物品是否被裝備。 {instance.code}_inventories.myBag.items.0.slot // 可以取得該背包中,第 0 格物品的裝備位置。 {instance.code}_inventories.myBag.items.0.item.name // 可以取得該背包中,第 0 格物品的名稱。 // 將 name 改成其他屬性可以取得其他資料,例如: // code - 物品代碼, maxStack - 最大堆疊數量, stuffCode - 物品外型代碼, description - 物品描述 {instance.code}_inventories.myBag.items.0.item.datas // 可以取得該背包中,第 0 格物品的自訂屬性資料,於後方加上 .屬性名稱 即可取得該自訂屬性,例如: {instance.code}_inventories.myBag.items.0.item.datas.damage // 可以取得該物品中,自訂屬性 damage 的數值。 ``` ```typescript // 假設儲存玩家的代碼為 instance {instance.code}_equipmentSlot // 使用此變數名稱可以得到該玩家的所有裝備欄資料。 {instance.code}_equipmentSlot.slotType // 將 slotType 改為自訂的欄位類型,可以取得該欄位的所有資料。 // 所有資料包含 item, quantity, equipped, slot {instance.code}_equipmentSlot.mainHand.item // 可以取得裝備欄中,裝備類型 mainHand 的物品資料。 // item 後面可讀取的資料,如同讀取背包內的物品資料一樣。 {instance.code}_equipmentSlot.mainHand.item.name // 可以取得裝備欄中,裝備類型 mainHand 的物品名稱,其他依此類推。 ``` ## 跨事件表傳送 提供簡單的跨事件表傳送功能,可以**將玩家傳送到指定事件表的指定座標**上,只要在需要傳送玩家時,執行動作「傳送玩家」並填入事件表路徑,以及傳送座標,並且在目標事件表初始化玩家時,執行動作「讀取玩家位置」即可。 儲存玩家位置,實際上是將該**玩家目前所在的事件表路徑以及座標儲存於資料庫**,也就是說事件表的位置、名稱,即是玩家所在的地點,請在一開始就確定好事件表的位置以及名稱,並不要於日後隨意更改,否則可能會導致玩家的位置資料損壞。 傳送玩家,實際上就是一個會先執行「儲存玩家位置」,然後讓玩家執行目標事件表的動作。 而讀取玩家位置,則是會先讀取玩家位於資料庫中的位置,並且判斷當下所在的事件表是否為資料所存的事件表,若不是的話,會自動將該玩家轉移到目標事件表,如果是的話,就會傳送玩家到資料所儲存的座標。 此功能可以用於讓每張地圖都有自己的事件表,並使玩家可以在這些地圖間進行傳送,而非如同以往需要繪製一張大地圖,並使用分割區域來達成不同區域的效果,跨事件表可以有效的降低遊戲的負擔。 ## 作者 **[module_cook1470](/profile/64897095@github)**
# 更好的光暈戰記事件表擴充模組(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)
# JEventsEXP <table width="100%"> <tr> <th rowspan="2"> <a href="https://discord.gg/UNde4eaGuc" target="_blank"> <img src="https://imgur.com/HDw592N.png" width="110px"> <br> 珍・EventsEXP <br> <a href="https://discord.gg/UNde4eaGuc" class="mat-raised-button mat-primary "> 加入Discord </a> </a> </th> <th> 隨便寫的模組。 </th> <th> A casually written module. </th> </tr> <tr> <td> <pre> # 觸發 珍妮-擴充包/ └── 輸入/ └── 鍵盤序列 # 動作 珍妮-擴充包/ └── 變數/ └── 生成隨機整數陣列 └── 地圖/ └── 迷宮生成 └── 特效/ └── 角色/ └── 熱感應追蹤器 └── 自定熱感應追蹤器 └── 移除熱感應追蹤器 # 道具 └── 熱感應追蹤器 </pre> </td> <td> <pre> # Trigger Jennie-Expansions/ └── Input/ └── Keyboard Sequence # Actions Jennie-Expansions/ └── Variable/ └── Generate Random Integer Array └── Map/ └── Maze Generation └── Effect/ └── Actor/ └── Thermal Tracker └── Custom Thermal Tracker └── Remove Thermal Tracker # Item └── Thermal Tracker </pre> </td> </tr> </table> ## 作者 **[SinB.JN](/profile/108665576516229624668@google)** <details open> <summary> <a class="mat-raised-button mat-primary"> 更新日誌(Changlog) </a> </summary> ## [v0.1.5](/view/JEventsEXP/0.1.5) (2026-04-26) #### 新增 - [動作]特效/角色/自定熱感應追蹤器 - 顯示其他角色的即時位置熱感應追蹤 #### Added - [Actions]Effect/Actor/Custom Thermal Tracker - Show other actors' real-time positions with thermal tracking ## [v0.1.2](/view/JEventsEXP/0.1.2) (2025-06-25) #### 新增 - [動作]特效/角色/熱感應追蹤器 - 顯示其他角色的即時位置熱感應追蹤 - [動作]特效/角色/移除熱感應追蹤器 - 移除角色的熱感應追蹤器 #### Added - [Actions]Effect/Actor/Thermal Tracker - Show other actors' real-time positions with thermal tracking - [Actions]Effect/Actor/Remove Thermal Tracker - Remove thermal tracker from an actor ## [v0.0.8](/view/JEventsEXP/0.0.8) (2025-05-24) #### 新增 - [觸發]輸入/鍵盤序列 - 當一系列鍵盤按鍵和滑鼠按鍵依序被按下時觸發 #### Added - [Trigger]Input/KeyboardSequence - Trigger when a sequence of keyboard keys and mouse buttons is pressed ## [v0.0.7](/view/JEventsEXP/0.0.7) (2025-05-09) #### 新增 - [動作]地圖/迷宮生成 - 在選定的地圖區域(矩形或圓形)內以1x1物件生成迷宮 #### Added - [Actions]Map/Maze Generation - Generates a maze within a selected map region (rectangle or circle) with 1x1 object ## [v0.0.6](/view/JEventsEXP/0.0.6) (2024-08-31) #### 更改 - [動作]變數/生成隨機整數陣列 - 新增了對數量、最大重複次數和種子參數的變數輸入支持。 - 優化了錯誤處理和無效輸入的提示信息。 #### Changed - [Actions]Variable/Generate Random Integer Array - Added support for variable input for count, max repeats, and seed parameters. - Improved error handling and messaging for invalid inputs. ## [v0.0.5](/view/JEventsEXP/0.0.5) (2024-08-30) #### 更改 - [動作]變數/生成隨機整數陣列 - 新增了使用種子生成隨機數的選項。用戶現在可以選擇是否使用種子,並輸入一個特定的種子值來生成可重現的隨機數序列。 - 優化了用戶界面。 #### Changed - [Actions]Variable/Generate Random Integer Array - Added an option to use a seed for random number generation. Users can now choose whether to use a seed and input a specific seed value to generate reproducible random number sequences. - Improved the user interface. ## [v0.0.4](/view/JEventsEXP/0.0.4) (2024-08-29) #### 錯誤修復 - [動作]變數/生成隨機整數陣列 - 修復了當可用數字少於陣列長度時導致遊戲崩潰的問題。 #### Bug fixed - [Actions]Variable/Generate Random Integer Array - Fixed an issue where the game would crash when the number of usable integers was smaller than the array length. ## [v0.0.1](/view/JEventsEXP/0.0.1) (2024-08-29) #### 新增 - [動作]變數/生成隨機整數陣列 #### Added - [Actions]Variable/Generate Random Integer Array </details>
# TwilightWarsEventsEnhFF 本專案為 **TwilightWarsEventsEnh** 模組的 **beta版本** ,「FF」是「Fast Forward」的縮寫,代表快速開發。 因為原模組的開發緩慢,所以會逐漸把原模組的功能移植至本專案完善。 ## 前言 本專案主要由 **[雪姬](/profile/setsuki)** 維護。 歡迎加入 **[Discord群組](https://discord.gg/seJwuzCbWq)** 。 ## 使用須知 ***本專案開源,若有不明之處可查看 [test](cg://source/test/README.md)*** 本專案的主要目的是要讓事件表編輯如同寫程式一般。 不只專注於 **效能** ,會更著重在提供更大的 **彈性** 。 另外,本專案不會立即修復不嚴重的錯誤。 當測試穩定後,未來會將事件表功能從本專案移植回原模組,屆時該功能可能會在一段時間後,於本模組移除。 Enh的測試、回報需要你的參與,歡迎加入 **[Discord群組](https://discord.gg/seJwuzCbWq)** 。 ## 作者 **[EnhProject](/profile/EnhProject)** - **[不會取名字](/profile/buhuechuminzu)** - **[雪姬](/profile/setsuki)** --- # TwilightWarsEventsEnhFF "FF" stands for "Fast Forward", and can be considered as **beta version** of original **TWEventsEnh**. Due to slow updates of the original Enh, the functionality from mainline Enh would be porting and refined here. ## Additional This project is mainly maintained by [雪姬](/profile/setsuki). The **[Enh Discord server](https://discord.gg/seJwuzCbWq)** is also welcoming participants! ## Important ***It is recommanded to read source code and [test](cg://source/test/README.md) of this project!*** The main concept is to make events work as code. Not just focused on **performance**, but also provide more **flexibility**. This project will not repair bugs instantly unless they are critical. If there are any bugs, they will be fixed before integrated into the main Enh. Enh needs your participate for testing, asking questions or reporting bugs! Features merged into the mainline Enh will be removed here. ## Authors **[EnhProject](/profile/EnhProject)** - **[不會取名字](/profile/buhuechuminzu)** - **[雪姬](/profile/setsuki)**
# CgEventsLib The engine of CgEvents. CgEvents is a great way to build your own games with with a CG.built-in editor. ## Live Demo <a href="cg://source/test/physics.events" class="mat-raised-button mat-primary">Open Demo Events Sheet</a> ## Concept The engine takes a *.events file to run. The .events file is an encoded json which contains a config field and a events field. ```json { config: { stage: { width: "number", height: "number", resolutionPolicy: "showAll" | "exactFit" | "fixedWidth" | "fixedHeight" | "origin", alignHorizontal: "left" | "center" | "right", alignVertical: "top" | "middle" | "bottom" } }, events: [ { id: "string", triggers: [], checks: [], actions: [] }, ... ] } ``` Yon can edit the json with CG.built-in editor to control all your game events. ## How Events Work Each event contains a TRIGGER, some CHECKS, and some ACTION. The event flow works like this: 1. The TRIGGER of the event is triggered by the engine (keyboard pressed, event over, or maybe the hero collides with an enemy) 1. Once the trigger is triggered, the engine then goes check the CHECKS. 1. If all CHECKS pass, the engine executes all the ACTIONS in the event. ## Getting Started ```typescript let manager = new CgEventManager(); manager.importFromSource('CG.YourProject/yourGame.events') .then(() => manager.preload()) .then(() => manager.start()) ; ``` ## Versioning We use [SemVer](http://semver.org/) for versioning. ## Authors * **[Haskasu](/profile/Haskasu)**
# Base2 重新架構的Base2,相比Base少了很多功能,包括Pixi/Sound/ResourceManager/Physics/geoms都被拿掉,只留最主要的CG功能。 ## 基本功能 1. 取得專案的資料 ```typescript // 取得專案代碼 CG.Base2.projectCode; // 取得資源 CG.Base2.getAppResource(resourceAlias: string) // 取得資源網址 CG.Base2.getAppResourceFileUrl(resourceAlias: string, filename?: string) ``` ## 更新循環 Base2內建了一個更新循環系統。 ```typescript // 先定義一個每幀都要更新的函式 function updateFunc(dt: number) { } // 將函式加入更新循環系統 CG.Base2.addUpdateFunction(updateFunc); // 將函式移出更新循環系統 CG.Base2.removeUpdateFunction(updateFunc); ``` 另外也提供子更新循環系統可使用。 ```typescript import Updater = CG.Base2.utils.Updater; // 先定義一個每幀都要更新的函式 function updateFunc(dt: number) { } // 建立子更新循環系統 let updater = new Updater(); // 將函式加入更新循環系統 updater.addDelayFunction(updateFunc); // 可暫停 updater.pause(); // 可繼續 updater.resume(); ``` ## 鍵盤管理員 Base2提供了一個基本的鍵盤管理員,可以在按鍵被按下去(DOWN)、提起來(UP)、先按再提(PRESSED)的時候觸發事件。 ```typescript // 取得鍵盤管理員 import Keyboard = CG.Base.keyboards.Keyboard; import keyboard = CG.Base2.keyboard; import Key = CG.Base2.keyboards.Key; // 鍵盤事件 keyboard.on(Keyboard.EVENT.DOWN, (event: KeyboardEvent) => { if (Key.SPACE.matchEvent(event)) { // 當空白鍵被按下去的時候... } }) // 檢查目前按鍵狀態 if (keyboard.isDown(Key.SPACE)) { // 目前空白鍵是正在按下去的狀態 } ``` ## 補間變化 Base2內建了[tweenjs](https://github.com/tweenjs/tween.js)用來將某個物件的屬性,在一段時間內作動態的變化。 ```typescript async function makeAnimation() { // 建立一隻有x,y資料的動物 let animal = { x: 100, y: 100, }; // 建立補間變化,在1秒內讓動物的x和y變化到指定的值 let tween = new TWEEN.Tween(animal); tween.to( { x: 300, y: 200, }, 1000 // 毫秒 ); tween.start(); // 等待變化完畢 await CG.Base2.waitTween(tween); console.log(animal.x); // 這時會印出 300 } ``` ## JSZip Base2內建[JSZip](https://stuk.github.io/jszip/)。 ```typescript async function loadZip() { let zip = new JSZip(); await zip.loadAsync(buffer); for(let filename in zip.files) { ... } } ```
# TwilightWarsEventsExp <h2><font color=red> 本模組由於過於雜亂,為了提高可維護性,以及進行效能優化,將開始進行程式碼的重構計畫。 如有需要請改用 [TWEventsBetterExp](https://code.gamelet.com/edit/TWEventsBetterExp) 模組,近期會開始慢慢將本模組的部分功能搬遷過去。 未來本模組將不再添加新功能,僅進行維護,如非必要請勿加載此模組。 </font></h2> 本專案為光暈戰記的擴充模組,主要是建立在 **[TwilightWarsLib](/edit/TwilightWarsLib)** 的基礎之上,添加一些小東西。本專案並不包含 **[TwilightWarsEvents](/edit/TwilightWarsEvents)** 模組。 本模組並不會覆蓋原有的動作、檢查,所有本模組新增的檢查、動作等,都會被整合在**光暈戰記 / 擴充包**內,且不會新增任何跟光暈無關的檢查或動作,希望是一個純淨的光暈模組,跟光暈無關的相關事件,有需要的話會在 **[CgEventsExp](/edit/CgEventsExp)** 做更新。 本專案開放查詢原始碼,所有的檢查、動作,皆有在本專案的 **Test** 資料夾內做實際範例,歡迎自行查看使用方法,也歡迎自行進入程式區內,看各個檢查、動作是如何完成。 本人希望弄一個可以讓大家互相交流、維護,甚至更新的這麼一個光暈同人模組,我覺得這樣共同成長,才會讓嘎母變得更成熟,所以如果你有什麼好想法,也都歡迎提供給我。 另外個人創了一個第三方的 **[嘎母討論區(Discord)](https://discord.gg/hZKQzRfPJM)** ,主要是希望大家有一個好的交流平台,可以一起討論一些設計,除了光暈,還有其他非光暈的專案等等,甚至是能夠一起合作,讓作者們有機會推出更多優質的作品。 有任何 BUG 的話都歡迎回報,會盡量在最短的時間內處裡掉。 **[Google 試算表 - 光暈戰記](https://docs.google.com/spreadsheets/d/1kRPdI6caisjZuHJGmCjB3kHBveR2RVAeTJoyCmqOZVs/edit?usp=sharing)** 本專案有些需要查詢的地方,例如武器道具的索引值等等,可以由此試算表查詢。 ## 其他工具 - [ImageIndex 查詢器](https://paint.gamelet.online/?version=0.0.27) ## 作者 **[cook1470](/profile/cook1470)**
# EnhBase 此模組的目標為提供一個框架,使得各模組可以透過Socket傳訊、執行特定功能等;同時希望降低各模組的依賴項,將單一模組內容以更細的粒度拆分,需要特定功能時才載入對應之模組。 此模組之更新時間與更新之功能不定,如果有任何新想法,歡迎加入[Discord群組](https://discord.gg/seJwuzCbWq)一起討論。 此模組初期可能會經過大量修改,以確定設計方向,故本模組並不穩定,如想使用請謹慎考慮。 ***建議可以先查看模組測試的部分,其中的unit_test資料夾可以參考,內含檔案同時是範例實作。*** ## 如何使用 可以透過下列程式碼以完成註冊: ```typescript let lib_name: string // 函式庫之名稱 let user: BasicUser<any> = CG.EnhBase.core.libManager.registerLib(lib_name); ``` 欲接受傳入資料,請使用下列程式碼: ```typescript let socket_unique_name: string // 可辨識之Socket名稱 let socket: Socket = user.createSocket(); socket.addHandler("data", function(data, senderCode) { // 處理資料如何使用 }) socket.listen(socket_unique_name); ``` 而欲傳輸資料給目標Socket,請使用下列程式碼: ```typescript let target_socket_name // 目標Socket名稱 socket.send("YOUR_DATA", target_socket_name); ``` --- ## 變數表功能 接續前面,假設已經取得了BasicUser物件,預設該物件會帶有一個變數表,透過下列程式碼存取: ```typescript const varTable = lib.varTable; ``` 預設該變數表會啟用保護功能,禁止外部存取,於v0.0.2引入了保護用的Key,設定為true或false可控制外部是否可存取,未來可能會更動,請謹慎使用。 ```typescript // enable protection varTable.setValue(BaseVariableTable.ABILITYS.PROTECT, true, true); // or varTable.removeValue(BaseVariableTable.ABILITYS.PROTECT) varTable.setValue(BaseVariableTable.ABILITYS.PROTECT, true); // disable protection varTable.removeValue(BaseVariableTable.ABILITYS.PROTECT) // or varTable.setValue(BaseVariableTable.ABILITYS.PROTECT, false, true); ``` 同時,就算沒有LibUser物件,也可以直接利用 ```typescript let varTable = new SimpleVariableTable(); // or (syncable) let varTable = new GenericVariableTable(); ``` 以取得變數表,並透過下列方法將變數表註冊於manager上: ```typescript core.getInstance<VariableTableManager>("VariableTableManager").addVariableTable(varTable); // or core.variableTableManager.addVariableTable(varTable); ``` ## Authors **[EnhProject](/profile/EnhProject)** - [不會取名字](/profile/buhuechuminzu) - [雪姬](/profile/setsuki)
# Desperate City Armory — 武器系統模組使用教學 > ## ⚠️ !!注意!! 在使用前需要先初始化武器 > 在遊戲開始時(通常是「初始化」事件),**必須**先執行 `InitGameData` 動作,否則所有武器功能都不會正常運作。 > > ``` > 事件:初始化 > 動作:InitGameData > ├── 武器資料別名:datas_weaponType(預設) > ├── 殭屍資料別名:datas_zombieType(預設) > └── 除錯日誌:false(正式版請關閉) > ``` --- ## 目錄 1. [模組架構](#模組架構) 2. [初始化設定](#初始化設定) 3. [新增武器到地圖](#新增武器到地圖) 4. [讓角色裝備武器](#讓角色裝備武器) 5. [自訂武器處理器(Actions)](#自訂武器處理器) 6. [weapon_utils 工具函式](#weapon_utils-工具函式) 7. [datas_gameConfig 武器資料設定](#datas_gameconfig-武器資料設定) 8. [新增武器的完整流程](#新增武器的完整流程) 9. [注意事項與常見問題](#注意事項與常見問題) --- ## 模組架構 ``` datas/ ├── datas_gameConfig.ts ← 武器資料定義(FarWeaponData)與 WeaponTypeData 管理器 └── weapon/ ├── weapon_utils.ts ← 共用工具函式(registerWeapon、actorCustomGAF 等) ├── InitGameData.action.ts ← 【必須】初始化動作,負責事件監聽與切換偵測 ├── WeaponActions.action.ts ← WeaponSpawn(生成武器到地上) ├── WeaponEquip.action.ts ← WeaponEquip(讓角色裝備武器) └── weapons/ ├── Demo_actions.ts ← 新增武器用的模板 ├── Barret_actions.ts ├── AA12_actions.ts ├── M249_actions.ts ├── P90_actions.ts ├── MP5_actions.ts ├── SCAR_actions.ts ├── M200_actions.ts ├── Revolver_actions.ts ├── Gating_actions.ts ├── GrenadeGun_actions.ts ├── Crossbow_actions.ts ├── SR16_actions.ts ├── ElectricGun_actions.ts ├── AUG_actions.ts └── CombatShotgun_actions.ts ``` --- ## 初始化設定 > ### ⚠️ 使用前必須先執行 InitGameData,否則所有武器功能不會正常運作! `InitGameData` 會執行以下工作: - 載入所有武器資料(`WeaponTypeData`) - 建立自訂彈匣(`initMagazines`) - 註冊所有武器處理器(Handler) - 掛上 `ACTOR_PICKUP_STUFF`、`ACTOR_DROP_STUFF`、`ACTOR_FIRE` 事件監聽 - 啟動輪詢(每 100ms)偵測武器切換與裝填 **動作參數說明:** | 參數 | 說明 | 預設值 | |------|------|--------| | 武器資料別名 | JSON 資源的別名 | `datas_weaponType` | | 殭屍資料別名 | JSON 資源的別名 | `datas_zombieType` | | 除錯日誌 | 開啟後顯示詳細 log,上架前請關閉 | `false` | --- ## 新增武器到地圖 使用 `WeaponSpawn` 動作將武器放到地圖上。 **動作參數說明:** | 參數 | 說明 | |------|------| | 武器種類 | 從下拉選單選擇 | | 位置 | 在地圖上點選位置 | | 道具代碼 | 武器物件的事件代碼(`item*` 自動生成唯一代碼) | | 區域變數名稱 | 儲存道具代碼的區域變數 | | 除錯日誌 | 顯示生成 log | **支援的武器種類:** | 武器代碼 | 武器名稱 | 特效 | 自訂音效 | |---------|---------|------|---------| | `barret` | 巴雷特 | GAF ✅ | ✅ | | `m249` | M249 | GAF ✅ | ✅ | | `p90` | P90 | GAF ✅ | ✅ | | `mp5` | MP5 | GAF ✅ | ✅ | | `scar` | SCAR | GAF ✅ | ✅ | | `m200` | M200 | GAF ✅ | ✅ | | `revolver` | 左輪槍 | GAF ✅ | ✅ | | `gating` | 加特林 | GAF ✅ | ✅ | | `aa12` | AA-12 | GAF ✅ | ✅ | | `combat_shotgun` | 戰鬥霰彈槍 | — | ❌ | | `aug` | AUG | — | ✅ | | `sr16` | SR-16 | — | ✅ | | `electric_gun` | 電擊槍 | — | ✅ | | `grenadegun` | 榴彈槍 | ❌ | ❌ | | `crossbow` | 弩 | GAF ✅ | ✅ | | `uzi` | 烏茲 | — | — | | `mk18` | MK18 | — | — | | `svd` | SVD | — | — | | `glock17` | 格洛克17 | — | — | | `victor` | 維克托 | — | — | | `m2_machinegun` | M2機槍 | ❌ | ❌ | --- ## 讓角色裝備武器 使用 `WeaponEquip` 動作讓角色直接持有武器(不需要從地上撿起)。 **動作參數說明:** | 參數 | 說明 | 預設值 | |------|------|--------| | 角色代碼 | 目標角色 | 必填 | | 武器種類 | 從下拉選單選擇 | `barret` | | 裝備在哪一手 | -1 當前手 / 0 第一手 / 1 第二手 | `-1` | | 裝備後切換至此武器 | 裝備後立即切換 | `false` | | 在角色位置放下之前的武器 | 換武器時丟棄舊武器 | `false` | | 設為角色預設武器 | 手空時自動拿出 | `false` | | 除錯日誌 | 顯示裝備 log | `false` | --- ## 自訂武器處理器 每把有 GAF 動畫或自訂音效的武器,需要一個對應的 `_actions.ts` 檔案。**複製 `Demo_actions.ts` 作為起點。** ```typescript const myHandler: WeaponHandler = { stuffCode: 'cusfar_myWeapon', // 對應 WEAPON_DATAS 的 stuff 欄位 onPickup(actor, game, manager) { // 撿起武器:隱藏引擎動畫、設旗標、播 GAF setActorDisplayVisible(actor, 'rightHand', false); setActorDisplayVisible(actor, 'leftHand', false); setWeaponAlpha(actor, 0); setGlobal(manager, `${actor.code}_hold_myWeapon`, 1); actorCustomGAF({ ..., linkage: 'Idle', stop: true }); }, onFire(actor, game, manager) { // 開槍:播射擊動畫 + 音效 actorCustomGAF({ ..., linkage: 'Shoot' }); mapSoundEffect(game, actor, 'Desperate_City.myWeapon_music', 1.0); }, onReload(actor, game, manager) { // 裝填:播裝填動畫 actorCustomGAF({ ..., linkage: 'Reload' }); }, onUnequip(actor, game, manager) { // 卸除:移除 GAF、清旗標、恢復引擎動畫 actorCustomGAF({ actorCode: actor.code, actorCustomGAFCode: gafCode(actor), add: 'remove' }); setGlobal(manager, `${actor.code}_hold_myWeapon`, 0); setActorDisplayVisible(actor, 'rightHand', true); setActorDisplayVisible(actor, 'leftHand', true); setWeaponAlpha(actor, 100); }, }; export function registerMyWeapon(): void { registerWeapon(myHandler); } ``` --- ## 新增武器的完整流程 1. **複製 `Demo_actions.ts`**,改名為 `MyWeapon_actions.ts` 2. **修改三個常數**:`STUFF_CODE`、`GAF_ALIAS`、`HOLD_SUFFIX` 3. **調整各 handler** 的 linkage、fps、音效等細節 4. **`InitGameData.action.ts`** 加上 import 和 `registerMyWeapon()` 呼叫 5. **`datas_gameConfig.ts`** 的 `WEAPON_DATAS` 加上武器設定 --- ## 注意事項與常見問題 ### Q:武器沒有子彈特效? 確認 `SpawnedFarWeapon` 沒有 override `createBulletsData` 方法,必須使用引擎原始邏輯。 ### Q:onPickup 沒有觸發? 確認 `stuffCode` 能被 `_resolveStuffCode` 正確對應,系統嘗試順序: 1. 直接查 handler(如 `cusfar_barret`) 2. 去掉 `cusfar_` 前綴(如 `SCAR`、`p90`) 3. 去掉 `homemade_` 前綴(如 `m249`) ### Q:切換武器時 GAF 沒更新? 系統每 100ms 輪詢 `_currentWeapon`,偵測切換時觸發 `onUnequip`(舊)+ `onPickup`(新)。初次撿起由 `ACTOR_PICKUP_STUFF` 事件負責。 ### Q:引擎手持動畫沒有隱藏? 確認 `datas_gameConfig` 裡該武器設定 `hasCustomAnim: true`。 ### Q:clip 設什麼? - 使用 `TwilightWarsLib.actors` → 填 `lib_rifle`、`lib_handgun`、`lib_shotgun` 等 - 使用自訂資源 → 填該資源內的 linkage 名稱(如 `mp5_clip`、`barret_clip`) ### Q:weaponCode 需要手動填? 大多數情況不需要,系統自動從 `stuff` 推算。以下需手動填: - `gating`:`weaponCode: 'gating_gun'` - `m249`:`weaponCode: 'homemade_m249'` ## Authors **[Autumn](/profile/113266227571469019286@google)**
# GLT One Paragraph of the game description goes here ## Getting Started ### Auth (Login) ```typescript // All action must wait until auth system is ready. CG.GLT.auth.onReady(user => { if(user.isLocalGuest()) { // not login yet } else { // logged in user } }); // auth event listener, triggered when auth user changed let authListener = CG.GLT.auth.onAuth(user => { if(user.isLocalGuest()) { // logged out } else { // logged in user } }); // auth event listener, triggered when validating a new auth action // a following onAuth event is expected. this.validatingListener = onAuthValidating(() => { // show loading animation }); ``` ### API The CG.GLT.api is responsible to communicate with glt.gamelet.online. CG.GLT.commands includes all comments to query/submit data from glt.gamelet.online. The commands has a function submit() that uses CG.GLT.api.submitCommand(), so most of the time, you don't need to call the api to submit. ```typescript CG.GLT.commands.scoreService.submitScore( 'challenge', // the name of the score to submit 10, // the score SubmitType.KEEP_HIGHEST, // submit only when the new score is greater than the one on server TimeRange.ALL // submit to all time-ranges (history and weekly) ) .submit(); // to receive the weekly high score list CG.GLT.commands.scoreService.listScores( 'challenge', // the name of the scores to get TimeRange.WEEKLY, // in which time range OrderType.HIGH_TO_LOW, // how to order the scores CG.GLT.api.lastUpdatedServerTimestamp, // tell the server which week to see 0, // start index 10, // how many to get (list: UserScoreList) => { // do something with the scorelist }, (error) => { // deal with error } ) ``` ## Authors **[Haskasu](/profile/113321052805704333314@google)**
ⒸCode.Gamelet.com | Privacy Policy | Terms of Service