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
# 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.on("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); ``` ## Authors **[EnhProject](/profile/EnhProject)** - [不會取名字](/profile/buhuechuminzu) - [雪姬](/profile/setsuki)
# TwilightWarsEventsExp 本專案為光暈戰記的擴充模組,主要是建立在 **[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)** ### **[More modes](/profile/64897095@github)**
# 花靈宮模組 - 作者 **[妮娜](/profile/LoliPrincessNina)** - 使用此模組為你的專案增加新的陣營和技能 - 注意電腦AI使用技能時有機會比較蠢 - 過快使用技能將會有概率出BUG - 此為測試版本,有BUG很正常 - 查詢及回報請到<b><a href="https://gamelet.online/user/nina/board">我的留言板</a></b> # 說明 - 為了方便各位照搬/測試花靈宮的任務,此處將填上花靈宮裡所有用到的觸發/檢查/動作 - 有相當一部分代碼是來自TwilightWarsEventsExp和CgEventsExp(下方不列出;部分存在變更,與原版有差異) - 若希望使用以上觸發/檢查/動作,請用原版,此處不會有更新 ## 目前提供支援的有: ## 陣營 - 花靈宮 - 盜賊幫 - 無魂軍 - 智械兵團(缺失: 小刀LV2、大刀LV2、冰劍LV1、水晶弓LV1) <!-- --> ## 觸發 #### 角色 - 角色說話 - 人物受傷(內建排除傷害類型/傷害數值比對) <!-- --> ## 檢查 #### 技能 - 角色技能狀態 - 手持武器技能 #### 角色 - 角色狀態附加 - 角色面向某物 - 角色燃燒狀態 - 角色B是否角色A的敵人 #### 地圖 - 可行走座標 - 兩點之間的距離 #### 存讀 - 儲存變數 - 在陣列中找到字串 #### 地圖機關 - 燭火機關狀態 - 找出所有地圖機關(迴圈) <!-- --> ## 動作 - 筆記 #### 角色 - 新增角色 - 角色漂浮能力 - 設定角色演員 - 移動角色位置 - 設定角色大小 - 角色可否攻擊 - 角色死亡訊息 - 人物停止說話 - 角色特殊屬性 - 取得玩家陣營演員角色 - 角色醉酒管理 - 角色反彈子彈 - 放下旗幟 - 鎖定面向方向 - 傳送角色加血訊息 - 傳送角色傷害訊息 - 傳送角色閃現至定點訊息 #### 技能 - 角色結束技能 - 限制使用技能 - 設定武器技能 - 傳送技能訊息 #### 任務流程 - 跳出系統訊息 - 更多遊戲規則 - 背包道具設定 - 角色對己說話 - 改變任務代碼 #### 存讀 - 工作階段儲存空間數據庫存取 - 以符號分離字串 - 定義Json變數 - 轉換Json為字串 - 轉換Json為物件 #### 特效 - 聖靈治療特效 - 白鳥拳 - 角色燃燒狀態 - 應用攻擊特效 - 震地特效 - 吸血血刃特效 - 劍氣光彈 - 新增地圖痕跡 - 散發冰氣特效 - 發射火箭 - 快跳文字 - 散發光環特效 - 衝擊波 - 新增地圖動畫 - 擊退人物 - 光印 - 冷卻特效 - 防護罩特效 - 防護罩泡泡特效 - 冰魂護盾特效 - 血滴特效 #### 武器道具 - 切換預設武器 - 切換至另一手 - 裝填武器彈藥 - 新增任務道具 - 新增武器道具 - 人物裝備道具 - 人物裝備武器 - 移除武器道具 - 玩家背包道具擁有的數量 #### 地圖 - 隨機可行走座標 #### 隨機 - 隨機設定陣營 - 隨機角色演員 - 隨機使用技能 - 隨機物件代碼 - 隨機字串 #### 陣營 - 設定陣營暱稱 - 新增陣營 - 改變陣營色彩風格(4個子項被拆分成2個新動作) #### 地圖機關 - 控制燭火機關 - 新增可推石塊
# CgEventsExp 本模組用於 CG 編輯器的擴充。 可至專案內 **Test** 資料夾,查看各動作、檢查的範例。 ### 動作 - 更新 - 顯示 - 更新文字 - 更新顯示物件 - 更新畫面遮罩 - 攝影機 - 設置攝影機焦點 - 系統 - 控制台輸出 - 儲存Cookies - 讀取Cookies - 開啟URL - 取得日期 - 輸出檔案 - 上傳檔案 - 設置 Debug 控制台 - 呼叫函數 - 彈出視窗 - 彈出確認視窗 - 彈出選項視窗 - 彈出輸入視窗 - 彈出複製字串視窗 - 彈出載入視窗 - 關閉彈出視窗 - 彈出複數字串輸入視窗 - PIXI 視窗 - 顯示自訂義 PIXI 視窗 - 關閉自訂義 PIXI 視窗 - 背包視窗 - 顯示背包視窗 - 更新背包視窗 - 變數 - 儲存區域變數 - 儲存全域變數 - 複數儲存區域變數 - 複數儲存全域變數 - 複數儲存物件變數 - 儲存 Json 變數 - 補間動畫 - 數學 - 計算兩點距離 - 函數 - Array.splice() - Array.slice() - Array.concat() - JSON.stringify() - JSON.parse() - Object.keys() - Window.btoa() - Window.atob() - String.split() - 音效 - 加載 URL 音訊 - 播放 URL 音效 - 設置 URL 音樂 - 音效濾鏡 - 播放音效 - 特效 - 文字特效 - 逐字動畫 - 文字捲動動畫 - 滾動文字特效 - 特殊工具 - 背包 - 設置背包 - 設置物品 - 設置背包物品 - 取得背包資料 - 整理背包 - 伺服器 - 狀態 - 儲存玩家狀態 - 取得玩家狀態 - 儲存玩家狀態 - 使用者名稱 - 取得玩家狀態 - 使用者名稱 - 分數 - 取得分數 - 上傳分數 - 使用者 - 取得使用者 - 道具 - 隱藏我的背包 - 事件 - 觸發事件 - 權重觸發事件 - 移除 - 移除物件 - 移除全域變數 - Base - 資源管理器 - 取得文字 - 取得 JSON - 隨機數產生器 - 設置隨機數產生器 - 使用隨機數產生器 - 柏林噪聲 - 設置柏林噪聲 - 使用一維柏林噪聲 - 使用二維柏林噪聲 - 使用三維柏林噪聲 ### 觸發 - 彈出視窗 - 視窗確認 - 視窗關閉 - PIXI 視窗 - 按下 PIXI 自訂義視窗 - 背包視窗 - 背包視窗選擇 ### 檢查 - 虛擬工具 - 背包 - 檢查背包 - 迴圈 - For Index - For...in - 變數 - 檢查物件函數結果 - 檢查物件屬性數量 ## 作者 **[cook1470](/profile/cook1470)** ### **[More modes](/profile/64897095@github)** # CgEventsExp The engine of CgEvents. You can go to the Test folder in the project to view examples of actions and inspections. ### Actions - Update - Display - Update Text - Update Display - Update Root Mask - Camera - Camera Set Focus - System - Console - Set Cookies - Get Cookies - Open Url - Get Date - Export File - Upload File - Set Debug Console - Call Function - Dialogs - Show Confirm Dialog - Show Select Dialog - Show Input Dialog - Show Copy String Dialog - Show Loading Dialog - Close Dialog - Show Inputs Dialog - PIXI Dialog - Show Custom PIXI Dialog - Close Custom PIXI Dialog - Backpack Dialog - Show Backpack Dialog - Update Backpack Dialog - Variable - Set Local - Set Global - Set Local Array - Set Global Array - Set Object Array - Set Json - Tween - Math - Distance Formula - Functions - Array.splice() - Array.slice() - Array.concat() - JSON.stringify() - JSON.parse() - Object.Keys() - Window.btoa() - Window.atob() - String.split() - Sound - Load URL Sound - Play URL Sound - Set URL Music - Sound Filter - Play Sound - Effects - Text - Typing Animation - Text Scrolling Animation - Scrolling Text Effect - Special Tools - backpack - Set Backpack - Set Item - Bag Set Item - Get Backpack - Sort Backpack - Server - State - Set User State - Get User State - Set Username State - Get Username State - Scores - Get Score - Submit Score - User - Get User - Items - Hide Backpack - Event - Trigger Event - Weight Trigger Event - Remove - Remove Object - Remove Global Var - Base - Resource Manager - Get Text - Get JSON - Random Generator - Set Random Generator - Use Random Generator - Perlin Noise - Set Perlin Noise - Use 1D Perlin Noise - Use 2D Perlin Noise - Use 3D Perlin Noise ### Triggers - Dialogs - Dialog Confirm - Dialog Close - PIXI Dialog - PIXI Button Dialog Confirm - Backpack Dialog - Backpack Dialog Select ### Checks - Special Tools - backpack - Check Backpack - Loop - For Index - For...in - variable - Check Object Function Result - Check Object Properties Count
# RyvexiaLib 這是一個用來製作 **[Ryvexia](https://ryvexia.gamelet.online/)** 音樂遊戲的核心模組,如果想要摳出新專案來製作遊戲,請不要摳此模組,建議摳遊戲成品。 有任何問題請於 **[專案討論](https://code.gamelet.com/discuss/p/RyvexiaLib/0)** 回報,會盡快解決。 ### 遊玩方法 遊戲開始後,會播放音樂,並從畫面上方落下音符,當音符與下方的判定框重合後按下對應的按鍵來打擊音符,打擊時機越準分數越高。 預設為四個軌道,對應按鍵分別為 D、F、J、K。 音符的種類目前分為下列幾種: - **Tap**:單壓,當音符與下方的判定框重合後,按下對應的按鍵來打擊音符。 - **Hold**:長壓,當音符與下方的判定框重合後,按住對應的按鍵直到音符結束時完成打擊。 遊戲中按下 ESC 可暫停遊戲。 ## 如何開始? ```typescript // 設置譜面檔案路徑(專案內),必須先於專案內新增譜面資料檔案。 const chartSource = `CG.${CG.Base.projectCode}/test.json`; // 加載檔案。 CG.Base.resourceManager.addAppSource(chartSource) // 初始化 RyvexiaLib。 CG.RyvexiaLib.initialize() .then(() => { // 初始化完成後 // 初始化 pixi 舞台,建議舞台寬高 1920 x 1080。 CG.Base.pixi.initialize(1920, 1080); // 新增一個譜面資料物件,並匯入譜面資料。 const chartData = new CG.RyvexiaLib.datas.ChartData(); chartData.importSource(chartSource); // 加載該譜面的音樂資料。 chartData.loadMusic(() => { // 加載完成後 // 建立 Ryvexia 遊戲物件,並加入到 root 舞台顯示於畫面上。 const game = new CG.RyvexiaLib.games.Game(); CG.Base.pixi.root.addChild(game); // 設置該遊戲的譜面資料並開始遊戲。 game.setup(chartData).start(); }) }) ``` ## 自製譜面 本模組提供了具有圖形化介面的譜面編輯器,當然你也可以自己使用程式碼添加,甚至利用譜面資料可以新增資料的功能,自製一個譜面編輯器也可以。 ### 如何從編輯器開始? #### 快捷鍵: - W、上:譜面向上移動。 - S、下:譜面向下移動。 - Shift + 移動:加速移動。 - +:增加每小節的拍數。 - -:減少每小節的拍數。 - Shift + 測試遊戲:啟用自動遊玩模式。 (也可以拖動進度條來改變音樂進度。) ```typescript // 初始化 RyvexiaLib CG.RyvexiaLib.initialize() .then(() => { // 初始化 pixi 舞台 CG.Base.pixi.initialize(1920, 1080); // 創建譜面資料物件,BPM 為 160 const chartData = new CG.RyvexiaLib.datas.ChartData(160); // 設定譜面音樂資源名稱 chartData.musicAlias = "你的音樂資源別稱"; // chartData.musicFilename = "你的音樂資源檔名"; // 如果你的音樂是壓縮檔,就會需要用到這一條。 // 建立譜面編輯器並匯入譜面資源 const editor = new CG.RyvexiaLib.editors.ChartEditor(chartData); editor.loadByStorage(); // 於譜面編輯器建立後嘗試讀檔,若無檔案則會忽略。 editor.saveWhileTest = true; // 啟用編輯器測試遊戲時自動存檔。(只有在測試遊戲時會存檔,不是有更新就會儲存) // 建立主要遊戲(讓編輯器用於測試) const game = new CG.RyvexiaLib.games.Game(); // 建立編輯器頁面(用於控制編輯器與遊戲之間的溝通) const editorPage = new CG.RyvexiaLib.utils.pages.ChartEditorPage(editor, game); // 顯示編輯器頁面 editorPage.show(); }) ``` ### 如何從程式碼編輯? ```typescript // 創建一個譜面資料,bpm 為 175。 const chartData = new CG.RyvexiaLib.datas.ChartData(175); // 設定一些譜面資料。 chartData.title = 'Sing My Pleasure'; // 譜面標題 chartData.musicAlias = 'RyvexiaLib.Sing My Pleasure'; // 音樂資源別稱 chartData.musicAuthor = 'Vivy (Vo.Kairi Yagi)'; // 音樂作者、歌手 chartData.chartAuthor = '酷可(cook1470)'; // 譜面作者 // 預設有 4 個軌道,於第 1 軌道,第 0 節拍,位置 0 添加音符。 chartData.tracks[1].addNote(0, new NoteData(0)); // 於第 0 軌道,第 0 節拍,位置 0.5 添加音符。 chartData.tracks[0].addNote(1, new NoteData(0.5)); // 於第 2 軌道,第 7 節拍,位置 0.5 添加音符,音符長度 8。 chartData.tracks[2].addNote(7, new NoteData(0.5, 8)); // BPM 變速設定,於第 20 小節開始,BPM 變為 160。 chartData.bpms[20] = 160; // 於第 50 小節開始,BPM 變為 160。 chartData.bpms[50] = 175; // 創建好以後,可以使用 exportJson 匯出 JSON 物件,並使用 JSON.stringify 轉換成字串。 const text = JSON.stringify(chartData.exportJson()); // 再使用 Base 的 HtmlUtil 來下載檔案。 CG.Base.utils.HtmlUtil.downloadText(text, '我的譜面.json'); // 也可以將譜面資料壓縮後直接下載,不需轉換 JSON,且檔案大小會更小。 // CG.Base.utils.HtmlUtil.downloadText(chartData.exportGzip(), '我的譜面.rvx'); ``` 如果你想要使用壓縮後的譜面檔案,匯入的方法稍有不同。 ```typescript const chartSource = 'CG.YourProject/我的譜面.rvx'; // 與 #如何開始? 相同,先加載要使用的譜面,可參考上方介紹,在此省略。 // 利用 Base 的資源管理器讀取成字串。 const text = CG.Base.resourceManager.getText(chartSource); // 新增一個譜面資料物件,並匯入壓縮譜面資料。 const chartData = new ChartData(); chartData.importGzip(text); // 後續與 #如何開始? 相同,建立遊戲、載入音樂並開始遊戲。 ``` ## 頁面控制器 本模組提供了一個簡單的頁面控制器,以及一些預設的頁面可供使用,以下展示以編輯器為主的控制流程。 包含了封面、校正頁面、編輯器頁面。 ```ts // 初始化 RyvexiaLib CG.RyvexiaLib.initialize() .then(() => { // 初始化 pixi 舞台 CG.Base.pixi.initialize(1920, 1080); // 建立頁面管理器。 const pageManager = new CG.RyvexiaLib.utils.PageManager(); // 建立封面頁面,並註冊到頁面管理器中。 const coverPage = new CG.RyvexiaLib.utils.pages.CoverPage(); // coverPage.titleText.text = "我的音樂遊戲"; // 可改變封面標題文字,預設為 Ryvexia pageManager.registerPage(coverPage); // 建立校正、設定頁面,並註冊到頁面管理器中。 const calibrationPage = new CG.RyvexiaLib.utils.pages.CalibrationPage(); pageManager.registerPage(calibrationPage); const chartData = new CG.RyvexiaLib.datas.ChartData(175); chartData.musicAlias = "你的音樂資源別稱"; const editor = new CG.RyvexiaLib.editors.ChartEditor(chartData); editor.loadByStorage(); editor.saveWhileTest = true; const game = new CG.RyvexiaLib.games.Game(); // 建立編輯器頁面(用於控制編輯器與遊戲之間的溝通),並註冊到頁面管理器中。 const editorPage = new CG.RyvexiaLib.utils.pages.ChartEditorPage(editor, game); pageManager.registerPage(editorPage); // ========== 操控個頁面之間的切換流程。 ========== // 當於封面頁面開始時。 coverPage.onStart = () => { // 顯示校準頁面。 pageManager.show(calibrationPage.code); } // 當於校準頁面返回時。 calibrationPage.onReturn = () => { // 顯示譜面編輯器頁面。 pageManager.show(editorPage.code); } // 當於譜面編輯器頁面返回時。 editorPage.onReturn = () => { // 顯示封面。 pageManager.show(coverPage.code); } // 一開始先顯示封面頁。 pageManager.show(coverPage.code); }) ``` ## 進階設定 本模組將一些可設置常數放在 `CG.RyvexiaLib.Constant` 內,裡面有一些特別的參數可以調整,以下為預設值。 ```typescript // 以下可設定各判定分的範圍(時間差)。 CG.RyvexiaLib.Constant.PERFECT_TIME_RANGE = 46; CG.RyvexiaLib.Constant.GREAT_TIME_RANGE = 92; CG.RyvexiaLib.Constant.GOOD_TIME_RANGE = 138; CG.RyvexiaLib.Constant.MISS_TIME_RANGE = 200; // 以下可設定作為判定分顯示的文字,遊戲中、結算等。 CG.RyvexiaLib.Constant.SCORE_TYPES.PERFECT = "Perfect"; CG.RyvexiaLib.Constant.SCORE_TYPES.GREAT = "Great"; CG.RyvexiaLib.Constant.SCORE_TYPES.GOOD = "Good"; CG.RyvexiaLib.Constant.SCORE_TYPES.MISS = "Miss"; ``` ## 作者 **[module_cook1470](/profile/64897095@github)**
# 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) { ... } } ```
# CG.Base Provide tool kits that helps you fast build an app on Code.Gamelet. Key features include: 1. initialize [pixi.js](#pixi.init) environment 1. load and access resources that are imported via Code.Gamelet IDE 1. manage update functions that are called every frame 1. provide debug utilities ## Getting Started Follow the steps below to fast start an app with [PixiJS](#pixi.init). We will implement a box2d environment to demo the usage of Base. <a name="pixi.init"></a> ## Start with Pixi.js<a name="pixi.init"></a> ```typescript class App { constructor() { // initialize pixi CG.Base.pixi.initialize(600, 400); CG.Base.pixi.physicsDebugDraw.setActive(true); // make a physics wall var wall = CG.Base.physics.createPhysicsObject('wall', {type: 'static'}); wall.addEdge(new CG.Base.geom.Point(10, 300), new CG.Base.geom.Point(500, 330)); // make a dynamic physics ball var ball = CG.Base.physics.createPhysicsObject('ball', {type: 'dynamic'}); ball.addCircle(0, 0, 10, {friction: 0.1, density: 0.1, restitution: 0.3}); ball.setPosition(100, 10); } } new App(); ``` @see [Demo](/edit/Base_Start_with_PIXI) ## Load and play with Resources To load resources that are imported from IDE: ```typescript // tell resources what resources to load (using the alias names) CG.Base.resourceManager.addAppResource('Game1.button'); CG.Base.resourceManager.addAppResource('Game1.music'); // start loading CG.Base.resourceManager.load(() => { // all loaded callback // create button with the image "Game1.button" alias name var button = new CG.Base.pixis.interactive.Button(CG.Base.resourceManager.createPixiSprite('Game1.button', 20, 20)); // set the position of the button button.displayObject.position.set(100, 100); // add the button to pixi.root, so pixi can render the button CG.Base.pixi.root.addChild(button.displayObject); // add a click event listener button.on(CG.Base.pixis.interactive.Button.EVENT.CLICK, () => { // when the button is clicked, play sound with "Game1.music" alias name CG.Base.resourceManager.playSound('Game1.music') }); }); ``` @see [Demo](/edit/Base_Load_Resources) ## Manage update functions Take advantage of CG.Base.addUpdateFunction to make a function called every frame ```typescript class App { constructor() { CG.Base.pixi.initialize(600, 400); CG.Base.addUpdateFunction(this, this.update); } // this function will be called every frame(called 60 times per second normally) private update(deltaTime:number):void { // do something } } new App(); ``` @see [Demo](/edit/Base_Update_and_Delay_Func) You can call a function in the future by CG.Base.addDelayFunction ```typescript class App { constructor() { CG.Base.pixi.initialize(600, 400); // call this.delayAction in 1000 milliseconds(= one second) CG.Base.addDelayFunction(this, this.delayAction, 1000); } private delayAction():void { // do something } } new App(); ``` @see [Demo](/edit/Base_Update_and_Delay_Func) ## Interact with Keyboard Use CG.Base.keyboard package to interact with keyboard events. ```typescript export class App { constructor() { // make the window focused, so we can receive keyboard events. window.focus(); // initialize pixi CG.Base.pixi.initialize(600, 400); // tell resourceManager to load the resource 'Game1.button' CG.Base.resourceManager.addAppResource('Game1.button'); // load resources, and wait callback when resources are all loaded CG.Base.resourceManager.load(() => { // add keyboard event listener, when a key is pressed CG.Base.keyboardManager.on(CG.Base.keyboard.KeyboardManagerEvent.PRESSED, key => { // if the pressed key is space, we call this.createSprite() if (key == CG.Base.keyboard.Key.SPACE) { this.createSprite(); } }); }); } private createSprite(): void { // create a sprite with the image 'Game1.button' var sprite: PIXI.Sprite = CG.Base.resourceManager.createPixiSprite('Game1.button'); // set the position of the sprite sprite.position.set(CG.Base.utils.IntUtil.randomBetween(100, 500), CG.Base.utils.IntUtil.randomBetween(100, 300)); // add the sprite to pixi.root, so it can be rendered CG.Base.pixi.root.addChild(sprite); } } new App(); ``` @see [Demo](/edit/Base_PIXI_Keyboard) ## Debugging The best debug tool on browser is the [developer tools](https://developer.chrome.com/devtools) in Chrome (F12). To find your source code in developer tools, first open developer tools(F12), click "Sources" tab, and search the Network tree as below: > top => {projectCode} => gameFrame => code.gamelet.com => gassets => file/{projectCode}/src for example, if the projectCode is 'Game1', source code is located at > top => Game1 => gameFrame => code.gamelet.com => gassets => file/Game1/src ![Source Network Tree](https://code.gamelet.com/gassets/asset/Base/Base.networktree/networktree.png "Source Network Tree") ### Add Watch In addition to browser's debugging tools, CG.Base provides other useful tools. CG.Base.addWatch() adds objects or objects' properties to Watch panel in CG IDE. ```typescript export class App { constructor() { // initialize pixi CG.Base.pixi.initialize(600, 400); // tell resourceManager to load the resource 'Game1.button' CG.Base.resourceManager.addAppResource('Game1.button'); CG.Base.resourceManager.load(() => { // add the created sprite into Watch panel, the alias name in Watch panel is 'sprite' CG.Base.addWatch('sprite', this.createSprite()); }); // add this(App)'s 'time' property into Watch panel. The alias name for this property is 'now' CG.Base.addWatch('now', this, 'time'); } private createSprite(): PIXI.Sprite { // create a sprite with the image 'Game1.button' var sprite: PIXI.Sprite = CG.Base.resourceManager.createPixiSprite('Game1.button'); // set the position of the sprite sprite.position.set(CG.Base.utils.IntUtil.randomBetween(100, 500), CG.Base.utils.IntUtil.randomBetween(100, 300)); // add the sprite to pixi.root, so it can be rendered CG.Base.pixi.root.addChild(sprite); return sprite; } // a getter function, that works like a property of App object. get time(): number { return CG.Base.time(); } } new App(); ``` @see [Demo](/edit/Base_Add_Watch) ## Versioning We use [SemVer](http://semver.org/) for versioning. ## Links and Resources This library is running with the libraries below. * [Pixi.js](http://www.pixijs.com/) - 2D rendering engine * [API reference](http://pixijs.download/release/docs/index.html) * [Examples](http://pixijs.io/examples/) * [Pixi keyboard](https://github.com/Nazariglez/pixi-keyboard) - Keyboard utility * [Pixi sound](https://github.com/pixijs/pixi-sound) - Sound utility * [Pixi filters](https://github.com/pixijs/pixi-filters) - Filters Collections * [Pixi GafPlayer](https://github.com/mathieuanthoine/PixiGAFPlayer) - [GafMedia](https://gafmedia.com/) Player * [Liquidfun](http://google.github.io/liquidfun/) - Box2D based physics engine * [MD5](http://www.myersdaily.org/joseph/javascript/md5-text.html) - MD5 implementation by Joseph Myers ## Authors **Haska Su** - *Initial work*
---------------以下開始前綴--------------- 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 ---------------前綴結束--------------- # 光暈事件擴充 # 光暈資料:[光暈資料](https://discord.gg/ZEdGFDnthe) ## 本專案已進入慢速更新模式 ## 請幫忙評分以利範例文章推出(需先玩3分鐘):[我要遊玩3分鐘](https://tweventsalt.gamelet.online/play) [我要評分](https://gamelet.online/review/TWEventsAlt) ## 更新日誌:[CHANGELOG](https://tweventsalt.gamelet.online/) ## README - 部分功能需要用到監聽作業,請於事件最一開始執行一次監聽作業,參數空白或是填0即可。 ## Links - 同人陣範例檔:[我的同人陣](https://code.gamelet.com/edit/TWSample) - 同人陣功能示範(只是示範,不用認真玩):[愛的教育](https://twmission001.gamelet.online) - 同人相關問題可到以下地點詢問: - 留言板:[留言板](https://gamelet.online/user/111398298135310219180@google/board) - 討論區:[該專案的討論區](https://code.gamelet.com/discuss/p/TWEventsAlt/0) - 注意:在其他地方(談程式設計、談遊戲設計、discord)詢問,將會看情況回答 ## 事件功能: - 觸發:角色 - 觸發:角色攻擊 - 觸發:說話內容 - 觸發:角色受傷Alt - 觸發:角色盾牌防禦 - 觸發:武器道具 - 觸發:拾取武器道具 - 觸發:使用自創商店武器道具 - 檢查:取得盾牌屬性 - 觸發:地圖機關 - 觸發:石塊移動 - 觸發:籃框收集物品 - 觸發:變數 - 觸發:匯入變數 - 觸發:顯示 - 觸發:關閉彈出視窗 - 觸發:確認彈出視窗 - 檢查:角色 - 檢查:找出所有角色(隨機排列) - 檢查:找出所有角色 - 檢查:比對距離 - 檢查:面向角度 - 檢查:角色狀態Alt - 檢查:隨機取得演員代碼 - 檢查:區域內的角色數量 - 檢查:角色戰鬥對象 - 檢查:道具武器 - 檢查:地圖 - 檢查:隨機取得可行走座標 - 檢查:取得TWLoc - 檢查:系統 - 檢查:取得現在時間 - 檢查:變數 - 檢查:取得數字部分 - 動作:角色 - 動作:發動武器攻擊 - 動作:角色裝備或移除武器道具 - 動作:角色發動技能 - 動作:玩家按空白鍵跳躍 - 動作:設定預設武器 - 動作:移動人物位置 - 動作:設定角色屬性[註1] - 動作:設定角色演員[支援部分開放式遊戲房:除自訂以外都支援] - 動作:思考模式 - 動作:思考間隔 - 動作:角色伺服器狀態 - 動作:角色暫停 - 動作:角色繼續 - 動作:新增角色Alt - 動作:補充彈藥 - 動作:玩家應用傷害特效 - 動作:進入技能狀態 - 動作:停止說話 - 動作:設定暱稱[註1] - 動作:給遊戲幣 - 動作:角色跳躍 - 動作:中毒 - 動作:角色死亡叫聲[註1] - 動作:角色切換元素 - 動作:武器道具 - 動作:新增武器道具 - 動作:設定武器道具屬性[註1] - 動作:放置可拾取道具Alt - 動作:移除武器道具 - 動作:設定武器技能[註1] - 動作:連結自訂商店武器道具[註1] - 動作:新增自創近距武器 - 動作:盾牌設定 - 動作:設定Alt商店武器道具熱鍵 - 動作:角色特效 - 動作:噴火[註1] - 動作:電擊[註3] - 動作:人物濾鏡 - 動作:角色著火 - 動作:角色衝擊波 - 動作:殘影 - 動作:集氣[註1] - 動作:自訂角色GAF特效 - 動作:血條[註1] - 動作:角色火箭 - 動作:角色圓形範圍 - 動作:角色影分身[註1] - 動作:角色散發粒子 - 動作:角色光彈[註1] - 動作:角色散發光環[註1] - 動作:角色進度條 - 動作:腳印[註1] - 動作:角色中箭[註3] - 動作:角色反衝箭 - 動作:擊退 - 動作:角色居合斬 - 動作:角色波動拳 - 動作:人物天火 - 動作:角色武器濾鏡 - 動作:名字條[註1] - 動作:集氣濾鏡[註1] - 動作:技能條 - 動作:角色龍[支援部分開放式遊戲房:出現位置、大小] - 動作:地圖特效 - 動作:衝擊波 - 動作:震地[註3] - 動作:噴氣[註1] - 動作:煙霧[註1] - 動作:爆炸[註1] - 動作:自訂地圖GAF特效 - 動作:快跳文字 - 動作:煙火[註1] - 動作:龍波[支援部分開放式遊戲房:出現位置、路徑、大小、每格停留時間] - 動作:火箭 - 動作:定時炸彈 - 動作:真氣風暴[支援部分開放式遊戲房:除大小以外都支援] - 動作:濺起水花[註1] - 動作:揚起塵土[註1] - 動作:圓形範圍 - 動作:散發粒子 - 動作:散發光環[註1] - 動作:進度條 - 動作:光印[支援部分開放式遊戲房:除濾鏡以外都支援] - 動作:天箭[註1] - 動作:反衝箭 - 動作:防護泡 - 動作:任務流程 - 動作:可使用的武器道具[註1] - 動作:任務完成Alt - 動作:完成任務章節Alt - 動作:自動上傳角色分數[註1] - 動作:死後自動觀戰[註1] - 動作:禁用背包 - 動作:畫面特效 - 動作:畫面震動[註1] - 動作:畫面色調[註1] - 動作:畫面濾鏡 - 動作:錐形視界[註1] - 動作:畫面遮色 - 動作:畫面遊戲結束 - 動作:畫面散發粒子 - 動作:顯示 - 動作:彈出確認視窗 - 動作:更新文字 - 動作:更新顯示物件 - 動作:彈出遊戲通知 - 動作:彈出選項視窗 - 動作:彈出遊戲錯誤通知 - 動作:彈出字串輸入視窗 - 動作:顯示可拖曳面板 - 動作:顯示遊戲倒數 - 動作:顯示商店 - 動作:前置作業 - 動作:監聽作業 - 動作:攝影機 - 動作:觀戰模式 - 動作:縮放玩家視野 - 動作:地圖 - 動作:新增可行走座標[註1] - 動作:新增洞[註1] - 動作:靜態物件 - 動作:新增地圖傳送點 - 動作:地圖機關 - ~~動作:告示牌[v 6.19.0][註1]~~ - 動作:新增可推石塊 - 動作:新增蠋火 - 動作:新增噴火孔[註1] - 動作:新增旋轉斧 - 動作:新增飛箭機關 - 動作:新增籃框 - 動作:變數 - 動作:延遲設定變數[註1] - 動作:匯出變數 - 動作:匯入變數 - 動作:獲取外部變數 - 動作:儲存區域變數 - 動作:物件特效 - 動作:物件震動[註1] - 動作:物件標示箭頭 - 動作:物件震盪[註1] - 動作:黑科技 - 動作:斷線 - 動作:關閉視窗 - 動作:視窗當機 - 動作:系統 - 動作:執行光暈事件表 - 動作:取得IPv4位址 - 動作:嘗試關閉視窗時顯示警告 - 動作:邀請觀眾 - 動作:音樂 - 動作:播放音樂 - 動作:停止音樂 - 動作:靜音官方音樂 - 動作:Cutting Edge - ~~動作:Add Green Dragon Crescent Blade[v 9.2.0][不支援開放式遊戲房]~~ - 動作:多媒體 - 動作:網頁多媒體 - 動作:事件 - 動作:設定事件JSON - 動作:天啟 - 動作:地裂 - 動作:洪水 - 動作:挖寶 - 動作:屍變 - 動作:GIF - 動作:新增GIF - 動作:移除GIF - 動作:角色GIF - 動作:地圖GIF - 動作:播放GIF - 動作:停止GIF - 動作:拳法 - 動作:學習拳法 - 動作:增加拳法經驗值 - 動作:釋放拳法 ### 可能不支援開放式遊戲房原因: - 註1:未同步,後來的玩家看不到該特效,但在該玩家進來後之後執行的動作當然可以看到。所以假如是短暫的動作(例如震地這種1、2秒內做完的動作),影響不大。 - 註2:同註1,且之後將會支援(預定施工項目) - 註3:同註1,此部分功能為TwilightWarsLib提供,需要小哈片刻更新才會支援 ## 額外功能 - 觀戰系統(Beta) - 按下Shift+F8即可開啟,另為防止BUG導致需重整,增設Shift+F9可強制跳到主頁面 - 使用資格:遊戲管理員(GM)、開發版本下(dev)、有申請開放之專案(TWMission001...) - 欲申請開放公開版本之一般玩家也能使用觀戰系統,請至留言板留言,將於下一版本公開時添加 - 注意:目前觀戰系統不支援最大人數為1的房間(因為單人無須與玩家交流,故不會有訊息產生以供觀戰) - 設定商店道具武器狀態: - 請在你的專案的README.md內加上: - ※setItemStatus:※§itemCode§AAA※§itemStatus§BBB※§end§ - AAA為道具武器代碼 - BBB為狀態:dev,disabled,hidden,pub,pubToOwner - 可選取該文字,然後按Ctrl + / 來隱藏文字 - 範例:※setItemStatus:※§itemCode§TwilightWarsLib.grenadeBomb※§itemStatus§hidden※§end§ - 設定玩家勳章: - 請在你的專案的README.md內加上: - ※setPlayerBadge:※§username§AAA※§badgeCode§BBB※§badgeSet§CCC※§note§DDD※§end§ - AAA為玩家ID - BBB為勳章代碼 - CCC為設定:award,remove - DDD為註記 - 可選取該文字,然後按Ctrl + / 來隱藏文字 - 範例:※setPlayerBadge:※§username§haskasu※§badgeCode§kills10k※§badgeSet§award※§note§congratulation!※§end§ - 提交玩家分數: - 請在你的專案的README.md內加上: - ※submitPlayerScore:※§username§AAA※§scoreKey§BBB※§score§CCC※§note§DDD※§end§ - AAA為玩家ID - BBB為分數代碼 - CCC為提交的分數 - DDD為註記 - 可選取該文字,然後按Ctrl + / 來隱藏文字 - 範例:※submitPlayerScore:※§username§haskasu※§scoreKey§kills※§score§3000※§note§congratulation!※§end§ - 停權: - 請在你的專案的README.md內加上: - ※suspendPlayer:※§username§AAA※§days§BBB※§suspendSet§CCC※§note§DDD※§end§ - AAA為玩家ID - BBB為天數 - CCC為設定:suspend,unsuspend - DDD為註記 - 可選取該文字,然後按Ctrl + / 來隱藏文字 - 範例:※suspendPlayer:※§username§haskasu※§days§3※§suspendSet§unsuspend※§note§congratulation!※§end§ - ~~玩家登入紀錄:[v 9.0.X]~~ - ~~本模組提供作者在dev mode查看玩家登入紀錄,只要執行專案即可在console看到(F12 -> Console)~~ - 設定最大Fps: - 請在你的專案的README.md內加上: - ※setMaxFps:※§maxFps§AAA※§end§ - AAA為最大Fps - 可選取該文字,然後按Ctrl + / 來隱藏文字 - 範例:※setMaxFps:※§maxFps§1000※§end§ - 廁所 - 誤差大約45秒 - 老少咸宜 ## Versioning - We use [SemVer](http://semver.org/) for versioning. ## Authors - **[hyper_code_gamelet](https://code.gamelet.com/profile/hyper_code_gamelet)** ## Acknowledgments - Hat tip to anyone who's code was used - Inspiration - etc
# TwilightWarsEventsEnh ### 本模組依附於TwilightWarsEvents模組,主要內容是解開該模組未開放的限制及添加少許該模組缺少的功能。 - v0.6版本更動較大,更新請注意。 - 更新版本前建議先查看更新歷史。 - 若有任何問題或建議,歡迎至討論區回報。 - [Discord群組](https://discord.gg/seJwuzCbWq) ## 本模組功能(v0.5.4)【最新版本v0.6.0】 ### 動作 * 角色 * 設定角色屬性/狀態 * 角色發動技能 * 角色裝備道具 * 加速回氣 * 設定血條 * 套用傷害屬性效果 * 發動武器攻擊 * 中斷技能 * 強制角色死亡 * 設定盔甲屬性 * 設定彈匣 * 強制角色復活 * 人物裝備武器 * 角色重置 * 設定盾牌 * 強制裝子彈 * 改變馬茲屬性 * 自動集氣 * 取消集氣 * 進入行走狀態 * 停止跳躍 * 切換至目標手武器 * 移動角色位置 * 角色暫停/繼續 * 範圍治療/傷害 * 角色攻擊次數 * 設定近遠戰武器傷害 * 設定受擊傷害 * 武器動作速度 * 反射傷害 * 角色加減血 * 陣營重生位置 * 顯示 * 彈出視窗 * 關閉彈出視窗 * 彈出確認視窗 * 彈出複製字串視窗 * 彈出字串輸入視窗 * 彈出載入中 * 彈出選項視窗 * FrontEnd * 新增<button> * +CSS 規則集 * 為HTML變數+CSS類別 * 為HTML變數-CSS類別 * UI顯示設定 * 玩家輸入字串 * 特效 * 地圖 * 濺起水花 * 快跳文字 * 環形特效 * 回血特效 * 爆炸痕跡 * 天隱之眼射擊特效 * 血跡特效 * 爆炸特效 * 塵土飛楊 * 飛鳥特效 * 地圖冰凍特效 * 射擊軌跡 * 火山落石 * 火箭炮特效 * 角色 * 震暈 * 角色閃避 * 飛拳特效 * 爆炸箭特效 * 失明標誌 * 電擊 * 龍波 * 角色濾鏡 * 怒氣發散 * 影分身特效 * 吸血特效 * 血刃特效 * 角色鏡像 * 閃光特效 * 震地 * 血刃降級特效 * 血爆 * 防護盾特效 * 閃現 * 畫面 * 畫面遮色片 * 畫面效果線 * 畫面濾鏡 * 地圖 * 玩家滑鼠座標 * 增加可行走座標 * -地圖物件 * +地圖物件 * 可走格除錯點 * 播放音效 * 移除可行走座標 * 事件 * 執行事件動作 * 自訂功能 * 自訂技能 * 自訂特效 * 自訂陣營 * 伺服器 * 分數 * 上傳玩家分數 * 變數 * 儲存區域變數 ### 檢查 * 系統 * 目前時間 * 角色 * 玩家存活時間 * 角色面相角度 * 角色所在區域 * 角色武器技能 * 遊戲室 * 遊戲室創建者 * 變數 * 比對字串 ### 觸發 * 顯示 * 點擊按鈕 ## 作者 **[不會取名字](/profile/buhuechuminzu)**<br> **[雪姬](/profile/setsuki)** ## Front-End顧問 **[洨貓.來亂。](/profile/CumCat)**
# 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)**
# 光暈戰記 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)**
ⒸCode.Gamelet.com | Privacy Policy | Terms of Service