Update Healer Man server

This commit is contained in:
phenom committed 2026-09-25 18:46:09 -04:00
1 parent a868401ebc
commit 48a678dcc5
295 files changed
+7644 -467

No files matched your search

File diff suppressed because it is too large. Load diff
+73
View File
@@ -0,0 +1,73 @@
# RuneWaker media batch plan
Generated by `npm run effects:rom:plan` from the current primary-five spell manifest and decoded ROS archive. It groups remaining controller and timing work. The manifest generator already attaches source direct audio events at supported phase boundaries.
The archive has 170 unique models: 74 ready, 1 partial original, 0 fully decoded but unverified, 95 blocked, and 0 failed. 125 of 129 source spell entries have at least one packaged audio cue.
## Shared controller blockers
Counts overlap when a model has several controller families. A family should be ported and verified once against representative models before its other users are considered for promotion.
| Controller family | Models | Source spell IDs using those models |
| --- | ---: | ---: |
| CRuController_EventTrigger | 148 | 124 |
| CRuController_GlobalAlpha | 47 | 49 |
| CRuEntity_Particle_Visualizer_Entity | 35 | 44 |
| CRuController_Particle_Visualizer_Entity | 34 | 43 |
| CRuController_GlobalColor | 26 | 26 |
| RuneWaker browser emitter geometry mode | 18 | 21 |
| CRuController_Decal | 17 | 17 |
| CRuController_GhostTrail | 11 | 15 |
| CRuController_Hierarchy | 11 | 12 |
| CRuController_Entity | 5 | 4 |
| RuneWaker browser sprite mode | 5 | 5 |
| CRuController_UVFX | 3 | 3 |
| CRuController_MaterialTexture | 1 | 1 |
| CRuController_PolyLine | 1 | 1 |
## Fully decoded models awaiting visual review
| Source model | Spell-phase references | Sprite layers | Blockers |
| --- | ---: | ---: | --- |
## Event-only models still blocked
These models have sprite data but include an event callback outside the validated visual-only set. Effect-spawning and projectile-flight callbacks require browser behavior before their visuals can be promoted.
| Source model | Spell-phase references | Sprite layers | Blockers |
| --- | ---: | ---: | --- |
| model/fx/skill/ice/act_cone01_c_hand.ros | 3 | 12 | CRuController_EventTrigger |
| model/fx/skill/fire/act_fireball02_t_hit_point.ros | 1 | 5 | CRuController_EventTrigger |
| model/fx/skill/holy/act_armorup_c_top.ros | 1 | 8 | CRuController_EventTrigger |
| model/fx/skill/physical/act_concentration_t_top.ros | 1 | 3 | CRuController_EventTrigger |
| model/fx/skill/physical/act_focus_c_top.ros | 1 | 4 | CRuController_EventTrigger |
| model/fx/skill/physical/act_fracture01_t_freeze_hit.ros | 1 | 6 | CRuController_EventTrigger |
There are 6 event-only models. The archive also exposes 3 model/phase audio-event candidates missing from the current packaged manifest. They need delayed timing or a later lifecycle phase; an ROS motion name alone is insufficient. Full per-model evidence is in `docs/ROM_MEDIA_BATCH_PLAN.json`.
## Largest blocker combinations
| Controller signature | Models | Source spell IDs | Example model |
| --- | ---: | ---: | --- |
| CRuController_EventTrigger + CRuController_Particle_Visualizer_Entity + CRuEntity_Particle_Visualizer_Entity | 13 | 20 | model/fx/skill/earth/act_casting_c_hand.ros |
| CRuController_EventTrigger | 9 | 11 | model/fx/skill/fire/act_fireball02_t_hit_point.ros |
| CRuController_Decal + CRuController_EventTrigger + CRuController_GlobalAlpha + CRuController_GlobalColor | 8 | 8 | model/fx/skill/earth/act_vriusinfection_t_freeze_down_e.ros |
| CRuController_EventTrigger + CRuController_GlobalAlpha | 6 | 7 | model/fx/skill/fire/act_fireball01_c_hand_i.ros |
| CRuController_EventTrigger + CRuController_GlobalAlpha + CRuController_Particle_Visualizer_Entity + CRuEntity_Particle_Visualizer_Entity | 5 | 6 | model/fx/skill/holy/act_chain_t_down.ros |
| CRuController_EventTrigger + CRuController_Particle_Visualizer_Entity + CRuEntity_Particle_Visualizer_Entity + RuneWaker browser emitter geometry mode | 5 | 5 | model/fx/skill/holy/act_moist_t_down.ros |
| CRuController_EventTrigger + RuneWaker browser emitter geometry mode | 5 | 8 | model/fx/skill/physical/act_deep_thought_c_down_e.ros |
| CRuController_Particle_Visualizer_Entity + CRuEntity_Particle_Visualizer_Entity | 4 | 10 | model/fx/skill/dark/act_dark_hand_wave_c_hand_e.ros |
| CRuController_Decal + CRuController_Entity + CRuController_EventTrigger + CRuController_GlobalAlpha + CRuController_GlobalColor | 2 | 1 | model/fx/skill/holy/act_scrifice_healing_c_freeze_down_e.ros |
| CRuController_Entity + CRuController_EventTrigger | 2 | 2 | model/fx/skill/holy/act_judgement_t_hit_point.ros |
| CRuController_EventTrigger + CRuController_GhostTrail + CRuController_GlobalAlpha | 2 | 4 | model/fx/skill/fire/act_fireball02_f.ros |
| CRuController_EventTrigger + CRuController_GhostTrail + CRuController_GlobalAlpha + CRuController_GlobalColor + CRuController_Hierarchy | 2 | 2 | model/fx/skill/physical/act_deflecting_shot_f.ros |
| CRuController_EventTrigger + CRuController_GhostTrail + CRuController_Particle_Visualizer_Entity + CRuEntity_Particle_Visualizer_Entity | 2 | 2 | model/fx/skill/ice/act_icearrow_f.ros |
| CRuController_EventTrigger + RuneWaker browser emitter geometry mode + RuneWaker browser sprite mode | 2 | 2 | model/fx/skill/physical/act_attackspeedup_c_down.ros |
| CRuController_Decal + CRuController_Entity + CRuController_GlobalAlpha + CRuController_GlobalColor + RuneWaker browser emitter geometry mode + RuneWaker browser sprite mode | 1 | 1 | model/fx/skill/physical/act_beckon_holy_c_freeze_down_e.ros |
## Batch workflow
1. Run `npm run effects:rom:batch` to refresh source links, package audio and ROS graphs, attach verified phases, and rebuild this plan.
2. Review the remaining event timing candidates and largest shared blocker families above.
3. Port one controller family in the exporter/WebGL runtime and add a parser check that every promoted graph is renderable.
4. Regenerate the manifest and media audit, replay representative graphs in the RuneWaker preview, then spot-check distinct motion and attachment patterns in live combat.
+90 -90
View File
@@ -2,50 +2,50 @@
Generated by `node scripts/combat-effects/audit-rom-media.mjs --write` from the player catalog and combat effect manifest. The five accepted pairings follow `src/game/romFiveIdentities.ts`. Castable skills are listed; passives have no cast media event.
The effect column records original client ROS/RAS references and their cast phase. 7 castable skills have browser-playable original phases; other source visuals use the game's generated runtime effect until their controller families are supported. A `partial original` phase renders verified source layers and declares its remaining fidelity limit. The sound column lists packaged client cues on their mapped phase. A dash means the source record or matching sound file did not provide that media.
The effect column records original client ROS/RAS references and their cast phase. 84 castable skills have browser-playable original phases; other source visuals use the game's generated runtime effect until their controller families are supported. A `partial original` phase renders verified source layers and declares its remaining fidelity limit. The sound column lists packaged client cues on their mapped phase. A dash means the source record or matching sound file did not provide that media.
| Primary class | Skill group | Castable skills | With source effect | With packaged sound | With playable original effect |
| --- | --- | ---: | ---: | ---: | ---: |
| Priest | Base | 25 | 19 | 18 | 4 |
| Priest | Accepted elite pair | 6 | 6 | 4 | 0 |
| Knight | Base | 19 | 17 | 14 | 2 |
| Knight | Accepted elite pair | 6 | 6 | 3 | 0 |
| Scout | Base | 20 | 16 | 14 | 0 |
| Scout | Accepted elite pair | 4 | 4 | 3 | 0 |
| Rogue | Base | 20 | 10 | 9 | 0 |
| Rogue | Accepted elite pair | 4 | 4 | 2 | 0 |
| Mage | Base | 21 | 20 | 11 | 1 |
| Mage | Accepted elite pair | 5 | 5 | 5 | 0 |
| Priest | Base | 25 | 23 | 23 | 18 |
| Priest | Accepted elite pair | 6 | 6 | 6 | 3 |
| Knight | Base | 19 | 19 | 18 | 13 |
| Knight | Accepted elite pair | 6 | 6 | 6 | 2 |
| Scout | Base | 20 | 20 | 19 | 13 |
| Scout | Accepted elite pair | 4 | 4 | 4 | 4 |
| Rogue | Base | 20 | 20 | 18 | 15 |
| Rogue | Accepted elite pair | 4 | 4 | 4 | 2 |
| Mage | Base | 21 | 20 | 20 | 13 |
| Mage | Accepted elite pair | 5 | 5 | 5 | 1 |
## Priest — base
| Skill | Source spell IDs | Effect phase and source model | Sound phase and source cue |
| --- | --- | --- | --- |
| Soul Source | 490288 | — | — |
| Wave Armor | 490273 | impact: act_holywater_armor_t_top.ros<br>aura-start: act_watershieldbuff_c_down_i.ros | impact: act_holywater_armor_t_top.mp3 |
| Heal | 490261 | cast-start: act_casting_c_hand.ros | cast-start: act_casting_c_hand.wav |
| Ice Fog | 490274 | cast-start: act_cone01_c_hand.ros | cast-start: act_cone01_c_hand.mp3 |
| Bone Chill | 491165 | cast-start: act_ice_hand_wave_c_hand_e.ros | — |
| Soul Source | 490288 | impact: act_soulspring_t_down.ros | impact: act_soulspring_t_down.ros.mp3 |
| Wave Armor | 490273 | impact: act_holywater_armor_t_top.ros<br>aura-start: act_watershieldbuff_c_down_i.ros | impact: act_holywater_armor_t_top.mp3<br>aura-start: act_watershieldbuff_c_down_i.ros.mp3 |
| Heal | 490261 | cast-start: act_casting_c_hand.ros<br>impact: act_mainheal_t_down_e.ros | cast-start: act_casting_c_hand.wav<br>impact: act_friendly_t_down_i.mp3<br>impact: act_mainheal_t_down_e.ros 2.mp3 |
| Ice Fog | 490274 | cast-start: act_cone01_c_hand.ros<br>impact: act_icefog_t_freeze_hit_e.ros | cast-start: act_cone01_c_hand.ros.mp3<br>impact: act_icefog_t_freeze_hit_e.ros.mp3 |
| Bone Chill | 491165 | cast-start: act_ice_hand_wave_c_hand_e.ros<br>impact: act_icefog_t_freeze_hit_e.ros | cast-start: act_ice_hand_wave_c_hand_e.ros.mp3<br>impact: act_icefog_t_freeze_hit_e.ros.mp3 |
| Resurrection | 490280 | cast-start: act_casting_c_hand.ros<br>impact: act_anabiosis_t_down.ros | cast-start: act_casting_c_hand.wav<br>impact: act_anabiosis_t_down.mp3 |
| Soul Bond | 490297 | cast-start: act_casting_c_hand.ros | cast-start: act_casting_c_hand.wav |
| Grace of Life | 490290 | — | — |
| Group Heal | 490281 | cast-start: act_casting_c_hand.ros | cast-start: act_casting_c_hand.wav |
| Chain of Light | 491164 | cast-start: act_light_chain_c_hand_i.ros<br>impact: act_light_chain_t_down_i.ros<br>impact: act_light_chainhit_t_down_e.ros | impact: act_light_chain_t_down_i.mp3 |
| Amplified Attack | 490491 | cast-start: act_casting_c_hand.ros | cast-start: act_casting_c_hand.wav |
| Ice Fog | 490275 | cast-start: act_cone01_c_hand.ros | cast-start: act_cone01_c_hand.mp3 |
| Healing Salve | 490294 | — | — |
| Soul Bond | 490297 | cast-start: act_casting_c_hand.ros<br>impact: act_holycross_t_top.ros | cast-start: act_casting_c_hand.wav<br>impact: act_holycross_t_top.mp3 |
| Grace of Life | 490290 | impact: act_rainpray_t_down.ros | impact: act_rainpray_t_down.mp3 |
| Group Heal | 490281 | cast-start: act_casting_c_hand.ros<br>impact: act_anima_t_name_title.ros | cast-start: act_casting_c_hand.wav<br>impact: act_anima_t_name_title.mp3 |
| Chain of Light | 491164 | cast-start: act_light_chain_c_hand_i.ros<br>impact: act_light_chain_t_down_i.ros<br>impact: act_light_chainhit_t_down_e.ros | cast-start: act_powergather_c_right_hand.mp3<br>impact: act_light_chainhit_t_down_e.ros.mp3 |
| Amplified Attack | 490491 | cast-start: act_casting_c_hand.ros<br>impact: act_power_up_t_down.ros | cast-start: act_casting_c_hand.wav<br>impact: act_power_up_t_down.mp3 |
| Ice Fog | 490275 | cast-start: act_cone01_c_hand.ros<br>impact: act_icefog_t_freeze_hit_e.ros | cast-start: act_cone01_c_hand.ros.mp3<br>impact: act_icefog_t_freeze_hit_e.ros.mp3 |
| Healing Salve | 490294 | impact: act_moist_t_down.ros | impact: act_moist_t_down.mp3 |
| Blessing of Humility | 490301 | — | — |
| Ice Fog | 490276 | cast-start: act_cone01_c_hand.ros | cast-start: act_cone01_c_hand.mp3 |
| Ice Fog | 490276 | cast-start: act_cone01_c_hand.ros<br>impact: act_icefog_t_freeze_hit_e.ros | cast-start: act_cone01_c_hand.ros.mp3<br>impact: act_icefog_t_freeze_hit_e.ros.mp3 |
| Holy Candle | 490304 | — | — |
| Cleanse | 491175 | impact: act_dispersion_t_freeze_hit_e.ros | impact: act_dispersion_t_freeze_hit_e.mp3 |
| Advanced Resurrection | 491176 | cast-start: act_casting_c_hand.ros<br>impact: act_anabiosis_t_down.ros | cast-start: act_casting_c_hand.wav<br>impact: act_anabiosis_t_down.mp3 |
| Supreme Resurrection | 491177 | cast-start: act_casting_c_hand.ros<br>impact: act_anabiosis_t_down.ros | cast-start: act_casting_c_hand.wav<br>impact: act_anabiosis_t_down.mp3 |
| Urgent Heal | 491147 | cast-start: act_casting_c_hand.ros<br>impact: act_benedictory_heal_t_down.ros (partial original) | cast-start: act_casting_c_hand.wav<br>impact: act_benedictory_heal_t_down.mp3 |
| Rising Tide | 490256 | cast-start: act_icecone01_c_hand.ros<br>release: act_icecone01_f.ros<br>impact: act_riptide_t_freeze_hit.ros | cast-start: act_icecone01_c_hand.wav<br>release: act_icecone01_f.ros.mp3<br>impact: act_riptide_t_freeze_hit.mp3 |
| Regenerate | 490269 | cast-start: act_casting_c_hand.ros<br>cast-start: act_holy_hand_wave_c_hand_e.ros | cast-start: act_casting_c_hand.wav |
| Holy Aura | 490300 | cast-start: act_casting_c_hand.ros<br>cast-start: act_flash_candle_c_down_e.ros | cast-start: act_casting_c_hand.wav |
| Magic Barrier | 491166 | — | — |
| Blessed Spring Water | 490298 | cast-start: act_icecone01_c_hand.ros | cast-start: act_icecone01_c_hand.wav |
| Rising Tide | 490256 | cast-start: act_icecone01_c_hand.ros<br>release: act_icecone01_f.ros<br>impact: act_riptide_t_freeze_hit.ros | cast-start: act_cone01_c_hand.mp3<br>release: act_icecone01_f.ros.mp3<br>impact: act_riptide_t_freeze_hit.mp3 |
| Regenerate | 490269 | cast-start: act_casting_c_hand.ros<br>cast-start: act_holy_hand_wave_c_hand_e.ros<br>impact: act_blessed_heal_t_down.ros | cast-start: act_casting_c_hand.wav<br>impact: act_blessed_heal_t_down.mp3 |
| Holy Aura | 490300 | cast-start: act_casting_c_hand.ros<br>cast-start: act_flash_candle_c_down_e.ros<br>impact: act_flash_candle_t_freeze_hit.ros | cast-start: act_casting_c_hand.wav<br>cast-start: act_flash_candle_c_down_e.ros.mp3<br>impact: act_flash_candle_t_freeze_hit.mp3 |
| Magic Barrier | 491166 | impact: act_magicdefence_t_down_e.ros | impact: act_anima_t_name_title.mp3 |
| Blessed Spring Water | 490298 | cast-start: act_icecone01_c_hand.ros<br>impact: act_springblessing_t_top.ros | cast-start: act_cone01_c_hand.mp3<br>impact: act_springblessing_t_top.mp3 |
## Priest — accepted elite pair
@@ -53,9 +53,9 @@ The effect column records original client ROS/RAS references and their cast phas
| --- | --- | --- | --- |
| Last Prayer | 491648 | impact: act_benedictory_heal_t_down.ros | impact: act_benedictory_heal_t_down.mp3 |
| Divine Incarnation | 491366 | cast-start: act_sacredincarnation_c_down.ros | cast-start: act_sacredincarnation_c_down.mp3 |
| Calm Heart | 492639 | cast-start: act_casting_c_hand.ros<br>impact: act_fearless_t_down_e.ros | cast-start: act_casting_c_hand.wav |
| Sacrificial Cure | 492934 | cast-start: act_scrifice_healing_c_freeze_down_e.ros<br>impact: act_scrifice_healing_t_down_e.ros | — |
| Holy Power | 493044 | cast-start: act_holyenergy_c_down_e.ros<br>cast-start: act_holyenergy_c_down_i.ros | — |
| Calm Heart | 492639 | cast-start: act_casting_c_hand.ros<br>impact: act_fearless_t_down_e.ros | cast-start: act_casting_c_hand.wav<br>impact: skill_fearless_t_down_e.mp3 |
| Sacrificial Cure | 492934 | cast-start: act_scrifice_healing_c_freeze_down_e.ros<br>impact: act_scrifice_healing_t_down_e.ros | cast-start: skill_scrifice_healing_c_freeze_down_e.mp3<br>impact: skill_scrifice_healing_t_down_e.mp3 |
| Holy Power | 493044 | cast-start: act_holyenergy_c_down_e.ros<br>cast-start: act_holyenergy_c_down_i.ros | cast-start: skill_holyenergy_c_down_e.ros.mp3<br>cast-start: skill_holyenergy_c_down_i.mp3 |
| Light Fairy | 493271 | cast-start: act_casting_c_hand.ros<br>cast-start: act_beckon_holy_c_freeze_down_e.ros | cast-start: act_casting_c_hand.wav |
## Knight — base
@@ -68,19 +68,19 @@ The effect column records original client ROS/RAS references and their cast phas
| Whirlwind Shield | 490175 | cast-start: act_shieldstorm_c_down_e.ros<br>impact: act_shieldstorm_t_freeze_hit_e.ros | — |
| Shackles of Light | 490189 | cast-start: act_chain_c_shoot02.ros | cast-start: act_chain_c_shoot02.mp3 |
| Resolution | 490168 | cast-start: act_physical_casting_c_hand.ros<br>cast-start: act_responsibility_c_down.ros | cast-start: act_physical_casting_c_hand.mp3<br>cast-start: act_responsibility_c_down.mp3 |
| Charge | 490150 | cast-start: act_charge02_c_down.ros | cast-start: act_charge02_c_down.mp3 |
| Threaten | 490153 | — | — |
| Charge | 490150 | cast-start: act_charge02_c_down.ros<br>impact: act_strikeback_t_hit_point.ros | cast-start: act_charge02_c_down.mp3<br>impact: act_strikeback_t_hit_point.mp3 |
| Threaten | 490153 | impact: act_intimidation_t_freeze_hit_e.ros | impact: act_intimidation_t_freeze_hit_e.mp3 |
| Shield of Valor | 490468 | cast-start: act_courage_shield_c_top.ros | cast-start: act_courage_shield_c_top.mp3 |
| Truth Shield Bash | 490186 | cast-start: act_truth_shield_c_top.ros | cast-start: act_truth_shield_c_top.mp3 |
| Shock | 490154 | cast-start: act_holy_hand_wave_c_hand_e.ros | — |
| Truth Shield Bash | 490186 | cast-start: act_truth_shield_c_top.ros<br>impact: act_judge_shield_t_hit_point.ros | cast-start: act_truth_shield_c_top.mp3<br>impact: act_judge_shield_t_hit_point.mp3 |
| Shock | 490154 | cast-start: act_holy_hand_wave_c_hand_e.ros<br>impact: act_shock_t_hit_point.ros | impact: act_shock_t_hit_point.mp3 |
| Holy Strength | 491321 | cast-start: act_manafreeback_c_down_e.ros | cast-start: act_manafreeback_c_down_e.mp3 |
| Hall of Dead Heroes | 495724 | aura-start: act_herosoul_buff_c_top.ros | aura-start: act_herosoul_buff_c_top.mp3 |
| Punishment | 490151 | cast-start: act_holy_hand_wave_c_hand_e.ros | — |
| Punishment | 490151 | cast-start: act_holy_hand_wave_c_hand_e.ros<br>impact: act_judgement_t_hit_point.ros | impact: act_judgement_t_hit_point.mp3 |
| Holy Strike | 490148 | impact: act_san_sword_t_down_e.ros | impact: act_san_sword_t_down_e.mp3 |
| Disarmament | 490159 | — | — |
| Disarmament | 490159 | impact: act_disarm01_t_hit_point.ros | impact: act_disarm01_t_hit_point.mp3 |
| Strike of Punishment | 490179 | impact: act_brokenhit_t_hit_point.ros | impact: act_brokenhit_t_hit_point.mp3 |
| Enhanced Armor | 490152 | cast-start: act_armorup_c_top.ros | cast-start: act_armorup_c_top.mp3 |
| Shield of Discipline | 490192 | cast-start: act_discipline_shield_c_top.ros | cast-start: act_discipline_shield_c_top.mp3 |
| Shield of Discipline | 490192 | cast-start: act_discipline_shield_c_top.ros<br>impact: act_discipline_shield_t_hit_point.ros | cast-start: act_discipline_shield_c_top.mp3<br>impact: act_capacity_crash_c_freeze_hit_e.ros.mp3 |
## Knight — accepted elite pair
@@ -89,34 +89,34 @@ The effect column records original client ROS/RAS references and their cast phas
| Arrow of Vengeance | 491616 | release: act_revengearrow_f_i.ros<br>impact: act_revengearrow_t_hit_point_e.ros | impact: act_revengearrow_t_hit_point_e.mp3 |
| Holy Chains | 491613 | impact: act_chain_t_down.ros | impact: act_chain_t_down.mp3 |
| Heavenly Arrow | 491354 | cast-start: act_holy_hand_wave_c_hand_e.ros<br>impact: act_heavenarrow_t_down_e.ros | impact: act_heavenarrow_t_down_e.mp3 |
| Sacred Resistance | 492939 | cast-start: act_holyresist_c_down_e.ros | — |
| Sacred Protection | 493046 | cast-start: act_holyprotect_c_down_e.ros<br>impact: act_ingoreself_t_down_e.ros | — |
| Disregard Danger | 493273 | cast-start: act_fire_hand_wave_c_hand_e.ros<br>impact: act_ingoreself_t_down_e.ros | — |
| Sacred Resistance | 492939 | cast-start: act_holyresist_c_down_e.ros | cast-start: act_acheignore_c_down_e.mp3 |
| Sacred Protection | 493046 | cast-start: act_holyprotect_c_down_e.ros<br>impact: act_ingoreself_t_down_e.ros | cast-start: skill_holyprotect_c_down_e.mp3<br>impact: skill_ingoreself_t_down_e.mp3 |
| Disregard Danger | 493273 | cast-start: act_fire_hand_wave_c_hand_e.ros<br>impact: act_ingoreself_t_down_e.ros | cast-start: act_fire_hand_wave_c_hand_e.ros.mp3<br>impact: skill_ingoreself_t_down_e.mp3 |
## Scout — base
| Skill | Source spell IDs | Effect phase and source model | Sound phase and source cue |
| --- | --- | --- | --- |
| Arrow of Essence | 490494 | — | — |
| Wind Arrows | 491128 | release: act_gustwindarrow_f_hit_point_i.ros<br>impact: act_gustwindarrow_t_hit_point_e.ros | impact: act_gustwindarrow_t_hit_point_e.mp3 |
| Arrow of Essence | 490494 | impact: act_mentalarrow_t_freeze_hit.ros | impact: act_mentalarrow_t_freeze_hit.mp3 |
| Wind Arrows | 491128 | release: act_gustwindarrow_f_hit_point_i.ros<br>impact: act_gustwindarrow_t_hit_point_e.ros<br>impact: act_icearrow_t_hit_point.ros | release: act_gustwindarrow_f_hit_point_i.ros.mp3<br>impact: act_gustwindarrow_t_hit_point_e.mp3<br>impact: act_gustwindarrow_f_hit_point_e.mp3<br>impact: act_icearrow_t_hit_point.mp3 |
| Mana Drain Shot | 490441 | release: act_sorcerersting_f.ros | release: act_sorcerersting_f.mp3 |
| Lasso | 490454 | cast-start: act_casting_c_hand.ros | cast-start: act_casting_c_hand.wav |
| Piercing Arrow | 490400 | release: act_immolatingshot_f.ros | release: act_immolatingshot_f.mp3 |
| Snipe | 490450 | release: act_snipe_f.ros | release: act_snipe_f.mp3 |
| Detection | 490463 | cast-start: act_focus_c_top.ros | cast-start: act_focus_c_top.mp3 |
| Combo Shot | 490424 | release: act_arrow_f.ros | release: act_arrow_f.mp3 |
| Piercing Arrow | 490400 | release: act_immolatingshot_f.ros<br>impact: act_immolatingshot_t_hit_point.ros | release: act_immolatingshot_f.mp3<br>impact: act_immolatingshot_t_hit_point.mp3 |
| Snipe | 490450 | release: act_snipe_f.ros<br>impact: act_snipe_t_freeze_hit.ros | release: act_snipe_f.mp3<br>impact: act_snipe_t_freeze_hit.mp3 |
| Detection | 490463 | cast-start: act_focus_c_top.ros<br>cast-start: act_focus_c_down.ros | cast-start: act_focus_c_top.mp3 |
| Combo Shot | 490424 | release: act_arrow_f.ros<br>impact: act_arrow_t_hit_point.ros | release: act_arrow_f.mp3<br>impact: act_arrow_t_hit_point.mp3 |
| Neck Strike | 490438 | impact: act_neckattack_t_mouth.ros | impact: act_neckattack_t_mouth.mp3 |
| Reflected Shot | 490457 | release: act_deflecting_shot_f.ros | release: act_deflecting_shot_f.mp3 |
| Reflected Shot | 490457 | release: act_deflecting_shot_f.ros<br>impact: act_deflecting_shot_t_freeze_hit.ros | release: act_deflecting_shot_f.mp3<br>impact: act_deflecting_shot_t_freeze_hit.mp3 |
| Concentration | 490460 | impact: act_concentration_t_top.ros | impact: act_concentration_t_top.mp3 |
| Target Area | 490464 | cast-start: act_physical_casting_c_hand.ros<br>cast-start: act_shooterexpert_c_down.ros | cast-start: act_physical_casting_c_hand.mp3<br>cast-start: act_shooterexpert_c_down.mp3 |
| Frost Arrow | 491163 | release: act_icearrow_f.ros | release: act_icearrow_f.mp3 |
| Autoshot | 492589 | release: act_normalarrow_f_i.ros | — |
| Shot | 490423 | release: act_arrow_f.ros | release: act_arrow_f.mp3 |
| Frost Arrow | 491163 | release: act_icearrow_f.ros<br>impact: act_icearrow_t_hit_point.ros | release: act_icearrow_f.mp3<br>impact: act_icearrow_t_hit_point.mp3 |
| Autoshot | 492589 | release: act_normalarrow_f_i.ros<br>impact: act_arrow_t_hit_point.ros | impact: act_arrow_t_hit_point.mp3 |
| Shot | 490423 | release: act_arrow_f.ros<br>impact: act_arrow_t_hit_point.ros | release: act_arrow_f.mp3<br>impact: act_arrow_t_hit_point.mp3 |
| Vampire Arrows | 491292 | release: act_bitesbloodarrow_f_hit_point_i.ros<br>impact: act_bitesbloodarrow_t_hit_point_e.ros<br>impact: act_bloodstain_t_freeze_down.ros | impact: act_bitesbloodarrow_t_hit_point_e.mp3<br>impact: act_bloodstain_t_freeze_down.mp3 |
| Joint Blow | 490420 | — | — |
| Joint Blow | 490420 | impact: act_jointattack_t_freeze_hit.ros | impact: act_jointattack_t_freeze_hit.mp3 |
| Blood Arrow | 490434 | cast-start: act_fear_c_hand.ros | — |
| Throat Attack | 490428 | — | — |
| Wrist Attack | 490451 | — | — |
| Throat Attack | 490428 | impact: act_throatattack_t_mouth.ros | impact: act_throatattack_t_mouth.mp3 |
| Wrist Attack | 490451 | impact: act_handoff_t_freeze_hit_e.ros | impact: act_handoff_t_freeze_hit_e.mp3 |
## Scout — accepted elite pair
@@ -125,66 +125,66 @@ The effect column records original client ROS/RAS references and their cast phas
| Weak Spot | 491493 | release: act_bitesbloodarrow_f_hit_point_i.ros<br>impact: act_lockbuff_t_top.ros | impact: act_lockbuff_t_top.mp3 |
| Blinding Powder | 491336 | impact: act_blindpowder_t_top_e.ros | impact: act_blindpowder_t_top_e.mp3 |
| Sapping Arrow | 491496 | release: act_weakarrow_f_i.ros<br>impact: act_weakarrow_t_freeze_hit_e.ros | impact: act_weakarrow_t_freeze_hit_e.mp3 |
| Deadly Poison Bite | 492621 | cast-start: act_poison_casting_c_hand.ros<br>release: act_deadlypoison_f_i.ros<br>impact: act_deadlypoison_t_hit_point_e.ros | — |
| Deadly Poison Bite | 492621 | cast-start: act_poison_casting_c_hand.ros<br>release: act_deadlypoison_f_i.ros<br>impact: act_deadlypoison_t_hit_point_e.ros<br>impact: act_bitesbloodarrow_t_hit_point_e.ros | impact: skill_deadlypoison_t_hit_point_e.mp3<br>impact: act_bitesbloodarrow_t_hit_point_e.mp3 |
## Rogue — base
| Skill | Source spell IDs | Effect phase and source model | Sound phase and source cue |
| --- | --- | --- | --- |
| Assassins Rage | 490506 | cast-start: act_absolute_strike_c_top.ros | cast-start: act_absolute_strike_c_top.mp3 |
| Low Blow | 490323 | — | — |
| Wound Attack | 490313 | — | — |
| Blind Spot | 490311 | — | — |
| Numbing Dagger | 490347 | cast-start: nor_dark_casting.ros<br>release: act_throw01_f.ros | release: act_throw01_f.mp3 |
| Low Blow | 490323 | impact: act_crow01_t_hit_point.ros | impact: act_crow01_t_hit_point.mp3 |
| Wound Attack | 490313 | impact: act_scotch_t_freeze_hit.ros | impact: act_scotch_t_freeze_hit.mp3 |
| Blind Spot | 490311 | impact: act_fracture01_t_freeze_hit.ros | impact: act_fracture01_t_freeze_hit.mp3 |
| Numbing Dagger | 490347 | cast-start: nor_dark_casting.ros<br>release: act_throw01_f.ros | release: act_throw.mp3 |
| Poison | 490329 | cast-start: act_apply_poison_c_hand.ros | cast-start: act_apply_poison_c_hand.mp3 |
| Hide | 490312 | cast-start: act_snug_c_freeze_down.ros | cast-start: act_snug_c_freeze_down.mp3 |
| Premeditation | 490507 | — | — |
| Sneak Attack | 490337 | — | — |
| Premeditation | 490507 | cast-start: act_premeditation_c_hand.ros | cast-start: act_premeditation_c_hand.mp3 |
| Sneak Attack | 490337 | impact: act_sneak_attack_t_freeze_hit.ros | impact: act_scotch_t_freeze_hit.mp3 |
| Vanish | 490354 | cast-start: act_hiding_c_freeze_down.ros | cast-start: act_hiding_c_freeze_down.mp3 |
| Sprint | 490341 | — | — |
| Sprint | 490341 | cast-start: act_speedup01_c_down.ros | cast-start: act_speedup01_c_down.mp3 |
| Evasion | 490355 | cast-start: act_illusionmoving_c_down.ros | cast-start: act_illusionmoving_c_down.mp3 |
| Combo Throw | 490338 | release: act_throw01_f.ros | release: act_throw01_f.mp3 |
| Combo Throw | 490338 | release: act_throw01_f.ros<br>impact: act_throw01_t_hit_point.ros | release: act_throw.mp3<br>impact: act_throw01_t_hit_point.mp3 |
| Shadow Prison | 490346 | cast-start: act_dark_hand_wave_c_hand_e.ros | — |
| Informer | 490350 | — | — |
| Informer | 490350 | impact: nor_hitrateup_t_down_e.ros | — |
| Fervent Attack | 490333 | cast-start: act_attackspeedup_c_down.ros | cast-start: act_attackspeedup_c_down.mp3 |
| Shadowstab | 490306 | — | — |
| Throw | 490309 | release: act_throw01_f.ros | release: act_throw01_f.mp3 |
| Blind Stab | 490317 | — | — |
| Shadow Step | 490344 | — | — |
| Shadowstab | 490306 | impact: act_serpentine_t_freeze_hit.ros | impact: act_serpentine_t_freeze_hit.mp3 |
| Throw | 490309 | release: act_throw01_f.ros<br>impact: act_throw01_t_hit_point.ros | release: act_throw.mp3<br>impact: act_throw01_t_hit_point.mp3 |
| Blind Stab | 490317 | impact: act_blind01_t_freeze_hit.ros | impact: act_blind01_t_freeze_hit.mp3 |
| Shadow Step | 490344 | cast-start: act_shadowmoving_c_down.ros<br>cast-start: act_disaster_appear_c_down_e.ros | cast-start: act_shadowmoving_c_down.mp3<br>cast-start: act_disaster_appear_c_down_e.mp3 |
## Rogue — accepted elite pair
| Skill | Source spell IDs | Effect phase and source model | Sound phase and source cue |
| --- | --- | --- | --- |
| Death's Touch | 491339 | cast-start: act_dark_hand_wave_c_hand_e.ros<br>impact: act_deathtouch_t_down_e.ros | impact: act_deathtouch_t_down_e.mp3 |
| Death's Touch | 491339 | cast-start: act_dark_hand_wave_c_hand_e.ros<br>impact: act_deathtouch_t_down_e.ros<br>impact: act_serpentine_t_freeze_hit.ros | impact: act_deathtouch_t_down_e.mp3<br>impact: act_serpentine_t_freeze_hit.mp3 |
| Poisonous Infection | 492625 | impact: act_poisondot_t_down.ros | impact: act_poisondot_t_down.mp3 |
| Poison Spray | 492920 | cast-start: act_earth_hand_wave_c_hand_e.ros<br>impact: act_vriusinfection_t_freeze_down_e.ros | — |
| Decay | 493017 | impact: act_rot_t_down_e.ros | — |
| Poison Spray | 492920 | cast-start: act_earth_hand_wave_c_hand_e.ros<br>impact: act_vriusinfection_t_freeze_down_e.ros | cast-start: act_earth_hand_wave_c_hand_e.mp3<br>impact: skill_vriusinfection_t_freeze_down_e.mp3 |
| Decay | 493017 | impact: act_rot_t_down_e.ros | impact: skill_rot_t_down_e.mp3 |
## Mage — base
| Skill | Source spell IDs | Effect phase and source model | Sound phase and source cue |
| --- | --- | --- | --- |
| Elemental Catalysis | 490238, 497971 | cast-start: act_casting_c_hand.ros<br>cast-start: act_castup01_c_down.ros | cast-start: act_casting_c_hand.mp3<br>cast-start: act_castup01_c_down.mp3 |
| Flame | 491150 | cast-start: act_fireball01_c_hand_i.ros<br>cast-start: act_fireball02_c_hand_e.ros<br>release: act_fireball01_f_i.ros | — |
| Electrostatic Charge | 491156 | cast-start: act_casting_c_hand.ros<br>cast-start: act_electricfield_c_top.ros<br>aura-start: act_electricfieldbuff_c_down_i.ros | cast-start: act_casting_c_hand.mp3<br>cast-start: act_electricfield_c_top.mp3 |
| Discharge | 490242 | cast-start: act_wind_hand_wave_c_hand_e.ros<br>cast-start: act_lightningstrike_c_shoot.ros | cast-start: act_lightningstrike_c_shoot.mp3 |
| Flame | 491150 | cast-start: act_fireball01_c_hand_i.ros<br>cast-start: act_fireball02_c_hand_e.ros<br>release: act_fireball01_f_i.ros<br>impact: act_fireball01_t_freeze_hit_e.ros | cast-start: act_vengeance_c_hand.mp3<br>cast-start: act_fireball02_c_hand_e.ros.mp3<br>release: act_fireball02_f.mp3<br>impact: act_fireball01_t_freeze_hit_e.ros.mp3 |
| Electrostatic Charge | 491156 | cast-start: act_casting_c_hand.ros<br>cast-start: act_electricfield_c_top.ros<br>aura-start: act_electricfieldbuff_c_down_i.ros | cast-start: act_casting_c_hand.mp3<br>cast-start: act_electricfield_c_top.mp3<br>aura-start: act_electricfieldbuff2.mp3<br>aura-start: act_electricfieldbuff_c_down_i.ros.mp3 |
| Discharge | 490242 | cast-start: act_wind_hand_wave_c_hand_e.ros<br>cast-start: act_lightningstrike_c_shoot.ros<br>cast-start: act_deep_thought_c_down_e.ros | cast-start: act_lightningstrike_c_shoot.mp3 |
| Meteor Shower | 490252 | cast-start: act_noncasting_c_hand.ros<br>impact: act_shottingstars_t_down.ros | impact: act_shottingstars_t_down.mp3 |
| Phoenix | 490239 | cast-start: act_vengeance_c_hand.ros<br>cast-start: act_phoenix_c_freeze_down.ros | cast-start: act_vengeance_c_hand.mp3<br>cast-start: act_phoenix_c_freeze_down.mp3 |
| Purgatory Fire | 491153 | cast-start: act_fireball02_c_hand_e.ros<br>impact: act_fireball01_t_freeze_hit_e.ros | — |
| Energy Influx | 490218 | aura-start: act_magebuff01_c_top.ros | aura-start: act_magebuff01_c_top.mp3 |
| Phoenix | 490239 | cast-start: act_vengeance_c_hand.ros<br>cast-start: act_phoenix_c_freeze_down.ros<br>cast-start: act_deep_thought_c_down_e.ros<br>impact: act_firedot_t_down.ros | cast-start: act_vengeance_c_hand.mp3<br>cast-start: act_phoenix_c_freeze_down.ros.mp3<br>impact: act_firedot_t_down.mp3 |
| Purgatory Fire | 491153 | cast-start: act_fireball02_c_hand_e.ros<br>impact: act_fireball01_t_freeze_hit_e.ros<br>impact: act_firedot_t_down.ros | cast-start: act_fireball02_c_hand_e.ros.mp3<br>impact: act_fireball01_t_freeze_hit_e.ros.mp3<br>impact: act_firedot_t_down.mp3 |
| Energy Influx | 490218 | aura-start: act_magebuff01_c_top.ros | aura-start: act_magebuff01_c_top.ros.mp3 |
| Energy Well | 490251 | impact: act_manareduce01_c_hit_point.ros | impact: act_manareduce01_c_hit_point.mp3 |
| Elemental Weakness | 490247, 497977 | cast-start: act_casting_c_hand.ros<br>impact: act_elementdecay_t_down.ros | impact: act_elementdecay_t_down.mp3 |
| Thunderstorm | 490244 | cast-start: act_casting_c_hand.ros<br>cast-start: act_torodo_c_freeze_down.ros | cast-start: act_casting_c_hand.mp3<br>cast-start: act_torodo_c_freeze_down.mp3 |
| Plasma Arrow | 491169 | cast-start: act_electric_casting_c_hand_i.ros<br>release: act_electric_arrow_f_i.ros<br>impact: act_electric_explode_t_freeze_hit_e.ros | — |
| Electric Bolt | 491168 | cast-start: act_electric_casting_c_hand_i.ros<br>release: act_electric_ball_f_i.ros<br>impact: act_electric_ball_t_freeze_hit_e.ros<br>impact: act_electric_dot_t_down_e.ros | — |
| Electric Explosion | 491170 | cast-start: act_electric_casting_c_hand_i.ros<br>impact: act_electric_explode_f_i.ros<br>impact: act_electric_explode_t_freeze_hit_e.ros | — |
| Electric Compression | 491171 | cast-start: act_electricnet_recharge_c_down_e.ros | — |
| Static Field | 491172 | cast-start: act_electric_casting_c_hand_i.ros<br>cast-start: act_electric_net_c_down_e.ros<br>impact: act_electric_net_t_down_i.ros | — |
| Fireball | 490204 | cast-start: act_fire_hand_wave_c_hand_e.ros<br>release: act_fireball02_f.ros | release: act_fireball02_f.mp3 |
| Lightning | 490212 | cast-start: act_wind_hand_wave_c_hand_e.ros | — |
| Elemental Weakness | 490247, 497977 | cast-start: act_casting_c_hand.ros<br>impact: act_elementdecay_t_down.ros | cast-start: act_dark_casting_c_hand.wav<br>impact: act_elementdecay_t_down.mp3 |
| Thunderstorm | 490244 | cast-start: act_casting_c_hand.ros<br>cast-start: act_torodo_c_freeze_down.ros<br>impact: act_rushlevel_fail_c_hit.ros | cast-start: act_casting_c_hand.mp3<br>cast-start: act_torodo_c_freeze_down.ros.mp3<br>impact: act_rushlevel_fail_c_hit.ros.mp3 |
| Plasma Arrow | 491169 | cast-start: act_electric_casting_c_hand_i.ros<br>release: act_electric_arrow_f_i.ros<br>impact: act_electric_explode_t_freeze_hit_e.ros | cast-start: act_electric_casting_c_hand_i_db.mp3<br>cast-start: act_electric_casting_c_hand_ifadein.mp3<br>release: act_electric_arrow_f_i.ros.mp3<br>impact: act_electric_explode_t_freeze_hit_e.ros.mp3 |
| Electric Bolt | 491168 | cast-start: act_electric_casting_c_hand_i.ros<br>release: act_electric_ball_f_i.ros<br>impact: act_electric_ball_t_freeze_hit_e.ros<br>impact: act_electric_dot_t_down_e.ros | cast-start: act_electric_casting_c_hand_i_db.mp3<br>cast-start: act_electric_casting_c_hand_ifadein.mp3<br>impact: act_electric_dot_t_down_e.ros.mp3 |
| Electric Explosion | 491170 | cast-start: act_electric_casting_c_hand_i.ros<br>impact: act_electric_explode_f_i.ros<br>impact: act_electric_explode_t_freeze_hit_e.ros | cast-start: act_electric_casting_c_hand_i_db.mp3<br>cast-start: act_electric_casting_c_hand_ifadein.mp3<br>impact: act_electric_explode_f_i.ros.mp3<br>impact: act_electric_explode_t_freeze_hit_e.ros.mp3 |
| Electric Compression | 491171 | cast-start: act_electricnet_recharge_c_down_e.ros | cast-start: act_electricnet_recharge_c_down_e.ros.mp3 |
| Static Field | 491172 | cast-start: act_electric_casting_c_hand_i.ros<br>cast-start: act_electric_net_c_down_e.ros<br>impact: act_electric_net_t_down_i.ros | cast-start: act_electric_casting_c_hand_i_db.mp3<br>cast-start: act_electric_casting_c_hand_ifadein.mp3<br>cast-start: act_electric_net_c_down_e.ros.mp3<br>impact: act_electric_net_t_down_i.ros.mp3 |
| Fireball | 490204 | cast-start: act_fire_hand_wave_c_hand_e.ros<br>cast-start: act_deep_thought_c_down_e.ros<br>release: act_fireball02_f.ros<br>impact: act_fireball02_t_hit_point.ros | cast-start: act_fire_hand_wave_c_hand_e.ros.mp3<br>release: act_fireball02_f.mp3<br>impact: act_fireball02_t_hit_point.mp3 |
| Lightning | 490212 | cast-start: act_wind_hand_wave_c_hand_e.ros<br>cast-start: act_deep_thought_c_down_e.ros<br>impact: act_summonlighting_t_hit_point.ros | impact: act_summonlighting_t_hit_point.mp3 |
| Intensification | 490225, 497976 | — | — |
| Silence | 490296 | cast-start: act_casting_c_hand.ros<br>cast-start: act_dark_hand_wave_c_hand_e.ros | — |
| Silence | 490296 | cast-start: act_casting_c_hand.ros<br>cast-start: act_dark_hand_wave_c_hand_e.ros | cast-start: act_dark_casting_c_hand.wav |
| Fire Ward | 490248 | cast-start: act_vengeance_c_hand.ros<br>cast-start: act_fireresistance_c_top.ros | cast-start: act_vengeance_c_hand.mp3<br>cast-start: act_fireresistance_c_top.mp3 |
## Mage — accepted elite pair
@@ -195,11 +195,11 @@ The effect column records original client ROS/RAS references and their cast phas
| Breath Erase | 498750 | cast-start: act_hide_c_down_e.ros | cast-start: act_hide_c_down_e.mp3 |
| Soul Stepping | 498757 | cast-start: act_soul_walker_c_down_e.ros | cast-start: act_soul_walker_c_down_e.mp3 |
| Deep Inspiration | 498758 | cast-start: act_deep_open_c_down_e.ros | cast-start: act_deep_open_c_down_e.mp3 |
| Fire Lightning Burst | 498759 | cast-start: act_fireball01_c_hand_i.ros<br>cast-start: act_electric_casting_c_hand_i.ros<br>release: act_fire-thunder_f.ros<br>impact: act_fire-thunder_t_hitpoint_e.ros | impact: act_fire-thunder_t_hitpoint_e.mp3 |
| Fire Lightning Burst | 498759 | cast-start: act_fireball01_c_hand_i.ros<br>cast-start: act_electric_casting_c_hand_i.ros<br>release: act_fire-thunder_f.ros<br>impact: act_fire-thunder_t_hitpoint_e.ros | cast-start: act_vengeance_c_hand.mp3<br>cast-start: act_electric_casting_c_hand_i_db.mp3<br>cast-start: act_electric_casting_c_hand_ifadein.mp3<br>release: act_fire-thunder_f02.wav<br>release: act_fire-thunder_f01.mp3<br>impact: act_fire-thunder_t_hitpoint_e.mp3 |
## Decoded particle archive
The particle archive covers 124 referenced ROS models, with 7 fully decoded models and 117 partial models. 7 models are renderer-ready and 1 has a browser-playable partial original. The Priest holy cast's remaining EventTrigger is an audio callback; Urgent Heal's target renders its source sprites, emitted rune mesh, and animated ground decal. Its terrain-triangle decal projection remains approximated by a level plane. The archive exports 515 sprite controllers and 106 distinct PNG textures. See `public/assets/game/combat-effects/original/runewaker/manifest.json` for per-model details.
The particle archive covers 170 referenced ROS models, with 9 fully decoded models and 161 partial models. 74 models are renderer-ready and 1 has a browser-playable partial original. The Priest holy cast's remaining EventTrigger is an audio callback; Urgent Heal's target renders its source sprites, emitted rune mesh, and animated ground decal. Its terrain-triangle decal projection remains approximated by a level plane. The archive exports 668 sprite controllers and 139 distinct PNG textures. See `public/assets/game/combat-effects/original/runewaker/manifest.json` for per-model details.
## Next conversion step
Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

+121
View File
@@ -0,0 +1,121 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="700" viewBox="0 0 1200 700">
<defs>
<linearGradient id="backdrop" x2="1" y2="1"><stop stop-color="#193628"/><stop offset="1" stop-color="#06100e"/></linearGradient>
<linearGradient id="panel" x2="1" y2="1"><stop stop-color="#27312a"/><stop offset="1" stop-color="#0c1714"/></linearGradient>
<radialGradient id="portrait"><stop stop-color="#435549"/><stop offset="1" stop-color="#111d1a"/></radialGradient>
<linearGradient id="scale" x2=".8" y2="1"><stop stop-color="#aac49b"/><stop offset=".45" stop-color="#4d8067"/><stop offset="1" stop-color="#1d4b42"/></linearGradient>
<linearGradient id="belly" x2="1" y2=".8"><stop stop-color="#eee5a5"/><stop offset="1" stop-color="#a7a474"/></linearGradient>
<linearGradient id="guardian-fill" x2=".8" y2="1"><stop stop-color="#aad36f"/><stop offset=".48" stop-color="#568d49"/><stop offset="1" stop-color="#274f37"/></linearGradient>
<filter id="shadow"><feDropShadow dx="0" dy="12" stdDeviation="17" flood-opacity=".7"/></filter>
<filter id="creature-shadow"><feDropShadow dx="0" dy="5" stdDeviation="4" flood-opacity=".7"/></filter>
<g id="serpent" filter="url(#creature-shadow)">
<path d="M24 92 C8 75 30 61 53 69 C84 79 89 55 69 45 C53 37 54 23 67 18" fill="none" stroke="#193f37" stroke-width="26" stroke-linecap="round"/>
<path d="M24 91 C12 77 36 65 55 73 C82 82 92 54 70 44 C56 36 57 23 68 18" fill="none" stroke="url(#scale)" stroke-width="19" stroke-linecap="round"/>
<path d="M27 84 C35 76 43 75 52 78 M67 73 C75 70 79 62 78 56 M67 41 C59 32 62 22 68 18" fill="none" stroke="url(#belly)" stroke-width="6" stroke-linecap="round" opacity=".85"/>
<path d="M62 25 L56 15 L64 18 L67 9 L74 17 L82 14 L79 25 Q78 35 70 36 Q61 35 62 25" fill="url(#scale)" stroke="#173d34" stroke-width="2"/>
<path d="M62 33 Q69 43 77 33 L73 48 L69 40 L64 48Z" fill="#e2cf9c"/>
<circle cx="65" cy="25" r="2.5" fill="#f8d378"/><circle cx="75" cy="25" r="2.5" fill="#f8d378"/>
</g>
<g id="guardian" filter="url(#creature-shadow)">
<path d="M40 92 L22 76 L17 47 L29 28 L43 22 L63 26 L77 43 L82 75 L65 91Z" fill="url(#guardian-fill)" stroke="#214c30" stroke-width="3"/>
<path d="M24 41 L11 20 L31 31 M72 40 L90 18 L75 50" fill="url(#guardian-fill)" stroke="#214c30" stroke-width="3"/>
<path d="M38 30 L40 15 L50 25 L60 14 L66 33 M27 58 L10 53 L25 72 M76 59 L91 54 L80 76" fill="#427d3d" stroke="#1b472b" stroke-width="3"/>
<path d="M40 43 Q50 51 61 43 L65 71 Q50 80 35 69Z" fill="#9cc372" opacity=".8"/>
<path d="M35 38 L45 42 L41 46 M65 38 L55 42 L59 46" fill="#eae99e"/>
<path d="M40 58 Q50 63 61 58" fill="none" stroke="#173e29" stroke-width="4"/>
</g>
<g id="mutant" filter="url(#creature-shadow)">
<path d="M30 90 L20 65 L30 37 L45 29 L58 31 L73 45 L80 69 L68 91Z" fill="url(#scale)" stroke="#214b3e" stroke-width="3"/>
<path d="M34 35 L21 19 L24 42 M62 36 L75 18 L75 46" fill="url(#scale)" stroke="#214b3e" stroke-width="3"/>
<path d="M21 61 L5 53 L18 80 M76 58 L92 48 L84 80" fill="none" stroke="#376b56" stroke-width="12" stroke-linecap="round"/>
<path d="M36 51 L46 54 M62 51 L55 54" stroke="#e7dc89" stroke-width="5" stroke-linecap="round"/>
<path d="M38 66 Q49 80 62 66 L58 75 L54 69 L50 79 L46 69 L42 75Z" fill="#eadfb3"/>
</g>
</defs>
<rect width="1200" height="700" fill="url(#backdrop)"/>
<path d="M0 660Q130 310 300 490T760 365T1200 470V700H0" fill="#2c5037" opacity=".24"/>
<rect x="58" y="34" width="1084" height="632" rx="16" fill="url(#panel)" stroke="#8d7d56" stroke-width="2" filter="url(#shadow)"/>
<text x="88" y="102" font-family="Georgia,serif" font-size="38" fill="#f3ead1">Wailing Caverns</text>
<text x="88" y="132" font-family="Arial,sans-serif" font-size="14" fill="#b8b5a7">6 bosses ahead · 2 collected</text>
<path d="M978 56V140" stroke="#88764f"/>
<text x="1050" y="78" text-anchor="middle" font-family="Arial,sans-serif" font-size="11" letter-spacing="2" fill="#b8b5a7">ENTERING IN</text>
<text x="1050" y="134" text-anchor="middle" font-family="Georgia,serif" font-size="60" fill="#d5b875">05</text>
<g transform="translate(88 166)">
<rect width="320" height="210" rx="9" fill="#151f1b" stroke="#69b4ff" stroke-width="2"/>
<rect x="1" y="1" width="318" height="28" rx="8" fill="#0a1410"/>
<text x="12" y="19" font-family="Arial,sans-serif" font-size="11" letter-spacing="2" fill="#efe8d7">BOSS 01</text>
<text x="307" y="19" text-anchor="end" font-family="Arial,sans-serif" font-size="10" fill="#69b4ff">COLLECTED</text>
<rect x="7" y="31" width="306" height="113" rx="3" fill="url(#portrait)"/>
<ellipse cx="160" cy="137" rx="53" ry="5" fill="#030a08" opacity=".7"/>
<use href="#serpent" transform="translate(105 30) scale(1.08)"/>
<text x="13" y="164" font-family="Georgia,serif" font-size="20" fill="#f3ead1">Lady Anacondra</text>
<text x="13" y="181" font-family="Arial,sans-serif" font-size="11" fill="#b8b5a7">3 copies owned</text>
<path d="M0 187H320" stroke="#536357" opacity=".6"/>
<g transform="translate(12 191)"><rect width="21" height="21" rx="3" fill="#2a3a3c" stroke="#ddd8ce"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#ddd8ce">N</text></g><g transform="translate(39 191)"><rect width="21" height="21" rx="3" fill="#2a3a3c" stroke="#69b4ff"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#69b4ff">R</text></g><g transform="translate(66 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">E</text></g><g transform="translate(93 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">L</text></g>
</g>
<g transform="translate(440 166)">
<rect width="320" height="210" rx="9" fill="#151f1b" stroke="#69756b" stroke-width="1"/>
<rect x="1" y="1" width="318" height="28" rx="8" fill="#0a1410"/>
<text x="12" y="19" font-family="Arial,sans-serif" font-size="11" letter-spacing="2" fill="#efe8d7">BOSS 02</text>
<text x="307" y="19" text-anchor="end" font-family="Arial,sans-serif" font-size="10" fill="#a5a99b">UNCOLLECTED</text>
<rect x="7" y="31" width="306" height="113" rx="3" fill="url(#portrait)"/>
<ellipse cx="160" cy="137" rx="53" ry="5" fill="#030a08" opacity=".7"/>
<use href="#serpent" transform="translate(105 30) scale(1.08)"/>
<text x="13" y="164" font-family="Georgia,serif" font-size="20" fill="#f3ead1">Lord Cobrahn</text>
<text x="13" y="181" font-family="Arial,sans-serif" font-size="11" fill="#b8b5a7">Card not collected</text>
<path d="M0 187H320" stroke="#536357" opacity=".6"/>
<g transform="translate(12 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">N</text></g><g transform="translate(39 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">R</text></g><g transform="translate(66 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">E</text></g><g transform="translate(93 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">L</text></g>
</g>
<g transform="translate(792 166)">
<rect width="320" height="210" rx="9" fill="#151f1b" stroke="#69756b" stroke-width="1"/>
<rect x="1" y="1" width="318" height="28" rx="8" fill="#0a1410"/>
<text x="12" y="19" font-family="Arial,sans-serif" font-size="11" letter-spacing="2" fill="#efe8d7">BOSS 03</text>
<text x="307" y="19" text-anchor="end" font-family="Arial,sans-serif" font-size="10" fill="#a5a99b">UNCOLLECTED</text>
<rect x="7" y="31" width="306" height="113" rx="3" fill="url(#portrait)"/>
<ellipse cx="160" cy="137" rx="53" ry="5" fill="#030a08" opacity=".7"/>
<use href="#serpent" transform="translate(105 30) scale(1.08)"/>
<text x="13" y="164" font-family="Georgia,serif" font-size="20" fill="#f3ead1">Lord Pythas</text>
<text x="13" y="181" font-family="Arial,sans-serif" font-size="11" fill="#b8b5a7">Card not collected</text>
<path d="M0 187H320" stroke="#536357" opacity=".6"/>
<g transform="translate(12 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">N</text></g><g transform="translate(39 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">R</text></g><g transform="translate(66 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">E</text></g><g transform="translate(93 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">L</text></g>
</g>
<g transform="translate(88 392)">
<rect width="320" height="210" rx="9" fill="#151f1b" stroke="#c493ff" stroke-width="2"/>
<rect x="1" y="1" width="318" height="28" rx="8" fill="#0a1410"/>
<text x="12" y="19" font-family="Arial,sans-serif" font-size="11" letter-spacing="2" fill="#efe8d7">BOSS 04</text>
<text x="307" y="19" text-anchor="end" font-family="Arial,sans-serif" font-size="10" fill="#c493ff">COLLECTED</text>
<rect x="7" y="31" width="306" height="113" rx="3" fill="url(#portrait)"/>
<ellipse cx="160" cy="137" rx="53" ry="5" fill="#030a08" opacity=".7"/>
<use href="#guardian" transform="translate(105 30) scale(1.08)"/>
<text x="13" y="164" font-family="Georgia,serif" font-size="18" fill="#f3ead1">Verdan the Everliving</text>
<text x="13" y="181" font-family="Arial,sans-serif" font-size="11" fill="#b8b5a7">5 copies owned</text>
<path d="M0 187H320" stroke="#536357" opacity=".6"/>
<g transform="translate(12 191)"><rect width="21" height="21" rx="3" fill="#2a3a3c" stroke="#ddd8ce"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#ddd8ce">N</text></g><g transform="translate(39 191)"><rect width="21" height="21" rx="3" fill="#2a3a3c" stroke="#69b4ff"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#69b4ff">R</text></g><g transform="translate(66 191)"><rect width="21" height="21" rx="3" fill="#2a3a3c" stroke="#c493ff"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#c493ff">E</text></g><g transform="translate(93 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">L</text></g>
</g>
<g transform="translate(440 392)">
<rect width="320" height="210" rx="9" fill="#151f1b" stroke="#69756b" stroke-width="1"/>
<rect x="1" y="1" width="318" height="28" rx="8" fill="#0a1410"/>
<text x="12" y="19" font-family="Arial,sans-serif" font-size="11" letter-spacing="2" fill="#efe8d7">BOSS 05</text>
<text x="307" y="19" text-anchor="end" font-family="Arial,sans-serif" font-size="10" fill="#a5a99b">UNCOLLECTED</text>
<rect x="7" y="31" width="306" height="113" rx="3" fill="url(#portrait)"/>
<ellipse cx="160" cy="137" rx="53" ry="5" fill="#030a08" opacity=".7"/>
<use href="#serpent" transform="translate(105 30) scale(1.08)"/>
<text x="13" y="164" font-family="Georgia,serif" font-size="20" fill="#f3ead1">Lord Serpentis</text>
<text x="13" y="181" font-family="Arial,sans-serif" font-size="11" fill="#b8b5a7">Card not collected</text>
<path d="M0 187H320" stroke="#536357" opacity=".6"/>
<g transform="translate(12 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">N</text></g><g transform="translate(39 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">R</text></g><g transform="translate(66 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">E</text></g><g transform="translate(93 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">L</text></g>
</g>
<g transform="translate(792 392)">
<rect width="320" height="210" rx="9" fill="#151f1b" stroke="#69756b" stroke-width="1"/>
<rect x="1" y="1" width="318" height="28" rx="8" fill="#0a1410"/>
<text x="12" y="19" font-family="Arial,sans-serif" font-size="11" letter-spacing="2" fill="#efe8d7">BOSS 06</text>
<text x="307" y="19" text-anchor="end" font-family="Arial,sans-serif" font-size="10" fill="#a5a99b">UNCOLLECTED</text>
<rect x="7" y="31" width="306" height="113" rx="3" fill="url(#portrait)"/>
<ellipse cx="160" cy="137" rx="53" ry="5" fill="#030a08" opacity=".7"/>
<use href="#mutant" transform="translate(105 30) scale(1.08)"/>
<text x="13" y="164" font-family="Georgia,serif" font-size="20" fill="#f3ead1">Mutanus the Devourer</text>
<text x="13" y="181" font-family="Arial,sans-serif" font-size="11" fill="#b8b5a7">Card not collected</text>
<path d="M0 187H320" stroke="#536357" opacity=".6"/>
<g transform="translate(12 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">N</text></g><g transform="translate(39 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">R</text></g><g transform="translate(66 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">E</text></g><g transform="translate(93 191)"><rect width="21" height="21" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="10.5" y="15" text-anchor="middle" font-family="Arial,sans-serif" font-size="12" fill="#79877d">L</text></g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

+125
View File
@@ -0,0 +1,125 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="700" viewBox="0 0 1200 700">
<defs>
<linearGradient id="backdrop" x2="1" y2="1"><stop stop-color="#193628"/><stop offset="1" stop-color="#06100e"/></linearGradient>
<linearGradient id="panel" x2="1" y2="1"><stop stop-color="#27312a"/><stop offset="1" stop-color="#0c1714"/></linearGradient>
<radialGradient id="portrait"><stop stop-color="#435549"/><stop offset="1" stop-color="#111d1a"/></radialGradient>
<linearGradient id="scale" x2=".8" y2="1"><stop stop-color="#aac49b"/><stop offset=".45" stop-color="#4d8067"/><stop offset="1" stop-color="#1d4b42"/></linearGradient>
<linearGradient id="belly" x2="1" y2=".8"><stop stop-color="#eee5a5"/><stop offset="1" stop-color="#a7a474"/></linearGradient>
<linearGradient id="guardian-fill" x2=".8" y2="1"><stop stop-color="#aad36f"/><stop offset=".48" stop-color="#568d49"/><stop offset="1" stop-color="#274f37"/></linearGradient>
<filter id="shadow"><feDropShadow dx="0" dy="12" stdDeviation="17" flood-opacity=".7"/></filter>
<filter id="creature-shadow"><feDropShadow dx="0" dy="5" stdDeviation="4" flood-opacity=".7"/></filter>
<g id="serpent" filter="url(#creature-shadow)">
<path d="M24 92 C8 75 30 61 53 69 C84 79 89 55 69 45 C53 37 54 23 67 18" fill="none" stroke="#193f37" stroke-width="26" stroke-linecap="round"/>
<path d="M24 91 C12 77 36 65 55 73 C82 82 92 54 70 44 C56 36 57 23 68 18" fill="none" stroke="url(#scale)" stroke-width="19" stroke-linecap="round"/>
<path d="M27 84 C35 76 43 75 52 78 M67 73 C75 70 79 62 78 56 M67 41 C59 32 62 22 68 18" fill="none" stroke="url(#belly)" stroke-width="6" stroke-linecap="round" opacity=".85"/>
<path d="M62 25 L56 15 L64 18 L67 9 L74 17 L82 14 L79 25 Q78 35 70 36 Q61 35 62 25" fill="url(#scale)" stroke="#173d34" stroke-width="2"/>
<path d="M62 33 Q69 43 77 33 L73 48 L69 40 L64 48Z" fill="#e2cf9c"/>
<circle cx="65" cy="25" r="2.5" fill="#f8d378"/><circle cx="75" cy="25" r="2.5" fill="#f8d378"/>
</g>
<g id="guardian" filter="url(#creature-shadow)">
<path d="M40 92 L22 76 L17 47 L29 28 L43 22 L63 26 L77 43 L82 75 L65 91Z" fill="url(#guardian-fill)" stroke="#214c30" stroke-width="3"/>
<path d="M24 41 L11 20 L31 31 M72 40 L90 18 L75 50" fill="url(#guardian-fill)" stroke="#214c30" stroke-width="3"/>
<path d="M38 30 L40 15 L50 25 L60 14 L66 33 M27 58 L10 53 L25 72 M76 59 L91 54 L80 76" fill="#427d3d" stroke="#1b472b" stroke-width="3"/>
<path d="M40 43 Q50 51 61 43 L65 71 Q50 80 35 69Z" fill="#9cc372" opacity=".8"/>
<path d="M35 38 L45 42 L41 46 M65 38 L55 42 L59 46" fill="#eae99e"/>
<path d="M40 58 Q50 63 61 58" fill="none" stroke="#173e29" stroke-width="4"/>
</g>
<g id="mutant" filter="url(#creature-shadow)">
<path d="M30 90 L20 65 L30 37 L45 29 L58 31 L73 45 L80 69 L68 91Z" fill="url(#scale)" stroke="#214b3e" stroke-width="3"/>
<path d="M34 35 L21 19 L24 42 M62 36 L75 18 L75 46" fill="url(#scale)" stroke="#214b3e" stroke-width="3"/>
<path d="M21 61 L5 53 L18 80 M76 58 L92 48 L84 80" fill="none" stroke="#376b56" stroke-width="12" stroke-linecap="round"/>
<path d="M36 51 L46 54 M62 51 L55 54" stroke="#e7dc89" stroke-width="5" stroke-linecap="round"/>
<path d="M38 66 Q49 80 62 66 L58 75 L54 69 L50 79 L46 69 L42 75Z" fill="#eadfb3"/>
</g>
</defs>
<rect width="1200" height="700" fill="url(#backdrop)"/>
<path d="M0 680Q130 370 320 520T700 390T1200 540V700H0" fill="#275137" opacity=".32"/>
<rect width="1200" height="700" fill="#020705" opacity=".58"/>
<rect x="150" y="30" width="900" height="640" rx="15" fill="url(#panel)" stroke="#8d7d56" stroke-width="2" filter="url(#shadow)"/>
<text x="180" y="80" font-family="Arial,sans-serif" font-size="24" font-weight="bold" letter-spacing="4" fill="#f3ead1">PAUSED</text>
<circle cx="779" cy="70" r="22" fill="#253a31" stroke="#b7b381"/>
<text x="779" y="78" text-anchor="middle" font-family="Georgia,serif" font-size="23" fill="#d5b875">+</text>
<text x="814" y="67" font-family="Arial,sans-serif" font-size="17" font-weight="bold" fill="#f3ead1">Aria</text>
<text x="814" y="86" font-family="Arial,sans-serif" font-size="12" fill="#b8b5a7">Level 24 · Priest / Discipline</text>
<path d="M178 105H1022" stroke="#8d7d56" opacity=".6"/>
<text x="180" y="131" font-family="Arial,sans-serif" font-size="12" font-weight="bold" letter-spacing="1" fill="#d5b875">BOSS CARDS IN THIS DUNGEON</text>
<text x="1018" y="131" text-anchor="end" font-family="Arial,sans-serif" font-size="12" fill="#b8b5a7">2 / 6 COLLECTED</text>
<g transform="translate(180 145)">
<rect width="155" height="171" rx="7" fill="#17231e" stroke="#69b4ff"/>
<rect x="1" y="1" width="153" height="20" rx="6" fill="#0a1410"/>
<text x="8" y="14" font-family="Arial,sans-serif" font-size="8" letter-spacing="1" fill="#e9e2d2">BOSS 01</text>
<text x="147" y="14" text-anchor="end" font-family="Arial,sans-serif" font-size="8" fill="#69b4ff">OWNED</text>
<rect x="4" y="23" width="147" height="79" fill="url(#portrait)"/>
<ellipse cx="78" cy="100" rx="37" ry="4" fill="#030a08" opacity=".6"/>
<use href="#serpent" transform="translate(46 22) scale(.67)"/>
<text x="7" y="120" font-family="Georgia,serif" font-size="12" fill="#f3ead1">Lady Anacondra</text>
<text x="7" y="136" font-family="Arial,sans-serif" font-size="9" fill="#b8b5a7">3 copies owned</text>
<path d="M0 143H155" stroke="#536357" opacity=".6"/>
<g transform="translate(8 148)"><rect width="15" height="15" rx="3" fill="#2a3a3c" stroke="#ddd8ce"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#ddd8ce">N</text></g><g transform="translate(27 148)"><rect width="15" height="15" rx="3" fill="#2a3a3c" stroke="#69b4ff"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#69b4ff">R</text></g><g transform="translate(46 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">E</text></g><g transform="translate(65 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">L</text></g>
</g>
<g transform="translate(349 145)">
<rect width="155" height="171" rx="7" fill="#17231e" stroke="#6e796d"/>
<rect x="1" y="1" width="153" height="20" rx="6" fill="#0a1410"/>
<text x="8" y="14" font-family="Arial,sans-serif" font-size="8" letter-spacing="1" fill="#e9e2d2">BOSS 02</text>
<text x="147" y="14" text-anchor="end" font-family="Arial,sans-serif" font-size="8" fill="#a5a99b">MISSING</text>
<rect x="4" y="23" width="147" height="79" fill="url(#portrait)"/>
<ellipse cx="78" cy="100" rx="37" ry="4" fill="#030a08" opacity=".6"/>
<use href="#serpent" transform="translate(46 22) scale(.67)"/>
<text x="7" y="120" font-family="Georgia,serif" font-size="12" fill="#f3ead1">Lord Cobrahn</text>
<text x="7" y="136" font-family="Arial,sans-serif" font-size="9" fill="#b8b5a7">Not collected</text>
<path d="M0 143H155" stroke="#536357" opacity=".6"/>
<g transform="translate(8 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">N</text></g><g transform="translate(27 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">R</text></g><g transform="translate(46 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">E</text></g><g transform="translate(65 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">L</text></g>
</g>
<g transform="translate(518 145)">
<rect width="155" height="171" rx="7" fill="#17231e" stroke="#6e796d"/>
<rect x="1" y="1" width="153" height="20" rx="6" fill="#0a1410"/>
<text x="8" y="14" font-family="Arial,sans-serif" font-size="8" letter-spacing="1" fill="#e9e2d2">BOSS 03</text>
<text x="147" y="14" text-anchor="end" font-family="Arial,sans-serif" font-size="8" fill="#a5a99b">MISSING</text>
<rect x="4" y="23" width="147" height="79" fill="url(#portrait)"/>
<ellipse cx="78" cy="100" rx="37" ry="4" fill="#030a08" opacity=".6"/>
<use href="#serpent" transform="translate(46 22) scale(.67)"/>
<text x="7" y="120" font-family="Georgia,serif" font-size="12" fill="#f3ead1">Lord Pythas</text>
<text x="7" y="136" font-family="Arial,sans-serif" font-size="9" fill="#b8b5a7">Not collected</text>
<path d="M0 143H155" stroke="#536357" opacity=".6"/>
<g transform="translate(8 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">N</text></g><g transform="translate(27 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">R</text></g><g transform="translate(46 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">E</text></g><g transform="translate(65 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">L</text></g>
</g>
<g transform="translate(687 145)">
<rect width="155" height="171" rx="7" fill="#17231e" stroke="#c493ff"/>
<rect x="1" y="1" width="153" height="20" rx="6" fill="#0a1410"/>
<text x="8" y="14" font-family="Arial,sans-serif" font-size="8" letter-spacing="1" fill="#e9e2d2">BOSS 04</text>
<text x="147" y="14" text-anchor="end" font-family="Arial,sans-serif" font-size="8" fill="#c493ff">OWNED</text>
<rect x="4" y="23" width="147" height="79" fill="url(#portrait)"/>
<ellipse cx="78" cy="100" rx="37" ry="4" fill="#030a08" opacity=".6"/>
<use href="#guardian" transform="translate(46 22) scale(.67)"/>
<text x="7" y="120" font-family="Georgia,serif" font-size="10" fill="#f3ead1">Verdan the Everliving</text>
<text x="7" y="136" font-family="Arial,sans-serif" font-size="9" fill="#b8b5a7">5 copies owned</text>
<path d="M0 143H155" stroke="#536357" opacity=".6"/>
<g transform="translate(8 148)"><rect width="15" height="15" rx="3" fill="#2a3a3c" stroke="#ddd8ce"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#ddd8ce">N</text></g><g transform="translate(27 148)"><rect width="15" height="15" rx="3" fill="#2a3a3c" stroke="#69b4ff"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#69b4ff">R</text></g><g transform="translate(46 148)"><rect width="15" height="15" rx="3" fill="#2a3a3c" stroke="#c493ff"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#c493ff">E</text></g><g transform="translate(65 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">L</text></g>
</g>
<g transform="translate(856 145)">
<rect width="155" height="171" rx="7" fill="#17231e" stroke="#6e796d"/>
<rect x="1" y="1" width="153" height="20" rx="6" fill="#0a1410"/>
<text x="8" y="14" font-family="Arial,sans-serif" font-size="8" letter-spacing="1" fill="#e9e2d2">BOSS 05</text>
<text x="147" y="14" text-anchor="end" font-family="Arial,sans-serif" font-size="8" fill="#a5a99b">MISSING</text>
<rect x="4" y="23" width="147" height="79" fill="url(#portrait)"/>
<ellipse cx="78" cy="100" rx="37" ry="4" fill="#030a08" opacity=".6"/>
<use href="#serpent" transform="translate(46 22) scale(.67)"/>
<text x="7" y="120" font-family="Georgia,serif" font-size="12" fill="#f3ead1">Lord Serpentis</text>
<text x="7" y="136" font-family="Arial,sans-serif" font-size="9" fill="#b8b5a7">Not collected</text>
<path d="M0 143H155" stroke="#536357" opacity=".6"/>
<g transform="translate(8 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">N</text></g><g transform="translate(27 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">R</text></g><g transform="translate(46 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">E</text></g><g transform="translate(65 148)"><rect width="15" height="15" rx="3" fill="#252f2c" stroke="#5c6a60"/><text x="7.5" y="11" text-anchor="middle" font-family="Arial,sans-serif" font-size="9" fill="#79877d">L</text></g>
</g>
<text x="1018" y="335" text-anchor="end" font-family="Arial,sans-serif" font-size="11" fill="#9fa994">SCROLL →</text>
<path d="M178 347H1022" stroke="#8d7d56" opacity=".6"/>
<rect x="440" y="364" width="320" height="45" rx="8" fill="#587348" stroke="#9bb477"/>
<text x="600" y="393" text-anchor="middle" font-family="Arial,sans-serif" font-size="16" font-weight="bold" fill="#fbfee9">Resume game</text>
<g font-family="Arial,sans-serif">
<rect x="180" y="427" width="384" height="101" rx="8" fill="#1a2621" stroke="#526153"/>
<rect x="636" y="427" width="384" height="101" rx="8" fill="#1a2621" stroke="#526153"/>
<rect x="180" y="544" width="384" height="101" rx="8" fill="#1a2621" stroke="#526153"/>
<rect x="636" y="544" width="384" height="101" rx="8" fill="#1a2621" stroke="#526153"/>
<g fill="#b8b5a7" font-size="12" font-weight="bold" letter-spacing="2"><text x="195" y="451">ADVENTURE</text><text x="651" y="451">CHARACTER</text><text x="195" y="568">SETTINGS</text><text x="651" y="568">SESSION</text></g>
<g fill="#314136" stroke="#64795d"><rect x="195" y="466" width="169" height="43" rx="6"/><rect x="379" y="466" width="169" height="43" rx="6"/><rect x="651" y="466" width="169" height="43" rx="6"/><rect x="835" y="466" width="169" height="43" rx="6"/><rect x="195" y="583" width="169" height="43" rx="6"/><rect x="379" y="583" width="169" height="43" rx="6"/><rect x="651" y="583" width="169" height="43" rx="6"/><rect x="835" y="583" width="169" height="43" rx="6"/></g>
<g fill="#eee9d9" font-size="12" text-anchor="middle"><text x="279" y="493">Party management</text><text x="463" y="493">Dungeon map</text><text x="735" y="493">Inventory</text><text x="919" y="493">Spellbook</text><text x="279" y="610">Options</text><text x="463" y="610">Keybinds</text><text x="735" y="610">Return to entrance</text><text x="919" y="610">Main menu</text></g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

@@ -0,0 +1,142 @@
import { writeFile } from "node:fs/promises";
import { fileURLToPath } from "node:url";
import { dirname, join } from "node:path";
import sharp from "sharp";
const outputDir = dirname(fileURLToPath(import.meta.url));
const bosses = [
{ name: "Lady Anacondra", copies: "3 copies owned", owned: true, accent: "#69b4ff", shape: "serpent" },
{ name: "Lord Cobrahn", copies: "Card not collected", owned: false, accent: "#a5a99b", shape: "serpent" },
{ name: "Lord Pythas", copies: "Card not collected", owned: false, accent: "#a5a99b", shape: "serpent" },
{ name: "Verdan the Everliving", copies: "5 copies owned", owned: true, accent: "#c493ff", shape: "guardian" },
{ name: "Lord Serpentis", copies: "Card not collected", owned: false, accent: "#a5a99b", shape: "serpent" },
{ name: "Mutanus the Devourer", copies: "Card not collected", owned: false, accent: "#a5a99b", shape: "mutant" },
];
const defs = `<defs>
<linearGradient id="backdrop" x2="1" y2="1"><stop stop-color="#193628"/><stop offset="1" stop-color="#06100e"/></linearGradient>
<linearGradient id="panel" x2="1" y2="1"><stop stop-color="#27312a"/><stop offset="1" stop-color="#0c1714"/></linearGradient>
<radialGradient id="portrait"><stop stop-color="#435549"/><stop offset="1" stop-color="#111d1a"/></radialGradient>
<linearGradient id="scale" x2=".8" y2="1"><stop stop-color="#aac49b"/><stop offset=".45" stop-color="#4d8067"/><stop offset="1" stop-color="#1d4b42"/></linearGradient>
<linearGradient id="belly" x2="1" y2=".8"><stop stop-color="#eee5a5"/><stop offset="1" stop-color="#a7a474"/></linearGradient>
<linearGradient id="guardian-fill" x2=".8" y2="1"><stop stop-color="#aad36f"/><stop offset=".48" stop-color="#568d49"/><stop offset="1" stop-color="#274f37"/></linearGradient>
<filter id="shadow"><feDropShadow dx="0" dy="12" stdDeviation="17" flood-opacity=".7"/></filter>
<filter id="creature-shadow"><feDropShadow dx="0" dy="5" stdDeviation="4" flood-opacity=".7"/></filter>
<g id="serpent" filter="url(#creature-shadow)">
<path d="M24 92 C8 75 30 61 53 69 C84 79 89 55 69 45 C53 37 54 23 67 18" fill="none" stroke="#193f37" stroke-width="26" stroke-linecap="round"/>
<path d="M24 91 C12 77 36 65 55 73 C82 82 92 54 70 44 C56 36 57 23 68 18" fill="none" stroke="url(#scale)" stroke-width="19" stroke-linecap="round"/>
<path d="M27 84 C35 76 43 75 52 78 M67 73 C75 70 79 62 78 56 M67 41 C59 32 62 22 68 18" fill="none" stroke="url(#belly)" stroke-width="6" stroke-linecap="round" opacity=".85"/>
<path d="M62 25 L56 15 L64 18 L67 9 L74 17 L82 14 L79 25 Q78 35 70 36 Q61 35 62 25" fill="url(#scale)" stroke="#173d34" stroke-width="2"/>
<path d="M62 33 Q69 43 77 33 L73 48 L69 40 L64 48Z" fill="#e2cf9c"/>
<circle cx="65" cy="25" r="2.5" fill="#f8d378"/><circle cx="75" cy="25" r="2.5" fill="#f8d378"/>
</g>
<g id="guardian" filter="url(#creature-shadow)">
<path d="M40 92 L22 76 L17 47 L29 28 L43 22 L63 26 L77 43 L82 75 L65 91Z" fill="url(#guardian-fill)" stroke="#214c30" stroke-width="3"/>
<path d="M24 41 L11 20 L31 31 M72 40 L90 18 L75 50" fill="url(#guardian-fill)" stroke="#214c30" stroke-width="3"/>
<path d="M38 30 L40 15 L50 25 L60 14 L66 33 M27 58 L10 53 L25 72 M76 59 L91 54 L80 76" fill="#427d3d" stroke="#1b472b" stroke-width="3"/>
<path d="M40 43 Q50 51 61 43 L65 71 Q50 80 35 69Z" fill="#9cc372" opacity=".8"/>
<path d="M35 38 L45 42 L41 46 M65 38 L55 42 L59 46" fill="#eae99e"/>
<path d="M40 58 Q50 63 61 58" fill="none" stroke="#173e29" stroke-width="4"/>
</g>
<g id="mutant" filter="url(#creature-shadow)">
<path d="M30 90 L20 65 L30 37 L45 29 L58 31 L73 45 L80 69 L68 91Z" fill="url(#scale)" stroke="#214b3e" stroke-width="3"/>
<path d="M34 35 L21 19 L24 42 M62 36 L75 18 L75 46" fill="url(#scale)" stroke="#214b3e" stroke-width="3"/>
<path d="M21 61 L5 53 L18 80 M76 58 L92 48 L84 80" fill="none" stroke="#376b56" stroke-width="12" stroke-linecap="round"/>
<path d="M36 51 L46 54 M62 51 L55 54" stroke="#e7dc89" stroke-width="5" stroke-linecap="round"/>
<path d="M38 66 Q49 80 62 66 L58 75 L54 69 L50 79 L46 69 L42 75Z" fill="#eadfb3"/>
</g>
</defs>`;
function rarityMarks(boss, x, y, compact = false) {
const size = compact ? 15 : 21;
const gap = compact ? 4 : 6;
return ["N", "R", "E", "L"].map((label, index) => {
const owned = boss.owned && (boss.name.startsWith("Verdan") ? index < 3 : index < 2);
const color = ["#ddd8ce", "#69b4ff", "#c493ff", "#e5a757"][index];
return `<g transform="translate(${x + index * (size + gap)} ${y})"><rect width="${size}" height="${size}" rx="3" fill="${owned ? "#2a3a3c" : "#252f2c"}" stroke="${owned ? color : "#5c6a60"}"/><text x="${size / 2}" y="${compact ? 11 : 15}" text-anchor="middle" font-family="Arial,sans-serif" font-size="${compact ? 9 : 12}" fill="${owned ? color : "#79877d"}">${label}</text></g>`;
}).join("");
}
function largeCard(boss, index) {
const x = 88 + index % 3 * 352;
const y = 166 + Math.floor(index / 3) * 226;
const owned = boss.owned;
return `<g transform="translate(${x} ${y})">
<rect width="320" height="210" rx="9" fill="#151f1b" stroke="${owned ? boss.accent : "#69756b"}" stroke-width="${owned ? 2 : 1}"/>
<rect x="1" y="1" width="318" height="28" rx="8" fill="#0a1410"/>
<text x="12" y="19" font-family="Arial,sans-serif" font-size="11" letter-spacing="2" fill="#efe8d7">BOSS ${String(index + 1).padStart(2, "0")}</text>
<text x="307" y="19" text-anchor="end" font-family="Arial,sans-serif" font-size="10" fill="${boss.accent}">${owned ? "COLLECTED" : "UNCOLLECTED"}</text>
<rect x="7" y="31" width="306" height="113" rx="3" fill="url(#portrait)"/>
<ellipse cx="160" cy="137" rx="53" ry="5" fill="#030a08" opacity=".7"/>
<use href="#${boss.shape}" transform="translate(105 30) scale(1.08)"/>
<text x="13" y="164" font-family="Georgia,serif" font-size="${boss.name.length > 20 ? 18 : 20}" fill="#f3ead1">${boss.name}</text>
<text x="13" y="181" font-family="Arial,sans-serif" font-size="11" fill="#b8b5a7">${boss.copies}</text>
<path d="M0 187H320" stroke="#536357" opacity=".6"/>
${rarityMarks(boss, 12, 191)}
</g>`;
}
const countdown = `<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="700" viewBox="0 0 1200 700">
${defs}
<rect width="1200" height="700" fill="url(#backdrop)"/>
<path d="M0 660Q130 310 300 490T760 365T1200 470V700H0" fill="#2c5037" opacity=".24"/>
<rect x="58" y="34" width="1084" height="632" rx="16" fill="url(#panel)" stroke="#8d7d56" stroke-width="2" filter="url(#shadow)"/>
<text x="88" y="102" font-family="Georgia,serif" font-size="38" fill="#f3ead1">Wailing Caverns</text>
<text x="88" y="132" font-family="Arial,sans-serif" font-size="14" fill="#b8b5a7">6 bosses ahead · 2 collected</text>
<path d="M978 56V140" stroke="#88764f"/>
<text x="1050" y="78" text-anchor="middle" font-family="Arial,sans-serif" font-size="11" letter-spacing="2" fill="#b8b5a7">ENTERING IN</text>
<text x="1050" y="134" text-anchor="middle" font-family="Georgia,serif" font-size="60" fill="#d5b875">05</text>
${bosses.map(largeCard).join("\n ")}
</svg>\n`;
function compactCard(boss, index) {
const x = 180 + index * 169;
return `<g transform="translate(${x} 145)">
<rect width="155" height="171" rx="7" fill="#17231e" stroke="${boss.owned ? boss.accent : "#6e796d"}"/>
<rect x="1" y="1" width="153" height="20" rx="6" fill="#0a1410"/>
<text x="8" y="14" font-family="Arial,sans-serif" font-size="8" letter-spacing="1" fill="#e9e2d2">BOSS ${String(index + 1).padStart(2, "0")}</text>
<text x="147" y="14" text-anchor="end" font-family="Arial,sans-serif" font-size="8" fill="${boss.accent}">${boss.owned ? "OWNED" : "MISSING"}</text>
<rect x="4" y="23" width="147" height="79" fill="url(#portrait)"/>
<ellipse cx="78" cy="100" rx="37" ry="4" fill="#030a08" opacity=".6"/>
<use href="#${boss.shape}" transform="translate(46 22) scale(.67)"/>
<text x="7" y="120" font-family="Georgia,serif" font-size="${boss.name.length > 19 ? 10 : 12}" fill="#f3ead1">${boss.name}</text>
<text x="7" y="136" font-family="Arial,sans-serif" font-size="9" fill="#b8b5a7">${boss.owned ? boss.copies : "Not collected"}</text>
<path d="M0 143H155" stroke="#536357" opacity=".6"/>
${rarityMarks(boss, 8, 148, true)}
</g>`;
}
const pause = `<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="700" viewBox="0 0 1200 700">
${defs}
<rect width="1200" height="700" fill="url(#backdrop)"/>
<path d="M0 680Q130 370 320 520T700 390T1200 540V700H0" fill="#275137" opacity=".32"/>
<rect width="1200" height="700" fill="#020705" opacity=".58"/>
<rect x="150" y="30" width="900" height="640" rx="15" fill="url(#panel)" stroke="#8d7d56" stroke-width="2" filter="url(#shadow)"/>
<text x="180" y="80" font-family="Arial,sans-serif" font-size="24" font-weight="bold" letter-spacing="4" fill="#f3ead1">PAUSED</text>
<circle cx="779" cy="70" r="22" fill="#253a31" stroke="#b7b381"/>
<text x="779" y="78" text-anchor="middle" font-family="Georgia,serif" font-size="23" fill="#d5b875">+</text>
<text x="814" y="67" font-family="Arial,sans-serif" font-size="17" font-weight="bold" fill="#f3ead1">Aria</text>
<text x="814" y="86" font-family="Arial,sans-serif" font-size="12" fill="#b8b5a7">Level 24 · Priest / Discipline</text>
<path d="M178 105H1022" stroke="#8d7d56" opacity=".6"/>
<text x="180" y="131" font-family="Arial,sans-serif" font-size="12" font-weight="bold" letter-spacing="1" fill="#d5b875">BOSS CARDS IN THIS DUNGEON</text>
<text x="1018" y="131" text-anchor="end" font-family="Arial,sans-serif" font-size="12" fill="#b8b5a7">2 / 6 COLLECTED</text>
${bosses.slice(0, 5).map(compactCard).join("\n ")}
<text x="1018" y="335" text-anchor="end" font-family="Arial,sans-serif" font-size="11" fill="#9fa994">SCROLL →</text>
<path d="M178 347H1022" stroke="#8d7d56" opacity=".6"/>
<rect x="440" y="364" width="320" height="45" rx="8" fill="#587348" stroke="#9bb477"/>
<text x="600" y="393" text-anchor="middle" font-family="Arial,sans-serif" font-size="16" font-weight="bold" fill="#fbfee9">Resume game</text>
<g font-family="Arial,sans-serif">
<rect x="180" y="427" width="384" height="101" rx="8" fill="#1a2621" stroke="#526153"/>
<rect x="636" y="427" width="384" height="101" rx="8" fill="#1a2621" stroke="#526153"/>
<rect x="180" y="544" width="384" height="101" rx="8" fill="#1a2621" stroke="#526153"/>
<rect x="636" y="544" width="384" height="101" rx="8" fill="#1a2621" stroke="#526153"/>
<g fill="#b8b5a7" font-size="12" font-weight="bold" letter-spacing="2"><text x="195" y="451">ADVENTURE</text><text x="651" y="451">CHARACTER</text><text x="195" y="568">SETTINGS</text><text x="651" y="568">SESSION</text></g>
<g fill="#314136" stroke="#64795d"><rect x="195" y="466" width="169" height="43" rx="6"/><rect x="379" y="466" width="169" height="43" rx="6"/><rect x="651" y="466" width="169" height="43" rx="6"/><rect x="835" y="466" width="169" height="43" rx="6"/><rect x="195" y="583" width="169" height="43" rx="6"/><rect x="379" y="583" width="169" height="43" rx="6"/><rect x="651" y="583" width="169" height="43" rx="6"/><rect x="835" y="583" width="169" height="43" rx="6"/></g>
<g fill="#eee9d9" font-size="12" text-anchor="middle"><text x="279" y="493">Party management</text><text x="463" y="493">Dungeon map</text><text x="735" y="493">Inventory</text><text x="919" y="493">Spellbook</text><text x="279" y="610">Options</text><text x="463" y="610">Keybinds</text><text x="735" y="610">Return to entrance</text><text x="919" y="610">Main menu</text></g>
</g>
</svg>\n`;
for (const [name, svg] of [["dungeon-boss-countdown", countdown], ["pause-boss-card-strip", pause]]) {
await writeFile(join(outputDir, `${name}.svg`), svg);
await sharp(Buffer.from(svg)).png().toFile(join(outputDir, `${name}.png`));
}