diff --git a/Global/SectorConfig.config b/Global/SectorConfig.config index 44824ce..2044bb1 100644 --- a/Global/SectorConfig.config +++ b/Global/SectorConfig.config @@ -23,7 +23,8 @@ "map://map02", "map://map03", "map://map04", - "map://map05" + "map://map05", + "map://lobby" ] } ], diff --git a/RootDesk/MyDesk/LobbyMobility.codeblock b/RootDesk/MyDesk/LobbyMobility.codeblock new file mode 100644 index 0000000..a1396bb --- /dev/null +++ b/RootDesk/MyDesk/LobbyMobility.codeblock @@ -0,0 +1,60 @@ +{ + "Id": "", + "GameId": "", + "EntryKey": "codeblock://lobbymobility", + "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": "LobbyMobility", + "Language": 1, + "Name": "LobbyMobility", + "Type": 1, + "Source": 0, + "Target": null, + "Properties": [ + { + "Type": "number", + "DefaultValue": "0", + "SyncDirection": 0, + "Attributes": [], + "Name": "Tries" + } + ], + "Methods": [ + { + "Return": { + "Type": "void", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [], + "Code": "self.Tries = 0\nlocal eventId = 0\nlocal function apply()\n\tself.Tries = self.Tries + 1\n\tlocal lp = _UserService.LocalPlayer\n\tif lp ~= nil and lp.PlayerControllerComponent ~= nil then\n\t\tlocal pc = lp.PlayerControllerComponent\n\t\tpc.Enable = true\n\t\tpc.FixedLookAt = 0\n\t\tlocal rb = lp.RigidbodyComponent\n\t\tif rb ~= nil then rb.WalkAcceleration = 0.7 end\n\t\tlocal mv = lp.MovementComponent\n\t\tif mv ~= nil then\n\t\t\tmv.InputSpeed = 1.4\n\t\t\tmv.JumpForce = 1.23\n\t\tend\n\t\t_TimerService:ClearTimer(eventId)\n\telseif self.Tries > 50 then\n\t\t_TimerService:ClearTimer(eventId)\n\tend\nend\neventId = _TimerService:SetTimerRepeat(apply, 0.1)", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "OnBeginPlay" + } + ], + "EntityEventHandlers": [] + } + } +} diff --git a/RootDesk/MyDesk/LobbyNpc.codeblock b/RootDesk/MyDesk/LobbyNpc.codeblock new file mode 100644 index 0000000..3349178 --- /dev/null +++ b/RootDesk/MyDesk/LobbyNpc.codeblock @@ -0,0 +1,89 @@ +{ + "Id": "", + "GameId": "", + "EntryKey": "codeblock://lobbynpc", + "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": "LobbyNpc", + "Language": 1, + "Name": "LobbyNpc", + "Type": 1, + "Source": 0, + "Target": null, + "Properties": [ + { + "Type": "string", + "DefaultValue": "\"\"", + "SyncDirection": 0, + "Attributes": [], + "Name": "NpcId" + }, + { + "Type": "string", + "DefaultValue": "\"\"", + "SyncDirection": 0, + "Attributes": [], + "Name": "MarkName" + }, + { + "Type": "boolean", + "DefaultValue": "false", + "SyncDirection": 0, + "Attributes": [], + "Name": "InRange" + } + ], + "Methods": [ + { + "Return": { + "Type": "void", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [], + "Code": "self.InRange = false\nlocal mark = _EntityService:GetEntityByPath(\"/maps/lobby/\" .. self.MarkName)\nif mark ~= nil then mark:SetVisible(false) end\nself.Entity:ConnectEvent(TouchEvent, function(e)\n\tself:Interact()\nend)\n_InputService:ConnectEvent(KeyDownEvent, function(e)\n\tif self.InRange and e.key == KeyboardKey.UpArrow then\n\t\tself:Interact()\n\tend\nend)\nlocal eventId = 0\nlocal function tick()\n\tlocal lp = _UserService.LocalPlayer\n\tif lp == nil then return end\n\tif mark == nil then mark = _EntityService:GetEntityByPath(\"/maps/lobby/\" .. self.MarkName) end\n\tlocal a = lp.TransformComponent.WorldPosition\n\tlocal b = self.Entity.TransformComponent.WorldPosition\n\tlocal d = Vector2.Distance(Vector2(a.x, a.y), Vector2(b.x, b.y))\n\tlocal near = d < 1.2\n\tif near ~= self.InRange then\n\t\tself.InRange = near\n\t\tif mark ~= nil then mark:SetVisible(near) end\n\tend\nend\neventId = _TimerService:SetTimerRepeat(tick, 0.15)", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "OnBeginPlay" + }, + { + "Return": { + "Type": "void", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [], + "Code": "local c = _EntityService:GetEntityByPath(\"/common\")\nif c ~= nil and c.SlayDeckController ~= nil then\n\tc.SlayDeckController:OnLobbyNpcInteract(self.NpcId)\nend", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "Interact" + } + ], + "EntityEventHandlers": [] + } + } +} diff --git a/RootDesk/MyDesk/PlayerLock.codeblock b/RootDesk/MyDesk/PlayerLock.codeblock index bc566d5..5eb1aa8 100644 --- a/RootDesk/MyDesk/PlayerLock.codeblock +++ b/RootDesk/MyDesk/PlayerLock.codeblock @@ -47,7 +47,7 @@ "Name": null }, "Arguments": [], - "Code": "self.LockTries = 0\nlocal eventId = 0\nlocal function apply()\n\tself.LockTries = self.LockTries + 1\n\tlocal pc = nil\n\tlocal lp = _UserService.LocalPlayer\n\tif lp ~= nil then\n\t\tpc = lp.PlayerControllerComponent\n\tend\n\tif pc ~= nil then\n\t\tpc.LookDirectionX = 1\n\t\tpc.FixedLookAt = true\n\t\tpc.Enable = false\n\tend\n\tif pc ~= nil then\n\t\t_TimerService:ClearTimer(eventId)\n\telseif self.LockTries > 30 then\n\t\t_TimerService:ClearTimer(eventId)\n\tend\nend\neventId = _TimerService:SetTimerRepeat(apply, 0.1)", + "Code": "self.LockTries = 0\nlocal eventId = 0\nlocal function apply()\n\tself.LockTries = self.LockTries + 1\n\tlocal pc = nil\n\tlocal lp = _UserService.LocalPlayer\n\tif lp ~= nil then\n\t\tpc = lp.PlayerControllerComponent\n\tend\n\tif pc ~= nil then\n\t\tpc.LookDirectionX = 1\n\t\tpc.FixedLookAt = true\n\t\tpc.Enable = false\n\tend\n\tif lp ~= nil then\n\t\tif lp.RigidbodyComponent ~= nil then lp.RigidbodyComponent.WalkAcceleration = 0 end\n\t\tif lp.MovementComponent ~= nil then lp.MovementComponent.InputSpeed = 0; lp.MovementComponent.JumpForce = 0 end\n\tend\n\tif pc ~= nil then\n\t\t_TimerService:ClearTimer(eventId)\n\telseif self.LockTries > 30 then\n\t\t_TimerService:ClearTimer(eventId)\n\tend\nend\neventId = _TimerService:SetTimerRepeat(apply, 0.1)", "Scope": 2, "ExecSpace": 6, "Attributes": [], diff --git a/RootDesk/MyDesk/SlayDeckController.codeblock b/RootDesk/MyDesk/SlayDeckController.codeblock index ce9c0c5..611ec07 100644 --- a/RootDesk/MyDesk/SlayDeckController.codeblock +++ b/RootDesk/MyDesk/SlayDeckController.codeblock @@ -218,6 +218,13 @@ "Attributes": [], "Name": "LobbyBound" }, + { + "Type": "number", + "DefaultValue": "0", + "SyncDirection": 0, + "Attributes": [], + "Name": "LobbyTpTries" + }, { "Type": "boolean", "DefaultValue": "false", @@ -614,7 +621,7 @@ "Name": null }, "Arguments": [], - "Code": "self.Cards = {\n\tStrike = { name = \"파워 스트라이크\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"warrior\", rarity = \"normal\", fx = \"291b2298db88476f8ae3c6c78f53c9b7\", image = \"e4acdf27d68549db8858d6082169c70c\" },\n\tDefend = { name = \"아이언 바디\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5, class = \"warrior\", rarity = \"normal\", image = \"7648c3b8e1ca44fc8ec353561207a670\" },\n\tBash = { name = \"슬래시 블러스트\", cost = 2, desc = \"피해 10\", kind = \"Attack\", damage = 10, class = \"warrior\", rarity = \"normal\", fx = \"863812c5c2f84132ac7465b50ec2283e\", image = \"4cbbe8cfc3e840e4a76379498d8eb012\" },\n\tWarLeap = { name = \"워 리프\", cost = 1, desc = \"피해 4, 방어도 3\", kind = \"Attack\", damage = 4, block = 3, class = \"warrior\", rarity = \"normal\", image = \"992dabf6aff2400e92b2f4f705d8ebe7\" },\n\tBrandish = { name = \"브랜디시\", cost = 2, desc = \"피해 13\", kind = \"Attack\", damage = 13, class = \"warrior\", rarity = \"unique\", fx = \"e8a145a6c43d493f9ad50fab03b200aa\", image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tChargedBlow = { name = \"차지 블로우\", cost = 2, desc = \"피해 8, 취약 2\", kind = \"Attack\", damage = 8, vuln = 2, class = \"warrior\", rarity = \"unique\", image = \"fe83c7635b0e49ed83d75a2833adb53e\" },\n\tThreaten = { name = \"위협\", cost = 0, desc = \"약화 2 부여\", kind = \"Skill\", weak = 2, class = \"warrior\", rarity = \"normal\", image = \"64daadf1a98e490d9c14ef52ec776e63\" },\n\tEnrage = { name = \"인레이지\", cost = 1, desc = \"힘 +2\", kind = \"Skill\", strength = 2, class = \"warrior\", rarity = \"unique\", image = \"09370fc7551e47238fd103a80fba558e\" },\n\tRage = { name = \"분노\", cost = 1, desc = \"매 턴 시작 시 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"warrior\", rarity = \"legend\", image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tComboAttack = { name = \"콤보 어택\", cost = 1, desc = \"피해 5 × 2회\", kind = \"Attack\", damage = 5, class = \"fighter\", rarity = \"unique\", hits = 2, fx = \"48754be05be344358cddd55aa8fe11f4\", image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tBerserk = { name = \"버서크\", cost = 2, desc = \"매턴 에너지 +1, 취약 1 자가\", kind = \"Power\", powerEffect = \"energyPerTurn\", value = 1, class = \"fighter\", rarity = \"legend\", selfVuln = 1, image = \"e2580523efc6457385114b78ad0d7cce\" },\n\tRisingAttack = { name = \"라이징 어택\", cost = 2, desc = \"피해 12\", kind = \"Attack\", damage = 12, class = \"fighter\", rarity = \"unique\", fx = \"6f283d96d5804b4fb88009685a11c1f8\", image = \"115e309771604743853abad2d8d186bc\" },\n\tThunderCharge = { name = \"썬더 차지\", cost = 1, desc = \"피해 7, 약화 1\", kind = \"Attack\", damage = 7, weak = 1, class = \"page\", rarity = \"unique\", fx = \"997fa6999aa04dbb97a1dd99025fa2ba\", image = \"b7030d8caedc4fbc9f38fe1e541d6e6b\" },\n\tBlizzardCharge = { name = \"블리자드 차지\", cost = 1, desc = \"피해 7, 취약 1\", kind = \"Attack\", damage = 7, vuln = 1, class = \"page\", rarity = \"unique\", fx = \"2799562e984c4a4da3b73e1f3431057c\", image = \"9aac955d159f49c1bc913ef96128e781\" },\n\tPowerGuard = { name = \"파워 가드\", cost = 1, desc = \"방어도 10\", kind = \"Skill\", block = 10, class = \"page\", rarity = \"unique\", image = \"90a9bf8eeb844b578b4e2d93ac43fedf\" },\n\tPierce = { name = \"피어스\", cost = 1, desc = \"피해 9, 방어 무시\", kind = \"Attack\", damage = 9, class = \"spearman\", rarity = \"unique\", pierce = true, fx = \"1b0afc410a1a458598eb7ca2fb26e97d\", image = \"251b6e12329048429490049a4f3cf564\" },\n\tIronWall = { name = \"아이언 월\", cost = 2, desc = \"방어도 12\", kind = \"Skill\", block = 12, class = \"spearman\", rarity = \"unique\", image = \"92021d62341a4bce9cfd09d1b4b865db\" },\n\tHyperBody = { name = \"하이퍼 바디\", cost = 1, desc = \"매턴 방어도 +3\", kind = \"Power\", powerEffect = \"blockPerTurn\", value = 3, class = \"spearman\", rarity = \"legend\", image = \"b4020dbadee6401f9893a020fe4154b1\" },\n\tEnergyBolt = { name = \"에너지 볼트\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"magician\", rarity = \"normal\", fx = \"1d5877e1120a42d0907f204c959888b1\", image = \"e84880eaf89442128d3af2be5c80a74f\" },\n\tMagicGuard = { name = \"매직 가드\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5, class = \"magician\", rarity = \"normal\", image = \"01b249c26eb34b8aaab774bf221907a1\" },\n\tMagicClaw = { name = \"매직 클로\", cost = 1, desc = \"피해 3 × 2회\", kind = \"Attack\", damage = 3, class = \"magician\", rarity = \"normal\", hits = 2, fx = \"ba4ac7c8f24845b68b7e689b7effcc93\", image = \"f3fcac2d460041b288cc1973caaaf30f\" },\n\tTeleport = { name = \"텔레포트\", cost = 1, desc = \"방어도 3, 드로 1\", kind = \"Skill\", block = 3, class = \"magician\", rarity = \"normal\", draw = 1, image = \"7f70a9dc7e304433bb8121dd9c4df98b\" },\n\tSlow = { name = \"슬로우\", cost = 1, desc = \"약화 2 부여\", kind = \"Skill\", weak = 2, class = \"magician\", rarity = \"normal\", image = \"7224cd3f9b7e497d9dd65f32a50865e4\" },\n\tFireArrow = { name = \"파이어 애로우\", cost = 1, desc = \"피해 8\", kind = \"Attack\", damage = 8, class = \"firepoison\", rarity = \"unique\", fx = \"4a937e208875468eb63d891806fba3cd\", image = \"6fa15fd3a0004b409ea516c11a67e533\" },\n\tPoisonBreath = { name = \"포이즌 브레스\", cost = 1, desc = \"독 4 부여\", kind = \"Skill\", class = \"firepoison\", rarity = \"unique\", poison = 4, image = \"07200f3c74854022baa7ebbefdc4ad8c\" },\n\tElementAmp = { name = \"엘레멘트 앰플\", cost = 1, desc = \"매 턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"firepoison\", rarity = \"legend\", image = \"06865473977849bebe79062dbd608944\" },\n\tThunderBolt = { name = \"썬더 볼트\", cost = 2, desc = \"모든 적에게 피해 6\", kind = \"Attack\", damage = 6, class = \"icelightning\", rarity = \"legend\", aoe = true, fx = \"7d52f5e389bd4d44a30cf7cc54538f8f\", image = \"c6685d33cb2641f09d11cfa2d5cc820c\" },\n\tColdBeam = { name = \"콜드 빔\", cost = 2, desc = \"피해 7, 약화 2\", kind = \"Attack\", damage = 7, weak = 2, class = \"icelightning\", rarity = \"unique\", image = \"e8f7c148c79f497d83014e3361f59f5c\" },\n\tChillingStep = { name = \"칠링 스텝\", cost = 1, desc = \"방어도 8\", kind = \"Skill\", block = 8, class = \"icelightning\", rarity = \"unique\", image = \"bef20873a68a4651a91d74be457c2cfc\" },\n\tHeal = { name = \"힐\", cost = 1, desc = \"HP 10 회복\", kind = \"Skill\", class = \"cleric\", rarity = \"unique\", heal = 10, image = \"8b935b7d7066493cb462834bbe287c74\" },\n\tBless = { name = \"블레스\", cost = 1, desc = \"힘 +1, 방어도 5\", kind = \"Skill\", block = 5, strength = 1, class = \"cleric\", rarity = \"unique\", image = \"607fc5457c1c44a0993a5c2fe3fb0c68\" },\n\tHolyArrow = { name = \"홀리 애로우\", cost = 1, desc = \"피해 8\", kind = \"Attack\", damage = 8, class = \"cleric\", rarity = \"unique\", fx = \"4faa7b78e09643cf86339b8b7cf2abac\", image = \"a80127195bf7471f9545b70e491f4719\" },\n\tLuckySeven = { name = \"럭키 세븐\", cost = 1, desc = \"피해 3 × 2회\", kind = \"Attack\", damage = 3, class = \"thief\", rarity = \"normal\", hits = 2, fx = \"aa499663a278414b914b8fb9b8382879\", image = \"0539ba559f8c413dac95c52992b436d9\" },\n\tDoubleStab = { name = \"더블 스탭\", cost = 2, desc = \"피해 5 × 2회\", kind = \"Attack\", damage = 5, class = \"thief\", rarity = \"normal\", hits = 2, fx = \"a82d0aae7f5e4db6a19078537afbe80c\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tDarkSight = { name = \"다크 사이트\", cost = 1, desc = \"방어도 6\", kind = \"Skill\", block = 6, class = \"thief\", rarity = \"normal\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHaste = { name = \"헤이스트\", cost = 1, desc = \"방어도 3, 드로 1\", kind = \"Skill\", block = 3, class = \"thief\", rarity = \"normal\", draw = 1, image = \"e65317856a914b8686f55e3351c3a24c\" },\n\tDrain = { name = \"드레인\", cost = 1, desc = \"피해 5, HP 3 회복\", kind = \"Attack\", damage = 5, class = \"thief\", rarity = \"unique\", heal = 3 },\n\tCriticalThrow = { name = \"크리티컬 스로우\", cost = 2, desc = \"피해 8 × 2회\", kind = \"Attack\", damage = 8, class = \"assassin\", rarity = \"unique\", hits = 2, fx = \"23232336918d43f49fab19b888920f0c\", image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tShadowStar = { name = \"쉐도우 스타\", cost = 1, desc = \"피해 6, 약화 1\", kind = \"Attack\", damage = 6, weak = 1, class = \"assassin\", rarity = \"unique\", fx = \"ab45ee74d258419096e1e132af68aeca\", image = \"2d394e08d95841028d3dc95fca200756\" },\n\tClawMastery = { name = \"클로 마스터리\", cost = 1, desc = \"매 턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"assassin\", rarity = \"legend\", image = \"aa09741ae1e145a28d1e1c19aeb9e83c\" },\n\tSavageBlow = { name = \"새비지 블로우\", cost = 1, desc = \"피해 3 × 3회\", kind = \"Attack\", damage = 3, class = \"bandit\", rarity = \"unique\", hits = 3, fx = \"a82d0aae7f5e4db6a19078537afbe80c\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tSteal = { name = \"스틸\", cost = 1, desc = \"방어도 4, 드로 1\", kind = \"Skill\", block = 4, class = \"bandit\", rarity = \"unique\", draw = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tMesoGuard = { name = \"메소 가드\", cost = 1, desc = \"매 턴 방어도 +3\", kind = \"Power\", powerEffect = \"blockPerTurn\", value = 3, class = \"bandit\", rarity = \"legend\" },\n\tWound = { name = \"상처\", cost = 0, desc = \"사용할 수 없다. 손패를 막는 저주.\", kind = \"Status\", class = \"curse\", rarity = \"normal\", unplayable = true, curse = true },\n\tBurn = { name = \"화상\", cost = 0, desc = \"사용 불가. 손패에 있으면 턴 종료 시 피해 2.\", kind = \"Status\", class = \"curse\", rarity = \"normal\", unplayable = true, curse = true, endTurnDamage = 2 },\n}\nself.CardFrames = {\n\twarrior = { normal = \"4bb57ef88ef449fdaf958f6cf37fe44b\", unique = \"4f71c124c8bc4e13b5e9fad392995f68\", legend = \"6d741a60c60743cb98ee740a1e2dbfed\" },\n\tmagician = { normal = \"d788d09f6f50467ebc67f01dec45f9e2\", unique = \"f5def2e8022b4e59a17d3c16414034fe\", legend = \"cff71f2e472041ce80c6fbd296f42e2d\" },\n\tbandit = { normal = \"9487b06867bc46269ed1d855420f457f\", unique = \"b3081fb2fb1445fa90b12b01481a78ef\", legend = \"c357d2daf31a489d95b8fa47e50dd879\" },\n}\nself.ClassToFrame = {\n\twarrior = \"warrior\",\n\tfighter = \"warrior\",\n\tpage = \"warrior\",\n\tspearman = \"warrior\",\n\tmagician = \"magician\",\n\tfirepoison = \"magician\",\n\ticelightning = \"magician\",\n\tcleric = \"magician\",\n\tthief = \"bandit\",\n\tassassin = \"bandit\",\n\tbandit = \"bandit\",\n\tcurse = \"bandit\",\n}\nself.SoulShopDef = {\n\t{ key = \"meso\", name = \"두둑한 지갑\", desc = \"런 시작 시 메소 +60\", cost = 3 },\n\t{ key = \"hp\", name = \"단련된 육체\", desc = \"시작 최대 HP +15\", cost = 4 },\n\t{ key = \"trim\", name = \"덱 정제\", desc = \"시작 덱에서 기본 카드 1장 제거\", cost = 5 },\n\t{ key = \"relic\", name = \"유물 수집가\", desc = \"런 시작 시 유물 1개 추가\", cost = 6 },\n}\nself.SoulUnlocks = {}\nself.SoulPoints = self.SoulPoints or 0\nself:ShowLobby()\nlocal lp = _UserService.LocalPlayer\nif lp ~= nil then\n\tself:ReqLoadAscension(lp.PlayerComponent.UserId)\n\tself:ReqLoadSouls(lp.PlayerComponent.UserId)\nend", + "Code": "self.Cards = {\n\tStrike = { name = \"파워 스트라이크\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"warrior\", rarity = \"normal\", fx = \"291b2298db88476f8ae3c6c78f53c9b7\", image = \"e4acdf27d68549db8858d6082169c70c\" },\n\tDefend = { name = \"아이언 바디\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5, class = \"warrior\", rarity = \"normal\", image = \"7648c3b8e1ca44fc8ec353561207a670\" },\n\tBash = { name = \"슬래시 블러스트\", cost = 2, desc = \"피해 10\", kind = \"Attack\", damage = 10, class = \"warrior\", rarity = \"normal\", fx = \"863812c5c2f84132ac7465b50ec2283e\", image = \"4cbbe8cfc3e840e4a76379498d8eb012\" },\n\tWarLeap = { name = \"워 리프\", cost = 1, desc = \"피해 4, 방어도 3\", kind = \"Attack\", damage = 4, block = 3, class = \"warrior\", rarity = \"normal\", image = \"992dabf6aff2400e92b2f4f705d8ebe7\" },\n\tBrandish = { name = \"브랜디시\", cost = 2, desc = \"피해 13\", kind = \"Attack\", damage = 13, class = \"warrior\", rarity = \"unique\", fx = \"e8a145a6c43d493f9ad50fab03b200aa\", image = \"21af4bccc5054a5dbc8245dfa7f08681\" },\n\tChargedBlow = { name = \"차지 블로우\", cost = 2, desc = \"피해 8, 취약 2\", kind = \"Attack\", damage = 8, vuln = 2, class = \"warrior\", rarity = \"unique\", image = \"fe83c7635b0e49ed83d75a2833adb53e\" },\n\tThreaten = { name = \"위협\", cost = 0, desc = \"약화 2 부여\", kind = \"Skill\", weak = 2, class = \"warrior\", rarity = \"normal\", image = \"64daadf1a98e490d9c14ef52ec776e63\" },\n\tEnrage = { name = \"인레이지\", cost = 1, desc = \"힘 +2\", kind = \"Skill\", strength = 2, class = \"warrior\", rarity = \"unique\", image = \"09370fc7551e47238fd103a80fba558e\" },\n\tRage = { name = \"분노\", cost = 1, desc = \"매 턴 시작 시 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"warrior\", rarity = \"legend\", image = \"379d86e3de064959aa4612f71e84ccfb\" },\n\tComboAttack = { name = \"콤보 어택\", cost = 1, desc = \"피해 5 × 2회\", kind = \"Attack\", damage = 5, class = \"fighter\", rarity = \"unique\", hits = 2, fx = \"48754be05be344358cddd55aa8fe11f4\", image = \"1bc3e52b330648faae9eafd5a205e37b\" },\n\tBerserk = { name = \"버서크\", cost = 2, desc = \"매턴 에너지 +1, 취약 1 자가\", kind = \"Power\", powerEffect = \"energyPerTurn\", value = 1, class = \"fighter\", rarity = \"legend\", selfVuln = 1, image = \"e2580523efc6457385114b78ad0d7cce\" },\n\tRisingAttack = { name = \"라이징 어택\", cost = 2, desc = \"피해 12\", kind = \"Attack\", damage = 12, class = \"fighter\", rarity = \"unique\", fx = \"6f283d96d5804b4fb88009685a11c1f8\", image = \"115e309771604743853abad2d8d186bc\" },\n\tThunderCharge = { name = \"썬더 차지\", cost = 1, desc = \"피해 7, 약화 1\", kind = \"Attack\", damage = 7, weak = 1, class = \"page\", rarity = \"unique\", fx = \"997fa6999aa04dbb97a1dd99025fa2ba\", image = \"b7030d8caedc4fbc9f38fe1e541d6e6b\" },\n\tBlizzardCharge = { name = \"블리자드 차지\", cost = 1, desc = \"피해 7, 취약 1\", kind = \"Attack\", damage = 7, vuln = 1, class = \"page\", rarity = \"unique\", fx = \"2799562e984c4a4da3b73e1f3431057c\", image = \"9aac955d159f49c1bc913ef96128e781\" },\n\tPowerGuard = { name = \"파워 가드\", cost = 1, desc = \"방어도 10\", kind = \"Skill\", block = 10, class = \"page\", rarity = \"unique\", image = \"90a9bf8eeb844b578b4e2d93ac43fedf\" },\n\tPierce = { name = \"피어스\", cost = 1, desc = \"피해 9, 방어 무시\", kind = \"Attack\", damage = 9, class = \"spearman\", rarity = \"unique\", pierce = true, fx = \"1b0afc410a1a458598eb7ca2fb26e97d\", image = \"251b6e12329048429490049a4f3cf564\" },\n\tIronWall = { name = \"아이언 월\", cost = 2, desc = \"방어도 12\", kind = \"Skill\", block = 12, class = \"spearman\", rarity = \"unique\", image = \"92021d62341a4bce9cfd09d1b4b865db\" },\n\tHyperBody = { name = \"하이퍼 바디\", cost = 1, desc = \"매턴 방어도 +3\", kind = \"Power\", powerEffect = \"blockPerTurn\", value = 3, class = \"spearman\", rarity = \"legend\", image = \"b4020dbadee6401f9893a020fe4154b1\" },\n\tEnergyBolt = { name = \"에너지 볼트\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6, class = \"magician\", rarity = \"normal\", fx = \"1d5877e1120a42d0907f204c959888b1\", image = \"e84880eaf89442128d3af2be5c80a74f\" },\n\tMagicGuard = { name = \"매직 가드\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5, class = \"magician\", rarity = \"normal\", image = \"01b249c26eb34b8aaab774bf221907a1\" },\n\tMagicClaw = { name = \"매직 클로\", cost = 1, desc = \"피해 3 × 2회\", kind = \"Attack\", damage = 3, class = \"magician\", rarity = \"normal\", hits = 2, fx = \"ba4ac7c8f24845b68b7e689b7effcc93\", image = \"f3fcac2d460041b288cc1973caaaf30f\" },\n\tTeleport = { name = \"텔레포트\", cost = 1, desc = \"방어도 3, 드로 1\", kind = \"Skill\", block = 3, class = \"magician\", rarity = \"normal\", draw = 1, image = \"7f70a9dc7e304433bb8121dd9c4df98b\" },\n\tSlow = { name = \"슬로우\", cost = 1, desc = \"약화 2 부여\", kind = \"Skill\", weak = 2, class = \"magician\", rarity = \"normal\", image = \"7224cd3f9b7e497d9dd65f32a50865e4\" },\n\tFireArrow = { name = \"파이어 애로우\", cost = 1, desc = \"피해 8\", kind = \"Attack\", damage = 8, class = \"firepoison\", rarity = \"unique\", fx = \"4a937e208875468eb63d891806fba3cd\", image = \"6fa15fd3a0004b409ea516c11a67e533\" },\n\tPoisonBreath = { name = \"포이즌 브레스\", cost = 1, desc = \"독 4 부여\", kind = \"Skill\", class = \"firepoison\", rarity = \"unique\", poison = 4, image = \"07200f3c74854022baa7ebbefdc4ad8c\" },\n\tElementAmp = { name = \"엘레멘트 앰플\", cost = 1, desc = \"매 턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"firepoison\", rarity = \"legend\", image = \"06865473977849bebe79062dbd608944\" },\n\tThunderBolt = { name = \"썬더 볼트\", cost = 2, desc = \"모든 적에게 피해 6\", kind = \"Attack\", damage = 6, class = \"icelightning\", rarity = \"legend\", aoe = true, fx = \"7d52f5e389bd4d44a30cf7cc54538f8f\", image = \"c6685d33cb2641f09d11cfa2d5cc820c\" },\n\tColdBeam = { name = \"콜드 빔\", cost = 2, desc = \"피해 7, 약화 2\", kind = \"Attack\", damage = 7, weak = 2, class = \"icelightning\", rarity = \"unique\", image = \"e8f7c148c79f497d83014e3361f59f5c\" },\n\tChillingStep = { name = \"칠링 스텝\", cost = 1, desc = \"방어도 8\", kind = \"Skill\", block = 8, class = \"icelightning\", rarity = \"unique\", image = \"bef20873a68a4651a91d74be457c2cfc\" },\n\tHeal = { name = \"힐\", cost = 1, desc = \"HP 10 회복\", kind = \"Skill\", class = \"cleric\", rarity = \"unique\", heal = 10, image = \"8b935b7d7066493cb462834bbe287c74\" },\n\tBless = { name = \"블레스\", cost = 1, desc = \"힘 +1, 방어도 5\", kind = \"Skill\", block = 5, strength = 1, class = \"cleric\", rarity = \"unique\", image = \"607fc5457c1c44a0993a5c2fe3fb0c68\" },\n\tHolyArrow = { name = \"홀리 애로우\", cost = 1, desc = \"피해 8\", kind = \"Attack\", damage = 8, class = \"cleric\", rarity = \"unique\", fx = \"4faa7b78e09643cf86339b8b7cf2abac\", image = \"a80127195bf7471f9545b70e491f4719\" },\n\tLuckySeven = { name = \"럭키 세븐\", cost = 1, desc = \"피해 3 × 2회\", kind = \"Attack\", damage = 3, class = \"thief\", rarity = \"normal\", hits = 2, fx = \"aa499663a278414b914b8fb9b8382879\", image = \"0539ba559f8c413dac95c52992b436d9\" },\n\tDoubleStab = { name = \"더블 스탭\", cost = 2, desc = \"피해 5 × 2회\", kind = \"Attack\", damage = 5, class = \"thief\", rarity = \"normal\", hits = 2, fx = \"a82d0aae7f5e4db6a19078537afbe80c\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tDarkSight = { name = \"다크 사이트\", cost = 1, desc = \"방어도 6\", kind = \"Skill\", block = 6, class = \"thief\", rarity = \"normal\", image = \"0946f69d84464df29b24b94c744c868d\" },\n\tHaste = { name = \"헤이스트\", cost = 1, desc = \"방어도 3, 드로 1\", kind = \"Skill\", block = 3, class = \"thief\", rarity = \"normal\", draw = 1, image = \"e65317856a914b8686f55e3351c3a24c\" },\n\tDrain = { name = \"드레인\", cost = 1, desc = \"피해 5, HP 3 회복\", kind = \"Attack\", damage = 5, class = \"thief\", rarity = \"unique\", heal = 3 },\n\tCriticalThrow = { name = \"크리티컬 스로우\", cost = 2, desc = \"피해 8 × 2회\", kind = \"Attack\", damage = 8, class = \"assassin\", rarity = \"unique\", hits = 2, fx = \"23232336918d43f49fab19b888920f0c\", image = \"1b0f2dc8abd0434990eee1befefcbe0d\" },\n\tShadowStar = { name = \"쉐도우 스타\", cost = 1, desc = \"피해 6, 약화 1\", kind = \"Attack\", damage = 6, weak = 1, class = \"assassin\", rarity = \"unique\", fx = \"ab45ee74d258419096e1e132af68aeca\", image = \"2d394e08d95841028d3dc95fca200756\" },\n\tClawMastery = { name = \"클로 마스터리\", cost = 1, desc = \"매 턴 힘 +1\", kind = \"Power\", powerEffect = \"strengthPerTurn\", value = 1, class = \"assassin\", rarity = \"legend\", image = \"aa09741ae1e145a28d1e1c19aeb9e83c\" },\n\tSavageBlow = { name = \"새비지 블로우\", cost = 1, desc = \"피해 3 × 3회\", kind = \"Attack\", damage = 3, class = \"bandit\", rarity = \"unique\", hits = 3, fx = \"a82d0aae7f5e4db6a19078537afbe80c\", image = \"92a5020c978c46bdabab910598118b86\" },\n\tSteal = { name = \"스틸\", cost = 1, desc = \"방어도 4, 드로 1\", kind = \"Skill\", block = 4, class = \"bandit\", rarity = \"unique\", draw = 1, image = \"c1e19219745e44c39ae6ac2f77e347d9\" },\n\tMesoGuard = { name = \"메소 가드\", cost = 1, desc = \"매 턴 방어도 +3\", kind = \"Power\", powerEffect = \"blockPerTurn\", value = 3, class = \"bandit\", rarity = \"legend\" },\n\tWound = { name = \"상처\", cost = 0, desc = \"사용할 수 없다. 손패를 막는 저주.\", kind = \"Status\", class = \"curse\", rarity = \"normal\", unplayable = true, curse = true },\n\tBurn = { name = \"화상\", cost = 0, desc = \"사용 불가. 손패에 있으면 턴 종료 시 피해 2.\", kind = \"Status\", class = \"curse\", rarity = \"normal\", unplayable = true, curse = true, endTurnDamage = 2 },\n}\nself.CardFrames = {\n\twarrior = { normal = \"4bb57ef88ef449fdaf958f6cf37fe44b\", unique = \"4f71c124c8bc4e13b5e9fad392995f68\", legend = \"6d741a60c60743cb98ee740a1e2dbfed\" },\n\tmagician = { normal = \"d788d09f6f50467ebc67f01dec45f9e2\", unique = \"f5def2e8022b4e59a17d3c16414034fe\", legend = \"cff71f2e472041ce80c6fbd296f42e2d\" },\n\tbandit = { normal = \"9487b06867bc46269ed1d855420f457f\", unique = \"b3081fb2fb1445fa90b12b01481a78ef\", legend = \"c357d2daf31a489d95b8fa47e50dd879\" },\n}\nself.ClassToFrame = {\n\twarrior = \"warrior\",\n\tfighter = \"warrior\",\n\tpage = \"warrior\",\n\tspearman = \"warrior\",\n\tmagician = \"magician\",\n\tfirepoison = \"magician\",\n\ticelightning = \"magician\",\n\tcleric = \"magician\",\n\tthief = \"bandit\",\n\tassassin = \"bandit\",\n\tbandit = \"bandit\",\n\tcurse = \"bandit\",\n}\nself.SoulShopDef = {\n\t{ key = \"meso\", name = \"두둑한 지갑\", desc = \"런 시작 시 메소 +60\", cost = 3 },\n\t{ key = \"hp\", name = \"단련된 육체\", desc = \"시작 최대 HP +15\", cost = 4 },\n\t{ key = \"trim\", name = \"덱 정제\", desc = \"시작 덱에서 기본 카드 1장 제거\", cost = 5 },\n\t{ key = \"relic\", name = \"유물 수집가\", desc = \"런 시작 시 유물 1개 추가\", cost = 6 },\n}\nself.SoulUnlocks = {}\nself.SoulPoints = self.SoulPoints or 0\nself:ShowLobby()\nlocal lp = _UserService.LocalPlayer\nif lp ~= nil then\n\tself:ReqLoadAscension(lp.PlayerComponent.UserId)\n\tself:ReqLoadSouls(lp.PlayerComponent.UserId)\nend\n_InputService:ConnectEvent(KeyDownEvent, function(e)\n\tif e.key == KeyboardKey.LeftControl then\n\t\tlocal lp2 = _UserService.LocalPlayer\n\t\tif lp2 ~= nil and lp2.CurrentMapName == \"lobby\" and self.RunActive ~= true then\n\t\t\tself:PlayerAttackMotion()\n\t\tend\n\tend\nend)", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -893,12 +900,50 @@ "Name": null }, "Arguments": [], - "Code": "self.SelectedClass = \"\"\nself:RenderAscension()\nself:RenderSoulLabel()\nself:ShowState(\"lobby\")\nself:SetEntityEnabled(\"/ui/DefaultGroup/BoardHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/SoulShopHud\", false)\nself:BindLobbyButtons()\nself:BindMenuButtons()", + "Code": "self.SelectedClass = \"\"\nself:RenderAscension()\nself:RenderSoulLabel()\nself:ShowState(\"lobby\")\nself:SetEntityEnabled(\"/ui/DefaultGroup/BoardHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/SoulShopHud\", false)\nself:BindLobbyButtons()\nself:BindMenuButtons()\nself:GoLobbyMap()", "Scope": 2, "ExecSpace": 6, "Attributes": [], "Name": "ShowLobby" }, + { + "Return": { + "Type": "void", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [], + "Code": "self.LobbyTpTries = 0\nlocal eventId = 0\nlocal function go()\n\tself.LobbyTpTries = self.LobbyTpTries + 1\n\tlocal lp = _UserService.LocalPlayer\n\tif lp ~= nil then\n\t\tif lp.CurrentMapName ~= \"lobby\" then\n\t\t\t_TeleportService:TeleportToMapPosition(lp, Vector3(-5, 0.03, 0), \"lobby\")\n\t\tend\n\t\t_TimerService:ClearTimer(eventId)\n\telseif self.LobbyTpTries > 50 then\n\t\t_TimerService:ClearTimer(eventId)\n\tend\nend\neventId = _TimerService:SetTimerRepeat(go, 0.1)", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "GoLobbyMap" + }, + { + "Return": { + "Type": "void", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [ + { + "Type": "string", + "DefaultValue": "\"\"", + "SyncDirection": 0, + "Attributes": [], + "Name": "id" + } + ], + "Code": "if self.RunActive == true then\n\treturn\nend\nif id == \"run\" then\n\tself:ShowCharacterSelect()\nelseif id == \"codex\" then\n\tself:ShowCodex()\nelseif id == \"shop\" then\n\tself:ShowSoulShop()\nelseif id == \"board\" then\n\tself:ShowBoard()\nend", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "OnLobbyNpcInteract" + }, { "Return": { "Type": "void", @@ -923,7 +968,7 @@ "Name": null }, "Arguments": [], - "Code": "if self.LobbyBound == true then\n\treturn\nend\nself.LobbyBound = true\nlocal function bindClick(path, fn)\n\tlocal e = _EntityService:GetEntityByPath(path)\n\tif e ~= nil and e.ButtonComponent ~= nil then\n\t\te:ConnectEvent(ButtonClickEvent, fn)\n\tend\nend\nbindClick(\"/ui/DefaultGroup/LobbyHud/NpcRun\", function() self:ShowCharacterSelect() end)\nbindClick(\"/ui/DefaultGroup/LobbyHud/NpcCodex\", function() self:ShowCodex() end)\nbindClick(\"/ui/DefaultGroup/LobbyHud/NpcShop\", function() self:ShowSoulShop() end)\nbindClick(\"/ui/DefaultGroup/LobbyHud/NpcBoard\", function() self:ShowBoard() end)\nbindClick(\"/ui/DefaultGroup/LobbyHud/AscMinus\", function() self:AdjustAscension(-1) end)\nbindClick(\"/ui/DefaultGroup/LobbyHud/AscPlus\", function() self:AdjustAscension(1) end)\nbindClick(\"/ui/DefaultGroup/BoardHud/Close\", function() self:CloseBoard() end)\nbindClick(\"/ui/DefaultGroup/SoulShopHud/Close\", function() self:CloseSoulShop() end)", + "Code": "if self.LobbyBound == true then\n\treturn\nend\nself.LobbyBound = true\nlocal function bindClick(path, fn)\n\tlocal e = _EntityService:GetEntityByPath(path)\n\tif e ~= nil and e.ButtonComponent ~= nil then\n\t\te:ConnectEvent(ButtonClickEvent, fn)\n\tend\nend\nbindClick(\"/ui/DefaultGroup/LobbyHud/AscMinus\", function() self:AdjustAscension(-1) end)\nbindClick(\"/ui/DefaultGroup/LobbyHud/AscPlus\", function() self:AdjustAscension(1) end)\nbindClick(\"/ui/DefaultGroup/BoardHud/Close\", function() self:CloseBoard() end)\nbindClick(\"/ui/DefaultGroup/SoulShopHud/Close\", function() self:CloseSoulShop() end)", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -1314,7 +1359,7 @@ "Name": null }, "Arguments": [], - "Code": "if self.SelectedClass == \"magician\" then\n\tself.PlayerMaxHp = 70\n\tself.RunDeck = { \"EnergyBolt\", \"EnergyBolt\", \"EnergyBolt\", \"EnergyBolt\", \"EnergyBolt\", \"MagicGuard\", \"MagicGuard\", \"MagicGuard\", \"MagicGuard\", \"MagicClaw\" }\nelseif self.SelectedClass == \"thief\" then\n\tself.PlayerMaxHp = 75\n\tself.RunDeck = { \"LuckySeven\", \"LuckySeven\", \"LuckySeven\", \"LuckySeven\", \"LuckySeven\", \"DarkSight\", \"DarkSight\", \"DarkSight\", \"DarkSight\", \"DoubleStab\" }\nelse\n\tself.PlayerMaxHp = 80\n\tself.RunDeck = { \"Strike\", \"Strike\", \"Strike\", \"Strike\", \"Strike\", \"Defend\", \"Defend\", \"Defend\", \"Defend\", \"Bash\" }\nend\nself.PlayerMaxHp = self.PlayerMaxHp - self:AscStartHpPenalty()\nself.PlayerHp = self.PlayerMaxHp\nself.Gold = 0\nself.Floor = 1\nself.RunLength = 5\nself.RunActive = true\nself.RunRelics = {}\nself.RunPotions = {}\nself.PotionSlots = 3\nself.Potions = {\n\tredPotion = { name = \"빨간 포션\", desc = \"HP 20 회복\", effect = \"heal\", value = 20, icon = \"393e2a0d8da544899eaa8b22c97f832b\" },\n\tfirebomb = { name = \"화염병\", desc = \"적에게 피해 20\", effect = \"damage\", value = 20, icon = \"7ddb464c2574456289a4eb72ce86f193\" },\n\twarriorElixir = { name = \"전사의 물약\", desc = \"힘 +2\", effect = \"strength\", value = 2, icon = \"7cfbd410581e4073815daaf5f3e6c72f\" },\n\tguardPotion = { name = \"수호의 물약\", desc = \"방어도 +12\", effect = \"block\", value = 12, icon = \"8f8402dfa0f746e18bf606ed74302c0a\" },\n\tmanaElixir = { name = \"마나 엘릭서\", desc = \"에너지 +2\", effect = \"energy\", value = 2, icon = \"ec2778c366f6477ab0f8e7f06bcd73f4\" },\n\tcursedVial = { name = \"저주의 병\", desc = \"적에게 약화 3\", effect = \"weak\", value = 3, icon = \"a9a2763fdb6849dcba3028c737487680\" },\n}\nself.Relics = {\n\tironHeart = { name = \"강철 심장\", desc = \"전투 시작 시 방어도 +6\", hook = \"combatStart\", effect = \"block\", value = 6, icon = \"e555b3a62f3c49dbb2c53784e6bd481f\" },\n\tenergyCore = { name = \"에너지 코어\", desc = \"턴 시작 시 에너지 +1\", hook = \"turnStart\", effect = \"energy\", value = 1, icon = \"a41014f28b47434ab9f49ef104523862\" },\n\tvampire = { name = \"흡혈 송곳니\", desc = \"공격 카드 사용 시 HP +1\", hook = \"cardPlayed\", effect = \"healOnAttack\", value = 1, icon = \"ed64cde7e6c44b9e99502847e54f04e9\" },\n\tgoldIdol = { name = \"황금 우상\", desc = \"전투 승리 시 메소 +10\", hook = \"combatReward\", effect = \"gold\", value = 10, icon = \"03bb05c92b8f45edb0f3dad2e118fd5a\" },\n\tpotionBelt = { name = \"장인의 벨트\", desc = \"물약 슬롯이 5칸으로 늘어난다\", hook = \"passive\", effect = \"potionSlots\", value = 5, icon = \"36725b4566ac40d4902e2ab2113c2096\" },\n\tburningBlood = { name = \"자쿰의 투구\", desc = \"전투 승리 시 HP 6 회복\", hook = \"combatEnd\", effect = \"healOnWin\", value = 6, icon = \"07f994825ce34131b419d43e890c878d\" },\n\tvajra = { name = \"미스릴 해머\", desc = \"전투 시작 시 힘 +1\", hook = \"combatStart\", effect = \"strength\", value = 1, icon = \"59d2579d46dc41d590a9e6b141ad458b\" },\n\tanchor = { name = \"메이플 실드\", desc = \"첫 턴 방어도 +10\", hook = \"combatStart\", effect = \"block\", value = 10, icon = \"6349413e08cc49848862591863d056a0\" },\n\tbagOfPrep = { name = \"모험가의 배낭\", desc = \"첫 턴 드로우 +2\", hook = \"combatStart\", effect = \"draw\", value = 2, icon = \"77b240cb8af245b4801a714380267ae9\" },\n\tbloodVial = { name = \"피의 목걸이\", desc = \"전투 시작 시 HP 2 회복\", hook = \"combatStart\", effect = \"heal\", value = 2, icon = \"c782e949506a42c49eb139c7e65527d7\" },\n\tbronzeScales = { name = \"브론즈 체인메일\", desc = \"피격 시 공격자에게 3 반사\", hook = \"onPlayerDamaged\", effect = \"thorns\", value = 3, icon = \"87272346b145412391622cf803f888d1\" },\n\tstrawberry = { name = \"건강의 반지\", desc = \"획득 시 최대 HP +7\", hook = \"passive\", effect = \"maxHp\", value = 7, icon = \"58f643e29c354c2783a5ce9a72ec155c\" },\n\tpenNib = { name = \"황금 깃펜\", desc = \"10번째 공격마다 피해 2배\", hook = \"attackCalc\", effect = \"penNib\", value = 10, icon = \"4d38d721cc064d14b31b9e9a92754139\" },\n\tboot = { name = \"브론즈 부츠\", desc = \"5 미만 공격 피해가 5로\", hook = \"attackCalc\", effect = \"boot\", value = 5, icon = \"d572b3aa4dac4162aa0d9e551b055dce\" },\n\takabeko = { name = \"황소 투구\", desc = \"전투 첫 공격 피해 +8\", hook = \"attackCalc\", effect = \"akabeko\", value = 8, icon = \"eb3330a6e2274eff958639f8792119d3\" },\n\tcentennialPuzzle = { name = \"백년의 부적\", desc = \"전투 첫 피격 시 드로우 3\", hook = \"onPlayerDamaged\", effect = \"firstLossDraw\", value = 3, icon = \"cfe5ed6556b944fc83ab58b774bb2b73\" },\n\tmeatOnBone = { name = \"고기 망치\", desc = \"승리 시 HP 50% 이하면 12 회복\", hook = \"combatEnd\", effect = \"healIfLow\", value = 12, icon = \"a93e8e87f184411c98c96b877d9f8b10\" },\n\tselfFormingClay = { name = \"점토 갑옷\", desc = \"피해를 받으면 다음 턴 방어 +3\", hook = \"onPlayerDamaged\", effect = \"clayBlock\", value = 3, icon = \"bb446793c5204d5db7d33563fe79f648\" },\n\tchampionBelt = { name = \"챔피언 벨트\", desc = \"취약 부여 시 약화 1 추가\", hook = \"cardDebuff\", effect = \"vulnAddsWeak\", value = 1, icon = \"7ca8c63026034113a561d6adf679fed2\" },\n}\nself.RelicPool = { \"energyCore\", \"vampire\", \"goldIdol\", \"potionBelt\", \"burningBlood\", \"vajra\", \"anchor\", \"bagOfPrep\", \"bloodVial\", \"bronzeScales\", \"strawberry\", \"penNib\", \"boot\", \"akabeko\", \"centennialPuzzle\", \"meatOnBone\", \"selfFormingClay\", \"championBelt\" }\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 }, { kind = \"Debuff\", value = 1, effect = \"weak\" } } },\n\tslime_boss = { name = \"슬라임 킹\", maxHp = 120, intents = { { kind = \"Attack\", value = 18 }, { kind = \"Defend\", value = 12 }, { kind = \"Debuff\", value = 2, effect = \"vuln\" }, { kind = \"Attack\", value = 10 }, { kind = \"Attack\", value = 22 } } },\n\torange_mushroom = { name = \"주황버섯\", maxHp = 16, intents = { { kind = \"Attack\", value = 5 }, { kind = \"Attack\", value = 5 }, { kind = \"Defend\", value = 4 }, { kind = \"Attack\", value = 8 } } },\n\tblue_mushroom = { name = \"파란버섯\", maxHp = 22, intents = { { kind = \"Attack\", value = 4 }, { kind = \"Attack\", value = 4 }, { kind = \"Attack\", value = 10 }, { kind = \"AddCard\", value = 0, card = \"Wound\", count = 1 } } },\n\tpig = { name = \"돼지\", maxHp = 18, intents = { { kind = \"Attack\", value = 6 }, { kind = \"Attack\", value = 6 }, { kind = \"Defend\", value = 5 } } },\n\tgreen_mushroom = { name = \"초록버섯\", maxHp = 20, intents = { { kind = \"Attack\", value = 7 }, { kind = \"Defend\", value = 3 }, { kind = \"Attack\", value = 9 } } },\n\tred_snail = { name = \"빨간 달팽이\", maxHp = 14, intents = { { kind = \"Attack\", value = 5 }, { kind = \"Defend\", value = 6 }, { kind = \"Attack\", value = 7 } } },\n\tstump = { name = \"나무토막\", maxHp = 19, intents = { { kind = \"Defend\", value = 5 }, { kind = \"Attack\", value = 8 }, { kind = \"Attack\", value = 6 } } },\n\tmushmom = { name = \"머쉬맘\", maxHp = 75, intents = { { kind = \"Defend\", value = 10 }, { kind = \"Debuff\", value = 2, effect = \"weak\" }, { kind = \"Attack\", value = 16 }, { kind = \"Attack\", value = 9 }, { kind = \"Defend\", value = 6 }, { kind = \"AddCard\", value = 0, card = \"Burn\", count = 1 } } },\n\tmodified_snail = { name = \"변형된 달팽이\", maxHp = 60, intents = { { kind = \"Attack\", value = 12 }, { kind = \"Defend\", value = 8 }, { kind = \"Attack\", value = 7 }, { kind = \"Attack\", value = 14 }, { kind = \"Debuff\", value = 1, effect = \"weak\" } } },\n\tking_slime = { name = \"킹 슬라임\", maxHp = 130, intents = { { kind = \"Attack\", value = 18 }, { kind = \"Defend\", value = 14 }, { kind = \"Debuff\", value = 2, effect = \"vuln\" }, { kind = \"Attack\", value = 12 }, { kind = \"Attack\", value = 24 } } },\n}\nself.CurrentNodeId = \"\"\nself.CurrentEnemyId = \"\"\nself.PlayerJob = \"\"\nself.Jobs = {\n\twarrior = {\n\t\t{ id = \"fighter\", name = \"파이터\", desc = \"공격 특화\\n콤보 어택 · 버서크\\n라이징 어택\", starter = \"ComboAttack\" },\n\t\t{ id = \"page\", name = \"페이지\", desc = \"속성 차지 특화\\n썬더/블리자드 차지\\n파워 가드\", starter = \"ThunderCharge\" },\n\t\t{ id = \"spearman\", name = \"스피어맨\", desc = \"방어·관통 특화\\n피어스 · 아이언 월\\n하이퍼 바디\", starter = \"Pierce\" },\n\t},\n\tmagician = {\n\t\t{ id = \"firepoison\", name = \"위자드(불·독)\", desc = \"화염·독 특화\\n파이어 애로우\\n포이즌 브레스 · 앰플\", starter = \"FireArrow\" },\n\t\t{ id = \"icelightning\", name = \"위자드(썬·콜)\", desc = \"광역·빙결 특화\\n썬더 볼트(전체)\\n콜드 빔 · 칠링 스텝\", starter = \"ThunderBolt\" },\n\t\t{ id = \"cleric\", name = \"클레릭\", desc = \"회복·축복 특화\\n힐 · 블레스\\n홀리 애로우\", starter = \"Heal\" },\n\t},\n\tthief = {\n\t\t{ id = \"assassin\", name = \"어쌔신\", desc = \"표창·치명타 특화\\n크리티컬 스로우\\n쉐도우 스타 · 클로\", starter = \"CriticalThrow\" },\n\t\t{ id = \"bandit\", name = \"시프\", desc = \"단검 연타 특화\\n새비지 블로우\\n스틸 · 메소 가드\", starter = \"SavageBlow\" },\n\t},\n}\nself.CardFrames = {\n\twarrior = { normal = \"4bb57ef88ef449fdaf958f6cf37fe44b\", unique = \"4f71c124c8bc4e13b5e9fad392995f68\", legend = \"6d741a60c60743cb98ee740a1e2dbfed\" },\n\tmagician = { normal = \"d788d09f6f50467ebc67f01dec45f9e2\", unique = \"f5def2e8022b4e59a17d3c16414034fe\", legend = \"cff71f2e472041ce80c6fbd296f42e2d\" },\n\tbandit = { normal = \"9487b06867bc46269ed1d855420f457f\", unique = \"b3081fb2fb1445fa90b12b01481a78ef\", legend = \"c357d2daf31a489d95b8fa47e50dd879\" },\n}\nself.ClassToFrame = {\n\twarrior = \"warrior\",\n\tfighter = \"warrior\",\n\tpage = \"warrior\",\n\tspearman = \"warrior\",\n\tmagician = \"magician\",\n\tfirepoison = \"magician\",\n\ticelightning = \"magician\",\n\tcleric = \"magician\",\n\tthief = \"bandit\",\n\tassassin = \"bandit\",\n\tbandit = \"bandit\",\n\tcurse = \"bandit\",\n}\nself:GenerateMap()\nself:BindButtons()\nself:AddRelic(\"ironHeart\")\nself:ApplySoulUnlocks()\nself:RenderPotions()\nself:ShowMap()", + "Code": "if self.SelectedClass == \"magician\" then\n\tself.PlayerMaxHp = 70\n\tself.RunDeck = { \"EnergyBolt\", \"EnergyBolt\", \"EnergyBolt\", \"EnergyBolt\", \"EnergyBolt\", \"MagicGuard\", \"MagicGuard\", \"MagicGuard\", \"MagicGuard\", \"MagicClaw\" }\nelseif self.SelectedClass == \"thief\" then\n\tself.PlayerMaxHp = 75\n\tself.RunDeck = { \"LuckySeven\", \"LuckySeven\", \"LuckySeven\", \"LuckySeven\", \"LuckySeven\", \"DarkSight\", \"DarkSight\", \"DarkSight\", \"DarkSight\", \"DoubleStab\" }\nelse\n\tself.PlayerMaxHp = 80\n\tself.RunDeck = { \"Strike\", \"Strike\", \"Strike\", \"Strike\", \"Strike\", \"Defend\", \"Defend\", \"Defend\", \"Defend\", \"Bash\" }\nend\nself.PlayerMaxHp = self.PlayerMaxHp - self:AscStartHpPenalty()\nself.PlayerHp = self.PlayerMaxHp\nself.Gold = 0\nself.Floor = 1\nself.RunLength = 5\nself.RunActive = true\nself.RunRelics = {}\nself.RunPotions = {}\nself.PotionSlots = 3\nself.Potions = {\n\tredPotion = { name = \"빨간 포션\", desc = \"HP 20 회복\", effect = \"heal\", value = 20, icon = \"393e2a0d8da544899eaa8b22c97f832b\" },\n\tfirebomb = { name = \"화염병\", desc = \"적에게 피해 20\", effect = \"damage\", value = 20, icon = \"7ddb464c2574456289a4eb72ce86f193\" },\n\twarriorElixir = { name = \"전사의 물약\", desc = \"힘 +2\", effect = \"strength\", value = 2, icon = \"7cfbd410581e4073815daaf5f3e6c72f\" },\n\tguardPotion = { name = \"수호의 물약\", desc = \"방어도 +12\", effect = \"block\", value = 12, icon = \"8f8402dfa0f746e18bf606ed74302c0a\" },\n\tmanaElixir = { name = \"마나 엘릭서\", desc = \"에너지 +2\", effect = \"energy\", value = 2, icon = \"ec2778c366f6477ab0f8e7f06bcd73f4\" },\n\tcursedVial = { name = \"저주의 병\", desc = \"적에게 약화 3\", effect = \"weak\", value = 3, icon = \"a9a2763fdb6849dcba3028c737487680\" },\n}\nself.Relics = {\n\tironHeart = { name = \"강철 심장\", desc = \"전투 시작 시 방어도 +6\", hook = \"combatStart\", effect = \"block\", value = 6, icon = \"e555b3a62f3c49dbb2c53784e6bd481f\" },\n\tenergyCore = { name = \"에너지 코어\", desc = \"턴 시작 시 에너지 +1\", hook = \"turnStart\", effect = \"energy\", value = 1, icon = \"a41014f28b47434ab9f49ef104523862\" },\n\tvampire = { name = \"흡혈 송곳니\", desc = \"공격 카드 사용 시 HP +1\", hook = \"cardPlayed\", effect = \"healOnAttack\", value = 1, icon = \"ed64cde7e6c44b9e99502847e54f04e9\" },\n\tgoldIdol = { name = \"황금 우상\", desc = \"전투 승리 시 메소 +10\", hook = \"combatReward\", effect = \"gold\", value = 10, icon = \"03bb05c92b8f45edb0f3dad2e118fd5a\" },\n\tpotionBelt = { name = \"장인의 벨트\", desc = \"물약 슬롯이 5칸으로 늘어난다\", hook = \"passive\", effect = \"potionSlots\", value = 5, icon = \"36725b4566ac40d4902e2ab2113c2096\" },\n\tburningBlood = { name = \"자쿰의 투구\", desc = \"전투 승리 시 HP 6 회복\", hook = \"combatEnd\", effect = \"healOnWin\", value = 6, icon = \"07f994825ce34131b419d43e890c878d\" },\n\tvajra = { name = \"미스릴 해머\", desc = \"전투 시작 시 힘 +1\", hook = \"combatStart\", effect = \"strength\", value = 1, icon = \"59d2579d46dc41d590a9e6b141ad458b\" },\n\tanchor = { name = \"메이플 실드\", desc = \"첫 턴 방어도 +10\", hook = \"combatStart\", effect = \"block\", value = 10, icon = \"6349413e08cc49848862591863d056a0\" },\n\tbagOfPrep = { name = \"모험가의 배낭\", desc = \"첫 턴 드로우 +2\", hook = \"combatStart\", effect = \"draw\", value = 2, icon = \"77b240cb8af245b4801a714380267ae9\" },\n\tbloodVial = { name = \"피의 목걸이\", desc = \"전투 시작 시 HP 2 회복\", hook = \"combatStart\", effect = \"heal\", value = 2, icon = \"c782e949506a42c49eb139c7e65527d7\" },\n\tbronzeScales = { name = \"브론즈 체인메일\", desc = \"피격 시 공격자에게 3 반사\", hook = \"onPlayerDamaged\", effect = \"thorns\", value = 3, icon = \"87272346b145412391622cf803f888d1\" },\n\tstrawberry = { name = \"건강의 반지\", desc = \"획득 시 최대 HP +7\", hook = \"passive\", effect = \"maxHp\", value = 7, icon = \"58f643e29c354c2783a5ce9a72ec155c\" },\n\tpenNib = { name = \"황금 깃펜\", desc = \"10번째 공격마다 피해 2배\", hook = \"attackCalc\", effect = \"penNib\", value = 10, icon = \"4d38d721cc064d14b31b9e9a92754139\" },\n\tboot = { name = \"브론즈 부츠\", desc = \"5 미만 공격 피해가 5로\", hook = \"attackCalc\", effect = \"boot\", value = 5, icon = \"d572b3aa4dac4162aa0d9e551b055dce\" },\n\takabeko = { name = \"황소 투구\", desc = \"전투 첫 공격 피해 +8\", hook = \"attackCalc\", effect = \"akabeko\", value = 8, icon = \"eb3330a6e2274eff958639f8792119d3\" },\n\tcentennialPuzzle = { name = \"백년의 부적\", desc = \"전투 첫 피격 시 드로우 3\", hook = \"onPlayerDamaged\", effect = \"firstLossDraw\", value = 3, icon = \"cfe5ed6556b944fc83ab58b774bb2b73\" },\n\tmeatOnBone = { name = \"고기 망치\", desc = \"승리 시 HP 50% 이하면 12 회복\", hook = \"combatEnd\", effect = \"healIfLow\", value = 12, icon = \"a93e8e87f184411c98c96b877d9f8b10\" },\n\tselfFormingClay = { name = \"점토 갑옷\", desc = \"피해를 받으면 다음 턴 방어 +3\", hook = \"onPlayerDamaged\", effect = \"clayBlock\", value = 3, icon = \"bb446793c5204d5db7d33563fe79f648\" },\n\tchampionBelt = { name = \"챔피언 벨트\", desc = \"취약 부여 시 약화 1 추가\", hook = \"cardDebuff\", effect = \"vulnAddsWeak\", value = 1, icon = \"7ca8c63026034113a561d6adf679fed2\" },\n}\nself.RelicPool = { \"energyCore\", \"vampire\", \"goldIdol\", \"potionBelt\", \"burningBlood\", \"vajra\", \"anchor\", \"bagOfPrep\", \"bloodVial\", \"bronzeScales\", \"strawberry\", \"penNib\", \"boot\", \"akabeko\", \"centennialPuzzle\", \"meatOnBone\", \"selfFormingClay\", \"championBelt\" }\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 }, { kind = \"Debuff\", value = 1, effect = \"weak\" } } },\n\tslime_boss = { name = \"슬라임 킹\", maxHp = 120, intents = { { kind = \"Attack\", value = 18 }, { kind = \"Defend\", value = 12 }, { kind = \"Debuff\", value = 2, effect = \"vuln\" }, { kind = \"Attack\", value = 10 }, { kind = \"Attack\", value = 22 } } },\n\torange_mushroom = { name = \"주황버섯\", maxHp = 16, intents = { { kind = \"Attack\", value = 5 }, { kind = \"Attack\", value = 5 }, { kind = \"Defend\", value = 4 }, { kind = \"Attack\", value = 8 } } },\n\tblue_mushroom = { name = \"파란버섯\", maxHp = 22, intents = { { kind = \"Attack\", value = 4 }, { kind = \"Attack\", value = 4 }, { kind = \"Attack\", value = 10 }, { kind = \"AddCard\", value = 0, card = \"Wound\", count = 1 } } },\n\tpig = { name = \"돼지\", maxHp = 18, intents = { { kind = \"Attack\", value = 6 }, { kind = \"Attack\", value = 6 }, { kind = \"Defend\", value = 5 } } },\n\tgreen_mushroom = { name = \"초록버섯\", maxHp = 20, intents = { { kind = \"Attack\", value = 7 }, { kind = \"Defend\", value = 3 }, { kind = \"Attack\", value = 9 } } },\n\tred_snail = { name = \"빨간 달팽이\", maxHp = 14, intents = { { kind = \"Attack\", value = 5 }, { kind = \"Defend\", value = 6 }, { kind = \"Attack\", value = 7 } } },\n\tstump = { name = \"나무토막\", maxHp = 19, intents = { { kind = \"Defend\", value = 5 }, { kind = \"Attack\", value = 8 }, { kind = \"Attack\", value = 6 } } },\n\tmushmom = { name = \"머쉬맘\", maxHp = 75, intents = { { kind = \"Defend\", value = 10 }, { kind = \"Debuff\", value = 2, effect = \"weak\" }, { kind = \"Attack\", value = 16 }, { kind = \"Attack\", value = 9 }, { kind = \"Defend\", value = 6 }, { kind = \"AddCard\", value = 0, card = \"Burn\", count = 1 } } },\n\tmodified_snail = { name = \"변형된 달팽이\", maxHp = 60, intents = { { kind = \"Attack\", value = 12 }, { kind = \"Defend\", value = 8 }, { kind = \"Attack\", value = 7 }, { kind = \"Attack\", value = 14 }, { kind = \"Debuff\", value = 1, effect = \"weak\" } } },\n\tking_slime = { name = \"킹 슬라임\", maxHp = 130, intents = { { kind = \"Attack\", value = 18 }, { kind = \"Defend\", value = 14 }, { kind = \"Debuff\", value = 2, effect = \"vuln\" }, { kind = \"Attack\", value = 12 }, { kind = \"Attack\", value = 24 } } },\n}\nself.CurrentNodeId = \"\"\nself.CurrentEnemyId = \"\"\nself.PlayerJob = \"\"\nself.Jobs = {\n\twarrior = {\n\t\t{ id = \"fighter\", name = \"파이터\", desc = \"공격 특화\\n콤보 어택 · 버서크\\n라이징 어택\", starter = \"ComboAttack\" },\n\t\t{ id = \"page\", name = \"페이지\", desc = \"속성 차지 특화\\n썬더/블리자드 차지\\n파워 가드\", starter = \"ThunderCharge\" },\n\t\t{ id = \"spearman\", name = \"스피어맨\", desc = \"방어·관통 특화\\n피어스 · 아이언 월\\n하이퍼 바디\", starter = \"Pierce\" },\n\t},\n\tmagician = {\n\t\t{ id = \"firepoison\", name = \"위자드(불·독)\", desc = \"화염·독 특화\\n파이어 애로우\\n포이즌 브레스 · 앰플\", starter = \"FireArrow\" },\n\t\t{ id = \"icelightning\", name = \"위자드(썬·콜)\", desc = \"광역·빙결 특화\\n썬더 볼트(전체)\\n콜드 빔 · 칠링 스텝\", starter = \"ThunderBolt\" },\n\t\t{ id = \"cleric\", name = \"클레릭\", desc = \"회복·축복 특화\\n힐 · 블레스\\n홀리 애로우\", starter = \"Heal\" },\n\t},\n\tthief = {\n\t\t{ id = \"assassin\", name = \"어쌔신\", desc = \"표창·치명타 특화\\n크리티컬 스로우\\n쉐도우 스타 · 클로\", starter = \"CriticalThrow\" },\n\t\t{ id = \"bandit\", name = \"시프\", desc = \"단검 연타 특화\\n새비지 블로우\\n스틸 · 메소 가드\", starter = \"SavageBlow\" },\n\t},\n}\nself.CardFrames = {\n\twarrior = { normal = \"4bb57ef88ef449fdaf958f6cf37fe44b\", unique = \"4f71c124c8bc4e13b5e9fad392995f68\", legend = \"6d741a60c60743cb98ee740a1e2dbfed\" },\n\tmagician = { normal = \"d788d09f6f50467ebc67f01dec45f9e2\", unique = \"f5def2e8022b4e59a17d3c16414034fe\", legend = \"cff71f2e472041ce80c6fbd296f42e2d\" },\n\tbandit = { normal = \"9487b06867bc46269ed1d855420f457f\", unique = \"b3081fb2fb1445fa90b12b01481a78ef\", legend = \"c357d2daf31a489d95b8fa47e50dd879\" },\n}\nself.ClassToFrame = {\n\twarrior = \"warrior\",\n\tfighter = \"warrior\",\n\tpage = \"warrior\",\n\tspearman = \"warrior\",\n\tmagician = \"magician\",\n\tfirepoison = \"magician\",\n\ticelightning = \"magician\",\n\tcleric = \"magician\",\n\tthief = \"bandit\",\n\tassassin = \"bandit\",\n\tbandit = \"bandit\",\n\tcurse = \"bandit\",\n}\nself:GenerateMap()\nself:BindButtons()\nself:AddRelic(\"ironHeart\")\nself:ApplySoulUnlocks()\nself:RenderPotions()\nself:TeleportToActMap()\nself:ShowMap()", "Scope": 2, "ExecSpace": 6, "Attributes": [], diff --git a/docs/superpowers/plans/2026-06-14-lobby-map-npc.md b/docs/superpowers/plans/2026-06-14-lobby-map-npc.md new file mode 100644 index 0000000..60267f1 --- /dev/null +++ b/docs/superpowers/plans/2026-06-14-lobby-map-npc.md @@ -0,0 +1,524 @@ +# P15 — 로비 맵 + 월드 NPC 구현 계획 + +> **For agentic workers:** REQUIRED SUB-SKILL: superpowers:executing-plans. 설계: `docs/superpowers/specs/2026-06-14-lobby-map-npc-design.md`. 산출물(`map/*.map`,`ui/DefaultGroup.ui`,`*.codeblock`,`Global/*`)은 Read/Edit 금지 — 생성기 소스(`tools/`)만 수정 후 재생성. 검증은 `grep -c`(카운트)와 메이커 플레이테스트. + +**Goal:** UI 패널 로비를 폐기하고, 전용 물리 맵 `lobby`에 공식 메이플 NPC 4종을 월드 엔티티로 배치해 근접(↑키)·클릭으로 기능을 열며, 이동·공격 모션은 로비 맵에서만 풀린다. + +**Architecture:** 단일 소스(`tools/*` 생성기 + `data/*.json`) → 산출물 재생성. 신규 생성기 2개(`gen-lobby-map.mjs`=맵+NPC 엔티티, `gen-lobby-npc.mjs`=LobbyNpc+LobbyMobility codeblock) + `gen-slaydeck.mjs`(흐름·UI) + `gen-player-lock.mjs`(전투맵 이동 재잠금 보강) 수정. 기존 기능 패널(CharacterSelect/Codex/SoulShop/Board)·전투 흐름 재사용. + +**Tech Stack:** Node.js ESM 생성기, MSW Lua(codeblock), MSW MCP(플레이테스트·asset). + +**확정 사실(조사):** +- gen-slaydeck 편집 지점: OnBeginPlay `2830-2840`, ShowLobby `2986-2993`, LobbyHud npcs배열 `2469-2474`+버튼루프 `2475-2524`, lobTexts `2433-2439`, Asc버튼 `2454-2468`, BindLobbyButtons `2997-3014`, ShowState `2906-2922`, StartRun `3199-3232`, EndRun `4391-4403`, TeleportToActMap `4373-4385`, PlayerAttackMotion `4491-4500`, guid prefix `244-245`, ACT_MAPS `2745`. +- **1막 텔레포트 공백**: StartRun(`3199-3232`)에 map01 텔레포트가 없음 → `self:TeleportToActMap()` 추가 필요(`RenderPotions` 다음, `ShowMap` 직전). `TeleportToActMap`은 `maps[self.Floor]` 사용 + 가드 `if lp.CurrentMapName==target then return`(멱등). +- **NPC 공식 RUID**(maplestory, 흰박스 위험 없음): 모험가 `122095fd155c4633867b0da4f375bc3c`, 사서 `4c264be6a64f4ac3970b2e6818d04e40`, 상인 `69987ccdc486423f8bedd786bd6cb5d9`, 안내원 `8a99bd87d667482cb1f3b2193f8a19c1`. +- **MSW API**: 월드 클릭 = 엔티티에 `TouchReceiveComponent` + `self.Entity:ConnectEvent(TouchEvent, fn)`. 키 = `_InputService:ConnectEvent(KeyDownEvent, fn)` + `KeyboardKey.UpArrow`(273)/`Space`(32)/`LeftControl`. 거리 = `Vector2.Distance(Vector2(a.x,a.y),Vector2(b.x,b.y))`. 이동복원 = `pc.Enable=true; pc.FixedLookAt=false; mv.InputSpeed=; mv.JumpForce=`(client 공간). 표시토글 = `entity:SetVisible(bool)`. +- **맵 생성 패턴**(gen-maps.mjs): `JSON.parse(readFileSync('map/map01.map'))` → deep clone → 경로 `/maps/map01`→`/maps/lobby` 치환 → GUID 재발급(+origin fixup) → `compOf(e,'MOD.Core.X')`로 컴포넌트 접근 → `writeFileSync('map/lobby.map', JSON.stringify(map,null,2))`. 배경=`/Background`의 `BackgroundComponent.TemplateRUID`, 타일=`/TileMap`의 `TileMapComponent.TileSetRUID={DataId}`. 컴포넌트 부착=`@components` push + `componentNames` CSV 둘 다. SectorConfig=`Sectors[0].entries`에 `map://lobby` push. +- **codeblock 패턴**(gen-combat-monster.mjs): `prop()/method()` 팩토리 + 봉투(`CoreVersion:'26.5.0.0'`, `EntryKey:'codeblock://x'`) → `writeFileSync('RootDesk/MyDesk/X.codeblock', JSON.stringify(cb,null,2))`. 컨트롤러 호출=`_EntityService:GetEntityByPath("/common").SlayDeckController:Method(...)`. 폴 idiom=`_TimerService:SetTimerRepeat(fn,0.1)`+try카운트 가드+`:ClearTimer(id)`. + +--- + +### Task 0: 메이커 사전 정찰 (이동값·키·바디 컴포넌트·스폰좌표 확정) + +**목적:** LobbyMobility의 이동 복원 수치·공격 키·바디 컴포넌트 종류·로비 스폰 좌표를 추측이 아니라 실측으로 확정. 산출물 작성 전 선행. + +- [ ] **Step 1:** 메이커가 켜져 있는지 확인하고 현재 빌드 플레이. `mcp__msw-maker-mcp__maker_play` → `maker_screenshot`로 현재 화면(UI 로비) 확인. + +- [ ] **Step 2:** execute_script로 LocalPlayer 컴포넌트·이동값·바디 종류 덤프: + +```lua +local lp = _UserService.LocalPlayer +local s = "pc="..tostring(lp.PlayerControllerComponent ~= nil) +local mv = lp.MovementComponent +if mv ~= nil then s = s.." InputSpeed="..tostring(mv.InputSpeed).." JumpForce="..tostring(mv.JumpForce) end +s = s.." Rigidbody="..tostring(lp.RigidbodyComponent ~= nil) +s = s.." Sideviewbody="..tostring(lp.SideviewbodyComponent ~= nil) +local p = lp.TransformComponent.WorldPosition +s = s.." pos=("..tostring(p.x)..","..tostring(p.y)..","..tostring(p.z)..")" +s = s.." map="..tostring(lp.CurrentMapName) +log(s) +return s +``` + +Run via `maker_execute_script`. 기대: 현재 InputSpeed/JumpForce(0일 것), 어떤 바디 컴포넌트가 존재하는지(Rigidbody vs Sideviewbody), 현재 맵 이름·좌표. + +- [ ] **Step 3:** 이동 복원값 실측 — execute_script로 직접 켜 보고 걸어지는지 확인: + +```lua +local lp = _UserService.LocalPlayer +lp.PlayerControllerComponent.Enable = true +lp.PlayerControllerComponent.FixedLookAt = false +lp.MovementComponent.InputSpeed = 5 +lp.MovementComponent.JumpForce = 5 +return "applied: try walking with arrow keys" +``` + +`maker_keyboard_input`로 방향키를 눌러 실제 이동 여부 확인(screenshot 비교). 걸으면 InputSpeed 값 후보 = 5. 안 걸으면 RigidbodyComponent.WalkSpeed/WalkJump 등도 set해보고(아래) 동작하는 최소 set을 기록. + +```lua +local rb = _UserService.LocalPlayer.RigidbodyComponent +if rb ~= nil then rb.Enable = true end +``` + +- [ ] **Step 4:** 공격 키 enum 확정 — `mlua_api_retriever`(이미 검증됨: UpArrow=273, Space=32)에서 공격용 키 `LeftControl`의 정확한 enum 멤버명 확인(예: `KeyboardKey.LeftControl`). 확인 안 되면 공격 키를 `KeyboardKey.Space`로 폴백(이동 점프는 MSW 기본 Alt 가정). + +- [ ] **Step 5:** 결정 기록 — 이 plan 파일 하단 "정찰 결과" 섹션에 확정값 적기: + - `WALK_SPEED` = (Step3에서 걸어진 InputSpeed), `JUMP_FORCE` = (걸어진 JumpForce), `BODY_KIND` = Rigidbody|Sideviewbody|none, 추가 바디 set 필요 여부, `ATTACK_KEY` = LeftControl|Space, `LOBBY_SPAWN` = 적당한 지면 좌표(현재 map 좌표 참고, 예 `Vector3(0, 0.03, 0)`). + - 이후 Task에서 이 값을 JS 상수로 사용. + +- [ ] **Step 6:** `maker_stop`으로 플레이 종료(상태 churn 방지). + +--- + +### Task 1: `gen-lobby-map.mjs` — 로비 맵 + NPC 엔티티 생성 + +**Files:** +- Create: `tools/map/gen-lobby-map.mjs` +- Output(산출물, 직접 편집 금지): `map/lobby.map`, `Global/SectorConfig.config`(갱신) + +NPC 4종 + `!` 마크 4종을 월드 엔티티로 배치. 마크는 자식이 아니라 **형제 엔티티**(NPC 위 고정 위치, 정적이라 무방). 각 NPC에 `TouchReceiveComponent` + `script.LobbyNpc`(NpcId), 맵 루트에 `script.LobbyMobility` 부착. + +- [ ] **Step 1:** `tools/map/gen-maps.mjs`를 참고 헤더로 새 파일 생성. 상수: + +```js +import { readFileSync, writeFileSync } from 'node:fs'; + +const TEMPLATE = 'map/map01.map'; +const OUT = 'map/lobby.map'; +const SECTOR = 'Global/SectorConfig.config'; +const TOWN_BG = ''; // Task1 Step2에서 확정 +const NPCS = [ + { name: 'NpcRun', id: 'run', x: -4.5, ruid: '122095fd155c4633867b0da4f375bc3c' }, + { name: 'NpcCodex', id: 'codex', x: -1.5, ruid: '4c264be6a64f4ac3970b2e6818d04e40' }, + { name: 'NpcShop', id: 'shop', x: 1.5, ruid: '69987ccdc486423f8bedd786bd6cb5d9' }, + { name: 'NpcBoard', id: 'board', x: 4.5, ruid: '8a99bd87d667482cb1f3b2193f8a19c1' }, +]; +const MARK_RUID = ''; +const NPC_Y = 0.0; // 지면 (Task0 좌표 참고로 조정) +const MARK_DY = 1.6; // NPC 머리 위 오프셋 + +function compOf(e, type) { return e.jsonString['@components'].find((c) => c['@type'] === type); } +function lobbyGuid(idx) { + const n = (900000 + idx) >>> 0; // 기존 생성기와 충돌 없는 고유 오프셋 + return `${n.toString(16).padStart(8,'0')}-0000-4000-8000-${n.toString(16).padStart(12,'0')}`; +} +``` + +- [ ] **Step 2:** TOWN_BG·MARK_RUID 확정 — `gen-maps.mjs`를 열어 `BACKGROUNDS` 배열에서 타운 느낌 RUID 하나 골라 `TOWN_BG`에 박는다. MARK_RUID는 메이커 MCP `asset_search_resources`(source=maplestory, query "느낌표"/"balloon"/"emotion")로 1개 확정(못 찾으면 `!` 대신 작은 화살표/별 공식 스프라이트, 최후엔 NPC RUID 재사용+tint). + +- [ ] **Step 3:** 맵 로드·클론·정리(몬스터 제거)·배경: + +```js +const map = JSON.parse(JSON.stringify(JSON.parse(readFileSync(TEMPLATE, 'utf8')))); +map.EntryKey = 'map://lobby'; +let ents = map.ContentProto.Entities; +const isMonster = (e) => typeof e.componentNames === 'string' && (e.componentNames.includes('script.Monster') || e.componentNames.includes('script.CombatMonster')); +// 경로/이름 치환 +for (const e of ents) { + if (typeof e.path === 'string') e.path = e.path.replace('/maps/map01', '/maps/lobby'); + if (e.jsonString) { + if (typeof e.jsonString.path === 'string') e.jsonString.path = e.jsonString.path.replace('/maps/map01', '/maps/lobby'); + if (e.jsonString.name === 'map01') e.jsonString.name = 'lobby'; + } + if ((e.path || '').endsWith('/Background')) { const bg = compOf(e, 'MOD.Core.BackgroundComponent'); if (bg) bg.TemplateRUID = TOWN_BG; } +} +// 몬스터 엔티티 제거 + PlayerLock/MapCamera는 유지(로비엔 PlayerLock 불필요하니 루트에서 제거) +ents = ents.filter((e) => !isMonster(e)); +const root = ents.find((e) => e.path === '/maps/lobby'); +if (!root) throw new Error('[gen-lobby-map] 맵 루트 없음'); +// 로비엔 PlayerLock 컴포넌트가 있으면 제거(이동 잠금 방지) +root.jsonString['@components'] = root.jsonString['@components'].filter((c) => c['@type'] !== 'script.PlayerLock'); +{ const names = (root.componentNames || '').split(',').filter((s) => s && s !== 'script.PlayerLock'); root.componentNames = names.join(','); } +``` + +- [ ] **Step 4:** NPC 엔티티 + 마크 엔티티 생성(몬스터 템플릿을 클론해 몬스터 컴포넌트 제거 후 재사용). 몬스터 템플릿은 클론 전에 원본 ents(`map.ContentProto.Entities`)에서 확보: + +```js +const orig = JSON.parse(readFileSync(TEMPLATE, 'utf8')).ContentProto.Entities; +const tmpl = orig.find((e) => typeof e.componentNames === 'string' && e.componentNames.includes('script.Monster')); +if (!tmpl) throw new Error('[gen-lobby-map] 몬스터 템플릿(스프라이트 엔티티) 없음'); +let gi = 1; +function makeSpriteEntity(name, x, y, ruid, extraComps, extraNames, visible) { + const m = JSON.parse(JSON.stringify(tmpl)); + m.id = lobbyGuid(gi++); + m.path = `/maps/lobby/${name}`; + m.jsonString.path = m.path; + m.jsonString.name = name; + const o = m.jsonString.origin; if (o) { if (o.root_entity_id) o.root_entity_id = m.id; if (o.sub_entity_id) o.sub_entity_id = m.id; } + const tr = compOf(m, 'MOD.Core.TransformComponent'); if (tr) { tr.Position.x = x; tr.Position.y = y; } + const sp = compOf(m, 'MOD.Core.SpriteRendererComponent'); if (sp) sp.SpriteRUID = ruid; + // 몬스터/전투 컴포넌트 전부 제거 + m.jsonString['@components'] = m.jsonString['@components'].filter((c) => !['script.Monster','script.CombatMonster'].includes(c['@type'])); + let names = (m.componentNames || '').split(',').filter((s) => s && !['script.Monster','script.CombatMonster'].includes(s)); + // StateAnimationComponent가 있으면 die/hit 시트 제거(정적 stand) + for (const [comp, props] of extraComps) { m.jsonString['@components'].push({ '@type': comp, Enable: true, ...props }); names.push(comp); } + names = names.concat(extraNames).filter(Boolean); + m.componentNames = names.join(','); + // 마크 숨김은 Enable=false 금지(SetVisible가 안 먹음). codeblock OnBeginPlay가 SetVisible(false)로 숨기므로 + // 여기선 별도 처리 안 함. (한 프레임 깜빡임 우려 시 SpriteRendererComponent.Visible=false 시도 — 필드 확인 후.) + void visible; + return m; +} +const added = []; +for (const npc of NPCS) { + // NPC: TouchReceiveComponent(자동맞춤) + script.LobbyNpc(NpcId) + added.push(makeSpriteEntity(npc.name, npc.x, NPC_Y, npc.ruid, + [['MOD.Core.TouchReceiveComponent', { AutoFitToSize: true }], ['script.LobbyNpc', { NpcId: npc.id, Tries: 0, InRange: false, MarkName: npc.name + 'Mark' }]], + ['MOD.Core.TouchReceiveComponent', 'script.LobbyNpc'], true)); + // 마크: NPC 위, 기본 숨김 + added.push(makeSpriteEntity(npc.name + 'Mark', npc.x, NPC_Y + MARK_DY, MARK_RUID, [], [], false)); +} +ents = ents.concat(added); +``` + +> 주: `script.LobbyNpc` props(NpcId/MarkName 등)는 Task2의 codeblock 속성 정의와 **이름이 정확히 일치**해야 한다. + +- [ ] **Step 5:** 맵 루트에 `script.LobbyMobility` 부착 + 쓰기 + SectorConfig 등록: + +```js +root.jsonString['@components'] = root.jsonString['@components'].filter((c) => c['@type'] !== 'script.LobbyMobility'); +root.jsonString['@components'].push({ '@type': 'script.LobbyMobility', Enable: true, Tries: 0 }); +{ const names = (root.componentNames || '').split(',').filter((s) => s && s !== 'script.LobbyMobility'); names.push('script.LobbyMobility'); root.componentNames = names.join(','); } +map.ContentProto.Entities = ents; +writeFileSync(OUT, JSON.stringify(map, null, 2), 'utf8'); +// SectorConfig: map://lobby 등록(멱등) + 시작 섹터를 lobby로 +const sector = JSON.parse(readFileSync(SECTOR, 'utf8')); +const sec0 = sector.ContentProto.Json.Sectors[0]; +if (!sec0.entries.includes('map://lobby')) sec0.entries.push('map://lobby'); +writeFileSync(SECTOR, JSON.stringify(sector, null, 2), 'utf8'); +console.log('[gen-lobby-map] lobby.map 생성 + SectorConfig 등록 완료'); +``` + +- [ ] **Step 6:** 실행 + 카운트 검증(내용 출력 금지): + +```bash +node tools/map/gen-lobby-map.mjs +grep -c "script.LobbyNpc" map/lobby.map # 4 기대 +grep -c "script.LobbyMobility" map/lobby.map # 1 기대 +grep -c "TouchReceiveComponent" map/lobby.map # 4(+ 템플릿 잔존 가능) 기대 +grep -lc "map://lobby" Global/SectorConfig.config +node tools/verify/count.mjs 2>/dev/null || true +``` + +기대: LobbyNpc=4, LobbyMobility=1. 어긋나면 생성기 수정. + +- [ ] **Step 7:** 커밋: + +```bash +git add tools/map/gen-lobby-map.mjs map/lobby.map Global/SectorConfig.config +git commit -m "feat(lobby): 로비 전용 맵 + NPC 4종 월드 엔티티 생성기 (P15)" +``` + +--- + +### Task 2: `gen-lobby-npc.mjs` — LobbyNpc + LobbyMobility codeblock + +**Files:** +- Create: `tools/player/gen-lobby-npc.mjs` +- Output(산출물): `RootDesk/MyDesk/LobbyNpc.codeblock`, `RootDesk/MyDesk/LobbyMobility.codeblock` + +`gen-combat-monster.mjs`의 `prop()/method()`/봉투 패턴을 그대로 복사. **Lua 문자열은 실제 탭 들여쓰기 사용**(RULES.md 메모리: 실탭↔`\t` 혼재 금지 — 템플릿 리터럴 안 실제 탭). + +- [ ] **Step 1:** 헤더·팩토리(gen-combat-monster.mjs:9-17 복사) + 봉투 함수: + +```js +import { writeFileSync } from 'node:fs'; +const WALK_SPEED = /* Task0 정찰값 */ 5; +const JUMP_FORCE = /* Task0 정찰값 */ 5; +const ATTACK_KEY = /* Task0: 'LeftControl' 또는 'Space' */ 'LeftControl'; + +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(id, name, properties, methods) { + const cb = { Id: '', GameId: '', EntryKey: `codeblock://${id.toLowerCase()}`, 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: name, Language: 1, Name: name, Type: 1, Source: 0, Target: null, Properties: properties, Methods: methods, EntityEventHandlers: [] } } }; + writeFileSync(`RootDesk/MyDesk/${name}.codeblock`, JSON.stringify(cb, null, 2), 'utf8'); +} +``` + +- [ ] **Step 2:** LobbyNpc codeblock — 근접 폴링 + 마크 토글 + Touch/Key → Interact. (아래 Lua의 들여쓰기는 실제 탭으로 입력) + +```js +const npcInteract = method('Interact', `local c = _EntityService:GetEntityByPath("/common") +if c ~= nil and c.SlayDeckController ~= nil then + c.SlayDeckController:OnLobbyNpcInteract(self.NpcId) +end`); + +const npcBegin = method('OnBeginPlay', `self.Tries = 0 +self.InRange = false +local mark = _EntityService:GetEntityByPath("/maps/lobby/" .. self.MarkName) +if mark ~= nil then mark:SetVisible(false) end +self.Entity:ConnectEvent(TouchEvent, function(e) self:Interact() end) +_InputService:ConnectEvent(KeyDownEvent, function(e) + if self.InRange and e.key == KeyboardKey.UpArrow then self:Interact() end +end) +local eventId = 0 +local function tick() + local lp = _UserService.LocalPlayer + if lp == nil then return end + local a = lp.TransformComponent.WorldPosition + local b = self.Entity.TransformComponent.WorldPosition + local d = Vector2.Distance(Vector2(a.x, a.y), Vector2(b.x, b.y)) + local near = d < 1.8 + if near ~= self.InRange then + self.InRange = near + if mark ~= nil then mark:SetVisible(near) end + end +end +eventId = _TimerService:SetTimerRepeat(tick, 0.15)`); + +writeCodeblock('LobbyNpc', 'LobbyNpc', [ + prop('string', 'NpcId', '""'), + prop('string', 'MarkName', '""'), + prop('boolean', 'InRange', 'false'), + prop('number', 'Tries', '0'), +], [npcBegin, npcInteract]); +``` + +- [ ] **Step 3:** LobbyMobility codeblock — 이동 복원 + 공격 키. (들여쓰기 실제 탭) + +```js +const mobBegin = method('OnBeginPlay', `self.Tries = 0 +local eventId = 0 +local function apply() + self.Tries = self.Tries + 1 + local lp = _UserService.LocalPlayer + if lp ~= nil and lp.PlayerControllerComponent ~= nil then + local pc = lp.PlayerControllerComponent + pc.Enable = true + pc.FixedLookAt = false + local mv = lp.MovementComponent + if mv ~= nil then + mv.InputSpeed = ${WALK_SPEED} + mv.JumpForce = ${JUMP_FORCE} + end + local rb = lp.RigidbodyComponent + if rb ~= nil then rb.Enable = true end + _TimerService:ClearTimer(eventId) + elseif self.Tries > 50 then + _TimerService:ClearTimer(eventId) + end +end +eventId = _TimerService:SetTimerRepeat(apply, 0.1) +_InputService:ConnectEvent(KeyDownEvent, function(e) + if e.key == KeyboardKey.${ATTACK_KEY} then + local c = _EntityService:GetEntityByPath("/common") + if c ~= nil and c.SlayDeckController ~= nil then + c.SlayDeckController:PlayerAttackMotion() + end + end +end)`); + +writeCodeblock('LobbyMobility', 'LobbyMobility', [prop('number', 'Tries', '0')], [mobBegin]); +console.log('[gen-lobby-npc] LobbyNpc/LobbyMobility codeblock 생성 완료'); +``` + +- [ ] **Step 4:** 실행 + 카운트 검증: + +```bash +node tools/player/gen-lobby-npc.mjs +grep -c "OnLobbyNpcInteract" RootDesk/MyDesk/LobbyNpc.codeblock # >=1 +grep -c "PlayerAttackMotion" RootDesk/MyDesk/LobbyMobility.codeblock # >=1 +ls -la RootDesk/MyDesk/LobbyNpc.codeblock RootDesk/MyDesk/LobbyMobility.codeblock +``` + +- [ ] **Step 5:** 커밋: + +```bash +git add tools/player/gen-lobby-npc.mjs RootDesk/MyDesk/LobbyNpc.codeblock RootDesk/MyDesk/LobbyMobility.codeblock +git commit -m "feat(lobby): LobbyNpc(근접·클릭 상호작용)·LobbyMobility(이동·공격 해제) codeblock (P15)" +``` + +--- + +### Task 3: `gen-player-lock.mjs` — 전투맵 이동 재잠금 보강 (방어) + +**Files:** Modify `tools/player/gen-player-lock.mjs` + +로비에서 푼 이동이 텔레포트 후 전투맵에 누설돼도, 전투맵 PlayerLock이 런타임으로 MovementComponent를 0으로 재설정해 확실히 잠그도록 보강. + +- [ ] **Step 1:** `gen-player-lock.mjs`의 PlayerLock Lua에서 `pc.Enable = false` 직후 라인을 추가(생성기 내 해당 Lua 템플릿 리터럴, 실제 탭 들여쓰기): + +```lua +pc.Enable = false +local mv = lp.MovementComponent +if mv ~= nil then mv.InputSpeed = 0; mv.JumpForce = 0 end +``` + +(정확한 삽입 지점은 `gen-player-lock.mjs`에서 `pc.Enable`가 들어간 Lua 문자열. `LocalPlayer.PlayerControllerComponent`를 `lp`로 잡는 변수명이 기존 코드와 일치하는지 확인 — 다르면 기존 변수명 사용.) + +- [ ] **Step 2:** 재생성 + 카운트: + +```bash +node tools/player/gen-player-lock.mjs +grep -c "InputSpeed = 0" RootDesk/MyDesk/PlayerLock.codeblock # >=1 기대(파일명은 생성기 출력명 확인) +``` + +- [ ] **Step 3:** 커밋: + +```bash +git add tools/player/gen-player-lock.mjs RootDesk/MyDesk/PlayerLock.codeblock map/map0*.map +git commit -m "fix(lobby): 전투맵 PlayerLock에 이동값 런타임 0 재설정 보강 (P15)" +``` + +--- + +### Task 4: `gen-slaydeck.mjs` — 흐름·UI 통합 + +**Files:** Modify `tools/deck/gen-slaydeck.mjs` + +- [ ] **Step 1:** guid prefix 등록(`244-245`) — 신규 prefix 불필요(LobbyHud 슬림화만, 기존 `lob` 재사용). 확인만. + +- [ ] **Step 2:** ACT_MAPS 아래(`2745`)에 로비 상수 추가: + +```js +const ACT_MAPS = ['map01', 'map02', 'map03', 'map04', 'map05']; +const LOBBY_MAP = 'lobby'; +const LOBBY_SPAWN = 'Vector3(0, 0.03, 0)'; // Task0 정찰 좌표로 조정 +``` + +- [ ] **Step 3:** LobbyHud 슬림화 — `npcs` 배열(`2469-2474`)과 버튼 생성 루프(`2475-2524`) **삭제**. `lobTexts`(`2433-2439`)는 SoulLabel/AscLabel + 안내문(Hint)만 남기고 Title/Subtitle은 "마을" 정도로 축소 or 제거. AscMinus/AscPlus(`2454-2468`)는 유지. → LobbyHud가 상단 정보바(영혼/승천)만 남음. + +- [ ] **Step 4:** BindLobbyButtons(`2997-3014`) — NPC 4개 `bindClick` 라인 **삭제**(NpcRun/NpcCodex/NpcShop/NpcBoard). AscMinus/AscPlus/BoardHud.Close/SoulShopHud.Close bindClick은 유지. + +- [ ] **Step 5:** ShowLobby(`2986-2993`) — 끝에 로비 맵 텔레포트 추가: + +```js +method('ShowLobby', `self.SelectedClass = "" +self:RenderAscension() +self:RenderSoulLabel() +self:ShowState("lobby") +self:SetEntityEnabled("/ui/DefaultGroup/BoardHud", false) +self:SetEntityEnabled("/ui/DefaultGroup/SoulShopHud", false) +self:BindLobbyButtons() +self:BindMenuButtons() +self:GoLobbyMap()`), +``` + +- [ ] **Step 6:** 신규 method `GoLobbyMap`(ShowLobby 근처에 추가, ExecSpace 기본): + +```js +method('GoLobbyMap', `self.LobbyTpTries = 0 +local eventId = 0 +local function go() + self.LobbyTpTries = self.LobbyTpTries + 1 + local lp = _UserService.LocalPlayer + if lp ~= nil then + if lp.CurrentMapName ~= "${LOBBY_MAP}" then + _TeleportService:TeleportToMapPosition(lp, ${LOBBY_SPAWN}, "${LOBBY_MAP}") + end + _TimerService:ClearTimer(eventId) + elseif self.LobbyTpTries > 50 then + _TimerService:ClearTimer(eventId) + end +end +eventId = _TimerService:SetTimerRepeat(go, 0.1)`), +``` + +- [ ] **Step 7:** 신규 method `OnLobbyNpcInteract`(인자 id) — NPC codeblock이 호출: + +```js +method('OnLobbyNpcInteract', `if self.RunActive == true then return end +if id == "run" then + self:ShowCharacterSelect() +elseif id == "codex" then + self:ShowCodex() +elseif id == "shop" then + self:ShowSoulShop() +elseif id == "board" then + self:ShowBoard() +end`, [{ Type: 'string', DefaultValue: '""', SyncDirection: 0, Attributes: [], Name: 'id' }]), +``` + +(인자 객체 형태는 기존 `EndRun`의 `text` 인자/`ShowState`의 `state` 인자 정의를 참고해 동일 구조로.) + +- [ ] **Step 8:** StartRun(`3199-3232`) — `RenderPotions()` 다음, `ShowMap()` 직전에 1막 텔레포트 추가: + +```js +// ... self:RenderPotions() (기존) 다음 줄에 +self:TeleportToActMap() +// ... self:ShowMap() (기존) +``` + +(StartRun의 Lua 문자열 내부에 `self:TeleportToActMap()` 한 줄 삽입. Floor=1이 이미 세팅돼 map01 타깃.) + +- [ ] **Step 9:** EndRun(`4391-4403`) 복귀 — 기존 타이머 `self:ShowLobby()`가 GoLobbyMap을 호출하므로 **별도 변경 불필요**(ShowLobby가 로비 맵 텔레포트 포함). 확인만. + +- [ ] **Step 10:** 재생성 + 카운트 검증: + +```bash +node tools/deck/gen-slaydeck.mjs +grep -c "OnLobbyNpcInteract" RootDesk/MyDesk/SlayDeckController.codeblock # >=1 (이 파일엔 정의만; 호출은 LobbyNpc.codeblock) +grep -c "GoLobbyMap" RootDesk/MyDesk/SlayDeckController.codeblock # >=2 (정의+ShowLobby 호출) +grep -c "TeleportToActMap" RootDesk/MyDesk/SlayDeckController.codeblock # >=3 (정의+ContinueAfterBoss+StartRun) +grep -c "NpcRun" ui/DefaultGroup.ui # 0 기대(버튼-행 제거됨) +``` + +- [ ] **Step 11:** 커밋: + +```bash +git add tools/deck/gen-slaydeck.mjs ui/DefaultGroup.ui RootDesk/MyDesk/SlayDeckController.codeblock Global/common.gamelogic map/lobby.map map/map0*.map +git commit -m "feat(lobby): 로비 맵 흐름 통합 — OnBeginPlay/EndRun 텔레포트·NPC 상호작용 디스패치·StartRun map01 텔레포트·LobbyHud 슬림화 (P15)" +``` + +--- + +### Task 5: 미러/회귀 테스트 + +전투 규칙·맵 그래프 알고리즘 미변경 → 미러 동기화 불필요. 기존 테스트 회귀만 확인. + +- [ ] **Step 1:** 기존 테스트 실행: + +```bash +node --test tools/balance/sim-balance.test.mjs +node --test tools/map/rogue-map.test.mjs +``` + +기대: 전부 PASS(이번 변경은 전투/맵그래프 무관이라 회귀 없어야 함). + +- [ ] **Step 2:** `git status --short`로 의도치 않은 산출물 변경 없는지 확인(산출물 diff는 보지 않음). + +--- + +### Task 6: 메이커 플레이테스트 검증 + +- [ ] **Step 1:** git 상태 정리 후 메이커에서 **로컬 워크스페이스 refresh**(RULES.md §5 — 안 하면 stale 상태가 디스크 덮어씀). `maker_refresh_workspace` → 빌드 콘솔 0 에러 확인(`maker_logs`). + +- [ ] **Step 2:** `maker_play` → `maker_screenshot`. 검증 시나리오(스크린샷·로그로): + 1. 월드 시작 → **로비 맵에 스폰**(타운 배경, NPC 4명 보임), 방향키로 **이동됨**, 공격 키로 **공격 모션** 나옴. + 2. NPC 근접 → 머리 위 `!` 표시 → `↑`키로 기능 패널 오픈. NPC `maker_mouse_input` 클릭으로도 오픈(버튼 클릭 불가 메모리 주의 — 월드 엔티티 TouchEvent라 mouse_input 좌표 클릭 시도, 안 되면 ↑키 경로로 검증). + 3. 모험가→직업선택→런 시작 → **map01로 텔레포트**, 이동/공격 **잠김**. 1막 전투 몬스터 정상 등장(CurrentMapName 필터 통과). + 4. 사서→도감, 상인→영혼상점, 안내원→게시판 각각 오픈/닫기. + 5. 런 종료(빠른 패배 유도: execute_script로 `c.Combat.PlayerHp=0` 등 or 정상 진행) → 4초 후 **로비 맵 복귀**, 이동/공격 재해제. + 6. 상단 미니 HUD에 영혼/승천 표시 정상. + +- [ ] **Step 2b:** 실패 시 디버깅 — 이동 안 됨→Task0 값 재확認/RigidbodyComponent 추가 set, 클릭 안 됨→TouchReceiveComponent 필드/근접↑키 폴백, 몬스터 안 나옴→StartRun 텔레포트·spawn 좌표 확인. 생성기 수정→재생성→refresh→재플레이. + +- [ ] **Step 3:** `maker_stop`. 스크린샷을 사용자에게 공유. + +--- + +### Task 7: PR + +- [ ] **Step 1:** push: + +```bash +git push -u origin feature/p15-lobby-map-npc +``` + +- [ ] **Step 2:** PR spec JSON(UTF-8) 작성 후 `node tools/git/gitea-pr.mjs create ` (RULES.md §4 — 인라인 curl 한글 금지). 제목 예: "feat: P15 — 로비 맵 + 월드 NPC(근접·클릭) + 로비 전용 이동·공격". 본문에 변경 요약·검증 결과·스크린샷 언급. + +- [ ] **Step 3:** 사용자에게 PR 번호 보고 + 머지 여부 확인. + +--- + +## 정찰 결과 (Task0 실측 완료) +- **이동 레버 = `RigidbodyComponent.WalkAcceleration` (freeze가 0으로 만든 값). 복원값 0.7로 이동·점프 정상 확인** (InputSpeed/JumpForce는 무관 — WalkSpeed=1.4·WalkJump=1.23는 freeze가 안 건드림). + - 이동 해제 = `pc.Enable=true; pc.FixedLookAt=false; rb.WalkAcceleration=0.7` (rb.Enable는 이미 true). +- BODY_KIND = Rigidbody가 구동(Sideviewbody도 존재하나 WalkSpeed=nil). 추가 바디 set 불필요. +- ATTACK_KEY = `LeftControl` (KeyboardKey.LeftControl 유효, PlayerAttackMotion() 호출 정상). +- 상호작용 키 = `UpArrow` 유효. 클릭 = TouchReceiveComponent+TouchEvent. +- 현재 플레이어 위치 map01 (-5,-0.039,0) → LOBBY_SPAWN = `Vector3(-5, 0.03, 0)`. NPC x = -3 / -0.5 / 2 / 4.5, 근접 임계 1.2. +- TOWN_BG = Task1에서 gen-maps BACKGROUNDS 풀에서 선택, MARK_RUID = Task1 asset 검색. diff --git a/docs/superpowers/specs/2026-06-14-lobby-map-npc-design.md b/docs/superpowers/specs/2026-06-14-lobby-map-npc-design.md new file mode 100644 index 0000000..3cfa71a --- /dev/null +++ b/docs/superpowers/specs/2026-06-14-lobby-map-npc-design.md @@ -0,0 +1,104 @@ +# 로비 맵 + 월드 NPC 설계 (P15) + +작성일: 2026-06-14 +브랜치: `feature/p15-lobby-map-npc` + +## 목표 + +기존 **UI 패널 로비**(P14-8 `LobbyHud` — 색칠된 `UIButton` 4개 행)를 폐기하고, +**전용 로비 맵**에 **월드 NPC 엔티티 4종**을 배치한다. NPC를 누르면 각 기능이 실행되며, +플레이어 **이동·공격 모션은 로비 맵에서만** 풀린다(전투/런 맵에서는 기존대로 잠김 유지). + +요청 원문: "로비를 UI로 만들지 말고, map을 추가해서 로비에 각각 기능을 할 수 있는 npc를 추가하고, +그 npc를 누르면 각 기능을 할 수 있도록 추가. 플레이어는 반드시 로비맵에서만 이동과 공격 모션을 풀어줘." + +## 확정된 결정 (브레인스토밍) + +| 항목 | 결정 | +|---|---| +| NPC 상호작용 | **근접 프롬프트+키(Up/Space) AND 직접 클릭** 둘 다 지원 | +| NPC 기능 | **기존 4종 유지** + 외형을 **정식 maplestory NPC 스프라이트(공식 RUID)** 로 교체 | +| 로비 맵 | **새 전용 로비 맵 추가**(`map/lobby.map`), 런 맵(map01~) 인덱스 불변 | + +## 현재 상태 (조사 결과) + +- **로비 = UI 패널** `LobbyHud`. NPC 4종은 색칠 `UIButton`, 전부 `tools/deck/gen-slaydeck.mjs`에 하드코딩. + - `NpcRun`(모험가→런 시작), `NpcCodex`(사서→카드 도감), `NpcShop`(상인→영혼 상점), `NpcBoard`(안내원→게시판). + - 정의 ~`gen-slaydeck.mjs:2469-2487`, 클릭 바인딩 `BindLobbyButtons()` ~`2997-3014`. + - 기능 진입 메서드: `ShowCharacterSelect()`(~3147), `ShowCodex()`, `ShowSoulShop()`, `ShowBoard()` — **재사용 대상**. +- **이동/공격 이중 잠금**: + - `tools/player/freeze-turn-player.mjs` → `Global/DefaultPlayer.model` speed/jump/accel = 0 (**전역**). + - `tools/player/gen-player-lock.mjs` → `PlayerLock` codeblock(`pc.Enable=false`, `FixedLookAt=true`)를 map01~05에 주입. + - 공격은 순수 모션 `PlayerAttackMotion()`(StateComponent ATTACK→IDLE), 필드 몬스터와 무관(전투는 데이터 배열 UI 전투). + - 플레이어 스폰: `TeleportToActMap()` → `Vector3(-6, 0.03, 0)`, Floor별 map 선택. +- **맵 파이프라인**: map01 = 저작 템플릿, map02~05 = 복제 생성. 포털 없이 `TeleportToMapPosition` 전환. + - `Global/SectorConfig.config`의 valid 목록에 맵 등록(현재 gen-maps.mjs가 갱신). + - 컴포넌트 부착 패턴: `gen-combat-monster.mjs`가 맵 몬스터에 `script.CombatMonster`를 붙이고, 해당 codeblock이 OnBeginPlay에서 `/common` 컨트롤러에 자가등록. +- **흐름**: `OnBeginPlay`→`ShowLobby()`(UI). `EndRun(text)`→4초 후 `ShowLobby()`. + +## 접근법 + +**A. 새 로비 맵 + 월드 NPC 엔티티 (채택)** — 맵 템플릿 복제 재사용, NPC를 월드 엔티티로 배치하고 +각 NPC의 codeblock이 근접+클릭을 감지해 **기존 기능 패널**을 띄움. 이동/공격 해제는 로비 맵 전용 codeblock. +전투맵은 손대지 않아 잠금 유지. (B: 몬스터 배치기 재활용 → 로직 혼재로 비채택. C: 화면고정 UI 버튼 → 거부된 "UI 로비"라 제외.) + +## 상세 설계 + +### 1) 로비 맵 — `tools/map/gen-lobby-map.mjs` → `map/lobby.map` +- map01 템플릿 deep clone → 경로 `/maps/lobby`로 치환, GUID 재발급(결정론 시드). +- 마을/타운 배경 RUID + 타일셋 적용. **`script.Monster`/`script.CombatMonster` 엔티티 전부 제거**(전투 없음). +- NPC 4종을 x축으로 벌려 월드 엔티티로 배치. 각 NPC: + - 스프라이트 = 공식 maplestory NPC RUID(계정 업로드 금지 — 흰 박스). 구현 단계에서 asset 검색으로 4개 확정. + - `script.LobbyNpc` 컴포넌트 + `NpcId`(`run`/`codex`/`shop`/`board`) + 머리 위 이름/`!` 프롬프트용 텍스트 노드. +- 플레이어 스폰 지점(맵 중앙-좌측). +- `Global/SectorConfig.config` valid 목록에 `map://lobby` 추가 — **SectorConfig 단일 소유자는 gen-maps.mjs**로 유지하고 lobby 항목을 그 상수에 포함(두 생성기 충돌 방지). + +### 2) NPC 상호작용 — `tools/player/gen-lobby-npc.mjs` → `LobbyNpc` codeblock +- **근접+키**: 매 틱(타이머) 로컬 플레이어와의 x거리 측정 → 임계 거리 내면 `!` 프롬프트 노드 활성 + `Up`/`Space` 입력 시 트리거. +- **직접 클릭**: NPC 엔티티 클릭/터치 → 동일 트리거. (MSW 월드 엔티티 클릭 API는 구현 시 `mlua_api_retriever`로 확정: 엔티티 TouchEvent vs 스크린 오버레이 버튼 중 검증된 방식.) +- 트리거 시 `_EntityService:GetEntityByPath("/common").SlayDeckController:OnLobbyNpcInteract(NpcId)` 호출(경로 기반 크로스 codeblock — CombatMonster 자가등록과 동일 패턴). +- 한 번에 하나만 상호작용(다른 패널 열려 있으면 무시). + +### 3) 이동·공격 잠금 해제 (로비 맵 한정) — `LobbyMobility` codeblock +- **`map/lobby.map`에만** 주입(전투맵 PlayerLock/전역 freeze는 불변). +- OnBeginPlay 런타임 복원: 로컬 플레이어 `MovementComponent`(InputSpeed/JumpForce) 정상값, `PlayerController.Enable=true`, `FixedLookAt=false`. +- 공격 입력(키/클릭) → 기존 `PlayerAttackMotion()`(코스메틱) 바인딩. **필드 타격 없음**. +- 전투맵 텔레포트 시 모델 기본값(speed=0)+PlayerLock 재적용 → **"로비맵에서만"을 구조적으로 보장**. +- 런타임 이동/공격 복원 정확한 API는 구현 단계에서 `mlua_api_retriever`로 확정. +- 생성기 배치는 `gen-lobby-npc.mjs`에 함께 둘지 별도 `gen-lobby-unlock.mjs`로 분리할지는 계획에서 결정(둘 다 lobby 맵 전용 codeblock). + +### 4) 흐름 통합 — `tools/deck/gen-slaydeck.mjs` +- **OnBeginPlay**: `ShowLobby()`(UI) → **로비 맵 텔레포트** + 경량 "lobby" 상태(전투/상점/맵 HUD 숨김). +- **EndRun**: 4초 후 `ShowLobby()` → **로비 맵 텔레포트 복귀**. +- **OnLobbyNpcInteract(id)** 신규: `run`→`ShowCharacterSelect()`, `codex`→`ShowCodex()`, `shop`→`ShowSoulShop()`, `board`→`ShowBoard()`(전부 기존 메서드 재사용, 패널은 로비 맵 위 팝업). +- **제거**: `LobbyHud` 버튼-행 허브 패널 + `BindLobbyButtons`. +- **유지**: 영혼 포인트·승천 표시는 화면 모서리 **미니 HUD**(정보 표시 필요). 기능 패널 4종은 NPC 트리거. +- 런 시작(`StartRun`/`TeleportToActMap`)·전투 흐름은 불변. + +### 5) 미러/테스트 영향 +- 이동/공격 해제·NPC 배치는 **전투 규칙도 맵 그래프 생성 알고리즘도 아님** → `sim-balance.mjs`/`rogue-map.mjs` JS 미러 동기화 **불필요**(RULES.md §6은 그 둘만 요구). +- 검증(카운트만): `lobby.map` 내 NPC 엔티티 수, 산출물의 `LobbyNpc`/`LobbyMobility`/`OnLobbyNpcInteract` 개수, SectorConfig `map://lobby` 존재. 내용 출력 금지. +- 동작 검증: 메이커 플레이테스트. + +## 검증 시나리오 (메이커) +1. 월드 시작 → **로비 맵에 스폰**, 이동 가능, 공격 모션 가능. +2. NPC 근접 → `!` 프롬프트 → `Up/Space`로 기능 패널 오픈. 직접 클릭으로도 오픈. +3. 4종 각각: 모험가→직업선택→런 시작, 사서→도감, 상인→영혼상점, 안내원→게시판. +4. 런 시작 → map01 텔레포트, **이동/공격 잠김**. +5. 런 종료(클리어/패배) → **로비 맵 복귀**, 이동/공격 재해제. +6. 미니 HUD에 영혼/승천 표시 정상. + +## 리스크 +- MSW 런타임 이동 재활성 API 가용성 → 계획 단계 `mlua_api_retriever` 검증. +- MSW 월드 엔티티 클릭 감지 방식 → 동일 검증(불가 시 근접+키만으로 폴백, 직접 클릭은 스크린 오버레이 버튼으로 구현). +- 텔레포트 복귀 좌표/스폰 위치 정합. +- 메이커 stale 상태 — git pull 후 로컬 워크스페이스 reload 필수(RULES.md §5). + +## 생성기/파일 변경 요약 +| 파일 | 변경 | +|---|---| +| `tools/map/gen-lobby-map.mjs` | **신규** — lobby.map(배경/타일/NPC 엔티티/스폰), SectorConfig 조율 | +| `tools/player/gen-lobby-npc.mjs` | **신규** — LobbyNpc 상호작용 codeblock(+LobbyMobility 또는 분리) | +| `tools/deck/gen-slaydeck.mjs` | OnBeginPlay/EndRun 로비맵 전환, OnLobbyNpcInteract, 버튼-행 허브 제거, 미니 HUD | +| `Global/SectorConfig.config` | map://lobby 등록(생성 산출물) | +| `map/lobby.map`, `ui/DefaultGroup.ui`, `*.codeblock` | 재생성 산출물 | diff --git a/map/lobby.map b/map/lobby.map new file mode 100644 index 0000000..7cd8c7b --- /dev/null +++ b/map/lobby.map @@ -0,0 +1,6980 @@ +{ + "Id": "", + "GameId": "", + "EntryKey": "map://lobby", + "ContentType": "x-mod/map", + "Content": "", + "Usage": 0, + "UsePublish": 1, + "UseService": 0, + "CoreVersion": "26.5.0.0", + "StudioVersion": "0.1.0.0", + "DynamicLoading": 0, + "ContentProto": { + "Use": "Binary", + "Entities": [ + { + "id": "000dbba0-0000-4000-8000-0000000dbba0", + "path": "/maps/lobby", + "componentNames": "MOD.Core.MapComponent,MOD.Core.FootholdComponent,script.MapCamera,script.LobbyMobility", + "jsonString": { + "name": "lobby", + "path": "/maps/lobby", + "nameEditable": false, + "enable": true, + "visible": true, + "localize": false, + "displayOrder": 0, + "pathConstraints": "//", + "revision": 2, + "modelId": null, + "@components": [ + { + "@type": "MOD.Core.MapComponent", + "AirAccelerationXFactor": 1, + "AirDecelerationXFactor": 1, + "FallSpeedMaxXFactor": 1, + "FallSpeedMaxYFactor": 1, + "Gravity": 1, + "IsInstanceMap": false, + "TileMapMode": 0, + "WalkAccelerationFactor": 1, + "WalkDrag": 1, + "Enable": true + }, + { + "@type": "MOD.Core.FootholdComponent", + "FootholdsByLayer": { + "1": [ + { + "Length": 1.27999973, + "NextFootholdId": 2, + "PreviousFootholdId": 27, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 1, + "StartPoint": { + "x": -8.93, + "y": -0.04000002 + }, + "EndPoint": { + "x": -7.65000057, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.8999996, + "NextFootholdId": 3, + "PreviousFootholdId": 1, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 2, + "StartPoint": { + "x": -7.64999962, + "y": -0.04000002 + }, + "EndPoint": { + "x": -6.75, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.8999996, + "NextFootholdId": 4, + "PreviousFootholdId": 2, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 3, + "StartPoint": { + "x": -6.74999952, + "y": -0.04000002 + }, + "EndPoint": { + "x": -5.85, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.8999996, + "NextFootholdId": 5, + "PreviousFootholdId": 3, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 4, + "StartPoint": { + "x": -5.84999943, + "y": -0.04000002 + }, + "EndPoint": { + "x": -4.95, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.8999996, + "NextFootholdId": 6, + "PreviousFootholdId": 4, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 5, + "StartPoint": { + "x": -4.95, + "y": -0.04000002 + }, + "EndPoint": { + "x": -4.05, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.900000334, + "NextFootholdId": 7, + "PreviousFootholdId": 5, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 6, + "StartPoint": { + "x": -4.05, + "y": -0.04000002 + }, + "EndPoint": { + "x": -3.14999986, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.9000001, + "NextFootholdId": 8, + "PreviousFootholdId": 6, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 7, + "StartPoint": { + "x": -3.14999986, + "y": -0.04000002 + }, + "EndPoint": { + "x": -2.24999976, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.899999738, + "NextFootholdId": 9, + "PreviousFootholdId": 7, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 8, + "StartPoint": { + "x": -2.24999976, + "y": -0.04000002 + }, + "EndPoint": { + "x": -1.35, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.9000001, + "NextFootholdId": 10, + "PreviousFootholdId": 8, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 9, + "StartPoint": { + "x": -1.35, + "y": -0.04000002 + }, + "EndPoint": { + "x": -0.449999958, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.9, + "NextFootholdId": 11, + "PreviousFootholdId": 9, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 10, + "StartPoint": { + "x": -0.45, + "y": -0.04000002 + }, + "EndPoint": { + "x": 0.449999958, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.9, + "NextFootholdId": 12, + "PreviousFootholdId": 10, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 11, + "StartPoint": { + "x": 0.450000018, + "y": -0.04000002 + }, + "EndPoint": { + "x": 1.35, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.9000002, + "NextFootholdId": 13, + "PreviousFootholdId": 11, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 12, + "StartPoint": { + "x": 1.34999979, + "y": -0.04000002 + }, + "EndPoint": { + "x": 2.25, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.9000001, + "NextFootholdId": 14, + "PreviousFootholdId": 12, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 13, + "StartPoint": { + "x": 2.25, + "y": -0.04000002 + }, + "EndPoint": { + "x": 3.15, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.899999857, + "NextFootholdId": 15, + "PreviousFootholdId": 13, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 14, + "StartPoint": { + "x": 3.14999986, + "y": -0.04000002 + }, + "EndPoint": { + "x": 4.04999971, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.8999996, + "NextFootholdId": 16, + "PreviousFootholdId": 14, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 15, + "StartPoint": { + "x": 4.05, + "y": -0.04000002 + }, + "EndPoint": { + "x": 4.95, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.8999996, + "NextFootholdId": 17, + "PreviousFootholdId": 15, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 16, + "StartPoint": { + "x": 4.95000029, + "y": -0.04000002 + }, + "EndPoint": { + "x": 5.85, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.8999996, + "NextFootholdId": 18, + "PreviousFootholdId": 16, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 17, + "StartPoint": { + "x": 5.85, + "y": -0.04000002 + }, + "EndPoint": { + "x": 6.74999952, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 1.27999973, + "NextFootholdId": 19, + "PreviousFootholdId": 17, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 18, + "StartPoint": { + "x": 6.75, + "y": -0.04000002 + }, + "EndPoint": { + "x": 8.03, + "y": -0.04000002 + }, + "Variance": { + "x": 1, + "y": 0 + } + }, + { + "Length": 0.859999955, + "NextFootholdId": 20, + "PreviousFootholdId": 18, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 19, + "StartPoint": { + "x": 8.03, + "y": -0.04000002 + }, + "EndPoint": { + "x": 8.03, + "y": -0.9 + }, + "Variance": { + "x": 0, + "y": -1 + } + }, + { + "Length": 0.6, + "NextFootholdId": 21, + "PreviousFootholdId": 19, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 20, + "StartPoint": { + "x": 8.03, + "y": -0.9000001 + }, + "EndPoint": { + "x": 8.03, + "y": -1.50000012 + }, + "Variance": { + "x": 0, + "y": -1 + } + }, + { + "Length": 0.6, + "NextFootholdId": 22, + "PreviousFootholdId": 20, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 21, + "StartPoint": { + "x": 8.03, + "y": -1.50000012 + }, + "EndPoint": { + "x": 8.03, + "y": -2.10000014 + }, + "Variance": { + "x": 0, + "y": -1 + } + }, + { + "Length": 0.5999999, + "NextFootholdId": 23, + "PreviousFootholdId": 21, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 22, + "StartPoint": { + "x": 8.03, + "y": -2.10000014 + }, + "EndPoint": { + "x": 8.03, + "y": -2.7 + }, + "Variance": { + "x": 0, + "y": -1 + } + }, + { + "Length": 0.5999999, + "NextFootholdId": 24, + "PreviousFootholdId": 22, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 23, + "StartPoint": { + "x": 8.03, + "y": -2.70000029 + }, + "EndPoint": { + "x": 8.03, + "y": -3.30000019 + }, + "Variance": { + "x": 0, + "y": -1 + } + }, + { + "Length": 0.5999999, + "NextFootholdId": 25, + "PreviousFootholdId": 23, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 24, + "StartPoint": { + "x": 8.03, + "y": -3.30000019 + }, + "EndPoint": { + "x": 8.03, + "y": -3.9 + }, + "Variance": { + "x": 0, + "y": -1 + } + }, + { + "Length": 0.600000143, + "NextFootholdId": 26, + "PreviousFootholdId": 24, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 25, + "StartPoint": { + "x": 8.03, + "y": -3.90000033 + }, + "EndPoint": { + "x": 8.03, + "y": -4.50000048 + }, + "Variance": { + "x": 0, + "y": -1 + } + }, + { + "Length": 0.6000004, + "NextFootholdId": 0, + "PreviousFootholdId": 25, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 26, + "StartPoint": { + "x": 8.03, + "y": -4.5 + }, + "EndPoint": { + "x": 8.03, + "y": -5.10000038 + }, + "Variance": { + "x": 0, + "y": -1 + } + }, + { + "Length": 0.859999955, + "NextFootholdId": 1, + "PreviousFootholdId": 28, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 27, + "StartPoint": { + "x": -8.93, + "y": -0.9 + }, + "EndPoint": { + "x": -8.93, + "y": -0.04000002 + }, + "Variance": { + "x": 0, + "y": 1 + } + }, + { + "Length": 0.6, + "NextFootholdId": 27, + "PreviousFootholdId": 29, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 28, + "StartPoint": { + "x": -8.93, + "y": -1.50000012 + }, + "EndPoint": { + "x": -8.93, + "y": -0.9000001 + }, + "Variance": { + "x": 0, + "y": 1 + } + }, + { + "Length": 0.6, + "NextFootholdId": 28, + "PreviousFootholdId": 30, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 29, + "StartPoint": { + "x": -8.93, + "y": -2.10000014 + }, + "EndPoint": { + "x": -8.93, + "y": -1.50000012 + }, + "Variance": { + "x": 0, + "y": 1 + } + }, + { + "Length": 0.5999999, + "NextFootholdId": 29, + "PreviousFootholdId": 31, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 30, + "StartPoint": { + "x": -8.93, + "y": -2.7 + }, + "EndPoint": { + "x": -8.93, + "y": -2.10000014 + }, + "Variance": { + "x": 0, + "y": 1 + } + }, + { + "Length": 0.5999999, + "NextFootholdId": 30, + "PreviousFootholdId": 32, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 31, + "StartPoint": { + "x": -8.93, + "y": -3.30000019 + }, + "EndPoint": { + "x": -8.93, + "y": -2.70000029 + }, + "Variance": { + "x": 0, + "y": 1 + } + }, + { + "Length": 0.5999999, + "NextFootholdId": 31, + "PreviousFootholdId": 33, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 32, + "StartPoint": { + "x": -8.93, + "y": -3.9 + }, + "EndPoint": { + "x": -8.93, + "y": -3.30000019 + }, + "Variance": { + "x": 0, + "y": 1 + } + }, + { + "Length": 0.600000143, + "NextFootholdId": 32, + "PreviousFootholdId": 34, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 33, + "StartPoint": { + "x": -8.93, + "y": -4.50000048 + }, + "EndPoint": { + "x": -8.93, + "y": -3.90000033 + }, + "Variance": { + "x": 0, + "y": 1 + } + }, + { + "Length": 0.6000004, + "NextFootholdId": 33, + "PreviousFootholdId": 0, + "groupID": 1, + "layer": 1, + "sortingLayerName": "MapLayer0", + "attribute": { + "walk": 1, + "force": 0, + "drag": 1, + "isBlockVertical": false, + "isDynamic": false, + "isCustomFoothold": false, + "inertiaOption": 0 + }, + "OwnerId": "c9a3018a-f6fa-4c4b-b91e-404ac5ce9858", + "Id": 34, + "StartPoint": { + "x": -8.93, + "y": -5.10000038 + }, + "EndPoint": { + "x": -8.93, + "y": -4.5 + }, + "Variance": { + "x": 0, + "y": 1 + } + } + ] + }, + "Enable": true + }, + { + "@type": "script.MapCamera", + "Enable": true + }, + { + "@type": "script.LobbyMobility", + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "000dbba1-0000-4000-8000-0000000dbba1", + "path": "/maps/lobby/Background", + "componentNames": "MOD.Core.BackgroundComponent", + "jsonString": { + "name": "Background", + "path": "/maps/lobby/Background", + "nameEditable": false, + "enable": true, + "visible": true, + "localize": false, + "displayOrder": 0, + "pathConstraints": "///", + "revision": 1, + "modelId": null, + "@components": [ + { + "@type": "MOD.Core.BackgroundComponent", + "SolidColor": { + "r": 0.5019608, + "g": 0.5019608, + "b": 0.5019608, + "a": 0.7058824 + }, + "TemplateRUID": "65c4167ea7484196b890022354e5a4a4", + "Type": 1, + "WebUrl": "eab37efa7f0d400f94259a2df836eb8a", + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "000dbba2-0000-4000-8000-0000000dbba2", + "path": "/maps/lobby/MapleMapLayer", + "componentNames": "MOD.Core.MapLayerComponent", + "jsonString": { + "name": "MapleMapLayer", + "path": "/maps/lobby/MapleMapLayer", + "nameEditable": false, + "enable": true, + "visible": true, + "localize": false, + "displayOrder": 1, + "pathConstraints": "///", + "revision": 1, + "origin": { + "type": "Model", + "entry_id": "maplemaplayer", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "maplemaplayer", + "@components": [ + { + "@type": "MOD.Core.MapLayerComponent", + "IsVisible": true, + "LayerSortOrder": 0, + "Locked": false, + "MapLayerName": "Layer1", + "Thumbnail": "", + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "000dbba3-0000-4000-8000-0000000dbba3", + "path": "/maps/lobby/TileMap", + "componentNames": "MOD.Core.TransformComponent,MOD.Core.TileMapComponent", + "jsonString": { + "name": "TileMap", + "path": "/maps/lobby/TileMap", + "nameEditable": false, + "enable": true, + "visible": true, + "localize": false, + "displayOrder": 2, + "pathConstraints": "///", + "revision": 1, + "origin": { + "type": "Model", + "entry_id": "tilemap", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "tilemap", + "@components": [ + { + "@type": "MOD.Core.TransformComponent", + "Position": { + "x": -0.225, + "y": -0.15, + "z": 1000 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.TileMapComponent", + "Color": { + "r": 1, + "g": 1, + "b": 1, + "a": 1 + }, + "FootholdDrag": 1, + "FootholdForce": 0, + "FootholdWalkSpeedFactor": 1, + "IgnoreMapLayerCheck": false, + "IsOddGridPosition": false, + "OrderInLayer": 1, + "SortingLayer": "MapLayer0", + "TileMapVersion": 1, + "TileSetRUID": { + "DataId": "9dfea3808bbd49a5877d8624df21b1c7" + }, + "Tiles": [ + { + "type": 5, + "position": { + "x": -16, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -5 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -16, + "y": -5 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -5 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -4 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -3 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -16, + "y": -3 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -3 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -14, + "y": -4 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": -14, + "y": -5 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -5 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -14, + "y": -3 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -3 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -12, + "y": -4 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -12, + "y": -5 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -5 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -4 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -12, + "y": -3 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -3 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -10, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -4 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -3 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -5 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -10, + "y": -5 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -10, + "y": -3 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -8, + "y": -4 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -8, + "y": -5 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -5 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -4 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -8, + "y": -3 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -3 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -6, + "y": -5 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -5 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -4, + "y": -5 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -5 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -2, + "y": -5 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -5 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 0, + "y": -5 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -5 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 2, + "y": -6 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 2, + "y": -7 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -6 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -6 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 2, + "y": -5 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -5 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 4, + "y": -6 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 4, + "y": -7 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -6 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 4, + "y": -5 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -5 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 6, + "y": -6 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": 6, + "y": -7 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 6, + "y": -5 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -5 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -6, + "y": -3 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -3 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -4, + "y": -3 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -3 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -2, + "y": -3 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -3 + }, + "tileIndex": 3 + }, + { + "type": 5, + "position": { + "x": -6, + "y": -4 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 0, + "y": -3 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -3 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 2, + "y": -3 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -3 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 4, + "y": -3 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -3 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 6, + "y": -3 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -3 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 4, + "y": -4 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -4 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 2, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -4 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 0, + "y": -4 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -4, + "y": -4 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -2, + "y": -4 + }, + "tileIndex": 5 + }, + { + "type": 5, + "position": { + "x": 6, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -4 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 8, + "y": -4 + }, + "tileIndex": 4 + }, + { + "type": 0, + "position": { + "x": 8, + "y": -5 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -5 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 8, + "y": -3 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -3 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -16, + "y": -2 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -1 + }, + "tileIndex": 2 + }, + { + "type": 9, + "position": { + "x": -16, + "y": -1 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -1 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -14, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -2 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -1 + }, + "tileIndex": 3 + }, + { + "type": 9, + "position": { + "x": -14, + "y": -1 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -12, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 9, + "position": { + "x": -12, + "y": -1 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -1 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 9, + "position": { + "x": -10, + "y": -1 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -1 + }, + "tileIndex": 0 + }, + { + "type": 9, + "position": { + "x": -8, + "y": -1 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -1 + }, + "tileIndex": 3 + }, + { + "type": 9, + "position": { + "x": -6, + "y": -1 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -1 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -4, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -2 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -1 + }, + "tileIndex": 0 + }, + { + "type": 9, + "position": { + "x": -4, + "y": -1 + }, + "tileIndex": 3 + }, + { + "type": 5, + "position": { + "x": -2, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -1 + }, + "tileIndex": 0 + }, + { + "type": 9, + "position": { + "x": -2, + "y": -1 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 0, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -1 + }, + "tileIndex": 1 + }, + { + "type": 9, + "position": { + "x": 0, + "y": -1 + }, + "tileIndex": 3 + }, + { + "type": 5, + "position": { + "x": 2, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -2 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -1 + }, + "tileIndex": 2 + }, + { + "type": 9, + "position": { + "x": 2, + "y": -1 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 4, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -1 + }, + "tileIndex": 3 + }, + { + "type": 9, + "position": { + "x": 4, + "y": -1 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 6, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -2 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -1 + }, + "tileIndex": 1 + }, + { + "type": 9, + "position": { + "x": 6, + "y": -1 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 8, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -2 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -1 + }, + "tileIndex": 3 + }, + { + "type": 9, + "position": { + "x": 8, + "y": -1 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -8, + "y": -2 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -10, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -6, + "y": -2 + }, + "tileIndex": 1 + }, + { + "type": 9, + "position": { + "x": 10, + "y": -1 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -1 + }, + "tileIndex": 0 + }, + { + "type": 9, + "position": { + "x": 12, + "y": -1 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -1 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -3 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -5 + }, + "tileIndex": -1 + }, + { + "type": 5, + "position": { + "x": 12, + "y": -4 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -5 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 12, + "y": -5 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -3 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 12, + "y": -3 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 10, + "y": -4 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": 10, + "y": -5 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 10, + "y": -3 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 10, + "y": -2 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -2 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 12, + "y": -2 + }, + "tileIndex": 4 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 5, + "position": { + "x": 10, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 10, + "y": -7 + }, + "tileIndex": 2 + }, + { + "type": 5, + "position": { + "x": 8, + "y": -6 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": 8, + "y": -7 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 0, + "y": -6 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -6 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 0, + "y": -7 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -2, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -2, + "y": -7 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -4, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -6 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -4, + "y": -7 + }, + "tileIndex": 3 + }, + { + "type": 5, + "position": { + "x": -6, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -6, + "y": -7 + }, + "tileIndex": 2 + }, + { + "type": 5, + "position": { + "x": -8, + "y": -6 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -6 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -8, + "y": -7 + }, + "tileIndex": 2 + }, + { + "type": 5, + "position": { + "x": -10, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -10, + "y": -7 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -6 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -16, + "y": -7 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -7 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -14, + "y": -7 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -7 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -12, + "y": -6 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -12, + "y": -7 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -14, + "y": -6 + }, + "tileIndex": 4 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -6 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -16, + "y": -6 + }, + "tileIndex": 2 + }, + { + "type": 5, + "position": { + "x": 12, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 12, + "y": -7 + }, + "tileIndex": 2 + }, + { + "type": 5, + "position": { + "x": 14, + "y": -6 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": 14, + "y": -7 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 14, + "y": -5 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -5 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 14, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 14, + "y": -3 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -3 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -4 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 14, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 9, + "position": { + "x": 14, + "y": -1 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -1 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -2 + }, + "tileIndex": 0 + }, + { + "type": 9, + "position": { + "x": 16, + "y": -1 + }, + "tileIndex": 3 + }, + { + "type": 11, + "position": { + "x": 17, + "y": -1 + }, + "tileIndex": 2 + }, + { + "type": 6, + "position": { + "x": 17, + "y": -2 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 17, + "y": -3 + }, + "tileIndex": -1 + }, + { + "type": 6, + "position": { + "x": 17, + "y": -4 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 17, + "y": -5 + }, + "tileIndex": -1 + }, + { + "type": 6, + "position": { + "x": 17, + "y": -6 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 17, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 6, + "position": { + "x": 17, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 17, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 16, + "y": -7 + }, + "tileIndex": 3 + }, + { + "type": 5, + "position": { + "x": 16, + "y": -6 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 16, + "y": -5 + }, + "tileIndex": 2 + }, + { + "type": 5, + "position": { + "x": 16, + "y": -4 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": 16, + "y": -3 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 16, + "y": -2 + }, + "tileIndex": 4 + }, + { + "type": 5, + "position": { + "x": 16, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 16, + "y": -9 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 16, + "y": -10 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 16, + "y": -11 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 17, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -10 + }, + "tileIndex": 0 + }, + { + "type": 6, + "position": { + "x": 17, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 16, + "y": -12 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -13 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 16, + "y": -13 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": 17, + "y": -13 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 6, + "position": { + "x": 17, + "y": -12 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 16, + "y": -14 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -15 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 16, + "y": -15 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": 17, + "y": -15 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -14 + }, + "tileIndex": 1 + }, + { + "type": 6, + "position": { + "x": 17, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 14, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -15 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 14, + "y": -15 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -13 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 14, + "y": -13 + }, + "tileIndex": 2 + }, + { + "type": 5, + "position": { + "x": 12, + "y": -14 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -15 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 12, + "y": -15 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -14 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -13 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 12, + "y": -13 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 10, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -15 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 10, + "y": -15 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -13 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 10, + "y": -13 + }, + "tileIndex": 2 + }, + { + "type": 5, + "position": { + "x": 8, + "y": -14 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -15 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 8, + "y": -15 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -14 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -13 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 8, + "y": -13 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 6, + "y": -15 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -15 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": 4, + "y": -15 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -15 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 2, + "y": -15 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -15 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 0, + "y": -15 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -15 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -2, + "y": -15 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -15 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -2, + "y": -16 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": -2, + "y": -17 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -4, + "y": -16 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": -4, + "y": -17 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -15 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -4, + "y": -15 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -6, + "y": -16 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": -6, + "y": -17 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -16 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -15 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -6, + "y": -15 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -8, + "y": -16 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": -8, + "y": -17 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -16 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -15 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -8, + "y": -15 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -10, + "y": -16 + }, + "tileIndex": 4 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": -10, + "y": -17 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -15 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -10, + "y": -15 + }, + "tileIndex": 2 + }, + { + "type": 5, + "position": { + "x": -12, + "y": -16 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": -12, + "y": -17 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -16 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -15 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -12, + "y": -15 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -14, + "y": -16 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": -14, + "y": -17 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -15 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -14, + "y": -15 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -16, + "y": -16 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": -16, + "y": -17 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -16 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -15 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -16, + "y": -15 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -14 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -13 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -11 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -10 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -9 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -17, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -18, + "y": -3 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -19, + "y": -3 + }, + "tileIndex": 3 + }, + { + "type": 5, + "position": { + "x": -18, + "y": -4 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -18, + "y": -5 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -19, + "y": -5 + }, + "tileIndex": -1 + }, + { + "type": 6, + "position": { + "x": -19, + "y": -4 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -18, + "y": -6 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -18, + "y": -7 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -19, + "y": -7 + }, + "tileIndex": -1 + }, + { + "type": 6, + "position": { + "x": -19, + "y": -6 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -18, + "y": -8 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -18, + "y": -9 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -19, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 6, + "position": { + "x": -19, + "y": -8 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -18, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -18, + "y": -11 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -19, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 6, + "position": { + "x": -19, + "y": -10 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -18, + "y": -12 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -18, + "y": -13 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -19, + "y": -13 + }, + "tileIndex": -1 + }, + { + "type": 6, + "position": { + "x": -19, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -18, + "y": -14 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -18, + "y": -15 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -19, + "y": -15 + }, + "tileIndex": -1 + }, + { + "type": 6, + "position": { + "x": -19, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -18, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 7, + "position": { + "x": -18, + "y": -17 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -19, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 8, + "position": { + "x": -19, + "y": -16 + }, + "tileIndex": 1 + }, + { + "type": 6, + "position": { + "x": -19, + "y": -2 + }, + "tileIndex": 1 + }, + { + "type": 11, + "position": { + "x": -19, + "y": -1 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -18, + "y": -2 + }, + "tileIndex": 1 + }, + { + "type": 9, + "position": { + "x": -18, + "y": -1 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 5, + "position": { + "x": -14, + "y": -10 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -14, + "y": -11 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -10 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -9 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -14, + "y": -9 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 5, + "position": { + "x": -12, + "y": -10 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -12, + "y": -11 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -12, + "y": -9 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -9 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -10, + "y": -9 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -8, + "y": -9 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -9 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -6, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -8 + }, + "tileIndex": -1 + }, + { + "type": 5, + "position": { + "x": -4, + "y": -8 + }, + "tileIndex": 4 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -8 + }, + "tileIndex": -1 + }, + { + "type": 5, + "position": { + "x": -2, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -4, + "y": -9 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -8 + }, + "tileIndex": -1 + }, + { + "type": 5, + "position": { + "x": 0, + "y": -8 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -2, + "y": -9 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -8 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 0, + "y": -9 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -8 + }, + "tileIndex": -1 + }, + { + "type": 5, + "position": { + "x": -8, + "y": -8 + }, + "tileIndex": 4 + }, + { + "type": 0, + "position": { + "x": -6, + "y": -9 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -14, + "y": -8 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -13 + }, + "tileIndex": -1 + }, + { + "type": 5, + "position": { + "x": -16, + "y": -12 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -16, + "y": -13 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -16, + "y": -11 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -16, + "y": -10 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -16, + "y": -9 + }, + "tileIndex": 2 + }, + { + "type": 5, + "position": { + "x": -16, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -15, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -14, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -13 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -12, + "y": -13 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -13 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -10, + "y": -13 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -13 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -11 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -8, + "y": -12 + }, + "tileIndex": 4 + }, + { + "type": 0, + "position": { + "x": -8, + "y": -13 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -13 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -8, + "y": -11 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -11 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -14, + "y": -13 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -16, + "y": -14 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": -6, + "y": -13 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -13 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -4, + "y": -13 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -13 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -2, + "y": -13 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -13 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 0, + "y": -13 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -13 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": 2, + "y": -13 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -13 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 4, + "y": -13 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -13 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 6, + "y": -13 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 6, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -14 + }, + "tileIndex": -1 + }, + { + "type": 5, + "position": { + "x": 4, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 2, + "y": -14 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -14 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 2, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": 2, + "y": -17 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 0, + "y": -16 + }, + "tileIndex": 5 + }, + { + "type": 7, + "position": { + "x": 0, + "y": -17 + }, + "tileIndex": 2 + }, + { + "type": 5, + "position": { + "x": 4, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": 4, + "y": -17 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 6, + "y": -16 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": 6, + "y": -17 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 8, + "y": -16 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": 8, + "y": -17 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 10, + "y": -16 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 16, + "y": -16 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": 16, + "y": -17 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 17, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 15, + "y": -16 + }, + "tileIndex": 1 + }, + { + "type": 8, + "position": { + "x": 17, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 14, + "y": -16 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -16 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": 14, + "y": -17 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 12, + "y": -16 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -16 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -17 + }, + "tileIndex": -1 + }, + { + "type": 7, + "position": { + "x": 12, + "y": -17 + }, + "tileIndex": 0 + }, + { + "type": 7, + "position": { + "x": 10, + "y": -17 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -4, + "y": -14 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -6, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -14 + }, + "tileIndex": -1 + }, + { + "type": 5, + "position": { + "x": -8, + "y": -14 + }, + "tileIndex": 4 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -14 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -12, + "y": -12 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -13, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -12, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -8 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -14, + "y": -12 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -7, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -10, + "y": -12 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -10, + "y": -11 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -10, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -9, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -10, + "y": -8 + }, + "tileIndex": 2 + }, + { + "type": 5, + "position": { + "x": -12, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -11, + "y": -14 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -6, + "y": -10 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -10 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -6, + "y": -11 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": -5, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": -4, + "y": -11 + }, + "tileIndex": 3 + }, + { + "type": 5, + "position": { + "x": -4, + "y": -12 + }, + "tileIndex": 4 + }, + { + "type": 0, + "position": { + "x": -3, + "y": -12 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -10, + "y": -14 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -8, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -4, + "y": -10 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": -6, + "y": -12 + }, + "tileIndex": 4 + }, + { + "type": 5, + "position": { + "x": -2, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -14 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -11 + }, + "tileIndex": 3 + }, + { + "type": 0, + "position": { + "x": -2, + "y": -11 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": -1, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": -2, + "y": -10 + }, + "tileIndex": 4 + }, + { + "type": 5, + "position": { + "x": -2, + "y": -14 + }, + "tileIndex": 4 + }, + { + "type": 5, + "position": { + "x": 0, + "y": -10 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 0, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 5, + "position": { + "x": 0, + "y": -12 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 1, + "y": -12 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 0, + "y": -14 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 2, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 4, + "y": -8 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 4, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -8 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 4, + "y": -10 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 4, + "y": -11 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 3, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 2, + "y": -11 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 2, + "y": -10 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 2, + "y": -9 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 2, + "y": -8 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 5, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 6, + "y": -8 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 6, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 5, + "position": { + "x": 6, + "y": -10 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -8 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 6, + "y": -11 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -10 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 6, + "y": -12 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 7, + "y": -12 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 4, + "y": -12 + }, + "tileIndex": 2 + }, + { + "type": 5, + "position": { + "x": 8, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 10, + "y": -8 + }, + "tileIndex": 4 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 10, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -9 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -8 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 8, + "y": -9 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 10, + "y": -10 + }, + "tileIndex": 5 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 10, + "y": -11 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -10 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 9, + "y": -12 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 8, + "y": -11 + }, + "tileIndex": 2 + }, + { + "type": 5, + "position": { + "x": 8, + "y": -10 + }, + "tileIndex": 4 + }, + { + "type": 0, + "position": { + "x": 12, + "y": -9 + }, + "tileIndex": 2 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -9 + }, + "tileIndex": 3 + }, + { + "type": 5, + "position": { + "x": 12, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 12, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -11 + }, + "tileIndex": -1 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 12, + "y": -12 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 11, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -12 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 13, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 0, + "position": { + "x": 14, + "y": -9 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 14, + "y": -10 + }, + "tileIndex": 1 + }, + { + "type": 0, + "position": { + "x": 14, + "y": -11 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 14, + "y": -8 + }, + "tileIndex": 0 + }, + { + "type": 5, + "position": { + "x": 12, + "y": -8 + }, + "tileIndex": 3 + }, + { + "type": 5, + "position": { + "x": 14, + "y": -12 + }, + "tileIndex": 5 + }, + { + "type": 5, + "position": { + "x": 10, + "y": -12 + }, + "tileIndex": 1 + }, + { + "type": 5, + "position": { + "x": 8, + "y": -12 + }, + "tileIndex": 5 + } + ], + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "000dbba4-0000-4000-8000-0000000dbba4", + "path": "/maps/lobby/SpawnLocation", + "componentNames": "MOD.Core.TransformComponent,MOD.Core.SpriteRendererComponent,MOD.Core.SpawnLocationComponent", + "jsonString": { + "name": "SpawnLocation", + "path": "/maps/lobby/SpawnLocation", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": false, + "displayOrder": 3, + "pathConstraints": "///", + "revision": 1, + "modelId": null, + "@components": [ + { + "@type": "MOD.Core.TransformComponent", + "Rotation": { + "x": 0, + "y": 0, + "z": 0 + }, + "Position": { + "x": -5, + "y": 0, + "z": 999.999 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "ZRotation": 0, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteRendererComponent", + "ActionSheet": {}, + "DrawMode": 0, + "EndFrameIndex": 2147483647, + "FlipX": false, + "FlipY": false, + "IgnoreMapLayerCheck": false, + "OrderInLayer": 0, + "PlayRate": 1, + "RenderSetting": 0, + "SortingLayer": "Default", + "SpriteRUID": "8ef238e0d0ca4bb783aca526cff35d11", + "StartFrameIndex": 0, + "TiledSize": { + "x": 1, + "y": 1 + }, + "Color": { + "r": 1, + "g": 1, + "b": 1, + "a": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpawnLocationComponent", + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "000dbba5-0000-4000-8000-0000000dbba5", + "path": "/maps/lobby/NpcRun", + "componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.StateComponent,MOD.Core.TouchReceiveComponent,script.LobbyNpc", + "jsonString": { + "name": "NpcRun", + "path": "/maps/lobby/NpcRun", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": false, + "displayOrder": 4, + "pathConstraints": "///", + "revision": 2, + "origin": { + "type": "Model", + "entry_id": "ChaseMonster", + "sub_entity_id": null, + "root_entity_id": "000dbba5-0000-4000-8000-0000000dbba5", + "replaced_model_id": null + }, + "modelId": "chasemonster", + "@components": [ + { + "@type": "MOD.Core.TransformComponent", + "Position": { + "x": -3, + "y": 0.03499998, + "z": 999.999 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.StateAnimationComponent", + "ActionSheet": { + "stand": "122095fd155c4633867b0da4f375bc3c", + "hit": "122095fd155c4633867b0da4f375bc3c", + "die": "122095fd155c4633867b0da4f375bc3c" + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteRendererComponent", + "ActionSheet": {}, + "EndFrameIndex": 0, + "RenderSetting": 1, + "SortingLayer": "MapLayer0", + "SpriteRUID": "122095fd155c4633867b0da4f375bc3c", + "StartFrameIndex": 0, + "Enable": true + }, + { + "@type": "MOD.Core.StateComponent", + "IsLegacy": false, + "Enable": true + }, + { + "@type": "MOD.Core.TouchReceiveComponent", + "Enable": true, + "AutoFitToSize": true + }, + { + "@type": "script.LobbyNpc", + "Enable": true, + "NpcId": "run", + "MarkName": "NpcRunMark" + } + ], + "@version": 1 + } + }, + { + "id": "000dbba6-0000-4000-8000-0000000dbba6", + "path": "/maps/lobby/NpcRunMark", + "componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.StateComponent", + "jsonString": { + "name": "NpcRunMark", + "path": "/maps/lobby/NpcRunMark", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": false, + "displayOrder": 4, + "pathConstraints": "///", + "revision": 2, + "origin": { + "type": "Model", + "entry_id": "ChaseMonster", + "sub_entity_id": null, + "root_entity_id": "000dbba6-0000-4000-8000-0000000dbba6", + "replaced_model_id": null + }, + "modelId": "chasemonster", + "@components": [ + { + "@type": "MOD.Core.TransformComponent", + "Position": { + "x": -3, + "y": 1.6349999800000001, + "z": 999.999 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.StateAnimationComponent", + "ActionSheet": { + "stand": "bd4afdde295f40318fceb4166978ebaa", + "hit": "bd4afdde295f40318fceb4166978ebaa", + "die": "bd4afdde295f40318fceb4166978ebaa" + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteRendererComponent", + "ActionSheet": {}, + "EndFrameIndex": 0, + "RenderSetting": 1, + "SortingLayer": "MapLayer0", + "SpriteRUID": "bd4afdde295f40318fceb4166978ebaa", + "StartFrameIndex": 0, + "Enable": true + }, + { + "@type": "MOD.Core.StateComponent", + "IsLegacy": false, + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "000dbba7-0000-4000-8000-0000000dbba7", + "path": "/maps/lobby/NpcCodex", + "componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.StateComponent,MOD.Core.TouchReceiveComponent,script.LobbyNpc", + "jsonString": { + "name": "NpcCodex", + "path": "/maps/lobby/NpcCodex", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": false, + "displayOrder": 4, + "pathConstraints": "///", + "revision": 2, + "origin": { + "type": "Model", + "entry_id": "ChaseMonster", + "sub_entity_id": null, + "root_entity_id": "000dbba7-0000-4000-8000-0000000dbba7", + "replaced_model_id": null + }, + "modelId": "chasemonster", + "@components": [ + { + "@type": "MOD.Core.TransformComponent", + "Position": { + "x": -0.5, + "y": 0.03499998, + "z": 999.999 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.StateAnimationComponent", + "ActionSheet": { + "stand": "4c264be6a64f4ac3970b2e6818d04e40", + "hit": "4c264be6a64f4ac3970b2e6818d04e40", + "die": "4c264be6a64f4ac3970b2e6818d04e40" + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteRendererComponent", + "ActionSheet": {}, + "EndFrameIndex": 0, + "RenderSetting": 1, + "SortingLayer": "MapLayer0", + "SpriteRUID": "4c264be6a64f4ac3970b2e6818d04e40", + "StartFrameIndex": 0, + "Enable": true + }, + { + "@type": "MOD.Core.StateComponent", + "IsLegacy": false, + "Enable": true + }, + { + "@type": "MOD.Core.TouchReceiveComponent", + "Enable": true, + "AutoFitToSize": true + }, + { + "@type": "script.LobbyNpc", + "Enable": true, + "NpcId": "codex", + "MarkName": "NpcCodexMark" + } + ], + "@version": 1 + } + }, + { + "id": "000dbba8-0000-4000-8000-0000000dbba8", + "path": "/maps/lobby/NpcCodexMark", + "componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.StateComponent", + "jsonString": { + "name": "NpcCodexMark", + "path": "/maps/lobby/NpcCodexMark", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": false, + "displayOrder": 4, + "pathConstraints": "///", + "revision": 2, + "origin": { + "type": "Model", + "entry_id": "ChaseMonster", + "sub_entity_id": null, + "root_entity_id": "000dbba8-0000-4000-8000-0000000dbba8", + "replaced_model_id": null + }, + "modelId": "chasemonster", + "@components": [ + { + "@type": "MOD.Core.TransformComponent", + "Position": { + "x": -0.5, + "y": 1.6349999800000001, + "z": 999.999 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.StateAnimationComponent", + "ActionSheet": { + "stand": "bd4afdde295f40318fceb4166978ebaa", + "hit": "bd4afdde295f40318fceb4166978ebaa", + "die": "bd4afdde295f40318fceb4166978ebaa" + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteRendererComponent", + "ActionSheet": {}, + "EndFrameIndex": 0, + "RenderSetting": 1, + "SortingLayer": "MapLayer0", + "SpriteRUID": "bd4afdde295f40318fceb4166978ebaa", + "StartFrameIndex": 0, + "Enable": true + }, + { + "@type": "MOD.Core.StateComponent", + "IsLegacy": false, + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "000dbba9-0000-4000-8000-0000000dbba9", + "path": "/maps/lobby/NpcShop", + "componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.StateComponent,MOD.Core.TouchReceiveComponent,script.LobbyNpc", + "jsonString": { + "name": "NpcShop", + "path": "/maps/lobby/NpcShop", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": false, + "displayOrder": 4, + "pathConstraints": "///", + "revision": 2, + "origin": { + "type": "Model", + "entry_id": "ChaseMonster", + "sub_entity_id": null, + "root_entity_id": "000dbba9-0000-4000-8000-0000000dbba9", + "replaced_model_id": null + }, + "modelId": "chasemonster", + "@components": [ + { + "@type": "MOD.Core.TransformComponent", + "Position": { + "x": 2, + "y": 0.03499998, + "z": 999.999 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.StateAnimationComponent", + "ActionSheet": { + "stand": "69987ccdc486423f8bedd786bd6cb5d9", + "hit": "69987ccdc486423f8bedd786bd6cb5d9", + "die": "69987ccdc486423f8bedd786bd6cb5d9" + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteRendererComponent", + "ActionSheet": {}, + "EndFrameIndex": 0, + "RenderSetting": 1, + "SortingLayer": "MapLayer0", + "SpriteRUID": "69987ccdc486423f8bedd786bd6cb5d9", + "StartFrameIndex": 0, + "Enable": true + }, + { + "@type": "MOD.Core.StateComponent", + "IsLegacy": false, + "Enable": true + }, + { + "@type": "MOD.Core.TouchReceiveComponent", + "Enable": true, + "AutoFitToSize": true + }, + { + "@type": "script.LobbyNpc", + "Enable": true, + "NpcId": "shop", + "MarkName": "NpcShopMark" + } + ], + "@version": 1 + } + }, + { + "id": "000dbbaa-0000-4000-8000-0000000dbbaa", + "path": "/maps/lobby/NpcShopMark", + "componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.StateComponent", + "jsonString": { + "name": "NpcShopMark", + "path": "/maps/lobby/NpcShopMark", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": false, + "displayOrder": 4, + "pathConstraints": "///", + "revision": 2, + "origin": { + "type": "Model", + "entry_id": "ChaseMonster", + "sub_entity_id": null, + "root_entity_id": "000dbbaa-0000-4000-8000-0000000dbbaa", + "replaced_model_id": null + }, + "modelId": "chasemonster", + "@components": [ + { + "@type": "MOD.Core.TransformComponent", + "Position": { + "x": 2, + "y": 1.6349999800000001, + "z": 999.999 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.StateAnimationComponent", + "ActionSheet": { + "stand": "bd4afdde295f40318fceb4166978ebaa", + "hit": "bd4afdde295f40318fceb4166978ebaa", + "die": "bd4afdde295f40318fceb4166978ebaa" + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteRendererComponent", + "ActionSheet": {}, + "EndFrameIndex": 0, + "RenderSetting": 1, + "SortingLayer": "MapLayer0", + "SpriteRUID": "bd4afdde295f40318fceb4166978ebaa", + "StartFrameIndex": 0, + "Enable": true + }, + { + "@type": "MOD.Core.StateComponent", + "IsLegacy": false, + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "000dbbab-0000-4000-8000-0000000dbbab", + "path": "/maps/lobby/NpcBoard", + "componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.StateComponent,MOD.Core.TouchReceiveComponent,script.LobbyNpc", + "jsonString": { + "name": "NpcBoard", + "path": "/maps/lobby/NpcBoard", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": false, + "displayOrder": 4, + "pathConstraints": "///", + "revision": 2, + "origin": { + "type": "Model", + "entry_id": "ChaseMonster", + "sub_entity_id": null, + "root_entity_id": "000dbbab-0000-4000-8000-0000000dbbab", + "replaced_model_id": null + }, + "modelId": "chasemonster", + "@components": [ + { + "@type": "MOD.Core.TransformComponent", + "Position": { + "x": 4.5, + "y": 0.03499998, + "z": 999.999 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.StateAnimationComponent", + "ActionSheet": { + "stand": "8a99bd87d667482cb1f3b2193f8a19c1", + "hit": "8a99bd87d667482cb1f3b2193f8a19c1", + "die": "8a99bd87d667482cb1f3b2193f8a19c1" + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteRendererComponent", + "ActionSheet": {}, + "EndFrameIndex": 0, + "RenderSetting": 1, + "SortingLayer": "MapLayer0", + "SpriteRUID": "8a99bd87d667482cb1f3b2193f8a19c1", + "StartFrameIndex": 0, + "Enable": true + }, + { + "@type": "MOD.Core.StateComponent", + "IsLegacy": false, + "Enable": true + }, + { + "@type": "MOD.Core.TouchReceiveComponent", + "Enable": true, + "AutoFitToSize": true + }, + { + "@type": "script.LobbyNpc", + "Enable": true, + "NpcId": "board", + "MarkName": "NpcBoardMark" + } + ], + "@version": 1 + } + }, + { + "id": "000dbbac-0000-4000-8000-0000000dbbac", + "path": "/maps/lobby/NpcBoardMark", + "componentNames": "MOD.Core.TransformComponent,MOD.Core.StateAnimationComponent,MOD.Core.SpriteRendererComponent,MOD.Core.StateComponent", + "jsonString": { + "name": "NpcBoardMark", + "path": "/maps/lobby/NpcBoardMark", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": false, + "displayOrder": 4, + "pathConstraints": "///", + "revision": 2, + "origin": { + "type": "Model", + "entry_id": "ChaseMonster", + "sub_entity_id": null, + "root_entity_id": "000dbbac-0000-4000-8000-0000000dbbac", + "replaced_model_id": null + }, + "modelId": "chasemonster", + "@components": [ + { + "@type": "MOD.Core.TransformComponent", + "Position": { + "x": 4.5, + "y": 1.6349999800000001, + "z": 999.999 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.StateAnimationComponent", + "ActionSheet": { + "stand": "bd4afdde295f40318fceb4166978ebaa", + "hit": "bd4afdde295f40318fceb4166978ebaa", + "die": "bd4afdde295f40318fceb4166978ebaa" + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteRendererComponent", + "ActionSheet": {}, + "EndFrameIndex": 0, + "RenderSetting": 1, + "SortingLayer": "MapLayer0", + "SpriteRUID": "bd4afdde295f40318fceb4166978ebaa", + "StartFrameIndex": 0, + "Enable": true + }, + { + "@type": "MOD.Core.StateComponent", + "IsLegacy": false, + "Enable": true + } + ], + "@version": 1 + } + } + ] + } +} \ No newline at end of file diff --git a/tools/deck/gen-slaydeck.mjs b/tools/deck/gen-slaydeck.mjs index 9ea581d..8d3296f 100644 --- a/tools/deck/gen-slaydeck.mjs +++ b/tools/deck/gen-slaydeck.mjs @@ -2425,17 +2425,17 @@ function upsertUi() { displayOrder: 11, components: [ transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 1920, y: 1080 }, pos: { x: 0, y: 0 }, align: ALIGN_CENTER }), - sprite({ color: { r: 0.07, g: 0.08, b: 0.13, a: 1 }, type: 1, raycast: true }), + // 로비가 물리 맵이 됨 — 투명 + 비레이캐스트로 맵을 가리지 않고 월드 NPC 클릭이 통과되게 함. + sprite({ color: TRANSPARENT, type: 1, raycast: false }), ], }); lobbyRoot.jsonString.enable = false; lobby.push(lobbyRoot); const lobTexts = [ - ['Title', 0, 470, 760, '메이플 로비', 48, GOLD], - ['Subtitle', 0, 408, 900, 'NPC를 클릭해 런을 준비하세요', 24, { r: 0.82, g: 0.86, b: 0.92, a: 1 }], - ['SoulLabel', 700, 470, 320, '영혼 0', 28, { r: 0.6, g: 0.85, b: 1, a: 1 }], - ['AscLabel', -560, 470, 380, '승천 0 / 해금 0', 22, { r: 0.9, g: 0.7, b: 0.5, a: 1 }], - ['Hint', 0, -430, 1300, '런을 클리어하거나 패배하면 로비로 돌아옵니다', 20, { r: 0.6, g: 0.64, b: 0.7, a: 1 }], + ['Title', 0, 478, 760, '메이플 로비', 40, GOLD], + ['SoulLabel', 700, 478, 320, '영혼 0', 28, { r: 0.6, g: 0.85, b: 1, a: 1 }], + ['AscLabel', -560, 478, 380, '승천 0 / 해금 0', 22, { r: 0.9, g: 0.7, b: 0.5, a: 1 }], + ['Hint', 0, -478, 1500, 'NPC에게 다가가 ↑ 또는 클릭으로 대화 · ← → 이동 · Ctrl 공격', 20, { r: 0.72, g: 0.76, b: 0.82, a: 1 }], ]; for (const [suffix, x, y, w, value, fs, color] of lobTexts) { lobby.push(entity({ @@ -2466,62 +2466,7 @@ function upsertUi() { ], })); } - const npcs = [ - { key: 'NpcRun', x: -540, name: '모험가', role: '런 시작', tint: { r: 0.74, g: 0.32, b: 0.28, a: 1 } }, - { key: 'NpcCodex', x: -180, name: '사서', role: '카드 도감', tint: { r: 0.3, g: 0.55, b: 0.5, a: 1 } }, - { key: 'NpcShop', x: 180, name: '상인', role: '영혼 상점', tint: { r: 0.55, g: 0.45, b: 0.75, a: 1 } }, - { key: 'NpcBoard', x: 540, name: '안내원', role: '게시판', tint: { r: 0.4, g: 0.5, b: 0.7, a: 1 } }, - ]; - for (const npc of npcs) { - const base = `/ui/DefaultGroup/LobbyHud/${npc.key}`; - lobby.push(entity({ - id: guid('lob', lobId++), - path: base, - modelId: 'uibutton', entryId: 'UIButton', - componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent', - displayOrder: 4, - components: [ - transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 240, y: 320 }, pos: { x: npc.x, y: 20 }, align: ALIGN_CENTER }), - sprite({ color: { r: 0.13, g: 0.15, b: 0.2, a: 1 }, type: 1, raycast: true }), - button(), - ], - })); - lobby.push(entity({ - id: guid('lob', lobId++), - path: `${base}/Figure`, - modelId: 'uisprite', entryId: 'UISprite', - componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', - displayOrder: 1, - components: [ - transform({ parentW: 240, parentH: 320, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 130, y: 130 }, pos: { x: 0, y: 30 } }), - sprite({ color: npc.tint, type: 1 }), - ], - })); - lobby.push(entity({ - id: guid('lob', lobId++), - path: `${base}/Name`, - modelId: 'uitext', entryId: 'UIText', - componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', - displayOrder: 2, - components: [ - transform({ parentW: 240, parentH: 320, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 220, y: 40 }, pos: { x: 0, y: 122 } }), - sprite({ color: TRANSPARENT }), - text({ value: npc.name, fontSize: 28, bold: true, color: GOLD, alignment: 4 }), - ], - })); - lobby.push(entity({ - id: guid('lob', lobId++), - path: `${base}/Role`, - modelId: 'uitext', entryId: 'UIText', - componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', - displayOrder: 2, - components: [ - transform({ parentW: 240, parentH: 320, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 220, y: 36 }, pos: { x: 0, y: -122 } }), - sprite({ color: TRANSPARENT }), - text({ value: npc.role, fontSize: 22, bold: false, color: { r: 0.86, g: 0.9, b: 0.94, a: 1 }, alignment: 4 }), - ], - })); - } + // NPC 4종은 로비 물리 맵의 월드 엔티티(map/lobby.map + LobbyNpc codeblock)로 이동. UI 버튼 행 제거. emit('LobbyHud', lobby); // ── BoardHud — 게시판(공지/팁) ── @@ -2743,6 +2688,8 @@ function writeCodeblocks() { const RELIC_PRICE = 60; const ACT_COUNT = 5; const ACT_MAPS = ['map01', 'map02', 'map03', 'map04', 'map05']; + const LOBBY_MAP = 'lobby'; + const LOBBY_SPAWN = 'Vector3(-5, 0.03, 0)'; // 정찰: map01 지면 좌측 const combat = codeblock('SlayDeckController', 'SlayDeckController', [ prop('any', 'DrawPile'), prop('any', 'DiscardPile'), @@ -2771,6 +2718,7 @@ function writeCodeblocks() { prop('any', 'AllDeckCloseHandler'), prop('number', 'SoulPoints', '0'), prop('boolean', 'LobbyBound', 'false'), + prop('number', 'LobbyTpTries', '0'), prop('boolean', 'CodexMode', 'false'), prop('any', 'CodexCards'), prop('any', 'SoulUnlocks'), @@ -2837,7 +2785,15 @@ local lp = _UserService.LocalPlayer if lp ~= nil then self:ReqLoadAscension(lp.PlayerComponent.UserId) self:ReqLoadSouls(lp.PlayerComponent.UserId) -end`), +end +_InputService:ConnectEvent(KeyDownEvent, function(e) + if e.key == KeyboardKey.LeftControl then + local lp2 = _UserService.LocalPlayer + if lp2 ~= nil and lp2.CurrentMapName == "${LOBBY_MAP}" and self.RunActive ~= true then + self:PlayerAttackMotion() + end + end +end)`), method('ReqLoadAscension', `local ds = _DataStorageService:GetUserDataStorage(userId) local errCode, value = ds:GetAndWait("ascensionUnlocked") local n = 0 @@ -2990,7 +2946,35 @@ self:ShowState("lobby") self:SetEntityEnabled("/ui/DefaultGroup/BoardHud", false) self:SetEntityEnabled("/ui/DefaultGroup/SoulShopHud", false) self:BindLobbyButtons() -self:BindMenuButtons()`), +self:BindMenuButtons() +self:GoLobbyMap()`), + method('GoLobbyMap', `self.LobbyTpTries = 0 +local eventId = 0 +local function go() + self.LobbyTpTries = self.LobbyTpTries + 1 + local lp = _UserService.LocalPlayer + if lp ~= nil then + if lp.CurrentMapName ~= "${LOBBY_MAP}" then + _TeleportService:TeleportToMapPosition(lp, ${LOBBY_SPAWN}, "${LOBBY_MAP}") + end + _TimerService:ClearTimer(eventId) + elseif self.LobbyTpTries > 50 then + _TimerService:ClearTimer(eventId) + end +end +eventId = _TimerService:SetTimerRepeat(go, 0.1)`), + method('OnLobbyNpcInteract', `if self.RunActive == true then + return +end +if id == "run" then + self:ShowCharacterSelect() +elseif id == "codex" then + self:ShowCodex() +elseif id == "shop" then + self:ShowSoulShop() +elseif id == "board" then + self:ShowBoard() +end`, [{ Type: 'string', DefaultValue: '""', SyncDirection: 0, Attributes: [], Name: 'id' }]), method('RenderSoulLabel', `local s = self.SoulPoints or 0 self:SetText("/ui/DefaultGroup/LobbyHud/SoulLabel", "영혼 " .. string.format("%d", s)) self:SetText("/ui/DefaultGroup/SoulShopHud/Souls", "영혼 " .. string.format("%d", s))`), @@ -3004,10 +2988,6 @@ local function bindClick(path, fn) e:ConnectEvent(ButtonClickEvent, fn) end end -bindClick("/ui/DefaultGroup/LobbyHud/NpcRun", function() self:ShowCharacterSelect() end) -bindClick("/ui/DefaultGroup/LobbyHud/NpcCodex", function() self:ShowCodex() end) -bindClick("/ui/DefaultGroup/LobbyHud/NpcShop", function() self:ShowSoulShop() end) -bindClick("/ui/DefaultGroup/LobbyHud/NpcBoard", function() self:ShowBoard() end) bindClick("/ui/DefaultGroup/LobbyHud/AscMinus", function() self:AdjustAscension(-1) end) bindClick("/ui/DefaultGroup/LobbyHud/AscPlus", function() self:AdjustAscension(1) end) bindClick("/ui/DefaultGroup/BoardHud/Close", function() self:CloseBoard() end) @@ -3229,6 +3209,7 @@ self:BindButtons() self:AddRelic("${RELICS.startingRelic}") self:ApplySoulUnlocks() self:RenderPotions() +self:TeleportToActMap() self:ShowMap()`), method('StartCombat', `self:ShowState("combat") self:SetEntityEnabled("/ui/DefaultGroup/CombatHud/Result", false) diff --git a/tools/map/gen-lobby-map.mjs b/tools/map/gen-lobby-map.mjs new file mode 100644 index 0000000..f949865 --- /dev/null +++ b/tools/map/gen-lobby-map.mjs @@ -0,0 +1,141 @@ +import { readFileSync, writeFileSync } from 'node:fs'; + +// 로비 전용 맵 생성기 — map01 템플릿을 클론해 마을(타운) 배경의 로비 맵을 만든다. +// · 몬스터 엔티티 전부 제거(전투 없음) +// · NPC 4종(모험가/사서/상인/안내원) 월드 엔티티 배치 + 머리 위 마크(근접 시 표시) +// · 각 NPC: TouchReceiveComponent(클릭) + script.LobbyNpc(NpcId) +// · 맵 루트: script.PlayerLock 제거(이동 허용) + script.LobbyMobility 추가(이동·공격 해제) +// · SectorConfig에 map://lobby 등록 +// codeblock 로직(LobbyNpc/LobbyMobility)은 tools/player/gen-lobby-npc.mjs가 emit한다. +const TEMPLATE = 'map/map01.map'; +const OUT = 'map/lobby.map'; +const SECTOR = 'Global/SectorConfig.config'; + +const TOWN_BG = '65c4167ea7484196b890022354e5a4a4'; // Henesys (gen-maps.mjs BACKGROUNDS 풀) +const MARK_RUID = 'bd4afdde295f40318fceb4166978ebaa'; // 공식 maplestory balloon (근접 마크) + +// NPC 4종: x좌표는 정찰 기준 walkable 범위[-5,6.6], 근접 임계 1.2와 분리되게 배치 +const NPCS = [ + { name: 'NpcRun', id: 'run', x: -3.0, ruid: '122095fd155c4633867b0da4f375bc3c' }, // 모험가 + { name: 'NpcCodex', id: 'codex', x: -0.5, ruid: '4c264be6a64f4ac3970b2e6818d04e40' }, // 사서 + { name: 'NpcShop', id: 'shop', x: 2.0, ruid: '69987ccdc486423f8bedd786bd6cb5d9' }, // 상인 + { name: 'NpcBoard', id: 'board', x: 4.5, ruid: '8a99bd87d667482cb1f3b2193f8a19c1' }, // 안내원 +]; +const MARK_DY = 1.6; // NPC 머리 위 오프셋 + +// NPC/마크는 정적 스프라이트로 만든다 — 몬스터 AI·물리(중력/충돌)·히트 컴포넌트 전부 제거. +// (마크는 물리가 있으면 머리 위에서 떨어지고, NPC는 충돌이 있으면 플레이어 통행을 막음) +const STRIP = new Set([ + 'script.Monster', 'script.MonsterAttack', 'script.CombatMonster', + 'MOD.Core.RigidbodyComponent', 'MOD.Core.MovementComponent', 'MOD.Core.KinematicbodyComponent', + 'MOD.Core.SideviewbodyComponent', 'MOD.Core.HitComponent', + 'MOD.Core.DamageSkinSpawnerComponent', 'MOD.Core.DamageSkinSettingComponent', +]); + +const compOf = (e, type) => e.jsonString['@components'].find((c) => c['@type'] === type); +const isMonster = (e) => (e.componentNames || '').includes('script.Monster'); + +// 결정론 GUID — 기존 생성기(map: nn*1000+idx, enc: +500)와 충돌 없는 고유 오프셋 +function lobbyGuid(idx) { + const n = (900000 + idx) >>> 0; + return `${n.toString(16).padStart(8, '0')}-0000-4000-8000-${n.toString(16).padStart(12, '0')}`; +} + +// 몬스터 템플릿 엔티티를 클론해 스프라이트 엔티티(NPC/마크)로 변환 +function makeSpriteEntity(base, name, x, y, ruid, withInteract, npcId) { + const m = JSON.parse(JSON.stringify(base)); + m.jsonString.name = name; + m.path = `/maps/lobby/${name}`; + m.jsonString.path = m.path; + // NOTE: 베이스 모델(chasemonster)이 script.Monster/MonsterAttack를 inheritance로 끌고 와서 + // DuplicateComponent(LobbyNpc와 공존) 경고 + MonsterAttack.OnBeginPlay AnimationClip 에러가 뜬다. + // 둘 다 비치명적(로비엔 전투 컨텍스트가 없어 Monster는 휴면, 에러는 전투맵 몬스터와 공유되는 기존 lint). + // modelId를 비우면 fresh load에서 렌더가 깨질 위험이 있어 proven-good(모델 유지)로 둔다. + const tr = compOf(m, 'MOD.Core.TransformComponent'); + if (tr) { tr.Position.x = x; tr.Position.y = y; } + const sp = compOf(m, 'MOD.Core.SpriteRendererComponent'); + if (sp) sp.SpriteRUID = ruid; + const sa = compOf(m, 'MOD.Core.StateAnimationComponent'); + if (sa) sa.ActionSheet = { stand: ruid, hit: ruid, die: ruid }; // 항상 stand 스프라이트 고정 + // 몬스터 AI·물리·히트 컴포넌트 제거 → 정적 비충돌 스프라이트 + m.jsonString['@components'] = m.jsonString['@components'].filter((c) => !STRIP.has(c['@type'])); + let names = (m.componentNames || '').split(',').filter((s) => s && !STRIP.has(s)); + if (withInteract) { + m.jsonString['@components'].push({ '@type': 'MOD.Core.TouchReceiveComponent', Enable: true, AutoFitToSize: true }); + m.jsonString['@components'].push({ '@type': 'script.LobbyNpc', Enable: true, NpcId: npcId, MarkName: name + 'Mark' }); + names.push('MOD.Core.TouchReceiveComponent', 'script.LobbyNpc'); + } + m.componentNames = names.join(','); + return m; +} + +const template = JSON.parse(readFileSync(TEMPLATE, 'utf8')); +const monsterTemplates = template.ContentProto.Entities.filter(isMonster); +if (monsterTemplates.length === 0) throw new Error('[gen-lobby-map] 몬스터 템플릿(스프라이트 엔티티) 없음'); +const base = monsterTemplates.find((e) => (e.path || '').includes('Static')) || monsterTemplates[0]; +const baseY = (() => { + const tr = compOf(base, 'MOD.Core.TransformComponent'); + return tr ? tr.Position.y : 0; +})(); + +const map = JSON.parse(JSON.stringify(template)); // deep clone +map.EntryKey = 'map://lobby'; +let ents = map.ContentProto.Entities.filter((e) => !isMonster(e)); + +// 경로/이름 치환 + 배경 + 루트 컴포넌트 조정 +for (const e of ents) { + if (typeof e.path === 'string') e.path = e.path.replace('/maps/map01', '/maps/lobby'); + if (e.jsonString) { + if (typeof e.jsonString.path === 'string') e.jsonString.path = e.jsonString.path.replace('/maps/map01', '/maps/lobby'); + if (e.jsonString.name === 'map01') e.jsonString.name = 'lobby'; + } + if ((e.path || '').endsWith('/Background')) { + const bg = compOf(e, 'MOD.Core.BackgroundComponent'); + if (bg) bg.TemplateRUID = TOWN_BG; + } +} + +const root = ents.find((e) => e.path === '/maps/lobby'); +if (!root) throw new Error('[gen-lobby-map] 맵 루트 없음'); +// 로비엔 PlayerLock 제거(이동 허용) + LobbyMobility 추가(이동·공격 해제). MapCamera는 유지. +root.jsonString['@components'] = root.jsonString['@components'].filter( + (c) => !['script.PlayerLock', 'script.LobbyMobility'].includes(c['@type']), +); +root.jsonString['@components'].push({ '@type': 'script.LobbyMobility', Enable: true }); +{ + const names = (root.componentNames || '') + .split(',') + .filter((s) => s && !['script.PlayerLock', 'script.LobbyMobility'].includes(s)); + names.push('script.LobbyMobility'); + root.componentNames = names.join(','); +} + +// NPC + 마크 엔티티 생성 +for (const npc of NPCS) { + ents.push(makeSpriteEntity(base, npc.name, npc.x, baseY, npc.ruid, true, npc.id)); + ents.push(makeSpriteEntity(base, npc.name + 'Mark', npc.x, baseY + MARK_DY, MARK_RUID, false, '')); +} + +// GUID 전부 재발급 (map01과 충돌 방지 + 자기참조 origin 보정) +ents.forEach((e, idx) => { + const oldId = e.id; + const newId = lobbyGuid(idx); + e.id = newId; + const o = e.jsonString && e.jsonString.origin; + if (o) { + if (o.root_entity_id === oldId) o.root_entity_id = newId; + if (o.sub_entity_id === oldId) o.sub_entity_id = newId; + } +}); + +map.ContentProto.Entities = ents; +writeFileSync(OUT, JSON.stringify(map, null, 2), 'utf8'); + +// SectorConfig 등록 (멱등) +const sector = JSON.parse(readFileSync(SECTOR, 'utf8')); +const sec0 = sector.ContentProto.Json.Sectors[0]; +if (!sec0.entries.includes('map://lobby')) sec0.entries.push('map://lobby'); +writeFileSync(SECTOR, JSON.stringify(sector, null, 2), 'utf8'); + +const npcCount = ents.filter((e) => (e.componentNames || '').includes('script.LobbyNpc')).length; +console.log(`[gen-lobby-map] lobby.map 생성: NPC ${npcCount}종 + 마크, SectorConfig entries ${sec0.entries.length}`); diff --git a/tools/player/gen-lobby-npc.mjs b/tools/player/gen-lobby-npc.mjs new file mode 100644 index 0000000..d968c21 --- /dev/null +++ b/tools/player/gen-lobby-npc.mjs @@ -0,0 +1,103 @@ +import { writeFileSync } from 'node:fs'; + +// 로비 codeblock 2종 emit (맵/엔티티 부착은 tools/map/gen-lobby-map.mjs 소관): +// · LobbyNpc — NPC 엔티티에 부착. 근접 폴링→머리위 마크 토글, TouchEvent(클릭)/UpArrow(근접)→Interact→컨트롤러 호출. +// · LobbyMobility — 로비 맵 루트에 부착. 진입 시 플레이어 이동 잠금 해제(정찰 확정: WalkAcceleration이 진짜 레버). +// 공격 키(LeftControl) 바인딩은 SlayDeckController(/common, 1회 등록·로비 가드)에서 처리 — 여기 두지 않음. +// 정찰: 이동에는 RigidbodyComponent.WalkAcceleration(가속)과 MovementComponent.InputSpeed(속도)가 +// 둘 다 양수여야 함 — freeze-turn-player가 둘 다 0으로 만들었으므로 둘 다 복원해야 걷는다(실측 확인). +// 값은 freeze가 건드리지 않은 intact RigidbodyComponent.WalkSpeed(1.4)/WalkJump(1.23) = 기본값에 맞춤. +// (실측: InputSpeed 1.4→보행 ~2.5u/s, JumpForce 1.23→점프 상승 1.79u. 이전 5/5는 ~9u/s·상승 14u로 과함.) +const WALK_ACCEL = 0.7; +const WALK_SPEED = 1.4; +const JUMP_FORCE = 1.23; +const PROX = 1.2; // 근접 임계(맵 NPC 간격 2.5와 분리) + +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(name, properties, methods) { + const cb = { + Id: '', GameId: '', EntryKey: `codeblock://${name.toLowerCase()}`, 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: name, Language: 1, Name: name, Type: 1, Source: 0, Target: null, + Properties: properties, Methods: methods, EntityEventHandlers: [], + } }, + }; + writeFileSync(`RootDesk/MyDesk/${name}.codeblock`, JSON.stringify(cb, null, 2) + '\n', 'utf8'); +} + +// ── LobbyNpc ────────────────────────────────────────────────────────────── +const npcInteract = method('Interact', `local c = _EntityService:GetEntityByPath("/common") +if c ~= nil and c.SlayDeckController ~= nil then + c.SlayDeckController:OnLobbyNpcInteract(self.NpcId) +end`); + +const npcBegin = method('OnBeginPlay', `self.InRange = false +local mark = _EntityService:GetEntityByPath("/maps/lobby/" .. self.MarkName) +if mark ~= nil then mark:SetVisible(false) end +self.Entity:ConnectEvent(TouchEvent, function(e) + self:Interact() +end) +_InputService:ConnectEvent(KeyDownEvent, function(e) + if self.InRange and e.key == KeyboardKey.UpArrow then + self:Interact() + end +end) +local eventId = 0 +local function tick() + local lp = _UserService.LocalPlayer + if lp == nil then return end + if mark == nil then mark = _EntityService:GetEntityByPath("/maps/lobby/" .. self.MarkName) end + local a = lp.TransformComponent.WorldPosition + local b = self.Entity.TransformComponent.WorldPosition + local d = Vector2.Distance(Vector2(a.x, a.y), Vector2(b.x, b.y)) + local near = d < ${PROX} + if near ~= self.InRange then + self.InRange = near + if mark ~= nil then mark:SetVisible(near) end + end +end +eventId = _TimerService:SetTimerRepeat(tick, 0.15)`); + +writeCodeblock('LobbyNpc', [ + prop('string', 'NpcId', '""'), + prop('string', 'MarkName', '""'), + prop('boolean', 'InRange', 'false'), +], [npcBegin, npcInteract]); + +// ── LobbyMobility ───────────────────────────────────────────────────────── +const mobBegin = method('OnBeginPlay', `self.Tries = 0 +local eventId = 0 +local function apply() + self.Tries = self.Tries + 1 + local lp = _UserService.LocalPlayer + if lp ~= nil and lp.PlayerControllerComponent ~= nil then + local pc = lp.PlayerControllerComponent + pc.Enable = true + pc.FixedLookAt = 0 + local rb = lp.RigidbodyComponent + if rb ~= nil then rb.WalkAcceleration = ${WALK_ACCEL} end + local mv = lp.MovementComponent + if mv ~= nil then + mv.InputSpeed = ${WALK_SPEED} + mv.JumpForce = ${JUMP_FORCE} + end + _TimerService:ClearTimer(eventId) + elseif self.Tries > 50 then + _TimerService:ClearTimer(eventId) + end +end +eventId = _TimerService:SetTimerRepeat(apply, 0.1)`); + +writeCodeblock('LobbyMobility', [prop('number', 'Tries', '0')], [mobBegin]); + +console.log('[gen-lobby-npc] LobbyNpc / LobbyMobility codeblock 생성 완료'); diff --git a/tools/player/gen-player-lock.mjs b/tools/player/gen-player-lock.mjs index 0120cff..80bf445 100644 --- a/tools/player/gen-player-lock.mjs +++ b/tools/player/gen-player-lock.mjs @@ -65,6 +65,10 @@ local function apply() pc.FixedLookAt = ${FIXED_LOOK_AT} pc.Enable = ${CONTROLLER_ENABLE} end + if lp ~= nil then + if lp.RigidbodyComponent ~= nil then lp.RigidbodyComponent.WalkAcceleration = 0 end + if lp.MovementComponent ~= nil then lp.MovementComponent.InputSpeed = 0; lp.MovementComponent.JumpForce = 0 end + end if pc ~= nil then _TimerService:ClearTimer(eventId) elseif self.LockTries > 30 then diff --git a/ui/DefaultGroup.ui b/ui/DefaultGroup.ui index 085e0b3..fac51a9 100644 --- a/ui/DefaultGroup.ui +++ b/ui/DefaultGroup.ui @@ -235671,10 +235671,10 @@ "PreserveSprite": 0, "StartFrameIndex": 0, "Color": { - "r": 0.07, - "g": 0.08, - "b": 0.13, - "a": 1 + "r": 0, + "g": 0, + "b": 0, + "a": 0 }, "DropShadow": false, "DropShadowAngle": 30, @@ -235703,7 +235703,7 @@ "a": 1 }, "OutlineWidth": 3, - "RaycastTarget": true, + "RaycastTarget": false, "Type": 1, "Enable": true } @@ -235749,11 +235749,11 @@ "MobileOnly": false, "OffsetMax": { "x": 380, - "y": 498 + "y": 506 }, "OffsetMin": { "x": -380, - "y": 442 + "y": 450 }, "Pivot": { "x": 0.5, @@ -235772,11 +235772,11 @@ "UIVersion": 2, "anchoredPosition": { "x": 0, - "y": 470 + "y": 478 }, "Position": { "x": 0, - "y": 470, + "y": 478, "z": 0 }, "QuaternionRotation": { @@ -235868,8 +235868,8 @@ "b": 0.26, "a": 1 }, - "FontSize": 48, - "MaxSize": 48, + "FontSize": 40, + "MaxSize": 40, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -235901,194 +235901,6 @@ }, { "id": "0e900002-0000-4000-8000-00000e900002", - "path": "/ui/DefaultGroup/LobbyHud/Subtitle", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", - "jsonString": { - "name": "Subtitle", - "path": "/ui/DefaultGroup/LobbyHud/Subtitle", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 1, - "pathConstraints": "////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIText", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uitext", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 450, - "y": 436 - }, - "OffsetMin": { - "x": -450, - "y": 380 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 900, - "y": 56 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 0, - "y": 408 - }, - "Position": { - "x": 0, - "y": 408, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0, - "g": 0, - "b": 0, - "a": 0 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.TextComponent", - "Alignment": 4, - "Bold": true, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "Font": 0, - "FontColor": { - "r": 0.82, - "g": 0.86, - "b": 0.92, - "a": 1 - }, - "FontSize": 24, - "MaxSize": 24, - "MinSize": 8, - "OutlineColor": { - "r": 0.08, - "g": 0.08, - "b": 0.08, - "a": 1 - }, - "OutlineDistance": { - "x": 1, - "y": -1 - }, - "OutlineWidth": 1, - "Overflow": 0, - "OverrideSorting": false, - "Padding": { - "left": 0, - "right": 0, - "top": 0, - "bottom": 0 - }, - "SizeFit": false, - "Text": "NPC를 클릭해 런을 준비하세요", - "UseOutLine": true, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e900003-0000-4000-8000-00000e900003", "path": "/ui/DefaultGroup/LobbyHud/SoulLabel", "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", "jsonString": { @@ -236125,11 +235937,11 @@ "MobileOnly": false, "OffsetMax": { "x": 860, - "y": 498 + "y": 506 }, "OffsetMin": { "x": 540, - "y": 442 + "y": 450 }, "Pivot": { "x": 0.5, @@ -236148,11 +235960,11 @@ "UIVersion": 2, "anchoredPosition": { "x": 700, - "y": 470 + "y": 478 }, "Position": { "x": 700, - "y": 470, + "y": 478, "z": 0 }, "QuaternionRotation": { @@ -236276,7 +236088,7 @@ } }, { - "id": "0e900004-0000-4000-8000-00000e900004", + "id": "0e900003-0000-4000-8000-00000e900003", "path": "/ui/DefaultGroup/LobbyHud/AscLabel", "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", "jsonString": { @@ -236313,11 +236125,11 @@ "MobileOnly": false, "OffsetMax": { "x": -370, - "y": 498 + "y": 506 }, "OffsetMin": { "x": -750, - "y": 442 + "y": 450 }, "Pivot": { "x": 0.5, @@ -236336,11 +236148,11 @@ "UIVersion": 2, "anchoredPosition": { "x": -560, - "y": 470 + "y": 478 }, "Position": { "x": -560, - "y": 470, + "y": 478, "z": 0 }, "QuaternionRotation": { @@ -236464,7 +236276,7 @@ } }, { - "id": "0e900005-0000-4000-8000-00000e900005", + "id": "0e900004-0000-4000-8000-00000e900004", "path": "/ui/DefaultGroup/LobbyHud/Hint", "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", "jsonString": { @@ -236500,19 +236312,19 @@ }, "MobileOnly": false, "OffsetMax": { - "x": 650, - "y": -402 + "x": 750, + "y": -450 }, "OffsetMin": { - "x": -650, - "y": -458 + "x": -750, + "y": -506 }, "Pivot": { "x": 0.5, "y": 0.5 }, "RectSize": { - "x": 1300, + "x": 1500, "y": 56 }, "UIMode": 1, @@ -236524,11 +236336,11 @@ "UIVersion": 2, "anchoredPosition": { "x": 0, - "y": -430 + "y": -478 }, "Position": { "x": 0, - "y": -430, + "y": -478, "z": 0 }, "QuaternionRotation": { @@ -236615,9 +236427,9 @@ "DropShadowDistance": 32, "Font": 0, "FontColor": { - "r": 0.6, - "g": 0.64, - "b": 0.7, + "r": 0.72, + "g": 0.76, + "b": 0.82, "a": 1 }, "FontSize": 20, @@ -236643,7 +236455,7 @@ "bottom": 0 }, "SizeFit": false, - "Text": "런을 클리어하거나 패배하면 로비로 돌아옵니다", + "Text": "NPC에게 다가가 ↑ 또는 클릭으로 대화 · ← → 이동 · Ctrl 공격", "UseOutLine": true, "Enable": true } @@ -236652,7 +236464,7 @@ } }, { - "id": "0e900006-0000-4000-8000-00000e900006", + "id": "0e900005-0000-4000-8000-00000e900005", "path": "/ui/DefaultGroup/LobbyHud/AscMinus", "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.TextComponent", "jsonString": { @@ -236887,7 +236699,7 @@ } }, { - "id": "0e900007-0000-4000-8000-00000e900007", + "id": "0e900006-0000-4000-8000-00000e900006", "path": "/ui/DefaultGroup/LobbyHud/AscPlus", "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.TextComponent", "jsonString": { @@ -237121,2826 +236933,6 @@ "@version": 1 } }, - { - "id": "0e900008-0000-4000-8000-00000e900008", - "path": "/ui/DefaultGroup/LobbyHud/NpcRun", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent", - "jsonString": { - "name": "NpcRun", - "path": "/ui/DefaultGroup/LobbyHud/NpcRun", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 4, - "pathConstraints": "////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIButton", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uibutton", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": -420, - "y": 180 - }, - "OffsetMin": { - "x": -660, - "y": -140 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 240, - "y": 320 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": -540, - "y": 20 - }, - "Position": { - "x": -540, - "y": 20, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0.13, - "g": 0.15, - "b": 0.2, - "a": 1 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": true, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.ButtonComponent", - "Colors": { - "NormalColor": { - "r": 1, - "g": 1, - "b": 1, - "a": 1 - }, - "HighlightedColor": { - "r": 0.9607843, - "g": 0.9607843, - "b": 0.9607843, - "a": 1 - }, - "PressedColor": { - "r": 0.784313738, - "g": 0.784313738, - "b": 0.784313738, - "a": 1 - }, - "SelectedColor": { - "r": 0.9607843, - "g": 0.9607843, - "b": 0.9607843, - "a": 1 - }, - "DisabledColor": { - "r": 0.784313738, - "g": 0.784313738, - "b": 0.784313738, - "a": 0.5019608 - }, - "ColorMultiplier": 1, - "FadeDuration": 0.1 - }, - "ImageRUIDs": { - "HighlightedSprite": null, - "PressedSprite": null, - "SelectedSprite": null, - "DisabledSprite": null - }, - "KeyCode": 0, - "OverrideSorting": false, - "Transition": 1, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e900009-0000-4000-8000-00000e900009", - "path": "/ui/DefaultGroup/LobbyHud/NpcRun/Figure", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent", - "jsonString": { - "name": "Figure", - "path": "/ui/DefaultGroup/LobbyHud/NpcRun/Figure", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 1, - "pathConstraints": "/////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UISprite", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uisprite", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 65, - "y": 95 - }, - "OffsetMin": { - "x": -65, - "y": -35 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 130, - "y": 130 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 0, - "y": 30 - }, - "Position": { - "x": 0, - "y": 30, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0.74, - "g": 0.32, - "b": 0.28, - "a": 1 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e90000a-0000-4000-8000-00000e90000a", - "path": "/ui/DefaultGroup/LobbyHud/NpcRun/Name", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", - "jsonString": { - "name": "Name", - "path": "/ui/DefaultGroup/LobbyHud/NpcRun/Name", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 2, - "pathConstraints": "/////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIText", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uitext", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 110, - "y": 142 - }, - "OffsetMin": { - "x": -110, - "y": 102 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 220, - "y": 40 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 0, - "y": 122 - }, - "Position": { - "x": 0, - "y": 122, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0, - "g": 0, - "b": 0, - "a": 0 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.TextComponent", - "Alignment": 4, - "Bold": true, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "Font": 0, - "FontColor": { - "r": 0.94, - "g": 0.74, - "b": 0.26, - "a": 1 - }, - "FontSize": 28, - "MaxSize": 28, - "MinSize": 8, - "OutlineColor": { - "r": 0.08, - "g": 0.08, - "b": 0.08, - "a": 1 - }, - "OutlineDistance": { - "x": 1, - "y": -1 - }, - "OutlineWidth": 1, - "Overflow": 0, - "OverrideSorting": false, - "Padding": { - "left": 0, - "right": 0, - "top": 0, - "bottom": 0 - }, - "SizeFit": false, - "Text": "모험가", - "UseOutLine": true, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e90000b-0000-4000-8000-00000e90000b", - "path": "/ui/DefaultGroup/LobbyHud/NpcRun/Role", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", - "jsonString": { - "name": "Role", - "path": "/ui/DefaultGroup/LobbyHud/NpcRun/Role", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 2, - "pathConstraints": "/////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIText", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uitext", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 110, - "y": -104 - }, - "OffsetMin": { - "x": -110, - "y": -140 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 220, - "y": 36 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 0, - "y": -122 - }, - "Position": { - "x": 0, - "y": -122, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0, - "g": 0, - "b": 0, - "a": 0 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.TextComponent", - "Alignment": 4, - "Bold": false, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "Font": 0, - "FontColor": { - "r": 0.86, - "g": 0.9, - "b": 0.94, - "a": 1 - }, - "FontSize": 22, - "MaxSize": 22, - "MinSize": 8, - "OutlineColor": { - "r": 0.08, - "g": 0.08, - "b": 0.08, - "a": 1 - }, - "OutlineDistance": { - "x": 1, - "y": -1 - }, - "OutlineWidth": 1, - "Overflow": 0, - "OverrideSorting": false, - "Padding": { - "left": 0, - "right": 0, - "top": 0, - "bottom": 0 - }, - "SizeFit": false, - "Text": "런 시작", - "UseOutLine": true, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e90000c-0000-4000-8000-00000e90000c", - "path": "/ui/DefaultGroup/LobbyHud/NpcCodex", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent", - "jsonString": { - "name": "NpcCodex", - "path": "/ui/DefaultGroup/LobbyHud/NpcCodex", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 4, - "pathConstraints": "////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIButton", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uibutton", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": -60, - "y": 180 - }, - "OffsetMin": { - "x": -300, - "y": -140 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 240, - "y": 320 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": -180, - "y": 20 - }, - "Position": { - "x": -180, - "y": 20, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0.13, - "g": 0.15, - "b": 0.2, - "a": 1 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": true, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.ButtonComponent", - "Colors": { - "NormalColor": { - "r": 1, - "g": 1, - "b": 1, - "a": 1 - }, - "HighlightedColor": { - "r": 0.9607843, - "g": 0.9607843, - "b": 0.9607843, - "a": 1 - }, - "PressedColor": { - "r": 0.784313738, - "g": 0.784313738, - "b": 0.784313738, - "a": 1 - }, - "SelectedColor": { - "r": 0.9607843, - "g": 0.9607843, - "b": 0.9607843, - "a": 1 - }, - "DisabledColor": { - "r": 0.784313738, - "g": 0.784313738, - "b": 0.784313738, - "a": 0.5019608 - }, - "ColorMultiplier": 1, - "FadeDuration": 0.1 - }, - "ImageRUIDs": { - "HighlightedSprite": null, - "PressedSprite": null, - "SelectedSprite": null, - "DisabledSprite": null - }, - "KeyCode": 0, - "OverrideSorting": false, - "Transition": 1, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e90000d-0000-4000-8000-00000e90000d", - "path": "/ui/DefaultGroup/LobbyHud/NpcCodex/Figure", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent", - "jsonString": { - "name": "Figure", - "path": "/ui/DefaultGroup/LobbyHud/NpcCodex/Figure", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 1, - "pathConstraints": "/////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UISprite", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uisprite", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 65, - "y": 95 - }, - "OffsetMin": { - "x": -65, - "y": -35 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 130, - "y": 130 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 0, - "y": 30 - }, - "Position": { - "x": 0, - "y": 30, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0.3, - "g": 0.55, - "b": 0.5, - "a": 1 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e90000e-0000-4000-8000-00000e90000e", - "path": "/ui/DefaultGroup/LobbyHud/NpcCodex/Name", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", - "jsonString": { - "name": "Name", - "path": "/ui/DefaultGroup/LobbyHud/NpcCodex/Name", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 2, - "pathConstraints": "/////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIText", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uitext", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 110, - "y": 142 - }, - "OffsetMin": { - "x": -110, - "y": 102 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 220, - "y": 40 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 0, - "y": 122 - }, - "Position": { - "x": 0, - "y": 122, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0, - "g": 0, - "b": 0, - "a": 0 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.TextComponent", - "Alignment": 4, - "Bold": true, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "Font": 0, - "FontColor": { - "r": 0.94, - "g": 0.74, - "b": 0.26, - "a": 1 - }, - "FontSize": 28, - "MaxSize": 28, - "MinSize": 8, - "OutlineColor": { - "r": 0.08, - "g": 0.08, - "b": 0.08, - "a": 1 - }, - "OutlineDistance": { - "x": 1, - "y": -1 - }, - "OutlineWidth": 1, - "Overflow": 0, - "OverrideSorting": false, - "Padding": { - "left": 0, - "right": 0, - "top": 0, - "bottom": 0 - }, - "SizeFit": false, - "Text": "사서", - "UseOutLine": true, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e90000f-0000-4000-8000-00000e90000f", - "path": "/ui/DefaultGroup/LobbyHud/NpcCodex/Role", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", - "jsonString": { - "name": "Role", - "path": "/ui/DefaultGroup/LobbyHud/NpcCodex/Role", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 2, - "pathConstraints": "/////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIText", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uitext", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 110, - "y": -104 - }, - "OffsetMin": { - "x": -110, - "y": -140 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 220, - "y": 36 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 0, - "y": -122 - }, - "Position": { - "x": 0, - "y": -122, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0, - "g": 0, - "b": 0, - "a": 0 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.TextComponent", - "Alignment": 4, - "Bold": false, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "Font": 0, - "FontColor": { - "r": 0.86, - "g": 0.9, - "b": 0.94, - "a": 1 - }, - "FontSize": 22, - "MaxSize": 22, - "MinSize": 8, - "OutlineColor": { - "r": 0.08, - "g": 0.08, - "b": 0.08, - "a": 1 - }, - "OutlineDistance": { - "x": 1, - "y": -1 - }, - "OutlineWidth": 1, - "Overflow": 0, - "OverrideSorting": false, - "Padding": { - "left": 0, - "right": 0, - "top": 0, - "bottom": 0 - }, - "SizeFit": false, - "Text": "카드 도감", - "UseOutLine": true, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e900010-0000-4000-8000-00000e900010", - "path": "/ui/DefaultGroup/LobbyHud/NpcShop", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent", - "jsonString": { - "name": "NpcShop", - "path": "/ui/DefaultGroup/LobbyHud/NpcShop", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 4, - "pathConstraints": "////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIButton", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uibutton", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 300, - "y": 180 - }, - "OffsetMin": { - "x": 60, - "y": -140 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 240, - "y": 320 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 180, - "y": 20 - }, - "Position": { - "x": 180, - "y": 20, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0.13, - "g": 0.15, - "b": 0.2, - "a": 1 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": true, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.ButtonComponent", - "Colors": { - "NormalColor": { - "r": 1, - "g": 1, - "b": 1, - "a": 1 - }, - "HighlightedColor": { - "r": 0.9607843, - "g": 0.9607843, - "b": 0.9607843, - "a": 1 - }, - "PressedColor": { - "r": 0.784313738, - "g": 0.784313738, - "b": 0.784313738, - "a": 1 - }, - "SelectedColor": { - "r": 0.9607843, - "g": 0.9607843, - "b": 0.9607843, - "a": 1 - }, - "DisabledColor": { - "r": 0.784313738, - "g": 0.784313738, - "b": 0.784313738, - "a": 0.5019608 - }, - "ColorMultiplier": 1, - "FadeDuration": 0.1 - }, - "ImageRUIDs": { - "HighlightedSprite": null, - "PressedSprite": null, - "SelectedSprite": null, - "DisabledSprite": null - }, - "KeyCode": 0, - "OverrideSorting": false, - "Transition": 1, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e900011-0000-4000-8000-00000e900011", - "path": "/ui/DefaultGroup/LobbyHud/NpcShop/Figure", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent", - "jsonString": { - "name": "Figure", - "path": "/ui/DefaultGroup/LobbyHud/NpcShop/Figure", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 1, - "pathConstraints": "/////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UISprite", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uisprite", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 65, - "y": 95 - }, - "OffsetMin": { - "x": -65, - "y": -35 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 130, - "y": 130 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 0, - "y": 30 - }, - "Position": { - "x": 0, - "y": 30, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0.55, - "g": 0.45, - "b": 0.75, - "a": 1 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e900012-0000-4000-8000-00000e900012", - "path": "/ui/DefaultGroup/LobbyHud/NpcShop/Name", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", - "jsonString": { - "name": "Name", - "path": "/ui/DefaultGroup/LobbyHud/NpcShop/Name", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 2, - "pathConstraints": "/////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIText", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uitext", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 110, - "y": 142 - }, - "OffsetMin": { - "x": -110, - "y": 102 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 220, - "y": 40 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 0, - "y": 122 - }, - "Position": { - "x": 0, - "y": 122, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0, - "g": 0, - "b": 0, - "a": 0 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.TextComponent", - "Alignment": 4, - "Bold": true, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "Font": 0, - "FontColor": { - "r": 0.94, - "g": 0.74, - "b": 0.26, - "a": 1 - }, - "FontSize": 28, - "MaxSize": 28, - "MinSize": 8, - "OutlineColor": { - "r": 0.08, - "g": 0.08, - "b": 0.08, - "a": 1 - }, - "OutlineDistance": { - "x": 1, - "y": -1 - }, - "OutlineWidth": 1, - "Overflow": 0, - "OverrideSorting": false, - "Padding": { - "left": 0, - "right": 0, - "top": 0, - "bottom": 0 - }, - "SizeFit": false, - "Text": "상인", - "UseOutLine": true, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e900013-0000-4000-8000-00000e900013", - "path": "/ui/DefaultGroup/LobbyHud/NpcShop/Role", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", - "jsonString": { - "name": "Role", - "path": "/ui/DefaultGroup/LobbyHud/NpcShop/Role", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 2, - "pathConstraints": "/////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIText", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uitext", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 110, - "y": -104 - }, - "OffsetMin": { - "x": -110, - "y": -140 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 220, - "y": 36 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 0, - "y": -122 - }, - "Position": { - "x": 0, - "y": -122, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0, - "g": 0, - "b": 0, - "a": 0 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.TextComponent", - "Alignment": 4, - "Bold": false, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "Font": 0, - "FontColor": { - "r": 0.86, - "g": 0.9, - "b": 0.94, - "a": 1 - }, - "FontSize": 22, - "MaxSize": 22, - "MinSize": 8, - "OutlineColor": { - "r": 0.08, - "g": 0.08, - "b": 0.08, - "a": 1 - }, - "OutlineDistance": { - "x": 1, - "y": -1 - }, - "OutlineWidth": 1, - "Overflow": 0, - "OverrideSorting": false, - "Padding": { - "left": 0, - "right": 0, - "top": 0, - "bottom": 0 - }, - "SizeFit": false, - "Text": "영혼 상점", - "UseOutLine": true, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e900014-0000-4000-8000-00000e900014", - "path": "/ui/DefaultGroup/LobbyHud/NpcBoard", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent", - "jsonString": { - "name": "NpcBoard", - "path": "/ui/DefaultGroup/LobbyHud/NpcBoard", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 4, - "pathConstraints": "////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIButton", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uibutton", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 660, - "y": 180 - }, - "OffsetMin": { - "x": 420, - "y": -140 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 240, - "y": 320 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 540, - "y": 20 - }, - "Position": { - "x": 540, - "y": 20, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0.13, - "g": 0.15, - "b": 0.2, - "a": 1 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": true, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.ButtonComponent", - "Colors": { - "NormalColor": { - "r": 1, - "g": 1, - "b": 1, - "a": 1 - }, - "HighlightedColor": { - "r": 0.9607843, - "g": 0.9607843, - "b": 0.9607843, - "a": 1 - }, - "PressedColor": { - "r": 0.784313738, - "g": 0.784313738, - "b": 0.784313738, - "a": 1 - }, - "SelectedColor": { - "r": 0.9607843, - "g": 0.9607843, - "b": 0.9607843, - "a": 1 - }, - "DisabledColor": { - "r": 0.784313738, - "g": 0.784313738, - "b": 0.784313738, - "a": 0.5019608 - }, - "ColorMultiplier": 1, - "FadeDuration": 0.1 - }, - "ImageRUIDs": { - "HighlightedSprite": null, - "PressedSprite": null, - "SelectedSprite": null, - "DisabledSprite": null - }, - "KeyCode": 0, - "OverrideSorting": false, - "Transition": 1, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e900015-0000-4000-8000-00000e900015", - "path": "/ui/DefaultGroup/LobbyHud/NpcBoard/Figure", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent", - "jsonString": { - "name": "Figure", - "path": "/ui/DefaultGroup/LobbyHud/NpcBoard/Figure", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 1, - "pathConstraints": "/////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UISprite", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uisprite", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 65, - "y": 95 - }, - "OffsetMin": { - "x": -65, - "y": -35 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 130, - "y": 130 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 0, - "y": 30 - }, - "Position": { - "x": 0, - "y": 30, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0.4, - "g": 0.5, - "b": 0.7, - "a": 1 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e900016-0000-4000-8000-00000e900016", - "path": "/ui/DefaultGroup/LobbyHud/NpcBoard/Name", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", - "jsonString": { - "name": "Name", - "path": "/ui/DefaultGroup/LobbyHud/NpcBoard/Name", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 2, - "pathConstraints": "/////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIText", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uitext", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 110, - "y": 142 - }, - "OffsetMin": { - "x": -110, - "y": 102 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 220, - "y": 40 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 0, - "y": 122 - }, - "Position": { - "x": 0, - "y": 122, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0, - "g": 0, - "b": 0, - "a": 0 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.TextComponent", - "Alignment": 4, - "Bold": true, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "Font": 0, - "FontColor": { - "r": 0.94, - "g": 0.74, - "b": 0.26, - "a": 1 - }, - "FontSize": 28, - "MaxSize": 28, - "MinSize": 8, - "OutlineColor": { - "r": 0.08, - "g": 0.08, - "b": 0.08, - "a": 1 - }, - "OutlineDistance": { - "x": 1, - "y": -1 - }, - "OutlineWidth": 1, - "Overflow": 0, - "OverrideSorting": false, - "Padding": { - "left": 0, - "right": 0, - "top": 0, - "bottom": 0 - }, - "SizeFit": false, - "Text": "안내원", - "UseOutLine": true, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0e900017-0000-4000-8000-00000e900017", - "path": "/ui/DefaultGroup/LobbyHud/NpcBoard/Role", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", - "jsonString": { - "name": "Role", - "path": "/ui/DefaultGroup/LobbyHud/NpcBoard/Role", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 2, - "pathConstraints": "/////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIText", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uitext", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": 110, - "y": -104 - }, - "OffsetMin": { - "x": -110, - "y": -140 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 220, - "y": 36 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": 0, - "y": -122 - }, - "Position": { - "x": 0, - "y": -122, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0, - "g": 0, - "b": 0, - "a": 0 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.TextComponent", - "Alignment": 4, - "Bold": false, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "Font": 0, - "FontColor": { - "r": 0.86, - "g": 0.9, - "b": 0.94, - "a": 1 - }, - "FontSize": 22, - "MaxSize": 22, - "MinSize": 8, - "OutlineColor": { - "r": 0.08, - "g": 0.08, - "b": 0.08, - "a": 1 - }, - "OutlineDistance": { - "x": 1, - "y": -1 - }, - "OutlineWidth": 1, - "Overflow": 0, - "OverrideSorting": false, - "Padding": { - "left": 0, - "right": 0, - "top": 0, - "bottom": 0 - }, - "SizeFit": false, - "Text": "게시판", - "UseOutLine": true, - "Enable": true - } - ], - "@version": 1 - } - }, { "id": "0ea00000-0000-4000-8000-00000ea00000", "path": "/ui/DefaultGroup/BoardHud",