Compare commits
10 Commits
de23829439
...
f33a5507db
| Author | SHA1 | Date | |
|---|---|---|---|
| f33a5507db | |||
| 647516d0cd | |||
| f704d0f14e | |||
| f0569d9a53 | |||
| a5c7d96770 | |||
| 423407325d | |||
| ec45438b3c | |||
| 020be477e6 | |||
| 9eef5eb66e | |||
| 185e0f3a94 |
@@ -32,10 +32,10 @@
|
|||||||
{
|
{
|
||||||
"@type": "script.SlayDeckController",
|
"@type": "script.SlayDeckController",
|
||||||
"Enable": true,
|
"Enable": true,
|
||||||
"Energy": 0.0,
|
"Energy": 0,
|
||||||
"MaxEnergy": 3.0,
|
"MaxEnergy": 3,
|
||||||
"Turn": 0.0,
|
"Turn": 0,
|
||||||
"TweenEventId": 0.0
|
"TweenEventId": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
|
|||||||
67
RootDesk/MyDesk/CombatMonster.codeblock
Normal file
67
RootDesk/MyDesk/CombatMonster.codeblock
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
{
|
||||||
|
"Id": "",
|
||||||
|
"GameId": "",
|
||||||
|
"EntryKey": "codeblock://combatmonster",
|
||||||
|
"ContentType": "x-mod/codeblock",
|
||||||
|
"Content": "",
|
||||||
|
"Usage": 0,
|
||||||
|
"UsePublish": 1,
|
||||||
|
"UseService": 0,
|
||||||
|
"CoreVersion": "26.5.0.0",
|
||||||
|
"StudioVersion": "",
|
||||||
|
"DynamicLoading": 0,
|
||||||
|
"ContentProto": {
|
||||||
|
"Use": "Json",
|
||||||
|
"Json": {
|
||||||
|
"CoreVersion": {
|
||||||
|
"Major": 0,
|
||||||
|
"Minor": 2
|
||||||
|
},
|
||||||
|
"ScriptVersion": {
|
||||||
|
"Major": 1,
|
||||||
|
"Minor": 0
|
||||||
|
},
|
||||||
|
"Description": "",
|
||||||
|
"Id": "CombatMonster",
|
||||||
|
"Language": 1,
|
||||||
|
"Name": "CombatMonster",
|
||||||
|
"Type": 1,
|
||||||
|
"Source": 0,
|
||||||
|
"Target": null,
|
||||||
|
"Properties": [
|
||||||
|
{
|
||||||
|
"Type": "string",
|
||||||
|
"DefaultValue": "\"\"",
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "EnemyId"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "number",
|
||||||
|
"DefaultValue": "0",
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "RegTries"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Methods": [
|
||||||
|
{
|
||||||
|
"Return": {
|
||||||
|
"Type": "void",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": null
|
||||||
|
},
|
||||||
|
"Arguments": [],
|
||||||
|
"Code": "self.RegTries = 0\nlocal eventId = 0\nlocal function reg()\n\tself.RegTries = self.RegTries + 1\n\tlocal c = _EntityService:GetEntityByPath(\"/common\")\n\tif c ~= nil and c.SlayDeckController ~= nil then\n\t\tc.SlayDeckController:RegisterMonster(self.Entity, self.EnemyId)\n\t\t_TimerService:ClearTimer(eventId)\n\telseif self.RegTries > 50 then\n\t\t_TimerService:ClearTimer(eventId)\n\tend\nend\neventId = _TimerService:SetTimerRepeat(reg, 0.1)",
|
||||||
|
"Scope": 2,
|
||||||
|
"ExecSpace": 6,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "OnBeginPlay"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"EntityEventHandlers": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -120,34 +120,6 @@
|
|||||||
"Attributes": [],
|
"Attributes": [],
|
||||||
"Name": "PlayerBlock"
|
"Name": "PlayerBlock"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"Type": "number",
|
|
||||||
"DefaultValue": "0",
|
|
||||||
"SyncDirection": 0,
|
|
||||||
"Attributes": [],
|
|
||||||
"Name": "EnemyHp"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Type": "number",
|
|
||||||
"DefaultValue": "45",
|
|
||||||
"SyncDirection": 0,
|
|
||||||
"Attributes": [],
|
|
||||||
"Name": "EnemyMaxHp"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Type": "number",
|
|
||||||
"DefaultValue": "0",
|
|
||||||
"SyncDirection": 0,
|
|
||||||
"Attributes": [],
|
|
||||||
"Name": "EnemyBlock"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Type": "number",
|
|
||||||
"DefaultValue": "1",
|
|
||||||
"SyncDirection": 0,
|
|
||||||
"Attributes": [],
|
|
||||||
"Name": "EnemyIntentIndex"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"Type": "boolean",
|
"Type": "boolean",
|
||||||
"DefaultValue": "false",
|
"DefaultValue": "false",
|
||||||
@@ -160,14 +132,28 @@
|
|||||||
"DefaultValue": "nil",
|
"DefaultValue": "nil",
|
||||||
"SyncDirection": 0,
|
"SyncDirection": 0,
|
||||||
"Attributes": [],
|
"Attributes": [],
|
||||||
"Name": "EnemyIntents"
|
"Name": "Monsters"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Type": "any",
|
"Type": "any",
|
||||||
"DefaultValue": "nil",
|
"DefaultValue": "nil",
|
||||||
"SyncDirection": 0,
|
"SyncDirection": 0,
|
||||||
"Attributes": [],
|
"Attributes": [],
|
||||||
"Name": "EnemyName"
|
"Name": "Registered"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "number",
|
||||||
|
"DefaultValue": "1",
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "TargetIndex"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "any",
|
||||||
|
"DefaultValue": "nil",
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "SlotPos"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Type": "any",
|
"Type": "any",
|
||||||
@@ -396,7 +382,7 @@
|
|||||||
"Name": null
|
"Name": null
|
||||||
},
|
},
|
||||||
"Arguments": [],
|
"Arguments": [],
|
||||||
"Code": "self.PlayerMaxHp = 80\nself.PlayerHp = self.PlayerMaxHp\nself.Gold = 0\nself.Floor = 1\nself.RunLength = 3\nself.RunDeck = { \"Strike\", \"Strike\", \"Strike\", \"Strike\", \"Strike\", \"Defend\", \"Defend\", \"Defend\", \"Defend\", \"Bash\" }\nself.RunActive = true\nself.RunRelics = {}\nself.Relics = {\n\tironHeart = { name = \"강철 심장\", desc = \"전투 시작 시 방어도 +6\", hook = \"combatStart\", effect = \"block\", value = 6 },\n\tenergyCore = { name = \"에너지 코어\", desc = \"턴 시작 시 에너지 +1\", hook = \"turnStart\", effect = \"energy\", value = 1 },\n\tvampire = { name = \"흡혈 송곳니\", desc = \"공격 카드 사용 시 HP +1\", hook = \"cardPlayed\", effect = \"healOnAttack\", value = 1 },\n\tgoldIdol = { name = \"황금 우상\", desc = \"전투 승리 시 골드 +10\", hook = \"combatReward\", effect = \"gold\", value = 10 },\n}\nself.RelicPool = { \"energyCore\", \"vampire\", \"goldIdol\" }\nself.Enemies = {\n\tslime = { name = \"슬라임\", maxHp = 45, intents = { { kind = \"Attack\", value = 10 }, { kind = \"Attack\", value = 6 }, { kind = \"Defend\", value = 8 } } },\n\tslime_elite = { name = \"정예 슬라임\", maxHp = 70, intents = { { kind = \"Attack\", value = 14 }, { kind = \"Attack\", value = 8 }, { kind = \"Defend\", value = 10 } } },\n\tslime_boss = { name = \"슬라임 킹\", maxHp = 120, intents = { { kind = \"Attack\", value = 18 }, { kind = \"Defend\", value = 12 }, { kind = \"Attack\", value = 10 }, { kind = \"Attack\", value = 22 } } },\n}\nself.MapNodes = {\n\tA = { type = \"combat\", enemy = \"slime\", row = 1, col = -1, next = { \"C\", \"D\" } },\n\tB = { type = \"combat\", enemy = \"slime\", row = 1, col = 1, next = { \"C\", \"D\" } },\n\tC = { type = \"rest\", row = 2, col = -1, next = { \"E\", \"F\" } },\n\tD = { type = \"shop\", row = 2, col = 1, next = { \"E\", \"F\" } },\n\tE = { type = \"elite\", enemy = \"slime_elite\", row = 3, col = -1, next = { \"BOSS\" } },\n\tF = { type = \"combat\", enemy = \"slime\", row = 3, col = 1, next = { \"BOSS\" } },\n\tBOSS = { type = \"boss\", enemy = \"slime_boss\", row = 4, col = 0, next = { } },\n}\nself.MapStart = { \"A\", \"B\" }\nself.CurrentNodeId = \"\"\nself.CurrentEnemyId = \"\"\nself:BindButtons()\nself:AddRelic(\"ironHeart\")\nself:ShowMap()",
|
"Code": "self.PlayerMaxHp = 80\nself.PlayerHp = self.PlayerMaxHp\nself.Gold = 0\nself.Floor = 1\nself.RunLength = 3\nself.RunDeck = { \"Strike\", \"Strike\", \"Strike\", \"Strike\", \"Strike\", \"Defend\", \"Defend\", \"Defend\", \"Defend\", \"Bash\" }\nself.RunActive = true\nself.RunRelics = {}\nself.Relics = {\n\tironHeart = { name = \"강철 심장\", desc = \"전투 시작 시 방어도 +6\", hook = \"combatStart\", effect = \"block\", value = 6 },\n\tenergyCore = { name = \"에너지 코어\", desc = \"턴 시작 시 에너지 +1\", hook = \"turnStart\", effect = \"energy\", value = 1 },\n\tvampire = { name = \"흡혈 송곳니\", desc = \"공격 카드 사용 시 HP +1\", hook = \"cardPlayed\", effect = \"healOnAttack\", value = 1 },\n\tgoldIdol = { name = \"황금 우상\", desc = \"전투 승리 시 골드 +10\", hook = \"combatReward\", effect = \"gold\", value = 10 },\n}\nself.RelicPool = { \"energyCore\", \"vampire\", \"goldIdol\" }\nself.Enemies = {\n\tslime = { name = \"슬라임\", maxHp = 45, intents = { { kind = \"Attack\", value = 10 }, { kind = \"Attack\", value = 6 }, { kind = \"Defend\", value = 8 } } },\n\tslime_elite = { name = \"정예 슬라임\", maxHp = 70, intents = { { kind = \"Attack\", value = 14 }, { kind = \"Attack\", value = 8 }, { kind = \"Defend\", value = 10 } } },\n\tslime_boss = { name = \"슬라임 킹\", maxHp = 120, intents = { { kind = \"Attack\", value = 18 }, { kind = \"Defend\", value = 12 }, { kind = \"Attack\", value = 10 }, { kind = \"Attack\", value = 22 } } },\n\torange_mushroom = { name = \"주황버섯\", maxHp = 16, intents = { { kind = \"Attack\", value = 5 }, { kind = \"Defend\", value = 4 }, { kind = \"Attack\", value = 7 } } },\n\tblue_mushroom = { name = \"파란버섯\", maxHp = 22, intents = { { kind = \"Attack\", value = 8 }, { kind = \"Attack\", value = 4 } } },\n}\nself.MapNodes = {\n\tA = { type = \"combat\", enemy = \"slime\", row = 1, col = -1, next = { \"C\", \"D\" } },\n\tB = { type = \"combat\", enemy = \"slime\", row = 1, col = 1, next = { \"C\", \"D\" } },\n\tC = { type = \"rest\", row = 2, col = -1, next = { \"E\", \"F\" } },\n\tD = { type = \"shop\", row = 2, col = 1, next = { \"E\", \"F\" } },\n\tE = { type = \"elite\", enemy = \"slime_elite\", row = 3, col = -1, next = { \"BOSS\" } },\n\tF = { type = \"combat\", enemy = \"slime\", row = 3, col = 1, next = { \"BOSS\" } },\n\tBOSS = { type = \"boss\", enemy = \"slime_boss\", row = 4, col = 0, next = { } },\n}\nself.MapStart = { \"A\", \"B\" }\nself.SlotPos = { { x = 430, y = 140 }, { x = 600, y = 140 }, { x = 770, y = 140 }, { x = 900, y = 140 } }\nself.CurrentNodeId = \"\"\nself.CurrentEnemyId = \"\"\nself:BindButtons()\nself:AddRelic(\"ironHeart\")\nself:ShowMap()",
|
||||||
"Scope": 2,
|
"Scope": 2,
|
||||||
"ExecSpace": 6,
|
"ExecSpace": 6,
|
||||||
"Attributes": [],
|
"Attributes": [],
|
||||||
@@ -411,12 +397,80 @@
|
|||||||
"Name": null
|
"Name": null
|
||||||
},
|
},
|
||||||
"Arguments": [],
|
"Arguments": [],
|
||||||
"Code": "self.MaxEnergy = 3\nself.Turn = 0\nlocal enemy = self.Enemies[self.CurrentEnemyId]\nlocal mult = 1 + (self.Floor - 1) * 0.6\nself.PlayerBlock = 0\nself.EnemyName = enemy.name\nself.EnemyMaxHp = math.floor(enemy.maxHp * mult)\nself.EnemyHp = self.EnemyMaxHp\nself.EnemyBlock = 0\nself.EnemyIntents = {}\nfor i = 1, #enemy.intents do\n\tself.EnemyIntents[i] = { kind = enemy.intents[i].kind, value = math.floor(enemy.intents[i].value * mult) }\nend\nself.EnemyIntentIndex = 1\nself.CombatOver = false\nself.DiscardPile = {}\nself.Hand = {}\nself.Cards = {\n\tStrike = { name = \"타격\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6 },\n\tDefend = { name = \"방어\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5 },\n\tBash = { name = \"강타\", cost = 2, desc = \"피해 10\", kind = \"Attack\", damage = 10 },\n}\nself.DrawPile = {}\nfor i = 1, #self.RunDeck do\n\tself.DrawPile[i] = self.RunDeck[i]\nend\nself:Shuffle(self.DrawPile)\nself:RenderCombat()\nself:StartPlayerTurn()\nself:ApplyRelics(\"combatStart\")\nself:RenderCombat()",
|
"Code": "self.MaxEnergy = 3\nself.Turn = 0\nself.PlayerBlock = 0\nself.CombatOver = false\nself.DiscardPile = {}\nself.Hand = {}\nself.Cards = {\n\tStrike = { name = \"타격\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6 },\n\tDefend = { name = \"방어\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5 },\n\tBash = { name = \"강타\", cost = 2, desc = \"피해 10\", kind = \"Attack\", damage = 10 },\n}\nself.DrawPile = {}\nfor i = 1, #self.RunDeck do\n\tself.DrawPile[i] = self.RunDeck[i]\nend\nself:Shuffle(self.DrawPile)\nself:BuildMonsters()\nself:RenderCombat()\nself:StartPlayerTurn()\nself:ApplyRelics(\"combatStart\")\nself:RenderCombat()",
|
||||||
"Scope": 2,
|
"Scope": 2,
|
||||||
"ExecSpace": 6,
|
"ExecSpace": 6,
|
||||||
"Attributes": [],
|
"Attributes": [],
|
||||||
"Name": "StartCombat"
|
"Name": "StartCombat"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"Return": {
|
||||||
|
"Type": "void",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": null
|
||||||
|
},
|
||||||
|
"Arguments": [
|
||||||
|
{
|
||||||
|
"Type": "any",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "monster"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "string",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "enemyId"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Code": "if self.Registered == nil then\n\tself.Registered = {}\nend\ntable.insert(self.Registered, { entity = monster, enemyId = enemyId })",
|
||||||
|
"Scope": 2,
|
||||||
|
"ExecSpace": 6,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "RegisterMonster"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Return": {
|
||||||
|
"Type": "void",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": null
|
||||||
|
},
|
||||||
|
"Arguments": [],
|
||||||
|
"Code": "self.Monsters = {}\nlocal reg = self.Registered or {}\nlocal list = {}\nfor i = 1, #reg do\n\tlocal r = reg[i]\n\tif r.entity ~= nil and isvalid(r.entity) then\n\t\tlocal x = 0\n\t\tif r.entity.TransformComponent ~= nil then\n\t\t\tx = r.entity.TransformComponent.WorldPosition.x\n\t\tend\n\t\ttable.insert(list, { entity = r.entity, enemyId = r.enemyId, x = x })\n\tend\nend\ntable.sort(list, function(a, b) return a.x < b.x end)\nlocal mult = 1 + (self.Floor - 1) * 0.6\nlocal n = #list\nif n > 4 then n = 4 end\nfor i = 1, n do\n\tlocal item = list[i]\n\tlocal e = self.Enemies[item.enemyId]\n\tif e == nil then e = { name = item.enemyId, maxHp = 10, intents = { { kind = \"Attack\", value = 5 } } } end\n\tlocal intents = {}\n\tfor k = 1, #e.intents do\n\t\tintents[k] = { kind = e.intents[k].kind, value = math.floor(e.intents[k].value * mult) }\n\tend\n\tlocal maxHp = math.floor(e.maxHp * mult)\n\tself.Monsters[i] = { entity = item.entity, enemyId = item.enemyId, name = e.name,\n\t\thp = maxHp, maxHp = maxHp, block = 0, intents = intents, intentIdx = 1, alive = true, slot = i }\n\tself:ReviveMonsterEntity(item.entity)\n\tself:PositionMonsterSlot(i)\nend\nself.TargetIndex = 1",
|
||||||
|
"Scope": 2,
|
||||||
|
"ExecSpace": 6,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "BuildMonsters"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Return": {
|
||||||
|
"Type": "void",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": null
|
||||||
|
},
|
||||||
|
"Arguments": [
|
||||||
|
{
|
||||||
|
"Type": "any",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "monster"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Code": "if monster == nil or not isvalid(monster) then\n\treturn\nend\nmonster:SetEnable(true)\nmonster:SetVisible(true)",
|
||||||
|
"Scope": 2,
|
||||||
|
"ExecSpace": 6,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "ReviveMonsterEntity"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"Return": {
|
"Return": {
|
||||||
"Type": "void",
|
"Type": "void",
|
||||||
@@ -449,7 +503,7 @@
|
|||||||
"Name": null
|
"Name": null
|
||||||
},
|
},
|
||||||
"Arguments": [],
|
"Arguments": [],
|
||||||
"Code": "local endTurn = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckHud/EndTurnButton\")\nif endTurn ~= nil and endTurn.ButtonComponent ~= nil then\n\tif self.EndTurnHandler ~= nil then\n\t\tendTurn:DisconnectEvent(ButtonClickEvent, self.EndTurnHandler)\n\t\tself.EndTurnHandler = nil\n\tend\n\tself.EndTurnHandler = endTurn:ConnectEvent(ButtonClickEvent, function() self:EndPlayerTurn() end)\nend\nfor i = 1, 5 do\n\tlocal cardEntity = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/CardHand/Card\" .. tostring(i))\n\tif cardEntity ~= nil and cardEntity.ButtonComponent ~= nil then\n\t\tcardEntity:ConnectEvent(ButtonClickEvent, function() self:PlayCard(i) end)\n\tend\nend\nfor i = 1, 3 do\n\tlocal rc = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RewardHud/Reward\" .. tostring(i))\n\tif rc ~= nil and rc.ButtonComponent ~= nil then\n\t\trc:ConnectEvent(ButtonClickEvent, function() self:PickReward(i) end)\n\tend\nend\nlocal skip = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RewardHud/Skip\")\nif skip ~= nil and skip.ButtonComponent ~= nil then\n\tskip:ConnectEvent(ButtonClickEvent, function() self:PickReward(0) end)\nend\nlocal mapNodeIds = { \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"BOSS\" }\nfor i = 1, #mapNodeIds do\n\tlocal nid = mapNodeIds[i]\n\tlocal mn = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/MapHud/Node_\" .. nid)\n\tif mn ~= nil and mn.ButtonComponent ~= nil then\n\t\tmn:ConnectEvent(ButtonClickEvent, function() self:PickNode(nid) end)\n\tend\nend\nfor i = 1, 3 do\n\tlocal sc = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/ShopHud/Card\" .. tostring(i))\n\tif sc ~= nil and sc.ButtonComponent ~= nil then\n\t\tsc:ConnectEvent(ButtonClickEvent, function() self:BuyCard(i) end)\n\tend\nend\nlocal shopLeave = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/ShopHud/Leave\")\nif shopLeave ~= nil and shopLeave.ButtonComponent ~= nil then\n\tshopLeave:ConnectEvent(ButtonClickEvent, function() self:LeaveNode() end)\nend\nlocal shopRelic = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/ShopHud/Relic\")\nif shopRelic ~= nil and shopRelic.ButtonComponent ~= nil then\n\tshopRelic:ConnectEvent(ButtonClickEvent, function() self:BuyRelic() end)\nend\nlocal restLeave = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RestHud/Leave\")\nif restLeave ~= nil and restLeave.ButtonComponent ~= nil then\n\trestLeave:ConnectEvent(ButtonClickEvent, function() self:LeaveNode() end)\nend",
|
"Code": "local endTurn = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckHud/EndTurnButton\")\nif endTurn ~= nil and endTurn.ButtonComponent ~= nil then\n\tif self.EndTurnHandler ~= nil then\n\t\tendTurn:DisconnectEvent(ButtonClickEvent, self.EndTurnHandler)\n\t\tself.EndTurnHandler = nil\n\tend\n\tself.EndTurnHandler = endTurn:ConnectEvent(ButtonClickEvent, function() self:EndPlayerTurn() end)\nend\nfor i = 1, 5 do\n\tlocal cardEntity = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/CardHand/Card\" .. tostring(i))\n\tif cardEntity ~= nil and cardEntity.ButtonComponent ~= nil then\n\t\tcardEntity:ConnectEvent(ButtonClickEvent, function() self:PlayCard(i) end)\n\tend\nend\nfor i = 1, 3 do\n\tlocal rc = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RewardHud/Reward\" .. tostring(i))\n\tif rc ~= nil and rc.ButtonComponent ~= nil then\n\t\trc:ConnectEvent(ButtonClickEvent, function() self:PickReward(i) end)\n\tend\nend\nlocal skip = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RewardHud/Skip\")\nif skip ~= nil and skip.ButtonComponent ~= nil then\n\tskip:ConnectEvent(ButtonClickEvent, function() self:PickReward(0) end)\nend\nlocal mapNodeIds = { \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"BOSS\" }\nfor i = 1, #mapNodeIds do\n\tlocal nid = mapNodeIds[i]\n\tlocal mn = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/MapHud/Node_\" .. nid)\n\tif mn ~= nil and mn.ButtonComponent ~= nil then\n\t\tmn:ConnectEvent(ButtonClickEvent, function() self:PickNode(nid) end)\n\tend\nend\nfor i = 1, 3 do\n\tlocal sc = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/ShopHud/Card\" .. tostring(i))\n\tif sc ~= nil and sc.ButtonComponent ~= nil then\n\t\tsc:ConnectEvent(ButtonClickEvent, function() self:BuyCard(i) end)\n\tend\nend\nlocal shopLeave = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/ShopHud/Leave\")\nif shopLeave ~= nil and shopLeave.ButtonComponent ~= nil then\n\tshopLeave:ConnectEvent(ButtonClickEvent, function() self:LeaveNode() end)\nend\nlocal shopRelic = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/ShopHud/Relic\")\nif shopRelic ~= nil and shopRelic.ButtonComponent ~= nil then\n\tshopRelic:ConnectEvent(ButtonClickEvent, function() self:BuyRelic() end)\nend\nlocal restLeave = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RestHud/Leave\")\nif restLeave ~= nil and restLeave.ButtonComponent ~= nil then\n\trestLeave:ConnectEvent(ButtonClickEvent, function() self:LeaveNode() end)\nend\nfor i = 1, 4 do\n\tlocal ms = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/CombatHud/MonsterSlot\" .. tostring(i))\n\tif ms ~= nil and ms.ButtonComponent ~= nil then\n\t\tms:ConnectEvent(ButtonClickEvent, function() self:SetTarget(i) end)\n\tend\nend",
|
||||||
"Scope": 2,
|
"Scope": 2,
|
||||||
"ExecSpace": 6,
|
"ExecSpace": 6,
|
||||||
"Attributes": [],
|
"Attributes": [],
|
||||||
@@ -682,7 +736,7 @@
|
|||||||
"Name": "slot"
|
"Name": "slot"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"Code": "if self.CombatOver == true then\n\treturn\nend\nif self.Hand == nil then\n\treturn\nend\nlocal cardId = self.Hand[slot]\nif cardId == nil then\n\treturn\nend\nlocal c = self.Cards[cardId]\nif c == nil then\n\treturn\nend\nif self.Energy < c.cost then\n\tself:Toast(\"에너지가 부족합니다\")\n\treturn\nend\nself.Energy = self.Energy - c.cost\nif c.kind == \"Attack\" then\n\tif c.damage ~= nil then\n\t\tself:DealDamageToEnemy(c.damage)\n\tend\n\tself:ApplyRelics(\"cardPlayed\")\nelseif c.kind == \"Skill\" then\n\tif c.block ~= nil then\n\t\tself.PlayerBlock = self.PlayerBlock + c.block\n\tend\nend\ntable.remove(self.Hand, slot)\ntable.insert(self.DiscardPile, cardId)\nself:RenderHand(false)\nself:RenderPiles()\nself:RenderCombat()\nself:CheckCombatEnd()",
|
"Code": "if self.CombatOver == true then\n\treturn\nend\nif self.Hand == nil then\n\treturn\nend\nlocal cardId = self.Hand[slot]\nif cardId == nil then\n\treturn\nend\nlocal c = self.Cards[cardId]\nif c == nil then\n\treturn\nend\nif self.Energy < c.cost then\n\tself:Toast(\"에너지가 부족합니다\")\n\treturn\nend\nself.Energy = self.Energy - c.cost\nif c.kind == \"Attack\" then\n\tif c.damage ~= nil then\n\t\tself:DealDamageToTarget(c.damage)\n\tend\n\tself:ApplyRelics(\"cardPlayed\")\nelseif c.kind == \"Skill\" then\n\tif c.block ~= nil then\n\t\tself.PlayerBlock = self.PlayerBlock + c.block\n\tend\nend\ntable.remove(self.Hand, slot)\ntable.insert(self.DiscardPile, cardId)\nself:RenderHand(false)\nself:RenderPiles()\nself:RenderCombat()\nself:CheckCombatEnd()",
|
||||||
"Scope": 2,
|
"Scope": 2,
|
||||||
"ExecSpace": 6,
|
"ExecSpace": 6,
|
||||||
"Attributes": [],
|
"Attributes": [],
|
||||||
@@ -728,11 +782,34 @@
|
|||||||
"Name": "amount"
|
"Name": "amount"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"Code": "local dmg = amount\nif self.EnemyBlock > 0 then\n\tlocal absorbed = math.min(self.EnemyBlock, dmg)\n\tself.EnemyBlock = self.EnemyBlock - absorbed\n\tdmg = dmg - absorbed\nend\nself.EnemyHp = self.EnemyHp - dmg\nif self.EnemyHp < 0 then\n\tself.EnemyHp = 0\nend",
|
"Code": "local m = self.Monsters[self.TargetIndex]\nif m == nil or m.alive ~= true then\n\tm = nil\n\tfor i = 1, #self.Monsters do\n\t\tif self.Monsters[i].alive == true then m = self.Monsters[i]; self.TargetIndex = i; break end\n\tend\nend\nif m == nil then\n\treturn\nend\nlocal dmg = amount\nif m.block > 0 then\n\tlocal absorbed = math.min(m.block, dmg)\n\tm.block = m.block - absorbed\n\tdmg = dmg - absorbed\nend\nm.hp = m.hp - dmg\nif m.hp <= 0 then\n\tm.hp = 0\n\tself:KillMonster(m.slot)\nend",
|
||||||
"Scope": 2,
|
"Scope": 2,
|
||||||
"ExecSpace": 6,
|
"ExecSpace": 6,
|
||||||
"Attributes": [],
|
"Attributes": [],
|
||||||
"Name": "DealDamageToEnemy"
|
"Name": "DealDamageToTarget"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Return": {
|
||||||
|
"Type": "void",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": null
|
||||||
|
},
|
||||||
|
"Arguments": [
|
||||||
|
{
|
||||||
|
"Type": "number",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "slot"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Code": "local m = self.Monsters[slot]\nif m == nil then\n\treturn\nend\nm.alive = false\nif m.entity ~= nil and isvalid(m.entity) then\n\tm.entity:SetVisible(false)\nend\nself:SetEntityEnabled(\"/ui/DefaultGroup/CombatHud/MonsterSlot\" .. tostring(slot), false)\nfor i = 1, #self.Monsters do\n\tif self.Monsters[i].alive == true then self.TargetIndex = i; break end\nend",
|
||||||
|
"Scope": 2,
|
||||||
|
"ExecSpace": 6,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "KillMonster"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Return": {
|
"Return": {
|
||||||
@@ -766,7 +843,7 @@
|
|||||||
"Name": null
|
"Name": null
|
||||||
},
|
},
|
||||||
"Arguments": [],
|
"Arguments": [],
|
||||||
"Code": "self.EnemyBlock = 0\nlocal intent = self.EnemyIntents[self.EnemyIntentIndex]\nif intent ~= nil then\n\tif intent.kind == \"Attack\" then\n\t\tself:DealDamageToPlayer(intent.value)\n\telseif intent.kind == \"Defend\" then\n\t\tself.EnemyBlock = self.EnemyBlock + intent.value\n\tend\nend\nself.EnemyIntentIndex = self.EnemyIntentIndex + 1\nif self.EnemyIntentIndex > #self.EnemyIntents then\n\tself.EnemyIntentIndex = 1\nend\nself:RenderCombat()",
|
"Code": "for i = 1, #self.Monsters do\n\tlocal m = self.Monsters[i]\n\tif m.alive == true then\n\t\tm.block = 0\n\t\tlocal intent = m.intents[m.intentIdx]\n\t\tif intent ~= nil then\n\t\t\tif intent.kind == \"Attack\" then\n\t\t\t\tself:DealDamageToPlayer(intent.value)\n\t\t\telseif intent.kind == \"Defend\" then\n\t\t\t\tm.block = m.block + intent.value\n\t\t\tend\n\t\tend\n\t\tm.intentIdx = m.intentIdx + 1\n\t\tif m.intentIdx > #m.intents then\n\t\t\tm.intentIdx = 1\n\t\tend\n\tend\nend\nself:RenderCombat()",
|
||||||
"Scope": 2,
|
"Scope": 2,
|
||||||
"ExecSpace": 6,
|
"ExecSpace": 6,
|
||||||
"Attributes": [],
|
"Attributes": [],
|
||||||
@@ -781,7 +858,7 @@
|
|||||||
"Name": null
|
"Name": null
|
||||||
},
|
},
|
||||||
"Arguments": [],
|
"Arguments": [],
|
||||||
"Code": "if self.EnemyHp <= 0 then\n\tself.CombatOver = true\n\tself.Gold = self.Gold + 15\n\tself:ApplyRelics(\"combatReward\")\n\tself:RenderRun()\n\tlocal node = self.MapNodes[self.CurrentNodeId]\n\tif node ~= nil and node.type == \"elite\" then\n\t\tself:AddRelic(self.RelicPool[math.random(1, #self.RelicPool)])\n\tend\n\tif node ~= nil and node.type == \"boss\" then\n\t\tif self.Floor < self.RunLength then\n\t\t\tself.Floor = self.Floor + 1\n\t\t\tself.CurrentNodeId = \"\"\n\t\t\tself.CurrentEnemyId = \"\"\n\t\t\tself:RenderRun()\n\t\t\tself:ShowMap()\n\t\telse\n\t\t\tself:ShowResult(\"런 클리어!\")\n\t\t\tself.RunActive = false\n\t\tend\n\telse\n\t\tself:OfferReward()\n\tend\nelseif self.PlayerHp <= 0 then\n\tself.CombatOver = true\n\tself:ShowResult(\"패배...\")\n\tself.RunActive = false\nend",
|
"Code": "local anyAlive = false\nfor i = 1, #self.Monsters do\n\tif self.Monsters[i].alive == true then anyAlive = true; break end\nend\nif anyAlive == false then\n\tself.CombatOver = true\n\tself.Gold = self.Gold + 15\n\tself:ApplyRelics(\"combatReward\")\n\tself:RenderRun()\n\tlocal node = self.MapNodes[self.CurrentNodeId]\n\tif node ~= nil and node.type == \"elite\" then\n\t\tself:AddRelic(self.RelicPool[math.random(1, #self.RelicPool)])\n\tend\n\tif node ~= nil and node.type == \"boss\" then\n\t\tif self.Floor < self.RunLength then\n\t\t\tself.Floor = self.Floor + 1\n\t\t\tself.CurrentNodeId = \"\"\n\t\t\tself.CurrentEnemyId = \"\"\n\t\t\tself:RenderRun()\n\t\t\tself:ShowMap()\n\t\telse\n\t\t\tself:ShowResult(\"런 클리어!\")\n\t\t\tself.RunActive = false\n\t\tend\n\telse\n\t\tself:OfferReward()\n\tend\nelseif self.PlayerHp <= 0 then\n\tself.CombatOver = true\n\tself:ShowResult(\"패배...\")\n\tself.RunActive = false\nend",
|
||||||
"Scope": 2,
|
"Scope": 2,
|
||||||
"ExecSpace": 6,
|
"ExecSpace": 6,
|
||||||
"Attributes": [],
|
"Attributes": [],
|
||||||
@@ -819,12 +896,95 @@
|
|||||||
"Name": null
|
"Name": null
|
||||||
},
|
},
|
||||||
"Arguments": [],
|
"Arguments": [],
|
||||||
"Code": "self:SetText(\"/ui/DefaultGroup/CombatHud/EnemyName\", self.EnemyName)\nself:SetText(\"/ui/DefaultGroup/CombatHud/EnemyHp\", \"HP \" .. string.format(\"%d\", self.EnemyHp) .. \"/\" .. string.format(\"%d\", self.EnemyMaxHp))\nself:SetText(\"/ui/DefaultGroup/CombatHud/EnemyBlock\", \"방어 \" .. string.format(\"%d\", self.EnemyBlock))\nlocal intent = self.EnemyIntents[self.EnemyIntentIndex]\nlocal intentText = \"\"\nif intent ~= nil then\n\tif intent.kind == \"Attack\" then\n\t\tintentText = \"의도: 공격 \" .. tostring(intent.value)\n\telseif intent.kind == \"Defend\" then\n\t\tintentText = \"의도: 방어 \" .. tostring(intent.value)\n\tend\nend\nself:SetText(\"/ui/DefaultGroup/CombatHud/EnemyIntent\", intentText)\nself:SetText(\"/ui/DefaultGroup/CombatHud/PlayerHp\", \"HP \" .. string.format(\"%d\", self.PlayerHp) .. \"/\" .. string.format(\"%d\", self.PlayerMaxHp))\nself:SetText(\"/ui/DefaultGroup/CombatHud/PlayerBlock\", \"방어 \" .. string.format(\"%d\", self.PlayerBlock))\nself:RenderRun()",
|
"Code": "for i = 1, 4 do\n\tlocal base = \"/ui/DefaultGroup/CombatHud/MonsterSlot\" .. tostring(i)\n\tlocal m = self.Monsters[i]\n\tif m ~= nil and m.alive == true then\n\t\tself:SetEntityEnabled(base, true)\n\t\tself:SetText(base .. \"/Name\", m.name)\n\t\tself:SetText(base .. \"/Hp\", string.format(\"%d\", m.hp) .. \"/\" .. string.format(\"%d\", m.maxHp))\n\t\tlocal intent = m.intents[m.intentIdx]\n\t\tlocal t = \"\"\n\t\tif intent ~= nil then\n\t\t\tif intent.kind == \"Attack\" then t = \"공격 \" .. tostring(intent.value)\n\t\t\telseif intent.kind == \"Defend\" then t = \"방어 \" .. tostring(intent.value) end\n\t\tend\n\t\tif i == self.TargetIndex then t = \"[타겟] \" .. t end\n\t\tself:SetText(base .. \"/Intent\", t)\n\t\tself:SetHpBar(base .. \"/HpBarFill\", m.hp, m.maxHp)\n\telse\n\t\tself:SetEntityEnabled(base, false)\n\tend\nend\nself:SetText(\"/ui/DefaultGroup/CombatHud/PlayerHp\", \"HP \" .. string.format(\"%d\", self.PlayerHp) .. \"/\" .. string.format(\"%d\", self.PlayerMaxHp))\nself:SetText(\"/ui/DefaultGroup/CombatHud/PlayerBlock\", \"방어 \" .. string.format(\"%d\", self.PlayerBlock))\nself:RenderRun()",
|
||||||
"Scope": 2,
|
"Scope": 2,
|
||||||
"ExecSpace": 6,
|
"ExecSpace": 6,
|
||||||
"Attributes": [],
|
"Attributes": [],
|
||||||
"Name": "RenderCombat"
|
"Name": "RenderCombat"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"Return": {
|
||||||
|
"Type": "void",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": null
|
||||||
|
},
|
||||||
|
"Arguments": [
|
||||||
|
{
|
||||||
|
"Type": "string",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "path"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "number",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "hp"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "number",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "maxHp"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Code": "local e = _EntityService:GetEntityByPath(path)\nif e == nil or e.UITransformComponent == nil then\n\treturn\nend\nlocal ratio = 0\nif maxHp > 0 then ratio = hp / maxHp end\nif ratio < 0 then ratio = 0 end\nlocal w = 120 * ratio\ne.UITransformComponent.RectSize = Vector2(w, 14)",
|
||||||
|
"Scope": 2,
|
||||||
|
"ExecSpace": 6,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "SetHpBar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Return": {
|
||||||
|
"Type": "void",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": null
|
||||||
|
},
|
||||||
|
"Arguments": [
|
||||||
|
{
|
||||||
|
"Type": "number",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "slot"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Code": "local sp = self.SlotPos\nif sp == nil or sp[slot] == nil then\n\treturn\nend\nlocal e = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/CombatHud/MonsterSlot\" .. tostring(slot))\nif e ~= nil and e.UITransformComponent ~= nil then\n\te.UITransformComponent.anchoredPosition = Vector2(sp[slot].x, sp[slot].y)\nend",
|
||||||
|
"Scope": 2,
|
||||||
|
"ExecSpace": 6,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "PositionMonsterSlot"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Return": {
|
||||||
|
"Type": "void",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": null
|
||||||
|
},
|
||||||
|
"Arguments": [
|
||||||
|
{
|
||||||
|
"Type": "number",
|
||||||
|
"DefaultValue": null,
|
||||||
|
"SyncDirection": 0,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "slot"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Code": "if self.Monsters[slot] ~= nil and self.Monsters[slot].alive == true then\n\tself.TargetIndex = slot\n\tself:RenderCombat()\nend",
|
||||||
|
"Scope": 2,
|
||||||
|
"ExecSpace": 6,
|
||||||
|
"Attributes": [],
|
||||||
|
"Name": "SetTarget"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"Return": {
|
"Return": {
|
||||||
"Type": "void",
|
"Type": "void",
|
||||||
|
|||||||
6
data/monster-slots.json
Normal file
6
data/monster-slots.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
[
|
||||||
|
{ "x": 430, "y": 140 },
|
||||||
|
{ "x": 600, "y": 140 },
|
||||||
|
{ "x": 770, "y": 140 },
|
||||||
|
{ "x": 900, "y": 140 }
|
||||||
|
]
|
||||||
@@ -6366,7 +6366,7 @@
|
|||||||
{
|
{
|
||||||
"id": "595374e9-e49a-4733-b00f-77e8e61dad59",
|
"id": "595374e9-e49a-4733-b00f-77e8e61dad59",
|
||||||
"path": "/maps/map01/주황버섯",
|
"path": "/maps/map01/주황버섯",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.RigidbodyComponent,MOD.Core.MovementComponent,MOD.Core.StateComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,script.Monster,script.MonsterAttack,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.DamageSkinSettingComponent",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.RigidbodyComponent,MOD.Core.MovementComponent,MOD.Core.StateComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,script.Monster,script.MonsterAttack,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.DamageSkinSettingComponent,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "주황버섯",
|
"name": "주황버섯",
|
||||||
"path": "/maps/map01/주황버섯",
|
"path": "/maps/map01/주황버섯",
|
||||||
@@ -6506,6 +6506,11 @@
|
|||||||
"DataId": "02c22d93421b4038b3c413b3e40b57ec"
|
"DataId": "02c22d93421b4038b3c413b3e40b57ec"
|
||||||
},
|
},
|
||||||
"Enable": true
|
"Enable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
@@ -6514,7 +6519,7 @@
|
|||||||
{
|
{
|
||||||
"id": "b1923aa6-7265-4f99-9ab6-1c45eae9af23",
|
"id": "b1923aa6-7265-4f99-9ab6-1c45eae9af23",
|
||||||
"path": "/maps/map01/돼지",
|
"path": "/maps/map01/돼지",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.RigidbodyComponent,MOD.Core.MovementComponent,MOD.Core.StateComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,script.Monster,script.MonsterAttack,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.RigidbodyComponent,MOD.Core.MovementComponent,MOD.Core.StateComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,script.Monster,script.MonsterAttack,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "돼지",
|
"name": "돼지",
|
||||||
"path": "/maps/map01/돼지",
|
"path": "/maps/map01/돼지",
|
||||||
@@ -6642,6 +6647,11 @@
|
|||||||
"y": 0
|
"y": 0
|
||||||
},
|
},
|
||||||
"Enable": true
|
"Enable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
@@ -6650,7 +6660,7 @@
|
|||||||
{
|
{
|
||||||
"id": "566e94be-0efe-4536-9007-882dde030a95",
|
"id": "566e94be-0efe-4536-9007-882dde030a95",
|
||||||
"path": "/maps/map01/초록버섯",
|
"path": "/maps/map01/초록버섯",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.RigidbodyComponent,MOD.Core.MovementComponent,MOD.Core.StateComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,script.Monster,script.MonsterAttack,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.RigidbodyComponent,MOD.Core.MovementComponent,MOD.Core.StateComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,script.Monster,script.MonsterAttack,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "초록버섯",
|
"name": "초록버섯",
|
||||||
"path": "/maps/map01/초록버섯",
|
"path": "/maps/map01/초록버섯",
|
||||||
@@ -6778,6 +6788,11 @@
|
|||||||
"y": 0
|
"y": 0
|
||||||
},
|
},
|
||||||
"Enable": true
|
"Enable": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
|
|||||||
@@ -6366,7 +6366,7 @@
|
|||||||
{
|
{
|
||||||
"id": "000007d5-0000-4000-8000-0000000007d5",
|
"id": "000007d5-0000-4000-8000-0000000007d5",
|
||||||
"path": "/maps/map02/Monster1",
|
"path": "/maps/map02/Monster1",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster1",
|
"name": "Monster1",
|
||||||
"path": "/maps/map02/Monster1",
|
"path": "/maps/map02/Monster1",
|
||||||
@@ -6506,6 +6506,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
@@ -6514,7 +6519,7 @@
|
|||||||
{
|
{
|
||||||
"id": "000007d6-0000-4000-8000-0000000007d6",
|
"id": "000007d6-0000-4000-8000-0000000007d6",
|
||||||
"path": "/maps/map02/Monster2",
|
"path": "/maps/map02/Monster2",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster2",
|
"name": "Monster2",
|
||||||
"path": "/maps/map02/Monster2",
|
"path": "/maps/map02/Monster2",
|
||||||
@@ -6654,6 +6659,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
|
|||||||
@@ -6366,7 +6366,7 @@
|
|||||||
{
|
{
|
||||||
"id": "00000bbd-0000-4000-8000-000000000bbd",
|
"id": "00000bbd-0000-4000-8000-000000000bbd",
|
||||||
"path": "/maps/map03/Monster1",
|
"path": "/maps/map03/Monster1",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster1",
|
"name": "Monster1",
|
||||||
"path": "/maps/map03/Monster1",
|
"path": "/maps/map03/Monster1",
|
||||||
@@ -6506,6 +6506,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
@@ -6514,7 +6519,7 @@
|
|||||||
{
|
{
|
||||||
"id": "00000bbe-0000-4000-8000-000000000bbe",
|
"id": "00000bbe-0000-4000-8000-000000000bbe",
|
||||||
"path": "/maps/map03/Monster2",
|
"path": "/maps/map03/Monster2",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster2",
|
"name": "Monster2",
|
||||||
"path": "/maps/map03/Monster2",
|
"path": "/maps/map03/Monster2",
|
||||||
@@ -6654,6 +6659,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
|
|||||||
@@ -6366,7 +6366,7 @@
|
|||||||
{
|
{
|
||||||
"id": "00000fa5-0000-4000-8000-000000000fa5",
|
"id": "00000fa5-0000-4000-8000-000000000fa5",
|
||||||
"path": "/maps/map04/Monster1",
|
"path": "/maps/map04/Monster1",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster1",
|
"name": "Monster1",
|
||||||
"path": "/maps/map04/Monster1",
|
"path": "/maps/map04/Monster1",
|
||||||
@@ -6506,6 +6506,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
@@ -6514,7 +6519,7 @@
|
|||||||
{
|
{
|
||||||
"id": "00000fa6-0000-4000-8000-000000000fa6",
|
"id": "00000fa6-0000-4000-8000-000000000fa6",
|
||||||
"path": "/maps/map04/Monster2",
|
"path": "/maps/map04/Monster2",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster2",
|
"name": "Monster2",
|
||||||
"path": "/maps/map04/Monster2",
|
"path": "/maps/map04/Monster2",
|
||||||
@@ -6654,6 +6659,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
|
|||||||
@@ -6366,7 +6366,7 @@
|
|||||||
{
|
{
|
||||||
"id": "0000138d-0000-4000-8000-00000000138d",
|
"id": "0000138d-0000-4000-8000-00000000138d",
|
||||||
"path": "/maps/map05/Monster1",
|
"path": "/maps/map05/Monster1",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster1",
|
"name": "Monster1",
|
||||||
"path": "/maps/map05/Monster1",
|
"path": "/maps/map05/Monster1",
|
||||||
@@ -6506,6 +6506,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
@@ -6514,7 +6519,7 @@
|
|||||||
{
|
{
|
||||||
"id": "0000138e-0000-4000-8000-00000000138e",
|
"id": "0000138e-0000-4000-8000-00000000138e",
|
||||||
"path": "/maps/map05/Monster2",
|
"path": "/maps/map05/Monster2",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster2",
|
"name": "Monster2",
|
||||||
"path": "/maps/map05/Monster2",
|
"path": "/maps/map05/Monster2",
|
||||||
@@ -6654,6 +6659,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
|
|||||||
@@ -6366,7 +6366,7 @@
|
|||||||
{
|
{
|
||||||
"id": "00001775-0000-4000-8000-000000001775",
|
"id": "00001775-0000-4000-8000-000000001775",
|
||||||
"path": "/maps/map06/Monster1",
|
"path": "/maps/map06/Monster1",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster1",
|
"name": "Monster1",
|
||||||
"path": "/maps/map06/Monster1",
|
"path": "/maps/map06/Monster1",
|
||||||
@@ -6506,6 +6506,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
@@ -6514,7 +6519,7 @@
|
|||||||
{
|
{
|
||||||
"id": "00001776-0000-4000-8000-000000001776",
|
"id": "00001776-0000-4000-8000-000000001776",
|
||||||
"path": "/maps/map06/Monster2",
|
"path": "/maps/map06/Monster2",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster2",
|
"name": "Monster2",
|
||||||
"path": "/maps/map06/Monster2",
|
"path": "/maps/map06/Monster2",
|
||||||
@@ -6654,6 +6659,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
|
|||||||
@@ -6366,7 +6366,7 @@
|
|||||||
{
|
{
|
||||||
"id": "00001b5d-0000-4000-8000-000000001b5d",
|
"id": "00001b5d-0000-4000-8000-000000001b5d",
|
||||||
"path": "/maps/map07/Monster1",
|
"path": "/maps/map07/Monster1",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster1",
|
"name": "Monster1",
|
||||||
"path": "/maps/map07/Monster1",
|
"path": "/maps/map07/Monster1",
|
||||||
@@ -6506,6 +6506,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
@@ -6514,7 +6519,7 @@
|
|||||||
{
|
{
|
||||||
"id": "00001b5e-0000-4000-8000-000000001b5e",
|
"id": "00001b5e-0000-4000-8000-000000001b5e",
|
||||||
"path": "/maps/map07/Monster2",
|
"path": "/maps/map07/Monster2",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster2",
|
"name": "Monster2",
|
||||||
"path": "/maps/map07/Monster2",
|
"path": "/maps/map07/Monster2",
|
||||||
@@ -6654,6 +6659,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
|
|||||||
@@ -6366,7 +6366,7 @@
|
|||||||
{
|
{
|
||||||
"id": "00001f45-0000-4000-8000-000000001f45",
|
"id": "00001f45-0000-4000-8000-000000001f45",
|
||||||
"path": "/maps/map08/Monster1",
|
"path": "/maps/map08/Monster1",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster1",
|
"name": "Monster1",
|
||||||
"path": "/maps/map08/Monster1",
|
"path": "/maps/map08/Monster1",
|
||||||
@@ -6506,6 +6506,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
@@ -6514,7 +6519,7 @@
|
|||||||
{
|
{
|
||||||
"id": "00001f46-0000-4000-8000-000000001f46",
|
"id": "00001f46-0000-4000-8000-000000001f46",
|
||||||
"path": "/maps/map08/Monster2",
|
"path": "/maps/map08/Monster2",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster2",
|
"name": "Monster2",
|
||||||
"path": "/maps/map08/Monster2",
|
"path": "/maps/map08/Monster2",
|
||||||
@@ -6654,6 +6659,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
|
|||||||
@@ -6366,7 +6366,7 @@
|
|||||||
{
|
{
|
||||||
"id": "0000232d-0000-4000-8000-00000000232d",
|
"id": "0000232d-0000-4000-8000-00000000232d",
|
||||||
"path": "/maps/map09/Monster1",
|
"path": "/maps/map09/Monster1",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster1",
|
"name": "Monster1",
|
||||||
"path": "/maps/map09/Monster1",
|
"path": "/maps/map09/Monster1",
|
||||||
@@ -6506,6 +6506,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
@@ -6514,7 +6519,7 @@
|
|||||||
{
|
{
|
||||||
"id": "0000232e-0000-4000-8000-00000000232e",
|
"id": "0000232e-0000-4000-8000-00000000232e",
|
||||||
"path": "/maps/map09/Monster2",
|
"path": "/maps/map09/Monster2",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster2",
|
"name": "Monster2",
|
||||||
"path": "/maps/map09/Monster2",
|
"path": "/maps/map09/Monster2",
|
||||||
@@ -6654,6 +6659,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
|
|||||||
@@ -6366,7 +6366,7 @@
|
|||||||
{
|
{
|
||||||
"id": "00002716-0000-4000-8000-000000002716",
|
"id": "00002716-0000-4000-8000-000000002716",
|
||||||
"path": "/maps/map10/Monster2",
|
"path": "/maps/map10/Monster2",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster2",
|
"name": "Monster2",
|
||||||
"path": "/maps/map10/Monster2",
|
"path": "/maps/map10/Monster2",
|
||||||
@@ -6506,6 +6506,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
@@ -6514,7 +6519,7 @@
|
|||||||
{
|
{
|
||||||
"id": "00002715-0000-4000-8000-000000002715",
|
"id": "00002715-0000-4000-8000-000000002715",
|
||||||
"path": "/maps/map10/Monster1",
|
"path": "/maps/map10/Monster1",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster1",
|
"name": "Monster1",
|
||||||
"path": "/maps/map10/Monster1",
|
"path": "/maps/map10/Monster1",
|
||||||
@@ -6654,6 +6659,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
|
|||||||
@@ -6366,7 +6366,7 @@
|
|||||||
{
|
{
|
||||||
"id": "00002afd-0000-4000-8000-000000002afd",
|
"id": "00002afd-0000-4000-8000-000000002afd",
|
||||||
"path": "/maps/map11/Monster1",
|
"path": "/maps/map11/Monster1",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster1",
|
"name": "Monster1",
|
||||||
"path": "/maps/map11/Monster1",
|
"path": "/maps/map11/Monster1",
|
||||||
@@ -6506,6 +6506,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
@@ -6514,7 +6519,7 @@
|
|||||||
{
|
{
|
||||||
"id": "00002afe-0000-4000-8000-000000002afe",
|
"id": "00002afe-0000-4000-8000-000000002afe",
|
||||||
"path": "/maps/map11/Monster2",
|
"path": "/maps/map11/Monster2",
|
||||||
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack",
|
"componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.DamageSkinSettingComponent,MOD.Core.HitComponent,MOD.Core.DamageSkinSpawnerComponent,MOD.Core.StateComponent,MOD.Core.RigidbodyComponent,MOD.Core.KinematicbodyComponent,MOD.Core.SideviewbodyComponent,MOD.Core.MovementComponent,script.Monster,script.MonsterAttack,script.CombatMonster",
|
||||||
"jsonString": {
|
"jsonString": {
|
||||||
"name": "Monster2",
|
"name": "Monster2",
|
||||||
"path": "/maps/map11/Monster2",
|
"path": "/maps/map11/Monster2",
|
||||||
@@ -6654,6 +6659,11 @@
|
|||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "script.CombatMonster",
|
||||||
|
"Enable": true,
|
||||||
|
"EnemyId": "orange_mushroom"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"@version": 1
|
"@version": 1
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ for (const id of CARDS.starterDeck) {
|
|||||||
if (!ENEMIES.enemies[ENEMIES.activeEnemy]) {
|
if (!ENEMIES.enemies[ENEMIES.activeEnemy]) {
|
||||||
throw new Error(`[gen-slaydeck] activeEnemy가 enemies에 없음: ${ENEMIES.activeEnemy}`);
|
throw new Error(`[gen-slaydeck] activeEnemy가 enemies에 없음: ${ENEMIES.activeEnemy}`);
|
||||||
}
|
}
|
||||||
const ACTIVE_ENEMY = ENEMIES.enemies[ENEMIES.activeEnemy];
|
|
||||||
|
|
||||||
const MAP = JSON.parse(readFileSync('data/map.json', 'utf8'));
|
const MAP = JSON.parse(readFileSync('data/map.json', 'utf8'));
|
||||||
for (const id of MAP.start) {
|
for (const id of MAP.start) {
|
||||||
@@ -27,6 +26,7 @@ for (const [id, n] of Object.entries(MAP.nodes)) {
|
|||||||
const MAX_ROW = Math.max(...Object.values(MAP.nodes).map((n) => n.row));
|
const MAX_ROW = Math.max(...Object.values(MAP.nodes).map((n) => n.row));
|
||||||
|
|
||||||
const RELICS = JSON.parse(readFileSync('data/relics.json', 'utf8'));
|
const RELICS = JSON.parse(readFileSync('data/relics.json', 'utf8'));
|
||||||
|
const SLOTS = JSON.parse(readFileSync('data/monster-slots.json', 'utf8'));
|
||||||
if (!RELICS.relics[RELICS.startingRelic]) throw new Error(`[gen-slaydeck] startingRelic 없음: ${RELICS.startingRelic}`);
|
if (!RELICS.relics[RELICS.startingRelic]) throw new Error(`[gen-slaydeck] startingRelic 없음: ${RELICS.startingRelic}`);
|
||||||
for (const id of RELICS.relicPool) {
|
for (const id of RELICS.relicPool) {
|
||||||
if (!RELICS.relics[id]) throw new Error(`[gen-slaydeck] relicPool에 없는 유물 id: ${id}`);
|
if (!RELICS.relics[id]) throw new Error(`[gen-slaydeck] relicPool에 없는 유물 id: ${id}`);
|
||||||
@@ -73,15 +73,6 @@ function luaCardsTable(cards) {
|
|||||||
function luaDeckTable(deck) {
|
function luaDeckTable(deck) {
|
||||||
return `self.DrawPile = { ${deck.map(luaStr).join(', ')} }`;
|
return `self.DrawPile = { ${deck.map(luaStr).join(', ')} }`;
|
||||||
}
|
}
|
||||||
function luaIntentsTable(intents) {
|
|
||||||
const lines = intents.map((it) => `\t{ kind = ${luaStr(it.kind)}, value = ${it.value} },`);
|
|
||||||
return `self.EnemyIntents = {\n${lines.join('\n')}\n}`;
|
|
||||||
}
|
|
||||||
function intentText(it) {
|
|
||||||
if (it.kind === 'Attack') return `의도: 공격 ${it.value}`;
|
|
||||||
if (it.kind === 'Defend') return `의도: 방어 ${it.value}`;
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
const UI_FILE = 'ui/DefaultGroup.ui';
|
const UI_FILE = 'ui/DefaultGroup.ui';
|
||||||
const COMMON_FILE = 'Global/common.gamelogic';
|
const COMMON_FILE = 'Global/common.gamelogic';
|
||||||
@@ -93,6 +84,9 @@ const ATTACK = { r: 0.86, g: 0.42, b: 0.38, a: 1 };
|
|||||||
const DEFEND = { r: 0.42, g: 0.55, b: 0.85, a: 1 };
|
const DEFEND = { r: 0.42, g: 0.55, b: 0.85, a: 1 };
|
||||||
const SKILL = { r: 0.46, g: 0.68, b: 0.52, a: 1 };
|
const SKILL = { r: 0.46, g: 0.68, b: 0.52, a: 1 };
|
||||||
|
|
||||||
|
const MAX_MONSTERS = 4;
|
||||||
|
|
||||||
|
const HP_BAR_W = 120;
|
||||||
const CARD_W = 180;
|
const CARD_W = 180;
|
||||||
const CARD_H = 250;
|
const CARD_H = 250;
|
||||||
const CARD_SPACING = 200;
|
const CARD_SPACING = 200;
|
||||||
@@ -253,6 +247,9 @@ function entity({ id, path, modelId, entryId, componentNames, components, displa
|
|||||||
}
|
}
|
||||||
|
|
||||||
function upsertUi() {
|
function upsertUi() {
|
||||||
|
if (SLOTS.length < MAX_MONSTERS) {
|
||||||
|
throw new Error(`[gen-slaydeck] monster-slots.json 항목(${SLOTS.length}) < MAX_MONSTERS(${MAX_MONSTERS})`);
|
||||||
|
}
|
||||||
const ui = JSON.parse(readFileSync(UI_FILE, 'utf8'));
|
const ui = JSON.parse(readFileSync(UI_FILE, 'utf8'));
|
||||||
const E = ui.ContentProto.Entities;
|
const E = ui.ContentProto.Entities;
|
||||||
ui.ContentProto.Entities = E.filter((e) => !e.path.startsWith('/ui/DefaultGroup/DeckHud') && !e.path.startsWith('/ui/DefaultGroup/CombatHud') && !e.path.startsWith('/ui/DefaultGroup/RewardHud') && !e.path.startsWith('/ui/DefaultGroup/MapHud') && !e.path.startsWith('/ui/DefaultGroup/ShopHud') && !e.path.startsWith('/ui/DefaultGroup/RestHud') && !e.path.startsWith('/ui/DefaultGroup/MainMenu'));
|
ui.ContentProto.Entities = E.filter((e) => !e.path.startsWith('/ui/DefaultGroup/DeckHud') && !e.path.startsWith('/ui/DefaultGroup/CombatHud') && !e.path.startsWith('/ui/DefaultGroup/RewardHud') && !e.path.startsWith('/ui/DefaultGroup/MapHud') && !e.path.startsWith('/ui/DefaultGroup/ShopHud') && !e.path.startsWith('/ui/DefaultGroup/RestHud') && !e.path.startsWith('/ui/DefaultGroup/MainMenu'));
|
||||||
@@ -429,40 +426,73 @@ function upsertUi() {
|
|||||||
sprite({ color: TRANSPARENT }),
|
sprite({ color: TRANSPARENT }),
|
||||||
],
|
],
|
||||||
}));
|
}));
|
||||||
|
const SLOT_W = 140, SLOT_H = 96;
|
||||||
|
for (let i = 1; i <= MAX_MONSTERS; i++) {
|
||||||
|
const base = `/ui/DefaultGroup/CombatHud/MonsterSlot${i}`;
|
||||||
|
const slot = entity({
|
||||||
|
id: guid('cmb', 40 + i),
|
||||||
|
path: base,
|
||||||
|
modelId: 'uisprite', entryId: 'UISprite',
|
||||||
|
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent',
|
||||||
|
displayOrder: 20 + i,
|
||||||
|
components: [
|
||||||
|
transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: SLOT_W, y: SLOT_H }, pos: { x: (i - 2.5) * 320, y: 300 } }),
|
||||||
|
sprite({ color: { r: 0, g: 0, b: 0, a: 0.0001 }, type: 1, raycast: true }),
|
||||||
|
button(),
|
||||||
|
],
|
||||||
|
});
|
||||||
|
slot.jsonString.enable = false;
|
||||||
|
combat.push(slot);
|
||||||
combat.push(entity({
|
combat.push(entity({
|
||||||
id: guid('cmb', 1),
|
id: guid('cmb', 60 + i), path: `${base}/Name`, modelId: 'uitext', entryId: 'UIText',
|
||||||
path: '/ui/DefaultGroup/CombatHud/EnemyBg',
|
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent',
|
||||||
modelId: 'uisprite',
|
|
||||||
entryId: 'UISprite',
|
|
||||||
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent',
|
|
||||||
displayOrder: 0,
|
displayOrder: 0,
|
||||||
components: [
|
components: [
|
||||||
transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 380, y: 170 }, pos: { x: 0, y: 300 }, align: ALIGN_CENTER }),
|
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, y: 30 }, pos: { x: 0, y: 34 } }),
|
||||||
sprite({ color: PANEL_BG, type: 1 }),
|
sprite({ color: TRANSPARENT }),
|
||||||
|
text({ value: '', fontSize: 20, bold: true, color: GOLD, alignment: 4 }),
|
||||||
],
|
],
|
||||||
}));
|
}));
|
||||||
const enemyTexts = [
|
|
||||||
['EnemyName', { x: 0, y: 358 }, { x: 360, y: 44 }, ACTIVE_ENEMY.name, 28, true, GOLD],
|
|
||||||
['EnemyHp', { x: 0, y: 316 }, { x: 360, y: 40 }, `HP ${ACTIVE_ENEMY.maxHp}/${ACTIVE_ENEMY.maxHp}`, 24, true, { r: 1, g: 1, b: 1, a: 1 }],
|
|
||||||
['EnemyBlock', { x: 0, y: 280 }, { x: 360, y: 36 }, '방어 0', 20, false, { r: 0.6, g: 0.8, b: 1, a: 1 }],
|
|
||||||
['EnemyIntent', { x: 0, y: 244 }, { x: 360, y: 38 }, intentText(ACTIVE_ENEMY.intents[0]), 22, true, { r: 1, g: 0.72, b: 0.5, a: 1 }],
|
|
||||||
];
|
|
||||||
let cmbN = 2;
|
|
||||||
for (const [suffix, pos, size, value, fontSize, bold, color] of enemyTexts) {
|
|
||||||
combat.push(entity({
|
combat.push(entity({
|
||||||
id: guid('cmb', cmbN++),
|
id: guid('cmb', 80 + i), path: `${base}/Hp`, modelId: 'uitext', entryId: 'UIText',
|
||||||
path: `/ui/DefaultGroup/CombatHud/${suffix}`,
|
|
||||||
modelId: 'uitext',
|
|
||||||
entryId: 'UIText',
|
|
||||||
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent',
|
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent',
|
||||||
displayOrder: enemyTexts.findIndex(([s]) => s === suffix) + 1,
|
displayOrder: 1,
|
||||||
components: [
|
components: [
|
||||||
transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size, pos }),
|
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, y: 26 }, pos: { x: 0, y: 6 } }),
|
||||||
sprite({ color: TRANSPARENT }),
|
sprite({ color: TRANSPARENT }),
|
||||||
text({ value, fontSize, bold, color }),
|
text({ value: '', fontSize: 18, bold: true, color: { r: 1, g: 1, b: 1, a: 1 }, alignment: 4 }),
|
||||||
|
],
|
||||||
|
}));
|
||||||
|
combat.push(entity({
|
||||||
|
id: guid('cmb', 100 + i), path: `${base}/HpBarBg`, modelId: 'uisprite', entryId: 'UISprite',
|
||||||
|
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent',
|
||||||
|
displayOrder: 2,
|
||||||
|
components: [
|
||||||
|
transform({ parentW: SLOT_W, parentH: SLOT_H, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: HP_BAR_W, y: 14 }, pos: { x: 0, y: -14 } }),
|
||||||
|
sprite({ color: { r: 0.18, g: 0.05, b: 0.06, a: 1 }, type: 1 }),
|
||||||
|
],
|
||||||
|
}));
|
||||||
|
combat.push(entity({
|
||||||
|
id: guid('cmb', 120 + i), path: `${base}/HpBarFill`, modelId: 'uisprite', entryId: 'UISprite',
|
||||||
|
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent',
|
||||||
|
displayOrder: 3,
|
||||||
|
components: [
|
||||||
|
transform({ parentW: SLOT_W, parentH: SLOT_H, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0, y: 0.5 }, size: { x: HP_BAR_W, y: 14 }, pos: { x: -HP_BAR_W / 2, y: -14 } }),
|
||||||
|
sprite({ color: { r: 0.86, g: 0.35, b: 0.32, a: 1 }, type: 1 }),
|
||||||
|
],
|
||||||
|
}));
|
||||||
|
combat.push(entity({
|
||||||
|
id: guid('cmb', 140 + i), path: `${base}/Intent`, modelId: 'uitext', entryId: 'UIText',
|
||||||
|
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent',
|
||||||
|
displayOrder: 4,
|
||||||
|
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 + 40, y: 24 }, pos: { x: 0, y: -36 } }),
|
||||||
|
sprite({ color: TRANSPARENT }),
|
||||||
|
text({ value: '', fontSize: 17, bold: true, color: { r: 1, g: 0.72, b: 0.5, a: 1 }, alignment: 4 }),
|
||||||
],
|
],
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
let cmbN = 2;
|
||||||
combat.push(entity({
|
combat.push(entity({
|
||||||
id: guid('cmb', cmbN++),
|
id: guid('cmb', cmbN++),
|
||||||
path: '/ui/DefaultGroup/CombatHud/PlayerBg',
|
path: '/ui/DefaultGroup/CombatHud/PlayerBg',
|
||||||
@@ -1019,13 +1049,11 @@ function writeCodeblocks() {
|
|||||||
prop('number', 'PlayerHp', '0'),
|
prop('number', 'PlayerHp', '0'),
|
||||||
prop('number', 'PlayerMaxHp', '80'),
|
prop('number', 'PlayerMaxHp', '80'),
|
||||||
prop('number', 'PlayerBlock', '0'),
|
prop('number', 'PlayerBlock', '0'),
|
||||||
prop('number', 'EnemyHp', '0'),
|
|
||||||
prop('number', 'EnemyMaxHp', String(ACTIVE_ENEMY.maxHp)),
|
|
||||||
prop('number', 'EnemyBlock', '0'),
|
|
||||||
prop('number', 'EnemyIntentIndex', '1'),
|
|
||||||
prop('boolean', 'CombatOver', 'false'),
|
prop('boolean', 'CombatOver', 'false'),
|
||||||
prop('any', 'EnemyIntents'),
|
prop('any', 'Monsters'),
|
||||||
prop('any', 'EnemyName'),
|
prop('any', 'Registered'),
|
||||||
|
prop('number', 'TargetIndex', '1'),
|
||||||
|
prop('any', 'SlotPos'),
|
||||||
prop('any', 'RunDeck'),
|
prop('any', 'RunDeck'),
|
||||||
prop('number', 'Gold', '0'),
|
prop('number', 'Gold', '0'),
|
||||||
prop('number', 'Floor', '0'),
|
prop('number', 'Floor', '0'),
|
||||||
@@ -1079,6 +1107,7 @@ self.RelicPool = { ${RELICS.relicPool.map(luaStr).join(', ')} }
|
|||||||
${luaEnemiesTable(ENEMIES.enemies)}
|
${luaEnemiesTable(ENEMIES.enemies)}
|
||||||
${luaMapNodesTable(MAP.nodes)}
|
${luaMapNodesTable(MAP.nodes)}
|
||||||
${luaStartArray(MAP.start)}
|
${luaStartArray(MAP.start)}
|
||||||
|
self.SlotPos = { ${SLOTS.map((s) => `{ x = ${s.x}, y = ${s.y} }`).join(', ')} }
|
||||||
self.CurrentNodeId = ""
|
self.CurrentNodeId = ""
|
||||||
self.CurrentEnemyId = ""
|
self.CurrentEnemyId = ""
|
||||||
self:BindButtons()
|
self:BindButtons()
|
||||||
@@ -1086,18 +1115,7 @@ self:AddRelic("${RELICS.startingRelic}")
|
|||||||
self:ShowMap()`),
|
self:ShowMap()`),
|
||||||
method('StartCombat', `self.MaxEnergy = 3
|
method('StartCombat', `self.MaxEnergy = 3
|
||||||
self.Turn = 0
|
self.Turn = 0
|
||||||
local enemy = self.Enemies[self.CurrentEnemyId]
|
|
||||||
local mult = 1 + (self.Floor - 1) * 0.6
|
|
||||||
self.PlayerBlock = 0
|
self.PlayerBlock = 0
|
||||||
self.EnemyName = enemy.name
|
|
||||||
self.EnemyMaxHp = math.floor(enemy.maxHp * mult)
|
|
||||||
self.EnemyHp = self.EnemyMaxHp
|
|
||||||
self.EnemyBlock = 0
|
|
||||||
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.CombatOver = false
|
||||||
self.DiscardPile = {}
|
self.DiscardPile = {}
|
||||||
self.Hand = {}
|
self.Hand = {}
|
||||||
@@ -1107,10 +1125,55 @@ for i = 1, #self.RunDeck do
|
|||||||
self.DrawPile[i] = self.RunDeck[i]
|
self.DrawPile[i] = self.RunDeck[i]
|
||||||
end
|
end
|
||||||
self:Shuffle(self.DrawPile)
|
self:Shuffle(self.DrawPile)
|
||||||
|
self:BuildMonsters()
|
||||||
self:RenderCombat()
|
self:RenderCombat()
|
||||||
self:StartPlayerTurn()
|
self:StartPlayerTurn()
|
||||||
self:ApplyRelics("combatStart")
|
self:ApplyRelics("combatStart")
|
||||||
self:RenderCombat()`),
|
self:RenderCombat()`),
|
||||||
|
method('RegisterMonster', `if self.Registered == nil then
|
||||||
|
self.Registered = {}
|
||||||
|
end
|
||||||
|
table.insert(self.Registered, { entity = monster, enemyId = enemyId })`, [
|
||||||
|
{ Type: 'any', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'monster' },
|
||||||
|
{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'enemyId' },
|
||||||
|
]),
|
||||||
|
method('BuildMonsters', `self.Monsters = {}
|
||||||
|
local reg = self.Registered or {}
|
||||||
|
local list = {}
|
||||||
|
for i = 1, #reg do
|
||||||
|
local r = reg[i]
|
||||||
|
if r.entity ~= nil and isvalid(r.entity) then
|
||||||
|
local x = 0
|
||||||
|
if r.entity.TransformComponent ~= nil then
|
||||||
|
x = r.entity.TransformComponent.WorldPosition.x
|
||||||
|
end
|
||||||
|
table.insert(list, { entity = r.entity, enemyId = r.enemyId, x = x })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
table.sort(list, function(a, b) return a.x < b.x end)
|
||||||
|
local mult = 1 + (self.Floor - 1) * 0.6
|
||||||
|
local n = #list
|
||||||
|
if n > ${MAX_MONSTERS} then n = ${MAX_MONSTERS} end
|
||||||
|
for i = 1, n do
|
||||||
|
local item = list[i]
|
||||||
|
local e = self.Enemies[item.enemyId]
|
||||||
|
if e == nil then e = { name = item.enemyId, maxHp = 10, intents = { { kind = "Attack", value = 5 } } } end
|
||||||
|
local intents = {}
|
||||||
|
for k = 1, #e.intents do
|
||||||
|
intents[k] = { kind = e.intents[k].kind, value = math.floor(e.intents[k].value * mult) }
|
||||||
|
end
|
||||||
|
local maxHp = math.floor(e.maxHp * mult)
|
||||||
|
self.Monsters[i] = { entity = item.entity, enemyId = item.enemyId, name = e.name,
|
||||||
|
hp = maxHp, maxHp = maxHp, block = 0, intents = intents, intentIdx = 1, alive = true, slot = i }
|
||||||
|
self:ReviveMonsterEntity(item.entity)
|
||||||
|
self:PositionMonsterSlot(i)
|
||||||
|
end
|
||||||
|
self.TargetIndex = 1`),
|
||||||
|
method('ReviveMonsterEntity', `if monster == nil or not isvalid(monster) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
monster:SetEnable(true)
|
||||||
|
monster:SetVisible(true)`, [{ Type: 'any', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'monster' }]),
|
||||||
method('Shuffle', `if list == nil then
|
method('Shuffle', `if list == nil then
|
||||||
\treturn
|
\treturn
|
||||||
end
|
end
|
||||||
@@ -1167,6 +1230,12 @@ end
|
|||||||
local restLeave = _EntityService:GetEntityByPath("/ui/DefaultGroup/RestHud/Leave")
|
local restLeave = _EntityService:GetEntityByPath("/ui/DefaultGroup/RestHud/Leave")
|
||||||
if restLeave ~= nil and restLeave.ButtonComponent ~= nil then
|
if restLeave ~= nil and restLeave.ButtonComponent ~= nil then
|
||||||
restLeave:ConnectEvent(ButtonClickEvent, function() self:LeaveNode() end)
|
restLeave:ConnectEvent(ButtonClickEvent, function() self:LeaveNode() end)
|
||||||
|
end
|
||||||
|
for i = 1, ${MAX_MONSTERS} do
|
||||||
|
local ms = _EntityService:GetEntityByPath("/ui/DefaultGroup/CombatHud/MonsterSlot" .. tostring(i))
|
||||||
|
if ms ~= nil and ms.ButtonComponent ~= nil then
|
||||||
|
ms:ConnectEvent(ButtonClickEvent, function() self:SetTarget(i) end)
|
||||||
|
end
|
||||||
end`),
|
end`),
|
||||||
method('StartPlayerTurn', `self.Turn = self.Turn + 1
|
method('StartPlayerTurn', `self.Turn = self.Turn + 1
|
||||||
self.Energy = self.MaxEnergy
|
self.Energy = self.MaxEnergy
|
||||||
@@ -1300,7 +1369,7 @@ end
|
|||||||
self.Energy = self.Energy - c.cost
|
self.Energy = self.Energy - c.cost
|
||||||
if c.kind == "Attack" then
|
if c.kind == "Attack" then
|
||||||
if c.damage ~= nil then
|
if c.damage ~= nil then
|
||||||
self:DealDamageToEnemy(c.damage)
|
self:DealDamageToTarget(c.damage)
|
||||||
end
|
end
|
||||||
self:ApplyRelics("cardPlayed")
|
self:ApplyRelics("cardPlayed")
|
||||||
elseif c.kind == "Skill" then
|
elseif c.kind == "Skill" then
|
||||||
@@ -1315,16 +1384,39 @@ self:RenderPiles()
|
|||||||
self:RenderCombat()
|
self:RenderCombat()
|
||||||
self:CheckCombatEnd()`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' }]),
|
self:CheckCombatEnd()`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' }]),
|
||||||
method('Toast', `log(message)`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'message' }]),
|
method('Toast', `log(message)`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'message' }]),
|
||||||
method('DealDamageToEnemy', `local dmg = amount
|
method('DealDamageToTarget', `local m = self.Monsters[self.TargetIndex]
|
||||||
if self.EnemyBlock > 0 then
|
if m == nil or m.alive ~= true then
|
||||||
local absorbed = math.min(self.EnemyBlock, dmg)
|
m = nil
|
||||||
self.EnemyBlock = self.EnemyBlock - absorbed
|
for i = 1, #self.Monsters do
|
||||||
|
if self.Monsters[i].alive == true then m = self.Monsters[i]; self.TargetIndex = i; break end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if m == nil then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local dmg = amount
|
||||||
|
if m.block > 0 then
|
||||||
|
local absorbed = math.min(m.block, dmg)
|
||||||
|
m.block = m.block - absorbed
|
||||||
dmg = dmg - absorbed
|
dmg = dmg - absorbed
|
||||||
end
|
end
|
||||||
self.EnemyHp = self.EnemyHp - dmg
|
m.hp = m.hp - dmg
|
||||||
if self.EnemyHp < 0 then
|
if m.hp <= 0 then
|
||||||
self.EnemyHp = 0
|
m.hp = 0
|
||||||
|
self:KillMonster(m.slot)
|
||||||
end`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'amount' }]),
|
end`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'amount' }]),
|
||||||
|
method('KillMonster', `local m = self.Monsters[slot]
|
||||||
|
if m == nil then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
m.alive = false
|
||||||
|
if m.entity ~= nil and isvalid(m.entity) then
|
||||||
|
m.entity:SetVisible(false)
|
||||||
|
end
|
||||||
|
self:SetEntityEnabled("/ui/DefaultGroup/CombatHud/MonsterSlot" .. tostring(slot), false)
|
||||||
|
for i = 1, #self.Monsters do
|
||||||
|
if self.Monsters[i].alive == true then self.TargetIndex = i; break end
|
||||||
|
end`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' }]),
|
||||||
method('DealDamageToPlayer', `local dmg = amount
|
method('DealDamageToPlayer', `local dmg = amount
|
||||||
if self.PlayerBlock > 0 then
|
if self.PlayerBlock > 0 then
|
||||||
local absorbed = math.min(self.PlayerBlock, dmg)
|
local absorbed = math.min(self.PlayerBlock, dmg)
|
||||||
@@ -1335,21 +1427,30 @@ 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', `self.EnemyBlock = 0
|
method('EnemyTurn', `for i = 1, #self.Monsters do
|
||||||
local intent = self.EnemyIntents[self.EnemyIntentIndex]
|
local m = self.Monsters[i]
|
||||||
if intent ~= nil then
|
if m.alive == true then
|
||||||
|
m.block = 0
|
||||||
|
local intent = m.intents[m.intentIdx]
|
||||||
|
if intent ~= nil then
|
||||||
if intent.kind == "Attack" then
|
if intent.kind == "Attack" then
|
||||||
self:DealDamageToPlayer(intent.value)
|
self:DealDamageToPlayer(intent.value)
|
||||||
elseif intent.kind == "Defend" then
|
elseif intent.kind == "Defend" then
|
||||||
self.EnemyBlock = self.EnemyBlock + intent.value
|
m.block = m.block + intent.value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
m.intentIdx = m.intentIdx + 1
|
||||||
|
if m.intentIdx > #m.intents then
|
||||||
|
m.intentIdx = 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
self.EnemyIntentIndex = self.EnemyIntentIndex + 1
|
|
||||||
if self.EnemyIntentIndex > #self.EnemyIntents then
|
|
||||||
self.EnemyIntentIndex = 1
|
|
||||||
end
|
|
||||||
self:RenderCombat()`),
|
self:RenderCombat()`),
|
||||||
method('CheckCombatEnd', `if self.EnemyHp <= 0 then
|
method('CheckCombatEnd', `local anyAlive = false
|
||||||
|
for i = 1, #self.Monsters do
|
||||||
|
if self.Monsters[i].alive == true then anyAlive = true; break end
|
||||||
|
end
|
||||||
|
if anyAlive == false then
|
||||||
self.CombatOver = true
|
self.CombatOver = true
|
||||||
self.Gold = self.Gold + ${GOLD_PER_WIN}
|
self.Gold = self.Gold + ${GOLD_PER_WIN}
|
||||||
self:ApplyRelics("combatReward")
|
self:ApplyRelics("combatReward")
|
||||||
@@ -1382,22 +1483,54 @@ local entity = _EntityService:GetEntityByPath("/ui/DefaultGroup/CombatHud/Result
|
|||||||
if entity ~= nil then
|
if entity ~= nil then
|
||||||
entity.Enable = true
|
entity.Enable = true
|
||||||
end`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'text' }]),
|
end`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'text' }]),
|
||||||
method('RenderCombat', `self:SetText("/ui/DefaultGroup/CombatHud/EnemyName", self.EnemyName)
|
method('RenderCombat', `for i = 1, ${MAX_MONSTERS} do
|
||||||
self:SetText("/ui/DefaultGroup/CombatHud/EnemyHp", "HP " .. string.format("%d", self.EnemyHp) .. "/" .. string.format("%d", self.EnemyMaxHp))
|
local base = "/ui/DefaultGroup/CombatHud/MonsterSlot" .. tostring(i)
|
||||||
self:SetText("/ui/DefaultGroup/CombatHud/EnemyBlock", "방어 " .. string.format("%d", self.EnemyBlock))
|
local m = self.Monsters[i]
|
||||||
local intent = self.EnemyIntents[self.EnemyIntentIndex]
|
if m ~= nil and m.alive == true then
|
||||||
local intentText = ""
|
self:SetEntityEnabled(base, true)
|
||||||
if intent ~= nil then
|
self:SetText(base .. "/Name", m.name)
|
||||||
if intent.kind == "Attack" then
|
self:SetText(base .. "/Hp", string.format("%d", m.hp) .. "/" .. string.format("%d", m.maxHp))
|
||||||
intentText = "의도: 공격 " .. tostring(intent.value)
|
local intent = m.intents[m.intentIdx]
|
||||||
elseif intent.kind == "Defend" then
|
local t = ""
|
||||||
intentText = "의도: 방어 " .. tostring(intent.value)
|
if intent ~= nil then
|
||||||
|
if intent.kind == "Attack" then t = "공격 " .. tostring(intent.value)
|
||||||
|
elseif intent.kind == "Defend" then t = "방어 " .. tostring(intent.value) end
|
||||||
|
end
|
||||||
|
if i == self.TargetIndex then t = "[타겟] " .. t end
|
||||||
|
self:SetText(base .. "/Intent", t)
|
||||||
|
self:SetHpBar(base .. "/HpBarFill", m.hp, m.maxHp)
|
||||||
|
else
|
||||||
|
self:SetEntityEnabled(base, false)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
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/PlayerHp", "HP " .. string.format("%d", self.PlayerHp) .. "/" .. string.format("%d", self.PlayerMaxHp))
|
||||||
self:SetText("/ui/DefaultGroup/CombatHud/PlayerBlock", "방어 " .. string.format("%d", self.PlayerBlock))
|
self:SetText("/ui/DefaultGroup/CombatHud/PlayerBlock", "방어 " .. string.format("%d", self.PlayerBlock))
|
||||||
self:RenderRun()`),
|
self:RenderRun()`),
|
||||||
|
method('SetHpBar', `local e = _EntityService:GetEntityByPath(path)
|
||||||
|
if e == nil or e.UITransformComponent == nil then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local ratio = 0
|
||||||
|
if maxHp > 0 then ratio = hp / maxHp end
|
||||||
|
if ratio < 0 then ratio = 0 end
|
||||||
|
local w = ${HP_BAR_W} * ratio
|
||||||
|
e.UITransformComponent.RectSize = Vector2(w, 14)`, [
|
||||||
|
{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'path' },
|
||||||
|
{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'hp' },
|
||||||
|
{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'maxHp' },
|
||||||
|
]),
|
||||||
|
method('PositionMonsterSlot', `local sp = self.SlotPos
|
||||||
|
if sp == nil or sp[slot] == nil then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local e = _EntityService:GetEntityByPath("/ui/DefaultGroup/CombatHud/MonsterSlot" .. tostring(slot))
|
||||||
|
if e ~= nil and e.UITransformComponent ~= nil then
|
||||||
|
e.UITransformComponent.anchoredPosition = Vector2(sp[slot].x, sp[slot].y)
|
||||||
|
end`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' }]),
|
||||||
|
method('SetTarget', `if self.Monsters[slot] ~= nil and self.Monsters[slot].alive == true then
|
||||||
|
self.TargetIndex = slot
|
||||||
|
self:RenderCombat()
|
||||||
|
end`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' }]),
|
||||||
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))`),
|
self:SetText("/ui/DefaultGroup/CombatHud/Gold", "골드 " .. string.format("%d", self.Gold))`),
|
||||||
method('OfferReward', `local pool = {}
|
method('OfferReward', `local pool = {}
|
||||||
|
|||||||
76
tools/monster/gen-combat-monster.mjs
Normal file
76
tools/monster/gen-combat-monster.mjs
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
import { readFileSync, writeFileSync } from 'node:fs';
|
||||||
|
|
||||||
|
// 맵 몬스터에 적 타입(EnemyId)을 부여하고, BeginPlay 시 /common 컨트롤러에 자기등록하는 마커.
|
||||||
|
// 카드 전투 시 컨트롤러가 등록 목록으로 인카운터를 구성한다.
|
||||||
|
const MAP_NUMBERS = Array.from({ length: 11 }, (_, i) => i + 1); // map01~11
|
||||||
|
const NAME_TO_ENEMY = { '주황버섯': 'orange_mushroom', '파란버섯': 'blue_mushroom' };
|
||||||
|
const DEFAULT_ENEMY = 'orange_mushroom';
|
||||||
|
|
||||||
|
function prop(Type, Name, DefaultValue = 'nil') {
|
||||||
|
return { Type, DefaultValue, SyncDirection: 0, Attributes: [], Name };
|
||||||
|
}
|
||||||
|
function method(Name, Code, Arguments = [], ExecSpace = 6) {
|
||||||
|
return {
|
||||||
|
Return: { Type: 'void', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: null },
|
||||||
|
Arguments, Code, Scope: 2, ExecSpace, Attributes: [], Name,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeCodeblock() {
|
||||||
|
const cb = {
|
||||||
|
Id: '', GameId: '', EntryKey: 'codeblock://combatmonster', ContentType: 'x-mod/codeblock',
|
||||||
|
Content: '', Usage: 0, UsePublish: 1, UseService: 0, CoreVersion: '26.5.0.0', StudioVersion: '', DynamicLoading: 0,
|
||||||
|
ContentProto: { Use: 'Json', Json: {
|
||||||
|
CoreVersion: { Major: 0, Minor: 2 }, ScriptVersion: { Major: 1, Minor: 0 },
|
||||||
|
Description: '', Id: 'CombatMonster', Language: 1, Name: 'CombatMonster', Type: 1, Source: 0, Target: null,
|
||||||
|
Properties: [prop('string', 'EnemyId', '""'), prop('number', 'RegTries', '0')],
|
||||||
|
Methods: [
|
||||||
|
method('OnBeginPlay', `self.RegTries = 0
|
||||||
|
local eventId = 0
|
||||||
|
local function reg()
|
||||||
|
self.RegTries = self.RegTries + 1
|
||||||
|
local c = _EntityService:GetEntityByPath("/common")
|
||||||
|
if c ~= nil and c.SlayDeckController ~= nil then
|
||||||
|
c.SlayDeckController:RegisterMonster(self.Entity, self.EnemyId)
|
||||||
|
_TimerService:ClearTimer(eventId)
|
||||||
|
elseif self.RegTries > 50 then
|
||||||
|
_TimerService:ClearTimer(eventId)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
eventId = _TimerService:SetTimerRepeat(reg, 0.1)`),
|
||||||
|
],
|
||||||
|
EntityEventHandlers: [],
|
||||||
|
} },
|
||||||
|
};
|
||||||
|
writeFileSync('RootDesk/MyDesk/CombatMonster.codeblock', JSON.stringify(cb, null, 2) + '\n', 'utf8');
|
||||||
|
}
|
||||||
|
|
||||||
|
const isMonster = (e) => typeof e.componentNames === 'string' && e.componentNames.includes('script.Monster');
|
||||||
|
|
||||||
|
function patchMap(nn) {
|
||||||
|
const tag = String(nn).padStart(2, '0');
|
||||||
|
const file = `map/map${tag}.map`;
|
||||||
|
const map = JSON.parse(readFileSync(file, 'utf8'));
|
||||||
|
let count = 0;
|
||||||
|
for (const e of map.ContentProto.Entities.filter(isMonster)) {
|
||||||
|
const comps = e.jsonString && e.jsonString['@components'];
|
||||||
|
if (!Array.isArray(comps)) {
|
||||||
|
console.warn(`[gen-combat-monster] entity "${(e.jsonString && e.jsonString.name) || e.path}" has no @components — skipped`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const name = (e.jsonString && e.jsonString.name) || '';
|
||||||
|
const enemyId = NAME_TO_ENEMY[name] || DEFAULT_ENEMY;
|
||||||
|
e.jsonString['@components'] = comps.filter((c) => c['@type'] !== 'script.CombatMonster');
|
||||||
|
e.jsonString['@components'].push({ '@type': 'script.CombatMonster', Enable: true, EnemyId: enemyId });
|
||||||
|
const names = (e.componentNames || '').split(',').filter((s) => s && s !== 'script.CombatMonster');
|
||||||
|
names.push('script.CombatMonster');
|
||||||
|
e.componentNames = names.join(',');
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
writeFileSync(file, JSON.stringify(map, null, 2), 'utf8');
|
||||||
|
return `map${tag}(${count})`;
|
||||||
|
}
|
||||||
|
|
||||||
|
writeCodeblock();
|
||||||
|
const patched = MAP_NUMBERS.map(patchMap);
|
||||||
|
console.log('CombatMonster codeblock written; patched maps:', patched.join(', '));
|
||||||
15011
ui/DefaultGroup.ui
15011
ui/DefaultGroup.ui
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user