From 6216927b566f1bb08bf8456643ae6163dc565311 Mon Sep 17 00:00:00 2001 From: Ino Date: Thu, 3 Jul 2025 09:07:58 +0900 Subject: [PATCH] =?UTF-8?q?Save=5FPC=5FLimitSlotOptionChange=20=ED=81=B4?= =?UTF-8?q?=EB=9D=BC=EC=9A=B0=EB=93=9C=20=EC=8A=A4=ED=81=AC=EB=A6=BD?= =?UTF-8?q?=ED=8A=B8=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editor/Resources/.CloudScript.js | 101 +++++++++++++----- 1 file changed, 76 insertions(+), 25 deletions(-) diff --git a/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js b/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js index 933e84c47..015afa655 100644 --- a/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js +++ b/Assets/PlayFabEditorExtensions/Editor/Resources/.CloudScript.js @@ -203,27 +203,29 @@ function Get_Return(errorval, add) { time: Get_CurKoreaTime() }; - if (add && typeof add === 'object' && !Array.isArray(add)) { - for (var key in add) { - if (add.hasOwnProperty(key)) { - rtn[key] = add[key]; + if (add) + { + if (Array.isArray(add)) + rtn["results"] = add; + else if (typeof add === 'object') + { + // 단일 객체인 경우 + for (var key in add) + { + if (add.hasOwnProperty(key)) + rtn[key] = add[key]; } } } - //log.info(rtn.error + ", " + rtn.time); return rtn; /* - var result = Get_Return(0, { gold: 1000, name: "player1" }); + Get_Return(0, { gold: 1000, name: "player1" }); + // 결과: { error: 0, time: "...", gold: 1000, name: "player1" } - 결과: - { - error: 0, - time: "2025-06-16T10:30:00.000Z", // 예시 - gold: 1000, - name: "player1" - } + Get_Return(1, [ { gold: 1000 }, { name: "player1" }, { time: "커스텀" } ]); + // 결과: { error: 1, time: "커스텀", gold: 1000, name: "player1" } */ } function Add_Item(table, itemtable, urod, itemid, amount, isCheat) @@ -915,13 +917,13 @@ handlers.Save_PC_LimitLvUp = function(args) handlers.Save_PC_LimitSlotOptionChange = function(args) { var readonlydata = Get_UserReadOnlyData(); - var error = Get_Error(readonlydata, args.Token); - if (error < 0) return Get_Return(error); + //var error = Get_Error(readonlydata, args.Token); + //if (error < 0) return Get_Return(error); var urod = Get_JsonUserData(readonlydata); // 열려 있는 슬롯이 있는 지 확인 - var OpenSlotCount = 0; + var OpenSlots = []; var LockCount = 0; var limittable = Get_BreakingLimitTable(); var lst = urod.LimitSlot[args.Preset]; @@ -931,14 +933,14 @@ handlers.Save_PC_LimitSlotOptionChange = function(args) var isOpen = limitdata.n_LimitLv <= urod.PC.LLv; if (limitdata.n_LimitLv <= urod.PC.LLv) { - if (lst[i].Lock == 0) ++OpenSlotCount; + if (lst[i].Lock == 0) OpenSlots.push(i); else ++LockCount; } } - log.info("OpenSlotCount : " + OpenSlotCount); + log.info("OpenSlotCount : " + OpenSlots.length); log.info("LockCount : " + LockCount); - if (OpenSlotCount == 0) return Get_Return(2); + if (OpenSlots.length == 0) return Get_Return(2); var global = Get_GlobalValueTable(); var matdata = global.find(f => f.s_ID == "n_BreakingLimitSlotMaterialID"); @@ -946,20 +948,41 @@ handlers.Save_PC_LimitSlotOptionChange = function(args) var price = 10 * ((1 + LockCount) * LockCount / 2 + 1); if (Use_Item(Get_MissionTable(), urod, matdata.n_Value, price)) + //if (Use_Item(Get_MissionTable(), urod, 1, 0)) { var rtnAdd = []; // [{ slot, randombagid, optionlv }] // 슬롯만큼 for문 돌리기 - var limitslotmagicrateTable = Get_LimitSlotMagicRateTable(); - var randombaTable = Get_RandomBagTable(); - var enchantgradeTable = Get_EnchantGradeTable(); + for (var i = 0; i < OpenSlots.length; ++i) + { + log.info("슬롯 : " + OpenSlots[i]); + var limitslotmagicrateTable = Get_LimitSlotMagicRateTable(); + var lv = urod.PC.LLv; + if (lv > 9) lv = 9; + var lsmc_data = limitslotmagicrateTable.find(f=>f.n_NeedLimitLv == lv); + //log.info("초월 레벨 : " + urod.PC.LLv + ", " + lv); + //log.info(lsmc_data); + var randombaTable = Get_RandomBagTable(); + var enchantgradeTable = Get_EnchantGradeTable(); + var grade = GetRandomGachaGrade(lv); + //log.info("등급 : " + grade); + // 랜덤백에서 아이템 id 얻기 + var optionitemID = Get_RandomItemId(lsmc_data.n_DropIndex, grade); + //log.info("랜덤백 ID : " + optionitemID); + // 인챈트그레이드에서 옵션 레벨 얻기 + var enchantgrade_data = enchantgradeTable.find(f=>f.n_EnchantGrade == grade); + //log.info(enchantgrade_data); + var olv = getRandomIntInclusive(enchantgrade_data.n_OptionLevelMin, enchantgrade_data.n_OptionLevelMax); + //log.info(olv); - var grade = GetRandomGachaGrade(urod.PC.LLv); - // 랜덤백에서 아이템 id 얻기 - // 인챈트그레이드에서 옵션 레벨 얻기 + rtnAdd.push({ slot : OpenSlots[i], randombagid : optionitemID, optionlv : olv }); + } + //log.info(rtnAdd); Set_JsonUserData(urod); return Get_Return(0, rtnAdd); } + else + return Get_Return(2); } /////////////////////////////////// 서버 처리 @@ -3452,6 +3475,29 @@ function Get_RandomBagTable() } ] } +function Get_RandomItemId(dropIndex, grade) { + var randombaTable = Get_RandomBagTable(); + const items = randombaTable.filter(f => + f.n_DropIndex == dropIndex && f.n_ItemGrade == grade + ); + + if (items.length === 0) return null; + + // 가중치 누적합 + const weights = items.map(f => parseFloat(f.f_DropRate)); + const total = weights.reduce((sum, w) => sum + w, 0); + + let rand = Math.random() * total; + for (let i = 0; i < items.length; i++) { + if (rand < weights[i]) { + return items[i].n_ItemId; + } + rand -= weights[i]; + } + + return null; +} + function Get_PlayOCoupons() { @@ -3492,6 +3538,11 @@ function Get_K_Value(lv, balance, defaultval, perlv, abandon = true) { return val; } +function getRandomIntInclusive(min, max) { + min = Math.ceil(parseInt(min)); + max = Math.floor(parseInt(max)); + return Math.floor(Math.random() * (max - min + 1)) + min; +}