메이커가 UI를 6개 UIGroup으로 분리하면서 발생한 2개 버그(시작이 MainMenu가 아니라 로비·NPC 상호작용 무반응) 근본 수정. 메이커 MCP 플레이테스트로 확정: - 원인1: 새 UIGroup(Select/Lobby/Run/Deck)이 DefaultShow=false라 시작 시 비활성. → ActivateUIGroups(ClientOnly)로 그룹 :SetEnable(true) 활성화. - 원인2: 컨트롤러의 중첩 self:SetEntityEnabled(.Enable 토글)가 비-DefaultGroup 스코프를 잃음(ExecSpace 6 RPC 재디스패치). → SetEntityEnabled를 ClientOnly(2)로 바꿔 인라인 실행 → 모든 UIGroup 해석. (.Text/RectSize/ImageRUID 등 다른 속성은 중첩에서도 정상이라 SetText/SetHpBar는 무변경.) - 원인3: OnBeginPlay가 UI 로드 전 실행 → DeckUIGroup 로드까지 폴링 후 ActivateUIGroups + ShowMainMenu. 검증(플레이테스트): 부트→MainMenu·시작→로비+LobbyUIGroup·run NPC→charselect 전부 정상. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
86 lines
4.7 KiB
JavaScript
86 lines
4.7 KiB
JavaScript
import { method, RUN_LENGTH, GOLD_PER_WIN, CARD_PRICE, REST_HEAL, RELIC_PRICE, ACT_COUNT, ACT_MAPS, LOBBY_MAP, LOBBY_SPAWN } from '../lib/codeblock.mjs';
|
|
import { CARDS, ENEMIES, CLASSES, JOBS, SOUL_UNLOCKS, CARDFRAMES, RARITIES, MAP_ROWS, MAP_COLS, CHEST_CLOSED_RUID, CHEST_OPEN_RUID, NODEICONS, CHARS, CAM, RELICS, POTIONS, luaSoulShopTable, frameRuid, luaFramesTable, luaNodeIconsTable, luaCharsTable, luaRelicsTable, luaPotionsTable, luaIntentsArray, luaEnemiesTable, luaStr, luaJobsTable, luaCardsTable, luaDeckTable } from '../lib/data.mjs';
|
|
import { UI_FILE, COMMON_FILE, UI_ROOT, GENERATED_UI_SECTIONS, UI_APPEND_ORDER, DISABLED_STOCK_CONTROLS, TRANSPARENT, DARK, GOLD, ATTACK, DEFEND, SKILL, DAMAGE_DIGIT_RUIDS, DAMAGE_POP_MAX_DIGITS, DAMAGE_POP_DIGIT_W, DAMAGE_POP_DIGIT_H, DAMAGE_POP_DIGIT_SPACING, MAX_MONSTERS, HEAD_OFFSET_Y, HP_BAR_W, WHITE, CARD_NAME_TEXT, CARD_DESC_TEXT, cardFaceLayout, CARD_W, CARD_H, CARD_SPACING, CARD_XS, ALIGN_CENTER, ALIGN_BOTTOM_CENTER, guid, transform, sprite, button, text, scrollLayoutGroup, popupLayerFor, uiOrderFor, displayOrderFor, applySortingOverride, entity, uiPath, sectionRoot, isGeneratedUiEntity, appendUiSection } from '../lib/ui-helpers.mjs';
|
|
|
|
export const bootMethods = [
|
|
method('OnBeginPlay', `${luaCardsTable(CARDS.cards)}
|
|
${luaFramesTable()}
|
|
${luaNodeIconsTable()}
|
|
${luaCharsTable()}
|
|
${luaSoulShopTable(SOUL_UNLOCKS)}
|
|
self.SoulUnlocks = {}
|
|
self.SoulPoints = self.SoulPoints or 0
|
|
local uiTries = 0
|
|
local uiInit = 0
|
|
uiInit = _TimerService:SetTimerRepeat(function()
|
|
uiTries = uiTries + 1
|
|
if _EntityService:GetEntityByPath("/ui/DeckUIGroup") ~= nil then
|
|
self:ActivateUIGroups()
|
|
self:ShowMainMenu()
|
|
_TimerService:ClearTimer(uiInit)
|
|
elseif uiTries > 80 then
|
|
_TimerService:ClearTimer(uiInit)
|
|
end
|
|
end, 0.1)
|
|
local lp = _UserService.LocalPlayer
|
|
if lp ~= nil then
|
|
self:ReqLoadAscension(lp.PlayerComponent.UserId)
|
|
self:ReqLoadSouls(lp.PlayerComponent.UserId)
|
|
end
|
|
_InputService:ConnectEvent(KeyDownEvent, function(e)
|
|
if e.key == KeyboardKey.LeftControl then
|
|
local lp2 = _UserService.LocalPlayer
|
|
if lp2 ~= nil and lp2.CurrentMapName == "${LOBBY_MAP}" and self.RunActive ~= true then
|
|
self:PlayerAttackMotion()
|
|
end
|
|
end
|
|
end)`),
|
|
method('ReqLoadAscension', `local ds = _DataStorageService:GetUserDataStorage(userId)
|
|
local errCode, value = ds:GetAndWait("ascensionUnlocked")
|
|
local n = 0
|
|
if errCode == 0 and value ~= nil and value ~= "" then
|
|
n = tonumber(value) or 0
|
|
end
|
|
self:RecvAscension(n, userId)`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'userId' }], 5),
|
|
method('RecvAscension', `self.AscensionUnlocked = n
|
|
if self.AscensionLevel > self.AscensionUnlocked then
|
|
self.AscensionLevel = self.AscensionUnlocked
|
|
end
|
|
self:RenderAscension()`, [
|
|
{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'n' },
|
|
{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'userId' },
|
|
], 6),
|
|
method('SaveAscension', `local ds = _DataStorageService:GetUserDataStorage(userId)
|
|
ds:SetAndWait("ascensionUnlocked", tostring(n))`, [
|
|
{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'n' },
|
|
{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'userId' },
|
|
], 5),
|
|
method('AdjustAscension', `local v = self.AscensionLevel + delta
|
|
if v < 0 then v = 0 end
|
|
if v > self.AscensionUnlocked then v = self.AscensionUnlocked end
|
|
self.AscensionLevel = v
|
|
self:RenderAscension()`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'delta' }]),
|
|
method('RenderAscension', `self:SetText("/ui/DefaultGroup/MainMenu/AscLabel", "승천 " .. string.format("%d", self.AscensionLevel) .. " / 해금 " .. string.format("%d", self.AscensionUnlocked))
|
|
self:SetText("/ui/LobbyUIGroup/LobbyHud/AscLabel", "승천 " .. string.format("%d", self.AscensionLevel) .. " / 해금 " .. string.format("%d", self.AscensionUnlocked))`),
|
|
method('AscHpMult', `local m = 1
|
|
if self.AscensionLevel >= 1 then m = m + 0.1 end
|
|
if self.AscensionLevel >= 6 then m = m + 0.1 end
|
|
return m`, [], 0, 'number'),
|
|
method('AscAtkMult', `local m = 1
|
|
if self.AscensionLevel >= 2 then m = m + 0.1 end
|
|
if self.AscensionLevel >= 7 then m = m + 0.1 end
|
|
return m`, [], 0, 'number'),
|
|
method('AscEliteBonus', `local b = 0
|
|
if self.AscensionLevel >= 4 then b = b + 0.2 end
|
|
if self.AscensionLevel >= 9 then b = b + 0.2 end
|
|
return b`, [], 0, 'number'),
|
|
method('AscGoldMult', `local m = 1
|
|
if self.AscensionLevel >= 5 then m = m - 0.25 end
|
|
if self.AscensionLevel >= 10 then m = m - 0.25 end
|
|
return m`, [], 0, 'number'),
|
|
method('AscStartHpPenalty', `local p = 0
|
|
if self.AscensionLevel >= 3 then p = p + 10 end
|
|
if self.AscensionLevel >= 8 then p = p + 10 end
|
|
return p`, [], 0, 'number'),
|
|
];
|