C .
ODE
G
AMELET
# 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
# 花靈宮模組 - 作者 **[妮娜](/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角色包括同人陣營選項)
# 更好的光暈戰記事件表擴充模組(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)
# 更好的 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)
# 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)**
# 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>
<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 同伴)可以攻擊到哪些原本打不到的友軍,其餘設成打不到。 - **設定角色身分與外觀** - 設定角色的身分與外觀。 - **設定角色死亡音效** - 將角色死亡時播放的音效換成指定的音效資源、設為靜音,或恢復系統預設。 - **角色裝備武器** - 讓角色裝備指定武器。 - **角色切換武器** - 讓角色切換到指定的武器手。 - **角色切換預設武器** - 將所選手位裝回預設武器。 - **悄悄設定預設武器** - 設定角色每手的預設武器,不改變當下手持。 - **角色移到相對位置** - 將角色移動到目標角色面向基準下的相對位置。 - **角色交換位置** - 交換兩個角色的位置。 - **角色推拉目標** - 沿著角色與目標角色之間的連線推遠或拉近目標角色。 - **打斷集氣** - 打斷目標角色正在進行的集氣。 - **角色跳躍** - 令角色跳到目標,可關閉跳躍音效、起跳塵土與穿釘鞋落地踩傷。 - **鎖定自然回氣** - 鎖定角色的自然回氣,上鎖後氣只消耗不回升。 - **設定玩家控制鎖** - 鎖定或解除玩家的操作。 - **設定NPC控制鎖** - 鎖定或解除非玩家角色的移動、面向、攻擊、換武器與撿取(武器與道具)。 - **衝刺** - 令角色依面向或角度衝刺一段距離,無斬光、傷害與音效。 - **設定角色身體動畫** - 設定角色身體動畫並可播到指定結束幀;切換到下一段同名動畫時不會互相打斷。 - 技能 - **施展技能** - 讓目標角色直接發動(施展)一個技能。 - **居合斬** - 令一名角色執行一次居合斬攻擊,可選擇是否使用內建居合姿勢(關閉時保留武器原本的動畫)。 - **龍波** - 放出一條龍波,可設定能飛越的地形高度。 - 遊戲 - **觸發天啟事件** - 觸發光暈戰記原版的天啟事件。 - **顯示通知** - 顯示右上角遊戲通知訊息。 - 任務 - **設定計時器** - 開始、繼續、暫停或關閉任務計時器。 - 道具 - **設定拳譜書掉落** - 在指定位置掉落綁定指定拳譜的拳譜書。 - **給予拳譜** - 讓玩家角色學會拳譜或增加拳譜經驗。 - 特效 - **老花畫面** - 套用老花眼畫面效果。 - **下雨特效** - 效能最佳化的下雨,雨勢開高仍流暢;落下雨絲與落地水花,可設雨勢、顏色、風向、風速與雨聲,並可一起打雷。 - **移除特效** - 移除一個或全部《へいわの事件集》畫面特效、角色的頭上標記,或停止下雨特效。 - **標題文字** - 在畫面上顯示標題文字。 - **頭上標記** - 在角色頭上跳出標記。 - 檢查 - 角色 - **角色屬性** - 檢查角色的數值屬性。 - **角色身分與外觀** - 檢查角色的身分與外觀。 - **角色武器** - 檢查角色的武器狀態。 - **角色集氣狀態** - 檢查角色是否正在集氣。 - **角色相對關係** - 檢查角色與目標角色之間的相對關係。 - **技能狀態** - 檢查角色是否正在進行技能。 - **自然回氣鎖狀態** - 檢查角色的自然回氣是否被鎖定。 - **角色戰鬥對象** - 檢查 AI 角色目前的戰鬥對象。 - 遊戲 - **玩家控制鎖狀態** - 檢查玩家操作目前是否被鎖定。 - 任務 - **計時器進度** - 檢查目前任務計時器進度。 - 觸發 - 角色 - **角色開始集氣** - 當角色開始集氣近身武器技能時觸發。 - **技能狀態結束** - 當角色技能狀態結束時觸發。 - **黑手套觸發** - 當角色被黑手套搓中、當前技能產生反應時觸發。 - **角色失去戰鬥目標** - 當 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>
# 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)**
# 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: - **視野區域偵測** 當角色碰到視野區域時觸發。 ---
# 可視化光暈任務表創建器 (TWSeasonsJsonBuilder) 使用事件表創建你的 `seasons.json`、`seasons.ts`、`app.ts` 吧! --- ### 簡介 光暈任務季度表 Json 創建器 是一個用於光暈戰記 (TwilightWars) 的任務季度表的建構工具。 你可以透過事件表 (.events) 動作可視化地創建任務、章節、季度資訊,並輸出為 JSON 或 TypeScript 檔案。 本創建器的作者為 **[妮娜(LoliPrincessNina)](/profile/LoliPrincessNina)** 。 ### 功能特色 - ✅ 可視化編輯任務、章節、季度資訊 - ✅ 支援 HTML 表格格式輸出(往世樂土規格) - ✅ 支援自定義開放條件(章節前置、任務前置、勳章前置、跨任務變數) - ✅ 支援多陣營(基本三陣營、花靈宮、盜賊幫、無魂軍、智械兵團、蒼鎧營) - ✅ 輸出 `seasonsJson` / `seasons.ts` / `app.ts` ### 使用方法 #### 1. 新增任務資訊 填入任務代碼、名稱、事件表檔案路徑、參與人數、陣營等基本資訊,可選擇是否使用 HTML 表格格式輸出任務說明。 #### 2. 新增章節資訊 填入章節代碼、名稱,可設定開放條件、章節說明、勳章顯示,並從變數載入或手動填寫任務列表。 #### 3. 新增季度資訊 填入季度名稱,可設定開放條件,並從變數載入或手動填寫章節列表。 #### 4. 輸出 JSON 將建立的季度/章節/任務輸出為 JSON 或 TypeScript 檔案,可選擇下載為檔案或輸出到控制台。 #### 5. 輸出 app.ts 生成專案的 `app.ts` 入口檔案,包含季度載入、陣營設定、FPS 顯示等設定。 #### 6. 彈出技能系統訊息 在遊戲中彈出技能限制的系統訊息,並可同步修改遊戲的技能等級上限。 ### 範例程式碼 ```typescript import SeasonsJsonBuilder = CG.TWSeasonsJsonBuilder.SeasonsJsonBuilder; const builder = new SeasonsJsonBuilder(); // 建構開放條件 const openCondition = builder.buildOpenCondition( "chapter_1", // 所需章節 "mission_1_1", // 所需任務 undefined, // 所需任務完成(無視重置) "badge_001", // 所需勳章 [{ key: "flag", value: true }] // 跨任務變數 ); // 建構任務 const mission = builder.buildMissionInfo( "mission_001", // 任務代碼 "新手任務", // 任務名稱 true, // 開放條件(永久開放) "./mission_001.events", // 檔案路徑 ["這是一個新手任務"], // 任務說明 "擊敗所有敵人", // 主要目標 "隊伍全滅", // 失敗條件 1, 4, // 最少/最多人數 ["royal", "skydow"], // 可使用陣營 2, // 近武能力(2=全部開放) "close", // 房間類型 true, // 允許踢人 true, // 使用HTML表格 false, // 強制基本三陣營 false // 強制Lv2 ); // 批量建立任務 const missions = builder.massCreateMissions([ { code: "mission_001", name: "新手任務", open: true, file: "./mission_001.events", desc: ["這是一個新手任務"], goal: "擊敗所有敵人", fail: "隊伍全滅", minPlayers: 1, maxPlayers: 4, camps: ["royal", "skydow"], useAbility: 2, roomType: "close", canKickPlayer: true, useHtmlTable: true } ]); ```
# 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)**
<center><strong> <font size=5> <font color=EA7869> # 光暈戰記武器素材擴充包(TwilightWarsWeaponsResource) </font> </font> </strong><br> <font color=7869EA> <strong> <font size=4> <font color=7869EA> # 本模組為光暈戰記同人陣添加多種武器外觀 </font> </font> </strong><br> <strong> <font size=4> <font color=EA7869> <details> <summary> <strong> <font size=4> <font color=EA7869> ## 手動新增自創武器教學(點擊打開) </font> </font> </strong> </summary> <br> <font color=7869EA> 點開事件表(.events)的<strong>光暈戰記遊戲設定</strong> <br><br> ![](https://i.imgur.com/bnCBKkk.png) <br><br> 找到下方的<strong>自製近身武器</strong>與<strong>自製遠程武器</strong> <br><br> ![](https://i.imgur.com/Al86kNu.png) </font><br><br><br> <strong> <font size=4> <font color=EA7869> </details> <details> <summary> <strong> <font size=4> <font color=EA7869> ## 預置武器修改教學(點擊打開) </font> </font> </strong> </summary> <br> <font color=7869EA> <a href="cg://source/CG.TwilightWarsWeapons/Preset.events" class="mat-raised-button mat-primary">預置事件表</a> <br><br> 找到最左側<strong>檔案總管</strong>內,<strong>CG.TwilightWarsWeapons</strong> 之中的<strong>Preset.events</strong>,右鍵<strong>複製檔案</strong>,更新後就不會遺失改過的設定 <br><br> ![](https://i.imgur.com/svcKdMk.png) <br><br> 找到複製後的<strong>Preset_copy.events</strong>,接著就能依照自己的喜好修改預置武器 <br><br> ![](https://i.imgur.com/Cuu5mUp.png) <br><br> 改完之後,找到需要使用自創武器的事件表選擇<strong>設定</strong> <br><br> ![](https://i.imgur.com/JBQr85k.png) <br><br> 在<strong>預先載入</strong>的地方把剛剛的<strong>Preset_copy.events</strong>打勾,就可以使用裡面的武器了 <br><br> ![](https://i.imgur.com/cd1zJkg.png) <br><br> </font> </details> <details> <summary> <strong> <font size=4> <font color=EA7869> ## 預置武器事件表更新教學(點擊打開) </font> </font> </strong> </summary> <br> <font color=7869EA> 首先刪除原本在 CG.TwilightWarsWeapons 資料夾中的<a href="cg://source/CG.TwilightWarsWeapons/Preset.events" class="mat-raised-button mat-primary">預置事件表</a> <br><br> 接著更新模組 <br><br> 打開最新版本的<a href="cg://source/CG.TwilightWarsWeapons/Preset.events" class="mat-raised-button mat-primary">預置事件表</a> <br><br> 點開右上角的**編輯原始資料(JSON)** <br><br> ![](https://i.imgur.com/QH5bVdp.png) <br><br> 找到武器代碼,從上方**逗號與大括號**一次框選到下方相對位置的**大括號**(可以從顏色判斷)並複製 <br><br> ![](https://i.imgur.com/iOI38jq.png) <br><br> ![](https://i.imgur.com/MyDAyGa.png) <br><br> 最後複製到 **自己的** 預置武器事件表之中的對應位置內就完成了 <br><br> ![](https://i.imgur.com/QH5bVdp.png) <br><br> </font> </details> <strong> <font size=5> <font color=EA7869> ## 作者 </font> </font> </strong> <strong> <font size=5> <font color=7869EA> 阝千翎 </font> </font> </strong> **[<img src="https://gamelet.online/clients/assets/v1/img/cg_logo.png" width="30px" /><a href="https://code.gamelet.com/profile/Chinatsu" target="_blank" style="color:#55BBFF;">CG](/profile/117336754650487480063@google)**</a> **[<img src="https://gamelet.online/clients/assets/v1/img/gamelet_icon.png" width="30px" /><a href="https://gamelet.online/user/117336754650487480063@google/board" target="_blank" style="color:#55BBFF;">嘎姆](https://gamelet.online/user/117336754650487480063@google/board)**</a> **[<img src="https://play-lh.googleusercontent.com/Qolm5gr9jnabjk-0z79srjYC1XPVExribNz5kbDmGJeEtmRlo0UQoQEIkKMHRyt5paw" width="30px" /><a href="https://www.youtube.com/channel/UCALDNiLyfHERP13-BG9xpFQ?sub_confirmation=1" target="_blank" style="color:#55BBFF;">YouTube](https://www.youtube.com/channel/UCALDNiLyfHERP13-BG9xpFQ?sub_confirmation=1)**</a> **[<img src="https://cdn-icons-png.flaticon.com/256/1384/1384065.png" width="30px" /><a href="https://twitter.com/V_chiurin" target="_blank" style="color:#55BBFF;">推特](https://twitter.com/V_chiurin)**</a> **[<img src="https://cdn.iconscout.com/icon/free/png-256/twitch-11-461838.png" width="30px" /><a href="https://www.twitch.tv/haokute39171765" target="_blank" style="color:#55BBFF;">Twitch](https://www.twitch.tv/haokute39171765)**</a> **[<img src="https://cdn-icons-png.flaticon.com/512/145/145802.png" width="30px" /><a href="https://www.facebook.com/profile.php?id=100041014581991" target="_blank" style="color:#55BBFF;">facebook](https://www.facebook.com/profile.php?id=100041014581991)**</a> </center>
# 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)**
# 光暈戰記 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)**
# 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) { ... } } ```
ⒸCode.Gamelet.com | Privacy Policy | Terms of Service