feat(combat-feel): 적 개별 차례 시퀀스 (ActFrame·EnemyActStep)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -939,6 +939,17 @@ function upsertUi() {
|
|||||||
});
|
});
|
||||||
targetFrame.jsonString.enable = false;
|
targetFrame.jsonString.enable = false;
|
||||||
combat.push(targetFrame);
|
combat.push(targetFrame);
|
||||||
|
const actFrame = entity({
|
||||||
|
id: guid('cmb', 240 + i), path: `${base}/ActFrame`, modelId: 'uisprite', entryId: 'UISprite',
|
||||||
|
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent',
|
||||||
|
displayOrder: 0,
|
||||||
|
components: [
|
||||||
|
transform({ parentW: SLOT_W, parentH: SLOT_H, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: SLOT_W + 16, y: SLOT_H + 12 }, pos: { x: 0, y: 0 } }),
|
||||||
|
sprite({ color: { r: 0.95, g: 0.3, b: 0.25, a: 0.3 }, type: 1 }),
|
||||||
|
],
|
||||||
|
});
|
||||||
|
actFrame.jsonString.enable = false;
|
||||||
|
combat.push(actFrame);
|
||||||
combat.push(entity({
|
combat.push(entity({
|
||||||
id: guid('cmb', 60 + i), path: `${base}/Name`, modelId: 'uitext', entryId: 'UIText',
|
id: guid('cmb', 60 + i), path: `${base}/Name`, modelId: 'uitext', entryId: 'UIText',
|
||||||
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent',
|
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent',
|
||||||
@@ -2179,12 +2190,7 @@ end
|
|||||||
self.Hand = {}
|
self.Hand = {}
|
||||||
self:RenderHand(false)
|
self:RenderHand(false)
|
||||||
self:RenderPiles()
|
self:RenderPiles()
|
||||||
self:EnemyTurn()
|
self:EnemyTurn()`),
|
||||||
self:CheckCombatEnd()
|
|
||||||
if self.CombatOver == true then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
_TimerService:SetTimerOnce(function() self:StartPlayerTurn() end, 0.45)`),
|
|
||||||
method('DrawCards', `for i = 1, amount do
|
method('DrawCards', `for i = 1, amount do
|
||||||
\tif #self.DrawPile <= 0 then
|
\tif #self.DrawPile <= 0 then
|
||||||
\t\tself:RecycleDiscardIntoDraw()
|
\t\tself:RecycleDiscardIntoDraw()
|
||||||
@@ -2578,14 +2584,27 @@ self.PlayerHp = self.PlayerHp - dmg
|
|||||||
if self.PlayerHp < 0 then
|
if self.PlayerHp < 0 then
|
||||||
self.PlayerHp = 0
|
self.PlayerHp = 0
|
||||||
end`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'amount' }]),
|
end`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'amount' }]),
|
||||||
method('EnemyTurn', `for i = 1, #self.Monsters do
|
method('EnemyTurn', `self.TurnBusy = true
|
||||||
local m = self.Monsters[i]
|
self:EnemyActStep(1)`),
|
||||||
if m.alive == true then
|
method('EnemyActStep', `local idx = 0
|
||||||
|
for i = fromIndex, #self.Monsters do
|
||||||
|
if self.Monsters[i].alive == true then idx = i; break end
|
||||||
|
end
|
||||||
|
if idx == 0 or self.PlayerHp <= 0 then
|
||||||
|
self:FinishEnemyTurn()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local m = self.Monsters[idx]
|
||||||
|
local base = "/ui/DefaultGroup/CombatHud/MonsterSlot" .. tostring(idx)
|
||||||
|
self:SetEntityEnabled(base .. "/ActFrame", true)
|
||||||
|
_TimerService:SetTimerOnce(function()
|
||||||
m.block = 0
|
m.block = 0
|
||||||
local intent = m.intents[m.intentIdx]
|
local intent = m.intents[m.intentIdx]
|
||||||
if intent ~= nil then
|
if intent ~= nil then
|
||||||
if intent.kind == "Attack" then
|
if intent.kind == "Attack" then
|
||||||
|
local before = self.PlayerHp
|
||||||
self:DealDamageToPlayer(intent.value)
|
self:DealDamageToPlayer(intent.value)
|
||||||
|
self:ShowPlayerDmgPop(before - self.PlayerHp)
|
||||||
elseif intent.kind == "Defend" then
|
elseif intent.kind == "Defend" then
|
||||||
m.block = m.block + intent.value
|
m.block = m.block + intent.value
|
||||||
end
|
end
|
||||||
@@ -2594,9 +2613,16 @@ end`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], N
|
|||||||
if m.intentIdx > #m.intents then
|
if m.intentIdx > #m.intents then
|
||||||
m.intentIdx = 1
|
m.intentIdx = 1
|
||||||
end
|
end
|
||||||
end
|
self:RenderCombat()
|
||||||
|
self:SetEntityEnabled(base .. "/ActFrame", false)
|
||||||
|
_TimerService:SetTimerOnce(function() self:EnemyActStep(idx + 1) end, 0.15)
|
||||||
|
end, 0.45)`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'fromIndex' }]),
|
||||||
|
method('FinishEnemyTurn', `self.TurnBusy = false
|
||||||
|
self:CheckCombatEnd()
|
||||||
|
if self.CombatOver == true then
|
||||||
|
return
|
||||||
end
|
end
|
||||||
self:RenderCombat()`),
|
_TimerService:SetTimerOnce(function() self:StartPlayerTurn() end, 0.45)`),
|
||||||
method('CheckCombatEnd', `local anyAlive = false
|
method('CheckCombatEnd', `local anyAlive = false
|
||||||
for i = 1, #self.Monsters do
|
for i = 1, #self.Monsters do
|
||||||
if self.Monsters[i].alive == true then anyAlive = true; break end
|
if self.Monsters[i].alive == true then anyAlive = true; break end
|
||||||
|
|||||||
Reference in New Issue
Block a user