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