Save_PC_LimitSlotOptionChange 클라우드 스크립트 완료

This commit is contained in:
Ino 2025-07-03 09:07:58 +09:00
parent 9616316f5d
commit 6216927b56
1 changed files with 76 additions and 25 deletions

View File

@ -203,27 +203,29 @@ function Get_Return(errorval, add) {
time: Get_CurKoreaTime() time: Get_CurKoreaTime()
}; };
if (add && typeof add === 'object' && !Array.isArray(add)) { if (add)
for (var key in add) { {
if (add.hasOwnProperty(key)) { if (Array.isArray(add))
rtn[key] = add[key]; 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; 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" }
결과: Get_Return(1, [ { gold: 1000 }, { name: "player1" }, { time: "커스텀" } ]);
{ // 결과: { error: 1, time: "커스텀", gold: 1000, name: "player1" }
error: 0,
time: "2025-06-16T10:30:00.000Z", // 예시
gold: 1000,
name: "player1"
}
*/ */
} }
function Add_Item(table, itemtable, urod, itemid, amount, isCheat) 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) handlers.Save_PC_LimitSlotOptionChange = function(args)
{ {
var readonlydata = Get_UserReadOnlyData(); var readonlydata = Get_UserReadOnlyData();
var error = Get_Error(readonlydata, args.Token); //var error = Get_Error(readonlydata, args.Token);
if (error < 0) return Get_Return(error); //if (error < 0) return Get_Return(error);
var urod = Get_JsonUserData(readonlydata); var urod = Get_JsonUserData(readonlydata);
// 열려 있는 슬롯이 있는 지 확인 // 열려 있는 슬롯이 있는 지 확인
var OpenSlotCount = 0; var OpenSlots = [];
var LockCount = 0; var LockCount = 0;
var limittable = Get_BreakingLimitTable(); var limittable = Get_BreakingLimitTable();
var lst = urod.LimitSlot[args.Preset]; var lst = urod.LimitSlot[args.Preset];
@ -931,14 +933,14 @@ handlers.Save_PC_LimitSlotOptionChange = function(args)
var isOpen = limitdata.n_LimitLv <= urod.PC.LLv; var isOpen = limitdata.n_LimitLv <= urod.PC.LLv;
if (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; else ++LockCount;
} }
} }
log.info("OpenSlotCount : " + OpenSlotCount); log.info("OpenSlotCount : " + OpenSlots.length);
log.info("LockCount : " + LockCount); log.info("LockCount : " + LockCount);
if (OpenSlotCount == 0) return Get_Return(2); if (OpenSlots.length == 0) return Get_Return(2);
var global = Get_GlobalValueTable(); var global = Get_GlobalValueTable();
var matdata = global.find(f => f.s_ID == "n_BreakingLimitSlotMaterialID"); 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); var price = 10 * ((1 + LockCount) * LockCount / 2 + 1);
if (Use_Item(Get_MissionTable(), urod, matdata.n_Value, price)) if (Use_Item(Get_MissionTable(), urod, matdata.n_Value, price))
//if (Use_Item(Get_MissionTable(), urod, 1, 0))
{ {
var rtnAdd = []; // [{ slot, randombagid, optionlv }] var rtnAdd = []; // [{ slot, randombagid, optionlv }]
// 슬롯만큼 for문 돌리기 // 슬롯만큼 for문 돌리기
var limitslotmagicrateTable = Get_LimitSlotMagicRateTable(); for (var i = 0; i < OpenSlots.length; ++i)
var randombaTable = Get_RandomBagTable(); {
var enchantgradeTable = Get_EnchantGradeTable(); 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); rtnAdd.push({ slot : OpenSlots[i], randombagid : optionitemID, optionlv : olv });
// 랜덤백에서 아이템 id 얻기 }
// 인챈트그레이드에서 옵션 레벨 얻기
//log.info(rtnAdd);
Set_JsonUserData(urod); Set_JsonUserData(urod);
return Get_Return(0, rtnAdd); 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() function Get_PlayOCoupons()
{ {
@ -3492,6 +3538,11 @@ function Get_K_Value(lv, balance, defaultval, perlv, abandon = true) {
return val; 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;
}