Save_PC_LimitSlotOptionChange 클라우드 스크립트 완료
This commit is contained in:
parent
9616316f5d
commit
6216927b56
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue