- UID
 - 139148
 
- 閱讀權限
 - 10
 
- 主題
 - 1
 
- 帖子
 - 8
 
- 精華
 - 0
 
- A幣
 - 51 
 
- 在線時間
 - 6 小時
 
- 最後登錄
 - 2025-1-12
 
 
 
 
 
集團新軍 
  
	- 主題
 - 1
 
	- 帖子
 - 8
 
	- 精華
 - 0
 
	- 綜合社群主題發文量
 - 0 
 
	- 電玩社群主題發文量
 - 0 
 
	- 娛樂社群主題發文量
 - 0 
 
	- 技術社群主題發文量
 - 1 
 
	- 閱讀權限
 - 10
 
	- 註冊時間
 - 2022-6-15
 
 
 
 
	
 TA的每日心情  | 怒 2022-6-22 18:52 | 
|---|
 
  簽到天數: 4 天 連續簽到: 1 天 [LV.2]偶爾看看I 
 
 | 
 
 本帖最後由 leseigk 於 2022-6-22 20:11 編輯 
 
 如果程式碼邏輯有問題、有BUG、註釋不清楚或者針對程式碼有更好的優化建議的話都歡迎回復指出~希望能跟大家一起交流一起進步。  
 
 本著利玩家主義優化了一下自己很久以前寫的轉蛋機NPC腳本,優化的內容如下: 
 
 - 分單抽和十抽。
 - 有獎池查看功能。
 - 可連續轉蛋、從單抽轉到十抽、從十抽轉到單抽、返回主菜單和結束轉蛋。
 - 抽中指定道具可上綠廣。
 - 十抽會根據剩餘的背包欄位數和轉蛋卷數量決定要幾抽,如果轉蛋卷不足十張或者欄位數不足十個就會根據哪個剩餘的數量較小就轉幾次,避免被吞。
 - 會判斷抽到的是哪個類別的道具,檢查對應類別的欄位數。
 
 
 
 效果演示 
 
 
 
 程式碼 
 
 /*  * 轉蛋機 NPC  * 2022/06/19 優化版  */ var status = -1; var req = [5220000, 1]; 
 
 // 獎池 var itemList = [   1322060, 1332073, 1372044, 1382057, 1072355, 1072356, 1072357, 1112478,   1462085, 1001059, 1051201, 1012173, 1012174, 1122023, 1012157, 1492073,   1482073, 1402085, 1122034, 1102004, 1102040, 1102041, 1002931, 1052190,   1122035, 1002932, 1002933, 1372071, 1382093, 1312056, 1412055, 1322084, ]; 
 
 // 特殊獎品, 會上綠廣的 var gachItem = [1122034, 1122035, 1012173, 1012174]; 
 
 function start() {   action(1, 0, 0); } 
 
 var rewards = ""; // 獎品列表 var times = 0; // 消耗的轉蛋卷數 var haveSpace = true; // 還有沒有空間 var haveItem = true; // 還有沒有轉蛋卷 var stop; // result = -1;  => SRC : gainGachaponItem 方法裡面的 addbyId_Gachapon 如果有某個類別欄位已滿會回傳 -1 
 
 /* 重置 */ function init() {   rewards = "";   times = 0;   haveSpace = true;   haveItem = true; } 
 
 /* 轉蛋 */ function draw() {   var result;   var random = Math.floor(Math.random() * itemList.length); // 產生亂數抽取獎池其中一個道具   var item = itemList[random]; // 抽中的道具 
 
   if (cm.getPlayer().itemQuantity(req[0]) - times < 1) {     // 情況1: 剩餘轉蛋卷不足     haveItem = false;   } else if (!cm.getPlayer().haveSpaceForId(item)) {     // 情況2: 剩餘空間不足     haveSpace = false;   } else {     var special = gachItem.indexOf(item) !== -1; 
 
     // 中了特殊獎     if (special) {       result = cm.gainGachaponItem(item, 1, true);     } else if (!special) { // 一般獎       result = cm.gainItem(item, 1);     } 
 
     if (result === -1) {       stop = true;     } else {       rewards += "#i" + item + "#";       times++;     }   } } 
 
 /**  * 結算  * @param {*} type 0: 單抽 1: 十抽  */ function finish(type) {   if (times > 0) {     var msg = type === 1 ? "\r\n#L996##b繼續十抽#l #L997##b前往單抽#l" : "\r\n#L997##b繼續單抽#l #L996##b前往十抽#l";     cm.gainItem(req[0], -times);     cm.sendNext("恭喜獲得\r\n" + rewards + msg + "\r\n#L998##r結束轉蛋#l #L999##d返回上一頁#l");   } else if (!haveSpace || stop) {     cm.sendOk("不好意思,請確認您的背包是否有空位。");   } else if (!haveItem) {     cm.sendOk("不好意思,您身上的#b#t" + req[0] + "##i" + req[0] + "##k不足!");   }   init(); } 
 
 function action(mode, type, selection) {   if (mode == 1) {     status++;   } else {     cm.dispose();     return;   } 
 
   if (status === 0) {     /* 檢查身上是否有轉蛋卷 */     if (cm.haveItem(req[0], req[1])) {       var msg = "您身上有#b#t" + req[0] +"##i" + req[0] + "##k可以進行轉蛋。\r\n你確定要使用 #b#p" + cm.getNpc() + "##k 進行轉蛋嗎?\r\n #L0#我要單抽! #l \r\n #L1#我要一次抽#r十個#k!#l \r\n #L2##b查看轉蛋機內容物!#l";       cm.sendYesNo(msg);     } else {       cm.sendOk("不好意思!您沒有#b#t" + req[0] + "##i" + req[0] + "##k,無法進行轉蛋。");       cm.dispose();     }   } else if (status === 1) {     /* 根據選擇擇的選項做對應的事情 */     switch (selection) {       // 單抽       case 0:         if (!stop && haveSpace) {           draw();         }         finish(0);         break;       // 十抽       case 1:         for (var counts = 0; counts < 10; counts++) {           if (stop || !haveSpace) {             break;           }           draw();         }         finish(1);         break;       // 確認獎池       case 2:         var msg = "";         for (var i = 0; i < itemList.length; i++) {           if (i % 8 == 0) {             msg += "\r\n";           }           msg += "#i" + itemList + "#";         }         cm.sendSimple("" + msg + "\r\n #L999##r退回上一頁#l");         break;     }   } else if (status === 2) {     switch (selection) {       // 繼續十抽       case 996:         status = 0;         action(1, 0, 1);         break;       // 繼續單抽       case 997:         status = 0;         action(1, 0, 0);         break;       // 退出轉蛋       case 998:         cm.dispose();         break;       // 退回菜單重選       case 999:         status = -1;         action(1, 0, 0);         break;       default:         cm.dispose();         break;     }   } else {     cm.dispose();   } } 
 
 
 
 這個的邏輯有比較複雜一點所以寫得有點亂,有時間會再思考一下怎麼精簡。 
 
 下次分享一下純 JS 的樂透系統 NPC 跟 EVENT 腳本好了,還在優化中...有點懶 
 |   
 
 
 
 |