Builds / 1.15.30
Update 1.15.30
Compared with 1.14.97 · published Thu, 08 Oct 2026 07:01:12 GMT · live channel
No summary yet.
Text changes 60
| Key | Text | |
|---|---|---|
| DIALOGUE_TEXT_84 | + | Wait... the ground is shaking. What is this heat? |
| DIALOGUE_TEXT_85 | + | My lord, the Abyss's magic is surging! Something has awakened! |
| DIALOGUE_TEXT_86 | + | Not even the Abyss could hold me forever. Now this land shall remember my flames! |
| DIALOGUE_TEXT_87 | + | The forest... burned down in an instant! Those flames are seeping right into the Castle! |
| DIALOGUE_TEXT_88 | + | It's the Fire Lord, freed from the Abyss. His magic is suppressing the power of the Castle and the heroes. |
| DIALOGUE_TEXT_89 | + | Tap the Flame Mark to check the effects you're under right now. |
| DIALOGUE_TEXT_90 | + | But... the Castle is glowing too. Is it reacting to the flames? |
| DIALOGUE_TEXT_91 | + | The Castle is reacting to the magic! The power of the race bound to you is about to reveal itself. |
| DIALOGUE_TEXT_92 | + | You can check your Rebirth race with this icon. The Castle follows the power of the same race. |
| DIALOGUE_TEXT_93 | + | Now the Castle takes on the form of the race you were reborn as. The Scorched Land's effects follow that race too. |
| DIALOGUE_TEXT_94 | + | Each hero is affected according to their own race. You can check it anytime from the Flame Mark. |
| DIALOGUE_TEXT_95 | + | Just because the land has changed doesn't mean we'll back down. We'll know our strength and face it head-on. |
| DIALOGUE_NPC_FL | + | Fire Lord |
| COMMON_574 | + | Applied immediately. |
| COMMON_575 | + | Today's reward has already been claimed. |
| COMMON_576 | + | Sun|Mon|Tue|Wed|Thu|Fri|Sat |
| PRODUCT_NAME_301 | + | Blessing of Abundance Privilege |
| PRODUCT_DESC_76 | + | Blessing of Abundance daily activation count increases by 1. |
| PRODUCT_DESC_77 | + | Receive 500 Gems upon logging in each day. |
| GAME_1887 | + | Event Schedule |
| GAME_1888 | + | Bulk Hero Purchase |
| GAME_1889 | + | Refresh the Hero List ## times to purchase all heroes available for Medals (@@ total) at once. |
| GAME_1890 | + | Purchased heroes will be added to the Barracks. |
| GAME_1891 | + | Would you like to make a bulk Hero purchase? |
| GAME_1892 | + | Bulk Purchase |
| GAME_1893 | + | Purchase History |
| GAME_1894 | + | Heroes obtained through Bulk Purchase are listed here. |
| GAME_1895 | + | Blessing of Abundance |
| GAME_1896 | + | Activation Chance |
| GAME_1897 | + | Blessing of Abundance has a chance to activate upon Rebirth. |
| GAME_1898 | + | Activation Chance: Base ##% + @@% per 100 Wave |
| GAME_1899 | + | When blessed, your base Medal amount increases by +##% on your next Rebirth. |
| GAME_1900 | + | Daily activations are limited, and Medals gained from Blessing of Abundance do not apply to Soul Rest. |
| GAME_1901 | + | On your next Rebirth, your base Medal amount increases by ##% due to Blessing of Abundance. |
| GAME_1902 | + | Scorched Land |
| GAME_1903 | + | Flame Debuff Lv.{0} |
| GAME_1904 | + | Scorched Land · Flame Debuff |
| GAME_1905 | + | Current Wave {0} |
| GAME_1906 | + | Debuff level +1 every {0} waves |
| GAME_1907 | + | Next increase: Wave {0} → Lv.{1} |
| GAME_1908 | + | Castle·Hero Level |
| GAME_1909 | + | Per Lv |
| GAME_1910 | + | Current |
| GAME_1911 | + | None |
| GAME_1912 | + | Castle: Rebirth race / Heroes: their own race |
| GAME_1913 | + | Battle Paused |
| GAME_1914 | + | Continue Battle |
| GAME_1915 | + | Current Rebirth Race |
| GAME_1916 | + | {0} Castle |
| GAME_1917 | + | You can't call waves at the threshold of a new land. |
| GAME_1918 | + | |
| GAME_1919 | + | Secretary Event (Pet) |
| GAME_1920 | + | Gem Spending Event |
| GAME_1921 | + | Attendance Event |
| GAME_1922 | + | Tower of Challenges Clear Event |
| RANKING_HIDE_TEAM | + | Hide my team lineup |
| RANKING_TEAM_HIDDEN | + | This player has hidden their team lineup. |
| RANKING_TEAM_LOAD_FAILED | + | Unable to load team information. |
| RANKING_PRIVACY_SAVE_FAILED | + | Unable to save team visibility. Please try again. |
| − |
|
Translations touched: de (60), es (60), fr (60), id (60), it (60), ja (60), ko (60), pl (60), pt (60), ru (60), th (60), tr (60), vi (60), zh-CN (60), zh-TW (60)
Assets 34
Bundled data: assets/images/conquest/conquestFacilityBook.draft.json 2
| Row | Change | Field | Before | After |
|---|---|---|---|---|
| _note | removed | "시트 변환본 (sheetToBooks.mjs)" | ||
| facilities | removed | [{"id": 1, "name_ko": "수송대", "name_key": "", "specialty_family_id": 7, "grade_max": 6, "level_per_grade": 10, "effects": [{"type": "squad_size", "base": 20, "per_level": 0.3333333333333333, "unit": "명/영웅"}, {"type": "carry", "base": 100, "per_level": 3, "unit": "%"}], "levels": [{"grade": 1, "level": 1, "costs": [{"material_id": 41, "qty": 10}, {"material_id": 51, "qty": 10}, {"material_id": 71, "qty": 5}]}, {"grade": 1, "level": 2, "costs": [{"material_id": 41, "qty": 16}, {"material_id": 51, "qty": 16}, {"material_id": 71, "qty": 8}]}, {"grade": 1, "level": 3, "costs": [{"material_id": 41, "qty": 22}, {"material_id": 51, "qty": 22}, {"material_id": 71, "qty": 11}]}, {"grade": 1, "level": 4, "costs": [{"material_id": 41, "qty": 28}, {"material_id": 51, "qty": 28}, {"material_id": 71, "qty": 14}]}, {"grade": 1, "level": 5, "costs": [{"material_id": 41, "qty": 34}, {"material_id": 51, "qty": 34}, {"material_id": 71, "qty": 17}]}, {"grade": 1, "level": 6, "costs": [{"material_id": 41, "qty": 40}, {"material_id": 51, "qty": 40}, {"material_id": 71, "qty": 20}]}, {"grade": 1, "level": 7, "costs": [{"material_id": 41, "qty": 46}, {"material_id": 51, "qty": 46}, {"material_id": 71, "qty": 23}]}, {"grade": 1, "level": 8, "costs": [{"material_id": 41, "qty": 52}, {"material_id": 51, "qty": 52}, {"material_id": 71, "qty": 26}]}, {"grade": 1, "level": 9, "costs": [{"material_id": 41, "qty": 58}, {"material_id": 51, "qty": 58}, {"material_id": 71, "qty": 29}]}, {"grade": 1, "level": 10, "costs": [{"material_id": 41, "qty": 64}, {"material_id": 51, "qty": 64}, {"material_id": 71, "qty": 32}], "promote": {"material_id": 62, "qty": 40}}, {"grade": 2, "level": 1, "costs": [{"material_id": 42, "qty": 10}, {"material_id": 52, "qty": 10}, {"material_id": 72, "qty": 5}]}, {"grade": 2, "level": 2, "costs": [{"material_id": 42, "qty": 16}, {"material_id": 52, "qty": 16}, {"material_id": 72, "qty": 8}]}, {"grade": 2, "level": 3, "costs": [{"material_id": 42, "qty": 22}, {"material_id": 52, "qty": 22}, {"material_id": 72, "qty": 11}]}, {"grade": 2, "level": 4, "costs": [{"material_id": 42, "qty": 28}, {"material_id": 52, "qty": 28}, {"material_id": 72, "qty": 14}]}, {"grade": 2, "level": 5, "costs": [{"material_id": 42, "qty": 34}, {"material_id": 52, "qty": 34}, {"material_id": 72, "qty": 17}]}, {"grade": 2, "level": 6, "costs": [{"material_id": 42, "qty": 40}, {"material_id": 52, "qty": 40}, {"material_id": 72, "qty": 20}]}, {"grade": 2, "level": 7, "costs": [{"material_id": 42, "qty": 46}, {"material_id": 52, "qty": 46}, {"material_id": 72, "qty": 23}]}, {"grade": 2, "level": 8, "costs": [{"material_id": 42, "qty": 52}, {"material_id": 52, "qty": 52}, {"material_id": 72, "qty": 26}]}, {"grade": 2, "level": 9, "costs": [{"material_id": 42, "qty": 58}, {"material_id": 52, "qty": 58}, {"material_id": 72, "qty": 29}]}, {"grade": 2, "level": 10, "costs": [{"material_id": 42, "qty": 64}, {"material_id": 52, "qty": 64}, {"material_id": 72, "qty": 32}], "promote": {"material_id": 63, "qty": 40}}, {"grade": 3, "level": 1, "costs": [{"material_id": 43, "qty": 10}, {"material_id": 53, "qty": 10}, {"material_id": 73, "qty": 5}]}, {"grade": 3, "level": 2, "costs": [{"material_id": 43, "qty": 16}, {"material_id": 53, "qty": 16}, {"material_id": 73, "qty": 8}]}, {"grade": 3, "level": 3, "costs": [{"material_id": 43, "qty": 22}, {"material_id": 53, "qty": 22}, {"material_id": 73, "qty": 11}]}, {"grade": 3, "level": 4, "costs": [{"material_id": 43, "qty": 28}, {"material_id": 53, "qty": 28}, {"material_id": 73, "qty": 14}]}, {"grade": 3, "level": 5, "costs": [{"material_id": 43, "qty": 34}, {"material_id": 53, "qty": 34}, {"material_id": 73, "qty": 17}]}, {"grade": 3, "level": 6, "costs": [{"material_id": 43, "qty": 40}, {"material_id": 53, "qty": 40}, {"material_id": 73, "qty": 20}]}, {"grade": 3, "level": 7, "costs": [{"material_id": 43, "qty": 46}, {"material_id": 53, "qty": 46}, {"material_id": 73, "qty": 23}]}, {"grade": 3, "level": 8, "costs": [{"material_id": 43, "qty": 52}, {"material_id": 53, "qty": 52}, {"material_id": 73, "qty": 26}]}, {"grade": 3, "level": 9, "costs": [{"material_id": 43, "qty": 58}, {"material_id": 53, "qty": 58}, {"material_id": 73, "qty": 29}]}, {"grade": 3, "level": 10, "costs": [{"material_id": 43, "qty": 64}, {"material_id": 53, "qty": 64}, {"material_id": 73, "qty": 32}], "promote": {"material_id": 64, "qty": 40}}, {"grade": 4, "level": 1, "costs": [{"material_id": 44, "qty": 10}, {"material_id": 54, "qty": 10}, {"material_id": 74, "qty": 5}]}, {"grade": 4, "level": 2, "costs": [{"material_id": 44, "qty": 16}, {"material_id": 54, "qty": 16}, {"material_id": 74, "qty": 8}]}, {"grade": 4, "level": 3, "costs": [{"material_id": 44, "qty": 22}, {"material_id": 54, "qty": 22}, {"material_id": 74, "qty": 11}]}, {"grade": 4, "level": 4, "costs": [{"material_id": 44, "qty": 28}, {"material_id": 54, "qty": 28}, {"material_id": 74, "qty": 14}]}, {"grade": 4, "level": 5, "costs": [{"material_id": 44, "qty": 34}, {"material_id": 54, "qty": 34}, {"material_id": 74, "qty": 17}]}, {"grade": 4, "level": 6, "costs": [{"material_id": 44, "qty": 40}, {"material_id": 54, "qty": 40}, {"material_id": 74, "qty": 20}]}, {"grade": 4, "level": 7, "costs": [{"material_id": 44, "qty": 46}, {"material_id": 54, "qty": 46}, {"material_id": 74, "qty": 23}]}, {"grade": 4, "level": 8, "costs": [{"material_id": 44, "qty": 52}, {"material_id": 54, "qty": 52}, {"material_id": 74, "qty": 26}]}, {"grade": 4, "level": 9, "costs": [{"material_id": 44, "qty": 58}, {"material_id": 54, "qty": 58}, {"material_id": 74, "qty": 29}]}, {"grade": 4, "level": 10, "costs": [{"material_id": 44, "qty": 64}, {"material_id": 54, "qty": 64}, {"material_id": 74, "qty": 32}], "promote": {"material_id": 65, "qty": 40}}, {"grade": 5, "level": 1, "costs": [{"material_id": 45, "qty": 10}, {"material_id": 55, "qty": 10}, {"material_id": 75, "qty": 5}]}, {"grade": 5, "level": 2, "costs": [{"material_id": 45, "qty": 16}, {"material_id": 55, "qty": 16}, {"material_id": 75, "qty": 8}]}, {"grade": 5, "level": 3, "costs": [{"material_id": 45, "qty": 22}, {"material_id": 55, "qty": 22}, {"material_id": 75, "qty": 11}]}, {"grade": 5, "level": 4, "costs": [{"material_id": 45, "qty": 28}, {"material_id": 55, "qty": 28}, {"material_id": 75, "qty": 14}]}, {"grade": 5, "level": 5, "costs": [{"material_id": 45, "qty": 34}, {"material_id": 55, "qty": 34}, {"material_id": 75, "qty": 17}]}, {"grade": 5, "level": 6, "costs": [{"material_id": 45, "qty": 40}, {"material_id": 55, "qty": 40}, {"material_id": 75, "qty": 20}]}, {"grade": 5, "level": 7, "costs": [{"material_id": 45, "qty": 46}, {"material_id": 55, "qty": 46}, {"material_id": 75, "qty": 23}]}, {"grade": 5, "level": 8, "costs": [{"material_id": 45, "qty": 52}, {"material_id": 55, "qty": 52}, {"material_id": 75, "qty": 26}]}, {"grade": 5, "level": 9, "costs": [{"material_id": 45, "qty": 58}, {"material_id": 55, "qty": 58}, {"material_id": 75, "qty": 29}]}, {"grade": 5, "level": 10, "costs": [{"material_id": 45, "qty": 64}, {"material_id": 55, "qty": 64}, {"material_id": 75, "qty": 32}], "promote": {"material_id": 66, "qty": 40}}, {"grade": 6, "level": 1, "costs": [{"material_id": 46, "qty": 10}, {"material_id": 56, "qty": 10}, {"material_id": 76, "qty": 5}]}, {"grade": 6, "level": 2, "costs": [{"material_id": 46, "qty": 16}, {"material_id": 56, "qty": 16}, {"material_id": 76, "qty": 8}]}, {"grade": 6, "level": 3, "costs": [{"material_id": 46, "qty": 22}, {"material_id": 56, "qty": 22}, {"material_id": 76, "qty": 11}]}, {"grade": 6, "level": 4, "costs": [{"material_id": 46, "qty": 28}, {"material_id": 56, "qty": 28}, {"material_id": 76, "qty": 14}]}, {"grade": 6, "level": 5, "costs": [{"material_id": 46, "qty": 34}, {"material_id": 56, "qty": 34}, {"material_id": 76, "qty": 17}]}, {"grade": 6, "level": 6, "costs": [{"material_id": 46, "qty": 40}, {"material_id": 56, "qty": 40}, {"material_id": 76, "qty": 20}]}, {"grade": 6, "level": 7, "costs": [{"material_id": 46, "qty": 46}, {"material_id": 56, "qty": 46}, {"material_id": 76, "qty": 23}]}, {"grade": 6, "level": 8, "costs": [{"material_id": 46, "qty": 52}, {"material_id": 56, "qty": 52}, {"material_id": 76, "qty": 26}]}, {"grade": 6, "level": 9, "costs": [{"material_id": 46, "qty": 58}, {"material_id": 56, "qty": 58}, {"material_id": 76, "qty": 29}]}, {"grade": 6, "level": 10, "costs": [{"material_id": 46, "qty": 64}, {"material_id": 56, "qty": 64}, {"material_id": 76, "qty": 32}]}], "desc_ko": "원정 병력 수·적재량. 도달 티어 게이트"}, {"id": 2, "name_ko": "탐사대", "name_key": "", "specialty_family_id": 15, "grade_max": 6, "level_per_grade": 10, "effects": [{"type": "scout_slots", "base": 1, "per_level": 0, "unit": "개(등급당+1)"}, {"type": "scout_speed", "base": 100, "per_level": 4, "unit": "%"}], "levels": [{"grade": 1, "level": 1, "costs": [{"material_id": 41, "qty": 10}, {"material_id": 51, "qty": 10}, {"material_id": 151, "qty": 5}]}, {"grade": 1, "level": 2, "costs": [{"material_id": 41, "qty": 16}, {"material_id": 51, "qty": 16}, {"material_id": 151, "qty": 8}]}, {"grade": 1, "level": 3, "costs": [{"material_id": 41, "qty": 22}, {"material_id": 51, "qty": 22}, {"material_id": 151, "qty": 11}]}, {"grade": 1, "level": 4, "costs": [{"material_id": 41, "qty": 28}, {"material_id": 51, "qty": 28}, {"material_id": 151, "qty": 14}]}, {"grade": 1, "level": 5, "costs": [{"material_id": 41, "qty": 34}, {"material_id": 51, "qty": 34}, {"material_id": 151, "qty": 17}]}, {"grade": 1, "level": 6, "costs": [{"material_id": 41, "qty": 40}, {"material_id": 51, "qty": 40}, {"material_id": 151, "qty": 20}]}, {"grade": 1, "level": 7, "costs": [{"material_id": 41, "qty": 46}, {"material_id": 51, "qty": 46}, {"material_id": 151, "qty": 23}]}, {"grade": 1, "level": 8, "costs": [{"material_id": 41, "qty": 52}, {"material_id": 51, "qty": 52}, {"material_id": 151, "qty": 26}]}, {"grade": 1, "level": 9, "costs": [{"material_id": 41, "qty": 58}, {"material_id": 51, "qty": 58}, {"material_id": 151, "qty": 29}]}, {"grade": 1, "level": 10, "costs": [{"material_id": 41, "qty": 64}, {"material_id": 51, "qty": 64}, {"material_id": 151, "qty": 32}], "promote": {"material_id": 62, "qty": 40}}, {"grade": 2, "level": 1, "costs": [{"material_id": 42, "qty": 10}, {"material_id": 52, "qty": 10}, {"material_id": 152, "qty": 5}]}, {"grade": 2, "level": 2, "costs": [{"material_id": 42, "qty": 16}, {"material_id": 52, "qty": 16}, {"material_id": 152, "qty": 8}]}, {"grade": 2, "level": 3, "costs": [{"material_id": 42, "qty": 22}, {"material_id": 52, "qty": 22}, {"material_id": 152, "qty": 11}]}, {"grade": 2, "level": 4, "costs": [{"material_id": 42, "qty": 28}, {"material_id": 52, "qty": 28}, {"material_id": 152, "qty": 14}]}, {"grade": 2, "level": 5, "costs": [{"material_id": 42, "qty": 34}, {"material_id": 52, "qty": 34}, {"material_id": 152, "qty": 17}]}, {"grade": 2, "level": 6, "costs": [{"material_id": 42, "qty": 40}, {"material_id": 52, "qty": 40}, {"material_id": 152, "qty": 20}]}, {"grade": 2, "level": 7, "costs": [{"material_id": 42, "qty": 46}, {"material_id": 52, "qty": 46}, {"material_id": 152, "qty": 23}]}, {"grade": 2, "level": 8, "costs": [{"material_id": 42, "qty": 52}, {"material_id": 52, "qty": 52}, {"material_id": 152, "qty": 26}]}, {"grade": 2, "level": 9, "costs": [{"material_id": 42, "qty": 58}, {"material_id": 52, "qty": 58}, {"material_id": 152, "qty": 29}]}, {"grade": 2, "level": 10, "costs": [{"material_id": 42, "qty": 64}, {"material_id": 52, "qty": 64}, {"material_id": 152, "qty": 32}], "promote": {"material_id": 63, "qty": 40}}, {"grade": 3, "level": 1, "costs": [{"material_id": 43, "qty": 10}, {"material_id": 53, "qty": 10}, {"material_id": 153, "qty": 5}]}, {"grade": 3, "level": 2, "costs": [{"material_id": 43, "qty": 16}, {"material_id": 53, "qty": 16}, {"material_id": 153, "qty": 8}]}, {"grade": 3, "level": 3, "costs": [{"material_id": 43, "qty": 22}, {"material_id": 53, "qty": 22}, {"material_id": 153, "qty": 11}]}, {"grade": 3, "level": 4, "costs": [{"material_id": 43, "qty": 28}, {"material_id": 53, "qty": 28}, {"material_id": 153, "qty": 14}]}, {"grade": 3, "level": 5, "costs": [{"material_id": 43, "qty": 34}, {"material_id": 53, "qty": 34}, {"material_id": 153, "qty": 17}]}, {"grade": 3, "level": 6, "costs": [{"material_id": 43, "qty": 40}, {"material_id": 53, "qty": 40}, {"material_id": 153, "qty": 20}]}, {"grade": 3, "level": 7, "costs": [{"material_id": 43, "qty": 46}, {"material_id": 53, "qty": 46}, {"material_id": 153, "qty": 23}]}, {"grade": 3, "level": 8, "costs": [{"material_id": 43, "qty": 52}, {"material_id": 53, "qty": 52}, {"material_id": 153, "qty": 26}]}, {"grade": 3, "level": 9, "costs": [{"material_id": 43, "qty": 58}, {"material_id": 53, "qty": 58}, {"material_id": 153, "qty": 29}]}, {"grade": 3, "level": 10, "costs": [{"material_id": 43, "qty": 64}, {"material_id": 53, "qty": 64}, {"material_id": 153, "qty": 32}], "promote": {"material_id": 64, "qty": 40}}, {"grade": 4, "level": 1, "costs": [{"material_id": 44, "qty": 10}, {"material_id": 54, "qty": 10}, {"material_id": 154, "qty": 5}]}, {"grade": 4, "level": 2, "costs": [{"material_id": 44, "qty": 16}, {"material_id": 54, "qty": 16}, {"material_id": 154, "qty": 8}]}, {"grade": 4, "level": 3, "costs": [{"material_id": 44, "qty": 22}, {"material_id": 54, "qty": 22}, {"material_id": 154, "qty": 11}]}, {"grade": 4, "level": 4, "costs": [{"material_id": 44, "qty": 28}, {"material_id": 54, "qty": 28}, {"material_id": 154, "qty": 14}]}, {"grade": 4, "level": 5, "costs": [{"material_id": 44, "qty": 34}, {"material_id": 54, "qty": 34}, {"material_id": 154, "qty": 17}]}, {"grade": 4, "level": 6, "costs": [{"material_id": 44, "qty": 40}, {"material_id": 54, "qty": 40}, {"material_id": 154, "qty": 20}]}, {"grade": 4, "level": 7, "costs": [{"material_id": 44, "qty": 46}, {"material_id": 54, "qty": 46}, {"material_id": 154, "qty": 23}]}, {"grade": 4, "level": 8, "costs": [{"material_id": 44, "qty": 52}, {"material_id": 54, "qty": 52}, {"material_id": 154, "qty": 26}]}, {"grade": 4, "level": 9, "costs": [{"material_id": 44, "qty": 58}, {"material_id": 54, "qty": 58}, {"material_id": 154, "qty": 29}]}, {"grade": 4, "level": 10, "costs": [{"material_id": 44, "qty": 64}, {"material_id": 54, "qty": 64}, {"material_id": 154, "qty": 32}], "promote": {"material_id": 65, "qty": 40}}, {"grade": 5, "level": 1, "costs": [{"material_id": 45, "qty": 10}, {"material_id": 55, "qty": 10}, {"material_id": 155, "qty": 5}]}, {"grade": 5, "level": 2, "costs": [{"material_id": 45, "qty": 16}, {"material_id": 55, "qty": 16}, {"material_id": 155, "qty": 8}]}, {"grade": 5, "level": 3, "costs": [{"material_id": 45, "qty": 22}, {"material_id": 55, "qty": 22}, {"material_id": 155, "qty": 11}]}, {"grade": 5, "level": 4, "costs": [{"material_id": 45, "qty": 28}, {"material_id": 55, "qty": 28}, {"material_id": 155, "qty": 14}]}, {"grade": 5, "level": 5, "costs": [{"material_id": 45, "qty": 34}, {"material_id": 55, "qty": 34}, {"material_id": 155, "qty": 17}]}, {"grade": 5, "level": 6, "costs": [{"material_id": 45, "qty": 40}, {"material_id": 55, "qty": 40}, {"material_id": 155, "qty": 20}]}, {"grade": 5, "level": 7, "costs": [{"material_id": 45, "qty": 46}, {"material_id": 55, "qty": 46}, {"material_id": 155, "qty": 23}]}, {"grade": 5, "level": 8, "costs": [{"material_id": 45, "qty": 52}, {"material_id": 55, "qty": 52}, {"material_id": 155, "qty": 26}]}, {"grade": 5, "level": 9, "costs": [{"material_id": 45, "qty": 58}, {"material_id": 55, "qty": 58}, {"material_id": 155, "qty": 29}]}, {"grade": 5, "level": 10, "costs": [{"material_id": 45, "qty": 64}, {"material_id": 55, "qty": 64}, {"material_id": 155, "qty": 32}], "promote": {"material_id": 66, "qty": 40}}, {"grade": 6, "level": 1, "costs": [{"material_id": 46, "qty": 10}, {"material_id": 56, "qty": 10}, {"material_id": 156, "qty": 5}]}, {"grade": 6, "level": 2, "costs": [{"material_id": 46, "qty": 16}, {"material_id": 56, "qty": 16}, {"material_id": 156, "qty": 8}]}, {"grade": 6, "level": 3, "costs": [{"material_id": 46, "qty": 22}, {"material_id": 56, "qty": 22}, {"material_id": 156, "qty": 11}]}, {"grade": 6, "level": 4, "costs": [{"material_id": 46, "qty": 28}, {"material_id": 56, "qty": 28}, {"material_id": 156, "qty": 14}]}, {"grade": 6, "level": 5, "costs": [{"material_id": 46, "qty": 34}, {"material_id": 56, "qty": 34}, {"material_id": 156, "qty": 17}]}, {"grade": 6, "level": 6, "costs": [{"material_id": 46, "qty": 40}, {"material_id": 56, "qty": 40}, {"material_id": 156, "qty": 20}]}, {"grade": 6, "level": 7, "costs": [{"material_id": 46, "qty": 46}, {"material_id": 56, "qty": 46}, {"material_id": 156, "qty": 23}]}, {"grade": 6, "level": 8, "costs": [{"material_id": 46, "qty": 52}, {"material_id": 56, "qty": 52}, {"material_id": 156, "qty": 26}]}, {"grade": 6, "level": 9, "costs": [{"material_id": 46, "qty": 58}, {"material_id": 56, "qty": 58}, {"material_id": 156, "qty": 29}]}, {"grade": 6, "level": 10, "costs": [{"material_id": 46, "qty": 64}, {"material_id": 56, "qty": 64}, {"material_id": 156, "qty": 32}]}], "desc_ko": "미점령 지역 탐사(안개·이해도). 파견 슬롯=등급"}, {"id": 3, "name_ko": "외교관", "name_key": "", "specialty_family_id": 11, "grade_max": 6, "level_per_grade": 10, "effects": [{"type": "friendship_gain", "base": 100, "per_level": 3, "unit": "%"}, {"type": "envoy_slots", "base": 1, "per_level": 0, "unit": "개(2등급당+1)"}], "levels": [{"grade": 1, "level": 1, "costs": [{"material_id": 41, "qty": 10}, {"material_id": 51, "qty": 10}, {"material_id": 111, "qty": 5}]}, {"grade": 1, "level": 2, "costs": [{"material_id": 41, "qty": 16}, {"material_id": 51, "qty": 16}, {"material_id": 111, "qty": 8}]}, {"grade": 1, "level": 3, "costs": [{"material_id": 41, "qty": 22}, {"material_id": 51, "qty": 22}, {"material_id": 111, "qty": 11}]}, {"grade": 1, "level": 4, "costs": [{"material_id": 41, "qty": 28}, {"material_id": 51, "qty": 28}, {"material_id": 111, "qty": 14}]}, {"grade": 1, "level": 5, "costs": [{"material_id": 41, "qty": 34}, {"material_id": 51, "qty": 34}, {"material_id": 111, "qty": 17}]}, {"grade": 1, "level": 6, "costs": [{"material_id": 41, "qty": 40}, {"material_id": 51, "qty": 40}, {"material_id": 111, "qty": 20}]}, {"grade": 1, "level": 7, "costs": [{"material_id": 41, "qty": 46}, {"material_id": 51, "qty": 46}, {"material_id": 111, "qty": 23}]}, {"grade": 1, "level": 8, "costs": [{"material_id": 41, "qty": 52}, {"material_id": 51, "qty": 52}, {"material_id": 111, "qty": 26}]}, {"grade": 1, "level": 9, "costs": [{"material_id": 41, "qty": 58}, {"material_id": 51, "qty": 58}, {"material_id": 111, "qty": 29}]}, {"grade": 1, "level": 10, "costs": [{"material_id": 41, "qty": 64}, {"material_id": 51, "qty": 64}, {"material_id": 111, "qty": 32}], "promote": {"material_id": 62, "qty": 40}}, {"grade": 2, "level": 1, "costs": [{"material_id": 42, "qty": 10}, {"material_id": 52, "qty": 10}, {"material_id": 112, "qty": 5}]}, {"grade": 2, "level": 2, "costs": [{"material_id": 42, "qty": 16}, {"material_id": 52, "qty": 16}, {"material_id": 112, "qty": 8}]}, {"grade": 2, "level": 3, "costs": [{"material_id": 42, "qty": 22}, {"material_id": 52, "qty": 22}, {"material_id": 112, "qty": 11}]}, {"grade": 2, "level": 4, "costs": [{"material_id": 42, "qty": 28}, {"material_id": 52, "qty": 28}, {"material_id": 112, "qty": 14}]}, {"grade": 2, "level": 5, "costs": [{"material_id": 42, "qty": 34}, {"material_id": 52, "qty": 34}, {"material_id": 112, "qty": 17}]}, {"grade": 2, "level": 6, "costs": [{"material_id": 42, "qty": 40}, {"material_id": 52, "qty": 40}, {"material_id": 112, "qty": 20}]}, {"grade": 2, "level": 7, "costs": [{"material_id": 42, "qty": 46}, {"material_id": 52, "qty": 46}, {"material_id": 112, "qty": 23}]}, {"grade": 2, "level": 8, "costs": [{"material_id": 42, "qty": 52}, {"material_id": 52, "qty": 52}, {"material_id": 112, "qty": 26}]}, {"grade": 2, "level": 9, "costs": [{"material_id": 42, "qty": 58}, {"material_id": 52, "qty": 58}, {"material_id": 112, "qty": 29}]}, {"grade": 2, "level": 10, "costs": [{"material_id": 42, "qty": 64}, {"material_id": 52, "qty": 64}, {"material_id": 112, "qty": 32}], "promote": {"material_id": 63, "qty": 40}}, {"grade": 3, "level": 1, "costs": [{"material_id": 43, "qty": 10}, {"material_id": 53, "qty": 10}, {"material_id": 113, "qty": 5}]}, {"grade": 3, "level": 2, "costs": [{"material_id": 43, "qty": 16}, {"material_id": 53, "qty": 16}, {"material_id": 113, "qty": 8}]}, {"grade": 3, "level": 3, "costs": [{"material_id": 43, "qty": 22}, {"material_id": 53, "qty": 22}, {"material_id": 113, "qty": 11}]}, {"grade": 3, "level": 4, "costs": [{"material_id": 43, "qty": 28}, {"material_id": 53, "qty": 28}, {"material_id": 113, "qty": 14}]}, {"grade": 3, "level": 5, "costs": [{"material_id": 43, "qty": 34}, {"material_id": 53, "qty": 34}, {"material_id": 113, "qty": 17}]}, {"grade": 3, "level": 6, "costs": [{"material_id": 43, "qty": 40}, {"material_id": 53, "qty": 40}, {"material_id": 113, "qty": 20}]}, {"grade": 3, "level": 7, "costs": [{"material_id": 43, "qty": 46}, {"material_id": 53, "qty": 46}, {"material_id": 113, "qty": 23}]}, {"grade": 3, "level": 8, "costs": [{"material_id": 43, "qty": 52}, {"material_id": 53, "qty": 52}, {"material_id": 113, "qty": 26}]}, {"grade": 3, "level": 9, "costs": [{"material_id": 43, "qty": 58}, {"material_id": 53, "qty": 58}, {"material_id": 113, "qty": 29}]}, {"grade": 3, "level": 10, "costs": [{"material_id": 43, "qty": 64}, {"material_id": 53, "qty": 64}, {"material_id": 113, "qty": 32}], "promote": {"material_id": 64, "qty": 40}}, {"grade": 4, "level": 1, "costs": [{"material_id": 44, "qty": 10}, {"material_id": 54, "qty": 10}, {"material_id": 114, "qty": 5}]}, {"grade": 4, "level": 2, "costs": [{"material_id": 44, "qty": 16}, {"material_id": 54, "qty": 16}, {"material_id": 114, "qty": 8}]}, {"grade": 4, "level": 3, "costs": [{"material_id": 44, "qty": 22}, {"material_id": 54, "qty": 22}, {"material_id": 114, "qty": 11}]}, {"grade": 4, "level": 4, "costs": [{"material_id": 44, "qty": 28}, {"material_id": 54, "qty": 28}, {"material_id": 114, "qty": 14}]}, {"grade": 4, "level": 5, "costs": [{"material_id": 44, "qty": 34}, {"material_id": 54, "qty": 34}, {"material_id": 114, "qty": 17}]}, {"grade": 4, "level": 6, "costs": [{"material_id": 44, "qty": 40}, {"material_id": 54, "qty": 40}, {"material_id": 114, "qty": 20}]}, {"grade": 4, "level": 7, "costs": [{"material_id": 44, "qty": 46}, {"material_id": 54, "qty": 46}, {"material_id": 114, "qty": 23}]}, {"grade": 4, "level": 8, "costs": [{"material_id": 44, "qty": 52}, {"material_id": 54, "qty": 52}, {"material_id": 114, "qty": 26}]}, {"grade": 4, "level": 9, "costs": [{"material_id": 44, "qty": 58}, {"material_id": 54, "qty": 58}, {"material_id": 114, "qty": 29}]}, {"grade": 4, "level": 10, "costs": [{"material_id": 44, "qty": 64}, {"material_id": 54, "qty": 64}, {"material_id": 114, "qty": 32}], "promote": {"material_id": 65, "qty": 40}}, {"grade": 5, "level": 1, "costs": [{"material_id": 45, "qty": 10}, {"material_id": 55, "qty": 10}, {"material_id": 115, "qty": 5}]}, {"grade": 5, "level": 2, "costs": [{"material_id": 45, "qty": 16}, {"material_id": 55, "qty": 16}, {"material_id": 115, "qty": 8}]}, {"grade": 5, "level": 3, "costs": [{"material_id": 45, "qty": 22}, {"material_id": 55, "qty": 22}, {"material_id": 115, "qty": 11}]}, {"grade": 5, "level": 4, "costs": [{"material_id": 45, "qty": 28}, {"material_id": 55, "qty": 28}, {"material_id": 115, "qty": 14}]}, {"grade": 5, "level": 5, "costs": [{"material_id": 45, "qty": 34}, {"material_id": 55, "qty": 34}, {"material_id": 115, "qty": 17}]}, {"grade": 5, "level": 6, "costs": [{"material_id": 45, "qty": 40}, {"material_id": 55, "qty": 40}, {"material_id": 115, "qty": 20}]}, {"grade": 5, "level": 7, "costs": [{"material_id": 45, "qty": 46}, {"material_id": 55, "qty": 46}, {"material_id": 115, "qty": 23}]}, {"grade": 5, "level": 8, "costs": [{"material_id": 45, "qty": 52}, {"material_id": 55, "qty": 52}, {"material_id": 115, "qty": 26}]}, {"grade": 5, "level": 9, "costs": [{"material_id": 45, "qty": 58}, {"material_id": 55, "qty": 58}, {"material_id": 115, "qty": 29}]}, {"grade": 5, "level": 10, "costs": [{"material_id": 45, "qty": 64}, {"material_id": 55, "qty": 64}, {"material_id": 115, "qty": 32}], "promote": {"material_id": 66, "qty": 40}}, {"grade": 6, "level": 1, "costs": [{"material_id": 46, "qty": 10}, {"material_id": 56, "qty": 10}, {"material_id": 116, "qty": 5}]}, {"grade": 6, "level": 2, "costs": [{"material_id": 46, "qty": 16}, {"material_id": 56, "qty": 16}, {"material_id": 116, "qty": 8}]}, {"grade": 6, "level": 3, "costs": [{"material_id": 46, "qty": 22}, {"material_id": 56, "qty": 22}, {"material_id": 116, "qty": 11}]}, {"grade": 6, "level": 4, "costs": [{"material_id": 46, "qty": 28}, {"material_id": 56, "qty": 28}, {"material_id": 116, "qty": 14}]}, {"grade": 6, "level": 5, "costs": [{"material_id": 46, "qty": 34}, {"material_id": 56, "qty": 34}, {"material_id": 116, "qty": 17}]}, {"grade": 6, "level": 6, "costs": [{"material_id": 46, "qty": 40}, {"material_id": 56, "qty": 40}, {"material_id": 116, "qty": 20}]}, {"grade": 6, "level": 7, "costs": [{"material_id": 46, "qty": 46}, {"material_id": 56, "qty": 46}, {"material_id": 116, "qty": 23}]}, {"grade": 6, "level": 8, "costs": [{"material_id": 46, "qty": 52}, {"material_id": 56, "qty": 52}, {"material_id": 116, "qty": 26}]}, {"grade": 6, "level": 9, "costs": [{"material_id": 46, "qty": 58}, {"material_id": 56, "qty": 58}, {"material_id": 116, "qty": 29}]}, {"grade": 6, "level": 10, "costs": [{"material_id": 46, "qty": 64}, {"material_id": 56, "qty": 64}, {"material_id": 116, "qty": 32}]}], "desc_ko": "점령지 우호도 상승. 사치품=선물"}, {"id": 4, "name_ko": "전술소", "name_key": "", "specialty_family_id": 10, "grade_max": 6, "level_per_grade": 10, "effects": [{"type": "exp_atk", "base": 100, "per_level": 1.5, "unit": "%"}, {"type": "exp_hp", "base": 100, "per_level": 1.5, "unit": "%"}], "levels": [{"grade": 1, "level": 1, "costs": [{"material_id": 41, "qty": 10}, {"material_id": 51, "qty": 10}, {"material_id": 101, "qty": 5}]}, {"grade": 1, "level": 2, "costs": [{"material_id": 41, "qty": 16}, {"material_id": 51, "qty": 16}, {"material_id": 101, "qty": 8}]}, {"grade": 1, "level": 3, "costs": [{"material_id": 41, "qty": 22}, {"material_id": 51, "qty": 22}, {"material_id": 101, "qty": 11}]}, {"grade": 1, "level": 4, "costs": [{"material_id": 41, "qty": 28}, {"material_id": 51, "qty": 28}, {"material_id": 101, "qty": 14}]}, {"grade": 1, "level": 5, "costs": [{"material_id": 41, "qty": 34}, {"material_id": 51, "qty": 34}, {"material_id": 101, "qty": 17}]}, {"grade": 1, "level": 6, "costs": [{"material_id": 41, "qty": 40}, {"material_id": 51, "qty": 40}, {"material_id": 101, "qty": 20}]}, {"grade": 1, "level": 7, "costs": [{"material_id": 41, "qty": 46}, {"material_id": 51, "qty": 46}, {"material_id": 101, "qty": 23}]}, {"grade": 1, "level": 8, "costs": [{"material_id": 41, "qty": 52}, {"material_id": 51, "qty": 52}, {"material_id": 101, "qty": 26}]}, {"grade": 1, "level": 9, "costs": [{"material_id": 41, "qty": 58}, {"material_id": 51, "qty": 58}, {"material_id": 101, "qty": 29}]}, {"grade": 1, "level": 10, "costs": [{"material_id": 41, "qty": 64}, {"material_id": 51, "qty": 64}, {"material_id": 101, "qty": 32}], "promote": {"material_id": 62, "qty": 40}}, {"grade": 2, "level": 1, "costs": [{"material_id": 42, "qty": 10}, {"material_id": 52, "qty": 10}, {"material_id": 102, "qty": 5}]}, {"grade": 2, "level": 2, "costs": [{"material_id": 42, "qty": 16}, {"material_id": 52, "qty": 16}, {"material_id": 102, "qty": 8}]}, {"grade": 2, "level": 3, "costs": [{"material_id": 42, "qty": 22}, {"material_id": 52, "qty": 22}, {"material_id": 102, "qty": 11}]}, {"grade": 2, "level": 4, "costs": [{"material_id": 42, "qty": 28}, {"material_id": 52, "qty": 28}, {"material_id": 102, "qty": 14}]}, {"grade": 2, "level": 5, "costs": [{"material_id": 42, "qty": 34}, {"material_id": 52, "qty": 34}, {"material_id": 102, "qty": 17}]}, {"grade": 2, "level": 6, "costs": [{"material_id": 42, "qty": 40}, {"material_id": 52, "qty": 40}, {"material_id": 102, "qty": 20}]}, {"grade": 2, "level": 7, "costs": [{"material_id": 42, "qty": 46}, {"material_id": 52, "qty": 46}, {"material_id": 102, "qty": 23}]}, {"grade": 2, "level": 8, "costs": [{"material_id": 42, "qty": 52}, {"material_id": 52, "qty": 52}, {"material_id": 102, "qty": 26}]}, {"grade": 2, "level": 9, "costs": [{"material_id": 42, "qty": 58}, {"material_id": 52, "qty": 58}, {"material_id": 102, "qty": 29}]}, {"grade": 2, "level": 10, "costs": [{"material_id": 42, "qty": 64}, {"material_id": 52, "qty": 64}, {"material_id": 102, "qty": 32}], "promote": {"material_id": 63, "qty": 40}}, {"grade": 3, "level": 1, "costs": [{"material_id": 43, "qty": 10}, {"material_id": 53, "qty": 10}, {"material_id": 103, "qty": 5}]}, {"grade": 3, "level": 2, "costs": [{"material_id": 43, "qty": 16}, {"material_id": 53, "qty": 16}, {"material_id": 103, "qty": 8}]}, {"grade": 3, "level": 3, "costs": [{"material_id": 43, "qty": 22}, {"material_id": 53, "qty": 22}, {"material_id": 103, "qty": 11}]}, {"grade": 3, "level": 4, "costs": [{"material_id": 43, "qty": 28}, {"material_id": 53, "qty": 28}, {"material_id": 103, "qty": 14}]}, {"grade": 3, "level": 5, "costs": [{"material_id": 43, "qty": 34}, {"material_id": 53, "qty": 34}, {"material_id": 103, "qty": 17}]}, {"grade": 3, "level": 6, "costs": [{"material_id": 43, "qty": 40}, {"material_id": 53, "qty": 40}, {"material_id": 103, "qty": 20}]}, {"grade": 3, "level": 7, "costs": [{"material_id": 43, "qty": 46}, {"material_id": 53, "qty": 46}, {"material_id": 103, "qty": 23}]}, {"grade": 3, "level": 8, "costs": [{"material_id": 43, "qty": 52}, {"material_id": 53, "qty": 52}, {"material_id": 103, "qty": 26}]}, {"grade": 3, "level": 9, "costs": [{"material_id": 43, "qty": 58}, {"material_id": 53, "qty": 58}, {"material_id": 103, "qty": 29}]}, {"grade": 3, "level": 10, "costs": [{"material_id": 43, "qty": 64}, {"material_id": 53, "qty": 64}, {"material_id": 103, "qty": 32}], "promote": {"material_id": 64, "qty": 40}}, {"grade": 4, "level": 1, "costs": [{"material_id": 44, "qty": 10}, {"material_id": 54, "qty": 10}, {"material_id": 104, "qty": 5}]}, {"grade": 4, "level": 2, "costs": [{"material_id": 44, "qty": 16}, {"material_id": 54, "qty": 16}, {"material_id": 104, "qty": 8}]}, {"grade": 4, "level": 3, "costs": [{"material_id": 44, "qty": 22}, {"material_id": 54, "qty": 22}, {"material_id": 104, "qty": 11}]}, {"grade": 4, "level": 4, "costs": [{"material_id": 44, "qty": 28}, {"material_id": 54, "qty": 28}, {"material_id": 104, "qty": 14}]}, {"grade": 4, "level": 5, "costs": [{"material_id": 44, "qty": 34}, {"material_id": 54, "qty": 34}, {"material_id": 104, "qty": 17}]}, {"grade": 4, "level": 6, "costs": [{"material_id": 44, "qty": 40}, {"material_id": 54, "qty": 40}, {"material_id": 104, "qty": 20}]}, {"grade": 4, "level": 7, "costs": [{"material_id": 44, "qty": 46}, {"material_id": 54, "qty": 46}, {"material_id": 104, "qty": 23}]}, {"grade": 4, "level": 8, "costs": [{"material_id": 44, "qty": 52}, {"material_id": 54, "qty": 52}, {"material_id": 104, "qty": 26}]}, {"grade": 4, "level": 9, "costs": [{"material_id": 44, "qty": 58}, {"material_id": 54, "qty": 58}, {"material_id": 104, "qty": 29}]}, {"grade": 4, "level": 10, "costs": [{"material_id": 44, "qty": 64}, {"material_id": 54, "qty": 64}, {"material_id": 104, "qty": 32}], "promote": {"material_id": 65, "qty": 40}}, {"grade": 5, "level": 1, "costs": [{"material_id": 45, "qty": 10}, {"material_id": 55, "qty": 10}, {"material_id": 105, "qty": 5}]}, {"grade": 5, "level": 2, "costs": [{"material_id": 45, "qty": 16}, {"material_id": 55, "qty": 16}, {"material_id": 105, "qty": 8}]}, {"grade": 5, "level": 3, "costs": [{"material_id": 45, "qty": 22}, {"material_id": 55, "qty": 22}, {"material_id": 105, "qty": 11}]}, {"grade": 5, "level": 4, "costs": [{"material_id": 45, "qty": 28}, {"material_id": 55, "qty": 28}, {"material_id": 105, "qty": 14}]}, {"grade": 5, "level": 5, "costs": [{"material_id": 45, "qty": 34}, {"material_id": 55, "qty": 34}, {"material_id": 105, "qty": 17}]}, {"grade": 5, "level": 6, "costs": [{"material_id": 45, "qty": 40}, {"material_id": 55, "qty": 40}, {"material_id": 105, "qty": 20}]}, {"grade": 5, "level": 7, "costs": [{"material_id": 45, "qty": 46}, {"material_id": 55, "qty": 46}, {"material_id": 105, "qty": 23}]}, {"grade": 5, "level": 8, "costs": [{"material_id": 45, "qty": 52}, {"material_id": 55, "qty": 52}, {"material_id": 105, "qty": 26}]}, {"grade": 5, "level": 9, "costs": [{"material_id": 45, "qty": 58}, {"material_id": 55, "qty": 58}, {"material_id": 105, "qty": 29}]}, {"grade": 5, "level": 10, "costs": [{"material_id": 45, "qty": 64}, {"material_id": 55, "qty": 64}, {"material_id": 105, "qty": 32}], "promote": {"material_id": 66, "qty": 40}}, {"grade": 6, "level": 1, "costs": [{"material_id": 46, "qty": 10}, {"material_id": 56, "qty": 10}, {"material_id": 106, "qty": 5}]}, {"grade": 6, "level": 2, "costs": [{"material_id": 46, "qty": 16}, {"material_id": 56, "qty": 16}, {"material_id": 106, "qty": 8}]}, {"grade": 6, "level": 3, "costs": [{"material_id": 46, "qty": 22}, {"material_id": 56, "qty": 22}, {"material_id": 106, "qty": 11}]}, {"grade": 6, "level": 4, "costs": [{"material_id": 46, "qty": 28}, {"material_id": 56, "qty": 28}, {"material_id": 106, "qty": 14}]}, {"grade": 6, "level": 5, "costs": [{"material_id": 46, "qty": 34}, {"material_id": 56, "qty": 34}, {"material_id": 106, "qty": 17}]}, {"grade": 6, "level": 6, "costs": [{"material_id": 46, "qty": 40}, {"material_id": 56, "qty": 40}, {"material_id": 106, "qty": 20}]}, {"grade": 6, "level": 7, "costs": [{"material_id": 46, "qty": 46}, {"material_id": 56, "qty": 46}, {"material_id": 106, "qty": 23}]}, {"grade": 6, "level": 8, "costs": [{"material_id": 46, "qty": 52}, {"material_id": 56, "qty": 52}, {"material_id": 106, "qty": 26}]}, {"grade": 6, "level": 9, "costs": [{"material_id": 46, "qty": 58}, {"material_id": 56, "qty": 58}, {"material_id": 106, "qty": 29}]}, {"grade": 6, "level": 10, "costs": [{"material_id": 46, "qty": 64}, {"material_id": 56, "qty": 64}, {"material_id": 106, "qty": 32}]}], "desc_ko": "원정 전투력 보정 + 소모품 슬롯"}, {"id": 5, "name_ko": "공방", "name_key": "", "specialty_family_id": 8, "grade_max": 6, "level_per_grade": 10, "effects": [{"type": "craft_grade", "base": 1, "per_level": 0, "unit": "성(=시설 등급)"}, {"type": "craft_discount", "base": 0, "per_level": 0.5, "unit": "%"}], "levels": [{"grade": 1, "level": 1, "costs": [{"material_id": 41, "qty": 10}, {"material_id": 51, "qty": 10}, {"material_id": 81, "qty": 5}]}, {"grade": 1, "level": 2, "costs": [{"material_id": 41, "qty": 16}, {"material_id": 51, "qty": 16}, {"material_id": 81, "qty": 8}]}, {"grade": 1, "level": 3, "costs": [{"material_id": 41, "qty": 22}, {"material_id": 51, "qty": 22}, {"material_id": 81, "qty": 11}]}, {"grade": 1, "level": 4, "costs": [{"material_id": 41, "qty": 28}, {"material_id": 51, "qty": 28}, {"material_id": 81, "qty": 14}]}, {"grade": 1, "level": 5, "costs": [{"material_id": 41, "qty": 34}, {"material_id": 51, "qty": 34}, {"material_id": 81, "qty": 17}]}, {"grade": 1, "level": 6, "costs": [{"material_id": 41, "qty": 40}, {"material_id": 51, "qty": 40}, {"material_id": 81, "qty": 20}]}, {"grade": 1, "level": 7, "costs": [{"material_id": 41, "qty": 46}, {"material_id": 51, "qty": 46}, {"material_id": 81, "qty": 23}]}, {"grade": 1, "level": 8, "costs": [{"material_id": 41, "qty": 52}, {"material_id": 51, "qty": 52}, {"material_id": 81, "qty": 26}]}, {"grade": 1, "level": 9, "costs": [{"material_id": 41, "qty": 58}, {"material_id": 51, "qty": 58}, {"material_id": 81, "qty": 29}]}, {"grade": 1, "level": 10, "costs": [{"material_id": 41, "qty": 64}, {"material_id": 51, "qty": 64}, {"material_id": 81, "qty": 32}], "promote": {"material_id": 62, "qty": 40}}, {"grade": 2, "level": 1, "costs": [{"material_id": 42, "qty": 10}, {"material_id": 52, "qty": 10}, {"material_id": 82, "qty": 5}]}, {"grade": 2, "level": 2, "costs": [{"material_id": 42, "qty": 16}, {"material_id": 52, "qty": 16}, {"material_id": 82, "qty": 8}]}, {"grade": 2, "level": 3, "costs": [{"material_id": 42, "qty": 22}, {"material_id": 52, "qty": 22}, {"material_id": 82, "qty": 11}]}, {"grade": 2, "level": 4, "costs": [{"material_id": 42, "qty": 28}, {"material_id": 52, "qty": 28}, {"material_id": 82, "qty": 14}]}, {"grade": 2, "level": 5, "costs": [{"material_id": 42, "qty": 34}, {"material_id": 52, "qty": 34}, {"material_id": 82, "qty": 17}]}, {"grade": 2, "level": 6, "costs": [{"material_id": 42, "qty": 40}, {"material_id": 52, "qty": 40}, {"material_id": 82, "qty": 20}]}, {"grade": 2, "level": 7, "costs": [{"material_id": 42, "qty": 46}, {"material_id": 52, "qty": 46}, {"material_id": 82, "qty": 23}]}, {"grade": 2, "level": 8, "costs": [{"material_id": 42, "qty": 52}, {"material_id": 52, "qty": 52}, {"material_id": 82, "qty": 26}]}, {"grade": 2, "level": 9, "costs": [{"material_id": 42, "qty": 58}, {"material_id": 52, "qty": 58}, {"material_id": 82, "qty": 29}]}, {"grade": 2, "level": 10, "costs": [{"material_id": 42, "qty": 64}, {"material_id": 52, "qty": 64}, {"material_id": 82, "qty": 32}], "promote": {"material_id": 63, "qty": 40}}, {"grade": 3, "level": 1, "costs": [{"material_id": 43, "qty": 10}, {"material_id": 53, "qty": 10}, {"material_id": 83, "qty": 5}]}, {"grade": 3, "level": 2, "costs": [{"material_id": 43, "qty": 16}, {"material_id": 53, "qty": 16}, {"material_id": 83, "qty": 8}]}, {"grade": 3, "level": 3, "costs": [{"material_id": 43, "qty": 22}, {"material_id": 53, "qty": 22}, {"material_id": 83, "qty": 11}]}, {"grade": 3, "level": 4, "costs": [{"material_id": 43, "qty": 28}, {"material_id": 53, "qty": 28}, {"material_id": 83, "qty": 14}]}, {"grade": 3, "level": 5, "costs": [{"material_id": 43, "qty": 34}, {"material_id": 53, "qty": 34}, {"material_id": 83, "qty": 17}]}, {"grade": 3, "level": 6, "costs": [{"material_id": 43, "qty": 40}, {"material_id": 53, "qty": 40}, {"material_id": 83, "qty": 20}]}, {"grade": 3, "level": 7, "costs": [{"material_id": 43, "qty": 46}, {"material_id": 53, "qty": 46}, {"material_id": 83, "qty": 23}]}, {"grade": 3, "level": 8, "costs": [{"material_id": 43, "qty": 52}, {"material_id": 53, "qty": 52}, {"material_id": 83, "qty": 26}]}, {"grade": 3, "level": 9, "costs": [{"material_id": 43, "qty": 58}, {"material_id": 53, "qty": 58}, {"material_id": 83, "qty": 29}]}, {"grade": 3, "level": 10, "costs": [{"material_id": 43, "qty": 64}, {"material_id": 53, "qty": 64}, {"material_id": 83, "qty": 32}], "promote": {"material_id": 64, "qty": 40}}, {"grade": 4, "level": 1, "costs": [{"material_id": 44, "qty": 10}, {"material_id": 54, "qty": 10}, {"material_id": 84, "qty": 5}]}, {"grade": 4, "level": 2, "costs": [{"material_id": 44, "qty": 16}, {"material_id": 54, "qty": 16}, {"material_id": 84, "qty": 8}]}, {"grade": 4, "level": 3, "costs": [{"material_id": 44, "qty": 22}, {"material_id": 54, "qty": 22}, {"material_id": 84, "qty": 11}]}, {"grade": 4, "level": 4, "costs": [{"material_id": 44, "qty": 28}, {"material_id": 54, "qty": 28}, {"material_id": 84, "qty": 14}]}, {"grade": 4, "level": 5, "costs": [{"material_id": 44, "qty": 34}, {"material_id": 54, "qty": 34}, {"material_id": 84, "qty": 17}]}, {"grade": 4, "level": 6, "costs": [{"material_id": 44, "qty": 40}, {"material_id": 54, "qty": 40}, {"material_id": 84, "qty": 20}]}, {"grade": 4, "level": 7, "costs": [{"material_id": 44, "qty": 46}, {"material_id": 54, "qty": 46}, {"material_id": 84, "qty": 23}]}, {"grade": 4, "level": 8, "costs": [{"material_id": 44, "qty": 52}, {"material_id": 54, "qty": 52}, {"material_id": 84, "qty": 26}]}, {"grade": 4, "level": 9, "costs": [{"material_id": 44, "qty": 58}, {"material_id": 54, "qty": 58}, {"material_id": 84, "qty": 29}]}, {"grade": 4, "level": 10, "costs": [{"material_id": 44, "qty": 64}, {"material_id": 54, "qty": 64}, {"material_id": 84, "qty": 32}], "promote": {"material_id": 65, "qty": 40}}, {"grade": 5, "level": 1, "costs": [{"material_id": 45, "qty": 10}, {"material_id": 55, "qty": 10}, {"material_id": 85, "qty": 5}]}, {"grade": 5, "level": 2, "costs": [{"material_id": 45, "qty": 16}, {"material_id": 55, "qty": 16}, {"material_id": 85, "qty": 8}]}, {"grade": 5, "level": 3, "costs": [{"material_id": 45, "qty": 22}, {"material_id": 55, "qty": 22}, {"material_id": 85, "qty": 11}]}, {"grade": 5, "level": 4, "costs": [{"material_id": 45, "qty": 28}, {"material_id": 55, "qty": 28}, {"material_id": 85, "qty": 14}]}, {"grade": 5, "level": 5, "costs": [{"material_id": 45, "qty": 34}, {"material_id": 55, "qty": 34}, {"material_id": 85, "qty": 17}]}, {"grade": 5, "level": 6, "costs": [{"material_id": 45, "qty": 40}, {"material_id": 55, "qty": 40}, {"material_id": 85, "qty": 20}]}, {"grade": 5, "level": 7, "costs": [{"material_id": 45, "qty": 46}, {"material_id": 55, "qty": 46}, {"material_id": 85, "qty": 23}]}, {"grade": 5, "level": 8, "costs": [{"material_id": 45, "qty": 52}, {"material_id": 55, "qty": 52}, {"material_id": 85, "qty": 26}]}, {"grade": 5, "level": 9, "costs": [{"material_id": 45, "qty": 58}, {"material_id": 55, "qty": 58}, {"material_id": 85, "qty": 29}]}, {"grade": 5, "level": 10, "costs": [{"material_id": 45, "qty": 64}, {"material_id": 55, "qty": 64}, {"material_id": 85, "qty": 32}], "promote": {"material_id": 66, "qty": 40}}, {"grade": 6, "level": 1, "costs": [{"material_id": 46, "qty": 10}, {"material_id": 56, "qty": 10}, {"material_id": 86, "qty": 5}]}, {"grade": 6, "level": 2, "costs": [{"material_id": 46, "qty": 16}, {"material_id": 56, "qty": 16}, {"material_id": 86, "qty": 8}]}, {"grade": 6, "level": 3, "costs": [{"material_id": 46, "qty": 22}, {"material_id": 56, "qty": 22}, {"material_id": 86, "qty": 11}]}, {"grade": 6, "level": 4, "costs": [{"material_id": 46, "qty": 28}, {"material_id": 56, "qty": 28}, {"material_id": 86, "qty": 14}]}, {"grade": 6, "level": 5, "costs": [{"material_id": 46, "qty": 34}, {"material_id": 56, "qty": 34}, {"material_id": 86, "qty": 17}]}, {"grade": 6, "level": 6, "costs": [{"material_id": 46, "qty": 40}, {"material_id": 56, "qty": 40}, {"material_id": 86, "qty": 20}]}, {"grade": 6, "level": 7, "costs": [{"material_id": 46, "qty": 46}, {"material_id": 56, "qty": 46}, {"material_id": 86, "qty": 23}]}, {"grade": 6, "level": 8, "costs": [{"material_id": 46, "qty": 52}, {"material_id": 56, "qty": 52}, {"material_id": 86, "qty": 26}]}, {"grade": 6, "level": 9, "costs": [{"material_id": 46, "qty": 58}, {"material_id": 56, "qty": 58}, {"material_id": 86, "qty": 29}]}, {"grade": 6, "level": 10, "costs": [{"material_id": 46, "qty": 64}, {"material_id": 56, "qty": 64}, {"material_id": 86, "qty": 32}]}], "desc_ko": "환경 장비 제작. 제작 가능 등급=시설 등급"}, {"id": 6, "name_ko": "대학", "name_key": "", "specialty_family_id": 13, "grade_max": 6, "level_per_grade": 10, "effects": [{"type": "research_grade", "base": 1, "per_level": 0, "unit": "성(=시설 등급)"}, {"type": "research_speed", "base": 100, "per_level": 3, "unit": "%"}], "levels": [{"grade": 1, "level": 1, "costs": [{"material_id": 41, "qty": 10}, {"material_id": 51, "qty": 10}, {"material_id": 131, "qty": 5}]}, {"grade": 1, "level": 2, "costs": [{"material_id": 41, "qty": 16}, {"material_id": 51, "qty": 16}, {"material_id": 131, "qty": 8}]}, {"grade": 1, "level": 3, "costs": [{"material_id": 41, "qty": 22}, {"material_id": 51, "qty": 22}, {"material_id": 131, "qty": 11}]}, {"grade": 1, "level": 4, "costs": [{"material_id": 41, "qty": 28}, {"material_id": 51, "qty": 28}, {"material_id": 131, "qty": 14}]}, {"grade": 1, "level": 5, "costs": [{"material_id": 41, "qty": 34}, {"material_id": 51, "qty": 34}, {"material_id": 131, "qty": 17}]}, {"grade": 1, "level": 6, "costs": [{"material_id": 41, "qty": 40}, {"material_id": 51, "qty": 40}, {"material_id": 131, "qty": 20}]}, {"grade": 1, "level": 7, "costs": [{"material_id": 41, "qty": 46}, {"material_id": 51, "qty": 46}, {"material_id": 131, "qty": 23}]}, {"grade": 1, "level": 8, "costs": [{"material_id": 41, "qty": 52}, {"material_id": 51, "qty": 52}, {"material_id": 131, "qty": 26}]}, {"grade": 1, "level": 9, "costs": [{"material_id": 41, "qty": 58}, {"material_id": 51, "qty": 58}, {"material_id": 131, "qty": 29}]}, {"grade": 1, "level": 10, "costs": [{"material_id": 41, "qty": 64}, {"material_id": 51, "qty": 64}, {"material_id": 131, "qty": 32}], "promote": {"material_id": 62, "qty": 40}}, {"grade": 2, "level": 1, "costs": [{"material_id": 42, "qty": 10}, {"material_id": 52, "qty": 10}, {"material_id": 132, "qty": 5}]}, {"grade": 2, "level": 2, "costs": [{"material_id": 42, "qty": 16}, {"material_id": 52, "qty": 16}, {"material_id": 132, "qty": 8}]}, {"grade": 2, "level": 3, "costs": [{"material_id": 42, "qty": 22}, {"material_id": 52, "qty": 22}, {"material_id": 132, "qty": 11}]}, {"grade": 2, "level": 4, "costs": [{"material_id": 42, "qty": 28}, {"material_id": 52, "qty": 28}, {"material_id": 132, "qty": 14}]}, {"grade": 2, "level": 5, "costs": [{"material_id": 42, "qty": 34}, {"material_id": 52, "qty": 34}, {"material_id": 132, "qty": 17}]}, {"grade": 2, "level": 6, "costs": [{"material_id": 42, "qty": 40}, {"material_id": 52, "qty": 40}, {"material_id": 132, "qty": 20}]}, {"grade": 2, "level": 7, "costs": [{"material_id": 42, "qty": 46}, {"material_id": 52, "qty": 46}, {"material_id": 132, "qty": 23}]}, {"grade": 2, "level": 8, "costs": [{"material_id": 42, "qty": 52}, {"material_id": 52, "qty": 52}, {"material_id": 132, "qty": 26}]}, {"grade": 2, "level": 9, "costs": [{"material_id": 42, "qty": 58}, {"material_id": 52, "qty": 58}, {"material_id": 132, "qty": 29}]}, {"grade": 2, "level": 10, "costs": [{"material_id": 42, "qty": 64}, {"material_id": 52, "qty": 64}, {"material_id": 132, "qty": 32}], "promote": {"material_id": 63, "qty": 40}}, {"grade": 3, "level": 1, "costs": [{"material_id": 43, "qty": 10}, {"material_id": 53, "qty": 10}, {"material_id": 133, "qty": 5}]}, {"grade": 3, "level": 2, "costs": [{"material_id": 43, "qty": 16}, {"material_id": 53, "qty": 16}, {"material_id": 133, "qty": 8}]}, {"grade": 3, "level": 3, "costs": [{"material_id": 43, "qty": 22}, {"material_id": 53, "qty": 22}, {"material_id": 133, "qty": 11}]}, {"grade": 3, "level": 4, "costs": [{"material_id": 43, "qty": 28}, {"material_id": 53, "qty": 28}, {"material_id": 133, "qty": 14}]}, {"grade": 3, "level": 5, "costs": [{"material_id": 43, "qty": 34}, {"material_id": 53, "qty": 34}, {"material_id": 133, "qty": 17}]}, {"grade": 3, "level": 6, "costs": [{"material_id": 43, "qty": 40}, {"material_id": 53, "qty": 40}, {"material_id": 133, "qty": 20}]}, {"grade": 3, "level": 7, "costs": [{"material_id": 43, "qty": 46}, {"material_id": 53, "qty": 46}, {"material_id": 133, "qty": 23}]}, {"grade": 3, "level": 8, "costs": [{"material_id": 43, "qty": 52}, {"material_id": 53, "qty": 52}, {"material_id": 133, "qty": 26}]}, {"grade": 3, "level": 9, "costs": [{"material_id": 43, "qty": 58}, {"material_id": 53, "qty": 58}, {"material_id": 133, "qty": 29}]}, {"grade": 3, "level": 10, "costs": [{"material_id": 43, "qty": 64}, {"material_id": 53, "qty": 64}, {"material_id": 133, "qty": 32}], "promote": {"material_id": 64, "qty": 40}}, {"grade": 4, "level": 1, "costs": [{"material_id": 44, "qty": 10}, {"material_id": 54, "qty": 10}, {"material_id": 134, "qty": 5}]}, {"grade": 4, "level": 2, "costs": [{"material_id": 44, "qty": 16}, {"material_id": 54, "qty": 16}, {"material_id": 134, "qty": 8}]}, {"grade": 4, "level": 3, "costs": [{"material_id": 44, "qty": 22}, {"material_id": 54, "qty": 22}, {"material_id": 134, "qty": 11}]}, {"grade": 4, "level": 4, "costs": [{"material_id": 44, "qty": 28}, {"material_id": 54, "qty": 28}, {"material_id": 134, "qty": 14}]}, {"grade": 4, "level": 5, "costs": [{"material_id": 44, "qty": 34}, {"material_id": 54, "qty": 34}, {"material_id": 134, "qty": 17}]}, {"grade": 4, "level": 6, "costs": [{"material_id": 44, "qty": 40}, {"material_id": 54, "qty": 40}, {"material_id": 134, "qty": 20}]}, {"grade": 4, "level": 7, "costs": [{"material_id": 44, "qty": 46}, {"material_id": 54, "qty": 46}, {"material_id": 134, "qty": 23}]}, {"grade": 4, "level": 8, "costs": [{"material_id": 44, "qty": 52}, {"material_id": 54, "qty": 52}, {"material_id": 134, "qty": 26}]}, {"grade": 4, "level": 9, "costs": [{"material_id": 44, "qty": 58}, {"material_id": 54, "qty": 58}, {"material_id": 134, "qty": 29}]}, {"grade": 4, "level": 10, "costs": [{"material_id": 44, "qty": 64}, {"material_id": 54, "qty": 64}, {"material_id": 134, "qty": 32}], "promote": {"material_id": 65, "qty": 40}}, {"grade": 5, "level": 1, "costs": [{"material_id": 45, "qty": 10}, {"material_id": 55, "qty": 10}, {"material_id": 135, "qty": 5}]}, {"grade": 5, "level": 2, "costs": [{"material_id": 45, "qty": 16}, {"material_id": 55, "qty": 16}, {"material_id": 135, "qty": 8}]}, {"grade": 5, "level": 3, "costs": [{"material_id": 45, "qty": 22}, {"material_id": 55, "qty": 22}, {"material_id": 135, "qty": 11}]}, {"grade": 5, "level": 4, "costs": [{"material_id": 45, "qty": 28}, {"material_id": 55, "qty": 28}, {"material_id": 135, "qty": 14}]}, {"grade": 5, "level": 5, "costs": [{"material_id": 45, "qty": 34}, {"material_id": 55, "qty": 34}, {"material_id": 135, "qty": 17}]}, {"grade": 5, "level": 6, "costs": [{"material_id": 45, "qty": 40}, {"material_id": 55, "qty": 40}, {"material_id": 135, "qty": 20}]}, {"grade": 5, "level": 7, "costs": [{"material_id": 45, "qty": 46}, {"material_id": 55, "qty": 46}, {"material_id": 135, "qty": 23}]}, {"grade": 5, "level": 8, "costs": [{"material_id": 45, "qty": 52}, {"material_id": 55, "qty": 52}, {"material_id": 135, "qty": 26}]}, {"grade": 5, "level": 9, "costs": [{"material_id": 45, "qty": 58}, {"material_id": 55, "qty": 58}, {"material_id": 135, "qty": 29}]}, {"grade": 5, "level": 10, "costs": [{"material_id": 45, "qty": 64}, {"material_id": 55, "qty": 64}, {"material_id": 135, "qty": 32}], "promote": {"material_id": 66, "qty": 40}}, {"grade": 6, "level": 1, "costs": [{"material_id": 46, "qty": 10}, {"material_id": 56, "qty": 10}, {"material_id": 136, "qty": 5}]}, {"grade": 6, "level": 2, "costs": [{"material_id": 46, "qty": 16}, {"material_id": 56, "qty": 16}, {"material_id": 136, "qty": 8}]}, {"grade": 6, "level": 3, "costs": [{"material_id": 46, "qty": 22}, {"material_id": 56, "qty": 22}, {"material_id": 136, "qty": 11}]}, {"grade": 6, "level": 4, "costs": [{"material_id": 46, "qty": 28}, {"material_id": 56, "qty": 28}, {"material_id": 136, "qty": 14}]}, {"grade": 6, "level": 5, "costs": [{"material_id": 46, "qty": 34}, {"material_id": 56, "qty": 34}, {"material_id": 136, "qty": 17}]}, {"grade": 6, "level": 6, "costs": [{"material_id": 46, "qty": 40}, {"material_id": 56, "qty": 40}, {"material_id": 136, "qty": 20}]}, {"grade": 6, "level": 7, "costs": [{"material_id": 46, "qty": 46}, {"material_id": 56, "qty": 46}, {"material_id": 136, "qty": 23}]}, {"grade": 6, "level": 8, "costs": [{"material_id": 46, "qty": 52}, {"material_id": 56, "qty": 52}, {"material_id": 136, "qty": 26}]}, {"grade": 6, "level": 9, "costs": [{"material_id": 46, "qty": 58}, {"material_id": 56, "qty": 58}, {"material_id": 136, "qty": 29}]}, {"grade": 6, "level": 10, "costs": [{"material_id": 46, "qty": 64}, {"material_id": 56, "qty": 64}, {"material_id": 136, "qty": 32}]}], "desc_ko": "정복 내부 연구 트리 해금/가속"}, {"id": 7, "name_ko": "보급소", "name_key": "", "specialty_family_id": 1, "grade_max": 6, "level_per_grade": 10, "effects": [{"type": "sortie_max", "base": 3, "per_level": 0, "unit": "회(등급당+1)"}, {"type": "sortie_regen", "base": 100, "per_level": 1.5, "unit": "%"}, {"type": "food_buff", "base": 100, "per_level": 2, "unit": "%"}], "levels": [{"grade": 1, "level": 1, "costs": [{"material_id": 41, "qty": 10}, {"material_id": 51, "qty": 10}, {"material_id": 11, "qty": 5}]}, {"grade": 1, "level": 2, "costs": [{"material_id": 41, "qty": 16}, {"material_id": 51, "qty": 16}, {"material_id": 11, "qty": 8}]}, {"grade": 1, "level": 3, "costs": [{"material_id": 41, "qty": 22}, {"material_id": 51, "qty": 22}, {"material_id": 11, "qty": 11}]}, {"grade": 1, "level": 4, "costs": [{"material_id": 41, "qty": 28}, {"material_id": 51, "qty": 28}, {"material_id": 11, "qty": 14}]}, {"grade": 1, "level": 5, "costs": [{"material_id": 41, "qty": 34}, {"material_id": 51, "qty": 34}, {"material_id": 11, "qty": 17}]}, {"grade": 1, "level": 6, "costs": [{"material_id": 41, "qty": 40}, {"material_id": 51, "qty": 40}, {"material_id": 11, "qty": 20}]}, {"grade": 1, "level": 7, "costs": [{"material_id": 41, "qty": 46}, {"material_id": 51, "qty": 46}, {"material_id": 11, "qty": 23}]}, {"grade": 1, "level": 8, "costs": [{"material_id": 41, "qty": 52}, {"material_id": 51, "qty": 52}, {"material_id": 11, "qty": 26}]}, {"grade": 1, "level": 9, "costs": [{"material_id": 41, "qty": 58}, {"material_id": 51, "qty": 58}, {"material_id": 11, "qty": 29}]}, {"grade": 1, "level": 10, "costs": [{"material_id": 41, "qty": 64}, {"material_id": 51, "qty": 64}, {"material_id": 11, "qty": 32}], "promote": {"material_id": 62, "qty": 40}}, {"grade": 2, "level": 1, "costs": [{"material_id": 42, "qty": 10}, {"material_id": 52, "qty": 10}, {"material_id": 12, "qty": 5}]}, {"grade": 2, "level": 2, "costs": [{"material_id": 42, "qty": 16}, {"material_id": 52, "qty": 16}, {"material_id": 12, "qty": 8}]}, {"grade": 2, "level": 3, "costs": [{"material_id": 42, "qty": 22}, {"material_id": 52, "qty": 22}, {"material_id": 12, "qty": 11}]}, {"grade": 2, "level": 4, "costs": [{"material_id": 42, "qty": 28}, {"material_id": 52, "qty": 28}, {"material_id": 12, "qty": 14}]}, {"grade": 2, "level": 5, "costs": [{"material_id": 42, "qty": 34}, {"material_id": 52, "qty": 34}, {"material_id": 12, "qty": 17}]}, {"grade": 2, "level": 6, "costs": [{"material_id": 42, "qty": 40}, {"material_id": 52, "qty": 40}, {"material_id": 12, "qty": 20}]}, {"grade": 2, "level": 7, "costs": [{"material_id": 42, "qty": 46}, {"material_id": 52, "qty": 46}, {"material_id": 12, "qty": 23}]}, {"grade": 2, "level": 8, "costs": [{"material_id": 42, "qty": 52}, {"material_id": 52, "qty": 52}, {"material_id": 12, "qty": 26}]}, {"grade": 2, "level": 9, "costs": [{"material_id": 42, "qty": 58}, {"material_id": 52, "qty": 58}, {"material_id": 12, "qty": 29}]}, {"grade": 2, "level": 10, "costs": [{"material_id": 42, "qty": 64}, {"material_id": 52, "qty": 64}, {"material_id": 12, "qty": 32}], "promote": {"material_id": 63, "qty": 40}}, {"grade": 3, "level": 1, "costs": [{"material_id": 43, "qty": 10}, {"material_id": 53, "qty": 10}, {"material_id": 13, "qty": 5}]}, {"grade": 3, "level": 2, "costs": [{"material_id": 43, "qty": 16}, {"material_id": 53, "qty": 16}, {"material_id": 13, "qty": 8}]}, {"grade": 3, "level": 3, "costs": [{"material_id": 43, "qty": 22}, {"material_id": 53, "qty": 22}, {"material_id": 13, "qty": 11}]}, {"grade": 3, "level": 4, "costs": [{"material_id": 43, "qty": 28}, {"material_id": 53, "qty": 28}, {"material_id": 13, "qty": 14}]}, {"grade": 3, "level": 5, "costs": [{"material_id": 43, "qty": 34}, {"material_id": 53, "qty": 34}, {"material_id": 13, "qty": 17}]}, {"grade": 3, "level": 6, "costs": [{"material_id": 43, "qty": 40}, {"material_id": 53, "qty": 40}, {"material_id": 13, "qty": 20}]}, {"grade": 3, "level": 7, "costs": [{"material_id": 43, "qty": 46}, {"material_id": 53, "qty": 46}, {"material_id": 13, "qty": 23}]}, {"grade": 3, "level": 8, "costs": [{"material_id": 43, "qty": 52}, {"material_id": 53, "qty": 52}, {"material_id": 13, "qty": 26}]}, {"grade": 3, "level": 9, "costs": [{"material_id": 43, "qty": 58}, {"material_id": 53, "qty": 58}, {"material_id": 13, "qty": 29}]}, {"grade": 3, "level": 10, "costs": [{"material_id": 43, "qty": 64}, {"material_id": 53, "qty": 64}, {"material_id": 13, "qty": 32}], "promote": {"material_id": 64, "qty": 40}}, {"grade": 4, "level": 1, "costs": [{"material_id": 44, "qty": 10}, {"material_id": 54, "qty": 10}, {"material_id": 14, "qty": 5}]}, {"grade": 4, "level": 2, "costs": [{"material_id": 44, "qty": 16}, {"material_id": 54, "qty": 16}, {"material_id": 14, "qty": 8}]}, {"grade": 4, "level": 3, "costs": [{"material_id": 44, "qty": 22}, {"material_id": 54, "qty": 22}, {"material_id": 14, "qty": 11}]}, {"grade": 4, "level": 4, "costs": [{"material_id": 44, "qty": 28}, {"material_id": 54, "qty": 28}, {"material_id": 14, "qty": 14}]}, {"grade": 4, "level": 5, "costs": [{"material_id": 44, "qty": 34}, {"material_id": 54, "qty": 34}, {"material_id": 14, "qty": 17}]}, {"grade": 4, "level": 6, "costs": [{"material_id": 44, "qty": 40}, {"material_id": 54, "qty": 40}, {"material_id": 14, "qty": 20}]}, {"grade": 4, "level": 7, "costs": [{"material_id": 44, "qty": 46}, {"material_id": 54, "qty": 46}, {"material_id": 14, "qty": 23}]}, {"grade": 4, "level": 8, "costs": [{"material_id": 44, "qty": 52}, {"material_id": 54, "qty": 52}, {"material_id": 14, "qty": 26}]}, {"grade": 4, "level": 9, "costs": [{"material_id": 44, "qty": 58}, {"material_id": 54, "qty": 58}, {"material_id": 14, "qty": 29}]}, {"grade": 4, "level": 10, "costs": [{"material_id": 44, "qty": 64}, {"material_id": 54, "qty": 64}, {"material_id": 14, "qty": 32}], "promote": {"material_id": 65, "qty": 40}}, {"grade": 5, "level": 1, "costs": [{"material_id": 45, "qty": 10}, {"material_id": 55, "qty": 10}, {"material_id": 15, "qty": 5}]}, {"grade": 5, "level": 2, "costs": [{"material_id": 45, "qty": 16}, {"material_id": 55, "qty": 16}, {"material_id": 15, "qty": 8}]}, {"grade": 5, "level": 3, "costs": [{"material_id": 45, "qty": 22}, {"material_id": 55, "qty": 22}, {"material_id": 15, "qty": 11}]}, {"grade": 5, "level": 4, "costs": [{"material_id": 45, "qty": 28}, {"material_id": 55, "qty": 28}, {"material_id": 15, "qty": 14}]}, {"grade": 5, "level": 5, "costs": [{"material_id": 45, "qty": 34}, {"material_id": 55, "qty": 34}, {"material_id": 15, "qty": 17}]}, {"grade": 5, "level": 6, "costs": [{"material_id": 45, "qty": 40}, {"material_id": 55, "qty": 40}, {"material_id": 15, "qty": 20}]}, {"grade": 5, "level": 7, "costs": [{"material_id": 45, "qty": 46}, {"material_id": 55, "qty": 46}, {"material_id": 15, "qty": 23}]}, {"grade": 5, "level": 8, "costs": [{"material_id": 45, "qty": 52}, {"material_id": 55, "qty": 52}, {"material_id": 15, "qty": 26}]}, {"grade": 5, "level": 9, "costs": [{"material_id": 45, "qty": 58}, {"material_id": 55, "qty": 58}, {"material_id": 15, "qty": 29}]}, {"grade": 5, "level": 10, "costs": [{"material_id": 45, "qty": 64}, {"material_id": 55, "qty": 64}, {"material_id": 15, "qty": 32}], "promote": {"material_id": 66, "qty": 40}}, {"grade": 6, "level": 1, "costs": [{"material_id": 46, "qty": 10}, {"material_id": 56, "qty": 10}, {"material_id": 16, "qty": 5}]}, {"grade": 6, "level": 2, "costs": [{"material_id": 46, "qty": 16}, {"material_id": 56, "qty": 16}, {"material_id": 16, "qty": 8}]}, {"grade": 6, "level": 3, "costs": [{"material_id": 46, "qty": 22}, {"material_id": 56, "qty": 22}, {"material_id": 16, "qty": 11}]}, {"grade": 6, "level": 4, "costs": [{"material_id": 46, "qty": 28}, {"material_id": 56, "qty": 28}, {"material_id": 16, "qty": 14}]}, {"grade": 6, "level": 5, "costs": [{"material_id": 46, "qty": 34}, {"material_id": 56, "qty": 34}, {"material_id": 16, "qty": 17}]}, {"grade": 6, "level": 6, "costs": [{"material_id": 46, "qty": 40}, {"material_id": 56, "qty": 40}, {"material_id": 16, "qty": 20}]}, {"grade": 6, "level": 7, "costs": [{"material_id": 46, "qty": 46}, {"material_id": 56, "qty": 46}, {"material_id": 16, "qty": 23}]}, {"grade": 6, "level": 8, "costs": [{"material_id": 46, "qty": 52}, {"material_id": 56, "qty": 52}, {"material_id": 16, "qty": 26}]}, {"grade": 6, "level": 9, "costs": [{"material_id": 46, "qty": 58}, {"material_id": 56, "qty": 58}, {"material_id": 16, "qty": 29}]}, {"grade": 6, "level": 10, "costs": [{"material_id": 46, "qty": 64}, {"material_id": 56, "qty": 64}, {"material_id": 16, "qty": 32}]}], "desc_ko": "출정권 최대·충전 + 식량 버프 효율"}] |
Bundled data: assets/images/conquest/conquestMaterialBook.draft.json 3
| Row | Change | Field | Before | After |
|---|---|---|---|---|
| _note | removed | "시트 변환본 (sheetToBooks.mjs)" | ||
| families | removed | [{"id": 1, "name_ko": "곡물", "category": "food", "main_terrain": "농경지"}, {"id": 2, "name_ko": "고기", "category": "food", "main_terrain": "목초지"}, {"id": 3, "name_ko": "물고기", "category": "food", "main_terrain": "물가"}, {"id": 4, "name_ko": "목재", "category": "build", "main_terrain": "숲"}, {"id": 5, "name_ko": "석재", "category": "build", "main_terrain": "산악"}, {"id": 6, "name_ko": "금속", "category": "build", "main_terrain": "광산"}, {"id": 7, "name_ko": "가죽", "category": "cloth", "main_terrain": "사냥터"}, {"id": 8, "name_ko": "옷감", "category": "cloth", "main_terrain": "목초지"}, {"id": 9, "name_ko": "약초", "category": "battle", "main_terrain": "늪지"}, {"id": 10, "name_ko": "숫돌", "category": "battle", "main_terrain": "산악"}, {"id": 11, "name_ko": "보석", "category": "luxury", "main_terrain": "광산"}, {"id": 12, "name_ko": "술", "category": "luxury", "main_terrain": "농경지"}, {"id": 13, "name_ko": "마나", "category": "magic", "main_terrain": "유적"}, {"id": 14, "name_ko": "뼈", "category": "magic", "main_terrain": "늪지"}, {"id": 15, "name_ko": "별", "category": "magic", "main_terrain": "유적"}] | ||
| materials | removed | [{"id": 11, "family_id": 1, "family_ko": "곡물", "category": "food", "grade": 1, "name_ko": "밀", "name_key": "", "source_terrain": "농경지"}, {"id": 12, "family_id": 1, "family_ko": "곡물", "category": "food", "grade": 2, "name_ko": "보리", "name_key": "", "source_terrain": "농경지"}, {"id": 13, "family_id": 1, "family_ko": "곡물", "category": "food", "grade": 3, "name_ko": "귀리", "name_key": "", "source_terrain": "농경지"}, {"id": 14, "family_id": 1, "family_ko": "곡물", "category": "food", "grade": 4, "name_ko": "이슬쌀", "name_key": "", "source_terrain": "농경지"}, {"id": 15, "family_id": 1, "family_ko": "곡물", "category": "food", "grade": 5, "name_ko": "검은 호밀", "name_key": "", "source_terrain": "농경지"}, {"id": 16, "family_id": 1, "family_ko": "곡물", "category": "food", "grade": 6, "name_ko": "황금 밀", "name_key": "", "source_terrain": "농경지"}, {"id": 21, "family_id": 2, "family_ko": "고기", "category": "food", "grade": 1, "name_ko": "닭고기", "name_key": "", "source_terrain": "목초지"}, {"id": 22, "family_id": 2, "family_ko": "고기", "category": "food", "grade": 2, "name_ko": "양고기", "name_key": "", "source_terrain": "목초지"}, {"id": 23, "family_id": 2, "family_ko": "고기", "category": "food", "grade": 3, "name_ko": "털소 고기", "name_key": "", "source_terrain": "목초지"}, {"id": 24, "family_id": 2, "family_ko": "고기", "category": "food", "grade": 4, "name_ko": "은사슴 고기", "name_key": "", "source_terrain": "목초지"}, {"id": 25, "family_id": 2, "family_ko": "고기", "category": "food", "grade": 5, "name_ko": "마수 고기", "name_key": "", "source_terrain": "목초지"}, {"id": 26, "family_id": 2, "family_ko": "고기", "category": "food", "grade": 6, "name_ko": "용고기", "name_key": "", "source_terrain": "목초지"}, {"id": 31, "family_id": 3, "family_ko": "물고기", "category": "food", "grade": 1, "name_ko": "민물고기", "name_key": "", "source_terrain": "물가"}, {"id": 32, "family_id": 3, "family_ko": "물고기", "category": "food", "grade": 2, "name_ko": "강송어", "name_key": "", "source_terrain": "물가"}, {"id": 33, "family_id": 3, "family_ko": "물고기", "category": "food", "grade": 3, "name_ko": "얼음 물고기", "name_key": "", "source_terrain": "물가"}, {"id": 34, "family_id": 3, "family_ko": "물고기", "category": "food", "grade": 4, "name_ko": "빛나는 물고기", "name_key": "", "source_terrain": "물가"}, {"id": 35, "family_id": 3, "family_ko": "물고기", "category": "food", "grade": 5, "name_ko": "검은 물고기", "name_key": "", "source_terrain": "물가"}, {"id": 36, "family_id": 3, "family_ko": "물고기", "category": "food", "grade": 6, "name_ko": "황금 물고기", "name_key": "", "source_terrain": "물가"}, {"id": 41, "family_id": 4, "family_ko": "목재", "category": "build", "grade": 1, "name_ko": "잔가지", "name_key": "", "source_terrain": "숲"}, {"id": 42, "family_id": 4, "family_ko": "목재", "category": "build", "grade": 2, "name_ko": "소나무", "name_key": "", "source_terrain": "숲"}, {"id": 43, "family_id": 4, "family_ko": "목재", "category": "build", "grade": 3, "name_ko": "참나무", "name_key": "", "source_terrain": "숲"}, {"id": 44, "family_id": 4, "family_ko": "목재", "category": "build", "grade": 4, "name_ko": "은빛 나무", "name_key": "", "source_terrain": "숲"}, {"id": 45, "family_id": 4, "family_ko": "목재", "category": "build", "grade": 5, "name_ko": "뼈나무", "name_key": "", "source_terrain": "숲"}, {"id": 46, "family_id": 4, "family_ko": "목재", "category": "build", "grade": 6, "name_ko": "세계수 가지", "name_key": "", "source_terrain": "숲"}, {"id": 51, "family_id": 5, "family_ko": "석재", "category": "build", "grade": 1, "name_ko": "조약돌", "name_key": "", "source_terrain": "산악"}, {"id": 52, "family_id": 5, "family_ko": "석재", "category": "build", "grade": 2, "name_ko": "화강암", "name_key": "", "source_terrain": "산악"}, {"id": 53, "family_id": 5, "family_ko": "석재", "category": "build", "grade": 3, "name_ko": "대리석", "name_key": "", "source_terrain": "산악"}, {"id": 54, "family_id": 5, "family_ko": "석재", "category": "build", "grade": 4, "name_ko": "현무암", "name_key": "", "source_terrain": "산악"}, {"id": 55, "family_id": 5, "family_ko": "석재", "category": "build", "grade": 5, "name_ko": "흑요석", "name_key": "", "source_terrain": "산악"}, {"id": 56, "family_id": 5, "family_ko": "석재", "category": "build", "grade": 6, "name_ko": "용암 수정", "name_key": "", "source_terrain": "산악"}, {"id": 61, "family_id": 6, "family_ko": "금속", "category": "build", "grade": 1, "name_ko": "구리", "name_key": "", "source_terrain": "광산"}, {"id": 62, "family_id": 6, "family_ko": "금속", "category": "build", "grade": 2, "name_ko": "철", "name_key": "", "source_terrain": "광산"}, {"id": 63, "family_id": 6, "family_ko": "금속", "category": "build", "grade": 3, "name_ko": "은", "name_key": "", "source_terrain": "광산"}, {"id": 64, "family_id": 6, "family_ko": "금속", "category": "build", "grade": 4, "name_ko": "금", "name_key": "", "source_terrain": "광산"}, {"id": 65, "family_id": 6, "family_ko": "금속", "category": "build", "grade": 5, "name_ko": "미스릴", "name_key": "", "source_terrain": "광산"}, {"id": 66, "family_id": 6, "family_ko": "금속", "category": "build", "grade": 6, "name_ko": "별강철", "name_key": "", "source_terrain": "광산"}, {"id": 71, "family_id": 7, "family_ko": "가죽", "category": "cloth", "grade": 1, "name_ko": "토끼 가죽", "name_key": "", "source_terrain": "사냥터"}, {"id": 72, "family_id": 7, "family_ko": "가죽", "category": "cloth", "grade": 2, "name_ko": "여우 가죽", "name_key": "", "source_terrain": "사냥터"}, {"id": 73, "family_id": 7, "family_ko": "가죽", "category": "cloth", "grade": 3, "name_ko": "털소 가죽", "name_key": "", "source_terrain": "사냥터"}, {"id": 74, "family_id": 7, "family_ko": "가죽", "category": "cloth", "grade": 4, "name_ko": "은사슴 가죽", "name_key": "", "source_terrain": "사냥터"}, {"id": 75, "family_id": 7, "family_ko": "가죽", "category": "cloth", "grade": 5, "name_ko": "마수 가죽", "name_key": "", "source_terrain": "사냥터"}, {"id": 76, "family_id": 7, "family_ko": "가죽", "category": "cloth", "grade": 6, "name_ko": "용 비늘", "name_key": "", "source_terrain": "사냥터"}, {"id": 81, "family_id": 8, "family_ko": "옷감", "category": "cloth", "grade": 1, "name_ko": "무명천", "name_key": "", "source_terrain": "목초지"}, {"id": 82, "family_id": 8, "family_ko": "옷감", "category": "cloth", "grade": 2, "name_ko": "양털", "name_key": "", "source_terrain": "목초지"}, {"id": 83, "family_id": 8, "family_ko": "옷감", "category": "cloth", "grade": 3, "name_ko": "비단", "name_key": "", "source_terrain": "목초지"}, {"id": 84, "family_id": 8, "family_ko": "옷감", "category": "cloth", "grade": 4, "name_ko": "거미 비단", "name_key": "", "source_terrain": "목초지"}, {"id": 85, "family_id": 8, "family_ko": "옷감", "category": "cloth", "grade": 5, "name_ko": "유령 명주", "name_key": "", "source_terrain": "목초지"}, {"id": 86, "family_id": 8, "family_ko": "옷감", "category": "cloth", "grade": 6, "name_ko": "황금 비단", "name_key": "", "source_terrain": "목초지"}, {"id": 91, "family_id": 9, "family_ko": "약초", "category": "battle", "grade": 1, "name_ko": "들풀", "name_key": "", "source_terrain": "늪지"}, {"id": 92, "family_id": 9, "family_ko": "약초", "category": "battle", "grade": 2, "name_ko": "약초", "name_key": "", "source_terrain": "늪지"}, {"id": 93, "family_id": 9, "family_ko": "약초", "category": "battle", "grade": 3, "name_ko": "파란 버섯", "name_key": "", "source_terrain": "늪지"}, {"id": 94, "family_id": 9, "family_ko": "약초", "category": "battle", "grade": 4, "name_ko": "반딧불 이슬", "name_key": "", "source_terrain": "늪지"}, {"id": 95, "family_id": 9, "family_ko": "약초", "category": "battle", "grade": 5, "name_ko": "독초", "name_key": "", "source_terrain": "늪지"}, {"id": 96, "family_id": 9, "family_ko": "약초", "category": "battle", "grade": 6, "name_ko": "세계수 이슬", "name_key": "", "source_terrain": "늪지"}, {"id": 101, "family_id": 10, "family_ko": "숫돌", "category": "battle", "grade": 1, "name_ko": "거친 숫돌", "name_key": "", "source_terrain": "산악"}, {"id": 102, "family_id": 10, "family_ko": "숫돌", "category": "battle", "grade": 2, "name_ko": "숫돌", "name_key": "", "source_terrain": "산악"}, {"id": 103, "family_id": 10, "family_ko": "숫돌", "category": "battle", "grade": 3, "name_ko": "고운 숫돌", "name_key": "", "source_terrain": "산악"}, {"id": 104, "family_id": 10, "family_ko": "숫돌", "category": "battle", "grade": 4, "name_ko": "수정 숫돌", "name_key": "", "source_terrain": "산악"}, {"id": 105, "family_id": 10, "family_ko": "숫돌", "category": "battle", "grade": 5, "name_ko": "흑요석 숫돌", "name_key": "", "source_terrain": "산악"}, {"id": 106, "family_id": 10, "family_ko": "숫돌", "category": "battle", "grade": 6, "name_ko": "별 숫돌", "name_key": "", "source_terrain": "산악"}, {"id": 111, "family_id": 11, "family_ko": "보석", "category": "luxury", "grade": 1, "name_ko": "수정", "name_key": "", "source_terrain": "광산"}, {"id": 112, "family_id": 11, "family_ko": "보석", "category": "luxury", "grade": 2, "name_ko": "호박", "name_key": "", "source_terrain": "광산"}, {"id": 113, "family_id": 11, "family_ko": "보석", "category": "luxury", "grade": 3, "name_ko": "자수정", "name_key": "", "source_terrain": "광산"}, {"id": 114, "family_id": 11, "family_ko": "보석", "category": "luxury", "grade": 4, "name_ko": "에메랄드", "name_key": "", "source_terrain": "광산"}, {"id": 115, "family_id": 11, "family_ko": "보석", "category": "luxury", "grade": 5, "name_ko": "루비", "name_key": "", "source_terrain": "광산"}, {"id": 116, "family_id": 11, "family_ko": "보석", "category": "luxury", "grade": 6, "name_ko": "다이아몬드", "name_key": "", "source_terrain": "광산"}, {"id": 121, "family_id": 12, "family_ko": "술", "category": "luxury", "grade": 1, "name_ko": "보리술", "name_key": "", "source_terrain": "농경지"}, {"id": 122, "family_id": 12, "family_ko": "술", "category": "luxury", "grade": 2, "name_ko": "꿀술", "name_key": "", "source_terrain": "농경지"}, {"id": 123, "family_id": 12, "family_ko": "술", "category": "luxury", "grade": 3, "name_ko": "과일술", "name_key": "", "source_terrain": "농경지"}, {"id": 124, "family_id": 12, "family_ko": "술", "category": "luxury", "grade": 4, "name_ko": "얼음술", "name_key": "", "source_terrain": "농경지"}, {"id": 125, "family_id": 12, "family_ko": "술", "category": "luxury", "grade": 5, "name_ko": "핏빛 술", "name_key": "", "source_terrain": "농경지"}, {"id": 126, "family_id": 12, "family_ko": "술", "category": "luxury", "grade": 6, "name_ko": "신들의 술", "name_key": "", "source_terrain": "농경지"}, {"id": 131, "family_id": 13, "family_ko": "마나", "category": "magic", "grade": 1, "name_ko": "마나 가루", "name_key": "", "source_terrain": "유적"}, {"id": 132, "family_id": 13, "family_ko": "마나", "category": "magic", "grade": 2, "name_ko": "마나 조각", "name_key": "", "source_terrain": "유적"}, {"id": 133, "family_id": 13, "family_ko": "마나", "category": "magic", "grade": 3, "name_ko": "마나 결정", "name_key": "", "source_terrain": "유적"}, {"id": 134, "family_id": 13, "family_ko": "마나", "category": "magic", "grade": 4, "name_ko": "마나 구슬", "name_key": "", "source_terrain": "유적"}, {"id": 135, "family_id": 13, "family_ko": "마나", "category": "magic", "grade": 5, "name_ko": "정령의 눈물", "name_key": "", "source_terrain": "유적"}, {"id": 136, "family_id": 13, "family_ko": "마나", "category": "magic", "grade": 6, "name_ko": "생명의 물방울", "name_key": "", "source_terrain": "유적"}, {"id": 141, "family_id": 14, "family_ko": "뼈", "category": "magic", "grade": 1, "name_ko": "잔뼈", "name_key": "", "source_terrain": "늪지"}, {"id": 142, "family_id": 14, "family_ko": "뼈", "category": "magic", "grade": 2, "name_ko": "짐승 뼈", "name_key": "", "source_terrain": "늪지"}, {"id": 143, "family_id": 14, "family_ko": "뼈", "category": "magic", "grade": 3, "name_ko": "큰 뿔", "name_key": "", "source_terrain": "늪지"}, {"id": 144, "family_id": 14, "family_ko": "뼈", "category": "magic", "grade": 4, "name_ko": "검은 뼈", "name_key": "", "source_terrain": "늪지"}, {"id": 145, "family_id": 14, "family_ko": "뼈", "category": "magic", "grade": 5, "name_ko": "고룡의 뼈", "name_key": "", "source_terrain": "늪지"}, {"id": 146, "family_id": 14, "family_ko": "뼈", "category": "magic", "grade": 6, "name_ko": "타이탄의 뼈", "name_key": "", "source_terrain": "늪지"}, {"id": 151, "family_id": 15, "family_ko": "별", "category": "magic", "grade": 1, "name_ko": "별가루", "name_key": "", "source_terrain": "유적"}, {"id": 152, "family_id": 15, "family_ko": "별", "category": "magic", "grade": 2, "name_ko": "별 조각", "name_key": "", "source_terrain": "유적"}, {"id": 153, "family_id": 15, "family_ko": "별", "category": "magic", "grade": 3, "name_ko": "별똥돌", "name_key": "", "source_terrain": "유적"}, {"id": 154, "family_id": 15, "family_ko": "별", "category": "magic", "grade": 4, "name_ko": "별독 결정", "name_key": "", "source_terrain": "유적"}, {"id": 155, "family_id": 15, "family_ko": "별", "category": "magic", "grade": 5, "name_ko": "별의 눈물", "name_key": "", "source_terrain": "유적"}, {"id": 156, "family_id": 15, "family_ko": "별", "category": "magic", "grade": 6, "name_ko": "별의 심장", "name_key": "", "source_terrain": "유적"}, {"id": 201, "family_id": 0, "family_ko": "특산", "category": "special", "grade": 6, "name_ko": "타이탄의 검 조각", "name_key": "", "source_terrain": "랜드마크"}, {"id": 202, "family_id": 0, "family_ko": "특산", "category": "special", "grade": 6, "name_ko": "천사의 깃털", "name_key": "", "source_terrain": "랜드마크"}, {"id": 203, "family_id": 0, "family_ko": "특산", "category": "special", "grade": 6, "name_ko": "고대 탑의 벽돌", "name_key": "", "source_terrain": "랜드마크"}, {"id": 204, "family_id": 0, "family_ko": "특산", "category": "special", "grade": 6, "name_ko": "얼음 심장", "name_key": "", "source_terrain": "랜드마크"}, {"id": 205, "family_id": 0, "family_ko": "특산", "category": "special", "grade": 6, "name_ko": "세계수 수액", "name_key": "", "source_terrain": "랜드마크"}, {"id": 206, "family_id": 0, "family_ko": "특산", "category": "special", "grade": 6, "name_ko": "가라앉은 성물", "name_key": "", "source_terrain": "랜드마크"}, {"id": 207, "family_id": 0, "family_ko": "특산", "category": "special", "grade": 6, "name_ko": "별운석", "name_key": "", "source_terrain": "랜드마크"}, {"id": 208, "family_id": 0, "family_ko": "특산", "category": "special", "grade": 6, "name_ko": "악마의 뿔", "name_key": "", "source_terrain": "랜드마크"}, {"id": 209, "family_id": 0, "family_ko": "특산", "category": "special", "grade": 6, "name_ko": "용암 심장", "name_key": "", "source_terrain": "랜드마크"}, {"id": 210, "family_id": 0, "family_ko": "특산", "category": "special", "grade": 6, "name_ko": "어둠의 왕관", "name_key": "", "source_terrain": "랜드마크"}] |
Bundled data: assets/images/conquest/conquestRegionBook.draft.json 3
| Row | Change | Field | Before | After |
|---|---|---|---|---|
| _note | removed | "시트 변환본 (sheetToBooks.mjs)" | ||
| regions | removed | [{"id": 1, "zone_id": "panderas", "zone_seq": 1, "zone_name_ko": "판데라스 평원", "name_ko": "은빛 여울", "name_key": "", "faction": "neutral", "biome": "central_watershed", "tier": 1, "terrain": "물가", "terrain_subs": ["농경지", "목초지"], "subzones": 1, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 31, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 131, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 32, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 21, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 33, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 2, "zone_id": "panderas", "zone_seq": 2, "zone_name_ko": "판데라스 평원", "name_ko": "여명의 호숫가", "name_key": "", "faction": "neutral", "biome": "central_watershed", "tier": 1, "terrain": "물가", "terrain_subs": ["농경지", "목초지"], "subzones": 1, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 31, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 131, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 32, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 21, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 33, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 3, "zone_id": "panderas", "zone_seq": 3, "zone_name_ko": "판데라스 평원", "name_ko": "버들 나루", "name_key": "", "faction": "neutral", "biome": "central_watershed", "tier": 1, "terrain": "물가", "terrain_subs": ["농경지", "목초지"], "subzones": 2, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 31, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 131, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 32, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 21, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 33, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 4, "zone_id": "panderas", "zone_seq": 4, "zone_name_ko": "판데라스 평원", "name_ko": "구름 여울", "name_key": "", "faction": "neutral", "biome": "central_watershed", "tier": 1, "terrain": "물가", "terrain_subs": ["농경지", "목초지"], "subzones": 2, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 31, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 131, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 32, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 21, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 33, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 5, "zone_id": "panderas", "zone_seq": 5, "zone_name_ko": "판데라스 평원", "name_ko": "아침 나루", "name_key": "", "faction": "neutral", "biome": "central_watershed", "tier": 1, "terrain": "물가", "terrain_subs": ["농경지", "목초지"], "subzones": 2, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 31, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 131, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 32, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 21, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 33, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 6, "zone_id": "panderas", "zone_seq": 6, "zone_name_ko": "판데라스 평원", "name_ko": "바람 들판", "name_key": "", "faction": "neutral", "biome": "central_plains", "tier": 1, "terrain": "농경지", "terrain_subs": ["물가", "목초지"], "subzones": 2, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 11, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 121, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 31, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 12, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 21, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 13, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 7, "zone_id": "panderas", "zone_seq": 7, "zone_name_ko": "판데라스 평원", "name_ko": "양떼 언덕", "name_key": "", "faction": "neutral", "biome": "central_plains", "tier": 1, "terrain": "목초지", "terrain_subs": ["농경지", "물가"], "subzones": 1, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 21, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 81, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 22, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 31, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 23, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 8, "zone_id": "panderas", "zone_seq": 8, "zone_name_ko": "판데라스 평원", "name_ko": "해바라기 평원", "name_key": "", "faction": "neutral", "biome": "central_plains", "tier": 1, "terrain": "농경지", "terrain_subs": ["늪지", "물가"], "subzones": 2, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 11, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 121, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 91, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 12, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 31, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 13, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 9, "zone_id": "panderas", "zone_seq": 9, "zone_name_ko": "판데라스 평원", "name_ko": "종달새 들판", "name_key": "", "faction": "neutral", "biome": "central_plains", "tier": 1, "terrain": "농경지", "terrain_subs": ["물가", "목초지"], "subzones": 1, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 11, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 121, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 31, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 12, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 21, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 13, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 10, "zone_id": "panderas", "zone_seq": 10, "zone_name_ko": "판데라스 평원", "name_ko": "밀꽃 평원", "name_key": "", "faction": "neutral", "biome": "central_plains", "tier": 1, "terrain": "농경지", "terrain_subs": ["광산", "물가"], "subzones": 1, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 11, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 121, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 61, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 12, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 31, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 13, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 11, "zone_id": "panderas", "zone_seq": 11, "zone_name_ko": "판데라스 평원", "name_ko": "클로버 언덕", "name_key": "", "faction": "neutral", "biome": "central_plains", "tier": 1, "terrain": "목초지", "terrain_subs": ["물가", "농경지"], "subzones": 2, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 21, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 81, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 31, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 22, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 23, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 12, "zone_id": "panderas", "zone_seq": 12, "zone_name_ko": "판데라스 평원", "name_ko": "시냇가 들판", "name_key": "", "faction": "neutral", "biome": "central_plains", "tier": 1, "terrain": "농경지", "terrain_subs": ["늪지", "물가"], "subzones": 1, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 11, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 121, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 91, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 12, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 31, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 13, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 13, "zone_id": "panderas", "zone_seq": 13, "zone_name_ko": "판데라스 평원", "name_ko": "달빛 구릉지", "name_key": "", "faction": "neutral", "biome": "central_plains", "tier": 1, "terrain": "농경지", "terrain_subs": ["광산", "물가"], "subzones": 1, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 11, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 121, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 61, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 12, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 31, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 13, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 14, "zone_id": "panderas", "zone_seq": 14, "zone_name_ko": "판데라스 평원", "name_ko": "조약돌 언덕", "name_key": "", "faction": "neutral", "biome": "central_plains", "tier": 1, "terrain": "목초지", "terrain_subs": ["농경지", "사냥터"], "subzones": 2, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 21, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 81, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 22, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 71, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 23, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 15, "zone_id": "saharin", "zone_seq": 1, "zone_name_ko": "사하린 사막", "name_ko": "모래 언덕길", "name_key": "", "faction": "human", "biome": "desert", "tier": 1, "terrain": "광산", "terrain_subs": ["농경지", "사냥터"], "subzones": 2, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 61, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 111, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 62, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 71, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 63, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 16, "zone_id": "arden", "zone_seq": 1, "zone_name_ko": "아르덴 들녘", "name_ko": "햇살 들녘", "name_key": "", "faction": "human", "biome": "open_plains", "tier": 1, "terrain": "농경지", "terrain_subs": ["목초지", "광산"], "subzones": 1, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 11, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 121, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 21, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 12, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 61, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 13, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 17, "zone_id": "saharin", "zone_seq": 2, "zone_name_ko": "사하린 사막", "name_ko": "선인장 골짜기", "name_key": "", "faction": "human", "biome": "desert", "tier": 1, "terrain": "사냥터", "terrain_subs": ["광산", "농경지"], "subzones": 2, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 71, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 21, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 61, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 72, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 73, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 18, "zone_id": "saharin", "zone_seq": 3, "zone_name_ko": "사하린 사막", "name_ko": "오아시스 쉼터", "name_key": "", "faction": "human", "biome": "desert", "tier": 1, "terrain": "광산", "terrain_subs": ["농경지", "사냥터"], "subzones": 2, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 61, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 111, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 62, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 71, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 63, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 19, "zone_id": "saharin", "zone_seq": 4, "zone_name_ko": "사하린 사막", "name_ko": "사막 장미 골", "name_key": "", "faction": "human", "biome": "desert", "tier": 1, "terrain": "광산", "terrain_subs": ["사냥터", "산악"], "subzones": 1, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 61, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 111, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 71, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 62, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 51, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 63, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 20, "zone_id": "saharin", "zone_seq": 5, "zone_name_ko": "사하린 사막", "name_ko": "뜨거운 모래밭", "name_key": "", "faction": "human", "biome": "desert", "tier": 1, "terrain": "광산", "terrain_subs": ["농경지", "목초지"], "subzones": 2, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 61, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 111, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 62, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 21, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 63, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 21, "zone_id": "redcrown", "zone_seq": 1, "zone_name_ko": "붉은왕관 산맥", "name_ko": "타이탄의 석검", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 4, "terrain": "광산", "terrain_subs": ["사냥터"], "subzones": 6, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 100, "production": [{"material_id": 64, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 113, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 74, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 65, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 24, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 66, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}, {"material_id": 201, "rate": 10, "unlock_type": "landmark", "unlock_value": 5}], "landmark_code": "titan_sword"}, {"id": 22, "zone_id": "saharin", "zone_seq": 6, "zone_name_ko": "사하린 사막", "name_ko": "신기루 벌판", "name_key": "", "faction": "human", "biome": "desert", "tier": 2, "terrain": "광산", "terrain_subs": ["사냥터", "농경지"], "subzones": 2, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 62, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 111, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 72, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 63, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 12, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 64, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 23, "zone_id": "redcrown", "zone_seq": 2, "zone_name_ko": "붉은왕관 산맥", "name_ko": "붉은 바위산", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 2, "terrain": "광산", "terrain_subs": ["산악"], "subzones": 2, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 62, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 111, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 52, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 63, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 102, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 64, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 24, "zone_id": "arden", "zone_seq": 2, "zone_name_ko": "아르덴 들녘", "name_ko": "보리 이랑", "name_key": "", "faction": "human", "biome": "open_plains", "tier": 2, "terrain": "목초지", "terrain_subs": ["광산", "늪지"], "subzones": 2, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 22, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 81, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 62, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 23, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 92, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 24, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 25, "zone_id": "saharin", "zone_seq": 7, "zone_name_ko": "사하린 사막", "name_ko": "전갈 바위", "name_key": "", "faction": "human", "biome": "desert", "tier": 2, "terrain": "광산", "terrain_subs": ["목초지", "산악"], "subzones": 3, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 62, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 111, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 22, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 63, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 52, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 64, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 26, "zone_id": "saharin", "zone_seq": 8, "zone_name_ko": "사하린 사막", "name_ko": "마른 우물터", "name_key": "", "faction": "human", "biome": "desert", "tier": 2, "terrain": "농경지", "terrain_subs": ["광산"], "subzones": 3, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 12, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 121, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 62, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 13, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 112, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 14, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 27, "zone_id": "redcrown", "zone_seq": 3, "zone_name_ko": "붉은왕관 산맥", "name_ko": "녹슨 협곡", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 2, "terrain": "광산", "terrain_subs": ["산악"], "subzones": 3, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 62, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 111, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 52, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 63, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 102, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 64, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 28, "zone_id": "saharin", "zone_seq": 9, "zone_name_ko": "사하린 사막", "name_ko": "천사의 작은 신전", "name_key": "", "faction": "human", "biome": "desert", "tier": 4, "terrain": "광산", "terrain_subs": ["목초지", "농경지"], "subzones": 6, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 100, "production": [{"material_id": 64, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 113, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 24, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 65, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 14, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 66, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}, {"material_id": 202, "rate": 10, "unlock_type": "landmark", "unlock_value": 5}], "landmark_code": "angel_temple"}, {"id": 29, "zone_id": "redcrown", "zone_seq": 4, "zone_name_ko": "붉은왕관 산맥", "name_ko": "매 둥지 절벽", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 3, "terrain": "산악", "terrain_subs": ["광산", "목초지"], "subzones": 4, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 53, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 102, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 63, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 54, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 23, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 55, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 30, "zone_id": "redcrown", "zone_seq": 5, "zone_name_ko": "붉은왕관 산맥", "name_ko": "노을 바위", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 3, "terrain": "광산", "terrain_subs": ["산악"], "subzones": 5, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 63, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 112, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 53, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 64, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 103, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 65, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 31, "zone_id": "redcrown", "zone_seq": 6, "zone_name_ko": "붉은왕관 산맥", "name_ko": "붉은 먼지 골짜기", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 3, "terrain": "광산", "terrain_subs": ["농경지", "산악"], "subzones": 5, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 63, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 112, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 13, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 64, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 53, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 65, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 32, "zone_id": "redcrown", "zone_seq": 7, "zone_name_ko": "붉은왕관 산맥", "name_ko": "부서진 바위 벌판", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 3, "terrain": "산악", "terrain_subs": ["광산"], "subzones": 4, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 53, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 102, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 63, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 54, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 113, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 55, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 33, "zone_id": "saharin", "zone_seq": 10, "zone_name_ko": "사하린 사막", "name_ko": "황금 모래벌", "name_key": "", "faction": "human", "biome": "desert", "tier": 3, "terrain": "광산", "terrain_subs": ["농경지"], "subzones": 5, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 63, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 112, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 13, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 64, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 123, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 65, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 34, "zone_id": "arden", "zone_seq": 3, "zone_name_ko": "아르덴 들녘", "name_ko": "원두막 벌판", "name_key": "", "faction": "human", "biome": "open_plains", "tier": 3, "terrain": "목초지", "terrain_subs": ["늪지"], "subzones": 4, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 23, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 82, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 93, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 24, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 143, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 25, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 35, "zone_id": "redcrown", "zone_seq": 8, "zone_name_ko": "붉은왕관 산맥", "name_ko": "불꽃 바위", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 3, "terrain": "산악", "terrain_subs": ["광산"], "subzones": 5, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 53, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 102, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 63, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 54, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 113, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 55, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 36, "zone_id": "redcrown", "zone_seq": 9, "zone_name_ko": "붉은왕관 산맥", "name_ko": "붉은 손가락 바위", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 4, "terrain": "광산", "terrain_subs": ["산악"], "subzones": 7, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 64, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 113, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 54, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 65, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 104, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 66, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 37, "zone_id": "redcrown", "zone_seq": 10, "zone_name_ko": "붉은왕관 산맥", "name_ko": "쇠 바위 능선", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 4, "terrain": "광산", "terrain_subs": ["산악"], "subzones": 7, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 64, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 113, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 54, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 65, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 104, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 66, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 38, "zone_id": "arden", "zone_seq": 4, "zone_name_ko": "아르덴 들녘", "name_ko": "능금나무 벌판", "name_key": "", "faction": "human", "biome": "open_plains", "tier": 4, "terrain": "목초지", "terrain_subs": ["광산", "농경지"], "subzones": 7, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 24, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 83, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 64, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 25, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 14, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 26, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 39, "zone_id": "saharin", "zone_seq": 11, "zone_name_ko": "사하린 사막", "name_ko": "바람 조각 바위", "name_key": "", "faction": "human", "biome": "desert", "tier": 4, "terrain": "농경지", "terrain_subs": ["광산", "목초지"], "subzones": 7, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 14, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 123, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 64, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 15, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 24, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 16, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 40, "zone_id": "redcrown", "zone_seq": 11, "zone_name_ko": "붉은왕관 산맥", "name_ko": "구리빛 벼랑", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 4, "terrain": "광산", "terrain_subs": ["산악"], "subzones": 7, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 64, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 113, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 54, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 65, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 104, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 66, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 41, "zone_id": "redcrown", "zone_seq": 12, "zone_name_ko": "붉은왕관 산맥", "name_ko": "붉은 탑 바위", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 4, "terrain": "산악", "terrain_subs": ["광산"], "subzones": 7, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 54, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 103, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 64, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 55, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 114, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 56, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 42, "zone_id": "redcrown", "zone_seq": 13, "zone_name_ko": "붉은왕관 산맥", "name_ko": "마른 강 바닥", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 4, "terrain": "산악", "terrain_subs": ["광산"], "subzones": 6, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 54, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 103, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 64, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 55, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 114, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 56, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 43, "zone_id": "redcrown", "zone_seq": 14, "zone_name_ko": "붉은왕관 산맥", "name_ko": "갈라진 땅", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 5, "terrain": "광산", "terrain_subs": ["산악"], "subzones": 8, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 65, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 114, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 55, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 66, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 105, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 44, "zone_id": "redcrown", "zone_seq": 15, "zone_name_ko": "붉은왕관 산맥", "name_ko": "돌부리 벌판", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 5, "terrain": "산악", "terrain_subs": ["광산"], "subzones": 10, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 55, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 104, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 65, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 56, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 115, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 45, "zone_id": "redcrown", "zone_seq": 16, "zone_name_ko": "붉은왕관 산맥", "name_ko": "붉은 안개 골", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 5, "terrain": "광산", "terrain_subs": ["산악"], "subzones": 10, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 65, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 114, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 55, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 66, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 105, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 46, "zone_id": "redcrown", "zone_seq": 17, "zone_name_ko": "붉은왕관 산맥", "name_ko": "독수리 바위", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 5, "terrain": "산악", "terrain_subs": ["광산"], "subzones": 10, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 55, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 104, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 65, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 56, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 115, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 47, "zone_id": "redcrown", "zone_seq": 18, "zone_name_ko": "붉은왕관 산맥", "name_ko": "붉은 노을 능선", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 5, "terrain": "산악", "terrain_subs": ["광산"], "subzones": 9, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 55, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 104, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 65, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 56, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 115, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 48, "zone_id": "redcrown", "zone_seq": 19, "zone_name_ko": "붉은왕관 산맥", "name_ko": "화살촉 바위", "name_key": "", "faction": "human", "biome": "red_badlands", "tier": 5, "terrain": "광산", "terrain_subs": ["산악"], "subzones": 9, "climate_element": "모래", "climate_intensity": 2, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 65, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 114, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 55, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 66, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 105, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 49, "zone_id": "urkan", "zone_seq": 1, "zone_name_ko": "우르칸 툰드라", "name_ko": "언 땅 벌판", "name_key": "", "faction": "orc", "biome": "tundra", "tier": 1, "terrain": "사냥터", "terrain_subs": ["산악", "농경지"], "subzones": 1, "climate_element": "빙결", "climate_intensity": 1, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 71, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 21, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 51, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 72, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 73, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 50, "zone_id": "garin", "zone_seq": 1, "zone_name_ko": "가린 설원", "name_ko": "흰눈 벌판", "name_key": "", "faction": "orc", "biome": "snowfield", "tier": 1, "terrain": "목초지", "terrain_subs": ["사냥터", "농경지"], "subzones": 1, "climate_element": "빙결", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 21, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 81, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 71, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 22, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 23, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 51, "zone_id": "garin", "zone_seq": 2, "zone_name_ko": "가린 설원", "name_ko": "서리 언덕", "name_key": "", "faction": "orc", "biome": "cold_hills", "tier": 1, "terrain": "산악", "terrain_subs": ["광산", "사냥터"], "subzones": 2, "climate_element": "빙결", "climate_intensity": 1, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 51, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 101, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 61, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 52, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 71, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 53, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 52, "zone_id": "garin", "zone_seq": 3, "zone_name_ko": "가린 설원", "name_ko": "부서진 바벨탑", "name_key": "", "faction": "orc", "biome": "snowfield", "tier": 4, "terrain": "산악", "terrain_subs": ["사냥터", "목초지"], "subzones": 6, "climate_element": "빙결", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 100, "production": [{"material_id": 54, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 103, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 74, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 55, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 24, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 56, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}, {"material_id": 203, "rate": 10, "unlock_type": "landmark", "unlock_value": 5}], "landmark_code": "broken_babel_tower"}, {"id": 53, "zone_id": "urkan", "zone_seq": 2, "zone_name_ko": "우르칸 툰드라", "name_ko": "순록 벌판", "name_key": "", "faction": "orc", "biome": "tundra", "tier": 1, "terrain": "사냥터", "terrain_subs": ["산악", "목초지"], "subzones": 1, "climate_element": "빙결", "climate_intensity": 1, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 71, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 21, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 51, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 72, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 73, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 54, "zone_id": "garin", "zone_seq": 4, "zone_name_ko": "가린 설원", "name_ko": "눈보라 언덕", "name_key": "", "faction": "orc", "biome": "snowfield", "tier": 1, "terrain": "사냥터", "terrain_subs": ["목초지", "유적"], "subzones": 2, "climate_element": "빙결", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 71, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 21, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 72, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 131, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 73, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 55, "zone_id": "garin", "zone_seq": 5, "zone_name_ko": "가린 설원", "name_ko": "찬 바위 구릉", "name_key": "", "faction": "orc", "biome": "cold_hills", "tier": 1, "terrain": "광산", "terrain_subs": ["목초지", "산악"], "subzones": 1, "climate_element": "빙결", "climate_intensity": 1, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 61, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 111, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 21, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 62, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 51, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 63, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 56, "zone_id": "urkan", "zone_seq": 3, "zone_name_ko": "우르칸 툰드라", "name_ko": "찬바람 언덕", "name_key": "", "faction": "orc", "biome": "tundra", "tier": 2, "terrain": "목초지", "terrain_subs": ["사냥터", "산악"], "subzones": 3, "climate_element": "빙결", "climate_intensity": 1, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 22, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 81, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 72, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 23, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 52, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 24, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 57, "zone_id": "garin", "zone_seq": 6, "zone_name_ko": "가린 설원", "name_ko": "하얀 늑대 벌판", "name_key": "", "faction": "orc", "biome": "snowfield", "tier": 2, "terrain": "사냥터", "terrain_subs": ["유적", "목초지"], "subzones": 3, "climate_element": "빙결", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 72, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 21, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 132, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 73, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 22, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 74, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 58, "zone_id": "garin", "zone_seq": 7, "zone_name_ko": "가린 설원", "name_ko": "눈송이 골짜기", "name_key": "", "faction": "orc", "biome": "snowfield", "tier": 2, "terrain": "목초지", "terrain_subs": ["사냥터", "유적"], "subzones": 3, "climate_element": "빙결", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 22, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 81, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 72, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 23, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 132, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 24, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 59, "zone_id": "urkan", "zone_seq": 4, "zone_name_ko": "우르칸 툰드라", "name_ko": "흰 이끼 벌판", "name_key": "", "faction": "orc", "biome": "tundra", "tier": 2, "terrain": "목초지", "terrain_subs": ["광산", "사냥터"], "subzones": 2, "climate_element": "빙결", "climate_intensity": 1, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 22, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 81, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 62, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 23, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 72, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 24, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 60, "zone_id": "baekya", "zone_seq": 1, "zone_name_ko": "백야 빙원", "name_ko": "얼음 벼랑", "name_key": "", "faction": "orc", "biome": "glacier", "tier": 2, "terrain": "유적", "terrain_subs": ["산악", "사냥터"], "subzones": 2, "climate_element": "빙결", "climate_intensity": 3, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 132, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 151, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 52, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 133, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 72, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 134, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 61, "zone_id": "baekya", "zone_seq": 2, "zone_name_ko": "백야 빙원", "name_ko": "푸른 빙벽", "name_key": "", "faction": "orc", "biome": "glacier", "tier": 2, "terrain": "유적", "terrain_subs": ["사냥터", "산악"], "subzones": 3, "climate_element": "빙결", "climate_intensity": 3, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 132, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 151, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 72, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 133, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 52, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 134, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 62, "zone_id": "garin", "zone_seq": 8, "zone_name_ko": "가린 설원", "name_ko": "곰 발자국 벌판", "name_key": "", "faction": "orc", "biome": "snowfield", "tier": 2, "terrain": "사냥터", "terrain_subs": ["목초지", "산악"], "subzones": 2, "climate_element": "빙결", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 72, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 21, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 22, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 73, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 52, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 74, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 63, "zone_id": "baekya", "zone_seq": 3, "zone_name_ko": "백야 빙원", "name_ko": "유리 얼음벌", "name_key": "", "faction": "orc", "biome": "glacier", "tier": 3, "terrain": "산악", "terrain_subs": ["유적", "사냥터"], "subzones": 5, "climate_element": "빙결", "climate_intensity": 3, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 53, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 102, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 133, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 54, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 73, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 55, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 64, "zone_id": "baekya", "zone_seq": 4, "zone_name_ko": "백야 빙원", "name_ko": "얼어붙은 폭포", "name_key": "", "faction": "orc", "biome": "glacier", "tier": 3, "terrain": "유적", "terrain_subs": ["목초지", "사냥터"], "subzones": 4, "climate_element": "빙결", "climate_intensity": 3, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 133, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 152, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 23, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 134, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 73, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 135, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 65, "zone_id": "urkan", "zone_seq": 5, "zone_name_ko": "우르칸 툰드라", "name_ko": "매머드 길", "name_key": "", "faction": "orc", "biome": "tundra", "tier": 3, "terrain": "목초지", "terrain_subs": ["산악", "사냥터"], "subzones": 5, "climate_element": "빙결", "climate_intensity": 1, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 23, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 82, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 53, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 24, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 73, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 25, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 66, "zone_id": "garin", "zone_seq": 9, "zone_name_ko": "가린 설원", "name_ko": "은빛 설원", "name_key": "", "faction": "orc", "biome": "snowfield", "tier": 3, "terrain": "사냥터", "terrain_subs": ["목초지", "유적"], "subzones": 4, "climate_element": "빙결", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 73, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 22, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 23, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 74, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 133, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 75, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 67, "zone_id": "urkan", "zone_seq": 6, "zone_name_ko": "우르칸 툰드라", "name_ko": "서리 풀밭", "name_key": "", "faction": "orc", "biome": "tundra", "tier": 3, "terrain": "사냥터", "terrain_subs": ["목초지", "산악"], "subzones": 4, "climate_element": "빙결", "climate_intensity": 1, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 73, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 22, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 23, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 74, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 53, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 75, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 68, "zone_id": "garin", "zone_seq": 10, "zone_name_ko": "가린 설원", "name_ko": "언 돌 언덕", "name_key": "", "faction": "orc", "biome": "cold_hills", "tier": 3, "terrain": "산악", "terrain_subs": ["광산", "목초지"], "subzones": 5, "climate_element": "빙결", "climate_intensity": 1, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 53, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 102, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 63, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 54, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 23, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 55, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 69, "zone_id": "garin", "zone_seq": 11, "zone_name_ko": "가린 설원", "name_ko": "눈 덮인 소나무길", "name_key": "", "faction": "orc", "biome": "snowfield", "tier": 3, "terrain": "목초지", "terrain_subs": ["산악", "사냥터"], "subzones": 4, "climate_element": "빙결", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 23, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 82, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 53, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 24, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 73, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 25, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 70, "zone_id": "urkan", "zone_seq": 7, "zone_name_ko": "우르칸 툰드라", "name_ko": "얼음꽃 벌판", "name_key": "", "faction": "orc", "biome": "tundra", "tier": 4, "terrain": "사냥터", "terrain_subs": ["목초지", "산악"], "subzones": 6, "climate_element": "빙결", "climate_intensity": 1, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 74, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 23, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 24, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 75, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 54, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 76, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 71, "zone_id": "garin", "zone_seq": 12, "zone_name_ko": "가린 설원", "name_ko": "고요한 설원", "name_key": "", "faction": "orc", "biome": "snowfield", "tier": 4, "terrain": "산악", "terrain_subs": ["사냥터", "목초지"], "subzones": 7, "climate_element": "빙결", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 54, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 103, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 74, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 55, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 24, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 56, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 72, "zone_id": "baekya", "zone_seq": 5, "zone_name_ko": "백야 빙원", "name_ko": "수정 얼음골", "name_key": "", "faction": "orc", "biome": "glacier", "tier": 4, "terrain": "유적", "terrain_subs": ["산악", "사냥터"], "subzones": 7, "climate_element": "빙결", "climate_intensity": 3, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 134, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 153, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 54, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 135, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 74, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 136, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 73, "zone_id": "baekya", "zone_seq": 6, "zone_name_ko": "백야 빙원", "name_ko": "빙하 틈새", "name_key": "", "faction": "orc", "biome": "glacier", "tier": 4, "terrain": "산악", "terrain_subs": ["유적", "물가"], "subzones": 6, "climate_element": "빙결", "climate_intensity": 3, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 54, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 103, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 134, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 55, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 34, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 56, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 74, "zone_id": "baekya", "zone_seq": 7, "zone_name_ko": "백야 빙원", "name_ko": "흰 수염 봉우리", "name_key": "", "faction": "orc", "biome": "glacier", "tier": 4, "terrain": "물가", "terrain_subs": ["산악", "유적"], "subzones": 6, "climate_element": "빙결", "climate_intensity": 3, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 34, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 133, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 54, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 35, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 134, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 36, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 75, "zone_id": "baekya", "zone_seq": 8, "zone_name_ko": "백야 빙원", "name_ko": "얼음 동굴 어귀", "name_key": "", "faction": "orc", "biome": "glacier", "tier": 4, "terrain": "산악", "terrain_subs": ["물가"], "subzones": 7, "climate_element": "빙결", "climate_intensity": 3, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 54, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 103, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 34, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 55, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 134, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 56, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 76, "zone_id": "baekya", "zone_seq": 9, "zone_name_ko": "백야 빙원", "name_ko": "차가운 별 벌판", "name_key": "", "faction": "orc", "biome": "glacier", "tier": 4, "terrain": "산악", "terrain_subs": ["유적", "물가"], "subzones": 6, "climate_element": "빙결", "climate_intensity": 3, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 54, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 103, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 134, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 55, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 34, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 56, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 77, "zone_id": "garin", "zone_seq": 13, "zone_name_ko": "가린 설원", "name_ko": "흰 여우 언덕", "name_key": "", "faction": "orc", "biome": "snowfield", "tier": 5, "terrain": "사냥터", "terrain_subs": ["산악"], "subzones": 9, "climate_element": "빙결", "climate_intensity": 2, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 75, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 24, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 55, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 76, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 105, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 78, "zone_id": "baekya", "zone_seq": 10, "zone_name_ko": "백야 빙원", "name_ko": "얼어붙은 고대 타이탄", "name_key": "", "faction": "orc", "biome": "glacier", "tier": 6, "terrain": "산악", "terrain_subs": ["사냥터", "목초지"], "subzones": 10, "climate_element": "빙결", "climate_intensity": 3, "friendship_max": 10000, "garrison_cap": 300, "production": [{"material_id": 56, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 105, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 76, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 26, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 204, "rate": 10, "unlock_type": "landmark", "unlock_value": 5}], "landmark_code": "frozen_titan"}, {"id": 79, "zone_id": "baekya", "zone_seq": 11, "zone_name_ko": "백야 빙원", "name_ko": "깨진 얼음 벌판", "name_key": "", "faction": "orc", "biome": "glacier", "tier": 5, "terrain": "물가", "terrain_subs": ["산악", "목초지"], "subzones": 10, "climate_element": "빙결", "climate_intensity": 3, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 35, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 134, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 55, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 36, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 25, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 80, "zone_id": "baekya", "zone_seq": 12, "zone_name_ko": "백야 빙원", "name_ko": "서리 거인 길", "name_key": "", "faction": "orc", "biome": "glacier", "tier": 5, "terrain": "산악", "terrain_subs": ["목초지", "물가"], "subzones": 9, "climate_element": "빙결", "climate_intensity": 3, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 55, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 104, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 25, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 56, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 35, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 81, "zone_id": "garin", "zone_seq": 14, "zone_name_ko": "가린 설원", "name_ko": "겨울 사냥터", "name_key": "", "faction": "orc", "biome": "snowfield", "tier": 5, "terrain": "사냥터", "terrain_subs": ["산악", "물가"], "subzones": 8, "climate_element": "빙결", "climate_intensity": 2, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 75, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 24, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 55, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 76, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 35, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 82, "zone_id": "baekya", "zone_seq": 13, "zone_name_ko": "백야 빙원", "name_ko": "눈시린 벼랑", "name_key": "", "faction": "orc", "biome": "glacier", "tier": 5, "terrain": "물가", "terrain_subs": ["산악", "유적"], "subzones": 8, "climate_element": "빙결", "climate_intensity": 3, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 35, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 134, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 55, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 36, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 135, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 83, "zone_id": "neria", "zone_seq": 1, "zone_name_ko": "네리아 늪", "name_ko": "안개 늪", "name_key": "", "faction": "elf", "biome": "swamp", "tier": 1, "terrain": "늪지", "terrain_subs": ["농경지"], "subzones": 1, "climate_element": "맹독", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 91, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 141, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 92, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 121, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 93, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 84, "zone_id": "sylvaren", "zone_seq": 1, "zone_name_ko": "실바렌 숲", "name_ko": "반딧불 숲", "name_key": "", "faction": "elf", "biome": "ancient_forest", "tier": 1, "terrain": "숲", "terrain_subs": ["늪지", "농경지"], "subzones": 1, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 41, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 91, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 42, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 43, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 85, "zone_id": "neria", "zone_seq": 2, "zone_name_ko": "네리아 늪", "name_ko": "개구리 울음 늪", "name_key": "", "faction": "elf", "biome": "swamp", "tier": 1, "terrain": "늪지", "terrain_subs": ["숲", "농경지"], "subzones": 1, "climate_element": "맹독", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 91, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 141, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 41, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 92, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 93, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 86, "zone_id": "neria", "zone_seq": 3, "zone_name_ko": "네리아 늪", "name_ko": "갈대 늪", "name_key": "", "faction": "elf", "biome": "swamp", "tier": 1, "terrain": "늪지", "terrain_subs": ["목초지", "농경지"], "subzones": 1, "climate_element": "맹독", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 91, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 141, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 21, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 92, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 93, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 87, "zone_id": "sylvaren", "zone_seq": 2, "zone_name_ko": "실바렌 숲", "name_ko": "이끼 낀 숲", "name_key": "", "faction": "elf", "biome": "ancient_forest", "tier": 1, "terrain": "숲", "terrain_subs": ["늪지", "사냥터"], "subzones": 1, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 41, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 91, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 42, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 71, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 43, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 88, "zone_id": "neria", "zone_seq": 4, "zone_name_ko": "네리아 늪", "name_ko": "물풀 늪지", "name_key": "", "faction": "elf", "biome": "swamp", "tier": 1, "terrain": "늪지", "terrain_subs": ["농경지"], "subzones": 1, "climate_element": "맹독", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 91, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 141, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 92, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 121, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 93, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 89, "zone_id": "sylvaren", "zone_seq": 3, "zone_name_ko": "실바렌 숲", "name_ko": "세계수", "name_key": "", "faction": "elf", "biome": "ancient_forest", "tier": 5, "terrain": "숲", "terrain_subs": ["늪지"], "subzones": 9, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 4000, "garrison_cap": 200, "production": [{"material_id": 45, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 94, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 95, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 46, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 145, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 205, "rate": 10, "unlock_type": "landmark", "unlock_value": 5}], "landmark_code": "world_tree"}, {"id": 90, "zone_id": "neria", "zone_seq": 5, "zone_name_ko": "네리아 늪", "name_ko": "잠자리 늪", "name_key": "", "faction": "elf", "biome": "swamp", "tier": 2, "terrain": "늪지", "terrain_subs": ["숲", "사냥터"], "subzones": 3, "climate_element": "맹독", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 92, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 141, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 42, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 93, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 72, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 94, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 91, "zone_id": "neria", "zone_seq": 6, "zone_name_ko": "네리아 늪", "name_ko": "검은 물 늪", "name_key": "", "faction": "elf", "biome": "swamp", "tier": 2, "terrain": "늪지", "terrain_subs": ["농경지"], "subzones": 3, "climate_element": "맹독", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 92, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 141, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 12, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 93, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 122, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 94, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 92, "zone_id": "sylvaren", "zone_seq": 4, "zone_name_ko": "실바렌 숲", "name_ko": "노래하는 숲", "name_key": "", "faction": "elf", "biome": "ancient_forest", "tier": 2, "terrain": "숲", "terrain_subs": ["사냥터"], "subzones": 2, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 42, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 91, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 72, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 43, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 22, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 44, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 93, "zone_id": "sylvaren", "zone_seq": 5, "zone_name_ko": "실바렌 숲", "name_ko": "은빛 나뭇길", "name_key": "", "faction": "elf", "biome": "ancient_forest", "tier": 2, "terrain": "사냥터", "terrain_subs": ["숲", "늪지"], "subzones": 2, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 72, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 21, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 42, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 73, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 92, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 74, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 94, "zone_id": "neria", "zone_seq": 7, "zone_name_ko": "네리아 늪", "name_ko": "수련 늪", "name_key": "", "faction": "elf", "biome": "swamp", "tier": 2, "terrain": "늪지", "terrain_subs": ["목초지"], "subzones": 3, "climate_element": "맹독", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 92, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 141, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 22, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 93, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 82, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 94, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 95, "zone_id": "sylvaren", "zone_seq": 6, "zone_name_ko": "실바렌 숲", "name_ko": "오래된 떡갈나무 숲", "name_key": "", "faction": "elf", "biome": "ancient_forest", "tier": 2, "terrain": "숲", "terrain_subs": [], "subzones": 2, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 42, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 91, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 43, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 44, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 96, "zone_id": "neria", "zone_seq": 8, "zone_name_ko": "네리아 늪", "name_ko": "가라앉은 고대 사원", "name_key": "", "faction": "elf", "biome": "swamp", "tier": 4, "terrain": "늪지", "terrain_subs": [], "subzones": 6, "climate_element": "맹독", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 100, "production": [{"material_id": 94, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 143, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 95, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 96, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}, {"material_id": 206, "rate": 10, "unlock_type": "landmark", "unlock_value": 5}], "landmark_code": "sunken_temple"}, {"id": 97, "zone_id": "neria", "zone_seq": 9, "zone_name_ko": "네리아 늪", "name_ko": "반딧불 습지", "name_key": "", "faction": "elf", "biome": "swamp", "tier": 3, "terrain": "늪지", "terrain_subs": ["사냥터", "광산"], "subzones": 4, "climate_element": "맹독", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 93, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 142, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 73, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 94, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 63, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 95, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 98, "zone_id": "sylvaren", "zone_seq": 7, "zone_name_ko": "실바렌 숲", "name_ko": "달빛 나무 그늘", "name_key": "", "faction": "elf", "biome": "ancient_forest", "tier": 3, "terrain": "숲", "terrain_subs": [], "subzones": 4, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 43, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 92, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 44, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 45, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 99, "zone_id": "sylvaren", "zone_seq": 8, "zone_name_ko": "실바렌 숲", "name_ko": "속삭이는 수풀", "name_key": "", "faction": "elf", "biome": "ancient_forest", "tier": 3, "terrain": "숲", "terrain_subs": ["사냥터", "광산"], "subzones": 4, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 43, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 92, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 73, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 44, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 63, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 45, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 100, "zone_id": "byeoldok", "zone_seq": 1, "zone_name_ko": "별독지대", "name_ko": "초록 안개 벌판", "name_key": "", "faction": "elf", "biome": "toxic_wasteland", "tier": 3, "terrain": "광산", "terrain_subs": ["늪지", "사냥터"], "subzones": 4, "climate_element": "맹독", "climate_intensity": 3, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 63, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 112, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 93, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 64, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 73, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 65, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 101, "zone_id": "neria", "zone_seq": 10, "zone_name_ko": "네리아 늪", "name_ko": "진흙 발 늪", "name_key": "", "faction": "elf", "biome": "swamp", "tier": 3, "terrain": "늪지", "terrain_subs": ["목초지"], "subzones": 5, "climate_element": "맹독", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 93, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 142, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 23, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 94, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 83, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 95, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 102, "zone_id": "sylvaren", "zone_seq": 9, "zone_name_ko": "실바렌 숲", "name_ko": "버섯 동그라미 숲", "name_key": "", "faction": "elf", "biome": "ancient_forest", "tier": 3, "terrain": "숲", "terrain_subs": ["유적"], "subzones": 4, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 43, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 92, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 133, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 44, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 153, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 45, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 103, "zone_id": "neria", "zone_seq": 11, "zone_name_ko": "네리아 늪", "name_ko": "버들 늪", "name_key": "", "faction": "elf", "biome": "swamp", "tier": 3, "terrain": "늪지", "terrain_subs": [], "subzones": 4, "climate_element": "맹독", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 93, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 142, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 94, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 95, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 104, "zone_id": "byeoldok", "zone_seq": 2, "zone_name_ko": "별독지대", "name_ko": "병든 풀밭", "name_key": "", "faction": "elf", "biome": "toxic_wasteland", "tier": 4, "terrain": "늪지", "terrain_subs": ["광산", "유적"], "subzones": 6, "climate_element": "맹독", "climate_intensity": 3, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 94, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 143, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 64, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 95, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 134, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 96, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 105, "zone_id": "neria", "zone_seq": 12, "zone_name_ko": "네리아 늪", "name_ko": "이끼 늪", "name_key": "", "faction": "elf", "biome": "swamp", "tier": 4, "terrain": "늪지", "terrain_subs": [], "subzones": 7, "climate_element": "맹독", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 94, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 143, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 95, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 96, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 106, "zone_id": "sylvaren", "zone_seq": 10, "zone_name_ko": "실바렌 숲", "name_ko": "새벽이슬 숲", "name_key": "", "faction": "elf", "biome": "ancient_forest", "tier": 4, "terrain": "숲", "terrain_subs": ["유적"], "subzones": 6, "climate_element": "없음", "climate_intensity": 0, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 44, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 93, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 134, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 45, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 154, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 46, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 107, "zone_id": "byeoldok", "zone_seq": 3, "zone_name_ko": "별독지대", "name_ko": "독성 운석 분화구", "name_key": "", "faction": "elf", "biome": "toxic_wasteland", "tier": 4, "terrain": "늪지", "terrain_subs": ["유적", "숲"], "subzones": 7, "climate_element": "맹독", "climate_intensity": 3, "friendship_max": 1500, "garrison_cap": 100, "production": [{"material_id": 94, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 143, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 134, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 95, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 44, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 96, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}, {"material_id": 207, "rate": 10, "unlock_type": "landmark", "unlock_value": 5}], "landmark_code": "poison_crater"}, {"id": 108, "zone_id": "byeoldok", "zone_seq": 4, "zone_name_ko": "별독지대", "name_ko": "녹아내린 땅", "name_key": "", "faction": "elf", "biome": "toxic_wasteland", "tier": 4, "terrain": "유적", "terrain_subs": ["숲", "늪지"], "subzones": 7, "climate_element": "맹독", "climate_intensity": 3, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 134, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 153, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 44, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 135, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 94, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 136, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 109, "zone_id": "byeoldok", "zone_seq": 5, "zone_name_ko": "별독지대", "name_ko": "별똥별 잿더미", "name_key": "", "faction": "elf", "biome": "toxic_wasteland", "tier": 4, "terrain": "유적", "terrain_subs": ["늪지", "광산"], "subzones": 7, "climate_element": "맹독", "climate_intensity": 3, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 134, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 153, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 94, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 135, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 64, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 136, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 110, "zone_id": "neria", "zone_seq": 13, "zone_name_ko": "네리아 늪", "name_ko": "뱀길 늪", "name_key": "", "faction": "elf", "biome": "swamp", "tier": 4, "terrain": "늪지", "terrain_subs": ["목초지"], "subzones": 7, "climate_element": "맹독", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 94, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 143, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 24, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 95, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 84, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 96, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 111, "zone_id": "neria", "zone_seq": 14, "zone_name_ko": "네리아 늪", "name_ko": "조용한 습지", "name_key": "", "faction": "elf", "biome": "swamp", "tier": 5, "terrain": "늪지", "terrain_subs": [], "subzones": 8, "climate_element": "맹독", "climate_intensity": 2, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 95, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 144, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 96, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}], "landmark_code": null}, {"id": 112, "zone_id": "byeoldok", "zone_seq": 6, "zone_name_ko": "별독지대", "name_ko": "오염된 개울", "name_key": "", "faction": "elf", "biome": "toxic_wasteland", "tier": 5, "terrain": "늪지", "terrain_subs": ["유적"], "subzones": 10, "climate_element": "맹독", "climate_intensity": 3, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 95, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 144, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 135, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 96, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 155, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 113, "zone_id": "byeoldok", "zone_seq": 7, "zone_name_ko": "별독지대", "name_ko": "시든 꽃밭", "name_key": "", "faction": "elf", "biome": "toxic_wasteland", "tier": 5, "terrain": "늪지", "terrain_subs": ["유적"], "subzones": 8, "climate_element": "맹독", "climate_intensity": 3, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 95, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 144, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 135, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 96, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 155, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 114, "zone_id": "byeoldok", "zone_seq": 8, "zone_name_ko": "별독지대", "name_ko": "유리 조각 벌판", "name_key": "", "faction": "elf", "biome": "toxic_wasteland", "tier": 5, "terrain": "유적", "terrain_subs": ["늪지"], "subzones": 9, "climate_element": "맹독", "climate_intensity": 3, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 135, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 154, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 95, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 136, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 145, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 115, "zone_id": "byeoldok", "zone_seq": 9, "zone_name_ko": "별독지대", "name_ko": "초록 불빛 골짜기", "name_key": "", "faction": "elf", "biome": "toxic_wasteland", "tier": 5, "terrain": "유적", "terrain_subs": ["늪지"], "subzones": 9, "climate_element": "맹독", "climate_intensity": 3, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 135, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 154, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 95, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 136, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 145, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 116, "zone_id": "byeoldok", "zone_seq": 10, "zone_name_ko": "별독지대", "name_ko": "잿빛 웅덩이", "name_key": "", "faction": "elf", "biome": "toxic_wasteland", "tier": 5, "terrain": "늪지", "terrain_subs": ["유적"], "subzones": 8, "climate_element": "맹독", "climate_intensity": 3, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 95, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 144, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 135, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 96, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 155, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 117, "zone_id": "morgar", "zone_seq": 1, "zone_name_ko": "모르가르 저주지", "name_ko": "잿빛 벌판", "name_key": "", "faction": "undead", "biome": "cursed_waste", "tier": 1, "terrain": "유적", "terrain_subs": ["물가", "농경지"], "subzones": 2, "climate_element": "어둠", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 131, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 151, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 31, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 132, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 133, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 118, "zone_id": "morgar", "zone_seq": 2, "zone_name_ko": "모르가르 저주지", "name_ko": "뼈 무덤 벌판", "name_key": "", "faction": "undead", "biome": "cursed_waste", "tier": 1, "terrain": "늪지", "terrain_subs": ["숲", "농경지"], "subzones": 1, "climate_element": "어둠", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 91, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 141, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 41, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 92, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 93, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 119, "zone_id": "morgar", "zone_seq": 3, "zone_name_ko": "모르가르 저주지", "name_ko": "시든 나무 언덕", "name_key": "", "faction": "undead", "biome": "cursed_waste", "tier": 1, "terrain": "늪지", "terrain_subs": ["숲"], "subzones": 1, "climate_element": "어둠", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 91, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 141, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 41, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 92, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 93, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 120, "zone_id": "morgar", "zone_seq": 4, "zone_name_ko": "모르가르 저주지", "name_ko": "검은 흙 벌판", "name_key": "", "faction": "undead", "biome": "cursed_waste", "tier": 1, "terrain": "숲", "terrain_subs": ["유적", "목초지"], "subzones": 2, "climate_element": "어둠", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 41, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 91, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 131, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 42, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 21, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 43, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 121, "zone_id": "ragma", "zone_seq": 1, "zone_name_ko": "라그마 화산지대", "name_ko": "균열 가장자리", "name_key": "", "faction": "undead", "biome": "rift_border", "tier": 1, "terrain": "유적", "terrain_subs": ["산악", "농경지"], "subzones": 2, "climate_element": "화염", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 131, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 151, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 51, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 132, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 11, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 133, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 122, "zone_id": "ragma", "zone_seq": 2, "zone_name_ko": "라그마 화산지대", "name_ko": "붉은 빛 틈", "name_key": "", "faction": "undead", "biome": "rift_border", "tier": 1, "terrain": "유적", "terrain_subs": ["산악", "숲"], "subzones": 2, "climate_element": "화염", "climate_intensity": 2, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 131, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 151, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 51, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 132, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 41, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 133, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 123, "zone_id": "belkar", "zone_seq": 1, "zone_name_ko": "벨카르 고원", "name_ko": "어둠 고원", "name_key": "", "faction": "undead", "biome": "dark_highlands", "tier": 1, "terrain": "숲", "terrain_subs": ["늪지", "산악"], "subzones": 2, "climate_element": "어둠", "climate_intensity": 3, "friendship_max": 100, "garrison_cap": 5, "production": [{"material_id": 41, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 91, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 42, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 51, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 43, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 124, "zone_id": "morgar", "zone_seq": 5, "zone_name_ko": "모르가르 저주지", "name_ko": "까마귀 벌판", "name_key": "", "faction": "undead", "biome": "cursed_waste", "tier": 2, "terrain": "늪지", "terrain_subs": ["숲", "광산"], "subzones": 3, "climate_element": "어둠", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 92, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 141, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 42, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 93, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 62, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 94, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 125, "zone_id": "morgar", "zone_seq": 6, "zone_name_ko": "모르가르 저주지", "name_ko": "어둠 안개 골", "name_key": "", "faction": "undead", "biome": "cursed_waste", "tier": 2, "terrain": "숲", "terrain_subs": ["늪지"], "subzones": 2, "climate_element": "어둠", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 42, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 91, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 92, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 43, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 142, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 44, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 126, "zone_id": "ragma", "zone_seq": 3, "zone_name_ko": "라그마 화산지대", "name_ko": "갈라진 어둠 골", "name_key": "", "faction": "undead", "biome": "rift_border", "tier": 2, "terrain": "산악", "terrain_subs": ["숲", "유적"], "subzones": 3, "climate_element": "화염", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 52, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 101, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 42, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 53, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 132, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 54, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 127, "zone_id": "ragma", "zone_seq": 4, "zone_name_ko": "라그마 화산지대", "name_ko": "용암 개울", "name_key": "", "faction": "undead", "biome": "volcanic_waste", "tier": 2, "terrain": "산악", "terrain_subs": ["유적", "광산"], "subzones": 3, "climate_element": "화염", "climate_intensity": 3, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 52, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 101, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 132, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 53, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 62, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 54, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 128, "zone_id": "morgar", "zone_seq": 7, "zone_name_ko": "모르가르 저주지", "name_ko": "버려진 무덤가", "name_key": "", "faction": "undead", "biome": "cursed_waste", "tier": 2, "terrain": "늪지", "terrain_subs": ["숲", "광산"], "subzones": 2, "climate_element": "어둠", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 92, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 141, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 42, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 93, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 62, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 94, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 129, "zone_id": "belkar", "zone_seq": 2, "zone_name_ko": "벨카르 고원", "name_ko": "검은 바위 능선", "name_key": "", "faction": "undead", "biome": "dark_highlands", "tier": 2, "terrain": "숲", "terrain_subs": ["산악", "늪지"], "subzones": 2, "climate_element": "어둠", "climate_intensity": 3, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 42, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 91, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 52, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 43, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 92, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 44, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 130, "zone_id": "morgar", "zone_seq": 8, "zone_name_ko": "모르가르 저주지", "name_ko": "유령불 벌판", "name_key": "", "faction": "undead", "biome": "cursed_waste", "tier": 2, "terrain": "숲", "terrain_subs": ["늪지", "유적"], "subzones": 3, "climate_element": "어둠", "climate_intensity": 2, "friendship_max": 250, "garrison_cap": 10, "production": [{"material_id": 42, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 91, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 92, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 43, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 132, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 44, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 131, "zone_id": "belkar", "zone_seq": 3, "zone_name_ko": "벨카르 고원", "name_ko": "달 없는 언덕", "name_key": "", "faction": "undead", "biome": "dark_highlands", "tier": 3, "terrain": "광산", "terrain_subs": ["산악", "늪지"], "subzones": 4, "climate_element": "어둠", "climate_intensity": 3, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 63, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 112, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 53, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 64, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 93, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 65, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 132, "zone_id": "ragma", "zone_seq": 5, "zone_name_ko": "라그마 화산지대", "name_ko": "불씨 흩날리는 땅", "name_key": "", "faction": "undead", "biome": "rift_border", "tier": 3, "terrain": "산악", "terrain_subs": ["숲", "광산"], "subzones": 5, "climate_element": "화염", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 53, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 102, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 43, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 54, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 63, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 55, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 133, "zone_id": "ragma", "zone_seq": 6, "zone_name_ko": "라그마 화산지대", "name_ko": "악마의 차원문", "name_key": "", "faction": "undead", "biome": "volcanic_waste", "tier": 4, "terrain": "광산", "terrain_subs": ["산악"], "subzones": 7, "climate_element": "화염", "climate_intensity": 3, "friendship_max": 1500, "garrison_cap": 100, "production": [{"material_id": 64, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 113, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 54, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 65, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 104, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 66, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}, {"material_id": 208, "rate": 10, "unlock_type": "landmark", "unlock_value": 5}], "landmark_code": "demon_portal"}, {"id": 134, "zone_id": "morgar", "zone_seq": 9, "zone_name_ko": "모르가르 저주지", "name_ko": "마른 가시 벌판", "name_key": "", "faction": "undead", "biome": "cursed_waste", "tier": 3, "terrain": "숲", "terrain_subs": ["유적"], "subzones": 5, "climate_element": "어둠", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 43, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 92, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 133, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 44, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 153, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 45, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 135, "zone_id": "belkar", "zone_seq": 4, "zone_name_ko": "벨카르 고원", "name_ko": "그림자 봉우리", "name_key": "", "faction": "undead", "biome": "dark_highlands", "tier": 3, "terrain": "산악", "terrain_subs": ["광산", "늪지"], "subzones": 4, "climate_element": "어둠", "climate_intensity": 3, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 53, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 102, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 63, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 54, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 93, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 55, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 136, "zone_id": "morgar", "zone_seq": 10, "zone_name_ko": "모르가르 저주지", "name_ko": "침묵의 들", "name_key": "", "faction": "undead", "biome": "cursed_waste", "tier": 3, "terrain": "유적", "terrain_subs": ["숲", "산악"], "subzones": 5, "climate_element": "어둠", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 133, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 152, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 43, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 134, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 53, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 135, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 137, "zone_id": "morgar", "zone_seq": 11, "zone_name_ko": "모르가르 저주지", "name_ko": "창백한 언덕", "name_key": "", "faction": "undead", "biome": "cursed_waste", "tier": 3, "terrain": "숲", "terrain_subs": ["유적"], "subzones": 5, "climate_element": "어둠", "climate_intensity": 2, "friendship_max": 600, "garrison_cap": 20, "production": [{"material_id": 43, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 92, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 133, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 44, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 153, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 45, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 138, "zone_id": "belkar", "zone_seq": 5, "zone_name_ko": "벨카르 고원", "name_ko": "박쥐 벼랑", "name_key": "", "faction": "undead", "biome": "dark_highlands", "tier": 4, "terrain": "산악", "terrain_subs": ["숲", "광산"], "subzones": 7, "climate_element": "어둠", "climate_intensity": 3, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 54, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 103, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 44, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 55, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 64, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 56, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 139, "zone_id": "belkar", "zone_seq": 6, "zone_name_ko": "벨카르 고원", "name_ko": "검은 가시 언덕", "name_key": "", "faction": "undead", "biome": "dark_highlands", "tier": 4, "terrain": "산악", "terrain_subs": ["광산"], "subzones": 6, "climate_element": "어둠", "climate_intensity": 3, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 54, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 103, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 64, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 55, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 114, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 56, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 140, "zone_id": "ragma", "zone_seq": 7, "zone_name_ko": "라그마 화산지대", "name_ko": "검붉은 경계", "name_key": "", "faction": "undead", "biome": "rift_border", "tier": 4, "terrain": "산악", "terrain_subs": ["광산"], "subzones": 7, "climate_element": "화염", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 54, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 103, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 64, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 55, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 114, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 56, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 141, "zone_id": "ragma", "zone_seq": 8, "zone_name_ko": "라그마 화산지대", "name_ko": "불타는 화산", "name_key": "", "faction": "undead", "biome": "volcanic_waste", "tier": 4, "terrain": "산악", "terrain_subs": ["광산"], "subzones": 6, "climate_element": "화염", "climate_intensity": 3, "friendship_max": 1500, "garrison_cap": 100, "production": [{"material_id": 54, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 103, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 64, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 55, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 114, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 56, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}, {"material_id": 209, "rate": 10, "unlock_type": "landmark", "unlock_value": 5}], "landmark_code": "volcano"}, {"id": 142, "zone_id": "morgar", "zone_seq": 12, "zone_name_ko": "모르가르 저주지", "name_ko": "저주받은 갈림길", "name_key": "", "faction": "undead", "biome": "cursed_waste", "tier": 4, "terrain": "유적", "terrain_subs": ["숲"], "subzones": 7, "climate_element": "어둠", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 134, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 153, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 44, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 135, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 94, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 136, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 143, "zone_id": "ragma", "zone_seq": 9, "zone_name_ko": "라그마 화산지대", "name_ko": "검은 재 벌판", "name_key": "", "faction": "undead", "biome": "volcanic_waste", "tier": 4, "terrain": "광산", "terrain_subs": ["산악"], "subzones": 7, "climate_element": "화염", "climate_intensity": 3, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 64, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 113, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 54, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 65, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 104, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 66, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 144, "zone_id": "morgar", "zone_seq": 13, "zone_name_ko": "모르가르 저주지", "name_ko": "그림자 웅덩이", "name_key": "", "faction": "undead", "biome": "cursed_waste", "tier": 4, "terrain": "유적", "terrain_subs": ["숲", "산악"], "subzones": 7, "climate_element": "어둠", "climate_intensity": 2, "friendship_max": 1500, "garrison_cap": 50, "production": [{"material_id": 134, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 153, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 44, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 135, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 54, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}, {"material_id": 136, "rate": 8, "unlock_type": "friendship", "unlock_value": 5}], "landmark_code": null}, {"id": 145, "zone_id": "belkar", "zone_seq": 7, "zone_name_ko": "벨카르 고원", "name_ko": "안개 낀 고원", "name_key": "", "faction": "undead", "biome": "dark_highlands", "tier": 5, "terrain": "산악", "terrain_subs": ["유적", "광산"], "subzones": 8, "climate_element": "어둠", "climate_intensity": 3, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 55, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 104, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 135, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 56, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 65, "rate": 30, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 146, "zone_id": "belkar", "zone_seq": 8, "zone_name_ko": "벨카르 고원", "name_ko": "어두운 돌길", "name_key": "", "faction": "undead", "biome": "dark_highlands", "tier": 5, "terrain": "광산", "terrain_subs": ["산악"], "subzones": 8, "climate_element": "어둠", "climate_intensity": 3, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 65, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 114, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 55, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 66, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 105, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 147, "zone_id": "belkar", "zone_seq": 9, "zone_name_ko": "벨카르 고원", "name_ko": "늙은 까마귀 바위", "name_key": "", "faction": "undead", "biome": "dark_highlands", "tier": 5, "terrain": "산악", "terrain_subs": [], "subzones": 8, "climate_element": "어둠", "climate_intensity": 3, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 55, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 104, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 56, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}], "landmark_code": null}, {"id": 148, "zone_id": "belkar", "zone_seq": 10, "zone_name_ko": "벨카르 고원", "name_ko": "언데드 성채", "name_key": "", "faction": "undead", "biome": "dark_highlands", "tier": 6, "terrain": "산악", "terrain_subs": [], "subzones": 10, "climate_element": "어둠", "climate_intensity": 3, "friendship_max": 10000, "garrison_cap": 300, "production": [{"material_id": 56, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 105, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 210, "rate": 10, "unlock_type": "landmark", "unlock_value": 5}], "landmark_code": "undead_castle"}, {"id": 149, "zone_id": "belkar", "zone_seq": 11, "zone_name_ko": "벨카르 고원", "name_ko": "핏빛 이끼 바위", "name_key": "", "faction": "undead", "biome": "dark_highlands", "tier": 5, "terrain": "산악", "terrain_subs": ["광산"], "subzones": 8, "climate_element": "어둠", "climate_intensity": 3, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 55, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 104, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 65, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 56, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 115, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}, {"id": 150, "zone_id": "belkar", "zone_seq": 12, "zone_name_ko": "벨카르 고원", "name_ko": "침묵 봉우리", "name_key": "", "faction": "undead", "biome": "dark_highlands", "tier": 5, "terrain": "산악", "terrain_subs": ["광산"], "subzones": 8, "climate_element": "어둠", "climate_intensity": 3, "friendship_max": 4000, "garrison_cap": 100, "production": [{"material_id": 55, "rate": 100, "unlock_type": "base", "unlock_value": 0}, {"material_id": 104, "rate": 50, "unlock_type": "base", "unlock_value": 0}, {"material_id": 65, "rate": 30, "unlock_type": "friendship", "unlock_value": 2}, {"material_id": 56, "rate": 15, "unlock_type": "friendship", "unlock_value": 3}, {"material_id": 115, "rate": 25, "unlock_type": "friendship", "unlock_value": 4}], "landmark_code": null}] | ||
| start_region | removed | 2 |
Bundled data: assets/images/conquest/regionGameData.draft.json 6
| Row | Change | Field | Before | After |
|---|---|---|---|---|
| _note | removed | "conquest2(GPT) 기하+데이터 채택본 — faction=ID대역, tier=difficulty_tier(중립0→1), 검수 필요" | ||
| continent_centroid_px | removed | [1020, 735] | ||
| faction_count | removed | {"neutral": 14, "human": 34, "orc": 34, "elf": 34, "undead": 34} | ||
| landmark_index | removed | [{"code": "titan_sword", "name_ko": "타이탄의 석검", "x": 563, "y": 860, "region_id": 21}, {"code": "angel_temple", "name_ko": "천사의 작은 신전", "x": 860, "y": 1196, "region_id": 28}, {"code": "broken_babel_tower", "name_ko": "부서진 바벨탑", "x": 716, "y": 497, "region_id": 52}, {"code": "frozen_titan", "name_ko": "얼어붙은 고대 타이탄", "x": 522, "y": 287, "region_id": 78}, {"code": "world_tree", "name_ko": "세계수", "x": 1443, "y": 734, "region_id": 89}, {"code": "sunken_temple", "name_ko": "가라앉은 고대 사원", "x": 1249, "y": 1105, "region_id": 96}, {"code": "poison_crater", "name_ko": "독성 운석 분화구", "x": 1617, "y": 1105, "region_id": 107}, {"code": "demon_portal", "name_ko": "악마의 차원문", "x": 1279, "y": 315, "region_id": 133}, {"code": "volcano", "name_ko": "불타는 화산", "x": 1136, "y": 147, "region_id": 141}, {"code": "undead_castle", "name_ko": "언데드 성채", "x": 1576, "y": 259, "region_id": 148}] | ||
| regions | removed | [{"id": 1, "faction": "neutral", "biome": "central_watershed", "biome_ko": "중앙 수원지", "name_ko": "은빛 여울", "hop": 0, "tier_suggestion": 1, "landmarks": [], "zone_id": "panderas", "zone_name_ko": "판데라스 평원", "zone_seq": 1, "terrain": "물가", "subzones": 1, "terrain_subs": ["농경지", "목초지"]}, {"id": 2, "faction": "neutral", "biome": "central_watershed", "biome_ko": "중앙 수원지", "name_ko": "여명의 호숫가", "hop": 0, "tier_suggestion": 1, "landmarks": [], "zone_id": "panderas", "zone_name_ko": "판데라스 평원", "zone_seq": 2, "terrain": "물가", "subzones": 1, "terrain_subs": ["농경지", "목초지"]}, {"id": 3, "faction": "neutral", "biome": "central_watershed", "biome_ko": "중앙 수원지", "name_ko": "버들 나루", "hop": 0, "tier_suggestion": 1, "landmarks": [], "zone_id": "panderas", "zone_name_ko": "판데라스 평원", "zone_seq": 3, "terrain": "물가", "subzones": 2, "terrain_subs": ["농경지", "목초지"]}, {"id": 4, "faction": "neutral", "biome": "central_watershed", "biome_ko": "중앙 수원지", "name_ko": "구름 여울", "hop": 0, "tier_suggestion": 1, "landmarks": [], "zone_id": "panderas", "zone_name_ko": "판데라스 평원", "zone_seq": 4, "terrain": "물가", "subzones": 2, "terrain_subs": ["농경지", "목초지"]}, {"id": 5, "faction": "neutral", "biome": "central_watershed", "biome_ko": "중앙 수원지", "name_ko": "아침 나루", "hop": 0, "tier_suggestion": 1, "landmarks": [], "zone_id": "panderas", "zone_name_ko": "판데라스 평원", "zone_seq": 5, "terrain": "물가", "subzones": 2, "terrain_subs": ["농경지", "목초지"]}, {"id": 6, "faction": "neutral", "biome": "central_plains", "biome_ko": "중앙 평원", "name_ko": "바람 들판", "hop": 0, "tier_suggestion": 1, "landmarks": [], "zone_id": "panderas", "zone_name_ko": "판데라스 평원", "zone_seq": 6, "terrain": "농경지", "subzones": 2, "terrain_subs": ["물가", "목초지"]}, {"id": 7, "faction": "neutral", "biome": "central_plains", "biome_ko": "중앙 평원", "name_ko": "양떼 언덕", "hop": 0, "tier_suggestion": 1, "landmarks": [], "zone_id": "panderas", "zone_name_ko": "판데라스 평원", "zone_seq": 7, "terrain": "목초지", "subzones": 1, "terrain_subs": ["농경지", "물가"]}, {"id": 8, "faction": "neutral", "biome": "central_plains", "biome_ko": "중앙 평원", "name_ko": "해바라기 평원", "hop": 0, "tier_suggestion": 1, "landmarks": [], "zone_id": "panderas", "zone_name_ko": "판데라스 평원", "zone_seq": 8, "terrain": "농경지", "subzones": 2, "terrain_subs": ["늪지", "물가"]}, {"id": 9, "faction": "neutral", "biome": "central_plains", "biome_ko": "중앙 평원", "name_ko": "종달새 들판", "hop": 0, "tier_suggestion": 1, "landmarks": [], "zone_id": "panderas", "zone_name_ko": "판데라스 평원", "zone_seq": 9, "terrain": "농경지", "subzones": 1, "terrain_subs": ["물가", "목초지"]}, {"id": 10, "faction": "neutral", "biome": "central_plains", "biome_ko": "중앙 평원", "name_ko": "밀꽃 평원", "hop": 0, "tier_suggestion": 1, "landmarks": [], "zone_id": "panderas", "zone_name_ko": "판데라스 평원", "zone_seq": 10, "terrain": "농경지", "subzones": 1, "terrain_subs": ["광산", "물가"]}, {"id": 11, "faction": "neutral", "biome": "central_plains", "biome_ko": "중앙 평원", "name_ko": "클로버 언덕", "hop": 0, "tier_suggestion": 1, "landmarks": [], "zone_id": "panderas", "zone_name_ko": "판데라스 평원", "zone_seq": 11, "terrain": "목초지", "subzones": 2, "terrain_subs": ["물가", "농경지"]}, {"id": 12, "faction": "neutral", "biome": "central_plains", "biome_ko": "중앙 평원", "name_ko": "시냇가 들판", "hop": 0, "tier_suggestion": 1, "landmarks": [], "zone_id": "panderas", "zone_name_ko": "판데라스 평원", "zone_seq": 12, "terrain": "농경지", "subzones": 1, "terrain_subs": ["늪지", "물가"]}, {"id": 13, "faction": "neutral", "biome": "central_plains", "biome_ko": "중앙 평원", "name_ko": "달빛 구릉지", "hop": 0, "tier_suggestion": 1, "landmarks": [], "zone_id": "panderas", "zone_name_ko": "판데라스 평원", "zone_seq": 13, "terrain": "농경지", "subzones": 1, "terrain_subs": ["광산", "물가"]}, {"id": 14, "faction": "neutral", "biome": "central_plains", "biome_ko": "중앙 평원", "name_ko": "조약돌 언덕", "hop": 0, "tier_suggestion": 1, "landmarks": [], "zone_id": "panderas", "zone_name_ko": "판데라스 평원", "zone_seq": 14, "terrain": "목초지", "subzones": 2, "terrain_subs": ["농경지", "사냥터"]}, {"id": 15, "faction": "human", "biome": "desert", "biome_ko": "사막", "name_ko": "모래 언덕길", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "saharin", "zone_name_ko": "사하린 사막", "zone_seq": 1, "terrain": "광산", "subzones": 2, "terrain_subs": ["농경지", "사냥터"]}, {"id": 16, "faction": "human", "biome": "open_plains", "biome_ko": "너른 평원", "name_ko": "햇살 들녘", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "arden", "zone_name_ko": "아르덴 들녘", "zone_seq": 1, "terrain": "농경지", "subzones": 1, "terrain_subs": ["목초지", "광산"]}, {"id": 17, "faction": "human", "biome": "desert", "biome_ko": "사막", "name_ko": "선인장 골짜기", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "saharin", "zone_name_ko": "사하린 사막", "zone_seq": 2, "terrain": "사냥터", "subzones": 2, "terrain_subs": ["광산", "농경지"]}, {"id": 18, "faction": "human", "biome": "desert", "biome_ko": "사막", "name_ko": "오아시스 쉼터", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "saharin", "zone_name_ko": "사하린 사막", "zone_seq": 3, "terrain": "광산", "subzones": 2, "terrain_subs": ["농경지", "사냥터"]}, {"id": 19, "faction": "human", "biome": "desert", "biome_ko": "사막", "name_ko": "사막 장미 골", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "saharin", "zone_name_ko": "사하린 사막", "zone_seq": 4, "terrain": "광산", "subzones": 1, "terrain_subs": ["사냥터", "산악"]}, {"id": 20, "faction": "human", "biome": "desert", "biome_ko": "사막", "name_ko": "뜨거운 모래밭", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "saharin", "zone_name_ko": "사하린 사막", "zone_seq": 5, "terrain": "광산", "subzones": 2, "terrain_subs": ["농경지", "목초지"]}, {"id": 21, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "타이탄의 석검", "hop": 1, "tier_suggestion": 4, "landmarks": [{"code": "titan_sword", "name_ko": "타이탄의 석검", "x": 563, "y": 860}], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 1, "terrain": "광산", "subzones": 6, "terrain_subs": ["사냥터"]}, {"id": 22, "faction": "human", "biome": "desert", "biome_ko": "사막", "name_ko": "신기루 벌판", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "saharin", "zone_name_ko": "사하린 사막", "zone_seq": 6, "terrain": "광산", "subzones": 2, "terrain_subs": ["사냥터", "농경지"]}, {"id": 23, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "붉은 바위산", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 2, "terrain": "광산", "subzones": 2, "terrain_subs": ["산악"]}, {"id": 24, "faction": "human", "biome": "open_plains", "biome_ko": "너른 평원", "name_ko": "보리 이랑", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "arden", "zone_name_ko": "아르덴 들녘", "zone_seq": 2, "terrain": "목초지", "subzones": 2, "terrain_subs": ["광산", "늪지"]}, {"id": 25, "faction": "human", "biome": "desert", "biome_ko": "사막", "name_ko": "전갈 바위", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "saharin", "zone_name_ko": "사하린 사막", "zone_seq": 7, "terrain": "광산", "subzones": 3, "terrain_subs": ["목초지", "산악"]}, {"id": 26, "faction": "human", "biome": "desert", "biome_ko": "사막", "name_ko": "마른 우물터", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "saharin", "zone_name_ko": "사하린 사막", "zone_seq": 8, "terrain": "농경지", "subzones": 3, "terrain_subs": ["광산"]}, {"id": 27, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "녹슨 협곡", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 3, "terrain": "광산", "subzones": 3, "terrain_subs": ["산악"]}, {"id": 28, "faction": "human", "biome": "desert", "biome_ko": "사막", "name_ko": "천사의 작은 신전", "hop": 2, "tier_suggestion": 4, "landmarks": [{"code": "angel_temple", "name_ko": "천사의 작은 신전", "x": 860, "y": 1196}], "zone_id": "saharin", "zone_name_ko": "사하린 사막", "zone_seq": 9, "terrain": "광산", "subzones": 6, "terrain_subs": ["목초지", "농경지"]}, {"id": 29, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "매 둥지 절벽", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 4, "terrain": "산악", "subzones": 4, "terrain_subs": ["광산", "목초지"]}, {"id": 30, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "노을 바위", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 5, "terrain": "광산", "subzones": 5, "terrain_subs": ["산악"]}, {"id": 31, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "붉은 먼지 골짜기", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 6, "terrain": "광산", "subzones": 5, "terrain_subs": ["농경지", "산악"]}, {"id": 32, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "부서진 바위 벌판", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 7, "terrain": "산악", "subzones": 4, "terrain_subs": ["광산"]}, {"id": 33, "faction": "human", "biome": "desert", "biome_ko": "사막", "name_ko": "황금 모래벌", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "saharin", "zone_name_ko": "사하린 사막", "zone_seq": 10, "terrain": "광산", "subzones": 5, "terrain_subs": ["농경지"]}, {"id": 34, "faction": "human", "biome": "open_plains", "biome_ko": "너른 평원", "name_ko": "원두막 벌판", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "arden", "zone_name_ko": "아르덴 들녘", "zone_seq": 3, "terrain": "목초지", "subzones": 4, "terrain_subs": ["늪지"]}, {"id": 35, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "불꽃 바위", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 8, "terrain": "산악", "subzones": 5, "terrain_subs": ["광산"]}, {"id": 36, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "붉은 손가락 바위", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 9, "terrain": "광산", "subzones": 7, "terrain_subs": ["산악"]}, {"id": 37, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "쇠 바위 능선", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 10, "terrain": "광산", "subzones": 7, "terrain_subs": ["산악"]}, {"id": 38, "faction": "human", "biome": "open_plains", "biome_ko": "너른 평원", "name_ko": "능금나무 벌판", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "arden", "zone_name_ko": "아르덴 들녘", "zone_seq": 4, "terrain": "목초지", "subzones": 7, "terrain_subs": ["광산", "농경지"]}, {"id": 39, "faction": "human", "biome": "desert", "biome_ko": "사막", "name_ko": "바람 조각 바위", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "saharin", "zone_name_ko": "사하린 사막", "zone_seq": 11, "terrain": "농경지", "subzones": 7, "terrain_subs": ["광산", "목초지"]}, {"id": 40, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "구리빛 벼랑", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 11, "terrain": "광산", "subzones": 7, "terrain_subs": ["산악"]}, {"id": 41, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "붉은 탑 바위", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 12, "terrain": "산악", "subzones": 7, "terrain_subs": ["광산"]}, {"id": 42, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "마른 강 바닥", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 13, "terrain": "산악", "subzones": 6, "terrain_subs": ["광산"]}, {"id": 43, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "갈라진 땅", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 14, "terrain": "광산", "subzones": 8, "terrain_subs": ["산악"]}, {"id": 44, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "돌부리 벌판", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 15, "terrain": "산악", "subzones": 10, "terrain_subs": ["광산"]}, {"id": 45, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "붉은 안개 골", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 16, "terrain": "광산", "subzones": 10, "terrain_subs": ["산악"]}, {"id": 46, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "독수리 바위", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 17, "terrain": "산악", "subzones": 10, "terrain_subs": ["광산"]}, {"id": 47, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "붉은 노을 능선", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 18, "terrain": "산악", "subzones": 9, "terrain_subs": ["광산"]}, {"id": 48, "faction": "human", "biome": "red_badlands", "biome_ko": "붉은 황무지", "name_ko": "화살촉 바위", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "redcrown", "zone_name_ko": "붉은왕관 산맥", "zone_seq": 19, "terrain": "광산", "subzones": 9, "terrain_subs": ["산악"]}, {"id": 49, "faction": "orc", "biome": "tundra", "biome_ko": "툰드라", "name_ko": "언 땅 벌판", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "urkan", "zone_name_ko": "우르칸 툰드라", "zone_seq": 1, "terrain": "사냥터", "subzones": 1, "terrain_subs": ["산악", "농경지"]}, {"id": 50, "faction": "orc", "biome": "snowfield", "biome_ko": "설원", "name_ko": "흰눈 벌판", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "garin", "zone_name_ko": "가린 설원", "zone_seq": 1, "terrain": "목초지", "subzones": 1, "terrain_subs": ["사냥터", "농경지"]}, {"id": 51, "faction": "orc", "biome": "cold_hills", "biome_ko": "서리 언덕", "name_ko": "서리 언덕", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "garin", "zone_name_ko": "가린 설원", "zone_seq": 2, "terrain": "산악", "subzones": 2, "terrain_subs": ["광산", "사냥터"]}, {"id": 52, "faction": "orc", "biome": "snowfield", "biome_ko": "설원", "name_ko": "부서진 바벨탑", "hop": 1, "tier_suggestion": 4, "landmarks": [{"code": "broken_babel_tower", "name_ko": "부서진 바벨탑", "x": 716, "y": 497}], "zone_id": "garin", "zone_name_ko": "가린 설원", "zone_seq": 3, "terrain": "산악", "subzones": 6, "terrain_subs": ["사냥터", "목초지"]}, {"id": 53, "faction": "orc", "biome": "tundra", "biome_ko": "툰드라", "name_ko": "순록 벌판", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "urkan", "zone_name_ko": "우르칸 툰드라", "zone_seq": 2, "terrain": "사냥터", "subzones": 1, "terrain_subs": ["산악", "목초지"]}, {"id": 54, "faction": "orc", "biome": "snowfield", "biome_ko": "설원", "name_ko": "눈보라 언덕", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "garin", "zone_name_ko": "가린 설원", "zone_seq": 4, "terrain": "사냥터", "subzones": 2, "terrain_subs": ["목초지", "유적"]}, {"id": 55, "faction": "orc", "biome": "cold_hills", "biome_ko": "서리 언덕", "name_ko": "찬 바위 구릉", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "garin", "zone_name_ko": "가린 설원", "zone_seq": 5, "terrain": "광산", "subzones": 1, "terrain_subs": ["목초지", "산악"]}, {"id": 56, "faction": "orc", "biome": "tundra", "biome_ko": "툰드라", "name_ko": "찬바람 언덕", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "urkan", "zone_name_ko": "우르칸 툰드라", "zone_seq": 3, "terrain": "목초지", "subzones": 3, "terrain_subs": ["사냥터", "산악"]}, {"id": 57, "faction": "orc", "biome": "snowfield", "biome_ko": "설원", "name_ko": "하얀 늑대 벌판", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "garin", "zone_name_ko": "가린 설원", "zone_seq": 6, "terrain": "사냥터", "subzones": 3, "terrain_subs": ["유적", "목초지"]}, {"id": 58, "faction": "orc", "biome": "snowfield", "biome_ko": "설원", "name_ko": "눈송이 골짜기", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "garin", "zone_name_ko": "가린 설원", "zone_seq": 7, "terrain": "목초지", "subzones": 3, "terrain_subs": ["사냥터", "유적"]}, {"id": 59, "faction": "orc", "biome": "tundra", "biome_ko": "툰드라", "name_ko": "흰 이끼 벌판", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "urkan", "zone_name_ko": "우르칸 툰드라", "zone_seq": 4, "terrain": "목초지", "subzones": 2, "terrain_subs": ["광산", "사냥터"]}, {"id": 60, "faction": "orc", "biome": "glacier", "biome_ko": "빙하", "name_ko": "얼음 벼랑", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "baekya", "zone_name_ko": "백야 빙원", "zone_seq": 1, "terrain": "유적", "subzones": 2, "terrain_subs": ["산악", "사냥터"]}, {"id": 61, "faction": "orc", "biome": "glacier", "biome_ko": "빙하", "name_ko": "푸른 빙벽", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "baekya", "zone_name_ko": "백야 빙원", "zone_seq": 2, "terrain": "유적", "subzones": 3, "terrain_subs": ["사냥터", "산악"]}, {"id": 62, "faction": "orc", "biome": "snowfield", "biome_ko": "설원", "name_ko": "곰 발자국 벌판", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "garin", "zone_name_ko": "가린 설원", "zone_seq": 8, "terrain": "사냥터", "subzones": 2, "terrain_subs": ["목초지", "산악"]}, {"id": 63, "faction": "orc", "biome": "glacier", "biome_ko": "빙하", "name_ko": "유리 얼음벌", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "baekya", "zone_name_ko": "백야 빙원", "zone_seq": 3, "terrain": "산악", "subzones": 5, "terrain_subs": ["유적", "사냥터"]}, {"id": 64, "faction": "orc", "biome": "glacier", "biome_ko": "빙하", "name_ko": "얼어붙은 폭포", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "baekya", "zone_name_ko": "백야 빙원", "zone_seq": 4, "terrain": "유적", "subzones": 4, "terrain_subs": ["목초지", "사냥터"]}, {"id": 65, "faction": "orc", "biome": "tundra", "biome_ko": "툰드라", "name_ko": "매머드 길", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "urkan", "zone_name_ko": "우르칸 툰드라", "zone_seq": 5, "terrain": "목초지", "subzones": 5, "terrain_subs": ["산악", "사냥터"]}, {"id": 66, "faction": "orc", "biome": "snowfield", "biome_ko": "설원", "name_ko": "은빛 설원", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "garin", "zone_name_ko": "가린 설원", "zone_seq": 9, "terrain": "사냥터", "subzones": 4, "terrain_subs": ["목초지", "유적"]}, {"id": 67, "faction": "orc", "biome": "tundra", "biome_ko": "툰드라", "name_ko": "서리 풀밭", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "urkan", "zone_name_ko": "우르칸 툰드라", "zone_seq": 6, "terrain": "사냥터", "subzones": 4, "terrain_subs": ["목초지", "산악"]}, {"id": 68, "faction": "orc", "biome": "cold_hills", "biome_ko": "서리 언덕", "name_ko": "언 돌 언덕", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "garin", "zone_name_ko": "가린 설원", "zone_seq": 10, "terrain": "산악", "subzones": 5, "terrain_subs": ["광산", "목초지"]}, {"id": 69, "faction": "orc", "biome": "snowfield", "biome_ko": "설원", "name_ko": "눈 덮인 소나무길", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "garin", "zone_name_ko": "가린 설원", "zone_seq": 11, "terrain": "목초지", "subzones": 4, "terrain_subs": ["산악", "사냥터"]}, {"id": 70, "faction": "orc", "biome": "tundra", "biome_ko": "툰드라", "name_ko": "얼음꽃 벌판", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "urkan", "zone_name_ko": "우르칸 툰드라", "zone_seq": 7, "terrain": "사냥터", "subzones": 6, "terrain_subs": ["목초지", "산악"]}, {"id": 71, "faction": "orc", "biome": "snowfield", "biome_ko": "설원", "name_ko": "고요한 설원", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "garin", "zone_name_ko": "가린 설원", "zone_seq": 12, "terrain": "산악", "subzones": 7, "terrain_subs": ["사냥터", "목초지"]}, {"id": 72, "faction": "orc", "biome": "glacier", "biome_ko": "빙하", "name_ko": "수정 얼음골", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "baekya", "zone_name_ko": "백야 빙원", "zone_seq": 5, "terrain": "유적", "subzones": 7, "terrain_subs": ["산악", "사냥터"]}, {"id": 73, "faction": "orc", "biome": "glacier", "biome_ko": "빙하", "name_ko": "빙하 틈새", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "baekya", "zone_name_ko": "백야 빙원", "zone_seq": 6, "terrain": "산악", "subzones": 6, "terrain_subs": ["유적", "물가"]}, {"id": 74, "faction": "orc", "biome": "glacier", "biome_ko": "빙하", "name_ko": "흰 수염 봉우리", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "baekya", "zone_name_ko": "백야 빙원", "zone_seq": 7, "terrain": "물가", "subzones": 6, "terrain_subs": ["산악", "유적"]}, {"id": 75, "faction": "orc", "biome": "glacier", "biome_ko": "빙하", "name_ko": "얼음 동굴 어귀", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "baekya", "zone_name_ko": "백야 빙원", "zone_seq": 8, "terrain": "산악", "subzones": 7, "terrain_subs": ["물가"]}, {"id": 76, "faction": "orc", "biome": "glacier", "biome_ko": "빙하", "name_ko": "차가운 별 벌판", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "baekya", "zone_name_ko": "백야 빙원", "zone_seq": 9, "terrain": "산악", "subzones": 6, "terrain_subs": ["유적", "물가"]}, {"id": 77, "faction": "orc", "biome": "snowfield", "biome_ko": "설원", "name_ko": "흰 여우 언덕", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "garin", "zone_name_ko": "가린 설원", "zone_seq": 13, "terrain": "사냥터", "subzones": 9, "terrain_subs": ["산악"]}, {"id": 78, "faction": "orc", "biome": "glacier", "biome_ko": "빙하", "name_ko": "얼어붙은 고대 타이탄", "hop": 5, "tier_suggestion": 6, "landmarks": [{"code": "frozen_titan", "name_ko": "얼어붙은 고대 타이탄", "x": 522, "y": 287}], "zone_id": "baekya", "zone_name_ko": "백야 빙원", "zone_seq": 10, "terrain": "산악", "subzones": 10, "terrain_subs": ["사냥터", "목초지"]}, {"id": 79, "faction": "orc", "biome": "glacier", "biome_ko": "빙하", "name_ko": "깨진 얼음 벌판", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "baekya", "zone_name_ko": "백야 빙원", "zone_seq": 11, "terrain": "물가", "subzones": 10, "terrain_subs": ["산악", "목초지"]}, {"id": 80, "faction": "orc", "biome": "glacier", "biome_ko": "빙하", "name_ko": "서리 거인 길", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "baekya", "zone_name_ko": "백야 빙원", "zone_seq": 12, "terrain": "산악", "subzones": 9, "terrain_subs": ["목초지", "물가"]}, {"id": 81, "faction": "orc", "biome": "snowfield", "biome_ko": "설원", "name_ko": "겨울 사냥터", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "garin", "zone_name_ko": "가린 설원", "zone_seq": 14, "terrain": "사냥터", "subzones": 8, "terrain_subs": ["산악", "물가"]}, {"id": 82, "faction": "orc", "biome": "glacier", "biome_ko": "빙하", "name_ko": "눈시린 벼랑", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "baekya", "zone_name_ko": "백야 빙원", "zone_seq": 13, "terrain": "물가", "subzones": 8, "terrain_subs": ["산악", "유적"]}, {"id": 83, "faction": "elf", "biome": "swamp", "biome_ko": "늪지", "name_ko": "안개 늪", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "neria", "zone_name_ko": "네리아 늪", "zone_seq": 1, "terrain": "늪지", "subzones": 1, "terrain_subs": ["농경지"]}, {"id": 84, "faction": "elf", "biome": "ancient_forest", "biome_ko": "고대 숲", "name_ko": "반딧불 숲", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "sylvaren", "zone_name_ko": "실바렌 숲", "zone_seq": 1, "terrain": "숲", "subzones": 1, "terrain_subs": ["늪지", "농경지"]}, {"id": 85, "faction": "elf", "biome": "swamp", "biome_ko": "늪지", "name_ko": "개구리 울음 늪", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "neria", "zone_name_ko": "네리아 늪", "zone_seq": 2, "terrain": "늪지", "subzones": 1, "terrain_subs": ["숲", "농경지"]}, {"id": 86, "faction": "elf", "biome": "swamp", "biome_ko": "늪지", "name_ko": "갈대 늪", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "neria", "zone_name_ko": "네리아 늪", "zone_seq": 3, "terrain": "늪지", "subzones": 1, "terrain_subs": ["목초지", "농경지"]}, {"id": 87, "faction": "elf", "biome": "ancient_forest", "biome_ko": "고대 숲", "name_ko": "이끼 낀 숲", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "sylvaren", "zone_name_ko": "실바렌 숲", "zone_seq": 2, "terrain": "숲", "subzones": 1, "terrain_subs": ["늪지", "사냥터"]}, {"id": 88, "faction": "elf", "biome": "swamp", "biome_ko": "늪지", "name_ko": "물풀 늪지", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "neria", "zone_name_ko": "네리아 늪", "zone_seq": 4, "terrain": "늪지", "subzones": 1, "terrain_subs": ["농경지"]}, {"id": 89, "faction": "elf", "biome": "ancient_forest", "biome_ko": "고대 숲", "name_ko": "세계수", "hop": 1, "tier_suggestion": 5, "landmarks": [{"code": "world_tree", "name_ko": "세계수", "x": 1443, "y": 734}], "zone_id": "sylvaren", "zone_name_ko": "실바렌 숲", "zone_seq": 3, "terrain": "숲", "subzones": 9, "terrain_subs": ["늪지"]}, {"id": 90, "faction": "elf", "biome": "swamp", "biome_ko": "늪지", "name_ko": "잠자리 늪", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "neria", "zone_name_ko": "네리아 늪", "zone_seq": 5, "terrain": "늪지", "subzones": 3, "terrain_subs": ["숲", "사냥터"]}, {"id": 91, "faction": "elf", "biome": "swamp", "biome_ko": "늪지", "name_ko": "검은 물 늪", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "neria", "zone_name_ko": "네리아 늪", "zone_seq": 6, "terrain": "늪지", "subzones": 3, "terrain_subs": ["농경지"]}, {"id": 92, "faction": "elf", "biome": "ancient_forest", "biome_ko": "고대 숲", "name_ko": "노래하는 숲", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "sylvaren", "zone_name_ko": "실바렌 숲", "zone_seq": 4, "terrain": "숲", "subzones": 2, "terrain_subs": ["사냥터"]}, {"id": 93, "faction": "elf", "biome": "ancient_forest", "biome_ko": "고대 숲", "name_ko": "은빛 나뭇길", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "sylvaren", "zone_name_ko": "실바렌 숲", "zone_seq": 5, "terrain": "사냥터", "subzones": 2, "terrain_subs": ["숲", "늪지"]}, {"id": 94, "faction": "elf", "biome": "swamp", "biome_ko": "늪지", "name_ko": "수련 늪", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "neria", "zone_name_ko": "네리아 늪", "zone_seq": 7, "terrain": "늪지", "subzones": 3, "terrain_subs": ["목초지"]}, {"id": 95, "faction": "elf", "biome": "ancient_forest", "biome_ko": "고대 숲", "name_ko": "오래된 떡갈나무 숲", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "sylvaren", "zone_name_ko": "실바렌 숲", "zone_seq": 6, "terrain": "숲", "subzones": 2, "terrain_subs": []}, {"id": 96, "faction": "elf", "biome": "swamp", "biome_ko": "늪지", "name_ko": "가라앉은 고대 사원", "hop": 2, "tier_suggestion": 4, "landmarks": [{"code": "sunken_temple", "name_ko": "가라앉은 고대 사원", "x": 1249, "y": 1105}], "zone_id": "neria", "zone_name_ko": "네리아 늪", "zone_seq": 8, "terrain": "늪지", "subzones": 6, "terrain_subs": []}, {"id": 97, "faction": "elf", "biome": "swamp", "biome_ko": "늪지", "name_ko": "반딧불 습지", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "neria", "zone_name_ko": "네리아 늪", "zone_seq": 9, "terrain": "늪지", "subzones": 4, "terrain_subs": ["사냥터", "광산"]}, {"id": 98, "faction": "elf", "biome": "ancient_forest", "biome_ko": "고대 숲", "name_ko": "달빛 나무 그늘", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "sylvaren", "zone_name_ko": "실바렌 숲", "zone_seq": 7, "terrain": "숲", "subzones": 4, "terrain_subs": []}, {"id": 99, "faction": "elf", "biome": "ancient_forest", "biome_ko": "고대 숲", "name_ko": "속삭이는 수풀", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "sylvaren", "zone_name_ko": "실바렌 숲", "zone_seq": 8, "terrain": "숲", "subzones": 4, "terrain_subs": ["사냥터", "광산"]}, {"id": 100, "faction": "elf", "biome": "toxic_wasteland", "biome_ko": "오염된 황무지", "name_ko": "초록 안개 벌판", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "byeoldok", "zone_name_ko": "별독지대", "zone_seq": 1, "terrain": "광산", "subzones": 4, "terrain_subs": ["늪지", "사냥터"]}, {"id": 101, "faction": "elf", "biome": "swamp", "biome_ko": "늪지", "name_ko": "진흙 발 늪", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "neria", "zone_name_ko": "네리아 늪", "zone_seq": 10, "terrain": "늪지", "subzones": 5, "terrain_subs": ["목초지"]}, {"id": 102, "faction": "elf", "biome": "ancient_forest", "biome_ko": "고대 숲", "name_ko": "버섯 동그라미 숲", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "sylvaren", "zone_name_ko": "실바렌 숲", "zone_seq": 9, "terrain": "숲", "subzones": 4, "terrain_subs": ["유적"]}, {"id": 103, "faction": "elf", "biome": "swamp", "biome_ko": "늪지", "name_ko": "버들 늪", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "neria", "zone_name_ko": "네리아 늪", "zone_seq": 11, "terrain": "늪지", "subzones": 4, "terrain_subs": []}, {"id": 104, "faction": "elf", "biome": "toxic_wasteland", "biome_ko": "오염된 황무지", "name_ko": "병든 풀밭", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "byeoldok", "zone_name_ko": "별독지대", "zone_seq": 2, "terrain": "늪지", "subzones": 6, "terrain_subs": ["광산", "유적"]}, {"id": 105, "faction": "elf", "biome": "swamp", "biome_ko": "늪지", "name_ko": "이끼 늪", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "neria", "zone_name_ko": "네리아 늪", "zone_seq": 12, "terrain": "늪지", "subzones": 7, "terrain_subs": []}, {"id": 106, "faction": "elf", "biome": "ancient_forest", "biome_ko": "고대 숲", "name_ko": "새벽이슬 숲", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "sylvaren", "zone_name_ko": "실바렌 숲", "zone_seq": 10, "terrain": "숲", "subzones": 6, "terrain_subs": ["유적"]}, {"id": 107, "faction": "elf", "biome": "toxic_wasteland", "biome_ko": "오염된 황무지", "name_ko": "독성 운석 분화구", "hop": 4, "tier_suggestion": 4, "landmarks": [{"code": "poison_crater", "name_ko": "독성 운석 분화구", "x": 1617, "y": 1105}], "zone_id": "byeoldok", "zone_name_ko": "별독지대", "zone_seq": 3, "terrain": "늪지", "subzones": 7, "terrain_subs": ["유적", "숲"]}, {"id": 108, "faction": "elf", "biome": "toxic_wasteland", "biome_ko": "오염된 황무지", "name_ko": "녹아내린 땅", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "byeoldok", "zone_name_ko": "별독지대", "zone_seq": 4, "terrain": "유적", "subzones": 7, "terrain_subs": ["숲", "늪지"]}, {"id": 109, "faction": "elf", "biome": "toxic_wasteland", "biome_ko": "오염된 황무지", "name_ko": "별똥별 잿더미", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "byeoldok", "zone_name_ko": "별독지대", "zone_seq": 5, "terrain": "유적", "subzones": 7, "terrain_subs": ["늪지", "광산"]}, {"id": 110, "faction": "elf", "biome": "swamp", "biome_ko": "늪지", "name_ko": "뱀길 늪", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "neria", "zone_name_ko": "네리아 늪", "zone_seq": 13, "terrain": "늪지", "subzones": 7, "terrain_subs": ["목초지"]}, {"id": 111, "faction": "elf", "biome": "swamp", "biome_ko": "늪지", "name_ko": "조용한 습지", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "neria", "zone_name_ko": "네리아 늪", "zone_seq": 14, "terrain": "늪지", "subzones": 8, "terrain_subs": []}, {"id": 112, "faction": "elf", "biome": "toxic_wasteland", "biome_ko": "오염된 황무지", "name_ko": "오염된 개울", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "byeoldok", "zone_name_ko": "별독지대", "zone_seq": 6, "terrain": "늪지", "subzones": 10, "terrain_subs": ["유적"]}, {"id": 113, "faction": "elf", "biome": "toxic_wasteland", "biome_ko": "오염된 황무지", "name_ko": "시든 꽃밭", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "byeoldok", "zone_name_ko": "별독지대", "zone_seq": 7, "terrain": "늪지", "subzones": 8, "terrain_subs": ["유적"]}, {"id": 114, "faction": "elf", "biome": "toxic_wasteland", "biome_ko": "오염된 황무지", "name_ko": "유리 조각 벌판", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "byeoldok", "zone_name_ko": "별독지대", "zone_seq": 8, "terrain": "유적", "subzones": 9, "terrain_subs": ["늪지"]}, {"id": 115, "faction": "elf", "biome": "toxic_wasteland", "biome_ko": "오염된 황무지", "name_ko": "초록 불빛 골짜기", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "byeoldok", "zone_name_ko": "별독지대", "zone_seq": 9, "terrain": "유적", "subzones": 9, "terrain_subs": ["늪지"]}, {"id": 116, "faction": "elf", "biome": "toxic_wasteland", "biome_ko": "오염된 황무지", "name_ko": "잿빛 웅덩이", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "byeoldok", "zone_name_ko": "별독지대", "zone_seq": 10, "terrain": "늪지", "subzones": 8, "terrain_subs": ["유적"]}, {"id": 117, "faction": "undead", "biome": "cursed_waste", "biome_ko": "저주받은 땅", "name_ko": "잿빛 벌판", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "morgar", "zone_name_ko": "모르가르 저주지", "zone_seq": 1, "terrain": "유적", "subzones": 2, "terrain_subs": ["물가", "농경지"]}, {"id": 118, "faction": "undead", "biome": "cursed_waste", "biome_ko": "저주받은 땅", "name_ko": "뼈 무덤 벌판", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "morgar", "zone_name_ko": "모르가르 저주지", "zone_seq": 2, "terrain": "늪지", "subzones": 1, "terrain_subs": ["숲", "농경지"]}, {"id": 119, "faction": "undead", "biome": "cursed_waste", "biome_ko": "저주받은 땅", "name_ko": "시든 나무 언덕", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "morgar", "zone_name_ko": "모르가르 저주지", "zone_seq": 3, "terrain": "늪지", "subzones": 1, "terrain_subs": ["숲"]}, {"id": 120, "faction": "undead", "biome": "cursed_waste", "biome_ko": "저주받은 땅", "name_ko": "검은 흙 벌판", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "morgar", "zone_name_ko": "모르가르 저주지", "zone_seq": 4, "terrain": "숲", "subzones": 2, "terrain_subs": ["유적", "목초지"]}, {"id": 121, "faction": "undead", "biome": "rift_border", "biome_ko": "균열 접경", "name_ko": "균열 가장자리", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "ragma", "zone_name_ko": "라그마 화산지대", "zone_seq": 1, "terrain": "유적", "subzones": 2, "terrain_subs": ["산악", "농경지"]}, {"id": 122, "faction": "undead", "biome": "rift_border", "biome_ko": "균열 접경", "name_ko": "붉은 빛 틈", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "ragma", "zone_name_ko": "라그마 화산지대", "zone_seq": 2, "terrain": "유적", "subzones": 2, "terrain_subs": ["산악", "숲"]}, {"id": 123, "faction": "undead", "biome": "dark_highlands", "biome_ko": "어둠 고원", "name_ko": "어둠 고원", "hop": 1, "tier_suggestion": 1, "landmarks": [], "zone_id": "belkar", "zone_name_ko": "벨카르 고원", "zone_seq": 1, "terrain": "숲", "subzones": 2, "terrain_subs": ["늪지", "산악"]}, {"id": 124, "faction": "undead", "biome": "cursed_waste", "biome_ko": "저주받은 땅", "name_ko": "까마귀 벌판", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "morgar", "zone_name_ko": "모르가르 저주지", "zone_seq": 5, "terrain": "늪지", "subzones": 3, "terrain_subs": ["숲", "광산"]}, {"id": 125, "faction": "undead", "biome": "cursed_waste", "biome_ko": "저주받은 땅", "name_ko": "어둠 안개 골", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "morgar", "zone_name_ko": "모르가르 저주지", "zone_seq": 6, "terrain": "숲", "subzones": 2, "terrain_subs": ["늪지"]}, {"id": 126, "faction": "undead", "biome": "rift_border", "biome_ko": "균열 접경", "name_ko": "갈라진 어둠 골", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "ragma", "zone_name_ko": "라그마 화산지대", "zone_seq": 3, "terrain": "산악", "subzones": 3, "terrain_subs": ["숲", "유적"]}, {"id": 127, "faction": "undead", "biome": "volcanic_waste", "biome_ko": "화산 지대", "name_ko": "용암 개울", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "ragma", "zone_name_ko": "라그마 화산지대", "zone_seq": 4, "terrain": "산악", "subzones": 3, "terrain_subs": ["유적", "광산"]}, {"id": 128, "faction": "undead", "biome": "cursed_waste", "biome_ko": "저주받은 땅", "name_ko": "버려진 무덤가", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "morgar", "zone_name_ko": "모르가르 저주지", "zone_seq": 7, "terrain": "늪지", "subzones": 2, "terrain_subs": ["숲", "광산"]}, {"id": 129, "faction": "undead", "biome": "dark_highlands", "biome_ko": "어둠 고원", "name_ko": "검은 바위 능선", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "belkar", "zone_name_ko": "벨카르 고원", "zone_seq": 2, "terrain": "숲", "subzones": 2, "terrain_subs": ["산악", "늪지"]}, {"id": 130, "faction": "undead", "biome": "cursed_waste", "biome_ko": "저주받은 땅", "name_ko": "유령불 벌판", "hop": 2, "tier_suggestion": 2, "landmarks": [], "zone_id": "morgar", "zone_name_ko": "모르가르 저주지", "zone_seq": 8, "terrain": "숲", "subzones": 3, "terrain_subs": ["늪지", "유적"]}, {"id": 131, "faction": "undead", "biome": "dark_highlands", "biome_ko": "어둠 고원", "name_ko": "달 없는 언덕", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "belkar", "zone_name_ko": "벨카르 고원", "zone_seq": 3, "terrain": "광산", "subzones": 4, "terrain_subs": ["산악", "늪지"]}, {"id": 132, "faction": "undead", "biome": "rift_border", "biome_ko": "균열 접경", "name_ko": "불씨 흩날리는 땅", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "ragma", "zone_name_ko": "라그마 화산지대", "zone_seq": 5, "terrain": "산악", "subzones": 5, "terrain_subs": ["숲", "광산"]}, {"id": 133, "faction": "undead", "biome": "volcanic_waste", "biome_ko": "화산 지대", "name_ko": "악마의 차원문", "hop": 4, "tier_suggestion": 4, "landmarks": [{"code": "demon_portal", "name_ko": "악마의 차원문", "x": 1279, "y": 315}], "zone_id": "ragma", "zone_name_ko": "라그마 화산지대", "zone_seq": 6, "terrain": "광산", "subzones": 7, "terrain_subs": ["산악"]}, {"id": 134, "faction": "undead", "biome": "cursed_waste", "biome_ko": "저주받은 땅", "name_ko": "마른 가시 벌판", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "morgar", "zone_name_ko": "모르가르 저주지", "zone_seq": 9, "terrain": "숲", "subzones": 5, "terrain_subs": ["유적"]}, {"id": 135, "faction": "undead", "biome": "dark_highlands", "biome_ko": "어둠 고원", "name_ko": "그림자 봉우리", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "belkar", "zone_name_ko": "벨카르 고원", "zone_seq": 4, "terrain": "산악", "subzones": 4, "terrain_subs": ["광산", "늪지"]}, {"id": 136, "faction": "undead", "biome": "cursed_waste", "biome_ko": "저주받은 땅", "name_ko": "침묵의 들", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "morgar", "zone_name_ko": "모르가르 저주지", "zone_seq": 10, "terrain": "유적", "subzones": 5, "terrain_subs": ["숲", "산악"]}, {"id": 137, "faction": "undead", "biome": "cursed_waste", "biome_ko": "저주받은 땅", "name_ko": "창백한 언덕", "hop": 3, "tier_suggestion": 3, "landmarks": [], "zone_id": "morgar", "zone_name_ko": "모르가르 저주지", "zone_seq": 11, "terrain": "숲", "subzones": 5, "terrain_subs": ["유적"]}, {"id": 138, "faction": "undead", "biome": "dark_highlands", "biome_ko": "어둠 고원", "name_ko": "박쥐 벼랑", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "belkar", "zone_name_ko": "벨카르 고원", "zone_seq": 5, "terrain": "산악", "subzones": 7, "terrain_subs": ["숲", "광산"]}, {"id": 139, "faction": "undead", "biome": "dark_highlands", "biome_ko": "어둠 고원", "name_ko": "검은 가시 언덕", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "belkar", "zone_name_ko": "벨카르 고원", "zone_seq": 6, "terrain": "산악", "subzones": 6, "terrain_subs": ["광산"]}, {"id": 140, "faction": "undead", "biome": "rift_border", "biome_ko": "균열 접경", "name_ko": "검붉은 경계", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "ragma", "zone_name_ko": "라그마 화산지대", "zone_seq": 7, "terrain": "산악", "subzones": 7, "terrain_subs": ["광산"]}, {"id": 141, "faction": "undead", "biome": "volcanic_waste", "biome_ko": "화산 지대", "name_ko": "불타는 화산", "hop": 4, "tier_suggestion": 4, "landmarks": [{"code": "volcano", "name_ko": "불타는 화산", "x": 1136, "y": 147}], "zone_id": "ragma", "zone_name_ko": "라그마 화산지대", "zone_seq": 8, "terrain": "산악", "subzones": 6, "terrain_subs": ["광산"]}, {"id": 142, "faction": "undead", "biome": "cursed_waste", "biome_ko": "저주받은 땅", "name_ko": "저주받은 갈림길", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "morgar", "zone_name_ko": "모르가르 저주지", "zone_seq": 12, "terrain": "유적", "subzones": 7, "terrain_subs": ["숲"]}, {"id": 143, "faction": "undead", "biome": "volcanic_waste", "biome_ko": "화산 지대", "name_ko": "검은 재 벌판", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "ragma", "zone_name_ko": "라그마 화산지대", "zone_seq": 9, "terrain": "광산", "subzones": 7, "terrain_subs": ["산악"]}, {"id": 144, "faction": "undead", "biome": "cursed_waste", "biome_ko": "저주받은 땅", "name_ko": "그림자 웅덩이", "hop": 4, "tier_suggestion": 4, "landmarks": [], "zone_id": "morgar", "zone_name_ko": "모르가르 저주지", "zone_seq": 13, "terrain": "유적", "subzones": 7, "terrain_subs": ["숲", "산악"]}, {"id": 145, "faction": "undead", "biome": "dark_highlands", "biome_ko": "어둠 고원", "name_ko": "안개 낀 고원", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "belkar", "zone_name_ko": "벨카르 고원", "zone_seq": 7, "terrain": "산악", "subzones": 8, "terrain_subs": ["유적", "광산"]}, {"id": 146, "faction": "undead", "biome": "dark_highlands", "biome_ko": "어둠 고원", "name_ko": "어두운 돌길", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "belkar", "zone_name_ko": "벨카르 고원", "zone_seq": 8, "terrain": "광산", "subzones": 8, "terrain_subs": ["산악"]}, {"id": 147, "faction": "undead", "biome": "dark_highlands", "biome_ko": "어둠 고원", "name_ko": "늙은 까마귀 바위", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "belkar", "zone_name_ko": "벨카르 고원", "zone_seq": 9, "terrain": "산악", "subzones": 8, "terrain_subs": []}, {"id": 148, "faction": "undead", "biome": "dark_highlands", "biome_ko": "어둠 고원", "name_ko": "언데드 성채", "hop": 5, "tier_suggestion": 6, "landmarks": [{"code": "undead_castle", "name_ko": "언데드 성채", "x": 1576, "y": 259}], "zone_id": "belkar", "zone_name_ko": "벨카르 고원", "zone_seq": 10, "terrain": "산악", "subzones": 10, "terrain_subs": []}, {"id": 149, "faction": "undead", "biome": "dark_highlands", "biome_ko": "어둠 고원", "name_ko": "핏빛 이끼 바위", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "belkar", "zone_name_ko": "벨카르 고원", "zone_seq": 11, "terrain": "산악", "subzones": 8, "terrain_subs": ["광산"]}, {"id": 150, "faction": "undead", "biome": "dark_highlands", "biome_ko": "어둠 고원", "name_ko": "침묵 봉우리", "hop": 5, "tier_suggestion": 5, "landmarks": [], "zone_id": "belkar", "zone_name_ko": "벨카르 고원", "zone_seq": 12, "terrain": "산악", "subzones": 8, "terrain_subs": ["광산"]}] | ||
| start_region | removed | 2 |
Bundled data: assets/images/conquest/regionMetadata.json 7
| Row | Change | Field | Before | After |
|---|---|---|---|---|
| generator | removed | {"source": "conquest2 (GPT partition)", "adopted": "adoptConquest2.mjs"} | ||
| height | removed | 1400 | ||
| mask_encoding | removed | {"region_id_r8": "pixel grayscale value = region ID (0..150)", "filtering": "Point/Nearest", "mipmap": false, "compression": "None / lossless", "srgb": false} | ||
| region_count | removed | 150 | ||
| regions | removed | [{"id": 1, "center_px": [942, 779], "center_uv": [0.459961, 0.556429], "pixel_area": 14412, "neighbors": [2, 3, 4, 6, 7, 10, 13], "neighbor_border_px": {"2": 62, "3": 158, "4": 226, "6": 118, "7": 140, "10": 70, "13": 106}}, {"id": 2, "center_px": [1077, 671], "center_uv": [0.525879, 0.479286], "pixel_area": 14628, "neighbors": [1, 3, 4, 5, 9, 11, 117], "neighbor_border_px": {"1": 62, "3": 290, "4": 152, "5": 162, "9": 158, "11": 18, "117": 178}}, {"id": 3, "center_px": [1085, 799], "center_uv": [0.529785, 0.570714], "pixel_area": 12740, "neighbors": [1, 2, 5, 7, 8, 12], "neighbor_border_px": {"1": 158, "2": 290, "5": 180, "7": 116, "8": 4, "12": 176}}, {"id": 4, "center_px": [937, 663], "center_uv": [0.45752, 0.473571], "pixel_area": 12664, "neighbors": [1, 2, 6, 9, 14], "neighbor_border_px": {"1": 226, "2": 152, "6": 126, "9": 104, "14": 128}}, {"id": 5, "center_px": [1172, 717], "center_uv": [0.572266, 0.512143], "pixel_area": 12824, "neighbors": [2, 3, 8, 11], "neighbor_border_px": {"2": 162, "3": 180, "8": 246, "11": 172}}, {"id": 6, "center_px": [821, 702], "center_uv": [0.400879, 0.501429], "pixel_area": 12568, "neighbors": [1, 4, 10, 14, 15, 49], "neighbor_border_px": {"1": 118, "4": 126, "10": 150, "14": 84, "15": 86, "49": 124}}, {"id": 7, "center_px": [998, 879], "center_uv": [0.487305, 0.627857], "pixel_area": 12388, "neighbors": [1, 3, 12, 13, 16, 86], "neighbor_border_px": {"1": 140, "3": 116, "12": 104, "13": 162, "16": 80, "86": 102}}, {"id": 8, "center_px": [1257, 769], "center_uv": [0.61377, 0.549286], "pixel_area": 13256, "neighbors": [3, 5, 11, 12, 83, 84, 85, 118], "neighbor_border_px": {"3": 4, "5": 246, "11": 56, "12": 6, "83": 128, "84": 214, "85": 106, "118": 28}}, {"id": 9, "center_px": [1001, 580], "center_uv": [0.48877, 0.414286], "pixel_area": 12728, "neighbors": [2, 4, 14, 50, 117, 121], "neighbor_border_px": {"2": 158, "4": 104, "14": 82, "50": 176, "117": 138, "121": 62}}, {"id": 10, "center_px": [794, 807], "center_uv": [0.387695, 0.576429], "pixel_area": 13704, "neighbors": [1, 6, 13, 15, 17, 18], "neighbor_border_px": {"1": 70, "6": 150, "13": 194, "15": 124, "17": 126, "18": 56}}, {"id": 11, "center_px": [1225, 613], "center_uv": [0.598145, 0.437857], "pixel_area": 12856, "neighbors": [2, 5, 8, 117, 118, 120], "neighbor_border_px": {"2": 18, "5": 172, "8": 56, "117": 144, "118": 238, "120": 100}}, {"id": 12, "center_px": [1126, 895], "center_uv": [0.549805, 0.639286], "pixel_area": 14364, "neighbors": [3, 7, 8, 83, 86, 88, 91], "neighbor_border_px": {"3": 176, "7": 104, "8": 6, "83": 236, "86": 142, "88": 46, "91": 50}}, {"id": 13, "center_px": [875, 886], "center_uv": [0.427246, 0.632857], "pixel_area": 15172, "neighbors": [1, 7, 10, 16, 18, 20], "neighbor_border_px": {"1": 106, "7": 162, "10": 194, "16": 158, "18": 176, "20": 24}}, {"id": 14, "center_px": [865, 575], "center_uv": [0.422363, 0.410714], "pixel_area": 14060, "neighbors": [4, 6, 9, 49, 50, 52, 54], "neighbor_border_px": {"4": 128, "6": 84, "9": 82, "49": 160, "50": 102, "52": 80, "54": 68}}, {"id": 15, "center_px": [701, 737], "center_uv": [0.342285, 0.526429], "pixel_area": 13376, "neighbors": [6, 10, 17, 19, 49, 51], "neighbor_border_px": {"6": 86, "10": 124, "17": 152, "19": 148, "49": 84, "51": 138}}, {"id": 16, "center_px": [938, 981], "center_uv": [0.458008, 0.700714], "pixel_area": 12044, "neighbors": [7, 13, 20, 24, 86], "neighbor_border_px": {"7": 80, "13": 158, "20": 198, "24": 94, "86": 170}}, {"id": 17, "center_px": [679, 852], "center_uv": [0.331543, 0.608571], "pixel_area": 14920, "neighbors": [10, 15, 18, 19, 21, 22], "neighbor_border_px": {"10": 126, "15": 152, "18": 180, "19": 74, "21": 282, "22": 42}}, {"id": 18, "center_px": [749, 955], "center_uv": [0.365723, 0.682143], "pixel_area": 15292, "neighbors": [10, 13, 17, 20, 22, 26], "neighbor_border_px": {"10": 56, "13": 176, "17": 180, "20": 124, "22": 152, "26": 84}}, {"id": 19, "center_px": [566, 760], "center_uv": [0.276367, 0.542857], "pixel_area": 15280, "neighbors": [15, 17, 21, 23, 25, 51, 55], "neighbor_border_px": {"15": 148, "17": 74, "21": 110, "23": 134, "25": 78, "51": 108, "55": 136}}, {"id": 20, "center_px": [851, 1051], "center_uv": [0.415527, 0.750714], "pixel_area": 13236, "neighbors": [13, 16, 18, 24, 26, 28], "neighbor_border_px": {"13": 24, "16": 198, "18": 124, "24": 110, "26": 176, "28": 72}}, {"id": 21, "center_px": [573, 899], "center_uv": [0.279785, 0.642143], "pixel_area": 12296, "neighbors": [17, 19, 22, 23, 27], "neighbor_border_px": {"17": 282, "19": 110, "22": 112, "23": 174, "27": 146}}, {"id": 22, "center_px": [636, 1005], "center_uv": [0.310547, 0.717857], "pixel_area": 16664, "neighbors": [17, 18, 21, 26, 27, 31, 32], "neighbor_border_px": {"17": 42, "18": 152, "21": 112, "26": 134, "27": 212, "31": 106, "32": 26}}, {"id": 23, "center_px": [465, 840], "center_uv": [0.227051, 0.6], "pixel_area": 15076, "neighbors": [19, 21, 25, 27, 29, 30], "neighbor_border_px": {"19": 134, "21": 174, "25": 114, "27": 58, "29": 104, "30": 236}}, {"id": 24, "center_px": [946, 1132], "center_uv": [0.461914, 0.808571], "pixel_area": 15528, "neighbors": [16, 20, 28, 34, 38, 86, 94], "neighbor_border_px": {"16": 94, "20": 110, "28": 174, "34": 128, "38": 30, "86": 38, "94": 186}}, {"id": 25, "center_px": [423, 732], "center_uv": [0.206543, 0.522857], "pixel_area": 14472, "neighbors": [19, 23, 29, 55, 59, 65], "neighbor_border_px": {"19": 78, "23": 114, "29": 170, "55": 164, "59": 118, "65": 104}}, {"id": 26, "center_px": [743, 1082], "center_uv": [0.362793, 0.772857], "pixel_area": 14496, "neighbors": [18, 20, 22, 28, 31, 33], "neighbor_border_px": {"18": 84, "20": 176, "22": 134, "28": 142, "31": 96, "33": 144}}, {"id": 27, "center_px": [501, 982], "center_uv": [0.244629, 0.701429], "pixel_area": 15060, "neighbors": [21, 22, 23, 30, 32, 35], "neighbor_border_px": {"21": 146, "22": 212, "23": 58, "30": 120, "32": 144, "35": 136}}, {"id": 28, "center_px": [833, 1171], "center_uv": [0.406738, 0.836429], "pixel_area": 13308, "neighbors": [20, 24, 26, 33, 38, 39], "neighbor_border_px": {"20": 72, "24": 174, "26": 142, "33": 68, "38": 142, "39": 106}}, {"id": 29, "center_px": [324, 788], "center_uv": [0.158203, 0.562857], "pixel_area": 14208, "neighbors": [23, 25, 30, 36, 65, 68], "neighbor_border_px": {"23": 104, "25": 170, "30": 74, "36": 164, "65": 74, "68": 138}}, {"id": 30, "center_px": [368, 927], "center_uv": [0.179688, 0.662143], "pixel_area": 15428, "neighbors": [23, 27, 29, 35, 36, 37], "neighbor_border_px": {"23": 236, "27": 120, "29": 74, "35": 84, "36": 82, "37": 176}}, {"id": 31, "center_px": [606, 1131], "center_uv": [0.295898, 0.807857], "pixel_area": 14060, "neighbors": [22, 26, 32, 33, 40], "neighbor_border_px": {"22": 106, "26": 96, "32": 192, "33": 268, "40": 120}}, {"id": 32, "center_px": [499, 1097], "center_uv": [0.243652, 0.783571], "pixel_area": 12248, "neighbors": [22, 27, 31, 35, 40, 41], "neighbor_border_px": {"22": 26, "27": 144, "31": 192, "35": 172, "40": 136, "41": 70}}, {"id": 33, "center_px": [705, 1191], "center_uv": [0.344238, 0.850714], "pixel_area": 14096, "neighbors": [26, 28, 31, 39], "neighbor_border_px": {"26": 144, "28": 68, "31": 268, "39": 144}}, {"id": 34, "center_px": [1015, 1232], "center_uv": [0.495605, 0.88], "pixel_area": 15648, "neighbors": [24, 38, 94, 101, 110], "neighbor_border_px": {"24": 128, "38": 228, "94": 62, "101": 148, "110": 62}}, {"id": 35, "center_px": [393, 1068], "center_uv": [0.191895, 0.762857], "pixel_area": 12124, "neighbors": [27, 30, 32, 37, 41, 43], "neighbor_border_px": {"27": 136, "30": 84, "32": 172, "37": 194, "41": 120, "43": 78}}, {"id": 36, "center_px": [252, 886], "center_uv": [0.123047, 0.632857], "pixel_area": 16772, "neighbors": [29, 30, 37, 42, 68], "neighbor_border_px": {"29": 164, "30": 82, "37": 90, "42": 90, "68": 146}}, {"id": 37, "center_px": [293, 1030], "center_uv": [0.143066, 0.735714], "pixel_area": 13288, "neighbors": [30, 35, 36, 42, 43, 44], "neighbor_border_px": {"30": 176, "35": 194, "36": 90, "42": 274, "43": 126, "44": 36}}, {"id": 38, "center_px": [904, 1273], "center_uv": [0.441406, 0.909286], "pixel_area": 13260, "neighbors": [24, 28, 34, 39], "neighbor_border_px": {"24": 30, "28": 142, "34": 228, "39": 232}}, {"id": 39, "center_px": [784, 1274], "center_uv": [0.382813, 0.91], "pixel_area": 12908, "neighbors": [28, 33, 38], "neighbor_border_px": {"28": 106, "33": 144, "38": 232}}, {"id": 40, "center_px": [484, 1191], "center_uv": [0.236328, 0.850714], "pixel_area": 10324, "neighbors": [31, 32, 41, 45], "neighbor_border_px": {"31": 120, "32": 136, "41": 176, "45": 90}}, {"id": 41, "center_px": [398, 1176], "center_uv": [0.194336, 0.84], "pixel_area": 11344, "neighbors": [32, 35, 40, 43, 45, 47], "neighbor_border_px": {"32": 70, "35": 120, "40": 176, "43": 192, "45": 182, "47": 16}}, {"id": 42, "center_px": [185, 1017], "center_uv": [0.090332, 0.726429], "pixel_area": 12104, "neighbors": [36, 37, 44, 46], "neighbor_border_px": {"36": 90, "37": 274, "44": 86, "46": 106}}, {"id": 43, "center_px": [297, 1136], "center_uv": [0.14502, 0.811429], "pixel_area": 12412, "neighbors": [35, 37, 41, 44, 47, 48], "neighbor_border_px": {"35": 78, "37": 126, "41": 192, "44": 208, "47": 126, "48": 62}}, {"id": 44, "center_px": [200, 1121], "center_uv": [0.097656, 0.800714], "pixel_area": 10224, "neighbors": [37, 42, 43, 46, 48], "neighbor_border_px": {"37": 36, "42": 86, "43": 208, "46": 158, "48": 212}}, {"id": 45, "center_px": [364, 1264], "center_uv": [0.177734, 0.902857], "pixel_area": 10624, "neighbors": [40, 41, 47], "neighbor_border_px": {"40": 90, "41": 182, "47": 218}}, {"id": 46, "center_px": [104, 1095], "center_uv": [0.050781, 0.782143], "pixel_area": 11660, "neighbors": [42, 44, 48], "neighbor_border_px": {"42": 106, "44": 158, "48": 108}}, {"id": 47, "center_px": [264, 1270], "center_uv": [0.128906, 0.907143], "pixel_area": 12824, "neighbors": [41, 43, 45, 48], "neighbor_border_px": {"41": 16, "43": 126, "45": 218, "48": 198}}, {"id": 48, "center_px": [178, 1216], "center_uv": [0.086914, 0.868571], "pixel_area": 12380, "neighbors": [43, 44, 46, 47], "neighbor_border_px": {"43": 62, "44": 212, "46": 108, "47": 198}}, {"id": 49, "center_px": [748, 606], "center_uv": [0.365234, 0.432857], "pixel_area": 13660, "neighbors": [6, 14, 15, 51, 52, 53], "neighbor_border_px": {"6": 124, "14": 160, "15": 84, "51": 166, "52": 88, "53": 114}}, {"id": 50, "center_px": [954, 488], "center_uv": [0.46582, 0.348571], "pixel_area": 11544, "neighbors": [9, 14, 54, 57, 121], "neighbor_border_px": {"9": 176, "14": 102, "54": 224, "57": 62, "121": 192}}, {"id": 51, "center_px": [628, 648], "center_uv": [0.306641, 0.462857], "pixel_area": 13324, "neighbors": [15, 19, 49, 53, 55, 56], "neighbor_border_px": {"15": 138, "19": 108, "49": 166, "53": 120, "55": 152, "56": 68}}, {"id": 52, "center_px": [765, 490], "center_uv": [0.373535, 0.35], "pixel_area": 13484, "neighbors": [14, 49, 53, 54, 58, 60], "neighbor_border_px": {"14": 80, "49": 88, "53": 98, "54": 200, "58": 122, "60": 84}}, {"id": 53, "center_px": [656, 540], "center_uv": [0.320313, 0.385714], "pixel_area": 12840, "neighbors": [49, 51, 52, 56, 58], "neighbor_border_px": {"49": 114, "51": 120, "52": 98, "56": 170, "58": 194}}, {"id": 54, "center_px": [860, 437], "center_uv": [0.419922, 0.312143], "pixel_area": 12888, "neighbors": [14, 50, 52, 57, 60, 61], "neighbor_border_px": {"14": 68, "50": 224, "52": 200, "57": 102, "60": 120, "61": 58}}, {"id": 55, "center_px": [514, 649], "center_uv": [0.250977, 0.463571], "pixel_area": 12056, "neighbors": [19, 25, 51, 56, 59], "neighbor_border_px": {"19": 136, "25": 164, "51": 152, "56": 124, "59": 168}}, {"id": 56, "center_px": [539, 542], "center_uv": [0.263184, 0.387143], "pixel_area": 14452, "neighbors": [51, 53, 55, 58, 59, 62, 66], "neighbor_border_px": {"51": 68, "53": 170, "55": 124, "58": 46, "59": 70, "62": 278, "66": 20}}, {"id": 57, "center_px": [980, 358], "center_uv": [0.478516, 0.255714], "pixel_area": 12960, "neighbors": [50, 54, 61, 63, 121], "neighbor_border_px": {"50": 62, "54": 102, "61": 198, "63": 190, "121": 156}}, {"id": 58, "center_px": [654, 429], "center_uv": [0.319336, 0.306429], "pixel_area": 13512, "neighbors": [52, 53, 56, 60, 64, 66], "neighbor_border_px": {"52": 122, "53": 194, "56": 46, "60": 46, "64": 160, "66": 196}}, {"id": 59, "center_px": [408, 608], "center_uv": [0.199219, 0.434286], "pixel_area": 13012, "neighbors": [25, 55, 56, 62, 65, 67], "neighbor_border_px": {"25": 118, "55": 168, "56": 70, "62": 60, "65": 114, "67": 194}}, {"id": 60, "center_px": [793, 347], "center_uv": [0.387207, 0.247857], "pixel_area": 14764, "neighbors": [52, 54, 58, 61, 64, 73, 76], "neighbor_border_px": {"52": 84, "54": 120, "58": 46, "61": 230, "64": 234, "73": 104, "76": 34}}, {"id": 61, "center_px": [903, 289], "center_uv": [0.440918, 0.206429], "pixel_area": 12960, "neighbors": [54, 57, 60, 63, 73, 74], "neighbor_border_px": {"54": 58, "57": 198, "60": 230, "63": 54, "73": 134, "74": 138}}, {"id": 62, "center_px": [461, 460], "center_uv": [0.225098, 0.328571], "pixel_area": 14404, "neighbors": [56, 59, 66, 67, 69, 71], "neighbor_border_px": {"56": 278, "59": 60, "66": 158, "67": 170, "69": 154, "71": 92}}, {"id": 63, "center_px": [1051, 277], "center_uv": [0.513184, 0.197857], "pixel_area": 14748, "neighbors": [57, 61, 74, 75, 121, 127, 141], "neighbor_border_px": {"57": 190, "61": 54, "74": 58, "75": 174, "121": 8, "127": 244, "141": 136}}, {"id": 64, "center_px": [691, 320], "center_uv": [0.337402, 0.228571], "pixel_area": 11944, "neighbors": [58, 60, 66, 72, 76], "neighbor_border_px": {"58": 160, "60": 234, "66": 140, "72": 212, "76": 38}}, {"id": 65, "center_px": [305, 645], "center_uv": [0.148926, 0.460714], "pixel_area": 13584, "neighbors": [25, 29, 59, 67, 68, 70], "neighbor_border_px": {"25": 104, "29": 74, "59": 114, "67": 128, "68": 114, "70": 254}}, {"id": 66, "center_px": [562, 354], "center_uv": [0.274414, 0.252857], "pixel_area": 14804, "neighbors": [56, 58, 62, 64, 69, 72, 78], "neighbor_border_px": {"56": 20, "58": 196, "62": 158, "64": 140, "69": 192, "72": 20, "78": 114}}, {"id": 67, "center_px": [329, 521], "center_uv": [0.160645, 0.372143], "pixel_area": 12980, "neighbors": [59, 62, 65, 70, 71, 77], "neighbor_border_px": {"59": 194, "62": 170, "65": 128, "70": 32, "71": 144, "77": 148}}, {"id": 68, "center_px": [221, 731], "center_uv": [0.10791, 0.522143], "pixel_area": 15140, "neighbors": [29, 36, 65, 70], "neighbor_border_px": {"29": 138, "36": 146, "65": 114, "70": 112}}, {"id": 69, "center_px": [439, 349], "center_uv": [0.214355, 0.249286], "pixel_area": 13304, "neighbors": [62, 66, 71, 78, 79, 80], "neighbor_border_px": {"62": 154, "66": 192, "71": 100, "78": 44, "79": 164, "80": 118}}, {"id": 70, "center_px": [202, 629], "center_uv": [0.098633, 0.449286], "pixel_area": 12904, "neighbors": [65, 67, 68, 77], "neighbor_border_px": {"65": 254, "67": 32, "68": 112, "77": 116}}, {"id": 71, "center_px": [334, 419], "center_uv": [0.163086, 0.299286], "pixel_area": 11204, "neighbors": [62, 67, 69, 77, 79, 81], "neighbor_border_px": {"62": 92, "67": 144, "69": 100, "77": 126, "79": 112, "81": 122}}, {"id": 72, "center_px": [658, 233], "center_uv": [0.321289, 0.166429], "pixel_area": 9876, "neighbors": [64, 66, 76, 78, 82], "neighbor_border_px": {"64": 212, "66": 20, "76": 222, "78": 162, "82": 148}}, {"id": 73, "center_px": [839, 195], "center_uv": [0.409668, 0.139286], "pixel_area": 12104, "neighbors": [60, 61, 74, 76], "neighbor_border_px": {"60": 104, "61": 134, "74": 194, "76": 292}}, {"id": 74, "center_px": [932, 188], "center_uv": [0.455078, 0.134286], "pixel_area": 14012, "neighbors": [61, 63, 73, 75], "neighbor_border_px": {"61": 138, "63": 58, "73": 194, "75": 270}}, {"id": 75, "center_px": [1037, 171], "center_uv": [0.506348, 0.122143], "pixel_area": 13196, "neighbors": [63, 74, 141], "neighbor_border_px": {"63": 174, "74": 270, "141": 180}}, {"id": 76, "center_px": [744, 192], "center_uv": [0.363281, 0.137143], "pixel_area": 12220, "neighbors": [60, 64, 72, 73, 82], "neighbor_border_px": {"60": 34, "64": 38, "72": 222, "73": 292, "82": 134}}, {"id": 77, "center_px": [249, 472], "center_uv": [0.121582, 0.337143], "pixel_area": 12992, "neighbors": [67, 70, 71, 81], "neighbor_border_px": {"67": 148, "70": 116, "71": 126, "81": 178}}, {"id": 78, "center_px": [536, 227], "center_uv": [0.261719, 0.162143], "pixel_area": 14024, "neighbors": [66, 69, 72, 80, 82], "neighbor_border_px": {"66": 114, "69": 44, "72": 162, "80": 232, "82": 120}}, {"id": 79, "center_px": [342, 299], "center_uv": [0.166992, 0.213571], "pixel_area": 11604, "neighbors": [69, 71, 80, 81], "neighbor_border_px": {"69": 164, "71": 112, "80": 160, "81": 214}}, {"id": 80, "center_px": [436, 247], "center_uv": [0.212891, 0.176429], "pixel_area": 11032, "neighbors": [69, 78, 79], "neighbor_border_px": {"69": 118, "78": 232, "79": 160}}, {"id": 81, "center_px": [255, 355], "center_uv": [0.124512, 0.253571], "pixel_area": 10532, "neighbors": [71, 77, 79], "neighbor_border_px": {"71": 122, "77": 178, "79": 214}}, {"id": 82, "center_px": [656, 149], "center_uv": [0.320313, 0.106429], "pixel_area": 10612, "neighbors": [72, 76, 78], "neighbor_border_px": {"72": 148, "76": 134, "78": 120}}, {"id": 83, "center_px": [1230, 878], "center_uv": [0.600586, 0.627143], "pixel_area": 12060, "neighbors": [8, 12, 85, 88, 90], "neighbor_border_px": {"8": 128, "12": 236, "85": 192, "88": 160, "90": 24}}, {"id": 84, "center_px": [1360, 736], "center_uv": [0.664063, 0.525714], "pixel_area": 12160, "neighbors": [8, 85, 87, 89, 118, 119], "neighbor_border_px": {"8": 214, "85": 42, "87": 114, "89": 90, "118": 68, "119": 164}}, {"id": 85, "center_px": [1320, 853], "center_uv": [0.644531, 0.609286], "pixel_area": 10004, "neighbors": [8, 83, 84, 87, 90], "neighbor_border_px": {"8": 106, "83": 192, "84": 42, "87": 150, "90": 118}}, {"id": 86, "center_px": [1047, 984], "center_uv": [0.51123, 0.702857], "pixel_area": 13776, "neighbors": [7, 12, 16, 24, 91, 94], "neighbor_border_px": {"7": 102, "12": 142, "16": 170, "24": 38, "91": 128, "94": 108}}, {"id": 87, "center_px": [1418, 828], "center_uv": [0.692383, 0.591429], "pixel_area": 11368, "neighbors": [84, 85, 89, 90, 92, 93], "neighbor_border_px": {"84": 114, "85": 150, "89": 94, "90": 60, "92": 102, "93": 100}}, {"id": 88, "center_px": [1248, 996], "center_uv": [0.609375, 0.711429], "pixel_area": 13792, "neighbors": [12, 83, 90, 91, 96, 97], "neighbor_border_px": {"12": 46, "83": 160, "90": 174, "91": 174, "96": 148, "97": 2}}, {"id": 89, "center_px": [1495, 748], "center_uv": [0.72998, 0.534286], "pixel_area": 11864, "neighbors": [84, 87, 92, 95, 119, 125], "neighbor_border_px": {"84": 90, "87": 94, "92": 142, "95": 90, "119": 118, "125": 182}}, {"id": 90, "center_px": [1372, 958], "center_uv": [0.669922, 0.684286], "pixel_area": 14140, "neighbors": [83, 85, 87, 88, 93, 97], "neighbor_border_px": {"83": 24, "85": 118, "87": 60, "88": 174, "93": 174, "97": 190}}, {"id": 91, "center_px": [1144, 1043], "center_uv": [0.558594, 0.745], "pixel_area": 14204, "neighbors": [12, 86, 88, 94, 96, 101], "neighbor_border_px": {"12": 50, "86": 128, "88": 174, "94": 132, "96": 130, "101": 122}}, {"id": 92, "center_px": [1526, 844], "center_uv": [0.745117, 0.602857], "pixel_area": 10920, "neighbors": [87, 89, 93, 95, 99], "neighbor_border_px": {"87": 102, "89": 142, "93": 146, "95": 200, "99": 106}}, {"id": 93, "center_px": [1481, 938], "center_uv": [0.723145, 0.67], "pixel_area": 12256, "neighbors": [87, 90, 92, 97, 99, 100], "neighbor_border_px": {"87": 100, "90": 174, "92": 146, "97": 4, "99": 104, "100": 160}}, {"id": 94, "center_px": [1056, 1109], "center_uv": [0.515625, 0.792143], "pixel_area": 12060, "neighbors": [24, 34, 86, 91, 101], "neighbor_border_px": {"24": 186, "34": 62, "86": 108, "91": 132, "101": 140}}, {"id": 95, "center_px": [1623, 807], "center_uv": [0.79248, 0.576429], "pixel_area": 13368, "neighbors": [89, 92, 98, 99, 102, 125], "neighbor_border_px": {"89": 90, "92": 200, "98": 188, "99": 66, "102": 208, "125": 36}}, {"id": 96, "center_px": [1283, 1106], "center_uv": [0.626465, 0.79], "pixel_area": 13752, "neighbors": [88, 91, 97, 101, 103, 105], "neighbor_border_px": {"88": 148, "91": 130, "97": 130, "101": 10, "103": 190, "105": 112}}, {"id": 97, "center_px": [1388, 1067], "center_uv": [0.677734, 0.762143], "pixel_area": 12616, "neighbors": [88, 90, 93, 96, 100, 104, 105], "neighbor_border_px": {"88": 2, "90": 190, "93": 4, "96": 130, "100": 116, "104": 160, "105": 66}}, {"id": 98, "center_px": [1691, 721], "center_uv": [0.825684, 0.515], "pixel_area": 13704, "neighbors": [95, 102, 106, 125, 130, 134, 137], "neighbor_border_px": {"95": 188, "102": 70, "106": 42, "125": 86, "130": 146, "134": 184, "137": 8}}, {"id": 99, "center_px": [1621, 941], "center_uv": [0.791504, 0.672143], "pixel_area": 15188, "neighbors": [92, 93, 95, 100, 102, 107, 108], "neighbor_border_px": {"92": 106, "93": 104, "95": 66, "100": 144, "102": 142, "107": 140, "108": 94}}, {"id": 100, "center_px": [1524, 1038], "center_uv": [0.744141, 0.741429], "pixel_area": 13472, "neighbors": [93, 97, 99, 104, 107, 109], "neighbor_border_px": {"93": 160, "97": 116, "99": 144, "104": 122, "107": 114, "109": 108}}, {"id": 101, "center_px": [1124, 1194], "center_uv": [0.548828, 0.852857], "pixel_area": 13848, "neighbors": [34, 91, 94, 96, 103, 110], "neighbor_border_px": {"34": 148, "91": 122, "94": 140, "96": 10, "103": 184, "110": 116}}, {"id": 102, "center_px": [1722, 870], "center_uv": [0.84082, 0.621429], "pixel_area": 14524, "neighbors": [95, 98, 99, 106, 108], "neighbor_border_px": {"95": 208, "98": 70, "99": 142, "106": 254, "108": 226}}, {"id": 103, "center_px": [1245, 1213], "center_uv": [0.60791, 0.866429], "pixel_area": 12240, "neighbors": [96, 101, 105, 110, 111], "neighbor_border_px": {"96": 190, "101": 184, "105": 96, "110": 144, "111": 130}}, {"id": 104, "center_px": [1467, 1136], "center_uv": [0.716309, 0.811429], "pixel_area": 11228, "neighbors": [97, 100, 105, 109, 112], "neighbor_border_px": {"97": 160, "100": 122, "105": 138, "109": 182, "112": 98}}, {"id": 105, "center_px": [1367, 1188], "center_uv": [0.66748, 0.848571], "pixel_area": 13852, "neighbors": [96, 97, 103, 104, 111, 112], "neighbor_border_px": {"96": 112, "97": 66, "103": 96, "104": 138, "111": 170, "112": 114}}, {"id": 106, "center_px": [1817, 813], "center_uv": [0.887207, 0.580714], "pixel_area": 12056, "neighbors": [98, 102, 108, 134, 142], "neighbor_border_px": {"98": 42, "102": 254, "108": 34, "134": 144, "142": 30}}, {"id": 107, "center_px": [1657, 1057], "center_uv": [0.809082, 0.755], "pixel_area": 14936, "neighbors": [99, 100, 108, 109, 113, 116], "neighbor_border_px": {"99": 140, "100": 114, "108": 190, "109": 132, "113": 166, "116": 50}}, {"id": 108, "center_px": [1763, 979], "center_uv": [0.86084, 0.699286], "pixel_area": 16800, "neighbors": [99, 102, 106, 107, 115, 116], "neighbor_border_px": {"99": 94, "102": 226, "106": 34, "107": 190, "115": 154, "116": 70}}, {"id": 109, "center_px": [1571, 1149], "center_uv": [0.76709, 0.820714], "pixel_area": 12924, "neighbors": [100, 104, 107, 112, 113, 114], "neighbor_border_px": {"100": 108, "104": 182, "107": 132, "112": 82, "113": 66, "114": 158}}, {"id": 110, "center_px": [1176, 1287], "center_uv": [0.574219, 0.919286], "pixel_area": 13428, "neighbors": [34, 101, 103, 111], "neighbor_border_px": {"34": 62, "101": 116, "103": 144, "111": 124}}, {"id": 111, "center_px": [1320, 1293], "center_uv": [0.644531, 0.923571], "pixel_area": 14328, "neighbors": [103, 105, 110, 112], "neighbor_border_px": {"103": 130, "105": 170, "110": 124, "112": 54}}, {"id": 112, "center_px": [1500, 1260], "center_uv": [0.732422, 0.9], "pixel_area": 15140, "neighbors": [104, 105, 109, 111, 114], "neighbor_border_px": {"104": 98, "105": 114, "109": 82, "111": 54, "114": 154}}, {"id": 113, "center_px": [1701, 1165], "center_uv": [0.830566, 0.832143], "pixel_area": 13876, "neighbors": [107, 109, 114, 116], "neighbor_border_px": {"107": 166, "109": 66, "114": 184, "116": 218}}, {"id": 114, "center_px": [1624, 1244], "center_uv": [0.792969, 0.888571], "pixel_area": 12308, "neighbors": [109, 112, 113], "neighbor_border_px": {"109": 158, "112": 154, "113": 184}}, {"id": 115, "center_px": [1884, 1068], "center_uv": [0.919922, 0.762857], "pixel_area": 12984, "neighbors": [108, 116], "neighbor_border_px": {"108": 154, "116": 352}}, {"id": 116, "center_px": [1802, 1127], "center_uv": [0.879883, 0.805], "pixel_area": 14784, "neighbors": [107, 108, 113, 115], "neighbor_border_px": {"107": 50, "108": 70, "113": 218, "115": 352}}, {"id": 117, "center_px": [1122, 558], "center_uv": [0.547852, 0.398571], "pixel_area": 13840, "neighbors": [2, 9, 11, 120, 121, 122], "neighbor_border_px": {"2": 178, "9": 138, "11": 144, "120": 54, "121": 70, "122": 116}}, {"id": 118, "center_px": [1332, 591], "center_uv": [0.650391, 0.422143], "pixel_area": 13360, "neighbors": [8, 11, 84, 119, 120, 123, 124], "neighbor_border_px": {"8": 28, "11": 238, "84": 68, "119": 142, "120": 84, "123": 118, "124": 86}}, {"id": 119, "center_px": [1433, 656], "center_uv": [0.699707, 0.468571], "pixel_area": 11500, "neighbors": [84, 89, 118, 124, 125], "neighbor_border_px": {"84": 164, "89": 118, "118": 142, "124": 136, "125": 96}}, {"id": 120, "center_px": [1248, 500], "center_uv": [0.609375, 0.357143], "pixel_area": 13168, "neighbors": [11, 117, 118, 122, 123, 126], "neighbor_border_px": {"11": 100, "117": 54, "118": 84, "122": 146, "123": 232, "126": 112}}, {"id": 121, "center_px": [1048, 440], "center_uv": [0.511719, 0.314286], "pixel_area": 13100, "neighbors": [9, 50, 57, 63, 117, 122, 127], "neighbor_border_px": {"9": 62, "50": 192, "57": 156, "63": 8, "117": 70, "122": 232, "127": 112}}, {"id": 122, "center_px": [1158, 449], "center_uv": [0.56543, 0.320714], "pixel_area": 11648, "neighbors": [117, 120, 121, 126, 127], "neighbor_border_px": {"117": 116, "120": 146, "121": 232, "126": 110, "127": 104}}, {"id": 123, "center_px": [1365, 479], "center_uv": [0.666504, 0.342143], "pixel_area": 14404, "neighbors": [118, 120, 124, 126, 129, 132], "neighbor_border_px": {"118": 118, "120": 232, "124": 182, "126": 74, "129": 186, "132": 88}}, {"id": 124, "center_px": [1468, 550], "center_uv": [0.716797, 0.392857], "pixel_area": 13584, "neighbors": [118, 119, 123, 125, 128, 129, 131], "neighbor_border_px": {"118": 86, "119": 136, "123": 182, "125": 82, "128": 108, "129": 64, "131": 94}}, {"id": 125, "center_px": [1558, 660], "center_uv": [0.760742, 0.471429], "pixel_area": 13916, "neighbors": [89, 95, 98, 119, 124, 128, 130], "neighbor_border_px": {"89": 182, "95": 36, "98": 86, "119": 96, "124": 82, "128": 126, "130": 88}}, {"id": 126, "center_px": [1275, 387], "center_uv": [0.622559, 0.276429], "pixel_area": 12444, "neighbors": [120, 122, 123, 127, 132, 133], "neighbor_border_px": {"120": 112, "122": 110, "123": 74, "127": 102, "132": 152, "133": 166}}, {"id": 127, "center_px": [1153, 337], "center_uv": [0.562988, 0.240714], "pixel_area": 14064, "neighbors": [63, 121, 122, 126, 133, 141], "neighbor_border_px": {"63": 244, "121": 112, "122": 104, "126": 102, "133": 166, "141": 44}}, {"id": 128, "center_px": [1587, 555], "center_uv": [0.774902, 0.396429], "pixel_area": 12000, "neighbors": [124, 125, 130, 131, 135, 136], "neighbor_border_px": {"124": 108, "125": 126, "130": 164, "131": 130, "135": 106, "136": 2}}, {"id": 129, "center_px": [1459, 414], "center_uv": [0.712402, 0.295714], "pixel_area": 10916, "neighbors": [123, 124, 131, 132, 138], "neighbor_border_px": {"123": 186, "124": 64, "131": 156, "132": 126, "138": 148}}, {"id": 130, "center_px": [1679, 613], "center_uv": [0.819824, 0.437857], "pixel_area": 12200, "neighbors": [98, 125, 128, 136, 137], "neighbor_border_px": {"98": 146, "125": 88, "128": 164, "136": 144, "137": 150}}, {"id": 131, "center_px": [1557, 453], "center_uv": [0.760254, 0.323571], "pixel_area": 12016, "neighbors": [124, 128, 129, 135, 138, 139], "neighbor_border_px": {"124": 94, "128": 130, "129": 156, "135": 94, "138": 54, "139": 104}}, {"id": 132, "center_px": [1375, 336], "center_uv": [0.671387, 0.24], "pixel_area": 14276, "neighbors": [123, 126, 129, 133, 138, 140, 143], "neighbor_border_px": {"123": 88, "126": 152, "129": 126, "133": 122, "138": 82, "140": 136, "143": 30}}, {"id": 133, "center_px": [1251, 274], "center_uv": [0.61084, 0.195714], "pixel_area": 12560, "neighbors": [126, 127, 132, 141, 143], "neighbor_border_px": {"126": 166, "127": 166, "132": 122, "141": 120, "143": 246}}, {"id": 134, "center_px": [1798, 716], "center_uv": [0.87793, 0.511429], "pixel_area": 11476, "neighbors": [98, 106, 137, 142], "neighbor_border_px": {"98": 184, "106": 144, "137": 132, "142": 192}}, {"id": 135, "center_px": [1666, 454], "center_uv": [0.813477, 0.324286], "pixel_area": 12588, "neighbors": [128, 131, 136, 139, 145, 146], "neighbor_border_px": {"128": 106, "131": 94, "136": 160, "139": 136, "145": 64, "146": 92}}, {"id": 136, "center_px": [1747, 523], "center_uv": [0.853027, 0.373571], "pixel_area": 10520, "neighbors": [128, 130, 135, 137, 144, 145], "neighbor_border_px": {"128": 2, "130": 144, "135": 160, "137": 110, "144": 66, "145": 118}}, {"id": 137, "center_px": [1796, 611], "center_uv": [0.876953, 0.436429], "pixel_area": 11592, "neighbors": [98, 130, 134, 136, 142, 144], "neighbor_border_px": {"98": 8, "130": 150, "134": 132, "136": 110, "142": 136, "144": 132}}, {"id": 138, "center_px": [1519, 320], "center_uv": [0.741699, 0.228571], "pixel_area": 14096, "neighbors": [129, 131, 132, 139, 140, 147, 148], "neighbor_border_px": {"129": 148, "131": 54, "132": 82, "139": 120, "140": 84, "147": 100, "148": 100}}, {"id": 139, "center_px": [1624, 356], "center_uv": [0.792969, 0.254286], "pixel_area": 11828, "neighbors": [131, 135, 138, 146, 148, 149], "neighbor_border_px": {"131": 104, "135": 136, "138": 120, "146": 108, "148": 144, "149": 56}}, {"id": 140, "center_px": [1406, 233], "center_uv": [0.686523, 0.166429], "pixel_area": 12648, "neighbors": [132, 138, 143, 147], "neighbor_border_px": {"132": 136, "138": 84, "143": 176, "147": 178}}, {"id": 141, "center_px": [1164, 177], "center_uv": [0.568359, 0.126429], "pixel_area": 14748, "neighbors": [63, 75, 127, 133, 143], "neighbor_border_px": {"63": 136, "75": 180, "127": 44, "133": 120, "143": 130}}, {"id": 142, "center_px": [1899, 687], "center_uv": [0.927246, 0.490714], "pixel_area": 11916, "neighbors": [106, 134, 137, 144], "neighbor_border_px": {"106": 30, "134": 192, "137": 136, "144": 8}}, {"id": 143, "center_px": [1305, 186], "center_uv": [0.637207, 0.132857], "pixel_area": 13472, "neighbors": [132, 133, 140, 141], "neighbor_border_px": {"132": 30, "133": 246, "140": 176, "141": 130}}, {"id": 144, "center_px": [1848, 528], "center_uv": [0.902344, 0.377143], "pixel_area": 9908, "neighbors": [136, 137, 142, 145], "neighbor_border_px": {"136": 66, "137": 132, "142": 8, "145": 90}}, {"id": 145, "center_px": [1807, 441], "center_uv": [0.882324, 0.315], "pixel_area": 10864, "neighbors": [135, 136, 144, 146, 150], "neighbor_border_px": {"135": 64, "136": 118, "144": 90, "146": 146, "150": 134}}, {"id": 146, "center_px": [1745, 356], "center_uv": [0.852051, 0.254286], "pixel_area": 11208, "neighbors": [135, 139, 145, 149, 150], "neighbor_border_px": {"135": 92, "139": 108, "145": 146, "149": 174, "150": 148}}, {"id": 147, "center_px": [1515, 206], "center_uv": [0.739746, 0.147143], "pixel_area": 12324, "neighbors": [138, 140, 148], "neighbor_border_px": {"138": 100, "140": 178, "148": 136}}, {"id": 148, "center_px": [1621, 250], "center_uv": [0.791504, 0.178571], "pixel_area": 11780, "neighbors": [138, 139, 147, 149], "neighbor_border_px": {"138": 100, "139": 144, "147": 136, "149": 142}}, {"id": 149, "center_px": [1724, 262], "center_uv": [0.841797, 0.187143], "pixel_area": 10684, "neighbors": [139, 146, 148], "neighbor_border_px": {"139": 56, "146": 174, "148": 142}}, {"id": 150, "center_px": [1872, 351], "center_uv": [0.914063, 0.250714], "pixel_area": 13084, "neighbors": [145, 146], "neighbor_border_px": {"145": 134, "146": 148}}] | ||
| sea_id | removed | 0 | ||
| width | removed | 2048 |
Code 625 changes in 231 classes
Minified client code with short names blanked for diffing. Class names are real.
- FishingAssets 17277
- EventHubPopup 481
- RankingDataManager 451
- PvpHpGauge 376
- FireRealmIntro 352
- BlurFilter 271
- EventScheduleDayCell 242
- ShortcutManager 228
- FireStormFx 215
- MiniAscentShopItemRenderer 214
- TournamentRewardItemRenderer 210
- SoundOptionButton 210
- PVP2BattleController 182
- HeroMassiveBuyResultPopup 176
- RealmTransitionFx 174
- MeshGpuData 138
- TimeOfDayManager 138
- BannerImage 118
- MeshPlane 109
- PVPResultPopup 91
- BattleController 78
- EventDataManager 77
- MailVO 72
- ShopProductResultPopup 71
- TowerEventRewardItemRenderer 63
- RankBadge 59
- BaseMap 53
- FireDebuffIcon 43
- TowerBattleController 42
- PVPOpponentItemRenderer 40
- PVP2ReadyPopup 40
- CoachOverlay 37
- FireDebuffPopup 36
- TopMenu 36
- MiniAscentFlow 35
- RightMenu 34
- IntroProgressBar 34
- EmberRat1 33
- InAppPurchaseManager 31
- BottomMenu 31
- FavoritePetCell 29
- RankingItemRenderer 28
- CommonOrangeButton 27
- ViewUtil 26
- IntroView 26
- BackgroundLayer 24
- FireBird1 21
- HeroHireSubMenu 21
- BaseCastle 20
- TowerItemRenderer 20
- CastleDetailPopup 19
- WaveBar 19
- MiniAscentDataManager 19
- BaseUnit 18
- WingKnight1 17
- PVPBattleSubView 17
- URLManager 16
- MissionGuideController 15
- RankingProfile 15
- StringUtils 14
- SpriteQuitPopup 14
- SUN 13
- AttendanceReceiveButton 13
- LanguageChangePopup 13
- UserService 12
- HeroResetEventPopup 12
- CardEventRankingItemRenderer 12
- MiniAscentShell 12
- MiniGameRankingItemRenderer 12
- GameSpeedBuffPopup 11
- PVPBattleStatus 10
- Un 9
- TowerSubMenu 9
- GameLayer 8
- HealthBar 8
- PVPRankItemRenderer 8
- BattleItemRenderer 8
- GuildWarRankingItemRenderer 8
- GameOverPopup 8
- MiniAscentRelicsPage 8
- MiniAscentCardPickPopup 8
- RankingUserTeamPopup 7
- GuideBubble 6
- GuildWarMainView 6
- GuildWarBattlePopupV3 6
- GpuGraphicsContext 5
- BatchableSprite 5
- ListOld 5
- HeroSubMenu 5
- HeroView 5
- HeroBookItemRenderer 5
- TreasureInventorySubMenu 5
- DailyRankingItemRenderer 5
- DialogueLayer 5
- CastleSubMenu 5
- QuestProgress 5
- Circle 4
- WorkerManagerClass 4
- FilterData 4
- HeroService 4
- IconOnlyButton 4
- GuildRaidMemberDailyItemRenderer 4
- GuildRaidRecordUserItemRenderer 4
- Archery2GameScene 4
- MiniAscentResultPopup 4
- MiniAscentLobbyPopup 4
- PassRewardManager 3
- NiceSliceBtnBgs 3
- EventVO 3
- ActiveSkillMain 3
- Client 3
- Or 3
- SHA256 3
- SuiProvider 3
- WalletPopup 3
- TransTicketManager 3
- SpriteBattleController 3
- BottomMenus 3
- MiniAscentAssets 3
- MiniAscentDeployPopup 3
- TilingSpriteShader 2
- RenderTargetSystem 2
- CanvasRenderer 2
- WebGLRenderer 2
- WebGPURenderer 2
- UnitDataManager 2
- ConfigManager 2
- BasePopup 2
- BasePopup2 2
- SafeAreaTopContent 2
- DayNightFx 2
- GreenEagle1 2
- FireSpirit1 2
- RewardItem 2
- Err 2
- Dr 2
- BasePopup3 2
- HelpDetailPopup 2
- HeroHireSubView 2
- PVPBattleController 2
- GuildRaidBookVO 2
- PVPBattlePopup 2
- MailDetailPopup 2
- MailPopup 2
- GuildWarTournament2Popup 2
- AttendancePopup 2
- GuildBarrackRowItemRenderer 2
- GuildWarBattleReadyPopup 2
- GuildWarSquadsPopup 2
- GuildWarTierAssignPopup 2
- MiniAscentBattleController 2
- MiniAscentCorpsPanel 2
- MiniAscentCorpsPage 2
- MiniAscentRoutePopup 2
- MiniAscentChapterRewardItem 2
- ObservablePoint 1
- CacheClass 1
- SystemRunner 1
- ApplicationInitHook 1
- Geometry 1
- DefaultShader 1
- AssetsClass 1
- WorkerInstance 1
- DOMPipe 1
- PassthroughFilter 1
- BatchableMesh 1
- BitmapFontManagerClass 1
- HTMLTextStyle 1
- RenderTexture 1
- GlobalUniformSystem 1
- GlGeometryGpuData 1
- GlColorMaskSystem 1
- GlUboSystem 1
- NineSliceSpriteGpuData 1
- FrameLoopManager 1
- VersionManager 1
- PetDataManager 1
- RequestManager 1
- GameSpeedMode 1
- AutoTogglePill 1
- BattleAutoController 1
- UnitFactory 1
- ToolTipBase 1
- Sr 1
- Fr 1
- Ma 1
- El 1
- Yp 1
- SuiStandardProvider 1
- AppReadyEvent 1
- SolProvider 1
- OkxwalletInjectConnector 1
- TcRootElement 1
- WalletSelectPopup 1
- CheckBox 1
- LoginButton 1
- MissionGuideDataManager 1
- AttackEffectManager 1
- BaseBattleController 1
- WaveCallInfo 1
- BuffStatusPopup 1
- FavoritePetSubView 1
- MineMain 1
- TreasureSubView 1
- GuildBarracksRaceView 1
- GuildCheckBox 1
- GuildMainSubView 1
- GuildRaidBattleReadyPopup 1
- GuildWarActiveItemRenderer 1
- GuildWarHistoryItemRenderer 1
- GameAccountSelectPopup3 1
- TransitionView 1
- NpcDialogueToast 1
- CitadelBuildingDetailPopup 1
- GuildWarCombatLogItemRenderer 1
- GuildWarMemberStatusItemRenderer 1
- GuildWarTargetMarkerItemRenderer 1
- ServerRejected 1
- MiniAscentBattleProgress 1
- ConquestDataManager 1
- OfflinePopup 1
- Delay 1
- NetworkTimeout 1
- RecaptchaVerifier 1
- BrowserPopupRedirectResolver 1
- MiniAscentCardsPage 1
- MiniAscentCrystalRowRenderer 1
- MiniAscentCrystalsPage 1
- MiniAscentTextButton 1
- MiniAscentCrystalRewardPopup 1
- MiniAscentModeSwitch 1
FishingAssets 1 hunks, 17277 statements
+ )),qEi=[[72,4,138],[49,4,170],[39,4,170],[35,4,168],[45,4,170],[60,4,154],[43,8,170],[54,4,170],[40,4,170],[26,5,170],[41,4,170],[35,4,170],[45,4,170],[39,5,170],[42,4,162],[43,4,170],[46,4,170],[39,4,170],[35,4,170],[50,4,170],[39,4,170],[44,4,170],[41,4,170],[44,4,170],[60,4,142],[44,4,166],[53,5,170],[43,4,170],[48,4,170],[27,4,163],[44,4,170],[51,4,170],[17,10,170],[36,5,170],[44,4,170],[50,4,170],[38,4,170],[56,5,162],[44,24,170],[35,5,170],[47,5,170],[50,4,170],[53,4,164],[49,5,170],[50,7,170],[43,5,170],[52,5,149],[39,4,170]],XEi=236/256,JEi="boat_gear.webp",QEi="gear_chest.webp",ZEi="boat_big.webp",tAi="area_stamp.webp",iAi="gear_backgrounds/",sAi=192,eAi=class{ + static ensure(){ + return this.sheet&&this.topInfo?Promise.resolve():(this.pending??(this.pending=Promise.all([this.sheet?Promise.resolve():this.load(),this.ensureTopdown()]).then(()=>{ + } + ).finally(()=>{ + this.pending=null} + )),this.pending)} + static async load(){ + const t=`?v=${ + SS.appVersion} + &atlas=20260929-fish-256-v1`,i=await fetch(CS.getAssetPath(`UI_FISH.json${ + t} + `)); + if(!i.ok)throw new Error(`UI_FISH: HTTP ${ + i.status} + `); + const s=await i.json(),e=await fd.load({ + src:CS.getAssetPath(`UI_FISH.webp${ + t} + `),parser:"loadTextures"} + ),n=new Vn(e,s); + await n.parse(),this.sheet=n} + static async loadGiantSpines(){ + if(this.giantSpine.whale)return; + const t="fishing_giant_whale_skel",i="fishing_giant_whale_atlas"; + try{ + fd.cache.has(t)||fd.add({ + alias:t,src:CS.getAssetPath("fishing/topdown/spine/giant_whale.json")} + ),fd.cache.has(i)||fd.add({ + alias:i,src:this.topPath("spine/giant_whale.atlas")} + ),await fd.load([t,i]),this.giantSpine.whale={ + skeleton:t,atlas:i} + } + catch(ort){ + } + } + static topPath(t){ + const i=t.startsWith(iAi)?"20261008-gear-background-v1":"giants.json"===t||"spine/giant_whale.atlas"===t?"20261004-giants-v1":t===JEi?"20261007-boat-gear-v1":t===QEi?"20261008-gear-chest-v1":t===ZEi?"20261008-boat-big-v1":t===tAi?"20261008-area-stamp-v1":"20261001-topdown-v25"; + return CS.getAssetPath(`fishing/topdown/${ + t} + ?v=${ + SS.appVersion} + &art=${ + i} + `)} + static async ensureTopdown(){ + if(this.topInfo)return; + const t=await fetch(this.topPath("maps.json"),{ + cache:"no-store"} + ); + if(!t.ok)throw new Error(`topdown maps: HTTP ${ + t.status} + `); + const i=await t.json(),s=await fetch(this.topPath("terrain.json"),{ + cache:"no-store"} + ); + if(!s.ok)throw new Error(`topdown terrain: HTTP ${ + s.status} + `); + this.terrainInfo=await s.json(); + const e=await fetch(this.topPath("world.json"),{ + cache:"no-store"} + ); + if(!e.ok)throw new Error(`topdown world: HTTP ${ + e.status} + `); + this.worldInfo=await e.json(); + const n={ + autoGenerateMipmaps:!0} + ,[h,[r,o,a,c,l,u,d,f,p,g,w,m,v,_,M,b,y,E,A]]=await Promise.all([fd.load(this.topPath("giants.json")),Promise.all([["boat_0.png",n],["boat_1.png",n],["boat_2.png",n],["boat_3.png",n],["boat_4.png",n],["boat_5.png",n],["shadow.png"],["water_caustic.png"],["water_blotch.png"],["floats.webp",n],["angler.webp",n],["lanterns.png",n],["npc_boats.webp",n],["guests.webp",n],["guest_heads.webp",n],["bubbles.webp",n],["times.png",n],["journey_npcs.webp",n],["glints.png",n]].map(([t,i])=>fd.load({ + src:this.topPath(t),parser:"loadTextures",...i?{ + data:i} + :{ + } + } + )))]),S=Qt(t=>({ + sharp:h.textures[t],deep:h.textures[t]} + ),"giant"),T=await fetch(this.topPath("gear.json"),{ + cache:"no-store"} + ); + if(!T.ok)throw new Error(`topdown gear: HTTP ${ + T.status} + `); + const C=Qt((t,i)=>Array.from({ + length:i} + ,(i,s)=>new as({ + source:t.source,frame:new Ui(s*t.height,0,t.height,t.height)} + )),"strip"),O=Qt(t=>qEi.map(([i,s,e],n)=>new as({ + source:t.source,frame:new Ui(n%Math.floor(t.width/256)*256+i,256*Math.floor(n/Math.floor(t.width/256))+s,e,e)} + )),"faces"),I=Qt((t,i)=>Array.from({ + length:Math.floor(t.width/i)*Math.floor(t.height/i)} + ,(s,e)=>new as({ + source:t.source,frame:new Ui(e%Math.floor(t.width/i)*i,Math.floor(e/Math.floor(t.width/i))*i,i,i)} + )),"grid"); + this.gearArt={ + floats:C(g,4),angler:C(w,2),lanterns:C(m,3),npcBoats:C(v,3),guests:C(_,3),guestHeads:C(M,3),bubbles:C(b,3),times:C(y,4),journeyNpcs:I(E,256),journeyFaces:O(E),glints:C(A,12),giants:{ + whale:S("whale"),shark:S("shark"),manta:S("manta"),catfish:S("catfish"),eel:S("eel")} + ,info:await T.json()} + ,await this.loadGiantSpines(),this.boatGearTex=await fd.load({ + src:this.topPath(JEi),parser:"loadTextures",data:n} + ).catch(()=>null),this.gearChestTex=await fd.load({ + src:this.topPath(QEi),parser:"loadTextures",data:n} + ).catch(()=>null),this.boatBigTex=await fd.load({ + src:this.topPath(ZEi),parser:"loadTextures",data:n} + ).catch(()=>null),this.areaStampTex=await fd.load({ + src:this.topPath(tAi),parser:"loadTextures",data:n} + ).catch(()=>null),this.gearBackgrounds=await Promise.all(Array.from({ + length:7} + ,(t,i)=>fd.load({ + src:this.topPath(`${ + iAi} + star_${ + i+1} + .webp`),parser:"loadTextures",data:n} + ).catch(()=>null))),this.toolTex=await fd.load({ + src:this.topPath("tools_v3/atlas.webp"),parser:"loadTextures",data:n} + ).catch(()=>null),this.topBoats=[r,o,a,c,l,u],this.topShadow=d; + for(const N of[f,p])N.source.addressMode="repeat"; + this.waterTex={ + caustic:f,blotch:p} + ; + const[k,R]=await Promise.all(["foam.png","wake_strip.png"].map(t=>fd.load({ + src:this.topPath(t),parser:"loadTextures",data:{ + autoGenerateMipmaps:!0} + } + ))),x=k.width/4,P=[]; + for(let N=0; + N<16; + N++)P.push(new as({ + source:k.source,frame:new Ui(N%4*x,Math.floor(N/4)*x,x,x)} + )); + R.source.addressMode="repeat",this.foamTex={ + puffs:P.slice(0,8),crowns:P.slice(8,12),churn:P.slice(12,16),wake:R} + ,this.topInfo=i} + static topdownInfo(t){ + var i; + const s=null==(i=this.topInfo)?void 0:i[t]; + if(!s)throw new Error(`topdown map not ready: ${ + t} + `); + return s} + static topdownMap(t){ + let i=this.topMaps.get(t); + return i||(i=fd.load({ + src:this.topPath(this.topdownInfo(t).file),parser:"loadTextures"} + ),this.topMaps.set(t,i)),i} + static topdownChunk(t,i,s){ + return fd.load({ + src:this.topPath(`${ + this.topdownInfo(t).file} + ${ + i} + _${ + s} + .webp`),parser:"loadTextures"} + )} + static unloadChunk(t,i,s){ + fd.unload(this.topPath(`${ + this.topdownInfo(t).file} + ${ + i} + _${ + s} + .webp`))} + static terrainLand(t){ + var i,s; + return(null==(s=null==(i=this.terrainInfo)?void 0:i.races[t])?void 0:s.land)??null} + static world(){ + if(!this.worldInfo)throw new Error("topdown not ready"); + return this.worldInfo} + static worldMap(){ + return this.worldTex??(this.worldTex=fd.load({ + src:this.topPath("world_map.webp"),parser:"loadTextures",data:{ + autoGenerateMipmaps:!0} + } + )),this.worldTex} + static terrain(t){ + let i=this.terrains.get(t); + if(!i){ + const s=this.terrainInfo,e=null==s?void 0:s.races[t]; + if(!s||!e)throw new Error(`terrain not ready: ${ + t} + `); + i=fd.load({ + src:this.topPath(e.file),parser:"loadTextures"} + ).then(t=>{ + const i=Qt((i,e)=>new as({ + source:t.source,frame:new Ui(i.x+e%i.cols*i.pitch+s.pad,i.y+Math.floor(e/i.cols)*i.pitch+s.pad,i.size,i.size)} + ),"cut"),n=Qt(t=>e[t].map((e,n)=>({ + tex:i(s.layout[t],n),w:e.w,h:e.h} + )),"props"),h=Qt(t=>t[0]<<16|t[1]<<8|t[2],"rgb"); + return{ + terrain:Array.from({ + length:240} + ,(t,e)=>i(s.layout.terrain,e)),small:n("small"),large:n("large"),landmarks:n("landmarks"),sand:h(e.sand),wet:h(e.wet),land:e.land} + } + ),this.terrains.set(t,i)} + return i} + static water(){ + if(!this.waterTex)throw new Error("topdown not ready"); + return this.waterTex} + static toolIcon(t,i){ + var s; + const e="auto"===t?i-1:i; + if(!Number.isInteger(e)||e<0||e>=7)return null; + if("bobber"===t&&i<4)return(null==(s=this.gearArt)?void 0:s.floats[i])??null; + const n=["line","rod","reel","bobber","icebox","auto"].indexOf(t); + if(!this.toolTex||n<0)return null; + const h=`${ + t} + _${ + i} + `; + let r=this.toolCells.get(h); + return r||(r=new as({ + source:this.toolTex.source,frame:new Ui(256*e,256*n,256,256)} + ),this.toolCells.set(h,r)),r} + static gearBackground(t){ + return this.gearBackgrounds[Math.max(1,Math.min(7,t))-1]??null} + static boatBig(t){ + const i=this.boatBigTex; + if(!i)return this.boat(t); + if(!this.boatBigCells.length){ + const t=i.width/3; + this.boatBigCells=Array.from({ + length:6} + ,(s,e)=>new as({ + source:i.source,frame:new Ui(e%3*t,Math.floor(e/3)*t,t,t)} + ))} + return this.boatBigCells[this.boatArt(t)]} + static areaStamp(t){ + const i=this.areaStampTex; + if(!i)return null; + if(!this.areaStampCells.length){ + const t=i.height; + this.areaStampCells=Array.from({ + length:6} + ,(s,e)=>new as({ + source:i.source,frame:new Ui(e*t,0,t,t)} + ))} + return this.areaStampCells["mini"===t?5:Math.max(1,Math.min(5,Math.round(t)))-1]} + static gearChest(t){ + const i=this.gearChestTex; + if(!i)return null; + if(!this.gearChestCells.length){ + const t=i.height; + this.gearChestCells=[0,1].map(s=>new as({ + source:i.source,frame:new Ui(s*t,0,t,t)} + ))} + return this.gearChestCells[t?1:0]} + static boatGearIcon(t,i){ + const s=this.boatGearTex; + if(!s)return null; + const e=6*t+i; + let n=this.boatGearCells.get(e); + return n||(n=new as({ + source:s.source,frame:new Ui(i*sAi,t*sAi,sAi,sAi)} + ),this.boatGearCells.set(e,n)),n} + static gear(){ + if(!this.gearArt)throw new Error("topdown not ready"); + return this.gearArt} + static foam(){ + if(!this.foamTex)throw new Error("topdown not ready"); + return this.foamTex} + static boatArt(t){ + return[0,1,2,3,4,5,5][Math.max(0,Math.min(6,t))]} + static boat(t){ + return this.topBoats[Math.max(0,Math.min(this.topBoats.length-1,this.boatArt(t)))]} + static shadow(){ + if(!this.topShadow)throw new Error("topdown not ready"); + return this.topShadow} + static fish(t){ + var i; + const s=null==(i=this.sheet)?void 0:i.textures[`fish_${ + String(t).padStart(3,"0")} + `]; + if(!s)throw new Error(`UI_FISH not ready: ${ + t} + `); + return s} + } + ; + Qt(eAi,"FishingAssets"),Zt(eAi,"sheet",null),Zt(eAi,"pending",null),Zt(eAi,"topInfo",null),Zt(eAi,"topBoats",[]),Zt(eAi,"topShadow",null),Zt(eAi,"topMaps",new Map),Zt(eAi,"giantSpine",{ + whale:null} + ),Zt(eAi,"terrainInfo",null),Zt(eAi,"worldInfo",null),Zt(eAi,"worldTex",null),Zt(eAi,"terrains",new Map),Zt(eAi,"waterTex",null),Zt(eAi,"boatGearTex",null),Zt(eAi,"toolTex",null),Zt(eAi,"toolCells",new Map),Zt(eAi,"gearBackgrounds",[]),Zt(eAi,"gearChestTex",null),Zt(eAi,"boatBigTex",null),Zt(eAi,"boatBigCells",[]),Zt(eAi,"areaStampTex",null),Zt(eAi,"areaStampCells",[]),Zt(eAi,"gearChestCells",[]),Zt(eAi,"boatGearCells",new Map),Zt(eAi,"gearArt",null),Zt(eAi,"foamTex",null); + let nAi=eAi; + const hAi={ + "인간|강":["은빛강 상류","버들 샛강","조약돌 너른 못","들꽃 실개천","햇살 굽이","노을 소","물레방아 물길","은빛 샛강","은빛강 하류"],"인간|연안":["은빛강 어귀","갈매기 앞바다","소금 석호","조개 너른 만","노을 포구","파도 섬 사이","모래 난바다","돛단배 물길","등대 모래톱"],"인간|대양":["햇살 먼바다","갈매기 군도","파도 물길","고래 섬 사이","산호 난바다","푸른 해류","돌고래 암초","폭풍 한바다","햇살 군도"],"엘프|강":["이끼강 상류","고사리 너른 못","반딧불 굽이","이슬 샛강","꽃잎 실개천","버섯 물길","버들 여울","달빛 샛강","이끼강 하류"],"엘프|연안":["이끼강 어귀","해초 석호","진주 물길","조개 포구","물새 앞바다","이슬 너른 만","달빛 섬 사이","꽃잎 난바다","연꽃 모래톱"],"엘프|대양":["잎새 먼바다","해초 군도","진주 난바다","고래 한바다","산호 섬 사이","초록 암초","달빛 군도","바람 물길","고래 먼바다"],"언데드|강":["잿빛강 상류","마른 갈대 굽이","달그림자 샛강","가시 너른 못","녹슨 실개천","부엉이 소","검은 물길","잿빛 샛강","잿빛강 하류"],"언데드|연안":["잿빛강 어귀","안개 석호","해골 포구","녹슨 닻 섬 사이","뼈 앞바다","달그림자 석호","검은 물길","유령 너른 만","난파선 모래톱"],"언데드|대양":["망령 먼바다","안개 군도","난파선 난바다","검은 섬 사이","해골 암초","폭풍 군도","달그림자 물길","유령 섬 사이","망령 한바다"],"오크|강":["서리강 상류","얼음 샛강","눈보라 너른 못","늑대 실개천","북풍 물길","흰 소","바위 샛강","얼음꽃 웅덩이","서리강 하류"],"오크|연안":["서리강 어귀","고래뼈 석호","얼음 포구","북풍 앞바다","바위 물길","서리 너른 만","유빙 섬 사이","약탈선 석호","물개 포구"],"오크|대양":["고래 먼바다","유빙 난바다","폭풍 한바다","얼음 물길","북풍 군도","서리 해류","바다표범 섬 사이","흰 암초","고래 군도"]} + ,rAi=5e3,oAi=[1,1.15,1.3,1.4,1.5]; + function aAi(t){ + let i=2654435769^t; + return i=Math.imul(i^i>>>16,2246822507),i=Math.imul(i^i>>>13,3266489909),(i^i>>>16)>>>0} + function cAi(t,i,s,e=1){ + const n=aAi(Math.imul(t,7919)+Math.imul(i+1,104729))/4294967296; + return Math.max(200,Math.round((15e3+15e3*n)/oAi[s]/Math.max(1,e)))} + function lAi(t){ + return Math.max(2,5-t)} + function uAi(t,i,s=1){ + t.k++,t.nextAt+=cAi(t.seed,t.k,i,s)} + function dAi(t,i,s,e){ + uAi(t,i,s),e&&(t.nextAt+=3500)} + function fAi(t,i,s,e,n=[]){ + const h={ + ...t} + ; + for(; + h.k<i; + )dAi(h,s,e,n.includes(h.k)); + return h.nextAt} + Qt(aAi,"hash32$1"),Qt(cAi,"biteGap"),Qt(lAi,"idleOffNeed"),Qt(uAi,"advanceSeq"),Qt(dAi,"nextBite"),Qt(fAi,"biteAt"); + const pAi=["prow","compass","deck","anchor","toolbox","sail","lantern"],gAi=["luck","hp","armor","repair","speed","aim","power","steal","icebox","big","star","protect"],wAi={ + luck:[3,6,10,15,21,28,36],hp:[10,20,35,55,80,110,150],armor:[1,2,4,6,9,12,16],repair:[4,8,12,17,23,30,38],speed:[3,6,9,13,17,22,28],aim:[5,10,16,23,31,40,50],power:[5,10,16,23,31,40,50],steal:[3,6,9,13,17,22,28],icebox:[4,8,12,18,24,32,40],big:[4,8,13,19,26,34,43],star:[4,8,13,19,26,34,43],protect:[5,10,15,20,30,40,60]} + ,mAi={ + repair:60,steal:50,big:90,protect:120} + ,vAi={ + luck:{ + name:"행운력",unit:"%"} + ,hp:{ + name:"내구도",unit:""} + ,armor:{ + name:"재난 피해 감소",unit:""} + ,repair:{ + name:"수리 시간",unit:"%↓"} + ,speed:{ + name:"배 속도",unit:"%"} + ,aim:{ + name:"작살 조준력",unit:"%"} + ,power:{ + name:"작살 공격력",unit:"%"} + ,steal:{ + name:"훔치는 시간",unit:"%↓"} + ,icebox:{ + name:"어망",unit:"마리"} + ,big:{ + name:"대물 확률",unit:"%"} + ,star:{ + name:"별 확률",unit:"%"} + ,protect:{ + name:"털림 보호",unit:"분"} + } + ; + function _Ai(t){ + switch(t){ + case"luck":return"귀한 물고기와 큰 물고기가 둘 다 조금씩 더 잘 잡혀요"; + case"star":return"별이 많은 귀한 물고기(★3 이상)가 더 자주 잡혀요"; + case"big":return"더 크고 무거운 물고기가 잘 잡혀요. 특대·왕도 더 자주 나와요"; + case"hp":return"배가 더 튼튼해져서 쉽게 부서지지 않아요"; + case"armor":return"재난을 맞거나 먼 바다로 나갈 때 배가 덜 상해요"; + case"repair":return"부서진 배를 더 빨리 고쳐요"; + case"speed":return"배가 더 빨리 움직여요"; + case"aim":return"몬스터에게 작살을 던질 때 더 잘 맞아요"; + case"power":return"작살로 몬스터에게 주는 피해가 커져요"; + case"steal":return"다른 사람 어망에서 물고기를 더 빨리 훔쳐요"; + case"icebox":return"어망에 물고기를 더 많이 담을 수 있어요"; + case"protect":return"털린 뒤 다시 털리지 않는 시간이 길어져요"} + } + Qt(_Ai,"statHelp"); + const MAi={ + prow:"luck",compass:"aim",deck:"hp",anchor:"steal",toolbox:"repair",sail:"speed",lantern:"icebox"} + ,bAi={ + prow:[["사자 선수상","hp","armor"],["인어 선수상","big","aim"],["용 선수상","star","power"],["독수리 선수상","aim","speed"],["고래 선수상","icebox","hp"]],compass:[["놋쇠 나침반","speed","steal"],["별자리 나침반","power","star"],["심해 나침반","luck","big"],["드워프 나침반","repair","armor"],["요정 나침반","big","luck"]],deck:[["참나무 갑판","repair","armor"],["철판 갑판","armor","repair"],["고래뼈 갑판","icebox","luck"],["흑단 갑판","protect","steal"],["산호 갑판","luck","big"]],anchor:[["갈고리 닻","luck","icebox"],["무쇠 닻","protect","hp"],["해골 닻","armor","repair"],["쌍갈래 닻","speed","aim"],["룬 닻","power","star"]],toolbox:[["목수 공구함","hp","luck"],["드워프 공구함","armor","hp"],["마법 공구함","speed","aim"],["선장 공구함","protect","steal"],["장인 공구함","icebox","power"]],sail:[["삼베 돛","armor","repair"],["비단 돛","luck","big"],["폭풍 돛","steal","power"],["별빛 돛","aim","star"],["가죽 돛","hp","protect"]],lantern:[["반딧불 등불","big","star"],["등대 등불","aim","speed"],["도깨비불 등불","power","steal"],["달빛 등불","luck","hp"],["촛불 등불","repair","armor"]]} + ,yAi=pAi.flatMap((t,i)=>bAi[t].map(([s,e,n],h)=>({ + id:10*(i+1)+h+1,slot:t,v:h,name:s,stats:[MAi[t],e,n]} + ))),EAi=new Map(yAi.map(t=>[t.id,t])),AAi=Qt(t=>EAi.get(t),"gearDef"),SAi={ + prow:"선수상",compass:"나침반",deck:"갑판",anchor:"닻",toolbox:"공구함",sail:"돛",lantern:"등불"} + ,TAi=[[1,.7],[2,.22],[3,.07],[4,.01]],CAi=Qt(t=>Math.max(1,Math.min(7,t+1)),"equipCap"); + function OAi(t,i){ + const s=AAi(t); + if(!s)return{ + } + ; + const e=Math.max(1,Math.min(7,i))-1,n={ + } + ,h=Qt((t,i)=>{ + n[t]=Math.round(10*((n[t]??0)+wAi[t][e]*i))/10} + ,"add"); + return h(s.stats[0],1),h(s.stats[1],.6),i>=5&&h(s.stats[2],.6),n} + Qt(OAi,"itemStats"); + const IAi=Qt(()=>Object.fromEntries(gAi.map(t=>[t,0])),"zeroStats"); + function kAi(t){ + const i=IAi(),s=t.gearBox; + if(!s)return i; + const e=CAi(t.gear.boat); + for(const n of Object.values(s.equipped)){ + const t=s.items.find(t=>t.uid===n); + if(t)for(const[s,n]of Object.entries(OAi(t.id,Math.min(e,t.star))))i[s]+=n} + for(const[n,h]of Object.entries(mAi))i[n]=Math.min(h,i[n]); + for(const n of gAi)i[n]=Math.round(10*i[n])/10; + return i} + function RAi(t,i,s){ + return t.items.filter(t=>{ + var e; + return t.star<=s&&(null==(e=AAi(t.id))?void 0:e.slot)===i} + ).sort((t,i)=>i.star-t.star||t.uid-i.uid)[0]} + function xAi(t,i,s){ + if(!t)return; + const e=RAi(t,i,s); + if(!e)return; + const n=t.items.find(s=>s.uid===t.equipped[i]); + return!n||n.star>s||e.star>n.star?e:void 0} + function PAi(t){ + if(!t)return[]; + const i=new Set([...Object.values(t.equipped),...t.kept??[]]),s=new Map; + for(const e of t.items){ + const t=AAi(e.id); + if(!t||i.has(e.uid)||e.star>=7)continue; + const n=`${ + t.slot} + |${ + e.star} + `; + s.set(n,(s.get(n)??0)+1)} + return[...s.entries()].filter(([,t])=>t>=3).map(([t,i])=>({ + slot:t.split("|")[0],star:Number(t.split("|")[1]),n:i} + ))} + function NAi(t){ + if(!t)return[]; + const i=new Set(Object.values(t.equipped)),s=new Map; + for(const e of t.items){ + const t=AAi(e.id); + if(!t||i.has(e.uid)||e.star>=7)continue; + const n=`${ + t.slot} + |${ + e.star} + `; + s.set(n,[...s.get(n)??[],e])} + return[...s.entries()].filter(([,t])=>t.length>=3).map(([t,i])=>({ + slot:t.split("|")[0],star:Number(t.split("|")[1]),list:i.sort((t,i)=>t.uid-i.uid)} + )).sort((t,i)=>t.star-i.star||pAi.indexOf(t.slot)-pAi.indexOf(i.slot))} + Qt(kAi,"gearStats"),Qt(RAi,"bestGear"),Qt(xAi,"betterGear"),Qt(PAi,"mergeable"),Qt(NAi,"mergeGroups"); + const LAi=[3032396,10135467,6142819,4886754,10513640,15901498,16734815,16769126],DAi={ + LEVELS:7,MAX_HP:[100,140,190,250,320,400,500],ARMOR:[0,5,11,18,26,35,45],REPAIR_MIN:[1,3,6,12,20,32,45],ZONE_REPAIR_ADD_MIN:{ + R:0,C:10,O:20} + ,MOVE_MIN:20,ENTRY:{ + R:0,C:2,O:4} + ,TRAVEL:{ + R:4,C:16,O:36} + ,HAZARD_MS:3e5,HELP_PCT:.03,HELP_MAX:10,HELP_MS:36e5,HELP_RANGE:380} + ,GAi=["인간|R","오크|R","엘프|R","언데드|R","인간|C","오크|C","엘프|C","언데드|C","인간|O","오크|O","엘프|O","언데드|O"],BAi=[1,1.08,1.16,1.24],UAi=[0,0,0,0,3,3,3,4,5,5,6,6],FAi=Qt((t,i)=>GAi.indexOf(`${ + t} + |${ + i} + `)+1,"regionTier"),$Ai={ + R:[{ + key:"gust",text:"돌풍이 불어서",dmg:4,w:4} + ,{ + key:"rapid",text:"급류에 휩쓸려",dmg:9,w:3} + ,{ + key:"rock",text:"바위에 긁혀서",dmg:7,w:2} + ],C:[{ + key:"gust",text:"돌풍이 불어서",dmg:14,w:3} + ,{ + key:"wave",text:"거센 파도로",dmg:34,w:3} + ,{ + key:"reef",text:"암초에 부딪혀",dmg:28,w:2} + ],O:[{ + key:"swell",text:"큰 너울에",dmg:42,w:3} + ,{ + key:"storm",text:"폭풍이 몰아쳐",dmg:59,w:2} + ,{ + key:"thunder",text:"번개를 맞아",dmg:51,w:1} + ,{ + key:"monster",text:"몬스터의 물살로",dmg:46,w:2} + ]} + ,HAi={ + "인간":{ + key:"log",text:"떠내려온 통나무에 부딪혀"} + ,"엘프":{ + key:"vine",text:"가시 덩굴에 걸려"} + ,"언데드":{ + key:"ghost",text:"망령의 손길에"} + ,"오크":{ + key:"ice",text:"얼음 덩어리에 부딪혀"} + } + ,WAi={ + R:11,C:30,O:55} + ; + function VAi(t,i){ + const s=BAi[(FAi(t,i)-1)%4]; + return[...$Ai[i],{ + ...HAi[t],dmg:WAi[i],w:1} + ].map(t=>({ + ...t,dmg:Math.round(t.dmg*s)} + ))} + Qt(VAi,"hazardsOf"); + const jAi=Qt(t=>.35+.03*(t-1),"hazardChance"); + function KAi(t,i,s){ + const e=FAi(t,i),n=aAi(104729*e+7919*s); + if(n%1e3>=1e3*jAi(e))return null; + const h=VAi(t,i),r=h.reduce((t,i)=>t+i.w,0); + let o=aAi(n+17)%r,a=h[0]; + for(const c of h){ + if(o<c.w){ + a=c; + break} + o-=c.w} + return{ + k:s,at:s*DAi.HAZARD_MS+2e4+aAi(n+31)%(DAi.HAZARD_MS-4e4),def:a} + } + Qt(KAi,"hazardAt"); + const zAi=Qt(t=>Math.floor(t/DAi.HAZARD_MS),"hazardWindow"); + function YAi(t,i,s){ + for(let e=zAi(s); + e<zAi(s)+24; + e++){ + const n=KAi(t,i,e); + if(n&&n.at>s)return n} + return null} + Qt(YAi,"nextHazard"); + const qAi=Qt(t=>Math.max(0,Math.min(DAi.LEVELS-1,t)),"clampLv"),XAi=Qt(t=>DAi.MAX_HP[qAi(t)],"maxHp"),JAi=Qt(t=>DAi.ARMOR[qAi(t)],"armorOf"),QAi=Qt((t,i)=>6e4*(DAi.REPAIR_MIN[qAi(t)]+DAi.ZONE_REPAIR_ADD_MIN[i]),"repairMs"),ZAi=Qt(t=>Math.min(4,1+Math.floor(t/2)),"helpSlots"); + function tSi(t){ + return Math.round(10*t)/10} + Qt(tSi,"round1"); + const iSi=Qt(t=>tSi(XAi(t.gear.boat)+kAi(t).hp),"maxHpOf"),sSi=Qt(t=>tSi(JAi(t.gear.boat)+kAi(t).armor),"armorOfS"),eSi=Qt((t,i)=>tSi(Math.max(0,t-i)),"hitDamage"),nSi=Qt(t=>String(tSi(t)),"hpText"),hSi=Qt(t=>t.replace(/\d+\.\d{ + 3,} + /g,t=>String(tSi(Number(t)))),"tidyNumbers"),rSi=Qt(t=>Math.round(QAi(t.gear.boat,t.spot.zone)*(1-kAi(t).repair/100)),"repairMsOf"); + function oSi(t,i,s){ + if(!i.repairAt)return i.hp; + const e=iSi(t); + return Math.min(e,i.repairHp+(s-i.repairAt)*e/rSi(t))} + function aSi(t,i){ + if(!i.repairAt)return 0; + const s=iSi(t); + return i.repairAt+Math.max(0,(s-i.repairHp)/s*rSi(t))} + function cSi(t,i){ + const s=t.boat,e=ZAi(t.gear.boat); + if(!s)return{ + n:1,nextAt:null} + ; + if(s.helpPts>=e)return{ + n:e,nextAt:null} + ; + const n=Math.floor(Math.max(0,i-s.helpAt)/DAi.HELP_MS),h=Math.min(e,s.helpPts+n),r=s.helpAt+n*DAi.HELP_MS; + return{ + n:h,nextAt:h>=e?null:r+DAi.HELP_MS} + } + function lSi(t,i){ + const s=UAi[FAi(t,i)-1]+1,e=DAi.ENTRY[i]+1; + return e>=s?`배 ${ + e} + 단계부터`:`배 ${ + e} + 단계부터 · 안정 ${ + s} + 단계`} + Qt(oSi,"hpAt"),Qt(aSi,"repairEndAt"),Qt(cSi,"helpPtsOf"),Qt(lSi,"regionBoatText"); + const uSi=["인간","엘프","언데드","오크"],dSi=["R","C","O"],fSi=["S","M","B"],pSi={ + R:"강",C:"연안",O:"대양"} + ,gSi={ + S:"수면",M:"중층",B:"바닥"} + ,wSi=["햇살","노을","달빛","안개"],mSi=["낮","저녁","밤","새벽"],vSi={ + "인간|R":"은빛강","인간|C":"노을만","인간|O":"왕국 앞바다","엘프|R":"이끼강","엘프|C":"연꽃만","엘프|O":"초록 바다","언데드|R":"잿빛강","언데드|C":"안개만","언데드|O":"망령 바다","오크|R":"서리강","오크|C":"북풍만","오크|O":"고래 바다"} + ,_Si=36e5,MSi={ + "아주작음":{ + kg:.008,cm:4} + ,"작음":{ + kg:.05,cm:8} + ,"보통":{ + kg:.2,cm:20} + ,"큼":{ + kg:1,cm:35} + ,"아주큼":{ + kg:5,cm:70} + ,"대물":{ + kg:30,cm:130} + ,"거대":{ + kg:200,cm:250} + ,"범고래":{ + kg:1e3,cm:400} + ,"고래":{ + kg:5e3,cm:800} + } + ,bSi=[["고래상어","고래"],["돌고래","거대"],["범고래","범고래"],["고래","고래"],["백상아리","거대"],["바다사자","거대"],["매너티","거대"],["장수거북","거대"],["개복치","거대"],["대왕오징어","대물"],["산갈치","대물"],["가비알","대물"],["철갑상어","대물"],["실러캔스","대물"],["청새치","대물"],["참치","대물"],["물범","대물"],["꼬마상어","아주큼"],["상어","대물"],["거북손","아주작음"],["늑대거북","아주큼"],["가오리","아주큼"],["곰치","아주큼"],["늑대장어","아주큼"],["해달","아주큼"],["비버","아주큼"],["가아","아주큼"],["망토문어","아주큼"],["초롱아귀","큼"],["아귀","아주큼"],["메기","큼"],["장어","큼"],["문어","큼"],["펭귄","큼"],["거북","큼"],["투구게","큼"],["잉어","큼"],["용고기","큼"],["도치","큼"],["대왕등각류","보통"],["갑오징어","보통"],["오징어","보통"],["앵무조개","보통"],["전복","보통"],["해삼","보통"],["가시복","보통"],["쏠배감펭","보통"],["날치","보통"],["놀래기","보통"],["박쥐고기","보통"],["토끼고기","보통"],["통구멍","보통"],["칼고기","보통"],["성대","보통"],["빗해파리","아주작음"],["해파리","보통"],["볼루트고둥","보통"],["왕우럭조개","보통"],["집소라게","아주작음"],["달랑게","아주작음"],["매미새우","작음"],["불가사리","작음"],["도롱뇽","작음"],["게","작음"],["가재","작음"],["가리비","작음"],["소라","작음"],["진주조개","작음"],["가시굴","작음"],["홍합","작음"],["말미잘","작음"],["상자고기","작음"],["학공치","작음"],["집낙지","작음"],["꼬마고둥","아주작음"],["고둥","작음"],["새우","아주작음"],["등각류","아주작음"],["실고기","아주작음"],["해마","아주작음"],["베타","아주작음"],["갯민숭이","아주작음"],["리본벌레","아주작음"],["바다나리","아주작음"],["삿갓조개","아주작음"],["군부","아주작음"],["바다천사","아주작음"],["맛조개","아주작음"],["도끼고기","아주작음"]],ySi=Qt(t=>{ + var i; + return(null==(i=bSi.find(([i])=>t.includes(i)))?void 0:i[1])??"보통"} + ,"weightBand"),ESi=[[0,1],[.7,2.5],[.92,4.5],[.99,7],[1,10]]; + function ASi(t,i){ + const s=Math.max(0,Math.min(1,i)); + let e=10; + for(let n=1; + n<ESi.length; + n++){ + const[t,i]=ESi[n-1],[h,r]=ESi[n]; + if(s<=h){ + e=i*Math.pow(r/i,(s-t)/(h-t)); + break} + } + return{ + kg:Math.round(t.kg[0]*e*1e3)/1e3,cm:Math.round(t.cm[0]*Math.cbrt(e)*10)/10} + } + function SSi(t){ + let i=2654435769^t; + return i=Math.imul(i^i>>>16,2246822507),i=Math.imul(i^i>>>13,3266489909),(i^i>>>16)>>>0} + Qt(ASi,"sizeOf"),Qt(SSi,"hash32"); + const TSi={ + "인간":[8,27,48,12,18],"엘프":[63,70,52,65],"언데드":[128,126,118,119,116],"오크":[174,167,163,171]} + ,CSi=Qt((t,i,s,e,n)=>{ + var h; + return 1!==e||"R"!==s||(null==(h=TSi[i])?void 0:h.includes(t))?n:n.filter(t=>t>=3)} + ,"startTrim"),OSi=[[1,"인간","어류","화로입꿀꺽장어","O","B","전체",3,"대형",4,1125,[3,6],0],[2,"인간","어류","불꽃돛청새치","O","S","노을",4,"대형",4,2250,[2,4,6,7],1],[3,"인간","어류","잿꽃꼬리베타","R","S","전체",2,"중형",1,20,[0,1,2,3,4],0],[4,"인간","어류","숯갑옷상자고기","C","M","전체",2,"중형",2,70,[0,1,2,3,4],0],[5,"인간","어류","대장간귀상어","O","M","전체",3,"대형",4,750,[4,7],0],[6,"인간","어류","불갈기해마","C","S","노을",3,"소형",2,175,[3,6],0],[7,"인간","어류","석탄주걱통구멍","C","B","전체",1,"중형",2,35,[0,1,2,3,4,5,6,7,8],0],[8,"인간","어류","불씨가시복","R","S","전체",1,"중형",1,10,[0,1,2,3,4,5,6,7,8],0],[9,"인간","어류","용암띠장어","R","M","노을",2,"대형",2,20,[3,4,5,6],0],[10,"인간","어류","숯등철갑상어","R","B","노을",5,"대형",3,600,[8],0],[11,"인간","어류","장밋날개날치","O","S","햇살",2,"중형",3,300,[0,1,2,3,4],0],[12,"인간","어류","화덕수염메기","R","B","전체",1,"대형",2,10,[0,1,2,3,4,5,6,7,8],0],[13,"인간","어류","햇살원반가오리","R","S","햇살",3,"대형",2,50,[3,6],0],[14,"인간","어류","홍등초롱아귀","O","B","달빛",4,"대형",4,3375,[2,4,6,7],1],[15,"인간","어류","불꽃꼬리참치","O","M","전체",2,"대형",4,300,[2,3,4,5],0],[16,"인간","어류","잿꽃갈기쏠배감펭","C","M","전체",2,"중형",2,70,[2,3,4,5],0],[17,"인간","갑각·껍질","도가니등게","R","B","전체",3,"소형",1,50,[4,7],0],[18,"인간","갑각·껍질","잿구름벙어리게","R","B","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[19,"인간","갑각·껍질","현무암투구게","C","B","달빛",4,"소형",2,525,[2,4,6,7],1],[20,"인간","갑각·껍질","숯주걱집게게","R","B","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[21,"인간","갑각·껍질","대장간권총새우","R","M","전체",2,"소형",1,20,[5,6,7,8],0],[22,"인간","갑각·껍질","불씨마디등각류","O","B","전체",1,"소형",3,225,[0,1,2,3,4,5,6,7,8],0],[23,"인간","갑각·껍질","용암주먹갯가재","C","B","전체",3,"소형",2,175,[4,7],0],[24,"인간","갑각·껍질","화산집소라게","C","B","전체",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[25,"인간","갑각·껍질","노을불꽃가리비","C","M","노을",2,"소형",2,70,[4,5,6,7],0],[26,"인간","갑각·껍질","불씨진주조개","R","B","전체",3,"소형",1,50,[5,8],0],[27,"인간","갑각·껍질","화로소용돌이고둥","R","M","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[28,"인간","갑각·껍질","잿구름뿔소라","C","B","전체",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[29,"인간","갑각·껍질","용암판앵무조개","O","M","전체",2,"소형",3,300,[4,5,6,7],0],[30,"인간","갑각·껍질","화덕삿갓조개","R","B","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[31,"인간","갑각·껍질","햇살테전복","C","B","햇살",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[32,"인간","갑각·껍질","홍등꼬마고둥","O","B","전체",1,"소형",3,225,[0,1,2,3,4,5,6,7,8],0],[33,"인간","비어류","화로배고래","O","S","햇살",5,"거대",5,9e3,[8],0],[34,"인간","비어류","잿꽃꼬리돌고래","O","S","전체",3,"거대",5,750,[5,8],0],[35,"인간","비어류","화산등늑대거북","R","S","전체",4,"대형",2,150,[2,4,6,7],1],[36,"인간","비어류","불꽃아가미도롱뇽","R","M","전체",2,"중형",1,20,[1,2,7,8],0],[37,"인간","비어류","풀무입문어","C","B","전체",2,"대형",3,70,[5,6,7,8],0],[38,"인간","비어류","횃불오징어","O","M","달빛",2,"대형",4,300,[5,6,7,8],0],[39,"인간","비어류","잿꽃치마갑오징어","C","S","전체",1,"대형",3,35,[0,1,2,3,4,5,6,7,8],0],[40,"인간","비어류","불씨심장귀문어","O","B","전체",2,"대형",4,450,[1,2,7,8],0],[41,"인간","비어류","화로등해파리","O","M","전체",1,"중형",3,150,[0,1,2,3,4,5,6,7,8],0],[42,"인간","비어류","불꽃말미잘","C","B","전체",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[43,"인간","비어류","불바퀴거미불가사리","O","B","전체",1,"소형",3,225,[0,1,2,3,4,5,6,7,8],0],[44,"인간","비어류","불씨혹해삼","O","B","전체",1,"소형",3,225,[0,1,2,3,4,5,6,7,8],0],[45,"인간","비어류","잿갈기바다사자","C","S","전체",4,"거대",4,525,[8],0],[46,"인간","비어류","불꽃볏펭귄","C","S","전체",3,"대형",3,175,[5,8],0],[47,"인간","비어류","노을꽃갯민숭이","C","M","노을",2,"소형",2,70,[1,2,7,8],0],[48,"인간","비어류","용암리본벌레","R","M","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[49,"엘프","어류","연꽃꼬리베타","R","S","전체",2,"중형",1,20,[0,1,2,3,4],0],[50,"엘프","어류","도토리가시복","C","S","전체",2,"중형",2,70,[0,1,2,3,4],0],[51,"엘프","어류","연잎가오리","R","S","전체",3,"대형",2,50,[3,6],0],[52,"엘프","어류","뿌리수염메기","R","B","전체",1,"대형",2,10,[0,1,2,3,4,5,6,7,8],0],[53,"엘프","어류","고사리돛청새치","O","S","햇살",4,"대형",4,2250,[2,4,6,7],1],[54,"엘프","어류","꼬투리상자고기","C","S","전체",2,"중형",2,70,[2,3,4,5],0],[55,"엘프","어류","버들잎장어","R","M","달빛",2,"대형",2,20,[3,4,5,6],0],[56,"엘프","어류","은행잎개복치","O","M","전체",3,"대형",4,750,[3,6],0],[57,"엘프","어류","솔방울철갑상어","R","B","안개",5,"대형",3,600,[8],0],[58,"엘프","어류","단풍날개날치","O","S","노을",2,"중형",3,300,[0,1,2,3,4],0],[59,"엘프","어류","완두꼬투리학공치","O","S","전체",1,"중형",3,150,[0,1,2,3,4,5,6,7,8],0],[60,"엘프","어류","이끼혹놀래기","C","M","전체",1,"중형",2,35,[0,1,2,3,4,5,6,7,8],0],[61,"엘프","어류","덩굴꼬리해마","C","S","햇살",3,"소형",2,175,[3,6],0],[62,"엘프","어류","꽃입아귀","O","B","달빛",4,"대형",4,3375,[2,4,6,7],1],[63,"엘프","어류","씨앗비늘잉어","R","M","전체",1,"중형",1,10,[0,1,2,3,4,5,6,7,8],0],[64,"엘프","어류","잎꼬리꼬마상어","O","M","전체",2,"대형",4,300,[2,3,4,5],0],[65,"엘프","갑각·껍질","밤송이집게게","R","B","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[66,"엘프","갑각·껍질","연꽃그릇게","R","S","햇살",2,"소형",1,20,[5,6,7,8],0],[67,"엘프","갑각·껍질","고사리집게게","C","B","전체",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[68,"엘프","갑각·껍질","잎방패투구게","C","B","달빛",4,"소형",2,525,[2,4,6,7],1],[69,"엘프","갑각·껍질","씨앗주먹갯가재","C","B","전체",3,"소형",2,175,[4,7],0],[70,"엘프","갑각·껍질","대나무마디새우","R","M","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[71,"엘프","갑각·껍질","솔방울등각류","O","B","전체",1,"소형",3,225,[0,1,2,3,4,5,6,7,8],0],[72,"엘프","갑각·껍질","버섯집소라게","C","B","전체",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[73,"엘프","갑각·껍질","은행부채가리비","C","M","전체",2,"소형",2,70,[4,5,6,7],0],[74,"엘프","갑각·껍질","씨앗진주조개","R","B","전체",3,"소형",1,50,[4,7],0],[75,"엘프","갑각·껍질","도토리뿔소라","C","B","전체",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[76,"엘프","갑각·껍질","덩굴나선고둥","R","M","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[77,"엘프","갑각·껍질","호두방앵무조개","O","M","전체",3,"소형",3,750,[4,7],0],[78,"엘프","갑각·껍질","꽃잎삿갓조개","C","B","전체",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[79,"엘프","갑각·껍질","이끼테전복","C","B","안개",3,"소형",2,175,[5,8],0],[80,"엘프","갑각·껍질","초롱꼬투리고둥","O","B","달빛",2,"소형",3,450,[4,5,6,7],0],[81,"엘프","비어류","버들잎지느러미고래","O","S","햇살",5,"거대",5,9e3,[8],0],[82,"엘프","비어류","완두꼬투리매너티","R","S","햇살",4,"거대",3,150,[2,4,6,7],1],[83,"엘프","비어류","나이테등거북","R","M","전체",1,"대형",2,10,[0,1,2,3,4,5,6,7,8],0],[84,"엘프","비어류","고사리아가미도롱뇽","R","B","안개",2,"중형",1,20,[1,2,7,8],0],[85,"엘프","비어류","꽃봉오리오징어","O","M","달빛",2,"대형",4,300,[5,6,7,8],0],[86,"엘프","비어류","연꽃망토문어","C","M","전체",4,"대형",3,525,[8],0],[87,"엘프","비어류","클로버귀문어","O","B","전체",3,"대형",4,1125,[5,8],0],[88,"엘프","비어류","이끼치마갑오징어","C","S","전체",2,"대형",3,70,[5,6,7,8],0],[89,"엘프","비어류","버섯갓해파리","O","M","전체",1,"중형",3,150,[0,1,2,3,4,5,6,7,8],0],[90,"엘프","비어류","꽃잎말미잘","O","B","전체",1,"소형",3,225,[0,1,2,3,4,5,6,7,8],0],[91,"엘프","비어류","고사리깃바다나리","O","B","전체",1,"소형",3,225,[0,1,2,3,4,5,6,7,8],0],[92,"엘프","비어류","완두등해삼","C","B","전체",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[93,"엘프","비어류","뿌리수염해달","R","S","전체",3,"대형",2,50,[5,8],0],[94,"엘프","비어류","버들꼬리물범","O","S","전체",2,"대형",4,300,[1,2,7,8],0],[95,"엘프","비어류","단풍망토갯민숭이","C","M","노을",2,"소형",2,70,[1,2,7,8],0],[96,"엘프","비어류","덩굴리본벌레","R","B","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[97,"언데드","어류","뼈줄무늬가아","R","S","전체",2,"대형",2,20,[0,1,2,3,4],0],[98,"언데드","어류","달그늘도끼고기","O","M","달빛",1,"중형",3,150,[0,1,2,3,4,5,6,7,8],0],[99,"언데드","어류","송곳니늑대장어","C","B","전체",3,"대형",3,175,[3,6],0],[100,"언데드","어류","잿빛박쥐고기","C","B","전체",2,"중형",2,70,[0,1,2,3,4],0],[101,"언데드","어류","유령칼고기","R","M","달빛",2,"중형",1,20,[3,4,5,6],0],[102,"언데드","어류","그림자꿀꺽장어","O","M","전체",2,"대형",4,300,[0,1,2,3,4],0],[103,"언데드","어류","뼈턱용고기","O","B","달빛",3,"대형",4,1125,[3,6],0],[104,"언데드","어류","자주초롱아귀","O","B","전체",2,"대형",4,450,[2,3,4,5],0],[105,"언데드","어류","고대뼈실러캔스","O","B","달빛",5,"대형",5,13500,[8],0],[106,"언데드","어류","달가면토끼고기","C","S","전체",1,"중형",2,35,[0,1,2,3,4,5,6,7,8],0],[107,"언데드","어류","무덤입통구멍","C","B","전체",2,"중형",2,70,[2,3,4,5],0],[108,"언데드","어류","뼈마디실고기","R","M","전체",2,"소형",1,20,[5,6,7,8],0],[109,"언데드","어류","망령주름상어","O","M","안개",4,"대형",4,2250,[2,4,6,7],1],[110,"언데드","어류","뼈등철갑상어","R","B","안개",5,"대형",3,600,[8],0],[111,"언데드","어류","해골무늬가오리","R","B","전체",3,"대형",2,50,[3,6],0],[112,"언데드","어류","유령갈기쏠배감펭","C","M","달빛",2,"중형",2,70,[4,5,6,7],0],[113,"언데드","갑각·껍질","해골방패투구게","C","B","달빛",3,"소형",2,175,[4,7],0],[114,"언데드","갑각·껍질","뼈가시거미게","O","B","전체",2,"소형",3,450,[4,5,6,7],0],[115,"언데드","갑각·껍질","봉합등상자게","C","B","전체",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[116,"언데드","갑각·껍질","박쥐날개집게게","R","B","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[117,"언데드","갑각·껍질","뼈갑옷대왕등각류","O","B","전체",3,"소형",3,1125,[4,7],0],[118,"언데드","갑각·껍질","뼈마디유령새우","R","M","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[119,"언데드","갑각·껍질","숯뼈가재","R","B","전체",1,"중형",1,10,[0,1,2,3,4,5,6,7,8],0],[120,"언데드","갑각·껍질","묘비집소라게","R","B","전체",2,"소형",1,20,[1,2,7,8],0],[121,"언데드","갑각·껍질","뼈고리뿔고둥","C","B","전체",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[122,"언데드","갑각·껍질","송곳니가리비","C","M","전체",2,"소형",2,70,[5,6,7,8],0],[123,"언데드","갑각·껍질","관뚜껑홍합","R","B","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[124,"언데드","갑각·껍질","흑진주가시굴","C","B","안개",4,"소형",2,525,[2,4,6,7],1],[125,"언데드","갑각·껍질","자주번개볼루트고둥","O","B","전체",2,"소형",3,450,[5,6,7,8],0],[126,"언데드","갑각·껍질","유령관고둥","R","M","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[127,"언데드","갑각·껍질","뼈방앵무조개","O","M","전체",3,"소형",3,750,[5,8],0],[128,"언데드","갑각·껍질","잿뿔유령소라","R","S","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[129,"언데드","비어류","망령갈비고래","O","S","달빛",4,"거대",5,2250,[2,4,6,7],1],[130,"언데드","비어류","보랏띠물범","C","S","달빛",4,"대형",3,525,[8],0],[131,"언데드","비어류","뼈등가비알","R","S","전체",4,"거대",3,150,[2,4,6,7],1],[132,"언데드","비어류","창백동굴도롱뇽","R","B","안개",3,"소형",1,50,[4,7],0],[133,"언데드","비어류","초승망토문어","C","M","달빛",3,"대형",3,175,[5,8],0],[134,"언데드","비어류","유리유령오징어","O","S","전체",1,"대형",4,150,[0,1,2,3,4,5,6,7,8],0],[135,"언데드","비어류","죄수줄무늬오징어","C","S","전체",1,"대형",3,35,[0,1,2,3,4,5,6,7,8],0],[136,"언데드","비어류","양뿔촉수오징어","O","M","전체",2,"대형",4,300,[1,2,7,8],0],[137,"언데드","비어류","흰보유령해파리","R","S","달빛",3,"중형",1,50,[5,8],0],[138,"언데드","비어류","자주꽃거꾸로해파리","C","B","전체",1,"중형",2,35,[0,1,2,3,4,5,6,7,8],0],[139,"언데드","비어류","뼈마디거미불가사리","O","B","전체",1,"소형",3,225,[0,1,2,3,4,5,6,7,8],0],[140,"언데드","비어류","잿가시해삼","C","B","전체",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[141,"언데드","비어류","박쥐망토갯민숭이","C","M","전체",2,"소형",2,70,[1,2,7,8],0],[142,"언데드","비어류","망령관말미잘","O","B","전체",1,"소형",3,225,[0,1,2,3,4,5,6,7,8],0],[143,"언데드","비어류","보랏깃바다나리","O","B","전체",1,"소형",3,225,[0,1,2,3,4,5,6,7,8],0],[144,"언데드","비어류","그림자리본벌레","R","B","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[145,"오크","어류","푸른질주참치","O","M","전체",1,"대형",4,150,[0,1,2,3,4,5,6,7,8],0],[146,"오크","어류","달원반개복치","O","M","달빛",1,"대형",4,150,[0,1,2,3,4,5,6,7,8],0],[147,"오크","어류","하늘날개날치","C","S","전체",1,"중형",2,35,[0,1,2,3,4,5,6,7,8],0],[148,"오크","어류","물결갈기산갈치","O","B","달빛",5,"거대",5,13500,[8],0],[149,"오크","어류","별점고래상어","O","S","전체",3,"거대",5,750,[3,6],0],[150,"오크","어류","파도이빨백상아리","O","M","전체",3,"거대",5,750,[4,7],0],[151,"오크","어류","남빛망치귀상어","O","M","전체",2,"대형",4,300,[0,1,2,3,4],0],[152,"오크","어류","물톱주둥이상어","R","B","안개",5,"대형",3,600,[8],0],[153,"오크","어류","초승꼬리환도상어","C","M","노을",4,"대형",3,525,[2,4,6,7],1],[154,"오크","어류","물방울전기가오리","R","B","전체",3,"대형",2,50,[3,6],0],[155,"오크","어류","서리가시복","R","S","전체",2,"중형",1,20,[0,1,2,3,4],0],[156,"오크","어류","남빛상자고기","C","M","전체",1,"중형",2,35,[0,1,2,3,4,5,6,7,8],0],[157,"오크","어류","물창학공치","R","S","전체",2,"중형",1,20,[3,4,5,6],0],[158,"오크","어류","물날개성대","C","B","전체",2,"중형",2,70,[0,1,2,3,4],0],[159,"오크","어류","방울혹도치","R","M","안개",3,"중형",1,50,[4,7],0],[160,"오크","어류","푸른리본곰치","C","B","전체",3,"대형",3,175,[3,6],0],[161,"오크","갑각·껍질","파도주걱게","C","S","전체",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[162,"오크","갑각·껍질","해면이불게","C","B","전체",2,"소형",2,70,[2,3,4,5],0],[163,"오크","갑각·껍질","서리벙어리참게","R","B","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[164,"오크","갑각·껍질","물안경달랑게","C","S","전체",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[165,"오크","갑각·껍질","넓적부채매미새우","C","B","전체",3,"소형",2,175,[4,7],0],[166,"오크","갑각·껍질","물대포권총새우","C","M","전체",2,"소형",2,70,[4,5,6,7],0],[167,"오크","갑각·껍질","남빛꼬부리옆새우","R","M","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[168,"오크","갑각·껍질","서리꽃거북손","R","S","안개",2,"대형",2,20,[5,6,7,8],0],[169,"오크","갑각·껍질","물결방앵무조개","O","M","전체",1,"소형",3,150,[0,1,2,3,4,5,6,7,8],0],[170,"오크","갑각·껍질","달배집낙지","O","S","달빛",2,"소형",3,300,[2,3,4,5],0],[171,"오크","갑각·껍질","푸른막대맛조개","R","B","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[172,"오크","갑각·껍질","긴목왕우럭조개","C","B","전체",3,"소형",2,175,[5,8],0],[173,"오크","갑각·껍질","서리삿갓조개","R","B","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[174,"오크","갑각·껍질","물소용돌이고둥","R","M","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[175,"오크","갑각·껍질","산호뿔소라","C","B","전체",1,"소형",2,35,[0,1,2,3,4,5,6,7,8],0],[176,"오크","갑각·껍질","남빛갑옷군부","R","B","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0],[177,"오크","비어류","밤바다범고래","O","S","달빛",4,"거대",5,2250,[2,4,6,7],1],[178,"오크","비어류","네모머리향유고래","O","B","전체",4,"거대",5,3375,[2,4,6,7],1],[179,"오크","비어류","파도날개혹등고래","O","S","전체",2,"거대",5,300,[4,5,6,7],0],[180,"오크","비어류","초승턱북극고래","O","S","안개",2,"거대",5,300,[5,6,7,8],0],[181,"오크","비어류","긴팔대왕오징어","O","B","전체",3,"거대",5,1125,[5,8],0],[182,"오크","비어류","밤망토흡혈오징어","O","B","달빛",1,"대형",4,225,[0,1,2,3,4,5,6,7,8],0],[183,"오크","비어류","방울귀오징어","C","M","전체",1,"대형",3,35,[0,1,2,3,4,5,6,7,8],0],[184,"오크","비어류","비단망토문어","C","M","달빛",4,"대형",3,525,[8],0],[185,"오크","비어류","물줄기등장수거북","O","M","전체",2,"거대",5,300,[1,2,7,8],0],[186,"오크","비어류","파도날개펭귄","C","S","전체",2,"대형",3,70,[5,6,7,8],0],[187,"오크","비어류","물방망이비버","R","S","전체",4,"대형",2,150,[2,4,6,7],1],[188,"오크","비어류","둥실배해달","R","S","전체",3,"대형",2,50,[5,8],0],[189,"오크","비어류","서리날개바다천사","C","M","안개",2,"소형",2,70,[1,2,7,8],0],[190,"오크","비어류","푸른용갯민숭이","O","S","전체",1,"소형",3,150,[0,1,2,3,4,5,6,7,8],0],[191,"오크","비어류","물줄무늬빗해파리","R","M","달빛",2,"소형",1,20,[1,2,7,8],0],[192,"오크","비어류","물방울말미잘","R","B","전체",1,"소형",1,10,[0,1,2,3,4,5,6,7,8],0]].map(t=>{ + const i=MSi[ySi(t[3])],s=.75+SSi(t[0])%50/100,e=Math.cbrt(s); + return{ + id:t[0],race:t[1],kind:t[2],name:t[3],zone:t[4],depth:t[5],tide:t[6],star:t[7],wclass:t[8],power:t[9],price:t[10],pts:CSi(t[0],t[1],t[4],t[7],t[11]),roam:1===t[12],cm:[i.cm*e,i.cm*e*Math.cbrt(10)],kg:[i.kg*s,i.kg*s*10]} + } + ),ISi=new Map(OSi.map(t=>[t.id,t])); + function kSi(t){ + const i=ISi.get(t); + if(!i)throw new Error(`fish ${ + t} + `); + return i} + Qt(kSi,"species"); + const RSi=Qt((t,i,s)=>hAi[`${ + t} + |${ + pSi[i]} + `][s],"pointName"),xSi=63e5,PSi=Qt(t=>Math.floor(t/xSi)%4,"tideAt"),NSi=Qt(t=>xSi-t%xSi,"untilNextTide"),LSi=Qt((t,i)=>{ + const s=PSi(t); + return s===i?0:((i-s+4)%4-1)*xSi+NSi(t)} + ,"untilTide"),DSi=Qt(t=>Math.floor(t/864e5),"dayIndex"),GSi=Qt((t,i)=>t.pts[SSi(1e3*t.id+i)%t.pts.length],"roamPoint"); + function BSi(t,i,s){ + return t.roam?i===GSi(t,s):t.pts.includes(i)} + function USi(t){ + const i=t.roam||t.star<=1&&t.pts.includes(0)?0:t.pts[0]; + return{ + race:t.race,zone:t.zone,point:i,depth:t.depth} + } + function FSi(t,i,s,e){ + const n=SSi(131*Math.floor(e/(6*_Si))+17*uSi.indexOf(t)+5*dSi.indexOf(i)+s),h="R"===i?180:"C"===i?110:60,r=.45+n%1e3/1e3; + return Math.max(2,Math.round(h*r*(.8+(n>>>10)%400/1e3)))} + function $Si(t){ + return t.star<=2?"":t.roam?"회유":"명물"} + function HSi(t){ + if(1===t.star)return t.pts.includes(0)?"이 지역 어디서나 · 옆 깊이와 이웃 지역에서도 가끔":`${ + RSi(t.race,t.zone,t.pts[0])} + 부터 · 옆 깊이와 이웃 지역에서도 가끔`; + if(t.roam)return`회유어 · ${ + t.pts.length} + 곳을 날마다 옮겨 다녀요`; + const i=t.pts.map(i=>RSi(t.race,t.zone,i)),s=i.length<=2?i.join(" · "):`${ + i.slice(0,2).join(" · ")} + 외 ${ + i.length-2} + 곳`; + return 2===t.star&&"전체"!==t.tide?`${ + s} + · ${ + t.tide} + 물때`:s} + Qt(BSi,"livesAt"),Qt(USi,"homeSpot"),Qt(FSi,"anglersAt"),Qt($Si,"tagText"),Qt(HSi,"whereText"); + const WSi=[{ + key:"boat",title:"배",names:["통나무 뗏목","나무 쪽배","채색 쪽배","놋쇠 장식 배","철갑 어선","백조 머리 배","황금 용머리 배"],effects:[0,1,2,3,4,5,6].map(Qt(t=>[`내구도 ${ + DAi.MAX_HP[t]} + · 튼튼함 ${ + DAi.ARMOR[t]} + · 장비 ★${ + t+1} + 까지`,t>0&&t===DAi.ENTRY.C?"연안 갈 수 있음":"",t>0&&t===DAi.ENTRY.O?"대양 갈 수 있음":""].filter(Boolean).join(" · "),"boatEffect")),prices:[0,1500,6e3,2e4,6e4,15e4,5e5]} + ,{ + key:"line",title:"낚싯줄",names:["삼베 줄","비단 줄","거미 비단 줄","미스릴 줄","용 힘줄"],effects:["힘 1까지 버팀","힘 2까지","힘 3까지","힘 4까지","힘 5까지 (고래도)"],prices:[0,1500,1e4,3e4,15e4]} + ,{ + key:"rod",title:"낚싯대",names:["버들가지 대","대나무 대","물푸레 대","룬 새김 대","명인의 대"],effects:["큰 개체 재굴림 0%","5%","12%","20%","30%"],prices:[0,800,6e3,3e4,12e4]} + ,{ + key:"reel",title:"얼레",names:["나무 얼레","청동 얼레","강철 얼레","드워프 얼레","마법 얼레"],effects:["입질 ×1","×1.15","×1.3","×1.4","×1.5 · 심해 입장"],prices:[0,1e3,8e3,4e4,2e5]} + ,{ + key:"bobber",title:"찌",names:["깃털 찌","코르크 찌","반딧불 찌","황금 찌"],effects:["★3 이상 ×1","×1.3","×1.6","×2"],prices:[0,2e3,15e3,9e4]} + ,{ + key:"icebox",title:"어망",names:["삼베 어망","그물 어망","드워프 어망","마법 어망"],effects:["40마리","60마리","90마리","120마리"],prices:[0,2500,18e3,9e4]} + ,{ + key:"auto",title:"자동 낚싯대",names:["없음","자동 받침대","자동 얼레 받침대","명인의 자동대"],effects:["켜 두면 입질 2번에 1마리 · 꺼 두면 5번에 1마리","꺼 둔 동안 4번에 1마리","꺼 둔 동안 3번에 1마리","꺼 둔 동안 2번에 1마리"],prices:[0,5e3,4e4,15e4]} + ],VSi=[1,1.15,1.3,1.4,1.5],jSi=[0,.05,.12,.2,.3],KSi=[1,1.3,1.6,2],zSi=[40,60,90,120],YSi=Qt(t=>VSi[t.reel],"reelSpeed"),qSi=Qt((t,i=0)=>zSi[t.icebox]+Math.max(0,Math.round(i)),"iceboxCap"),XSi=Qt(t=>t.line+1,"lineLimit"),JSi={ + R:[1,1,1,2,2,3,3,3,3],C:[3,3,3,4,4,5,5,5,5],O:[5,5,5,6,6,7,7,7,7]} + ,QSi=Qt(t=>JSi[t.zone][Math.min(JSi[t.zone].length-1,Math.max(0,t.point))],"spotLevel"),ZSi=Qt((t,i)=>1===QSi(i)?Math.max(1,t.power-1):t.power,"fishPower"); + function tTi(t,i){ + return"C"===i.zone&&t.boat<0?"채색 쪽배 이상이 필요해요":"O"===i.zone&&t.boat<0?"백조 머리 배 이상이 필요해요":"O"===i.zone&&"B"===i.depth&&t.reel<4?"심해는 마법 얼레가 필요해요":null} + Qt(tTi,"accessProblem"); + const iTi={ + 1:100,2:40,3:12,4:6,5:2.5} + ,sTi={ + R:["C"],C:["R","O"],O:["C"]} + ,eTi={ + S:["M"],M:["S","B"],B:["M"]} + ,nTi=Qt(t=>1===QSi(t)&&TSi[t.race].some(i=>{ + var s; + return(null==(s=ISi.get(i))?void 0:s.depth)===t.depth} + ),"startDepthOwned"); + function hTi(t,i,s,e){ + if(t.race!==i.race)return 0; + let n,h; + if(t.zone===i.zone)n=1; + else{ + if(!(1===t.star&&sTi[t.zone].includes(i.zone)&&QSi(i)>1))return 0; + n=.3} + if(t.depth===i.depth)h=1; + else{ + if(!(t.star<=2&&1===n&&eTi[t.depth].includes(i.depth))||nTi(i))return 0; + h=1===t.star?.5:.3} + return t.star>=2&&"전체"!==t.tide&&t.tide!==s?0:1!==n||BSi(t,i.point,e)?n*h*(1===t.star||"전체"===t.tide?1:t.star>=3?2:1.5):0} + function rTi(t,i,s,e){ + return OSi.filter(n=>n.race===t&&(n.zone===i?BSi(n,s,e):1===n.star&&sTi[n.zone].includes(i)&&QSi({ + zone:i,point:s} + )>1))} + function oTi(t,i,s,e,n=0){ + const h=wSi[PSi(i)],r=DSi(i),o=e&&e.until>i?e.kind:null,a=[]; + for(const c of OSi){ + const i=hTi(c,t,h,r); + if(i<=0)continue; + let e=iTi[c.star]*i; + c.star>=3&&(e*=KSi[s.bobber]*(1+Math.max(0,n)/100)),o&&o===c.kind&&(e*=2),a.push({ + s:c,w:e} + )} + return a} + Qt(hTi,"spawnFactor"),Qt(rTi,"speciesAtPoint"),Qt(oTi,"poolAt"); + const aTi=["C","B","A","S"],cTi=["","대","특대","왕"],lTi=[1,1.5,3,10],uTi=Qt(t=>t>=.99?3:t>=.92?2:t>=.7?1:0,"gradeOf"),dTi=Qt(t=>cTi[t]??"","gradeName"),fTi=Qt(t=>t>=1?` (${ + cTi[t]} + )`:"","gradeSuffix"),pTi=Qt((t,i,s)=>1e4*t+1e3*i+Math.round(999*s),"starScore"); + function gTi(t,i,s,e,n=Math.random){ + const h=oTi(t,i,s,e); + if(!h.length)return null; + const r=h.reduce((t,i)=>t+i.w,0); + let o=n()*r,a=h[0].s; + for(const p of h)if(o-=p.w,o<=0){ + a=p.s; + break} + const c=ZSi(a,t)-XSi(s),l=c>=1&&n()<(1===c?.5:.9); + let u=n(); + n()<jSi[s.rod]&&(u=Math.max(u,n())); + const{ + kg:d,cm:f} + =ASi(a,u); + return{ + id:a.id,star:a.star,grade:uTi(u),r:u,kg:d,cm:f,at:i,race:t.race,zone:t.zone,point:t.point,tide:PSi(i),broken:l} + } + Qt(gTi,"rollCatch"); + const wTi={ + R:10,C:35,O:150} + ,mTi={ + 1:1,2:2,3:5,4:15,5:60} + ; + function vTi(t,i,s=.5){ + const e=kSi(t),n="O"===e.zone&&"B"===e.depth?1.5:1; + return Math.round(wTi[e.zone]*mTi[e.star]*n*(.8+.7*s)*lTi[i])} + Qt(vTi,"unitPrice"); + const _Ti=Qt(t=>t>=1e3?`${ + (t/1e3).toFixed(2)} + t`:t>=10?`${ + t.toFixed(1)} + kg`:t>=.1?`${ + t.toFixed(2)} + kg`:`${ + Math.max(1,Math.round(1e3*t))} + g`,"formatKg"),MTi=Qt(t=>"★".repeat(Math.max(0,t)),"starText"),bTi=[{ + day:1,title:"월척",kind:"big",speciesId:3,desc:"잿꽃꼬리베타 최대 무게 · 은빛강"} + ,{ + day:2,title:"다어",kind:"count",desc:"어디서나 잡은 마릿수"} + ,{ + day:3,title:"명물 월척",kind:"big",speciesId:132,desc:"창백동굴도롱뇽 최대 무게 · 잿빛강 어딘가 · 안개 물때"} + ,{ + day:4,title:"분류전",kind:"class",kindClass:"갑각·껍질",desc:"갑각·껍질류 마릿수 · 어디서나"} + ,{ + day:5,title:"대어 사냥",kind:"star",desc:"가장 높은 별 한 마리 (같으면 종 대비 크기)"} + ,{ + day:6,title:"명물 월척",kind:"big",speciesId:6,desc:"불갈기해마 최대 무게 · 노을만 어딘가"} + ,{ + day:7,title:"도감전",kind:"dex",desc:"대회 동안 잡은 서로 다른 종 수"} + ,{ + day:8,title:"달빛 대물전",kind:"tidePct",tide:2,desc:"달빛 물때에 잡은 한 마리 · 종 대비 크기"} + ,{ + day:9,title:"회유어 월척",kind:"big",speciesId:131,desc:"뼈등가비알 최대 무게 · 오늘은 어느 포인트?"} + ,{ + day:10,title:"낚시왕 결승",kind:"pct",desc:"어디서나 종 대비 가장 큰 한 마리"} + ],yTi=Qt(t=>bTi[(Math.max(1,Math.floor(t))-1)%10],"contestFor"),ETi=Qt(t=>"big"===t.kind||"star"===t.kind||"tidePct"===t.kind||"pct"===t.kind,"contestIsMax"); + function ATi(t,i){ + if(i<=0)return"-"; + switch(t.kind){ + case"big":return _Ti(i); + case"count":case"class":return`${ + Math.round(i)} + 마리`; + case"dex":return`${ + Math.round(i)} + 종`; + case"star":{ + const t=cTi[Math.floor(i/1e3)%10]; + return`★${ + Math.floor(i/1e4)} + ${ + t?` ${ + t} + `:""} + · ${ + (i%1e3/10).toFixed(1)} + %`} + case"tidePct":case"pct":return`${ + (100*i).toFixed(1)} + %`} + } + function STi(t,i=30){ + return 1===t?5:2===t?3.5:3===t?2.5:2-1.5*(t-4)/Math.max(1,i-4)} + Qt(ATi,"formatContestScore"),Qt(STi,"rankMult"); + const TTi=Qt(t=>t<=1?700:t<=4?2e3:t<=7?1e4:4e4,"contestBaseGold"),CTi=Qt(t=>1===t?1200:2===t?720:3===t?480:t<=10?240:80,"pearlByRank"); + function OTi(t,i,s,e){ + const n=Math.min(1,Math.pow(Math.max(0,e),s)); + if("star"===t.kind){ + if(n<=.15)return 0; + const t=i%1e3/999*(.75+.25*n); + return pTi(Math.floor(i/1e4),uTi(t),t)} + return ETi(t)?n>.15?i*(.75+.25*n):0:Math.round(i*n)} + function ITi(t){ + return OSi.filter(i=>"R"===i.zone||"C"===i.zone&&t.boat>=0||"O"===i.zone&&t.boat>=0&&("B"!==i.depth||t.reel>=4))} + function kTi(t,i,s){ + let e=SSi(7919*t); + const n=Qt(()=>(e=SSi(e+1831565813),e/4294967296),"rnd"),h=ITi(i),r=Qt(t=>t[Math.floor(n()*t.length)]??h[0],"pick"),o=r(h.filter(t=>1===t.star)),a=r(h.filter(t=>t.star<=2&&"전체"===t.tide)),c=h.filter(t=>t.star>=2&&t.star<=3&&!s.has(t.id)),l=r(c.length?c:h.filter(t=>3===t.star)),u=Qt(t=>"O"===t.zone?8:"C"===t.zone?3:1,"zoneGold"); + return[{ + key:`${ + t} + :m`,npc:"마르타",role:"시장 상인",line:`"${ + o.name} + 좀 넉넉히 가져와 줘요!"`,speciesId:o.id,count:5,minGrade:0,gold:250*u(o),pearl:0} + ,{ + key:`${ + t} + :b`,npc:"브루노",role:"요리사",line:'"오늘 요리엔 큰 놈이 필요하네."',speciesId:a.id,count:2,minGrade:2,gold:900*u(a),pearl:95} + ,{ + key:`${ + t} + :e`,npc:"엘리안",role:"학자",line:`"${ + vSi[`${ + l.race} + |${ + l.zone} + `]} + 의 ${ + l.name} + 를 연구하고 싶군요."`,speciesId:l.id,count:1,minGrade:0,gold:600*u(l),pearl:255} + ]} + Qt(OTi,"botShown"),Qt(ITi,"reachableSpecies"),Qt(kTi,"visitorsFor"); + const RTi=Qt(t=>Math.floor(t/(6*_Si)),"questWindow"),xTi=Qt((t,i,s)=>27*uSi.indexOf(t)+9*dSi.indexOf(i)+s,"areaIndex"),PTi=Qt((t,i,s)=>OSi.filter(e=>e.race===t&&e.zone===i&&!e.roam&&e.pts.includes(s)),"areaSpecies"),NTi=Qt((t,i)=>20*QSi({ + zone:t,point:i} + ),"areaPearl"),LTi=[{ + need:10,pearl:220} + ,{ + need:25,pearl:440} + ,{ + need:50,pearl:660} + ,{ + need:75,pearl:880} + ,{ + need:100,pearl:1320} + ,{ + need:150,pearl:1760} + ,{ + need:192,pearl:3300} + ],DTi=[{ + need:1e4,pearl:250} + ,{ + need:5e4,pearl:500} + ,{ + need:2e5,pearl:750} + ,{ + need:5e5,pearl:1e3} + ,{ + need:1e6,pearl:1500} + ,{ + need:2e6,pearl:2500} + ],GTi=[{ + need:1,pearl:325} + ,{ + need:5,pearl:650} + ,{ + need:15,pearl:1300} + ,{ + need:30,pearl:1950} + ,{ + need:60,pearl:3250} + ,{ + need:100,pearl:5200} + ],BTi=[],UTi=Qt(t=>Math.floor(t/864e5),"utcDay"),FTi=Qt(t=>Number.isInteger(t)&&t>=1&&t<=30?31-t:0,"rankPearl"),$Ti=Qt(t=>-Math.cos(t/1e3*3.4+.6*Math.sin(t/1700)),"socialGaugeValue"),HTi=class{ + static runId(){ + return this.run} + static user(){ + return EG.userId||"guest"} + static setRun(t){ + if(!t||t===this.run)return; + const i=0===this.run,s=this.user(); + this.saveTimer&&(clearTimeout(this.saveTimer),this.saveTimer=null),this.maps.clear(),this.dirty.clear(),this.foundCache.clear(),this.run=t; + try{ + if(i)for(const i of Object.keys(localStorage)){ + const e=/^fishing:(fog|spots):v1:([^:]+):(.+)$/.exec(i); + if(!e||e[2]!==s)continue; + const n=`fishing:${ + e[1]} + :v2:${ + s} + :${ + t} + :${ + e[3]} + `,h=localStorage.getItem(i); + null!==h&&null===localStorage.getItem(n)&&localStorage.setItem(n,h),localStorage.removeItem(i)} + const e=`:${ + s} + :${ + t} + :`; + for(const t of Object.keys(localStorage))!t.startsWith(`fishing:fog:v2:${ + s} + :`)&&!t.startsWith(`fishing:spots:v2:${ + s} + :`)||t.includes(e)||localStorage.removeItem(t)} + catch{ + } + } + static storeKey(t,i){ + let s=2166136261; + for(let e=0; + e<i.length; + e++)s^=i.charCodeAt(e),s=Math.imul(s,16777619); + return`fishing:fog:v2:${ + this.user()} + :${ + this.run} + :${ + t} + :${ + (s>>>0).toString(36)} + `} + static bits(t,i){ + let s=this.maps.get(t); + if(s)return s; + s=new Uint8Array(i+7>>3); + try{ + const i=localStorage.getItem(t); + if(i){ + const t=atob(i); + if(t.length===s.length)for(let i=0; + i<t.length; + i++)s[i]=t.charCodeAt(i)} + } + catch{ + } + return this.maps.set(t,s),s} + static has(t,i){ + return 1==(t[i>>3]>>(7&i)&1)} + static set(t,i){ + t[i>>3]|=1<<(7&i)} + static pointKnown(t,i,s=-1){ + if(0===i||i===s)return!0; + const e=nAi.topdownInfo(t); + if(!e.verts||!e.tile)return!0; + const n=e.points[i]; + if(!n)return!1; + if(this.found(t)>>i&1)return!0; + const h=this.bits(this.storeKey(t,e.verts),e.cols*e.rows); + return this.has(h,Math.floor(n.y/e.tile)*e.cols+Math.floor(n.x/e.tile))} + static foundKey(t){ + const i=nAi.topdownInfo(t); + return this.storeKey(t,i.verts??"").replace("fishing:fog:v2:","fishing:spots:v2:")} + static found(t){ + const i=this.foundKey(t); + let s=this.foundCache.get(i); + if(void 0===s){ + s=0; + try{ + s=Number(localStorage.getItem(i))||0} + catch{ + } + this.foundCache.set(i,s)} + return s} + static markFound(t,i){ + const s=this.foundKey(t),e=this.found(t); + if(e>>i&1)return!1; + const n=e|1<<i; + this.foundCache.set(s,n); + try{ + localStorage.setItem(s,String(n))} + catch{ + } + return!0} + static markDirty(t){ + this.dirty.add(t),this.saveTimer??(this.saveTimer=setTimeout(()=>this.flush(),2e3))} + static flush(){ + this.saveTimer=null; + for(const t of this.dirty){ + const i=this.maps.get(t); + if(i)try{ + localStorage.setItem(t,btoa(String.fromCharCode(...i)))} + catch{ + } + } + this.dirty.clear()} + } + ; + Qt(HTi,"FishingFog"),Zt(HTi,"maps",new Map),Zt(HTi,"dirty",new Set),Zt(HTi,"saveTimer",null),Zt(HTi,"run",0),Zt(HTi,"foundCache",new Map); + let WTi=HTi; + function VTi(t,i,s,e,n=[]){ + let h=t.k,r=t.nextAt,o=t.castAt; + for(let a=0; + a<400&&r+rAi<=e; + a++){ + const e=n.includes(h)?3500:0; + o=r,h++,r+=cAi(t.seed,h,i,s)+e} + return{ + k:h,at:r,prevAt:o} + } + function jTi(t,i,s,e){ + if(s>=t.at&&s<t.at+rAi)return t.k===e?null:{ + k:t.k} + ; + const n=t.k-1; + return n>=i&&s>=t.prevAt&&s<t.prevAt+rAi+2e3&&n!==e?{ + k:n} + :null} + function KTi(t){ + let i=(t%4294967296^1540483477)>>>0; + return()=>(i=Math.imul(i,1664525)+1013904223>>>0,i>>>24)} + Qt(VTi,"currentBite"),Qt(jTi,"hookTarget"),Qt(KTi,"stream"); + const zTi=Qt(t=>"function"==typeof atob?atob(t):Buffer.from(t,"base64").toString("latin1"),"fromB64"); + function YTi(t,i){ + if("string"!=typeof t||!t)return null; + try{ + const s=zTi(t),e=KTi(i); + let n=""; + for(let t=0; + t<s.length; + t++)n+=String.fromCharCode(s.charCodeAt(t)^e()); + if("~"!==n[0])return null; + const h=JSON.parse(n.slice(1)); + if(!Number.isInteger(h.k)||!Array.isArray(h.f))return null; + const r=h.f.map(t=>Array.isArray(t)&&7===t.length?{ + id:t[0],star:t[1],grade:t[2],r:t[3],kg:t[4],cm:t[5],broken:1===t[6]} + :null); + return{ + k0:h.k,fish:r} + } + catch{ + return null} + } + Qt(YTi,"decodeTicket"); + const qTi=!1,XTi={ + "인간":{ + race:"인간",river:"은빛강",npcs:[{ + id:"ben",name:"벤 선장",role:"나룻배 선장",anchor:0,art:4,ship:!0} + ,{ + id:"berta",name:"베르타 할머니",role:"절임 가게",anchor:1,art:1} + ,{ + id:"toto",name:"토토",role:"물고기 관찰꾼",anchor:5,art:2} + ,{ + id:"hans",name:"한스",role:"강가 식당",anchor:8,art:0} + ],steps:[{ + npc:"ben",title:"첫 손맛",line:"자, 이제 실전일세! 내 배 옆에서 아무 물고기나 세 마리만 낚아 보게.",done:"허허, 손맛이 제법이구먼!",kind:"any",count:3,gold:200,pearl:0} + ,{ + npc:"ben",title:"바닥의 메기",line:"메기는 바닥에 붙어 산다네. 깊이를 바닥으로 두고 두 마리만 부탁하네.",done:"통통하구먼! 선원들 저녁거리로 딱이야.",kind:"fish",id:12,count:2,gold:300,pearl:70} + ,{ + npc:"ben",to:"berta",title:"절임 가게 할머니",line:"아래쪽 버들 샛강에 베르타 할머니 절임 가게가 있다네. 일손이 필요하시대.",done:"벤 선장이 보냈다고? 마침 잘 왔구나.",kind:"meet",count:0,gold:200,pearl:70} + ,{ + npc:"berta",title:"게장 담그기",line:"게장 담글 벙어리게가 모자라. 바닥에서 세 마리만 잡아다 주렴.",done:"옳지, 살이 꽉 찼구나.",kind:"fish",id:18,count:3,gold:400,pearl:70} + ,{ + npc:"berta",title:"꼬리 고운 베타",line:"잿꽃꼬리베타는 물 위쪽에서 논단다. 깊이를 수면으로 바꿔 보렴.",done:"꼬리가 참 곱기도 하지.",kind:"fish",id:3,count:2,gold:600,pearl:105} + ,{ + npc:"berta",title:"도롱뇽 한 마리",line:"불꽃아가미도롱뇽은 중층에 사는데, 이 근처 몇 군데에서만 보인단다.",done:"이걸로 약술을 담가야겠다.",kind:"fish",id:36,count:1,gold:700,pearl:105} + ,{ + npc:"berta",to:"toto",title:"물레방아 아이",line:"강 아래 물레방아 쪽에 토토라는 아이가 물고기를 살핀다더구나. 가서 도와주렴.",done:"할머니가요? 와, 반가워요!",kind:"meet",count:0,gold:200,pearl:70} + ,{ + npc:"toto",title:"들꽃 실개천",line:"동쪽 들꽃 실개천에 가 봤어요? 거기서 낚시를 한 번 해 보고 와요!",done:"거기 물 맑죠? 저도 가 보고 싶어요.",kind:"visit",point:3,count:1,gold:300,pearl:105} + ,{ + npc:"toto",title:"햇살 가오리",line:"햇살원반가오리는 낮에만 물 위쪽으로 올라와요. 한 마리만 보여 줄래요?",done:"우와, 진짜 원반 같아요!",kind:"fish",id:13,count:1,gold:1200,pearl:210} + ,{ + npc:"toto",title:"저녁 장어",line:"용암띠장어는 저녁에 중층으로 나와요. 두 마리만 부탁해요!",done:"무늬가 전부 달라요! 그림으로 남겨야지.",kind:"fish",id:9,count:2,gold:900,pearl:140} + ,{ + npc:"toto",to:"hans",title:"강가 식당",line:"하류 식당 한스 아저씨가 물고기를 찾는대요. 아저씨한테 가 봐요!",done:"토토 녀석이 보냈군. 배고프지?",kind:"meet",count:0,gold:200,pearl:70} + ,{ + npc:"hans",title:"새우 튀김",line:"오늘 메뉴는 새우 튀김이야. 대장간권총새우 세 마리, 중층이다.",done:"딱 좋아! 튀김옷을 입혀 볼까.",kind:"fish",id:21,count:3,gold:1e3,pearl:140} + ,{ + npc:"hans",title:"진주조개",line:"하류 바닥에 불씨진주조개가 있지. 하나만 구해 와.",done:"껍데기 속이 반짝이는구먼.",kind:"fish",id:26,count:1,gold:1500,pearl:280} + ,{ + npc:"hans",title:"은빛강의 주인",line:"마지막 부탁이야. 저녁 무렵 하류 바닥에 숯등철갑상어가 나온다더군.",done:"해냈구나! 이제 은빛강에서 너를 모르는 사람은 없을 거다.",kind:"fish",id:10,count:1,gold:5e3,pearl:1050} + ]} + ,"엘프":{ + race:"엘프",river:"이끼강",npcs:[{ + id:"lilien",name:"릴리엔 선장",role:"연잎배 선장",anchor:0,art:16,ship:!0} + ,{ + id:"ria",name:"리아",role:"연못 정원사",anchor:1,art:13} + ,{ + id:"silven",name:"실벤",role:"수상생물 사서",anchor:5,art:14} + ,{ + id:"pipi",name:"피피",role:"숲속 소풍대장",anchor:8,art:15} + ],steps:[{ + npc:"lilien",title:"강의 결",line:"이제 혼자 해 볼 차례예요. 내 배 곁에서 강의 결부터 느껴 봐요. 아무 물고기나 세 마리.",done:"좋아요, 손이 강을 아네요.",kind:"any",count:3,gold:300,pearl:0} + ,{ + npc:"lilien",title:"뿌리수염메기",line:"수염이 뿌리인지 뿌리가 수염인지… 바닥에서 뿌리수염메기 두 마리만 데려와 줘요.",done:"역시 뿌리였어요! 아니, 수염인가?",kind:"fish",id:52,count:2,gold:400,pearl:30} + ,{ + npc:"lilien",to:"ria",title:"연못 정원사",line:"고사리 너른 못에 리아라는 정원사가 있어요. 일손이 필요하대요.",done:"릴리엔 선장님이요? 마침 잘 왔어요!",kind:"meet",count:0,gold:200,pearl:20} + ,{ + npc:"ria",title:"비늘 씨앗",line:"씨앗비늘잉어 비늘을 정원에 심어 볼래요. 중층에서 세 마리만!",done:"비늘에서 싹이 나면 꼭 보여 줄게요.",kind:"fish",id:63,count:3,gold:500,pearl:30} + ,{ + npc:"ria",title:"연꽃 꼬리",line:"연꽃꼬리베타는 물 위쪽에서 놀아요. 깊이를 수면으로 바꿔 봐요.",done:"꼬리가 진짜 연꽃잎 같아요!",kind:"fish",id:49,count:2,gold:700,pearl:40} + ,{ + npc:"ria",to:"silven",title:"물고기 사서",line:"버섯 물길의 사서 실벤이 물고기 기록을 모은대요. 가 보세요.",done:"리아가 보냈군요. 기록할 게 많아요.",kind:"meet",count:0,gold:200,pearl:20} + ,{ + npc:"silven",title:"빈 기록",line:"꽃잎 실개천의 물고기는 아직 기록이 비어 있어요. 거기서 낚시를 해 봐 주세요.",done:"덕분에 빈칸 하나가 채워졌어요.",kind:"visit",point:4,count:1,gold:400,pearl:30} + ,{ + npc:"silven",title:"씨앗 진주",line:"씨앗진주조개는 꽃잎 실개천이나 달빛 샛강 바닥에 있어요. 하나만 부탁해요.",done:"진주 속에 씨앗이… 정말 있군요!",kind:"fish",id:74,count:1,gold:1200,pearl:60} + ,{ + npc:"silven",to:"pipi",title:"소풍 준비",line:"이끼강 하류의 피피가 소풍을 준비한대요. 도와주세요.",done:"와, 손님이다! 소풍에 같이 가요!",kind:"meet",count:0,gold:200,pearl:20} + ,{ + npc:"pipi",title:"이끼강의 주인",line:"이끼강의 주인 솔방울철갑상어를 보고 싶어요! 안개 낀 하류 바닥에 산대요.",done:"해냈다! 이제 이끼강에서 모르는 사람이 없을 거예요!",kind:"fish",id:57,count:1,gold:5e3,pearl:350} + ]} + ,"언데드":{ + race:"언데드",river:"잿빛강",npcs:[{ + id:"charon",name:"카론 선장",role:"해골 나룻배 선장",anchor:0,art:28,ship:!0} + ,{ + id:"mora",name:"모라 할머니",role:"유령 재봉 할머니",anchor:1,art:25} + ,{ + id:"mumu",name:"무무",role:"미라 행상인",anchor:5,art:26} + ,{ + id:"luna",name:"루나",role:"해골 생태학자",anchor:8,art:27} + ],steps:[{ + npc:"charon",title:"산 손님",line:"이제 혼자 해 보게, 산 손님! 손부터 풀어 보게. 아무거나 세 마리.",done:"좋아, 산 사람 손은 역시 빠르군!",kind:"any",count:3,gold:300,pearl:0} + ,{ + npc:"charon",title:"숯뼈가재 국물",line:"배에서 끓일 국물엔 숯뼈가재가 제격이지. 바닥에서 두 마리 부탁하네.",done:"이 향이야… 맛은 못 보지만!",kind:"fish",id:119,count:2,gold:400,pearl:30} + ,{ + npc:"charon",to:"mora",title:"바느질감",line:"마른 갈대 굽이의 모라 할머니가 바느질감을 찾으셔.",done:"카론이 보냈니? 어서 오렴.",kind:"meet",count:0,gold:200,pearl:20} + ,{ + npc:"mora",title:"고둥 단추",line:"고둥 껍데기로 단추를 달 거란다. 중층에서 유령관고둥 세 개만.",done:"단추가 반짝이니 망토가 사는구나.",kind:"fish",id:126,count:3,gold:500,pearl:30} + ,{ + npc:"mora",title:"줄무늬 수",line:"뼈줄무늬가아 무늬를 따라 수를 놓고 싶구나. 물 위쪽이란다.",done:"무늬가 참 곱기도 하지.",kind:"fish",id:97,count:2,gold:700,pearl:40} + ,{ + npc:"mora",to:"mumu",title:"수상한 행상인",line:"부엉이 소에 무무라는 행상인이 있단다. 뭐든 산다더구나.",done:"손님! 좋은 물건 있으면 보여 줘!",kind:"meet",count:0,gold:200,pearl:20} + ,{ + npc:"mumu",title:"가라앉은 물건",line:"가시 너른 못에 좋은 게 가라앉아 있대. 거기서 낚시 좀 해 봐.",done:"역시 그 못이야! 내 감이 맞았어.",kind:"visit",point:3,count:1,gold:400,pearl:30} + ,{ + npc:"mumu",title:"비밀 거래",line:"해골무늬가오리! 가시 너른 못이나 검은 물길 바닥에 있어. 비싸게 쳐 줄게, 쉿.",done:"쉿, 다른 상인한테는 비밀이야.",kind:"fish",id:111,count:1,gold:1200,pearl:60} + ,{ + npc:"mumu",to:"luna",title:"오래된 생물",line:"잿빛강 하류의 루나가 오래된 생물을 연구한대.",done:"새 조수님이군요! 반가워요.",kind:"meet",count:0,gold:200,pearl:20} + ,{ + npc:"luna",title:"잿빛강의 선배",line:"나보다 오래 산 물고기가 하류 바닥에 있대요. 새벽 안개가 낄 때만 나온대요!",done:"선배님을 만났어요! 잿빛강이 당신을 기억할 거예요.",kind:"fish",id:110,count:1,gold:5e3,pearl:350} + ]} + ,"오크":{ + race:"오크",river:"서리강",npcs:[{ + id:"borkan",name:"보르칸 선장",role:"원양선 선장",anchor:0,art:36,ship:!0} + ,{ + id:"gruma",name:"그루마 할머니",role:"왕년의 낚시왕",anchor:1,art:37} + ,{ + id:"udong",name:"우동",role:"국수 장인",anchor:5,art:38} + ,{ + id:"krara",name:"크라라",role:"꼬마 게 동호회장",anchor:7,art:39} + ],steps:[{ + npc:"borkan",title:"꼬마 선원",line:"이제 실전이다, 꼬마 선원! 내 배 옆에서 손부터 풀어라. 아무거나 세 마리.",done:"제법인데! 배에 태워 줄 만하군.",kind:"any",count:3,gold:300,pearl:0} + ,{ + npc:"borkan",title:"선원 밥",line:"선원 밥으로 서리벙어리참게가 필요하다. 바닥에서 두 마리!",done:"오늘 저녁은 게찜이다!",kind:"fish",id:163,count:2,gold:400,pearl:30} + ,{ + npc:"borkan",to:"gruma",title:"왕년의 낚시왕",line:"얼음 샛강의 그루마 할머니는 왕년의 낚시왕이시다. 인사드려라.",done:"보르칸 그 꼬맹이가 보냈다고?",kind:"meet",count:0,gold:200,pearl:20} + ,{ + npc:"gruma",title:"낚싯대 장식",line:"내 낚싯대에 달 장식이 필요해. 물소용돌이고둥 세 개, 중층이야.",done:"그래, 이 소리야. 손맛이 난다.",kind:"fish",id:174,count:3,gold:500,pearl:30} + ,{ + npc:"gruma",title:"가시복 백 마리",line:"가시복은 물 위쪽에서 잡는 거야. 내 젊을 땐 하루에 백 마리였지.",done:"흠, 나쁘지 않아. 낚시왕 될 상이야.",kind:"fish",id:155,count:2,gold:700,pearl:40} + ,{ + npc:"gruma",to:"udong",title:"국수 국물",line:"흰 소의 우동이 국수 국물 재료를 찾는다더라.",done:"할머니 손님이면 국수 곱빼기!",kind:"meet",count:0,gold:200,pearl:20} + ,{ + npc:"udong",title:"국물 맛 물",line:"늑대 실개천 물이 국물 맛을 낸대. 거기서 낚시 좀 해 줘.",done:"이 물 냄새, 국물 맛이 나는데?",kind:"visit",point:3,count:1,gold:400,pearl:30} + ,{ + npc:"udong",title:"찌릿한 국물",line:"찌릿한 국물을 만들 거야! 물방울전기가오리는 늑대 실개천이나 바위 샛강 바닥에 있어.",done:"찌릿찌릿! 신메뉴 완성이다!",kind:"fish",id:154,count:1,gold:1200,pearl:60} + ,{ + npc:"udong",to:"krara",title:"게 동호회",line:"얼음꽃 웅덩이의 크라라가 게 동호회를 한대. 가 봐!",done:"새 회원이다! 환영해!",kind:"meet",count:0,gold:200,pearl:20} + ,{ + npc:"krara",title:"서리강의 톱",line:"하류 바닥에 톱 같은 주둥이 상어가 산대! 새벽 안개가 낄 때만 나온대!",done:"우와, 진짜 톱이야! 서리강 최고 낚시꾼!",kind:"fish",id:152,count:1,gold:5e3,pearl:350} + ]} + } + ,JTi=[[15,5],[10,4],[5,3],[3,2]],QTi=Qt(t=>{ + var i; + return(null==(i=JTi.find(([i])=>t.done.length>=i))?void 0:i[1])??1} + ,"questHoldMax"),ZTi=Qt((t,i)=>({ + id:`teach:${ + t} + `,npc:"",teach:!0,...i} + ),"T"),tCi={ + sell:ZTi("sell",{ + title:"어망 비우기",line:"잡은 물고기는 팔아서 골드로 바꿔요. 200골드어치만 팔아 봐요.",done:"두둑하네요! 그 골드로 장비를 손볼 수 있어요.",kind:"sell",count:200,gold:300,pearl:0} + ),line1:ZTi("line1",{ + title:"튼튼한 줄",line:"삼베 줄은 힘센 물고기를 못 버텨요. 장비에서 낚싯줄을 비단 줄로 바꿔 봐요.",done:"이제 힘 2짜리도 끄떡없어요.",kind:"gear",gear:"line",level:1,count:1,gold:0,pearl:50} + ),rod1:ZTi("rod1",{ + title:"대나무 대",line:"장비에서 낚싯대를 대나무 대로 바꿔 봐요. 큰 물고기가 더 잘 나와요.",done:"손에 착 붙네요.",kind:"gear",gear:"rod",level:1,count:1,gold:0,pearl:50} + ),icebox1:ZTi("icebox1",{ + title:"넓은 어망",line:"어망이 금방 차지요? 장비에서 그물 어망으로 바꿔 봐요.",done:"이제 넉넉하게 담겠어요.",kind:"gear",gear:"icebox",level:1,count:1,gold:0,pearl:50} + ),boat1:ZTi("boat1",{ + title:"쪽배",line:"뗏목은 느려요. 장비에서 배를 나무 쪽배로 올려 봐요.",done:"물살을 가르는 소리가 다르네요!",kind:"gear",gear:"boat",level:1,count:1,gold:0,pearl:100} + ),reel1:ZTi("reel1",{ + title:"청동 얼레",line:"장비에서 얼레를 청동 얼레로 바꿔 봐요. 입질이 빨라져요.",done:"찌가 금방 움직이네요.",kind:"gear",gear:"reel",level:1,count:1,gold:0,pearl:50} + ),bobber1:ZTi("bobber1",{ + title:"코르크 찌",line:"장비에서 찌를 코르크 찌로 바꿔 봐요. 귀한 물고기가 더 잘 물어요.",done:"귀한 손님이 올 거예요.",kind:"gear",gear:"bobber",level:1,count:1,gold:0,pearl:50} + ),harpoon:ZTi("harpoon",{ + title:"첫 작살",line:"물고기로 작살을 만들 수 있어요. 작살 하나만 만들어 봐요.",done:"날이 잘 섰네요.",kind:"harpoon",count:1,gold:500,pearl:0} + ),hunt:ZTi("hunt",{ + title:"몬스터 사냥",line:"큰 그림자가 지나가면 작살을 던져요. 한 번만 던져 봐요.",done:"용감하네요!",kind:"hunt",count:1,gold:0,pearl:100} + ),contest:ZTi("contest",{ + title:"오늘 대회",line:"오늘 대회에 나가 봐요. 퀘스트의 대회 칸에서 참가해요.",done:"대회 맛을 봤으니 이제 우승이에요!",kind:"contest",count:1,gold:0,pearl:50} + ),auto1:ZTi("auto1",{ + title:"자동 받침대",line:"자동 낚싯대를 자동 받침대로 올려 봐요. 꺼 둔 동안에도 잘 잡혀요.",done:"자는 동안에도 잡히겠어요.",kind:"gear",gear:"auto",level:1,count:1,gold:0,pearl:100} + ),line2:ZTi("line2",{ + title:"거미 비단 줄",line:"힘 3짜리를 잡으려면 거미 비단 줄이 필요해요. 장비에서 바꿔 봐요.",done:"이제 강의 주인도 버틸 수 있어요.",kind:"gear",gear:"line",level:2,count:1,gold:0,pearl:100} + )} + ,iCi=Qt((t,i,s,e,n,h)=>({ + title:t,line:i,done:s,kind:"any",count:e,gold:n,pearl:0,...void 0!==h?{ + point:h} + :{ + } + } + ),"any"),sCi=Qt((t,i,s,e,n,h,r=0)=>({ + title:t,line:i,done:s,kind:"fish",fish:e,count:n,gold:h,pearl:r} + ),"fish"),eCi=Qt((t,i,s,e,n)=>({ + title:t,line:i,done:s,kind:"area",point:e,count:1,gold:0,pearl:n} + ),"area"),nCi=Qt((t,i,s,e)=>({ + title:t,line:i,done:s,kind:"meet",to:e,count:0,gold:200,pearl:0} + ),"meet"),hCi=[[iCi("첫 손맛","자, 이제 실전일세! 내 배 곁에서 손부터 풀어 보게. 아무 물고기나 세 마리.","좋아, 손맛을 봤구먼!",3,200),sCi("바닥의 메기","메기는 바닥에 붙어 산다네. 깊이를 바닥으로 두고 두 마리 부탁하네.","통통하구먼! 선원들 저녁거리로 딱이야.",12,2,300),sCi("수면의 가시복","가시복은 물 위쪽에서 논다네. 깊이를 수면으로 바꿔 두 마리!","가시에 찔리지 않았나? 잘했네.",8,2,300),sCi("중층 고둥","고둥은 물 가운데쯤에 있지. 중층에서 두 개만.","소리가 좋구먼. 배에 걸어 둬야겠어.",27,2,300),"sell","line1",sCi("리본벌레","용암리본벌레도 세 마리 부탁하네. 중층이야.","꿈틀꿈틀 잘 잡았구먼!",48,3,300),eCi("상류 도감","은빛강 상류에 사는 물고기를 도감에 다 채우고, 퀘스트의 수역 칸에서 받아 보게.","상류 박사가 다 됐구먼!",0,30),nCi("절임 가게 할머니","버들 샛강의 베르타 할머니가 일손을 찾으신다네. 인사드리게.","벤 선장이 보냈다고? 마침 잘 왔구나.","berta")],[sCi("게장 담그기","게장을 담글 거란다. 바닥에서 잿구름벙어리게 세 마리만.","이 정도면 한 독 가득이구나.",18,3,400),sCi("꼬리 고운 베타","잿꽃꼬리베타 꼬리가 참 곱지. 물 위쪽에서 두 마리 부탁하마.","꼬리가 꽃잎 같구나!",3,2,600),sCi("도롱뇽 한 마리","불꽃아가미도롱뇽 한 마리만. 버들 샛강 중층에 산단다.","아가미가 불꽃처럼 붉구나.",36,1,600),"rod1","icebox1","boat1",eCi("버들 샛강 도감","버들 샛강 물고기를 도감에 다 채워 보렴.","샛강이 네 손바닥 안이구나.",1,30),eCi("조약돌 너른 못 도감","조약돌 너른 못 물고기도 다 채워 보렴.","못이 반짝이는구나.",2,30),nCi("물레방아 아이","노을 소에 토토라는 아이가 물고기를 관찰한단다. 가 보렴.","할머니가 보냈어요? 같이 관찰해요!","toto")],[iCi("실개천 구경","들꽃 실개천은 처음이죠? 거기서 아무 물고기나 세 마리!","실개천 물고기는 무늬가 달라요!",3,400,3),sCi("노을 장어","용암띠장어는 노을 물때에만 나와요! 중층에서 두 마리.","장어가 노을빛이에요!",9,2,900),sCi("집게게","숯주걱집게게 집게가 궁금해요. 바닥에서 세 마리!","집게가 진짜 주걱 같아요!",20,3,500),sCi("권총새우","대장간권총새우가 탕 소리를 낸대요. 중층에서 두 마리!","탕! 진짜 소리가 나요!",21,2,800),"reel1","bobber1",sCi("햇살 가오리","햇살 물때에만 수면으로 올라오는 가오리가 있어요. 한 마리만!","햇살처럼 반짝여요!",13,1,1200),"harpoon","hunt",nCi("강가 식당","은빛강 하류의 한스 아저씨가 식당 재료를 찾아요.","토토 친구라고? 배고프지?","hans")],[sCi("새우 튀김","새우 튀김엔 대장간권총새우지! 세 마리 부탁해.","바삭하게 튀겨 주지!",21,3,1e3),sCi("삿갓조개","삿갓조개 국물이 일품이지. 바닥에서 세 개!","국물이 시원하겠어!",30,3,600),sCi("도가니등게","도가니등게 한 마리면 특식이야. 은빛 샛강 바닥에 있대.","오늘 특식은 게찜이다!",17,1,1200),sCi("진주조개","불씨진주조개 하나만. 하류나 노을 소 바닥에 있어.","진주가 불씨처럼 빛나!",26,1,1500),"contest","auto1","line2",eCi("하류 도감","은빛강 하류 물고기를 도감에 다 채워 봐.","하류의 물고기 박사로군!",8,50),sCi("은빛강의 주인","하류 바닥에 은빛강의 주인이 산대. 노을 때 나오는 힘센 놈이야. 튼튼한 줄을 챙겨!","은빛강이 너를 기억할 거야!",10,1,5e3,300)]],rCi=[[iCi("강의 결","이제 혼자 해 볼 차례예요. 내 배 곁에서 강의 결부터 느껴 봐요. 아무 물고기나 세 마리.","좋아요, 손이 강을 아네요.",3,200),sCi("뿌리수염메기","수염이 뿌리인지 뿌리가 수염인지… 바닥에서 뿌리수염메기 두 마리만 데려와 줘요.","역시 뿌리였어요! 아니, 수염인가?",52,2,300),sCi("마디 새우","대나무마디새우는 물 가운데쯤에 살아요. 깊이를 중층으로 바꿔 두 마리!","마디마디 대나무 같죠?",70,2,300),"sell","line1",sCi("밤송이 게","바닥에서 밤송이집게게 세 마리만 더 부탁해요!","가시가 진짜 밤송이 같아요.",65,3,300),eCi("상류 도감","이끼강 상류에 사는 물고기를 도감에 다 채우고, 퀘스트의 수역 칸에서 받아 봐요.","상류는 이제 다 아는 물이네요!",0,30),nCi("연못 정원사","고사리 너른 못에 리아라는 정원사가 있어요. 일손이 필요하대요.","릴리엔 선장님이요? 마침 잘 왔어요!","ria")],[sCi("비늘 씨앗","씨앗비늘잉어 비늘을 정원에 심어 볼래요. 중층에서 세 마리만!","비늘에서 싹이 나면 꼭 보여 줄게요.",63,3,400),sCi("연꽃 꼬리","연꽃꼬리베타는 물 위쪽에서 놀아요. 깊이를 수면으로 바꿔 봐요.","꼬리가 진짜 연꽃잎 같아요!",49,2,600),sCi("고사리 도롱뇽","고사리아가미도롱뇽은 안개 낀 날 바닥에 나와요. 한 마리만!","아가미가 고사리 잎 같아요.",84,1,600),"rod1","icebox1","boat1",eCi("고사리 너른 못 도감","고사리 너른 못 물고기를 도감에 다 채워 봐요.","연못이 다 네 정원이네요.",1,30),eCi("반딧불 굽이 도감","반딧불 굽이 물고기도 다 채워 봐요.","반딧불처럼 반짝이는 도감이에요.",2,30),nCi("물고기 사서","버섯 물길의 사서 실벤이 물고기 기록을 모은대요. 가 보세요.","리아가 보냈군요. 기록할 게 많아요.","silven")],[iCi("빈 기록","꽃잎 실개천의 물고기는 아직 기록이 비어 있어요. 거기서 아무 물고기나 세 마리.","덕분에 빈칸이 채워졌어요.",3,400,4),sCi("달빛 장어","버들잎장어는 달빛 물때에만 중층으로 나와요. 두 마리 기록해 주세요.","달빛에 잎맥이 비쳐요.",55,2,900),sCi("덩굴 고둥","덩굴나선고둥은 중층에 있어요. 세 개만 부탁해요.","나선이 덩굴처럼 감겨 있군요.",76,3,500),sCi("씨앗 진주","씨앗진주조개는 꽃잎 실개천이나 달빛 샛강 바닥에 있어요. 하나만 부탁해요.","진주 속에 씨앗이… 정말 있군요!",74,1,800),"reel1","bobber1",sCi("연잎 가오리","연잎가오리는 이슬 샛강이나 버들 여울 수면에 떠 있어요. 한 마리만!","연잎이 헤엄치는 줄 알았어요.",51,1,1200),"harpoon","hunt",nCi("소풍 준비","이끼강 하류의 피피가 소풍을 준비한대요. 도와주세요.","와, 손님이다! 소풍에 같이 가요!","pipi")],[sCi("연꽃 그릇","소풍 그릇은 연꽃그릇게면 돼요! 햇살 물때 수면에서 세 마리!","그릇이 세 개! 소풍 준비 끝!",66,3,1e3),sCi("덩굴 리본","덩굴리본벌레로 소풍 깃발을 꾸밀래요. 바닥에서 세 마리!","깃발이 펄럭펄럭!",96,3,600),sCi("나이테 거북","나이테등거북 등을 세면 나이를 안대요. 중층에서 두 마리!","와, 저보다 나이가 많아요!",83,2,800),sCi("수염 해달","뿌리수염해달이 버섯 물길이나 하류 수면에 산대요. 한 마리만 보고 싶어요!","수염이 뿌리 같아요! 귀여워!",93,1,1500),"contest","auto1","line2",eCi("하류 도감","이끼강 하류 물고기를 도감에 다 채워 봐요.","하류 물고기 박사님이에요!",8,50),sCi("이끼강의 주인","이끼강의 주인 솔방울철갑상어를 보고 싶어요! 안개 낀 하류 바닥에 산대요. 튼튼한 줄을 챙겨요!","해냈다! 이제 이끼강에서 모르는 사람이 없을 거예요!",57,1,5e3,300)]],oCi=[[iCi("산 손님","이제 혼자 해 보게, 산 손님! 손부터 풀어 보게. 아무거나 세 마리.","좋아, 산 사람 손은 역시 빠르군!",3,200),sCi("숯뼈가재 국물","배에서 끓일 국물엔 숯뼈가재가 제격이지. 바닥에서 두 마리 부탁하네.","이 향이야… 맛은 못 보지만!",119,2,300),sCi("수면의 소라","잿뿔유령소라는 물 위쪽에 떠다닌다네. 깊이를 수면으로 바꿔 두 마리!","뿔이 잿빛으로 빛나는군.",128,2,300),sCi("중층 새우","뼈마디유령새우는 물 가운데쯤에 있지. 중층에서 두 마리.","마디가 뼈처럼 딱딱하군.",118,2,300),"sell","line1",sCi("박쥐 날개 게","바닥에서 박쥐날개집게게 세 마리만 더 부탁하네.","날개가 있어도 못 나는 게로군!",116,3,300),eCi("상류 도감","잿빛강 상류에 사는 물고기를 도감에 다 채우고, 퀘스트의 수역 칸에서 받아 보게.","상류는 자네 손바닥 안이군!",0,30),nCi("바느질감","마른 갈대 굽이의 모라 할머니가 바느질감을 찾으셔.","카론이 보냈니? 어서 오렴.","mora")],[sCi("고둥 단추","고둥 껍데기로 단추를 달 거란다. 중층에서 유령관고둥 세 개만.","단추가 반짝이니 망토가 사는구나.",126,3,400),sCi("줄무늬 수","뼈줄무늬가아 무늬를 따라 수를 놓고 싶구나. 물 위쪽이란다.","무늬가 참 곱기도 하지.",97,2,600),sCi("묘비 소라게","묘비집소라게 껍데기로 바늘꽂이를 만들 거란다. 바닥에서 한 마리만.","바늘이 쏙쏙 들어가겠구나.",120,1,600),"rod1","icebox1","boat1",eCi("마른 갈대 굽이 도감","마른 갈대 굽이 물고기를 도감에 다 채워 보렴.","굽이가 네 손바닥 안이구나.",1,30),eCi("달그림자 샛강 도감","달그림자 샛강 물고기도 다 채워 보렴.","샛강 그림자까지 다 아는구나.",2,30),nCi("수상한 행상인","부엉이 소에 무무라는 행상인이 있단다. 뭐든 산다더구나.","손님! 좋은 물건 있으면 보여 줘!","mumu")],[iCi("가라앉은 물건","가시 너른 못에 좋은 게 가라앉아 있대. 거기서 아무 물고기나 세 마리 낚아 봐.","역시 그 못이야! 내 감이 맞았어.",3,400,3),sCi("유령 칼","유령칼고기는 달빛 물때에만 중층으로 나와. 두 마리면 값을 쳐 주지.","칼날이 투명해! 좋은 물건이야.",101,2,900),sCi("그림자 리본","그림자리본벌레를 리본으로 팔 거야. 바닥에서 세 마리!","리본이 그림자처럼 흔들려!",144,3,500),sCi("뼈마디 실고기","뼈마디실고기는 부엉이 소 중층에 있어. 두 마리!","실처럼 가는데 뼈가 다 보여!",108,2,800),"reel1","bobber1",sCi("비밀 거래","해골무늬가오리! 가시 너른 못이나 검은 물길 바닥에 있어. 비싸게 쳐 줄게, 쉿.","쉿, 다른 상인한테는 비밀이야.",111,1,1200),"harpoon","hunt",nCi("오래된 생물","잿빛강 하류의 루나가 오래된 생물을 연구한대.","새 조수님이군요! 반가워요.","luna")],[sCi("실고기 표본","뼈마디실고기 표본이 더 필요해요. 중층에서 세 마리!","표본 상자가 꽉 찼어요.",108,3,1e3),sCi("관뚜껑 홍합","관뚜껑홍합은 몇 살인지 궁금해요. 바닥에서 세 개!","껍데기에 나이테가 있어요!",123,3,600),sCi("동굴 도롱뇽","창백동굴도롱뇽은 안개 낀 날 녹슨 실개천이나 잿빛 샛강 바닥에 나와요. 한 마리만!","눈이 없는데 길을 잘 찾아요.",132,1,1200),sCi("유령 해파리","흰보유령해파리는 달빛 물때 수면에 떠요. 한 마리만 연구할게요!","빛이 흔들흔들, 정말 유령 같아요.",137,1,1500),"contest","auto1","line2",eCi("하류 도감","잿빛강 하류 물고기를 도감에 다 채워 봐요.","하류 연구는 당신 덕분이에요!",8,50),sCi("잿빛강의 선배","나보다 오래 산 물고기가 하류 바닥에 있대요. 새벽 안개가 낄 때만 나온대요! 튼튼한 줄을 챙겨요.","선배님을 만났어요! 잿빛강이 당신을 기억할 거예요.",110,1,5e3,300)]],aCi=[[iCi("꼬마 선원","이제 실전이다, 꼬마 선원! 내 배 옆에서 손부터 풀어라. 아무거나 세 마리.","제법인데! 배에 태워 줄 만하군.",3,200),sCi("선원 밥","선원 밥으로 서리벙어리참게가 필요하다. 바닥에서 두 마리!","오늘 저녁은 게찜이다!",163,2,300),sCi("꼬부리 새우","남빛꼬부리옆새우는 물 가운데쯤에 산다. 깊이를 중층으로 바꿔 두 마리!","꼬부랑 새우, 맛있겠군!",167,2,300),"sell","line1",sCi("막대 맛조개","바닥에서 푸른막대맛조개 세 개 잡아 와라!","국에 넣으면 시원하겠군!",171,3,300),eCi("상류 도감","서리강 상류에 사는 물고기를 도감에 다 채우고, 퀘스트의 수역 칸에서 받아 봐라.","상류는 이제 네 바다다!",0,30),nCi("왕년의 낚시왕","얼음 샛강의 그루마 할머니는 왕년의 낚시왕이시다. 인사드려라.","보르칸 그 꼬맹이가 보냈다고?","gruma")],[sCi("낚싯대 장식","내 낚싯대에 달 장식이 필요해. 물소용돌이고둥 세 개, 중층이야.","그래, 이 소리야. 손맛이 난다.",174,3,400),sCi("가시복 백 마리","서리가시복은 물 위쪽에서 잡는 거야. 내 젊을 땐 하루에 백 마리였지. 두 마리만 해 봐.","흠, 나쁘지 않아. 낚시왕 될 상이야.",155,2,600),sCi("빗해파리","물줄무늬빗해파리는 달빛 물때 중층에 떠. 한 마리만 보여 줘.","줄무늬가 무지개처럼 반짝이지?",191,1,600),"rod1","icebox1","boat1",eCi("얼음 샛강 도감","얼음 샛강 물고기를 도감에 다 채워 봐.","샛강은 네 손바닥 안이구나.",1,30),eCi("눈보라 너른 못 도감","눈보라 너른 못 물고기도 다 채워 봐.","눈보라 속에서도 다 찾았구나!",2,30),nCi("국수 국물","흰 소의 우동이 국수 국물 재료를 찾는다더라.","할머니 손님이면 국수 곱빼기!","udong")],[iCi("국물 맛 물","늑대 실개천 물이 국물 맛을 낸대. 거기서 아무 물고기나 세 마리 잡아 줘.","이 물 냄새, 국물 맛이 나는데?",3,400,3),sCi("학공치 고명","국수 고명은 물창학공치지! 물 위쪽에서 두 마리.","고명이 반짝반짝!",157,2,900),sCi("삿갓조개 국물","서리삿갓조개로 국물을 낼 거야. 바닥에서 세 개!","국물이 시원해!",173,3,500),sCi("갑옷 군부","남빛갑옷군부는 바위 바닥에 붙어 있어. 두 마리 떼어 와 줘.","쫄깃쫄깃 씹는 맛!",176,2,800),"reel1","bobber1",sCi("찌릿한 국물","찌릿한 국물을 만들 거야! 물방울전기가오리는 늑대 실개천이나 바위 샛강 바닥에 있어.","찌릿찌릿! 신메뉴 완성이다!",154,1,1200),"harpoon","hunt",nCi("게 동호회","얼음꽃 웅덩이의 크라라가 게 동호회를 한대. 가 봐!","새 회원이다! 환영해!","krara")],[sCi("거북손 모으기","서리꽃거북손은 안개 낀 날 물 위쪽에 붙어 있어! 세 개 모아 줘!","거북손도 게 친구야!",168,3,1e3),sCi("말미잘 친구","게는 말미잘이랑 친해. 바닥에서 물방울말미잘 세 개!","게들이 좋아하겠다!",192,3,600),sCi("방울 도치","방울혹도치는 안개 낀 날 중층에 나와. 한 마리만 보여 줘!","방울이 딸랑딸랑!",159,1,1200),sCi("둥실 해달","둥실배해달은 흰 소나 하류 수면에 둥실 떠 있대. 한 마리만!","배를 두드리며 떠 있어! 귀여워!",188,1,1500),"contest","auto1","line2",eCi("얼음꽃 웅덩이 도감","얼음꽃 웅덩이 물고기를 도감에 다 채워 봐!","웅덩이 회장님이다!",7,50),sCi("서리강의 톱","하류 바닥에 톱 같은 주둥이 상어가 산대! 새벽 안개가 낄 때만 나온대! 튼튼한 줄을 챙겨!","우와, 진짜 톱이야! 서리강 최고 낚시꾼!",152,1,5e3,300)]]; + function cCi(t,i){ + return i.map((i,s)=>{ + const e=XTi[t].npcs[s].id; + let n=0; + return i.map(i=>"string"==typeof i?{ + ...tCi[i],npc:e} + :{ + ...i,id:`${ + t} + :${ + e} + :${ + ++n} + `,npc:e} + )} + )} + Qt(cCi,"build"); + const lCi={ + "인간":cCi("인간",hCi),"엘프":cCi("엘프",rCi),"언데드":cCi("언데드",oCi),"오크":cCi("오크",aCi)} + ,uCi=new Map; + for(const Set of uSi)for(const t of lCi[Set])for(const i of t)i.teach||uCi.set(i.id,i); + for(const Set of Object.values(tCi))uCi.set(Set.id,Set); + const dCi=new Map([["sell","line1"],["rod1","icebox1","boat1"],["reel1","bobber1","harpoon","hunt"],["contest","auto1","line2"]].flatMap((t,i)=>t.map(t=>[`teach:${ + t} + `,i]))),fCi=Qt(()=>({ + held:[],done:[],met:[]} + ),"freshQuestLog"),pCi=Qt((t,i,s)=>(lCi[t][i]??[]).filter(i=>!i.teach||t===s),"chapterQuests"),gCi=Qt(t=>uCi.get(t)??null,"questDef"); + function wCi(t,i){ + const s=dCi.get(t); + if(void 0!==s)return{ + race:i,ci:s} + ; + const e=t.split(":")[0]; + if(!lCi[e])return null; + const n=lCi[e].findIndex(i=>i.some(i=>i.id===t)); + return n<0?null:{ + race:e,ci:n} + } + function mCi(t,i){ + return"meet"===t.kind?t.to:t.teach?XTi[i].npcs[dCi.get(t.id)??0].id:t.npc} + Qt(wCi,"questRiver"),Qt(mCi,"questTurnIn"); + const vCi=Qt(t=>"meet"===t.kind?0:"any"===t.kind||"fish"===t.kind||"sell"===t.kind?t.count:1,"questNeed"),_Ci=Qt(t=>t.id.split(":")[0],"riverOf"); + function MCi(t,i,s){ + const e=t.held.find(t=>t.id===i.id); + return e?"gear"===i.kind?s.gear[i.gear]>=i.level?1:0:"area"===i.kind?s.areaClaimed.includes(xTi(_Ci(i),"R",i.point))?1:0:"contest"===i.kind?Math.max(e.got,s.contestToday?1:0):Math.min(e.got,vCi(i)):0} + Qt(MCi,"questGot"); + const bCi=Qt((t,i,s)=>t.held.some(t=>t.id===i.id)&&MCi(t,i,s)>=vCi(i),"questReady"),yCi=Qt((t,i,s)=>{ + var e; + return(null==(e=XTi[i].npcs[0])?void 0:e.id)===s||t.met.includes(s)} + ,"npcMet"); + function ECi(t,i,s,e){ + var n; + const h=(null==(n=XTi[i])?void 0:n.npcs.findIndex(t=>t.id===s))??-1; + if(h<0||!yCi(t,i,s))return[]; + const r=pCi(i,h,e),o=[],a=Qt(i=>t.done.includes(i)||t.held.some(t=>t.id===i),"taken"); + for(const c of r)if(!a(c.id)&&!("meet"===c.kind&&r.filter(i=>"meet"!==i.kind&&!t.done.includes(i.id)).length>2)&&(o.push(c),o.length>=3))break; + return o} + function ACi(t,i){ + if(!i.broken)for(const s of t.held){ + const t=gCi(s.id); + if(!t)continue; + const e=vCi(t); + "fish"===t.kind&&i.id===t.fish?s.got=Math.min(e,s.got+1):"any"!==t.kind||i.race!==_Ci(t)||"R"!==i.zone||void 0!==t.point&&i.point!==t.point||(s.got=Math.min(e,s.got+1))} + } + function SCi(t,i){ + var s; + const e=i&&t.held.some(t=>t.id===i)?i:null==(s=t.held[0])?void 0:s.id; + return e?gCi(e):null} + Qt(ECi,"questOffers"),Qt(ACi,"questOnCatch"),Qt(SCi,"trackedQuest"); + const TCi=Qt(t=>{ + var i; + return(null==(i=uSi.map(i=>XTi[i].npcs.find(i=>i.id===t)).find(Boolean))?void 0:i.name)??t} + ,"npcName"),CCi=["gear","sell","harpoon","contest","area"]; + function OCi(t,i){ + const s=vCi(t),e=Math.min(i,s); + switch(t.kind){ + case"fish":{ + const i=kSi(t.fish); + return{ + text:`${ + i.name} + ${ + e} + /${ + s} + 마리`,ask:`${ + i.name} + ${ + s} + 마리`,done:`${ + i.name} + ${ + s} + 마리 다 잡았어요`,hint:i.pts.length>=9?"이 강 어디서나":`${ + RSi(i.race,i.zone,i.pts[0])} + 근처`} + } + case"any":{ + const i=void 0!==t.point?RSi(t.id.split(":")[0],"R",t.point):null; + return{ + text:`${ + i?`${ + i} + 에서 `:""} + 아무 물고기 ${ + e} + /${ + s} + 마리`,ask:`${ + i?`${ + i} + 에서 `:""} + 아무 물고기 ${ + s} + 마리`,done:"다 잡았어요",hint:i??"이 강 어디서나"} + } + case"sell":return{ + text:`물고기 팔기 ${ + e.toLocaleString()} + /${ + s.toLocaleString()} + 골드`,ask:`물고기 ${ + s.toLocaleString()} + 골드어치 팔기`,done:"다 팔았어요",hint:"[어망]에서"} + ; + case"gear":{ + const i=WSi.find(i=>i.key===t.gear); + return{ + text:`${ + i.title} + → ${ + i.names[t.level]} + `,ask:`${ + i.title} + 을 ${ + i.names[t.level]} + 로`,done:`${ + i.names[t.level]} + 로 바꿨어요`,hint:"boat"===t.gear?"[장비] › 내 배에서":"[장비] › 낚시 도구에서"} + } + case"harpoon":return{ + text:"작살 만들기",ask:"작살 하나 만들기",done:"작살을 만들었어요",hint:"[작살] 단추에서"} + ; + case"hunt":return{ + text:"몬스터에게 작살 던지기",ask:"몬스터에게 작살 한 번 던지기",done:"작살을 던졌어요",hint:"큰 그림자가 지나갈 때"} + ; + case"contest":return{ + text:"오늘 대회 참가",ask:"오늘 대회에 참가하기",done:"대회에 참가했어요",hint:"[퀘스트] › 대회에서"} + ; + case"area":{ + const i=RSi(t.id.split(":")[0],"R",t.point); + return{ + text:`${ + i} + 수역 클리어`,ask:`${ + i} + 수역 클리어 받기`,done:"수역을 채웠어요",hint:"[퀘스트] › 수역에서"} + } + case"meet":return{ + text:`${ + TCi(t.to)} + 에게 가기`,ask:`${ + TCi(t.to)} + 에게 가서 인사하기`,done:"인사했어요",hint:"배를 몰고 가서 말을 걸어요"} + } + } + function ICi(t,i,s,e,n=[]){ + return fAi(t,i,s,e,n)} + function kCi(t,i,s){ + return t?t.c!==i.castAt?[]:t.ks.filter(t=>t<i.k&&!s.includes(t)):[]} + function RCi(t,i,s,e){ + return{ + id:t.id,star:t.star,grade:t.grade,r:t.r,kg:t.kg,cm:t.cm,at:i,race:s.race,zone:s.zone,point:s.point,tide:PSi(i),broken:t.broken&&!e,manual:!0} + } + function xCi(t,i,s,e){ + if(t.qlog&&ACi(t.qlog,i),i.broken)return t.lost[i.id]=Math.max(t.lost[i.id]??0,i.kg),!1; + t.icebox.push(i); + const n=t.dex[i.id]; + return n?(n.count++,n.bestKg=Math.max(n.bestKg,i.kg),n.bestR=Math.max(n.bestR,i.r),!1):(t.dex[i.id]={ + firstDay:s,firstPoint:e,bestKg:i.kg,bestR:i.r,count:1} + ,!0)} + function PCi(t,i){ + if(!t||t.c!==i.castAt)return null; + const s=t.ks.filter(t=>t>=i.k); + return s.length?{ + c:t.c,ks:s} + :null} + function NCi(t,i){ + const s=i||"guest"; + return t.filter(t=>t===`ef2_fishing_pending_hooks_v1:${ + s} + `||t.startsWith(`fishing:fog:v1:${ + s} + :`)||t.startsWith(`fishing:spots:v1:${ + s} + :`)||t.startsWith(`fishing:fog:v2:${ + s} + :`)||t.startsWith(`fishing:spots:v2:${ + s} + :`)||"fishing.trackedQuest"===t||t===`fishing.plunder.seen.${ + i} + `||"fishing.plunder.hint"===t)} + Qt(OCi,"questObjective"),Qt(ICi,"biteTime"),Qt(kCi,"lostHooks"),Qt(RCi,"ticketCatch"),Qt(xCi,"applyLocalCatch"),Qt(PCi,"pruneHooks"),Qt(NCi,"fishingLocalKeys"); + const LCi=class t extends eN{ + constructor(){ + super(...arguments),Zt(this,"have",null),Zt(this,"hooks",null),Zt(this,"beforeSend",null)} + url(t){ + return`${ + LP.baseURL} + /minigame/fishing/${ + t} + `} + async send(i,s={ + } + ,e=!1){ + var n; + !t.NO_FLUSH.has(i)&&this.beforeSend&&await this.beforeSend(); + const h=null==(n=this.have)?void 0:n.call(this); + return this.post(this.url(i),h?{ + ...s,have:h} + :s,e)} + sync(t,i=!0){ + var s; + const e=null==(s=this.hooks)?void 0:s.call(this); + return this.send("sync",{ + ...t?{ + pos:t} + :{ + } + ,...i?{ + } + :{ + others:!1} + ,...e?{ + hooks:e} + :{ + } + } + )} + cast(t){ + return this.send("cast",t?{ + pos:t} + :{ + } + )} + hook(t,i){ + return this.send("hook",i?{ + k:t,pos:i} + :{ + k:t} + )} + awayReport(){ + return this.send("awayReport")} + move(t,i,s,e){ + return this.send("move",{ + race:t,zone:i,point:s,depth:e} + )} + sell(t){ + return this.send("sell",{ + key:t} + )} + sellAll(){ + return this.send("sellAll",{ + } + ,!0)} + sellKeys(t){ + return this.send("sellKeys",{ + keys:t} + ,!0)} + sellFish(t){ + return this.send("sellFish",{ + fish:t} + ,!0)} + aquariumPut(t){ + return this.send("aquariumPut",{ + key:t} + )} + aquariumPutFish(t){ + return this.send("aquariumPut",{ + fish:t} + )} + aquariumTake(t){ + return this.send("aquariumTake",{ + index:t} + )} + aquariumExpand(){ + return this.send("aquariumExpand",{ + } + ,!0)} + upgrade(t){ + return this.send("upgrade",{ + key:t} + ,!0)} + buy(t){ + return this.send("buy",{ + id:t} + ,!0)} + exchange(t,i,s,e){ + return this.send("exchange",{ + seasonId:t,rev:i,kindNum:s,qty:e} + ,!0)} + life(){ + return this.send("life")} + dailyClaim(t){ + return this.send("daily/claim",{ + day:t} + ,!0)} + joinContest(){ + return this.send("joinContest",{ + } + ,!0)} + socialStatus(){ + return this.send("social/status")} + socialJoin(){ + return this.send("social/join",{ + } + ,!0)} + socialClaim(t){ + return this.send("social/claim",{ + ids:t} + ,!0)} + huntPing(){ + return this.send("hunt/ping")} + huntAim(t){ + return this.send("hunt/aim",{ + pingId:t} + )} + huntShot(t,i){ + return this.send("hunt/shot",{ + aimId:t,...i?{ + pos:i} + :{ + } + } + )} + claimContest(){ + return this.send("claimContest",{ + } + ,!0)} + deliver(t){ + return this.send("deliver",{ + key:t} + )} + claimMilestone(t,i){ + return this.send("claimMilestone",{ + kind:t,idx:i} + )} + questAccept(t,i,s){ + return this.send("quest/accept",{ + id:t,race:i,npc:s} + )} + questAbandon(t){ + return this.send("quest/abandon",{ + id:t} + )} + questComplete(t){ + return this.send("quest/complete",{ + id:t} + )} + areaClaim(t,i,s){ + return this.send("area/claim",{ + race:t,zone:i,point:s} + )} + guideSeen(t){ + return this.send("guideSeen",t?{ + tip:t} + :{ + } + )} + look(t){ + return this.send("look",{ + look:t} + ,!0)} + plunderPeek(t,i){ + return this.send("plunder/peek",i?{ + target:t,pos:i} + :{ + target:t} + )} + plunderStart(t,i){ + return this.send("plunder/start",i?{ + target:t,pos:i} + :{ + target:t} + ,!0)} + plunderStop(t){ + return this.send("plunder/stop",t?{ + pos:t} + :{ + } + )} + plunderCut(){ + return this.send("plunder/cut",{ + } + )} + tradeRequest(t,i){ + return this.send("trade/request",i?{ + target:t,pos:i} + :{ + target:t} + )} + tradeAnswer(t,i,s){ + return this.send("trade/answer",s?{ + room:t,yes:i,pos:s} + :{ + room:t,yes:i} + )} + tradeOffer(t,i){ + return this.send("trade/offer",{ + room:t,refs:i} + )} + tradeReady(t,i,s,e){ + return this.send("trade/ready",e?{ + room:t,ok:i,ver:s,pos:e} + :{ + room:t,ok:i,ver:s} + )} + tradeCancel(t){ + return this.send("trade/cancel",{ + room:t} + )} + tradeEmote(t,i){ + return this.send("trade/emote",{ + room:t,e:i} + )} + tradePoll(){ + return this.send("trade/poll",{ + } + )} + huntThrow(t,i){ + return this.send("hunt/throw",i?{ + grade:t,pos:i} + :{ + grade:t} + )} + huntStatus(){ + return this.send("hunt/status")} + huntCraft(t,i){ + return this.send("hunt/craft",{ + kind:t,n:i} + )} + gearPull(t){ + return this.send("gear/pull",{ + n:t} + )} + gearMerge(t,i,s=!1){ + return this.send("gear/merge",s?{ + all:!0} + :{ + slot:t,star:i} + )} + gearMergeGroups(t){ + return this.send("gear/merge",{ + groups:t} + )} + gearKeep(t,i){ + return this.send("gear/keep",{ + uid:t,on:i} + )} + gearEquip(t,i){ + return this.send("gear/equip",null===t?{ + uid:null,slot:i} + :{ + uid:t} + )} + gearEquipBest(){ + return this.send("gear/equipBest",{ + } + )} + huntUse(t){ + return this.send("hunt/use",{ + kind:t} + )} + boatRepair(t,i){ + return this.send("boat/repair",i?{ + action:t,pos:i} + :{ + action:t} + )} + boatHelp(t,i){ + return this.send("boat/help",i?{ + target:t,pos:i} + :{ + target:t} + )} + dev(t,i={ + } + ){ + return this.send("dev",{ + action:t,...i} + )} + } + ; + Qt(LCi,"FishingService"),Zt(LCi,"NO_FLUSH",new Set(["sync","hunt/status","life","trade/poll","trade/emote","trade/cancel","trade/answer"])); + let DCi=LCi; + const GCi=[{ + id:"hello",prog:0,kind:"talk"} + ,{ + id:"hello2",prog:0,kind:"talk"} + ,{ + id:"goal",prog:0,kind:"goal"} + ,{ + id:"sailing",prog:0,kind:"wait"} + ,{ + id:"rod",prog:1,kind:"rod"} + ,{ + id:"wait",prog:1,kind:"wait"} + ,{ + id:"bite",prog:2,kind:"bite"} + ,{ + id:"caught",prog:2,kind:"talk"} + ,{ + id:"idle",prog:2,kind:"talk"} + ,{ + id:"movebtn",prog:3,kind:"btn"} + ,{ + id:"sea",prog:3,kind:"sea"} + ,{ + id:"done",prog:3,kind:"talk"} + ,{ + id:"end",prog:3,kind:"end"} + ],BCi=["sail","rod","bite","move"],UCi=Qt((t,i)=>({ + info:i?1-t:1,menu:1-t} + ),"immersionAlpha"),FCi=["배 몰기","낚시 시작","챔질","다시 이동"],$Ci=Qt(t=>{ + var i; + return(null==(i=GCi[GCi.findIndex(i=>i.id===t)+1])?void 0:i.id)??null} + ,"nextStep"),HCi=Qt(t=>GCi.find(i=>i.id===t),"tutStep"),WCi=1700,VCi=1400; + function jCi(t){ + const i=XTi[t].npcs; + return i.find(t=>t.ship)??i[0]} + Qt(jCi,"tutorialCaptain"); + const KCi=Qt((t,i,s)=>{ + const e=t.charCodeAt(t.length-1); + return`${ + t} + ${ + e>=44032&&e<=55203&&(e-44032)%28==0?s:i} + `} + ,"withJosa"),zCi={ + ben:{ + hello:"어서 오게, 새 낚시꾼!\n나는 벤 선장일세.",hello2:"본격적으로 낚시하기 전에\n배 모는 법부터 익혀 보세.",goal:"금빛 고리가 보이지?\n눌러서 배를 옮겨 보게.",sailing:"그렇지! 배는 누른 곳까지\n알아서 간다네.",rod:"멈추면 머리 위에 낚싯대가 뜨지.\n낚싯대를 누르면 찌를 던져 준다네.",wait:"물고기가 물 때까지\n조금만 기다려 보게…",bite:"지금이야!\n누르게!",caught:"첫 물고기로군! 축하하네.",idle:"가만 둬도 물고기는 잡히네.\n느낌표 때 누르면 훨씬 빨라지지!",movebtn:"낚시를 하다가 이동하려면\n[이동] 버튼을 누르게.",sea:"이제 가고 싶은 물을\n아무 데나 눌러 보게.",done:"좋아, 다 배웠네!",end:"자, 이제 내 배로 가세.\n거기서 첫 부탁을 주겠네!",missed:"놓쳤군! 괜찮네.\n다음 느낌표 때 눌러 보게.",fishA:"이야.",fishB:"야."} + ,lilien:{ + hello:"어서 와요, 새 낚시꾼!\n나는 릴리엔 선장이에요.",hello2:"본격적으로 낚시하기 전에\n배 모는 법부터 익혀 봐요.",goal:"금빛 고리가 보이죠?\n눌러서 배를 옮겨 봐요.",sailing:"좋아요! 배는 누른 곳까지\n알아서 가요.",rod:"멈추면 머리 위에 낚싯대가 떠요.\n낚싯대를 누르면 찌를 던져 줄게요.",wait:"물고기가 물 때까지\n조금만 기다려 봐요…",bite:"지금이에요!\n눌러요!",caught:"첫 물고기네요! 축하해요.",idle:"가만 둬도 물고기는 잡혀요.\n느낌표 때 누르면 훨씬 빨라져요!",movebtn:"낚시를 하다가 이동하려면\n[이동] 버튼을 눌러요.",sea:"이제 가고 싶은 물을\n아무 데나 눌러 봐요.",done:"좋아요, 다 배웠어요!",end:"자, 이제 내 배로 가요.\n거기서 첫 부탁을 줄게요!",missed:"놓쳤네요! 괜찮아요.\n다음 느낌표 때 눌러 봐요.",fishA:"이에요.",fishB:"예요."} + ,charon:{ + hello:"어서 오게, 산 손님!\n잿빛강 뱃사공 카론일세.",hello2:"본격적으로 낚시하기 전에\n배 모는 법부터 익혀 보세.",goal:"금빛 고리가 보이나?\n눌러서 배를 옮겨 보게.",sailing:"그렇지! 배는 누른 곳까지\n알아서 간다네.",rod:"멈추면 머리 위에 낚싯대가 뜨지.\n낚싯대를 누르면 찌를 던져 준다네.",wait:"물고기가 물 때까지\n조금만 기다려 보게…",bite:"지금일세!\n누르게!",caught:"첫 물고기로군! 축하하네.",idle:"가만 둬도 물고기는 잡히네.\n느낌표 때 누르면 훨씬 빨라지지!",movebtn:"낚시를 하다가 이동하려면\n[이동] 버튼을 누르게.",sea:"이제 가고 싶은 물을\n아무 데나 눌러 보게.",done:"좋아, 다 배웠네!",end:"자, 이제 내 배로 가세.\n거기서 첫 부탁을 주겠네!",missed:"놓쳤군! 괜찮네.\n다음 느낌표 때 눌러 보게.",fishA:"이로군.",fishB:"로군."} + ,borkan:{ + hello:"어서 와라, 꼬마 선원!\n나는 보르칸 선장이다.",hello2:"본격적으로 낚시하기 전에\n배 모는 법부터 익혀라.",goal:"금빛 고리가 보이지?\n눌러서 배를 옮겨 봐라.",sailing:"그렇지! 배는 누른 곳까지\n알아서 간다.",rod:"멈추면 머리 위에 낚싯대가 뜬다.\n낚싯대를 누르면 찌를 던져 주마.",wait:"물고기가 물 때까지\n조금만 기다려라…",bite:"지금이다!\n눌러라!",caught:"첫 물고기다! 잘했다.",idle:"가만 둬도 물고기는 잡힌다.\n느낌표 때 누르면 훨씬 빨라지지!",movebtn:"낚시를 하다가 이동하려면\n[이동] 버튼을 눌러라.",sea:"이제 가고 싶은 물을\n아무 데나 눌러 봐라.",done:"좋아, 다 배웠다!",end:"자, 이제 내 배로 가자.\n거기서 첫 부탁을 주마!",missed:"놓쳤군! 괜찮다.\n다음 느낌표 때 눌러라.",fishA:"이군.",fishB:"군."} + } + ; + function YCi(t,i=""){ + const s=zCi[jCi(t).id]??zCi.ben,{ + fishA:e,fishB:n,...h} + =s; + return{ + ...h,caught:i?`${ + h.caught} + \n${ + KCi(i,e,n)} + `:h.caught} + } + function qCi(t){ + return!t.tutSeen&&t.look&&0===t.dex&&0===t.journeyStep&&!t.accepted} + function XCi(t,i,s=62){ + const e=[...t].length; + return e?Math.min(e,1+Math.floor(Math.max(0,i)/s)):0} + Qt(YCi,"tutorialLines"),Qt(qCi,"shouldStartTutorial"),Qt(XCi,"typedCount"); + const JCi=Qt(t=>{ + const i=Math.max(0,Math.min(1,t)); + return i*i*(3-2*i)} + ,"smooth$2"); + function QCi(t){ + const i=(t%WCi+WCi)%WCi/WCi,s=i<.4?-4*JCi(i/.4):i<.55?-4*(1-JCi((i-.4)/.15)):0; + return{ + dx:s,dy:s,scale:i<.55?1-.08*JCi(i/.55):i<.7?.92+.08*JCi((i-.55)/.15):1} + } + function ZCi(t){ + const i=(t%VCi+VCi)%VCi/VCi,s=1-(1-i)*(1-i); + return{ + r:15+35*s,alpha:.9*(1-s)} + } + Qt(QCi,"handPose"),Qt(ZCi,"ringPose"); + const tOi=[15.5,14.5,13.5,13]; + function iOi(t){ + for(const i of[!1,!0])for(const s of tOi){ + const e=t(s,i); + if(e<=3)return{ + size:s,lines:e,narrow:i,over:!1} + } + return{ + size:13,lines:t(13,!0),narrow:!0,over:!0} + } + Qt(iOi,"fitTalk"); + const sOi=["남","여"],eOi=["인간","엘프","언데드","오크"],nOi=[[16243908,15713183,14394746,6635563,14271210,12904143,11127024],[16508628,15979186,15057053,6635563,14271210,12904143,11127024],[13621467,11780556,12761299,11058350,14538182],[10475238,6077652,3975360,4165560,8366020]],hOi=[["짧은 머리","긴 머리","뒤로 묶음"],["짧은 머리","긴 머리","뒤로 묶음"]],rOi=[["short","long","pony"],["bob","long","pony"]],oOi=[2825751,7225123,12864046,15123036,15525594,4165769,4025536],aOi=[2,5,0,6],cOi=["주근깨","볼터치","수염","흉터","안경","안대","귀걸이"],lOi=[3,1,4,5,6]; + function uOi(t){ + return Array.isArray(t)?[...new Set(t.filter(t=>Number.isInteger(t)&&lOi.includes(t)))].sort((t,i)=>t-i).slice(0,2):[]} + Qt(uOi,"normalizeFeats"); + const dOi=[{ + name:"어부 조끼",hat:"none"} + ,{ + name:"비옷",hat:"rain"} + ,{ + name:"줄무늬 선원복",hat:"cap"} + ,{ + name:"후드 망토",hat:"hood"} + ],fOi=[13190973,3108771,14854458,4164186,6965898,3817290],pOi={ + sex:2,race:4,skin:7,hair:3,hairColor:7,feats:7,outfit:4,outfitColor:6,talent:4} + ,gOi={ + v:1,sex:0,race:0,skin:1,hair:0,hairColor:1,feats:[],outfit:0,outfitColor:0,talent:0} + ,wOi=Qt((t,i)=>Number.isInteger(t)&&t>=0&&t<i,"isIndex"); + function mOi(t){ + if(!t||"object"!=typeof t)return null; + for(const i of["sex","race","skin","hair","hairColor"])if(!wOi(t[i],"hair"===i?4:pOi[i]))return null; + return t.skin>=nOi[t.race].length?null:{ + v:1,sex:t.sex,race:t.race,skin:t.skin,hair:t.hair<pOi.hair?t.hair:0,hairColor:t.hairColor,feats:uOi(t.feats),outfit:0,outfitColor:0,talent:0} + } + function vOi(t){ + const i=Qt(i=>void 0===t.feats[i]?"-":String(t.feats[i]),"f"); + return`${ + t.v} + ${ + t.sex} + ${ + t.race} + ${ + t.skin} + ${ + t.hair} + ${ + t.hairColor} + ${ + i(0)} + ${ + i(1)} + ${ + t.outfit} + ${ + t.outfitColor} + ${ + t.talent} + `} + function _Oi(t){ + if("string"!=typeof t||11!==t.length||"1"!==t[0])return null; + const i=Qt(i=>"-"===t[i]?-1:Number(t[i]),"n"); + return mOi({ + sex:i(1),race:i(2),skin:i(3),hair:i(4),hairColor:i(5),feats:[i(6),i(7)].filter(t=>t>=0),outfit:i(8),outfitColor:i(9),talent:i(10)} + )} + Qt(mOi,"validLook"),Qt(vOi,"packLook"),Qt(_Oi,"unpackLook"); + const MOi=36e5,bOi=160; + function yOi(t,i){ + if(!t)return{ + n:3,nextAt:null} + ; + if(t.tickets>=3)return{ + n:3,nextAt:null} + ; + const s=Math.floor(Math.max(0,i-t.ticketAt)/MOi),e=Math.min(3,t.tickets+s),n=t.ticketAt+s*MOi; + return{ + n:e,nextAt:e>=3?null:n+MOi} + } + function EOi(t,i){ + return Math.max(0,Math.min(t.max,Math.floor((i-t.startAt)/t.every)))} + function AOi(t,i){ + const s=EOi(t,i); + return s>=t.max?0:t.startAt+(s+1)*t.every-i} + Qt(yOi,"ticketsOf"),Qt(EOi,"raidCount"),Qt(AOi,"raidNextIn"); + const SOi=Qt(t=>Math.min(.5*t.every,2e4),"leadOf"); + function TOi(t,i){ + var s; + const e=EOi(t,i),n=null==(s=t.plan)?void 0:s[e]; + if(!n||e>=t.max)return{ + level:0,p:0} + ; + const h=SOi(t),r=t.startAt+(e+1)*t.every-i; + return r>h?{ + level:0,p:0} + :{ + level:n.grade>=3?3:2===n.grade?2:1===n.grade&&aAi(t.seed+7919*e)%100<35?1:0,p:Math.max(0,Math.min(1,1-r/h))} + } + function COi(t,i){ + if(!t.net)return null; + const s=[...t.net]; + for(const e of(t.plan??[]).slice(0,EOi(t,i)))s[e.grade]=Math.max(0,s[e.grade]-1); + return s} + Qt(TOi,"raidTension"),Qt(COi,"netLeft"); + const OOi={ + EVERY_MS:18e5,DUR_MS:24e4,CD_MS:1500,SLOT_BASE:3,START_WOOD:5,STOCK_MAX:99,DMG:10,MULT:{ + perfect:3,great:2,good:1,miss:0} + ,KEY_TTL_SEC:10800,MIN_LEVEL:2} + ,IOi=["wood","iron","mithril"],kOi={ + wood:{ + kind:"wood",name:"나무 작살",mult:1,fish:3,minStar:1,gold:20} + ,iron:{ + kind:"iron",name:"쇠 작살",mult:1.6,fish:3,minStar:2,gold:200} + ,mithril:{ + kind:"mithril",name:"미스릴 작살",mult:2.5,fish:2,minStar:3,gold:1500} + } + ,ROi={ + R:[{ + kind:"catfish",name:"거대 메기"} + ,{ + kind:"eel",name:"왕장어"} + ,{ + kind:"sturgeon",name:"늙은 철갑상어"} + ],C:[{ + kind:"manta",name:"대왕 가오리"} + ,{ + kind:"turtle",name:"고대 바다거북"} + ,{ + kind:"shark",name:"백상아리"} + ,{ + kind:"whaleShark",name:"고래상어"} + ],O:[{ + kind:"whale",name:"대왕고래"} + ,{ + kind:"shark",name:"식인 상어"} + ,{ + kind:"whaleShark",name:"심해 고래상어"} + ,{ + kind:"megalodon",name:"메갈로돈"} + ]} + ,xOi=["R","C","O"].flatMap(t=>ROi[t].map(i=>({ + ...i,zone:t} + ))),POi=Qt(t=>Math.round(80*Math.pow(1.32,t-1)),"bossHp"); + function NOi(t,i,s){ + const e=FAi(t,i),n=aAi(7919*e+104729*s),h=ROi[i],r=h[n%h.length],o=s*OOi.EVERY_MS+aAi(n+3)%Math.floor(OOi.EVERY_MS/2); + return{ + w:s,at:o,end:o+OOi.DUR_MS,kind:r.kind,name:r.name,tier:e,hp:POi(e)} + } + function LOi(t,i,s){ + const e=-Math.floor(s/1e3); + return{ + ...NOi(t,i,Math.floor(s/OOi.EVERY_MS)),w:e,at:s,end:s+OOi.DUR_MS} + } + function DOi(t,i,s,e){ + const n=NOi(t,i,Math.floor(s/OOi.EVERY_MS)); + return s>=n.at&&s<n.end?n:null} + function GOi(t,i,s){ + return s&&i>=s&&i<s+OOi.DUR_MS?LOi(t.race,t.zone,s):QSi(t)>=OOi.MIN_LEVEL?DOi(t.race,t.zone,i):null} + function BOi(t,i,s){ + return GOi(t,i,s)||(QSi(t)>=OOi.MIN_LEVEL?UOi(t.race,t.zone,i):null)} + function UOi(t,i,s,e){ + const n=DOi(t,i,s); + if(n)return n; + const h=Math.floor(s/OOi.EVERY_MS),r=NOi(t,i,h); + return s<r.end?r:NOi(t,i,h+1)} + Qt(NOi,"bossOf"),Qt(LOi,"devBoss"),Qt(DOi,"bossNow"),Qt(GOi,"bossHere"),Qt(BOi,"bossNextHere"),Qt(UOi,"bossNext"); + const FOi=Qt(t=>OOi.SLOT_BASE+Math.min(3,Math.floor(t/2)),"harpoonSlots"),$Oi=Qt(t=>100*OOi.MULT[t],"throwGradePercent"),HOi=[{ + xp:0,name:"견습 작살꾼"} + ,{ + xp:100,name:"작살꾼"} + ,{ + xp:400,name:"사냥꾼"} + ,{ + xp:1200,name:"명사수"} + ,{ + xp:3e3,name:"괴물 사냥꾼"} + ,{ + xp:8e3,name:"전설의 헌터"} + ],WOi=Qt(t=>{ + var i; + let s=0; + for(; + s+1<HOi.length&&t>=HOi[s+1].xp; + )s++; + return{ + i:s,name:HOi[s].name,next:(null==(i=HOi[s+1])?void 0:i.xp)??null} + } + ,"rankOf"); + function VOi(t){ + const i=t.hunt; + return{ + stock:(null==i?void 0:i.stock)??{ + wood:OOi.START_WOOD,iron:0,mithril:0} + ,use:(null==i?void 0:i.use)??"wood"} + } + function jOi(t,i,s){ + var e; + const n=(null==(e=t.hunt)?void 0:e.thrown)&&t.hunt.thrown.w===i.w&&t.hunt.thrown.map===s?t.hunt.thrown.n:0; + return Math.max(0,FOi(t.gear.boat)-n)} + function KOi(t){ + return t.stock[t.use]>0?t.use:IOi.find(i=>t.stock[i]>0)??null} + Qt(VOi,"stockOf"),Qt(jOi,"loadedLeft"),Qt(KOi,"pickHarpoon"); + const zOi={ + perfect:.07,great:.2,good:.6} + ; + function YOi(t=0){ + const i=1+Math.max(0,t)/100; + return{ + perfect:Math.min(.16,zOi.perfect*i),great:Math.min(.34,zOi.great*i),good:Math.min(.8,zOi.good*i)} + } + Qt(YOi,"gaugeRangeFor"); + const qOi=Qt((t,i=zOi)=>{ + const s=Math.abs(t); + return s<=i.perfect?"perfect":s<=i.great?"great":s<=i.good?"good":"miss"} + ,"gaugeGrade"),XOi={ + AQUARIUM_SLOTS:[10,15,20],AQUARIUM_PRICES:[0,5e3,2e4],KEEP_STAR:4,KEEP_GRADE:2} + ,JOi=Qt(t=>`${ + t.id} + :${ + t.grade} + `,"fishKey"),QOi=Qt(t=>vTi(t.id,t.grade,t.r),"fishValue"),ZOi=Qt(t=>({ + id:t.id,grade:t.grade,at:t.at,kg:t.kg} + ),"fishRef"),tIi=Qt(t=>kSi(t.id).star>=XOi.KEEP_STAR||t.grade>=XOi.KEEP_GRADE,"keepable"),iIi=Qt(t=>XOi.AQUARIUM_SLOTS[Math.min(t,XOi.AQUARIUM_SLOTS.length-1)],"aquariumCap"); + function sIi(t){ + const i=new Map; + for(const s of t){ + if(s.broken)continue; + const t=JOi(s),e=i.get(t)??{ + key:t,id:s.id,grade:s.grade,count:0,value:0,bestKg:0} + ; + e.count++,e.value+=QOi(s),e.bestKg=Math.max(e.bestKg,s.kg),i.set(t,e)} + return[...i.values()]} + function eIi(t){ + const i=t.now+t.heartbeatMs; + if(!t.open)return i; + let s=i; + return null!==t.autoAt&&(s=Math.min(s,t.autoAt-t.offset+400)),null!==t.hazardAt&&(s=Math.min(s,t.hazardAt-t.offset+500)),null!==t.repairEndAt&&(s=Math.min(s,t.repairEndAt-t.offset+500)),s} + Qt(sIi,"netGroups"),Qt(eIi,"nextSyncAt"); + const nIi=160,hIi=[["👍","좋아요"],["🤔","글쎄요"],["☝️","하나만 더"],["🙏","부탁해요"],["😅","너무 비싸요"],["⏳","잠깐만요"],["😊","고마워요"],["👋","다음에 해요"]],rIi=Qt((t,i)=>({ + src:i,id:t.id,grade:t.grade,at:t.at,kg:t.kg,r:t.r} + ),"refOf"),oIi=Qt((t,i)=>t.src===i.src&&t.id===i.id&&t.grade===i.grade&&t.at===i.at&&t.kg===i.kg,"sameRef"); + function aIi(t,i,s,e,n,h){ + const r=i-t+n.filter(t=>"net"===t.src).length; + let o=e-s+n.filter(t=>"aq"===t.src).length; + const a=o; + let c=0,l=0; + for(const u of h)"aq"===u.src&&tIi(u)&&o>0?(o--,c++):l++; + return{ + ok:l<=r,short:Math.max(0,l-r),toNet:l,toAq:c,netFree:r,aqFree:a} + } + Qt(aIi,"roomFit"); + const cIi=Qt((t,i)=>Math.max(0,10-((null==t?void 0:t.day)===i?t.n:0)),"tradeLeft"),lIi=Qt(t=>Math.max(0,Math.min(1,t)),"clamp01$4"),uIi=Qt(t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,"ease"),dIi=Qt(t=>1-Math.pow(1-t,3),"easeOut"); + function fIi(t){ + return{ + lift:lIi(t/.2)*(1-lIi((t-.9)/.2)),spin:uIi(lIi(t/.4)),cross:uIi(lIi((t-.2)/.7)),pop:t<.9?0:Math.sin(Math.PI*lIi((t-.9)/.2)),dim:dIi(lIi((t-1.1)/.3)),result:dIi(lIi((t-1.1)/.5))} + } + Qt(fIi,"tradeSwapPose"); + const pIi=[{ + key:"contest",goal:1} + ,{ + key:"catch",goal:30} + ,{ + key:"hunt",goal:1} + ,{ + key:"sell",goal:5e3} + ],gIi={ + contest:"오늘 대회 참가하기",visit:"손님 부탁 들어주기",catch:"직접 낚기",hunt:"몬스터에게 작살 던지기",sell:"물고기 팔기"} + ,wIi=Qt(()=>({ + contest:0,visit:0,catch:0,hunt:0,sell:0} + ),"zero"),mIi=Qt(t=>pIi.every(i=>t.n[i.key]>=i.goal),"dailyDone"),vIi=Qt((t,i)=>t&&t.day===i?t:{ + day:i,n:wIi(),claimed:!1} + ,"dailyToday"); + function _Ii(t,i){ + const s=pIi.find(i=>i.key===t).goal,e=Math.min(Math.floor(i),s); + return"sell"===t?`${ + gIi[t]} + ${ + e.toLocaleString()} + /${ + s.toLocaleString()} + 골드`:`${ + gIi[t]} + ${ + e} + /${ + s} + `} + Qt(_Ii,"dailyLine"); + const MIi={ + contest:"contest",visit:"visit",catch:"fish",hunt:"hunt",sell:"net"} + ; + function bIi(t){ + if(t.boatBroken)return{ + kind:"repair",title:"배가 고장 났어요",sub:"눌러서 고치기",go:"repair"} + ; + if(t.netFull)return{ + kind:"net",title:"어망이 가득 찼어요",sub:"어망을 비워야 더 잡혀요",go:"net"} + ; + if(t.contestReady)return{ + kind:"contest",title:"대회 결과가 나왔어요",sub:"눌러서 받기",go:"contest"} + ; + const i=t.daily??{ + n:wIi(),claimed:!1} + ; + if(!t.dailyOff&&mIi(i)&&!i.claimed)return{ + kind:"claim",title:"오늘 할 일 끝! 상자 받기",sub:"진주 200",go:"claim"} + ; + if(t.journeyReady)return{ + kind:"journeyReady",title:"여정 · 다 했어요",sub:`${ + t.journeyReady.npc} + 에게 돌아가기`,go:"journey"} + ; + if(t.goalsReady>0)return{ + kind:"goal",title:`업적 ${ + t.goalsReady} + 개 받기`,sub:"진주가 기다려요",go:"goal"} + ; + if(t.areaReady)return{ + kind:"area",title:"수역 클리어! 진주 받기",sub:`${ + t.areaReady.name} + · 진주 ${ + t.areaReady.pearl} + `,go:"area"} + ; + if(t.monster&&t.monster.inMs<=3e5)return t.monster.inMs<=0?{ + kind:"hunt",title:`${ + t.monster.name} + 지나가는 중!`,sub:"작살을 던져요",go:"hunt"} + :{ + kind:"hunt",title:`${ + t.monster.name} + 곧 와요`,sub:`${ + Math.ceil(t.monster.inMs/6e4)} + 분 뒤`,go:"hunt"} + ; + if(t.journeyHere&&t.journeyNext)return{ + kind:"journey",title:t.journeyNext.title,sub:t.journeyNext.line,go:"journey"} + ; + const s=t.dailyOff?void 0:pIi.find(t=>i.n[t.key]<t.goal); + if(s){ + const t=pIi.filter(t=>i.n[t.key]>=t.goal).length; + return{ + kind:"daily",title:`오늘 할 일 ${ + t} + /${ + pIi.length} + `,sub:_Ii(s.key,i.n[s.key]),go:MIi[s.key]} + } + return t.journeyNext?{ + kind:"journey",title:t.journeyNext.title,sub:t.journeyNext.line,go:"journey"} + :t.areaNext?{ + kind:"areaNext",title:`수역 도감 ${ + t.areaNext.have} + /${ + t.areaNext.need} + `,sub:`${ + t.areaNext.name} + 물고기 채우기`,go:"area"} + :t.dailyOff?{ + kind:"done",title:"수역 도감 채우기",sub:"다른 지역 물고기도 모아 보세요",go:"area"} + :{ + kind:"done",title:"오늘 할 일을 다 했어요",sub:"대물을 노려 보세요",go:"today"} + } + function yIi(t){ + const i={ + today:t.dailyClaimable,contest:t.contestReady,visit:t.visitDeliverable,goal:t.goalsReady>0,area:!!t.areaReady} + ; + return{ + tank:t.netFull&&!t.onTank,quest:i.today||i.contest||i.visit||i.goal||i.area,seg:i} + } + function EIi(t,i,s,e){ + return Array.from({ + length:9} + ,(n,h)=>{ + const r=PTi(t,i,h),o=r.filter(t=>!s[t.id]),a=xTi(t,i,h),c=e.includes(a); + return{ + race:t,zone:i,point:h,idx:a,name:RSi(t,i,h),level:QSi({ + zone:i,point:h} + ),pearl:NTi(i,h),species:r,have:r.length-o.length,need:r.length,missing:o,claimed:c,ready:!c&&0===o.length} + } + )} + function AIi(t,i,s,e){ + const n=[[t,i],...uSi.flatMap(t=>dSi.map(i=>[t,i])).filter(([s,e])=>s!==t||e!==i)]; + for(const[h,r]of n){ + const t=EIi(h,r,s,e).find(t=>t.ready); + if(t)return t} + return null} + function SIi(t,i,s,e){ + const n=EIi(t,i,s,e).filter(t=>!t.claimed&&t.missing.length>0); + return n.sort((t,i)=>t.missing.length-i.missing.length||t.point-i.point),n[0]??null} + Qt(bIi,"nextTask"),Qt(yIi,"fishingDots"),Qt(EIi,"areaRows"),Qt(AIi,"areaReady"),Qt(SIi,"areaNext"); + const TIi=["dex","icebox","aquarium","lost","cups","history","quests","contest"],CIi=Qt(()=>`ef2_fishing_pending_hooks_v1:${ + EG.userId||"guest"} + `,"pendingKey"); + function OIi(){ + try{ + const t=JSON.parse(localStorage.getItem(CIi())??"null"); + return t&&Number.isFinite(t.c)&&Array.isArray(t.ks)?t:null} + catch{ + return null} + } + function IIi(t){ + try{ + t?localStorage.setItem(CIi(),JSON.stringify(t)):localStorage.removeItem(CIi())} + catch{ + } + } + Qt(OIi,"loadPending"),Qt(IIi,"savePending"); + const kIi=class t{ + constructor(){ + Zt(this,"state"),Zt(this,"ready",!1),Zt(this,"season",null),Zt(this,"social",null),Zt(this,"socialRefreshing",!1),Zt(this,"socialRefreshAt",0),Zt(this,"shop",[]),Zt(this,"life",null),Zt(this,"newSeason",null),Zt(this,"seasonListeners",new Set),Zt(this,"feed",[]),Zt(this,"active",!1),Zt(this,"open",!1),Zt(this,"api",Object.assign(new DCi,{ + have:Qt(()=>this.haveRev(),"have"),hooks:Qt(()=>this.pending,"hooks"),beforeSend:Qt(()=>this.flushHooks(),"beforeSend")} + )),Zt(this,"pending",null),Zt(this,"ticket",null),Zt(this,"ticketCast",-1),Zt(this,"serverHeavy",{ + } + ),Zt(this,"flushing",null),Zt(this,"onHidden","undefined"!=typeof document?document.addEventListener("visibilitychange",()=>{ + "hidden"===document.visibilityState&&this.flushHooks()} + ):void 0),Zt(this,"others",[]),Zt(this,"othersAt",0),Zt(this,"crowd",null),Zt(this,"posProvider",null),Zt(this,"offset",0),Zt(this,"syncing",!1),Zt(this,"nextSyncAt",0),Zt(this,"hooked",{ + castAt:-1,k:-1} + ),Zt(this,"listeners",new Set),Zt(this,"catchListeners",new Set),Zt(this,"noticeListeners",new Set),Zt(this,"boatListeners",new Set),Zt(this,"boatSeenAt",-1),Zt(this,"trade",null),Zt(this,"tradePreview",!1),Zt(this,"tradeListeners",new Set),Zt(this,"pollAt",0),Zt(this,"polling",!1),Zt(this,"tradeClosed",new Set),Zt(this,"onBigMove",null),Zt(this,"trackedId",(()=>{ + try{ + return localStorage.getItem("fishing.trackedQuest")} + catch{ + return null} + } + )()),Zt(this,"seenTips",new Set),Zt(this,"eventDays",10),Zt(this,"boatRule",DAi)} + static getInstance(){ + return this.instance??(this.instance=new t)} + onSeasonChange(t){ + return this.seasonListeners.add(t),()=>this.seasonListeners.delete(t)} + phase(){ + var t; + return(null==(t=this.season)?void 0:t.phase)??"open"} + async flushHooks(){ + var t,i,s; + for(let e=0; + e<3; + e++){ + if(!this.ready||!(null==(t=this.pending)?void 0:t.ks.length))return; + const e=new Set(this.pending.ks); + if(await(this.flushing??(this.flushing=this.call(this.api.sync(null==(i=this.posProvider)?void 0:i.call(this),this.active)).then(()=>{ + } + ,()=>{ + } + ).finally(()=>{ + this.flushing=null} + ))),!(null==(s=this.pending)?void 0:s.ks.some(t=>!e.has(t))))return} + } + hookedKs(t=this.state){ + var i; + const s=null==t?void 0:t.seq; + return s?[...s.hooks??[],...(null==(i=this.pending)?void 0:i.c)===s.castAt?this.pending.ks:[]]:[]} + ticketFish(t){ + var i; + const s=this.ticket,e=null==(i=this.state)?void 0:i.seq; + if(!s||!e||this.ticketCast!==e.castAt)return null; + const n=t-s.k0; + return n>=0&&n<s.fish.length?s.fish[n]:null} + localCatch(t,i){ + t.icebox===this.serverHeavy.icebox&&(t.icebox=t.icebox.slice()),t.dex===this.serverHeavy.dex&&(t.dex=Object.fromEntries(Object.entries(t.dex).map(([t,i])=>[t,{ + ...i} + ]))),t.lost===this.serverHeavy.lost&&(t.lost={ + ...t.lost} + ); + const s=Math.floor((i.at-t.startAt)/864e5)+1,e=xCi(t,i,s,RSi(i.race,i.zone,i.point)),n=t.daily&&vIi(t.daily,t.dailyUtc?UTi(i.at-t.devOffset):s); + return!i.broken&&n&&t.daily&&n===t.daily&&(t.daily={ + ...t.daily,n:{ + ...t.daily.n,catch:t.daily.n.catch+1} + } + ),e} + haveRev(){ + const t=this.state,i=null==t?void 0:t.rev; + if(!t||!i)return; + const s={ + } + ; + for(const e of TIi)e in t&&"number"==typeof i[e]&&(s[e]=i[e]); + return s} + onChange(t){ + return this.listeners.add(t),()=>this.listeners.delete(t)} + onCatch(t){ + return this.catchListeners.add(t),()=>this.catchListeners.delete(t)} + onNotice(t){ + return this.noticeListeners.add(t),()=>this.noticeListeners.delete(t)} + notice(t){ + for(const i of this.noticeListeners)i(t)} + onBoatLog(t){ + return this.boatListeners.add(t),()=>this.boatListeners.delete(t)} + touch(){ + for(const t of this.listeners)t()} + apply(t){ + var i,s,e,n,h,r,o,a; + if(!(null==t?void 0:t.success))return{ + message:(null==(s=null==(i=null==t?void 0:t.header)?void 0:i.errorInfo)?void 0:s.additional)??(null==(n=null==(e=null==t?void 0:t.header)?void 0:e.errorInfo)?void 0:n.message)??"연결이 원활하지 않아요"} + ; + const c=t.body,l=null==(h=this.season)?void 0:h.id,u=null==(r=c.season)?void 0:r.id,d=null!=l&&null!=u&&u<l,f=l===u&&(null==(o=c.state)?void 0:o.social)&&(null==(a=this.state)?void 0:a.social)&&(c.state.social.revision??0)<(this.state.social.revision??0); + if(d||f)return{ + message:c.message??null,result:c.result} + ; + if(c.season){ + const t=this.season; + if(this.season=c.season,t&&(t.phase!==c.season.phase||t.id!==c.season.id))for(const i of this.seasonListeners)i(c.season)} + if(c.social&&(!this.social||c.social.now>=this.social.now)&&(this.social=c.social),c.shop&&(this.shop=c.shop),c.newSeason&&(this.newSeason=c.newSeason),!c.state)return this.touch(),{ + message:c.message??null,result:c.result} + ; + this.offset=c.now-Date.now(); + const p=this.state,g=c.state; + for(const v of TIi)v in g&&(this.serverHeavy[v]=g[v]); + if(p)for(const v of TIi)v in g||(g[v]=this.serverHeavy[v]??p[v]); + const w=g.tk; + this.ticket=w?YTi(w,g.seq.castAt):null,this.ticketCast=this.ticket?g.seq.castAt:-1; + const m=kCi(this.pending,g.seq,(c.hooked??[]).map(t=>t.k)); + if(m.length&&this.notice(`연결이 늦어 물고기 ${ + m.length} + 마리를 놓쳤어요`),this.pending=PCi(this.pending,g.seq),IIi(this.pending),this.pending)for(const v of this.pending.ks){ + const t=this.ticketFish0(v,g); + t&&this.localCatch(g,RCi(t,ICi(g.seq,v,g.gear.reel,g.devSpeed,this.hookedKs(g).filter(t=>t<v)),g.spot,!Object.keys(g.dex).length))} + WTi.setRun(g.startAt),this.state=g,this.ready=!0,this.emitBoatLogs(); + for(const v of c.caught??[])this.addCatch(v,v.isNew); + return c.others&&(this.others=c.others,this.othersAt=Date.now()),c.crowd&&(this.crowd=c.crowd),this.planSync(),this.touch(),{ + message:c.message??null,result:c.result} + } + addCatch(t,i){ + this.feed.unshift(t),this.feed.length=Math.min(this.feed.length,8); + for(const s of this.catchListeners)s(t,i)} + async call(t){ + return this.apply(await t)} + async load(){ + var t; + this.pending??(this.pending=OIi()); + const i=await this.call(this.api.sync(null==(t=this.posProvider)?void 0:t.call(this))); + return this.ready?i.message:i.message??"낚시왕 정보를 받지 못했어요"} + tick(){ + var t; + this.tradeTick(),this.ready&&this.open&&!this.syncing&&(Date.now()<this.nextSyncAt||(this.syncing=!0,this.call(this.api.sync(null==(t=this.posProvider)?void 0:t.call(this),this.active)).finally(()=>{ + this.syncing=!1} + )))} + syncSoon(){ + this.nextSyncAt=0,this.tick()} + planSync(){ + var t,i; + const s=null==(t=this.state)?void 0:t.plunder,e=null==(i=this.state)?void 0:i.boat,n="open"===this.phase(),h=n&&e&&!e.repairAt?YAi(this.state.spot.race,this.state.spot.zone,this.now()):null; + this.nextSyncAt=eIi({ + now:Date.now(),open:n,offset:this.offset,heartbeatMs:(null==s?void 0:s.raid)||(null==s?void 0:s.raidBy)?5e3:6e4,autoAt:n?this.predictAutoAt():null,hazardAt:h?h.at:null,repairEndAt:n&&(null==e?void 0:e.repairAt)?aSi(this.state,e):null} + ); + const r=this.currentBite(),o=this.ticket,a=!!o&&!!r&&this.ticketCast===this.state.seq.castAt&&o.k0+o.fish.length-r.k<4; + (this.pending&&this.pending.ks.length>=5||a)&&(this.nextSyncAt=Math.min(this.nextSyncAt,Date.now()+1e3))} + predictAutoAt(){ + var t; + const i=null==(t=this.state)?void 0:t.seq; + if(!i)return null; + let s=i.prog,e=i.k,n=i.nextAt; + const h=this.hookedKs(),r=Math.max(-1,...h); + r>=i.k&&(s=0,n=ICi(i,r+1,this.state.gear.reel,this.state.devSpeed,h),e=r+1); + for(let o=0; + o<20; + o++){ + if(s+=1,s>=i.need-1e-9)return n+rAi+2500; + e++,n+=cAi(i.seed,e,this.state.gear.reel,this.state.devSpeed)} + return null} + onTrade(t){ + return this.tradeListeners.add(t),()=>this.tradeListeners.delete(t)} + setTrade(i){ + const s=this.trade,e=t.phaseRank; + if(!(i&&s&&i.id===s.id&&(e[i.phase]<e[s.phase]||i.phase===s.phase&&i.ver<s.ver))){ + i&&("done"===i.phase||"gone"===i.phase)&&this.tradeClosed.has(i.id)&&(i=null),"done"!==(null==i?void 0:i.phase)||"done"===(null==s?void 0:s.phase)||this.tradePreview||this.syncSoon(),this.trade=i; + for(const t of this.tradeListeners)t(i)} + } + tradeDismiss(){ + this.trade&&this.tradeClosed.add(this.trade.id),this.setTrade(null)} + get tradeLive(){ + return!!this.trade&&("ask"===this.trade.phase||"open"===this.trade.phase)} + tradeLeft(){ + return this.state?cIi(this.state.trade,this.state.dailyUtc?UTi(this.realNow()):this.eventDay()):0} + tradeFish(){ + var t,i,s,e; + const n=this.serverHeavy.icebox??(null==(t=this.state)?void 0:t.icebox)??[],h=(null==(i=this.serverHeavy.aquarium)?void 0:i.fish)??(null==(e=null==(s=this.state)?void 0:s.aquarium)?void 0:e.fish)??[]; + return{ + net:n.filter(t=>!t.broken),aq:h} + } + applyTrade(t){ + var i,s,e,n; + if(!(null==t?void 0:t.success))return(null==(s=null==(i=null==t?void 0:t.header)?void 0:i.errorInfo)?void 0:s.additional)??(null==(n=null==(e=null==t?void 0:t.header)?void 0:e.errorInfo)?void 0:n.message)??"연결이 원활하지 않아요"; + const h=t.body??{ + } + ,r=h.state?this.apply(t).message:h.message??null; + return"trade"in h&&this.setTrade(h.trade??null),r} + tradeTick(){ + if(this.tradePreview||!this.ready||!this.open||!this.active||this.polling||"open"!==this.phase())return; + const t=this.tradeLive?1e3:this.others.some(t=>!t.a&&!t.id.startsWith("bot:"))?3e3:0; + !t||Date.now()<this.pollAt||(this.pollAt=Date.now()+t,this.polling=!0,this.api.tradePoll().then(t=>{ + this.applyTrade(t)} + ).catch(()=>{ + } + ).finally(()=>{ + this.polling=!1} + ))} + async tradeCall(t){ + return this.pollAt=Date.now()+1e3,this.applyTrade(await t)} + tradeRequest(t){ + var i; + return this.tradeCall(this.api.tradeRequest(t,null==(i=this.posProvider)?void 0:i.call(this)))} + tradeAnswer(t){ + var i; + return this.trade?this.tradeCall(this.api.tradeAnswer(this.trade.id,t,null==(i=this.posProvider)?void 0:i.call(this))):Promise.resolve("거래가 끝났어요")} + tradeOffer(t){ + return this.trade?this.tradeCall(this.api.tradeOffer(this.trade.id,t)):Promise.resolve("거래가 끝났어요")} + tradeReady(t){ + var i; + return this.trade?this.tradeCall(this.api.tradeReady(this.trade.id,t,this.trade.ver,null==(i=this.posProvider)?void 0:i.call(this))):Promise.resolve("거래가 끝났어요")} + tradeCancel(){ + return this.trade?this.tradeCall(this.api.tradeCancel(this.trade.id)):Promise.resolve(null)} + tradeEmote(t){ + return this.trade?this.tradeCall(this.api.tradeEmote(this.trade.id,t)):Promise.resolve(null)} + now(){ + return Date.now()+this.offset} + realNow(){ + var t; + return this.now()-((null==(t=this.state)?void 0:t.devOffset)??0)} + eventDay(){ + return Math.floor((this.now()-this.state.startAt)/864e5)+1} + currentBite(){ + var t; + const i=null==(t=this.state)?void 0:t.seq; + return i?VTi(i,this.state.gear.reel,this.state.devSpeed,this.now(),this.hookedKs()):null} + biteOpen(){ + if(this.netFull()||this.boatProblem())return null; + const t=this.currentBite(); + if(!t||t.k===this.hooked.k&&this.state.seq.castAt===this.hooked.castAt)return null; + const i=this.now(); + return i>=t.at&&i<t.at+rAi?{ + k:t.k,left:t.at+rAi-i} + :null} + biteIn(){ + const t=this.currentBite(); + return t?t.at-this.now():1/0} + idleLeft(){ + const t=this.state.seq; + return Math.max(1,Math.ceil(t.need-t.prog))} + async cast(){ + var t; + return(await this.call(this.api.cast(null==(t=this.posProvider)?void 0:t.call(this)))).message} + hookable(){ + if(this.netFull())return null; + const t=this.currentBite(); + if(!t)return null; + const i=this.state.seq; + return jTi(t,i.k,this.now(),i.castAt===this.hooked.castAt?this.hooked.k:null)} + ticketFish0(t,i){ + const s=this.ticket; + if(!s||this.ticketCast!==i.seq.castAt)return null; + const e=t-s.k0; + return e>=0&&e<s.fish.length?s.fish[e]:null} + async hook(){ + var t,i,s,e; + const n=this.hookable(); + if(!n)return{ + message:null} + ; + const h=this.state.seq; + this.hooked={ + castAt:h.castAt,k:n.k} + ; + let r=this.ticketFish(n.k); + if(!r&&this.ticket&&n.k>=this.ticket.k0+this.ticket.fish.length&&(await this.flushHooks(),this.state.seq.castAt===h.castAt&&(r=this.ticketFish(n.k))),r){ + const i=RCi(r,ICi(h,n.k,this.state.gear.reel,this.state.devSpeed,this.hookedKs().filter(t=>t<n.k)),this.state.spot,!Object.keys(this.state.dex).length),s=this.localCatch(this.state,i); + return this.pending={ + c:h.castAt,ks:[...(null==(t=this.pending)?void 0:t.c)===h.castAt?this.pending.ks:[],n.k]} + ,IIi(this.pending),this.addCatch(i,s),this.planSync(),this.touch(),{ + message:null,caught:i,isNew:s} + } + const o=await this.call(this.api.hook(n.k,null==(i=this.posProvider)?void 0:i.call(this))); + return o.result&&this.addCatch(o.result.catch,o.result.isNew),{ + message:o.message,caught:null==(s=o.result)?void 0:s.catch,isNew:null==(e=o.result)?void 0:e.isNew} + } + get netCap(){ + return qSi(this.state.gear,kAi(this.state).icebox)} + netCount(){ + return this.state.icebox.length} + netFull(){ + return!!this.state&&this.netCount()>=this.netCap} + gearStats(){ + return kAi(this.state)} + netGroups(){ + return sIi(this.state.icebox).sort((t,i)=>kSi(i.id).star-kSi(t.id).star||i.grade-t.grade||i.value/i.count-t.value/t.count)} + netSellable(){ + let t=0,i=0; + for(const s of this.netGroups())this.isQuestFish(s)||(t+=s.count,i+=s.value); + return{ + count:t,gold:i} + } + aquarium(){ + const t=this.state.aquarium??{ + lv:0,fish:[]} + ,i=t.lv+1<XOi.AQUARIUM_SLOTS.length?XOi.AQUARIUM_PRICES[t.lv+1]:null; + return{ + lv:t.lv,cap:iIi(t.lv),fish:t.fish,nextPrice:i} + } + isQuestFish(t){ + const i=this.quests(); + return i.reqs.some(s=>!i.done.includes(s.key)&&s.speciesId===t.id&&(t.grade??0)>=(s.minGrade??0))} + dexCount(){ + return Object.keys(this.state.dex).length} + records(){ + let t=0,i=0,s=0,e=null; + for(const[n,h]of Object.entries(this.state.dex))t+=h.count,i=Math.max(i,kSi(Number(n)).star),3===uTi(h.bestR)&&s++,(!e||h.bestKg>e.kg)&&(e={ + id:Number(n),kg:h.bestKg} + ); + return{ + total:t,heaviest:e,topStar:i,kinds:this.dexCount(),sCount:s} + } + baitLeftMs(){ + const t=this.state.bait; + return t?Math.max(0,t.until-this.now()):0} + todayContest(){ + var t; + return yTi((null==(t=this.social)?void 0:t.enabled)?this.social.day??1:this.eventDay())} + contestStanding(){ + const t=this.state.contest; + if(!t)return null; + const i=yTi(t.day),s=this.now(),e=Math.min(1,(s-t.startAt)/(t.endAt-t.startAt)),n=s>=t.endAt,h=t.bots.map(t=>({ + name:t.name,score:n?t.final:OTi(i,t.final,t.pace,e),me:!1} + )); + return h.push({ + name:"나",score:t.my,me:!0} + ),h.sort((t,i)=>i.score-t.score||(t.me?1:i.me?-1:0)),{ + rows:h,myRank:h.findIndex(t=>t.me)+1,progress:e,ended:n} + } + quests(){ + const t=RTi(this.now()),i=this.state.quests; + return this.visitorsOpen()?{ + ...i&&i.window===t?i:{ + window:t,reqs:kTi(t,this.state.gear,new Set(Object.keys(this.state.dex).map(Number))),done:[]} + ,nextAt:6*(t+1)*36e5} + :{ + window:t,reqs:[],done:[],nextAt:6*(t+1)*36e5} + } + questHave(t){ + return this.state.icebox.filter(i=>!i.broken&&i.id===t.speciesId&&i.grade>=(t.minGrade??0)).length} + milestoneRows(){ + const t=this.state,i=this.dexCount(); + return[...LTi.map((s,e)=>({ + kind:"dex",idx:e,label:`도감 ${ + s.need} + 종`,progress:i,need:s.need,pearl:s.pearl,claimed:t.milestones.dex.includes(e)} + )),...DTi.map((i,s)=>({ + kind:"sales",idx:s,label:`누적 판매 ${ + i.need.toLocaleString()} + G`,progress:t.sales,need:i.need,pearl:i.pearl,claimed:t.milestones.sales.includes(s)} + )),...GTi.map((i,s)=>{ + var e,n; + return{ + kind:"help",idx:s,label:`배 수리 도움 ${ + i.need} + 번`,progress:(null==(e=t.boat)?void 0:e.helped)??0,need:i.need,pearl:i.pearl,claimed:!!(null==(n=t.milestones.help)?void 0:n.includes(s))} + } + )]} + async awayReport(){ + return this.state.away||this.state.migratedSold?(await this.call(this.api.awayReport())).result??null:null} + async moveTo(t,i,s,e=this.state.spot.depth){ + var n; + this.feed=[]; + const h={ + ...this.state.spot} + ,r=this.call(this.api.move(t,i,s,e)).then(t=>t.message); + return h.race===t&&h.zone===i||null==(n=this.onBigMove)||n.call(this,h,{ + race:t,zone:i,point:s,depth:e} + ,r),r} + async setDepth(t){ + const i=this.state.spot; + return(await this.call(this.api.move(i.race,i.zone,i.point,t))).message} + async goTo(t){ + const i=this.state.spot,s=i.race===t.race&&i.zone===t.zone?i.point:-1,e=WTi.pointKnown(`${ + t.race} + |${ + t.zone} + `,t.point,s)?t.point:0; + return this.moveTo(t.race,t.zone,e,t.depth)} + async sell(t){ + const i=await this.call(this.api.sell(t.key)); + return{ + message:i.message,gold:i.result??0} + } + async sellAll(){ + const t=await this.call(this.api.sellAll()); + return{ + message:t.message,...t.result??{ + count:0,gold:0} + } + } + netFish(){ + return this.state.icebox.filter(t=>!t.broken).sort((t,i)=>kSi(i.id).star-kSi(t.id).star||i.grade-t.grade||i.kg-t.kg)} + async sellFish(t){ + const i=await this.call(this.api.sellFish(t.map(ZOi))); + return{ + message:i.message,...i.result??{ + count:0,gold:0} + } + } + async aquariumPutFish(t){ + return(await this.call(this.api.aquariumPutFish(ZOi(t)))).message} + async sellKeys(t){ + const i=await this.call(this.api.sellKeys(t)); + return{ + message:i.message,...i.result??{ + count:0,gold:0} + } + } + async aquariumPut(t){ + return(await this.call(this.api.aquariumPut(t.key))).message} + async aquariumTake(t){ + return(await this.call(this.api.aquariumTake(t))).message} + async aquariumExpand(){ + return(await this.call(this.api.aquariumExpand())).message} + async upgrade(t){ + return(await this.call(this.api.upgrade(t))).message} + async buy(t){ + return(await this.call(this.api.buy(t.id))).message} + async exchange(t,i){ + var s; + const e=null==(s=this.season)?void 0:s.id; + return null==e?"지금은 바꿀 수 없어요":(await this.call(this.api.exchange(e,this.state.exchangeRev??0,t.kindNum,i))).message} + exchangeMax(t){ + var i; + const s=(null==(i=this.state.exchange)?void 0:i[String(t.kindNum)])??0,e=null===t.limit?1/0:t.limit-s; + return Math.max(0,Math.min(Math.floor(this.state.pearl/t.pearl),e,1e3))} + async loadLife(){ + try{ + const t=await this.api.life(); + (null==t?void 0:t.success)&&(this.life=t.body.life)} + catch{ + } + } + daily(){ + return vIi(this.state.daily,this.state.dailyUtc?UTi(this.realNow()):this.eventDay())} + dailyClaimable(){ + const t=this.daily(); + return mIi(t)&&!t.claimed} + async claimDaily(){ + return(await this.call(this.api.dailyClaim(this.daily().day))).message} + contestReady(){ + if(this.socialRewardsReady())return!0; + const t=this.contestStanding(); + return!!(null==t?void 0:t.ended)&&!!this.state.contest&&!this.state.contest.claimed} + goalsReady(){ + return this.milestoneRows().filter(t=>!t.claimed&&t.progress>=t.need).length} + visitDeliverable(){ + const t=this.quests(); + return t.reqs.some(i=>!t.done.includes(i.key)&&this.questHave(i)>=i.count)} + dotsInput(t){ + return{ + netFull:this.netFull(),onTank:t,dailyClaimable:!1,contestReady:this.contestReady(),visitDeliverable:this.visitDeliverable(),goalsReady:this.goalsReady(),areaReady:!!this.areaReady()} + } + qlog(){ + var t; + return(t=this.state).qlog??(t.qlog=fCi())} + questHoldMax(){ + return QTi(this.qlog())} + questCtx(){ + var t; + const i=this.now(),s=this.state; + return{ + gear:s.gear,areaClaimed:this.areaClaimed(),contestToday:!!s.contest&&i<s.contest.endAt||Object.values((null==(t=s.social)?void 0:t.scores)??{ + } + ).some(t=>i<t.endAt)} + } + questOffers(t,i){ + return ECi(this.qlog(),t,i,this.startRace())} + questHeld(){ + const t=this.qlog(),i=this.questCtx(); + return t.held.map(t=>gCi(t.id)).filter(t=>!!t).map(s=>({ + def:s,got:MCi(t,s,i),need:vCi(s),ready:bCi(t,s,i)} + ))} + questTurnIn(t){ + return mCi(t,this.startRace())} + tracked(){ + return SCi(this.qlog(),this.trackedId)} + track(t){ + this.trackedId=t; + try{ + t?localStorage.setItem("fishing.trackedQuest",t):localStorage.removeItem("fishing.trackedQuest")} + catch{ + } + } + async questAccept(t,i,s){ + const e=(await this.call(this.api.questAccept(t,i,s))).message; + return e||this.track(t),e} + async questAbandon(t){ + return(await this.call(this.api.questAbandon(t))).message} + async questComplete(t){ + var i,s; + const e=await this.call(this.api.questComplete(t)); + return{ + message:e.message,gold:(null==(i=e.result)?void 0:i.gold)??0,pearl:(null==(s=e.result)?void 0:s.pearl)??0} + } + areaClaimed(){ + return this.state.milestones.area??[]} + areaRows(t,i){ + return EIi(t,i,this.state.dex,this.areaClaimed())} + areaReady(){ + const t=this.state.spot; + return AIi(t.race,t.zone,this.state.dex,this.areaClaimed())} + areaNext(){ + const t=this.state.spot; + return SIi(t.race,t.zone,this.state.dex,this.areaClaimed())} + async claimArea(t,i,s){ + var e,n; + const h=await this.call(this.api.areaClaim(t,i,s)); + return{ + message:h.message,pearl:(null==(e=h.result)?void 0:e.pearl)??0,bonus:(null==(n=h.result)?void 0:n.bonus)??0} + } + seasonDays(){ + const t=this.season; + return null!=(null==t?void 0:t.startAt)&&null!=t.endAt?Math.ceil((t.endAt-t.startAt)/864e5):null} + isLastDay(){ + var t; + const i=null==(t=this.season)?void 0:t.endAt; + return null!=i&&"open"===this.phase()&&i-this.realNow()<864e5} + socialRewardsReady(){ + return this.claimableSocialIds().length>0} + claimableSocialIds(){ + var t; + return((null==(t=this.social)?void 0:t.rewards)??[]).filter(t=>{ + var i; + return null===t.claimedAt&&t.seasonId===(null==(i=this.season)?void 0:i.id)} + ).map(t=>t.id)} + async refreshSocial(t=!1){ + var i; + if(!(!(null==(i=this.social)?void 0:i.enabled)||this.socialRefreshing||!t&&Date.now()<this.socialRefreshAt)){ + this.socialRefreshing=!0,this.socialRefreshAt=Date.now()+1e4; + try{ + const i=await this.call(this.api.socialStatus()); + i.message&&t&&this.notice(i.message)} + catch{ + t&&this.notice("순위와 보상을 불러오지 못했어요. 잠시 후 다시 눌러 주세요")} + finally{ + this.socialRefreshing=!1} + } + } + async joinSocial(){ + return(await this.call(this.api.socialJoin())).message} + async claimSocial(t){ + return(await this.call(this.api.socialClaim(t))).message} + async prepareHuntAim(){ + const t=await this.call(this.api.huntPing()); + if(t.message||!t.result)return{ + message:t.message??"연결을 확인하지 못했어요"} + ; + const i=performance.now(),s=await this.api.huntAim(t.result.id),e=performance.now(),n=this.apply(s); + if(n.message||!n.result)return{ + message:n.message??"조준을 준비하지 못했어요"} + ; + const h=s.body.clock,r=h?(h.receivedAt+h.sentAt)/2:s.body.now; + return{ + message:null,aim:n.result,startPerf:(i+e)/2+n.result.startAt-r} + } + async huntShot(t){ + var i,s; + let e; + try{ + e=await this.api.huntShot(t,null==(i=this.posProvider)?void 0:i.call(this))} + catch{ + e=await this.api.huntShot(t,null==(s=this.posProvider)?void 0:s.call(this))} + return this.apply(e)} + async joinContest(){ + return(await this.call(this.api.joinContest())).message} + async claimContest(){ + return(await this.call(this.api.claimContest())).result??null} + async deliver(t){ + return(await this.call(this.api.deliver(t.key))).message} + visitorsOpen(){ + return qTi} + startRace(){ + const t=this.state.startRace; + return t&&uSi.includes(t)?t:"인간"} + async claimMilestone(t,i){ + return(await this.call(this.api.claimMilestone(t,i))).message} + tipSeen(t){ + var i,s,e; + return!!(null==(i=this.state)?void 0:i.guideSeen)||!!(null==(e=null==(s=this.state)?void 0:s.tips)?void 0:e.includes(t))||this.seenTips.has(t)} + async markTip(t){ + var i; + if(!this.tipSeen(t)){ + for(const i of"tut"===t?["tut",...BCi]:[t])this.seenTips.add(i); + ((i=this.state).tips??(i.tips=[])).push(t),await this.call(this.api.guideSeen(t))} + } + get look(){ + var t; + return mOi((null==(t=this.state)?void 0:t.look)??null)} + get plunder(){ + var t; + return(null==(t=this.state)?void 0:t.plunder)??null} + tickets(){ + return yOi(this.plunder,this.realNow())} + async plunderPeek(t){ + var i; + return this.call(this.api.plunderPeek(t,null==(i=this.posProvider)?void 0:i.call(this)))} + async plunderStart(t){ + var i; + return(await this.call(this.api.plunderStart(t,null==(i=this.posProvider)?void 0:i.call(this)))).message} + async plunderStop(){ + var t; + return this.call(this.api.plunderStop(null==(t=this.posProvider)?void 0:t.call(this)))} + async plunderCut(){ + return(await this.call(this.api.plunderCut())).message} + async saveLook(t){ + return(await this.call(this.api.look(t))).message} + emitBoatLogs(){ + var t,i; + const s=(null==(t=this.state.boat)?void 0:t.log)??[]; + if(this.boatSeenAt<0)return void(this.boatSeenAt=(null==(i=s[0])?void 0:i.at)??0); + const e=s.filter(t=>t.at>this.boatSeenAt).reverse(); + if(e.length){ + this.boatSeenAt=e[e.length-1].at; + for(const t of this.boatListeners)t(e)} + } + boatHp(){ + const t=this.state,i=null==t?void 0:t.boat,s=t?iSi(t):XAi(0); + return i?{ + hp:oSi(t,i,this.now()),max:s,fixing:!!i.repairAt,broken:i.broken,endAt:aSi(t,i)} + :{ + hp:s,max:s,fixing:!1,broken:!1,endAt:0} + } + boatProblem(){ + var t; + const i=null==(t=this.state)?void 0:t.boat; + return(null==i?void 0:i.repairAt)?i.broken?"배가 고장 나서 고치는 중이에요":"배를 고치는 중이에요":null} + helpPts(){ + return cSi(this.state,this.now())} + async boatRepair(t){ + var i; + return(await this.call(this.api.boatRepair(t,null==(i=this.posProvider)?void 0:i.call(this)))).message} + async boatHelp(t){ + var i; + return this.call(this.api.boatHelp(t,null==(i=this.posProvider)?void 0:i.call(this)))} + harpoons(){ + return VOi(this.state)} + async huntCraft(t,i){ + return this.call(this.api.huntCraft(t,i))} + async huntUse(t){ + return(await this.call(this.api.huntUse(t))).message} + async huntThrow(t){ + var i; + return this.call(this.api.huntThrow(t,null==(i=this.posProvider)?void 0:i.call(this)))} + async huntStatus(){ + const t=await this.api.huntStatus(); + return(null==t?void 0:t.success)?t.body:null} + async gearPull(t){ + return this.call(this.api.gearPull(t))} + async gearMerge(t,i){ + return this.call(this.api.gearMerge(t,i))} + async gearMergeAll(){ + return this.call(this.api.gearMerge(null,null,!0))} + async gearMergeGroups(t){ + return this.call(this.api.gearMergeGroups(t))} + async gearKeep(t,i){ + return(await this.call(this.api.gearKeep(t,i))).message} + async gearEquip(t){ + return(await this.call(this.api.gearEquip(t))).message} + async gearUnequip(t){ + return(await this.call(this.api.gearEquip(null,t))).message} + async gearEquipBest(){ + const t=await this.call(this.api.gearEquipBest()); + return{ + message:t.message,n:t.result??0} + } + async devGear(){ + return t.devProblem((await this.call(this.api.dev("gearFill"))).message)} + async devNetFill(){ + return t.devProblem((await this.call(this.api.dev("netFill"))).message)} + async devHunt(i){ + const s=await this.call(this.api.dev(i)); + return t.devProblem(s.message)} + async devBoatTest(i,s=[]){ + var e; + const n=await this.call(this.api.dev(i,{ + spots:s} + )); + return await this.call(this.api.sync(null==(e=this.posProvider)?void 0:e.call(this))),t.devProblem(n.message)} + async devSpeed(){ + await this.call(this.api.dev("speed"))} + async devSkipDay(){ + await this.call(this.api.dev("day")),await this.call(this.api.sync())} + async devQuest(){ + return t.devProblem((await this.call(this.api.dev("quest"))).message)} + async devArea(){ + return t.devProblem((await this.call(this.api.dev("area"))).message)} + async devBoat(){ + return t.devProblem((await this.call(this.api.dev("boat"))).message)} + async devSkipTide(){ + const i=t.devProblem((await this.call(this.api.dev("tide"))).message); + return i||await this.call(this.api.sync()),i} + static devProblem(t){ + return t?t.includes("없는 개발 도구")?"서버가 예전 빌드예요 · ef2_server 를 다시 빌드·재시작해 주세요":t:null} + async devAddGold(){ + await this.call(this.api.dev("gold"))} + async devEndContest(){ + await this.call(this.api.dev("endContest"))} + async devContestDay(i){ + return t.devProblem((await this.call(this.api.dev("contestDay",{ + day:i} + ))).message)} + async devBots(t){ + var i; + const s=await this.call(this.api.dev("bots",{ + spots:t} + )); + return await this.call(this.api.sync(null==(i=this.posProvider)?void 0:i.call(this))),s.result??0} + async devReset(){ + this.pending=null,IIi(null); + const i=t.devProblem((await this.call(this.api.dev("reset"))).message); + if(i)return i; + try{ + for(const t of NCi(Object.keys(localStorage),EG.userId))localStorage.removeItem(t)} + catch{ + } + try{ + sessionStorage.setItem("ef2_fishing_reopen","1")} + catch{ + } + return window.location.reload(),null} + async devPlunder(i,s=[]){ + var e; + const n=await this.call(this.api.dev(i,{ + spots:s} + )); + return await this.call(this.api.sync(null==(e=this.posProvider)?void 0:e.call(this))),t.devProblem(n.message)} + } + ; + Qt(kIi,"FishingDataManager"),Zt(kIi,"instance"),Zt(kIi,"phaseRank",{ + ask:0,open:1,done:2,gone:2} + ); + let RIi=kIi; + const xIi={ + luck:'<path d="M12 12c-2.5-4.5-6.5-3-5.5 0 .8 2.4 5.5 0 5.5 0zm0 0c4.5-2.5 3-6.5 0-5.5-2.4.8 0 5.5 0 5.5zm0 0c2.5 4.5 6.5 3 5.5 0-.8-2.4-5.5 0-5.5 0zm0 0c-4.5 2.5-3 6.5 0 5.5 2.4-.8 0-5.5 0-5.5z"/><path d="M13 14l4 6"/>',hp:'<path d="M12 20s-7-4.4-7-9.5A4 4 0 0 1 12 8a4 4 0 0 1 7 2.5C19 15.6 12 20 12 20z"/>',armor:'<path d="M12 3l7 3v6c0 4.5-3 7.5-7 9-4-1.5-7-4.5-7-9V6z"/>',repair:'<path d="M14.5 6.5a4 4 0 0 0-5.3 5.3L4 17l3 3 5.2-5.2a4 4 0 0 0 5.3-5.3l-2.6 2.6-2.4-.6-.6-2.4z"/>',speed:'<path d="M3 8h11a3 3 0 1 0-3-3M3 12h15a3 3 0 1 1-3 3M3 16h7"/>',aim:'<circle cx="12" cy="12" r="7"/><circle cx="12" cy="12" r="2.5"/><path d="M12 2v3M12 19v3M2 12h3M19 12h3"/>',power:'<path d="M4 20L18 6M18 6l-1-3 4 1-1 3zM8 14l-3-1M10 16l1 3"/>',steal:'<path d="M7 11V6a1.5 1.5 0 0 1 3 0v4M10 10V4.5a1.5 1.5 0 0 1 3 0V10M13 10V5.5a1.5 1.5 0 0 1 3 0V12M16 9a1.5 1.5 0 0 1 3 0v5a6 6 0 0 1-6 6h-1a6 6 0 0 1-5-2.7L4 13.5a1.5 1.5 0 0 1 2.6-1.5L7 13"/>',icebox:'<path d="M4 6h16l-2 13H6zM4 6l4 13M20 6l-4 13M12 6v13M5 10.5h14M5.6 15h12.8"/>',big:'<path d="M3 12c3-5 9-6 13-2l5-3-1 5 1 5-5-3c-4 4-10 3-13-2z"/><circle cx="8" cy="11" r="1"/>',star:'<path d="M12 3l2.7 5.6 6.1.9-4.4 4.3 1 6.1L12 17l-5.4 2.9 1-6.1-4.4-4.3 6.1-.9z"/>',protect:'<rect x="5" y="11" width="14" height="9" rx="2"/><path d="M8 11V8a4 4 0 0 1 8 0v3"/>',lock:'<rect x="5" y="11" width="14" height="9" rx="2"/><path d="M8 11V8a4 4 0 0 1 8 0v3"/>',map:'<path d="M9 4L3 6v14l6-2 6 2 6-2V4l-6 2z"/><path d="M9 4v14M15 6v14"/>',line:'<path d="M6 4h12M6 20h12M8 4v16M16 4v16M8 9h8M8 14h8"/>',clock:'<circle cx="12" cy="12" r="8"/><path d="M12 7v5l3 2"/>',moon:'<path d="M20 14.5A8 8 0 0 1 9.5 4a8 8 0 1 0 10.5 10.5z"/>',weight:'<path d="M8.5 9a3.5 3.5 0 1 1 7 0"/><path d="M6 9.5h12l2 10H4z"/>',ruler:'<rect x="3" y="8" width="18" height="8" rx="1.5"/><path d="M7 8v3M10.5 8v4.5M14 8v3M17.5 8v4.5"/>',pin:'<path d="M12 21s-6-6-6-10.5a6 6 0 0 1 12 0C18 15 12 21 12 21z"/><circle cx="12" cy="10.5" r="2"/>',shield:'<path d="M12 3l7 3v6c0 4.5-3 7.5-7 9-4-1.5-7-4.5-7-9V6z"/><path d="M9 12l2.2 2.2L15 10"/>',trophy:'<path d="M8 4h8v5a4 4 0 0 1-8 0zM8 6H5c0 2.5 1.3 3.8 3 4M16 6h3c0 2.5-1.3 3.8-3 4M12 13v4M9 20h6"/>',depth:'<path d="M3 6.5c1.5-1.2 3-1.2 4.5 0s3 1.2 4.5 0 3-1.2 4.5 0 3 1.2 4.5 0"/><path d="M12 10v10M8.5 16.5L12 20l3.5-3.5"/>'} + ,PIi=Qt(t=>`#${ + t.toString(16).padStart(6,"0")} + `,"hex"); + function NIi(t,i,s,e=2.2){ + const n=(new ip).svg(`<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="${ + PIi(s)} + " stroke-width="${ + e} + " stroke-linecap="round" stroke-linejoin="round">${ + xIi[t]} + </g></svg>`); + return n.scale.set(i/24),n.eventMode="none",n} + Qt(NIi,"lineIcon"); + const LIi=723725,DIi=1644829,GIi=2368554,BIi=3158071,UIi=4013379,FIi=3158071,$Ii=3881795,HIi=.62,WIi=3815998,VIi=16106577,jIi=2825477,KIi=15921908,zIi=10592678,YIi=7237235,qIi=8378016,XIi=16751752,JIi=15262964,QIi=921104,ZIi=3813926,tki=2763309,iki=8158338,ski=[3815998,10135467,6142819,4886754,10513640,15901498,16734815],eki=[0,7315384,15247664,16732013],nki={ + corner:"right"} + ,hki={ + "인간":12862767,"엘프":4165445,"언데드":8082856,"오크":3108787} + ; + function rki(t,i=KIi,s=16,e=!0){ + const n=new QD(t,i,{ + ...sD.DEFAULT_FONT_OPTION_16,fontSize:s,lineHeight:Math.round(1.3*s),fontWeight:e?"bolder":"normal"} + ); + return n.eventMode="none",n} + function oki(t,i){ + t.scale.set(1),t.scale.set(Math.min(1,i/Math.max(1,t.width)))} + function aki(t,i,s=2368554,e=3815998,n=12){ + const h=new ip; + return null===e?h.roundRect(0,0,t,i,n).fill(s):h.roundRect(.5,.5,t-1,i-1,n).fill(s).stroke({ + color:e,width:1} + ),h.eventMode="none",h} + Qt(rki,"label"),Qt(oki,"fitLabel"),Qt(aki,"panel"); + const cki=class extends Ve{ + constructor(t,i=!1,s=!1){ + super(),Zt(this,"bg",new ip),Zt(this,"icon",new Ye),Zt(this,"band",new ip),Zt(this,"stars",rki("",VIi,11)),Zt(this,"marks",new Ve),Zt(this,"fade",1),Zt(this,"unknown",!1),Zt(this,"badge",new Ve),Zt(this,"badgeBg",new ip),Zt(this,"badgeText",rki("",16777215,12)),Zt(this,"starsAlways",!1),Zt(this,"mystery",rki("?",zIi,16)),this.size=t,this.minimal=i,this.banded=s,this.eventMode="none",this.icon.anchor.set(.5),this.mystery.visible=!1,this.band.eventMode="none",this.marks.eventMode="none",this.badge.addChild(this.badgeBg,this.badgeText),this.addChild(this.bg,this.icon,this.mystery,this.band,this.stars,this.badge,this.marks)} + set(t,i,s=0,e=!1){ + const n=this.size,h=e?ski[0]:ski[Math.min(5,i)],r=Math.max(2,.05*n),o=n*(this.minimal?.12:.2); + this.bg.clear(); + const a=e&&null!==t?UIi:QIi; + if(this.minimal?this.bg.roundRect(0,0,n,n,o).fill(a):this.bg.roundRect(0,0,n,n,o).fill(h).roundRect(r,r,n-2*r,n-2*r,Math.max(1,o-r)).fill(a),this.icon.visible=null!==t,this.mystery.visible=null===t&&i>0,this.mystery.visible&&(this.mystery.textSize=Math.round(.42*n),this.mystery.position.set((n-this.mystery.width)/2,.43*n-this.mystery.height/2)),this.unknown=e,null!==t){ + this.icon.texture=nAi.fish(t); + const i=n*(this.banded?.7:.8)/100; + this.icon.scale.set(i),this.icon.position.set(n/2,n*(this.banded?.41:.46)),this.icon.tint=e?0:16777215} + if(this.stars.visible=(n>=40||this.starsAlways)&&(e||i>0),this.stars.text=e?"?":MTi(i),this.stars.textColor=e?YIi:VIi,this.band.clear(),this.banded&&this.stars.visible){ + const t=Math.round(.22*n),i=r,s=n-r,e=n-r-t,h=n-r,a=Math.max(1,o-r); + this.band.moveTo(i,e).lineTo(s,e).lineTo(s,h-a).arcTo(s,h,s-a,h,a).lineTo(i+a,h).arcTo(i,h,i,h-a,a).closePath().fill({ + color:0,alpha:.5} + ),this.stars.textSize=Math.max(9,Math.round(.15*n)),oki(this.stars,n-2*r-4),this.stars.position.set((n-this.stars.width)/2,e+(t-this.stars.height)/2)} + else this.stars.textSize=Math.max(9,Math.round(.16*n)),oki(this.stars,n-6),this.stars.position.set((n-this.stars.width)/2,n-this.stars.height-1); + const c=e?0:s??0; + if(this.badge.visible=c>=1,c>=1){ + const t=Math.max(13,Math.round(.26*n)),i=eki[c],s=2; + this.badgeBg.clear(),3===c&&this.badgeBg.roundRect(-s,-s,t+2*s,t+2*s,.36*t).fill({ + color:i,alpha:.35} + ),this.badgeBg.roundRect(0,0,t,t,.3*t).fill(i),this.badgeText.text=aTi[c],this.badgeText.textSize=Math.round(.66*t),this.badgeText.position.set((t-this.badgeText.width)/2,(t-this.badgeText.height)/2); + const e=Math.ceil(r)+s+1; + this.badge.position.set("left"===nki.corner?e:n-t-e,e)} + this.applyFade()} + setFade(t){ + this.fade=t,this.applyFade()} + applyFade(){ + for(const t of[this.bg,this.mystery,this.band,this.stars,this.badge])t.alpha=this.fade; + this.icon.alpha=(this.unknown?.8:1)*this.fade} + setMark(t,i=1644829){ + if(this.marks.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),!t)return; + const s=Math.max(9,Math.round(.15*this.size)),e=s-4,n=(new ip).circle(e,e,s+2).fill(i).circle(e,e,s).fill("on"===t?VIi:"lock"===t?3816e3:3116890); + if("on"===t&&n.moveTo(e-.45*s,e).lineTo(e-.1*s,e+.35*s).lineTo(e+.5*s,e-.35*s).stroke({ + color:jIi,width:Math.max(2,.26*s),cap:"round",join:"round"} + ),"quest"===t&&n.roundRect(e-.13*s,e-.58*s,.26*s,.7*s,.13*s).fill(15400945).circle(e,e+.42*s,.15*s).fill(15400945),this.marks.addChild(n),"lock"===t){ + const t=NIi("lock",1.2*s,13092812,2.6); + t.position.set(e-.6*s,e-.62*s),this.marks.addChild(t)} + } + } + ; + Qt(cki,"FishCard"); + let lki=cki; + const uki=class extends Ve{ + constructor(t,i,s=34,e=14){ + super(),Zt(this,"bg",new ip),Zt(this,"text"),Zt(this,"onTap",null),Zt(this,"w",0),Zt(this,"h",0),Zt(this,"selected",!1),Zt(this,"enabled",!0),Zt(this,"value"),Zt(this,"soft",!1),Zt(this,"dot",null),Zt(this,"dotG",new ip),this.value=t,this.text=rki(t,zIi,e),this.dotG.eventMode="none",this.addChild(this.bg,this.dotG,this.text),this.eventMode="static",this.cursor="pointer",this.on("pointertap",t=>{ + var i; + t.stopPropagation(),this.enabled&&(null==(i=this.onTap)||i.call(this))} + ),this.resize(i,s)} + resize(t,i){ + this.w=t,this.h=i,this.hitArea=new Ui(0,0,t,i),this.draw()} + setText(t){ + this.text.text=t,this.draw()} + draw(){ + const{ + w:t,h:i} + =this,s=this.soft?this.selected?ZIi:GIi:this.selected?VIi:BIi; + this.bg.clear().roundRect(0,0,t,i,Math.min(9,i/2)).fill(s),this.text.textColor=this.soft?this.selected?VIi:this.enabled?zIi:YIi:this.selected?jIi:this.enabled?KIi:YIi; + const e=null!==this.dot?16:0; + oki(this.text,t-12-e); + const n=(t-this.text.width-e)/2; + this.dotG.clear(),null!==this.dot&&this.dotG.circle(n+4.5,i/2,4.5).fill(this.dot),this.text.position.set(n+e,(i-this.text.height)/2),this.alpha=this.enabled?1:.55} + } + ; + Qt(uki,"Chip"); + let dki=uki; + const fki=class extends Ve{ + constructor(t,i,s=44,e=15){ + super(),Zt(this,"bg",new ip),Zt(this,"text"),Zt(this,"onTap",null),Zt(this,"w"),Zt(this,"h"),Zt(this,"primary",!0),Zt(this,"_enabled",!0),this.w=i,this.h=s,this.text=rki(t,jIi,e),this.addChild(this.bg,this.text),this.eventMode="static",this.cursor="pointer",this.hitArea=new Ui(0,0,i,s),this.on("pointerdown",()=>{ + this._enabled&&this.scale.set(.96)} + ),this.on("pointerup",()=>this.scale.set(1)),this.on("pointerupoutside",()=>this.scale.set(1)),this.on("pointertap",t=>{ + var i; + t.stopPropagation(),this._enabled&&(null==(i=this.onTap)||i.call(this))} + ),this.draw()} + set enabled(t){ + this._enabled=t,this.draw()} + get enabled(){ + return this._enabled} + setText(t){ + this.text.text=t,this.draw()} + draw(){ + const t=this._enabled,i=t?this.primary?VIi:UIi:tki; + this.bg.clear().roundRect(0,0,this.w,this.h,9).fill(i),this.text.textColor=t?this.primary?jIi:KIi:iki,oki(this.text,this.w-12),this.text.position.set((this.w-this.text.width)/2,(this.h-this.text.height)/2)} + setPrimary(t){ + this.primary=t,this.draw()} + } + ; + Qt(fki,"FButton"); + let pki=fki; + function gki(t,i,s){ + const e=t.charCodeAt(t.length-1); + return e<44032||e>55203?`${ + t} + ${ + i} + (${ + s} + )`:`${ + t} + ${ + (e-44032)%28?i:s} + `} + function wki(t,i){ + const s=new Ve,e=i/2,n=Math.max(1.5,.06*i); + s.eventMode="none"; + const h=(new ip).circle(e,e,e).fill(2372155),r=new Ye(t); + r.width=r.height=i-2*n,r.position.set(n,n); + const o=(new ip).circle(e,e,e-n).fill(16777215); + r.mask=o; + const a=(new ip).circle(e,e,e-n/2).stroke({ + color:15984328,width:n} + ); + return s.addChild(h,r,o,a),s} + function mki(t,i,s,e=11,n=6){ + const h=new Ve,r=rki(t,i,e),o=new ip; + return o.roundRect(0,0,r.width+2*n,r.height+2,(r.height+2)/2).fill(s),r.position.set(n,1),h.addChild(o,r),h.eventMode="none",h} + function vki(t,i,s,e,n,h,r=VIi,o=3158071){ + t.roundRect(i,s,e,n,n/2).fill(o); + const a=e*Math.max(0,Math.min(1,h)); + return a>.5&&t.roundRect(i,s,Math.max(n,a),n,n/2).fill(r),t} + function _ki(t,i=22){ + const s=new ip; + return"gold"===t?s.circle(i/2,i/2,i/2).fill(14723118).circle(i/2,i/2,.34*i).fill(16106577).circle(.4*i,.38*i,.1*i).fill(16774870):s.circle(i/2,i/2,i/2).fill(12433110).circle(i/2,i/2,.42*i).fill(JIi).circle(.38*i,.36*i,.12*i).fill(16777215),s.eventMode="none",s} + function Mki(t){ + const i=Math.max(0,Math.floor(t/1e3)),s=Math.floor(i/3600),e=Math.floor(i%3600/60),n=i%60; + return s>0?`${ + s} + :${ + String(e).padStart(2,"0")} + :${ + String(n).padStart(2,"0")} + `:`${ + e} + :${ + String(n).padStart(2,"0")} + `} + Qt(gki,"josa$1"),Qt(wki,"faceBadge"),Qt(mki,"pill"),Qt(vki,"drawBar"),Qt(_ki,"coinIcon"),Qt(Mki,"formatTime"); + const bki=Qt(t=>{ + const i=new Date(t-1); + return`${ + i.getMonth()+1} + 월 ${ + i.getDate()} + 일`} + ,"seasonDateText"); + function yki(t,i,s,e=16106577){ + const n=new ip; + n.eventMode="none"; + const h=i,r=Math.max(1.4,.085*h),o={ + color:s,width:r,cap:"round",join:"round"} + ; + switch(t){ + case"hook":n.circle(.6*h,.14*h,.07*h).stroke(o).moveTo(.6*h,.21*h).lineTo(.6*h,.62*h).arc(.43*h,.62*h,.17*h,0,Math.PI).lineTo(.26*h,.5*h).lineTo(.35*h,.56*h).stroke(o); + break; + case"toolbox":n.roundRect(.12*h,.36*h,.76*h,.46*h,.07*h).stroke(o).moveTo(.36*h,.36*h).lineTo(.36*h,.2*h).lineTo(.64*h,.2*h).lineTo(.64*h,.36*h).stroke(o).moveTo(.12*h,.54*h).lineTo(.88*h,.54*h).stroke(o).roundRect(.44*h,.49*h,.12*h,.1*h,.02*h).fill(s); + break; + case"bowl":n.moveTo(.3*h,.18*h).lineTo(.7*h,.18*h).stroke(o).moveTo(.33*h,.2*h).bezierCurveTo(.02*h,.36*h,.1*h,.86*h,.5*h,.86*h).bezierCurveTo(.9*h,.86*h,.98*h,.36*h,.67*h,.2*h).stroke(o).moveTo(.2*h,.4*h).lineTo(.8*h,.4*h).stroke({ + ...o,width:.6*r,alpha:.6} + ).ellipse(.47*h,.6*h,.13*h,.08*h).fill(s).poly([.58*h,.6*h,.7*h,.52*h,.7*h,.68*h]).fill(s); + break; + case"trophy":n.moveTo(.26*h,.16*h).lineTo(.74*h,.16*h).lineTo(.7*h,.42*h).bezierCurveTo(.66*h,.58*h,.34*h,.58*h,.3*h,.42*h).closePath().stroke(o).moveTo(.26*h,.22*h).bezierCurveTo(.06*h,.22*h,.1*h,.46*h,.3*h,.44*h).stroke(o).moveTo(.74*h,.22*h).bezierCurveTo(.94*h,.22*h,.9*h,.46*h,.7*h,.44*h).stroke(o).moveTo(.5*h,.58*h).lineTo(.5*h,.72*h).stroke(o).roundRect(.3*h,.72*h,.4*h,.12*h,.03*h).stroke(o); + break; + case"stall":n.moveTo(.12*h,.34*h).lineTo(.2*h,.14*h).lineTo(.8*h,.14*h).lineTo(.88*h,.34*h).stroke(o),n.moveTo(.12*h,.34*h); + for(let t=0; + t<4; + t++)n.arc(h*(.215+.19*t),.34*h,.095*h,Math.PI,0,!0); + n.stroke(o).moveTo(.18*h,.44*h).lineTo(.18*h,.84*h).lineTo(.82*h,.84*h).lineTo(.82*h,.44*h).stroke(o).rect(.4*h,.58*h,.2*h,.26*h).stroke(o); + break; + case"boat":n.moveTo(.08*h,.62*h).lineTo(.92*h,.62*h).lineTo(.76*h,.84*h).lineTo(.24*h,.84*h).closePath().fill(s).moveTo(.5*h,.62*h).lineTo(.5*h,.1*h).stroke(o).poly([.55*h,.14*h,.84*h,.52*h,.55*h,.52*h]).fill(e).poly([.45*h,.24*h,.45*h,.52*h,.24*h,.52*h]).fill({ + color:s,alpha:.7} + ); + break; + case"spool":n.roundRect(.18*h,.14*h,.64*h,.1*h,.03*h).fill(s).roundRect(.18*h,.76*h,.64*h,.1*h,.03*h).fill(s).rect(.28*h,.24*h,.44*h,.52*h).fill({ + color:e,alpha:.9} + ); + for(let t=0; + t<5; + t++)n.moveTo(.28*h,h*(.3+.1*t)).lineTo(.72*h,h*(.26+.1*t)); + n.stroke({ + color:0,width:Math.max(1,.03*h),alpha:.25} + ); + break; + case"rod":n.moveTo(.14*h,.88*h).quadraticCurveTo(.5*h,.36*h,.9*h,.1*h).stroke(o).moveTo(.9*h,.1*h).quadraticCurveTo(.98*h,.44*h,.86*h,.62*h).stroke({ + ...o,width:.5*r,alpha:.8} + ).circle(.34*h,.66*h,.1*h).fill(e).moveTo(.14*h,.88*h).lineTo(.26*h,.74*h).stroke({ + ...o,width:1.8*r} + ); + break; + case"autorod":n.moveTo(.2*h,.9*h).lineTo(.34*h,.56*h).lineTo(.48*h,.9*h).stroke(o).moveTo(.3*h,.66*h).quadraticCurveTo(.56*h,.3*h,.9*h,.1*h).stroke(o).circle(.72*h,.7*h,.13*h).fill(e).circle(.72*h,.7*h,.05*h).fill(1184276); + for(let t=0; + t<6; + t++){ + const i=t/6*Math.PI*2; + n.rect(.72*h+Math.cos(i)*h*.15-.03*h,.7*h+Math.sin(i)*h*.15-.03*h,.06*h,.06*h).fill(e)} + break; + case"reel":n.circle(.46*h,.54*h,.3*h).stroke(o).circle(.46*h,.54*h,.12*h).fill(e).moveTo(.46*h,.54*h).lineTo(.8*h,.2*h).stroke(o).circle(.82*h,.18*h,.07*h).fill(s).moveTo(.2*h,.86*h).lineTo(.72*h,.86*h).stroke(o); + break; + case"bobber":n.moveTo(.5*h,.04*h).lineTo(.5*h,.22*h).stroke(o).moveTo(.5*h,.78*h).lineTo(.5*h,.96*h).stroke(o).ellipse(.5*h,.5*h,.2*h,.3*h).fill(15921382).poly(Array.from({ + length:13} + ,(t,i)=>Math.PI+i/12*Math.PI).flatMap(t=>[.5*h+Math.cos(t)*h*.2,.5*h+Math.sin(t)*h*.3])).fill(15226687).ellipse(.5*h,.5*h,.2*h,.3*h).stroke({ + ...o,width:.6*r} + ); + break; + case"keepnet":{ + const t=[[.5,.2,.36,.09],[.5,.5,.3,.08],[.5,.8,.24,.07]]; + for(let i=0; + i<2; + i++){ + const[s,e,r]=t[i],[o,a,c]=t[i+1]; + for(const t of[-1,-.33,.33,1])n.moveTo(h*(s+r*t),h*e).lineTo(h*(o+c*t),h*a)} + n.stroke({ + color:s,width:.5*r,alpha:.75} + ); + for(const[i,s,e,r]of t)n.ellipse(h*i,h*s,h*e,h*r).stroke(o); + n.poly([.62*h,.16*h,.8*h,.02*h,.84*h,.2*h]).fill(e); + break} + case"shrimp":n.moveTo(.78*h,.3*h).bezierCurveTo(.72*h,.9*h,.2*h,.86*h,.22*h,.52*h).stroke({ + ...o,width:.2*h,color:15698538} + ).moveTo(.8*h,.28*h).lineTo(.92*h,.08*h).moveTo(.76*h,.26*h).lineTo(.62*h,.06*h).stroke({ + ...o,width:.5*r,color:15698538} + ).poly([.2*h,.5*h,.06*h,.36*h,.1*h,.6*h]).fill(15698538).circle(.72*h,.34*h,.04*h).fill(1776411); + break; + case"shell":n.moveTo(.5*h,.86*h).lineTo(.1*h,.46*h).arc(.5*h,.46*h,.4*h,Math.PI,0).lineTo(.5*h,.86*h).fill(15849399); + for(let t=0; + t<5; + t++){ + const i=Math.PI+(t+.5)*(Math.PI/5); + n.moveTo(.5*h,.84*h).lineTo(.5*h+Math.cos(i)*h*.36,.46*h+Math.sin(i)*h*.36)} + n.stroke({ + color:11897441,width:.6*r,cap:"round"} + ); + break; + case"lure":n.ellipse(.46*h,.46*h,.3*h,.16*h).fill(10148330).poly([.74*h,.46*h,.92*h,.3*h,.92*h,.62*h]).fill(10148330).ellipse(.4*h,.42*h,.14*h,.05*h).fill({ + color:16777215,alpha:.8} + ).circle(.26*h,.44*h,.035*h).fill(1776411).moveTo(.46*h,.62*h).lineTo(.46*h,.8*h).arc(.38*h,.8*h,.08*h,0,Math.PI).stroke({ + ...o,width:.6*r,color:14212576} + ); + break; + case"bigbait":n.moveTo(.14*h,.7*h).bezierCurveTo(.3*h,.3*h,.5*h,.9*h,.66*h,.5*h).bezierCurveTo(.74*h,.3*h,.84*h,.34*h,.88*h,.44*h).stroke({ + ...o,width:.16*h,color:14256800} + ).star(.74*h,.2*h,5,.14*h,.06*h).fill(e); + break; + case"map":n.poly([.1*h,.22*h,.36*h,.14*h,.64*h,.24*h,.9*h,.16*h,.9*h,.78*h,.64*h,.86*h,.36*h,.76*h,.1*h,.84*h]).fill(15325096).moveTo(.36*h,.14*h).lineTo(.36*h,.76*h).moveTo(.64*h,.24*h).lineTo(.64*h,.86*h).stroke({ + color:11901794,width:.5*r} + ).moveTo(.44*h,.42*h).lineTo(.56*h,.56*h).moveTo(.56*h,.42*h).lineTo(.44*h,.56*h).stroke({ + color:13780270,width:.8*r,cap:"round"} + ); + break; + case"people":n.circle(.36*h,.34*h,.14*h).fill(s).moveTo(.1*h,.86*h).bezierCurveTo(.1*h,.52*h,.62*h,.52*h,.62*h,.86*h).fill(s).circle(.68*h,.3*h,.12*h).fill({ + color:s,alpha:.65} + ).moveTo(.5*h,.56*h).bezierCurveTo(.62*h,.46*h,.92*h,.5*h,.92*h,.82*h).lineTo(.66*h,.82*h).fill({ + color:s,alpha:.65} + ); + break; + case"pin":n.moveTo(.5*h,.92*h).bezierCurveTo(.2*h,.6*h,.16*h,.46*h,.16*h,.38*h).arc(.5*h,.38*h,.34*h,Math.PI,0).bezierCurveTo(.84*h,.46*h,.8*h,.6*h,.5*h,.92*h).fill(s).circle(.5*h,.38*h,.13*h).fill(1184276); + break; + case"clock":n.circle(.5*h,.5*h,.38*h).stroke(o).moveTo(.5*h,.5*h).lineTo(.5*h,.26*h).moveTo(.5*h,.5*h).lineTo(.68*h,.6*h).stroke(o); + break; + case"check":n.moveTo(.18*h,.52*h).lineTo(.42*h,.76*h).lineTo(.84*h,.26*h).stroke({ + ...o,width:1.4*r} + )} + return n} + function Eki(t,i){ + const s=new ip; + s.eventMode="none"; + const e=i,[n,h,r]=t<=0?[3815998,3815998,3815998]:1===t?[15907131,16769674,12156183]:2===t?[13226712,16054522,9082783]:[13666900,15841677,9590320]; + return s.moveTo(.24*e,.1*e).lineTo(.76*e,.1*e).lineTo(.72*e,.4*e).bezierCurveTo(.68*e,.58*e,.32*e,.58*e,.28*e,.4*e).closePath().fill(n).moveTo(.24*e,.16*e).bezierCurveTo(.02*e,.16*e,.06*e,.44*e,.3*e,.44*e).stroke({ + color:r,width:.06*e,cap:"round"} + ).moveTo(.76*e,.16*e).bezierCurveTo(.98*e,.16*e,.94*e,.44*e,.7*e,.44*e).stroke({ + color:r,width:.06*e,cap:"round"} + ).rect(.45*e,.56*e,.1*e,.16*e).fill(r).roundRect(.28*e,.72*e,.44*e,.14*e,.03*e).fill(n).roundRect(.34*e,.14*e,.08*e,.28*e,.04*e).fill({ + color:h,alpha:.85} + ),s} + function Aki(t,i){ + const s=new ip; + s.eventMode="none"; + const e=1===t?15907131:2===t?13226712:13666900; + return s.poly([.3*i,0,.44*i,.34*i,.22*i,.34*i]).fill(4886754).poly([.7*i,0,.56*i,.34*i,.78*i,.34*i]).fill(13780270).circle(i/2,.62*i,.36*i).fill(e).circle(i/2,.62*i,.26*i).stroke({ + color:16777215,width:Math.max(1,.05*i),alpha:.55} + ),s} + Qt(yki,"fishingIcon"),Qt(Eki,"cupShape"),Qt(Aki,"medalShape"); + const Ski=[[255,215,177],[255,220,186],[193,204,214],[85,208,227]],Tki=[255/246,255/249,255/243,255/244],Cki=new Map; + function Oki(t){ + const i=8*t.race+t.skin; + let s=Cki.get(i); + if(s)return s; + const e=Ski[t.race],n=e.reduce((t,i)=>t+i*i,0),h=nOi[t.race][t.skin],r=[h>>16,h>>8&255,255&h]; + s=new bf({ + resolution:"inherit",antialias:"inherit"} + ); + const[o,a,c]=e.map(i=>i*Tki[t.race]/n),[l,u,d]=r; + return s.matrix=[l*o,l*a,l*c,0,0,u*o,u*a,u*c,0,0,d*o,d*a,d*c,0,0,0,0,0,1,0],Cki.set(i,s),s} + function Iki(t,i){ + const s=new Ve,e=new Ye(t),n=new ip,h=[[346,367,348,354,356,350,366,350,380,350,387,357,390,368],[346,367,348,353,356,349,366,349,381,349,389,356,393,368],[346,367,348,355,356,351,366,351,380,351,388,358,391,368],[346,367,348,353,356,349,366,349,381,349,389,356,393,368]][i.race]; + return n.moveTo(h[0],h[1]).bezierCurveTo(h[2],h[3],h[4],h[5],h[6],h[7]).bezierCurveTo(h[8],h[9],h[10],h[11],h[12],h[13]).lineTo(346,368).closePath().fill(16777215),e.label=`free-hand-skin-${ + i.race} + `,e.filters=[Oki(i)],s.addChild(e,n),e.mask=n,s} + Qt(Oki,"skinFilter"),Qt(Iki,"buildFreeHandSkin"); + const kki=[[{ + eyes:[[211,200],[271,200]],cheeks:[[205,220],[284,219]],ear:[328,217],hull:[190,178,207,154,277,141,300,181,300,222,278,239,222,240,196,229]} + ,{ + eyes:[[213,199],[277,197]],cheeks:[[211,223],[289,219]],ear:[337,206],hull:[187,180,206,151,263,145,305,180,304,224,277,242,222,242,195,230]} + ],[{ + eyes:[[212,201],[271,200]],cheeks:[[210,223],[285,220]],ear:[329,212],hull:[192,181,207,152,277,140,302,180,302,224,279,240,222,241,196,229]} + ,{ + eyes:[[213,199],[277,197]],cheeks:[[212,223],[289,220]],ear:[337,202],hull:[188,181,206,151,263,145,306,180,305,224,277,243,221,243,195,230]} + ],[{ + eyes:[[212,200],[271,201]],cheeks:[[208,221],[284,220]],ear:[329,216],hull:[190,178,207,154,277,136,301,180,300,223,278,240,221,241,196,230]} + ,{ + eyes:[[213,198],[277,197]],cheeks:[[211,223],[290,220]],ear:[337,206],hull:[188,180,206,151,263,144,306,180,305,225,277,243,221,243,195,230]} + ],[{ + eyes:[[212,200],[271,200]],cheeks:[[204,211],[283,210]],ear:[339,186],hull:[190,178,207,153,277,138,301,178,300,223,278,240,221,241,196,229]} + ,{ + eyes:[[212,197],[277,197]],cheeks:[[206,212],[290,211]],ear:[350,180],hull:[188,180,206,151,263,144,305,180,305,225,277,243,221,243,195,230]} + ]],Rki=Qt((t,i=2497046)=>({ + width:t,color:i,cap:"round",join:"round"} + ),"stroke"); + function xki(t){ + const i=kki[t.race][t.sex],s=new ip,e=Qt(i=>t.feats.includes(i),"has"); + if(e(1))for(const[n,h]of i.cheeks){ + s.ellipse(n,h,9,4.5).fill({ + color:15628921,alpha:.55} + ); + for(const t of[-3,1,5])s.moveTo(n+t-1,h-1).lineTo(n+t,h+1.5).stroke(Rki(1.2,13196642))} + if(e(3)){ + const[t,e]=i.cheeks[1]; + s.moveTo(t-3,e-6).lineTo(t+2,e+6).stroke(Rki(2.5,10178641)); + for(const i of[-2,2])s.moveTo(t-4,e+i+1).lineTo(t+3,e+i-2).stroke(Rki(1.6,10968155))} + if(e(5)){ + const[t,e]=i.eyes[0]; + s.moveTo(190,e-10).lineTo(t,e-3).lineTo(300,e-29).stroke(Rki(4,2762022)),s.moveTo(t-12,e-13).quadraticCurveTo(t,e-17,t+13,e-10).lineTo(t+11,e+8).quadraticCurveTo(t,e+20,t-11,e+8).closePath().fill(3156780).stroke(Rki(2.5,1446680)),s.moveTo(t-7,e-8).quadraticCurveTo(t,e-11,t+6,e-7).stroke(Rki(1.7,6050128))} + if(e(4)){ + const[t,e]=i.eyes; + for(const[n,h]of i.eyes)s.ellipse(n,h+1,16,17).stroke(Rki(3.5)); + s.moveTo(t[0]+16,t[1]-1).quadraticCurveTo((t[0]+e[0])/2,t[1]-6,e[0]-16,e[1]-1).stroke(Rki(3)),s.moveTo(t[0]-16,t[1]-4).lineTo(191,t[1]-8).stroke(Rki(3)),s.moveTo(e[0]+16,e[1]-4).lineTo(301,e[1]-9).stroke(Rki(3))} + return s} + function Pki(t){ + const i=new ip; + if(t.feats.includes(6)){ + const[s,e]=kki[t.race][t.sex].ear; + i.ellipse(s,e+5,4.7,6.5).stroke(Rki(4,3154712)),i.ellipse(s,e+5,4.7,6.5).stroke(Rki(2.3,15317589)),i.circle(s,e-1,2).fill(16770722)} + return i} + Qt(xki,"buildFaceDetails"),Qt(Pki,"buildEarring"); + const Nki=[[[210,128,224,111,290,111,306,140,300,181,293,183,276,156,231,203,219,189,214,171,204,186,200,188],[210,128,224,111,290,111,306,140,307,174,298,174,265,142,259,190,233,187,216,178,205,157,200,178,200,182]],[[210,128,224,111,290,111,306,140,300,182,291,183,271,154,247,209,224,199,215,173,206,186,200,190],[210,128,224,111,290,111,306,140,307,174,298,173,264,144,257,200,234,190,216,181,206,156,200,178,200,182]],[[210,128,224,111,290,111,306,140,300,180,292,182,276,141,248,138,223,185,214,179,207,167,200,186,200,190],[210,128,224,111,290,111,306,140,307,173,300,173,258,123,250,155,244,191,224,188,208,173,202,159,200,177,200,181]],[[210,128,224,111,290,111,306,140,307,177,299,178,279,143,239,202,223,191,217,172,206,188,200,192],[210,128,224,111,290,111,306,140,307,174,299,175,265,140,258,200,234,191,217,181,208,162,200,180,200,184]]],Lki=new mf({ + strength:1.3,quality:3} + ); + function Dki(t){ + const i=(new ip).poly([...Nki[t.race][t.sex]]).fill(16119285).stroke({ + width:5,color:16119285,join:"round"} + ); + return i.tint=nOi[t.race][t.skin],i.filters=[Lki],i.label="native-forehead",i} + Qt(Dki,"buildNativeForehead"); + const Gki=1971215,Bki=15721679,Uki=7029798,Fki={ + autoGenerateMipmaps:!0,magFilter:"linear",minFilter:"linear",mipmapFilter:"nearest"} + ; + function $ki(t,i){ + const s=Qt(t=>Math.max(0,Math.min(255,Math.round(t*i))),"f"); + return s(t>>16)<<16|s(t>>8&255)<<8|s(255&t)} + function Hki(t,i,s,e,n=0,h=0,r=2*Math.PI,o=28){ + const a=[],c=Math.cos(n),l=Math.sin(n); + for(let u=0; + u<=o; + u++){ + const n=h+u/o*(r-h),d=Math.cos(n)*s,f=Math.sin(n)*e; + a.push(t+d*c-f*l,i+d*l+f*c)} + return a} + Qt($ki,"shade"),Qt(Hki,"ellipsePts"); + const Wki=Qt(t=>({ + width:t,color:Gki,join:"round",cap:"round"} + ),"ink"),Vki=Qt(t=>({ + skin:nOi[t.race][t.skin],hair:oOi[t.hairColor],cloth:fOi[t.outfitColor],hat:dOi[t.outfit].hat,style:rOi[t.sex][t.hair]??rOi[t.sex][0]} + ),"colorsOf"),jki=Qt((t,i)=>t.feats.includes(i),"has"); + function Kki(t,i,s,e,n,h){ + const r=-e*s*.15; + if("bob"===i)t.roundRect(1.14*-s+r,.92*-s,2.28*s,1.7*s,.62*s).fill(n).stroke(Wki(h)); + else if("long"===i)t.roundRect(1.16*-s+r,.92*-s,2.32*s,2.45*s,.7*s).fill(n).stroke(Wki(h)); + else if("twin"===i)for(const o of e?[-1]:[-1,1])t.poly(Hki(o*s*1.14+r,.6*s,.34*s,.62*s,.25*o)).fill(n).stroke(Wki(h)); + else"pony"===i?t.poly(Hki(e?1.12*-s:1.05*s,e?.15*s:.35*s,.33*s,.76*s,e?.55:-.3)).fill(n).stroke(Wki(h)):"tied"===i&&t.circle(e?.98*-s:.55*s,e?.5*-s:.95*-s,.3*s).fill(n).stroke(Wki(h)); + "short"!==i&&"shag"!==i&&"twin"!==i&&"pony"!==i||t.ellipse(r,.12*-s,1.08*s,.98*s).fill(n).stroke(Wki(h))} + function zki(t,i,s,e,n,h){ + if(1===i?t.moveTo(e*s*.8,.14*-s).quadraticCurveTo(e*s*1.5,.36*-s,e*s*1.86,.66*-s).quadraticCurveTo(e*s*1.42,.08*s,e*s*.86,.3*s).closePath():3===i?t.moveTo(e*s*.84,.16*-s).quadraticCurveTo(e*s*1.25,.2*-s,e*s*1.5,.42*-s).quadraticCurveTo(e*s*1.25,.2*s,e*s*.86,.32*s).closePath():t.ellipse(e*s*.96,.12*s,.19*s,.25*s),t.fill(n).stroke(Wki(h)),0===i||2===i){ + const i=e>0?-1.2:Math.PI-1.2,r=e*s*.98,o=.13*s,a=.09*s; + t.moveTo(r+Math.cos(i)*a,o+Math.sin(i)*a).arc(r,o,a,i,i+2.4).stroke({ + width:.7*h,color:$ki(n,.72)} + )} + } + function Yki(t,i,s,e,n,h){ + if("bald"===i)return void t.ellipse(.35*-s,.6*-s,.2*s,.09*s).fill({ + color:16777215,alpha:.35} + ); + const r=e*s*.12,o={ + short:.3,shag:.26,tied:.46,bob:.22,twin:.26,pony:.28,long:.2} + [i],a={ + bob:.74,long:.95} + [i]??.06,c={ + short:[1.04,1.14,9],shag:[1.04,1.34,11],tied:[1.06,1.06,2],bob:[1.06,1.1,7],twin:[1.04,1.13,9],pony:[1.04,1.14,9],long:[1.06,1.08,5]} + [i]; + t.moveTo(1.05*-s,s*a).lineTo(1.05*-s,.05*s); + const[l,u,d]=c; + for(let g=0; + g<=d; + g++){ + const i=Math.PI*(1.02+g/d*.96),e=s*(g%2?u:l); + t.lineTo(Math.cos(i)*e+.3*r,Math.sin(i)*e*.98-.06*s)} + t.lineTo(1.05*s,.05*s).lineTo(1.05*s,s*a).lineTo(.8*s,s*a).lineTo(.82*s,-s*o+.08*s); + const f="long"===i?1:"shag"===i?6:5; + for(let g=f; + g>=0; + g--){ + const e=.82*-s+1.64*s*(g/f)+r,n="long"===i?-s*o:-s*o+(g%2?.16*s:.04*-s); + t.lineTo(e,n)} + t.lineTo(.82*-s,-s*o+.08*s).lineTo(.8*-s,s*a).closePath(),t.fill(n).stroke(Wki(h)); + const p=$ki(n,.72); + for(const[g,w,m,v]of[[-.35,-.95,-.2,-.45],[.12,-1,.18,-.5],[.52,-.82,.42,-.42]])t.moveTo(s*g+.3*r,s*w).lineTo(s*m+.3*r,s*v).stroke({ + width:.6*h,color:p,cap:"round"} + ); + if("twin"===i)for(const g of e?[-1]:[-1,1])t.circle(g*s*1.02,.12*s,.1*s).fill(16748451).stroke(Wki(.7*h)); + "pony"===i&&t.circle(e?.92*-s:.86*s,e?.32*-s:.2*-s,.1*s).fill(16748451).stroke(Wki(.7*h))} + function qki(t,i,s,e,n){ + t.moveTo(.86*-i+.5*s,.42*-i).quadraticCurveTo(s,.95*-i,.86*i+.5*s,.42*-i); + for(let h=5; + h>=0; + h--)t.lineTo(.8*-i+1.6*i*(h/5)+s,h%2?.1*-i:.32*-i); + t.closePath().fill(e).stroke(Wki(n))} + function Xki(t,i,s,e=0){ + const{ + skin:n,hair:h,cloth:r,hat:o,style:a} + =Vki(i),c=.09*s,l=e*s*.2; + "hood"===o?t.poly(Hki(-e*s*.12,.1*-s,1.34*s,1.3*s)).fill(r).stroke(Wki(c)):Kki(t,a,s,e,h,c); + const u=e?[-1]:[-1,1]; + for(const w of u)zki(t,i.race,s,w,n,c); + t.ellipse(0,0,s,.96*s).fill(n).stroke(Wki(c)),t.ellipse(l,.3*-s,.78*s,.2*s).fill({ + color:$ki(n,.86),alpha:.7} + ); + const d=[[.34*-s+l,.12*s,1,-1],[.32*s+l,.12*s,e?.78:1,1]],f=2===i.race; + for(const[w,m,v,_]of d){ + const e=w+_*s*.11*v,n=w-_*s*.11*v; + t.moveTo(e,m-.13*s).lineTo(n,m-.07*s).quadraticCurveTo(w-_*s*.13*v,m+.16*s,w,m+.15*s).quadraticCurveTo(w+_*s*.13*v,m+.14*s,e,m-.13*s).closePath().fill(f?2897218:1708560),f?t.circle(w,m+.03*s,.045*s).fill(9433343):t.circle(w+_*s*.025,m-.01*s,.035*s).fill(16777215),1===i.sex&&t.moveTo(e,m-.13*s).lineTo(e+_*s*.09*v,m-.2*s).stroke({ + width:.75*c,color:1708560,cap:"round"} + )} + if("bald"===a||"tied"===a)for(const[w,,m,v]of d)t.moveTo(w+v*s*.12*m,Jki(s)-.3*s).lineTo(w-v*s*.1*m,Jki(s)-.22*s).stroke({ + width:1.1*c,color:$ki(h,.8),cap:"round"} + ); + if(t.circle(l+e*s*.1,.3*s,.035*s).fill($ki(n,.7)),jki(i,1))for(const w of[-1,1])t.ellipse(w*s*.58+l,.38*s,.15*s,.08*s).fill({ + color:16744319,alpha:.42} + ); + if(jki(i,0))for(const[w,m]of[[-.58,.3],[-.47,.37],[-.64,.4],[.5,.3],[.42,.38],[.58,.41]])t.circle(w*s+l,m*s,.035*s).fill({ + color:9062952,alpha:.7} + ); + if(jki(i,3)){ + t.moveTo(l-.62*s,.2*s).lineTo(l-.3*s,.48*s).stroke({ + width:.9*c,color:11028554,cap:"round"} + ); + for(const i of[.3,.65]){ + const e=l-s*(.62-.32*i),n=s*(.2+.28*i); + t.moveTo(e-.06*s,n+.07*s).lineTo(e+.06*s,n-.07*s).stroke({ + width:.7*c,color:11028554,cap:"round"} + )} + } + const p=.52*s; + if(3===i.race){ + t.ellipse(l,p,.2*s,.08*s).fill(2758676); + for(const i of[-1,1])t.moveTo(l+i*s*.16-.06*s,p+.04*s).lineTo(l+i*s*.2,p-.2*s).lineTo(l+i*s*.16+.06*s,p+.04*s).closePath().fill(16511968).stroke(Wki(.6*c))} + else t.moveTo(l-.08*s,p).quadraticCurveTo(l,p+.05*s,l+.08*s,p).stroke({ + width:.85*c,color:4858904,cap:"round"} + ); + if(jki(i,2)&&(t.moveTo(l-.66*s,.22*s).quadraticCurveTo(l-.55*s,1.16*s,l,1.14*s).quadraticCurveTo(l+.55*s,1.16*s,l+.66*s,.22*s).quadraticCurveTo(l+.32*s,.6*s,l,.5*s).quadraticCurveTo(l-.32*s,.6*s,l-.66*s,.22*s).closePath().fill(h).stroke(Wki(c)),t.poly(Hki(l-.15*s,.43*s,.17*s,.07*s,.3)).fill(h),t.poly(Hki(l+.15*s,.43*s,.17*s,.07*s,-.3)).fill(h)),jki(i,4)){ + for(const[i,e,n]of d)t.ellipse(i,e+.02*s,.22*s*n,.21*s).stroke({ + width:.85*c,color:1708560} + ); + t.moveTo(d[0][0]+.22*s,d[0][1]).lineTo(d[1][0]-.22*s*d[1][2],d[1][1]).stroke({ + width:.85*c,color:1708560} + )} + if(jki(i,5)){ + const[i,e]=d[0]; + t.moveTo(.98*-s,.08*-s).lineTo(i,e).lineTo(.96*s,.5*-s).stroke({ + width:.8*c,color:1314832} + ),t.ellipse(i,e+.02*s,.21*s,.2*s).fill(1314832)} + if("hood"===o){ + "bald"!==a&&qki(t,s,l,h,c); + const e=.8*Math.PI,o=2.2*Math.PI,d=.4*l,f=.04*-s,p=Hki(d,f,1.24*s,1.2*s,0,e,o,32),g=Hki(d,f,1*s,.97*s,0,o,e,32); + if(t.poly([...p,...g]).fill(r).stroke(Wki(c)),t.poly(Hki(d,f,1.04*s,1.01*s,0,e+.08,o-.08,32),!1).stroke({ + width:.8*c,color:Bki} + ),1===i.race||3===i.race)for(const h of u)zki(t,i.race,s,h,n,c)} + else Yki(t,a,s,e,h,c); + if(f)for(const w of[0,.5,1]){ + const i=l-.55*s+.38*s*w,e=.5*-s-.06*s*w; + 0===w&&t.moveTo(l-.55*s,.5*-s).lineTo(l-.17*s,.56*-s).stroke({ + width:.8*c,color:5199974} + ),t.moveTo(i,e-.07*s).lineTo(i,e+.07*s).stroke({ + width:.7*c,color:5199974} + )} + if(jki(i,6))for(const w of u)t.circle(w*s*.98,.42*s,.07*s).stroke({ + width:.8*c,color:15251504} + ); + const g=.3*l; + "rain"===o?(t.ellipse(g,.46*-s,1.48*s,.38*s).fill(r).stroke(Wki(c)),t.moveTo(.82*-s+g,.5*-s).quadraticCurveTo(.88*-s+g,1.36*-s,g+.05*s,1.34*-s).quadraticCurveTo(.9*s+g,1.32*-s,.84*s+g,.5*-s).closePath().fill($ki(r,.95)).stroke(Wki(c)),t.moveTo(.8*-s+g,.66*-s).quadraticCurveTo(g,.56*-s,.82*s+g,.66*-s).stroke({ + width:1.4*c,color:$ki(r,.62)} + ),t.ellipse(g-.35*s,1.05*-s,.2*s,.08*s).fill({ + color:16777215,alpha:.3} + )):"cap"===o&&(t.poly(Hki(.04*-s+g,.86*-s,1.06*s,.38*s,-.12)).fill(r).stroke(Wki(c)),t.circle(.04*-s+g,1.24*-s,.17*s).fill(Bki).stroke(Wki(.8*c)))} + Qt(Kki,"drawHairBack"),Qt(zki,"drawEar"),Qt(Yki,"drawHairFront"),Qt(qki,"drawFringe"),Qt(Xki,"drawHead"); + const Jki=Qt(t=>.12*t,"y0"); + function Qki(t,i,s,e){ + const{ + skin:n,cloth:h} + =Vki(s),r=.08*e; + t.clear(),i.clear(),t.ellipse(0,0,.85*e,.14*e).fill({ + color:0,alpha:.28} + ); + for(const l of[-1,1])t.roundRect(l*e*.25-.17*e,.82*-e,.34*e,.72*e,.1*e).fill(2828853).stroke(Wki(r)),t.roundRect(l*e*.27-.24*e,.36*-e,.48*e,.38*e,.12*e).fill(Uki).stroke(Wki(r)),t.circle(l*e*.27+l*e*.12,.24*-e,.045*e).fill(15251504); + const o=1.95*-e; + 3===s.outfit&&t.moveTo(.6*-e,o+.1*e).lineTo(.6*e,o+.1*e).lineTo(1*e,.45*-e).lineTo(1*-e,.45*-e).closePath().fill($ki(h,.82)).stroke(Wki(r)); + const a=1===s.outfit?h:(s.outfit,Bki); + if(t.roundRect(.64*-e,o,1.28*e,e*(1===s.outfit?1.5:1.3),.3*e).fill(a).stroke(Wki(r)),0===s.outfit)for(const l of[-1,1]){ + t.roundRect(l>0?.08*e:.64*-e,o,.56*e,1.3*e,.22*e).fill(h).stroke(Wki(r)); + for(let i=0; + i<2; + i++)t.roundRect(.1*-e,o+e*(.3+.22*i),.2*e,.07*e,.03*e).fill(14263872)} + if(1===s.outfit){ + t.rect(.42*-e,o+.18*e,.08*e,1*e).fill({ + color:16777215,alpha:.25} + ); + for(let i=0; + i<3; + i++)t.roundRect(.1*-e,o+e*(.28+.26*i),.2*e,.08*e,.03*e).fill(Uki)} + if(2===s.outfit){ + for(let i=o+.3*e; + i<o+1.2*e; + i+=.26*e)t.rect(.6*-e,i,1.2*e,.12*e).fill(h); + t.moveTo(.3*-e,o+.04*e).lineTo(.3*e,o+.04*e).lineTo(0,o+.46*e).closePath().fill($ki(h,.75)).stroke(Wki(.8*r))} + 3===s.outfit&&(t.moveTo(.66*-e,o+.05*e).lineTo(.66*e,o+.05*e).lineTo(.5*e,o+.7*e).lineTo(0,o+.5*e).lineTo(.5*-e,o+.7*e).closePath().fill(h).stroke(Wki(r)),t.circle(0,o+.2*e,.1*e).fill(15251504).stroke(Wki(.7*r))),t.roundRect(.64*-e,o+.98*e,1.28*e,.16*e,.05*e).fill(5913122).stroke(Wki(.8*r)),t.circle(.05*e,o+1.06*e,.09*e).stroke({ + width:.9*r,color:15251504} + ); + const c=1===s.outfit||3===s.outfit?h:Bki; + t.roundRect(.58*e,o+.1*e,.3*e,.85*e,.14*e).fill(c).stroke(Wki(r)),t.roundRect(.58*e,o+.62*e,.3*e,.2*e,.06*e).fill(Uki),t.circle(.73*e,o+1*e,.14*e).fill(n).stroke(Wki(r)),t.moveTo(.62*-e,o-2.1*e).lineTo(.98*-e,o+1.1*e).stroke({ + width:.09*e,color:9067051,cap:"round"} + ),t.moveTo(.62*-e,o-2.1*e).lineTo(.98*-e,o+1.1*e).stroke({ + width:.03*e,color:13146714,cap:"round"} + ),t.moveTo(.62*-e,o-2.1*e).quadraticCurveTo(1.2*-e,o-1.4*e,1.25*-e,o-.7*e).stroke({ + width:.025*e,color:15263976,alpha:.7} + ),t.ellipse(1.25*-e,o-.6*e,.09*e,.13*e).fill(14256698).stroke(Wki(.6*r)),t.roundRect(.98*-e,o+.1*e,.32*e,.62*e,.14*e).fill(c).stroke(Wki(r)),t.circle(.84*-e,o+.72*e,.15*e).fill(n).stroke(Wki(r)),i.position.set(0,o-.62*e),Xki(i,s,e,0)} + Qt(Qki,"drawFront"); + const Zki=[{ + body:[-1,77],tip:[0,-124]} + ,{ + body:[-15,74],tip:[62,-124]} + ]; + function tRi(t,i,s){ + const{ + skin:e,hair:n,cloth:h,hat:r,style:o} + =Vki(i),a=Zki[s],c=128+a.body[0],l=128+a.body[1],u=128+a.tip[0],d=128+a.tip[1],f=c+.22*(u-c)+(s?6:0),p=l-74; + for(const _ of[-1,1])t.ellipse(c+56*_,l-62,12,18).fill(Uki).stroke(Wki(4)); + t.ellipse(c,l-2,56,33).fill(2===i.outfit?Bki:h).stroke(Wki(4)),2===i.outfit&&(t.roundRect(c-36,l-2,72,30,6).fill(h).stroke(Wki(3.2)),t.moveTo(c-30,l+4).lineTo(c+30,l+4).stroke({ + width:3,color:Bki} + )),0===i.outfit&&t.moveTo(c,l-34).lineTo(c,l+30).stroke({ + width:3,color:$ki(h,.7)} + ),3===i.outfit&&t.moveTo(c-56,l-6).quadraticCurveTo(c,l+50,c+56,l-6).closePath().fill($ki(h,.85)).stroke(Wki(4)); + const g=1===i.outfit||3===i.outfit?h:Bki; + for(const _ of[-1,1])t.moveTo(c+44*_,l-18).quadraticCurveTo(c+40*_,l-60,f+9*_,p+6).stroke({ + width:17,color:Gki,cap:"round"} + ),t.moveTo(c+44*_,l-18).quadraticCurveTo(c+40*_,l-60,f+9*_,p+6).stroke({ + width:11,color:g,cap:"round"} + ); + t.moveTo(f,p+18).lineTo(u,d).stroke({ + width:8,color:Gki,cap:"round"} + ),t.moveTo(f,p+18).lineTo(u,d).stroke({ + width:5,color:10119733,cap:"round"} + ); + for(const _ of[.25,.5,.75])t.circle(f+(u-f)*_,p+18+(d-p-18)*_,3.5).fill(15260864); + for(const _ of[-1,1])t.circle(f+7*_,p+4,7).fill(e).stroke(Wki(3.2)); + const w=c+(s?4:0),m=l-6,v=31; + if(("none"===r||"cap"===r)&&("long"!==o&&"bob"!==o||t.ellipse(w,m+("long"===o?12:4),37,v+("long"===o?14:6)).fill(n).stroke(Wki(4)),"pony"===o&&t.poly(Hki(w+5,m+30,10,18,-.2)).fill(n).stroke(Wki(4)),"twin"===o))for(const _ of[-1,1])t.poly(Hki(w+28*_,m+20,9,16,.5*_)).fill(n).stroke(Wki(4)); + if((1===i.race||3===i.race)&&"rain"!==r)for(const _ of[-1,1]){ + const s=1===i.race?1:.6; + t.moveTo(w+26*_,m-4).lineTo(w+_*(v+20*s),m+18*s).lineTo(w+24*_,m+10).closePath().fill(e).stroke(Wki(4))} + if("rain"===r)t.circle(w,m,45).fill(h).stroke(Wki(4)),t.circle(w,m-2,25).fill($ki(h,.92)).stroke(Wki(3.2)),t.ellipse(w-9,m-12,10,5).fill({ + color:16777215,alpha:.3} + ); + else if("hood"===r)t.moveTo(w-v-3,m-4).quadraticCurveTo(w-v-1,m-v-4,w,m-v-3).quadraticCurveTo(w+v+1,m-v-4,w+v+3,m-4).quadraticCurveTo(w+v,m+v,w,m+v+14).quadraticCurveTo(w-v,m+v,w-v-3,m-4).closePath().fill(h).stroke(Wki(4)),t.moveTo(w-v+5,m-8).quadraticCurveTo(w,m-v+2,w+v-5,m-8).stroke({ + width:3,color:Bki,cap:"round"} + ); + else{ + if(t.circle(w,m,v).fill("bald"===o?e:n).stroke(Wki(4)),"bald"===o)t.ellipse(w-8,m-10,10,6).fill({ + color:16777215,alpha:.35} + ); + else{ + const i=$ki(n,.7); + for(let s=0; + s<7; + s++){ + const e=s/7*Math.PI*2+.3; + t.moveTo(w+5*Math.cos(e),m+3+5*Math.sin(e)).quadraticCurveTo(w+Math.cos(e+.5)*v*.6,m+Math.sin(e+.5)*v*.6,w+28*Math.cos(e+.2),m+28*Math.sin(e+.2)).stroke({ + width:2,color:i,cap:"round"} + )} + "tied"===o&&t.circle(w,m+v-3,9).fill(n).stroke(Wki(4))} + "cap"===r&&(t.circle(w,m-2,30).fill(h).stroke(Wki(4)),t.circle(w,m-2,7).fill(Bki).stroke(Wki(3.2)))} + } + Qt(tRi,"drawTop"); + let iRi=null; + const sRi={ + } + ; + let eRi=[],nRi=null; + function hRi(){ + return nRi??(nRi=(async()=>{ + try{ + const t=Qt(t=>CS.getAssetPath(`fishing/avatar/${ + t} + ?v=${ + SS.appVersion} + `),"path"),i=await fetch(t("avatar_parts.json"),{ + cache:"no-store"} + ); + if(!i.ok)return; + const{ + pages:s} + =await i.json(),e={ + } + ; + let n=[]; + for(const h of s){ + const i=await(await fetch(t(h),{ + cache:"no-store"} + )).json(),s=await fd.load({ + src:t(i.meta.image),parser:"loadTextures",data:{ + autoGenerateMipmaps:!0} + } + ),r=new Vn(s,i); + await r.parse(),Object.assign(e,r.textures),Array.isArray(i.meta.parts)&&!n.length&&(n=i.meta.parts)} + await Promise.all(["male-long","male-pony","female-long","female-pony"].map(async i=>{ + try{ + sRi[i]=await fd.load({ + src:t(`hair-v2/${ + i} + .webp`)+"&hair=redraw-1008-640-v3",parser:"loadTextures",data:{ + autoGenerateMipmaps:!0} + } + )} + catch(ort){ + } + } + )),iRi=e,eRi=n,pRi.clear()} + catch(ort){ + } + } + )()),nRi} + Qt(hRi,"loadAvatarParts"); + const rRi=["human","elf","undead","orc"]; + function oRi(t,i,s=0){ + var e; + if(!iRi||!eRi.length)return null; + const{ + skin:n,hair:h,cloth:r} + =Vki(t),o=rRi[t.race],a=t.sex?"f":"m",c="front"===i?rOi[t.sex][0]:0===t.sex&&2===t.hair?"tied":Vki(t).style,l="top"===i?`@${ + s} + `:"",u=Qt(s=>!(s.view!==i||void 0!==s.style&&s.style!==c||void 0!==s.race&&s.race!==o||void 0!==s.sex&&s.sex!==a||void 0!==s.outfit&&s.outfit!==t.outfit||void 0!==s.feat),"fits"),d=eRi.filter(u); + if(!d.some(t=>"skin"===t.tint&&t.race===o&&("top"===i||t.sex===a)))return null; + d.sort((t,i)=>t.layer-i.layer||(t.order??0)-(i.order??0)); + const f=[]; + for(const p of d){ + let s=p.file.replace(/\.png$/,""); + if("front"===i&&t.hair>0&&s.includes("/hair-"))continue; + const o=(null==(e=p.clipByOutfit)?void 0:e[String(t.outfit)])?`${ + s} + --hat${ + t.outfit} + ${ + l} + `:null,a=o&&iRi[o]?o:`${ + s} + ${ + l} + `; + iRi[a]&&f.push([a,"hair"===p.tint?h:"skin"===p.tint?n:"cloth"===p.tint?r:null])} + return f} + Qt(oRi,"layersFor"); + const aRi=Qt(t=>t.hair>0&&!sRi[`${ + t.sex?"female":"male"} + -${ + 1===t.hair?"long":"pony"} + `]?oRi({ + ...t,hair:0} + ,"front"):oRi(t,"front"),"frontLayers"),cRi=Qt((t,i)=>oRi(t,"top",i),"topLayers"); + function lRi(t){ + const i=new Ve; + for(const[s,e]of t){ + const t=new Ye(iRi[s]); + t.label=s,null!==e&&(t.tint=e),i.addChild(t)} + return i.eventMode="none",i} + Qt(lRi,"stack"); + const uRi=[{ + long:[11,12,.37,.34],pony:[67,2,.31,.31]} + ,{ + long:[64,3,.3,.3],pony:[105,-5,.28,.31]} + ]; + function dRi(t,i){ + const s=new Ve,e=1===t.hair?"long":"pony",n=sRi[`${ + t.sex?"female":"male"} + -${ + e} + `]; + if(!n)return s; + const[h,r,o,a]=uRi[t.sex][e],c=new Ye(n); + c.label=`hair-v2/${ + t.sex} + -${ + e} + `,c.position.set(h,r),c.scale.set(1254*o/n.width,1254*a/n.height),c.tint=oOi[t.hairColor]; + const l=(new ip).rect(0,i?220:0,512,i?292:220).fill(16777215); + return s.addChild(c,l),c.mask=l,s} + function fRi(t,i){ + const s=new Ve,e=t.hair>0; + e&&s.addChild(dRi(t,!0)); + let n=!t.feats.some(t=>6!==t); + const h=Qt(()=>{ + const i=new Ve,e=xki(t),h=(new ip).poly(kki[t.race][t.sex].hull).fill(16777215); + i.addChild(e,h),e.mask=h,s.addChild(i),n=!0} + ,"details"); + for(const[r,o]of i){ + n||!r.includes("tusks-")&&!r.includes("hair-front-")||h(); + const i=new Ye(iRi[r]); + if(i.label=r,null!==o&&(i.tint=o),r.includes("/outfit-")){ + const t=(new ip).poly([0,0,310,0,310,245,512,245,512,512,0,512]).fill(16777215); + s.addChild(i,t),i.mask=t} + else s.addChild(i); + r===`front/skin-${ + rRi[t.race]} + -${ + t.sex?"f":"m"} + `&&s.addChild(Dki(t)),1===t.sex&&r===`front/outfit-0-base-${ + rRi[t.race]} + -f`&&s.addChild(Iki(iRi[r],t))} + return n||h(),e&&s.addChild(dRi(t,!1)),jki(t,6)&&s.addChild(Pki(t)),s.eventMode="none",s} + Qt(dRi,"newHair"),Qt(fRi,"stackFront"); + const pRi=new Map; + let gRi=!1; + function wRi(){ + var t,i; + gRi||(gRi=!0,null==(i=(t=ES.app.canvas).addEventListener)||i.call(t,"webglcontextrestored",()=>setTimeout(()=>{ + var t,i; + for(const s of pRi.values()){ + if(s.tex.destroyed)continue; + const e=new Ve; + s.build(e),ES.app.renderer.render({ + container:e,target:s.tex,clear:!0} + ),null==(i=(t=s.tex.source).updateMipmaps)||i.call(t),e.destroy({ + children:!0} + )} + } + ,0)))} + function mRi(t,i,s,e,n=1){ + const h=pRi.get(t); + if(h&&!h.tex.destroyed)return h.tex; + wRi(); + const r=new Ve; + e(r); + const o=ES.app.renderer.generateTexture({ + target:r,frame:new Ui(0,0,i,s),resolution:n,textureSourceOptions:Fki} + ); + return r.destroy({ + children:!0} + ),pRi.set(t,{ + tex:o,w:i,h:s,build:e} + ),o} + Qt(wRi,"hookRestore"),Qt(mRi,"bake$2"); + const vRi=128/330; + function _Ri(t){ + return mRi(`p:${ + vOi(t)} + `,128,128,i=>{ + const s=aRi(t); + if(s){ + const e=fRi(t,s); + return e.scale.set(vRi),e.position.set(64-102.4,64-174*vRi),void i.addChild(e)} + const e=new ip; + e.position.set(64,72),Xki(e,t,40,0),i.addChild(e)} + ,2)} + function MRi(t,i,s=!1){ + return mRi(`t${ + i} + ${ + s?"s":""} + :${ + vOi(t)} + `,256,256,s=>{ + const e=cRi(t,i); + if(e)return void s.addChild(lRi(e)); + const n=new ip; + tRi(n,t,i),s.addChild(n)} + ,s?.5:1)} + function bRi(t){ + return[MRi(t,0),MRi(t,1)]} + function yRi(t){ + const i=aRi(t); + if(i){ + const s=new Ve,e=fRi(t,i),n=(new ip).rect(-64,-64,128,128).fill(16777215); + return e.scale.set(vRi),e.pivot.set(264,174),s.addChild(e,n),e.mask=n,s} + const s=new ip; + return Xki(s,t,40,0),s} + Qt(_Ri,"avatarPortrait"),Qt(MRi,"avatarTopPose"),Qt(bRi,"avatarTop"),Qt(yRi,"buildFace"); + const ERi=class extends Ve{ + constructor(t){ + super(),Zt(this,"body",new ip),Zt(this,"head",new ip),Zt(this,"art",null),this.R=t,this.eventMode="none",this.addChild(this.body,this.head)} + set(t){ + var i; + null==(i=this.art)||i.destroy({ + children:!0} + ),this.art=null; + const s=aRi(t); + if(s)return this.body.clear(),this.head.clear(),this.art=fRi(t,s),this.art.pivot.set(256,480),this.art.scale.set(this.R/100),void this.addChild(this.art); + Qki(this.body,this.head,t,this.R)} + } + ; + Qt(ERi,"AvatarFront"); + let ARi=ERi; + const SRi=[{ + id:"fish",text:"낚시",icon:"hook"} + ,{ + id:"gear",text:"장비",icon:"toolbox"} + ,{ + id:"tank",text:"어망",icon:"keepnet"} + ,{ + id:"quest",text:"퀘스트",icon:"trophy"} + ,{ + id:"shop",text:"상점",icon:"stall"} + ],TRi=class t extends uB{ + constructor(){ + super(),Zt(this,"paper",new ip),Zt(this,"pageBg",new ip),Zt(this,"chrome",new ip),Zt(this,"pages",new Ve),Zt(this,"pageMask",new ip),Zt(this,"overlay",new Ve),Zt(this,"me",new Ve),Zt(this,"meBg",new ip),Zt(this,"meFace",new Ye),Zt(this,"meLookRaw"),Zt(this,"dayBg",new ip),Zt(this,"dayText",rki("",zIi,12)),Zt(this,"walletBg",new ip),Zt(this,"goldIcon",_ki("gold",18)),Zt(this,"goldText",rki("",KIi,13)),Zt(this,"pearlIcon",_ki("pearl",18)),Zt(this,"pearlText",rki("",JIi,13)),Zt(this,"walletSig",""),Zt(this,"battleBg",new ip),Zt(this,"battleIcon",new ip),Zt(this,"battleText",rki("",KIi,13)),Zt(this,"battleSig",""),Zt(this,"castleDown",Qt(()=>!1,"castleDown")),Zt(this,"close",new Ve),Zt(this,"maximize",new Ve),Zt(this,"maximizeIcon",new ip),Zt(this,"navigation",new Ve),Zt(this,"subBar",new Ve),Zt(this,"subSig",""),Zt(this,"tabButtons",[]),Zt(this,"fxLayer",new Ve),Zt(this,"shown",{ + gold:-1,pearl:-1} + ),Zt(this,"target",{ + gold:-1,pearl:-1} + ),Zt(this,"devRow",new Ve),Zt(this,"devToggle",new dki("테스트",56,26,12)),Zt(this,"scrollTrack",new ip),Zt(this,"scrollY",0),Zt(this,"drag",null),Zt(this,"dragged",!1),Zt(this,"onResize",Qt(()=>{ + var t,i,s; + null==(i=null==(t=this.activePage)?void 0:t.onResize)||i.call(t),null==(s=this.activePage)||s.update(),this.refresh()} + ,"onResize")),Zt(this,"speedChip",new dki("×1",62,26,12)),Zt(this,"dayChip",new dki("+1일",62,26,12)),Zt(this,"tideChip",new dki("▸노을",62,26,12)),Zt(this,"goldChip",new dki("+골드",62,26,12)),Zt(this,"botsChip",new dki("+200명",62,26,12)),Zt(this,"boatChip",new dki("배 1",62,26,12)),Zt(this,"journeyChip",new dki("퀘스트+",62,26,12)),Zt(this,"giantChip",new dki("그림자",62,26,12)),Zt(this,"badgeChip",new dki("뱃지 ▸",62,26,12)),Zt(this,"raidChip",new dki("약탈",62,26,12)),Zt(this,"robbedChip",new dki("털리기",62,26,12)),Zt(this,"cutChip",new dki("줄끊김",62,26,12)),Zt(this,"breakChip",new dki("고장",62,26,12)),Zt(this,"hazardChip",new dki("재난",62,26,12)),Zt(this,"fixChip",new dki("다고침",62,26,12)),Zt(this,"brokenDummyChip",new dki("고장배",62,26,12)),Zt(this,"huntChip",new dki("사냥",62,26,12)),Zt(this,"huntCrowdChip",new dki("사냥꾼+",62,26,12)),Zt(this,"gearChip",new dki("장비+",62,26,12)),Zt(this,"netChip",new dki("어망+",62,26,12)),Zt(this,"resetChip",new dki("처음부터",62,26,12)),Zt(this,"resetArmedUntil",0),Zt(this,"botSpots",null),Zt(this,"plunderSpots",null),Zt(this,"timer",new kR(250)),Zt(this,"unsubscribe",[]),Zt(this,"activePage",null),Zt(this,"onNavigate",null),Zt(this,"backStack",[]),Zt(this,"backBtn",new Ve),Zt(this,"backBg",new ip),Zt(this,"backGlow",new ip),Zt(this,"backArrow",new ip),Zt(this,"backText",rki("",jIi,14)),Zt(this,"backNow",null),Zt(this,"onExit",null),Zt(this,"lastInput",performance.now()),Zt(this,"immersed",!1),Zt(this,"immerseTween",null),Zt(this,"wake",new Ve),Zt(this,"exchangeOnly",!1),Zt(this,"tutorialMode",!1),Zt(this,"tutorialEvents",new Map),Zt(this,"pointer",null),this.width=t.WIDTH,this.bg.visible=this.txtTitle.visible=this.btnClose.visible=!1,this.paper.eventMode="static",this.pageBg.eventMode="none",this.chrome.eventMode="none",this.pageMask.eventMode="none",this.pages.mask=this.pageMask,this.pages.position.set(t.CONTENT_X,t.CONTENT_Y),this.overlay.position.set(t.CONTENT_X,t.CONTENT_Y); + const i=(new ip).moveTo(14,14).lineTo(34,34).moveTo(34,14).lineTo(14,34).stroke({ + color:zIi,width:4,cap:"round"} + ); + i.eventMode="none",this.close.addChild(i),this.close.eventMode="static",this.close.cursor="pointer",this.close.hitArea=new Ui(-4,-4,56,56),this.close.on("pointertap",t=>{ + t.stopPropagation(),this.requestExit()} + ),this.maximizeIcon.eventMode="none",this.maximize.addChild(this.maximizeIcon),this.drawMaximizeIcon(),this.maximize.eventMode="static",this.maximize.cursor="pointer",this.maximize.hitArea=new Ui(-2,-4,50,56),this.maximize.on("pointertap",i=>{ + i.stopPropagation(),this.setFullscreen(!t.fullscreen)} + ),this.on("removed",()=>this.setFullscreen(!1)),this.on("pointerdowncapture",()=>{ + this.lastInput=performance.now(),this.pointer&&performance.now()-this.pointer.t0>300&&queueMicrotask(()=>this.endPoint())} + ),this.wake.eventMode="static",this.wake.visible=!1,this.wake.on("pointertap",t=>{ + var i,s; + t.stopPropagation(),(null==(s=null==(i=this.activePage)?void 0:i.immersiveTap)?void 0:s.call(i))||this.setImmersed(!1)} + ); + for(const{ + id:t,text:n,icon:h} + of SRi){ + const i=new Ve,s=new ip,e=rki(n,zIi,14),r=(new ip).circle(0,0,6).fill(14698538),o=yki(h,26,16777215); + s.eventMode="none",r.eventMode="none",r.visible=!1,i.addChild(s,o,e,r),i.eventMode="static",i.cursor="pointer",i.on("pointertap",i=>{ + i.stopPropagation(),this.selectTab(t,"user")} + ),this.navigation.addChild(i),this.tabButtons.push({ + id:t,root:i,bg:s,icon:o,text:e,dot:r} + )} + const s=RIi.getInstance(); + this.speedChip.onTap=()=>{ + s.devSpeed()} + ,this.dayChip.onTap=()=>{ + s.devSkipDay().then(()=>vH.getInstance().showMessage("하루를 넘겼어요 (꺼둔 시간으로 처리)"))} + ,this.tideChip.onTap=()=>{ + s.devSkipTide().then(t=>vH.getInstance().showMessage(t??`${ + mSi[PSi(s.now())]} + (으)로 넘겼어요 (꺼둔 시간으로 처리)`))} + ,this.goldChip.onTap=()=>{ + s.devAddGold()} + ,this.boatChip.onTap=()=>{ + s.devBoat().then(t=>vH.getInstance().showMessage(t??`배 ${ + s.state.gear.boat+1} + 단계로 바꿨어요`))} + ,this.botsChip.onTap=()=>{ + var t; + const i=(null==(t=this.botSpots)?void 0:t.call(this))??[]; + s.devBots(i).then(t=>vH.getInstance().showMessage(`가짜 낚시꾼 ${ + t} + 명을 30분 동안 띄웠어요`))} + ,this.journeyChip.onTap=()=>{ + s.devQuest().then(t=>vH.getInstance().showMessage(t??"들고 있는 퀘스트를 채웠어요 · NPC 에게 가서 마치기"))} + ,this.giantChip.onTap=()=>{ + ei(()=>Promise.resolve().then(()=>XGi),void 0).then(t=>t.FishingMainPage.getInstance().devGiant())} + ,this.badgeChip.onTap=()=>{ + nki.corner="right"===nki.corner?"left":"right",this.badgeChip.setText("right"===nki.corner?"뱃지 ▸":"◂ 뱃지"); + const t=this.activePage; + t&&(t.onHide(),t.onShow())} + ,this.raidChip.onTap=()=>{ + var t; + s.devPlunder("dummies",(null==(t=this.plunderSpots)?void 0:t.call(this,3))??[]).then(t=>vH.getInstance().showMessage(t??"어망이 찬 정박한 배 3척을 옆에 띄웠어요 (Zz) · 눌러서 망원경"))} + ,this.robbedChip.onTap=()=>{ + var t; + s.devPlunder("robMe",((null==(t=this.plunderSpots)?void 0:t.call(this,4))??[]).slice(3)).then(t=>vH.getInstance().showMessage(t??"수상한 낚시꾼이 내 어망을 털기 시작했어요"))} + ,this.cutChip.onTap=()=>{ + s.devPlunder("dummyCut").then(t=>vH.getInstance().showMessage(t??"시험 배 주인이 줄을 끊었어요"))} + ,this.breakChip.onTap=()=>{ + s.devBoatTest("boatBreak").then(t=>t&&vH.getInstance().showMessage(t))} + ,this.hazardChip.onTap=()=>{ + s.devBoatTest("boatHazard").then(t=>t&&vH.getInstance().showMessage(t))} + ,this.fixChip.onTap=()=>{ + s.devBoatTest("boatFix").then(t=>vH.getInstance().showMessage(t??"배를 다 고치고 도움 점수를 채웠어요"))} + ,this.brokenDummyChip.onTap=()=>{ + var t; + s.devBoatTest("brokenDummy",(null==(t=this.plunderSpots)?void 0:t.call(this,1))??[]).then(t=>vH.getInstance().showMessage(t??"옆에 고장 난 시험 배를 띄웠어요 · 눌러서 수리 돕기"))} + ,this.huntChip.onTap=()=>{ + s.devHunt("huntNow").then(t=>vH.getInstance().showMessage(t??"몬스터를 불렀어요 · 작살을 채웠어요 (4분)"))} + ,this.gearChip.onTap=()=>{ + s.devGear().then(t=>vH.getInstance().showMessage(t??"장비 33개를 넣었어요 (뽑기 30 + ★3·4·5)"))} + ,this.netChip.onTap=()=>{ + s.devNetFill().then(t=>vH.getInstance().showMessage(t??"어망을 가득 채웠어요 (앞 3마리 특대)"))} + ,this.huntCrowdChip.onTap=()=>{ + s.devHunt("huntCrowd").then(t=>vH.getInstance().showMessage(t??"가짜 사냥꾼 5명이 작살을 던졌어요"))} + ,this.resetChip.onTap=()=>{ + const t=performance.now(); + if(t>this.resetArmedUntil)return this.resetArmedUntil=t+3e3,this.resetChip.setText("한 번 더"),vH.getInstance().showMessage("한 번 더 누르면 낚시왕을 처음부터 다시 시작해요 (이 계정 · 나 만들기부터)"),void setTimeout(()=>{ + performance.now()>this.resetArmedUntil&&this.resetChip.setText("처음부터")} + ,3100); + this.resetArmedUntil=0,this.resetChip.setText("지우는 중"),s.devReset().then(t=>{ + t&&(this.resetChip.setText("처음부터"),vH.getInstance().showMessage(t))} + )} + ,this.devRow.addChild(this.speedChip,this.dayChip,this.tideChip,this.boatChip,this.goldChip,this.botsChip,this.journeyChip,this.giantChip,this.badgeChip,this.raidChip,this.robbedChip,this.cutChip,this.breakChip,this.hazardChip,this.fixChip,this.brokenDummyChip,this.huntChip,this.huntCrowdChip,this.gearChip,this.netChip,this.resetChip),this.devRow.visible=!1,this.devToggle.visible=OG.getInstance().development,this.devToggle.onTap=()=>{ + this.devRow.visible=!this.devRow.visible} + ,this.scrollTrack.eventMode="none",this.pages.eventMode="static",this.pages.on("wheel",i=>{ + this.maxScroll()<=0||(i.preventDefault(),i.stopPropagation(),this.scrollY+=i.deltaY*(1===i.deltaMode?16:2===i.deltaMode?t.contentHeight:1),this.updateScroll())} + ),this.pages.on("pointerdown",t=>{ + this.dragged=!1,this.drag={ + y:this.toLocal(t.global).y,scroll:this.scrollY,id:t.pointerId} + } + ),this.pages.on("pointermove",t=>this.moveScroll(t)),this.pages.on("pointerup",()=>{ + this.drag=null} + ),this.pages.on("pointerupoutside",()=>{ + this.drag=null} + ),this.pages.on("pointercancel",()=>{ + this.drag=null} + ),this.pages.on("pointertapcapture",t=>{ + this.dragged&&t.stopPropagation()} + ),this.goldIcon.pivot.set(9,9),this.pearlIcon.pivot.set(9,9),this.dayBg.eventMode=this.walletBg.eventMode=this.battleBg.eventMode=this.battleIcon.eventMode="none",this.meBg.circle(14,14,14).fill(GIi),this.meFace.anchor.set(.5),this.meFace.position.set(14,15),this.meFace.scale.set(.26); + const e=(new ip).circle(14,14,14).fill(16777215); + this.meFace.mask=e,this.meBg.eventMode=this.meFace.eventMode="none",this.me.addChild(this.meBg,this.meFace,e),this.me.visible=!1,this.me.eventMode="static",this.me.cursor="pointer",this.me.hitArea=new Ui(-6,-8,40,44),this.me.on("pointertap",t=>{ + t.stopPropagation(),ei(()=>Promise.resolve().then(()=>Qxi),void 0).then(t=>{ + t.FishingAvatarMaker.isOpen||t.FishingAvatarMaker.getInstance().open(!1)} + )} + ),ei(()=>Promise.resolve().then(()=>qdi),void 0).then(t=>{ + this.castleDown=()=>t.BattleController.getInstance().isCastleDestroyed()} + ),this.fxLayer.eventMode="none",this.backGlow.eventMode=this.backBg.eventMode=this.backArrow.eventMode="none",this.backBtn.addChild(this.backGlow,this.backBg,this.backArrow,this.backText),this.backBtn.visible=!1,this.backBtn.eventMode="static",this.backBtn.cursor="pointer",this.backBtn.on("pointertap",t=>{ + t.stopPropagation(),this.tapBack()} + ),this.addChild(this.paper,this.pageBg,this.pages,this.pageMask,this.overlay,this.chrome,this.subBar,this.backBtn,this.me,this.dayBg,this.dayText,this.walletBg,this.battleBg,this.battleIcon,this.battleText,this.goldIcon,this.goldText,this.pearlIcon,this.pearlText,this.devRow,this.devToggle,this.navigation,this.maximize,this.close,this.scrollTrack,this.fxLayer,this.wake),this.timer.addEventListener("timer",()=>this.onTimer())} + static getInstance(){ + return this.instance??(this.instance=new t)} + static get layoutHeight(){ + return this.fullscreen?ES.safeHeight:Math.min(960,ES.safeHeight-48)} + static get WIDTH(){ + return this.fullscreen?640:616} + static get footerTop(){ + return this.layoutHeight-this.FOOTER-(this.subOn?this.SUB_BAR:0)} + static get CONTENT_X(){ + return(this.WIDTH-this.CONTENT_W)/2} + static get BLEED_W(){ + return this.fullscreen?this.WIDTH:this.CONTENT_W} + static get OVERLAY_PAD(){ + return this.fullscreen?this.CONTENT_X:0} + static get contentTop(){ + return this.CONTENT_Y*(1-this.immersion)} + static get contentHeight(){ + const t=this.footerTop-this.CONTENT_Y-6; + return t+(this.layoutHeight-t)*this.immersion} + present(i){ + var s,e; + if(this.activePage===i&&this.parent)return i.update(),void this.refresh(); + if(this.parent||this.setFullscreen(!0),this.activePage!==i&&(this.setImmersed(!1,!0),null==(s=this.activePage)||s.onHide(),this.pages.removeChildren(),this.activePage=i,t.subOn=!!(null==(e=i.subTabs)?void 0:e.call(i)),this.scrollY=0,this.drag=null,this.pages.addChild(i)),i.onShow(),this.refresh(),!this.parent){ + super.show(),this.eventMode="static",this.timer.start(),ES.stage.on("resized",this.onResize); + const t=RIi.getInstance(); + t.open=!0,this.unsubscribe.push(t.onChange(()=>this.updateHeader()),t.onNotice(t=>vH.getInstance().showMessage(t)))} + } + setExchangeOnly(t){ + var i; + this.exchangeOnly=t; + for(const s of this.tabButtons)s.root.alpha=!t||"shop"===s.id||"quest"===s.id&&(null==(i=RIi.getInstance().social)?void 0:i.enabled)?1:.35; + ei(()=>Promise.resolve().then(()=>GUi),void 0).then(i=>i.FishingShopPage.getInstance().forceExchange(t))} + closeForSeason(){ + var t; + this.parent&&(this.hideImmediately(),null==(t=this.onExit)||t.call(this))} + async selectTab(t,i="jump"){ + var s,e,n; + if(this.exchangeOnly&&"shop"!==t&&("quest"!==t||!(null==(s=RIi.getInstance().social)?void 0:s.enabled)))return void vH.getInstance().showMessage("회차가 끝나 교환소만 열려 있어요"); + const h=null==(e=this.activePage)?void 0:e.tabId; + "user"===i||"fish"===t?this.backStack=[]:h&&h!==t&&(this.backStack[this.backStack.length-1]===t?this.backStack.pop():this.backStack.push(h)),h!==t||"fish"===t?(await(null==(n=this.onNavigate)?void 0:n.call(this,t)),this.drawBack()):this.drawBack()} + async goBack(){ + var t; + const i=this.backStack.pop(); + i?(await(null==(t=this.onNavigate)?void 0:t.call(this,i)),this.drawBack()):this.drawBack()} + tapBack(){ + var t,i,s,e; + (null==(i=null==(t=this.activePage)?void 0:t.backLabel)?void 0:i.call(t))?null==(e=(s=this.activePage).closeOne)||e.call(s):this.goBack(),this.drawBack()} + drawBack(){ + var t,i,s; + const e=(null==(i=null==(t=this.activePage)?void 0:t.backLabel)?void 0:i.call(t))??null,n=this.backStack[this.backStack.length-1],h=e??(n?(null==(s=SRi.find(t=>t.id===n))?void 0:s.text)??null:null),r=h?gki(h,"으로","로"):null; + if(r===this.backNow)return; + const o=!this.backNow&&!!r; + this.backNow=r,this.walletSig="",this.drawCurrency(),o&&(MR.fromTo(this.backBtn.scale,{ + x:.6,y:.6} + ,{ + x:1,y:1,duration:.3,ease:"back.out(2.6)"} + ),MR.killTweensOf(this.backGlow),MR.fromTo(this.backGlow,{ + alpha:.95} + ,{ + alpha:0,duration:.7,repeat:1,delay:.25,ease:"power1.out"} + ),MR.fromTo(this.backGlow.scale,{ + x:1,y:1} + ,{ + x:1.12,y:1.45,duration:.7,repeat:1,delay:.25,ease:"power1.out"} + ))} + onTimer(){ + var t; + RIi.getInstance().tick(),null==(t=this.activePage)||t.update(),this.updateScroll(),this.updateHeader(),this.updateImmersion(),this.drawBack()} + updateImmersion(){ + var i; + if(this.tutorialMode)return; + const s=this.activePage; + if(!(t.fullscreen&&(null==s?void 0:s.fullBleed)&&0===this.overlay.children.length&&(null==(i=s.canImmerse)?void 0:i.call(s)))||this.isCastleDown())return this.lastInput=performance.now(),void(this.immersed&&this.setImmersed(!1)); + !this.immersed&&performance.now()-this.lastInput>=t.IMMERSE_AFTER_MS&&this.setImmersed(!0)} + get inTutorial(){ + return this.tutorialMode} + setTutorialMode(t){ + var i; + if(this.tutorialMode!==t){ + this.tutorialMode=t; + for(const i of[this.navigation,this.subBar,this.close,this.maximize,this.me,this.backBtn,this.devToggle,this.devRow])t?(this.tutorialEvents.set(i,i.eventMode??"passive"),i.eventMode="none"):i.eventMode=this.tutorialEvents.get(i)??i.eventMode; + t?(null==(i=this.immerseTween)||i.kill(),this.immerseTween=null,this.immersed=!0,this.wake.visible=!1,this.applyImmersion(1)):this.setImmersed(!1)} + } + setImmersed(i,s=!1){ + var e; + if(this.immersed===i&&!s)return; + this.immersed=i,this.lastInput=performance.now(),this.wake.visible=i&&!this.tutorialMode,null==(e=this.immerseTween)||e.kill(),this.immerseTween=null; + const n=i?1:0; + if(s)return void this.applyImmersion(n); + const h={ + t:t.immersion} + ; + this.immerseTween=MR.to(h,{ + t:n,duration:i?.6:.3,ease:i?"power2.inOut":"power2.out",onUpdate:Qt(()=>this.applyImmersion(h.t),"onUpdate"),onComplete:Qt(()=>{ + this.immerseTween=null} + ,"onComplete")} + )} + applyImmersion(i){ + var s,e,n,h,r; + t.immersion=i; + for(const t of[this.chrome,this.me,this.backBtn,this.dayBg,this.dayText,this.walletBg,this.battleBg,this.battleIcon,this.battleText,this.goldIcon,this.goldText,this.pearlIcon,this.pearlText,this.devRow,this.devToggle,this.navigation,this.subBar,this.maximize,this.close,this.scrollTrack])t.alpha=1-i; + null==(e=null==(s=this.activePage)?void 0:s.setImmersion)||e.call(s,i),null==(h=null==(n=this.activePage)?void 0:n.onResize)||h.call(n),this.layoutPageArea(); + for(const t of this.overlay.children)null==(r=t.layout)||r.call(t)} + layoutPageArea(){ + const i=this.pageSpan(); + this.pages.x=i.x,this.pageMask.clear().rect(i.x,t.contentTop,i.w,t.contentHeight).fill(16777215),this.updateScroll()} + updateHeader(){ + var t; + const i=RIi.getInstance(),s=i.state; + if(s.look!==this.meLookRaw){ + this.meLookRaw=s.look; + const t=i.look; + this.me.visible=!!t,t&&(this.meFace.texture=_Ri(t)),this.walletSig=""} + const e=i.season,n=i.seasonDays(); + this.dayText.text="exchangeOnly"===i.phase()&&(null==e?void 0:e.shopEndAt)?`교환만 · ${ + bki(e.shopEndAt)} + 까지`:i.isLastDay()?`${ + i.eventDay()} + 일차 · 오늘 회차 끝`:n?`${ + i.eventDay()} + 일차 / ${ + n} + 일`:(null==e?void 0:e.endAt)?`${ + i.eventDay()} + 일차 · ${ + bki(e.endAt)} + 끝`:`${ + i.eventDay()} + 일차`,this.dayText.textColor=i.isLastDay()||"exchangeOnly"===i.phase()?XIi:zIi; + for(const r of["gold","pearl"]){ + if(s[r]===this.target[r])continue; + const t=this.target[r]<0; + this.target[r]=s[r],MR.killTweensOf(this.shown,r),t?this.shown[r]=s[r]:MR.to(this.shown,{ + [r]:s[r],duration:.7,ease:"power2.out",onUpdate:Qt(()=>this.drawCurrency(),"onUpdate")} + )} + this.drawCurrency(),this.drawBattle(),this.speedChip.setText(`×${ + s.devSpeed} + `),this.boatChip.setText(`배 ${ + s.gear.boat+1} + `),this.tideChip.setText(`▸${ + mSi[(PSi(RIi.getInstance().now())+1)%4]} + `); + const h=yIi(i.dotsInput("tank"===(null==(t=this.activePage)?void 0:t.tabId))); + for(const r of this.tabButtons)r.dot.visible="quest"===r.id?h.quest:"tank"===r.id&&h.tank; + this.refreshSub()} + refreshSub(){ + var i,s,e,n,h; + const r=!!(null==(s=null==(i=this.activePage)?void 0:i.subTabs)?void 0:s.call(i)); + if(r===t.subOn)this.drawSub(); + else{ + t.subOn=r,this.refresh(),null==(n=null==(e=this.activePage)?void 0:e.onResize)||n.call(e); + for(const t of this.overlay.children)null==(h=t.layout)||h.call(t)} + } + drawSub(){ + var i,s; + const e=t.subOn?(null==(s=null==(i=this.activePage)?void 0:i.subTabs)?void 0:s.call(i))??null:null,n=t.CONTENT_X,h=t.CONTENT_W,r=t.footerTop+6,o=e?`${ + n} + |${ + r} + |${ + e.index} + |${ + e.items.join(",")} + |${ + (e.dots??[]).map(Number).join("")} + `:"off"; + if(o===this.subSig)return; + if(this.subSig=o,this.subBar.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),this.subBar.visible=!!e,!e)return; + const a=e.items.length,c=(h-8-4*(a-1))/a; + this.subBar.position.set(n,r); + const l=(new ip).roundRect(0,0,h,50,14).fill(GIi); + l.eventMode="none",this.subBar.addChild(l),e.items.forEach((t,i)=>{ + var s; + const n=i===e.index,h=new Ve; + if(h.position.set(4+i*(c+4),4),n){ + const t=(new ip).roundRect(0,0,c,42,10).fill(UIi); + t.eventMode="none",h.addChild(t)} + const r=rki(t,n?KIi:zIi,16); + if(oki(r,c-16),r.position.set((c-r.width)/2,(42-r.height)/2),h.addChild(r),null==(s=e.dots)?void 0:s[i]){ + const t=(new ip).circle(0,0,6).fill(15029053); + t.eventMode="none",t.position.set(c-12,9),h.addChild(t)} + h.eventMode="static",h.cursor="pointer",h.hitArea=new Ui(-2,-8,c+4,58),h.on("pointertap",t=>{ + var s,e; + t.stopPropagation(),n||(null==(e=null==(s=this.activePage)?void 0:s.selectSub)||e.call(s,i),this.resetScroll(),queueMicrotask(()=>this.refreshSub()))} + ),this.subBar.addChild(h)} + )} + drawCurrency(){ + this.goldText.text=Math.round(this.shown.gold).toLocaleString(),this.pearlText.text=Math.round(this.shown.pearl).toLocaleString(); + const i=`${ + this.dayText.text} + |${ + this.goldText.text} + |${ + this.pearlText.text} + |${ + this.backNow} + `; + if(i===this.walletSig)return; + this.walletSig=i,oki(this.goldText,110),oki(this.pearlText,80); + const s=t.HEADER/2,e=s-14,n=this.backNow; + let h; + if(this.backBtn.visible=!!n,this.me.visible=!!RIi.getInstance().look&&!n,this.dayBg.visible=this.dayText.visible=!n,n){ + this.backText.text=n; + const t=32,i=30+this.backText.width+14; + this.backBg.clear().roundRect(0,-t/2,i,t,t/2).fill(VIi),this.backGlow.clear().roundRect(0,-t/2,i,t,t/2).stroke({ + color:VIi,width:3} + ),this.backGlow.pivot.set(i/2,0),this.backGlow.x=i/2,this.backGlow.alpha=0,this.backArrow.clear().moveTo(19,-7).lineTo(12,0).lineTo(19,7).stroke({ + color:jIi,width:3,cap:"round",join:"round"} + ),this.backText.position.set(26,-this.backText.height/2),this.backBtn.position.set(14,s),this.backBtn.hitArea=new Ui(-10,-t/2-8,i+20,t+16),h=14+i+8} + else{ + const t=this.me.visible?50:16; + this.me.position.set(16,s-14),this.dayText.position.set(t+10,s-this.dayText.height/2); + const i=this.dayText.width+20; + this.dayBg.clear().roundRect(t,e,i,28,9).fill(GIi),h=t+i+6} + this.goldIcon.position.set(h+9+9,s),this.goldText.position.set(this.goldIcon.x+9+5,s-this.goldText.height/2),this.pearlIcon.position.set(this.goldText.x+Math.max(36,this.goldText.width)+12+9,s),this.pearlText.position.set(this.pearlIcon.x+9+5,s-this.pearlText.height/2),this.walletBg.clear().roundRect(h,e,this.pearlText.x+Math.max(12,this.pearlText.width)+10-h,28,9).fill(GIi)} + drawBattle(){ + const i=t.fullscreen; + if(this.battleBg.visible=this.battleIcon.visible=this.battleText.visible=i,!i)return void(this.battleSig=""); + const s=this.isCastleDown(),e=s&&Math.floor(performance.now()/500)%2==0,n=`${ + EG.wave.toLocaleString()} + 층`,h=`${ + n} + |${ + s} + |${ + e} + |${ + t.WIDTH} + |${ + this.devToggle.visible} + `; + if(h===this.battleSig)return; + this.battleSig=h,this.battleText.text=n,this.battleText.textColor=s?e?16739179:16777215:KIi; + const r=t.HEADER/2,o=s?5906207:GIi,a=this.devToggle.visible?this.devToggle.x-8:this.maximize.x+4,c=32+this.battleText.width+10,l=a-c; + this.battleBg.clear().roundRect(l,r-14,c,28,9).fill(o); + const u=l+10,d=r-8,f=s?16739179:zIi; + this.battleIcon.clear().rect(u,d+5,16,11).fill(f).rect(u,d+1,4,5).fill(f).rect(u+6,d+1,4,5).fill(f).rect(u+12,d+1,4,5).fill(f).roundRect(u+5.5,d+9,5,7,2.5).fill(o),this.battleText.position.set(u+16+6,r-this.battleText.height/2)} + isCastleDown(){ + try{ + return this.castleDown()} + catch{ + return!1} + } + pulse(t){ + const i="gold"===t?this.goldIcon:this.pearlIcon; + MR.killTweensOf(i.scale),MR.fromTo(i.scale,{ + x:1.4,y:1.4} + ,{ + x:1,y:1,duration:.35,ease:"back.out(3)"} + )} + flyCurrency(t,i,s=7){ + if(!this.parent)return; + const e="gold"===t?this.goldIcon:this.pearlIcon,n=this.toLocal(i); + for(let h=0; + h<s; + h++){ + const i=_ki(t,20); + i.pivot.set(10,10),i.position.set(n.x,n.y),this.fxLayer.addChild(i); + const r=h/s*Math.PI*2+.6*Math.random(),o=26+30*Math.random(); + MR.timeline({ + delay:.035*h,onComplete:Qt(()=>{ + i.destroy(),this.pulse(t),0===h&&qG.getInstance().playSFX(qG.SFX_GOLD_GOBLIN,.4)} + ,"onComplete")} + ).fromTo(i.scale,{ + x:.4,y:.4} + ,{ + x:1,y:1,duration:.2} + ,0).to(i,{ + x:n.x+Math.cos(r)*o,y:n.y+Math.sin(r)*o*.7,duration:.24,ease:"power2.out"} + ,0).to(i,{ + x:e.x,y:e.y,duration:.46,ease:"power2.in"} + ,.26).to(i.scale,{ + x:.7,y:.7,duration:.46} + ,.26)} + } + setFullscreen(i){ + var s; + if(t.fullscreen!==i){ + this.setImmersed(!1,!0),t.fullscreen=i,EF.getInstance().visible=!i,this.width=t.WIDTH,this.drawMaximizeIcon(),this.onResize(); + for(const t of this.overlay.children)null==(s=t.layout)||s.call(t)} + } + pageSpan(){ + var i; + return t.fullscreen&&(null==(i=this.activePage)?void 0:i.fullBleed)?{ + x:0,w:t.BLEED_W} + :{ + x:t.CONTENT_X,w:t.CONTENT_W} + } + drawMaximizeIcon(){ + const i=this.maximizeIcon.clear(),s={ + color:zIi,width:3.5,join:"round",cap:"round"} + ; + t.fullscreen?i.moveTo(19,16).lineTo(19,12).lineTo(36,12).lineTo(36,29).lineTo(32,29).stroke(s).roundRect(12,19,17,17,2.5).stroke(s):i.roundRect(13,13,22,22,3).stroke(s)} + refresh(){ + const i=t.WIDTH,s=t.layoutHeight,e=t.fullscreen; + this.height=s; + const n=s-t.FOOTER; + e?this.paper.clear().rect(0,0,i,s).fill(LIi):this.paper.clear().roundRect(0,0,i,s,20).fill(LIi).stroke({ + color:WIi,width:2} + ),this.pageBg.clear().rect(e?0:2,t.HEADER,e?i:i-4,t.footerTop-t.HEADER).fill(DIi),this.overlay.position.set(t.CONTENT_X,t.CONTENT_Y),this.wake.hitArea=new Ui(0,0,i,s),this.chrome.clear().moveTo(24,t.footerTop).lineTo(i-24,t.footerTop).stroke({ + color:WIi,width:1} + ),this.subSig=""; + const h=t.HEADER/2; + this.walletSig="",this.battleSig="",this.close.position.set(i-56,h-24),this.maximize.position.set(i-56-44,h-24),this.devToggle.position.set(i-56-44-8-56,h-13),[this.speedChip,this.dayChip,this.tideChip,this.boatChip,this.goldChip,this.botsChip,this.journeyChip,this.giantChip,this.badgeChip,this.raidChip,this.robbedChip,this.cutChip,this.breakChip,this.hazardChip,this.fixChip,this.brokenDummyChip,this.huntChip,this.huntCrowdChip,this.gearChip,this.netChip,this.resetChip].forEach((t,i)=>t.position.set(i%4*68,30*Math.floor(i/4))),this.devRow.position.set(i-16-266,t.CONTENT_Y+54); + const r=(i-28-5*(SRi.length-1))/SRi.length; + this.tabButtons.forEach(({ + id:t,root:i,bg:s,icon:e,text:h,dot:o} + ,a)=>{ + var c; + i.position.set(14+a*(r+5),n+8),i.hitArea=new Ui(0,0,r,62); + const l=(null==(c=this.activePage)?void 0:c.tabId)===t; + s.clear(),l&&s.roundRect((r-52)/2,60,52,3,1.5).fill(VIi),e.tint=l?VIi:zIi,e.position.set((r-26)/2,4),h.textColor=l?VIi:zIi,h.position.set((r-h.width)/2,34),o.position.set(r/2+20,8)} + ),this.updateHeader(),this.layoutPageArea(),this.resetPostionY(),this.parent&&this.position.set(320,this.getDefaultPositionY())} + scrollToShow(i){ + const s=i.getBounds(),e=this.pages.toLocal({ + x:s.x,y:s.y} + ).y; + this.scrollY=e-.35*t.contentHeight,this.updateScroll()} + point(t,i){ + this.endPoint(); + const s=new ip,e=new Ve,n=rki(i,jIi,14),h=(new ip).roundRect(0,0,n.width+20,n.height+10,10).fill(VIi); + n.position.set(10,5),e.addChild(h,n),this.fxLayer.addChild(s,e),this.pointer={ + node:t,g:s,tag:e,t0:performance.now()} + ,vn.shared.add(this.drawPoint,this),this.drawPoint()} + drawPoint(){ + const i=this.pointer; + if(!i)return; + const s=performance.now()-i.t0; + let e=!i.node.destroyed,n=i.node; + for(; + e&&n&&n!==this; + n=n.parent)n.visible||(e=!1); + if(n!==this&&(e=!1),!e||s>5e3)return void this.endPoint(); + const h=i.node.getBounds(),r=this.toLocal({ + x:h.x,y:h.y} + ),o=this.toLocal({ + x:h.x+h.width,y:h.y+h.height} + ),a=.55+.45*Math.abs(Math.sin(s/260)); + i.g.clear().roundRect(r.x-5,r.y-5,o.x-r.x+10,o.y-r.y+10,12).stroke({ + color:VIi,width:4,alpha:a} + ),i.tag.position.set(Math.max(8,Math.min(t.WIDTH-i.tag.width-8,(r.x+o.x)/2-i.tag.width/2)),r.y-i.tag.height-12),i.tag.alpha=Math.min(1,s/150)} + endPoint(){ + this.pointer&&(vn.shared.remove(this.drawPoint,this),this.pointer.g.destroy(),this.pointer.tag.destroy({ + children:!0} + ),this.pointer=null)} + resetScroll(){ + this.scrollY=0,this.updateScroll()} + maxScroll(){ + var i,s; + return!1===(null==(i=this.activePage)?void 0:i.scrollInShell)?0:Math.max(0,((null==(s=this.activePage)?void 0:s.getLocalBounds().maxY)??0)+12-t.contentHeight)} + updateScroll(){ + const i=this.maxScroll(),s=t.contentHeight; + if(this.scrollY=Math.max(0,Math.min(i,this.scrollY)),this.pages.y=t.contentTop-this.scrollY,this.pages.hitArea=new Ui(0,this.scrollY,this.pageSpan().w,s),this.scrollTrack.clear(),i>0){ + const e=Math.max(28,s*s/(s+i)); + this.scrollTrack.roundRect(t.WIDTH-12,t.contentTop+(s-e)*this.scrollY/i,3,e,1.5).fill({ + color:YIi,alpha:.65} + )} + } + moveScroll(t){ + if(!this.drag||this.drag.id!==t.pointerId||this.maxScroll()<=0)return; + const i=this.toLocal(t.global).y-this.drag.y; + Math.abs(i)>6&&(this.dragged=!0),this.dragged&&(this.scrollY=this.drag.scroll-i,this.updateScroll())} + requestExit(){ + var i,s,e,n; + const h=this.overlay.children[this.overlay.children.length-1]; + (null==(i=null==h?void 0:h.closeOne)?void 0:i.call(h))||(null==(e=null==(s=this.activePage)?void 0:s.closeOne)?void 0:e.call(s))?this.drawBack():this.backStack.length?this.goBack():!this.activePage||"fish"===this.activePage.tabId||this.exchangeOnly?t.fullscreen?this.setFullscreen(!1):(this.hideImmediately(),null==(n=this.onExit)||n.call(this)):this.selectTab("fish","user")} + hideImmediately(){ + var t; + this.setFullscreen(!1),this.timer.stop(),ES.stage.off("resized",this.onResize),this.drag=null; + for(const i of this.unsubscribe)i(); + this.unsubscribe=[],null==(t=this.activePage)||t.onHide(),this.pages.removeChildren(),this.overlay.removeChildren(),this.activePage=null,this.backStack=[],this.backNow=null,this.walletSig="",RIi.getInstance().active=!1,RIi.getInstance().flushHooks(),RIi.getInstance().open=!1,super.hideImmediately()} + getDefaultPositionY(){ + return ES.safeHeight/2} + onBackButton(){ + return this.requestExit(),!0} + } + ; + Qt(TRi,"FishingShell"),Zt(TRi,"instance"),Zt(TRi,"fullscreen",!1),Zt(TRi,"HEADER",52),Zt(TRi,"FOOTER",84),Zt(TRi,"SUB_BAR",62),Zt(TRi,"subOn",!1),Zt(TRi,"CONTENT_Y",56),Zt(TRi,"CONTENT_W",568),Zt(TRi,"IMMERSE_AFTER_MS",3e4),Zt(TRi,"immersion",0); + let CRi=TRi; + const ORi=[398,307],IRi={ + "인간":[[387,317],[363,343],[337,363],[310,383]],"엘프":[[410,317],[443,330],[477,350]],"언데드":[[413,297],[450,263],[477,240]],"오크":[[380,300],[350,270],[323,233]]} + ,kRi={ + "인간":[[277,413],[250,437],[217,463],[193,490]],"엘프":[[543,387],[577,400],[610,420],[630,437]],"언데드":[[517,205],[547,183],[577,160]],"오크":[[270,193],[243,173],[217,150],[200,135]]} + ; + function RRi(t,i,s){ + const e=Qt((i,s)=>{ + const e=t[`${ + i} + |${ + s} + `]??[.5,.5]; + return[800*e[0],600*e[1]]} + ,"p"),n=Qt(t=>{ + const i=[...IRi[t]],s={ + } + ; + return s.R=i.push(e(t,"R"))-1,i.push(...kRi[t]),s.C=i.push(e(t,"C"))-1,s.O=i.push(e(t,"O"))-1,{ + pts:i,at:s} + } + ,"spoke"),h=n(i.race),r=n(s.race),o=h.at[i.zone],a=r.at[s.zone]; + if(i.race===s.race)return o===a?[h.pts[o],h.pts[o]]:o<a?h.pts.slice(o,a+1):h.pts.slice(a,o+1).reverse(); + if("R"===i.zone||"R"===s.zone)return[...h.pts.slice(0,o+1).reverse(),ORi,...r.pts.slice(0,a+1)]; + const c=h.pts.slice(h.at.C,o+1).reverse(),l=Qt(t=>Math.atan2((t[1]-ORi[1])/268,(t[0]-ORi[0])/362),"ang"),u=l(e(i.race,"C")); + let d=l(e(s.race,"C"))-u; + for(; + d>Math.PI; + )d-=2*Math.PI; + for(; + d<=-Math.PI; + )d+=2*Math.PI; + const f=Math.max(3,Math.ceil(Math.abs(d)/(Math.PI/12))); + for(let p=1; + p<f; + p++){ + const t=u+d*p/f; + c.push([ORi[0]+362*Math.cos(t),ORi[1]+268*Math.sin(t)])} + return c.push(...r.pts.slice(r.at.C,a+1)),c} + function xRi(t){ + const i=[t[0],...t,t[t.length-1]],s=[]; + for(let n=1; + n<i.length-2; + n++){ + const t=i[n-1],e=i[n],h=i[n+1],r=i[n+2]; + for(let i=0; + i<16; + i++){ + const n=i/16,o=n*n,a=o*n,c=Qt(i=>.5*(2*e[i]+(-t[i]+h[i])*n+(2*t[i]-5*e[i]+4*h[i]-r[i])*o+(-t[i]+3*e[i]-3*h[i]+r[i])*a),"f"); + s.push([c(0),c(1)])} + } + s.push(t[t.length-1]); + const e=[0]; + for(let n=1; + n<s.length; + n++)e.push(e[n-1]+Math.hypot(s[n][0]-s[n-1][0],s[n][1]-s[n-1][1])); + return{ + pts:s,L:e,len:e[e.length-1]} + } + Qt(RRi,"travelRoute"),Qt(xRi,"sampleRoute"); + const PRi=Qt((t,i=0,s=1)=>t<i?i:t>s?s:t,"clamp$3"); + function NRi(t,i){ + const s=PRi(i)*t.len; + let e=1; + for(; + e<t.pts.length-1&&t.L[e]<s; + )e++; + const n=t.pts[e-1],h=t.pts[e],r=PRi((s-t.L[e-1])/Math.max(1e-6,t.L[e]-t.L[e-1])); + return{ + x:n[0]+(h[0]-n[0])*r,y:n[1]+(h[1]-n[1])*r,ang:Math.atan2(h[1]-n[1],h[0]-n[0])} + } + function LRi(t,i){ + const s=PRi(i)*t.len,e=[t.pts[0]]; + for(let h=1; + h<t.pts.length&&t.L[h]<=s; + h++)e.push(t.pts[h]); + const n=NRi(t,i); + return e.push([n.x,n.y]),e} + Qt(NRi,"routeAt"),Qt(LRi,"routeUpTo"); + const DRi=Qt(t=>PRi(.5+.0035*t,1.1,1.9),"travelVoyage"),GRi=Qt(t=>.75+t,"travelArrive"),BRi=Qt(t=>GRi(t)+1.6,"travelTotal"),URi=Qt(t=>GRi(t)+.7,"travelUnblock"),FRi={ + outQuad:Qt(t=>1-(1-t)*(1-t),"outQuad"),inQuad:Qt(t=>t*t,"inQuad"),outCubic:Qt(t=>1-(1-t)**3,"outCubic"),inOutSine:Qt(t=>(1-Math.cos(Math.PI*t))/2,"inOutSine"),outBack:Qt(t=>1+2.70158*(t-1)**3+1.70158*(t-1)**2,"outBack")} + ,$Ri=Qt((t,i,s)=>PRi((t-i)/(s-i)),"prog"),HRi=Qt((t,i,s)=>t+(i-t)*s,"lerp$1"); + function WRi(t,i){ + const s=GRi(i),e=t<s+.3?.55*FRi.outQuad($Ri(t,0,.3)):.55*(1-FRi.outQuad($Ri(t,s+.3,s+.7))),n=$Ri(t,.1,.45),h=$Ri(t,s+.3,s+.7); + return{ + dim:e,card:{ + o:Math.min(FRi.outQuad(n),1-FRi.inQuad(h)),y:40*(1-FRi.outBack(n))+30*FRi.inQuad(h),s:HRi(.94,1,PRi(FRi.outBack(n),0,1.2))} + ,draw:FRi.outQuad($Ri(t,.45,.75)),sail:FRi.inOutSine($Ri(t,.75,s)),sailing:t>=.75,ring:t>=s?$Ri(t,s,s+.35):-1,pillTo:{ + o:FRi.outQuad($Ri(t,.65,.8)),s:t>=s?HRi(1.2,1,FRi.outBack($Ri(t,s,s+.25))):1} + ,live:FRi.outQuad($Ri(t,s+.3,s+.7)),boatBack:1-FRi.outCubic($Ri(t,s+.35,s+.95)),banner:$Ri(t,s+.55,s+.75)*(1-$Ri(t,s+1.3,s+1.6))} + } + Qt(WRi,"travelPose"); + const VRi=Qt((t,i,s)=>s?t:Math.min(t,GRi(i)),"travelClock"),jRi=Qt((t,i,s)=>s&&t<GRi(i)?GRi(i):t,"travelSkip"); + function KRi(t){ + const i=t.charCodeAt(t.length-1)-44032; + if(i<0||i>11171)return"(으)로"; + const s=i%28; + return 0===s||8===s?"로":"으로"} + Qt(KRi,"ro"); + const zRi=class t{ + constructor(t){ + Zt(this,"root",new Ve),Zt(this,"snap",null),Zt(this,"dim",new ip),Zt(this,"card",new Ve),Zt(this,"win",new Ve),Zt(this,"routeG",new ip),Zt(this,"pins",new ip),Zt(this,"ring",new ip),Zt(this,"wake",new ip),Zt(this,"boat"),Zt(this,"pillTo",new Ve),Zt(this,"banner",new Ve),Zt(this,"route"),Zt(this,"V"),Zt(this,"geom",{ + x:0,y:0,s:1} + ),Zt(this,"k"),Zt(this,"W"),Zt(this,"H"),Zt(this,"t0",performance.now()),Zt(this,"t",0),Zt(this,"result"),Zt(this,"glided",!1),Zt(this,"closing",-1),Zt(this,"resolveDone"),Zt(this,"done",new Promise(t=>this.resolveDone=t)),this.o=t; + const i=CRi.getInstance(); + this.W=CRi.WIDTH,this.H=CRi.layoutHeight,this.k=CRi.BLEED_W/430; + const s=nAi.world(); + this.route=xRi(RRi(s.pins,t.from,t.to)),this.V=DRi(this.route.len); + try{ + const t=BS.app.renderer.generateTexture({ + target:i,frame:new Ui(0,0,this.W,this.H)} + ); + this.snap=new Ye(t)} + catch{ + this.snap=null} + this.dim.rect(0,0,this.W,this.H).fill(133132),this.boat=new Ye(nAi.boat(t.boatLv)),this.build(),this.snap&&this.root.addChild(this.snap),this.root.addChild(this.dim,this.card,this.banner),this.root.eventMode="static",this.root.hitArea=new Ui(0,0,this.W,this.H),this.root.on("pointertap",t=>{ + t.stopPropagation(),this.skip()} + ),i.addChild(this.root),t.wait.then(t=>{ + this.result=t} + ,()=>{ + this.result="옮기지 못했어요"} + ),BS.app.ticker.add(this.tick,this),this.tick()} + static get active(){ + return!!this.current} + static play(i){ + var s; + null==(s=this.current)||s.finish(); + const e=new t(i); + return this.current=e,e.done} + build(){ + const t=this.k,i=this.o.from,s=this.o.to,e=356*t,n=230*t,h=12*t,r=e+2*h,o=n+2*h+30*t,a=this.route.pts.map(t=>t[0]),c=this.route.pts.map(t=>t[1]),l=Math.min(...a),u=Math.max(...a),d=Math.min(...c),f=Math.max(...c),p=Math.max(u-l+124,(f-d+124)*e/n),g=p*n/e; + this.geom={ + x:(l+u)/2-p/2,y:(d+f)/2+6-g/2,s:e/p} + ; + const w=(new ip).roundRect(0,0,r,o,16*t).fill(QIi),m=new Ye(as.EMPTY); + nAi.worldMap().then(t=>{ + m.texture=t,m.width=800*this.geom.s,m.scale.y=m.scale.x,m.position.set(-this.geom.x*this.geom.s,-this.geom.y*this.geom.s)} + ); + const v=(new ip).roundRect(0,0,e,n,10*t).fill(16777215); + this.win.addChild(m,this.routeG,this.wake,this.pins,this.ring,this.boat,v),this.win.mask=v,this.win.position.set(h,h),this.boat.anchor.set(.5),this.boat.width=this.boat.height=40*t; + const _=this.px(this.route.pts[0]),M=this.px(this.route.pts[this.route.pts.length-1]),b=Qt((i,s)=>Math.max(4*t,Math.min(e-4*t-s,i)),"inX"),y=this.pill(RSi(i.race,i.zone,i.point),16777215),E=_.y+12*t+y.height>n-4*t?_.y-12*t-y.height:_.y+12*t; + y.position.set(b(_.x-y.width/2,y.width),E); + const A=this.pill(RSi(s.race,s.zone,s.point),VIi),S=M.y-12*t-A.height<4*t; + A.pivot.set(A.width/2,S?0:A.height),A.position.set(b(M.x-A.width/2,A.width)+A.width/2,S?M.y+12*t:M.y-12*t),this.pillTo.addChild(A),this.win.addChild(y,this.pillTo); + const T=RSi(i.race,i.zone,i.point),C=RSi(s.race,s.zone,s.point),O=rki(`${ + T} + 에서`,zIi,13*t),I=rki(`${ + C} + ${ + KRi(C)} + 가는 중`,KIi,13*t); + O.position.set(h+4*t,h+n+8*t),I.position.set(r-h-4*t-I.width,h+n+8*t),this.card.addChild(w,this.win,O,I),this.card.pivot.set(r/2,o/2),this.card.position.set(this.W/2,.262*this.H+o/2); + const k=rki(C,16777215,17*t),R=new Ve,x=rki(s.race,16777215,12*t),P=(new ip).roundRect(0,0,x.width+14*t,x.height+4*t,8*t).fill(hki[s.race]??VIi); + x.position.set(7*t,2*t),R.addChild(P,x); + const N=k.width+R.width+40*t,L=Math.max(k.height,R.height)+16*t,D=(new ip).roundRect(0,0,N,L,14*t).fill({ + color:QIi,alpha:.88} + ); + k.position.set(16*t,(L-k.height)/2),R.position.set(16*t+k.width+8*t,(L-R.height)/2),this.banner.addChild(D,k,R),this.banner.position.set((this.W-N)/2,.167*this.H)} + pill(t,i){ + const s=this.k,e=new Ve,n=rki(t,i,12*s),h=(new ip).roundRect(0,0,n.width+18*s,n.height+6*s,10*s).fill({ + color:659990,alpha:.86} + ); + return n.position.set(9*s,3*s),e.addChild(h,n),e} + px(t){ + const i=Array.isArray(t)?t[0]:t.x,s=Array.isArray(t)?t[1]:t.y; + return{ + x:(i-this.geom.x)*this.geom.s,y:(s-this.geom.y)*this.geom.s} + } + get ready(){ + return null===this.result&&this.o.mapReady()} + skip(){ + const i=jRi(this.t,this.V,this.ready); + i!==this.t&&(this.t0-=1e3*(i-this.t)/t.speed)} + tick(){ + var i,s; + if("string"==typeof this.result){ + this.closing<0&&(this.closing=performance.now()); + const t=Math.min(1,(performance.now()-this.closing)/250); + return this.root.alpha=1-t,void(t>=1&&this.finish())} + const e=(performance.now()-this.t0)/1e3*t.speed,n=this.t=VRi(e,this.V,this.ready); + n<e&&(this.t0=performance.now()-1e3*n/t.speed); + const h=WRi(n,this.V),r=this.k,o=GRi(this.V); + this.snap&&(this.snap.alpha=1-h.live),this.dim.alpha=h.dim,this.card.alpha=h.card.o,this.card.scale.set(h.card.s),this.card.y=.262*this.H+this.card.pivot.y+h.card.y*r; + const a=this.routeG.clear(); + if(this.dashes(a,LRi(this.route,h.draw),5*r,6*r),a.stroke({ + color:16777215,width:2.5*r,cap:"round"} + ),h.sailing&&h.sail>0){ + const t=LRi(this.route,h.sail).map(t=>this.px(t)); + a.moveTo(t[0].x,t[0].y); + for(const i of t.slice(1))a.lineTo(i.x,i.y); + a.stroke({ + color:VIi,width:3.5*r,cap:"round",join:"round"} + )} + const c=this.px(this.route.pts[0]),l=this.px(this.route.pts[this.route.pts.length-1]); + this.pins.clear().circle(c.x,c.y,5*r).fill(15921908),h.draw>.85&&this.pins.circle(l.x,l.y,6*r).fill(VIi),this.ring.clear(),h.ring>=0&&this.ring.circle(l.x,l.y,(6+20*(1-(1-h.ring)**2))*r).stroke({ + color:VIi,width:3*r,alpha:.9*(1-h.ring)} + ); + const u=NRi(this.route,h.sail),d=this.px(u),f=1.2*Math.sin(9*n)*r; + if(this.boat.visible=h.sailing,this.boat.position.set(d.x,d.y+f),this.boat.rotation=u.ang+Math.PI/2,this.wake.clear(),h.sailing&&h.sail<.999)for(let t=0; + t<3; + t++){ + const i=this.px(NRi(this.route,h.sail-.035*(t+1))); + this.wake.circle(i.x,i.y,3*r).fill({ + color:15334399,alpha:.7-.2*t} + )} + this.pillTo.alpha=h.pillTo.o,this.pillTo.scale.set(h.pillTo.s),this.banner.alpha=h.banner,!this.glided&&n>=o+.35&&(this.glided=!0,null==(s=(i=this.o).onGlide)||s.call(i,NRi(this.route,1).ang)),this.root.eventMode=n<URi(this.V)?"static":"none",n>=BRi(this.V)&&this.finish()} + dashes(t,i,s,e){ + let n=!0,h=s; + for(let r=1; + r<i.length; + r++){ + let o=this.px(i[r-1]); + const a=this.px(i[r]); + let c=Math.hypot(a.x-o.x,a.y-o.y); + for(; + c>0; + ){ + const i=Math.min(c,h),r=i/c,l={ + x:o.x+(a.x-o.x)*r,y:o.y+(a.y-o.y)*r} + ; + n&&t.moveTo(o.x,o.y).lineTo(l.x,l.y),o=l,c-=i,h-=i,h<=1e-6&&(n=!n,h=n?s:e)} + } + } + finish(){ + var i; + t.current===this&&(t.current=null),BS.app.ticker.remove(this.tick,this); + const s=null==(i=this.snap)?void 0:i.texture; + this.root.destroy({ + children:!0} + ),null==s||s.destroy(!0),this.resolveDone()} + } + ; + Qt(zRi,"FishingTravelFx"),Zt(zRi,"speed",1),Zt(zRi,"current",null); + let YRi=zRi; + function qRi(t,i,s){ + const e=new Ve,n=rki(t,i,13),h=new ip; + return h.roundRect(0,0,n.width+20,26,13).fill(s),n.position.set(10,(26-n.height)/2),e.addChild(h,n),e.eventMode="none",e} + function XRi(t,i=16){ + const s=new Ve; + let e=0; + for(const n of t){ + if(n.icon){ + const t=NIi(n.icon,18,zIi,2.2); + t.position.set(e,0),s.addChild(t),e+=24} + const t=rki(n.text,n.color??KIi,14,!1); + t.position.set(e,(18-t.height)/2+1),s.addChild(t),e+=t.width+i} + return s.eventMode="none",s} + function JRi(t,i,s){ + const e=new Ve,n=vSi[`${ + t.race} + |${ + t.zone} + `],h=i?`${ + n} + · 잡아 봐야 알아요`:t.roam?`${ + n} + · 날마다 바뀌는 곳 (회유)`:t.pts.length>=9?`${ + n} + 어디서나`:`${ + n} + · ${ + t.pts.slice(0,2).map(i=>RSi(t.race,t.zone,i)).join(", ")} + ${ + t.pts.length>2?` 외 ${ + t.pts.length-2} + 곳`:""} + `,r=[["depth","깊이","O"===t.zone&&"B"===t.depth?"심해":gSi[t.depth]],["clock","시간","전체"===t.tide?"모든 시간대":mSi[wSi.indexOf(t.tide)]],["map","위치",h]],o=20+34*r.length; + return e.addChild(aki(s,o,$Ii,null,12)),r.forEach(([t,n,h],r)=>{ + const o=10+34*r,a=NIi(t,18,zIi,2.2),c=rki(n,zIi,12),l=rki(h,i&&"map"===t?zIi:KIi,14); + a.position.set(14,o+8),c.position.set(40,o+(34-c.height)/2),l.position.set(84,o+(34-l.height)/2),oki(l,s-84-14),e.addChild(a,c,l)} + ),e.eventMode="none",e} + Qt(qRi,"tagChip"),Qt(XRi,"factRow"),Qt(JRi,"habitatInfo"); + const QRi=CRi.CONTENT_W,ZRi=["net","aquarium","dex"],txi=["어망","어항","도감"],ixi=Qt(t=>t>=1?16739166:t>=.8?16757611:qIi,"netColor"),sxi=QRi/6,exi=80,nxi=class t extends OR{ + constructor(){ + super(),Zt(this,"cells",[]),Zt(this,"headTitle",rki("",KIi,15)),Zt(this,"headHint",rki("",YIi,12,!1)),Zt(this,"row",null); + const i=(new ip).rect(0,0,QRi,t.H).fill({ + color:0,alpha:.001} + ); + i.eventMode="none",this.addChild(i,this.headTitle,this.headHint); + for(let s=0; + s<6; + s++){ + const i=new Ve,e=new ip,n=new lki(exi,!1,!0),h=_ki("gold",14),r=rki("",zIi,12,!1); + e.roundRect(1.5,0,sxi-3,t.H-2,14).fill(ZIi),e.eventMode="none",n.position.set((sxi-exi)/2,8),i.addChild(e,n,h,r),i.position.set(s*sxi,0),i.eventMode="static",i.cursor="pointer",i.hitArea=new Ui(0,0,sxi,t.H),i.on("pointertap",t=>{ + var i,e,n,h; + t.stopPropagation(); + const r=null==(e=null==(i=this.row)?void 0:i.items)?void 0:e[s]; + r&&(null==(h=(n=this.row).onPick)||h.call(n,r))} + ),this.addChild(i),this.cells.push({ + root:i,tile:e,card:n,coin:h,under:r} + )} + } + setData(i){ + this.row=i; + const s=i.head; + if(this.headTitle.visible=this.headHint.visible=!!s,s){ + this.headTitle.text=s.title,this.headHint.text=s.hint; + const i=t.H-this.headTitle.height-10; + this.headTitle.position.set(4,i),this.headHint.position.set(this.headTitle.x+this.headTitle.width+8,i+(this.headTitle.height-this.headHint.height)/2+1),oki(this.headHint,QRi-this.headHint.x-4)} + this.cells.forEach((t,s)=>{ + var e; + const n=null==(e=i.items)?void 0:e[s]; + if(t.root.visible=!!n,!n)return; + const h="on"===n.check,r="lock"===n.check,o="price"===i.under&&!r; + t.tile.visible=h,t.card.set(n.c.id,kSi(n.c.id).star,n.c.grade),t.card.setFade(r?.4:1),t.card.setMark(h?"on":r?"lock":!n.check&&n.quest?"quest":null,h?ZIi:DIi),t.coin.visible=o,t.under.text=r?"의뢰":o?QOi(n.c).toLocaleString():_Ti(n.c.kg),t.under.textColor=h?VIi:r?YIi:zIi,oki(t.under,sxi-26); + const a=(o?17:0)+t.under.width,c=(sxi-a)/2; + t.coin.position.set(c,93+(t.under.height-14)/2),t.under.position.set(c+(o?17:0),93)} + )} + } + ; + Qt(nxi,"FishGridRow"),Zt(nxi,"H",116); + let hxi=nxi; + const rxi=QRi/6,oxi=class t extends OR{ + constructor(){ + super(),Zt(this,"cells",[]),Zt(this,"row",null); + const i=(new ip).rect(0,0,QRi,t.H).fill({ + color:0,alpha:.001} + ); + i.eventMode="none",this.addChild(i); + for(let s=0; + s<6; + s++){ + const i=new Ve,e=new lki(72,!1,!0); + e.position.set((rxi-72)/2,6),i.addChild(e),i.position.set(s*rxi,0),i.eventMode="static",i.cursor="pointer",i.hitArea=new Ui(0,0,rxi,t.H),i.on("pointertap",t=>{ + var i; + t.stopPropagation(); + const e=null==(i=this.row)?void 0:i.items[s]; + e&&this.row.onPick(e.s.id)} + ),this.addChild(i),this.cells.push({ + root:i,card:e} + )} + } + setData(t){ + this.row=t,this.cells.forEach((i,s)=>{ + const e=t.items[s]; + if(i.root.visible=!!e,!e)return; + const n=e.d??e.past; + i.card.set(e.s.id,e.s.star,n?uTi(n.bestR):0,!n),i.card.setFade(!e.d&&e.past?.45:1)} + )} + } + ; + Qt(oxi,"DexRow"),Zt(oxi,"H",88); + let axi=oxi; + function cxi(t,i,s,e,n,h,r){ + const o=new pki("",s,e,n); + o.setPrimary(h),o.enabled=r; + const a=r?h?jIi:KIi:iki,c=rki(t,a,n),l=_ki("gold",n+2),u=rki(i.toLocaleString(),a,n-1); + l.alpha=r?1:.5; + let d=(s-(c.width+8+l.width+5+u.width))/2; + return c.position.set(d,(e-c.height)/2),d+=c.width+8,l.position.set(d,(e-l.height)/2),d+=l.width+5,u.position.set(d,(e-u.height)/2),o.addChild(c,l,u),o} + Qt(cxi,"coinButton"); + const lxi=[{ + v:1,text:"★1"} + ,{ + v:2,text:"★2 이하"} + ,{ + v:3,text:"★3 이하"} + ],uxi=[{ + v:0,text:"C 보통"} + ,{ + v:1,text:"B 대 이하"} + ],dxi=class t extends Ve{ + constructor(){ + super(),Zt(this,"tabId","tank"),Zt(this,"view","net"),Zt(this,"scrollInShell",!1),Zt(this,"netLayer",new Ve),Zt(this,"capBg",new ip),Zt(this,"capNum",rki("",KIi,26)),Zt(this,"capOf",rki("",zIi,15)),Zt(this,"gradeCounts",[]),Zt(this,"capBar",new ip),Zt(this,"capNote",rki("도둑이 어망에 줄을 걸었어요. 줄을 끊어야 팔 수 있어요",XIi,13,!1)),Zt(this,"sellBtn",new pki("팔기",132,52,18)),Zt(this,"sellGlow",new ip),Zt(this,"glowTween",null),Zt(this,"cutBtn",new pki("줄 끊기",132,52,16)),Zt(this,"netEmpty",rki("어망이 비었어요. 잡은 물고기는 모두 여기에 담겨요.",YIi,14,!1)),Zt(this,"netList",new TR(hxi,QRi,400,0)),Zt(this,"detail",new Ve),Zt(this,"card",null),Zt(this,"sheet",new Ve),Zt(this,"sheetOpen",!1),Zt(this,"sheetBg",new ip),Zt(this,"sheetBack",new Ve),Zt(this,"sheetTitle",rki("물고기 팔기",KIi,20)),Zt(this,"allChip",new dki("모두 고르기",150,40,14)),Zt(this,"starLb",rki("별",zIi,14)),Zt(this,"sizeLb",rki("크기",zIi,14)),Zt(this,"sizeNote",rki("특대·왕은 눌러서만",YIi,12,!1)),Zt(this,"starChips",lxi.map(t=>new dki(t.text,120,38,15))),Zt(this,"sizeChips",uxi.map(t=>new dki(t.text,120,38,15))),Zt(this,"sellList",new TR(hxi,QRi,300,0)),Zt(this,"barBg",new ip),Zt(this,"barN",rki("",zIi,15)),Zt(this,"barCoin",_ki("gold",24)),Zt(this,"barGold",rki("",VIi,24)),Zt(this,"barEmpty",rki("",zIi,17)),Zt(this,"barEmptySub",rki("위 칩으로 한꺼번에 · 눌러서 하나씩",YIi,13,!1)),Zt(this,"barSell",new pki("팔기",200,60,19)),Zt(this,"pickStar",0),Zt(this,"pickSize",-1),Zt(this,"pickAll",!1),Zt(this,"pickAdd",new Set),Zt(this,"pickDel",new Set),Zt(this,"selling",!1),Zt(this,"confirm",new Ve),Zt(this,"aqLayer",new Ve),Zt(this,"dexLayer",new Ve),Zt(this,"raceChips",["전체",...uSi].map(t=>new dki(t,108,36,14))),Zt(this,"zoneChips",["전체",...dSi.map(t=>pSi[t])].map(t=>new dki(t,130,36,14))),Zt(this,"dexKnownLb",rki("잡은 종",zIi,14)),Zt(this,"dexProgress",rki("",KIi,16)),Zt(this,"dexBar",new ip),Zt(this,"dexList",new TR(axi,QRi,300,0)),Zt(this,"raceFilter","전체"),Zt(this,"zoneFilter","전체"),Zt(this,"selected",0),Zt(this,"lastSig",""),this.capBg.eventMode=this.capBar.eventMode=this.sellGlow.eventMode="none",this.capNum.position.set(18,10),this.capNote.position.set(18,48),this.netLayer.addChild(this.capBg,this.capNum,this.capOf,this.capBar,this.capNote),[3,2,1,0].forEach(t=>{ + const i=new Ve,s=(new ip).roundRect(0,0,20,20,6).fill(t?eki[t]:4868690),e=rki(aTi[t],16777215,13),n=rki("0",KIi,15); + e.position.set((20-e.width)/2,(20-e.height)/2),n.position.set(25,(20-n.height)/2),i.addChild(s,e,n),i.eventMode="none",this.gradeCounts.push({ + root:i,n} + ),this.netLayer.addChild(i)} + ),this.sellBtn.position.set(QRi-18-132,12),this.sellBtn.onTap=()=>this.openSheet(),this.cutBtn.position.set(QRi-18-132,12),this.cutBtn.onTap=async()=>{ + const t=await RIi.getInstance().plunderCut(); + vH.getInstance().showMessage(t??"줄을 끊었어요! 어망을 지켰어요"),this.render()} + ,this.netEmpty.position.set(4,100),this.netEmpty.setWrapWidth(QRi-8),this.netList.y=88,this.netLayer.addChild(this.sellGlow,this.sellBtn,this.cutBtn,this.netEmpty,this.netList),this.sheetBg.eventMode="static"; + const t=(new ip).roundRect(0,0,46,46,12).fill(GIi).moveTo(27,14).lineTo(18,23).lineTo(27,32).stroke({ + color:KIi,width:3.5,cap:"round",join:"round"} + ); + t.eventMode="none",this.sheetBack.addChild(t),this.sheetBack.eventMode="static",this.sheetBack.cursor="pointer",this.sheetBack.hitArea=new Ui(-6,-6,58,58),this.sheetBack.on("pointertap",t=>{ + t.stopPropagation(),queueMicrotask(()=>this.closeSheet())} + ),this.sheetTitle.position.set(60,9),this.allChip.soft=!0,this.allChip.position.set(QRi-150,3),this.allChip.onTap=()=>this.pickRule("all",0),this.starLb.position.set(2,67),this.sizeLb.position.set(2,113); + const i=(QRi-52-16)/3; + this.starChips.forEach((t,s)=>{ + t.soft=!0,t.resize(i,38),t.position.set(52+s*(i+8),58),t.onTap=()=>this.pickRule("star",lxi[s].v)} + ),this.sizeChips.forEach((t,s)=>{ + t.soft=!0,t.resize(i,38),t.position.set(52+s*(i+8),104),t.onTap=()=>this.pickRule("size",uxi[s].v)} + ),oki(this.sizeNote,i-8),this.sizeNote.position.set(52+2*(i+8)+(i-this.sizeNote.width)/2,104+(38-this.sizeNote.height)/2),this.sellList.y=156,this.barBg.eventMode="none",this.barSell.onTap=()=>{ + this.sellPicked()} + ,this.sheet.addChild(this.sheetBg,this.sheetBack,this.sheetTitle,this.allChip,this.starLb,this.sizeLb,...this.starChips,...this.sizeChips,this.sizeNote,this.sellList,this.barBg,this.barN,this.barCoin,this.barGold,this.barEmpty,this.barEmptySub,this.barSell),this.sheet.visible=!1,this.detail.visible=!1,this.confirm.visible=!1; + const s=(QRi-32)/5; + this.raceChips.forEach((t,i)=>{ + t.soft=!0,t.dot=i?hki[uSi[i-1]]:null,t.resize(s,36),t.position.set(i*(s+8),0),t.onTap=()=>{ + this.raceFilter=i?uSi[i-1]:"전체",this.render(!0)} + ,this.dexLayer.addChild(t)} + ); + const e=(QRi-24)/4; + this.zoneChips.forEach((t,i)=>{ + t.soft=!0,t.resize(e,36),t.position.set(i*(e+8),44),t.onTap=()=>{ + this.zoneFilter=t.value,this.render(!0)} + ,this.dexLayer.addChild(t)} + ),this.dexKnownLb.position.set(2,93),this.dexBar.eventMode="none",this.dexList.y=122,this.dexLayer.addChild(this.dexKnownLb,this.dexProgress,this.dexBar,this.dexList),this.addChild(this.netLayer,this.aqLayer,this.dexLayer,this.sheet,this.detail,this.confirm)} + static getInstance(){ + return this.instance??(this.instance=new t)} + onResize(){ + this.render()} + onShow(){ + this.render(!0)} + onHide(){ + this.sheetOpen=!1,this.sheet.visible=!1,this.card=null,this.detail.visible=!1,this.hideConfirm(),this.stopGlow()} + subTabs(){ + return this.sheetOpen?null:{ + items:txi,index:ZRi.indexOf(this.view)} + } + selectSub(t){ + this.view=ZRi[t]??"net",this.card=null,this.detail.visible=!1,this.render(!0)} + closeOne(){ + return this.confirm.visible?(this.hideConfirm(),!0):this.card?(this.closeDetail(),!0):!!this.sheetOpen&&(this.closeSheet(),!0)} + update(){ + this.sig()!==this.lastSig&&"dex"!==this.view&&this.render()} + sig(){ + var t,i,s; + const e=RIi.getInstance(),n=e.state; + return`${ + this.view} + |${ + n.icebox.length} + |${ + e.netCap} + |${ + (null==(t=n.aquarium)?void 0:t.fish.length)??0} + |${ + (null==(i=n.aquarium)?void 0:i.lv)??0} + |${ + !!(null==(s=e.plunder)?void 0:s.raidBy)} + `} + openDex(t){ + this.view="dex",this.selected=t,this.raceFilter=kSi(t).race,this.zoneFilter="전체",this.card={ + mode:"dex",id:t} + } + openView(t){ + this.view=t,this.sheetOpen&&this.closeSheet(),this.card=null,this.detail.visible=!1} + get sellButton(){ + return this.sellBtn} + render(t=!1){ + this.lastSig=this.sig(),this.netLayer.visible="net"===this.view,this.aqLayer.visible="aquarium"===this.view,this.dexLayer.visible="dex"===this.view,"net"===this.view?this.renderNet(t):(this.stopGlow(),"aquarium"===this.view?this.renderAquarium():this.renderDex(t)),this.sheetOpen&&this.renderSheet(),this.card&&this.drawDetail()} + fishCells(){ + const t=RIi.getInstance(),i=new Map; + return t.netFish().map(s=>{ + const e=`${ + s.id} + :${ + s.grade} + :${ + s.at} + :${ + s.kg} + `,n=i.get(e)??0; + return i.set(e,n+1),{ + c:s,uid:`${ + e} + #${ + n} + `,quest:t.isQuestFish(s)} + } + )} + renderNet(t){ + var i; + const s=RIi.getInstance(),e=CRi.contentHeight,n=s.netCount(),h=s.netCap,r=h?n/h:0,o=n>=h,a=!!(null==(i=s.plunder)?void 0:i.raidBy); + this.capBg.clear().roundRect(0,0,QRi,76,14).fill(GIi),this.capNum.text=`${ + n} + `,this.capNum.textColor=o?ixi(1):KIi,this.capOf.text=`/ ${ + h} + `,this.capOf.position.set(this.capNum.x+this.capNum.width+5,this.capNum.y+this.capNum.height-this.capOf.height-2); + const c=this.fishCells(); + let l=Math.max(110,this.capOf.x+this.capOf.width+18); + [3,2,1,0].forEach((t,i)=>{ + const s=c.filter(i=>i.c.grade===t).length,e=this.gradeCounts[i]; + e.n.text=`${ + s} + `,e.root.alpha=s?1:.35,e.root.position.set(l,15),l+=25+e.n.width+14} + ),this.capBar.clear(),a||vki(this.capBar,18,54,QRi-18-132-36,6,Math.min(1,r),ixi(r)),this.capNote.visible=a,oki(this.capNote,QRi-18-132-36),this.sellBtn.visible=!a,this.cutBtn.visible=a,this.sellBtn.enabled=n>0,o&&!a?this.startGlow():this.stopGlow(),this.netEmpty.visible=!c.length,this.netList.visible=c.length>0,this.netList.setListHeight(Math.max(60,e-this.netList.y),!1); + const u=[]; + for(let d=0; + d<c.length; + d+=6)u.push({ + items:c.slice(d,d+6),under:"kg",onPick:Qt(t=>this.openCard({ + mode:"net",uid:t.uid} + ),"onPick")} + ); + this.netList.dataProvider=u,t&&this.netList.showTopItem()} + startGlow(){ + if(this.glowTween)return; + const t=this.sellBtn,i=this.sellGlow; + i.clear().roundRect(-66,-26,132,52,12).fill(VIi),i.position.set(t.x+66,t.y+26),i.visible=!0,this.glowTween=MR.timeline({ + repeat:-1} + ).fromTo(i,{ + alpha:.5} + ,{ + alpha:0,duration:1.4,ease:"power1.out"} + ,0).fromTo(i.scale,{ + x:1,y:1} + ,{ + x:1+28/132,y:1+28/52,duration:1.4,ease:"power1.out"} + ,0)} + stopGlow(){ + this.glowTween&&(this.glowTween.kill(),this.glowTween=null,this.sellGlow.visible=!1)} + openCard(t){ + this.card=t,this.drawDetail(),MR.fromTo(this.detail,{ + alpha:0} + ,{ + alpha:1,duration:.15} + ),jG("light")} + closeDetail(){ + this.card=null,this.detail.visible=!1,queueMicrotask(()=>{ + this.card||this.detail.removeChildren().forEach(t=>t.destroy({ + children:!0} + ))} + )} + drawDetail(){ + var t,i; + const s=this.card; + if(!s)return; + const e=RIi.getInstance(); + let n=null,h=!1; + if("net"===s.mode){ + const t=this.fishCells().find(t=>t.uid===s.uid); + if(!t)return void this.closeDetail(); + n=t.c,h=t.quest} + else if("aq"===s.mode&&(n=e.aquarium().fish[s.index]??null,!n))return void this.closeDetail(); + const r=kSi(n?n.id:s.id),o="dex"===s.mode?e.state.dex[r.id]:void 0,a="dex"!==s.mode||o||null==(t=e.life)?void 0:t.dex[r.id],c="dex"!==s.mode||!!o||!!a,l=this.detail,u=CRi.contentHeight,d=CRi.OVERLAY_PAD,f=Math.min(QRi-40,500),p=20,g=!!(null==(i=e.plunder)?void 0:i.raidBy); + l.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),l.visible=!0; + const w=(new ip).rect(-d,0,QRi+2*d,u).fill({ + color:0,alpha:HIi} + ); + w.eventMode="static",w.on("pointertap",t=>{ + t.stopPropagation(),queueMicrotask(()=>this.closeDetail())} + ); + const m=new Ve,v=new ip; + m.eventMode="static",m.on("pointertap",t=>t.stopPropagation()),m.addChild(v); + const _=n?n.grade:o?uTi(o.bestR):a?uTi(a.bestR):0,M=new lki(104,!1,!0); + M.set(r.id,r.star,_,!c),M.setFade(!o&&a?.45:1),M.position.set(p,p); + const b=142,y=f-b-p,E=rki(c?r.name:"???",c?KIi:zIi,21); + E.position.set(b,22),oki(E,y-40); + const A=new Ve,S=[]; + n?S.push(n.grade?qRi(`${ + aTi[n.grade]} + ${ + dTi(n.grade)} + `,16777215,eki[n.grade]):qRi("C 보통",zIi,BIi)):_&&S.push(qRi(`최고 ${ + aTi[_]} + ${ + dTi(_)} + `,16777215,eki[_])),S.push(qRi(`★${ + r.star} + `,VIi,BIi),qRi(r.kind,zIi,BIi)); + const T=$Si(r); + T&&S.push(qRi(T,zIi,BIi)),h&&S.push(qRi("의뢰용",qIi,1522214)); + let C,O,I=0; + for(const D of S)D.x=I,I+=D.width+6,A.addChild(D); + if(A.position.set(b,56),A.width>y&&A.scale.set(y/A.width),n){ + const t=Math.max(1,Math.floor((n.at-e.state.startAt)/864e5)+1); + C=XRi([{ + icon:"weight",text:_Ti(n.kg)} + ,{ + icon:"ruler",text:`${ + n.cm} + cm`} + ]),O=XRi([{ + icon:"pin",text:RSi(n.race,n.zone,n.point)} + ,{ + text:`· ${ + t} + 일차`,color:zIi} + ],6)} + else if(o)C=XRi([{ + icon:"trophy",text:`최고 ${ + _Ti(o.bestKg)} + `} + ,{ + text:"잡은 수",color:zIi} + ,{ + text:`${ + o.count} + 마리`} + ],12),O=XRi([{ + icon:"pin",text:`처음 ${ + o.firstPoint} + `} + ,{ + text:`· ${ + o.firstDay} + 일차`,color:zIi} + ],6); + else if(a)C=XRi([{ + text:`지난 회차에 잡았어요 (${ + a.firstSeason} + 회차부터)`,color:zIi} + ]),O=XRi([{ + icon:"trophy",text:`최고 ${ + _Ti(a.bestKg)} + `} + ,{ + text:`· ${ + a.count} + 마리`,color:zIi} + ],6); + else{ + const t=e.state.lost[r.id]; + C=XRi([{ + text:"아직 못 잡았어요",color:zIi} + ]),O=t?XRi([{ + icon:"trophy",text:`놓친 대물 ${ + _Ti(t)} + `,color:VIi} + ]):null} + C.position.set(b,92); + for(const D of[C,O])D&&D.width>y&&D.scale.set(y/D.width); + m.addChild(M,E,A,C),O&&(O.position.set(b,116),m.addChild(O)); + let k=144; + const R=JRi(r,"dex"===s.mode&&!c&&r.star>=3,f-40); + R.position.set(p,k),m.addChild(R),k+=R.height+16; + const x=f-40; + if("net"===s.mode&&n){ + const t=n,i=tIi(t),s=i?(x-10)/2:x,o=cxi("팔기",QOi(t),s,58,17,!0,!g); + if(o.position.set(i?p+s+10:p,k),o.onTap=()=>{ + h?this.ask("의뢰에 쓸 물고기예요","팔면 다시 잡아야 해요",[t],"남겨 두기","그래도 팔기",!1,()=>{ + this.sellCatches([t],o)} + ):this.sellCatches([t],o)} + ,i){ + const i=e.aquarium(),n=new pki("어항에 넣기",s,58,17); + n.setPrimary(!1),n.position.set(p,k),n.enabled=!g&&i.fish.length<i.cap,n.onTap=async()=>{ + n.enabled=!1; + const i=await e.aquariumPutFish(t); + vH.getInstance().showMessage(i??`${ + gki(r.name,"을","를")} + 어항에 넣었어요. 어항 물고기는 도둑맞지 않고 팔리지도 않아요`),i?n.enabled=!0:(this.card=null,this.detail.visible=!1,this.render())} + ,m.addChild(n)} + m.addChild(o)} + else if("aq"===s.mode){ + const t=XRi([{ + icon:"shield",text:"어항 물고기는 도둑맞지 않고 팔리지도 않아요",color:YIi} + ]); + t.position.set(p,k-2),m.addChild(t),k+=30; + const i=new pki("어망으로 꺼내기",x,58,17); + i.setPrimary(!1),i.position.set(p,k),i.onTap=async()=>{ + i.enabled=!1; + const t=await e.aquariumTake(s.index); + vH.getInstance().showMessage(t??`${ + gki(r.name,"을","를")} + 어망으로 꺼냈어요`),t?i.enabled=!0:(this.card=null,this.detail.visible=!1,this.render())} + ,m.addChild(i)} + const P=new Ve,N=(new ip).moveTo(14,14).lineTo(30,30).moveTo(30,14).lineTo(14,30).stroke({ + color:zIi,width:3,cap:"round"} + ); + N.eventMode="none",P.addChild(N),P.position.set(f-52,8),P.eventMode="static",P.cursor="pointer",P.hitArea=new Ui(0,0,44,44),P.on("pointertap",t=>{ + t.stopPropagation(),queueMicrotask(()=>this.closeDetail())} + ),m.addChild(P); + const L="dex"===s.mode?k-16+p:k+58+p; + v.roundRect(0,0,f,L,16).fill(FIi),m.hitArea=new Ui(0,0,f,L),m.position.set((QRi-f)/2,Math.max(10,(u-L)/2)),l.addChild(w,m)} + openSheet(){ + this.sellBtn.enabled&&(this.pickStar=0,this.pickSize=-1,this.pickAll=!1,this.pickAdd.clear(),this.pickDel.clear(),this.sheetOpen=!0,this.sheet.visible=!0,this.sellList.showTopItem(),CRi.getInstance().refreshSub(),this.renderSheet(),MR.fromTo(this.sheet,{ + alpha:0,y:30} + ,{ + alpha:1,y:0,duration:.22,ease:"power2.out"} + ))} + closeSheet(){ + this.sheetOpen=!1,this.sheet.visible=!1,this.hideConfirm(),CRi.getInstance().refreshSub(),this.render()} + pickRule(t,i){ + "all"===t?(this.pickAll=!this.pickAll,this.pickAll&&(this.pickStar=0,this.pickSize=-1)):("star"===t?this.pickStar=this.pickStar===i?0:i:this.pickSize=this.pickSize===i?-1:i,this.pickAll=!1),this.pickAdd.clear(),this.pickDel.clear(),jG("light"),this.renderSheet()} + ruleHit(t){ + return!(tIi(t)||!this.pickAll&&(!this.pickStar&&this.pickSize<0||this.pickStar&&!(kSi(t.id).star<=this.pickStar)||!(this.pickSize<0||t.grade<=this.pickSize)))} + picked(t){ + return!t.quest&&!this.pickDel.has(t.uid)&&(this.ruleHit(t.c)||this.pickAdd.has(t.uid))} + togglePick(t){ + t.quest?vH.getInstance().showMessage("의뢰에 쓸 물고기라 남겨 둬요"):(this.picked(t)?(this.pickAdd.delete(t.uid),this.ruleHit(t.c)&&this.pickDel.add(t.uid)):(this.pickDel.delete(t.uid),this.ruleHit(t.c)||this.pickAdd.add(t.uid)),jG("light"),queueMicrotask(()=>{ + this.sheetOpen&&this.renderSheet()} + ))} + pickedFish(){ + return this.fishCells().filter(t=>this.picked(t)).map(t=>t.c)} + renderSheet(){ + var t; + const i=RIi.getInstance(),s=CRi.contentHeight,e=CRi.OVERLAY_PAD,n=!!(null==(t=i.plunder)?void 0:t.raidBy); + this.sheetBg.clear().rect(-e,0,QRi+2*e,s).fill(DIi),this.allChip.selected=this.pickAll,this.allChip.setText(this.pickAll?"모두 고름":"모두 고르기"),this.starChips.forEach((t,i)=>{ + t.selected=lxi[i].v===this.pickStar,t.draw()} + ),this.sizeChips.forEach((t,i)=>{ + t.selected=uxi[i].v===this.pickSize,t.draw()} + ); + const h=this.fishCells().map(t=>({ + ...t,check:t.quest?"lock":this.picked(t)?"on":"off"} + )).sort((t,i)=>QOi(t.c)-QOi(i.c)||kSi(t.c.id).star-kSi(i.c.id).star),r=h.filter(t=>!t.quest&&!tIi(t.c)),o=h.filter(t=>!t.quest&&tIi(t.c)),a=h.filter(t=>t.quest),c=[],l=Qt(t=>{ + for(let i=0; + i<t.length; + i+=6)c.push({ + items:t.slice(i,i+6),under:"price",onPick:Qt(t=>this.togglePick(t),"onPick")} + )} + ,"add"); + l(r),o.length&&(c.push({ + head:{ + title:`아끼는 물고기 ${ + o.length} + `,hint:"★4 이상·특대·왕 · 눌러야 골라져요"} + } + ),l(o)),a.length&&(c.push({ + head:{ + title:`의뢰용 ${ + a.length} + `,hint:"퀘스트에 써서 팔지 않아요"} + } + ),l(a)),this.sellList.setListHeight(Math.max(60,s-156-96),!1),this.sellList.dataProvider=c; + const u=s-96; + this.barBg.clear().rect(-e,u,QRi+2*e,96).fill(LIi); + const d=this.pickedFish(),f=d.length,p=d.reduce((t,i)=>t+QOi(i),0),g=f>0&&!n; + this.barN.visible=this.barCoin.visible=this.barGold.visible=g,this.barEmpty.visible=!g,this.barEmptySub.visible=!f&&!n,g&&(this.barN.text=`${ + f} + 마리 팔면`,this.barN.position.set(4,u+16),this.barCoin.position.set(4,u+48),this.barGold.text=p.toLocaleString(),this.barGold.position.set(36,u+60-this.barGold.height/2)),this.barEmpty.text=n?"도둑이 줄을 걸었어요. 줄을 끊어야 팔 수 있어요":"팔 물고기를 골라요",this.barEmpty.textColor=n?XIi:zIi,oki(this.barEmpty,QRi-230),this.barEmpty.position.set(4,u+(n?36:20)),this.barEmptySub.position.set(4,u+52),this.barSell.position.set(QRi-200,u+18),this.barSell.enabled=g&&!this.selling} + async sellPicked(){ + const t=this.pickedFish(); + if(!t.length||this.selling)return; + const i=t.filter(t=>tIi(t)); + i.length?this.ask("아끼는 물고기도 팔까요?",`★4 이상·특대·왕 ${ + i.length} + 마리가 들어 있어요\n어항에 넣으면 털리지 않고 남아요`,i,"빼고 팔기","모두 팔기",!1,()=>{ + this.sellCatches(t,this.barSell)} + ,()=>{ + const i=t.filter(t=>!tIi(t)); + i.length&&this.sellCatches(i,this.barSell)} + ):await this.sellCatches(t,this.barSell)} + async sellCatches(t,i){ + if(this.selling)return; + this.selling=!0,this.sheetOpen&&this.renderSheet(); + const s=i.toGlobal({ + x:60,y:28} + ); + let e; + try{ + e=await RIi.getInstance().sellFish(t)} + finally{ + this.selling=!1} + if(e.message)return vH.getInstance().showMessage(e.message),void this.render(); + vH.getInstance().showMessage(`${ + e.count} + 마리 팔았어요 · ${ + e.gold.toLocaleString()} + G`),CRi.getInstance().flyCurrency("gold",s,Math.min(10,3+e.count)),jG("medium"),this.card=null,this.detail.visible=!1,this.sheetOpen?this.closeSheet():this.render()} + ask(t,i,s,e,n,h,r,o){ + const a=this.confirm,c=CRi.contentHeight,l=CRi.OVERLAY_PAD,u=Math.min(QRi-60,420); + a.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const d=(new ip).rect(-l,0,QRi+2*l,c).fill({ + color:0,alpha:HIi} + ),f=rki(t,VIi,19),p=i.split("\n").map(t=>{ + const i=rki(t,zIi,14,!1); + return oki(i,u-36),i} + ),g=new Ve,w=s.slice(0,6); + w.forEach((t,i)=>{ + const s=new lki(52,!1,!0); + s.set(t.id,kSi(t.id).star,t.grade),s.position.set(60*i,0),g.addChild(s)} + ); + let m=18; + f.position.set((u-f.width)/2,m),m+=f.height+14,g.position.set((u-(60*w.length-8))/2,m),m+=66; + for(const E of p)E.position.set((u-E.width)/2,m),m+=E.height+2; + m+=16; + const v=(u-36-10)/2,_=new pki(e,v,52,16),M=new pki(n,v,52,16); + _.setPrimary(!h),M.setPrimary(h),_.position.set(18,m),M.position.set(18+v+10,m),_.onTap=()=>{ + this.hideConfirm(),null==o||o()} + ,M.onTap=()=>{ + this.hideConfirm(),r()} + ; + const b=m+52+18,y=new Ve; + y.addChild(aki(u,b,FIi,null,16),f,g,...p,_,M),y.position.set((QRi-u)/2,Math.max(10,(c-b)/2)),a.addChild(d,y),a.hitArea=new Ui(-l,0,QRi+2*l,c),a.eventMode="static",a.removeAllListeners("pointertap"),a.on("pointertap",t=>t.stopPropagation()),a.visible=!0,MR.fromTo(y,{ + alpha:0} + ,{ + alpha:1,duration:.15} + )} + hideConfirm(){ + this.confirm.visible&&(this.confirm.visible=!1,queueMicrotask(()=>{ + this.confirm.visible||this.confirm.removeChildren().forEach(t=>t.destroy({ + children:!0} + ))} + ))} + renderAquarium(){ + const t=RIi.getInstance(),i=t.state,s=t.aquarium(),e=this.aqLayer; + e.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const n=rki("어항",KIi,18),h=rki(`${ + s.fish.length} + / ${ + s.cap} + `,zIi,16); + n.position.set(2,8),h.position.set(n.x+n.width+8,n.y+n.height-h.height-1); + const r=XRi([{ + icon:"shield",text:"도둑맞지 않고 팔리지도 않아요",color:YIi} + ]); + if(r.position.set(2,42),e.addChild(n,h,r),null!==s.nextPrice){ + const n=s.nextPrice,h=172,r=cxi("칸 +5",n,h,44,14,!1,i.gold>=n); + r.position.set(QRi-h,4),r.onTap=async()=>{ + const i=await t.aquariumExpand(); + vH.getInstance().showMessage(i??`어항이 ${ + t.aquarium().cap} + 칸이 됐어요`),this.render()} + ,e.addChild(r)} + const o=QRi/5; + for(let a=0; + a<s.cap; + a++){ + const t=a%5*o,i=76+Math.floor(a/5)*hxi.H,n=s.fish[a],h=new Ve; + if(h.position.set(t,i),n){ + const t=new lki(exi,!1,!0); + t.set(n.id,kSi(n.id).star,n.grade),t.position.set((o-exi)/2,8); + const i=rki(_Ti(n.kg),zIi,12,!1); + i.position.set((o-i.width)/2,93),h.addChild(t,i),h.eventMode="static",h.cursor="pointer",h.hitArea=new Ui(0,0,o,hxi.H),h.on("pointertap",t=>{ + t.stopPropagation(),this.openCard({ + mode:"aq",index:a} + )} + )} + else{ + const t=(new ip).roundRect((o-exi)/2,8,exi,exi,16).fill({ + color:GIi,alpha:.75} + ); + t.eventMode="none",h.addChild(t)} + e.addChild(h)} + if(!s.fish.length){ + const t=rki("★4 이상이나 특대·왕 물고기를 어망에서 누르고 [어항에 넣기]로 넣어요.",YIi,13,!1); + t.setWrapWidth(QRi-8),t.position.set(4,76+Math.ceil(s.cap/5)*hxi.H+4),e.addChild(t)} + } + renderDex(t){ + const i=RIi.getInstance(),s=i.state,e=CRi.contentHeight; + this.raceChips.forEach(t=>{ + t.selected=t.value===this.raceFilter,t.draw()} + ),this.zoneChips.forEach(t=>{ + t.selected=t.value===this.zoneFilter,t.draw()} + ); + const n=OSi.filter(t=>!("전체"!==this.raceFilter&&t.race!==this.raceFilter||"전체"!==this.zoneFilter&&pSi[t.zone]!==this.zoneFilter)),h=n.filter(t=>s.dex[t.id]).length; + this.dexProgress.text=`${ + h} + / ${ + n.length} + `,this.dexProgress.position.set(this.dexKnownLb.x+this.dexKnownLb.width+8,this.dexKnownLb.y+this.dexKnownLb.height-this.dexProgress.height+1); + const r=this.dexProgress.x+this.dexProgress.width+16; + this.dexBar.clear(),vki(this.dexBar,r,100,QRi-r-2,6,n.length?h/n.length:0,qIi); + const o=[]; + for(let a=0; + a<n.length; + a+=6)o.push({ + items:n.slice(a,a+6).map(t=>{ + var e; + return{ + s:t,d:s.dex[t.id],past:s.dex[t.id]||null==(e=i.life)?void 0:e.dex[t.id]} + } + ),onPick:Qt(t=>{ + this.selected=t,this.openCard({ + mode:"dex",id:t} + )} + ,"onPick")} + ); + if(this.dexList.setListHeight(e-this.dexList.y,!1),this.dexList.dataProvider=o,t){ + const t=this.selected?n.findIndex(t=>t.id===this.selected):-1; + t>=12?this.dexList.scrollTo(Math.floor(t/6)):this.dexList.showTopItem()} + } + } + ; + Qt(dxi,"FishingTankPage"),Zt(dxi,"instance"); + let fxi=dxi; + const pxi=CRi.CONTENT_W,gxi=500,wxi=Qt((t,i,s=0)=>222+s+108*t+(i?28:0)+90,"cardH"),mxi=class t extends Ve{ + constructor(){ + super(),Zt(this,"dim",new ip),Zt(this,"card",new Ve),Zt(this,"bg",aki(gxi,wxi(2,!0),FIi,null,18)),Zt(this,"cooler",yki("keepnet",40,VIi)),Zt(this,"away",rki("",zIi,14)),Zt(this,"count",rki("",KIi,40)),Zt(this,"sub",rki("",zIi,14)),Zt(this,"warn",rki("",XIi,13)),Zt(this,"cells",[]),Zt(this,"sum",rki("",VIi,15)),Zt(this,"ok",new pki("확인",200,50,16)),Zt(this,"tl",null),Zt(this,"cardHeight",0),this.dim.eventMode="static",this.cooler.position.set(230,18),this.card.addChild(this.bg,this.cooler,this.away,this.count,this.sub,this.warn,this.sum,this.ok); + for(let t=0; + t<12; + t++){ + const i=new Ve,s=new lki(70),e=rki("",KIi,13),n=new Ve,h=30+t%6*74,r=222+108*Math.floor(t/6); + i.position.set(h+35,r+35),i.pivot.set(35,35),e.y=73,i.addChild(s,e,n),i.eventMode="none",this.card.addChild(i),this.cells.push({ + root:i,card:s,n:e,badge:n} + )} + this.ok.onTap=()=>this.close(),this.warn.setWrapWidth(460),this.addChild(this.dim,this.card)} + static getInstance(){ + return this.instance??(this.instance=new t)} + close(){ + var t,i; + null==(t=this.tl)||t.progress(1),null==(i=this.parent)||i.removeChild(this)} + closeOne(){ + return this.close(),!0} + layout(){ + const t=CRi.contentHeight,i=CRi.OVERLAY_PAD; + this.dim.clear().rect(-i,0,pxi+2*i,t).fill({ + color:0,alpha:HIi} + ),this.dim.hitArea=new Ui(-i,0,pxi+2*i,2e3),this.card.position.set((pxi-gxi)/2,Math.max(10,(t-this.cardHeight)/2))} + open(t){ + var i,s; + const e=0===t.count&&t.lost>0,n=[]; + if(e?n.push("더 튼튼한 낚싯줄(장비 › 낚시 도구)이 있으면 잡을 수 있어요"):t.lost>0&&n.push(`줄이 끊어져 ${ + t.lost} + 마리를 놓쳤어요 · 더 튼튼한 낚싯줄이 필요해요`),t.fullAt>0){ + const s=new Date(t.fullAt-((null==(i=RIi.getInstance().state)?void 0:i.devOffset)??0)); + n.push(`어망이 가득 차서 ${ + String(s.getHours()).padStart(2,"0")} + :${ + String(s.getMinutes()).padStart(2,"0")} + 부터 낚시를 쉬었어요. 어망을 비우면 다시 잡혀요`)} + t.sold&&n.push(`수조가 어망으로 바뀌어 넘친 ${ + t.sold.count} + 마리를 ${ + t.sold.gold.toLocaleString()} + G에 자동으로 팔았어요`); + const h=18*Math.max(0,n.length-1),r=t.byId.length-12,o=wxi(Math.ceil(Math.min(12,t.byId.length)/6),r>0,h); + this.cardHeight=o,this.layout(),this.bg.clear().roundRect(0,0,gxi,o,18).fill(FIi); + const a=Math.floor(t.minutes/60),c=t.minutes%60; + this.away.text=t.minutes>0?`다녀온 동안 · 약 ${ + a?`${ + a} + 시간 `:""} + ${ + c} + 분`:"어망 정리",this.away.position.set((gxi-this.away.width)/2,66); + const l=!e&&0===t.count&&t.fullAt>0; + this.count.text=e?"놓쳤어요":l?"어망 가득":`${ + t.count} + 마리`,this.count.position.set((gxi-this.count.width)/2,88),this.sub.text=e?`${ + t.lost} + 마리가 줄을 끊고 달아났어요`:0===t.count?l?"어망이 차서 더 잡지 못했어요. 팔아서 비우면 다시 잡혀요":"어망을 정리했어요":`어망에 담겼어요 · 새 도감 ${ + t.newIds.length} + 종`,oki(this.sub,460),this.sub.position.set((gxi-this.sub.width)/2,142),this.warn.visible=n.length>0,this.warn.textColor=t.lost>0||t.fullAt>0?XIi:VIi,this.warn.text=n.join("\n"),this.warn.position.set(Math.max(20,(gxi-this.warn.width)/2),170),this.ok.position.set(150,o-72),this.cells.forEach((t,i)=>{ + const s=30+i%6*74,e=222+h+108*Math.floor(i/6); + t.root.position.set(s+35,e+35)} + ),this.cells.forEach((i,s)=>{ + const e=t.byId[s]; + i.root.visible=!!e,e&&(i.card.set(e.id,kSi(e.id).star,e.grade??0),i.n.text=`×${ + e.count} + `,i.n.position.x=(70-i.n.width)/2,i.badge.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),t.newIds.includes(e.id)&&(i.badge.addChild(mki("NEW",728852,qIi,11,6)),i.badge.position.set((70-i.badge.width)/2,-9)))} + ),this.sum.text=r>0?`외 ${ + r} + 종 더`:"",this.sum.position.set((gxi-this.sum.width)/2,o-106),CRi.getInstance().overlay.addChild(this),qG.getInstance().playSFX(qG.SFX_POPUP),null==(s=this.tl)||s.kill(); + const u={ + n:0} + ,d=MR.timeline(); + d.fromTo(this.card,{ + alpha:0,y:this.card.y+24} + ,{ + alpha:1,y:this.card.y,duration:.22,ease:"power2.out"} + ).fromTo(this.cooler.scale,{ + x:.6,y:.6} + ,{ + x:1,y:1,duration:.3,ease:"back.out(3)"} + ,.05).to(u,{ + n:t.count,duration:Math.min(.9,.3+.02*t.count),ease:"power1.out",onUpdate:Qt(()=>{ + e||0===t.count||(this.count.text=`${ + Math.round(u.n)} + 마리`,this.count.x=(gxi-this.count.width)/2)} + ,"onUpdate")} + ,.12),this.cells.forEach((t,i)=>{ + t.root.visible&&(t.root.alpha=0,d.fromTo(t.root,{ + alpha:0} + ,{ + alpha:1,duration:.12} + ,.25+.055*i).fromTo(t.root.scale,{ + x:.4,y:.4} + ,{ + x:1,y:1,duration:.26,ease:"back.out(2.6)"} + ,.25+.055*i))} + ),this.tl=d} + } + ; + Qt(mxi,"FishingSettlePanel"),Zt(mxi,"instance"); + let vxi=mxi; + const _xi=Qt(t=>Math.max(0,Math.min(1,t)),"clamp01$3"),Mxi=Qt(t=>1+2.70158*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"backOut$1"); + function bxi(t,i){ + if(null!==i&&t>=i){ + const s=bxi(i,null),e=_xi((t-i)/160); + return{ + scale:s.scale*(1-.1*e),alpha:s.alpha*(1-e),bob:0} + } + if(t<120)return{ + scale:.6,alpha:0,bob:0} + ; + const s=_xi((t-120)/240),e=t>=360?6*Math.sin((t-360)/1200*Math.PI*2):0; + return{ + scale:.6+.4*Mxi(s),alpha:s,bob:e} + } + Qt(bxi,"coachPose"); + const yxi=VIi,Exi=jIi,Axi=class t extends Ve{ + constructor(){ + super(),Zt(this,"id",null),Zt(this,"body",new Ve),Zt(this,"bg",new ip),Zt(this,"tail",new ip),Zt(this,"text",rki("",Exi,13)),Zt(this,"t0",0),Zt(this,"tapAt",null),Zt(this,"target",null),Zt(this,"below",!1),Zt(this,"width0",0),this.eventMode="none",this.body.addChild(this.bg,this.tail,this.text),this.addChild(this.body),this.visible=!1} + show(t,i,s,e,n){ + this.id=t,this.target=s,this.below=e,this.width0=n,this.text.text=i,this.t0=performance.now(),this.tapAt=null,this.visible=!0,this.alpha=0,vn.shared.remove(this.tick,this),vn.shared.add(this.tick,this),this.tick()} + dismiss(){ + this.visible&&null===this.tapAt&&(this.tapAt=(performance.now()-this.t0)*t.speed)} + stop(){ + (this.visible||this.target)&&this.end()} + tick(){ + var i; + if(!this.parent)return this.end(); + const s=(performance.now()-this.t0)*t.speed,e=(null==(i=this.target)?void 0:i.call(this))??null; + e||this.dismiss(); + const n=bxi(s,this.tapAt); + if(e){ + const t=this.parent.toLocal(e); + this.position.set(t.x,t.y)} + const h=this.text.width+24,r=this.text.height+16; + let o=-h/2; + const a=this.x+o; + a<8?o+=8-a:a+h>this.width0-8&&(o-=a+h-(this.width0-8)); + const c=this.below?8:-8-r; + this.bg.clear().roundRect(o,c,h,r,10).fill(yxi),this.tail.clear(),this.below?this.tail.moveTo(-8,9).lineTo(0,0).lineTo(8,9).closePath().fill(yxi):this.tail.moveTo(-8,-9).lineTo(0,0).lineTo(8,-9).closePath().fill(yxi),this.text.position.set(o+12,c+8),this.body.scale.set(n.scale),this.body.y=this.below?-n.bob:n.bob,this.alpha=n.alpha,null!==this.tapAt&&s>=this.tapAt+160&&this.end()} + end(){ + vn.shared.remove(this.tick,this),this.visible=!1,this.id=null,this.target=null} + } + ; + Qt(Axi,"FishingCoach"),Zt(Axi,"speed",1); + let Sxi=Axi; + const Txi=CRi.CONTENT_W,Cxi=1e3,Oxi=28,Ixi=1842206,kxi=921104,Rxi=2894894,xxi=4013377,Pxi=15921908,Nxi=10592678,Lxi=7237235,Dxi=VIi,Gxi=VIi,Bxi=jIi,Uxi=["종족","성별","얼굴"],Fxi=["어느 종족으로 시작할까요?","성별을 골라요","얼굴을 꾸며요"],$xi=Qt(t=>t/512*100,"frontR"),Hxi=class extends Ve{ + constructor(t,i,s,e,n=!0){ + super(),Zt(this,"bg",new ip),Zt(this,"text"),Zt(this,"onTap",null),Zt(this,"_enabled",!0),this.w=i,this.h=s,this.primary=n,this.text=rki(t,Bxi,e),this.addChild(this.bg,this.text),this.eventMode="static",this.cursor="pointer",this.hitArea=new Ui(0,0,i,s),this.on("pointerdown",()=>{ + this._enabled&&this.scale.set(.97)} + ),this.on("pointerup",()=>this.scale.set(1)),this.on("pointerupoutside",()=>this.scale.set(1)),this.on("pointertap",t=>{ + var i; + t.stopPropagation(),this._enabled&&(null==(i=this.onTap)||i.call(this))} + ),this.draw()} + set enabled(t){ + this._enabled=t,this.draw()} + get enabled(){ + return this._enabled} + setText(t){ + this.text.text=t,this.draw()} + draw(){ + const t=this._enabled; + this.bg.clear().roundRect(0,0,this.w,this.h,16).fill({ + color:this.primary?Gxi:Rxi,alpha:t?1:.4} + ),this.text.textColor=this.primary?Bxi:Pxi,this.text.alpha=t?1:.55,oki(this.text,this.w-12),this.text.position.set((this.w-this.text.width)/2,(this.h-this.text.height)/2)} + } + ; + Qt(Hxi,"MkButton"); + let Wxi=Hxi; + const Vxi=class extends Ve{ + constructor(t,i,s,e,n=null){ + super(),Zt(this,"bg",new ip),Zt(this,"main"),this.w=i,this.h=s,this.onTap=n,this.main=rki(t,Pxi,e),this.addChild(this.bg,this.main),this.eventMode="static",this.cursor="pointer",this.hitArea=new Ui(0,0,i,s),this.on("pointertap",t=>{ + var i; + t.stopPropagation(),null==(i=this.onTap)||i.call(this)} + ),this.setOn(!1)} + setOn(t,i=!1){ + this.bg.clear().roundRect(0,0,this.w,this.h,12).fill(t?Gxi:i?xxi:Rxi),this.main.textColor=t?Bxi:Pxi,oki(this.main,this.w-12),this.main.position.set((this.w-this.main.width)/2,(this.h-this.main.height)/2)} + } + ; + Qt(Vxi,"OptButton"); + let jxi=Vxi; + const Kxi=class extends Ve{ + constructor(t,i,s=null){ + super(),Zt(this,"bg",new ip),this.color=t,this.s=i,this.onTap=s,this.addChild(this.bg),this.eventMode="static",this.cursor="pointer",this.hitArea=new Ui(-4,-4,i+8,i+8),this.on("pointertap",t=>{ + var i; + t.stopPropagation(),null==(i=this.onTap)||i.call(this)} + ),this.setOn(!1)} + setOn(t){ + const i=this.s,s=t?6:0; + this.bg.clear(),t&&this.bg.roundRect(0,0,i,i,15).fill(Gxi),this.bg.roundRect(s,s,i-2*s,i-2*s,t?9:15).fill(this.color)} + } + ; + Qt(Kxi,"Swatch"); + let zxi=Kxi; + const Yxi=class extends Ve{ + constructor(t,i,s,e,n,h){ + super(),Zt(this,"bg",new ip),Zt(this,"check",new Ve),this.w=t,this.h=i,this.onTap=h; + const r=rki(s,Pxi,28); + r.position.set((t-r.width)/2,e); + const o=(new ip).circle(0,0,20).fill(Gxi),a=rki("✓",Bxi,24); + a.position.set(-a.width/2,-a.height/2),this.check.addChild(o,a),this.check.position.set(t-32,32); + const c=(new ip).roundRect(0,0,t,i,22).fill(16777215),l=new Ve; + l.addChild(...n),l.mask=c,this.addChild(this.bg,l,c,r,this.check),this.eventMode="static",this.cursor="pointer",this.hitArea=new Ui(0,0,t,i),this.on("pointertap",t=>{ + t.stopPropagation(),this.onTap()} + ),this.setOn(!1)} + setOn(t){ + this.bg.clear().roundRect(0,0,this.w,this.h,22).fill(t?xxi:Rxi),this.check.visible=t} + } + ; + Qt(Yxi,"PickCard"); + let qxi=Yxi; + const Xxi=class t extends Ve{ + constructor(){ + super(),Zt(this,"dim",new ip),Zt(this,"card",new Ve),Zt(this,"cardBg",new ip),Zt(this,"title",rki("캐릭터 생성",Dxi,34)),Zt(this,"closeBtn",rki("닫기",Lxi,20)),Zt(this,"chips",new Ve),Zt(this,"question",rki("",Pxi,30)),Zt(this,"body",new Ve),Zt(this,"back",new Wxi("이전",120,76,26,!1)),Zt(this,"go",new Wxi("다음",484,76,26)),Zt(this,"draft",{ + ...gOi} + ),Zt(this,"picked",{ + race:!1,sex:!1} + ),Zt(this,"step",0),Zt(this,"first",!0),Zt(this,"busy",!1),Zt(this,"onDone",null),this.dim.eventMode="static",this.back.onTap=()=>{ + this.step>0&&(this.step=this.step-1,this.render())} + ,this.go.onTap=()=>{ + this.step<2?(this.step=this.step+1,this.render()):this.confirm()} + ,this.closeBtn.eventMode="static",this.closeBtn.cursor="pointer",this.closeBtn.on("pointertap",i=>{ + var s; + i.stopPropagation(),this.first?(t.skipped=!0,this.close(),null==(s=this.onDone)||s.call(this)):this.close()} + ),this.cardBg.roundRect(0,0,540,Cxi,30).fill(Ixi),this.title.position.set(Oxi,30),this.chips.position.set(Oxi,96),this.question.position.set(Oxi,164),this.back.position.set(Oxi,896),this.card.addChild(this.cardBg,this.title,this.closeBtn,this.chips,this.question,this.body,this.back,this.go),this.addChild(this.dim,this.card)} + static getInstance(){ + return this.instance??(this.instance=new t)} + static get isOpen(){ + var t; + return!!(null==(t=this.instance)?void 0:t.parent)} + open(t,i){ + this.first=t,this.onDone=i??null; + const s=mOi(RIi.getInstance().look); + this.draft=t?{ + ...gOi,skin:0,hair:0,hairColor:0,feats:[]} + :s??{ + ...gOi} + ,this.picked={ + race:!t||!!s,sex:!t||!!s} + ,this.step=t?0:2,this.title.text=t?"캐릭터 생성":"모습 바꾸기",this.closeBtn.text=t?"나중에 하기":"닫기",this.closeBtn.visible=!t||OG.getInstance().development,this.closeBtn.position.set(512-this.closeBtn.width,40),this.parent||CRi.getInstance().overlay.addChild(this),this.layout(),this.render(),MR.fromTo(this.card,{ + alpha:0} + ,{ + alpha:1,duration:.2} + )} + close(){ + var t; + this.busy||null==(t=this.parent)||t.removeChild(this)} + closeOne(){ + return this.first&&!this.closeBtn.visible?(vH.getInstance().showMessage("먼저 내 낚시꾼 모습을 정해요"),!0):(this.close(),!0)} + layout(){ + const t=CRi.contentHeight,i=CRi.OVERLAY_PAD; + this.dim.clear().rect(-i,0,Txi+2*i,t).fill({ + color:0,alpha:.72} + ),this.dim.hitArea=new Ui(-i,0,Txi+2*i,2e3); + const s=Math.min(1,(t-16)/Cxi,(Txi-16)/540); + this.card.scale.set(s),this.card.position.set((Txi-540*s)/2,Math.max(8,(t-Cxi*s)/2))} + render(){ + const t=this.step; + this.chips.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const i=464/3; + Uxi.forEach((s,e)=>{ + const n=new jxi(`${ + e+1} + ${ + s} + `,i,44,20,this.first?null:()=>{ + this.step=e,this.render()} + ); + n.setOn(e===t,e<t),this.first&&(n.eventMode="none",n.cursor="default"),n.position.set(e*(i+10),0),this.chips.addChild(n)} + ),this.question.text=Fxi[t],this.body.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),this.body.position.set(Oxi,216),0===t?this.renderRaces():1===t?this.renderSexes():this.renderFace(),this.back.visible=t>0; + const s=t>0?352:484; + if(Math.abs(this.go.w-s)>1){ + const t=this.go; + this.go=new Wxi("",s,76,26),this.go.onTap=t.onTap,this.card.addChildAt(this.go,this.card.getChildIndex(t)),t.destroy()} + this.go.position.set(t>0?160:Oxi,896),this.go.setText(t<2?"다음":this.first?"출발":"바꾸기"),this.go.enabled=0===t?this.picked.race:1!==t||this.picked.sex} + renderRaces(){ + eOi.forEach((t,i)=>{ + const s=new ARi($xi(236)); + s.set({ + ...gOi,race:i,sex:1,skin:0,hair:0,hairColor:aOi[i],feats:[]} + ),s.position.set(117,231.25); + const e=new qxi(234,300,t,243,[s],()=>{ + this.picked.race&&this.draft.race===i||(this.draft.hairColor=aOi[i]),this.draft.race=i,this.draft.skin=Math.min(this.draft.skin,nOi[i].length-1),this.picked.race=!0,this.render()} + ); + e.setOn(this.picked.race&&this.draft.race===i),e.position.set(i%2*250,316*Math.floor(i/2)),this.body.addChild(e)} + )} + renderSexes(){ + sOi.forEach((t,i)=>{ + const s=new ARi($xi(230)); + s.set({ + ...gOi,race:this.draft.race,sex:i,skin:0,hair:0,hairColor:this.draft.hairColor,feats:[]} + ),s.position.set(117,229.625); + const e=new qxi(234,360,t,299,[s],()=>{ + this.draft.sex=i,this.picked.sex=!0,this.render()} + ); + e.setOn(this.picked.sex&&this.draft.sex===i),e.position.set(250*i,0),this.body.addChild(e)} + )} + renderFace(){ + const t=this.draft,i=this.body,s=(new ip).circle(100,100,100).fill(kxi),e=(new ip).circle(100,100,100).fill(16777215),n=yRi(t); + n.scale.set(1.5625),n.position.set(100,100); + const h=new Ve; + h.addChild(n),h.mask=e; + const r=(new ip).roundRect(214,0,270,200,22).fill(kxi),o=new ARi($xi(200)); + o.set(t),o.position.set(349,187.5); + const a=new Wxi("무작위",96,40,18,!1); + a.position.set(378,10),a.onTap=()=>{ + t.skin=Math.floor(Math.random()*nOi[t.race].length),t.hair=Math.floor(Math.random()*hOi[t.sex].length),t.hairColor=Math.floor(Math.random()*oOi.length),this.render()} + ,i.addChild(s,h,e,r,o,a); + let c=214; + const l=Qt(t=>{ + const s=rki(t,Nxi,20,!1); + s.position.set(0,c),i.addChild(s),c+=34} + ,"title"),u=Qt((t,s,e)=>{ + t.forEach((t,n)=>{ + const h=new zxi(t,58,()=>{ + e(n),this.render()} + ); + h.setOn(n===s),h.position.set(70*n,c),i.addChild(h)} + ),c+=70} + ,"swatches"),d=Qt((t,s,e,n,h=10)=>{ + t.forEach((t,r)=>{ + const o=new jxi(t,n,54,21,()=>e(r)); + o.setOn(s(r)),o.position.set(r*(n+h),c),i.addChild(o)} + ),c+=66} + ,"opts"); + l("피부색"),u(nOi[t.race],t.skin,i=>{ + t.skin=i} + ),l("머리 모양"),d(hOi[t.sex],i=>i===t.hair,i=>{ + t.hair=i,this.render()} + ,146),l("머리 색"),u(oOi,t.hairColor,i=>{ + t.hairColor=i} + ),l("얼굴 장식 · 두 개까지"); + const f=(484-10*(lOi.length-1))/lOi.length; + d(lOi.map(t=>cOi[t]),i=>t.feats.includes(lOi[i]),i=>{ + const s=lOi[i]; + if(t.feats.includes(s))t.feats=t.feats.filter(t=>t!==s); + else{ + if(!(t.feats.length<2))return void vH.getInstance().showMessage("얼굴 장식은 두 개까지 고를 수 있어요"); + t.feats=[...t.feats,s].sort((t,i)=>t-i)} + this.render()} + ,f)} + async confirm(){ + var t; + if(this.busy)return; + const i=mOi(this.draft); + if(i){ + this.busy=!0,this.go.enabled=!1; + try{ + let s; + try{ + s=await RIi.getInstance().saveLook(i)} + catch{ + s="연결이 원활하지 않아요"} + if(s||!RIi.getInstance().look)return vH.getInstance().showMessage(`모습을 저장하지 못했어요 (${ + s??"서버가 모습을 모름"} + )`),void(this.closeBtn.visible=!0); + this.busy=!1,this.close(),vH.getInstance().showMessage(this.first?"출발!":"모습을 바꿨어요"),null==(t=this.onDone)||t.call(this)} + finally{ + this.busy=!1,this.go.enabled=!0} + } + else vH.getInstance().showMessage("고를 수 없는 모습이에요")} + } + ; + Qt(Xxi,"FishingAvatarMaker"),Zt(Xxi,"instance"),Zt(Xxi,"skipped",!1); + let Jxi=Xxi; + const Qxi=Object.freeze(Object.defineProperty({ + __proto__:null,FishingAvatarMaker:Jxi} + ,Symbol.toStringTag,{ + value:"Module"} + )),Zxi=new Map; + function tPi(t,i){ + const s=Zxi.get(t); + if(s&&!s.destroyed)return s; + const e=i(),n=ES.app.renderer.generateTexture({ + target:e,resolution:2,antialias:!0} + ); + return e.destroy({ + children:!0} + ),Zxi.set(t,n),n} + Qt(tPi,"bake$1"); + const iPi={ + wood:{ + shaft:10119740,shaftHi:13081186,head:12042438,headDark:6121584,fin:13193021,glow:null} + ,iron:{ + shaft:6253427,shaftHi:10135470,head:14870764,headDark:5661547,fin:4157363,glow:null} + ,mithril:{ + shaft:7322073,shaftHi:14219007,head:15924735,headDark:4889792,fin:10185983,glow:8380671} + } + ; + function sPi(t){ + return tPi(`harpoon:${ + t} + `,()=>{ + const i=new Ve,s=new ip,e=iPi[t]; + s.rect(0,0,128,28).fill({ + color:0,alpha:.001} + ),e.glow&&s.poly([96,2,127,14,96,26,102,14]).fill({ + color:e.glow,alpha:.35} + ).roundRect(6,9,92,10,5).fill({ + color:e.glow,alpha:.18} + ),s.poly([2,6,18,12,18,16,2,22,7,14]).fill(e.fin).stroke({ + color:2759186,width:1,alpha:.6} + ),s.roundRect(10,12,86,5,2.5).fill(e.shaft).rect(12,12.4,82,1.2).fill({ + color:e.shaftHi,alpha:.9} + ); + for(let t=0; + t<6; + t++)s.rect(30+3.2*t,11.2,1.7,6.6).fill(14731151); + return s.roundRect(92,10.5,9,8,2).fill(e.headDark),s.poly([99,4,124,14,99,24,104,14]).fill(e.head).stroke({ + color:e.headDark,width:1.2} + ),s.poly([104,7,97,1,101,9]).fill(e.head).stroke({ + color:e.headDark,width:1} + ),s.poly([104,21,97,27,101,19]).fill(e.head).stroke({ + color:e.headDark,width:1} + ),s.moveTo(102,14).lineTo(121,14).stroke({ + color:16777215,width:1,alpha:.7} + ),i.addChild(s),i} + )} + function ePi(){ + return tPi("harpoonShadow",()=>{ + const t=new Ve,i=new ip; + return i.rect(0,0,128,28).fill({ + color:16777215,alpha:.001} + ),i.poly([2,6,18,12,18,16,2,22,7,14]).fill(16777215),i.roundRect(10,12,86,5,2.5).fill(16777215),i.roundRect(92,10.5,9,8,2).fill(16777215),i.poly([99,4,124,14,99,24,104,14]).fill(16777215),i.poly([104,7,97,1,101,9]).fill(16777215),i.poly([104,21,97,27,101,19]).fill(16777215),t.addChild(i),t} + )} + function nPi(){ + return tPi("harpoonBlood",()=>{ + const t=new Ve,i=new ip; + i.rect(0,0,64,64).fill({ + color:16777215,alpha:.001} + ); + for(let s=10; + s>=1; + s--){ + const t=s/10; + i.ellipse(28,32,23*t,15*t).fill({ + color:16777215,alpha:.075} + ),i.ellipse(40,27,16*t,11*t).fill({ + color:16777215,alpha:.055} + ),i.ellipse(31,40,13*t,12*t).fill({ + color:16777215,alpha:.045} + )} + return t.addChild(i),t} + )} + Qt(sPi,"harpoonTex"),Qt(ePi,"harpoonShadowTex"),Qt(nPi,"harpoonBloodTex"); + const hPi={ + perfect:{ + text:"퍼펙트!",top:"#fff6b0",bottom:"#ff9a1f",stroke:5907456,size:46,rays:16766282} + ,great:{ + text:"그레이트!",top:"#d8ffe4",bottom:"#28c068",stroke:736546,size:40,rays:9437119} + ,good:{ + text:"명중",top:"#e2f4ff",bottom:"#4aa3ff",stroke:731725,size:36,rays:null} + ,miss:{ + text:"빗나감…",top:"#eef4f5",bottom:"#8aa0a6",stroke:2240566,size:30,rays:null} + } + ; + function rPi(t){ + return tPi(`grade:${ + t} + `,()=>{ + const i=hPi[t],s=new Ve,e=new gl({ + type:"linear",start:{ + x:0,y:0} + ,end:{ + x:0,y:1} + ,textureSpace:"local",colorStops:[{ + offset:0,color:i.top} + ,{ + offset:.55,color:i.top} + ,{ + offset:1,color:i.bottom} + ]} + ),n=new dw({ + text:i.text,style:new qg({ + fontFamily:"Arial",fontSize:i.size,fontWeight:"900",fill:e,letterSpacing:1,stroke:{ + color:i.stroke,width:Math.round(.17*i.size),join:"round"} + ,dropShadow:{ + color:0,alpha:.55,blur:3,distance:4,angle:Math.PI/2} + ,padding:10} + )} + ),h=n.width+40,r=n.height+30,o=new ip; + o.rect(0,0,h,r).fill({ + color:0,alpha:.001} + ); + for(let t=6; + t>=1; + t--)o.ellipse(h/2,r/2+2,(n.width/2+10)*(.7+.06*t),(n.height/2+4)*(.7+.07*t)).fill({ + color:398362,alpha:.07} + ); + if(i.rays){ + const t=h/2,s=r/2,e=14,n=Math.min(h,1.6*r)/2,a=.42*n,c=[]; + for(let i=0; + i<2*e; + i++){ + const h=i/(2*e)*Math.PI*2,r=i%2?a:n; + c.push(t+Math.cos(h)*r*1.15,s+Math.sin(h)*r*.55)} + o.poly(c).fill({ + color:i.rays,alpha:.32} + ),o.ellipse(t,s,.75*n,.32*n).fill({ + color:i.rays,alpha:.28} + )} + return n.position.set((h-n.width)/2,(r-n.height)/2),s.addChild(o,n),s} + )} + function oPi(){ + return tPi("glow",()=>{ + const t=new Ve,i=new ip; + for(let s=12; + s>=1; + s--)i.circle(64,64,s/12*64).fill({ + color:16777215,alpha:.085} + ); + return t.addChild(i),t} + )} + function aPi(){ + return tPi("ring",()=>{ + const t=new Ve,i=new ip; + return i.circle(64,64,58).stroke({ + color:16777215,width:7,alpha:.9} + ).circle(64,64,50).stroke({ + color:16777215,width:3,alpha:.35} + ),t.addChild(i),t} + )} + function cPi(){ + return tPi("harpoonRipple",()=>{ + const t=new Ve,i=new ip; + i.rect(0,0,128,128).fill({ + color:16777215,alpha:.001} + ),i.circle(64,64,58).stroke({ + color:16777215,width:3.2,alpha:.85} + ); + for(const s of[.2,2.5,4.4])i.arc(64,64,53,s,s+1.15).stroke({ + color:16777215,width:1.8,alpha:.4} + ); + return t.addChild(i),t} + )} + function lPi(){ + return tPi("woodenMallet:flat",()=>{ + const t=new Ve,i=new ip; + return i.rect(0,0,80,80).fill({ + color:0,alpha:.001} + ),i.roundRect(30,28,8,41,2).fill(13870186).stroke({ + color:5519136,width:2} + ),i.roundRect(12,10,44,23,2.5).fill(12158028).stroke({ + color:5519136,width:2} + ).moveTo(18,15).lineTo(50,15).stroke({ + color:14660985,width:1.8,cap:"round"} + ).moveTo(20,24).lineTo(30,24).moveTo(39,27).lineTo(48,27).stroke({ + color:9396278,width:1.2,cap:"round"} + ),t.addChild(i),t} + )} + Qt(rPi,"gradeTex"),Qt(oPi,"glowTex"),Qt(aPi,"ringTex"),Qt(cPi,"harpoonRippleTex"),Qt(lPi,"woodenMalletTex"); + const uPi={ + cycleMs:2300,hits:[0,220,440],stowMs:300,crop:120,soundWindowMs:1e4,finishBurstMs:300,finishMs:2100,helpFlightMs:600} + ,dPi=Qt(t=>Math.min(1,Math.max(0,t)),"clamp01$2"),fPi=Qt((t,i,s)=>dPi((t-i)/s),"seg"),pPi=Qt(t=>1-(1-t)**3,"outCubic$1"),gPi=Qt((t,i)=>{ + const s=t-1; + return s*s*((i+1)*s+i)+1} + ,"outBack"); + function wPi(t,i=1){ + const s=150/i,e=40/i,n=120/i; + return t>=-s&&t<-e?pPi((t+s)/(s-e)):t>=-e&&t<0?1-((t+e)/e)**2:t>=0&&t<n?.15*Math.sin(Math.PI*t/n):0} + function mPi(t){ + if(!(t>=0))return{ + raise:0,impactAge:1/0,hitIndex:-1,burstFirst:!1} + ; + const{ + cycleMs:i,hits:s} + =uPi,e=Math.floor(t/i),n=t-e*i; + let h=0,r=1/0,o=-1,a=!1; + for(const c of[-1,0,1])s.forEach((t,l)=>{ + const u=n-(t+c*i); + e+c<0||(h=Math.max(h,wPi(u)),u>=0&&u<r&&(r=u,o=(e+c)*s.length+l,a=0===l))} + ); + return{ + raise:h,impactAge:r,hitIndex:o,burstFirst:a} + } + function vPi(t){ + const i=t.impactAge<90?1.2*(1-t.impactAge/90):0,s=-1.4*t.raise+i; + return Math.abs(s)<1e-9?0:s} + function _Pi(t){ + return pPi(fPi(t,0,uPi.stowMs))} + function MPi(t){ + return 8*Math.round(uPi.crop*dPi(t)/8)} + function bPi(t){ + return t>=400?1:gPi(fPi(t,80,320),2)} + function yPi(t){ + const i=uPi.finishBurstMs; + let s=0,e=1/0; + for(const h of[0,90,180,270]){ + const i=t-h; + s=Math.max(s,wPi(i,2.2)),i>=0&&i<e&&(e=i)} + t>=i&&(s=0); + const n=t-i; + return{ + raise:s,impactAge:e,white:n>=0&&n<260?.5*(1-n/260):0,rise:n>=0&&n<520?Math.sin(Math.PI*n/520):0,shine:n>=120&&n<820?(n-120)/700:-1,check:n>=120,badgeScale:n<0?1:n<260?1+.3*Math.sin(Math.PI*n/260):n<900?1:1-pPi(fPi(n,900,300)),ribbon:n>=60?gPi(fPi(n,60,380),2.2)*(1-fPi(n,1500,300)):0,starAge:n-100,ringAge:n,unstow:pPi(fPi(n,500,300)),done:t>=uPi.finishMs} + } + function EPi(t){ + const i=fPi(t,0,uPi.helpFlightMs); + return{ + k:i,lift:70*Math.sin(Math.PI*i),arrived:t>=uPi.helpFlightMs,impactAge:t-uPi.helpFlightMs} + } + function APi(t,i){ + return null!==t&&t>=0&&t<=uPi.soundWindowMs&&i} + Qt(wPi,"raiseFor"),Qt(mPi,"hammerAt"),Qt(vPi,"leanAt"),Qt(_Pi,"stowAt"),Qt(MPi,"rodCrop"),Qt(bPi,"badgePop"),Qt(yPi,"finishPose"),Qt(EPi,"helpFlight"),Qt(APi,"hitSound"); + const SPi=new Map; + function TPi(t,i,s=3){ + const e=SPi.get(t); + if(e&&!e.destroyed)return e; + const n=i(),h=ES.app.renderer.generateTexture({ + target:n,resolution:s,antialias:!0} + ); + return n.destroy({ + children:!0} + ),SPi.set(t,h),h} + function CPi(t){ + return TPi(`repair:head:${ + t} + `,()=>{ + const i=new ip; + i.roundRect(-7.5,-4.2,15,8.4,2).fill(t?15053370:12158028).stroke({ + color:t?8016392:4861720,width:1} + ),i.roundRect(-7.5,-4.2,1.6,8.4,.6).fill(t?10975248:7226917).roundRect(5.9,-4.2,1.6,8.4,.6).fill(t?10975248:7226917),i.moveTo(-5.2,-2.1).lineTo(5.2,-2.1).stroke({ + color:t?16773560:14859140,width:1,cap:"round"} + ); + const s=new Ve; + return s.addChild(i),s} + ,4)} + function OPi(){ + return TPi("repair:chip",()=>{ + const t=new Ve; + return t.addChild((new ip).rect(-1.6,-.8,3.2,1.6).fill(16777215)),t} + ,4)} + function IPi(){ + return TPi("repair:soft",()=>{ + const t=new ip; + for(let s=16; + s>=2; + s-=2)t.circle(0,0,s).fill({ + color:16777215,alpha:.11} + ); + const i=new Ve; + return i.addChild(t),i} + ,2)} + function kPi(){ + return TPi("repair:star",()=>{ + const t=(new ip).poly([0,-4,1.2,-1.2,4,0,1.2,1.2,0,4,-1.2,1.2,-4,0,-1.2,-1.2]).fill(16777215),i=new Ve; + return i.addChild(t),i} + ,4)} + function RPi(t){ + return TPi(`repair:ribbon:${ + t} + `,()=>{ + const i=new Ve,s=new ip; + s.roundRect(-56,-15,112,30,7).fill(5913118).roundRect(-53,-12,106,24,5).fill(9067054).stroke({ + color:16106577,width:1.4} + ),s.circle(-46,0,1.8).fill(3810322).circle(46,0,1.8).fill(3810322); + const e=new dw({ + text:t,style:{ + fontFamily:"Arial",fontWeight:"900",fontSize:15,fill:16773583,stroke:{ + color:2758408,width:4,join:"round"} + } + } + ); + return e.anchor.set(.5),e.y=.5,e.width>92&&e.scale.set(92/e.width),i.addChild(s,e),i} + ,3)} + Qt(TPi,"bake"),Qt(CPi,"malletHeadTex"),Qt(OPi,"chipTex"),Qt(IPi,"softTex"),Qt(kPi,"starTex"),Qt(RPi,"ribbonTex"); + const xPi=new WeakMap,PPi=new WeakMap; + function NPi(t,i){ + const s=PPi.get(t)??t; + if(i<=0)return s; + let e=xPi.get(s); + e||(e=new Map,xPi.set(s,e)); + let n=e.get(i); + if(!n||n.destroyed){ + const t=s.frame,h=i*(t.height/256); + n=new as({ + source:s.source,frame:new Ui(t.x,t.y+h,t.width,t.height-h)} + ),e.set(i,n),PPi.set(n,s)} + return n} + function LPi(t,i){ + return(t-i)/(256-i)} + function DPi(t){ + return PPi.get(t)??t} + Qt(NPi,"cropRod"),Qt(LPi,"cropAnchorY"),Qt(DPi,"uncropped"); + const GPi=Qt(t=>{ + const i=43758.5453*Math.sin(127.1*t+311.7); + return i-Math.floor(i)} + ,"hash"),BPi=Qt(t=>{ + let i=0; + for(let s=0; + s<t.length; + s++)i=31*i+t.charCodeAt(s)|0; + return Math.abs(i)} + ,"strHash$1"),UPi=Qt(t=>1-(1-t)**3,"outCubic"),FPi=class{ + constructor(t){ + Zt(this,"under",new Ve),Zt(this,"over",new Ve),Zt(this,"onSound",null),Zt(this,"myCrew",null),Zt(this,"crewOf",new Map),Zt(this,"otherLastHit",new Map),Zt(this,"mine",null),Zt(this,"pendingFresh",-1e9),Zt(this,"finishAt",-1),Zt(this,"stopAt",-1),Zt(this,"lastMineImpact",1/0),Zt(this,"lastFinishImpact",1/0),Zt(this,"finishSounded",!1),Zt(this,"helpPunchAt",-1e9),Zt(this,"rings",[]),Zt(this,"chips",[]),Zt(this,"flights",[]),Zt(this,"ringG",new ip),Zt(this,"trailG",new ip),Zt(this,"pool",[]),Zt(this,"used",0),Zt(this,"badge",new Ve),Zt(this,"badgeArc",new ip),Zt(this,"badgeCheck",new ip),Zt(this,"badgeMallet",new Ye(lPi())),Zt(this,"badgeGlow",new ip),Zt(this,"arcDrawn",-1),Zt(this,"arcBroken",!1),Zt(this,"ribbon",null),Zt(this,"hullFlash",new Ye),Zt(this,"shineWrap",new Ve),Zt(this,"shineBand",new ip),Zt(this,"shineMask",new Ye),this.scale=t; + for(const e of[this.under,this.over])e.eventMode="none"; + this.under.addChild(this.ringG); + const i=(new ip).circle(0,0,16).fill({ + color:1970698,alpha:.9} + ).circle(0,0,13.2).stroke({ + color:2759182,width:3.6} + ),s=(new ip).circle(0,0,16).stroke({ + color:16106577,width:1.2,alpha:.55} + ); + this.badgeMallet.anchor.set(.425,.49375),this.badgeMallet.rotation=-.45,this.badgeMallet.scale.set(.3),this.badgeCheck.circle(0,0,14).fill(4173418).moveTo(-6,.5).lineTo(-1.5,5).lineTo(6.5,-4.5).stroke({ + color:16777215,width:3.2,cap:"round",join:"round"} + ),this.badgeCheck.visible=!1,this.badge.addChild(i,this.badgeGlow,this.badgeArc,this.badgeMallet,this.badgeCheck,s),this.badge.visible=!1,this.hullFlash.anchor.set(.5),this.hullFlash.blendMode="add",this.hullFlash.visible=!1,this.shineMask.anchor.set(.5),this.shineBand.blendMode="add",this.shineWrap.addChild(this.shineBand,this.shineMask),this.shineBand.mask=this.shineMask,this.shineWrap.visible=!1; + for(let e=-5; + e<=5; + e++)this.shineBand.rect(5*e,-90,5,180).fill({ + color:16777215,alpha:.55*(1-Math.abs(e)/6)} + ); + this.over.addChild(this.hullFlash,this.shineWrap,this.trailG,this.badge)} + markFresh(){ + this.pendingFresh=performance.now()} + setMine(t){ + const i=performance.now(); + if(!t)return this.mine&&this.finishAt<0&&(this.stopAt=i),void(this.finishAt<0&&(this.mine=null)); + if(!(this.finishAt>=0)){ + if(!this.mine){ + const s=i-this.pendingFresh<5e3; + return this.mine={ + since:s?i:i-uPi.stowMs-1e3,fresh:s?i:null,progress:t.progress,shown:t.progress,broken:t.broken} + ,this.stopAt=-1,this.finishSounded=!1,this.pendingFresh=-1e9,void(this.lastMineImpact=1/0)} + this.mine.progress=t.progress,this.mine.broken=t.broken} + } + finish(){ + !this.mine||this.finishAt>=0||(this.finishAt=performance.now(),this.mine.progress=1,this.lastFinishImpact=1/0)} + get busy(){ + return!!this.mine} + help(t,i,s=null){ + const e=i(); + e?this.flights.push({ + from:t??{ + x:e.x-60,y:e.y-220} + ,to:i,t0:performance.now(),arrived:!1,onArrive:s} + ):null==s||s()} + crewFor(t){ + return this.crewOf.get(t)??null} + update(t,i,s){ + const e=performance.now(); + this.used=0,this.ringG.clear(),this.trailG.clear(),this.crewOf.clear(),this.myCrew=null,this.badge.visible=!1,this.hullFlash.visible=!1,this.shineWrap.visible=!1,this.ribbon&&(this.ribbon.visible=!1); + for(const n of s){ + const t=mPi(e+BPi(n.id)%uPi.cycleMs); + this.crewOf.set(n.id,{ + crop:uPi.crop,lean:vPi(t)} + ); + const i=this.drawHead(n,t,vPi(t),!1); + t.hitIndex>=0&&this.otherLastHit.get(n.id)!==t.hitIndex&&(this.otherLastHit.has(n.id)&&t.impactAge<200&&this.chips.push({ + x:i.x,y:i.y,t0:e-t.impactAge,seed:t.hitIndex+BPi(n.id),k:.8,gold:!1} + ),this.otherLastHit.set(n.id,t.hitIndex)),n.broken&&this.smoke(n,e,.5,BPi(n.id))} + if(t&&this.mine)this.drawMine(t,i,e); + else if(t&&this.stopAt>=0){ + const t=1-_Pi(e-this.stopAt); + t>0?this.myCrew={ + crop:MPi(t),lean:0} + :this.stopAt=-1} + this.drawFlights(e),this.drawChips(e),this.drawRings(e); + for(let n=this.used; + n<this.pool.length; + n++)this.pool[n].visible=!1; + if(this.otherLastHit.size>s.length)for(const n of[...this.otherLastHit.keys()])this.crewOf.has(n)||this.otherLastHit.delete(n)} + drawMine(t,i,s){ + var e,n,h; + const r=this.mine; + if(r.shown+=.12*(r.progress-r.shown),this.finishAt>=0){ + const h=s-this.finishAt,r=yPi(h); + if(r.done)return this.mine=null,void(this.finishAt=-1); + if(this.myCrew={ + crop:MPi(1-r.unstow),lean:vPi(r)} + ,h<uPi.finishBurstMs+500){ + const i=this.drawHead(t,r,vPi(r),!1); + r.impactAge<this.lastFinishImpact&&(this.chips.push({ + x:i.x,y:i.y,t0:s-r.impactAge,seed:900+Math.floor(h/90),k:1,gold:!1} + ),null==(e=this.onSound)||e.call(this,"hit"))} + return this.lastFinishImpact=r.impactAge,h>=uPi.finishBurstMs&&!this.finishSounded&&(this.finishSounded=!0,null==(n=this.onSound)||n.call(this,"finish"),this.rings.push({ + x:t.x,y:t.y,t0:s,r0:24,r1:62,dur:900,color:16772798,width:2.2} + ,{ + x:t.x,y:t.y,t0:s+150,r0:20,r1:44,dur:800,color:16777215,width:1.4} + )),this.drawHullFx(i,r.white,r.shine),this.drawBadge(t,1,r.badgeScale,r.check,0),this.drawStars(t,r.starAge),void(r.ribbon>0&&(this.ribbon||(this.ribbon=new Ye(RPi("수리 완료!")),this.ribbon.anchor.set(.5),this.over.addChild(this.ribbon)),this.ribbon.visible=!0,this.ribbon.position.set(t.x,t.y-84),this.ribbon.scale.set(r.ribbon)))} + const o=s-r.since,a=_Pi(o),c=mPi(o-350),l=o>=350?vPi(c):0; + if(this.myCrew={ + crop:MPi(a),lean:l} + ,o>=200){ + const i=this.drawHead(t,o<350?{ + raise:.35*Math.min(1,(o-200)/150),impactAge:1/0} + :c,l,!1); + c.impactAge<this.lastMineImpact&&c.hitIndex>=0&&(this.chips.push({ + x:i.x,y:i.y,t0:s-c.impactAge,seed:c.hitIndex,k:1,gold:!1} + ),c.burstFirst&&this.rings.push({ + x:t.x,y:t.y,t0:s-c.impactAge,r0:24,r1:40,dur:650,color:15137013,width:1.4} + ),APi(null===r.fresh?null:s-r.fresh,c.burstFirst)&&(null==(h=this.onSound)||h.call(this,"hit"))),this.lastMineImpact=c.impactAge} + r.broken&&this.smoke(t,s,1-.9*Math.min(1,r.shown),0); + const u=null===r.fresh?1:bPi(o),d=s-this.helpPunchAt,f=d>=0&&d<300?1+.25*Math.sin(Math.PI*d/300):1; + this.drawBadge(t,r.shown,u*f,!1,d>=0&&d<500?.8*(1-d/500):0,r.broken)} + drawHead(t,i,s,e){ + const n=this.scale.angler,h=Math.sin(t.face),r=-Math.cos(t.face),o=85*n,a=o+4.5-5*i.raise+s,c=t.x+h*a,l=t.y+r*a; + if(i.raise>.05){ + const s=this.sprite(IPi(),t.x+h*a+3*i.raise,t.y+r*a+4*i.raise,663070,.28*i.raise); + s.scale.set(.38,.24),s.rotation=t.face} + this.trailG.moveTo(t.x+h*(o-3+s),t.y+r*(o-3+s)).lineTo(c,l).stroke({ + color:13212254,width:2,cap:"round"} + ); + const u=this.sprite(CPi(e),c,l,16777215,1); + if(u.anchor.set(.5),u.rotation=t.face,u.scale.set(.7*(1+.35*i.raise)),i.impactAge<90){ + const t=i.impactAge/90; + this.sprite(IPi(),c,l,16777200,.9*(1-t)).scale.set((3+4*t)/16)} + return{ + x:c,y:l} + } + smoke(t,i,s,e){ + if(s<=.01)return; + const n=Math.sin(t.face),h=-Math.cos(t.face),r=t.x-13*n,o=t.y-13*h; + for(let a=0; + a<7; + a++){ + const t=1700,n=243*a+e%500,h=Math.floor((i-n)/t)*t+n,c=i-h,l=c/t,u=3*Math.sin((h+c)/260+a),d=r+.5*u+26*l,f=o-16*l+.4*u,p=s*(1-l)*Math.min(1,6*l); + this.sprite(IPi(),d,f,3421752,.62*p).scale.set((3.5+7.5*l)/14),this.sprite(IPi(),d-1.5,f-1.5,9868948,.22*p).scale.set((2+4*l)/14)} + } + drawBadge(t,i,s,e,n,h=!1){ + if(s<=.01)return; + const r=this.badge; + r.visible=!0,r.position.set(t.x,t.y-46),r.scale.set(s),this.badgeCheck.visible=e,this.badgeMallet.visible=this.badgeArc.visible=!e; + const o=Math.round(200*Math.min(1,Math.max(0,i)))/200; + o===this.arcDrawn&&h===this.arcBroken||(this.arcDrawn=o,this.arcBroken=h,this.badgeArc.clear(),o>.005&&this.badgeArc.arc(0,0,13.2,-Math.PI/2,-Math.PI/2+2*Math.PI*o).stroke({ + color:h?16747100:16757611,width:3.6,cap:"round"} + )),this.badgeGlow.clear(),n>0&&this.badgeGlow.circle(0,0,13.2).stroke({ + color:16770700,width:6,alpha:n} + )} + drawHullFx(t,i,s){ + const e=null==t?void 0:t.sprite; + if(!e||e.destroyed)return; + const n=Qt(t=>{ + t.texture=e.texture,t.anchor.copyFrom(e.anchor),t.position.copyFrom(e.position),t.rotation=e.rotation,t.scale.copyFrom(e.scale),t.skew.copyFrom(e.skew)} + ,"copy"); + if(i>0&&(n(this.hullFlash),this.hullFlash.visible=!0,this.hullFlash.alpha=i),s>=0){ + this.shineWrap.visible=!0,n(this.shineMask); + const t=e.width,i=e.x,h=e.y; + this.shineBand.position.set(i-.9*t+1.8*t*s,h),this.shineBand.rotation=e.rotation+.6,this.shineBand.alpha=.85} + } + drawStars(t,i){ + if(i<0||i>800)return; + const s=i/800; + for(let e=0; + e<10; + e++){ + const i=e/10*Math.PI*2+.3,n=10+34*UPi(s),h=this.sprite(kPi(),t.x+Math.cos(i)*n,t.y-46+Math.sin(i)*n*.85,e%3?16769674:16777215,1-s); + h.anchor.set(.5),h.rotation=3*s,h.scale.set(1-.5*s)} + } + drawFlights(t){ + this.flights=this.flights.filter(i=>{ + var s,e; + const n=i.to(),h=EPi(t-i.t0); + if(!n)return!1; + if(!h.arrived){ + const t=Qt(t=>({ + x:i.from.x+(n.x-i.from.x)*t,y:i.from.y+(n.y-i.from.y)*t-70*Math.sin(Math.PI*t)} + ),"at"); + for(let i=1; + i<=5; + i++){ + const s=t(Math.max(0,h.k-.05*i)); + this.trailG.circle(s.x,s.y,2.6-.3*i).fill({ + color:16769674,alpha:.5-.08*i} + )} + const s=t(h.k),e=this.sprite(lPi(),s.x,s.y,16765803,1); + e.anchor.set(.425,.49375),e.scale.set(.34),e.rotation=7*h.k-.6; + const r=this.sprite(IPi(),s.x,s.y,16769674,.5); + return r.scale.set(.9),r.blendMode="add",!0} + return i.arrived||(i.arrived=!0,this.chips.push({ + x:n.x,y:n.y,t0:t,seed:99,k:1.4,gold:!0} + ),this.rings.push({ + x:n.x,y:n.y,t0:t,r0:14,r1:30,dur:600,color:16769674,width:1.8} + ),null==(s=this.onSound)||s.call(this,"help"),null==(e=i.onArrive)||e.call(i)),!1} + )} + helpPunch(){ + this.helpPunchAt=performance.now()} + drawChips(t){ + this.chips=this.chips.filter(i=>t-i.t0<=450); + for(const i of this.chips){ + const s=t-i.t0,e=s/450; + for(let t=0; + t<6; + t++){ + const s=GPi(7*i.seed+t)*Math.PI*2,n=(8+9*GPi(i.seed+3*t))*UPi(e)*i.k,h=this.sprite(OPi(),i.x+Math.cos(s)*n,i.y+Math.sin(s)*n,i.gold?t%2?16769674:16774864:t%2?14200179:9132587,1-e); + h.anchor.set(.5),h.rotation=s+6*e,h.scale.set(i.k)} + if(s<220){ + const t=s/220; + this.ringG.circle(i.x,i.y,(3+7*t)*i.k).stroke({ + color:16775398,width:1.4,alpha:.7*(1-t)} + )} + } + } + drawRings(t){ + this.rings=this.rings.filter(i=>t-i.t0<=i.dur); + for(const i of this.rings){ + const s=t-i.t0; + if(s<0)continue; + const e=s/i.dur,n=i.r0+(i.r1-i.r0)*UPi(e); + this.ringG.ellipse(i.x,i.y,n,.82*n).stroke({ + color:i.color,width:i.width,alpha:.9*(1-e)} + )} + } + sprite(t,i,s,e,n){ + let h=this.pool[this.used]; + return h||(h=new Ye,h.eventMode="none",this.pool.push(h),this.over.addChildAt(h,Math.max(0,this.over.getChildIndex(this.badge)))),this.used++,h.texture=t,h.anchor.set(.5),h.position.set(i,s),h.tint=e,h.alpha=n,h.rotation=0,h.scale.set(1),h.blendMode="normal",h.visible=!0,h} + destroy(){ + this.flights=[],this.chips=[],this.rings=[],this.under.destroy({ + children:!0} + ),this.over.destroy({ + children:!0} + )} + } + ; + Qt(FPi,"BoatRepairFx"); + let $Pi=FPi; + const HPi=.115,WPi=Qt(t=>Math.max(0,Math.min(1,t)),"clamp01$1"),VPi=Qt(t=>{ + const i=WPi(t); + return i*i*(3-2*i)} + ,"smooth01"); + function jPi(t,i,s){ + const e=46*(i<0?-1:1),n=Math.hypot(e,154),h=e/n,r=154/n,o={ + x:t.x-16*h,y:t.y-16*r} + ,a=WPi(s/HPi),c=n*(1-a*(.35+.65*a)),l=16*WPi((s-HPi)/.04); + return{ + x:o.x-h*c+h*l,y:o.y-r*c+r*l,angle:Math.atan2(154,e),entry:o,submerged:l,air:a} + } + function KPi(t,i){ + if(i<=0||t<0||t>=.24)return{ + push:0,flash:0} + ; + const s=t/.24,e=Math.min(3,i); + return{ + push:[0,1.4,2.1,3][e]*Math.sin(Math.PI*Math.min(1,1.6*s))*(1-s),flash:[0,.22,.32,.45][e]*(1-VPi(2*s))} + } + Qt(jPi,"harpoonDrop"),Qt(KPi,"harpoonFlinch"); + const zPi=Qt(t=>{ + const i=46*(t<0?-1:1),s=Math.hypot(i,154); + return{ + x:i/s,y:154/s} + } + ,"harpoonDir"); + function YPi(t,i){ + const s=16777215===t?16767436:6989494,e=WPi(i),n=Qt((t,i)=>t>>i&255,"ch"),h=Qt(i=>Math.round(n(t,i)+(n(s,i)-n(t,i))*e)<<i,"mix"); + return h(16)|h(8)|h(0)} + Qt(YPi,"flinchTint"); + const qPi=Qt(t=>[{ + amp:0,ms:0} + ,{ + amp:.9,ms:80} + ,{ + amp:1.5,ms:110} + ,{ + amp:2.4,ms:150} + ][Math.max(0,Math.min(3,t))],"harpoonShake"),XPi={ + wood:{ + tier:0,trail:12957073,water:12902357,accent:11589334} + ,iron:{ + tier:1,trail:11127016,water:12836341,accent:8894942} + ,mithril:{ + tier:2,trail:7922916,water:9104614,accent:12100591} + } + ,JPi=class extends Ve{ + constructor(t,i,s,e,n={ + } + ,h,r=!0){ + super(),Zt(this,"underwater",new Ve),Zt(this,"age",0),Zt(this,"released",!1),Zt(this,"entered",!1),Zt(this,"impacted",!1),Zt(this,"aim"),Zt(this,"waterPoint",{ + x:0,y:0} + ),Zt(this,"impactPoint",{ + x:0,y:0} + ),Zt(this,"impactAngle",0),Zt(this,"bodyAngle",0),Zt(this,"side"),Zt(this,"miss"),Zt(this,"power"),Zt(this,"material"),Zt(this,"spear"),Zt(this,"wetSpear"),Zt(this,"dryMask",new ip),Zt(this,"wetMask",new ip),Zt(this,"wetBody",new Ve),Zt(this,"waterBlur",new mf({ + strength:.35,quality:2} + )),Zt(this,"blood",new Ye(nPi())),Zt(this,"bloodWisp",new Ye(nPi())),Zt(this,"pinMark",(new ip).poly([-2.7,-.2,-1.1,-1.2,2.2,-.8,2.8,.3,.7,1.1,-1.8,.9]).fill({ + color:5324874,alpha:.45} + )),Zt(this,"trail",new ip),Zt(this,"bubbles",new ip),Zt(this,"surface",new Ve),Zt(this,"rings",[]),Zt(this,"contact",(new ip).ellipse(0,0,3.2,1.2).fill({ + color:14085609,alpha:.65} + )),Zt(this,"pressure"),Zt(this,"pressureEcho",new Ye(cPi())),Zt(this,"impactGlow",new Ye(oPi())),Zt(this,"result",new Ve),Zt(this,"droplets",[]),Zt(this,"crown",[]),Zt(this,"foam",(()=>{ + const t=(new ip).ellipse(0,0,8,3.2).fill({ + color:15136500,alpha:.32} + ); + for(let i=0; + i<9; + i++){ + const s=i/9*Math.PI*2+i%2*.2,e=7+i%3; + t.ellipse(Math.cos(s)*e,Math.sin(s)*e*.42,1.6+i%3*.6,.9+i%2*.4).fill({ + color:16055290,alpha:.7} + )} + return t} + )()),Zt(this,"spray",new Ve),Zt(this,"sprayBeads",[]),Zt(this,"sprayFoam",new Ye(cPi())),Zt(this,"done"),Zt(this,"finish"),this.target=e,this.feedback=n,this.viewBounds=h,this.showResult=r,this.eventMode="none",this.done=new Promise(t=>{ + this.finish=t} + ),this.miss=s<=0,this.power=this.miss?0:"perfect"===i?3:"great"===i?2:1,this.material=XPi[t],this.pressure=new Ye(0===this.material.tier?cPi():aPi()),this.side=e.missOffset<0?-1:1,this.aim={ + ...e.point} + ,this.spear=new Ye(sPi(t)),this.wetSpear=new Ye(ePi()); + for(const a of[this.spear,this.wetSpear])a.anchor.set(.96875,.5),a.scale.set(.2),a.visible=!1; + this.wetSpear.tint=this.aim.tint,this.spear.mask=this.dryMask,this.wetSpear.mask=this.wetMask,this.wetBody.addChild(this.bloodWisp,this.blood,this.wetSpear,this.wetMask,this.pinMark),this.wetBody.filters=[this.waterBlur],this.underwater.eventMode="none"; + for(const a of[this.blood,this.bloodWisp])a.anchor.set(.5),a.tint=7886174,a.visible=!1; + this.pinMark.visible=!1; + for(let a=0; + a<=this.material.tier; + a++){ + const t=new Ye(cPi()); + t.anchor.set(.5),t.tint=1===a?this.material.accent:this.material.water,this.rings.push(t),this.surface.addChild(t)} + this.surface.addChild(this.foam,this.contact),this.foam.visible=!1,this.spray.visible=!1,this.sprayFoam.anchor.set(.5),this.sprayFoam.tint=this.material.water,this.spray.addChild(this.sprayFoam),this.contact.tint=this.material.water,this.pressure.anchor.set(.5),this.pressure.tint=this.material.water,this.pressureEcho.anchor.set(.5),this.pressureEcho.tint=this.material.accent,this.impactGlow.anchor.set(.5),this.impactGlow.tint=this.material.water,this.impactGlow.blendMode="add",this.pressure.visible=this.pressureEcho.visible=this.impactGlow.visible=this.surface.visible=this.result.visible=!1; + const o=new Ye(rPi(this.miss?"miss":i)); + if(o.anchor.set(.5),o.scale.set(3===this.power?.35:.31),this.result.addChild(o),!this.miss){ + const t=new dw({ + text:`-${ + s} + `,style:{ + fontFamily:"Arial",fontSize:[0,15,18,22][this.power],fontWeight:"900",fill:3===this.power?16770202:2===this.power?14221284:16777215,stroke:{ + color:1059638,width:3,join:"round"} + } + } + ); + t.anchor.set(.5),t.y=20,this.result.addChild(t)} + this.underwater.addChild(this.impactGlow,this.wetBody,this.bubbles,this.pressure,this.pressureEcho),this.addChild(this.underwater,this.trail,this.spear,this.dryMask,this.surface,this.spray,this.result)} + destination(){ + const t=this.target.sample(); + t&&(this.aim={ + ...t} + ); + const i=this.miss?this.target.missOffset:0; + return{ + ...this.aim,x:this.aim.x-Math.sin(this.aim.angle)*i,y:this.aim.y+Math.cos(this.aim.angle)*i} + } + placeSpear(t,i,s,e,n=1,h=0){ + const r=Math.min(30,Math.max(0,e)); + for(const o of[this.spear,this.wetSpear,this.dryMask,this.wetMask])o.position.set(t,i),o.rotation=s; + this.spear.visible=r<30,this.wetSpear.visible=r>0,this.spear.alpha=n,this.wetSpear.alpha=n*WPi(this.aim.alpha),this.wetSpear.tint=this.aim.tint,this.waterBlur.strength=this.aim.blur,this.dryMask.clear().rect(-30,-5,30-r,10).fill(16777215),this.wetMask.clear().rect(-r,-5,Math.max(0,r+(h>0?-h:1)),10).fill(16777215)} + enterWater(t,i){ + this.entered=!0,this.waterPoint={ + ...t} + ,this.surface.position.copyFrom(t),this.surface.visible=!0; + const s=this.miss?6:7+this.power+2*this.material.tier; + for(let n=0; + n<s; + n++){ + const t=2.39996*n,s=(12+n%4*5)*(.8+.2*this.material.tier),e=(new ip).circle(0,0,.55+n%3*.16).fill(n%3?13953767:11131103); + this.surface.addChild(e),this.droplets.push({ + sp:e,ox:2.5*Math.cos(t),oy:Math.sin(t),vx:Math.cos(t)*s-5*Math.cos(i),vy:Math.sin(t)*s*.42,vz:26+n%4*6} + )} + const e=this.miss?7:8+3*this.power; + for(let n=0; + n<e; + n++){ + const t=n/e*Math.PI*2+.3,i=3+n%2,s=(new ip).circle(0,0,.9+n%3*.35).fill(n%4?15398901:12575976); + this.surface.addChild(s),this.crown.push({ + sp:s,ox:Math.cos(t)*i,oy:Math.sin(t)*i*.45,vx:Math.cos(t)*(14+n%3*4),vy:6*Math.sin(t),vz:(this.miss?46:52+8*this.power)*(.8+7*n%5*.08),life:.34+.03*this.power} + )} + this.foam.visible=!0} + startSpray(t){ + if(this.miss)return; + this.spray.position.copyFrom(t),this.spray.visible=!0; + const i=4+3*this.power; + for(let s=0; + s<i; + s++){ + const t=s/i*Math.PI*2+.7,e=(new ip).circle(0,0,.7+s%3*.3).fill(14939379); + this.spray.addChild(e),this.sprayBeads.push({ + sp:e,vx:Math.cos(t)*(10+4*this.power),vy:4*Math.sin(t),vz:34+9*this.power+s%3*5,life:.3} + )} + } + drawSpray(t){ + if(!this.spray.visible)return; + const i=WPi(t/(.32+.05*this.power)),s=.05+(.1+.04*this.power)*(1-(1-i)**3); + this.sprayFoam.scale.set(s,.45*s),this.sprayFoam.alpha=.55*(1-i)**1.4*WPi(this.aim.alpha/.3); + for(const e of this.sprayBeads)e.sp.position.set(e.vx*t,e.vy*t-e.vz*t+230*t*t),e.sp.alpha=.85*(1-VPi(t/e.life)); + t>.6&&(this.spray.visible=!1)} + drawWater(t){ + const i=Math.max(0,t),s=this.material.tier,e=(.22+.11*s+.018*this.power)*(this.miss?.75:1); + for(let o=0; + o<this.rings.length; + o++){ + const t=this.rings[o],n=i-.075*o,h=WPi(n/(.38+.11*s+.09*o)),r=.035+(e+.07*o)*(1-(1-h)**3); + t.visible=n>=0,t.scale.set(r,.42*r),t.alpha=(0===o?.55+.12*s:.32+.08*s)*(1-h)**1.5} + const n=(.8+.2*s)*(1+VPi(i/.08)); + this.contact.scale.set(n,.7*n),this.contact.alpha=1-WPi(i/.085); + for(const o of this.crown)o.sp.position.set(o.ox+o.vx*i,o.oy+o.vy*i-o.vz*i+300*i*i),o.sp.alpha=.9*(1-VPi(i/o.life)); + const h=WPi(i/.3),r=(this.miss?.9:1+.18*this.power)*(.6+1.1*(1-(1-h)**2)); + this.foam.scale.set(r,r),this.foam.alpha=.8*(1-h)**1.6; + for(const o of this.droplets)o.sp.position.set(o.ox+o.vx*i,o.oy+o.vy*i-o.vz*i+220*i*i),o.sp.alpha=.75*(1-VPi(i/.24)),o.sp.scale.set(1-.4*VPi(i/.24))} + advance(t){ + var i,s,e,n,h; + if(this.destroyed)return; + this.age+=Math.max(0,t); + const r=this.age-.025; + if(r<0)return; + const o=this.destination(),a=jPi(o,this.side,r); + if(this.released||(this.released=!0,null==(s=(i=this.feedback).release)||s.call(i)),!this.entered&&r>=HPi&&this.enterWater(a.entry,a.angle),this.entered&&this.drawWater(r-HPi),!this.impacted){ + this.placeSpear(a.x,a.y,a.angle,a.submerged),this.trail.clear(); + const t=this.material.tier,i=10+a.air*(16+9*t),s=Math.cos(a.angle),h=Math.sin(a.angle); + for(let e=this.entered?0:3; + e>=1; + e--){ + const n=21+i*e/3,r=21+i*(e-1)/3; + this.trail.moveTo(a.x-s*n,a.y-h*n).lineTo(a.x-s*r,a.y-h*r).stroke({ + color:this.material.trail,width:.4+.15*t+.25*(3-e),alpha:(4-e)*(.06+.035*t)} + )} + if(r<.155)return void this.drawBubbles(a,a.entry,r-HPi); + this.impacted=!0,this.impactPoint={ + x:o.x,y:o.y} + ,this.impactAngle=a.angle,this.bodyAngle=o.angle,this.trail.clear(),this.pressure.position.copyFrom(o),this.pressureEcho.position.copyFrom(o),this.impactGlow.position.copyFrom(o),this.pressure.visible=!this.miss,this.pressureEcho.visible=!this.miss&&2===this.material.tier,this.impactGlow.visible=!this.miss&&this.material.tier>0,this.pinMark.visible=this.blood.visible=this.bloodWisp.visible=!this.miss,this.result.visible=this.showResult,this.miss||this.target.hit(this.power),null==(n=(e=this.feedback).impact)||n.call(e,this.power),this.startSpray(o)} + const c=Math.max(0,r-.155),l=WPi(c/1.4),u=Math.atan2(Math.sin(o.angle-this.bodyAngle),Math.cos(o.angle-this.bodyAngle)),d=this.impactAngle+(this.miss?0:u),f=this.miss?10*VPi(c/.12):7.2+(1.2+.4*this.material.tier)*VPi((c-.04)/.04),p=this.miss?this.impactPoint:o,g=this.miss?0:Math.sin(90*Math.max(0,c-.035))*(.14-.04*this.material.tier)*Math.exp(20*-Math.max(0,c-.035)),w=(1-VPi((c-(this.miss?.14:.95))/.4))*Math.min(1,o.alpha/.15),m=d+g; + this.placeSpear(p.x+Math.cos(m)*f,p.y+Math.sin(m)*f,m,this.miss?16+16*VPi(c/.1):30,w,this.miss?0:f),this.drawWound(p,c,w),this.drawBubbles(p,this.waterPoint,c+.04),this.drawImpact(c),this.drawSpray(c),this.result.position.set(this.impactPoint.x+14,this.impactPoint.y-60-12*VPi(l)); + const v=null==(h=this.viewBounds)?void 0:h.call(this); + if(v){ + const t=Math.min(v.width/2,this.result.width/2+6); + this.result.x=Math.max(v.x+t,Math.min(v.x+v.width-t,this.result.x)),this.result.y=Math.max(v.y+22,Math.min(v.y+v.height-38,this.result.y))} + this.result.scale.set(1+.18*(1-VPi((c-.11)/.14))),this.result.alpha=VPi((c-.11)/.06)*(1-VPi((c-.7)/.35)),c>=1.4&&(this.finish(!0),this.destroy({ + children:!0} + ))} + drawImpact(t){ + const i=this.material.tier,s=WPi(this.aim.alpha/.4),e=.025+(.12+.11*i)*VPi(t/(.14+.03*i)); + this.pressure.scale.set(e,.5*e),this.pressure.alpha=(.32+.14*i)*(1-VPi(t/(.2+.07*i)))*s; + const n=WPi((t-.065)/.42),h=.03+.35*(1-(1-n)**3); + this.pressureEcho.scale.set(h,.48*h),this.pressureEcho.alpha=t<.065?0:.6*(1-n)**1.5*s; + const r=WPi(t/(2===i?.22:.1)),o=.07+.035*i+.1*r; + this.impactGlow.scale.set(o,.52*o),this.impactGlow.alpha=(2===i?.44:.18)*(1-r)**2*s} + drawWound(t,i,s){ + if(this.miss)return; + const e=WPi(this.aim.alpha/.4); + this.pinMark.position.copyFrom(t),this.pinMark.alpha=s*WPi(this.aim.alpha),this.pinMark.scale.set(1+.25*(1-VPi(i/.09))); + const n=1-VPi((i-.5)/.85),h=VPi(i/.4),r=this.impactPoint.x+.35*(t.x-this.impactPoint.x),o=this.impactPoint.y+.35*(t.y-this.impactPoint.y)-2*i; + this.blood.position.set(r,o),this.blood.rotation=.4*this.bodyAngle,this.blood.scale.set(.16+.38*h,.12+.25*h),this.blood.alpha=(.42-.14*h)*n*e,this.bloodWisp.position.set(r-this.side*(1+5*i),o-4*i),this.bloodWisp.scale.set(.13+.37*h,.08+.16*h),this.bloodWisp.alpha=.14*VPi(i/.13)*n*e} + drawBubbles(t,i,s){ + const e=this.bubbles.clear(); + if(!(s<0||s>.43))for(let n=0; + n<5; + n++){ + const h=(n+1)/6,r=.5*(1-WPi(s/.43)); + e.circle(i.x+(t.x-i.x)*h+1.4*Math.sin(2.4*n),i.y+(t.y-i.y)*h-s*(4+n),.6+n%2*.35).stroke({ + color:13234160,width:.65,alpha:r} + )} + } + get landed(){ + return this.impacted} + cancel(){ + this.destroyed||this.destroy({ + children:!0} + )} + destroy(t){ + this.destroyed||(this.finish(!1),this.underwater.destroyed||this.underwater.destroy({ + children:!0} + ),this.result.destroyed||this.result.destroy({ + children:!0} + ),this.waterBlur.blurXFilter.destroy(),this.waterBlur.blurYFilter.destroy(),this.waterBlur.destroy(),super.destroy(t??{ + children:!0} + ))} + } + ; + Qt(JPi,"FishingHarpoonFx"); + let QPi=JPi; + const ZPi=new WeakMap; + function tNi(t,i){ + const s=Math.max(0,Math.min(1,i)); + let e,n; + if(t.rig){ + const i=t.rig; + if(e=i,"geometry"in i){ + const t=i.geometry.positions,s=i.columns,e=(i.rows-1)/2; + n=Qt(i=>{ + const n=(1-i)*(s-1),h=Math.min(s-2,Math.floor(n)),r=n-h,o=2*(e*s+h); + return{ + x:t[o]+(t[o+2]-t[o])*r,y:t[o+1]+(t[o+3]-t[o+1])*r} + } + ,"point")} + else n=Qt(t=>({ + x:.5-t,y:0} + ),"point")} + else{ + if(!t.spine)return null; + { + const i=t.spine,s=i.skeleton.findSlot("body"),h=null==s?void 0:s.getAttachment(); + if(!s||!h||!("regionUVs"in h))return null; + const r=h; + let o=ZPi.get(r); + if(!o){ + o=[]; + for(let t=0; + t<r.regionUVs.length; + t+=2)Math.abs(r.regionUVs[t+1]-.5)<.001&&o.push({ + u:r.regionUVs[t],index:t} + ); + o.sort((t,i)=>t.u-i.u),ZPi.set(r,o)} + if(o.length<2)return null; + e=i; + const a=o,c=new Float32Array(4); + n=Qt(t=>{ + const i=1-t; + let e=0; + for(; + e<a.length-2&&a[e+1].u<i; + )e++; + const n=a[e],h=a[e+1],o=(i-n.u)/(h.u-n.u); + return r.computeWorldVertices(s,n.index,2,c,0,2),r.computeWorldVertices(s,h.index,2,c,2,2),{ + x:c[0]+(c[2]-c[0])*o,y:c[1]+(c[3]-c[1])*o} + } + ,"point")} + } + e.updateLocalTransform(); + const h=e.localTransform.apply(n(s)),r=e.localTransform.apply(n(Math.max(0,s-.015))),o=e.localTransform.apply(n(Math.min(1,s+.015))); + return{ + x:h.x,y:h.y,angle:Math.atan2(r.y-o.y,r.x-o.x)} + } + Qt(tNi,"sampleHarpoonBody"); + const iNi=class{ + static get(t){ + if(this.cache.has(t))return this.cache.get(t); + const i=this.build(t); + return this.cache.set(t,i),i} + static at(t,i,s){ + const e=this.get(t); + if(e){ + const t=Math.min(e.cols-1,Math.max(0,Math.floor(i/e.tile))),n=Math.min(e.rows-1,Math.max(0,Math.floor(s/e.tile))),h=e.owner[n*e.cols+t]; + if(h>=0)return h} + return this.nearest(t,i,s)} + static nearest(t,i,s){ + const e=nAi.topdownInfo(t).points; + let n=0,h=1/0; + return e.forEach((t,e)=>{ + const r=(t.x-i)**2+(t.y-s)**2; + r<h&&(h=r,n=e)} + ),n} + static build(t){ + const i=nAi.topdownInfo(t); + if("tile"!==i.type||!i.verts||!i.tile)return null; + const s=i.cols,e=i.rows,n=i.tile,h=s*e,r=s+1,o=Uint8Array.from(atob(i.verts),t=>t.charCodeAt(0)),a=Qt((t,i)=>{ + const s=i*r+t; + return o[s>>3]>>(7&s)&1} + ,"vert"),c=new Uint8Array(h); + for(let v=0; + v<e; + v++)for(let t=0; + t<s; + t++)c[v*s+t]=a(t,v)+a(t+1,v)+a(t,v+1)+a(t+1,v+1)<=2?1:0; + const l=new Int8Array(h).fill(-1),u=new Int32Array(h).fill(2147483647),d=[],f=[],p=Qt((t,i)=>{ + let s=d.length; + for(d.push(t),f.push(i); + s>0; + ){ + const i=s-1>>1; + if(d[i]<=t)break; + d[s]=d[i],f[s]=f[i],s=i} + d[s]=t,f[s]=i} + ,"push"),g=Qt(()=>{ + const t=f[0],i=d.pop(),s=f.pop(); + if(d.length){ + let t=0; + for(; + ; + ){ + const s=2*t+1,e=s+1; + let n=t,h=i; + if(s<d.length&&d[s]<h&&(n=s,h=d[s]),e<d.length&&d[e]<h&&(n=e,h=d[e]),n===t)break; + d[t]=d[n],f[t]=f[n],t=n} + d[t]=i,f[t]=s} + return t} + ,"pop"); + i.points.forEach((t,i)=>{ + const h=Math.min(e-1,Math.floor(t.y/n))*s+Math.min(s-1,Math.floor(t.x/n)); + 0!==u[h]&&(u[h]=0,l[h]=i,c[h]=1,p(0,h))} + ); + const w=[[1,0,10],[-1,0,10],[0,1,10],[0,-1,10],[1,1,14],[1,-1,14],[-1,1,14],[-1,-1,14]]; + for(; + d.length; + ){ + const t=d[0],i=g(); + if(t>u[i])continue; + const n=i%s,h=(i-n)/s; + for(const[r,o,a]of w){ + const d=n+r,f=h+o; + if(d<0||f<0||d>=s||f>=e)continue; + const g=f*s+d; + if(!c[g])continue; + if(r&&o&&!c[h*s+d]&&!c[f*s+n])continue; + const w=t+a; + w<u[g]&&(u[g]=w,l[g]=l[i],p(w,g))} + } + for(let v=0; + v<h; + v++)if(c[v]&&l[v]<0){ + const i=v%s,e=(v-i)/s; + l[v]=this.nearest(t,(i+.5)*n,(e+.5)*n)} + const m=new Uint8Array(h); + for(let v=0; + v<e; + v++)for(let t=0; + t<s; + t++){ + const i=v*s+t,n=l[i]; + n<0||(t+1<s&&l[i+1]>=0&&l[i+1]!==n||v+1<e&&l[i+s]>=0&&l[i+s]!==n)&&(m[i]=1)} + return{ + cols:s,rows:e,tile:n,owner:l,edge:m,verts:o} + } + static fine(t){ + if(t.fine)return t.fine; + const i=4*t.cols,s=4*t.rows,e=t.cols+1,n=Qt((i,s)=>{ + if(i<0||s<0||i>t.cols||s>t.rows)return 1; + const n=s*e+i; + return t.verts[n>>3]>>(7&n)&1} + ,"vert"),h=Qt((i,s)=>i<0||s<0||i>=t.cols||s>=t.rows?-1:t.owner[s*t.cols+i],"own"),r=new Int8Array(i*s).fill(-1),o=new Uint8Array(i*s),a=new Float32Array(16); + for(let c=0; + c<s; + c++)for(let t=0; + t<i; + t++){ + const s=(t+.5)/4,e=(c+.5)/4,o=Math.floor(s),l=Math.floor(e),u=s-o,d=e-l; + if((n(o,l)*(1-u)+n(o+1,l)*u)*(1-d)+(n(o,l+1)*(1-u)+n(o+1,l+1)*u)*d>.5)continue; + const f=s-.5,p=e-.5,g=Math.floor(f),w=Math.floor(p),m=f-g,v=p-w; + a.fill(0); + let _=-1,M=0; + for(const[t,i,n]of[[0,0,(1-m)*(1-v)],[1,0,m*(1-v)],[0,1,(1-m)*v],[1,1,m*v]]){ + const s=h(g+t,w+i); + s<0||(a[s]+=n,a[s]>M&&(M=a[s],_=s))} + r[c*i+t]=_>=0?_:h(Math.floor(s),Math.floor(e))} + for(let c=0; + c<s; + c++)for(let t=0; + t<i; + t++){ + const e=c*i+t,n=r[e]; + n<0||(t+1<i&&r[e+1]>=0&&r[e+1]!==n||c+1<s&&r[e+i]>=0&&r[e+i]!==n)&&(o[e]=1)} + return t.fine={ + owner:r,edge:o} + } + static paint(t,i,s,e,n,h=!0){ + const r=this.fine(i),o=4*i.cols,a=4*i.rows; + t.width===o&&t.height===a||(t.width=o,t.height=a); + const c=t.getContext("2d"),l=c.createImageData(o,a),u=l.data,d=n>>16&255,f=n>>8&255,p=255&n,g=new Uint8Array(32); + for(let w=0; + w<g.length; + w++)g[w]=s(w)?1:0; + for(let w=0; + w<r.owner.length; + w++){ + const t=r.owner[w]; + if(t<0||!g[t])continue; + const i=t===e,s=4*w; + h&&1===r.edge[w]?(u[s]=i?d:255,u[s+1]=i?f:255,u[s+2]=i?p:255,u[s+3]=i?235:150):(u[s]=255,u[s+1]=255,u[s+2]=i?236:255,u[s+3]=i?46:22)} + c.putImageData(l,0,0)} + } + ; + Qt(iNi,"FishingTerritory"),Zt(iNi,"cache",new Map); + let sNi=iNi; + const eNi=32,nNi=class{ + constructor(t,i,s){ + Zt(this,"cols"),Zt(this,"rows"),Zt(this,"open"),Zt(this,"g"),Zt(this,"came"),Zt(this,"seen"),Zt(this,"shut"),Zt(this,"stamp",0),this.isLand=s,this.cols=Math.ceil(t/eNi),this.rows=Math.ceil(i/eNi); + const e=this.cols*this.rows; + this.open=new Uint8Array(e); + for(let n=0; + n<this.rows; + n++)for(let t=0; + t<this.cols; + t++){ + const i=(t+.5)*eNi,e=(n+.5)*eNi; + this.open[n*this.cols+t]=s(i,e)||s(i-12,e)||s(i+12,e)||s(i,e-12)||s(i,e+12)?0:1} + this.g=new Float32Array(e),this.came=new Int32Array(e),this.seen=new Uint32Array(e),this.shut=new Uint32Array(e)} + nearestOpen(t,i,s=12){ + const e=Math.min(this.cols-1,Math.max(0,Math.floor(t/eNi))),n=Math.min(this.rows-1,Math.max(0,Math.floor(i/eNi))); + if(this.open[n*this.cols+e])return n*this.cols+e; + let h=-1,r=1/0; + for(let o=1; + o<=s&&h<0; + o++)for(let s=n-o; + s<=n+o; + s++)for(let a=e-o; + a<=e+o; + a++){ + if(Math.max(Math.abs(s-n),Math.abs(a-e))!==o||a<0||s<0||a>=this.cols||s>=this.rows)continue; + const c=s*this.cols+a; + if(!this.open[c])continue; + const l=((a+.5)*eNi-t)**2+((s+.5)*eNi-i)**2; + l<r&&(r=l,h=c)} + return h} + center(t){ + const i=t%this.cols; + return{ + x:(i+.5)*eNi,y:((t-i)/this.cols+.5)*eNi} + } + lineOpen(t,i,s,e){ + const n=Math.hypot(s-t,e-i),h=Math.max(1,Math.ceil(n/8)); + for(let r=0; + r<=h; + r++){ + const n=t+(s-t)*r/h,o=i+(e-i)*r/h,a=Math.floor(n/eNi),c=Math.floor(o/eNi); + if(a<0||c<0||a>=this.cols||c>=this.rows||!this.open[c*this.cols+a])return!1} + return!0} + find(t,i,s,e){ + const n=this.nearestOpen(t,i),h=this.nearestOpen(s,e); + if(n<0||h<0)return null; + const r=h===Math.floor(e/eNi)*this.cols+Math.floor(s/eNi)?{ + x:s,y:e} + :this.center(h),o=n===Math.floor(i/eNi)*this.cols+Math.floor(t/eNi); + if(o&&this.lineOpen(t,i,r.x,r.y))return[r]; + const a=++this.stamp,c=this.cols,l=this.rows,u=h%c,d=(h-u)/c,f=[],p=[],g=Qt((t,i)=>{ + let s=f.length; + for(f.push(t),p.push(i); + s>0; + ){ + const i=s-1>>1; + if(f[i]<=t)break; + f[s]=f[i],p[s]=p[i],s=i} + f[s]=t,p[s]=i} + ,"push"),w=Qt(()=>{ + const t=p[0],i=f.pop(),s=p.pop(); + if(f.length){ + let t=0; + for(; + ; + ){ + const s=2*t+1,e=s+1; + let n=t,h=i; + if(s<f.length&&f[s]<h&&(n=s,h=f[s]),e<f.length&&f[e]<h&&(n=e,h=f[e]),n===t)break; + f[t]=f[n],p[t]=p[n],t=n} + f[t]=i,p[t]=s} + return t} + ,"pop"),m=Qt(t=>{ + const i=t%c,s=(t-i)/c,e=Math.abs(i-u),n=Math.abs(s-d); + return 10*(e+n)-6*Math.min(e,n)} + ,"h"); + this.g[n]=0,this.came[n]=-1,this.seen[n]=a,g(m(n),n); + let v=!1; + const _=[[1,0,10],[-1,0,10],[0,1,10],[0,-1,10],[1,1,14],[1,-1,14],[-1,1,14],[-1,-1,14]]; + for(; + f.length; + ){ + const t=w(); + if(this.shut[t]===a)continue; + if(this.shut[t]=a,t===h){ + v=!0; + break} + const i=t%c,s=(t-i)/c,e=this.g[t]; + for(const[n,h,r]of _){ + const o=i+n,u=s+h; + if(o<0||u<0||o>=c||u>=l)continue; + const d=u*c+o; + if(!this.open[d]||this.shut[d]===a)continue; + if(n&&h&&(!this.open[s*c+o]||!this.open[u*c+i]))continue; + const f=e+r; + this.seen[d]===a&&f>=this.g[d]||(this.seen[d]=a,this.g[d]=f,this.came[d]=t,g(f+m(d),d))} + } + if(!v)return null; + const M=[]; + for(let A=h; + -1!==A&&A!==n; + A=this.came[A])M.push(this.center(A)); + M.reverse(),M[M.length-1]=r; + const b=[]; + let y=o?{ + x:t,y:i} + :this.center(n),E=-1; + for(o||b.push(y); + E<M.length-1; + ){ + let t=M.length-1; + for(; + t>E+1&&!this.lineOpen(y.x,y.y,M[t].x,M[t].y); + )t--; + b.push(M[t]),y=M[t],E=t} + return b} + } + ; + Qt(nNi,"FishingPath"); + let hNi=nNi; + const rNi=Qt(t=>Math.max(0,Math.min(1,t)),"clamp01"); + function oNi(t,i,s){ + const e=rNi((s-t)/(i-t)); + return e*e*(3-2*e)} + function aNi(t,i){ + return.38+.62*oNi(.12,.88,.5+.5*Math.sin(.19*t+i))} + function cNi(t){ + return t+.18*Math.sin(t)} + function lNi(t,i,s,e,n,h){ + const r=t-.5,o=(i-.5)*s,a=Math.sign(o),c=Math.max(0,Math.abs(o)-.07),l=oNi(.07,.49*s,Math.abs(o)),u=oNi(.9,.4,t),d=cNi(e)-.85*l-.65*u,f=(.18+.56*n)*Math.sin(d)*Math.pow(l,.65)+a*h*.13*l,p=c*Math.sin(f),g=oNi(.34,.02,t); + return{ + x:r-.16*p+l*l*.016*Math.sin(d-.5),y:a*(Math.min(Math.abs(o),.07)+c*Math.cos(f))+g*g*.012*Math.sin(.62*e-3.5*(1-t))} + } + function uNi(t,i,s){ + const e=oNi(.38,1,t); + return.042*(.55+.45*s)*e*e*Math.sin(cNi(i)-3.2*t)} + function dNi(t,i){ + const s=cNi(t); + return{ + pitch:(.14+.22*i)*Math.sin(s),yaw:.32*i*Math.sin(s-.6)} + } + Qt(oNi,"smoothRange"),Qt(aNi,"swimEffort"),Qt(cNi,"strokePhase"),Qt(lNi,"mantaVertex"),Qt(uNi,"sharkTail"),Qt(dNi,"whaleStroke"); + const fNi={ + catfish:{ + k:5.7,slip:.55} + ,eel:{ + k:9,slip:.7} + ,megalodon:{ + k:3.2,slip:.32} + ,whaleShark:{ + k:3.2,slip:.38} + ,sturgeon:{ + k:4.6,slip:.5} + } + ; + function pNi(t,i,s){ + const e=fNi[t]; + return e?e.k*i/(e.slip*s):null} + function gNi(t,i){ + return"manta"===t||"turtle"===t?0:"catfish"===t?oNi(.12,.6,i):"eel"===t?1:oNi(.38,.9,i)} + function wNi(t,i,s,e,n=!1){ + const h=oNi(0,.68,(t/(2*Math.PI)%1+1)%1)*Math.PI*2,r=.55+.45*i; + return{ + sweep:e*(n?.08:.31)*r*Math.sin(h)+s*(n?.12:.07),span:Math.cos((n?.16:.7)*r*Math.sin(h))*(1-e*s*.025)} + } + function mNi(t,i,s){ + return(.006+.06*Math.pow(oNi(.12,1,t),1.5))*(.45+.55*s)*Math.sin(i-t*fNi.catfish.k)} + function vNi(t,i,s){ + const e=.12*s+.035*Math.sin(i-2.7),n=.32+1.3*Math.abs(Math.sin(e)); + return 1-oNi(.18,.1,t)*(1-n)} + function _Ni(t,i,s){ + return(.02+.028*t)*(.7+.3*s)*Math.sin(i-t*fNi.eel.k)} + Qt(pNi,"bodyPhaseRate"),Qt(gNi,"bodyFlex"),Qt(wNi,"turtleFlipperPose"),Qt(mNi,"catfishSway"),Qt(vNi,"catfishTailProjection"),Qt(_Ni,"eelSway"); + const MNi=-.02,bNi=[[0,0],[.05,.02],[.1,.021],[.14,.018],[.2,.026],[.34,.037],[.5,.05],[.64,.062],[.76,.072],[.86,.079],[.92,.08],[.955,.073],[.98,.058],[.995,.035],[1,0]]; + function yNi(t){ + if(t<=0||t>=1)return 0; + for(let i=1; + i<bNi.length; + i++){ + const[s,e]=bNi[i]; + if(t<=s){ + const[n,h]=bNi[i-1]; + return h+(e-h)*(t-n)/(s-n)} + } + return 0} + function ENi(t,i,s,e,n){ + const h=Math.abs(i),r=i<0?-1:1,o=yNi(t); + if(t<.6||h<=o+.004)return{ + x:0,y:0} + ; + const a=Qt((s,e,n)=>{ + const h=Math.cos(n),r=Math.sin(n),o=t-s,a=i-e; + return{ + x:s+o*h-a*r-t,y:e+o*r+a*h-i} + } + ,"turn"),c=.05*r,l=Math.hypot(t-.985,i-c),u=.072*r,d=Math.hypot(t-.84,i-u),f=oNi(.72,.82,t)*oNi(o+.004,o+.12,h),p=(1-oNi(.06,.1,d))*oNi(o+.004,o+.05,h)*(1-f),g=(r*(.08*Math.sin(.8*s+1.3-7*l)+.06*e)-.14*n)*oNi(0,.06,l),w=r*(.16*Math.sin(.6*s+(r>0?0:.9))+.06*e)*oNi(0,.04,d),m=a(.985,c,g),v=a(.84,u,w); + return{ + x:m.x*f+v.x*p,y:m.y*f+v.y*p} + } + Qt(yNi,"catfishHalf"),Qt(ENi,"catfishAppendage"); + const ANi={ + manta:[33,33],catfish:[49,17],eel:[65,5]} + ,SNi=class extends Wy{ + constructor(t,i){ + const[s,e]=ANi[t]; + super({ + texture:i,verticesX:s,verticesY:e} + ),Zt(this,"columns"),Zt(this,"rows"),Zt(this,"aspect"),this.kind=t,this.autoResize=!1,this.columns=s,this.rows=e,this.aspect=i.height/i.width,this.eventMode="none"} + pose(t,i,s,e,n){ + const h=this.geometry.positions; + if("manta"===this.kind){ + const r=n(.5*t),o=Math.cos(r.a),a=Math.sin(r.a); + for(let n=0; + n<this.rows; + n++)for(let c=0; + c<this.columns; + c++){ + const l=lNi(c/(this.columns-1),n/(this.rows-1),this.aspect,i,s,e),u=2*(n*this.columns+c); + h[u]=r.x+(o*l.x-a*l.y)*t,h[u+1]=r.y+(a*l.x+o*l.y)*t} + } + else{ + const r="catfish"===this.kind?mNi:_Ni,o=1.05; + for(let a=0; + a<this.columns; + a++){ + const c=a/(this.columns-1),l=1-c,u=n(l*t),d=r(l,i,s)*t,f=(r(l+.002,i,s)-r(l-.002,i,s))/.004,p=u.a-Math.atan(f),g=Math.cos(p),w=Math.sin(p),m="catfish"===this.kind?vNi(MNi+c*o,i,e):1; + for(let n=0; + n<this.rows; + n++){ + const r=(n/(this.rows-1)-.5)*this.aspect; + let l=0,f=r*t; + if("catfish"===this.kind){ + const n=ENi(MNi+c*o,r*o,i,s,e); + l=n.x/o*t,f=(r+n.y/o)*t} + f*=m; + const p=2*(n*this.columns+a); + h[p]=u.x-Math.sin(u.a)*d+g*l-w*f,h[p+1]=u.y+Math.cos(u.a)*d+w*l+g*f} + } + } + this.geometry.getBuffer("aPosition").update()} + destroy(t){ + const i=this.geometry; + super.destroy(t),i.destroy()} + } + ; + Qt(SNi,"FishingGiantRig"); + let TNi=SNi; + function CNi(t){ + const i=Array.from({ + length:9} + ,(i,s)=>t.skeleton.findBone(`b${ + s} + `)),s=t.skeleton.findBone("fluke"),e=t.skeleton.findBone("finL"),n=t.skeleton.findBone("finR"); + return(t,h,r,o)=>{ + const a=dNi(h,r); + i.forEach((i,s)=>{ + if(!i)return; + const e=oNi(3,8,s),n=a.pitch*e; + i.rotation=i.data.rotation+(t[s]??0)+a.yaw*e*.3,i.x=i.data.x*Math.cos(n),i.y=i.data.y} + ),s&&(s.scaleX=s.data.scaleX*Math.cos(a.pitch+.12*Math.sin(h-.7)),s.scaleY=s.data.scaleY,s.rotation=s.data.rotation+a.yaw),[e,n].forEach((t,i)=>{ + if(!t)return; + const s=0===i?1:-1,e=.12*Math.sin(.5*h+.25*i+.7)+s*o*.16; + t.rotation=t.data.rotation+s*(2*Math.sin(.5*h+.7)+o*s*4),t.scaleX=t.data.scaleX*Math.cos(e),t.scaleY=t.data.scaleY} + )} + } + Qt(CNi,"whalePoser"); + const ONi={ + R:{ + amplitude:.8,drift:.8,current:3.2} + ,C:{ + amplitude:1.3,drift:1.25,current:1.25} + ,O:{ + amplitude:1.85,drift:1.7,current:.55} + } + ,INi=.83205,kNi=.5547,RNi=[{ + x:.83205,y:.5547,k:2*Math.PI/290,w:2*Math.PI/9.6,a:.64,phase:0} + ,{ + x:.36,y:.93295,k:2*Math.PI/190,w:2*Math.PI/6.7,a:.25,phase:1.7} + ,{ + x:-.62,y:.7846,k:2*Math.PI/410,w:2*Math.PI/14.3,a:.11,phase:3.1} + ],xNi=Qt((t,i,s)=>Math.max(i,Math.min(s,t)),"clamp$2"); + function PNi(t,i,s){ + const e=xNi((s-t)/(i-t),0,1); + return e*e*(3-2*e)} + function NNi(t,i,s,e){ + let n=0,h=0,r=0,o=0,a=0,c=0; + const l=ONi[e]; + for(const u of RNi){ + const e=(t*u.x+i*u.y)*u.k-s*u.w+u.phase,d=Math.sin(e),f=Math.cos(e),p=u.a*l.amplitude; + n+=p*d,h-=p*u.w*f,r+=p*u.k*f*u.x,o+=p*u.k*f*u.y,a+=u.x*u.a*f*l.drift,c+=u.y*u.a*f*l.drift} + return{ + height:n,velocity:h,slopeX:r,slopeY:o,driftX:a,driftY:c} + } + function LNi(t,i,s,e,n=1/0){ + const h=NNi(t,i,s,e),r=Math.max(0,n),o=Number.isFinite(r)?Math.sin(r*Math.PI*2/.95)*Math.exp(1.8*-r):0; + return{ + x:t+.65*h.driftX,y:i+.65*h.driftY-.95*h.height+1.4*o,rotation:xNi(2.8*h.slopeX+.65*h.slopeY+.1*o,-.14,.14),height:h.height} + } + function DNi(t,i=1){ + return{ + halfLength:(17.2+.9*Math.min(5,t))*i,halfWidth:(0===t?9:8.4+.65*Math.min(5,t))*i} + } + function GNi(t,i,s,e,n,h,r,o=1){ + const a=xNi(h,0,5),c=1-.055*a,l=DNi(a,o),u=NNi(t,i,e,n),d=1-PNi(4,85,r),f=Math.cos(s),p=Math.sin(s); + let g=0,w=0,m=0,v=0,_=0,M=0; + for(const A of RNi){ + const s=A.x*f+A.y*p,h=A.y*f-A.x*p,o=(t*A.x+i*A.y)*A.k-e*A.w+A.phase,u=A.w-Math.max(0,r)*A.k*s,d=u*(.42+.09*a),b=u*(.72+.13*a),y=A.a*ONi[n].amplitude*c,E=y/Math.hypot(1,d),S=y/Math.hypot(1,b),T=o+Math.atan(d),C=o+Math.atan(b); + g+=E*Math.sin(T),w-=E*u*Math.cos(T); + const O=Math.sin(A.k*h*l.halfWidth)/l.halfWidth*S*3.15,I=Math.sin(A.k*s*l.halfLength)/l.halfLength*S*2.25; + m+=O*Math.cos(C),v+=I*Math.cos(C),_+=O*u*Math.sin(C),M+=I*u*Math.sin(C)} + const b=m*(.24+.34*d)+v*d*.1,y=t+u.driftX*c*(.3+.7*d),E=i+u.driftY*c*(.3+.7*d); + return{ + x:y+3*m,y:E-1.25*g+2*v,waterX:y,waterY:E,rotation:s+Math.PI/2+b,scaleX:Math.cos(m),scaleY:Math.cos(v),skew:.6*m,height:g,roll:m,pitch:v,velocity:w,rollVelocity:_,pitchVelocity:M} + } + Qt(PNi,"smoothWater"),Qt(NNi,"sampleWater"),Qt(LNi,"bobberFloatPose"),Qt(DNi,"hullSize"),Qt(GNi,"boatFloatPose"); + const BNi={ + full:{ + points:220,foam:96,ripples:6,spacing:4} + ,nearby:{ + points:56,foam:12,ripples:4,spacing:8} + } + ; + function UNi(t,i){ + const s=DNi(t.level,t.hullScale),e=Math.max(0,-t.velocity-i*s.halfWidth*(t.rollVelocity??0)+Math.abs(t.pitchVelocity??0)*s.halfLength*.25),n=Math.max(0,-i*(t.roll??0)*8); + return Math.min(1.6,.7*e+.55*n+.035*ONi[t.zone].current)} + Qt(UNi,"hullWaterPressure"); + const FNi=class{ + constructor(t="full",i=719){ + Zt(this,"points",[]),Zt(this,"foam",[]),Zt(this,"ripples",[]),Zt(this,"last",null),Zt(this,"group",0),Zt(this,"distance",0),Zt(this,"bubbles",0),Zt(this,"contact",[0,0]),Zt(this,"threshold",[1,1]),Zt(this,"anchor",null),this.detail=t,this.seed=i,this.reset()} + random(){ + return this.seed=Math.imul(this.seed,1664525)+1013904223>>>0,this.seed/4294967296} + reset(){ + this.points=[],this.foam=[],this.ripples=[],this.last=null,this.bubbles=this.distance=0,this.group++,this.anchor=null,this.contact=[.7*this.random(),.7*this.random()],this.threshold=[.8+.4*this.random(),.8+.4*this.random()]} + update(t,i){ + const{ + x:s,y:e,heading:n,speed:h,level:r,zone:o} + =i; + (t>.5||this.anchor&&Math.hypot(s-this.anchor.x,e-this.anchor.y)>80)&&(this.reset(),t=0),t=Math.max(0,t),this.anchor={ + x:s,y:e} + ; + const a=BNi[this.detail],c="nearby"===this.detail,l=ONi[o].current,u=INi*l,d=kNi*l; + for(const _ of this.points)_.age+=t,_.x+=u*t*.35,_.y+=d*t*.35; + this.points=this.points.filter(t=>t.age<4.8); + for(const _ of this.foam){ + _.age+=t; + const i=Math.exp(-1.25*t),s=(1-i)/1.25; + _.x+=u*t+_.vx*s,_.y+=d*t+_.vy*s,_.vx*=i,_.vy*=i} + this.foam=this.foam.filter(t=>t.age<t.life); + for(const _ of this.ripples)_.age+=t,_.x+=u*t*.55,_.y+=d*t*.55; + this.ripples=this.ripples.filter(t=>t.age<t.life); + const f=PNi(3,150,h),p=Math.cos(n),g=Math.sin(n),w=DNi(r,i.hullScale),m={ + x:s-p*w.halfLength*.83,y:e-g*w.halfLength*.83} + ; + if(h>4){ + this.last||(this.last=m,this.group++); + let i=Math.hypot(m.x-this.last.x,m.y-this.last.y); + for(; + i>=a.spacing; + ){ + const t=a.spacing/i; + this.last={ + x:this.last.x+(m.x-this.last.x)*t,y:this.last.y+(m.y-this.last.y)*t} + ,this.distance+=a.spacing,this.points.push({ + ...this.last,nx:-g,ny:p,age:0,power:f,distance:this.distance,group:this.group} + ),i-=a.spacing} + for(this.bubbles+=t*(3+20*f)*PNi(3,18,h)*(c?.3:1); + this.bubbles>=1; + ){ + this.bubbles--; + const t=this.random()<.5?-1:1,i=this.random()<.72,n=i?w.halfLength*(.3+.3*this.random()):.8*-w.halfLength,h=t*w.halfWidth*(i?.95:.45); + this.foam.push({ + x:s+p*n-g*h,y:e+g*n+p*h,vx:-p*(6+12*f)-g*t*(2+4*f),vy:-g*(6+12*f)+p*t*(2+4*f),age:0,life:1.5+1.5*this.random(),size:2.1+this.random()*(1.5+2.5*f),alpha:.18+.22*f,rotation:this.random()*Math.PI*2,frame:Math.floor(8*this.random())} + )} + } + else this.last=null,this.bubbles=0; + const v=1-PNi(8,55,h); + for(let _=0; + _<2; + _++){ + const h=0===_?1:-1,r=UNi(i,h); + if(this.contact[_]+=t*(.13+.46*r)*v,this.contact[_]<this.threshold[_])continue; + this.contact[_]-=this.threshold[_],this.threshold[_]=.8+.4*this.random(); + const o=xNi(5*-(i.pitchVelocity??0),-.3,.3)*w.halfLength; + this.ripples.push({ + x:s+p*o,y:e+g*o,age:0,life:3.5+1.1*this.random(),rotation:n+Math.PI/2,start:(1===h?0:Math.PI)-.9+.3*(this.random()-.5),span:1.5+.45*this.random(),spread:4.5+1.4*r,seed:this.random()*Math.PI*2,width:w.halfWidth+.6,length:w.halfLength,alpha:.23+.08*r} + )} + this.points.length>a.points&&this.points.splice(0,this.points.length-a.points),this.foam.length>a.foam&&this.foam.splice(0,this.foam.length-a.foam),this.ripples.length>a.ripples&&this.ripples.splice(0,this.ripples.length-a.ripples)} + } + ; + Qt(FNi,"BoatWaterModel"); + let $Ni=FNi; + const HNi=class t extends Ve{ + constructor(t="full",i=719){ + super(),Zt(this,"model"),Zt(this,"surface",new ip),Zt(this,"trail",new ip),Zt(this,"contact",new ip),Zt(this,"bubbles",new Ve),Zt(this,"crests",new Ve),Zt(this,"waterlines",new Ve),Zt(this,"pool",[]),Zt(this,"crestPool",[]),Zt(this,"waterlinePool",[]),Zt(this,"renderElapsed",1),this.detail=t,this.model=new $Ni(t,i),this.eventMode="none",this.addChild(this.surface,this.trail,this.crests,this.contact,this.waterlines,this.bubbles)} + static crestTexture(t){ + if(this.crestTextures[t])return this.crestTextures[t]; + const i=document.createElement("canvas"); + i.width=i.height=128; + const s=i.getContext("2d"),e=1.5+.15*t; + s.lineCap="round"; + for(let h=0; + h<48; + h++){ + const i=(h+.5)/48,n=Math.sin(i*Math.PI)**.8; + for(const[r,o,a]of[[1.7,4.5,`rgba(11,71,94,${ + .38*n} + )`],[0,2.8,`rgba(224,245,239,${ + n} + )`]]){ + const i=Qt(i=>{ + const s=-e/2+i/48*e,n=44+.7*Math.sin(4*s+1.9*t)+r; + return[64+Math.cos(s)*n,64+Math.sin(s)*n]} + ,"at"),n=i(h),c=i(h+1); + s.beginPath(),s.moveTo(n[0],n[1]),s.lineTo(c[0],c[1]),s.lineWidth=o,s.strokeStyle=a,s.stroke()} + } + const n=as.from(i); + return n.source.scaleMode="linear",this.crestTextures[t]=n} + reset(){ + this.model.reset(),this.surface.clear(),this.trail.clear(),this.contact.clear(),this.renderElapsed=1,this.pool.forEach(t=>t.visible=!1),this.crestPool.forEach(t=>t.visible=!1),this.waterlinePool.forEach(t=>t.visible=!1)} + update(t,i,s,e=()=>!0){ + if(this.model.update(t,i),this.renderElapsed+=t,"nearby"===this.detail&&this.renderElapsed<1/30)return; + this.renderElapsed%=1/30,"full"===this.detail&&this.drawSurface(i,e),this.drawTrail(s.wake),this.drawContact(i,e),this.drawRipples(e); + let n=0; + for(const h of this.model.foam){ + if(!e(h.x,h.y))continue; + let t=this.pool[n]; + t||(t=new Ye(s.puffs[h.frame]),t.anchor.set(.5),this.pool.push(t),this.bubbles.addChild(t)); + const i=h.age/h.life; + t.texture=s.puffs[h.frame],t.visible=!0,t.position.set(h.x,h.y),t.rotation=h.rotation+.12*i,t.width=h.size*(1+1.1*i),t.height=h.size*(.72+.85*i),t.alpha=h.alpha*PNi(0,.12,i)*Math.pow(1-i,1.6),t.tint=14873839,n++} + for(let h=n; + h<this.pool.length; + h++)this.pool[h].visible=!1} + drawSurface(t,i){ + const s=this.surface.clear(),{ + x:e,y:n,time:h,zone:r} + =t,o=ONi[r].amplitude; + for(let a=-3; + a<=3; + a++)for(let t=-3; + t<=3; + t++){ + const c=Math.floor(e/55)+t,l=Math.floor(n/55)+a,u=((Math.imul(c,374761393)^Math.imul(l,668265263))>>>0)/4294967296,d=55*c+15*Math.sin(51*u),f=55*l+15*Math.cos(37*u),p=Math.hypot(d-e,f-n); + if(p>170||!i(d,f))continue; + const g=NNi(d,f,h,r),w=.06*PNi(.15,.8,g.height/o)*(1-PNi(85,170,p)); + if(w<.003)continue; + const m=-.5547,v=INi,_=6+10*u,M=d+g.driftX,b=f+g.driftY; + s.moveTo(M-m*_,b-v*_).quadraticCurveTo(M-1.6641,b-1.1094,M+m*_,b+v*_).stroke({ + color:13823720,width:.8,alpha:w,cap:"round"} + ),s.moveTo(M-m*_+1.3,b-v*_+1.3).quadraticCurveTo(M-1.6641+1.3,b-1.1094+1.3,M+m*_+1.3,b+v*_+1.3).stroke({ + color:739166,width:1.8,alpha:.45*w,cap:"round"} + )} + } + drawTrail(t){ + const i=this.trail.clear(),s=this.model.points; + for(let e=1; + e<s.length; + e++){ + const n=s[e-1],h=s[e],r=Math.hypot(h.x-n.x,h.y-n.y); + if(n.group!==h.group||r>20||r<.1||n.nx*h.nx+n.ny*h.ny<.8)continue; + const o=n.age/4.8,a=h.age/4.8,c=Math.pow(Math.max(0,1-.5*(o+a)),1.8),l=.5*(n.power+h.power),u=6+n.age*(5+9*n.power),d=6+h.age*(5+9*h.power); + for(const t of[-1,1]){ + const s=n.x+n.nx*u*t,e=n.y+n.ny*u*t,r=h.x+h.nx*d*t,o=h.y+h.ny*d*t; + i.moveTo(s,e+1).lineTo(r,o+1).stroke({ + color:671828,width:2,alpha:c*l*.035} + ),i.moveTo(s,e).lineTo(r,o).stroke({ + color:14349294,width:.7+.3*l,alpha:c*l*.2} + )} + const f=3+n.age*(1.5+n.power),p=3+h.age*(1.5+h.power),g=.5*(f+p),w=(h.x-n.x)/r,m=(h.y-n.y)/r,v=-m,_=w; + if("nearby"===this.detail)continue; + const M=100,b=n.distance%M,y=new Si(w*M/t.width,m*M/t.width,v*g*2/t.height,_*g*2/t.height,n.x-v*g-w*b,n.y-_*g-m*b); + i.poly([n.x+v*f,n.y+_*f,h.x+v*p,h.y+_*p,h.x-v*p,h.y-_*p,n.x-v*f,n.y-_*f]).fill({ + texture:t,matrix:y,textureSpace:"global",alpha:c*(.1+.28*l)} + )} + } + drawContact(i,s){ + const e=this.contact.clear(),n=DNi(i.level,i.hullScale),h=PNi(3,150,i.speed),r=PNi(2,18,i.speed),o=Math.cos(i.heading),a=Math.sin(i.heading),c=Qt((t,s)=>({ + x:i.x+o*t-a*s,y:i.y+a*t+o*s} + ),"point"); + this.waterlinePool.forEach(t=>t.visible=!1); + for(const l of[-1,1]){ + const o=UNi(i,l),a=c(.5*n.halfLength,l*n.halfWidth*.82),u=c(.1*-n.halfLength,l*(n.halfWidth+1)),d=c(.68*-n.halfLength,l*n.halfWidth*.8); + if(!s(a.x,a.y)||!s(d.x,d.y))continue; + const f=(.065+.14*o)*(1-.35*r); + if("nearby"===this.detail){ + const s=-1===l?0:1; + let e=this.waterlinePool[s]; + e||(e=new Ye(t.crestTexture(1)),e.anchor.set(.5),this.waterlinePool[s]=e,this.waterlines.addChild(e)),e.visible=!0,e.position.set(i.x,i.y),e.rotation=i.heading+Math.PI/2,e.scale.set(l*(n.halfWidth+.5)/44,.82*n.halfLength/44),e.alpha=f} + else e.moveTo(a.x+.6,a.y+.8).quadraticCurveTo(u.x+.6,u.y+.8,d.x+.6,d.y+.8).stroke({ + color:737362,width:2.2,alpha:.45*f,cap:"round"} + ),e.moveTo(a.x,a.y).quadraticCurveTo(u.x,u.y,d.x,d.y).stroke({ + color:13954792,width:2,alpha:.2*f,cap:"round"} + ),e.moveTo(a.x,a.y).quadraticCurveTo(u.x,u.y,d.x,d.y).stroke({ + color:15005678,width:.7,alpha:f,cap:"round"} + ); + if(r>0){ + const t=c(n.halfLength+.5,l*(0===i.level?.55*n.halfWidth:.8)),s=c(.62*n.halfLength,l*(n.halfWidth+2+2*h)),o=c(.55*-n.halfLength,l*(n.halfWidth+5+5*h)); + e.moveTo(t.x,t.y).quadraticCurveTo(s.x,s.y,o.x,o.y).stroke({ + color:12379363,width:3+1.5*h,alpha:r*(.025+.025*h),cap:"round"} + ),e.moveTo(t.x,t.y).quadraticCurveTo(s.x,s.y,o.x,o.y).stroke({ + color:15399410,width:.9+.65*h,alpha:r*(.16+.22*h),cap:"round"} + )} + } + } + drawRipples(i){ + let s=0; + for(const e of this.model.ripples){ + const n=e.age/e.life,h=e.age*e.spread/(1+.08*e.age),r=e.alpha*PNi(0,.1,n)*Math.pow(1-n,1.65),o=Math.cos(e.rotation),a=Math.sin(e.rotation),c=e.width+h,l=e.length+.82*h,u=Math.cos(e.start+e.span/2)>0?1:-1; + let d=!0; + for(const t of[-.9,0,.9]){ + const s=Math.cos(t)*c*u,n=Math.sin(t)*l; + if(!i(e.x+o*s-a*n,e.y+a*s+o*n)){ + d=!1; + break} + } + if(!d)continue; + const f=t.crestTexture(Math.min(3,Math.floor(e.seed/(2*Math.PI)*4))); + let p=this.crestPool[s]; + p||(p=new Ye(f),p.anchor.set(.5),this.crestPool.push(p),this.crests.addChild(p)),p.texture=f,p.visible=!0,p.position.set(e.x,e.y),p.rotation=e.rotation,p.scale.set(u*c/44,l/44),p.alpha=r,s++} + for(let t=s; + t<this.crestPool.length; + t++)this.crestPool[t].visible=!1} + } + ; + Qt(HNi,"FishingBoatWater"),Zt(HNi,"crestTextures",[]); + let WNi=HNi; + const VNi={ + fish:[[0,.001],[.06,.003],[.16,.006],[.23,.013],[.34,.032],[.48,.061],[.64,.078],[.76,.073],[.86,.057],[.94,.038],[.98,.021],[1,.002]],shark:[[0,.001],[.06,.003],[.13,.006],[.2,.014],[.32,.033],[.46,.058],[.6,.077],[.72,.077],[.83,.063],[.94,.036],[.98,.018],[1,.002]],megalodon:[[0,.001],[.07,.004],[.15,.009],[.24,.023],[.38,.051],[.53,.078],[.67,.089],[.78,.083],[.88,.064],[.96,.033],[1,.002]],whaleShark:[[0,.001],[.07,.004],[.16,.009],[.28,.027],[.43,.054],[.6,.078],[.77,.09],[.89,.094],[.96,.079],[.99,.05],[1,.012]],sturgeon:[[0,.001],[.06,.003],[.15,.007],[.27,.019],[.43,.044],[.59,.066],[.72,.07],[.81,.056],[.88,.035],[.96,.012],[1,.001]]} + ,jNi={ + fish:[[.48,0],[.53,.062],[.565,.104],[.59,.102],[.63,.077],[.71,.045]],shark:[[.46,0],[.49,.06],[.52,.174],[.535,.186],[.555,.16],[.6,.114],[.66,.081],[.71,.055]],megalodon:[[.43,0],[.48,.06],[.52,.172],[.54,.182],[.565,.155],[.63,.106],[.71,.078]],whaleShark:[[.42,0],[.47,.06],[.5,.183],[.525,.202],[.56,.179],[.63,.12],[.74,.076]],sturgeon:[[.51,0],[.55,.08],[.58,.142],[.605,.155],[.635,.14],[.7,.09],[.77,.06]]} + ,KNi={ + fish:[[.3,0],[.35,.041],[.39,.047],[.44,.03]],shark:[[.27,0],[.305,.049],[.325,.06],[.355,.051],[.41,.036]],megalodon:[[.26,0],[.295,.055],[.32,.063],[.36,.05],[.43,.032]],whaleShark:[[.23,0],[.28,.055],[.3,.071],[.34,.062],[.41,.03]],sturgeon:[[.2,0],[.24,.045],[.265,.062],[.3,.054],[.36,.024]]} + ,zNi={ + fish:[[0,0],[.025,.085],[.08,.064],[.17,0]],shark:[[0,0],[.025,.16],[.075,.109],[.18,0]],megalodon:[[0,0],[.027,.17],[.08,.114],[.19,0]],whaleShark:[[0,0],[.025,.18],[.085,.118],[.2,0]],sturgeon:[[0,0],[.03,.13],[.09,.086],[.2,0]]} + ,YNi={ + fish:[[0,0],[.025,.085],[.08,.064],[.17,0]],shark:[[.045,0],[.065,.074],[.115,.043],[.18,0]],megalodon:[[.025,0],[.045,.115],[.105,.075],[.19,0]],whaleShark:[[.04,0],[.065,.1],[.13,.056],[.2,0]],sturgeon:[[.075,0],[.1,.051],[.14,.029],[.2,0]]} + ; + function qNi(t,i){ + if(i<t[0][0]||i>t[t.length-1][0])return 0; + for(let s=1; + s<t.length; + s++){ + const[e,n]=t[s]; + if(i<=e){ + const[h,r]=t[s-1],o=e-h,a=(i-h)/o,c=Qt(i=>{ + if(0===i)return(t[1][1]-t[0][1])/(t[1][0]-t[0][0]); + if(i===t.length-1)return(t[i][1]-t[i-1][1])/(t[i][0]-t[i-1][0]); + const s=t[i-1],e=t[i],n=t[i+1],h=e[0]-s[0],r=n[0]-e[0],o=(e[1]-s[1])/h,a=(n[1]-e[1])/r; + return o*a<=0?0:3*(h+r)/((2*r+h)/o+(r+2*h)/a)} + ,"slope"),l=a*a,u=l*a; + return(2*u-3*l+1)*r+(u-2*l+a)*o*c(s-1)+(-2*u+3*l)*n+(u-l)*o*c(s)} + } + return t[t.length-1][1]} + function XNi(t,i,s,e){ + if("shark"===t)return uNi(i,s,e); + if("megalodon"===t||"whaleShark"===t)return uNi(i,s,e)*("megalodon"===t?.72:.88); + if("sturgeon"===t){ + const t=oNi(.3,1,i); + return.043*(.45+.55*e)*t*t*Math.sin(s-4.6*i)} + const n=oNi(.28,1,i); + return.048*(.4+.6*e)*n*n*Math.sin(s-4.1*i)} + function JNi(t,i){ + return 2*Math.PI*Math.max(.65,Math.min(2.2,.35+t/Math.max(10,.9*i)))} + function QNi(t,i){ + return Math.max(.001,qNi(VNi[t],i))} + function ZNi(t,i,s,e){ + const n=QNi(t,i),h=qNi(jNi[t],i),r=qNi(KNi[t],i),o="megalodon"===t||"whaleShark"===t,a=e*(o?.075:.12)+(o?.025:.035)*Math.sin(s-2.7),c=qNi(zNi[t],i)*Math.sin(a),l=-qNi(YNi[t],i)*Math.sin(a),u=Qt(t=>Math.max(h*Math.cos(.12+t*e*.2+.055*Math.sin(.5*s)),r),"fin"); + return{ + left:Math.max(n,u(1),c,l),right:Math.max(n,u(-1),-c,-l)} + } + Qt(qNi,"profile"),Qt(XNi,"fishBodySway"),Qt(JNi,"fishTailRate"),Qt(QNi,"topFishBodyHalfWidth"),Qt(ZNi,"topFishSection"); + const tLi=new Map; + function iLi(t){ + const i=tLi.get(t); + if(i)return i; + const s=document.createElement("canvas"); + s.width=384,s.height=96; + const e=s.getContext("2d"),n=s.width,h=s.height,r=e.createImageData(n,h); + for(let l=0; + l<n; + l++){ + const i=l/(n-1),s=ZNi(t,i,0,0).left,e=QNi(t,i); + for(let t=0; + t<h; + t++){ + const i=Math.abs(t/(h-1)*2-1),o=i*s/e,a=Math.min(1,(1-i)/.06),c=(o>1?.72:.87+.13*Math.cos(o*Math.PI/2))*a,u=4*(t*n+l); + r.data[u]=r.data[u+1]=r.data[u+2]=255,r.data[u+3]=Math.round(255*c)} + } + e.putImageData(r,0,0); + const o=Qt((i,s)=>[i*n,h*(.5+s/(2*ZNi(t,i,0,0).left))],"uv"),a=Qt((i,s,r,a)=>{ + const[c,l]=o(i,s),u=ZNi(t,i,0,0).left; + e.fillStyle=`rgba(255,255,255,${ + a} + )`,e.beginPath(),e.ellipse(c,l,r*n,r*h/(2*u),0,0,2*Math.PI),e.fill()} + ,"dot"); + if(e.globalCompositeOperation="destination-out","whaleShark"===t)for(let l=0; + l<24; + l++)for(let i=-3; + i<=3; + i++){ + const s=.23+.029*l+Math.abs(i)%2*.012; + a(s,i*QNi(t,s)*.23+.0015*Math.sin(2.4*l+i),.0034+9e-4*Math.sin(1.7*l+2*i)**2,.48)} + else if("sturgeon"===t)for(let l=0; + l<13; + l++)for(const i of[-1,0,1]){ + const s=.24+.045*l,n=i*QNi(t,s)*.69,h=[[s-.012,n],[s,n-.004],[s+.009,n],[s,n+.004]]; + e.beginPath(),h.forEach(([t,i],s)=>{ + const[n,h]=o(t,i); + s?e.lineTo(n,h):e.moveTo(n,h)} + ),e.closePath(),e.fillStyle=`rgba(255,255,255,${ + 0===i?.43:.3} + )`,e.fill()} + else for(let l=0; + l<130; + l++)a(.3+.004*l,0,.0018,.07); + e.globalCompositeOperation="source-over"; + const c=as.from(s); + return c.source.scaleMode="linear",tLi.set(t,c),c} + Qt(iLi,"megafaunaTexture"); + const sLi=class t extends Wy{ + constructor(i,s){ + const e=s??("fish"===i?49:129); + super({ + texture:"fish"===i||"shark"===i?t.edgeTexture():iLi(i),verticesX:e,verticesY:5} + ),Zt(this,"columns"),Zt(this,"rows",5),this.kind=i,this.autoResize=!1,this.columns=e,this.eventMode="none"} + static edgeTexture(){ + if(this.feather)return this.feather; + const t=document.createElement("canvas"); + t.width=4,t.height=64; + const i=t.getContext("2d"),s=i.createLinearGradient(0,0,0,64); + return s.addColorStop(0,"rgba(255,255,255,0)"),s.addColorStop(.13,"white"),s.addColorStop(.87,"white"),s.addColorStop(1,"rgba(255,255,255,0)"),i.fillStyle=s,i.fillRect(0,0,4,64),this.feather=as.from(t)} + pose(t,i,s,e,n){ + const h=this.geometry.positions; + for(let r=0; + r<this.columns; + r++){ + const o=r/(this.columns-1),a=1-o,c=n(a*t),l=XNi(this.kind,a,i,s),u=(XNi(this.kind,a+.002,i,s)-XNi(this.kind,a-.002,i,s))/.004,d=c.a-Math.atan(u),f=ZNi(this.kind,o,i,e); + for(let i=0; + i<this.rows; + i++){ + const s=i/(this.rows-1)*2-1,e=s*(s<0?f.left:f.right)*t,n=2*(i*this.columns+r); + h[n]=c.x-Math.sin(c.a)*l*t-Math.sin(d)*e,h[n+1]=c.y+Math.cos(c.a)*l*t+Math.cos(d)*e} + } + this.geometry.getBuffer("aPosition").update()} + swim(t,i,s,e=0){ + this.pose(t,i,s,e,i=>{ + const s=Math.max(0,i/t-.25); + return{ + x:.5*t-i,y:e*t*s*s*.1,a:-Math.atan(e*s*.2)} + } + )} + destroy(t){ + const i=this.geometry; + super.destroy(t),i.destroy()} + } + ; + Qt(sLi,"FishingTopFishRig"),Zt(sLi,"feather",null); + let eLi=sLi; + const nLi=["stream","swirl","scatter"],hLi={ + SPEED:40,BOAT_R:46,FADE_IN:1.2,FADE_OUT:1.6,MARGIN:70,COUNT:{ + R:[50,70],C:[70,90],O:[90,120]} + ,FIRST_S:[20,40],EVERY_S:[60,120],SWIRL_IN:58,SWIRL_OUT:44,SWIRL_HOLD:6.5,SWIRL_DIST:[90,150]} + ,rLi=2*Math.PI,oLi=Qt((t,i,s)=>Math.max(i,Math.min(s,t)),"clamp$1"),aLi=Qt((t,i,s)=>{ + const e=oLi((s-t)/(i-t),0,1); + return e*e*(3-2*e)} + ,"smooth$1"),cLi=Qt((t,i,s)=>t+(i-t)*s,"lerp"); + function lLi(t){ + let i=t>>>0; + return()=>{ + i=i+1831565813>>>0; + let t=i; + return t=Math.imul(t^t>>>15,1|t),t^=t+Math.imul(t^t>>>7,61|t),((t^t>>>14)>>>0)/4294967296} + } + Qt(lLi,"schoolRng"); + const uLi=Qt((t,i)=>{ + const[s,e]=hLi.COUNT[t]; + return Math.round(s+i()*(e-s))} + ,"schoolCount"),dLi=Qt((t,i)=>{ + const[s,e]=t?hLi.FIRST_S:hLi.EVERY_S; + return s+i()*(e-s)} + ,"nextSchoolDelay"); + function fLi(t){ + const i=[t[0],...t,t[t.length-1]],s=[]; + for(let r=1; + r<i.length-2; + r++)for(let t=0; + t<24; + t++){ + const e=t/24,n=e*e,h=n*e,[o,a,c,l]=[i[r-1],i[r],i[r+1],i[r+2]],u=Qt((t,i,s,r)=>.5*(2*i+(-t+s)*e+(2*t-5*i+4*s-r)*n+(3*i-t-3*s+r)*h),"f"); + s.push([u(o.x,a.x,c.x,l.x),u(o.y,a.y,c.y,l.y)])} + s.push([t[t.length-1].x,t[t.length-1].y]); + const e=[0]; + for(let r=1; + r<s.length; + r++)e.push(e[r-1]+Math.hypot(s[r][0]-s[r-1][0],s[r][1]-s[r-1][1])); + const n=e[e.length-1],h=s.length; + return{ + len:n,at(t){ + if(t<=0){ + const i=Math.atan2(s[1][1]-s[0][1],s[1][0]-s[0][0]); + return[s[0][0]+Math.cos(i)*t,s[0][1]+Math.sin(i)*t,i]} + if(t>=n){ + const i=Math.atan2(s[h-1][1]-s[h-2][1],s[h-1][0]-s[h-2][0]); + return[s[h-1][0]+Math.cos(i)*(t-n),s[h-1][1]+Math.sin(i)*(t-n),i]} + let i=0,r=h-1; + for(; + r-i>1; + ){ + const s=i+r>>1; + e[s]<t?i=s:r=s} + const o=(t-e[i])/Math.max(1e-9,e[r]-e[i]),a=Math.atan2(s[r][1]-s[i][1],s[r][0]-s[i][0]); + return[cLi(s[i][0],s[r][0],o),cLi(s[i][1],s[r][1],o),a]} + } + } + function pLi(t,i){ + let s=1e18,e=0; + for(let n=0; + n<=t.len; + n+=2){ + const[h,r]=t.at(n),o=(h-i.x)**2+(r-i.y)**2; + o<s&&(s=o,e=n)} + return e} + function gLi(t,i,s,e=hLi.SPEED){ + const n=Array.isArray(i)?{ + mode:"stream",pts:i} + :i,h=lLi(s),r=40+.7*t,o=14+.14*t,a=[],c=oLi(Math.sqrt(t/80),.8,1.2); + for(let d=0; + d<t; + d++){ + const t=Math.pow(h(),.85),i=2*h()-1,s=Math.pow(Math.sin(Math.PI*oLi(.96*t+.02,0,1)),.8)*(1-.3*t); + a.push({ + d:t*r,w:i*o*s,depth:h(),L:10+4*h(),ph:h()*rLi,p1:h()*rLi,p2:h()*rLi,f1:.6+.5*h(),f2:.9+.6*h(),orbR:(10+36*Math.sqrt(h()))*c,orbA:h()*rLi,orbW:1.55*(.85+.3*h()),br:h()*rLi,sc:h()*rLi,flashAt:.25*h()} + )} + if("swirl"===n.mode){ + const t=fLi(n.inPts),i=fLi(n.outPts),c=pLi(t,n.center),l=pLi(i,n.center),u=c/hLi.SWIRL_IN,d=u+hLi.SWIRL_HOLD,f={ + C:n.center,inPath:t,outPath:i,inC:c,outC:l,tArrive:u,tLeave:d,spin:h()<.5?1:-1} + ; + return{ + mode:"swirl",fish:a,D:r,W:o,path:t,v:e,seed:s,swirl:f,dur:d+(i.len-l+.9*r+10)/hLi.SWIRL_OUT} + } + const l=fLi(n.pts),u={ + mode:n.mode,fish:a,D:r,W:o,path:l,v:e,seed:s,dur:(l.len+r)/e} + ; + if("scatter"===n.mode){ + let i=1e18,s=u.dur/2; + for(let a=0; + a<u.dur; + a+=.1){ + let e=0,h=0; + for(let i=0; + i<t; + i++){ + const t=mLi(u,i,a); + e+=t.x,h+=t.y} + const r=(e/t-n.boat.x)**2+(h/t-n.boat.y)**2; + r<i&&(i=r,s=a)} + const e=Math.max(1.5,s-.9),h=a.map((t,i)=>wLi(mLi(u,i,e).x,mLi(u,i,e).y,mLi(u,i,e).a,a[i].w,n.boat)),r=h.reduce((t,i)=>t+i.x,0)/t,o=h.reduce((t,i)=>t+i.y,0)/t; + u.scatter={ + ts:e,dir:h.map(t=>{ + const i=t.x-r,s=t.y-o,e=Math.hypot(i,s)||1; + return[i/e,s/e,e]} + )} + } + return u} + function wLi(t,i,s,e,n,h=hLi.BOAT_R){ + const r=Math.cos(s),o=Math.sin(s),a=t-n.x,c=i-n.y,l=a*r+c*o,u=-a*o+c*r+(e>=0?1:-1)*h*Math.exp(-Math.pow(l/(1.7*h),2)); + return{ + x:n.x+r*l-o*u,y:n.y+o*l+r*u} + } + function mLi(t,i,s){ + const e=t.fish[i],n=5*Math.sin(e.f1*s+e.p1),h=3.5*Math.sin(e.f2*s+e.p2),[r,o,a]=t.path.at(t.v*s-(e.d+n)),c=e.w+h; + return{ + x:r-Math.sin(a)*c,y:o+Math.cos(a)*c,a} + } + function vLi(t,i,s){ + const e=t.scatter; + if(!e)return{ + x:0,y:0} + ; + const n=t.fish[i],h=s-e.ts-.4*n.flashAt; + if(h<=0)return{ + x:0,y:0} + ; + const r=42+34*(1-Math.min(1,e.dir[i][2]/60))+18*Math.sin(n.sc),o=h<.6?1-Math.pow(1-h/.6,3):1-aLi(.6,3.4,h); + return{ + x:e.dir[i][0]*r*o,y:e.dir[i][1]*r*o} + } + function _Li(t,i,s){ + if(!t.scatter)return 0; + const e=s-t.scatter.ts-.4*t.fish[i].flashAt; + return e<0?0:e<.12?e/.12:Math.max(0,1-(e-.12)/.38)} + function MLi(t,i,s,e){ + const n=t.fish[i]; + if("swirl"===t.mode&&t.swirl){ + const i=t.swirl,h=5*Math.sin(n.f1*s+n.p1),r=3.5*Math.sin(n.f2*s+n.p2),o=.8*(n.w+r),[a,c,l]=i.inPath.at(Math.min(hLi.SWIRL_IN*s-(.8*n.d+h),i.inPath.len+40)); + let u={ + x:a-Math.sin(l)*o,y:c+Math.cos(l)*o} + ; + const d=n.orbR*(1+.12*Math.sin(1.1*s+n.br)),f=n.orbA+i.spin*n.orbW*(46/(n.orbR+18))*s,p={ + x:i.C.x+Math.cos(f)*d,y:i.C.y+Math.sin(f)*d*.92} + ,[g,w,m]=i.outPath.at(hLi.SWIRL_OUT*(s-i.tLeave)-(.9*n.d+h)+i.outC); + let v={ + x:g-Math.sin(m)*o*.875,y:w+Math.cos(m)*o*.875} + ; + e&&(u=wLi(u.x,u.y,l,n.w,e),v=wLi(v.x,v.y,m,n.w,e)); + const _=aLi(i.tArrive-.6,i.tArrive+1.4,s+.004*n.d),M=aLi(i.tLeave,i.tLeave+2.2,s-.006*n.d),b=cLi(u.x,p.x,_),y=cLi(u.y,p.y,_); + return{ + x:cLi(b,v.x,M),y:cLi(y,v.y,M)} + } + const h=mLi(t,i,s),r=e?wLi(h.x,h.y,h.a,n.w,e):h,o=vLi(t,i,s); + return{ + x:r.x+o.x,y:r.y+o.y} + } + function bLi(t,i,s){ + const e=t.swirl; + if(!e)return[]; + const n=lLi(20973^t.seed),h=[],r=e.tArrive+.6,o=Math.floor((e.tLeave-r)/.17); + for(let a=0; + a<o; + a++){ + const t=r+.17*a+.1*n(),o=n()*rLi,c=40*Math.sqrt(n()); + t>i&&t<=s&&h.push({ + x:e.C.x+Math.cos(o)*c,y:e.C.y+Math.sin(o)*c*.9} + )} + return h} + function yLi(t,i){ + const s=t.swirl; + if(!s)return[]; + const e=aLi(s.tArrive+.6,s.tArrive+1.6,i)*(1-aLi(s.tLeave,s.tLeave+1,i)); + if(e<=0)return[]; + const n=lLi(39454^t.seed),h=[]; + for(let r=0; + r<10; + r++){ + const t=n()*rLi,r=38*Math.sqrt(n()),o=Math.max(0,Math.sin(i*(5+4*n())+n()*rLi)); + h.push({ + x:s.C.x+Math.cos(t)*r,y:s.C.y+Math.sin(t)*r,a:.7*o*o*e} + )} + return h} + function ELi(t,i){ + return aLi(0,hLi.FADE_IN,i)*(1-aLi(t.dur-hLi.FADE_OUT,t.dur,i))} + function ALi(t,i,s,e){ + const n=t.fish[i],h=MLi(t,i,s,e),r=s>=.06,o=MLi(t,i,r?s-.06:s+.06,e),a=r?Math.atan2(h.y-o.y,h.x-o.x):Math.atan2(o.y-h.y,o.x-h.x),c=n.L*(1-.15*n.depth),l=rLi*oLi(.35+36/Math.max(10,.9*c),.65,2.2); + return{ + x:h.x,y:h.y,rot:a,L:c,alpha:(.36-.14*n.depth)*ELi(t,s),phase:n.ph+l*s,flash:_Li(t,i,s)} + } + function SLi(t,i,s,e){ + const n=s>0?(t.x+t.w-i.x)/s:s<0?(t.x-i.x)/s:1/0,h=e>0?(t.y+t.h-i.y)/e:e<0?(t.y-i.y)/e:1/0; + return Math.max(0,Math.min(n,h))} + Qt(fLi,"schoolPath"),Qt(pLi,"nearestS"),Qt(gLi,"makeFishSchool"),Qt(wLi,"flowAround"),Qt(mLi,"streamAt"),Qt(vLi,"scatterOffset"),Qt(_Li,"schoolFlash"),Qt(MLi,"schoolFishAt"),Qt(bLi,"swirlRipples"),Qt(yLi,"swirlGlints"),Qt(ELi,"schoolAlpha"),Qt(ALi,"schoolFishPose"),Qt(SLi,"toEdge"); + const TLi=Qt(t=>(i,s)=>i>=t.x&&i<=t.x+t.w&&s>=t.y&&s<=t.y+t.h,"inViewOf"); + function CLi(t,i,s,e){ + const n=TLi(i); + for(let h=0; + h<=t.len; + h+=10){ + const[i,r,o]=t.at(h),a=-Math.sin(o)*e,c=Math.cos(o)*e; + for(const[t,e]of[[i,r],[i+a,r+c],[i-a,r-c]])if(n(t,e)&&!s(t,e))return!1} + return!0} + function OLi(t,i,s,e,n=!1){ + for(let h=0; + h<16; + h++){ + const h=e()*rLi,r=Math.cos(h),o=Math.sin(h),a=-o,c=r,l=SLi(t,i,-r,-o)+hLi.MARGIN,u=SLi(t,i,r,o)+hLi.MARGIN,d=n?16*(2*e()-1):e()<.55?22*(2*e()-1):(e()<.5?-1:1)*(60+60*e()),f={ + x:i.x-r*l,y:i.y-o*l} + ,p={ + x:i.x+r*u,y:i.y+o*u} + ,g={ + x:i.x+a*d,y:i.y+c*d} + ,w=45*(2*e()-1),m=45*(2*e()-1),v=[f,{ + x:cLi(f.x,g.x,.5)+a*w,y:cLi(f.y,g.y,.5)+c*w} + ,g,{ + x:cLi(g.x,p.x,.5)+a*m,y:cLi(g.y,p.y,.5)+c*m} + ,p]; + if(CLi(fLi(v),t,s,24))return v} + return null} + function ILi(t,i,s,e,n=s){ + const h=TLi({ + x:t.x+60,y:t.y+60,w:t.w-120,h:t.h-120} + ); + for(let r=0; + r<40; + r++){ + const r=e()*rLi,o=hLi.SWIRL_DIST[0]+e()*(hLi.SWIRL_DIST[1]-hLi.SWIRL_DIST[0]),a={ + x:i.x+Math.cos(r)*o,y:i.y+Math.sin(r)*o} + ; + if(!h(a.x,a.y)||!n(a.x,a.y))continue; + let c=!0; + for(let t=0; + t<12&&c; + t++)c=n(a.x+60*Math.cos(t*rLi/12),a.y+60*Math.sin(t*rLi/12)); + if(!c)continue; + const l=e()*rLi,u=Math.cos(l),d=Math.sin(l),f=l+(e()<.5?-1:1)*(1.05+.95*e()),p=Math.cos(f),g=Math.sin(f),w={ + x:a.x-u*(SLi(t,a,-u,-d)+hLi.MARGIN),y:a.y-d*(SLi(t,a,-u,-d)+hLi.MARGIN)} + ,m={ + x:a.x+p*(SLi(t,a,p,g)+hLi.MARGIN),y:a.y+g*(SLi(t,a,p,g)+hLi.MARGIN)} + ,v=35*(2*e()-1),_=35*(2*e()-1),M={ + x:cLi(w.x,a.x,.5)-d*v,y:cLi(w.y,a.y,.5)+u*v} + ,b={ + x:cLi(a.x,m.x,.5)-g*_,y:cLi(a.y,m.y,.5)+p*_} + ,y=[w,M,a,{ + x:a.x+40*u,y:a.y+40*d} + ],E=[{ + x:a.x-72*p,y:a.y-72*g} + ,a,b,m]; + if(CLi(fLi(y),t,s,20)&&CLi(fLi(E),t,s,20))return{ + center:a,inPts:y,outPts:E} + } + return null} + Qt(CLi,"pathInWater"),Qt(OLi,"planSchoolPath"),Qt(ILi,"planSwirl"); + const kLi=12,RLi=665137,xLi=Qt((t,i,s)=>{ + const e=Qt(e=>Math.round((t>>e&255)+((i>>e&255)-(t>>e&255))*s),"ch"); + return e(16)<<16|e(8)<<8|e(0)} + ,"mix"),PLi={ + autoGenerateMipmaps:!0,magFilter:"linear",minFilter:"linear",mipmapFilter:"nearest"} + ; + let NLi=null; + function LLi(){ + if(NLi&&NLi.every(t=>!t.destroyed))return NLi; + NLi=[]; + for(let t=0; + t<kLi; + t++){ + const i=new Ve,s=(new ip).rect(0,0,48,24).fill({ + color:0,alpha:.001} + ),e=new eLi("fish",25); + e.tint=16777215,e.swim(32,t/kLi*Math.PI*2,.75,0),e.position.set(24,12),i.addChild(s,e),NLi.push(ES.app.renderer.generateTexture({ + target:i,resolution:2,antialias:!0,textureSourceOptions:PLi} + )),i.destroy({ + children:!0} + )} + return NLi} + Qt(LLi,"schoolFrames"); + const DLi=class t extends Ve{ + constructor(){ + super(),Zt(this,"school",null),Zt(this,"t",0),Zt(this,"sprites",[]),Zt(this,"glints",new ip),this.eventMode="none",this.glints.eventMode="none",this.addChild(this.glints)} + get mode(){ + var t; + return(null==(t=this.school)?void 0:t.mode)??null} + get active(){ + return!!this.school} + start(t,i,s){ + this.school=gLi(t,i,s),this.t=0; + const e=LLi(); + for(; + this.sprites.length<t; + ){ + const t=new Ye(e[0]); + t.anchor.set(.5),t.tint=RLi,t.eventMode="none",this.addChildAt(t,this.children.length-1),this.sprites.push(t)} + for(const n of this.sprites)n.visible=!1} + clear(){ + this.school=null; + for(const t of this.sprites)t.visible=!1; + this.glints.clear()} + update(i,s,e,n){ + const h=this.school; + if(!h)return; + const r=this.t; + if(this.t+=i*t.speed,this.t>=h.dur)return void this.clear(); + if(n)for(const t of bLi(h,r,this.t))n(t.x,t.y); + this.glints.clear(); + for(const t of yLi(h,this.t))t.a>.01&&this.glints.circle(t.x,t.y,1.4).fill({ + color:16777215,alpha:t.a} + ); + const o=LLi(); + for(let t=0; + t<h.fish.length; + t++){ + const i=ALi(h,t,this.t,s),n=this.sprites[t],r=i.alpha*(i.alpha>.003?e(i.x,i.y):0); + if(n.visible=r>.003,!n.visible)continue; + const a=(Math.floor(i.phase/(2*Math.PI)*kLi)%kLi+kLi)%kLi; + n.texture=o[a],n.position.set(i.x,i.y),n.rotation=i.rot,n.scale.set(i.L/32),n.alpha=Math.min(1,r*(1+1.3*i.flash)),n.tint=i.flash>0?xLi(RLi,14283512,i.flash):RLi} + } + } + ; + Qt(DLi,"FishingFishSchool"),Zt(DLi,"speed",1); + let GLi=DLi; + const BLi=class extends Ve{ + constructor(){ + super(),Zt(this,"flippers",[]),this.eventMode="none"; + for(const i of[!0,!1])for(const t of[-1,1]){ + const s=new ip; + i?s.moveTo(.025,0).bezierCurveTo(-.01,.065,-.065,.13,-.145,.15).bezierCurveTo(-.17,.08,-.06,-.01,0,-.03).closePath().fill(16777215):s.moveTo(.04,0).bezierCurveTo(.045,.13,-.075,.31,-.2,.37).bezierCurveTo(-.225,.375,-.2,.29,-.16,.22).bezierCurveTo(-.105,.11,-.085,.035,-.055,-.025).closePath().fill(16777215),s.position.set(i?-.25:.19,t*(i?.145:.15)),s.scale.y=t,this.addChild(s),this.flippers.push({ + shape:s,side:t,rear:i} + )} + const t=new ip; + t.moveTo(-.31,-.035).lineTo(-.47,0).lineTo(-.31,.035).closePath().fill(16777215),t.moveTo(.24,-.06).bezierCurveTo(.33,-.055,.37,-.082,.43,-.075).bezierCurveTo(.51,-.063,.525,.06,.43,.075).bezierCurveTo(.37,.082,.33,.055,.24,.06).closePath().fill(16777215),t.moveTo(.33,0).bezierCurveTo(.34,.13,.19,.235,-.02,.233).bezierCurveTo(-.23,.23,-.38,.11,-.37,0).bezierCurveTo(-.38,-.11,-.23,-.23,-.02,-.233).bezierCurveTo(.19,-.235,.34,-.13,.33,0).closePath().fill(16777215),this.addChild(t)} + pose(t,i,s,e,n){ + const h=n(.5*t); + this.position.set(h.x,h.y),this.rotation=h.a,this.scale.set(t); + for(const{ + shape:r,side:o,rear:a} + of this.flippers){ + const t=wNi(i,s,e,o,a); + r.rotation=t.sweep,r.scale.y=o*t.span} + } + } + ; + Qt(BLi,"FishingTurtleRig"); + let ULi=BLi; + const FLi=2*Math.PI,$Li=Qt((t,i,s)=>Math.max(i,Math.min(s,t)),"clamp"); + function HLi(t,i,s){ + const e=$Li((s-t)/(i-t),0,1); + return e*e*(3-2*e)} + function WLi(t,i){ + const s=1-i; + return{ + x:s**3*t[0].x+3*s*s*i*t[1].x+3*s*i*i*t[2].x+i**3*t[3].x,y:s**3*t[0].y+3*s*s*i*t[1].y+3*s*i*i*t[2].y+i**3*t[3].y} + } + function VLi(t){ + const i=$Li(t.age*t.speed,0,t.length),s=t.distances; + let e=1; + for(; + e<s.length-1&&s[e]<i; + )e++; + const n=(e-1+(i-s[e-1])/Math.max(.001,s[e]-s[e-1]))/(s.length-1),h=t.points,r=1-n,o=WLi(h,n),a=3*(r*r*(h[1].x-h[0].x)+2*r*n*(h[2].x-h[1].x)+n*n*(h[3].x-h[2].x)),c=3*(r*r*(h[1].y-h[0].y)+2*r*n*(h[2].y-h[1].y)+n*n*(h[3].y-h[2].y)),l=6*(r*(h[2].x-2*h[1].x+h[0].x)+n*(h[3].x-2*h[2].x+h[1].x)),u=(a*(6*(r*(h[2].y-2*h[1].y+h[0].y)+n*(h[3].y-2*h[2].y+h[1].y)))-c*l)/Math.max(1,Math.hypot(a,c)**3); + return{ + ...o,heading:Math.atan2(c,a),bank:$Li(u*t.speed*3.5,-.55,.55),height:t.height+3*Math.sin(.38*t.age+t.seed),alpha:HLi(0,2,t.age)*(1-HLi(t.life-2,t.life,t.age))} + } + function jLi(t,i,s,e,n){ + const h="gull"===t?2.7:1.6,r=(i+2*s)%("gull"===t?10.5:18),o=HLi(0,.45,r)*(1-HLi(h-.5,h,r)),a=i*FLi*("gull"===t?1.55:1.8)+s,c=.12+.7*Math.sin(a)*o+n*e,l=.18+.95*Math.sin(a-.65)*o+n*e; + return{ + inner:Math.cos($Li(c,-1.05,1.05)),outer:Math.cos($Li(l,-1.2,1.2)),sweep:o*Math.sin(a-.4)*.045,shade:$Li(.92+n*e*.14-.07*o*Math.sin(a),.65,1)} + } + Qt(HLi,"smooth"),Qt(WLi,"curve"),Qt(VLi,"sampleBirdFlight"),Qt(jLi,"birdWingPose"); + const KLi=class{ + constructor(t=Math.random){ + Zt(this,"birds",[]),Zt(this,"nextIn",5),Zt(this,"id",0),Zt(this,"zone","R"),this.random=t} + reset(t){ + this.zone=t,this.birds.length=0,this.nextIn=("R"===t?7:4)+5*this.random()} + update(t,i,s,e){ + for(let _=this.birds.length-1; + _>=0; + _--)this.birds[_].age+=t,this.birds[_].age>=this.birds[_].life&&this.birds.splice(_,1); + if(2===s)return void(this.nextIn=Math.max(this.nextIn-t,6)); + if(this.nextIn-=t,this.nextIn>0||this.birds.length)return; + const n=this.random,h="R"===this.zone?"hawk":"gull",r="hawk"===h?1:"C"===this.zone&&n()<.25?3:n()<.65?2:1,o=n()*FLi,a=Math.cos(o),c=Math.sin(o),l=-c,u=a,d=.5*Math.hypot(i.width,i.height)+160,f=d*("hawk"===h?.85:.18+.16*n())*(n()<.5?-1:1),p="hawk"===h?72:32+18*n(),g="hawk"===h&&e?e:{ + x:i.x+.5*i.width,y:i.y+.5*i.height} + ,w=g.x-l*f*.65,m=g.y+p-u*f*.65,v=("hawk"===h?29:34)+7*n(); + for(let _=0; + _<r; + _++){ + const t=-a*_*32+l*_*26,i=-c*_*32+u*_*26,s=Qt((s,e)=>({ + x:w+a*s+l*e+t,y:m+c*s+u*e+i} + ),"at"),e=[s(-d,0),s(.35*-d,f),s(.35*d,f),s(d,0)],r=[0]; + let o=e[0],g=0; + for(let n=1; + n<=64; + n++){ + const t=WLi(e,n/64); + g+=Math.hypot(t.x-o.x,t.y-o.y),r.push(g),o=t} + const M=v*(1-.018*_); + this.birds.push({ + id:++this.id,kind:h,age:0,life:g/M,speed:M,span:"hawk"===h?35+5*n():25+6*n(),height:p+5*_,seed:n()*FLi,points:e,distances:r,length:g} + )} + this.nextIn=Math.max(...this.birds.map(t=>t.life))+("hawk"===h?27:"O"===this.zone?22:15)+15*n()} + } + ; + Qt(KLi,"BirdFlightModel"); + let zLi=KLi; + const YLi=class extends Ve{ + constructor(t,i=!1){ + super(),Zt(this,"wings",[new ip,new ip]),Zt(this,"tail",new ip),this.kind=t,this.shadow=i,this.eventMode="none"; + const s="gull"===t,e=1324356,n=new ip,h=i?e:s?15265263:6640452; + this.tail.moveTo(-8,-3.8).lineTo(s?-24:-29,-7).quadraticCurveTo(s?-27:-31,0,s?-24:-29,7).lineTo(-8,3.8).closePath().fill(h),this.tail.pivot.set(-8,0),this.tail.position.set(-8,0),n.ellipse(-1,0,15.5,4.5).fill(i?e:s?16118504:7757899),n.ellipse(14,0,6.5,3.5).fill(i?e:s?16776175:4799539),n.moveTo(19.2,-1.4).lineTo(24,0).lineTo(19.2,1.4).closePath().fill(i?e:s?14200162:9205586),i||n.ellipse(16.5,-2.1,.6,.6).fill(3620668),this.addChild(this.tail,...this.wings,n)} + pose(t,i,s,e){ + this.scale.set(t/100),this.tail.rotation=.12*-e+.018*Math.sin(.65*i+s); + for(let n=0; + n<2; + n++){ + const t=0===n?-1:1,h=jLi(this.kind,i,s,e,t),r=this.wings[n].clear(),o="gull"===this.kind,a=23*h.inner,c=a+27*h.outer,l=2.5+100*h.sweep,u=(o?-15:-11)+140*h.sweep,d=Qt(i=>i*t,"y"); + r.moveTo(8.5,d(2.5)).quadraticCurveTo(9.5,d(.65*a),l,d(a)).quadraticCurveTo(u+7,d(c-7),u,d(c)).quadraticCurveTo(u+1.2,d(c-11),o?-7.5:-10.5,d(.9*a)).quadraticCurveTo(-8,d(6),-10.5,d(2.5)).closePath().fill(this.shadow?1324356:o?14279653:6115396),this.shadow||(r.moveTo(u,d(c)).quadraticCurveTo(u+1.5,d(c-6.5),u+3.1,d(c-10)).lineTo(u+5.5,d(c-7.3)).quadraticCurveTo(u+2.9,d(c-2.7),u,d(c)).closePath().fill(o?5069922:3421745),r.moveTo(3.5,d(7.5)).quadraticCurveTo(1.8,d(a),u+3.4,d(c-7.5)).stroke({ + color:o?16119275:10191972,alpha:.5,width:.9} + )),r.alpha=this.shadow?1:h.shade} + } + } + ; + Qt(YLi,"FishingBirdRig"); + let qLi=YLi; + const XLi=class{ + constructor(){ + Zt(this,"sky",new Ve),Zt(this,"shadows",new Ve),Zt(this,"model",new zLi),Zt(this,"views",new Map),Zt(this,"blur",new mf({ + strength:1.25,quality:2} + )),Zt(this,"daylight",1),this.sky.eventMode=this.shadows.eventMode="none",this.shadows.filters=[this.blur],this.shadows.on("destroyed",()=>this.blur.destroy())} + reset(t){ + this.model.reset(t); + for(const i of this.views.values())i.bird.destroy({ + children:!0} + ),i.shadow.destroy({ + children:!0} + ); + this.views.clear()} + update(t,i,s,e,n){ + let h; + if("R"===s&&!this.model.birds.length){ + let t=1/0; + for(const s of[.25,.5,.75])for(const e of[.3,.5,.7]){ + const r=i.x+i.width*s,o=i.y+i.height*e,a=n(r,o); + a>0&&Math.abs(a-55)<t&&(t=Math.abs(a-55),h={ + x:r,y:o} + )} + } + this.model.update(t,i,e,h); + const r=new Set(this.model.birds.map(t=>t.id)); + for(const[o,a]of this.views)r.has(o)||(a.bird.destroy({ + children:!0} + ),a.shadow.destroy({ + children:!0} + ),this.views.delete(o)); + this.daylight+=((2===e?0:1)-this.daylight)*(1-Math.exp(1.3*-t)); + for(const o of this.model.birds){ + let t=this.views.get(o.id); + t||(t={ + bird:new qLi(o.kind),shadow:new qLi(o.kind,!0)} + ,this.views.set(o.id,t),this.sky.addChild(t.bird),this.shadows.addChild(t.shadow)); + const s=VLi(o); + t.bird.pose(o.span,o.age,o.seed,s.bank),t.shadow.pose(.86*o.span,o.age,o.seed,s.bank),t.bird.position.set(s.x,s.y-s.height),t.bird.rotation=t.shadow.rotation=s.heading,t.shadow.position.set(s.x+.28*s.height,s.y+.18*s.height),t.bird.alpha=s.alpha*this.daylight*("gull"===o.kind?.86:.8),t.shadow.alpha=s.alpha*this.daylight*("gull"===o.kind?.09:.065)*(3===e?.28:1===e?.65:1); + const n=s.x>i.x-160&&s.x<i.x+i.width+160&&s.y>i.y-160&&s.y<i.y+i.height+160; + t.bird.visible=t.shadow.visible=n} + this.shadows.visible=this.model.birds.length>0&&this.daylight>.01} + } + ; + Qt(XLi,"FishingBirds"); + let JLi=XLi; + const QLi=class t extends Ve{ + constructor(){ + super(),Zt(this,"pool",[]),Zt(this,"used",0),Zt(this,"moon",0),Zt(this,"lantern",0),Zt(this,"initialized",!1),this.eventMode="none"} + static softLight(){ + if(!this.texture){ + const t=document.createElement("canvas"); + t.width=t.height=64; + const i=t.getContext("2d"),s=i.createRadialGradient(32,32,0,32,32,32); + s.addColorStop(0,"rgba(255,255,255,1)"),s.addColorStop(.28,"rgba(255,255,255,.55)"),s.addColorStop(.65,"rgba(255,255,255,.12)"),s.addColorStop(1,"rgba(255,255,255,0)"),i.fillStyle=s,i.fillRect(0,0,64,64),this.texture=as.from(t),this.texture.source.scaleMode="linear"} + return this.texture} + facet(i,s,e,n,h,r,o){ + if(o<.003||this.used>=400)return; + let a=this.pool[this.used++]; + a||(a=new Ye(t.softLight()),a.anchor.set(.5),a.blendMode="add",a.eventMode="none",this.pool.push(a),this.addChild(a)),a.visible=!0,a.position.set(i,s),a.width=e,a.height=n,a.rotation=h,a.tint=r,a.alpha=o} + update(t,i,s,e,n,h,r){ + const o=2===n?1:0,a=[0,.32,1,.16][n]??0,c=this.initialized?1-Math.exp(.8*-t):1; + this.initialized=!0,this.moon+=(o-this.moon)*c,this.lantern+=(a-this.lantern)*c,this.used=0; + const l=Qt((t,i,s)=>r(t,i)&&r(t-.5*s,i)&&r(t+.5*s,i),"wet"); + if(this.moon>.01){ + const t=64,n=46; + for(let h=Math.floor((s.y-48)/n); + h<=Math.ceil((s.y+s.height+48)/n); + h++)for(let r=Math.floor((s.x-64)/t); + r<=Math.ceil((s.x+s.width+64)/t); + r++){ + let s=Math.imul(r,374761393)^Math.imul(h,668265263); + s=Math.imul(s^s>>>13,1274126177); + const o=(s>>>0)/4294967296,a=o*Math.PI*2,c=(r+.5)*t+25*Math.sin(7*a),u=(h+.5)*n+17*Math.cos(9*a),d=NNi(c,u,i,e),f=Math.pow(Math.max(0,Math.sin(i*(.43+.14*o)+a+.28*d.height)),3),p=(8+20*o)*(.8+.2*f),g=c+d.driftX,w=u-.9*d.height; + if(f<.025||!l(g,w,p))continue; + const m=.65+.35*Math.sin(.003*c+.0015*u)**2; + this.facet(g,w,p,1.1+.7*o,2*d.slopeX-.13,11914463,f*m*this.moon*.32)} + } + if(this.lantern>.01)for(const u of h.slice(0,24))if(!(u.x<s.x-80||u.x>s.x+s.width+80||u.y<s.y-80||u.y>s.y+s.height+80))for(let t=0; + t<11; + t++){ + const s=1.7*u.seed+2.39996*t,n=7+4.1*t,h=u.x+Math.sin(s)*(2+.72*t),r=u.y+n,o=NNi(h,r,i,e),a=.58+.42*Math.sin(.8*i+s+.6*o.height),c=(6+2*Math.sin(3*s)+.52*t)*(.8+.35*a),d=h+1.4*o.driftX+75*o.slopeX,f=r-o.height; + l(d,f,c)&&this.facet(d,f,c,1.5+.9*a,2*o.slopeX-.13,u.color,this.lantern*u.strength*(1-t/12)**1.5*(.18+.35*a))} + for(let u=this.used; + u<this.pool.length; + u++)this.pool[u].visible=!1; + this.visible=this.used>0} + } + ; + Qt(QLi,"FishingWaterLight"),Zt(QLi,"texture"); + let ZLi=QLi; + function tDi(t,i,s,e){ + const n=new Set; + return t.filter(t=>!(n.has(t.id)||!Number.isFinite(t.x)||!Number.isFinite(t.y))&&(n.add(t.id),t.x>=s.x&&t.x<=s.x+s.width&&t.y>=s.y&&t.y<=s.y+s.height)).map(t=>({ + boat:t,score:Math.max(0,Math.hypot(t.x-i.x,t.y-i.y)-(e.has(t.id)?45:0))} + )).sort((t,i)=>t.score-i.score||t.boat.id.localeCompare(i.boat.id)).slice(0,30).map(t=>t.boat)} + Qt(tDi,"nearbyBoats"); + const iDi=165,sDi="육지와 너무 가까워요 · 조금 더 넓은 물로 가요",eDi=[1,1.1,1.25,1.5],nDi=[1400,700],hDi=3e3,rDi=nDi[0]+250,oDi=.36,aDi=[60,76,92,108,124,140,158],cDi=[6,16,26],lDi=.135,uDi=.105,dDi=[.62,.55,.55,.55],fDi=new Map; + function pDi(t,i){ + let s=fDi.get(t); + if(!s){ + const e=t.frame; + s=new as({ + source:t.source,frame:new Ui(e.x,e.y,e.width,Math.round(e.height*(dDi[i]??.55)))} + ),fDi.set(t,s)} + return s} + Qt(pDi,"floatTop"); + const gDi=[0,.5,1,.65],wDi=[16765562,16751178,13172586,8377599,16748488,12164351,6287568,15922943],mDi=Qt(t=>{ + let i=2166136261; + for(let s=0; + s<t.length; + s++)i^=t.charCodeAt(s),i=Math.imul(i,16777619); + return i>>>0} + ,"strHash"),vDi=Qt(t=>wDi[mDi(t)%wDi.length],"lanternColor"),_Di=.29,MDi=Qt(t=>Math.max(0,["m","b","e"].indexOf(t.slice(-1))),"guestIndex"),bDi=Math.round(37.5)+16,yDi=1.7*_Di,EDi={ + "인간":15909198,"엘프":7327615,"언데드":10849535,"오크":3975360} + ; + function ADi(t,i,s,e,n){ + const h=NDi[e],r=LDi[n],o=new Float32Array(t*i); + for(let f=0; + f<i; + f++)for(let i=0; + i<t; + i++)o[f*t+i]=s(i,f)?0:1e9; + const a=Qt((s,e,n,h,r)=>{ + const a=s+n,c=e+h; + if(a<0||c<0||a>=i||c>=t)return; + const l=s*t+e,u=o[a*t+c]+r; + u<o[l]&&(o[l]=u)} + ,"relax"); + for(let f=0; + f<i; + f++)for(let i=0; + i<t; + i++)a(f,i,0,-1,1),a(f,i,-1,0,1),a(f,i,-1,-1,1.414),a(f,i,-1,1,1.414); + for(let f=i-1; + f>=0; + f--)for(let i=t-1; + i>=0; + i--)a(f,i,0,1,1),a(f,i,1,0,1),a(f,i,1,1,1.414),a(f,i,1,-1,1.414); + const c=Qt(t=>{ + let i=h[r[0][1]]; + for(let s=1; + s<r.length; + s++){ + const[e]=r[s-1],[n,o,a]=r[s],c=i,l=h[o].map((t,i)=>c[i]+(t-c[i])*a); + if(t<=e)break; + const u=Math.min(1,(t-e)/(n-e)),d=u*u*(3-2*u); + if(i=c.map((t,i)=>t+(l[i]-t)*d),t<n)break} + return i} + ,"colorAt"),l=document.createElement("canvas"); + l.width=t,l.height=i; + const u=l.getContext("2d"),d=u.createImageData(t,i); + for(let f=0; + f<i; + f++)for(let i=0; + i<t; + i++){ + const s=c(Math.max(0,o[f*t+i]-.5)),e=4*(f*t+i); + d.data[e]=s[0],d.data[e+1]=s[1],d.data[e+2]=s[2],d.data[e+3]=255} + return u.putImageData(d,0,0),{ + canvas:l,dist:o} + } + Qt(ADi,"waterCanvas"); + const SDi={ + whale:{ + L:520,rope:!0,amp:.006,tailPow:3,wave:.8,freq:.2,speed:30,turn:.065,rMin:2.2,wn:.45,alpha:.38,need:230} + ,manta:{ + L:280,rope:!1,amp:0,tailPow:1,wave:0,freq:.23,speed:32,turn:.16,rMin:1.5,wn:.6,alpha:.36,need:180} + ,shark:{ + L:230,rope:!0,amp:.04,tailPow:2.4,wave:2.8,freq:.65,speed:42,turn:.24,rMin:1.35,wn:.8,alpha:.38,need:120} + ,catfish:{ + L:170,rope:!0,amp:.04,tailPow:2,wave:1.8,freq:.5,speed:20,turn:.25,rMin:.55,wn:.7,alpha:.42,need:90} + ,eel:{ + L:170,rope:!0,amp:.05,tailPow:1,wave:3.6,freq:.45,speed:22,turn:.35,rMin:.4,wn:.9,alpha:.38,need:60} + ,megalodon:{ + L:900,rope:!0,amp:.03,tailPow:3,wave:3.2,freq:.08,speed:31,turn:.035,rMin:2.8,wn:.32,alpha:.36,need:300} + ,whaleShark:{ + L:440,rope:!0,amp:.035,tailPow:3,wave:3.2,freq:.12,speed:25,turn:.075,rMin:2,wn:.45,alpha:.43,need:190} + ,turtle:{ + L:112,rope:!1,amp:0,tailPow:1,wave:0,freq:.12,speed:15,turn:.12,rMin:1.7,wn:.55,alpha:.44,need:85} + ,sturgeon:{ + L:245,rope:!0,amp:.04,tailPow:2.4,wave:4.6,freq:.18,speed:21,turn:.16,rMin:1.3,wn:.65,alpha:.43,need:100} + } + ,TDi={ + O:{ + kinds:[["whale",.23],["manta",.2],["shark",.17],["whaleShark",.22],["turtle",.1],["megalodon",.08]],first:[12,25],every:[40,80],under:.3,scale:1} + ,C:{ + kinds:[["shark",.28],["manta",.24],["turtle",.4],["whaleShark",.08]],first:[45,70],every:[90,170],under:.25,scale:.8} + ,R:{ + kinds:[["catfish",.44],["eel",.28],["sturgeon",.28]],first:[100,160],every:[200,360],under:.2,scale:1} + } + ,CDi=.95,ODi=[.95,.84,.73,.62,.51,.4,.29,.18,.12],IDi=[1,.85,0,.6],kDi=[16774358,16761486,12900607,16769772],RDi=[{ + color:16777215,alpha:.2} + ,{ + color:16756848,alpha:.22} + ,{ + color:9416959,alpha:.08} + ,{ + color:15791359,alpha:.14} + ],xDi=[{ + color:16777215,alpha:0} + ,{ + color:16747082,alpha:.16} + ,{ + color:726848,alpha:.52} + ,{ + color:14674154,alpha:.12} + ],PDi=[0,0,0,.55],NDi={ + "인간":{ + shallow:[126,208,214],mid:[58,162,198],deep:[26,104,162],abyss:[14,44,104],riverShallow:[126,208,214],riverDeep:[62,142,168],land:[128,168,92]} + ,"엘프":{ + shallow:[128,222,196],mid:[52,168,172],deep:[22,104,136],abyss:[12,46,92],riverShallow:[128,222,196],riverDeep:[58,138,136],land:[84,158,88]} + ,"언데드":{ + shallow:[120,150,144],mid:[74,110,118],deep:[36,62,82],abyss:[16,26,50],riverShallow:[120,150,144],riverDeep:[64,88,92],land:[92,88,104]} + ,"오크":{ + shallow:[152,208,228],mid:[84,162,206],deep:[32,96,154],abyss:[14,42,94],riverShallow:[152,208,228],riverDeep:[70,126,160],land:[222,232,238]} + } + ,LDi={ + R:[[0,"riverShallow",1],[2.5,"riverDeep",1]],C:[[0,"shallow",1],[2,"mid",1],[6,"deep",1],[16,"abyss",.45]],O:[[0,"shallow",1],[2,"mid",1],[6,"deep",1],[14,"abyss",.6],[26,"abyss",1]]} + ,DDi=.72,GDi=[18e3,55e3],BDi=Qt((t,i)=>{ + let s=t-i; + for(; + s>Math.PI; + )s-=2*Math.PI; + for(; + s<-Math.PI; + )s+=2*Math.PI; + return s} + ,"angDiff"),UDi=class t extends Ve{ + constructor(i,s=t.DEFAULT_H){ + super(),Zt(this,"world",new Ve),Zt(this,"mapSprite",new Ye(as.EMPTY)),Zt(this,"chunkLayer",new Ve),Zt(this,"chunks",new Map),Zt(this,"shadowLayer",new Ve),Zt(this,"underLayer",new Ve),Zt(this,"giantLayer",new Ve),Zt(this,"giants",[]),Zt(this,"school",new GLi),Zt(this,"nextSchoolAt",0),Zt(this,"nextGiantAt",0),Zt(this,"giantSeen",!1),Zt(this,"landDist",null),Zt(this,"othersLayer",new Ve),Zt(this,"otherNames",new Ve),Zt(this,"others",new Map),Zt(this,"otherCandidates",[]),Zt(this,"otherPickAt",0),Zt(this,"boatWater",new WNi),Zt(this,"hullPose",GNi(0,0,0,0,"R",0,0)),Zt(this,"bobberWave",0),Zt(this,"floatLandedAt",-1/0),Zt(this,"boatShadow",new ip),Zt(this,"boat",new Ye(as.EMPTY)),Zt(this,"angler",new Ye(as.EMPTY)),Zt(this,"myLookRaw"),Zt(this,"myTop",null),Zt(this,"anglerRot",0),Zt(this,"lamp",new Ye(as.EMPTY)),Zt(this,"floatSp",new Ye(as.EMPTY)),Zt(this,"bobberLv",0),Zt(this,"rodTip",{ + x:0,y:0} + ),Zt(this,"lampAt",{ + x:0,y:0} + ),Zt(this,"lightLayer",new Ve),Zt(this,"lightClip",new ip),Zt(this,"lightPool",[]),Zt(this,"lightUsed",0),Zt(this,"waterLight",new ZLi),Zt(this,"myColor",vDi(EG.userId||"me")),Zt(this,"line",new ip),Zt(this,"float",new ip),Zt(this,"fx",new ip),Zt(this,"fxAdd",new ip),Zt(this,"flyLayer",new Ve),Zt(this,"hitLayer",new Ve),Zt(this,"worldTop",new Ve),Zt(this,"harpoonFxs",[]),Zt(this,"aimMark",null),Zt(this,"shakeAmp",0),Zt(this,"shakeUntil",0),Zt(this,"birds",new JLi),Zt(this,"birdClip",new ip),Zt(this,"labels",new Ve),Zt(this,"tideTint",new ip),Zt(this,"clip",new ip),Zt(this,"frame",new ip),Zt(this,"hint",new Ve),Zt(this,"hud",new Ve),Zt(this,"key",""),Zt(this,"info",null),Zt(this,"landBits",null),Zt(this,"race","인간"),Zt(this,"zone","R"),Zt(this,"point",0),Zt(this,"boatLv",0),Zt(this,"bx",0),Zt(this,"by",0),Zt(this,"heading",-Math.PI/2),Zt(this,"speed",0),Zt(this,"target",null),Zt(this,"route",[]),Zt(this,"nav",null),Zt(this,"stuckFor",0),Zt(this,"replanned",!1),Zt(this,"fxp",{ + x:0,y:0} + ),Zt(this,"floatLift",0),Zt(this,"floatVisible",!1),Zt(this,"camX",0),Zt(this,"camY",0),Zt(this,"bite",!1),Zt(this,"biteIn",1/0),Zt(this,"biteInAt",0),Zt(this,"tide",0),Zt(this,"shadows",[]),Zt(this,"ripples",[]),Zt(this,"particles",[]),Zt(this,"foam",[]),Zt(this,"crowns",[]),Zt(this,"foamLayer",new Ve),Zt(this,"foamPool",[]),Zt(this,"foamUsed",0),Zt(this,"glints",new Ve),Zt(this,"glintList",[]),Zt(this,"glintPool",[]),Zt(this,"sun",new Ye(as.EMPTY)),Zt(this,"vignette",new Ye(as.EMPTY)),Zt(this,"fogOfWar",new Ye(as.EMPTY)),Zt(this,"fogCanvas",null),Zt(this,"fogTex",null),Zt(this,"fogBits",null),Zt(this,"fogStore",""),Zt(this,"fogCell",-1),Zt(this,"miniFog",new Ye(as.EMPTY)),Zt(this,"bigFog",new Ye(as.EMPTY)),Zt(this,"miniTerr",new Ye(as.EMPTY)),Zt(this,"bigTerr",new Ye(as.EMPTY)),Zt(this,"terrCanvas",[null,null]),Zt(this,"terrTex",[null,null]),Zt(this,"fog",null),Zt(this,"reel",null),Zt(this,"catchTl",null),Zt(this,"castTween",null),Zt(this,"retrieveTween",null),Zt(this,"departAt",0),Zt(this,"reelPull",!1),Zt(this,"running",!1),Zt(this,"lastTime",0),Zt(this,"startAt",performance.now()),Zt(this,"busyUntil",0),Zt(this,"nibbleSeen",-1),Zt(this,"onTapBefore",null),Zt(this,"onStopAtPoint",null),Zt(this,"onFrame",Qt(()=>this.drawMotion(performance.now()-this.startAt),"onFrame")),Zt(this,"startInSail",null),Zt(this,"rodHold",!1),Zt(this,"mode","fish"),Zt(this,"modeBtn",new Ve),Zt(this,"modeBg",new ip),Zt(this,"modeIcons",{ + fish:yki("hook",22,16777215),sail:yki("boat",22,16777215)} + ),Zt(this,"modeText",rki("",jIi,13)),Zt(this,"onCast",null),Zt(this,"onModeChange",null),Zt(this,"hintTween",null),Zt(this,"foundMask",0),Zt(this,"zoneNow",-1),Zt(this,"zoneBanner",new Ve),Zt(this,"zoneTween",null),Zt(this,"fogRun",0),Zt(this,"glide",{ + dx:0,dy:0,at:0,ms:0} + ),Zt(this,"mapFogCanvas",null),Zt(this,"mapFogTex",null),Zt(this,"nextFishAt",0),Zt(this,"rockUntil",0),Zt(this,"devWhaleBox",null),Zt(this,"nibbler",null),Zt(this,"nibbleRolled",0),Zt(this,"verts",null),Zt(this,"terr",null),Zt(this,"tileLayer",new Ve),Zt(this,"shoreLayer",new Ve),Zt(this,"shoreFoamLayer",new Ve),Zt(this,"propLayer",new Ve),Zt(this,"regions",new Map),Zt(this,"shoreRuns",new Map),Zt(this,"water",null),Zt(this,"surf",[]),Zt(this,"miniMap",new Ve),Zt(this,"miniImg",new Ye(as.EMPTY)),Zt(this,"miniBg",new ip),Zt(this,"miniDots",new ip),Zt(this,"miniGoal",new ip),Zt(this,"bigGoal",new ip),Zt(this,"bigMap",new Ve),Zt(this,"bigImg",new Ye(as.EMPTY)),Zt(this,"bigDots",new ip),Zt(this,"bigLabels",new Ve),Zt(this,"bigDim",new ip),Zt(this,"bigClose",new pki("닫기",132,46,16)),Zt(this,"bigTip",mki("가고 싶은 곳을 누르면 배가 출발해요",16777215,QIi,12,9)),Zt(this,"miniTex",null),Zt(this,"miniMe",new ip),Zt(this,"miniView",new ip),Zt(this,"miniTarget",new ip),Zt(this,"bigMe",new ip),Zt(this,"bigTarget",new ip),Zt(this,"bigOthers",new ip),Zt(this,"markSig",""),Zt(this,"bigOthersAt",0),Zt(this,"npcLayer",new Ve),Zt(this,"npcTags",new Ve),Zt(this,"npcs",[]),Zt(this,"npcSig",""),Zt(this,"npcSpots",[]),Zt(this,"onVisitorTap",null),Zt(this,"onHubTap",null),Zt(this,"onHubArrive",null),Zt(this,"hubLayer",new Ve),Zt(this,"hubs",[]),Zt(this,"hubViews",new Map),Zt(this,"hubPlaces",new Map),Zt(this,"hubSig",""),Zt(this,"goal",null),Zt(this,"goalSig",""),Zt(this,"goalMarks",new ip),Zt(this,"goalArrow",new Ve),Zt(this,"goalArrowHead",new ip),Zt(this,"goalArrowText",""),Zt(this,"chunkKey",""),Zt(this,"othersFloats",new Ve),Zt(this,"othersWater",new Ve),Zt(this,"othersLines",new ip),Zt(this,"onOtherTap",null),Zt(this,"speedBonus",0),Zt(this,"sailBlock",null),Zt(this,"repairFx",new $Pi({ + angler:lDi} + )),Zt(this,"fixingNow",!1),Zt(this,"afterFixAt",0),Zt(this,"plunderG",new ip),Zt(this,"ropes",[]),Zt(this,"plunderFocus",null),Zt(this,"snaps",[]),Zt(this,"tut",!1),Zt(this,"tutorialMoveBtn",!1),Zt(this,"modeBtnHidden",!1),Zt(this,"tutorialRing",null),Zt(this,"tutorialRingScale",1),Zt(this,"tutorialLift",0),Zt(this,"rodBalloon",new Ve),Zt(this,"rodBalloonOn",!1),Zt(this,"rodBubble",new Ye(as.EMPTY)),Zt(this,"pointSyncUntil",0),Zt(this,"dockAt",0),Zt(this,"dockShown",0),this.viewW=i,this.viewH=s,this.on("removed",()=>this.cancelHarpoon()); + for(const t of[this.boatShadow,this.line,this.float,this.fx,this.fxAdd,this.tideTint,this.frame,this.glints])t.eventMode="none"; + this.glints.eventMode="none",this.shadowLayer.eventMode=this.flyLayer.eventMode=this.labels.eventMode=this.foamLayer.eventMode="none",this.underLayer.eventMode=this.giantLayer.eventMode="none",this.underLayer.addChild(this.giantLayer,this.shadowLayer,this.school),this.fxAdd.blendMode="add",this.boat.anchor.set(.5),this.boat.eventMode="none",this.angler.eventMode=this.lamp.eventMode=this.floatSp.eventMode="none",this.lamp.anchor.set(.5),this.floatSp.visible=!1,this.lightLayer.eventMode="none",this.lightLayer.mask=this.lightClip,this.birdClip.eventMode="none",this.birds.sky.mask=this.birdClip,this.chunkLayer.eventMode="none",this.othersLayer.eventMode=this.otherNames.eventMode=this.othersFloats.eventMode=this.othersLines.eventMode=this.othersWater.eventMode=this.plunderG.eventMode="none",this.tileLayer.eventMode="none",this.shoreFoamLayer.eventMode=this.shoreLayer.eventMode=this.propLayer.eventMode="none",this.npcLayer.eventMode=this.npcTags.eventMode=this.hubLayer.eventMode=this.goalMarks.eventMode=this.goalArrow.eventMode="none",this.world.addChild(this.mapSprite,this.tileLayer,this.shoreFoamLayer,this.shoreLayer,this.chunkLayer,this.glints,this.waterLight,this.birds.shadows,this.propLayer,this.npcLayer,this.hubLayer,this.othersWater,this.othersLayer,this.othersFloats,this.othersLines,this.plunderG,this.boatWater,this.foamLayer,this.boatShadow,this.line,this.float,this.floatSp,this.boat,this.angler,this.lamp,this.fx,this.fxAdd,this.flyLayer,this.otherNames,this.hitLayer,this.npcTags,this.fogOfWar,this.goalMarks,this.labels,this.rodBalloon),this.world.addChildAt(this.repairFx.under,this.world.getChildIndex(this.boatWater)),this.world.addChildAt(this.repairFx.over,this.world.getChildIndex(this.otherNames)),this.repairFx.onSound=t=>{ + try{ + qG.getInstance().playSFX("finish"===t?qG.SFX_GOLD_GOBLIN:qG.SFX_WOOD_MALLET,"finish"===t?.5:"help"===t?.35:.22)} + catch{ + } + } + ,this.world.mask=this.clip,this.tideTint.alpha=0; + const[e,n]=t.lightTextures(); + this.sun.texture=e,this.vignette.texture=n,this.sun.anchor.set(.5),this.sun.blendMode="add",this.sun.eventMode="none",this.vignette.eventMode="none",this.hint.eventMode=this.zoneBanner.eventMode="none",this.buildModeButton(),this.buildRodBalloon(),this.buildMinimap(),this.hud.addChild(this.hint,this.goalArrow,this.modeBtn,this.miniMap),this.worldTop.eventMode="none",this.addChild(this.world,this.clip,this.sun,this.vignette,this.birdClip,this.birds.sky,this.tideTint,this.lightClip,this.lightLayer,this.worldTop,this.zoneBanner,this.hud,this.bigMap,this.frame),this.layoutView(),this.setMode("fish"),this.eventMode="static",this.cursor="pointer",this.on("pointertap",t=>{ + var i,s,e; + const n=this.world.toLocal(t.global); + if(this.rodBalloonHit(n.x,n.y))return t.stopPropagation(),this.hideRodBalloon(),this.hint.visible=!1,void this.arrive(); + const h=this.hubAt(n.x,n.y); + if(h)return t.stopPropagation(),void(null==(i=this.onHubTap)||i.call(this,h,this.hubNear(h))); + const r="fish"===this.mode?this.npcAt(n.x,n.y):null; + if(r)return t.stopPropagation(),void(null==(s=this.onVisitorTap)||s.call(this,r)); + if(null==(e=this.onTapBefore)?void 0:e.call(this))return void t.stopPropagation(); + const o=this.otherAt(n.x,n.y); + if(o&&this.onOtherTap)return t.stopPropagation(),void this.onOtherTap(o.a,Math.hypot(o.x-this.bx,o.y-this.by)<=bOi); + const a=this.world.toLocal(t.global); + this.tapAt(a.x,a.y),t.stopPropagation()} + )} + resize(t,i){ + if(t!==this.viewW||i!==this.viewH){ + this.viewW=t,this.viewH=i,this.layoutView(); + for(const s of this.surf)s.width=t+128,s.height=i+128; + this.fog&&(this.fog.width=t,this.fog.height=i),this.miniImg.texture!==as.EMPTY&&this.miniMap.position.set(10,i-this.miniImg.height-18),this.markSig="",this.bigMap.visible&&this.info&&this.buildMinimapTexture(),this.hint.visible&&this.hint.position.set((t-this.hint.width)/2,i-this.hint.height-12)} + } + setHudAlpha(t){ + this.tut?this.applyTutorialHud():(this.hud.alpha=t,this.hud.visible=t>.01)} + layoutView(){ + const t=this.viewW,i=this.viewH; + for(const s of[this.lightClip,this.birdClip,this.clip,this.tideTint])s.clear().rect(0,0,t,i).fill(16777215); + this.sun.width=1.5*t,this.sun.height=1.1*i,this.vignette.width=t,this.vignette.height=i,this.hitArea=new Ui(0,0,t,i),this.modeBtn.position.set(t-58,i-32-(this.tut?this.tutorialLift:0)),this.bigDim.clear().rect(0,0,t,i).fill({ + color:526346,alpha:.82} + ),this.bigClose.position.set((t-132)/2,i-46-14),this.bigTip.position.set((t-this.bigTip.width)/2,i-46-14-this.bigTip.height-8),this.bigMap.hitArea=new Ui(0,0,t,i)} + get floatX(){ + return this.fxp.x+this.world.x} + get floatY(){ + return this.fxp.y+this.world.y-8} + get sailing(){ + return"sail"===this.mode||!!this.target||this.speed>1} + get bigMapOpen(){ + return this.bigMap.visible} + closeBigMap(){ + this.bigMap.visible&&this.openBigMap(!1)} + get mapKey(){ + return this.info?this.key:""} + get idleInSail(){ + return"sail"===this.mode&&!this.target&&this.speed<=1} + get rodShown(){ + return this.rodBalloonOn} + get boatSprite(){ + return this.boat} + get rodBalloonView(){ + return this.rodBalloon} + get fishing(){ + return!this.sailing&&(this.floatVisible||!!this.reel||!!this.catchTl)} + start(){ + this.running||(this.running=!0,this.lastTime=performance.now()-this.startAt,ES.app.ticker.add(this.onFrame))} + stop(){ + this.cancelHarpoon(),this.running=!1,ES.app.ticker.remove(this.onFrame)} + update(i,s,e,n,h=1/0,r){ + if(this.bite=n,this.biteIn=h,this.biteInAt=performance.now(),r&&r.boat!==this.boatLv&&(this.boatLv=r.boat,this.boat.texture=nAi.boat(this.boatLv),this.lamp.texture=nAi.gear().lanterns[t.lampGrade(this.boatLv)]),this.boat.texture===as.EMPTY&&(this.boat.texture=nAi.boat(this.boatLv),this.lamp.texture=nAi.gear().lanterns[t.lampGrade(this.boatLv)]),r&&(r.bobber!==this.bobberLv||this.floatSp.texture===as.EMPTY)){ + this.bobberLv=Math.min(3,r.bobber); + const t=nAi.gear(); + this.floatSp.texture=pDi(t.floats[this.bobberLv],this.bobberLv),this.floatSp.anchor.set(.5,1)} + if(s!==this.tide||0===this.tideTint.alpha){ + this.tide=s; + const t=xDi[s]; + this.tideTint.tint=t.color,this.tideTint.alpha=t.alpha; + const i=RDi[s]; + this.sun.tint=i.color,this.sun.alpha=i.alpha} + const o=`${ + i.race} + |${ + i.zone} + `; + o!==this.key?(this.key=o,this.loadMap(i)):this.fogRun!==WTi.runId()&&this.fogBits?(this.fogRun=WTi.runId(),this.initFog(),this.foundMask=WTi.found(this.key),this.updateFog(!0)):i.point===this.point?this.pointSyncUntil=0:!this.target&&performance.now()>this.pointSyncUntil&&(this.point=i.point,this.teleport(i.point)),this.running||this.drawMotion(e)} + async loadMap(t){ + this.cancelHarpoon(),this.race=t.race,this.zone=t.zone,this.point=t.point,this.otherCandidates=[],this.otherPickAt=0; + for(const i of this.others.values())this.dropOtherBoat(i); + this.others.clear(),this.info=nAi.topdownInfo(this.key),this.foundMask=WTi.found(this.key),this.zoneNow=-1,this.clearGiants(),this.birds.reset(t.zone); + { + const i=TDi[t.zone].first; + this.nextGiantAt=performance.now()+1e3*(i[0]+Math.random()*(i[1]-i[0]))} + if(this.school.clear(),this.nextSchoolAt=performance.now()+1e3*dLi(!0,Math.random),this.nav=null,this.route=[],this.clearChunks(),this.clearTiles(),"tile"===this.info.type){ + this.landBits=null,this.verts=Uint8Array.from(atob(this.info.verts),t=>t.charCodeAt(0)),this.buildWater(); + const t=this.info,i=await nAi.terrain(t.terrain); + if(this.info!==t)return; + this.terr=i,this.buildShore(),this.placeNpcShips(),this.hubSig="",this.hubPlaces.clear(),this.initFog()} + else this.verts=null,this.landBits=Uint8Array.from(atob(this.info.land),t=>t.charCodeAt(0)); + if(this.info.chunk||"tile"===this.info.type)this.mapSprite.texture=as.EMPTY; + else{ + const t=await nAi.topdownMap(this.key); + if(this.info!==nAi.topdownInfo(`${ + this.race} + |${ + this.zone} + `))return; + this.mapSprite.texture=t} + this.drawStatic(),this.buildMinimapTexture(),this.teleport(t.point),this.spawnShadows()} + teleport(t){ + var i,s; + if(!(null==(i=this.info)?void 0:i.points[t]))return; + const e=this.startSpot(t); + this.bx=e.bx,this.by=e.by,this.target=null,this.route=[],this.speed=0,this.heading=-Math.PI/4,this.boatWater.reset(),this.foam=[],this.crowns=[],this.bobberWave=0; + for(const n of this.glintList)n.sp.visible=!1,this.glints.removeChild(n.sp),this.glintPool.push(n.sp); + this.glintList=[],this.dockAt=0,this.hideRodBalloon(),(null==(s=this.startInSail)?void 0:s.call(this))?"sail"!==this.mode?this.setMode("sail"):this.dock():("fish"!==this.mode&&this.setMode("fish"),this.cast(e.fx,e.fy,!0)),this.camX=this.bx,this.camY=this.by,this.updateFog(!0)} + startSpot(t){ + const i=this.info.points[t],s=this.labels.children.find(i=>i.label===String(t)),e=18+(s?s.width/2:60),n=18+(s?s.height/2:15),h=Qt((t,s,h)=>Math.abs(t-i.x)>e+h||Math.abs(s-i.y)>n+h,"clear"); + for(const a of[!0,!1])for(const s of a?[130,160,105,190,230,270,80]:[130,160,105,190])for(const e of[100,80,125,55,150,30,180,0,210,330,240,300,270]){ + const n=e*Math.PI/180,r=i.x+Math.cos(n)*s,o=i.y+Math.sin(n)*s; + if(!h(r,o,26)||this.isLand(r,o)||sNi.at(this.key,r,o)!==t)continue; + if(a?!this.boatCanFish(r,o):this.shoreDist(r,o)<30)continue; + const c=Math.atan2(o-i.y,r-i.x); + for(const t of[.5,-.5,0,1,-1]){ + const i=c+t,s=r+80*Math.cos(i),e=o+80*Math.sin(i); + if(h(s,e,10)&&(a?this.floatOk(s,e):!this.isLand(s,e)&&this.shoreDist(s,e)>=40))return{ + bx:r,by:o,fx:s,fy:e} + } + } + let r=i.x-70,o=i.y+40; + return this.isLand(r,o)&&(r=i.x,o=i.y+70),this.isLand(r,o)&&(r=i.x,o=i.y),{ + bx:r,by:o,fx:i.x+20,fy:i.y-10} + } + sailTo(t,i){ + var s; + if(!this.info)return!1; + const e=null==(s=this.sailBlock)?void 0:s.call(this); + if(e)return this.showHint(e,!0),!1; + !this.nav&&this.verts&&(this.nav=new hNi(this.info.w,this.info.h,(t,i)=>this.isLand(t,i))); + const n=this.nav?this.nav.find(this.bx,this.by,t,i):[{ + x:t,y:i} + ]; + return n&&n.length?(this.route=n,this.target=n[n.length-1],this.stuckFor=0,this.replanned=!1,this.dockAt=0,this.departAt=Math.max(this.departAt,performance.now()+this.reelIn()),!0):(this.showHint("그곳으로 이어진 물길이 없어요",!0),!1)} + reelIn(){ + var t; + if(this.catchTl){ + const t=this.catchTl; + this.catchTl=null,t.progress(1)} + if(this.reel=null,this.reelPull=!1,null==(t=this.castTween)||t.kill(),this.castTween=null,!this.floatVisible||this.retrieveTween)return this.floatLift=0,this.retrieveTween?200:0; + const i={ + ...this.fxp} + ,s={ + p:0} + ; + return this.splash(i.x,i.y,3,15004914),this.retrieveTween=MR.to(s,{ + p:1,duration:.24,ease:"power2.in",onUpdate:Qt(()=>{ + const t=this.rodTip; + this.fxp={ + x:i.x+(t.x-i.x)*s.p,y:i.y+(t.y-i.y)*s.p} + ,this.floatLift=12*Math.sin(s.p*Math.PI)} + ,"onUpdate"),onComplete:Qt(()=>{ + this.floatVisible=!1,this.floatLift=0,this.retrieveTween=null} + ,"onComplete")} + ),260} + sailToHub(t){ + const i=this.hubPlaces.get(t); + return!!i&&("sail"!==this.mode&&this.setMode("sail"),!!this.sailTo(i.dx,i.dy)&&(this.hideRodBalloon(),this.marker(i.dx,i.dy,16777215),!0))} + tapAt(i,s){ + if(this.info){ + if("sail"===this.mode){ + if(this.isLand(i,s))return void this.marker(i,s,16751752); + if(!this.sailTo(i,s))return; + return this.marker(i,s,16777215),t.hintSeen=!0,this.hideRodBalloon(),void this.showHint("가는 중 · 멈추면 낚싯대 풍선을 눌러 낚시 시작",!1,!0)} + MR.fromTo(this.modeBtn.scale,{ + x:1.25,y:1.25} + ,{ + x:1,y:1,duration:.45,ease:"elastic.out(1.2, 0.4)"} + ),this.showHint("배를 옮기려면 오른쪽 아래 [이동]을 눌러요",!0)} + } + buildModeButton(){ + const t=this.modeBtn; + t.addChild(this.modeBg,this.modeIcons.fish,this.modeIcons.sail,this.modeText); + for(const i of Object.values(this.modeIcons))i.position.set(12,11); + this.modeText.position.set(40,13),t.eventMode="static",t.cursor="pointer",t.hitArea=new Ui(0,0,96,44),t.pivot.set(48,22),t.on("pointertap",t=>{ + t.stopPropagation(),"fish"!==this.mode?this.fixingNow?this.showHint("배를 다 고친 뒤에 낚시해요",!0):this.target?this.showHint("멈추면 머리 위 낚싯대 풍선을 눌러 낚시 시작",!0):(this.dockAt=0,this.showRodBalloon()):this.setMode("sail")} + )} + setMode(t){ + var i; + const s=t!==this.mode; + this.mode=t; + const e="sail"===t; + this.modeBg.clear().roundRect(0,0,96,44,12).fill(e?6012341:VIi),this.modeIcons.fish.visible=!1,this.modeIcons.sail.visible=!0; + for(const n of Object.values(this.modeIcons))n.tint=jIi; + this.modeText.text=e?"이동 중":"이동",e?(this.departAt=Math.max(this.departAt,performance.now()+this.reelIn()),this.showHint("가고 싶은 곳을 누르세요",!1),this.target||this.dock()):(this.hideRodBalloon(),this.dockAt=0,this.showHint("느낌표(!)가 뜨면 눌러요 · 그냥 두면 입질 두 번에 한 마리",!1)),s&&(null==(i=this.onModeChange)||i.call(this,e))} + showHint(i,s,e=!1){ + var n; + if(this.tut)return void(this.hint.visible=!1); + if(!e&&!s&&t.hintSeen&&"fish"===this.mode)return void(this.hint.visible=!1); + this.hint.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const h=mki(i,16777215,QIi,12,9); + h.alpha=.9,this.hint.addChild(h),this.hint.position.set((this.viewW-h.width)/2,this.viewH-h.height-12),this.hint.visible=!0,this.hint.alpha=1,null==(n=this.hintTween)||n.kill(),s&&(this.hintTween=MR.timeline().to(this.hint,{ + alpha:0,duration:.4,delay:1.8} + ))} + marker(t,i,s){ + this.ripples.push({ + x:t,y:i,age:0,life:.6,r0:4,r1:18,alpha:.8} + ),16777215!==s&&this.ripples.push({ + x:t,y:i,age:0,life:.4,r0:2,r1:10,alpha:.9} + )} + cast(t,i,s,e=!0){ + var n,h,r; + if(this.fixingNow)return; + const o=Math.hypot(t-this.bx,i-this.by); + if(o>iDi&&(t=this.bx+(t-this.bx)*iDi/o,i=this.by+(i-this.by)*iDi/o),!this.floatOk(t,i))return; + if(null==(n=this.castTween)||n.kill(),this.castTween=null,null==(h=this.retrieveTween)||h.kill(),this.retrieveTween=null,this.floatLandedAt=-1/0,s)return this.fxp={ + x:t,y:i} + ,this.floatLift=0,void(this.floatVisible=!0); + const a={ + ...this.rodTip} + ,c={ + p:0} + ,l=.34+.2*Math.min(1,o/iDi),u=18+.12*Math.min(o,iDi); + e&&(null==(r=this.onCast)||r.call(this)),this.fxp={ + ...a} + ,this.floatLift=0,this.floatVisible=!0,this.busyUntil=performance.now()+1e3*l+150,this.castTween=MR.to(c,{ + p:1,duration:l,ease:"none",onUpdate:Qt(()=>{ + this.fxp={ + x:a.x+(t-a.x)*c.p,y:a.y+(i-a.y)*c.p} + ,this.floatLift=4*u*c.p*(1-c.p)} + ,"onUpdate"),onComplete:Qt(()=>{ + this.castTween=null,this.floatLift=0,this.floatLandedAt=performance.now(),this.splash(t,i,3,15004914,12),this.ripples.push({ + x:t,y:i,age:0,life:1.4,r0:3,r1:17,alpha:.35} + )} + ,"onComplete")} + )} + isLand(t,i){ + const s=this.info; + if(!s)return!1; + if(t<8||i<8||t>s.w-8||i>s.h-8)return!0; + if(this.verts){ + const e=s.tile,n=t/e,h=i/e,r=Math.floor(n),o=Math.floor(h),a=n-r,c=h-o; + return(this.vert(r,o)*(1-a)+this.vert(r+1,o)*a)*(1-c)+(this.vert(r,o+1)*(1-a)+this.vert(r+1,o+1)*a)*c>.5} + const e=this.landBits; + if(!e)return!1; + const n=Math.floor(t/s.cell),h=Math.floor(i/s.cell)*s.cols+n; + return 1==(e[h>>3]>>(7&h)&1)} + known(t){ + var i; + const s=null==(i=this.info)?void 0:i.points[t]; + return!(!s||0!==t&&t!==this.point&&1&~(this.foundMask>>t)&&this.unexplored(s.x,s.y))} + knownSig(){ + var t; + return((null==(t=this.info)?void 0:t.points)??[]).map((t,i)=>this.known(i)?1:0).join("")} + nearestPoint(){ + return sNi.at(this.key,this.bx,this.by)} + trackZone(){ + var t; + if(!(null==(t=this.info)?void 0:t.points.length))return; + const i=this.nearestPoint(); + if(i===this.zoneNow)return; + const s=this.zoneNow<0; + this.zoneNow=i; + const e=!this.known(i); + WTi.markFound(this.key,i)&&(this.foundMask=WTi.found(this.key)),s||this.showZone(i,e)} + showZone(t,i){ + var s; + const e=this.zoneBanner; + e.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const n=rki(RSi(this.race,this.zone,t),16777215,20),h=`난이도 ${ + QSi({ + zone:this.zone,point:t} + )} + `,r=rki(i?`새 수역을 찾았어요 · ${ + h} + `:`${ + t+1} + 번 수역 · ${ + h} + `,i?VIi:13229279,12),o=Math.max(n.width,r.width)+44,a=(new ip).roundRect(0,0,o,58,12).fill({ + color:QIi,alpha:.78} + ); + n.position.set((o-n.width)/2,9),r.position.set((o-r.width)/2,36),e.addChild(a,n,r),e.position.set((this.viewW-o)/2,170),e.visible=!0,null==(s=this.zoneTween)||s.kill(),this.zoneTween=MR.timeline().fromTo(e,{ + alpha:0} + ,{ + alpha:1,duration:.25} + ).to(e,{ + alpha:0,duration:.5,delay:i?2.2:1.4,onComplete:Qt(()=>{ + e.visible=!1} + ,"onComplete")} + ),i&&jG("light")} + drawStatic(){ + var t; + const i=this.labels; + i.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),null==(t=this.info)||t.points.forEach((t,s)=>{ + const e=mki(RSi(this.race,this.zone,s),16777215,QIi,13,9); + e.alpha=.9,e.position.set(t.x-e.width/2,t.y-e.height/2),e.label=String(s),i.addChild(e)} + )} + spawnShadows(){ + this.shadowLayer.removeChildren().forEach(t=>t.destroy()),this.shadows=[],this.nibbler=null,this.nextFishAt=0} + drawMotion(t){ + var i; + const s=Math.min(.05,Math.max(0,(t-this.lastTime)/1e3)); + if(this.lastTime=t,!this.info)return; + const e=this.viewH; + if(this.target&&performance.now()>=this.departAt){ + const t=this.route.length<=1,e=this.route[0]??this.target; + !t&&Math.hypot(e.x-this.bx,e.y-this.by)<28&&this.route.shift(); + const n=this.route[0]??this.target,h=n.x-this.bx,r=n.y-this.by,o=Math.hypot(h,r),a=this.route.length<=1; + let c=Math.atan2(r,h)-this.heading; + for(; + c>Math.PI; + )c-=2*Math.PI; + for(; + c<-Math.PI; + )c+=2*Math.PI; + this.heading+=Math.max(-3.2*s,Math.min(3.2*s,c)); + const l=aDi[Math.min(aDi.length-1,this.boatLv)]*(1+this.speedBonus/100),u=Math.max(.12,Math.cos(Math.min(Math.PI/2,Math.abs(c)))),d=(a&&o<60?l*Math.max(.15,o/60):l)*u; + this.speed+=(d-this.speed)*Math.min(1,3*s); + const f=this.bx+Math.cos(this.heading)*this.speed*s,p=this.by+Math.sin(this.heading)*this.speed*s; + if(f<40||p<40||f>this.info.w-40||p>this.info.h-40)this.target=null,this.route=[],this.speed=0,this.dock(),this.showHint("R"===this.zone?"여기까지예요 · 더 나갈 수 없어요":"바다 끝이에요 · 더 나갈 수 없어요",!0); + else if(this.isLand(f,p)&&!this.isLand(this.bx,this.by)){ + if(this.speed=0,this.stuckFor+=s,this.stuckFor>1.2){ + this.stuckFor=0; + const t=!this.replanned&&(null==(i=this.nav)?void 0:i.find(this.bx,this.by,this.target.x,this.target.y)); + t?(this.route=t,this.replanned=!0):(this.target=null,this.route=[],this.dock())} + } + else this.bx=f,this.by=p,this.stuckFor=0; + this.target&&a&&o<6&&(this.target=null,this.route=[],this.dock())} + else this.speed*=Math.pow(.9,60*s); + if(this.afterFixAt&&performance.now()>=this.afterFixAt&&!this.fixingNow)if(this.afterFixAt=0,"fish"!==this.mode||this.floatVisible||this.target)"sail"!==this.mode||this.target||this.showRodBalloon(); + else{ + const t=this.castSpot(); + t&&this.cast(t.x,t.y,!1)} + this.dockAt&&performance.now()>=this.dockAt&&!this.rodHold&&(this.dockAt=0,"sail"!==this.mode||this.target||this.showRodBalloon()),this.drawRodBalloon(t),this.camX+=(this.bx-this.camX)*Math.min(1,4*s),this.camY+=(this.by-this.camY)*Math.min(1,4*s); + const n=Math.max(this.viewW/2,Math.min(this.info.w-this.viewW/2,this.camX)),h=Math.max(e/2,Math.min(this.info.h-e/2,this.camY)); + this.world.position.set(this.viewW/2-n,e/2-h); + const r=this.shakeUntil-performance.now(); + if(r>0){ + const t=this.shakeAmp*Math.min(1,r/220); + this.world.position.x+=2*(Math.random()-.5)*t,this.world.position.y+=2*(Math.random()-.5)*t} + if(this.birds.sky.position.copyFrom(this.world.position),this.worldTop.position.copyFrom(this.world.position),this.info.chunk&&this.updateChunks(n,h),this.verts&&this.updateTiles(n,h),this.drawSurface(t),this.drawGlints(s),this.shoreFoamLayer.alpha=.76+.12*Math.sin(t/2800)+.04*Math.sin(t/4700+1.3),this.fog){ + const i=PDi[this.tide]??0; + this.fog.alpha+=(i-this.fog.alpha)*Math.min(1,1.5*s),this.fog.visible=this.fog.alpha>.01,this.fog.visible&&this.fog.tilePosition.set(.85*this.world.x+t/1e3*7,.85*this.world.y+t/1e3*3)} + this.sun.position.set(.22*this.viewW+18*Math.sin(t/9e3),.12*e+10*Math.cos(t/11e3)),this.moveShadows(t,s),this.moveSchool(s,{ + x:n-this.viewW/2,y:h-e/2,w:this.viewW,h:e} + ),this.moveGiants(t,s),this.birds.update(s,{ + x:n-this.viewW/2,y:h-e/2,width:this.viewW,height:e} + ,this.zone,this.tide,(t,i)=>this.shoreDist(t,i)),this.updateFog(!1),this.trackZone(),this.drawOthers(t,s),this.drawFixing(s),this.drawNpcs(t,s),this.drawHubs(t,s),this.drawGoal(t),this.drawMinimap(t),this.tut?this.applyTutorialHud():this.modeBtn.visible=!this.modeBtnHidden; + const o=(1-(this.glide.ms?Math.min(1,(performance.now()-this.glide.at)/this.glide.ms):1))**3,a=this.hullPose=GNi(this.bx+this.glide.dx*o,this.by+this.glide.dy*o,this.heading,t/1e3,this.zone,this.boatLv,this.speed),c=performance.now()<this.rockUntil?.07*Math.sin(t/110)*((this.rockUntil-performance.now())/1800):0; + this.boat.position.set(a.x,a.y),this.boat.rotation=a.rotation+c,this.boat.skew.set(a.skew,0),this.boat.scale.set(oDi*a.scaleX,oDi*a.scaleY); + const l=DNi(this.boatLv); + if(this.boatShadow.clear().ellipse(0,0,.95*l.halfWidth,.86*l.halfLength).fill({ + color:401450,alpha:.19-.012*a.height} + ),this.boatShadow.position.set(a.waterX+1.5,a.waterY+2),this.boatShadow.rotation=this.boat.rotation,this.boatWater.update(s,{ + x:a.waterX,y:a.waterY,heading:this.boat.rotation-Math.PI/2,speed:this.speed,level:this.boatLv,zone:this.zone,time:t/1e3,velocity:a.velocity,roll:a.roll,pitch:a.pitch,rollVelocity:a.rollVelocity,pitchVelocity:a.pitchVelocity} + ,nAi.foam(),(t,i)=>!this.isLand(t,i)),this.drawFoam(t,s),this.drawCrew(t,s),this.harpoonFxs.length){ + for(const t of this.harpoonFxs)t.advance(s); + this.harpoonFxs=this.harpoonFxs.filter(t=>!t.destroyed)} + let u=0; + const d=this.biteIn-(performance.now()-this.biteInAt); + nDi.forEach((t,i)=>{ + const s=(d-t)/110; + u+=Math.exp(-s*s),d<=t&&this.nibbleSeen<i&&this.floatVisible&&(this.nibbleSeen=i,this.ripples.push({ + x:this.fxp.x,y:this.fxp.y,age:0,life:.8,r0:3,r1:12,alpha:.5} + ))} + ),d>nDi[0]+500&&(this.nibbleSeen=-1),this.moveNibbler(s,d),(this.floatVisible&&!this.retrieveTween&&Math.hypot(this.fxp.x-this.bx,this.fxp.y-this.by)>245||this.reel&&Math.hypot(this.reel.x-this.bx,this.reel.y-this.by)>285)&&(this.floatVisible=!1,this.reel&&this.reelIn()); + const f=this.line.clear(),p=this.float.clear(); + if(this.reel){ + const i=this.rodTip.x,s=this.rodTip.y,e=this.reelPull?.8*Math.sin(t/28):5,n=(i+this.reel.x)/2,h=(s+this.reel.y)/2+e; + f.moveTo(i,s).quadraticCurveTo(n,h,this.reel.x,this.reel.y).stroke({ + color:16053480,width:this.reelPull?.7:.55,alpha:.7} + )} + if(this.floatVisible){ + const i=!!this.castTween||!!this.retrieveTween,e=LNi(this.fxp.x,this.fxp.y,t/1e3,this.zone,(performance.now()-this.floatLandedAt)/1e3),n=i?this.fxp.x:e.x,h=i?this.fxp.y-this.floatLift:e.y,r=this.bite?.55+.2*Math.sin(t/70):.3*u,o=this.rodTip.x,a=this.rodTip.y,c=this.floatSp,l=nAi.gear(),d=i?l.floats[this.bobberLv]:pDi(l.floats[this.bobberLv],this.bobberLv); + c.texture!==d&&(c.texture=d,c.anchor.set(.5,i?dDi[this.bobberLv]??.55:1)),c.visible=!0,c.position.set(n+(this.bite?.8*Math.sin(t/45):0),h+3*r),c.rotation=i?0:e.rotation,c.scale.set(uDi,uDi*(1-.5*r)),c.alpha=1-.25*r; + const g=-2.4*(1-.5*r),w=c.x-Math.sin(c.rotation)*g,m=c.y+Math.cos(c.rotation)*g; + f.moveTo(o,a).quadraticCurveTo((o+w)/2,(a+m)/2+8,w,m).stroke({ + color:16053480,width:.5,alpha:.56} + ),p.ellipse(n,h+.5,4.5+3*r,1.8+r).stroke({ + color:14808302,width:.6,alpha:i?0:this.bite?.5:.2} + ),!this.bite&&!i&&this.bobberWave<=0&&e.height>0&&this.ripples.push({ + x:n,y:h,age:0,life:2.4,r0:4,r1:15,alpha:.18} + ),this.bobberWave=e.height,this.bite&&Math.random()<8*s&&this.ripples.push({ + x:this.fxp.x,y:this.fxp.y,age:0,life:.6,r0:5,r1:16,alpha:.6} + )} + else this.floatSp.visible=!1; + const g=this.fx.clear(),w=this.fxAdd.clear(); + for(const m of this.ripples){ + m.age+=s; + const t=m.age/m.life; + t<1&&g.ellipse(m.x,m.y,m.r0+(m.r1-m.r0)*t,.75*(m.r0+(m.r1-m.r0)*t)).stroke({ + color:16777215,width:1.3,alpha:(1-t)*m.alpha} + )} + this.ripples=this.ripples.filter(t=>t.age<t.life); + for(const m of this.particles){ + m.age+=s,m.vz-=260*s,m.z=Math.max(0,m.z+m.vz*s),m.x+=m.vx*s,m.y+=m.vy*s; + const t=1-m.age/m.life; + t>0&&w.circle(m.x,m.y-m.z,m.size).fill({ + color:m.color,alpha:.8*t} + )} + this.particles=this.particles.filter(t=>t.age<t.life),this.drawLights(t,s); + for(const m of this.labels.children){ + const t=Number(m.label),i=this.info.points[t],s=Math.hypot(i.x-this.bx,i.y-this.by); + m.alpha=t===this.point?1:Math.max(.3,Math.min(.85,1.25-s/900)),m.visible=this.known(t)} + } + mapReadyFor(t){ + return!(this.key!==t||!this.info||"tile"===this.info.type&&!this.terr)} + glideIn(t,i=70,s=600){ + this.glide={ + dx:-Math.cos(t)*i,dy:-Math.sin(t)*i,at:performance.now(),ms:s} + ,this.heading=t} + initFog(){ + var t; + const i=this.info; + this.fogRun=WTi.runId(),this.fogStore=WTi.storeKey(this.key,i.verts),this.fogBits=WTi.bits(this.fogStore,i.cols*i.rows),this.fogCanvas&&this.fogCanvas.width===i.cols&&this.fogCanvas.height===i.rows||(this.fogCanvas=document.createElement("canvas"),this.fogCanvas.width=i.cols,this.fogCanvas.height=i.rows,null==(t=this.fogTex)||t.destroy(!0),this.fogTex=as.from(this.fogCanvas),this.fogTex.source.scaleMode="linear"),this.fogOfWar.texture=this.fogTex,this.fogOfWar.eventMode="none",this.fogOfWar.position.set(0,0),this.fogOfWar.width=i.cols*i.tile,this.fogOfWar.height=i.rows*i.tile,this.fogCell=-1} + unexplored(t,i){ + const s=this.info,e=this.fogBits; + if(!s||!e||!s.tile)return!1; + const n=Math.floor(t/s.tile),h=Math.floor(i/s.tile); + return n<0||h<0||n>=s.cols||h>=s.rows||!WTi.has(e,h*s.cols+n)} + updateFog(t){ + const i=this.info,s=this.fogBits,e=this.fogCanvas; + if(!(i&&s&&e&&i.tile))return; + const n=i.tile,h=i.cols,r=i.rows,o=Math.min(h-1,Math.max(0,Math.floor(this.bx/n))),a=Math.min(r-1,Math.max(0,Math.floor(this.by/n))),c=a*h+o; + if(c===this.fogCell&&!t)return; + const l=this.fogCell; + this.fogCell=c; + const u=Math.ceil(380/n)+2; + let d=!1; + for(let b=Math.max(0,a-u); + b<=Math.min(r-1,a+u); + b++)for(let t=Math.max(0,o-u); + t<=Math.min(h-1,o+u); + t++)Math.hypot((t+.5)*n-this.bx,(b+.5)*n-this.by)<=380&&!WTi.has(s,b*h+t)&&(WTi.set(s,b*h+t),d=!0); + d&&WTi.markDirty(this.fogStore); + let f=0,p=h-1,g=0,w=r-1; + if(!t&&l>=0){ + const t=l%h,i=Math.floor(l/h); + f=Math.max(0,Math.min(o,t)-u),p=Math.min(h-1,Math.max(o,t)+u),g=Math.max(0,Math.min(a,i)-u),w=Math.min(r-1,Math.max(a,i)+u)} + const m=e.getContext("2d"),v=p-f+1,_=w-g+1,M=m.createImageData(v,_); + for(let b=g; + b<=w; + b++)for(let t=f; + t<=p; + t++){ + const i=4*((b-g)*v+(t-f)); + let e=.93; + if(WTi.has(s,b*h+t)){ + const i=Math.hypot((t+.5)*n-this.bx,(b+.5)*n-this.by); + e=.42*(1-Math.min(1,Math.max(0,(380-i)/(1.5*n))))} + M.data[i]=cDi[0],M.data[i+1]=cDi[1],M.data[i+2]=cDi[2],M.data[i+3]=Math.round(255*e)} + m.putImageData(M,f,g),this.fogTex.source.update(),(t||d)&&this.paintMapFog(t?null:[f,g,p,w])} + paintMapFog(t){ + var i; + const s=this.info,e=this.fogBits; + if(!s||!e||!s.tile)return; + const n=s.cols,h=s.rows; + this.mapFogCanvas&&this.mapFogCanvas.width===n&&this.mapFogCanvas.height===h||(this.mapFogCanvas=document.createElement("canvas"),this.mapFogCanvas.width=n,this.mapFogCanvas.height=h,null==(i=this.mapFogTex)||i.destroy(!0),this.mapFogTex=as.from(this.mapFogCanvas),this.mapFogTex.source.scaleMode="linear",t=null); + const[r,o,a,c]=t??[0,0,n-1,h-1],l=this.mapFogCanvas.getContext("2d"),u=a-r+1,d=c-o+1,f=l.createImageData(u,d),p=Math.round(209.1); + for(let g=o; + g<=c; + g++)for(let t=r; + t<=a; + t++){ + const i=4*((g-o)*u+(t-r)); + f.data[i]=cDi[0],f.data[i+1]=cDi[1],f.data[i+2]=cDi[2],f.data[i+3]=WTi.has(e,g*n+t)?0:p} + l.putImageData(f,r,o),this.mapFogTex.source.update(),this.miniFog.texture!==this.mapFogTex&&(this.miniFog.texture=this.mapFogTex,this.bigFog.texture=this.mapFogTex)} + placeMapFog(t,i){ + const s=this.info; + if(!this.mapFogTex&&this.fogBits&&this.paintMapFog(null),t.visible=!!this.mapFogTex&&!!s.tile,!t.visible)return; + t.texture=this.mapFogTex; + const e=i.width/s.w; + t.position.set(i.x,i.y),t.width=s.cols*s.tile*e,t.height=s.rows*s.tile*e} + myAnglerTex(){ + var t; + const i=null==(t=RIi.getInstance().state)?void 0:t.look; + if(i!==this.myLookRaw){ + this.myLookRaw=i; + const t=RIi.getInstance().look; + this.myTop=t?bRi(t):null} + return this.myTop} + static otherAnglerTex(t){ + const i=_Oi(t); + return i?MRi(i,0,!0):null} + static lampGrade(t){ + return Math.min(2,Math.floor(nAi.boatArt(t)/2))} + drawCrew(i,s){ + var e; + const n=nAi.gear(),h=this.boat.rotation,r=this.boat.scale.x,o=this.boat.scale.y,a=Math.cos(h),c=Math.sin(h),l=n.info.boats[nAi.boatArt(this.boatLv)],u=Qt((t,i)=>({ + x:this.boat.x+t*a*r-i*Math.sin(h-this.boat.skew.x)*o,y:this.boat.y+t*c*r+i*Math.cos(h-this.boat.skew.x)*o} + ),"local"),d=u(l.seat[0],l.seat[1]),f=this.reel??(this.floatVisible&&!this.sailing?this.fxp:null),p=f?Math.atan2(f.y-d.y,f.x-d.x)+Math.PI/2:h; + this.anglerRot+=BDi(p,this.anglerRot)*Math.min(1,6*s); + const g=(this.reel?this.reelPull:this.bite)?1:0,w=n.info.angler[g],m=this.repairFx.myCrew,v=(null==m?void 0:m.crop)??0,_=(null==m?void 0:m.lean)??0,M=this.angler,b=NPi((null==(e=this.myAnglerTex())?void 0:e[g])??n.angler[g],v); + M.texture!==b&&(M.texture=b,M.anchor.set((128+w.body[0])/256,LPi(128+w.body[1],v))),M.position.set(d.x+Math.sin(this.anglerRot)*_,d.y-Math.cos(this.anglerRot)*_),M.rotation=this.anglerRot,M.scale.set(lDi); + const y=(w.tip[0]-w.body[0])*lDi,E=(w.tip[1]-w.body[1])*lDi,A=Math.cos(this.anglerRot),S=Math.sin(this.anglerRot); + this.rodTip={ + x:d.x+y*A-E*S,y:d.y+y*S+E*A} + ; + const T=u(l.lantern[0],l.lantern[1]); + this.lamp.position.set(T.x,T.y),this.lamp.rotation=h-.7*this.hullPose.roll+.014*Math.sin(i/2200),this.lamp.scale.set(.2); + const C=n.info.lanterns[t.lampGrade(this.boatLv)].glass,O=Math.cos(this.lamp.rotation),I=Math.sin(this.lamp.rotation); + this.lampAt={ + x:T.x+.2*(C[0]*O-C[1]*I),y:T.y+.2*(C[0]*I+C[1]*O)} + } + drawLights(t,i){ + this.lightUsed=0; + const s=[],e=gDi[this.tide]??0; + if(e>0){ + const i=3===this.tide,n=this.world.x,h=this.world.y,r=Qt(i=>.97+.02*Math.sin(t/2400+i)+.01*Math.sin(t/1100+1.7*i),"flick"),o=Qt((t,o,a,c,l,u,d=0)=>{ + const f=r(u),p=1/(1+.45*d); + this.glow(n+t,h+o,c*(i?1.25:1)*(.7+.3*p),a,l*(i?.45:1)*f*p),this.glow(n+t,h+o,.16*c,a,.9*e*f*(.5+.5*p)),this.glow(n+t,h+o,5,16777215,.75*e*(.4+.6*p)),s.push({ + x:t,y:o,color:a,seed:u,strength:f*p} + )} + ,"lamp"); + if(this.floatSp.visible){ + const t=2===this.bobberLv; + this.glow(n+this.floatSp.x,h+this.floatSp.y-8,t?46:26,t?16769658:this.myColor,(t?.8:.55)*e)} + const a=nAi.gear(),c=[{ + x:this.lampAt.x,y:this.lampAt.y,color:this.myColor,seed:0,me:!0} + ]; + for(const t of this.others.values()){ + if(!t.sp.visible)continue; + const i=a.info.boats[nAi.boatArt(t.a.b)],s=t.sp.scale.x,e=t.sp.scale.y,r=t.sp.rotation,o=t.sp.skew.x,l=t.px+i.lantern[0]*Math.cos(r)*s-i.lantern[1]*Math.sin(r-o)*e,u=t.py+i.lantern[0]*Math.sin(r)*s+i.lantern[1]*Math.cos(r-o)*e,d=n+l,f=h+u; + if(d<-80||f<-80||d>this.viewW+80||f>this.viewH+80)continue; + const p=mDi(t.a.id); + c.push({ + x:l,y:u,color:wDi[p%wDi.length],seed:p%100,me:!1,a:t.alpha/DDi} + )} + for(const t of this.npcs)t.ship.visible&&c.push({ + x:t.x-9,y:t.y+20,color:16761962,seed:50+10*t.phase,me:!1} + ); + for(const t of c){ + let i=0; + for(const s of c)s!==t&&Math.abs(s.x-t.x)<70&&Math.abs(s.y-t.y)<70&&i++; + t.me?o(t.x,t.y,t.color,150,.3*e,0,.5*i):o(t.x,t.y,t.color,110,.24*e*(t.a??1),t.seed,i)} + } + this.waterLight.update(i,t/1e3,{ + x:-this.world.x,y:-this.world.y,width:this.viewW,height:this.viewH} + ,this.zone,this.tide,s,(t,i)=>!this.isLand(t,i)); + for(let n=this.lightUsed; + n<this.lightPool.length; + n++)this.lightPool[n].visible=!1} + glow(i,s,e,n,h){ + let r=this.lightPool[this.lightUsed]; + r||(r=new Ye(t.lightTextures()[0]),r.anchor.set(.5),r.blendMode="add",r.eventMode="none",this.lightPool.push(r),this.lightLayer.addChild(r)),r.visible=!0,r.position.set(i,s),r.width=r.height=e,r.tint=n,r.alpha=Math.min(1,h),this.lightUsed++} + drawFoam(t,i){ + const s=nAi.foam(); + this.foamUsed=0; + for(const e of this.foam){ + e.age+=i,e.x+=e.vx*i,e.y+=e.vy*i,e.rot+=e.spin*i; + const t=Math.max(0,1-2*i); + e.vx*=t,e.vy*=t; + const n=e.age/e.life; + n<1&&this.foamSprite(s.puffs[e.t],e.x,e.y,2.8*e.r*(1+.6*n),e.rot,e.alpha*(1-n*n))} + this.foam=this.foam.filter(t=>t.age<t.life); + for(const e of this.crowns){ + e.age+=i; + const t=Math.min(1,e.age/e.life),n=1-(1-t)*(1-t); + this.foamSprite(s.crowns[e.t],e.x,e.y,e.size*(.5+.65*n),e.rot,1-t*t)} + if(this.crowns=this.crowns.filter(t=>t.age<t.life),this.reel){ + const i=this.reel,e=Math.floor(t/85)%4; + this.foamSprite(s.churn[e],i.x,i.y,(20+5*i.level)*(1+.06*Math.sin(t/70)),t/900,.95)} + for(let e=this.foamUsed; + e<this.foamPool.length; + e++)this.foamPool[e].visible=!1} + addFoam(t,i,s,e,n,h=0,r=0){ + this.foam.push({ + x:t,y:i,vx:h,vy:r,age:0,life:e,r:s,alpha:n,t:Math.floor(8*Math.random()),rot:Math.random()*Math.PI*2,spin:1.2*(Math.random()-.5)} + )} + foamSprite(t,i,s,e,n,h){ + let r=this.foamPool[this.foamUsed]; + r||(r=new Ye(t),r.anchor.set(.5),r.eventMode="none",this.foamPool.push(r),this.foamLayer.addChild(r)),r.texture=t,r.visible=!0,r.position.set(i,s),r.rotation=n,r.alpha=h,r.width=r.height=e,this.foamUsed++} + drawGlints(t){ + const i=nAi.gear().glints; + if(!i||i.length<12)return; + const s=2===this.tide,e=Math.round(18*IDi[this.tide]*(this.viewW*this.viewH)/48e4); + if(this.glintList.length<e&&Math.random()<t*e*.7){ + let t=null,e=-1; + for(let i=0; + i<3; + i++){ + const i=Math.random()*this.viewW,n=Math.random()*this.viewH,h=-this.world.x+i,r=-this.world.y+n; + if(this.isLand(h,r))continue; + const o=Math.hypot(i-this.sun.x,n-this.sun.y)/this.viewW,a=(s?1:.35+Math.exp(-o*o*3))*Math.random(); + a>e&&(e=a,t={ + x:h,y:r} + )} + if(t){ + const e=1+(Math.random()<.55?1:0)+(Math.random()<.25?1:0); + for(let n=0; + n<e; + n++){ + const e=Math.random()*Math.PI*2,h=n?6+16*Math.random():0,r=t.x+Math.cos(e)*h,o=t.y+Math.sin(e)*h*.7; + if(n&&this.isLand(r,o))continue; + const a=s?Math.random()<.7:Math.random()<.3,c=this.glintPool.pop()??new Ye; + c.anchor.set(.5),c.blendMode="add",c.tint=kDi[this.tide]??16777215,c.visible=!1,c.rotation=0,c.texture=i[a?8:0],this.glints.addChild(c),this.glintList.push({ + sp:c,x:r,y:o,dot:a,age:-n*(.08+.14*Math.random()),life:a?.45+.35*Math.random():.5+.35*Math.random(),s:(a?.5+.15*Math.random():.4+.15*Math.random())*(s?.85:1)} + )} + } + } + for(const n of this.glintList){ + n.age+=t; + const e=n.sp; + if(n.age<0){ + e.visible=!1; + continue} + const h=Math.min(.999,n.age/n.life); + e.visible=!0,e.texture=n.dot?i[8+Math.floor(4*h)]:i[Math.floor(8*h)],e.position.set(n.x+2.5*n.age,n.y),e.scale.set(n.s),e.alpha=s?.25*Math.sin(h*Math.PI):.95} + for(const n of this.glintList)n.age>=n.life&&(n.sp.visible=!1,this.glints.removeChild(n.sp),this.glintPool.push(n.sp)); + this.glintList=this.glintList.filter(t=>t.age<t.life)} + static lightTextures(){ + if(this.lightTex)return this.lightTex; + const t=Qt(t=>{ + const i=document.createElement("canvas"); + i.width=i.height=256,t(i.getContext("2d")); + const s=as.from(i); + return s.source.scaleMode="linear",s} + ,"mk"),i=t(t=>{ + const i=t.createRadialGradient(128,128,0,128,128,128); + i.addColorStop(0,"rgba(255,255,255,1)"),i.addColorStop(.35,"rgba(255,255,255,0.42)"),i.addColorStop(1,"rgba(255,255,255,0)"),t.fillStyle=i,t.fillRect(0,0,256,256)} + ),s=t(t=>{ + const i=t.createRadialGradient(128,128,80,128,128,182); + i.addColorStop(0,"rgba(2,12,20,0)"),i.addColorStop(1,"rgba(2,12,20,0.42)"),t.fillStyle=i,t.fillRect(0,0,256,256)} + ); + return this.lightTex=[i,s]} + shoreDist(t,i){ + const s=this.info,e=this.landDist; + if(!(null==s?void 0:s.tile)||!e)return 1e6; + const n=s.tile,h=s.cols+1,r=s.rows+1,o=t/n,a=i/n,c=Math.max(0,Math.min(h-2,Math.floor(o))),l=Math.max(0,Math.min(r-2,Math.floor(a))),u=Math.min(1,Math.max(0,o-c)),d=Math.min(1,Math.max(0,a-l)),f=Qt((t,i)=>Math.min(e[i*h+t],1e4),"at"); + return((f(c,l)*(1-u)+f(c+1,l)*u)*(1-d)+(f(c,l+1)*(1-u)+f(c+1,l+1)*u)*d)*n} + clearGiants(){ + for(const i of this.giants)t.destroyGiant(i); + this.giants=[]} + static destroyGiant(t){ + var i; + t.view.destroy(),t.src.destroy({ + children:!0} + ),t.rt.destroy(!0),null==(i=t.blur)||i.destroy()} + devWhaleSheet(){ + if(this.devWhaleBox)return this.devWhaleBox.destroy({ + children:!0} + ),this.devWhaleBox=null,"off"; + const t=nAi.giantSpine.whale; + if(!t)return"no spine"; + const i=new Ve; + return i.addChild((new ip).rect(0,0,this.viewW,this.viewH).fill(13624298)),[[0,0],[8,1],[-8,2],[0,3]].forEach(([s,e],n)=>{ + const h=ZZ.from({ + skeleton:t.skeleton,atlas:t.atlas,autoUpdate:!1} + ),r=CNi(h); + h.beforeUpdateWorldTransforms=()=>r(ODi.map((t,i)=>i<3?0:s),e*Math.PI/2,.8,0),h.update(e),h.tint=666170,h.scale.set(.95),h.position.set(.72*this.viewW,90+n*this.viewH*.24); + const o=rki(`휨 ${ + s} + ° · ${ + e} + 초`,1056816,12); + o.position.set(10,20+n*this.viewH*.24),i.addChild(h,o)} + ),this.addChild(i),this.devWhaleBox=i,"on"} + devGiant(t){ + this.giants.length?this.showHint("지나가는 그림자가 떠난 뒤 다시 불러주세요",!0):this.spawnGiant(!0,t)||this.showHint("이 생물이 지나갈 만큼 넓고 깊은 수역이 필요해요",!0)} + spawnGiant(t=Math.random()<TDi[this.zone].under,i){ + if(!this.info||!this.landDist||this.giants.length>=1)return!1; + const s=TDi[this.zone]; + if(i&&!s.kinds.some(([t])=>t===i))return!1; + let e=Math.random(),n=s.kinds[0][0]; + for(const[p,g]of s.kinds)if((e-=g)<=0){ + n=p; + break} + i&&(n=i); + const h=SDi[n],r=h.L*s.scale,o=h.need*s.scale,a=Math.hypot(this.viewW,this.viewH)/2,c=-this.world.x+this.viewW/2,l=-this.world.y+this.viewH/2,u=t?this.bx:c+(Math.random()-.5)*this.viewW*.6,d=t?this.by:l+(Math.random()-.5)*this.viewH*.6; + if(this.shoreDist(u,d)<.7*o)return!1; + const f=Math.random()*Math.PI*2; + for(let p=0; + p<24; + p++){ + const i=f+p*(2*Math.PI/24),s=.8*a+.3*r,e=u+Math.cos(i)*s,c=d+Math.sin(i)*s; + if(this.shoreDist(e,c)<o)continue; + let l=!0; + for(let t=.25; + t<=.75&&l; + t+=.25)this.shoreDist(e+(u-e)*t,c+(d-c)*t)<.8*o&&(l=!1); + if(!l)continue; + const g=Math.atan2(d-c,u-e); + for(let t=.25; + t<=1&&l; + t+=.25)this.shoreDist(e-Math.cos(g)*r*t,c-Math.sin(g)*r*t)<.8*o&&(l=!1); + if(!l)continue; + const w="megalodon"===n||"whaleShark"===n||"sturgeon"===n||"turtle"===n,m="megalodon"===n||"whaleShark"===n||"sturgeon"===n||"turtle"===n?{ + sharp:as.WHITE,deep:as.WHITE} + :nAi.gear().giants[n],v=r/m.sharp.width; + let _,M,b=[]; + const y="whale"===n?nAi.giantSpine.whale:null; + let E,A; + y?(E=ZZ.from({ + skeleton:y.skeleton,atlas:y.atlas,autoUpdate:!1} + ),_=new Ye(as.EMPTY),M=new Ye(as.EMPTY)):"turtle"===n?(A=new ULi,_=new Ye(as.EMPTY),M=new Ye(as.EMPTY)):"shark"===n||"megalodon"===n||"whaleShark"===n||"sturgeon"===n?(A=new eLi(n),_=new Ye(as.EMPTY),M=new Ye(as.EMPTY)):"manta"===n||"catfish"===n||"eel"===n?(A=new TNi(n,m.sharp),_=new Ye(as.EMPTY),M=new Ye(as.EMPTY)):h.rope?(b=Array.from({ + length:28} + ,()=>new yi),_=new zy({ + texture:m.deep,points:b} + ),M=new zy({ + texture:m.sharp,points:b} + )):(_=new Ye(m.deep),M=new Ye(m.sharp),_.anchor.set(.5),M.anchor.set(.5)); + const S=w?r*("turtle"===n?1.15:.43):Math.max(m.sharp.height,h.rope?0:m.sharp.width)*v,T=Math.ceil(.5*(1.1*r+1.15*S+40)),C=Mv.create({ + width:T,height:T} + ),O=new Ve; + O.addChild(_,M),E&&O.addChild(E),A&&O.addChild(A),O.position.set(T/2,T/2),O.scale.set(.5); + const I=new Ye(C); + I.anchor.set(.5),I.scale.set(2),I.tint=400424,I.alpha=0,I.eventMode="none",this.giantLayer.addChild(I); + const k=[]; + for(let t=r+40; + t>=0; + t-=4)k.push({ + x:e-Math.cos(g)*t,y:c-Math.sin(g)*t} + ); + const R=E?new Array(ODi.length).fill(0):void 0,x={ + kind:n,src:O,rt:C,view:I,deep:_,sharp:M,pts:b,k:v,L:r,x:e,y:c,dir:g,spine:E,bend:R,rig:A,v:.85*h.speed,want:g,w:0,tgt:g,vanish:0,passX:u,passY:d,reached:!1,reachedAt:0,trail:k,seed:Math.random()*Math.PI*2,effort:.7,bank:0,cruiseDir:g,depth:1,minDepth:"megalodon"===n?.42+.12*Math.random():t?.2:.35+.25*Math.random(),age:0,life:Math.max(12,r/h.speed*.85)+5*Math.random(),leaving:!1,phase:10*Math.random(),passed:!1} + ; + if(E&&R){ + const t=CNi(E); + E.beforeUpdateWorldTransforms=()=>t(R,x.phase,x.effort,x.bank)} + return this.giants.push(x),this.giantSeen||(this.giantSeen=!0,this.showHint("…깊은 곳에서 거대한 그림자가 지나가요",!0)),!0} + return!1} + static trailAt(t,i,s){ + let e=0,n=i; + for(let o=t.length-1; + o>=0; + o--){ + const i=t[o],h=Math.hypot(n.x-i.x,n.y-i.y); + if(h>0&&e+h>=s){ + const t=(s-e)/h; + return{ + x:n.x+(i.x-n.x)*t,y:n.y+(i.y-n.y)*t,a:Math.atan2(n.y-i.y,n.x-i.x)} + } + e+=h,n=i} + const h=t[0]??i,r=t[1]??i; + return{ + x:h.x,y:h.y,a:Math.atan2(r.y-h.y,r.x-h.x)} + } + static trailDir(i,s,e,n){ + const h=t.trailAt(i,s,Math.max(0,e-n)),r=t.trailAt(i,s,e+n); + return Math.atan2(h.y-r.y,h.x-r.x)} + moveGiants(i,s){ + const e=performance.now(); + if(this.info&&this.landDist&&e>=this.nextGiantAt){ + const t=0===this.giants.length&&QSi({ + zone:this.zone,point:this.point} + )>=OOi.MIN_LEVEL&&this.spawnGiant(),i=TDi[this.zone].every; + this.nextGiantAt=e+(t?1e3*(i[0]+Math.random()*(i[1]-i[0])):2e4)} + const n=Math.hypot(this.viewW,this.viewH)/2,h=-this.world.x+this.viewW/2,r=-this.world.y+this.viewH/2,o=TDi[this.zone].scale; + for(const c of this.giants){ + const i=SDi[c.kind],a=i.need*o; + c.age+=s; + const l=Math.hypot(c.passX-c.x,c.passY-c.y),u=Math.atan2(c.passY-c.y,c.passX-c.x); + !c.reached&&(l<.35*c.L||c.age>6&&Math.abs(BDi(u,c.dir))>Math.PI/2||c.age>45)&&(c.reached=!0,c.reachedAt=c.age,c.cruiseDir=c.dir,c.want=c.dir),(c.reached&&c.age-c.reachedAt>c.life||c.age>90)&&(c.leaving=!0),c.want=c.reached||c.leaving?c.cruiseDir+.075*Math.sin(.12*(c.age-c.reachedAt)+c.seed):u; + const d=Math.min(i.turn,c.v/(i.rMin*c.L)),f=Math.max(110,.55*c.L,i.rMin*c.L*.7),p=[]; + let g=0; + for(let t=-7; + t<=7; + t++){ + const i=c.dir+.2*t,s=Math.min(1.5*a,this.shoreDist(c.x+Math.cos(i)*f*.45,c.y+Math.sin(i)*f*.45),this.shoreDist(c.x+Math.cos(i)*f,c.y+Math.sin(i)*f)); + p.push(s/a*1.6+1.5*Math.cos(BDi(c.want,i))-t*t*.003),p[p.length-1]>p[g]&&(g=p.length-1)} + let w=0; + if(g>0&&g<p.length-1){ + const t=p[g-1]-2*p[g]+p[g+1]; + t<0&&(w=Math.max(-.5,Math.min(.5,.5*(p[g-1]-p[g+1])/t)))} + c.tgt+=BDi(c.dir+.2*(g-7+w),c.tgt)*(1-Math.exp(1.2*-s)); + const m=c.w+(i.wn*i.wn*BDi(c.tgt,c.dir)-2*i.wn*c.w)*s,v=.5*d*s; + c.w=Math.max(-d,Math.min(d,c.w+Math.max(-v,Math.min(v,m-c.w)))),c.dir+=c.w*s,(this.shoreDist(c.x+Math.cos(c.dir)*f*.4,c.y+Math.sin(c.dir)*f*.4)<.35*a||c.age>105)&&(c.leaving=!0,c.vanish=Math.max(c.vanish,1e-4)),c.vanish>0&&(c.vanish=Math.min(1,c.vanish+s/5)),c.effort+=(aNi(c.age,c.seed)-c.effort)*(1-Math.exp(.7*-s)),c.bank+=(c.w/(d||1)-c.bank)*(1-Math.exp(.8*-s)); + const _=i.speed*(.78+.16*c.effort+.035*Math.sin(.11*c.age+c.seed))*(1-.1*Math.abs(c.bank)); + c.v+=(_-c.v)*(1-Math.exp(.35*-s)),c.x+=Math.cos(c.dir)*c.v*s,c.y+=Math.sin(c.dir)*c.v*s,c.phase+=s*(pNi(c.kind,c.v,c.L)??i.freq*Math.PI*2*(.62+.38*c.effort)); + let M=c.trail[c.trail.length-1],b=Math.hypot(c.x-M.x,c.y-M.y); + for(; + b>=4; + )M={ + x:M.x+4*(c.x-M.x)/b,y:M.y+4*(c.y-M.y)/b} + ,c.trail.push(M),b-=4; + for(; + c.trail.length>Math.ceil((1.08*c.L+80)/4); + )c.trail.shift(); + const y=c.leaving?1:c.reached||l<.8*n?c.minDepth:.9; + c.depth+=(y-c.depth)*(1-Math.exp(-s*(c.leaving?.2:.3))); + const E=t.trailAt(c.trail,c,.5*c.L),A=Math.min(1,Math.max(0,(this.shoreDist(E.x,E.y)-.3*a)/(.45*a))),S=oNi(0,4,c.age)*A*i.alpha*(1-oNi(0,1,c.vanish)),T=c.depth,C=1-T+T*T; + c.deep.alpha=T,c.sharp.alpha=1-T; + const O=(1-.45*T)*(1-oNi(.78,1,T)); + if(c.view.alpha=S*O/(c.spine||c.rig?1:C),c.view.position.set(E.x,E.y),c.flinch){ + const t=KPi((performance.now()-c.flinch.at)/1e3,c.flinch.power); + t.push||t.flash?(c.view.position.x+=c.flinch.dx*t.push,c.view.position.y+=c.flinch.dy*t.push,c.view.tint=YPi(c.flinch.base,t.flash)):(c.view.tint=c.flinch.base,c.flinch=void 0)} + const I=1+.06*(1-T); + let k=1/0; + if(c.spine&&c.bend){ + const i=ODi,e=c.L*I,n=t.trailDir(c.trail,c,.06*e,.05*e); + let h=0; + for(let s=0; + s<i.length; + s++){ + const r=(CDi-i[s])*e,o=s+1<i.length?(CDi-i[s+1])*e:r+.06*e,a=BDi(t.trailDir(c.trail,c,(r+o)/2,.07*e),n)*oNi(.14,.6,r/e); + if(c.bend[s]=-180*BDi(a,h)/Math.PI,h=a,s%2==0){ + const i=t.trailAt(c.trail,c,r); + k=Math.min(k,Math.hypot(i.x-this.bx,i.y-this.by))} + } + const r=c.spine,o=t.trailAt(c.trail,c,0); + r.position.set(o.x-E.x-Math.cos(n)*(1-CDi)*e,o.y-E.y-Math.sin(n)*(1-CDi)*e),r.rotation=n,r.scale.set(e/300),r.update(s)} + else if(c.rig){ + const i=c.L*I,s=t.trailDir(c.trail,c,.18*i,.13*i),e=t.trailAt(c.trail,c,.2*i); + c.rig.pose(i,c.phase,c.effort,c.bank,n=>{ + const h=t.trailAt(c.trail,c,n),r=gNi(c.kind,n/i),o=e.x-Math.cos(s)*(n-.2*i),a=e.y-Math.sin(s)*(n-.2*i); + return{ + x:o+(h.x-o)*r-E.x,y:a+(h.y-a)*r-E.y,a:s+BDi(t.trailDir(c.trail,c,n,.06*i),s)*r} + } + ); + for(let n=1; + n<=4; + n++){ + const s=t.trailAt(c.trail,c,i*n/5); + k=Math.min(k,Math.hypot(s.x-this.bx,s.y-this.by))} + } + else if(c.sharp instanceof zy){ + const s=c.pts.length,e=c.L*I,n=c.k*I; + for(let h=0; + h<s; + h++){ + const r=h/(s-1),o=(1-r)*e,a=Math.pow(1-r,i.tailPow),l=t.trailAt(c.trail,c,o),u=i.amp*e*a*Math.sin(c.phase-(1-r)*i.wave),d=l.x-Math.sin(l.a)*u,f=l.y+Math.cos(l.a)*u; + c.pts[h].set((d-E.x)/n,(f-E.y)/n),h%3==0&&(k=Math.min(k,Math.hypot(d-this.bx,f-this.by)))} + c.deep.scale.set(n),c.sharp.scale.set(n)} + else{ + const i=c.L/c.sharp.texture.width*I,s=c.L*I,e=t.trailAt(c.trail,c,.2*s),n=t.trailAt(c.trail,c,.746*s),h=(e.x+n.x)/2,r=(e.y+n.y)/2,o=Math.atan2(e.y-n.y,e.x-n.x); + for(const t of[c.deep,c.sharp])t.position.set(h-E.x,r-E.y),t.rotation=o,t.scale.set(i); + k=Math.hypot(h-this.bx,r-this.by)} + if(c.spine||c.rig){ + const t=.35+T*T*4; + c.blur??(c.blur=new mf({ + strength:t,quality:2} + )),c.blur.strength=t,c.view.filters||(c.view.filters=[c.blur])} + const R=Math.hypot(E.x-h,E.y-r)<n+.7*c.L; + if(c.view.visible=R,R&&c.view.alpha>.002&&ES.app.renderer.render({ + container:c.src,target:c.rt,clear:!0} + ),!c.passed&&c.view.alpha>.15&&k<.14*c.L){ + c.passed=!0,this.rockUntil=e+1800,jG("whale"===c.kind||"megalodon"===c.kind?"medium":"light"); + for(let t=0; + t<6; + t++)this.addFoam(this.bx+40*(Math.random()-.5),this.by+40*(Math.random()-.5),1.2+2*Math.random(),1.2+Math.random(),.55)} + } + const a=Qt(t=>t.vanish>=1||t.leaving&&t.depth>.992||t.leaving&&Math.hypot(h-t.x,r-t.y)>n+1.2*t.L,"gone"); + for(const c of this.giants)a(c)&&t.destroyGiant(c); + this.giants=this.giants.filter(t=>!a(t))} + moveShadows(t,i){ + const s=performance.now(),e=Math.max(8,Math.min(20,Math.round(this.viewW*this.viewH/42e3))); + if(this.info&&s>=this.nextFishAt&&this.shadows.length<e){ + this.nextFishAt=s+(this.shadows.length<e/2?150:350+500*Math.random()); + for(let t=0; + t<4; + t++){ + const t=40-this.world.x+Math.random()*(this.viewW-80),i=60-this.world.y+Math.random()*(this.viewH-120); + if(Math.hypot(t-this.bx,i-this.by)<=90||this.isLand(t,i)||this.unexplored(t,i)||this.shoreDist(t,i)<60)continue; + const s=Math.random()*Math.PI*2,n=.5*(Math.random()-.5),h=14+18*Math.random(),r=4+4*Math.random(),o=Math.random()<.3?2+Math.floor(2*Math.random()):1; + for(let a=0; + a<o&&this.shadows.length<e; + a++){ + const e=a*(12+8*Math.random()),c=(a%2?1:-1)*(a?8+8*Math.random():0),l=t-Math.cos(s)*e-Math.sin(s)*c,u=i-Math.sin(s)*e+Math.cos(s)*c; + if(a&&this.isLand(l,u))continue; + const d=new eLi("fish",25); + d.tint=665137,d.alpha=0,this.shadowLayer.addChild(d),this.shadows.push({ + s:d,x:l,y:u,rot:s+.2*(Math.random()-.5),turn:n,v:h*(.92+.16*Math.random()),size:(o>1?16:18)+12*Math.random(),age:0,life:r+.6*Math.random(),phase:Math.random()*Math.PI*2,seed:Math.random()*Math.PI*2} + )} + break} + } + for(const n of this.shadows){ + n.age+=i; + const t=n.x+Math.cos(n.rot)*n.v*i,s=n.y+Math.sin(n.rot)*n.v*i,e=t+36*Math.cos(n.rot),h=s+36*Math.sin(n.rot); + this.isLand(e,h)||this.shoreDist(e,h)<40?n.rot+=2.5*i:(n.x=t,n.y=s,n.rot+=n.turn*i); + const r=n.age/n.life,o=Math.min(1,n.age/.9),a=Math.min(1,Math.max(0,(1-r)/.3)); + n.s.alpha=.32*o*a; + const c=.65+.2*Math.sin(.8*n.age+n.seed); + n.phase+=i*JNi(n.v,n.size),n.s.swim(n.size,n.phase,c,n.turn),n.s.position.set(n.x,n.y),n.s.rotation=n.rot} + for(const n of this.shadows)n.age>=n.life&&n.s.destroy(); + this.shadows=this.shadows.filter(t=>t.age<t.life)} + moveSchool(t,i){ + const s=performance.now(); + !this.school.active&&this.info&&s>=this.nextSchoolAt&&(this.giants.length?this.nextSchoolAt=s+15e3:this.nextSchoolAt=s+(this.playSchool(i)?1e3*dLi(!1,Math.random):2e4)),this.school.update(t,{ + x:this.bx,y:this.by} + ,(t,i)=>this.isLand(t,i)?0:this.seenSoft(t,i)*Math.max(0,Math.min(1,this.shoreDist(t,i)/25)),(t,i)=>this.ripples.push({ + x:t,y:i,age:0,life:.9,r0:3,r1:16,alpha:.32} + ))} + playSchool(t,i,s){ + if(!this.info)return!1; + const e=t??{ + x:-this.world.x,y:-this.world.y,w:this.viewW,h:this.viewH} + ,n={ + x:this.bx,y:this.by} + ,h=Qt((t,i)=>!this.isLand(t,i)&&this.shoreDist(t,i)>=30,"water"),r=Qt((t,i)=>h(t,i)&&!this.unexplored(t,i),"seen"),o=s??nLi[Math.floor(Math.random()*nLi.length)]; + let a=null; + if("swirl"===o){ + const t=ILi(e,n,h,Math.random,r); + t&&(a={ + mode:"swirl",...t} + )} + if("scatter"===o){ + const t=OLi(e,n,h,Math.random,!0); + t&&(a={ + mode:"scatter",pts:t,boat:n} + )} + if(!a){ + const t=OLi(e,n,h,Math.random); + t&&(a={ + mode:"stream",pts:t} + )} + return!!a&&(this.school.start(i??uLi(this.zone,Math.random),a,1e9*Math.random()|0),!0)} + seenSoft(t,i){ + const s=this.info,e=this.fogBits; + if(!s||!e||!s.tile)return 1; + const n=t/s.tile-.5,h=i/s.tile-.5,r=Math.floor(n),o=Math.floor(h),a=n-r,c=h-o,l=Qt((t,i)=>t<0||i<0||t>=s.cols||i>=s.rows?0:WTi.has(e,i*s.cols+t)?1:0,"at"); + return(l(r,o)*(1-a)+l(r+1,o)*a)*(1-c)+(l(r,o+1)*(1-a)+l(r+1,o+1)*a)*c} + get schoolMode(){ + return this.school.mode} + spawnNibbler(){ + if(!this.floatVisible||this.sailing||this.reel||this.castTween||this.retrieveTween||performance.now()<this.busyUntil)return; + const t=this.fxp.x,i=this.fxp.y; + for(let s=0; + s<10; + s++){ + const s=Math.random()*Math.PI*2,e=80+40*Math.random(),n=t+Math.cos(s)*e,h=i+Math.sin(s)*e; + if(this.isLand(n,h)||this.isLand((n+t)/2,(h+i)/2)||Math.hypot(n-this.bx,h-this.by)<60)continue; + const r=new eLi("fish",25); + r.tint=665137,r.alpha=0,this.shadowLayer.addChild(r); + const o=Math.atan2(i-h,t-n),a=performance.now(); + return void(this.nibbler={ + s:r,sx:n,sy:h,dist:e,ang:o,wob:Math.random()<.5?-1:1,x:n,y:h,rot:o,awayRot:o,size:20+5*Math.random(),phase:Math.random()*Math.PI*2,seed:10*Math.random(),state:"come",since:a,born:a} + )} + } + nibblerTo(t){ + const i=this.nibbler; + i&&(i.state=t,i.since=performance.now(),"leave"===t&&(i.awayRot=i.rot+Math.PI+1.2*(Math.random()-.5)))} + resolveNibbler(t){ + const i=this.nibbler; + i&&"leave"!==i.state&&"merge"!==i.state&&this.nibblerTo(t&&!this.sailing&&"come"!==i.state?"merge":"leave")} + moveNibbler(t,i){ + const s=performance.now(); + if(!this.nibbler){ + const t=s+i; + return void(i<=hDi&&i>2400&&Math.abs(t-this.nibbleRolled)>1500&&(this.nibbleRolled=t,(this.tut||Math.random()<.45)&&this.spawnNibbler()))} + const e=this.nibbler,n="leave"!==e.state&&"merge"!==e.state; + (n&&(!this.floatVisible||this.sailing||this.castTween||this.retrieveTween)||("come"===e.state||"nibble"===e.state)&&i>3200)&&this.nibblerTo("leave"); + const h=Math.cos(e.ang),r=Math.sin(e.ang),o=this.fxp.x-h*(.5*e.size+2),a=this.fxp.y-r*(.5*e.size+2); + let c=e.x,l=e.y,u=e.rot,d=6,f=.45; + if("come"===e.state){ + const t=hDi-rDi,s=Math.max(0,Math.min(1,(hDi-i)/t)),n=s*s*(3-2*s),p=10*Math.sin(s*Math.PI)*e.wob; + c=e.sx+(o-e.sx)*n-r*p,l=e.sy+(a-e.sy)*n+h*p,u=e.ang-.3*Math.cos(s*Math.PI)*e.wob,d=8+e.dist/(t/1e3)*6*s*(1-s),f=.65,s>=1&&this.nibblerTo("nibble")} + else if("nibble"===e.state){ + let t=0; + for(const s of nDi){ + const e=(i-s)/110; + t+=Math.exp(-e*e)} + const n=1.2*Math.sin(s/420+e.seed); + c=o+h*(6*t-2)-r*n,l=a+r*(6*t-2)+h*n,u=e.ang,d=8+50*t,f=.5+.5*t,this.bite&&this.nibblerTo("bite")} + else if("bite"===e.state){ + const t=1.6*Math.sin(s/45); + c=o+5*h-r*t,l=a+5*r+h*t,u=e.ang+.12*Math.sin(s/60),d=45,f=1,this.bite||this.nibblerTo("wait")} + else if("wait"===e.state){ + const t=1.5*Math.sin(s/380+e.seed); + c=o-r*t,l=a+h*t,u=e.ang,s-e.since>3200&&this.nibblerTo("leave")} + else if("leave"===e.state){ + const i=(s-e.since)/1e3; + u=e.rot+(e.awayRot-e.rot)*Math.min(1,6*t),d=30+90*Math.min(1,2*i),f=1,c=e.x+Math.cos(u)*d*t,l=e.y+Math.sin(u)*d*t} + let p=.55*Math.min(1,(s-e.born)/500); + if("leave"===e.state&&(p*=Math.max(0,1-(s-e.since)/900)),"merge"===e.state&&(p*=Math.max(0,1-(s-e.since)/180)),!n&&p<=0)return e.s.destroy(),void(this.nibbler=null); + e.x=c,e.y=l,e.rot=u,e.phase+=t*JNi(d,e.size),e.s.swim(e.size,e.phase,f,0),e.s.position.set(c,l),e.s.rotation=u,e.s.alpha=p} + updateChunks(t,i){ + const s=this.info,e=s.chunk,n=this.viewH,h=this.key,r=e/2,o=Math.max(0,Math.floor((t-this.viewW/2-r)/e)),a=Math.min(s.chunkCols-1,Math.floor((t+this.viewW/2+r)/e)),c=Math.max(0,Math.floor((i-n/2-r)/e)),l=Math.min(s.chunkRows-1,Math.floor((i+n/2+r)/e)); + for(let u=c; + u<=l; + u++)for(let t=o; + t<=a; + t++){ + const i=`${ + t} + _${ + u} + `; + this.chunks.has(i)||(this.chunks.set(i,null),nAi.topdownChunk(h,t,u).then(s=>{ + if(this.key!==h||!this.chunks.has(i))return void nAi.unloadChunk(h,t,u); + const n=new Ye(s); + n.position.set(t*e,u*e),this.chunkLayer.addChild(n),this.chunks.set(i,n)} + ))} + for(const[u,d]of this.chunks){ + const[t,i]=u.split("_").map(Number); + t>=o-2&&t<=a+2&&i>=c-2&&i<=l+2||(this.chunks.delete(u),d&&(d.destroy(),nAi.unloadChunk(h,t,i)))} + } + static regionMap(t){ + const i=this.regionTex.get(t); + if(i)return i; + const s=nAi.topdownInfo(t),[e,n]=t.split("|"),h=s.cols+1,r=s.rows+1,o=Uint8Array.from(atob(s.verts),t=>t.charCodeAt(0)),a=Qt((t,i)=>{ + if(t<0||i<0||t>s.cols||i>s.rows)return 1; + const e=i*h+t; + return o[e>>3]>>(7&e)&1} + ,"vert"),c=ADi(h,r,a,e,n).canvas.getContext("2d").getImageData(0,0,h,r).data,l=nAi.terrainLand(s.terrain??"")??NDi[e].land,u=[.45*l[0]+232*.55,.45*l[1]+117.7,.45*l[2]+162*.55],d=new Float32Array(h*r); + for(let M=0; + M<r; + M++)for(let t=0; + t<h; + t++){ + let i=0; + for(let s=-1; + s<=1; + s++)for(let e=-1; + e<=1; + e++)i+=a(t+e,M+s)*(0===e&&0===s?4:0===e||0===s?2:1); + d[M*h+t]=i/16} + const f=Qt((t,i)=>d[Math.min(r-1,Math.max(0,i))*h+Math.min(h-1,Math.max(0,t))],"sv"),p=4*(h-1),g=4*(r-1),w=document.createElement("canvas"); + w.width=p,w.height=g; + const m=w.getContext("2d"),v=m.createImageData(p,g); + for(let M=0; + M<g; + M++){ + const t=M/4,i=Math.floor(t),s=t-i; + for(let e=0; + e<p; + e++){ + const t=e/4,n=Math.floor(t),o=t-n,a=(f(n,i)*(1-o)+f(n+1,i)*o)*(1-s)+(f(n,i+1)*(1-o)+f(n+1,i+1)*o)*s,d=4*(M*p+e),g=Math.min(h-1,n+1),w=Math.min(r-1,i+1),m=4*(i*h+n),_=4*(i*h+g),b=4*(w*h+n),y=4*(w*h+g),E=[0,1,2].map(t=>(c[m+t]*(1-o)+c[_+t]*o)*(1-s)+(c[b+t]*(1-o)+c[y+t]*o)*s),A=Math.min(1,Math.max(0,(a-.4)/.08)),S=Math.min(1,Math.max(0,(a-.5)/.12)); + for(let i=0; + i<3; + i++){ + const t=u[i]+(l[i]-u[i])*S; + v.data[d+i]=E[i]+(t-E[i])*A} + v.data[d+3]=255} + } + m.putImageData(v,0,0); + const _=as.from(w); + return _.source.scaleMode="linear",this.regionTex.set(t,_),_} + static regionFog(t){ + const i=nAi.topdownInfo(t); + if(!i.verts||!i.tile)return null; + const s=WTi.bits(WTi.storeKey(t,i.verts),i.cols*i.rows),e=document.createElement("canvas"); + e.width=i.cols,e.height=i.rows; + const n=e.getContext("2d"),h=n.createImageData(i.cols,i.rows); + for(let o=0; + o<i.cols*i.rows; + o++)h.data[4*o]=cDi[0],h.data[4*o+1]=cDi[1],h.data[4*o+2]=cDi[2],h.data[4*o+3]=WTi.has(s,o)?0:Math.round(.86*255); + n.putImageData(h,0,0); + const r=as.from(e); + return r.source.scaleMode="linear",r} + vert(t,i){ + const s=this.info,e=s.cols+1; + if(t<0||i<0||t>s.cols||i>s.rows)return 1; + const n=i*e+t; + return this.verts[n>>3]>>(7&n)&1} + tileIndex(t,i){ + return 8*this.vert(t,i)+4*this.vert(t+1,i)+2*this.vert(t+1,i+1)+this.vert(t,i+1)} + buildMinimap(){ + const t=this.miniMap; + this.miniImg.eventMode=this.miniDots.eventMode=this.miniBg.eventMode="none"; + for(const s of[this.miniMe,this.miniView,this.miniTarget,this.bigMe,this.bigTarget,this.bigOthers])s.eventMode="none"; + this.miniMe.circle(0,0,3.5).fill(VIi).circle(0,0,1.6).fill(2825477),this.bigMe.circle(0,0,7).fill(VIi).circle(0,0,3).fill(2825477),this.miniTarget.circle(0,0,2.4).stroke({ + color:16777215,width:1.5} + ),this.bigTarget.circle(0,0,5).stroke({ + color:16777215,width:1.5} + ),this.miniFog.eventMode=this.bigFog.eventMode=this.miniTerr.eventMode=this.bigTerr.eventMode="none",t.addChild(this.miniBg,this.miniImg,this.miniFog,this.miniTerr,this.miniDots,this.miniGoal,this.miniView,this.miniTarget,this.miniMe),t.eventMode="static",t.cursor="pointer",t.on("pointertap",t=>{ + t.stopPropagation(),this.openBigMap(!0)} + ); + const i=this.bigMap; + i.addChild(this.bigDim,this.bigImg,this.bigFog,this.bigTerr,this.bigOthers,this.bigDots,this.bigGoal,this.bigTarget,this.bigMe,this.bigLabels,this.bigClose,this.bigTip),this.bigImg.eventMode=this.bigDots.eventMode=this.bigLabels.eventMode="none",i.eventMode="static",i.visible=!1,this.bigClose.onTap=()=>this.openBigMap(!1),i.on("pointertap",t=>{ + t.stopPropagation(); + const s=i.toLocal(t.global),e=this.info; + if(!e)return; + const n=this.bigImg.width/e.w,h=(s.x-this.bigImg.x)/n,r=(s.y-this.bigImg.y)/n; + h<0||r<0||h>e.w||r>e.h?this.openBigMap(!1):this.isLand(h,r)?this.showHint("육지예요 · 물을 눌러 주세요",!0):(this.openBigMap(!1),"sail"!==this.mode&&this.setMode("sail"),this.sailTo(h,r)&&this.marker(h,r,16777215))} + )} + buildMinimapTexture(){ + var i,s; + const e=this.info; + let n; + if(null==(i=this.miniTex)||i.destroy(!0),this.miniTex=null,this.verts&&this.water){ + const t=e.cols+1,i=e.rows+1,h=document.createElement("canvas"); + h.width=t,h.height=i; + const r=h.getContext("2d"); + r.drawImage(this.water.texture.source.resource,0,0); + const o=(null==(s=this.terr)?void 0:s.land)??NDi[this.race].land; + r.fillStyle=`rgb(${ + o[0]} + ,${ + o[1]} + ,${ + o[2]} + )`; + for(let s=0; + s<i; + s++)for(let i=0; + i<t; + i++)this.vert(i,s)&&r.fillRect(i,s,1,1); + n=as.from(h),n.source.scaleMode="linear",this.miniTex=n} + else n=this.mapSprite.texture; + const h=t.MINI/Math.max(e.w,e.h); + this.miniImg.texture=n,this.miniImg.width=e.w*h,this.miniImg.height=e.h*h,this.miniImg.position.set(4,4),this.placeMapFog(this.miniFog,this.miniImg),this.miniBg.clear().roundRect(0,0,this.miniImg.width+8,this.miniImg.height+8,8).fill({ + color:QIi,alpha:.85} + ),this.miniMap.position.set(10,this.viewH-this.miniImg.height-18),this.miniMap.hitArea=new Ui(0,0,this.miniImg.width+8,this.miniImg.height+8); + const r=this.viewH,o=Math.min((this.viewW-40)/e.w,(r-44-46-14-34-12)/e.h); + this.bigImg.texture=n,this.bigImg.width=e.w*o,this.bigImg.height=e.h*o,this.bigImg.position.set((this.viewW-this.bigImg.width)/2,44),this.placeMapFog(this.bigFog,this.bigImg),this.markSig="",this.bigLabels.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const a=RIi.getInstance().areaRows(this.race,this.zone); + e.points.forEach((t,i)=>{ + if(!this.known(i))return; + const s=a[i],e=mki(`${ + RSi(this.race,this.zone,i)} + ${ + s.claimed||s.ready?"✓":`${ + s.have} + /${ + s.need} + `} + `,16777215,QIi,11,6); + e.position.set(this.bigImg.x+t.x*o-e.width/2,this.bigImg.y+t.y*o-26),this.bigLabels.addChild(e)} + )} + openBigMap(t){ + this.bigMap.visible=t,this.miniMap.visible=!t,t&&(this.buildMinimapTexture(),this.bigOthersAt=0,MR.fromTo(this.bigMap,{ + alpha:0} + ,{ + alpha:1,duration:.18} + ))} + drawMapMarks(){ + const t=this.info,i=sNi.get(this.key); + for(const e of[this.miniTerr,this.bigTerr])e.visible=!!i; + i&&[[this.miniTerr,this.miniImg],[this.bigTerr,this.bigImg]].forEach(([s,e],n)=>{ + var h; + const r=(h=this.terrCanvas)[n]??(h[n]=document.createElement("canvas")); + sNi.paint(r,i,t=>this.known(t),this.point,VIi,1===n); + let o=this.terrTex[n]; + o&&o.width===r.width&&o.height===r.height?o.source.update():(null==o||o.destroy(!0),o=this.terrTex[n]=as.from(r),o.source.scaleMode="linear"); + const a=e.width/t.w; + s.texture=o,s.position.set(e.x,e.y),s.width=i.cols*i.tile*a,s.height=i.rows*i.tile*a} + ); + for(const[e,n,h]of[[this.miniDots,this.miniImg,!1],[this.bigDots,this.bigImg,!0]]){ + const i=n.width/t.w; + e.clear(),t.points.forEach((t,s)=>{ + this.known(s)&&e.circle(n.x+t.x*i,n.y+t.y*i,h?4.5:2).fill(s===this.point?VIi:16777215)} + )} + for(const[e,n,h]of[[this.miniGoal,this.miniImg,!1],[this.bigGoal,this.bigImg,!0]]){ + const i=n.width/t.w; + e.clear(); + for(const t of this.goalPoints()){ + const s=n.x+t.x*i,r=n.y+t.y*i,o=h?7:3.4; + e.circle(s,r,o+(h?3:1.6)).fill({ + color:QIi,alpha:.7} + ).circle(s,r,o).fill(VIi),h&&e.circle(s,r,.38*o).fill(2825477)} + for(const t of this.hubs){ + const s=this.hubPlaces.get(t.id); + if(!s)continue; + const r=n.x+s.x*i,o=n.y+s.y*i,a=h?5:2.4; + e.roundRect(r-a,o-a,2*a,2*a,.4*a).fill("offer"===t.state||"ready"===t.state?16773296:14206628).stroke({ + color:3811860,width:h?1.5:1} + )} + } + const s=this.miniImg.width/t.w; + this.miniView.clear().rect(0,0,this.viewW*s,this.viewH*s).stroke({ + color:16777215,width:1,alpha:.7} + )} + drawMinimap(t){ + const i=this.info; + if(!i||this.miniImg.texture===as.EMPTY)return; + const s=`${ + this.point} + |${ + this.knownSig()} + |${ + this.miniImg.width} + |${ + this.bigImg.width} + |${ + this.goalSig} + |${ + this.hubSig} + `; + s!==this.markSig&&(this.markSig=s,this.drawMapMarks()); + const e=.6+.4*Math.sin(t/250),n=Qt((t,s,n)=>{ + const h=n.width/i.w; + return t.position.set(n.x+this.bx*h,n.y+this.by*h),t.alpha=e,s.visible=!!this.target,this.target&&s.position.set(n.x+this.target.x*h,n.y+this.target.y*h),h} + ,"place"); + if(this.miniMap.visible){ + const t=n(this.miniMe,this.miniTarget,this.miniImg); + this.miniView.position.set(this.miniImg.x-this.world.x*t,this.miniImg.y-this.world.y*t)} + if(this.bigMap.visible){ + const t=n(this.bigMe,this.bigTarget,this.bigImg),i=performance.now(); + if(i-this.bigOthersAt>500){ + this.bigOthersAt=i; + const s=this.bigOthers.clear(); + for(const e of this.others.values()){ + const n=this.otherPos(e,i); + s.circle(this.bigImg.x+n.x*t,this.bigImg.y+n.y*t,1.8).fill({ + color:14675954,alpha:.7} + )} + } + } + } + buildWater(){ + const t=this.info,i=t.cols+1,s=t.rows+1,e=t.tile,{ + canvas:n,dist:h} + =ADi(i,s,(t,i)=>this.vert(t,i),this.race,this.zone); + this.landDist=h; + const r=as.from(n); + r.source.scaleMode="linear",this.water=new Ye(r),this.water.position.set(-e/2,-e/2),this.water.width=i*e,this.water.height=s*e,this.water.eventMode="none"; + const o=nAi.water(),a=Qt((t,i,s,e=16777215)=>{ + const n=new jp({ + texture:t,width:this.viewW+128,height:this.viewH+128} + ); + return n.alpha=i,n.blendMode=s,n.tint=e,n.eventMode="none",n} + ,"mk"); + if(this.surf=[a(o.blotch,.32,"normal",135192),a(o.caustic,.11,"add"),a(o.caustic,.08,"add")],!this.fog){ + const t=new jp({ + texture:o.blotch,width:this.viewW,height:this.viewH} + ); + t.tint=15660277,t.alpha=0,t.tileScale.set(5.5),t.eventMode="none",this.addChildAt(t,this.getChildIndex(this.birds.sky)),t.mask=null,this.fog=t} + this.surf[0].tileScale.set(4.2),this.surf[2].tileScale.set(1.45),this.tileLayer.addChild(this.water,this.underLayer,...this.surf)} + drawSurface(t){ + if(!this.surf.length)return; + const i=t/1e3,s=-this.world.x-64,e=-this.world.y-64,n="R"===this.zone?.3:"C"===this.zone?.55:.8,h=[[2.99538,1.99692],[3.5,1.6],[-2.1,2.5]],r=[.27,.085,.06],o=NNi(-this.world.x+this.viewW/2,-this.world.y+this.viewH/2,i,this.zone).height/ONi[this.zone].amplitude; + this.surf.forEach((t,a)=>{ + const[c,l]=h[a]; + t.position.set(s,e),t.tilePosition.set(c*i*n-s,l*i*n-e),t.alpha=r[a]*(0===a?1:(.85+.15*o)*(2===this.tide?.35:1))} + )} + updateTiles(t,i){ + if(!this.terr)return; + const s=this.info.tile,e=8*s,n=this.viewH,h=Math.max(0,Math.floor((t-this.viewW/2-3*s)/e)),r=Math.floor((t+this.viewW/2+3*s)/e),o=Math.max(0,Math.floor((i-n/2-s)/e)),a=Math.floor((i+n/2+3*s)/e); + for(let c=o; + c<=a; + c++)for(let t=h; + t<=r; + t++){ + const i=`${ + t} + _${ + c} + `; + this.regions.has(i)||this.regions.set(i,this.buildRegion(t,c))} + for(const[c,l]of this.regions){ + const[t,i]=c.split("_").map(Number); + t>=h-1&&t<=r+1&&i>=o-1&&i<=a+1||(this.regions.delete(c),this.destroyRegion(l))} + } + destroyRegion(t){ + t.tiles.destroy({ + children:!0} + ),t.props.destroy({ + children:!0} + ),t.sand.destroy(),t.foam.destroy()} + dropRegions(){ + for(const t of this.regions.values())this.destroyRegion(t); + this.regions.clear()} + solid(t,i){ + const s=this.info; + return t>=0&&i>=0&&t<s.cols&&i<s.rows&&15===this.tileIndex(t,i)} + cellHash(t,i,s=0){ + return aAi(7919*(this.info.seed??1)+104729*t+1299709*i+15485863*s)} + largeAt(t,i){ + if(t%3||i%3||this.cellHash(t,i,1)%100>=3)return!1; + for(let s=i-2; + s<=i+1; + s++)for(let i=t-1; + i<=t+2; + i++)if(!this.solid(i,s))return!1; + return!0} + coveredByLarge(t,i){ + for(let s=i; + s<=i+1; + s++)for(let i=t-1; + i<=t; + i++)if(this.largeAt(i,s))return!0; + return!1} + placeNpcShips(){ + const t=this.info; + this.npcSpots=t.points.slice(0,3).map((i,s)=>{ + const e=[[250,-140],[-260,-130],[20,-290],[260,150],[-260,150],[0,300]],n=Qt((t,i)=>[[0,0],[0,-46],[0,46],[-24,0],[24,0]].every(([s,e])=>!this.isLand(t+s,i+e)),"ok"),h=e.find(([t,s])=>n(i.x+t,i.y+s))??e[0]; + return{ + x:i.x+h[0],y:i.y+h[1],rot:1.2*(aAi(31*(t.seed??1)+s)%100/100-.5)} + } + ),this.npcSig=""; + for(const i of this.npcs)i.ship.destroy(),i.shade.destroy(),i.water.destroy({ + children:!0} + ),i.tag.destroy({ + children:!0} + ); + this.npcs=[]} + setVisitors(t){ + if(!this.info||!this.npcSpots.length)return; + const i=t.map(t=>`${ + t.key} + :${ + t.state} + `).join("|")+this.key; + if(i===this.npcSig)return; + this.npcSig=i; + for(const e of this.npcs)e.ship.destroy(),e.shade.destroy(),e.water.destroy({ + children:!0} + ),e.tag.destroy({ + children:!0} + ); + this.npcs=[]; + const s=nAi.gear(); + t.slice(0,this.npcSpots.length).forEach((t,i)=>{ + const e=this.npcSpots[i],n=MDi(t.key),h=new Ye(s.npcBoats[n]); + h.anchor.set(.5),h.scale.set(_Di),h.rotation=e.rot,h.eventMode="none"; + const r=(new ip).ellipse(3,5,20,34).fill({ + color:401450,alpha:.22} + ); + r.position.set(e.x,e.y),r.rotation=e.rot,r.eventMode="none"; + const o=new Ve; + o.eventMode="none"; + const a=new Ye(s.guestHeads[n]); + a.width=a.height=30; + const c=mki(`${ + t.npc} + · ${ + t.role} + `,16777215,QIi,11,7),l=a.width+4+c.width; + a.position.set(-l/2,-8),c.position.set(-l/2+a.width+4,0),a.alpha=c.alpha="done"===t.state?.55:.95; + const u=new Ve; + if("done"!==t.state){ + const i="ready"===t.state,e=new Ye(s.bubbles[i?1:0]); + e.anchor.set(.5,XEi),e.scale.set(.15),e.position.set(0,18),u.addChild(e),u.position.set(-l/2+15,-26)} + o.addChild(c,a,u); + const d=new WNi("nearby",819+397*i); + d.alpha=.6,this.npcLayer.addChild(d,r,h),this.npcTags.addChild(o),this.npcs.push({ + key:t.key,ship:h,shade:r,water:d,tag:o,bubble:u,x:e.x,y:e.y,rot:e.rot,state:t.state,phase:1.7*i} + )} + )} + drawNpcs(t,i){ + for(const s of this.npcs){ + const e=this.unexplored(s.x,s.y)||s.x<-this.world.x-120||s.x>-this.world.x+this.viewW+120||s.y<-this.world.y-120||s.y>-this.world.y+this.viewH+120; + if(e&&s.water.visible&&s.water.reset(),s.ship.visible=s.shade.visible=s.tag.visible=s.water.visible=!e,e)continue; + const n=t/1e3,h=GNi(s.x,s.y,s.rot-Math.PI/2,n,this.zone,4,0,1.5); + s.ship.position.set(h.x,h.y),s.ship.rotation=h.rotation,s.ship.scale.set(_Di*h.scaleX,_Di*h.scaleY),s.ship.skew.set(h.skew,0),s.tag.position.set(s.x,s.y-50),s.bubble.y=1.2*Math.sin(.85*n+s.phase)-26,s.shade.position.set(h.waterX,h.waterY),s.shade.rotation=h.rotation,s.water.update(i,{ + x:h.waterX,y:h.waterY,heading:h.rotation-Math.PI/2,speed:0,level:4,hullScale:1.5,zone:this.zone,time:n,velocity:h.velocity,roll:h.roll,pitch:h.pitch,rollVelocity:h.rollVelocity,pitchVelocity:h.pitchVelocity} + ,nAi.foam(),(t,i)=>!this.isLand(t,i))} + } + npcAt(i,s){ + for(const e of this.npcs)if(Math.hypot(i-e.x,s-(e.y-8))<=44||t.tagHit(e.tag,i,s))return e.key; + return null} + static tagHit(t,i,s,e=6){ + if(!t.visible)return!1; + const n=t.getLocalBounds(); + return i>=t.x+n.x-e&&i<=t.x+n.x+n.width+e&&s>=t.y+n.y-e&&s<=t.y+n.y+n.height+e} + setHubs(t){ + var i; + (null==(i=this.info)?void 0:i.tile)&&this.verts||(t=[]); + const s=`${ + this.key} + |`+t.map(t=>`${ + t.id} + :${ + t.state} + `).join("|"); + if(s===this.hubSig)return; + this.hubSig=s,this.hubs=t; + for(const n of this.hubViews.values())n.body.destroy(),n.shade.destroy(),n.pier.destroy(),n.tag.destroy({ + children:!0} + ),n.ship&&(n.ship.hull.destroy(),n.ship.mast.destroy(),n.ship.water.destroy({ + children:!0} + )); + this.hubViews.clear(); + const e=nAi.gear(); + t.forEach((t,i)=>{ + const s=this.hubPlaces.get(t.id)??(t.ship?this.placeShip(t.anchor):null)??this.placeHub(t.anchor); + if(!s)return; + if(this.hubPlaces.set(t.id,s),s.ship)return void this.addShipHub(t,i,{ + x:s.x,y:s.y,rot:s.rot??0} + ); + const n=Math.atan2(s.dy-s.y,s.dx-s.x),h=Math.hypot(s.dx-s.x,s.dy-s.y)-6,r=new ip; + r.rect(-4,-13,h,26).fill(9071173).stroke({ + color:5126692,width:2} + ); + for(let e=6; + e<h-4; + e+=11)r.moveTo(e,-12).lineTo(e,12); + r.stroke({ + color:6112560,width:1.5,alpha:.8} + ),r.rect(h-8,-16,6,6).fill(5126692).rect(h-8,10,6,6).fill(5126692),r.position.set(s.x,s.y-4),r.rotation=n; + const o=(new ip).ellipse(0,0,12,4.5).fill({ + color:1714714,alpha:.28} + ); + o.position.set(s.x,s.y); + const a=new Ye(e.journeyNpcs[t.art]??e.journeyNpcs[0]); + a.anchor.set(.5,250/256),a.scale.set(.15),a.position.set(s.x,s.y); + const{ + tag:c,bubble:l} + =this.hubTag(t,!1); + this.hubLayer.addChild(r,o,a),this.npcTags.addChild(c),this.hubViews.set(t.id,{ + body:a,shade:o,pier:r,tag:c,bubble:l,x:s.x,y:s.y,phase:1.3*i} + )} + ),this.markSig=""} + hubTag(t,i){ + const s=nAi.gear(),e=new Ve,n=i?34:28,h=wki(s.journeyFaces[t.art]??s.journeyFaces[0],n),r=mki(`${ + t.name} + · ${ + t.role} + `,16777215,QIi,i?13:11,7),o=n+4+r.width; + h.position.set(-o/2,i?-11:-9),r.position.set(-o/2+n+4,-1),h.alpha=r.alpha="idle"===t.state?.6:.96; + const a=new Ye("ready"===t.state?s.bubbles[1]:s.bubbles[0]); + return a.anchor.set(.5,XEi),a.scale.set(i?.2:.17),a.visible="offer"===t.state||"ready"===t.state,e.addChild(r,h,a),{ + tag:e,bubble:a} + } + placeShip(t){ + const i=this.info,s=null==i?void 0:i.points[t]; + if(!i||!s)return null; + const e=this.startSpot(t),n=this.labels.children.find(i=>i.label===String(t)),h=56+(n?n.width/2:60),r=84+(n?n.height/2:15),o=Qt((t,i)=>[[0,0],[0,-72],[0,72],[-38,0],[38,0],[-28,-48],[28,-48],[-28,48],[28,48]].every(([s,e])=>!this.isLand(t+s,i+e)),"hullWet"),a=Math.atan2(e.fy-e.by,e.fx-e.bx); + let c=null,l=1/0; + for(const d of[190,160,220,250,270,150])for(let t=0; + t<24; + t++){ + const i=t/24*Math.PI*2,n=e.bx+Math.cos(i)*d,u=e.by+Math.sin(i)*d; + if(!o(n,u)||this.shoreDist(n,u)<20)continue; + if(Math.abs(n-s.x)<h&&Math.abs(u-s.y)<r)continue; + if(Math.hypot(n-e.fx,u-e.fy)<130||this.npcSpots.some(t=>Math.hypot(t.x-n,t.y-u)<170))continue; + const f=Math.abs(Math.atan2(Math.sin(i-a),Math.cos(i-a))),p=Math.abs(d-190)+45*(Math.PI-f); + p<l&&(l=p,c={ + x:n,y:u} + )} + if(!c)return null; + const u=Math.atan2(e.by-c.y,e.bx-c.x)+Math.PI/2+.9; + return{ + x:c.x,y:c.y,dx:e.bx,dy:e.by,ship:!0,rot:u} + } + addShipHub(t,i,s){ + const e=nAi.gear(),n=new Ye(e.npcBoats[2]??e.npcBoats[0]); + n.anchor.set(.5),n.scale.set(yDi),n.rotation=s.rot; + const h=(new ip).ellipse(4,8,36,62).fill({ + color:401450,alpha:.26} + ); + h.position.set(s.x,s.y),h.rotation=s.rot; + const r=new ip,o=new Ye(e.journeyNpcs[t.art]??e.journeyNpcs[0]); + o.anchor.set(.5,250/256),o.scale.set(.21),o.position.set(s.x,s.y+10); + const a=new WNi("nearby",1201+331*i); + a.alpha=.7; + const{ + tag:c,bubble:l} + =this.hubTag(t,!0); + this.hubLayer.addChild(a,h,n,r,o),this.npcTags.addChild(c),this.hubViews.set(t.id,{ + body:o,shade:h,pier:new ip,tag:c,bubble:l,x:s.x,y:s.y,phase:1.3*i,ship:{ + hull:n,mast:r,water:a,rot:s.rot,flag:EDi[this.race]??EDi["인간"]} + } + )} + placeHub(t){ + const i=this.info,s=sNi.get(this.key),e=null==i?void 0:i.points[t]; + if(!i||!s||!e)return null; + const n=s.tile,h=[...this.hubPlaces.values()]; + let r=null,o=1/0; + for(let a=0; + a<s.owner.length; + a++){ + if(s.owner[a]!==t)continue; + const i=a%s.cols,c=(i+.5)*n,l=((a-i)/s.cols+.5)*n; + if(!this.isLand(c,l))for(const[t,s,a]of[[0,-1,0],[-1,0,90],[1,0,90],[0,1,200]]){ + const i=c+t*n,u=l+s*n; + if(!this.isLand(i,u)||!this.isLand(i+t*n*.7,u+s*n*.7)||!this.isLand(i+(s?.5*n:0),u+(t?.5*n:0)))continue; + if(h.some(t=>Math.hypot(t.x-i,t.y-u)<300))continue; + const d=Math.abs(Math.hypot(c-e.x,l-e.y)-230)+a; + d<o&&(o=d,r={ + x:i-14*t,y:u-14*s,dx:c-34*t,dy:l-34*s} + )} + } + return r} + hubNear(t){ + const i=this.hubPlaces.get(t); + return!!i&&Math.hypot(this.bx-i.x,this.by-i.y)<=330} + hubPos(t){ + return this.hubPlaces.get(t)??null} + hubAt(i,s){ + for(const[e,n]of this.hubViews)if(n.body.visible){ + if(n.ship?Math.abs(i-n.x)<=54&&s>=n.y-140&&s<=n.y+74:Math.abs(i-n.x)<=26&&s>=n.y-bDi-16&&s<=n.y+14)return e; + if(t.tagHit(n.tag,i,s))return e} + return null} + drawHubs(t,i){ + for(const s of this.hubViews.values()){ + const e=this.unexplored(s.x,s.y); + if(s.body.visible=s.shade.visible=s.pier.visible=s.tag.visible=!e,s.ship&&(e&&s.ship.water.visible&&s.ship.water.reset(),s.ship.hull.visible=s.ship.mast.visible=s.ship.water.visible=!e),e)continue; + const n=t/1e3+s.phase; + s.ship?this.drawShip(s,t/1e3,n,i):(s.tag.position.set(s.x,s.y-bDi),s.bubble.position.set(-s.tag.width/2+14,2.5*Math.sin(3*n)-12))} + } + drawShip(t,i,s,e){ + const n=t.ship,h=GNi(t.x,t.y,n.rot-Math.PI/2,i,this.zone,5,0,2.4); + n.hull.position.set(h.x,h.y),n.hull.rotation=h.rotation,n.hull.scale.set(yDi*h.scaleX,yDi*h.scaleY),n.hull.skew.set(h.skew,0),t.shade.position.set(h.waterX,h.waterY),t.shade.rotation=h.rotation; + const r=.035*Math.sin(1.3*s); + t.body.position.set(t.x,t.y+12); + const o=h.x+22,a=h.y+4,c=a-92,l=n.mast.clear(); + l.moveTo(o,a).lineTo(o+30*r,c).stroke({ + color:5126692,width:4} + ),l.circle(o+30*r,c,3.5).fill(15325616); + const u=o+30*r,d=c+4,f=[]; + for(let p=0; + p<=6; + p++){ + const t=p/6; + f.push(u+40*t,d+3.2*Math.sin(5.5*i-3*t)*t)} + for(let p=6; + p>=0; + p--){ + const t=p/6; + f.push(u+40*t,d+24*(1-t)+3.2*Math.sin(5.5*i-3*t)*t)} + l.poly(f).fill(n.flag).stroke({ + color:1905672,width:2,alpha:.8} + ),l.circle(u+12,d+24*.38,4).fill({ + color:16777215,alpha:.9} + ),t.tag.position.set(t.x,t.y-128),t.bubble.position.set(-t.tag.width/2+16,2.5*Math.sin(3*s)-14),n.water.update(e,{ + x:h.waterX,y:h.waterY,heading:h.rotation-Math.PI/2,speed:0,level:5,hullScale:2.4,zone:this.zone,time:i,velocity:h.velocity,roll:h.roll,pitch:h.pitch,rollVelocity:h.rollVelocity,pitchVelocity:h.pitchVelocity} + ,nAi.foam(),(t,i)=>!this.isLand(t,i))} + setGoal(t){ + const i=t?`${ + t.points.join(",")} + |${ + t.hub} + |${ + t.label} + `:""; + i!==this.goalSig&&(this.goalSig=i,this.goal=t,this.goalArrowText="")} + goalPoints(){ + const t=this.goal,i=this.info; + if(!t||!i)return[]; + if(t.hub){ + const i=this.hubPlaces.get(t.hub); + return i?[i]:[]} + return t.points.map(t=>i.points[t]).filter(Boolean)} + drawGoal(t){ + const i=this.goalPoints(),s=this.goalMarks.clear(); + this.goalArrow.visible=!1; + const e=this.tutorialRing; + if(e){ + const i=ZCi(t),n=this.tutorialRingScale; + s.circle(e.x,e.y,i.r*n).stroke({ + color:VIi,width:3*n,alpha:i.alpha} + ),s.circle(e.x,e.y,7*n).fill(VIi).circle(e.x,e.y,7*n).stroke({ + color:2825477,width:2.5*n} + )} + if(!i.length||!this.goal)return; + const n=t/1400%1; + if(!this.goal.hub)for(const b of i)s.circle(b.x,b.y,22+26*n).stroke({ + color:VIi,width:3,alpha:.75*(1-n)} + ),s.circle(b.x,b.y,7).fill(VIi).circle(b.x,b.y,7).stroke({ + color:2825477,width:2} + ); + let h=i[0],r=1/0; + for(const b of i){ + const t=Math.hypot(b.x-this.bx,b.y-this.by); + t<r&&(r=t,h=b)} + const o=h.x+this.world.x,a=h.y+this.world.y,c=this.viewW,l=this.viewH; + if(o>46&&o<c-46&&a>86&&a<l-46)return; + const u=c/2,d=l/2,f=o-u,p=a-d,g=p>0?44:0,w=Math.min((c/2-46)/Math.max(1e-6,Math.abs(f)),(l/2-46-20-g)/Math.max(1e-6,Math.abs(p))),m=u+f*w,v=d+p*w+10,_=Math.atan2(p,f); + if(this.goalArrowText!==this.goal.label){ + this.goalArrowText=this.goal.label,this.goalArrow.removeChildren().forEach(t=>{ + t!==this.goalArrowHead&&t.destroy({ + children:!0} + )} + ); + const t=mki(this.goal.label,jIi,VIi,11,7); + t.label="tag",this.goalArrowHead.clear().poly([16,0,-8,-11,-3,0,-8,11]).fill(VIi).stroke({ + color:2825477,width:2} + ),this.goalArrow.addChild(this.goalArrowHead,t)} + this.goalArrow.visible=!0,this.goalArrow.position.set(m,v),this.goalArrowHead.rotation=_,this.goalArrowHead.position.set(Math.cos(_)*(6+3*Math.sin(t/180)),Math.sin(_)*(6+3*Math.sin(t/180))); + const M=this.goalArrow.getChildByLabel("tag"); + if(M){ + let t=30*-Math.cos(_)-M.width/2,i=26*-Math.sin(_)-M.height/2; + t=Math.max(8-m,Math.min(c-8-m-M.width,t)),i=Math.max(8-v,Math.min(l-8-v-M.height,i)),M.position.set(t,i)} + } + buildShore(){ + const t=this.info,i=t.tile,s=8*i,e=[[1,0],[2,1],[1,2],[0,1]],n=[]; + for(let a=0; + a<t.rows; + a++)for(let i=0; + i<t.cols; + i++){ + const t=this.tileIndex(i,a); + if(0===t||15===t)continue; + const s=[t>>3&1,t>>2&1,t>>1&1,1&t],h=Qt((t,s)=>n.push([2*i+e[t][0],2*a+e[t][1],2*i+e[s][0],2*a+e[s][1]]),"add"); + if(5===t){ + h(0,1),h(2,3); + continue} + if(10===t){ + h(3,0),h(1,2); + continue} + const r=[0,1,2,3].filter(t=>s[t]!==s[(t+1)%4]); + 2===r.length&&h(r[0],r[1])} + const h=Qt((t,i)=>1e5*i+t,"key"),r=new Map; + n.forEach((t,i)=>{ + for(const s of[h(t[0],t[1]),h(t[2],t[3])]){ + const t=r.get(s); + t?t.push(i):r.set(s,[i])} + } + ); + const o=new Uint8Array(n.length); + this.shoreRuns.clear(); + for(let a=0; + a<n.length; + a++){ + if(o[a])continue; + o[a]=1; + const t=[[n[a][0],n[a][1]],[n[a][2],n[a][3]]]; + for(const i of[!0,!1])for(; + ; + ){ + const s=i?t[t.length-1]:t[0],e=(r.get(h(s[0],s[1]))??[]).find(t=>!o[t]); + if(void 0===e)break; + o[e]=1; + const a=n[e],c=a[0]===s[0]&&a[1]===s[1]?[a[2],a[3]]:[a[0],a[1]]; + i?t.push(c):t.unshift(c)} + let e=t.map(t=>[t[0]*i/2,t[1]*i/2]); + const c=t.length>2&&t[0][0]===t[t.length-1][0]&&t[0][1]===t[t.length-1][1]; + for(let i=0; + i<3; + i++){ + const t=c?[]:[e[0]]; + for(let i=0; + i<e.length-1; + i++){ + const[s,n]=e[i],[h,r]=e[i+1]; + t.push([.75*s+.25*h,.75*n+.25*r],[.25*s+.75*h,.25*n+.75*r])} + t.push(c?t[0]:e[e.length-1]),e=t} + let l=null,u=""; + for(let i=0; + i<e.length-1; + i++){ + const[t,n]=e[i],[h,r]=e[i+1],o=`${ + Math.floor((t+h)/2/s)} + _${ + Math.floor((n+r)/2/s)} + `; + if(o!==u||!l){ + l=[t,n],u=o; + const i=this.shoreRuns.get(o); + i?i.push(l):this.shoreRuns.set(o,[l])} + l.push(h,r)} + } + } + buildRegion(t,i){ + const s=this.info,e=s.tile,n=this.terr,h=new Ve,r=new Ve; + h.eventMode=r.eventMode="none"; + const o=[]; + for(let u=8*i; + u<Math.min(s.rows,8*i+8); + u++)for(let i=8*t; + i<Math.min(s.cols,8*t+8); + i++){ + const t=this.tileIndex(i,u); + if(t){ + const s=new Ye(n.terrain[16*(t-1)+u%4*4+i%4]); + s.position.set(i*e,u*e),h.addChild(s)} + if(!this.solid(i,u))continue; + if(this.largeAt(i,u)){ + const t=n.large[this.cellHash(i,u,2)%n.large.length]; + o.push({ + tex:t.tex,x:(i+1)*e,y:(u+1)*e-4,w:t.w,scale:1} + ); + continue} + if(!(this.solid(i-1,u)&&this.solid(i+1,u)&&this.solid(i,u-1)&&this.solid(i,u+1)))continue; + if(this.coveredByLarge(i,u))continue; + const s=this.cellHash(i,u),r=s%100,a=r<50?0:r<85?1:2; + for(let h=0; + h<a; + h++){ + const t=aAi(s+31337*h),r=t%100,a=r<40?t%6:r<70?6+(t>>>4)%6:r<90?12+(t>>>4)%4:16+(t>>>4)%8,c=n.small[a]; + o.push({ + tex:c.tex,x:i*e+12+(t>>>8)%40,y:u*e+22+(t>>>16)%38,w:c.w,scale:1} + )} + } + o.sort((t,i)=>t.y-i.y); + const a=new ip; + for(const u of o)a.ellipse(u.x+2,u.y-2,u.w*u.scale*.36,Math.max(2.5,u.w*u.scale*.1)).fill({ + color:662032,alpha:.2} + ); + r.addChild(a); + for(const u of o){ + const t=new Ye(u.tex); + t.anchor.set(.5,1),t.position.set(u.x,u.y),t.scale.set(u.scale),r.addChild(t)} + const c=new ip,l=new ip; + for(const u of this.shoreRuns.get(`${ + t} + _${ + i} + `)??[])u.length<4||(l.poly(u,!1).stroke({ + color:16777215,width:30,alpha:.16,join:"round",cap:"round"} + ),l.poly(u,!1).stroke({ + color:16055291,width:19,alpha:.42,join:"round",cap:"round"} + ),c.poly(u,!1).stroke({ + color:n.wet,width:13,join:"round",cap:"round"} + ),c.poly(u,!1).stroke({ + color:n.sand,width:8.5,join:"round",cap:"round"} + )); + return this.tileLayer.addChild(h),this.propLayer.addChild(r),this.shoreLayer.addChild(c),this.shoreFoamLayer.addChild(l),{ + tiles:h,props:r,sand:c,foam:l} + } + clearTiles(){ + var t; + this.dropRegions(),null==(t=this.water)||t.destroy(!0),this.water=null; + for(const i of this.surf)i.destroy(); + this.surf=[],this.tileLayer.removeChildren(),this.shoreRuns.clear(),this.terr=null} + clearChunks(){ + const t=this.chunks,i=this.chunkKey; + this.chunks=new Map,this.chunkKey=this.key; + for(const[s,e]of t){ + if(!e)continue; + e.destroy(); + const[t,n]=s.split("_").map(Number); + nAi.unloadChunk(i,t,n)} + } + get boatPos(){ + return this.info?{ + x:Math.round(this.bx),y:Math.round(this.by),s:this.sailing} + :null} + setOthers(t){ + this.otherCandidates=t.filter(t=>t.id!==EG.userId),this.pickOtherBoats(performance.now(),!0)} + dropOtherBoat(t){ + MR.killTweensOf([t.sp,t.name,t.float,t.water]),t.sp.destroy({ + children:!0} + ),t.name.destroy({ + children:!0} + ),t.float.destroy(),t.water.destroy({ + children:!0} + ),t.fixing=!1} + pickOtherBoats(i,s=!1){ + var e; + this.otherPickAt=i+500; + const n=tDi(this.otherCandidates.map(t=>{ + const i=this.others.get(t.id),s=i?this.otherPos(i):t; + return{ + id:t.id,x:s.x,y:s.y,angler:t} + } + ).filter(t=>!this.unexplored(t.x,t.y)),{ + x:this.bx,y:this.by} + ,{ + x:-this.world.x-80,y:-this.world.y-80,width:this.viewW+160,height:this.viewH+160} + ,new Set(this.others.keys())).map(t=>t.angler),h=new Set(n.map(t=>t.id)); + for(const[t,r]of this.others)h.has(t)||"leave"===r.mode||(r.sp.visible&&r.alpha>.05?(r.mode="leave",r.pending=null,r.away=Math.atan2(r.y-this.by,r.x-this.bx)+(Math.random()-.5)):(this.others.delete(t),this.dropOtherBoat(r))); + for(const r of n){ + let n=this.others.get(r.id); + if(!n||s||"leave"===n.mode){ + if(n){ + "leave"===n.mode&&(n.mode="fish",n.castAt=i+800+1500*Math.random()); + const s=Math.hypot(r.x-n.x,r.y-n.y); + if(n.tx=r.x,n.ty=r.y,s>=25){ + const t="sail"===n.mode||r.s; + n.pending=this.crossesLand({ + x:n.x,y:n.y} + ,r)?"hop":"sail",n.goAt=i+(t?2500*Math.random():1500+12500*Math.random()),n.cruise=Math.max(30,Math.min(140,s/35))*(.85+n.seed%30/100),"hop"===n.pending&&(n.away=Math.atan2(r.y-n.y,r.x-n.x)+1.2*(Math.random()-.5))} + if(r.b!==n.a.b&&(n.hull.texture=nAi.boat(r.b),n.lamp.texture=nAi.gear().lanterns[t.lampGrade(r.b)]),r.lk!==n.a.lk&&(n.crew.texture=t.otherAnglerTex(r.lk)??nAi.gear().angler[0]),!!r.a!=!!n.a.a||r.n!==n.a.n||(r.fx??0)!==(n.a.fx??0)||!!r.fk!=!!n.a.fk){ + const i=t.otherName(r); + i.alpha=n.name.alpha,i.visible=n.name.visible,this.otherNames.addChildAt(i,this.otherNames.getChildIndex(n.name)),n.name.destroy({ + children:!0} + ),n.name=i} + n.a=r} + else{ + if(this.others.size>=30)continue; + const s=nAi.gear(),h=s.info.boats[nAi.boatArt(r.b)],o=s.info.angler[0],a=new Ve,c=new Ye(nAi.boat(r.b)),l=new Ye(t.otherAnglerTex(r.lk)??s.angler[0]),u=new Ye(s.lanterns[t.lampGrade(r.b)]); + c.anchor.set(.5),l.anchor.set((128+o.body[0])/256,(128+o.body[1])/256),l.position.set(h.seat[0],h.seat[1]),l.scale.set(.37500000000000006),u.anchor.set(.5),u.position.set(h.lantern[0],h.lantern[1]),u.scale.set(.5555555555555556),a.addChild(c,l,u),a.scale.set(oDi),a.alpha=0,this.othersLayer.addChild(a); + const d=new WNi("nearby",mDi(r.id)); + d.alpha=0,this.othersWater.addChild(d); + const f=mDi(r.id)%Math.max(1,s.floats.length),p=new Ye(pDi(s.floats[f],f)); + p.anchor.set(.5,1),p.scale.set(uDi),p.alpha=0,this.othersFloats.addChild(p); + const g=t.otherName(r); + g.alpha=0,this.otherNames.addChild(g),n={ + a:r,sp:a,hull:c,lamp:u,name:g,rot:Math.random()*Math.PI*2,seenCatch:(null==(e=r.c)?void 0:e.at)??0,catchAt:0,dist:0,px:r.x,py:r.y,x:r.x,y:r.y,v:0,tx:r.x,ty:r.y,cruise:40,alpha:0,mode:"fish",pending:null,goAt:0,away:0,crew:l,float:p,fx:0,fy:0,fAlpha:0,seed:mDi(r.id)%1e3,fSet:!1,fly:null,castAt:i+600+2e3*Math.random(),recastAt:0,water:d} + ,this.others.set(r.id,n)} + r.c&&r.c.at>n.seenCatch&&(n.seenCatch=r.c.at,n.catchAt=i,this.otherCatch(n,r.c.id,r.c.star,r.c.g??0))} + } + } + otherPos(t,i){ + return{ + x:t.x,y:t.y} + } + crossesLand(t,i){ + const s=Math.hypot(i.x-t.x,i.y-t.y),e=Math.ceil(s/48); + for(let n=1; + n<e; + n++)if(this.isLand(t.x+(i.x-t.x)*n/e,t.y+(i.y-t.y)*n/e))return!0; + return!1} + stepOther(t,i,s){ + t.pending&&i>=t.goAt&&(t.mode=t.pending,t.pending=null); + const e=Qt(i=>{ + t.rot+=Math.max(-.7*s,Math.min(.7*s,BDi(i,t.rot)))} + ,"turn"); + if("fish"===t.mode){ + const i=Math.min(1,.15*s); + t.x+=(t.tx-t.x)*i,t.y+=(t.ty-t.y)*i,t.v*=Math.max(0,1-2*s),t.alpha+=(this.otherAlpha(t)-t.alpha)*Math.min(1,1.5*s)} + else if("sail"===t.mode){ + const n=t.tx-t.x,h=t.ty-t.y,r=Math.hypot(n,h),o=BDi(Math.atan2(h,n),t.rot); + e(Math.atan2(h,n)); + const a=Math.min(t.cruise,6+.6*r)*Math.max(.15,Math.cos(o)); + t.v+=(a-t.v)*Math.min(1,.9*s); + const c=t.x+Math.cos(t.rot)*t.v*s,l=t.y+Math.sin(t.rot)*t.v*s; + this.isLand(c+14*Math.cos(t.rot),l+14*Math.sin(t.rot))?(t.mode="hop",t.away=t.rot+.9*(Math.random()<.5?-1:1)):(t.x=c,t.y=l),r<8&&(t.mode="fish",t.castAt=i+800+1800*Math.random()),t.alpha+=(this.otherAlpha(t)-t.alpha)*Math.min(1,1.5*s)} + else{ + e(t.away),t.v+=(40-t.v)*Math.min(1,.8*s); + const n=t.x+Math.cos(t.rot)*t.v*s,h=t.y+Math.sin(t.rot)*t.v*s; + this.isLand(n,h)?t.v*=.5:(t.x=n,t.y=h),t.alpha=Math.max(0,t.alpha-s*DDi/2.8),"hop"===t.mode&&t.alpha<=.01&&(t.x=t.tx,t.y=t.ty,t.v=0,t.mode="fish",t.rot=Math.random()*Math.PI*2,t.fSet=!1,t.fly=null,t.castAt=i+1200+1500*Math.random())} + } + pickOtherFloat(t,i){ + const s=t.rot+.25*(t.seed%7-3)+(i?2.4*(Math.random()-.5):0); + for(let e=0; + e<8; + e++){ + const n=s+(e%2?1:-1)*Math.ceil(e/2)*.7,h=60+(t.seed+(i?40*Math.random():0))%35,r=t.x+Math.cos(n)*h,o=t.y+Math.sin(n)*h; + if(!(this.isLand(r,o)||i&&Math.hypot(r-t.fx,o-t.fy)<25))return t.fx=r,t.fy=o,!0} + return!1} + drawOthers(t,i){ + const s=performance.now(),e=this.viewH; + s>=this.otherPickAt&&this.pickOtherBoats(s); + const n=-this.world.x-80,h=-this.world.x+this.viewW+80,r=-this.world.y-80,o=-this.world.y+e+80,a=this.othersLines.clear(),c=t/1e3,l=nAi.gear(); + for(const[d,f]of this.others){ + if(this.stepOther(f,s,i),"leave"===f.mode&&f.alpha<=.01){ + this.others.delete(d),this.dropOtherBoat(f); + continue} + const t=this.otherPos(f),e=t.x>n&&t.x<h&&t.y>r&&t.y<o&&!this.unexplored(t.x,t.y); + if(f.sp.visible=e,!e){ + f.name.visible=!1,f.float.visible=!1,f.water.visible&&f.water.reset(),f.water.visible=!1; + continue} + f.sp.alpha=f.alpha,f.v; + const u=GNi(t.x,t.y,f.rot,c,this.zone,f.a.b,f.v); + f.sp.position.set(u.x,u.y),f.sp.rotation=u.rotation,f.sp.scale.set(oDi*u.scaleX,oDi*u.scaleY),f.sp.skew.set(u.skew,0),f.water.visible=!0; + const p=Math.hypot(t.x-this.bx,t.y-this.by); + f.water.alpha=f.alpha/DDi*(.42+.25*Math.max(0,1-p/500)),f.water.update(i,{ + x:u.waterX,y:u.waterY,heading:u.rotation-Math.PI/2,speed:f.v,level:f.a.b,zone:this.zone,time:c,velocity:u.velocity,roll:u.roll,pitch:u.pitch,rollVelocity:u.rollVelocity,pitchVelocity:u.pitchVelocity} + ,nAi.foam(),(t,i)=>!this.isLand(t,i)),f.lamp.rotation=.65*-u.roll+.012*Math.sin(c/2.2+f.seed); + const g=l.info.boats[nAi.boatArt(f.a.b)],w=f.sp.scale.x,m=f.sp.scale.y,v=f.sp.rotation,_=f.sp.skew.x,M=f.sp.x+g.seat[0]*Math.cos(v)*w-g.seat[1]*Math.sin(v-_)*m,b=f.sp.y+g.seat[0]*Math.sin(v)*w+g.seat[1]*Math.cos(v-_)*m; + if("fish"!==f.mode||f.a.s||f.pending&&s>f.goAt-1200||f.a.fx&&f.a.fx>Date.now())f.fSet=!1,f.fly=null; + else if(!f.fSet&&s>=f.castAt&&f.fAlpha<.05)if(this.pickOtherFloat(f,f.recastAt>0)){ + const t=Math.atan2(f.fy-b,f.fx-M); + f.fly={ + x0:M+9*Math.cos(t),y0:b+9*Math.sin(t),t0:s} + ,f.fSet=!0,f.fAlpha=1,f.recastAt=s+GDi[0]+Math.random()*(GDi[1]-GDi[0])} + else f.castAt=s+3e3; + else f.fSet&&!f.fly&&s>=f.recastAt&&(f.fSet=!1,f.castAt=s+650); + if(f.fly||(f.fAlpha+=((f.fSet?1:0)-f.fAlpha)*Math.min(1,5*i)),f.float.visible=f.fAlpha>.02,f.float.visible){ + let t,e; + if(f.fly){ + const i=Math.min(1,(s-f.fly.t0)/480),n=4*(14+.12*Math.hypot(f.fx-f.fly.x0,f.fy-f.fly.y0))*i*(1-i); + t=f.fly.x0+(f.fx-f.fly.x0)*i,e=f.fly.y0+(f.fy-f.fly.y0)*i-n,f.float.rotation=0,i>=1&&(f.fly=null,this.ripples.push({ + x:f.fx,y:f.fy,age:0,life:1.2,r0:3,r1:14,alpha:.32} + ))} + else{ + const s=LNi(f.fx,f.fy,c,this.zone); + t=s.x,e=s.y,f.float.rotation=s.rotation,f.fSet&&Math.random()<.08*i&&this.ripples.push({ + x:t,y:e,age:0,life:2.1,r0:4,r1:13,alpha:.16*f.fAlpha} + )} + f.float.position.set(t,e),f.float.alpha=f.fAlpha*f.alpha/DDi; + const n=Math.atan2(f.fy-b,f.fx-M); + f.crew.rotation=BDi(n+Math.PI/2,v)*Math.min(1,1.5*f.fAlpha); + const h=M+9*Math.cos(n),r=b+9*Math.sin(n); + a.moveTo(h,r).quadraticCurveTo((h+t)/2,(r+e)/2+9,t,e-3).stroke({ + color:16053480,width:.45,alpha:.45*f.float.alpha} + )} + else f.crew.rotation*=Math.max(0,1-3*i); + f.dist=Math.hypot(t.x-this.bx,t.y-this.by),f.px=f.sp.x,f.py=f.sp.y} + const u=[...this.others.values()].filter(t=>t.sp.visible&&"leave"!==t.mode).sort((t,i)=>t.dist-i.dist); + for(const d of this.others.values())"leave"===d.mode&&(d.name.visible=!1); + u.forEach((t,i)=>{ + const e=s-t.catchAt<4e3; + t.name.visible=i<6||e,t.name.visible&&(t.name.position.set(t.px-t.name.width/2,t.py-34),t.name.alpha=t.a.fx&&t.a.fx>Date.now()?1:(e?1:.7)*t.alpha/DDi)} + ),this.drawPlunder(t)} + setFixing(t){ + this.repairFx.setMine(t?{ + broken:t.broken,progress:t.progress??0} + :null); + const i=!!t; + i&&!this.fixingNow&&(this.hideRodBalloon(),this.reelIn(),this.afterFixAt=0),!i&&this.fixingNow&&(this.afterFixAt=performance.now()+1600),this.fixingNow=i} + repairStarted(){ + this.repairFx.markFresh()} + repairFinished(){ + this.repairFx.finish()} + drawFixing(t){ + const i=nAi.gear(),s=128+i.info.angler[0].body[1],e=Date.now(),n=[]; + for(const[h,r]of this.others){ + const t=i.info.boats[nAi.boatArt(r.a.b)]; + if(r.a.fx&&r.a.fx>e&&r.sp.visible&&"leave"!==r.mode&&r.alpha>.2){ + const i=r.sp.rotation,s=r.sp.scale.x; + n.push({ + id:h,broken:!!r.a.fk,face:i,x:r.sp.x+(t.seat[0]*Math.cos(i)-t.seat[1]*Math.sin(i))*s,y:r.sp.y+(t.seat[0]*Math.sin(i)+t.seat[1]*Math.cos(i))*s} + )} + else r.fixing&&(r.fixing=!1,r.crew.texture=DPi(r.crew.texture),r.crew.anchor.y=s/256,r.crew.position.set(t.seat[0],t.seat[1]))} + this.repairFx.update({ + x:this.angler.x,y:this.angler.y,face:this.anglerRot} + ,{ + sprite:this.boat} + ,n); + for(const h of n){ + const t=this.others.get(h.id),e=this.repairFx.crewFor(h.id); + if(!t||!e)continue; + const n=i.info.boats[nAi.boatArt(t.a.b)]; + t.fixing=!0,t.crew.texture=NPi(t.crew.texture,e.crop),t.crew.anchor.y=LPi(s,e.crop),t.crew.rotation=0,t.crew.position.set(n.seat[0],n.seat[1]-e.lean/Math.max(.01,t.sp.scale.y))} + } + cameraShake(t,i){ + this.shakeAmp=Math.max(t,performance.now()<this.shakeUntil?this.shakeAmp:0),this.shakeUntil=Math.max(this.shakeUntil,performance.now()+i)} + boatHit(t,i=!1){ + this.rockUntil=performance.now()+(i?2600:t>0?1800:900),this.splash(this.bx,this.by+6,i?18:t>0?10:5,15004914,i?30:t>0?20:10),i?this.floatTag("고장!",16739179,this.bx,this.by-70):this.floatTag(t>0?`내구도 −${ + nSi(t)} + `:"끄떡없음",t>0?16751752:8378016,this.bx,this.by-64)} + bossGiant(t){ + if(this.giants.length)return!0; + for(const i of[!0,!1,!1])if(this.spawnGiant(i,t)||this.spawnGiant(i))return!0; + return!1} + get hasBossShadow(){ + return this.giants.some(t=>!t.leaving&&t.vanish<.5)} + bossShadow(t){ + const i=this.giants.find(t=>!t.leaving&&t.vanish<.5); + if(!i)return null; + const s=-this.world.x+this.viewW/2,e=-this.world.y+this.viewH/2; + let n=Math.hypot(i.x-this.bx,i.y-this.by),h=!1; + const r=i.trail.slice(-Math.ceil(i.L/4)); + for(let o=0; + o<r.length; + o+=3){ + const t=r[o]; + n=Math.min(n,Math.hypot(t.x-this.bx,t.y-this.by)),Math.abs(t.x-s)<this.viewW/2-10&&Math.abs(t.y-e)<this.viewH/2-10&&(h=!0)} + return Math.abs(i.x-s)<this.viewW/2&&Math.abs(i.y-e)<this.viewH/2&&(h=!0),h=h&&i.view.alpha>.12,{ + near:h&&n<=t,dist:n,seen:h} + } + bossPoint(){ + const t=this.giants.find(t=>!t.leaving); + if(!t)return{ + x:this.bx+40,y:this.by-110} + ; + let i={ + x:t.x,y:t.y} + ,s=Math.hypot(t.x-this.bx,t.y-this.by); + for(const e of t.trail.slice(-Math.ceil(t.L/4))){ + const t=Math.hypot(e.x-this.bx,e.y-this.by); + t<s&&(s=t,i=e)} + return{ + x:i.x,y:i.y} + } + harpoonBodyPoint(i,s){ + var e; + const n={ + alpha:i.view.alpha,tint:i.view.tint,blur:(null==(e=i.blur)?void 0:e.strength)??.35+i.depth*i.depth*4} + ,h=tNi(i,s); + if(h)return{ + ...h,x:i.view.x+h.x,y:i.view.y+h.y,...n} + ; + const r=i.L*(1+.06*(1-i.depth)),o=r*s,a=t.trailAt(i.trail,i,o); + let c=a.x,l=a.y,u=t.trailDir(i.trail,i,o,.06*r); + if(i.rig){ + const e=t.trailDir(i.trail,i,.18*r,.13*r),n=t.trailAt(i.trail,i,.2*r),h=gNi(i.kind,s),d=n.x-Math.cos(e)*(o-.2*r),f=n.y-Math.sin(e)*(o-.2*r); + c=d+(a.x-d)*h,l=f+(a.y-f)*h,u=e+BDi(u,e)*h} + else if(!i.spine){ + const t=SDi[i.kind],e=t.amp*r*Math.pow(s,t.tailPow)*Math.sin(i.phase-s*t.wave); + c-=Math.sin(a.a)*e,l+=Math.cos(a.a)*e} + return{ + x:c,y:l,angle:u,...n} + } + captureHarpoonTarget(t){ + var i; + const s=this.giants.find(t=>!t.leaving&&t.vanish<.5&&t.view.alpha>.12); + if(!s||!(null==(i=this.bossShadow(t))?void 0:i.near))return null; + let e=.35,n=1/0; + for(let o=.18; + o<=.66; + o+=.04){ + const i=this.harpoonBodyPoint(s,o),h=Math.hypot(i.x-this.bx,i.y-this.by),r=i.x+this.world.x,a=i.y+this.world.y,c=h+3*Math.max(0,64-h); + h<=t&&c<n&&r>=12&&r<=this.viewW-12&&a>=12&&a<=this.viewH-12&&(n=c,e=o)} + if(!Number.isFinite(n))return null; + const h=this.harpoonBodyPoint(s,e),r=(this.bx-h.x)*-Math.sin(h.angle)+(this.by-h.y)*Math.cos(h.angle)>=0?1:-1; + return{ + point:h,sample:Qt(()=>s.view.destroyed?null:this.harpoonBodyPoint(s,e),"sample"),missOffset:r*Math.max(44,Math.min(100,.3*s.L)),hit:Qt((t=1)=>{ + var i; + if(s.view.destroyed)return; + s.effort=Math.min(1,s.effort+.025); + const e=zPi(r); + s.flinch={ + at:performance.now(),power:t,dx:e.x,dy:e.y,base:(null==(i=s.flinch)?void 0:i.base)??s.view.tint} + } + ,"hit")} + } + get harpoonBusy(){ + return this.harpoonFxs.some(t=>!t.destroyed&&!t.landed)} + cancelHarpoon(){ + for(const t of this.harpoonFxs)t.cancel(); + this.harpoonFxs=[],this.setAimMark(null),this.line.destroyed||(this.line.visible=!0)} + setAimMark(t,i=16777215,s=0,e=!1){ + var n; + if(!t)return null==(n=this.aimMark)||n.destroy(),void(this.aimMark=null); + this.aimMark&&!this.aimMark.destroyed||(this.aimMark=new ip,this.aimMark.eventMode="none",this.worldTop.addChild(this.aimMark)); + const h=e?9:16-7*Math.max(0,Math.min(1,s)),r=this.aimMark.clear(); + r.circle(0,0,h).stroke({ + color:399649,width:4,alpha:.45} + ).circle(0,0,h).stroke({ + color:i,width:2,alpha:.95} + ); + for(let o=0; + o<4; + o++){ + const t=o*Math.PI/2+Math.PI/4,s=Math.cos(t),e=Math.sin(t); + r.moveTo(s*(h+3),e*(h+3)).lineTo(s*(h+9),e*(h+9)).stroke({ + color:i,width:2,alpha:.9} + )} + r.circle(0,0,1.6).fill(i),r.position.set(t.x,t.y)} + harpoonStrike(t,i,s,e,n={ + } + ){ + if(!this.running||this.harpoonBusy)return Promise.resolve(!1); + this.setAimMark(null); + const h=new QPi(t,i,s,e,{ + release:n.release,impact:Qt((t=0)=>{ + var i; + const s=qPi(t); + s.amp&&this.cameraShake(s.amp,s.ms),null==(i=n.impact)||i.call(n,t)} + ,"impact")} + ,()=>({ + x:12-this.world.x,y:12-this.world.y,width:this.viewW-24,height:this.viewH-24} + )); + return this.harpoonFxs.push(h),this.giantLayer.addChild(h.underwater),this.hitLayer.addChild(h),this.worldTop.addChild(h.result),h.done} + helpFx(t,i=null,s="수리 +3%"){ + const e=Qt(()=>{ + if("me"===t)return{ + x:this.angler.x,y:this.angler.y-8} + ; + const i=this.boatPoint(t); + return i?{ + x:i.x,y:i.y-8} + :null} + ,"target"),n=i?this.boatPoint(i):"me"===t?null:this.boatPoint("me"); + this.repairFx.help(n?{ + x:n.x,y:n.y-20} + :null,e,()=>{ + const i=e(); + i&&("me"===t&&this.repairFx.helpPunch(),this.floatTag(s,16106577,i.x,i.y-64))} + )} + otherAlpha(t){ + return t.a.a?.62*DDi:DDi} + static otherName(t){ + return t.fx&&t.fx>Date.now()?mki(`${ + t.fk?"고장":"수리 중"} + · ${ + t.n} + `,16777215,t.fk?11879211:10115614,10,5):mki(t.a?`Zz ${ + t.n} + `:t.n,t.a?13096664:16777215,QIi,10,5)} + otherAt(t,i){ + let s=null,e=30; + for(const n of this.others.values()){ + if(!n.sp.visible||"leave"===n.mode||n.alpha<.2)continue; + const h=Math.hypot(t-n.x,i-n.y); + h<=e&&(e=h,s=n)} + return s} + boatPoint(t){ + if("me"===t)return{ + x:this.bx,y:this.by} + ; + const i=this.others.get(t); + return i&&"leave"!==i.mode?{ + x:i.x,y:i.y} + :null} + setPlunder(t,i){ + this.ropes=t,this.plunderFocus=i} + drawPlunder(t){ + const i=this.plunderG.clear(),s=t/1e3,e=Qt(t=>{ + if("me"===t)return{ + x:this.boat.x,y:this.boat.y} + ; + const i=this.others.get(t); + return i&&i.sp.visible?{ + x:i.sp.x,y:i.sp.y} + :null} + ,"at"); + for(const n of this.ropes){ + const t=e(n.from),h=e(n.to); + if(!t||!h)continue; + const r=n.tension??0,o=n.tp??0,a=Math.hypot(h.x-t.x,h.y-t.y),c=Math.min(26,6+.08*a)*(1+.15*Math.sin(1.7*s))*(1-.18*r*o),l=r?Math.sin(s*(28+8*r))*(1.2+1.4*r)*(.4+o):0,u=-(h.y-t.y)/(a||1),d=(h.x-t.x)/(a||1),f=(t.x+h.x)/2+u*l,p=(t.y+h.y)/2+c+d*l,g=r>=3?16739211:2===r?16106577:1===r?14862735:13213802; + if(r>=2&&i.moveTo(t.x,t.y).quadraticCurveTo(f,p,h.x,h.y).stroke({ + color:g,width:6+2*Math.sin(10*s),alpha:.22+.2*o} + ),i.moveTo(t.x,t.y).quadraticCurveTo(f,p,h.x,h.y).stroke({ + color:2759182,width:3.2,alpha:.55} + ),i.moveTo(t.x,t.y).quadraticCurveTo(f,p,h.x,h.y).stroke({ + color:g,width:1.6+(r>=2?.8:0),alpha:.95} + ),r&&Math.random()<.05*r*(.5+o)){ + const i=Math.random()*Math.PI*2,s=14+18*Math.random(),e="me"===n.to?t:h; + this.ripples.push({ + x:e.x+Math.cos(i)*s,y:e.y+Math.sin(i)*s,age:0,life:.7,r0:3,r1:10+3*r,alpha:.45} + )} + const w=Math.atan2(h.y-p,h.x-f); + i.arc(h.x-6*Math.cos(w),h.y-6*Math.sin(w),5,w-.4,w+.9*Math.PI).stroke({ + color:14673640,width:1.6,alpha:.9} + )} + if(this.drawSnaps(i),this.plunderFocus){ + const t=e(this.plunderFocus); + if(t){ + const e=1+.06*Math.sin(3*s); + i.circle(t.x,t.y,30*e).stroke({ + color:VIi,width:2,alpha:.85} + ),i.circle(t.x,t.y,30*e+5).stroke({ + color:VIi,width:1,alpha:.3} + )} + } + } + plunderFly(t,i,s,e){ + const n=this.boatPoint(t),h=this.boatPoint(i); + if(!n||!h)return; + let r,o=null,a=1; + if(s){ + if(r=new Ve,o=new Ye(nAi.fish(s.id)),o.anchor.set(.5),a=40/Math.max(o.texture.width,o.texture.height,1),o.scale.set(h.x<n.x?-a:a,a),r.addChild(o),s.grade>=1){ + const t=mki(["","B","A","S"][s.grade],16777215,eki[s.grade],9,4); + t.position.set(10,-22),r.addChild(t)} + } + else r=(new ip).ellipse(0,0,9,4.5).fill(12178652).ellipse(0,0,9,4.5).stroke({ + color:2373180,width:1.2} + ).poly([-8,0,-14,-5,-14,5]).fill(12178652).circle(5,-1,1.1).fill(1778727); + r.eventMode="none",this.flyLayer.addChild(r); + const c=Math.hypot(h.x-n.x,h.y-n.y),l=Math.min(26,6+.08*c),u={ + t:0} + ; + MR.to(u,{ + t:1,duration:1.1,ease:"power1.inOut",onUpdate:Qt(()=>{ + const t=u.t,i=(n.x+h.x)/2,s=(n.y+h.y)/2+l,e=(1-t)*(1-t)*n.x+2*(1-t)*t*i+t*t*h.x,a=(1-t)*(1-t)*n.y+2*(1-t)*t*s+t*t*h.y-10*Math.sin(t*Math.PI); + r.position.set(e,a),o?(r.scale.set(.85+.35*Math.sin(t*Math.PI)),o.rotation=.25*Math.sin(22*t)):r.rotation=Math.atan2(h.y-n.y,h.x-n.x)+.35*Math.sin(18*t)} + ,"onUpdate"),onComplete:Qt(()=>{ + r.destroy({ + children:!0} + ),this.splash(h.x,h.y,4,15004914,10); + const t=this.boatPoint(i)??h; + s&&s.grade>=2&&(this.burst(t.x,t.y,s.grade>=3?26:14,eki[s.grade]),this.splash(t.x,t.y,8,16777215,20)),e&&this.floatTag(e.text,e.color,t.x,t.y-64)} + ,"onComplete")} + ),this.splash(n.x,n.y,3,15004914,8)} + ropeSnap(t,i){ + this.snaps.push({ + a:t,b:i,t0:performance.now()} + ); + const s=this.boatPoint(t),e=this.boatPoint(i); + s&&e&&this.splash((s.x+e.x)/2,(s.y+e.y)/2+12,8,15004914,18)} + drawSnaps(t){ + const i=performance.now(); + this.snaps=this.snaps.filter(t=>i-t.t0<900); + for(const s of this.snaps){ + const e=this.boatPoint(s.a),n=this.boatPoint(s.b); + if(!e||!n)continue; + const h=(i-s.t0)/900,r=1-h,o=(e.x+n.x)/2,a=(e.y+n.y)/2,c=6+26*h,l=30*h; + for(const[i,s]of[[e,-1],[n,1]]){ + const e=o+s*c,n=a+l; + t.moveTo(i.x,i.y).quadraticCurveTo((i.x+e)/2,(i.y+n)/2+10+.5*l,e,n).stroke({ + color:13213802,width:1.6,alpha:r} + )} + } + } + sailNearBoat(t){ + const i=this.boatPoint(t); + if(!i)return!1; + const s=Math.atan2(this.by-i.y,this.bx-i.x); + for(let e=0; + e<12; + e++){ + const t=s+(e%2?1:-1)*Math.ceil(e/2)*.5,n=i.x+85*Math.cos(t),h=i.y+85*Math.sin(t); + if(!this.isLand(n,h)&&("sail"!==this.mode&&this.setMode("sail"),this.sailTo(n,h)))return this.hideRodBalloon(),this.marker(n,h,VIi),!0} + return!1} + otherCatch(t,i,s,e=0){ + const n=performance.now(),h=this.otherPos(t,n),r=new Ye(nAi.fish(i)); + r.anchor.set(.5),r.width=r.height=30; + const o=mki(`★${ + s} + ${ + fTi(e)} + ${ + t.a.n} + `,16777215,e>=2?eki[e]:ski[Math.min(5,s)],10,6); + o.position.set(h.x-o.width/2,h.y-70),this.flyLayer.addChild(r,o); + const a={ + h:0} + ; + MR.timeline({ + onComplete:Qt(()=>{ + r.destroy(),o.destroy({ + children:!0} + )} + ,"onComplete")} + ).to(a,{ + h:1,duration:.7,ease:"none",onUpdate:Qt(()=>{ + r.position.set(h.x+18*a.h,h.y-240*a.h*(1-a.h)+10),r.rotation=1.2*(a.h-.5)} + ,"onUpdate")} + ).from(o,{ + alpha:0,y:o.y+8,duration:.25} + ,0).to([r,o],{ + alpha:0,duration:.5} + ,2.2),this.splash(h.x+10,h.y,5,15004914,16),(s>=5||3===e)&&this.burst(h.x,h.y,14,3===e?eki[3]:ski[5])} + waterAround(t){ + const i=[],s=[90,520,120]; + for(let e=0; + e<t; + e++){ + const t=s[e%s.length]; + for(let s=0; + s<24; + s++){ + const n=2.1*e+.55*s,h=this.bx+Math.cos(n)*t,r=this.by+Math.sin(n)*t; + if(!(this.isLand(h,r)||this.info&&(h<0||r<0||h>this.info.w||r>this.info.h))){ + i.push({ + x:Math.round(h),y:Math.round(r),p:sNi.at(this.key,h,r)} + ); + break} + } + } + return i} + sampleWater(t){ + var i; + const s=(null==(i=this.info)?void 0:i.points)??[],e=[],n=this.info; + for(let h=0; + e.length<t&&h<60*t; + h++){ + let t,i; + if(Math.random()<.4){ + const e=s[Math.floor(Math.random()*s.length)],h=Math.random()*Math.PI*2,r=60+Math.random()*(n.w>1500?380:200); + t=e.x+Math.cos(h)*r,i=e.y+Math.sin(h)*r} + else t=Math.random()*n.w,i=Math.random()*n.h; + this.isLand(t,i)||e.push({ + x:Math.round(t),y:Math.round(i),p:sNi.at(this.key,t,i)} + )} + return e} + get loadedChunks(){ + return[...this.chunks.values()].filter(Boolean).length} + setTutorial(t){ + this.tut=t,this.layoutView(),this.tutorialMoveBtn=!1,this.tutorialRing=null; + for(const i of[this.othersLayer,this.othersFloats,this.othersLines,this.otherNames,this.othersWater,this.plunderG])i.visible=!t; + t?this.applyTutorialHud():(this.modeBtn.visible=!0,this.miniMap.visible=!this.bigMap.visible)} + get inTutorial(){ + return this.tut} + applyTutorialHud(){ + this.hud.visible=!0,this.hud.alpha=1,this.hint.visible=!1,this.goalArrow.visible=!1,this.miniMap.visible=!1,this.modeBtn.visible=this.tutorialMoveBtn} + tutorialSail(t,i){ + return!(!this.info||(this.isLand(t,i)?(this.marker(t,i,16751752),1):("sail"!==this.mode&&this.setMode("sail"),!this.sailTo(t,i)||(this.marker(t,i,16777215),this.hideRodBalloon(),0))))} + tutorialTapRod(){ + return!!this.rodBalloonOn&&(this.hideRodBalloon(),this.arrive(),!0)} + tutorialModeTap(){ + "fish"===this.mode&&this.setMode("sail")} + get moving(){ + return!!this.target} + worldToGlobal(t,i){ + return this.world.toGlobal({ + x:t,y:i} + )} + globalToWorld(t){ + return this.world.toLocal(t)} + get boatWorld(){ + return{ + x:this.bx,y:this.by} + } + get pointNow(){ + return this.point} + get rodBalloonCenter(){ + return this.rodBalloonOn?{ + x:this.rodBalloon.x,y:this.rodBalloon.y+-24.8} + :null} + get modeButton(){ + return this.modeBtn} + tutorialSpot(t,i,s,e,n){ + if(!this.info)return null; + const h=this.viewW,r=this.viewH,o=this.world.x,a=this.world.y,c=Qt((t,i)=>{ + const s=t+o,c=i+a; + if(s<44||s>h-44||c<e+36||c>r-n-36)return!1; + if(this.isLand(t,i)||this.shoreDist(t,i)<50)return!1; + for(const e of this.hubPlaces.values())if(Math.abs(e.x-t)<130&&i>e.y-175&&i<e.y+80)return!1; + for(const e of this.labels.children)if(Math.abs(e.x+e.width/2-t)<e.width/2+40&&Math.abs(e.y+e.height/2-i)<50)return!1; + if(sNi.at(this.key,t,i)!==this.point)return!1; + const l=Math.hypot(t-this.bx,i-this.by); + for(let e=12; + e<l; + e+=12){ + const s=this.bx+(t-this.bx)*e/l,n=this.by+(i-this.by)*e/l; + if(this.isLand(s,n)||this.shoreDist(s,n)<22)return!1} + return!0} + ,"ok"); + for(const l of[s,(i+s)/2,i])for(const i of t){ + const t=i*Math.PI/180,s=this.bx+Math.cos(t)*l,e=this.by+Math.sin(t)*l; + if(c(s,e))return{ + x:s,y:e} + } + return null} + buildRodBalloon(){ + const t=this.rodBalloon; + this.rodBubble.anchor.set(.5,XEi),this.rodBubble.scale.set(.2),t.addChild(this.rodBubble),t.eventMode="none",t.visible=!1} + showRodBalloon(){ + if(!this.fixingNow){ + if(!this.castSpot())return this.hideRodBalloon(),void(this.hubs.some(t=>this.hubNear(t.id))||this.showHint(sDi,!0)); + this.rodBalloonOn=!0,this.rodBalloon.visible=!0,this.rodBubble.texture===as.EMPTY&&(this.rodBubble.texture=nAi.gear().bubbles[2]),MR.killTweensOf(this.rodBalloon.scale),MR.fromTo(this.rodBalloon.scale,{ + x:.2,y:.2} + ,{ + x:1,y:1,duration:.32,ease:"back.out(3)"} + ),jG("light"),this.showHint("낚싯대 풍선을 누르면 낚시 시작 · 물을 누르면 그곳으로 가요",!1,!0)} + } + hideRodBalloon(){ + this.rodBalloonOn=!1,this.rodBalloon.visible=!1} + drawRodBalloon(t){ + if(!this.rodBalloonOn)return; + this.rodBalloon.position.set(this.bx,this.by-44+2.5*Math.sin(t/320)); + const i=t%1600/1600; + MR.isTweening(this.rodBalloon.scale)||this.rodBubble.scale.set(.2*(1+(i<.18?.08*Math.sin(i/.18*Math.PI):0)))} + rodBalloonHit(t,i){ + return this.rodBalloonOn&&Math.hypot(t-this.rodBalloon.x,i-(this.rodBalloon.y+-24.8))<=30} + dock(){ + var t; + this.dockAt=performance.now()+2e3,this.dockShown=0,this.hint.visible=!1; + const i=this.hubs.find(t=>("offer"===t.state||"ready"===t.state)&&this.hubNear(t.id)); + i&&(null==(t=this.onHubArrive)||t.call(this,i.id))} + castSpot(){ + if(!this.boatCanFish())return null; + const t=this.heading; + for(const i of[80,110,140,60])for(let s=0; + s<16; + s++){ + const e=t+(s%2?1:-1)*Math.ceil(s/2)*(Math.PI/8),n=this.bx+Math.cos(e)*i,h=this.by+Math.sin(e)*i; + if(this.floatOk(n,h)&&!this.isLand((this.bx+n)/2,(this.by+h)/2))return{ + x:n,y:h} + } + return null} + landWithin(t,i,s){ + if(this.isLand(t,i))return!0; + for(const e of[.5*s,s])for(let s=0; + s<16; + s++){ + const n=s*Math.PI/8; + if(this.isLand(t+Math.cos(n)*e,i+Math.sin(n)*e))return!0} + return!1} + pierDist(t,i){ + let s=1/0; + for(const e of this.hubPlaces.values()){ + if(e.ship)continue; + const n=e.x,h=e.y-4,r=Math.atan2(e.dy-e.y,e.dx-e.x),o=Math.hypot(e.dx-e.x,e.dy-e.y)-6,a=Math.cos(r),c=Math.sin(r),l=Math.max(-4,Math.min(o,(t-n)*a+(i-h)*c)); + s=Math.min(s,Math.hypot(t-(n+a*l),i-(h+c*l))-13)} + return s} + floatOk(t,i){ + return!this.landWithin(t,i,56)&&this.pierDist(t,i)>=36} + boatCanFish(t=this.bx,i=this.by){ + return!this.landWithin(t,i,110)&&this.pierDist(t,i)>=90} + arrive(){ + var t; + const i=this.castSpot(); + if(!i)return this.hideRodBalloon(),void this.showHint(sDi,!0); + this.setMode("fish"); + const s=this.nearestPoint(); + this.cast(i.x,i.y,!1,s===this.point),s!==this.point&&(this.point=s,this.pointSyncUntil=performance.now()+4e3,null==(t=this.onStopAtPoint)||t.call(this,s))} + splash(t,i,s,e=16777215,n=0){ + n>0&&this.crowns.push({ + x:t,y:i,age:0,life:.55,size:n,t:Math.floor(4*Math.random()),rot:Math.random()*Math.PI*2} + ); + for(let h=0; + h<s; + h++){ + const s=Math.random()*Math.PI*2,n=20+40*Math.random(); + this.particles.push({ + x:t,y:i,vx:Math.cos(s)*n,vy:Math.sin(s)*n*.6,z:0,vz:60+60*Math.random(),life:.6,age:0,size:1.2+Math.random(),color:e} + )} + this.ripples.push({ + x:t,y:i,age:0,life:.9,r0:4,r1:20,alpha:.7} + )} + playCatch(t,i,s){ + if(this.resolveNibbler("어류"===kSi(t.id).kind),this.sailing)return this.catchAboard(t,i); + if(this.reel||performance.now()<this.busyUntil)return t.broken||this.tag(`${ + kSi(t.id).name} + ${ + fTi(t.grade??0)} + ${ + _Ti(t.kg)} + `,16777215),.3; + const e=kSi(t.id),n=t.grade??0,h=t.broken?1:t.star>=5||3===n?4:4===t.star||2===n?3:3===t.star||i?2:1,r={ + x:this.bx,y:this.by} + ,o=this.floatVisible?{ + ...this.fxp} + :{ + x:this.bx-70*Math.sin(this.heading),y:this.by+70*Math.cos(this.heading)} + ,a=this.floatVisible&&!this.sailing; + this.floatVisible=!1,this.splash(o.x,o.y,8+3*h,15004914,22+5*h),jG(h>=3?"medium":"light"); + const c=Math.max(1,Math.hypot(r.x-o.x,r.y-o.y)),l=(r.x-o.x)/c,u=(r.y-o.y)/c,d=c>34?{ + x:r.x-22*l,y:r.y-22*u} + :{ + ...o} + ,f=new eLi("fish"),p=96*(.2+.025*h); + f.tint=665137,f.alpha=.5,f.swim(p,0,1),this.shadowLayer.addChild(f); + const g={ + p:0} + ,w=Qt((t,i,s)=>{ + this.reel={ + x:t,y:i,level:h} + ,f.position.set(t,i),f.rotation=Math.atan2(r.y-i,r.x-t),f.swim(p,40*s,1,.25*Math.sin(9*s)),Math.random()<.7&&this.addFoam(t+9*(Math.random()-.5),i+7*(Math.random()-.5),1.6+2.6*Math.random(),1+Math.random(),.65),Math.random()<.18+.05*h&&this.splash(t,i,1),Math.random()<.08&&this.ripples.push({ + x:t,y:i,age:0,life:.9,r0:6,r1:18+3*h,alpha:.45} + )} + ,"place"),m=MR.timeline({ + onComplete:Qt(()=>{ + MR.killTweensOf(f),f.destroy(),this.catchTl===m&&(this.catchTl=null)} + ,"onComplete")} + ); + if(this.catchTl=m,this.busyUntil=1/0,t.broken){ + const t=Math.min(26,.3*c); + return m.to(g,{ + p:1,duration:.9,ease:"none",onUpdate:Qt(()=>{ + const i=9*Math.sin(g.p*Math.PI*5); + w(o.x+l*t*g.p-u*i,o.y+u*t*g.p+l*i,g.p)} + ,"onUpdate")} + ).call(()=>{ + const t=this.reel; + this.reel=null,this.splash(t.x,t.y,10,15004914,26),this.tag("줄이 끊겼다! · 더 튼튼한 낚싯줄이 필요해요",XIi),jG("heavy"),MR.to(f,{ + x:t.x-70*l,y:t.y-70*u,alpha:0,duration:.6,ease:"power2.out"} + )} + ).to({ + } + ,{ + duration:.6} + ).call(()=>{ + this.busyUntil=0,!a||this.sailing||this.floatVisible||this.cast(o.x,o.y,!1,!1)} + ),.9} + const v=[3,3,4,5,6][h],_={ + q:0,side:0} + ,M=Qt(()=>{ + const t=performance.now()/1e3,i=Math.sin(9*t+h)*(2.5+h)*(1-.6*_.q),s=_.side+i,e=Math.max(0,Math.min(1,_.q)); + w(o.x+(d.x-o.x)*e-u*s,o.y+(d.y-o.y)*e+l*s,t/4)} + ,"upd"); + let b=0,y=0; + for(let x=0; + x<v; + x++){ + const t=x===v-1,i=t?1-b:1/v*(.85+.45*Math.random()); + b=Math.min(1,b+i); + const s=.26+.02*h; + if(m.to(_,{ + q:b,side:0,duration:s,ease:"power2.out",onUpdate:M,onStart:Qt(()=>{ + this.reelPull=!0,this.reel&&this.splash(this.reel.x,this.reel.y,2+h,15004914),h>=3&&jG("light")} + ,"onStart")} + ),y+=s,t)break; + const e=h>=3&&Math.random()<.35,n=e?.55:.3+.2*Math.random(); + b=Math.max(0,b-i*(e?.45:.15)),m.to(_,{ + q:b,side:(Math.random()<.5?-1:1)*(e?16+3*h:4+2*h),duration:n,ease:e?"power1.out":"sine.inOut",onUpdate:M,onStart:Qt(()=>{ + this.reelPull=!1} + ,"onStart")} + ),y+=n} + m.call(()=>{ + this.reelPull=!1} + ); + const E=[0,26,30,34,40][h]*eDi[t.grade??0],A=new Ye(nAi.fish(t.id)); + A.anchor.set(.5),A.width=A.height=E,A.visible=!1; + const S=(new ip).ellipse(0,0,.4*E,.18*E).fill({ + color:401450,alpha:.35} + ); + S.visible=!1,this.flyLayer.addChild(S,A); + const T=Math.hypot(r.x-d.x,r.y-d.y),C=22+.4*T+6*h,O=.42+T/400+.05*h,I={ + p:0} + ; + let k=d.x,R=d.y; + return m.call(()=>{ + this.reel=null,f.visible=!1,A.visible=S.visible=!0,this.splash(d.x,d.y,8+3*h,15004914,20+4*h),jG(h>=3?"medium":"light")} + ).to(I,{ + p:1,duration:O,ease:"none",onUpdate:Qt(()=>{ + const t=I.p,i=4*C*t*(1-t),s=d.x+(r.x-d.x)*t,e=d.y+(r.y-d.y)*t; + A.position.set(s,e-i),A.scale.set(E/100*(1+i/C*.35)); + const n=A.x-k,h=A.y-R; + Math.abs(n)+Math.abs(h)>.2&&(A.rotation=Math.sign(n||1)*Math.atan2(h,Math.abs(n))*.8),k=A.x,R=A.y,S.position.set(s,e),S.alpha=1-i/C*.6} + ,"onUpdate")} + ).call(()=>{ + this.splash(r.x,r.y,4,14207136),h>=3&&this.burst(r.x,r.y,h>=4?24:12,ski[Math.min(5,t.star)]),i||t.star>=4||this.tag(`${ + e.name} + ${ + fTi(t.grade??0)} + ${ + _Ti(t.kg)} + `,16777215)} + ).to([A,S],{ + alpha:0,duration:.3} + ,"+=0.35").call(()=>{ + A.destroy(),S.destroy(),this.busyUntil=0,!a||this.sailing||this.floatVisible||this.cast(o.x,o.y,!1,!1)} + ),y+O} + burst(t,i,s,e){ + for(let n=0; + n<s; + n++){ + const s=Math.random()*Math.PI*2,n=40+80*Math.random(); + this.particles.push({ + x:t,y:i,vx:Math.cos(s)*n,vy:Math.sin(s)*n,z:10,vz:40+60*Math.random(),life:.8,age:0,size:1.5+1.5*Math.random(),color:e} + )} + } + catchAboard(t,i){ + const s=Math.random()<.5?-1:1,e=34*-Math.sin(this.heading)*s,n=34*Math.cos(this.heading)*s; + if(this.splash(this.bx+e,this.by+n,6,15004914,18),t.broken)return.3; + const h=kSi(t.id),r=t.grade??0,o=t.star>=5||3===r?4:4===t.star||2===r?3:3===t.star||i?2:1,a=[0,26,30,34,40][o]*eDi[t.grade??0],c=new Ye(nAi.fish(t.id)); + c.anchor.set(.5),c.width=c.height=a,this.flyLayer.addChild(c); + const l={ + p:0} + ,u=26+5*o; + return MR.to(l,{ + p:1,duration:.55,ease:"none",onUpdate:Qt(()=>{ + const t=l.p; + c.position.set(this.bx+e*(1-t),this.by+n*(1-t)-4*u*t*(1-t)),c.rotation=(.5-t)*s*1.4} + ,"onUpdate"),onComplete:Qt(()=>{ + c.destroy(),this.splash(this.bx,this.by,3,14207136),o>=3&&this.burst(this.bx,this.by,o>=4?24:12,ski[Math.min(5,t.star)]),i||t.star>=4||this.tag(`${ + h.name} + ${ + fTi(t.grade??0)} + ${ + _Ti(t.kg)} + `,16777215)} + ,"onComplete")} + ),jG(o>=3?"medium":"light"),.55} + tag(t,i){ + this.floatTag(t,i,this.bx,this.by-64)} + floatTag(t,i,s,e){ + var n; + const h=rki(t,i,13),r=new Ve,o=new ip; + o.roundRect(0,0,h.width+14,h.height+6,(h.height+6)/2).fill({ + color:QIi,alpha:.85} + ),h.position.set(7,3),r.addChild(o,h),r.position.set(s-r.width/2,e),null==(n=this.labels.parent)||n.addChild(r),MR.timeline({ + onComplete:Qt(()=>r.destroy({ + children:!0} + ),"onComplete")} + ).from(r,{ + alpha:0,y:r.y+8,duration:.2} + ).to(r,{ + y:r.y-14,alpha:0,duration:.5,ease:"power1.in"} + ,1.4)} + } + ; + Qt(UDi,"FishingSeaMap"),Zt(UDi,"DEFAULT_H",400),Zt(UDi,"hintSeen",!1),Zt(UDi,"lightTex",null),Zt(UDi,"regionTex",new Map),Zt(UDi,"MINI",108); + let FDi=UDi; + const $Di=[{ + rays:[14,150],rays2:[9,110],sparkles:18,burst2:!1,ring:0,fish:124,shake:0} + ,{ + rays:[14,160],rays2:[10,118],sparkles:22,burst2:!1,ring:1,fish:128,shake:0} + ,{ + rays:[16,180],rays2:[11,130],sparkles:26,burst2:!0,ring:2,fish:138,shake:0} + ,{ + rays:[18,205],rays2:[12,150],sparkles:32,burst2:!0,ring:3,fish:150,shake:5} + ],HDi=class{ + static get active(){ + return!!this.current&&this.current.h.shown&&!this.current.h.done} + static get pending(){ + return!!this.current&&!this.current.h.done} + static dismiss(t=!1){ + var i; + null==(i=this.current)||i.h.dismiss(t)} + static release(){ + const t=this.current; + if(!t||t.h.done)return; + const i=t.startAt+1.6-performance.now()/1e3; + i<=0?t.h.dismiss():MR.delayedCall(i,()=>t.h.dismiss())} + static show(t,i,s,e,n,h,r={ + } + ){ + const o=r.queue??!0,a=r.holdSec??20,c=performance.now()/1e3; + let l=c+n; + const u=o?this.current:null; + if(u&&!u.h.done&&(l=Math.max(l,u.startAt+1.6),l-(c+n)>8))return null; + const d=Math.max(0,Math.min(3,i.grade)),f=$Di[d],p=Math.max(1,Math.min(6,i.star)),g=ski[p]??VIi,w=d>=2?eki[d]:g,m=new Ve; + m.eventMode="none",m.position.set(s,e),m.alpha=0; + const v=this.glow(w,300+30*d),_=this.glow(16777215,220+30*d),M=this.rays(f.rays[0],f.rays[1],16769946,.42),b=this.rays(f.rays2[0],f.rays2[1],w,.35),y=new Ve,E=(new ip).ellipse(0,.47*f.fish,.37*f.fish,9).fill({ + color:398362,alpha:.35} + ),A=new Ye(i.tex); + A.anchor.set(.5),A.width=A.height=f.fish; + const S=A.scale.x,T=new Ve,C=mki("새 물고기 발견!",jIi,VIi,15,12); + if(T.addChild(C),d>=1){ + const t=mki(`${ + aTi[d]} + ${ + cTi[d]} + `,16777215,eki[d],14,9); + t.position.set(C.width+6,(C.height-t.height)/2),T.addChild(t)} + T.pivot.set(T.width/2,T.height/2); + const O=.5*-f.fish-36; + T.position.set(0,O); + const I=rki(`${ + i.name} + ${ + fTi(d)} + `,KIi,20); + oki(I,300); + const k=rki("★".repeat(p),g,15),R=rki(`${ + _Ti(i.kg)} + ${ + i.dex?` · 도감 ${ + i.dex} + 종째`:""} + `,zIi,13),x=new Ve,P=Math.max(I.width,k.width,R.width)+32,N=(new ip).roundRect(-P/2,0,P,78,14).fill({ + color:QIi,alpha:.94} + ); + d>=1&&N.roundRect(-P/2,0,P,78,14).stroke({ + color:eki[d],width:2,alpha:.9} + ),I.position.set(-I.width/2,8),k.position.set(-k.width/2,34),R.position.set(-R.width/2,54); + const L=mki("화면을 누르면 닫혀요",zIi,QIi,12,8); + L.position.set(-L.width/2,86),L.alpha=0,x.addChild(N,I,k,R,L); + const D=.5*f.fish+12; + x.position.set(0,D); + const G=new Ve; + m.addChild(v,M,b,_,y,E,A,G,T,x),t.addChild(m); + const B=[]; + let U=!1,F=!1,$=!1; + const H={ + get shown(){ + return U} + ,get done(){ + return F} + ,dismiss:Qt((t=!1)=>{ + if(!F&&!$){ + if($=!0,!U)return j.kill(),void V(); + j.kill(),null==W||W.kill(); + for(const t of B)t.kill(); + MR.to(m,{ + alpha:0,y:m.y-18,duration:t?.15:.35,ease:"power1.in",onComplete:V} + )} + } + ,"dismiss")} + ; + let W=null; + const V=Qt(()=>{ + var t,i; + if(!F){ + F=!0,j.kill(),null==W||W.kill(); + for(const t of B)t.kill(); + MR.killTweensOf(m); + for(const t of G.children)MR.killTweensOf([t,t.scale]); + m.destroy({ + children:!0} + ),(null==(t=this.current)?void 0:t.h)===H&&(this.current=null),null==(i=r.onEnd)||i.call(r)} + } + ,"finish"); + o&&(this.current={ + h:H,startAt:l} + ); + const j=MR.timeline({ + delay:l-c} + ); + j.set(m,{ + alpha:1} + ).call(()=>{ + U=!0,u&&u.h!==H&&u.h.dismiss(!0),null==h||h(),this.burst(G,w,f.sparkles,70,90+15*d),B.push(MR.to(M,{ + rotation:"+="+2*Math.PI,duration:26,ease:"none",repeat:-1} + ),MR.to(b,{ + rotation:"-="+2*Math.PI,duration:34,ease:"none",repeat:-1} + ),MR.to(v,{ + alpha:.75,duration:1.4,ease:"sine.inOut",yoyo:!0,repeat:-1,delay:.6} + ),MR.to(A,{ + y:-5,duration:.8,ease:"sine.inOut",yoyo:!0,repeat:-1,delay:.6} + ),MR.timeline({ + repeat:-1,repeatDelay:1.3,delay:1.6} + ).call(()=>this.burst(G,w,3+d,26,50)),MR.to(L,{ + alpha:.8,duration:.5,delay:1.5} + )),W=MR.delayedCall(a,()=>H.dismiss())} + ,[],0).fromTo(_.scale,{ + x:.2,y:.2} + ,{ + x:1.7*_.scale.x,y:1.7*_.scale.y,duration:.45,ease:"power2.out"} + ,0).fromTo(_,{ + alpha:1} + ,{ + alpha:0,duration:.45,ease:"power1.in"} + ,0).fromTo(v.scale,{ + x:0,y:0} + ,{ + x:v.scale.x,y:v.scale.y,duration:.4,ease:"back.out(2)"} + ,0).fromTo([M,b],{ + alpha:0} + ,{ + alpha:1,duration:.35} + ,0).fromTo(M.scale,{ + x:.4,y:.4} + ,{ + x:1,y:1,duration:.5,ease:"back.out(1.6)"} + ,0).fromTo(b.scale,{ + x:.4,y:.4} + ,{ + x:1,y:1,duration:.5,ease:"back.out(1.6)"} + ,.05).fromTo(A.scale,{ + x:.15*S,y:.15*S} + ,{ + x:S,y:S,duration:.5,ease:"back.out(2.4)"} + ,.08).fromTo(A,{ + rotation:-.35} + ,{ + rotation:0,duration:.5,ease:"back.out(2)"} + ,.08).fromTo(E,{ + alpha:0} + ,{ + alpha:1,duration:.3} + ,.2).fromTo(T,{ + alpha:0,y:O+14} + ,{ + alpha:1,y:O,duration:.3,ease:"back.out(2.5)"} + ,.3).fromTo(T.scale,{ + x:.6,y:.6} + ,{ + x:1,y:1,duration:.3,ease:"back.out(2.5)"} + ,.3).fromTo(x,{ + alpha:0,y:D+10} + ,{ + alpha:1,y:D,duration:.3,ease:"power2.out"} + ,.42); + for(let K=0; + K<f.ring; + K++){ + const t=new ip; + y.addChild(t); + const i={ + p:0} + ; + j.fromTo(i,{ + p:0} + ,{ + p:1,duration:.7,ease:"power2.out",onUpdate:Qt(()=>{ + t.clear().circle(0,0,40+i.p*(130+25*d)).stroke({ + color:eki[d],width:5*(1-i.p)+1,alpha:.85*(1-i.p)} + )} + ,"onUpdate")} + ,.05+.2*K)} + if(f.burst2&&j.call(()=>this.burst(G,16774084,Math.round(.6*f.sparkles),40,70+15*d),[],.55),f.shake){ + const t={ + k:0} + ; + j.fromTo(t,{ + k:1} + ,{ + k:0,duration:.45,ease:"power1.out",onUpdate:Qt(()=>{ + m.position.set(s+2*(Math.random()-.5)*f.shake*t.k,e+2*(Math.random()-.5)*f.shake*t.k)} + ,"onUpdate")} + ,.08)} + return H} + static glow(t,i){ + if(!this.glowTex){ + const t=document.createElement("canvas"); + t.width=t.height=128; + const i=t.getContext("2d"),s=i.createRadialGradient(64,64,0,64,64,64); + s.addColorStop(0,"rgba(255,255,255,0.9)"),s.addColorStop(.4,"rgba(255,255,255,0.35)"),s.addColorStop(1,"rgba(255,255,255,0)"),i.fillStyle=s,i.fillRect(0,0,128,128),this.glowTex=as.from(t)} + const s=new Ye(this.glowTex); + return s.anchor.set(.5),s.width=s.height=i,s.tint=t,s.blendMode="add",s} + static rays(t,i,s,e){ + const n=new ip; + for(let h=0; + h<t; + h++){ + const r=h/t*Math.PI*2,o=.07+h%2*.04,a=i*(h%2?.8:1); + n.poly([0,0,Math.cos(r-o)*a,Math.sin(r-o)*a,Math.cos(r+o)*a,Math.sin(r+o)*a]).fill({ + color:s,alpha:e*(h%2?.7:1)} + )} + return n.blendMode="add",n} + static burst(t,i,s,e,n){ + for(let h=0; + h<s; + h++){ + const r=3+4*Math.random(),o=(new ip).poly([0,-r,.28*r,.28*-r,r,0,.28*r,.28*r,0,r,.28*-r,.28*r,-r,0,.28*-r,.28*-r]).fill(h%3==0?i:16774084); + o.blendMode="add",t.addChild(o); + const a=h/s*Math.PI*2+.4*Math.random(),c=e+Math.random()*n; + MR.timeline({ + onComplete:Qt(()=>o.destroy(),"onComplete")} + ).fromTo(o,{ + x:0,y:0,alpha:1,rotation:0} + ,{ + x:Math.cos(a)*c,y:Math.sin(a)*c*.85,rotation:3*Math.random(),duration:.7+.4*Math.random(),ease:"power2.out"} + ).fromTo(o.scale,{ + x:.4,y:.4} + ,{ + x:1.2,y:1.2,duration:.3} + ,0).to(o,{ + alpha:0,duration:.4} + ,"-=0.35")} + } + } + ; + Qt(HDi,"FishingDiscoveryFx"),Zt(HDi,"current",null),Zt(HDi,"glowTex",null); + let WDi=HDi; + const VDi=Qt(()=>`fishing.plunder.seen.${ + EG.userId} + `,"seenKey"); + function jDi(t,i){ + try{ + qG.getInstance().playSFX(t,i)} + catch{ + } + } + function KDi(t,i=12){ + const s=new Ve,e=["C","B","A","S"],n=[5921376,eki[1],eki[2],eki[3]]; + let h=0; + for(const r of[3,2,1,0]){ + if(!t[r])continue; + const o=mki(`${ + e[r]} + ${ + t[r]} + `,16777215,n[r],i,6); + o.x=h,h+=o.width+5,s.addChild(o)} + return s.eventMode="none",s} + Qt(jDi,"sfx$4"),Qt(KDi,"gradeChips"); + const zDi=166; + function YDi(){ + try{ + const t=JSON.parse(localStorage.getItem(VDi())??"null"); + return t&&"number"==typeof t.log?t:null} + catch{ + return null} + } + function qDi(t){ + try{ + localStorage.setItem(VDi(),JSON.stringify(t))} + catch{ + } + } + Qt(YDi,"loadSeen"),Qt(qDi,"saveSeen"); + const XDi=class extends Ve{ + constructor(t,i){ + super(),Zt(this,"peekPanel",new Ve),Zt(this,"banner",new Ve),Zt(this,"notice",new Ve),Zt(this,"peekAngler",null),Zt(this,"peek",null),Zt(this,"peekBusy",!1),Zt(this,"track",{ + thief:{ + key:"",count:-1} + ,victim:{ + key:"",count:-1} + } + ),Zt(this,"autoStopAt",0),Zt(this,"tensionKey",{ + thief:"",victim:""} + ),Zt(this,"oldServerWarned",!1),Zt(this,"stopping",!1),Zt(this,"seen",null),Zt(this,"seenFor",""),Zt(this,"peekDrawnAt",0),Zt(this,"peekSig",""),Zt(this,"peekLive",null),Zt(this,"starting",!1),Zt(this,"hinted",!1),Zt(this,"bannerRows",new Map),Zt(this,"bannerW",0),Zt(this,"overlayOpen",Qt(()=>!1,"overlayOpen")),this.scene=t,this.viewH=i,this.peekPanel.visible=!1,this.peekPanel.eventMode="static",this.banner.visible=!1,this.banner.eventMode="static",this.notice.visible=!1,this.notice.eventMode="static",this.addChild(this.banner,this.notice,this.peekPanel),t.onOtherTap=(t,i)=>{ + this.openPeek(t,i)} + } + get panelOpen(){ + return this.peekPanel.visible||this.notice.visible} + get bannerBottom(){ + return this.banner.visible?zDi+this.banner.height+8:zDi} + async openPeek(t,i){ + var s; + if(this.peekBusy)return; + const e=this.scene.boatPoint("me"),n=this.scene.boatPoint(t.id); + if(!e||!n||Math.hypot(e.x-n.x,e.y-n.y)>380)vH.getInstance().showMessage(`${ + t.n} + · 멀어서 안 보여요. 더 가까이 가 보세요`); + else{ + this.peekAngler=t,this.peek=null,this.renderPeek(),this.peekPanel.visible=!0,MR.fromTo(this.peekPanel,{ + alpha:0,y:12} + ,{ + alpha:1,y:0,duration:.18} + ),jG("light"),this.peekBusy=!0; + try{ + const i=await RIi.getInstance().plunderPeek(t.id); + if((null==(s=this.peekAngler)?void 0:s.id)!==t.id)return; + if(i.message||!i.result)return vH.getInstance().showMessage(i.message??"훔쳐볼 수 없어요"),void this.closePeek(); + this.peek=i.result,this.renderPeek()} + finally{ + this.peekBusy=!1} + } + } + closePeek(){ + this.peekAngler=null,this.peek=null,this.peekPanel.visible=!1} + near(t){ + const i=this.scene.boatPoint("me"),s=this.scene.boatPoint(t); + return!!i&&!!s&&Math.hypot(i.x-s.x,i.y-s.y)<=bOi} + renderPeek(){ + var t,i,s,e,n,h; + const r=this.peekPanel,o=this.peekAngler,a=RIi.getInstance(); + if(r.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),!o)return; + const c=CRi.BLEED_W,l=this.viewH(),u=c-20,d=26,f=null==(t=this.peek)?void 0:t.view,p=(null==f?void 0:f.fish)??[],g=Math.max(1,Math.floor((u-32+4)/34)),w=4*g,m=p.length>w?w-1:p.length,v=p.length?Math.ceil(Math.min(p.length,w)/g):0,_=v?34*v-4:24,M=86+_+12+44+54,b=l-M-8,y=aki(u,M,QIi,null,14); + y.alpha=.95,y.position.set(10,b); + const E=[y],A=_Oi(o.lk); + let S=d; + if(A){ + const t=new Ye(_Ri(A)),i=(new ip).circle(22,22,22).fill(BIi),s=(new ip).circle(22,22,21).fill(16777215); + t.width=t.height=44; + const e=new Ve; + e.addChild(i,t,s),t.mask=s,e.position.set(d,b+10),E.push(e),S=80} + const T=rki(`훔쳐보기 · ${ + o.n} + `,VIi,17); + T.position.set(S,b+12),oki(T,u-40-(S-d)); + const C=this.peek?this.peek.away:!!o.a,O=rki(this.peek?C?`정박 중 (자리 비움) · 어망 ${ + f.count} + 마리`:`낚시 중 · 어망 ${ + f.count} + 마리`:"살펴보는 중…",zIi,13); + O.position.set(S,b+36),oki(O,u-40-(S-d)),E.push(T,O); + const I=b+60+24; + if(f&&p.length){ + const t=KDi(f.grades); + if(t.position.set(d,b+60),E.push(t),p.slice(0,m).forEach((t,i)=>{ + const s=new lki(30); + s.starsAlways=!0,s.set(null,t.star,t.grade),s.position.set(d+i%g*34,I+34*Math.floor(i/g)),E.push(s)} + ),m<p.length){ + const t=m,i=new Ve,s=(new ip).roundRect(0,0,30,30,6).fill(BIi),e=rki("+"+(p.length-m),zIi,11); + e.position.set((30-e.width)/2,(30-e.height)/2),i.addChild(s,e),i.position.set(d+t%g*34,I+34*Math.floor(t/g)),E.push(i)} + } + else if(f){ + const t=rki("어망이 비어 있어요",zIi,13,!1); + t.position.set(d,I),oki(t,u-40),E.push(t)} + const k=a.tickets(),R=a.realNow(),x=rki(f?"guild"===f.why?"같은 길드원의 물고기는 훔칠 수 없어요":"protected"===f.why?`경계 중 · ${ + Mki(f.protectUntil-R)} + 뒤에 다시`:"raided"===f.why?(null==(s=null==(i=a.plunder)?void 0:i.raid)?void 0:s.id)===o.id?"내가 털고 있어요 · 이미 넘어온 물고기는 빼고 보여요":`${ + gki(f.raidedBy??"다른 낚시꾼","이","가")} + 털고 있어요`:"capped"===f.why?"오늘은 더 털 수 없는 배예요":"empty"===f.why?"":`훔칠 수 있어요 · 어망에서 아무거나 1분에 한 마리씩, 최대 ${ + Math.min(10,f.remaining,f.count)} + 마리`:"","raided"===(null==f?void 0:f.why)&&(null==(n=null==(e=a.plunder)?void 0:e.raid)?void 0:n.id)===o.id?VIi:"guild"===(null==f?void 0:f.why)?zIi:(null==f?void 0:f.why)?XIi:qIi,13); + x.position.set(d,I+_+12),oki(x,u-40); + const P=rki(this.ticketText(),zIi,12); + P.position.set(d,I+_+34),E.push(x,P),this.peekLive={ + info:x,tk:P,infoW:u-40} + ; + const N=b+M-54,L=new pki("닫기",96,40,14); + L.setPrimary(!1),L.onTap=()=>this.closePeek(); + const D=new pki("",150,40,14); + D.position.set(10+u-16-150,N),L.position.set(D.x-8-96,N); + const G=!!(null==(h=a.plunder)?void 0:h.raid); + f?G?(D.setText("이미 훔치는 중"),D.enabled=!1):"guild"===f.why?(D.setText("같은 길드원"),D.enabled=!1):f.why||0===f.count?(D.setText("훔칠 수 없어요"),D.enabled=!1):this.near(o.id)?k.n<1?(D.setText(`표 없음 · ${ + Mki((k.nextAt??R)-R)} + `),D.enabled=!1):(D.setText("훔치기 (표 1장)"),D.onTap=async()=>{ + if(this.starting)return; + this.starting=!0,D.enabled=!1; + const t=await a.plunderStart(o.id).finally(()=>{ + this.starting=!1} + ); + if(t)return vH.getInstance().showMessage(t),void(D.destroyed||(D.enabled=!0)); + jG("medium"),jDi(qG.SFX_ARCHERY_FIRE_ARROW,.6),this.closePeek(),vH.getInstance().showMessage(`${ + o.n} + 의 어망에 갈고리를 걸었어요. 1분에 한 마리씩 가져와요`)} + ):(D.setText("옆으로 가기"),D.onTap=()=>{ + this.scene.sailNearBoat(o.id)&&(vH.getInstance().showMessage("옆에 닿으면 다시 눌러 훔치기"),this.closePeek())} + ):(D.setText("살펴보는 중"),D.enabled=!1),E.push(L,D),this.peekSig=this.peekSignature(),r.hitArea=new Ui(0,0,c,l),r.removeAllListeners("pointertap"),r.on("pointertap",t=>{ + t.stopPropagation(),r.toLocal(t.global).y<b&&this.closePeek()} + ),r.addChild(...E)} + update(){ + var t,i,s; + const e=RIi.getInstance(),n=e.plunder,h=e.realNow(),r=[]; + if(null==n?void 0:n.raid){ + const t=TOi(n.raid,h); + r.push({ + from:"me",to:n.raid.id,tension:t.level,tp:t.p} + )} + if(null==n?void 0:n.raidBy){ + const t=TOi(n.raidBy,h); + r.push({ + from:n.raidBy.id,to:"me",tension:t.level,tp:t.p} + )} + for(const a of e.others)a.r&&a.r!==EG.userId&&a.id!==(null==(t=null==n?void 0:n.raidBy)?void 0:t.id)&&r.push({ + from:a.id,to:a.r} + ); + this.scene.setPlunder(r,this.peekPanel.visible?(null==(i=this.peekAngler)?void 0:i.id)??null:null); + const o=(null==n?void 0:n.raid)??(null==n?void 0:n.raidBy); + !o||o.plan||this.oldServerWarned||(this.oldServerWarned=!0,OG.getInstance().development&&vH.getInstance().showMessage("서버가 예전 빌드예요 — 훔친 물고기를 보려면 ef2_server 를 빌드·재시작해 주세요")); + for(const a of["thief","victim"]){ + const t="thief"===a?(null==n?void 0:n.raid)??null:(null==n?void 0:n.raidBy)??null,i=t?`${ + t.id} + :${ + t.startAt} + `:"",e=this.track[a]; + if(i!==e.key&&(t&&"victim"===a&&(jDi(qG.SFX_WAVE_CALL,.5),jG("heavy")),e.key=i,e.count=t?EOi(t,h):-1),!t)continue; + const r=EOi(t,h); + if(r>e.count){ + const i=null==(s=t.plan)?void 0:s[r-1],n=i?{ + id:i.id,star:i.star,grade:i.grade} + :void 0,h=i?`${ + kSi(i.id).name} + ${ + fTi(i.grade)} + `:"",o=(null==i?void 0:i.grade)??0; + "thief"===a?this.scene.plunderFly(t.id,"me",n,i?{ + text:o>=3?`대물!! ${ + h} + `:2===o?`큰 놈! ${ + h} + `:`훔쳤다! ${ + h} + `,color:o>=2?eki[o]:VIi} + :void 0):(this.scene.plunderFly("me",t.id,n,i?{ + text:o>=3?`대물을 빼앗겼어요!! ${ + h} + `:`빼앗김 · ${ + h} + `,color:16757670} + :void 0),jG("light")),jDi(qG.SFX_NORMAL_CLICK,.45),"thief"===a&&o>=2&&MR.delayedCall(1.1,()=>{ + jDi(o>=3?qG.SFX_TRUMPET:qG.SFX_GOLD_GOBLIN,.6),jG(o>=3?"heavy":"success")} + ),e.count=r} + const o=TOi(t,h),c=o.level?`${ + i} + :${ + r} + `:""; + if(c&&c!==this.tensionKey[a]&&(this.tensionKey[a]=c,jG(o.level>=3?"heavy":2===o.level?"medium":"light")),"thief"===a&&!this.stopping){ + const i=this.scene.boatPoint("me"),s=this.scene.boatPoint(t.id); + if(i&&s&&Math.hypot(i.x-s.x,i.y-s.y)>230){ + this.scene.ropeSnap("me",t.id),jDi(qG.SFX_STONE_BREAK,.5),vH.getInstance().showMessage(`너무 멀어져 줄이 끊겼어요. ${ + Math.min(r,t.max)} + 마리만 챙겼어요`),this.stop(!0); + continue} + } + "thief"===a&&r>=t.max&&!this.stopping&&performance.now()>=this.autoStopAt&&(this.autoStopAt=performance.now()+5e3,this.stop(!0))} + this.renderBanner(),this.checkNotices(),this.hintOnce(e.others.some(t=>t.a)),this.peekPanel.visible&&this.peek&&this.renderPeekLive()} + ticketText(){ + const t=RIi.getInstance(),i=t.tickets(),s=t.realNow(); + return`훔치기 표 ${ + i.n} + /3${ + i.nextAt?` · 다음 ${ + Mki(i.nextAt-s)} + `:""} + `} + peekSignature(){ + var t,i; + const s=this.peekAngler,e=null==(t=this.peek)?void 0:t.view,n=RIi.getInstance(); + return s?`${ + s.id} + |${ + null==e?void 0:e.why} + |${ + null==e?void 0:e.count} + |${ + this.near(s.id)} + |${ + n.tickets().n} + |${ + !!(null==(i=n.plunder)?void 0:i.raid)} + |${ + CRi.BLEED_W} + |${ + this.viewH()} + `:""} + renderPeekLive(){ + var t; + const i=performance.now(); + if(i-this.peekDrawnAt<500)return; + if(this.peekDrawnAt=i,this.peekSignature()!==this.peekSig||!this.peekLive||this.peekLive.tk.destroyed)return void this.renderPeek(); + const s=null==(t=this.peek)?void 0:t.view,e=RIi.getInstance().realNow(); + this.peekLive.tk.text=this.ticketText(),"protected"===(null==s?void 0:s.why)&&(this.peekLive.info.text=`경계 중 · ${ + Mki(s.protectUntil-e)} + 뒤에 다시`,oki(this.peekLive.info,this.peekLive.infoW))} + hintOnce(t){ + if(!this.hinted&&t&&!this.overlayOpen()){ + this.hinted=!0; + try{ + if(localStorage.getItem("fishing.plunder.hint"))return; + localStorage.setItem("fishing.plunder.hint","1")} + catch{ + } + vH.getInstance().showMessage("다른 배를 누르면 망원경으로 어망을 볼 수 있어요 (Zz 배 = 자리 비운 낚시꾼)")} + } + async stop(t){ + if(!this.stopping){ + this.stopping=!0; + try{ + const i=await RIi.getInstance().plunderStop(); + i.message&&!t&&vH.getInstance().showMessage(i.message)} + finally{ + this.stopping=!1} + } + } + async cut(){ + var t,i,s; + const e=null==(i=null==(t=RIi.getInstance().plunder)?void 0:t.raidBy)?void 0:i.id,n=await RIi.getInstance().plunderCut(); + if(n)return void vH.getInstance().showMessage(n); + e&&this.scene.ropeSnap(e,"me"),jG("success"),jDi(qG.SFX_STONE_BREAK,.6),vH.getInstance().showMessage("줄을 끊었어요! 어망을 지켰어요"); + const h=null==(s=RIi.getInstance().plunder)?void 0:s.log[0]; + h&&this.seen&&(this.seen={ + ...this.seen,log:Math.max(this.seen.log,h.at)} + ,qDi(this.seen))} + renderBanner(){ + const t=RIi.getInstance(),i=t.plunder,s=t.realNow(),e=this.banner,n=[(null==i?void 0:i.raidBy)?{ + r:i.raidBy,thief:!1} + :null,(null==i?void 0:i.raid)?{ + r:i.raid,thief:!0} + :null].filter(Boolean),h=CRi.BLEED_W,r=Math.min(h-20,420); + if(r!==this.bannerW){ + for(const t of this.bannerRows.values())t.row.destroy({ + children:!0} + ); + this.bannerRows.clear(),this.bannerW=r} + const o=new Set(n.map(({ + r:t,thief:i} + )=>`${ + i?"t":"v"} + :${ + t.id} + :${ + t.startAt} + `)); + for(const[u,d]of this.bannerRows)o.has(u)||(d.row.destroy({ + children:!0} + ),this.bannerRows.delete(u)); + if(!n.length)return void(e.visible=!1); + const a=this.scene.boatPoint("me"); + n.forEach(({ + r:t,thief:i} + ,n)=>{ + var h; + const o=`${ + i?"t":"v"} + :${ + t.id} + :${ + t.startAt} + `; + let c=this.bannerRows.get(o); + if(!c){ + const s=new Ve,n=new ip,h=rki(i?`${ + t.name} + 의 어망 털기`:`${ + gki(t.name,"이","가")} + 내 어망을 털고 있어요!`,i?VIi:16765640,14); + h.position.set(12,8),oki(h,r-130); + const a=rki("",KIi,12,!1); + a.position.set(12,31); + const l=new pki(i?"도망치기":"줄 끊기",104,40,14); + l.position.set(r-112,9),i?(l.setPrimary(!1),l.onTap=()=>{ + this.stop(!1)} + ):l.onTap=()=>{ + this.cut()} + ; + const u=new Ve,d=new Ve; + u.position.set(12,54),s.addChild(n,h,a,l,u,d),e.addChild(s),c={ + row:s,bg:n,t2:a,cards:u,netRow:d,shown:-1,netSig:"",bgSig:"",sig:"",h:0} + ,this.bannerRows.set(o,c)} + const l=EOi(t,s),u=AOi(t,s),d=this.scene.boatPoint(t.id),f=i&&!!a&&!!d&&Math.hypot(a.x-d.x,a.y-d.y)>188,p=TOi(t,s),g=p.level?i?p.level>=3?"줄이 엄청 묵직해요!! 대물 예감!!":2===p.level?"줄이 묵직해요… 큰 놈인가?!":"조금 묵직…?":p.level>=3?"뭔가 엄청 큰 게 끌려가요!! 줄을 끊어요!!":2===p.level?"큰 놈이 끌려가요… 줄을 끊어요!":"뭔가 끌려가요…":"",w=f?`${ + l} + /${ + t.max} + 마리 · 더 멀어지면 줄이 끊겨요!`:g?`${ + i?`${ + l} + /${ + t.max} + 마리 · `:""} + ${ + g} + `:i?`${ + l} + /${ + t.max} + 마리 · ${ + l>=t.max?"다 끌어왔어요":`다음 한 마리 ${ + Mki(u)} + `} + `:0===l?"갈고리를 걸었어요 · 1분마다 한 마리씩 끌려가요":`${ + l} + 마리 끌려가는 중 · 끊으면 모두 돌아와요`,m=p.level>=3?eki[3]:2===p.level?eki[2]:1===p.level?14862735:KIi,v=`${ + w} + |${ + f} + |${ + p.level} + `; + v!==c.sig&&(c.sig=v,c.t2.text=w,c.t2.textColor=f?XIi:m,oki(c.t2,r-130)); + const _=Math.min(l,(null==(h=t.plan)?void 0:h.length)??0); + if(_!==c.shown){ + c.shown=_,c.cards.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const i=Math.min(34,Math.floor((r-24-36)/10)); + (t.plan??[]).slice(0,_).forEach((t,s)=>{ + const e=new lki(i); + e.starsAlways=!0,e.set(t.id,t.star,t.grade),e.position.set(s*(i+4),0),c.cards.addChild(e)} + )} + const M=COi(t,s),b=M?M.join(","):"",y=_>0?Math.min(34,Math.floor((r-24-36)/10))+6:0; + if(b!==c.netSig&&(c.netSig=b,c.netRow.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),M&&M.some(t=>t>0))){ + const t=rki(i?"남은 어망":"내 어망에 남은 것",zIi,11,!1),s=KDi(M,10); + s.position.set(t.width+6,1),c.netRow.addChild(t,s)} + c.netRow.position.set(12,54+y); + const E=58+y+(c.netRow.children.length?18:0),A=`${ + E} + |${ + p.level} + `; + A!==c.bgSig&&(c.bgSig=A,c.h=E,c.bg.clear().roundRect(0,0,r,E,12).fill({ + color:i?2825477:4855058,alpha:.92} + ),p.level>=2&&c.bg.roundRect(1,1,r-2,E-2,11).stroke({ + color:p.level>=3?eki[3]:eki[2],width:2,alpha:.9} + ))} + ); + let c=0; + for(const{ + r:u,thief:d} + of n){ + const t=this.bannerRows.get(`${ + d?"t":"v"} + :${ + u.id} + :${ + u.startAt} + `); + t.row.y=c,c+=t.h+6} + const l=c-6; + e.hitArea=new Ui(0,0,r,l),e.position.x=(h-r)/2,e.visible||(e.visible=!0,MR.fromTo(e,{ + alpha:0,y:154} + ,{ + alpha:1,y:zDi,duration:.25} + ))} + checkNotices(){ + var t,i; + const s=RIi.getInstance().plunder; + if(!s||this.notice.visible)return; + if(this.overlayOpen())return; + if(this.seenFor!==EG.userId&&(this.seenFor=EG.userId,this.seen=YDi()),!this.seen){ + const t=RIi.getInstance().realNow()-432e5; + this.seen={ + log:t,last:t} + } + const e=s.last&&s.last.at>this.seen.last?s.last:null,n=s.log.filter(t=>t.at>this.seen.log); + (e||n.length)&&(this.seen={ + log:Math.max(this.seen.log,(null==(t=s.log[0])?void 0:t.at)??0),last:Math.max(this.seen.last,(null==(i=s.last)?void 0:i.at)??0)} + ,qDi(this.seen),this.showNotice(e,n))} + showNotice(t,i){ + var s; + const e=this.notice,n=CRi.BLEED_W; + e.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const h=[]; + if(t&&(t.cut?h.push({ + text:`${ + t.name} + 에게 들켰어요! 줄이 끊겨 빈손으로 돌아왔어요`,color:XIi} + ):h.push({ + text:`${ + t.name} + 의 어망에서 ${ + t.n} + 마리를 훔쳤어요!`,color:VIi,ids:t.ids,grades:t.grades} + )),i.length){ + const t=i.filter(t=>!t.cut).reduce((t,i)=>t+i.n,0); + h.push({ + text:t>0?`어망에서 ${ + t} + 마리를 도둑맞았어요`:"도둑이 왔지만 줄을 끊어 지켰어요",color:t>0?16765640:qIi} + ); + for(const s of i.slice(0,3))h.push({ + text:`· ${ + s.name} + ${ + s.cut?"줄을 끊었어요":`${ + s.n} + 마리`} + `,color:zIi} + )} + const r=Math.min(n-20,420); + let o=12; + const a=[]; + for(const d of h){ + const t=rki(d.text,d.color,14,d.color!==zIi); + if(t.position.set(14,o),oki(t,r-28),a.push(t),o+=24,null==(s=d.ids)?void 0:s.length){ + const t=Math.min(36,Math.floor((r-28-36)/10)); + d.ids.slice(0,10).forEach((i,s)=>{ + var e; + const n=new lki(t); + n.starsAlways=!0,n.set(i,kSi(i).star,(null==(e=d.grades)?void 0:e[s])??0),n.position.set(14+s*(t+4),o),a.push(n)} + ),o+=t+8} + } + const c=rki("눌러서 닫기",YIi,11,!1); + c.position.set(r-14-c.width,o),a.push(c),o+=20; + const l=(new ip).roundRect(0,0,r,o,12).fill({ + color:QIi,alpha:.94} + ); + e.addChild(l,...a),e.hitArea=new Ui(0,0,r,o),e.removeAllListeners("pointertap"),e.on("pointertap",t=>{ + t.stopPropagation(),e.visible=!1} + ); + const u=this.banner.visible?zDi+this.banner.height+8:zDi; + e.position.set((n-r)/2,u),e.visible=!0,MR.killTweensOf(e),MR.fromTo(e,{ + alpha:0,y:u-12} + ,{ + alpha:1,y:u,duration:.25} + ),MR.to(e,{ + alpha:0,duration:.4,delay:15,onComplete:Qt(()=>{ + e.visible=!1} + ,"onComplete")} + ),t&&!t.cut&&t.n>0?(jG("success"),jDi(qG.SFX_GOLD_GOBLIN,.5)):(null==t?void 0:t.cut)&&jDi(qG.SFX_STONE_BREAK,.5)} + layout(){ + this.bannerW=0,this.peekPanel.visible&&this.renderPeek()} + onHide(){ + this.closePeek(),this.notice.visible=!1} + } + ; + Qt(XDi,"FishingPlunderUi"); + let JDi=XDi; + const QDi=Qt(t=>vH.getInstance().showMessage(t),"toast"); + function ZDi(t,i){ + try{ + qG.getInstance().playSFX(t,i)} + catch{ + } + } + Qt(ZDi,"sfx$3"); + const tGi=Qt(t=>`${ + t.src} + :${ + t.id} + :${ + t.grade} + :${ + t.at} + :${ + t.kg} + `,"refKey"),iGi=Qt(t=>t.reduce((t,i)=>t+vTi(i.id,i.grade,i.r??.5),0),"valueOf"),sGi=Qt(t=>gki(t,"이","가"),"ga"); + function eGi(t,i,s){ + const e=RIi.getInstance().others.find(i=>i.id===t),n=_Oi(null==e?void 0:e.lk); + if(n)return wki(_Ri(n),s); + const h=new Ve,r=rki(i.slice(0,1),16777215,Math.round(.42*s)); + return h.addChild((new ip).circle(s/2,s/2,s/2).fill(UIi),r),r.position.set((s-r.width)/2,(s-r.height)/2),h.eventMode="none",h} + Qt(eGi,"faceOf"); + const nGi=class t extends Ve{ + constructor(t,i){ + super(),Zt(this,"banner",new Ve),Zt(this,"ask",new Ve),Zt(this,"win",new Ve),Zt(this,"emo",new Ve),Zt(this,"fx",new Ve),Zt(this,"confirm",new Ve),Zt(this,"bannerY",Qt(()=>166,"bannerY")),Zt(this,"onOpen",null),Zt(this,"nameEnd",{ + them:0,me:0} + ),Zt(this,"view",null),Zt(this,"local",null),Zt(this,"sendTimer",null),Zt(this,"sending",null),Zt(this,"tab","net"),Zt(this,"pick",null),Zt(this,"flash",null),Zt(this,"chgAt",0),Zt(this,"palOpen",!1),Zt(this,"emoUntil",0),Zt(this,"emoSeq",0),Zt(this,"skipMineEmo",!1),Zt(this,"theirsSig",""),Zt(this,"busyOk",!1),Zt(this,"swapping",!1),Zt(this,"gridScroll",0),Zt(this,"sailReq",null),Zt(this,"live",{ + } + ),Zt(this,"rendering",!1),Zt(this,"sigs",{ + banner:"",ask:"",win:""} + ),Zt(this,"chgOn",!1),Zt(this,"parts",new Map),this.scene=t,this.viewH=i; + for(const s of[this.banner,this.ask,this.win,this.emo,this.fx,this.confirm])s.visible=!1,s.eventMode="static"; + this.emo.eventMode="none",this.addChild(this.banner,this.ask,this.win,this.emo,this.fx,this.confirm),RIi.getInstance().onTrade(t=>this.onView(t))} + get panelOpen(){ + return this.ask.visible||this.win.visible||this.fx.visible} + closeOne(){ + return this.fx.visible?(this.swapping&&!this.fx.children.some(t=>t.alpha>.9&&"result"===t.label)||this.finishResult(),!0):this.confirm.visible?(this.hideConfirm(),!0):this.win.visible?(this.showConfirm(),!0):!!this.ask.visible&&(RIi.getInstance().tradeAnswer(!1),!0)} + finishResult(){ + queueMicrotask(()=>{ + this.swapping=!1,this.closeAll(),this.view=null,RIi.getInstance().tradeDismiss()} + )} + showConfirm(){ + var t; + const i=this.confirm,s=this.W,e=this.H,n=Math.min(s-60,360),h=(s-n)/2,r=156,o=(e-r)/2; + i.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const a=(new ip).rect(0,0,s,e).fill({ + color:0,alpha:.55} + ),c=aki(n,r,1315863,null,16); + c.position.set(h,o); + const l=rki("거래를 그만둘까요?",VIi,18); + l.position.set(h+(n-l.width)/2,o+20); + const u=rki("올린 물고기는 그대로 내 어망·어항에 있어요",zIi,13,!1); + u.position.set(h+(n-u.width)/2,o+52),oki(u,n-24),u.x=h+(n-u.width)/2; + const d=(n-32-8)/2,f=new pki("계속 거래",d,44,15),p=new pki("그만두기",d,44,15); + f.setPrimary(!1),f.position.set(h+16,o+r-60),p.position.set(h+16+d+8,o+r-60),f.onTap=()=>this.hideConfirm(),p.onTap=()=>{ + this.hideConfirm(),RIi.getInstance().tradeCancel()} + ,i.addChild(a,c,l,u,f,p),i.hitArea=new Ui(0,0,s,e),i.removeAllListeners("pointertap"),i.on("pointertap",t=>t.stopPropagation()),i.visible=!0,null==(t=this.parent)||t.setChildIndex(this,this.parent.children.length-1),MR.fromTo(c,{ + alpha:0} + ,{ + alpha:1,duration:.15} + )} + hideConfirm(){ + this.confirm.visible=!1,queueMicrotask(()=>this.confirm.removeChildren().forEach(t=>t.destroy({ + children:!0} + )))} + get bannerBottom(){ + return this.banner.visible?this.bannerY()+66:this.bannerY()} + get W(){ + return CRi.BLEED_W} + get H(){ + return this.viewH()} + request(t){ + this.near(t.id,148)?this.sendRequest(t):this.scene.sailNearBoat(t.id)?(this.sailReq={ + a:t,until:Date.now()+25e3} + ,QDi(`${ + t.n} + 옆으로 가요 · 닿으면 거래를 청해요`)):QDi("그 배 옆으로 갈 수 없어요")} + near(t,i=160){ + const s=this.scene.boatPoint("me"),e=this.scene.boatPoint(t); + return!!s&&!!e&&Math.hypot(s.x-e.x,s.y-e.y)<=i} + async sendRequest(t){ + this.sailReq=null; + const i=await RIi.getInstance().tradeRequest(t.id); + i?QDi(i):jG("light")} + onView(t){ + const i=this.view,s=RIi.getInstance(); + if(this.view=t,!t)return!i||"ask"!==i.phase&&"open"!==i.phase||this.fx.visible||QDi("거래가 끝났어요"),void(this.fx.visible||this.closeAll()); + if("gone"===t.phase){ + const e=t.other.name,n="reject"===t.why?t.asker?`${ + sGi(e)} + 거래를 거절했어요`:"":"timeout"===t.why?t.asker?`${ + sGi(e)} + 답이 없어요`:"거래 요청이 지나갔어요":"idle"===t.why?"오래 손대지 않아 거래가 닫혔어요":t.byMe?"":"open"===(null==i?void 0:i.phase)?`${ + sGi(e)} + 거래를 그만뒀어요`:`${ + sGi(e)} + 거래 요청을 거뒀어요`; + return n&&QDi(n),this.closeAll(),void s.tradeDismiss()} + if("done"===t.phase)return(null==i?void 0:i.id)!==t.id?(this.view=null,void s.tradeDismiss()):void(this.swapping||this.fx.visible||this.playSwap("open"===i.phase?i:null,t)); + (null==i?void 0:i.id)!==t.id&&this.resetRoom(t),t.emote&&t.emote.seq>this.emoSeq&&(this.emoSeq=t.emote.seq,t.emote.mine&&this.skipMineEmo?this.skipMineEmo=!1:this.showEmote(t.emote.mine,t.emote.e)); + const e=t.theirs.map(tGi).join("|"); + (null==i?void 0:i.id)===t.id&&"open"===i.phase&&"open"===t.phase&&e!==this.theirsSig&&(this.chgAt=Date.now()+1e3,this.flash={ + text:i.okMe?`${ + sGi(t.other.name)} + 올린 것을 바꿨어요 · 다시 보고 OK 해 주세요`:`${ + sGi(t.other.name)} + 올린 것을 바꿨어요`,until:Date.now()+3200} + ,jG("light")),this.theirsSig=e,this.sendTimer||this.sending||(this.local=null),this.render()} + front(){ + var t,i; + null==(t=this.onOpen)||t.call(this),null==(i=this.parent)||i.setChildIndex(this,this.parent.children.length-1)} + resetRoom(t){ + var i; + this.local=null,this.tab="net",this.pick=null,this.flash=null,this.palOpen=!1,this.emoSeq=(null==(i=t.emote)?void 0:i.seq)??0,this.theirsSig=t.theirs.map(tGi).join("|"),this.gridScroll=0,this.busyOk=!1} + closeAll(){ + this.banner.visible=this.ask.visible=this.win.visible=this.emo.visible=this.fx.visible=this.confirm.visible=!1,this.palOpen=!1,this.swapping=!1,this.local=null,this.sendTimer&&(clearTimeout(this.sendTimer),this.sendTimer=null); + for(const t of[this.banner,this.ask,this.win,this.emo,this.fx])t.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + this.live={ + } + ,this.sigs={ + banner:"",ask:"",win:""} + ,this.parts.clear()} + onHide(){ + this.sailReq=null; + const t=RIi.getInstance(); + t.tradeLive&&!t.tradePreview&&t.tradeCancel()} + layout(){ + this.render()} + update(){ + const t=this.sailReq; + t&&(this.near(t.a.id,148)?this.sendRequest(t.a):Date.now()>t.until&&(this.sailReq=null,QDi("옆에 닿지 못했어요 · 다시 눌러 주세요"))); + const i=this.view; + if("ask"===(null==i?void 0:i.phase)&&this.live.text){ + const t=Math.max(0,i.exp-RIi.getInstance().realNow()),s=Math.ceil(t/1e3); + this.live.text.text=i.asker?`답을 기다려요 · ${ + s} + 초`:`${ + s} + 초 안에 고르지 않으면 저절로 거절돼요`; + const{ + bar:e,barW:n=0,barX:h=0,barY:r=0} + =this.live; + e&&e.clear().roundRect(h,r,Math.max(4,n*(t/2e4)),i.asker?3:6,3).fill(VIi)} + "open"===(null==i?void 0:i.phase)&&this.flash&&Date.now()>this.flash.until&&(this.flash=null,this.render()),"open"===(null==i?void 0:i.phase)&&this.chgOn!==this.chgAt>Date.now()&&this.render()} + render(){ + if(!this.rendering&&!this.swapping){ + this.rendering=!0; + try{ + const t=this.view; + this.renderBanner("ask"===(null==t?void 0:t.phase)&&t.asker?t:null),this.renderAsk("ask"!==(null==t?void 0:t.phase)||t.asker?null:t),this.renderWin("open"===(null==t?void 0:t.phase)?t:null)} + finally{ + this.rendering=!1} + } + } + soon(){ + queueMicrotask(()=>this.render())} + renderBanner(t){ + const i=this.banner,s=t?`${ + t.id} + |${ + t.other.name} + |${ + this.bannerY()} + |${ + this.W} + `:""; + if(s===this.sigs.banner&&i.visible===!!t)return; + if(this.sigs.banner=s,i.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),i.visible=!!t,!t)return; + const e=this.W-20,n=this.bannerY(); + i.addChild(aki(e,58,QIi,null,12)).position.set(10,n),i.children[0].alpha=.94; + const h=rki(`${ + t.other.name} + 에게 거래를 청했어요`,VIi,14); + h.position.set(24,n+9),oki(h,e-110); + const r=rki("답을 기다려요",zIi,12,!1); + r.position.set(24,n+31); + const o=new ip,a=new pki("취소",72,34,13); + a.setPrimary(!1),a.position.set(10+e-10-72,n+12),a.onTap=()=>{ + RIi.getInstance().tradeCancel()} + ,i.addChild(h,r,o,a),this.live={ + text:r,bar:o,barW:e,barX:10,barY:n+58-3} + ,this.update()} + renderAsk(t){ + const i=this.ask,s=t?`${ + t.id} + |${ + t.other.name} + |${ + RIi.getInstance().tradeLeft()} + |${ + this.W} + |${ + this.H} + `:""; + if(s===this.sigs.ask&&i.visible===!!t)return; + this.sigs.ask=s,i.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const e=i.visible; + if(i.visible=!!t,!t)return; + e||this.front(); + const n=RIi.getInstance(),h=this.W,r=this.H,o=Math.min(h-20,460),a=(h-o)/2,c=176,l=r-c-8,u=a+16,d=aki(o,c,QIi,null,14); + d.alpha=.97,d.position.set(a,l); + const f=eGi(t.other.id,t.other.name,44); + f.position.set(u,l+14); + const p=rki(`${ + t.other.name} + 님이 거래하자고 해요`,VIi,17); + p.position.set(u+54,l+14),oki(p,o-86); + const g=rki(`어망·어항 물고기를 서로 6마리까지 바꿔요 · 오늘 남은 거래 ${ + n.tradeLeft()} + 번`,zIi,12,!1); + g.position.set(u+54,l+40),oki(g,o-86); + const w=(new ip).roundRect(u,l+72,o-32,6,3).fill(BIi),m=new ip,v=rki("",YIi,12,!1); + v.position.set(u,l+84); + const _=new pki("거절",120,44,15),M=new pki("수락",o-32-128,44,15); + _.setPrimary(!1),_.position.set(u,l+c-58),M.position.set(u+128,l+c-58),_.onTap=()=>{ + n.tradeAnswer(!1)} + ,M.onTap=async()=>{ + M.enabled=!1; + const t=await n.tradeAnswer(!0); + t&&(QDi(t),M.destroyed||(M.enabled=!0))} + ,i.addChild(d,f,p,g,w,m,v,_,M),i.hitArea=new Ui(0,0,h,r),i.removeAllListeners("pointertap"),i.on("pointertap",t=>t.stopPropagation()),this.live={ + text:v,bar:m,barW:o-32,barX:u,barY:l+72} + ,this.update()} + mine(t){ + return this.local??t.mine} + geo(){ + const t=this.W,i=this.H,s=t-16,e=i-10-8,n=s-24,h=Math.min(56,Math.floor((n-20-30)/6)),r=32+h+10,o=56+r+12,a=o+r+10,c=a+26,l=c+40,u=10+e-12-46; + return{ + W:t,H:i,x0:8,y0:10,PW:s,PH:e,L:20,IW:n,S:h,blkH:r,aTop:56,bTop:o,infoY:a,phY:c,gridTop:l,gridH:Math.max(60,u-10-l),footY:u,cell:48,gap:6,cols:Math.max(4,Math.floor((n+6)/54))} + } + slotPos(t,i){ + const s=this.geo(),e=6*s.S+30; + return{ + x:s.L+(s.IW-e)/2+i*(s.S+6),y:("a"===t?s.aTop:s.bTop)+32} + } + card(t,i){ + const s=new lki(i); + return s.set(t.id,kSi(t.id).star,t.grade),s} + part(t,i,s,e){ + let n=this.parts.get(t); + n||(n={ + c:new Ve,sig:"\0"} + ,n.c.label=t,this.parts.set(t,n),this.win.addChild(n.c)),(e||n.sig!==i)&&(n.sig=i,n.c.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),s(n.c))} + renderWin(t,i=!1){ + var s; + const e=this.win,n=RIi.getInstance(),h=e.visible; + if(e.visible=!!t,this.emo.visible=!!t,!t)return void((h||this.parts.size)&&(e.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),this.parts.clear())); + h||this.front(),this.chgOn=this.chgAt>Date.now(); + const r=this.geo(),{ + W:o,H:a,x0:c,y0:l,PW:u,PH:d,L:f,IW:p,S:g,blkH:w} + =r,m=n.tradeFish(),v=this.mine(t),_=t.theirs,M=aIi(m.net.length,n.netCap,m.aq.length,iIi((null==(s=n.state.aquarium)?void 0:s.lv)??0),v,_),b=`${ + o} + x${ + a} + `; + this.part("frame",JSON.stringify([t.other.name,n.tradeLeft(),b]),i=>{ + const s=(new ip).rect(0,0,o,a).fill({ + color:0,alpha:.5} + ),e=aki(u,d,QIi,null,16); + e.alpha=.97,e.position.set(c,l); + const h=rki(`${ + gki(t.other.name,"과","와")} + 거래`,VIi,18); + h.position.set(f,l+14),oki(h,p-130); + const r=rki(`오늘 남은 거래 ${ + n.tradeLeft()} + 번`,zIi,12,!1); + r.position.set(f+p-r.width,l+20),i.addChild(s,e,h,r)} + ,i),this.part("rows",JSON.stringify([v.map(tGi),_.map(tGi),t.okMe,t.okThem,this.chgOn,this.swapping,t.other.name,b]),i=>{ + const s=Qt((t,s,e,n,h,r)=>{ + const o=(new ip).roundRect(f,t,p,w,12).fill(n?1451549:"them"===s&&this.chgOn?3811860:1710621),a=(new ip).circle(f+14,t+16,4).fill(r),c=rki(h,KIi,14); + c.position.set(f+24,t+7); + const l=n?mki("OK",730132,qIi,11):mki("고르는 중",zIi,BIi,11); + l.position.set(f+30+c.width,t+8),this.nameEnd[s]=l.x+l.width; + const u=rki(e.length?`팔면 ${ + iGi(e).toLocaleString()} + 골드`:"me"===s?`${ + e.length} + /6`:"아직 없음",zIi,12); + u.position.set(f+p-10-u.width,t+9),i.addChild(o,a,c,l,u); + for(let d=0; + d<6; + d++){ + const t=this.slotPos("them"===s?"a":"b",d),n=this.swapping?void 0:e[d]; + if(!n){ + if(i.addChild((new ip).roundRect(t.x,t.y,g,g,.2*g).fill("me"===s?2302758:2039586)),"me"===s&&d===e.length&&!this.swapping){ + const s=rki("+",4868688,22); + s.position.set(t.x+(g-s.width)/2,t.y+(g-s.height)/2),i.addChild(s)} + continue} + const h=new Ve; + h.position.set(t.x,t.y),h.addChild(this.card(n,g)),h.eventMode="static",h.cursor="pointer",h.hitArea=new Ui(0,0,g,g),h.label=`slot-${ + s} + -${ + d} + `,h.on("pointertap",t=>{ + t.stopPropagation(),"me"===s?this.removeMine(n):(this.pick={ + who:"them",ref:n} + ,this.soon())} + ),i.addChild(h)} + } + ,"row"); + s(r.aTop,"them",_,t.okThem,`${ + sGi(t.other.name)} + 올린 것`,9418751),s(r.bTop,"me",v,t.okMe,"내가 올린 것",VIi); + const e=new Ve; + e.addChild((new ip).circle(0,0,15).fill(BIi),this.swapIcon()),e.position.set(o/2,r.bTop-6),e.label="swapIcon",i.addChild(e)} + ,i); + let y="아래에서 누르면 올려요 · 올린 칸을 누르면 빼요",E=zIi; + if(this.flash&&this.flash.until>Date.now())y=this.flash.text,E=this.flash.bad?XIi:16757611; + else if(M.ok){ + if(this.pick){ + const i=this.pick.ref,s=kSi(i.id); + y=`${ + s.name} + ${ + fTi(i.grade)} + ${ + "★".repeat(s.star)} + · ${ + _Ti(i.kg)} + · 팔면 ${ + vTi(i.id,i.grade,i.r??.5).toLocaleString()} + 골드${ + "aq"===i.src?" · 어항":""} + ${ + "them"===this.pick.who?` · ${ + t.other.name} + 것`:""} + `,E=KIi} + } + else y=`받을 어망 자리가 ${ + M.short} + 칸 모자라요 · 어망을 비우거나 덜 받아 주세요`,E=XIi; + this.part("info",JSON.stringify([y,E,b]),t=>{ + const i=rki(y,E,12.5,E!==zIi); + i.position.set(f+2,r.infoY),oki(i,p-4),t.addChild(i)} + ,i); + const A=`${ + m.net.map(t=>`${ + t.id} + :${ + t.grade} + :${ + t.at} + `).join()} + |${ + m.aq.map(t=>`${ + t.id} + :${ + t.grade} + :${ + t.at} + `).join()} + `; + this.part("picker",JSON.stringify([this.tab,A,v.map(tGi),M.netFree,M.aqFree,M.ok,b]),t=>{ + [["어망","net",m.net.length],["어항","aq",m.aq.length]].forEach(([i,s,e],n)=>{ + const h=new dki(`${ + i} + ${ + e} + `,84,30,13); + h.selected=this.tab===s,h.draw(),h.position.set(f+90*n,r.phY),h.onTap=()=>{ + this.tab!==s&&(this.tab=s,this.gridScroll=0,this.soon())} + ,t.addChild(h)} + ); + const i=M.ok?YIi:XIi,s=rki("받을 자리",i,11,!M.ok),e=rki(`어망 ${ + M.netFree} + 칸 · 어항 ${ + M.aqFree} + 칸`,i,11,!M.ok); + s.position.set(f+p-s.width,r.phY),e.position.set(f+p-e.width,r.phY+15),t.addChild(s,e,this.grid(v,m))} + ,i); + const S=!v.length&&!_.length,T=this.swapping?["바꾸는 중…",!1,!0]:this.busyOk?["…",!1,!0]:S?["물고기를 올려 주세요",!1,!0]:M.ok?t.okMe&&!this.local?[`OK 풀기 · ${ + t.other.name} + 기다리는 중`,!0,!1]:["OK",!0,!0]:["받을 자리가 모자라요",!1,!0],C=Date.now()>=this.emoUntil; + this.part("foot",JSON.stringify([T,this.palOpen,C,b]),t=>{ + const i=new pki("😊",46,46,20); + i.setPrimary(this.palOpen),i.enabled=C,i.position.set(f,r.footY),i.onTap=()=>{ + this.palOpen=!this.palOpen,this.soon()} + ; + const s=new pki("그만두기",92,46,15); + s.setPrimary(!1),s.position.set(f+54,r.footY),s.onTap=()=>{ + n.tradeCancel()} + ; + const e=new pki(T[0],p-54-100,46,15); + e.position.set(f+154,r.footY),e.enabled=T[1],e.setPrimary(T[2]),e.onTap=()=>{ + this.toggleOk()} + ,t.addChild(i,s,e)} + ,i),this.part("pal",JSON.stringify([this.palOpen,b]),t=>{ + this.palOpen&&t.addChild(this.palette(r))} + ,i),h&&!i||(e.hitArea=new Ui(0,0,o,a),e.removeAllListeners("pointertap"),e.on("pointertap",t=>{ + t.stopPropagation(),this.palOpen&&(this.palOpen=!1,this.soon())} + ))} + swapIcon(){ + const t=new ip,i={ + color:VIi,width:2.4,cap:"round",join:"round"} + ; + return t.moveTo(-4,-6).lineTo(-4,7).stroke(i).moveTo(-8,3).lineTo(-4,7).lineTo(0,3).stroke(i).moveTo(4,7).lineTo(4,-6).stroke(i).moveTo(0,-2).lineTo(4,-6).lineTo(8,-2).stroke(i),t.scale.set(1),t} + grid(t,i){ + const s=this.geo(),e=("net"===this.tab?i.net:i.aq).map(t=>({ + c:t,r:rIi(t,this.tab)} + )).sort((t,i)=>vTi(i.c.id,i.c.grade,i.c.r)-vTi(t.c.id,t.c.grade,t.c.r)),n=new Ve,h=new Ve,r=(new ip).rect(s.L,s.gridTop,s.IW,s.gridH).fill(16777215); + n.addChild(h,r),h.mask=r; + const o=Math.ceil(e.length/s.cols)*(s.cell+s.gap),a=Math.max(0,o-s.gridH); + this.gridScroll=Math.max(0,Math.min(a,this.gridScroll)); + const c=new Set,l=e.map((t,i)=>({ + ...t,i} + )); + for(const f of t){ + const t=l.findIndex(t=>!c.has(t.i)&&oIi(t.r,f)); + t>=0&&c.add(t)} + if(l.forEach((t,i)=>{ + const e=new lki(s.cell); + if(e.set(t.c.id,kSi(t.c.id).star,t.c.grade),e.position.set(s.L+i%s.cols*(s.cell+s.gap),s.gridTop+Math.floor(i/s.cols)*(s.cell+s.gap)),c.has(i)){ + e.alpha=.35; + const t=(new ip).moveTo(-7,0).lineTo(-2,5).lineTo(8,-6).stroke({ + color:VIi,width:3.2,cap:"round",join:"round"} + ); + t.position.set(e.x+s.cell/2,e.y+s.cell/2),h.addChild(e,t)} + else h.addChild(e)} + ),!e.length){ + const t=rki("net"===this.tab?"어망이 비어 있어요":"어항이 비어 있어요",zIi,13,!1); + t.position.set(s.L+4,s.gridTop+6),h.addChild(t)} + h.y=-this.gridScroll,n.eventMode="static",n.hitArea=new Ui(s.L,s.gridTop,s.IW,s.gridH); + let u=null; + n.on("pointerdown",t=>{ + u={ + y:t.global.y,s:this.gridScroll,moved:!1} + } + ),n.on("globalpointermove",t=>{ + if(!u)return; + const i=t.global.y-u.y; + Math.abs(i)>6&&(u.moved=!0),u.moved&&(this.gridScroll=Math.max(0,Math.min(a,u.s-i)),h.y=-this.gridScroll)} + ); + const d=Qt(()=>{ + setTimeout(()=>{ + u=null} + ,0)} + ,"end"); + return n.on("pointerup",d),n.on("pointerupoutside",d),n.on("wheel",t=>{ + this.gridScroll=Math.max(0,Math.min(a,this.gridScroll+t.deltaY)),h.y=-this.gridScroll} + ),n.on("pointertap",t=>{ + if(t.stopPropagation(),null==u?void 0:u.moved)return; + const i=n.toLocal(t.global),e=i.x-s.L,h=i.y-s.gridTop+this.gridScroll,r=Math.floor(e/(s.cell+s.gap)),o=Math.floor(h/(s.cell+s.gap)); + if(r<0||r>=s.cols||e%(s.cell+s.gap)>s.cell||h%(s.cell+s.gap)>s.cell)return; + const a=l[o*s.cols+r]; + a&&this.addMine(a.r)} + ),n} + palette(t){ + const i=new Ve,s=(t.IW-18)/4,e=t.footY-10-138; + return i.addChild((new ip).roundRect(t.L,e,t.IW,138,14).fill(2500139)),hIi.forEach(([n,h],r)=>{ + const o=new Ve,a=t.L+8+r%4*(s+2),c=e+8+64*Math.floor(r/4); + o.addChild((new ip).roundRect(0,0,s-4,58,10).fill(3421242)); + const l=rki(n,KIi,22),u=rki(h,KIi,11); + l.position.set((s-4-l.width)/2,6),u.position.set((s-4-u.width)/2,36),oki(u,s-10),u.x=(s-4-u.width)/2,o.addChild(l,u),o.position.set(a,c),o.eventMode="static",o.cursor="pointer",o.hitArea=new Ui(0,0,s-4,58),o.on("pointertap",t=>{ + t.stopPropagation(),this.sendEmote(r)} + ),i.addChild(o)} + ),i} + addMine(t){ + const i=this.view; + if(!i||"open"!==i.phase)return; + const s=[...this.mine(i)]; + return this.pick={ + who:"me",ref:t} + ,s.some(i=>oIi(i,t))?(QDi("이미 올렸어요 · 위 칸을 누르면 빼요"),void this.soon()):s.length>=6?(QDi("한 번에 6마리까지 올릴 수 있어요"),void this.soon()):(s.push(t),void this.changeMine(s))} + removeMine(t){ + const i=this.view; + if(!i)return; + const s=[...this.mine(i)],e=s.findIndex(i=>oIi(i,t)); + e>=0&&s.splice(e,1),this.pick=null,this.changeMine(s)} + changeMine(t){ + this.local=t,this.view&&(this.view={ + ...this.view,okMe:!1,okThem:!1} + ),jG("light"),this.sendTimer&&clearTimeout(this.sendTimer),this.sendTimer=setTimeout(()=>{ + this.sendTimer=null,this.flushOffer()} + ,250),this.soon()} + async flushOffer(){ + for(this.sendTimer&&(clearTimeout(this.sendTimer),this.sendTimer=null); + this.sending; + )await this.sending; + const t=this.local; + if(!t)return; + const i=RIi.getInstance(); + this.sending=(async()=>{ + const s=await i.tradeOffer(t); + s?(QDi(s),this.local=null):this.local===t&&(this.local=null)} + )().finally(()=>{ + this.sending=null} + ),await this.sending,this.local?await this.flushOffer():this.soon()} + async toggleOk(){ + if(!this.busyOk){ + this.busyOk=!0,this.soon(); + try{ + await this.flushOffer(); + const t=this.view; + if(!t||"open"!==t.phase)return; + const i=await RIi.getInstance().tradeReady(!t.okMe); + i?QDi(i):jG("medium")} + finally{ + this.busyOk=!1,this.soon()} + } + } + async sendEmote(t){ + if(Date.now()<this.emoUntil)return; + this.palOpen=!1,this.emoUntil=Date.now()+1500,setTimeout(()=>this.soon(),1530),this.showEmote(!0,t),this.skipMineEmo=!0,this.soon(); + const i=await RIi.getInstance().tradeEmote(t); + i&&(this.skipMineEmo=!1,QDi(i))} + showEmote(t,i){ + const s=hIi[i]; + if(!s||!this.win.visible)return; + const e=this.geo(),n=t?e.bTop:e.aTop; + for(const c of[...this.emo.children])c.label===(t?"emo-me":"emo-them")&&c.destroy({ + children:!0} + ); + const h=new Ve,r=rki(s[0],1315863,20),o=rki(s[1],1315863,14),a=r.width+o.width+22; + h.addChild((new ip).roundRect(0,0,a,34,16).fill(15921908).poly([12,33,24,33,14,41]).fill(15921908),r,o),r.position.set(9,(34-r.height)/2),o.position.set(13+r.width,(34-o.height)/2),h.label=t?"emo-me":"emo-them",h.pivot.set(12,41),h.position.set(Math.min(e.L+e.IW-a,this.nameEnd[t?"me":"them"]+18),n+2),this.emo.addChild(h),MR.fromTo(h.scale,{ + x:.4,y:.4} + ,{ + x:1,y:1,duration:.3,ease:"back.out(2.2)"} + ),MR.fromTo(h,{ + alpha:0} + ,{ + alpha:1,duration:.15} + ),MR.to(h,{ + alpha:0,y:h.y-6,delay:2.5,duration:.3,onComplete:Qt(()=>{ + h.destroyed||h.destroy({ + children:!0} + )} + ,"onComplete")} + ),t||jG("light")} + playSwap(i,s){ + const e=s.result; + if(!e)return RIi.getInstance().tradeDismiss(),void this.closeAll(); + this.view={ + ...i??s,phase:"open",mine:e.gave,theirs:e.got,okMe:!0,okThem:!0} + ,this.palOpen=!1,this.local=null,this.swapping=!0,this.renderWin(this.view,!0),this.renderBanner(null),this.renderAsk(null); + const n=this.fx,h=this.geo(); + n.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),n.visible=!0,n.hitArea=new Ui(0,0,h.W,h.H),n.removeAllListeners("pointertap"),n.on("pointertap",t=>t.stopPropagation()); + const r=[],o=Qt((t,i,s,e)=>{ + const o=(new ip).circle(0,0,.7*h.S).fill({ + color:16771488,alpha:.55} + ); + o.alpha=0; + const a=this.card(t,h.S); + a.pivot.set(h.S/2,h.S/2),n.addChild(o,a),r.push({ + c:a,from:i,to:s,side:e,big:kSi(t.id).star>=4||t.grade>=3,glow:o} + )} + ,"add"); + e.gave.forEach((t,i)=>o(t,this.slotPos("b",i),this.slotPos("a",i),1)),e.got.forEach((t,i)=>o(t,this.slotPos("a",i),this.slotPos("b",i),-1)); + const a=(new ip).rect(0,0,h.W,h.H).fill(0); + a.alpha=0; + const c=this.resultCard(s); + n.addChild(a,c); + const l=this.win.getChildByLabel("swapIcon",!0),u=performance.now(),d=t.speed; + let f=!1; + const p=Qt(()=>{ + if(n.destroyed||!n.visible)return void vn.shared.remove(p); + const t=Math.min(1.6,(performance.now()-u)/1e3*d),i=fIi(t); + for(const s of r){ + const t=s.from.x+(s.to.x-s.from.x)*i.cross+22*s.side*Math.sin(Math.PI*i.cross),e=s.from.y+(s.to.y-s.from.y)*i.cross-6*i.lift; + s.c.position.set(t+h.S/2,e+h.S/2),s.c.scale.set(1+.06*i.lift+.14*i.pop),s.c.zIndex=s.side>0?1:2,s.glow.position.set(s.to.x+h.S/2,s.to.y+h.S/2),s.glow.alpha=s.big?i.pop:0,s.glow.scale.set(.6+i.pop)} + l&&(l.rotation=Math.PI*i.spin),a.alpha=.5*i.dim,c.alpha=i.result,c.y=40*(1-i.result),!f&&t>=.9&&(f=!0,jG("medium"),ZDi(qG.SFX_ARCHERY_FIRE_ARROW,.35)),t>=1.6&&vn.shared.remove(p)} + ,"tick"); + n.sortableChildren=!0,a.zIndex=9,c.zIndex=10,vn.shared.add(p)} + resultCard(t){ + const i=RIi.getInstance(),s=t.result,e=this.geo(),n=new Ve,h=Math.min(e.W-36,400),r=(e.W-h)/2,o=r+16; + n.label="result"; + const a=[]; + let c=18; + const l=rki(s.got.length?"교환했어요!":"건네줬어요!",VIi,20); + if(l.position.set(r+(h-l.width)/2,c),a.push(l),c+=38,s.got.length){ + const t=rki("받은 것",zIi,12,!1); + t.position.set(o,c),a.push(t),c+=22; + const i=56,e=10,n=Math.max(1,Math.floor((h-32+e)/(i+e))),l=Math.ceil(s.got.length/n); + s.got.forEach((t,o)=>{ + const l=Math.floor(o/n),u=Math.min(n,s.got.length-l*n),d=r+(h-(u*i+(u-1)*e))/2+o%n*(i+e),f=c+l*(i+26),p=this.card(t,i); + p.position.set(d,f),a.push(p); + const g=rki(kSi(t.id).name,13224398,10.5,!1); + oki(g,i+8),g.position.set(d+(i-g.width)/2,f+i+3),a.push(g)} + ),c+=l*(i+26)+4; + const u=rki([s.toNet?`어망으로 ${ + s.toNet} + 마리`:"",s.toAq?`어항으로 ${ + s.toAq} + 마리`:""].filter(Boolean).join(" · "),zIi,12.5,!1); + u.position.set(r+(h-u.width)/2,c),a.push(u),c+=26} + else{ + const t=rki("받은 것 없음 (선물)",zIi,12.5,!1); + t.position.set(r+(h-t.width)/2,c),a.push(t),c+=26} + if(s.gave.length){ + const t=rki("준 것",zIi,12,!1); + t.position.set(o,c),a.push(t),c+=20; + const i=34,e=5,n=s.gave.length*i+(s.gave.length-1)*e; + s.gave.forEach((t,s)=>{ + const o=this.card(t,i); + o.alpha=.55,o.position.set(r+(h-n)/2+s*(i+e),c),a.push(o)} + ),c+=i+12} + const u=rki(`오늘 남은 거래 ${ + i.tradeLeft()} + 번`,zIi,12.5,!1); + u.position.set(r+(h-u.width)/2,c),a.push(u),c+=26; + const d=new pki("확인",h-32,44,15); + d.position.set(o,c),d.onTap=()=>this.finishResult(),a.push(d),c+=58; + const f=c,p=Math.max(20,(e.H-f)/2),g=(new ip).roundRect(r,0,h,f,16).fill(1315863); + return n.addChild(g,...a),n.pivot.set(0,-p),n.alpha=0,n} + } + ; + Qt(nGi,"FishingTradeUi"),Zt(nGi,"speed",1); + let hGi=nGi; + const rGi=class extends Ve{ + constructor(t,i){ + super(),Zt(this,"box",new Ve),Zt(this,"target",null),Zt(this,"w",236),Zt(this,"follow",Qt(()=>this.place(),"follow")),Zt(this,"onTrade",null),Zt(this,"onPeek",null),Zt(this,"onHelp",null),Zt(this,"wantsHelp",Qt(()=>!1,"wantsHelp")),this.scene=t,this.viewH=i,this.visible=!1,this.eventMode="static",this.addChild(this.box),this.on("pointertap",t=>{ + this.box.getBounds().containsPoint(t.global.x,t.global.y)||(t.stopPropagation(),this.close())} + )} + get isOpen(){ + return this.visible} + open(t){ + this.target=t,this.render(),this.visible=!0,this.hitArea=new Ui(0,0,CRi.BLEED_W,this.viewH()),this.place(),vn.shared.remove(this.follow),vn.shared.add(this.follow),MR.fromTo(this.box,{ + alpha:0} + ,{ + alpha:1,duration:.14} + ),jG("light")} + close(){ + this.visible=!1,this.target=null,vn.shared.remove(this.follow)} + gate(t){ + const i=RIi.getInstance(),s=i.plunder,e=this.scene.boatPoint("me"),n=this.scene.boatPoint(t.id),h=!e||!n||Math.hypot(e.x-n.x,e.y-n.y)>nIi,r=this.wantsHelp(t)?"고치는 중 · ":""; + return t.a?{ + ok:!1,far:h,text:"자리 비움 · 거래는 둘 다 있을 때만",warn:!0} + :(null==s?void 0:s.raid)||(null==s?void 0:s.raidBy)?{ + ok:!1,far:h,text:"털기 중에는 거래할 수 없어요",warn:!0} + :i.tradeLeft()<=0?{ + ok:!1,far:h,text:"오늘 거래를 다 했어요 (하루 10번)",warn:!0} + :i.tradeLive?{ + ok:!1,far:h,text:"다른 거래가 진행 중이에요",warn:!0} + :h?{ + ok:!0,far:h,text:`${ + r} + 조금 멀어요 · 누르면 옆으로 가서 청해요`,warn:!1} + :{ + ok:!0,far:h,text:`${ + r} + 바로 옆이에요 · 오늘 남은 거래 ${ + i.tradeLeft()} + 번`,warn:!1} + } + render(){ + const t=this.target,i=this.box; + if(i.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),!t)return; + const s=this.wantsHelp(t),e=this.gate(t),n=this.w=s?300:236,h=(n-24-(s?16:8))/(s?3:2),r=(new ip).roundRect(0,0,n,112,14).fill({ + color:QIi,alpha:.96} + ),o=(new ip).poly([-7,0,7,0,0,8]).fill({ + color:QIi,alpha:.96} + ); + o.label="tail",o.y=112,r.eventMode="static"; + const a=rki(`${ + t.n} + 님의 배`,VIi,15); + a.position.set(12,11),oki(a,n-24); + const c=rki(e.text,e.warn?XIi:s?16757611:zIi,12,!1); + c.position.set(12,34),oki(c,n-24); + const l=new pki("거래하기",h,40,14); + l.enabled=e.ok,l.onTap=()=>{ + var t; + const i=this.target; + this.close(),i&&(null==(t=this.onTrade)||t.call(this,i))} + ; + const u=new pki("훔쳐보기",h,40,14); + if(u.setPrimary(!1),u.onTap=()=>{ + var t; + const i=this.target; + this.close(),i&&(null==(t=this.onPeek)||t.call(this,i))} + ,l.position.set(12,60),u.position.set(12+h+8,60),i.addChild(r,o,a,c,l,u),s){ + const t=new pki("수리 돕기",h,40,14); + t.setPrimary(!1),t.onTap=()=>{ + var t; + const i=this.target; + this.close(),i&&(null==(t=this.onHelp)||t.call(this,i))} + ,t.position.set(12+2*(h+8),60),i.addChild(t)} + } + place(){ + const t=this.target; + if(!t||!this.visible)return; + const i=this.scene.boatPoint(t.id); + if(!i)return void this.close(); + const s=this.toLocal(this.scene.worldToGlobal(i.x,i.y)),e=this.w,n=Math.max(10,Math.min(CRi.BLEED_W-10-e,s.x-e/2)),h=Math.max(8,s.y-46-112); + this.box.position.set(n,h); + const r=this.box.getChildByLabel("tail"); + r&&(r.x=Math.max(16,Math.min(e-16,s.x-n)))} + } + ; + Qt(rGi,"FishingBoatMenu"); + let oGi=rGi; + const aGi={ + gust:{ + name:"돌풍",cause:"돌풍으로",icon:"wind",color:11986151,prefixes:["돌풍"]} + ,rapid:{ + name:"급류",cause:"급류로",icon:"rapid",color:8375529,prefixes:["급류"]} + ,rock:{ + name:"바위 충돌",cause:"바위 충돌로",icon:"rock",color:12504016,prefixes:["바위"]} + ,wave:{ + name:"큰파도",cause:"큰파도로",icon:"wave",color:8902897,prefixes:["거센 파도","큰파도","큰 파도"]} + ,reef:{ + name:"암초 충돌",cause:"암초 충돌로",icon:"rock",color:10340045,prefixes:["암초"]} + ,swell:{ + name:"큰 너울",cause:"큰 너울로",icon:"wave",color:8042992,prefixes:["큰 너울"]} + ,storm:{ + name:"폭풍",cause:"폭풍으로",icon:"storm",color:12369136,prefixes:["폭풍"]} + ,thunder:{ + name:"번개",cause:"번개로",icon:"thunder",color:16766843,prefixes:["번개"]} + ,monster:{ + name:"몬스터의 물살",cause:"몬스터의 물살로",icon:"monster",color:12822761,prefixes:["몬스터"]} + ,log:{ + name:"통나무 충돌",cause:"통나무 충돌로",icon:"log",color:14464907,prefixes:["떠내려온 통나무","통나무"]} + ,vine:{ + name:"가시 덩굴",cause:"가시 덩굴로",icon:"vine",color:10869146,prefixes:["가시 덩굴"]} + ,ghost:{ + name:"망령의 손길",cause:"망령의 손길로",icon:"ghost",color:12892397,prefixes:["망령"]} + ,ice:{ + name:"얼음 충돌",cause:"얼음 덩어리 충돌로",icon:"ice",color:10938865,prefixes:["얼음"]} + } + ,cGi={ + name:"재난",cause:"재난으로",icon:"warning",color:16764803,prefixes:[]} + ; + function lGi(t){ + return aGi[t]??Object.values(aGi).find(i=>i.prefixes.some(i=>t.startsWith(i)))??cGi} + function uGi(t,i=30){ + const s=new ip,e=t.color,n={ + color:e,width:2.1,cap:"round",join:"round"} + ; + switch(s.eventMode="none",t.icon){ + case"wind":s.moveTo(3,10).lineTo(20,10).bezierCurveTo(28,10,27,2,22,4).stroke(n).moveTo(1,16).lineTo(25,16).bezierCurveTo(33,16,31,24,26,22).stroke(n).moveTo(5,22).lineTo(16,22).bezierCurveTo(23,22,22,30,17,28).stroke(n); + break; + case"wave":s.moveTo(2,25).bezierCurveTo(9,24,7,10,16,6).bezierCurveTo(23,2,30,7,27,12).bezierCurveTo(24,7,18,10,20,16).bezierCurveTo(22,23,27,23,30,23).lineTo(30,28).lineTo(2,28).closePath().fill({ + color:e,alpha:.23} + ).stroke(n).moveTo(6,25).quadraticCurveTo(13,28,18,23).stroke({ + ...n,color:15202047,width:1.6} + ); + break; + case"rapid":for(let t=0; + t<3; + t++){ + const i=7+9*t,e=1===t?2:5; + s.moveTo(e,i).bezierCurveTo(e+5,i-4,17,i+4,26,i).moveTo(22,i-3).lineTo(27,i).lineTo(23,i+4).stroke(n)} + break; + case"rock":s.poly([4,24,9,11,16,7,24,14,28,24]).fill({ + color:e,alpha:.25} + ).stroke(n).moveTo(16,8).lineTo(14,17).lineTo(22,23).stroke({ + ...n,width:1.4} + ).moveTo(1,28).quadraticCurveTo(8,25,15,28).quadraticCurveTo(22,31,31,27).stroke(n).moveTo(25,8).lineTo(28,4).moveTo(28,12).lineTo(31,11).stroke(n); + break; + case"storm":s.moveTo(7,19).bezierCurveTo(0,19,0,10,7,10).bezierCurveTo(7,0,21,0,23,9).bezierCurveTo(33,7,34,19,25,19).closePath().fill({ + color:e,alpha:.25} + ).stroke(n).moveTo(8,23).lineTo(5,28).moveTo(16,23).lineTo(13,29).moveTo(24,23).lineTo(21,28).stroke(n); + break; + case"thunder":s.poly([18,2,5,18,14,18,11,30,28,12,18,12,23,2]).fill(e); + break; + case"monster":s.moveTo(4,25).bezierCurveTo(11,26,11,17,12,8).bezierCurveTo(13,1,26,2,26,11).bezierCurveTo(26,17,20,18,18,14).bezierCurveTo(23,15,23,8,19,9).bezierCurveTo(17,10,24,27,13,28).closePath().fill({ + color:e,alpha:.3} + ).stroke(n).moveTo(1,29).quadraticCurveTo(7,26,15,29).quadraticCurveTo(23,32,31,27).stroke(n); + break; + case"log":s.moveTo(9,10).lineTo(24,3).quadraticCurveTo(33,10,27,20).lineTo(13,28).closePath().fill({ + color:e,alpha:.22} + ).stroke(n).ellipse(10,19,6,9).stroke(n).ellipse(10,19,2.5,4).stroke({ + ...n,width:1.4} + ).moveTo(18,13).lineTo(25,9).moveTo(20,20).lineTo(27,16).stroke({ + ...n,width:1.4} + ); + break; + case"vine":s.moveTo(5,29).bezierCurveTo(30,27,4,5,27,3).stroke({ + ...n,width:3} + ).poly([13,23,6,19,13,18]).fill(e).poly([17,14,25,11,18,9]).fill(e).moveTo(15,9).quadraticCurveTo(4,9,5,3).quadraticCurveTo(14,1,15,9).fill({ + color:e,alpha:.5} + ); + break; + case"ghost":s.moveTo(5,28).lineTo(5,13).bezierCurveTo(5,-1,27,-1,27,13).lineTo(27,28).lineTo(21,24).lineTo(16,29).lineTo(11,24).closePath().fill({ + color:e,alpha:.2} + ).stroke(n).ellipse(12,13,1.7,2.4).fill(e).ellipse(21,13,1.7,2.4).fill(e); + break; + case"ice":s.poly([7,6,21,3,29,13,24,27,10,30,3,19]).fill({ + color:e,alpha:.2} + ).stroke(n).moveTo(7,6).lineTo(13,15).lineTo(29,13).moveTo(13,15).lineTo(10,30).moveTo(17,8).lineTo(21,7).stroke({ + ...n,width:1.5} + ); + break; + default:s.poly([16,3,30,28,2,28]).stroke(n).moveTo(16,11).lineTo(16,19).stroke(n).circle(16,24,1.4).fill(e)} + return s.scale.set(i/32),s} + function dGi(t,i){ + const s=lGi(t.text),e=t.dmg>0,n=new Ve,h=rki(e?`${ + s.cause} + 내구도가 감소했습니다.`:`${ + s.name} + 에도 배가 끄떡없습니다.`,KIi,14),r=rki(e?`내구도 −${ + nSi(t.dmg)} + · 남은 내구도 ${ + Math.ceil(t.hp)} + `:"내구도 손상 없음",e?XIi:qIi,12,!1),o=Math.min(i,Math.max(300,Math.max(h.width,r.width)+80)); + h.setWrapWidth(o-80),r.setWrapWidth(o-80); + const a=Math.max(62,h.height+r.height+23),c=new ip; + c.roundRect(0,0,o,a,13).fill({ + color:e?2694947:GIi,alpha:.96} + ).roundRect(11,(a-40)/2,40,40,11).fill({ + color:s.color,alpha:.12} + ); + const l=uGi(s,30); + return l.position.set(16,(a-30)/2),h.position.set(64,10),r.position.set(64,14+h.height),n.addChild(c,l,h,r),n.eventMode="none",n} + function fGi(t,i){ + try{ + qG.getInstance().playSFX(t,i)} + catch{ + } + } + Qt(lGi,"hazardArt"),Qt(uGi,"hazardIcon"),Qt(dGi,"hazardNotice"),Qt(fGi,"sfx$2"); + const pGi=WSi.find(t=>"boat"===t.key).names,gGi=Qt(t=>t>.5?8378016:t>.25?16106577:16739179,"hpColor"),wGi=class extends Ve{ + constructor(t,i){ + super(),Zt(this,"chip",new Ve),Zt(this,"chipBg",new ip),Zt(this,"chipBar",new ip),Zt(this,"chipText",rki("",KIi,12)),Zt(this,"banner",new Ve),Zt(this,"bannerBg",new ip),Zt(this,"bannerBar",new ip),Zt(this,"bannerTitle",rki("",KIi,14)),Zt(this,"bannerSub",rki("",zIi,12,!1)),Zt(this,"stopBtn",new pki("그만 고치기",112,34,13)),Zt(this,"panelBox",new Ve),Zt(this,"helpBox",new Ve),Zt(this,"helpTarget",null),Zt(this,"helpBusy",!1),Zt(this,"notices",[]),Zt(this,"chipKey",""),Zt(this,"wasFixing",!1),Zt(this,"finishFxAt",0),Zt(this,"onPeek",null),Zt(this,"bannerY",Qt(()=>166,"bannerY")),Zt(this,"panelSig",""),Zt(this,"panelLive",null),Zt(this,"helpSig",""),Zt(this,"helpLive",null),this.scene=t,this.viewH=i,this.chip.addChild(this.chipBg,this.chipBar,this.chipText),this.chip.eventMode="static",this.chip.cursor="pointer",this.chip.on("pointertap",t=>{ + t.stopPropagation(),this.openPanel()} + ),this.banner.addChild(this.bannerBg,this.bannerBar,this.bannerTitle,this.bannerSub,this.stopBtn),this.banner.visible=!1,this.banner.eventMode="static",this.banner.on("pointertap",t=>t.stopPropagation()),this.stopBtn.onTap=()=>{ + this.stop()} + ,this.panelBox.visible=this.helpBox.visible=!1,this.panelBox.eventMode=this.helpBox.eventMode="static",this.addChild(this.banner,this.panelBox,this.helpBox),t.sailBlock=()=>RIi.getInstance().boatProblem(); + const s=RIi.getInstance().onBoatLog(t=>this.onLogs(t)); + this.once("destroyed",()=>{ + s(); + for(const t of this.notices)MR.killTweensOf(t); + this.notices=[]} + )} + get panelOpen(){ + return this.panelBox.visible||this.helpBox.visible} + get bannerBottom(){ + return this.bannerY()+(this.banner.visible?66:0)} + closeAll(){ + this.panelBox.visible=!1,this.helpBox.visible=!1,this.helpTarget=null} + update(){ + const t=RIi.getInstance(); + if(!t.ready)return; + const i=t.boatHp(),s=i.hp/i.max,e=i.fixing?`수리 ${ + Math.floor(100*s)} + %`:`배 ${ + Math.ceil(i.hp)} + /${ + i.max} + `,n=`${ + e} + |${ + Math.round(50*s)} + |${ + i.fixing} + `; + if(n!==this.chipKey){ + this.chipKey=n,this.chipText.text=e,this.chipText.textColor=i.fixing?16757611:s<=.25?XIi:KIi; + const t=Math.max(92,this.chipText.width+20); + this.chipBg.clear().roundRect(0,0,t,26,8).fill({ + color:i.fixing?3810324:QIi,alpha:.78} + ),this.chipText.position.set(10,3),this.chipBar.clear(),vki(this.chipBar,10,20,t-20,3,s,i.fixing?16757611:gGi(s),BIi),this.chip.hitArea=new Ui(0,0,t,26)} + this.wasFixing&&!i.fixing&&i.hp>=i.max-.5&&this.playFinish(),this.wasFixing=i.fixing,this.scene.setFixing(i.fixing?{ + broken:i.broken,progress:i.hp/i.max} + :null),this.renderBanner(),this.panelBox.visible&&this.renderPanel(),this.helpBox.visible&&this.renderHelp()} + renderBanner(){ + var t; + const i=RIi.getInstance(),s=i.boatHp(); + if(this.banner.visible=s.fixing,!s.fixing)return; + const e=CRi.BLEED_W,n=Math.min(e-20,460),h=(e-n)/2; + this.banner.position.set(h,this.bannerY()),this.bannerBg.clear().roundRect(0,0,n,58,12).fill({ + color:s.broken?3807764:2827284,alpha:.92} + ),this.bannerTitle.text=s.broken?"배가 고장 났어요 · 고치는 중":"배를 고치는 중",this.bannerTitle.textColor=s.broken?16757611:VIi,this.bannerTitle.position.set(14,8),oki(this.bannerTitle,n-150); + const r=(null==(t=i.state.boat)?void 0:t.helps.length)??0,o=Math.max(0,s.endAt-i.now()),a=!s.broken||s.hp>=DAi.MOVE_MIN; + this.bannerSub.text=`${ + Mki(o)} + 남음 · 내구도 ${ + Math.floor(s.hp)} + /${ + s.max} + ${ + r?` · 도움 ${ + r} + 명`:""} + ${ + a?"":` · ${ + DAi.MOVE_MIN} + 까지는 고쳐야 떠나요`} + `,this.bannerSub.position.set(14,30),oki(this.bannerSub,n-150),this.bannerBar.clear(),vki(this.bannerBar,14,49,n-150,4,s.hp/s.max,16757611,4864552),this.stopBtn.position.set(n-124,12),this.stopBtn.setPrimary(!1),this.stopBtn.enabled=a,this.banner.hitArea=new Ui(0,0,n,58)} + async stop(){ + const t=await RIi.getInstance().boatRepair("stop"); + t&&vH.getInstance().showMessage(t)} + async start(){ + const t=await RIi.getInstance().boatRepair("start"); + t?vH.getInstance().showMessage(t):(this.closeAll(),jG("light"),this.scene.repairStarted(),vH.getInstance().showMessage("배를 고치기 시작했어요. 고치는 동안은 낚시를 쉬어요"))} + openPanel(){ + this.helpBox.visible=!1,this.panelBox.visible=!0,this.panelSig="",this.renderPanel(),MR.fromTo(this.panelBox,{ + alpha:0} + ,{ + alpha:1,duration:.15} + )} + renderPanel(){ + const t=RIi.getInstance(),i=t.state,s=t.boatHp(),e=i.gear.boat,n=t.helpPts(),h=ZAi(e),r=t.now(),o=`${ + e} + |${ + i.spot.race} + |${ + i.spot.zone} + |${ + s.fixing} + |${ + s.hp>=s.max} + `; + if(o===this.panelSig&&this.panelLive)return this.panelLive.hp.text=`내구도 ${ + Math.floor(s.hp)} + / ${ + s.max} + `,this.panelLive.help.text=`도움 점수 ${ + n.n} + /${ + h} + ${ + n.nextAt?` · 다음 ${ + Mki(n.nextAt-r)} + `:""} + · 고치는 남의 배를 누르면 3% 앞당겨 줘요`,this.panelLive.bar.clear(),void vki(this.panelLive.bar,0,0,this.panelLive.barW,8,s.hp/s.max,s.fixing?16757611:gGi(s.hp/s.max)); + this.panelSig=o; + const a=this.panelBox; + a.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const c=CRi.BLEED_W,l=this.viewH(),u=Math.min(c-20,480),d=(c-u)/2,f=d+18,p=FAi(i.spot.race,i.spot.zone),g=VAi(i.spot.race,i.spot.zone),w=330,m=l-w-8,v=aki(u,w,QIi,null,14); + v.alpha=.96,v.position.set(d,m); + const _=rki(`${ + pGi[e]} + · 배 ${ + e+1} + 단계`,VIi,17); + _.position.set(f,m+14); + const M=rki(`튼튼함 ${ + sSi(i)} + · 다 고치는 데 ${ + Mki(rSi(i))} + (${ + pSi[i.spot.zone]} + ) · 배 장비 포함`,zIi,12,!1); + M.position.set(f,m+40),oki(M,u-36); + const b=rki(`내구도 ${ + Math.floor(s.hp)} + / ${ + s.max} + `,KIi,14); + b.position.set(f,m+62); + const y=new ip,E=u-36; + y.position.set(f,m+86),vki(y,0,0,E,8,s.hp/s.max,s.fixing?16757611:gGi(s.hp/s.max)); + const A=UAi[p-1],S=rki(`이 지역 난이도 ${ + p} + /12 · ${ + lSi(i.spot.race,i.spot.zone)} + ${ + e>=A?" · 내 배로 안정적":" · 내 배는 자주 고장 나요"} + `,e>=A?qIi:XIi,13); + S.position.set(f,m+108),oki(S,u-36); + const T=[v,_,M,b,y,S]; + let C=m+134; + for(const R of[...g].sort((t,i)=>i.dmg-t.dmg)){ + const t=eSi(R.dmg,sSi(i)),s=lGi(R.key),e=uGi(s,16),n=rki(s.name,KIi,12,!1); + e.position.set(f,C),n.position.set(f+23,C); + const h=rki(t>0?`내구도 −${ + nSi(t)} + `:"끄떡없음",t>0?XIi:qIi,12); + h.position.set(f+190,C),T.push(e,n,h),C+=20} + const O=rki(`도움 점수 ${ + n.n} + /${ + h} + ${ + n.nextAt?` · 다음 ${ + Mki(n.nextAt-r)} + `:""} + · 고치는 남의 배를 누르면 3% 앞당겨 줘요`,zIi,12,!1); + O.position.set(f,m+w-82),oki(O,u-36),T.push(O),this.panelLive={ + hp:b,help:O,bar:y,barW:E} + ; + const I=new pki("닫기",96,40,14); + I.setPrimary(!1),I.onTap=()=>this.closeAll(); + const k=new pki("",170,40,14); + if(k.position.set(d+u-18-170,m+w-54),I.position.set(k.x-8-96,k.y),s.fixing)k.setText("고치는 중"),k.enabled=!1; + else if(s.hp>=s.max)k.setText("고칠 곳이 없어요"),k.enabled=!1; + else{ + const t=(s.max-s.hp)/s.max*rSi(i); + k.setText(`고치기 (${ + Mki(t)} + )`),k.onTap=()=>{ + this.start()} + } + T.push(I,k),a.hitArea=new Ui(0,0,c,l),a.removeAllListeners("pointertap"),a.on("pointertap",t=>{ + t.stopPropagation(),a.toLocal(t.global).y<m&&this.closeAll()} + ),a.addChild(...T)} + wantsHelp(t){ + return!!t.fx&&t.fx>RIi.getInstance().realNow()} + openHelp(t){ + this.panelBox.visible=!1,this.helpTarget=t,this.helpBox.visible=!0,this.helpSig="",this.renderHelp(),MR.fromTo(this.helpBox,{ + alpha:0,y:12} + ,{ + alpha:1,y:0,duration:.16} + ),jG("light")} + renderHelp(){ + const t=this.helpTarget,i=RIi.getInstance(); + if(!t)return void(this.helpBox.visible=!1); + const s=i.others.find(i=>i.id===t.id)??t,e=i.realNow(),n=Math.max(0,(s.fx??0)-e),h=i.helpPts(),r=this.scene.boatPoint("me"),o=this.scene.boatPoint(t.id),a=!!r&&!!o&&Math.hypot(r.x-o.x,r.y-o.y)<=DAi.HELP_RANGE,c=`${ + t.id} + |${ + n>0} + |${ + h.n} + |${ + a} + `,l=n>0?`${ + s.fk?"고장 나서 고치는 중":"고치는 중"} + · ${ + Mki(n)} + 남음`:"다 고친 것 같아요"; + if(c===this.helpSig&&this.helpLive)return void(this.helpLive.sub.text=l); + this.helpSig=c; + const u=this.helpBox; + u.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const d=CRi.BLEED_W,f=this.viewH(),p=Math.min(d-20,480),g=(d-p)/2,w=g+18,m=f-168-8,v=aki(p,168,QIi,null,14); + v.alpha=.96,v.position.set(g,m); + const _=rki(`${ + t.n} + 님의 배`,VIi,17); + _.position.set(w,m+14),oki(_,p-36); + const M=rki(l,16757611,13); + M.position.set(w,m+40),oki(M,p-36); + const b=rki(`도움 점수 ${ + h.n} + 개 · 한 번 도우면 다 고치는 시간의 3%를 앞당겨요 (한 번 고장에 한 번)`,zIi,12,!1); + b.position.set(w,m+64),oki(b,p-36),this.helpLive={ + sub:M} + ; + const y=new pki("훔쳐보기",96,40,14); + y.setPrimary(!1),y.onTap=()=>{ + var t; + const i=this.helpTarget; + this.closeAll(),i&&(null==(t=this.onPeek)||t.call(this,i))} + ; + const E=new pki("닫기",80,40,14); + E.setPrimary(!1),E.onTap=()=>this.closeAll(); + const A=new pki("",160,40,14); + A.position.set(g+p-18-160,m+168-54),y.position.set(A.x-8-96,A.y),E.position.set(y.x-8-80,A.y),n<=0?(A.setText("다 고쳤어요"),A.enabled=!1):a?h.n<1?(A.setText(`점수 없음 · ${ + Mki((h.nextAt??i.now())-i.now())} + `),A.enabled=!1):(A.setText("수리 돕기 (점수 1)"),A.onTap=async()=>{ + if(this.helpBusy)return; + this.helpBusy=!0,A.enabled=!1; + const s=await i.boatHelp(t.id).finally(()=>{ + this.helpBusy=!1} + ); + if(s.message)return vH.getInstance().showMessage(s.message),void(A.destroyed||(A.enabled=!0)); + jG("medium"),this.scene.helpFx(t.id),this.closeAll(),vH.getInstance().showMessage(`${ + t.n} + 님의 배 수리를 도와줬어요! (3% 앞당김)`)} + ):(A.setText("옆으로 가기"),A.onTap=()=>{ + this.scene.sailNearBoat(t.id)&&(vH.getInstance().showMessage("옆에 닿으면 다시 눌러 수리 돕기"),this.closeAll())} + ),vGi(u,[v,_,M,b,E,y,A]),u.hitArea=new Ui(0,0,d,f),u.removeAllListeners("pointertap"),u.on("pointertap",t=>{ + t.stopPropagation(),u.toLocal(t.global).y<m&&this.closeAll()} + )} + onLogs(t){ + var i,s; + for(const e of t)if("hazard"===e.kind)this.scene.boatHit(e.dmg),this.showNotice(dGi(e,Math.min(460,CRi.BLEED_W-24))),e.dmg>0&&(jG(e.dmg>=30?"heavy":"medium"),fGi(qG.SFX_STONE_BREAK,.35)); + else if("broke"===e.kind)this.scene.boatHit(0,!0),this.scene.repairStarted(),this.notice("배가 고장 났어요! 고치는 동안은 낚시할 수 없어요",16777215,11879211),jG("heavy"); + else if("repaired"===e.kind)this.wasFixing?(this.playFinish(),this.wasFixing=!1):Date.now()-this.finishFxAt>5e3&&(this.notice("배를 다 고쳤어요! 다시 낚시해요",qIi,1194538),fGi(qG.SFX_GOLD_GOBLIN,.5)); + else if("help"===e.kind){ + this.notice(hSi(e.text),VIi,2827284); + const t=RIi.getInstance(),n=(null==(i=t.state.boat)?void 0:i.helps)??[],h=n[n.length-1]??null,r=h?null==(s=t.others.find(t=>t.id===h))?void 0:s.n:void 0; + this.scene.helpFx("me",h,r?`+3% · ${ + r} + 님`:"수리 +3%")} + else"travel"===e.kind&&this.notice(hSi(e.text),16751752,3807764)} + playFinish(){ + this.finishFxAt=Date.now(),this.scene.repairFinished()} + notice(t,i,s){ + const e=CRi.BLEED_W,n=mki(t,i,s,14,12); + n.scale.set(Math.min(1,(e-24)/n.width)),this.showNotice(n)} + showNotice(t){ + if(this.addChild(t),this.notices.push(t),this.notices.length>3){ + const t=this.notices.shift(); + MR.killTweensOf(t),t.destroy({ + children:!0} + )} + this.layoutNotices(),MR.fromTo(t,{ + alpha:0} + ,{ + alpha:1,duration:.2} + ),MR.to(t,{ + alpha:0,delay:3.2,duration:.5,onComplete:Qt(()=>{ + this.notices=this.notices.filter(i=>i!==t),t.destroy({ + children:!0} + ),this.layoutNotices()} + ,"onComplete")} + )} + layoutNotices(){ + let t=this.viewH()-104; + for(let i=this.notices.length-1; + i>=0; + i--){ + const s=this.notices[i]; + s.position.set((CRi.BLEED_W-s.width)/2,t-s.height),t=s.y-8} + } + layout(){ + this.chipKey="",this.panelSig="",this.helpSig="",this.layoutNotices()} + } + ; + Qt(wGi,"FishingBoatUi"); + let mGi=wGi; + function vGi(t,i){ + t.addChild(...i)} + Qt(vGi,"kids"); + const _Gi={ + miss:9018538,good:9685215,great:9298101,perfect:16766836} + ,MGi={ + miss:"빗나감",good:"명중",great:"그레이트",perfect:"퍼펙트!"} + ,bGi={ + wood:14464634,iron:12375785,mithril:10807780} + ,yGi=class extends Ve{ + constructor(){ + super(),Zt(this,"shade",new ip),Zt(this,"card",new Ve),Zt(this,"back",new ip),Zt(this,"rail",new ip),Zt(this,"focus",new ip),Zt(this,"trail",new ip),Zt(this,"needle",new Ve),Zt(this,"needleInk",new ip),Zt(this,"feedback",new ip),Zt(this,"weapon",new Ye),Zt(this,"title",rki("",KIi,20)),Zt(this,"target",rki("",zIi,16,!1)),Zt(this,"hint",rki("중앙에 맞춰 멈추세요",zIi,16,!1)),Zt(this,"legends",["good","great","perfect"].map(t=>({ + grade:t,bg:new ip,text:rki("good"===t?"명중":`${ + MGi[t].replace("!","")} + ${ + $Oi(t)} + %`,_Gi[t],16)} + ))),Zt(this,"fireBg",new ip),Zt(this,"fireText",rki("눌러서 던지기",jIi,19)),Zt(this,"cancel",new Ve),Zt(this,"cancelBg",new ip),Zt(this,"cancelText",rki("취소",zIi,17)),Zt(this,"range",zOi),Zt(this,"state","closed"),Zt(this,"startedAt",0),Zt(this,"lockedAt",0),Zt(this,"now",0),Zt(this,"w",1),Zt(this,"railW",1),Zt(this,"cardY",0),Zt(this,"accent",bGi.wood),Zt(this,"currentGrade",null),Zt(this,"lockGrade","miss"),Zt(this,"finishResolve",null),Zt(this,"value",-1),Zt(this,"onFire",null),Zt(this,"onCancel",null),Zt(this,"onKey",Qt(t=>{ + var i,s; + "aiming"!==this.state||t.repeat||t.target instanceof HTMLElement&&(t.target.isContentEditable||/^(INPUT|TEXTAREA|SELECT)$/.test(t.target.tagName))||"Space"!==t.code&&"Enter"!==t.code&&"Escape"!==t.code||(t.preventDefault(),t.stopPropagation(),"Escape"===t.code?null==(i=this.onCancel)||i.call(this):null==(s=this.onFire)||s.call(this))} + ,"onKey")),this.visible=!1,this.eventMode="none",this.weapon.anchor.set(.5),this.weapon.scale.set(.36),this.weapon.rotation=-.3,this.needle.addChild((new ip).roundRect(-3.5,-6,7,41,2).fill(QIi),this.needleInk),this.needleInk.roundRect(-1.5,-5,3,39,1).fill(16774361).poly([-6,-13,6,-13,0,-5]).fill(16774361).poly([-4,37,4,37,0,32]).fill(16774361),this.card.addChild(this.back,this.rail,this.focus,this.trail,this.needle,this.feedback,this.weapon,this.title,this.target,this.hint); + for(const t of this.legends)this.card.addChild(t.bg,t.text); + this.cancel.addChild(this.cancelBg,this.cancelText),this.cancel.eventMode="static",this.cancel.cursor="pointer",this.cancel.on("pointerdown",t=>{ + var i; + t.stopPropagation(),"aiming"===this.state&&(null==(i=this.onCancel)||i.call(this))} + ),this.cancel.on("pointertap",t=>t.stopPropagation()),this.card.addChild(this.fireBg,this.fireText,this.cancel),this.addChild(this.shade,this.card),this.on("pointerdown",t=>{ + var i; + t.stopPropagation(),"aiming"===this.state&&(null==(i=this.onFire)||i.call(this))} + ),this.on("pointertap",t=>t.stopPropagation())} + open(t,i,s,e,n=performance.now(),h=zOi){ + this.close(),this.range=h,this.state="aiming",this.visible=!0,this.eventMode="static",this.cursor="pointer",this.startedAt=this.now=n,this.value=-1,this.currentGrade=null,this.accent=bGi[t],this.weapon.texture=sPi(t),this.title.text=kOi[t].name,this.title.textSize=20,this.title.textColor=this.accent,this.target.text=i,this.hint.text="중앙에 맞춰 멈추세요",this.fireText.text="눌러서 던지기",this.cancel.visible=!0,this.layout(s,e),this.update(n),window.addEventListener("keydown",this.onKey)} + layout(t,i){ + this.hitArea=new Ui(0,0,t,i),this.w=Math.min(560,t-24),this.railW=this.w-40,this.cardY=Math.max(12,i-242-Math.min(146,.2*i)),this.card.position.set((t-this.w)/2,this.cardY),this.shade.clear().rect(0,0,t,i).fill({ + color:0,alpha:.12} + ),this.back.clear().roundRect(0,4,this.w,242,16).fill({ + color:0,alpha:.26} + ).roundRect(0,0,this.w,242,16).fill({ + color:GIi,alpha:.98} + ).roundRect(.5,.5,this.w-1,241,16).stroke({ + color:this.accent,alpha:.5,width:1} + ).moveTo(18,46).lineTo(this.w-18,46).stroke({ + color:WIi,alpha:.8,width:1} + ),this.weapon.position.set(40,25),this.title.position.set(72,11),oki(this.title,this.w-90),oki(this.target,.4*this.w),this.target.position.set(this.w-20-this.target.width,52),this.hint.position.set(20,52),oki(this.hint,.55*this.w-22),this.drawRail(),this.needle.y=90; + const s=(this.w-40)/3; + this.legends.forEach((t,i)=>{ + oki(t.text,s-12),t.text.position.set(20+i*s+(s-t.text.width)/2,138+(34-t.text.height)/2)} + ),this.cancel.position.set(16,184),this.cancel.hitArea=new Ui(0,-4,84,54),this.cancelBg.clear().roundRect(0,0,84,46,9).fill(BIi),this.cancelText.position.set((84-this.cancelText.width)/2,(46-this.cancelText.height)/2),this.currentGrade=null,this.paintGrade("locked"===this.state?this.lockGrade:qOi(this.value,this.range)),this.placeNeedle()} + drawRail(){ + const t=this.rail.clear(),i=this.railW; + t.roundRect(17,87,i+6,34,9).fill(QIi).roundRect(20,90,i,28,6).fill(BIi); + for(const n of[{ + r:this.range.good,c:3304320} + ,{ + r:this.range.great,c:4756605} + ,{ + r:this.range.perfect,c:15316814} + ]){ + const s=20+i*(1-n.r)/2,e=n.r*i; + t.roundRect(s,90,e,28,3).fill(n.c).roundRect(s+1,91,e-2,4,2).fill({ + color:16777215,alpha:.16} + )} + for(let n=0; + n<=20; + n++){ + const s=20+i*n/20; + t.moveTo(s,124).lineTo(s,118+(n%5?8:11))} + t.stroke({ + color:9020842,alpha:.35,width:1} + ); + const s=this.range.perfect*i/2,e=this.w/2; + this.focus.clear().moveTo(e-s,86).lineTo(e-s,82).lineTo(e-s+5,82).moveTo(e+s,86).lineTo(e+s,82).lineTo(e+s-5,82).stroke({ + color:_Gi.perfect,width:1.5} + )} + paintGrade(t){ + if(t===this.currentGrade)return; + this.currentGrade=t; + const i=this.railW/3; + this.legends.forEach((s,e)=>{ + s.bg.clear().roundRect(20+e*i+2,138,i-4,34,8).fill({ + color:_Gi[s.grade],alpha:t===s.grade?.17:.035} + ),s.text.alpha=t===s.grade?1:.68} + ); + const s="locked"===this.state,e=s?16:108,n=this.w-e-16; + this.fireBg.clear().roundRect(e,184,n,46,9).fill(s?BIi:this.accent),this.fireText.textColor=s?_Gi[t]:1517611,this.fireText.position.set(e+(n-this.fireText.width)/2,184+(46-this.fireText.height)/2),this.needleInk.tint=s?_Gi[t]:16777215} + placeNeedle(){ + this.needle.x=20+(this.value+1)*this.railW/2} + update(t){ + if(this.visible&&!this.destroyed)if(this.now=t,"aiming"===this.state){ + const i=Math.max(0,t-this.startedAt),s=$Ti(i),e=$Ti(Math.max(0,i-28)); + this.value=s,this.placeNeedle(),this.paintGrade(qOi(s,this.range)); + const n=Math.max(-26,Math.min(26,(e-s)*this.railW/2)); + this.trail.clear().poly([this.needle.x,100,this.needle.x+n,104,this.needle.x,108]).fill({ + color:16774361,alpha:.2} + ); + const h=Math.min(1,i/140); + this.card.alpha=.65+.35*h,this.card.y=this.cardY+(1-h)**2*7,this.focus.alpha=.65+.2*Math.sin(i/240)} + else if("locked"===this.state){ + const i=Math.max(0,t-this.lockedAt),s=Math.min(1,i/280); + this.needle.scale.set(1+.14*Math.sin(s*Math.PI)); + const e=this.needle.x,n=5+15*s; + if(this.feedback.clear().moveTo(e-n,88).lineTo(e-n,120).moveTo(e+n,88).lineTo(e+n,120).stroke({ + color:_Gi[this.lockGrade],alpha:.6*(1-s),width:1.5} + ),s>=1&&this.finishResolve){ + const t=this.finishResolve; + this.finishResolve=null,t(!0)} + } + } + freeze(t,i=performance.now()){ + "aiming"===this.state&&(this.state="locked",this.lockedAt=this.now=i,this.trail.clear(),this.cancel.visible=!1,this.card.alpha=this.focus.alpha=1,this.card.y=this.cardY,this.setResult(t))} + setResult(t){ + this.lockGrade=t,this.currentGrade=null,this.title.text="great"===t||"perfect"===t?`${ + MGi[t]} + ${ + $Oi(t)} + %`:MGi[t],this.title.textSize=22,this.title.textColor=_Gi[t],oki(this.title,this.w-90),this.hint.text="조준 완료",this.fireText.text="작살 투척",this.paintGrade(t)} + finish(t){ + return"locked"===this.state&&this.visible?(this.setResult(t),this.now-this.lockedAt>=280?Promise.resolve(!0):new Promise(t=>{ + this.finishResolve=t} + )):Promise.resolve(!1)} + close(){ + var t; + this.state="closed",this.visible=!1,this.eventMode="none",this.needle.scale.set(1),this.feedback.clear(),window.removeEventListener("keydown",this.onKey),null==(t=this.finishResolve)||t.call(this,!1),this.finishResolve=null} + destroy(t){ + this.close(),super.destroy(t)} + } + ; + Qt(yGi,"FishingHarpoonGauge"); + let EGi=yGi; + function AGi(t,i){ + try{ + qG.getInstance().playSFX(t,i)} + catch{ + } + } + function SGi(t,i,s){ + const e=t.charCodeAt(t.length-1); + return e<44032||e>55203?`${ + t} + ${ + i} + (${ + s} + )`:`${ + t} + ${ + (e-44032)%28?i:s} + `} + Qt(AGi,"sfx$1"),Qt(SGi,"josa"); + const TGi=230,CGi={ + miss:9018538,good:9685215,great:9298101,perfect:16766836} + ,OGi=class t extends Ve{ + constructor(t,i){ + super(),Zt(this,"chip",new Ve),Zt(this,"chipBg",new ip),Zt(this,"chipText",rki("",KIi,12)),Zt(this,"banner",new Ve),Zt(this,"bannerBg",new ip),Zt(this,"bannerBar",new ip),Zt(this,"bannerTitle",rki("",KIi,14)),Zt(this,"bannerSub",rki("",zIi,12,!1)),Zt(this,"throwBtn",new Ve),Zt(this,"throwBg",new ip),Zt(this,"throwText",rki("작살",jIi,15)),Zt(this,"throwSub",rki("",jIi,11,!1)),Zt(this,"gauge",new EGi),Zt(this,"gaugeOn",!1),Zt(this,"throwing",!1),Zt(this,"preparing",!1),Zt(this,"aimId",null),Zt(this,"aimStartPerf",0),Zt(this,"aimEndPerf",0),Zt(this,"gaugeFrame",0),Zt(this,"aimTarget",null),Zt(this,"generation",0),Zt(this,"contextKey",""),Zt(this,"statusRevision",0),Zt(this,"records",new Ve),Zt(this,"boss",null),Zt(this,"status",null),Zt(this,"statusAt",0),Zt(this,"spawnedW",null),Zt(this,"alertMap",""),Zt(this,"spawnTry",0),Zt(this,"spawnFails",0),Zt(this,"craft",new Ve),Zt(this,"crafting",!1),Zt(this,"warnedW",null),Zt(this,"lastSeenResult",-1),Zt(this,"chipKey",""),Zt(this,"bannerY",Qt(()=>166,"bannerY")),Zt(this,"tickGauge",Qt(()=>{ + if(!this.gauge.visible||this.destroyed)return void(this.gaugeFrame=0); + if(this.aimId&&this.gaugeOn&&performance.now()>=this.aimEndPerf)return this.closeGauge(),void this.renderThrowBtn(); + this.gauge.update(performance.now()); + const t=!this.gaugeOn; + t||(this.aimTarget=this.scene.captureHarpoonTarget(TGi)); + const i=this.aimTarget?this.aimTarget.sample()??this.aimTarget.point:null,s=qOi(this.gauge.value,this.gauge.range); + this.scene.setAimMark(i,CGi[s],1-Math.min(1,Math.abs(this.gauge.value)/this.gauge.range.good),t),this.gaugeFrame=requestAnimationFrame(this.tickGauge)} + ,"tickGauge")),Zt(this,"recordsSig",""),Zt(this,"craftSig",""),this.scene=t,this.viewH=i,this.chip.addChild(this.chipBg,this.chipText),this.chip.eventMode="static",this.chip.cursor="pointer",this.chip.on("pointertap",t=>{ + t.stopPropagation(),this.openRecords()} + ),this.banner.addChild(this.bannerBg,this.bannerBar,this.bannerTitle,this.bannerSub),this.banner.visible=!1,this.banner.eventMode="static",this.banner.on("pointertap",t=>{ + t.stopPropagation(),this.openRecords()} + ),this.throwBtn.addChild(this.throwBg,this.throwText,this.throwSub),this.throwBtn.visible=!1,this.throwBtn.eventMode="static",this.throwBtn.cursor="pointer",this.throwBtn.on("pointertap",t=>{ + t.stopPropagation(),KOi(RIi.getInstance().harpoons())?this.openGauge():this.openCraft()} + ),this.gauge.onFire=()=>{ + this.stopGauge()} + ,this.gauge.onCancel=()=>{ + this.closeAll(),this.renderThrowBtn()} + ,this.records.visible=!1,this.records.eventMode="static",this.craft.visible=!1,this.craft.eventMode="static",this.addChild(this.banner,this.throwBtn,this.gauge,this.records,this.craft)} + get panelOpen(){ + return this.gauge.visible||this.records.visible||this.craft.visible} + get bannerBottom(){ + return this.bannerY()+(this.banner.visible?this.banner.height+8:0)} + get active(){ + return!!this.boss} + closeAll(){ + this.generation++,this.records.visible=this.craft.visible=!1,this.closeGauge(),this.scene.cancelHarpoon()} + update(){ + var t,i; + const s=RIi.getInstance(); + if(!s.ready)return; + const e=s.state,n=s.realNow(),h=GOi(e.spot,n,e.huntDevAt),r=`${ + e.spot.race} + |${ + e.spot.zone} + |${ + (null==h?void 0:h.w)??"none"} + `; + if(r!==this.contextKey){ + this.closeAll(),this.contextKey=r,this.status=null,this.statusAt=0; + const t=`${ + e.spot.race} + |${ + e.spot.zone} + `; + t!==this.alertMap&&(this.alertMap=t,this.spawnedW=null)} + this.boss=h; + const o=(null==(t=e.hunt)?void 0:t.xp)??0,a=WOi(o); + this.chip.visible=!!h||o>0||QSi(e.spot)>=OOi.MIN_LEVEL; + const c=`${ + a.name} + |${ + !!h} + `; + if(c!==this.chipKey){ + this.chipKey=c,this.chipText.text=h?"사냥 중!":a.name,this.chipText.textColor=h?16757611:KIi; + const t=this.chipText.width+20; + this.chipBg.clear().roundRect(0,0,t,26,8).fill({ + color:h?3810324:QIi,alpha:.78} + ),this.chipText.position.set(10,4),this.chip.hitArea=new Ui(0,0,t,26)} + const l=BOi(e.spot,n,e.huntDevAt); + if(!h&&l&&l.at-n<6e4&&l.at>n&&this.warnedW!==l.w&&(this.warnedW=l.w,vH.getInstance().showMessage(`거대한 그림자가 다가와요… ${ + l.name} + ! (1분 뒤)`)),h&&this.spawnedW!==h.w&&(this.spawnedW=h.w,this.status=null,this.spawnTry=0,this.spawnFails=0,jG("medium"),AGi(qG.SFX_STONE_BREAK,.5),vH.getInstance().showMessage(`${ + SGi(h.name,"이","가")} + 나타났어요! 그림자가 가까이 지날 때 작살을 던져요`)),h&&!this.scene.hasBossShadow&&performance.now()>this.spawnTry&&(this.spawnTry=performance.now()+3e3,this.scene.bossGiant(h.kind)?this.spawnFails=0:this.spawnFails++),h&&!this.throwing&&performance.now()-this.statusAt>3e3){ + this.statusAt=performance.now(); + const t=this.statusRevision,i=this.generation; + s.huntStatus().then(s=>{ + i===this.generation&&t===this.statusRevision&&!this.throwing&&(null==s?void 0:s.boss)&&this.boss&&s.boss.w===this.boss.w&&(this.status={ + w:s.boss.w,total:s.boss.total,n:s.boss.n} + )} + ).catch(()=>{ + } + )} + this.renderBanner(),this.renderThrowBtn(),this.records.visible&&this.renderRecords(!1),this.craft.visible&&this.renderCraft(); + const u=null==(i=e.hunt)?void 0:i.last; + if(u&&u.at!==this.lastSeenResult){ + const t=this.lastSeenResult<0; + this.lastSeenResult=u.at,(!t||n-u.at<6e5)&&this.showResult(u)} + } + renderBanner(){ + var t,i; + const s=this.boss,e=RIi.getInstance(); + if(this.banner.visible=!!s,!s)return; + const n=CRi.BLEED_W,h=Math.min(n-20,460),r=(n-h)/2; + this.banner.position.set(r,this.bannerY()); + const o=(null==(t=this.status)?void 0:t.w)===s.w?this.status.total:0,a=(null==(i=this.status)?void 0:i.w)===s.w?this.status.n:0,c=o>=s.hp,l=Math.max(0,s.end-e.realNow()); + this.bannerBg.clear().roundRect(0,0,h,56,12).fill({ + color:c?1194538:2759472,alpha:.92} + ),this.bannerTitle.text=c?`${ + s.name} + 사냥 성공!`:`${ + s.name} + · ${ + pSi[e.state.spot.zone]} + 의 몬스터`,this.bannerTitle.textColor=c?qIi:15120639,this.bannerTitle.position.set(14,7),oki(this.bannerTitle,h-28); + const u=this.spawnFails>=2?" · 물이 좁아 그림자가 안 와요. 넓은 물로 가요":""; + this.bannerSub.text=`${ + c?"남은 시간 동안 더 던져도 기여가 올라요":`체력 ${ + Math.max(0,s.hp-o)} + /${ + s.hp} + `} + · 함께 ${ + a} + 명 · ${ + Mki(l)} + 남음${ + u} + `,this.bannerSub.position.set(14,28),oki(this.bannerSub,h-28),this.bannerBar.clear(),vki(this.bannerBar,14,47,h-28,4,c?1:1-o/s.hp,c?qIi:13724671,3811904),this.banner.hitArea=new Ui(0,0,h,56)} + throwState(){ + var t; + const i=RIi.getInstance(),s=this.boss,e=i.harpoons(),n=KOi(e),h=n?e.stock[n]:0,r=jOi(i.state,s,`${ + i.state.spot.race} + |${ + i.state.spot.zone} + `),o=this.scene.bossShadow(TGi),a=i.realNow()-((null==(t=i.state.hunt)?void 0:t.lastThrow)??0)<OOi.CD_MS,c=this.throwing||this.scene.harpoonBusy?"투척 중":a?"재장전":i.boatProblem()?"수리 중":n?r<1?"장전 끝":o?o.near&&this.scene.captureHarpoonTarget(TGi)?"":o.seen?"더 가까이":"그림자 대기":"그림자 대기":"만들기"; + return{ + ok:!c,kind:n,have:h,left:r,why:c} + } + renderThrowBtn(){ + const t=RIi.getInstance(),i=this.boss; + if(this.throwBtn.visible=!(!i||this.gauge.visible||this.craft.visible||this.records.visible),!this.throwBtn.visible)return; + const s=CRi.BLEED_W,e=this.viewH(),n=40,h=this.throwState(); + this.throwBtn.position.set(s-16-80,e-150-80); + const r=h.ok?1+.04*Math.sin(performance.now()/160):1; + this.throwBtn.pivot.set(n,n),this.throwBtn.position.set(s-16-n,e-150-n),this.throwBtn.scale.set(r),this.throwBg.clear().circle(n,n,n).fill(h.ok?VIi:"만들기"===h.why?UIi:tki),this.throwText.text="만들기"===h.why?"작살 만들기":"작살",this.throwText.textColor=h.ok?jIi:"만들기"===h.why?KIi:iki,oki(this.throwText,72),this.throwText.position.set(n-this.throwText.width/2,22),this.throwSub.text=h.ok||"장전 끝"===h.why?`${ + kOi[h.kind].name.replace(" 작살","")} + ${ + h.have} + · ${ + h.left} + /${ + FOi(t.state.gear.boat)} + `:"만들기"===h.why?"물고기로":h.why,this.throwSub.textColor=h.ok?jIi:zIi,oki(this.throwSub,72),this.throwSub.position.set(n-this.throwSub.width/2,44),this.throwBtn.hitArea=new Ui(0,0,80,80)} + closeGauge(){ + this.gaugeOn=!1,this.aimId=null,this.gauge.close(),this.aimTarget=null,this.scene.setAimMark(null),cancelAnimationFrame(this.gaugeFrame),this.gaugeFrame=0} + async openGauge(){ + var t; + const i=RIi.getInstance(); + if(!this.boss||this.preparing||this.throwing||this.gauge.visible||this.scene.harpoonBusy)return; + const s=this.throwState(); + if(!s.ok)return void vH.getInstance().showMessage("재장전"===s.why?"작살을 다시 준비하고 있어요":"수리 중"===s.why?"배를 고치는 중엔 작살을 던질 수 없어요":"장전 끝"===s.why?`이번 몬스터에는 ${ + FOi(i.state.gear.boat)} + 개까지 던질 수 있어요 (장전 칸)`:"그림자가 배 가까이 지날 때 던질 수 있어요"); + let e=performance.now(),n=YOi(i.gearStats().aim),h=s.kind; + if(null==(t=i.social)?void 0:t.enabled){ + const t=this.generation,s=this.contextKey; + this.preparing=!0; + try{ + const r=await i.prepareHuntAim(); + if(this.destroyed||t!==this.generation||s!==this.contextKey||!this.boss)return; + if(r.message||!r.aim)return void vH.getInstance().showMessage(r.message??"다시 조준해 주세요"); + this.aimId=r.aim.id,e=r.startPerf,n=r.aim.range,h=r.aim.kind,this.aimStartPerf=e,this.aimEndPerf=e+r.aim.expiresAt-r.aim.startAt} + catch{ + return void vH.getInstance().showMessage("조준을 준비하지 못했어요. 다시 눌러 주세요")} + finally{ + this.preparing=!1} + } + this.gaugeOn=!0,this.gauge.open(h,this.boss.name,CRi.BLEED_W,this.viewH(),e,n),this.throwBtn.visible=!1,jG("light"),this.tickGauge()} + async stopGauge(){ + var t; + if(!this.gaugeOn||this.throwing||!this.boss)return; + if(this.aimId&&performance.now()<this.aimStartPerf)return; + const i=RIi.getInstance(),s=this.boss,e=this.throwState(),n=((null==(t=this.aimTarget)?void 0:t.sample())?this.aimTarget:null)??this.scene.captureHarpoonTarget(TGi); + this.aimTarget=n,this.gaugeOn=!1; + const h=GOi(i.state.spot,i.realNow(),i.state.huntDevAt); + if(!e.ok||!n||(null==h?void 0:h.w)!==s.w)return this.closeGauge(),this.renderThrowBtn(),void vH.getInstance().showMessage(n?"지금은 작살을 던질 수 없어요":"그림자가 멀어졌어요. 가까이 오면 다시 조준해요"); + const r=qOi(this.gauge.value,this.gauge.range),o=this.generation,a=this.contextKey,c=`${ + i.state.spot.race} + |${ + i.state.spot.zone} + `,l=Qt(()=>!this.destroyed&&o===this.generation&&a===this.contextKey&&c===`${ + i.state.spot.race} + |${ + i.state.spot.zone} + `,"current"); + this.throwing=!0,this.statusRevision++,this.gauge.freeze(r),jG("light"); + try{ + const t=this.aimId?await i.huntShot(this.aimId):await i.huntThrow(r); + if(!l())return; + if(t.message||!t.result)return this.closeGauge(),void vH.getInstance().showMessage(t.message??"작살을 던지지 못했어요"); + const h=t.result,o=h.dmg<=0?"miss":h.grade??r,a=h.kind??e.kind??"wood",c="mithril"===a?2:"iron"===a?1:0; + if(!(await this.gauge.finish(o))||!l())return; + let u; + this.closeGauge(); + const d=new Promise(t=>{ + u=t} + ),f=this.scene.harpoonStrike(a,o,h.dmg,n,{ + release:Qt(()=>{ + l()&&AGi(qG.SFX_ARCHERY_FIRE_ARROW,.3+.08*c)} + ,"release"),impact:Qt(()=>{ + u(),l()&&(this.statusRevision++,this.status={ + w:s.w,total:h.total,n:h.n} + ,this.statusAt=performance.now(),this.renderBanner(),jG("miss"===o?"light":"perfect"===o&&c>0?"heavy":c>0?"medium":"light"),AGi("miss"===o?qG.SFX_BATTLE_BOW_ATTACK2:qG.SFX_ARCHERY_HIT_ON_TARGET,"miss"===o?.36:.42+.1*c+("perfect"===o?.08:0)),h.killed&&h.total-h.dmg<h.hp&&(vH.getInstance().showMessage(`${ + h.name} + 사냥 성공! 결과는 몬스터가 지나간 뒤에 받아요`),AGi(qG.SFX_TRUMPET,.5)))} + ,"impact")} + ); + await Promise.race([d,f])} + catch{ + l()&&(this.closeGauge(),vH.getInstance().showMessage("투척 결과를 확인하지 못했어요. 잠시 후 다시 확인해 주세요"))} + finally{ + this.throwing=!1,l()&&this.renderThrowBtn()} + } + showResult(t){ + const i=CRi.BLEED_W,s=mki(t.killed?`${ + t.name} + 사냥 성공! 내 피해 ${ + t.my} + · 골드 +${ + t.gold.toLocaleString()} + · 진주 +${ + t.pearl} + `:`${ + SGi(t.name,"이","가")} + 달아났어요 · 모두의 피해 ${ + t.total} + /${ + t.hp} + (함께 ${ + t.n} + 명)`,t.killed?16777215:zIi,t.killed?3111503:2759472,14,12); + s.position.set((i-s.width)/2,this.viewH()-190),this.addChild(s),t.killed&&(AGi(qG.SFX_TRUMPET,.6),jG("heavy")),MR.fromTo(s,{ + alpha:0,y:s.y+10} + ,{ + alpha:1,y:s.y,duration:.25} + ),MR.to(s,{ + alpha:0,delay:5,duration:.6,onComplete:Qt(()=>s.destroy({ + children:!0} + ),"onComplete")} + )} + openRecords(){ + this.records.visible=!0,this.renderRecords(!0),MR.fromTo(this.records,{ + alpha:0} + ,{ + alpha:1,duration:.15} + )} + renderRecords(t){ + const i=RIi.getInstance(),s=i.state.hunt,e=(null==s?void 0:s.xp)??0,n=WOi(e),h=BOi(i.state.spot,i.realNow(),i.state.huntDevAt),r=`${ + e} + |${ + JSON.stringify((null==s?void 0:s.records)??{ + } + )} + |${ + (null==h?void 0:h.w)??"x"} + `; + if(!t&&r===this.recordsSig)return; + this.recordsSig=r; + const o=this.records; + o.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const a=CRi.BLEED_W,c=this.viewH(),l=Math.min(a-20,480),u=(a-l)/2,d=u+18,f=128+24*xOi.length+60,p=Math.max(10,c-f-8),g=aki(l,f,QIi,null,14); + g.alpha=.96,g.position.set(u,p); + const w=rki(`몬스터 헌터 · ${ + n.name} + `,VIi,17); + w.position.set(d,p+14); + const m=rki(`경험치 ${ + e} + ${ + n.next?` / 다음 등급 ${ + n.next} + `:" · 최고 등급"} + · 사냥에 성공하면 내가 준 피해만큼`,zIi,12,!1); + m.position.set(d,p+40),oki(m,l-36); + const v=i.realNow(),_=rki(h?h.at<=v?`지금 ${ + SGi(h.name,"이","가")} + 지나가는 중!`:`이 지역 다음 몬스터: ${ + h.name} + · ${ + Mki(h.at-v)} + 뒤`:"난이도 2 자리부터 몬스터가 지나가요",h&&h.at<=v?16757611:KIi,13); + _.position.set(d,p+62),oki(_,l-36); + const M=[d+200,d+250,d+300,d+360],b=[g,w,m,_],y=rki("몬스터",YIi,12,!1); + y.position.set(d,p+92),b.push(y),["목격","참가","성공","최고 기여"].forEach((t,i)=>{ + const s=rki(t,YIi,12,!1); + s.position.set(M[i]-s.width/2,p+92),b.push(s)} + ),xOi.forEach((t,i)=>{ + const e=null==s?void 0:s.records[t.name],n=p+116+24*i,h=rki(`${ + t.name} + (${ + pSi[t.zone]} + )`,(null==e?void 0:e.killed)?qIi:(null==e?void 0:e.seen)||(null==e?void 0:e.joined)?KIi:YIi,13,!!(null==e?void 0:e.killed)); + h.position.set(d,n),oki(h,170),b.push(h),[null==e?void 0:e.seen,null==e?void 0:e.joined,null==e?void 0:e.killed,null==e?void 0:e.best].forEach((t,i)=>{ + const s=rki(t?String(t):"-",(null==e?void 0:e.killed)?qIi:zIi,13,!1); + s.position.set(M[i]-s.width/2,n),b.push(s)} + )} + ); + const E=new pki("닫기",96,40,14); + E.setPrimary(!1),E.position.set(u+l-18-96,p+f-52),E.onTap=()=>{ + this.records.visible=!1} + ; + const A=new pki("작살 만들기",140,40,14); + A.position.set(E.x-8-140,E.y),A.onTap=()=>this.openCraft(),b.push(E,A),o.hitArea=new Ui(0,0,a,c),o.removeAllListeners("pointertap"),o.on("pointertap",t=>{ + t.stopPropagation(),o.toLocal(t.global).y<p&&(this.records.visible=!1)} + ),o.addChild(...b)} + openCraft(){ + this.records.visible=!1,this.craft.visible=!0,this.craftSig="",this.renderCraft(),MR.fromTo(this.craft,{ + alpha:0} + ,{ + alpha:1,duration:.15} + )} + static fishFor(t){ + const i=RIi.getInstance(); + return i.netGroups().filter(s=>kSi(s.id).star>=t&&!i.isQuestFish(s)).reduce((t,i)=>t+i.count,0)} + renderCraft(){ + const i=RIi.getInstance(),s=i.harpoons(),e=`${ + JSON.stringify(s)} + |${ + i.state.gold} + |${ + t.fishFor(1)} + |${ + t.fishFor(2)} + |${ + t.fishFor(3)} + `; + if(e===this.craftSig)return; + this.craftSig=e; + const n=this.craft; + n.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const h=CRi.BLEED_W,r=this.viewH(),o=Math.min(h-20,480),a=(h-o)/2,c=a+18,l=84+92*IOi.length+60,u=r-l-8,d=aki(o,l,QIi,null,14); + d.alpha=.96,d.position.set(a,u); + const f=rki("작살 만들기",VIi,17); + f.position.set(c,u+14); + const p=rki(`어망의 물고기(값싼 것부터 · 의뢰 물고기는 빼고) + 골드 · 몬스터 한 번에 ${ + FOi(i.state.gear.boat)} + 개까지 던져요`,zIi,12,!1); + p.position.set(c,u+40),oki(p,o-36); + const g=[d,f,p]; + IOi.forEach((e,n)=>{ + const h=kOi[e],r=u+70+92*n,l=s.use===e,d=t.fishFor(h.minStar),f=(new ip).roundRect(c-8,r,o-20,84,10).fill(l?BIi:GIi),p=rki(`${ + h.name} + · 피해 ×${ + h.mult} + · ${ + s.stock[e]} + 개`,l?VIi:KIi,15); + p.position.set(c+4,r+8); + const w=rki(`★${ + h.minStar} + 이상 물고기 ${ + h.fish} + 마리 + ${ + h.gold.toLocaleString()} + 골드 (맞는 물고기 ${ + d} + 마리)`,d>=h.fish?zIi:XIi,12,!1); + w.position.set(c+4,r+32),oki(w,o-60),g.push(f,p,w); + const m=new pki("1개",64,32,13),v=new pki("5개",64,32,13),_=new pki(l?"던질 작살":"이걸 던지기",104,32,13); + _.setPrimary(!1),_.enabled=!l,m.position.set(c+4,r+52),v.position.set(c+74,r+52),_.position.set(a+o-24-104,r+52),m.enabled=d>=h.fish&&i.state.gold>=h.gold,v.enabled=d>=5*h.fish&&i.state.gold>=5*h.gold,m.onTap=()=>{ + this.make(e,1)} + ,v.onTap=()=>{ + this.make(e,5)} + ,_.onTap=async()=>{ + const t=await i.huntUse(e); + t&&vH.getInstance().showMessage(t),this.craftSig="",this.renderCraft()} + ,g.push(m,v,_)} + ); + const w=new pki("닫기",96,40,14); + w.setPrimary(!1),w.position.set(a+o-18-96,u+l-52),w.onTap=()=>{ + this.craft.visible=!1} + ,g.push(w),n.hitArea=new Ui(0,0,h,r),n.removeAllListeners("pointertap"),n.on("pointertap",t=>{ + t.stopPropagation(),n.toLocal(t.global).y<u&&(this.craft.visible=!1)} + ),n.addChild(...g)} + async make(t,i){ + if(this.crafting)return; + this.crafting=!0; + const s=await RIi.getInstance().huntCraft(t,i).finally(()=>{ + this.crafting=!1} + ); + if(s.message||!s.result)return void vH.getInstance().showMessage(s.message??"작살을 만들지 못했어요"); + const e=s.result.used.map(t=>`${ + kSi(t.id).name} + ${ + t.count} + `).join(" · "); + vH.getInstance().showMessage(`${ + kOi[t].name} + ${ + i} + 개를 만들었어요 (${ + e} + )`),jG("light"),AGi(qG.SFX_STONE_BREAK,.4),this.craftSig="",this.renderCraft()} + layout(){ + this.chipKey="",this.recordsSig="",this.craftSig="",this.gaugeOn?this.closeGauge():this.gauge.visible&&this.gauge.layout(CRi.BLEED_W,this.viewH())} + destroy(t){ + this.closeAll(),super.destroy(t)} + } + ; + Qt(OGi,"FishingHuntUi"),Zt(OGi,"rule",OOi); + let IGi=OGi; + const kGi=class t extends Ve{ + constructor(i){ + super(),Zt(this,"active",!1),Zt(this,"rodHold",!0),Zt(this,"stepId","hello"),Zt(this,"lines",YCi("인간")),Zt(this,"captain",jCi("인간")),Zt(this,"clock",0),Zt(this,"timers",[]),Zt(this,"wantTap",!1),Zt(this,"dim",new Ve),Zt(this,"dimHole",new Ye(t.holeTexture())),Zt(this,"dimRest",new ip),Zt(this,"dimTarget",null),Zt(this,"flash",new ip),Zt(this,"flashUntil",0),Zt(this,"flashOn",!1),Zt(this,"hand",new Ve),Zt(this,"handArt",new ip),Zt(this,"handTarget",null),Zt(this,"taps",new Ve),Zt(this,"prog",new Ve),Zt(this,"chips",[]),Zt(this,"skip",new Ve),Zt(this,"skipBg",new ip),Zt(this,"skipText",rki("건너뛰기",zIi,12)),Zt(this,"talk",new Ve),Zt(this,"talkBg",new ip),Zt(this,"faceBg",new ip),Zt(this,"faceMask",new ip),Zt(this,"face",new Ye(as.EMPTY)),Zt(this,"who",rki("",VIi,14)),Zt(this,"say",rki("",KIi,15.5)),Zt(this,"more",rki("▼",VIi,13)),Zt(this,"go",new Ve),Zt(this,"goBg",new ip),Zt(this,"goText",rki("시작 포인트로 이동",jIi,16)),Zt(this,"talkTop",!1),Zt(this,"typing",null),Zt(this,"onGo",null),Zt(this,"idle",new Ve),Zt(this,"ring",null),Zt(this,"seaPoint",null),Zt(this,"fishId",0),Zt(this,"finished",!1),Zt(this,"progH",0),Zt(this,"progAt",0),Zt(this,"seaSailing",!1),Zt(this,"waitingBite",!1),Zt(this,"lastNow",performance.now()),Zt(this,"moreY",0),Zt(this,"talkLayout",{ + x:0,y:0,w:0,h:0,padL:0,narrow:!1,size:15.5} + ),Zt(this,"button",null),Zt(this,"withMore",!1),this.host=i,this.visible=!1,this.eventMode="static",this.dim.eventMode=this.flash.eventMode=this.hand.eventMode=this.taps.eventMode=this.idle.eventMode=this.prog.eventMode="none",this.dimHole.anchor.set(.5),this.dim.addChild(this.dimHole,this.dimRest),this.dim.visible=!1,this.flash.blendMode="add",this.handArt.svg('<svg viewBox="0 0 64 64"><path d="M23 5c3.3 0 5.5 2.4 5.5 5.6v16.6l1.9-.9c2.3-1 5 0 6.1 2.2l.4.9 1.7-.7c2.3-.9 4.9.2 5.9 2.4l.4.9.9-.2c3-.5 5.7 1.8 5.7 4.8v9.2C51.5 54.1 44 61 35.3 61h-4.2c-6.3 0-12-3.4-15-8.9l-6.4-11.6c-1.2-2.2-.4-5 1.8-6.2 2-1.1 4.5-.6 5.9 1.2l2.1 2.7V10.6C17.5 7.4 19.7 5 23 5z" fill="#ffffff" stroke="#1b1b1d" stroke-width="3" stroke-linejoin="round"/><path d="M28.5 27v12M36.8 29.5V40M45 32.6V41" stroke="#1b1b1d" stroke-width="2.4" stroke-linecap="round" fill="none"/></svg>'),this.hand.addChild(this.handArt),this.hand.visible=!1,this.skip.addChild(this.skipBg,this.skipText),this.skip.eventMode="static",this.skip.cursor="pointer",this.skip.on("pointertap",t=>{ + t.stopPropagation(),this.skipToEnd()} + ),this.faceBg.eventMode=this.faceMask.eventMode="none",this.face.mask=this.faceMask,this.go.addChild(this.goBg,this.goText),this.go.eventMode="static",this.go.cursor="pointer",this.go.on("pointertap",t=>{ + t.stopPropagation(); + const i=this.onGo; + this.onGo=null,null==i||i()} + ),this.talkBg.eventMode="none",this.talk.addChild(this.talkBg,this.faceBg,this.face,this.faceMask,this.who,this.say,this.more,this.go),this.talk.visible=!1,this.addChild(this.dim,this.flash,this.idle,this.prog,this.skip,this.talk,this.hand,this.taps),this.on("pointerdown",t=>this.onDown(t))} + get k(){ + return this.host.W()/370} + start(t){ + this.active=!0,this.finished=!1,this.visible=!0,this.eventMode="static",MR.killTweensOf(this),this.alpha=1,this.clock=0,this.timers=[],this.lastNow=performance.now(),this.lines=YCi(t),this.captain=jCi(t),this.rodHold=!0,this.ring=this.seaPoint=null,this.face.texture=nAi.gear().journeyNpcs[this.captain.art]??as.EMPTY,this.who.text=this.captain.name,this.talkTop=!1,this.host.scene.tutorialRingScale=this.k,this.host.scene.tutorialLift=this.host.lift(),this.host.scene.setTutorial(!0),this.layout(),vn.shared.remove(this.tick,this),vn.shared.add(this.tick,this),this.run("hello")} + stop(){ + this.active&&(this.active=!1,this.visible=!1,vn.shared.remove(this.tick,this),this.timers=[],this.typing=null,this.host.scene.setTutorial(!1))} + layout(){ + const t=this.host.W(),i=this.host.H(),s=this.k; + this.hitArea=new Ui(0,0,t,i),this.skipText.textSize=Math.round(12*s); + const e=this.skipText.width+20*s,n=this.skipText.height+12*s; + if(this.skipBg.clear().roundRect(0,0,e,n,8*s).fill({ + color:921104,alpha:.72} + ),this.skipText.position.set(10*s,6*s),this.skip.position.set(t-14*s-e,14*s),this.skip.hitArea=new Ui(-6*s,-6*s,e+12*s,n+12*s),!this.chips.length)for(const c of FCi){ + const t=new ip,i=rki(c,YIi,11.5); + this.prog.addChild(t,i),this.chips.push({ + bg:t,text:i} + )} + const h=14*s,r=this.skip.x-8*s,o=5*s,a=(r-h-3*o)/4; + this.chips.forEach((t,i)=>{ + t.text.textSize=Math.round(11.5*s),t.text.scale.set(Math.min(1,(a-10*s)/Math.max(1,t.text.width/t.text.scale.x))),t.bg.position.set(h+i*(a+o),14*s),t.bg.label=String(a)} + ),this.progH=n,this.drawProg(),this.drawTalk(),this.idle.visible&&this.buildIdle()} + drawProg(){ + const t=this.k; + this.chips.forEach((i,s)=>{ + const e=Number(i.bg.label),n=s===this.progAt,h=s<this.progAt; + i.bg.clear().roundRect(0,0,e,this.progH,8*t).fill(n?{ + color:VIi,alpha:1} + :h?{ + color:4013377,alpha:.9} + :{ + color:921104,alpha:.72} + ),i.text.textColor=n?jIi:h?KIi:YIi,i.text.position.set(i.bg.x+(e-i.text.width)/2,i.bg.y+(this.progH-i.text.height)/2)} + )} + run(t){ + const i=HCi(t); + switch(this.stepId=t,this.wantTap=!1,this.progAt=i.prog,this.drawProg(),this.spot(null),this.point(null),"idle"!==t&&(this.idle.visible=!1),"movebtn"===t&&(this.talkTop=!0),i.kind){ + case"talk":return"idle"===t&&(this.buildIdle(),this.idle.visible=!0,MR.fromTo(this.idle,{ + alpha:0} + ,{ + alpha:1,duration:.3} + )),void this.speak(this.lines[t],{ + more:!0,onDone:Qt(()=>{ + this.wantTap=!0} + ,"onDone")} + ); + case"goal":{ + const t=this.host.scene,i=this.k; + return this.ring=t.tutorialSpot([-45,-20,-70,0,-100,20,-135,45,180,90,135,-160],150,230,14*i+this.progH,150*i)??t.tutorialSpot([-45,0,-90,45,-135,90,135,180,-20,-70,20,70],90,150,14*i+this.progH,150*i),this.ring?(t.tutorialRing=this.ring,void this.speak(this.lines.goal,{ + onDone:Qt(()=>{ + const i=this.ring; + i&&(this.spot(()=>({ + p:this.toLocalOf(t.worldToGlobal(i.x,i.y)),r:46*this.k} + )),this.point(()=>this.toLocalOf(t.worldToGlobal(i.x,i.y))),this.wantTap=!0)} + ,"onDone")} + )):(this.rodHold=!1,void this.run("rod"))} + case"wait":return void this.speak(this.lines[t],{ + } + ); + case"rod":return this.rodHold=!1,void this.speak(this.lines.rod,{ + } + ); + case"bite":return this.speak(this.lines.bite,{ + } + ),this.point(()=>{ + const t=this.host.biteGlobal(); + return t?this.toLocalOf(t):null} + ),this.flashUntil=this.clock+3300,this.wantTap=!0,void jG("medium"); + case"btn":{ + const t=this.host.scene,i=t.modeButton; + return t.tutorialMoveBtn=!0,MR.fromTo(i.scale,{ + x:.3,y:.3} + ,{ + x:1,y:1,duration:.35,ease:"back.out(3)"} + ),void this.speak(this.lines.movebtn,{ + onDone:Qt(()=>{ + const t=Qt(()=>{ + const t=i.getBounds(); + return this.toLocalOf({ + x:t.x+t.width/2,y:t.y+t.height/2} + )} + ,"at"); + this.spot(()=>({ + p:t(),r:44*this.k} + )),this.point(t),this.wantTap=!0} + ,"onDone")} + )} + case"sea":{ + const t=this.host.scene,i=this.k; + return this.rodHold=!0,void this.speak(this.lines.sea,{ + onDone:Qt(()=>{ + this.seaPoint=t.tutorialSpot([-135,-110,-160,180,-90,160,135,110,90,-45,0,45],120,190,this.talkBottom()+10*i,90*i)??t.tutorialSpot([-135,-90,180,135,90,45,0,-45],90,150,this.talkBottom()+10*i,90*i); + const s=this.seaPoint; + s&&this.point(()=>this.toLocalOf(t.worldToGlobal(s.x,s.y))),this.wantTap=!0} + ,"onDone")} + )} + case"end":return void this.speak(this.lines.end,{ + button:"시작 포인트로 이동",onButton:Qt(()=>this.finish(),"onButton")} + )} + } + next(){ + const t="hooked"===this.stepId||"missed"===this.stepId?null:$Ci(this.stepId); + t&&this.run(t)} + skipToEnd(){ + if(this.finished)return; + const t=this.host.scene; + t.tutorialRing=null,this.ring=this.seaPoint=null,WDi.dismiss(!0),this.timers=[],this.talkTop=t.tutorialMoveBtn,this.run("end")} + finish(){ + this.finished||(this.finished=!0,this.wantTap=!1,this.spot(null),this.point(null),this.host.backend().finish(),jG("light"),this.active=!1,this.eventMode="none",vn.shared.remove(this.tick,this),this.timers=[],this.typing=null,this.host.scene.setTutorial(!1),MR.to(this,{ + alpha:0,duration:.6,onComplete:Qt(()=>{ + this.active||(this.visible=!1)} + ,"onComplete")} + ),this.host.onFinish(this.captain.id))} + onCatch(t,i,s){ + this.active&&"hooked"===this.stepId&&(this.fishId=t.id,this.lines=YCi(this.host.race(),kSi(t.id).name),this.later(1e3*s+(i?2800:900),()=>this.run("caught")))} + onDown(t){ + if(t.target!==this||!this.active||this.finished)return; + const i=this.toLocal(t.global),s=this.k; + this.tapRing(i); + const e=this.stepId,n="hooked"===e||"missed"===e?null:HCi(e); + if(this.typing&&(this.typing.shown=1/0,!n||"talk"===n.kind||!this.wantTap))return; + if(!n)return; + if("talk"===n.kind){ + if(!this.wantTap)return; + return"caught"===e&&WDi.dismiss(),void this.next()} + if(!this.wantTap)return; + const h=this.host.scene; + if("goal"===n.kind&&this.ring){ + const t=this.toLocalOf(h.worldToGlobal(this.ring.x,this.ring.y)); + if(Math.hypot(i.x-t.x,i.y-t.y)>50*s)return; + const e=this.ring; + if(this.ring=null,h.tutorialRing=null,!h.tutorialSail(e.x,e.y))return this.rodHold=!1,void this.run("rod"); + jG("light"),this.run("sailing")} + else if("rod"===n.kind){ + const t=h.rodBalloonCenter; + if(!t)return; + const e=this.toLocalOf(h.worldToGlobal(t.x,t.y)); + if(Math.hypot(i.x-e.x,i.y-e.y)>48*s)return; + if(!h.tutorialTapRod())return; + jG("light"),this.wantTap=!1,this.spot(null),this.point(null),this.later(650,()=>this.run("wait"))} + else if("bite"===n.kind){ + if(!this.host.backend().hookable())return; + this.hook()} + else if("btn"===n.kind){ + const t=h.modeButton.getBounds(),e=this.toLocalOf({ + x:t.x+t.width/2,y:t.y+t.height/2} + ); + if(Math.abs(i.x-e.x)>t.width/2+14*s||Math.abs(i.y-e.y)>t.height/2+14*s)return; + h.tutorialModeTap(),jG("light"),this.run("sea")} + else if("sea"===n.kind){ + const t=h.globalToWorld(this.toGlobal(i)); + if(!h.tutorialSail(t.x,t.y))return; + jG("light"),this.wantTap=!1,this.point(null),this.talk.visible=!1,this.stepId="sea",this.seaSailing=!0} + } + hook(){ + this.stepId="hooked",this.wantTap=!1,this.point(null),this.spot(null),this.talk.visible=!1,this.flashUntil=0,this.host.backend().hook().then(t=>{ + t&&this.active&&"hooked"===this.stepId&&(this.stepId="missed",this.speak(this.lines.missed,{ + } + ),this.later(900,()=>{ + this.host.backend().recast(),this.waitBite()} + ))} + )} + missed(){ + this.stepId="missed",this.wantTap=!1,this.point(null),this.flashUntil=0,this.speak(this.lines.missed,{ + } + ),this.later(900,()=>{ + this.host.backend().recast(),this.waitBite()} + )} + waitBite(){ + this.waitingBite=!0} + tick(){ + if(!this.active)return; + const i=performance.now(),s=Math.min(1e3,i-this.lastNow)*t.speed; + if(this.lastNow=i,this.clock+=s,this.timers.length){ + const t=this.timers.filter(t=>t.at<=this.clock); + this.timers=this.timers.filter(t=>t.at>this.clock); + for(const i of t)i.fn()} + const e=this.typing; + if(e){ + const t=Math.min(e.chars.length,e.shown===1/0?e.chars.length:XCi(e.chars.join(""),this.clock-e.t0)); + if(t!==e.drawn&&(e.drawn=t,this.say.text=e.chars.slice(0,t).join("")),t>=e.chars.length){ + this.typing=null; + const t=e.onDone; + this.finishTalk(),null==t||t()} + } + const n=this.host.scene,h=this.host.backend(),r=this.stepId; + if("sailing"===r&&!n.moving&&n.idleInSail)this.run("rod"); + else if("rod"!==r||!n.rodShown||this.wantTap||this.typing)"wait"===r&&h.biteOpen()?this.run("bite"):"missed"===r&&this.waitingBite&&h.biteOpen()?(this.waitingBite=!1,this.run("bite")):"bite"!==r||h.biteOpen()||h.hookable()?"sea"===r&&this.seaSailing&&!n.moving&&(this.seaSailing=!1,this.talk.visible=!1,this.later(900,()=>this.run("done"))):this.missed(); + else{ + const t=Qt(()=>{ + const t=n.rodBalloonCenter; + return t?this.toLocalOf(n.worldToGlobal(t.x,t.y)):null} + ,"at"); + this.spot(()=>{ + const i=t(); + return i?{ + p:i,r:40*this.k} + :null} + ),this.point(t),this.wantTap=!0} + this.drawDim(),this.drawHand(),this.drawFlash(),this.more.visible&&(this.more.y=this.moreY+1.5*Math.sin(this.clock/1e3*Math.PI*2)*this.k); + for(const t of[...this.taps.children]){ + const i=Math.min(1,(this.clock-(t.t0??0))/550),s=this.k; + t.clear().circle(t.p.x,t.p.y,(8+20*(1-(1-i)*(1-i)))*s).stroke({ + color:16777215,width:3*s,alpha:1-i} + ),i>=1&&t.destroy()} + } + later(t,i){ + this.timers.push({ + at:this.clock+t,fn:i} + )} + talkBottom(){ + return this.talkTop?this.talkLayout.y+this.talkLayout.h:this.progH+14*this.k} + speak(t,i){ + const s=this.k,e=this.host.W()-24*s,n=Qt(t=>({ + ...this.say.getStyle(),fontSize:t*s,lineHeight:Math.round(t*s*1.5)} + ),"style"),h=Qt(t=>e-(t?72:94)*s-16*s,"wrapW"),r=Qt((i,s)=>sD.wrapTextCJK(t,n(i),h(s)),"wrap"),o=iOi((t,i)=>r(t,i).split("\n").length),a=r(o.size,o.narrow); + this.say.setWrapWidth(0),this.say.setStyle(n(o.size)),this.say.textColor=KIi,this.talkLayout={ + ...this.talkLayout,narrow:o.narrow,size:o.size} + ,this.say.text=a,this.button=i.button??null,this.goText.text=i.button??"",this.onGo=i.onButton??null,this.withMore=!!i.more,this.drawTalk(),this.say.text="",this.more.visible=!1,this.go.visible=!1,this.talk.visible=!0,this.typing={ + chars:[...a],t0:this.clock,shown:0,drawn:0,onDone:i.onDone} + } + finishTalk(){ + this.more.visible=this.withMore,this.go.visible=!!this.button} + drawTalk(){ + const t=this.k,i=this.host.W(),s=this.host.H(),e=this.talkLayout,n=12*t,h=i-24*t,r=(e.narrow?72:94)*t; + this.who.textSize=Math.round(14*t); + const o=this.say.height,a=this.button?10*t+48*t:0,c=Math.max(112*t,14*t+this.who.height+4*t+o+a+14*t),l=this.talkTop?14*t+this.progH+10*t:s-14*t-c; + this.talkLayout={ + ...e,x:n,y:l,w:h,h:c,padL:r} + ,this.talkBg.clear().roundRect(n,l,h,c,18*t).fill({ + color:921104,alpha:.95} + ); + const u=(e.narrow?52:72)*t,d=(e.narrow?66:88)*t,f=n+12*t,p=l+12*t; + this.faceBg.clear().roundRect(f,p,u,d,12*t).fill(2894894),this.faceMask.clear().roundRect(f,p,u,d,12*t).fill(16777215); + const g=(e.narrow?76:104)*t; + if(this.face.width=this.face.height=g,this.face.position.set(f-(e.narrow?8:10)*t,p+1*t),this.who.position.set(n+r,l+14*t),this.say.position.set(n+r,this.who.y+this.who.height+4*t),this.more.textSize=Math.round(13*t),this.moreY=l+c-10*t-this.more.height,this.more.position.set(n+h-14*t-this.more.width,this.moreY),this.button){ + const i=h-r-16*t,s=this.say.y+o+10*t; + this.goText.textSize=Math.round(16*t),this.goBg.clear().roundRect(0,0,i,48*t,12*t).fill(VIi),this.goText.position.set((i-this.goText.width)/2,(48*t-this.goText.height)/2),this.go.position.set(n+r,s),this.go.hitArea=new Ui(0,0,i,48*t)} + } + buildIdle(){ + const t=this.k,i=this.host.W(),s=this.host.H(),e=nAi.gear(); + this.idle.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const n=22*t,h=i-44*t,r=46*t,o=16*t,a=o+2*r+12*t,c=Math.max(this.talkBottom()+14*t,.24*s),l=(new ip).roundRect(n,c,h,a,18*t).fill({ + color:921104,alpha:.95} + ).rect(n+o,c+o+r,h-2*o,1).fill(WIi); + this.idle.addChild(l),[["그냥 두면","자동으로",2,KIi],["눌러 주면","느낌표 때",1,VIi]].forEach(([i,s,a,l],u)=>{ + const d=c+o+r*u+r/2,f=rki(i,l,Math.round(14*t)),p=rki(s,zIi,Math.round(11.5*t)); + f.position.set(n+o,d-(f.height+p.height+2*t)/2),p.position.set(n+o,f.y+f.height+2*t),this.idle.addChild(f,p); + const g=n+o+74*t+8*t; + for(let n=0; + n<a; + n++){ + const i=new Ye(e.bubbles[0]); + i.width=i.height=30*t,i.position.set(g+32*n*t,d-15*t),this.idle.addChild(i)} + const w=rki("→",zIi,Math.round(16*t)),m=n+h-o-40*t; + w.position.set(m-8*t-18*t+(18*t-w.width)/2,d-w.height/2); + const v=new Ye(this.fishId?nAi.fish(this.fishId):as.EMPTY); + v.anchor.set(.5),v.scale.set(40*t/100),v.position.set(m+20*t,d),this.idle.addChild(w,v)} + )} + spot(t){ + this.dimTarget=t,t?(this.dim.visible=!0,MR.to(this.dim,{ + alpha:1,duration:.35} + )):MR.to(this.dim,{ + alpha:0,duration:.25,onComplete:Qt(()=>{ + this.dimTarget||(this.dim.visible=!1)} + ,"onComplete")} + )} + drawDim(){ + var t; + const i=null==(t=this.dimTarget)?void 0:t.call(this); + if(!i)return; + const s=this.host.W(),e=this.host.H(),n=i.r/100,h=256*n; + this.dimHole.scale.set(n),this.dimHole.position.set(i.p.x,i.p.y); + const r=i.p.x-h,o=i.p.x+h,a=i.p.y-h,c=i.p.y+h; + this.dimRest.clear().rect(0,0,s,Math.max(0,a)).rect(0,c,s,Math.max(0,e-c)).rect(0,Math.max(0,a),Math.max(0,r),Math.max(0,Math.min(e,c)-Math.max(0,a))).rect(o,Math.max(0,a),Math.max(0,s-o),Math.max(0,Math.min(e,c)-Math.max(0,a))).fill({ + color:0,alpha:.58} + )} + point(t){ + this.handTarget=t,this.hand.visible=!!t} + drawHand(){ + var t; + const i=null==(t=this.handTarget)?void 0:t.call(this); + if(!i)return void(this.hand.visible=!1); + const s=this.k,e=54*s,n=QCi(this.clock); + this.hand.visible=!0,this.handArt.scale.set(e/64); + const h=23/64*e,r=5/64*e,o=10*s; + this.hand.pivot.set(e/2,e/2),this.hand.position.set(i.x-h+e/2+n.dx*s,i.y+o-r+e/2+n.dy*s),this.hand.scale.set(n.scale)} + drawFlash(){ + const t=this.flashUntil-this.clock; + if(t<=0)return void(this.flashOn&&(this.flash.clear(),this.flashOn=!1)); + this.flashOn=!0,this.flash.clear(); + const i=.06*Math.sin((3300-t)/1100*Math.PI)**2; + this.flash.rect(0,0,this.host.W(),this.host.H()).fill({ + color:16777215,alpha:i} + )} + tapRing(t){ + const i=new ip; + i.t0=this.clock,i.p=t,this.taps.addChild(i)} + toLocalOf(t){ + return this.toLocal(t)} + static holeTexture(){ + if(this.hole)return this.hole; + const t=document.createElement("canvas"); + t.width=t.height=512; + const i=t.getContext("2d"),s=i.createRadialGradient(256,256,100,256,256,156); + return s.addColorStop(0,"rgba(0,0,0,0)"),s.addColorStop(1,"rgba(0,0,0,0.58)"),i.fillStyle=s,i.fillRect(0,0,512,512),this.hole=as.from(t)} + } + ; + Qt(kGi,"FishingTutorial"),Zt(kGi,"speed",1),Zt(kGi,"hole",null); + let RGi=kGi; + const xGi=[9,15,21,3],PGi=Qt(t=>String(t).padStart(2,"0"),"pad"); + function NGi(t){ + const i=PSi(t),s=NSi(t),e=(xGi[i]+6*(1-s/xSi))%24,n=Math.floor(e),h=Math.min(59,Math.floor(60*(e-n))); + return{ + tide:i,hour:e,text:`${ + PGi(n)} + :${ + PGi(h)} + `,left:s} + } + Qt(NGi,"gameClock"); + const LGi=Qt(t=>(t-12)/24*Math.PI*2,"dialAngle"),DGi=Qt(t=>[LGi(xGi[t]),LGi(xGi[t]+6)],"phaseArc"); + function GGi(t){ + const i=[]; + for(const s of t){ + const t=i.find(t=>t.id===s.id); + t?t.who.push({ + name:s.name,have:s.have,need:s.need} + ):i.push({ + id:s.id,who:[{ + name:s.name,have:s.have,need:s.need} + ]} + )} + return i} + function BGi(t,i,s){ + const e=DSi(s),n=t.race===i.race&&t.zone===i.zone&&BSi(t,i.point,e),h=t.depth===i.depth,r="전체"===t.tide||wSi[PSi(s)]===t.tide,o=!!t.roam; + let a=null; + return o||n||(a=t.pts.reduce((t,s)=>Math.abs(s-i.point)<Math.abs(t-i.point)?s:t,t.pts[0])),{ + here:n&&h&&r,placeOk:n,depthOk:h,tideOk:r,roam:o,near:a,tideWait:r?0:LSi(s,wSi.indexOf(t.tide))} + } + function UGi(t,i){ + if(!t||"fish"!==t.kind||!t.id)return null; + const s=kSi(t.id).depth; + return s===i.depth?null:s} + function FGi(t,i,s,e,n){ + const h=RIi.getInstance(),r=BGi(t,i,s),o=new Ve,a=vSi[`${ + t.race} + |${ + t.zone} + `],c=r.roam?`${ + a} + · 날마다 바뀌는 곳 (회유)`:t.pts.length>=9?`${ + a} + 어디서나`:`${ + a} + · ${ + t.pts.slice(0,2).map(i=>RSi(t.race,t.zone,i)).join(", ")} + ${ + t.pts.length>2?` 외 ${ + t.pts.length-2} + 곳`:""} + `,l="전체"===t.tide?"모든 시간대":`${ + mSi[wSi.indexOf(t.tide)]} + 에만`,u=mSi[NGi(s).tide],d=[{ + k:"서식지",v:c,ok:r.placeOk,okText:"✓ 여기",act:null!==r.near?{ + text:"가기",go:!0,run:Qt(()=>h.goTo({ + race:t.race,zone:t.zone,point:r.near,depth:t.depth} + ),"run")} + :void 0} + ,{ + k:"깊이",v:gSi[t.depth],ok:r.depthOk,okText:"✓ 지금 깊이",act:{ + text:"맞추기",go:!1,run:Qt(()=>h.setDepth(t.depth),"run")} + } + ,{ + k:"시간대",v:l,ok:r.tideOk,okText:`✓ 지금 ${ + u} + `,wait:r.tideOk?void 0:`${ + mSi[wSi.indexOf(t.tide)]} + 까지 ${ + Mki(r.tideWait)} + `} + ]; + let f=0; + for(const g of d){ + const t=rki(g.k,zIi,12),i=rki(g.v,KIi,13); + t.position.set(0,f+6),i.position.set(54,f+5); + let s=e; + if(g.ok){ + const t=rki(g.okText,qIi,12); + t.position.set(e-t.width,f+6),s=t.x-8,o.addChild(t)} + else if(g.act){ + const t=new pki(g.act.text,64,28,12); + t.position.set(e-64,f+1),s=t.x-8; + const{ + run:i,go:h} + =g.act; + t.onTap=async()=>{ + t.enabled=!1; + const s=await i(); + if(s)return vH.getInstance().showMessage(s),void(t.enabled=!0); + jG("light"),n(h)} + ,o.addChild(t)} + else if(g.wait){ + const t=rki(g.wait,zIi,11); + t.position.set(e-t.width,f+7),s=t.x-8,o.addChild(t)} + oki(i,s-i.x),o.addChild(t,i),f+=32} + const p=rki(r.here?"지금 여기서 잘 잡혀요!":"셋 다 맞으면 잘 잡혀요",r.here?qIi:zIi,11,!!r.here); + return p.position.set(0,f+4),o.addChild(p),{ + node:o,height:f+4+p.height} + } + Qt(GGi,"wantedFish"),Qt(BGi,"habitat"),Qt(UGi,"journeyDepth"),Qt(FGi,"habitatRows"); + const $Gi=[16106577,16748378,4876472,12034796],HGi=Qt(t=>t<=2?8378016:t<=4?16106577:t<=6?16757611:16751752,"levelColor"),WGi=class extends Ve{ + constructor(){ + super(),Zt(this,"band",new Ve),Zt(this,"bandBg",new ip),Zt(this,"clockSeg",new Ve),Zt(this,"dial",new ip),Zt(this,"dialIcon",new Ye(as.EMPTY)),Zt(this,"needle",new ip),Zt(this,"clockText",rki("",KIi,15)),Zt(this,"depthSeg",new Ve),Zt(this,"depthGlyph",new ip),Zt(this,"depthArrow",rki("▾",zIi,11)),Zt(this,"netSeg",new Ve),Zt(this,"netIcon",yki("keepnet",20,16777215)),Zt(this,"netText",rki("",KIi,13)),Zt(this,"seps",new ip),Zt(this,"place",new Ve),Zt(this,"placeBg",new ip),Zt(this,"badge",new ip),Zt(this,"badgeText",rki("",1056783,11)),Zt(this,"placeText",rki("",KIi,12)),Zt(this,"pop",new Ve),Zt(this,"strip",new Ve),Zt(this,"card",new Ve),Zt(this,"cardId",0),Zt(this,"onDepth",null),Zt(this,"onNet",null),Zt(this,"sig",""),Zt(this,"stripSig",""),Zt(this,"last",null),Zt(this,"bandY",19),Zt(this,"bandW",0),Zt(this,"popSig",""),Zt(this,"cardSig",""),this.bandBg.eventMode=this.dial.eventMode=this.needle.eventMode=this.depthGlyph.eventMode=this.seps.eventMode="none",this.dialIcon.eventMode="none",this.dialIcon.anchor.set(.5),this.clockSeg.addChild(this.dial,this.dialIcon,this.needle,this.clockText),this.depthSeg.addChild(this.depthGlyph,this.depthArrow),this.netSeg.addChild(this.netIcon,this.netText); + for(const[t,i]of[[this.clockSeg,()=>this.togglePop()],[this.depthSeg,()=>{ + var t; + return null==(t=this.onDepth)?void 0:t.call(this)} + ],[this.netSeg,()=>{ + var t; + return null==(t=this.onNet)?void 0:t.call(this)} + ]])t.eventMode="static",t.cursor="pointer",t.on("pointertap",t=>{ + t.stopPropagation(),i()} + ); + this.band.addChild(this.bandBg,this.seps,this.clockSeg,this.depthSeg,this.netSeg),this.band.position.set(10,10),this.placeBg.eventMode=this.badge.eventMode="none",this.place.addChild(this.placeBg,this.badge,this.badgeText,this.placeText),this.place.eventMode="none",this.place.position.set(10,59),this.pop.visible=!1,this.pop.eventMode="static",this.pop.on("pointertap",t=>{ + t.stopPropagation(),this.closePops()} + ),this.card.visible=!1,this.card.eventMode="static",this.card.on("pointertap",t=>t.stopPropagation()),this.strip.eventMode="static",this.addChild(this.band,this.place,this.strip,this.pop,this.card)} + get cardOpen(){ + return this.card.visible||this.pop.visible} + get bandRight(){ + return this.band.x+this.bandW} + closePops(){ + this.pop.visible=!1,this.card.visible=!1,this.cardId=0} + closeIfOutside(t){ + if(!this.cardOpen)return!1; + for(let i=t; + i; + i=i.parent)if(i===this.card||i===this.pop||i===this.strip||i===this.clockSeg)return!1; + return this.closePops(),!0} + update(t){ + this.last=t; + const i=NGi(t.now),s=QSi(t.spot),e=`${ + i.text} + |${ + i.tide} + |${ + t.spot.race} + |${ + t.spot.zone} + |${ + t.spot.point} + |${ + t.spot.depth} + |${ + t.net} + /${ + t.netCap} + |${ + t.problem??""} + `; + e!==this.sig&&(this.sig=e,this.drawBand(i.hour,i.tide,i.text,t),this.drawPlace(s,t)),this.pop.visible&&this.drawPop(),this.drawStrip(t),this.card.visible&&this.cardId&&this.drawCard(this.cardId)} + drawBand(t,i,s,e){ + const n=20,h=this.dial.clear(); + h.circle(n,n,19.5).fill({ + color:QIi,alpha:.65} + ); + for(let _=0; + _<4; + _++){ + const[t,s]=DGi(_),e=t+.07-Math.PI/2,r=s-.07-Math.PI/2; + h.moveTo(n+16*Math.cos(e),n+16*Math.sin(e)).arc(n,n,16,e,r).stroke({ + color:$Gi[_],width:_===i?4.5:3,alpha:_===i?1:.45,cap:"round"} + )} + const r=nAi.gear().times; + this.dialIcon.texture!==r[i]&&(this.dialIcon.texture=r[i]),this.dialIcon.width=this.dialIcon.height=24,this.dialIcon.position.set(n,n); + const o=LGi(t),a=n+13.5*Math.sin(o),c=n-13.5*Math.cos(o); + this.needle.clear().moveTo(n,n).lineTo(a,c).stroke({ + color:16777215,width:1.6,alpha:.9,cap:"round"} + ).circle(a,c,2.6).fill(16777215).circle(a,c,2.6).stroke({ + color:QIi,width:.8} + ),this.dial.position.set(0,0),this.dialIcon.x=n,this.needle.position.set(0,0),this.clockText.text=s,this.clockText.position.set(44,(44-this.clockText.height)/2-2); + const l=44+this.clockText.width+2; + this.clockSeg.position.set(2,2),this.clockSeg.hitArea=new Ui(-2,-2,l+6,44); + const u=this.depthGlyph.clear(),d=["S","M","B"].indexOf(e.spot.depth); + [3,9,15].forEach((t,i)=>u.roundRect(1,t,18,4.5,2.25).fill(i===d?8048872:3820114)),this.depthArrow.position.set(22,3); + const f=22+this.depthArrow.width,p=e.netCap?e.net/e.netCap:0,g=p>=1?XIi:p>=.8?16757611:KIi; + this.netIcon.tint=g,this.netText.text=`${ + e.net} + /${ + e.netCap} + `,this.netText.textColor=g,this.netText.position.set(24,1); + const w=24+this.netText.width; + let m=2+l+9; + const v=Qt(t=>this.seps.rect(t,13,1,18).fill({ + color:3815998} + ),"sep"); + this.seps.clear(),v(m),m+=10,this.depthSeg.position.set(m,11),this.depthSeg.hitArea=new Ui(-9,-11,f+18,44),m+=f+9,v(m),m+=10,this.netSeg.position.set(m,11),this.netSeg.hitArea=new Ui(-9,-11,w+18,44),m+=w+10,this.bandW=m,this.bandBg.clear().roundRect(0,0,m,44,12).fill({ + color:QIi,alpha:.8} + )} + drawPlace(t,i){ + const s=!!i.problem; + this.badge.visible=this.badgeText.visible=!s,s||(this.badge.clear().roundRect(0,0,18,18,6).fill(HGi(t)),this.badgeText.text=String(t),this.badgeText.position.set((18-this.badgeText.width)/2,(18-this.badgeText.height)/2)),this.placeText.text=s?i.problem:RSi(i.spot.race,i.spot.zone,i.spot.point),this.placeText.textColor=s?XIi:KIi,oki(this.placeText,250); + const e=s?8:24; + this.placeText.position.set(e,(18-this.placeText.height)/2),this.placeBg.clear().roundRect(-2,-3,e+this.placeText.width+9,24,8).fill({ + color:QIi,alpha:.55} + )} + togglePop(){ + this.card.visible=!1,this.cardId=0,this.pop.visible=!this.pop.visible,this.pop.visible&&(this.drawPop(),MR.fromTo(this.pop,{ + alpha:0} + ,{ + alpha:1,duration:.15} + ),jG("light"))} + drawPop(){ + const t=this.last; + if(!t)return; + const i=NGi(t.now),s=mSi[(i.tide+1)%4],e=QSi(t.spot),n=[`${ + mSi[i.tide]} + ${ + i.text} + · ${ + s} + 까지 ${ + Mki(i.left)} + `,`낚시꾼 ${ + t.crowd} + 명 · 난이도 ${ + e} + ${ + e<=1?" (초급 자리)":""} + `,"물때가 바뀌면 나오는 물고기도 바뀌어요"],h=n.join("|"); + if(h===this.popSig&&this.pop.children.length)return; + this.popSig=h,this.pop.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const r=new ip,o=n.map((t,i)=>rki(t,2===i?zIi:KIi,2===i?11:12,2!==i)); + let a=9,c=0; + for(const l of o)l.position.set(12,a),a+=l.height+4,c=Math.max(c,l.width); + r.roundRect(0,0,c+24,a+5,10).fill({ + color:QIi,alpha:.95} + ),this.pop.addChild(r,...o),this.pop.position.set(8,57),this.pop.hitArea=new Ui(0,0,c+24,a+5)} + stripCell(t=0){ + return this.strip.children.filter(t=>"static"===t.eventMode)[t]??null} + setStripY(t){ + this.strip.y=t,this.card.visible&&(this.card.y=t+52)} + drawStrip(t){ + const i=t.wanted.slice(0,5),s=i.map(i=>BGi(kSi(i.id),t.spot,t.now).here),e=RIi.getInstance().state.dex,n=i.map((t,i)=>`${ + t.id} + :${ + t.who.map(t=>`${ + t.have} + /${ + t.need} + `).join(",")} + :${ + s[i]} + :${ + !!e[t.id]} + `).join("|")+`|${ + t.wanted.length} + `; + if(n===this.stripSig)return; + if(this.stripSig=n,this.strip.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),this.strip.visible=i.length>0,!i.length)return void this.closePops(); + const h=new ip; + this.strip.addChild(h),i.forEach((t,i)=>{ + const n=kSi(t.id),h=new Ve,r=new lki(38); + r.set(t.id,n.star,0,!e[t.id]),h.addChild(r); + const o=t.who.find(t=>t.need>0&&t.have<t.need)??t.who.find(t=>t.need>0); + if(o){ + const t=rki(`${ + Math.min(o.have,o.need)} + /${ + o.need} + `,KIi,10),i=(new ip).roundRect(0,0,t.width+8,14,7).fill({ + color:QIi,alpha:.92} + ),s=new Ve; + s.addChild(i,t),t.position.set(4,1),s.position.set(38-t.width-6,28),h.addChild(s)} + s[i]&&h.addChild((new ip).circle(34,4,5).fill(8378016).circle(34,4,5).stroke({ + color:QIi,width:1.5} + )),h.position.set(6+44*i,6),h.eventMode="static",h.cursor="pointer",h.hitArea=new Ui(-3,-3,44,46),h.on("pointertap",i=>{ + i.stopPropagation(),this.toggleCard(t.id)} + ),this.strip.addChild(h)} + ); + const r=t.wanted.length-i.length; + let o=6+44*i.length-6+6; + if(r>0){ + const t=rki(`+${ + r} + `,zIi,12); + t.position.set(o,6+(38-t.height)/2),this.strip.addChild(t),o+=t.width+8} + h.roundRect(0,0,o,50,12).fill({ + color:QIi,alpha:.6} + ),this.strip.x=10,this.strip.hitArea=new Ui(0,0,o,50)} + openCard(t){ + this.card.visible&&this.cardId===t||this.toggleCard(t)} + toggleCard(t){ + this.pop.visible=!1,this.card.visible&&this.cardId===t?this.closePops():(this.cardId=t,this.card.visible=!0,this.cardSig="",this.drawCard(t),MR.fromTo(this.card,{ + alpha:0} + ,{ + alpha:1,duration:.15} + ),jG("light"))} + drawCard(t){ + const i=this.last; + if(!i)return; + const s=i.wanted.find(i=>i.id===t); + if(!s)return void this.closePops(); + const e=kSi(t),n=BGi(e,i.spot,i.now),h=!!RIi.getInstance().state.dex[t],r=`${ + t} + |${ + n.placeOk} + |${ + n.depthOk} + |${ + n.tideOk} + |${ + Math.ceil(n.tideWait/6e4)} + |${ + s.who.map(t=>t.have).join(",")} + |${ + h} + `; + if(r===this.cardSig&&this.card.children.length)return; + this.cardSig=r,this.card.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const o=new ip,a=[o],c=new lki(44); + c.set(t,e.star,0,!h),c.position.set(12,12); + const l=rki(`${ + e.name} + `,KIi,15),u=rki("★".repeat(e.star),VIi,12); + l.position.set(66,14),oki(l,202),u.position.set(l.x+l.width+6,17); + const d=rki(s.who.map(t=>t.need>0?`${ + t.name} + ${ + Math.min(t.have,t.need)} + /${ + t.need} + `:t.name).join(" · "),zIi,11,!1); + d.position.set(66,37),oki(d,242),a.push(c,l,u,d); + const f=FGi(e,i.spot,i.now,296,()=>{ + this.cardSig=""} + ); + f.node.position.set(12,66),a.push(f.node); + const p=66+f.height+12; + o.roundRect(0,0,320,p,12).fill({ + color:QIi,alpha:.96} + ),this.card.addChild(...a),this.card.position.set(10,this.strip.y+52),this.card.hitArea=new Ui(0,0,320,p)} + } + ; + Qt(WGi,"FishingStatusHud"); + let VGi=WGi; + const jGi=68,KGi=class extends Ve{ + constructor(){ + super(),Zt(this,"bg",new ip),Zt(this,"lines",[rki("",KIi,15),rki("",zIi,12,!1),rki("",zIi,12,!1),rki("",VIi,12,!1)]),Zt(this,"forId",0),Zt(this,"hideCall",null),this.eventMode="none",this.addChild(this.bg,...this.lines),this.visible=!1} + show(t,i,s,e,n,h){ + var r; + this.forId=t; + let o=10,a=0; + this.lines.forEach((t,e)=>{ + t.text=i[e]??"",t.textColor=s[e]??zIi,t.visible=!!i[e],t.visible&&(oki(t,300),t.position.set(12,o),o+=t.height+3,a=Math.max(a,t.width))} + ),o+=7,a+=24,this.bg.clear().roundRect(0,0,a,o,10).fill({ + color:QIi,alpha:.96} + ),this.position.set(Math.max(0,Math.min(CRi.BLEED_W-a,e-a/2)),h?n-o-6:n+6),this.visible=!0,MR.fromTo(this,{ + alpha:0} + ,{ + alpha:1,duration:.12} + ),null==(r=this.hideCall)||r.kill(),this.hideCall=MR.delayedCall(4,()=>this.hide())} + hide(){ + var t; + this.visible=!1,this.forId=0,null==(t=this.hideCall)||t.kill(),this.hideCall=null} + } + ; + Qt(KGi,"FishTip"); + let zGi=KGi; + const YGi=class t extends Ve{ + constructor(){ + super(),Zt(this,"tabId","fish"),Zt(this,"scrollInShell",!1),Zt(this,"fullBleed",!0),Zt(this,"onOpenMap",null),Zt(this,"scene",new FDi(CRi.BLEED_W,this.H)),Zt(this,"hud",new VGi),Zt(this,"fishBtn",new pki("물고기",76,34,13)),Zt(this,"mapBtn",new pki("해도",64,34,13)),Zt(this,"bite",new Ve),Zt(this,"popLayer",new Ve),Zt(this,"fxCatch",new Ve),Zt(this,"fishPanel",new Ve),Zt(this,"panelBg",new ip),Zt(this,"candTitle",rki("이곳의 물고기",KIi,16)),Zt(this,"candCount",rki("",zIi,13)),Zt(this,"candClose",rki("✕",zIi,20)),Zt(this,"candCards",[]),Zt(this,"candBadges",[]),Zt(this,"candPool",[]),Zt(this,"candMore",rki("",zIi,12,!1)),Zt(this,"tip",new zGi),Zt(this,"settling",!1),Zt(this,"awayRetryAt",0),Zt(this,"netSellBtn",new pki("가득 참",92,26,12)),Zt(this,"netWasFull",!1),Zt(this,"othersAt",-1),Zt(this,"t0",performance.now()),Zt(this,"unsub",[]),Zt(this,"journeyBox",new Ve),Zt(this,"journeySig",""),Zt(this,"hubPanel",new Ve),Zt(this,"hubId",""),Zt(this,"logPanel",new Ve),Zt(this,"plunder"),Zt(this,"boatUi"),Zt(this,"huntUi"),Zt(this,"tradeUi"),Zt(this,"boatMenu"),Zt(this,"trackerTask",null),Zt(this,"progressHoldUntil",0),Zt(this,"lastWanted",[]),Zt(this,"dailyBusy",!1),Zt(this,"greeted",!1),Zt(this,"hubNearNow",!1),Zt(this,"depthOnClose",!1),Zt(this,"hubBusy",new Set),Zt(this,"hubPraise",""),Zt(this,"hubDrawn",""),Zt(this,"abandonArm",""),Zt(this,"logDrawn",""),Zt(this,"biteMark",new Ye(as.EMPTY)),Zt(this,"visitorPanel",new Ve),Zt(this,"visitorKey",""),Zt(this,"visitorSpot",""),Zt(this,"swallowTap",!1),Zt(this,"coach",new Sxi),Zt(this,"sailTipAnchor",Qt(()=>this.scene.idleInSail?t.anchorOf(this.scene.boatSprite,!1)():null,"sailTipAnchor")),Zt(this,"realTutBackend",{ + biteOpen:Qt(()=>!!RIi.getInstance().biteOpen(),"biteOpen"),hookable:Qt(()=>!!RIi.getInstance().hookable(),"hookable"),hook:Qt(async()=>(await RIi.getInstance().hook()).message,"hook"),recast:Qt(()=>{ + RIi.getInstance().cast()} + ,"recast"),finish:Qt(()=>{ + RIi.getInstance().markTip("tut")} + ,"finish"),biteIn:Qt(()=>RIi.getInstance().biteIn(),"biteIn")} + ),Zt(this,"tutBackend",this.realTutBackend),Zt(this,"tutPreviewing",!1),Zt(this,"tutRace","인간"),Zt(this,"tut",new RGi({ + scene:this.scene,backend:Qt(()=>this.tutBackend,"backend"),race:Qt(()=>this.tutRace,"race"),W:Qt(()=>CRi.BLEED_W,"W"),H:Qt(()=>this.H,"H"),biteGlobal:Qt(()=>t.shown(this.bite)?this.bite.toGlobal({ + x:0,y:0} + ):null,"biteGlobal"),onFinish:Qt(t=>this.endTutorial(t),"onFinish"),lift:Qt(()=>CRi.FOOTER+6,"lift")} + )),Zt(this,"quietAfterTut",!1),Zt(this,"onTutorialPreviewEnd",null),Zt(this,"autoTag",new Ve),this.hud.onDepth=()=>{ + this.cycleDepth()} + ,this.hud.onNet=()=>{ + fxi.getInstance().openView("net"),CRi.getInstance().selectTab("tank")} + ,this.netSellBtn.visible=!1,this.netSellBtn.onTap=()=>{ + fxi.getInstance().openView("net"),CRi.getInstance().selectTab("tank")} + ,this.fishBtn.setPrimary(!1),this.mapBtn.setPrimary(!1),this.mapBtn.onTap=()=>{ + var t; + return null==(t=this.onOpenMap)?void 0:t.call(this)} + ,this.fishBtn.onTap=()=>this.toggleFishPanel(),this.biteMark.anchor.set(.5,XEi),this.biteMark.scale.set(.2),this.biteMark.position.set(0,25),this.bite.addChild(this.biteMark),this.bite.visible=!1,this.bite.eventMode="static",this.bite.cursor="pointer",this.bite.hitArea=new Ui(-44,-44,88,96),this.bite.on("pointertap",t=>{ + t.stopPropagation(),this.tryHook()} + ),this.scene.onTapBefore=()=>this.hookTap(),this.scene.startInSail=()=>{ + const t=RIi.getInstance(); + return!t.tipSeen("sail")||!t.tipSeen("rod")} + ,this.autoTag.eventMode="none",this.scene.onStopAtPoint=t=>{ + var i,s; + this.tutPreviewing?null==(s=(i=this.tutBackend).onCast)||s.call(i):this.stopAt(t)} + ,this.scene.onVisitorTap=t=>this.openVisitor(t),this.scene.onModeChange=()=>RIi.getInstance().syncSoon(),this.scene.onCast=()=>{ + var t,i; + this.tutPreviewing?null==(i=(t=this.tutBackend).onCast)||i.call(t):RIi.getInstance().cast()} + ,this.scene.onHubTap=(t,i)=>this.openHub(t,i),RIi.getInstance().onBigMove=(t,i,s)=>this.playTravel(t,i,s),this.scene.onHubArrive=t=>{ + this.hubPanel.visible||this.logPanel.visible||this.tut.active||this.openHub(t,!0)} + ,this.journeyBox.eventMode="static",this.journeyBox.cursor="pointer",this.journeyBox.on("pointertap",t=>{ + t.stopPropagation(),this.tapNext()} + ),this.journeyBox.position.set(10,84),this.hubPanel.visible=!1,this.hubPanel.eventMode="static",this.logPanel.visible=!1,this.logPanel.eventMode="static",this.visitorPanel.visible=!1,this.visitorPanel.eventMode="static",this.popLayer.eventMode="none",this.buildFishPanel(),this.fxCatch.eventMode="static",this.fxCatch.visible=!1,this.fxCatch.on("pointertap",t=>{ + var i,s; + t.stopPropagation(),null==(s=(i=this.scene).onTapBefore)||s.call(i),WDi.dismiss()} + ),this.plunder=new JDi(this.scene,()=>this.H),this.plunder.overlayOpen=()=>!(!vxi.getInstance().parent&&!Jxi.isOpen); + const i=this.scene.onOtherTap; + this.boatUi=new mGi(this.scene,()=>this.H),this.boatUi.bannerY=()=>this.plunder.bannerBottom,this.boatUi.onPeek=t=>null==i?void 0:i(t,!1),this.huntUi=new IGi(this.scene,()=>this.H),this.huntUi.bannerY=()=>this.boatUi.bannerBottom,this.tradeUi=new hGi(this.scene,()=>this.H),this.tradeUi.bannerY=()=>this.huntUi.bannerBottom,this.tradeUi.onOpen=()=>{ + this.closeHub(),this.closeVisitor(),this.closeLog(),this.plunder.closePeek(),this.boatUi.closeAll(),this.huntUi.closeAll(),this.boatMenu.close()} + ,this.boatMenu=new oGi(this.scene,()=>this.H),this.boatMenu.wantsHelp=t=>this.boatUi.wantsHelp(t),this.boatMenu.onTrade=t=>this.tradeUi.request(t),this.boatMenu.onPeek=t=>null==i?void 0:i(t,!1),this.boatMenu.onHelp=t=>{ + this.plunder.closePeek(),this.boatUi.openHelp(t)} + ,this.scene.onOtherTap=t=>{ + this.closeHub(),this.closeVisitor(),this.boatUi.closeAll(),this.plunder.closePeek(),this.tradeUi.panelOpen||this.boatMenu.open(t)} + ,this.addChild(this.scene,this.boatUi.chip,this.huntUi.chip,this.netSellBtn,this.fishBtn,this.mapBtn,this.bite,this.autoTag,this.journeyBox,this.hud,this.popLayer,this.fishPanel,this.visitorPanel,this.hubPanel,this.logPanel,this.plunder,this.boatUi,this.huntUi,this.tradeUi,this.boatMenu,this.fxCatch,this.coach,this.tut),this.eventMode="static",this.on("pointerdowncapture",t=>{ + this.coach.dismiss(); + const i=this.hud.closeIfOutside(t.target); + this.swallowTap=!1,(this.hookTap()||i)&&(this.swallowTap=!0,t.stopPropagation())} + ),this.on("pointertapcapture",t=>{ + this.swallowTap&&(this.swallowTap=!1,t.stopPropagation())} + )} + static getInstance(){ + return this.instance??(this.instance=new t)} + get H(){ + return CRi.contentHeight} + get depthBtn(){ + return this.hud.depthSeg} + get netChip(){ + return this.hud.netSeg} + get hereDef(){ + const t=RIi.getInstance().state.spot; + return"R"===t.zone?XTi[t.race]:null} + static questRace(t){ + var i; + const s=RIi.getInstance(); + return(null==(i=wCi(t.id,s.startRace()))?void 0:i.race)??s.startRace()} + get inJourneyMap(){ + const i=RIi.getInstance().state.spot,s=this.trackedNow(); + return"R"===i.zone&&(!s||i.race===t.questRace(s.def))} + static npc(t){ + for(const i of Object.values(XTi)){ + const s=i.npcs.find(i=>i.id===t); + if(s)return s} + return XTi["인간"].npcs[0]} + trackedNow(){ + const t=RIi.getInstance(),i=t.tracked(); + return i?t.questHeld().find(t=>t.def.id===i.id)??null:null} + hubStates(t){ + const i=RIi.getInstance(),s=i.questHeld(),e=new Map; + for(const n of t.npcs){ + const h=s.filter(t=>i.questTurnIn(t.def)===n.id); + e.set(n.id,h.some(t=>t.ready)?"ready":i.questOffers(t.race,n.id).length?"offer":h.length?"wait":"idle")} + return e} + offeringNpc(t){ + const i=RIi.getInstance(); + return t.npcs.find(s=>i.questOffers(t.race,s.id).length>0)??null} + get questFresh(){ + const t=RIi.getInstance().qlog(); + return!t.held.length&&!t.done.length} + syncJourney(){ + const i=this.hereDef,s=RIi.getInstance(); + if(i){ + const e=this.hubStates(i); + this.scene.setHubs(i.npcs.map(t=>({ + id:t.id,name:t.name,role:t.role,art:t.art,anchor:t.anchor,ship:t.ship,state:this.tut.active?"idle":e.get(t.id)??"idle"} + ))),!this.questFresh||i.race!==s.startRace()||this.tut.active||this.tutorialDue()||this.greetFirstHub(i.npcs[0].id); + let n=null; + const h=this.trackedNow(); + if(h&&t.questRace(h.def)===i.race){ + const e=h.def,r=s.questTurnIn(e); + (h.ready||"meet"===e.kind)&&i.npcs.some(t=>t.id===r)?n={ + points:[],hub:r,label:t.npc(r).name} + :"fish"===e.kind?n={ + points:kSi(e.fish).pts,hub:null,label:kSi(e.fish).name} + :"any"!==e.kind&&"area"!==e.kind||void 0===e.point||(n={ + points:[e.point],hub:null,label:RSi(i.race,"R",e.point)} + )} + else if(!h){ + const t=this.offeringNpc(i); + t&&(n={ + points:[],hub:t.id,label:t.name} + )} + this.scene.setGoal(this.tut.active?null:n)} + else this.scene.setHubs([]),this.scene.setGoal(null); + this.renderTracker(),this.logPanel.visible&&this.renderLog()} + taskInput(){ + const i=RIi.getInstance(),s=i.state,e=s.boat,n=this.trackedNow(),h=i.questHeld(),r=i.realNow(),o=BOi(s.spot,r,s.huntDevAt),a=h.find(t=>t.ready&&"meet"!==t.def.kind),c=this.hereDef?this.offeringNpc(this.hereDef):null; + return{ + boatBroken:!!(null==e?void 0:e.broken)&&!e.repairAt,netFull:i.netFull(),contestReady:i.contestReady(),daily:i.daily(),journeyReady:a?{ + npc:t.npc(i.questTurnIn(a.def)).name} + :null,goalsReady:i.goalsReady(),monster:o?{ + name:o.name,inMs:o.at-r} + :null,journeyNext:n?{ + title:`퀘스트 · ${ + n.def.title} + `,line:OCi(n.def,n.got).text} + :c?{ + title:"퀘스트",line:`${ + c.name} + 에게 퀘스트 받기`} + :null,journeyHere:this.inJourneyMap,areaReady:(()=>{ + const t=i.areaReady(); + return t?{ + name:t.name,pearl:t.pearl} + :null} + )(),areaNext:(()=>{ + const t=i.areaNext(); + return t?{ + name:t.name,have:t.have,need:t.need} + :null} + )(),dailyOff:!0} + } + get progressHeld(){ + return performance.now()<this.progressHoldUntil} + renderTracker(){ + this.progressHeld&&this.journeySig||(this.drawTracker(),this.hud.setStripY(this.journeyBox.y+this.journeyBox.height+6))} + drawTracker(){ + const i=RIi.getInstance(),s=this.journeyBox,e=bIi(this.taskInput()),n=this.trackedNow(),h=i.qlog().held.length,r=this.hereDef?this.offeringNpc(this.hereDef):null,o=("journey"===e.kind||"journeyReady"===e.kind)&&this.inJourneyMap&&(!!n||!!r),a=o?`q|${ + null==n?void 0:n.def.id} + |${ + null==n?void 0:n.got} + |${ + null==n?void 0:n.ready} + |${ + h} + |${ + null==r?void 0:r.id} + `:`t|${ + e.kind} + |${ + e.title} + |${ + e.sub} + `; + if(this.trackerTask=e,s.visible=!0,a===this.journeySig)return; + this.journeySig=a,s.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const c=new ip; + if(o){ + const e=nAi.gear().journeyFaces,o=null==n?void 0:n.def,a="meet"===(null==o?void 0:o.kind),l=!!(null==n?void 0:n.ready)&&!a,u=t.npc(o?l||a||o.teach?i.questTurnIn(o):o.npc:r.id),d=wki(e[u.art]??e[0],28); + d.position.set(3,3); + const f=rki(o?l?`✓ ${ + u.name} + 에게 가서 마치기`:t.questLine(o,n.got):`${ + u.name} + 에게 퀘스트 받기`,l?qIi:KIi,13); + f.setWrapWidth(214); + const p=Math.max(34,f.height+12); + f.position.set(38,(p-f.height)/2); + const g=rki("›",zIi,16); + g.position.set(38+f.width+6,(p-g.height)/2-1); + const w=g.x+g.width+10; + if(c.roundRect(0,0,w,p,Math.min(17,p/2)).fill({ + color:l?1194534:QIi,alpha:.85} + ),d.y=(p-28)/2,s.addChild(c,d,f,g),h){ + const t=new Ve,e=rki(`${ + h} + `,1776411,10); + t.addChild((new ip).circle(0,0,8).fill(h>=i.questHoldMax()?XIi:VIi),e),e.position.set(-e.width/2,-e.height/2),t.position.set(d.x+27,d.y+3),s.addChild(t)} + if(n&&!n.ready&&n.need>1){ + const t=(new ip).roundRect(10,p-3,Math.max(0,(w-20)*Math.min(1,n.got/n.need)),3,1.5).fill(VIi); + s.addChild(t)} + s.hitArea=new Ui(0,0,w,p)} + else{ + const t="repair"===e.kind||"net"===e.kind,i="claim"===e.kind||"contest"===e.kind||"goal"===e.kind||"journeyReady"===e.kind,n=rki(e.title,t?XIi:i?qIi:VIi,12); + n.position.set(12,5); + const h=rki(e.sub,KIi,13); + h.position.set(12,22),oki(n,260),oki(h,260); + const r=rki("›",zIi,16),o=Math.max(n.width,h.width)+12+22; + r.position.set(o-18,(42-r.height)/2-1),c.roundRect(0,0,o,42,14).fill({ + color:i?1194534:t?3806994:QIi,alpha:.85} + ),s.hitArea=new Ui(0,0,o,42),s.addChild(c,n,h,r)} + this.hubPanel.visible&&this.renderHub()} + tapNext(){ + const t=this.trackerTask,i=CRi.getInstance(); + if(t)switch(t.go){ + case"repair":return void this.boatUi.openPanel(); + case"net":return fxi.getInstance().openView("net"),void i.selectTab("tank"); + case"hunt":return void this.huntUi.openRecords(); + case"claim":return void this.claimDailyHere(); + case"fish":return void vH.getInstance().showMessage("입질이 오면 직접 눌러 낚아요"); + case"journey":return void(RIi.getInstance().qlog().held.length?this.openLog():this.inJourneyMap?this.tapTracker():this.goJourney()); + default:ei(()=>Promise.resolve().then(()=>xUi),void 0).then(s=>{ + s.FishingQuestPage.getInstance().openView(t.go),i.selectTab("quest")} + )} + } + async goJourney(){ + const t=RIi.getInstance(),i=t.startRace(),s=XTi[i],e=this.offeringNpc(s)??s.npcs[0],n=await t.goTo({ + race:i,zone:"R",point:e.anchor,depth:t.state.spot.depth} + ); + !n&&YRi.active||vH.getInstance().showMessage(n??`${ + s.river} + 으로 왔어요 · ${ + e.name} + 에게 가 보세요`)} + goTurnIn(i){ + const s=RIi.getInstance(),e=s.questTurnIn(i),n=t.npc(e); + if(this.closeLog(),this.scene.hubNear(e))return void this.openHub(e,!0); + if(this.scene.sailToHub(e))return void vH.getInstance().showMessage(`${ + n.name} + 에게 가요`); + const h=Object.values(XTi).find(t=>t.npcs.some(t=>t.id===e)); + h&&s.goTo({ + race:h.race,zone:"R",point:n.anchor,depth:s.state.spot.depth} + ).then(t=>{ + !t&&YRi.active||vH.getInstance().showMessage(t??`${ + h.river} + 으로 왔어요 · ${ + n.name} + 에게 가 보세요`)} + )} + static questLine(t,i){ + const s=OCi(t,i); + return CCi.includes(t.kind)?`${ + s.hint} + ${ + s.text} + `:s.text} + async goQuestPlace(i){ + const s=CRi.getInstance(),e=Qt(async(t,i,e)=>{ + await s.selectTab(t); + const n=i(); + n&&(s.scrollToShow(n),s.point(n,e))} + ,"go"); + switch(i.kind){ + case"gear":{ + const{ + FishingGearPage:t} + =await ei(async()=>{ + const{ + FishingGearPage:t} + =await Promise.resolve().then(()=>lUi); + return{ + FishingGearPage:t} + } + ,void 0),s=WSi.find(t=>t.key===i.gear); + return void(await e("gear",()=>t.getInstance().focusTool(i.gear),`여기서 ${ + gki(s.title,"을","를")} + 올려요`))} + case"sell":return fxi.getInstance().openView("net"),void(await e("tank",()=>fxi.getInstance().sellButton,"여기서 물고기를 팔아요")); + case"contest":case"area":{ + const{ + FishingQuestPage:t} + =await ei(async()=>{ + const{ + FishingQuestPage:t} + =await Promise.resolve().then(()=>xUi); + return{ + FishingQuestPage:t} + } + ,void 0); + return t.getInstance().openView(i.kind),void(await s.selectTab("quest"))} + case"harpoon":return void(t.shown(this.huntUi.throwBtn)?s.point(this.huntUi.throwBtn,"물고기로 작살을 만들어요"):this.huntUi.openCraft())} + } + playTravel(t,i,s){ + if(!CRi.getInstance().parent||this.tut.active)return; + const e=`${ + i.race} + |${ + i.zone} + `; + YRi.play({ + from:t,to:i,boatLv:RIi.getInstance().state.gear.boat,wait:s,mapReady:Qt(()=>this.scene.mapReadyFor(e),"mapReady"),onGlide:Qt(t=>this.scene.glideIn(t),"onGlide")} + )} + async claimDailyHere(){ + if(!this.dailyBusy){ + this.dailyBusy=!0; + try{ + const t=await RIi.getInstance().claimDaily(); + if(t)return void vH.getInstance().showMessage(t); + jG("success"),vH.getInstance().showMessage("오늘 할 일 끝! 진주 200개를 받았어요"),CRi.getInstance().flyCurrency("pearl",this.journeyBox.toGlobal({ + x:60,y:23} + ),8)} + finally{ + this.dailyBusy=!1,this.renderTracker()} + } + } + greetFirstHub(t){ + this.greeted||this.hubPanel.visible||!this.scene.hubPos(t)||vxi.getInstance().parent||Jxi.isOpen||!RIi.getInstance().look&&!Jxi.skipped||(this.greeted=!0,this.openHub(t,this.scene.hubNear(t)))} + devGiant(){ + this.scene.devGiant()} + tapTracker(){ + const t=this.hereDef,i=t?this.offeringNpc(t):null; + i&&this.openHub(i.id,this.scene.hubNear(i.id))} + async matchQuestDepth(t){ + const i=RIi.getInstance(),s="fish"===t.kind?UGi({ + kind:"fish",id:t.fish} + ,i.state.spot):null; + if(!s)return; + const e=await i.setDepth(s); + vH.getInstance().showMessage(e??`${ + gSi[s]} + 에 사는 물고기예요 · 깊이를 ${ + gSi[s]} + 으로 맞췄어요`),this.render()} + openHub(t,i){ + this.plunder.closePeek(),this.closeLog(),this.hubId=t,this.hubNearNow=i,this.closeVisitor(),this.renderHub(!0),this.hubPanel.visible=!0,MR.fromTo(this.hubPanel,{ + alpha:0,y:12} + ,{ + alpha:1,y:0,duration:.18} + )} + closeHub(){ + this.hubPraise="",this.hubId="",this.quietAfterTut=!1,this.hubPanel.visible=!1; + const t=this.depthOnClose?RIi.getInstance().tracked():null; + this.depthOnClose=!1,"fish"===(null==t?void 0:t.kind)&&this.matchQuestDepth(t)} + static questIcon(t,i){ + if("fish"===t.kind){ + const s=kSi(t.fish),e=new lki(i); + return e.set(s.id,s.star,0,!RIi.getInstance().state.dex[s.id]),e} + const s="sell"===t.kind?"keepnet":"harpoon"===t.kind?"toolbox":"hunt"===t.kind?"pin":"contest"===t.kind?"trophy":"area"===t.kind?"map":"meet"===t.kind?"people":"any"===t.kind?"hook":"boat"===t.gear?"boat":"line"===t.gear?"spool":"rod"===t.gear?"rod":"reel"===t.gear?"reel":"bobber"===t.gear?"bobber":"auto"===t.gear?"autorod":"keepnet",e=new Ve; + return e.addChild((new ip).roundRect(0,0,i,i,9).fill(BIi),yki(s,.62*i,16777215)),e.children[1].position.set(.19*i,.19*i),e} + static rewardRow(t){ + const i=new Ve; + let s=0; + if(t.gold){ + const e=_ki("gold",15),n=rki(t.gold.toLocaleString(),VIi,12); + n.position.set(19,-1),e.x=s,n.x+=s,i.addChild(e,n),s=n.x+n.width+10} + if(t.pearl){ + const e=_ki("pearl",15),n=rki(`${ + t.pearl} + `,JIi,12); + e.x=s,n.position.set(s+19,-1),i.addChild(e,n)} + return i} + renderHub(i=!1){ + var s,e; + const n=RIi.getInstance(),h=this.hubPanel; + if(!this.hubId)return h.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),void this.closeHub(); + const r=Object.values(XTi).find(t=>t.npcs.some(t=>t.id===this.hubId))??this.hereDef??XTi[n.startRace()],o=t.npc(this.hubId),a=(null==(s=this.hereDef)?void 0:s.race)===r.race,c=a&&(this.hubNearNow||this.scene.hubNear(o.id)),l=n.questHeld().filter(t=>n.questTurnIn(t.def)===o.id),u=n.questOffers(r.race,o.id),d=n.questHoldMax(),f=n.qlog().held.length>=d,p=null==(e=pCi(r.race,0,n.startRace())[0])?void 0:e.id,g=CRi.BLEED_W,w=g-20,m=10,v=138,_=[...l.filter(t=>t.ready),...l.filter(t=>!t.ready)].length+u.length,M=[r.race,o.id,c,l.map(t=>`${ + t.def.id} + :${ + t.got} + :${ + t.ready} + `).join(","),u.map(t=>t.id).join(","),f,[...this.hubBusy].join(","),g,this.H].join("|"); + if(!i&&M===this.hubDrawn&&h.children.length)return; + this.hubDrawn=M,h.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const b=104,y=b+58*_+58,E=this.H-y-8,A=aki(w,y,QIi,null,14); + A.alpha=.96,A.position.set(m,E); + const S=nAi.gear(),T=new Ye(S.journeyNpcs[o.art]??S.journeyNpcs[0]); + T.width=T.height=132,T.position.set(6,E+b-128); + const C=rki(o.name,VIi,18),O=rki(o.role,zIi,13); + C.position.set(v,E+14),O.position.set(C.x+C.width+8,E+18); + const I=[A,T,C,O],k=l.find(t=>t.ready),R=!!k&&"meet"===k.def.kind&&!c,x=r.npcs.findIndex(t=>t.id===o.id),P=pCi(r.race,x,n.startRace()).every(t=>n.qlog().done.includes(t.id)),N=R?`${ + o.role} + · 배를 몰고 가서 말을 걸어요`:this.hubPraise?this.hubPraise:k?k.def.done:u.length?u[0].line:l.length?"맡긴 일 잘 부탁해요!":P?`고마웠어요! ${ + r.river} + 에 오면 또 들러 줘요.`:"어서 와요. 지금은 딱히 부탁할 게 없네요.",L=rki(R?N:`"${ + N} + "`,R?zIi:KIi,13,!1); + if(L.setWrapWidth(m+w-14-v),L.position.set(v,E+42),oki(L,2.2*(m+w-14-v)),I.push(L),_){ + const t=n.qlog().held.length,i=new Ve,s=(new ip).circle(9,9,9).fill(VIi),e=rki("!",1776411,12,!1),h=rki(`퀘스트 ${ + t} + /${ + d} + `,t>=d?XIi:VIi,13); + e.position.set(9-e.width/2,9-e.height/2),h.position.set(24,9-h.height/2),i.addChild(s,e,h),i.position.set(m+w-16-i.width,E+b-24),I.push(i)} + let D=E+b; + const G=Qt((i,s,e,n,h)=>{ + const r=(new ip).roundRect(20,D,w-20,52,10).fill(h?1194534:GIi),o=t.questIcon(i,40); + o.position.set(28,D+6); + const a=rki(i.title,KIi,14); + a.position.set(76,D+7); + const c=rki(s,e,12,!1); + c.position.set(76,D+28); + const l=t.rewardRow(i); + l.position.set(76+a.width+10,D+9); + const u=w-20-66-(n?104:12); + oki(a,u-60),oki(c,u),I.push(r,o,a,c,l),n&&(n.position.set(m+w-10-96,D+6),I.push(n)),D+=58} + ,"addRow"); + for(const t of l.filter(t=>t.ready)){ + const i=new pki("마치기",88,40,14); + i.enabled=c&&!this.hubBusy.has(t.def.id),i.onTap=async()=>{ + if(this.hubBusy.has(t.def.id))return; + const s=i.toGlobal({ + x:44,y:20} + ),e=n.questHoldMax(); + this.hubBusy.add(t.def.id),i.enabled=!1; + const h=await n.questComplete(t.def.id).finally(()=>this.hubBusy.delete(t.def.id)); + if(h.message)return vH.getInstance().showMessage(h.message),void this.renderHub(!0); + jG("success"); + const r=CRi.getInstance(); + h.gold&&r.flyCurrency("gold",s,6),h.pearl&&r.flyCurrency("pearl",s,4); + const o=n.questHoldMax(); + o>e?(this.hubPraise=`잘하고 있어요! 이제 퀘스트를 한 번에 ${ + o} + 개까지 받을 수 있어요.`,vH.getInstance().showMessage(`퀘스트를 한 번에 ${ + o} + 개까지 받을 수 있어요`),qG.getInstance().playSFX(qG.SFX_POPUP)):vH.getInstance().showMessage(`"${ + t.def.done} + "`),this.syncJourney(),this.renderHub(!0)} + ,G(t.def,"meet"===t.def.kind?"✓ 인사하러 왔어요":"✓ 다 했어요",qIi,i,!0)} + for(const $ of l.filter(t=>!t.ready))G($.def,t.questLine($.def,$.got),zIi,null,!1); + for(const t of u){ + const i=new pki("받기",88,40,14),s=t.id===p; + i.enabled=!f&&(c||s)&&!this.hubBusy.has(t.id),i.onTap=async()=>{ + if(this.hubBusy.has(t.id))return; + this.hubBusy.add(t.id),i.enabled=!1; + const e=await n.questAccept(t.id,r.race,o.id).finally(()=>this.hubBusy.delete(t.id)); + if(e)return vH.getInstance().showMessage(e),void this.renderHub(!0); + jG("light"),this.syncJourney(),"fish"===t.kind&&(this.depthOnClose=!0),s||"meet"===t.kind?this.closeHub():this.renderHub(!0)} + ,G(t,OCi(t,0).ask,zIi,i,!1)} + const B=E+y-58+8,U=new pki("닫기",96,40,14); + U.setPrimary(!1),U.onTap=()=>this.closeHub(),U.position.set(m+w-16-96,B),I.push(U); + const F=rki(f&&u.length?`퀘스트는 지금 ${ + d} + 개까지 들 수 있어요 · 마칠수록 늘어요`:!c&&_?"가까이 가야 받고 마칠 수 있어요":"",zIi,12); + if(F.position.set(28,B+12),I.push(F),!c&&_){ + const t=new pki("여기로 가기",120,40,14); + t.position.set(U.x-8-120,B),t.onTap=()=>{ + a?this.scene.sailToHub(o.id)&&this.closeHub():(this.closeHub(),n.goTo({ + race:r.race,zone:"R",point:o.anchor,depth:n.state.spot.depth} + ).then(t=>{ + !t&&YRi.active||vH.getInstance().showMessage(t??`${ + r.river} + 으로 왔어요 · ${ + o.name} + 에게 가 보세요`)} + ))} + ,I.push(t),oki(F,t.x-F.x-10)} + h.hitArea=new Ui(0,0,g,this.H),h.removeAllListeners("pointertap"),h.on("pointertap",t=>{ + t.stopPropagation(),h.toLocal(t.global).y<E&&this.closeHub()} + ),h.addChild(...I)} + openLog(){ + this.closeHub(),this.closeVisitor(),this.abandonArm="",this.renderLog(!0),this.logPanel.visible=!0,MR.fromTo(this.logPanel,{ + alpha:0,y:12} + ,{ + alpha:1,y:0,duration:.18} + )} + closeLog(){ + this.logPanel.visible=!1,this.abandonArm=""} + renderLog(i=!1){ + var s; + const e=RIi.getInstance(),n=this.logPanel,h=e.questHeld(),r=null==(s=e.tracked())?void 0:s.id,o=CRi.BLEED_W,a=o-20,c=[h.map(t=>`${ + t.def.id} + :${ + t.got} + :${ + t.ready} + `).join(","),r,this.abandonArm,o,this.H].join("|"); + if(!i&&c===this.logDrawn&&n.children.length)return; + this.logDrawn=c,n.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const l=50+64*Math.max(1,h.length)+58,u=this.H-l-8,d=aki(a,l,QIi,null,14); + d.alpha=.96,d.position.set(10,u); + const f=rki(`퀘스트 ${ + h.length} + /${ + e.questHoldMax()} + `,VIi,17); + f.position.set(26,u+14); + const p=[d,f]; + if(!h.length){ + const t=rki("들고 있는 퀘스트가 없어요. NPC 에게 말을 걸어 받아요.",zIi,13); + t.position.set(26,u+50+18),p.push(t)} + const g=nAi.gear().journeyFaces; + h.forEach((i,s)=>{ + const n=u+50+64*s,h=i.def.id===r,o=new Ve,c=(new ip).roundRect(0,0,a-20,58,10).fill(i.ready?1194534:h?UIi:GIi); + o.addChild(c); + const l=t.npc(e.questTurnIn(i.def)),d=wki(g[l.art]??g[0],34); + d.position.set(10,12); + const f=rki(i.def.title,KIi,14); + f.position.set(54,8); + const w=rki(i.ready?`✓ ${ + l.name} + 에게 가서 마치기`:t.questLine(i.def,i.got),i.ready?qIi:zIi,12,!1); + w.position.set(54,31),oki(f,a-20-54-110),oki(w,a-20-54-110),o.addChild(d,f,w),i.need>1&&!i.ready&&o.addChild((new ip).roundRect(54,52,Math.max(0,(a-20-54-110)*(i.got/i.need)),3,1.5).fill(VIi)); + const m=i.ready||"meet"===i.def.kind,v=new pki(m?"이동":this.abandonArm===i.def.id?"정말 포기?":"포기",92,36,12); + v.setPrimary(m),v.position.set(a-20-100,11),v.onTap=async()=>{ + if(m)return void this.goTurnIn(i.def); + if(this.abandonArm!==i.def.id)return this.abandonArm=i.def.id,void this.renderLog(); + v.enabled=!1; + const t=await e.questAbandon(i.def.id); + if(this.abandonArm="",t)return vH.getInstance().showMessage(t),void this.renderLog(); + vH.getInstance().showMessage(`"${ + i.def.title} + " 퀘스트를 포기했어요 · ${ + l.name} + 에게 다시 받을 수 있어요`),this.syncJourney(),this.renderLog()} + ,o.addChild(v),o.position.set(20,n),c.eventMode="static",c.cursor="pointer",c.on("pointertap",t=>{ + if(t.stopPropagation(),e.track(i.def.id),this.abandonArm="",this.journeySig="",this.syncJourney(),"fish"===i.def.kind&&!i.ready)return this.closeLog(),this.render(),this.hud.openCard(i.def.fish),void this.matchQuestDepth(i.def); + if(i.ready||"meet"===i.def.kind){ + this.closeLog(); + const t=e.questTurnIn(i.def); + return void this.openHub(t,this.scene.hubNear(t))} + if(CCi.includes(i.def.kind))return this.closeLog(),void this.goQuestPlace(i.def); + this.renderLog()} + ),p.push(o)} + ); + const w=new pki("닫기",96,40,14); + w.setPrimary(!1),w.position.set(10+a-16-96,u+l-58+8),w.onTap=()=>this.closeLog(); + const m=rki("누르면 그 퀘스트 하는 곳으로 가요",zIi,12); + m.position.set(26,w.y+12),p.push(w,m),n.hitArea=new Ui(0,0,o,this.H),n.removeAllListeners("pointertap"),n.on("pointertap",t=>{ + t.stopPropagation(),n.toLocal(t.global).y<u&&this.closeLog()} + ),n.addChild(...p)} + syncVisitors(){ + const t=RIi.getInstance(),i=t.quests(); + this.hereDef?this.scene.setVisitors([]):this.scene.setVisitors(i.reqs.map(s=>({ + key:s.key,npc:s.npc,role:s.role,state:i.done.includes(s.key)?"done":t.questHave(s)>=s.count?"ready":"open"} + )))} + openVisitor(t){ + this.plunder.closePeek(),this.visitorKey=t,this.renderVisitor(),this.visitorPanel.visible=!0,MR.fromTo(this.visitorPanel,{ + alpha:0,y:12} + ,{ + alpha:1,y:0,duration:.18} + )} + closeVisitor(){ + this.visitorKey="",this.visitorPanel.visible=!1} + renderVisitor(){ + const t=RIi.getInstance(),i=t.quests(),s=i.reqs.find(t=>t.key===this.visitorKey),e=this.visitorPanel; + if(e.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),!s)return void this.closeVisitor(); + const n=i.done.includes(s.key),h=t.questHave(s),r=!n&&h>=s.count,o=CRi.BLEED_W,a=o-20,c=196,l=this.H-c-8,u=160,d=aki(a,c,QIi,null,14); + d.alpha=.94,d.position.set(10,l); + const f=new Ye(nAi.gear().guests[["m","b","e"].indexOf(s.key.slice(-1))]??nAi.gear().guests[0]); + f.width=f.height=164,f.position.set(4,l+c-170); + const p=rki(`${ + s.npc} + `,VIi,18),g=rki(s.role,zIi,13); + p.position.set(u,l+14),g.position.set(p.x+p.width+8,l+18); + const w=rki(s.line,KIi,14,!1); + w.position.set(u,l+42),oki(w,10+a-14-u); + const m=kSi(s.speciesId),v=!!t.state.dex[s.speciesId],_=new lki(56); + _.set(s.speciesId,m.star,s.minGrade,!v),_.position.set(u,l+70); + const M=rki(`${ + v||s.line.includes(m.name)?m.name:"???"} + ${ + s.minGrade?` (${ + dTi(s.minGrade)} + 이상)`:""} + `,KIi,15); + M.position.set(226,l+74),oki(M,10+a-14-226); + const b=rki(`가진 수 ${ + Math.min(h,s.count)} + / ${ + s.count} + `,r?qIi:zIi,13); + b.position.set(226,l+98); + const y=new Ve,E=_ki("gold",16),A=rki(s.gold.toLocaleString(),VIi,13); + if(A.position.set(20,-1),y.addChild(E,A),s.pearl){ + const t=_ki("pearl",16),i=rki(`${ + s.pearl} + `,JIi,13); + t.x=A.x+A.width+12,i.position.set(t.x+20,-1),y.addChild(t,i)} + y.position.set(226,l+118); + const S=new pki("닫기",96,40,14); + S.setPrimary(!1),S.position.set(10+a-16-96-8-120,l+c-54),S.onTap=()=>this.closeVisitor(); + const T=new pki(n?"납품 완료":r?"납품하기":"물고기 부족",120,40,14); + T.enabled=r,T.position.set(10+a-16-120,l+c-54),T.onTap=async()=>{ + const i=await t.deliver(s); + if(i)return void vH.getInstance().showMessage(i); + vH.getInstance().showMessage(`${ + s.npc} + : "고마워요!"`),jG("success"); + const e=CRi.getInstance(); + e.flyCurrency("gold",T.toGlobal({ + x:60,y:20} + ),7),s.pearl&&e.flyCurrency("pearl",T.toGlobal({ + x:60,y:20} + ),4),this.syncVisitors(),this.renderVisitor()} + ,e.hitArea=new Ui(0,0,o,this.H),e.removeAllListeners("pointertap"),e.on("pointertap",t=>{ + t.stopPropagation(),e.toLocal(t.global).y<l&&this.closeVisitor()} + ),e.addChild(d,f,p,g,w,_,M,b,y,S,T)} + buildFishPanel(){ + const t=this.fishPanel; + t.visible=!1,t.eventMode="static",t.on("pointertap",t=>{ + t.stopPropagation(),this.tip.hide()} + ),this.candTitle.position.set(16,16),this.candCount.y=19,this.candClose.eventMode="static",this.candClose.cursor="pointer",this.candClose.hitArea=new Ui(-10,-10,44,44),this.candClose.on("pointertap",t=>{ + t.stopPropagation(),this.toggleFishPanel()} + ),t.addChild(this.panelBg,this.candTitle,this.candCount,this.candClose,this.candMore,this.tip)} + toggleFishPanel(){ + this.fishPanel.visible=!this.fishPanel.visible,this.tip.hide(),this.fishPanel.visible&&(this.render(),MR.fromTo(this.fishPanel,{ + alpha:0} + ,{ + alpha:1,duration:.15} + ))} + onResize(){ + this.layout()} + backLabel(){ + return this.scene.bigMapOpen?"낚시":null} + closeOne(){ + return!(!this.tradeUi.closeOne()&&(this.scene.bigMapOpen?(this.scene.closeBigMap(),0):this.boatMenu.isOpen?(this.boatMenu.close(),0):this.hud.cardOpen?(this.hud.closePops(),0):this.logPanel.visible?(this.closeLog(),0):this.hubPanel.visible?(this.closeHub(),0):this.visitorPanel.visible?(this.closeVisitor(),0):this.fishPanel.visible?(this.toggleFishPanel(),0):this.plunder.panelOpen?(this.plunder.onHide(),0):this.boatUi.panelOpen?(this.boatUi.closeAll(),0):!this.huntUi.panelOpen||(this.huntUi.closeAll(),0)))} + layout(){ + const t=CRi.BLEED_W,i=this.H; + this.scene.resize(t,i),this.mapBtn.position.set(t-64-10,10),this.fishBtn.position.set(t-64-10-76-6,10),this.fishPanel.hitArea=new Ui(0,0,t,i),this.fxCatch.hitArea=new Ui(0,0,t,i),this.candClose.position.set(t-34,12),this.hubPanel.visible&&this.renderHub(!0),this.logPanel.visible&&this.renderLog(),this.visitorPanel.visible&&this.renderVisitor(),this.plunder.layout(),this.tradeUi.layout(),this.boatUi.layout(),this.huntUi.layout(),this.tut.active&&this.tut.layout()} + canImmerse(){ + const t=RIi.getInstance().plunder; + return!this.tut.active&&!this.hud.cardOpen&&this.scene.fishing&&!this.fishPanel.visible&&!this.hubPanel.visible&&!this.logPanel.visible&&!this.visitorPanel.visible&&!this.plunder.panelOpen&&!(null==t?void 0:t.raid)&&!(null==t?void 0:t.raidBy)&&!this.scene.bigMapOpen&&!this.boatUi.panelOpen&&!RIi.getInstance().boatHp().fixing&&!this.huntUi.panelOpen&&!this.huntUi.active&&!this.tradeUi.panelOpen&&!this.boatMenu.isOpen&&!RIi.getInstance().tradeLive} + setImmersion(t){ + const i=UCi(t,CRi.getInstance().inTutorial); + for(const s of[this.hud,this.boatUi.chip,this.huntUi.chip,this.netSellBtn,this.journeyBox])s.alpha=i.info; + for(const s of[this.fishBtn,this.mapBtn])s.alpha=i.menu; + this.scene.setHudAlpha(i.menu)} + immersiveTap(){ + var t,i; + return(null==(i=(t=this.scene).onTapBefore)?void 0:i.call(t))??!1} + onShow(){ + const t=RIi.getInstance(); + this.layout(),t.active=!0,t.posProvider=()=>{ + const t=this.scene.boatPos; + return t&&this.tutPreviewing?{ + ...t,s:!0} + :t} + ,CRi.getInstance().botSpots=()=>this.scene.sampleWater(200),CRi.getInstance().plunderSpots=t=>this.scene.waterAround(t),this.unsub.push(t.onCatch((t,i)=>this.pop(t,i))),this.render(),this.scene.start(),t.look||Jxi.skipped?this.intro():Jxi.isOpen||Jxi.getInstance().open(!0,()=>this.intro())} + intro(){ + CRi.getInstance().activePage===this&&this.settleIfAny()} + async settleIfAny(){ + const t=RIi.getInstance(),i=vxi.getInstance(); + if(!(this.settling||!t.state.away&&!t.state.migratedSold||i.parent||Jxi.isOpen||Date.now()<this.awayRetryAt)){ + this.settling=!0; + try{ + const s=await t.awayReport(); + s?i.open(s):(t.state.away||t.state.migratedSold)&&(this.awayRetryAt=Date.now()+3e4)} + finally{ + this.settling=!1} + } + } + drawNetFull(){ + const t=RIi.getInstance().netFull(); + this.netSellBtn.visible=t,t&&!this.netWasFull&&vH.getInstance().showMessage("어망이 가득 찼어요. 어망을 비워야 다시 잡혀요"),this.netWasFull=t} + wantedList(){ + const i=RIi.getInstance(),s=[]; + if(this.tut.active)return[]; + for(const o of i.questHeld())"fish"===o.def.kind&&o.got<o.need&&s.push({ + id:o.def.fish,name:t.npc(i.questTurnIn(o.def)).name,have:o.got,need:o.need} + ); + const e=i.state.contest,n=i.contestStanding(),h=e?yTi(e.day):null; + (null==h?void 0:h.speciesId)&&n&&!n.ended&&s.push({ + id:h.speciesId,name:`대회 · ${ + h.title} + `,have:0,need:0} + ); + const r=i.quests(); + for(const t of r.reqs)r.done.includes(t.key)||s.push({ + id:t.speciesId,name:t.npc,have:i.questHave(t),need:t.count} + ); + return GGi(s)} + async stopAt(t){ + const i=RIi.getInstance(),s=i.state.spot,e=await i.moveTo(s.race,s.zone,t); + !e&&this.tut.active||vH.getInstance().showMessage(e??`${ + RSi(s.race,s.zone,t)} + · 여기서 낚시해요`),this.render()} + hookTap(){ + if(this.tut.active)return!1; + const t=RIi.getInstance(),i=t.plunder; + return!(!this.scene.fishing||this.fishPanel.visible||this.hubPanel.visible||this.logPanel.visible||this.visitorPanel.visible||this.plunder.panelOpen||(null==i?void 0:i.raid)||(null==i?void 0:i.raidBy)||this.hud.cardOpen||this.scene.bigMapOpen||this.boatUi.panelOpen||this.huntUi.panelOpen||this.tradeUi.panelOpen||this.boatMenu.isOpen||!t.hookable()||(this.tryHook(),0))} + async tryHook(){ + const t=await RIi.getInstance().hook(); + t.message&&vH.getInstance().showMessage(t.message)} + onHide(){ + WDi.dismiss(!0),this.coach.stop(),this.tut.active&&(this.tut.stop(),CRi.getInstance().setTutorialMode(!1)),this.scene.stop(),this.tip.hide(),this.fishPanel.visible=!1,this.closeVisitor(),this.depthOnClose=!1,this.closeHub(),this.closeLog(),this.plunder.onHide(),this.tradeUi.onHide(),this.boatMenu.close(),this.boatUi.closeAll(),this.huntUi.closeAll(),RIi.getInstance().active=!1; + for(const t of this.unsub)t(); + this.unsub=[]} + update(){ + this.settleIfAny(),this.render()} + async cycleDepth(){ + const t=RIi.getInstance(),i=t.state,s=fSi.indexOf(i.spot.depth); + for(let e=1; + e<fSi.length; + e++){ + const n=fSi[(s+e)%fSi.length]; + if(tTi(i.gear,{ + ...i.spot,depth:n} + ))continue; + const h=await t.setDepth(n); + return h&&vH.getInstance().showMessage(h),void this.render()} + vH.getInstance().showMessage("다른 깊이는 도구가 더 필요해요")} + static shown(t){ + if(!(null==t?void 0:t.parent))return!1; + for(let i=t; + i; + i=i.parent)if(!i.visible)return!1; + return!0} + static anchorOf(i,s){ + return()=>{ + if(!t.shown(i))return null; + const e=i.getLocalBounds(); + return i.toGlobal({ + x:e.x+e.width/2,y:s?e.y+e.height+2:e.y-2} + )} + } + previewTip(i){ + const s=t.anchorOf,e=Qt(i=>i&&t.shown(i)?i:this.netChip,"or"),n={ + bite:[t.BITE_TIP,()=>this.toGlobal({ + x:this.scene.floatX,y:this.scene.floatY-62} + ),!1],sail:[t.SAIL_TIP,s(this.scene.boatSprite,!1),!1],rod:[t.ROD_TIP,s(this.scene.rodBalloonView.visible?this.scene.rodBalloonView:this.scene.boatSprite,!1),!1],net:["잡은 물고기는 어망에 담겨요",s(this.netChip,!0),!0],sell:["누르면 어망으로 가요",s(e(this.netSellBtn),!0),!0],next:["누르면 할 일로 바로 가요",s(e(this.journeyBox),!0),!0],move:["이동을 누르고 갈 물을 눌러요",s(e(this.scene.modeBtn),!1),!1],depth:["누르면 물 깊이가 바뀌어요",s(this.depthBtn,!0),!0],card:[t.CARD_TIP,s(e(this.hud.stripCell()??void 0),!0),!0]} + ,[h,r,o]=n[i]; + this.coach.show(i,h,r,o,CRi.BLEED_W)} + dismissTip(){ + this.coach.dismiss()} + tutorialDue(){ + const i=RIi.getInstance(),s=i.state; + if(!s||!i.look||t.previewing||this.tutPreviewing)return!1; + const e=i.startRace(),n=i.qlog(); + return"R"===s.spot.zone&&s.spot.race===e&&qCi({ + tutSeen:i.tipSeen("tut"),look:!0,dex:i.dexCount(),journeyStep:n.done.length,accepted:n.held.length>0} + )} + tutorialCheck(){ + if(this.tut.active||!this.tutorialDue())return; + const t=RIi.getInstance(),i=t.state; + CRi.getInstance().activePage!==this||Jxi.isOpen||vxi.getInstance().parent||this.scene.mapKey===`${ + i.spot.race} + |${ + i.spot.zone} + `&&this.scene.boatPos&&this.startTutorial(t.startRace())} + startTutorial(t){ + this.tutRace=t,this.closeHub(),this.closeVisitor(),this.fishPanel.visible=!1,this.tip.hide(),this.coach.dismiss(),this.plunder.closePeek(),CRi.getInstance().setTutorialMode(!0),this.layout(),this.tut.start(t)} + endTutorial(t){ + var i; + CRi.getInstance().setTutorialMode(!1),this.layout(),this.greeted=!0,this.quietAfterTut=!0,this.tutPreviewing&&(this.tutPreviewing=!1,this.tutBackend=this.realTutBackend,null==(i=this.onTutorialPreviewEnd)||i.call(this)),this.syncJourney(),this.scene.sailToHub(t)||this.openHub(t,this.scene.hubNear(t))} + previewTutorial(t){ + this.tut.active&&(this.tut.stop(),CRi.getInstance().setTutorialMode(!1)); + let i=-1,s=!1; + const e=Qt(()=>performance.now(),"now"),n=Qt(()=>i+4e3/RGi.speed,"at"),h=rAi/RGi.speed,r=Qt((t=0)=>i>=0&&!s&&e()>=n()&&e()<n()+h+t,"open"); + this.tutPreviewing=!0,this.tutBackend={ + biteOpen:Qt(()=>r(),"biteOpen"),hookable:Qt(()=>r(2e3),"hookable"),biteIn:Qt(()=>i>=0&&!s?n()-e():1/0,"biteIn"),hook:Qt(async()=>{ + s=!0; + const t=RIi.getInstance(),i=t.state,e=gTi({ + ...i.spot,point:this.scene.pointNow} + ,t.now(),i.gear,null)??gTi(i.spot,t.now(),i.gear,null); + return e&&this.pop({ + ...e,broken:!1,manual:!0} + ,!0),e?null:"물고기가 없어요"} + ,"hook"),recast:Qt(()=>{ + i=e(),s=!1} + ,"recast"),onCast:Qt(()=>{ + i=e(),s=!1} + ,"onCast"),finish:Qt(()=>{ + } + ,"finish")} + ,this.startTutorial(t)} + showAutoTag(t=0){ + const i=this.scene.boatPos,s=this.scene.world; + if(!i||!s)return; + MR.killTweensOf(this.autoTag),this.autoTag.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const e=mki("자동으로 잡았어요",16106577,QIi,12,9); + this.autoTag.addChild(e),this.autoTag.position.set(s.x+i.x-e.width/2,s.y+i.y-64-e.height-6),this.autoTag.alpha=0,MR.timeline({ + delay:t} + ).to(this.autoTag,{ + alpha:1,y:this.autoTag.y-6,duration:.15} + ).to(this.autoTag,{ + alpha:0,duration:.2,delay:1.05} + )} + coachCheck(){ + var i; + const s=RIi.getInstance(),e=s.state,n=this.coach; + if(t.previewing||this.tut.active||this.tutPreviewing||this.quietAfterTut)return; + if(n.visible)return void("bite"!==n.id||this.bite.visible||n.dismiss()); + if(Jxi.isOpen||!s.look&&!Jxi.skipped)return; + if(this.tutorialDue())return; + if(this.scene.mapKey!==`${ + e.spot.race} + |${ + e.spot.zone} + `)return; + if(vxi.getInstance().parent||this.hubPanel.visible||this.logPanel.visible||this.visitorPanel.visible||this.fishPanel.visible)return; + if(WDi.pending||this.fxCatch.visible||this.plunder.panelOpen||this.boatUi.panelOpen||this.huntUi.panelOpen||this.tradeUi.panelOpen||this.boatMenu.isOpen||this.scene.bigMapOpen)return; + const h=CRi.BLEED_W,r=Qt((i,e,r,o)=>{ + n.show(i,e,t.anchorOf(r,o),o,h),s.markTip(i)} + ,"show"),o=s.qlog(),a=s.questHeld().some(t=>"meet"===t.def.kind); + if(!s.tipSeen("bite")&&this.bite.visible&&((null==(i=s.biteOpen())?void 0:i.left)??0)>=t.BITE_TIP_MIN_LEFT)r("bite",t.BITE_TIP,this.bite,!1); + else if(!s.tipSeen("sail")&&this.scene.idleInSail)n.show("sail",t.SAIL_TIP,this.sailTipAnchor,!1,h),s.markTip("sail"); + else if(!s.tipSeen("rod")&&this.scene.rodShown)r("rod",t.ROD_TIP,this.scene.rodBalloonView,!1); + else if(!s.tipSeen("net")&&Object.keys(e.dex).length>0&&t.shown(this.netChip))r("net","잡은 물고기는 어망에 담겨요",this.netChip,!0); + else if(!s.tipSeen("sell")&&t.shown(this.netSellBtn)&&s.netCount()>=s.netCap/2)r("sell","누르면 어망으로 가요",this.netSellBtn,!0); + else if(!s.tipSeen("next")&&o.done.length>=1&&t.shown(this.journeyBox))r("next","누르면 할 일로 바로 가요",this.journeyBox,!0); + else if(!s.tipSeen("move")&&a){ + const i=this.scene.modeBtn; + t.shown(i)&&r("move","이동을 누르고 갈 물을 눌러요",i,!1)} + else!s.tipSeen("card")&&s.questHeld().some(t=>"fish"===t.def.kind&&!t.ready)&&t.shown(this.hud.stripCell()??void 0)&&r("card",t.CARD_TIP,this.hud.stripCell(),!0)} + render(){ + var t; + this.tutorialCheck(),this.coachCheck(); + const i=RIi.getInstance(),s=i.state,e=s.spot,n=i.now(); + this.scene.rodHold=this.tut.active?this.tut.rodHold:!i.tipSeen("sail")||this.coach.visible&&"sail"===this.coach.id; + const h=PSi(n),r=tTi(s.gear,e)??i.boatProblem(),o=this.tut.active?this.tutBackend:null,a=r?null:o?o.biteOpen()?{ + } + :null:i.biteOpen(),c=r?1/0:o?o.biteIn():i.biteIn(),l=this.tutPreviewing?{ + ...e,point:this.scene.pointNow} + :e; + this.scene.update(l,h,performance.now()-this.t0,!!a&&!this.scene.sailing,c,s.gear),i.othersAt!==this.othersAt&&(this.othersAt=i.othersAt,this.scene.setOthers(i.others)); + const u=(null==(t=i.crowd)?void 0:t[e.point])??FSi(e.race,e.zone,e.point,n); + this.hud.update({ + now:n,spot:e,problem:r,crowd:u,net:i.netCount(),netCap:i.netCap,wanted:this.progressHeld?this.lastWanted:this.lastWanted=this.wantedList()} + ),this.drawNetFull(); + let d=this.hud.bandRight+6; + for(const g of[this.boatUi.chip,this.huntUi.chip,this.netSellBtn])g.position.set(d,this.hud.bandY),g.visible&&(d+=g.width+6); + this.biteMark.texture===as.EMPTY&&(this.biteMark.texture=nAi.gear().bubbles[0]),this.bite.position.set(this.scene.floatX,this.scene.floatY-30); + const f=!!a&&!this.scene.sailing; + f&&!this.bite.visible&&MR.fromTo(this.bite.scale,{ + x:.3,y:.3} + ,{ + x:1,y:1,duration:.22,ease:"back.out(4)"} + ),this.bite.visible=f,this.fishPanel.visible&&this.renderFishPanel(); + const p=`${ + e.race} + |${ + e.zone} + `; + p!==this.visitorSpot&&(this.visitorSpot=p,this.closeVisitor(),this.closeHub()),this.syncVisitors(),this.syncJourney(),this.plunder.update(),this.boatUi.update(),this.huntUi.update(),this.tradeUi.update(),this.scene.speedBonus=i.gearStats().speed,this.scene.modeBtnHidden=this.hubPanel.visible||this.logPanel.visible||this.visitorPanel.visible} + renderFishPanel(){ + const t=RIi.getInstance(),i=t.state,s=t.now(),e=t.gearStats(),n=oTi(i.spot,s,i.gear,i.bait,e.star+e.luck).sort((t,i)=>i.w-t.w); + this.candPool=n; + const h=n.reduce((t,i)=>t+i.w,0)||1; + this.candCount.text=`발견 ${ + n.filter(t=>i.dex[t.s.id]).length} + /${ + n.length} + `,this.candCount.x=this.candTitle.x+this.candTitle.width+10; + const r=CRi.BLEED_W; + for(; + this.candCards.length<n.length; + ){ + const t=this.candCards.length,i=new lki(jGi,!0); + i.eventMode="static",i.cursor="pointer",i.hitArea=new Ui(0,0,jGi,jGi),i.on("pointertap",i=>{ + i.stopPropagation(),this.toggleTip(t)} + ); + const s=new Ve; + this.fishPanel.addChildAt(i,this.fishPanel.getChildIndex(this.tip)),this.fishPanel.addChildAt(s,this.fishPanel.getChildIndex(this.tip)),this.candCards.push(i),this.candBadges.push(s)} + const o=Math.min(7,Math.max(1,n.length)),a=o>1?Math.min(12,(r-32-o*jGi)/(o-1)):0; + this.candCards.forEach((t,s)=>{ + const e=n[s],h=this.candBadges[s]; + if(t.visible=h.visible=!!e,!e)return; + t.set(e.s.id,e.s.star,0,!i.dex[e.s.id]),t.position.set(16+s%o*(jGi+a),56+82*Math.floor(s/o)); + const r=$Si(e.s); + h.label!==r&&(h.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),h.label=r,r&&h.addChild(mki(r,16777215,ski[e.s.star],10,5))),h.position.set(t.x+(jGi-h.width)/2,t.y-8)} + ); + const c=Math.ceil(n.length/o); + this.candMore.position.set(16,56+82*c+4); + const l=n.filter(t=>t.s.star>=3).reduce((t,i)=>t+i.w/h*100,0); + this.candMore.text=n.length?(l>0?`희귀 어종 출현 확률 ${ + l.toFixed(1)} + %`:"다른 물때와 깊이에서 희귀 어종을 찾아보세요.")+" · 카드를 누르면 정보가 보여요":"이 물때에는 만날 수 있는 물고기가 없어요.",oki(this.candMore,r-32); + const u=this.candMore.y+this.candMore.height+16; + this.panelBg.clear().rect(0,0,r,this.H).fill({ + color:526346,alpha:.5} + ).roundRect(0,0,r,u,12).fill({ + color:QIi,alpha:.95} + )} + toggleTip(t){ + const i=this.candPool[t],s=this.candCards[t]; + if(!i||!s)return; + if(this.tip.visible&&this.tip.forId===i.s.id)return void this.tip.hide(); + const e=RIi.getInstance().state,n=e.dex[i.s.id],h=i.s,r=this.candPool.reduce((t,i)=>t+i.w,0)||1,o=$Si(h),a=ZSi(h,e.spot),c=a>XSi(e.gear); + this.tip.show(h.id,[`${ + n?h.name:"???"} + ★${ + h.star} + ${ + o?` · ${ + o} + `:""} + `,`${ + "O"===h.zone&&"B"===h.depth?"심해":gSi[h.depth]} + · ${ + "전체"===h.tide?"모든 물때":`${ + h.tide} + 물때`} + · 힘 ${ + a} + ${ + c?" (줄이 약해요)":""} + `,`지금 확률 ${ + (i.w/r*100).toFixed(1)} + % · ${ + h.kind} + `,n?`잡은 수 ${ + n.count} + · 최고 ${ + _Ti(n.bestKg)} + `:"아직 못 잡았어요"],[KIi,c?XIi:zIi,zIi,n?VIi:YIi],s.x+34,s.y+jGi,!1)} + pop(t,i){ + const s=this.scene.playCatch(t,i,RIi.getInstance().state.gear); + if(this.progressHoldUntil=Math.max(this.progressHoldUntil,performance.now()+1e3*s),MR.delayedCall(s+.02,()=>{ + this.parent&&!this.progressHeld&&(this.renderTracker(),this.render())} + ),this.tut.onCatch(t,i,s),t.broken)return; + if(t.manual||this.showAutoTag(s),WDi.release(),i)return void WDi.show(this.popLayer,{ + tex:nAi.fish(t.id),name:kSi(t.id).name,star:t.star,grade:t.grade??0,kg:t.kg,dex:RIi.getInstance().dexCount()} + ,CRi.BLEED_W/2,Math.max(150,Math.min(300,.3*this.H)),s+.05,()=>{ + qG.getInstance().playSFX(qG.SFX_TRUMPET,.6),jG("success"),this.fxCatch.visible=!0} + ,{ + onEnd:Qt(()=>{ + WDi.active||(this.fxCatch.visible=!1)} + ,"onEnd")} + ); + if(t.star<4)return; + const e=new lki(84); + e.set(t.id,t.star,t.grade??0,!1); + const n=rki(`${ + kSi(t.id).name} + ${ + _Ti(t.kg)} + `,VIi,16),h=new Ve; + h.eventMode="none",h.addChild(e,n),oki(n,300),n.position.set((84-n.width)/2,88),h.pivot.set(42,42),h.position.set(CRi.BLEED_W/2,130),h.alpha=0,this.popLayer.addChild(h),MR.timeline({ + delay:s+.1,onComplete:Qt(()=>{ + h.destroy({ + children:!0} + )} + ,"onComplete")} + ).set(h,{ + alpha:1} + ).fromTo(h.scale,{ + x:.3,y:.3} + ,{ + x:1,y:1,duration:.28,ease:"back.out(2)"} + ,0).to(h,{ + alpha:0,y:118,duration:.4} + ,2.1)} + } + ; + Qt(YGi,"FishingMainPage"),Zt(YGi,"instance"),Zt(YGi,"previewing",!1),Zt(YGi,"BITE_TIP","지금! 눌러요"),Zt(YGi,"SAIL_TIP","물을 누르면 배가 그곳으로 가요"),Zt(YGi,"CARD_TIP","물고기를 누르면 사는 곳·깊이·시간대가 나와요"),Zt(YGi,"ROD_TIP","낚싯대를 누르면 낚시를 시작해요"),Zt(YGi,"BITE_TIP_MIN_LEFT",900); + let qGi=YGi; + const XGi=Object.freeze(Object.defineProperty({ + __proto__:null,FishingMainPage:qGi} + ,Symbol.toStringTag,{ + value:"Module"} + )),JGi=CRi.CONTENT_W,QGi=(JGi-16)/3,ZGi=class extends Ve{ + constructor(){ + super(),Zt(this,"bg",new ip),Zt(this,"nameText",rki("",KIi,15)),Zt(this,"sub",rki("",zIi,12,!1)),Zt(this,"crowd",new Ve),Zt(this,"crowdText",rki("",zIi,11)),Zt(this,"bar",new ip),Zt(this,"fish",new lki(42)),Zt(this,"badge",new Ve),Zt(this,"onTap",null),this.bg.eventMode="none",this.bar.eventMode="none"; + const t=yki("people",14,YIi); + this.crowd.addChild(t,this.crowdText),this.crowdText.position.set(17,-1),this.addChild(this.bg,this.bar,this.nameText,this.sub,this.crowd,this.fish,this.badge),this.nameText.position.set(10,9),this.sub.position.set(10,33),this.crowd.position.set(10,60),this.fish.position.set(QGi-42-8,24),this.eventMode="static",this.cursor="pointer",this.hitArea=new Ui(0,0,QGi,84),this.on("pointertap",t=>{ + var i; + t.stopPropagation(),null==(i=this.onTap)||i.call(this)} + )} + set(t){ + var i; + this.bg.clear().roundRect(.5,.5,QGi-1,83,10).fill(t.unknown?QIi:t.current?UIi:GIi).stroke({ + color:t.current?VIi:WIi,width:t.current?2:1} + ),this.nameText.textColor=t.unknown?YIi:KIi,this.crowd.visible=!t.unknown; + const s=t.fish?QGi-42-24:QGi-20; + this.nameText.text=t.name,oki(this.nameText,t.unknown?QGi-20:s),this.sub.text=t.sub,oki(this.sub,t.unknown?QGi-20:s),this.crowdText.text=`${ + t.crowd} + 명`,this.bar.clear(),t.unknown||vki(this.bar,58,66,s-50,5,t.live?t.known/t.live:0,t.known>=t.live?qIi:6012341),this.fish.visible=!!t.fish,this.badge.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),t.current?this.badge.addChild(mki("낚시 중",jIi,VIi,10,6)):(null==(i=t.fish)?void 0:i.tag)&&this.badge.addChild(mki(t.fish.tag,16777215,ski[t.fish.star],10,5)),this.badge.position.set(QGi-this.badge.width-6,5),t.fish&&this.fish.set(t.fish.id,t.fish.star,0,!t.fish.known)} + } + ; + Qt(ZGi,"PointCard"); + let tBi=ZGi; + const iBi={ + "인간":"인간 왕국","엘프":"엘프 숲","언데드":"언데드 늪","오크":"오크 설원"} + ,sBi=420,eBi=96,nBi=class t extends Ve{ + constructor(){ + super(),Zt(this,"tabId","fish"),Zt(this,"onBack",null),Zt(this,"race","인간"),Zt(this,"zone","R"),Zt(this,"view","world"),Zt(this,"back",new pki("‹ 낚시로",110,38,14)),Zt(this,"titleText",rki("해도",KIi,20)),Zt(this,"worldView",new Ve),Zt(this,"worldImg",new Ye(as.EMPTY)),Zt(this,"worldPins",new Ve),Zt(this,"worldHint",rki("",zIi,13,!1)),Zt(this,"regionView",new Ve),Zt(this,"regionImg",new Ye(as.EMPTY)),Zt(this,"regionFog",new Ye(as.EMPTY)),Zt(this,"regionTerr",new Ye(as.EMPTY)),Zt(this,"terrCanvas",document.createElement("canvas")),Zt(this,"terrTex",null),Zt(this,"regionMarks",new Ve),Zt(this,"regionTitle",rki("",KIi,17)),Zt(this,"regionDex",rki("",zIi,12)),Zt(this,"regionGate",rki("",zIi,12)),Zt(this,"cards",[]),Zt(this,"foot",rki("수역은 스팟 둘레의 넓은 물이에요. 배로 새 수역에 들어가면 지도에 드러나요. 회유어(★4)는 날마다 UTC 0시에 몇몇 수역 중 한 곳으로 옮겨요.",YIi,12,!1)),Zt(this,"pulse",0),this.back.setPrimary(!1),this.back.onTap=()=>{ + var t; + "region"===this.view?this.showWorld():null==(t=this.onBack)||t.call(this)} + ,this.titleText.position.set(126,6),this.addChild(this.back,this.titleText); + const t=Math.round(.75*JGi); + this.worldImg.position.set(0,50),this.worldImg.eventMode="none"; + const i=(new ip).roundRect(0,50,JGi,t,14).fill(16777215); + this.worldImg.mask=i,this.worldPins.position.set(0,50),this.worldHint.position.set(4,50+t+12),this.worldHint.setWrapWidth(JGi-8),this.worldView.addChild(this.worldImg,i,this.worldPins,this.worldHint),this.regionTitle.position.set(4,52),this.regionDex.y=56,this.regionGate.y=56; + const s=(JGi-sBi)/2; + this.regionImg.position.set(s,eBi),this.regionImg.width=this.regionImg.height=sBi,this.regionImg.eventMode="none"; + const e=(new ip).roundRect(s,eBi,sBi,sBi,14).fill(16777215); + this.regionImg.mask=e,this.regionFog.position.set(s,eBi),this.regionFog.eventMode="none",this.regionTerr.position.set(s,eBi),this.regionTerr.eventMode="none"; + const n=(new ip).roundRect(s,eBi,sBi,sBi,14).fill(16777215); + this.regionTerr.mask=n; + const h=(new ip).roundRect(s,eBi,sBi,sBi,14).fill(16777215); + this.regionFog.mask=h,this.regionMarks.position.set(s,eBi),this.regionView.addChild(this.regionTitle,this.regionDex,this.regionGate,this.regionImg,e,this.regionFog,h,this.regionTerr,n,this.regionMarks); + for(let r=0; + r<9; + r++){ + const t=new tBi; + t.position.set(r%3*(QGi+8),530+92*Math.floor(r/3)),t.onTap=()=>{ + this.tapPoint(this.zone,r,t)} + ,this.regionView.addChild(t),this.cards.push(t)} + this.foot.setWrapWidth(JGi-8),this.foot.position.set(4,812),this.regionView.addChild(this.foot)} + static getInstance(){ + return this.instance??(this.instance=new t)} + closeOne(){ + var t; + return"region"===this.view?this.showWorld():null==(t=this.onBack)||t.call(this),!0} + onShow(){ + const t=RIi.getInstance().state; + this.race=t.spot.race,this.zone=t.spot.zone,this.showWorld()} + onHide(){ + } + update(){ + if("world"!==this.view)return; + this.pulse+=.25; + const t=this.worldPins.getChildByLabel("here"); + t&&(t.scale.set(1+.12*Math.sin(this.pulse)),t.alpha=.75+.25*Math.sin(this.pulse))} + showWorld(){ + this.view="world",this.titleText.text="해도",this.back.setText("‹ 낚시로"),this.removeChild(this.regionView),this.addChild(this.worldView),nAi.worldMap().then(t=>{ + this.worldImg.texture=t,this.worldImg.width=JGi,this.worldImg.height=Math.round(.75*JGi)} + ),this.renderWorld(),CRi.getInstance().resetScroll()} + renderWorld(){ + const t=RIi.getInstance().state,i=nAi.world(),s=Math.round(.75*JGi); + this.worldPins.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + for(const n of uSi){ + const[t,e]=i.labels[n]??[.5,.5],h=mki(iBi[n],16777215,hki[n],12,8); + h.alpha=.92,h.position.set(t*JGi-h.width/2,e*s-h.height/2),h.eventMode="none",this.worldPins.addChild(h)} + for(const n of uSi)for(const e of dSi){ + const h=`${ + n} + |${ + e} + `,r=i.pins[h]; + if(!r)continue; + const o=t.spot.race===n&&t.spot.zone===e,a=new Ve; + if(a.position.set(r[0]*JGi,r[1]*s),o){ + const t=(new ip).circle(0,0,17).stroke({ + color:VIi,width:3} + ); + t.label="here",t.position.set(r[0]*JGi,r[1]*s),t.eventMode="none",this.worldPins.addChild(t)} + const c=(new ip).circle(0,0,11).fill(hki[n]).circle(0,0,11).stroke({ + color:16777215,width:2.5} + ),l=rki(pSi[e][0],16777215,11); + l.position.set(-l.width/2,-l.height/2-1); + const u=mki(vSi[h],16777215,o?8018448:QIi,11,6); + u.alpha=.9,u.position.set(-u.width/2,14),a.addChild(c,l,u),a.eventMode="static",a.cursor="pointer",a.hitArea=new Ui(-Math.max(28,u.width/2),-24,Math.max(56,u.width),58),a.on("pointertap",t=>{ + t.stopPropagation(),this.showRegion(n,e)} + ),this.worldPins.addChild(a)} + const e=`${ + iBi[t.spot.race]} + · ${ + pSi[t.spot.zone]} + · ${ + RSi(t.spot.race,t.spot.zone,t.spot.point)} + `; + this.worldHint.text=`지역을 누르면 그 지역의 낚시터를 골라요 · 지금: ${ + e} + `} + showRegion(t,i){ + this.view="region",this.race=t,this.zone=i,this.titleText.text=iBi[t],this.back.setText("‹ 전체 지도"),this.removeChild(this.worldView),this.addChild(this.regionView),this.regionImg.texture=FDi.regionMap(`${ + t} + |${ + i} + `),this.regionImg.width=this.regionImg.height=sBi; + const s=this.regionFog.texture,e=FDi.regionFog(`${ + t} + |${ + i} + `); + this.regionFog.texture=e??as.EMPTY,this.regionFog.visible=!!e,e&&(this.regionFog.width=this.regionFog.height=sBi),s!==as.EMPTY&&s.destroy(!0),this.render(),CRi.getInstance().resetScroll(),MR.fromTo(this.regionView,{ + alpha:0} + ,{ + alpha:1,duration:.18} + )} + async tapPoint(t,i,s){ + var e; + const n=RIi.getInstance(); + if(!this.pointKnown(t,i))return vH.getInstance().showMessage("아직 못 찾은 곳이에요 · 배를 몰아 찾아가 보세요"),void MR.fromTo(s,{ + x:s.x-6} + ,{ + x:s.x,duration:.3,ease:"elastic.out(1.2, 0.3)"} + ); + const h=await n.moveTo(this.race,t,i); + if(h)return vH.getInstance().showMessage(h),void MR.fromTo(s,{ + x:s.x-6} + ,{ + x:s.x,duration:.3,ease:"elastic.out(1.2, 0.3)"} + ); + qG.getInstance().playSFX(qG.SFX_POPUP),YRi.active||vH.getInstance().showMessage(`${ + RSi(this.race,t,i)} + (으)로 옮겼어요`),null==(e=this.onBack)||e.call(this)} + pointKnown(t,i){ + const s=RIi.getInstance().state.spot,e=s.race===this.race&&s.zone===t?s.point:-1; + return WTi.pointKnown(`${ + this.race} + |${ + t} + `,i,e)} + render(){ + var t; + const i=RIi.getInstance(),s=i.state,e=i.now(),n=DSi(e),h=this.zone; + this.regionTitle.text=`${ + pSi[h]} + · ${ + vSi[`${ + this.race} + |${ + h} + `]} + `; + const r=OSi.filter(t=>t.race===this.race&&t.zone===h); + this.regionDex.text=`도감 ${ + r.filter(t=>s.dex[t.id]).length} + /${ + r.length} + `,this.regionDex.x=this.regionTitle.width+14; + const o=tTi(s.gear,{ + race:this.race,zone:h,depth:"M"} + ),a=s.gear.boat<DAi.ENTRY[h]; + this.regionGate.text=o?`잠김 · ${ + o} + `:`${ + lSi(this.race,h)} + ${ + "O"===h?` · 바닥은 ${ + WSi.find(t=>"reel"===t.key).names[4]} + `:""} + `,this.regionGate.textColor=o||a?XIi:s.gear.boat<UAi[FAi(this.race,h)-1]?16757611:zIi,this.regionGate.position.x=JGi-this.regionGate.width-4; + const c=`${ + this.race} + |${ + h} + `,l=nAi.topdownInfo(c),u=sBi/Math.max(l.w,l.h),d=s.spot.race===this.race&&s.spot.zone===h?s.spot.point:-1,f=sNi.get(c); + this.regionTerr.visible=!!f,f&&(sNi.paint(this.terrCanvas,f,t=>this.pointKnown(h,t),d,VIi),this.terrTex&&this.terrTex.width===this.terrCanvas.width&&this.terrTex.height===this.terrCanvas.height?this.terrTex.source.update():(null==(t=this.terrTex)||t.destroy(!0),this.terrTex=as.from(this.terrCanvas),this.terrTex.source.scaleMode="linear"),this.regionTerr.texture=this.terrTex,this.regionTerr.width=f.cols*f.tile*u,this.regionTerr.height=f.rows*f.tile*u),this.regionMarks.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),l.points.forEach((t,i)=>{ + if(!this.pointKnown(h,i))return; + const e=s.spot.race===this.race&&s.spot.zone===h&&s.spot.point===i,n=new Ve; + n.position.set(t.x*u,t.y*u); + const r=e?VIi:16777215; + n.addChild((new ip).circle(0,0,6).fill(r).circle(0,0,6).stroke({ + color:QIi,width:2} + )); + const o=mki(RSi(this.race,h,i),e?jIi:16777215,e?VIi:QIi,10,5); + o.alpha=.9,o.position.set(-o.width/2,-28),n.addChild(o),n.eventMode="static",n.cursor="pointer",n.hitArea=new Ui(-Math.max(24,o.width/2),-38,Math.max(48,o.width),52),n.on("pointertap",t=>{ + t.stopPropagation(),this.tapPoint(h,i,this.cards[i])} + ),this.regionMarks.addChild(n)} + ); + const p=RIi.getInstance().areaRows(this.race,h); + for(let g=0; + g<this.cards.length; + g++){ + const t=rTi(this.race,h,g,n),i=p[g],r=t.filter(t=>t.zone===h&&!t.roam&&t.star>=2).sort((t,i)=>i.star-t.star||t.pts.length-i.pts.length)[0],a=s.spot.race===this.race&&s.spot.zone===h&&s.spot.point===g,c=t.filter(t=>s.dex[t.id]).length; + this.cards[g].alpha=o?.5:1; + const l=this.pointKnown(h,g); + this.cards[g].set(l?{ + name:RSi(this.race,h,g),sub:`난이도 ${ + QSi({ + zone:h,point:g} + )} + · 수역 도감 ${ + i.have} + /${ + i.need} + ${ + i.claimed?" · ✓ 클리어":i.ready?" · 진주 받기":""} + `,crowd:FSi(this.race,h,g,e),known:c,live:t.length,current:a,fish:r?{ + id:r.id,star:r.star,known:!!s.dex[r.id],tag:r.star>=3?"명물":""} + :null} + :{ + name:`${ + g+1} + 번 · 아직 못 찾은 곳`,sub:"배로 찾아가면 드러나요",crowd:0,known:0,live:0,current:!1,unknown:!0,fish:null} + )} + } + } + ; + Qt(nBi,"FishingMapPage"),Zt(nBi,"instance"); + let hBi=nBi; + const rBi=[{ + main:10119740,dark:6176032,light:13803626,gem:8378016} + ,{ + main:11565626,dark:7030048,light:15250538,gem:6014660} + ,{ + main:11122367,dark:6056821,light:15331829,gem:9422847} + ,{ + main:14723118,dark:9067792,light:16769162,gem:16739211} + ,{ + main:5222030,dark:2252876,light:11858136,gem:16106577} + ]; + function oBi(t,i,s){ + const e=rBi[s%5],n={ + color:e.dark,width:3} + ; + switch(i){ + case"prow":if(t.moveTo(40,112).quadraticCurveTo(30,70,58,46).lineTo(74,56).quadraticCurveTo(56,78,62,112).closePath().fill(e.main).stroke(n),t.circle(72,40,22).fill(e.main).stroke(n),t.circle(80,36,4).fill(e.dark),0===s)for(let i=0; + i<5; + i++)t.circle(54+3*i,26+6*i,7).fill(e.light); + 1===s&&t.poly([86,52,106,48,92,62]).fill(e.light).stroke(n),2===s&&t.poly([66,18,60,2,74,16]).fill(e.light).poly([80,20,84,4,88,22]).fill(e.light),3===s&&t.poly([92,40,110,44,92,48]).fill(e.light).stroke(n),4===s&&t.ellipse(72,22,14,6).fill(e.light),t.circle(48,92,5).fill(e.gem); + break; + case"compass":t.circle(64,64,46).fill(e.dark).circle(64,64,40).fill(e.main).circle(64,64,32).fill(16052192); + for(let i=0; + i<8; + i++){ + const s=i/8*Math.PI*2; + t.moveTo(64+26*Math.cos(s),64+26*Math.sin(s)).lineTo(64+31*Math.cos(s),64+31*Math.sin(s)).stroke({ + color:e.dark,width:2} + )} + if(t.poly([64,34,70,64,64,94,58,64]).fill(12866111).poly([64,64,70,64,64,94,58,64]).fill(4085088),t.circle(64,64,4).fill(e.light),t.circle(64,14,7).fill(e.main).stroke(n),s>=2&&t.circle(64,64,2.5).fill(e.gem),3===s&&t.rect(40,100,48,8).fill(e.dark),4===s)for(let i=0; + i<4; + i++)t.circle(64+44*Math.cos(1.57*i),64+44*Math.sin(1.57*i),4).fill(e.gem); + break; + case"deck":for(let i=0; + i<4; + i++){ + const s=22+22*i; + t.roundRect(16,s,96,19,4).fill(i%2?e.main:e.light).stroke({ + color:e.dark,width:2} + ),t.circle(26,s+9.5,2.5).fill(e.dark).circle(102,s+9.5,2.5).fill(e.dark)} + 1===s&&t.rect(16,50,96,6).fill({ + color:6056821,alpha:.8} + ),2===s&&t.ellipse(64,64,30,10).fill({ + color:16052192,alpha:.7} + ),3===s&&t.rect(60,22,8,85).fill({ + color:e.dark,alpha:.6} + ),4===s&&t.circle(96,30,7).fill(e.gem).circle(36,96,5).fill(e.gem); + break; + case"anchor":t.circle(64,22,11).stroke({ + color:e.main,width:7} + ),t.rect(59,30,10,66).fill(e.main).stroke(n),t.rect(40,42,48,9).fill(e.main).stroke(n),t.moveTo(22,74).quadraticCurveTo(28,110,64,108).quadraticCurveTo(100,110,106,74).stroke({ + color:e.main,width:9} + ),t.poly([16,78,28,66,30,82]).fill(e.main).poly([112,78,100,66,98,82]).fill(e.main),2===s&&t.circle(64,60,7).fill(16052192).circle(61,58,1.5).fill(1254955).circle(67,58,1.5).fill(1254955),3===s&&t.moveTo(64,96).lineTo(64,118).stroke({ + color:e.main,width:6} + ),4===s&&t.circle(64,74,5).fill(e.gem),1===s&&t.rect(56,30,16,8).fill(e.dark); + break; + case"toolbox":t.roundRect(18,50,92,56,8).fill(e.main).stroke(n),t.roundRect(18,50,92,14,6).fill(e.dark),t.moveTo(48,50).lineTo(48,36).lineTo(80,36).lineTo(80,50).stroke({ + color:e.dark,width:6} + ),t.roundRect(56,70,16,12,3).fill(e.light),t.moveTo(84,30).lineTo(108,6).stroke({ + color:13226968,width:6} + ).circle(108,8,8).stroke({ + color:13226968,width:5} + ),1===s&&t.rect(24,88,80,6).fill(e.dark),2===s&&t.circle(36,84,6).fill(e.gem).circle(92,84,6).fill(e.gem),3===s&&t.poly([64,88,68,96,60,96]).fill(e.light),4===s&&t.rect(26,96,76,4).fill(e.gem); + break; + case"sail":if(t.rect(30,10,6,108).fill(e.dark),t.moveTo(38,14).quadraticCurveTo(100,40,108,100).lineTo(38,100).closePath().fill(e.light).stroke({ + color:e.dark,width:3} + ),t.moveTo(38,56).quadraticCurveTo(80,64,100,80).stroke({ + color:e.main,width:4} + ),0===s&&t.circle(66,72,6).fill(e.main),1===s&&t.moveTo(38,36).quadraticCurveTo(70,44,90,56).stroke({ + color:e.gem,width:3} + ),2===s&&t.poly([62,60,76,70,66,74,80,88,60,74,70,70]).fill(e.main),3===s)for(let i=0; + i<3; + i++)t.poly(aBi(58+14*i,80-8*i,5)).fill(e.gem); + 4===s&&t.rect(38,86,70,6).fill(e.main),t.poly([30,8,44,4,36,14]).fill(12866111); + break; + case"lantern":{ + const i=[16763210,9431295,10485642,12035839,16752730][s%5]; + t.circle(64,66,40).fill({ + color:i,alpha:.18} + ),t.moveTo(64,6).lineTo(64,20).stroke({ + color:e.dark,width:4} + ).circle(64,10,6).stroke({ + color:e.dark,width:3} + ),t.roundRect(42,20,44,10,3).fill(e.main).stroke(n),t.roundRect(44,30,40,58,8).fill({ + color:16055290,alpha:.55} + ).stroke({ + color:e.main,width:5} + ),t.ellipse(64,62,8,14).fill(i).ellipse(64,66,4,8).fill(16777215),t.roundRect(40,88,48,12,4).fill(e.main).stroke(n),3===s&&t.circle(64,104,5).fill(e.gem),2===s&&t.poly([44,30,38,24,46,26]).fill(e.main).poly([84,30,90,24,82,26]).fill(e.main); + break} + } + } + function aBi(t,i,s){ + const e=[]; + for(let n=0; + n<10; + n++){ + const h=-Math.PI/2+n/10*Math.PI*2,r=n%2?.45*s:s; + e.push(t+Math.cos(h)*r,i+Math.sin(h)*r)} + return e} + function cBi(t){ + const i=AAi(t); + if(!i)return as.EMPTY; + return nAi.boatGearIcon(pAi.indexOf(i.slot),i.v)||tPi(`gear:${ + t} + `,()=>{ + const t=new Ve,s=new ip; + return s.rect(0,0,128,128).fill({ + color:0,alpha:.001} + ),oBi(s,i.slot,i.v),t.addChild(s),t} + )} + function lBi(t){ + return nAi.boatGearIcon(pAi.indexOf(t),5)||tPi(`gearSlot:${ + t} + `,()=>{ + const i=new Ve,s=new ip; + return s.rect(0,0,128,128).fill({ + color:0,alpha:.001} + ),oBi(s,t,2),i.addChild(s),i} + )} + Qt(oBi,"drawIcon"),Qt(aBi,"starPts"),Qt(cBi,"gearIconTex"),Qt(lBi,"gearSlotTex"); + const uBi=16740241; + function dBi(t,i,s,e){ + return t.moveTo(i,s+.9*e).bezierCurveTo(i-1.55*e,s-.05*e,i-.95*e,s-1.3*e,i,s-.45*e).bezierCurveTo(i+.95*e,s-1.3*e,i+1.55*e,s-.05*e,i,s+.9*e)} + Qt(dBi,"heartPath"); + const fBi=class extends Ve{ + constructor(t,i=!1){ + super(),Zt(this,"bg",new ip),Zt(this,"icon",new Ye),Zt(this,"band",new ip),Zt(this,"stars",rki("",VIi,11)),Zt(this,"marks",new Ve),Zt(this,"ring",DIi),this.size=t,this.thinFrame=i,this.eventMode="none",this.icon.anchor.set(.5),this.band.eventMode="none",this.marks.eventMode="none",this.addChild(this.bg,this.icon,this.band,this.stars,this.marks)} + set(t,i,s,e={ + } + ){ + const n=this.size,h=null===t?BIi:LAi[Math.max(1,Math.min(7,i))],r=this.thinFrame?2:Math.max(2,.05*n),o=.2*n,a=Math.max(1,o-r); + if(this.bg.clear(),null!==t&&i>=7&&this.bg.roundRect(-3,-3,n+6,n+6,o+3).fill({ + color:16769126,alpha:.35} + ),this.bg.roundRect(0,0,n,n,o).fill(h).roundRect(r,r,n-2*r,n-2*r,a).fill(null===t?1054234:QIi),null!==t){ + const t=nAi.gearBackground(i); + this.bg.roundRect(r,r,n-2*r,n-2*r,a).fill(t?{ + texture:t,textureSpace:"local"} + :{ + color:h,alpha:.32} + )} + this.icon.texture=null!==t?cBi(t):s?lBi(s):as.EMPTY,this.icon.alpha=null!==t?e.lock?.45:1:.3,this.icon.scale.set(.7*n/(this.icon.texture.frame.width||128)),this.icon.position.set(n/2,.41*n); + const c=Math.round(.22*n),l=n-r-c; + if(this.band.clear(),this.stars.visible=null!==t&&i>0,this.stars.visible){ + const t=n-r,s=n-r; + this.band.moveTo(r,l).lineTo(t,l).lineTo(t,s-a).arcTo(t,s,t-a,s,a).lineTo(r+a,s).arcTo(r,s,r,s-a,a).closePath().fill({ + color:0,alpha:.28} + ),this.stars.text=MTi(i),this.stars.textSize=Math.max(9,Math.round(.15*n)),this.stars.textColor=i>=7?16769126:VIi,oki(this.stars,n-2*r-4),this.stars.position.set((n-this.stars.width)/2,l+(c-this.stars.height)/2)} + this.marks.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const u=Math.max(9,Math.round(.15*n)); + if(null!==t&&(e.on||e.lock)){ + const t=(new ip).circle(u-4,u-4,u+2).fill(this.ring).circle(u-4,u-4,u).fill(e.on?5030794:3816e3); + if(e.on&&t.moveTo(u-4-.45*u,u-4).lineTo(u-4-.1*u,u-4+.35*u).lineTo(u-4+.5*u,u-4-.35*u).stroke({ + color:536604,width:Math.max(2,.24*u),cap:"round",join:"round"} + ),this.marks.addChild(t),e.lock&&!e.on){ + const t=NIi("lock",1.2*u,13092812,2.6); + t.position.set(u-4-.6*u,u-4-.62*u),this.marks.addChild(t)} + } + if(null!==t&&e.pick){ + const t=n-u+4,i=u-4,s=new ip; + "on"===e.pick?s.roundRect(-3,-3,n+6,n+6,o+3).stroke({ + color:VIi,width:3.5} + ).circle(t,i,u+2).fill(this.ring).circle(t,i,u).fill(VIi).moveTo(t-.45*u,i).lineTo(t-.1*u,i+.35*u).lineTo(t+.5*u,i-.35*u).stroke({ + color:jIi,width:Math.max(2,.24*u),cap:"round",join:"round"} + ):s.circle(t,i,u+2).fill(this.ring).circle(t,i,u).fill({ + color:QIi,alpha:.8} + ).circle(t,i,u-1.2).stroke({ + color:zIi,width:2.2} + ),this.marks.addChild(s)} + if(null!==t&&e.kept){ + const t=e.up||e.pick?u-4:n-u+4,i=u-4; + this.marks.addChild(dBi((new ip).circle(t,i,u+2).fill(this.ring).circle(t,i,u).fill(uBi),t,i+.06*u,.5*u).fill(16777215))} + if(e.up){ + const t=n-u+4,i=u-4; + this.marks.addChild((new ip).circle(t,i,u+2).fill(this.ring).circle(t,i,u).fill(15029053).poly([t,i-.45*u,t+.48*u,i+.32*u,t-.48*u,i+.32*u]).fill(16777215))} + } + } + ; + Qt(fBi,"GearCard"); + let pBi=fBi; + const gBi=CRi.CONTENT_W; + function wBi(t,i){ + try{ + qG.getInstance().playSFX(t,i)} + catch{ + } + } + Qt(wBi,"sfx"); + const mBi=Qt((t,i)=>{ + const s=vAi[t].unit; + return`${ + s.endsWith("↓")?"−":"+"} + ${ + Math.round(10*i)/10} + ${ + s.replace("↓","")} + `} + ,"fmt"),vBi=Qt(t=>{ + const i=RIi.getInstance().state.gearBox,s=AAi(t.id),e=new Set(Object.values((null==i?void 0:i.equipped)??{ + } + )); + return((null==i?void 0:i.items)??[]).filter(i=>{ + var n; + return i.star===t.star&&(null==(n=AAi(i.id))?void 0:n.slot)===s.slot&&!e.has(i.uid)} + ).length} + ,"freeSame"),_Bi=class t extends Ve{ + constructor(){ + super(...arguments),Zt(this,"card",new Ve),Zt(this,"shade",null)} + show(){ + var i; + null==(i=t.current)||i.close(),t.current=this,CRi.getInstance().overlay.addChild(this),MR.fromTo(this.card,{ + alpha:0,y:this.card.y+14} + ,{ + alpha:1,y:this.card.y,duration:.18,ease:"power2.out"} + )} + frame(t,i){ + const s=CRi.contentHeight,e=CRi.OVERLAY_PAD,n=!!this.shade; + this.shade||(this.shade=new ip,this.shade.eventMode="static",this.shade.on("pointertap",t=>{ + t.stopPropagation(),queueMicrotask(()=>this.close())} + ),this.eventMode="static",this.addChildAt(this.shade,0),this.card.eventMode="static",this.card.on("pointertap",t=>t.stopPropagation())),this.shade.clear().rect(-e,0,gBi+2*e,s).fill({ + color:0,alpha:HIi} + ); + const h=(new ip).roundRect(0,6,t,i,20).fill({ + color:0,alpha:.35} + ).roundRect(0,0,t,i,20).fill(FIi); + h.eventMode="none",this.card.addChildAt(h,0),this.card.hitArea=new Ui(0,0,t,i); + const r=Math.max(10,(s-i)/2); + this.card.position.set((gBi-t)/2,n?Math.max(10,Math.min(this.card.y,s-i-10)):r),this.card.parent||this.addChild(this.card)} + closeX(t){ + const i=new Ve,s=(new ip).moveTo(14,14).lineTo(30,30).moveTo(30,14).lineTo(14,30).stroke({ + color:zIi,width:3,cap:"round"} + ); + return s.eventMode="none",i.addChild(s),i.position.set(t-52,8),i.eventMode="static",i.cursor="pointer",i.hitArea=new Ui(0,0,44,44),i.on("pointertap",t=>{ + t.stopPropagation(),queueMicrotask(()=>this.close())} + ),i} + close(){ + t.current===this&&(t.current=null),this.destroyed||this.destroy({ + children:!0} + )} + closeOne(){ + return this.close(),!0} + } + ; + Qt(_Bi,"GearOverlay"),Zt(_Bi,"current",null); + let MBi=_Bi; + const bBi=class t extends MBi{ + static open(i){ + RIi.getInstance().state.gear.boat+1<DAi.LEVELS&&new t(i).show()} + constructor(t){ + super(); + const i=RIi.getInstance().state,s=i.gear.boat,e=s+1,n=WSi.find(t=>"boat"===t.key),h=n.prices[e],r=Math.min(gBi-24,520),o=22,a=new Ye(nAi.boatBig(e)); + a.anchor.set(.5),a.scale.set(88/(a.texture.frame.height||384)),a.position.set(62,58); + const c=rki(`다음 배 · ${ + e+1} + 단계`,zIi,15,!1),l=rki(n.names[e],KIi,24); + c.position.set(116,25),l.position.set(116,50),oki(l,r-44-144),this.card.addChild(a,c,l,this.closeX(r)); + const u={ + ...i,gear:{ + ...i.gear,boat:e} + } + ,d=[["기본 내구도",`${ + DAi.MAX_HP[s]} + → ${ + DAi.MAX_HP[e]} + `],["장비 포함 최대 내구도",`${ + iSi(i)} + → ${ + iSi(u)} + `],["장착 가능한 장비",`★${ + CAi(s)} + → ★${ + CAi(e)} + `]],f=e===DAi.ENTRY.C?"연안":e===DAi.ENTRY.O?"대양":""; + f&&d.push(["새로 갈 수 있는 지역",f]); + let p=116; + for(const[v,_]of d){ + const t=rki(v,zIi,16,!1),i=rki(_,VIi,18); + t.position.set(o,p),i.position.set(r-o-i.width,p),oki(t,i.x-o-18),this.card.addChild(t,i,(new ip).moveTo(o,p+34).lineTo(r-o,p+34).stroke({ + color:WIi,width:1} + )),p+=48} + const g=new pki(`${ + h.toLocaleString()} + 골드 · 업그레이드`,r-44,54,18); + g.position.set(o,p+4),g.enabled=i.gold>=h,g.onTap=()=>{ + this.close(),t()} + ; + const w=Math.max(0,h-Math.floor(i.gold)),m=rki(w?`${ + w.toLocaleString()} + 골드 부족 · 보유 ${ + Math.floor(i.gold).toLocaleString()} + `:`보유 골드 ${ + Math.floor(i.gold).toLocaleString()} + `,w?XIi:zIi,15,!1); + oki(m,r-44),m.position.set((r-m.width)/2,p+72),this.card.addChild(g,m),this.frame(r,p+116)} + } + ; + Qt(bBi,"BoatUpgradePanel"); + let yBi=bBi; + const EBi=class t extends MBi{ + static open(i){ + new t(i).show()} + constructor(i){ + super(); + const s=RIi.getInstance().state,e=s.gearBox,n=CAi(s.gear.boat),h=new Set(Object.values((null==e?void 0:e.equipped)??{ + } + )),r=xAi(e,i,n),o=((null==e?void 0:e.items)??[]).filter(t=>{ + var s; + return(null==(s=AAi(t.id))?void 0:s.slot)===i} + ).sort((t,i)=>Number(h.has(i.uid))-Number(h.has(t.uid))||i.star-t.star||t.uid-i.uid),a=Math.min(gBi-24,520),c=Math.floor((a-40-48)/5),l=new Ye(lBi(i)); + l.anchor.set(.5),l.scale.set(44/(l.texture.frame.width||128)),l.position.set(42,42); + const u=rki(SAi[i],KIi,22),d=mki(`${ + o.length} + `,zIi,$Ii,14,9); + u.position.set(74,28),d.position.set(u.x+u.width+10,32),this.card.addChild(l,u,d,this.closeX(a)); + let f=84; + if(o.length){ + if(o.slice(0,t.MAX).forEach((t,e)=>{ + var o,a; + const l=new pBi(c); + l.ring=FIi,l.set(t.id,t.star,void 0,{ + on:h.has(t.uid),lock:!h.has(t.uid)&&t.star>n,up:(null==r?void 0:r.uid)===t.uid,kept:!!(null==(a=null==(o=s.gearBox)?void 0:o.kept)?void 0:a.includes(t.uid))} + ),l.position.set(20+e%5*(c+12),f+Math.floor(e/5)*(c+12)),l.eventMode="static",l.cursor="pointer",l.hitArea=new Ui(0,0,c,c),l.on("pointertap",s=>{ + s.stopPropagation(),queueMicrotask(()=>TBi.open(t,i))} + ),this.card.addChild(l)} + ),f+=Math.ceil(Math.min(o.length,t.MAX)/5)*(c+12)-12,o.length>t.MAX){ + const t=new pki(`가방에서 모두 보기 (${ + o.length} + )`,a-40,50,16); + t.setPrimary(!1),t.position.set(20,f+16),t.onTap=()=>{ + this.close(),ei(()=>Promise.resolve().then(()=>lUi),void 0).then(t=>t.FishingGearPage.getInstance().showMode("bag",i))} + ,this.card.addChild(t),f+=66} + } + else{ + const t=rki(`아직 ${ + SAi[i]} + 장비가 없어요. 장비 상자에서 나와요`,zIi,15,!1); + t.position.set(20,f),oki(t,a-40); + const s=new pki("장비 상자로",a-40,56,17); + s.position.set(20,f+40),s.onTap=()=>{ + this.close(),ei(()=>Promise.resolve().then(()=>lUi),void 0).then(t=>t.FishingGearPage.getInstance().showMode("chest"))} + ,this.card.addChild(t,s),f+=96} + this.frame(a,f+20)} + } + ; + Qt(EBi,"GearSlotPanel"),Zt(EBi,"MAX",15); + let ABi=EBi; + const SBi=class t extends MBi{ + constructor(t,i){ + super(),Zt(this,"busy",!1),Zt(this,"openStat",null),this.it=t,this.from=i,this.build()} + static open(i,s){ + new t(i,s).show()} + rebuild(){ + this.card.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),this.build()} + build(){ + var t,i,s; + const e=this.it,n=this.from,h=RIi.getInstance().state,r=AAi(e.id),o=CAi(h.gear.boat),a=null==(t=h.gearBox)?void 0:t.equipped[r.slot],c=a===e.uid,l=e.star>o,u=vBi(e),d=!!(null==(s=null==(i=h.gearBox)?void 0:i.kept)?void 0:s.includes(e.uid)),f=Math.min(gBi-24,500),p=20; + let g=p; + if(n){ + const t=new Ve,i=rki(SAi[n],zIi,15),s=i.width+40; + t.addChild((new ip).roundRect(0,0,s,38,11).fill($Ii).moveTo(20,12).lineTo(13,19).lineTo(20,26).stroke({ + color:zIi,width:3,cap:"round",join:"round"} + ),i),i.position.set(28,(38-i.height)/2),t.position.set(p,g-6),t.eventMode="static",t.cursor="pointer",t.hitArea=new Ui(0,0,s,38),t.on("pointertap",t=>{ + t.stopPropagation(),queueMicrotask(()=>ABi.open(n))} + ),this.card.addChild(t),g+=44} + this.card.addChild(this.closeX(f)); + const w=new pBi(124); + w.ring=FIi,w.set(e.id,e.star,void 0,{ + on:c,kept:d} + ),w.position.set(p,g); + const m=rki(r.name,KIi,24); + m.position.set(164,g+16),oki(m,f-p-144-56); + const v=new Ve; + let _=0; + const M=Qt((t,i,s=!1)=>{ + const e=new Ve,n=rki(t,i,14),h=s?28:11,r=n.height+10,o=h+n.width+11; + if(e.addChild((new ip).roundRect(0,0,o,r,r/2).fill($Ii),n),n.position.set(h,5),s){ + const t=NIi("lock",15,i,2.6); + t.position.set(9,(r-15)/2),e.addChild(t)} + e.x=_,v.addChild(e),_+=o+8} + ,"addPill"); + M(SAi[r.slot],zIi),M(`★${ + e.star} + `,VIi),c?M("장착 중",qIi):l&&M(`배 ${ + e.star} + 단계부터`,XIi,!0),v.position.set(164,g+62); + const b=new Ve,y=rki(d?"아끼는 장비":"아끼기",d?uBi:zIi,14),E=40+y.width+12,A=(new ip).roundRect(0,0,E,34,17).fill(d?4860469:$Ii); + dBi(A,22,18,8),d?A.fill(uBi):A.stroke({ + color:zIi,width:2.2,join:"round"} + ),y.position.set(40,(34-y.height)/2),b.addChild(A,y),b.position.set(164,g+124-34),b.eventMode="static",b.cursor="pointer",b.hitArea=new Ui(-6,-6,E+12,46),b.on("pointertap",t=>{ + t.stopPropagation(),this.toggleKeep(!d)} + ),this.card.addChild(w,m,v,b),g+=142; + const S=OAi(e.id,e.star),T=f-40,C=r.stats.map((t,i)=>{ + const s=void 0!==S[t]&&(i<2||e.star>=5),n=this.openStat===t,h=n?rki(`${ + s?"":"★5가 되면 생겨요 · "} + ${ + _Ai(t)} + `,12763848,14,!1):null; + return null==h||h.setWrapWidth(T-66),{ + k:t,i,has:s,open:n,help:h,h:50+(h?h.height+12:0)} + } + ),O=C.reduce((t,i)=>t+i.h,0)+8,I=aki(T,O,$Ii,null,14); + I.position.set(p,g),this.card.addChild(I); + let k=g+4; + for(const{ + k:P,i:N,has:L,open:D,help:G,h:B} + of C){ + const t=new Ve; + t.position.set(p,k),N&&t.addChild((new ip).rect(14,0,T-28,1).fill({ + color:16777215,alpha:.06} + )),D&&t.addChild((new ip).roundRect(4,2,T-8,B-4,10).fill({ + color:16777215,alpha:.04} + )); + const i=NIi(L?P:"lock",22,L?VIi:5921376); + i.position.set(16,14); + const s=rki(vAi[P].name,L?0===N?KIi:14079706:7829373,0===N?17:16,0===N&&L); + s.position.set(50,(50-s.height)/2); + const e=new Ve,n=D?VIi:9342611,h=rki("i",n,12); + e.addChild((new ip).circle(9,9,8.5).stroke({ + color:n,width:1.6} + ),h),h.position.set(9-h.width/2,9-h.height/2),e.position.set(s.x+s.width+8,16); + const r=rki(L?mBi(P,S[P]):"★5부터",L?0===N?VIi:KIi:7829373,0===N?18:16,L); + r.position.set(T-16-r.width,(50-r.height)/2),t.addChild(i,s,e,r),G&&(G.position.set(50,46),t.addChild(G)),t.eventMode="static",t.cursor="pointer",t.hitArea=new Ui(0,0,T,B),t.on("pointertap",t=>{ + t.stopPropagation(),this.openStat=D?null:P,jG("light"),queueMicrotask(()=>{ + this.destroyed||this.rebuild()} + )} + ),this.card.addChild(t),k+=B} + if(g+=O+18,e.star<7){ + const t=!c&&u>=3,i=168,s=rki("합성",zIi,15); + s.position.set(p,g+12); + const n=rki(`같은 ${ + SAi[r.slot]} + ★${ + e.star} + ${ + u} + 개`,t?13092812:YIi,15,!1); + n.position.set(76,g+12),oki(n,f-p-i-10-76); + const h=new pki("이 장비로 합성",i,44,15); + h.setPrimary(t),h.enabled=t,h.position.set(f-p-i,g),h.onTap=()=>{ + this.close(),ei(()=>Promise.resolve().then(()=>lUi),void 0).then(t=>t.FishingGearPage.getInstance().openMerge(e))} + ,this.card.addChild(s,n,h),g+=62} + const R=f-40,x=new pki(c?"해제":l?`배 ${ + e.star} + 단계부터 장착`:a?"바꿔 장착":"장착",R,60,19); + if(x.setPrimary(!c),x.enabled=c||!l,x.position.set(p,g),x.onTap=()=>{ + this.toggle(c,r.slot)} + ,this.card.addChild(x),g+=60,c){ + const t=rki("장착 중인 장비는 합성에 쓰지 않아요",YIi,13,!1); + t.position.set((f-t.width)/2,g+10),this.card.addChild(t),g+=30} + this.frame(f,g+p)} + async toggle(t,i){ + if(this.busy)return; + this.busy=!0; + const s=RIi.getInstance(),e=t?await s.gearUnequip(i):await s.gearEquip(this.it.uid); + this.busy=!1,e?vH.getInstance().showMessage(e):(jG("light"),wBi(qG.SFX_STONE_BREAK,.3),vH.getInstance().showMessage(t?`${ + SAi[i]} + 해제`:`${ + AAi(this.it.id).name} + ★${ + this.it.star} + 장착`),this.close())} + async toggleKeep(t){ + if(this.busy)return; + this.busy=!0; + const i=await RIi.getInstance().gearKeep(this.it.uid,t); + this.busy=!1,i?vH.getInstance().showMessage(i):(jG("light"),this.destroyed||this.rebuild())} + } + ; + Qt(SBi,"GearDetailPanel"); + let TBi=SBi; + const CBi=class t extends MBi{ + constructor(t,i,s){ + super(),Zt(this,"reveal",MR.timeline()),this.on("removed",()=>this.close()); + const e=Math.min(gBi-16,540),n=Math.min(5,Math.max(1,t.length)),h=Math.min(110,Math.floor((e-40-48)/5)); + let r=20; + const o=s?nAi.gearChest(!0):null; + if(o){ + const t=new Ye(o); + t.anchor.set(.5,0),t.scale.set(150/o.frame.width),t.position.set(e/2,r-12),this.card.addChild(t),this.reveal.fromTo(t.scale,{ + x:90/o.frame.width,y:90/o.frame.width} + ,{ + x:150/o.frame.width,y:150/o.frame.width,duration:.35,ease:"back.out(2.2)"} + ,0),r+=130} + const a=rki(i,VIi,22); + a.position.set((e-a.width)/2,r),this.card.addChild(a),r+=a.height+16; + const c=Math.ceil(t.length/n),l=n*h+12*(n-1),u=Math.max(0,...t.map(t=>t.star)); + t.forEach((t,i)=>{ + const s=new Ve,a=new pBi(h),c=AAi(t.id),u=.08*i+(o?.2:0); + s.position.set((e-l)/2+i%n*(h+12),r+Math.floor(i/n)*(h+34)),a.ring=FIi,a.set(t.id,t.star); + const d=rki(c.name,t.star>=4?VIi:13092812,13,!1); + oki(d,h+8),d.position.set((h-d.width)/2,h+5),s.addChild(a,d),this.card.addChild(s),s.alpha=0,this.reveal.fromTo(s,{ + alpha:0,y:s.y+18} + ,{ + alpha:1,y:s.y,duration:.22,ease:"back.out(2)"} + ,u)} + ),r+=c*(h+34)+6,u>=4?(wBi(qG.SFX_TRUMPET,.5),jG("heavy")):u>=3&&wBi(qG.SFX_GOLD_GOBLIN,.45); + const d=(e-40-10)/2,f=new pki("내 배로",d,56,17),p=new pki("확인",d,56,17); + f.setPrimary(!1),f.position.set(20,r),p.position.set(20+d+10,r),f.onTap=()=>{ + this.close(),ei(()=>Promise.resolve().then(()=>lUi),void 0).then(t=>t.FishingGearPage.getInstance().showMode("boat"))} + ,p.onTap=()=>this.close(),this.card.addChild(f,p),this.frame(e,r+56+20)} + static open(i,s,e=!1){ + new t(i,s,e).show()} + destroy(t){ + this.reveal.kill(),MR.killTweensOf(this.card),super.destroy(t??{ + children:!0} + )} + } + ; + Qt(CBi,"GearRevealPanel"); + let OBi=CBi; + const IBi=CRi.CONTENT_W,kBi=WSi.find(t=>"boat"===t.key); + function RBi(t,i,s,e){ + const n=new pki("",i,s,17),h=rki(t,jIi,18),r=_ki("gold",18),o=rki("",jIi,15); + n.setPrimary(e),n.addChild(h,r,o); + const a=Qt((t,a,c=!1)=>{ + const l=null!==t&&a<t,u=null!==t&&!l&&!c; + n.enabled=u; + const d=u?e?jIi:KIi:iki; + h.textColor=d,o.text=null===t?"":t.toLocaleString(),o.textColor=l?XIi:d,r.visible=null!==t; + const f=23+o.width; + h.position.set((i-h.width)/2,null===t?(s-h.height)/2:.5*s-h.height-1),r.position.set((i-f)/2,.5*s+4),o.position.set(r.x+23,.5*s+2)} + ,"set"); + return{ + btn:n,set:a} + } + Qt(RBi,"priceButton"); + const xBi={ + prow:[.5,0],compass:[0,0],deck:[0,1],anchor:[0,2],toolbox:[1,0],sail:[1,1],lantern:[1,2]} + ,PBi=84,NBi=["hp","speed","repair"],LBi=Qt((t,i)=>{ + const s=vAi[t].unit; + return`${ + s.endsWith("↓")?"−":"+"} + ${ + Math.round(10*i)/10} + ${ + s.replace("↓","")} + `} + ,"statValue"),DBi=class extends Ve{ + constructor(){ + super(),Zt(this,"heading",new Ve),Zt(this,"dock",new Ve),Zt(this,"water",new ip),Zt(this,"waterMask",new ip),Zt(this,"boat",new Ye),Zt(this,"slots",pAi.map(t=>{ + const i=new Ve,s=new pBi(PBi,!0),e=rki(SAi[t],12898518,16),n=rki("미장착",11188415,13,!1); + return s.ring=1914434,n.position.set((PBi-n.width)/2,PBi-n.height-5),i.addChild(s,n,e),i.eventMode="static",i.cursor="pointer",i.hitArea=new Ui(-6,-6,96,114),i.on("pointertap",i=>{ + i.stopPropagation(),queueMicrotask(()=>ABi.open(t))} + ),{ + slot:t,root:i,card:s,name:e,empty:n} + } + )),Zt(this,"auto",new pki("자동 장착",146,36,15)),Zt(this,"info",new Ve),Zt(this,"moreStats",new Ve),Zt(this,"moreLabel",rki("",zIi,15,!1)),Zt(this,"expanded",!1),Zt(this,"next",new Ve),Zt(this,"details",new pki("›",44,44,28)),Zt(this,"up",new pki("",IBi-32,48,17)),Zt(this,"upCoin",_ki("gold",20)),Zt(this,"upTitle",rki("",jIi,17)),Zt(this,"upNote",rki("",zIi,15,!1)),Zt(this,"busy",!1),Zt(this,"sig",""),this.water.eventMode="none",this.waterMask.eventMode="none",this.water.mask=this.waterMask,this.boat.anchor.set(.5),this.boat.eventMode="none",this.auto.onTap=()=>{ + this.autoEquip()} + ,this.auto.setPrimary(!1),this.moreStats.addChild(this.moreLabel),this.moreStats.eventMode="static",this.moreStats.cursor="pointer",this.moreStats.on("pointertap",t=>{ + t.stopPropagation(),this.expanded=!this.expanded,this.update(),this.expanded||CRi.getInstance().resetScroll()} + ),this.details.setPrimary(!1),this.details.onTap=()=>yBi.open(()=>{ + this.upgrade()} + ),this.up.onTap=()=>{ + this.upgrade()} + ,this.up.addChild(this.upCoin,this.upTitle,this.upNote),this.dock.addChild(this.water,this.waterMask,this.boat,...this.slots.map(t=>t.root)),this.dock.y=88,this.addChild(this.heading,this.dock,this.auto,this.info,this.next)} + get upgradeButton(){ + return this.up.parent?this.up:null} + dockH(){ + return Math.round(Math.min(440,Math.max(360,CRi.contentHeight-420)))} + update(){ + const t=RIi.getInstance().state,i=t.gearBox,s=t.gear.boat,e=`${ + this.dockH()} + |${ + s} + |${ + Math.floor(t.gold)} + |${ + this.busy} + |${ + this.expanded} + |${ + JSON.stringify((null==i?void 0:i.equipped)??{ + } + )} + |${ + ((null==i?void 0:i.items)??[]).map(t=>`${ + t.uid} + .${ + t.id} + .${ + t.star} + `).join(",")} + `; + e!==this.sig&&(this.sig=e,this.draw())} + draw(){ + const t=RIi.getInstance(),i=t.state,s=i.gearBox,e=i.gear.boat,n=CAi(e),h=this.dockH(),r=pAi.filter(t=>null==s?void 0:s.items.some(i=>i.uid===s.equipped[t])),o=pAi.filter(t=>xAi(s,t,n)); + this.heading.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const a=rki(kBi.names[e],KIi,30); + a.position.set(2,4),oki(a,IBi-170); + const c=rki(`${ + e+1} + / ${ + kBi.names.length} + 단계`,zIi,16,!1); + c.position.set(2,52); + const l=new ip,u=c.x+c.width+12; + for(let x=0; + x<kBi.names.length; + x++)l.roundRect(u+15*x,60,11,5,2.5).fill(x<=e?VIi:UIi); + const d=rki(`장비 ★${ + n} + 까지`,VIi,16); + d.position.set(u+15*kBi.names.length+10,52); + const f=rki(`장착 장비 ${ + r.length} + / ${ + pAi.length} + `,zIi,16,!1); + f.position.set(IBi-f.width,12),this.heading.addChild(a,c,l,d,f),this.auto.visible=o.length>0,this.auto.enabled=!this.busy,this.auto.setText(`자동 장착 ${ + o.length} + `),this.auto.position.set(IBi-146,43); + const p=IBi/2,g=(h+112)/2; + this.water.clear().rect(0,0,IBi,h).fill(1778217); + for(const[x,P,N]of[[.62,.62,1715254],[.5,.5,1782848],[.4,.41,2047050],[.3,.32,2245715],[.2,.22,2443610]])this.water.ellipse(p,g,IBi*x,h*P).fill({ + color:N,alpha:.9} + ); + for(const x of[.34,.46])this.water.ellipse(p,g,IBi*x*.8,h*x).stroke({ + color:10542320,width:1.5,alpha:.07} + ); + this.waterMask.clear().roundRect(0,0,IBi,h,24).fill(16777215),this.boat.texture=nAi.boatBig(e),this.boat.scale.set(Math.min(.74*h,IBi-216)/(this.boat.texture.frame.height||384)),this.boat.position.set(p,g),this.slots.forEach(({ + slot:t,root:i,card:e,name:r,empty:a} + )=>{ + const c=null==s?void 0:s.items.find(i=>i.uid===s.equipped[t]); + e.set(c?c.id:null,(null==c?void 0:c.star)??0,t,{ + lock:!!c&&c.star>n,up:o.includes(t)} + ),a.visible=!c,r.position.set((PBi-r.width)/2,89); + const[l,u]=xBi[t],d=(h-28-PBi-26)/2; + i.position.set(.5===l?(IBi-PBi)/2:0===l?22:IBi-22-PBi,14+u*d)} + ); + const w=this.info; + w.removeChildren().forEach(t=>{ + t!==this.moreStats&&t.destroy({ + children:!0} + )} + ),w.y=88+h+14; + const m=rki("장비 효과",KIi,19); + m.position.set(2,2),w.addChild(m); + const v=t.gearStats(),_=[...NBi,...gAi.filter(t=>!NBi.includes(t))].filter(t=>v[t]>0),M=_.slice(0,3),b=_.slice(3); + this.moreStats.visible=b.length>0,this.moreLabel.text=this.expanded?"접기 ∧":`전체 ${ + _.length} + 개 보기 ∨`,this.moreStats.position.set(IBi-this.moreLabel.width-4,6),this.moreStats.hitArea=new Ui(-12,-9,this.moreLabel.width+16,38),w.addChild(this.moreStats); + let y=40; + if(_.length){ + const t=aki(IBi,84,GIi,null,16),i=IBi/M.length,s=new ip; + t.y=y,w.addChild(t,s),M.forEach((t,e)=>{ + const n=e*i+18,h=rki(vAi[t].name,zIi,16,!1),r=rki(LBi(t,v[t]),VIi,27); + h.position.set(n,y+10),r.position.set(n,y+36),oki(h,i-32),oki(r,i-32),e&&s.moveTo(e*i,y+14).lineTo(e*i,y+70).stroke({ + color:WIi,width:1} + ),w.addChild(h,r)} + )} + else{ + const t=aki(IBi,84,GIi,null,16); + t.y=y; + const i=rki("빈 슬롯을 눌러 장비를 장착해 보세요",zIi,16,!1); + i.position.set(18,y+28),oki(i,IBi-36),w.addChild(t,i)} + if(y+=84,this.expanded&&b.length){ + y+=12; + const t=aki(IBi,34*Math.ceil(b.length/2)+24,GIi,null,16); + t.y=y,w.addChild(t),b.forEach((t,i)=>{ + const s=18+i%2*(IBi/2),e=y+12+34*Math.floor(i/2),n=rki(vAi[t].name,zIi,15,!1),h=rki(LBi(t,v[t]),VIi,16); + h.position.set(s+IBi/2-38-h.width,e),oki(n,h.x-s-10),n.position.set(s,e),w.addChild(n,h)} + ),y+=t.height} + const E=this.next; + E.removeChildren().forEach(t=>{ + t!==this.up&&t!==this.details&&t.destroy({ + children:!0} + )} + ),E.y=w.y+y+14; + const A=e+1; + if(A>=kBi.names.length){ + const t=mki("가장 좋은 배예요",VIi,GIi,15,14); + return void E.addChild(t)} + E.addChild(aki(IBi,168,2894632,6115378,18)); + const S=new Ye(nAi.boatBig(A)); + S.anchor.set(.5),S.scale.set(72/(S.texture.frame.height||384)),S.position.set(50,46); + const T=rki(`다음 배 · ${ + A+1} + 단계`,zIi,15,!1),C=rki(kBi.names[A],KIi,23),O=A===DAi.ENTRY.C?"연안":A===DAi.ENTRY.O?"대양":"",I=rki(`기본 내구도 ${ + DAi.MAX_HP[e]} + → ${ + DAi.MAX_HP[A]} + · ★${ + CAi(A)} + 장비${ + O?` · ${ + O} + 해금`:""} + `,14206864,16,!1); + T.position.set(94,14),C.position.set(94,37),I.position.set(18,83),oki(C,IBi-176),oki(I,IBi-36),this.details.position.set(IBi-62,23),this.up.position.set(16,108); + const k=kBi.prices[A],R=Math.max(0,k-Math.floor(i.gold)); + this.up.enabled=!this.busy&&!R,this.upTitle.text=`${ + k.toLocaleString()} + · 업그레이드`,this.upTitle.textColor=this.up.enabled?jIi:14011049,this.upNote.text=R?`${ + R.toLocaleString()} + 골드 부족`:this.busy?"처리 중":"",this.upNote.textColor=R?14005387:zIi,this.upCoin.position.set(13,14),this.upTitle.position.set(41,(48-this.upTitle.height)/2),this.upNote.position.set(IBi-48-this.upNote.width,(48-this.upNote.height)/2),oki(this.upTitle,(this.upNote.text?this.upNote.x-12:IBi-48)-this.upTitle.x),E.addChild(S,T,C,I,this.details,this.up)} + async autoEquip(){ + if(this.busy)return; + this.busy=!0,this.update(); + const t=await RIi.getInstance().gearEquipBest().finally(()=>{ + this.busy=!1,this.update()} + ); + if(t.message)return vH.getInstance().showMessage(t.message),void this.update(); + jG("success"); + try{ + qG.getInstance().playSFX(qG.SFX_STONE_BREAK,.35)} + catch{ + } + vH.getInstance().showMessage(t.n?`${ + t.n} + 칸을 더 좋은 장비로 바꿨어요`:"이미 가장 좋은 장비예요"),this.update(); + for(const i of this.slots)MR.fromTo(i.card.scale,{ + x:1.12,y:1.12} + ,{ + x:1,y:1,duration:.35,ease:"back.out(3)"} + )} + async upgrade(){ + if(this.busy)return; + const t=RIi.getInstance(),i=kBi.prices[t.state.gear.boat+1]; + if(void 0===i||t.state.gold<i)return; + let s; + this.busy=!0,this.update(); + try{ + s=await t.upgrade("boat")} + finally{ + this.busy=!1,this.update()} + if(s)return vH.getInstance().showMessage(s),void this.update(); + vH.getInstance().showMessage(`배: ${ + kBi.names[t.state.gear.boat]} + (으)로 올렸어요`),jG("success"),qG.getInstance().playSFX(qG.SFX_LEVEL_UP),this.update(); + const e=this.boat.scale.x; + MR.fromTo(this.boat.scale,{ + x:1.15*e,y:1.15*e} + ,{ + x:e,y:e,duration:.5,ease:"back.out(3)"} + )} + } + ; + Qt(DBi,"FishingMyBoatView"); + let GBi=DBi; + const BBi=IBi/6,UBi=class extends Ve{ + constructor(){ + super(),Zt(this,"filter",null),Zt(this,"onMerge",null),Zt(this,"count",rki("",KIi,18)),Zt(this,"merge",new pki("합성",190,50,16)),Zt(this,"chips",[]),Zt(this,"grid",new Ve),Zt(this,"cards",[]),Zt(this,"shown",[]),Zt(this,"sig",""),this.count.position.set(2,12),this.merge.position.set(IBi-190,0),this.merge.onTap=()=>{ + var t; + return null==(t=this.onMerge)?void 0:t.call(this)} + ,this.addChild(this.count,this.merge,this.grid); + const t=(IBi-56)/8; + for(let i=0; + i<8; + i++){ + const s=new Ve; + s.position.set(i*(t+8),66),s.eventMode="static",s.cursor="pointer",s.hitArea=new Ui(0,0,t,t); + const e=i?pAi[i-1]:null; + s.on("pointertap",t=>{ + t.stopPropagation(),this.filter=this.filter!==e&&e?e:null,this.sig="",this.update(),CRi.getInstance().resetScroll()} + ),this.chips.push(s),this.addChild(s)} + this.grid.y=66+t+18} + update(){ + const t=RIi.getInstance().state,i=t.gearBox,s=CAi(t.gear.boat),e=`${ + this.filter} + |${ + s} + |${ + JSON.stringify((null==i?void 0:i.equipped)??{ + } + )} + |${ + ((null==i?void 0:i.kept)??[]).join(".")} + |${ + ((null==i?void 0:i.items)??[]).map(t=>`${ + t.uid} + .${ + t.star} + `).join(",")} + `; + if(e===this.sig)return; + this.sig=e; + const n=(null==i?void 0:i.items)??[],h=new Set(Object.values((null==i?void 0:i.equipped)??{ + } + )),r=new Set((null==i?void 0:i.kept)??[]); + this.count.text=`가방 ${ + n.length} + / 400`,this.merge.setPrimary(PAi(i).length>0),this.merge.enabled=NAi(i).length>0; + const o=(IBi-56)/8; + this.chips.forEach((t,i)=>{ + t.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const s=i?pAi[i-1]:null,e=this.filter===s,n=(new ip).roundRect(0,0,o,o,14).fill(e?4865308:GIi); + if(e&&n.roundRect(1.5,1.5,o-3,o-3,13).stroke({ + color:VIi,width:2.5} + ),t.addChild(n),!s){ + const i=rki("전체",e?VIi:13092812,15); + return i.position.set((o-i.width)/2,(o-i.height)/2),void t.addChild(i)} + const h=new Ye(lBi(s)); + h.anchor.set(.5),h.scale.set(.8*o/(h.texture.frame.width||128)),h.position.set(o/2,o/2),h.alpha=e?1:.7,t.addChild(h)} + ); + const a=n.filter(t=>{ + var i; + return!this.filter||(null==(i=AAi(t.id))?void 0:i.slot)===this.filter} + ).sort((t,i)=>Number(h.has(i.uid))-Number(h.has(t.uid))||pAi.indexOf(AAi(t.id).slot)-pAi.indexOf(AAi(i.id).slot)||i.star-t.star||t.id-i.id); + for(; + this.cards.length<a.length; + ){ + const t=new pBi(82),i=this.cards.length; + t.eventMode="static",t.cursor="pointer",t.hitArea=new Ui(-4,-4,90,90),t.on("pointertap",t=>{ + var s; + t.stopPropagation(); + const e=this.shown[i],n=null==(s=RIi.getInstance().state.gearBox)?void 0:s.items.find(t=>t.uid===e); + n&&queueMicrotask(()=>TBi.open(n))} + ),this.grid.addChild(t),this.cards.push(t)} + this.shown=a.map(t=>t.uid),this.cards.forEach((t,i)=>{ + const e=a[i]; + t.visible=!!e,e&&(t.set(e.id,e.star,void 0,{ + on:h.has(e.uid),lock:!h.has(e.uid)&&e.star>s,kept:r.has(e.uid)} + ),t.position.set(i%6*BBi+(BBi-82)/2,96*Math.floor(i/6)))} + ),a.length||(this.count.text+=this.filter?` · ${ + SAi[this.filter]} + 없음`:"")} + } + ; + Qt(UBi,"FishingGearBagView"); + let FBi=UBi; + const $Bi=class extends Ve{ + constructor(){ + super(),Zt(this,"glow",new ip),Zt(this,"chest",new Ye),Zt(this,"title",rki("장비 상자",KIi,30)),Zt(this,"sub",rki("열면 배 장비 하나가 나와요",zIi,16,!1)),Zt(this,"odds",new Ve),Zt(this,"one",RBi("1개 열기",(IBi-12)/2,100,!1)),Zt(this,"ten",RBi("10개 열기",(IBi-12)/2,100,!0)),Zt(this,"bag",rki("",YIi,14,!1)),Zt(this,"bob",null),Zt(this,"busy",!1),Zt(this,"sig",""),this.glow.eventMode="none",this.chest.anchor.set(.5),this.chest.eventMode="none",this.one.btn.onTap=()=>{ + this.pull(1)} + ,this.ten.btn.onTap=()=>{ + this.pull(10)} + ; + let t=0; + for(const[i,s]of TAi){ + const e=new Ve,n=rki(`★${ + i} + ${ + Math.round(100*s)} + %`,13092812,14),h=n.height+12,r=30+n.width+12; + e.addChild((new ip).roundRect(0,0,r,h,h/2).fill(GIi).roundRect(12,h/2-5,10,10,3).fill(LAi[i]),n),n.position.set(30,6),e.x=t,t+=r+8,this.odds.addChild(e)} + this.addChild(this.glow,this.chest,this.title,this.sub,this.odds,this.one.btn,this.ten.btn,this.bag)} + stop(){ + var t; + null==(t=this.bob)||t.kill(),this.bob=null,this.sig=""} + update(){ + var t,i,s; + const e=RIi.getInstance().state,n=CRi.contentHeight,h=`${ + n} + |${ + e.gold} + |${ + this.busy} + |${ + (null==(t=e.gearBox)?void 0:t.items.length)??0} + `; + if(h===this.sig)return; + this.sig=h; + const r=Math.max(8,(n-612)/2),o=nAi.gearChest(!1)??cBi(55); + this.chest.texture=o,this.chest.scale.set(300/(o.frame.width||384)),null==(i=this.bob)||i.kill(),this.bob=null,this.chest.position.set(IBi/2,r+150),this.visible&&(this.bob=MR.to(this.chest,{ + y:"-=8",duration:1.3,yoyo:!0,repeat:-1,ease:"sine.inOut"} + )),this.glow.clear(); + for(const[c,l]of[[1,.05],[.78,.07],[.56,.09],[.36,.1]])this.glow.circle(IBi/2,r+150,186*c).fill({ + color:16106577,alpha:l} + ); + let a=r+300+20; + this.title.position.set((IBi-this.title.width)/2,a),a+=40,this.sub.position.set((IBi-this.sub.width)/2,a),a+=50,this.odds.position.set((IBi-this.odds.width)/2,a),a+=64,this.one.btn.position.set(0,a),this.ten.btn.position.set((IBi-12)/2+12,a),this.one.set(100,e.gold,this.busy),this.ten.set(1e3,e.gold,this.busy),a+=118,this.bag.text=`가방 ${ + (null==(s=e.gearBox)?void 0:s.items.length)??0} + / 400`,this.bag.position.set((IBi-this.bag.width)/2,a)} + async pull(t){ + if(!this.busy){ + this.busy=!0,this.update(); + try{ + const i=await RIi.getInstance().gearPull(t); + if(i.message||!i.result)return void vH.getInstance().showMessage(i.message??"열지 못했어요"); + jG("medium"),OBi.open(i.result,`상자 ${ + t} + 개`,!0)} + finally{ + this.busy=!1,this.sig="",this.update()} + } + } + } + ; + Qt($Bi,"FishingGearChestView"); + let HBi=$Bi; + const WBi=CRi.CONTENT_W,VBi=(WBi-24)/6,jBi=Math.min(82,Math.floor(VBi-14)),KBi=jBi+18,zBi=[{ + q:"s1",text:"★1",max:1} + ,{ + q:"s2",text:"★2 이하",max:2} + ,{ + q:"all",text:"모두",max:6} + ]; + function YBi(t,i,s,e,n,h=16){ + const r=WBi,o=i+s,a=e?h:0,c=n?h:0; + return t.moveTo(0+a,i).lineTo(r-a,i),a&&t.arcTo(r,i,r,i+a,a),t.lineTo(r,o-c),c&&t.arcTo(r,o,r-c,o,c),t.lineTo(0+c,o),c&&t.arcTo(0,o,0,o-c,c),t.lineTo(0,i+a),a&&t.arcTo(0,i,0+a,i,a),t.closePath().fill(GIi)} + Qt(YBi,"part"); + const qBi=class extends OR{ + constructor(){ + super(),Zt(this,"bg",new ip),Zt(this,"icon",new Ye),Zt(this,"slotName",rki("",KIi,18)),Zt(this,"stars",rki("",VIi,14)),Zt(this,"count",rki("",YIi,14)),Zt(this,"res",rki("",zIi,15)),Zt(this,"cells",[]),Zt(this,"row",null); + const t=(new ip).rect(0,0,WBi,KBi).fill({ + color:0,alpha:.001} + ); + t.eventMode=this.bg.eventMode=this.icon.eventMode="none",this.icon.anchor.set(.5),this.addChild(t,this.bg,this.icon,this.slotName,this.stars,this.count,this.res); + for(let i=0; + i<6; + i++){ + const t=new Ve,s=new pBi(jBi); + s.ring=GIi,s.position.set((VBi-jBi)/2,6),t.addChild(s),t.position.set(12+i*VBi,0),t.eventMode="static",t.cursor="pointer",t.hitArea=new Ui(0,0,VBi,KBi),t.on("pointertap",t=>{ + var s,e,n,h; + t.stopPropagation(); + const r=null==(e=null==(s=this.row)?void 0:s.items)?void 0:e[i]; + r&&(null==(h=(n=this.row).onPick)||h.call(n,r.it.uid))} + ),this.addChild(t),this.cells.push({ + root:t,card:s} + )} + } + setData(t){ + this.row=t; + const i=t.head; + if(this.bg.clear(),[this.icon,this.slotName,this.stars,this.count,this.res].forEach(t=>t.visible=!!i),i){ + YBi(this.bg,14,KBi-14+1,!0,!1); + const t=14+(KBi-14)/2+2; + this.icon.texture=lBi(i.slot),this.icon.scale.set(44/(this.icon.texture.frame.width||128)),this.icon.position.set(38,t),this.slotName.text=SAi[i.slot],this.slotName.position.set(70,t-this.slotName.height/2),this.stars.text=MTi(i.star),this.stars.position.set(this.slotName.x+this.slotName.width+6,t-this.stars.height/2),this.count.text=`${ + i.n} + 개`,this.count.position.set(this.stars.x+this.stars.width+10,t-this.count.height/2); + const s=Math.floor(i.picks/3),e=i.picks%3?3-i.picks%3:0; + this.res.text=s?`→ ★${ + i.star+1} + × ${ + s} + ${ + e?` · ${ + e} + 개 더`:""} + `:e?`${ + e} + 개 더 고르면 ★${ + i.star+1} + `:`3개 → ★${ + i.star+1} + `,this.res.textColor=s?VIi:e?16757611:zIi,oki(this.res,WBi-12-(this.count.x+this.count.width+12)),this.res.position.set(WBi-12-this.res.width,t-this.res.height/2)} + else t.items&&YBi(this.bg,-1,(t.last?KBi-2:KBi)+1,!1,!!t.last); + this.cells.forEach((i,s)=>{ + var e; + const n=null==(e=t.items)?void 0:e[s]; + i.root.visible=!!n,n&&i.card.set(n.it.id,n.it.star,void 0,{ + pick:n.picked?"on":"off",kept:n.kept} + )} + )} + } + ; + Qt(qBi,"MergeRow"); + let XBi=qBi; + const JBi=class extends Ve{ + constructor(){ + super(),Zt(this,"onClose",null),Zt(this,"bg",new ip),Zt(this,"back",new Ve),Zt(this,"title",rki("합성",KIi,20)),Zt(this,"hint",rki("같은 부위 · 같은 별 3개 → 별 하나 위",zIi,13,!1)),Zt(this,"quickChips",zBi.map(t=>new dki(t.text,120,44,15))),Zt(this,"clearChip",new dki("비우기",100,44,15)),Zt(this,"allChip",new dki("다른 장비도 보기",200,44,15)),Zt(this,"list",new TR(XBi,WBi,300,0)),Zt(this,"empty",rki("",YIi,15,!1)),Zt(this,"barBg",new ip),Zt(this,"barN",rki("",KIi,20)),Zt(this,"barSub",rki("",zIi,14,!1)),Zt(this,"barKept",new Ve),Zt(this,"barGo",new pki("합성",200,60,19)),Zt(this,"picked",[]),Zt(this,"quick",null),Zt(this,"only",null),Zt(this,"busy",!1),Zt(this,"sig",""),this.bg.eventMode="static"; + const t=(new ip).roundRect(0,0,48,48,12).fill(GIi).moveTo(28,15).lineTo(19,24).lineTo(28,33).stroke({ + color:KIi,width:3.5,cap:"round",join:"round"} + ); + t.eventMode="none",this.back.addChild(t),this.back.eventMode="static",this.back.cursor="pointer",this.back.hitArea=new Ui(-6,-6,60,60),this.back.on("pointertap",t=>{ + t.stopPropagation(),queueMicrotask(()=>{ + var t; + return null==(t=this.onClose)?void 0:t.call(this)} + )} + ),this.back.position.set(0,2),this.title.position.set(62,12); + const i=(WBi-100-32)/3; + this.quickChips.forEach((t,s)=>{ + t.resize(i,44),t.position.set(s*(i+8),64),t.onTap=()=>this.pickQuick(zBi[s].q)} + ),this.clearChip.position.set(WBi-100,64),this.clearChip.onTap=()=>{ + this.picked=[],this.quick=null,jG("light"),this.render()} + ,this.allChip.position.set(0,64),this.allChip.onTap=()=>{ + this.only=null,this.render()} + ,this.list.y=120,this.empty.position.set(4,144),this.barBg.eventMode="none",this.barGo.onTap=()=>{ + this.merge()} + ,this.addChild(this.bg,this.back,this.title,this.hint,...this.quickChips,this.clearChip,this.allChip,this.list,this.empty,this.barBg,this.barN,this.barSub,this.barKept,this.barGo),this.visible=!1} + get isOpen(){ + return this.visible} + open(t){ + if(this.picked=[],this.quick=null,this.only=null,this.sig="",t){ + const i=AAi(t.id),s=RIi.getInstance().state.gearBox,e=new Set((null==s?void 0:s.kept)??[]),n=i&&NAi(s).find(s=>s.slot===i.slot&&s.star===t.star); + n&&(this.only={ + slot:n.slot,star:n.star} + ,this.picked=[t.uid,...n.list.filter(i=>i.uid!==t.uid&&!e.has(i.uid)).slice(0,2).map(t=>t.uid)])} + this.visible=!0,this.render(),this.list.showTopItem()} + close(){ + this.visible=!1,this.busy=!1} + update(){ + this.visible&&this.render()} + groups(){ + const t=NAi(RIi.getInstance().state.gearBox); + return this.only?t.filter(t=>t.slot===this.only.slot&&t.star===this.only.star):t} + pickQuick(t){ + var i; + const s=new Set((null==(i=RIi.getInstance().state.gearBox)?void 0:i.kept)??[]); + if(this.picked=[],this.quick===t)this.quick=null; + else{ + this.quick=t; + const i=zBi.find(i=>i.q===t).max; + for(const t of this.groups()){ + if(t.star>i)continue; + const e=t.list.filter(t=>!s.has(t.uid)); + this.picked.push(...e.slice(0,3*Math.floor(e.length/3)).map(t=>t.uid))} + } + jG("light"),this.render()} + toggle(t){ + const i=this.picked.indexOf(t); + i>=0?this.picked.splice(i,1):this.picked.push(t),this.quick=null,queueMicrotask(()=>{ + this.visible&&this.render()} + )} + plan(){ + const t=RIi.getInstance().state.gearBox,i=new Set((null==t?void 0:t.kept)??[]),s=new Map,e=[],n=new Map; + for(const r of this.picked){ + const i=null==t?void 0:t.items.find(t=>t.uid===r),e=i&&AAi(i.id); + if(!i||!e)continue; + const n=`${ + e.slot} + |${ + i.star} + `; + s.set(n,[...s.get(n)??[],r])} + let h=0; + for(const[r,o]of s){ + const t=Number(r.split("|")[1]); + for(let s=0; + s+3<=o.length; + s+=3){ + const r=o.slice(s,s+3); + e.push(r),h+=r.filter(t=>i.has(t)).length,n.set(t+1,(n.get(t+1)??0)+1)} + } + return{ + triples:e,made:n,kept:h} + } + render(){ + var t,i; + const s=RIi.getInstance().state.gearBox,e=CRi.contentHeight,n=CRi.OVERLAY_PAD,h=this.groups(),r=new Set(h.flatMap(t=>t.list.map(t=>t.uid))); + this.picked=this.picked.filter(t=>r.has(t)); + const o=new Set((null==s?void 0:s.kept)??[]),a=`${ + e} + |${ + null==(t=this.only)?void 0:t.slot} + ${ + null==(i=this.only)?void 0:i.star} + |${ + this.quick} + |${ + this.busy} + |${ + this.picked.join(",")} + |${ + [...o].join(",")} + |${ + h.map(t=>`${ + t.slot} + ${ + t.star} + :${ + t.list.map(t=>t.uid).join(".")} + `).join("/")} + `; + if(a===this.sig)return; + this.sig=a,this.bg.clear().rect(-n,0,WBi+2*n,e).fill(DIi),oki(this.hint,WBi-62-this.title.width-24),this.hint.position.set(WBi-this.hint.width-2,18),this.quickChips.forEach((t,i)=>{ + t.visible=!this.only,t.selected=this.quick===zBi[i].q,t.draw()} + ),this.clearChip.visible=!this.only,this.clearChip.enabled=this.picked.length>0,this.clearChip.draw(),this.allChip.visible=!!this.only; + const c=new Set(this.picked),l=[],u=Qt(t=>this.toggle(t),"onPick"); + for(const g of h){ + l.push({ + head:{ + slot:g.slot,star:g.star,n:g.list.length,picks:g.list.filter(t=>c.has(t.uid)).length} + } + ); + for(let t=0; + t<g.list.length; + t+=6)l.push({ + items:g.list.slice(t,t+6).map(t=>({ + it:t,picked:c.has(t.uid),kept:o.has(t.uid)} + )),last:t+6>=g.list.length,onPick:u} + )} + this.list.visible=l.length>0,this.empty.visible=!l.length,this.empty.text="합성할 장비가 없어요\n같은 부위 · 같은 별 장비가 3개 모이면 여기에 나와요 (장착한 것은 빼고)",this.empty.setWrapWidth(WBi-8),this.list.setListHeight(Math.max(60,e-120-92-8),!1),this.list.dataProvider=l; + const d=e-92,f=this.plan(),p=f.triples.length; + if(this.barBg.clear().rect(-n,d,WBi+2*n,92).fill(QIi),this.barN.text=p?`합성 ${ + p} + 번`:"골라 주세요",this.barN.textColor=p?KIi:zIi,this.barN.position.set(4,d+14),this.barSub.text=p?`장비 ${ + 3*p} + 개 → ${ + [...f.made.entries()].sort((t,i)=>t[0]-i[0]).map(([t,i])=>`★${ + t} + ${ + i} + `).join(" · ")} + `:"칸을 누르거나 위에서 한꺼번에",this.barSub.textColor=p?VIi:YIi,oki(this.barSub,WBi-230-(f.kept?56:0)),this.barSub.position.set(4,d+52),this.barKept.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),f.kept){ + const t=rki(`${ + f.kept} + `,uBi,15),i=dBi(new ip,9,9,8).fill(uBi); + t.position.set(22,(18-t.height)/2),this.barKept.addChild(i,t),this.barKept.position.set(this.barSub.x+this.barSub.width+12,d+53)} + this.barGo.position.set(WBi-200,d+16),this.barGo.enabled=p>0&&!this.busy} + async merge(){ + var t; + const i=this.plan().triples; + if(!i.length||this.busy)return; + this.busy=!0,this.render(); + const s=await RIi.getInstance().gearMergeGroups(i); + if(this.busy=!1,s.message||!s.result)return vH.getInstance().showMessage(s.message??"합성하지 못했어요"),this.sig="",void this.render(); + jG("success"),null==(t=this.onClose)||t.call(this),OBi.open(s.result,"합성 결과")} + } + ; + Qt(JBi,"FishingGearMergeView"); + let QBi=JBi; + const ZBi=CRi.CONTENT_W,tUi=(ZBi-12)/2,iUi={ + boat:"boat",line:"spool",rod:"rod",reel:"reel",bobber:"bobber",icebox:"keepnet",auto:"autorod"} + ,sUi=["×1","×1.3","×1.6","×2"],eUi=WSi.filter(t=>"boat"!==t.key),nUi=["boat","bag","chest","tools"],hUi=["내 배","장비 가방","장비 상자","낚시 도구"]; + function rUi(){ + const t=tUi-24,i=new pki("",t,48),s=rki("올리기",jIi,18),e=_ki("gold",18),n=rki("",jIi,18); + return s.position.set(16,12),e.y=15,n.y=12,i.addChild(s,e,n),{ + btn:i,set:Qt((h,r,o=!1)=>{ + const a=r<h; + i.enabled=!a&&!o,s.textColor=i.enabled?jIi:iki,n.text=h.toLocaleString(),n.textColor=a?XIi:s.textColor,n.x=t-16-n.width,e.x=n.x-23} + ,"set")} + } + function oUi(t,i,s){ + const e=WSi.find(i=>i.key===t).effects.map(String),n=Qt((t,i)=>{ + var s; + return(null==(s=i.exec(t))?void 0:s[1])??""} + ,"m"),h=Qt((t,e)=>i===s?`${ + t} + `:`${ + t} + → ${ + e} + `,"values"); + switch(t){ + case"line":return["버티는 물고기 힘",`${ + h(i+1,s+1)} + ${ + s===e.length-1?" · 고래도!":""} + `]; + case"rod":return["큰 개체 다시 뽑기",h(n(e[i],/([\d.]+%)/),n(e[s],/([\d.]+%)/))]; + case"reel":return["입질 속도",`${ + h(n(e[i],/(×[\d.]+)/),n(e[s],/(×[\d.]+)/))} + ${ + /심해/.test(e[s])?" · 심해 입장":""} + `]; + case"bobber":return["★3 이상 등장 확률",h(n(e[i],/(×[\d.]+)/),n(e[s],/(×[\d.]+)/))]; + case"icebox":return["담을 수 있는 물고기",`${ + h(n(e[i],/(\d+)마리/),n(e[s],/(\d+)마리/))} + 마리`]; + case"auto":return["꺼 둔 동안 자동 낚시",`입질 ${ + h(lAi(i),lAi(s))} + 번에 1마리`]; + default:return["",""]} + } + Qt(rUi,"toolButton"),Qt(oUi,"toolEffect"); + const aUi=class t extends Ve{ + constructor(){ + super(),Zt(this,"tabId","gear"),Zt(this,"myBoat",new GBi),Zt(this,"bag",new FBi),Zt(this,"chest",new HBi),Zt(this,"mergeView",new QBi),Zt(this,"tools",new Ve),Zt(this,"stats",[]),Zt(this,"rows",[]),Zt(this,"busy",!1); + const i=this.tools,s=rki("낚시 도구",KIi,26),e=rki("다음 도구로 한 단계 더",zIi,14,!1); + s.position.set(2,0),e.position.set(ZBi-e.width-2,10); + const n=aki(ZBi,112,GIi,null,16); + n.y=42,i.addChild(s,e,n); + const h=(ZBi-32-16)/3; + ["map","line","clock","star","moon","icebox"].forEach((t,s)=>{ + const e=16+s%3*(h+8),n=51+49*Math.floor(s/3),r=NIi(t,20,9425128); + r.position.set(e,n+12); + const o=rki("",YIi,12,!1),a=rki("",KIi,16); + o.position.set(e+30,n+1),a.position.set(e+30,n+20),i.addChild(r,o,a),this.stats.push({ + k:o,v:a} + )} + ),eUi.forEach((t,s)=>{ + const e=new Ve; + e.position.set(s%2*(tUi+12),166+236*Math.floor(s/2)); + const n=(new ip).roundRect(0,0,tUi,224,16).fill(VIi); + n.alpha=0,n.eventMode="none"; + const h=(new ip).roundRect(12,14,92,92,18).fill(2961463); + h.eventMode="none"; + const r=yki(iUi[t.key],46,KIi); + r.pivot.set(23,23),r.position.set(58,60); + const o=new Ye(as.EMPTY); + o.anchor.set(.5),o.position.set(58,60),o.eventMode="none"; + const a=rki(t.title,zIi,13),c=rki("",KIi,19),l=rki("",qIi,19); + a.position.set(116,17),c.position.set(116,40),l.position.set(14,140); + const u=rki("",zIi,12,!1),d=rki("",zIi,13,!1); + u.position.set(116,73),d.position.set(14,118); + const f=new ip; + f.eventMode="none",f.position.set(116,97); + const p=rUi(); + p.btn.position.set(12,166),p.btn.onTap=()=>{ + this.upgrade(t.key,s)} + ; + const g=mki("최고 단계",VIi,3813920,15,14); + g.position.set((tUi-g.width)/2,178),e.addChild(aki(tUi,224,GIi,null,16),n,h,r,o,a,c,u,f,d,l,p.btn,g),i.addChild(e),this.rows.push({ + key:t.key,root:e,flash:n,icon:r,img:o,kind:a,name:c,stage:u,pips:f,effect:d,fx:l,up:p,max:g} + )} + ),this.bag.onMerge=()=>this.openMerge(),this.mergeView.onClose=()=>this.closeMerge(),this.addChild(this.myBoat,this.bag,this.chest,this.tools,this.mergeView),this.setMode(t.mode)} + static getInstance(){ + return this.instance??(this.instance=new t)} + get scrollInShell(){ + return!this.mergeView.isOpen} + onShow(){ + this.update()} + onHide(){ + this.chest.stop(),this.mergeView.isOpen&&(this.mergeView.close(),this.bag.visible="bag"===t.mode)} + closeOne(){ + return!!this.mergeView.isOpen&&(this.closeMerge(),!0)} + openMerge(i){ + "bag"!==t.mode&&this.setMode("bag"),this.bag.visible=!1,this.mergeView.open(i); + const s=CRi.getInstance(); + s.refreshSub(),s.resetScroll()} + closeMerge(){ + this.mergeView.isOpen&&(this.mergeView.close(),this.bag.visible="bag"===t.mode,CRi.getInstance().refreshSub(),this.update())} + subTabs(){ + if(this.mergeView.isOpen)return null; + const i=RIi.getInstance().state,s=i.gearBox,e=CAi(i.gear.boat),n=pAi.some(t=>!!xAi(s,t,e)),h=PAi(s).some(t=>t.n>=3); + return{ + items:hUi,index:nUi.indexOf(t.mode),dots:[n,h,!1,!1]} + } + selectSub(t){ + this.setMode(nUi[t]??"boat")} + showMode(t,i){ + "bag"===t&&(this.bag.filter=i??null),this.setMode(t); + const s=CRi.getInstance(); + s.refreshSub(),s.resetScroll()} + focusTool(t){ + var i; + return"boat"===t?(this.setMode("boat"),CRi.getInstance().refreshSub(),this.myBoat.upgradeButton):(this.setMode("tools"),CRi.getInstance().refreshSub(),(null==(i=this.rows.find(i=>i.key===t))?void 0:i.up.btn)??null)} + setMode(i){ + this.mergeView.isOpen&&"bag"!==i&&(this.mergeView.close(),CRi.getInstance().refreshSub()),t.mode=i,this.myBoat.visible="boat"===i,this.bag.visible="bag"===i&&!this.mergeView.isOpen,this.chest.visible="chest"===i,this.tools.visible="tools"===i,"chest"!==i&&this.chest.stop(),this.update()} + async upgrade(t,i){ + if(this.busy)return; + const s=RIi.getInstance(),e=eUi[i]; + let n; + this.busy=!0,this.update(); + try{ + n=await s.upgrade(t)} + finally{ + this.busy=!1,this.update()} + if(n)return void vH.getInstance().showMessage(n); + vH.getInstance().showMessage(`${ + e.title} + : ${ + e.names[s.state.gear[t]]} + (으)로 올렸어요`),jG("success"),qG.getInstance().playSFX(qG.SFX_LEVEL_UP); + const h=this.rows[i]; + MR.fromTo(h.flash,{ + alpha:.35} + ,{ + alpha:0,duration:.6,ease:"power2.out"} + ),this.update(); + const r=h.img.visible?h.img:h.icon,o=h.img.visible?88/Math.max(h.img.texture.width,h.img.texture.height):1; + MR.killTweensOf(r.scale),MR.killTweensOf(r),MR.fromTo(r.scale,{ + x:1.35*o,y:1.35*o} + ,{ + x:o,y:o,duration:.45,ease:"back.out(3)"} + ),MR.fromTo(r,{ + rotation:-.25} + ,{ + rotation:0,duration:.45,ease:"back.out(3)"} + )} + update(){ + const i=t.mode; + if("boat"===i)return void this.myBoat.update(); + if("bag"===i)return void(this.mergeView.isOpen?this.mergeView.update():this.bag.update()); + if("chest"===i)return void this.chest.update(); + const s=RIi.getInstance(),e=s.state,n=e.gear,h=[["갈 수 있는 곳",n.boat>=DAi.ENTRY.O?n.reel>=4?"강·연안·대양·심해":"강·연안·대양":n.boat>=DAi.ENTRY.C?"강·연안":"강"],["줄 힘",`${ + XSi(n)} + 까지`],["입질 간격",`${ + Math.round(15e3/YSi(n)/1e3)} + ~${ + Math.round(3e4/YSi(n)/1e3)} + 초`],["★3 이상",sUi[n.bobber]],["꺼 둔 동안 입질",`${ + lAi(n.auto)} + 번에 1마리`],["어망",`${ + qSi(n,s.gearStats().icebox)} + 마리`]],r=(ZBi-32-16)/3; + this.stats.forEach((t,i)=>{ + t.k.text=h[i][0],t.v.text=h[i][1],oki(t.k,r-30),oki(t.v,r-30)} + ),eUi.forEach((t,i)=>{ + const s=this.rows[i],h=n[t.key],r=t.prices.length-1,o=h>=r,a=o?h:h+1; + s.icon.tint=o?VIi:16777215; + const c=nAi.toolIcon(t.key,a); + s.img.visible=!!c,s.icon.visible=!c,c&&s.img.texture!==c&&(s.img.texture=c,s.img.scale.set(88/Math.max(c.width,c.height))),s.name.text=t.names[a],oki(s.name,tUi-130),s.kind.text=`${ + t.title} + · ${ + o?"보유":"다음"} + `,oki(s.kind,tUi-130),s.stage.text="auto"===t.key?0===h?"아직 미보유":`보유 ${ + h} + / ${ + r} + 단계`:`보유 ${ + h+1} + / ${ + r+1} + 단계`,s.pips.clear(); + const l="auto"===t.key?1:0; + for(let e=l; + e<=r; + e++)s.pips.roundRect(16*(e-l),0,12,7,3.5).fill(e<=h?VIi:UIi); + const[u,d]=oUi(t.key,h,a); + s.effect.text=u,s.fx.text=d,s.fx.textColor=o?VIi:qIi,oki(s.fx,tUi-28),s.up.btn.visible=!o,s.max.visible=o,o||s.up.set(t.prices[h+1],e.gold,this.busy)} + )} + } + ; + Qt(aUi,"FishingGearPage"),Zt(aUi,"instance"),Zt(aUi,"mode","boat"); + let cUi=aUi; + const lUi=Object.freeze(Object.defineProperty({ + __proto__:null,FishingGearPage:cUi} + ,Symbol.toStringTag,{ + value:"Module"} + )),uUi=CRi.CONTENT_W,dUi=class t extends OR{ + constructor(){ + super(),Zt(this,"bg",new ip),Zt(this,"title",rki("",KIi,14)),Zt(this,"detail",rki("",zIi,12,!1)),Zt(this,"reward",rki("",JIi,12)),Zt(this,"button",new pki("받기",92,38,13)),Zt(this,"row",null),this.addChild((new ip).rect(0,0,uUi,t.H).fill({ + color:0,alpha:.001} + )),this.title.position.set(12,9),this.detail.position.set(12,33),this.reward.position.set(12,53),this.button.position.set(uUi-104,17),this.button.onTap=()=>{ + var t,i; + return null==(i=null==(t=this.row)?void 0:t.action)?void 0:i.call(t)} + ,this.addChild(this.bg,this.title,this.detail,this.reward,this.button)} + setData(i){ + this.row=i,this.bg.clear().rect(0,0,uUi,t.H-5).fill(i.me?UIi:GIi),this.title.text=i.title,this.detail.text=i.detail,this.reward.text=i.reward; + for(const t of[this.title,this.detail,this.reward])oki(t,uUi-(i.button?126:24)); + this.button.visible=!!i.button,this.button.enabled=!!i.action,this.button.setText(i.button??"받기")} + } + ; + Qt(dUi,"SocialRow"),Zt(dUi,"H",76); + let fUi=dUi; + const pUi=class extends Ve{ + constructor(){ + super(),Zt(this,"title",rki("",KIi,18)),Zt(this,"detail",rki("",zIi,12,!1)),Zt(this,"status",rki("",zIi,12,!1)),Zt(this,"rule",rki("",JIi,12)),Zt(this,"action",new pki("참가하기",142,40,14)),Zt(this,"refresh",new pki("새로 보기",100,34,12)),Zt(this,"list",new TR(fUi,uUi,300,0)),Zt(this,"signature",""),Zt(this,"busy",!1),this.y=50,this.title.position.set(4,4),this.detail.position.set(4,36),this.rule.position.set(4,60),this.action.position.set(uUi-146,0),this.refresh.position.set(uUi-104,91),this.list.y=134,this.status.position.set(4,101),this.action.onTap=()=>{ + this.perform()} + ,this.refresh.onTap=()=>{ + RIi.getInstance().refreshSocial(!0)} + ,this.addChild(this.title,this.detail,this.rule,this.status,this.action,this.refresh,this.list)} + async perform(t){ + if(!this.busy){ + this.busy=!0; + try{ + const i=RIi.getInstance(),s=t?await i.claimSocial(t):await i.joinSocial(); + vH.getInstance().showMessage(s??(t?"보상을 받았어요":"오늘 대회에 참가했어요"))} + catch{ + vH.getInstance().showMessage("결과를 확인하지 못했어요. 새로 보기를 눌러 주세요")} + finally{ + this.busy=!1,this.render()} + } + } + render(){ + var t,i,s; + const e=RIi.getInstance(),n=e.social,h=[],r=null==n?void 0:n.board,o=(null==r?void 0:r.day)??(null==n?void 0:n.day)??1,a=yTi(o),c=e.claimableSocialIds(); + c.length&&h.push({ + title:`받을 보상 ${ + c.length} + 개`,detail:"끝난 대회·사냥 결과예요 · 이번 회차 교환이 끝나기 전까지 받아요",reward:"",button:"모두 받기",action:Qt(()=>{ + this.perform(c)} + ,"action")} + ); + for(const g of(null==n?void 0:n.rewards)??[])null===g.claimedAt&&g.seasonId===(null==(t=e.season)?void 0:t.id)&&h.push({ + title:`${ + "hunt"===g.source?"사냥":"대회"} + · ${ + g.title} + `,detail:`${ + g.date} + · ${ + g.rank?`${ + g.rank} + 위`:"기록 없음"} + ${ + g.hunt?` · ${ + g.hunt.killed?"사냥 성공":"달아났어요"} + · 내 피해 ${ + g.hunt.my} + `:` · ${ + (null==(i=g.contest)?void 0:i.record)??""} + `} + `,reward:`진주 ${ + g.participationPearl+g.rankPearl} + (참가 ${ + g.participationPearl} + + 순위 ${ + g.rankPearl} + )${ + g.gold?` · 골드 ${ + g.gold.toLocaleString()} + `:""} + `,button:"받기",action:Qt(()=>{ + this.perform([g.id])} + ,"action")} + ); + const l=e.state.contest; + l&&!l.claimed&&e.now()>=l.endAt&&h.push({ + title:"이전 방식으로 참가한 대회",detail:"받지 않은 결과가 있어요",reward:"이 대회의 원래 보상을 받아요",button:"받기",action:Qt(()=>{ + this.busy||(this.busy=!0,e.claimContest().finally(()=>{ + this.busy=!1,this.signature="",this.render()} + ))} + ,"action")} + ),this.title.text=`오늘 · ${ + a.title} + `; + const u=(null==r?void 0:r.endAt)??(null==n?void 0:n.endAt)??0,d=u-e.realNow(),f=u?new Date(u).toLocaleTimeString([],{ + hour:"2-digit",minute:"2-digit"} + ):""; + if(this.detail.text=d>0?`${ + (null==n?void 0:n.date)??""} + · 내 시간 ${ + f} + 마감 · ${ + Mki(d)} + 남음`:"오늘 대회를 마쳤어요. 잠시 후 새로 보기를 눌러 주세요",this.status.text=r?`${ + r.group} + 번 방 · 마지막 자동 낚시 기록은 마감 때 더해져요`:"빈자리에는 다른 낚시꾼이 들어와요",this.rule.text=`${ + a.desc} + · 1위 진주 30 ~ 30위 1 · 사냥 성공은 참가 + 순위 진주`,this.action.setText(r?`참가 중 · ${ + r.count} + /30명`:"참가하기"),this.action.enabled=!this.busy&&!r&&!!(null==n?void 0:n.enabled)&&"open"===e.phase()&&d>0,r)for(const g of r.rows)h.push({ + title:`${ + g.rank||"—"} + 위 · ${ + g.name} + ${ + g.me?" (나)":""} + `,detail:g.score>0?`기록 ${ + ATi(a,g.score)} + `:"아직 대회 기록이 없어요",reward:`예상 진주 ${ + FTi(g.rank)} + `,me:g.me} + ); + else h.push({ + title:"하루 중 언제든 참가해요",detail:"같은 게임 서버의 낚시꾼과 최대 30명이 겨뤄요",reward:"참가한 뒤 잡은 물고기부터 기록에 들어가요"} + ); + for(const g of(null==n?void 0:n.past)??[]){ + const t=g.rows.find(t=>t.me); + h.push({ + title:`${ + g.date} + · ${ + yTi(g.day).title} + `,detail:g.final?`내 순위 ${ + (null==t?void 0:t.rank)?`${ + t.rank} + 위`:"기록 없음"} + · ${ + g.count} + 명 참가`:"마지막 기록을 모으고 있어요",reward:g.final?"결과는 맨 위 받을 보상에서 받아요":"잠시 후 새로 보기를 눌러 주세요"} + )} + oki(this.title,uUi-162),oki(this.detail,uUi-8),oki(this.rule,uUi-8),oki(this.status,uUi-116),this.list.setListHeight(Math.max(80,CRi.contentHeight-this.y-((null==(s=this.parent)?void 0:s.y)??0)-this.list.y-8),!1); + const p=JSON.stringify(h); + p!==this.signature&&(this.signature=p,this.list.dataProvider=h)} + } + ; + Qt(pUi,"FishingSocialPanel"); + let gUi=pUi; + const wUi=.16,mUi=Qt(t=>Math.max(0,Math.min(1,t)),"c01"),vUi=Qt(t=>t*t,"eIn"),_Ui=Qt(t=>1-(1-t)*(1-t),"eOut"),MUi=Qt(t=>1+2.70158*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"backOut"); + function bUi(t){ + const i=vUi(mUi(t/wUi)); + let s=2.4-1.4*i,e=16*i-30,n=1,h=1; + const r=mUi(t/.07); + if(t>=wUi){ + const i=_Ui(mUi((t-wUi)/.12)); + n=1.12-.12*i,h=.9+.1*i,s=1-.03*Math.sin(Math.PI*mUi((t-.28)/.22)),e=-14} + const o=mUi((t-wUi)/.3),a=mUi((t-wUi)/.2); + return{ + scale:s,rot:e,sx:n,sy:h,alpha:r,burst:t<wUi?{ + s:0,a:0} + :{ + s:.8+.9*_Ui(o),a:.5*(1-o)} + ,shake:t<wUi?0:5*(1-a)*Math.sin(a*Math.PI*6),pin:t<.45?0:MUi(mUi((t-.45)/.25)),oldPin:1-mUi((t-.45)/.08)} + } + Qt(bUi,"stampPose"); + const yUi=CRi.CONTENT_W,EUi=[["area","수역"],["contest","대회"],["visit","의뢰"],["goal","업적"]].filter(([t])=>"visit"!==t||qTi),AUi=EUi.map(([t])=>t),SUi=Qt((t,i)=>10*Math.round(TTi(t)*STi(i)/10),"rankGold"),TUi=class t extends OR{ + constructor(){ + super(),Zt(this,"bg",new ip),Zt(this,"nameText",rki("",KIi,14)),Zt(this,"prog",rki("",zIi,12,!1)),Zt(this,"bar",new ip),Zt(this,"pearl",_ki("pearl",18)),Zt(this,"reward",rki("",JIi,13)),Zt(this,"btn",new pki("받기",110,40,14)),Zt(this,"row",null); + const i=(new ip).rect(0,0,yUi,t.H).fill({ + color:0,alpha:.001} + ); + i.eventMode="none",this.addChild(i),this.nameText.position.set(14,9),this.prog.position.set(14,36),this.bar.eventMode="none",this.btn.position.set(yUi-122,11),this.btn.onTap=()=>{ + var t; + return null==(t=this.row)?void 0:t.onClaim(this.btn)} + ,this.addChild(this.bg,this.nameText,this.prog,this.bar,this.pearl,this.reward,this.btn)} + setData(i){ + this.row=i; + const s=!i.claimed&&i.progress>=i.need; + this.bg.clear().roundRect(0,0,yUi,t.H-6,10).fill(s?2244666:GIi),this.nameText.text=i.label,this.nameText.textColor=i.claimed?YIi:KIi,this.pearl.position.set(14+this.nameText.width+12,10),this.reward.text=`${ + i.pearl} + `,this.reward.position.set(this.pearl.x+22,10),this.prog.text=`${ + Math.min(i.progress,i.need).toLocaleString()} + / ${ + i.need.toLocaleString()} + `,this.bar.clear(),vki(this.bar,150,42,yUi-150-140,8,i.progress/i.need,i.claimed?YIi:s?qIi:VIi),this.btn.enabled=s,this.btn.setText(i.claimed?"완료":"받기")} + } + ; + Qt(TUi,"GoalRow"),Zt(TUi,"H",66); + let CUi=TUi; + const OUi=class t extends Ve{ + constructor(){ + super(),Zt(this,"dim",new ip),Zt(this,"card",new Ve),Zt(this,"cardBg",new ip),Zt(this,"cup",new Ve),Zt(this,"big",rki("",16771496,44)),Zt(this,"sub",rki("",KIi,15)),Zt(this,"gap",rki("",VIi,14)),Zt(this,"goldIcon",_ki("gold",24)),Zt(this,"goldText",rki("",KIi,20)),Zt(this,"pearlIcon",_ki("pearl",24)),Zt(this,"pearlText",rki("",JIi,20)),Zt(this,"confetti",new Ve),Zt(this,"ok",new pki("낚시 지갑에 받기",360,50,17)),Zt(this,"tl",null),this.dim.eventMode="static",this.card.addChild(this.cardBg,this.confetti,this.cup,this.big,this.sub,this.gap,this.goldIcon,this.goldText,this.pearlIcon,this.pearlText,this.ok),this.confetti.eventMode="none",this.ok.position.set(40,334),this.ok.onTap=()=>{ + var t,i; + null==(t=this.tl)||t.progress(1); + const s=CRi.getInstance(); + s.flyCurrency("gold",this.goldIcon.toGlobal({ + x:12,y:12} + ),9),s.flyCurrency("pearl",this.pearlIcon.toGlobal({ + x:12,y:12} + ),5),null==(i=this.parent)||i.removeChild(this)} + ,this.addChild(this.dim,this.card)} + closeOne(){ + var t,i; + return null==(i=(t=this.ok).onTap)||i.call(t),!0} + layout(){ + const i=CRi.contentHeight,s=CRi.OVERLAY_PAD,e=t.CH; + this.dim.clear().rect(-s,0,yUi+2*s,i).fill({ + color:0,alpha:.65} + ),this.dim.hitArea=new Ui(-s,0,yUi+2*s,2e3),this.card.position.set(yUi/2,Math.max(10,(i-e)/2)+e/2)} + open(i){ + var s; + const e=t.CW,n=t.CH; + this.card.pivot.set(e/2,n/2),this.layout(); + const h=i.rank<=3; + if(this.cardBg.clear().roundRect(0,0,e,n,20).fill(h?2760978:FIi),h&&this.cardBg.roundRect(0,0,e,n,20).stroke({ + color:10123836,width:2} + ),this.cup.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),h){ + const t=Eki(i.rank,84); + t.position.set(-42,-42),this.cup.addChild(t)} + this.cup.position.set(e/2,70),this.big.textColor=1===i.rank?16765773:2===i.rank?15133679:3===i.rank?14721130:KIi; + const r=Qt(t=>1===t?"우승!":2===t?"아차상!":3===t?"3등!":`${ + t} + 등`,"title"); + this.sub.text=`${ + i.day} + 일차 ${ + i.title} + · 30명 중 ${ + i.rank} + 위 · 기록 ${ + "-"===i.record?"없음":i.record} + `,this.gap.text=i.gapToFirst?`1등과 ${ + i.gapToFirst} + 차이!`:h?"장식장에 컵이 남아요":"꼴찌까지 모두 골드를 받아요"; + const o=Qt((t,i)=>{ + oki(t,e-40),t.position.set((e-t.width)/2,i)} + ,"place"); + o(this.sub,200),o(this.gap,230); + const a={ + rank:30,gold:0,pearl:0} + ,c=Qt(()=>{ + this.goldText.text=Math.round(a.gold).toLocaleString(),this.pearlText.text=`${ + Math.round(a.pearl)} + `; + const t=30+this.goldText.width+30+30+this.pearlText.width; + this.goldIcon.position.set((e-t)/2,278),this.goldText.position.set(this.goldIcon.x+30,276),this.pearlIcon.position.set(this.goldText.x+this.goldText.width+30,278),this.pearlText.position.set(this.pearlIcon.x+30,276)} + ,"drawReward"),l=Qt(()=>{ + this.big.text=r(Math.round(a.rank)),this.big.pivot.set(this.big.width/2,this.big.height/2),this.big.position.set(e/2,160)} + ,"drawRank"); + l(),c(),this.confetti.removeChildren().forEach(t=>t.destroy()),CRi.getInstance().overlay.addChild(this),null==(s=this.tl)||s.kill(); + const u=MR.timeline(); + u.fromTo(this.card,{ + alpha:0} + ,{ + alpha:1,duration:.2} + ).fromTo(this.card.scale,{ + x:.9,y:.9} + ,{ + x:1,y:1,duration:.25,ease:"back.out(2)"} + ,0).set([this.sub,this.gap,this.goldIcon,this.goldText,this.pearlIcon,this.pearlText,this.ok,this.cup],{ + alpha:0} + ,0).to(a,{ + rank:i.rank,duration:.9,ease:"power2.out",onUpdate:l} + ,.15).call(()=>{ + jG(h?"success":"light"),qG.getInstance().playSFX(h?qG.SFX_TRUMPET:qG.SFX_POPUP),h&&this.burst(e)} + ,[],1.05).fromTo(this.big.scale,{ + x:1.6,y:1.6} + ,{ + x:1,y:1,duration:.35,ease:"back.out(3)"} + ,1.05).to(this.cup,{ + alpha:1,duration:.2} + ,1.05).fromTo(this.cup.scale,{ + x:.3,y:.3} + ,{ + x:1,y:1,duration:.45,ease:"back.out(2.5)"} + ,1.05).to([this.sub,this.gap],{ + alpha:1,duration:.25} + ,1.3).to([this.goldIcon,this.goldText,this.pearlIcon,this.pearlText],{ + alpha:1,duration:.2} + ,1.5).to(a,{ + gold:i.gold,pearl:i.pearl,duration:.7,ease:"power1.out",onUpdate:c} + ,1.5).to(this.ok,{ + alpha:1,duration:.2} + ,1.9),this.tl=u} + burst(t){ + const i=[16765773,16743019,8378016,8369919,15262964]; + for(let s=0; + s<36; + s++){ + const e=(new ip).rect(-3,-1.5,6,3).fill(i[s%i.length]); + e.position.set(t/2,90),this.confetti.addChild(e); + const n=-Math.PI/2+2.4*(Math.random()-.5),h=120+160*Math.random(); + MR.timeline({ + onComplete:Qt(()=>e.destroy(),"onComplete")} + ).to(e,{ + x:t/2+Math.cos(n)*h,y:90+Math.sin(n)*h*.8,rotation:8*Math.random(),duration:.6,ease:"power2.out"} + ).to(e,{ + y:"+="+(120+80*Math.random()),alpha:0,rotation:"+="+6*Math.random(),duration:1.1,ease:"power1.in"} + )} + } + } + ; + Qt(OUi,"ResultPanel"),Zt(OUi,"CW",440),Zt(OUi,"CH",404); + let IUi=OUi; + const kUi=class t extends Ve{ + constructor(){ + super(),Zt(this,"tabId","quest"),Zt(this,"view","area"),Zt(this,"socialPanel",new gUi),Zt(this,"body",new Ve),Zt(this,"result",new IUi),Zt(this,"contestLayer",new Ve),Zt(this,"cBg",aki(yUi,214,BIi,WIi,14)),Zt(this,"cIcon",yki("trophy",26,VIi)),Zt(this,"cTitle",rki("",VIi,20)),Zt(this,"cDesc",rki("",KIi,14,!1)),Zt(this,"cTarget",new lki(52)),Zt(this,"cTargetText",rki("",KIi,14)),Zt(this,"cTargetSub",rki("",zIi,12,!1)),Zt(this,"cGo",new pki("그곳으로",100,38,13)),Zt(this,"cStatus",rki("",KIi,14)),Zt(this,"cBar",new ip),Zt(this,"cBtn",new pki("참가하기",200,46,16)),Zt(this,"devEnd",new pki("끝내기(개발)",110,32,12)),Zt(this,"rewardTitle",rki("상금 · 30명 모두 받아요",KIi,15)),Zt(this,"rewardStrip",new Ve),Zt(this,"boardTitle",rki("",KIi,15)),Zt(this,"board",new Ve),Zt(this,"boardRows",[]),Zt(this,"calTitle",rki("10일 대회 달력",KIi,15)),Zt(this,"cal",[]),Zt(this,"calHint",rki("개발 · 날짜를 누르면 그날 대회를 바로 열어요",VIi,12)),Zt(this,"calBusy",!1),Zt(this,"visitLayer",new Ve),Zt(this,"vNext",rki("",zIi,13)),Zt(this,"vCards",[]),Zt(this,"areaLayer",new Ve),Zt(this,"areaKey",null),Zt(this,"areaSel",null),Zt(this,"areaSheet",!1),Zt(this,"areaPop",null),Zt(this,"areaSig",""),Zt(this,"areaBusy",!1),Zt(this,"pinGlows",[]),Zt(this,"slam",null),Zt(this,"slamRefs",{ + stamp:null,burst:null,panel:null,pin:null} + ),Zt(this,"previewIdx",-1),Zt(this,"goalLayer",new Ve),Zt(this,"goalList",new TR(CUi,yUi,400,0)),Zt(this,"records",new Ve),Zt(this,"contestBusy",!1),this.buildContest(),this.buildVisit(),this.records.y=52,this.goalList.y=190,this.goalLayer.addChild(this.records),this.goalLayer.addChild(this.goalList),this.body.y=-t.LIFT,this.body.addChild(this.contestLayer,this.visitLayer,this.areaLayer,this.goalLayer,this.socialPanel),this.addChild(this.body)} + static getInstance(){ + return this.instance??(this.instance=new t)} + get scrollInShell(){ + var t; + return"goal"!==this.view&&"area"!==this.view&&!("contest"===this.view&&(null==(t=RIi.getInstance().social)?void 0:t.enabled))} + closeOne(){ + return"area"===this.view&&(null!==this.areaPop?(this.areaPop=null,this.renderArea(!0),!0):!!this.areaSheet&&(this.areaSheet=!1,this.renderArea(!0),!0))} + onResize(){ + this.render()} + subTabs(){ + const t=RIi.getInstance(),i=yIi(t.dotsInput(!1)).seg; + return{ + items:EUi.map(([,t])=>t),index:AUi.indexOf(this.view),dots:AUi.map(s=>"contest"===s?i.contest||t.socialRewardsReady():!!i[s])} + } + selectSub(t){ + CRi.getInstance().exchangeOnly&&"contest"!==AUi[t]||(this.view=AUi[t],this.render())} + buildContest(){ + const t=this.contestLayer; + this.cBg.y=48,this.cIcon.position.set(16,62),this.cTitle.position.set(50,62),this.cDesc.position.set(16,98),this.cTarget.position.set(16,126),this.cTargetText.position.set(78,130),this.cTargetSub.position.set(78,154),this.cGo.setPrimary(!1),this.cGo.position.set(yUi-116,134),this.cGo.onTap=()=>{ + this.goContestSpot()} + ,this.cStatus.position.set(16,190),this.cBar.eventMode="none",this.cBtn.position.set(yUi-216,58),this.cBtn.onTap=()=>{ + this.onContestButton()} + ,this.devEnd.setPrimary(!1),this.devEnd.onTap=async()=>{ + await RIi.getInstance().devEndContest(),this.render()} + ,this.rewardTitle.position.set(4,274),this.rewardStrip.y=302,this.boardTitle.position.set(4,376),this.board.y=406; + for(let i=0; + i<7; + i++){ + const t=new Ve,s=new ip,e=new Ve,n=rki("",zIi,14),h=rki("",KIi,14),r=rki("",KIi,14),o=rki("",VIi,12); + s.eventMode="none",t.addChild(s,e,n,h,r,o),t.y=38*i,e.position.set(10,3),h.position.set(50,8),this.board.addChild(t),this.boardRows.push({ + root:t,bg:s,medal:e,rank:n,name:h,score:r,gold:o} + )} + t.addChild(this.cBg,this.cIcon,this.cTitle,this.cDesc,this.cTarget,this.cTargetText,this.cTargetSub,this.cGo,this.cStatus,this.cBar,this.cBtn,this.devEnd,this.rewardTitle,this.rewardStrip,this.boardTitle,this.board,this.calTitle); + for(let i=0; + i<10; + i++){ + const s=new ip,e=rki(`${ + i+1} + `,KIi,14),n=rki(bTi[i].title,zIi,11,!1),h=rki("",VIi,11),r=new Ve,o=new Ve; + s.eventMode="none",r.eventMode="none"; + const a={ + bg:s,day:e,title:n,res:h,cup:r,hit:o,d:i+1} + ; + o.cursor="pointer",o.on("pointertap",t=>{ + t.stopPropagation(),this.devOpenDay(a.d)} + ),t.addChild(s,e,n,h,r,o),this.cal.push(a)} + t.addChild(this.calHint)} + buildVisit(){ + this.vNext.position.set(4,52),this.visitLayer.addChild(this.vNext); + for(let t=0; + t<3; + t++){ + const i=new Ve; + i.y=82+192*t; + const s=new ip; + s.eventMode="none"; + const e=new ip,n=rki("",16777215,20),h=rki("",KIi,16),r=rki("",zIi,13,!1); + e.eventMode="none"; + const o=new lki(60),a=rki("",KIi,14),c=rki("",zIi,12,!1),l=new ip,u=new Ve; + l.eventMode="none",u.eventMode="none"; + const d=new pki("그곳으로",96,40,13),f=new pki("납품",104,44,15); + d.setPrimary(!1),h.position.set(76,14),r.position.set(76,40),r.setWrapWidth(yUi-90),o.position.set(16,80),a.position.set(88,82),c.position.set(88,106),u.position.set(16,150),d.position.set(yUi-216,128),f.position.set(yUi-116,126); + const p=new Ve; + p.eventMode="none"; + const g=new Ye(as.EMPTY); + g.position.set(12,10),g.eventMode="none",i.addChild(s,e,n,g,h,r,o,a,c,l,u,d,f,p),this.visitLayer.addChild(i),this.vCards.push({ + root:i,bg:s,av:e,init:n,face:g,npc:h,line:r,fish:o,ask:a,where:c,bar:l,reward:u,go:d,btn:f,stamp:p} + )} + } + openView(t){ + this.view=AUi.includes(t)?t:"reward"===t?"contest":"area","area"===this.view&&(this.areaKey=null,this.areaSel=null,this.areaSig="")} + onShow(){ + CRi.getInstance().exchangeOnly&&(this.view="contest"),RIi.getInstance().refreshSocial(!0),this.render()} + onHide(){ + this.areaSheet=!1,this.areaPop=null,this.stopPinGlows(),this.areaSig=""} + update(){ + "contest"===this.view&&RIi.getInstance().refreshSocial(),"goal"!==this.view&&this.render()} + async onContestButton(){ + if(!this.contestBusy){ + this.contestBusy=!0; + try{ + const t=RIi.getInstance(),i=t.contestStanding(),s=t.state.contest; + if(s&&(null==i?void 0:i.ended)&&!s.claimed){ + const i=await t.claimContest(); + i&&this.result.open(i)} + else{ + const i=await t.joinContest(); + i||jG("medium"),vH.getInstance().showMessage(i??`${ + t.state.contest.room} + 번 방 30명이 모였어요. 12시간 동안 겨뤄요!`)} + } + finally{ + this.contestBusy=!1} + this.render()} + } + contestShown(){ + const t=RIi.getInstance(),i=t.state.contest,s=t.eventDay(); + return yTi(i&&!i.claimed?i.day:s)} + async goContestSpot(){ + const t=this.contestShown(),i=RIi.getInstance(); + if(!t.speciesId)return; + const s=kSi(t.speciesId),e=await i.goTo(USi(s)); + e?vH.getInstance().showMessage(e):(vH.getInstance().showMessage(`${ + vSi[`${ + s.race} + |${ + s.zone} + `]} + (으)로 옮겼어요${ + s.roam?" · 회유어는 오늘 자리를 찾아야 해요":""} + `),CRi.getInstance().selectTab("fish"))} + render(){ + var t; + const i="contest"===this.view&&!!(null==(t=RIi.getInstance().social)?void 0:t.enabled); + this.socialPanel.visible=i,this.contestLayer.visible="contest"===this.view&&!i,this.visitLayer.visible="visit"===this.view,this.areaLayer.visible="area"===this.view,this.goalLayer.visible="goal"===this.view,this.socialPanel.visible?this.socialPanel.render():"contest"===this.view?this.renderContest():"visit"===this.view?this.renderVisit():"area"===this.view?this.renderArea():this.renderGoals()} + areaRowsOf(t,i){ + return RIi.getInstance().areaRows(t,i).map(t=>t.idx===this.previewIdx?{ + ...t,claimed:!0,ready:!1} + :t)} + defaultArea(t,i,s){ + const e=t.find(t=>t.ready); + if(e)return e.point; + const n=RIi.getInstance().state.spot; + return n.race===i&&n.zone===s?n.point:([...t].filter(t=>!t.claimed).sort((t,i)=>t.missing.length-i.missing.length||t.point-i.point)[0]??t[0]).point} + stopPinGlows(){ + this.pinGlows.forEach(t=>t.kill()),this.pinGlows=[]} + static mapView(t,i,s,e){ + const n=650,h=s/e; + let r=Math.min(...t.map(t=>t.x))-n,o=Math.min(...t.map(t=>t.y))-n,a=Math.max(...t.map(t=>t.x))+n-r,c=Math.max(...t.map(t=>t.y))+n-o; + if(a/c<h){ + const t=c*h; + r-=(t-a)/2,a=t} + else{ + const t=a/h; + o-=(t-c)/2,c=t} + a>i&&(a=i,c=a/h),c>i&&(c=i,a=c*h),r=Math.max(0,Math.min(i-a,r)),o=Math.max(0,Math.min(i-c,o)); + const l=s/a; + return{ + k:l,ox:r*l,oy:o*l} + } + renderArea(i=!1){ + const s=RIi.getInstance(),e=s.state,n=CRi.contentHeight; + this.areaKey||(this.areaKey=`${ + e.spot.race} + |${ + e.spot.zone} + `); + const h=this.areaKey,[r,o]=h.split("|"),a=this.areaRowsOf(r,o); + null===this.areaSel&&(this.areaSel=this.defaultArea(a,r,o)); + const c=[h,this.areaSel,s.areaClaimed().join(","),Object.keys(e.dex).length,`${ + e.spot.race} + ${ + e.spot.zone} + ${ + e.spot.point} + `,this.areaSheet,this.areaPop,e.gear.boat,Math.round(n),this.previewIdx].join("|"); + if(!i&&(this.slam||c===this.areaSig))return; + this.areaSig=c; + const l=this.areaLayer; + this.stopPinGlows(),this.slamRefs={ + stamp:null,burst:null,panel:null,pin:null} + ,l.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const u=t.LIFT+4,d=a.filter(t=>t.claimed).length,f=new Ve,p=new ip,g=(new ip).circle(0,0,5.5).fill(hki[r]),w=rki(vSi[h],KIi,20),m=rki(`${ + r} + · ${ + pSi[o]} + `,zIi,13),v=(new ip).moveTo(0,0).lineTo(6,6).lineTo(12,0).stroke({ + color:zIi,width:3,cap:"round",join:"round"} + ); + g.position.set(18,26),w.position.set(32,(52-w.height)/2),m.position.set(w.x+w.width+8,w.y+w.height-m.height-2),v.position.set(m.x+m.width+10,23); + const _=v.x+12+14; + p.roundRect(0,0,_,52,12).fill(GIi),p.eventMode=g.eventMode=v.eventMode="none",f.addChild(p,g,w,m,v),f.position.set(0,u),f.eventMode="static",f.cursor="pointer",f.hitArea=new Ui(0,0,_,52),f.on("pointertap",t=>{ + t.stopPropagation(),queueMicrotask(()=>{ + this.areaSheet=!0,this.renderArea(!0)} + )} + ); + const M=9===d,b=new ip,y=_ki("pearl",18),E=rki("+300",M?VIi:zIi,15),A=38+E.width+14; + b.roundRect(0,0,A,40,20).fill(M?ZIi:GIi),b.position.set(yUi-A,u+6),y.position.set(b.x+14,u+17),E.position.set(y.x+24,u+26-E.height/2); + const S=rki(`${ + d} + /9`,KIi,19),T=rki("수역",zIi,13); + S.position.set(b.x-12-S.width,u+26-S.height/2),T.position.set(S.x-6-T.width,u+26-T.height/2+1),l.addChild(f,b,y,E,T,S); + const C=Math.max(240,Math.min(470,n-84-392)),O=u+64,I=nAi.topdownInfo(h),k=t.mapView(I.points,I.w,yUi,C),R=new Ve; + R.position.set(0,O); + const x=new Ye(FDi.regionMap(h)); + x.width=x.height=I.w*k.k,x.position.set(-k.ox,-k.oy),x.eventMode="none"; + const P=(new ip).roundRect(0,0,yUi,C,16).fill(16777215); + x.mask=P,R.addChild(x,P); + const N=e.spot.race===r&&e.spot.zone===o?e.spot.point:-1; + a.forEach(t=>{ + const i=I.points[t.point],s=Math.max(32,Math.min(yUi-32,i.x*k.k-k.ox)),e=Math.max(40,Math.min(C-44,i.y*k.k-k.oy)),n=t.point===this.areaSel; + if(!t.claimed&&!t.ready&&!n){ + const i=rki(`${ + t.have} + /${ + t.need} + `,KIi,12),n=(new ip).roundRect(0,0,i.width+16,i.height+4,10).fill({ + color:657932,alpha:.78} + ); + n.position.set(s-(i.width+16)/2,e+28),i.position.set(n.x+8,n.y+2),n.eventMode="none",R.addChild(n,i)} + if(R.addChild(this.buildPin(t,s,e,n,h)),t.point===N){ + const t=rki("지금 여기",jIi,12),i=t.width+16,h=e-(n?40:34)-22,r=(new ip).roundRect(s-i/2,h,i,22,9).fill(VIi).poly([s-5,h+22,s+5,h+22,s,h+27]).fill(VIi); + r.eventMode="none",t.position.set(s-t.width/2,h+(22-t.height)/2),R.addChild(r,t)} + } + ),l.addChild(R),this.drawAreaPanel(l,a[this.areaSel]??a[0],O+C+12,t.LIFT+n-4,h),this.areaSheet&&this.drawAreaSheet(l,n),null!==this.areaPop&&this.drawAreaPop(l,this.areaPop,n)} + buildPin(t,i,s,e,n){ + const h=new Ve; + if(h.position.set(i,s),e){ + const t=(new ip).circle(0,0,29).fill({ + color:16777215,alpha:.85} + ); + t.eventMode="none",h.addChild(t)} + if(t.claimed){ + const i=nAi.areaStamp("mini"),s=new Ve; + if(i){ + const t=new Ye(i); + t.anchor.set(.5),t.width=t.height=48,s.addChild(t)} + else s.addChild((new ip).circle(0,0,24).fill(13909298)); + this.slam&&this.slam.key===n&&this.slam.p===t.point&&(s.scale.set(0),this.slamRefs.pin=s),h.addChild(s)} + else if(t.ready){ + const t=(new ip).circle(0,0,24).fill(VIi),i=(new ip).circle(0,0,24).fill(VIi),s=_ki("pearl",22); + t.eventMode=i.eventMode="none",s.position.set(-11,-11),h.addChild(t,i,s),e||this.pinGlows.push(MR.fromTo(t,{ + alpha:.7} + ,{ + alpha:0,duration:1.4,repeat:-1,ease:"power1.out",onUpdate:Qt(()=>{ + t.scale.set(1+.6*(1-t.alpha/.7))} + ,"onUpdate")} + ))} + else{ + const i=t.need?t.have/t.need:0,s=(new ip).circle(0,0,24).fill({ + color:16777215,alpha:.22} + ); + i>0&&s.moveTo(0,0).arc(0,0,24,-Math.PI/2,-Math.PI/2+2*Math.PI*i).closePath().fill(VIi),s.circle(0,0,19).fill(1447707),s.eventMode="none"; + const e=rki(`${ + t.point+1} + `,16777215,18); + e.position.set(-e.width/2,-e.height/2),h.addChild(s,e)} + return h.scale.set(e?1.22:1),h.eventMode="static",h.cursor="pointer",h.hitArea=new la(0,0,30),h.on("pointertap",i=>{ + i.stopPropagation(),queueMicrotask(()=>{ + this.areaSel=t.point,this.renderArea(!0)} + )} + ),h} + drawAreaPanel(i,s,e,n,h){ + const r=RIi.getInstance(),o=r.state,a=Math.max(300,n-e),c=16,l=new Ve; + l.position.set(0,e); + const u=(new ip).roundRect(0,0,yUi,a,16).fill(GIi); + u.eventMode="none",l.addChild(u); + const d=new Ve; + if(s.claimed){ + const t=nAi.areaStamp("mini"); + if(t){ + const i=new Ye(t); + i.width=i.height=34,d.addChild(i)} + } + else if(s.ready){ + d.addChild((new ip).circle(17,17,15).fill(VIi)); + const t=_ki("pearl",18); + t.position.set(8,8),d.addChild(t)} + else{ + const t=s.need?s.have/s.need:0,i=(new ip).circle(17,17,15).fill({ + color:16777215,alpha:.22} + ); + t>0&&i.moveTo(17,17).arc(17,17,15,-Math.PI/2,-Math.PI/2+2*Math.PI*t).closePath().fill(VIi),i.circle(17,17,12).fill(1447707); + const e=rki(`${ + s.point+1} + `,16777215,14); + e.position.set(17-e.width/2,17-e.height/2),d.addChild(i,e)} + d.position.set(c,14); + const f=rki(s.name,KIi,19); + f.position.set(60,31-f.height/2); + const p=qRi(`난이도 ${ + s.level} + `,zIi,BIi); + if(l.addChild(d,f,p),s.claimed)oki(f,yUi-170-p.width-10-f.x); + else{ + const t=_ki("pearl",20),i=rki(`${ + s.pearl} + `,JIi,16); + i.position.set(yUi-c-i.width,31-i.height/2),t.position.set(i.x-24,21),l.addChild(t,i),oki(f,t.x-12-p.width-10-f.x)} + p.position.set(f.x+f.width+10,18); + const g=rki(`${ + s.claimed?"클리어":s.ready?"다 잡았어요!":`남은 물고기 ${ + s.missing.length} + `} + · ${ + s.have} + /${ + s.need} + `,zIi,14),w=s.claimed?yUi-150:yUi-c; + g.position.set(w-g.width,60); + const m=new ip; + vki(m,c,66,Math.max(60,g.x-12-c),8,s.need?s.have/s.need:0,s.claimed?qIi:VIi),m.eventMode="none",l.addChild(m,g); + const v=[...s.missing,...s.species.filter(t=>o.dex[t.id])],_=(yUi-32)/6; + v.forEach((t,i)=>{ + const s=!!o.dex[t.id],e=c+i%6*_,n=92+110*Math.floor(i/6),h=new Ve,r=new lki(72,!1,!0); + r.set(t.id,t.star,0,!s),r.setFade(s?.55:1),r.setMark(null,GIi),r.position.set((_-72)/2,0); + const a="전체"===t.tide?null:mSi[wSi.indexOf(t.tide)],u=rki(s?"✓ 잡음":`${ + "O"===t.zone&&"B"===t.depth?"심해":gSi[t.depth]} + ${ + a?` · ${ + a} + `:""} + `,s?qIi:zIi,12,s); + oki(u,_-4),u.position.set((_-u.width)/2,80),h.addChild(r,u),h.position.set(e,n),h.eventMode="static",h.cursor="pointer",h.hitArea=new Ui(0,0,_,102),h.on("pointertap",i=>{ + i.stopPropagation(),queueMicrotask(()=>{ + this.areaPop=t.id,this.renderArea(!0)} + )} + ),l.addChild(h)} + ); + const M=a-c-58; + if(s.ready){ + const t=new pki("",yUi-32,58,18),i=rki("받기",jIi,18),e=_ki("pearl",22),n=rki(`${ + s.pearl} + `,jIi,18),h=i.width+10+22+6+n.width; + i.position.set((yUi-32-h)/2,(58-i.height)/2),e.position.set(i.x+i.width+10,18),n.position.set(e.x+28,(58-n.height)/2),t.addChild(i,e,n),t.position.set(c,M),t.onTap=()=>{ + this.claimAreaRow(s,t)} + ,l.addChild(t)} + else if(s.claimed){ + const t=r.areaClaimed().filter(t=>Math.floor(t/9)===Math.floor(s.idx/9)).length+(this.previewIdx!==s.idx||r.areaClaimed().includes(s.idx)?0:1),i=(new ip).roundRect(c,M,yUi-32,58,9).fill(2762274),e=_ki("pearl",20),n=rki(`진주 ${ + s.pearl} + 받았어요 · 도장 ${ + t} + /9`,zIi,16),h=28+n.width; + e.position.set((yUi-h)/2,M+19),n.position.set(e.x+28,M+(58-n.height)/2),i.eventMode="none",l.addChild(i,e,n)} + else{ + const t=o.spot.race===s.race&&o.spot.zone===s.zone&&o.spot.point===s.point,i=new pki(t?"지금 이 수역에 있어요":"이 수역으로 가기",yUi-32,58,17); + i.setPrimary(!1),i.enabled=!t,i.position.set(c,M),i.onTap=()=>{ + this.goAreaRow(s)} + ,l.addChild(i)} + if(s.claimed){ + const i=bUi(this.slam&&this.slam.key===h&&this.slam.p===s.point?0:1.2),e=new Ve,n=new ip,r=new Ve; + e.position.set(yUi-4-75,59),n.circle(0,0,92).fill({ + color:13909298,alpha:.18} + ).circle(0,0,75).cut().circle(0,0,75).fill({ + color:13909298,alpha:.55} + ).circle(0,0,58).cut(),n.scale.set(i.burst.s),n.alpha=i.burst.a; + const o=nAi.areaStamp(s.level); + if(o){ + const t=new Ye(o); + t.anchor.set(.5),t.width=t.height=150,r.addChild(t)} + t.poseStamp(r,i),e.addChild(n,r),e.eventMode="none",l.addChild(e),this.slam&&this.slam.key===h&&this.slam.p===s.point&&(this.slamRefs.stamp=r,this.slamRefs.burst=n,this.slamRefs.panel=l)} + i.addChild(l)} + static poseStamp(t,i){ + t.scale.set(i.scale*i.sx,i.scale*i.sy); + const s=t.children[0]; + s&&(s.rotation=i.rot*Math.PI/180),t.alpha=i.alpha} + async claimAreaRow(t,i){ + if(this.areaBusy)return; + this.areaBusy=!0; + const s=RIi.getInstance(),e=i.toGlobal({ + x:(yUi-32)/2,y:29} + ); + try{ + const i=await s.claimArea(t.race,t.zone,t.point); + if(i.message)return void vH.getInstance().showMessage(i.message); + vH.getInstance().showMessage(i.bonus?`${ + t.name} + 도장! 진주 ${ + i.pearl} + · 지역 9곳을 다 채워 진주 ${ + i.bonus} + 더`:`${ + t.name} + 도장! 진주 ${ + i.pearl} + `),this.playSlam(`${ + t.race} + |${ + t.zone} + `,t.point,e,i.bonus?10:5)} + finally{ + this.areaBusy=!1} + } + playSlam(i,s,e,n){ + this.areaKey=i,this.areaSel=s; + const h={ + key:i,p:s,t0:performance.now(),from:e,pearls:n,hit:!1,flown:!1} + ; + this.slam=h,this.renderArea(!0); + const r=Qt(()=>{ + if(this.slam!==h)return; + const i=Math.min(1.2,(performance.now()-h.t0)/1e3*t.stampSpeed),s=bUi(i),e=this.slamRefs; + e.stamp&&!e.stamp.destroyed&&t.poseStamp(e.stamp,s),e.burst&&!e.burst.destroyed&&(e.burst.scale.set(s.burst.s),e.burst.alpha=s.burst.a),e.panel&&!e.panel.destroyed&&(e.panel.x=s.shake),e.pin&&!e.pin.destroyed&&e.pin.scale.set(s.pin),!h.hit&&i>=wUi&&(h.hit=!0,jG("medium"),qG.getInstance().playSFX(qG.SFX_WOOD_MALLET)),!h.flown&&i>=.3&&(h.flown=!0,h.pearls&&CRi.getInstance().flyCurrency("pearl",h.from,h.pearls)),i<1.2?requestAnimationFrame(r):(this.slam=null,this.renderArea(!0))} + ,"step"); + requestAnimationFrame(r)} + async goAreaRow(t){ + var i; + const s=RIi.getInstance(),e=await s.goTo({ + race:t.race,zone:t.zone,point:t.point,depth:(null==(i=t.missing[0])?void 0:i.depth)??s.state.spot.depth} + ); + e?vH.getInstance().showMessage(e):(vH.getInstance().showMessage(`${ + t.name} + (으)로 가요 · 못 잡은 물고기 ${ + t.missing.length} + 마리`),CRi.getInstance().selectTab("fish"))} + drawAreaSheet(i,s){ + const e=RIi.getInstance(),n=e.state,h=CRi.OVERLAY_PAD,r=t.LIFT,o=(new ip).rect(-h,r,yUi+2*h,s).fill({ + color:0,alpha:HIi} + ); + o.eventMode="static",o.on("pointertap",t=>{ + t.stopPropagation(),queueMicrotask(()=>{ + this.areaSheet=!1,this.renderArea(!0)} + )} + ); + const a=["R","C","O"],c=(yUi-74-16)/3,l=90+96*uSi.length+16,u=new Ve; + u.position.set(0,r+s-l),u.eventMode="static",u.on("pointertap",t=>t.stopPropagation()),u.addChild((new ip).roundRect(-h,0,yUi+2*h,l+30,22).fill(FIi)); + const d=rki("지역",KIi,19),f=rki(`12곳 · 수역 ${ + e.areaClaimed().length} + /108 · 지역마다 9곳을 다 채우면 진주 +300`,zIi,13); + d.position.set(0,24),f.position.set(d.width+14,24+d.height-f.height-2),oki(f,yUi-60-f.x); + const p=new Ve,g=(new ip).moveTo(12,12).lineTo(28,28).moveTo(28,12).lineTo(12,28).stroke({ + color:zIi,width:3,cap:"round"} + ); + g.eventMode="none",p.addChild(g),p.position.set(yUi-40,16),p.eventMode="static",p.cursor="pointer",p.hitArea=new Ui(0,0,40,40),p.on("pointertap",t=>{ + t.stopPropagation(),queueMicrotask(()=>{ + this.areaSheet=!1,this.renderArea(!0)} + )} + ),u.addChild(d,f,p),a.forEach((t,i)=>{ + const s=rki(pSi[t],zIi,13); + s.position.set(74+i*(c+8)+(c-s.width)/2,70),u.addChild(s)} + ),uSi.forEach((t,i)=>{ + const s=96+96*i,e=(new ip).circle(6,s+44,5).fill(hki[t]),h=rki(t,KIi,14); + e.eventMode="none",h.position.set(18,s+(88-h.height)/2),u.addChild(e,h),a.forEach((i,e)=>{ + const h=`${ + t} + |${ + i} + `,r=74+e*(c+8),o=n.gear.boat<DAi.ENTRY[i],a=this.areaRowsOf(t,i),l=a.filter(t=>t.claimed).length,d=new Ve,f=(new ip).roundRect(0,0,c,88,12).fill(o?1908001:h===this.areaKey?ZIi:GIi); + f.eventMode="none"; + const p=rki(vSi[h],o?YIi:KIi,15); + if(p.position.set(12,16),oki(p,c-24),d.addChild(f,p),o){ + const t=NIi("lock",16,YIi,2.4),s=rki(`배 ${ + DAi.ENTRY[i]+1} + 단계부터`,YIi,12); + t.position.set(12,54),s.position.set(32,62-s.height/2),oki(s,c-44),d.addChild(t,s)} + else{ + const t=rki(`${ + l} + /9`,zIi,13),i=new ip; + if(t.position.set(12,62-t.height/2),a.forEach((s,e)=>i.roundRect(t.x+t.width+8+11*e,58,8,8,2.5).fill(s.claimed?13909298:s.ready?VIi:3816e3)),i.eventMode="none",d.addChild(t,i),a.some(t=>t.ready)){ + const t=(new ip).circle(c-12,12,5).fill(15029053); + t.eventMode="none",d.addChild(t)} + d.eventMode="static",d.cursor="pointer",d.hitArea=new Ui(0,0,c,88),d.on("pointertap",t=>{ + t.stopPropagation(),queueMicrotask(()=>{ + this.areaKey=h,this.areaSel=null,this.areaSheet=!1,this.renderArea(!0)} + )} + )} + d.position.set(r,s),u.addChild(d)} + )} + ),i.addChild(o,u)} + drawAreaPop(i,s,e){ + const n=RIi.getInstance(),h=kSi(s),r=!!n.state.dex[s],o=CRi.OVERLAY_PAD,a=t.LIFT,c=Qt(()=>{ + queueMicrotask(()=>{ + this.areaPop=null,this.renderArea(!0)} + )} + ,"close"),l=(new ip).rect(-o,a,yUi+2*o,e).fill({ + color:0,alpha:HIi} + ); + l.eventMode="static",l.on("pointertap",t=>{ + t.stopPropagation(),c()} + ); + const u=Math.min(yUi-40,500),d=new Ve,f=new ip; + d.eventMode="static",d.on("pointertap",t=>t.stopPropagation()); + const p=new lki(104,!1,!0); + p.set(h.id,h.star,0,!r),p.position.set(20,20); + const g=rki(r?h.name:"???",r?KIi:zIi,21); + g.position.set(142,22),oki(g,u-20-122-52); + const w=new Ve,m=$Si(h); + [qRi(`★${ + h.star} + `,VIi,BIi),qRi(h.kind,zIi,BIi),...m?[qRi(m,zIi,BIi)]:[]].forEach((t,i,s)=>{ + t.x=i?s[i-1].x+s[i-1].width+6:0,w.addChild(t)} + ),w.position.set(142,56); + const v=XRi([{ + text:r?"✓ 잡았어요":"아직 못 잡았어요",color:r?qIi:zIi} + ]); + v.position.set(142,94); + const _=JRi(h,!r&&h.star>=3,u-40); + _.position.set(20,144); + const M=new Ve,b=(new ip).moveTo(14,14).lineTo(30,30).moveTo(30,14).lineTo(14,30).stroke({ + color:zIi,width:3,cap:"round"} + ); + b.eventMode="none",M.addChild(b),M.position.set(u-52,8),M.eventMode="static",M.cursor="pointer",M.hitArea=new Ui(0,0,44,44),M.on("pointertap",t=>{ + t.stopPropagation(),c()} + ); + const y=144+_.height+20; + f.roundRect(0,0,u,y,16).fill(FIi),d.addChild(f,p,g,w,v,_,M),d.hitArea=new Ui(0,0,u,y),d.position.set((yUi-u)/2,a+Math.max(10,(e-y)/2)),i.addChild(l,d)} + previewStamp(t=!1){ + const i=RIi.getInstance(),s=i.state.spot,e=`${ + s.race} + |${ + s.zone} + `,n=i.areaRows(s.race,s.zone),h=n.findIndex(t=>t.idx===this.previewIdx),r=t?h+1:Math.max(0,h),o=[...n.slice(r),...n.slice(0,r)].find(t=>!t.claimed)??n[0]; + this.view="area",this.previewIdx=o.idx,this.playSlam(e,o.point,{ + x:0,y:0} + ,0)} + renderContest(){ + var t; + const i=RIi.getInstance(),s=i.state,e=i.eventDay(),n=i.now(),h=s.contest,r=i.contestStanding(),o=!!h&&!h.claimed,a=this.contestShown(),c=o&&h.day!==e&&OG.getInstance().development&&!(null==r?void 0:r.ended); + this.cTitle.text=`${ + o?h.day:e} + 일차 · ${ + a.title} + ${ + o&&h.day!==e?c?" · 개발로 엶":" (지난 대회)":""} + `,oki(this.cTitle,yUi-280),this.cDesc.text=a.desc,oki(this.cDesc,yUi-32); + const l=a.speciesId?kSi(a.speciesId):null; + if(this.cTarget.visible=!!l,this.cGo.visible=!!l,l){ + const t=!!s.dex[l.id]; + this.cTarget.set(l.id,l.star,0,!t),this.cTargetText.text=`${ + t?l.name:"???"} + · 가장 무거운 한 마리`,this.cTargetSub.text=`${ + vSi[`${ + l.race} + |${ + l.zone} + `]} + · ${ + "전체"===l.tide?"모든 물때":`${ + l.tide} + 물때`} + · ${ + t?HSi(l):"소문만 무성해요"} + `,this.cTargetText.x=this.cTargetSub.x=78} + else{ + const t=PSi(n); + this.cTargetText.text="tidePct"===a.kind?`${ + mSi[a.tide]} + 에 잡은 물고기만`:"class"===a.kind?`${ + a.kindClass} + 종류만`:"어디서 잡아도 돼요",this.cTargetSub.text="tidePct"===a.kind?t===a.tide?"지금이 그 시간대예요!":`다음 ${ + mSi[a.tide]} + 까지 ${ + Mki(LSi(n,a.tide))} + `:"count"===a.kind||"class"===a.kind||"dex"===a.kind?"켜둔 시간이 길수록 유리해요":"종 대비 크기(%)로 겨뤄서 대양 고래가 없어도 공평해요",this.cTargetText.x=this.cTargetSub.x=16} + oki(this.cTargetText,yUi-210),oki(this.cTargetSub,yUi-210); + const u=!!h&&h.day===e; + if(this.cBar.clear(),h&&r&&!h.claimed?(this.cStatus.text=r.ended?`대회 끝! 지금 ${ + r.myRank} + 위 · 결과를 받아 주세요`:`${ + h.room} + 번 방 · 지금 ${ + r.myRank} + 위 · 남은 시간 ${ + Mki(h.endAt-n)} + `,this.cBtn.setText(r.ended?"결과 받기":"진행 중"),this.cBtn.enabled=r.ended,vki(this.cBar,16,218,yUi-32-(this.devEnd.visible?120:0),6,r.progress,r.ended?qIi:VIi)):u?(this.cStatus.text="오늘 대회는 끝났어요. 내일 새 대회가 열려요.",this.cBtn.setText("내일 다시"),this.cBtn.enabled=!1):null!=(null==(t=i.season)?void 0:t.endAt)&&n+432e5>i.season.endAt+(s.devOffset??0)?(this.cStatus.text="오늘 대회는 마감됐어요. 회차가 곧 끝나요",this.cBtn.setText("마감"),this.cBtn.enabled=!1):(this.cStatus.text="누르면 선착순으로 30명 방에 들어가요. 방이 차면 12시간.",this.cBtn.setText("참가하기"),this.cBtn.enabled=!0),oki(this.cStatus,yUi-32-120),this.devEnd.visible=OG.getInstance().development&&!!h&&!!r&&!r.ended&&!h.claimed,this.devEnd.position.set(yUi-126,186),this.renderRewardStrip(o?h.day:e),this.board.visible=this.boardTitle.visible=!(!h||!r||h.claimed),h&&r&&!h.claimed){ + this.boardTitle.text=`${ + h.room} + 번 방 순위 · 30명`; + const t=yTi(h.day),i=r.rows,s=r.myRank-1,e=s<6?i.slice(0,7).map((t,i)=>({ + r:t,i} + )):[...i.slice(0,5).map((t,i)=>({ + r:t,i} + )),{ + r:null,i:-1} + ,{ + r:i[s],i:s} + ]; + this.boardRows.forEach((i,s)=>{ + const n=e[s]; + if(i.root.visible=!!n,!n)return; + i.bg.clear(); + const r=n.r&&n.r.score>0?n.i+1:0; + if(i.medal.label!==String(r)&&(i.medal.label=String(r),i.medal.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),r>=1&&r<=3&&i.medal.addChild(Aki(r,28))),!n.r)return i.rank.text="",i.name.text="⋮",i.score.text="",void(i.gold.text=""); + const o=n.r.me,a=n.i+1; + i.bg.roundRect(0,0,yUi,34,8).fill(o?UIi:GIi),o&&i.bg.stroke({ + color:6012341,width:1.5} + ),i.rank.text=r>=1&&r<=3?"":r?`${ + r} + `:"-",i.rank.position.set(24-i.rank.width/2,8),i.name.text=`${ + o?"나":n.r.name} + ${ + 1===r?" · 우승":2===r?" · 아차상":""} + `,i.name.textColor=o?10481894:KIi,i.score.text=n.r.score>0?ATi(t,n.r.score):"기록 없음",i.score.textColor=n.r.score>0?KIi:YIi,i.gold.text=`${ + SUi(h.day,a).toLocaleString()} + G`,i.gold.alpha=r?1:.5,i.gold.position.set(yUi-14-i.gold.width,10),i.score.position.set(yUi-104-i.score.width,8)} + )} + const d=12+(this.board.visible?676:376); + this.calTitle.position.set(4,d); + const f=(yUi-24)/5,p=OG.getInstance().development,g=p&&h&&!h.claimed?h.day:e; + this.calHint.visible=p,this.calHint.position.set(yUi-this.calHint.width-4,d+2); + const w=10*Math.floor((Math.max(1,e)-1)/10); + this.cal.forEach((t,i)=>{ + const n=i%5*(f+6),h=d+30+66*Math.floor(i/5),r=w+i+1,o=r===g,a=!p&&r<e,c=s.history.find(t=>t.day===r); + t.d=r,t.hit.eventMode=p?"static":"none",t.hit.hitArea=new Ui(n,h,f,60),t.bg.clear().roundRect(n,h,f,60,8).fill(o?VIi:GIi),o||t.bg.stroke({ + color:WIi,width:1,alpha:a?.4:1} + ),t.day.text=`${ + r} + 일`,t.day.textColor=o?jIi:a?YIi:KIi,t.day.position.set(n+8,h+5),t.title.text=yTi(r).title,t.title.textColor=o?jIi:zIi,oki(t.title,f-12),t.title.position.set(n+8,h+36); + const l=c&&c.rank<=3?c.rank:0; + if(t.cup.label!==String(l)&&(t.cup.label=String(l),t.cup.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),l)){ + const i=Eki(l,26); + i.position.set(n+f-30,h+4),t.cup.addChild(i)} + t.res.text=c&&!l?`${ + c.rank} + 위`:"",t.res.position.set(n+f-t.res.width-6,h+7)} + )} + async devOpenDay(t){ + if(!this.calBusy&&OG.getInstance().development){ + this.calBusy=!0; + try{ + const i=await RIi.getInstance().devContestDay(t); + vH.getInstance().showMessage(i??`${ + t} + 일 · ${ + yTi(t).title} + 대회를 열었어요 (개발 · 12시간)`),i||jG("light")} + finally{ + this.calBusy=!1} + this.render()} + } + renderRewardStrip(t){ + const i=this.rewardStrip; + if(i.label===String(t))return; + i.label=String(t),i.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const s=(yUi-24)/4; + [{ + r:1,t:"우승"} + ,{ + r:2,t:"아차상"} + ,{ + r:3,t:"3등"} + ,{ + r:30,t:"꼴찌도"} + ].forEach((e,n)=>{ + const h=n*(s+8); + if(i.addChild(Object.assign(aki(s,58,GIi,WIi,10),{ + x:h} + )),e.r<=3){ + const t=Aki(e.r,24); + t.position.set(h+8,5),i.addChild(t)} + const r=rki(e.t,e.r<=3?KIi:zIi,12); + r.position.set(h+(e.r<=3?36:10),9); + const o=_ki("gold",14); + o.position.set(h+10,35); + const a=rki(`${ + SUi(t,e.r).toLocaleString()} + · 진주 ${ + CTi(e.r)} + `,VIi,12); + oki(a,s-34),a.position.set(h+28,33),i.addChild(r,o,a)} + )} + renderVisit(){ + const t=RIi.getInstance(),i=t.quests(),s=t.visitorsOpen(); + if(this.vCards.forEach((t,e)=>{ + t.root.visible=s&&e<i.reqs.length} + ),!s)return this.vNext.text="아직 찾아온 손님이 없어요",void oki(this.vNext,yUi-8); + this.vNext.text=`손님 배를 눌러도 납품할 수 있어요 · 다음 손님까지 ${ + Mki(i.nextAt-t.now())} + `,oki(this.vNext,yUi-8); + const e=[14921803,13132906,5995472]; + i.reqs.forEach((s,n)=>{ + const h=this.vCards[n],r=kSi(s.speciesId),o=i.done.includes(s.key),a=t.questHave(s),c=!o&&a>=s.count; + h.bg.clear().roundRect(.5,.5,yUi-1,180,14).fill(c?2244666:GIi).stroke({ + color:c?qIi:WIi,width:c?1.5:1} + ),h.av.clear().circle(40,38,26).fill(e[n]).circle(40,38,26).stroke({ + color:16777215,width:2,alpha:.35} + ),h.init.text=s.npc[0],h.init.position.set(40-h.init.width/2,38-h.init.height/2); + const l=nAi.gear().guestHeads,u=["m","b","e"].indexOf(s.key.slice(-1)); + u>=0&&l[u]?(h.face.texture=l[u],h.face.width=h.face.height=56,h.face.visible=!0,h.av.clear(),h.init.visible=!1):(h.face.visible=!1,h.init.visible=!0),h.npc.text=`${ + s.npc} + · ${ + s.role} + `,h.line.text=s.line; + const d=!!t.state.dex[r.id]; + h.fish.set(r.id,r.star,s.minGrade,!d); + const f=d||s.line.includes(r.name); + if(h.ask.text=`${ + f?r.name:"???"} + ${ + s.minGrade?` (${ + dTi(s.minGrade)} + 이상)`:""} + ×${ + s.count} + ${ + Math.min(a,s.count)} + /${ + s.count} + `,h.ask.textColor=c?qIi:KIi,oki(h.ask,yUi-88-20),h.where.text=d?HSi(r):`${ + vSi[`${ + r.race} + |${ + r.zone} + `]} + 어딘가 · ${ + "전체"===r.tide?"모든 물때":`${ + r.tide} + 물때`} + `,oki(h.where,yUi-88-20),h.bar.clear(),vki(h.bar,88,132,yUi-88-232,6,a/s.count,c||o?qIi:VIi),h.reward.label!==s.key){ + h.reward.label=s.key,h.reward.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const t=_ki("gold",16),i=rki(s.gold.toLocaleString(),VIi,13); + if(i.position.set(20,-1),h.reward.addChild(t,i),s.pearl){ + const t=_ki("pearl",16),e=rki(`${ + s.pearl} + `,JIi,13); + t.x=i.x+i.width+12,e.position.set(t.x+20,-1),h.reward.addChild(t,e)} + } + if(h.btn.enabled=c,h.btn.setText(o?"완료":"납품"),h.go.visible=!o&&!c,h.go.onTap=async()=>{ + const i=USi(r); + !d&&r.star>=3&&(i.point=0); + const s=await t.goTo(i); + s?vH.getInstance().showMessage(s):(vH.getInstance().showMessage(`${ + vSi[`${ + r.race} + |${ + r.zone} + `]} + (으)로 옮겼어요`),CRi.getInstance().selectTab("fish"))} + ,h.btn.onTap=async()=>{ + const i=await t.deliver(s); + if(i)return void vH.getInstance().showMessage(i); + vH.getInstance().showMessage(`${ + s.npc} + : "고마워요!"`),jG("success"); + const e=CRi.getInstance(); + e.flyCurrency("gold",h.btn.toGlobal({ + x:52,y:22} + ),7),s.pearl&&e.flyCurrency("pearl",h.btn.toGlobal({ + x:52,y:22} + ),4),this.render(),MR.fromTo(h.stamp.scale,{ + x:1.8,y:1.8} + ,{ + x:1,y:1,duration:.35,ease:"back.out(2)"} + )} + ,h.root.alpha=o?.72:1,h.stamp.label!==String(o)&&(h.stamp.label=String(o),h.stamp.removeChildren().forEach(t=>t.destroy({ + children:!0} + ))),o&&!h.stamp.children.length){ + const t=(new ip).roundRect(-58,-20,116,40,8).stroke({ + color:qIi,width:3} + ),i=rki("납품 완료",qIi,18); + i.pivot.set(i.width/2,i.height/2),h.stamp.addChild(t,i),h.stamp.position.set(yUi-90,58),h.stamp.rotation=-.18} + } + )} + renderRecords(){ + var t,i; + const s=RIi.getInstance(),e=s.records(),n=this.records; + n.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),n.addChild(aki(yUi,128,BIi,null,12)); + const h=e.heaviest?`${ + kSi(e.heaviest.id).name} + ${ + _Ti(e.heaviest.kg)} + `:"-",r=[...(null==(t=s.life)?void 0:t.cups)??[],...s.state.cups],o=[1,2,3].map(t=>r.filter(i=>i.rank===t).length),a=r.length?`금 ${ + o[0]} + · 은 ${ + o[1]} + · 동 ${ + o[2]} + `:"-",c=new Set([...Object.keys((null==(i=s.life)?void 0:i.dex)??{ + } + ),...Object.keys(s.state.dex)]).size,l=[["총 포획",`${ + e.total.toLocaleString()} + 마리`],["도감",`${ + e.kinds} + /192종`],["최고 별",e.topStar?`★${ + e.topStar} + `:"-"],["왕 크기",`${ + e.sCount} + 종`],["누적 판매",`${ + s.state.sales.toLocaleString()} + G`],["가장 무거운 한 마리",h],["대회 컵 (전체)",a],["평생 도감",`${ + c} + /192종`]],u=(yUi-28)/4; + l.forEach(([t,i],s)=>{ + const e=rki(t,zIi,11,!1),h=rki(i,5===s?VIi:KIi,15),r=14+s%4*u,o=12+58*Math.floor(s/4); + e.position.set(r,o),h.position.set(r,o+17),oki(h,u-8),n.addChild(e,h)} + )} + renderGoals(){ + const i=RIi.getInstance(); + this.renderRecords(),this.goalList.setListHeight(CRi.contentHeight-56-128-10+t.LIFT,!1); + const s=i.milestoneRows(),e=Qt(t=>t.claimed?2:t.progress>=t.need?0:1,"order"); + s.sort((t,i)=>e(t)-e(i)||i.progress/i.need-t.progress/t.need),this.goalList.dataProvider=s.map(t=>({ + ...t,onClaim:Qt(async s=>{ + const e=await i.claimMilestone(t.kind,t.idx); + e?vH.getInstance().showMessage(e):(vH.getInstance().showMessage(`진주 ${ + t.pearl} + 개를 받았어요`),CRi.getInstance().flyCurrency("pearl",s.toGlobal({ + x:55,y:20} + ),6),this.render())} + ,"onClaim")} + ))} + } + ; + Qt(kUi,"FishingQuestPage"),Zt(kUi,"instance"),Zt(kUi,"LIFT",48),Zt(kUi,"stampSpeed",1); + let RUi=kUi; + const xUi=Object.freeze(Object.defineProperty({ + __proto__:null,FishingQuestPage:RUi} + ,Symbol.toStringTag,{ + value:"Module"} + )),PUi=CRi.CONTENT_W,NUi={ + bait_fish:"shrimp",bait_shell:"shell",bait_aqua:"lure",bait_big:"bigbait"} + ,LUi=class t extends Ve{ + constructor(t){ + super(),Zt(this,"tabId","shop"),Zt(this,"view","items"),Zt(this,"banner",new Ve),Zt(this,"bannerBg",new ip),Zt(this,"bannerIcon",new Ve),Zt(this,"bannerTitle",rki("",KIi,14)),Zt(this,"bannerSub",rki("",zIi,12,!1)),Zt(this,"bannerBar",new ip),Zt(this,"rows",[]),Zt(this,"rewardIcons",Array.from({ + length:4} + ,()=>new p4)),Zt(this,"qty",new Map),Zt(this,"locked",!1),Zt(this,"itemIcons",new Map),Zt(this,"bannerKey",""),Zt(this,"busy",!1),this.only=t,this.view=t,this.banner.y=0,this.bannerIcon.position.set(12,12),this.bannerTitle.position.set(66,12),this.bannerSub.position.set(66,36),this.bannerBar.eventMode="none",this.bannerSub.setWrapWidth(PUi-80),this.banner.addChild(this.bannerBg,this.bannerIcon,this.bannerTitle,this.bannerSub,this.bannerBar),this.banner.eventMode="none",this.addChild(this.banner); + for(let i=0; + i<Math.max(BTi.length,4); + i++){ + const t=new Ve; + t.y=78+88*i; + const s=aki(PUi,80,GIi,null),e=(new ip).roundRect(12,12,56,56,12).fill(BIi); + e.eventMode="none"; + const n=new Ve; + n.position.set(40,40); + const h=rki("",KIi,16),r=rki("",zIi,13,!1),o=new pki("",150,46,15),a=new Ve; + h.position.set(84,16),r.position.set(84,46),o.position.set(PUi-164,17),a.eventMode="none"; + const c=[0,1,2].map(t=>{ + const i=new dki("",64,30,13); + return i.position.set(84+70*t,42),i.visible=!1,i} + ); + t.addChild(s,e,n,h,r,o,a,...c),this.addChild(t),this.rows.push({ + root:t,tile:e,icon:n,name:h,desc:r,btn:o,cost:a,qtyChips:c} + )} + this.rewardIcons.forEach(t=>{ + t.eventMode="none"} + )} + static getInstance(){ + return this.instance??(this.instance=new t("exchange"))} + async guarded(t){ + if(!this.busy){ + this.busy=!0; + try{ + return await t()} + finally{ + this.busy=!1} + } + } + onShow(){ + this.render()} + forceExchange(t){ + this.locked=t,RIi.getInstance().ready&&this.render()} + onHide(){ + } + update(){ + this.renderBanner()} + focusItem(t){ + var i; + this.render(); + const s=BTi.findIndex(i=>i.id===t); + return s<0?null:(null==(i=this.rows[s])?void 0:i.btn)??null} + render(){ + const t=RIi.getInstance(),i=t.state; + this.view=this.only,this.renderBanner(),"items"===this.view?this.rows.forEach((s,e)=>{ + const n=BTi[e]; + if(s.root.visible=!!n,s.qtyChips.forEach(t=>{ + t.visible=!1} + ),s.desc.visible=!0,!n)return; + let h=this.itemIcons.get(n.id); + h||(h=yki(NUi[n.id]??"shrimp",40,KIi),h.pivot.set(20,20),this.itemIcons.set(n.id,h)),this.setIcon(s,h),s.name.text=n.name,s.desc.text=n.desc,oki(s.desc,PUi-260); + const r=n.pearl?i.pearl>=n.pearl:i.gold>=(n.gold??0); + this.setCost(s,n.pearl?"pearl":"gold",n.pearl??n.gold??0,r),s.btn.enabled=r,s.btn.onTap=async()=>{ + const i=await this.guarded(()=>t.buy(n)); + void 0!==i&&(i?vH.getInstance().showMessage(i):(vH.getInstance().showMessage(n.bait?`${ + n.name} + 사용 · 30분 동안 효과`:`${ + n.name} + 을(를) 샀어요`),jG("light"),MR.fromTo(s.icon.scale,{ + x:1.35,y:1.35} + ,{ + x:1,y:1,duration:.4,ease:"back.out(3)"} + ),this.render()))} + } + ):this.rows.forEach((i,s)=>{ + const e=t.shop[s]; + if(i.root.visible=!!e,i.qtyChips.forEach(t=>{ + t.visible=!!e} + ),!e)return; + i.desc.visible=!1; + const n=t.exchangeMax(e),h=Math.max(1,Math.min(this.qty.get(e.kindNum)??1,Math.max(1,n))),r=this.rewardIcons[s]; + r.setData(e.reward.type,e.reward.amount,-1,-1,e.reward.subType??""),r.hideAmount(),r.scale.set(52/64),r.pivot.set(32,32),this.setIcon(i,r),i.name.text=h>1?`${ + e.name} + × ${ + h.toLocaleString()} + `:e.name,oki(i.name,PUi-260),this.setCost(i,"pearl",e.pearl*h,n>=h),i.btn.enabled=n>=h,i.btn.onTap=async()=>{ + const s=await this.guarded(()=>t.exchange(e,h)); + void 0!==s&&(s?vH.getInstance().showMessage(s):(vH.getInstance().showMessage(`${ + e.name} + ${ + h>1?` × ${ + h.toLocaleString()} + `:""} + , 메인 게임 우편함으로 보냈어요`),jG("success"),MR.fromTo(i.icon.scale,{ + x:1.3,y:1.3} + ,{ + x:1,y:1,duration:.4,ease:"back.out(3)"} + ),this.render()))} + ; + const o=[1,10,Math.max(1,n)]; + i.qtyChips.forEach((t,i)=>{ + t.setText(2===i?"최대":String(o[i])),t.selected=h===o[i]&&(2!==i||n>10),t.enabled=0===i||n>=o[i],t.draw(),t.onTap=()=>{ + this.qty.set(e.kindNum,o[i]),this.render()} + } + )} + )} + renderBanner(){ + var t; + const i=RIi.getInstance(),s=i.state,e=i.baitLeftMs(),n="items"===this.view&&e>0&&!!s.bait; + this.bannerBar.clear(); + const h=n?BTi.find(t=>t.bait===s.bait.kind):null,r="items"===this.view?(null==h?void 0:h.id)??"none":"pearl"; + if(r!==this.bannerKey&&(this.bannerKey=r,this.bannerIcon.removeChildren().forEach(t=>t.destroy({ + children:!0} + )),this.bannerIcon.addChild("pearl"===r?_ki("pearl",40):yki(h?NUi[h.id]:"hook",40,zIi))),"items"===this.view)this.bannerTitle.text=n?`사용 중 · ${ + (null==h?void 0:h.name)??s.bait.kind} + · ${ + Mki(e)} + 남음`:"미끼 없음",this.bannerTitle.textColor=n?VIi:KIi,this.bannerSub.text=n?"미끼는 한 번에 하나만 효과가 있어요. 새로 사면 바뀌어요.":"미끼는 30분 동안 효과가 있어요",n&&vki(this.bannerBar,66,60,PUi-80,5,e/18e5,VIi); + else{ + this.bannerTitle.text=`진주 ${ + s.pearl.toLocaleString()} + 개`,this.bannerTitle.textColor=JIi; + const e=null==(t=i.season)?void 0:t.shopEndAt; + this.bannerSub.text="exchangeOnly"===i.phase()&&e?`회차가 끝났어요 · ${ + bki(e)} + 까지 바꿀 수 있어요. 그 뒤 남은 진주는 사라져요.`:`대회·손님·업적으로 모아 메인 게임 재화로 바꿔요. ${ + e?`${ + bki(e)} + 까지`:"회차가 끝나고 며칠 안에"} + 바꾸지 않은 진주는 사라져요.`} + oki(this.bannerSub,PUi-80),this.bannerBg.clear().roundRect(0,0,PUi,66,12).fill(n?2763288:BIi)} + setIcon(t,i){ + t.icon.children[0]!==i&&(t.icon.removeChildren(),t.icon.addChild(i))} + setCost(t,i,s,e){ + t.btn.setText(""),t.cost.removeChildren().forEach(t=>t.destroy({ + children:!0} + )); + const n=_ki(i,20),h=rki(s.toLocaleString(),e?jIi:iki,16); + h.position.set(26,-1),n.alpha=e?1:.6,t.cost.addChild(n,h),t.cost.position.set(t.btn.x+(150-t.cost.width)/2,t.btn.y+13)} + } + ; + Qt(LUi,"FishingShopPage"),Zt(LUi,"instance"); + let DUi=LUi; + const GUi=Object.freeze(Object.defineProperty({ + __proto__:null,FishingShopPage:DUi} + ,Symbol.toStringTag,{ + value:"Module"} + )),BUi=class t extends Ve{ + constructor(){ + super(),Zt(this,"dim",new ip),Zt(this,"card",new ip),Zt(this,"title",rki("",VIi,24)),Zt(this,"lines",rki("",KIi,15,!1)),Zt(this,"note",rki("내 모습과 도감 기록·대회 컵은 그대로 남아요.\n골드·배·도구는 새로 시작해요.",zIi,13,!1)),Zt(this,"ok",new pki("출발!",220,50,17)),Zt(this,"view",null),this.dim.eventMode="static",this.card.eventMode="none",this.ok.onTap=()=>{ + var t; + null==(t=this.parent)||t.removeChild(this)} + ,this.addChild(this.dim,this.card,this.title,this.lines,this.note,this.ok)} + static getInstance(){ + return this.instance??(this.instance=new t)} + closeOne(){ + var t,i; + return null==(i=(t=this.ok).onTap)||i.call(t),!0} + show(t){ + this.view=t,this.parent||CRi.getInstance().overlay.addChild(this),this.layout(),MR.fromTo(this,{ + alpha:0} + ,{ + alpha:1,duration:.25} + )} + layout(){ + var t; + const i=this.view; + if(!i)return; + const s=CRi.CONTENT_W,e=CRi.contentHeight,n=CRi.OVERLAY_PAD; + this.dim.clear().rect(-n,0,s+2*n,e).fill({ + color:0,alpha:.72} + ),this.dim.hitArea=new Ui(-n,0,s+2*n,e); + const h=Math.min(s-32,460),r=(s-h)/2,o=(e-280)/2; + this.card.clear().roundRect(r,o,h,280,18).fill(FIi); + const a=(null==(t=RIi.getInstance().season)?void 0:t.id)??i.prevId+1; + this.title.text=`${ + a} + 회차 시작!`,this.lines.text=`지난 회차에 ${ + i.prevDex} + 종을 잡았어요${ + i.prevCups?` · 대회 컵 ${ + i.prevCups} + 개`:""} + `,oki(this.lines,h-48),this.title.position.set(r+24,o+26),this.lines.position.set(r+24,o+76),this.note.position.set(r+24,o+118),this.ok.position.set(r+(h-220)/2,o+280-74)} + } + ; + Qt(BUi,"FishingSeasonCard"),Zt(BUi,"instance"); + let UUi=BUi; + const FUi=class{ + static async enter(){ + var t; + await nAi.ensure(),await hRi(); + const i=RIi.getInstance(),s=await i.load(),e=i.season; + if("closed"===(null==e?void 0:e.phase))throw new Error(e.nextStartAt?`다음 회차는 ${ + bki(e.nextStartAt+1)} + 에 열려요`:"다음 회차를 준비하고 있어요"); + if(!i.ready)throw new Error("exchangeOnly"===(null==e?void 0:e.phase)?"이번 회차는 끝났어요. 다음 회차를 기다려 주세요":s??"낚시왕 정보를 받지 못했어요"); + i.loadLife(); + const n=CRi.getInstance(); + n.onNavigate=t=>this.openTab(t); + const h=qGi.getInstance(),r=hBi.getInstance(); + if(h.onOpenMap=()=>n.present(r),r.onBack=()=>n.present(h),null==(t=this.unwatch)||t.call(this),this.unwatch=i.onSeasonChange(t=>this.onSeasonChange(t)),"exchangeOnly"===i.phase())return n.setExchangeOnly(!0),await this.openTab("shop"),void vH.getInstance().showMessage(`회차가 끝났어요 · ${ + bki(e.shopEndAt)} + 까지 진주를 바꿀 수 있어요`); + n.setExchangeOnly(!1),await this.openTab("fish"),i.newSeason&&(UUi.getInstance().show(i.newSeason),i.newSeason=null),i.isLastDay()&&(null==e?void 0:e.shopEndAt)&&vH.getInstance().showMessage(`오늘 회차가 끝나요 · 진주는 ${ + bki(e.shopEndAt)} + 까지 교환소에서 바꿀 수 있어요`)} + static onSeasonChange(t){ + const i=CRi.getInstance(); + i.parent&&("exchangeOnly"===t.phase?(i.setExchangeOnly(!0),this.openTab("shop"),t.shopEndAt&&vH.getInstance().showMessage(`회차가 끝났어요 · ${ + bki(t.shopEndAt)} + 까지 진주를 바꿀 수 있어요`)):"closed"===t.phase?(i.closeForSeason(),vH.getInstance().showMessage("이번 회차의 교환소가 닫혔어요")):i.setExchangeOnly(!1))} + static async openTab(t){ + const i=CRi.getInstance(); + switch(t){ + case"fish":i.present(qGi.getInstance()); + break; + case"gear":i.present(cUi.getInstance()); + break; + case"tank":i.present(fxi.getInstance()); + break; + case"quest":i.present(RUi.getInstance()); + break; + case"shop":i.present(DUi.getInstance())} + } + } + ; + Qt(FUi,"FishingFlow"),Zt(FUi,"unwatch",null); + let $Ui=FUi; + const HUi=Object.freeze(Object.defineProperty({ + __proto__:null,FishingFlow:$Ui} + ,Symbol.toStringTag,{ + value:"Module"}
EventHubPopup 2 hunks, 481 statements
+ super(),Zt(this,"btnMine",new iB(RB.getText("GAME_1203","화석 발굴"))),Zt(this,"btnAscent",new iB(RB.getText("GAME_1716","군단 도전"))),Zt(this,"btnFishing",new iB("낚시왕 (프로토타입)")),Zt(this,"opening",!1),this.width=t.POPUP_WIDTH; + for(const i of[this.btnMine,this.btnAscent,this.btnFishing])i.width=this.width-2*t.SIDE_PADDING,i.height=t.BUTTON_HEIGHT,i.color=iB.BROWN,this.contentContainer.addChild(i); + this.btnMine.onClick=()=>{ + this.openMine()} + ,this.btnAscent.onClick=()=>{ + this.openAscent()} + ,this.btnFishing.onClick=()=>{ + this.openFishing()} + ,this.on("added",this.onAdded,this),this.on("removed",this.onRemoved,this)} + static getInstance(){ + return this._instance||(this._instance=new t),this._instance} + onAdded(){ + MXt.getInstance().registerHubMineButtonGetter(t=>"btnMine"===t&&this.btnMine.visible?{ + parent:this.contentContainer,btn:{ + x:this.btnMine.x,y:this.btnMine.y,width:this.btnMine.width,height:this.btnMine.height} + } + :null)} + onRemoved(){ + const t=qqt.getInstance(); + t.mineStep=2!=t.mineStep?0:t.mineStep,MXt.getInstance().unregisterHubMineButtonGetter()} + static isMineOpen(){ + return EG.maxWave>=200&&GB.isValidEvent(BB.MINE_EVENT)} + static isAscentOpen(){ + return GB.isValidEvent(BB.MINI_ASCENT_EVENT)} + static isAscentShopOpen(){ + return!t.isAscentOpen()&&GB.isAscentShopOpen()} + show(){ + this.title=RB.getText("GAME_1844","ko"===RB.language?"이벤트":"Event"),this.btnMine.text=RB.getText("GAME_1203","화석 발굴"),this.btnAscent.text=RB.getText("GAME_1716","군단 도전"),this.btnMine.activated=t.isMineOpen(),this.btnAscent.activated=(t.isAscentOpen()||t.isAscentShopOpen())&&!this.opening,this.btnFishing.visible=t.isFishingOpen(); + const i=[this.btnMine,this.btnAscent,this.btnFishing].filter(t=>t.visible); + this.height=t.HEADER_HEIGHT+2*t.BODY_PADDING+t.BUTTON_HEIGHT*i.length+t.BUTTON_GAP*(i.length-1); + for(const[e,n]of i.entries())n.position.set(.5*(this.width-n.width),t.HEADER_HEIGHT+t.BODY_PADDING+e*(t.BUTTON_HEIGHT+t.BUTTON_GAP)),n.lbl.scale.set(1),n.lbl.scale.set(Math.min(1,(n.width-40)/Math.max(1,n.lbl.width))),n.lbl.position.set(.5*-n.lbl.width,.5*-n.lbl.height); + const s=qqt.getInstance(); + s.mineStep=2!=s.mineStep?1:s.mineStep,this.outSideClickHide=!0,super.show()} + static isFishingOpen(){ + return OG.getInstance().development} + async openFishing(){ + if(!this.opening&&t.isFishingOpen()){ + this.opening=!0; + try{ + const{ + FishingFlow:t} + =await ei(async()=>{ + const{ + FishingFlow:t} + =await Promise.resolve().then(()=>HUi); + return{ + FishingFlow:t} + } + ,void 0); + this.hide(),await t.enter()} + catch(ort){ + vH.getInstance().showMessage(ort.message)} + finally{ + this.opening=!1} + } + } + async openMine(){ + if(!t.isMineOpen())return; + this.hide(); + const{ + MinePopup:i} + =await ei(async()=>{ + const{ + MinePopup:t} + =await Promise.resolve().then(()=>v8t); + return{ + MinePopup:t} + } + ,void 0); + await i.getInstance().show()} + async openAscent(){ + const i=t.isAscentShopOpen(); + if(!this.opening&&(t.isAscentOpen()||i)){ + this.opening=!0,this.btnAscent.activated=!1; + try{ + const{ + MiniAscentAssets:t} + =await ei(async()=>{ + const{ + MiniAscentAssets:t} + =await Promise.resolve().then(()=>abi); + return{ + MiniAscentAssets:t} + } + ,void 0); + await t.ensure(); + const{ + MiniAscentFlow:s} + =await ei(async()=>{ + const{ + MiniAscentFlow:t} + =await Promise.resolve().then(()=>ryi); + return{ + MiniAscentFlow:t} + } + ,void 0); + this.hide(),await(i?s.enterShop():s.enter())} + catch{ + const{ + pveText:t} + =await ei(async()=>{ + const{ + pveText:t} + =await Promise.resolve().then(()=>bbi); + return{ + pveText:t} + } + ,void 0); + vH.getInstance().showMessage(t("ASSET_ERROR"))} + finally{ + this.opening=!1,this.btnAscent.activated=t.isAscentOpen()||t.isAscentShopOpen()} + } + } + async execOpenAscent(){ + this.openAscent()} + } + ; + Qt(T_i,"EventHubPopup"),Zt(T_i,"_instance"),Zt(T_i,"POPUP_WIDTH",406),Zt(T_i,"HEADER_HEIGHT",53),Zt(T_i,"SIDE_PADDING",32),Zt(T_i,"BODY_PADDING",24),Zt(T_i,"BUTTON_HEIGHT",60),Zt(T_i,"BUTTON_GAP",14); + let C_i=T_i; + const O_i=Object.freeze(Object.defineProperty({ + __proto__:null,EventHubPopup:C_i} + ,Symbol.toStringTag,{ + value:"Module"} + )),I_i=class extends iB{ + constructor(){ + super(""),Zt(this,"icon"),Zt(this,"iconCompleted"),Zt(this,"index",-1),Zt(this,"_completed",!1),this.color=iB.LIGHT_GREEN,this.lbl.removeFromParent(),this.icon=new Ye(kS.getTexture("UI_Ekkorr","Icon_Receive")),this.icon.scale=.7,this.icon.x=.5*-this.icon.width,this.icon.y=.5*-this.icon.height,this.container.addChild(this.icon),this.iconCompleted=new Ye(kS.getTexture("UI_Ekkorr","Icon_Check")),this.iconCompleted.visible=!1,this.iconCompleted.alpha=.8,this.iconCompleted.scale=.8,this.iconCompleted.x=.5*-this.iconCompleted.width,this.iconCompleted.y=.5*-this.iconCompleted.height,this.container.addChild(this.iconCompleted),this.width=65,this.height=40} + get width(){ + return this.bg.width} + set width(t){ + super.width=t,this.icon&&(this.icon.x=.5*-this.icon.width)} + get height(){ + return this.bg.height} + set height(t){ + super.height=t,this.icon&&(this.icon.y=.5*-this.icon.height)} + get activated(){ + return this._activated} + set activated(t){ + super.activated=t,this.icon.alpha=t?1:.8} + onTap(t){ + 0!=this._activated&&(qG.getInstance().playSFX(qG.SFX_NORMAL_CLICK),jG(),null!=this.onClick&&this.onClick(this.index))} + get completed(){ + return this._completed} + set completed(t){ + t!==this._completed&&(this._completed=t,this._completed?(this.icon.visible=!1,this.iconCompleted.visible=!0):(this.icon.visible=!0,this.iconCompleted.visible=!1))} + } + ; + Qt(I_i,"AttendEventRewardButton"); + let k_i=I_i; + const R_i=class extends OR{ + constructor(){ + super(),Zt(this,"bg"),Zt(this,"items"),Zt(this,"lbl"),Zt(this,"btn"),this.bg=new eE({ + texture:kS.getTexture("UI_Ekkorr","Popup_Bg_03"),leftWidth:30,topHeight:30,rightWidth:30,bottomHeight:30} + ),this.bg.alpha=.7,this.bg.width=395,this.bg.height=75,this.addChild(this.bg),this.items=[]; + let t,i=13; + for(let e=0; + e<5; + ++e)t=new p4,t.x=i,t.y=11,t.scale=.8,this.addChild(t),this.items.push(t),i+=.8*t.width+9; + const s=sD.DEFAULT_FONT_OPTION_15; + s.fill=9666663,this.lbl=new QD("Day 1",s.fill,s),this.addChild(this.lbl),this.btn=new k_i,this.btn.x=i+5,this.btn.y=this.lbl.y+this.lbl.height,this.addChild(this.btn),this.btn.onClick=this.onBtnClick.bind(this),this.lbl.x=this.btn.x+.5*(this.btn.width-this.lbl.width)} + get width(){ + return this.bg.width} + get height(){ + return this.bg.height} + setData(t){ + const i=t.index,s=t.attendCount,e=t.attendedToday; + t.completed,this.lbl.text=`Day ${ + i+1} + `; + const n=t.reward.length; + let h,r; + const o=this.items.length; + for(let c=0; + c<o; + ++c)h=t.reward[c],r=this.items[c],c<n?(r.visible=!0,r.setDataFrom(h),this.setItemEvent(r,!0)):(r.visible=!1,this.setItemEvent(r,!1)); + const a=e?s-1:s; + i>a?(this.btn.activated=!1,this.btn.completed=!1):i<a||e?(this.btn.activated=!1,this.btn.completed=!0):(this.btn.activated=!0,this.btn.completed=!1)} + async onBtnClick(){ + try{ + const{ + AttendEventPopup:t} + =await ei(async()=>{ + const{ + AttendEventPopup:t} + =await Promise.resolve().then(()=>U_i); + return{ + AttendEventPopup:t} + } + ,void 0); + t.getInstance().attendEvent()} + catch(t){ + } + } + setItemEvent(t,i){ + t.eventMode="none",t.off("pointertap",this.onItemTap,this),i&&(t.eventMode="dynamic",t.on("pointertap",this.onItemTap,this))} + async onItemTap(t){ + const i=t.target; + if(!i)return; + let s=""; + if(i.type==d4.ticket&&i.subType==d4.heroGacha?s=RB.getText("GAME_765","5성 영웅을 랜덤하게 획득할 수 있습니다."):i.type==d4.ticket&&i.subType==d4.heroSelect?s=RB.getText("GAME_943","제공되는 목록에서 원하는 5성 영웅을 선택할 수 있습니다."):i.type==d4.ticket&&i.subType==d4.treasureGacha?s=RB.getValueReplace("GAME_776","##",6,"6등급 유물을 랜덤하게 획득할 수 있습니다."):i.type==d4.ticket&&i.subType==d4.petSelect?s=RB.getText("GAME_944","제공되는 목록에서 원하는 펫 조각을 선택할 수 있습니다."):i.type!=d4.trans||i.subType!=d4.hero&&i.subType!=d4.treasure?i.type==d4.runeTicket&&(s=RB.getText("GAME_1502","레이드 상점에서 크리스탈을 랜덤하게 획득할 수 있습니다.")):s=RB.getText("GAME_1225","초월권을 사용하여 초월재료와 비용없이 초월시킬 수 있습니다."),s){ + const{ + ToolTip:t} + =await ei(async()=>{ + const{ + ToolTip:t} + =await Promise.resolve().then(()=>_4); + return{ + ToolTip:t} + } + ,void 0); + t.getInstance().widthMax=390,t.getInstance().text=s; + let e=this.x+i.x-20; + e+t.getInstance().width+7>this.bg.x+this.bg.width&&(e=this.bg.x+this.bg.width-t.getInstance().width-7); + let n=i.y-i.height; + n<7&&(n=7),t.getInstance().show(this,e,n)} + } + } + ; + Qt(R_i,"AttendEventRewardMultiItemRenderer"); + let x_i=R_i; + const P_i=class extends Ve{ + constructor(){ + super(),Zt(this,"list"); + const t=this.width,i=this.height; + this.list=new b4(x_i,t,i,4),this.addChild(this.list)} + get width(){ + return 395} + get height(){ + return 180} + setData(t){ + const i=t.attendCount,s=t.attendedToday,e=t.completed,n=t.rewards.map((t,n)=>({ + index:n,reward:t,attendCount:i,attendedToday:s,completed:e} + )); + this.list.dataProvider=n,t.attendedToday||this.list.scrollTo(t.attendCount)} + } + ; + Qt(P_i,"AttendEventRewardMulti"); + let N_i=P_i; + const L_i=class extends Ve{ + constructor(){ + super(),Zt(this,"bg"),Zt(this,"container"),Zt(this,"lbls"),Zt(this,"items"),Zt(this,"btns"),this.bg=new eE({ + texture:kS.getTexture("UI_Ekkorr","Popup_Bg_03"),leftWidth:30,topHeight:30,rightWidth:30,bottomHeight:30} + ),this.bg.alpha=.7,this.bg.width=395,this.bg.height=180,this.addChild(this.bg),this.container=new Ve,this.addChild(this.container),this.lbls=[],this.items=[],this.btns=[]; + const t=sD.DEFAULT_FONT_OPTION_15; + t.fill=9666663; + let i,s,e,n=0; + for(let h=0; + h<5; + ++h)i=new QD(`Day ${ + h+1} + `,t.fill,t),this.container.addChild(i),this.lbls.push(i),s=new p4,this.container.addChild(s),this.items.push(s),e=new k_i,e.index=h,e.onClick=this.onBtnClick.bind(this),this.container.addChild(e),this.btns.push(e),s.x=n,i.x=s.x+.5*(s.width-i.width),e.x=s.x+.5*(s.width-e.width),s.y=i.y+i.height+3,e.y=s.y+s.height+8,n+=s.width+11} + get width(){ + return this.bg.width} + get height(){ + return this.bg.height} + setData(t){ + const i=t.attendCount,s=t.attendedToday; + t.completed; + const e=t.rewards.length; + let n,h,r; + for(let o=0; + o<5; + ++o)if(n=this.lbls[o],h=this.items[o],r=this.btns[o],o<e){ + h.setDataFrom(t.rewards[o][0]),h.visible=!0,this.setItemEvent(h,!0),n.visible=!0,r.visible=!0; + const e=s?i-1:i; + o>e?(r.activated=!1,r.completed=!1):o<e||s?(r.activated=!1,r.completed=!0):(r.activated=!0,r.completed=!1)} + else h.visible=!1,this.setItemEvent(h,!1),n.visible=!1,r.visible=!1; + this.container.x=.5*(this.bg.width-this.container.width)+3,this.container.y=.5*(this.bg.height-this.container.height)-2} + async onBtnClick(t){ + try{ + const{ + AttendEventPopup:t} + =await ei(async()=>{ + const{ + AttendEventPopup:t} + =await Promise.resolve().then(()=>U_i); + return{ + AttendEventPopup:t} + } + ,void 0); + t.getInstance().attendEvent()} + catch(i){ + } + } + setItemEvent(t,i){ + t.eventMode="none",t.off("pointertap",this.onItemTap,this),i&&(t.eventMode="dynamic",t.on("pointertap",this.onItemTap,this))} + async onItemTap(t){ + const i=t.target; + if(!i)return; + let s=""; + if(i.type==d4.ticket&&i.subType==d4.heroGacha?s=RB.getText("GAME_765","5성 영웅을 랜덤하게 획득할 수 있습니다."):i.type==d4.ticket&&i.subType==d4.heroSelect?s=RB.getText("GAME_943","제공되는 목록에서 원하는 5성 영웅을 선택할 수 있습니다."):i.type==d4.ticket&&i.subType==d4.treasureGacha?s=RB.getValueReplace("GAME_776","##",6,"6등급 유물을 랜덤하게 획득할 수 있습니다."):i.type==d4.ticket&&i.subType==d4.petSelect?s=RB.getText("GAME_944","제공되는 목록에서 원하는 펫 조각을 선택할 수 있습니다."):i.type!=d4.trans||i.subType!=d4.hero&&i.subType!=d4.treasure?i.type==d4.runeTicket&&(s=RB.getText("GAME_1502","레이드 상점에서 크리스탈을 랜덤하게 획득할 수 있습니다.")):s=RB.getText("GAME_1225","초월권을 사용하여 초월재료와 비용없이 초월시킬 수 있습니다."),s){ + const{ + ToolTip:t} + =await ei(async()=>{ + const{ + ToolTip:t} + =await Promise.resolve().then(()=>_4); + return{ + ToolTip:t} + } + ,void 0); + t.getInstance().widthMax=390,t.getInstance().text=s; + let e=this.x+i.x-20; + e+t.getInstance().width+7>this.bg.x+this.bg.width&&(e=this.bg.x+this.bg.width-t.getInstance().width-7); + let n=i.y-i.height; + n<7&&(n=7),t.getInstance().show(this,e,n)} + } + } + ; + Qt(L_i,"AttendEventRewardSingle"); + let D_i=L_i; + const G_i=class t extends uB{ + constructor(){ + super(),Zt(this,"bgImage"),Zt(this,"lblMessage"),Zt(this,"lblNote"),Zt(this,"lblDuration"),Zt(this,"rewardSingle"),Zt(this,"rewardMulti"),Zt(this,"_width",-1),Zt(this,"_height",-1),Zt(this,"requestPending",!1),this.bg.removeFromParent(),this.contentContainer.removeFromParent(),this.txtTitle.removeFromParent(),this.btnClose.removeFromParent(),this.outSideClickHide=!0; + const t=sD.DEFAULT_FONT_OPTION_17; + t.fill=13878933,this.lblMessage=new QD("매일 출석하고, 선물 받아가세요!",t.fill,t),this.addChild(this.lblMessage),sD.setLabelWrapWidth(this.lblMessage,420),this.lblDuration=new SF("Icon_Time02","",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_17),this.addChild(this.lblDuration); + const i=sD.DEFAULT_FONT_OPTION_17; + i.fill=13421772,this.lblNote=new QD("빈 화면을 터치해 닫기",i.fill,i),this.addChild(this.lblNote),this.rewardSingle=new D_i,this.addChild(this.rewardSingle),this.rewardMulti=new N_i,this.addChild(this.rewardMulti)} + static getInstance(){ + return this._instance||(this._instance=new t),this._instance} + async setData(){ + const t=GB.getActiveAttendEvent(); + if(!t)return; + if(!this.bgImage){ + const{ + Assets:i} + =await ei(async()=>{ + const{ + Assets:t} + =await Promise.resolve().then(()=>oE); + return{ + Assets:t} + } + ,void 0); + let s="https://cdn.endlessfrontier.io/ef2/img/"; + const e=SG.getInstance().getClientData("EXTERNAL_IMAGE_PATH"); + e&&e.startsWith("http")&&(s=e); + const n=`${ + s} + ${ + t.image} + `,h=await i.load(n); + this.bgImage=new Ye,this.bgImage.texture=h,this.bgImage.y=-50,this.addChildAt(this.bgImage,0)} + -1!==this._width&&-1!==this._height||(this._width=this.bgImage.width,this._height=this.bgImage.height,this.pivot.set(this._width/2,this._height/2),this.position.set(320,this.getPositionY())); + const i=this.bgImage.y+435; + this.lblMessage.text=t.message?t.message:RB.getText("GAME_1662","매일 출석하고, 선물 받아가세요!"),this.lblMessage.x=.5*(this.width-this.lblMessage.width),this.lblMessage.y=i+.5*(70-this.lblMessage.height)+1,this.lblNote.text=RB.getText("COMMON_573","빈 화면을 터치해 닫기"),this.lblNote.eventMode="none",this.lblNote.x=.5*(this.width-this.lblNote.width),this.lblNote.y=this.bgImage.y+this.height+50,this.update(); + const s=this.rewardMulti.visible?this.rewardMulti.y+this.rewardMulti.height+15:this.rewardSingle.y+this.rewardSingle.height+15,e=new Date(t.startTime),n=new Date(t.endTime); + this.lblDuration.text=i$.displayDate2(e,!0,".")+" ~ "+i$.displayDate2(n,!0,"."),this.lblDuration.x=.5*(this.width-this.lblDuration.width),this.lblDuration.y=s} + update(){ + const t=GB.getActiveAttendEvent(); + if(!t)return; + const i=this.bgImage.y+435; + this.rewardMulti.visible=!1,this.rewardSingle.visible=!1,t.rewards.some(t=>t.length>1)?(this.rewardMulti.x=.5*(this.width-this.rewardMulti.width),this.rewardMulti.y=i+70,this.rewardMulti.setData(t),this.rewardMulti.visible=!0):(this.rewardSingle.x=.5*(this.width-this.rewardSingle.width),this.rewardSingle.y=i+70,this.rewardSingle.setData(t),this.rewardSingle.visible=!0)} + get width(){ + return this._width} + set width(t){ + } + get height(){ + return this._height} + set height(t){ + } + async attendEvent(){ + if(1==this.requestPending)return; + this.setRequestPending(!0); + const t=await ZL.getInstance().user.attendEvent(!0); + if(0==t.success){ + this.setRequestPending(!1); + let i=""; + return"ALREADY_ATTENDED"==t.error?i=RB.getText("COMMON_575","이미 오늘 보상을 받았습니다."):"EVENT_ATTEND_COMPLETED"==t.error&&(i=RB.getText("GAME_257","모든 보상을 수령했습니다.")),void(i?bB.getInstance().show(i):bB.getInstance().showError(t))} + GB.updateAttendEvent(t.body.attendEvent),this.update(),this.setRequestPending(!1),bB.getInstance().show(RB.getText("COMMON_120","메일함으로 발송되었습니다.")); + const{ + EventDispatcher:i} + =await ei(async()=>{ + const{ + EventDispatcher:t} + =await Promise.resolve().then(()=>RR); + return{ + EventDispatcher:t} + } + ,void 0); + i.getInstance().dispatchCustomEvent("MailUpdate",{ + forced:!0} + )} + setRequestPending(t){ + this.requestPending=t} + hideImmediately(){ + super.hideImmediately(),v4.getInstance().hide()} + onBackButton(){ + return this.hide(),!0} + } + ; + Qt(G_i,"AttendEventPopup"),Zt(G_i,"_instance"); + let B_i=G_i; + const U_i=Object.freeze(Object.defineProperty({ + __proto__:null,AttendEventPopup:B_i} + ,Symbol.toStringTag,{ + value:"Module"} + )),F_i=class t extends zU{ + constructor(){
- super(),Xt(this,"btnMine",new IG(nB.getText("GAME_1203","화석 발굴"))),Xt(this,"btnAscent",new IG(nB.getText("GAME_1716","군단 도전"))),Xt(this,"opening",!1),this.width=t.POPUP_WIDTH,this.height=t.HEADER_HEIGHT+2*t.BODY_PADDING+2*t.BUTTON_HEIGHT+t.BUTTON_GAP; - for(const i of[this.btnMine,this.btnAscent])i.width=this.width-2*t.SIDE_PADDING,i.height=t.BUTTON_HEIGHT,i.color=IG.BROWN,this.contentContainer.addChild(i); - this.btnMine.onClick=()=>{ - this.openMine()} - ,this.btnAscent.onClick=()=>{ - this.openAscent()} - } - static getInstance(){ - return this._instance||(this._instance=new t),this._instance} - static isMineOpen(){ - return XD.maxWave>=200&&lB.isValidEvent(uB.MINE_EVENT)} - static isAscentOpen(){ - return lB.isValidEvent(uB.MINI_ASCENT_EVENT)||iG.getInstance().development} - show(){ - this.title=nB.getText("GAME_1844","ko"===nB.language?"이벤트":"Event"),this.btnMine.text=nB.getText("GAME_1203","화석 발굴"),this.btnAscent.text=nB.getText("GAME_1716","군단 도전"),this.btnMine.activated=t.isMineOpen(),this.btnAscent.activated=t.isAscentOpen()&&!this.opening; - for(const[i,s]of[this.btnMine,this.btnAscent].entries())s.position.set(.5*(this.width-s.width),t.HEADER_HEIGHT+t.BODY_PADDING+i*(t.BUTTON_HEIGHT+t.BUTTON_GAP)),s.lbl.scale.set(1),s.lbl.scale.set(Math.min(1,(s.width-40)/Math.max(1,s.lbl.width))),s.lbl.position.set(.5*-s.lbl.width,.5*-s.lbl.height); - this.outSideClickHide=!0,super.show()} - async openMine(){ - if(!t.isMineOpen())return; - this.hide(); - const{ - MinePopup:i} - =await ti(async()=>{ - const{ - MinePopup:t} - =await Promise.resolve().then(()=>s4t); - return{ - MinePopup:t} - } - ,void 0); - await i.getInstance().show()} - async openAscent(){ - if(!this.opening&&t.isAscentOpen()){ - this.opening=!0,this.btnAscent.activated=!1; - try{ - const{ - MiniAscentAssets:t} - =await ti(async()=>{ - const{ - MiniAscentAssets:t} - =await Promise.resolve().then(()=>Jvi); - return{ - MiniAscentAssets:t} - } - ,void 0); - await t.ensure(); - const{ - MiniAscentFlow:i} - =await ti(async()=>{ - const{ - MiniAscentFlow:t} - =await Promise.resolve().then(()=>q_i); - return{ - MiniAscentFlow:t} - } - ,void 0); - this.hide(),await i.enter()} - catch{ - const{ - pveText:t} - =await ti(async()=>{ - const{ - pveText:t} - =await Promise.resolve().then(()=>l_i); - return{ - pveText:t} - } - ,void 0); - AH.getInstance().showMessage(t("ASSET_ERROR"))} - finally{ - this.opening=!1,this.btnAscent.activated=t.isAscentOpen()} - } - } - } - ; - qt(lEi,"EventHubPopup"),Xt(lEi,"_instance"),Xt(lEi,"POPUP_WIDTH",406),Xt(lEi,"HEADER_HEIGHT",53),Xt(lEi,"SIDE_PADDING",32),Xt(lEi,"BODY_PADDING",24),Xt(lEi,"BUTTON_HEIGHT",60),Xt(lEi,"BUTTON_GAP",14); - let uEi=lEi; - const dEi=Object.freeze(Object.defineProperty({ - __proto__:null,EventHubPopup:uEi} - ,Symbol.toStringTag,{ - value:"Module"} - )),fEi=class t extends BG{ - constructor(){
RankingDataManager 1 hunks, 451 statements
- )),nhi=class t extends EYt{ - constructor(){ - super(),Xt(this,"lblDesc"),Xt(this,"gemIcon"),Xt(this,"gemLabel"),Xt(this,"gemContainer"),Xt(this,"btnConfirm"),this.setTitle(nB.getText("GAME_139","친구 초대")); - const t=OL.MENU_LABEL_OPTION; - t.fill=14988422,t.fontSize=19,this.lblDesc=new SD("보상을 받았습니다.",t.fill,t),this.lblDesc.y=100,this.addChild(this.lblDesc),OL.setLabelWrapWidth(this.lblDesc,this.width-80),this.gemContainer=new He,this.addChild(this.gemContainer),this.gemIcon=new je(eS.getTexture("UI_Ekkorr","UI_SHOP_GEM")),this.gemIcon.scale=.85,this.gemContainer.addChild(this.gemIcon); - const i=OL.MENU_LABEL_OPTION; - i.fill=16777215,i.fontSize=20,this.gemLabel=new SD("100",i.fill,i),this.gemContainer.addChild(this.gemLabel),this.btnConfirm=new xG(nB.getText("COMMON_1","확인")),this.addChild(this.btnConfirm),this.btnConfirm.onClick=this.onConfirmBtnClick.bind(this),this.updateLayout()} - static getInstance(){ - return this._instance||(this._instance=new t),this._instance} - updateLayout(){ - this.lblDesc.x=.5*(this.width-this.lblDesc.width),this.gemLabel.x=this.gemIcon.x+this.gemIcon.width+10,this.gemLabel.y=.5*(this.gemIcon.height-this.gemLabel.height),this.gemContainer.x=.5*(this.width-this.gemContainer.width),this.gemContainer.y=this.lblDesc.y+this.lblDesc.height+30,this.btnConfirm.x=.5*(this.width-this.btnConfirm.width),this.btnConfirm.y=this.gemContainer.y+this.gemContainer.height+30,this.bg.height=this.btnConfirm.y+this.btnConfirm.height+40-this.bg.y,this.bottom.y=this.bg.y+this.bg.height-10} - setData(t){ - this.setTitle(nB.getText("GAME_139","친구 초대")),this.lblDesc.text=nB.getText("COMMON_313","보상을 받았습니다."),this.btnConfirm.text=nB.getText("COMMON_1","확인"),this.gemLabel.text=String("totalGems"in t?t.totalGems:Azt.GEM_PER_FRIEND),this.updateLayout()} - onConfirmBtnClick(){ - this.hide()} - } - ; - qt(nhi,"FriendInviteRewardPopup"),Xt(nhi,"_instance"); - let hhi=nhi; - const rhi=class extends NXt{ - constructor(){ - super(""),Xt(this,"bgOff"),Xt(this,"icon"),this.setTexture({ - texture:eS.getTexture("UI_Ekkorr","UI_ButtonBG0003"),leftWidth:25,topHeight:13,rightWidth:18,bottomHeight:21} - ),this.bgOff=new kM({ - texture:eS.getTexture("UI_Ekkorr","UI_ButtonBG0007"),leftWidth:35,topHeight:28,rightWidth:35,bottomHeight:28} - ),this.bgOff.width=this._width,this.bgOff.height=this._height,this.container.addChildAt(this.bgOff,0),this.icon=new je(eS.getTexture("UI_Ekkorr","Icon_Receive")),this.icon.eventMode="none",this.container.addChild(this.icon),this.updateLayout()} - updateLayout(){ - super.updateLayout(),this.icon&&(this.icon.x=this.bg.x+.5*(this.bg.width-this.icon.width)-3,this.icon.y=this.bg.y+.5*(this.bg.height-15-this.icon.height))} - onDown(t){ - this.container.scale=.9} - onUp(t){ - this.container.scale=1} - onTap(t){ - MG.getInstance().playSFX(MG.SFX_NORMAL_CLICK),this.onClick&&this.onClick()} - get activated(){ - return this._activated} - set activated(t){ - t!=this._activated&&(this._activated=t,this._activated?(this.bg.visible=!0,this.bgOff.visible=!1,this.icon.alpha=1):(this.bg.visible=!1,this.bgOff.visible=!0,this.icon.alpha=.7))} - } - ; - qt(rhi,"FriendInviteRewardButton"); - let ohi=rhi; - const ahi=class extends g6{ - constructor(){ - super(),Xt(this,"receivedIcon"),Xt(this,"activatedBg"),Xt(this,"_activated",!0),Xt(this,"_received",!1),this.activatedBg=new je(eS.getTexture("UI_Ekkorr","Frame_Reward_01_nor")),this.activatedBg.visible=!this._activated,this.addChild(this.activatedBg),this.receivedIcon=new je(eS.getTexture("UI_Ekkorr","Base_Check01")),this.receivedIcon.visible=this._received,this.addChild(this.receivedIcon)} - updateLayout(){ - if(super.updateLayout(),!this.receivedIcon)return; - const t=this.bg.width,i=this.bg.height; - this.receivedIcon.x=.5*(t-this.receivedIcon.width),this.receivedIcon.y=.5*(i-this.receivedIcon.height)} - get activated(){ - return this._activated} - set activated(t){ - t!=this._activated&&(this._activated=t,this.activatedBg.visible=!this._activated)} - get received(){ - return this._received} - set received(t){ - t!=this._received&&(this._received=t,this.receivedIcon.visible=this._received)} - } - ; - qt(ahi,"FriendInviteRewardItem"); - let chi=ahi; - const lhi=class extends iR{ - constructor(){ - super(),Xt(this,"bg"),Xt(this,"lblInvite"),Xt(this,"lblNo"),Xt(this,"items"),Xt(this,"container"),Xt(this,"btnReward"),Xt(this,"_width",570),Xt(this,"_height",79),this.items=[],this.bg=new kM({ - texture:eS.getTexture("UI_Ekkorr","Popup_List_02"),leftWidth:135,topHeight:30,rightWidth:20,bottomHeight:30} - ),this.bg.width=this._width,this.addChild(this.bg); - const t=OL.LABEL_OPTION_NO_DROP_SHADOW; - t.fill=OL.COLOR_WHITE,t.fontSize=20,this.lblInvite=new SD("Invite",t.fill,t),this.lblInvite.x=15,this.addChild(this.lblInvite); - const i=OL.LABEL_OPTION_NO_DROP_SHADOW; - i.fill=OL.COLOR_WHITE,i.fontSize=30,this.lblNo=new SD("1",i.fill,i),this.addChild(this.lblNo),this.container=new He,this.container.x=178,this.container.y=7,this.addChild(this.container),this.btnReward=new ohi,this.btnReward.x=this.bg.width-this.btnReward.width-11,this.btnReward.y=.5*(this.bg.height-this.btnReward.height),this.addChild(this.btnReward),this.btnReward.onClick=this.onRewardBtnClick.bind(this),this.updateLayout()} - get width(){ - return this._width} - get height(){ - return this._height} - updateLayout(){ - const t=this._height; - this.lblInvite.y=.5*(t-this.lblInvite.height)-1,this.lblNo.x=this.lblInvite.x+this.lblInvite.width+10,this.lblNo.y=.5*(t-this.lblNo.height)-1} - setData(t){ - this.data=t,this.lblInvite.text="Invite",this.lblNo.text=String(t.index+1); - const i=this.isClaimed(),s=this.isActivated(),e=OL.COLOR_WHITE,n=10066329; - s||i?(this.lblInvite.textColor=e,this.lblNo.textColor=e):(this.lblInvite.textColor=n,this.lblNo.textColor=n),this.btnReward.activated=s&&!i,this.container.removeChildren(); - let h,r=0; - const o=t.rewards.length; - for(let a=0; - a<o; - ++a)a<this.items.length?h=this.items[a]:(h=new chi,this.items.push(h)),h.setDataFrom(t.rewards[a]),h.received=i,h.activated=s,h.x=r,this.container.addChild(h),r+=h.width+10; - this.updateLayout()} - isClaimed(){ - return!(this.data.index+1>this.data.claimed)} - isActivated(){ - return!(this.data.index+1>this.data.qualifiedReferrals||this.isClaimed())} - onRewardBtnClick(){ - const t=this.isClaimed(),i=this.isActivated(); - if(1!=t){ - if(0==i){ - const t=nB.getValueReplaceMulti("GAME_145",["##","@@"],[Azt.FRIEND_LEVEL,this.data.index+1]); - return void YG.getInstance().show(t)} - fhi.getInstance().claimRewards(this.data.index+1)} - } - } - ; - qt(lhi,"FriendInviteItemRenderer"); - let uhi=lhi; - const dhi=class t extends AYt{ - constructor(){ - super(),Xt(this,"banner"),Xt(this,"lblInvite"),Xt(this,"lblDesc"),Xt(this,"descBg"),Xt(this,"list"),Xt(this,"btnMyLink"),Xt(this,"onReferralStatusBind"),this.setTitle(nB.getText("COMMON_360","친구 초대")),this.top.removeFromParent(),this.txtTitle.textColor=16777215,this.addChild(this.txtTitle),this.btnClose.setTexture(eS.getTexture("UI_Ekkorr","Btn_Close_02")),this.addChild(this.btnClose),this.banner=new Bzt(596,114),this.banner.autoResize=!0,this.banner.x=this.bg.x+.5*(this.bg.width-this.banner.width),this.banner.y=this.top.y+this.top.height-5,this.addChild(this.banner),this.descBg=new kM({ - texture:eS.getTexture("UI_Ekkorr","Popup_Bg_02"),leftWidth:15,topHeight:10,rightWidth:15,bottomHeight:10} - ),this.descBg.x=this.bg.x+10,this.descBg.y=this.banner.y+this.banner.height+1,this.descBg.width=600,this.descBg.height=100,this.addChild(this.descBg); - const t=OL.LABEL_OPTION_NO_DROP_SHADOW; - t.fill=OL.COLOR_WHITE,t.fontSize=29,this.lblInvite=new SD(`${ - nB.getText("COMMON_361","초대한 친구")} - : 0`,t.fill,t),this.lblInvite.y=this.descBg.y+15,this.addChild(this.lblInvite),OL.setLabelWrapWidth(this.lblInvite,this.bg.width-50); - const i=OL.LABEL_OPTION_NO_DROP_SHADOW; - i.fill=16178882,i.fontSize=19,this.lblDesc=new SD(nB.getValueReplace("COMMON_362","##",Azt.FRIEND_LEVEL,`${ - Azt.FRIEND_LEVEL} - 레벨을 달성한 친구만 반영됩니다.`),i.fill,i),this.addChild(this.lblDesc),OL.setLabelWrapWidth(this.lblDesc,this.bg.width-50),this.btnMyLink=new sjt(nB.getText("COMMON_314","내 초대 링크")),this.addChild(this.btnMyLink),this.btnMyLink.onClick=this.onMyLinkBtnClick.bind(this),this.list=new Zk(uhi,570,500,6),this.list.x=this.bg.x+.5*(this.bg.width-570),this.addChild(this.list),this.updateLayout(),this.on("added",this.onAdded,this),this.on("removed",this.onRemoved,this)} - static getInstance(){ - return null==this.instance&&(this.instance=new t),this.instance} - onAdded(){ - this.setReferralStatus(!0)} - onRemoved(){ - this.setReferralStatus(!1)} - updateLayout(){ - this.btnClose.x=this.top.x+this.top.width-this.btnClose.width-25,this.btnClose.y=this.txtTitle.y+.5*(this.txtTitle.height-this.btnClose.height)+3; - const t=this.bg.x,i=this.bg.width; - this.lblInvite.x=t+.5*(i-this.lblInvite.width),this.lblDesc.x=t+.5*(i-this.lblDesc.width),this.lblDesc.y=this.lblInvite.y+this.lblInvite.height+10,this.btnMyLink.x=t+.5*(i-this.btnMyLink.width),this.btnMyLink.y=this.bottom.y-this.btnMyLink.height-20,this.list.y=this.descBg.y+this.descBg.height+11; - const s=this.btnMyLink.y-20-this.list.y; - this.list.setListHeight(s)} - async setData(){ - this.setTitle(nB.getText("COMMON_360","친구 초대")),this.btnMyLink.text=nB.getText("COMMON_314","내 초대 링크"),this.updateInfo(),this.updateList(),await this.banner.update("Popup_Banner_01"),this.updateLayout()} - updateInfo(){ - let t=nB.getValueReplace("COMMON_362","##",Azt.FRIEND_LEVEL,`${ - Azt.FRIEND_LEVEL} - 레벨을 달성한 친구만 반영됩니다.`); - this.lblDesc.text=t,this.lblInvite.text=`${ - nB.getText("COMMON_361","초대한 친구")} - : ${ - Azt.qualifiedReferrals} - `} - updateList(){ - const t=[],i=Azt.claimed,s=Azt.totalReferrals,e=Azt.qualifiedReferrals,n=Azt.getRewardList(); - let h; - const r=n.length; - for(let o=0; - o<r; - ++o)h={ - index:o,rewards:n[o],claimed:i,totalReferrals:s,qualifiedReferrals:e} - ,t.push(h); - this.list.dataProvider=t,i>0&&this.list.scrollTo(i-1)} - async onMyLinkBtnClick(){ - let t=await Azt.getMyReferralCode(); - if(t&&await N6t(t)){ - const t=nB.getText("GAME_144","초대 링크가 복사되었습니다."); - R6t.getInstance().show(t,.5*Xy.stageHeight,16777215)} - } - async claimRewards(t){ - Azt.claimRewards(t)} - setReferralStatus(t){ - mS.getInstance().removeEventListener("ReferralStatus",this.onReferralStatusBind),t&&(this.onReferralStatusBind=this.onReferralStatus.bind(this),mS.getInstance().addEventListener("ReferralStatus",this.onReferralStatusBind))} - onReferralStatus(t){ - t&&t.detail&&this.showRewards(t.detail),Azt.opened?(this.updateInfo(),this.updateList(),this.list.executeShowingMotion()):this.hide()} - showRewards(t){ - hhi.getInstance().setData(t),hhi.getInstance().show()} - } - ; - qt(dhi,"FriendInvitePopup"),Xt(dhi,"instance"); - let fhi=dhi; - const phi=class t extends BG{ - constructor(){ - super(),Xt(this,"lblMessage"),Xt(this,"btnConfirm",new xG("확인")),Xt(this,"onConfirm",null),this.title="",this.lblMessage=new rU("@",500,19,OL.COLOR_WHITE),this.lblMessage.x=90,this.lblMessage.y=80,this.addChild(this.lblMessage,this.btnConfirm),this.outSideClickHide=!0,this.btnConfirm.onClick=this.onConfirmClick.bind(this)} - static getInstance(){ - return this._instance||(this._instance=new t),this._instance} - onConfirmClick(){ - this.hide(); - let t=this.onConfirm; - this.onConfirm=null,null!==t&&t()} - show(t,i=null){ - this.onConfirm=i,this.lblMessage.text=t; - let s=nB.getText("COMMON_1","확인"); - this.btnConfirm.text=s,this.updateLayout(),super.show()} - hide(){ - super.hide(),this.title=""} - updateLayout(){ - this.lblMessage.x=.5*(this.width-this.lblMessage.width),this.btnConfirm.x=.5*(this.width-this.btnConfirm.width),this.btnConfirm.y=this.lblMessage.y+this.lblMessage.height+30,this.height=this.btnConfirm.y+this.btnConfirm.height+40} - } - ; - qt(phi,"HelpInfoPopup"),Xt(phi,"_instance"); - let ghi=phi; - const mhi=class extends He{ - constructor(){ - super(),Xt(this,"bg"),Xt(this,"lblTitle"),Xt(this,"container"),Xt(this,"img"),Xt(this,"lblNum"),Xt(this,"_width",130),Xt(this,"_height",120),Xt(this,"data",null),Xt(this,"redDot"),this.bg=new kM({ - texture:eS.getTexture("UI_Ekkorr","Popup_Bg_11"),leftWidth:35,topHeight:40,rightWidth:35,bottomHeight:35} - ),this.bg.width=this._width,this.bg.height=this._height,this.addChild(this.bg); - const t=OL.LABEL_OPTION_NO_DROP_SHADOW; - t.fill=OL.COLOR_WHITE,t.fontSize=17,this.lblTitle=new SD("PAYBACK",t.fill,t),this.addChild(this.lblTitle),this.container=new He,this.addChild(this.container),this.img=new je(eS.getTexture("UI_Ekkorr","Icon_SLX")),this.container.addChild(this.img); - const i=OL.LABEL_OPTION_NO_DROP_SHADOW; - i.fill=OL.COLOR_WHITE,i.fontSize=22,this.lblNum=new SD("0",i.fill,i),this.lblNum.x=this.img.width+7,this.lblNum.y=.5*(this.img.height-this.lblNum.height),this.container.addChild(this.lblNum),this.updateLayout()} - get width(){ - return this._width} - get height(){ - return this._height} - updateLayout(){ - this.lblTitle.x=.5*(this._width-this.lblTitle.width),this.lblTitle.y=.5*(35-this.lblTitle.height),this.container.x=.5*(this._width-this.container.width),this.container.y=46+.5*(this._height-46-this.container.height)-5} - setData(t){ - if(null==t)return; - this.data=t,this.reset(); - const i=Dzt.isEventEnded(),s=Dzt.isPaybackEnded(); - this.img.texture=eS.getTexture("UI_Ekkorr","Icon_SLX"),this.lblNum.text=String(this.data.paybackValue); - let e=!0; - this.data.status==kzt.NOT_PURCHASE?(1==i||this.data.index>this.data.notPurchaseIndex)&&(e=!1):1==s||this.data.status==kzt.COMPLETED||this.data.status==kzt.PENDING?e=!1:this.showRedDot(),e?(this.setRewardEvent(!0),this.lblTitle.textColor=16777215,this.lblNum.textColor=16777215,this.img.texture=eS.getTexture("UI_Ekkorr","Icon_SLX")):(this.lblTitle.textColor=4603696,this.lblNum.textColor=10592673,this.img.texture=eS.getTexture("UI_Ekkorr","Icon_SLX_Gray")),this.updateLayout()} - reset(){ - this.hideRedDot(),this.setRewardEvent(!1)} - setRewardEvent(t){ - this.eventMode="none",this.off("pointertap",this.onRewardClick,this),t&&(this.eventMode="dynamic",this.on("pointertap",this.onRewardClick,this))} - onRewardClick(t){ - if(MG.getInstance().playSFX(MG.SFX_NORMAL_CLICK),this.data&&this.data.status!=kzt.COMPLETED&&this.data.status!=kzt.PENDING){ - if(this.data.status==kzt.NOT_PURCHASE||this.data.paybackId<1){ - const t=nB.getText("COMMON_115","상품 구매 후 수령 가능합니다."); - return void YG.getInstance().show(t)} - if(this.data.index>this.data.rewardIndex){ - const t=nB.getText("COMMON_104","보상은 순서대로 받아주세요."); - return void YG.getInstance().show(t)} - Chi.getInstance().receive(this.data,this.img)} - } - showRedDot(){ - this.redDot||(this.redDot=new TG,this.addChild(this.redDot)),this.redDot.show(),this.redDot.x=this.bg.x+this.bg.width-this.redDot.width,this.redDot.y=this.bg.y-7} - hideRedDot(){ - this.redDot&&this.redDot.hide()} - } - ; - qt(mhi,"PaybackEventItemPayback"); - let whi=mhi; - const vhi=class extends NXt{ - constructor(t){ - super(t),Xt(this,"bgOff"),Xt(this,"icon"),this.bgOff=new kM({ - texture:eS.getTexture("UI_Ekkorr","Btn_Gray"),leftWidth:40,topHeight:27,rightWidth:40,bottomHeight:29} - ),this.bgOff.width=this._width,this.bgOff.height=this._height,this.container.addChildAt(this.bgOff,0),this.icon=new je(eS.getTexture("UI_Ekkorr","Icon_SLX")),this.icon.eventMode="none",this.container.addChild(this.icon),this.outlineText=!0,this.width=150,this.height=70,this.container.addChild(this.lbl)} - updateLayout(){ - if(super.updateLayout(),!this.icon)return; - this.icon.x=12,this.icon.y=.5*(this._height-this.icon.height); - const t=this.icon.x+this.icon.width; - this.lbl.x=t+.5*(this._width-t-this.lbl.width)-5,this.lbl.y=this.icon.y+.5*(this.icon.height-this.lbl.height)} - get width(){ - return this._width} - set width(t){ - super.width=t,this.bgOff&&(this.bgOff.width=this._width)} - get height(){ - return this._height} - set height(t){ - super.height=t,this.bgOff&&(this.bgOff.height=this._height)} - get activated(){ - return this._activated} - set activated(t){ - this._activated=t,this._activated?(this.bg.visible=!0,this.bgOff.visible=!1):(this.bg.visible=!1,this.bgOff.visible=!0)} - } - ; - qt(vhi,"PaybackEventBuyButton"); - let _hi=vhi; - const bhi=class extends g6{ - constructor(){ - super(),this.bg.texture=eS.getTexture("UI_Ekkorr","Frame_Reward_01")} - } - ; - qt(bhi,"PaybackEventItemProductElement"); - let Ehi=bhi; - const Mhi=class extends He{ - constructor(){ - super(),Xt(this,"bg"),Xt(this,"lblSeq"),Xt(this,"container"),Xt(this,"items"),Xt(this,"btnSLX"),Xt(this,"lblDesc"),Xt(this,"_width",380),Xt(this,"_height",120),Xt(this,"_numItem",1),Xt(this,"data",null),this.bg=new kM({ - texture:eS.getTexture("UI_Ekkorr","Popup_Bg_11"),leftWidth:35,topHeight:40,rightWidth:35,bottomHeight:35} - ),this.bg.width=this._width,this.bg.height=this._height,this.addChild(this.bg); - const t=OL.LABEL_OPTION_NO_DROP_SHADOW; - t.fill=OL.COLOR_WHITE,t.fontSize=17,this.lblSeq=new SD("1",t.fill,t),this.addChild(this.lblSeq),this.container=new He,this.container.y=46,this.addChild(this.container),this.items=[],this.btnSLX=new _hi("0"),this.addChild(this.btnSLX),this.btnSLX.onClick=this.onBuyBtnClick.bind(this); - const i=OL.LABEL_OPTION_NO_DROP_SHADOW; - i.fill=OL.COLOR_WHITE,this.lblDesc=new SD("위 상품 구매 후 구매 가능",i.fill,i),this.addChild(this.lblDesc),this.updateLayout()} - get width(){ - return this._width} - get height(){ - return this._height} - get numItem(){ - return this._numItem} - updateLayout(){ - if(this.lblSeq.x=this.bg.x+.5*(this.bg.width-this.lblSeq.width),this.lblSeq.y=.5*(35-this.lblSeq.height),this.btnSLX.x=this.bg.x+this.bg.width-this.btnSLX.width-20,this.btnSLX.y=this.container.y+.5*(this.container.height-this.btnSLX.height),this.btnSLX.visible)this.container.x=10+.5*(this.btnSLX.x-10-this.container.width); - else{ - this.container.x=20; - const t=this.container.x+this.container.width,i=this._width-t-10; - OL.setLabelWrapWidth(this.lblDesc,i),this.lblDesc.x=t+.5*(i-this.lblDesc.width),this.lblDesc.y=this.btnSLX.y+.5*(this.btnSLX.height-this.lblDesc.height)} - } - setData(t){ - if(null==t)return; - this.data=t; - const i=Dzt.isEventEnded(),s={ - price:100,rewards:[{ - type:"gem",amount:100,grade:-1} - ]} - ; - this.lblSeq.text=`PRODUCT ${ - this.data.index+1} - `,this.container.removeChildren(); - let e,n=0; - const h=s.rewards.length; - for(let r=0; - r<h; - ++r)r<this.items.length?e=this.items[r]:(e=new Ehi,this.items.push(e)),e.setData(s.rewards[r].type,s.rewards[r].amount,s.rewards[r].grade),e.x=n,this.container.addChild(e),n+=e.width+6; - this.btnSLX.text=String(s.price),this.data.status==kzt.NOT_PURCHASE&&0==i?this.btnSLX.activated=!0:this.btnSLX.activated=!1,this.lblDesc.text=nB.getText("PAYBACK_1","위 상품 구매 후 구매 가능"),this.data.index>this.data.notPurchaseIndex?(this.btnSLX.visible=!1,this.lblDesc.visible=!0):(this.btnSLX.visible=!0,this.lblDesc.visible=!1),1==i&&this.data.status==kzt.NOT_PURCHASE&&(this.btnSLX.visible=!1,this.bg.texture=eS.getTexture("UI_Ekkorr","Popup_Bg_11_Gray"),this.lblDesc.text=nB.getText("COMMON_344","판매 종료"),this.lblDesc.visible=!0),this.updateLayout()} - onBuyBtnClick(){ - if(!this.data)return; - if(this.data.status!=kzt.NOT_PURCHASE)return; - const t=Dzt.isEventEnded(),i=Dzt.paybackEvent; - if(1==t){ - const{ - startTimeStr:t,endTimeStr:s,paybackEndTimeStr:e} - =Dzt.getEventDurationStr(i); - let n=nB.getText("PAYBACK_H1","이벤트 기간 동안 페이백 상품을 구매할 수 있습니다."); - return n+=`\n(${ - t} - ~ ${ - s} - )`,void YG.getInstance().show(n)} - if(0!=this.btnSLX.activated){ - if(this.data.index>this.data.notPurchaseIndex+1){ - const t=nB.getText("COMMON_116","순서대로 구매 가능합니다."); - return void YG.getInstance().show(t)} - Chi.getInstance().buy(this.data,this.btnSLX)} - } - } - ; - qt(Mhi,"PaybackEventItemProduct"); - let Ahi=Mhi; - const yhi=class extends iR{ - constructor(){ - super(),Xt(this,"bg"),Xt(this,"product"),Xt(this,"payback"),Xt(this,"arrow"),Xt(this,"_width",580),Xt(this,"_height",130),this.bg=new kM({ - texture:eS.getTexture("UI_Ekkorr","whiteRect"),leftWidth:10,topHeight:10,rightWidth:10,bottomHeight:10} - ),this.bg.tint=1970226,this.bg.alpha=.1,this.bg.width=this._width,this.bg.height=this._height,this.addChild(this.bg),this.product=new Ahi,this.addChild(this.product),this.payback=new whi,this.payback.x=this._width-this.payback.width-1,this.payback.y=this.product.y,this.addChild(this.payback); - const t=this.product.x+this.product.width; - this.arrow=new je(eS.getTexture("UI_Ekkorr","Icon_Arrow")),this.arrow.x=t+.5*(this.payback.x-t-this.arrow.width),this.arrow.y=this.product.y+.5*(this.product.height-this.arrow.height)-1,this.addChild(this.arrow)} - get width(){ - return this._width} - get height(){ - return this._height} - setData(t){ - this.product.setData(t),this.payback.setData(t)} - } - ; - qt(yhi,"PaybackEventItemRenderer"); - let Shi=yhi; - const Thi=class t extends AYt{ - constructor(){ - super(),Xt(this,"banner"),Xt(this,"lblDuration"),Xt(this,"bgPaybackEnd"),Xt(this,"lblPaybackEnd"),Xt(this,"btnHelp"),Xt(this,"list"),Xt(this,"dataList",[]),Xt(this,"requestPending1",!1),Xt(this,"requestPending2",!1),Xt(this,"count",0),Xt(this,"onPaybackEventBind"),Xt(this,"onPaymentSuccessBind"),this.setTitle(nB.getText("PAYBACK_T1","페이백 이벤트!")),this.top.removeFromParent(),this.banner=new Bzt(596,114),this.banner.autoResize=!0,this.banner.x=this.bg.x+.5*(this.bg.width-this.banner.width),this.banner.y=this.top.y+this.top.height-5,this.addChild(this.banner),this.txtTitle.textColor=16777215,this.addChild(this.txtTitle),this.btnClose.setTexture(eS.getTexture("UI_Ekkorr","Btn_Close_02")),this.addChild(this.btnClose); - const t=OL.DEFAULT_OUTLINE_FONT_OPTION_18; - t.fill=16777215,this.lblDuration=new SD("YYYY. MM. DD ~ YYYY. MM. DD",t.fill,t),this.lblDuration.x=this.banner.x+10,this.lblDuration.y=this.banner.y+this.banner.height-this.lblDuration.height-7,this.addChild(this.lblDuration),this.bgPaybackEnd=new kM({ - texture:eS.getTexture("UI_Ekkorr","Popup_Bg_02"),leftWidth:15,topHeight:10,rightWidth:15,bottomHeight:10} - ),this.bgPaybackEnd.width=600,this.bgPaybackEnd.height=60,this.bgPaybackEnd.x=this.bg.x+10,this.bgPaybackEnd.y=this.banner.y+this.banner.height,this.addChild(this.bgPaybackEnd),this.btnHelp=new nU("UI_Ekkorr","Btn_help_p"),this.btnHelp.x=this.bgPaybackEnd.x+10,this.btnHelp.y=this.bgPaybackEnd.y+10,this.addChild(this.btnHelp),this.btnHelp.onClick=this.onHelpBtnClick.bind(this); - const i=OL.LABEL_OPTION_NO_DROP_SHADOW; - i.fill=16774108,this.lblPaybackEnd=new SD("보상 기간 :",i.fill,i),this.lblPaybackEnd.x=this.btnHelp.x+this.btnHelp.width,this.lblPaybackEnd.y=this.bgPaybackEnd.y+.5*(this.bgPaybackEnd.height-this.lblPaybackEnd.height),this.addChild(this.lblPaybackEnd); - const s=this.bgPaybackEnd.y+this.bgPaybackEnd.height+15,e=this.bottom.y-s-10; - this.list=new Zk(Shi,580,e,0),this.list.x=this.bg.x+20,this.list.y=s,this.addChild(this.list),this.updateLayout()} - static getInstance(){ - return null==this.instance&&(this.instance=new t),this.instance} - onAdded(){ - this.setEnterUpdate(!0),this.setPaybackEvent(!0),this.setPaymentSuccess(!0)} - onRemoved(){ - this.setEnterUpdate(!1),this.setPaybackEvent(!1),this.setPaymentSuccess(!1)} - updateLayout(){ - this.btnClose.x=this.top.x+this.top.width-this.btnClose.width-30,this.btnClose.y=this.txtTitle.y+.5*(this.txtTitle.height-this.btnClose.height)} - async setData(){ - 0==Dzt.opened&&Dzt.getPaybackEvent(2),this.updateInfo(),this.updateList(),await this.banner.update("Popup_Banner_02"),this.updateLayout()} - updateInfo(){ - const t=Dzt.paybackEvent,i=nB.getText(t.title,"Payback Event!"); - this.setTitle(i); - const{ - startTimeStr:s,endTimeStr:e,paybackEndTimeStr:n} - =Dzt.getEventDurationStr(t); - this.lblDuration.text=`${ - s} - ~ ${ - e} - (UTC)`,this.lblPaybackEnd.text=nB.getText("COMMON_312","보상 기간 : YYYY-MM-DD (UTC)").replace("YYYY-MM-DD",n)} - updateList(){ - const t=Dzt.paybackEvent,i=Dzt.paybacks; - this.dataList.length=0; - const s=i.findIndex(t=>t.status==kzt.NOT_PURCHASE),e=i.findIndex(t=>t.status==kzt.CREATED||t.status==kzt.FAILED); - let n,h; - const r=i.length; - for(let o=0; - o<r; - ++o)n={ - index:o,eventId:t.id} - ,h=i[o],n.paybackId=h.id,n.productId=h.productId,n.paybackType=h.paybackType,n.paybackValue=h.paybackValue,n.status=h.status,n.paidbackAt=h.paidbackAt,n.notPurchaseIndex=s,n.rewardIndex=e,this.dataList.push(n); - this.list.dataProvider=this.dataList,this.list.executeShowingMotion()} - onHelpBtnClick(){ - const t=QD.getInstance().getCsEmail(); - let i; - const s=Dzt.paybackEvent; - if(s.description.length>0){ - i=[]; - const e=s.description.length; - for(let n=0; - n<e; - ++n){ - let e=nB.getValue(s.description[n]); - "PAYBACK_H6"==s.description[n]&&(e+=` (${ - t} - )`),i.push(e)} - } - else i=[nB.getText("PAYBACK_H1","이벤트 기간 동안 페이백 상품을 구매할 수 있습니다."),nB.getText("PAYBACK_H2","페이백 상품은 이벤트 기간 내에 1번만 구매할 수 있으며, 순서대로 구매 가능합니다."),nB.getText("PAYBACK_H3","페이백 상품을 구매하면 페이백 보상이 활성화되어 획득 가능합니다."),nB.getText("PAYBACK_H4","이벤트 기간이 종료되면 미수령한 페이백 보상은 소멸되어 획득이 불가합니다."),nB.getText("PAYBACK_H5","네트워크 상태에 따라 페이백 보상 지급에 일정 시간이 소요될 수 있습니다."),nB.getText("PAYBACK_H6","구매한 상품이 지급되지 않을 경우, 게임 ID와 결제 정보를 고객센터로 보내주세요.")],i[i.length-1]+=` (${ - t} - )`; - let e=.07*i.length; - e>.4&&(e=.4),ghi.getInstance().setPositonRatioY(e),ghi.getInstance().title=nB.getText("COMMON_4","알림"),ghi.getInstance().show("\n@ "+i.join("\n@ "))} - async buy(t,i){ - } - async receive(t,i){ - if(1==this.requestPending2)return; - let s; - if(this.setRequestPending2(!0),s=t.status==kzt.PENDING?await TL.getInstance().payback.checkPending(t.eventId,t.paybackId,!0):await TL.getInstance().payback.receive(t.eventId,t.paybackId,!0),0==s.success){ - this.setRequestPending2(!1); - let t=""; - const i=s.error; - return"UNABLE_TO_PAYBACK"==i?t=nB.getText("COMMON_115","상품 구매 후 수령 가능합니다."):"COOL_TIME"==i?t=nB.getText("COMMON_82","잠시 후에 다시 시도해 주세요."):"PAYBACK_NOT_ELIGIBLE"==i&&(t=nB.getText("PAYBACK_2","페이백 보상 기간이 지났습니다.")),t?void YG.getInstance().show(t):void YG.getInstance().showError(s)} - const e=nB.getText("COMMON_313","보상을 받았습니다.")+"\n"+t.paybackType.toUpperCase()+" : "+t.paybackValue; - YG.getInstance().show(e),Dzt.setData(s.body),this.updateList(),this.displaySlxGathering(i,t.paybackValue),this.setRequestPending2(!1)} - displaySlxGathering(t,i){ - if(!t)return; - let s=t.getGlobalPosition(),e=Xy.stage.toLocal(s); - B9t.getInstance().getSlx(e.x+.5*t.width-15,e.y+.5*t.height-20,i,Math.min(30,i),Fzt.getInstance())} - setRequestPending1(t){ - this.requestPending1=t} - setRequestPending2(t){ - this.requestPending2=t} - setEnterUpdate(t){ - FM.getInstance().remove(this.onEnter,this),t&&FM.getInstance().add(this.onEnter,this)} - onEnter(){ - ++this.count>60&&(this.count=0,this.onEnterUpdate())} - onEnterUpdate(){ - 1==Dzt.isPaybackEnded()&&this.hide()} - setPaybackEvent(t){ - mS.getInstance().removeEventListener("PaybackEvent",this.onPaybackEventBind),t&&(this.onPaybackEventBind=this.onPaybackEvent.bind(this),mS.getInstance().addEventListener("PaybackEvent",this.onPaybackEventBind))} - onPaybackEvent(t){ - Dzt.opened?(this.updateInfo(),this.updateList()):this.hide()} - setPaymentSuccess(t){ - mS.getInstance().removeEventListener("PaymentSuccess",this.onPaymentSuccessBind),t&&(this.onPaymentSuccessBind=this.onPaymentSuccess.bind(this),mS.getInstance().addEventListener("PaymentSuccess",this.onPaymentSuccessBind))} - onPaymentSuccess(t){ - let i=-1; - if(t&&t.detail&&"productId"in t.detail&&(i=t.detail.productId),-1==i)return; - let s=c6.getInstance().getByProductId(i); - s||(null==t?void 0:t.detail.productVo)&&(s=null==t?void 0:t.detail.productVo),s&&1==s.payback&&Dzt.getPaybackEvent(1)} - } - ; - qt(Thi,"PaybackEventPopup"),Xt(Thi,"instance"); - let Chi=Thi; - const Ihi=class t{ + )),Yri=class t{
PvpHpGauge 1 hunks, 376 statements
- super(),Xt(this,"battleType",AF.PVP2),Xt(this,"BATTLEFIELD_WIDTH",640),Xt(this,"BATTLEFIELD_HEIGHT",640),Xt(this,"VIEWPORT_WIDTH",640),Xt(this,"GAME_ZOOM",1.3),Xt(this,"CAMERA_LERP",.08),Xt(this,"cameraX",0),Xt(this,"ALLY_CASTLE_X",126),Xt(this,"ALLY_CASTLE_Y",536),Xt(this,"ENEMY_CASTLE_X",1320),Xt(this,"ENEMY_CASTLE_Y",536),Xt(this,"ALLY_SPAWN_X",200),Xt(this,"ENEMY_SPAWN_X",1200),Xt(this,"Y_MIN",520),Xt(this,"Y_MAX",600),Xt(this,"ENEMY_COUNT",10),Xt(this,"CRANE_WING_ARC",20),Xt(this,"PVP_TIME_LIMIT_FRAMES",3600),Xt(this,"pvpStarted",!1),Xt(this,"speedHelper",new fZt("ef2.pvp2.battleSpeed")),Xt(this,"enemyCastle",null),Xt(this,"allyCastle",null),Xt(this,"timerText",null),Xt(this,"spawnedVOs",[]),Xt(this,"pvpTeamVOs",[]),Xt(this,"opTransPoints",null),Xt(this,"marchMode",!1),Xt(this,"allySpawnQueue",[]),Xt(this,"enemySpawnQueue",[]),Xt(this,"allySpawnTimer",0),Xt(this,"enemySpawnTimer",0),Xt(this,"MARCH_SPAWN_INTERVAL",56),Xt(this,"MARCH_ALLY_CASTLE_X",40),Xt(this,"MARCH_ALLY_CASTLE_Y",320),Xt(this,"MARCH_ENEMY_CASTLE_X",600),Xt(this,"MARCH_ENEMY_CASTLE_Y",320)} + super(),Zt(this,"allyG",new ip),Zt(this,"enemyG",new ip),Zt(this,"lblAlly"),Zt(this,"lblEnemy"),Zt(this,"ally",1),Zt(this,"enemy",1),Zt(this,"allyTrail",1),Zt(this,"enemyTrail",1),this.eventMode="none"; + const t=new qg({ + fontFamily:"Arial",fontSize:14,fontWeight:"bold",fill:16777215,stroke:{ + color:0,width:3,join:"round"} + } + ); + this.lblAlly=new dw({ + text:"100%",style:t} + ),this.lblEnemy=new dw({ + text:"100%",style:t.clone()} + ),this.lblAlly.anchor.set(1,.5),this.lblEnemy.anchor.set(0,.5),this.addChild(this.allyG,this.enemyG,this.lblAlly,this.lblEnemy),this.draw()} + get allyX(){ + return 320-t.CENTER_GAP/2-t.BAR_W} + get enemyX(){ + return 320+t.CENTER_GAP/2} + reset(){ + this.ally=this.enemy=this.allyTrail=this.enemyTrail=1,this.draw()} + setRatios(i,s){ + this.ally=Math.max(0,Math.min(1,i)),this.enemy=Math.max(0,Math.min(1,s)),this.allyTrail=Math.max(this.ally,this.allyTrail-t.TRAIL_SPEED*(this.allyTrail-this.ally+.02)),this.enemyTrail=Math.max(this.enemy,this.enemyTrail-t.TRAIL_SPEED*(this.enemyTrail-this.enemy+.02)),this.draw()} + draw(){ + const i=t.BAR_W,s=t.BAR_H,e=s/2,n=this.allyX; + this.allyG.clear(),this.allyG.roundRect(n-2,-2,i+4,s+4,e+2).fill({ + color:0,alpha:.6} + ),this.allyTrail>0&&this.allyG.roundRect(n,0,i*this.allyTrail,s,e).fill({ + color:16777215,alpha:.75} + ),this.ally>0&&this.allyG.roundRect(n,0,i*this.ally,s,e).fill({ + color:t.ALLY_COLOR} + ),this.allyG.roundRect(n,0,i,s/2,e).fill({ + color:16777215,alpha:.12} + ); + const h=this.enemyX; + this.enemyG.clear(),this.enemyG.roundRect(h-2,-2,i+4,s+4,e+2).fill({ + color:0,alpha:.6} + ),this.enemyTrail>0&&this.enemyG.roundRect(h+i*(1-this.enemyTrail),0,i*this.enemyTrail,s,e).fill({ + color:16777215,alpha:.75} + ),this.enemy>0&&this.enemyG.roundRect(h+i*(1-this.enemy),0,i*this.enemy,s,e).fill({ + color:t.ENEMY_COLOR} + ),this.enemyG.roundRect(h,0,i,s/2,e).fill({ + color:16777215,alpha:.12} + ),this.lblAlly.text=`${ + Math.ceil(100*this.ally)} + %`,this.lblAlly.position.set(n+i-6,s/2),this.lblEnemy.text=`${ + Math.ceil(100*this.enemy)} + %`,this.lblEnemy.position.set(h+6,s/2)} + } + ; + Qt(d7t,"PvpHpGauge"),Zt(d7t,"BAR_W",250),Zt(d7t,"BAR_H",18),Zt(d7t,"CENTER_GAP",116),Zt(d7t,"TRAIL_SPEED",.04),Zt(d7t,"ALLY_COLOR",4172287),Zt(d7t,"ENEMY_COLOR",16730698); + let f7t=d7t; + const p7t=class t extends Ve{ + constructor(){ + super(),Zt(this,"band",new ip),Zt(this,"left",new Ve),Zt(this,"right",new Ve),Zt(this,"vs",new Ye(kS.getTexture("UI_Ekkorr","UI_VS"))),Zt(this,"fight"),Zt(this,"leftName"),Zt(this,"leftSub"),Zt(this,"rightName"),Zt(this,"rightSub"),Zt(this,"timeline",null),this.eventMode="none"; + const i=t.CY,s=t.PANEL_H,e=t.PANEL_W,n=t.SLANT; + this.band.rect(0,i-s/2-18,640,s+36).fill({ + color:0,alpha:.55} + ); + const h=new qg({ + fontFamily:"Arial",fontSize:26,fontWeight:"bold",fill:16777215,stroke:{ + color:0,width:4,join:"round"} + } + ),r=new qg({ + fontFamily:"Arial",fontSize:18,fontWeight:"bold",fill:16777215,stroke:{ + color:0,width:3,join:"round"} + } + ),o=(new ip).poly([0,i-s/2,e,i-s/2,e-n,i+s/2,0,i+s/2]).fill({ + color:t.ALLY_COLOR,alpha:.95} + ).poly([0,i-s/2,e,i-s/2,e-6,i-s/2+12,0,i-s/2+12]).fill({ + color:16777215,alpha:.18} + ); + this.leftName=new dw({ + text:"",style:h} + ),this.leftSub=new dw({ + text:"",style:r.clone()} + ),this.leftSub.style.fill=12575743,this.leftName.position.set(24,i-38),this.leftSub.position.set(26,i+6),this.left.addChild(o,this.leftName,this.leftSub); + const a=(new ip).poly([640-e+n,i-s/2,640,i-s/2,640,i+s/2,640-e,i+s/2]).fill({ + color:t.ENEMY_COLOR,alpha:.95} + ).poly([640-e+n,i-s/2,640,i-s/2,640,i-s/2+12,640-e+n+6,i-s/2+12]).fill({ + color:16777215,alpha:.18} + ); + this.rightName=new dw({ + text:"",style:h.clone()} + ),this.rightSub=new dw({ + text:"",style:r.clone()} + ),this.rightSub.style.fill=16765132,this.rightName.anchor.set(1,0),this.rightSub.anchor.set(1,0),this.rightName.position.set(616,i-38),this.rightSub.position.set(614,i+6),this.right.addChild(a,this.rightName,this.rightSub),this.vs.anchor.set(.5),this.vs.position.set(320,i),this.fight=new dw({ + text:"FIGHT!",style:new qg({ + fontFamily:"Arial",fontSize:76,fontWeight:"bold",fill:16769354,stroke:{ + color:3807744,width:9,join:"round"} + ,dropShadow:{ + color:0,blur:10,angle:Math.PI/4,distance:5} + } + )} + ),this.fight.anchor.set(.5),this.fight.position.set(320,i),this.addChild(this.band,this.left,this.right,this.vs,this.fight),this.visible=!1} + play(t,i,s){ + return this.stop(),t.addChild(this),this.setSide(this.leftName,this.leftSub,i),this.setSide(this.rightName,this.rightSub,s),this.visible=!0,this.band.alpha=0,this.left.x=-340,this.right.x=340,this.vs.alpha=0,this.vs.scale.set(2.6),this.vs.rotation=-.25,this.fight.alpha=0,this.fight.scale.set(.3),new Promise(t=>{ + const i=MR.timeline({ + onComplete:Qt(()=>this.stop(),"onComplete")} + ); + this.timeline=i,i.to(this.band,{ + alpha:1,duration:.2} + ,0).to(this.left,{ + x:0,duration:.38,ease:"power3.out"} + ,0).to(this.right,{ + x:0,duration:.38,ease:"power3.out"} + ,0).to(this.vs,{ + alpha:1,rotation:0,duration:.3,ease:"back.out(2)"} + ,.3).to(this.vs.scale,{ + x:1.15,y:1.15,duration:.3,ease:"back.out(2)"} + ,.3).to(this.left,{ + x:-340,duration:.3,ease:"power2.in"} + ,1.75).to(this.right,{ + x:340,duration:.3,ease:"power2.in"} + ,1.75).to(this.vs,{ + alpha:0,duration:.2} + ,1.75).to(this.band,{ + alpha:0,duration:.3} + ,1.8).set(this.fight,{ + alpha:1} + ,1.95).to(this.fight.scale,{ + x:1.15,y:1.15,duration:.22,ease:"back.out(2.5)"} + ,1.95).call(()=>{ + qG.getInstance().playSFX(qG.SFX_WAVE_CALL),t()} + ,[],2).to(this.fight.scale,{ + x:1.4,y:1.4,duration:.35,ease:"power1.in"} + ,2.45).to(this.fight,{ + alpha:0,duration:.35,ease:"power1.in"} + ,2.45)} + )} + setSide(i,s,e){ + i.scale.set(1),i.text=e.name,i.scale.set(Math.min(1,t.NAME_MAX_W/Math.max(1,i.width))); + const n=RB.getText("GAME_97","##위").replace("##",String(e.rank)),h=e.rank>0?` · ${ + n} + `:""; + s.text=`Lv.${ + e.level} + ${ + h} + `} + stop(){ + var t,i; + null==(t=this.timeline)||t.kill(),this.timeline=null,this.visible=!1,null==(i=this.parent)||i.removeChild(this)} + } + ; + Qt(p7t,"PvpIntroBanner"),Zt(p7t,"CY",338),Zt(p7t,"PANEL_H",104),Zt(p7t,"PANEL_W",300),Zt(p7t,"SLANT",30),Zt(p7t,"NAME_MAX_W",240),Zt(p7t,"ALLY_COLOR",2060241),Zt(p7t,"ENEMY_COLOR",13185068); + let g7t=p7t; + const w7t=class t{ + constructor(){ + Zt(this,"placements",[]),Zt(this,"objects",[]),Zt(this,"currentSeason",eU.SPRING),Zt(this,"currentRealm",hU.FOREST),Zt(this,"requestedRealm",hU.FOREST),Zt(this,"fireObjects",[]),Zt(this,"hidden",!1)} + static preloadFireLand(){ + return t.fireLoaded?Promise.resolve():(t.fireLoading||(t.fireLoading=Promise.all([kS.getSingleTexture(t.FIRE_GROUND),pF.preload()]).then(()=>{ + t.fireLoaded=!0} + ).catch(i=>{ + throw t.fireLoading=null,i} + )),t.fireLoading)} + static preloadRealm(i){ + return i===hU.DEAD_LAND?t.preloadDeadLand():i===hU.FIRE_LAND?t.preloadFireLand():Promise.resolve()} + static isRealmLoaded(i){ + return i===hU.DEAD_LAND?t.deadBackgroundsLoaded:i!==hU.FIRE_LAND||t.fireLoaded} + static preloadDeadLand(){ + return t.deadBackgroundsLoaded?Promise.resolve():(t.deadLoading||(t.deadLoading=Promise.all(t.DEAD_SEASONS.map(i=>kS.getSingleTexture(`${ + t.DEAD_DIR} + /bg${ + i} + .png`))).then(()=>{ + t.deadBackgroundsLoaded=!0} + ).catch(i=>{ + throw t.deadLoading=null,i} + )),t.deadLoading)} + load(t,i=hU.FOREST){ + this.clear(),this.placements=this.generatePlacements(),this.spawnObjects(),this.applySeason(t,!0,i)} + applySeason(i,s=!1,e=this.requestedRealm){ + if(this.requestedRealm=e,this.currentSeason!==i||this.currentRealm!==e||s)return t.isRealmLoaded(e)?void this.applyLook(i,s,e):(this.applyLook(i,s,hU.FOREST),void t.preloadRealm(e).then(()=>{ + this.requestedRealm===e&&this.applyLook(this.currentSeason,!0,e)} + ).catch(t=>{ + } + ))} + applyLook(i,s,e){ + this.currentSeason=i,this.currentRealm=e,mU.getInstance().setSingleBackground(e===hU.FIRE_LAND?t.FIRE_GROUND:e===hU.DEAD_LAND?`${ + t.DEAD_DIR} + /bg${ + i} + .png`:`images/bg/bg${ + i} + .png`,640,640); + const n=e===hU.FIRE_LAND; + for(let h=0; + h<this.objects.length; + h++){ + const s=this.placements[h]; + this.objects[h].visible=!n&&!this.hidden,n||(e===hU.DEAD_LAND?this.objects[h].texture=this.getDeadTexture(s.type,h,i):this.objects[h].setTexture(t.GAME_SHEET,this.getTextureName(s.type,i)))} + n&&this.ensureFireObjects(); + for(const t of this.fireObjects)t.visible=n&&!this.hidden; + pF.getInstance().setActive(n&&!this.hidden),oF.isNight?this.setNight(s):this.setDay(s)} + getSeason(){ + return this.currentSeason} + getRealm(){ + return this.requestedRealm} + getDeadTexture(i,s,e){ + if(4===i)return kS.getTexture(t.GAME_SHEET,t.DEAD_SMALL[s%t.DEAD_SMALL.length]); + const n=(i+s)%2+1; + return kS.getTexture(t.GAME_SHEET,`deadTree${ + e} + ${ + n} + `)} + getTextureName(t,i){ + return 4===t?`bush${ + i} + `:`tree${ + i} + ${ + t} + `} + spawnObjects(){ + const i=SU.getInstance(),s=this.currentSeason; + for(const e of this.placements){ + const n=this.getTextureName(e.type,s),h=new d0t(t.GAME_SHEET,n); + h.x=e.x,h.y=e.y,h.scale.set(e.scale),e.flipX&&(h.scale.x=-Math.abs(h.scale.x)),this.objects.push(h),i.addChild(h)} + } + ensureFireObjects(){ + if(this.fireObjects.length>0)return; + const i=SU.getInstance(); + for(const[s,e,n]of aF){ + const h=new d0t(t.GAME_SHEET,s); + h.x=e,h.y=n,h.tint=oF.isNight?t.NIGHT_TINT:t.DAY_TINT,this.fireObjects.push(h),i.addChild(h)} + } + generatePlacements(){ + const i=[],s=t.FIELD_SIZE,e=t.EDGE_MARGIN,n=s/2,h=s/2,r=t.SAFE_RADIUS*t.SAFE_RADIUS,o=[2,3],a=Qt(()=>o[Math.floor(2*Math.random())],"randTree"); + for(let t=0; + t<8; + t++){ + const t=Math.random(),n=t<.5?t*t*2:1-(1-t)*(1-t)*2; + i.push({ + type:a(),x:30+n*(s-60),y:20+Math.random()*(e-20),scale:1+.3*Math.random(),flipX:Math.random()>.5} + )} + for(let t=0; + t<8; + t++){ + const t=Math.random(),e=t<.5?t*t*2:1-(1-t)*(1-t)*2; + i.push({ + type:a(),x:30+e*(s-60),y:s-30+50*Math.random(),scale:1+.3*Math.random(),flipX:Math.random()>.5} + )} + for(let t=0; + t<6; + t++){ + const t=60*Math.random()-10,o=Math.random(),c=e+(o<.5?o*o*2:1-(1-o)*(1-o)*2)*(s-2*e); + this.distSq(t,c,n,h)<r||i.push({ + type:a(),x:t,y:c,scale:1+.3*Math.random(),flipX:Math.random()>.5} + )} + for(let t=0; + t<6; + t++){ + const t=s-30+30*Math.random(),o=Math.random(),c=e+(o<.5?o*o*2:1-(1-o)*(1-o)*2)*(s-2*e); + this.distSq(t,c,n,h)<r||i.push({ + type:a(),x:t,y:c,scale:1+.3*Math.random(),flipX:Math.random()>.5} + )} + for(let c=0; + c<4; + c++){ + const e=Math.random()*Math.PI*2,r=t.SAFE_RADIUS+40+Math.random()*(s/2-t.SAFE_RADIUS-20),o=n+r*Math.cos(e),a=h+r*Math.sin(e); + o<10||o>s-10||a<10||a>s-10||i.push({ + type:4,x:o,y:a,scale:1+.4*Math.random(),flipX:Math.random()>.5} + )} + return i} + distSq(t,i,s,e){ + const n=t-s,h=i-e; + return n*n+h*h} + setNight(i=!1){ + const s=t.NIGHT_TINT>>16&255,e=t.NIGHT_TINT>>8&255,n=255&t.NIGHT_TINT; + for(const h of[...this.objects,...this.fireObjects])if(i)h.tint=t.NIGHT_TINT; + else{ + const t="number"==typeof h.tint?h.tint:16777215,i={ + r:t>>16&255,g:t>>8&255,b:255&t} + ; + MR.to(i,{ + r:s,g:e,b:n,duration:2,ease:"power2.inOut",onUpdate:Qt(()=>{ + h.tint=i.r<<16|i.g<<8|i.b} + ,"onUpdate")} + )} + } + setDay(i=!1){ + for(const s of[...this.objects,...this.fireObjects])if(i)s.tint=t.DAY_TINT; + else{ + const t="number"==typeof s.tint?s.tint:16777215,i={ + r:t>>16&255,g:t>>8&255,b:255&t} + ; + MR.to(i,{ + r:255,g:255,b:255,duration:2,ease:"power2.inOut",onUpdate:Qt(()=>{ + s.tint=i.r<<16|i.g<<8|i.b} + ,"onUpdate")} + )} + } + hide(){ + this.hidden=!0; + for(const t of this.objects)t.visible=!1; + for(const t of this.fireObjects)t.visible=!1; + pF.getInstance().setActive(!1)} + show(){ + this.hidden=!1; + const t=this.currentRealm===hU.FIRE_LAND; + for(const i of this.objects)i.visible=!t; + for(const i of this.fireObjects)i.visible=t; + pF.getInstance().setActive(t)} + clear(){ + const t=SU.getInstance(); + for(const i of this.objects)t.removeChild(i); + for(const i of this.fireObjects)t.removeChild(i),i.destroy(); + this.objects.length=0,this.fireObjects.length=0,this.placements.length=0,pF.getInstance().setActive(!1)} + } + ; + Qt(w7t,"BaseMap"),Zt(w7t,"GAME_SHEET","Game"),Zt(w7t,"FIELD_SIZE",640),Zt(w7t,"EDGE_MARGIN",100),Zt(w7t,"SAFE_RADIUS",180),Zt(w7t,"NIGHT_TINT",7373467),Zt(w7t,"DAY_TINT",16777215),Zt(w7t,"DEAD_DIR","images/bg/deadland"),Zt(w7t,"DEAD_SEASONS",[eU.SPRING,eU.SUMMER,eU.AUTUMN,eU.WINTER]),Zt(w7t,"DEAD_SMALL",["grave1","grave2","bones1"]),Zt(w7t,"deadBackgroundsLoaded",!1),Zt(w7t,"deadLoading",null),Zt(w7t,"FIRE_GROUND","images/bg/fireland/ground.png"),Zt(w7t,"fireLoaded",!1),Zt(w7t,"fireLoading",null); + let m7t=w7t; + const v7t=class t{ + constructor(){ + Zt(this,"props",[])} + async show(i){ + this.clear(); + let s=t.THEMES[i]??t.THEMES[1]; + if(s.realm===hU.DEAD_LAND)try{ + await m7t.preloadDeadLand()} + catch(ort){ + s=t.THEMES[1]} + const e=s.realm===hU.DEAD_LAND; + await mU.getInstance().setSingleBackground(e?`${ + t.DEAD_DIR} + /bg${ + s.season} + .png`:`images/bg/bg${ + s.season} + .png`,640,640); + const n=s.phase===eF.NIGHT?t.NIGHT_TINT:16777215,h=SU.getInstance(); + t.SPOTS.forEach((i,e)=>{ + const r=new d0t(t.GAME_SHEET,this.textureName(i.big,e,s)); + r.x=i.x,r.y=i.y,r.scale.set(i.scale),e%2==1&&(r.scale.x=-r.scale.x),r.tint=n,h.addChild(r),this.props.push(r)} + ),EF.getInstance().setFixedPhase(s.phase,s.realm)} + textureName(t,i,s){ + return s.realm===hU.DEAD_LAND?t?`deadTree${ + s.season} + ${ + i%2+1} + `:["grave1","grave2","bones1"][i%3]:t?`tree${ + s.season} + ${ + i%2+2} + `:`bush${ + s.season} + `} + clear(){ + var t; + for(const i of this.props)null==(t=i.parent)||t.removeChild(i),i.destroy(); + this.props.length=0} + } + ; + Qt(v7t,"PvpArena"),Zt(v7t,"GAME_SHEET","Game"),Zt(v7t,"DEAD_DIR","images/bg/deadland"),Zt(v7t,"NIGHT_TINT",7373467),Zt(v7t,"THEMES",{ + 1:{ + season:eU.SPRING,realm:hU.FOREST,phase:eF.DAY} + ,2:{ + season:eU.SUMMER,realm:hU.FOREST,phase:eF.DAY} + ,3:{ + season:eU.AUTUMN,realm:hU.FOREST,phase:eF.DUSK} + ,4:{ + season:eU.WINTER,realm:hU.DEAD_LAND,phase:eF.NIGHT} + } + ),Zt(v7t,"SPOTS",[...[65,200,335,470,605].map((t,i)=>({ + x:t,y:118+i%2*10,scale:1.2,big:!0} + )),...[30,100,165,235,300,370,440,505,575,630].map((t,i)=>({ + x:t,y:160+i%3*9,scale:1+i%3*.1,big:!0} + )),...[20,95,170,240,320,395,465,540,610].map((t,i)=>({ + x:t,y:628+i%2*14,scale:1.05+i%2*.15,big:!0} + )),...[90,255,410,560].map((t,i)=>({ + x:t,y:206+i%2*8,scale:1,big:!1} + )),...[60,215,380,530].map((t,i)=>({ + x:t,y:588+i%2*8,scale:1,big:!1} + ))]); + let _7t=v7t; + const M7t=class t extends M0t{ + constructor(){ + super(),Zt(this,"battleType",v$.PVP2),Zt(this,"PVP_TIME_LIMIT_FRAMES",3600),Zt(this,"pvpStarted",!1),Zt(this,"speedHelper",new y0t("ef2.pvp2.battleSpeed")),Zt(this,"timerText",null),Zt(this,"hpGauge",new f7t),Zt(this,"introBanner",new g7t),Zt(this,"arena",new _7t),Zt(this,"savedView",null),Zt(this,"allyRoster",[]),Zt(this,"enemyRoster",[]),Zt(this,"spawnedVOs",[]),Zt(this,"pvpTeamVOs",[]),Zt(this,"opTransPoints",null),this.unitScale=t.UNIT_SCALE}
FireRealmIntro 6 hunks, 352 statements
- constructor(){ - Xt(this,"placements",[]),Xt(this,"objects",[]),Xt(this,"currentSeason",kB.SPRING),Xt(this,"currentRealm",xB.FOREST),Xt(this,"requestedRealm",xB.FOREST)} - static preloadDeadLand(){ - return t.deadBackgroundsLoaded?Promise.resolve():(t.deadLoading||(t.deadLoading=Promise.all(t.DEAD_SEASONS.map(i=>eS.getSingleTexture(`${ - t.DEAD_DIR} - /bg${ - i} - .png`))).then(()=>{ - t.deadBackgroundsLoaded=!0} - ).catch(i=>{ - throw t.deadLoading=null,i} - )),t.deadLoading)} - load(t,i=xB.FOREST){ - this.clear(),this.placements=this.generatePlacements(),this.spawnObjects(),this.applySeason(t,!0,i)} - applySeason(i,s=!1,e=this.requestedRealm){ - if(this.requestedRealm=e,this.currentSeason!==i||this.currentRealm!==e||s)return e!==xB.DEAD_LAND||t.deadBackgroundsLoaded?void this.applyLook(i,s,e):(this.applyLook(i,s,xB.FOREST),void t.preloadDeadLand().then(()=>{ - this.requestedRealm===xB.DEAD_LAND&&this.applyLook(this.currentSeason,!0,xB.DEAD_LAND)} - ).catch(t=>{ + static isPending(){ + return!t.played&&EG.maxWave<rU&&!t.seenSaved()} + static seenKey(){ + return t.SEEN_LS_PREFIX+EG.userId} + static seenSaved(){ + try{ + return"1"===localStorage.getItem(t.seenKey())} + catch{ + return!1}
- ))} - applyLook(i,s,e){ - this.currentSeason=i,this.currentRealm=e,DB.getInstance().setSingleBackground(e===xB.DEAD_LAND?`${ - t.DEAD_DIR} - /bg${ - i} - .png`:`images/bg/bg${ - i} - .png`,640,640); - for(let n=0; - n<this.objects.length; - n++){ - const s=this.placements[n]; - e===xB.DEAD_LAND?this.objects[n].texture=this.getDeadTexture(s.type,n,i):this.objects[n].setTexture(t.GAME_SHEET,this.getTextureName(s.type,i))} - I0.isNight?this.setNight(s):this.setDay(s)} - getSeason(){ - return this.currentSeason} - getRealm(){ - return this.requestedRealm} - getDeadTexture(i,s,e){ - if(4===i)return eS.getTexture(t.GAME_SHEET,t.DEAD_SMALL[s%t.DEAD_SMALL.length]); - const n=(i+s)%2+1; - return eS.getTexture(t.GAME_SHEET,`deadTree${ - e} - ${ - n} - `)} - getTextureName(t,i){ - return 4===t?`bush${ - i} - `:`tree${ - i} - ${ - t} - `} - spawnObjects(){ - const i=VB.getInstance(),s=this.currentSeason; - for(const e of this.placements){ - const n=this.getTextureName(e.type,s),h=new eZt(t.GAME_SHEET,n); - h.x=e.x,h.y=e.y,h.scale.set(e.scale),e.flipX&&(h.scale.x=-Math.abs(h.scale.x)),this.objects.push(h),i.addChild(h)} + static saveSeen(){ + try{ + localStorage.setItem(t.seenKey(),"1")} + catch{
- setDay(i=!1){ - for(const s of this.objects)if(i)s.tint=t.DAY_TINT; - else{ - const t="number"==typeof s.tint?s.tint:16777215,i={ - r:t>>16&255,g:t>>8&255,b:255&t} - ; - zk.to(i,{ - r:255,g:255,b:255,duration:2,ease:"power2.inOut",onUpdate:qt(()=>{ - s.tint=i.r<<16|i.g<<8|i.b} - ,"onUpdate")} - )} + static get isRunning(){ + return t.running} + static async play(i){ + var s; + if(t.running)return; + t.running=!0,t.played=!0; + let e,n=null; + try{ + await Vdi.load(),await Hdi(()=>i.canShow()&&!xG.getInstance().hasPopup),n=new Vdi,n.open(),e=null==(s=i.hideActors)?void 0:s.call(i),await t.script(n,i),t.saveSeen()} + catch(ort){
- hide(){ - for(const t of this.objects)t.visible=!1} - show(){ - for(const t of this.objects)t.visible=!0} - clear(){ + finally{ + null==e||e(),await(null==n?void 0:n.close()),t.running=!1} + } + static async script(t,i){ + var s; + const e=G8t,n=L8t,h=i.castle,r=Ndi(); + t.shake(),await t.say(n.quake),await t.say(n.awaken),await t.focus(h,"circle",150),t.showLord(h),await t.say(n.lordBoast),t.hideLord(),t.focus(null),t.hideBox(),t.setPausedVisible(!1),await i.transform(),t.setPausedVisible(!0);
- for(const i of this.objects)t.removeChild(i); - this.objects.length=0,this.placements.length=0} + o.popIn(),await t.banner(Uzt(e.realmName),Fzt(e.speedDebuff,Math.max(1,fU(EG.wave)))),await t.say(n.forestBurned),await t.say(n.lordIntro),$di(o)&&(await t.pressBorrowed(o,o.focusTarget,n.tapMark),await Hdi(()=>!xG.getInstance().hasPopup)),await t.focus(h,"circle",70),t.castleGlow(h,Pdi(r)),await t.say(n.castleGlow),await t.say(n.castleReact); + const a=u$.getInstance(); + t.revealBorrowed(a)&&(await t.focus(a,"circle",6),t.showTribeTag(a,r),await t.say(n.tribeIcon),t.clearTags(),t.concealBorrowed(a)),await t.focus(h,"circle",70),t.castleGlow(h,Pdi(r),!0),await new Promise(t=>setTimeout(t,180)),null==(s=i.transformCastle)||s.call(i),t.showCastleTag(h,r),await t.say(n.castleTribe),t.clearTags(),t.focus(null),await t.say(n.fireRule),await t.resume(n.resolve)}
- qt(Zli,"BaseMap"),Xt(Zli,"GAME_SHEET","Game"),Xt(Zli,"FIELD_SIZE",640),Xt(Zli,"EDGE_MARGIN",100),Xt(Zli,"SAFE_RADIUS",180),Xt(Zli,"NIGHT_TINT",7373467),Xt(Zli,"DAY_TINT",16777215),Xt(Zli,"DEAD_DIR","images/bg/deadland"),Xt(Zli,"DEAD_SEASONS",[kB.SPRING,kB.SUMMER,kB.AUTUMN,kB.WINTER]),Xt(Zli,"DEAD_SMALL",["grave1","grave2","bones1"]),Xt(Zli,"deadBackgroundsLoaded",!1),Xt(Zli,"deadLoading",null); + Qt(Udi,"FireRealmIntro"),Zt(Udi,"played",!1),Zt(Udi,"running",!1),Zt(Udi,"SEEN_LS_PREFIX","ef2.fireIntroSeen."),Zt(Udi,"testOnNextWave",!1); + let Fdi=Udi; + function $di(t){ + for(let i=t; + ; + i=i.parent){ + if(!i.visible||i.alpha<=0||i.destroyed)return!1; + if(!i.parent)return i===ES.stage} + } + function Hdi(t){ + return t()?Promise.resolve():new Promise(i=>{ + const s=Qt(()=>{ + t()&&(MR.ticker.remove(s),i())} + ,"check"); + MR.ticker.add(s)} + )} + Qt($di,"isShown"),Qt(Hdi,"waitUntil"); + const Wdi=class t extends Ve{ + constructor(){ + super(),Zt(this,"bar",new Ve),Zt(this,"hud",new Ve),Zt(this,"spot",new Kzt(.6)),Zt(this,"fx",new Ve),Zt(this,"box",new Ve),Zt(this,"boxBg",new tG),Zt(this,"portrait",new Ye),Zt(this,"lblName",new QD("",16768324,sD.DEFAULT_OUTLINE_FONT_OPTION_17)),Zt(this,"lblMessage",new dw({ + text:"",style:{ + ...t.MESSAGE_STYLE,fill:sD.COLOR_WHITE,tagStyles:$zt} + } + )),Zt(this,"lblHint",new QD("",13350539,{ + ...sD.DEFAULT_FONT_OPTION_18,fontSize:14,lineHeight:18} + )),Zt(this,"pausedChip",new Ve),Zt(this,"lblPaused",new QD("",16773848,sD.DEFAULT_OUTLINE_FONT_OPTION_17)),Zt(this,"lord",null),Zt(this,"tags",[]),Zt(this,"hand",null),Zt(this,"hole",null),Zt(this,"hiddenLayers",[]),Zt(this,"borrowed",[]),Zt(this,"yieldToPopups",Qt(()=>{ + const t=xG.getInstance().hasPopup; + this.visible=!t,this.eventMode=t?"none":"static"} + ,"yieldToPopups")),Zt(this,"lastBoxH",0),this.alpha=0,this.eventMode="static",this.hitArea=new Ui(-5e3,-5e3,1e4,1e4),this.spot.alpha=0,this.boxBg.setIndex(7),this.boxBg.alpha=.85,this.box.addChild(this.boxBg,this.portrait,this.lblName,this.lblMessage,this.lblHint),this.box.visible=!1,this.lblHint.text=Uzt(Bzt.tapToContinue)+" ▼",this.lblPaused.text=Uzt(G8t.paused),this.pausedChip.addChild((new ip).roundRect(0,0,this.lblPaused.width+28,this.lblPaused.height+10,14).fill({ + color:0,alpha:.5} + ),this.lblPaused),this.lblPaused.position.set(14,5),this.addChild(this.bar,this.hud,this.spot,this.fx,this.pausedChip,this.box),MR.ticker.add(this.yieldToPopups)} + static async load(){ + await Vzt.load(),t.lordTexture||(t.lordTexture=await kS.getSingleTexture(t.LORD_IMAGE).catch(()=>null))} + get barTop(){ + return ES.SAFE_AREA_TOP+640} + get screenH(){ + return ES.stageHeight||1136} + globalCenterOf(t){ + const i=t.getBounds(); + return this.toLocal(new yi(i.x+i.width/2,i.y+i.height/2))} + open(){ + $ci.getInstance().addChild(this),this.enterCinema(),this.drawBar(),this.pausedChip.x=.5*(640-this.pausedChip.width),this.pausedChip.y=ES.SAFE_AREA_TOP+46,MR.to(this,{ + alpha:1,duration:.25} + )} + close(){ + return MR.ticker.remove(this.yieldToPopups),this.hideHand(),this.exitCinema(),new Promise(t=>{ + MR.to(this,{ + alpha:0,duration:.25,onComplete:Qt(()=>{ + MR.killTweensOf(this.fx.children),this.removeFromParent(),this.destroy({ + children:!0} + ),t()} + ,"onComplete")} + )} + )} + setPausedVisible(t){ + MR.to(this.pausedChip,{ + alpha:t?1:0,duration:.2} + )} + enterCinema(){ + this.borrow($8t.getInstance(),!1),this.borrow(u$.getInstance(),!0); + const t=Qt(t=>{ + t&&(this.hiddenLayers.push({ + target:t,visible:t.visible} + ),t.visible=!1)} + ,"hide"); + t(u7t.getInstance()),t(Pci.getInstance()),t(Yzt.getInstance()),t(Tci.getInstance()),t(b$.getInstance()),t(rci.getInstance()),t(XD.getInstance()),t(GF.getInstance())} + exitCinema(){ + for(const t of this.hiddenLayers.reverse())t.target.visible=t.visible; + this.hiddenLayers=[]; + for(const t of this.borrowed.reverse())t.target.destroyed||t.parent.destroyed||(t.parent.addChildAt(t.target,Math.min(t.index,t.parent.children.length)),t.target.position.set(t.x,t.y),t.target.scale.set(t.sx,t.sy),t.target.eventMode=t.eventMode,t.restoreVisible&&(t.target.visible=t.visible)); + this.borrowed=[]} + borrow(t,i){ + const s=t.parent; + if(!s)return; + const e=s.toGlobal(new yi(0,0)),n=s.toGlobal(new yi(1,1)),h=this.hud.toGlobal(new yi(0,0)),r=this.hud.toGlobal(new yi(1,1)),o=(n.x-e.x)/(r.x-h.x||1),a=(n.y-e.y)/(r.y-h.y||1),c=this.hud.toLocal(s.toGlobal(t.position)); + this.borrowed.push({ + target:t,parent:s,index:s.getChildIndex(t),x:t.x,y:t.y,sx:t.scale.x,sy:t.scale.y,eventMode:t.eventMode??"passive",visible:t.visible,restoreVisible:i} + ),this.hud.addChild(t),t.position.set(c.x,c.y),t.scale.set(t.scale.x*o,t.scale.y*a),t.eventMode="none",i&&(t.visible=!1)} + revealBorrowed(t){ + const i=this.borrowed.find(i=>i.target===t); + return!(!i||!i.visible||(t.visible=!0,t.alpha=0,MR.to(t,{ + alpha:1,duration:.25} + ),0))} + concealBorrowed(t){ + MR.to(t,{ + alpha:0,duration:.2,onComplete:Qt(()=>{ + t.visible=!1,t.alpha=1} + ,"onComplete")} + )} + drawBar(){ + const t=this.barTop,i=Math.max(0,this.screenH-t)+400,s=new ip; + for(let e=0; + e<36; + e+=2)s.rect(0,t-36+e,640,2).fill({ + color:656901,alpha:e/36*.85} + ); + s.rect(0,t,640,i).fill(656901),s.rect(0,t,640,2).fill({ + color:16747066,alpha:.35} + ),this.bar.removeChildren(),this.bar.addChild(s)} + async focus(t,i="rect",s=8){ + if(!t)return this.hole=null,void MR.to(this.spot,{ + alpha:0,duration:.3,onComplete:Qt(()=>this.spot.reset(),"onComplete")} + ); + const e=this.rectOf(t); + this.hole="circle"===i?Kzt.circleHole(e,s):Kzt.rectHole(e,s),MR.to(this.spot,{ + alpha:1,duration:.25} + ),this.spot.focus(this.hole),await new Promise(t=>setTimeout(t,380))} + rectOf(t){ + const i=t.getBounds(),s=this.toLocal(new yi(i.x,i.y)),e=this.toLocal(new yi(i.x+i.width,i.y+i.height)); + return new Ui(s.x,s.y,e.x-s.x,e.y-s.y)} + async say(t){ + this.showBox(t,!0),await this.waitTap()} + static resolve([t,i,s]){ + const e=tYt.getInstance().list.find(i=>i.kindNum===t); + return{ + code:(null==e?void 0:e.code)||i,text:RB.getText(`DIALOGUE_TEXT_${ + t} + `,(null==e?void 0:e.text)||s)} + } + showBox(i,s){ + const{ + code:e,text:n} + =t.resolve(i),h=e.startsWith("FL")?t.lordTexture:kS.getTexture(t.DIALOGUE_SHEET,e); + this.portrait.texture=h??as.EMPTY; + const r=h&&h.height>0?t.PORTRAIT_H/h.height:1; + this.portrait.scale.set(r),this.lblName.text=t.nameOf(e),this.lblMessage.text=Hzt(n,t.MESSAGE_STYLE,t.MESSAGE_W),this.lblHint.visible=s; + const o=t.BOX_W,a=s?this.lblHint.height:0,c=this.lblMessage.height+16+16+a; + this.boxBg.width=o,this.boxBg.height=c,this.portrait.position.set(8,-this.portrait.height),this.lblName.position.set(this.portrait.x+this.portrait.width-6,-this.lblName.height-4),this.lblMessage.x=.5*(o-this.lblMessage.width),this.lblMessage.y=.5*(c-a-this.lblMessage.height),this.lblHint.position.set(o-8-4-this.lblHint.width,c-8-this.lblHint.height+2),this.box.x=.5*(640-o),this.box.y=this.boxY(c),this.lastBoxH=c,this.box.visible||(this.box.visible=!0,this.box.alpha=0),MR.to(this.box,{ + alpha:1,duration:.18} + )} + boxY(i){ + const s=this.barTop+t.PORTRAIT_H+16; + return Math.min(s,this.screenH-i-90)} + hideBox(){ + MR.to(this.box,{ + alpha:0,duration:.15,onComplete:Qt(()=>{ + this.box.visible=!1} + ,"onComplete")} + )} + static nameOf(t){ + return t.startsWith("FL")?Uzt(D8t):t.startsWith("S")?RB.getText("DIALOGUE_NPC_S","정령"):RB.getText("DIALOGUE_NPC_L","성주")} + waitTap(){ + this.hitArea=new Ui(-5e3,-5e3,1e4,1e4); + const i=performance.now(); + return new Promise(s=>{ + const e=Qt(()=>{ + performance.now()-i<t.TAP_DELAY_MS||(this.off("pointertap",e),s())} + ,"onTap"); + this.on("pointertap",e)} + )} + async pressBorrowed(t,i,s){ + await this.focus(i,"circle",10),this.showBox(s,!1); + const e=this.rectOf(i); + this.pointAt(e.x+e.width/2,e.y+e.height/2),t.eventMode="static",await Hdi(()=>xG.getInstance().hasPopup),t.eventMode="none",this.hideHand()} + pointAt(i,s){ + if(!this.ensureHand()||!this.hand)return; + const e=this.hand,n=e.texture.orig,h=(t.HAND_TIP.x-e.anchor.x*n.width)*e.scale.x,r=(t.HAND_TIP.y-e.anchor.y*n.height)*e.scale.y; + e.position.set(i-h,s-r),this.addChild(e),e.play()} + ensureHand(){ + if(this.hand)return!0; + try{ + const t=kS.getTextures("ClickHand","ClickHand"); + return!(!t||0===t.length||(this.hand=new fp(t),this.hand.animationSpeed=.65,this.hand.eventMode="none",0))} + catch{ + return!1} + } + hideHand(){ + this.hand&&(this.hand.stop(),this.hand.removeFromParent())} + async resume(t){ + this.showBox(t,!1),this.hitArea=new Ui(-5e3,-5e3,1e4,1e4); + const i=new Bdi(Uzt(G8t.resume),220); + i.x=.5*(640-i.width),i.y=Math.min(this.box.y+this.lastBoxH+24,this.screenH-i.height-24),this.addChildAt(i,this.getChildIndex(this.box)+1),this.pointAt(i.x+.62*i.width,i.y+.5*i.height),await new Promise(t=>{ + i.onClick=()=>{ + i.onClick=void 0,t()} + } + ),this.hideHand()} + shake(){ + const t=EF.getInstance(),i=t.x,s=t.y; + MR.to(t,{ + duration:.06,repeat:9,yoyo:!0,x:i+4,y:s-2,ease:"sine.inOut",onComplete:Qt(()=>{ + t.position.set(i,s)} + ,"onComplete")} + )} + showLord(i){ + const s=t.lordTexture; + if(!s)return; + const e=this.hole?new yi(this.hole.x+this.hole.w/2,this.hole.y+this.hole.h/2):this.globalCenterOf(i),n=new Ve,h=(new ip).circle(0,0,120).fill({ + color:16742944,alpha:.35} + ); + h.blendMode="add"; + const r=new Ye(s); + r.anchor.set(.5,.5),r.scale.set(250/s.height),n.addChild(h,r),n.position.set(e.x,e.y),n.alpha=0,n.scale.set(.8),this.fx.addChild(n),this.lord=n,MR.to(n,{ + alpha:1,duration:.45,ease:"power2.out"} + ),MR.to(n.scale,{ + x:1,y:1,duration:.6,ease:"back.out(1.8)"} + ),MR.to(h.scale,{ + x:1.12,y:1.12,duration:.5,yoyo:!0,repeat:-1,ease:"sine.inOut"} + )} + hideLord(){ + const t=this.lord; + t&&(this.lord=null,MR.to(t.scale,{ + x:1.25,y:1.25,duration:.35,ease:"power2.in"} + ),MR.to(t,{ + alpha:0,duration:.35,ease:"power2.in",onComplete:Qt(()=>{ + MR.killTweensOf(t.children.map(t=>t.scale)),t.destroy({ + children:!0} + )} + ,"onComplete")} + ))} + banner(t,i){ + const s=new Ve,e=new QD(t,16757575,sD.DEFAULT_OUTLINE_FONT_OPTION_32),n=new QD(i,16773336,sD.DEFAULT_OUTLINE_FONT_OPTION_24); + return e.x=.5*-e.width,n.position.set(.5*-n.width,e.height+4),s.addChild(e,n),s.position.set(320,ES.SAFE_AREA_TOP+250),s.alpha=0,this.fx.addChild(s),new Promise(t=>{ + MR.timeline({ + onComplete:Qt(()=>{ + s.destroy({ + children:!0} + ),t()} + ,"onComplete")} + ).to(s,{ + alpha:1,duration:.35} + ).fromTo(s.scale,{ + x:1.2,y:1.2} + ,{ + x:1,y:1,duration:.35,ease:"back.out(2)"} + ,"<").to(s,{ + alpha:0,duration:.45} + ,"+=1.6")} + )} + castleGlow(i,s,e=!1){ + const n=this.globalCenterOf(i),h=1.9*i.getBounds().height,r=new Ye(t.glowTexture()); + if(r.anchor.set(.5),r.tint=s,r.blendMode="add",r.position.set(n.x,n.y+6),r.width=r.height=h,r.alpha=0,this.fx.addChild(r),MR.to(r,{ + alpha:.85,duration:.35} + ),MR.to(r.scale,{ + x:1.12*r.scale.x,y:1.12*r.scale.y,duration:.6,yoyo:!0,repeat:5,ease:"sine.inOut"} + ),MR.to(r,{ + alpha:0,duration:.6,delay:3.4,onComplete:Qt(()=>r.destroy(),"onComplete")} + ),!e)return; + const o=(new ip).circle(0,0,40).stroke({ + color:s,width:6,alpha:.9} + ); + o.blendMode="add",o.position.set(n.x,n.y+6),this.fx.addChild(o),MR.to(o.scale,{ + x:3,y:3,duration:.9,ease:"power2.out"} + ),MR.to(o,{ + alpha:0,duration:.9,ease:"power2.in",onComplete:Qt(()=>o.destroy(),"onComplete")} + )} + static glowTexture(){ + if(t.glow)return t.glow; + const i=document.createElement("canvas"); + i.width=i.height=128; + const s=i.getContext("2d"),e=s.createRadialGradient(64,64,0,64,64,64); + return e.addColorStop(0,"rgba(255,255,255,0.75)"),e.addColorStop(.45,"rgba(255,255,255,0.35)"),e.addColorStop(1,"rgba(255,255,255,0)"),s.fillStyle=e,s.fillRect(0,0,128,128),t.glow=as.from(i),t.glow} + showTribeTag(t,i){ + const s=this.rectOf(t),e=new Ve,n=new QD(Uzt(G8t.currentTribe),16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_17),h=new QD(xdi(i),Pdi(i),sD.DEFAULT_OUTLINE_FONT_OPTION_32); + h.y=n.height,e.addChild(n,h),e.position.set(s.x+s.width+18,s.y+.5*(s.height-e.height)),this.addTag(e)} + showCastleTag(t,i){ + const s=this.rectOf(t),e=Fzt(G8t.castleLabel,xdi(i)),n=new QD(e,Pdi(i),sD.DEFAULT_OUTLINE_FONT_OPTION_24); + n.position.set(s.x+.5*s.width-.5*n.width,s.y+s.height+14),this.addTag(n)} + addTag(t){ + t.alpha=0,this.fx.addChild(t),this.tags.push(t),MR.to(t,{ + alpha:1,duration:.3} + )} + clearTags(){ + for(const t of this.tags)MR.to(t,{ + alpha:0,duration:.2,onComplete:Qt(()=>t.destroy({ + children:!0} + ),"onComplete")} + ); + this.tags=[]} + } + ; + Qt(Wdi,"IntroOverlay"),Zt(Wdi,"TAP_DELAY_MS",350),Zt(Wdi,"DIALOGUE_SHEET","Dialogue"),Zt(Wdi,"LORD_IMAGE","images/dialogue/FL_SNE.png"),Zt(Wdi,"BOX_W",520),Zt(Wdi,"PORTRAIT_H",125),Zt(Wdi,"MESSAGE_STYLE",sD.DEFAULT_FONT_OPTION_18),Zt(Wdi,"HAND_TIP",{ + x:29,y:41} + ),Zt(Wdi,"MESSAGE_W",480),Zt(Wdi,"lordTexture",null),Zt(Wdi,"glow",null);
BlurFilter 1 hunks, 271 statements
- \n",nf="\nin vec2 vTextureCoord; + \n"; + const of={ + 5:[.153388,.221461,.250301],7:[.071303,.131514,.189879,.214607],9:[.028532,.067234,.124009,.179044,.20236],11:[.0093,.028002,.065984,.121703,.175713,.198596],13:[.002406,.009255,.027867,.065666,.121117,.174868,.197641],15:[489e-6,.002403,.009246,.02784,.065602,.120999,.174697,.197448]} + ,af=["in vec2 vBlurTexCoords[%size%]; + ","uniform sampler2D uTexture; + ","out vec4 finalColor; + ","void main(void)","{ + "," %blur%","} + "].join("\n"); + function cf(t){ + const i=of[t],s=i.length; + let e=""; + for(let n=0; + n<t; + n++){ + const h=n<s?n:t-n-1; + e+=`${ + 0===n?"finalColor = ":" + "} + ${ + "texture(uTexture, vBlurTexCoords[%index%]) * %value%".replace("%index%",n.toString()).replace("%value%",i[h].toString())} + \n`} + return af.replace("%blur%",`${ + e} + ; + `).replace("%size%",t.toString())} + function lf(t,i){ + const s=Math.ceil(t/2); + let e,n="\n in vec2 aPosition; + \n\n uniform float uStrength; + \n\n out vec2 vBlurTexCoords[%size%]; + \n\n uniform vec4 uInputSize; + \n uniform vec4 uOutputFrame; + \n uniform vec4 uOutputTexture; + \n\n vec4 filterVertexPosition( void )\n{ + \n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy; + \n\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0; + \n position.y = position.y * (2.0*uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z; + \n\n return vec4(position, 0.0, 1.0); + \n} + \n\n vec2 filterTextureCoord( void )\n { + \n return aPosition * (uOutputFrame.zw * uInputSize.zw); + \n } + \n\n void main(void)\n { + \n gl_Position = filterVertexPosition(); + \n\n float pixelStrength = uInputSize.%dimension% * uStrength; + \n\n vec2 textureCoord = filterTextureCoord(); + \n %blur%\n } + ",h=""; + e=i?"vBlurTexCoords[%index%] = textureCoord + vec2(%sampleIndex% * pixelStrength, 0.0); + ":"vBlurTexCoords[%index%] = textureCoord + vec2(0.0, %sampleIndex% * pixelStrength); + "; + for(let r=0; + r<t; + r++){ + let t=e.replace("%index%",r.toString()); + t=t.replace("%sampleIndex%",r-(s-1)+".0"),h+=t,h+="\n"} + return n=n.replace("%blur%",h),n=n.replace("%size%",t.toString()),n=n.replace("%dimension%",i?"z":"w"),n} + function uf(t,i){ + const s=lf(i,t),e=cf(i); + return Gh.from({ + vertex:s,fragment:e,name:`blur-${ + t?"horizontal":"vertical"} + -pass-filter`} + )} + Qt(cf,"generateBlurFragSource"),Qt(lf,"generateBlurVertSource"),Qt(uf,"generateBlurGlProgram"); + var df="\n\nstruct GlobalFilterUniforms { + \n uInputSize:vec4<f32>,\n uInputPixel:vec4<f32>,\n uInputClamp:vec4<f32>,\n uOutputFrame:vec4<f32>,\n uGlobalFrame:vec4<f32>,\n uOutputTexture:vec4<f32>,\n} + ; + \n\nstruct BlurUniforms { + \n uStrength:f32,\n} + ; + \n\n@group(0) @binding(0) var<uniform> gfu: GlobalFilterUniforms; + \n@group(0) @binding(1) var uTexture: texture_2d<f32>; + \n@group(0) @binding(2) var uSampler : sampler; + \n\n@group(1) @binding(0) var<uniform> blurUniforms : BlurUniforms; + \n\n\nstruct VSOutput { + \n @builtin(position) position: vec4<f32>,\n %blur-struct%\n } + ; + \n\nfn filterVertexPosition(aPosition:vec2<f32>) -> vec4<f32>\n{ + \n var position = aPosition * gfu.uOutputFrame.zw + gfu.uOutputFrame.xy; + \n\n position.x = position.x * (2.0 / gfu.uOutputTexture.x) - 1.0; + \n position.y = position.y * (2.0*gfu.uOutputTexture.z / gfu.uOutputTexture.y) - gfu.uOutputTexture.z; + \n\n return vec4(position, 0.0, 1.0); + \n} + \n\nfn filterTextureCoord( aPosition:vec2<f32> ) -> vec2<f32>\n{ + \n return aPosition * (gfu.uOutputFrame.zw * gfu.uInputSize.zw); + \n} + \n\nfn globalTextureCoord( aPosition:vec2<f32> ) -> vec2<f32>\n{ + \n return (aPosition.xy / gfu.uGlobalFrame.zw) + (gfu.uGlobalFrame.xy / gfu.uGlobalFrame.zw); + \n} + \n\nfn getSize() -> vec2<f32>\n{ + \n return gfu.uGlobalFrame.zw; + \n} + \n\n\n@vertex\nfn mainVertex(\n @location(0) aPosition : vec2<f32>,\n) -> VSOutput { + \n\n let filteredCord = filterTextureCoord(aPosition); + \n\n let pixelStrength = gfu.uInputSize.%dimension% * blurUniforms.uStrength; + \n\n return VSOutput(\n filterVertexPosition(aPosition),\n %blur-vertex-out%\n ); + \n} + \n\n@fragment\nfn mainFragment(\n @builtin(position) position: vec4<f32>,\n %blur-fragment-in%\n) -> @location(0) vec4<f32> { + \n\n var finalColor = vec4(0.0); + \n\n %blur-sampling%\n\n return finalColor; + \n} + \n"; + function ff(t,i){ + const s=of[i],e=s.length,n=[],h=[],r=[]; + for(let u=0; + u<i; + u++){ + n[u]=`@location(${ + u} + ) offset${ + u} + : vec2<f32>,`,h[u]=t?`filteredCord + vec2(${ + u-e+1} + * pixelStrength, 0.0),`:`filteredCord + vec2(0.0, ${ + u-e+1} + * pixelStrength),`; + const o=s[u<e?u:i-u-1].toString(); + r[u]=`finalColor += textureSample(uTexture, uSampler, offset${ + u} + ) * ${ + o} + ; + `} + const o=n.join("\n"),a=h.join("\n"),c=r.join("\n"),l=df.replace("%blur-struct%",o).replace("%blur-vertex-out%",a).replace("%blur-fragment-in%",o).replace("%blur-sampling%",c).replace("%dimension%",t?"z":"w"); + return Qh.from({ + vertex:{ + source:l,entryPoint:"mainVertex"} + ,fragment:{ + source:l,entryPoint:"mainFragment"} + } + )} + Qt(ff,"generateBlurProgram"); + const pf=(Qt(T=class extends fr{ + constructor(t){ + super({ + glProgram:uf((t={ + ...T.defaultOptions,...t} + ).horizontal,t.kernelSize),gpuProgram:ff(t.horizontal,t.kernelSize),resources:{ + blurUniforms:{ + uStrength:{ + value:0,type:"f32"} + } + } + ,...t} + ),this.horizontal=t.horizontal,this.legacy=t.legacy??!1,this._quality=0,this.quality=t.quality,this.blur=t.strength,this._blurUniforms=this.resources.blurUniforms,this._uniforms=this._blurUniforms.uniforms} + apply(t,i,s,e){ + this.legacy?this._applyLegacy(t,i,s,e):this._applyOptimized(t,i,s,e)} + _applyLegacy(t,i,s,e){ + if(this._uniforms.uStrength=this.strength/this.passes,1===this.passes)t.applyFilter(this,i,s,e); + else{ + const n=De.getSameSizeTexture(i); + let h=i,r=n; + this._state.blend=!1; + const o=t.renderer.type===rr.WEBGPU; + for(let i=0; + i<this.passes-1; + i++){ + t.applyFilter(this,h,r,0===i||o); + const s=r; + r=h,h=s} + this._state.blend=!0,t.applyFilter(this,h,s,e),De.returnTexture(n)} + } + _applyOptimized(t,i,s,e){ + if(this._uniforms.uStrength=this._calculateInitialStrength(),1===this.passes)t.applyFilter(this,i,s,e); + else{ + const n=De.getSameSizeTexture(i); + let h=i,r=n; + this._state.blend=!1; + const o=t.renderer,a=o.type===rr.WEBGPU,c=a?o.renderPipes.uniformBatch:null; + for(let i=0; + i<this.passes-1; + i++){ + c&&this.groups[1].setResource(c.getUboResource(this._blurUniforms),0),t.applyFilter(this,h,r,a); + const i=r; + r=h,h=i,this._uniforms.uStrength*=.5} + c&&this.groups[1].setResource(c.getUboResource(this._blurUniforms),0),this._state.blend=!0,t.applyFilter(this,h,s,e),De.returnTexture(n)} + } + _calculateInitialStrength(){ + let t=1,i=.5; + for(let s=1; + s<this.passes; + s++)t+=i*i,i*=.5; + return this.strength/Math.sqrt(t)} + get blur(){ + return this.strength} + set blur(t){ + this.padding=1+2*Math.abs(t),this.strength=t} + get quality(){ + return this._quality} + set quality(t){ + this._quality=t,this.passes=t} + } + ,"_BlurFilterPass"),T); + pf.defaultOptions={ + strength:8,quality:4,kernelSize:5,legacy:!1} + ; + let gf=pf; + const wf=class extends fr{ + constructor(...t){ + let i=t[0]??{ + } + ; + "number"==typeof i&&(Ki(Wi,"BlurFilter constructor params are now options object. See params: { + strength, quality, resolution, kernelSize } + "),i={ + strength:i} + ,void 0!==t[1]&&(i.quality=t[1]),void 0!==t[2]&&(i.resolution=t[2]||"inherit"),void 0!==t[3]&&(i.kernelSize=t[3])),i={ + ...gf.defaultOptions,...i} + ; + const{ + strength:s,strengthX:e,strengthY:n,quality:h,...r} + =i; + super({ + ...r,compatibleRenderers:rr.BOTH,resources:{ + } + } + ),this._repeatEdgePixels=!1,this.blurXFilter=new gf({ + horizontal:!0,...i} + ),this.blurYFilter=new gf({ + horizontal:!1,...i} + ),this.quality=h,this.strengthX=e??s,this.strengthY=n??s,this.repeatEdgePixels=!1} + apply(t,i,s,e){ + const n=Math.abs(this.blurXFilter.strength),h=Math.abs(this.blurYFilter.strength); + if(n&&h){ + const n=De.getSameSizeTexture(i); + this.blurXFilter.blendMode="normal",this.blurXFilter.apply(t,i,n,!0),this.blurYFilter.blendMode=this.blendMode,this.blurYFilter.apply(t,n,s,e),De.returnTexture(n)} + else h?(this.blurYFilter.blendMode=this.blendMode,this.blurYFilter.apply(t,i,s,e)):(this.blurXFilter.blendMode=this.blendMode,this.blurXFilter.apply(t,i,s,e))} + updatePadding(){ + this._repeatEdgePixels?this.padding=0:this.padding=2*Math.max(Math.abs(this.blurXFilter.blur),Math.abs(this.blurYFilter.blur))} + get strength(){ + if(this.strengthX!==this.strengthY)throw new Error("BlurFilter's strengthX and strengthY are different"); + return this.strengthX} + set strength(t){ + this.blurXFilter.blur=this.blurYFilter.blur=t,this.updatePadding()} + get quality(){ + return this.blurXFilter.quality} + set quality(t){ + this.blurXFilter.quality=this.blurYFilter.quality=t} + get strengthX(){ + return this.blurXFilter.blur} + set strengthX(t){ + this.blurXFilter.blur=t,this.updatePadding()} + get strengthY(){ + return this.blurYFilter.blur} + set strengthY(t){ + this.blurYFilter.blur=t,this.updatePadding()} + get blur(){ + return Ki("8.3.0","BlurFilter.blur is deprecated, please use BlurFilter.strength instead."),this.strength} + set blur(t){ + Ki("8.3.0","BlurFilter.blur is deprecated, please use BlurFilter.strength instead."),this.strength=t} + get blurX(){ + return Ki("8.3.0","BlurFilter.blurX is deprecated, please use BlurFilter.strengthX instead."),this.strengthX} + set blurX(t){ + Ki("8.3.0","BlurFilter.blurX is deprecated, please use BlurFilter.strengthX instead."),this.strengthX=t} + get blurY(){ + return Ki("8.3.0","BlurFilter.blurY is deprecated, please use BlurFilter.strengthY instead."),this.strengthY} + set blurY(t){ + Ki("8.3.0","BlurFilter.blurY is deprecated, please use BlurFilter.strengthY instead."),this.strengthY=t} + get repeatEdgePixels(){ + return this._repeatEdgePixels} + set repeatEdgePixels(t){ + this._repeatEdgePixels=t,this.updatePadding()} + } + ; + Qt(wf,"BlurFilter"); + let mf=wf; + mf.defaultOptions={ + strength:8,quality:4,kernelSize:5,legacy:!1} + ; + var vf="\nin vec2 vTextureCoord;
EventScheduleDayCell 1 hunks, 242 statements
+ super(),Zt(this,"bg"),Zt(this,"bgOn"),Zt(this,"lineL"),Zt(this,"lineR"),this.bg=new eE({ + texture:kS.getTexture("UI_Ekkorr","UI_Toast_Bg"),leftWidth:6,topHeight:6,rightWidth:6,bottomHeight:6} + ),this.bg.width=77,this.bg.height=65,this.addChild(this.bg),this.bgOn=new eE({ + texture:kS.getTexture("UI_Ekkorr","whiteRect"),leftWidth:6,topHeight:6,rightWidth:6,bottomHeight:6} + ),this.bgOn.visible=!1,this.bgOn.tint=4075559,this.bgOn.x=1,this.bgOn.width=this.bg.width-2,this.bgOn.height=this.bg.height,this.addChild(this.bgOn),this.lineL=new Ye(kS.getTexture("UI_Ekkorr","whiteRect")),this.lineL.tint=3814965,this.lineL.width=1,this.lineL.height=55,this.lineL.y=10,this.addChild(this.lineL),this.lineR=new Ye(kS.getTexture("UI_Ekkorr","whiteRect")),this.lineR.visible=!1,this.lineR.tint=3814965,this.lineR.width=1,this.lineR.height=this.lineL.height,this.lineR.x=this.bg.width,this.lineR.y=this.lineL.y,this.addChild(this.lineR)} + get width(){ + return this.bg.width} + get height(){ + return this.bg.height} + showRightLine(){ + this.lineR.visible=!0} + hideRightLine(){ + this.lineR.visible=!1} + setHeaderLayout(){ + this.bg.height=65,this.bgOn.height=this.bg.height+200,this.lineL.y=10,this.lineL.height=255,this.lineR.y=this.lineL.y,this.lineR.height=this.lineL.height} + setItemRenderLayout(){ + this.bg.height=77,this.bgOn.height=this.bg.height,this.lineL.y=0,this.lineL.height=this.bg.height,this.lineR.y=this.lineL.y,this.lineR.height=this.lineL.height} + setToday(t){ + this.bgOn.visible=t} + } + ; + Qt(Cii,"EventScheduleDayCell"); + let Oii=Cii; + const Iii=class extends Ve{ + constructor(){ + super(),Zt(this,"dayTxts"),Zt(this,"dayLbls"),Zt(this,"dayBgs"),this.dayBgs=[],this.dayTxts=[],this.dayLbls=[]; + const t=sD.DEFAULT_FONT_OPTION_17; + t.fill=13413260; + const i=sD.DEFAULT_FONT_OPTION_15; + let s,e,n; + i.fill=14988422; + for(let h=0; + h<7; + ++h)n=new Oii,n.setHeaderLayout(),n.x=h*n.width,this.addChild(n),this.dayBgs.push(n),s=new QD("월",t.fill,t),s.x=n.x+.5*(n.width-s.width)+1,s.y=8,this.addChild(s),this.dayTxts.push(s),e=new QD("00.00",i.fill,i),e.x=n.x+.5*(n.width-e.width)+1,e.y=s.y+s.height-1,this.addChild(e),this.dayLbls.push(e); + this.dayBgs[this.dayBgs.length-1].showRightLine()} + get height(){ + return this.dayBgs[0].height} + setData(){ + const t=new Date(DR.time),i=t.getUTCDay(),s=RB.getText("COMMON_576","Sun|Mon|Tue|Wed|Thu|Fri|Sat").split("|"); + let e,n,h,r; + t.setUTCDate(t.getUTCDate()-2); + const o=this.dayBgs.length; + for(let a=0; + a<o; + ++a)e=t.getUTCDay(),r=this.dayBgs[a],e===i?r.setToday(!0):r.setToday(!1),n=this.dayTxts[a],n.text=s[e],n.x=r.x+.5*(r.width-n.width)+1,h=this.dayLbls[a],h.text=i$.displayDate2(t,!0,"."),h.x=r.x+.5*(r.width-h.width)+1,t.setUTCDate(t.getUTCDate()+1)} + } + ; + Qt(Iii,"EventScheduleHeader"); + let kii=Iii; + const Rii=class t extends uB{ + constructor(){ + super(),Zt(this,"lblName"),Zt(this,"lblMessage"),Zt(this,"btnMove"),Zt(this,"btnConfirm"),Zt(this,"data"),this.width=540,this.outSideClickHide=!0,this.btnClose.removeFromParent(); + const t=sD.DEFAULT_FONT_OPTION_18; + t.fill=13413260; + const i=sD.DEFAULT_FONT_OPTION_17; + i.fill=16777215,this.lblName=new QD("AAA",t.fill,t),this.addChild(this.lblName),sD.setLabelWrapWidth(this.lblName,this.width-80),this.lblMessage=new QD("00.00 ~ 00.00",i.fill,i),this.addChild(this.lblMessage),sD.setLabelWrapWidth(this.lblMessage,this.width-80),this.btnMove=new hB(RB.getText("COMMON_64","바로가기")),this.btnMove.visible=!1,this.addChild(this.btnMove),this.btnMove.onClick=this.onMoveBtnClick.bind(this),this.btnConfirm=new sKt(RB.getText("COMMON_1","확인")),this.btnConfirm.visible=!1,this.addChild(this.btnConfirm),this.btnConfirm.onClick=()=>{ + this.hide()} + ,this.updateLayout()} + static getInstance(){ + return null==this.instance&&(this.instance=new t),this.instance} + updateLayout(){ + this.lblName.x=.5*(this.width-this.lblName.width),this.lblName.y=90,this.lblMessage.x=.5*(this.width-this.lblMessage.width),this.lblMessage.y=this.lblName.y+this.lblName.height+10; + let t=this.lblName.y+this.lblName.height+30; + this.lblMessage.visible&&(t=this.lblMessage.y+this.lblMessage.height+30),this.btnMove.x=.5*(this.width-this.btnMove.width),this.btnMove.y=t,this.btnConfirm.x=.5*(this.width-this.btnConfirm.width),this.btnConfirm.y=this.btnMove.y,this.height=this.btnConfirm.y+this.btnConfirm.height+50} + setData(t){ + this.data=t; + const i=this.data; + if(!i)return; + this.title=RB.getText("COMMON_4","알림"),this.lblName.text=i.displayName; + const s=new Date(DR.time); + s.setUTCHours(0,0,0,0); + let e=!1; + if(i.startTime&&i.endTime){ + this.lblMessage.visible=!0; + const t=new Date(i.startTime),n=new Date(i.endTime); + t.getUTCMonth()===n.getUTCMonth()&&t.getUTCDate()===n.getUTCDate()?this.lblMessage.text=i$.displayDate2(t,!0,"."):this.lblMessage.text=i$.displayDate2(t,!0,".")+" ~ "+i$.displayDate2(n,!0,"."),(s.getTime()>=t.getTime()||J4t(s,t))&&(s.getTime()<n.getTime()||J4t(s,n))&&(e=!0)} + else{ + const t=JSON.parse(i.action); + if("day"in t){ + this.lblMessage.visible=!0; + const i=new Date(DR.time); + i.setUTCHours(0,0,0,0),i.setUTCDate(i.getUTCDate()-2); + const n=q4t(t.day.toUpperCase()); + for(let t=0; + t<7&&i.getUTCDay()!==n; + ++t)i.setUTCDate(i.getUTCDate()+1); + this.lblMessage.text=i$.displayDate2(i,!0,"."),J4t(i,s)&&(e=!0)} + else this.lblMessage.visible=!1} + "LOGIN"!==i.type&&"MEDAL"!==i.type&&"GEM_SPEND"!==i.type||(e=!1),e?(this.btnMove.visible=!0,this.btnConfirm.visible=!1):(this.btnMove.visible=!1,this.btnConfirm.visible=!0),this.updateLayout()} + async onMoveBtnClick(){ + if(!this.data)return; + if(this.hideImmediately(),"PAYMENT"===this.data.type&&EG.maxWave<10&&EG.wave<10)return void vH.getInstance().showMessage(RB.getValueReplace("GAME_34","##",10,"10 wave 이상에서 개방됩니다.")); + let t=-1; + switch(this.data.type){ + case"TOWER":t=50; + break; + case"MINE":t=200; + break; + case"PET_ASSISTANT":t=Zci.UNLOCK_MAX_WAVE} + if(-1!==t&&EG.maxWave<t){ + const i=RB.getValueReplace("GAME_633","##",t,`최고 WAVE ${ + t} + 이상에서 환생 후 이용가능합니다.`); + return void vH.getInstance().showMessage(i)} + const{ + EventSchedulePopup:i} + =await ei(async()=>{ + const{ + EventSchedulePopup:t} + =await Promise.resolve().then(()=>Uii); + return{ + EventSchedulePopup:t} + } + ,void 0); + switch(i.getInstance().hideImmediately(),this.data.type){ + case"PAYMENT":x4t.getInstance().goPaymentShop(0); + break; + case"TOWER":x4t.getInstance().goTower(); + break; + case"HERORESET":x4t.getInstance().goHeroHire(); + break; + case"PET_ASSISTANT":x4t.getInstance().goSecretaryGuide(); + break; + case"MINE":x4t.getInstance().goMine(); + break; + case"MINI_ASCENT":x4t.getInstance().goAscent(); + break; + case"EVENT_ATTEND":x4t.getInstance().goAttendEvent(); + break; + case"GUILDWAR_TOURNAMENT":x4t.getInstance().goGuildWarTournament()} + } + onBackButton(){ + return this.hide(),!0} + } + ; + Qt(Rii,"EventScheduleDetailPopup"),Zt(Rii,"instance"); + let xii=Rii; + const Pii=class extends Ve{ + constructor(){ + super(),Zt(this,"bg"),Zt(this,"icon"),Zt(this,"lblName"),Zt(this,"lblDate"),Zt(this,"container"),Zt(this,"minWidth",77),Zt(this,"data"),this.bg=new eE({ + texture:kS.getTexture("UI_Ekkorr","Popup_Bg_03"),leftWidth:30,topHeight:30,rightWidth:30,bottomHeight:30} + ),this.bg.width=77,this.addChild(this.bg),this.icon=new Ye(kS.getTexture("UI_Ekkorr","Icon_Event_Schedule")),this.icon.x=5,this.icon.y=.5*(this.bg.height-this.icon.height),this.addChild(this.icon),this.container=new Ve,this.addChild(this.container); + const t=sD.DEFAULT_FONT_OPTION_16; + t.fill=15060399,t.lineHeight=0; + const i=sD.DEFAULT_FONT_OPTION_15; + i.fill=16750899,i.fontSize=14,this.lblName=new QD("이벤트",t.fill,t),this.container.addChild(this.lblName),this.lblDate=new QD("00.00~00.00",i.fill,i),this.container.addChild(this.lblDate),this.updateLayout()} + updateLayout(){ + if(this.icon.visible){ + const t=this.icon.x+this.icon.width; + sD.setLabelWrapWidth(this.lblName,this.bg.width-t),this.container.x=t} + else sD.setLabelWrapWidth(this.lblName,this.bg.width),this.container.x=.5*(this.bg.width-this.container.width); + this.lblDate.visible&&(this.lblDate.y=this.lblName.y+this.lblName.height); + let t=.5*(this.bg.height-this.container.height); + t<0&&(t=0),this.container.y=t} + get width(){ + return this.bg.width} + set width(t){ + t<this.minWidth&&(t=this.minWidth),this.bg.width=t,t>this.minWidth?this.icon.visible=!0:this.icon.visible=!1,this.updateLayout()} + get height(){ + return this.bg.height} + setData(t){ + this.data=t; + const i=t; + if(this.lblName.text=i.displayName,i.startTime&&i.endTime){ + this.lblDate.visible=!0; + const t=new Date(i.startTime),s=new Date(i.endTime); + t.getUTCMonth()===s.getUTCMonth()&&t.getUTCDate()===s.getUTCDate()?this.lblDate.text=i$.displayDate2(t,!0,"."):this.lblDate.text=i$.displayDate2(t,!0,".")+"~"+i$.displayDate2(s,!0,".")} + else this.lblDate.visible=!1; + this.updateLayout()} + getData(){ + return this.data} + } + ; + Qt(Pii,"EventScheduleLabel"); + let Nii=Pii; + const Lii=class extends OR{ + constructor(){ + let t; + super(),Zt(this,"dayBgs"),Zt(this,"eventLabel"),this.dayBgs=[]; + for(let i=0; + i<7; + ++i)t=new Oii,t.setItemRenderLayout(),t.x=i*t.width,this.addChild(t),this.dayBgs.push(t); + this.dayBgs[this.dayBgs.length-1].showRightLine(),this.eventLabel=new Nii,this.addChild(this.eventLabel),this.eventLabel.eventMode="dynamic",this.eventLabel.on("pointertap",this.onEventLabelTap,this)} + get height(){ + return 77} + setData(t){ + const i=t,s=new Date(DR.time); + s.setUTCHours(0,0,0,0); + const e=s.getUTCDay(); + let n; + s.setUTCDate(s.getUTCDate()-2); + const h=[]; + let r; + const o=this.dayBgs.length; + for(let l=0; + l<o; + ++l)n=s.getUTCDay(),h.push(X4t(n)),r=this.dayBgs[l],n===e?r.setToday(!0):r.setToday(!1),s.setUTCDate(s.getUTCDate()+1); + let a=0; + if(i.startTime&&i.endTime){ + const t=new Date(i.startTime),e=new Date(i.endTime); + s.setTime(DR.time),s.setUTCHours(0,0,0,0),s.setUTCDate(s.getUTCDate()-2); + const n=this.dayBgs.length; + for(let i=0; + i<n; + ++i)(s.getTime()>=t.getTime()||J4t(s,t))&&(s.getTime()<=e.getTime()||J4t(s,e))&&a++,J4t(s,t)&&(this.eventLabel.x=this.dayBgs[i].x),s.setUTCDate(s.getUTCDate()+1)} + else try{ + const t=JSON.parse(i.action); + if("day"in t){ + const i=h.indexOf(t.day.toUpperCase()); + -1!==i&&(this.eventLabel.x=this.dayBgs[i].x)} + else a=this.dayBgs.length} + catch(c){ + } + this.eventLabel.setData(i),this.eventLabel.width=this.dayBgs[0].width*a} + onEventLabelTap(t){ + xii.getInstance().setData(this.eventLabel.getData()),xii.getInstance().show()} + } + ; + Qt(Lii,"EventScheduleItemRenderer"); + let Dii=Lii; + const Gii=class t extends uB{ + constructor(){ + super(),Zt(this,"header"),Zt(this,"list"),Zt(this,"currentDate"),Zt(this,"currentDateValue",-1),Zt(this,"needToReload",!1),this.width=600,this.height=880,this.outSideClickHide=!0,this.title=RB.getText("GAME_1887","이벤트 일정"),this.header=new kii,this.header.x=.5*(this.width-this.header.width)+1,this.header.y=80,this.addChild(this.header),this.list=new b4(Dii,540,700,0),this.list.x=this.header.x,this.list.y=this.header.y+this.header.height,this.addChild(this.list)} + static getInstance(){ + return null==this.instance&&(this.instance=new t),this.instance} + async setData(){ + let t=!1; + if(this.currentDate&&-1!=this.currentDateValue?this.currentDate.getUTCDate()!=this.currentDateValue&&(t=!0,this.currentDateValue=this.currentDate.getUTCDate()):(t=!0,this.currentDate||(this.currentDate=new Date(DR.time)),this.currentDateValue=this.currentDate.getUTCDate()),this.needToReload&&(t=!0),t){ + const t=await ZL.getInstance().user.getEventSchedule(); + if(0==t.success)return void bB.getInstance().showError(t); + GB.setEventScheduleData(t.body)} + this.title=RB.getText("GAME_1887","이벤트 일정"),this.header.setData(),this.list.dataProvider=[...GB.eventScheduled],t&&this.list.scrollTo(0)} + } + ; + Qt(Gii,"EventSchedulePopup"),Zt(Gii,"instance"); + let Bii=Gii; + const Uii=Object.freeze(Object.defineProperty({ + __proto__:null,EventSchedulePopup:Bii} + ,Symbol.toStringTag,{ + value:"Module"} + )),Fii=class extends Pqt{ + constructor(){
ShortcutManager 6 hunks, 228 statements
- 0==zqt.getInstance().isHeroView()&&await qci.getInstance().onMenuClickByIndex(1),0==zqt.getInstance().isHeroSubView()&&(gJt.getInstance().updateLanguage(),wJt.getInstance().currentSubView=gJt.getInstance())} + if(0==UXt.getInstance().isHeroView()&&await Eui.getInstance().onMenuClickByIndex(1),0==UXt.getInstance().isHeroSubView()){ + const{ + HeroView:t} + =await ei(async()=>{ + const{ + HeroView:t} + =await Promise.resolve().then(()=>wQt); + return{ + HeroView:t} + } + ,void 0),{ + HeroSubView:i} + =await ei(async()=>{ + const{ + HeroSubView:t} + =await Promise.resolve().then(()=>fQt); + return{ + HeroSubView:t} + } + ,void 0); + i.getInstance().updateLanguage(),t.getInstance().currentSubView=i.getInstance()} + }
- await this.goHero(),gJt.getInstance().setPresetBarVisible(!0)} + if(await this.goHero(),1==UXt.getInstance().isHeroSubView()){ + const{ + HeroSubView:t} + =await ei(async()=>{ + const{ + HeroSubView:t} + =await Promise.resolve().then(()=>fQt); + return{ + HeroSubView:t} + } + ,void 0); + t.getInstance().setPresetBarVisible(!0)} + } + async goHeroHire(){ + if(await this.goHero(),0==UXt.getInstance().isHeroHireSubView()){ + const{ + HeroView:t} + =await ei(async()=>{ + const{ + HeroView:t} + =await Promise.resolve().then(()=>wQt); + return{ + HeroView:t} + } + ,void 0),{ + HeroHireSubView:i} + =await ei(async()=>{ + const{ + HeroHireSubView:t} + =await Promise.resolve().then(()=>aQt); + return{ + HeroHireSubView:t} + } + ,void 0); + i.getInstance().setData(),t.getInstance().currentSubView=i.getInstance()} + } + async goCastle(){ + if(0==UXt.getInstance().isCastleView()&&await Eui.getInstance().onMenuClickByIndex(2),0==UXt.getInstance().isCastleSubView()){ + const{ + CastleView:t} + =await ei(async()=>{ + const{ + CastleView:t} + =await Promise.resolve().then(()=>Qli); + return{ + CastleView:t} + } + ,void 0),{ + CastleSubView:i} + =await ei(async()=>{ + const{ + CastleSubView:t} + =await Promise.resolve().then(()=>qli); + return{ + CastleSubView:t} + } + ,void 0); + i.getInstance().setData(),t.getInstance().currentSubView=i.getInstance()} + } + async goSecretaryGuide(){ + if(await this.goCastle(),0==UXt.getInstance().isCastleCitadelSubView()){ + const{ + CastleView:t} + =await ei(async()=>{ + const{ + CastleView:t} + =await Promise.resolve().then(()=>Qli); + return{ + CastleView:t} + } + ,void 0),{ + CitadelSubView:i} + =await ei(async()=>{ + const{ + CitadelSubView:t} + =await Promise.resolve().then(()=>Vli); + return{ + CitadelSubView:t} + } + ,void 0); + i.getInstance().setData(),t.getInstance().currentSubView=i.getInstance()} + const{ + SecretaryGuidePopup:t} + =await ei(async()=>{ + const{ + SecretaryGuidePopup:t} + =await Promise.resolve().then(()=>Gzt); + return{ + SecretaryGuidePopup:t} + } + ,void 0); + t.getInstance().showGuide()}
- 0==zqt.getInstance().isTreasureView()&&await qci.getInstance().onMenuClickByIndex(3),0==zqt.getInstance().isTreasureSubView()&&(s7t.getInstance().updateLanguage(),UQt.getInstance().currentSubView=s7t.getInstance())} + if(0==UXt.getInstance().isTreasureView()&&await Eui.getInstance().onMenuClickByIndex(3),0==UXt.getInstance().isTreasureSubView()){ + const{ + TreasureView:t} + =await ei(async()=>{ + const{ + TreasureView:t} + =await Promise.resolve().then(()=>UZt); + return{ + TreasureView:t} + } + ,void 0),{ + TreasureSubView:i} + =await ei(async()=>{ + const{ + TreasureSubView:t} + =await Promise.resolve().then(()=>N9t); + return{ + TreasureSubView:t} + } + ,void 0); + i.getInstance().updateLanguage(),t.getInstance().currentSubView=i.getInstance()} + }
- await this.goTreasure(),s7t.getInstance().setPresetBarVisible(!0)} + if(await this.goTreasure(),1==UXt.getInstance().isTreasureSubView()){ + const{ + TreasureSubView:t} + =await ei(async()=>{ + const{ + TreasureSubView:t} + =await Promise.resolve().then(()=>N9t); + return{ + TreasureSubView:t} + } + ,void 0); + t.getInstance().setPresetBarVisible(!0)} + }
- goPetMenuAt(t){ - TF.getInstance().children.length>0&&(TF.getInstance().removeChildren(),GH.ensureMounted(LYt.getInstance())),zqt.getInstance().isPetPopup()||Qoi.getInstance().executeOnPetBtnClick2(),r6t.getInstance().onMenuClick(t)} + async goPetMenuAt(t){ + if(b$.getInstance().children.length>0&&(b$.getInstance().removeChildren(),xH.ensureMounted(Cqt.getInstance())),!UXt.getInstance().isPetPopup()){ + const{ + RightMenu:t} + =await ei(async()=>{ + const{ + RightMenu:t} + =await Promise.resolve().then(()=>Aci); + return{ + RightMenu:t} + } + ,void 0); + t.getInstance().executeOnPetBtnClick2()} + _4t.getInstance().onMenuClick(t)}
- goInventory(){ - TF.getInstance().children.length>0&&(TF.getInstance().removeChildren(),GH.ensureMounted(LYt.getInstance())),zqt.getInstance().isInventoryPopup()||Qoi.getInstance().executeOnInventoryBtnClick()} + async goInventory(){ + if(b$.getInstance().children.length>0&&(b$.getInstance().removeChildren(),xH.ensureMounted(Cqt.getInstance())),UXt.getInstance().isInventoryPopup())return; + const{ + RightMenu:t} + =await ei(async()=>{ + const{ + RightMenu:t} + =await Promise.resolve().then(()=>Aci); + return{ + RightMenu:t} + } + ,void 0); + t.getInstance().executeOnInventoryBtnClick()} + async goGuildWarTournament(){ + if(xG.getInstance().children.length>0&&(xG.getInstance().removeChildren(),xH.ensureMounted(Cqt.getInstance())),UXt.getInstance().isGuildWarTournamentPopup())return; + const{ + RightMenu:t} + =await ei(async()=>{ + const{ + RightMenu:t} + =await Promise.resolve().then(()=>Aci); + return{ + RightMenu:t} + } + ,void 0); + t.getInstance().executeOnTournamentBtnClick()} + async goMine(){ + if(EG.maxWave<200){ + const t=RB.getValueReplace("GAME_633","##",200,"최고 WAVE 200 이상에서 환생 후 이용가능합니다."); + return void vH.getInstance().showMessage(t)} + const{ + MinePopup:t} + =await ei(async()=>{ + const{ + MinePopup:t} + =await Promise.resolve().then(()=>v8t); + return{ + MinePopup:t} + } + ,void 0); + await t.getInstance().show()} + async goAscent(){ + const{ + EventHubPopup:t} + =await ei(async()=>{ + const{ + EventHubPopup:t} + =await Promise.resolve().then(()=>O_i); + return{ + EventHubPopup:t} + } + ,void 0); + t.getInstance().execOpenAscent()} + async goAttendEvent(){ + const{ + AttendEventPopup:t} + =await ei(async()=>{ + const{ + AttendEventPopup:t} + =await Promise.resolve().then(()=>U_i); + return{ + AttendEventPopup:t} + } + ,void 0); + await t.getInstance().setData(),t.getInstance().show()}
FireStormFx 1 hunks, 215 statements
- super(),Xt(this,"cracks",new Ff),Xt(this,"ring",new Ff),Xt(this,"flash",new Ff),Xt(this,"crackPaths",[]),Xt(this,"playing",!1),this.eventMode="none",this.visible=!1,this.cracks.blendMode="add",this.ring.blendMode="add",this.ring.circle(0,0,100).stroke({ - width:14,color:t.COLOR} - ),this.ring.position.set(t.CENTER,t.CENTER),this.flash.rect(0,0,t.FIELD,t.FIELD).fill(15269872),this.addChild(this.cracks,this.ring,this.flash)} - play(t){ - if(this.playing)return void t(); + super(),this.eventMode="none"} + async play(i,s){ + await pF.preload().catch(()=>{ + } + ); + let e=[]; + try{ + e=kS.getTextures(pF.SHEET,"fla_",!0)??[]} + catch{ + e=[]} + const n=t.FIELD,h=t.C,r=t.glow(),o=new Ve; + this.addChild(o); + const a=new Ye(t.vignette()); + a.width=a.height=n,a.alpha=0; + const c=new Ve,l=new Ve,u=this.buildSpots(e,r,c,l),d=new ip; + d.blendMode="add"; + const f=new Ye(r); + f.anchor.set(.5),f.tint=16747056,f.blendMode="add",f.position.set(h,h+10),f.width=f.height=60,f.alpha=0; + const p=new Ve,g=new Ve,w=(new ip).rect(0,0,n,n).fill(16734736); + w.alpha=0; + const m=(new ip).rect(0,0,n,n).fill(16773848); + m.alpha=0; + const v=new Ve; + o.addChild(a,c,l,f,d,p,g,w,v,m); + const _=[this.buildRing(t.RING1,2.8,4.6,e,r,p,g),this.buildRing(t.RING2,2.2,3.6,e,r,p,g),this.buildRing(t.RING3,1.8,3,e,r,p,g)],M=[{ + r:20,a:0} + ,{ + r:0,a:0} + ,{ + r:0,a:0} + ],b=Qt(()=>{ + _.forEach((t,i)=>{ + const s=M[i]; + for(const e of t){ + const t=s.r*e.radiusMul; + e.glow.position.set(h+Math.cos(e.angle)*t,h+Math.sin(e.angle)*t*.92+e.dy),e.flame.position.set(e.glow.x,e.glow.y+14),e.glow.alpha=.85*s.a,e.flame.alpha=s.a} + } + ),d.clear(),M[0].a>0&&d.circle(h,h,Math.max(1,.97*M[0].r)).stroke({ + width:46,color:16738840,alpha:.45*M[0].a} + )} + ,"layoutRings"); + b(); + const y={ + x:s.x,y:s.y} + ,E={ + amp:0} + ,A=Qt(()=>{ + s.x=y.x+2*(Math.random()-.5)*E.amp,s.y=y.y+2*(Math.random()-.5)*E.amp} + ,"onShake"); + vn.shared.add(A); + const S={ + t:0} + ,T=Qt(()=>{ + for(const t of u){ + const i=Math.max(0,Math.min(1,(S.t-t.at)/.22)); + t.flame.scale.set(t.scale*i*t.flip,t.scale*i),t.glow.alpha=.75*i,t.glow.width=t.glow.height=70*t.scale*.6*(.6+.4*i)} + } + ,"layoutSpots"); + T(),qG.getInstance().playSFX(qG.SFX_STONE_BREAK),await new Promise(t=>{ + const i=MR.timeline({ + onComplete:t} + ); + i.to(S,{ + t:1.3,duration:1.1,ease:"none",onUpdate:T} + ,0),i.to(a,{ + alpha:.85,duration:1.2,ease:"power1.in"} + ,0),i.to(E,{ + amp:3.5,duration:1,ease:"power1.in"} + ,0),i.to(f,{ + alpha:1,width:230,height:230,duration:1,ease:"power2.in"} + ,0),i.call(()=>qG.getInstance().playSFX(qG.SFX_DOOM_BRINGER),[],.95),i.to(E,{ + amp:9,duration:.3,ease:"power2.out"} + ,1),i.to(M[0],{ + a:1,duration:.15} + ,1),i.to(M[0],{ + r:470,duration:.75,ease:"power2.in",onUpdate:b} + ,1),i.to(M[1],{ + a:1,duration:.15} + ,1.12),i.to(M[1],{ + r:360,duration:.63,ease:"power2.in",onUpdate:b} + ,1.12),i.to(M[2],{ + a:1,duration:.15} + ,1.24),i.to(M[2],{ + r:230,duration:.51,ease:"power2.in",onUpdate:b} + ,1.24),i.to(w,{ + alpha:.6,duration:.55,ease:"power1.in"} + ,1.15),i.to(m,{ + alpha:1,duration:.2,ease:"power2.in"} + ,1.55)} + ); + try{ + await i()} + catch(ort){ + } + c.visible=l.visible=!1,f.alpha=0; + const C=this.burstEmbers(v,r,56),O=Qt(t=>{ + const i=t.deltaMS/1e3; + for(const s of C){ + s.age+=i; + const t=Math.min(1,s.age/s.life); + s.sprite.x+=s.vx*i,s.sprite.y+=s.vy*i,s.vy-=40*i,s.sprite.alpha=.95*(1-t)} + } + ,"tickEmbers"); + vn.shared.add(O),await new Promise(t=>{ + const i=MR.timeline({ + onComplete:t} + ); + i.to(E,{ + amp:0,duration:.6,ease:"power2.out"} + ,0),i.to(m,{ + alpha:0,duration:1.1,ease:"power2.out"} + ,0),i.to(w,{ + alpha:0,duration:.9,ease:"power2.out"} + ,0),i.to(a,{ + alpha:0,duration:1.4,ease:"power1.out"} + ,0),i.to(M[0],{ + r:640,a:0,duration:1,ease:"power1.out",onUpdate:b} + ,0),i.to(M[1],{ + r:520,a:0,duration:.9,ease:"power1.out",onUpdate:b} + ,0),i.to(M[2],{ + r:420,a:0,duration:.8,ease:"power1.out",onUpdate:b} + ,0),i.to({ + } + ,{ + duration:1.5} + ,0)} + ),vn.shared.remove(A),vn.shared.remove(O),s.position.set(y.x,y.y),MR.killTweensOf([S,E,...M]),o.destroy({ + children:!0} + )} + buildRing(t,i,s,e,n,h,r){ + const o=[],a=Math.random()*Math.PI*2; + for(let c=0; + c<t; + c++){ + const l=a+c/t*Math.PI*2+.18*(Math.random()-.5),u=new Ye(n); + let d; + if(u.anchor.set(.5),u.tint=16738840,u.blendMode="add",u.width=u.height=120+50*Math.random(),h.addChild(u),e.length>0){ + const t=new fp(e); + t.anchor.set(.5,.7),t.animationSpeed=.5,t.scale.set(i+Math.random()*(s-i)),c%2==1&&(t.scale.x*=-1),t.gotoAndPlay(Math.floor(Math.random()*e.length)),d=t} + else d=new Ve; + r.addChild(d),o.push({ + angle:l,radiusMul:.82+.36*Math.random(),dy:22*(Math.random()-.5),glow:u,flame:d} + )} + return o} + burstEmbers(i,s,e){ + const n=t.C,h=[]; + for(let t=0; + t<e; + t++){ + const e=new Ye(s); + e.anchor.set(.5),e.tint=t%3==0?16769184:16751168,e.blendMode="add",e.width=e.height=6+8*Math.random(); + const r=Math.random()*Math.PI*2,o=40+280*Math.random(); + e.position.set(n+Math.cos(r)*o,n+Math.sin(r)*o),i.addChild(e); + const a=30+90*Math.random(); + h.push({ + sprite:e,vx:Math.cos(r)*a,vy:Math.sin(r)*a-40,life:.8+.9*Math.random(),age:0} + )} + return h} + buildSpots(i,s,e,n){ + const h=t.C,r=[]; + for(let o=0; + o<t.SPOTS; + o++){ + const t=Math.random()*Math.PI*2,o=70+270*Math.random(),a=Math.max(14,Math.min(626,h+Math.cos(t)*o)),c=Math.max(30,Math.min(632,h+Math.sin(t)*o)),l=new Ye(s); + let u; + if(l.anchor.set(.5),l.tint=16734736,l.blendMode="add",l.position.set(a,c-8),l.alpha=0,e.addChild(l),i.length>0){ + const t=new fp(i); + t.anchor.set(.5,.7),t.animationSpeed=.45,t.gotoAndPlay(Math.floor(Math.random()*i.length)),u=t} + else u=new Ve; + u.position.set(a,c),u.scale.set(0),n.addChild(u); + const d=.05+(o-70)/270*.85+.12*Math.random(); + r.push({ + at:d,scale:1.6+1.2*Math.random(),flip:Math.random()<.5?-1:1,glow:l,flame:u} + )} + return r} + static glow(){ + if(t.glowTex)return t.glowTex; + const i=document.createElement("canvas"); + i.width=i.height=128; + const s=i.getContext("2d"),e=s.createRadialGradient(64,64,0,64,64,64); + return e.addColorStop(0,"rgba(255,255,255,1)"),e.addColorStop(.4,"rgba(255,255,255,0.45)"),e.addColorStop(1,"rgba(255,255,255,0)"),s.fillStyle=e,s.fillRect(0,0,128,128),t.glowTex=as.from(i),t.glowTex} + static vignette(){ + if(t.vignetteTex)return t.vignetteTex; + const i=document.createElement("canvas"); + i.width=i.height=256; + const s=i.getContext("2d"),e=128,n=s.createRadialGradient(e,e,46.08,e,e,184.32); + return n.addColorStop(0,"rgba(255,90,20,0)"),n.addColorStop(.55,"rgba(200,40,0,0.45)"),n.addColorStop(1,"rgba(70,8,0,0.95)"),s.fillStyle=n,s.fillRect(0,0,256,256),t.vignetteTex=as.from(i),t.vignetteTex} + } + ; + Qt(gF,"FireStormFx"),Zt(gF,"FIELD",640),Zt(gF,"C",320),Zt(gF,"RING1",48),Zt(gF,"RING2",36),Zt(gF,"RING3",24),Zt(gF,"SPOTS",34),Zt(gF,"glowTex",null),Zt(gF,"vignetteTex",null); + let wF=gF; + const mF={ + [hU.FOREST]:{ + line:12124064,flash:15794160} + ,[hU.DEAD_LAND]:{ + line:12124120,flash:15269872} + ,[hU.FIRE_LAND]:{ + line:16752704,flash:16770752} + } + ,vF=class t extends Ve{ + constructor(){ + super(),Zt(this,"cracks",new ip),Zt(this,"ring",new ip),Zt(this,"flash",new ip),Zt(this,"crackPaths",[]),Zt(this,"playing",!1),Zt(this,"lineColor",12124120),Zt(this,"onFinished",null),Zt(this,"fireStorm",new wF),this.eventMode="none",this.visible=!1,this.cracks.blendMode="add",this.ring.blendMode="add",this.ring.position.set(t.CENTER,t.CENTER),this.addChild(this.cracks,this.ring,this.flash,this.fireStorm)} + play(i,s,e=!1){ + if(this.playing)return Promise.resolve().then(i).catch(t=>{ + } + ); + if(e)return this.playSoft(i); + if(s===hU.FIRE_LAND)return this.playing=!0,this.visible=!0,this.fireStorm.play(i,this.parent??this).finally(()=>{ + this.playing=!1,this.visible=!1} + ); + const n=mF[s]??mF[hU.DEAD_LAND]; + this.lineColor=n.line,this.ring.clear().circle(0,0,100).stroke({ + width:14,color:n.line} + ),this.flash.clear().rect(0,0,t.FIELD,t.FIELD).fill(n.flash); + const h=new Promise(t=>this.onFinished=t);
MiniAscentShopItemRenderer 2 hunks, 214 statements
+ const i=Qt((t,i)=>RB.getText(t,i),"text"); + switch(t.type){ + case"gem":return i("COMMON_350","보석"); + case"honorCoin":return i("GAME_88","명예코인"); + case"runeTicket":return i("GAME_1500","크리스탈 뽑기권"); + case"pet":return`${ + i(`PET_NAME_${ + t.kindNum} + `,"")} + ${ + i("GAME_736","조각")} + `.trim(); + case"trans":return"treasure"===t.subType?i("GAME_1224","유물 초월권"):i("GAME_1223","영웅 초월권"); + case"ticket":return"heroGacha"===t.subType?i("GAME_764","5성 영웅 확정권"):"heroSelect"===t.subType?i("GAME_769","영웅 선택권"):"pet"===t.subType?i("GAME_772","정령의 고원 입장권"):t.subType??t.type; + default:return t.type} + } + Qt(NQi,"shopProductName"); + const LQi=class t extends OR{ + constructor(){ + super(),Zt(this,"reward",new p4),Zt(this,"productName",new QD("",ybi.text,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"limit",new QD("",ybi.muted,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"sealIcon",new Ye(obi.texture("ui_challenge_seal"))),Zt(this,"price",new QD("",ybi.text,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"buy",new kQi(vbi("EVENT_SHOP_BUY"))); + const{ + W:i,H:s,BUTTON_W:e,BUTTON_H:n,TEXT_X:h} + =t,r=(new ip).roundRect(1,1,i-2,s-2,12).fill(ybi.surface).stroke({ + color:ybi.border,width:1} + ); + r.eventMode="none",this.reward.scale.set(1.2),this.productName.textSize=18,this.productName.position.set(h,20),this.limit.textSize=18,this.limit.position.set(h,20),this.sealIcon.width=this.sealIcon.height=22,this.sealIcon.position.set(h+2,54),this.price.textSize=18,this.price.position.set(h+32,52),this.buy.width=e,this.buy.height=n,this.buy.position.set(i-e-16,(s-n)/2),this.buy.onClick=()=>{ + const t=this.data; + t&&this.buy.activated&&t.onBuy(t.item)} + ,this.addChild(r,this.reward,this.productName,this.limit,this.sealIcon,this.price,this.buy)} + get width(){ + return t.W} + get height(){ + return t.H} + setData(i){ + const s=i; + if(!s)return; + this.data=s,this.reward.setDataFrom(s.item.reward); + const e=this.reward.frameBounds,n=this.reward.scale; + this.reward.position.set(16+(64*n.x-e.width*n.x)/2-e.x*n.x,(t.H-e.height*n.y)/2-e.y*n.y),this.limit.text=vbi("EVENT_SHOP_LIMIT",s.item.purchased,s.item.limit),this.productName.text=NQi(s.item.reward); + const h=t.TEXT_W-this.limit.width-8; + this.productName.scale.set(1),this.productName.scale.set(Math.min(1,h/Math.max(1,this.productName.width))),this.limit.x=this.productName.x+this.productName.width+8,this.price.text=String(s.item.price),this.buy.activated=!s.busy&&s.item.purchased<s.item.limit&&s.seals>=s.item.price} + } + ; + Qt(LQi,"MiniAscentShopItemRenderer"),Zt(LQi,"W",552),Zt(LQi,"H",96),Zt(LQi,"BUTTON_W",140),Zt(LQi,"BUTTON_H",58),Zt(LQi,"TEXT_X",116),Zt(LQi,"TEXT_W",LQi.W-LQi.BUTTON_W-32-LQi.TEXT_X); + let DQi=LQi; + const GQi=class t extends OQi{ + constructor(){ + super(),Zt(this,"tabId","shop"),Zt(this,"heading",new QD(vbi("SHOP"),ybi.text,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"hint",new QD(vbi("EVENT_SHOP_HINT"),ybi.text,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"message",new QD("",ybi.text,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"reload",new kQi(vbi("RELIC_RELOAD"))),Zt(this,"list",new TR(DQi,DQi.W,DQi.H,t.ROW_GAP)),Zt(this,"rows",[]),Zt(this,"data",null),Zt(this,"busy",!1),this.canCloseShell=()=>!this.busy,this.heading.textSize=26,this.hint.setWrapWidth(536),this.message.setWrapWidth(496),this.reload.width=260,this.reload.height=46,this.reload.onClick=()=>{ + this.busy||this.load(!0)} + ,this.list.x=t.LIST_X,this.contentContainer.addChild(this.heading,this.hint,this.message,this.reload,this.list)} + static getInstance(){ + return this.instance??(this.instance=new t)} + show(){ + this.height=876,this.layout(),this.render(),super.show(),this.load()} + layout(){ + this.heading.position.set((this.width-this.heading.width)/2,140),this.hint.position.set(40,188); + const t=this.hint.y+this.hint.height+24; + this.list.y=t,this.list.setListHeight(Math.max(DQi.H,this.height-t-12),!1),this.message.position.set(60,t+55),this.reload.position.set((this.width-this.reload.width)/2,t+150)} + setBusy(t){ + this.busy=t,this.render(),this.parent&&Vbi.getInstance().refresh()} + async load(t=!1){ + this.setBusy(!0); + try{ + this.data=await Fbi.getInstance().fetchEventShop(t)} + catch(ort){ + vH.getInstance().showMessage(ort.message)} + finally{ + this.setBusy(!1)} + } + render(){ + var t; + const i=(null==(t=this.data)?void 0:t.eventShop.items)??[],s=!i.length; + if(this.message.visible=this.reload.visible=s,this.list.visible=!s,s)return this.message.text=vbi(this.data?"EVENT_SHOP_EMPTY":"RELIC_LOADING"),void(this.reload.activated=!this.busy); + const e=this.data.season.seals??this.data.season.coin; + this.rows.length===i.length&&this.rows.every((t,s)=>t.item.kindNum===i[s].kindNum)?(this.rows.forEach((t,s)=>{ + t.item=i[s],t.seals=e,t.busy=this.busy} + ),this.list.updateItemData()):(this.rows=i.map(t=>({ + item:t,seals:e,busy:this.busy,onBuy:Qt(t=>{ + this.buy(t)} + ,"onBuy")} + )),this.list.dataProvider=this.rows,this.list.showTopItem())} + async buy(t){ + if(!this.busy&&this.data){ + this.setBusy(!0); + try{ + this.data=await Fbi.getInstance().buyEventShop(this.data.eventShop.revision,t),vH.getInstance().showMessage(vbi("EVENT_SHOP_DELIVERED"))} + catch(ort){ + vH.getInstance().showMessage(ort.message); + try{ + this.data=await Fbi.getInstance().fetchEventShop(!0)} + catch{ + } + } + finally{ + this.setBusy(!1)} + } + } + } + ; + Qt(GQi,"MiniAscentEventShopPage"),Zt(GQi,"instance"),Zt(GQi,"LIST_X",32),Zt(GQi,"ROW_GAP",6); + let BQi=GQi; + const UQi=Object.freeze(Object.defineProperty({ + __proto__:null,MiniAscentEventShopPage:BQi} + ,Symbol.toStringTag,{ + value:"Module"} + )); + function FQi(t){
- )); - function bLi(t){ - const i=qt((t,i)=>nB.getText(t,i),"text"); - switch(t.type){ - case"gem":return i("COMMON_350","보석"); - case"honorCoin":return i("GAME_88","명예코인"); - case"runeTicket":return i("GAME_1500","크리스탈 뽑기권"); - case"pet":return`${ - i(`PET_NAME_${ - t.kindNum} - `,"")} - ${ - i("GAME_736","조각")} - `.trim(); - case"trans":return"treasure"===t.subType?i("GAME_1224","유물 초월권"):i("GAME_1223","영웅 초월권"); - case"ticket":return"heroGacha"===t.subType?i("GAME_764","5성 영웅 확정권"):"heroSelect"===t.subType?i("GAME_769","영웅 선택권"):"pet"===t.subType?i("GAME_772","정령의 고원 입장권"):t.subType??t.type; - default:return t.type} - } - qt(bLi,"shopProductName"); - const ELi=class t extends iR{ - constructor(){ - super(),Xt(this,"reward",new g6),Xt(this,"productName",new SD("",u_i.text,OL.DEFAULT_FONT_OPTION_16)),Xt(this,"limit",new SD("",u_i.muted,OL.DEFAULT_FONT_OPTION_16)),Xt(this,"sealIcon",new je(Xvi.texture("ui_challenge_seal"))),Xt(this,"price",new SD("",u_i.text,OL.DEFAULT_FONT_OPTION_16)),Xt(this,"buy",new INi(o_i("EVENT_SHOP_BUY"))); - const{ - W:i,H:s,BUTTON_W:e,BUTTON_H:n,TEXT_X:h} - =t,r=(new Ff).roundRect(1,1,i-2,s-2,12).fill(u_i.surface).stroke({ - color:u_i.border,width:1} - ); - r.eventMode="none",this.reward.scale.set(1.2),this.productName.textSize=18,this.productName.position.set(h,20),this.limit.textSize=18,this.limit.position.set(h,20),this.sealIcon.width=this.sealIcon.height=22,this.sealIcon.position.set(h+2,54),this.price.textSize=18,this.price.position.set(h+32,52),this.buy.width=e,this.buy.height=n,this.buy.position.set(i-e-16,(s-n)/2),this.buy.onClick=()=>{ - const t=this.data; - t&&this.buy.activated&&t.onBuy(t.item)} - ,this.addChild(r,this.reward,this.productName,this.limit,this.sealIcon,this.price,this.buy)} - get width(){ - return t.W} - get height(){ - return t.H} - setData(i){ - const s=i; - if(!s)return; - this.data=s,this.reward.setDataFrom(s.item.reward); - const e=this.reward.frameBounds,n=this.reward.scale; - this.reward.position.set(16+(64*n.x-e.width*n.x)/2-e.x*n.x,(t.H-e.height*n.y)/2-e.y*n.y),this.limit.text=o_i("EVENT_SHOP_LIMIT",s.item.purchased,s.item.limit),this.productName.text=bLi(s.item.reward); - const h=t.TEXT_W-this.limit.width-8; - this.productName.scale.set(1),this.productName.scale.set(Math.min(1,h/Math.max(1,this.productName.width))),this.limit.x=this.productName.x+this.productName.width+8,this.price.text=String(s.item.price),this.buy.activated=!s.busy&&s.item.purchased<s.item.limit&&s.seals>=s.item.price} - } - ; - qt(ELi,"MiniAscentShopItemRenderer"),Xt(ELi,"W",552),Xt(ELi,"H",96),Xt(ELi,"BUTTON_W",140),Xt(ELi,"BUTTON_H",58),Xt(ELi,"TEXT_X",116),Xt(ELi,"TEXT_W",ELi.W-ELi.BUTTON_W-32-ELi.TEXT_X); - let MLi=ELi; - const ALi=class t extends TNi{ - constructor(){ - super(),Xt(this,"tabId","shop"),Xt(this,"heading",new SD(o_i("SHOP"),u_i.text,OL.DEFAULT_FONT_OPTION_16)),Xt(this,"hint",new SD(o_i("EVENT_SHOP_HINT"),u_i.text,OL.DEFAULT_FONT_OPTION_16)),Xt(this,"message",new SD("",u_i.text,OL.DEFAULT_FONT_OPTION_16)),Xt(this,"reload",new INi(o_i("RELIC_RELOAD"))),Xt(this,"list",new Zk(MLi,MLi.W,MLi.H,t.ROW_GAP)),Xt(this,"rows",[]),Xt(this,"data",null),Xt(this,"busy",!1),this.canCloseShell=()=>!this.busy,this.heading.textSize=26,this.hint.setWrapWidth(536),this.message.setWrapWidth(496),this.reload.width=260,this.reload.height=46,this.reload.onClick=()=>{ - this.busy||this.load(!0)} - ,this.list.x=t.LIST_X,this.contentContainer.addChild(this.heading,this.hint,this.message,this.reload,this.list)} - static getInstance(){ - return this.instance??(this.instance=new t)} - show(){ - this.height=876,this.layout(),this.render(),super.show(),this.load()} - layout(){ - this.heading.position.set((this.width-this.heading.width)/2,140),this.hint.position.set(40,188); - const t=this.hint.y+this.hint.height+24; - this.list.y=t,this.list.setListHeight(Math.max(MLi.H,this.height-t-12),!1),this.message.position.set(60,t+55),this.reload.position.set((this.width-this.reload.width)/2,t+150)} - setBusy(t){ - this.busy=t,this.render(),this.parent&&P_i.getInstance().refresh()} - async load(t=!1){ - this.setBusy(!0); - try{ - this.data=await O_i.getInstance().fetchEventShop(t)} - catch(oht){ - AH.getInstance().showMessage(oht.message)} - finally{ - this.setBusy(!1)} - } - render(){ - var t; - const i=(null==(t=this.data)?void 0:t.eventShop.items)??[],s=!i.length; - if(this.message.visible=this.reload.visible=s,this.list.visible=!s,s)return this.message.text=o_i(this.data?"EVENT_SHOP_EMPTY":"RELIC_LOADING"),void(this.reload.activated=!this.busy); - const e=this.data.season.seals??this.data.season.coin; - this.rows.length===i.length&&this.rows.every((t,s)=>t.item.kindNum===i[s].kindNum)?(this.rows.forEach((t,s)=>{ - t.item=i[s],t.seals=e,t.busy=this.busy} - ),this.list.updateItemData()):(this.rows=i.map(t=>({ - item:t,seals:e,busy:this.busy,onBuy:qt(t=>{ - this.buy(t)} - ,"onBuy")} - )),this.list.dataProvider=this.rows,this.list.showTopItem())} - async buy(t){ - if(!this.busy&&this.data){ - this.setBusy(!0); - try{ - this.data=await O_i.getInstance().buyEventShop(this.data.eventShop.revision,t),AH.getInstance().showMessage(o_i("EVENT_SHOP_DELIVERED"))} - catch(oht){ - AH.getInstance().showMessage(oht.message); - try{ - this.data=await O_i.getInstance().fetchEventShop(!0)} - catch{ - } - } - finally{ - this.setBusy(!1)} - } - } - } - ; - qt(ALi,"MiniAscentEventShopPage"),Xt(ALi,"instance"),Xt(ALi,"LIST_X",32),Xt(ALi,"ROW_GAP",6); - let yLi=ALi; - const SLi=Object.freeze(Object.defineProperty({ - __proto__:null,MiniAscentEventShopPage:yLi} - ,Symbol.toStringTag,{ - value:"Module"}
TournamentRewardItemRenderer 2 hunks, 210 statements
- constructor(){ - super(),Xt(this,"bg"),Xt(this,"lblRound",new SD("",OL.COLOR_BRIGHT_ORANGE,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"line"),Xt(this,"lblWin",new SD("Win",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"iconGem"),Xt(this,"lblGem",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"iconHonor"),Xt(this,"lblHonor",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"iconGuild"),Xt(this,"lblGuild",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"iconGemLose"),Xt(this,"lblGemLose",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"iconHonorLose"),Xt(this,"lblHonorLose",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"iconGuildLose"),Xt(this,"lblGuildLose",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblLose",new SD("Lose",OL.COLOR_WHITE,OL.DEFAULT_OUTLINE_FONT_OPTION_16)); - const i=t.ITEM_WIDTH,s=t.ITEM_HEIGHT,e=t.ICON_SIZE,n=.5*(s-this.lblRound.height); - this.bg=new kM({ - texture:eS.getTexture("UI_Ekkorr","Popup_List_02"),leftWidth:140,topHeight:30,rightWidth:20,bottomHeight:30} - ),this.bg.width=i,this.bg.height=s,this.addChild(this.bg),this.lblRound.align="center",this.lblRound.wordWrap=!0,this.lblRound.wordWrapWidth=100,this.lblRound.x=t.COL_SCORE_X,this.lblRound.y=n,this.addChild(this.lblRound),this.lblWin.align="center",this.lblWin.x=t.COL_WINLOSE_X,this.lblWin.y=.5*(.5*s-this.lblWin.height),this.addChild(this.lblWin),this.iconGem=new je(eS.getTexture("UI_Ekkorr","UI_GEM_ICON")),this.iconGem.width=e,this.iconGem.height=e,this.iconGem.x=t.COL_GEM_X,this.iconGem.y=.5*(.5*s-e),this.addChild(this.iconGem),this.lblGem.x=this.iconGem.x+e+t.LABEL_GAP,this.lblGem.y=this.lblWin.y,this.addChild(this.lblGem),this.iconHonor=new je(eS.getTexture("UI_Ekkorr","PVP_COIN_ON")),this.iconHonor.width=e,this.iconHonor.height=e,this.iconHonor.x=t.COL_HONOR_X,this.iconHonor.y=this.iconGem.y,this.addChild(this.iconHonor),this.lblHonor.x=this.iconHonor.x+e+t.LABEL_GAP,this.lblHonor.y=this.lblWin.y,this.addChild(this.lblHonor),this.iconGuild=new je(eS.getTexture("UI_Ekkorr","GUILD_COIN")),this.iconGuild.width=e,this.iconGuild.height=e,this.iconGuild.x=t.COL_GUILD_X,this.iconGuild.y=this.iconGem.y,this.addChild(this.iconGuild),this.lblGuild.x=this.iconGuild.x+e+t.LABEL_GAP,this.lblGuild.y=this.lblWin.y,this.addChild(this.lblGuild),this.line=new je(eS.getTexture("UI","Popup_Line_01")),this.line.width=i-t.COL_WINLOSE_X+15,this.line.height=1.5,this.line.x=t.COL_WINLOSE_X-20,this.line.y=.5*s,this.addChild(this.line),this.lblLose.align="center",this.lblLose.x=t.COL_WINLOSE_X,this.lblLose.y=.5*s+.5*(.5*s-this.lblLose.height),this.addChild(this.lblLose),this.iconGemLose=new je(eS.getTexture("UI_Ekkorr","UI_GEM_ICON")),this.iconGemLose.width=e,this.iconGemLose.height=e,this.iconGemLose.x=t.COL_GEM_X,this.iconGemLose.y=.5*s+.5*(.5*s-e),this.addChild(this.iconGemLose),this.lblGemLose.x=this.iconGemLose.x+e+t.LABEL_GAP,this.lblGemLose.y=this.lblLose.y,this.addChild(this.lblGemLose),this.iconHonorLose=new je(eS.getTexture("UI_Ekkorr","PVP_COIN_ON")),this.iconHonorLose.width=e,this.iconHonorLose.height=e,this.iconHonorLose.x=t.COL_HONOR_X,this.iconHonorLose.y=this.iconGemLose.y,this.addChild(this.iconHonorLose),this.lblHonorLose.x=this.iconHonorLose.x+e+t.LABEL_GAP,this.lblHonorLose.y=this.lblLose.y,this.addChild(this.lblHonorLose),this.iconGuildLose=new je(eS.getTexture("UI_Ekkorr","GUILD_COIN")),this.iconGuildLose.width=e,this.iconGuildLose.height=e,this.iconGuildLose.x=t.COL_GUILD_X,this.iconGuildLose.y=this.iconGemLose.y,this.addChild(this.iconGuildLose),this.lblGuildLose.x=this.iconGuildLose.x+e+t.LABEL_GAP,this.lblGuildLose.y=this.lblLose.y,this.addChild(this.lblGuildLose)} - setData(i){ - if(this.data=i,!i)return; - 3==i.kindNum||5==i.kindNum?(this.bg.texture=eS.getTexture("UI_Ekkorr","Popup_List_02_gray"),this.lblRound.textColor=OL.COLOR_DEEP_SKYBLUE):(this.bg.texture=eS.getTexture("UI_Ekkorr","Popup_List_02"),this.lblRound.textColor=OL.COLOR_BRIGHT_ORANGE),this.lblRound.text=this.getRoundLabel(i.round,i.kindNum),this.lblRound.x=.5*(120-this.lblRound.width),this.lblRound.y=.5*(t.ITEM_HEIGHT-this.lblRound.height); - const s=i.winRewardValues.split("|").map(Number),e=i.loseRewardValues.split("|").map(Number); - this.lblWin.text=nB.getText("GAME_1028","승리"),this.lblGem.text=String(s[0]),this.lblHonor.text=String(s[2]),this.lblGuild.text=String(s[1]),this.lblLose.text=nB.getText("GAME_1029","패배"),this.lblGemLose.text=String(e[0]),this.lblHonorLose.text=String(e[2]),this.lblGuildLose.text=String(e[1])} - getRoundLabel(t,i){ - switch(t){ - case 1:return nB.getText("GWT_3","16강"); - case 2:return 3==i?`${ - nB.getText("GWT_20","서브 매치")} - 1`:nB.getText("GWT_4","8강"); - case 3:return 5==i?`${ - nB.getText("GWT_20","서브 매치")} - 2`:nB.getText("GWT_5","4강"); - case 4:return 7==i?nB.getText("GWT_7","결승전"):nB.getText("GWT_6","3/4위전"); - default:return""} - } - get height(){ - return t.ITEM_HEIGHT+2} - static get scoreX(){ - return t.COL_SCORE_X} - static get winLoseX(){ - return t.COL_WINLOSE_X} - static get gemX(){ - return t.COL_GEM_X} - static get honorX(){ - return t.COL_HONOR_X} - static get guildX(){ - return t.COL_GUILD_X} - } - ; - qt(Rni,"TournamentRewardItemRenderer"),Xt(Rni,"ITEM_WIDTH",520),Xt(Rni,"ITEM_HEIGHT",90),Xt(Rni,"COL_SCORE_X",20),Xt(Rni,"COL_WINLOSE_X",150),Xt(Rni,"COL_GEM_X",230),Xt(Rni,"COL_HONOR_X",330),Xt(Rni,"COL_GUILD_X",430),Xt(Rni,"ICON_SIZE",22),Xt(Rni,"LABEL_GAP",6); - let xni=Rni; - const Pni=class t extends iR{ - constructor(){ - super(),Xt(this,"bg"),Xt(this,"lblRound",new SD("",OL.COLOR_BRIGHT_ORANGE,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"iconMedal"),Xt(this,"lblMedal",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"iconGem"),Xt(this,"lblGem",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"iconHonor"),Xt(this,"lblHonor",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"iconGuild"),Xt(this,"lblGuild",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)); - const i=t.ITEM_WIDTH,s=t.ITEM_HEIGHT,e=t.ICON_SIZE,n=.5*(s-this.lblRound.height),h=.5*(s-e); - this.bg=new kM({ - texture:eS.getTexture("UI_Ekkorr","Popup_List_02"),leftWidth:140,topHeight:30,rightWidth:20,bottomHeight:30} - ),this.bg.width=i,this.bg.height=s,this.addChild(this.bg),this.lblRound.align="center",this.lblRound.wordWrap=!0,this.lblRound.wordWrapWidth=100,this.lblRound.x=t.COL_SCORE_X,this.lblRound.y=n,this.addChild(this.lblRound),this.iconMedal=new je(eS.getTexture("UI_Ekkorr","UI_STAR_ICON")),this.iconMedal.width=e,this.iconMedal.height=1.35*e,this.iconMedal.x=t.COL_MEDAL_X,this.iconMedal.y=.5*(s-this.iconMedal.height),this.addChild(this.iconMedal),this.lblMedal.x=this.iconMedal.x+e+t.LABEL_GAP,this.lblMedal.y=n,this.addChild(this.lblMedal),this.iconGem=new je(eS.getTexture("UI_Ekkorr","UI_GEM_ICON")),this.iconGem.width=e,this.iconGem.height=e,this.iconGem.x=t.COL_GEM_X,this.iconGem.y=h,this.addChild(this.iconGem),this.lblGem.x=this.iconGem.x+e+t.LABEL_GAP,this.lblGem.y=this.lblMedal.y,this.addChild(this.lblGem),this.iconHonor=new je(eS.getTexture("UI_Ekkorr","PVP_COIN_ON")),this.iconHonor.width=e,this.iconHonor.height=e,this.iconHonor.x=t.COL_HONOR_X,this.iconHonor.y=this.iconGem.y,this.addChild(this.iconHonor),this.lblHonor.x=this.iconHonor.x+e+t.LABEL_GAP,this.lblHonor.y=this.lblMedal.y,this.addChild(this.lblHonor),this.iconGuild=new je(eS.getTexture("UI_Ekkorr","GUILD_COIN")),this.iconGuild.width=e,this.iconGuild.height=e,this.iconGuild.x=t.COL_GUILD_X,this.iconGuild.y=this.iconGem.y,this.addChild(this.iconGuild),this.lblGuild.x=this.iconGuild.x+e+t.LABEL_GAP,this.lblGuild.y=this.lblMedal.y,this.addChild(this.lblGuild)} - setData(i){ - if(this.data=i,!i)return; - let s,e=i.medalBuffs.split("|").map(Number); - i.winRewardValues?(this.lblRound.text=nB.getText("GWT_12","우승 길드 서버"),s=i.winRewardValues.split("|").map(Number),this.lblMedal.text=String(e[0])+"%"):(this.lblRound.text=nB.getText("GWT_13","그 외 서버"),s=i.loseRewardValues.split("|").map(Number),this.lblMedal.text=String(e[1])+"%"),this.lblRound.x=.5*(120-this.lblRound.width),this.lblRound.y=.5*(t.ITEM_HEIGHT-this.lblRound.height),this.lblGem.text=String(s[0]),this.lblHonor.text=String(s[2]),this.lblGuild.text=String(s[1])} - get height(){ - return t.ITEM_HEIGHT+2} - static get scoreX(){ - return t.COL_SCORE_X} - static get medalX(){ - return t.COL_MEDAL_X} - static get gemX(){ - return t.COL_GEM_X} - static get honorX(){ - return t.COL_HONOR_X} - static get guildX(){ - return t.COL_GUILD_X} - } - ; - qt(Pni,"TournamentRewardServerItemRenderer"),Xt(Pni,"ITEM_WIDTH",520),Xt(Pni,"ITEM_HEIGHT",90),Xt(Pni,"COL_SCORE_X",20),Xt(Pni,"COL_MEDAL_X",135),Xt(Pni,"COL_GEM_X",230),Xt(Pni,"COL_HONOR_X",330),Xt(Pni,"COL_GUILD_X",430),Xt(Pni,"ICON_SIZE",22),Xt(Pni,"LABEL_GAP",6); - let Nni=Pni; - const Lni=class t extends dU{ - constructor(){ - super(),Xt(this,"tapDesc"),Xt(this,"tapReward"),Xt(this,"battleContainer"),Xt(this,"lblHdrRound"),Xt(this,"lblHdrWinLose"),Xt(this,"lblHdrGem"),Xt(this,"lblHdrHonor"),Xt(this,"lblHdrGuild"),Xt(this,"rewardBattleList"),Xt(this,"serverContainer"),Xt(this,"lblHdrRoundServer"),Xt(this,"lblHdrMedalServer"),Xt(this,"lblHdrGemServer"),Xt(this,"lblHdrHonorServer"),Xt(this,"lblHdrGuildServer"),Xt(this,"rewardServerList"),this.height=t.POPUP_HEIGHT,this.tapDesc=new UYt(nB.getText("GWT_9","라운드별 전투 보상"),260),this.tapDesc.x=28,this.tapDesc.y=t.TAB_Y,this.tapDesc.selected=!0,this.tapDesc.onClick=this.onDescTap.bind(this),this.contentContainer.addChild(this.tapDesc),this.tapReward=new UYt(nB.getText("GWT_11","서버 보상"),260),this.tapReward.x=this.tapDesc.x+this.tapDesc.width+4,this.tapReward.y=this.tapDesc.y,this.tapReward.onClick=this.onRewardTap.bind(this),this.contentContainer.addChild(this.tapReward),this.battleContainer=new He,this.contentContainer.addChild(this.battleContainer); - const i=OL.DEFAULT_OUTLINE_FONT_OPTION_16; - this.lblHdrRound=new SD("",8947848,i),this.lblHdrWinLose=new SD("",8947848,i),this.lblHdrGem=new SD("",8947848,i),this.lblHdrHonor=new SD("",8947848,i),this.lblHdrGuild=new SD("",8947848,i),this.battleContainer.addChild(this.lblHdrRound),this.battleContainer.addChild(this.lblHdrWinLose),this.battleContainer.addChild(this.lblHdrGem),this.battleContainer.addChild(this.lblHdrHonor),this.battleContainer.addChild(this.lblHdrGuild),this.rewardBattleList=new Zk(xni,xni.ITEM_WIDTH,t.LIST_HEIGHT,2),this.rewardBattleList.x=t.REWARD_LIST_X,this.battleContainer.addChild(this.rewardBattleList),this.serverContainer=new He,this.serverContainer.visible=!1,this.contentContainer.addChild(this.serverContainer),this.lblHdrRoundServer=new SD("",8947848,i),this.lblHdrMedalServer=new SD("",8947848,i),this.lblHdrGemServer=new SD("",8947848,i),this.lblHdrHonorServer=new SD("",8947848,i),this.lblHdrGuildServer=new SD("",8947848,i),this.lblHdrMedalServer.align="center",this.serverContainer.addChild(this.lblHdrRoundServer),this.serverContainer.addChild(this.lblHdrMedalServer),this.serverContainer.addChild(this.lblHdrGemServer),this.serverContainer.addChild(this.lblHdrHonorServer),this.serverContainer.addChild(this.lblHdrGuildServer),this.rewardServerList=new Zk(Nni,Nni.ITEM_WIDTH,t.LIST_HEIGHT,2),this.rewardServerList.x=t.REWARD_LIST_X,this.serverContainer.addChild(this.rewardServerList),this.outSideClickHide=!0} - static getInstance(){ - return this._instance||(this._instance=new t),this._instance} - async showGuide(){ - const t=QL.getTournamentSchedule(); - if(null==t)return; - let i=nB.getText("GWT_1","서버 대항전"),s=1==t.split?"Mid":"Final"; - i+=` (Season ${ - t.season} - - ${ - s} - )`,this.title=i,this.tapDesc.text=nB.getText("GWT_9","라운드별 전투 보상"),this.tapReward.text=nB.getText("GWT_11","서버 보상"),this.refreshRewardHeaders(); - let e=[...QL.rewardBattleList.sort((t,i)=>i.kindNum-t.kindNum)].concat([...QL.rewardBattleLostList.sort((t,i)=>i.kindNum-t.kindNum)]); - this.rewardBattleList.dataProvider=e,this.rewardBattleList.scrollTo(0),this.rewardServerList.dataProvider=QL.rewardServerList,this.rewardServerList.scrollTo(0),this.tapDesc.selected=!0,this.tapReward.selected=!1,this.battleContainer.visible=!0,this.serverContainer.visible=!1,await this.loadImage(),super.show()} - refreshRewardHeaders(){ - this.lblHdrRound.text=nB.getText("GWT_10","라운드"),this.lblHdrWinLose.text=nB.getText("GAME_116","승패"),this.lblHdrGem.text=nB.getText("COMMON_350","보석"),this.lblHdrHonor.text=nB.getText("GAME_88","명예코인"),this.lblHdrGuild.text=nB.getText("GAME_812","길드코인"),this.lblHdrRoundServer.text=nB.getText("GAME_116","승패"); - const i=Math.floor(QL.rewardServerList[0].medalBuffTime/60/24); - this.lblHdrMedalServer.text=nB.getText("CASTLE_SPECIAL_NAME_6","훈장버프")+`\n(${ - i} - Days)`,this.lblHdrGemServer.text=nB.getText("COMMON_350","보석"),this.lblHdrHonorServer.text=nB.getText("GAME_88","명예코인"),this.lblHdrGuildServer.text=nB.getText("GAME_812","길드코인"); - const s=t.REWARD_LIST_X,e=t.CONTENT_Y; - this.lblHdrRound.x=s+.5*(120-this.lblHdrRound.width),this.lblHdrWinLose.x=s+xni.winLoseX,this.lblHdrGem.x=s+xni.gemX+10,this.lblHdrHonor.x=s+xni.honorX,this.lblHdrGuild.x=s+xni.guildX,this.lblHdrRound.y=e,this.lblHdrWinLose.y=e,this.lblHdrGem.y=e,this.lblHdrHonor.y=e,this.lblHdrGuild.y=e,this.lblHdrRoundServer.x=s+.5*(120-this.lblHdrRound.width),this.lblHdrMedalServer.x=s+Nni.medalX,this.lblHdrGemServer.x=s+Nni.gemX+10,this.lblHdrHonorServer.x=s+Nni.honorX,this.lblHdrGuildServer.x=s+Nni.guildX,this.lblHdrRoundServer.y=e,this.lblHdrMedalServer.y=e-.5*this.lblHdrGemServer.height,this.lblHdrGemServer.y=e,this.lblHdrHonorServer.y=e,this.lblHdrGuildServer.y=e,this.rewardBattleList.y=e+this.lblHdrRound.height+12,this.rewardServerList.y=this.lblHdrMedalServer.y+this.lblHdrMedalServer.height+12} - onDescTap(){ - this.tapDesc.selected=!0,this.tapReward.selected=!1,this.battleContainer.visible=!0,this.serverContainer.visible=!1} - onRewardTap(){ - this.tapDesc.selected=!1,this.tapReward.selected=!0,this.battleContainer.visible=!1,this.serverContainer.visible=!0} - getDefaultPositionY(){ - return.5*Xy.stageHeight} - onBackButton(){ - return this.hide(),!0} - } - ; - qt(Lni,"GuildWarTournamentRewardGuidePopup"),Xt(Lni,"_instance"),Xt(Lni,"POPUP_HEIGHT",720),Xt(Lni,"TAB_Y",80),Xt(Lni,"CONTENT_Y",145),Xt(Lni,"LIST_HEIGHT",520),Xt(Lni,"REWARD_LIST_X",30); - let Dni=Lni; - const Gni=class t extends He{
+ const Sri=class t extends OR{ + constructor(){ + super(),Zt(this,"bg"),Zt(this,"lblRound",new QD("",sD.COLOR_BRIGHT_ORANGE,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"line"),Zt(this,"lblWin",new QD("Win",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"iconGem"),Zt(this,"lblGem",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"iconHonor"),Zt(this,"lblHonor",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"iconGuild"),Zt(this,"lblGuild",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"iconGemLose"),Zt(this,"lblGemLose",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"iconHonorLose"),Zt(this,"lblHonorLose",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"iconGuildLose"),Zt(this,"lblGuildLose",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblLose",new QD("Lose",sD.COLOR_WHITE,sD.DEFAULT_OUTLINE_FONT_OPTION_16)); + const i=t.ITEM_WIDTH,s=t.ITEM_HEIGHT,e=t.ICON_SIZE,n=.5*(s-this.lblRound.height); + this.bg=new eE({ + texture:kS.getTexture("UI_Ekkorr","Popup_List_02"),leftWidth:140,topHeight:30,rightWidth:20,bottomHeight:30} + ),this.bg.width=i,this.bg.height=s,this.addChild(this.bg),this.lblRound.align="center",this.lblRound.wordWrap=!0,this.lblRound.wordWrapWidth=100,this.lblRound.x=t.COL_SCORE_X,this.lblRound.y=n,this.addChild(this.lblRound),this.lblWin.align="center",this.lblWin.x=t.COL_WINLOSE_X,this.lblWin.y=.5*(.5*s-this.lblWin.height),this.addChild(this.lblWin),this.iconGem=new Ye(kS.getTexture("UI_Ekkorr","UI_GEM_ICON")),this.iconGem.width=e,this.iconGem.height=e,this.iconGem.x=t.COL_GEM_X,this.iconGem.y=.5*(.5*s-e),this.addChild(this.iconGem),this.lblGem.x=this.iconGem.x+e+t.LABEL_GAP,this.lblGem.y=this.lblWin.y,this.addChild(this.lblGem),this.iconHonor=new Ye(kS.getTexture("UI_Ekkorr","PVP_COIN_ON")),this.iconHonor.width=e,this.iconHonor.height=e,this.iconHonor.x=t.COL_HONOR_X,this.iconHonor.y=this.iconGem.y,this.addChild(this.iconHonor),this.lblHonor.x=this.iconHonor.x+e+t.LABEL_GAP,this.lblHonor.y=this.lblWin.y,this.addChild(this.lblHonor),this.iconGuild=new Ye(kS.getTexture("UI_Ekkorr","GUILD_COIN")),this.iconGuild.width=e,this.iconGuild.height=e,this.iconGuild.x=t.COL_GUILD_X,this.iconGuild.y=this.iconGem.y,this.addChild(this.iconGuild),this.lblGuild.x=this.iconGuild.x+e+t.LABEL_GAP,this.lblGuild.y=this.lblWin.y,this.addChild(this.lblGuild),this.line=new Ye(kS.getTexture("UI","Popup_Line_01")),this.line.width=i-t.COL_WINLOSE_X+15,this.line.height=1.5,this.line.x=t.COL_WINLOSE_X-20,this.line.y=.5*s,this.addChild(this.line),this.lblLose.align="center",this.lblLose.x=t.COL_WINLOSE_X,this.lblLose.y=.5*s+.5*(.5*s-this.lblLose.height),this.addChild(this.lblLose),this.iconGemLose=new Ye(kS.getTexture("UI_Ekkorr","UI_GEM_ICON")),this.iconGemLose.width=e,this.iconGemLose.height=e,this.iconGemLose.x=t.COL_GEM_X,this.iconGemLose.y=.5*s+.5*(.5*s-e),this.addChild(this.iconGemLose),this.lblGemLose.x=this.iconGemLose.x+e+t.LABEL_GAP,this.lblGemLose.y=this.lblLose.y,this.addChild(this.lblGemLose),this.iconHonorLose=new Ye(kS.getTexture("UI_Ekkorr","PVP_COIN_ON")),this.iconHonorLose.width=e,this.iconHonorLose.height=e,this.iconHonorLose.x=t.COL_HONOR_X,this.iconHonorLose.y=this.iconGemLose.y,this.addChild(this.iconHonorLose),this.lblHonorLose.x=this.iconHonorLose.x+e+t.LABEL_GAP,this.lblHonorLose.y=this.lblLose.y,this.addChild(this.lblHonorLose),this.iconGuildLose=new Ye(kS.getTexture("UI_Ekkorr","GUILD_COIN")),this.iconGuildLose.width=e,this.iconGuildLose.height=e,this.iconGuildLose.x=t.COL_GUILD_X,this.iconGuildLose.y=this.iconGemLose.y,this.addChild(this.iconGuildLose),this.lblGuildLose.x=this.iconGuildLose.x+e+t.LABEL_GAP,this.lblGuildLose.y=this.lblLose.y,this.addChild(this.lblGuildLose)} + setData(i){ + if(this.data=i,!i)return; + 3==i.kindNum||5==i.kindNum?(this.bg.texture=kS.getTexture("UI_Ekkorr","Popup_List_02_gray"),this.lblRound.textColor=sD.COLOR_DEEP_SKYBLUE):(this.bg.texture=kS.getTexture("UI_Ekkorr","Popup_List_02"),this.lblRound.textColor=sD.COLOR_BRIGHT_ORANGE),this.lblRound.text=this.getRoundLabel(i.round,i.kindNum),this.lblRound.x=.5*(120-this.lblRound.width),this.lblRound.y=.5*(t.ITEM_HEIGHT-this.lblRound.height); + const s=i.winRewardValues.split("|").map(Number),e=i.loseRewardValues.split("|").map(Number); + this.lblWin.text=RB.getText("GAME_1028","승리"),this.lblGem.text=String(s[0]),this.lblHonor.text=String(s[2]),this.lblGuild.text=String(s[1]),this.lblLose.text=RB.getText("GAME_1029","패배"),this.lblGemLose.text=String(e[0]),this.lblHonorLose.text=String(e[2]),this.lblGuildLose.text=String(e[1])} + getRoundLabel(t,i){ + switch(t){ + case 1:return RB.getText("GWT_3","16강"); + case 2:return 3==i?`${ + RB.getText("GWT_20","서브 매치")} + 1`:RB.getText("GWT_4","8강"); + case 3:return 5==i?`${ + RB.getText("GWT_20","서브 매치")} + 2`:RB.getText("GWT_5","4강"); + case 4:return 7==i?RB.getText("GWT_7","결승전"):RB.getText("GWT_6","3/4위전"); + default:return""} + } + get height(){ + return t.ITEM_HEIGHT+2} + static get scoreX(){ + return t.COL_SCORE_X} + static get winLoseX(){ + return t.COL_WINLOSE_X} + static get gemX(){ + return t.COL_GEM_X} + static get honorX(){ + return t.COL_HONOR_X} + static get guildX(){ + return t.COL_GUILD_X} + } + ; + Qt(Sri,"TournamentRewardItemRenderer"),Zt(Sri,"ITEM_WIDTH",520),Zt(Sri,"ITEM_HEIGHT",90),Zt(Sri,"COL_SCORE_X",20),Zt(Sri,"COL_WINLOSE_X",150),Zt(Sri,"COL_GEM_X",230),Zt(Sri,"COL_HONOR_X",330),Zt(Sri,"COL_GUILD_X",430),Zt(Sri,"ICON_SIZE",22),Zt(Sri,"LABEL_GAP",6); + let Tri=Sri; + const Cri=class t extends OR{ + constructor(){ + super(),Zt(this,"bg"),Zt(this,"lblRound",new QD("",sD.COLOR_BRIGHT_ORANGE,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"iconMedal"),Zt(this,"lblMedal",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"iconGem"),Zt(this,"lblGem",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"iconHonor"),Zt(this,"lblHonor",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"iconGuild"),Zt(this,"lblGuild",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)); + const i=t.ITEM_WIDTH,s=t.ITEM_HEIGHT,e=t.ICON_SIZE,n=.5*(s-this.lblRound.height),h=.5*(s-e); + this.bg=new eE({ + texture:kS.getTexture("UI_Ekkorr","Popup_List_02"),leftWidth:140,topHeight:30,rightWidth:20,bottomHeight:30} + ),this.bg.width=i,this.bg.height=s,this.addChild(this.bg),this.lblRound.align="center",this.lblRound.wordWrap=!0,this.lblRound.wordWrapWidth=100,this.lblRound.x=t.COL_SCORE_X,this.lblRound.y=n,this.addChild(this.lblRound),this.iconMedal=new Ye(kS.getTexture("UI_Ekkorr","UI_STAR_ICON")),this.iconMedal.width=e,this.iconMedal.height=1.35*e,this.iconMedal.x=t.COL_MEDAL_X,this.iconMedal.y=.5*(s-this.iconMedal.height),this.addChild(this.iconMedal),this.lblMedal.x=this.iconMedal.x+e+t.LABEL_GAP,this.lblMedal.y=n,this.addChild(this.lblMedal),this.iconGem=new Ye(kS.getTexture("UI_Ekkorr","UI_GEM_ICON")),this.iconGem.width=e,this.iconGem.height=e,this.iconGem.x=t.COL_GEM_X,this.iconGem.y=h,this.addChild(this.iconGem),this.lblGem.x=this.iconGem.x+e+t.LABEL_GAP,this.lblGem.y=this.lblMedal.y,this.addChild(this.lblGem),this.iconHonor=new Ye(kS.getTexture("UI_Ekkorr","PVP_COIN_ON")),this.iconHonor.width=e,this.iconHonor.height=e,this.iconHonor.x=t.COL_HONOR_X,this.iconHonor.y=this.iconGem.y,this.addChild(this.iconHonor),this.lblHonor.x=this.iconHonor.x+e+t.LABEL_GAP,this.lblHonor.y=this.lblMedal.y,this.addChild(this.lblHonor),this.iconGuild=new Ye(kS.getTexture("UI_Ekkorr","GUILD_COIN")),this.iconGuild.width=e,this.iconGuild.height=e,this.iconGuild.x=t.COL_GUILD_X,this.iconGuild.y=this.iconGem.y,this.addChild(this.iconGuild),this.lblGuild.x=this.iconGuild.x+e+t.LABEL_GAP,this.lblGuild.y=this.lblMedal.y,this.addChild(this.lblGuild)} + setData(i){ + if(this.data=i,!i)return; + let s,e=i.medalBuffs.split("|").map(Number); + i.winRewardValues?(this.lblRound.text=RB.getText("GWT_12","우승 길드 서버"),s=i.winRewardValues.split("|").map(Number),this.lblMedal.text=String(e[0])+"%"):(this.lblRound.text=RB.getText("GWT_13","그 외 서버"),s=i.loseRewardValues.split("|").map(Number),this.lblMedal.text=String(e[1])+"%"),this.lblRound.x=.5*(120-this.lblRound.width),this.lblRound.y=.5*(t.ITEM_HEIGHT-this.lblRound.height),this.lblGem.text=String(s[0]),this.lblHonor.text=String(s[2]),this.lblGuild.text=String(s[1])} + get height(){ + return t.ITEM_HEIGHT+2} + static get scoreX(){ + return t.COL_SCORE_X} + static get medalX(){ + return t.COL_MEDAL_X} + static get gemX(){ + return t.COL_GEM_X} + static get honorX(){ + return t.COL_HONOR_X} + static get guildX(){ + return t.COL_GUILD_X} + } + ; + Qt(Cri,"TournamentRewardServerItemRenderer"),Zt(Cri,"ITEM_WIDTH",520),Zt(Cri,"ITEM_HEIGHT",90),Zt(Cri,"COL_SCORE_X",20),Zt(Cri,"COL_MEDAL_X",135),Zt(Cri,"COL_GEM_X",230),Zt(Cri,"COL_HONOR_X",330),Zt(Cri,"COL_GUILD_X",430),Zt(Cri,"ICON_SIZE",22),Zt(Cri,"LABEL_GAP",6); + let Ori=Cri; + const Iri=class t extends zU{ + constructor(){ + super(),Zt(this,"tapDesc"),Zt(this,"tapReward"),Zt(this,"battleContainer"),Zt(this,"lblHdrRound"),Zt(this,"lblHdrWinLose"),Zt(this,"lblHdrGem"),Zt(this,"lblHdrHonor"),Zt(this,"lblHdrGuild"),Zt(this,"rewardBattleList"),Zt(this,"serverContainer"),Zt(this,"lblHdrRoundServer"),Zt(this,"lblHdrMedalServer"),Zt(this,"lblHdrGemServer"),Zt(this,"lblHdrHonorServer"),Zt(this,"lblHdrGuildServer"),Zt(this,"rewardServerList"),this.height=t.POPUP_HEIGHT,this.tapDesc=new Rqt(RB.getText("GWT_9","라운드별 전투 보상"),260),this.tapDesc.x=28,this.tapDesc.y=t.TAB_Y,this.tapDesc.selected=!0,this.tapDesc.onClick=this.onDescTap.bind(this),this.contentContainer.addChild(this.tapDesc),this.tapReward=new Rqt(RB.getText("GWT_11","서버 보상"),260),this.tapReward.x=this.tapDesc.x+this.tapDesc.width+4,this.tapReward.y=this.tapDesc.y,this.tapReward.onClick=this.onRewardTap.bind(this),this.contentContainer.addChild(this.tapReward),this.battleContainer=new Ve,this.contentContainer.addChild(this.battleContainer); + const i=sD.DEFAULT_OUTLINE_FONT_OPTION_16; + this.lblHdrRound=new QD("",8947848,i),this.lblHdrWinLose=new QD("",8947848,i),this.lblHdrGem=new QD("",8947848,i),this.lblHdrHonor=new QD("",8947848,i),this.lblHdrGuild=new QD("",8947848,i),this.battleContainer.addChild(this.lblHdrRound),this.battleContainer.addChild(this.lblHdrWinLose),this.battleContainer.addChild(this.lblHdrGem),this.battleContainer.addChild(this.lblHdrHonor),this.battleContainer.addChild(this.lblHdrGuild),this.rewardBattleList=new TR(Tri,Tri.ITEM_WIDTH,t.LIST_HEIGHT,2),this.rewardBattleList.x=t.REWARD_LIST_X,this.battleContainer.addChild(this.rewardBattleList),this.serverContainer=new Ve,this.serverContainer.visible=!1,this.contentContainer.addChild(this.serverContainer),this.lblHdrRoundServer=new QD("",8947848,i),this.lblHdrMedalServer=new QD("",8947848,i),this.lblHdrGemServer=new QD("",8947848,i),this.lblHdrHonorServer=new QD("",8947848,i),this.lblHdrGuildServer=new QD("",8947848,i),this.lblHdrMedalServer.align="center",this.serverContainer.addChild(this.lblHdrRoundServer),this.serverContainer.addChild(this.lblHdrMedalServer),this.serverContainer.addChild(this.lblHdrGemServer),this.serverContainer.addChild(this.lblHdrHonorServer),this.serverContainer.addChild(this.lblHdrGuildServer),this.rewardServerList=new TR(Ori,Ori.ITEM_WIDTH,t.LIST_HEIGHT,2),this.rewardServerList.x=t.REWARD_LIST_X,this.serverContainer.addChild(this.rewardServerList),this.outSideClickHide=!0} + static getInstance(){ + return this._instance||(this._instance=new t),this._instance} + async showGuide(){ + const t=SD.getTournamentSchedule(); + if(null==t)return; + let i=RB.getText("GWT_1","서버 대항전"),s=1==t.split?"Mid":"Final"; + i+=` (Season ${ + t.season} + - ${ + s} + )`,this.title=i,this.tapDesc.text=RB.getText("GWT_9","라운드별 전투 보상"),this.tapReward.text=RB.getText("GWT_11","서버 보상"),this.refreshRewardHeaders(); + let e=[...SD.rewardBattleList.sort((t,i)=>i.kindNum-t.kindNum)].concat([...SD.rewardBattleLostList.sort((t,i)=>i.kindNum-t.kindNum)]); + this.rewardBattleList.dataProvider=e,this.rewardBattleList.scrollTo(0),this.rewardServerList.dataProvider=SD.rewardServerList,this.rewardServerList.scrollTo(0),this.tapDesc.selected=!0,this.tapReward.selected=!1,this.battleContainer.visible=!0,this.serverContainer.visible=!1,await this.loadImage(),super.show()} + refreshRewardHeaders(){ + this.lblHdrRound.text=RB.getText("GWT_10","라운드"),this.lblHdrWinLose.text=RB.getText("GAME_116","승패"),this.lblHdrGem.text=RB.getText("COMMON_350","보석"),this.lblHdrHonor.text=RB.getText("GAME_88","명예코인"),this.lblHdrGuild.text=RB.getText("GAME_812","길드코인"),this.lblHdrRoundServer.text=RB.getText("GAME_116","승패"); + const i=Math.floor(SD.rewardServerList[0].medalBuffTime/60/24); + this.lblHdrMedalServer.text=RB.getText("CASTLE_SPECIAL_NAME_6","훈장버프")+`\n(${ + i} + Days)`,this.lblHdrGemServer.text=RB.getText("COMMON_350","보석"),this.lblHdrHonorServer.text=RB.getText("GAME_88","명예코인"),this.lblHdrGuildServer.text=RB.getText("GAME_812","길드코인"); + const s=t.REWARD_LIST_X,e=t.CONTENT_Y; + this.lblHdrRound.x=s+.5*(120-this.lblHdrRound.width),this.lblHdrWinLose.x=s+Tri.winLoseX,this.lblHdrGem.x=s+Tri.gemX+10,this.lblHdrHonor.x=s+Tri.honorX,this.lblHdrGuild.x=s+Tri.guildX,this.lblHdrRound.y=e,this.lblHdrWinLose.y=e,this.lblHdrGem.y=e,this.lblHdrHonor.y=e,this.lblHdrGuild.y=e,this.lblHdrRoundServer.x=s+.5*(120-this.lblHdrRound.width),this.lblHdrMedalServer.x=s+Ori.medalX,this.lblHdrGemServer.x=s+Ori.gemX+10,this.lblHdrHonorServer.x=s+Ori.honorX,this.lblHdrGuildServer.x=s+Ori.guildX,this.lblHdrRoundServer.y=e,this.lblHdrMedalServer.y=e-.5*this.lblHdrGemServer.height,this.lblHdrGemServer.y=e,this.lblHdrHonorServer.y=e,this.lblHdrGuildServer.y=e,this.rewardBattleList.y=e+this.lblHdrRound.height+12,this.rewardServerList.y=this.lblHdrMedalServer.y+this.lblHdrMedalServer.height+12} + onDescTap(){ + this.tapDesc.selected=!0,this.tapReward.selected=!1,this.battleContainer.visible=!0,this.serverContainer.visible=!1} + onRewardTap(){ + this.tapDesc.selected=!1,this.tapReward.selected=!0,this.battleContainer.visible=!1,this.serverContainer.visible=!0} + getDefaultPositionY(){ + return.5*ES.stageHeight} + onBackButton(){ + return this.hide(),!0} + } + ; + Qt(Iri,"GuildWarTournamentRewardGuidePopup"),Zt(Iri,"_instance"),Zt(Iri,"POPUP_HEIGHT",720),Zt(Iri,"TAB_Y",80),Zt(Iri,"CONTENT_Y",145),Zt(Iri,"LIST_HEIGHT",520),Zt(Iri,"REWARD_LIST_X",30); + let kri=Iri;
SoundOptionButton 3 hunks, 210 statements
- const $hi=class t extends AYt{ - constructor(){ - super(),Xt(this,"topBg"),Xt(this,"divider1"),Xt(this,"divider2"),Xt(this,"lblMaxWave",new SD(Lhi()[0].label,14988422)),Xt(this,"lblAccWave",new SD(Lhi()[1].label,6710886)),Xt(this,"lblAccMedal",new SD(Lhi()[2].label,6710886)),Xt(this,"maxWaveArea",new $Vt),Xt(this,"accWaveArea",new $Vt),Xt(this,"accMedalArea",new $Vt),Xt(this,"list"),Xt(this,"line"),Xt(this,"myRanking"),this.initialize()} - static getInstance(){ - return null==this.instance&&(this.instance=new t),this.instance} - initialize(){ - this.setTitle(nB.getText("COMMON_20","랭킹")),this.topBg=new je(eS.getTexture("UI","Popup_Bg_01")),this.topBg.width=550,this.topBg.x=34,this.topBg.y=90,this.addChild(this.topBg),this.divider1=new je(eS.getTexture("UI","Popup_Base_01")),this.divider1.x=this.topBg.x+.33*this.topBg.width,this.divider1.y=this.topBg.y+.5*(this.topBg.height-this.divider1.height),this.addChild(this.divider1),this.divider2=new je(eS.getTexture("UI","Popup_Base_01")),this.divider2.x=this.topBg.x+.67*this.topBg.width,this.divider2.y=this.divider1.y,this.addChild(this.divider2),this.lblMaxWave.wordWrap=!0,this.lblMaxWave.wordWrapWidth=150,this.lblMaxWave.lineHeight=14,this.lblMaxWave.align="center",this.lblMaxWave.x=this.topBg.x+.5*(.33*this.topBg.width-this.lblMaxWave.width),this.lblMaxWave.y=this.topBg.y+.5*(this.topBg.height-this.lblMaxWave.height),this.addChild(this.lblMaxWave),this.lblAccWave.wordWrap=!0,this.lblAccWave.wordWrapWidth=150,this.lblAccWave.lineHeight=14,this.lblAccWave.align="center",this.lblAccWave.x=this.divider1.x+.5*(.34*this.topBg.width-this.lblAccWave.width),this.lblAccWave.y=this.topBg.y+.5*(this.topBg.height-this.lblAccWave.height),this.addChild(this.lblAccWave),this.lblAccMedal.wordWrap=!0,this.lblAccMedal.wordWrapWidth=150,this.lblAccMedal.lineHeight=14,this.lblAccMedal.align="center",this.lblAccMedal.x=this.divider2.x+.5*(.33*this.topBg.width-this.lblAccMedal.width),this.lblAccMedal.y=this.topBg.y+.5*(this.topBg.height-this.lblAccMedal.height),this.addChild(this.lblAccMedal),this.maxWaveArea.width=.33*this.topBg.width,this.maxWaveArea.height=this.topBg.height,this.accWaveArea.width=.33*this.topBg.width,this.accWaveArea.height=this.topBg.height,this.accMedalArea.width=.33*this.topBg.width,this.accMedalArea.height=this.topBg.height,this.accWaveArea.x=this.divider1.x+this.divider1.width,this.accMedalArea.x=this.divider2.x+this.divider2.width,this.maxWaveArea.alpha=0,this.accWaveArea.alpha=0,this.accMedalArea.alpha=0,this.maxWaveArea.y=this.topBg.y,this.accWaveArea.y=this.topBg.y,this.accMedalArea.y=this.topBg.y,this.maxWaveArea.eventMode="dynamic",this.maxWaveArea.on("pointertap",this.onMaxWaveClick,this),this.accWaveArea.eventMode="dynamic",this.accWaveArea.on("pointertap",this.onAccWaveClick,this),this.accMedalArea.eventMode="dynamic",this.accMedalArea.on("pointertap",this.onAccMedalClick,this),this.addChild(this.maxWaveArea),this.addChild(this.accWaveArea),this.addChild(this.accMedalArea),this.list=new E6(Hhi,570,500,2),this.list.x=this.bg.x+.5*(this.bg.width-570),this.addChild(this.list),this.line=new je(eS.getTexture("UI","Popup_Line_01")),this.line.width=547,this.line.x=this.bg.x+.5*(this.bg.width-this.line.width),this.line.y=this.list.y+this.list.height+10,this.addChild(this.line),this.myRanking=new Hhi,this.myRanking.x=this.list.x,this.myRanking.y=this.line.y+this.line.height+10,this.addChild(this.myRanking),this.myRanking.eventMode="static",this.myRanking.on("pointertap",()=>this.myRanking.onClick(0,0)),this.outSideClickHide=!0} - async setData(){ - this.setTitle(nB.getText("COMMON_20","랭킹")),this.txtTitle.x=this.topBg.x+.5*(this.topBg.width-this.txtTitle.width); - const t=Lhi(); - this.lblMaxWave.text=t[0].label,this.lblAccWave.text=t[1].label,this.lblAccMedal.text=t[2].label,await Ohi.getInstance().loadRanking(),this.list.dataProvider=Ohi.getInstance().getRankingList(),this.myRanking.setData(Ohi.getInstance().getMyRanking()),this.updateLayout()} - onMaxWaveClick(){ - Ohi.getInstance().selectedIndex=Lhi()[0].index,this.lblMaxWave.textColor=14988422,this.lblAccWave.textColor=6710886,this.lblAccMedal.textColor=6710886,this.setData()} - onAccWaveClick(){ - Ohi.getInstance().selectedIndex=Lhi()[1].index,this.lblMaxWave.textColor=6710886,this.lblAccWave.textColor=14988422,this.lblAccMedal.textColor=6710886,this.setData()} - onAccMedalClick(){ - Ohi.getInstance().selectedIndex=Lhi()[2].index,this.lblMaxWave.textColor=6710886,this.lblAccWave.textColor=6710886,this.lblAccMedal.textColor=14988422,this.setData()} - updateLayout(){ - this.list.y=this.topBg.y+this.topBg.height+17; - const t=this.bottom.y-20-this.list.y-this.myRanking.height-20; - this.list.setListHeight(t),this.line.y=this.list.y+this.list.height+10,this.myRanking.y=this.line.y+this.line.height+10} + const aoi=class extends TJt{ + constructor(t){ + super(t),Zt(this,"_enabled",!0),this.outlineText=!0} + get enabled(){ + return this._enabled} + set enabled(t){ + t!=this._enabled&&(this._enabled=t,this._enabled?(this.text="ON",this.color=TJt.COLOR_SAND_BROWN):(this.text="OFF",this.color=TJt.COLOR_GRAY))}
- qt($hi,"RankingPopup"),Xt($hi,"instance",null); + Qt(aoi,"SoundOptionButton"); + let coi=aoi; + const loi=class t extends Ve{ + constructor(i=570,s=58){ + super(),Zt(this,"barW"),Zt(this,"barH"),Zt(this,"segW"),Zt(this,"track",new ip),Zt(this,"selectedBg",new ip),Zt(this,"icons",[]),Zt(this,"labels",[]),Zt(this,"selected",0),Zt(this,"onSelect",Qt(()=>{ + } + ,"onSelect")),this.barW=i,this.barH=s; + const{ + PAD:e,GAP:n} + =t; + this.segW=(i-2*e-2*n)/3,this.track.roundRect(0,0,i,s,.5*s).fill(2300949),this.track.eventMode="none",this.addChild(this.track),this.selectedBg.eventMode="none",this.addChild(this.selectedBg); + for(let h=0; + h<3; + h++){ + const i=new Ye(kS.getTexture("UI_Ekkorr",noi[h])); + i.scale.set(26/i.texture.height),i.eventMode="none",this.addChild(i),this.icons.push(i); + const r=new QD("",t.OFF_TEXT,sD.DEFAULT_OUTLINE_FONT_OPTION_18); + r.eventMode="none",this.addChild(r),this.labels.push(r); + const o=new Ve; + o.hitArea=new Ui(e+h*(this.segW+n),0,this.segW,s),o.eventMode="static",o.cursor="pointer",o.on("pointertap",()=>this.onSelect(h)),this.addChild(o)} + } + setLabels(t){ + for(let i=0; + i<3; + i++)this.labels[i].text=t[i]??""; + this.layoutSegments()} + setSelected(i){ + this.selected=i; + const{ + PAD:s,GAP:e} + =t,n=this.barH-2*s; + this.selectedBg.clear().roundRect(s+i*(this.segW+e),s,this.segW,n,.5*n).fill(8018480); + for(let h=0; + h<3; + h++)this.labels[h].textColor=h===i?t.ON_TEXT:t.OFF_TEXT} + get selectedIndex(){ + return this.selected} + layoutSegments(){ + const{ + PAD:i,GAP:s} + =t; + for(let t=0; + t<3; + t++){ + const e=this.icons[t],n=this.labels[t]; + n.scale.set(1); + const h=this.segW-e.width-8-20; + n.width>h&&n.scale.set(h/n.width); + const r=e.width+8+n.width,o=i+t*(this.segW+s)+.5*(this.segW-r); + e.x=o,e.y=.5*(this.barH-e.height),n.x=o+e.width+8,n.y=.5*(this.barH-n.height)} + } + get barWidth(){ + return this.barW} + } + ; + Qt(loi,"RankingTabBar"),Zt(loi,"PAD",5),Zt(loi,"GAP",4),Zt(loi,"ON_TEXT",16774365),Zt(loi,"OFF_TEXT",10193523); + let uoi=loi; + const doi=class t extends Ve{ + constructor(i,s,e,n,h){ + super(),Zt(this,"badge"),Zt(this,"lblName"),Zt(this,"lblLv"),Zt(this,"pedestal",new ip),Zt(this,"pedIcon"),Zt(this,"pedValue"),Zt(this,"userName",""),this.place=i,this.badgeSize=s,this.pedH=e,this.pedColor=n,this.panelH=h,this.badge=new Ye(kS.getTexture("UI_Ekkorr",`Icon_RankBadge_0${ + i} + `)),this.badge.width=s,this.badge.height=s,this.addChild(this.badge),this.lblName=new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_17),this.addChild(this.lblName),this.lblLv=new QD("",13216120),this.lblLv.textSize=13,this.addChild(this.lblLv),this.addChild(this.pedestal),this.pedIcon=new Ye(kS.getTexture("UI_Ekkorr",noi[0])),this.addChild(this.pedIcon),this.pedValue=new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_20),this.addChild(this.pedValue); + for(const t of[this.badge,this.lblName,this.lblLv,this.pedestal,this.pedIcon,this.pedValue])t.eventMode="none"; + this.hitArea=new Ui(0,0,t.W,h),this.eventMode="static",this.cursor="pointer",this.on("pointertap",()=>{ + this.userName&&eoi.getInstance().open(this.userName)} + )} + setData(i){ + if(this.visible=void 0!==i,!i)return; + const s=t.W; + this.userName=String(i.name??""); + const e=this.panelH-this.pedH; + this.pedestal.clear().roundRect(.5*(s-156),e,156,this.pedH+14,12).fill(this.pedColor); + const n=qri.getInstance().selectedIndex; + this.pedIcon.texture=kS.getTexture("UI_Ekkorr",noi[n]??noi[0]),this.pedIcon.scale.set(22/this.pedIcon.texture.height),this.pedValue.text=hoi(i); + const h=this.pedIcon.width+6+this.pedValue.width; + this.pedIcon.x=.5*(s-h),this.pedIcon.y=e+.5*(this.pedH-this.pedIcon.height),this.pedValue.x=this.pedIcon.x+this.pedIcon.width+6,this.pedValue.y=e+.5*(this.pedH-this.pedValue.height),this.lblLv.text=`Lv.${ + Math.floor(Number(i.maxWave??0)/100)} + `,this.lblLv.x=.5*(s-this.lblLv.width),this.lblLv.y=e-8-this.lblLv.height,this.lblName.text=this.userName,this.lblName.textColor=this.userName===EG.name?16767370:16777215,this.lblName.scale.set(1); + const r=s-8; + this.lblName.width>r&&this.lblName.scale.set(r/this.lblName.width),this.lblName.x=.5*(s-this.lblName.width),this.lblName.y=this.lblLv.y-2-this.lblName.height,this.badge.x=.5*(s-this.badgeSize),this.badge.y=this.lblName.y-2-this.badgeSize} + } + ; + Qt(doi,"PodiumColumn"),Zt(doi,"W",176); + let foi=doi; + const poi=class t extends Ve{ + constructor(i=570){ + super(),Zt(this,"columns"); + const s=t.H,e=(new ip).roundRect(0,0,i,s,18).fill(2300949); + e.eventMode="none",this.addChild(e); + const n=new Ve,h=(new ip).roundRect(0,0,i,s,18).fill(16777215); + h.eventMode="none",this.addChild(h),n.mask=h,this.addChild(n),this.columns=[new foi(2,100,52,8093060,s),new foi(1,124,64,11106869,s),new foi(3,100,42,9132599,s)]; + const r=3*foi.W+20; + this.columns.forEach((t,s)=>{ + t.x=.5*(i-r)+s*(foi.W+10),n.addChild(t)} + )} + setData(t){ + this.columns[0].setData(t[1]),this.columns[1].setData(t[0]),this.columns[2].setData(t[2])} + } + ; + Qt(poi,"RankingPodium"),Zt(poi,"H",250); + let goi=poi; + function woi(t,i,s){ + if(!(t>1)||0===s.length)return null; + const e=s.find(i=>i.rank===t-1),n=s[s.length-1],h=e??(t>n.rank?n:null); + return h?{ + rank:h.rank,gap:Math.max(0,h.value-i)} + :null} + Qt(woi,"rankGap"); + const moi=class t extends gqt{ + constructor(){ + super(),Zt(this,"tabs",new uoi(t.W,58)),Zt(this,"podium",new goi(t.W)),Zt(this,"list"),Zt(this,"lblMyTitle",new QD("",13216120)),Zt(this,"myCard",new Ve),Zt(this,"myBadge",new i0t(66)),Zt(this,"myName"),Zt(this,"myLv",new QD("",16769704)),Zt(this,"myValueIcon"),Zt(this,"myValue"),Zt(this,"myGap",new QD("",16767370)),Zt(this,"lblHideTeam",new QD("",12298639)),Zt(this,"hideTeamButton",new coi("ON")),Zt(this,"savingPrivacy",!1),this.myName=new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_20),this.myValueIcon=new Ye(kS.getTexture("UI_Ekkorr",noi[0])),this.myValue=new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_20),this.initialize()} + static getInstance(){ + return null==this.instance&&(this.instance=new t),this.instance} + get contentX(){ + return this.bg.x+.5*(this.bg.width-t.W)} + initialize(){ + this.setTitle(RB.getText("COMMON_20","랭킹")),this.tabs.onSelect=t=>this.onTabSelect(t),this.addChild(this.tabs),this.addChild(this.podium),this.list=new b4(ooi,t.W,400,6),this.addChild(this.list),this.lblMyTitle.textSize=15,this.addChild(this.lblMyTitle); + const i=(new ip).roundRect(0,0,t.W,t.CARD_H,16).fill(5916464); + this.myCard.addChild(i),this.myBadge.x=8,this.myBadge.y=.5*(t.CARD_H-66),this.myCard.addChild(this.myBadge),this.myName.x=86,this.myName.y=14,this.myCard.addChild(this.myName),this.myLv.textSize=14,this.myLv.x=87,this.myLv.y=46,this.myCard.addChild(this.myLv),this.myCard.addChild(this.myValueIcon),this.myValue.textSize=22,this.myCard.addChild(this.myValue),this.myGap.textSize=15,this.myCard.addChild(this.myGap),this.addChild(this.myCard),i.eventMode="static",i.cursor="pointer",i.on("pointertap",()=>{ + const t=qri.getInstance().getMyRanking(); + (null==t?void 0:t.name)&&eoi.getInstance().open(t.name)} + ),this.lblHideTeam.textSize=16,this.lblHideTeam.setWrapWidth(400),this.addChild(this.lblHideTeam),this.hideTeamButton.scale.set(.75),this.hideTeamButton.enabled=!1,this.hideTeamButton.on("pointertap",()=>{ + this.onHideTeamClick()} + ),this.addChild(this.hideTeamButton),this.outSideClickHide=!0} + async setData(){ + this.setTitle(RB.getText("COMMON_20","랭킹")),this.txtTitle.x=this.top.x+.5*(this.top.width-this.txtTitle.width); + const t=qri.getInstance(); + this.tabs.setLabels(ioi().map(t=>t.label)),this.tabs.setSelected(t.selectedIndex),this.lblMyTitle.text=RB.getText("COMMON_374","내 순위"),this.lblHideTeam.text=RB.getText("RANKING_HIDE_TEAM","내 팀 편성 숨기기"),this.hideTeamButton.enabled=EG.hideRankingTeam,this.updateLayout(),await t.loadRanking(); + const i=t.getRankingList(); + this.podium.setData(i.slice(0,3)),this.list.dataProvider=i.slice(3),this.setMyCard(),this.updateLayout()} + setMyCard(){ + const i=qri.getInstance(),s=i.getMyRanking(),e=i.selectedIndex; + this.myBadge.setRank(Number((null==s?void 0:s.rank)??0)),this.myName.text=String((null==s?void 0:s.name)||EG.name||""),this.myLv.text=`Lv.${ + Math.floor(Number((null==s?void 0:s.maxWave)??0)/100)} + `,this.myValueIcon.texture=kS.getTexture("UI_Ekkorr",noi[e]??noi[0]),this.myValueIcon.scale.set(24/this.myValueIcon.texture.height),this.myValue.text=s?hoi(s):"0"; + const n=Qt(t=>0===e?t.maxWave:1===e?t.accuWave:t.accuMedal,"valueOf"),h=s?woi(Number(s.rank??0),Number(n(s)??0),i.getRankingList().map(t=>({ + rank:t.rank,value:Number(n(t)??0)} + ))):null; + if(this.myGap.visible=null!==h,h){ + const t=2===e?KD.displayLargeNumberAsAlphabet(h.gap):String(h.gap); + this.myGap.text=RB.getText("GAME_1918","{ + 0} + 위까지 { + 1} + ").replace(/\{ + 0\} + /g,String(h.rank)).replace(/\{ + 1\} + /g,t)} + const r=t.W-18,o=t.CARD_H,a=h?12:.5*(o-this.myValue.height); + this.myValue.x=r-this.myValue.width,this.myValue.y=a,this.myValueIcon.x=this.myValue.x-this.myValueIcon.width-6,this.myValueIcon.y=a+.5*(this.myValue.height-this.myValueIcon.height),this.myGap.x=r-this.myGap.width,this.myGap.y=50; + const c=Math.min(this.myValueIcon.x,this.myGap.visible?this.myGap.x:r)-12-this.myName.x; + this.myName.scale.set(1),this.myName.width>c&&this.myName.scale.set(c/this.myName.width)} + onTabSelect(t){ + const i=ioi()[t]; + i&&(qri.getInstance().selectedIndex=i.index,this.tabs.setSelected(t),this.setData())} + async onHideTeamClick(){ + var t; + if(!this.savingPrivacy){ + this.savingPrivacy=!0,this.hideTeamButton.eventMode="none",this.hideTeamButton.alpha=.5; + try{ + const i=await ZL.getInstance().user.updateHideRankingTeam(!EG.hideRankingTeam,!0); + if(!0!==(null==i?void 0:i.success)||"boolean"!=typeof(null==(t=i.body)?void 0:t.hideRankingTeam))throw new Error("Could not save ranking team privacy"); + EG.hideRankingTeam=i.body.hideRankingTeam,this.hideTeamButton.enabled=EG.hideRankingTeam} + catch(A0i){ + bB.getInstance().show(RB.getText("RANKING_PRIVACY_SAVE_FAILED","팀 편성 공개 설정을 저장하지 못했습니다. 다시 시도해 주세요."))} + finally{ + this.savingPrivacy=!1,this.hideTeamButton.eventMode="static",this.hideTeamButton.alpha=1} + } + } + updateLayout(){ + const i=this.contentX; + this.tabs.x=i,this.tabs.y=90,this.podium.x=i,this.podium.y=this.tabs.y+58+12; + const s=this.bottom.y-20,e=this.hideTeamButton.height,n=Math.max(e,this.lblHideTeam.height),h=s-n; + this.lblHideTeam.x=i+8,this.lblHideTeam.y=h+.5*(n-this.lblHideTeam.height),this.hideTeamButton.x=i+t.W-this.hideTeamButton.width-4,this.hideTeamButton.y=h+.5*(n-e),this.myCard.x=i,this.myCard.y=h-8-t.CARD_H,this.lblMyTitle.x=i+6,this.lblMyTitle.y=this.myCard.y-6-this.lblMyTitle.height,this.list.x=i,this.list.y=this.podium.y+goi.H+12,this.list.setListHeight(Math.max(0,this.lblMyTitle.y-10-this.list.y))} + } + ; + Qt(moi,"RankingPopup"),Zt(moi,"instance",null),Zt(moi,"W",570),Zt(moi,"CARD_H",84);
- constructor(t){ - super(t),Xt(this,"_enabled",!0),this.outlineText=!0} - get enabled(){ - return this._enabled} - set enabled(t){ - t!=this._enabled&&(this._enabled=t,this._enabled?(this.text="ON",this.color=NXt.COLOR_SAND_BROWN):(this.text="OFF",this.color=NXt.COLOR_GRAY))} - } - ; - qt(Goi,"SoundOptionButton"); - let Boi=Goi; - const Uoi=class extends He{
PVP2BattleController 22 hunks, 182 statements
- async startBattle(t=10){ + async startBattle(...t){ + return this.startMarchBattle(...t)} + async startMarchBattle(t,i,s,e,n=10,h=null,r=null){
- await this.startBattleImpl(t)} + await this.startMarchBattleImpl(t,i,s,e,n,h,r)}
- async startBattleImpl(t=10){ - this.cleanup(),eP.getInstance().setBattleContext(Wx.Pvp),IU.getInstance().setDay(),this.battleEnded=!1,this.battleResult=null,this.battleTime=0,this.killCount=0; - for(const e of this.pvpTeamVOs)null==e||e.remove(); - this.pvpTeamVOs.length=0; - const i=TR.getInstance().list,s=Math.min(i.length,10); - for(let e=0; - e<s; - e++){ - const s=i[e]; - if(s.kindNum>=1e4)continue; - const n=IR.getVO(); - n.id=-1,n.kindNum=s.kindNum,n.trans=s.trans,n.level=t,n.enhance=0,this.pvpTeamVOs.push(n)} - await DB.getInstance().setSingleBackground("images/bg/pvp.png",this.BATTLEFIELD_WIDTH,this.BATTLEFIELD_HEIGHT),nui.zoomEnabled=!1,this.cameraX=0,this.applyCameraPosition(),await this.setupEnemies(t),await this.setupHeroTeam(),await this.setupCastles(t),this.setupEnemyLists(),this.createTimerUI(),eli.getInstance().switchToBattle(this),nui.zoomEnabled=!1,this.applyCameraPosition(),IB.getInstance().remove(this.execute,this),await new Promise(t=>setTimeout(t,3e3)),this.pvpStarted=!0,IB.getInstance().add(this.execute,this)} - async startMarchBattle(t,i,s,e,n=10,h=null){ - try{ - await this.startMarchBattleImpl(t,i,s,e,n,h)} - catch(oht){ - throw eP.getInstance().setBattleContext(Wx.Normal),oht} - } - async startMarchBattleImpl(t,i,s,e,n=10,h=null){ - this.cleanup(),this.marchMode=!0,this.opTransPoints=h,eP.getInstance().setBattleContext(Wx.Pvp),IU.getInstance().setDay(),this.battleEnded=!1,this.battleResult=null,this.battleTime=0,this.killCount=0; - for(const r of this.pvpTeamVOs)null==r||r.remove(); - this.pvpTeamVOs.length=0; + async startMarchBattleImpl(t,i,s,e,n,h,r){ + this.cleanup(),this.opTransPoints=h,kP.getInstance().setBattleContext(wP.Pvp),EF.getInstance().setDay(),this.battleEnded=!1,this.battleResult=null,this.battleTime=0,this.killCount=0;
- await this.setupMarchAllies(),await this.setupMarchEnemies(s,e,n),this.setupEnemyLists(),this.createTimerUI(),eli.getInstance().switchToBattle(this),DB.getInstance().setBackground(NB.PVP2),nui.zoomEnabled=!1,IB.getInstance().remove(this.execute,this),await KB.getInstance().play(),this.pvpStarted=!0,IB.getInstance().add(this.execute,this)} - async setupMarchCastles(t){ - const i=await X3.getInstance().getUnit(gR.ElfTown5); - i.battleController=this,i.totalDamageDealt=0,this.initializeUnitByKindNum(i,10001,t,0,!0),i.detectRange=1400,i.detectRange2=i.detectRange*i.detectRange,i.atkRange=250,i.atkRange2=i.atkRange*i.atkRange,i.numShot=1,i.x=i.xDefault=this.MARCH_ENEMY_CASTLE_X,i.y=i.yDefault=this.MARCH_ENEMY_CASTLE_Y,i.healthBar.setHealthColor(!1),VB.getInstance().addChild(i),this.enemyList.push(i),this.enemyCastle=i; - const s=await X3.getInstance().getUnit(gR.ElfTown5); - s.battleController=this,s.totalDamageDealt=0,this.initializeUnitByKindNum(s,10001,t),s.detectRange=1400,s.detectRange2=s.detectRange*s.detectRange,s.atkRange=250,s.atkRange2=s.atkRange*s.atkRange,s.numShot=1,s.x=s.xDefault=this.MARCH_ALLY_CASTLE_X,s.y=s.yDefault=this.MARCH_ALLY_CASTLE_Y,s.healthBar.setHealthColor(!0),VB.getInstance().addChild(s),this.friendList.push(s),this.allyCastle=s} - async setupMarchAllies(){ - const i=this.pvpTeamVOs; - if(i&&0!==i.length)for(let s=0; - s<i.length; + await this.setupAllies(),await this.setupEnemies(s,e,n),this.setupEnemyLists(),this.createTimerUI(),Rui.getInstance().switchToBattle(this),Ydi.zoomEnabled=!1,this.applyZoom(),iU.getInstance().remove(this.execute,this),await this.arena.show((null==r?void 0:r.grade)??1),r?await this.introBanner.play(u7t.getInstance(),r.ally,r.enemy):await CU.getInstance().play(),this.pvpStarted=!0,iU.getInstance().add(this.execute,this)} + async setupAllies(){ + for(let i=0; + i<this.pvpTeamVOs.length;
- const e=i[s]; + const s=this.pvpTeamVOs[i];
- n.x=h.x,n.y=h.y,n.xDefault=h.x+320,n.yDefault=h.y,n.lookAt(1),n.totalDamageDealt=0,n.healthBar.setHealthColor(!0),n.isAir&&n.onFlyEnter(!0),VB.getInstance().addChild(n),this.friendList.push(n)} + e.x=n.x,e.y=n.y,e.xDefault=n.x+320,e.yDefault=n.y,e.lookAt(1),e.totalDamageDealt=0,e.healthBar.setHealthColor(!0),e.isAir&&e.onFlyEnter(!0),SU.getInstance().addChild(e),this.friendList.push(e),this.allyRoster.push(this.toRosterEntry(e,s.kindNum,s.trans))}
- async setupMarchEnemies(i,s,e){ + async setupEnemies(i,s,e){
- o.x=a.x,o.y=a.y,o.xDefault=a.x-320,o.yDefault=a.y,o.lookAt(-1),o.totalDamageDealt=0,o.healthBar.setHealthColor(!1),VB.getInstance().addChild(o),this.enemyList.push(o)} + o.x=a.x,o.y=a.y,o.xDefault=a.x-320,o.yDefault=a.y,o.lookAt(-1),o.totalDamageDealt=0,o.healthBar.setHealthColor(!1),SU.getInstance().addChild(o),this.enemyList.push(o),this.enemyRoster.push(this.toRosterEntry(o,h,s[n]))}
- async spawnMarchAlly(t){ - const i=await X3.getInstance().getUnit(t.className); - i.battleController=this,this.initializeUnitByKindNum(i,t.kindNum,t.level,t.trans),i.detectRange=1400,i.detectRange2=i.detectRange*i.detectRange,i.numBlock=0,i.x=-30,i.y=450+80*this.random.next(),i.xDefault=670,i.yDefault=490,i.healthBar.setHealthColor(!0),i.enemyList=this.enemyList,i.allyList=this.friendList,i.isAir&&i.onFlyEnter(!0),VB.getInstance().addChild(i),this.friendList.push(i)} - async spawnMarchEnemy(t,i){ - const s=TR.getInstance().getBookVO(t); - if(!s)return; - const e=await X3.getInstance().getUnit(s.className); - e.battleController=this,this.initializeUnitByKindNum(e,t,i,0,!0),e.detectRange=1400,e.detectRange2=e.detectRange*e.detectRange,e.numBlock=0,e.x=670,e.y=450+80*this.random.next(),e.xDefault=-30,e.yDefault=490,e.healthBar.setHealthColor(!1),e.enemyList=this.friendList,e.allyList=this.enemyList,VB.getInstance().addChild(e),this.enemyList.push(e)} - updateCamera(){ - let t=0,i=0; - for(const r of this.friendList)r!==this.allyCastle&&r.isAlive&&(t+=r.x,i++); - const s=i>0?t/i:this.ALLY_CASTLE_X,e=this.VIEWPORT_WIDTH/2-s*this.GAME_ZOOM,n=-(this.BATTLEFIELD_WIDTH*this.GAME_ZOOM-this.VIEWPORT_WIDTH),h=Math.max(n,Math.min(0,e)); - this.cameraX+=(h-this.cameraX)*this.CAMERA_LERP,this.applyCameraPosition()} - applyCameraPosition(){ + applyZoom(){ + const i=t.ZOOM,s=EF.getInstance(); + this.savedView||(this.savedView={ + scale:s.scale.x,x:s.x,y:s.y} + ),s.scale.set(i),s.x=320-320*i,s.y=ES.SAFE_AREA_TOP+640*(1-i)} + restoreZoom(){ + if(!this.savedView)return;
- t.scale.set(this.GAME_ZOOM),t.x=this.cameraX,t.y=Xy.SAFE_AREA_TOP+this.VIEWPORT_WIDTH*(1-this.GAME_ZOOM)} + t.scale.set(this.savedView.scale),t.x=this.savedView.x,t.y=this.savedView.y,this.savedView=null} + toRosterEntry(t,i,s){ + return{ + unit:t,kindNum:i,trans:s,maxHp:t.maxHp,damage:0} + } + setupEnemyLists(){ + for(const t of this.friendList)t.enemyList=this.enemyList,t.allyList=this.friendList; + for(const t of this.enemyList)t.enemyList=this.friendList,t.allyList=this.enemyList} + initializeUnitByKindNum(t,i,s=1,e=0,n=!1){ + const h=ix.getVO(); + if(h.id=-1,h.kindNum=i,h.level=s,h.enhance=0,h.trans=e,h.isEnemy=n,this.spawnedVOs.push(h),t.setData(h),t.initDelay=0,t.showTombstone=!1,n&&!t.isCastle&&this.opTransPoints){ + const s=ZR.getInstance().getTransPointMultiplierFrom(this.opTransPoints,i); + s>1&&(t.baseMaxHp*=s,t.orgMaxHp*=s,t.maxHp*=s,t.hp=t.maxHp,t.health=t.maxHp,t.baseAtkDmg*=s,t.orgAtkDmg*=s,t.atkDmg*=s,t.baseDef*=s,t.orgDef*=s,t.def*=s,t.orgPhyDef*=s,t.phyDef*=s,t.orgMagDef*=s,t.magDef*=s)} + } + isRosterAlive(t,i){ + const s=t.unit; + return s.isAlive&&!s.isSummoned&&s.kindNum===t.kindNum&&i.includes(s)} + hpEntries(t,i){ + return t.map(t=>({ + hp:t.unit.hp,maxHp:t.maxHp,alive:this.isRosterAlive(t,i)} + ))} + get allyHpRatio(){ + return h0t(this.hpEntries(this.allyRoster,this.friendList))} + get enemyHpRatio(){ + return h0t(this.hpEntries(this.enemyRoster,this.enemyList))} + isRosterWiped(t,i){ + return t.every(t=>!this.isRosterAlive(t,i))} + trackDamage(){ + for(const t of this.allyRoster)this.isRosterAlive(t,this.friendList)&&(t.damage=Math.max(t.damage,t.unit.totalDamageDealt))} + getMvp(){ + this.trackDamage(); + let t=null,i=0; + for(const s of this.allyRoster)i+=s.damage,(!t||s.damage>t.damage)&&(t=s); + return!t||t.damage<=0?null:{ + kindNum:t.kindNum,trans:t.trans,damage:t.damage,share:t.damage/i} + }
- this.removeTimerUI(),this.timerText=new jg({ + this.removeTimerUI(); + const i=u7t.getInstance(); + this.hpGauge.reset(),this.hpGauge.y=14,i.addChild(this.hpGauge),this.timerText=new dw({
- ),this.timerText.anchor.set(.5,0),this.timerText.x=320,this.timerText.y=8,$4t.getInstance().addChild(this.timerText),this.speedHelper.enter(),this.speedHelper.attachButton($4t.getInstance(),380,6)} + ),this.timerText.anchor.set(.5,0),this.timerText.x=320,this.timerText.y=8,i.addChild(this.timerText),this.speedHelper.enter(),this.speedHelper.attachButton(i,562,44)}
- this.timerText&&(this.timerText.parent&&this.timerText.parent.removeChild(this.timerText),this.timerText.destroy(),this.timerText=null)} + var t; + null==(t=this.hpGauge.parent)||t.removeChild(this.hpGauge),this.timerText&&(this.timerText.parent&&this.timerText.parent.removeChild(this.timerText),this.timerText.destroy(),this.timerText=null)}
- async setupEnemies(t){ - const i=TR.getInstance().bookList.filter(t=>t.kindNum<1e4); - if(0===i.length)return; - const s=[]; - for(let h=0; - h<this.ENEMY_COUNT; - h++){ - const t=i[this.random.nextInt(i.length)]; - s.push(t.kindNum)} - const e=(this.Y_MAX-this.Y_MIN)/(this.ENEMY_COUNT-1),n=(this.ENEMY_COUNT-1)/2; - for(let h=0; - h<this.ENEMY_COUNT; - h++){ - const i=s[h],r=TR.getInstance().getBookVO(i); - if(!r)continue; - const o=await X3.getInstance().getUnit(r.className); - o.battleController=this,o.totalDamageDealt=0,this.initializeUnitByKindNum(o,i,t,0,!0),o.detectRange=1400,o.detectRange2=o.detectRange*o.detectRange; - const a=this.Y_MIN+h*e,c=Math.abs(h-n),l=this.ENEMY_SPAWN_X+c*this.CRANE_WING_ARC; - o.x=l,o.y=a,o.xDefault=this.ALLY_CASTLE_X,o.yDefault=a,o.healthBar.setHealthColor(!1),VB.getInstance().addChild(o),this.enemyList.push(o)} - } - async setupHeroTeam(){ - const t=this.pvpTeamVOs; - if(!t||0===t.length)return; - const i=t.length,s=i>1?(this.Y_MAX-this.Y_MIN)/(i-1):0,e=(i-1)/2; - for(let n=0; - n<i; - n++){ - const h=t[n],r=h.kindNum,o=TR.getInstance().getBookVO(r); - if(!o)continue; - const a=await X3.getInstance().getUnit(o.className); - a.battleController=this,this.initializeUnitByKindNum(a,r,h.level,h.trans),a.initDelay=0,a.showTombstone=!1,a.totalDamageDealt=0,a.detectRange=1400,a.detectRange2=a.detectRange*a.detectRange,a.numBlock=0; - const c=1===i?(this.Y_MIN+this.Y_MAX)/2:this.Y_MIN+n*s,l=Math.abs(n-e),u=this.ALLY_SPAWN_X-l*this.CRANE_WING_ARC; - a.x=u,a.y=c,a.xDefault=this.ENEMY_CASTLE_X,a.yDefault=c,a.healthBar.setHealthColor(!0),VB.getInstance().addChild(a),this.friendList.push(a)} - } - async setupCastles(t){ - const i=await X3.getInstance().getUnit(gR.ElfTown5); - i.battleController=this,i.totalDamageDealt=0,this.initializeUnitByKindNum(i,10001,t,0,!0),i.detectRange=1400,i.detectRange2=i.detectRange*i.detectRange,i.atkRange=250,i.atkRange2=i.atkRange*i.atkRange,i.numShot=1,i.x=i.xDefault=this.ENEMY_CASTLE_X,i.y=i.yDefault=this.ENEMY_CASTLE_Y,i.healthBar.setHealthColor(!1),VB.getInstance().addChild(i),this.enemyList.push(i),this.enemyCastle=i; - const s=await X3.getInstance().getUnit(gR.ElfTown5); - s.battleController=this,s.totalDamageDealt=0,this.initializeUnitByKindNum(s,10001,t),s.detectRange=1400,s.detectRange2=s.detectRange*s.detectRange,s.atkRange=250,s.atkRange2=s.atkRange*s.atkRange,s.numShot=1,s.x=s.xDefault=this.ALLY_CASTLE_X,s.y=s.yDefault=this.ALLY_CASTLE_Y,s.healthBar.setHealthColor(!0),VB.getInstance().addChild(s),this.friendList.push(s),this.allyCastle=s} - setupEnemyLists(){ - for(const t of this.friendList)t.enemyList=this.enemyList,t.allyList=this.friendList; - for(const t of this.enemyList)t.enemyList=this.friendList,t.allyList=this.enemyList} - initializeUnitByKindNum(t,i,s=1,e=0,n=!1){ - const h=IR.getVO(); - if(h.id=-1,h.kindNum=i,h.level=s,h.enhance=0,h.trans=e,h.isEnemy=n,this.spawnedVOs.push(h),t.setData(h),t.initDelay=0,t.showTombstone=!1,n&&!t.isCastle&&this.opTransPoints){ - const s=TR.getInstance().getTransPointMultiplierFrom(this.opTransPoints,i); - s>1&&(t.baseMaxHp*=s,t.orgMaxHp*=s,t.maxHp*=s,t.hp=t.maxHp,t.health=t.maxHp,t.baseAtkDmg*=s,t.orgAtkDmg*=s,t.atkDmg*=s,t.baseDef*=s,t.orgDef*=s,t.def*=s,t.orgPhyDef*=s,t.phyDef*=s,t.orgMagDef*=s,t.magDef*=s)} - }
- if(this.marchMode||this.updateCamera(),this.marchMode){ - if(this.allySpawnQueue.length>0&&(this.allySpawnTimer++,this.allySpawnTimer>=this.MARCH_SPAWN_INTERVAL)){ - this.allySpawnTimer=0; - const t=this.allySpawnQueue.shift(); - this.spawnMarchAlly(t)} - if(this.enemySpawnQueue.length>0&&(this.enemySpawnTimer++,this.enemySpawnTimer>=this.MARCH_SPAWN_INTERVAL)){ - this.enemySpawnTimer=0; - const t=this.enemySpawnQueue.shift(),i=Math.floor(XD.maxWave/100); - this.spawnMarchEnemy(t.kindNum,i)} - } - if(this.timerText&&!this.battleEnded){ + if(this.battleEnded||(this.trackDamage(),this.hpGauge.setRatios(this.allyHpRatio,this.enemyHpRatio)),this.timerText&&!this.battleEnded){
- eP.getInstance().setBattleContext(Wx.Normal),this.speedHelper.detachButton(),this.speedHelper.exit(),this.removeTimerUI(),this.enemyCastle=null,this.allyCastle=null,this.pvpStarted=!1,this.opTransPoints=null,this.marchMode=!1,this.allySpawnQueue.length=0,this.enemySpawnQueue.length=0; + kP.getInstance().setBattleContext(wP.Normal),this.speedHelper.detachButton(),this.speedHelper.exit(),this.removeTimerUI(),this.introBanner.stop(),this.arena.clear(),this.pvpStarted=!1,this.opTransPoints=null,this.allyRoster.length=0,this.enemyRoster.length=0;
- nui.zoomEnabled=!0,super.cleanup()} + this.restoreZoom(),Ydi.zoomEnabled=!0,super.cleanup()}
- if(this.marchMode){ - if(0===this.enemySpawnQueue.length&&this.enemyList.every(t=>!t.isAlive))return!0; - if(this.isTimeExpired()){ - const t=this.friendList.filter(t=>t.isAlive).length,i=this.enemyList.filter(t=>t.isAlive).length; - return t>i} - return!1} - return!(!this.enemyCastle||this.enemyCastle.isAlive)||!!(this.isTimeExpired()&&this.enemyCastle&&this.allyCastle)&&this.allyCastle.hp/this.allyCastle.maxHp>this.enemyCastle.hp/this.enemyCastle.maxHp} + return!!this.isRosterWiped(this.enemyRoster,this.enemyList)||!!this.isTimeExpired()&&r0t(this.allyHpRatio,this.enemyHpRatio)}
- if(this.marchMode){ - if(0===this.allySpawnQueue.length&&this.friendList.every(t=>!t.isAlive||t.isSummoned))return!0; - if(this.isTimeExpired()){ - const t=this.friendList.filter(t=>t.isAlive).length,i=this.enemyList.filter(t=>t.isAlive).length; - return t<=i} - return!1} - return!(!this.allyCastle||this.allyCastle.isAlive)||!!(this.isTimeExpired()&&this.enemyCastle&&this.allyCastle)&&this.allyCastle.hp/this.allyCastle.maxHp<=this.enemyCastle.hp/this.enemyCastle.maxHp} + return!!this.isRosterWiped(this.allyRoster,this.friendList)||!!this.isTimeExpired()&&!r0t(this.allyHpRatio,this.enemyHpRatio)}
- A8t.getInstance().endBattle(!0),setTimeout(()=>{ - IB.getInstance().remove(this.execute,this),wZt.getInstance().showVictory()} - ,2e3)} + this.finishBattle(!0)}
- A8t.getInstance().endBattle(!1),setTimeout(()=>{ - IB.getInstance().remove(this.execute,this),wZt.getInstance().showDefeat()} + this.finishBattle(!1)} + finishBattle(t){ + this.hpGauge.setRatios(this.allyHpRatio,this.enemyHpRatio); + const i=this.getMvp(),s=t9t.getInstance().endBattle(t); + setTimeout(async()=>{ + iU.getInstance().remove(this.execute,this),T0t.getInstance().showResult(t,await s,i)}
- this.onDefeatCallback()} + this.battleEnded=!0,this.onDefeatCallback()}
HeroMassiveBuyResultPopup 1 hunks, 176 statements
- super(),Xt(this,"infoBg"),Xt(this,"lblMessage1"),Xt(this,"lblMessage2"),Xt(this,"lblMessage3"),this.title=nB.getText("GAME_258","영웅 영입 지원 이벤트"),this.width=580,this.outSideClickHide=!0,this.infoBg=new aU,this.infoBg.setIndex(2),this.infoBg.width=this.width-46,this.infoBg.x=23,this.contentContainer.addChild(this.infoBg),this.lblMessage1=new SD("",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_18),this.contentContainer.addChild(this.lblMessage1),this.lblMessage2=new SD("",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_18),this.contentContainer.addChild(this.lblMessage2),this.lblMessage3=new SD("",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_18),this.contentContainer.addChild(this.lblMessage3)} + super(),Zt(this,"slotMsg"),Zt(this,"slotMsgBg"),Zt(this,"slotContainer"),Zt(this,"slotHeroIcons"),Zt(this,"slotHeroContainer"),Zt(this,"barrackMsg"),Zt(this,"barrackMsgBg"),Zt(this,"barrackContainer"),Zt(this,"barrackHeroIcons"),Zt(this,"barrackHeroContainer"),Zt(this,"btnHistory"),Zt(this,"btnConfirm"),Zt(this,"historyDescription",""),Zt(this,"slotKindnums",[]),Zt(this,"barrackKindnums",[]),this.btnClose.removeFromParent(),this.slotContainer=new Ve,this.addChild(this.slotContainer),this.slotMsgBg=new WU,this.slotMsgBg.setIndex(2),this.slotMsgBg.width=this.width-60,this.slotContainer.addChild(this.slotMsgBg); + const t=sD.LABEL_OPTION_NO_DROP_SHADOW; + t.fill=sD.DEFAULT_COLOR,this.slotMsg=new QD("",t.fill,t),this.slotMsg.y=15,this.slotContainer.addChild(this.slotMsg),sD.setLabelWrapWidth(this.slotMsg,this.slotMsgBg.width-40),this.slotHeroIcons=[],this.slotHeroContainer=new Ve,this.slotContainer.addChild(this.slotHeroContainer),this.barrackContainer=new Ve,this.addChild(this.barrackContainer),this.barrackMsgBg=new WU,this.barrackMsgBg.setIndex(2),this.barrackMsgBg.width=this.width-60,this.barrackContainer.addChild(this.barrackMsgBg),this.barrackMsg=new QD("",t.fill,t),this.barrackMsg.y=this.slotMsg.y,this.barrackContainer.addChild(this.barrackMsg),sD.setLabelWrapWidth(this.barrackMsg,this.barrackMsgBg.width-40),this.barrackHeroIcons=[],this.barrackHeroContainer=new Ve,this.barrackContainer.addChild(this.barrackHeroContainer),this.btnHistory=new sKt(""),this.addChild(this.btnHistory),this.btnHistory.onClick=this.onHistoryBtnClick.bind(this),this.btnConfirm=new hB(""),this.addChild(this.btnConfirm),this.btnConfirm.onClick=this.onConfirmBtnClick.bind(this),this.updateLanguage()} + static getInstance(){ + return this._instance||(this._instance=new t),this._instance} + updateLanguage(){ + this.title=RB.getText("GAME_1892","대량 구매"),this.slotMsg.text=RB.getText("GAME_274","병사가 슬롯에 추가되었습니다."),this.barrackMsg.text=RB.getText("GAME_209","병사가 [병영]으로 이동했습니다."),this.btnHistory.text=RB.getText("GAME_1893","구매내역"),this.btnConfirm.text=RB.getText("COMMON_1","확인"),this.historyDescription=RB.getText("GAME_1894","대량 구매에서 획득한 내역입니다."),this.updateLayout()} + updateLayout(){ + let t=90; + this.slotContainer.visible&&(this.slotContainer.x=.5*(this.width-this.slotMsgBg.width),this.slotContainer.y=t,t+=this.slotContainer.height+50,this.slotMsg.x=.5*(this.slotMsgBg.width-this.slotMsg.width),this.slotHeroContainer.x=this.slotMsgBg.x+.5*(this.slotMsgBg.width-this.slotHeroContainer.width)),this.barrackContainer.visible&&(this.barrackContainer.x=.5*(this.width-this.barrackMsgBg.width),this.barrackContainer.y=t,t+=this.barrackContainer.height+50,this.barrackMsg.x=.5*(this.barrackMsgBg.width-this.barrackMsg.width),this.barrackHeroContainer.x=this.barrackMsgBg.x+.5*(this.barrackMsgBg.width-this.barrackHeroContainer.width)),this.btnHistory.x=.5*(this.width-this.btnHistory.width-this.btnConfirm.width-20),this.btnConfirm.x=this.btnHistory.x+this.btnHistory.width+20,this.btnHistory.y=t,this.btnConfirm.y=this.btnHistory.y,this.height=this.btnConfirm.y+this.btnConfirm.height+50} + setData(t,i,s,e){ + if(this.slotKindnums.length=0,this.barrackKindnums.length=0,e.length==s.length)NR.softCopy(t,this.barrackKindnums); + else if(e.length-s.length==t.length){ + NR.softCopy(t,this.slotKindnums); + for(let t=s.length; + t<e.length; + ++t){ + const i=ZR.getInstance().getVOWithId(e[t]); + i&&Ydi.getInstance().hireHero(i)} + } + else{ + for(let t=s.length; + t<e.length; + ++t){ + const i=ZR.getInstance().getVOWithId(e[t]); + i&&(this.slotKindnums.push(i.kindNum),Ydi.getInstance().hireHero(i))} + for(let i=this.slotKindnums.length; + i<t.length; + ++i)this.barrackKindnums.push(t[i])} + this.slotContainer.visible=this.slotKindnums.length>0,this.barrackContainer.visible=this.barrackKindnums.length>0,this.updateLanguage(); + let n=0; + if(this.slotContainer.visible){ + UXt.getInstance().isHeroSubView()&&dQt.getInstance().setData(),this.slotMsgBg.height=this.slotMsg.height+2*this.slotMsg.y,this.slotHeroContainer.removeChildren(),this.slotHeroContainer.y=this.slotMsgBg.y+this.slotMsgBg.height+20; + const t=this.setGrouping(this.slotKindnums); + this.setResult(t.kindnums,t.values,this.slotHeroIcons,this.slotHeroContainer,this.slotMsgBg),this.slotHeroContainer.children.forEach((t,i)=>{ + t.alpha=0,MR.killTweensOf(t),MR.to(t,{ + alpha:1,duration:.4,delay:n+(10+10*i)/60,ease:"power2.out",onComplete:Qt(()=>{ + t.alpha=1} + ,"onComplete")} + )} + ),n=(10+10*(this.slotHeroContainer.children.length-1))/60} + if(this.barrackContainer.visible){ + UXt.getInstance().isHeroRosterView()&&DQt.getInstance().setData(),this.barrackMsgBg.height=this.barrackMsg.height+2*this.barrackMsg.y,this.barrackHeroContainer.removeChildren(),this.barrackHeroContainer.y=this.barrackMsgBg.y+this.barrackMsgBg.height+20; + const t=this.setGrouping(this.barrackKindnums); + this.setResult(t.kindnums,t.values,this.barrackHeroIcons,this.barrackHeroContainer,this.barrackMsgBg),this.barrackHeroContainer.children.forEach((t,i)=>{ + t.alpha=0,MR.killTweensOf(t),MR.to(t,{ + alpha:1,duration:.4,delay:n+(10+10*i)/60,ease:"power2.out",onComplete:Qt(()=>{ + t.alpha=1} + ,"onComplete")} + )} + ),n+=(10+10*(this.barrackHeroContainer.children.length-1))/60} + this.updateLayout(),this.btnHistory.activated=!1,this.btnConfirm.activated=!1,setTimeout(()=>{ + this.btnHistory.activated=!0,this.btnConfirm.activated=!0} + ,1e3*n+300)} + setGrouping(t){ + const i={ + } + ; + for(const s of t)i[s]?i[s]=i[s]+1:i[s]=1; + return{ + kindnums:NR.convertToNumber(Object.keys(i)),values:NR.convertToNumber(Object.values(i))} + } + setResult(t,i,s,e,n){ + let h,r,o=0,a=0,c=0; + for(let l=0; + l<t.length; + ++l)r=ZR.getInstance().getBookVO(t[l]),r&&(c<s.length?h=s[c]:(h=new e4,h.scale=.8,s.push(h)),h.setDataWithKindNum(r.kindNum),h.setCountText(`x${ + i[l]} + `),h.x=o,h.y=a,e.addChild(h),c++,c%5==0?(o=0,a+=h.height):o+=h.width+1)} + onConfirmBtnClick(){ + this.hide()} + onHistoryBtnClick(){ + const t=this.setGrouping([...this.slotKindnums,...this.barrackKindnums]); + let i=this.getHistoryString(t.kindnums,t.values); + const s=u4.getInstance(); + s.title=RB.getText("COMMON_4","알림"),s.setPositonRatioY(.45),s.show(`${ + this.historyDescription} + \n\n${ + i} + `)} + getHistoryString(t,i){ + const s=[]; + let e; + for(let n=0; + n<t.length; + ++n)e=ZR.getInstance().getBookVO(t[n]),e&&s.push(` - ${ + RB.getText(e.getNameKey(),e.name)} + (x${ + i[n]} + )`); + return s.join("\n")} + test(t){ + let i=[67],s=[],e=[6777,6789],n=[6777,6787,6788]; + 1==t?(i=[63,65,57,63,63],s=[],e=[6789,6790,6791,6792],n=[6789,6790,6791,6792,6793,6794]):2==t?(i=[63,65,57,63,63],s=[],e=[6789,6790,6791,6792],n=[6789,6790,6791,6792]):3==t&&(i=[53,51,68,51,57,64,61,67,25,59,61,79,79,51,79,59,55,65,68,64,25,53,62,59,66,57,55,69,66,64],s=[],e=[6804,6807,7032],n=[6804,6807,7032,7033,7034,7035]),this.setData(i,s,e,n),this.show()} + } + ; + Qt(QJt,"HeroMassiveBuyResultPopup"),Zt(QJt,"_instance"); + let ZJt=QJt; + const tQt=class t extends uB{ + constructor(){ + super(),Zt(this,"lblDescription"),Zt(this,"requestPending",!1),Zt(this,"btnMedal",new m$("UI_GEM","10000","",.8,200,70)),Zt(this,"btnTicket",new m$("Ticket_UnitBuy","0/1","",.8,210,70)),Zt(this,"btnCancel",new Djt("취소",120)),Zt(this,"refreshCost",100),Zt(this,"massiveBuyCost",8e3),Zt(this,"massiveBuySize",100),this.width=620,this.height=350,this.btnClose.visible=!0,this.btnClose.onClick=this.hide.bind(this); + const t={ + ...sD.DEFAULT_FONT_OPTION_17} + ; + t.align="center",t.lineHeight=28,this.lblDescription=new QD("",sD.DEFAULT_COLOR,t),this.lblDescription.y=90,this.btnMedal.color=m$.GREEN,this.btnTicket.color=m$.GREEN,this.btnCancel.height=70,this.contentContainer.addChild(this.lblDescription,this.btnMedal,this.btnTicket,this.btnCancel),this.btnMedal.onClick=this.onMedalClick.bind(this),this.btnTicket.onClick=this.onTicketClick.bind(this),this.btnCancel.onClick=this.hide.bind(this),this.updateLanguage()} + static getInstance(){ + return this.instance||(this.instance=new t),this.instance} + udpateMassiveBuyCost(){ + const t=parseInt(SG.getInstance().getClientData("HERO_PAID_REFRESH_COST")); + this.refreshCost=isNaN(t)?100:t; + const i=parseInt(SG.getInstance().getClientData("HERO_MASSIVE_BUY_GEM_COST")); + this.massiveBuyCost=isNaN(i)?this.massiveBuyCost:i; + const s=parseInt(SG.getInstance().getClientData("HERO_MASSIVE_SIZE")); + this.massiveBuySize=isNaN(s)?this.massiveBuySize:s} + showPopup(){ + this.udpateMassiveBuyCost(),this.updateLanguage(); + const t=UYt.getInstance().getMassiveTransTicket(); + this.btnMedal.activated=EG.gem>=this.massiveBuyCost,this.btnMedal.iconLabel.text=`${ + this.massiveBuyCost} + `,this.btnTicket.iconText=`${ + t} + /1`,this.btnTicket.activated=t>=1,super.show()} + updateLanguage(){ + var t; + this.title=RB.getText("GAME_1888","영웅 대량 구매"); + const i=RB.getText("GAME_1892","대량 구매"),s=RB.getText("GAME_559","티켓"); + this.btnMedal.text=i,this.btnTicket.text=`${ + i} + (${ + s} + )`,this.btnTicket.width=Math.max(210,this.btnTicket.textLabel.width+20),this.btnCancel.text=RB.getText("COMMON_2","취소"); + const e=GB.isValidEvent(BB.HERO_RESET_EVENT)?Number(null==(t=GB.currentHeroResetEvent)?void 0:t.divide):1,n=(Number.isFinite(e)&&e>0?e:1)*Math.floor(this.massiveBuyCost/this.refreshCost),h=5*n,r=RB.getValueReplaceMulti("GAME_1889",["##","@@"],[n,h],`영웅 목록을 ${ + n} + 회 새로고침하여, 영웅 총 ${ + h} + 명을 훈장으로 한 번에 구매합니다.`),o=RB.getText("GAME_1890","구매한 영웅은 병영에 추가됩니다."),a=RB.getText("GAME_1891","영웅 대량 구매 하시겠습니까?"); + this.lblDescription.text=`${ + r} + \n${ + o} + \n\n${ + a} + `,sD.setLabelWrapWidth(this.lblDescription,this.width-70),this.lblDescription.x=.5*(this.width-this.lblDescription.width); + const c=this.btnMedal.width+this.btnTicket.width+this.btnCancel.width+20; + let l=.5*(this.width-c); + const u=this.height-this.btnMedal.height-24; + this.btnMedal.position.set(l,u),l+=this.btnMedal.width+10,this.btnTicket.position.set(l,u),l+=this.btnTicket.width+10,this.btnCancel.position.set(l,u)} + onMedalClick(){ + this.buy(!1)} + onTicketClick(){ + this.buy(!0)} + async buy(t){ + if(!this.requestPending){ + this.requestPending=!0,this.btnMedal.activated=!1,this.btnTicket.activated=!1; + try{ + const i=await ZL.getInstance().hero.buyMassiveHeroes(t); + if(!1===(null==i?void 0:i.success)||!(null==i?void 0:i.body))return void bB.getInstance().showError(i); + const s=i.body; + EG.setUserInfo(s),void 0!==s.transTicket&&UYt.getInstance().setData(s.transTicket),xH.getInstance().updateAll(),oQt.getInstance().setData(),this.hide(); + const e=(s.purchased??[]).flatMap(({ + kindNum:t,count:i} + )=>Array(Math.max(0,Number(i)||0)).fill(Number(t))),n=ZR.getInstance().getTeamIds(),h=ZJt.getInstance(); + h.setData(e,[],n,n),h.show()} + finally{ + this.requestPending=!1; + const t=UYt.getInstance().getMassiveTransTicket(); + this.btnMedal.activated=EG.gem>=this.massiveBuyCost,this.btnTicket.activated=t>=1} + } + } + } + ; + Qt(tQt,"HeroMassiveBuyPopup"),Zt(tQt,"instance"); + let iQt=tQt; + const sQt=class t extends uB{ + constructor(){ + super(),Zt(this,"infoBg"),Zt(this,"lblMessage1"),Zt(this,"lblMessage2"),Zt(this,"lblMessage3"),Zt(this,"refreshCost",100),this.title=RB.getText("GAME_258","영웅 영입 지원 이벤트"),this.width=580,this.outSideClickHide=!0,this.infoBg=new WU,this.infoBg.setIndex(2),this.infoBg.width=this.width-46,this.infoBg.x=23,this.contentContainer.addChild(this.infoBg),this.lblMessage1=new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_18),this.contentContainer.addChild(this.lblMessage1),this.lblMessage2=new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_18),this.contentContainer.addChild(this.lblMessage2),this.lblMessage3=new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_18),this.contentContainer.addChild(this.lblMessage3)}
RealmTransitionFx 5 hunks, 174 statements
- s.to(i,{ + return o.to(r,{
+ ),h} + playSoft(i){ + return this.playing=!0,this.visible=!0,this.cracks.clear(),this.ring.alpha=0,this.flash.clear().rect(0,0,t.FIELD,t.FIELD).fill(0),this.flash.alpha=0,new Promise(t=>{ + this.onFinished=t,MR.to(this.flash,{ + alpha:.9,duration:.25,ease:"power1.in",onComplete:Qt(()=>{ + Promise.resolve().then(i).catch(t=>{ + } + ).finally(()=>{ + MR.to(this.flash,{ + alpha:0,duration:.45,ease:"power1.out",onComplete:Qt(()=>this.finish(),"onComplete")} + )} + )} + ,"onComplete")} + )}
- this.cracks.clear(),this.visible=!1,this.playing=!1} + this.cracks.clear(),this.visible=!1,this.playing=!1; + const t=this.onFinished; + this.onFinished=null,null==t||t()}
- width:3+3*i,color:t.COLOR,alpha:.9} + width:3+3*t,color:this.lineColor,alpha:.9}
- qt(SU,"RealmTransitionFx"),Xt(SU,"FIELD",640),Xt(SU,"CENTER",320),Xt(SU,"COLOR",12124120); + Qt(vF,"RealmTransitionFx"),Zt(vF,"FIELD",640),Zt(vF,"CENTER",320); + let _F=vF; + const MF=class t{ + constructor(){ + Zt(this,"underRoot",new Ve),Zt(this,"overRoot",new Ve),Zt(this,"glowRoot",new Ve),Zt(this,"fogRoot",new Ve),Zt(this,"sparkRoot",new Ve),Zt(this,"runes",[]),Zt(this,"emblem",null),Zt(this,"fogs",[]),Zt(this,"fireflies",[]),Zt(this,"motes",[]),Zt(this,"runeSource",null),Zt(this,"haloTexture",t.buildGlowTexture(t.GLOW_TEX,"120,230,255")),Zt(this,"ticking",!1),Zt(this,"elapsed",0); + const i=t.FIELD; + this.underRoot.eventMode="none",this.overRoot.eventMode="none"; + const s=new Ye(t.buildGradeTexture()); + s.width=i,s.height=i,s.blendMode="multiply"; + const e=new Ye(t.buildGlowTexture(t.GLOW_TEX,"255,190,210")); + e.anchor.set(.5),e.position.set(470,40),e.width=760,e.height=360,e.alpha=.32,e.blendMode="add",this.glowRoot.addChild(e); + const n=t.buildFogTexture(); + for(const[a,c,l]of t.FOG_BANDS){ + const s=new Ye(n); + s.anchor.set(.5),s.width=t.FOG_W*l*1.6,s.height=t.FOG_H*l*.8,s.position.set(Math.random()*i,a),s.alpha=t.FOG_BAND_ALPHA,this.fogRoot.addChild(s),this.fogs.push({ + sprite:s,speed:c} + )} + this.underRoot.addChild(s,this.glowRoot,this.fogRoot); + const h=new Ye(n); + h.anchor.set(.5),h.position.set(320,i),h.width=900,h.height=210,h.alpha=t.FRONT_FOG_ALPHA; + const r=t.buildGlowTexture(t.GLOW_TEX,"190,255,235"),o=t.buildGlowTexture(t.GLOW_TEX,"255,236,170"); + for(let a=0; + a<t.FIREFLY_COUNT; + a++){ + const t=new Ye(a%3==0?o:r); + t.anchor.set(.5),t.blendMode="add",t.width=t.height=10+8*Math.random(); + const i=a%2==0,s=i?20+600*Math.random():Math.random()<.5?20+120*Math.random():500+120*Math.random(),e=i?150+150*Math.random():300+320*Math.random(); + this.sparkRoot.addChild(t),this.fireflies.push({ + sprite:t,baseX:s,baseY:e,phase:Math.random()*Math.PI*2,speed:.35+.5*Math.random(),radius:14+22*Math.random()} + )} + for(let a=0; + a<t.MOTE_COUNT; + a++){ + const i=new Ye(r); + i.anchor.set(.5),i.blendMode="add",i.width=i.height=5,this.sparkRoot.addChild(i); + const s={ + sprite:i,x:0,y:0,age:0,life:1} + ; + t.respawnMote(s,a),s.age=Math.random()*s.life,this.motes.push(s)} + this.overRoot.addChild(h,this.sparkRoot),this.underRoot.visible=!1,this.overRoot.visible=!1} + prepare(t){ + this.ensureRuneGlows(t)} + show(t){ + this.ensureRuneGlows(t),this.underRoot.visible=!0,this.overRoot.visible=!0,this.ticking||(vn.shared.add(this.tick,this),this.ticking=!0)} + hide(){ + this.underRoot.visible=!1,this.overRoot.visible=!1,this.ticking&&(vn.shared.remove(this.tick,this),this.ticking=!1)} + tick(i){ + const s=i.deltaMS/1e3,e=this.elapsed+=s,n=t.FIELD; + for(const t of this.runes){ + const i=.5+.5*Math.sin(1.1*e+t.phase); + t.sprite.alpha=.45+.55*i,t.halo&&(t.halo.alpha=.06+.12*i)} + this.emblem&&(this.emblem.alpha=.14+.06*Math.sin(.7*e)); + for(const t of this.fogs){ + const i=t.sprite; + i.x+=t.speed*s; + const e=i.width/2; + i.x>n+e?i.x=-e:i.x<-e&&(i.x=n+e)} + for(const t of this.fireflies){ + const i=e*t.speed+t.phase; + t.sprite.x=t.baseX+Math.sin(i)*t.radius,t.sprite.y=t.baseY+Math.sin(1.7*i+1.3)*t.radius*.6,t.sprite.alpha=.2+.8*Math.max(0,Math.sin(e*(1.1+t.speed)+3*t.phase))} + for(let h=0; + h<this.motes.length; + h++){ + const i=this.motes[h]; + i.age+=s,i.age>=i.life&&t.respawnMote(i,h+Math.floor(e)); + const n=i.age/i.life; + i.sprite.x=i.x+4*Math.sin(2*i.age+h),i.sprite.y=i.y-45*n,i.sprite.alpha=.9*Math.sin(Math.PI*n)} + } + static respawnMote(i,s){ + const[e,n,h,r]=t.RUNES[s%t.RUNES.length]; + i.x=e+(Math.random()-.5)*h,i.y=n+(Math.random()-.2)*r*.6,i.age=0,i.life=2.5+2*Math.random()} + ensureRuneGlows(i){ + var s,e,n; + if(this.runeSource===i&&this.runes.length>0)return; + for(const t of this.runes)t.sprite.texture.destroy(!0),t.sprite.destroy(),null==(s=t.halo)||s.destroy(); + let h; + null==(e=this.emblem)||e.texture.destroy(!0),null==(n=this.emblem)||n.destroy(),this.runes=[],this.emblem=null,this.runeSource=i; + try{ + const s=new Ye(i),e=BS.app.renderer.extract.pixels({ + target:s,resolution:1} + ); + s.destroy(),h={ + pixels:e.pixels,width:e.width,scale:e.width/t.FIELD} + } + catch(ort){ + return} + t.RUNES.forEach(([i,s,e,n],r)=>{ + const o=t.extractGlow(h,i,s,e,n,"rune",1); + if(!o)return; + const a=new Ye(this.haloTexture); + a.anchor.set(.5),a.position.set(i,s),a.width=1.9*e,a.height=1.35*n,a.blendMode="add",this.glowRoot.addChild(o,a),this.runes.push({ + sprite:o,halo:a,phase:1.3*r} + )} + ); + const[r,o,a,c]=t.EMBLEM; + this.emblem=t.extractGlow(h,r,o,a,c,"emblem",t.SOFT_RES),this.emblem&&this.glowRoot.addChild(this.emblem)} + static strokeAlpha(t,i,s,e){ + if(s<140)return 0; + const n="rune"===e?(i-t-40)/30:(s-t-25)/25; + return Math.max(0,Math.min(1,n))} + static extractGlow(i,s,e,n,h,r,o){ + const a=t.FIELD,c=t.GLOW_PAD,l=Math.max(0,s-n/2-c),u=Math.max(0,e-h/2-c),d=Math.min(a,s+n/2+c),f=Math.min(a,e+h/2+c),p=i.scale,g=Math.round(l*p),w=Math.round(u*p),m=Math.round((d-l)*p),v=Math.round((f-u)*p); + if(m<=0||v<=0)return null; + const _=document.createElement("canvas"); + _.width=m,_.height=v; + const M=_.getContext("2d"),b=M.createImageData(m,v),y=i.pixels; + for(let k=0; + k<v; + k++)for(let s=0; + s<m; + s++){ + const e=4*((w+k)*i.width+(g+s)),n=4*(k*m+s); + b.data[n]=150,b.data[n+1]=240,b.data[n+2]=255,b.data[n+3]=Math.round(255*t.strokeAlpha(y[e],y[e+1],y[e+2],r))} + M.putImageData(b,0,0); + const E=document.createElement("canvas"); + E.width=Math.max(1,Math.round(m/6)),E.height=Math.max(1,Math.round(v/6)); + const A=E.getContext("2d"); + A.imageSmoothingEnabled=!0,A.drawImage(_,0,0,E.width,E.height); + const S=Math.max(1,Math.round(m*o)),T=Math.max(1,Math.round(v*o)),C=document.createElement("canvas"); + C.width=S,C.height=T; + const O=C.getContext("2d"); + O.imageSmoothingEnabled=!0,O.drawImage(E,0,0,S,T),O.drawImage(E,0,0,S,T),O.drawImage(_,0,0,S,T); + const I=new Ye(as.from(C)); + return I.position.set(l,u),I.width=d-l,I.height=f-u,I.blendMode="add",I} + static buildGradeTexture(){ + const t=document.createElement("canvas"); + t.width=2,t.height=128; + const i=t.getContext("2d"),s=i.createLinearGradient(0,0,0,128); + return s.addColorStop(0,"rgb(150,160,215)"),s.addColorStop(.45,"rgb(175,185,225)"),s.addColorStop(1,"rgb(165,190,205)"),i.fillStyle=s,i.fillRect(0,0,2,128),as.from(t)} + static buildFogTexture(){ + const i=t.SOFT_RES,s=t.FOG_W*i,e=t.FOG_H*i,n=document.createElement("canvas"); + n.width=s,n.height=e; + const h=n.getContext("2d"); + for(let r=0; + r<90; + r++){ + const s=(30+Math.random()*(t.FOG_W-60))*i,n=.5*e+(Math.random()-.5)*e*.35,r=(16+34*Math.random())*i,o=h.createRadialGradient(s,n,0,s,n,r); + o.addColorStop(0,`rgba(228,236,255,${ + t.FOG_PUFF_ALPHA} + )`),o.addColorStop(1,"rgba(228,236,255,0)"),h.fillStyle=o,h.fillRect(s-r,n-r,2*r,2*r)} + return as.from(n)} + static buildGlowTexture(t,i){ + const s=document.createElement("canvas"); + s.width=t,s.height=t; + const e=s.getContext("2d"),n=t/2,h=e.createRadialGradient(n,n,0,n,n,n); + return h.addColorStop(0,`rgba(${ + i} + ,1)`),h.addColorStop(.35,`rgba(${ + i} + ,0.45)`),h.addColorStop(1,`rgba(${ + i} + ,0)`),e.fillStyle=h,e.fillRect(0,0,t,t),as.from(s)} + } + ; + Qt(MF,"HighlandAmbienceFx"),Zt(MF,"FIELD",640),Zt(MF,"RUNES",[[22,228,44,110],[158,190,50,110],[320,178,50,115],[483,192,50,115],[615,228,44,110]]),Zt(MF,"EMBLEM",[320,380,440,190]),Zt(MF,"GLOW_PAD",12),Zt(MF,"FIREFLY_COUNT",30),Zt(MF,"MOTE_COUNT",18),Zt(MF,"FOG_BANDS",[[285,4.4,.85],[355,-3.2,.9],[410,3,.95],[470,4,1],[560,-2.8,1.1],[620,3.6,1.2]]),Zt(MF,"SOFT_RES",.5),Zt(MF,"FOG_W",512),Zt(MF,"FOG_H",128),Zt(MF,"GLOW_TEX",32),Zt(MF,"FOG_PUFF_ALPHA",.22),Zt(MF,"FOG_BAND_ALPHA",1),Zt(MF,"FRONT_FOG_ALPHA",.75);
MeshGpuData 1 hunks, 138 statements
+ const rp=class{ + destroy(){ + } + } + ; + Qt(rp,"MeshGpuData"); + let op=rp; + const ap=class{ + constructor(t,i){ + this.localUniforms=new er({ + uTransformMatrix:{ + value:new Si,type:"mat3x3<f32>"} + ,uColor:{ + value:new Float32Array([1,1,1,1]),type:"vec4<f32>"} + ,uRound:{ + value:0,type:"f32"} + } + ),this.localUniformsBindGroup=new hr({ + 0:this.localUniforms} + ),this.renderer=t,this._adaptor=i,this._adaptor.init()} + validateRenderable(t){ + const i=this._getMeshData(t),s=i.batched,e=t.batched; + if(i.batched=e,s!==e)return!0; + if(e){ + const s=t._geometry; + if(s.indices.length!==i.indexSize||s.positions.length!==i.vertexSize)return i.indexSize=s.indices.length,i.vertexSize=s.positions.length,!0; + const e=this._getBatchableMesh(t); + return e.texture.uid!==t._texture.uid&&(e._textureMatrixUpdateId=-1),!e._batcher.checkAndUpdateTexture(e,t._texture)} + return!1} + addRenderable(t,i){ + var s,e; + const n=this.renderer.renderPipes.batch,h=this._getMeshData(t); + if(t.didViewUpdate&&(h.indexSize=null==(s=t._geometry.indices)?void 0:s.length,h.vertexSize=null==(e=t._geometry.positions)?void 0:e.length),h.batched){ + const s=this._getBatchableMesh(t); + s.setTexture(t._texture),s.geometry=t._geometry,n.addToBatch(s,i)} + else n.break(i),i.add(t)} + updateRenderable(t){ + if(t.batched){ + const i=this._getBatchableMesh(t); + i.setTexture(t._texture),i.geometry=t._geometry,i._batcher.updateElement(i)} + } + execute(t){ + if(!t.isRenderable)return; + t.state.blendMode=Ca(t.groupBlendMode,t.texture._source); + const i=this.localUniforms; + i.uniforms.uTransformMatrix=t.groupTransform,i.uniforms.uRound=this.renderer._roundPixels|t._roundPixels,i.update(),qf(t.groupColorAlpha,i.uniforms.uColor,0),this._adaptor.execute(this,t)} + _getMeshData(t){ + var i,s; + return(i=t._gpuData)[s=this.renderer.uid]||(i[s]=new op),t._gpuData[this.renderer.uid].meshData||this._initMeshData(t)} + _initMeshData(t){ + return t._gpuData[this.renderer.uid].meshData={ + batched:t.batched,indexSize:0,vertexSize:0} + ,t._gpuData[this.renderer.uid].meshData} + _getBatchableMesh(t){ + var i,s; + return(i=t._gpuData)[s=this.renderer.uid]||(i[s]=new op),t._gpuData[this.renderer.uid].batchableMesh||this._initBatchableMesh(t)} + _initBatchableMesh(t){ + const i=new hp; + return i.renderable=t,i.setTexture(t._texture),i.transform=t.groupTransform,i.roundPixels=this.renderer._roundPixels|t._roundPixels,t._gpuData[this.renderer.uid].batchableMesh=i,i} + destroy(){ + this.localUniforms=null,this.localUniformsBindGroup=null,this._adaptor.destroy(),this._adaptor=null,this.renderer=null} + } + ; + Qt(ap,"MeshPipe"); + let cp=ap; + cp.extension={ + type:[ni.WebGLPipes,ni.WebGPUPipes],name:"mesh"} + ,oi.add(cp); + const lp=class extends Ke{ + constructor(...t){ + let i=t[0]; + i instanceof Xa&&(Ki(Wi,"Mesh: use new Mesh({ + geometry, shader } + ) instead"),i={ + geometry:i,shader:t[1]} + ,t[3]&&(Ki(Wi,"Mesh: drawMode argument has been removed, use geometry.topology instead"),i.geometry.topology=t[3])); + const{ + geometry:s,shader:e,texture:n,roundPixels:h,state:r,...o} + =i; + super({ + label:"Mesh",...o} + ),this.renderPipeId="mesh",this._shader=null,this.allowChildren=!1,this.shader=e??null,this.texture=n??(null==e?void 0:e.texture)??as.WHITE,this.state=r??ur.for2d(),this._geometry=s,this._geometry.on("update",this.onViewUpdate,this),this.roundPixels=h??!1} + get material(){ + return Ki(Wi,"mesh.material property has been removed, use mesh.shader instead"),this._shader} + set shader(t){ + this._shader!==t&&(this._shader=t,this.onViewUpdate())} + get shader(){ + return this._shader} + set geometry(t){ + var i; + this._geometry!==t&&(null==(i=this._geometry)||i.off("update",this.onViewUpdate,this),t.on("update",this.onViewUpdate,this),this._geometry=t,this.onViewUpdate())} + get geometry(){ + return this._geometry} + set texture(t){ + t||(t=as.EMPTY); + const i=this._texture; + i!==t&&(i&&i.dynamic&&i.off("update",this.onViewUpdate,this),t.dynamic&&t.on("update",this.onViewUpdate,this),this.shader&&(this.shader.texture=t),this._texture=t,this.onViewUpdate())} + get texture(){ + return this._texture} + get batched(){ + return!this._shader&&!(12&this.state.data)&&this._geometry instanceof ep&&("auto"===this._geometry.batchMode?this._geometry.positions.length/2<=100:"batch"===this._geometry.batchMode)} + get bounds(){ + return this._geometry.bounds} + updateBounds(){ + this._bounds=this._geometry.bounds} + containsPoint(t){ + const{ + x:i,y:s} + =t; + if(!this.bounds.containsPoint(i,s))return!1; + const e=this.geometry.getBuffer("aPosition").data,n="triangle-strip"===this.geometry.topology?3:1; + if(this.geometry.getIndex()){ + const t=this.geometry.getIndex().data,h=t.length; + for(let r=0; + r+2<h; + r+=n){ + const n=2*t[r],h=2*t[r+1],o=2*t[r+2]; + if(Of(i,s,e[n],e[n+1],e[h],e[h+1],e[o],e[o+1]))return!0} + } + else{ + const t=e.length/2; + for(let h=0; + h+2<t; + h+=n){ + const t=2*h,n=2*(h+1),r=2*(h+2); + if(Of(i,s,e[t],e[t+1],e[n],e[n+1],e[r],e[r+1]))return!0} + } + return!1} + destroy(t){ + var i; + if(super.destroy(t),"boolean"==typeof t?t:null==t?void 0:t.texture){ + const i="boolean"==typeof t?t:null==t?void 0:t.textureSource; + this._texture.destroy(i)} + null==(i=this._geometry)||i.off("update",this.onViewUpdate,this),this._texture=null,this._geometry=null,this._shader=null} + } + ; + Qt(lp,"Mesh"); + let up=lp;
TimeOfDayManager 2 hunks, 138 statements
+ ,[hU.FIRE_LAND]:{ + 0:{ + overlayAlpha:.22,overlayTint:16763040,unitTint:16773346} + ,1:{ + overlayAlpha:.6,overlayTint:16740416,unitTint:16762020} + ,2:{ + overlayAlpha:1,overlayTint:16754824,unitTint:14203056} + ,3:{ + overlayAlpha:.45,overlayTint:16752752,unitTint:16768200} + }
+ const rF=class t{ + static setDay(i){ + t.isNight=(i-1)%10>=5} + } + ; + Qt(rF,"TimeOfDayManager"),Zt(rF,"isNight",!0); + let oF=rF; + const aF=[["FireLandPart01",69,121],["FireLandPart02",205.5,44],["FireLandPart03",296.5,23],["FireLandPart04",424.5,56],["FireLandPart05",550.5,53],["FireLandPart06",607.5,126],["FireLandPart07",199.5,45],["FireLandPart08",288,64],["FireLandPart09",213,55],["FireLandPart10",430.5,58],["FireLandPart11",57,77],["FireLandPart12",530,91],["FireLandPart13",149,98],["FireLandPart14",556.5,108],["FireLandPart15",584,160],["FireLandPart16",26.5,207],["FireLandPart17",101.5,156],["FireLandPart18",595,286],["FireLandPart19",38,264],["FireLandPart20",86,272],["FireLandPart21",22,336],["FireLandPart22",606.5,387],["FireLandPart23",46.5,419],["FireLandPart24",86.5,392],["FireLandPart25",615,422],["FireLandPart26",46.5,499],["FireLandPart27",545,435],["FireLandPart28",110,434],["FireLandPart29",621,489],["FireLandPart30",595.5,481],["FireLandPart31",112.5,519],["FireLandPart32",559.5,625],["FireLandPart33",16.5,542],["FireLandPart34",105,638],["FireLandPart35",465.5,640],["FireLandPart36",140,565],["FireLandPart37",274.5,639],["FireLandPart38",370,597]],cF=[[21.4,108.7],[116.9,62.8],[478.2,21.9],[586.9,119.9],[558.9,503.7],[163.8,592.5],[65.8,383.8],[51,238.9]],lF=[[400,306.7],[144.2,73.3],[232.5,80],[143.3,452.5],[513.3,545.8],[315,479.2],[215.8,560],[75,124.2],[450,228.3],[88.3,228.3],[442.5,558.3],[536.7,340],[207.5,316.7],[215.8,200.8],[566.7,275],[416.7,108.3],[536.7,479.2],[260,391.7],[290,137.5]],uF={ + x:.5,y:.7} + ,dF={ + x:.5,y:.75} + ,fF=class t{ + constructor(){ + Zt(this,"underRoot",new Ve),Zt(this,"overRoot",new Ve),Zt(this,"built",!1),Zt(this,"active",!1),Zt(this,"ticking",!1),Zt(this,"elapsed",0),Zt(this,"pulse",null),Zt(this,"glows",[]),Zt(this,"flames",[]),Zt(this,"embers",[]),Zt(this,"eruptGlow",null),Zt(this,"eruptFlames",[]),Zt(this,"eruptDrops",[]),Zt(this,"eruptTimer",1),Zt(this,"eruptAge",-1),Zt(this,"lastErupt",-1),this.underRoot.eventMode="none",this.overRoot.eventMode="none",this.underRoot.visible=!1,this.overRoot.visible=!1} + static getInstance(){ + return this._instance||(this._instance=new t),this._instance} + static preload(){ + return this.loading||(this.loading=Promise.all([kS.generateTexture(t.SHEET,!1).then(i=>{ + if(!i)throw new Error(`[FireLandFx] ${ + t.SHEET} + 로드 실패`)} + ),kS.getSingleTexture(t.PULSE_IMAGE).then(i=>{ + t.pulseTexture=i} + )]).then(()=>{ + } + ).catch(t=>{ + throw this.loading=null,t} + )),this.loading} + setActive(t){ + if(t!==this.active)if(this.active=t,t){ + this.built||this.build(),this.underRoot.visible=!0,this.overRoot.visible=!0; + for(const t of this.flames)t.play(); + this.ticking||(vn.shared.add(this.tick,this),this.ticking=!0)} + else{ + this.underRoot.visible=!1,this.overRoot.visible=!1; + for(const t of this.flames)t.stop(); + this.stopEruption(),this.ticking&&(vn.shared.remove(this.tick,this),this.ticking=!1)} + } + build(){ + this.built=!0; + const i=t.buildGlowTexture(64,"255,138,40"),s=t.buildGlowTexture(16,"255,176,80"); + t.pulseTexture&&(this.pulse=new Ye(t.pulseTexture),this.pulse.width=this.pulse.height=640,this.pulse.blendMode="add",this.pulse.alpha=0,this.underRoot.addChild(this.pulse)),this.eruptGlow=new Ye(i),this.eruptGlow.anchor.set(.5),this.eruptGlow.blendMode="add",this.eruptGlow.visible=!1,this.underRoot.addChild(this.eruptGlow); + for(const t of["efa_","efb_"]){ + const i=this.makeAnim(t,dF,!1); + this.eruptFlames.push(i),this.underRoot.addChild(i)} + for(const t of["eda_","edb_"]){ + const i=this.makeAnim(t,dF,!1); + i.blendMode="add",this.eruptDrops.push(i),this.underRoot.addChild(i)} + const e=new Ve,n=new Ve; + this.overRoot.addChild(e,n),cF.forEach(([t,s],h)=>{ + const r=new Ye(i); + r.anchor.set(.5),r.position.set(t,s-6),r.blendMode="add"; + const o=62+h%3*8; + r.width=r.height=o,n.addChild(r),this.glows.push({ + sprite:r,base:o,phase:Math.random()*Math.PI*2} + ); + const a=this.makeAnim(h%2==0?"fla_":"flb_",uF,!0); + a.position.set(t,s),a.scale.set(1.05*(h%3==1?-1:1),1.05),a.gotoAndPlay(Math.floor(Math.random()*a.totalFrames)),e.addChild(a),this.flames.push(a); + const c=this.makeAnim("spk_",uF,!0); + c.position.set(t,s),c.blendMode="add",c.gotoAndPlay(Math.floor(Math.random()*c.totalFrames)),n.addChild(c),this.flames.push(c)} + ); + for(let h=0; + h<t.EMBER_COUNT; + h++){ + const i=new Ye(s); + i.anchor.set(.5),i.blendMode="add"; + const e=3+3*Math.random(); + i.width=i.height=e,n.addChild(i); + const h={ + sprite:i,x:0,y:0,vy:0,age:0,life:1,phase:0} + ; + t.respawnEmber(h),h.age=Math.random()*h.life,this.embers.push(h)} + } + makeAnim(i,s,e){ + const n=new fp(kS.getTextures(t.SHEET,i,!0)); + return n.anchor.set(s.x,s.y),n.animationSpeed=t.FPS_SPEED,n.loop=e,n.eventMode="none",e||(n.visible=!1),n} + tick(i){ + const s=i.deltaMS/1e3; + this.elapsed+=s; + const e=this.elapsed,n=oF.isNight?1.25:1; + if(this.pulse){ + const t=.5+.5*Math.sin(e/8*Math.PI*2),i=.5+.5*Math.sin(2.3*e); + this.pulse.alpha=Math.min(1,(.12+.38*t+.08*i)*n)} + for(const t of this.glows){ + const i=.55+.25*Math.sin(5.1*e+t.phase)+.12*Math.sin(11.7*e+2*t.phase); + t.sprite.alpha=Math.min(1,.75*i*n); + const s=t.base*(.94+.08*Math.sin(3.3*e+t.phase)); + t.sprite.width=t.sprite.height=s} + for(const h of this.embers){ + h.age+=s,h.age>=h.life&&t.respawnEmber(h); + const i=h.age/h.life; + h.y-=h.vy*s,h.sprite.x=h.x+7*Math.sin(2.2*h.age+h.phase),h.sprite.y=h.y,h.sprite.alpha=.95*Math.sin(Math.PI*i)} + this.updateEruption(s)} + updateEruption(i){ + if(this.eruptAge>=0){ + this.eruptAge+=i; + const t=this.eruptAge/1.08; + this.eruptGlow&&(this.eruptGlow.alpha=t<1?.85*Math.sin(Math.PI*Math.min(1,t)):0),t>=1&&this.stopEruption()} + if(this.eruptTimer-=i,this.eruptTimer>0)return; + this.eruptTimer=t.ERUPT_INTERVAL; + const s=lF.length; + let e=Math.floor(Math.random()*s); + e===this.lastErupt&&(e=(e+1)%s),this.lastErupt=e; + const[n,h]=lF[e],r=e%2; + this.stopEruption(); + for(const t of[this.eruptFlames[r],this.eruptDrops[r]])t&&(t.position.set(n,h),t.visible=!0,t.onComplete=()=>t.visible=!1,t.gotoAndPlay(0)); + this.eruptGlow&&(this.eruptGlow.position.set(n,h-6),this.eruptGlow.width=this.eruptGlow.height=90,this.eruptGlow.alpha=0,this.eruptGlow.visible=!0),this.eruptAge=0} + stopEruption(){ + this.eruptAge=-1; + for(const t of[...this.eruptFlames,...this.eruptDrops])t.stop(),t.visible=!1; + this.eruptGlow&&(this.eruptGlow.visible=!1)} + static respawnEmber(t){ + t.x=8+624*Math.random(),t.y=60+580*Math.random(),t.vy=16+26*Math.random(),t.age=0,t.life=2+3*Math.random(),t.phase=Math.random()*Math.PI*2} + static buildGlowTexture(t,i){ + const s=document.createElement("canvas"); + s.width=t,s.height=t; + const e=s.getContext("2d"),n=t/2,h=e.createRadialGradient(n,n,0,n,n,n); + return h.addColorStop(0,`rgba(${ + i} + ,1)`),h.addColorStop(.35,`rgba(${ + i} + ,0.5)`),h.addColorStop(1,`rgba(${ + i} + ,0)`),e.fillStyle=h,e.fillRect(0,0,t,t),as.from(s)} + } + ; + Qt(fF,"FireLandFx"),Zt(fF,"_instance",null),Zt(fF,"SHEET","bg/fireland/FireLand"),Zt(fF,"PULSE_IMAGE","images/bg/fireland/pulse.png"),Zt(fF,"FPS_SPEED",.4),Zt(fF,"ERUPT_INTERVAL",3),Zt(fF,"EMBER_COUNT",26),Zt(fF,"pulseTexture",null),Zt(fF,"loading",null); + let pF=fF;
BannerImage 1 hunks, 118 statements
- )); - var kzt=(t=>(t.NOT_PURCHASE="NOT_PURCHASE",t.CREATED="CREATED",t.PENDING="PENDING",t.COMPLETED="COMPLETED",t.FAILED="FAILED",t))(kzt||{ - } - ); - const Rzt=class{ - constructor(){ - Xt(this,"id",-1),Xt(this,"productId",-1),Xt(this,"paybackType",""),Xt(this,"paybackValue",-1),Xt(this,"status",""),Xt(this,"paidbackAt",null)} - } - ; - qt(Rzt,"PaybackEventUserVO"); - let xzt=Rzt; - const Pzt=class{ - constructor(){ - Xt(this,"id",-1),Xt(this,"title",""),Xt(this,"description",[]),Xt(this,"startTime",null),Xt(this,"endTime",null),Xt(this,"paybackEndTime",null)} - } - ; - qt(Pzt,"PaybackEventVO"); - let Nzt=Pzt; - const Lzt=class{ - static get opened(){ - return!1} - static async getPaybackEvent(t,i=!1){ - let s=await TL.getInstance().payback.getPaybackEvent(t,i); - s=this.getTestData(),0!=s.success?(this.setData(s.body),mS.getInstance().dispatchCustomEvent("PaybackEvent")):mS.getInstance().dispatchCustomEvent("PaybackEvent")} - static setData(t){ - this.setPaybackEventData(t),this.setPaybackUserData(t)} - static setPaybackEventData(t){ - if(!t||!t.paybackEvent)return void(this.paybackEvent.id=0); - const i=t.paybackEvent; - this.paybackEvent.id=Number(i.id),this.paybackEvent.title=String(i.title),this.paybackEvent.description=String(i.description).split("|"),this.paybackEvent.startTime=new Date(i.startTime),this.paybackEvent.endTime=new Date(i.endTime),this.paybackEvent.paybackEndTime=new Date(i.paybackEndTime)} - static getEventDurationStr(t){ - const i={ - startTimeStr:"",endTimeStr:"",paybackEndTimeStr:""} - ,s="YYYY-MM-DD"; - let e="00:00:00"; - if(t.startTime){ - const n=t.startTime,h=s.replace("YYYY",String(n.getUTCFullYear())).replace("MM",rF.digit(n.getUTCMonth()+1)).replace("DD",rF.digit(n.getUTCDate())); - e=`${ - rF.digit(n.getUTCHours())} - :${ - rF.digit(n.getUTCMinutes())} - :${ - rF.digit(n.getUTCSeconds())} - `,i.startTimeStr=h} - let n="23:59:59"; - if(t.endTime){ - const e=t.endTime,h=s.replace("YYYY",String(e.getUTCFullYear())).replace("MM",rF.digit(e.getUTCMonth()+1)).replace("DD",rF.digit(e.getUTCDate())); - n=`${ - rF.digit(e.getUTCHours())} - :${ - rF.digit(e.getUTCMinutes())} - :${ - rF.digit(e.getUTCSeconds())} - `,i.endTimeStr=h} - let h="23:59:59"; - if(t.paybackEndTime){ - const e=t.paybackEndTime,n=s.replace("YYYY",String(e.getUTCFullYear())).replace("MM",rF.digit(e.getUTCMonth()+1)).replace("DD",rF.digit(e.getUTCDate())); - h=`${ - rF.digit(e.getUTCHours())} - :${ - rF.digit(e.getUTCMinutes())} - :${ - rF.digit(e.getUTCSeconds())} - `,i.paybackEndTimeStr=n} - return"00:00:00"==e&&"23:59:59"==n&&"23:59:59"==h||(i.startTimeStr+=" "+e,i.endTimeStr+=" "+n,i.paybackEndTimeStr+=" "+h),i} - static setPaybackUserData(t){ - if(!t||!t.paybacks)return; - const i=t.paybacks,s=i.length; - if(0==this.paybacks.length)for(let h=0; - h<s; - ++h)this.paybacks.push(new xzt); - let e,n; - for(let h=0; - h<s; - ++h)e=i[h],n=this.paybacks[h],n.id=Number(e.id),n.productId=Number(e.productId),n.paybackType=String(e.paybackType),n.paybackValue=Number(e.paybackValue),n.status=String(e.status),n.paidbackAt=new Date(String(e.paidbackAt))} - static isEventEnded(){ - const t=this.paybackEvent; - return t.id<0||!t.endTime||!(TP.serverTime<t.endTime.getTime())} - static isPaybackEnded(){ - const t=this.paybackEvent; - return t.id<0||!t.paybackEndTime||!(TP.serverTime<t.paybackEndTime.getTime())} - static hasReward(){ - if(1==this.isPaybackEnded())return!1; - let t; - const i=this.paybacks.length; - for(let s=0; - s<i; - ++s)if(t=this.paybacks[s],t.status==kzt.CREATED||t.status==kzt.FAILED)return!0; - return!1} - static getTestData(){ - return{ - header:{ - sts:1771417950938} - ,body:{ - paybackEvent:{ - id:7,gameId:"smith",active:1,subId:3,title:"PAYBACK_T1",description:"PAYBACK_H1|PAYBACK_H2|PAYBACK_H3|PAYBACK_H4|PAYBACK_H5|PAYBACK_H6",startTime:"2026-02-17T00:00:00.000Z",endTime:"2026-02-20T21:59:59.000Z",paybackEndTime:"2026-02-20T23:59:59.000Z"} - ,paybacks:[{ - id:21,gameId:"smith",subId:3,step:1,productId:111,reqProductId:0,paybackType:"slx",paybackValue:299,status:"COMPLETED",paidbackAt:null} - ,{ - id:22,gameId:"smith",subId:3,step:2,productId:112,reqProductId:111,paybackType:"slx",paybackValue:998,status:"CREATED",paidbackAt:null} - ,{ - id:23,gameId:"smith",subId:3,step:3,productId:113,reqProductId:112,paybackType:"slx",paybackValue:4995,status:"NOT_PURCHASE",paidbackAt:null} - ,{ - id:24,gameId:"smith",subId:3,step:4,productId:114,reqProductId:113,paybackType:"slx",paybackValue:9990,status:"NOT_PURCHASE",paidbackAt:null} - ,{ - id:25,gameId:"smith",subId:3,step:5,productId:115,reqProductId:114,paybackType:"slx",paybackValue:19980,status:"NOT_PURCHASE",paidbackAt:null} - ,{ - id:26,gameId:"smith",subId:3,step:6,productId:116,reqProductId:115,paybackType:"slx",paybackValue:49950,status:"NOT_PURCHASE",paidbackAt:null} - ,{ - id:27,gameId:"smith",subId:3,step:7,productId:117,reqProductId:116,paybackType:"slx",paybackValue:99900,status:"NOT_PURCHASE",paidbackAt:null} - ]} - ,_success_:!0,_ok_:!0,_status_:201} - } - } - ; - qt(Lzt,"PaybackEventManager"),Xt(Lzt,"paybackEvent",new Nzt),Xt(Lzt,"paybacks",[]); - let Dzt=Lzt; - const Gzt=class extends He{ + )),IYt=class extends Ve{
MeshPlane 2 hunks, 109 statements
- ...j.defaultOptions,...t} + ...K.defaultOptions,...t}
+ const Hy=class extends up{ + constructor(t){ + const{ + texture:i,verticesX:s,verticesY:e,...n} + =t,h=new $y(Xi({ + width:i.width,height:i.height,verticesX:s,verticesY:e} + )); + super(Xi({ + ...n,geometry:h,texture:i} + )),this.texture=i,this.autoResize=!0} + textureUpdated(){ + const t=this.geometry,{ + width:i,height:s} + =this.texture; + !this.autoResize||t.width===i&&t.height===s||(t.width=i,t.height=s,t.build({ + } + ))} + set texture(t){ + var i; + null==(i=this._texture)||i.off("update",this.textureUpdated,this),super.texture=t,t.on("update",this.textureUpdated,this),this.textureUpdated()} + get texture(){ + return this._texture} + destroy(t){ + this.texture.off("update",this.textureUpdated,this),super.destroy(t)} + } + ; + Qt(Hy,"MeshPlane"); + let Wy=Hy; + const Vy=(Qt(z=class extends ep{ + constructor(t){ + const{ + width:i,points:s,textureScale:e} + ={ + ...z.defaultOptions,...t} + ; + super({ + positions:new Float32Array(4*s.length),uvs:new Float32Array(4*s.length),indices:new Uint32Array(6*(s.length-1))} + ),this.points=s,this._width=i,this.textureScale=e,this._build()} + get width(){ + return this._width} + _build(){ + const t=this.points; + if(!t)return; + const i=this.getBuffer("aPosition"),s=this.getBuffer("aUV"),e=this.getIndex(); + if(t.length<1)return; + i.data.length/4!==t.length&&(i.data=new Float32Array(4*t.length),s.data=new Float32Array(4*t.length),e.data=new Uint16Array(6*(t.length-1))); + const n=s.data,h=e.data; + n[0]=0,n[1]=0,n[2]=0,n[3]=1; + let r=0,o=t[0]; + const a=this._width*this.textureScale,c=t.length; + for(let u=0; + u<c; + u++){ + const i=4*u; + if(this.textureScale>0){ + const i=o.x-t[u].x,s=o.y-t[u].y,e=Math.sqrt(i*i+s*s); + o=t[u],r+=e/a} + else r=u/(c-1); + n[i]=r,n[i+1]=0,n[i+2]=r,n[i+3]=1} + let l=0; + for(let u=0; + u<c-1; + u++){ + const t=2*u; + h[l++]=t,h[l++]=t+1,h[l++]=t+2,h[l++]=t+2,h[l++]=t+1,h[l++]=t+3} + s.update(),e.update(),this.updateVertices()} + updateVertices(){ + const t=this.points; + if(t.length<1)return; + let i,s=t[0],e=0,n=0; + const h=this.buffers[0].data,r=t.length,o=this.textureScale>0?this.textureScale*this._width/2:this._width/2; + for(let a=0; + a<r; + a++){ + const r=t[a],c=4*a; + i=a<t.length-1?t[a+1]:r,n=-(i.x-s.x),e=i.y-s.y; + const l=Math.sqrt(e*e+n*n); + l<1e-6?(e=0,n=0):(e/=l,n/=l,e*=o,n*=o),h[c]=r.x+e,h[c+1]=r.y+n,h[c+2]=r.x-e,h[c+3]=r.y-n,s=r} + this.buffers[0].update()} + update(){ + this.textureScale>0?this._build():this.updateVertices()} + } + ,"_RopeGeometry"),z); + Vy.defaultOptions={ + width:200,points:[],textureScale:0} + ; + let jy=Vy; + const Ky=(Qt(Y=class extends up{ + constructor(t){ + const{ + texture:i,points:s,textureScale:e,...n} + ={ + ...Y.defaultOptions,...t} + ,h=new jy(Xi({ + width:i.height,points:s,textureScale:e} + )); + e>0&&(i.source.style.addressMode="repeat"),super(Xi({ + ...n,texture:i,geometry:h} + )),this.autoUpdate=!0,this.onRender=this._render} + _render(){ + const t=this.geometry; + (this.autoUpdate||t._width!==this.texture.height)&&(t._width=this.texture.height,t.update())} + } + ,"_MeshRope"),Y); + Ky.defaultOptions={ + textureScale:0} + ; + let zy=Ky;
PVPResultPopup 5 hunks, 91 statements
- super(),Xt(this,"reward"),Xt(this,"lblMessage",new SD("",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_17)),Xt(this,"btnConfirm",new MF("","","확인",.8,200,70)),Xt(this,"onConfirm",null),Xt(this,"autoReturnTimer",null),this.title=nB.getText("GAME_76","무한 랭킹전"),this.reward=new gZt,this.reward.x=.5*(this.width-this.reward.width),this.lblMessage.align="center",this.lblMessage.y=85,this.contentContainer.addChild(this.reward,this.lblMessage,this.btnConfirm),this.btnConfirm.showIconLabel=!1,this.btnConfirm.showTextLabel=!0,this.btnConfirm.text=nB.getText("COMMON_1","확인"),this.btnConfirm.color=MF.GREEN,this.btnConfirm.onClick=this.onConfirmClick.bind(this),this.btnClose.visible=!1,this.outSideClickHide=!1} + super(),Zt(this,"reward"),Zt(this,"lblResult",new QD("",t.COLOR_WIN,sD.DEFAULT_OUTLINE_FONT_OPTION_32)),Zt(this,"statBox",new ip),Zt(this,"rowPoint"),Zt(this,"rowRank"),Zt(this,"rowStreak"),Zt(this,"mvpBox",new Ve),Zt(this,"mvpIcon",new e4),Zt(this,"mvpVO",null),Zt(this,"lblMvpTag",new QD("MVP",sD.COLOR_BRIGHT_ORANGE,sD.DEFAULT_OUTLINE_FONT_OPTION_18)),Zt(this,"lblMvpName",new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_17)),Zt(this,"lblMvpDmg",new QD("",13421772,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"btnConfirm",new m$("","","확인",.8,200,70)),Zt(this,"pointTween",null),Zt(this,"autoReturnTimer",null),this.title=RB.getText("GAME_76","무한 랭킹전"),this.reward=new A0t,this.statBox.eventMode="none",this.rowPoint=this.createRow(),this.rowRank=this.createRow(),this.rowStreak=this.createRow(),this.mvpIcon.setMode(i4.BOOK),this.mvpIcon.scale.set(.5),this.mvpBox.eventMode="none",this.mvpBox.addChild(this.mvpIcon,this.lblMvpTag,this.lblMvpName,this.lblMvpDmg),this.contentContainer.addChild(this.lblResult,this.statBox,this.rowPoint.root,this.rowRank.root,this.rowStreak.root,this.mvpBox,this.reward,this.btnConfirm),this.btnConfirm.showIconLabel=!1,this.btnConfirm.showTextLabel=!0,this.btnConfirm.onClick=this.onConfirmClick.bind(this),this.btnClose.visible=!1,this.outSideClickHide=!1}
- onConfirmClick(){ - this.clearAutoReturnTimer(),eli.getInstance().returnToIdleBattle(),this.hide(),LYt.getInstance().addChild(GH.getInstance()),A8t.getInstance().show(),this.onConfirm&&(this.onConfirm(),this.onConfirm=null)} - startAutoReturnTimer(){ - this.clearAutoReturnTimer(),this.autoReturnTimer=setTimeout(()=>{ - this.onConfirmClick()} - ,t.AUTO_RETURN_DELAY)} - clearAutoReturnTimer(){ - this.autoReturnTimer&&(clearTimeout(this.autoReturnTimer),this.autoReturnTimer=null)} - showVictory(t=null){ - this.onConfirm=t,this.title=nB.getText("GAME_76","무한 랭킹전"),this.lblMessage.text=nB.getText("COMMON_386","전투에 승리하였습니다."),this.lblMessage.textColor=65280,this.btnConfirm.color=MF.GREEN,this.btnConfirm.text=nB.getText("COMMON_1","확인"); - const i=Number(QD.getInstance().getClientData("PVP_WIN_REWARD_GEM")); - this.reward.setData("gem",i,-1),setTimeout(()=>{ - this.displayGemGathering(this.reward,i)} - ,200),this.updateLayout(!0),super.show(),this.startAutoReturnTimer()} + createRow(){ + const i=new Ve; + i.eventMode="none"; + const s=new QD("",12303291,sD.DEFAULT_OUTLINE_FONT_OPTION_17),e=new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_18),n=new QD("",t.COLOR_UP,sD.DEFAULT_OUTLINE_FONT_OPTION_18); + return i.addChild(s,e,n),{ + root:i,lblName:s,lblValue:e,lblDelta:n} + } + showResult(i,s,e){ + this.title=RB.getText("GAME_76","무한 랭킹전"),this.lblResult.text=i?RB.getText("COMMON_380","승리"):RB.getText("COMMON_381","패배"),this.lblResult.textColor=i?t.COLOR_WIN:t.COLOR_LOSE,this.btnConfirm.color=i?m$.GREEN:m$.RED,this.setStats(s,i),this.setMvp(e); + const n=i?Number(SG.getInstance().getClientData("PVP_WIN_REWARD_GEM")):0; + this.reward.visible=n>0,n>0&&this.reward.setData("gem",n,-1),this.updateLayout(),super.show(),this.startAutoReturnTimer(),s&&this.playPointCount(s),n>0&&setTimeout(()=>this.displayGemGathering(this.reward,n),200)} + setStats(t,i){ + const s=null!=t; + if(this.statBox.visible=s,this.rowPoint.root.visible=s,this.rowRank.root.visible=s,this.rowStreak.root.visible=null!=t&&i&&t.winStreak>=2,!t)return; + const e=t.newPoint-t.oldPoint; + this.rowPoint.lblName.text=RB.getText("COMMON_37","점수"),this.rowPoint.lblValue.text=this.arrowText(t.oldPoint.toLocaleString(),t.oldPoint.toLocaleString()),this.setDelta(this.rowPoint.lblDelta,e,`${ + e>=0?"+":""} + ${ + e} + `); + const n=Qt(t=>RB.getText("GAME_97","##위").replace("##",String(t)),"rankText"),h=t.oldRank-t.newRank; + this.rowRank.lblName.text=RB.getText("COMMON_373","순위"),this.rowRank.lblValue.text=this.arrowText(n(t.oldRank),n(t.newRank)),this.setDelta(this.rowRank.lblDelta,h,h>0?`▲${ + h} + `:h<0?"▼"+-h:"-"),this.rowStreak.lblName.text="",this.rowStreak.lblValue.text=RB.getText("GAME_1888","##연승").replace("##",String(t.winStreak)),this.rowStreak.lblValue.textColor=sD.COLOR_BRIGHT_ORANGE,this.rowStreak.lblDelta.text=""} + arrowText(t,i){ + return`${ + t} + → ${ + i} + `} + setDelta(i,s,e){ + i.text=e,i.textColor=s>0?t.COLOR_UP:s<0?t.COLOR_DOWN:11184810} + playPointCount(t){ + var i; + null==(i=this.pointTween)||i.kill(); + const s=t.oldPoint.toLocaleString(),e={ + v:t.oldPoint} + ; + this.pointTween=MR.to(e,{ + v:t.newPoint,duration:.8,delay:.35,ease:"power2.out",onUpdate:Qt(()=>{ + this.rowPoint.lblValue.text=this.arrowText(s,Math.round(e.v).toLocaleString())} + ,"onUpdate")} + )} + setMvp(t){ + var i; + if(this.mvpBox.visible=null!=t,null==(i=this.mvpVO)||i.remove(),this.mvpVO=null,!t)return; + const s=ix.getVO(); + s.kindNum=t.kindNum,s.trans=t.trans,this.mvpVO=s,this.mvpIcon.setData(s); + const e=ZR.getInstance().getBookVO(t.kindNum); + this.lblMvpName.text=e?RB.getText(e.getNameKey(),e.name):"",this.lblMvpDmg.text=`${ + KD.displayLargeNumberAsAlphabet(Math.floor(t.damage))} + (${ + Math.round(100*t.share)} + %)`} + updateLayout(){ + const i=this.width,s=t.BOX_X,e=t.BOX_W,n=t.ROW_H; + this.lblResult.x=.5*(i-this.lblResult.width),this.lblResult.y=66; + let h=this.lblResult.y+this.lblResult.height+14; + if(this.statBox.visible){ + const t=[this.rowPoint,this.rowRank,this.rowStreak].filter(t=>t.root.visible),r=t.length*n+12; + this.statBox.clear(),this.statBox.roundRect(s,h,e,r,12).fill({ + color:0,alpha:.35} + ); + let o=h+6; + for(const i of t)i.root.y=o,i.lblName.x=s+24,i.lblName.y=.5*(n-i.lblName.height),i.lblValue.x=s+150,i.lblValue.y=.5*(n-i.lblValue.height),i.lblDelta.x=s+e-24-i.lblDelta.width,i.lblDelta.y=.5*(n-i.lblDelta.height),o+=n; + this.rowStreak.root.visible&&(this.rowStreak.lblValue.x=.5*(i-this.rowStreak.lblValue.width)),h+=r+14} + if(this.mvpBox.visible){ + this.mvpBox.y=h,this.mvpIcon.x=s+16,this.mvpIcon.y=0; + const t=this.mvpIcon.height; + this.lblMvpTag.x=this.mvpIcon.x+this.mvpIcon.width+14,this.lblMvpTag.y=.5*(t-this.lblMvpTag.height),this.lblMvpName.x=this.lblMvpTag.x+this.lblMvpTag.width+10,this.lblMvpName.y=.5*(t-this.lblMvpName.height),this.lblMvpDmg.x=s+e-24-this.lblMvpDmg.width,this.lblMvpDmg.y=.5*(t-this.lblMvpDmg.height),h+=t+18} + this.reward.visible&&(this.reward.x=.5*(i-this.reward.width),this.reward.y=h,h+=this.reward.height+22),this.btnConfirm.x=.5*(i-this.btnConfirm.width),this.btnConfirm.y=h,this.height=this.btnConfirm.y+this.btnConfirm.height+40}
- let s=t.getGlobalPosition(),e=Xy.stage.toLocal(s); + const s=t.getGlobalPosition(),e=ES.stage.toLocal(s);
- showDefeat(t=null){ - this.onConfirm=t,this.title=nB.getText("GAME_76","무한 랭킹전"),this.lblMessage.text=nB.getText("COMMON_387","전투에 패배하였습니다."),this.lblMessage.textColor=16711680,this.btnConfirm.color=MF.RED,this.btnConfirm.text=nB.getText("COMMON_1","확인"),this.updateLayout(!1),super.show(),this.startAutoReturnTimer()} - updateLayout(t){ - this.lblMessage.x=.5*(this.width-this.lblMessage.width),this.lblMessage.y=85,this.reward.y=this.lblMessage.y+this.lblMessage.height+40,t?(this.reward.visible=!0,this.btnConfirm.y=this.reward.y+this.reward.height+40):(this.reward.visible=!1,this.btnConfirm.y=this.lblMessage.y+this.lblMessage.height+40),this.btnConfirm.x=.5*(this.width-this.btnConfirm.width),this.height=this.btnConfirm.y+this.btnConfirm.height+60} + onConfirmClick(){ + var t; + this.clearAutoReturnTimer(),null==(t=this.pointTween)||t.kill(),this.pointTween=null,Rui.getInstance().returnToIdleBattle(),this.hide(),Cqt.getInstance().addChild(xH.getInstance()),t9t.getInstance().show()} + startAutoReturnTimer(){ + this.clearAutoReturnTimer(); + let i=t.AUTO_RETURN_SEC; + this.updateConfirmText(i),this.autoReturnTimer=setInterval(()=>{ + i--,i<=0?this.onConfirmClick():this.updateConfirmText(i)} + ,1e3)} + updateConfirmText(t){ + this.btnConfirm.text=`${ + RB.getText("COMMON_1","확인")} + (${ + t} + )`} + clearAutoReturnTimer(){ + this.autoReturnTimer&&(clearInterval(this.autoReturnTimer),this.autoReturnTimer=null)}
- qt(mZt,"PVPResultPopup"),Xt(mZt,"_instance"),Xt(mZt,"AUTO_RETURN_DELAY",5e3); + Qt(S0t,"PVPResultPopup"),Zt(S0t,"_instance"),Zt(S0t,"AUTO_RETURN_SEC",8),Zt(S0t,"BOX_X",40),Zt(S0t,"BOX_W",500),Zt(S0t,"ROW_H",40),Zt(S0t,"COLOR_UP",6742138),Zt(S0t,"COLOR_DOWN",16738922),Zt(S0t,"COLOR_WIN",16765514),Zt(S0t,"COLOR_LOSE",16734810);
BattleController 15 hunks, 78 statements
+ if(this.realmIntroHold)return;
- ,"execute")),Xt(this,"zoom",1),Xt(this,"zooming",!1),FU.getInstance().initialize()} + ,"execute")),Zt(this,"zoom",1),Zt(this,"zooming",!1),Zt(this,"realmIntroHold",!1),LF.getInstance().initialize()}
- this.isFirstWave=!0,this.initRandom(),y0.reset(),this.map.load(RB(XD.wave),PB(XD.wave)),sU.getInstance().updateSeason(this.map.getSeason(),!0),IU.getInstance().setTimeOfDay(XD.wave,!0),this.reviveGoldBuff=Math.max(1,Math.min(3,1+.2*XD.numRevive)),this.player=await X3.getInstance().getUnit(Cx.getInstance().castleVO.className),this.player.battleController=this,this.player.id=0,this.player.numShot=1,Cx.getInstance().castleVO.extraLevel=Fx.getCitadelOwnershipTotalWithAwakening(GR.CastleLevelUp),this.player.setData(Cx.getInstance().castleVO),this.player.numBlock=0; + this.isFirstWave=!0,this.initRandom(),_1.reset(),this.map.load(nU(EG.wave),this.startRealmFor(EG.wave)),GU.getInstance().updateSeason(this.map.getSeason(),!0),EF.getInstance().setTimeOfDay(EG.wave,!0,this.map.getRealm()),this.refreshRealmHud(),this.reviveGoldBuff=Math.max(1,Math.min(3,1+.2*EG.numRevive)),this.player=await q6.getInstance().getUnit(tP.getInstance().castleVO.className),this.player.battleController=this,this.player.id=0,this.player.numShot=1,tP.getInstance().castleVO.extraLevel=fP.getCitadelOwnershipTotalWithAwakening(lx.CastleLevelUp),this.player.setData(tP.getInstance().castleVO),this.player.numBlock=0;
- 1!==h&&(this.player.baseMaxHp*=h,this.player.orgMaxHp=this.player.maxHp=this.player.baseMaxHp,this.player.hp=this.player.maxHp),this.player.setPlayerAtkRange((null==(t=Cx.getInstance().getBookDataByKindNum(2))?void 0:t.value)??0),this.player.setPlayerAtkDuration((null==(i=Cx.getInstance().getBookDataByKindNum(3))?void 0:i.value)??0),this.player.setPlayerNumShot((null==(s=Cx.getInstance().getBookDataByKindNum(4))?void 0:s.value)??0),this.player.setPlayerNumBounce((null==(e=Cx.getInstance().getBookDataByKindNum(5))?void 0:e.value)??0),this.player.x=this.player.xDefault=320,this.player.y=this.player.yDefault=320,this.player.initDelay=5,this.player.hasTextEffect=!1,this.friendList.push(this.player),this.player.enemyList=this.enemyList,this.player.allyList=this.friendList,VB.getInstance().addChild(this.player),this.currentWave=XD.wave||1,this.waveTimer=0,this.waveDuration=600,this.rushTime=420,sui.releaseAll(this.spawnSchedule),this.spawnScheduleIndex=0,this.allEnemiesSpawned=!1,this.totalEnemiesInWave=0,this.bossSpawned=!1,this.isGameOverFlag=!1,this.shownDialogueWaves.clear(),xli.getInstance().updateDay(XD.wave),ND.getInstance().startUpdate(),this.updateReviveGoldBuff(),this.startNewWave(); + 1!==h&&(this.player.baseMaxHp*=h,this.player.orgMaxHp=this.player.maxHp=this.player.baseMaxHp,this.player.hp=this.player.maxHp),this.player.setPlayerAtkRange((null==(t=tP.getInstance().getBookDataByKindNum(2))?void 0:t.value)??0),this.player.setPlayerAtkDuration((null==(i=tP.getInstance().getBookDataByKindNum(3))?void 0:i.value)??0),this.player.setPlayerNumShot((null==(s=tP.getInstance().getBookDataByKindNum(4))?void 0:s.value)??0),this.player.setPlayerNumBounce((null==(e=tP.getInstance().getBookDataByKindNum(5))?void 0:e.value)??0),this.player.x=this.player.xDefault=320,this.player.y=this.player.yDefault=320,this.player.initDelay=5,this.player.hasTextEffect=!1,this.friendList.push(this.player),this.player.enemyList=this.enemyList,this.player.allyList=this.friendList,SU.getInstance().addChild(this.player),this.applyCastleSkin(this.map.getRealm()),this.currentWave=EG.wave||1,this.waveTimer=0,this.waveDuration=600,this.rushTime=420,Kdi.releaseAll(this.spawnSchedule),this.spawnScheduleIndex=0,this.allEnemiesSpawned=!1,this.totalEnemiesInWave=0,this.bossSpawned=!1,this.isGameOverFlag=!1,this.shownDialogueWaves.clear(),cdi.getInstance().updateDay(EG.wave),oG.getInstance().startUpdate(),this.updateReviveGoldBuff(),this.startNewWave();
- super.show(),this.map.show(),I0.setDay(XD.wave),this.map.applySeason(this.map.getSeason(),!0),sU.getInstance().updateSeason(this.map.getSeason()),IU.getInstance().setTimeOfDay(XD.wave,!0),this.player.restoreAttackRangeCircle()} + super.show(),this.map.show(),oF.setDay(EG.wave),this.map.applySeason(this.map.getSeason(),!0),GU.getInstance().updateSeason(this.map.getSeason()),EF.getInstance().setTimeOfDay(EG.wave,!0,this.map.getRealm()),this.player.restoreAttackRangeCircle()}
- return e>0&&!s&&(this.skippedWaves=Bli(t,e,eP.getInstance().getGameplayTotal(GR.AncientForestLegend)),this.skippedWaves.length>0&&(i+=this.skippedWaves.length,Gli.getInstance().show(t,i))),this.isFirstWave=!1,XD.wave=i,xli.getInstance().updateDay(XD.wave),this.skippedWaves.length>0&&xli.getInstance().showWaveSkipBonus(this.skippedWaves.length),_ai.getInstance().isRunning&&_ai.getInstance().tutorialIndex===_ai.TUTORIAL_INDEX_WAVE0&&0==_ai.getInstance().savedIndex&&(i=1,XD.wave=i,xli.getInstance().updateDay(XD.wave),_ai.getInstance().endTutorialWave0()),i} + if(e>0&&!s){ + this.skippedWaves=gdi(t,e,kP.getInstance().getGameplayTotal(lx.AncientForestLegend)); + const s=uU(t,i+this.skippedWaves.length); + this.skippedWaves=this.skippedWaves.slice(0,Math.max(0,s-i)),this.skippedWaves.length>0&&(i+=this.skippedWaves.length,pdi.getInstance().show(t,i))} + return this.isFirstWave=!1,EG.wave=i,cdi.getInstance().updateDay(EG.wave),this.skippedWaves.length>0&&cdi.getInstance().showWaveSkipBonus(this.skippedWaves.length),jci.getInstance().isRunning&&jci.getInstance().tutorialIndex===jci.TUTORIAL_INDEX_WAVE0&&0==jci.getInstance().savedIndex&&(i=1,EG.wave=i,cdi.getInstance().updateDay(EG.wave),jci.getInstance().endTutorialWave0()),i}
- gJt.getInstance().setData(),xli.getInstance().updateDay(XD.wave),J1t.getInstance().updateInfo(this.player.hp,this.player.maxHp),ND.getInstance().startUpdate(),this.lastSavedWave=XD.wave,this.lastSavedGold=XD.gold,this.startAutoSaveTimer(),XD.wave>1&&$li.getInstance().show(XD.wave),this.startNewWave(),this.updateZoom()} + dQt.getInstance().setData(),cdi.getInstance().updateDay(EG.wave),r5t.getInstance().updateInfo(this.player.hp,this.player.maxHp),oG.getInstance().startUpdate(),this.lastSavedWave=EG.wave,this.lastSavedGold=EG.gold,this.startAutoSaveTimer(),EG.wave>1&&_di.getInstance().show(EG.wave),this.startNewWave(),cU(EG.wave)===this.map.getRealm()&&this.applyCastleSkin(this.map.getRealm()),this.updateZoom()}
- const i=(this.activeWaveNumbers.length>0?Math.max(...this.activeWaveNumbers)+1:XD.wave+1)+Math.max(0,t-1); + const i=this.activeWaveNumbers.length>0?Math.max(...this.activeWaveNumbers)+1:EG.wave+1; + if(!this.canCallNextWave())return this.realmIntroHold||vH.getInstance().showMessage(Uzt(G8t.waveCallBlocked)),!1; + const s=Math.min(i+Math.max(0,t-1),this.realmStartAbove(EG.wave)-1);
- return this.spawnSchedule.splice(0,this.spawnScheduleIndex),this.spawnScheduleIndex=0,this.spawnSchedule.push(...r),this.spawnSchedule.sort((t,i)=>t.spawnTime-i.spawnTime),this.activeWaveNumbers.push(i),this.waveSpawnStatus.set(i,!1),this.totalEnemiesInWave+=h,this.allEnemiesSpawned=!1,xli.getInstance().updateWaves(this.activeWaveNumbers),!0} + return this.spawnSchedule.splice(0,this.spawnScheduleIndex),this.spawnScheduleIndex=0,this.spawnSchedule.push(...o),this.spawnSchedule.sort((t,i)=>t.spawnTime-i.spawnTime),this.activeWaveNumbers.push(s),this.waveSpawnStatus.set(s,!1),this.totalEnemiesInWave+=r,this.allEnemiesSpawned=!1,cdi.getInstance().updateWaves(this.activeWaveNumbers),!0}
- return Z1t.isWithinMaxWave(i)?QU.getInstance().getScenarioForWave(this.currentScenarioId,i)?(XD.wave=i,this.currentWave=i,xli.getInstance().updateDay(XD.wave),this.startNewWave(),"ok"):"blocked":"maxWave"} + return a5t.isWithinMaxWave(i)?this.realmIntroHold||this.crossesRealmStart(t,i)?"blocked":zF.getInstance().getScenarioForWave(this.currentScenarioId,i)?(EG.wave=i,this.currentWave=i,cdi.getInstance().updateDay(EG.wave),this.startNewWave(),"ok"):"blocked":"maxWave"}
- return QU.getInstance().getScenarioForWave(this.currentScenarioId,t)?(XD.wave=t,this.currentWave=t,xli.getInstance().updateDay(XD.wave),this.startNewWave(),"ok"):"blocked"} + return this.realmIntroHold?"blocked":zF.getInstance().getScenarioForWave(this.currentScenarioId,t)?(EG.wave=t,this.currentWave=t,cdi.getInstance().updateDay(EG.wave),this.startNewWave(),"ok"):"blocked"}
- for(const i of this.skippedWaves)this.shownDialogueWaves.has(i)||(t.push(...ZKt.getInstance().getByWave(i)),this.shownDialogueWaves.add(i)); - this.shownDialogueWaves.has(XD.wave)||(t.push(...ZKt.getInstance().getByWave(XD.wave)),this.shownDialogueWaves.add(XD.wave)),t.length>0&&eai.getInstance().showDialogues(t)} - IU.getInstance().setTimeOfDay(XD.wave),I0.setDay(XD.wave),I0.isNight?this.map.setNight():this.map.setDay(); + for(const i of this.skippedWaves)this.shownDialogueWaves.has(i)||(t.push(...tYt.getInstance().getByWave(i)),this.shownDialogueWaves.add(i)); + this.shownDialogueWaves.has(EG.wave)||(t.push(...tYt.getInstance().getByWave(EG.wave)),this.shownDialogueWaves.add(EG.wave)),t.length>0&&Ici.getInstance().showDialogues(t)} + EF.getInstance().setTimeOfDay(EG.wave,!1,this.map.getRealm()),oF.setDay(EG.wave),oF.isNight?this.map.setNight():this.map.setDay();
- const s=RB(XD.wave),e=PB(XD.wave); - XD.wave>=9950&&tui.preloadDeadLand().catch(t=>{ + const s=nU(EG.wave),e=cU(EG.wave),n=this.realmStartAbove(EG.wave); + EG.wave>=n-50&&m7t.preloadRealm(cU(n)).catch(t=>{
- ),e!==this.map.getRealm()?IU.getInstance().playRealmTransition(async()=>{ - await tui.preloadDeadLand().catch(()=>{ - } - ),this.map.applySeason(s,!0,e),IU.getInstance().setTimeOfDay(XD.wave,!0),sU.getInstance().updateSeason(this.map.getSeason(),!0)} - ):(this.map.applySeason(s),sU.getInstance().updateSeason(this.map.getSeason())); + ),e!==this.map.getRealm()?this.changeRealm(s,e):(this.map.applySeason(s),GU.getInstance().updateSeason(this.map.getSeason()));
- this.waveDuration=i.duration,this.rushTime=Math.floor(i.duration*i.rushRatio),this.totalEnemiesInWave=QU.getInstance().getTotalEnemyCount(n),sui.releaseAll(this.spawnSchedule),this.spawnSchedule=this.generateSpawnSchedule(h,r,XD.wave),this.injectBossesToSchedule(this.spawnSchedule,XD.wave),this.spawnScheduleIndex=0,this.allEnemiesSpawned=!1,this.bossSpawned=!1,this.waveTimer=0,this.castleDestroyHandled=!1,this.resetActiveWaves(),this.activeWaveNumbers.push(XD.wave),this.waveSpawnStatus.set(XD.wave,!1),this.checkGodBlessAcrossWaveJump()} + this.waveDuration=i.duration,this.rushTime=Math.floor(i.duration*i.rushRatio),this.totalEnemiesInWave=zF.getInstance().getTotalEnemyCount(h),Kdi.releaseAll(this.spawnSchedule),this.spawnSchedule=this.generateSpawnSchedule(r,o,EG.wave),this.injectBossesToSchedule(this.spawnSchedule,EG.wave),this.spawnScheduleIndex=0,this.allEnemiesSpawned=!1,this.bossSpawned=!1,this.waveTimer=0,this.castleDestroyHandled=!1,this.resetActiveWaves(),this.activeWaveNumbers.push(EG.wave),this.waveSpawnStatus.set(EG.wave,!1),this.checkGodBlessAcrossWaveJump(),this.refreshRealmHud()} + get isRealmIntroHolding(){ + return this.realmIntroHold} + realmStartAbove(t){ + return aU.find(i=>i>t)??1/0} + crossesRealmStart(t,i){ + return uU(t,i)!==i} + canCallNextWave(){ + return!this.realmIntroHold&&(this.activeWaveNumbers.length>0?Math.max(...this.activeWaveNumbers)+1:EG.wave+1)<this.realmStartAbove(EG.wave)} + startRealmFor(t){ + const i=cU(t); + return i===hU.FIRE_LAND&&Fdi.isPending()?hU.FOREST:i} + refreshRealmHud(){ + $8t.getInstance().refresh(EG.wave,this.map.getRealm())} + replayFireIntroForTest(){ + var t,i; + if(this.realmIntroHold||Fdi.isRunning)return; + null==(i=null==(t=this.player)?void 0:t.setSkin)||i.call(t,null); + const s=nU(EG.wave); + this.map.applySeason(s,!0,hU.FOREST),EF.getInstance().setTimeOfDay(EG.wave,!0,hU.FOREST),GU.getInstance().updateSeason(this.map.getSeason(),!0),this.refreshRealmHud(),this.changeRealm(s,hU.FIRE_LAND,!0)} + changeRealm(t,i,s=!1){ + const e=this.map.getRealm(),n=i===hU.FIRE_LAND&&e===hU.FOREST&&(s||Fdi.isPending()),h=Qt(async()=>{ + await m7t.preloadRealm(i).catch(()=>{ + } + ),this.map.applySeason(t,!0,i),EF.getInstance().setTimeOfDay(EG.wave,!0),GU.getInstance().updateSeason(this.map.getSeason(),!0),this.refreshRealmHud(),n||this.applyCastleSkin(i)} + ,"switchMap"); + if(n)return this.realmIntroHold=!0,void Fdi.play({ + castle:this.player,transform:Qt(()=>EF.getInstance().playRealmTransition(h,i),"transform"),canShow:Qt(()=>{ + var t; + return!0===(null==(t=this.player)?void 0:t.visible)} + ,"canShow"),hideActors:Qt(()=>this.hideFieldActors(),"hideActors"),transformCastle:Qt(()=>this.applyCastleSkin(i),"transformCastle")} + ).finally(()=>{ + this.map.getRealm()!==i&&h(),this.applyCastleSkin(i),this.realmIntroHold=!1} + ); + const r=lU(i)<lU(e); + i!==hU.FIRE_LAND||r?EF.getInstance().playRealmTransition(h,i,r):h()} + applyCastleSkin(t){ + const i=this.player; + if(!i||"function"!=typeof i.setSkin)return; + const s=lU(hU.FIRE_LAND),e=EG.maxWave>=s||lU(t)>=s; + i.setSkin(e?Ddi(Ndi()):null)} + hideFieldActors(){ + const t=[],i=Qt(i=>{ + i&&(t.push({ + c:i,v:i.visible} + ),i.visible=!1)} + ,"hide"),s=[...this.friendList.filter(t=>t!==this.player),...this.enemyList,...this.goldGoblinList,...this.adsGoblinList]; + for(const e of s)i(e),i(e.shadowSprite); + return i(PU.getInstance()),i(bU.getInstance()),()=>{ + for(const i of t)i.c.visible=i.v} + }
EventDataManager 6 hunks, 77 statements
+ static isAscentShopOpen(){ + var t; + const i=Date.parse((null==(t=this.miniAscentShop)?void 0:t.endTime)??""),s=DR.time>=0?DR.time:Date.now(); + return Number.isFinite(i)&&s<i}
+ if(this.miniAscentShop=t.body.miniAscentShop??null,t.body.attendEvent){ + const i=t.body.attendEvent,s=new FB; + s.type=6,s.id=i.id,s.startTime=i.startTime,s.endTime=i.endTime,s.message=i.message,s.image=i.image,s.rewards=i.rewards,s.attendCount=i.attendCount,s.attendedToday=i.attendedToday,s.completed=i.completed,this.objList[s.type]||(this.objList[s.type]=[]),this.objList[s.type].push(s)} + if(t.body.towerEvent){ + const i=t.body.towerEvent,s=new FB; + s.type=7,s.id=i.id,s.rewards=i.rewards,s.startTime=i.seasonStartTime,s.endTime=i.seasonEndTime,s.seasonId=i.seasonNumber,s.floors=i.floors,s.claimedFloor=i.claimedFloor,this.objList[s.type]||(this.objList[s.type]=[]),this.objList[s.type].push(s),this.isValidEvent(7)}
- if(null==i||0==i.length)return 1==t?this.currentHeroResetEvent=null:2==t?this.currentMedalEvent=null:3==t?(this.currentPaymentSpecialEvent=null,this.currentPaymentMonthEvent=null):4==t&&(this.currentMineEvent=null),!1; + if(null==i||0==i.length)return 1==t?this.currentHeroResetEvent=null:2==t?this.currentMedalEvent=null:3==t?(this.currentPaymentSpecialEvent=null,this.currentPaymentMonthEvent=null):4==t?this.currentMineEvent=null:7==t&&(this.currentTowerEvent=null),!1;
- const t=new Date; + const t=new Date(DR.time>=0?DR.time:Date.now());
+ if(6==t){ + const t=new Date(DR.time); + return i.some(i=>this.isMineEventActive(i,t))} + if(7==t){ + for(let t of i){ + const i=new Date; + if(this.isMineEventActive(t,i))return this.currentTowerEvent=t,!0} + this.currentTowerEvent=null}
+ static getActiveAttendEvent(){ + const t=this.getVOWithType(6); + return null==t||0==t.length?null:t[0]} + static hasTodayAttendReward(){ + const t=this.getActiveAttendEvent(); + return!!t&&!t.attendedToday} + static updateAttendEvent(t){ + if(!t||!t.id)return; + const i=this.getVOWithType(6); + if(null==i||0==i.length)return; + const s=i.find(i=>i.id===t.id); + s&&(s.attendCount=t.attendCount,s.attendedToday=t.attendedToday,s.completed=t.completed)} + static setEventScheduleData(t){ + if(!t)return; + const i=new Date; + i.setUTCHours(0,0,0,0),i.setUTCDate(i.getUTCDate()-2); + const s=new Date; + s.setUTCHours(0,0,0,0),s.setUTCDate(i.getUTCDate()+7); + let e=null; + t.ascentScheduled&&(e="string"==typeof t.ascentScheduled?JSON.parse(t.ascentScheduled):t.ascentScheduled); + let n=null; + n="string"==typeof t.guildWarScheduled?JSON.parse(t.guildWarScheduled):t.guildWarScheduled; + const h=t.eventScheduled; + e&&(e.type="MINI_ASCENT",h.push(e)); + const r={ + MEDAL:-1,PAYMENT:1,PET_ASSISTANT:2,LOGIN:3} + ; + if(h.sort((t,i)=>(r[t.type]??0)-(r[i.type]??0)),n){ + const t=new Date(n.firstMatchingTime.replace(" ","T")+"Z"),e=new Date(n.endTime.replace(" ","T")+"Z"); + t.getTime()<s.getTime()&&e.getTime()>=i.getTime()&&(n.type="GUILDWAR_TOURNAMENT",n.startTime=t.toISOString(),n.endTime=e.toISOString(),h.unshift(n))} + h.forEach(t=>{ + if(t.displayName)t.displayName=t.displayName; + else{ + let i="Event"; + switch(t.type){ + case"MEDAL":i=RB.getText("GAME_541","추가 훈장 이벤트"); + break; + case"HERORESET":i=RB.getText("GAME_546","영입 지원 이벤트"); + break; + case"PAYMENT":i=RB.getText("GAME_945","결제 이벤트"); + break; + case"PET_ASSISTANT":i=RB.getText("GAME_1919","비서 이벤트 (펫)"); + break; + case"MINE":i=RB.getText("GAME_1203","화석 발굴"); + break; + case"GEM_SPEND":i=RB.getText("GAME_1920","보석 소비 이벤트"); + break; + case"EVENT_ATTEND":i=RB.getText("GAME_1921","출석 이벤트"); + break; + case"TOWER":i=RB.getText("GAME_1922","도전의 탑 클리어 이벤트"); + break; + case"MINI_ASCENT":i=RB.getText("GAME_1716","군단 도전"); + break; + case"GUILDWAR_TOURNAMENT":i=RB.getText("GWT_1","서버 대항전")} + t.displayName=i} + } + ),this.eventScheduled=h}
MailVO 1 hunks, 72 statements
- )),Mzt=class t{ - static get opened(){ - return!1} - static async getMyReferralCode(){ - if(this._referralCode)return this._referralCode; - if(this.requestPending1)return this._referralCode; - this.requestPending1=!0; - const t=await TL.getInstance().referral.getMyReferralCode(); - try{ - const i=new URL(t); - Array.from(i.searchParams.keys()).length>0&&(this._referralCode=t)} - catch(i){ - } - return this.requestPending1=!1,this._referralCode} - static async getMyReferralStatus(t,i=!1){ - this.requestPending2||(this.requestPending2=!0,this.setStatusData({ - totalReferrals:10,qualifiedReferrals:7,claimed:2,milestoneRewards:[{ - milestone:10,weaponGrade:3} - ,{ - milestone:20,weaponGrade:3} - ,{ - milestone:30,weaponGrade:3} - ,{ - milestone:40,weaponGrade:4} - ,{ - milestone:50,weaponGrade:4} - ]} - ),this.requestPending2=!1,mS.getInstance().dispatchCustomEvent("ReferralStatus"))} - static setStatusData(t){ - this._totalReferrals=Number(t.totalReferrals),this._qualifiedReferrals=Number(t.qualifiedReferrals),this._claimed=Number(t.claimed); - const i=t.milestoneRewards; - if(0==this.rewardList.length&&"length"in i){ - const t=i[i.length-1].milestone; - for(let i=0; - i<t; - ++i)this.rewardList.push([{ - type:"gem",amount:this.GEM_PER_FRIEND} - ]); - const s=i.length; - for(let e=0; - e<s; - ++e){ - const t=Number(i[e].milestone),s=Number(i[e].weaponGrade); - this.rewardList[t-1].push({ - type:"weapon",amount:1,grade:s} - )} - } - } - static get totalReferrals(){ - return this._totalReferrals} - static get qualifiedReferrals(){ - return this._qualifiedReferrals} - static get claimed(){ - return this._claimed} - static getRewardList(){ - return this.rewardList} - static async claimRewards(i){ - if(this.requestPending3)return; - this.requestPending3=!0; - const s=await TL.getInstance().referral.claimReward(i,!0); - if(0==s.success){ - this.requestPending3=!1,mS.getInstance().dispatchCustomEvent("ReferralStatus"); - let e=s.errorMessage; - const n=s.error; - return"INSUFFICIENT_REFERRAL"==n?e=nB.getValueReplaceMulti("GAME_145",["##","@@"],[t.FRIEND_LEVEL,i]):"ALREADY_CLAIMED"==n&&(e=nB.getText("COMMON_276","이미 보상을 받았습니다.")),void YG.getInstance().show(e)} - "status"in s.body&&this.setStatusData(s.body.status),this.requestPending3=!1,mS.getInstance().dispatchCustomEvent("ReferralStatus",s)} - static hasReward(){ - return this.claimed<this.qualifiedReferrals} - } - ; - qt(Mzt,"FriendInviteManager"),Xt(Mzt,"FRIEND_LEVEL",50),Xt(Mzt,"GEM_PER_FRIEND",100),Xt(Mzt,"_referralCode",""),Xt(Mzt,"requestPending1",!1),Xt(Mzt,"requestPending2",!1),Xt(Mzt,"_totalReferrals",0),Xt(Mzt,"_qualifiedReferrals",0),Xt(Mzt,"_claimed",0),Xt(Mzt,"rewardList",[]),Xt(Mzt,"requestPending3",!1); - let Azt=Mzt; + ));
ShopProductResultPopup 1 hunks, 71 statements
+ )),e_i=class t extends uB{ + constructor(){ + super(),Zt(this,"items"),Zt(this,"container"),Zt(this,"btnConfirm"),this.title=RB.getText("GAME_347","상품이 지급되었습니다."),this.items=[],this.container=new Ve,this.addChild(this.container),this.btnConfirm=new hB("확인"),this.addChild(this.btnConfirm),this.btnConfirm.onClick=()=>{ + this.hide()} + ,this.updateLayout()} + static getInstance(){ + return this._instance||(this._instance=new t),this._instance} + updateLayout(){ + let t=80; + this.container.x=.5*(this.width-this.container.width),this.container.y=t,t+=this.container.height+20,this.btnConfirm.x=.5*(this.width-this.btnConfirm.width),this.btnConfirm.y=t,this.height=this.btnConfirm.y+this.btnConfirm.height+30} + setData(t){ + if(!t||!t.rewards)return; + let i,s,e; + this.title=RB.getText("GAME_347","상품이 지급되었습니다."); + let n=[],h=[],r=[],o=[],a=[],c=[],l=[]; + const u=t.rewards.length; + for(let m=0; + m<u; + ++m)if(e=t.rewards[m],i=e.type,s=e.subType,i==d4.buff)switch(s){ + case d4.ads:r.push(e); + break; + case d4.speed:o.push(e); + break; + case d4.assistant:a.push(e); + break; + case d4.bless:l.push(e)} + else i==d4.instant?h.push(e):i==d4.ticket?n.push(e):i==d4.pass?c.push(e):n.push(e); + this.container.removeChildren(); + const d=[],f=[]; + n.length>0&&(d.push(n),f.push(RB.getText("COMMON_120","메일함으로 발송되었습니다."))),h.length>0&&(d.push(h),f.push(RB.getText("COMMON_119","즉시 지급되었습니다."))),r.length>0&&(d.push(r),f.push(RB.getText("GAME_348","광고 제거 상품이 적용되었습니다."))),o.length>0&&(d.push(o),f.push(RB.getText("GAME_349","2배속 상품이 적용되었습니다."))),a.length>0&&(d.push(a),f.push(RB.getText("GAME_1242","전문비서가 고용되었습니다."))),c.length>0&&(d.push(c),f.push(RB.getText("GAME_350","WAVE 패스가 활성화되었습니다."))),l.length>0&&(d.push(l),f.push(RB.getText("COMMON_574","즉시 적용되었습니다."))); + let p,g=0; + const w=d.length; + for(let m=0; + m<w; + ++m){ + m<this.items.length?p=this.items[m]:(p=new r_i,this.items.push(p)); + const t=d[m]!=l; + p.setData(d[m],f[m],t),p.y=g,this.container.addChild(p),g+=p.height+15} + this.updateLayout()} + } + ; + Qt(e_i,"ShopProductResultPopup"),Zt(e_i,"_instance"); + let n_i=e_i; + const h_i=class extends Ve{ + constructor(){ + super(),Zt(this,"icon"),Zt(this,"lbl"),Zt(this,"bg"),Zt(this,"container"),Zt(this,"rewardItems"),this.icon=new Ye(kS.getTexture("UI_Ekkorr","Icon_alarm_check_brown")),this.addChild(this.icon); + const t=sD.DEFAULT_FONT_OPTION_18; + t.fill=sD.COLOR_WHITE,t.fontWeight="normal",this.lbl=new QD("메일함으로 발송되었습니다.",t.fill,t),this.lbl.x=this.icon.x+this.icon.width+5,this.lbl.y=this.icon.y,this.addChild(this.lbl),sD.setLabelWrapWidth(this.lbl,this.width-60),this.bg=new eE({ + texture:kS.getTexture("UI_Ekkorr","Popup_Bg_03"),leftWidth:30,topHeight:30,rightWidth:30,bottomHeight:30} + ),this.bg.alpha=.7,this.bg.width=this.width,this.bg.height=120,this.addChild(this.bg),this.container=new Ve,this.addChild(this.container),this.rewardItems=[]} + get width(){ + return 530} + get height(){ + return this.bg.visible?this.bg.y+this.bg.height:this.lbl.y+this.lbl.height} + setData(t,i,s=!0){ + if(this.lbl.text=i,0==s)return this.bg.visible=!1,void(this.container.visible=!1); + this.container.removeChildren(); + let e,n=0; + const h=t.length; + for(let r=0; + r<h; + ++r)r<this.rewardItems.length?e=this.rewardItems[r]:(e=new p4,this.rewardItems.push(e)),e.setDataFrom(t[r]),e.type==d4.speed||e.subType==d4.speed||e.type==d4.assistant||e.subType==d4.assistant||e.type==d4.ads||e.subType==d4.ads?e.hideAmount():e.showAmount(),e.x=n,this.container.addChild(e),n+=e.width+10; + this.bg.y=this.lbl.y+this.lbl.height+7,this.bg.height=this.container.height+15+10,this.container.x=.5*(this.width-n),this.container.y=this.bg.y+15,this.bg.visible=!0,this.container.visible=!0} + } + ; + Qt(h_i,"ShopProductResultItem"); + let r_i=h_i; + const o_i=Object.freeze(Object.defineProperty({ + __proto__:null,ShopProductResultItem:r_i,ShopProductResultPopup:n_i} + ,Symbol.toStringTag,{ + value:"Module"}
TowerEventRewardItemRenderer 1 hunks, 63 statements
- super(),Xt(this,"lblTicket",new SD("티켓 : 5/5",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_17)),Xt(this,"lblTimer",new kU("Icon_Time02","00:00",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_17)),Xt(this,"btnGuide",new nU("UI_Ekkorr","UI_Alarm")),Xt(this,"lblSeasonRemaining",new SD("",16768358,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"refreshCooldown",0),this.lblTitle.setStyle(OL.DEFAULT_OUTLINE_FONT_OPTION_18),this.updateTitle(),this.lblTitle.y=5,this.addChild(this.btnGuide),this.btnGuide.on("pointertap",()=>{ + super(),Zt(this,"bg"),Zt(this,"lblScore",new QD("",sD.COLOR_BRIGHT_ORANGE,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"iconGem"),Zt(this,"lblGem",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"iconHonor"),Zt(this,"lblHonor",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)); + const i=t.ITEM_WIDTH,s=t.ITEM_HEIGHT,e=t.ICON_SIZE,n=.5*(s-this.lblScore.height),h=.5*(s-e); + this.bg=new eE({ + texture:kS.getTexture("UI_Ekkorr","Popup_List_02"),leftWidth:140,topHeight:30,rightWidth:20,bottomHeight:30} + ),this.bg.width=i,this.bg.height=s,this.addChild(this.bg),this.lblScore.x=t.COL_SCORE_X,this.lblScore.y=n,this.addChild(this.lblScore),this.iconGem=new Ye(kS.getTexture("UI_Ekkorr","UI_GEM_ICON")),this.iconGem.width=e,this.iconGem.height=e,this.iconGem.x=t.COL_GEM_X,this.iconGem.y=h,this.addChild(this.iconGem),this.lblGem.x=this.iconGem.x+e+t.LABEL_GAP,this.lblGem.y=n,this.addChild(this.lblGem),this.iconHonor=new Ye(kS.getTexture("UI_Ekkorr","PVP_COIN_ON")),this.iconHonor.width=e,this.iconHonor.height=e,this.iconHonor.x=t.COL_HONOR_X,this.iconHonor.y=h,this.addChild(this.iconHonor),this.lblHonor.x=this.iconHonor.x+e+t.LABEL_GAP,this.lblHonor.y=n,this.addChild(this.lblHonor)} + setData(t){ + this.data=t,t&&(this.lblScore.text=t.floorLabel,this.lblGem.text=String(t.gem),this.lblHonor.text=String(t.honor),this.iconGem.visible=this.lblGem.visible=t.gem>0,this.iconHonor.visible=this.lblHonor.visible=t.honor>0)} + get height(){ + return t.ITEM_HEIGHT+2} + static get scoreX(){ + return t.COL_SCORE_X} + static get gemX(){ + return t.COL_GEM_X} + static get honorX(){ + return t.COL_HONOR_X} + } + ; + Qt(f3t,"TowerEventRewardItemRenderer"),Zt(f3t,"ITEM_WIDTH",520),Zt(f3t,"ITEM_HEIGHT",48),Zt(f3t,"COL_SCORE_X",20),Zt(f3t,"COL_GEM_X",175),Zt(f3t,"COL_HONOR_X",350),Zt(f3t,"ICON_SIZE",22),Zt(f3t,"LABEL_GAP",6); + let p3t=f3t; + const g3t=class t extends zU{ + constructor(){ + super(),Zt(this,"lblHdrScore"),Zt(this,"lblHdrGem"),Zt(this,"lblHdrHonor"),Zt(this,"rewardList"),this.height=t.POPUP_HEIGHT; + const i=sD.DEFAULT_OUTLINE_FONT_OPTION_16; + this.lblHdrScore=new QD("",8947848,i),this.lblHdrGem=new QD("",8947848,i),this.lblHdrHonor=new QD("",8947848,i),this.contentContainer.addChild(this.lblHdrScore),this.contentContainer.addChild(this.lblHdrGem),this.contentContainer.addChild(this.lblHdrHonor),this.rewardList=new TR(p3t,p3t.ITEM_WIDTH,t.LIST_HEIGHT,2),this.rewardList.x=t.REWARD_LIST_X,this.contentContainer.addChild(this.rewardList),this.outSideClickHide=!0} + static getInstance(){ + return this._instance||(this._instance=new t),this._instance} + async showGuide(){ + if(!GB.isValidEvent(BB.TOWER_EVENT))return; + const i=GB.currentTowerEvent; + if(!i)return; + const s=i.floors.reverse(),e=i.rewards.reverse(),n=[]; + s.forEach(t=>{ + const i=`${ + t} + F`,h=s.indexOf(t),r=e[h]; + let o=0,a=0; + r.forEach(t=>{ + "gem"===t.type&&(o+=t.amount),"honorCoin"===t.type&&(a+=t.amount)} + ),n.push({ + floorLabel:i,gem:o,honor:a} + )} + ),this.title=`${ + RB.getText("GAME_80","도전의 탑")} + ${ + RB.getText("GAME_1844","이벤트")} + `,this.refreshRewardHeaders(),this.rewardList.dataProvider=n,this.rewardList.scrollTo(0); + const h=Math.min(t.LIST_HEIGHT,p3t.ITEM_HEIGHT*n.length+20); + this.rewardList.setListHeight(h),this.height=this.rewardList.y+this.rewardList.height+20,await this.loadImage(),super.show()} + refreshRewardHeaders(){ + this.lblHdrScore.text=RB.getText("F","F"),this.lblHdrGem.text=RB.getText("COMMON_350","보석"),this.lblHdrHonor.text=RB.getText("GAME_88","명예코인"); + const i=t.REWARD_LIST_X,s=t.CONTENT_Y; + this.lblHdrScore.x=i+p3t.scoreX,this.lblHdrGem.x=i+p3t.gemX,this.lblHdrHonor.x=i+p3t.honorX,this.lblHdrScore.y=s,this.lblHdrGem.y=s,this.lblHdrHonor.y=s,this.rewardList.y=s+this.lblHdrScore.height+12} + getDefaultPositionY(){ + return.5*ES.stageHeight} + onBackButton(){ + return this.hide(),!0} + } + ; + Qt(g3t,"TowerEventGuidePopup"),Zt(g3t,"_instance"),Zt(g3t,"POPUP_HEIGHT",320),Zt(g3t,"CONTENT_Y",80),Zt(g3t,"LIST_HEIGHT",520),Zt(g3t,"REWARD_LIST_X",30); + let w3t=g3t; + const m3t=class t extends Pqt{ + constructor(){ + super(),Zt(this,"lblTicket",new QD("티켓 : 5/5",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_17)),Zt(this,"lblTimer",new SF("Icon_Time02","00:00",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_17)),Zt(this,"btnGuide",new UU("UI_Ekkorr","UI_Alarm")),Zt(this,"lblSeasonRemaining",new QD("",16768358,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"refreshCooldown",0),Zt(this,"eventTag"),Zt(this,"btnEventGuide"),this.lblTitle.setStyle(sD.DEFAULT_OUTLINE_FONT_OPTION_18),this.updateTitle(),this.lblTitle.y=5,this.addChild(this.btnGuide),this.btnGuide.on("pointertap",()=>{
RankBadge 2 hunks, 59 statements
+ function QZt(t){ + if(!(t>0))return{ + frame:"Icon_RankBadge_11",label:"-"} + ; + const i=Math.floor(t); + return i<=5?{ + frame:`Icon_RankBadge_0${ + i} + `,label:null} + :i<=10?{ + frame:"Icon_RankBadge_06",label:String(i)} + :{ + frame:"Icon_RankBadge_11",label:String(i)} + } + function ZZt(t,i){ + const s=t.length<=2?.3:3===t.length?.26:.2; + return Math.round(i*s)} + Qt(QZt,"rankBadgeFrame"),Qt(ZZt,"rankLabelFontSize");
+ constructor(t=58){ + super(),Zt(this,"size"),Zt(this,"icon"),Zt(this,"lbl"),this.size=t,this.eventMode="none",this.icon=new Ye(kS.getTexture("UI_Ekkorr","Icon_RankBadge_11")),this.icon.width=t,this.icon.height=t,this.addChild(this.icon); + const i=sD.DEFAULT_OUTLINE_FONT_OPTION_20; + i.stroke={ + color:1971212,width:4,join:"round"} + ,this.lbl=new QD("",16777215,i),this.lbl.visible=!1,this.addChild(this.lbl)} + setRank(t){ + const{ + frame:i,label:s} + =QZt(t); + this.icon.texture=kS.getTexture("UI_Ekkorr",i),this.icon.width=this.size,this.icon.height=this.size,this.lbl.visible=null!==s,null!==s&&(this.lbl.textSize=ZZt(s,this.size),this.lbl.text=s,this.lbl.x=.5*(this.size-this.lbl.width),this.lbl.y=.51171875*this.size-.5*this.lbl.height)} + } + ; + Qt(t0t,"RankBadge"); + let i0t=t0t; + function s0t(t){ + const i=t?t.split("|"):[],s=[]; + for(let e=0; + e<10; + e++){ + const[t,n]=(i[e]??"0-0").split("-").map(Number),h=t>0?t:0; + s.push({ + kindNum:h,trans:h>0&&n||0} + )} + return s} + function e0t(t,i,s){ + const e=1/(1+Math.pow(10,(i-t)/400)); + return Math.round(32*(s-e))} + function n0t(t,i,s){ + const e=1e3+(s||0)+1,n=Qt(s=>Math.max(e,t+e0t(t,i,s))-t,"after"); + return{ + win:n(1),lose:n(0)} + } + function h0t(t){ + let i=0,s=0; + for(const e of t)s+=e.maxHp,e.alive&&(i+=Math.max(0,Math.min(e.hp,e.maxHp))); + return s>0?i/s:0} + function r0t(t,i){ + return t>i} + Qt(s0t,"parsePvpTeam"),Qt(e0t,"eloDelta"),Qt(n0t,"pvpExpectedPoints"),Qt(h0t,"pvpTeamHpRatio"),Qt(r0t,"pvpTimeoutAllyWins"); + const o0t=class t extends OR{
BaseMap 1 hunks, 53 statements
- generatePlacements(){ - const i=[],s=t.FIELD_SIZE,e=t.EDGE_MARGIN,n=s/2,h=s/2,r=t.SAFE_RADIUS*t.SAFE_RADIUS,o=[2,3],a=qt(()=>o[Math.floor(2*Math.random())],"randTree"); - for(let t=0; - t<8; - t++){ - const t=Math.random(),n=t<.5?t*t*2:1-(1-t)*(1-t)*2; - i.push({ - type:a(),x:30+n*(s-60),y:20+Math.random()*(e-20),scale:1+.3*Math.random(),flipX:Math.random()>.5} - )} - for(let t=0; - t<8; - t++){ - const t=Math.random(),e=t<.5?t*t*2:1-(1-t)*(1-t)*2; - i.push({ - type:a(),x:30+e*(s-60),y:s-30+50*Math.random(),scale:1+.3*Math.random(),flipX:Math.random()>.5} - )} - for(let t=0; - t<6; - t++){ - const t=60*Math.random()-10,o=Math.random(),c=e+(o<.5?o*o*2:1-(1-o)*(1-o)*2)*(s-2*e); - this.distSq(t,c,n,h)<r||i.push({ - type:a(),x:t,y:c,scale:1+.3*Math.random(),flipX:Math.random()>.5} - )} - for(let t=0; - t<6; - t++){ - const t=s-30+30*Math.random(),o=Math.random(),c=e+(o<.5?o*o*2:1-(1-o)*(1-o)*2)*(s-2*e); - this.distSq(t,c,n,h)<r||i.push({ - type:a(),x:t,y:c,scale:1+.3*Math.random(),flipX:Math.random()>.5} - )} - for(let c=0; - c<4; - c++){ - const e=Math.random()*Math.PI*2,r=t.SAFE_RADIUS+40+Math.random()*(s/2-t.SAFE_RADIUS-20),o=n+r*Math.cos(e),a=h+r*Math.sin(e); - o<10||o>s-10||a<10||a>s-10||i.push({ - type:4,x:o,y:a,scale:1+.4*Math.random(),flipX:Math.random()>.5} - )} - return i} - distSq(t,i,s,e){ - const n=t-s,h=i-e; - return n*n+h*h} - setNight(i=!1){ - const s=t.NIGHT_TINT>>16&255,e=t.NIGHT_TINT>>8&255,n=255&t.NIGHT_TINT; - for(const h of this.objects)if(i)h.tint=t.NIGHT_TINT; - else{ - const t="number"==typeof h.tint?h.tint:16777215,i={ - r:t>>16&255,g:t>>8&255,b:255&t} - ; - zk.to(i,{ - r:s,g:e,b:n,duration:2,ease:"power2.inOut",onUpdate:qt(()=>{ - h.tint=i.r<<16|i.g<<8|i.b} - ,"onUpdate")} - )}
FireDebuffIcon 1 hunks, 43 statements
- super(),Xt(this,"btnDungeon",new nU("UI_Ekkorr","HeroGrade6")),Xt(this,"btnIdle",new nU("UI_Ekkorr","HeroGrade4")),Xt(this,"btnMap3",new nU("UI_Ekkorr","HeroGrade2")),Xt(this,"btnMap4",new nU("UI_Ekkorr","HeroGrade16")),Xt(this,"btnRaidBosses",[]),Xt(this,"btnBuff",new nU("UI_Ekkorr","HeroGrade10")),Xt(this,"btnMine",new nU("UI_Ekkorr","HeroGrade12")),Xt(this,"btnCardEvent",new nU("UI_Ekkorr","HeroGrade14")),Xt(this,"btnConquest",new nU("UI_Ekkorr","HeroGrade8")),Xt(this,"btnMiniAscent",new nU("UI_Ekkorr","HeroGrade10")),Xt(this,"btnPowerSave",new nU("UI_Ekkorr","PowerOff")),Xt(this,"healthOrb",J1t.getInstance()),Xt(this,"waveCallInfo",e2t.getInstance()),Xt(this,"timeShiftGauge",new i2t),Xt(this,"btnWaveSetting",new nU("UI_Ekkorr","smallSetting")),Xt(this,"btnAllPreset",new nU("UI_Ekkorr","AllPreset")),Xt(this,"waveSettingFrameCnt",0),Xt(this,"openingMiniAscent",!1),Xt(this,"onReviveBind"),this.healthOrb.x=640-.5*this.healthOrb.width-3,this.healthOrb.y=13,this.addChild(this.healthOrb),this.waveCallInfo.x=10,this.waveCallInfo.y=t.WAVE_CALL_BASE_Y,this.addChild(this.waveCallInfo),this.waveCallInfo.eventMode="static",this.waveCallInfo.on("pointerup",this.getNextWave,this),this.waveCallInfo.start(),this.timeShiftGauge.x=this.waveCallInfo.x+62,this.timeShiftGauge.y=this.waveCallInfo.y,this.addChild(this.timeShiftGauge),this.btnWaveSetting.x=this.waveSettingX(),this.btnWaveSetting.y=this.waveCallInfo.y+.5*(40-this.btnWaveSetting.height),this.addChild(this.btnWaveSetting),this.btnWaveSetting.on("pointerup",this.onWaveSetting,this),this.btnWaveSetting.visible=!1,FM.getInstance().add(this.onWaveSettingFrame,this),uqt.getInstance().x=0,uqt.getInstance().y=-13,this.addChild(uqt.getInstance()),uqt.getInstance().onVisibilityChanged=t=>{ + super(),Zt(this,"body",new Ve),Zt(this,"disc",new ip),Zt(this,"flame",null),Zt(this,"lblLevel",new QD("Lv.1",sD.COLOR_BRIGHT_ORANGE,sD.DEFAULT_OUTLINE_FONT_OPTION_17)),Zt(this,"wave",0),Zt(this,"shouldShow",!1); + const i=t.SIZE,s=i/2; + this.disc.circle(s,s,s).fill(12613678),this.disc.circle(s,s,s-3).fill(3805702),this.disc.circle(s,s+6,s-10).fill({ + color:16742942,alpha:.28} + ),this.body.pivot.set(s,s),this.body.position.set(s,s),this.body.addChild(this.disc,this.lblLevel),this.addChild(this.body),this.visible=!1,this.eventMode="static",this.cursor="pointer",this.hitArea=new Ui(-6,-6,i+12,i+30),this.on("pointertap",()=>{ + jG(),U8t.getInstance().open(this.wave)} + )} + static getInstance(){ + return this._instance||(this._instance=new t),this._instance} + refresh(i,s){ + var e; + if(this.wave=i,this.shouldShow=s===hU.FIRE_LAND,this.lblLevel.text=`-${ + Math.max(1,fU(i))} + %`,this.lblLevel.x=.5*(t.SIZE-this.lblLevel.width),this.lblLevel.y=t.SIZE-6,!this.shouldShow)return this.visible=!1,void(null==(e=this.flame)||e.stop()); + pF.preload().then(()=>{ + var t; + this.shouldShow&&(this.ensureFlame(),this.visible=!0,null==(t=this.flame)||t.play())} + ).catch(t=>{ + } + )} + get focusTarget(){ + return this.disc} + popIn(){ + MR.killTweensOf(this.body.scale),MR.fromTo(this.body.scale,{ + x:.2,y:.2} + ,{ + x:1,y:1,duration:.45,ease:"back.out(2.4)"} + )} + ensureFlame(){ + if(this.flame)return; + const i=kS.getTextures(pF.SHEET,"fla_",!0); + if(!i||0===i.length)return; + const s=new fp(i); + s.anchor.set(.5,.7),s.animationSpeed=.4,s.scale.set(1.35),s.position.set(t.SIZE/2,t.SIZE/2+12),s.eventMode="none",this.body.addChildAt(s,1),this.flame=s} + } + ; + Qt(F8t,"FireDebuffIcon"),Zt(F8t,"_instance",null),Zt(F8t,"SIZE",54); + let $8t=F8t; + const H8t=class t extends Ve{ + constructor(){ + super(),Zt(this,"btnDungeon",new UU("UI_Ekkorr","HeroGrade6")),Zt(this,"btnIdle",new UU("UI_Ekkorr","HeroGrade4")),Zt(this,"btnMap3",new UU("UI_Ekkorr","HeroGrade2")),Zt(this,"btnMap4",new UU("UI_Ekkorr","HeroGrade16")),Zt(this,"btnRaidBosses",[]),Zt(this,"btnBuff",new UU("UI_Ekkorr","HeroGrade10")),Zt(this,"btnMine",new UU("UI_Ekkorr","HeroGrade12")),Zt(this,"btnCardEvent",new UU("UI_Ekkorr","HeroGrade14")),Zt(this,"btnConquest",new UU("UI_Ekkorr","HeroGrade8")),Zt(this,"btnMiniAscent",new UU("UI_Ekkorr","HeroGrade10")),Zt(this,"btnPowerSave",new UU("UI_Ekkorr","PowerOff")),Zt(this,"healthOrb",r5t.getInstance()),Zt(this,"waveCallInfo",d5t.getInstance()),Zt(this,"timeShiftGauge",new l5t),Zt(this,"btnWaveSetting",new UU("UI_Ekkorr","smallSetting")),Zt(this,"btnAllPreset",new UU("UI_Ekkorr","AllPreset")),Zt(this,"waveSettingFrameCnt",0),Zt(this,"openingMiniAscent",!1),Zt(this,"onReviveBind"),this.healthOrb.x=640-.5*this.healthOrb.width-3,this.healthOrb.y=13,this.addChild(this.healthOrb); + const i=$8t.getInstance(); + i.x=this.healthOrb.x-5-.5*$8t.SIZE,i.y=this.healthOrb.y-.5*this.healthOrb.height-$8t.SIZE-18,this.addChild(i),this.waveCallInfo.x=10,this.waveCallInfo.y=t.WAVE_CALL_BASE_Y,this.addChild(this.waveCallInfo),this.waveCallInfo.eventMode="static",this.waveCallInfo.on("pointerup",this.getNextWave,this),this.waveCallInfo.start(),this.timeShiftGauge.x=this.waveCallInfo.x+62,this.timeShiftGauge.y=this.waveCallInfo.y,this.addChild(this.timeShiftGauge),this.btnWaveSetting.x=this.waveSettingX(),this.btnWaveSetting.y=this.waveCallInfo.y+.5*(40-this.btnWaveSetting.height),this.addChild(this.btnWaveSetting),this.btnWaveSetting.on("pointerup",this.onWaveSetting,this),this.btnWaveSetting.visible=!1,fE.getInstance().add(this.onWaveSettingFrame,this),eXt.getInstance().x=0,eXt.getInstance().y=-13,this.addChild(eXt.getInstance()),eXt.getInstance().onVisibilityChanged=t=>{
TowerBattleController 5 hunks, 42 statements
- super(),Xt(this,"battleType",AF.TOWER),Xt(this,"towerTeamVOs",[]),Xt(this,"towerSlotIndices",[]),Xt(this,"spawnedVOs",[]),Xt(this,"floor",0),Xt(this,"battleVO",null),Xt(this,"wasClearedBefore",!1),Xt(this,"initialEnemyCount",0),Xt(this,"isSimulation",!1),Xt(this,"onSimulationEnd",null),Xt(this,"speedHelper",new fZt("ef2.tower.battleSpeed")),Xt(this,"teamKindNums",[]),Xt(this,"teamTransList",[])} + super(),Zt(this,"battleType",v$.TOWER),Zt(this,"towerTeamVOs",[]),Zt(this,"towerSlotIndices",[]),Zt(this,"spawnedVOs",[]),Zt(this,"floor",0),Zt(this,"battleVO",null),Zt(this,"wasClearedBefore",!1),Zt(this,"initialEnemyCount",0),Zt(this,"isSimulation",!1),Zt(this,"onSimulationEnd",null),Zt(this,"allyFlowField",null),Zt(this,"enemyFlowField",null),Zt(this,"speedHelper",new y0t("ef2.tower.battleSpeed")),Zt(this,"teamKindNums",[]),Zt(this,"teamTransList",[]),this.hitFlash=!0,this.attackSfxChance=.35,this.dieSfxChance=1}
+ static wallBase(t){ + const i=(t-320)/320; + return 292+45*i*i*i*i}
- await this.setupAllies(),await this.setupEnemies(),this.setupEnemyLists(),eli.getInstance().switchToBattle(this),this.updateZIndexSorting(),IB.getInstance().remove(this.execute,this),await KB.getInstance().play(),q2t.getInstance().setTimeProvider(()=>this.getRemainingTimeSeconds()),IB.getInstance().add(this.execute,this)} + await this.setupAllies(),await this.setupEnemies(),this.setupEnemyLists(),this.setupTerrain(),Rui.getInstance().switchToBattle(this),this.updateZIndexSorting(),iU.getInstance().remove(this.execute,this),await CU.getInstance().play(),n3t.getInstance().setTimeProvider(()=>this.getRemainingTimeSeconds()),iU.getInstance().add(this.execute,this)}
+ setupTerrain(){ + const i=t.FIELD,s=t.EDGE,e=L1.CELL_SIZE,n=[{ + x:0,y:0,w:s,h:i} + ,{ + x:i-s,y:0,w:s,h:i} + ,{ + x:0,y:t.BOTTOM,w:i,h:i-t.BOTTOM} + ]; + for(let h=0; + h<i; + h+=e)n.push({ + x:h,y:0,w:e,h:t.wallBase(h+e/2)} + ); + L1.loadRects(i,i,n),L1.enabled=!0,this.allyFlowField=new L0t,this.allyFlowField.build(i,i,{ + x:i-s-60,y:0,w:60,h:i} + ),this.enemyFlowField=new L0t,this.enemyFlowField.build(i,i,{ + x:s,y:0,w:60,h:i} + ); + for(const t of this.friendList)t.flowField=this.allyFlowField; + for(const t of this.enemyList)t.flowField=this.enemyFlowField} + teardownTerrain(){ + var t,i; + null==(t=this.allyFlowField)||t.dispose(),this.allyFlowField=null,null==(i=this.enemyFlowField)||i.dispose(),this.enemyFlowField=null,L1.unload()} + clampAirUnits(){ + const i=t.EDGE,s=t.FIELD-i,e=Qt(e=>{ + if(!e.isAir||!e.isAlive)return; + e.x<i?e.x=i:e.x>s&&(e.x=s); + const n=t.wallBase(e.x)-40; + e.y<n?e.y=n:e.y>t.BOTTOM&&(e.y=t.BOTTOM)} + ,"clamp"); + for(const t of this.friendList)e(t); + for(const t of this.enemyList)e(t)} + checkProgress(){ + this.clampAirUnits(),super.checkProgress()}
- for(const t of this.enemyList)t.disablePatrol(); - for(const t of this.friendList)t.disablePatrol(); - super.cleanup()} + for(const t of this.enemyList)t.disablePatrol(),t.flowField=null; + for(const t of this.friendList)t.disablePatrol(),t.flowField=null; + this.teardownTerrain(),super.cleanup()}
PVPOpponentItemRenderer 7 hunks, 40 statements
- super(),Xt(this,"bg"),Xt(this,"lblRankTitle",new SD("rank",11184810,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblRankNum",new SD("",OL.DEFAULT_COLOR,OL.ORANGE_OUTLINE_FONT_OPTION_28)),Xt(this,"lblNameInfo",new SD("",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_17)),Xt(this,"lblDetail",new SD("",11184810,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"btnFight",new IG("전투")),Xt(this,"onFight"),this.bg=new kM({ + super(),Zt(this,"bg"),Zt(this,"lblRankTitle",new QD("",11184810,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"rankBadge",new i0t(58)),Zt(this,"lblNameInfo",new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_17)),Zt(this,"lblDetail",new QD("",11184810,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblWin",new QD("",6742138,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblLose",new QD("",16738922,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"icons",[]),Zt(this,"iconVOs",[]),Zt(this,"btnFight",new iB("전투")),Zt(this,"onFight"),this.bg=new eE({
- ),this.bg.width=615,this.bg.height=80,this.bg.x=5,this.addChild(this.bg),this.lblRankTitle.x=25,this.lblRankTitle.y=6,this.addChild(this.lblRankTitle),this.lblRankNum.x=50,this.lblRankNum.y=24,this.addChild(this.lblRankNum),this.lblNameInfo.x=140,this.lblNameInfo.y=12,this.addChild(this.lblNameInfo),this.lblDetail.x=140,this.lblDetail.y=42,this.addChild(this.lblDetail),this.btnFight.color=IG.RED,this.btnFight.width=120,this.btnFight.height=55,this.btnFight.x=this.bg.width-this.btnFight.width-10,this.btnFight.y=.5*(this.bg.height-this.btnFight.height),this.btnFight.onClick=()=>{ + ),this.bg.width=615,this.bg.height=t.BG_H,this.bg.x=5,this.bg.eventMode="none",this.addChild(this.bg),this.lblRankTitle.x=25,this.lblRankTitle.y=10,this.addChild(this.lblRankTitle),this.rankBadge.x=36,this.rankBadge.y=34,this.addChild(this.rankBadge),this.lblNameInfo.x=140,this.lblNameInfo.y=8,this.addChild(this.lblNameInfo),this.lblDetail.x=140,this.lblDetail.y=36,this.addChild(this.lblDetail),this.lblWin.y=36,this.lblLose.y=36,this.addChild(this.lblWin,this.lblLose); + const i=t.ICON_SCALE; + for(let s=0; + s<10; + s++){ + const e=new e4; + e.setMode(i4.BOOK),e.scale.set(i),e.eventMode="none",e.x=t.ICON_X+s*(e.width+t.ICON_GAP),e.y=t.ICON_Y,this.addChild(e),this.icons.push(e),this.iconVOs.push(ix.getVO())} + this.btnFight.color=iB.RED,this.btnFight.width=120,this.btnFight.height=52,this.btnFight.x=this.bg.x+this.bg.width-this.btnFight.width-10,this.btnFight.y=8,this.btnFight.onClick=()=>{
- this.data=t,this.lblRankNum.text=`${ - t.rank} - `,this.lblRankNum.x=15+.5*(100-this.lblRankNum.width); - const i=Number(t.maxWave)||0,s=Math.floor(i/100); + this.data=t,this.lblRankTitle.text=RB.getText("COMMON_373","순위"),this.lblRankTitle.x=15+.5*(100-this.lblRankTitle.width),this.rankBadge.setRank(Number(t.rank)||0); + const i=Math.floor((Number(t.maxWave)||0)/100);
- const e=Number(t.total)||0,n=Number(t.win)||0,h=e-n; + const s=Number(t.total)||0,e=Number(t.win)||0;
- t.point.toLocaleString()} - `+nB.getText("COMMON_37","점수").charAt(0)+` ( ${ + Number(t.point).toLocaleString()} + `+RB.getText("COMMON_37","점수").charAt(0)+` ( ${
- h} - )`,this.btnFight.text=nB.getText("GAME_70","전투")} + s-e} + )`,this.setPreview(t.preview),this.setTeam(t.team),this.btnFight.text=RB.getText("GAME_70","전투")} + setPreview(i){ + const s=t.RIGHT_X; + this.lblWin.visible=this.lblLose.visible=null!=i,i&&(this.lblWin.text=`${ + i.win>=0?"+":""} + ${ + i.win} + `,this.lblLose.text=` / ${ + i.lose>=0?"+":""} + ${ + i.lose} + `,this.lblLose.x=s-this.lblLose.width,this.lblWin.x=this.lblLose.x-this.lblWin.width)} + setTeam(t){ + const i=s0t(t); + for(let s=0; + s<10; + s++){ + const t=this.icons[s],e=i[s]; + if(t.visible=e.kindNum>0,!t.visible)continue; + const n=this.iconVOs[s]; + n.kindNum=e.kindNum,n.trans=e.trans,t.setData(n)} + }
- qt(QQt,"PVPOpponentItemRenderer"); + Qt(o0t,"PVPOpponentItemRenderer"),Zt(o0t,"BG_H",108),Zt(o0t,"ICON_SCALE",.34),Zt(o0t,"ICON_X",140),Zt(o0t,"ICON_Y",68),Zt(o0t,"ICON_GAP",2),Zt(o0t,"RIGHT_X",476);
PVP2ReadyPopup 16 hunks, 40 statements
- )),Xt(W4t,"ALLY_FORMATION",[{ - x:180,y:440} + )),Zt(M7t,"ZOOM",1.1),Zt(M7t,"UNIT_SCALE",.85),Zt(M7t,"ALLY_FORMATION",[{ + x:200,y:290}
- x:180,y:490} + x:200,y:340}
- x:180,y:540} + x:200,y:390}
- x:180,y:590} + x:200,y:440}
- x:80,y:460} + x:120,y:310}
- x:80,y:520} + x:120,y:370}
- x:80,y:580} + x:120,y:430}
- x:10,y:460} + x:50,y:310}
- x:10,y:520} + x:50,y:370}
- x:10,y:580} + x:50,y:430}
- super(),Xt(this,"vsImage",new je(eS.getTexture("UI_Ekkorr","UI_VS"))),Xt(this,"allyBtns",[]),Xt(this,"enemyBtns",[]),Xt(this,"battleContainer",new He),Xt(this,"btnStart",new IG("전투")),Xt(this,"lblMyName",new SD("",OL.COLOR_BRIGHT_GREEN,OL.DEFAULT_FONT_OPTION_16)),Xt(this,"lblMyStats",new SD("",OL.DEFAULT_COLOR,OL.DEFAULT_FONT_OPTION_16)),Xt(this,"lblOpName",new SD("",OL.COLOR_BRIGHT_GREEN,OL.DEFAULT_FONT_OPTION_16)),Xt(this,"lblOpStats",new SD("",OL.DEFAULT_COLOR,OL.DEFAULT_FONT_OPTION_16)),Xt(this,"heroList"),Xt(this,"selectedSlot",-1),Xt(this,"lblHeroList",new SD("영웅 선택",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"teamKindNums",[]),Xt(this,"teamTrans",[]),Xt(this,"originalTeam",""),Xt(this,"heroVOs",[]),Xt(this,"pvpInfo"),Xt(this,"userPvp"),Xt(this,"opInfo"),Xt(this,"opKindNums",[]),Xt(this,"opTrans",[]),Xt(this,"requestPending",!1),this.y-=100,this.bg.height+=100,this.lblMyName.x=15,this.lblMyName.y=45,this.addChild(this.lblMyName),this.lblMyStats.x=15,this.lblMyStats.y=this.lblMyName.y+this.lblMyName.height+2,this.addChild(this.lblMyStats),this.lblOpName.y=this.lblMyName.y,this.addChild(this.lblOpName),this.lblOpStats.y=this.lblMyStats.y,this.addChild(this.lblOpStats); + super(),Zt(this,"vsImage",new Ye(kS.getTexture("UI_Ekkorr","UI_VS"))),Zt(this,"allyBtns",[]),Zt(this,"enemyBtns",[]),Zt(this,"battleContainer",new Ve),Zt(this,"btnStart",new iB("전투")),Zt(this,"lblMyName",new QD("",sD.COLOR_BRIGHT_GREEN,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"lblMyStats",new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"lblOpName",new QD("",sD.COLOR_BRIGHT_GREEN,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"lblOpStats",new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"lblWin",new QD("",6742138,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblLose",new QD("",16738922,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"heroList"),Zt(this,"selectedSlot",-1),Zt(this,"lblHeroList",new QD("영웅 선택",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"teamKindNums",[]),Zt(this,"teamTrans",[]),Zt(this,"originalTeam",""),Zt(this,"heroVOs",[]),Zt(this,"pvpInfo"),Zt(this,"userPvp"),Zt(this,"opInfo"),Zt(this,"opKindNums",[]),Zt(this,"opTrans",[]),Zt(this,"requestPending",!1),this.y-=100,this.bg.height+=100,this.lblMyName.x=15,this.lblMyName.y=45,this.addChild(this.lblMyName),this.lblMyStats.x=15,this.lblMyStats.y=this.lblMyName.y+this.lblMyName.height+2,this.addChild(this.lblMyStats),this.lblOpName.y=this.lblMyName.y,this.addChild(this.lblOpName),this.lblOpStats.y=this.lblMyStats.y,this.addChild(this.lblOpStats),this.lblWin.y=this.lblMyStats.y,this.lblLose.y=this.lblMyStats.y,this.addChild(this.lblWin,this.lblLose);
- this.pvpInfo=t,this.userPvp=i,this.opInfo=s,this.lblHeroList.text=nB.getText("GAME_563","영웅 선택"),this.btnStart.text=nB.getText("GAME_70","전투"),this.lblMyName.text=`Rank.${ - i.rank} + this.pvpInfo=t,this.userPvp=i,this.opInfo=s,this.lblHeroList.text=RB.getText("GAME_563","영웅 선택"),this.btnStart.text=RB.getText("GAME_70","전투"),this.lblMyName.text=`${ + this.rankText(i.rank)}
- )`,this.lblOpName.text=`Rank.${ - s.rank} + )`,this.lblOpName.text=`${ + this.rankText(s.rank)}
- )`,this.lblOpStats.x=this.bg.width-this.lblOpStats.width-15,this.opKindNums=[],this.opTrans=[],this.parseTeamData(this.opInfo.team,this.opKindNums,this.opTrans),this.initTeam(),this.selectedSlot=-1,this.updateAllyButtons(),this.updateEnemyButtons(),CXt.onHeroClick=this.onClickHeroFromList.bind(this),this.updateHeroList()} + )`,this.lblOpStats.x=this.bg.width-this.lblOpStats.width-15,this.opKindNums=[],this.opTrans=[],this.parseTeamData(this.opInfo.team,this.opKindNums,this.opTrans); + const n=n0t(Number(i.point)||0,Number(s.point)||0,Number(i.attackGame)||0); + this.lblWin.text=`${ + n.win>=0?"+":""} + ${ + n.win} + `,this.lblLose.text=` / ${ + n.lose>=0?"+":""} + ${ + n.lose} + `; + const h=this.lblWin.width+this.lblLose.width; + this.lblWin.x=.5*(this.bg.width-h),this.lblLose.x=this.lblWin.x+this.lblWin.width,this.initTeam(),this.selectedSlot=-1,this.updateAllyButtons(),this.updateEnemyButtons(),_Jt.onHeroClick=this.onClickHeroFromList.bind(this),this.updateHeroList()}
+ rankText(t){ + return RB.getText("GAME_97","##위").replace("##",String(t??"-"))}
- ),V4t.getInstance().startMarchBattle([...this.teamKindNums],[...this.teamTrans],this.opKindNums,this.opTrans,Math.floor(this.opInfo.maxWave/100),this.opInfo.transPoints??null)} + ); + const t=Math.floor(this.opInfo.maxWave/100); + b7t.getInstance().startMarchBattle([...this.teamKindNums],[...this.teamTrans],this.opKindNums,this.opTrans,t,this.opInfo.transPoints??null,{ + grade:Number(this.userPvp.grade)||1,ally:{ + name:EG.name,level:Math.floor(EG.maxWave/100),rank:Number(this.userPvp.rank)||0} + ,enemy:{ + name:this.opInfo.name,level:t,rank:Number(this.opInfo.rank)||0} + } + )}
CoachOverlay 14 hunks, 37 statements
- super(),Xt(this,"spot",new jKt(.6)),Xt(this,"fx",new He),Xt(this,"bubble",new WKt),Xt(this,"hand",null),this.alpha=0,this.eventMode="static",this.addChild(this.spot,this.fx,this.bubble)} + super(),Zt(this,"spot",new Kzt(.6)),Zt(this,"fx",new Ve),Zt(this,"bubble",new Vzt),Zt(this,"hand",null),Zt(this,"pressRect",null),this.alpha=0,this.eventMode="static",this.addChild(this.spot,this.fx,this.bubble)}
- let i=null; + let i=null,s=null;
- const e=this.rectOf(s); - i="circle"===t.shape?jKt.circleHole(e,t.pad??8):jKt.rectHole(e,t.pad??8)} + s=this.rectOf(e),i=this.holeOf(s,t)}
- this.spot.focus(i),this.bubble.show(t.text,t.face??"S_SMI",i?jKt.toRect(i):null,this.screen,!s),i&&t.onShow&&t.onShow(this,jKt.toRect(i)),s?(this.showHand(i),await this.waitPress(t),this.hideHand()):await this.waitTap()} + this.spot.focus(i),this.bubble.show(t.text,t.face??"S_SMI",i?Kzt.toRect(i):null,this.screen,!e),i&&t.onShow&&t.onShow(this,Kzt.toRect(i)),e?(this.pressRect=s,this.showHand(i),await this.waitPress(t),this.hideHand(),this.pressRect=null):await this.waitTap()} + holeOf(t,i){ + return"circle"===i.shape?Kzt.circleHole(t,i.pad??8):Kzt.rectHole(t,i.pad??8)}
+ static isMoving(t){ + const i=Array.isArray(t)?t:[t]; + for(const s of i)for(let t=s; + t; + t=t.parent){ + if(MR.getTweensOf(t.scale).length>0||MR.getTweensOf(t.position).length>0)return!0; + for(const i of MR.getTweensOf(t)){ + const t=i.vars; + if("x"in t||"y"in t||"scale"in t||"scaleX"in t||"scaleY"in t||"rotation"in t)return!0} + } + return!1}
+ this.hitArea=new Ui(-5e3,-5e3,1e4,1e4);
- const i=s(); - if(t.isShown(i)){ + const i=s(),h=t.isShown(i); + if(h&&!t.isMoving(i)){
- if(performance.now()>e)return t.isShown(i)?i:null; + const r=performance.now(); + if(r>e&&(!h||r>e+t.SETTLE_GRACE_MS))return h?i:null;
- const s=this.spot; + const s=Qt((t,i)=>!!this.pressRect&&this.pressRect.contains(t,i),"pressContains");
- contains:qt((t,i)=>!s.holeContains(t,i),"contains")} + contains:Qt((t,i)=>!s(t,i),"contains")}
- s.holeContains(i.x,i.y)&&setTimeout(r,0)} + s(i.x,i.y)&&setTimeout(o,0)}
- h=t.isShown(e())?0:h+1,h>30&&r()} + const s=e(); + t.isShown(s)?(r=0,t.isMoving(s)||this.follow(s,i)):++r>30&&o()}
+ follow(t,i){ + var s; + const e=this.pressRect; + if(!e)return; + const n=this.rectOf(t); + if(Math.max(Math.abs(n.x-e.x),Math.abs(n.y-e.y),Math.abs(n.width-e.width),Math.abs(n.height-e.height))<=4)return; + const h=this.holeOf(n,i); + this.pressRect=n,this.spot.focus(h),this.bubble.show(i.text,i.face??"S_SMI",Kzt.toRect(h),this.screen,!1),null==(s=this.hand)||s.position.set(h.x+h.w/2,h.y+h.h/2)}
- qt(mai,"CoachOverlay"),Xt(mai,"TAP_DELAY_MS",350),Xt(mai,"DEFAULT_WAIT_MS",800),Xt(mai,"active",null); + Qt(Hci,"CoachOverlay"),Zt(Hci,"TAP_DELAY_MS",350),Zt(Hci,"DEFAULT_WAIT_MS",800),Zt(Hci,"SETTLE_GRACE_MS",1e3),Zt(Hci,"active",null);
FireDebuffPopup 1 hunks, 36 statements
+ const L8t={ + quake:[84,"L_SUR","잠깐... 땅이 울리고 있어. 이 열기는 뭐지?"],awaken:[85,"S_SHU","성주님, 심연의 마력이 솟구치고 있습니다! 무언가가 깨어났어요!"],lordBoast:[86,"FL_SNE","심연도 나를 영원히 가둘 수는 없지. 이제 이 땅은 내 불길을 기억하리라!"],forestBurned:[87,"L_SHU","숲이... 순식간에 타버렸어! 저 불길이 성 안까지 스며들고 있잖아!"],lordIntro:[88,"S_NEU","심연에서 풀려난 불의 군주입니다. 그 불의 기운이 시간마저 늦추고 있어요."],tapMark:[89,"S_NEU","화염 표식을 눌러, 지금 받고 있는 영향을 확인해 보세요."],castleGlow:[90,"L_SUR","그런데... 성도 빛나고 있어. 불길에 반응하는 건가?"],castleReact:[91,"S_SUR","성이 마력에 반응하고 있습니다! 성주님과 이어진 종족의 힘이 모습을 드러내려 해요."],tribeIcon:[92,"S_NEU","성주님의 환생 종족은 이 아이콘으로 확인할 수 있어요. 성도 같은 종족의 힘을 따릅니다."],castleTribe:[93,"S_SMI","이제 성은 성주님이 환생한 종족의 모습을 띱니다."],fireRule:[94,"S_NEU","불의 기운은 깊이 들어갈수록 강해져요. 100층마다 게임 배속이 1%씩 줄어들어요. 화염 표식에서 언제든 확인하실 수 있어요."],resolve:[95,"L_NEU","땅이 바뀌었다고 물러설 수는 없지. 우리 힘을 제대로 알고 맞서겠어."]} + ,D8t=["DIALOGUE_NPC_FL","불의 군주"],G8t={ + realmName:["GAME_1902","불대지"],popupTitle:["GAME_1904","불대지 · 화염 디버프"],currentWave:["GAME_1905","현재 웨이브 { + 0} + "],paused:["GAME_1913","전투 일시정지"],resume:["GAME_1914","전투 계속"],currentTribe:["GAME_1915","현재 환생 종족"],castleLabel:["GAME_1916","{ + 0} + 성"],waveCallBlocked:["GAME_1917","새로운 땅 앞에서는 웨이브를 부를 수 없습니다."],fireAura:["GAME_1923","불의 기운"],speedDebuff:["GAME_1924","게임 배속 -{ + 0} + %"],speedDebuffDesc:["GAME_1925","불의 기운으로 { + 0} + 층마다 게임 배속이 { + 1} + %씩 줄어듭니다."],nextDebuff:["GAME_1926","{ + 0} + 층부터 -{ + 1} + %"]} + ,B8t=class t extends uB{ + constructor(){ + super(),Zt(this,"box",new ip),Zt(this,"lblAura",new QD("",t.FIRE,sD.DEFAULT_OUTLINE_FONT_OPTION_17)),Zt(this,"lblSpeed",new QD("",t.FIRE,sD.DEFAULT_OUTLINE_FONT_OPTION_32)),Zt(this,"lblDesc",new QD("",sD.COLOR_WHITE,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"lblWave",new QD("",sD.COLOR_GRAY,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"lblNext",new QD("",sD.COLOR_GRAY,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"btnConfirm",new hB("확인")),this.width=t.W,this.lblDesc.setWrapWidth(t.W-120),this.contentContainer.addChild(this.box,this.lblAura,this.lblSpeed,this.lblDesc,this.lblWave,this.lblNext,this.btnConfirm),this.btnConfirm.onClick=()=>this.hide(),this.outSideClickHide=!0} + static getInstance(){ + return this._instance||(this._instance=new t),this._instance} + open(t){ + const i=Math.max(1,fU(t)),s=Math.max(1,dU(t)),e=rU+100*s; + this.title=Uzt(G8t.popupTitle),this.lblAura.text=Uzt(G8t.fireAura),this.lblSpeed.text=Fzt(G8t.speedDebuff,i),this.lblDesc.text=Fzt(G8t.speedDebuffDesc,100,1),this.lblWave.text=Fzt(G8t.currentWave,t.toLocaleString("en-US")),this.lblNext.text=Fzt(G8t.nextDebuff,e.toLocaleString("en-US"),i+1),this.btnConfirm.text=RB.getText("COMMON_1","확인"),this.layout(),super.show()} + layout(){ + const i=t.W,s=i-46,e=Qt(t=>t.x=.5*(i-t.width),"centerX"); + let n=94; + e(this.lblAura),this.lblAura.y=n,n+=this.lblAura.height+6,e(this.lblSpeed),this.lblSpeed.y=n,n+=this.lblSpeed.height+10,e(this.lblDesc),this.lblDesc.y=n,n+=this.lblDesc.height+18,this.box.clear().roundRect(36,78,s-46+20,n-78,10).fill({ + color:0,alpha:.28} + ),n+=12,this.lblWave.position.set(46,n),this.lblNext.position.set(s-this.lblNext.width,n),n+=Math.max(this.lblWave.height,this.lblNext.height),this.btnConfirm.x=.5*(i-this.btnConfirm.width),this.btnConfirm.y=n+22,this.height=this.btnConfirm.y+this.btnConfirm.height+36} + } + ; + Qt(B8t,"FireDebuffPopup"),Zt(B8t,"_instance"),Zt(B8t,"W",560),Zt(B8t,"FIRE",16743002); + let U8t=B8t;
TopMenu 8 hunks, 36 statements
- super(),Xt(this,"bg",new CD),Xt(this,"lblDay",new SD("Wave 1",65433,OL.DEFAULT_OUTLINE_FONT_OPTION_20)),Xt(this,"waveBar",new kli),Xt(this,"lblWaveSkip",null),Xt(this,"btnRevive",new nU("UI_Ekkorr","UI_REVIVE_ICON")),Xt(this,"lblMedalEvent",new SD("+00%\n3/3",65433,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"btnMedalEvent",new nU("UI_Ekkorr","UI_Question",1)),Xt(this,"lblSpeed",new kU("UI_SPEED_ICON2")),Xt(this,"heartInfo",Gai.getInstance()),Xt(this,"profile",mF.getInstance()),Xt(this,"btnHeroPresent",new nU("UI_Ekkorr","Hero55",.9)),Xt(this,"btnStampCalendar",new nU("UI_Ekkorr","stamp30")),Xt(this,"heroPresentBaseH",0),Xt(this,"stampBaseH",0),Xt(this,"count",0),Xt(this,"stampUtcDay",-1),Xt(this,"speedActive",!1),Xt(this,"userSpeedMode",null),Xt(this,"_height",40),this.bg.setIndex(6),this.bg.width=640,this.bg.height=40,this.bg.alpha=.1,this.lblDay.textColor=43622,this.lblDay.x=.5*(this.bg.width-this.lblDay.width),this.lblDay.y=.5*(this.bg.height-this.lblDay.height),this.addChild(this.lblDay),this.lblDay.text="Wave 1",this.waveBar.x=.5*(640-this.waveBar.width),this.waveBar.y=35,this.addChild(this.waveBar),this.waveBar.x=.5*(640-this.waveBar.width),this.waveBar.y=35,this.addChild(this.waveBar),this.profile.x=4,this.profile.y=4,this.addChild(this.profile),this.btnRevive.x=1,this.btnRevive.y=this.profile.y+this.profile.height-10,this.addChild(this.btnRevive),this.btnRevive.on("pointerdown",()=>{ + super(),Zt(this,"bg",new tG),Zt(this,"lblDay",new QD("Wave 1",65433,sD.DEFAULT_OUTLINE_FONT_OPTION_20)),Zt(this,"waveBar",new odi),Zt(this,"lblWaveSkip",null),Zt(this,"btnRevive",new UU("UI_Ekkorr","UI_REVIVE_ICON")),Zt(this,"lblMedalEvent",new QD("+00%\n3/3",65433,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"btnMedalEvent",new UU("UI_Ekkorr","UI_Question",1)),Zt(this,"lblSpeed",new SF("UI_SPEED_ICON2")),Zt(this,"heartInfo",cli.getInstance()),Zt(this,"profile",u$.getInstance()),Zt(this,"btnHeroPresent",new UU("UI_Ekkorr","Hero55",.9)),Zt(this,"btnStampCalendar",new UU("UI_Ekkorr","stamp30")),Zt(this,"btnAttendEvent",new UU("UI_Ekkorr","Shortcut_Attend")),Zt(this,"heroPresentBaseH",0),Zt(this,"stampBaseH",0),Zt(this,"count",0),Zt(this,"stampUtcDay",-1),Zt(this,"speedActive",!1),Zt(this,"userSpeedMode",null),Zt(this,"_height",40),this.bg.setIndex(6),this.bg.width=640,this.bg.height=40,this.bg.alpha=.1,this.lblDay.textColor=43622,this.lblDay.x=.5*(this.bg.width-this.lblDay.width),this.lblDay.y=.5*(this.bg.height-this.lblDay.height),this.addChild(this.lblDay),this.lblDay.text="Wave 1",this.waveBar.x=.5*(640-this.waveBar.width),this.waveBar.y=35,this.addChild(this.waveBar),this.waveBar.x=.5*(640-this.waveBar.width),this.waveBar.y=35,this.addChild(this.waveBar),this.profile.x=4,this.profile.y=4,this.addChild(this.profile),this.btnRevive.x=1,this.btnRevive.y=this.profile.y+this.profile.height-10,this.addChild(this.btnRevive),this.btnRevive.on("pointerdown",()=>{
- ),this.lblMedalEvent.text="+00%\n3/3",this.lblMedalEvent.textColor=6801914,this.lblMedalEvent.align="center",this.lblMedalEvent.lineHeight=17,this.lblMedalEvent.x=this.btnRevive.x+.5*(this.btnRevive.width-this.lblMedalEvent.width),this.lblMedalEvent.y=this.btnRevive.y+this.btnRevive.height-.5*this.lblMedalEvent.height,this.addChild(this.lblMedalEvent),this.btnMedalEvent.x=this.lblMedalEvent.x+this.lblMedalEvent.width,this.btnMedalEvent.y=this.lblMedalEvent.y+.5*(this.lblMedalEvent.height-this.btnMedalEvent.height),this.btnMedalEvent.onClick=this.onMedalEventClick.bind(this),this.addChild(this.btnMedalEvent),this.lblSpeed.textOffsetY=2,this.lblSpeed.textOffsetX=2,this.lblSpeed.iconScale=.7,this.lblSpeed.textSize=13,this.lblSpeed.x=this.btnRevive.x+this.btnRevive.width+9,this.lblSpeed.y=30,this.lblSpeed.eventMode="static",this.lblSpeed.cursor="pointer",this.lblSpeed.hitArea=new Di(0,0,120,30),this.lblSpeed.on("pointerdown",this.onSpeedClick,this),this.addChild(this.lblSpeed),this.btnHeroPresent.visible=!1,this.btnHeroPresent.x=100,this.btnHeroPresent.y=this.btnRevive.y+86+8,this.btnHeroPresent.onClick=this.onHeroPresentClick.bind(this),this.addChild(this.btnHeroPresent),this.btnStampCalendar.visible=!1,this.btnStampCalendar.onClick=this.onStampCalendarClick.bind(this),this.stampBaseH=this.btnStampCalendar.height,this.addChild(this.btnStampCalendar),this.heartInfo.x=this.btnRevive.x+this.btnRevive.width+9,this.heartInfo.y=5,this.addChild(this.heartInfo),this.addChild(mF.getInstance()),this.addChild(ezt.getInstance()),this._height=Math.max(this.bg.height,this.waveBar.y+this.waveBar.height),this.profile.on("pointerdown",this.onProfileClick,this),Iqt.getInstance().registerReviveButtonGetter(t=>"btnRevive"===t&&this.btnRevive.visible?{ + ),this.lblMedalEvent.text="+00%\n3/3",this.lblMedalEvent.textColor=6801914,this.lblMedalEvent.align="center",this.lblMedalEvent.lineHeight=17,this.lblMedalEvent.x=this.btnRevive.x+.5*(this.btnRevive.width-this.lblMedalEvent.width),this.lblMedalEvent.y=this.btnRevive.y+this.btnRevive.height-.5*this.lblMedalEvent.height,this.addChild(this.lblMedalEvent),this.btnMedalEvent.x=this.lblMedalEvent.x+this.lblMedalEvent.width,this.btnMedalEvent.y=this.lblMedalEvent.y+.5*(this.lblMedalEvent.height-this.btnMedalEvent.height),this.btnMedalEvent.onClick=this.onMedalEventClick.bind(this),this.addChild(this.btnMedalEvent),this.lblSpeed.textOffsetY=2,this.lblSpeed.textOffsetX=2,this.lblSpeed.iconScale=.7,this.lblSpeed.textSize=13,this.lblSpeed.x=this.btnRevive.x+this.btnRevive.width+9,this.lblSpeed.y=30,this.lblSpeed.eventMode="static",this.lblSpeed.cursor="pointer",this.lblSpeed.hitArea=new Ui(0,0,120,30),this.lblSpeed.on("pointerdown",this.onSpeedClick,this),this.addChild(this.lblSpeed),this.btnHeroPresent.visible=!1,this.btnHeroPresent.x=100,this.btnHeroPresent.y=this.btnRevive.y+86+8,this.btnHeroPresent.onClick=this.onHeroPresentClick.bind(this),this.addChild(this.btnHeroPresent),this.btnStampCalendar.visible=!1,this.btnStampCalendar.onClick=this.onStampCalendarClick.bind(this),this.stampBaseH=this.btnStampCalendar.height,this.addChild(this.btnStampCalendar),this.heartInfo.x=this.btnRevive.x+this.btnRevive.width+9,this.heartInfo.y=5,this.addChild(this.heartInfo),this.addChild(u$.getInstance()),this.addChild(nYt.getInstance()),this.btnAttendEvent.visible=!1,this.btnAttendEvent.x=7,this.btnAttendEvent.onClick=this.onAttendEventClick.bind(this),this.addChild(this.btnAttendEvent),this._height=Math.max(this.bg.height,this.waveBar.y+this.waveBar.height),this.profile.on("pointerdown",this.onProfileClick,this),MXt.getInstance().registerReviveButtonGetter(t=>"btnRevive"===t&&this.btnRevive.visible?{
- s.x=3,this.btnStampCalendar.visible?s.y=this.btnStampCalendar.y+i-3:this.btnHeroPresent.visible?s.y=this.btnHeroPresent.y+t-3:s.y=this.btnHeroPresent.y} + s.x=3,this.btnStampCalendar.visible?s.y=this.btnStampCalendar.y+i-3:this.btnHeroPresent.visible?s.y=this.btnHeroPresent.y+t-3:s.y=this.btnHeroPresent.y,this.btnAttendEvent.visible&&(this.profile.visible&&s.height>0?(this.btnAttendEvent.x=s.x+s.width,this.btnAttendEvent.y=s.y+5):(this.btnAttendEvent.x=7,this.btnAttendEvent.y=s.y+s.height+5))}
- this.count-- >0||(this.count=20,this.updateGameSpeed(),this.updateMedalEvent(),this.updateHeroPresent(),this.updateStampCalendar())} + this.count-- >0||(this.count=20,this.updateGameSpeed(),this.updateMedalEvent(),this.updateHeroPresent(),this.updateStampCalendar(),this.updateAttendEvent())}
- this.btnStampCalendar.visible!==i&&(this.btnStampCalendar.visible=i,this.applySpeedLabelPosition()),i&&t.hasReward()?this.btnStampCalendar.showRedDot():this.btnStampCalendar.hideRedDot()} + this.btnStampCalendar.visible!==i&&(this.btnStampCalendar.visible=i,this.applySpeedLabelPosition()),i&&t.hasReward()?this.btnStampCalendar.showRedDot(0,9):this.btnStampCalendar.hideRedDot()}
- const t=cR.time,i=.001*(XD.speed15EndTime-t); - let s,e=i>0?2:1; - null!==this.userSpeedMode&&this.userSpeedMode<e?s=this.userSpeedMode:(s=e,this.userSpeedMode=null); - const n=.001*(XD.godBlessEndTime-t),h=s+(n>0?3:0)+.01*(eP.getInstance().getGameplayTotal(GR.GameSpeed)+Fx.getBarracksGameSpeedContribution())+(.001*(XD.skillSpeedEndTime-t)>0?1:0); - wD.speedMode=h,IB.getInstance().setSpeed(h),GH.getInstance().updateSpeed(h),n>0?(this.speedActive=!0,this.lblSpeed.textColor=16763904,this.lblSpeed.text=rF.displayTime(n),this.lblSpeed.texture=eS.getTexture("UI_Ekkorr","UI_SPEED_ICON4")):2===s&&i>0?(this.speedActive=!0,this.lblSpeed.textColor=16711680,this.lblSpeed.text=rF.displayTimeAsDayTime(i),this.lblSpeed.texture=eS.getTexture("UI_Ekkorr","UI_SPEED_ICON2")):1.5===s&&i>0?(this.speedActive=!0,this.lblSpeed.textColor=16711680,this.lblSpeed.text=rF.displayTimeAsDayTime(i),this.lblSpeed.texture=eS.getTexture("UI_Ekkorr","UI_SPEED_ICON15")):(this.speedActive=!1,this.lblSpeed.textColor=11184810,i>0?(this.lblSpeed.text=rF.displayTimeAsDayTime(i),this.lblSpeed.texture=eS.getTexture("UI_Ekkorr","UI_SPEED_ICON2_OFF")):this.lblSpeed.text="00:00")} + const t=DR.time,i=.001*(EG.speed15EndTime-t),s=i>0?2:1,e=.001*(EG.godBlessEndTime-t),n=ndi({ + userSpeedMode:this.userSpeedMode,godBlessOff:VD.godBlessOff} + ,s,e>0),h=n.baseSpeed,r=n.godBlessSpeed; + this.userSpeedMode=n.userSpeedMode; + const o=pU(h+r+.01*(kP.getInstance().getGameplayTotal(lx.GameSpeed)+fP.getBarracksGameSpeedContribution())+(.001*(EG.skillSpeedEndTime-t)>0?1:0),EG.wave); + VD.speedMode=o,iU.getInstance().setSpeed(o),xH.getInstance().updateSpeed(o),r>0?(this.speedActive=!0,this.lblSpeed.textColor=16763904,this.lblSpeed.text=i$.displayTime(e),this.lblSpeed.texture=kS.getTexture("UI_Ekkorr","UI_SPEED_ICON4")):e>0?(this.speedActive=!0,this.lblSpeed.textColor=11184810,this.lblSpeed.text=i$.displayTime(e),this.lblSpeed.texture=kS.getTexture("UI_Ekkorr",2===h?"UI_SPEED_ICON2":1.5===h?"UI_SPEED_ICON15":"UI_SPEED_ICON4_OFF")):2===h&&i>0?(this.speedActive=!0,this.lblSpeed.textColor=16711680,this.lblSpeed.text=i$.displayTimeAsDayTime(i),this.lblSpeed.texture=kS.getTexture("UI_Ekkorr","UI_SPEED_ICON2")):1.5===h&&i>0?(this.speedActive=!0,this.lblSpeed.textColor=16711680,this.lblSpeed.text=i$.displayTimeAsDayTime(i),this.lblSpeed.texture=kS.getTexture("UI_Ekkorr","UI_SPEED_ICON15")):(this.speedActive=!1,this.lblSpeed.textColor=11184810,i>0?(this.lblSpeed.text=i$.displayTimeAsDayTime(i),this.lblSpeed.texture=kS.getTexture("UI_Ekkorr","UI_SPEED_ICON2_OFF")):this.lblSpeed.text="00:00")}
- const t=cR.time; - if(!(XD.speed15EndTime-t>0))return void Eli.getInstance().showPopup(); - const i=this.userSpeedMode??2; - let s; - s=2===i?1:1===i?1.5:2,this.userSpeedMode=s,this.updateGameSpeed()} + const t=DR.time,i=EG.speed15EndTime-t>0,s=EG.godBlessEndTime-t>0; + if(!i&&!s)return void qui.getInstance().showPopup(); + const e=hdi({ + userSpeedMode:this.userSpeedMode,godBlessOff:VD.godBlessOff} + ,i?2:1,s); + this.userSpeedMode=e.userSpeedMode,VD.godBlessOff=e.godBlessOff,this.updateGameSpeed()}
+ updateAttendEvent(){ + const t=GB.isValidEvent(BB.ATTEND_EVENT); + this.btnAttendEvent.visible!=t&&(this.btnAttendEvent.visible=t),t&&GB.hasTodayAttendReward()?this.btnAttendEvent.showRedDot(5,5):this.btnAttendEvent.hideRedDot()} + async onAttendEventClick(){ + try{ + const{ + AttendEventPopup:t} + =await ei(async()=>{ + const{ + AttendEventPopup:t} + =await Promise.resolve().then(()=>U_i); + return{ + AttendEventPopup:t} + } + ,void 0); + await t.getInstance().setData(),t.getInstance().show()} + catch(t){ + } + }
MiniAscentFlow 12 hunks, 35 statements
+ if(this.seasonEndNotified=!1,Fbi.getInstance().leaveShopOnly(),Fbi.getInstance().isSeasonOver())return this.leaveEnded();
+ static async enterShop(){ + this.seasonEndNotified=!1; + const t=Fbi.getInstance(); + if(t.enterShopOnly(),t.isSeasonOver())return this.leaveEnded(); + this.navigationRevision++,this.stopAutoBattle(),await obi.ensure(),this.configureShell(),await t.discardPendingResult(); + const{ + MiniAscentEventShopPage:i} + =await ei(async()=>{ + const{ + MiniAscentEventShopPage:t} + =await Promise.resolve().then(()=>UQi); + return{ + MiniAscentEventShopPage:t} + } + ,void 0); + i.getInstance().show()}
- P_i.getInstance().onNavigate=t=>this.openTab(t),P_i.getInstance().onExit=()=>{ + this.shellReady=!0,Vbi.getInstance().onSeasonEnded=()=>{ + this.leaveEnded()} + ,Fbi.getInstance().onSeasonEnded=()=>{ + this.leaveEnded()} + ,Vbi.getInstance().onNavigate=t=>this.openTab(t),Vbi.getInstance().onExit=()=>{
+ if(!Fbi.getInstance().shopOnly||"shop"===t){
+ }
- this.configureShell();
- if(!s.run)return this.showLobby(); + if(s.isSeasonOver())return this.leaveEnded(); + if(this.configureShell(),!s.run)return this.showLobby();
+ if(this.autoBattleInFlight=!1,h.isSeasonOver())return this.leaveEnded();
- this.autoBattleInFlight=!1;
- return AH.getInstance().showMessage(nB.getText("","결과 전송 실패 — 로비에서 다시 전송합니다")),void(await t.backToLobby())} + return h.isSeasonOver()?this.leaveEnded():(vH.getInstance().showMessage(RB.getText("","결과 전송 실패 — 로비에서 다시 전송합니다")),void(await t.backToLobby()))}
+ static async leaveEnded(){ + this.navigationRevision++,this.stopAutoBattle(),this.autoBattleInFlight=!1; + const t=Rui.getInstance(); + t.isIdleBattleActive()||t.returnToIdleBattle(),this.shellReady&&Vbi.getInstance().hideImmediately(),await Fbi.getInstance().discardPendingResult(),this.seasonEndNotified||(this.seasonEndNotified=!0,vH.getInstance().showMessage(RB.getText("COMMON_169","이벤트가 종료되었습니다.")))}
+ if(Fbi.getInstance().isSeasonOver())return this.leaveEnded();
RightMenu 14 hunks, 34 statements
- super(),Xt(this,"btnSetting"),Xt(this,"btnMail"),Xt(this,"btnHelp"),Xt(this,"indicator"),Xt(this,"indicatorArea"),Xt(this,"bg"),Xt(this,"container"),Xt(this,"btnRanking"),Xt(this,"btnAchieve"),Xt(this,"btnPass"),Xt(this,"btnGuild"),Xt(this,"btnPet"),Xt(this,"btnInventory"),Xt(this,"btnDaily"),Xt(this,"btnMine"),Xt(this,"btnInvite"),Xt(this,"btnPayback"),Xt(this,"btnTournament"),Xt(this,"_opened",!1),Xt(this,"count",0),Xt(this,"onPetDataChangeBind"),Xt(this,"countUtc0",0),Xt(this,"onReviveBind"),Xt(this,"onMailChangeBind"),Xt(this,"onReferralStatusBind"),Xt(this,"onPaybackEventBind"),Xt(this,"onPaymentSuccessBind"),Xt(this,"onAchieveStatusBind"),Xt(this,"onPassStatusBind"),Xt(this,"onGuildInfoUpdateBind"),Xt(this,"petPoint",new _i),Xt(this,"petPointInitialized",!1),Xt(this,"guildPoint",new _i),Xt(this,"guildPointInitialized",!1),Xt(this,"indicatorRedDot"),this.btnHelp=new nU("UI","Btn_help_p"),this.btnHelp.y=-50,this.btnHelp.onClick=this.onHelpBtnClick.bind(this),this.btnHelp.visible=iG.getInstance().development; - const t=this.btnHelp.y+this.btnHelp.height+4; - this.btnSetting=new nU("UI_Ekkorr","Btn_Setting"),this.btnSetting.x=-this.btnSetting.width-10,this.btnSetting.y=t,this.addChild(this.btnSetting),this.btnMail=new nU("UI_Ekkorr","Btn_Mailbox"),this.btnMail.x=this.btnSetting.x-this.btnMail.width,this.btnMail.y=t,this.addChild(this.btnMail),this.btnSetting.onClick=this.onSettingBtnClick.bind(this),this.btnMail.onClick=this.onMailBtnClick.bind(this); - const i=.5*(this.btnMail.x+(this.btnSetting.x+this.btnSetting.width)); - this.btnHelp.x=i-.5*this.btnHelp.width,this.container=new He,this.container.x=-40,this.container.y=this.btnSetting.y+this.btnSetting.height-5,this.addChild(this.container),this.bg=new kM({ + super(),Zt(this,"btnSetting"),Zt(this,"btnMail"),Zt(this,"btnEventSchedule"),Zt(this,"indicator"),Zt(this,"indicatorArea"),Zt(this,"bg"),Zt(this,"container"),Zt(this,"btnRanking"),Zt(this,"btnAchieve"),Zt(this,"btnPass"),Zt(this,"btnGuild"),Zt(this,"btnPet"),Zt(this,"btnInventory"),Zt(this,"btnDaily"),Zt(this,"btnMine"),Zt(this,"btnTournament"),Zt(this,"menuXoffset",2),Zt(this,"_opened",!1),Zt(this,"count",0),Zt(this,"onPetDataChangeBind"),Zt(this,"countUtc0",0),Zt(this,"onReviveBind"),Zt(this,"onMailChangeBind"),Zt(this,"onPaymentSuccessBind"),Zt(this,"onAchieveStatusBind"),Zt(this,"onPassStatusBind"),Zt(this,"onGuildInfoUpdateBind"),Zt(this,"petPoint",new yi),Zt(this,"petPointInitialized",!1),Zt(this,"guildPoint",new yi),Zt(this,"guildPointInitialized",!1),Zt(this,"indicatorRedDot"),this.btnSetting=new UU("UI_Ekkorr","Btn_Setting"),this.btnSetting.x=-this.btnSetting.width-10+this.menuXoffset,this.btnSetting.y=-13,this.addChild(this.btnSetting),this.btnMail=new UU("UI_Ekkorr","Btn_Mailbox"),this.btnMail.x=this.btnSetting.x-this.btnMail.width+this.menuXoffset,this.btnMail.y=-13,this.addChild(this.btnMail),this.btnEventSchedule=new UU("UI_Ekkorr","Btn_EventSchedule"),this.btnEventSchedule.x=this.btnMail.x-this.btnEventSchedule.width+this.menuXoffset,this.btnEventSchedule.y=-13,this.addChild(this.btnEventSchedule),this.btnSetting.onClick=this.onSettingBtnClick.bind(this),this.btnMail.onClick=this.onMailBtnClick.bind(this),this.btnEventSchedule.onClick=this.onEventScheduleBtnClick.bind(this),this.container=new Ve,this.container.x=-40,this.container.y=this.btnSetting.y+this.btnSetting.height-5,this.addChild(this.container),this.bg=new eE({
- ),this.container.addChild(this.bg),this.indicator=new je(eS.getTexture("UI_Ekkorr","UI_Menu_Open")),this.indicator.x=this.bg.x+15,this.indicator.y=this.bg.y+21,this.container.addChild(this.indicator),this.indicatorArea=new je(eS.getTexture("UI_Ekkorr","whiteRect")),this.indicatorArea.alpha=.01,this.indicatorArea.width=this.indicator.width+30,this.indicatorArea.height=this.indicator.height+20,this.indicatorArea.x=this.indicator.x-15,this.indicatorArea.y=this.indicator.y-10,this.container.addChild(this.indicatorArea),this.indicatorArea.eventMode="dynamic",this.indicatorArea.on("pointertap",this.onIndicatorTap,this),this.btnRanking=new nU("UI_Ekkorr","Icon_Ranking"),this.btnAchieve=new nU("UI_Ekkorr","Btn_Achieve"),this.btnPass=new nU("UI_Ekkorr","Btn_Pass"),this.btnGuild=new nU("UI_Ekkorr","Btn_Guild"),this.btnPet=new nU("UI_Ekkorr","Icon_Pet"),this.btnInventory=new nU("UI_Ekkorr","Icon_Inventory"),this.btnDaily=new nU("UI_Ekkorr","Icon_Daily"),this.btnMine=new nU("UI_Ekkorr","Btn_Event"),this.btnInvite=new nU("UI_Ekkorr","Btn_Friend"),this.btnPayback=new nU("UI_Ekkorr","Btn_Payback"),this.btnTournament=new nU("UI_Ekkorr","Icon_Tournament"),this.btnRanking.onClick=this.onRankingBtnClick.bind(this),this.btnAchieve.onClick=this.onAchieveBtnClick.bind(this),this.btnPass.onClick=this.onPassBtnClick.bind(this),this.btnGuild.onClick=this.onGuildBtnClick.bind(this),this.btnPet.onClick=this.onPetBtnClick.bind(this),this.btnInventory.onClick=this.onInventoryBtnClick.bind(this),this.btnDaily.onClick=this.onDailyBtnClick.bind(this),this.btnMine.onClick=this.onMineBtnClick.bind(this),this.btnInvite.onClick=this.onInviteBtnClick.bind(this),this.btnPayback.onClick=this.onPaybackBtnClick.bind(this),this.btnTournament.onClick=this.onTournamentBtnClick.bind(this),this.update(),this.on("added",this.onAdded,this),this.on("removed",this.onRemoved,this),Iqt.getInstance().registerRightMenuIndicatorButtonGetter(t=>"indicatorArea"===t&&this.indicatorArea.visible?{ + ),this.container.addChild(this.bg),this.indicator=new Ye(kS.getTexture("UI_Ekkorr","UI_Menu_Open")),this.indicator.x=this.bg.x+15,this.indicator.y=this.bg.y+21,this.container.addChild(this.indicator),this.indicatorArea=new Ye(kS.getTexture("UI_Ekkorr","whiteRect")),this.indicatorArea.alpha=.01,this.indicatorArea.width=this.indicator.width+30,this.indicatorArea.height=this.indicator.height+20,this.indicatorArea.x=this.indicator.x-15,this.indicatorArea.y=this.indicator.y-10,this.container.addChild(this.indicatorArea),this.indicatorArea.eventMode="dynamic",this.indicatorArea.on("pointertap",this.onIndicatorTap,this),this.btnRanking=new UU("UI_Ekkorr","Icon_Ranking"),this.btnAchieve=new UU("UI_Ekkorr","Btn_Achieve"),this.btnPass=new UU("UI_Ekkorr","Btn_Pass"),this.btnGuild=new UU("UI_Ekkorr","Btn_Guild"),this.btnPet=new UU("UI_Ekkorr","Icon_Pet"),this.btnInventory=new UU("UI_Ekkorr","Icon_Inventory"),this.btnDaily=new UU("UI_Ekkorr","Icon_Daily"),this.btnMine=new UU("UI_Ekkorr","Btn_Event"),this.btnTournament=new UU("UI_Ekkorr","Icon_Tournament"),this.btnRanking.onClick=this.onRankingBtnClick.bind(this),this.btnAchieve.onClick=this.onAchieveBtnClick.bind(this),this.btnPass.onClick=this.onPassBtnClick.bind(this),this.btnGuild.onClick=this.onGuildBtnClick.bind(this),this.btnPet.onClick=this.onPetBtnClick.bind(this),this.btnInventory.onClick=this.onInventoryBtnClick.bind(this),this.btnDaily.onClick=this.onDailyBtnClick.bind(this),this.btnMine.onClick=this.onMineBtnClick.bind(this),this.btnTournament.onClick=this.onTournamentBtnClick.bind(this),this.update(),this.on("added",this.onAdded,this),this.on("removed",this.onRemoved,this),MXt.getInstance().registerRightMenuIndicatorButtonGetter(t=>"indicatorArea"===t&&this.indicatorArea.visible?{
- this.setRevive(!0),this.setMailChange(!0),this.setAchieveStatus(!0),this.setPassStatus(!0),this.setReferralStatus(!0),this.setPaybackEvent(!0),this.setPaymentSuccess(!0),this.setGuildInfoUpdate(!0),this.setPetDataChange(!0)} + this.setRevive(!0),this.setMailChange(!0),this.setAchieveStatus(!0),this.setPassStatus(!0),this.setPaymentSuccess(!0),this.setGuildInfoUpdate(!0),this.setPetDataChange(!0)}
- this.setRevive(!1),this.setMailChange(!1),this.setAchieveStatus(!1),this.setPassStatus(!1),this.setReferralStatus(!1),this.setPaybackEvent(!1),this.setPaymentSuccess(!1),this.setGuildInfoUpdate(!1),this.setPetDataChange(!1)} + this.setRevive(!1),this.setMailChange(!1),this.setAchieveStatus(!1),this.setPassStatus(!1),this.setPaymentSuccess(!1),this.setGuildInfoUpdate(!1),this.setPetDataChange(!1)}
- const t=-this.bg.width; + const t=-this.bg.width+this.menuXoffset;
- e.push(this.btnInventory),null!=QL.getTournamentSchedule()&&e.push(this.btnTournament); - const n=[]; - Azt.opened&&n.push(this.btnInvite),Dzt.opened&&n.push(this.btnPayback),this.container.removeChildren(),this.container.addChild(this.bg),this.container.addChild(this.indicator),this.container.addChild(this.indicatorArea); - const h=[i,e,n].filter(t=>t.length>0); - let r=this.bg.x+50,o=0,a=null; + e.push(this.btnInventory),null!=SD.getTournamentSchedule()&&e.push(this.btnTournament),this.container.removeChildren(),this.container.addChild(this.bg),this.container.addChild(this.indicator),this.container.addChild(this.indicatorArea); + const n=[i,e,[]].filter(t=>t.length>0); + let h=this.bg.x+50+this.menuXoffset,r=0,o=null;
- s>o&&(o=s),r+=t[0].width,a||(a=t[0])} + s>r&&(r=s),h+=t[0].width-this.menuXoffset,o||(o=t[0])}
- this.onMailChange(null),this.onAchieveStatus(null),this.onPassStatus(null),this.onReferralStatus(null),this.onPaybackEvent(null),this.onGuildInfoUpdate(null)} + this.onMailChange(null),this.onAchieveStatus(null),this.onPassStatus(null),this.onGuildInfoUpdate(null)}
- onHelpBtnClick(){ - RYt.getInstance().show()} + async onEventScheduleBtnClick(){ + await Bii.getInstance().setData(),Bii.getInstance().show()}
- async onInviteBtnClick(){ - await fhi.getInstance().setData(),fhi.getInstance().show()} - async onPaybackBtnClick(){ - await Chi.getInstance().setData(),Chi.getInstance().show()}
- return XD.maxWave>=200&&lB.isValidEvent(uB.MINE_EVENT)||lB.isValidEvent(uB.MINI_ASCENT_EVENT)} + return EG.maxWave>=200&&GB.isValidEvent(BB.MINE_EVENT)||GB.isValidEvent(BB.MINI_ASCENT_EVENT)||GB.isAscentShopOpen()||OG.getInstance().development}
+ async executeOnTournamentBtnClick(){ + this.onTournamentBtnClick()}
- setReferralStatus(t){ - mS.getInstance().removeEventListener("ReferralStatus",this.onReferralStatusBind),t&&(this.onReferralStatusBind=this.onReferralStatus.bind(this),mS.getInstance().addEventListener("ReferralStatus",this.onReferralStatusBind))} - onReferralStatus(t){ - Azt.hasReward()?this.btnInvite.showRedDot():this.btnInvite.hideRedDot()} - setPaybackEvent(t){ - mS.getInstance().removeEventListener("PaybackEvent",this.onPaybackEventBind),t&&(this.onPaybackEventBind=this.onPaybackEvent.bind(this),mS.getInstance().addEventListener("PaybackEvent",this.onPaybackEventBind))} - onPaybackEvent(t){ - Dzt.opened&&(this.btnPayback.parent||this.update(),Dzt.hasReward()?this.btnPayback.showRedDot():this.btnPayback.hideRedDot())}
- XD.maxWave>=vR.getInstance().unlockWave&&(t=vR.getInstance().hasAnyEvolvable(),t)||QL.opened&&QL.unlocked&&(t=await QL.checkRedDot(),t)||Dzt.opened&&(t=Dzt.hasReward(),t)||Azt.opened&&(t=Azt.hasReward(),t)?this.showIndicatorRedDot():this.hideIndicatorRedDot()} + EG.maxWave>=jR.getInstance().unlockWave&&(t=jR.getInstance().hasAnyEvolvable(),t)||SD.opened&&SD.unlocked&&(t=await SD.checkRedDot(),t)?this.showIndicatorRedDot():this.hideIndicatorRedDot()}
IntroProgressBar 1 hunks, 34 statements
+ const wfi=class extends Ve{ + constructor(t=400){ + super(),Zt(this,"bar",new ip),Zt(this,"lbl"),Zt(this,"fill",new gl({ + start:{ + x:0,y:0} + ,end:{ + x:0,y:1} + ,colorStops:[{ + offset:0,color:16772270} + ,{ + offset:.45,color:16760661} + ,{ + offset:1,color:14052133} + ]} + )),this.barWidth=t,this.eventMode="none"; + const i=(new ip).roundRect(0,0,t,28,8).fill(1444619).roundRect(1,1,t-2,26,7).stroke({ + color:13012041,width:1.5} + ).roundRect(4,4,t-8,20,4).fill(3481626); + this.addChild(i,this.bar); + const s=sD.DEFAULT_OUTLINE_FONT_OPTION_17; + s.fill=16773333,s.stroke={ + color:2166284,width:3,join:"round"} + ,this.lbl=new QD("",s.fill,s),this.addChild(this.lbl),this.update(0,11)} + update(t,i){ + const s=i>0?Math.max(0,Math.min(1,t/i)):0,e=(this.barWidth-10)*s; + this.bar.clear(),e>0&&this.bar.roundRect(5,5,e,18,Math.min(3,e/2)).fill(this.fill),this.lbl.text=`${ + t} + / ${ + i} + `,this.lbl.x=.5*(this.barWidth-this.lbl.width),this.lbl.y=.5*(28-this.lbl.height)} + } + ; + Qt(wfi,"IntroProgressBar"); + let mfi=wfi;
EmberRat1 1 hunks, 33 statements
+ const B3=class extends U1{ + constructor(){ + super()} + initializeData(){ + super.initializeData(),this.className=HR.EmberRat1,this.hitHeight=18,this.hitWidth=15,this.radius=12,this.idleFrames=new DH(0,19),this.moveFrames=new DH(20,30),this.attackFrames=new DH(31,60),this.skillFrames=new DH(31,60),this.dieFrames=new DH(61,68),this.objAtk={ + 45:1} + ,this.setSize(.9)} + } + ; + Qt(B3,"EmberRat1"); + let U3=B3; + const F3=class extends U1{ + constructor(){ + super()} + initializeData(){ + super.initializeData(),this.className=HR.LavaBeetle1,this.hitHeight=20,this.hitWidth=16,this.radius=13,this.idleFrames=new DH(0,19),this.moveFrames=new DH(20,29),this.attackFrames=new DH(30,53),this.skillFrames=new DH(30,53),this.dieFrames=new DH(54,61),this.objAtk={ + 45:1} + ,this.setSize(.9)} + } + ; + Qt(F3,"LavaBeetle1"); + let $3=F3; + const H3=class extends U1{ + constructor(){ + super()} + initializeData(){ + super.initializeData(),this.className=HR.CharcoalWolf1,this.hitHeight=24,this.hitWidth=18,this.radius=15,this.idleFrames=new DH(0,19),this.moveFrames=new DH(20,28),this.attackFrames=new DH(29,51),this.skillFrames=new DH(29,51),this.dieFrames=new DH(52,59),this.objAtk={ + 42:1} + ,this.setSize(.9),this.startSound=qG.SFX_BATTLE_WOLF_START,this.attackSound=qG.SFX_BATTLE_WOLF_ATTACK,this.dieSound=qG.SFX_BATTLE_WOLF_DIE} + } + ; + Qt(H3,"CharcoalWolf1"); + let W3=H3;
InAppPurchaseManager 5 hunks, 31 statements
+ try{ + const{ + ShopProductResultPopup:t} + =await ei(async()=>{ + const{ + ShopProductResultPopup:t} + =await Promise.resolve().then(()=>o_i); + return{ + ShopProductResultPopup:t} + } + ,void 0); + t.getInstance().setData(l),t.getInstance().show()} + catch(r){
- YG.getInstance().show(u),mS.getInstance().dispatchCustomEvent("PaymentSuccess",{ + bB.getInstance().show(t)} + WS.getInstance().dispatchCustomEvent("PaymentSuccess",{
- onBuyProductComplete(t,i){ + async onBuyProductComplete(t,i){
+ try{ + const{ + ShopProductResultPopup:t} + =await ei(async()=>{ + const{ + ShopProductResultPopup:t} + =await Promise.resolve().then(()=>o_i); + return{ + ShopProductResultPopup:t} + } + ,void 0); + t.getInstance().setData(r),t.getInstance().show()} + catch(e){
- YG.getInstance().show(o),mS.getInstance().dispatchCustomEvent("PaymentSuccess",{ + bB.getInstance().show(t)} + WS.getInstance().dispatchCustomEvent("PaymentSuccess",{
BottomMenu 12 hunks, 31 statements
- const Kci=class extends He{ + const Mui=class t extends Ve{
- super(),Xt(this,"bg"),Xt(this,"icon"),Xt(this,"line"),Xt(this,"index",0),Xt(this,"arrNormalNames",["menu_icon_01_on","menu_icon_03_on","menu_icon_02_on","menu_icon_04_on","menu_icon_05_on","menu_icon_06_on"]),Xt(this,"lblTitle",new SD("SHOP",16777215,OL.BOTTOM_MENU_FONT_OPTION)),Xt(this,"container",new He),Xt(this,"_selected",!1),Xt(this,"onClick",qt(()=>{ + super(),Zt(this,"bg"),Zt(this,"icon"),Zt(this,"index",0),Zt(this,"arrNormalNames",["menu_icon_01_on","menu_icon_03_on","menu_icon_02_on","menu_icon_04_on","menu_icon_05_on","menu_icon_06_on"]),Zt(this,"lblTitle",new QD("SHOP",t.LABEL_NORMAL,sD.BOTTOM_MENU_FONT_OPTION)),Zt(this,"_selected",!1),Zt(this,"onClick",Qt(()=>{
- ,"onClick")),Xt(this,"orgScale",1),Xt(this,"onMotionComplete",null),Xt(this,"eventTag"),Xt(this,"lockIcon"),Xt(this,"redDot"),this.index=t,this.createUI()} + ,"onClick")),Zt(this,"orgScale",1),Zt(this,"onMotionComplete",null),Zt(this,"eventTag"),Zt(this,"eventTagOn",!1),Zt(this,"lockBadge",null),Zt(this,"_locked",!1),Zt(this,"redDot"),this.index=i,this.createUI()}
- ),this.addChild(this.bg),this.bg.width=640/6,this.icon=new je(eS.getTexture("UI_Ekkorr",this.arrNormalNames[this.index])),this.addChild(this.icon),this.icon.x=.5*(this.bg.width-this.icon.width),this.icon.y=.5*(this.bg.height-10-this.icon.height),this.lblTitle.x=.5*(this.bg.width-this.lblTitle.width),this.lblTitle.y=40,this.bg.eventMode="static",this.bg.hitArea=new Di(0,0,this.bg.width,this.bg.height),this.bg.on("pointerdown",this.onLobbyClick,this),this.addChild(this.bg),this.addChild(this.icon),this.addChild(this.lblTitle),this.icon.eventMode="none",this.lblTitle.eventMode="none"} + ),this.addChild(this.bg),this.bg.width=640/6,this.bg.height=70,this.icon=new Ye(kS.getTexture("UI_Ekkorr",this.arrNormalNames[this.index])),this.addChild(this.icon),this.orgScale=Math.min(1,38/this.icon.height,52/this.icon.width),this.icon.scale.set(this.orgScale),this.icon.anchor.set(.5),this.icon.position.set(.5*this.bg.width,23),this.lblTitle.x=.5*(this.bg.width-this.lblTitle.width),this.lblTitle.y=44,this.bg.eventMode="static",this.bg.hitArea=new Ui(0,0,this.bg.width,this.bg.height),this.bg.on("pointerdown",this.onLobbyClick,this),this.addChild(this.bg),this.addChild(this.icon),this.addChild(this.lblTitle),this.icon.eventMode="none",this.lblTitle.eventMode="none",this.selected=!1}
- this.lblTitle.text=t,this.lblTitle.x=.5*(this.bg.width-this.lblTitle.width)} + this.lblTitle.scale.set(1),this.lblTitle.text=t; + const i=Math.min(1,(this.bg.width-8)/Math.max(1,this.lblTitle.width)); + this.lblTitle.scale.set(i),this.lblTitle.x=.5*(this.bg.width-this.lblTitle.width)}
- this._selected=t,t?(this.bg.texture=eS.getTexture("UI_Ekkorr","UI_MAIN_MENU_BG_ON"),this.icon.tint=16777215,this.lblTitle.tint=16777215,this.up()):(this.bg.texture=eS.getTexture("UI_Ekkorr","UI_MAIN_MENU_BG_OFF"),this.icon.tint=6710886,this.lblTitle.tint=4473924,this.down()),this.updateEventTagState()} + this._selected=t,this.bg.texture=kS.getTexture("UI_Ekkorr",t?"UI_MAIN_MENU_BG_ON":"UI_MAIN_MENU_BG_OFF"),this.applyLook(),t?this.up():this.down(),this.updateEventTagState()} + applyLook(){ + this._locked?(this.icon.tint=t.ICON_LOCKED_TINT,this.lblTitle.textColor=t.LABEL_LOCKED):this._selected?(this.icon.tint=16777215,this.lblTitle.textColor=t.LABEL_SELECTED):(this.icon.tint=15066597,this.lblTitle.textColor=t.LABEL_NORMAL)}
- this.eventTag||(this.eventTag=new je(eS.getTexture("UI_Ekkorr","UI_Event")),this.addChild(this.eventTag)),this.eventTag.visible=!0,this.updateEventTag(t,i)} + this.eventTag||(this.eventTag=new Ye(kS.getTexture("UI_Ekkorr","UI_Event")),this.addChild(this.eventTag)),this.eventTagOn=!0,this.eventTag.visible=!this._locked,this.updateEventTag(t,i)}
- this.eventTag&&(this.eventTag.visible=!1)} + this.eventTagOn=!1,this.eventTag&&(this.eventTag.visible=!1)}
- this.eventTag&&0!=this.eventTag.visible&&(this._selected?this.eventTag.tint=16777215:this.eventTag.tint=6710886)} + this.eventTag&&0!=this.eventTag.visible&&(this.eventTag.tint=16777215)}
- showLockIcon(t=0,i=0){ - this.lockIcon||(this.lockIcon=new je(eS.getTexture("UI_Ekkorr","Icon_Lock")),this.addChild(this.lockIcon)),this.lockIcon.visible=!0,this.updateLockIcon(t,i)} - hideLockIcon(){ - this.lockIcon&&(this.lockIcon.visible=!1)} - updateLockIcon(t,i){ - this.lockIcon&&(this.lockIcon.x=this.width-this.lockIcon.width+t,this.lockIcon.y=this.y+i,this.updateLockIconState())} - updateLockIconState(){ - this.lockIcon&&0!=this.lockIcon.visible&&(this.lockIcon.tint=16777215)} - getLockIconVisible(){ - return!!this.lockIcon&&this.lockIcon.visible} + get locked(){ + return this._locked} + set locked(i){ + var s; + this._locked!==i&&(this._locked=i,i?(this.lockBadge||(this.lockBadge=this.createLockBadge()),this.addChild(this.lockBadge)):null==(s=this.lockBadge)||s.removeFromParent(),this.icon.filters=i?[t.getLockFilter()]:null,this.applyLook(),this.eventTag&&(this.eventTag.visible=this.eventTagOn&&!i),this.redDot&&(this.redDot.visible=!i))} + static getLockFilter(){ + return t.lockFilter||(t.lockFilter=new bf({ + resolution:"inherit"} + ),t.lockFilter.desaturate()),t.lockFilter} + createLockBadge(){ + const i=t.LOCK_BADGE_R,s=new Ve; + s.addChild((new ip).circle(0,0,i+2).fill(3812898).circle(0,0,i).fill(1775121)); + const e=new Ye(kS.getTexture("UI_Ekkorr","Icon_Lock")); + e.anchor.set(.5),e.scale.set(.55),s.addChild(e); + const n=this.icon.texture.width*this.orgScale; + return s.position.set(.5*this.bg.width+Math.min(22,.5*n+4),31),s.eventMode="none",s}
- this.redDot||(this.redDot=new je(eS.getTexture("UI_Ekkorr","red_dot_ani_30f_0001"))),this.updateRedDot(),this.addChild(this.redDot)} + this.redDot||(this.redDot=new Ye(kS.getTexture("UI_Ekkorr","red_dot_ani_30f_0001"))),this.updateRedDot(),this.redDot.visible=!this._locked,this.addChild(this.redDot)}
- qt(Kci,"BottomMenu"); + Qt(Mui,"BottomMenu"),Zt(Mui,"LABEL_NORMAL",14008992),Zt(Mui,"LABEL_SELECTED",16773320),Zt(Mui,"LABEL_LOCKED",7300695),Zt(Mui,"ICON_LOCKED_TINT",8026746),Zt(Mui,"LOCK_BADGE_R",11),Zt(Mui,"lockFilter",null);
FavoritePetCell 8 hunks, 29 statements
- let E3t=b3t,M3t=(qt(Gt=class extends iR{ + let N6t=P6t; + let L6t=(Qt(Ft=class extends OR{
- this.petKindNum=t; + this.petKindNum=i,t.cellByPet.set(i,this);
- var i,s,e,n,h,r; + var i,s,e,n,h,r,o,a;
- let d=0,f=!1; + let p=0,g=0,w=!1;
- d+=(null==(r=null==(h=a.body)?void 0:h.reward)?void 0:r.totalAmount)??c*(t.reward||0),u-=c,0!==c&&(f=!0)} + p+=(null==(r=null==(h=l.body)?void 0:h.reward)?void 0:r.totalAmount)??u*(t.reward||0),g+=(null==(a=null==(o=l.body)?void 0:o.reward)?void 0:a.bonusAmount)??0,f-=u,0!==u&&(w=!0)}
- f&&bzt.getInstance().markDirty(),T3t.getInstance().setData(),AH.getInstance().showMessage(nB.getValueReplace("GAME_1189","##",d,`펫 조각 ${ + w&&bYt.getInstance().markDirty(),U6t.getInstance().setData(); + const m=g>0?RB.getValueReplace("GAME_1709","##",g,`정령의 친화: 펫 조각 +${
- 개를 획득했습니다.`))} + `):""; + let v=RB.getValueReplace("GAME_1189","##",p,`펫 조각 ${ + p} + 개를 획득했습니다.`); + m&&(v+="\n"+m); + const _=vH.getInstance(); + _.textAlignCenter=g>0,_.showMessage(v),m&&(t.cellByPet.get(this.petKindNum)??this).playBonusFloat(m)} + playBonusFloat(i){ + const s=U6t.getInstance(),e=new QD(i,t.BONUS_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_16); + e.textColor=t.BONUS_COLOR,e.eventMode="none"; + const n=s.toLocal(this.toGlobal(new yi(this.lblPiece.x,this.lblPiece.y-4))),h=s.toLocal(this.toGlobal(new yi(305,0))).x; + e.x=Math.min(n.x,h-e.width),e.y=n.y,e.alpha=0,s.addChild(e),MR.timeline({ + onComplete:Qt(()=>e.destroy(),"onComplete")} + ).to(e,{ + alpha:1,duration:.15} + ).to(e,{ + y:e.y-34,duration:1.1,ease:"power1.out"} + ,0).to(e,{ + alpha:0,duration:.35} + ,.85)}
- qt(A3t,"FavoritePetCell"),Xt(A3t,"isPrompting",!1); + Qt(D6t,"FavoritePetCell"),Zt(D6t,"isPrompting",!1),Zt(D6t,"BONUS_COLOR",16765786),Zt(D6t,"cellByPet",new Map);
RankingItemRenderer 3 hunks, 28 statements
- const Fhi=class extends iR{ - constructor(){ - super(),Xt(this,"bg"),Xt(this,"iconRanking"),Xt(this,"lblName"),Xt(this,"lblLevel"),Xt(this,"sheetName","UI_Ekkorr"),Xt(this,"userName",""),this.bg=new kM({ - texture:eS.getTexture(this.sheetName,"Popup_List_02"),leftWidth:140,topHeight:30,rightWidth:20,bottomHeight:30} - ),this.bg.width=570,this.addChild(this.bg),this.iconRanking=new Ghi,this.iconRanking.x=15,this.iconRanking.y=.5*(this.bg.height-this.iconRanking.height),this.addChild(this.iconRanking),this.lblName=new SD("Item Name",16777215),this.lblName.text="Item Name",this.lblName.x=148,this.lblName.y=.5*(this.bg.height-this.lblName.height),this.addChild(this.lblName),this.lblLevel=new SD("Item Level",16777215),this.lblLevel.text="Item Level",this.lblLevel.x=this.bg.width-100,this.lblLevel.y=.5*(this.bg.height-this.lblLevel.height),this.addChild(this.lblLevel)} - setData(t){ - this.iconRanking.setRanking(t.rank),this.lblName.text=t.name,this.userName=String(t.name??""); + const noi=["Icon_Startwave_01","BTN_WAVE","Icon_medal_1st"]; + function hoi(t){
- this.lblLevel.text=0==i?t.maxWave:1==i?t.accuWave:_D.displayLargeNumberAsAlphabet(t.accuMedal),this.lblLevel.x=this.bg.width-80+.5*(50-this.lblLevel.width),t.name==XD.name?this.bg.texture=eS.getTexture(this.sheetName,"Popup_List_03"):this.bg.texture=eS.getTexture(this.sheetName,"Popup_List_02")} + return 0===i?String(t.maxWave??0):1===i?String(t.accuWave??0):KD.displayLargeNumberAsAlphabet(t.accuMedal??0)} + Qt(hoi,"rankingValueText"); + const roi=class t extends OR{ + constructor(){ + super(),Zt(this,"bg",new ip),Zt(this,"badge",new i0t(56)),Zt(this,"lblName"),Zt(this,"lblLv"),Zt(this,"valueIcon"),Zt(this,"lblValue"),Zt(this,"chevron",new ip),Zt(this,"userName",""); + const i=t.W,s=t.H; + this.drawBg(t.BG),this.addChild(this.bg),this.badge.x=6,this.badge.y=.5*(s-56),this.addChild(this.badge),this.lblName=new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_20),this.lblName.x=76,this.lblName.y=8,this.addChild(this.lblName),this.lblLv=new QD("",13216120),this.lblLv.textSize=14,this.lblLv.x=77,this.lblLv.y=36,this.addChild(this.lblLv),this.valueIcon=new Ye(kS.getTexture("UI_Ekkorr",noi[0])),this.addChild(this.valueIcon),this.lblValue=new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_20),this.lblValue.textSize=22,this.addChild(this.lblValue),this.chevron.poly([0,0,3,0,9,8,3,16,0,16,6,8]).fill(9074528),this.chevron.x=i-22,this.chevron.y=.5*(s-16),this.addChild(this.chevron); + for(const t of[this.bg,this.lblName,this.lblLv,this.valueIcon,this.lblValue,this.chevron])t.eventMode="none"} + drawBg(i){ + this.bg.clear().roundRect(0,0,t.W,t.H,14).fill(i)} + setData(i){ + this.userName=String((null==i?void 0:i.name)??""),this.badge.setRank(Number((null==i?void 0:i.rank)??0)),this.drawBg(""!==this.userName&&this.userName===EG.name?t.BG_ME:t.BG),this.lblName.text=this.userName,this.lblLv.text=`Lv.${ + Math.floor(Number((null==i?void 0:i.maxWave)??0)/100)} + `; + const s=qri.getInstance().selectedIndex; + this.valueIcon.texture=kS.getTexture("UI_Ekkorr",noi[s]??noi[0]),this.valueIcon.scale.set(24/this.valueIcon.texture.height),this.lblValue.text=hoi(i); + const e=t.W-34; + this.lblValue.x=e-this.lblValue.width,this.lblValue.y=.5*(t.H-this.lblValue.height),this.valueIcon.x=this.lblValue.x-this.valueIcon.width-6,this.valueIcon.y=.5*(t.H-this.valueIcon.height); + const n=this.valueIcon.x-12-this.lblName.x; + this.lblName.scale.set(this.lblName.width/this.lblName.scale.x>n?n/(this.lblName.width/this.lblName.scale.x):1)}
- qt(Fhi,"RankingItemRenderer"); + Qt(roi,"RankingItemRenderer"),Zt(roi,"W",570),Zt(roi,"H",62),Zt(roi,"BG",2892828),Zt(roi,"BG_ME",5916464);
CommonOrangeButton 1 hunks, 27 statements
+ const kdi={ + [FR.HUMAN]:"인간",[FR.ELF]:"엘프",[FR.UNDEAD]:"언데드",[FR.ORC]:"오크"} + ,Rdi={ + [FR.HUMAN]:8369407,[FR.ELF]:9429114,[FR.UNDEAD]:13147391,[FR.ORC]:3975360} + ; + function xdi(t){ + return RB.getText(`TRIBE_${ + t} + `,kdi[t]??"")} + function Pdi(t){ + return Rdi[t]??16766826} + function Ndi(){ + return EG.tribe>0?EG.tribe:FR.HUMAN} + Qt(xdi,"tribeName"),Qt(Pdi,"tribeColor"),Qt(Ndi,"castleTribe"); + const Ldi={ + [FR.HUMAN]:"CastleHuman",[FR.ELF]:"CastleElf",[FR.UNDEAD]:"CastleUndead",[FR.ORC]:"CastleOrc"} + ; + function Ddi(t){ + return Ldi[t]??null} + Qt(Ddi,"tribeCastleSkin"); + const Gdi=class extends eB{ + constructor(t,i=150,s=30){ + super(t,i,s),this.color=iB.ORANGE} + } + ; + Qt(Gdi,"CommonOrangeButton"); + let Bdi=Gdi;
ViewUtil 4 hunks, 26 statements
+ isCastleCitadelSubView(){ + var t,i; + return 0!=this.isCastleView()&&"CitadelSubView"==(null==(i=null==(t=Cqt.getInstance().currentView)?void 0:t.currentSubView)?void 0:i.className)}
- return this.isDetailPopupView("PVPBattlePopup")} + return this.isAddedToDetailPopupLayer("PVPBattlePopup")}
- isDetailPopupView(t){ + isPetPopup(){ + return this.isAddedToDetailPopupLayer("PetPopup")} + isGuildPopup(){ + return this.isAddedToDetailPopupLayer("Guild2Popup")} + isGuildWarTournamentPopup(){ + return this.isAddedToPopupLayer("GuildWarTournament2Popup")} + isInventoryPopup(){ + return this.isAddedToDetailPopupLayer("InventoryPopup")} + isAddedToPopupLayer(t){ + const i=xG.getInstance(),s=i.children.length; + let e; + for(let n=0; + n<s; + ++n)if(e=i.getChildAt(n),"string"==typeof e.className&&e.className==t)return!0; + return!1} + isAddedToDetailPopupLayer(t){
- isPetPopup(){ - return this.isDetailPopupView("PetPopup")} - isGuildPopup(){ - return this.isDetailPopupView("Guild2Popup")} - isInventoryPopup(){ - return this.isDetailPopupView("InventoryPopup")}
IntroView 6 hunks, 26 statements
- super(),Xt(this,"bg",null),Xt(this,"bgEx",null),Xt(this,"lbl"),Xt(this,"lblVersion"),Xt(this,"progress"),Xt(this,"onClick",null),Xt(this,"onSafeAreaBottomContentBind"); + super(),Zt(this,"bg",null),Zt(this,"bgEx",null),Zt(this,"lbl"),Zt(this,"lblVersion"),Zt(this,"progress"),Zt(this,"footerShade",new ip),Zt(this,"footerGradient",new gl({ + start:{ + x:0,y:0} + ,end:{ + x:0,y:1} + ,colorStops:[{ + offset:0,color:"rgba(18, 8, 10, 0)"} + ,{ + offset:.45,color:"rgba(18, 8, 10, 0.6)"} + ,{ + offset:1,color:"rgba(18, 8, 10, 0.85)"} + ]} + )),Zt(this,"onClick",null),Zt(this,"onSafeAreaBottomContentBind"),this.footerShade.eventMode="none",this.addChild(this.footerShade);
- t.fontSize=22,t.fill=16777215,t.lineHeight=40,t.align="center",t.stroke={ - color:"#236386",width:5,join:"round"} + t.fontSize=22,t.fill=16773333,t.lineHeight=32,t.align="center",t.stroke={ + color:2166284,width:5,join:"round"}
- i.fill=13495798,this.lblVersion=new SD("ver",i.fill,i),this.addChild(this.lblVersion),this.updateLayout(),this.on("added",this.onAdded,this),this.on("removed",this.onRemoved,this)} + i.fill=14006944,i.stroke={ + color:2166284,width:4,join:"round"} + ,this.lblVersion=new QD("ver",i.fill,i),this.addChild(this.lblVersion),this.updateLayout(),this.on("added",this.onAdded,this),this.on("removed",this.onRemoved,this)}
- let t=640; - this.bg&&(t=this.bg.width); - let i=1140,s=0; - this.bg&&(i=this.bg.height,s=this.bg.y),this.lbl.x=.5*(t-this.lbl.width),this.lbl.y=s+.5*i-this.lbl.height+120,this.progress.x=.5*(t-this.progress.width),this.lblVersion.x=.5*(t-this.lblVersion.width); - let e=s+i-this.lblVersion.height-20; - s<0?(this.progress.y=s+.73*i,e=Xy.stageHeight-this.lblVersion.height-20):this.progress.y=s+.81*i,e-=Xy.SAFE_AREA_BOTTOM,this.lblVersion.y=e} + var t; + const i=(null==(t=this.bg)?void 0:t.width)||ES.stageWidth||640,s=(ES.stageHeight||1140)-ES.SAFE_AREA_TOP,e=s-ES.SAFE_AREA_BOTTOM; + this.progress.x=.5*(i-this.progress.width),this.progress.y=e-120,this.lbl.setWrapWidth(i-64),this.lbl.x=.5*(i-this.lbl.width),this.lbl.y=this.progress.y-this.lbl.height-18,this.lblVersion.x=.5*(i-this.lblVersion.width),this.lblVersion.y=e-this.lblVersion.height-20; + const n=Math.max(0,this.lbl.y-60); + this.footerShade.clear().rect(0,n,i,s-n).fill(this.footerGradient)}
- this.bg=new je(e),this.bg.width=Xy.stageWidth,this.bg.scale.y=this.bg.scale.x,this.bg.y=0,Xy.stageHeight>1140&&(this.bg.y=.5*(Xy.stageHeight-this.bg.height)),this.addChildAt(this.bg,0),Xy.stageHeight>this.bg.height&&(this.bgEx=new je(eS.getTexture("UI_Ekkorr","whiteRect")),this.bgEx.tint=141887,this.bgEx.width=Xy.stageWidth,this.bgEx.scale.y=this.bgEx.scale.x,this.addChildAt(this.bgEx,0)),this.eventMode="none",this.on("pointertap",this.onPointerTap.bind(this))} + this.bg=new Ye(e),this.bg.width=ES.stageWidth,this.bg.scale.y=this.bg.scale.x,this.bg.y=0,ES.stageHeight>1140&&(this.bg.y=Math.max(0,.5*(ES.stageHeight-this.bg.height))),this.addChildAt(this.bg,0),ES.stageHeight>this.bg.height&&(this.bgEx=new Ye(kS.getTexture("UI_Ekkorr","whiteRect")),this.bgEx.tint=1181706,this.bgEx.width=ES.stageWidth,this.bgEx.height=ES.stageHeight,this.addChildAt(this.bgEx,0)),this.eventMode="none",this.on("pointertap",this.onPointerTap.bind(this))}
- this.progress.update(t,11),this.showProgress(),this.progress.showBar(),this.progress.showText()} + this.progress.update(t,11),this.showProgress()}
BackgroundLayer 8 hunks, 24 statements
- var xB=(t=>(t[t.FOREST=1]="FOREST",t[t.DEAD_LAND=2]="DEAD_LAND",t))(xB||{ + var hU=(t=>(t[t.FOREST=1]="FOREST",t[t.DEAD_LAND=2]="DEAD_LAND",t[t.FIRE_LAND=3]="FIRE_LAND",t))(hU||{
+ const rU=1e4,oU=15e3,aU=[rU,oU];
- return t>=1e4?2:1} - qt(PB,"getRealmForWave"); + return t>=oU?2:t>=rU?3:1} + function lU(t){ + return 2===t?oU:3===t?rU:0} + function uU(t,i){ + for(const s of aU)if(t<s&&i>s)return s; + return i} + function dU(t){ + return 3!==cU(t)?0:Math.floor((t-rU)/100)+1} + function fU(t){ + return 1*dU(t)} + function pU(t,i){ + return Math.max(.1,t-fU(i)/100)} + Qt(cU,"getRealmForWave"),Qt(lU,"getRealmStartWave"),Qt(uU,"clampToRealmStart"),Qt(dU,"getFireDebuffLevel"),Qt(fU,"getFireSpeedDebuffPercent"),Qt(pU,"applyFireSpeedDebuff");
- super(),Xt(this,"bg"),Xt(this,"backgroundRequestId",0),Xt(this,"fogOverlay",null),Xt(this,"fogFilter",null),this.eventMode="none",this.bg=new je(eS.getTexture("BG","BG1")),this.addChild(this.bg),this.bg.width=640,this.bg.height=640} + super(),Zt(this,"bg"),Zt(this,"backgroundRequestId",0),this.eventMode="none",this.bg=new Ye(kS.getTexture("BG","BG1")),this.addChild(this.bg),this.bg.width=640,this.bg.height=640}
- this.backgroundRequestId++,this.bg.texture=eS.getTexture("BG",t),this.bg.width=640,this.bg.height=640,this.applyFogEffect("Highland"===t)} + this.backgroundRequestId++,this.bg.texture=kS.getTexture("BG",t),this.bg.width=640,this.bg.height=640}
- this.bg.texture=n,this.bg.width=s??n.width,this.bg.height=e??n.height,this.applyFogEffect(!1)} - applyFogEffect(t){ - t?(this.fogFilter||(this.fogFilter=new of,this.fogFilter.saturate(-.35,!1),this.fogFilter.brightness(.92,!0)),this.bg.filters=[this.fogFilter],this.fogOverlay?(this.addChild(this.fogOverlay),this.fogOverlay.visible=!0):(this.fogOverlay=(new Ff).rect(0,0,640,640).fill({ - color:14674674,alpha:.18} - ),this.addChild(this.fogOverlay))):(this.bg.filters=[],this.fogOverlay&&(this.fogOverlay.visible=!1))} + this.bg.texture=n,this.bg.width=s??n.width,this.bg.height=e??n.height}
- e===this.backgroundRequestId&&(this.bg.texture=n,this.bg.width=i,this.bg.height=s,this.applyFogEffect(!1))} + e===this.backgroundRequestId&&(this.bg.texture=n,this.bg.width=i,this.bg.height=s)}
- `),this.applyFogEffect(!1)} + `)}
FireBird1 3 hunks, 21 statements
- const c1=class extends K0{ + const s2=class t extends U1{
+ execute(){ + super.execute(),this.applySwoopOffset()} + applySwoopOffset(){ + if(!this.sp)return; + const i=t.SWOOP_POSES,s=t.SWOOP_KEYS,e=this.currentFrame,n=Math.floor(e); + if(n<i[0][0]||n>=s[s.length-1][0])return void this.sp.position.set(0,0); + let h=i.length-1; + for(; + h>0&&n<i[h][0]; + )h--; + let r=s[0][1],o=s[0][2]; + for(let t=0; + t<s.length-1; + t++){ + const[i,n,h]=s[t],[a,c,l]=s[t+1]; + if(e<i)break; + const u=Math.min(1,(e-i)/(a-i)); + r=n+(c-n)*u,o=h+(l-h)*u} + this.sp.position.set(r-i[h][1],o-i[h][2])}
- qt(c1,"FireBird1"); + Qt(s2,"FireBird1"),Zt(s2,"SWOOP_POSES",[[23,0,0],[27,-7.8,-8.2],[31,-11,-11.7],[35,5.2,11.2],[39,3.9,4.6],[43,1.6,1.8]]),Zt(s2,"SWOOP_HOLD",4),Zt(s2,"SWOOP_KEYS",[...s2.SWOOP_POSES.map(([t,i,s])=>[t+(s2.SWOOP_HOLD-1)/2,i,s]),[s2.SWOOP_POSES[s2.SWOOP_POSES.length-1][0]+s2.SWOOP_HOLD,0,0]]);
HeroHireSubMenu 9 hunks, 21 statements
- super(),Xt(this,"lblTime",new SD("04:00",16711680,OL.DEFAULT_OUTLINE_FONT_OPTION_18)),Xt(this,"lblCost",new kU("UI_GEM","100",16711680,OL.DEFAULT_OUTLINE_FONT_OPTION_18)),Xt(this,"btnRefresh",new sjt("새로고침",110)),Xt(this,"btnClose",new SYt),Xt(this,"btnMedalBuy",new sjt("훈장구매",110)),Xt(this,"btnResetEvent",new nU("UI_Ekkorr","UI_Question",1)),Xt(this,"cnt",0),Xt(this,"duration",3600),Xt(this,"lastUpdateTime",0),Xt(this,"divide",1),Xt(this,"requestPending",!1),this.btnClose.x=640-this.btnClose.width-10,this.btnClose.y=.5*(this.bg.height-this.btnClose.height),this.addChild(this.btnClose),this.btnRefresh.width=110,this.btnRefresh.height=45,this.btnRefresh.y=.5*(this.bg.height-this.btnRefresh.height),this.addChild(this.btnRefresh),this.btnMedalBuy.width=140,this.btnMedalBuy.height=45,this.btnMedalBuy.y=.5*(this.bg.height-this.btnMedalBuy.height),this.btnMedalBuy.on("pointertap",this.onMedalBuy,this),this.addChild(this.btnMedalBuy),this.btnMedalBuy.visible=!1,this.lblTitle.y=2,this.lblTime.y=this.btnRefresh.y,this.addChild(this.lblTime),this.lblCost.iconScale=.8,this.lblCost.textOffsetX=1,this.lblCost.y=this.lblTime.y+25,this.addChild(this.lblCost),this.btnRefresh.on("pointertap",this.onRefresh,this),this.btnClose.onClick=()=>{ + super(),Zt(this,"lblTime",new QD("04:00",16711680,sD.DEFAULT_OUTLINE_FONT_OPTION_18)),Zt(this,"lblCost",new SF("UI_GEM","100",16711680,sD.DEFAULT_OUTLINE_FONT_OPTION_18)),Zt(this,"btnRefresh",new sKt("새로고침",110,20)),Zt(this,"btnMassiveBuy",new sKt("대량 구매",70)),Zt(this,"massiveBuyLabel","대량 구매"),Zt(this,"btnClose",new mqt),Zt(this,"btnMedalBuy",new sKt("훈장구매",110,20)),Zt(this,"btnResetEvent",new UU("UI_Ekkorr","UI_Question",1)),Zt(this,"cnt",0),Zt(this,"duration",3600),Zt(this,"lastUpdateTime",0),Zt(this,"refreshCost",100),Zt(this,"divide",1),Zt(this,"requestPending",!1),this.btnClose.x=640-this.btnClose.width-10,this.btnClose.y=.5*(this.bg.height-this.btnClose.height),this.addChild(this.btnClose),this.btnRefresh.width=110,this.btnRefresh.height=45,this.btnRefresh.y=.5*(this.bg.height-this.btnRefresh.height),this.addChild(this.btnRefresh),this.btnMassiveBuy.width=110,this.btnMassiveBuy.height=45,this.btnMassiveBuy.x=150,this.btnMassiveBuy.y=.5*(this.bg.height-this.btnMassiveBuy.height),this.btnMassiveBuy.on("pointertap",this.onMassiveBuy,this),this.addChild(this.btnMassiveBuy),this.btnMassiveBuy.visible=!1,this.btnMedalBuy.width=140,this.btnMedalBuy.height=45,this.btnMedalBuy.y=.5*(this.bg.height-this.btnMedalBuy.height),this.btnMedalBuy.on("pointertap",this.onMedalBuy,this),this.addChild(this.btnMedalBuy),this.btnMedalBuy.visible=!1,this.lblTitle.y=2,this.lblTime.y=this.btnRefresh.y,this.addChild(this.lblTime),this.lblCost.iconScale=.8,this.lblCost.textOffsetX=1,this.lblCost.y=this.lblTime.y+25,this.addChild(this.lblCost),this.btnRefresh.on("pointertap",this.onRefresh,this),this.btnClose.onClick=()=>{
- ,this.btnResetEvent.x=this.lblCost.x-this.btnResetEvent.width-5,this.btnResetEvent.y=this.btnRefresh.y+.5*(this.btnRefresh.height-this.btnResetEvent.height),this.btnResetEvent.onClick=this.onResetEventClick.bind(this),this.addChild(this.btnResetEvent),this.btnResetEvent.visible=!1,this.lastUpdateTime=Date.now(),this.on("added",this.onAdded,this),this.on("removed",this.onRemoved,this),this.updateLanguage()} + ,this.btnResetEvent.x=this.lblCost.x-this.btnResetEvent.width-5,this.btnResetEvent.y=this.btnRefresh.y+.5*(.5*this.btnRefresh.height-this.btnResetEvent.height),this.btnResetEvent.onClick=this.onResetEventClick.bind(this),this.addChild(this.btnResetEvent),this.btnResetEvent.visible=!1,this.lastUpdateTime=Date.now(),this.on("added",this.onAdded,this),this.on("removed",this.onRemoved,this),this.updateLanguage()}
+ onMassiveBuy(){ + iQt.getInstance().showPopup()}
- this.btnMedalBuy.visible=XD.maxWave>=500,this.btnMedalBuy.visible?(this.btnMedalBuy.x=this.btnClose.x-this.btnMedalBuy.width-5,this.btnRefresh.x=this.btnMedalBuy.x-this.btnRefresh.width-5):this.btnRefresh.x=this.btnClose.x-this.btnRefresh.width-5,this.lblTime.x=this.btnRefresh.x-60,this.lblCost.x=this.btnRefresh.x-this.lblCost.width-10,this.btnResetEvent.x=this.lblCost.x-this.btnResetEvent.width-5} + this.btnMedalBuy.visible=EG.maxWave>=500,this.btnMassiveBuy.visible=OG.getInstance().development&&EG.maxWave>=500,this.btnMedalBuy.visible?(this.btnMedalBuy.x=this.btnClose.x-this.btnMedalBuy.width-5,this.btnRefresh.x=this.btnMedalBuy.x-this.btnRefresh.width-5):this.btnRefresh.x=this.btnClose.x-this.btnRefresh.width-5,this.lblTime.x=this.btnRefresh.x-60,this.lblCost.x=this.btnRefresh.x-this.lblCost.width-10,this.btnResetEvent.x=this.lblTime.x-this.btnResetEvent.width; + const t=this.lblTime.x-(this.btnResetEvent.visible?20:0)-18,i=t-(this.lblTitle.x+this.lblTitle.width+10),s=Math.max(70,Math.min(110,i)),e=s-20; + let n=17; + const h=this.btnMassiveBuy.lbl.getStyle(); + for(; + !(sD.wrapTextCJK(this.massiveBuyLabel,{ + ...h,fontSize:n} + ,e).split("\n").length<=2||n<=10); + )n--; + this.btnMassiveBuy.width===s&&this.btnMassiveBuy.lbl.getWrapWidth()===e&&this.btnMassiveBuy.text===this.massiveBuyLabel&&this.btnMassiveBuy.lbl.textSize===n||(this.btnMassiveBuy.lbl.textSize=n,this.btnMassiveBuy.lbl.align="center",this.btnMassiveBuy.lbl.setWrapWidth(e),this.btnMassiveBuy.text=this.massiveBuyLabel,this.btnMassiveBuy.width=s),this.btnMassiveBuy.x=t-s}
+ udpateRefreshCost(){ + const t=parseInt(SG.getInstance().getClientData("HERO_PAID_REFRESH_COST")); + this.refreshCost=isNaN(t)?100:t}
- if(t>0)this.lblCost.text=String(100/this.divide),this.lblCost.textColor=OL.DEFAULT_COLOR,this.btnRefresh.hideRedDot(); + if(t>0)this.lblCost.text=String(this.refreshCost/this.divide),this.lblCost.textColor=sD.DEFAULT_COLOR,this.btnRefresh.hideRedDot();
- if(this.duration-.001*(cR.time-this.lastUpdateTime)>0)return Ijt.getInstance().show(nB.getValueReplace("GAME_53","##",100/this.divide,"보석 100개를 사용하고, 영웅목록을 새로 갱신하겠습니다.")+"\n("+nB.getValueReplace("GAME_54","##",Math.floor(60/this.divide),"60분마다 무료로 목록을 갱신할 수 있습니다.")+")",()=>this.onRefleshHeroes(!0)),void(Ijt.getInstance().y=480); + if(this.duration-.001*(DR.time-this.lastUpdateTime)>0)return OKt.getInstance().show(RB.getValueReplace("GAME_53","##",this.refreshCost/this.divide,"보석 100개를 사용하고, 영웅목록을 새로 갱신하겠습니다.")+"\n("+RB.getValueReplace("GAME_54","##",Math.floor(60/this.divide),"60분마다 무료로 목록을 갱신할 수 있습니다.")+")",()=>this.onRefleshHeroes(!0)),void(OKt.getInstance().y=480);
- this.updateLanguage(),this.updateMedalBuyBtn()} + this.udpateRefreshCost(),this.updateLanguage(),this.updateMedalBuyBtn()}
- this.setTitle(nB.getText("GAME_13","영웅 고용")),this.btnRefresh.text=nB.getText("COMMON_60","새로고침"),this.btnMedalBuy.text=nB.getText("GAME_1197","훈장구매"),this.updateLayout()} + this.setTitle(RB.getText("GAME_13","영웅 고용")),this.btnRefresh.text=RB.getText("COMMON_60","새로고침"),this.btnMedalBuy.text=RB.getText("GAME_1197","훈장구매"),this.btnMassiveBuy.lbl.align="center",this.massiveBuyLabel=RB.getText("GAME_1892","대량 구매"),this.updateLayout()}
BaseCastle 4 hunks, 20 statements
- super(),Xt(this,"isCastle",!0),Xt(this,"numShot",1),Xt(this,"hpRegenPerSec",.001),Xt(this,"REGEN_INTERVAL",450),Xt(this,"regenTimer",0),Xt(this,"castleFireList"),Xt(this,"damageFireList"),Xt(this,"currentFireLevel",0),Xt(this,"rangeVisible",!1),Xt(this,"healthBarShowTimer",0),this.eventMode="dynamic",this.on("pointerdown",this.onPointerDown,this)} + super(),Zt(this,"isCastle",!0),Zt(this,"numShot",1),Zt(this,"hpRegenPerSec",.001),Zt(this,"REGEN_INTERVAL",450),Zt(this,"regenTimer",0),Zt(this,"castleFireList"),Zt(this,"damageFireList"),Zt(this,"currentFireLevel",0),Zt(this,"rangeVisible",!1),Zt(this,"healthBarShowTimer",0),Zt(this,"defaultSkin",""),this.eventMode="dynamic",this.on("pointerdown",this.onPointerDown,this)}
+ setSkin(t){ + if(!this.sp||!this.textures)return; + this.defaultSkin||(this.defaultSkin=this.textureName||this.className); + const i=t||this.defaultSkin; + if(i===this.textureName)return; + const s=kS.getTextures(this.sheetName,i); + if(!s||0===s.length)return; + this.textureName=i,this.textures=s; + const e=s[0]; + e.defaultAnchor&&this.sp.anchor.copyFrom(e.defaultAnchor),this.sp.texture=this.textures[Math.min(this.textures.length-1,Math.floor(this.currentFrame))],this.fitHealthBarToSkin(e),this.currentFireLevel>0&&this.applyDamageFires(this.currentFireLevel)} + fitHealthBarToSkin(t){ + var i,s; + this.setHealthBarPosition(); + const e=(null==(i=t.defaultAnchor)?void 0:i.y)??this.sp.anchor.y,n=t.trim?t.trim.y:0,h=(e*t.orig.height-n)*((null==(s=this.sp.parent)?void 0:s.scale.y)??1); + this.healthBar.y=Math.min(this.healthBar.y,-h-6)}
- const e=t.FIRE_POSITIONS[i],n=t.FIRE_TYPES[i],h=this.showEffect(n,99999,e),r=Math.random()<.5?-1:1; + const e=(t.FIRE_POSITIONS_BY_SKIN[this.textureName]??t.FIRE_POSITIONS)[i],n=t.FIRE_TYPES[i],h=this.showEffect(n,99999,e),r=Math.random()<.5?-1:1;
- qt(q0,"BaseCastle"),Xt(q0,"FIRE_POSITIONS",[new _i(10,-15),new _i(-15,-8),new _i(3,-4),new _i(-15,-28),new _i(5,-35)]),Xt(q0,"FIRE_TYPES",[$H.CastleFire2,$H.CastleFire1,$H.CastleFire2,$H.CastleFire1,$H.CastleFire1]); + Qt(H1,"BaseCastle"),Zt(H1,"FIRE_POSITIONS",[new yi(10,-15),new yi(-15,-8),new yi(3,-4),new yi(-15,-28),new yi(5,-35)]),Zt(H1,"FIRE_POSITIONS_BY_SKIN",{ + CastleHuman:[new yi(18,-14),new yi(-20,-10),new yi(2,-4),new yi(-22,-40),new yi(20,-48)],CastleOrc:[new yi(12,-18),new yi(-14,-12),new yi(2,-4),new yi(-16,-34),new yi(10,-46)],CastleUndead:[new yi(20,-16),new yi(-20,-12),new yi(2,-4),new yi(-18,-38),new yi(12,-50)],CastleElf:[new yi(22,-14),new yi(-22,-12),new yi(2,-10),new yi(-22,-48),new yi(20,-54)]} + ),Zt(H1,"FIRE_TYPES",[GH.CastleFire2,GH.CastleFire1,GH.CastleFire2,GH.CastleFire1,GH.CastleFire1]);
TowerItemRenderer 6 hunks, 20 statements
- super(),Xt(this,"bg"),Xt(this,"lblFloor",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_17)),Xt(this,"lblCondition",new SD("",11184810,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblGem",new kU("UI_GEM","0",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblHonor",new kU("PVP_COIN_ON","0",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"btnChallenge",new sjt("도전",110)),Xt(this,"btnSimulate",new sjt("시뮬",80)),this.bg=new kM({ + super(),Zt(this,"bg"),Zt(this,"lblFloor",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_17)),Zt(this,"lblCondition",new QD("",11184810,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblGem",new SF("UI_GEM","0",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblHonor",new SF("PVP_COIN_ON","0",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblPlusEvent",new QD("+",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblGemEvent",new SF("UI_GEM","0",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblHonorEvent",new SF("PVP_COIN_ON","0",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"btnChallenge",new sKt("도전",110)),Zt(this,"btnSimulate",new sKt("시뮬",80)),Zt(this,"gemEvent",0),Zt(this,"honorCoinEvent",0),this.bg=new eE({
- ),this.bg.width=630,this.bg.height=80,this.addChild(this.bg),this.lblFloor.x=15,this.lblFloor.y=.5*(this.bg.height-this.lblFloor.height),this.addChild(this.lblFloor),this.lblCondition.x=135,this.addChild(this.lblCondition),this.lblGem.iconScale=.9,this.addChild(this.lblGem),this.lblHonor.iconScale=.9,this.addChild(this.lblHonor),this.btnChallenge.width=110,this.btnChallenge.height=62,this.btnChallenge.x=this.bg.width-110-10,this.btnChallenge.y=.5*(this.bg.height-62),this.addChild(this.btnChallenge),this.btnChallenge.on("pointertap",this.onChallenge,this),this.btnSimulate.width=80,this.btnSimulate.height=62,this.btnSimulate.x=this.btnChallenge.x-this.btnSimulate.width-6,this.btnSimulate.y=this.btnChallenge.y,this.addChild(this.btnSimulate),this.btnSimulate.on("pointertap",this.onSimulate,this),iG.getInstance().development?this.btnSimulate.visible=!0:this.btnSimulate.visible=!1} + ),this.bg.width=630,this.bg.height=80,this.addChild(this.bg),this.lblFloor.x=15,this.lblFloor.y=.5*(this.bg.height-this.lblFloor.height),this.addChild(this.lblFloor),this.lblCondition.x=135,this.addChild(this.lblCondition); + const t=.9; + this.lblGem.iconScale=t,this.addChild(this.lblGem),this.lblHonor.iconScale=t,this.addChild(this.lblHonor),this.addChild(this.lblPlusEvent),this.lblGemEvent.iconScale=t,this.addChild(this.lblGemEvent),this.lblHonorEvent.iconScale=t,this.addChild(this.lblHonorEvent),this.lblGemEvent.visible=this.lblHonorEvent.visible=!1,this.btnChallenge.width=110,this.btnChallenge.height=62,this.btnChallenge.x=this.bg.width-110-10,this.btnChallenge.y=.5*(this.bg.height-62),this.addChild(this.btnChallenge),this.btnChallenge.on("pointertap",this.onChallenge,this),this.btnSimulate.width=80,this.btnSimulate.height=62,this.btnSimulate.x=this.btnChallenge.x-this.btnSimulate.width-6,this.btnSimulate.y=this.btnChallenge.y,this.addChild(this.btnSimulate),this.btnSimulate.on("pointertap",this.onSimulate,this),OG.getInstance().development?this.btnSimulate.visible=!0:this.btnSimulate.visible=!1}
- i&&(this.lblGem.text=`${ + if(i&&(this.lblGem.text=`${
- `)} + `,this.lblPlusEvent.visible=this.lblGemEvent.visible=this.lblHonorEvent.visible=!1,GB.isValidEvent(BB.TOWER_EVENT))){ + const i=GB.currentTowerEvent,s=i?i.floors.indexOf(t.floor):-1; + if(s>-1){ + const t=i?i.rewards[s]:[]; + this.gemEvent=0,this.honorCoinEvent=0,t.forEach(t=>{ + "gem"===t.type&&(this.gemEvent+=t.amount),"honorCoin"===t.type&&(this.honorCoinEvent+=t.amount)} + ),this.lblPlusEvent.visible=!0,this.gemEvent>0&&(this.lblGemEvent.text=`${ + this.gemEvent} + `,this.lblGemEvent.visible=!0),this.honorCoinEvent>0&&(this.lblHonorEvent.text=`${ + this.honorCoinEvent} + `,this.lblHonorEvent.visible=!0)} + } + }
- this.lblGem.x=i,this.lblGem.y=t,i+=this.lblGem.width+5,this.lblHonor.x=i,this.lblHonor.y=t+2} + this.lblGem.x=i,this.lblGem.y=t,i+=this.lblGem.width+5,this.lblHonor.x=i,this.lblHonor.y=t+2,this.lblGemEvent.y=this.lblGem.y,this.lblHonorEvent.y=this.lblHonor.y,this.lblPlusEvent.y=this.lblGem.y+.5*(this.lblGem.height-this.lblPlusEvent.height),i+=this.lblHonor.width+5+20,this.lblPlusEvent.x=i,i+=this.lblPlusEvent.width+5,this.gemEvent>0&&(this.lblGemEvent.x=i,i+=this.lblGemEvent.width+5),this.lblHonorEvent.x=i}
- this.lblFloor.textColor=i,this.lblCondition.textColor=s,this.lblGem.textColor=t?8947848:OL.DEFAULT_COLOR,this.lblHonor.textColor=t?8947848:OL.DEFAULT_COLOR,this.lblGem.iconColor=t?6710886:16777215,this.lblHonor.iconColor=t?6710886:16777215} + this.lblFloor.textColor=i,this.lblCondition.textColor=s,this.lblGem.textColor=t?8947848:sD.DEFAULT_COLOR,this.lblHonor.textColor=t?8947848:sD.DEFAULT_COLOR,this.lblGem.iconColor=t?6710886:16777215,this.lblHonor.iconColor=t?6710886:16777215,this.lblPlusEvent.textColor=t?8947848:sD.COLOR_YELLOW,this.lblGemEvent.textColor=t?8947848:sD.COLOR_YELLOW,this.lblHonorEvent.textColor=t?8947848:sD.COLOR_YELLOW,this.lblGemEvent.iconColor=t?6710886:16777215,this.lblHonorEvent.iconColor=t?6710886:16777215}
CastleDetailPopup 5 hunks, 19 statements
- super(),Xt(this,"lblHp",new kU("UI_HEART","0",16711680,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"btnEnhance",new MF("UI_STAR_ICON","1000","강화",.8,160,70)),Xt(this,"btnReset",new MF("UI_GEM","100","강화초기화",.8,160,70)),Xt(this,"enhanceRapidClickCount",0),Xt(this,"lastEnhanceRapidClickTime",0),Xt(this,"btn10Enhance",new MF("UI_STAR_ICON","10000","+10",.8,160,70)),Xt(this,"btn100Enhance",new MF("UI_STAR_ICON","100000","+100",.8,160,70)),Xt(this,"lblDesc",new SD("훈장으로 강화를 하면, ",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblName",new SD("발키온 성",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblCastleBonus",new SD("",4495871,OL.WHITE_OUTLINE_FONT_OPTION_16)),Xt(this,"multiEnhanceContainer",new He),Xt(this,"enhanceTimer",null),Xt(this,"enhanceStartValue",-1),Xt(this,"enhanceStartMedal",-1),Xt(this,"syncInFlight",!1),Xt(this,"syncQueued",!1),Xt(this,"vo"),Xt(this,"castleIcon",new xai),Xt(this,"lblMedal",new kU("UI_STAR_ICON","0",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),this.title=nB.getText("GAME_86","성 정보"),this.castleIcon.x=25,this.castleIcon.y=65,this.contentContainer.addChild(this.castleIcon),this.contentContainer.addChild(this.lblMedal),this.lblName.text=nB.getText("GAME_530","발키온 성"),this.lblName.x=this.castleIcon.x+this.castleIcon.width+25,this.lblName.y=this.castleIcon.y+10,this.contentContainer.addChild(this.lblName),this.lblCastleBonus.visible=!1,this.contentContainer.addChild(this.lblCastleBonus),this.lblHp.x=this.lblName.x,this.lblHp.y=this.lblName.y+this.lblName.height+10,this.contentContainer.addChild(this.lblHp),this.btnEnhance.text=nB.getText("GAME_66","강화"),this.btnEnhance.showIconLabel=!0,this.btnEnhance.showTextLabel=!0,this.btnEnhance.color=MF.LIGHT_GREEN,this.btnEnhance.onClick=()=>this.onEnhanceClick(1),this.btn10Enhance.labelOrder=MF.TEXT_FIRST,this.btn10Enhance.textLabel.textSize=15,this.btn10Enhance.textAlign="left",this.btn10Enhance.iconScale=.7,this.btn10Enhance.color=MF.LIGHT_GREEN,this.btn10Enhance.showIconLabel=!0,this.btn10Enhance.showTextLabel=!0,this.btn10Enhance.onClick=()=>{ + super(),Zt(this,"lblHp",new SF("UI_HEART","0",16711680,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"btnEnhance",new m$("UI_STAR_ICON","1000","강화",.8,160,70)),Zt(this,"btnReset",new m$("UI_GEM","100","강화초기화",.8,160,70)),Zt(this,"enhanceRapidClickCount",0),Zt(this,"lastEnhanceRapidClickTime",0),Zt(this,"btn10Enhance",new m$("UI_STAR_ICON","10000","+10",.8,160,70)),Zt(this,"btn100Enhance",new m$("UI_STAR_ICON","100000","+100",.8,160,70)),Zt(this,"btnMaxEnhance",new m$("UI_STAR_ICON","0","Max",.8,160,70)),Zt(this,"lblDesc",new QD("훈장으로 강화를 하면, ",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblName",new QD("발키온 성",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblCastleBonus",new QD("",4495871,sD.WHITE_OUTLINE_FONT_OPTION_16)),Zt(this,"multiEnhanceContainer",new Ve),Zt(this,"enhanceTimer",null),Zt(this,"enhanceStartValue",-1),Zt(this,"enhanceStartMedal",-1),Zt(this,"syncInFlight",!1),Zt(this,"syncQueued",!1),Zt(this,"vo"),Zt(this,"castleIcon",new nli),Zt(this,"lblMedal",new SF("UI_STAR_ICON","0",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),this.title=RB.getText("GAME_86","성 정보"),this.castleIcon.x=25,this.castleIcon.y=65,this.contentContainer.addChild(this.castleIcon),this.contentContainer.addChild(this.lblMedal),this.lblName.text=RB.getText("GAME_530","발키온 성"),this.lblName.x=this.castleIcon.x+this.castleIcon.width+25,this.lblName.y=this.castleIcon.y+10,this.contentContainer.addChild(this.lblName),this.lblCastleBonus.visible=!1,this.contentContainer.addChild(this.lblCastleBonus),this.lblHp.x=this.lblName.x,this.lblHp.y=this.lblName.y+this.lblName.height+10,this.contentContainer.addChild(this.lblHp),this.btnEnhance.text=RB.getText("GAME_66","강화"),this.btnEnhance.showIconLabel=!0,this.btnEnhance.showTextLabel=!0,this.btnEnhance.color=m$.LIGHT_GREEN,this.btnEnhance.onClick=()=>this.onEnhanceClick(1),this.btn10Enhance.labelOrder=m$.TEXT_FIRST,this.btn10Enhance.textLabel.textSize=15,this.btn10Enhance.textAlign="left",this.btn10Enhance.iconScale=.7,this.btn10Enhance.color=m$.LIGHT_GREEN,this.btn10Enhance.showIconLabel=!0,this.btn10Enhance.showTextLabel=!0,this.btn10Enhance.onClick=()=>{
- ,this.multiEnhanceContainer.addChild(this.btn100Enhance),this.multiEnhanceContainer.visible=!1,this.contentContainer.addChild(this.multiEnhanceContainer),this.btnReset.text=nB.getText("COMMON_368","초기화"),this.btnReset.showIconLabel=!0,this.btnReset.showTextLabel=!0,this.btnReset.color=MF.RED,this.btnReset.onClick=this.onResetClick.bind(this),this.contentContainer.addChild(this.btnEnhance,this.btnReset),this.outSideClickHide=!0,this.updateLayout()} + ,this.multiEnhanceContainer.addChild(this.btn100Enhance),this.btnMaxEnhance.labelOrder=m$.TEXT_FIRST,this.btnMaxEnhance.textLabel.textSize=15,this.btnMaxEnhance.textAlign="left",this.btnMaxEnhance.iconScale=.7,this.btnMaxEnhance.color=m$.LIGHT_GREEN,this.btnMaxEnhance.showIconLabel=!0,this.btnMaxEnhance.showTextLabel=!0,this.btnMaxEnhance.onClick=()=>{ + const t=this.getMaxIncrement(); + t>0?this.onEnhanceClick(t):vH.getInstance().showMessage(RB.getText("GAME_48","훈장이 부족합니다."))} + ,this.multiEnhanceContainer.addChild(this.btnMaxEnhance),this.multiEnhanceContainer.visible=!1,this.contentContainer.addChild(this.multiEnhanceContainer),this.btnReset.text=RB.getText("COMMON_368","초기화"),this.btnReset.showIconLabel=!0,this.btnReset.showTextLabel=!0,this.btnReset.color=m$.RED,this.btnReset.onClick=this.onResetClick.bind(this),this.contentContainer.addChild(this.btnEnhance,this.btnReset),this.outSideClickHide=!0,this.updateLayout()}
+ getMaxIncrement(){ + const t=QXt.getInstance().getMaxAffordableLevel(this.vo.enhance,EG.medal); + return Math.max(0,Math.min(t,ZR.CASTLE_MAX_ENHANCE)-this.vo.enhance)}
+ if(this.vo.enhance+1>s)this.btnMaxEnhance.visible=!1; + else{ + const t=this.getMaxIncrement(),i=QXt.getInstance(),s=RB.getText("GAME_1192","Max"); + this.btnMaxEnhance.text=t>0?`${ + s} + +${ + t} + `:s,this.btnMaxEnhance.iconText=KD.displayLargeNumberAsAlphabet(t>0?i.getTotalCost(this.vo.enhance,this.vo.enhance+t):i.getCost(this.vo.enhance+1)),this.btnMaxEnhance.activated=t>0,this.btnMaxEnhance.visible=!0}
- if(this.btnEnhance.x=i,this.btnEnhance.y=250,this.btnReset.x=this.btnEnhance.x+this.btnEnhance.width+20,this.btnReset.y=250,this.multiEnhanceContainer.visible)this.lblMedal.x=this.btnReset.x,this.lblMedal.y=210; + if(this.btnEnhance.x=i,this.btnEnhance.y=250,this.btnReset.x=this.btnEnhance.x+this.btnEnhance.width+20,this.btnReset.y=250,this.multiEnhanceContainer.visible){ + const t=5; + this.btnMaxEnhance.x=this.btnReset.x,this.btnMaxEnhance.y=this.btnReset.y-this.btnMaxEnhance.height-t,this.lblMedal.x=this.btnReset.x,this.lblMedal.y=this.btnMaxEnhance.visible?this.btnMaxEnhance.y-35:210}
WaveBar 1 hunks, 19 statements
+ function edi(t){ + return[1,1.5,2].filter(i=>i<=t)} + function ndi(t,i,s){ + const e=null!==t.userSpeedMode&&t.userSpeedMode<i; + return{ + baseSpeed:e?t.userSpeedMode:i,godBlessSpeed:s&&!t.godBlessOff?3:0,userSpeedMode:e?t.userSpeedMode:null} + } + function hdi(t,i,s){ + const e=edi(i),n=ndi(t,i,s).baseSpeed,h=e.indexOf(n); + return s?t.godBlessOff?h<0||h===e.length-1?{ + userSpeedMode:null,godBlessOff:!1} + :{ + userSpeedMode:e[h+1],godBlessOff:!0} + :{ + userSpeedMode:e[0],godBlessOff:!0} + :{ + userSpeedMode:e[(h+1)%e.length],godBlessOff:t.godBlessOff} + } + Qt(edi,"speedOptions"),Qt(ndi,"resolveSpeed"),Qt(hdi,"nextSpeedChoice");
MiniAscentDataManager 6 hunks, 19 statements
- Xt(this,"season",null),Xt(this,"run",null),Xt(this,"relics",null),Xt(this,"crystals",null),Xt(this,"lastDefeat",null),Xt(this,"lastClear",null),Xt(this,"eventActive",!1),Xt(this,"stateError",null),Xt(this,"viewRevision",0),Xt(this,"viewCache",new Map),Xt(this,"viewRequests",new Map)} + Zt(this,"season",null),Zt(this,"run",null),Zt(this,"relics",null),Zt(this,"crystals",null),Zt(this,"lastDefeat",null),Zt(this,"lastClear",null),Zt(this,"eventActive",!1),Zt(this,"stateError",null),Zt(this,"seasonEndedByServer",!1),Zt(this,"onSeasonEnded",null),Zt(this,"shopOnly",!1),Zt(this,"viewRevision",0),Zt(this,"viewCache",new Map),Zt(this,"viewRequests",new Map)}
+ isSeasonOver(){ + var t,i; + if(this.seasonEndedByServer)return!0; + if(this.shopOnly?!GB.isAscentShopOpen():!GB.isValidEvent(BB.MINI_ASCENT_EVENT))return!0; + const s=Date.parse((this.shopOnly?null==(t=this.season)?void 0:t.shopEndTime:null==(i=this.season)?void 0:i.endTime)??""),e=DR.time>=0?DR.time:Date.now(); + return Number.isFinite(s)&&e>=s} + enterShopOnly(){ + this.shopOnly=!0,this.seasonEndedByServer=!1,this.run=null,this.relics=null,this.crystals=null,this.lastDefeat=null,this.invalidateViews()} + leaveShopOnly(){ + this.shopOnly=!1} + async discardPendingResult(){ + await MS.removeData(MS.KEY_MINI_ASCENT_PENDING)}
+ var i;
- if(!1===t.success)throw new C_i(t.errorMessageFromServer??t.errorMessage??"rejected"); + if(!1===t.success){ + const s=t.errorMessageFromServer??t.errorMessage??"rejected"; + throw"SEASON_NOT_FOUND"!==s||this.seasonEndedByServer||(this.seasonEndedByServer=!0,null==(i=this.onSeasonEnded)||i.call(this)),new Bbi(s)}
- t&&((t.season&&(null==(i=this.season)?void 0:i.seasonId)!==t.season.seasonId||t.crystals&&t.crystals.revision!==(null==(s=this.crystals)?void 0:s.revision)||void 0!==t.run&&JSON.stringify(this.run)!==JSON.stringify(t.run))&&this.invalidateViews(),t.season&&((null==(e=this.season)?void 0:e.seasonId)!==t.season.seasonId&&(this.lastDefeat=null,this.relics=null,this.crystals=null),this.season=t.season),void 0!==t.lastDefeat&&(this.lastDefeat=t.lastDefeat),t.crystals&&(this.crystals=t.crystals),t.relics&&(this.relics=t.relics),void 0!==t.run&&(this.run=t.run,this.lastDefeat&&this.run&&this.run.floor>this.lastDefeat.floor&&(this.lastDefeat=null)),Array.isArray(t.rows)&&void 0!==t.currentNode&&this.viewCache.set("route",t),void 0!==t.shop&&this.viewCache.set("shop",t),t.eventShop&&this.viewCache.set("eventShop",t),t.crystals&&this.viewCache.set("crystals",t),t.relics&&this.viewCache.set("relics",t))} + t&&((t.season&&(null==(i=this.season)?void 0:i.seasonId)!==t.season.seasonId||t.crystals&&t.crystals.revision!==(null==(s=this.crystals)?void 0:s.revision)||void 0!==t.run&&JSON.stringify(this.run)!==JSON.stringify(t.run))&&this.invalidateViews(),t.season&&(this.seasonEndedByServer=!1,(null==(e=this.season)?void 0:e.seasonId)!==t.season.seasonId&&(this.lastDefeat=null,this.relics=null,this.crystals=null),this.season=t.season),void 0!==t.lastDefeat&&(this.lastDefeat=t.lastDefeat),t.crystals&&(this.crystals=t.crystals),t.relics&&(this.relics=t.relics),void 0!==t.run&&(this.run=t.run,this.lastDefeat&&this.run&&this.run.floor>this.lastDefeat.floor&&(this.lastDefeat=null)),Array.isArray(t.rows)&&void 0!==t.currentNode&&this.viewCache.set("route",t),void 0!==t.shop&&this.viewCache.set("shop",t),t.eventShop&&this.viewCache.set("eventShop",t),t.crystals&&this.viewCache.set("crystals",t),t.relics&&this.viewCache.set("relics",t))}
+ if(this.isSeasonOver())return await this.discardPendingResult(),null;
BaseUnit 11 hunks, 18 statements
- ),Xt(this,"numHitted",0),Xt(this,"numStun",0),Xt(this,"numFreeze",0),Xt(this,"numSlow",0),Xt(this,"numAtkSlow",0),Xt(this,"numChillTint",0),Xt(this,"numBurn",0),Xt(this,"numPoison",0),Xt(this,"numBleed",0),Xt(this,"numCurse",0),Xt(this,"numSilence",0),Xt(this,"numKnockBack",0),Xt(this,"numPowerShield",0),Xt(this,"numMagicalShield",0),Xt(this,"numPhysicalShield",0),Xt(this,"numTransparent",0),Xt(this,"knockBackVx",0),Xt(this,"knockBackVy",0),Xt(this,"numPriestShield",0),Xt(this,"priestShieldHits",0),Xt(this,"numBlow",0),Xt(this,"blowVx",0),Xt(this,"blowVy",0),Xt(this,"blowVh",0),Xt(this,"blowGravity",.3),Xt(this,"blowHeight",0),Xt(this,"numBinding",0),Xt(this,"numShock",0),Xt(this,"knockImmune",!1),Xt(this,"blowImmune",!1),Xt(this,"stunImmune",!1),Xt(this,"freezeImmune",!1),Xt(this,"poisonImmune",!1),Xt(this,"stunResistPct",0),Xt(this,"knockResistPct",0),Xt(this,"blowResistPct",0),Xt(this,"freezeResistPct",0),Xt(this,"currentSize",1.05),Xt(this,"_baseSize",0),Xt(this,"_baseHitHeight",0),Xt(this,"_baseHitWidth",0),Xt(this,"_baseRadius",0),Xt(this,"sizeScale",1),Xt(this,"direction",1),Xt(this,"hideHealthBarTimer",0),Xt(this,"maxRevive",0),Xt(this,"numRevive",0),Xt(this,"reviveCount",0),Xt(this,"reviveInterval",40),Xt(this,"immediateReviveDelay",60),Xt(this,"removed",!1),Xt(this,"stayAfterDeath",!1),Xt(this,"reviveHealthPercent",.6),Xt(this,"numShot",1),Xt(this,"numBounce",0),Xt(this,"multiShotDelay",0),Xt(this,"_poolReturned",!1),Xt(this,"targetAlpha",1),Xt(this,"t",0),Xt(this,"evolEffect",null),Xt(this,"evolStar",null),Xt(this,"numLove",0),Xt(this,"numLoveShield",0),Xt(this,"__airHeight",0),Xt(this,"_airHeight",0),Xt(this,"numAirToGround",-30),this.addChild(this.container),this.idleLookInterval=60,this.initializeData(),this.initialize(),this.generateSprite(),this.startFrame=this.idleFrames.start,this.endFrame=this.idleFrames.end,this.currentFrame=this.startFrame,this.loop=!0,this.eventMode="none"} + ),Zt(this,"numHitted",0),Zt(this,"numStun",0),Zt(this,"numFreeze",0),Zt(this,"numSlow",0),Zt(this,"numAtkSlow",0),Zt(this,"numChillTint",0),Zt(this,"numBurn",0),Zt(this,"numPoison",0),Zt(this,"numBleed",0),Zt(this,"numCurse",0),Zt(this,"numSilence",0),Zt(this,"numKnockBack",0),Zt(this,"numPowerShield",0),Zt(this,"numMagicalShield",0),Zt(this,"numPhysicalShield",0),Zt(this,"numTransparent",0),Zt(this,"knockBackVx",0),Zt(this,"knockBackVy",0),Zt(this,"numPriestShield",0),Zt(this,"priestShieldHits",0),Zt(this,"numBlow",0),Zt(this,"blowVx",0),Zt(this,"blowVy",0),Zt(this,"blowVh",0),Zt(this,"blowGravity",.3),Zt(this,"blowHeight",0),Zt(this,"numBinding",0),Zt(this,"numShock",0),Zt(this,"knockImmune",!1),Zt(this,"blowImmune",!1),Zt(this,"stunImmune",!1),Zt(this,"freezeImmune",!1),Zt(this,"poisonImmune",!1),Zt(this,"stunResistPct",0),Zt(this,"knockResistPct",0),Zt(this,"blowResistPct",0),Zt(this,"freezeResistPct",0),Zt(this,"currentSize",1.05),Zt(this,"_baseSize",0),Zt(this,"_baseHitHeight",0),Zt(this,"_baseHitWidth",0),Zt(this,"_baseRadius",0),Zt(this,"sizeScale",1),Zt(this,"direction",1),Zt(this,"hideHealthBarTimer",0),Zt(this,"maxRevive",0),Zt(this,"numRevive",0),Zt(this,"reviveCount",0),Zt(this,"reviveInterval",40),Zt(this,"immediateReviveDelay",60),Zt(this,"removed",!1),Zt(this,"stayAfterDeath",!1),Zt(this,"reviveHealthPercent",.6),Zt(this,"numShot",1),Zt(this,"numBounce",0),Zt(this,"multiShotDelay",0),Zt(this,"_poolReturned",!1),Zt(this,"numHitTint",0),Zt(this,"targetAlpha",1),Zt(this,"t",0),Zt(this,"evolEffect",null),Zt(this,"evolStar",null),Zt(this,"numLove",0),Zt(this,"numLoveShield",0),Zt(this,"__airHeight",0),Zt(this,"_airHeight",0),Zt(this,"numAirToGround",-30),this.addChild(this.container),this.idleLookInterval=60,this.initializeData(),this.initialize(),this.generateSprite(),this.startFrame=this.idleFrames.start,this.endFrame=this.idleFrames.end,this.currentFrame=this.startFrame,this.loop=!0,this.eventMode="none"}
+ get shadowSprite(){ + return this.shadow??null}
- if(this.visible=!0,this.renderable=!0,this.alpha=1,this.sp&&(this.sp.visible=!0),this.isAlive=!0,this.kindNum=i.kindNum,this.grade=i.grade,this.sex=i.sex,this.name=i.name,this.base=i.base,this.lastPercentHp=s,this.lastPercentAtkDmg=e,this.lastPercentDef=n,this.baseMaxHp=i.maxHp*s,this.baseAtkDmg=i.atkDmg*e,this.baseDef=i.def*n,this.baseMoveSpd=i.moveSpd,this.baseAtkDuration=1e4/i.atkSpd,this.baseAtkRange=i.atkRange,this.level=i.level,this.enhance=i.enhance,this.isEnemySide=i.isEnemy,this.numBlock=i.numBlock,this.orgAtkDuration=this.atkDuration=1e4/i.atkSpd,this.orgAtkSpd=i.atkSpd,this.orgAtkRange=this.atkRange=i.atkRange,this.orgMoveSpd=this.moveSpd=i.moveSpd,this.orgDef=this.def=i.def*n,this.orgPhyDef=this.phyDef=i.phyDef*n,this.orgMagDef=this.magDef=i.magDef*n,this.orgMaxHp=this.maxHp=i.maxHp*s,this.hp=this.maxHp,this.orgAtkDmg=this.atkDmg=i.atkDmg*e,this.orgRangeEvadeChange=this.rangeEvadeChange=0,this.orgCritDmg=this.critDmg=this.baseCritDmg,this.orgCritChance=this.critChance=this.baseCritChance,this.atkRange2=this.atkRange*this.atkRange,this.detectRange2=this.detectRange*this.detectRange,this.unitType=i.unitType,this.tribe=i.tribe,this.isAir=i.isAir,this.maxRevive=i.numRevive,this.reviveInterval=i.reviveTime,this.dmgType=i.dmgType,this.recovery=i.recovery,this.evolStage=i.evolStage,this.weight=i.weight,this.cloaking=i.cloaking,this.canDetect=i.detect,this.knockImmune=i.knockImmune,this.blowImmune=i.blowImmune,this.stunImmune=i.stunImmune,this.freezeImmune=i.freezeImmune,this.poisonImmune=!1,this.stunResistPct=0,this.knockResistPct=0,this.blowResistPct=0,this.freezeResistPct=0,this.evolStage>=1?(this.showEvolEffect(),this.setSize(this.evolSize)):this.setSize(this.normalSize),this.mana=0,this.miniAscentDamageReduction=0,this.miniAscentManaRegen=0,this.raidIncomingDamageMult=1,this.raidPassiveIncomingMult=1,this.currentFrame=0,this.frame=0,this.clearAttackEffects(),this.incFrame=1,this.initDelay=0,this.rallyMoveTimer=0,this.farFromCastleFrames=0,this.attackCoolDown=0,this.recoveryCoolDown=0,this.numStun=0,this.numFreeze=0,this.numPoison=0,this.numCurse=0,this.numBinding=0,this.numShock=0,this.idleLookInterval=40+this.random.nextInt(60),this.idleLookTimer=0,this.retargetCheckTimer=this.random.nextInt(t.RETARGET_CHECK_INTERVAL),this.aggressiveRetarget=!1,this.battleController&&void 0!==this.battleController.unitScale){ + if(this.visible=!0,this.renderable=!0,this.alpha=1,this.sp&&(this.sp.visible=!0),this.isAlive=!0,this.kindNum=i.kindNum,this.grade=i.grade,this.sex=i.sex,this.name=i.name,this.base=i.base,this.lastPercentHp=s,this.lastPercentAtkDmg=e,this.lastPercentDef=n,this.baseMaxHp=i.maxHp*s,this.baseAtkDmg=i.atkDmg*e,this.baseDef=i.def*n,this.baseMoveSpd=i.moveSpd,this.baseAtkDuration=1e4/i.atkSpd,this.baseAtkRange=i.atkRange,this.level=i.level,this.enhance=i.enhance,this.isEnemySide=i.isEnemy,this.numBlock=i.numBlock,this.orgAtkDuration=this.atkDuration=1e4/i.atkSpd,this.orgAtkSpd=i.atkSpd,this.orgAtkRange=this.atkRange=i.atkRange,this.orgMoveSpd=this.moveSpd=i.moveSpd,this.orgDef=this.def=i.def*n,this.orgPhyDef=this.phyDef=i.phyDef*n,this.orgMagDef=this.magDef=i.magDef*n,this.orgMaxHp=this.maxHp=i.maxHp*s,this.hp=this.maxHp,this.orgAtkDmg=this.atkDmg=i.atkDmg*e,this.orgRangeEvadeChange=this.rangeEvadeChange=0,this.orgCritDmg=this.critDmg=this.baseCritDmg,this.orgCritChance=this.critChance=this.baseCritChance,this.atkRange2=this.atkRange*this.atkRange,this.detectRange2=this.detectRange*this.detectRange,this.unitType=i.unitType,this.tribe=i.tribe,this.isAir=i.isAir,this.maxRevive=i.numRevive,this.reviveInterval=i.reviveTime,this.dmgType=i.dmgType,this.recovery=i.recovery,this.evolStage=i.evolStage,this.weight=i.weight,this.cloaking=i.cloaking,this.canDetect=i.detect,this.knockImmune=i.knockImmune,this.blowImmune=i.blowImmune,this.stunImmune=i.stunImmune,this.freezeImmune=i.freezeImmune,this.poisonImmune=!1,this.stunResistPct=0,this.knockResistPct=0,this.blowResistPct=0,this.freezeResistPct=0,this.evolStage>=1?(this.showEvolEffect(),this.setSize(this.evolSize)):this.setSize(this.normalSize),this.mana=0,this.miniAscentDamageReduction=0,this.miniAscentManaRegen=0,this.raidIncomingDamageMult=1,this.raidPassiveIncomingMult=1,this.currentFrame=0,this.frame=0,this.clearAttackEffects(),this.incFrame=1,this.initDelay=0,this.rallyMoveTimer=0,this.farFromCastleFrames=0,this.attackCoolDown=0,this.recoveryCoolDown=0,this.numStun=0,this.numFreeze=0,this.numPoison=0,this.numCurse=0,this.numBinding=0,this.numShock=0,this.resetMotionPose(),this.idleLookInterval=40+this.random.nextInt(60),this.idleLookTimer=0,this.retargetCheckTimer=this.random.nextInt(t.RETARGET_CHECK_INTERVAL),this.aggressiveRetarget=!1,this.battleController&&void 0!==this.battleController.unitScale){
- if(this.numStun--,this.numFreeze--,this.numBurn--,this.numPoison--,this.numBleed--,this.numCurse--,this.numSilence--,this.numKnockBack--,this.numPowerShield--,this.numMagicalShield--,this.numPhysicalShield--,this.numBinding--,this.numShock--,this.numPriestShield--,this.numTransparent--,this.numLoveShield--,this.numLove--,this.numAirToGround--,this.numTransparent>=0&&(0==this.numTransparent?(this.alpha=1,this.targetAlpha=1):Math.abs(this.targetAlpha-this.alpha)<.04?this.alpha=this.targetAlpha:this.alpha>this.targetAlpha?this.alpha-=.03:this.alpha<this.targetAlpha&&(this.alpha+=.03)),!this.isAlive&&this.numKnockBack<=0&&this.numBlow<=0)return!1; + if(this.numStun--,this.numFreeze--,this.numBurn--,this.numPoison--,this.numBleed--,this.numCurse--,this.numSilence--,this.numKnockBack--,this.numPowerShield--,this.numMagicalShield--,this.numPhysicalShield--,this.numBinding--,this.numShock--,this.numPriestShield--,this.numTransparent--,this.numLoveShield--,this.numLove--,this.numAirToGround--,this.numTransparent>=0&&(0==this.numTransparent?(this.alpha=1,this.targetAlpha=1):Math.abs(this.targetAlpha-this.alpha)<.04?this.alpha=this.targetAlpha:this.alpha>this.targetAlpha?this.alpha-=.03:this.alpha<this.targetAlpha&&(this.alpha+=.03)),this.updateHitTint(),!this.isAlive&&this.numKnockBack<=0&&this.numBlow<=0)return!1;
+ resetMotionPose(){ + this.numHitted=0,this.numKnockBack=0,this.knockBackVx=0,this.knockBackVy=0,this.numBlow=0,this.blowVx=0,this.blowVy=0,this.blowVh=0,this.blowHeight=0,this.sp&&(this.sp.rotation=0),this.numHitTint>0&&this.sp&&(this.sp.tint=16777215),this.numHitTint=0}
- if(this.visible=!0,this.renderable=!0,this.isAlive=!0,this.gameStarted=!1,this.alpha=1,this.sp&&(this.sp.visible=!0),this.removed=!1,this._poolReturned=!1,this.hasDroppedGold=!1,this.disablePatrol(),this.rallyMoveTimer=0,this.farFromCastleFrames=0,this.needsReposition=!1,this.healthBar.visible=!1,this.hideHealthBarTimer=0,this.bossType=0,this.totalDamageDealt=0,this.currentFrame=0,this.frame=0,this.incFrame=1,this.initDelay=0,this.rallyMoveTimer=0,this.attackCoolDown=0,this.recoveryCoolDown=0,this.numStun=0,this.numFreeze=0,this.numPoison=0,this.numCurse=0,this.numBinding=0,this.numShock=0,this.dotDamager.reset(),this.dotHeal.reset(),this.clearActiveBuffs(),this.effectList&&this.effectList.length>0){ + if(this.visible=!0,this.renderable=!0,this.isAlive=!0,this.gameStarted=!1,this.alpha=1,this.sp&&(this.sp.visible=!0),this.removed=!1,this._poolReturned=!1,this.hasDroppedGold=!1,this.disablePatrol(),this.rallyMoveTimer=0,this.farFromCastleFrames=0,this.needsReposition=!1,this.healthBar.visible=!1,this.hideHealthBarTimer=0,this.bossType=0,this.totalDamageDealt=0,this.currentFrame=0,this.frame=0,this.incFrame=1,this.initDelay=0,this.rallyMoveTimer=0,this.attackCoolDown=0,this.recoveryCoolDown=0,this.numStun=0,this.numFreeze=0,this.numPoison=0,this.numCurse=0,this.numBinding=0,this.numShock=0,this.resetMotionPose(),this.dotDamager.reset(),this.dotHeal.reset(),this.clearActiveBuffs(),this.effectList&&this.effectList.length>0){
+ var t;
- ""!=this.attackSound&&Math.random()<.1&&MG.getInstance().playSFX(this.attackSound)} + ""!=this.attackSound&&Math.random()<((null==(t=this.battleController)?void 0:t.attackSfxChance)??.1)&&qG.getInstance().playSFX(this.attackSound)}
- if(i.health-=u,this.lifeSteal>0&&u>0&&this.isAlive&&(this.health+=u*this.lifeSteal,this.health>this.maxHp&&(this.health=this.maxHp)),f&&!i.isAlive&&this.onKillEnemy(i),i.onHitted(),t.raidDamageHook&&t.raidDamageHook(this,i,u),this.bossType>0&&i.isAlive&&!i.isImmovable&&!i.knockImmune){ + if(i.health-=u,this.lifeSteal>0&&u>0&&this.isAlive&&(this.health+=u*this.lifeSteal,this.health>this.maxHp&&(this.health=this.maxHp)),f&&!i.isAlive&&this.onKillEnemy(i),i.onHitted(),i.startHitTint(),t.raidDamageHook&&t.raidDamageHook(this,i,u),this.bossType>0&&i.isAlive&&!i.isImmovable&&!i.knockImmune){
- 0!=this.isAlive&&(this.isAlive=!1,this.target&&(this.target.removeBlockedEnemy(this),this.target=null),this.clearBlockedEnemies(),this.xDeath=this.x,this.yDeath=this.y,this.numRevive>=this.maxRevive&&this.showTombstone&&(this.sp.visible=!1,this.imgTombStone&&(this.imgTombStone.visible=!0),this.txtReviveTimer&&(this.txtReviveTimer.visible=!0),this.reviveCount=this.reviveInterval,this.isAir&&(super.y=this.ground)),this.shadow&&(this.shadow.visible=!1),this.gotoDieState(),Math.random()<.1&&this.playSFX(this.dieSound),this.removeAllEffect(),this.onDie())} + var t; + 0!=this.isAlive&&(this.isAlive=!1,this.target&&(this.target.removeBlockedEnemy(this),this.target=null),this.clearBlockedEnemies(),this.xDeath=this.x,this.yDeath=this.y,this.numRevive>=this.maxRevive&&this.showTombstone&&(this.sp.visible=!1,this.imgTombStone&&(this.imgTombStone.visible=!0),this.txtReviveTimer&&(this.txtReviveTimer.visible=!0),this.reviveCount=this.reviveInterval,this.isAir&&(super.y=this.ground)),this.shadow&&(this.shadow.visible=!1),this.gotoDieState(),Math.random()<((null==(t=this.battleController)?void 0:t.dieSfxChance)??.1)&&this.playSFX(this.dieSound),this.removeAllEffect(),this.onDie())}
+ startHitTint(){ + var i; + this.sp&&(null==(i=this.battleController)?void 0:i.hitFlash)&&(this.numHitTint=t.HIT_TINT_FRAMES,this.sp.tint=t.HIT_TINT_COLOR)} + updateHitTint(){ + this.numHitTint<=0||--this.numHitTint>0||this.sp&&(this.sp.tint=this.numChillTint>0?t.CHILL_TINT:16777215)}
WingKnight1 2 hunks, 17 statements
+ async generateSprite(){ + await super.generateSprite(),this.textures=t.fillFrameGaps(this.sheetName,this.textureName,this.textures)} + static fillFrameGaps(i,s,e){ + if(t.numberedTextures)return t.numberedTextures; + const n=kS.getSheet(i).textures,h=[]; + for(const t of Object.keys(n).filter(t=>t.includes(s)).sort()){ + const i=/(\d{ + 4} + )(?:\.png)?$/.exec(t); + if(!i)return e; + const s=Number(i[1])-1; + for(; + h.length<s; + )h.push(h.length>0?h[h.length-1]:n[t]); + h.push(n[t])} + return t.numberedTextures=h,h}
- qt(Z5,"WingKnight1"),Xt(Z5,"ATK_DMG",[.7,.8,1]),Xt(Z5,"KILL_THRESHOLD",6),Xt(Z5,"FLASH_BUFF_DUR",480),Xt(Z5,"FLASH_DETECT_RANGE",1200),Xt(Z5,"FLASH_ATKDMG",.5),Xt(Z5,"FLASH_ATKDMG_ALT",.3),Xt(Z5,"FLASH_MOVSPD",1.5),Xt(Z5,"FLASH_ATKSPD",.5),Xt(Z5,"SURVIVE_HP_THRESHOLD",.2),Xt(Z5,"SURVIVE_SHIELD_DUR",180),Xt(Z5,"SURVIVE_BERSERK_DUR",600),Xt(Z5,"SURVIVE_SKILL_COOLDOWN",3600),Xt(Z5,"SURVIVE_ATKSPD",1),Xt(Z5,"SURVIVE_ATKDMG",1),Xt(Z5,"SURVIVE_ATKDMG_ALT",.4),Xt(Z5,"COMBO_KB_VX",3),Xt(Z5,"COMBO_KB_VX_E",4),Xt(Z5,"COMBO_KB_VY",-2),Xt(Z5,"COMBO_KB_DUR",30),Xt(Z5,"COMBO_KB_DUR_E",40),Xt(Z5,"COMBO_SPLASH_RANGE",60),Xt(Z5,"DASH_STUN_DUR",30),Xt(Z5,"DASH_STUN_DUR_E",45),Xt(Z5,"DASH_STUN_RANGE",60),Xt(Z5,"SKILL_TARGET_RANGE",500),Xt(Z5,"SKILL_SLAM_RANGE",110),Xt(Z5,"SKILL_SLAM_RANGE_E",150),Xt(Z5,"SKILL_SLAM_DMG",2.5),Xt(Z5,"SKILL_SLAM_DMG_E",3); + Qt(Q3,"WingKnight1"),Zt(Q3,"ATK_DMG",[.7,.8,1]),Zt(Q3,"KILL_THRESHOLD",6),Zt(Q3,"FLASH_BUFF_DUR",480),Zt(Q3,"FLASH_DETECT_RANGE",1200),Zt(Q3,"FLASH_ATKDMG",.5),Zt(Q3,"FLASH_ATKDMG_ALT",.3),Zt(Q3,"FLASH_MOVSPD",1.5),Zt(Q3,"FLASH_ATKSPD",.5),Zt(Q3,"SURVIVE_HP_THRESHOLD",.2),Zt(Q3,"SURVIVE_SHIELD_DUR",180),Zt(Q3,"SURVIVE_BERSERK_DUR",600),Zt(Q3,"SURVIVE_SKILL_COOLDOWN",3600),Zt(Q3,"SURVIVE_ATKSPD",1),Zt(Q3,"SURVIVE_ATKDMG",1),Zt(Q3,"SURVIVE_ATKDMG_ALT",.4),Zt(Q3,"COMBO_KB_VX",3),Zt(Q3,"COMBO_KB_VX_E",4),Zt(Q3,"COMBO_KB_VY",-2),Zt(Q3,"COMBO_KB_DUR",30),Zt(Q3,"COMBO_KB_DUR_E",40),Zt(Q3,"COMBO_SPLASH_RANGE",60),Zt(Q3,"DASH_STUN_DUR",30),Zt(Q3,"DASH_STUN_DUR_E",45),Zt(Q3,"DASH_STUN_RANGE",60),Zt(Q3,"SKILL_TARGET_RANGE",500),Zt(Q3,"SKILL_SLAM_RANGE",110),Zt(Q3,"SKILL_SLAM_RANGE_E",150),Zt(Q3,"SKILL_SLAM_DMG",2.5),Zt(Q3,"SKILL_SLAM_DMG_E",3),Zt(Q3,"numberedTextures",null);
PVPBattleSubView 6 hunks, 17 statements
- this.registerMissionGuild(),t.sort((t,i)=>(Number(t.rank)||999)-(Number(i.rank)||999)),this.opponentList.dataProvider=t; + this.registerMissionGuild(),t.sort((t,i)=>(Number(t.rank)||999)-(Number(i.rank)||999)),this.attachPreviews(t),this.opponentList.dataProvider=t;
+ attachPreviews(t){ + var i,s; + const e=Number((null==(i=this.userPvp)?void 0:i.point)??0),n=Number((null==(s=this.userPvp)?void 0:s.attackGame)??0); + for(const h of t){ + const t=n0t(e,Number(h.point)||0,n); + h.preview=t} + }
- if(this.battleId<=0)return; - if(1==this.requestPending)return; + var i,s,e,n; + if(this.battleId<=0)return null; + if(1==this.requestPending)return null;
- const i=await TL.getInstance().pvp.endBattle(this.battleId,t,!0); - if(!1===i.success)return this.setRequestPending(!1),void YG.getInstance().showError(i); + const h=Number((null==(i=this.userPvp)?void 0:i.point)??0),r=Number((null==(s=this.userPvp)?void 0:s.rank)??0),o=await ZL.getInstance().pvp.endBattle(this.battleId,t,!0); + if(!1===o.success)return this.setRequestPending(!1),bB.getInstance().showError(o),null;
- this.userPvp&&(this.userPvp.point=e),this.battleId=0,this.updateInfoLabels(),this.setRequestPending(!1),this.loadInfo(),t&&mzt.getInstance().getStatus()} + return this.userPvp&&(this.userPvp.point=c),this.battleId=0,this.updateInfoLabels(),this.setRequestPending(!1),t&&mYt.getInstance().getStatus(),await this.loadInfo(),{ + oldPoint:h,newPoint:Number(c),oldRank:r,newRank:Number((null==(e=this.userPvp)?void 0:e.rank)??r),winStreak:Number((null==(n=this.userPvp)?void 0:n.winStreak)??0)} + }
- let s=nB.getText("","##보석을 소모하여 무한 랭킹전 티켓을 @@장 구매하시겠습니까?"); + let s=RB.getText("GAME_1890","##보석을 소모하여 무한 랭킹전 티켓을 @@장 구매하시겠습니까?");
URLManager 4 hunks, 16 statements
- /user/updateLanguage`,INCREASE_GEM:`${ + /user/updateLanguage`,UPDATE_HIDE_RANKING_TEAM:`${ + t.baseURL} + /user/updateHideRankingTeam`,INCREASE_GEM:`${
- /user/useInventory`,GET_EVENTS:`${ - t.baseURL} - /user/getEvents`,SELL_TRANS_TICKET:`${ + /user/useInventory`,SELL_TRANS_TICKET:`${
- /user/updateUserData`} + /user/updateUserData`,GET_EVENTS:`${ + t.baseURL} + /user/getEvents`,ATTEND_EVENT:`${ + t.baseURL} + /user/attendEvent`,GET_EVENT_SCHEDULE:`${ + t.baseURL} + /user/getEventSchedule`}
- /hero/buyHeroAllByMedal`,ADD_TO_TEAM:`${ + /hero/buyHeroAllByMedal`,BUY_MASSIVE_HEROES:`${ + t.baseURL} + /hero/buyMassiveHeroes`,ADD_TO_TEAM:`${
MissionGuideController 4 hunks, 15 statements
- Xt(this,"active",!1),Xt(this,"checking",!1),Xt(this,"frameSkip",0),Xt(this,"currentSteps",[]),Xt(this,"cachedCondition",null),Xt(this,"pointingDelayTimer",null),Xt(this,"pointingDelayed",!1),Xt(this,"listItemsGetter",null),Xt(this,"bottomMenuGetter",null),Xt(this,"popupButtonGetter",null),Xt(this,"subMenuButtonGetter",null),Xt(this,"currentSubViewName",""),Xt(this,"reviveButtonGetter",null),Xt(this,"rightMenuIndicatorButtonGetter",null),Xt(this,"dailyQuestButtonGetter",null),Xt(this,"petButtonGetter",null),Xt(this,"mineButtonGetter",null),Xt(this,"guildButtonGetter",null),Xt(this,"pendingParent",null),Xt(this,"pendingBtn",null)} + Zt(this,"active",!1),Zt(this,"checking",!1),Zt(this,"frameSkip",0),Zt(this,"currentSteps",[]),Zt(this,"cachedCondition",null),Zt(this,"pointingDelayTimer",null),Zt(this,"pointingDelayed",!1),Zt(this,"listItemsGetter",null),Zt(this,"bottomMenuGetter",null),Zt(this,"popupButtonGetter",null),Zt(this,"subMenuButtonGetter",null),Zt(this,"currentSubViewName",""),Zt(this,"reviveButtonGetter",null),Zt(this,"rightMenuIndicatorButtonGetter",null),Zt(this,"dailyQuestButtonGetter",null),Zt(this,"petButtonGetter",null),Zt(this,"mineButtonGetter",null),Zt(this,"hubMineButtonGetter",null),Zt(this,"guildButtonGetter",null),Zt(this,"pendingParent",null),Zt(this,"pendingBtn",null)}
+ registerHubMineButtonGetter(t){ + this.hubMineButtonGetter=t,this.updatePointing()} + unregisterHubMineButtonGetter(){ + this.hubMineButtonGetter=null}
+ if(2==t.mineStep)return i.hideFromTarget(),void this.cancelPointingDelay(); + if(0==t.mineStep){
+ } + else if(1==t.mineStep){ + if(!this.hubMineButtonGetter)return; + const t=s.param; + if(t&&"-1"!==t){ + const i=this.hubMineButtonGetter(t); + i&&this.showWithDelay(i.parent,i.btn)} + }
RankingProfile 1 hunks, 15 statements
- const Dhi=class extends He{ - constructor(){ - super(),Xt(this,"icon"),Xt(this,"lblRanking"),this.icon=new je(eS.getTexture("UI_Ekkorr","Icon_Rank_05")),this.addChild(this.icon),this.lblRanking=new SD("1",SD.WHITE),this.lblRanking.x=.5*(this.icon.width-this.lblRanking.width),this.lblRanking.y=30,this.addChild(this.lblRanking)} - setRanking(t){ - switch(t){ - case 1:case 2:case 3:case 4:case 5:this.icon.texture=eS.getTexture("UI_Ekkorr",`Icon_Rank_0${ - t} - `),this.icon.visible=!0; - break; - default:this.icon.visible=!1} - t>0&&t<6?(this.icon.visible=!0,this.lblRanking.y=30):(this.icon.visible=!1,this.lblRanking.y=25),this.lblRanking.text=t<=0?"-":t.toString(),this.lblRanking.x=.5*(this.icon.width-this.lblRanking.width)} - } - ; - qt(Dhi,"RankingProfile"); - let Ghi=Dhi;
StringUtils 1 hunks, 14 statements
+ static displayDate2(t,i=!1,s="-"){ + return i?`${ + this.digit(t.getUTCMonth()+1)} + ${ + s} + ${ + this.digit(t.getUTCDate())} + `:`${ + this.digit(t.getMonth()+1)} + ${ + s} + ${ + this.digit(t.getDate())} + `}
SpriteQuitPopup 14 hunks, 14 statements
- x:180,y:370} + x:195,y:370}
- x:180,y:420} + x:195,y:420}
- x:180,y:470} + x:195,y:470}
- x:180,y:520} + x:195,y:520}
- x:95,y:370} + x:120,y:370}
- x:95,y:420} + x:120,y:420}
- x:95,y:470} + x:120,y:470}
- x:95,y:520} + x:120,y:520}
- x:10,y:370} + x:45,y:370}
- x:10,y:420} + x:45,y:420}
- x:10,y:470} + x:45,y:470}
- x:10,y:520} + x:45,y:520}
- const t=[380,445,510,575,640],i=[370,420,470,520],s=[]; + const t=[385,435,485,535,585],i=[370,420,470,520],s=[];
- )()); + )()),Zt(x3t,"FIELD",640),Zt(x3t,"EDGE",24),Zt(x3t,"BOTTOM",624);
SUN 1 hunks, 13 statements
- qt(N6t,"copyToClipboard"),qt(L6t,"formatDecimal"); + function q4t(t){ + const i=new Map; + i.set("SUN",0),i.set("MON",1),i.set("TUE",2),i.set("WED",3),i.set("THU",4),i.set("FRI",5),i.set("SAT",6); + const s=i.get(t.toUpperCase()); + return void 0!==s?s:-1} + function X4t(t){ + const i=new Map; + i.set(0,"SUN"),i.set(1,"MON"),i.set(2,"TUE"),i.set(3,"WED"),i.set(4,"THU"),i.set(5,"FRI"),i.set(6,"SAT"); + const s=i.get(t); + return void 0!==s?s:""} + function J4t(t,i){ + return t.getUTCFullYear()===i.getUTCFullYear()&&t.getUTCMonth()===i.getUTCMonth()&&t.getUTCDate()===i.getUTCDate()} + Qt(z4t,"copyToClipboard"),Qt(Y4t,"formatDecimal"),Qt(q4t,"getDayIndex"),Qt(X4t,"getDayShortName"),Qt(J4t,"isSameDay");
AttendanceReceiveButton 1 hunks, 13 statements
- const Ori=class extends NXt{ - constructor(t){ - super(t),this.setTexture({ - texture:eS.getTexture("UI_Ekkorr","Btn_Bg_01"),leftWidth:80,topHeight:35,rightWidth:90,bottomHeight:27} - ),this.width=256,this.height=67,this.outlineText=!0} - setClaimEnabled(t){ - this.activated=t,this.bg.tint=t?16777215:9079434} - updateLayout(){ - super.updateLayout(),this.lbl.y=.5*(this._height-11-this.lbl.height)} - } - ; - qt(Ori,"AttendanceReceiveButton"); - let kri=Ori;
LanguageChangePopup 1 hunks, 13 statements
- onLangPackLoad(t){ - mS.getInstance().dispatchCustomEvent("LanguageChange"),this.count=0,FM.getInstance().add(this.checkHide,this)} + async onLangPackLoad(t){ + WS.getInstance().dispatchCustomEvent("LanguageChange"); + const{ + EventSchedulePopup:i} + =await ei(async()=>{ + const{ + EventSchedulePopup:t} + =await Promise.resolve().then(()=>Uii); + return{ + EventSchedulePopup:t} + } + ,void 0); + i.getInstance().needToReload=!0,this.count=0,fE.getInstance().add(this.checkHide,this)}
UserService 2 hunks, 12 statements
+ async updateHideRankingTeam(t,i=!1){ + return this.post(LP.USER.UPDATE_HIDE_RANKING_TEAM,{ + hideRankingTeam:t} + ,i)}
+ async attendEvent(t=!1){ + return this.post(LP.USER.ATTEND_EVENT,{ + } + ,t)} + async getEventSchedule(t=!1){ + return this.post(LP.USER.GET_EVENT_SCHEDULE,{ + } + ,t)}
HeroResetEventPopup 3 hunks, 12 statements
- this.updateLayout(),super.show()} + this.udpateRefreshCost(),this.updateLayout(),super.show()} + udpateRefreshCost(){ + const t=parseInt(SG.getInstance().getClientData("HERO_PAID_REFRESH_COST")); + this.refreshCost=isNaN(t)?100:t}
- this.lblMessage1.text=nB.getText("GAME_547","유료 갱신 비용 감소")+" : 100 ➜ "+100/t.divide,this.lblMessage2.text=nB.getText("GAME_548","무료 충전 시간 감소 (분)")+" : 60 ➜ "+60/t.divide; + this.lblMessage1.text=RB.getText("GAME_547","유료 갱신 비용 감소")+` : ${ + this.refreshCost} + ➜ ${ + this.refreshCost/t.divide} + `,this.lblMessage2.text=RB.getText("GAME_548","무료 충전 시간 감소 (분)")+" : 60 ➜ "+60/t.divide;
- this.lblMessage1.x=this.lblMessage2.x=this.lblMessage3.x=50,this.infoBg.y=70,this.lblMessage1.y=this.infoBg.y+20,this.lblMessage2.y=this.lblMessage1.y+this.lblMessage1.height+20,this.lblMessage3.y=this.lblMessage2.y+this.lblMessage2.height+20,this.infoBg.height=this.lblMessage3.y-this.infoBg.y+this.lblMessage3.height+17,this.height=this.infoBg.y+this.infoBg.height+25} + const i=this.infoBg.x+15,s=this.infoBg.width-40; + for(const e of[this.lblMessage1,this.lblMessage2,this.lblMessage3])e.setWrapWidth(s),e.x=i; + this.infoBg.y=70,this.lblMessage1.y=this.infoBg.y+20,this.lblMessage2.y=this.lblMessage1.y+this.lblMessage1.height+20,this.lblMessage3.y=this.lblMessage2.y+this.lblMessage2.height+20,this.infoBg.height=this.lblMessage3.y-this.infoBg.y+this.lblMessage3.height+17,this.height=this.infoBg.y+this.infoBg.height+25}
CardEventRankingItemRenderer 6 hunks, 12 statements
- super(),Xt(this,"bg"),Xt(this,"highlightBg"),Xt(this,"lblRank"),Xt(this,"lblName"),Xt(this,"lblScore"),Xt(this,"lblRound"); + super(),Zt(this,"bg"),Zt(this,"highlightBg"),Zt(this,"rankBadge",new i0t(44)),Zt(this,"lblName"),Zt(this,"lblScore"),Zt(this,"lblRound");
- e.fill=OL.COLOR_WHITE,this.lblRank=new SD("1",e.fill,e),this.addChild(this.lblRank),this.lblName=new SD("",e.fill,e),this.addChild(this.lblName),this.lblScore=new SD("0",e.fill,e),this.addChild(this.lblScore),this.lblRound=new SD("",OL.DEFAULT_COLOR,OL.DEFAULT_FONT_OPTION_15),this.lblRound.textSize=13,this.addChild(this.lblRound)} + e.fill=sD.COLOR_WHITE,this.addChild(this.rankBadge),this.lblName=new QD("",e.fill,e),this.addChild(this.lblName),this.lblScore=new QD("0",e.fill,e),this.addChild(this.lblScore),this.lblRound=new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_FONT_OPTION_15),this.lblRound.textSize=13,this.addChild(this.lblRound)}
- this.lblRank.text=`${ - i.rank} - `,this.lblName.text=i.name,this.lblScore.text=_D.displayLargeNumberAsAlphabet(i.bestScore),this.lblRound.text=`${ + this.rankBadge.setRank(t.rank),this.lblName.text=t.name,this.lblScore.text=KD.displayLargeNumberAsAlphabet(t.bestScore),this.lblRound.text=`${
- const s=t.RANK_COLORS[i.rank]??16777215; - this.lblRank.textColor=s;
- const i=t.ITEM_WIDTH,s=.5*(t.ITEM_HEIGHT-this.lblRank.height); - this.lblRank.x=20,this.lblRank.y=s,this.lblName.x=80,this.lblName.y=s,this.lblScore.x=i-20-this.lblScore.width,this.lblScore.y=5,this.lblRound.x=i-20-this.lblRound.width,this.lblRound.y=28} + const i=t.ITEM_WIDTH,s=t.ITEM_HEIGHT,e=.5*(s-this.lblName.height); + this.rankBadge.x=16,this.rankBadge.y=.5*(s-44),this.lblName.x=80,this.lblName.y=e,this.lblScore.x=i-20-this.lblScore.width,this.lblScore.y=5,this.lblRound.x=i-20-this.lblRound.width,this.lblRound.y=28}
- qt(Dwi,"CardEventRankingItemRenderer"),Xt(Dwi,"ITEM_WIDTH",520),Xt(Dwi,"ITEM_HEIGHT",50),Xt(Dwi,"RANK_COLORS",{ - 1:16766720,2:12632256,3:13467442} - ); + Qt(z_i,"CardEventRankingItemRenderer"),Zt(z_i,"ITEM_WIDTH",520),Zt(z_i,"ITEM_HEIGHT",50);
MiniAscentShell 7 hunks, 12 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:26,lineHeight:32} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:26,lineHeight:32}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:14,lineHeight:18} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:14,lineHeight:18}
- ),Xt(this,"headerTweens",[]),Xt(this,"activePage",null),Xt(this,"onExit",null),Xt(this,"onNavigate",null),this.width=616,this.bg.visible=this.txtTitle.visible=this.btnClose.visible=!1,this.paper.tint=u_i.paperTint,this.paper.eventMode="static",this.paper.mask=this.clip,this.pages.mask=this.contentClip,this.clip.eventMode=this.contentClip.eventMode=this.chrome.eventMode="none",this.addChild(this.paper,this.clip,this.pages,this.contentClip,this.chrome,this.header,this.coin,this.coinText,this.seal,this.sealText,this.energy,this.energyText,this.progress,this.remaining,this.navigation,this.closeControl,this.fxLayer),this.fxLayer.eventMode="none",this.coin.anchor.set(.5),this.energy.anchor.set(.5); + ),Zt(this,"headerTweens",[]),Zt(this,"activePage",null),Zt(this,"onExit",null),Zt(this,"onSeasonEnded",null),Zt(this,"onNavigate",null),this.width=616,this.bg.visible=this.txtTitle.visible=this.btnClose.visible=!1,this.paper.tint=ybi.paperTint,this.paper.eventMode="static",this.paper.mask=this.clip,this.pages.mask=this.contentClip,this.clip.eventMode=this.contentClip.eventMode=this.chrome.eventMode="none",this.addChild(this.paper,this.clip,this.pages,this.contentClip,this.chrome,this.header,this.coin,this.coinText,this.seal,this.sealText,this.energy,this.energyText,this.progress,this.remaining,this.navigation,this.closeControl,this.fxLayer),this.fxLayer.eventMode="none",this.coin.anchor.set(.5),this.energy.anchor.set(.5);
- var t,i,s,e,n,h; + var t,i,s,e,n,h,r,o;
- this.coinText.text=String(r.run&&!r.run.battleOnly&&(null==(t=this.activePage)?void 0:t.usesRunWallet)?r.run.wallet:this.shown.gold??(null==(i=r.season)?void 0:i.gold)??0),this.coinText.scale.set(1),this.coinText.scale.set(Math.min(1,48/Math.max(1,this.coinText.width))),this.coinText.position.set(62,78),this.sealText.text=String((null==(s=r.season)?void 0:s.coin)??0),this.sealText.scale.set(1),this.sealText.scale.set(Math.min(1,48/Math.max(1,this.sealText.width))),this.sealText.position.set(156,78),this.progress.text=r.run?o_i("DEPTH",r.run.floor):o_i("BEST",(null==(e=r.season)?void 0:e.bestFloor)??0),this.progress.scale.set(1),this.progress.scale.set(Math.min(1,130/Math.max(1,this.progress.width))),this.progress.position.set((this.width-this.progress.width)/2,78); - const o=null==(n=r.season)?void 0:n.energy; + if(this.parent&&a.isSeasonOver())return void(null==(t=this.onSeasonEnded)||t.call(this)); + this.coinText.text=String(a.run&&!a.run.battleOnly&&(null==(i=this.activePage)?void 0:i.usesRunWallet)?a.run.wallet:this.shown.gold??(null==(s=a.season)?void 0:s.gold)??0),this.coinText.scale.set(1),this.coinText.scale.set(Math.min(1,48/Math.max(1,this.coinText.width))),this.coinText.position.set(62,78),this.sealText.text=String((null==(e=a.season)?void 0:e.coin)??0),this.sealText.scale.set(1),this.sealText.scale.set(Math.min(1,48/Math.max(1,this.sealText.width))),this.sealText.position.set(156,78),this.progress.visible=!a.shopOnly,this.progress.text=a.run?vbi("DEPTH",a.run.floor):vbi("BEST",(null==(n=a.season)?void 0:n.bestFloor)??0),this.progress.scale.set(1),this.progress.scale.set(Math.min(1,130/Math.max(1,this.progress.width))),this.progress.position.set((this.width-this.progress.width)/2,78); + const c=a.shopOnly||null==(h=a.season)?void 0:h.energy;
- `,this.energyText.scale.set(1),this.energyText.scale.set(Math.min(1,72/Math.max(1,this.energyText.width))),this.energyText.position.set(this.width-28-this.energyText.width,78),this.energy.position.set(this.energyText.x-34+13,89)),this.remaining.text=k_i(null==(h=r.season)?void 0:h.endTime,cR.time>=0?cR.time:Date.now()),this.remaining.scale.set(1),this.remaining.scale.set(Math.min(1,120/Math.max(1,this.remaining.width))),this.remaining.position.set(28,29); + `,this.energyText.scale.set(1),this.energyText.scale.set(Math.min(1,72/Math.max(1,this.energyText.width))),this.energyText.position.set(this.width-28-this.energyText.width,78),this.energy.position.set(this.energyText.x-34+13,89)),this.remaining.text=$bi(a.shopOnly?null==(r=a.season)?void 0:r.shopEndTime:null==(o=a.season)?void 0:o.endTime,DR.time>=0?DR.time:Date.now()),this.remaining.scale.set(1),this.remaining.scale.set(Math.min(1,120/Math.max(1,this.remaining.width))),this.remaining.position.set(28,29);
- const n=(this.width-32-5*(this.tabButtons.length-1))/this.tabButtons.length; - this.tabButtons.forEach(({ + const n=Fbi.getInstance().shopOnly,h=this.tabButtons.filter(({ + id:t,root:i} + )=>i.visible=!n||"shop"===t),r=(this.width-32-5*(h.length-1))/h.length; + h.forEach(({
MiniGameRankingItemRenderer 6 hunks, 12 statements
- super(),Xt(this,"bg"),Xt(this,"highlightBg"),Xt(this,"lblRank"),Xt(this,"lblName"),Xt(this,"lblScore"); + super(),Zt(this,"bg"),Zt(this,"highlightBg"),Zt(this,"rankBadge",new i0t(44)),Zt(this,"lblName"),Zt(this,"lblScore");
- e.fill=OL.COLOR_WHITE,this.lblRank=new SD("1",e.fill,e),this.addChild(this.lblRank),this.lblName=new SD("",e.fill,e),this.addChild(this.lblName),this.lblScore=new SD("0",e.fill,e),this.addChild(this.lblScore)} + e.fill=sD.COLOR_WHITE,this.addChild(this.rankBadge),this.lblName=new QD("",e.fill,e),this.addChild(this.lblName),this.lblScore=new QD("0",e.fill,e),this.addChild(this.lblScore)}
- this.lblRank.text=`${ - i.rank} - `,this.lblName.text=i.name,this.lblScore.text=`${ + this.rankBadge.setRank(t.rank),this.lblName.text=t.name,this.lblScore.text=`${
- const s=t.RANK_COLORS[i.rank]??16777215; - this.lblRank.textColor=s;
- const i=t.ITEM_WIDTH,s=.5*(t.ITEM_HEIGHT-this.lblRank.height); - this.lblRank.x=20,this.lblRank.y=s,this.lblScore.x=i-20-this.lblScore.width,this.lblScore.y=s,this.lblName.x=80,this.lblName.y=s} + const i=t.ITEM_WIDTH,s=t.ITEM_HEIGHT,e=.5*(s-this.lblName.height); + this.rankBadge.x=16,this.rankBadge.y=.5*(s-44),this.lblScore.x=i-20-this.lblScore.width,this.lblScore.y=e,this.lblName.x=80,this.lblName.y=e}
- qt(Xbi,"MiniGameRankingItemRenderer"),Xt(Xbi,"ITEM_WIDTH",520),Xt(Xbi,"ITEM_HEIGHT",50),Xt(Xbi,"RANK_COLORS",{ - 1:16766720,2:12632256,3:13467442} - ); + Qt(oEi,"MiniGameRankingItemRenderer"),Zt(oEi,"ITEM_WIDTH",520),Zt(oEi,"ITEM_HEIGHT",50);
GameSpeedBuffPopup 5 hunks, 11 statements
- super(),Xt(this,"lblTotal",new SD("",16763904,OL.DEFAULT_OUTLINE_FONT_OPTION_18)),Xt(this,"lblProduct",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblTreasure",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblHero",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblGodBless",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblPet",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"heroIconContainer",new He),this.contentContainer.addChild(this.lblTotal,this.lblProduct,this.lblGodBless,this.lblTreasure,this.lblHero,this.heroIconContainer,this.lblPet),this.outSideClickHide=!0} + super(),Zt(this,"lblTotal",new QD("",16763904,sD.DEFAULT_OUTLINE_FONT_OPTION_18)),Zt(this,"lblFire",new QD("",16743002,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblProduct",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblTreasure",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblHero",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblGodBless",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblPet",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"heroIconContainer",new Ve),this.contentContainer.addChild(this.lblTotal,this.lblFire,this.lblProduct,this.lblGodBless,this.lblTreasure,this.lblHero,this.heroIconContainer,this.lblPet),this.outSideClickHide=!0}
- const n=.001*(XD.godBlessEndTime-t)>0?300:0,h=eP.getInstance().treasure.getGameplayBuff($x.GameSpeed),r=UR.getInstance().getTotal(GR.GameSpeed)+Fx.getBarracksGameSpeedContribution(),o=Math.round(100*eP.getInstance().pet.getGameplayBuff($x.GameSpeed))/100,a=e+n+h+r+o; + const n=.001*(EG.godBlessEndTime-t)>0&&!VD.godBlessOff?300:0,h=kP.getInstance().treasure.getGameplayBuff(gP.GameSpeed),r=dx.getInstance().getTotal(lx.GameSpeed)+fP.getBarracksGameSpeedContribution(),o=Math.round(100*kP.getInstance().pet.getGameplayBuff(gP.GameSpeed))/100,a=fU(EG.wave),c=e+n+h+r+o-a;
- : +${ + : ${ + c>=0?"+":""} + ${
- %`,this.lblTotal.x=l,this.lblTotal.y=c,c+=this.lblTotal.height+15,this.lblProduct.text=`${ + %`,this.lblTotal.x=u,this.lblTotal.y=l,l+=this.lblTotal.height+8,this.lblFire.visible=a>0,a>0&&(this.lblFire.text=`${ + Uzt(G8t.fireAura)} + : -${ + a} + %`,this.lblFire.x=u,this.lblFire.y=l,l+=this.lblFire.height+8),l+=7,this.lblProduct.text=`${
- const t=TR.getInstance(),i=[...d].sort((t,i)=>{ + const t=ZR.getInstance(),i=[...f].sort((t,i)=>{
PVPBattleStatus 3 hunks, 10 statements
- super(),Xt(this,"_showed",!1),Xt(this,"_frameCounter",0),Xt(this,"_allySnap",new Map),Xt(this,"_enemySnap",new Map),Xt(this,"_lblLeague"),Xt(this,"_lblMyName"),Xt(this,"_lblEnemyName"),Xt(this,"_lblMyScore"),Xt(this,"_lblEnemyScore"),Xt(this,"_lblMyRecord"),Xt(this,"_lblEnemyRecord"),Xt(this,"_lblAlly"),Xt(this,"_lblEnemy"),Xt(this,"allyRows",[]),Xt(this,"enemyRows",[]),Xt(this,"_allyBarsG",new Ff),Xt(this,"_enemyBarsG",new Ff),Xt(this,"bg",new CD),Xt(this,"btnClose",new NG),this.bg.setIndex(6),this.addChild(this.bg),this.bg.width=640,this.bg.height=Xy.stageHeight-640-454,this.bg.y=Xy.safeHeight-640-this.bg.height,this._buildMatchHeader(),this._buildDamageHeaders(),this._buildAllRows(),this._buildDivider(),this.addChild(this._allyBarsG),this.addChild(this._enemyBarsG),this.btnClose.x=640-this.btnClose.width,this.btnClose.y=5-this.btnClose.height,this.btnClose.onClick=this.onClickGiveUp.bind(this),this.addChild(this.btnClose)} + super(),Zt(this,"_showed",!1),Zt(this,"_frameCounter",0),Zt(this,"_allySnap",new Map),Zt(this,"_enemySnap",new Map),Zt(this,"_lblLeague"),Zt(this,"_lblMyName"),Zt(this,"_lblEnemyName"),Zt(this,"_lblMyScore"),Zt(this,"_lblEnemyScore"),Zt(this,"_lblMyRecord"),Zt(this,"_lblEnemyRecord"),Zt(this,"_lblAlly"),Zt(this,"_lblEnemy"),Zt(this,"_lblMeter"),Zt(this,"allyRows",[]),Zt(this,"enemyRows",[]),Zt(this,"_allyBarsG",new ip),Zt(this,"_enemyBarsG",new ip),Zt(this,"bg",new tG),Zt(this,"btnClose",new oB),this.bg.setIndex(6),this.addChild(this.bg),this.bg.width=640,this.bg.height=ES.stageHeight-640-454,this.bg.y=ES.safeHeight-640-this.bg.height,this._buildMatchHeader(),this._buildDamageHeaders(),this._buildAllRows(),this._buildDivider(),this.addChild(this._allyBarsG),this.addChild(this._enemyBarsG),this.btnClose.x=640-this.btnClose.width,this.btnClose.y=5-this.btnClose.height,this.btnClose.onClick=this.onClickGiveUp.bind(this),this.addChild(this.btnClose)}
- ),this.addChild(t); - const i=new jg({ - text:"⚔ PVP DAMAGE METER",style:x4t} - ); - i.x=(M4t-i.width)/2,i.y=108+(26-i.height)/2,this.addChild(i); + ),this.addChild(t),this._lblMeter=new dw({ + text:this._meterTitle(),style:i7t} + ),this._lblMeter.x=(j8t-this._lblMeter.width)/2,this._lblMeter.y=108+(26-this._lblMeter.height)/2,this.addChild(this._lblMeter);
+ `,this._lblMeter.text=this._meterTitle(),this._lblMeter.x=(j8t-this._lblMeter.width)/2} + _meterTitle(){ + return`⚔ ${ + RB.getText("GAME_1889","피해량 순위")}
Un 8 hunks, 9 statements
- =i,c=ost<<BigInt(8*o)-rst,l=s.create,u=(0,sst.Field)(i.n,i.nBitLength),d=i.uvRatio||((t,i)=>{ + =i,c=oet<<BigInt(8*o)-ret,l=s.create,u=(0,set.Field)(i.n,i.nBitLength),d=i.uvRatio||((t,i)=>{
- return(0,sst.mod)(t,e)} + return(0,set.mod)(t,e)}
- const ist=oit,sst=ait,est=cit,nst=cit,hst=BigInt(0),rst=BigInt(1),ost=BigInt(2),ast=BigInt(8),cst={ + const iet=ost,set=ast,eet=cst,net=cst,het=BigInt(0),ret=BigInt(1),oet=BigInt(2),aet=BigInt(8),cet={
- function pst(t,i){ + function get(t,i){
- const o=(0,dst.concatBytes)(i,pst(i.length,1)),a=pst(0,h),c=pst(s,2),l=new Array(r),u=e((0,dst.concatBytes)(a,t,c,pst(0,1),o)); - l[0]=e((0,dst.concatBytes)(u,pst(1,1),o)); + const o=(0,fet.concatBytes)(i,get(i.length,1)),a=get(0,h),c=get(s,2),l=new Array(r),u=e((0,fet.concatBytes)(a,t,c,get(0,1),o)); + l[0]=e((0,fet.concatBytes)(u,get(1,1),o));
- const t=[gst(u,l[d-1]),pst(d+1,1),o]; + const t=[wet(u,l[d-1]),get(d+1,1),o];
- ).update(t).update(pst(s,2)).update(i).update(pst(i.length,1)).digest()} + ).update(t).update(get(s,2)).update(i).update(get(i.length,1)).digest()}
- qt(pst,"jn"),qt(gst,"Un"),qt(mst,"Hn"),qt(wst,"Fn"),qt(vst,"zn"),qt(_st,"qn"); + Qt(get,"jn"),Qt(wet,"Un"),Qt(met,"Hn"),Qt(vet,"Fn"),Qt(_et,"zn"),Qt(Met,"qn");
TowerSubMenu 2 hunks, 9 statements
- this.lblTicket.x=t-this.lblTicket.width,this.lblTimer.x=t-this.lblTimer.width} + this.lblTicket.x=t-this.lblTicket.width,this.lblTimer.x=t-this.lblTimer.width,GB.isValidEvent(BB.TOWER_EVENT)?this.showEventTag():this.hideEventTag()}
+ showEventTag(t=0,i=0){ + this.eventTag||(this.eventTag=new Ye(kS.getTexture("UI_Ekkorr","UI_Event")),this.addChild(this.eventTag),this.btnEventGuide=new UU("UI_Ekkorr","UI_Alarm"),this.addChild(this.btnEventGuide),this.btnEventGuide.on("pointertap",()=>{ + w3t.getInstance().showGuide()} + )),this.eventTag.visible=!0,this.updateEventTag(t,i)} + hideEventTag(){ + this.eventTag&&(this.eventTag.visible=!1,this.btnEventGuide.visible=!1)} + updateEventTag(t,i){ + this.eventTag&&(this.eventTag.x=this.btnGuide.x+this.btnGuide.width+20+t,this.eventTag.y=this.btnGuide.y+.5*(this.btnGuide.height-this.eventTag.height)-1+i,this.btnEventGuide.x=this.eventTag.x+this.eventTag.width+5,this.btnEventGuide.y=this.btnGuide.y)}
GameLayer 4 hunks, 8 statements
- super(),Xt(this,"titleBackground",null),Xt(this,"dayNight",new yU),Xt(this,"realmTransition",new TU),Xt(this,"colorFilter",new of),t._instance=this,window.gameFx={ + super(),Zt(this,"titleBackground",null),Zt(this,"dayNight",new hF),Zt(this,"realmTransition",new _F),Zt(this,"highland",new bF),Zt(this,"colorFilter",new bf),t._instance=this,window.gameFx={
- ,this.addChild(DB.getInstance()),this.addChild($B.getInstance()),this.addChild(this.dayNight.overlayRoot),this.addChild(BB.getInstance()),this.addChild(VB.getInstance()),this.addChild(QB.getInstance()),this.addChild(this.dayNight.airRoot),this.addChild(FB.getInstance()),this.addChild(XB.getInstance()),this.addChild(bU.getInstance()),this.addChild(KB.getInstance()),this.addChild(this.realmTransition)} + ,this.addChild(mU.getInstance()),this.addChild(EU.getInstance()),this.addChild(this.dayNight.overlayRoot),this.addChild(this.highland.underRoot),this.addChild(pF.getInstance().underRoot),this.addChild(_U.getInstance()),this.addChild(SU.getInstance()),this.addChild(PU.getInstance()),this.addChild(this.dayNight.airRoot),this.addChild(this.highland.overRoot),this.addChild(pF.getInstance().overRoot),this.addChild(bU.getInstance()),this.addChild(RU.getInstance()),this.addChild(iF.getInstance()),this.addChild(CU.getInstance()),this.addChild(this.realmTransition)}
- setTimeOfDay(t,i=!1){ - const s=yU.phaseOf(t),e=PB(t); + setFixedPhase(t,i){ + this.dayNight.apply(t,i,!0)} + setTimeOfDay(t,i=!1,s=cU(t)){ + const e=hF.phaseOf(t);
- playRealmTransition(t){ - this.realmTransition.play(t)} + playRealmTransition(t,i,s=!1){ + return this.realmTransition.play(t,i,s)}
HealthBar 1 hunks, 8 statements
- const S0="CriticalEffect",T0="MissEffect",C0=class t{ - static setDay(i){ - t.isNight=(i-1)%10>=5} - } - ; - qt(C0,"TimeOfDayManager"),Xt(C0,"isNight",!0); - let I0=C0; - const O0=class extends He{ + const M1="CriticalEffect",b1="MissEffect",y1=class extends Ve{
PVPRankItemRenderer 4 hunks, 8 statements
- super(),Xt(this,"bg"),Xt(this,"lblRank",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_18)),Xt(this,"lblName",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblRecord",new SD("",11184810,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblPoint",new SD("",OL.COLOR_BRIGHT_ORANGE,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),this.bg=new kM({ + super(),Zt(this,"bg"),Zt(this,"rankBadge",new i0t(46)),Zt(this,"lblName",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblRecord",new QD("",11184810,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblPoint",new QD("",sD.COLOR_BRIGHT_ORANGE,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),this.bg=new eE({
- ),this.bg.width=610,this.bg.height=50,this.bg.x=5,this.addChild(this.bg),this.lblRank.x=50,this.lblRank.y=.5*(this.bg.height-this.lblRank.height),this.addChild(this.lblRank),this.lblName.x=112,this.lblName.y=.5*(this.bg.height-this.lblName.height),this.addChild(this.lblName),this.lblRecord.x=400,this.lblRecord.y=.5*(this.bg.height-this.lblRecord.height),this.addChild(this.lblRecord),this.lblPoint.x=this.bg.width-80,this.lblPoint.y=.5*(this.bg.height-this.lblPoint.height),this.addChild(this.lblPoint)} + ),this.bg.width=610,this.bg.height=50,this.bg.x=5,this.addChild(this.bg),this.rankBadge.x=30,this.rankBadge.y=.5*(this.bg.height-46),this.addChild(this.rankBadge),this.lblName.x=112,this.lblName.y=.5*(this.bg.height-this.lblName.height),this.addChild(this.lblName),this.lblRecord.x=400,this.lblRecord.y=.5*(this.bg.height-this.lblRecord.height),this.addChild(this.lblRecord),this.lblPoint.x=this.bg.width-80,this.lblPoint.y=.5*(this.bg.height-this.lblPoint.height),this.addChild(this.lblPoint)}
- this.data=t,this.lblRank.text=t.rank?`${ - t.rank} - `:"-",this.lblName.text=t.name,this.lblRecord.text=`${ + this.data=t,this.rankBadge.setRank(Number(t.rank)||0),this.lblName.text=t.name,this.lblRecord.text=`${
- `,this.lblRecord.x=427.5-.5*this.lblRecord.width,this.lblPoint.x=this.bg.width-47.5-.5*this.lblPoint.width,t.name===XD.name?(this.lblName.textColor=OL.COLOR_YELLOW,this.lblRank.textColor=OL.COLOR_YELLOW):(this.lblName.textColor=16777215,this.lblRank.textColor=16777215)} + `,this.lblRecord.x=427.5-.5*this.lblRecord.width,this.lblPoint.x=this.bg.width-47.5-.5*this.lblPoint.width; + const i=t.name===EG.name; + this.lblName.textColor=i?sD.COLOR_YELLOW:16777215}
BattleItemRenderer 3 hunks, 8 statements
- super(),Xt(this,"bg"),Xt(this,"lblTitle",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_18)),Xt(this,"lblDesc",new SD("",11184810,OL.DEFAULT_OUTLINE_FONT_OPTION_18)),Xt(this,"icon"),Xt(this,"lastTitle",""),Xt(this,"lastDesc",""),this.bg=new kM({ + super(),Zt(this,"bg"),Zt(this,"lblTitle",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_18)),Zt(this,"lblDesc",new QD("",11184810,sD.DEFAULT_OUTLINE_FONT_OPTION_18)),Zt(this,"icon"),Zt(this,"lastTitle",""),Zt(this,"lastDesc",""),Zt(this,"eventTag"),this.bg=new eE({
- `)} + `),this.data&&4===this.data.type&&GB.isValidEvent(BB.TOWER_EVENT)?this.showEventTag():this.hideEventTag()}
+ showEventTag(t=0,i=0){ + this.eventTag||(this.eventTag=new Ye(kS.getTexture("UI_Ekkorr","UI_Event")),this.addChild(this.eventTag)),this.eventTag.visible=!0,this.updateEventTag(t,i)} + hideEventTag(){ + this.eventTag&&(this.eventTag.visible=!1)} + updateEventTag(t,i){ + this.eventTag&&(this.eventTag.x=this.bg.x+this.bg.width-this.eventTag.width+t,this.eventTag.y=this.bg.y+i)}
GuildWarRankingItemRenderer 5 hunks, 8 statements
- super(),Xt(this,"bg"),Xt(this,"emblem"),Xt(this,"lblName"),Xt(this,"lblElo"),Xt(this,"lblRecord"),this.bg=new kM({ + super(),Zt(this,"bg"),Zt(this,"rankBadge",new i0t(t.BADGE_SIZE)),Zt(this,"emblem"),Zt(this,"lblName"),Zt(this,"lblElo"),Zt(this,"lblRecord"),this.bg=new eE({
- ),this.bg.width=t.ROW_W,this.bg.height=t.ROW_H,this.addChild(this.bg),this.emblem=new tii,this.emblem.scale.set(t.EMBLEM_SCALE),this.emblem.x=(t.EMBLEM_AREA_W-this.emblem.width)/2,this.emblem.y=(t.ROW_H-this.emblem.height)/2,this.addChild(this.emblem),this.lblName=new SD("",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_17),this.lblName.textColor=OL.DEFAULT_COLOR,this.addChild(this.lblName),this.lblElo=new SD("",16750899,OL.DEFAULT_OUTLINE_FONT_OPTION_17),this.lblElo.textColor=16750899,this.addChild(this.lblElo),this.lblRecord=new SD("",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_17),this.lblRecord.textColor=OL.DEFAULT_COLOR,this.addChild(this.lblRecord)} + ),this.bg.width=t.ROW_W,this.bg.height=t.ROW_H,this.addChild(this.bg); + const i=t.BADGE_SIZE; + this.rankBadge.x=6,this.rankBadge.y=(t.ROW_H-i)/2,this.addChild(this.rankBadge),this.emblem=new Vsi,this.emblem.scale.set(t.EMBLEM_SCALE),this.emblem.x=this.rankBadge.x+i+(t.EMBLEM_AREA_W-this.rankBadge.x-i-this.emblem.width)/2,this.emblem.y=(t.ROW_H-this.emblem.height)/2,this.addChild(this.emblem),this.lblName=new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_17),this.lblName.textColor=sD.DEFAULT_COLOR,this.addChild(this.lblName),this.lblElo=new QD("",16750899,sD.DEFAULT_OUTLINE_FONT_OPTION_17),this.lblElo.textColor=16750899,this.addChild(this.lblElo),this.lblRecord=new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_17),this.lblRecord.textColor=sD.DEFAULT_COLOR,this.addChild(this.lblRecord)}
- this.data=i,this.emblem.setData(i.guildEmblem||"101|0"); + this.data=i,this.emblem.setData(i.guildEmblem||"101|0"),this.rankBadge.setRank(i.rank);
- i.rank} - . ${
- qt(_ni,"GuildWarRankingItemRenderer"),Xt(_ni,"ROW_W",620),Xt(_ni,"ROW_H",80),Xt(_ni,"EMBLEM_AREA_W",130),Xt(_ni,"EMBLEM_SCALE",.7),Xt(_ni,"NAME_X",135),Xt(_ni,"ELO_X",435),Xt(_ni,"RECORD_X",535); + Qt(cri,"GuildWarRankingItemRenderer"),Zt(cri,"ROW_W",620),Zt(cri,"ROW_H",80),Zt(cri,"EMBLEM_AREA_W",130),Zt(cri,"EMBLEM_SCALE",.55),Zt(cri,"BADGE_SIZE",56),Zt(cri,"NAME_X",135),Zt(cri,"ELO_X",435),Zt(cri,"RECORD_X",535);
GameOverPopup 7 hunks, 8 statements
- super(),Xt(this,"lblMessage1",new SD("",OL.DEFAULT_COLOR,OL.DEFAULT_FONT_OPTION_18)),Xt(this,"lblMessage2",new SD("",OL.COLOR_GRAY,OL.DEFAULT_FONT_OPTION_16)),Xt(this,"lblMedalReward",new kU("UI_STAR_ICON","0",16750848,OL.DEFAULT_OUTLINE_FONT_OPTION_18)),Xt(this,"lblEventBonus",new SD("",4500223,OL.DEFAULT_OUTLINE_FONT_OPTION_18)),Xt(this,"rewardCardBg"),Xt(this,"lblTabCurrentArrow"),Xt(this,"lblTabCurrent",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_17)),Xt(this,"lblTabCenter",new SD("",8947848,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblTabReviveArrow"),Xt(this,"lblTabRevive",new SD("",8947848,OL.DEFAULT_OUTLINE_FONT_OPTION_17)),Xt(this,"lblStartWave",new SD("",13421772,OL.DEFAULT_FONT_OPTION_16)),Xt(this,"lblLastRevive",new SD("",10066329,OL.DEFAULT_FONT_OPTION_16)),Xt(this,"btnMedalBuffGuide",new nU("UI_Ekkorr","UI_Alarm",.85)),Xt(this,"btnRebirth",new MF("","","환생",.8,135,70)),Xt(this,"btnRebirthBonus",new MF("UI_GEM","500","환생 (훈장 x 2)",.8,240,70)),Xt(this,"btnContinue",new MF("Icon_Heart2","1","이어하기",.8,140,70)),Xt(this,"reviveTeamBanner"),Xt(this,"reviveTreasureBanner"),Xt(this,"revivePetBanner"),Xt(this,"bannerSeparator"),Xt(this,"useReviveTeam",!1),Xt(this,"hasReviveTeam",!1),Xt(this,"reviveTeamKindNums",[]),Xt(this,"reviveTeamTrans",[]),Xt(this,"currentWave",1),Xt(this,"baseMedalCache",0),Xt(this,"normalMedalCache",0),Xt(this,"reviveTeamMedalCache",0),Xt(this,"eventMultiCache",1),Xt(this,"currentBuffMultiplier",1),Xt(this,"reviveBuffMultiplier",1),Xt(this,"onContinue",null),Xt(this,"onRebirth",null),Xt(this,"onRebirthBonus",null),Xt(this,"requestPending",!1),Xt(this,"isGameOverMode",!1),Xt(this,"pendingGameOver",null),Xt(this,"gameOverWave",0),mS.getInstance().addEventListener("BattleSwitch",this.onBattleSwitchEvent.bind(this)),this.title=nB.getText("GAME_6","환생하기"),this.lblMessage1.y=85,this.lblMessage2.align="center",this.btnRebirth.showIconLabel=!1,this.btnRebirth.showTextLabel=!0,this.btnRebirth.text=nB.getText("GAME_5","환생"),this.btnRebirth.color=MF.GREEN,this.btnRebirthBonus.showIconLabel=!0,this.btnRebirthBonus.showTextLabel=!0,this.btnRebirthBonus.iconText="500",this.btnRebirthBonus.text=`${ + super(),Zt(this,"lblMessage1",new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_FONT_OPTION_18)),Zt(this,"lblMessage2",new QD("",sD.COLOR_GRAY,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"lblMedalReward",new SF("UI_STAR_ICON","0",16750848,sD.DEFAULT_OUTLINE_FONT_OPTION_18)),Zt(this,"lblEventBonus",new QD("",4500223,sD.DEFAULT_OUTLINE_FONT_OPTION_18)),Zt(this,"rewardCardBg"),Zt(this,"lblTabCurrentArrow"),Zt(this,"lblTabCurrent",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_17)),Zt(this,"lblTabCenter",new QD("",8947848,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblTabReviveArrow"),Zt(this,"lblTabRevive",new QD("",8947848,sD.DEFAULT_OUTLINE_FONT_OPTION_17)),Zt(this,"lblStartWave",new QD("",13421772,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"lblLastRevive",new QD("",10066329,sD.DEFAULT_FONT_OPTION_16)),Zt(this,"btnMedalBuffGuide",new UU("UI_Ekkorr","UI_Alarm",.85)),Zt(this,"btnRebirth",new m$("","","환생",.8,135,70)),Zt(this,"btnRebirthBonus",new m$("UI_GEM","500","환생 (훈장 x 2)",.8,240,70)),Zt(this,"btnContinue",new m$("Icon_Heart2","1","이어하기",.8,140,70)),Zt(this,"reviveTeamBanner"),Zt(this,"reviveTreasureBanner"),Zt(this,"revivePetBanner"),Zt(this,"bannerSeparator"),Zt(this,"useReviveTeam",!1),Zt(this,"hasReviveTeam",!1),Zt(this,"reviveTeamKindNums",[]),Zt(this,"reviveTeamTrans",[]),Zt(this,"currentWave",1),Zt(this,"baseMedalCache",0),Zt(this,"normalMedalCache",0),Zt(this,"reviveTeamMedalCache",0),Zt(this,"eventMultiCache",1),Zt(this,"currentBuffMultiplier",1),Zt(this,"reviveBuffMultiplier",1),Zt(this,"onContinue",null),Zt(this,"onRebirth",null),Zt(this,"onRebirthBonus",null),Zt(this,"requestPending",!1),Zt(this,"isGameOverMode",!1),Zt(this,"pendingGameOver",null),Zt(this,"gameOverWave",0),Zt(this,"gameOverShownAt",0),WS.getInstance().addEventListener("BattleSwitch",this.onBattleSwitchEvent.bind(this)),this.title=RB.getText("GAME_6","환생하기"),this.lblMessage1.y=85,this.lblMessage2.align="center",this.btnRebirth.showIconLabel=!1,this.btnRebirth.showTextLabel=!0,this.btnRebirth.text=RB.getText("GAME_5","환생"),this.btnRebirth.color=m$.GREEN,this.btnRebirthBonus.showIconLabel=!0,this.btnRebirthBonus.showTextLabel=!0,this.btnRebirthBonus.iconText="500",this.btnRebirthBonus.text=`${
+ get isInputGuarded(){ + return this.isGameOverMode&&!nXt.active&&performance.now()-this.gameOverShownAt<t.GAME_OVER_INPUT_GUARD_MS}
- return this.updateLayout(),IB.getInstance().stop(),ND.getInstance().stopUpdate(),this.btnClose.visible=!1,this.outSideClickHide=!1,super.show(),await this.loadAndUpdateReviveTeam(h,r),!0} + return this.updateLayout(),iU.getInstance().stop(),oG.getInstance().stopUpdate(),this.btnClose.visible=!1,this.outSideClickHide=!1,this.gameOverShownAt=performance.now(),super.show(),await this.loadAndUpdateReviveTeam(h,r),!0}
- if(this.requestPending)return; + if(this.isInputGuarded||this.requestPending)return;
- if(this.requestPending)return; + if(this.isInputGuarded||this.requestPending)return;
+ if(this.isInputGuarded)return;
- qt(gli,"GameOverPopup"),Xt(gli,"_instance"); + Qt(Wui,"GameOverPopup"),Zt(Wui,"_instance"),Zt(Wui,"GAME_OVER_INPUT_GUARD_MS",1e3);
MiniAscentRelicsPage 8 hunks, 8 statements
- const t=new of({ + const t=new bf({
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:e,lineHeight:e+5} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:e,lineHeight:e+5}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:18} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:18}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:20,lineHeight:22,fontWeight:"900",stroke:{ + ...sD.DEFAULT_FONT_OPTION_16,fontSize:20,lineHeight:22,fontWeight:"900",stroke:{
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:16,lineHeight:19,fontWeight:"900",stroke:{ + ...sD.DEFAULT_FONT_OPTION_16,fontSize:16,lineHeight:19,fontWeight:"900",stroke:{
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:17,lineHeight:20,fontWeight:"900",stroke:{ + ...sD.DEFAULT_FONT_OPTION_16,fontSize:17,lineHeight:20,fontWeight:"900",stroke:{
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:s,lineHeight:s+5} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:s,lineHeight:s+5}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:23} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:23}
MiniAscentCardPickPopup 8 hunks, 8 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:32,lineHeight:38} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:32,lineHeight:38}
- ...OL.DEFAULT_FONT_OPTION_15,fontSize:12,lineHeight:16} + ...sD.DEFAULT_FONT_OPTION_15,fontSize:12,lineHeight:16}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:18,lineHeight:24} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:18,lineHeight:24}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:28,lineHeight:34} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:28,lineHeight:34}
- ...OL.DEFAULT_FONT_OPTION_15,fontSize:13,lineHeight:18} + ...sD.DEFAULT_FONT_OPTION_15,fontSize:13,lineHeight:18}
- ...OL.DEFAULT_FONT_OPTION_15,fontSize:14} + ...sD.DEFAULT_FONT_OPTION_15,fontSize:14}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:20,lineHeight:22,fontWeight:"900",stroke:{ + ...sD.DEFAULT_FONT_OPTION_16,fontSize:20,lineHeight:22,fontWeight:"900",stroke:{
- ...OL.DEFAULT_FONT_OPTION_15,fontSize:12,lineHeight:16} + ...sD.DEFAULT_FONT_OPTION_15,fontSize:12,lineHeight:16}
RankingUserTeamPopup 5 hunks, 7 statements
- super(),Xt(this,"bgTop"),Xt(this,"lblUserName"),Xt(this,"teamContainer",new He),Xt(this,"teamIcons",[]),this.outSideClickHide=!0,this.width=580,this.height=310,this.title="",this.bgTop=new aU,this.bgTop.setIndex(2),this.bgTop.width=this.width-50,this.bgTop.height=40,this.bgTop.x=25,this.bgTop.y=70,this.contentContainer.addChild(this.bgTop),this.lblUserName=new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_18),this.lblUserName.textColor=16777215,this.lblUserName.x=45,this.lblUserName.y=this.bgTop.y+.5*(this.bgTop.height-24),this.contentContainer.addChild(this.lblUserName),this.teamContainer.x=45,this.teamContainer.y=this.bgTop.y+this.bgTop.height+20,this.contentContainer.addChild(this.teamContainer); + super(),Zt(this,"bgTop"),Zt(this,"lblUserName"),Zt(this,"teamContainer",new Ve),Zt(this,"teamIcons",[]),Zt(this,"lblHidden"),this.outSideClickHide=!0,this.width=580,this.height=310,this.title="",this.bgTop=new WU,this.bgTop.setIndex(2),this.bgTop.width=this.width-50,this.bgTop.height=40,this.bgTop.x=25,this.bgTop.y=70,this.contentContainer.addChild(this.bgTop),this.lblUserName=new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_18),this.lblUserName.textColor=16777215,this.lblUserName.x=45,this.lblUserName.y=this.bgTop.y+.5*(this.bgTop.height-24),this.contentContainer.addChild(this.lblUserName),this.teamContainer.x=45,this.teamContainer.y=this.bgTop.y+this.bgTop.height+20,this.contentContainer.addChild(this.teamContainer);
- } + this.lblHidden=new QD("",14988422),this.lblHidden.textSize=18,this.lblHidden.align="center",this.lblHidden.setWrapWidth(this.width-100),this.lblHidden.visible=!1,this.contentContainer.addChild(this.lblHidden)}
- if(!i||!0!==i.success||!i.body)return void YG.getInstance().show((null==i?void 0:i.error)||"팀 정보를 불러오지 못했습니다."); + if(!i||!0!==i.success||!i.body)return void bB.getInstance().show(RB.getText("RANKING_TEAM_LOAD_FAILED","팀 정보를 불러오지 못했습니다."));
- YG.getInstance().show("팀 정보를 불러오지 못했습니다.")} + bB.getInstance().show(RB.getText("RANKING_TEAM_LOAD_FAILED","팀 정보를 불러오지 못했습니다."))}
- const n=Array.isArray(null==t?void 0:t.team)?t.team:[]; + const n=!0===(null==t?void 0:t.hidden); + this.teamContainer.visible=!n,this.lblHidden.visible=n,this.lblHidden.text=RB.getText("RANKING_TEAM_HIDDEN","팀 편성을 비공개로 설정한 유저입니다."),this.lblHidden.x=.5*(this.width-this.lblHidden.width),this.lblHidden.y=this.teamContainer.y+.5*(130-this.lblHidden.height); + const h=!n&&Array.isArray(null==t?void 0:t.team)?t.team:[];
GuideBubble 2 hunks, 6 statements
- const GKt={ + const Gzt=Object.freeze(Object.defineProperty({ + __proto__:null,SecretaryGuidePopup:Dzt} + ,Symbol.toStringTag,{ + value:"Module"} + )),Bzt={
- ...OL.DEFAULT_FONT_OPTION_18,fontSize:15,lineHeight:20} + ...sD.DEFAULT_FONT_OPTION_18,fontSize:15,lineHeight:20}
GuildWarMainView 6 hunks, 6 statements
- super(),Xt(this,"topCardBg"),Xt(this,"topEmblem"),Xt(this,"lblGuildLv"),Xt(this,"bgGuildName"),Xt(this,"lblGuildName"),Xt(this,"iconMedal"),Xt(this,"lblRankLine"),Xt(this,"lblRank"),Xt(this,"iconMembers"),Xt(this,"lblMembers"),Xt(this,"lblScoreHeader"),Xt(this,"lblScore"),Xt(this,"btnDetails"),Xt(this,"lblActiveSection"),Xt(this,"lblActiveCount"),Xt(this,"lblActiveEmpty"),Xt(this,"activeRows",[]),Xt(this,"lblHistorySection"),Xt(this,"lblHistoryEmpty"),Xt(this,"historyList"),Xt(this,"myGuildId",""),Xt(this,"frameCnt",0),this.topCardBg=new aU,this.topCardBg.setIndex(2),this.topCardBg.width=t.TOP_CARD_W,this.topCardBg.height=t.TOP_CARD_H,this.topCardBg.x=10,this.topCardBg.y=0,this.container.addChild(this.topCardBg),this.topEmblem=new tii,this.topEmblem.scale.set(1.2),this.topEmblem.x=20,this.topEmblem.y=8,this.container.addChild(this.topEmblem),this.lblGuildLv=new SD("Lv.1",14531464,OL.DEFAULT_OUTLINE_FONT_OPTION_16),this.lblGuildLv.y=this.topEmblem.y+this.topEmblem.height-6,this.lblGuildLv.x=this.topEmblem.x+(this.topEmblem.width-this.lblGuildLv.width)/2,this.container.addChild(this.lblGuildLv),this.bgGuildName=(new Ff).roundRect(115,14,340,30,15).fill({ + super(),Zt(this,"topCardBg"),Zt(this,"topEmblem"),Zt(this,"lblGuildLv"),Zt(this,"bgGuildName"),Zt(this,"lblGuildName"),Zt(this,"rankBadge",new i0t(52)),Zt(this,"lblRankLine"),Zt(this,"lblRank"),Zt(this,"iconMembers"),Zt(this,"lblMembers"),Zt(this,"lblScoreHeader"),Zt(this,"lblScore"),Zt(this,"btnDetails"),Zt(this,"lblActiveSection"),Zt(this,"lblActiveCount"),Zt(this,"lblActiveEmpty"),Zt(this,"activeRows",[]),Zt(this,"lblHistorySection"),Zt(this,"lblHistoryEmpty"),Zt(this,"historyList"),Zt(this,"myGuildId",""),Zt(this,"frameCnt",0),this.topCardBg=new WU,this.topCardBg.setIndex(2),this.topCardBg.width=t.TOP_CARD_W,this.topCardBg.height=t.TOP_CARD_H,this.topCardBg.x=10,this.topCardBg.y=0,this.container.addChild(this.topCardBg),this.topEmblem=new Vsi,this.topEmblem.scale.set(1.2),this.topEmblem.x=20,this.topEmblem.y=8,this.container.addChild(this.topEmblem),this.lblGuildLv=new QD("Lv.1",14531464,sD.DEFAULT_OUTLINE_FONT_OPTION_16),this.lblGuildLv.y=this.topEmblem.y+this.topEmblem.height-6,this.lblGuildLv.x=this.topEmblem.x+(this.topEmblem.width-this.lblGuildLv.width)/2,this.container.addChild(this.lblGuildLv),this.bgGuildName=(new ip).roundRect(115,14,340,30,15).fill({
- ),this.container.addChild(this.bgGuildName),this.lblGuildName=new SD("길드",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_20),this.lblGuildName.x=133,this.lblGuildName.y=14+(30-this.lblGuildName.height)/2,this.container.addChild(this.lblGuildName),this.iconMedal=new je(eS.getTexture("UI_Ekkorr","Icon_medal_1st")),this.iconMedal.x=130,this.iconMedal.y=48,this.container.addChild(this.iconMedal),this.lblRankLine=new SD(`${ + ),this.container.addChild(this.bgGuildName),this.lblGuildName=new QD("길드",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_20),this.lblGuildName.x=133,this.lblGuildName.y=14+(30-this.lblGuildName.height)/2,this.container.addChild(this.lblGuildName),this.rankBadge.x=130,this.rankBadge.y=48,this.rankBadge.setRank(0),this.container.addChild(this.rankBadge),this.lblRankLine=new QD(`${
- ( - )`,16764006,OL.DEFAULT_OUTLINE_FONT_OPTION_18),this.lblRankLine.x=this.iconMedal.x+this.iconMedal.width+4,this.lblRankLine.y=this.iconMedal.y+2,this.container.addChild(this.lblRankLine),this.lblRank=new SD("-",16763904,OL.ORANGE_OUTLINE_FONT_OPTION_28),this.lblRank.x=this.iconMedal.x+this.iconMedal.width+35,this.lblRank.y=this.iconMedal.y+this.iconMedal.height-26,this.container.addChild(this.lblRank),this.iconMembers=new je(eS.getTexture("UI_Guild","Icon_Guild_CrewNum")),this.lblMembers=new SD("0 / 0",15658734,OL.DEFAULT_OUTLINE_FONT_OPTION_18),this.container.addChild(this.iconMembers),this.container.addChild(this.lblMembers),this.lblScoreHeader=new SD(nB.getText("GAME_1024","점수"),14531464,OL.DEFAULT_OUTLINE_FONT_OPTION_18),this.lblScoreHeader.y=50,this.container.addChild(this.lblScoreHeader),this.lblScore=new SD("-",14548838,OL.ORANGE_OUTLINE_FONT_OPTION_28),this.lblScore.y=this.lblRank.y,this.container.addChild(this.lblScore),this.layoutRightSide(),this.btnDetails=new IG(nB.getText("GAME_1037","상세")),this.btnDetails.color=IG.BROWN,this.btnDetails.width=80,this.btnDetails.height=30,this.btnDetails.x=t.TOP_CARD_W+10-this.btnDetails.width-12,this.btnDetails.y=t.TOP_CARD_H-this.btnDetails.height-12,this.btnDetails.onClick=()=>this.onDetailsClick(),this.btnDetails.visible=!1,this.container.addChild(this.btnDetails); + ( - )`,16764006,sD.DEFAULT_OUTLINE_FONT_OPTION_18),this.lblRankLine.x=this.rankBadge.x+52+6,this.lblRankLine.y=this.rankBadge.y+(52-this.lblRankLine.height)/2,this.container.addChild(this.lblRankLine),this.lblRank=new QD("-",16763904,sD.ORANGE_OUTLINE_FONT_OPTION_28),this.lblRank.x=this.rankBadge.x+52+35,this.lblRank.y=73,this.lblRank.visible=!1,this.container.addChild(this.lblRank),this.iconMembers=new Ye(kS.getTexture("UI_Guild","Icon_Guild_CrewNum")),this.lblMembers=new QD("0 / 0",15658734,sD.DEFAULT_OUTLINE_FONT_OPTION_18),this.container.addChild(this.iconMembers),this.container.addChild(this.lblMembers),this.lblScoreHeader=new QD(RB.getText("GAME_1024","점수"),14531464,sD.DEFAULT_OUTLINE_FONT_OPTION_18),this.lblScoreHeader.y=50,this.container.addChild(this.lblScoreHeader),this.lblScore=new QD("-",14548838,sD.ORANGE_OUTLINE_FONT_OPTION_28),this.lblScore.y=this.lblRank.y,this.container.addChild(this.lblScore),this.layoutRightSide(),this.btnDetails=new iB(RB.getText("GAME_1037","상세")),this.btnDetails.color=iB.BROWN,this.btnDetails.width=80,this.btnDetails.height=30,this.btnDetails.x=t.TOP_CARD_W+10-this.btnDetails.width-12,this.btnDetails.y=t.TOP_CARD_H-this.btnDetails.height-12,this.btnDetails.onClick=()=>this.onDetailsClick(),this.btnDetails.visible=!1,this.container.addChild(this.btnDetails);
- ( - )`,this.lblRank.text="-",this.lblScore.text="-",this.layoutRightSide()} + ( - )`,this.lblRank.text="-",this.rankBadge.setRank(0),this.lblScore.text="-",this.layoutRightSide()}
- `:"-"; + `:"-",this.rankBadge.setRank(Number((null==t?void 0:t.myRank)??0));
- `,this.lblRank.text="",this.lblScore.text="",this.lblScoreHeader.visible=!1,this.lblActiveSection.text=`[ ${ + `,this.lblRank.text="",this.rankBadge.setRank(Number(t.rank??0)),this.lblScore.text="",this.lblScoreHeader.visible=!1,this.lblActiveSection.text=`[ ${
GuildWarBattlePopupV3 6 hunks, 6 statements
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:13} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:13}
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:13} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:13}
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:13} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:13}
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:9} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:9}
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:11} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:11}
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:9} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:9}
GpuGraphicsContext 3 hunks, 5 statements
- ...Xc,extension:{ - ...Xc.extension,name:"ellipse"} + ...Zc,extension:{ + ...Zc.extension,name:"ellipse"}
- ...Xc,extension:{ - ...Xc.extension,name:"roundedRectangle"} + ...Zc,extension:{ + ...Zc.extension,name:"roundedRectangle"}
- ..."radial"===i.type?b.defaultRadialOptions:b.defaultLinearOptions,...zi(i)} + ..."radial"===i.type?M.defaultRadialOptions:M.defaultLinearOptions,...Xi(i)}
BatchableSprite 5 hunks, 5 statements
- ...k.defaultTextStyle,...t} + ...R.defaultTextStyle,...t}
- ...k.defaultDropShadow,...t} + ...R.defaultDropShadow,...t}
- ...k.defaultDropShadow} + ...R.defaultDropShadow}
- ...Nu.defaultFillStyle,...t} + ...Gu.defaultFillStyle,...t}
- ...Nu.defaultStrokeStyle,...t} + ...Gu.defaultStrokeStyle,...t}
ListOld 1 hunks, 5 statements
- const b6=class extends He{ + const _4=Object.freeze(Object.defineProperty({ + __proto__:null,ToolTip:v4} + ,Symbol.toStringTag,{ + value:"Module"} + )),M4=class extends Ve{
HeroSubMenu 1 hunks, 5 statements
- const dJt=class t extends HYt{ + const aQt=Object.freeze(Object.defineProperty({ + __proto__:null,HeroHireSubView:oQt} + ,Symbol.toStringTag,{ + value:"Module"} + )),cQt=class t extends Pqt{
HeroView 1 hunks, 5 statements
- const mJt=class t extends GYt{ + const fQt=Object.freeze(Object.defineProperty({ + __proto__:null,HeroSubView:dQt} + ,Symbol.toStringTag,{ + value:"Module"} + )),pQt=class t extends Iqt{
HeroBookItemRenderer 1 hunks, 5 statements
- const vJt=class extends iR{ + const wQt=Object.freeze(Object.defineProperty({ + __proto__:null,HeroView:gQt} + ,Symbol.toStringTag,{ + value:"Module"} + )),mQt=class extends OR{
TreasureInventorySubMenu 1 hunks, 5 statements
- const FQt=class t extends HYt{ + const UZt=Object.freeze(Object.defineProperty({ + __proto__:null,TreasureView:BZt} + ,Symbol.toStringTag,{ + value:"Module"} + )),FZt=class t extends Pqt{
DailyRankingItemRenderer 3 hunks, 5 statements
- super(),Xt(this,"bg"),Xt(this,"lblRank",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_18)),Xt(this,"lblName",new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),Xt(this,"lblScore",new SD("",OL.COLOR_BRIGHT_ORANGE,OL.DEFAULT_OUTLINE_FONT_OPTION_16)),this.bg=new kM({ + super(),Zt(this,"bg"),Zt(this,"rankBadge",new i0t(46)),Zt(this,"lblName",new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),Zt(this,"lblScore",new QD("",sD.COLOR_BRIGHT_ORANGE,sD.DEFAULT_OUTLINE_FONT_OPTION_16)),this.bg=new eE({
- ),this.bg.width=610,this.bg.height=50,this.bg.x=5,this.addChild(this.bg),this.lblRank.x=45,this.lblRank.y=.5*(this.bg.height-this.lblRank.height),this.addChild(this.lblRank),this.lblName.x=115,this.lblName.y=.5*(this.bg.height-this.lblName.height),this.addChild(this.lblName),this.lblScore.x=this.bg.width-100,this.lblScore.y=.5*(this.bg.height-this.lblScore.height),this.addChild(this.lblScore)} + ),this.bg.width=610,this.bg.height=50,this.bg.x=5,this.addChild(this.bg),this.rankBadge.x=27,this.rankBadge.y=.5*(this.bg.height-46),this.addChild(this.rankBadge),this.lblName.x=115,this.lblName.y=.5*(this.bg.height-this.lblName.height),this.addChild(this.lblName),this.lblScore.x=this.bg.width-100,this.lblScore.y=.5*(this.bg.height-this.lblScore.height),this.addChild(this.lblScore)}
- this.data=t,this.lblRank.text=`${ - t.rank} - `,this.lblName.text=t.name,this.lblScore.text=t.score.toLocaleString(),t.name===XD.name?(this.lblName.textColor=OL.COLOR_YELLOW,this.lblRank.textColor=OL.COLOR_YELLOW):(this.lblName.textColor=16777215,this.lblRank.textColor=16777215)} + this.data=t,this.rankBadge.setRank(Number(t.rank)),this.lblName.text=t.name,this.lblScore.text=t.score.toLocaleString(); + const i=t.name===EG.name; + this.lblName.textColor=i?sD.COLOR_YELLOW:16777215}
DialogueLayer 1 hunks, 5 statements
- const Zoi=class extends pS{ + const Aci=Object.freeze(Object.defineProperty({ + __proto__:null,RightMenu:Eci} + ,Symbol.toStringTag,{ + value:"Module"} + )),Sci=class extends $S{
CastleSubMenu 1 hunks, 5 statements
- const vci=class t extends HYt{ + const Vli=Object.freeze(Object.defineProperty({ + __proto__:null,CitadelSubView:Wli} + ,Symbol.toStringTag,{ + value:"Module"} + )),jli=class t extends Pqt{
QuestProgress 1 hunks, 5 statements
- const Sci=class extends He{ + const Qli=Object.freeze(Object.defineProperty({ + __proto__:null,CastleView:Jli} + ,Symbol.toStringTag,{ + value:"Module"} + )),Zli=class extends Ve{
Circle 4 hunks, 4 statements
- ,test:qt(()=>Promise.resolve(!0),"test"),add:qt(async t=>[...t,...ko],"add"),remove:qt(async t=>t.filter(t=>!ko.includes(t)),"remove")} + ,test:Qt(()=>Promise.resolve(!0),"test"),add:Qt(async t=>[...t,...Po],"add"),remove:Qt(async t=>t.filter(t=>!Po.includes(t)),"remove")}
- ...m.defaultOptions} + ...w.defaultOptions}
- ...m.defaultOptions,...this.loadOptions,onProgress:i} + ...w.defaultOptions,...this.loadOptions,onProgress:i}
- ...m.defaultOptions,...this.loadOptions,...i||{ + ...w.defaultOptions,...this.loadOptions,...i||{
WorkerManagerClass 4 hunks, 4 statements
- ...M.defaultFillStyle} + ...y.defaultFillStyle}
- ...M.defaultStrokeStyle} + ...y.defaultStrokeStyle}
- parseAsGraphicsContext:m,...w} + parseAsGraphicsContext:w,...m}
- resource:p,alphaMode:"premultiply-alpha-on-upload",resolution:u,...w} + resource:p,alphaMode:"premultiply-alpha-on-upload",resolution:u,...m}
FilterData 2 hunks, 4 statements
+ function Of(t,i,s,e,n,h,r,o){ + const a=r-s,c=o-e,l=n-s,u=h-e,d=t-s,f=i-e,p=a*a+c*c,g=a*l+c*u,w=a*d+c*f,m=l*l+u*u,v=l*d+u*f,_=1/(p*m-g*g),M=(m*w-g*v)*_,b=(p*v-g*w)*_; + return M>=0&&b>=0&&M+b<1}
- ; + ,Qt(Of,"pointInTriangle");
HeroService 1 hunks, 4 statements
+ async buyMassiveHeroes(t=!1,i=!1){ + return this.post(LP.HERO.BUY_MASSIVE_HEROES,{ + useTicket:t} + ,i)}
IconOnlyButton 2 hunks, 4 statements
- showRedDot(){ - this.redDot||(this.redDot=new TG,this.redDot.scale.set(this.iconScale),this.addChild(this.redDot)),this.redDot.show(),this.updateRedDot()} + showRedDot(t=0,i=0){ + this.redDot||(this.redDot=new ZG,this.redDot.scale.set(this.iconScale),this.addChild(this.redDot)),this.redDot.show(),this.updateRedDot(t,i)}
- updateRedDot(){ - this.redDot&&(this.redDot.x=this.bg.x+.5*this.bg.width-this.redDot.width-5,this.redDot.y=-2)} + updateRedDot(t=0,i=0){ + this.redDot&&(this.redDot.x=this.bg.x+.5*this.bg.width-this.redDot.width-5+t,this.redDot.y=-2+i)}
GuildRaidMemberDailyItemRenderer 4 hunks, 4 statements
- super(),Xt(this,"bg"),Xt(this,"lblRank"),Xt(this,"lblName"),Xt(this,"lblRaidTitle"),Xt(this,"lblRaidCount"),Xt(this,"lblWarTitle"),Xt(this,"lblWarCount"),this.bg=new kM({ + super(),Zt(this,"bg"),Zt(this,"rankBadge",new i0t(44)),Zt(this,"lblName"),Zt(this,"lblRaidTitle"),Zt(this,"lblRaidCount"),Zt(this,"lblWarTitle"),Zt(this,"lblWarCount"),this.bg=new eE({
- ),this.bg.width=630,this.bg.height=48,this.addChild(this.bg),this.lblRank=new SD("",11768152,OL.DEFAULT_OUTLINE_FONT_OPTION_18),this.addChild(this.lblRank),this.lblName=new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_17),this.lblName.x=145,this.addChild(this.lblName),this.lblRaidTitle=new SD(nB.getText("GAME_630","길드레이드"),10129539,OL.DEFAULT_OUTLINE_FONT_OPTION_16),this.lblRaidTitle.textSize=13,this.addChild(this.lblRaidTitle),this.lblRaidCount=new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_17),this.addChild(this.lblRaidCount),this.lblWarTitle=new SD(nB.getText("GAME_502","길드전"),10129539,OL.DEFAULT_OUTLINE_FONT_OPTION_16),this.lblWarTitle.textSize=13,this.addChild(this.lblWarTitle),this.lblWarCount=new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_17),this.addChild(this.lblWarCount)} + ),this.bg.width=630,this.bg.height=48,this.addChild(this.bg),this.rankBadge.x=45.5,this.rankBadge.y=.5*(this.bg.height-44),this.addChild(this.rankBadge),this.lblName=new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_17),this.lblName.x=145,this.addChild(this.lblName),this.lblRaidTitle=new QD(RB.getText("GAME_630","길드레이드"),10129539,sD.DEFAULT_OUTLINE_FONT_OPTION_16),this.lblRaidTitle.textSize=13,this.addChild(this.lblRaidTitle),this.lblRaidCount=new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_17),this.addChild(this.lblRaidCount),this.lblWarTitle=new QD(RB.getText("GAME_502","길드전"),10129539,sD.DEFAULT_OUTLINE_FONT_OPTION_16),this.lblWarTitle.textSize=13,this.addChild(this.lblWarTitle),this.lblWarCount=new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_17),this.addChild(this.lblWarCount)}
- this.data=t,this.lblRank.text=t.isNoShow?"-":String(t.rank),this.lblRank.textColor=!t.isNoShow&&t.rank<=3?16765033:11768152,this.lblRank.x=.5*(135-this.lblRank.width),this.lblRank.y=.5*(this.bg.height-this.lblRank.height),this.lblName.text=t.name,this.lblName.y=.5*(this.bg.height-this.lblName.height); + this.data=t,this.rankBadge.setRank(t.isNoShow?0:t.rank),this.lblName.text=t.name,this.lblName.y=.5*(this.bg.height-this.lblName.height);
- this.bg.alpha=t.isNoShow?.55:1,this.lblRank.alpha=s,this.lblName.alpha=s,this.lblRaidTitle.alpha=s,this.lblRaidCount.alpha=s,this.lblWarTitle.alpha=s,this.lblWarCount.alpha=s} + this.bg.alpha=t.isNoShow?.55:1,this.rankBadge.alpha=s,this.lblName.alpha=s,this.lblRaidTitle.alpha=s,this.lblRaidCount.alpha=s,this.lblWarTitle.alpha=s,this.lblWarCount.alpha=s}
GuildRaidRecordUserItemRenderer 4 hunks, 4 statements
- super(),Xt(this,"bg"),Xt(this,"lblRank"),Xt(this,"lblName"),Xt(this,"lblDamage"),Xt(this,"detailIcons",[]),Xt(this,"detailLabels",[]),this.bg=new kM({ + super(),Zt(this,"bg"),Zt(this,"rankBadge",new i0t(56)),Zt(this,"lblName"),Zt(this,"lblDamage"),Zt(this,"detailIcons",[]),Zt(this,"detailLabels",[]),this.bg=new eE({
- ),this.bg.width=630,this.bg.height=72,this.addChild(this.bg),this.lblRank=new SD("",11768152,OL.DEFAULT_OUTLINE_FONT_OPTION_18),this.lblRank.y=12,this.addChild(this.lblRank),this.lblName=new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_17),this.lblName.x=145,this.lblName.y=10,this.addChild(this.lblName),this.lblDamage=new SD("",16777215,OL.DEFAULT_OUTLINE_FONT_OPTION_18),this.lblDamage.y=10,this.addChild(this.lblDamage); + ),this.bg.width=630,this.bg.height=72,this.addChild(this.bg),this.rankBadge.x=39.5,this.rankBadge.y=.5*(this.bg.height-56),this.addChild(this.rankBadge),this.lblName=new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_17),this.lblName.x=145,this.lblName.y=10,this.addChild(this.lblName),this.lblDamage=new QD("",16777215,sD.DEFAULT_OUTLINE_FONT_OPTION_18),this.lblDamage.y=10,this.addChild(this.lblDamage);
- this.data=t,this.lblRank.text=t.isNoShow?"-":String(t.rank),this.lblRank.textColor=!t.isNoShow&&t.rank<=3?16765033:11768152,this.lblRank.x=.5*(135-this.lblRank.width),this.lblRank.y=.5*(this.bg.height-this.lblRank.height),this.lblName.text=t.name,this.lblDamage.text=t.damageText,this.lblDamage.x=this.bg.width-16-this.lblDamage.width; + this.data=t,this.rankBadge.setRank(t.isNoShow?0:t.rank),this.lblName.text=t.name,this.lblDamage.text=t.damageText,this.lblDamage.x=this.bg.width-16-this.lblDamage.width;
- this.bg.alpha=t.isNoShow?.55:1,this.lblRank.alpha=i,this.lblName.alpha=i,this.lblDamage.alpha=i} + this.bg.alpha=t.isNoShow?.55:1,this.rankBadge.alpha=i,this.lblName.alpha=i,this.lblDamage.alpha=i}
Archery2GameScene 4 hunks, 4 statements
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fill:16777215} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fill:16777215}
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_20,fill:16766720} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_20,fill:16766720}
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fill:16737792} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fill:16737792}
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_20,fill:16777215} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_20,fill:16777215}
MiniAscentResultPopup 4 hunks, 4 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:24,lineHeight:30} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:24,lineHeight:30}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:24,lineHeight:30} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:24,lineHeight:30}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:32,lineHeight:38} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:32,lineHeight:38}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:30,lineHeight:36} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:30,lineHeight:36}
MiniAscentLobbyPopup 4 hunks, 4 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:24,lineHeight:32} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:24,lineHeight:32}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:18,lineHeight:24} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:18,lineHeight:24}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:42,lineHeight:50} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:42,lineHeight:50}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:18,lineHeight:24} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:18,lineHeight:24}
PassRewardManager 1 hunks, 3 statements
- fontFamily:"Arial",fill:IL.COLOR_WHITE,stroke:{ - color:"#222222",width:6,join:"round"} - ,fontSize:21,fontWeight:"bolder"} + fontFamily:"Arial",fill:14008992,stroke:{ + color:"#382b1c",width:1.5,join:"round"} + ,fontSize:20,fontWeight:"bold"}
NiceSliceBtnBgs 1 hunks, 3 statements
- assets/ekkorr/sounds/effect/StoneBreak.mp3`),Xt(EG,"SFX_INTRO",`${ + assets/ekkorr/sounds/effect/StoneBreak.mp3`),Zt(YG,"SFX_WOOD_MALLET",`${ + CS.getBase()} + assets/sounds/fishing/wood_mallet.mp3`),Zt(YG,"SFX_INTRO",`${
EventVO 3 hunks, 3 statements
- ),Xt(cB,"currentHeroResetEvent"),Xt(cB,"currentMedalEvent"),Xt(cB,"currentPaymentSpecialEvent"),Xt(cB,"currentPaymentMonthEvent"),Xt(cB,"currentMineEvent"),Xt(cB,"requestPending",!1); + ),Zt(DB,"miniAscentShop",null),Zt(DB,"currentHeroResetEvent"),Zt(DB,"currentMedalEvent"),Zt(DB,"currentPaymentSpecialEvent"),Zt(DB,"currentPaymentMonthEvent"),Zt(DB,"currentMineEvent"),Zt(DB,"currentTowerEvent"),Zt(DB,"requestPending",!1),Zt(DB,"eventScheduled",[]);
- var uB=(t=>(t[t.LOGIN_EVENT=0]="LOGIN_EVENT",t[t.HERO_RESET_EVENT=1]="HERO_RESET_EVENT",t[t.MEDAL_EVENT=2]="MEDAL_EVENT",t[t.PAYMENT_EVENT=3]="PAYMENT_EVENT",t[t.MINE_EVENT=4]="MINE_EVENT",t[t.MINI_ASCENT_EVENT=5]="MINI_ASCENT_EVENT",t))(uB||{ + var BB=(t=>(t[t.LOGIN_EVENT=0]="LOGIN_EVENT",t[t.HERO_RESET_EVENT=1]="HERO_RESET_EVENT",t[t.MEDAL_EVENT=2]="MEDAL_EVENT",t[t.PAYMENT_EVENT=3]="PAYMENT_EVENT",t[t.MINE_EVENT=4]="MINE_EVENT",t[t.MINI_ASCENT_EVENT=5]="MINI_ASCENT_EVENT",t[t.ATTEND_EVENT=6]="ATTEND_EVENT",t[t.TOWER_EVENT=7]="TOWER_EVENT",t))(BB||{
- Xt(this,"type",-1),Xt(this,"id",0),Xt(this,"startTime",""),Xt(this,"endTime",""),Xt(this,"day",""),Xt(this,"divide",1),Xt(this,"startHour",0),Xt(this,"endHour",0),Xt(this,"max",0),Xt(this,"multi",0),Xt(this,"userCount",0),Xt(this,"rewards",[]),Xt(this,"date",0),Xt(this,"amounts",[]),Xt(this,"rewardType",""),Xt(this,"userAmount",0),Xt(this,"subType",""),Xt(this,"seasonId",0),Xt(this,"petKindNums",[]),Xt(this,"priestessKindNums",[])} + Zt(this,"type",-1),Zt(this,"id",0),Zt(this,"startTime",""),Zt(this,"endTime",""),Zt(this,"day",""),Zt(this,"divide",1),Zt(this,"startHour",0),Zt(this,"endHour",0),Zt(this,"max",0),Zt(this,"multi",0),Zt(this,"userCount",0),Zt(this,"rewards",[]),Zt(this,"date",0),Zt(this,"amounts",[]),Zt(this,"rewardType",""),Zt(this,"userAmount",0),Zt(this,"subType",""),Zt(this,"seasonId",0),Zt(this,"petKindNums",[]),Zt(this,"priestessKindNums",[]),Zt(this,"message",""),Zt(this,"image",""),Zt(this,"attendCount",0),Zt(this,"attendedToday",!1),Zt(this,"completed",!1),Zt(this,"claimedFloor",0),Zt(this,"floors",[])}
ActiveSkillMain 3 hunks, 3 statements
- t.x=63*i,this.list.push(t),this.addChild(t),t.durationFrames=60*(30+15*i),t.id=i,t.onClick=()=>{ + t.x=60*i,this.list.push(t),this.addChild(t),t.durationFrames=60*(30+15*i),t.id=i,t.onClick=()=>{
- -1===n?(r.visible=!1,r.enabled=!1):(r.visible=!0,r.enabled=!0,r.setSkillIcon(n),r.durationFrames=60*Math.max(30,Math.floor((30+15*h)*(1-.01*t))),s=r.x+68,e++)} + -1===n?(r.visible=!1,r.enabled=!1):(r.visible=!0,r.enabled=!0,r.setSkillIcon(n),r.durationFrames=60*Math.max(30,Math.floor((30+15*h)*(1-.01*t))),s=r.x+60,e++)}
- e<this.skillMaxNum?(this.btnAdd.visible=!0,this.btnAdd.x=n+.5*this.btnAdd.width,this.btnAdd.y=.5*this.btnAdd.height,n+=this.btnAdd.width+5):this.btnAdd.visible=!1,this.btnChange.visible=e>0,this.btnChange.x=n+.5*this.btnChange.width,this.btnChange.y=.5*this.btnChange.height+2,n+=this.btnChange.width,this.x=.5*(640-n),this.refreshAutoToggle()} + e<this.skillMaxNum?(this.btnAdd.visible=!0,this.btnAdd.x=n+.5*this.btnAdd.width,this.btnAdd.y=.5*this.btnAdd.height,n+=this.btnAdd.width+5):this.btnAdd.visible=!1,this.btnChange.visible=e>0,this.btnChange.x=n+.5*this.btnChange.width,this.btnChange.y=.5*this.btnChange.height+2,n+=this.btnChange.width,this.x=.5*(640-n)-10,this.refreshAutoToggle()}
Client 3 hunks, 3 statements
- ,parseAs:m="json",querySerializer:w,bodySerializer:v=h??t4,body:_,...b} + ,parseAs:w="json",querySerializer:m,bodySerializer:v=h??t8,body:_,...M}
- ,...w} + ,...m}
- redirect:"follow",...a,...b,body:A,headers:y} + redirect:"follow",...a,...M,body:E,headers:A}
Or 3 hunks, 3 statements
- ,set={ + ,nnt={
- Object.defineProperty(set,"__esModule",{ + Object.defineProperty(nnt,"__esModule",{
- ),set.polyval=set.ghash=void 0,set._toGHASHKey=cet; + ),nnt.polyval=nnt.ghash=void 0,nnt._toGHASHKey=unt;
SHA256 3 hunks, 3 statements
- ...Xgt,...Qgt,...tmt,...smt,...hmt,...gmt,...vmt,...Emt,...Tmt} + ...Xwt,...Qwt,...tmt,...smt,...hmt,...gmt,...vmt,...bmt,...Tmt}
- ...cwt,...uwt} + ...cvt,...uvt}
- utf8:$wt,"utf-8":$wt,hex:Dwt.base16,latin1:Wwt,ascii:Wwt,binary:Wwt,...Dwt} + utf8:Hvt,"utf-8":Hvt,hex:Dvt.base16,latin1:Wvt,ascii:Wvt,binary:Wvt,...Dvt}
SuiProvider 3 hunks, 3 statements
- namespace:PTt.NameSpaceKeyAptos,addresses:s,methods:[...LTt.AptosMethods],extra:h} + namespace:PCt.NameSpaceKeyAptos,addresses:s,methods:[...LCt.AptosMethods],extra:h}
- namespace:$Tt.NameSpaceKeyTON,addresses:o,methods:[...jTt.TONMethods],extra:a,data:{ + namespace:HCt.NameSpaceKeyTON,addresses:o,methods:[...jCt.TONMethods],extra:a,data:{
- namespace:qTt.NameSpaceKeySui,addresses:i,methods:[...QTt.SuiMethods],extra:s} + namespace:qCt.NameSpaceKeySui,addresses:i,methods:[...QCt.SuiMethods],extra:s}
WalletPopup 3 hunks, 3 statements
- ...OL.ERROR_POPUP_LABEL_OPTION,fontSize:24,fontWeight:"bold"} + ...sD.ERROR_POPUP_LABEL_OPTION,fontSize:24,fontWeight:"bold"}
- ...OL.ERROR_POPUP_LABEL_OPTION,fontSize:16} + ...sD.ERROR_POPUP_LABEL_OPTION,fontSize:16}
- ...OL.ERROR_POPUP_LABEL_OPTION,fontSize:16} + ...sD.ERROR_POPUP_LABEL_OPTION,fontSize:16}
TransTicketManager 2 hunks, 3 statements
- hero5:0,hero7:0,treasure5:0,treasure6:0,treasure7:0,treasure8:0,treasure9:0} + hero5:0,hero7:0,treasure5:0,treasure6:0,treasure7:0,treasure8:0,treasure9:0,massive:0}
+ getMassiveTransTicket(){ + return this.data.massive}
SpriteBattleController 3 hunks, 3 statements
- this.cleanup(),IU.getInstance().setDay(),this.battleEnded=!1,this.battleResult=null,this.battleTime=0,this.killCount=0,this.stageKindNum=t,this.stageVO=i,await eS.generateTexture("Highland","ktx2",!1); + this.cleanup(),EF.getInstance().setDay(),this.battleEnded=!1,this.battleResult=null,this.battleTime=0,this.killCount=0,this.stageKindNum=t,this.stageVO=i,await kS.generateTexture("Highland","ktx2",!1),EF.getInstance().highland.prepare(kS.getTexture("BG",gU.HIGHLAND));
- await this.setupAllies(),await this.setupEnemies(),this.setupEnemyLists(),eli.getInstance().switchToBattle(this),DB.getInstance().setBackground(NB.HIGHLAND),this.updateZIndexSorting(),IB.getInstance().remove(this.execute,this),await KB.getInstance().play(),q2t.getInstance().setTimeProvider(()=>this.getRemainingTimeSeconds()),IB.getInstance().add(this.execute,this)} + await this.setupAllies(),await this.setupEnemies(),this.setupEnemyLists(),Rui.getInstance().switchToBattle(this),mU.getInstance().setBackground(gU.HIGHLAND),EF.getInstance().highland.show(kS.getTexture("BG",gU.HIGHLAND)),this.updateZIndexSorting(),iU.getInstance().remove(this.execute,this),await CU.getInstance().play(),n3t.getInstance().setTimeProvider(()=>this.getRemainingTimeSeconds()),iU.getInstance().add(this.execute,this)}
- eP.getInstance().setBattleContext(Wx.Normal),this.speedHelper.detachButton(),this.speedHelper.exit(); + kP.getInstance().setBattleContext(wP.Normal),EF.getInstance().highland.hide(),this.speedHelper.detachButton(),this.speedHelper.exit();
BottomMenus 2 hunks, 3 statements
- lB.isValidEvent(uB.HERO_RESET_EVENT)?this.getMenu(1).showEventTag(-3,2):this.getMenu(1).hideEventTag(),lB.isValidEvent(uB.PAYMENT_EVENT)&&lB.currentPaymentSpecialEvent?this.getMenu(5).showEventTag(-3,2):this.getMenu(5).hideEventTag(),await this.updateSecretaryClaimable()} + GB.isValidEvent(BB.HERO_RESET_EVENT)?this.getMenu(1).showEventTag(-3,2):this.getMenu(1).hideEventTag(),GB.isValidEvent(BB.PAYMENT_EVENT)&&GB.currentPaymentSpecialEvent?this.getMenu(5).showEventTag(-3,2):this.getMenu(5).hideEventTag(),GB.isValidEvent(BB.TOWER_EVENT)?this.getMenu(4).showEventTag(-3,2):this.getMenu(4).hideEventTag(),await this.updateSecretaryClaimable()}
- this.menus.forEach(t=>t.showLockIcon(-10)),t.forEach(t=>{ - this.getMenu(t).hideLockIcon()} + this.menus.forEach(i=>{ + i.locked=-1==t.indexOf(i.index)}
MiniAscentAssets 3 hunks, 3 statements
- return[Uvi,...Bvi[t]??["ui_challenge_seal"],Fvi]} + return[XMi,...qMi[t]??["ui_challenge_seal"],JMi]}
- ,Yvi=[Vvi,"crystal_effect_plate",...jvi,...Kvi,...Object.values(zvi)],qvi=class{ + ,hbi=[ibi,"crystal_effect_plate",...sbi,...ebi,...Object.values(nbi)],rbi=class{
- for(const h of["background_map","chapter_journey","encounter_battle","encounter_elite","encounter_boss","encounter_event","encounter_shop","encounter_gambling","ui_arrow_up","ui_button_lobby_blank","ui_close","ui_coin","ui_energy","ui_challenge_seal","ui_divider","UI_VS","UI_Check1","UI_Check2",...Hvi,...Yvi])if(!n.textures[h])throw new Error(`UI_MINI: missing ${ + for(const h of["background_map","chapter_journey","encounter_battle","encounter_elite","encounter_boss","encounter_event","encounter_shop","encounter_gambling","ui_arrow_up","ui_button_lobby_blank","ui_close","ui_coin","ui_energy","ui_challenge_seal","ui_divider","UI_VS","UI_Check1","UI_Check2",...QMi,...hbi])if(!n.textures[h])throw new Error(`UI_MINI: missing ${
MiniAscentDeployPopup 3 hunks, 3 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:24,lineHeight:30} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:24,lineHeight:30}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:16,lineHeight:20} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:16,lineHeight:20}
- ...OL.DEFAULT_FONT_OPTION_15,fontSize:12,lineHeight:16} + ...sD.DEFAULT_FONT_OPTION_15,fontSize:12,lineHeight:16}
TilingSpriteShader 1 hunks, 2 statements
- ...np,vertex:{ - ...np.vertex,header:np.vertex.header.replace("group(1)","group(2)")} + ...Sp,vertex:{ + ...Sp.vertex,header:Sp.vertex.header.replace("group(1)","group(2)")}
RenderTargetSystem 2 hunks, 2 statements
- ...B.defaultOptions,...t} + ...U.defaultOptions,...t}
- ...F.defaultOptions,...t} + ...$.defaultOptions,...t}
CanvasRenderer 1 hunks, 2 statements
- const Fv=[...Iv,dw,pw,Uv,Gv],Hv=[Dw,Wm,Pw,_w,Xm,hw,Qm,mw],$v=[Dm,Rw],Wv=[],Vv=[],jv=[]; - ni.handleByNamedList(ii.CanvasSystem,Wv),ni.handleByNamedList(ii.CanvasPipes,Vv),ni.handleByNamedList(ii.CanvasPipesAdaptor,jv),ni.add(...Fv,...Hv,...$v); + const o_=[...qv,Pm,Lm,r_,n_],a_=[ev,lm,tv,Fm,mm,Tm,_m,Gm],c_=[em,Qm],l_=[],u_=[],d_=[]; + oi.handleByNamedList(ni.CanvasSystem,l_),oi.handleByNamedList(ni.CanvasPipes,u_),oi.handleByNamedList(ni.CanvasPipesAdaptor,d_),oi.add(...o_,...a_,...c_);
WebGLRenderer 1 hunks, 2 statements
- const Yb=[...Iv,F_,m_,i_,M_,Zv,Wb,V_,f_,wb,db,b_,bb,C_,v_],qb=[...Ov],Xb=[Bm,zb,jb],Jb=[],Qb=[],Zb=[]; - ni.handleByNamedList(ii.WebGLSystem,Jb),ni.handleByNamedList(ii.WebGLPipes,Qb),ni.handleByNamedList(ii.WebGLPipesAdaptor,Zb),ni.add(...Yb,...qb,...Xb); + const gb=[...qv,oM,G_,y_,W_,M_,lb,uM,N_,BM,PM,$_,$M,Y_,U_],wb=[...Xv],mb=[hm,pb,db],vb=[],_b=[],Mb=[]; + oi.handleByNamedList(ni.WebGLSystem,vb),oi.handleByNamedList(ni.WebGLPipes,_b),oi.handleByNamedList(ni.WebGLPipesAdaptor,Mb),oi.add(...gb,...wb,...mb);
WebGPURenderer 1 hunks, 2 statements
- const lM=[...Iv,TE,mE,pE,vE,aE,hM,FE,$E,jE,NE,dE,bE,nE],uM=[...Ov,OE],dM=[Hm,cM,oM],fM=[],pM=[],gM=[]; - ni.handleByNamedList(ii.WebGPUSystem,fM),ni.handleByNamedList(ii.WebGPUPipes,pM),ni.handleByNamedList(ii.WebGPUPipesAdaptor,gM),ni.add(...lM,...uM,...dM); + const Ry=[...qv,zb,Gb,Lb,Ub,Ib,Ty,oy,cy,dy,iy,Pb,$b,Sb],xy=[...Xv,Xb],Py=[am,ky,Oy],Ny=[],Ly=[],Dy=[]; + oi.handleByNamedList(ni.WebGPUSystem,Ny),oi.handleByNamedList(ni.WebGPUPipes,Ly),oi.handleByNamedList(ni.WebGPUPipesAdaptor,Dy),oi.add(...Ry,...xy,...Py);
UnitDataManager 2 hunks, 2 statements
- )()),Xt(this,"bookList",[]),Xt(this,"objBookList",new Map),Xt(this,"list",[]),Xt(this,"objList",new Map),Xt(this,"ownedUnitList",[]),Xt(this,"objOwnedUnitList",new Map),Xt(this,"totalTransPoint",0),Xt(this,"heroTransPointCache",new Map),Xt(this,"buyableUnitList",[NR.getVO(),NR.getVO(),NR.getVO(),NR.getVO(),NR.getVO()]),Xt(this,"lastBuyRefreshTime",0),Xt(this,"heroPresets",[]),Xt(this,"honorNumberMax",0),Xt(this,"_lastAppliedHeroPresetSlot",-1)} + )()),Zt(this,"bookList",[]),Zt(this,"objBookList",new Map),Zt(this,"list",[]),Zt(this,"objList",new Map),Zt(this,"ownedUnitList",[]),Zt(this,"objOwnedUnitList",new Map),Zt(this,"totalTransPoint",0),Zt(this,"heroTransPointCache",new Map),Zt(this,"buyableUnitList",[ox.getVO(),ox.getVO(),ox.getVO(),ox.getVO(),ox.getVO(),ox.getVO()]),Zt(this,"lastBuyRefreshTime",0),Zt(this,"heroPresets",[]),Zt(this,"honorNumberMax",0),Zt(this,"_lastAppliedHeroPresetSlot",-1)}
- s<5; + s<6;
ConfigManager 2 hunks, 2 statements
- this.userId=i.userId,this.name=i.name,this.uid=i.uid,this.userType=i.userType,this.language=i.language,this.timezone=Number(i.timezone),this.lastLoginTime=i.lastLoginTime||"",this.lastGoldUpdateTime=i.lastGoldUpdateTime||"",s&&BD.setTrusted(t.safeNum(i.gold,this.gold)),this.goldPerSec=Number(i.goldPerSec)||100,this.gem=t.safeNum(i.gem,this.gem),this.redGem=t.safeNum(i.redGem,this.redGem),this.medal=t.safeNum(i.medal,this.medal),this.honorCoin=t.safeNum(i.honorCoin,this.honorCoin); + this.userId!==i.userId&&(this.hideRankingTeam=!1),"boolean"==typeof i.hideRankingTeam&&(this.hideRankingTeam=i.hideRankingTeam),this.userId=i.userId,this.name=i.name,this.uid=i.uid,this.userType=i.userType,this.language=i.language,this.timezone=Number(i.timezone),this.lastLoginTime=i.lastLoginTime||"",this.lastGoldUpdateTime=i.lastGoldUpdateTime||"",s&&uG.setTrusted(t.safeNum(i.gold,this.gold)),this.goldPerSec=Number(i.goldPerSec)||100,this.gem=t.safeNum(i.gem,this.gem),this.redGem=t.safeNum(i.redGem,this.redGem),this.medal=t.safeNum(i.medal,this.medal),this.honorCoin=t.safeNum(i.honorCoin,this.honorCoin);
- Xt(qD,"accountId",""),Xt(qD,"currentServer",0),Xt(qD,"platform",""),Xt(qD,"platformId",""),Xt(qD,"regTime",""),Xt(qD,"agreeTime",""),Xt(qD,"optOut",!1),Xt(qD,"withdrawYn",""),Xt(qD,"withdrawTime",""),Xt(qD,"email",""),Xt(qD,"userId",""),Xt(qD,"name",""),Xt(qD,"uid",""),Xt(qD,"userType",0),Xt(qD,"language","en"),Xt(qD,"timezone",0),Xt(qD,"lastLoginTime",""),Xt(qD,"lastGoldUpdateTime",""),Xt(qD,"goldPerSec",100),Xt(qD,"walletType",""),Xt(qD,"walletAddress",""),Xt(qD,"createdJustNow",!1),Xt(qD,"tribe",0),Xt(qD,"reviveQuestGoldBuff",0),Xt(qD,"reviveQuestDurationBuff",0),Xt(qD,"reviveQuestOpenCostBuff",0),Xt(qD,"maxWave",1),Xt(qD,"gem",0),Xt(qD,"redGem",0),Xt(qD,"accuMedal",0),Xt(qD,"accuWave",0),Xt(qD,"medalBuyCount",0),Xt(qD,"needRevive",!1),Xt(qD,"medal",0),Xt(qD,"honorCoin",0),Xt(qD,"_speed15",gD(gP.SP15_SENTINEL)),Xt(qD,"_speed20",gD(gP.SP20_SENTINEL)),Xt(qD,"medalBuffLevel",0),Xt(qD,"goldBuffLevel",0),Xt(qD,"daySkipLevel",0),Xt(qD,"lastReviveTime",0),Xt(qD,"numRevive",0),Xt(qD,"numRevive30",0),Xt(qD,"numReviveHoldActive",!1),Xt(qD,"pendingNumRevive",-1),Xt(qD,"numReviveHoldTimer",null),Xt(qD,"heart",0),Xt(qD,"adsEndTime",0),Xt(qD,"assistantEndTime",0),Xt(qD,"assistantPassEndTime",0),Xt(qD,"soulRestStartAt",0),Xt(qD,"soulRestEndAt",0),Xt(qD,"bestMedalPerMin",0),Xt(qD,"bestMedalPerMinAt",0),Xt(qD,"soulRestNextStartAt",0),Xt(qD,"soulRestSkipCount",0),Xt(qD,"castleKindNum",10001),Xt(qD,"castleLevel",0),Xt(qD,"castleEnhance",0),Xt(qD,"castleGoldLevels",[0,0,0,0,0,0,0,0,0,0]),Xt(qD,"castleMedalLevels",[0,0,0,0,0,0,0,0,0,0]),Xt(qD,"questsLevels",[0,0,0,0,0,0,0,0,0,0]),Xt(qD,"maxTeamSlots",5),Xt(qD,"unitsSlotIds",[]),Xt(qD,"unitsSlotKindNums",[]),Xt(qD,"unitsSlotLevels",[]),Xt(qD,"unitsSlotEnhances",[]),Xt(qD,"ownedUnitKindNums",[]),Xt(qD,"ownedUnitCounts",[]),Xt(qD,"treasuresMaxSlots",5),Xt(qD,"treasuresKindNums",[]),Xt(qD,"treasuresLevels",[]),Xt(qD,"treasuresOwned",[]),Xt(qD,"skillsKindNums",[]),Xt(qD,"activeSkills",[1,-1,-1]),Xt(qD,"_godBless",gD(gP.GODBLESS_SENTINEL)),Xt(qD,"_skillSpeed",gD(gP.SKILLSPEED_SENTINEL)); + Zt(yG,"accountId",""),Zt(yG,"currentServer",0),Zt(yG,"platform",""),Zt(yG,"platformId",""),Zt(yG,"regTime",""),Zt(yG,"agreeTime",""),Zt(yG,"optOut",!1),Zt(yG,"withdrawYn",""),Zt(yG,"withdrawTime",""),Zt(yG,"email",""),Zt(yG,"userId",""),Zt(yG,"name",""),Zt(yG,"uid",""),Zt(yG,"userType",0),Zt(yG,"hideRankingTeam",!1),Zt(yG,"language","en"),Zt(yG,"timezone",0),Zt(yG,"lastLoginTime",""),Zt(yG,"lastGoldUpdateTime",""),Zt(yG,"goldPerSec",100),Zt(yG,"walletType",""),Zt(yG,"walletAddress",""),Zt(yG,"createdJustNow",!1),Zt(yG,"tribe",0),Zt(yG,"reviveQuestGoldBuff",0),Zt(yG,"reviveQuestDurationBuff",0),Zt(yG,"reviveQuestOpenCostBuff",0),Zt(yG,"maxWave",1),Zt(yG,"gem",0),Zt(yG,"redGem",0),Zt(yG,"accuMedal",0),Zt(yG,"accuWave",0),Zt(yG,"medalBuyCount",0),Zt(yG,"needRevive",!1),Zt(yG,"medal",0),Zt(yG,"honorCoin",0),Zt(yG,"_speed15",HD(HP.SP15_SENTINEL)),Zt(yG,"_speed20",HD(HP.SP20_SENTINEL)),Zt(yG,"medalBuffLevel",0),Zt(yG,"goldBuffLevel",0),Zt(yG,"daySkipLevel",0),Zt(yG,"lastReviveTime",0),Zt(yG,"numRevive",0),Zt(yG,"numRevive30",0),Zt(yG,"numReviveHoldActive",!1),Zt(yG,"pendingNumRevive",-1),Zt(yG,"numReviveHoldTimer",null),Zt(yG,"heart",0),Zt(yG,"adsEndTime",0),Zt(yG,"assistantEndTime",0),Zt(yG,"assistantPassEndTime",0),Zt(yG,"soulRestStartAt",0),Zt(yG,"soulRestEndAt",0),Zt(yG,"bestMedalPerMin",0),Zt(yG,"bestMedalPerMinAt",0),Zt(yG,"soulRestNextStartAt",0),Zt(yG,"soulRestSkipCount",0),Zt(yG,"castleKindNum",10001),Zt(yG,"castleLevel",0),Zt(yG,"castleEnhance",0),Zt(yG,"castleGoldLevels",[0,0,0,0,0,0,0,0,0,0]),Zt(yG,"castleMedalLevels",[0,0,0,0,0,0,0,0,0,0]),Zt(yG,"questsLevels",[0,0,0,0,0,0,0,0,0,0]),Zt(yG,"maxTeamSlots",5),Zt(yG,"unitsSlotIds",[]),Zt(yG,"unitsSlotKindNums",[]),Zt(yG,"unitsSlotLevels",[]),Zt(yG,"unitsSlotEnhances",[]),Zt(yG,"ownedUnitKindNums",[]),Zt(yG,"ownedUnitCounts",[]),Zt(yG,"treasuresMaxSlots",5),Zt(yG,"treasuresKindNums",[]),Zt(yG,"treasuresLevels",[]),Zt(yG,"treasuresOwned",[]),Zt(yG,"skillsKindNums",[]),Zt(yG,"activeSkills",[1,-1,-1]),Zt(yG,"_godBless",HD(HP.GODBLESS_SENTINEL)),Zt(yG,"_skillSpeed",HD(HP.SKILLSPEED_SENTINEL));
BasePopup 1 hunks, 2 statements
+ get className(){ + return""}
BasePopup2 1 hunks, 2 statements
+ get className(){ + return""}
SafeAreaTopContent 2 hunks, 2 statements
- s=this.realm===xB.DEAD_LAND?this.isNight?t.DEAD_LAND_NIGHT_COLOR:t.DEAD_LAND_DAY_COLOR:(this.isNight?this.seasonNightColor:this.seasonDayColor)[this.currentSeason-1],i?(zk.killTweensOf(this._rgb),this.bg.tint=s,this._rgb.r=s>>16&255,this._rgb.g=s>>8&255,this._rgb.b=255&s):this.tweenToColor(s)} + s=this.realm===hU.DEAD_LAND?this.isNight?t.DEAD_LAND_NIGHT_COLOR:t.DEAD_LAND_DAY_COLOR:this.realm===hU.FIRE_LAND?this.isNight?t.FIRE_LAND_NIGHT_COLOR:t.FIRE_LAND_DAY_COLOR:(this.isNight?this.seasonNightColor:this.seasonDayColor)[this.currentSeason-1],i?(MR.killTweensOf(this._rgb),this.bg.tint=s,this._rgb.r=s>>16&255,this._rgb.g=s>>8&255,this._rgb.b=255&s):this.tweenToColor(s)}
- qt(iU,"SafeAreaTopContent"),Xt(iU,"instance"),Xt(iU,"DEAD_LAND_DAY_COLOR",3023936),Xt(iU,"DEAD_LAND_NIGHT_COLOR",1182748),Xt(iU,"DUNGEON_COLORS",{ + Qt(DU,"SafeAreaTopContent"),Zt(DU,"instance"),Zt(DU,"DEAD_LAND_DAY_COLOR",3023936),Zt(DU,"DEAD_LAND_NIGHT_COLOR",1182748),Zt(DU,"FIRE_LAND_DAY_COLOR",4856846),Zt(DU,"FIRE_LAND_NIGHT_COLOR",1837062),Zt(DU,"DUNGEON_COLORS",{
DayNightFx 1 hunks, 2 statements
- const a=s===xB.DEAD_LAND; - this.fireflyRoot.visible=!a,this.soulRoot.visible=a,this.setAmbient(a?h?1:.65:h?1:0,e)} + const a=s===hU.DEAD_LAND,c=s===hU.FIRE_LAND; + this.fireflyRoot.visible=!a&&!c,this.soulRoot.visible=a,this.setAmbient(c?0:a?h?1:.65:h?1:0,e)}
GreenEagle1 2 hunks, 2 statements
- )()),Xt(j0,"attackableListPool",[]),Xt(j0,"BURN_EFFECT_OFFSET_Y",2); + )()),Zt(B1,"attackableListPool",[]),Zt(B1,"BURN_EFFECT_OFFSET_Y",2),Zt(B1,"HIT_TINT_FRAMES",4),Zt(B1,"HIT_TINT_COLOR",16743034);
- super.initializeData(),this.className=gR.GreenEagle1,this.hitHeight=25,this.radius=7,this.unitType=lR.RANGE,this.weaponClass=Bj.GreenEagleBall1,this.idleFrames=new HH(0,19),this.moveFrames=new HH(20,37),this.attackFrames=new HH(38,67),this.skillFrames=new HH(38,67),this.dieFrames=new HH(68,100),this.objAtk={ + super.initializeData(),this.className=HR.GreenEagle1,this.hitHeight=25,this.radius=7,this.unitType=GR.RANGE,this.weaponClass=PK.GreenEagleBall1,this.idleFrames=new DH(0,18),this.moveFrames=new DH(19,34),this.attackFrames=new DH(35,63),this.skillFrames=new DH(35,63),this.dieFrames=new DH(64,76),this.objAtk={
FireSpirit1 2 hunks, 2 statements
- l.owner=this,l.target=null,l.setBattleController(c),l.setData(n),l.initializeData(),l.initOrb(i,s,e,t.ORB_SPEED,n,h,this.orbThrowSign,r,r?t.ORB_SCALE_CHILD:t.ORB_SCALE_MAIN,o,t.ORB_HOME_DIST,n,a),l.play(),this.orbThrowSign=-this.orbThrowSign} + l.owner=this,l.target=null,l.setBattleController(c),l.setData(n),l.initializeData(),l.initOrb(i,s,e,t.ORB_SPEED,n,h,this.orbThrowSign,r,r?t.ORB_SCALE_CHILD:t.ORB_SCALE_MAIN,o,t.ORB_HOME_DIST,n*t.ORB_PATH_RATIO,a),l.play(),this.orbThrowSign=-this.orbThrowSign}
- qt(u1,"FireSpirit1"),Xt(u1,"SKILL_MODE",6),Xt(u1,"BASIC_MODE",4),Xt(u1,"BASIC_SHOTS",3),Xt(u1,"BASIC_SHOT_DELAY",3),Xt(u1,"WHIRL_COUNT",3),Xt(u1,"WHIRL_COUNT_E",4),Xt(u1,"WHIRL_SPREAD",.34),Xt(u1,"WHIRL_SPEED",3.4),Xt(u1,"WHIRL_RANGE",210),Xt(u1,"WHIRL_DPS",.5),Xt(u1,"WHIRL_SCALE",.45),Xt(u1,"WHIRL_HIT_R",26),Xt(u1,"WHIRL_STAGGER_BACK",16),Xt(u1,"WHIRL_JITTER",.05),Xt(u1,"STORM_COUNT",10),Xt(u1,"STORM_COUNT_E",12),Xt(u1,"STORM_SPEED",3),Xt(u1,"STORM_RANGE",330),Xt(u1,"STORM_SCALE",.85),Xt(u1,"STORM_SCALE_Y",1.45),Xt(u1,"STORM_HIT_R",42),Xt(u1,"STORM_DPS",.7),Xt(u1,"STORM_JITTER",.1),Xt(u1,"STORM_TRAIL_STEP",62),Xt(u1,"TRAIL_LIFE",150),Xt(u1,"TRAIL_RADIUS",34),Xt(u1,"TRAIL_TICK",30),Xt(u1,"TRAIL_DMG",.12),Xt(u1,"TRAIL_MAX",60),Xt(u1,"TRAIL_SCALE",.75),Xt(u1,"RUSH_MORPH_FRAMES",12),Xt(u1,"RUSH_SPEED",5.2),Xt(u1,"RUSH_MAX_FRAMES",70),Xt(u1,"RUSH_STAY_FRAMES",40),Xt(u1,"RUSH_BACK_SPEED",6.5),Xt(u1,"RUSH_BACK_MAX",70),Xt(u1,"RUSH_RANGE",300),Xt(u1,"RUSH_ARRIVE_DIST",14),Xt(u1,"RUSH_HIT_RADIUS",52),Xt(u1,"RUSH_TICK",12),Xt(u1,"RUSH_TICK_DMG",.45),Xt(u1,"RUSH_PILLAR_SCALE",1),Xt(u1,"RUSH_BURN_TICK",.1),Xt(u1,"RUSH_BURN_DURATION",180),Xt(u1,"RUSH_BURN_INTERVAL",30),Xt(u1,"RUSH_BURN_DOT_ID",72),Xt(u1,"SUPER_COUNT",5),Xt(u1,"SUPER_COUNT_E",7),Xt(u1,"SUPER_OUTER_R",150),Xt(u1,"SUPER_INNER_R",20),Xt(u1,"SUPER_SPIN",.075),Xt(u1,"SUPER_LIFE",180),Xt(u1,"SUPER_ARRIVE",.9),Xt(u1,"SUPER_DPS",1.4),Xt(u1,"SUPER_RANGE",260),Xt(u1,"TORNADO_COUNT",3),Xt(u1,"TORNADO_COUNT_E",4),Xt(u1,"SPREAD_RADIUS",140),Xt(u1,"GATHER_START_RADIUS",120),Xt(u1,"INNER_RADIUS",12),Xt(u1,"GATHER_END_RADIUS",60),Xt(u1,"SCATTER_SPIN",.07),Xt(u1,"GATHER_SPIN",.08),Xt(u1,"SCATTER_FRAMES",190),Xt(u1,"GAP_FRAMES",90),Xt(u1,"GATHER_FRAMES",180),Xt(u1,"GATHER_DIST",260),Xt(u1,"MIN_GATHER_DIST",120),Xt(u1,"TORNADO_DPS",1),Xt(u1,"ORBIT_COUNT",3),Xt(u1,"ORBIT_COUNT_E",4),Xt(u1,"ORBIT_RX",42),Xt(u1,"ORBIT_RY",14),Xt(u1,"ORBIT_H",-26),Xt(u1,"ORBIT_SPIN",.032),Xt(u1,"ORBIT_BOB",5),Xt(u1,"ORBIT_BOB_SPEED",.07),Xt(u1,"ORBIT_RAD_MIN",.72),Xt(u1,"ORBIT_RAD_MAX",1.32),Xt(u1,"ORBIT_SPIN_MIN",.82),Xt(u1,"ORBIT_SPIN_MAX",1.22),Xt(u1,"ORBIT_H_VAR",13),Xt(u1,"ORBIT_RUSH_SPIN",.9),Xt(u1,"ORBIT_RUSH_TIGHT",.2),Xt(u1,"JOIN_BLEND",20),Xt(u1,"CATCH_SETTLE",.3),Xt(u1,"CATCH_SETTLE_EASE",.94),Xt(u1,"CATCH_SPARK_SCALE",.3),Xt(u1,"CATCH_SPARK_LIFE",30),Xt(u1,"ORBIT_LAG",.14),Xt(u1,"ORBIT_LAG_MAX",130),Xt(u1,"DEATH_SCATTER_SPD",3.4),Xt(u1,"DEATH_SCATTER_LIFE",26),Xt(u1,"ORBIT_SCALE",.42),Xt(u1,"ORBIT_DEPTH",.04),Xt(u1,"BOOM_SPEED",5.6),Xt(u1,"BOOM_CURVE",.6),Xt(u1,"BOOM_OVERSHOOT",80),Xt(u1,"BOOM_MIN_TRAVEL",300),Xt(u1,"BOOM_SCALE",.44),Xt(u1,"BOOM_SCALE_Y",1.2),Xt(u1,"BOOM_GROW",9),Xt(u1,"BOOM_HIT_R",34),Xt(u1,"BOOM_DPS",.75),Xt(u1,"BOOM_MAX_TARGETS",6),Xt(u1,"SKILL_MAX_TARGETS",8),Xt(u1,"BOOM_TIMEOUT",1320),Xt(u1,"EMPTY_RETRY",8),Xt(u1,"JUGGLE_MAX",5),Xt(u1,"JUGGLE_PER",.15),Xt(u1,"OVERHEAT_HOLD",180),Xt(u1,"JUGGLE_BUFF_DUR",3600),Xt(u1,"JUGGLE_FREEZE",90),Xt(u1,"SKILL_BOOM_SPEED",4.8),Xt(u1,"SKILL_BOOM_CURVE",.7),Xt(u1,"SKILL_BOOM_SCALE",.54),Xt(u1,"SKILL_BOOM_SCALE_Y",1.4),Xt(u1,"SKILL_BOOM_HIT_R",48),Xt(u1,"SKILL_BOOM_DPS",.8),Xt(u1,"SKILL_BOOM_HOPS",3),Xt(u1,"SKILL_EXP_DMG",1),Xt(u1,"SKILL_EXP_RADIUS",92),Xt(u1,"SKILL_EXP_BURN",.15),Xt(u1,"SKILL_EXP_SCALE",1.1),Xt(u1,"SKILL_ARM_FRAMES",22),Xt(u1,"SKILL_MAX_TRAVEL",330),Xt(u1,"RELIGHT_DELAY",34),Xt(u1,"BLOOM_FRAMES",24),Xt(u1,"BLOOM_STAGGER",8),Xt(u1,"BLOOM_SPIN",2.4),Xt(u1,"BLOOM_START_RAD",.12),Xt(u1,"BLOOM_START_SCL",.2),Xt(u1,"SKILL_OVERSHOOT",70),Xt(u1,"SKILL_MIN_TRAVEL",120),Xt(u1,"SKILL_BOOM_GROW",12),Xt(u1,"SKILL_HOP_RANGE",180),Xt(u1,"SKILL_SECTOR_PAD",1.25),Xt(u1,"ORB_SPEED",15.5),Xt(u1,"ORB_SHOTS",2),Xt(u1,"ORB_DMG",.45),Xt(u1,"ORB_CHILD_DMG",.35),Xt(u1,"ORB_CHILD_REPEAT",.22),Xt(u1,"ORB_SPLIT",4),Xt(u1,"ORB_SPLIT_E",5),Xt(u1,"ORB_CHILD_RANGE",380),Xt(u1,"ORB_SCALE_MAIN",.78),Xt(u1,"ORB_SCALE_CHILD",.46),Xt(u1,"ORB_SPREAD_ARC",1.5),Xt(u1,"ORB_SPREAD_KICK",.3),Xt(u1,"ORB_H",-26),Xt(u1,"ORB_HOME_DIST",54),Xt(u1,"ORB_SCATTER",8),Xt(u1,"ORB_SCATTER_E",11),Xt(u1,"ORB_FUSE",30),Xt(u1,"ORB_SC_ARM",8),Xt(u1,"ORB_SC_SPD_MIN",5),Xt(u1,"ORB_SC_SPD_MAX",15),Xt(u1,"ORB_SC_JITTER",.16),Xt(u1,"ORB_SC_AIM_R",450),Xt(u1,"ORB_SC_AIM_JIT",.25),Xt(u1,"ORB_SC_SCALE",.7),Xt(u1,"ORB_BLAST_R",78),Xt(u1,"ORB_BLAST_DMG",1.15),Xt(u1,"ORB_BLAST_BURN",.12),Xt(u1,"ORB_BURN_DUR",180),Xt(u1,"ORB_BURN_INT",30),Xt(u1,"ORB_BURN_ID",74); + Qt(n2,"FireSpirit1"),Zt(n2,"SKILL_MODE",6),Zt(n2,"BASIC_MODE",4),Zt(n2,"BASIC_SHOTS",3),Zt(n2,"BASIC_SHOT_DELAY",3),Zt(n2,"WHIRL_COUNT",3),Zt(n2,"WHIRL_COUNT_E",4),Zt(n2,"WHIRL_SPREAD",.34),Zt(n2,"WHIRL_SPEED",3.4),Zt(n2,"WHIRL_RANGE",210),Zt(n2,"WHIRL_DPS",.5),Zt(n2,"WHIRL_SCALE",.45),Zt(n2,"WHIRL_HIT_R",26),Zt(n2,"WHIRL_STAGGER_BACK",16),Zt(n2,"WHIRL_JITTER",.05),Zt(n2,"STORM_COUNT",10),Zt(n2,"STORM_COUNT_E",12),Zt(n2,"STORM_SPEED",3),Zt(n2,"STORM_RANGE",330),Zt(n2,"STORM_SCALE",.85),Zt(n2,"STORM_SCALE_Y",1.45),Zt(n2,"STORM_HIT_R",42),Zt(n2,"STORM_DPS",.7),Zt(n2,"STORM_JITTER",.1),Zt(n2,"STORM_TRAIL_STEP",62),Zt(n2,"TRAIL_LIFE",150),Zt(n2,"TRAIL_RADIUS",34),Zt(n2,"TRAIL_TICK",30),Zt(n2,"TRAIL_DMG",.12),Zt(n2,"TRAIL_MAX",60),Zt(n2,"TRAIL_SCALE",.75),Zt(n2,"RUSH_MORPH_FRAMES",12),Zt(n2,"RUSH_SPEED",5.2),Zt(n2,"RUSH_MAX_FRAMES",70),Zt(n2,"RUSH_STAY_FRAMES",40),Zt(n2,"RUSH_BACK_SPEED",6.5),Zt(n2,"RUSH_BACK_MAX",70),Zt(n2,"RUSH_RANGE",300),Zt(n2,"RUSH_ARRIVE_DIST",14),Zt(n2,"RUSH_HIT_RADIUS",52),Zt(n2,"RUSH_TICK",12),Zt(n2,"RUSH_TICK_DMG",.45),Zt(n2,"RUSH_PILLAR_SCALE",1),Zt(n2,"RUSH_BURN_TICK",.1),Zt(n2,"RUSH_BURN_DURATION",180),Zt(n2,"RUSH_BURN_INTERVAL",30),Zt(n2,"RUSH_BURN_DOT_ID",72),Zt(n2,"SUPER_COUNT",5),Zt(n2,"SUPER_COUNT_E",7),Zt(n2,"SUPER_OUTER_R",150),Zt(n2,"SUPER_INNER_R",20),Zt(n2,"SUPER_SPIN",.075),Zt(n2,"SUPER_LIFE",180),Zt(n2,"SUPER_ARRIVE",.9),Zt(n2,"SUPER_DPS",1.4),Zt(n2,"SUPER_RANGE",260),Zt(n2,"TORNADO_COUNT",3),Zt(n2,"TORNADO_COUNT_E",4),Zt(n2,"SPREAD_RADIUS",140),Zt(n2,"GATHER_START_RADIUS",120),Zt(n2,"INNER_RADIUS",12),Zt(n2,"GATHER_END_RADIUS",60),Zt(n2,"SCATTER_SPIN",.07),Zt(n2,"GATHER_SPIN",.08),Zt(n2,"SCATTER_FRAMES",190),Zt(n2,"GAP_FRAMES",90),Zt(n2,"GATHER_FRAMES",180),Zt(n2,"GATHER_DIST",260),Zt(n2,"MIN_GATHER_DIST",120),Zt(n2,"TORNADO_DPS",1),Zt(n2,"ORBIT_COUNT",3),Zt(n2,"ORBIT_COUNT_E",4),Zt(n2,"ORBIT_RX",42),Zt(n2,"ORBIT_RY",14),Zt(n2,"ORBIT_H",-26),Zt(n2,"ORBIT_SPIN",.032),Zt(n2,"ORBIT_BOB",5),Zt(n2,"ORBIT_BOB_SPEED",.07),Zt(n2,"ORBIT_RAD_MIN",.72),Zt(n2,"ORBIT_RAD_MAX",1.32),Zt(n2,"ORBIT_SPIN_MIN",.82),Zt(n2,"ORBIT_SPIN_MAX",1.22),Zt(n2,"ORBIT_H_VAR",13),Zt(n2,"ORBIT_RUSH_SPIN",.9),Zt(n2,"ORBIT_RUSH_TIGHT",.2),Zt(n2,"JOIN_BLEND",20),Zt(n2,"CATCH_SETTLE",.3),Zt(n2,"CATCH_SETTLE_EASE",.94),Zt(n2,"CATCH_SPARK_SCALE",.3),Zt(n2,"CATCH_SPARK_LIFE",30),Zt(n2,"ORBIT_LAG",.14),Zt(n2,"ORBIT_LAG_MAX",130),Zt(n2,"DEATH_SCATTER_SPD",3.4),Zt(n2,"DEATH_SCATTER_LIFE",26),Zt(n2,"ORBIT_SCALE",.42),Zt(n2,"ORBIT_DEPTH",.04),Zt(n2,"BOOM_SPEED",5.6),Zt(n2,"BOOM_CURVE",.6),Zt(n2,"BOOM_OVERSHOOT",80),Zt(n2,"BOOM_MIN_TRAVEL",300),Zt(n2,"BOOM_SCALE",.44),Zt(n2,"BOOM_SCALE_Y",1.2),Zt(n2,"BOOM_GROW",9),Zt(n2,"BOOM_HIT_R",34),Zt(n2,"BOOM_DPS",.75),Zt(n2,"BOOM_MAX_TARGETS",6),Zt(n2,"SKILL_MAX_TARGETS",8),Zt(n2,"BOOM_TIMEOUT",1320),Zt(n2,"EMPTY_RETRY",8),Zt(n2,"JUGGLE_MAX",5),Zt(n2,"JUGGLE_PER",.15),Zt(n2,"OVERHEAT_HOLD",180),Zt(n2,"JUGGLE_BUFF_DUR",3600),Zt(n2,"JUGGLE_FREEZE",90),Zt(n2,"SKILL_BOOM_SPEED",4.8),Zt(n2,"SKILL_BOOM_CURVE",.7),Zt(n2,"SKILL_BOOM_SCALE",.54),Zt(n2,"SKILL_BOOM_SCALE_Y",1.4),Zt(n2,"SKILL_BOOM_HIT_R",48),Zt(n2,"SKILL_BOOM_DPS",.8),Zt(n2,"SKILL_BOOM_HOPS",3),Zt(n2,"SKILL_EXP_DMG",1),Zt(n2,"SKILL_EXP_RADIUS",92),Zt(n2,"SKILL_EXP_BURN",.15),Zt(n2,"SKILL_EXP_SCALE",1.1),Zt(n2,"SKILL_ARM_FRAMES",22),Zt(n2,"SKILL_MAX_TRAVEL",330),Zt(n2,"RELIGHT_DELAY",34),Zt(n2,"BLOOM_FRAMES",24),Zt(n2,"BLOOM_STAGGER",8),Zt(n2,"BLOOM_SPIN",2.4),Zt(n2,"BLOOM_START_RAD",.12),Zt(n2,"BLOOM_START_SCL",.2),Zt(n2,"SKILL_OVERSHOOT",70),Zt(n2,"SKILL_MIN_TRAVEL",120),Zt(n2,"SKILL_BOOM_GROW",12),Zt(n2,"SKILL_HOP_RANGE",180),Zt(n2,"SKILL_SECTOR_PAD",1.25),Zt(n2,"ORB_SPEED",15.5),Zt(n2,"ORB_SHOTS",2),Zt(n2,"ORB_DMG",.45),Zt(n2,"ORB_CHILD_DMG",.35),Zt(n2,"ORB_CHILD_REPEAT",.22),Zt(n2,"ORB_PATH_RATIO",.5),Zt(n2,"ORB_SPLIT",4),Zt(n2,"ORB_SPLIT_E",5),Zt(n2,"ORB_CHILD_RANGE",380),Zt(n2,"ORB_SCALE_MAIN",.78),Zt(n2,"ORB_SCALE_CHILD",.46),Zt(n2,"ORB_SPREAD_ARC",1.5),Zt(n2,"ORB_SPREAD_KICK",.3),Zt(n2,"ORB_H",-26),Zt(n2,"ORB_HOME_DIST",54),Zt(n2,"ORB_SCATTER",8),Zt(n2,"ORB_SCATTER_E",11),Zt(n2,"ORB_FUSE",30),Zt(n2,"ORB_SC_ARM",8),Zt(n2,"ORB_SC_SPD_MIN",5),Zt(n2,"ORB_SC_SPD_MAX",15),Zt(n2,"ORB_SC_JITTER",.16),Zt(n2,"ORB_SC_AIM_R",450),Zt(n2,"ORB_SC_AIM_JIT",.25),Zt(n2,"ORB_SC_SCALE",.7),Zt(n2,"ORB_BLAST_R",78),Zt(n2,"ORB_BLAST_DMG",1.15),Zt(n2,"ORB_BLAST_BURN",.12),Zt(n2,"ORB_BURN_DUR",180),Zt(n2,"ORB_BURN_INT",30),Zt(n2,"ORB_BURN_ID",74);
RewardItem 2 hunks, 2 statements
- var f6=(t=>(t.gem="gem",t.redGem="redGem",t.gold="gold",t.medal="medal",t.honorCoin="honorCoin",t.guildPoint="guildPoint",t.guildCoin="guildCoin",t.raidCoin="raidCoin",t.runeTicket="runeTicket",t.hammer="hammer",t.hero="hero",t.instant="instant",t.ticket="ticket",t.trans="trans",t.pet="pet",t.petTicket="petTicket",t.petSelect="petSelect",t.heroGacha="heroGacha",t.heroSelect="heroSelect",t.heroTrans="heroTrans",t.treasure="treasure",t.treasureGacha="treasureGacha",t.treasureTrans="treasureTrans",t.ads="ads",t.speed="speed",t.assistant="assistant",t.dungeonTicket="dungeonTicket",t.miniAscentEnergy="miniAscentEnergy",t))(f6||{ + var d4=(t=>(t.gem="gem",t.redGem="redGem",t.gold="gold",t.medal="medal",t.honorCoin="honorCoin",t.guildPoint="guildPoint",t.guildCoin="guildCoin",t.raidCoin="raidCoin",t.runeTicket="runeTicket",t.hammer="hammer",t.hero="hero",t.trans="trans",t.massive="massive",t.pet="pet",t.petTicket="petTicket",t.petSelect="petSelect",t.heroGacha="heroGacha",t.heroSelect="heroSelect",t.heroTrans="heroTrans",t.treasure="treasure",t.treasureGacha="treasureGacha",t.treasureTrans="treasureTrans",t.buff="buff",t.instant="instant",t.ticket="ticket",t.pass="pass",t.ads="ads",t.speed="speed",t.assistant="assistant",t.dungeonTicket="dungeonTicket",t.miniAscentEnergy="miniAscentEnergy",t.bless="bless",t))(d4||{
- t==f6.gem?(r="UI_SHOP_GEM",h=.85):t==f6.redGem?(r="UI_SHOP_RED_GEM",h=.83):t==f6.gold?(r="m_gold",h=.7):t==f6.honorCoin?(r="UI_COIN_Big",h=.8):t==f6.hammer?(r="Icon_Hammer",h=1.5):t==f6.dungeonTicket?(r="DungeonTick",h=.8):t==f6.miniAscentEnergy||n==f6.miniAscentEnergy?(r="ui_energy",h=56/30):t==f6.hero?(this.heroIcon.setDataWithKindNum(e),this.heroIcon.visible=!0):t==f6.ticket&&n==f6.heroGacha?r="Ticket_HeroGacha":t==f6.ticket&&n==f6.heroSelect?(r="Ticket_HeroSelect",h=.85):t==f6.trans&&n==f6.hero?r=9==this._grade?"Ticket_HeroTrans2":"Ticket_HeroTrans":t==f6.pet?(this.petIcon.setPet(e,1),this.petIcon.visible=!0):t==f6.petTicket||n==f6.petTicket||t==f6.ticket&&n==f6.pet?(r="PetTick",h=.9):t==f6.petSelect||n==f6.petSelect||t==f6.ticket&&n==f6.petSelect?(r="Ticket_PetSelect",h=.9):t==f6.ticket&&n==f6.treasureGacha?(r="Ticket_TreasureGacha",h=.95):t==f6.trans&&n==f6.treasure?r=7===this._grade?"Ticket_TreasureTrans7":"Ticket_TreasureTrans6":t==f6.ads?(r="AdsRemove",h=.7):t==f6.speed?(r="UI_SHOP_SPEED2",h=.8):t==f6.assistant?(r="Package_Secretary",h=.7):t==f6.guildCoin||t==f6.guildPoint?(r="GUILD_COIN",h=1.6):t==f6.raidCoin?(r="RaidCoin_on",h=1.5):t==f6.runeTicket&&(r="RuneTicket",h=1.2),r&&(this.img.scale=h,this.img.texture=eS.getTexture("UI_Ekkorr",r),this.img.visible=!0,this.bg.visible=!0),t==f6.ads||t==f6.speed||t==f6.assistant?this.lblNum.text=`${ + t==d4.gem?(r="UI_SHOP_GEM",h=.85):t==d4.redGem?(r="UI_SHOP_RED_GEM",h=.83):t==d4.gold?(r="m_gold",h=.7):t==d4.honorCoin?(r="UI_COIN_Big",h=.8):t==d4.hammer?(r="Icon_Hammer",h=1.5):t==d4.dungeonTicket||n==d4.dungeonTicket?(r="DungeonTick",h=.8):t==d4.miniAscentEnergy||n==d4.miniAscentEnergy?(r="ui_energy",h=56/30):t==d4.hero?(this.heroIcon.setDataWithKindNum(e),this.heroIcon.visible=!0):t==d4.ticket&&n==d4.heroGacha?r="Ticket_HeroGacha":t==d4.ticket&&n==d4.heroSelect?(r="Ticket_HeroSelect",h=.85):t==d4.trans&&n==d4.hero?r=9==this._grade?"Ticket_HeroTrans2":"Ticket_HeroTrans":t==d4.trans&&n==d4.massive?r="Ticket_UnitBuy":t==d4.pet?(this.petIcon.setPet(e,1),this.petIcon.visible=!0):t==d4.petTicket||n==d4.petTicket||t==d4.ticket&&n==d4.pet?(r="PetTick",h=.9):t==d4.petSelect||n==d4.petSelect||t==d4.ticket&&n==d4.petSelect?(r="Ticket_PetSelect",h=.9):t==d4.ticket&&n==d4.treasureGacha?(r="Ticket_TreasureGacha",h=.95):t==d4.trans&&n==d4.treasure?r=7===this._grade?"Ticket_TreasureTrans7":"Ticket_TreasureTrans6":t==d4.ads||n==d4.ads?(r="AdsRemove",h=.7):t==d4.speed||n==d4.speed?(r="UI_SHOP_SPEED2",h=.8):t==d4.assistant||n==d4.assistant?(r="Package_Secretary",h=.7):t==d4.guildCoin||t==d4.guildPoint?(r="GUILD_COIN",h=1.6):t==d4.raidCoin?(r="RaidCoin_on",h=1.5):t==d4.runeTicket&&(r="RuneTicket",h=1.2),r&&(this.img.scale=h,this.img.texture=kS.getTexture("UI_Ekkorr",r),this.img.visible=!0,this.bg.visible=!0),t==d4.ads||t==d4.speed||t==d4.assistant?this.lblNum.text=`${
Err 2 hunks, 2 statements
- ...b,domain:E} + ...M,domain:b}
- const y=n.concatBytes(...A),T=_; + const A=n.concatBytes(...E),T=_;
Dr 2 hunks, 2 statements
- function get(t){ + function wnt(t){
- qt(get,"Dr"),set.ghash=get((t,i)=>new det(t,i)),set.polyval=get((t,i)=>new pet(t,i)),Object.defineProperty(iet,"__esModule",{ + Qt(wnt,"Dr"),nnt.ghash=wnt((t,i)=>new fnt(t,i)),nnt.polyval=wnt((t,i)=>new gnt(t,i)),Object.defineProperty(ent,"__esModule",{
BasePopup3 1 hunks, 2 statements
+ get className(){ + return""}
HelpDetailPopup 2 hunks, 2 statements
- ...OL.DEFAULT_FONT_OPTION_18,fontSize:32,lineHeight:40} + ...sD.DEFAULT_FONT_OPTION_18,fontSize:32,lineHeight:40}
- ...OL.DEFAULT_FONT_OPTION_18,fontSize:24,lineHeight:34} + ...sD.DEFAULT_FONT_OPTION_18,fontSize:24,lineHeight:34}
HeroHireSubView 2 hunks, 2 statements
- t<5; + t<6;
- e<5; + e<6;
PVPBattleController 2 hunks, 2 statements
- IB.getInstance().remove(this.execute,this),wZt.getInstance().showVictory()} + iU.getInstance().remove(this.execute,this),T0t.getInstance().showResult(!0,null,null)}
- IB.getInstance().remove(this.execute,this),wZt.getInstance().showDefeat()} + iU.getInstance().remove(this.execute,this),T0t.getInstance().showResult(!1,null,null)}
GuildRaidBookVO 2 hunks, 2 statements
- ...Lt.DEFAULT_OPTIONS,...t} + ...Bt.DEFAULT_OPTIONS,...t}
- ...Dt.DEFAULT_OPTIONS,...i} + ...Ut.DEFAULT_OPTIONS,...i}
PVPBattlePopup 1 hunks, 2 statements
- async endBattle(t){ - Y4t.getInstance().endBattle(t)} + endBattle(t){ + return S7t.getInstance().endBattle(t)}
MailDetailPopup 2 hunks, 2 statements
- var t; + var t,i;
- if(this.currentMail.receivedAt=new Date,XD.setUserInfo(i.body),Vzt.getInstance().setData(i.body),AB.getInstance().setStatusData(null==(t=i.body)?void 0:t.mineStatus),zzt.getInstance().setData(i.body.transTicket),mS.getInstance().dispatchCustomEvent("MailUpdate"),"inventory"in i.body){ + if(this.currentMail.receivedAt=new Date,EG.setUserInfo(s.body),DYt.getInstance().setData(s.body),XB.getInstance().setStatusData(null==(t=s.body)?void 0:t.mineStatus),UYt.getInstance().setData(null==(i=s.body)?void 0:i.transTicket),WS.getInstance().dispatchCustomEvent("MailUpdate"),"inventory"in s.body){
MailPopup 2 hunks, 2 statements
- var t; + var t,i;
- XD.setUserInfo(i.body),Vzt.getInstance().setData(i.body),AB.getInstance().setStatusData(null==(t=i.body)?void 0:t.mineStatus),zzt.getInstance().setData(i.body.transTicket),this.setRequestPending3(!1); + EG.setUserInfo(s.body),DYt.getInstance().setData(s.body),XB.getInstance().setStatusData(null==(t=s.body)?void 0:t.mineStatus),UYt.getInstance().setData(null==(i=s.body)?void 0:i.transTicket),this.setRequestPending3(!1);
GuildWarTournament2Popup 1 hunks, 2 statements
+ get className(){ + return"GuildWarTournament2Popup"}
AttendancePopup 2 hunks, 2 statements
- ,this.lblMsg=new SD("",t.fill,t),this.addChild(this.lblMsg),this.rowA=new Tri,this.rowA.onToggle=t=>this.onRowToggle(t),this.contentContainer.addChild(this.rowA),this.rowB=new Tri,this.rowB.onToggle=t=>this.onRowToggle(t),this.contentContainer.addChild(this.rowB),this.grid=new Mri,this.contentContainer.addChild(this.grid),this.btnClaimAll=new kri("받기"),this.btnClaimAll.onClick=()=>{ + ,this.lblMsg=new QD("",t.fill,t),this.addChild(this.lblMsg),this.rowA=new iai,this.rowA.onToggle=t=>this.onRowToggle(t),this.contentContainer.addChild(this.rowA),this.rowB=new iai,this.rowB.onToggle=t=>this.onRowToggle(t),this.contentContainer.addChild(this.rowB),this.grid=new Joi,this.contentContainer.addChild(this.grid),this.btnClaimAll=new Rqt("받기"),this.btnClaimAll.autoResize=!1,this.btnClaimAll.width=300,this.btnClaimAll.height=60,this.btnClaimAll.onClick=()=>{
- this.btnClaimAll.setClaimEnabled(e),this.btnClaimAll.text=s>0?`${ + this.btnClaimAll.activated=e,this.btnClaimAll.text=s>0?`${
GuildBarrackRowItemRenderer 2 hunks, 2 statements
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:14} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:14}
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:13} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:13}
GuildWarBattleReadyPopup 2 hunks, 2 statements
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:13} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:13}
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:i} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:i}
GuildWarSquadsPopup 2 hunks, 2 statements
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:14} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:14}
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:i} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:i}
GuildWarTierAssignPopup 2 hunks, 2 statements
- const i=[...QL.memberList??[]].sort((t,i)=>i.roleLevel!==t.roleLevel?i.roleLevel-t.roleLevel:(i.wave??0)-(t.wave??0)); + const i=[...SD.memberList??[]].sort((t,i)=>i.roleLevel!==t.roleLevel?i.roleLevel-t.roleLevel:(i.wave??0)-(t.wave??0));
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:i} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:i}
MiniAscentBattleController 2 hunks, 2 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:14,lineHeight:18} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:14,lineHeight:18}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:14,lineHeight:18} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:14,lineHeight:18}
MiniAscentCorpsPanel 2 hunks, 2 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:i,lineHeight:i+4} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:i,lineHeight:i+4}
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:16,lineHeight:20} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:16,lineHeight:20}
MiniAscentCorpsPage 2 hunks, 2 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:22,lineHeight:28} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:22,lineHeight:28}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:14,lineHeight:19} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:14,lineHeight:19}
MiniAscentRoutePopup 2 hunks, 2 statements
- const t=new of; + const t=new bf;
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:f,lineHeight:f+2} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:f,lineHeight:f+2}
MiniAscentChapterRewardItem 2 hunks, 2 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:14} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:14}
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:15} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:15}
ObservablePoint 1 hunks, 1 statements
- var t,i,s,e,n,h,r,o,a,c,l,u,d,f,p,g,m,w,v,_,b,E,M,A,y,S,T,C,I,O,k,R,x,P,N,L,D,G,B,U,F,H,$,W,V,j,K,z,Y,q,X,J,Q,Z,tt,it,st,et,nt,ht,rt,ot,at,ct,lt,ut,dt,ft,pt,gt,mt,wt,vt,_t,bt,Et,Mt,At,yt,St,Tt,Ct,It,Ot,kt,Rt,xt,Pt,Nt,Lt,Dt,Gt,Bt,Ut,Ft,Ht,$t,Wt,Vt,jt,Kt,zt,Yt=Object.defineProperty,qt=(t,i)=>Yt(t,"name",{ + var t,i,s,e,n,h,r,o,a,c,l,u,d,f,p,g,w,m,v,_,M,b,y,E,A,S,T,C,O,I,k,R,x,P,N,L,D,G,B,U,F,$,H,W,V,j,K,z,Y,q,X,J,Q,Z,tt,it,st,et,nt,ht,rt,ot,at,ct,lt,ut,dt,ft,pt,gt,wt,mt,vt,_t,Mt,bt,yt,Et,At,St,Tt,Ct,Ot,It,kt,Rt,xt,Pt,Nt,Lt,Dt,Gt,Bt,Ut,Ft,$t,Ht,Wt,Vt,jt,Kt,zt,Yt,qt,Xt,Jt=Object.defineProperty,Qt=(t,i)=>Jt(t,"name",{
CacheClass 1 hunks, 1 statements
- ...Zi.defaultOptions,autoLoad:!0,autoPlay:!0,updateFPS:0,crossorigin:!0,loop:!1,muted:!0,playsinline:!0,preload:!1} + ...ss.defaultOptions,autoLoad:!0,autoPlay:!0,updateFPS:0,crossorigin:!0,loop:!1,muted:!0,playsinline:!0,preload:!1}
SystemRunner 1 hunks, 1 statements
- ni.handleByNamedList(ii.Environment,ur),qt(dr,"loadEnvironmentExtensions"),qt(pr,"unsafeEvalSupported"),qt(gr,"earcut$1"),qt(mr,"linkedList"),qt(wr,"filterPoints"),qt(vr,"earcutLinked"),qt(_r,"isEar"),qt(br,"isEarHashed"),qt(Er,"cureLocalIntersections"),qt(Mr,"splitEarcut"),qt(Ar,"eliminateHoles"),qt(yr,"compareXYSlope"),qt(Sr,"eliminateHole"),qt(Tr,"findHoleBridge"),qt(Cr,"sectorContainsSector"),qt(Ir,"indexCurve"),qt(Or,"sortLinked"),qt(kr,"zOrder"),qt(Rr,"getLeftmost"),qt(xr,"pointInTriangle"),qt(Pr,"pointInTriangleExceptFirst"),qt(Nr,"isValidDiagonal"),qt(Lr,"area"),qt(Dr,"equals$2"),qt(Gr,"intersects"),qt(Br,"onSegment"),qt(Ur,"sign"),qt(Fr,"intersectsPolygon"),qt(Hr,"locallyInside"),qt($r,"middleInside"),qt(Wr,"splitPolygon"),qt(Vr,"insertNode"),qt(jr,"removeNode"),qt(Kr,"createNode"),qt(zr,"signedArea"); + oi.handleByNamedList(ni.Environment,pr),Qt(gr,"loadEnvironmentExtensions"),Qt(mr,"unsafeEvalSupported"),Qt(vr,"earcut$1"),Qt(_r,"linkedList"),Qt(Mr,"filterPoints"),Qt(br,"earcutLinked"),Qt(yr,"isEar"),Qt(Er,"isEarHashed"),Qt(Ar,"cureLocalIntersections"),Qt(Sr,"splitEarcut"),Qt(Tr,"eliminateHoles"),Qt(Cr,"compareXYSlope"),Qt(Or,"eliminateHole"),Qt(Ir,"findHoleBridge"),Qt(kr,"sectorContainsSector"),Qt(Rr,"indexCurve"),Qt(xr,"sortLinked"),Qt(Pr,"zOrder"),Qt(Nr,"getLeftmost"),Qt(Lr,"pointInTriangle$1"),Qt(Dr,"pointInTriangleExceptFirst"),Qt(Gr,"isValidDiagonal"),Qt(Br,"area$1"),Qt(Ur,"equals$2"),Qt(Fr,"intersects"),Qt($r,"onSegment"),Qt(Hr,"sign"),Qt(Wr,"intersectsPolygon"),Qt(Vr,"locallyInside"),Qt(jr,"middleInside"),Qt(Kr,"splitPolygon"),Qt(zr,"insertNode"),Qt(Yr,"removeNode"),Qt(qr,"createNode"),Qt(Xr,"signedArea");
ApplicationInitHook 1 hunks, 1 statements
- const i=[...Qr,...this.config.runners??[]]; + const i=[...io,...this.config.runners??[]];
Geometry 1 hunks, 1 statements
- ...w.defaultOptions,...t} + ...m.defaultOptions,...t}
DefaultShader 1 hunks, 1 statements
- name:i,...dc({ + name:i,...gc({
AssetsClass 1 hunks, 1 statements
- ...vn.defaultOptions,resolution:(null==(e=i.data)?void 0:e.resolution)||Lu(t),alphaMode:(null==(n=i.data)?void 0:n.alphaMode)||await mn(),...i.data} + ...bn.defaultOptions,resolution:(null==(e=i.data)?void 0:e.resolution)||Bu(t),alphaMode:(null==(n=i.data)?void 0:n.alphaMode)||await _n(),...i.data}
WorkerInstance 1 hunks, 1 statements
- return Ed=[...bd,...t],Ed} + return Ad=[...Ed,...t],Ad}
DOMPipe 1 hunks, 1 statements
- return Ld=Gd(i),[...Ld,...t]} + return Bd=Fd(i),[...Bd,...t]}
PassthroughFilter 1 hunks, 1 statements
- let of=rf; + let bf=Mf;
BatchableMesh 1 hunks, 1 statements
- ...C.defaultOptions,...i} + ...O.defaultOptions,...i}
BitmapFontManagerClass 1 hunks, 1 statements
- ...x.defaultOptions,...t} + ...P.defaultOptions,...t}
HTMLTextStyle 1 hunks, 1 statements
- ...Ig.defaultDropShadow,...t} + ...qg.defaultDropShadow,...t}
RenderTexture 1 hunks, 1 statements
- ...L.defaultOptions,...t} + ...D.defaultOptions,...t}
GlobalUniformSystem 1 hunks, 1 statements
- ...G.defaultOptions,...t} + ...B.defaultOptions,...t}
GlGeometryGpuData 1 hunks, 1 statements
- ...$.defaultOptions,...t} + ...W.defaultOptions,...t}
GlColorMaskSystem 1 hunks, 1 statements
- ...W.defaultOptions,...t} + ...V.defaultOptions,...t}
GlUboSystem 1 hunks, 1 statements
- ...L_,"mat2x2<f32>":"\n data[offset] = v[0]; + ...sM,"mat2x2<f32>":"\n data[offset] = v[0];
NineSliceSpriteGpuData 1 hunks, 1 statements
- ...K.defaultOptions,...t} + ...q.defaultOptions,...t}
FrameLoopManager 1 hunks, 1 statements
- __proto__:null,AbstractBitmapFont:zg,AbstractRenderer:so,AbstractText:Tp,AbstractTextSystem:Fg,AccessibilitySystem:gh,AlphaMask:Je,AlphaMaskPipe:Xm,AnimatedSprite:Kf,Application:vo,ApplicationInitHook:co,Assets:ld,AssetsClass:cd,BLEND_TO_NPM:Ma,BREAKING_SPACES:Kp,BREAKING_SPACES_SET:zp,BREAK_AFTER_CHARS:Xp,BREAK_AFTER_CHARS_SET:Jp,BUFFER_TYPE:qv,BackgroundLoader:To,BackgroundSystem:Yw,Batch:Pa,BatchGeometry:Ja,BatchTextureArray:Ra,BatchableGraphics:qc,BatchableHTMLText:_m,BatchableMesh:Vf,BatchableSprite:xg,BatchableText:Ng,Batcher:Fa,BatcherPipe:Wm,BigPool:qs,BindGroup:sr,BindGroupSystem:nE,BitmapFont:xM,BitmapFontManager:em,BlendModePipe:Dw,Bounds:cs,BrowserAdapter:en,Buffer:$a,BufferImageSource:is,BufferResource:K_,BufferUsage:Ha,CLEAR:qr,COLLAPSIBLE_SPACES:Yp,COLLAPSIBLE_SPACES_SET:qp,Cache:En,CanvasBatchAdaptor:Dm,CanvasColorMaskPipe:Qm,CanvasContextSystem:dw,CanvasGraphicsAdaptor:Rw,CanvasGraphicsContextSystem:Rf,CanvasGraphicsPipe:Pf,CanvasLimitsSystem:pw,CanvasNineSliceSpritePipe:MM,CanvasObserver:Kn,CanvasPool:kp,CanvasPoolClass:Op,CanvasRenderTargetAdaptor:Lv,CanvasRenderTargetSystem:Gv,CanvasRenderer:zv,CanvasRendererTextSystem:$g,CanvasSource:on,CanvasStencilMaskPipe:hw,CanvasTextGenerator:Tg,CanvasTextMetrics:vg,CanvasTextPipe:Dg,CanvasTextSystem:Vg,CanvasTextureSystem:Uv,CanvasTilingSpritePipe:ep,Circle:oa,Color:Hs,ColorMask:Ze,ColorMaskPipe:tw,ColorMatrixFilter:of,CompressedSource:md,Container:He,CustomRenderPipe:mw,DEG_TO_RAD:wi,DOMAdapter:hn,DOMPipe:Ud,DefaultBatcher:Hc,DefaultShader:Bc,DynamicBitmapFont:qg,Ellipse:ca,EventBoundary:Jd,EventEmitter:fi,EventSystem:tf,EventsTicker:Hd,ExtensionType:ii,ExtractSystem:Jw,FederatedContainer:sf,FederatedEvent:Yn,FederatedMouseEvent:Wd,FederatedPointerEvent:jd,FederatedWheelEvent:zd,FillGradient:dl,FillPattern:vu,Filter:lr,FilterEffect:ie,FilterPipe:ff,FilterSystem:bf,FontStylePromiseCache:Tm,GCManagedHash:Wc,GCSystem:av,GL_FORMATS:n_,GL_TARGETS:h_,GL_TYPES:r_,GPUTextureGpuData:eM,GenerateTextureSystem:nv,Geometry:za,GlBackBufferSystem:m_,GlBatchAdaptor:Bm,GlBuffer:Jv,GlBufferSystem:Zv,GlColorMaskSystem:v_,GlContextSystem:i_,GlEncoderSystem:b_,GlGeometryGpuData:u_,GlGeometrySystem:f_,GlGraphicsAdaptor:jb,GlLimitsSystem:M_,GlMeshAdaptor:zb,GlProgram:Nh,GlProgramData:q_,GlRenderTarget:y_,GlRenderTargetAdaptor:$_,GlRenderTargetSystem:V_,GlShaderSystem:db,GlStateSystem:bb,GlStencilSystem:C_,GlTexture:Mb,GlTextureSystem:Wb,GlUboSystem:F_,GlUniformGroupSystem:wb,GlobalResourceRegistry:js,GlobalUniformSystem:lv,GpuBatchAdaptor:Hm,GpuBlendModesToPixi:WE,GpuBufferData:rE,GpuBufferSystem:aE,GpuColorMaskSystem:dE,GpuDeviceSystem:pE,GpuEncoderSystem:mE,GpuGraphicsAdaptor:oM,GpuGraphicsContext:Cl,GpuLimitsSystem:vE,GpuMeshAdapter:cM,GpuMipmapGenerator:iM,GpuProgram:qh,GpuRenderTarget:DE,GpuRenderTargetAdaptor:BE,GpuRenderTargetSystem:FE,GpuShaderSystem:$E,GpuStateSystem:jE,GpuStencilModesToPixi:S_,GpuStencilSystem:bE,GpuTextureSystem:hM,GpuUboSystem:TE,GpuUniformBatchPipe:OE,Graphics:Ff,GraphicsContext:Nu,GraphicsContextRenderData:Ol,GraphicsContextSystem:Rl,GraphicsGpuData:Df,GraphicsPath:tu,GraphicsPipe:Bf,HTMLText:Nm,HTMLTextPipe:Em,HTMLTextRenderData:mm,HTMLTextStyle:um,HTMLTextSystem:xm,HelloSystem:wv,ImageSource:cn,InstructionSet:Oe,Loader:Uo,LoaderParserPriority:Tn,MaskEffectManager:ne,MaskEffectManagerClass:ee,MaskFilter:Sf,Matrix:Mi,MeshGeometry:$f,NEWLINES:Vp,NEWLINES_SET:jp,NEWLINE_MATCH_REGEX:Zp,NEWLINE_SPLIT_REGEX:Qp,NOOP:Vi,NineSliceGeometry:yM,NineSliceSprite:kM,NineSliceSpriteGpuData:TM,NineSliceSpritePipe:IM,ObservablePoint:ai,PI_2:gi,PassthroughFilter:uf,PipelineSystem:NE,PlaneGeometry:bM,Point:_i,Polygon:da,Pool:Ks,PoolGroupClass:Ys,QuadGeometry:pp,RAD_TO_DEG:mi,Rectangle:Di,RenderGroup:Le,RenderGroupPipe:_w,RenderGroupSystem:Kw,RenderTarget:Av,RenderTargetSystem:Pv,RenderTexture:Zw,RenderableGCSystem:_v,RendererInitHook:uo,RendererType:er,ResizePlugin:po,Resolver:Gn,RoundedRectangle:ga,STENCIL_MODES:Aa,SVGParser:pu,SchedulerSystem:fv,Shader:hr,ShaderStage:Wh,ShapePath:Ql,SharedRenderPipes:Ov,SharedSystems:Iv,Sprite:je,SpritePipe:Pw,Spritesheet:Hn,State:ar,StencilMask:sn,StencilMaskPipe:ow,SystemRunner:Jr,Text:jg,TextStyle:Ig,Texture:hs,TextureGCSystem:Ev,TextureMatrix:ns,TexturePool:Pe,TexturePoolClass:xe,TextureSource:Zi,TextureStyle:Ji,Ticker:gn,TickerListener:dn,TickerPlugin:mo,TilingSprite:yp,TilingSpriteGpuData:bp,TilingSpritePipe:Mp,TilingSpriteShader:dp,Transform:qf,UNIFORM_TO_ARRAY_SETTERS:pb,UNIFORM_TO_SINGLE_SETTERS:fb,UNIFORM_TYPES_MAP:Jh,UNIFORM_TYPES_VALUES:Xh,UPDATE_BLEND:2,UPDATE_COLOR:1,UPDATE_PRIORITY:ln,UPDATE_VISIBLE:4,UboBatch:lE,UboSystem:O_,UniformGroup:tr,VERSION:oo,VideoSource:vn,ViewContainer:We,ViewSystem:Cv,ViewableBuffer:ba,WGSL_ALIGN_SIZE_DATA:EE,WGSL_TO_STD40_SIZE:k_,WebGLRenderer:iE,WebGPURenderer:wM,WorkerManager:zu,accessibilityTarget:mh,addBits:Qa,addMaskBounds:ze,addMaskLocalBounds:Ye,addProgramDefines:yh,appendSVGPath:fu,applyMatrix:mp,applyStyleParams:Gb,assignWithIgnore:De,autoDetectRenderer:ro,bgr2rgb:we,bitmapFontCachePlugin:Ao,bitmapFontTextParser:_o,bitmapFontXMLParser:bo,bitmapFontXMLStringParser:Eo,blockDataMap:zE,boundsPool:ae,browserExt:hi,buildAdaptiveBezier:Pl,buildAdaptiveQuadratic:Dl,buildArc:Ul,buildArcTo:Fl,buildArcToSvg:zl,buildCircle:Xc,buildContextBatches:Ml,buildEllipse:Jc,buildLine:el,buildPixelLine:nl,buildPolygon:ol,buildRectangle:al,buildRoundedRectangle:Qc,buildSimpleUvs:jc,buildTriangle:cl,buildUvs:Vc,cacheAsTextureMixin:Xs,cacheTextureArray:Co,calculatePathArea:du,calculateProjection:kv,canUseNewCanvasBlendModes:Jf,canvasUtils:Qf,checkChildrenDidChange:Ee,checkDataUrl:Fo,checkExtension:Ho,checkForNestedPattern:lu,checkMaxIfStatementsInShader:Ca,childrenHelperMixin:Qs,cleanArray:rv,cleanHash:hv,clearList:Gw,closePointEps:Zc,collapseNewlines:hg,collapseSpaces:ng,collectRenderablesMixin:Zs,color32BitToUniform:Nf,colorBit:yc,colorBitGl:Sc,colorMatrixFilterFrag:nf,colorMatrixFilterWgsl:hf,compareModeToGlCompare:Db,compileHighShader:uc,compileHighShaderGl:dc,compileHighShaderGlProgram:Ac,compileHighShaderGpuProgram:Mc,compileHooks:tc,compileInputs:sc,compileOutputs:rc,compileShader:X_,convertToList:_n,copySearchParams:Un,createGlUploadCubeTextureResource:Cb,createGpuUploadCubeTextureResource:JE,createIdFromString:_h,createStringVariations:Nn,createTexture:Du,createUboElementsSTD40:R_,createUboElementsWGSL:ME,createUboSyncFunction:P_,createUboSyncFunctionSTD40:B_,createUboSyncFunctionWGSL:yE,crossOrigin:id,cullingMixin:$s,curveEps:1e-4,defaultFilterVert:ef,defaultValue:Q_,definedProps:zi,deprecation:Wi,detectAvif:Oo,detectCompressed:Dd,detectDefaults:Ro,detectMp4:No,detectOgv:Lo,detectVideoAlphaMode:mn,detectWebm:Do,detectWebp:Go,determineCrossOrigin:ed,earcut:Yr,effectsMixin:he,ensureAttributes:s_,ensureIsBuffer:Wa,ensurePrecision:Sh,ensureTextOptions:Cp,executeInstructions:ww,extensions:ni,extractAttributesFromGlProgram:nb,extractAttributesFromGpuProgram:Hh,extractFontFamilies:Am,extractStructAndGroups:$h,extractSubpaths:uu,extractSvgUrlId:ru,fastCopy:Ea,findMixin:re,fontStringFromTextStyle:bg,fragmentGPUTemplate:wc,fragmentGlTemplate:_c,generateArraySyncSTD40:G_,generateArraySyncWGSL:AE,generateGpuLayoutGroups:Vh,generateLayoutHash:jh,generateProgram:cb,generateShaderSyncCode:z_,generateTextureBatchBit:Oc,generateTextureBatchBitGl:xc,generateTextureMatrix:vl,generateUniformsSync:gb,getAdjustedBlendModeBlend:ya,getAttributeInfoFromFormat:Dh,getBatchSamplersUniformGroup:Dc,getBitmapTextLayout:Xg,getCanvasBoundingBox:Dp,getCanvasFillStyle:Mg,getCanvasTexture:Sv,getCharacterGroups:ag,getDefaultUniformValue:Qh,getFastGlobalBoundsMixin:le,getFontCss:Cm,getFontFamilyName:Yo,getGeometryBounds:Va,getGlTypeFromFormat:a_,getGlobalBounds:ue,getGlobalMixin:ve,getGlobalRenderableBounds:gf,getLocalBounds:_e,getMaxFragmentPrecision:Ah,getMaxMiterRatio:ku,getMaxTexturesPerBatch:Oa,getOrientationOfPoints:tl,getPo2TextureFromSource:Bg,getResolutionOfUrl:Lu,getSVGUrl:Im,getSupportedCompressedTextureFormats:_d,getSupportedGPUCompressedTextureFormats:vd,getSupportedGlCompressedTextureFormats:wd,getSupportedTextureFormats:Md,getTemporaryCanvasFromImage:Om,getTestContext:Mh,getTextureBatchBindGroup:wa,getUboData:hb,getUniformData:rb,getUrlExtension:Bn,glUploadBufferImageResource:Ab,glUploadCompressedTextureResource:Sb,glUploadImageResource:Ib,glUploadVideoResource:xb,globalUniformsBit:bc,globalUniformsBitGl:Ec,gpuUploadBufferImageResource:KE,gpuUploadCompressedTextureResource:qE,gpuUploadImageResource:QE,gpuUploadVideoResource:ZE,groupD8:Pi,hasTagMarkup:Hp,hasTagStyles:Fp,injectBits:oc,insertVersion:Th,isBreakAfterChar:eg,isBreakingSpace:ig,isCollapsibleSpace:sg,isMobile:fh,isNewline:tg,isPow2:Ki,isRenderingToScreen:Rv,isSafari:Mm,isSingleItem:Ln,isWebGLSupported:eo,isWebGPUSupported:no,ktxTranscoderUrls:Td,loadBitmapFont:yo,loadEnvironmentExtensions:dr,loadFontAsBase64:ym,loadFontCSS:Sm,loadImageBitmap:Xu,loadJson:$o,loadKTX2:xd,loadKTX2onWorker:Rd,loadSVGImage:km,loadSvg:Gu,loadTextures:Ju,loadTxt:Wo,loadVideoTextures:hd,loadWebFont:Jo,localUniformBit:np,localUniformBitGl:rp,localUniformBitGroup2:hp,logProgramError:ab,mapCanvasBlendModesToPixi:cw,mapFormatToGlFormat:Bb,mapFormatToGlInternalFormat:Ub,mapFormatToGlType:Fb,mapGlToVertexFormat:eb,mapType:sb,mapViewDimensionToGlTarget:Hb,mapWebGLBlendModesToPixi:vb,maskFrag:Ef,maskVert:Mf,maskWgsl:Af,matrixPool:oe,measureHtmlText:wm,measureMixin:Ae,measureTaggedText:lg,mipmapScaleModeToGlFilter:Nb,multiplyColors:me,multiplyHexColors:pe,nextPow2:ji,nonCompressedFormats:bd,normalizeExtensionPriority:ei,onRenderMixin:ye,parseSVGDefinitions:eu,parseSVGFloatAttribute:su,parseSVGPath:ha,parseSVGStyle:au,parseTaggedText:Wp,passthroughFrag:af,passthroughWgsl:cf,path:xn,preloadVideo:sd,removeItems:Js,removeStructAndGroupDuplicates:Kh,resolveCharacters:tm,resolveCompressedTextureUrl:Nd,resolveJsonUrl:od,resolveTextureUrl:rd,resourceToTexture:yn,roundPixelsBit:Pc,roundPixelsBitGl:Nc,roundedShapeArc:Yl,roundedShapeQuadraticCurve:ql,sayHello:gv,scaleModeToGlFilter:Pb,setPositions:gp,setProgramName:Oh,setUvs:wp,shapeBuilders:_l,sortMixin:Se,spritesheetAsset:Vn,squaredDistanceToLineSegment:la,stripVersion:kh,styleAttributes:ou,testImageFormat:Io,testVideoFormat:Po,textStyleToCSS:nm,textureBit:Vm,textureBitGl:jm,textureFrom:Sn,tilingBit:op,tilingBitGl:ap,toFillStyle:Iu,toLocalGlobalMixin:Ce,toStrokeStyle:Ou,tokenize:og,tokenizeTaggedRuns:dg,transformVertices:Kc,triangulateWithHoles:hl,trimRight:rg,uboSyncFunctionsSTD40:L_,uboSyncFunctionsWGSL:D_,uid:Bi,uniformParsers:x_,unsafeEvalSupported:pr,updateQuadBounds:rs,updateRenderGroupTransform:Fw,updateRenderGroupTransforms:Uw,updateTextBounds:kg,updateTransformAndChildren:Hw,updateTransformBackwards:fe,v8_0_0:Fi,v8_3_4:Hi,validFormats:Pd,validateRenderables:Ww,vertexGPUTemplate:mc,vertexGlTemplate:vc,warn:Vs,webworkerExt:ri,wordWrap:gg,wordWrapTaggedLines:ug,wrapModeToGlAddress:Lb} + __proto__:null,AbstractBitmapFont:pw,AbstractRenderer:ho,AbstractText:zp,AbstractTextSystem:ow,AccessibilitySystem:vh,AlphaMask:tn,AlphaMaskPipe:mm,AnimatedSprite:fp,Application:bo,ApplicationInitHook:fo,Assets:fd,AssetsClass:dd,BLEND_TO_NPM:Sa,BREAKING_SPACES:fg,BREAKING_SPACES_SET:pg,BREAK_AFTER_CHARS:mg,BREAK_AFTER_CHARS_SET:vg,BUFFER_TYPE:w_,BackgroundLoader:Io,BackgroundSystem:gv,Batch:Da,BatchGeometry:tc,BatchTextureArray:Na,BatchableGraphics:Qc,BatchableHTMLText:Fw,BatchableMesh:hp,BatchableSprite:Zg,BatchableText:iw,Batcher:Wa,BatcherPipe:lm,BigPool:Qs,BindGroup:hr,BindGroupSystem:Sb,BitmapFont:hE,BitmapFontManager:Aw,BlendModePipe:ev,BlurFilter:mf,BlurFilterPass:gf,Bounds:ds,BrowserAdapter:rn,Buffer:ja,BufferImageSource:ns,BufferResource:fM,BufferUsage:Va,CLEAR:Qr,COLLAPSIBLE_SPACES:gg,COLLAPSIBLE_SPACES_SET:wg,Cache:An,CanvasBatchAdaptor:em,CanvasColorMaskPipe:_m,CanvasContextSystem:Pm,CanvasGraphicsAdaptor:Qm,CanvasGraphicsContextSystem:Kf,CanvasGraphicsPipe:Yf,CanvasLimitsSystem:Lm,CanvasNineSliceSpritePipe:qy,CanvasObserver:qn,CanvasPool:Jp,CanvasPoolClass:Xp,CanvasRenderTargetAdaptor:s_,CanvasRenderTargetSystem:n_,CanvasRenderer:p_,CanvasRendererTextSystem:cw,CanvasSource:ln,CanvasStencilMaskPipe:Tm,CanvasTextGenerator:zg,CanvasTextMetrics:Ug,CanvasTextPipe:ew,CanvasTextSystem:uw,CanvasTextureSystem:r_,CanvasTilingSpritePipe:Ap,Circle:la,Color:Vs,ColorMask:en,ColorMaskPipe:bm,ColorMatrixFilter:bf,CompressedSource:_d,Container:Ve,CustomRenderPipe:Gm,DEG_TO_RAD:Mi,DOMAdapter:an,DOMPipe:Hd,DefaultBatcher:Vc,DefaultShader:$c,DynamicBitmapFont:ww,Ellipse:da,EventBoundary:tf,EventEmitter:wi,EventSystem:nf,EventsTicker:Vd,ExtensionType:ni,ExtractSystem:vv,FederatedContainer:hf,FederatedEvent:Jn,FederatedMouseEvent:Kd,FederatedPointerEvent:Yd,FederatedWheelEvent:Xd,FillGradient:gl,FillPattern:bu,Filter:fr,FilterEffect:ne,FilterPipe:Cf,FilterSystem:Lf,FontStylePromiseCache:zw,GAUSSIAN_VALUES:of,GCManagedHash:Kc,GCSystem:Iv,GL_FORMATS:S_,GL_TARGETS:T_,GL_TYPES:C_,GPUTextureGpuData:Ay,GenerateTextureSystem:Sv,Geometry:Xa,GlBackBufferSystem:G_,GlBatchAdaptor:hm,GlBuffer:v_,GlBufferSystem:M_,GlColorMaskSystem:U_,GlContextSystem:y_,GlEncoderSystem:$_,GlGeometryGpuData:x_,GlGeometrySystem:N_,GlGraphicsAdaptor:db,GlLimitsSystem:W_,GlMeshAdaptor:pb,GlProgram:Gh,GlProgramData:wM,GlRenderTarget:j_,GlRenderTargetAdaptor:cM,GlRenderTargetSystem:uM,GlShaderSystem:PM,GlStateSystem:$M,GlStencilSystem:Y_,GlTexture:WM,GlTextureSystem:lb,GlUboSystem:oM,GlUniformGroupSystem:BM,GlobalResourceRegistry:Ys,GlobalUniformSystem:Rv,GpuBatchAdaptor:am,GpuBlendModesToPixi:ly,GpuBufferData:Cb,GpuBufferSystem:Ib,GpuColorMaskSystem:Pb,GpuDeviceSystem:Lb,GpuEncoderSystem:Gb,GpuGraphicsAdaptor:Oy,GpuGraphicsContext:kl,GpuLimitsSystem:Ub,GpuMeshAdapter:ky,GpuMipmapGenerator:yy,GpuProgram:Qh,GpuRenderTarget:ey,GpuRenderTargetAdaptor:hy,GpuRenderTargetSystem:oy,GpuShaderSystem:cy,GpuStateSystem:dy,GpuStencilModesToPixi:K_,GpuStencilSystem:$b,GpuTextureSystem:Ty,GpuUboSystem:zb,GpuUniformBatchPipe:Xb,Graphics:ip,GraphicsContext:Gu,GraphicsContextRenderData:xl,GraphicsContextSystem:Nl,GraphicsGpuData:Jf,GraphicsPath:eu,GraphicsPipe:Zf,HTMLText:im,HTMLTextPipe:Hw,HTMLTextRenderData:Gw,HTMLTextStyle:xw,HTMLTextSystem:Zw,HelloSystem:Bv,ImageSource:dn,InstructionSet:xe,Loader:Ho,LoaderParserPriority:In,MaskEffectManager:oe,MaskEffectManagerClass:re,MaskFilter:Ff,Matrix:Si,Mesh:up,MeshGeometry:ep,MeshGpuData:op,MeshPipe:cp,MeshPlane:Wy,MeshRope:zy,NEWLINES:ug,NEWLINES_SET:dg,NEWLINE_MATCH_REGEX:Mg,NEWLINE_SPLIT_REGEX:_g,NOOP:zi,NineSliceGeometry:Jy,NineSliceSprite:eE,NineSliceSpriteGpuData:Zy,NineSliceSpritePipe:iE,ObservablePoint:ui,PI_2:vi,PassthroughFilter:Sf,PipelineSystem:iy,PlaneGeometry:$y,Point:yi,Polygon:ga,Pool:qs,PoolGroupClass:Js,QuadGeometry:Lp,RAD_TO_DEG:_i,Rectangle:Ui,RenderGroup:Be,RenderGroupPipe:Fm,RenderGroupSystem:fv,RenderTarget:Vv,RenderTargetSystem:t_,RenderTexture:Mv,RenderableGCSystem:Fv,RendererInitHook:go,RendererType:rr,ResizePlugin:mo,Resolver:Fn,RopeGeometry:jy,RoundedRectangle:va,STENCIL_MODES:Ta,SVGParser:mu,SchedulerSystem:Nv,Shader:ar,ShaderStage:Kh,ShapePath:iu,SharedRenderPipes:Xv,SharedSystems:qv,Sprite:Ye,SpritePipe:tv,Spritesheet:Vn,State:ur,StencilMask:hn,StencilMaskPipe:Om,SystemRunner:to,Text:dw,TextStyle:qg,Texture:as,TextureGCSystem:Hv,TextureMatrix:os,TexturePool:De,TexturePoolClass:Le,TextureSource:ss,TextureStyle:ts,Ticker:vn,TickerListener:gn,TickerPlugin:_o,TilingSprite:jp,TilingSpriteGpuData:$p,TilingSpritePipe:Wp,TilingSpriteShader:Pp,Transform:wp,UNIFORM_TO_ARRAY_SETTERS:LM,UNIFORM_TO_SINGLE_SETTERS:NM,UNIFORM_TYPES_MAP:tr,UNIFORM_TYPES_VALUES:Zh,UPDATE_BLEND:2,UPDATE_COLOR:1,UPDATE_PRIORITY:fn,UPDATE_VISIBLE:4,UboBatch:Rb,UboSystem:X_,UniformGroup:er,VERSION:lo,VideoSource:bn,ViewContainer:Ke,ViewSystem:Yv,ViewableBuffer:Ea,WGSL_ALIGN_SIZE_DATA:Hb,WGSL_TO_STD40_SIZE:J_,WebGLRenderer:yb,WebGPURenderer:By,WorkerManager:Xu,accessibilityTarget:_h,addBits:ic,addMaskBounds:Xe,addMaskLocalBounds:Je,addProgramDefines:Ch,appendSVGPath:wu,applyMatrix:Gp,applyStyleParams:nb,assignWithIgnore:Ue,autoDetectRenderer:co,bgr2rgb:Me,bitmapFontCachePlugin:To,bitmapFontTextParser:yo,bitmapFontXMLParser:Eo,bitmapFontXMLStringParser:Ao,blockDataMap:py,blurTemplateWgsl:df,boundsPool:ue,browserExt:ai,buildAdaptiveBezier:Dl,buildAdaptiveQuadratic:Ul,buildArc:Hl,buildArcTo:Wl,buildArcToSvg:Xl,buildCircle:Zc,buildContextBatches:Sl,buildEllipse:tl,buildLine:rl,buildPixelLine:ol,buildPolygon:ll,buildRectangle:ul,buildRoundedRectangle:il,buildSimpleUvs:Yc,buildTriangle:dl,buildUvs:zc,cacheAsTextureMixin:Zs,cacheTextureArray:ko,calculatePathArea:gu,calculateProjection:Jv,canUseNewCanvasBlendModes:vp,canvasUtils:_p,checkChildrenDidChange:Ae,checkDataUrl:Wo,checkExtension:Vo,checkForNestedPattern:fu,checkMaxIfStatementsInShader:ka,childrenHelperMixin:ie,cleanArray:Cv,cleanHash:Tv,clearList:nv,closePointEps:sl,collapseNewlines:Tg,collapseSpaces:Sg,collectRenderablesMixin:se,color32BitToUniform:qf,colorBit:Cc,colorBitGl:Oc,colorMatrixFilterFrag:vf,colorMatrixFilterWgsl:_f,compareModeToGlCompare:eb,compileHighShader:pc,compileHighShaderGl:gc,compileHighShaderGlProgram:Tc,compileHighShaderGpuProgram:Sc,compileHooks:ec,compileInputs:hc,compileOutputs:cc,compileShader:mM,convertToList:yn,copySearchParams:Hn,createGlUploadCubeTextureResource:YM,createGpuUploadCubeTextureResource:vy,createIdFromString:yh,createStringVariations:Gn,createTexture:Uu,createUboElementsSTD40:Q_,createUboElementsWGSL:Wb,createUboSyncFunction:tM,createUboSyncFunctionSTD40:hM,createUboSyncFunctionWGSL:jb,crossOrigin:nd,cullingMixin:js,curveEps:1e-4,defaultFilterVert:rf,defaultValue:_M,definedProps:Xi,deprecation:Ki,detectAvif:xo,detectCompressed:Ud,detectDefaults:No,detectMp4:Go,detectOgv:Bo,detectVideoAlphaMode:_n,detectWebm:Uo,detectWebp:Fo,determineCrossOrigin:rd,earcut:Jr,effectsMixin:ae,ensureAttributes:E_,ensureIsBuffer:Ka,ensurePrecision:Oh,ensureTextOptions:Yp,executeInstructions:Bm,extensions:oi,extractAttributesFromGlProgram:SM,extractAttributesFromGpuProgram:Vh,extractFontFamilies:Vw,extractStructAndGroups:jh,extractSubpaths:pu,extractSvgUrlId:cu,fastCopy:Aa,findMixin:ce,fontStringFromTextStyle:$g,fragmentGPUTemplate:Mc,fragmentGlTemplate:yc,generateArraySyncSTD40:nM,generateArraySyncWGSL:Vb,generateBlurFragSource:cf,generateBlurGlProgram:uf,generateBlurProgram:ff,generateBlurVertSource:lf,generateGpuLayoutGroups:zh,generateLayoutHash:Yh,generateProgram:kM,generateShaderSyncCode:pM,generateTextureBatchBit:xc,generateTextureBatchBitGl:Lc,generateTextureMatrix:bl,generateUniformsSync:DM,getAdjustedBlendModeBlend:Ca,getAttributeInfoFromFormat:Uh,getBatchSamplersUniformGroup:Uc,getBitmapTextLayout:mw,getCanvasBoundingBox:eg,getCanvasFillStyle:Wg,getCanvasTexture:Kv,getCharacterGroups:Ig,getDefaultUniformValue:ir,getFastGlobalBoundsMixin:fe,getFontCss:Yw,getFontFamilyName:Jo,getGeometryBounds:za,getGlTypeFromFormat:I_,getGlobalBounds:pe,getGlobalMixin:be,getGlobalRenderableBounds:kf,getLocalBounds:ye,getMaxFragmentPrecision:Th,getMaxMiterRatio:Pu,getMaxTexturesPerBatch:xa,getOrientationOfPoints:el,getPo2TextureFromSource:hw,getResolutionOfUrl:Bu,getSVGUrl:qw,getSupportedCompressedTextureFormats:yd,getSupportedGPUCompressedTextureFormats:bd,getSupportedGlCompressedTextureFormats:Md,getSupportedTextureFormats:Sd,getTemporaryCanvasFromImage:Xw,getTestContext:Sh,getTextureBatchBindGroup:Ma,getUboData:TM,getUniformData:CM,getUrlExtension:$n,glUploadBufferImageResource:VM,glUploadCompressedTextureResource:KM,glUploadImageResource:qM,glUploadVideoResource:ZM,globalUniformsBit:Ec,globalUniformsBitGl:Ac,gpuUploadBufferImageResource:fy,gpuUploadCompressedTextureResource:wy,gpuUploadImageResource:_y,gpuUploadVideoResource:My,groupD8:Di,hasTagMarkup:ag,hasTagStyles:og,injectBits:lc,insertVersion:Ih,isBreakAfterChar:Ag,isBreakingSpace:yg,isCollapsibleSpace:Eg,isMobile:wh,isNewline:bg,isPow2:qi,isRenderingToScreen:Qv,isSafari:Ww,isSingleItem:Bn,isWebGLSupported:ro,isWebGPUSupported:oo,ktxTranscoderUrls:Id,loadBitmapFont:Co,loadEnvironmentExtensions:gr,loadFontAsBase64:jw,loadFontCSS:Kw,loadImageBitmap:Zu,loadJson:jo,loadKTX2:Ld,loadKTX2onWorker:Nd,loadSVGImage:Jw,loadSvg:Fu,loadTextures:td,loadTxt:Ko,loadVideoTextures:ad,loadWebFont:ta,localUniformBit:Sp,localUniformBitGl:Cp,localUniformBitGroup2:Tp,logProgramError:IM,mapCanvasBlendModesToPixi:km,mapFormatToGlFormat:hb,mapFormatToGlInternalFormat:rb,mapFormatToGlType:ob,mapGlToVertexFormat:AM,mapType:EM,mapViewDimensionToGlTarget:ab,mapWebGLBlendModesToPixi:UM,maskFrag:Df,maskVert:Gf,maskWgsl:Bf,matrixPool:le,measureHtmlText:Bw,measureMixin:Te,measureTaggedText:Rg,mipmapScaleModeToGlFilter:ib,multiplyColors:_e,multiplyHexColors:me,nextPow2:Yi,nonCompressedFormats:Ed,normalizeExtensionPriority:ri,onRenderMixin:Ce,parseSVGDefinitions:ru,parseSVGFloatAttribute:hu,parseSVGPath:aa,parseSVGStyle:uu,parseTaggedText:lg,passthroughFrag:yf,passthroughWgsl:Ef,path:Ln,pointInTriangle:Of,preloadVideo:hd,removeItems:te,removeStructAndGroupDuplicates:qh,resolveCharacters:bw,resolveCompressedTextureUrl:Gd,resolveJsonUrl:ld,resolveTextureUrl:cd,resourceToTexture:Cn,roundPixelsBit:Dc,roundPixelsBitGl:Gc,roundedShapeArc:Jl,roundedShapeQuadraticCurve:Ql,sayHello:Dv,scaleModeToGlFilter:tb,setPositions:Dp,setProgramName:xh,setUvs:Bp,shapeBuilders:yl,sortMixin:Oe,spritesheetAsset:zn,squaredDistanceToLineSegment:fa,stripVersion:Ph,styleAttributes:lu,testImageFormat:Ro,testVideoFormat:Do,textStyleToCSS:Sw,textureBit:um,textureBitGl:dm,textureFrom:On,tilingBit:Op,tilingBitGl:Ip,toFillStyle:Ru,toLocalGlobalMixin:ke,toStrokeStyle:xu,tokenize:Og,tokenizeTaggedRuns:Pg,transformVertices:qc,triangulateWithHoles:al,trimRight:Cg,uboSyncFunctionsSTD40:sM,uboSyncFunctionsWGSL:eM,uid:$i,uniformParsers:Z_,unsafeEvalSupported:mr,updateQuadBounds:cs,updateRenderGroupTransform:ov,updateRenderGroupTransforms:rv,updateTextBounds:Jg,updateTransformAndChildren:av,updateTransformBackwards:we,v8_0_0:Wi,v8_3_4:Vi,validFormats:Dd,validateRenderables:lv,vertexGPUTemplate:_c,vertexGlTemplate:bc,warn:zs,webworkerExt:ci,wordWrap:Dg,wordWrapTaggedLines:xg,wrapModeToGlAddress:sb}
VersionManager 1 hunks, 1 statements
- qt(Jy,"VersionManager"),Xt(Jy,"gameId","ef2"),Xt(Jy,"appVersion","1.14.97"); + Qt(AS,"VersionManager"),Zt(AS,"gameId","ef2"),Zt(AS,"appVersion","1.15.30");
PetDataManager 1 hunks, 1 statements
- ),gR=(t=>(t.ElfTown5="ElfTown5",t.NWolf="NWolf",t.HorseKnight1="HorseKnight1",t.SkeletonX1="SkeletonX1",t.SkeletonMan1="SkeletonMan1",t.SkeletonMan2="SkeletonMan2",t.SkeletonWarrior1="SkeletonWarrior1",t.GreatHammer1="GreatHammer1",t.ElfArcher1="ElfArcher1",t.HighArcher1="HighArcher1",t.FootMan1="FootMan1",t.Gunner1="Gunner1",t.ElfWarrior1="ElfWarrior1",t.ElfSwordMan1="ElfSwordMan1",t.OrcFighter1="OrcFighter1",t.OrcSpearMan1="OrcSpearMan1",t.OrcHammer1="OrcHammer1",t.OrcHunter1="OrcHunter1",t.OrcIceMage1="OrcIceMage1",t.HeavyWarrior1="HeavyWarrior1",t.HammerKnight1="HammerKnight1",t.PoisonArcher1="PoisonArcher1",t.FireBird1="FireBird1",t.GreenEagle1="GreenEagle1",t.WindMage1="WindMage1",t.OrcFlower="OrcFlower",t.BlackMage1="BlackMage1",t.DarkMage1="DarkMage1",t.Priest1="Priest1",t.Fairy1="Fairy1",t.Ghost1="Ghost1",t.DarkArcher1="DarkArcher1",t.OrcWing1="OrcWing1",t.OrcAxe1="OrcAxe1",t.BigDrumer1="BigDrumer1",t.OrcWolfRider1="OrcWolfRider1",t.OrcBigFoot1="OrcBigFoot1",t.OrcBlizzardMage1="OrcBlizzardMage1",t.FlowerSoldier1="FlowerSoldier1",t.FlowerSoldier2="FlowerSoldier2",t.KingSlime="KingSlime",t.SlimeBlue="SlimeBlue",t.SlimeRed="SlimeRed",t.SlimeYellow="SlimeYellow",t.HammerMole="HammerMole",t.MoleSoldier1="MoleSoldier1",t.MoleSoldier2="MoleSoldier2",t.DarkHermit="DarkHermit",t.Crab="Crab",t.StarFish="StarFish",t.Unicorn1="Unicorn1",t.IceWolf="IceWolf",t.GoldGoblin="GoldGoblin",t.AdsGoblin="AdsGoblin",t.DeathKnight1="DeathKnight1",t.Golem1="Golem1",t.GreatMage1="GreatMage1",t.Ant1="Ant1",t.WolfWarrior1="WolfWarrior1",t.Artillery1="Artillery1",t.Bomber1="Bomber1",t.DeathHand1="DeathHand1",t.SSlime1="SSlime1",t.SSlime2="SSlime2",t.SSlime3="SSlime3",t.OrcIcePhantom1="OrcIcePhantom1",t.Pilot1="Pilot1",t.Spider1="Spider1",t.Spider2="Spider2",t.Boar1="Boar1",t.Boar2="Boar2",t.RoboBomb1="RoboBomb1",t.RoboBomb2="RoboBomb2",t.Frog1="Frog1",t.Frog2="Frog2",t.OrcRapterRider1="OrcRapterRider1",t.WyvernRider1="WyvernRider1",t.DarkNinja1="DarkNinja1",t.Succubus1="Succubus1",t.Druid1="Druid1",t.TigerRider1="TigerRider1",t.GriffinRider1="GriffinRider1",t.SteamPunk1="SteamPunk1",t.Castle0="Castle0",t.Castle1="Castle1",t.Castle2="Castle2",t.WingKnight1="WingKnight1",t.Abyss1="Abyss1",t.Sylphid1="Sylphid1",t.Aladin1="Aladin1",t.Druid2="Druid2",t.BladeMaster1="BladeMaster1",t.CrowKnight1="CrowKnight1",t.Succubus2="Succubus2",t.FireSpirit1="FireSpirit1",t.Naga1="Naga1",t.Medusa1="Medusa1",t.Hippogriff1="Hippogriff1",t.ScorpionKing="ScorpionKing",t.HarpyKing="HarpyKing",t.GolemKing="GolemKing",t.BerialKing="BerialKing",t.DragonKnight="DragonKnight",t))(gR||{ + ),HR=(t=>(t.ElfTown5="ElfTown5",t.NWolf="NWolf",t.HorseKnight1="HorseKnight1",t.SkeletonX1="SkeletonX1",t.SkeletonMan1="SkeletonMan1",t.SkeletonMan2="SkeletonMan2",t.SkeletonWarrior1="SkeletonWarrior1",t.GreatHammer1="GreatHammer1",t.ElfArcher1="ElfArcher1",t.HighArcher1="HighArcher1",t.FootMan1="FootMan1",t.Gunner1="Gunner1",t.ElfWarrior1="ElfWarrior1",t.ElfSwordMan1="ElfSwordMan1",t.OrcFighter1="OrcFighter1",t.OrcSpearMan1="OrcSpearMan1",t.OrcHammer1="OrcHammer1",t.OrcHunter1="OrcHunter1",t.OrcIceMage1="OrcIceMage1",t.HeavyWarrior1="HeavyWarrior1",t.HammerKnight1="HammerKnight1",t.PoisonArcher1="PoisonArcher1",t.FireBird1="FireBird1",t.GreenEagle1="GreenEagle1",t.WindMage1="WindMage1",t.OrcFlower="OrcFlower",t.BlackMage1="BlackMage1",t.DarkMage1="DarkMage1",t.Priest1="Priest1",t.Fairy1="Fairy1",t.Ghost1="Ghost1",t.DarkArcher1="DarkArcher1",t.OrcWing1="OrcWing1",t.OrcAxe1="OrcAxe1",t.BigDrumer1="BigDrumer1",t.OrcWolfRider1="OrcWolfRider1",t.OrcBigFoot1="OrcBigFoot1",t.OrcBlizzardMage1="OrcBlizzardMage1",t.FlowerSoldier1="FlowerSoldier1",t.FlowerSoldier2="FlowerSoldier2",t.KingSlime="KingSlime",t.SlimeBlue="SlimeBlue",t.SlimeRed="SlimeRed",t.SlimeYellow="SlimeYellow",t.HammerMole="HammerMole",t.MoleSoldier1="MoleSoldier1",t.MoleSoldier2="MoleSoldier2",t.DarkHermit="DarkHermit",t.Crab="Crab",t.StarFish="StarFish",t.Unicorn1="Unicorn1",t.IceWolf="IceWolf",t.GoldGoblin="GoldGoblin",t.AdsGoblin="AdsGoblin",t.DeathKnight1="DeathKnight1",t.Golem1="Golem1",t.GreatMage1="GreatMage1",t.Ant1="Ant1",t.WolfWarrior1="WolfWarrior1",t.Artillery1="Artillery1",t.Bomber1="Bomber1",t.DeathHand1="DeathHand1",t.SSlime1="SSlime1",t.SSlime2="SSlime2",t.SSlime3="SSlime3",t.OrcIcePhantom1="OrcIcePhantom1",t.Pilot1="Pilot1",t.Spider1="Spider1",t.Spider2="Spider2",t.Boar1="Boar1",t.Boar2="Boar2",t.RoboBomb1="RoboBomb1",t.RoboBomb2="RoboBomb2",t.Frog1="Frog1",t.Frog2="Frog2",t.EmberRat1="EmberRat1",t.LavaBeetle1="LavaBeetle1",t.CharcoalWolf1="CharcoalWolf1",t.OrcRapterRider1="OrcRapterRider1",t.WyvernRider1="WyvernRider1",t.DarkNinja1="DarkNinja1",t.Succubus1="Succubus1",t.Druid1="Druid1",t.TigerRider1="TigerRider1",t.GriffinRider1="GriffinRider1",t.SteamPunk1="SteamPunk1",t.Castle0="Castle0",t.Castle1="Castle1",t.Castle2="Castle2",t.WingKnight1="WingKnight1",t.Abyss1="Abyss1",t.Sylphid1="Sylphid1",t.Aladin1="Aladin1",t.Druid2="Druid2",t.BladeMaster1="BladeMaster1",t.CrowKnight1="CrowKnight1",t.Succubus2="Succubus2",t.FireSpirit1="FireSpirit1",t.Naga1="Naga1",t.Medusa1="Medusa1",t.Hippogriff1="Hippogriff1",t.ScorpionKing="ScorpionKing",t.HarpyKing="HarpyKing",t.GolemKing="GolemKing",t.BerialKing="BerialKing",t.DragonKnight="DragonKnight",t))(HR||{
RequestManager 1 hunks, 1 statements
- const s=mP.O(); + const s=WP.U();
GameSpeedMode 1 hunks, 1 statements
- qt(mD,"GameSpeedMode"),Xt(mD,"SCALE",1e3),Xt(mD,"_speed",gD(gP.SPEEDMODE_SENTINEL,1e3)),Xt(mD,"guildWarSpeed",null),Xt(mD,"subBattleSpeed",null); + Qt(WD,"GameSpeedMode"),Zt(WD,"SCALE",1e3),Zt(WD,"_speed",HD(HP.SPEEDMODE_SENTINEL,1e3)),Zt(WD,"guildWarSpeed",null),Zt(WD,"subBattleSpeed",null),Zt(WD,"godBlessOff",!1);
AutoTogglePill 1 hunks, 1 statements
- ...OL.DEFAULT_FONT_OPTION_15,fontSize:t.FONT_SIZE,lineHeight:t.PILL_H} + ...sD.DEFAULT_FONT_OPTION_15,fontSize:t.FONT_SIZE,lineHeight:t.PILL_H}
BattleAutoController 1 hunks, 1 statements
+ if(Ydi.getInstance().isRealmIntroHolding)return;
UnitFactory 1 hunks, 1 statements
- [gR.NWolf]:k1,[gR.BlackMage1]:$1,[gR.SkeletonX1]:Q1,[gR.SkeletonMan1]:K1,[gR.SkeletonMan2]:Y1,[gR.SkeletonWarrior1]:X1,[gR.GreatHammer1]:V1,[gR.Ghost1]:l2,[gR.DarkMage1]:n2,[gR.DarkArcher1]:d2,[gR.Bomber1]:m5,[gR.DeathHand1]:v5,[gR.DarkNinja1]:X5,[gR.Succubus1]:a3,[gR.Abyss1]:m3,[gR.CrowKnight1]:T3,[gR.Succubus2]:I3,[gR.FireSpirit1]:d1,[gR.Naga1]:p1,[gR.Medusa1]:m1,[gR.Hippogriff1]:v1,[gR.FootMan1]:b1,[gR.Gunner1]:M1,[gR.HeavyWarrior1]:T1,[gR.HammerKnight1]:y1,[gR.HorseKnight1]:I1,[gR.FireBird1]:l1,[gR.Priest1]:r2,[gR.GriffinRider1]:Q5,[gR.SteamPunk1]:s3,[gR.WingKnight1]:t3,[gR.Aladin1]:b3,[gR.ElfArcher1]:t2,[gR.HighArcher1]:r1,[gR.ElfWarrior1]:n1,[gR.ElfSwordMan1]:s1,[gR.PoisonArcher1]:a1,[gR.GreenEagle1]:Y0,[gR.WindMage1]:s2,[gR.Fairy1]:a2,[gR.Druid1]:n3,[gR.Druid2]:M3,[gR.TigerRider1]:r3,[gR.Sylphid1]:v3,[gR.OrcFighter1]:x1,[gR.OrcHunter1]:D1,[gR.OrcIceMage1]:B1,[gR.OrcWing1]:p2,[gR.OrcHammer1]:N1,[gR.OrcAxe1]:m2,[gR.OrcSpearMan1]:F1,[gR.BigDrumer1]:v2,[gR.OrcWolfRider1]:b2,[gR.OrcBigFoot1]:t5,[gR.OrcBlizzardMage1]:s5,[gR.OrcIcePhantom1]:T5,[gR.OrcRapterRider1]:K5,[gR.WyvernRider1]:Y5,[gR.BladeMaster1]:y3,[gR.ElfTown5]:Q0,[gR.OrcFlower]:t1,[gR.FlowerSoldier1]:y2,[gR.FlowerSoldier2]:M2,[gR.KingSlime]:T2,[gR.SlimeBlue]:I2,[gR.SlimeRed]:k2,[gR.SlimeYellow]:x2,[gR.HammerMole]:N2,[gR.MoleSoldier1]:B2,[gR.MoleSoldier2]:D2,[gR.DarkHermit]:F2,[gR.Crab]:$2,[gR.StarFish]:V2,[gR.Unicorn1]:K2,[gR.IceWolf]:Y2,[gR.GoldGoblin]:X2,[gR.AdsGoblin]:Q2,[gR.DeathKnight1]:n5,[gR.Golem1]:r5,[gR.GreatMage1]:a5,[gR.Ant1]:l5,[gR.WolfWarrior1]:d5,[gR.Artillery1]:p5,[gR.SSlime1]:b5,[gR.SSlime2]:M5,[gR.SSlime3]:y5,[gR.Pilot1]:I5,[gR.Spider1]:N5,[gR.Spider2]:D5,[gR.Boar1]:x5,[gR.Boar2]:k5,[gR.RoboBomb1]:F5,[gR.RoboBomb2]:B5,[gR.Frog1]:$5,[gR.Frog2]:V5,[gR.Castle0]:p3,[gR.Castle1]:d3,[gR.Castle2]:l3,[gR.ScorpionKing]:D3,[gR.HarpyKing]:B3,[gR.GolemKing]:F3,[gR.BerialKing]:V3,[gR.DragonKnight]:Y3} + [HR.NWolf]:E2,[HR.BlackMage1]:L2,[HR.SkeletonX1]:j2,[HR.SkeletonMan1]:U2,[HR.SkeletonMan2]:$2,[HR.SkeletonWarrior1]:W2,[HR.GreatHammer1]:G2,[HR.Ghost1]:e5,[HR.DarkMage1]:J2,[HR.DarkArcher1]:h5,[HR.Bomber1]:c3,[HR.DeathHand1]:u3,[HR.DarkNinja1]:q3,[HR.Succubus1]:o6,[HR.Abyss1]:g6,[HR.CrowKnight1]:S6,[HR.Succubus2]:C6,[HR.FireSpirit1]:h2,[HR.Naga1]:o2,[HR.Medusa1]:c2,[HR.Hippogriff1]:u2,[HR.FootMan1]:f2,[HR.Gunner1]:g2,[HR.HeavyWarrior1]:_2,[HR.HammerKnight1]:m2,[HR.HorseKnight1]:b2,[HR.FireBird1]:e2,[HR.Priest1]:Z2,[HR.GriffinRider1]:J3,[HR.SteamPunk1]:i6,[HR.WingKnight1]:Z3,[HR.Aladin1]:_6,[HR.ElfArcher1]:z2,[HR.HighArcher1]:Z1,[HR.ElfWarrior1]:J1,[HR.ElfSwordMan1]:q1,[HR.PoisonArcher1]:i2,[HR.GreenEagle1]:$1,[HR.WindMage1]:q2,[HR.Fairy1]:i5,[HR.Druid1]:e6,[HR.Druid2]:b6,[HR.TigerRider1]:h6,[HR.Sylphid1]:m6,[HR.OrcFighter1]:S2,[HR.OrcHunter1]:I2,[HR.OrcIceMage1]:R2,[HR.OrcWing1]:o5,[HR.OrcHammer1]:C2,[HR.OrcAxe1]:c5,[HR.OrcSpearMan1]:P2,[HR.BigDrumer1]:u5,[HR.OrcWolfRider1]:f5,[HR.OrcBigFoot1]:z5,[HR.OrcBlizzardMage1]:q5,[HR.OrcIcePhantom1]:_3,[HR.OrcRapterRider1]:j3,[HR.WyvernRider1]:z3,[HR.BladeMaster1]:E6,[HR.ElfTown5]:j1,[HR.OrcFlower]:z1,[HR.FlowerSoldier1]:m5,[HR.FlowerSoldier2]:g5,[HR.KingSlime]:_5,[HR.SlimeBlue]:b5,[HR.SlimeRed]:E5,[HR.SlimeYellow]:S5,[HR.HammerMole]:C5,[HR.MoleSoldier1]:R5,[HR.MoleSoldier2]:I5,[HR.DarkHermit]:P5,[HR.Crab]:L5,[HR.StarFish]:G5,[HR.Unicorn1]:U5,[HR.IceWolf]:$5,[HR.GoldGoblin]:W5,[HR.AdsGoblin]:j5,[HR.DeathKnight1]:J5,[HR.Golem1]:Z5,[HR.GreatMage1]:i3,[HR.Ant1]:e3,[HR.WolfWarrior1]:h3,[HR.Artillery1]:o3,[HR.SSlime1]:f3,[HR.SSlime2]:g3,[HR.SSlime3]:m3,[HR.Pilot1]:b3,[HR.Spider1]:C3,[HR.Spider2]:I3,[HR.Boar1]:S3,[HR.Boar2]:E3,[HR.RoboBomb1]:P3,[HR.RoboBomb2]:R3,[HR.Frog1]:L3,[HR.Frog2]:G3,[HR.EmberRat1]:U3,[HR.LavaBeetle1]:$3,[HR.CharcoalWolf1]:W3,[HR.Castle0]:f6,[HR.Castle1]:u6,[HR.Castle2]:c6,[HR.ScorpionKing]:L6,[HR.HarpyKing]:G6,[HR.GolemKing]:U6,[HR.BerialKing]:W6,[HR.DragonKnight]:z6}
ToolTipBase 1 hunks, 1 statements
- this.parent&&this.parent.removeChild(this); + this.parent&&this.parent.removeChild(this),this.widthMax=570;
Sr 1 hunks, 1 statements
- ...t,...$st(i)} + ...t,...Vet(i)}
Fr 1 hunks, 1 statements
- const met=F9,wet=set,vet=U9,_et=16,bet=new Uint8Array(_et); + const mnt=Ftt,vnt=nnt,_nt=Utt,Mnt=16,bnt=new Uint8Array(Mnt);
Ma 1 hunks, 1 statements
- ...iot,coercer:qt((t,i)=>frt(t,sot)?iot.coercer(eot(t,i),i):iot.coercer(t,i),"coercer")} + ...iat,coercer:Qt((t,i)=>fot(t,sat)?iat.coercer(eat(t,i),i):iat.coercer(t,i),"coercer")}
El 1 hunks, 1 statements
- ...lt._defaultState} + ...ft._defaultState}
Yp 1 hunks, 1 statements
- const e=126,n=[71,73,70,56,55,97,...i,246,0,0,255,255,255,...Gpt(381,0),44,0,0,0,0,...i,0,7],h=Math.floor(s.length/e); + const e=126,n=[71,73,70,56,55,97,...i,246,0,0,255,255,255,...Ggt(381,0),44,0,0,0,0,...i,0,7],h=Math.floor(s.length/e);
SuiStandardProvider 1 hunks, 1 statements
- namespace:YMt.NameSpaceKeyEip155,addresses:i,methods:[...JMt.Eip55Methods],extra:s} + namespace:YEt.NameSpaceKeyEip155,addresses:i,methods:[...JEt.Eip55Methods],extra:s}
AppReadyEvent 1 hunks, 1 statements
- return _yt||(_yt=[...fyt]),_yt} + return _St||(_St=[...fSt]),_St}
SolProvider 1 hunks, 1 statements
- namespace:yTt.NameSpaceKeySOL,addresses:i,methods:[...ITt.SOLANAMethods],extra:s} + namespace:ACt.NameSpaceKeySOL,addresses:i,methods:[...OCt.SOLANAMethods],extra:s}
OkxwalletInjectConnector 1 hunks, 1 statements
- namespace:sCt.NameSpaceKeyBtc,addresses:i,methods:[...nCt.BtcMethods],extra:s} + namespace:sOt.NameSpaceKeyBtc,addresses:i,methods:[...nOt.BtcMethods],extra:s}
TcRootElement 1 hunks, 1 statements
- return QGt()||(t.push(new pgt.OKXAppConnector),t.push(new pgt.OKXWalletAppConnector)),XGt()&&t.push(new pgt.OkxwalletInjectConnector),t.push(...tBt()),t} + return QBt()||(t.push(new pwt.OKXAppConnector),t.push(new pwt.OKXWalletAppConnector)),XBt()&&t.push(new pwt.OkxwalletInjectConnector),t.push(...tUt()),t}
WalletSelectPopup 1 hunks, 1 statements
- ...OL.ERROR_POPUP_LABEL_OPTION,fontSize:18} + ...sD.ERROR_POPUP_LABEL_OPTION,fontSize:18}
CheckBox 1 hunks, 1 statements
- ),this.bg.width=this.bg.height=24,this.bg.eventMode="none",this.addChild(this.bg),this.check=new je(eS.getTexture("UI_Ekkorr","Icon_Check_Green")),this.check.scale=.85,this.check.eventMode="none",this.check.x=.5*(this.bg.width-this.check.width)+2,this.check.y=this.bg.height-this.check.height-4,this.addChild(this.check),this.customHitArea=new je(eS.getTexture("UI_Ekkorr","Base_Tooltip")),this.customHitArea.tint=1708562,this.customHitArea.alpha=.1,this.customHitArea.x=-this.customHitAreaOffset,this.customHitArea.y=-this.customHitAreaOffset,this.customHitArea.width=this.bg.width+2*this.customHitAreaOffset,this.customHitArea.height=this.bg.height+2*this.customHitAreaOffset,this.addChildAt(this.customHitArea,0),this.customHitArea.eventMode="dynamic",this.customHitArea.on("pointertap",this.onTap,this),this.selected=!1,this.colorMatrix=new of,this.colorMatrix.blackAndWhite(!0)} + ),this.bg.width=this.bg.height=24,this.bg.eventMode="none",this.addChild(this.bg),this.check=new Ye(kS.getTexture("UI_Ekkorr","Icon_Check_Green")),this.check.scale=.85,this.check.eventMode="none",this.check.x=.5*(this.bg.width-this.check.width)+2,this.check.y=this.bg.height-this.check.height-4,this.addChild(this.check),this.customHitArea=new Ye(kS.getTexture("UI_Ekkorr","Base_Tooltip")),this.customHitArea.tint=1708562,this.customHitArea.alpha=.1,this.customHitArea.x=-this.customHitAreaOffset,this.customHitArea.y=-this.customHitAreaOffset,this.customHitArea.width=this.bg.width+2*this.customHitAreaOffset,this.customHitArea.height=this.bg.height+2*this.customHitAreaOffset,this.addChildAt(this.customHitArea,0),this.customHitArea.eventMode="dynamic",this.customHitArea.on("pointertap",this.onTap,this),this.selected=!1,this.colorMatrix=new bf,this.colorMatrix.blackAndWhite(!0)}
LoginButton 1 hunks, 1 statements
- super(i,s),Xt(this,"iconPlat",new je),Xt(this,"lbl"),this.iconPlat.texture=this.getTexture(`Icon_${ + super("Button_Login","UI_Ekkorr2"),Zt(this,"iconPlat",new Ye),Zt(this,"lbl"),this.iconPlat.texture=this.getTexture(`Icon_${
MissionGuideDataManager 1 hunks, 1 statements
- Xt(this,"currentMissionId",1),Xt(this,"rewardPending",!1),Xt(this,"missionList",[]),Xt(this,"stepList",[]),Xt(this,"petStep",0)} + Zt(this,"currentMissionId",1),Zt(this,"rewardPending",!1),Zt(this,"missionList",[]),Zt(this,"stepList",[]),Zt(this,"petStep",0),Zt(this,"mineStep",0)}
AttackEffectManager 1 hunks, 1 statements
- const nZt=qt(t=>Math.max(1,Math.round(60*t)),"frames"); + const f0t=Qt(t=>Math.max(1,Math.round(60*t)),"frames$1");
BaseBattleController 1 hunks, 1 statements
- Xt(this,"attackEffects",new oZt(this)),Xt(this,"player"),Xt(this,"friendList",[]),Xt(this,"enemyList",[]),Xt(this,"weaponList",[]),Xt(this,"effectList",[]),Xt(this,"unitScale",1),Xt(this,"sortCooldown",0),Xt(this,"SORT_INTERVAL",15),Xt(this,"frameTime",0),Xt(this,"avgFrameTime",0),Xt(this,"frameCount",0),Xt(this,"PERFORMANCE_LOG_INTERVAL",300),Xt(this,"killCount",0),Xt(this,"battleTime",0),Xt(this,"totalDamageDealt",0),Xt(this,"totalDamageTaken",0),Xt(this,"nextSummonedUnitId",1e6),Xt(this,"random",new iZt(Date.now())),Xt(this,"determinismCaptureEnabled",!1),Xt(this,"frameHashes",[]),Xt(this,"eventHashes",[]),Xt(this,"FRAME_HASH_INTERVAL",60),Xt(this,"execute",qt(()=>{ + Zt(this,"attackEffects",new w0t(this)),Zt(this,"player"),Zt(this,"friendList",[]),Zt(this,"enemyList",[]),Zt(this,"weaponList",[]),Zt(this,"effectList",[]),Zt(this,"unitScale",1),Zt(this,"hitFlash",!1),Zt(this,"attackSfxChance",.1),Zt(this,"dieSfxChance",.1),Zt(this,"sortCooldown",0),Zt(this,"SORT_INTERVAL",15),Zt(this,"frameTime",0),Zt(this,"avgFrameTime",0),Zt(this,"frameCount",0),Zt(this,"PERFORMANCE_LOG_INTERVAL",300),Zt(this,"killCount",0),Zt(this,"battleTime",0),Zt(this,"totalDamageDealt",0),Zt(this,"totalDamageTaken",0),Zt(this,"nextSummonedUnitId",1e6),Zt(this,"random",new l0t(Date.now())),Zt(this,"determinismCaptureEnabled",!1),Zt(this,"frameHashes",[]),Zt(this,"eventHashes",[]),Zt(this,"FRAME_HASH_INTERVAL",60),Zt(this,"execute",Qt(()=>{
WaveCallInfo 1 hunks, 1 statements
- return this.visible&&!0===(null==(t=this.parent)?void 0:t.visible)&&!XD.isSoulResting} + return this.visible&&!0===(null==(t=this.parent)?void 0:t.visible)&&!EG.isSoulResting&&Ydi.getInstance().canCallNextWave()}
BuffStatusPopup 1 hunks, 1 statements
- if(n)if(t=[...UR.getInstance().getContributors(o)],o===GR.GodBless){ + if(n)if(t=[...dx.getInstance().getContributors(o)],o===lx.GodBless){
FavoritePetSubView 1 hunks, 1 statements
- const t=[...WD.getInstance().favoritePets].sort((t,i)=>{ + const t=[...wG.getInstance().favoritePets].sort((t,i)=>{
MineMain 1 hunks, 1 statements
- return(null==i?void 0:i.success)&&(AB.getInstance().setStatusData(null==(t=i.body)?void 0:t.status),AB.getInstance().clearInstance(),this.syncRewardManagers(i.body)),this.gameEnded=!0,i} + return(null==i?void 0:i.success)&&(XB.getInstance().setStatusData(null==(t=i.body)?void 0:t.status),XB.getInstance().clearInstance(),this.syncRewardManagers(i.body)),this.gameEnded=!0,qqt.getInstance().mineStep=2,i}
TreasureSubView 1 hunks, 1 statements
- const t=[...JR.getInstance().equipedList]; + const t=[...Ax.getInstance().equipedList];
GuildBarracksRaceView 1 hunks, 1 statements
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:i} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:i}
GuildCheckBox 1 hunks, 1 statements
- ),this.bg.width=this.bg.height=24,this.bg.eventMode="none",this.addChild(this.bg),this.check=new je(eS.getTexture("UI_Guild","Base_Check02")),this.check.scale=.85,this.check.eventMode="none",this.check.x=.5*(this.bg.width-this.check.width)+2,this.check.y=this.bg.height-this.check.height-2,this.addChild(this.check),this.customHitArea=new je(eS.getTexture("UI_Guild","whiteRect")),this.customHitArea.tint=1708562,this.customHitArea.alpha=.1,this.customHitArea.x=-this.customHitAreaOffset,this.customHitArea.y=-this.customHitAreaOffset,this.customHitArea.width=this.bg.width+2*this.customHitAreaOffset,this.customHitArea.height=this.bg.height+2*this.customHitAreaOffset,this.addChildAt(this.customHitArea,0),this.customHitArea.eventMode="dynamic",this.customHitArea.on("pointertap",this.onTap,this),this.selected=!1,this.colorMatrix=new of,this.colorMatrix.blackAndWhite(!0)} + ),this.bg.width=this.bg.height=24,this.bg.eventMode="none",this.addChild(this.bg),this.check=new Ye(kS.getTexture("UI_Guild","Base_Check02")),this.check.scale=.85,this.check.eventMode="none",this.check.x=.5*(this.bg.width-this.check.width)+2,this.check.y=this.bg.height-this.check.height-2,this.addChild(this.check),this.customHitArea=new Ye(kS.getTexture("UI_Guild","whiteRect")),this.customHitArea.tint=1708562,this.customHitArea.alpha=.1,this.customHitArea.x=-this.customHitAreaOffset,this.customHitArea.y=-this.customHitAreaOffset,this.customHitArea.width=this.bg.width+2*this.customHitAreaOffset,this.customHitArea.height=this.bg.height+2*this.customHitAreaOffset,this.addChildAt(this.customHitArea,0),this.customHitArea.eventMode="dynamic",this.customHitArea.on("pointertap",this.onTap,this),this.selected=!1,this.colorMatrix=new bf,this.colorMatrix.blackAndWhite(!0)}
GuildMainSubView 1 hunks, 1 statements
- const i=[...QL.guildList].sort((t,i)=>{ + const i=[...SD.guildList].sort((t,i)=>{
GuildRaidBattleReadyPopup 1 hunks, 1 statements
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:13} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:13}
GuildWarActiveItemRenderer 1 hunks, 1 statements
- super(),Xt(this,"bg"),Xt(this,"myEmblem"),Xt(this,"oppEmblem"),Xt(this,"lblMyName"),Xt(this,"lblMyLv"),Xt(this,"lblMyRank"),Xt(this,"lblMyEloValue"),Xt(this,"iconVs"),Xt(this,"lblOppName"),Xt(this,"lblOppLv"),Xt(this,"lblOppRank"),Xt(this,"lblOppEloValue"),Xt(this,"lblScore"),Xt(this,"iconClock"),Xt(this,"lblEndsIn"),Xt(this,"btnAttack"),Xt(this,"ticketIcons",[]),Xt(this,"ticketDimFilter",new of),this.ticketDimFilter.desaturate(),this.bg=new aU,this.bg.setIndex(2),this.bg.width=t.ROW_W,this.bg.height=t.ROW_H,this.addChild(this.bg),this.myEmblem=new tii,this.myEmblem.scale.set(t.EMBLEM_SCALE),this.myEmblem.x=t.PAD,this.myEmblem.y=10,this.addChild(this.myEmblem),this.oppEmblem=new tii,this.oppEmblem.scale.set(t.EMBLEM_SCALE),this.oppEmblem.x=t.OPP_EMBLEM_X,this.oppEmblem.y=10,this.addChild(this.oppEmblem),this.lblMyLv=new SD("",14531464,OL.DEFAULT_FONT_OPTION_16),this.addChild(this.lblMyLv),this.lblOppLv=new SD("",14531464,OL.DEFAULT_FONT_OPTION_16),this.addChild(this.lblOppLv),this.lblMyName=new SD("",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_17),this.lblMyName.textColor=OL.DEFAULT_COLOR,this.lblMyName.x=t.LEFT_TEXT_X,this.lblMyName.y=14,this.addChild(this.lblMyName),this.lblOppName=new SD("",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_17),this.lblOppName.textColor=OL.DEFAULT_COLOR,this.lblOppName.y=14,this.addChild(this.lblOppName),this.lblMyRank=new SD("",16750899,OL.DEFAULT_OUTLINE_FONT_OPTION_16),this.lblMyRank.x=t.LEFT_TEXT_X,this.lblMyRank.y=36,this.addChild(this.lblMyRank),this.lblOppRank=new SD("",16750899,OL.DEFAULT_OUTLINE_FONT_OPTION_16),this.lblOppRank.y=36,this.addChild(this.lblOppRank),this.lblMyEloValue=new SD("",16750899,OL.DEFAULT_OUTLINE_FONT_OPTION_18),this.lblMyEloValue.textColor=16750899,this.lblMyEloValue.x=t.LEFT_TEXT_X,this.lblMyEloValue.y=58,this.addChild(this.lblMyEloValue),this.lblOppEloValue=new SD("",16750899,OL.DEFAULT_OUTLINE_FONT_OPTION_18),this.lblOppEloValue.textColor=16750899,this.lblOppEloValue.y=58,this.addChild(this.lblOppEloValue),this.iconVs=new je(eS.getTexture("UI_Ekkorr","UI_VS")),this.iconVs.scale.set(.506),this.iconVs.y=8,this.addChild(this.iconVs),this.lblScore=new SD("",16750899,OL.DEFAULT_OUTLINE_FONT_OPTION_24),this.lblScore.textColor=16750899,this.lblScore.y=51,this.addChild(this.lblScore),this.iconClock=new je(eS.getTexture("UI_Ekkorr","Icon_Time02")),this.iconClock.scale.set(.595),this.addChild(this.iconClock),this.lblEndsIn=new SD("",OL.DEFAULT_COLOR,OL.DEFAULT_OUTLINE_FONT_OPTION_16),this.lblEndsIn.y=t.TIME_GROUP_Y,this.iconClock.y=this.lblEndsIn.y+(this.lblEndsIn.height-this.iconClock.height)/2,this.addChild(this.lblEndsIn),this.btnAttack=new IG(nB.getText("GAME_1040","공격")),this.btnAttack.color=IG.RED,this.btnAttack.width=t.BTN_W,this.btnAttack.height=t.BTN_H,this.btnAttack.x=t.BTN_X,this.btnAttack.onClick=()=>this.onAttack(),this.addChild(this.btnAttack); + super(),Zt(this,"bg"),Zt(this,"myEmblem"),Zt(this,"oppEmblem"),Zt(this,"lblMyName"),Zt(this,"lblMyLv"),Zt(this,"lblMyRank"),Zt(this,"lblMyEloValue"),Zt(this,"iconVs"),Zt(this,"lblOppName"),Zt(this,"lblOppLv"),Zt(this,"lblOppRank"),Zt(this,"lblOppEloValue"),Zt(this,"lblScore"),Zt(this,"iconClock"),Zt(this,"lblEndsIn"),Zt(this,"btnAttack"),Zt(this,"ticketIcons",[]),Zt(this,"ticketDimFilter",new bf),this.ticketDimFilter.desaturate(),this.bg=new WU,this.bg.setIndex(2),this.bg.width=t.ROW_W,this.bg.height=t.ROW_H,this.addChild(this.bg),this.myEmblem=new Vsi,this.myEmblem.scale.set(t.EMBLEM_SCALE),this.myEmblem.x=t.PAD,this.myEmblem.y=10,this.addChild(this.myEmblem),this.oppEmblem=new Vsi,this.oppEmblem.scale.set(t.EMBLEM_SCALE),this.oppEmblem.x=t.OPP_EMBLEM_X,this.oppEmblem.y=10,this.addChild(this.oppEmblem),this.lblMyLv=new QD("",14531464,sD.DEFAULT_FONT_OPTION_16),this.addChild(this.lblMyLv),this.lblOppLv=new QD("",14531464,sD.DEFAULT_FONT_OPTION_16),this.addChild(this.lblOppLv),this.lblMyName=new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_17),this.lblMyName.textColor=sD.DEFAULT_COLOR,this.lblMyName.x=t.LEFT_TEXT_X,this.lblMyName.y=14,this.addChild(this.lblMyName),this.lblOppName=new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_17),this.lblOppName.textColor=sD.DEFAULT_COLOR,this.lblOppName.y=14,this.addChild(this.lblOppName),this.lblMyRank=new QD("",16750899,sD.DEFAULT_OUTLINE_FONT_OPTION_16),this.lblMyRank.x=t.LEFT_TEXT_X,this.lblMyRank.y=36,this.addChild(this.lblMyRank),this.lblOppRank=new QD("",16750899,sD.DEFAULT_OUTLINE_FONT_OPTION_16),this.lblOppRank.y=36,this.addChild(this.lblOppRank),this.lblMyEloValue=new QD("",16750899,sD.DEFAULT_OUTLINE_FONT_OPTION_18),this.lblMyEloValue.textColor=16750899,this.lblMyEloValue.x=t.LEFT_TEXT_X,this.lblMyEloValue.y=58,this.addChild(this.lblMyEloValue),this.lblOppEloValue=new QD("",16750899,sD.DEFAULT_OUTLINE_FONT_OPTION_18),this.lblOppEloValue.textColor=16750899,this.lblOppEloValue.y=58,this.addChild(this.lblOppEloValue),this.iconVs=new Ye(kS.getTexture("UI_Ekkorr","UI_VS")),this.iconVs.scale.set(.506),this.iconVs.y=8,this.addChild(this.iconVs),this.lblScore=new QD("",16750899,sD.DEFAULT_OUTLINE_FONT_OPTION_24),this.lblScore.textColor=16750899,this.lblScore.y=51,this.addChild(this.lblScore),this.iconClock=new Ye(kS.getTexture("UI_Ekkorr","Icon_Time02")),this.iconClock.scale.set(.595),this.addChild(this.iconClock),this.lblEndsIn=new QD("",sD.DEFAULT_COLOR,sD.DEFAULT_OUTLINE_FONT_OPTION_16),this.lblEndsIn.y=t.TIME_GROUP_Y,this.iconClock.y=this.lblEndsIn.y+(this.lblEndsIn.height-this.iconClock.height)/2,this.addChild(this.lblEndsIn),this.btnAttack=new iB(RB.getText("GAME_1040","공격")),this.btnAttack.color=iB.RED,this.btnAttack.width=t.BTN_W,this.btnAttack.height=t.BTN_H,this.btnAttack.x=t.BTN_X,this.btnAttack.onClick=()=>this.onAttack(),this.addChild(this.btnAttack);
GuildWarHistoryItemRenderer 1 hunks, 1 statements
- ...OL.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:i} + ...sD.DEFAULT_OUTLINE_FONT_OPTION_16,fontSize:i}
GameAccountSelectPopup3 1 hunks, 1 statements
- __proto__:null,AttendancePopup:Iri,AttendanceReceiveButton:kri} + __proto__:null,AttendancePopup:eai}
TransitionView 1 hunks, 1 statements
- this.bg=new je(i),this.bg.width=Xy.stageWidth,this.bg.scale.y=this.bg.scale.x,this.bg.y=0,Xy.stageHeight>1140&&(this.bg.y=.5*(Xy.stageHeight-this.bg.height)),this.addChildAt(this.bg,0),Xy.stageHeight>this.bg.height&&(this.bgEx=new je(eS.getTexture("UI_Ekkorr","whiteRect")),this.bgEx.tint=141887,this.bgEx.width=Xy.stageWidth,this.bgEx.scale.y=this.bgEx.scale.x,this.addChildAt(this.bgEx,0)),this.cover=new je(eS.getTexture("UI_Ekkorr","UI_Toast_Bg")),this.cover.alpha=.3,this.cover.width=this.bg.width,this.cover.height=this.bg.height,this.addChild(this.cover)} + this.bg=new Ye(i),this.bg.width=ES.stageWidth,this.bg.scale.y=this.bg.scale.x,this.bg.y=0,ES.stageHeight>1140&&(this.bg.y=Math.max(0,.5*(ES.stageHeight-this.bg.height))),this.addChildAt(this.bg,0),ES.stageHeight>this.bg.height&&(this.bgEx=new Ye(kS.getTexture("UI_Ekkorr","whiteRect")),this.bgEx.tint=1181706,this.bgEx.width=ES.stageWidth,this.bgEx.height=ES.stageHeight,this.addChildAt(this.bgEx,0)),this.cover=new Ye(kS.getTexture("UI_Ekkorr","UI_Toast_Bg")),this.cover.alpha=.3,this.cover.width=this.bg.width,this.cover.height=this.bg.height,this.addChild(this.cover)}
NpcDialogueToast 1 hunks, 1 statements
- ...OL.DEFAULT_FONT_OPTION_18,fontSize:14,lineHeight:18} + ...sD.DEFAULT_FONT_OPTION_18,fontSize:14,lineHeight:18}
CitadelBuildingDetailPopup 1 hunks, 1 statements
- const t=new of; + const t=new bf;
GuildWarCombatLogItemRenderer 1 hunks, 1 statements
- ...OL.DEFAULT_FONT_OPTION_15,fontSize:14} + ...sD.DEFAULT_FONT_OPTION_15,fontSize:14}
GuildWarMemberStatusItemRenderer 1 hunks, 1 statements
- ...OL.DEFAULT_FONT_OPTION_15,fontSize:14} + ...sD.DEFAULT_FONT_OPTION_15,fontSize:14}
GuildWarTargetMarkerItemRenderer 1 hunks, 1 statements
- ...OL.DEFAULT_FONT_OPTION_15,fontSize:14} + ...sD.DEFAULT_FONT_OPTION_15,fontSize:14}
ServerRejected 1 hunks, 1 statements
- qt(g_i,"pad"),qt(m_i,"toSetTeamsParams"),qt(w_i,"cardIconKind"),qt(v_i,"totalSoldiers"),qt(__i,"soldierDisplayTiers"),qt(b_i,"mapIndexForFloor"),qt(E_i,"isVerticalMap"),qt(M_i,"defaultFormation"),qt(A_i,"normalizeFormation"),qt(y_i,"swapSlots"),qt(S_i,"slotLayout"); + Qt(Tbi,"pad$1"),Qt(Cbi,"toSetTeamsParams"),Qt(Obi,"cardIconKind"),Qt(Ibi,"totalSoldiers"),Qt(kbi,"soldierDisplayTiers"),Qt(Rbi,"mapIndexForFloor"),Qt(xbi,"isVerticalMap"),Qt(Pbi,"defaultFormation"),Qt(Nbi,"normalizeFormation"),Qt(Lbi,"swapSlots"),Qt(Dbi,"slotLayout");
MiniAscentBattleProgress 1 hunks, 1 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:20,lineHeight:26,align:"center"} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:20,lineHeight:26,align:"center"}
ConquestDataManager 1 hunks, 1 statements
- ,"onVisibility")); + ,"onVisibility")),Zt(nyi,"shellReady",!1),Zt(nyi,"seasonEndNotified",!1);
OfflinePopup 1 hunks, 1 statements
- nB.getValueReplaceMulti("GAME_692",["##","@@"],[a,t],`망루버프 :+${ + RB.getValueReplaceMulti("GAME_692",["##","@@"],[a,t],`망루버프 : +${
Delay 1 hunks, 1 statements
- ...gSi(),[i]:s} + ...mWi(),[i]:s}
NetworkTimeout 1 hunks, 1 statements
- ...USi,...i} + ...$Wi,...i}
RecaptchaVerifier 1 hunks, 1 statements
- ...bki} + ...yYi}
BrowserPopupRedirectResolver 1 hunks, 1 statements
- ...yRi,width:e.toString(),height:n.toString(),top:h,left:r} + ...Tqi,width:e.toString(),height:n.toString(),top:h,left:r}
MiniAscentCardsPage 1 hunks, 1 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:s,lineHeight:s+6} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:s,lineHeight:s+6}
MiniAscentCrystalRowRenderer 1 hunks, 1 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:20,fontWeight:"900"} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:20,fontWeight:"900"}
MiniAscentCrystalsPage 1 hunks, 1 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:n,lineHeight:n+5,fontWeight:"bold"} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:n,lineHeight:n+5,fontWeight:"bold"}
MiniAscentTextButton 1 hunks, 1 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:15,lineHeight:20} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:15,lineHeight:20}
MiniAscentCrystalRewardPopup 1 hunks, 1 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:s,lineHeight:s+5} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:s,lineHeight:s+5}
MiniAscentModeSwitch 1 hunks, 1 statements
- ...OL.DEFAULT_FONT_OPTION_16,fontSize:19,lineHeight:24} + ...sD.DEFAULT_FONT_OPTION_16,fontSize:19,lineHeight:24}






















