feat(E6a): 다음 막 진행·적 스케일 — 멀티 act 런

보스 클리어 시 즉시 종료 대신 다음 막으로, 최종 막 보스에서 런 클리어.

- Floor를 막 카운터(1..ACT_COUNT=3)로 재정의, RunLength=ACT_COUNT
- StartCombat: 적을 막 배율(mult=1+(Floor-1)*0.6)로 스케일(maxHp·의도값, 새 테이블)
- CheckCombatEnd 보스 승리: Floor<RunLength면 다음 막(같은 맵 재사용·CurrentNodeId 리셋·ShowMap), 최종 막이면 '런 클리어!'
- HP/골드/덱/유물 막 간 유지(기존 영속), combatStart 유물 전투마다 재적용
- RenderRun HUD 라벨 '층'→'막'
- 메이커 Play 검증: 보스 120→192→264 스케일, 막 1→2→3, 3막 클리어, 영속 유지
- 제외: E6b 저장/불러오기(미진행)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-09 04:13:55 +09:00
parent ace489ed0f
commit f42628c2e9
2 changed files with 24 additions and 15 deletions

View File

@@ -935,6 +935,7 @@ function writeCodeblocks() {
const CARD_PRICE = 30;
const REST_HEAL = 30;
const RELIC_PRICE = 60;
const ACT_COUNT = 3;
const combat = codeblock('SlayDeckController', 'SlayDeckController', [
prop('any', 'DrawPile'),
prop('any', 'DiscardPile'),
@@ -978,8 +979,8 @@ function writeCodeblocks() {
method('StartRun', `self.PlayerMaxHp = 80
self.PlayerHp = self.PlayerMaxHp
self.Gold = 0
self.Floor = 0
self.RunLength = ${MAX_ROW}
self.Floor = 1
self.RunLength = ${ACT_COUNT}
self.RunDeck = { ${CARDS.starterDeck.map(luaStr).join(', ')} }
self.RunActive = true
self.RunRelics = {}
@@ -995,17 +996,17 @@ self:AddRelic("${RELICS.startingRelic}")
self:ShowMap()`),
method('StartCombat', `self.MaxEnergy = 3
self.Turn = 0
local node = self.MapNodes[self.CurrentNodeId]
if node ~= nil then
self.Floor = node.row
end
local enemy = self.Enemies[self.CurrentEnemyId]
local mult = 1 + (self.Floor - 1) * 0.6
self.PlayerBlock = 0
self.EnemyName = enemy.name
self.EnemyMaxHp = enemy.maxHp
self.EnemyMaxHp = math.floor(enemy.maxHp * mult)
self.EnemyHp = self.EnemyMaxHp
self.EnemyBlock = 0
self.EnemyIntents = enemy.intents
self.EnemyIntents = {}
for i = 1, #enemy.intents do
self.EnemyIntents[i] = { kind = enemy.intents[i].kind, value = math.floor(enemy.intents[i].value * mult) }
end
self.EnemyIntentIndex = 1
self.CombatOver = false
self.DiscardPile = {}
@@ -1268,8 +1269,16 @@ self:RenderCombat()`),
self:AddRelic(self.RelicPool[math.random(1, #self.RelicPool)])
end
if node ~= nil and node.type == "boss" then
self:ShowResult("런 클리어!")
self.RunActive = false
if self.Floor < self.RunLength then
self.Floor = self.Floor + 1
self.CurrentNodeId = ""
self.CurrentEnemyId = ""
self:RenderRun()
self:ShowMap()
else
self:ShowResult("런 클리어!")
self.RunActive = false
end
else
self:OfferReward()
end
@@ -1299,7 +1308,7 @@ self:SetText("/ui/DefaultGroup/CombatHud/EnemyIntent", intentText)
self:SetText("/ui/DefaultGroup/CombatHud/PlayerHp", "HP " .. string.format("%d", self.PlayerHp) .. "/" .. string.format("%d", self.PlayerMaxHp))
self:SetText("/ui/DefaultGroup/CombatHud/PlayerBlock", "방어 " .. string.format("%d", self.PlayerBlock))
self:RenderRun()`),
method('RenderRun', `self:SetText("/ui/DefaultGroup/CombatHud/Floor", " " .. string.format("%d", self.Floor) .. "/" .. string.format("%d", self.RunLength))
method('RenderRun', `self:SetText("/ui/DefaultGroup/CombatHud/Floor", " " .. string.format("%d", self.Floor) .. "/" .. string.format("%d", self.RunLength))
self:SetText("/ui/DefaultGroup/CombatHud/Gold", "골드 " .. string.format("%d", self.Gold))`),
method('OfferReward', `local pool = {}
for id, _ in pairs(self.Cards) do