Save_PC_MenuBack 초월 옵션 추가 등

This commit is contained in:
Ino 2025-07-31 15:15:41 +09:00
parent d5ff5415ba
commit 8b09deff8f
6 changed files with 129 additions and 70 deletions

View File

@ -798,44 +798,47 @@ handlers.Save_PC_MenuBack = function(args)
var awakenupgradeid = Get_GlobalValue_nValue("AWAKEN_GOODS_UPGRADE");
var awakenUpgradeTable = Get_AwakenUpgradeTable();
var useawakenMatIds = {};
var allStatKeys = new Set();
for (var i = 0; i < awakenData.upgrade.length; ++i) allStatKeys.add(awakenData.upgrade[i].Key);
for (var i = 0; i < awakenData.awaken.length; ++i) allStatKeys.add(awakenData.awaken[i].Key);
for (var i = 0; i < awakenData.upgrade.length; ++i)
for (let statKey of allStatKeys)
{
var statKey = awakenData.upgrade[i].Key;
var upgradeValue = parseInt(awakenData.upgrade[i].Value || 0);
var awakenValue = parseInt(awakenData.awaken[i].Value || 0);
var upgradeValue = parseInt((awakenData.upgrade.find(x => x.Key === statKey)?.Value) || 0);
var awakenValue = parseInt((awakenData.awaken.find(x => x.Key === statKey)?.Value) || 0);
if (upgradeValue > 0)
for (var j = 0; j < upgradeValue; ++j)
{
var lv = urod.Awaken[statKey].Lv;
var audata = awakenUpgradeTable.find(f=>f.n_AwakenStep == lv);
if (urod.Awaken[statKey].Exp >= audata.n_MaxUpgradeLevel && awakenValue > 0)
{ // 각성 각성
var awakenmat = Get_GlobalValue_nValue(Get_PCAwakenMatKey(statKey));
if (!useawakenMatIds[awakenmat]) useawakenMatIds[awakenmat] = true;
if (Use_Item(table, urod, awakenmat, audata.n_AwakenGoodsCost))
{
--awakenValue;
urod.Awaken[statKey].Exp = 0;
++urod.Awaken[statKey].Lv;
--j;
continue;
}
else break;
}
var price = Get_K_Value(lv, audata.f_BalanceConstant, audata.n_DefaultUpgradeCostValue, audata.f_CountPerUpgradeCostValue);
if (urod.Awaken[statKey].Exp < audata.n_MaxUpgradeLevel && Use_Item(table, urod, awakenupgradeid, price))
++urod.Awaken[statKey].Exp;
}
else if (awakenValue > 0)
for (var j = 0; j < upgradeValue; ++j)
{
var lv = urod.Awaken[statKey].Lv;
var audata = awakenUpgradeTable.find(f=>f.n_AwakenStep == lv);
var audata = awakenUpgradeTable.find(f => f.n_AwakenStep == lv);
if (urod.Awaken[statKey].Exp >= audata.n_MaxUpgradeLevel && awakenValue > 0)
{
var awakenmat = Get_GlobalValue_nValue(Get_PCAwakenMatKey(statKey));
if (!useawakenMatIds[awakenmat]) useawakenMatIds[awakenmat] = true;
if (Use_Item(table, urod, awakenmat, audata.n_AwakenGoodsCost))
{
--awakenValue;
urod.Awaken[statKey].Exp = 0;
++urod.Awaken[statKey].Lv;
--j; // 다시 반복
continue;
}
else break;
}
var price = Get_K_Value(lv, audata.f_BalanceConstant, audata.n_DefaultUpgradeCostValue, audata.f_CountPerUpgradeCostValue);
if (urod.Awaken[statKey].Exp < audata.n_MaxUpgradeLevel && Use_Item(table, urod, awakenupgradeid, price))
++urod.Awaken[statKey].Exp;
}
if (upgradeValue == 0 && awakenValue > 0)
{
var lv = urod.Awaken[statKey].Lv;
var audata = awakenUpgradeTable.find(f => f.n_AwakenStep == lv);
if (urod.Awaken[statKey].Exp >= audata.n_MaxUpgradeLevel)
{ // 각성 각성
{
var awakenmat = Get_GlobalValue_nValue(Get_PCAwakenMatKey(statKey));
if (!useawakenMatIds[awakenmat]) useawakenMatIds[awakenmat] = true;
if (Use_Item(table, urod, awakenmat, audata.n_AwakenGoodsCost))
@ -868,6 +871,13 @@ handlers.Save_PC_MenuBack = function(args)
// 초월 프리셋
urod.Equip.LimitPreset = args.Preset;
// 초월 옵션
log.info(args.LimitSlotData.Preset);
log.info(urod.LimitBreakOption.Preset);
urod.LimitBreakOption.Preset = args.LimitSlotData.Preset;
log.info(urod.LimitBreakOption.Preset);
Set_LimitSlotOption(table, urod, args);
Set_JsonUserData(urod);
return Get_Return(0, {
awakekMats : rtn_awakenMatIds,
@ -1181,21 +1191,26 @@ handlers.Save_PC_LimitLvUp = function(args)
else
return Get_Return(1); // PC 레벨 부족
}
function Set_LimitSlotOption(table, urod, args, makeoption = false)
{
Use_Item(table, urod, Get_GlobalValue_nValue("n_BreakingLimitSlotMaterialID"), args.LimitSlotData.Price);
urod.LimitSlot = args.LimitSlotData.LimitSlot;
if (makeoption) Make_LimitBreakOption(urod);
Add_MissionCount(table, urod, "HERO_OPTION_CHANGE", 0, args.LimitSlotData.Count, false);
Add_MissionCount(table, urod, "HERO_OPTION_CHANGE_ACC", 0, args.LimitSlotData.Count, false);
}
handlers.Save_PC_LimitSlotOption = function(args)
{
var readonlydata = Get_UserReadOnlyData();
var error = Get_Error(readonlydata, args.Token);
if (error < 0) return Get_Return(error);
if (CheckNullOrEmpty(args.LimitSlotData)) return Get_Return(1);
var urod = Get_JsonUserData(readonlydata);
var table = Get_MissionTable();
Use_Item(table, urod, Get_GlobalValue_nValue("n_BreakingLimitSlotMaterialID"), args.UseAmount);
urod.LimitSlot = args.LimitSlot;
Make_LimitBreakOption(urod);
Add_MissionCount(table, urod, "HERO_OPTION_CHANGE", 0, args.ChangeCount, false);
Add_MissionCount(table, urod, "HERO_OPTION_CHANGE_ACC", 0, args.ChangeCount, false);
Set_LimitSlotOption(table, urod, args, true);
Set_JsonUserData(urod);
return Get_Return(0, { option : urod.LimitBreakOption });
}

View File

@ -859,7 +859,8 @@ public class ServerInfo : MyCoroutine
Set_Coroutine(() => { Save_StageResult(_act); }, 2f);
});
}
public void Save_PC_MenuBack(int costumeid, int workerid, int jobid, int preset, CS_AwakenData awakenData, Action<SC_PCMenuBackResult> _act)
public void Save_PC_MenuBack(int costumeid, int workerid, int jobid, int preset,
CS_AwakenData awakenData, LimitSlotChangeData limitslotData, Action<SC_PCMenuBackResult> _act)
{
NetWait.Ins.Set(true);
PlayFabClientAPI.ExecuteCloudScript(new ExecuteCloudScriptRequest
@ -873,7 +874,8 @@ public class ServerInfo : MyCoroutine
WorkerID = workerid,
JobID = jobid,
Preset = preset,
AwakenData = awakenData
AwakenData = awakenData,
LimitSlotData = limitslotData
}
},
result =>
@ -893,11 +895,11 @@ public class ServerInfo : MyCoroutine
}
}
else
Set_Coroutine(() => { Save_PC_MenuBack(costumeid, workerid, jobid, preset, awakenData, _act); }, 2f);
Set_Coroutine(() => { Save_PC_MenuBack(costumeid, workerid, jobid, preset, awakenData, limitslotData, _act); }, 2f);
},
fail =>
{
Set_Coroutine(() => { Save_PC_MenuBack(costumeid, workerid, jobid, preset, awakenData, _act); }, 2f);
Set_Coroutine(() => { Save_PC_MenuBack(costumeid, workerid, jobid, preset, awakenData, limitslotData, _act); }, 2f);
});
}
@ -1128,10 +1130,10 @@ public class ServerInfo : MyCoroutine
Set_Coroutine(() => { Save_PC_LimitLvUp(_act); }, 2f);
});
}
public void Save_PC_LimitSlotOption(int useAmount, int change, Action _act)
public void Save_PC_LimitSlotOption(LimitSlotChangeData limitslotData, Action _act)
{
NetWait.Ins.Set(true);
var serverread = m_ServerData.Get_ServerRead();
var lsd = limitslotData.Get();
PlayFabClientAPI.ExecuteCloudScript(new ExecuteCloudScriptRequest
{
FunctionName = MethodBase.GetCurrentMethod().Name,
@ -1139,9 +1141,7 @@ public class ServerInfo : MyCoroutine
FunctionParameter = new
{
Token = m_LoginInfo.EntityToken.EntityToken,
UseAmount = useAmount,
ChangeCount = change,
LimitSlot = serverread.LimitSlot
LimitSlotData = lsd
}
},
result =>
@ -1158,14 +1158,17 @@ public class ServerInfo : MyCoroutine
_act();
}
else
Set_Coroutine(() => { Save_PC_LimitSlotOption(useAmount, change, _act); }, 2f);
{
ToastUI.Ins.Set(174, "데이터 없음");
Set_Coroutine(() => { Save_PC_LimitSlotOption(limitslotData, _act); }, 5f);
}
}
else
Set_Coroutine(() => { Save_PC_LimitSlotOption(useAmount, change, _act); }, 2f);
Set_Coroutine(() => { Save_PC_LimitSlotOption(limitslotData, _act); }, 2f);
},
fail =>
{
Set_Coroutine(() => { Save_PC_LimitSlotOption(useAmount, change, _act); }, 2f);
Set_Coroutine(() => { Save_PC_LimitSlotOption(limitslotData, _act); }, 2f);
});
}
public void Save_PC_LimitSlotOptionChange(string preset, Action<SC_LimitOptionResult> _act)

View File

@ -88,20 +88,21 @@ public class PCLimitSlotCard : CardBase
public void Set_Change(string preset, int ipreset)
{
var sdata = ServerInfo.Ins.m_ServerData;
var optionindex = ipreset + 1;
var presetindex = ipreset;
if (!isCloseSlot() && !sdata.isLock_LimitSlot(preset, m_Slot))
{
var option = sdata.LimitBreakOption.Option[ipreset][sdata.LimitBreakOption.Preset[ipreset]++];
if (sdata.LimitBreakOption.Preset[ipreset] >= sdata.LimitBreakOption.Option[ipreset].Count)
var option = sdata.LimitBreakOption.Option[optionindex][sdata.LimitBreakOption.Preset[presetindex]++];
if (sdata.LimitBreakOption.Preset[presetindex] >= sdata.LimitBreakOption.Option[optionindex].Count)
{
sdata.LimitBreakOption.Preset[ipreset] = 0;
sdata.LimitBreakOption.Preset[presetindex] = 0;
// 다음 테이블 서버에서 받아오기
PCLimitUI.Ins.m_PCLimitUI_Right.ChangeOption = true;
}
sdata.Set_LimitSlotID(preset, m_Slot, option.id, option.lv);
sdata.Add_MissionCount(ePurpose.HERO_OPTION_CHANGE);
sdata.Add_MissionCount(ePurpose.HERO_OPTION_CHANGE_ACC);
++PCLimitUI.Ins.m_PCLimitUI_Right.MissionCount;
PCLimitUI.Ins.m_PCLimitUI_Right.MissionCount.RandomizeCryptoKey();
PCLimitUI.Ins.m_PCLimitUI_Right.m_LimitSlotChangeData.Add_MissionCount();
}
}
@ -113,11 +114,11 @@ public class PCLimitSlotCard : CardBase
var preset = PCLimitUI.Ins.m_PCLimitUI_Right.Get_Preset();
if (m_SData.ID > 0 || sdata.isLock_LimitSlot(preset, m_Slot))
{
ServerInfo.Ins.Save_PC_LimitSlotLock(preset, m_Slot, () =>
{
//ServerInfo.Ins.Save_PC_LimitSlotLock(preset, m_Slot, () =>
//{
sdata.Set_LimitSlotLock(preset, m_Slot);
PCLimitUI.Ins.m_PCLimitUI_Right.Set();
});
//});
}
}
}

View File

@ -1,10 +1,8 @@
public class PCLimitUI : PCUIMenu
{
public static bool isIns;
public static PCLimitUI Ins;
private void Awake()
{
Ins = this;
}
private void Awake() { isIns = true; Ins = this; }
public PCLimit_Center m_PCLimit_Center;
public PCLimitUI_Right m_PCLimitUI_Right;
@ -16,6 +14,7 @@ public class PCLimitUI : PCUIMenu
m_PCLimit_Center.Set();
m_PCLimitUI_Right.Set();
m_PCLimitUI_Right.m_LimitSlotChangeData.Init(true);
if (NewGameUI.Ins.m_PCUI.Get_EnterID(eItem.Preset) == 0)
NewGameUI.Ins.m_PCUI.Set_EnterID(eItem.Preset, ServerInfo.Ins.m_ServerData.Equip.LimitPreset);
}

View File

@ -3,6 +3,45 @@ using System.Collections.Generic;
using TMPro;
using UnityEngine;
public class LimitSlotChangeData
{
ObscuredInt TotalPrice, MissionCount;
// 아래는 서버에 전송할 데이터
public List<int> Preset;
public Dictionary<string, List<SD_PCLimitSlotData_Read>> LimitSlot = new Dictionary<string, List<SD_PCLimitSlotData_Read>>();
public int Price, Count;
public void Init(bool copydata)
{
TotalPrice = 0; TotalPrice.RandomizeCryptoKey();
MissionCount = 0; MissionCount.RandomizeCryptoKey();
}
void Copy_ServerLimitSlot()
{
LimitSlot.Clear();
var slotdata = ServerInfo.Ins.m_ServerData.LimitSlot;
foreach (var pair in slotdata)
{
var copiedList = new List<SD_PCLimitSlotData_Read>();
foreach (var data in pair.Value)
copiedList.Add(data.Get());
LimitSlot[pair.Key] = copiedList;
}
}
public LimitSlotChangeData Get()
{
Price = TotalPrice;
Count = MissionCount;
Preset = ServerInfo.Ins.m_ServerData.LimitBreakOption.Preset;
Copy_ServerLimitSlot();
return this;
}
public bool IsChangeLimitSlot() { return TotalPrice > 0; }
public void Add_TotalPrice(int price) { TotalPrice += price; TotalPrice.RandomizeCryptoKey(); }
public void Add_MissionCount() { ++MissionCount; MissionCount.RandomizeCryptoKey(); }
}
public class PCLimitUI_Right : uScrollViewMgr
{
public TabUIBase m_Tab;
@ -11,7 +50,7 @@ public class PCLimitUI_Right : uScrollViewMgr
public ButtonPress Btn_Change;
public bool ChangeOption;
public ObscuredInt TotalPrice, MissionCount;
public LimitSlotChangeData m_LimitSlotChangeData = new LimitSlotChangeData();
string m_Preset = "1";
int m_matID, m_CurProtectGrade, m_ProtectMaxGrade;
ObscuredInt mPrice;
@ -131,23 +170,23 @@ public class PCLimitUI_Right : uScrollViewMgr
{
var sdata = ServerInfo.Ins.m_ServerData;
sdata.Use_Item(m_matID, mPrice);
list_CardBase.ForEach(f => (f as PCLimitSlotCard).Set_Change(m_Preset, m_Tab.Get_Index() + 1));
list_CardBase.ForEach(f => (f as PCLimitSlotCard).Set_Change(m_Preset, m_Tab.Get_Index()));
Set();
MyValue.Get_ActorStatInfoorNull(eRole.PC);
NewGameUI.Ins.m_PCUI.Refresh_Money();
TotalPrice += mPrice; TotalPrice.RandomizeCryptoKey();
var changeData = PCLimitUI.Ins.m_PCLimitUI_Right.m_LimitSlotChangeData;
changeData.Add_TotalPrice(mPrice);
if (ChangeOption)
{
Btn_Change.ControlPress(false);
ServerInfo.Ins.Save_PC_LimitSlotOption(TotalPrice, MissionCount,
ServerInfo.Ins.Save_PC_LimitSlotOption(changeData,
() =>
{
ChangeOption = false;
Btn_Change.ControlPress(true);
TotalPrice = 0; TotalPrice.RandomizeCryptoKey();
MissionCount = 0; MissionCount.RandomizeCryptoKey();
changeData.Init(false);
});
}

View File

@ -50,14 +50,16 @@ public class PCUI : BotMenuBase
bool changejob = Get_EnterID(eItem.PC) > 0 && Get_EnterID(eItem.PC) != sdata.Get_EqiupmentEquip(eItem.PC);
bool changepreset = Get_EnterID(eItem.Preset) > 0 && Get_EnterID(eItem.Preset) != sdata.Equip.LimitPreset;
bool pcawakend = PCAwakenUI.isIns && PCAwakenUI.Ins.IsSendAwakenData();
bool changelimitslot = PCLimitUI.isIns && PCLimitUI.Ins.m_PCLimitUI_Right.m_LimitSlotChangeData.IsChangeLimitSlot();
if (changeCostume || changeworker || changejob || changepreset || pcawakend)
if (changeCostume || changeworker || changejob || changepreset || pcawakend || changelimitslot)
{
ServerInfo.Ins.Save_PC_MenuBack(sdata.Get_EqiupmentEquip(eItem.PCCostume),
sdata.Get_EqiupmentEquip(eItem.Worker),
sdata.Get_EqiupmentEquip(eItem.PC),
sdata.Equip.LimitPreset,
PCAwakenUI.isIns ? PCAwakenUI.Ins.Get_CS_AwakenData() : emptyawaken,
PCLimitUI.Ins.m_PCLimitUI_Right.m_LimitSlotChangeData.Get(),
result =>
{
for (int i = 0; i < result.awakekMats.Count; i++)