diff --git a/CHANGELOG.md b/CHANGELOG.md index bbf83b49..a95bda19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,45 @@ All notable changes to this project will be documented in this file. -## [3.1.1] - 2025-09-05 +## [3.2.2] - 2025-10-23 + +### Added +- **Add Missing Sprites** - add pen/pen20 dm versions + - pen + - pen20 + +### Improved +- refactor animation system - improve animations + - smoother animation transitions + +## [3.2.1] - 2025-10-11 ### Fixed -- config file handling +- fix epoll draining +- fix TSAN warnings +- fix default config +- update man pages + +## [3.2.0] - 2025-10-11 +### Added +- **More Sprites** - add more MS Agents + - Merlin + - Rover +- **Movement** - Digimon can walk + +### Fixed +- fix config watcher +- use urandom device for RNG seeding +- fix auto-detect resolution with multi-monitor setup + +## [3.1.2] - 2025-09-05 + +### Fixed +- config file handling +- improve input devices check +- improve config watcher +- improve animation update poll ## [3.1.1] - 2025-08-30 diff --git a/CMakeLists.txt b/CMakeLists.txt index 82fca44a..05408dc3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,7 +41,8 @@ cmake_dependent_option(FEATURE_DM_EMBEDDED_ASSETS "Include dm embedded assets" O cmake_dependent_option(FEATURE_DM20_EMBEDDED_ASSETS "Include dm20 embedded assets (replaces original dm)" OFF FEATURE_ENABLE_DM_EMBEDDED_ASSETS OFF) cmake_dependent_option(FEATURE_DMC_EMBEDDED_ASSETS "Include dmc embedded assets" OFF FEATURE_ENABLE_DM_EMBEDDED_ASSETS OFF) cmake_dependent_option(FEATURE_DMX_EMBEDDED_ASSETS "Include dmx embedded assets" OFF FEATURE_ENABLE_DM_EMBEDDED_ASSETS OFF) -#cmake_dependent_option(FEATURE_PEN20_EMBEDDED_ASSETS "Include pen20 embedded assets" OFF FEATURE_ENABLE_DM_EMBEDDED_ASSETS OFF) +cmake_dependent_option(FEATURE_PEN_EMBEDDED_ASSETS "Include pen embedded assets" OFF FEATURE_ENABLE_DM_EMBEDDED_ASSETS OFF) +cmake_dependent_option(FEATURE_PEN20_EMBEDDED_ASSETS "Include pen20 embedded assets (replaces original pen)" OFF FEATURE_ENABLE_DM_EMBEDDED_ASSETS OFF) cmake_dependent_option(FEATURE_DMALL_EMBEDDED_ASSETS "Include custom colored dm (replace dmc) embedded assets" OFF FEATURE_ENABLE_DM_EMBEDDED_ASSETS OFF) option(FEATURE_MS_AGENT_EMBEDDED_ASSETS "Include MS agent (Clippy) embedded assets" OFF) cmake_dependent_option(FEATURE_MORE_MS_AGENT_EMBEDDED_ASSETS "Include more MS agents (Links) embedded assets" OFF FEATURE_MS_AGENT_EMBEDDED_ASSETS OFF) @@ -171,6 +172,13 @@ if (FEATURE_ENABLE_DM_EMBEDDED_ASSETS) target_link_libraries(bongocat PRIVATE assets_dmx_loader assets_dmx assets_dmx_feature assets_dmx_interface) message(STATUS "Include dmx assets") endif() + if (FEATURE_PEN20_EMBEDDED_ASSETS) + target_link_libraries(bongocat PRIVATE assets_pen20_loader assets_pen20 assets_pen20_feature assets_pen20_interface) + message(STATUS "Include pen20 assets") + elseif (FEATURE_PEN_EMBEDDED_ASSETS) + target_link_libraries(bongocat PRIVATE assets_pen_loader assets_pen assets_pen_feature assets_pen_interface) + message(STATUS "Include pen assets") + endif() if (FEATURE_DMALL_EMBEDDED_ASSETS) target_link_libraries(bongocat PRIVATE assets_dmall_loader assets_dmall assets_dmall_feature assets_dmall_interface) message(STATUS "Include dmall assets") @@ -201,6 +209,8 @@ if (FEATURE_MULTI_VERSIONS) target_link_libraries(bongocat-dm-classic PRIVATE assets_dm_loader assets_dm assets_dm_feature assets_dm_interface) target_link_libraries(bongocat-dm-classic PRIVATE assets_dm20_loader assets_dm20 assets_dm20_feature assets_dm20_interface) target_link_libraries(bongocat-dm-classic PRIVATE assets_dmx_loader assets_dmx assets_dmx_feature assets_dmx_interface) + target_link_libraries(bongocat-dm-classic PRIVATE assets_pen_loader assets_pen assets_pen_feature assets_pen_interface) + target_link_libraries(bongocat-dm-classic PRIVATE assets_pen20_loader assets_pen20 assets_pen20_feature assets_pen20_interface) target_link_libraries(bongocat-dm-classic PRIVATE bongocat_base bongocat_options bongocat_libs) add_executable(bongocat-dm-colored) @@ -208,6 +218,7 @@ if (FEATURE_MULTI_VERSIONS) target_link_libraries(bongocat-dm-colored PRIVATE assets_dm20_loader assets_dm20 assets_dm20_feature assets_dm20_interface) target_link_libraries(bongocat-dm-colored PRIVATE assets_dmx_loader assets_dmx assets_dmx_feature assets_dmx_interface) target_link_libraries(bongocat-dm-colored PRIVATE assets_dmc_loader assets_dmc assets_dmc_feature assets_dmc_interface) + target_link_libraries(bongocat-dm-colored PRIVATE assets_pen20_loader assets_pen20 assets_pen20_feature assets_pen20_interface) target_link_libraries(bongocat-dm-colored PRIVATE bongocat_base bongocat_options bongocat_libs) add_executable(bongocat-dm-colored-all) @@ -219,6 +230,7 @@ if (FEATURE_MULTI_VERSIONS) target_link_libraries(bongocat-dm PRIVATE assets_bongocat_loader assets_bongocat assets_bongocat_feature assets_bongocat_interface) target_link_libraries(bongocat-dm PRIVATE assets_dm20_loader assets_dm20 assets_dm20_feature assets_dm20_interface) target_link_libraries(bongocat-dm PRIVATE assets_dmx_loader assets_dmx assets_dmx_feature assets_dmx_interface) + target_link_libraries(bongocat-dm PRIVATE assets_pen20_loader assets_pen20 assets_pen20_feature assets_pen20_interface) target_link_libraries(bongocat-dm PRIVATE assets_dmall_loader assets_dmall assets_dmall_feature assets_dmall_interface) target_link_libraries(bongocat-dm PRIVATE bongocat_base bongocat_options bongocat_libs) @@ -238,6 +250,8 @@ if (FEATURE_MULTI_VERSIONS) target_link_libraries(bongocat-all PRIVATE assets_dm20_loader assets_dm20 assets_dm20_feature assets_dm20_interface) target_link_libraries(bongocat-all PRIVATE assets_dmx_loader assets_dmx assets_dmx_feature assets_dmx_interface) target_link_libraries(bongocat-all PRIVATE assets_dmc_loader assets_dmc assets_dmc_feature assets_dmc_interface) + target_link_libraries(bongocat-all PRIVATE assets_pen_loader assets_pen assets_pen_feature assets_pen_interface) + target_link_libraries(bongocat-all PRIVATE assets_pen20_loader assets_pen20 assets_pen20_feature assets_pen20_interface) target_link_libraries(bongocat-all PRIVATE assets_dmall_loader assets_dmall assets_dmall_feature assets_dmall_interface) target_link_libraries(bongocat-all PRIVATE assets_more_ms_agent_loader assets_more_ms_agent assets_more_ms_agent_feature assets_more_ms_agent_interface) target_link_libraries(bongocat-all PRIVATE assets_pkmn_loader assets_pkmn assets_pkmn_feature assets_pkmn_interface) diff --git a/CMakePresets.json b/CMakePresets.json index d9baa28f..3016b4ab 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -164,6 +164,8 @@ "FEATURE_DM_EMBEDDED_ASSETS": "OFF", "FEATURE_DM20_EMBEDDED_ASSETS": "OFF", "FEATURE_DMX_EMBEDDED_ASSETS": "OFF", + "FEATURE_PEN_EMBEDDED_ASSETS": "OFF", + "FEATURE_PEN20_EMBEDDED_ASSETS": "OFF", "FEATURE_DMC_EMBEDDED_ASSETS": "OFF", "FEATURE_DMALL_EMBEDDED_ASSETS": "OFF", "FEATURE_PKMN_EMBEDDED_ASSETS": "OFF" @@ -186,6 +188,8 @@ "FEATURE_DM_EMBEDDED_ASSETS": "ON", "FEATURE_DM20_EMBEDDED_ASSETS": "ON", "FEATURE_DMX_EMBEDDED_ASSETS": "ON", + "FEATURE_PEN_EMBEDDED_ASSETS": "ON", + "FEATURE_PEN20_EMBEDDED_ASSETS": "ON", "FEATURE_DMC_EMBEDDED_ASSETS": "ON", "FEATURE_DMALL_EMBEDDED_ASSETS": "ON", "FEATURE_PKMN_EMBEDDED_ASSETS": "ON" @@ -208,6 +212,8 @@ "FEATURE_DM_EMBEDDED_ASSETS": "ON", "FEATURE_DM20_EMBEDDED_ASSETS": "ON", "FEATURE_DMX_EMBEDDED_ASSETS": "ON", + "FEATURE_PEN_EMBEDDED_ASSETS": "ON", + "FEATURE_PEN20_EMBEDDED_ASSETS": "ON", "FEATURE_DMC_EMBEDDED_ASSETS": "ON", "FEATURE_DMALL_EMBEDDED_ASSETS": "ON", "FEATURE_PKMN_EMBEDDED_ASSETS": "ON", @@ -232,6 +238,8 @@ "FEATURE_DM_EMBEDDED_ASSETS": "ON", "FEATURE_DM20_EMBEDDED_ASSETS": "ON", "FEATURE_DMX_EMBEDDED_ASSETS": "ON", + "FEATURE_PEN_EMBEDDED_ASSETS": "ON", + "FEATURE_PEN20_EMBEDDED_ASSETS": "ON", "FEATURE_DMC_EMBEDDED_ASSETS": "ON", "FEATURE_DMALL_EMBEDDED_ASSETS": "ON", "FEATURE_PKMN_EMBEDDED_ASSETS": "ON", diff --git a/README.md b/README.md index a926f4dc..7beaed2b 100644 --- a/README.md +++ b/README.md @@ -320,7 +320,9 @@ See man pages for more details and full list: ##### Digimon 🦖 - [Original](docs/fragments/set-dm.md) [`dm`](https://humulos.com/digimon/dm/) + - [Pendulum Original](docs/fragments/set-pen.md) [`dm`](https://humulos.com/digimon/pen/) - [20th Anniversary](docs/fragments/set-dm20.md) [`dm20`](https://humulos.com/digimon/dm20/) + - [Pendulum Ver.20th](docs/fragments/set-pen20.md) [`pen20`](https://humulos.com/digimon/pen20/) - [X](docs/fragments/set-dmx.md) [`dmx`](https://humulos.com/digimon/dmx/) - [Colored](docs/fragments/set-dmc.md) [`dmc`](https://humulos.com/digimon/dmc/) diff --git a/assets/README.md b/assets/README.md new file mode 100644 index 00000000..caf3737e --- /dev/null +++ b/assets/README.md @@ -0,0 +1,77 @@ +# Assets + +## Sprite Sheet Formats + +## bongo-cat + +4 lose frames, put together at runtime into one sprite sheet. + +Cols: 4 +Rows: 1 +Frame Size: 864x360px + +- `both-up` -- Idle pose +- `left-down` -- input animation (frame 1) +- `right-down` -- input animation (frame 1) +- `both-down` -- use for sleep + +_I kept it lose so it's compatible with the old bongocat_ + +### dm/pen + +Custom digimon sprite sheet format (I used in my other projects). +Single row with all frames, optional frames at the end, cols can vary. + +Cols: 9 - 15 +Rows: 1 +Frame Size: 64x64px + +- `idle1` -- Idle animation (frame 1) +- `idle2` -- Idle animation (frame 2) +- `angry` -- Angry _(unused)_ +- `down1` -- Sick (frame 1) _(unused)_ +- `happy` -- Happy (for KPM animation) +- `eat1` -- Eating (frame 1) _(unused)_ +- `sleep1` -- Sleep, use for sleep animation (frame 1), fallback to `down1` if not exists +- `refuse` -- Nope, Refuse _(unused)_ +- `sad` -- Lose _(unused)_ +- `down2` -- Sick, Lose (frame 2) _(unused)_ (optional) +- `eat2` -- Eat (frame 2) _(unused)_ (optional) +- `sleep2` -- Sleep (frame 2) (optional) +- `attack` -- Attack (use for react to CPU usage), fallback to `angry` (optional) +- `movement1` -- Moving, Walking animation (frame 1) (optional) +- `movement2` -- Moving, Walking animation (frame 2) (optional) + +_(I choose this format, so I can fall back to frames when some frames don't exist like `sleep`, I could fall back to `down`)_ + +### ms_agent + +Custom MS Agent sprite sheet, each row is a full animation. + +Cols: varies +Rows: 6 - 12 +Frame Size: 96x96px - 128x128px + +- `Idle`/`Boring` -- Idle Pose (First frame), Boring animation for inactivity +- `StartWriting` -- First keystroke +- `Writing` -- Keep Typing (looping) +- `EndWriting` -- After last keystroke (return to Idle pose) +- `Sleep` -- Start falling asleep (last frame for freeze/in sleep mode) +- `WakeUp` -- After sleep (back to Idle pose) +- `StartWorking` -- Start seen spike in CPU usage _(unused)_ (optional) +- `Working` -- CPU usage over threshold (looping) _(unused)_ (optional) +- `EndWorking` -- CPU usage under threshold _(unused)_ (optional) +- `StartMoving` -- (optional) +- `Moving` -- (optional) +- `EndMoving` -- (optional) + +### pkmn + +Simple 2 frame sprite sheet with idle animation. _(Originated from the animation from the PC Box)_ + +Cols: 2 +Rows: 1 +Frame Size: varies from 22x22 - 32x32px + +- `idle1` +- `idle2` diff --git a/assets/clippy.png b/assets/ms_agent/clippy.png similarity index 100% rename from assets/clippy.png rename to assets/ms_agent/clippy.png diff --git a/assets/links.png b/assets/ms_agent/links.png similarity index 100% rename from assets/links.png rename to assets/ms_agent/links.png diff --git a/assets/merlin.png b/assets/ms_agent/merlin.png similarity index 100% rename from assets/merlin.png rename to assets/ms_agent/merlin.png diff --git a/assets/rover.png b/assets/ms_agent/rover.png similarity index 100% rename from assets/rover.png rename to assets/ms_agent/rover.png diff --git a/assets/pen/.gitkeep b/assets/pen/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/assets/pen/Aero V-dramon.png b/assets/pen/Aero V-dramon.png new file mode 100644 index 00000000..01825043 Binary files /dev/null and b/assets/pen/Aero V-dramon.png differ diff --git a/assets/pen/Angewomon.png b/assets/pen/Angewomon.png new file mode 100644 index 00000000..587a0da9 Binary files /dev/null and b/assets/pen/Angewomon.png differ diff --git a/assets/pen/Anomalocarimon.png b/assets/pen/Anomalocarimon.png new file mode 100644 index 00000000..ceb7e90b Binary files /dev/null and b/assets/pen/Anomalocarimon.png differ diff --git a/assets/pen/Asuramon.png b/assets/pen/Asuramon.png new file mode 100644 index 00000000..11a9a4ad Binary files /dev/null and b/assets/pen/Asuramon.png differ diff --git a/assets/pen/Atlur Kabuterimon.png b/assets/pen/Atlur Kabuterimon.png new file mode 100644 index 00000000..10bbca79 Binary files /dev/null and b/assets/pen/Atlur Kabuterimon.png differ diff --git a/assets/pen/Bakumon.png b/assets/pen/Bakumon.png new file mode 100644 index 00000000..202d4c02 Binary files /dev/null and b/assets/pen/Bakumon.png differ diff --git a/assets/pen/Big Mamemon.png b/assets/pen/Big Mamemon.png new file mode 100644 index 00000000..246358ab Binary files /dev/null and b/assets/pen/Big Mamemon.png differ diff --git a/assets/pen/Blossomon.png b/assets/pen/Blossomon.png new file mode 100644 index 00000000..2e70ac6d Binary files /dev/null and b/assets/pen/Blossomon.png differ diff --git a/assets/pen/Boltmon.png b/assets/pen/Boltmon.png new file mode 100644 index 00000000..11d47e0b Binary files /dev/null and b/assets/pen/Boltmon.png differ diff --git a/assets/pen/Bubbmon.png b/assets/pen/Bubbmon.png new file mode 100644 index 00000000..75f811ac Binary files /dev/null and b/assets/pen/Bubbmon.png differ diff --git a/assets/pen/Candmon.png b/assets/pen/Candmon.png new file mode 100644 index 00000000..9b8a7f5c Binary files /dev/null and b/assets/pen/Candmon.png differ diff --git a/assets/pen/Caprimon.png b/assets/pen/Caprimon.png new file mode 100644 index 00000000..69bd241a Binary files /dev/null and b/assets/pen/Caprimon.png differ diff --git a/assets/pen/Choromon.png b/assets/pen/Choromon.png new file mode 100644 index 00000000..192ddaa7 Binary files /dev/null and b/assets/pen/Choromon.png differ diff --git a/assets/pen/Clockmon.png b/assets/pen/Clockmon.png new file mode 100644 index 00000000..6d3dbc83 Binary files /dev/null and b/assets/pen/Clockmon.png differ diff --git a/assets/pen/Cyberdramon.png b/assets/pen/Cyberdramon.png new file mode 100644 index 00000000..a9716657 Binary files /dev/null and b/assets/pen/Cyberdramon.png differ diff --git a/assets/pen/Dagomon.png b/assets/pen/Dagomon.png new file mode 100644 index 00000000..16287972 Binary files /dev/null and b/assets/pen/Dagomon.png differ diff --git a/assets/pen/Death Meramon.png b/assets/pen/Death Meramon.png new file mode 100644 index 00000000..8479e94b Binary files /dev/null and b/assets/pen/Death Meramon.png differ diff --git a/assets/pen/Delumon.png b/assets/pen/Delumon.png new file mode 100644 index 00000000..28d4cb40 Binary files /dev/null and b/assets/pen/Delumon.png differ diff --git a/assets/pen/Dokugumon.png b/assets/pen/Dokugumon.png new file mode 100644 index 00000000..53414ace Binary files /dev/null and b/assets/pen/Dokugumon.png differ diff --git a/assets/pen/Ebidramon.png b/assets/pen/Ebidramon.png new file mode 100644 index 00000000..479e09d2 Binary files /dev/null and b/assets/pen/Ebidramon.png differ diff --git a/assets/pen/Fantomon.png b/assets/pen/Fantomon.png new file mode 100644 index 00000000..33959ff9 Binary files /dev/null and b/assets/pen/Fantomon.png differ diff --git a/assets/pen/Floramon.png b/assets/pen/Floramon.png new file mode 100644 index 00000000..e89234e7 Binary files /dev/null and b/assets/pen/Floramon.png differ diff --git a/assets/pen/Ganimon.png b/assets/pen/Ganimon.png new file mode 100644 index 00000000..cb7f927e Binary files /dev/null and b/assets/pen/Ganimon.png differ diff --git a/assets/pen/Garudamon.png b/assets/pen/Garudamon.png new file mode 100644 index 00000000..c833ef6a Binary files /dev/null and b/assets/pen/Garudamon.png differ diff --git a/assets/pen/Gekomon.png b/assets/pen/Gekomon.png new file mode 100644 index 00000000..f829070d Binary files /dev/null and b/assets/pen/Gekomon.png differ diff --git a/assets/pen/Gerbemon.png b/assets/pen/Gerbemon.png new file mode 100644 index 00000000..ba0ce6b0 Binary files /dev/null and b/assets/pen/Gerbemon.png differ diff --git a/assets/pen/Gesomon.png b/assets/pen/Gesomon.png new file mode 100644 index 00000000..4cfe0f7b Binary files /dev/null and b/assets/pen/Gesomon.png differ diff --git a/assets/pen/Gomamon.png b/assets/pen/Gomamon.png new file mode 100644 index 00000000..4ad10af9 Binary files /dev/null and b/assets/pen/Gomamon.png differ diff --git a/assets/pen/Gottsumon.png b/assets/pen/Gottsumon.png new file mode 100644 index 00000000..13d56714 Binary files /dev/null and b/assets/pen/Gottsumon.png differ diff --git a/assets/pen/Griffomon.png b/assets/pen/Griffomon.png new file mode 100644 index 00000000..2639b8d0 Binary files /dev/null and b/assets/pen/Griffomon.png differ diff --git a/assets/pen/Guardromon.png b/assets/pen/Guardromon.png new file mode 100644 index 00000000..affcc05f Binary files /dev/null and b/assets/pen/Guardromon.png differ diff --git a/assets/pen/Hagurumon.png b/assets/pen/Hagurumon.png new file mode 100644 index 00000000..7a188c3a Binary files /dev/null and b/assets/pen/Hagurumon.png differ diff --git a/assets/pen/Hangymon.png b/assets/pen/Hangymon.png new file mode 100644 index 00000000..29321ae9 Binary files /dev/null and b/assets/pen/Hangymon.png differ diff --git a/assets/pen/Hanumon.png b/assets/pen/Hanumon.png new file mode 100644 index 00000000..4d6f0639 Binary files /dev/null and b/assets/pen/Hanumon.png differ diff --git a/assets/pen/Herkule Kabuterimon.png b/assets/pen/Herkule Kabuterimon.png new file mode 100644 index 00000000..649c6963 Binary files /dev/null and b/assets/pen/Herkule Kabuterimon.png differ diff --git a/assets/pen/Holy Angemon.png b/assets/pen/Holy Angemon.png new file mode 100644 index 00000000..9afd3d38 Binary files /dev/null and b/assets/pen/Holy Angemon.png differ diff --git a/assets/pen/Holydramon.png b/assets/pen/Holydramon.png new file mode 100644 index 00000000..411a49ad Binary files /dev/null and b/assets/pen/Holydramon.png differ diff --git a/assets/pen/Hououmon.png b/assets/pen/Hououmon.png new file mode 100644 index 00000000..72c17ca8 Binary files /dev/null and b/assets/pen/Hououmon.png differ diff --git a/assets/pen/Ignamon.png b/assets/pen/Ignamon.png new file mode 100644 index 00000000..5e8d6890 Binary files /dev/null and b/assets/pen/Ignamon.png differ diff --git a/assets/pen/Ikkakumon.png b/assets/pen/Ikkakumon.png new file mode 100644 index 00000000..b61b2874 Binary files /dev/null and b/assets/pen/Ikkakumon.png differ diff --git a/assets/pen/Jyagamon.png b/assets/pen/Jyagamon.png new file mode 100644 index 00000000..be234ce1 Binary files /dev/null and b/assets/pen/Jyagamon.png differ diff --git a/assets/pen/Jyureimon.png b/assets/pen/Jyureimon.png new file mode 100644 index 00000000..9a5478a0 Binary files /dev/null and b/assets/pen/Jyureimon.png differ diff --git a/assets/pen/Kiwimon.png b/assets/pen/Kiwimon.png new file mode 100644 index 00000000..4c12fbef Binary files /dev/null and b/assets/pen/Kiwimon.png differ diff --git a/assets/pen/Knightmon.png b/assets/pen/Knightmon.png new file mode 100644 index 00000000..329aa4e2 Binary files /dev/null and b/assets/pen/Knightmon.png differ diff --git a/assets/pen/Kokuwamon.png b/assets/pen/Kokuwamon.png new file mode 100644 index 00000000..cc73ed34 Binary files /dev/null and b/assets/pen/Kokuwamon.png differ diff --git a/assets/pen/Lady Devimon.png b/assets/pen/Lady Devimon.png new file mode 100644 index 00000000..bf2b86f8 Binary files /dev/null and b/assets/pen/Lady Devimon.png differ diff --git a/assets/pen/Lilimon.png b/assets/pen/Lilimon.png new file mode 100644 index 00000000..b190c2de Binary files /dev/null and b/assets/pen/Lilimon.png differ diff --git a/assets/pen/Mammon.png b/assets/pen/Mammon.png new file mode 100644 index 00000000..df05d126 Binary files /dev/null and b/assets/pen/Mammon.png differ diff --git a/assets/pen/Marin Angemon.png b/assets/pen/Marin Angemon.png new file mode 100644 index 00000000..9359dfc1 Binary files /dev/null and b/assets/pen/Marin Angemon.png differ diff --git a/assets/pen/Marin Devimon.png b/assets/pen/Marin Devimon.png new file mode 100644 index 00000000..9fa12620 Binary files /dev/null and b/assets/pen/Marin Devimon.png differ diff --git a/assets/pen/Mechanorimon.png b/assets/pen/Mechanorimon.png new file mode 100644 index 00000000..39ec5566 Binary files /dev/null and b/assets/pen/Mechanorimon.png differ diff --git a/assets/pen/Mega Seadramon.png b/assets/pen/Mega Seadramon.png new file mode 100644 index 00000000..63e19e04 Binary files /dev/null and b/assets/pen/Mega Seadramon.png differ diff --git a/assets/pen/Metal Etemon.png b/assets/pen/Metal Etemon.png new file mode 100644 index 00000000..13b63b04 Binary files /dev/null and b/assets/pen/Metal Etemon.png differ diff --git a/assets/pen/Metal Seadramon.png b/assets/pen/Metal Seadramon.png new file mode 100644 index 00000000..dadc9fba Binary files /dev/null and b/assets/pen/Metal Seadramon.png differ diff --git a/assets/pen/Mochimon.png b/assets/pen/Mochimon.png new file mode 100644 index 00000000..bb79701a Binary files /dev/null and b/assets/pen/Mochimon.png differ diff --git a/assets/pen/Mokumon.png b/assets/pen/Mokumon.png new file mode 100644 index 00000000..39b58bb2 Binary files /dev/null and b/assets/pen/Mokumon.png differ diff --git a/assets/pen/Mushmon.png b/assets/pen/Mushmon.png new file mode 100644 index 00000000..615bccd0 Binary files /dev/null and b/assets/pen/Mushmon.png differ diff --git a/assets/pen/Nyokimon.png b/assets/pen/Nyokimon.png new file mode 100644 index 00000000..c59e2169 Binary files /dev/null and b/assets/pen/Nyokimon.png differ diff --git a/assets/pen/Octmon.png b/assets/pen/Octmon.png new file mode 100644 index 00000000..a8dfaa42 Binary files /dev/null and b/assets/pen/Octmon.png differ diff --git a/assets/pen/Okuwamon.png b/assets/pen/Okuwamon.png new file mode 100644 index 00000000..9d4f68b4 Binary files /dev/null and b/assets/pen/Okuwamon.png differ diff --git a/assets/pen/Otamamon.png b/assets/pen/Otamamon.png new file mode 100644 index 00000000..48e78576 Binary files /dev/null and b/assets/pen/Otamamon.png differ diff --git a/assets/pen/Peti Meramon.png b/assets/pen/Peti Meramon.png new file mode 100644 index 00000000..21fc321c Binary files /dev/null and b/assets/pen/Peti Meramon.png differ diff --git a/assets/pen/Pico Devimon.png b/assets/pen/Pico Devimon.png new file mode 100644 index 00000000..76a45c4b Binary files /dev/null and b/assets/pen/Pico Devimon.png differ diff --git a/assets/pen/Piemon.png b/assets/pen/Piemon.png new file mode 100644 index 00000000..7ca62af5 Binary files /dev/null and b/assets/pen/Piemon.png differ diff --git a/assets/pen/Plesiomon.png b/assets/pen/Plesiomon.png new file mode 100644 index 00000000..696f0fb6 Binary files /dev/null and b/assets/pen/Plesiomon.png differ diff --git a/assets/pen/Pukumon.png b/assets/pen/Pukumon.png new file mode 100644 index 00000000..7e374b75 Binary files /dev/null and b/assets/pen/Pukumon.png differ diff --git a/assets/pen/Pumpmon.png b/assets/pen/Pumpmon.png new file mode 100644 index 00000000..65424406 Binary files /dev/null and b/assets/pen/Pumpmon.png differ diff --git a/assets/pen/Pyocomon.png b/assets/pen/Pyocomon.png new file mode 100644 index 00000000..5fa159db Binary files /dev/null and b/assets/pen/Pyocomon.png differ diff --git a/assets/pen/Rakamon.png b/assets/pen/Rakamon.png new file mode 100644 index 00000000..9476c34c Binary files /dev/null and b/assets/pen/Rakamon.png differ diff --git a/assets/pen/Red Vegimon.png b/assets/pen/Red Vegimon.png new file mode 100644 index 00000000..b0827f56 Binary files /dev/null and b/assets/pen/Red Vegimon.png differ diff --git a/assets/pen/Revolmon.png b/assets/pen/Revolmon.png new file mode 100644 index 00000000..c6ffdd28 Binary files /dev/null and b/assets/pen/Revolmon.png differ diff --git a/assets/pen/Rosemon.png b/assets/pen/Rosemon.png new file mode 100644 index 00000000..d74bbb2a Binary files /dev/null and b/assets/pen/Rosemon.png differ diff --git a/assets/pen/Saber Leomon.png b/assets/pen/Saber Leomon.png new file mode 100644 index 00000000..f29106b7 Binary files /dev/null and b/assets/pen/Saber Leomon.png differ diff --git a/assets/pen/Shakomon.png b/assets/pen/Shakomon.png new file mode 100644 index 00000000..faec4a58 Binary files /dev/null and b/assets/pen/Shakomon.png differ diff --git a/assets/pen/Starmon.png b/assets/pen/Starmon.png new file mode 100644 index 00000000..0f07d41d Binary files /dev/null and b/assets/pen/Starmon.png differ diff --git a/assets/pen/Tailmon.png b/assets/pen/Tailmon.png new file mode 100644 index 00000000..20fb8ed1 Binary files /dev/null and b/assets/pen/Tailmon.png differ diff --git a/assets/pen/Tankmon.png b/assets/pen/Tankmon.png new file mode 100644 index 00000000..7a6dc8d5 Binary files /dev/null and b/assets/pen/Tankmon.png differ diff --git a/assets/pen/Tentomon.png b/assets/pen/Tentomon.png new file mode 100644 index 00000000..6e6eed53 Binary files /dev/null and b/assets/pen/Tentomon.png differ diff --git a/assets/pen/Thunderballmon.png b/assets/pen/Thunderballmon.png new file mode 100644 index 00000000..bcaf049f Binary files /dev/null and b/assets/pen/Thunderballmon.png differ diff --git a/assets/pen/Togemon.png b/assets/pen/Togemon.png new file mode 100644 index 00000000..0bee16f8 Binary files /dev/null and b/assets/pen/Togemon.png differ diff --git a/assets/pen/Tonosama Gekomon.png b/assets/pen/Tonosama Gekomon.png new file mode 100644 index 00000000..7b152362 Binary files /dev/null and b/assets/pen/Tonosama Gekomon.png differ diff --git a/assets/pen/Tortamon.png b/assets/pen/Tortamon.png new file mode 100644 index 00000000..db7a84a5 Binary files /dev/null and b/assets/pen/Tortamon.png differ diff --git a/assets/pen/Toy Agumon.png b/assets/pen/Toy Agumon.png new file mode 100644 index 00000000..088c1f6d Binary files /dev/null and b/assets/pen/Toy Agumon.png differ diff --git a/assets/pen/Triceramon.png b/assets/pen/Triceramon.png new file mode 100644 index 00000000..eeaea5b7 Binary files /dev/null and b/assets/pen/Triceramon.png differ diff --git a/assets/pen/V-dramon.png b/assets/pen/V-dramon.png new file mode 100644 index 00000000..ccfe1900 Binary files /dev/null and b/assets/pen/V-dramon.png differ diff --git a/assets/pen/Vemdemon.png b/assets/pen/Vemdemon.png new file mode 100644 index 00000000..0c36921f Binary files /dev/null and b/assets/pen/Vemdemon.png differ diff --git a/assets/pen/Venom Vamdemon.png b/assets/pen/Venom Vamdemon.png new file mode 100644 index 00000000..1b9fb6ab Binary files /dev/null and b/assets/pen/Venom Vamdemon.png differ diff --git a/assets/pen/Waru Mozaemon.png b/assets/pen/Waru Mozaemon.png new file mode 100644 index 00000000..d1d868a7 Binary files /dev/null and b/assets/pen/Waru Mozaemon.png differ diff --git a/assets/pen/Wizarmon.png b/assets/pen/Wizarmon.png new file mode 100644 index 00000000..06e64221 Binary files /dev/null and b/assets/pen/Wizarmon.png differ diff --git a/assets/pen/Woodmon.png b/assets/pen/Woodmon.png new file mode 100644 index 00000000..53984923 Binary files /dev/null and b/assets/pen/Woodmon.png differ diff --git a/assets/pen/Zudomom.png b/assets/pen/Zudomom.png new file mode 100644 index 00000000..e979f51c Binary files /dev/null and b/assets/pen/Zudomom.png differ diff --git a/assets/pen20/Aero V-dramon.png b/assets/pen20/Aero V-dramon.png new file mode 100644 index 00000000..01825043 Binary files /dev/null and b/assets/pen20/Aero V-dramon.png differ diff --git a/assets/pen20/Agumon Hakase.png b/assets/pen20/Agumon Hakase.png new file mode 100644 index 00000000..4f2350e0 Binary files /dev/null and b/assets/pen20/Agumon Hakase.png differ diff --git a/assets/pen20/Alphamon Ouryuken.png b/assets/pen20/Alphamon Ouryuken.png new file mode 100644 index 00000000..1c523793 Binary files /dev/null and b/assets/pen20/Alphamon Ouryuken.png differ diff --git a/assets/pen20/Andiramon.png b/assets/pen20/Andiramon.png new file mode 100644 index 00000000..6ef166bf Binary files /dev/null and b/assets/pen20/Andiramon.png differ diff --git a/assets/pen20/Angewomon.png b/assets/pen20/Angewomon.png new file mode 100644 index 00000000..587a0da9 Binary files /dev/null and b/assets/pen20/Angewomon.png differ diff --git a/assets/pen20/Anomalocarimon.png b/assets/pen20/Anomalocarimon.png new file mode 100644 index 00000000..ceb7e90b Binary files /dev/null and b/assets/pen20/Anomalocarimon.png differ diff --git a/assets/pen20/Arresterdramon.png b/assets/pen20/Arresterdramon.png new file mode 100644 index 00000000..be722e06 Binary files /dev/null and b/assets/pen20/Arresterdramon.png differ diff --git a/assets/pen20/Astramon.png b/assets/pen20/Astramon.png new file mode 100644 index 00000000..82f0f08c Binary files /dev/null and b/assets/pen20/Astramon.png differ diff --git a/assets/pen20/Asuramon.png b/assets/pen20/Asuramon.png new file mode 100644 index 00000000..11a9a4ad Binary files /dev/null and b/assets/pen20/Asuramon.png differ diff --git a/assets/pen20/Atlur Kabuterimon.png b/assets/pen20/Atlur Kabuterimon.png new file mode 100644 index 00000000..10bbca79 Binary files /dev/null and b/assets/pen20/Atlur Kabuterimon.png differ diff --git a/assets/pen20/Baalmon.png b/assets/pen20/Baalmon.png new file mode 100644 index 00000000..ce442d40 Binary files /dev/null and b/assets/pen20/Baalmon.png differ diff --git a/assets/pen20/Bakumon.png b/assets/pen20/Bakumon.png new file mode 100644 index 00000000..202d4c02 Binary files /dev/null and b/assets/pen20/Bakumon.png differ diff --git a/assets/pen20/Bancho Leomon.png b/assets/pen20/Bancho Leomon.png new file mode 100644 index 00000000..34af583f Binary files /dev/null and b/assets/pen20/Bancho Leomon.png differ diff --git a/assets/pen20/Beelzebumon Blast Mode.png b/assets/pen20/Beelzebumon Blast Mode.png new file mode 100644 index 00000000..4259e61a Binary files /dev/null and b/assets/pen20/Beelzebumon Blast Mode.png differ diff --git a/assets/pen20/Beowulfmon.png b/assets/pen20/Beowulfmon.png new file mode 100644 index 00000000..41908f36 Binary files /dev/null and b/assets/pen20/Beowulfmon.png differ diff --git a/assets/pen20/Big Mamemon.png b/assets/pen20/Big Mamemon.png new file mode 100644 index 00000000..246358ab Binary files /dev/null and b/assets/pen20/Big Mamemon.png differ diff --git a/assets/pen20/Blossomon.png b/assets/pen20/Blossomon.png new file mode 100644 index 00000000..2e70ac6d Binary files /dev/null and b/assets/pen20/Blossomon.png differ diff --git a/assets/pen20/Boltmon.png b/assets/pen20/Boltmon.png new file mode 100644 index 00000000..11d47e0b Binary files /dev/null and b/assets/pen20/Boltmon.png differ diff --git a/assets/pen20/Bryweludramon.png b/assets/pen20/Bryweludramon.png new file mode 100644 index 00000000..27323a0e Binary files /dev/null and b/assets/pen20/Bryweludramon.png differ diff --git a/assets/pen20/Bubbmon.png b/assets/pen20/Bubbmon.png new file mode 100644 index 00000000..75f811ac Binary files /dev/null and b/assets/pen20/Bubbmon.png differ diff --git a/assets/pen20/Budmon.png b/assets/pen20/Budmon.png new file mode 100644 index 00000000..f82a8372 Binary files /dev/null and b/assets/pen20/Budmon.png differ diff --git a/assets/pen20/Bushi Agumon.png b/assets/pen20/Bushi Agumon.png new file mode 100644 index 00000000..a8050db2 Binary files /dev/null and b/assets/pen20/Bushi Agumon.png differ diff --git a/assets/pen20/Candmon.png b/assets/pen20/Candmon.png new file mode 100644 index 00000000..9b8a7f5c Binary files /dev/null and b/assets/pen20/Candmon.png differ diff --git a/assets/pen20/Caprimon.png b/assets/pen20/Caprimon.png new file mode 100644 index 00000000..69bd241a Binary files /dev/null and b/assets/pen20/Caprimon.png differ diff --git a/assets/pen20/Chaosmon.png b/assets/pen20/Chaosmon.png new file mode 100644 index 00000000..baabc4e0 Binary files /dev/null and b/assets/pen20/Chaosmon.png differ diff --git a/assets/pen20/Cherubimon.png b/assets/pen20/Cherubimon.png new file mode 100644 index 00000000..14d76059 Binary files /dev/null and b/assets/pen20/Cherubimon.png differ diff --git a/assets/pen20/Chibimon.png b/assets/pen20/Chibimon.png new file mode 100644 index 00000000..3aabc2e5 Binary files /dev/null and b/assets/pen20/Chibimon.png differ diff --git a/assets/pen20/Chicomon.png b/assets/pen20/Chicomon.png new file mode 100644 index 00000000..3069fda2 Binary files /dev/null and b/assets/pen20/Chicomon.png differ diff --git a/assets/pen20/Choromon.png b/assets/pen20/Choromon.png new file mode 100644 index 00000000..192ddaa7 Binary files /dev/null and b/assets/pen20/Choromon.png differ diff --git a/assets/pen20/Clockmon.png b/assets/pen20/Clockmon.png new file mode 100644 index 00000000..6d3dbc83 Binary files /dev/null and b/assets/pen20/Clockmon.png differ diff --git a/assets/pen20/Cocomon.png b/assets/pen20/Cocomon.png new file mode 100644 index 00000000..71f67faa Binary files /dev/null and b/assets/pen20/Cocomon.png differ diff --git a/assets/pen20/Cotsucomon.png b/assets/pen20/Cotsucomon.png new file mode 100644 index 00000000..51de7fa5 Binary files /dev/null and b/assets/pen20/Cotsucomon.png differ diff --git a/assets/pen20/Cyberdramon.png b/assets/pen20/Cyberdramon.png new file mode 100644 index 00000000..a9716657 Binary files /dev/null and b/assets/pen20/Cyberdramon.png differ diff --git a/assets/pen20/DORUgoramon.png b/assets/pen20/DORUgoramon.png new file mode 100644 index 00000000..5345fd82 Binary files /dev/null and b/assets/pen20/DORUgoramon.png differ diff --git a/assets/pen20/Dagomon.png b/assets/pen20/Dagomon.png new file mode 100644 index 00000000..16287972 Binary files /dev/null and b/assets/pen20/Dagomon.png differ diff --git a/assets/pen20/Dark Knightmon.png b/assets/pen20/Dark Knightmon.png new file mode 100644 index 00000000..0c491ebf Binary files /dev/null and b/assets/pen20/Dark Knightmon.png differ diff --git a/assets/pen20/Darkdramon.png b/assets/pen20/Darkdramon.png new file mode 100644 index 00000000..146b4962 Binary files /dev/null and b/assets/pen20/Darkdramon.png differ diff --git a/assets/pen20/Death Meramon.png b/assets/pen20/Death Meramon.png new file mode 100644 index 00000000..8479e94b Binary files /dev/null and b/assets/pen20/Death Meramon.png differ diff --git a/assets/pen20/Delumon.png b/assets/pen20/Delumon.png new file mode 100644 index 00000000..28d4cb40 Binary files /dev/null and b/assets/pen20/Delumon.png differ diff --git a/assets/pen20/Dokugumon.png b/assets/pen20/Dokugumon.png new file mode 100644 index 00000000..53414ace Binary files /dev/null and b/assets/pen20/Dokugumon.png differ diff --git a/assets/pen20/Ebidramon.png b/assets/pen20/Ebidramon.png new file mode 100644 index 00000000..479e09d2 Binary files /dev/null and b/assets/pen20/Ebidramon.png differ diff --git a/assets/pen20/Fantomon.png b/assets/pen20/Fantomon.png new file mode 100644 index 00000000..33959ff9 Binary files /dev/null and b/assets/pen20/Fantomon.png differ diff --git a/assets/pen20/Floramon.png b/assets/pen20/Floramon.png new file mode 100644 index 00000000..e89234e7 Binary files /dev/null and b/assets/pen20/Floramon.png differ diff --git a/assets/pen20/Fufumon.png b/assets/pen20/Fufumon.png new file mode 100644 index 00000000..b0bdd69f Binary files /dev/null and b/assets/pen20/Fufumon.png differ diff --git a/assets/pen20/Galgomon.png b/assets/pen20/Galgomon.png new file mode 100644 index 00000000..1e86e655 Binary files /dev/null and b/assets/pen20/Galgomon.png differ diff --git a/assets/pen20/Ganimon.png b/assets/pen20/Ganimon.png new file mode 100644 index 00000000..cb7f927e Binary files /dev/null and b/assets/pen20/Ganimon.png differ diff --git a/assets/pen20/Garudamon.png b/assets/pen20/Garudamon.png new file mode 100644 index 00000000..c833ef6a Binary files /dev/null and b/assets/pen20/Garudamon.png differ diff --git a/assets/pen20/Gekomon.png b/assets/pen20/Gekomon.png new file mode 100644 index 00000000..f829070d Binary files /dev/null and b/assets/pen20/Gekomon.png differ diff --git a/assets/pen20/Gerbemon.png b/assets/pen20/Gerbemon.png new file mode 100644 index 00000000..ba0ce6b0 Binary files /dev/null and b/assets/pen20/Gerbemon.png differ diff --git a/assets/pen20/Gesomon.png b/assets/pen20/Gesomon.png new file mode 100644 index 00000000..4cfe0f7b Binary files /dev/null and b/assets/pen20/Gesomon.png differ diff --git a/assets/pen20/Ginryumon.png b/assets/pen20/Ginryumon.png new file mode 100644 index 00000000..137cb565 Binary files /dev/null and b/assets/pen20/Ginryumon.png differ diff --git a/assets/pen20/Gomamon.png b/assets/pen20/Gomamon.png new file mode 100644 index 00000000..4ad10af9 Binary files /dev/null and b/assets/pen20/Gomamon.png differ diff --git a/assets/pen20/Gottsumon.png b/assets/pen20/Gottsumon.png new file mode 100644 index 00000000..13d56714 Binary files /dev/null and b/assets/pen20/Gottsumon.png differ diff --git a/assets/pen20/Griffomon.png b/assets/pen20/Griffomon.png new file mode 100644 index 00000000..2639b8d0 Binary files /dev/null and b/assets/pen20/Griffomon.png differ diff --git a/assets/pen20/Growmon.png b/assets/pen20/Growmon.png new file mode 100644 index 00000000..f4ebaa77 Binary files /dev/null and b/assets/pen20/Growmon.png differ diff --git a/assets/pen20/Guardromon.png b/assets/pen20/Guardromon.png new file mode 100644 index 00000000..affcc05f Binary files /dev/null and b/assets/pen20/Guardromon.png differ diff --git a/assets/pen20/Guimon.png b/assets/pen20/Guimon.png new file mode 100644 index 00000000..19635c5b Binary files /dev/null and b/assets/pen20/Guimon.png differ diff --git a/assets/pen20/Gummymon.png b/assets/pen20/Gummymon.png new file mode 100644 index 00000000..b0f36cbd Binary files /dev/null and b/assets/pen20/Gummymon.png differ diff --git a/assets/pen20/Hagurumon.png b/assets/pen20/Hagurumon.png new file mode 100644 index 00000000..7a188c3a Binary files /dev/null and b/assets/pen20/Hagurumon.png differ diff --git a/assets/pen20/Hangymon.png b/assets/pen20/Hangymon.png new file mode 100644 index 00000000..29321ae9 Binary files /dev/null and b/assets/pen20/Hangymon.png differ diff --git a/assets/pen20/Hanumon.png b/assets/pen20/Hanumon.png new file mode 100644 index 00000000..4d6f0639 Binary files /dev/null and b/assets/pen20/Hanumon.png differ diff --git a/assets/pen20/Herkule Kabuterimon.png b/assets/pen20/Herkule Kabuterimon.png new file mode 100644 index 00000000..649c6963 Binary files /dev/null and b/assets/pen20/Herkule Kabuterimon.png differ diff --git a/assets/pen20/Hisyaryumon.png b/assets/pen20/Hisyaryumon.png new file mode 100644 index 00000000..1f0c18b2 Binary files /dev/null and b/assets/pen20/Hisyaryumon.png differ diff --git a/assets/pen20/Holy Angemon.png b/assets/pen20/Holy Angemon.png new file mode 100644 index 00000000..9afd3d38 Binary files /dev/null and b/assets/pen20/Holy Angemon.png differ diff --git a/assets/pen20/Holydramon.png b/assets/pen20/Holydramon.png new file mode 100644 index 00000000..411a49ad Binary files /dev/null and b/assets/pen20/Holydramon.png differ diff --git a/assets/pen20/Hououmon.png b/assets/pen20/Hououmon.png new file mode 100644 index 00000000..72c17ca8 Binary files /dev/null and b/assets/pen20/Hououmon.png differ diff --git a/assets/pen20/Ignamon.png b/assets/pen20/Ignamon.png new file mode 100644 index 00000000..5e8d6890 Binary files /dev/null and b/assets/pen20/Ignamon.png differ diff --git a/assets/pen20/Ikkakumon.png b/assets/pen20/Ikkakumon.png new file mode 100644 index 00000000..b61b2874 Binary files /dev/null and b/assets/pen20/Ikkakumon.png differ diff --git a/assets/pen20/Imperialdramon Fighter Mode.png b/assets/pen20/Imperialdramon Fighter Mode.png new file mode 100644 index 00000000..a66412a0 Binary files /dev/null and b/assets/pen20/Imperialdramon Fighter Mode.png differ diff --git a/assets/pen20/Impmon.png b/assets/pen20/Impmon.png new file mode 100644 index 00000000..79f9473d Binary files /dev/null and b/assets/pen20/Impmon.png differ diff --git a/assets/pen20/Jesmon X.png b/assets/pen20/Jesmon X.png new file mode 100644 index 00000000..29fc3763 Binary files /dev/null and b/assets/pen20/Jesmon X.png differ diff --git a/assets/pen20/Jyagamon.png b/assets/pen20/Jyagamon.png new file mode 100644 index 00000000..be234ce1 Binary files /dev/null and b/assets/pen20/Jyagamon.png differ diff --git a/assets/pen20/Jyureimon.png b/assets/pen20/Jyureimon.png new file mode 100644 index 00000000..9a5478a0 Binary files /dev/null and b/assets/pen20/Jyureimon.png differ diff --git a/assets/pen20/Kakkinmon.png b/assets/pen20/Kakkinmon.png new file mode 100644 index 00000000..e7e42a82 Binary files /dev/null and b/assets/pen20/Kakkinmon.png differ diff --git a/assets/pen20/Kiwimon.png b/assets/pen20/Kiwimon.png new file mode 100644 index 00000000..4c12fbef Binary files /dev/null and b/assets/pen20/Kiwimon.png differ diff --git a/assets/pen20/Knightmon.png b/assets/pen20/Knightmon.png new file mode 100644 index 00000000..329aa4e2 Binary files /dev/null and b/assets/pen20/Knightmon.png differ diff --git a/assets/pen20/Kokuwamon.png b/assets/pen20/Kokuwamon.png new file mode 100644 index 00000000..cc73ed34 Binary files /dev/null and b/assets/pen20/Kokuwamon.png differ diff --git a/assets/pen20/Kyokyomon.png b/assets/pen20/Kyokyomon.png new file mode 100644 index 00000000..90244768 Binary files /dev/null and b/assets/pen20/Kyokyomon.png differ diff --git a/assets/pen20/Lady Devimon.png b/assets/pen20/Lady Devimon.png new file mode 100644 index 00000000..bf2b86f8 Binary files /dev/null and b/assets/pen20/Lady Devimon.png differ diff --git a/assets/pen20/Lalamon.png b/assets/pen20/Lalamon.png new file mode 100644 index 00000000..68c7a640 Binary files /dev/null and b/assets/pen20/Lalamon.png differ diff --git a/assets/pen20/Lavogaritamon.png b/assets/pen20/Lavogaritamon.png new file mode 100644 index 00000000..c0dbffb9 Binary files /dev/null and b/assets/pen20/Lavogaritamon.png differ diff --git a/assets/pen20/Lavorvomon.png b/assets/pen20/Lavorvomon.png new file mode 100644 index 00000000..8adb35c1 Binary files /dev/null and b/assets/pen20/Lavorvomon.png differ diff --git a/assets/pen20/Lilamon.png b/assets/pen20/Lilamon.png new file mode 100644 index 00000000..bc4392b3 Binary files /dev/null and b/assets/pen20/Lilamon.png differ diff --git a/assets/pen20/Lilimon.png b/assets/pen20/Lilimon.png new file mode 100644 index 00000000..b190c2de Binary files /dev/null and b/assets/pen20/Lilimon.png differ diff --git a/assets/pen20/Lopmon.png b/assets/pen20/Lopmon.png new file mode 100644 index 00000000..76951d05 Binary files /dev/null and b/assets/pen20/Lopmon.png differ diff --git a/assets/pen20/Lotusmon.png b/assets/pen20/Lotusmon.png new file mode 100644 index 00000000..55b670c0 Binary files /dev/null and b/assets/pen20/Lotusmon.png differ diff --git a/assets/pen20/Ludomon.png b/assets/pen20/Ludomon.png new file mode 100644 index 00000000..f3140554 Binary files /dev/null and b/assets/pen20/Ludomon.png differ diff --git a/assets/pen20/Mad Leomon.png b/assets/pen20/Mad Leomon.png new file mode 100644 index 00000000..9a7b3d73 Binary files /dev/null and b/assets/pen20/Mad Leomon.png differ diff --git a/assets/pen20/Mambomon.png b/assets/pen20/Mambomon.png new file mode 100644 index 00000000..d7ea32e1 Binary files /dev/null and b/assets/pen20/Mambomon.png differ diff --git a/assets/pen20/Mammon.png b/assets/pen20/Mammon.png new file mode 100644 index 00000000..df05d126 Binary files /dev/null and b/assets/pen20/Mammon.png differ diff --git a/assets/pen20/Marin Angemon.png b/assets/pen20/Marin Angemon.png new file mode 100644 index 00000000..9359dfc1 Binary files /dev/null and b/assets/pen20/Marin Angemon.png differ diff --git a/assets/pen20/Marin Devimon.png b/assets/pen20/Marin Devimon.png new file mode 100644 index 00000000..9fa12620 Binary files /dev/null and b/assets/pen20/Marin Devimon.png differ diff --git a/assets/pen20/Mastemon.png b/assets/pen20/Mastemon.png new file mode 100644 index 00000000..c74238c6 Binary files /dev/null and b/assets/pen20/Mastemon.png differ diff --git a/assets/pen20/Mechanorimon.png b/assets/pen20/Mechanorimon.png new file mode 100644 index 00000000..39ec5566 Binary files /dev/null and b/assets/pen20/Mechanorimon.png differ diff --git a/assets/pen20/Mega Seadramon.png b/assets/pen20/Mega Seadramon.png new file mode 100644 index 00000000..63e19e04 Binary files /dev/null and b/assets/pen20/Mega Seadramon.png differ diff --git a/assets/pen20/Megalo Growmon.png b/assets/pen20/Megalo Growmon.png new file mode 100644 index 00000000..e4324075 Binary files /dev/null and b/assets/pen20/Megalo Growmon.png differ diff --git a/assets/pen20/Meicrackmon Vicious Mode.png b/assets/pen20/Meicrackmon Vicious Mode.png new file mode 100644 index 00000000..cef56c14 Binary files /dev/null and b/assets/pen20/Meicrackmon Vicious Mode.png differ diff --git a/assets/pen20/Metal Etemon.png b/assets/pen20/Metal Etemon.png new file mode 100644 index 00000000..13b63b04 Binary files /dev/null and b/assets/pen20/Metal Etemon.png differ diff --git a/assets/pen20/Metal Seadramon.png b/assets/pen20/Metal Seadramon.png new file mode 100644 index 00000000..dadc9fba Binary files /dev/null and b/assets/pen20/Metal Seadramon.png differ diff --git a/assets/pen20/Mochimon.png b/assets/pen20/Mochimon.png new file mode 100644 index 00000000..bb79701a Binary files /dev/null and b/assets/pen20/Mochimon.png differ diff --git a/assets/pen20/Mokumon.png b/assets/pen20/Mokumon.png new file mode 100644 index 00000000..39b58bb2 Binary files /dev/null and b/assets/pen20/Mokumon.png differ diff --git a/assets/pen20/Mushmon.png b/assets/pen20/Mushmon.png new file mode 100644 index 00000000..615bccd0 Binary files /dev/null and b/assets/pen20/Mushmon.png differ diff --git a/assets/pen20/Nyokimon.png b/assets/pen20/Nyokimon.png new file mode 100644 index 00000000..c59e2169 Binary files /dev/null and b/assets/pen20/Nyokimon.png differ diff --git a/assets/pen20/Octmon.png b/assets/pen20/Octmon.png new file mode 100644 index 00000000..a8dfaa42 Binary files /dev/null and b/assets/pen20/Octmon.png differ diff --git a/assets/pen20/Ofanimon.png b/assets/pen20/Ofanimon.png new file mode 100644 index 00000000..692489d7 Binary files /dev/null and b/assets/pen20/Ofanimon.png differ diff --git a/assets/pen20/Ogudomon.png b/assets/pen20/Ogudomon.png new file mode 100644 index 00000000..df96a594 Binary files /dev/null and b/assets/pen20/Ogudomon.png differ diff --git a/assets/pen20/Okuwamon.png b/assets/pen20/Okuwamon.png new file mode 100644 index 00000000..9d4f68b4 Binary files /dev/null and b/assets/pen20/Okuwamon.png differ diff --git a/assets/pen20/Ordinemon.png b/assets/pen20/Ordinemon.png new file mode 100644 index 00000000..fbfeb8c5 Binary files /dev/null and b/assets/pen20/Ordinemon.png differ diff --git a/assets/pen20/Otamamon.png b/assets/pen20/Otamamon.png new file mode 100644 index 00000000..48e78576 Binary files /dev/null and b/assets/pen20/Otamamon.png differ diff --git a/assets/pen20/Ouryumon.png b/assets/pen20/Ouryumon.png new file mode 100644 index 00000000..226654d1 Binary files /dev/null and b/assets/pen20/Ouryumon.png differ diff --git a/assets/pen20/Paildramon.png b/assets/pen20/Paildramon.png new file mode 100644 index 00000000..102bc6f0 Binary files /dev/null and b/assets/pen20/Paildramon.png differ diff --git a/assets/pen20/Peti Meramon.png b/assets/pen20/Peti Meramon.png new file mode 100644 index 00000000..21fc321c Binary files /dev/null and b/assets/pen20/Peti Meramon.png differ diff --git a/assets/pen20/Phascomon.png b/assets/pen20/Phascomon.png new file mode 100644 index 00000000..4c970c50 Binary files /dev/null and b/assets/pen20/Phascomon.png differ diff --git a/assets/pen20/Pico Devimon.png b/assets/pen20/Pico Devimon.png new file mode 100644 index 00000000..76a45c4b Binary files /dev/null and b/assets/pen20/Pico Devimon.png differ diff --git a/assets/pen20/Piemon.png b/assets/pen20/Piemon.png new file mode 100644 index 00000000..7ca62af5 Binary files /dev/null and b/assets/pen20/Piemon.png differ diff --git a/assets/pen20/Plesiomon.png b/assets/pen20/Plesiomon.png new file mode 100644 index 00000000..696f0fb6 Binary files /dev/null and b/assets/pen20/Plesiomon.png differ diff --git a/assets/pen20/Porcupmon.png b/assets/pen20/Porcupmon.png new file mode 100644 index 00000000..1b8f8b08 Binary files /dev/null and b/assets/pen20/Porcupmon.png differ diff --git a/assets/pen20/Pukumon.png b/assets/pen20/Pukumon.png new file mode 100644 index 00000000..7e374b75 Binary files /dev/null and b/assets/pen20/Pukumon.png differ diff --git a/assets/pen20/Pumpmon.png b/assets/pen20/Pumpmon.png new file mode 100644 index 00000000..65424406 Binary files /dev/null and b/assets/pen20/Pumpmon.png differ diff --git a/assets/pen20/Pyocomon.png b/assets/pen20/Pyocomon.png new file mode 100644 index 00000000..5fa159db Binary files /dev/null and b/assets/pen20/Pyocomon.png differ diff --git a/assets/pen20/Rafflesimon.png b/assets/pen20/Rafflesimon.png new file mode 100644 index 00000000..e3519a19 Binary files /dev/null and b/assets/pen20/Rafflesimon.png differ diff --git a/assets/pen20/Ragna Lordmon.png b/assets/pen20/Ragna Lordmon.png new file mode 100644 index 00000000..3b97ddb7 Binary files /dev/null and b/assets/pen20/Ragna Lordmon.png differ diff --git a/assets/pen20/Raguelmon.png b/assets/pen20/Raguelmon.png new file mode 100644 index 00000000..80bde1d7 Binary files /dev/null and b/assets/pen20/Raguelmon.png differ diff --git a/assets/pen20/Raiji Ludomon.png b/assets/pen20/Raiji Ludomon.png new file mode 100644 index 00000000..3c820615 Binary files /dev/null and b/assets/pen20/Raiji Ludomon.png differ diff --git a/assets/pen20/Rakamon.png b/assets/pen20/Rakamon.png new file mode 100644 index 00000000..9476c34c Binary files /dev/null and b/assets/pen20/Rakamon.png differ diff --git a/assets/pen20/Rapidmon.png b/assets/pen20/Rapidmon.png new file mode 100644 index 00000000..b18d8795 Binary files /dev/null and b/assets/pen20/Rapidmon.png differ diff --git a/assets/pen20/Red Vegimon.png b/assets/pen20/Red Vegimon.png new file mode 100644 index 00000000..b0827f56 Binary files /dev/null and b/assets/pen20/Red Vegimon.png differ diff --git a/assets/pen20/Reppamon.png b/assets/pen20/Reppamon.png new file mode 100644 index 00000000..cec092c3 Binary files /dev/null and b/assets/pen20/Reppamon.png differ diff --git a/assets/pen20/Revolmon.png b/assets/pen20/Revolmon.png new file mode 100644 index 00000000..c6ffdd28 Binary files /dev/null and b/assets/pen20/Revolmon.png differ diff --git a/assets/pen20/Rize Greymon.png b/assets/pen20/Rize Greymon.png new file mode 100644 index 00000000..ad65e83a Binary files /dev/null and b/assets/pen20/Rize Greymon.png differ diff --git a/assets/pen20/Rosemon.png b/assets/pen20/Rosemon.png new file mode 100644 index 00000000..d74bbb2a Binary files /dev/null and b/assets/pen20/Rosemon.png differ diff --git a/assets/pen20/Ryudamon.png b/assets/pen20/Ryudamon.png new file mode 100644 index 00000000..01cd9515 Binary files /dev/null and b/assets/pen20/Ryudamon.png differ diff --git a/assets/pen20/Saber Leomon.png b/assets/pen20/Saber Leomon.png new file mode 100644 index 00000000..f29106b7 Binary files /dev/null and b/assets/pen20/Saber Leomon.png differ diff --git a/assets/pen20/Saint Galgomon.png b/assets/pen20/Saint Galgomon.png new file mode 100644 index 00000000..f7cd438a Binary files /dev/null and b/assets/pen20/Saint Galgomon.png differ diff --git a/assets/pen20/Seraphimon.png b/assets/pen20/Seraphimon.png new file mode 100644 index 00000000..4893fbdb Binary files /dev/null and b/assets/pen20/Seraphimon.png differ diff --git a/assets/pen20/Shadramon.png b/assets/pen20/Shadramon.png new file mode 100644 index 00000000..de394e09 Binary files /dev/null and b/assets/pen20/Shadramon.png differ diff --git a/assets/pen20/Shakomon.png b/assets/pen20/Shakomon.png new file mode 100644 index 00000000..faec4a58 Binary files /dev/null and b/assets/pen20/Shakomon.png differ diff --git a/assets/pen20/Starmon.png b/assets/pen20/Starmon.png new file mode 100644 index 00000000..0f07d41d Binary files /dev/null and b/assets/pen20/Starmon.png differ diff --git a/assets/pen20/Sunflowmon.png b/assets/pen20/Sunflowmon.png new file mode 100644 index 00000000..b56b7979 Binary files /dev/null and b/assets/pen20/Sunflowmon.png differ diff --git a/assets/pen20/Tailmon.png b/assets/pen20/Tailmon.png new file mode 100644 index 00000000..20fb8ed1 Binary files /dev/null and b/assets/pen20/Tailmon.png differ diff --git a/assets/pen20/Tankmon.png b/assets/pen20/Tankmon.png new file mode 100644 index 00000000..7a6dc8d5 Binary files /dev/null and b/assets/pen20/Tankmon.png differ diff --git a/assets/pen20/Targetmon.png b/assets/pen20/Targetmon.png new file mode 100644 index 00000000..a23a522c Binary files /dev/null and b/assets/pen20/Targetmon.png differ diff --git a/assets/pen20/Tentomon.png b/assets/pen20/Tentomon.png new file mode 100644 index 00000000..6e6eed53 Binary files /dev/null and b/assets/pen20/Tentomon.png differ diff --git a/assets/pen20/Terriermon.png b/assets/pen20/Terriermon.png new file mode 100644 index 00000000..38b49433 Binary files /dev/null and b/assets/pen20/Terriermon.png differ diff --git a/assets/pen20/Thunderballmon.png b/assets/pen20/Thunderballmon.png new file mode 100644 index 00000000..bcaf049f Binary files /dev/null and b/assets/pen20/Thunderballmon.png differ diff --git a/assets/pen20/Tia Ludomon.png b/assets/pen20/Tia Ludomon.png new file mode 100644 index 00000000..a507970b Binary files /dev/null and b/assets/pen20/Tia Ludomon.png differ diff --git a/assets/pen20/Togemon.png b/assets/pen20/Togemon.png new file mode 100644 index 00000000..0bee16f8 Binary files /dev/null and b/assets/pen20/Togemon.png differ diff --git a/assets/pen20/Tonosama Gekomon.png b/assets/pen20/Tonosama Gekomon.png new file mode 100644 index 00000000..7b152362 Binary files /dev/null and b/assets/pen20/Tonosama Gekomon.png differ diff --git a/assets/pen20/Tortamon.png b/assets/pen20/Tortamon.png new file mode 100644 index 00000000..db7a84a5 Binary files /dev/null and b/assets/pen20/Tortamon.png differ diff --git a/assets/pen20/Toy Agumon.png b/assets/pen20/Toy Agumon.png new file mode 100644 index 00000000..088c1f6d Binary files /dev/null and b/assets/pen20/Toy Agumon.png differ diff --git a/assets/pen20/Triceramon.png b/assets/pen20/Triceramon.png new file mode 100644 index 00000000..eeaea5b7 Binary files /dev/null and b/assets/pen20/Triceramon.png differ diff --git a/assets/pen20/Troopmon.png b/assets/pen20/Troopmon.png new file mode 100644 index 00000000..83e0e900 Binary files /dev/null and b/assets/pen20/Troopmon.png differ diff --git a/assets/pen20/Turuiemon.png b/assets/pen20/Turuiemon.png new file mode 100644 index 00000000..a4d9802d Binary files /dev/null and b/assets/pen20/Turuiemon.png differ diff --git a/assets/pen20/V-dramon.png b/assets/pen20/V-dramon.png new file mode 100644 index 00000000..ccfe1900 Binary files /dev/null and b/assets/pen20/V-dramon.png differ diff --git a/assets/pen20/V-mon.png b/assets/pen20/V-mon.png new file mode 100644 index 00000000..bba66169 Binary files /dev/null and b/assets/pen20/V-mon.png differ diff --git a/assets/pen20/Vemdemon.png b/assets/pen20/Vemdemon.png new file mode 100644 index 00000000..0c36921f Binary files /dev/null and b/assets/pen20/Vemdemon.png differ diff --git a/assets/pen20/Venom Vamdemon.png b/assets/pen20/Venom Vamdemon.png new file mode 100644 index 00000000..1b9fb6ab Binary files /dev/null and b/assets/pen20/Venom Vamdemon.png differ diff --git a/assets/pen20/Volcanicdramon.png b/assets/pen20/Volcanicdramon.png new file mode 100644 index 00000000..5a13b707 Binary files /dev/null and b/assets/pen20/Volcanicdramon.png differ diff --git a/assets/pen20/Voltobautamon.png b/assets/pen20/Voltobautamon.png new file mode 100644 index 00000000..47c885a9 Binary files /dev/null and b/assets/pen20/Voltobautamon.png differ diff --git a/assets/pen20/Vorvomon.png b/assets/pen20/Vorvomon.png new file mode 100644 index 00000000..708ef854 Binary files /dev/null and b/assets/pen20/Vorvomon.png differ diff --git a/assets/pen20/Waru Mozaemon.png b/assets/pen20/Waru Mozaemon.png new file mode 100644 index 00000000..d1d868a7 Binary files /dev/null and b/assets/pen20/Waru Mozaemon.png differ diff --git a/assets/pen20/Wizarmon.png b/assets/pen20/Wizarmon.png new file mode 100644 index 00000000..06e64221 Binary files /dev/null and b/assets/pen20/Wizarmon.png differ diff --git a/assets/pen20/Woodmon.png b/assets/pen20/Woodmon.png new file mode 100644 index 00000000..53984923 Binary files /dev/null and b/assets/pen20/Woodmon.png differ diff --git a/assets/pen20/XV-mon.png b/assets/pen20/XV-mon.png new file mode 100644 index 00000000..c25017ea Binary files /dev/null and b/assets/pen20/XV-mon.png differ diff --git a/assets/pen20/Zerimon.png b/assets/pen20/Zerimon.png new file mode 100644 index 00000000..fcae5e2d Binary files /dev/null and b/assets/pen20/Zerimon.png differ diff --git a/assets/pen20/Zudomom.png b/assets/pen20/Zudomom.png new file mode 100644 index 00000000..e979f51c Binary files /dev/null and b/assets/pen20/Zudomom.png differ diff --git a/docs/bongocat-all.conf.md b/docs/bongocat-all.conf.md index 77c3fc93..8aea5ac7 100644 --- a/docs/bongocat-all.conf.md +++ b/docs/bongocat-all.conf.md @@ -6,6 +6,8 @@ fragments/set-bongocat.md fragments/set-dm.md fragments/set-dm20.md fragments/set-dmx.md +fragments/set-pen.md +fragments/set-pen20.md fragments/set-dmc.md fragments/set-dmall.md fragments/set-more-ms-agent.md diff --git a/docs/bongocat-dm-classic.conf.md b/docs/bongocat-dm-classic.conf.md index 3a58fcdc..16c2c567 100644 --- a/docs/bongocat-dm-classic.conf.md +++ b/docs/bongocat-dm-classic.conf.md @@ -5,4 +5,6 @@ fragments/set-bongocat.md fragments/set-dm.md fragments/set-dm20.md fragments/set-dmx.md +fragments/set-pen.md +fragments/set-pen20.md ``` diff --git a/docs/bongocat-dm.conf.md b/docs/bongocat-dm.conf.md index 66d316e2..953c562b 100644 --- a/docs/bongocat-dm.conf.md +++ b/docs/bongocat-dm.conf.md @@ -4,6 +4,7 @@ fragments/set-bongocat.md fragments/set-dm20.md fragments/set-dmx.md +fragments/set-pen20.md fragments/set-dmc.md fragments/set-dmall.md ``` diff --git a/docs/fragments/options-all.md b/docs/fragments/options-all.md index ec5cd2a4..2000c26e 100644 --- a/docs/fragments/options-all.md +++ b/docs/fragments/options-all.md @@ -34,6 +34,8 @@ Included sets: dm - Digital Monster Original dm20 - Digital Monster Ver.20th dmx - Digital Monster X + pen - Digimon Pendulum + pen20 - Digimon Pendulum Ver.20th dmc - Digital Monster Color pkmn - Pokemon, up to Gen 7 ms_agent - MS Agent diff --git a/docs/fragments/options-dm-classic.md b/docs/fragments/options-dm-classic.md index f619268d..cf72eee8 100644 --- a/docs/fragments/options-dm-classic.md +++ b/docs/fragments/options-dm-classic.md @@ -34,4 +34,6 @@ Included sets: dm - Digital Monster Original dm20 - Digital Monster Ver.20th dmx - Digital Monster X + pen - Digimon Pendulum + pen20 - Digimon Pendulum Ver.20th diff --git a/docs/fragments/options-dm.md b/docs/fragments/options-dm.md index f619268d..cf72eee8 100644 --- a/docs/fragments/options-dm.md +++ b/docs/fragments/options-dm.md @@ -34,4 +34,6 @@ Included sets: dm - Digital Monster Original dm20 - Digital Monster Ver.20th dmx - Digital Monster X + pen - Digimon Pendulum + pen20 - Digimon Pendulum Ver.20th diff --git a/docs/fragments/set-pen.md b/docs/fragments/set-pen.md new file mode 100644 index 00000000..b2271953 --- /dev/null +++ b/docs/fragments/set-pen.md @@ -0,0 +1,94 @@ +## pen +Digimon Pendulum + +- Aero V-dramon +- Angewomon +- Anomalocarimon +- Asuramon +- Atlur Kabuterimon +- Bakumon +- Big Mamemon +- Blossomon +- Boltmon +- Bubbmon +- Candmon +- Caprimon +- Choromon +- Clockmon +- Cyberdramon +- Dagomon +- Death Meramon +- Delumon +- Dokugumon +- Ebidramon +- Fantomon +- Floramon +- Ganimon +- Garudamon +- Gekomon +- Gerbemon +- Gesomon +- Gomamon +- Gottsumon +- Griffomon +- Guardromon +- Hagurumon +- Hangymon +- Hanumon +- Herkule Kabuterimon +- Holy Angemon +- Holydramon +- Hououmon +- Ignamon +- Ikkakumon +- Jyagamon +- Jyureimon +- Kiwimon +- Knightmon +- Kokuwamon +- Lady Devimon +- Lilimon +- Mammon +- Marin Angemon +- Marin Devimon +- Mechanorimon +- Mega Seadramon +- Metal Etemon +- Metal Seadramon +- Mochimon +- Mokumon +- Mushmon +- Nyokimon +- Octmon +- Okuwamon +- Otamamon +- Peti Meramon +- Pico Devimon +- Piemon +- Plesiomon +- Pukumon +- Pumpmon +- Pyocomon +- Rakamon +- Red Vegimon +- Revolmon +- Rosemon +- Saber Leomon +- Shakomon +- Starmon +- Tailmon +- Tankmon +- Tentomon +- Thunderballmon +- Togemon +- Tonosama Gekomon +- Tortamon +- Toy Agumon +- Triceramon +- V-dramon +- Vemdemon +- Venom Vamdemon +- Waru Mozaemon +- Wizarmon +- Woodmon +- Zudomom diff --git a/docs/fragments/set-pen20.md b/docs/fragments/set-pen20.md new file mode 100644 index 00000000..06e3ce21 --- /dev/null +++ b/docs/fragments/set-pen20.md @@ -0,0 +1,169 @@ +## pen20 +Digimon Pendulum Ver.20th + +- Aero V-dramon +- Agumon Hakase +- Alphamon Ouryuken +- Andiramon +- Angewomon +- Anomalocarimon +- Arresterdramon +- Astramon +- Asuramon +- Atlur Kabuterimon +- Baalmon +- Bakumon +- Bancho Leomon +- Beelzebumon Blast Mode +- Beowulfmon +- Big Mamemon +- Blossomon +- Boltmon +- Bryweludramon +- Bubbmon +- Budmon +- Bushi Agumon +- Candmon +- Caprimon +- Chaosmon +- Cherubimon +- Chibimon +- Chicomon +- Choromon +- Clockmon +- Cocomon +- Cotsucomon +- Cyberdramon +- Dagomon +- Darkdramon +- Dark Knightmon +- Death Meramon +- Delumon +- Dokugumon +- DORUgoramon +- Ebidramon +- Fantomon +- Floramon +- Fufumon +- Galgomon +- Ganimon +- Garudamon +- Gekomon +- Gerbemon +- Gesomon +- Ginryumon +- Gomamon +- Gottsumon +- Griffomon +- Growmon +- Guardromon +- Guimon +- Gummymon +- Hagurumon +- Hangymon +- Hanumon +- Herkule Kabuterimon +- Hisyaryumon +- Holy Angemon +- Holydramon +- Hououmon +- Ignamon +- Ikkakumon +- Imperialdramon Fighter Mode +- Impmon +- Jesmon X +- Jyagamon +- Jyureimon +- Kakkinmon +- Kiwimon +- Knightmon +- Kokuwamon +- Kyokyomon +- Lady Devimon +- Lalamon +- Lavogaritamon +- Lavorvomon +- Lilamon +- Lilimon +- Lopmon +- Lotusmon +- Ludomon +- Mad Leomon +- Mambomon +- Mammon +- Marin Angemon +- Marin Devimon +- Mastemon +- Mechanorimon +- Megalo Growmon +- Mega Seadramon +- Meicrackmon Vicious Mode +- Metal Etemon +- Metal Seadramon +- Mochimon +- Mokumon +- Mushmon +- Nyokimon +- Octmon +- Ofanimon +- Ogudomon +- Okuwamon +- Ordinemon +- Otamamon +- Ouryumon +- Paildramon +- Peti Meramon +- Phascomon +- Pico Devimon +- Piemon +- Plesiomon +- Porcupmon +- Pukumon +- Pumpmon +- Pyocomon +- Rafflesimon +- Ragna Lordmon +- Raguelmon +- Raiji Ludomon +- Rakamon +- Rapidmon +- Red Vegimon +- Reppamon +- Revolmon +- Rize Greymon +- Rosemon +- Ryudamon +- Saber Leomon +- Saint Galgomon +- Seraphimon +- Shadramon +- Shakomon +- Starmon +- Sunflowmon +- Tailmon +- Tankmon +- Targetmon +- Tentomon +- Terriermon +- Thunderballmon +- Tia Ludomon +- Togemon +- Tonosama Gekomon +- Tortamon +- Toy Agumon +- Triceramon +- Troopmon +- Turuiemon +- V-dramon +- Vemdemon +- Venom Vamdemon +- V-mon +- Volcanicdramon +- Voltobautamon +- Vorvomon +- Waru Mozaemon +- Wizarmon +- Woodmon +- XV-mon +- Zerimon +- Zudomom diff --git a/include/config/config.h b/include/config/config.h index cdcf013b..203c2836 100644 --- a/include/config/config.h +++ b/include/config/config.h @@ -64,6 +64,8 @@ namespace bongocat::config { dm, dm20, dmx, + pen, + pen20, dmc, dmall, }; diff --git a/include/core/bongocat.h b/include/core/bongocat.h index f2c055ab..25d8a274 100644 --- a/include/core/bongocat.h +++ b/include/core/bongocat.h @@ -28,6 +28,11 @@ namespace bongocat { }; namespace features { + // experimental + inline static constexpr bool BongocatIdleAnimation = false; + inline static constexpr bool BongocatBoringAnimation = false; + + #ifndef NDEBUG inline static constexpr bool Debug = true; #else @@ -62,6 +67,11 @@ namespace bongocat { #else inline static constexpr bool EnableDmxEmbeddedAssets = false; #endif +#ifdef FEATURE_PEN_EMBEDDED_ASSETS + inline static constexpr bool EnablePenEmbeddedAssets = true; +#else + inline static constexpr bool EnablePenEmbeddedAssets = false; +#endif #ifdef FEATURE_PEN20_EMBEDDED_ASSETS inline static constexpr bool EnablePen20EmbeddedAssets = true; #else @@ -83,6 +93,7 @@ namespace bongocat { inline static constexpr bool EnableDm20EmbeddedAssets = false; inline static constexpr bool EnableDmcEmbeddedAssets = false; inline static constexpr bool EnableDmxEmbeddedAssets = false; + inline static constexpr bool EnablePenEmbeddedAssets = false; inline static constexpr bool EnablePen20EmbeddedAssets = false; inline static constexpr bool EnableMinDmEmbeddedAssets = false; inline static constexpr bool EnableDmAllEmbeddedAssets = false; @@ -144,7 +155,7 @@ namespace bongocat { } - // Global consts + // Global constants namespace input { inline static constexpr size_t MAX_INPUT_DEVICES = 256; static_assert(MAX_INPUT_DEVICES <= INT32_MAX); diff --git a/include/embedded_assets/bongocat/bongocat.h b/include/embedded_assets/bongocat/bongocat.h index 092c4f35..79b129cb 100644 --- a/include/embedded_assets/bongocat/bongocat.h +++ b/include/embedded_assets/bongocat/bongocat.h @@ -14,8 +14,10 @@ namespace bongocat::assets { inline static constexpr int BONGOCAT_FRAME_LEFT_DOWN = 1; inline static constexpr int BONGOCAT_FRAME_RIGHT_DOWN = 2; inline static constexpr int BONGOCAT_FRAME_BOTH_DOWN = 3; - inline static constexpr std::size_t BONGOCAT_SPRITE_SHEET_COLS = 4; - inline static constexpr std::size_t BONGOCAT_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t BONGOCAT_SPRITE_SHEET_ROW = 0; + + inline static constexpr size_t BONGOCAT_SPRITE_SHEET_COLS = 4; + inline static constexpr size_t BONGOCAT_SPRITE_SHEET_ROWS = 1; // apparently inline static constexpr int BONGOCAT_FRAME_WIDTH = 864; @@ -25,7 +27,7 @@ namespace bongocat::assets { inline static constexpr size_t BONGOCAT_ANIMATIONS_COUNT = 1; [[nodiscard]] extern embedded_image_t get_bongocat_sprite(size_t i); - [[nodiscard]] extern created_result_t get_bongocat_sprite_sheet(const animation::animation_context_t& ctx, int index); + [[nodiscard]] extern created_result_t get_bongocat_sprite_sheet(const animation::animation_context_t& ctx, int index); } #endif // BONGOCAT_EMBEDDED_ASSETS_BONGOCAT_H diff --git a/include/embedded_assets/ms_agent/ms_agent.hpp b/include/embedded_assets/ms_agent/ms_agent.hpp index 3f0ad3e8..63cecee3 100644 --- a/include/embedded_assets/ms_agent/ms_agent.hpp +++ b/include/embedded_assets/ms_agent/ms_agent.hpp @@ -107,8 +107,11 @@ namespace bongocat::assets { inline static constexpr size_t MS_AGENTS_ANIM_COUNT = 4; + /// @TODO: determine the biggest cols from MS agents + inline static constexpr size_t MAX_SPRITE_SHEET_COL_FRAMES = ROVER_SPRITE_SHEET_COLS; #else inline static constexpr size_t MS_AGENTS_ANIM_COUNT = 1; + inline static constexpr size_t MAX_SPRITE_SHEET_COL_FRAMES = CLIPPY_SPRITE_SHEET_COLS; #endif } diff --git a/include/embedded_assets/ms_agent/ms_agent_sprite.h b/include/embedded_assets/ms_agent/ms_agent_sprite.h index ab0f2e34..c193b8a2 100644 --- a/include/embedded_assets/ms_agent/ms_agent_sprite.h +++ b/include/embedded_assets/ms_agent/ms_agent_sprite.h @@ -15,10 +15,8 @@ namespace bongocat::assets { int32_t start_index_frame_start_writing{0}; int32_t end_index_frame_start_writing{0}; - int32_t start_index_frame_writing{0}; int32_t end_index_frame_writing{0}; - int32_t start_index_frame_end_writing{0}; int32_t end_index_frame_end_writing{0}; @@ -27,6 +25,20 @@ namespace bongocat::assets { int32_t start_index_frame_wake_up{0}; int32_t end_index_frame_wake_up{0}; + + int32_t start_index_frame_start_working{0}; + int32_t end_index_frame_start_working{0}; + int32_t start_index_frame_working{0}; + int32_t end_index_frame_working{0}; + int32_t start_index_frame_end_working{0}; + int32_t end_index_frame_end_working{0}; + + int32_t start_index_frame_start_moving{0}; + int32_t end_index_frame_start_moving{0}; + int32_t start_index_frame_moving{0}; + int32_t end_index_frame_moving{0}; + int32_t start_index_frame_end_moving{0}; + int32_t end_index_frame_end_moving{0}; }; inline static constexpr size_t MS_AGENT_SPRITE_SHEET_ROW_IDLE = 0; @@ -36,6 +48,12 @@ namespace bongocat::assets { inline static constexpr size_t MS_AGENT_SPRITE_SHEET_ROW_END_WRITING = 3; inline static constexpr size_t MS_AGENT_SPRITE_SHEET_ROW_SLEEP = 4; inline static constexpr size_t MS_AGENT_SPRITE_SHEET_ROW_WAKE_UP = 5; + inline static constexpr size_t MS_AGENT_SPRITE_SHEET_ROW_START_WORKING = 6; + inline static constexpr size_t MS_AGENT_SPRITE_SHEET_ROW_WORKING = 7; + inline static constexpr size_t MS_AGENT_SPRITE_SHEET_ROW_END_WORKING = 8; + inline static constexpr size_t MS_AGENT_SPRITE_SHEET_ROW_START_MOVING = 9; + inline static constexpr size_t MS_AGENT_SPRITE_SHEET_ROW_MOVING = 10; + inline static constexpr size_t MS_AGENT_SPRITE_SHEET_ROW_END_MOVING = 11; enum class ClippyAnimations : uint8_t { Idle = MS_AGENT_SPRITE_SHEET_ROW_IDLE, Boring = MS_AGENT_SPRITE_SHEET_ROW_BORING, @@ -44,9 +62,14 @@ namespace bongocat::assets { EndWriting = MS_AGENT_SPRITE_SHEET_ROW_END_WRITING, Sleep = MS_AGENT_SPRITE_SHEET_ROW_SLEEP, WakeUp = MS_AGENT_SPRITE_SHEET_ROW_WAKE_UP, + // optional + StartWorking = MS_AGENT_SPRITE_SHEET_ROW_START_WORKING, + Working = MS_AGENT_SPRITE_SHEET_ROW_WORKING, + EndWorking = MS_AGENT_SPRITE_SHEET_ROW_END_WORKING, + StartMoving = MS_AGENT_SPRITE_SHEET_ROW_START_MOVING, + Moving = MS_AGENT_SPRITE_SHEET_ROW_MOVING, + EndMoving = MS_AGENT_SPRITE_SHEET_ROW_END_MOVING, }; - inline static constexpr size_t MS_AGENTS_SPRITE_SHEET_ROWS = 6; - inline static constexpr size_t MAX_SPRITE_SHEET_COL_FRAMES = 40; #ifdef FEATURE_MORE_MS_AGENT_EMBEDDED_ASSETS inline static constexpr size_t MS_AGENTS_SPRITE_SHEET_EMBEDDED_IMAGES_COUNT = 4; diff --git a/include/embedded_assets/pen/pen.hpp b/include/embedded_assets/pen/pen.hpp new file mode 100644 index 00000000..b96d4b29 --- /dev/null +++ b/include/embedded_assets/pen/pen.hpp @@ -0,0 +1,1651 @@ +#ifndef BONGOCAT_EMBEDDED_ASSETS_PEN_HPP +#define BONGOCAT_EMBEDDED_ASSETS_PEN_HPP + +#include + +/// @NOTE: Generated embedded assets images data from assets/pen + +namespace bongocat::assets { + // Name: Aero V-dramon + inline static constexpr char PEN_AERO_V_DRAMON_FQID_ARR[] = "pen:aero_v_dramon"; + inline static constexpr const char* PEN_AERO_V_DRAMON_FQID = PEN_AERO_V_DRAMON_FQID_ARR; + inline static constexpr size_t PEN_AERO_V_DRAMON_FQID_LEN = sizeof(PEN_AERO_V_DRAMON_FQID_ARR)-1; + inline static constexpr char PEN_AERO_V_DRAMON_ID_ARR[] = "aero_v_dramon"; + inline static constexpr const char* PEN_AERO_V_DRAMON_ID = PEN_AERO_V_DRAMON_ID_ARR; + inline static constexpr size_t PEN_AERO_V_DRAMON_ID_LEN = sizeof(PEN_AERO_V_DRAMON_ID)-1; + inline static constexpr char PEN_AERO_V_DRAMON_NAME_ARR[] = "Aero V-dramon"; + inline static constexpr const char* PEN_AERO_V_DRAMON_NAME = PEN_AERO_V_DRAMON_NAME_ARR; + inline static constexpr size_t PEN_AERO_V_DRAMON_NAME_LEN = sizeof(PEN_AERO_V_DRAMON_NAME_ARR)-1; + inline static constexpr char PEN_AERO_V_DRAMON_FQNAME_ARR[] = "pen:Aero V-dramon"; + inline static constexpr const char* PEN_AERO_V_DRAMON_FQNAME = PEN_AERO_V_DRAMON_FQNAME_ARR; + inline static constexpr size_t PEN_AERO_V_DRAMON_FQNAME_LEN = sizeof(PEN_AERO_V_DRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_AERO_V_DRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_AERO_V_DRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_AERO_V_DRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_AERO_V_DRAMON_ANIM_INDEX = 0; + + // Name: Angewomon + inline static constexpr char PEN_ANGEWOMON_FQID_ARR[] = "pen:angewomon"; + inline static constexpr const char* PEN_ANGEWOMON_FQID = PEN_ANGEWOMON_FQID_ARR; + inline static constexpr size_t PEN_ANGEWOMON_FQID_LEN = sizeof(PEN_ANGEWOMON_FQID_ARR)-1; + inline static constexpr char PEN_ANGEWOMON_ID_ARR[] = "angewomon"; + inline static constexpr const char* PEN_ANGEWOMON_ID = PEN_ANGEWOMON_ID_ARR; + inline static constexpr size_t PEN_ANGEWOMON_ID_LEN = sizeof(PEN_ANGEWOMON_ID)-1; + inline static constexpr char PEN_ANGEWOMON_NAME_ARR[] = "Angewomon"; + inline static constexpr const char* PEN_ANGEWOMON_NAME = PEN_ANGEWOMON_NAME_ARR; + inline static constexpr size_t PEN_ANGEWOMON_NAME_LEN = sizeof(PEN_ANGEWOMON_NAME_ARR)-1; + inline static constexpr char PEN_ANGEWOMON_FQNAME_ARR[] = "pen:Angewomon"; + inline static constexpr const char* PEN_ANGEWOMON_FQNAME = PEN_ANGEWOMON_FQNAME_ARR; + inline static constexpr size_t PEN_ANGEWOMON_FQNAME_LEN = sizeof(PEN_ANGEWOMON_FQNAME_ARR)-1; + inline static constexpr int PEN_ANGEWOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_ANGEWOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_ANGEWOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_ANGEWOMON_ANIM_INDEX = 1; + + // Name: Anomalocarimon + inline static constexpr char PEN_ANOMALOCARIMON_FQID_ARR[] = "pen:anomalocarimon"; + inline static constexpr const char* PEN_ANOMALOCARIMON_FQID = PEN_ANOMALOCARIMON_FQID_ARR; + inline static constexpr size_t PEN_ANOMALOCARIMON_FQID_LEN = sizeof(PEN_ANOMALOCARIMON_FQID_ARR)-1; + inline static constexpr char PEN_ANOMALOCARIMON_ID_ARR[] = "anomalocarimon"; + inline static constexpr const char* PEN_ANOMALOCARIMON_ID = PEN_ANOMALOCARIMON_ID_ARR; + inline static constexpr size_t PEN_ANOMALOCARIMON_ID_LEN = sizeof(PEN_ANOMALOCARIMON_ID)-1; + inline static constexpr char PEN_ANOMALOCARIMON_NAME_ARR[] = "Anomalocarimon"; + inline static constexpr const char* PEN_ANOMALOCARIMON_NAME = PEN_ANOMALOCARIMON_NAME_ARR; + inline static constexpr size_t PEN_ANOMALOCARIMON_NAME_LEN = sizeof(PEN_ANOMALOCARIMON_NAME_ARR)-1; + inline static constexpr char PEN_ANOMALOCARIMON_FQNAME_ARR[] = "pen:Anomalocarimon"; + inline static constexpr const char* PEN_ANOMALOCARIMON_FQNAME = PEN_ANOMALOCARIMON_FQNAME_ARR; + inline static constexpr size_t PEN_ANOMALOCARIMON_FQNAME_LEN = sizeof(PEN_ANOMALOCARIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_ANOMALOCARIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_ANOMALOCARIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_ANOMALOCARIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_ANOMALOCARIMON_ANIM_INDEX = 2; + + // Name: Asuramon + inline static constexpr char PEN_ASURAMON_FQID_ARR[] = "pen:asuramon"; + inline static constexpr const char* PEN_ASURAMON_FQID = PEN_ASURAMON_FQID_ARR; + inline static constexpr size_t PEN_ASURAMON_FQID_LEN = sizeof(PEN_ASURAMON_FQID_ARR)-1; + inline static constexpr char PEN_ASURAMON_ID_ARR[] = "asuramon"; + inline static constexpr const char* PEN_ASURAMON_ID = PEN_ASURAMON_ID_ARR; + inline static constexpr size_t PEN_ASURAMON_ID_LEN = sizeof(PEN_ASURAMON_ID)-1; + inline static constexpr char PEN_ASURAMON_NAME_ARR[] = "Asuramon"; + inline static constexpr const char* PEN_ASURAMON_NAME = PEN_ASURAMON_NAME_ARR; + inline static constexpr size_t PEN_ASURAMON_NAME_LEN = sizeof(PEN_ASURAMON_NAME_ARR)-1; + inline static constexpr char PEN_ASURAMON_FQNAME_ARR[] = "pen:Asuramon"; + inline static constexpr const char* PEN_ASURAMON_FQNAME = PEN_ASURAMON_FQNAME_ARR; + inline static constexpr size_t PEN_ASURAMON_FQNAME_LEN = sizeof(PEN_ASURAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_ASURAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_ASURAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_ASURAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_ASURAMON_ANIM_INDEX = 3; + + // Name: Atlur Kabuterimon + inline static constexpr char PEN_ATLUR_KABUTERIMON_FQID_ARR[] = "pen:atlur_kabuterimon"; + inline static constexpr const char* PEN_ATLUR_KABUTERIMON_FQID = PEN_ATLUR_KABUTERIMON_FQID_ARR; + inline static constexpr size_t PEN_ATLUR_KABUTERIMON_FQID_LEN = sizeof(PEN_ATLUR_KABUTERIMON_FQID_ARR)-1; + inline static constexpr char PEN_ATLUR_KABUTERIMON_ID_ARR[] = "atlur_kabuterimon"; + inline static constexpr const char* PEN_ATLUR_KABUTERIMON_ID = PEN_ATLUR_KABUTERIMON_ID_ARR; + inline static constexpr size_t PEN_ATLUR_KABUTERIMON_ID_LEN = sizeof(PEN_ATLUR_KABUTERIMON_ID)-1; + inline static constexpr char PEN_ATLUR_KABUTERIMON_NAME_ARR[] = "Atlur Kabuterimon"; + inline static constexpr const char* PEN_ATLUR_KABUTERIMON_NAME = PEN_ATLUR_KABUTERIMON_NAME_ARR; + inline static constexpr size_t PEN_ATLUR_KABUTERIMON_NAME_LEN = sizeof(PEN_ATLUR_KABUTERIMON_NAME_ARR)-1; + inline static constexpr char PEN_ATLUR_KABUTERIMON_FQNAME_ARR[] = "pen:Atlur Kabuterimon"; + inline static constexpr const char* PEN_ATLUR_KABUTERIMON_FQNAME = PEN_ATLUR_KABUTERIMON_FQNAME_ARR; + inline static constexpr size_t PEN_ATLUR_KABUTERIMON_FQNAME_LEN = sizeof(PEN_ATLUR_KABUTERIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_ATLUR_KABUTERIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_ATLUR_KABUTERIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_ATLUR_KABUTERIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_ATLUR_KABUTERIMON_ANIM_INDEX = 4; + + // Name: Bakumon + inline static constexpr char PEN_BAKUMON_FQID_ARR[] = "pen:bakumon"; + inline static constexpr const char* PEN_BAKUMON_FQID = PEN_BAKUMON_FQID_ARR; + inline static constexpr size_t PEN_BAKUMON_FQID_LEN = sizeof(PEN_BAKUMON_FQID_ARR)-1; + inline static constexpr char PEN_BAKUMON_ID_ARR[] = "bakumon"; + inline static constexpr const char* PEN_BAKUMON_ID = PEN_BAKUMON_ID_ARR; + inline static constexpr size_t PEN_BAKUMON_ID_LEN = sizeof(PEN_BAKUMON_ID)-1; + inline static constexpr char PEN_BAKUMON_NAME_ARR[] = "Bakumon"; + inline static constexpr const char* PEN_BAKUMON_NAME = PEN_BAKUMON_NAME_ARR; + inline static constexpr size_t PEN_BAKUMON_NAME_LEN = sizeof(PEN_BAKUMON_NAME_ARR)-1; + inline static constexpr char PEN_BAKUMON_FQNAME_ARR[] = "pen:Bakumon"; + inline static constexpr const char* PEN_BAKUMON_FQNAME = PEN_BAKUMON_FQNAME_ARR; + inline static constexpr size_t PEN_BAKUMON_FQNAME_LEN = sizeof(PEN_BAKUMON_FQNAME_ARR)-1; + inline static constexpr int PEN_BAKUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_BAKUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_BAKUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_BAKUMON_ANIM_INDEX = 5; + + // Name: Big Mamemon + inline static constexpr char PEN_BIG_MAMEMON_FQID_ARR[] = "pen:big_mamemon"; + inline static constexpr const char* PEN_BIG_MAMEMON_FQID = PEN_BIG_MAMEMON_FQID_ARR; + inline static constexpr size_t PEN_BIG_MAMEMON_FQID_LEN = sizeof(PEN_BIG_MAMEMON_FQID_ARR)-1; + inline static constexpr char PEN_BIG_MAMEMON_ID_ARR[] = "big_mamemon"; + inline static constexpr const char* PEN_BIG_MAMEMON_ID = PEN_BIG_MAMEMON_ID_ARR; + inline static constexpr size_t PEN_BIG_MAMEMON_ID_LEN = sizeof(PEN_BIG_MAMEMON_ID)-1; + inline static constexpr char PEN_BIG_MAMEMON_NAME_ARR[] = "Big Mamemon"; + inline static constexpr const char* PEN_BIG_MAMEMON_NAME = PEN_BIG_MAMEMON_NAME_ARR; + inline static constexpr size_t PEN_BIG_MAMEMON_NAME_LEN = sizeof(PEN_BIG_MAMEMON_NAME_ARR)-1; + inline static constexpr char PEN_BIG_MAMEMON_FQNAME_ARR[] = "pen:Big Mamemon"; + inline static constexpr const char* PEN_BIG_MAMEMON_FQNAME = PEN_BIG_MAMEMON_FQNAME_ARR; + inline static constexpr size_t PEN_BIG_MAMEMON_FQNAME_LEN = sizeof(PEN_BIG_MAMEMON_FQNAME_ARR)-1; + inline static constexpr int PEN_BIG_MAMEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_BIG_MAMEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_BIG_MAMEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_BIG_MAMEMON_ANIM_INDEX = 6; + + // Name: Blossomon + inline static constexpr char PEN_BLOSSOMON_FQID_ARR[] = "pen:blossomon"; + inline static constexpr const char* PEN_BLOSSOMON_FQID = PEN_BLOSSOMON_FQID_ARR; + inline static constexpr size_t PEN_BLOSSOMON_FQID_LEN = sizeof(PEN_BLOSSOMON_FQID_ARR)-1; + inline static constexpr char PEN_BLOSSOMON_ID_ARR[] = "blossomon"; + inline static constexpr const char* PEN_BLOSSOMON_ID = PEN_BLOSSOMON_ID_ARR; + inline static constexpr size_t PEN_BLOSSOMON_ID_LEN = sizeof(PEN_BLOSSOMON_ID)-1; + inline static constexpr char PEN_BLOSSOMON_NAME_ARR[] = "Blossomon"; + inline static constexpr const char* PEN_BLOSSOMON_NAME = PEN_BLOSSOMON_NAME_ARR; + inline static constexpr size_t PEN_BLOSSOMON_NAME_LEN = sizeof(PEN_BLOSSOMON_NAME_ARR)-1; + inline static constexpr char PEN_BLOSSOMON_FQNAME_ARR[] = "pen:Blossomon"; + inline static constexpr const char* PEN_BLOSSOMON_FQNAME = PEN_BLOSSOMON_FQNAME_ARR; + inline static constexpr size_t PEN_BLOSSOMON_FQNAME_LEN = sizeof(PEN_BLOSSOMON_FQNAME_ARR)-1; + inline static constexpr int PEN_BLOSSOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_BLOSSOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_BLOSSOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_BLOSSOMON_ANIM_INDEX = 7; + + // Name: Boltmon + inline static constexpr char PEN_BOLTMON_FQID_ARR[] = "pen:boltmon"; + inline static constexpr const char* PEN_BOLTMON_FQID = PEN_BOLTMON_FQID_ARR; + inline static constexpr size_t PEN_BOLTMON_FQID_LEN = sizeof(PEN_BOLTMON_FQID_ARR)-1; + inline static constexpr char PEN_BOLTMON_ID_ARR[] = "boltmon"; + inline static constexpr const char* PEN_BOLTMON_ID = PEN_BOLTMON_ID_ARR; + inline static constexpr size_t PEN_BOLTMON_ID_LEN = sizeof(PEN_BOLTMON_ID)-1; + inline static constexpr char PEN_BOLTMON_NAME_ARR[] = "Boltmon"; + inline static constexpr const char* PEN_BOLTMON_NAME = PEN_BOLTMON_NAME_ARR; + inline static constexpr size_t PEN_BOLTMON_NAME_LEN = sizeof(PEN_BOLTMON_NAME_ARR)-1; + inline static constexpr char PEN_BOLTMON_FQNAME_ARR[] = "pen:Boltmon"; + inline static constexpr const char* PEN_BOLTMON_FQNAME = PEN_BOLTMON_FQNAME_ARR; + inline static constexpr size_t PEN_BOLTMON_FQNAME_LEN = sizeof(PEN_BOLTMON_FQNAME_ARR)-1; + inline static constexpr int PEN_BOLTMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_BOLTMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_BOLTMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_BOLTMON_ANIM_INDEX = 8; + + // Name: Bubbmon + inline static constexpr char PEN_BUBBMON_FQID_ARR[] = "pen:bubbmon"; + inline static constexpr const char* PEN_BUBBMON_FQID = PEN_BUBBMON_FQID_ARR; + inline static constexpr size_t PEN_BUBBMON_FQID_LEN = sizeof(PEN_BUBBMON_FQID_ARR)-1; + inline static constexpr char PEN_BUBBMON_ID_ARR[] = "bubbmon"; + inline static constexpr const char* PEN_BUBBMON_ID = PEN_BUBBMON_ID_ARR; + inline static constexpr size_t PEN_BUBBMON_ID_LEN = sizeof(PEN_BUBBMON_ID)-1; + inline static constexpr char PEN_BUBBMON_NAME_ARR[] = "Bubbmon"; + inline static constexpr const char* PEN_BUBBMON_NAME = PEN_BUBBMON_NAME_ARR; + inline static constexpr size_t PEN_BUBBMON_NAME_LEN = sizeof(PEN_BUBBMON_NAME_ARR)-1; + inline static constexpr char PEN_BUBBMON_FQNAME_ARR[] = "pen:Bubbmon"; + inline static constexpr const char* PEN_BUBBMON_FQNAME = PEN_BUBBMON_FQNAME_ARR; + inline static constexpr size_t PEN_BUBBMON_FQNAME_LEN = sizeof(PEN_BUBBMON_FQNAME_ARR)-1; + inline static constexpr int PEN_BUBBMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_BUBBMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_BUBBMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_BUBBMON_ANIM_INDEX = 9; + + // Name: Candmon + inline static constexpr char PEN_CANDMON_FQID_ARR[] = "pen:candmon"; + inline static constexpr const char* PEN_CANDMON_FQID = PEN_CANDMON_FQID_ARR; + inline static constexpr size_t PEN_CANDMON_FQID_LEN = sizeof(PEN_CANDMON_FQID_ARR)-1; + inline static constexpr char PEN_CANDMON_ID_ARR[] = "candmon"; + inline static constexpr const char* PEN_CANDMON_ID = PEN_CANDMON_ID_ARR; + inline static constexpr size_t PEN_CANDMON_ID_LEN = sizeof(PEN_CANDMON_ID)-1; + inline static constexpr char PEN_CANDMON_NAME_ARR[] = "Candmon"; + inline static constexpr const char* PEN_CANDMON_NAME = PEN_CANDMON_NAME_ARR; + inline static constexpr size_t PEN_CANDMON_NAME_LEN = sizeof(PEN_CANDMON_NAME_ARR)-1; + inline static constexpr char PEN_CANDMON_FQNAME_ARR[] = "pen:Candmon"; + inline static constexpr const char* PEN_CANDMON_FQNAME = PEN_CANDMON_FQNAME_ARR; + inline static constexpr size_t PEN_CANDMON_FQNAME_LEN = sizeof(PEN_CANDMON_FQNAME_ARR)-1; + inline static constexpr int PEN_CANDMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_CANDMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_CANDMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_CANDMON_ANIM_INDEX = 10; + + // Name: Caprimon + inline static constexpr char PEN_CAPRIMON_FQID_ARR[] = "pen:caprimon"; + inline static constexpr const char* PEN_CAPRIMON_FQID = PEN_CAPRIMON_FQID_ARR; + inline static constexpr size_t PEN_CAPRIMON_FQID_LEN = sizeof(PEN_CAPRIMON_FQID_ARR)-1; + inline static constexpr char PEN_CAPRIMON_ID_ARR[] = "caprimon"; + inline static constexpr const char* PEN_CAPRIMON_ID = PEN_CAPRIMON_ID_ARR; + inline static constexpr size_t PEN_CAPRIMON_ID_LEN = sizeof(PEN_CAPRIMON_ID)-1; + inline static constexpr char PEN_CAPRIMON_NAME_ARR[] = "Caprimon"; + inline static constexpr const char* PEN_CAPRIMON_NAME = PEN_CAPRIMON_NAME_ARR; + inline static constexpr size_t PEN_CAPRIMON_NAME_LEN = sizeof(PEN_CAPRIMON_NAME_ARR)-1; + inline static constexpr char PEN_CAPRIMON_FQNAME_ARR[] = "pen:Caprimon"; + inline static constexpr const char* PEN_CAPRIMON_FQNAME = PEN_CAPRIMON_FQNAME_ARR; + inline static constexpr size_t PEN_CAPRIMON_FQNAME_LEN = sizeof(PEN_CAPRIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_CAPRIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_CAPRIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_CAPRIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_CAPRIMON_ANIM_INDEX = 11; + + // Name: Choromon + inline static constexpr char PEN_CHOROMON_FQID_ARR[] = "pen:choromon"; + inline static constexpr const char* PEN_CHOROMON_FQID = PEN_CHOROMON_FQID_ARR; + inline static constexpr size_t PEN_CHOROMON_FQID_LEN = sizeof(PEN_CHOROMON_FQID_ARR)-1; + inline static constexpr char PEN_CHOROMON_ID_ARR[] = "choromon"; + inline static constexpr const char* PEN_CHOROMON_ID = PEN_CHOROMON_ID_ARR; + inline static constexpr size_t PEN_CHOROMON_ID_LEN = sizeof(PEN_CHOROMON_ID)-1; + inline static constexpr char PEN_CHOROMON_NAME_ARR[] = "Choromon"; + inline static constexpr const char* PEN_CHOROMON_NAME = PEN_CHOROMON_NAME_ARR; + inline static constexpr size_t PEN_CHOROMON_NAME_LEN = sizeof(PEN_CHOROMON_NAME_ARR)-1; + inline static constexpr char PEN_CHOROMON_FQNAME_ARR[] = "pen:Choromon"; + inline static constexpr const char* PEN_CHOROMON_FQNAME = PEN_CHOROMON_FQNAME_ARR; + inline static constexpr size_t PEN_CHOROMON_FQNAME_LEN = sizeof(PEN_CHOROMON_FQNAME_ARR)-1; + inline static constexpr int PEN_CHOROMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_CHOROMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_CHOROMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_CHOROMON_ANIM_INDEX = 12; + + // Name: Clockmon + inline static constexpr char PEN_CLOCKMON_FQID_ARR[] = "pen:clockmon"; + inline static constexpr const char* PEN_CLOCKMON_FQID = PEN_CLOCKMON_FQID_ARR; + inline static constexpr size_t PEN_CLOCKMON_FQID_LEN = sizeof(PEN_CLOCKMON_FQID_ARR)-1; + inline static constexpr char PEN_CLOCKMON_ID_ARR[] = "clockmon"; + inline static constexpr const char* PEN_CLOCKMON_ID = PEN_CLOCKMON_ID_ARR; + inline static constexpr size_t PEN_CLOCKMON_ID_LEN = sizeof(PEN_CLOCKMON_ID)-1; + inline static constexpr char PEN_CLOCKMON_NAME_ARR[] = "Clockmon"; + inline static constexpr const char* PEN_CLOCKMON_NAME = PEN_CLOCKMON_NAME_ARR; + inline static constexpr size_t PEN_CLOCKMON_NAME_LEN = sizeof(PEN_CLOCKMON_NAME_ARR)-1; + inline static constexpr char PEN_CLOCKMON_FQNAME_ARR[] = "pen:Clockmon"; + inline static constexpr const char* PEN_CLOCKMON_FQNAME = PEN_CLOCKMON_FQNAME_ARR; + inline static constexpr size_t PEN_CLOCKMON_FQNAME_LEN = sizeof(PEN_CLOCKMON_FQNAME_ARR)-1; + inline static constexpr int PEN_CLOCKMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_CLOCKMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_CLOCKMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_CLOCKMON_ANIM_INDEX = 13; + + // Name: Cyberdramon + inline static constexpr char PEN_CYBERDRAMON_FQID_ARR[] = "pen:cyberdramon"; + inline static constexpr const char* PEN_CYBERDRAMON_FQID = PEN_CYBERDRAMON_FQID_ARR; + inline static constexpr size_t PEN_CYBERDRAMON_FQID_LEN = sizeof(PEN_CYBERDRAMON_FQID_ARR)-1; + inline static constexpr char PEN_CYBERDRAMON_ID_ARR[] = "cyberdramon"; + inline static constexpr const char* PEN_CYBERDRAMON_ID = PEN_CYBERDRAMON_ID_ARR; + inline static constexpr size_t PEN_CYBERDRAMON_ID_LEN = sizeof(PEN_CYBERDRAMON_ID)-1; + inline static constexpr char PEN_CYBERDRAMON_NAME_ARR[] = "Cyberdramon"; + inline static constexpr const char* PEN_CYBERDRAMON_NAME = PEN_CYBERDRAMON_NAME_ARR; + inline static constexpr size_t PEN_CYBERDRAMON_NAME_LEN = sizeof(PEN_CYBERDRAMON_NAME_ARR)-1; + inline static constexpr char PEN_CYBERDRAMON_FQNAME_ARR[] = "pen:Cyberdramon"; + inline static constexpr const char* PEN_CYBERDRAMON_FQNAME = PEN_CYBERDRAMON_FQNAME_ARR; + inline static constexpr size_t PEN_CYBERDRAMON_FQNAME_LEN = sizeof(PEN_CYBERDRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_CYBERDRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_CYBERDRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_CYBERDRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_CYBERDRAMON_ANIM_INDEX = 14; + + // Name: Dagomon + inline static constexpr char PEN_DAGOMON_FQID_ARR[] = "pen:dagomon"; + inline static constexpr const char* PEN_DAGOMON_FQID = PEN_DAGOMON_FQID_ARR; + inline static constexpr size_t PEN_DAGOMON_FQID_LEN = sizeof(PEN_DAGOMON_FQID_ARR)-1; + inline static constexpr char PEN_DAGOMON_ID_ARR[] = "dagomon"; + inline static constexpr const char* PEN_DAGOMON_ID = PEN_DAGOMON_ID_ARR; + inline static constexpr size_t PEN_DAGOMON_ID_LEN = sizeof(PEN_DAGOMON_ID)-1; + inline static constexpr char PEN_DAGOMON_NAME_ARR[] = "Dagomon"; + inline static constexpr const char* PEN_DAGOMON_NAME = PEN_DAGOMON_NAME_ARR; + inline static constexpr size_t PEN_DAGOMON_NAME_LEN = sizeof(PEN_DAGOMON_NAME_ARR)-1; + inline static constexpr char PEN_DAGOMON_FQNAME_ARR[] = "pen:Dagomon"; + inline static constexpr const char* PEN_DAGOMON_FQNAME = PEN_DAGOMON_FQNAME_ARR; + inline static constexpr size_t PEN_DAGOMON_FQNAME_LEN = sizeof(PEN_DAGOMON_FQNAME_ARR)-1; + inline static constexpr int PEN_DAGOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_DAGOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_DAGOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_DAGOMON_ANIM_INDEX = 15; + + // Name: Death Meramon + inline static constexpr char PEN_DEATH_MERAMON_FQID_ARR[] = "pen:death_meramon"; + inline static constexpr const char* PEN_DEATH_MERAMON_FQID = PEN_DEATH_MERAMON_FQID_ARR; + inline static constexpr size_t PEN_DEATH_MERAMON_FQID_LEN = sizeof(PEN_DEATH_MERAMON_FQID_ARR)-1; + inline static constexpr char PEN_DEATH_MERAMON_ID_ARR[] = "death_meramon"; + inline static constexpr const char* PEN_DEATH_MERAMON_ID = PEN_DEATH_MERAMON_ID_ARR; + inline static constexpr size_t PEN_DEATH_MERAMON_ID_LEN = sizeof(PEN_DEATH_MERAMON_ID)-1; + inline static constexpr char PEN_DEATH_MERAMON_NAME_ARR[] = "Death Meramon"; + inline static constexpr const char* PEN_DEATH_MERAMON_NAME = PEN_DEATH_MERAMON_NAME_ARR; + inline static constexpr size_t PEN_DEATH_MERAMON_NAME_LEN = sizeof(PEN_DEATH_MERAMON_NAME_ARR)-1; + inline static constexpr char PEN_DEATH_MERAMON_FQNAME_ARR[] = "pen:Death Meramon"; + inline static constexpr const char* PEN_DEATH_MERAMON_FQNAME = PEN_DEATH_MERAMON_FQNAME_ARR; + inline static constexpr size_t PEN_DEATH_MERAMON_FQNAME_LEN = sizeof(PEN_DEATH_MERAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_DEATH_MERAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_DEATH_MERAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_DEATH_MERAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_DEATH_MERAMON_ANIM_INDEX = 16; + + // Name: Delumon + inline static constexpr char PEN_DELUMON_FQID_ARR[] = "pen:delumon"; + inline static constexpr const char* PEN_DELUMON_FQID = PEN_DELUMON_FQID_ARR; + inline static constexpr size_t PEN_DELUMON_FQID_LEN = sizeof(PEN_DELUMON_FQID_ARR)-1; + inline static constexpr char PEN_DELUMON_ID_ARR[] = "delumon"; + inline static constexpr const char* PEN_DELUMON_ID = PEN_DELUMON_ID_ARR; + inline static constexpr size_t PEN_DELUMON_ID_LEN = sizeof(PEN_DELUMON_ID)-1; + inline static constexpr char PEN_DELUMON_NAME_ARR[] = "Delumon"; + inline static constexpr const char* PEN_DELUMON_NAME = PEN_DELUMON_NAME_ARR; + inline static constexpr size_t PEN_DELUMON_NAME_LEN = sizeof(PEN_DELUMON_NAME_ARR)-1; + inline static constexpr char PEN_DELUMON_FQNAME_ARR[] = "pen:Delumon"; + inline static constexpr const char* PEN_DELUMON_FQNAME = PEN_DELUMON_FQNAME_ARR; + inline static constexpr size_t PEN_DELUMON_FQNAME_LEN = sizeof(PEN_DELUMON_FQNAME_ARR)-1; + inline static constexpr int PEN_DELUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_DELUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_DELUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_DELUMON_ANIM_INDEX = 17; + + // Name: Dokugumon + inline static constexpr char PEN_DOKUGUMON_FQID_ARR[] = "pen:dokugumon"; + inline static constexpr const char* PEN_DOKUGUMON_FQID = PEN_DOKUGUMON_FQID_ARR; + inline static constexpr size_t PEN_DOKUGUMON_FQID_LEN = sizeof(PEN_DOKUGUMON_FQID_ARR)-1; + inline static constexpr char PEN_DOKUGUMON_ID_ARR[] = "dokugumon"; + inline static constexpr const char* PEN_DOKUGUMON_ID = PEN_DOKUGUMON_ID_ARR; + inline static constexpr size_t PEN_DOKUGUMON_ID_LEN = sizeof(PEN_DOKUGUMON_ID)-1; + inline static constexpr char PEN_DOKUGUMON_NAME_ARR[] = "Dokugumon"; + inline static constexpr const char* PEN_DOKUGUMON_NAME = PEN_DOKUGUMON_NAME_ARR; + inline static constexpr size_t PEN_DOKUGUMON_NAME_LEN = sizeof(PEN_DOKUGUMON_NAME_ARR)-1; + inline static constexpr char PEN_DOKUGUMON_FQNAME_ARR[] = "pen:Dokugumon"; + inline static constexpr const char* PEN_DOKUGUMON_FQNAME = PEN_DOKUGUMON_FQNAME_ARR; + inline static constexpr size_t PEN_DOKUGUMON_FQNAME_LEN = sizeof(PEN_DOKUGUMON_FQNAME_ARR)-1; + inline static constexpr int PEN_DOKUGUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_DOKUGUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_DOKUGUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_DOKUGUMON_ANIM_INDEX = 18; + + // Name: Ebidramon + inline static constexpr char PEN_EBIDRAMON_FQID_ARR[] = "pen:ebidramon"; + inline static constexpr const char* PEN_EBIDRAMON_FQID = PEN_EBIDRAMON_FQID_ARR; + inline static constexpr size_t PEN_EBIDRAMON_FQID_LEN = sizeof(PEN_EBIDRAMON_FQID_ARR)-1; + inline static constexpr char PEN_EBIDRAMON_ID_ARR[] = "ebidramon"; + inline static constexpr const char* PEN_EBIDRAMON_ID = PEN_EBIDRAMON_ID_ARR; + inline static constexpr size_t PEN_EBIDRAMON_ID_LEN = sizeof(PEN_EBIDRAMON_ID)-1; + inline static constexpr char PEN_EBIDRAMON_NAME_ARR[] = "Ebidramon"; + inline static constexpr const char* PEN_EBIDRAMON_NAME = PEN_EBIDRAMON_NAME_ARR; + inline static constexpr size_t PEN_EBIDRAMON_NAME_LEN = sizeof(PEN_EBIDRAMON_NAME_ARR)-1; + inline static constexpr char PEN_EBIDRAMON_FQNAME_ARR[] = "pen:Ebidramon"; + inline static constexpr const char* PEN_EBIDRAMON_FQNAME = PEN_EBIDRAMON_FQNAME_ARR; + inline static constexpr size_t PEN_EBIDRAMON_FQNAME_LEN = sizeof(PEN_EBIDRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_EBIDRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_EBIDRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_EBIDRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_EBIDRAMON_ANIM_INDEX = 19; + + // Name: Fantomon + inline static constexpr char PEN_FANTOMON_FQID_ARR[] = "pen:fantomon"; + inline static constexpr const char* PEN_FANTOMON_FQID = PEN_FANTOMON_FQID_ARR; + inline static constexpr size_t PEN_FANTOMON_FQID_LEN = sizeof(PEN_FANTOMON_FQID_ARR)-1; + inline static constexpr char PEN_FANTOMON_ID_ARR[] = "fantomon"; + inline static constexpr const char* PEN_FANTOMON_ID = PEN_FANTOMON_ID_ARR; + inline static constexpr size_t PEN_FANTOMON_ID_LEN = sizeof(PEN_FANTOMON_ID)-1; + inline static constexpr char PEN_FANTOMON_NAME_ARR[] = "Fantomon"; + inline static constexpr const char* PEN_FANTOMON_NAME = PEN_FANTOMON_NAME_ARR; + inline static constexpr size_t PEN_FANTOMON_NAME_LEN = sizeof(PEN_FANTOMON_NAME_ARR)-1; + inline static constexpr char PEN_FANTOMON_FQNAME_ARR[] = "pen:Fantomon"; + inline static constexpr const char* PEN_FANTOMON_FQNAME = PEN_FANTOMON_FQNAME_ARR; + inline static constexpr size_t PEN_FANTOMON_FQNAME_LEN = sizeof(PEN_FANTOMON_FQNAME_ARR)-1; + inline static constexpr int PEN_FANTOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_FANTOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_FANTOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_FANTOMON_ANIM_INDEX = 20; + + // Name: Floramon + inline static constexpr char PEN_FLORAMON_FQID_ARR[] = "pen:floramon"; + inline static constexpr const char* PEN_FLORAMON_FQID = PEN_FLORAMON_FQID_ARR; + inline static constexpr size_t PEN_FLORAMON_FQID_LEN = sizeof(PEN_FLORAMON_FQID_ARR)-1; + inline static constexpr char PEN_FLORAMON_ID_ARR[] = "floramon"; + inline static constexpr const char* PEN_FLORAMON_ID = PEN_FLORAMON_ID_ARR; + inline static constexpr size_t PEN_FLORAMON_ID_LEN = sizeof(PEN_FLORAMON_ID)-1; + inline static constexpr char PEN_FLORAMON_NAME_ARR[] = "Floramon"; + inline static constexpr const char* PEN_FLORAMON_NAME = PEN_FLORAMON_NAME_ARR; + inline static constexpr size_t PEN_FLORAMON_NAME_LEN = sizeof(PEN_FLORAMON_NAME_ARR)-1; + inline static constexpr char PEN_FLORAMON_FQNAME_ARR[] = "pen:Floramon"; + inline static constexpr const char* PEN_FLORAMON_FQNAME = PEN_FLORAMON_FQNAME_ARR; + inline static constexpr size_t PEN_FLORAMON_FQNAME_LEN = sizeof(PEN_FLORAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_FLORAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_FLORAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_FLORAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_FLORAMON_ANIM_INDEX = 21; + + // Name: Ganimon + inline static constexpr char PEN_GANIMON_FQID_ARR[] = "pen:ganimon"; + inline static constexpr const char* PEN_GANIMON_FQID = PEN_GANIMON_FQID_ARR; + inline static constexpr size_t PEN_GANIMON_FQID_LEN = sizeof(PEN_GANIMON_FQID_ARR)-1; + inline static constexpr char PEN_GANIMON_ID_ARR[] = "ganimon"; + inline static constexpr const char* PEN_GANIMON_ID = PEN_GANIMON_ID_ARR; + inline static constexpr size_t PEN_GANIMON_ID_LEN = sizeof(PEN_GANIMON_ID)-1; + inline static constexpr char PEN_GANIMON_NAME_ARR[] = "Ganimon"; + inline static constexpr const char* PEN_GANIMON_NAME = PEN_GANIMON_NAME_ARR; + inline static constexpr size_t PEN_GANIMON_NAME_LEN = sizeof(PEN_GANIMON_NAME_ARR)-1; + inline static constexpr char PEN_GANIMON_FQNAME_ARR[] = "pen:Ganimon"; + inline static constexpr const char* PEN_GANIMON_FQNAME = PEN_GANIMON_FQNAME_ARR; + inline static constexpr size_t PEN_GANIMON_FQNAME_LEN = sizeof(PEN_GANIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_GANIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_GANIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_GANIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_GANIMON_ANIM_INDEX = 22; + + // Name: Garudamon + inline static constexpr char PEN_GARUDAMON_FQID_ARR[] = "pen:garudamon"; + inline static constexpr const char* PEN_GARUDAMON_FQID = PEN_GARUDAMON_FQID_ARR; + inline static constexpr size_t PEN_GARUDAMON_FQID_LEN = sizeof(PEN_GARUDAMON_FQID_ARR)-1; + inline static constexpr char PEN_GARUDAMON_ID_ARR[] = "garudamon"; + inline static constexpr const char* PEN_GARUDAMON_ID = PEN_GARUDAMON_ID_ARR; + inline static constexpr size_t PEN_GARUDAMON_ID_LEN = sizeof(PEN_GARUDAMON_ID)-1; + inline static constexpr char PEN_GARUDAMON_NAME_ARR[] = "Garudamon"; + inline static constexpr const char* PEN_GARUDAMON_NAME = PEN_GARUDAMON_NAME_ARR; + inline static constexpr size_t PEN_GARUDAMON_NAME_LEN = sizeof(PEN_GARUDAMON_NAME_ARR)-1; + inline static constexpr char PEN_GARUDAMON_FQNAME_ARR[] = "pen:Garudamon"; + inline static constexpr const char* PEN_GARUDAMON_FQNAME = PEN_GARUDAMON_FQNAME_ARR; + inline static constexpr size_t PEN_GARUDAMON_FQNAME_LEN = sizeof(PEN_GARUDAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_GARUDAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_GARUDAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_GARUDAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_GARUDAMON_ANIM_INDEX = 23; + + // Name: Gekomon + inline static constexpr char PEN_GEKOMON_FQID_ARR[] = "pen:gekomon"; + inline static constexpr const char* PEN_GEKOMON_FQID = PEN_GEKOMON_FQID_ARR; + inline static constexpr size_t PEN_GEKOMON_FQID_LEN = sizeof(PEN_GEKOMON_FQID_ARR)-1; + inline static constexpr char PEN_GEKOMON_ID_ARR[] = "gekomon"; + inline static constexpr const char* PEN_GEKOMON_ID = PEN_GEKOMON_ID_ARR; + inline static constexpr size_t PEN_GEKOMON_ID_LEN = sizeof(PEN_GEKOMON_ID)-1; + inline static constexpr char PEN_GEKOMON_NAME_ARR[] = "Gekomon"; + inline static constexpr const char* PEN_GEKOMON_NAME = PEN_GEKOMON_NAME_ARR; + inline static constexpr size_t PEN_GEKOMON_NAME_LEN = sizeof(PEN_GEKOMON_NAME_ARR)-1; + inline static constexpr char PEN_GEKOMON_FQNAME_ARR[] = "pen:Gekomon"; + inline static constexpr const char* PEN_GEKOMON_FQNAME = PEN_GEKOMON_FQNAME_ARR; + inline static constexpr size_t PEN_GEKOMON_FQNAME_LEN = sizeof(PEN_GEKOMON_FQNAME_ARR)-1; + inline static constexpr int PEN_GEKOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_GEKOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_GEKOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_GEKOMON_ANIM_INDEX = 24; + + // Name: Gerbemon + inline static constexpr char PEN_GERBEMON_FQID_ARR[] = "pen:gerbemon"; + inline static constexpr const char* PEN_GERBEMON_FQID = PEN_GERBEMON_FQID_ARR; + inline static constexpr size_t PEN_GERBEMON_FQID_LEN = sizeof(PEN_GERBEMON_FQID_ARR)-1; + inline static constexpr char PEN_GERBEMON_ID_ARR[] = "gerbemon"; + inline static constexpr const char* PEN_GERBEMON_ID = PEN_GERBEMON_ID_ARR; + inline static constexpr size_t PEN_GERBEMON_ID_LEN = sizeof(PEN_GERBEMON_ID)-1; + inline static constexpr char PEN_GERBEMON_NAME_ARR[] = "Gerbemon"; + inline static constexpr const char* PEN_GERBEMON_NAME = PEN_GERBEMON_NAME_ARR; + inline static constexpr size_t PEN_GERBEMON_NAME_LEN = sizeof(PEN_GERBEMON_NAME_ARR)-1; + inline static constexpr char PEN_GERBEMON_FQNAME_ARR[] = "pen:Gerbemon"; + inline static constexpr const char* PEN_GERBEMON_FQNAME = PEN_GERBEMON_FQNAME_ARR; + inline static constexpr size_t PEN_GERBEMON_FQNAME_LEN = sizeof(PEN_GERBEMON_FQNAME_ARR)-1; + inline static constexpr int PEN_GERBEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_GERBEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_GERBEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_GERBEMON_ANIM_INDEX = 25; + + // Name: Gesomon + inline static constexpr char PEN_GESOMON_FQID_ARR[] = "pen:gesomon"; + inline static constexpr const char* PEN_GESOMON_FQID = PEN_GESOMON_FQID_ARR; + inline static constexpr size_t PEN_GESOMON_FQID_LEN = sizeof(PEN_GESOMON_FQID_ARR)-1; + inline static constexpr char PEN_GESOMON_ID_ARR[] = "gesomon"; + inline static constexpr const char* PEN_GESOMON_ID = PEN_GESOMON_ID_ARR; + inline static constexpr size_t PEN_GESOMON_ID_LEN = sizeof(PEN_GESOMON_ID)-1; + inline static constexpr char PEN_GESOMON_NAME_ARR[] = "Gesomon"; + inline static constexpr const char* PEN_GESOMON_NAME = PEN_GESOMON_NAME_ARR; + inline static constexpr size_t PEN_GESOMON_NAME_LEN = sizeof(PEN_GESOMON_NAME_ARR)-1; + inline static constexpr char PEN_GESOMON_FQNAME_ARR[] = "pen:Gesomon"; + inline static constexpr const char* PEN_GESOMON_FQNAME = PEN_GESOMON_FQNAME_ARR; + inline static constexpr size_t PEN_GESOMON_FQNAME_LEN = sizeof(PEN_GESOMON_FQNAME_ARR)-1; + inline static constexpr int PEN_GESOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_GESOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_GESOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_GESOMON_ANIM_INDEX = 26; + + // Name: Gomamon + inline static constexpr char PEN_GOMAMON_FQID_ARR[] = "pen:gomamon"; + inline static constexpr const char* PEN_GOMAMON_FQID = PEN_GOMAMON_FQID_ARR; + inline static constexpr size_t PEN_GOMAMON_FQID_LEN = sizeof(PEN_GOMAMON_FQID_ARR)-1; + inline static constexpr char PEN_GOMAMON_ID_ARR[] = "gomamon"; + inline static constexpr const char* PEN_GOMAMON_ID = PEN_GOMAMON_ID_ARR; + inline static constexpr size_t PEN_GOMAMON_ID_LEN = sizeof(PEN_GOMAMON_ID)-1; + inline static constexpr char PEN_GOMAMON_NAME_ARR[] = "Gomamon"; + inline static constexpr const char* PEN_GOMAMON_NAME = PEN_GOMAMON_NAME_ARR; + inline static constexpr size_t PEN_GOMAMON_NAME_LEN = sizeof(PEN_GOMAMON_NAME_ARR)-1; + inline static constexpr char PEN_GOMAMON_FQNAME_ARR[] = "pen:Gomamon"; + inline static constexpr const char* PEN_GOMAMON_FQNAME = PEN_GOMAMON_FQNAME_ARR; + inline static constexpr size_t PEN_GOMAMON_FQNAME_LEN = sizeof(PEN_GOMAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_GOMAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_GOMAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_GOMAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_GOMAMON_ANIM_INDEX = 27; + + // Name: Gottsumon + inline static constexpr char PEN_GOTTSUMON_FQID_ARR[] = "pen:gottsumon"; + inline static constexpr const char* PEN_GOTTSUMON_FQID = PEN_GOTTSUMON_FQID_ARR; + inline static constexpr size_t PEN_GOTTSUMON_FQID_LEN = sizeof(PEN_GOTTSUMON_FQID_ARR)-1; + inline static constexpr char PEN_GOTTSUMON_ID_ARR[] = "gottsumon"; + inline static constexpr const char* PEN_GOTTSUMON_ID = PEN_GOTTSUMON_ID_ARR; + inline static constexpr size_t PEN_GOTTSUMON_ID_LEN = sizeof(PEN_GOTTSUMON_ID)-1; + inline static constexpr char PEN_GOTTSUMON_NAME_ARR[] = "Gottsumon"; + inline static constexpr const char* PEN_GOTTSUMON_NAME = PEN_GOTTSUMON_NAME_ARR; + inline static constexpr size_t PEN_GOTTSUMON_NAME_LEN = sizeof(PEN_GOTTSUMON_NAME_ARR)-1; + inline static constexpr char PEN_GOTTSUMON_FQNAME_ARR[] = "pen:Gottsumon"; + inline static constexpr const char* PEN_GOTTSUMON_FQNAME = PEN_GOTTSUMON_FQNAME_ARR; + inline static constexpr size_t PEN_GOTTSUMON_FQNAME_LEN = sizeof(PEN_GOTTSUMON_FQNAME_ARR)-1; + inline static constexpr int PEN_GOTTSUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_GOTTSUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_GOTTSUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_GOTTSUMON_ANIM_INDEX = 28; + + // Name: Griffomon + inline static constexpr char PEN_GRIFFOMON_FQID_ARR[] = "pen:griffomon"; + inline static constexpr const char* PEN_GRIFFOMON_FQID = PEN_GRIFFOMON_FQID_ARR; + inline static constexpr size_t PEN_GRIFFOMON_FQID_LEN = sizeof(PEN_GRIFFOMON_FQID_ARR)-1; + inline static constexpr char PEN_GRIFFOMON_ID_ARR[] = "griffomon"; + inline static constexpr const char* PEN_GRIFFOMON_ID = PEN_GRIFFOMON_ID_ARR; + inline static constexpr size_t PEN_GRIFFOMON_ID_LEN = sizeof(PEN_GRIFFOMON_ID)-1; + inline static constexpr char PEN_GRIFFOMON_NAME_ARR[] = "Griffomon"; + inline static constexpr const char* PEN_GRIFFOMON_NAME = PEN_GRIFFOMON_NAME_ARR; + inline static constexpr size_t PEN_GRIFFOMON_NAME_LEN = sizeof(PEN_GRIFFOMON_NAME_ARR)-1; + inline static constexpr char PEN_GRIFFOMON_FQNAME_ARR[] = "pen:Griffomon"; + inline static constexpr const char* PEN_GRIFFOMON_FQNAME = PEN_GRIFFOMON_FQNAME_ARR; + inline static constexpr size_t PEN_GRIFFOMON_FQNAME_LEN = sizeof(PEN_GRIFFOMON_FQNAME_ARR)-1; + inline static constexpr int PEN_GRIFFOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_GRIFFOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_GRIFFOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_GRIFFOMON_ANIM_INDEX = 29; + + // Name: Guardromon + inline static constexpr char PEN_GUARDROMON_FQID_ARR[] = "pen:guardromon"; + inline static constexpr const char* PEN_GUARDROMON_FQID = PEN_GUARDROMON_FQID_ARR; + inline static constexpr size_t PEN_GUARDROMON_FQID_LEN = sizeof(PEN_GUARDROMON_FQID_ARR)-1; + inline static constexpr char PEN_GUARDROMON_ID_ARR[] = "guardromon"; + inline static constexpr const char* PEN_GUARDROMON_ID = PEN_GUARDROMON_ID_ARR; + inline static constexpr size_t PEN_GUARDROMON_ID_LEN = sizeof(PEN_GUARDROMON_ID)-1; + inline static constexpr char PEN_GUARDROMON_NAME_ARR[] = "Guardromon"; + inline static constexpr const char* PEN_GUARDROMON_NAME = PEN_GUARDROMON_NAME_ARR; + inline static constexpr size_t PEN_GUARDROMON_NAME_LEN = sizeof(PEN_GUARDROMON_NAME_ARR)-1; + inline static constexpr char PEN_GUARDROMON_FQNAME_ARR[] = "pen:Guardromon"; + inline static constexpr const char* PEN_GUARDROMON_FQNAME = PEN_GUARDROMON_FQNAME_ARR; + inline static constexpr size_t PEN_GUARDROMON_FQNAME_LEN = sizeof(PEN_GUARDROMON_FQNAME_ARR)-1; + inline static constexpr int PEN_GUARDROMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_GUARDROMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_GUARDROMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_GUARDROMON_ANIM_INDEX = 30; + + // Name: Hagurumon + inline static constexpr char PEN_HAGURUMON_FQID_ARR[] = "pen:hagurumon"; + inline static constexpr const char* PEN_HAGURUMON_FQID = PEN_HAGURUMON_FQID_ARR; + inline static constexpr size_t PEN_HAGURUMON_FQID_LEN = sizeof(PEN_HAGURUMON_FQID_ARR)-1; + inline static constexpr char PEN_HAGURUMON_ID_ARR[] = "hagurumon"; + inline static constexpr const char* PEN_HAGURUMON_ID = PEN_HAGURUMON_ID_ARR; + inline static constexpr size_t PEN_HAGURUMON_ID_LEN = sizeof(PEN_HAGURUMON_ID)-1; + inline static constexpr char PEN_HAGURUMON_NAME_ARR[] = "Hagurumon"; + inline static constexpr const char* PEN_HAGURUMON_NAME = PEN_HAGURUMON_NAME_ARR; + inline static constexpr size_t PEN_HAGURUMON_NAME_LEN = sizeof(PEN_HAGURUMON_NAME_ARR)-1; + inline static constexpr char PEN_HAGURUMON_FQNAME_ARR[] = "pen:Hagurumon"; + inline static constexpr const char* PEN_HAGURUMON_FQNAME = PEN_HAGURUMON_FQNAME_ARR; + inline static constexpr size_t PEN_HAGURUMON_FQNAME_LEN = sizeof(PEN_HAGURUMON_FQNAME_ARR)-1; + inline static constexpr int PEN_HAGURUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_HAGURUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_HAGURUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_HAGURUMON_ANIM_INDEX = 31; + + // Name: Hangymon + inline static constexpr char PEN_HANGYMON_FQID_ARR[] = "pen:hangymon"; + inline static constexpr const char* PEN_HANGYMON_FQID = PEN_HANGYMON_FQID_ARR; + inline static constexpr size_t PEN_HANGYMON_FQID_LEN = sizeof(PEN_HANGYMON_FQID_ARR)-1; + inline static constexpr char PEN_HANGYMON_ID_ARR[] = "hangymon"; + inline static constexpr const char* PEN_HANGYMON_ID = PEN_HANGYMON_ID_ARR; + inline static constexpr size_t PEN_HANGYMON_ID_LEN = sizeof(PEN_HANGYMON_ID)-1; + inline static constexpr char PEN_HANGYMON_NAME_ARR[] = "Hangymon"; + inline static constexpr const char* PEN_HANGYMON_NAME = PEN_HANGYMON_NAME_ARR; + inline static constexpr size_t PEN_HANGYMON_NAME_LEN = sizeof(PEN_HANGYMON_NAME_ARR)-1; + inline static constexpr char PEN_HANGYMON_FQNAME_ARR[] = "pen:Hangymon"; + inline static constexpr const char* PEN_HANGYMON_FQNAME = PEN_HANGYMON_FQNAME_ARR; + inline static constexpr size_t PEN_HANGYMON_FQNAME_LEN = sizeof(PEN_HANGYMON_FQNAME_ARR)-1; + inline static constexpr int PEN_HANGYMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_HANGYMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_HANGYMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_HANGYMON_ANIM_INDEX = 32; + + // Name: Hanumon + inline static constexpr char PEN_HANUMON_FQID_ARR[] = "pen:hanumon"; + inline static constexpr const char* PEN_HANUMON_FQID = PEN_HANUMON_FQID_ARR; + inline static constexpr size_t PEN_HANUMON_FQID_LEN = sizeof(PEN_HANUMON_FQID_ARR)-1; + inline static constexpr char PEN_HANUMON_ID_ARR[] = "hanumon"; + inline static constexpr const char* PEN_HANUMON_ID = PEN_HANUMON_ID_ARR; + inline static constexpr size_t PEN_HANUMON_ID_LEN = sizeof(PEN_HANUMON_ID)-1; + inline static constexpr char PEN_HANUMON_NAME_ARR[] = "Hanumon"; + inline static constexpr const char* PEN_HANUMON_NAME = PEN_HANUMON_NAME_ARR; + inline static constexpr size_t PEN_HANUMON_NAME_LEN = sizeof(PEN_HANUMON_NAME_ARR)-1; + inline static constexpr char PEN_HANUMON_FQNAME_ARR[] = "pen:Hanumon"; + inline static constexpr const char* PEN_HANUMON_FQNAME = PEN_HANUMON_FQNAME_ARR; + inline static constexpr size_t PEN_HANUMON_FQNAME_LEN = sizeof(PEN_HANUMON_FQNAME_ARR)-1; + inline static constexpr int PEN_HANUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_HANUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_HANUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_HANUMON_ANIM_INDEX = 33; + + // Name: Herkule Kabuterimon + inline static constexpr char PEN_HERKULE_KABUTERIMON_FQID_ARR[] = "pen:herkule_kabuterimon"; + inline static constexpr const char* PEN_HERKULE_KABUTERIMON_FQID = PEN_HERKULE_KABUTERIMON_FQID_ARR; + inline static constexpr size_t PEN_HERKULE_KABUTERIMON_FQID_LEN = sizeof(PEN_HERKULE_KABUTERIMON_FQID_ARR)-1; + inline static constexpr char PEN_HERKULE_KABUTERIMON_ID_ARR[] = "herkule_kabuterimon"; + inline static constexpr const char* PEN_HERKULE_KABUTERIMON_ID = PEN_HERKULE_KABUTERIMON_ID_ARR; + inline static constexpr size_t PEN_HERKULE_KABUTERIMON_ID_LEN = sizeof(PEN_HERKULE_KABUTERIMON_ID)-1; + inline static constexpr char PEN_HERKULE_KABUTERIMON_NAME_ARR[] = "Herkule Kabuterimon"; + inline static constexpr const char* PEN_HERKULE_KABUTERIMON_NAME = PEN_HERKULE_KABUTERIMON_NAME_ARR; + inline static constexpr size_t PEN_HERKULE_KABUTERIMON_NAME_LEN = sizeof(PEN_HERKULE_KABUTERIMON_NAME_ARR)-1; + inline static constexpr char PEN_HERKULE_KABUTERIMON_FQNAME_ARR[] = "pen:Herkule Kabuterimon"; + inline static constexpr const char* PEN_HERKULE_KABUTERIMON_FQNAME = PEN_HERKULE_KABUTERIMON_FQNAME_ARR; + inline static constexpr size_t PEN_HERKULE_KABUTERIMON_FQNAME_LEN = sizeof(PEN_HERKULE_KABUTERIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_HERKULE_KABUTERIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_HERKULE_KABUTERIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_HERKULE_KABUTERIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_HERKULE_KABUTERIMON_ANIM_INDEX = 34; + + // Name: Holy Angemon + inline static constexpr char PEN_HOLY_ANGEMON_FQID_ARR[] = "pen:holy_angemon"; + inline static constexpr const char* PEN_HOLY_ANGEMON_FQID = PEN_HOLY_ANGEMON_FQID_ARR; + inline static constexpr size_t PEN_HOLY_ANGEMON_FQID_LEN = sizeof(PEN_HOLY_ANGEMON_FQID_ARR)-1; + inline static constexpr char PEN_HOLY_ANGEMON_ID_ARR[] = "holy_angemon"; + inline static constexpr const char* PEN_HOLY_ANGEMON_ID = PEN_HOLY_ANGEMON_ID_ARR; + inline static constexpr size_t PEN_HOLY_ANGEMON_ID_LEN = sizeof(PEN_HOLY_ANGEMON_ID)-1; + inline static constexpr char PEN_HOLY_ANGEMON_NAME_ARR[] = "Holy Angemon"; + inline static constexpr const char* PEN_HOLY_ANGEMON_NAME = PEN_HOLY_ANGEMON_NAME_ARR; + inline static constexpr size_t PEN_HOLY_ANGEMON_NAME_LEN = sizeof(PEN_HOLY_ANGEMON_NAME_ARR)-1; + inline static constexpr char PEN_HOLY_ANGEMON_FQNAME_ARR[] = "pen:Holy Angemon"; + inline static constexpr const char* PEN_HOLY_ANGEMON_FQNAME = PEN_HOLY_ANGEMON_FQNAME_ARR; + inline static constexpr size_t PEN_HOLY_ANGEMON_FQNAME_LEN = sizeof(PEN_HOLY_ANGEMON_FQNAME_ARR)-1; + inline static constexpr int PEN_HOLY_ANGEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_HOLY_ANGEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_HOLY_ANGEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_HOLY_ANGEMON_ANIM_INDEX = 35; + + // Name: Holydramon + inline static constexpr char PEN_HOLYDRAMON_FQID_ARR[] = "pen:holydramon"; + inline static constexpr const char* PEN_HOLYDRAMON_FQID = PEN_HOLYDRAMON_FQID_ARR; + inline static constexpr size_t PEN_HOLYDRAMON_FQID_LEN = sizeof(PEN_HOLYDRAMON_FQID_ARR)-1; + inline static constexpr char PEN_HOLYDRAMON_ID_ARR[] = "holydramon"; + inline static constexpr const char* PEN_HOLYDRAMON_ID = PEN_HOLYDRAMON_ID_ARR; + inline static constexpr size_t PEN_HOLYDRAMON_ID_LEN = sizeof(PEN_HOLYDRAMON_ID)-1; + inline static constexpr char PEN_HOLYDRAMON_NAME_ARR[] = "Holydramon"; + inline static constexpr const char* PEN_HOLYDRAMON_NAME = PEN_HOLYDRAMON_NAME_ARR; + inline static constexpr size_t PEN_HOLYDRAMON_NAME_LEN = sizeof(PEN_HOLYDRAMON_NAME_ARR)-1; + inline static constexpr char PEN_HOLYDRAMON_FQNAME_ARR[] = "pen:Holydramon"; + inline static constexpr const char* PEN_HOLYDRAMON_FQNAME = PEN_HOLYDRAMON_FQNAME_ARR; + inline static constexpr size_t PEN_HOLYDRAMON_FQNAME_LEN = sizeof(PEN_HOLYDRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_HOLYDRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_HOLYDRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_HOLYDRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_HOLYDRAMON_ANIM_INDEX = 36; + + // Name: Hououmon + inline static constexpr char PEN_HOUOUMON_FQID_ARR[] = "pen:hououmon"; + inline static constexpr const char* PEN_HOUOUMON_FQID = PEN_HOUOUMON_FQID_ARR; + inline static constexpr size_t PEN_HOUOUMON_FQID_LEN = sizeof(PEN_HOUOUMON_FQID_ARR)-1; + inline static constexpr char PEN_HOUOUMON_ID_ARR[] = "hououmon"; + inline static constexpr const char* PEN_HOUOUMON_ID = PEN_HOUOUMON_ID_ARR; + inline static constexpr size_t PEN_HOUOUMON_ID_LEN = sizeof(PEN_HOUOUMON_ID)-1; + inline static constexpr char PEN_HOUOUMON_NAME_ARR[] = "Hououmon"; + inline static constexpr const char* PEN_HOUOUMON_NAME = PEN_HOUOUMON_NAME_ARR; + inline static constexpr size_t PEN_HOUOUMON_NAME_LEN = sizeof(PEN_HOUOUMON_NAME_ARR)-1; + inline static constexpr char PEN_HOUOUMON_FQNAME_ARR[] = "pen:Hououmon"; + inline static constexpr const char* PEN_HOUOUMON_FQNAME = PEN_HOUOUMON_FQNAME_ARR; + inline static constexpr size_t PEN_HOUOUMON_FQNAME_LEN = sizeof(PEN_HOUOUMON_FQNAME_ARR)-1; + inline static constexpr int PEN_HOUOUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_HOUOUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_HOUOUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_HOUOUMON_ANIM_INDEX = 37; + + // Name: Ignamon + inline static constexpr char PEN_IGNAMON_FQID_ARR[] = "pen:ignamon"; + inline static constexpr const char* PEN_IGNAMON_FQID = PEN_IGNAMON_FQID_ARR; + inline static constexpr size_t PEN_IGNAMON_FQID_LEN = sizeof(PEN_IGNAMON_FQID_ARR)-1; + inline static constexpr char PEN_IGNAMON_ID_ARR[] = "ignamon"; + inline static constexpr const char* PEN_IGNAMON_ID = PEN_IGNAMON_ID_ARR; + inline static constexpr size_t PEN_IGNAMON_ID_LEN = sizeof(PEN_IGNAMON_ID)-1; + inline static constexpr char PEN_IGNAMON_NAME_ARR[] = "Ignamon"; + inline static constexpr const char* PEN_IGNAMON_NAME = PEN_IGNAMON_NAME_ARR; + inline static constexpr size_t PEN_IGNAMON_NAME_LEN = sizeof(PEN_IGNAMON_NAME_ARR)-1; + inline static constexpr char PEN_IGNAMON_FQNAME_ARR[] = "pen:Ignamon"; + inline static constexpr const char* PEN_IGNAMON_FQNAME = PEN_IGNAMON_FQNAME_ARR; + inline static constexpr size_t PEN_IGNAMON_FQNAME_LEN = sizeof(PEN_IGNAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_IGNAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_IGNAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_IGNAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_IGNAMON_ANIM_INDEX = 38; + + // Name: Ikkakumon + inline static constexpr char PEN_IKKAKUMON_FQID_ARR[] = "pen:ikkakumon"; + inline static constexpr const char* PEN_IKKAKUMON_FQID = PEN_IKKAKUMON_FQID_ARR; + inline static constexpr size_t PEN_IKKAKUMON_FQID_LEN = sizeof(PEN_IKKAKUMON_FQID_ARR)-1; + inline static constexpr char PEN_IKKAKUMON_ID_ARR[] = "ikkakumon"; + inline static constexpr const char* PEN_IKKAKUMON_ID = PEN_IKKAKUMON_ID_ARR; + inline static constexpr size_t PEN_IKKAKUMON_ID_LEN = sizeof(PEN_IKKAKUMON_ID)-1; + inline static constexpr char PEN_IKKAKUMON_NAME_ARR[] = "Ikkakumon"; + inline static constexpr const char* PEN_IKKAKUMON_NAME = PEN_IKKAKUMON_NAME_ARR; + inline static constexpr size_t PEN_IKKAKUMON_NAME_LEN = sizeof(PEN_IKKAKUMON_NAME_ARR)-1; + inline static constexpr char PEN_IKKAKUMON_FQNAME_ARR[] = "pen:Ikkakumon"; + inline static constexpr const char* PEN_IKKAKUMON_FQNAME = PEN_IKKAKUMON_FQNAME_ARR; + inline static constexpr size_t PEN_IKKAKUMON_FQNAME_LEN = sizeof(PEN_IKKAKUMON_FQNAME_ARR)-1; + inline static constexpr int PEN_IKKAKUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_IKKAKUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_IKKAKUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_IKKAKUMON_ANIM_INDEX = 39; + + // Name: Jyagamon + inline static constexpr char PEN_JYAGAMON_FQID_ARR[] = "pen:jyagamon"; + inline static constexpr const char* PEN_JYAGAMON_FQID = PEN_JYAGAMON_FQID_ARR; + inline static constexpr size_t PEN_JYAGAMON_FQID_LEN = sizeof(PEN_JYAGAMON_FQID_ARR)-1; + inline static constexpr char PEN_JYAGAMON_ID_ARR[] = "jyagamon"; + inline static constexpr const char* PEN_JYAGAMON_ID = PEN_JYAGAMON_ID_ARR; + inline static constexpr size_t PEN_JYAGAMON_ID_LEN = sizeof(PEN_JYAGAMON_ID)-1; + inline static constexpr char PEN_JYAGAMON_NAME_ARR[] = "Jyagamon"; + inline static constexpr const char* PEN_JYAGAMON_NAME = PEN_JYAGAMON_NAME_ARR; + inline static constexpr size_t PEN_JYAGAMON_NAME_LEN = sizeof(PEN_JYAGAMON_NAME_ARR)-1; + inline static constexpr char PEN_JYAGAMON_FQNAME_ARR[] = "pen:Jyagamon"; + inline static constexpr const char* PEN_JYAGAMON_FQNAME = PEN_JYAGAMON_FQNAME_ARR; + inline static constexpr size_t PEN_JYAGAMON_FQNAME_LEN = sizeof(PEN_JYAGAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_JYAGAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_JYAGAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_JYAGAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_JYAGAMON_ANIM_INDEX = 40; + + // Name: Jyureimon + inline static constexpr char PEN_JYUREIMON_FQID_ARR[] = "pen:jyureimon"; + inline static constexpr const char* PEN_JYUREIMON_FQID = PEN_JYUREIMON_FQID_ARR; + inline static constexpr size_t PEN_JYUREIMON_FQID_LEN = sizeof(PEN_JYUREIMON_FQID_ARR)-1; + inline static constexpr char PEN_JYUREIMON_ID_ARR[] = "jyureimon"; + inline static constexpr const char* PEN_JYUREIMON_ID = PEN_JYUREIMON_ID_ARR; + inline static constexpr size_t PEN_JYUREIMON_ID_LEN = sizeof(PEN_JYUREIMON_ID)-1; + inline static constexpr char PEN_JYUREIMON_NAME_ARR[] = "Jyureimon"; + inline static constexpr const char* PEN_JYUREIMON_NAME = PEN_JYUREIMON_NAME_ARR; + inline static constexpr size_t PEN_JYUREIMON_NAME_LEN = sizeof(PEN_JYUREIMON_NAME_ARR)-1; + inline static constexpr char PEN_JYUREIMON_FQNAME_ARR[] = "pen:Jyureimon"; + inline static constexpr const char* PEN_JYUREIMON_FQNAME = PEN_JYUREIMON_FQNAME_ARR; + inline static constexpr size_t PEN_JYUREIMON_FQNAME_LEN = sizeof(PEN_JYUREIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_JYUREIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_JYUREIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_JYUREIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_JYUREIMON_ANIM_INDEX = 41; + + // Name: Kiwimon + inline static constexpr char PEN_KIWIMON_FQID_ARR[] = "pen:kiwimon"; + inline static constexpr const char* PEN_KIWIMON_FQID = PEN_KIWIMON_FQID_ARR; + inline static constexpr size_t PEN_KIWIMON_FQID_LEN = sizeof(PEN_KIWIMON_FQID_ARR)-1; + inline static constexpr char PEN_KIWIMON_ID_ARR[] = "kiwimon"; + inline static constexpr const char* PEN_KIWIMON_ID = PEN_KIWIMON_ID_ARR; + inline static constexpr size_t PEN_KIWIMON_ID_LEN = sizeof(PEN_KIWIMON_ID)-1; + inline static constexpr char PEN_KIWIMON_NAME_ARR[] = "Kiwimon"; + inline static constexpr const char* PEN_KIWIMON_NAME = PEN_KIWIMON_NAME_ARR; + inline static constexpr size_t PEN_KIWIMON_NAME_LEN = sizeof(PEN_KIWIMON_NAME_ARR)-1; + inline static constexpr char PEN_KIWIMON_FQNAME_ARR[] = "pen:Kiwimon"; + inline static constexpr const char* PEN_KIWIMON_FQNAME = PEN_KIWIMON_FQNAME_ARR; + inline static constexpr size_t PEN_KIWIMON_FQNAME_LEN = sizeof(PEN_KIWIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_KIWIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_KIWIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_KIWIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_KIWIMON_ANIM_INDEX = 42; + + // Name: Knightmon + inline static constexpr char PEN_KNIGHTMON_FQID_ARR[] = "pen:knightmon"; + inline static constexpr const char* PEN_KNIGHTMON_FQID = PEN_KNIGHTMON_FQID_ARR; + inline static constexpr size_t PEN_KNIGHTMON_FQID_LEN = sizeof(PEN_KNIGHTMON_FQID_ARR)-1; + inline static constexpr char PEN_KNIGHTMON_ID_ARR[] = "knightmon"; + inline static constexpr const char* PEN_KNIGHTMON_ID = PEN_KNIGHTMON_ID_ARR; + inline static constexpr size_t PEN_KNIGHTMON_ID_LEN = sizeof(PEN_KNIGHTMON_ID)-1; + inline static constexpr char PEN_KNIGHTMON_NAME_ARR[] = "Knightmon"; + inline static constexpr const char* PEN_KNIGHTMON_NAME = PEN_KNIGHTMON_NAME_ARR; + inline static constexpr size_t PEN_KNIGHTMON_NAME_LEN = sizeof(PEN_KNIGHTMON_NAME_ARR)-1; + inline static constexpr char PEN_KNIGHTMON_FQNAME_ARR[] = "pen:Knightmon"; + inline static constexpr const char* PEN_KNIGHTMON_FQNAME = PEN_KNIGHTMON_FQNAME_ARR; + inline static constexpr size_t PEN_KNIGHTMON_FQNAME_LEN = sizeof(PEN_KNIGHTMON_FQNAME_ARR)-1; + inline static constexpr int PEN_KNIGHTMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_KNIGHTMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_KNIGHTMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_KNIGHTMON_ANIM_INDEX = 43; + + // Name: Kokuwamon + inline static constexpr char PEN_KOKUWAMON_FQID_ARR[] = "pen:kokuwamon"; + inline static constexpr const char* PEN_KOKUWAMON_FQID = PEN_KOKUWAMON_FQID_ARR; + inline static constexpr size_t PEN_KOKUWAMON_FQID_LEN = sizeof(PEN_KOKUWAMON_FQID_ARR)-1; + inline static constexpr char PEN_KOKUWAMON_ID_ARR[] = "kokuwamon"; + inline static constexpr const char* PEN_KOKUWAMON_ID = PEN_KOKUWAMON_ID_ARR; + inline static constexpr size_t PEN_KOKUWAMON_ID_LEN = sizeof(PEN_KOKUWAMON_ID)-1; + inline static constexpr char PEN_KOKUWAMON_NAME_ARR[] = "Kokuwamon"; + inline static constexpr const char* PEN_KOKUWAMON_NAME = PEN_KOKUWAMON_NAME_ARR; + inline static constexpr size_t PEN_KOKUWAMON_NAME_LEN = sizeof(PEN_KOKUWAMON_NAME_ARR)-1; + inline static constexpr char PEN_KOKUWAMON_FQNAME_ARR[] = "pen:Kokuwamon"; + inline static constexpr const char* PEN_KOKUWAMON_FQNAME = PEN_KOKUWAMON_FQNAME_ARR; + inline static constexpr size_t PEN_KOKUWAMON_FQNAME_LEN = sizeof(PEN_KOKUWAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_KOKUWAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_KOKUWAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_KOKUWAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_KOKUWAMON_ANIM_INDEX = 44; + + // Name: Lady Devimon + inline static constexpr char PEN_LADY_DEVIMON_FQID_ARR[] = "pen:lady_devimon"; + inline static constexpr const char* PEN_LADY_DEVIMON_FQID = PEN_LADY_DEVIMON_FQID_ARR; + inline static constexpr size_t PEN_LADY_DEVIMON_FQID_LEN = sizeof(PEN_LADY_DEVIMON_FQID_ARR)-1; + inline static constexpr char PEN_LADY_DEVIMON_ID_ARR[] = "lady_devimon"; + inline static constexpr const char* PEN_LADY_DEVIMON_ID = PEN_LADY_DEVIMON_ID_ARR; + inline static constexpr size_t PEN_LADY_DEVIMON_ID_LEN = sizeof(PEN_LADY_DEVIMON_ID)-1; + inline static constexpr char PEN_LADY_DEVIMON_NAME_ARR[] = "Lady Devimon"; + inline static constexpr const char* PEN_LADY_DEVIMON_NAME = PEN_LADY_DEVIMON_NAME_ARR; + inline static constexpr size_t PEN_LADY_DEVIMON_NAME_LEN = sizeof(PEN_LADY_DEVIMON_NAME_ARR)-1; + inline static constexpr char PEN_LADY_DEVIMON_FQNAME_ARR[] = "pen:Lady Devimon"; + inline static constexpr const char* PEN_LADY_DEVIMON_FQNAME = PEN_LADY_DEVIMON_FQNAME_ARR; + inline static constexpr size_t PEN_LADY_DEVIMON_FQNAME_LEN = sizeof(PEN_LADY_DEVIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_LADY_DEVIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_LADY_DEVIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_LADY_DEVIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_LADY_DEVIMON_ANIM_INDEX = 45; + + // Name: Lilimon + inline static constexpr char PEN_LILIMON_FQID_ARR[] = "pen:lilimon"; + inline static constexpr const char* PEN_LILIMON_FQID = PEN_LILIMON_FQID_ARR; + inline static constexpr size_t PEN_LILIMON_FQID_LEN = sizeof(PEN_LILIMON_FQID_ARR)-1; + inline static constexpr char PEN_LILIMON_ID_ARR[] = "lilimon"; + inline static constexpr const char* PEN_LILIMON_ID = PEN_LILIMON_ID_ARR; + inline static constexpr size_t PEN_LILIMON_ID_LEN = sizeof(PEN_LILIMON_ID)-1; + inline static constexpr char PEN_LILIMON_NAME_ARR[] = "Lilimon"; + inline static constexpr const char* PEN_LILIMON_NAME = PEN_LILIMON_NAME_ARR; + inline static constexpr size_t PEN_LILIMON_NAME_LEN = sizeof(PEN_LILIMON_NAME_ARR)-1; + inline static constexpr char PEN_LILIMON_FQNAME_ARR[] = "pen:Lilimon"; + inline static constexpr const char* PEN_LILIMON_FQNAME = PEN_LILIMON_FQNAME_ARR; + inline static constexpr size_t PEN_LILIMON_FQNAME_LEN = sizeof(PEN_LILIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_LILIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_LILIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_LILIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_LILIMON_ANIM_INDEX = 46; + + // Name: Mammon + inline static constexpr char PEN_MAMMON_FQID_ARR[] = "pen:mammon"; + inline static constexpr const char* PEN_MAMMON_FQID = PEN_MAMMON_FQID_ARR; + inline static constexpr size_t PEN_MAMMON_FQID_LEN = sizeof(PEN_MAMMON_FQID_ARR)-1; + inline static constexpr char PEN_MAMMON_ID_ARR[] = "mammon"; + inline static constexpr const char* PEN_MAMMON_ID = PEN_MAMMON_ID_ARR; + inline static constexpr size_t PEN_MAMMON_ID_LEN = sizeof(PEN_MAMMON_ID)-1; + inline static constexpr char PEN_MAMMON_NAME_ARR[] = "Mammon"; + inline static constexpr const char* PEN_MAMMON_NAME = PEN_MAMMON_NAME_ARR; + inline static constexpr size_t PEN_MAMMON_NAME_LEN = sizeof(PEN_MAMMON_NAME_ARR)-1; + inline static constexpr char PEN_MAMMON_FQNAME_ARR[] = "pen:Mammon"; + inline static constexpr const char* PEN_MAMMON_FQNAME = PEN_MAMMON_FQNAME_ARR; + inline static constexpr size_t PEN_MAMMON_FQNAME_LEN = sizeof(PEN_MAMMON_FQNAME_ARR)-1; + inline static constexpr int PEN_MAMMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_MAMMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_MAMMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_MAMMON_ANIM_INDEX = 47; + + // Name: Marin Angemon + inline static constexpr char PEN_MARIN_ANGEMON_FQID_ARR[] = "pen:marin_angemon"; + inline static constexpr const char* PEN_MARIN_ANGEMON_FQID = PEN_MARIN_ANGEMON_FQID_ARR; + inline static constexpr size_t PEN_MARIN_ANGEMON_FQID_LEN = sizeof(PEN_MARIN_ANGEMON_FQID_ARR)-1; + inline static constexpr char PEN_MARIN_ANGEMON_ID_ARR[] = "marin_angemon"; + inline static constexpr const char* PEN_MARIN_ANGEMON_ID = PEN_MARIN_ANGEMON_ID_ARR; + inline static constexpr size_t PEN_MARIN_ANGEMON_ID_LEN = sizeof(PEN_MARIN_ANGEMON_ID)-1; + inline static constexpr char PEN_MARIN_ANGEMON_NAME_ARR[] = "Marin Angemon"; + inline static constexpr const char* PEN_MARIN_ANGEMON_NAME = PEN_MARIN_ANGEMON_NAME_ARR; + inline static constexpr size_t PEN_MARIN_ANGEMON_NAME_LEN = sizeof(PEN_MARIN_ANGEMON_NAME_ARR)-1; + inline static constexpr char PEN_MARIN_ANGEMON_FQNAME_ARR[] = "pen:Marin Angemon"; + inline static constexpr const char* PEN_MARIN_ANGEMON_FQNAME = PEN_MARIN_ANGEMON_FQNAME_ARR; + inline static constexpr size_t PEN_MARIN_ANGEMON_FQNAME_LEN = sizeof(PEN_MARIN_ANGEMON_FQNAME_ARR)-1; + inline static constexpr int PEN_MARIN_ANGEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_MARIN_ANGEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_MARIN_ANGEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_MARIN_ANGEMON_ANIM_INDEX = 48; + + // Name: Marin Devimon + inline static constexpr char PEN_MARIN_DEVIMON_FQID_ARR[] = "pen:marin_devimon"; + inline static constexpr const char* PEN_MARIN_DEVIMON_FQID = PEN_MARIN_DEVIMON_FQID_ARR; + inline static constexpr size_t PEN_MARIN_DEVIMON_FQID_LEN = sizeof(PEN_MARIN_DEVIMON_FQID_ARR)-1; + inline static constexpr char PEN_MARIN_DEVIMON_ID_ARR[] = "marin_devimon"; + inline static constexpr const char* PEN_MARIN_DEVIMON_ID = PEN_MARIN_DEVIMON_ID_ARR; + inline static constexpr size_t PEN_MARIN_DEVIMON_ID_LEN = sizeof(PEN_MARIN_DEVIMON_ID)-1; + inline static constexpr char PEN_MARIN_DEVIMON_NAME_ARR[] = "Marin Devimon"; + inline static constexpr const char* PEN_MARIN_DEVIMON_NAME = PEN_MARIN_DEVIMON_NAME_ARR; + inline static constexpr size_t PEN_MARIN_DEVIMON_NAME_LEN = sizeof(PEN_MARIN_DEVIMON_NAME_ARR)-1; + inline static constexpr char PEN_MARIN_DEVIMON_FQNAME_ARR[] = "pen:Marin Devimon"; + inline static constexpr const char* PEN_MARIN_DEVIMON_FQNAME = PEN_MARIN_DEVIMON_FQNAME_ARR; + inline static constexpr size_t PEN_MARIN_DEVIMON_FQNAME_LEN = sizeof(PEN_MARIN_DEVIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_MARIN_DEVIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_MARIN_DEVIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_MARIN_DEVIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_MARIN_DEVIMON_ANIM_INDEX = 49; + + // Name: Mechanorimon + inline static constexpr char PEN_MECHANORIMON_FQID_ARR[] = "pen:mechanorimon"; + inline static constexpr const char* PEN_MECHANORIMON_FQID = PEN_MECHANORIMON_FQID_ARR; + inline static constexpr size_t PEN_MECHANORIMON_FQID_LEN = sizeof(PEN_MECHANORIMON_FQID_ARR)-1; + inline static constexpr char PEN_MECHANORIMON_ID_ARR[] = "mechanorimon"; + inline static constexpr const char* PEN_MECHANORIMON_ID = PEN_MECHANORIMON_ID_ARR; + inline static constexpr size_t PEN_MECHANORIMON_ID_LEN = sizeof(PEN_MECHANORIMON_ID)-1; + inline static constexpr char PEN_MECHANORIMON_NAME_ARR[] = "Mechanorimon"; + inline static constexpr const char* PEN_MECHANORIMON_NAME = PEN_MECHANORIMON_NAME_ARR; + inline static constexpr size_t PEN_MECHANORIMON_NAME_LEN = sizeof(PEN_MECHANORIMON_NAME_ARR)-1; + inline static constexpr char PEN_MECHANORIMON_FQNAME_ARR[] = "pen:Mechanorimon"; + inline static constexpr const char* PEN_MECHANORIMON_FQNAME = PEN_MECHANORIMON_FQNAME_ARR; + inline static constexpr size_t PEN_MECHANORIMON_FQNAME_LEN = sizeof(PEN_MECHANORIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_MECHANORIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_MECHANORIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_MECHANORIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_MECHANORIMON_ANIM_INDEX = 50; + + // Name: Mega Seadramon + inline static constexpr char PEN_MEGA_SEADRAMON_FQID_ARR[] = "pen:mega_seadramon"; + inline static constexpr const char* PEN_MEGA_SEADRAMON_FQID = PEN_MEGA_SEADRAMON_FQID_ARR; + inline static constexpr size_t PEN_MEGA_SEADRAMON_FQID_LEN = sizeof(PEN_MEGA_SEADRAMON_FQID_ARR)-1; + inline static constexpr char PEN_MEGA_SEADRAMON_ID_ARR[] = "mega_seadramon"; + inline static constexpr const char* PEN_MEGA_SEADRAMON_ID = PEN_MEGA_SEADRAMON_ID_ARR; + inline static constexpr size_t PEN_MEGA_SEADRAMON_ID_LEN = sizeof(PEN_MEGA_SEADRAMON_ID)-1; + inline static constexpr char PEN_MEGA_SEADRAMON_NAME_ARR[] = "Mega Seadramon"; + inline static constexpr const char* PEN_MEGA_SEADRAMON_NAME = PEN_MEGA_SEADRAMON_NAME_ARR; + inline static constexpr size_t PEN_MEGA_SEADRAMON_NAME_LEN = sizeof(PEN_MEGA_SEADRAMON_NAME_ARR)-1; + inline static constexpr char PEN_MEGA_SEADRAMON_FQNAME_ARR[] = "pen:Mega Seadramon"; + inline static constexpr const char* PEN_MEGA_SEADRAMON_FQNAME = PEN_MEGA_SEADRAMON_FQNAME_ARR; + inline static constexpr size_t PEN_MEGA_SEADRAMON_FQNAME_LEN = sizeof(PEN_MEGA_SEADRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_MEGA_SEADRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_MEGA_SEADRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_MEGA_SEADRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_MEGA_SEADRAMON_ANIM_INDEX = 51; + + // Name: Metal Etemon + inline static constexpr char PEN_METAL_ETEMON_FQID_ARR[] = "pen:metal_etemon"; + inline static constexpr const char* PEN_METAL_ETEMON_FQID = PEN_METAL_ETEMON_FQID_ARR; + inline static constexpr size_t PEN_METAL_ETEMON_FQID_LEN = sizeof(PEN_METAL_ETEMON_FQID_ARR)-1; + inline static constexpr char PEN_METAL_ETEMON_ID_ARR[] = "metal_etemon"; + inline static constexpr const char* PEN_METAL_ETEMON_ID = PEN_METAL_ETEMON_ID_ARR; + inline static constexpr size_t PEN_METAL_ETEMON_ID_LEN = sizeof(PEN_METAL_ETEMON_ID)-1; + inline static constexpr char PEN_METAL_ETEMON_NAME_ARR[] = "Metal Etemon"; + inline static constexpr const char* PEN_METAL_ETEMON_NAME = PEN_METAL_ETEMON_NAME_ARR; + inline static constexpr size_t PEN_METAL_ETEMON_NAME_LEN = sizeof(PEN_METAL_ETEMON_NAME_ARR)-1; + inline static constexpr char PEN_METAL_ETEMON_FQNAME_ARR[] = "pen:Metal Etemon"; + inline static constexpr const char* PEN_METAL_ETEMON_FQNAME = PEN_METAL_ETEMON_FQNAME_ARR; + inline static constexpr size_t PEN_METAL_ETEMON_FQNAME_LEN = sizeof(PEN_METAL_ETEMON_FQNAME_ARR)-1; + inline static constexpr int PEN_METAL_ETEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_METAL_ETEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_METAL_ETEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_METAL_ETEMON_ANIM_INDEX = 52; + + // Name: Metal Seadramon + inline static constexpr char PEN_METAL_SEADRAMON_FQID_ARR[] = "pen:metal_seadramon"; + inline static constexpr const char* PEN_METAL_SEADRAMON_FQID = PEN_METAL_SEADRAMON_FQID_ARR; + inline static constexpr size_t PEN_METAL_SEADRAMON_FQID_LEN = sizeof(PEN_METAL_SEADRAMON_FQID_ARR)-1; + inline static constexpr char PEN_METAL_SEADRAMON_ID_ARR[] = "metal_seadramon"; + inline static constexpr const char* PEN_METAL_SEADRAMON_ID = PEN_METAL_SEADRAMON_ID_ARR; + inline static constexpr size_t PEN_METAL_SEADRAMON_ID_LEN = sizeof(PEN_METAL_SEADRAMON_ID)-1; + inline static constexpr char PEN_METAL_SEADRAMON_NAME_ARR[] = "Metal Seadramon"; + inline static constexpr const char* PEN_METAL_SEADRAMON_NAME = PEN_METAL_SEADRAMON_NAME_ARR; + inline static constexpr size_t PEN_METAL_SEADRAMON_NAME_LEN = sizeof(PEN_METAL_SEADRAMON_NAME_ARR)-1; + inline static constexpr char PEN_METAL_SEADRAMON_FQNAME_ARR[] = "pen:Metal Seadramon"; + inline static constexpr const char* PEN_METAL_SEADRAMON_FQNAME = PEN_METAL_SEADRAMON_FQNAME_ARR; + inline static constexpr size_t PEN_METAL_SEADRAMON_FQNAME_LEN = sizeof(PEN_METAL_SEADRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_METAL_SEADRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_METAL_SEADRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_METAL_SEADRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_METAL_SEADRAMON_ANIM_INDEX = 53; + + // Name: Mochimon + inline static constexpr char PEN_MOCHIMON_FQID_ARR[] = "pen:mochimon"; + inline static constexpr const char* PEN_MOCHIMON_FQID = PEN_MOCHIMON_FQID_ARR; + inline static constexpr size_t PEN_MOCHIMON_FQID_LEN = sizeof(PEN_MOCHIMON_FQID_ARR)-1; + inline static constexpr char PEN_MOCHIMON_ID_ARR[] = "mochimon"; + inline static constexpr const char* PEN_MOCHIMON_ID = PEN_MOCHIMON_ID_ARR; + inline static constexpr size_t PEN_MOCHIMON_ID_LEN = sizeof(PEN_MOCHIMON_ID)-1; + inline static constexpr char PEN_MOCHIMON_NAME_ARR[] = "Mochimon"; + inline static constexpr const char* PEN_MOCHIMON_NAME = PEN_MOCHIMON_NAME_ARR; + inline static constexpr size_t PEN_MOCHIMON_NAME_LEN = sizeof(PEN_MOCHIMON_NAME_ARR)-1; + inline static constexpr char PEN_MOCHIMON_FQNAME_ARR[] = "pen:Mochimon"; + inline static constexpr const char* PEN_MOCHIMON_FQNAME = PEN_MOCHIMON_FQNAME_ARR; + inline static constexpr size_t PEN_MOCHIMON_FQNAME_LEN = sizeof(PEN_MOCHIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_MOCHIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_MOCHIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_MOCHIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_MOCHIMON_ANIM_INDEX = 54; + + // Name: Mokumon + inline static constexpr char PEN_MOKUMON_FQID_ARR[] = "pen:mokumon"; + inline static constexpr const char* PEN_MOKUMON_FQID = PEN_MOKUMON_FQID_ARR; + inline static constexpr size_t PEN_MOKUMON_FQID_LEN = sizeof(PEN_MOKUMON_FQID_ARR)-1; + inline static constexpr char PEN_MOKUMON_ID_ARR[] = "mokumon"; + inline static constexpr const char* PEN_MOKUMON_ID = PEN_MOKUMON_ID_ARR; + inline static constexpr size_t PEN_MOKUMON_ID_LEN = sizeof(PEN_MOKUMON_ID)-1; + inline static constexpr char PEN_MOKUMON_NAME_ARR[] = "Mokumon"; + inline static constexpr const char* PEN_MOKUMON_NAME = PEN_MOKUMON_NAME_ARR; + inline static constexpr size_t PEN_MOKUMON_NAME_LEN = sizeof(PEN_MOKUMON_NAME_ARR)-1; + inline static constexpr char PEN_MOKUMON_FQNAME_ARR[] = "pen:Mokumon"; + inline static constexpr const char* PEN_MOKUMON_FQNAME = PEN_MOKUMON_FQNAME_ARR; + inline static constexpr size_t PEN_MOKUMON_FQNAME_LEN = sizeof(PEN_MOKUMON_FQNAME_ARR)-1; + inline static constexpr int PEN_MOKUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_MOKUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_MOKUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_MOKUMON_ANIM_INDEX = 55; + + // Name: Mushmon + inline static constexpr char PEN_MUSHMON_FQID_ARR[] = "pen:mushmon"; + inline static constexpr const char* PEN_MUSHMON_FQID = PEN_MUSHMON_FQID_ARR; + inline static constexpr size_t PEN_MUSHMON_FQID_LEN = sizeof(PEN_MUSHMON_FQID_ARR)-1; + inline static constexpr char PEN_MUSHMON_ID_ARR[] = "mushmon"; + inline static constexpr const char* PEN_MUSHMON_ID = PEN_MUSHMON_ID_ARR; + inline static constexpr size_t PEN_MUSHMON_ID_LEN = sizeof(PEN_MUSHMON_ID)-1; + inline static constexpr char PEN_MUSHMON_NAME_ARR[] = "Mushmon"; + inline static constexpr const char* PEN_MUSHMON_NAME = PEN_MUSHMON_NAME_ARR; + inline static constexpr size_t PEN_MUSHMON_NAME_LEN = sizeof(PEN_MUSHMON_NAME_ARR)-1; + inline static constexpr char PEN_MUSHMON_FQNAME_ARR[] = "pen:Mushmon"; + inline static constexpr const char* PEN_MUSHMON_FQNAME = PEN_MUSHMON_FQNAME_ARR; + inline static constexpr size_t PEN_MUSHMON_FQNAME_LEN = sizeof(PEN_MUSHMON_FQNAME_ARR)-1; + inline static constexpr int PEN_MUSHMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_MUSHMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_MUSHMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_MUSHMON_ANIM_INDEX = 56; + + // Name: Nyokimon + inline static constexpr char PEN_NYOKIMON_FQID_ARR[] = "pen:nyokimon"; + inline static constexpr const char* PEN_NYOKIMON_FQID = PEN_NYOKIMON_FQID_ARR; + inline static constexpr size_t PEN_NYOKIMON_FQID_LEN = sizeof(PEN_NYOKIMON_FQID_ARR)-1; + inline static constexpr char PEN_NYOKIMON_ID_ARR[] = "nyokimon"; + inline static constexpr const char* PEN_NYOKIMON_ID = PEN_NYOKIMON_ID_ARR; + inline static constexpr size_t PEN_NYOKIMON_ID_LEN = sizeof(PEN_NYOKIMON_ID)-1; + inline static constexpr char PEN_NYOKIMON_NAME_ARR[] = "Nyokimon"; + inline static constexpr const char* PEN_NYOKIMON_NAME = PEN_NYOKIMON_NAME_ARR; + inline static constexpr size_t PEN_NYOKIMON_NAME_LEN = sizeof(PEN_NYOKIMON_NAME_ARR)-1; + inline static constexpr char PEN_NYOKIMON_FQNAME_ARR[] = "pen:Nyokimon"; + inline static constexpr const char* PEN_NYOKIMON_FQNAME = PEN_NYOKIMON_FQNAME_ARR; + inline static constexpr size_t PEN_NYOKIMON_FQNAME_LEN = sizeof(PEN_NYOKIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_NYOKIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_NYOKIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_NYOKIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_NYOKIMON_ANIM_INDEX = 57; + + // Name: Octmon + inline static constexpr char PEN_OCTMON_FQID_ARR[] = "pen:octmon"; + inline static constexpr const char* PEN_OCTMON_FQID = PEN_OCTMON_FQID_ARR; + inline static constexpr size_t PEN_OCTMON_FQID_LEN = sizeof(PEN_OCTMON_FQID_ARR)-1; + inline static constexpr char PEN_OCTMON_ID_ARR[] = "octmon"; + inline static constexpr const char* PEN_OCTMON_ID = PEN_OCTMON_ID_ARR; + inline static constexpr size_t PEN_OCTMON_ID_LEN = sizeof(PEN_OCTMON_ID)-1; + inline static constexpr char PEN_OCTMON_NAME_ARR[] = "Octmon"; + inline static constexpr const char* PEN_OCTMON_NAME = PEN_OCTMON_NAME_ARR; + inline static constexpr size_t PEN_OCTMON_NAME_LEN = sizeof(PEN_OCTMON_NAME_ARR)-1; + inline static constexpr char PEN_OCTMON_FQNAME_ARR[] = "pen:Octmon"; + inline static constexpr const char* PEN_OCTMON_FQNAME = PEN_OCTMON_FQNAME_ARR; + inline static constexpr size_t PEN_OCTMON_FQNAME_LEN = sizeof(PEN_OCTMON_FQNAME_ARR)-1; + inline static constexpr int PEN_OCTMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_OCTMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_OCTMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_OCTMON_ANIM_INDEX = 58; + + // Name: Okuwamon + inline static constexpr char PEN_OKUWAMON_FQID_ARR[] = "pen:okuwamon"; + inline static constexpr const char* PEN_OKUWAMON_FQID = PEN_OKUWAMON_FQID_ARR; + inline static constexpr size_t PEN_OKUWAMON_FQID_LEN = sizeof(PEN_OKUWAMON_FQID_ARR)-1; + inline static constexpr char PEN_OKUWAMON_ID_ARR[] = "okuwamon"; + inline static constexpr const char* PEN_OKUWAMON_ID = PEN_OKUWAMON_ID_ARR; + inline static constexpr size_t PEN_OKUWAMON_ID_LEN = sizeof(PEN_OKUWAMON_ID)-1; + inline static constexpr char PEN_OKUWAMON_NAME_ARR[] = "Okuwamon"; + inline static constexpr const char* PEN_OKUWAMON_NAME = PEN_OKUWAMON_NAME_ARR; + inline static constexpr size_t PEN_OKUWAMON_NAME_LEN = sizeof(PEN_OKUWAMON_NAME_ARR)-1; + inline static constexpr char PEN_OKUWAMON_FQNAME_ARR[] = "pen:Okuwamon"; + inline static constexpr const char* PEN_OKUWAMON_FQNAME = PEN_OKUWAMON_FQNAME_ARR; + inline static constexpr size_t PEN_OKUWAMON_FQNAME_LEN = sizeof(PEN_OKUWAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_OKUWAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_OKUWAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_OKUWAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_OKUWAMON_ANIM_INDEX = 59; + + // Name: Otamamon + inline static constexpr char PEN_OTAMAMON_FQID_ARR[] = "pen:otamamon"; + inline static constexpr const char* PEN_OTAMAMON_FQID = PEN_OTAMAMON_FQID_ARR; + inline static constexpr size_t PEN_OTAMAMON_FQID_LEN = sizeof(PEN_OTAMAMON_FQID_ARR)-1; + inline static constexpr char PEN_OTAMAMON_ID_ARR[] = "otamamon"; + inline static constexpr const char* PEN_OTAMAMON_ID = PEN_OTAMAMON_ID_ARR; + inline static constexpr size_t PEN_OTAMAMON_ID_LEN = sizeof(PEN_OTAMAMON_ID)-1; + inline static constexpr char PEN_OTAMAMON_NAME_ARR[] = "Otamamon"; + inline static constexpr const char* PEN_OTAMAMON_NAME = PEN_OTAMAMON_NAME_ARR; + inline static constexpr size_t PEN_OTAMAMON_NAME_LEN = sizeof(PEN_OTAMAMON_NAME_ARR)-1; + inline static constexpr char PEN_OTAMAMON_FQNAME_ARR[] = "pen:Otamamon"; + inline static constexpr const char* PEN_OTAMAMON_FQNAME = PEN_OTAMAMON_FQNAME_ARR; + inline static constexpr size_t PEN_OTAMAMON_FQNAME_LEN = sizeof(PEN_OTAMAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_OTAMAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_OTAMAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_OTAMAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_OTAMAMON_ANIM_INDEX = 60; + + // Name: Peti Meramon + inline static constexpr char PEN_PETI_MERAMON_FQID_ARR[] = "pen:peti_meramon"; + inline static constexpr const char* PEN_PETI_MERAMON_FQID = PEN_PETI_MERAMON_FQID_ARR; + inline static constexpr size_t PEN_PETI_MERAMON_FQID_LEN = sizeof(PEN_PETI_MERAMON_FQID_ARR)-1; + inline static constexpr char PEN_PETI_MERAMON_ID_ARR[] = "peti_meramon"; + inline static constexpr const char* PEN_PETI_MERAMON_ID = PEN_PETI_MERAMON_ID_ARR; + inline static constexpr size_t PEN_PETI_MERAMON_ID_LEN = sizeof(PEN_PETI_MERAMON_ID)-1; + inline static constexpr char PEN_PETI_MERAMON_NAME_ARR[] = "Peti Meramon"; + inline static constexpr const char* PEN_PETI_MERAMON_NAME = PEN_PETI_MERAMON_NAME_ARR; + inline static constexpr size_t PEN_PETI_MERAMON_NAME_LEN = sizeof(PEN_PETI_MERAMON_NAME_ARR)-1; + inline static constexpr char PEN_PETI_MERAMON_FQNAME_ARR[] = "pen:Peti Meramon"; + inline static constexpr const char* PEN_PETI_MERAMON_FQNAME = PEN_PETI_MERAMON_FQNAME_ARR; + inline static constexpr size_t PEN_PETI_MERAMON_FQNAME_LEN = sizeof(PEN_PETI_MERAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_PETI_MERAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_PETI_MERAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_PETI_MERAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_PETI_MERAMON_ANIM_INDEX = 61; + + // Name: Pico Devimon + inline static constexpr char PEN_PICO_DEVIMON_FQID_ARR[] = "pen:pico_devimon"; + inline static constexpr const char* PEN_PICO_DEVIMON_FQID = PEN_PICO_DEVIMON_FQID_ARR; + inline static constexpr size_t PEN_PICO_DEVIMON_FQID_LEN = sizeof(PEN_PICO_DEVIMON_FQID_ARR)-1; + inline static constexpr char PEN_PICO_DEVIMON_ID_ARR[] = "pico_devimon"; + inline static constexpr const char* PEN_PICO_DEVIMON_ID = PEN_PICO_DEVIMON_ID_ARR; + inline static constexpr size_t PEN_PICO_DEVIMON_ID_LEN = sizeof(PEN_PICO_DEVIMON_ID)-1; + inline static constexpr char PEN_PICO_DEVIMON_NAME_ARR[] = "Pico Devimon"; + inline static constexpr const char* PEN_PICO_DEVIMON_NAME = PEN_PICO_DEVIMON_NAME_ARR; + inline static constexpr size_t PEN_PICO_DEVIMON_NAME_LEN = sizeof(PEN_PICO_DEVIMON_NAME_ARR)-1; + inline static constexpr char PEN_PICO_DEVIMON_FQNAME_ARR[] = "pen:Pico Devimon"; + inline static constexpr const char* PEN_PICO_DEVIMON_FQNAME = PEN_PICO_DEVIMON_FQNAME_ARR; + inline static constexpr size_t PEN_PICO_DEVIMON_FQNAME_LEN = sizeof(PEN_PICO_DEVIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_PICO_DEVIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_PICO_DEVIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_PICO_DEVIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_PICO_DEVIMON_ANIM_INDEX = 62; + + // Name: Piemon + inline static constexpr char PEN_PIEMON_FQID_ARR[] = "pen:piemon"; + inline static constexpr const char* PEN_PIEMON_FQID = PEN_PIEMON_FQID_ARR; + inline static constexpr size_t PEN_PIEMON_FQID_LEN = sizeof(PEN_PIEMON_FQID_ARR)-1; + inline static constexpr char PEN_PIEMON_ID_ARR[] = "piemon"; + inline static constexpr const char* PEN_PIEMON_ID = PEN_PIEMON_ID_ARR; + inline static constexpr size_t PEN_PIEMON_ID_LEN = sizeof(PEN_PIEMON_ID)-1; + inline static constexpr char PEN_PIEMON_NAME_ARR[] = "Piemon"; + inline static constexpr const char* PEN_PIEMON_NAME = PEN_PIEMON_NAME_ARR; + inline static constexpr size_t PEN_PIEMON_NAME_LEN = sizeof(PEN_PIEMON_NAME_ARR)-1; + inline static constexpr char PEN_PIEMON_FQNAME_ARR[] = "pen:Piemon"; + inline static constexpr const char* PEN_PIEMON_FQNAME = PEN_PIEMON_FQNAME_ARR; + inline static constexpr size_t PEN_PIEMON_FQNAME_LEN = sizeof(PEN_PIEMON_FQNAME_ARR)-1; + inline static constexpr int PEN_PIEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_PIEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_PIEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_PIEMON_ANIM_INDEX = 63; + + // Name: Plesiomon + inline static constexpr char PEN_PLESIOMON_FQID_ARR[] = "pen:plesiomon"; + inline static constexpr const char* PEN_PLESIOMON_FQID = PEN_PLESIOMON_FQID_ARR; + inline static constexpr size_t PEN_PLESIOMON_FQID_LEN = sizeof(PEN_PLESIOMON_FQID_ARR)-1; + inline static constexpr char PEN_PLESIOMON_ID_ARR[] = "plesiomon"; + inline static constexpr const char* PEN_PLESIOMON_ID = PEN_PLESIOMON_ID_ARR; + inline static constexpr size_t PEN_PLESIOMON_ID_LEN = sizeof(PEN_PLESIOMON_ID)-1; + inline static constexpr char PEN_PLESIOMON_NAME_ARR[] = "Plesiomon"; + inline static constexpr const char* PEN_PLESIOMON_NAME = PEN_PLESIOMON_NAME_ARR; + inline static constexpr size_t PEN_PLESIOMON_NAME_LEN = sizeof(PEN_PLESIOMON_NAME_ARR)-1; + inline static constexpr char PEN_PLESIOMON_FQNAME_ARR[] = "pen:Plesiomon"; + inline static constexpr const char* PEN_PLESIOMON_FQNAME = PEN_PLESIOMON_FQNAME_ARR; + inline static constexpr size_t PEN_PLESIOMON_FQNAME_LEN = sizeof(PEN_PLESIOMON_FQNAME_ARR)-1; + inline static constexpr int PEN_PLESIOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_PLESIOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_PLESIOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_PLESIOMON_ANIM_INDEX = 64; + + // Name: Pukumon + inline static constexpr char PEN_PUKUMON_FQID_ARR[] = "pen:pukumon"; + inline static constexpr const char* PEN_PUKUMON_FQID = PEN_PUKUMON_FQID_ARR; + inline static constexpr size_t PEN_PUKUMON_FQID_LEN = sizeof(PEN_PUKUMON_FQID_ARR)-1; + inline static constexpr char PEN_PUKUMON_ID_ARR[] = "pukumon"; + inline static constexpr const char* PEN_PUKUMON_ID = PEN_PUKUMON_ID_ARR; + inline static constexpr size_t PEN_PUKUMON_ID_LEN = sizeof(PEN_PUKUMON_ID)-1; + inline static constexpr char PEN_PUKUMON_NAME_ARR[] = "Pukumon"; + inline static constexpr const char* PEN_PUKUMON_NAME = PEN_PUKUMON_NAME_ARR; + inline static constexpr size_t PEN_PUKUMON_NAME_LEN = sizeof(PEN_PUKUMON_NAME_ARR)-1; + inline static constexpr char PEN_PUKUMON_FQNAME_ARR[] = "pen:Pukumon"; + inline static constexpr const char* PEN_PUKUMON_FQNAME = PEN_PUKUMON_FQNAME_ARR; + inline static constexpr size_t PEN_PUKUMON_FQNAME_LEN = sizeof(PEN_PUKUMON_FQNAME_ARR)-1; + inline static constexpr int PEN_PUKUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_PUKUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_PUKUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_PUKUMON_ANIM_INDEX = 65; + + // Name: Pumpmon + inline static constexpr char PEN_PUMPMON_FQID_ARR[] = "pen:pumpmon"; + inline static constexpr const char* PEN_PUMPMON_FQID = PEN_PUMPMON_FQID_ARR; + inline static constexpr size_t PEN_PUMPMON_FQID_LEN = sizeof(PEN_PUMPMON_FQID_ARR)-1; + inline static constexpr char PEN_PUMPMON_ID_ARR[] = "pumpmon"; + inline static constexpr const char* PEN_PUMPMON_ID = PEN_PUMPMON_ID_ARR; + inline static constexpr size_t PEN_PUMPMON_ID_LEN = sizeof(PEN_PUMPMON_ID)-1; + inline static constexpr char PEN_PUMPMON_NAME_ARR[] = "Pumpmon"; + inline static constexpr const char* PEN_PUMPMON_NAME = PEN_PUMPMON_NAME_ARR; + inline static constexpr size_t PEN_PUMPMON_NAME_LEN = sizeof(PEN_PUMPMON_NAME_ARR)-1; + inline static constexpr char PEN_PUMPMON_FQNAME_ARR[] = "pen:Pumpmon"; + inline static constexpr const char* PEN_PUMPMON_FQNAME = PEN_PUMPMON_FQNAME_ARR; + inline static constexpr size_t PEN_PUMPMON_FQNAME_LEN = sizeof(PEN_PUMPMON_FQNAME_ARR)-1; + inline static constexpr int PEN_PUMPMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_PUMPMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_PUMPMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_PUMPMON_ANIM_INDEX = 66; + + // Name: Pyocomon + inline static constexpr char PEN_PYOCOMON_FQID_ARR[] = "pen:pyocomon"; + inline static constexpr const char* PEN_PYOCOMON_FQID = PEN_PYOCOMON_FQID_ARR; + inline static constexpr size_t PEN_PYOCOMON_FQID_LEN = sizeof(PEN_PYOCOMON_FQID_ARR)-1; + inline static constexpr char PEN_PYOCOMON_ID_ARR[] = "pyocomon"; + inline static constexpr const char* PEN_PYOCOMON_ID = PEN_PYOCOMON_ID_ARR; + inline static constexpr size_t PEN_PYOCOMON_ID_LEN = sizeof(PEN_PYOCOMON_ID)-1; + inline static constexpr char PEN_PYOCOMON_NAME_ARR[] = "Pyocomon"; + inline static constexpr const char* PEN_PYOCOMON_NAME = PEN_PYOCOMON_NAME_ARR; + inline static constexpr size_t PEN_PYOCOMON_NAME_LEN = sizeof(PEN_PYOCOMON_NAME_ARR)-1; + inline static constexpr char PEN_PYOCOMON_FQNAME_ARR[] = "pen:Pyocomon"; + inline static constexpr const char* PEN_PYOCOMON_FQNAME = PEN_PYOCOMON_FQNAME_ARR; + inline static constexpr size_t PEN_PYOCOMON_FQNAME_LEN = sizeof(PEN_PYOCOMON_FQNAME_ARR)-1; + inline static constexpr int PEN_PYOCOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_PYOCOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_PYOCOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_PYOCOMON_ANIM_INDEX = 67; + + // Name: Rakamon + inline static constexpr char PEN_RAKAMON_FQID_ARR[] = "pen:rakamon"; + inline static constexpr const char* PEN_RAKAMON_FQID = PEN_RAKAMON_FQID_ARR; + inline static constexpr size_t PEN_RAKAMON_FQID_LEN = sizeof(PEN_RAKAMON_FQID_ARR)-1; + inline static constexpr char PEN_RAKAMON_ID_ARR[] = "rakamon"; + inline static constexpr const char* PEN_RAKAMON_ID = PEN_RAKAMON_ID_ARR; + inline static constexpr size_t PEN_RAKAMON_ID_LEN = sizeof(PEN_RAKAMON_ID)-1; + inline static constexpr char PEN_RAKAMON_NAME_ARR[] = "Rakamon"; + inline static constexpr const char* PEN_RAKAMON_NAME = PEN_RAKAMON_NAME_ARR; + inline static constexpr size_t PEN_RAKAMON_NAME_LEN = sizeof(PEN_RAKAMON_NAME_ARR)-1; + inline static constexpr char PEN_RAKAMON_FQNAME_ARR[] = "pen:Rakamon"; + inline static constexpr const char* PEN_RAKAMON_FQNAME = PEN_RAKAMON_FQNAME_ARR; + inline static constexpr size_t PEN_RAKAMON_FQNAME_LEN = sizeof(PEN_RAKAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_RAKAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_RAKAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_RAKAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_RAKAMON_ANIM_INDEX = 68; + + // Name: Red Vegimon + inline static constexpr char PEN_RED_VEGIMON_FQID_ARR[] = "pen:red_vegimon"; + inline static constexpr const char* PEN_RED_VEGIMON_FQID = PEN_RED_VEGIMON_FQID_ARR; + inline static constexpr size_t PEN_RED_VEGIMON_FQID_LEN = sizeof(PEN_RED_VEGIMON_FQID_ARR)-1; + inline static constexpr char PEN_RED_VEGIMON_ID_ARR[] = "red_vegimon"; + inline static constexpr const char* PEN_RED_VEGIMON_ID = PEN_RED_VEGIMON_ID_ARR; + inline static constexpr size_t PEN_RED_VEGIMON_ID_LEN = sizeof(PEN_RED_VEGIMON_ID)-1; + inline static constexpr char PEN_RED_VEGIMON_NAME_ARR[] = "Red Vegimon"; + inline static constexpr const char* PEN_RED_VEGIMON_NAME = PEN_RED_VEGIMON_NAME_ARR; + inline static constexpr size_t PEN_RED_VEGIMON_NAME_LEN = sizeof(PEN_RED_VEGIMON_NAME_ARR)-1; + inline static constexpr char PEN_RED_VEGIMON_FQNAME_ARR[] = "pen:Red Vegimon"; + inline static constexpr const char* PEN_RED_VEGIMON_FQNAME = PEN_RED_VEGIMON_FQNAME_ARR; + inline static constexpr size_t PEN_RED_VEGIMON_FQNAME_LEN = sizeof(PEN_RED_VEGIMON_FQNAME_ARR)-1; + inline static constexpr int PEN_RED_VEGIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_RED_VEGIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_RED_VEGIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_RED_VEGIMON_ANIM_INDEX = 69; + + // Name: Revolmon + inline static constexpr char PEN_REVOLMON_FQID_ARR[] = "pen:revolmon"; + inline static constexpr const char* PEN_REVOLMON_FQID = PEN_REVOLMON_FQID_ARR; + inline static constexpr size_t PEN_REVOLMON_FQID_LEN = sizeof(PEN_REVOLMON_FQID_ARR)-1; + inline static constexpr char PEN_REVOLMON_ID_ARR[] = "revolmon"; + inline static constexpr const char* PEN_REVOLMON_ID = PEN_REVOLMON_ID_ARR; + inline static constexpr size_t PEN_REVOLMON_ID_LEN = sizeof(PEN_REVOLMON_ID)-1; + inline static constexpr char PEN_REVOLMON_NAME_ARR[] = "Revolmon"; + inline static constexpr const char* PEN_REVOLMON_NAME = PEN_REVOLMON_NAME_ARR; + inline static constexpr size_t PEN_REVOLMON_NAME_LEN = sizeof(PEN_REVOLMON_NAME_ARR)-1; + inline static constexpr char PEN_REVOLMON_FQNAME_ARR[] = "pen:Revolmon"; + inline static constexpr const char* PEN_REVOLMON_FQNAME = PEN_REVOLMON_FQNAME_ARR; + inline static constexpr size_t PEN_REVOLMON_FQNAME_LEN = sizeof(PEN_REVOLMON_FQNAME_ARR)-1; + inline static constexpr int PEN_REVOLMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_REVOLMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_REVOLMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_REVOLMON_ANIM_INDEX = 70; + + // Name: Rosemon + inline static constexpr char PEN_ROSEMON_FQID_ARR[] = "pen:rosemon"; + inline static constexpr const char* PEN_ROSEMON_FQID = PEN_ROSEMON_FQID_ARR; + inline static constexpr size_t PEN_ROSEMON_FQID_LEN = sizeof(PEN_ROSEMON_FQID_ARR)-1; + inline static constexpr char PEN_ROSEMON_ID_ARR[] = "rosemon"; + inline static constexpr const char* PEN_ROSEMON_ID = PEN_ROSEMON_ID_ARR; + inline static constexpr size_t PEN_ROSEMON_ID_LEN = sizeof(PEN_ROSEMON_ID)-1; + inline static constexpr char PEN_ROSEMON_NAME_ARR[] = "Rosemon"; + inline static constexpr const char* PEN_ROSEMON_NAME = PEN_ROSEMON_NAME_ARR; + inline static constexpr size_t PEN_ROSEMON_NAME_LEN = sizeof(PEN_ROSEMON_NAME_ARR)-1; + inline static constexpr char PEN_ROSEMON_FQNAME_ARR[] = "pen:Rosemon"; + inline static constexpr const char* PEN_ROSEMON_FQNAME = PEN_ROSEMON_FQNAME_ARR; + inline static constexpr size_t PEN_ROSEMON_FQNAME_LEN = sizeof(PEN_ROSEMON_FQNAME_ARR)-1; + inline static constexpr int PEN_ROSEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_ROSEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_ROSEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_ROSEMON_ANIM_INDEX = 71; + + // Name: Saber Leomon + inline static constexpr char PEN_SABER_LEOMON_FQID_ARR[] = "pen:saber_leomon"; + inline static constexpr const char* PEN_SABER_LEOMON_FQID = PEN_SABER_LEOMON_FQID_ARR; + inline static constexpr size_t PEN_SABER_LEOMON_FQID_LEN = sizeof(PEN_SABER_LEOMON_FQID_ARR)-1; + inline static constexpr char PEN_SABER_LEOMON_ID_ARR[] = "saber_leomon"; + inline static constexpr const char* PEN_SABER_LEOMON_ID = PEN_SABER_LEOMON_ID_ARR; + inline static constexpr size_t PEN_SABER_LEOMON_ID_LEN = sizeof(PEN_SABER_LEOMON_ID)-1; + inline static constexpr char PEN_SABER_LEOMON_NAME_ARR[] = "Saber Leomon"; + inline static constexpr const char* PEN_SABER_LEOMON_NAME = PEN_SABER_LEOMON_NAME_ARR; + inline static constexpr size_t PEN_SABER_LEOMON_NAME_LEN = sizeof(PEN_SABER_LEOMON_NAME_ARR)-1; + inline static constexpr char PEN_SABER_LEOMON_FQNAME_ARR[] = "pen:Saber Leomon"; + inline static constexpr const char* PEN_SABER_LEOMON_FQNAME = PEN_SABER_LEOMON_FQNAME_ARR; + inline static constexpr size_t PEN_SABER_LEOMON_FQNAME_LEN = sizeof(PEN_SABER_LEOMON_FQNAME_ARR)-1; + inline static constexpr int PEN_SABER_LEOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_SABER_LEOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_SABER_LEOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_SABER_LEOMON_ANIM_INDEX = 72; + + // Name: Shakomon + inline static constexpr char PEN_SHAKOMON_FQID_ARR[] = "pen:shakomon"; + inline static constexpr const char* PEN_SHAKOMON_FQID = PEN_SHAKOMON_FQID_ARR; + inline static constexpr size_t PEN_SHAKOMON_FQID_LEN = sizeof(PEN_SHAKOMON_FQID_ARR)-1; + inline static constexpr char PEN_SHAKOMON_ID_ARR[] = "shakomon"; + inline static constexpr const char* PEN_SHAKOMON_ID = PEN_SHAKOMON_ID_ARR; + inline static constexpr size_t PEN_SHAKOMON_ID_LEN = sizeof(PEN_SHAKOMON_ID)-1; + inline static constexpr char PEN_SHAKOMON_NAME_ARR[] = "Shakomon"; + inline static constexpr const char* PEN_SHAKOMON_NAME = PEN_SHAKOMON_NAME_ARR; + inline static constexpr size_t PEN_SHAKOMON_NAME_LEN = sizeof(PEN_SHAKOMON_NAME_ARR)-1; + inline static constexpr char PEN_SHAKOMON_FQNAME_ARR[] = "pen:Shakomon"; + inline static constexpr const char* PEN_SHAKOMON_FQNAME = PEN_SHAKOMON_FQNAME_ARR; + inline static constexpr size_t PEN_SHAKOMON_FQNAME_LEN = sizeof(PEN_SHAKOMON_FQNAME_ARR)-1; + inline static constexpr int PEN_SHAKOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_SHAKOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_SHAKOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_SHAKOMON_ANIM_INDEX = 73; + + // Name: Starmon + inline static constexpr char PEN_STARMON_FQID_ARR[] = "pen:starmon"; + inline static constexpr const char* PEN_STARMON_FQID = PEN_STARMON_FQID_ARR; + inline static constexpr size_t PEN_STARMON_FQID_LEN = sizeof(PEN_STARMON_FQID_ARR)-1; + inline static constexpr char PEN_STARMON_ID_ARR[] = "starmon"; + inline static constexpr const char* PEN_STARMON_ID = PEN_STARMON_ID_ARR; + inline static constexpr size_t PEN_STARMON_ID_LEN = sizeof(PEN_STARMON_ID)-1; + inline static constexpr char PEN_STARMON_NAME_ARR[] = "Starmon"; + inline static constexpr const char* PEN_STARMON_NAME = PEN_STARMON_NAME_ARR; + inline static constexpr size_t PEN_STARMON_NAME_LEN = sizeof(PEN_STARMON_NAME_ARR)-1; + inline static constexpr char PEN_STARMON_FQNAME_ARR[] = "pen:Starmon"; + inline static constexpr const char* PEN_STARMON_FQNAME = PEN_STARMON_FQNAME_ARR; + inline static constexpr size_t PEN_STARMON_FQNAME_LEN = sizeof(PEN_STARMON_FQNAME_ARR)-1; + inline static constexpr int PEN_STARMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_STARMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_STARMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_STARMON_ANIM_INDEX = 74; + + // Name: Tailmon + inline static constexpr char PEN_TAILMON_FQID_ARR[] = "pen:tailmon"; + inline static constexpr const char* PEN_TAILMON_FQID = PEN_TAILMON_FQID_ARR; + inline static constexpr size_t PEN_TAILMON_FQID_LEN = sizeof(PEN_TAILMON_FQID_ARR)-1; + inline static constexpr char PEN_TAILMON_ID_ARR[] = "tailmon"; + inline static constexpr const char* PEN_TAILMON_ID = PEN_TAILMON_ID_ARR; + inline static constexpr size_t PEN_TAILMON_ID_LEN = sizeof(PEN_TAILMON_ID)-1; + inline static constexpr char PEN_TAILMON_NAME_ARR[] = "Tailmon"; + inline static constexpr const char* PEN_TAILMON_NAME = PEN_TAILMON_NAME_ARR; + inline static constexpr size_t PEN_TAILMON_NAME_LEN = sizeof(PEN_TAILMON_NAME_ARR)-1; + inline static constexpr char PEN_TAILMON_FQNAME_ARR[] = "pen:Tailmon"; + inline static constexpr const char* PEN_TAILMON_FQNAME = PEN_TAILMON_FQNAME_ARR; + inline static constexpr size_t PEN_TAILMON_FQNAME_LEN = sizeof(PEN_TAILMON_FQNAME_ARR)-1; + inline static constexpr int PEN_TAILMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_TAILMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_TAILMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_TAILMON_ANIM_INDEX = 75; + + // Name: Tankmon + inline static constexpr char PEN_TANKMON_FQID_ARR[] = "pen:tankmon"; + inline static constexpr const char* PEN_TANKMON_FQID = PEN_TANKMON_FQID_ARR; + inline static constexpr size_t PEN_TANKMON_FQID_LEN = sizeof(PEN_TANKMON_FQID_ARR)-1; + inline static constexpr char PEN_TANKMON_ID_ARR[] = "tankmon"; + inline static constexpr const char* PEN_TANKMON_ID = PEN_TANKMON_ID_ARR; + inline static constexpr size_t PEN_TANKMON_ID_LEN = sizeof(PEN_TANKMON_ID)-1; + inline static constexpr char PEN_TANKMON_NAME_ARR[] = "Tankmon"; + inline static constexpr const char* PEN_TANKMON_NAME = PEN_TANKMON_NAME_ARR; + inline static constexpr size_t PEN_TANKMON_NAME_LEN = sizeof(PEN_TANKMON_NAME_ARR)-1; + inline static constexpr char PEN_TANKMON_FQNAME_ARR[] = "pen:Tankmon"; + inline static constexpr const char* PEN_TANKMON_FQNAME = PEN_TANKMON_FQNAME_ARR; + inline static constexpr size_t PEN_TANKMON_FQNAME_LEN = sizeof(PEN_TANKMON_FQNAME_ARR)-1; + inline static constexpr int PEN_TANKMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_TANKMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_TANKMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_TANKMON_ANIM_INDEX = 76; + + // Name: Tentomon + inline static constexpr char PEN_TENTOMON_FQID_ARR[] = "pen:tentomon"; + inline static constexpr const char* PEN_TENTOMON_FQID = PEN_TENTOMON_FQID_ARR; + inline static constexpr size_t PEN_TENTOMON_FQID_LEN = sizeof(PEN_TENTOMON_FQID_ARR)-1; + inline static constexpr char PEN_TENTOMON_ID_ARR[] = "tentomon"; + inline static constexpr const char* PEN_TENTOMON_ID = PEN_TENTOMON_ID_ARR; + inline static constexpr size_t PEN_TENTOMON_ID_LEN = sizeof(PEN_TENTOMON_ID)-1; + inline static constexpr char PEN_TENTOMON_NAME_ARR[] = "Tentomon"; + inline static constexpr const char* PEN_TENTOMON_NAME = PEN_TENTOMON_NAME_ARR; + inline static constexpr size_t PEN_TENTOMON_NAME_LEN = sizeof(PEN_TENTOMON_NAME_ARR)-1; + inline static constexpr char PEN_TENTOMON_FQNAME_ARR[] = "pen:Tentomon"; + inline static constexpr const char* PEN_TENTOMON_FQNAME = PEN_TENTOMON_FQNAME_ARR; + inline static constexpr size_t PEN_TENTOMON_FQNAME_LEN = sizeof(PEN_TENTOMON_FQNAME_ARR)-1; + inline static constexpr int PEN_TENTOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_TENTOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_TENTOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_TENTOMON_ANIM_INDEX = 77; + + // Name: Thunderballmon + inline static constexpr char PEN_THUNDERBALLMON_FQID_ARR[] = "pen:thunderballmon"; + inline static constexpr const char* PEN_THUNDERBALLMON_FQID = PEN_THUNDERBALLMON_FQID_ARR; + inline static constexpr size_t PEN_THUNDERBALLMON_FQID_LEN = sizeof(PEN_THUNDERBALLMON_FQID_ARR)-1; + inline static constexpr char PEN_THUNDERBALLMON_ID_ARR[] = "thunderballmon"; + inline static constexpr const char* PEN_THUNDERBALLMON_ID = PEN_THUNDERBALLMON_ID_ARR; + inline static constexpr size_t PEN_THUNDERBALLMON_ID_LEN = sizeof(PEN_THUNDERBALLMON_ID)-1; + inline static constexpr char PEN_THUNDERBALLMON_NAME_ARR[] = "Thunderballmon"; + inline static constexpr const char* PEN_THUNDERBALLMON_NAME = PEN_THUNDERBALLMON_NAME_ARR; + inline static constexpr size_t PEN_THUNDERBALLMON_NAME_LEN = sizeof(PEN_THUNDERBALLMON_NAME_ARR)-1; + inline static constexpr char PEN_THUNDERBALLMON_FQNAME_ARR[] = "pen:Thunderballmon"; + inline static constexpr const char* PEN_THUNDERBALLMON_FQNAME = PEN_THUNDERBALLMON_FQNAME_ARR; + inline static constexpr size_t PEN_THUNDERBALLMON_FQNAME_LEN = sizeof(PEN_THUNDERBALLMON_FQNAME_ARR)-1; + inline static constexpr int PEN_THUNDERBALLMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_THUNDERBALLMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_THUNDERBALLMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_THUNDERBALLMON_ANIM_INDEX = 78; + + // Name: Togemon + inline static constexpr char PEN_TOGEMON_FQID_ARR[] = "pen:togemon"; + inline static constexpr const char* PEN_TOGEMON_FQID = PEN_TOGEMON_FQID_ARR; + inline static constexpr size_t PEN_TOGEMON_FQID_LEN = sizeof(PEN_TOGEMON_FQID_ARR)-1; + inline static constexpr char PEN_TOGEMON_ID_ARR[] = "togemon"; + inline static constexpr const char* PEN_TOGEMON_ID = PEN_TOGEMON_ID_ARR; + inline static constexpr size_t PEN_TOGEMON_ID_LEN = sizeof(PEN_TOGEMON_ID)-1; + inline static constexpr char PEN_TOGEMON_NAME_ARR[] = "Togemon"; + inline static constexpr const char* PEN_TOGEMON_NAME = PEN_TOGEMON_NAME_ARR; + inline static constexpr size_t PEN_TOGEMON_NAME_LEN = sizeof(PEN_TOGEMON_NAME_ARR)-1; + inline static constexpr char PEN_TOGEMON_FQNAME_ARR[] = "pen:Togemon"; + inline static constexpr const char* PEN_TOGEMON_FQNAME = PEN_TOGEMON_FQNAME_ARR; + inline static constexpr size_t PEN_TOGEMON_FQNAME_LEN = sizeof(PEN_TOGEMON_FQNAME_ARR)-1; + inline static constexpr int PEN_TOGEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_TOGEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_TOGEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_TOGEMON_ANIM_INDEX = 79; + + // Name: Tonosama Gekomon + inline static constexpr char PEN_TONOSAMA_GEKOMON_FQID_ARR[] = "pen:tonosama_gekomon"; + inline static constexpr const char* PEN_TONOSAMA_GEKOMON_FQID = PEN_TONOSAMA_GEKOMON_FQID_ARR; + inline static constexpr size_t PEN_TONOSAMA_GEKOMON_FQID_LEN = sizeof(PEN_TONOSAMA_GEKOMON_FQID_ARR)-1; + inline static constexpr char PEN_TONOSAMA_GEKOMON_ID_ARR[] = "tonosama_gekomon"; + inline static constexpr const char* PEN_TONOSAMA_GEKOMON_ID = PEN_TONOSAMA_GEKOMON_ID_ARR; + inline static constexpr size_t PEN_TONOSAMA_GEKOMON_ID_LEN = sizeof(PEN_TONOSAMA_GEKOMON_ID)-1; + inline static constexpr char PEN_TONOSAMA_GEKOMON_NAME_ARR[] = "Tonosama Gekomon"; + inline static constexpr const char* PEN_TONOSAMA_GEKOMON_NAME = PEN_TONOSAMA_GEKOMON_NAME_ARR; + inline static constexpr size_t PEN_TONOSAMA_GEKOMON_NAME_LEN = sizeof(PEN_TONOSAMA_GEKOMON_NAME_ARR)-1; + inline static constexpr char PEN_TONOSAMA_GEKOMON_FQNAME_ARR[] = "pen:Tonosama Gekomon"; + inline static constexpr const char* PEN_TONOSAMA_GEKOMON_FQNAME = PEN_TONOSAMA_GEKOMON_FQNAME_ARR; + inline static constexpr size_t PEN_TONOSAMA_GEKOMON_FQNAME_LEN = sizeof(PEN_TONOSAMA_GEKOMON_FQNAME_ARR)-1; + inline static constexpr int PEN_TONOSAMA_GEKOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_TONOSAMA_GEKOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_TONOSAMA_GEKOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_TONOSAMA_GEKOMON_ANIM_INDEX = 80; + + // Name: Tortamon + inline static constexpr char PEN_TORTAMON_FQID_ARR[] = "pen:tortamon"; + inline static constexpr const char* PEN_TORTAMON_FQID = PEN_TORTAMON_FQID_ARR; + inline static constexpr size_t PEN_TORTAMON_FQID_LEN = sizeof(PEN_TORTAMON_FQID_ARR)-1; + inline static constexpr char PEN_TORTAMON_ID_ARR[] = "tortamon"; + inline static constexpr const char* PEN_TORTAMON_ID = PEN_TORTAMON_ID_ARR; + inline static constexpr size_t PEN_TORTAMON_ID_LEN = sizeof(PEN_TORTAMON_ID)-1; + inline static constexpr char PEN_TORTAMON_NAME_ARR[] = "Tortamon"; + inline static constexpr const char* PEN_TORTAMON_NAME = PEN_TORTAMON_NAME_ARR; + inline static constexpr size_t PEN_TORTAMON_NAME_LEN = sizeof(PEN_TORTAMON_NAME_ARR)-1; + inline static constexpr char PEN_TORTAMON_FQNAME_ARR[] = "pen:Tortamon"; + inline static constexpr const char* PEN_TORTAMON_FQNAME = PEN_TORTAMON_FQNAME_ARR; + inline static constexpr size_t PEN_TORTAMON_FQNAME_LEN = sizeof(PEN_TORTAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_TORTAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_TORTAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_TORTAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_TORTAMON_ANIM_INDEX = 81; + + // Name: Toy Agumon + inline static constexpr char PEN_TOY_AGUMON_FQID_ARR[] = "pen:toy_agumon"; + inline static constexpr const char* PEN_TOY_AGUMON_FQID = PEN_TOY_AGUMON_FQID_ARR; + inline static constexpr size_t PEN_TOY_AGUMON_FQID_LEN = sizeof(PEN_TOY_AGUMON_FQID_ARR)-1; + inline static constexpr char PEN_TOY_AGUMON_ID_ARR[] = "toy_agumon"; + inline static constexpr const char* PEN_TOY_AGUMON_ID = PEN_TOY_AGUMON_ID_ARR; + inline static constexpr size_t PEN_TOY_AGUMON_ID_LEN = sizeof(PEN_TOY_AGUMON_ID)-1; + inline static constexpr char PEN_TOY_AGUMON_NAME_ARR[] = "Toy Agumon"; + inline static constexpr const char* PEN_TOY_AGUMON_NAME = PEN_TOY_AGUMON_NAME_ARR; + inline static constexpr size_t PEN_TOY_AGUMON_NAME_LEN = sizeof(PEN_TOY_AGUMON_NAME_ARR)-1; + inline static constexpr char PEN_TOY_AGUMON_FQNAME_ARR[] = "pen:Toy Agumon"; + inline static constexpr const char* PEN_TOY_AGUMON_FQNAME = PEN_TOY_AGUMON_FQNAME_ARR; + inline static constexpr size_t PEN_TOY_AGUMON_FQNAME_LEN = sizeof(PEN_TOY_AGUMON_FQNAME_ARR)-1; + inline static constexpr int PEN_TOY_AGUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_TOY_AGUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_TOY_AGUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_TOY_AGUMON_ANIM_INDEX = 82; + + // Name: Triceramon + inline static constexpr char PEN_TRICERAMON_FQID_ARR[] = "pen:triceramon"; + inline static constexpr const char* PEN_TRICERAMON_FQID = PEN_TRICERAMON_FQID_ARR; + inline static constexpr size_t PEN_TRICERAMON_FQID_LEN = sizeof(PEN_TRICERAMON_FQID_ARR)-1; + inline static constexpr char PEN_TRICERAMON_ID_ARR[] = "triceramon"; + inline static constexpr const char* PEN_TRICERAMON_ID = PEN_TRICERAMON_ID_ARR; + inline static constexpr size_t PEN_TRICERAMON_ID_LEN = sizeof(PEN_TRICERAMON_ID)-1; + inline static constexpr char PEN_TRICERAMON_NAME_ARR[] = "Triceramon"; + inline static constexpr const char* PEN_TRICERAMON_NAME = PEN_TRICERAMON_NAME_ARR; + inline static constexpr size_t PEN_TRICERAMON_NAME_LEN = sizeof(PEN_TRICERAMON_NAME_ARR)-1; + inline static constexpr char PEN_TRICERAMON_FQNAME_ARR[] = "pen:Triceramon"; + inline static constexpr const char* PEN_TRICERAMON_FQNAME = PEN_TRICERAMON_FQNAME_ARR; + inline static constexpr size_t PEN_TRICERAMON_FQNAME_LEN = sizeof(PEN_TRICERAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_TRICERAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_TRICERAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_TRICERAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_TRICERAMON_ANIM_INDEX = 83; + + // Name: V-dramon + inline static constexpr char PEN_V_DRAMON_FQID_ARR[] = "pen:v_dramon"; + inline static constexpr const char* PEN_V_DRAMON_FQID = PEN_V_DRAMON_FQID_ARR; + inline static constexpr size_t PEN_V_DRAMON_FQID_LEN = sizeof(PEN_V_DRAMON_FQID_ARR)-1; + inline static constexpr char PEN_V_DRAMON_ID_ARR[] = "v_dramon"; + inline static constexpr const char* PEN_V_DRAMON_ID = PEN_V_DRAMON_ID_ARR; + inline static constexpr size_t PEN_V_DRAMON_ID_LEN = sizeof(PEN_V_DRAMON_ID)-1; + inline static constexpr char PEN_V_DRAMON_NAME_ARR[] = "V-dramon"; + inline static constexpr const char* PEN_V_DRAMON_NAME = PEN_V_DRAMON_NAME_ARR; + inline static constexpr size_t PEN_V_DRAMON_NAME_LEN = sizeof(PEN_V_DRAMON_NAME_ARR)-1; + inline static constexpr char PEN_V_DRAMON_FQNAME_ARR[] = "pen:V-dramon"; + inline static constexpr const char* PEN_V_DRAMON_FQNAME = PEN_V_DRAMON_FQNAME_ARR; + inline static constexpr size_t PEN_V_DRAMON_FQNAME_LEN = sizeof(PEN_V_DRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN_V_DRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_V_DRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_V_DRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_V_DRAMON_ANIM_INDEX = 84; + + // Name: Vemdemon + inline static constexpr char PEN_VEMDEMON_FQID_ARR[] = "pen:vemdemon"; + inline static constexpr const char* PEN_VEMDEMON_FQID = PEN_VEMDEMON_FQID_ARR; + inline static constexpr size_t PEN_VEMDEMON_FQID_LEN = sizeof(PEN_VEMDEMON_FQID_ARR)-1; + inline static constexpr char PEN_VEMDEMON_ID_ARR[] = "vemdemon"; + inline static constexpr const char* PEN_VEMDEMON_ID = PEN_VEMDEMON_ID_ARR; + inline static constexpr size_t PEN_VEMDEMON_ID_LEN = sizeof(PEN_VEMDEMON_ID)-1; + inline static constexpr char PEN_VEMDEMON_NAME_ARR[] = "Vemdemon"; + inline static constexpr const char* PEN_VEMDEMON_NAME = PEN_VEMDEMON_NAME_ARR; + inline static constexpr size_t PEN_VEMDEMON_NAME_LEN = sizeof(PEN_VEMDEMON_NAME_ARR)-1; + inline static constexpr char PEN_VEMDEMON_FQNAME_ARR[] = "pen:Vemdemon"; + inline static constexpr const char* PEN_VEMDEMON_FQNAME = PEN_VEMDEMON_FQNAME_ARR; + inline static constexpr size_t PEN_VEMDEMON_FQNAME_LEN = sizeof(PEN_VEMDEMON_FQNAME_ARR)-1; + inline static constexpr int PEN_VEMDEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_VEMDEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_VEMDEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_VEMDEMON_ANIM_INDEX = 85; + + // Name: Venom Vamdemon + inline static constexpr char PEN_VENOM_VAMDEMON_FQID_ARR[] = "pen:venom_vamdemon"; + inline static constexpr const char* PEN_VENOM_VAMDEMON_FQID = PEN_VENOM_VAMDEMON_FQID_ARR; + inline static constexpr size_t PEN_VENOM_VAMDEMON_FQID_LEN = sizeof(PEN_VENOM_VAMDEMON_FQID_ARR)-1; + inline static constexpr char PEN_VENOM_VAMDEMON_ID_ARR[] = "venom_vamdemon"; + inline static constexpr const char* PEN_VENOM_VAMDEMON_ID = PEN_VENOM_VAMDEMON_ID_ARR; + inline static constexpr size_t PEN_VENOM_VAMDEMON_ID_LEN = sizeof(PEN_VENOM_VAMDEMON_ID)-1; + inline static constexpr char PEN_VENOM_VAMDEMON_NAME_ARR[] = "Venom Vamdemon"; + inline static constexpr const char* PEN_VENOM_VAMDEMON_NAME = PEN_VENOM_VAMDEMON_NAME_ARR; + inline static constexpr size_t PEN_VENOM_VAMDEMON_NAME_LEN = sizeof(PEN_VENOM_VAMDEMON_NAME_ARR)-1; + inline static constexpr char PEN_VENOM_VAMDEMON_FQNAME_ARR[] = "pen:Venom Vamdemon"; + inline static constexpr const char* PEN_VENOM_VAMDEMON_FQNAME = PEN_VENOM_VAMDEMON_FQNAME_ARR; + inline static constexpr size_t PEN_VENOM_VAMDEMON_FQNAME_LEN = sizeof(PEN_VENOM_VAMDEMON_FQNAME_ARR)-1; + inline static constexpr int PEN_VENOM_VAMDEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_VENOM_VAMDEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_VENOM_VAMDEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_VENOM_VAMDEMON_ANIM_INDEX = 86; + + // Name: Waru Mozaemon + inline static constexpr char PEN_WARU_MOZAEMON_FQID_ARR[] = "pen:waru_mozaemon"; + inline static constexpr const char* PEN_WARU_MOZAEMON_FQID = PEN_WARU_MOZAEMON_FQID_ARR; + inline static constexpr size_t PEN_WARU_MOZAEMON_FQID_LEN = sizeof(PEN_WARU_MOZAEMON_FQID_ARR)-1; + inline static constexpr char PEN_WARU_MOZAEMON_ID_ARR[] = "waru_mozaemon"; + inline static constexpr const char* PEN_WARU_MOZAEMON_ID = PEN_WARU_MOZAEMON_ID_ARR; + inline static constexpr size_t PEN_WARU_MOZAEMON_ID_LEN = sizeof(PEN_WARU_MOZAEMON_ID)-1; + inline static constexpr char PEN_WARU_MOZAEMON_NAME_ARR[] = "Waru Mozaemon"; + inline static constexpr const char* PEN_WARU_MOZAEMON_NAME = PEN_WARU_MOZAEMON_NAME_ARR; + inline static constexpr size_t PEN_WARU_MOZAEMON_NAME_LEN = sizeof(PEN_WARU_MOZAEMON_NAME_ARR)-1; + inline static constexpr char PEN_WARU_MOZAEMON_FQNAME_ARR[] = "pen:Waru Mozaemon"; + inline static constexpr const char* PEN_WARU_MOZAEMON_FQNAME = PEN_WARU_MOZAEMON_FQNAME_ARR; + inline static constexpr size_t PEN_WARU_MOZAEMON_FQNAME_LEN = sizeof(PEN_WARU_MOZAEMON_FQNAME_ARR)-1; + inline static constexpr int PEN_WARU_MOZAEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_WARU_MOZAEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_WARU_MOZAEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_WARU_MOZAEMON_ANIM_INDEX = 87; + + // Name: Wizarmon + inline static constexpr char PEN_WIZARMON_FQID_ARR[] = "pen:wizarmon"; + inline static constexpr const char* PEN_WIZARMON_FQID = PEN_WIZARMON_FQID_ARR; + inline static constexpr size_t PEN_WIZARMON_FQID_LEN = sizeof(PEN_WIZARMON_FQID_ARR)-1; + inline static constexpr char PEN_WIZARMON_ID_ARR[] = "wizarmon"; + inline static constexpr const char* PEN_WIZARMON_ID = PEN_WIZARMON_ID_ARR; + inline static constexpr size_t PEN_WIZARMON_ID_LEN = sizeof(PEN_WIZARMON_ID)-1; + inline static constexpr char PEN_WIZARMON_NAME_ARR[] = "Wizarmon"; + inline static constexpr const char* PEN_WIZARMON_NAME = PEN_WIZARMON_NAME_ARR; + inline static constexpr size_t PEN_WIZARMON_NAME_LEN = sizeof(PEN_WIZARMON_NAME_ARR)-1; + inline static constexpr char PEN_WIZARMON_FQNAME_ARR[] = "pen:Wizarmon"; + inline static constexpr const char* PEN_WIZARMON_FQNAME = PEN_WIZARMON_FQNAME_ARR; + inline static constexpr size_t PEN_WIZARMON_FQNAME_LEN = sizeof(PEN_WIZARMON_FQNAME_ARR)-1; + inline static constexpr int PEN_WIZARMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_WIZARMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_WIZARMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_WIZARMON_ANIM_INDEX = 88; + + // Name: Woodmon + inline static constexpr char PEN_WOODMON_FQID_ARR[] = "pen:woodmon"; + inline static constexpr const char* PEN_WOODMON_FQID = PEN_WOODMON_FQID_ARR; + inline static constexpr size_t PEN_WOODMON_FQID_LEN = sizeof(PEN_WOODMON_FQID_ARR)-1; + inline static constexpr char PEN_WOODMON_ID_ARR[] = "woodmon"; + inline static constexpr const char* PEN_WOODMON_ID = PEN_WOODMON_ID_ARR; + inline static constexpr size_t PEN_WOODMON_ID_LEN = sizeof(PEN_WOODMON_ID)-1; + inline static constexpr char PEN_WOODMON_NAME_ARR[] = "Woodmon"; + inline static constexpr const char* PEN_WOODMON_NAME = PEN_WOODMON_NAME_ARR; + inline static constexpr size_t PEN_WOODMON_NAME_LEN = sizeof(PEN_WOODMON_NAME_ARR)-1; + inline static constexpr char PEN_WOODMON_FQNAME_ARR[] = "pen:Woodmon"; + inline static constexpr const char* PEN_WOODMON_FQNAME = PEN_WOODMON_FQNAME_ARR; + inline static constexpr size_t PEN_WOODMON_FQNAME_LEN = sizeof(PEN_WOODMON_FQNAME_ARR)-1; + inline static constexpr int PEN_WOODMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_WOODMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_WOODMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_WOODMON_ANIM_INDEX = 89; + + // Name: Zudomom + inline static constexpr char PEN_ZUDOMOM_FQID_ARR[] = "pen:zudomom"; + inline static constexpr const char* PEN_ZUDOMOM_FQID = PEN_ZUDOMOM_FQID_ARR; + inline static constexpr size_t PEN_ZUDOMOM_FQID_LEN = sizeof(PEN_ZUDOMOM_FQID_ARR)-1; + inline static constexpr char PEN_ZUDOMOM_ID_ARR[] = "zudomom"; + inline static constexpr const char* PEN_ZUDOMOM_ID = PEN_ZUDOMOM_ID_ARR; + inline static constexpr size_t PEN_ZUDOMOM_ID_LEN = sizeof(PEN_ZUDOMOM_ID)-1; + inline static constexpr char PEN_ZUDOMOM_NAME_ARR[] = "Zudomom"; + inline static constexpr const char* PEN_ZUDOMOM_NAME = PEN_ZUDOMOM_NAME_ARR; + inline static constexpr size_t PEN_ZUDOMOM_NAME_LEN = sizeof(PEN_ZUDOMOM_NAME_ARR)-1; + inline static constexpr char PEN_ZUDOMOM_FQNAME_ARR[] = "pen:Zudomom"; + inline static constexpr const char* PEN_ZUDOMOM_FQNAME = PEN_ZUDOMOM_FQNAME_ARR; + inline static constexpr size_t PEN_ZUDOMOM_FQNAME_LEN = sizeof(PEN_ZUDOMOM_FQNAME_ARR)-1; + inline static constexpr int PEN_ZUDOMOM_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN_ZUDOMOM_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN_ZUDOMOM_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN_ZUDOMOM_ANIM_INDEX = 90; + + inline static constexpr size_t PEN_ANIM_COUNT = 91; +} + +#endif // BONGOCAT_EMBEDDED_ASSETS_PEN_HPP + diff --git a/include/embedded_assets/pen/pen_images.h b/include/embedded_assets/pen/pen_images.h new file mode 100644 index 00000000..6d87598e --- /dev/null +++ b/include/embedded_assets/pen/pen_images.h @@ -0,0 +1,374 @@ +#ifndef BONGOCAT_EMBEDDED_ASSETS_PEN_H +#define BONGOCAT_EMBEDDED_ASSETS_PEN_H + +#include + +/// @NOTE: Generated embedded assets from assets/pen + +// Name: Aero V-dramon +extern const unsigned char pen_aero_v_dramon_png[]; +extern const size_t pen_aero_v_dramon_png_size; + +// Name: Angewomon +extern const unsigned char pen_angewomon_png[]; +extern const size_t pen_angewomon_png_size; + +// Name: Anomalocarimon +extern const unsigned char pen_anomalocarimon_png[]; +extern const size_t pen_anomalocarimon_png_size; + +// Name: Asuramon +extern const unsigned char pen_asuramon_png[]; +extern const size_t pen_asuramon_png_size; + +// Name: Atlur Kabuterimon +extern const unsigned char pen_atlur_kabuterimon_png[]; +extern const size_t pen_atlur_kabuterimon_png_size; + +// Name: Bakumon +extern const unsigned char pen_bakumon_png[]; +extern const size_t pen_bakumon_png_size; + +// Name: Big Mamemon +extern const unsigned char pen_big_mamemon_png[]; +extern const size_t pen_big_mamemon_png_size; + +// Name: Blossomon +extern const unsigned char pen_blossomon_png[]; +extern const size_t pen_blossomon_png_size; + +// Name: Boltmon +extern const unsigned char pen_boltmon_png[]; +extern const size_t pen_boltmon_png_size; + +// Name: Bubbmon +extern const unsigned char pen_bubbmon_png[]; +extern const size_t pen_bubbmon_png_size; + +// Name: Candmon +extern const unsigned char pen_candmon_png[]; +extern const size_t pen_candmon_png_size; + +// Name: Caprimon +extern const unsigned char pen_caprimon_png[]; +extern const size_t pen_caprimon_png_size; + +// Name: Choromon +extern const unsigned char pen_choromon_png[]; +extern const size_t pen_choromon_png_size; + +// Name: Clockmon +extern const unsigned char pen_clockmon_png[]; +extern const size_t pen_clockmon_png_size; + +// Name: Cyberdramon +extern const unsigned char pen_cyberdramon_png[]; +extern const size_t pen_cyberdramon_png_size; + +// Name: Dagomon +extern const unsigned char pen_dagomon_png[]; +extern const size_t pen_dagomon_png_size; + +// Name: Death Meramon +extern const unsigned char pen_death_meramon_png[]; +extern const size_t pen_death_meramon_png_size; + +// Name: Delumon +extern const unsigned char pen_delumon_png[]; +extern const size_t pen_delumon_png_size; + +// Name: Dokugumon +extern const unsigned char pen_dokugumon_png[]; +extern const size_t pen_dokugumon_png_size; + +// Name: Ebidramon +extern const unsigned char pen_ebidramon_png[]; +extern const size_t pen_ebidramon_png_size; + +// Name: Fantomon +extern const unsigned char pen_fantomon_png[]; +extern const size_t pen_fantomon_png_size; + +// Name: Floramon +extern const unsigned char pen_floramon_png[]; +extern const size_t pen_floramon_png_size; + +// Name: Ganimon +extern const unsigned char pen_ganimon_png[]; +extern const size_t pen_ganimon_png_size; + +// Name: Garudamon +extern const unsigned char pen_garudamon_png[]; +extern const size_t pen_garudamon_png_size; + +// Name: Gekomon +extern const unsigned char pen_gekomon_png[]; +extern const size_t pen_gekomon_png_size; + +// Name: Gerbemon +extern const unsigned char pen_gerbemon_png[]; +extern const size_t pen_gerbemon_png_size; + +// Name: Gesomon +extern const unsigned char pen_gesomon_png[]; +extern const size_t pen_gesomon_png_size; + +// Name: Gomamon +extern const unsigned char pen_gomamon_png[]; +extern const size_t pen_gomamon_png_size; + +// Name: Gottsumon +extern const unsigned char pen_gottsumon_png[]; +extern const size_t pen_gottsumon_png_size; + +// Name: Griffomon +extern const unsigned char pen_griffomon_png[]; +extern const size_t pen_griffomon_png_size; + +// Name: Guardromon +extern const unsigned char pen_guardromon_png[]; +extern const size_t pen_guardromon_png_size; + +// Name: Hagurumon +extern const unsigned char pen_hagurumon_png[]; +extern const size_t pen_hagurumon_png_size; + +// Name: Hangymon +extern const unsigned char pen_hangymon_png[]; +extern const size_t pen_hangymon_png_size; + +// Name: Hanumon +extern const unsigned char pen_hanumon_png[]; +extern const size_t pen_hanumon_png_size; + +// Name: Herkule Kabuterimon +extern const unsigned char pen_herkule_kabuterimon_png[]; +extern const size_t pen_herkule_kabuterimon_png_size; + +// Name: Holy Angemon +extern const unsigned char pen_holy_angemon_png[]; +extern const size_t pen_holy_angemon_png_size; + +// Name: Holydramon +extern const unsigned char pen_holydramon_png[]; +extern const size_t pen_holydramon_png_size; + +// Name: Hououmon +extern const unsigned char pen_hououmon_png[]; +extern const size_t pen_hououmon_png_size; + +// Name: Ignamon +extern const unsigned char pen_ignamon_png[]; +extern const size_t pen_ignamon_png_size; + +// Name: Ikkakumon +extern const unsigned char pen_ikkakumon_png[]; +extern const size_t pen_ikkakumon_png_size; + +// Name: Jyagamon +extern const unsigned char pen_jyagamon_png[]; +extern const size_t pen_jyagamon_png_size; + +// Name: Jyureimon +extern const unsigned char pen_jyureimon_png[]; +extern const size_t pen_jyureimon_png_size; + +// Name: Kiwimon +extern const unsigned char pen_kiwimon_png[]; +extern const size_t pen_kiwimon_png_size; + +// Name: Knightmon +extern const unsigned char pen_knightmon_png[]; +extern const size_t pen_knightmon_png_size; + +// Name: Kokuwamon +extern const unsigned char pen_kokuwamon_png[]; +extern const size_t pen_kokuwamon_png_size; + +// Name: Lady Devimon +extern const unsigned char pen_lady_devimon_png[]; +extern const size_t pen_lady_devimon_png_size; + +// Name: Lilimon +extern const unsigned char pen_lilimon_png[]; +extern const size_t pen_lilimon_png_size; + +// Name: Mammon +extern const unsigned char pen_mammon_png[]; +extern const size_t pen_mammon_png_size; + +// Name: Marin Angemon +extern const unsigned char pen_marin_angemon_png[]; +extern const size_t pen_marin_angemon_png_size; + +// Name: Marin Devimon +extern const unsigned char pen_marin_devimon_png[]; +extern const size_t pen_marin_devimon_png_size; + +// Name: Mechanorimon +extern const unsigned char pen_mechanorimon_png[]; +extern const size_t pen_mechanorimon_png_size; + +// Name: Mega Seadramon +extern const unsigned char pen_mega_seadramon_png[]; +extern const size_t pen_mega_seadramon_png_size; + +// Name: Metal Etemon +extern const unsigned char pen_metal_etemon_png[]; +extern const size_t pen_metal_etemon_png_size; + +// Name: Metal Seadramon +extern const unsigned char pen_metal_seadramon_png[]; +extern const size_t pen_metal_seadramon_png_size; + +// Name: Mochimon +extern const unsigned char pen_mochimon_png[]; +extern const size_t pen_mochimon_png_size; + +// Name: Mokumon +extern const unsigned char pen_mokumon_png[]; +extern const size_t pen_mokumon_png_size; + +// Name: Mushmon +extern const unsigned char pen_mushmon_png[]; +extern const size_t pen_mushmon_png_size; + +// Name: Nyokimon +extern const unsigned char pen_nyokimon_png[]; +extern const size_t pen_nyokimon_png_size; + +// Name: Octmon +extern const unsigned char pen_octmon_png[]; +extern const size_t pen_octmon_png_size; + +// Name: Okuwamon +extern const unsigned char pen_okuwamon_png[]; +extern const size_t pen_okuwamon_png_size; + +// Name: Otamamon +extern const unsigned char pen_otamamon_png[]; +extern const size_t pen_otamamon_png_size; + +// Name: Peti Meramon +extern const unsigned char pen_peti_meramon_png[]; +extern const size_t pen_peti_meramon_png_size; + +// Name: Pico Devimon +extern const unsigned char pen_pico_devimon_png[]; +extern const size_t pen_pico_devimon_png_size; + +// Name: Piemon +extern const unsigned char pen_piemon_png[]; +extern const size_t pen_piemon_png_size; + +// Name: Plesiomon +extern const unsigned char pen_plesiomon_png[]; +extern const size_t pen_plesiomon_png_size; + +// Name: Pukumon +extern const unsigned char pen_pukumon_png[]; +extern const size_t pen_pukumon_png_size; + +// Name: Pumpmon +extern const unsigned char pen_pumpmon_png[]; +extern const size_t pen_pumpmon_png_size; + +// Name: Pyocomon +extern const unsigned char pen_pyocomon_png[]; +extern const size_t pen_pyocomon_png_size; + +// Name: Rakamon +extern const unsigned char pen_rakamon_png[]; +extern const size_t pen_rakamon_png_size; + +// Name: Red Vegimon +extern const unsigned char pen_red_vegimon_png[]; +extern const size_t pen_red_vegimon_png_size; + +// Name: Revolmon +extern const unsigned char pen_revolmon_png[]; +extern const size_t pen_revolmon_png_size; + +// Name: Rosemon +extern const unsigned char pen_rosemon_png[]; +extern const size_t pen_rosemon_png_size; + +// Name: Saber Leomon +extern const unsigned char pen_saber_leomon_png[]; +extern const size_t pen_saber_leomon_png_size; + +// Name: Shakomon +extern const unsigned char pen_shakomon_png[]; +extern const size_t pen_shakomon_png_size; + +// Name: Starmon +extern const unsigned char pen_starmon_png[]; +extern const size_t pen_starmon_png_size; + +// Name: Tailmon +extern const unsigned char pen_tailmon_png[]; +extern const size_t pen_tailmon_png_size; + +// Name: Tankmon +extern const unsigned char pen_tankmon_png[]; +extern const size_t pen_tankmon_png_size; + +// Name: Tentomon +extern const unsigned char pen_tentomon_png[]; +extern const size_t pen_tentomon_png_size; + +// Name: Thunderballmon +extern const unsigned char pen_thunderballmon_png[]; +extern const size_t pen_thunderballmon_png_size; + +// Name: Togemon +extern const unsigned char pen_togemon_png[]; +extern const size_t pen_togemon_png_size; + +// Name: Tonosama Gekomon +extern const unsigned char pen_tonosama_gekomon_png[]; +extern const size_t pen_tonosama_gekomon_png_size; + +// Name: Tortamon +extern const unsigned char pen_tortamon_png[]; +extern const size_t pen_tortamon_png_size; + +// Name: Toy Agumon +extern const unsigned char pen_toy_agumon_png[]; +extern const size_t pen_toy_agumon_png_size; + +// Name: Triceramon +extern const unsigned char pen_triceramon_png[]; +extern const size_t pen_triceramon_png_size; + +// Name: V-dramon +extern const unsigned char pen_v_dramon_png[]; +extern const size_t pen_v_dramon_png_size; + +// Name: Vemdemon +extern const unsigned char pen_vemdemon_png[]; +extern const size_t pen_vemdemon_png_size; + +// Name: Venom Vamdemon +extern const unsigned char pen_venom_vamdemon_png[]; +extern const size_t pen_venom_vamdemon_png_size; + +// Name: Waru Mozaemon +extern const unsigned char pen_waru_mozaemon_png[]; +extern const size_t pen_waru_mozaemon_png_size; + +// Name: Wizarmon +extern const unsigned char pen_wizarmon_png[]; +extern const size_t pen_wizarmon_png_size; + +// Name: Woodmon +extern const unsigned char pen_woodmon_png[]; +extern const size_t pen_woodmon_png_size; + +// Name: Zudomom +extern const unsigned char pen_zudomom_png[]; +extern const size_t pen_zudomom_png_size; + + +#endif // BONGOCAT_EMBEDDED_ASSETS_PEN_H + diff --git a/include/embedded_assets/pen/pen_sprite.h b/include/embedded_assets/pen/pen_sprite.h new file mode 100644 index 00000000..70c2117b --- /dev/null +++ b/include/embedded_assets/pen/pen_sprite.h @@ -0,0 +1,11 @@ +#ifndef BONGOCAT_EMBEDDED_ASSETS_PEN_SPRITE_H +#define BONGOCAT_EMBEDDED_ASSETS_PEN_SPRITE_H + +#include "embedded_assets/embedded_image.h" + +namespace bongocat::assets { + [[nodiscard]] extern embedded_image_t get_pen_sprite_sheet(size_t i); +} + +#endif + diff --git a/include/embedded_assets/pen20/pen20.hpp b/include/embedded_assets/pen20/pen20.hpp new file mode 100644 index 00000000..c3f64394 --- /dev/null +++ b/include/embedded_assets/pen20/pen20.hpp @@ -0,0 +1,3001 @@ +#ifndef BONGOCAT_EMBEDDED_ASSETS_PEN20_HPP +#define BONGOCAT_EMBEDDED_ASSETS_PEN20_HPP + +#include + +/// @NOTE: Generated embedded assets images data from assets/pen20 + +namespace bongocat::assets { + // Name: Aero V-dramon + inline static constexpr char PEN20_AERO_V_DRAMON_FQID_ARR[] = "pen20:aero_v_dramon"; + inline static constexpr const char* PEN20_AERO_V_DRAMON_FQID = PEN20_AERO_V_DRAMON_FQID_ARR; + inline static constexpr size_t PEN20_AERO_V_DRAMON_FQID_LEN = sizeof(PEN20_AERO_V_DRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_AERO_V_DRAMON_ID_ARR[] = "aero_v_dramon"; + inline static constexpr const char* PEN20_AERO_V_DRAMON_ID = PEN20_AERO_V_DRAMON_ID_ARR; + inline static constexpr size_t PEN20_AERO_V_DRAMON_ID_LEN = sizeof(PEN20_AERO_V_DRAMON_ID)-1; + inline static constexpr char PEN20_AERO_V_DRAMON_NAME_ARR[] = "Aero V-dramon"; + inline static constexpr const char* PEN20_AERO_V_DRAMON_NAME = PEN20_AERO_V_DRAMON_NAME_ARR; + inline static constexpr size_t PEN20_AERO_V_DRAMON_NAME_LEN = sizeof(PEN20_AERO_V_DRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_AERO_V_DRAMON_FQNAME_ARR[] = "pen20:Aero V-dramon"; + inline static constexpr const char* PEN20_AERO_V_DRAMON_FQNAME = PEN20_AERO_V_DRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_AERO_V_DRAMON_FQNAME_LEN = sizeof(PEN20_AERO_V_DRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_AERO_V_DRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_AERO_V_DRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_AERO_V_DRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_AERO_V_DRAMON_ANIM_INDEX = 0; + + // Name: Agumon Hakase + inline static constexpr char PEN20_AGUMON_HAKASE_FQID_ARR[] = "pen20:agumon_hakase"; + inline static constexpr const char* PEN20_AGUMON_HAKASE_FQID = PEN20_AGUMON_HAKASE_FQID_ARR; + inline static constexpr size_t PEN20_AGUMON_HAKASE_FQID_LEN = sizeof(PEN20_AGUMON_HAKASE_FQID_ARR)-1; + inline static constexpr char PEN20_AGUMON_HAKASE_ID_ARR[] = "agumon_hakase"; + inline static constexpr const char* PEN20_AGUMON_HAKASE_ID = PEN20_AGUMON_HAKASE_ID_ARR; + inline static constexpr size_t PEN20_AGUMON_HAKASE_ID_LEN = sizeof(PEN20_AGUMON_HAKASE_ID)-1; + inline static constexpr char PEN20_AGUMON_HAKASE_NAME_ARR[] = "Agumon Hakase"; + inline static constexpr const char* PEN20_AGUMON_HAKASE_NAME = PEN20_AGUMON_HAKASE_NAME_ARR; + inline static constexpr size_t PEN20_AGUMON_HAKASE_NAME_LEN = sizeof(PEN20_AGUMON_HAKASE_NAME_ARR)-1; + inline static constexpr char PEN20_AGUMON_HAKASE_FQNAME_ARR[] = "pen20:Agumon Hakase"; + inline static constexpr const char* PEN20_AGUMON_HAKASE_FQNAME = PEN20_AGUMON_HAKASE_FQNAME_ARR; + inline static constexpr size_t PEN20_AGUMON_HAKASE_FQNAME_LEN = sizeof(PEN20_AGUMON_HAKASE_FQNAME_ARR)-1; + inline static constexpr int PEN20_AGUMON_HAKASE_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_AGUMON_HAKASE_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_AGUMON_HAKASE_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_AGUMON_HAKASE_ANIM_INDEX = 1; + + // Name: Alphamon Ouryuken + inline static constexpr char PEN20_ALPHAMON_OURYUKEN_FQID_ARR[] = "pen20:alphamon_ouryuken"; + inline static constexpr const char* PEN20_ALPHAMON_OURYUKEN_FQID = PEN20_ALPHAMON_OURYUKEN_FQID_ARR; + inline static constexpr size_t PEN20_ALPHAMON_OURYUKEN_FQID_LEN = sizeof(PEN20_ALPHAMON_OURYUKEN_FQID_ARR)-1; + inline static constexpr char PEN20_ALPHAMON_OURYUKEN_ID_ARR[] = "alphamon_ouryuken"; + inline static constexpr const char* PEN20_ALPHAMON_OURYUKEN_ID = PEN20_ALPHAMON_OURYUKEN_ID_ARR; + inline static constexpr size_t PEN20_ALPHAMON_OURYUKEN_ID_LEN = sizeof(PEN20_ALPHAMON_OURYUKEN_ID)-1; + inline static constexpr char PEN20_ALPHAMON_OURYUKEN_NAME_ARR[] = "Alphamon Ouryuken"; + inline static constexpr const char* PEN20_ALPHAMON_OURYUKEN_NAME = PEN20_ALPHAMON_OURYUKEN_NAME_ARR; + inline static constexpr size_t PEN20_ALPHAMON_OURYUKEN_NAME_LEN = sizeof(PEN20_ALPHAMON_OURYUKEN_NAME_ARR)-1; + inline static constexpr char PEN20_ALPHAMON_OURYUKEN_FQNAME_ARR[] = "pen20:Alphamon Ouryuken"; + inline static constexpr const char* PEN20_ALPHAMON_OURYUKEN_FQNAME = PEN20_ALPHAMON_OURYUKEN_FQNAME_ARR; + inline static constexpr size_t PEN20_ALPHAMON_OURYUKEN_FQNAME_LEN = sizeof(PEN20_ALPHAMON_OURYUKEN_FQNAME_ARR)-1; + inline static constexpr int PEN20_ALPHAMON_OURYUKEN_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_ALPHAMON_OURYUKEN_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_ALPHAMON_OURYUKEN_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_ALPHAMON_OURYUKEN_ANIM_INDEX = 2; + + // Name: Andiramon + inline static constexpr char PEN20_ANDIRAMON_FQID_ARR[] = "pen20:andiramon"; + inline static constexpr const char* PEN20_ANDIRAMON_FQID = PEN20_ANDIRAMON_FQID_ARR; + inline static constexpr size_t PEN20_ANDIRAMON_FQID_LEN = sizeof(PEN20_ANDIRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_ANDIRAMON_ID_ARR[] = "andiramon"; + inline static constexpr const char* PEN20_ANDIRAMON_ID = PEN20_ANDIRAMON_ID_ARR; + inline static constexpr size_t PEN20_ANDIRAMON_ID_LEN = sizeof(PEN20_ANDIRAMON_ID)-1; + inline static constexpr char PEN20_ANDIRAMON_NAME_ARR[] = "Andiramon"; + inline static constexpr const char* PEN20_ANDIRAMON_NAME = PEN20_ANDIRAMON_NAME_ARR; + inline static constexpr size_t PEN20_ANDIRAMON_NAME_LEN = sizeof(PEN20_ANDIRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_ANDIRAMON_FQNAME_ARR[] = "pen20:Andiramon"; + inline static constexpr const char* PEN20_ANDIRAMON_FQNAME = PEN20_ANDIRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_ANDIRAMON_FQNAME_LEN = sizeof(PEN20_ANDIRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_ANDIRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_ANDIRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_ANDIRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_ANDIRAMON_ANIM_INDEX = 3; + + // Name: Angewomon + inline static constexpr char PEN20_ANGEWOMON_FQID_ARR[] = "pen20:angewomon"; + inline static constexpr const char* PEN20_ANGEWOMON_FQID = PEN20_ANGEWOMON_FQID_ARR; + inline static constexpr size_t PEN20_ANGEWOMON_FQID_LEN = sizeof(PEN20_ANGEWOMON_FQID_ARR)-1; + inline static constexpr char PEN20_ANGEWOMON_ID_ARR[] = "angewomon"; + inline static constexpr const char* PEN20_ANGEWOMON_ID = PEN20_ANGEWOMON_ID_ARR; + inline static constexpr size_t PEN20_ANGEWOMON_ID_LEN = sizeof(PEN20_ANGEWOMON_ID)-1; + inline static constexpr char PEN20_ANGEWOMON_NAME_ARR[] = "Angewomon"; + inline static constexpr const char* PEN20_ANGEWOMON_NAME = PEN20_ANGEWOMON_NAME_ARR; + inline static constexpr size_t PEN20_ANGEWOMON_NAME_LEN = sizeof(PEN20_ANGEWOMON_NAME_ARR)-1; + inline static constexpr char PEN20_ANGEWOMON_FQNAME_ARR[] = "pen20:Angewomon"; + inline static constexpr const char* PEN20_ANGEWOMON_FQNAME = PEN20_ANGEWOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_ANGEWOMON_FQNAME_LEN = sizeof(PEN20_ANGEWOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_ANGEWOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_ANGEWOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_ANGEWOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_ANGEWOMON_ANIM_INDEX = 4; + + // Name: Anomalocarimon + inline static constexpr char PEN20_ANOMALOCARIMON_FQID_ARR[] = "pen20:anomalocarimon"; + inline static constexpr const char* PEN20_ANOMALOCARIMON_FQID = PEN20_ANOMALOCARIMON_FQID_ARR; + inline static constexpr size_t PEN20_ANOMALOCARIMON_FQID_LEN = sizeof(PEN20_ANOMALOCARIMON_FQID_ARR)-1; + inline static constexpr char PEN20_ANOMALOCARIMON_ID_ARR[] = "anomalocarimon"; + inline static constexpr const char* PEN20_ANOMALOCARIMON_ID = PEN20_ANOMALOCARIMON_ID_ARR; + inline static constexpr size_t PEN20_ANOMALOCARIMON_ID_LEN = sizeof(PEN20_ANOMALOCARIMON_ID)-1; + inline static constexpr char PEN20_ANOMALOCARIMON_NAME_ARR[] = "Anomalocarimon"; + inline static constexpr const char* PEN20_ANOMALOCARIMON_NAME = PEN20_ANOMALOCARIMON_NAME_ARR; + inline static constexpr size_t PEN20_ANOMALOCARIMON_NAME_LEN = sizeof(PEN20_ANOMALOCARIMON_NAME_ARR)-1; + inline static constexpr char PEN20_ANOMALOCARIMON_FQNAME_ARR[] = "pen20:Anomalocarimon"; + inline static constexpr const char* PEN20_ANOMALOCARIMON_FQNAME = PEN20_ANOMALOCARIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_ANOMALOCARIMON_FQNAME_LEN = sizeof(PEN20_ANOMALOCARIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_ANOMALOCARIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_ANOMALOCARIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_ANOMALOCARIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_ANOMALOCARIMON_ANIM_INDEX = 5; + + // Name: Arresterdramon + inline static constexpr char PEN20_ARRESTERDRAMON_FQID_ARR[] = "pen20:arresterdramon"; + inline static constexpr const char* PEN20_ARRESTERDRAMON_FQID = PEN20_ARRESTERDRAMON_FQID_ARR; + inline static constexpr size_t PEN20_ARRESTERDRAMON_FQID_LEN = sizeof(PEN20_ARRESTERDRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_ARRESTERDRAMON_ID_ARR[] = "arresterdramon"; + inline static constexpr const char* PEN20_ARRESTERDRAMON_ID = PEN20_ARRESTERDRAMON_ID_ARR; + inline static constexpr size_t PEN20_ARRESTERDRAMON_ID_LEN = sizeof(PEN20_ARRESTERDRAMON_ID)-1; + inline static constexpr char PEN20_ARRESTERDRAMON_NAME_ARR[] = "Arresterdramon"; + inline static constexpr const char* PEN20_ARRESTERDRAMON_NAME = PEN20_ARRESTERDRAMON_NAME_ARR; + inline static constexpr size_t PEN20_ARRESTERDRAMON_NAME_LEN = sizeof(PEN20_ARRESTERDRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_ARRESTERDRAMON_FQNAME_ARR[] = "pen20:Arresterdramon"; + inline static constexpr const char* PEN20_ARRESTERDRAMON_FQNAME = PEN20_ARRESTERDRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_ARRESTERDRAMON_FQNAME_LEN = sizeof(PEN20_ARRESTERDRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_ARRESTERDRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_ARRESTERDRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_ARRESTERDRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_ARRESTERDRAMON_ANIM_INDEX = 6; + + // Name: Astramon + inline static constexpr char PEN20_ASTRAMON_FQID_ARR[] = "pen20:astramon"; + inline static constexpr const char* PEN20_ASTRAMON_FQID = PEN20_ASTRAMON_FQID_ARR; + inline static constexpr size_t PEN20_ASTRAMON_FQID_LEN = sizeof(PEN20_ASTRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_ASTRAMON_ID_ARR[] = "astramon"; + inline static constexpr const char* PEN20_ASTRAMON_ID = PEN20_ASTRAMON_ID_ARR; + inline static constexpr size_t PEN20_ASTRAMON_ID_LEN = sizeof(PEN20_ASTRAMON_ID)-1; + inline static constexpr char PEN20_ASTRAMON_NAME_ARR[] = "Astramon"; + inline static constexpr const char* PEN20_ASTRAMON_NAME = PEN20_ASTRAMON_NAME_ARR; + inline static constexpr size_t PEN20_ASTRAMON_NAME_LEN = sizeof(PEN20_ASTRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_ASTRAMON_FQNAME_ARR[] = "pen20:Astramon"; + inline static constexpr const char* PEN20_ASTRAMON_FQNAME = PEN20_ASTRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_ASTRAMON_FQNAME_LEN = sizeof(PEN20_ASTRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_ASTRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_ASTRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_ASTRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_ASTRAMON_ANIM_INDEX = 7; + + // Name: Asuramon + inline static constexpr char PEN20_ASURAMON_FQID_ARR[] = "pen20:asuramon"; + inline static constexpr const char* PEN20_ASURAMON_FQID = PEN20_ASURAMON_FQID_ARR; + inline static constexpr size_t PEN20_ASURAMON_FQID_LEN = sizeof(PEN20_ASURAMON_FQID_ARR)-1; + inline static constexpr char PEN20_ASURAMON_ID_ARR[] = "asuramon"; + inline static constexpr const char* PEN20_ASURAMON_ID = PEN20_ASURAMON_ID_ARR; + inline static constexpr size_t PEN20_ASURAMON_ID_LEN = sizeof(PEN20_ASURAMON_ID)-1; + inline static constexpr char PEN20_ASURAMON_NAME_ARR[] = "Asuramon"; + inline static constexpr const char* PEN20_ASURAMON_NAME = PEN20_ASURAMON_NAME_ARR; + inline static constexpr size_t PEN20_ASURAMON_NAME_LEN = sizeof(PEN20_ASURAMON_NAME_ARR)-1; + inline static constexpr char PEN20_ASURAMON_FQNAME_ARR[] = "pen20:Asuramon"; + inline static constexpr const char* PEN20_ASURAMON_FQNAME = PEN20_ASURAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_ASURAMON_FQNAME_LEN = sizeof(PEN20_ASURAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_ASURAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_ASURAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_ASURAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_ASURAMON_ANIM_INDEX = 8; + + // Name: Atlur Kabuterimon + inline static constexpr char PEN20_ATLUR_KABUTERIMON_FQID_ARR[] = "pen20:atlur_kabuterimon"; + inline static constexpr const char* PEN20_ATLUR_KABUTERIMON_FQID = PEN20_ATLUR_KABUTERIMON_FQID_ARR; + inline static constexpr size_t PEN20_ATLUR_KABUTERIMON_FQID_LEN = sizeof(PEN20_ATLUR_KABUTERIMON_FQID_ARR)-1; + inline static constexpr char PEN20_ATLUR_KABUTERIMON_ID_ARR[] = "atlur_kabuterimon"; + inline static constexpr const char* PEN20_ATLUR_KABUTERIMON_ID = PEN20_ATLUR_KABUTERIMON_ID_ARR; + inline static constexpr size_t PEN20_ATLUR_KABUTERIMON_ID_LEN = sizeof(PEN20_ATLUR_KABUTERIMON_ID)-1; + inline static constexpr char PEN20_ATLUR_KABUTERIMON_NAME_ARR[] = "Atlur Kabuterimon"; + inline static constexpr const char* PEN20_ATLUR_KABUTERIMON_NAME = PEN20_ATLUR_KABUTERIMON_NAME_ARR; + inline static constexpr size_t PEN20_ATLUR_KABUTERIMON_NAME_LEN = sizeof(PEN20_ATLUR_KABUTERIMON_NAME_ARR)-1; + inline static constexpr char PEN20_ATLUR_KABUTERIMON_FQNAME_ARR[] = "pen20:Atlur Kabuterimon"; + inline static constexpr const char* PEN20_ATLUR_KABUTERIMON_FQNAME = PEN20_ATLUR_KABUTERIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_ATLUR_KABUTERIMON_FQNAME_LEN = sizeof(PEN20_ATLUR_KABUTERIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_ATLUR_KABUTERIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_ATLUR_KABUTERIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_ATLUR_KABUTERIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_ATLUR_KABUTERIMON_ANIM_INDEX = 9; + + // Name: Baalmon + inline static constexpr char PEN20_BAALMON_FQID_ARR[] = "pen20:baalmon"; + inline static constexpr const char* PEN20_BAALMON_FQID = PEN20_BAALMON_FQID_ARR; + inline static constexpr size_t PEN20_BAALMON_FQID_LEN = sizeof(PEN20_BAALMON_FQID_ARR)-1; + inline static constexpr char PEN20_BAALMON_ID_ARR[] = "baalmon"; + inline static constexpr const char* PEN20_BAALMON_ID = PEN20_BAALMON_ID_ARR; + inline static constexpr size_t PEN20_BAALMON_ID_LEN = sizeof(PEN20_BAALMON_ID)-1; + inline static constexpr char PEN20_BAALMON_NAME_ARR[] = "Baalmon"; + inline static constexpr const char* PEN20_BAALMON_NAME = PEN20_BAALMON_NAME_ARR; + inline static constexpr size_t PEN20_BAALMON_NAME_LEN = sizeof(PEN20_BAALMON_NAME_ARR)-1; + inline static constexpr char PEN20_BAALMON_FQNAME_ARR[] = "pen20:Baalmon"; + inline static constexpr const char* PEN20_BAALMON_FQNAME = PEN20_BAALMON_FQNAME_ARR; + inline static constexpr size_t PEN20_BAALMON_FQNAME_LEN = sizeof(PEN20_BAALMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_BAALMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_BAALMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_BAALMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_BAALMON_ANIM_INDEX = 10; + + // Name: Bakumon + inline static constexpr char PEN20_BAKUMON_FQID_ARR[] = "pen20:bakumon"; + inline static constexpr const char* PEN20_BAKUMON_FQID = PEN20_BAKUMON_FQID_ARR; + inline static constexpr size_t PEN20_BAKUMON_FQID_LEN = sizeof(PEN20_BAKUMON_FQID_ARR)-1; + inline static constexpr char PEN20_BAKUMON_ID_ARR[] = "bakumon"; + inline static constexpr const char* PEN20_BAKUMON_ID = PEN20_BAKUMON_ID_ARR; + inline static constexpr size_t PEN20_BAKUMON_ID_LEN = sizeof(PEN20_BAKUMON_ID)-1; + inline static constexpr char PEN20_BAKUMON_NAME_ARR[] = "Bakumon"; + inline static constexpr const char* PEN20_BAKUMON_NAME = PEN20_BAKUMON_NAME_ARR; + inline static constexpr size_t PEN20_BAKUMON_NAME_LEN = sizeof(PEN20_BAKUMON_NAME_ARR)-1; + inline static constexpr char PEN20_BAKUMON_FQNAME_ARR[] = "pen20:Bakumon"; + inline static constexpr const char* PEN20_BAKUMON_FQNAME = PEN20_BAKUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_BAKUMON_FQNAME_LEN = sizeof(PEN20_BAKUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_BAKUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_BAKUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_BAKUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_BAKUMON_ANIM_INDEX = 11; + + // Name: Bancho Leomon + inline static constexpr char PEN20_BANCHO_LEOMON_FQID_ARR[] = "pen20:bancho_leomon"; + inline static constexpr const char* PEN20_BANCHO_LEOMON_FQID = PEN20_BANCHO_LEOMON_FQID_ARR; + inline static constexpr size_t PEN20_BANCHO_LEOMON_FQID_LEN = sizeof(PEN20_BANCHO_LEOMON_FQID_ARR)-1; + inline static constexpr char PEN20_BANCHO_LEOMON_ID_ARR[] = "bancho_leomon"; + inline static constexpr const char* PEN20_BANCHO_LEOMON_ID = PEN20_BANCHO_LEOMON_ID_ARR; + inline static constexpr size_t PEN20_BANCHO_LEOMON_ID_LEN = sizeof(PEN20_BANCHO_LEOMON_ID)-1; + inline static constexpr char PEN20_BANCHO_LEOMON_NAME_ARR[] = "Bancho Leomon"; + inline static constexpr const char* PEN20_BANCHO_LEOMON_NAME = PEN20_BANCHO_LEOMON_NAME_ARR; + inline static constexpr size_t PEN20_BANCHO_LEOMON_NAME_LEN = sizeof(PEN20_BANCHO_LEOMON_NAME_ARR)-1; + inline static constexpr char PEN20_BANCHO_LEOMON_FQNAME_ARR[] = "pen20:Bancho Leomon"; + inline static constexpr const char* PEN20_BANCHO_LEOMON_FQNAME = PEN20_BANCHO_LEOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_BANCHO_LEOMON_FQNAME_LEN = sizeof(PEN20_BANCHO_LEOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_BANCHO_LEOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_BANCHO_LEOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_BANCHO_LEOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_BANCHO_LEOMON_ANIM_INDEX = 12; + + // Name: Beelzebumon Blast Mode + inline static constexpr char PEN20_BEELZEBUMON_BLAST_MODE_FQID_ARR[] = "pen20:beelzebumon_blast_mode"; + inline static constexpr const char* PEN20_BEELZEBUMON_BLAST_MODE_FQID = PEN20_BEELZEBUMON_BLAST_MODE_FQID_ARR; + inline static constexpr size_t PEN20_BEELZEBUMON_BLAST_MODE_FQID_LEN = sizeof(PEN20_BEELZEBUMON_BLAST_MODE_FQID_ARR)-1; + inline static constexpr char PEN20_BEELZEBUMON_BLAST_MODE_ID_ARR[] = "beelzebumon_blast_mode"; + inline static constexpr const char* PEN20_BEELZEBUMON_BLAST_MODE_ID = PEN20_BEELZEBUMON_BLAST_MODE_ID_ARR; + inline static constexpr size_t PEN20_BEELZEBUMON_BLAST_MODE_ID_LEN = sizeof(PEN20_BEELZEBUMON_BLAST_MODE_ID)-1; + inline static constexpr char PEN20_BEELZEBUMON_BLAST_MODE_NAME_ARR[] = "Beelzebumon Blast Mode"; + inline static constexpr const char* PEN20_BEELZEBUMON_BLAST_MODE_NAME = PEN20_BEELZEBUMON_BLAST_MODE_NAME_ARR; + inline static constexpr size_t PEN20_BEELZEBUMON_BLAST_MODE_NAME_LEN = sizeof(PEN20_BEELZEBUMON_BLAST_MODE_NAME_ARR)-1; + inline static constexpr char PEN20_BEELZEBUMON_BLAST_MODE_FQNAME_ARR[] = "pen20:Beelzebumon Blast Mode"; + inline static constexpr const char* PEN20_BEELZEBUMON_BLAST_MODE_FQNAME = PEN20_BEELZEBUMON_BLAST_MODE_FQNAME_ARR; + inline static constexpr size_t PEN20_BEELZEBUMON_BLAST_MODE_FQNAME_LEN = sizeof(PEN20_BEELZEBUMON_BLAST_MODE_FQNAME_ARR)-1; + inline static constexpr int PEN20_BEELZEBUMON_BLAST_MODE_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_BEELZEBUMON_BLAST_MODE_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_BEELZEBUMON_BLAST_MODE_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_BEELZEBUMON_BLAST_MODE_ANIM_INDEX = 13; + + // Name: Beowulfmon + inline static constexpr char PEN20_BEOWULFMON_FQID_ARR[] = "pen20:beowulfmon"; + inline static constexpr const char* PEN20_BEOWULFMON_FQID = PEN20_BEOWULFMON_FQID_ARR; + inline static constexpr size_t PEN20_BEOWULFMON_FQID_LEN = sizeof(PEN20_BEOWULFMON_FQID_ARR)-1; + inline static constexpr char PEN20_BEOWULFMON_ID_ARR[] = "beowulfmon"; + inline static constexpr const char* PEN20_BEOWULFMON_ID = PEN20_BEOWULFMON_ID_ARR; + inline static constexpr size_t PEN20_BEOWULFMON_ID_LEN = sizeof(PEN20_BEOWULFMON_ID)-1; + inline static constexpr char PEN20_BEOWULFMON_NAME_ARR[] = "Beowulfmon"; + inline static constexpr const char* PEN20_BEOWULFMON_NAME = PEN20_BEOWULFMON_NAME_ARR; + inline static constexpr size_t PEN20_BEOWULFMON_NAME_LEN = sizeof(PEN20_BEOWULFMON_NAME_ARR)-1; + inline static constexpr char PEN20_BEOWULFMON_FQNAME_ARR[] = "pen20:Beowulfmon"; + inline static constexpr const char* PEN20_BEOWULFMON_FQNAME = PEN20_BEOWULFMON_FQNAME_ARR; + inline static constexpr size_t PEN20_BEOWULFMON_FQNAME_LEN = sizeof(PEN20_BEOWULFMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_BEOWULFMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_BEOWULFMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_BEOWULFMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_BEOWULFMON_ANIM_INDEX = 14; + + // Name: Big Mamemon + inline static constexpr char PEN20_BIG_MAMEMON_FQID_ARR[] = "pen20:big_mamemon"; + inline static constexpr const char* PEN20_BIG_MAMEMON_FQID = PEN20_BIG_MAMEMON_FQID_ARR; + inline static constexpr size_t PEN20_BIG_MAMEMON_FQID_LEN = sizeof(PEN20_BIG_MAMEMON_FQID_ARR)-1; + inline static constexpr char PEN20_BIG_MAMEMON_ID_ARR[] = "big_mamemon"; + inline static constexpr const char* PEN20_BIG_MAMEMON_ID = PEN20_BIG_MAMEMON_ID_ARR; + inline static constexpr size_t PEN20_BIG_MAMEMON_ID_LEN = sizeof(PEN20_BIG_MAMEMON_ID)-1; + inline static constexpr char PEN20_BIG_MAMEMON_NAME_ARR[] = "Big Mamemon"; + inline static constexpr const char* PEN20_BIG_MAMEMON_NAME = PEN20_BIG_MAMEMON_NAME_ARR; + inline static constexpr size_t PEN20_BIG_MAMEMON_NAME_LEN = sizeof(PEN20_BIG_MAMEMON_NAME_ARR)-1; + inline static constexpr char PEN20_BIG_MAMEMON_FQNAME_ARR[] = "pen20:Big Mamemon"; + inline static constexpr const char* PEN20_BIG_MAMEMON_FQNAME = PEN20_BIG_MAMEMON_FQNAME_ARR; + inline static constexpr size_t PEN20_BIG_MAMEMON_FQNAME_LEN = sizeof(PEN20_BIG_MAMEMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_BIG_MAMEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_BIG_MAMEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_BIG_MAMEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_BIG_MAMEMON_ANIM_INDEX = 15; + + // Name: Blossomon + inline static constexpr char PEN20_BLOSSOMON_FQID_ARR[] = "pen20:blossomon"; + inline static constexpr const char* PEN20_BLOSSOMON_FQID = PEN20_BLOSSOMON_FQID_ARR; + inline static constexpr size_t PEN20_BLOSSOMON_FQID_LEN = sizeof(PEN20_BLOSSOMON_FQID_ARR)-1; + inline static constexpr char PEN20_BLOSSOMON_ID_ARR[] = "blossomon"; + inline static constexpr const char* PEN20_BLOSSOMON_ID = PEN20_BLOSSOMON_ID_ARR; + inline static constexpr size_t PEN20_BLOSSOMON_ID_LEN = sizeof(PEN20_BLOSSOMON_ID)-1; + inline static constexpr char PEN20_BLOSSOMON_NAME_ARR[] = "Blossomon"; + inline static constexpr const char* PEN20_BLOSSOMON_NAME = PEN20_BLOSSOMON_NAME_ARR; + inline static constexpr size_t PEN20_BLOSSOMON_NAME_LEN = sizeof(PEN20_BLOSSOMON_NAME_ARR)-1; + inline static constexpr char PEN20_BLOSSOMON_FQNAME_ARR[] = "pen20:Blossomon"; + inline static constexpr const char* PEN20_BLOSSOMON_FQNAME = PEN20_BLOSSOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_BLOSSOMON_FQNAME_LEN = sizeof(PEN20_BLOSSOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_BLOSSOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_BLOSSOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_BLOSSOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_BLOSSOMON_ANIM_INDEX = 16; + + // Name: Boltmon + inline static constexpr char PEN20_BOLTMON_FQID_ARR[] = "pen20:boltmon"; + inline static constexpr const char* PEN20_BOLTMON_FQID = PEN20_BOLTMON_FQID_ARR; + inline static constexpr size_t PEN20_BOLTMON_FQID_LEN = sizeof(PEN20_BOLTMON_FQID_ARR)-1; + inline static constexpr char PEN20_BOLTMON_ID_ARR[] = "boltmon"; + inline static constexpr const char* PEN20_BOLTMON_ID = PEN20_BOLTMON_ID_ARR; + inline static constexpr size_t PEN20_BOLTMON_ID_LEN = sizeof(PEN20_BOLTMON_ID)-1; + inline static constexpr char PEN20_BOLTMON_NAME_ARR[] = "Boltmon"; + inline static constexpr const char* PEN20_BOLTMON_NAME = PEN20_BOLTMON_NAME_ARR; + inline static constexpr size_t PEN20_BOLTMON_NAME_LEN = sizeof(PEN20_BOLTMON_NAME_ARR)-1; + inline static constexpr char PEN20_BOLTMON_FQNAME_ARR[] = "pen20:Boltmon"; + inline static constexpr const char* PEN20_BOLTMON_FQNAME = PEN20_BOLTMON_FQNAME_ARR; + inline static constexpr size_t PEN20_BOLTMON_FQNAME_LEN = sizeof(PEN20_BOLTMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_BOLTMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_BOLTMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_BOLTMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_BOLTMON_ANIM_INDEX = 17; + + // Name: Bryweludramon + inline static constexpr char PEN20_BRYWELUDRAMON_FQID_ARR[] = "pen20:bryweludramon"; + inline static constexpr const char* PEN20_BRYWELUDRAMON_FQID = PEN20_BRYWELUDRAMON_FQID_ARR; + inline static constexpr size_t PEN20_BRYWELUDRAMON_FQID_LEN = sizeof(PEN20_BRYWELUDRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_BRYWELUDRAMON_ID_ARR[] = "bryweludramon"; + inline static constexpr const char* PEN20_BRYWELUDRAMON_ID = PEN20_BRYWELUDRAMON_ID_ARR; + inline static constexpr size_t PEN20_BRYWELUDRAMON_ID_LEN = sizeof(PEN20_BRYWELUDRAMON_ID)-1; + inline static constexpr char PEN20_BRYWELUDRAMON_NAME_ARR[] = "Bryweludramon"; + inline static constexpr const char* PEN20_BRYWELUDRAMON_NAME = PEN20_BRYWELUDRAMON_NAME_ARR; + inline static constexpr size_t PEN20_BRYWELUDRAMON_NAME_LEN = sizeof(PEN20_BRYWELUDRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_BRYWELUDRAMON_FQNAME_ARR[] = "pen20:Bryweludramon"; + inline static constexpr const char* PEN20_BRYWELUDRAMON_FQNAME = PEN20_BRYWELUDRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_BRYWELUDRAMON_FQNAME_LEN = sizeof(PEN20_BRYWELUDRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_BRYWELUDRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_BRYWELUDRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_BRYWELUDRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_BRYWELUDRAMON_ANIM_INDEX = 18; + + // Name: Bubbmon + inline static constexpr char PEN20_BUBBMON_FQID_ARR[] = "pen20:bubbmon"; + inline static constexpr const char* PEN20_BUBBMON_FQID = PEN20_BUBBMON_FQID_ARR; + inline static constexpr size_t PEN20_BUBBMON_FQID_LEN = sizeof(PEN20_BUBBMON_FQID_ARR)-1; + inline static constexpr char PEN20_BUBBMON_ID_ARR[] = "bubbmon"; + inline static constexpr const char* PEN20_BUBBMON_ID = PEN20_BUBBMON_ID_ARR; + inline static constexpr size_t PEN20_BUBBMON_ID_LEN = sizeof(PEN20_BUBBMON_ID)-1; + inline static constexpr char PEN20_BUBBMON_NAME_ARR[] = "Bubbmon"; + inline static constexpr const char* PEN20_BUBBMON_NAME = PEN20_BUBBMON_NAME_ARR; + inline static constexpr size_t PEN20_BUBBMON_NAME_LEN = sizeof(PEN20_BUBBMON_NAME_ARR)-1; + inline static constexpr char PEN20_BUBBMON_FQNAME_ARR[] = "pen20:Bubbmon"; + inline static constexpr const char* PEN20_BUBBMON_FQNAME = PEN20_BUBBMON_FQNAME_ARR; + inline static constexpr size_t PEN20_BUBBMON_FQNAME_LEN = sizeof(PEN20_BUBBMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_BUBBMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_BUBBMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_BUBBMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_BUBBMON_ANIM_INDEX = 19; + + // Name: Budmon + inline static constexpr char PEN20_BUDMON_FQID_ARR[] = "pen20:budmon"; + inline static constexpr const char* PEN20_BUDMON_FQID = PEN20_BUDMON_FQID_ARR; + inline static constexpr size_t PEN20_BUDMON_FQID_LEN = sizeof(PEN20_BUDMON_FQID_ARR)-1; + inline static constexpr char PEN20_BUDMON_ID_ARR[] = "budmon"; + inline static constexpr const char* PEN20_BUDMON_ID = PEN20_BUDMON_ID_ARR; + inline static constexpr size_t PEN20_BUDMON_ID_LEN = sizeof(PEN20_BUDMON_ID)-1; + inline static constexpr char PEN20_BUDMON_NAME_ARR[] = "Budmon"; + inline static constexpr const char* PEN20_BUDMON_NAME = PEN20_BUDMON_NAME_ARR; + inline static constexpr size_t PEN20_BUDMON_NAME_LEN = sizeof(PEN20_BUDMON_NAME_ARR)-1; + inline static constexpr char PEN20_BUDMON_FQNAME_ARR[] = "pen20:Budmon"; + inline static constexpr const char* PEN20_BUDMON_FQNAME = PEN20_BUDMON_FQNAME_ARR; + inline static constexpr size_t PEN20_BUDMON_FQNAME_LEN = sizeof(PEN20_BUDMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_BUDMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_BUDMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_BUDMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_BUDMON_ANIM_INDEX = 20; + + // Name: Bushi Agumon + inline static constexpr char PEN20_BUSHI_AGUMON_FQID_ARR[] = "pen20:bushi_agumon"; + inline static constexpr const char* PEN20_BUSHI_AGUMON_FQID = PEN20_BUSHI_AGUMON_FQID_ARR; + inline static constexpr size_t PEN20_BUSHI_AGUMON_FQID_LEN = sizeof(PEN20_BUSHI_AGUMON_FQID_ARR)-1; + inline static constexpr char PEN20_BUSHI_AGUMON_ID_ARR[] = "bushi_agumon"; + inline static constexpr const char* PEN20_BUSHI_AGUMON_ID = PEN20_BUSHI_AGUMON_ID_ARR; + inline static constexpr size_t PEN20_BUSHI_AGUMON_ID_LEN = sizeof(PEN20_BUSHI_AGUMON_ID)-1; + inline static constexpr char PEN20_BUSHI_AGUMON_NAME_ARR[] = "Bushi Agumon"; + inline static constexpr const char* PEN20_BUSHI_AGUMON_NAME = PEN20_BUSHI_AGUMON_NAME_ARR; + inline static constexpr size_t PEN20_BUSHI_AGUMON_NAME_LEN = sizeof(PEN20_BUSHI_AGUMON_NAME_ARR)-1; + inline static constexpr char PEN20_BUSHI_AGUMON_FQNAME_ARR[] = "pen20:Bushi Agumon"; + inline static constexpr const char* PEN20_BUSHI_AGUMON_FQNAME = PEN20_BUSHI_AGUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_BUSHI_AGUMON_FQNAME_LEN = sizeof(PEN20_BUSHI_AGUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_BUSHI_AGUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_BUSHI_AGUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_BUSHI_AGUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_BUSHI_AGUMON_ANIM_INDEX = 21; + + // Name: Candmon + inline static constexpr char PEN20_CANDMON_FQID_ARR[] = "pen20:candmon"; + inline static constexpr const char* PEN20_CANDMON_FQID = PEN20_CANDMON_FQID_ARR; + inline static constexpr size_t PEN20_CANDMON_FQID_LEN = sizeof(PEN20_CANDMON_FQID_ARR)-1; + inline static constexpr char PEN20_CANDMON_ID_ARR[] = "candmon"; + inline static constexpr const char* PEN20_CANDMON_ID = PEN20_CANDMON_ID_ARR; + inline static constexpr size_t PEN20_CANDMON_ID_LEN = sizeof(PEN20_CANDMON_ID)-1; + inline static constexpr char PEN20_CANDMON_NAME_ARR[] = "Candmon"; + inline static constexpr const char* PEN20_CANDMON_NAME = PEN20_CANDMON_NAME_ARR; + inline static constexpr size_t PEN20_CANDMON_NAME_LEN = sizeof(PEN20_CANDMON_NAME_ARR)-1; + inline static constexpr char PEN20_CANDMON_FQNAME_ARR[] = "pen20:Candmon"; + inline static constexpr const char* PEN20_CANDMON_FQNAME = PEN20_CANDMON_FQNAME_ARR; + inline static constexpr size_t PEN20_CANDMON_FQNAME_LEN = sizeof(PEN20_CANDMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_CANDMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_CANDMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_CANDMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_CANDMON_ANIM_INDEX = 22; + + // Name: Caprimon + inline static constexpr char PEN20_CAPRIMON_FQID_ARR[] = "pen20:caprimon"; + inline static constexpr const char* PEN20_CAPRIMON_FQID = PEN20_CAPRIMON_FQID_ARR; + inline static constexpr size_t PEN20_CAPRIMON_FQID_LEN = sizeof(PEN20_CAPRIMON_FQID_ARR)-1; + inline static constexpr char PEN20_CAPRIMON_ID_ARR[] = "caprimon"; + inline static constexpr const char* PEN20_CAPRIMON_ID = PEN20_CAPRIMON_ID_ARR; + inline static constexpr size_t PEN20_CAPRIMON_ID_LEN = sizeof(PEN20_CAPRIMON_ID)-1; + inline static constexpr char PEN20_CAPRIMON_NAME_ARR[] = "Caprimon"; + inline static constexpr const char* PEN20_CAPRIMON_NAME = PEN20_CAPRIMON_NAME_ARR; + inline static constexpr size_t PEN20_CAPRIMON_NAME_LEN = sizeof(PEN20_CAPRIMON_NAME_ARR)-1; + inline static constexpr char PEN20_CAPRIMON_FQNAME_ARR[] = "pen20:Caprimon"; + inline static constexpr const char* PEN20_CAPRIMON_FQNAME = PEN20_CAPRIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_CAPRIMON_FQNAME_LEN = sizeof(PEN20_CAPRIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_CAPRIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_CAPRIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_CAPRIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_CAPRIMON_ANIM_INDEX = 23; + + // Name: Chaosmon + inline static constexpr char PEN20_CHAOSMON_FQID_ARR[] = "pen20:chaosmon"; + inline static constexpr const char* PEN20_CHAOSMON_FQID = PEN20_CHAOSMON_FQID_ARR; + inline static constexpr size_t PEN20_CHAOSMON_FQID_LEN = sizeof(PEN20_CHAOSMON_FQID_ARR)-1; + inline static constexpr char PEN20_CHAOSMON_ID_ARR[] = "chaosmon"; + inline static constexpr const char* PEN20_CHAOSMON_ID = PEN20_CHAOSMON_ID_ARR; + inline static constexpr size_t PEN20_CHAOSMON_ID_LEN = sizeof(PEN20_CHAOSMON_ID)-1; + inline static constexpr char PEN20_CHAOSMON_NAME_ARR[] = "Chaosmon"; + inline static constexpr const char* PEN20_CHAOSMON_NAME = PEN20_CHAOSMON_NAME_ARR; + inline static constexpr size_t PEN20_CHAOSMON_NAME_LEN = sizeof(PEN20_CHAOSMON_NAME_ARR)-1; + inline static constexpr char PEN20_CHAOSMON_FQNAME_ARR[] = "pen20:Chaosmon"; + inline static constexpr const char* PEN20_CHAOSMON_FQNAME = PEN20_CHAOSMON_FQNAME_ARR; + inline static constexpr size_t PEN20_CHAOSMON_FQNAME_LEN = sizeof(PEN20_CHAOSMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_CHAOSMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_CHAOSMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_CHAOSMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_CHAOSMON_ANIM_INDEX = 24; + + // Name: Cherubimon + inline static constexpr char PEN20_CHERUBIMON_FQID_ARR[] = "pen20:cherubimon"; + inline static constexpr const char* PEN20_CHERUBIMON_FQID = PEN20_CHERUBIMON_FQID_ARR; + inline static constexpr size_t PEN20_CHERUBIMON_FQID_LEN = sizeof(PEN20_CHERUBIMON_FQID_ARR)-1; + inline static constexpr char PEN20_CHERUBIMON_ID_ARR[] = "cherubimon"; + inline static constexpr const char* PEN20_CHERUBIMON_ID = PEN20_CHERUBIMON_ID_ARR; + inline static constexpr size_t PEN20_CHERUBIMON_ID_LEN = sizeof(PEN20_CHERUBIMON_ID)-1; + inline static constexpr char PEN20_CHERUBIMON_NAME_ARR[] = "Cherubimon"; + inline static constexpr const char* PEN20_CHERUBIMON_NAME = PEN20_CHERUBIMON_NAME_ARR; + inline static constexpr size_t PEN20_CHERUBIMON_NAME_LEN = sizeof(PEN20_CHERUBIMON_NAME_ARR)-1; + inline static constexpr char PEN20_CHERUBIMON_FQNAME_ARR[] = "pen20:Cherubimon"; + inline static constexpr const char* PEN20_CHERUBIMON_FQNAME = PEN20_CHERUBIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_CHERUBIMON_FQNAME_LEN = sizeof(PEN20_CHERUBIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_CHERUBIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_CHERUBIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_CHERUBIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_CHERUBIMON_ANIM_INDEX = 25; + + // Name: Chibimon + inline static constexpr char PEN20_CHIBIMON_FQID_ARR[] = "pen20:chibimon"; + inline static constexpr const char* PEN20_CHIBIMON_FQID = PEN20_CHIBIMON_FQID_ARR; + inline static constexpr size_t PEN20_CHIBIMON_FQID_LEN = sizeof(PEN20_CHIBIMON_FQID_ARR)-1; + inline static constexpr char PEN20_CHIBIMON_ID_ARR[] = "chibimon"; + inline static constexpr const char* PEN20_CHIBIMON_ID = PEN20_CHIBIMON_ID_ARR; + inline static constexpr size_t PEN20_CHIBIMON_ID_LEN = sizeof(PEN20_CHIBIMON_ID)-1; + inline static constexpr char PEN20_CHIBIMON_NAME_ARR[] = "Chibimon"; + inline static constexpr const char* PEN20_CHIBIMON_NAME = PEN20_CHIBIMON_NAME_ARR; + inline static constexpr size_t PEN20_CHIBIMON_NAME_LEN = sizeof(PEN20_CHIBIMON_NAME_ARR)-1; + inline static constexpr char PEN20_CHIBIMON_FQNAME_ARR[] = "pen20:Chibimon"; + inline static constexpr const char* PEN20_CHIBIMON_FQNAME = PEN20_CHIBIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_CHIBIMON_FQNAME_LEN = sizeof(PEN20_CHIBIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_CHIBIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_CHIBIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_CHIBIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_CHIBIMON_ANIM_INDEX = 26; + + // Name: Chicomon + inline static constexpr char PEN20_CHICOMON_FQID_ARR[] = "pen20:chicomon"; + inline static constexpr const char* PEN20_CHICOMON_FQID = PEN20_CHICOMON_FQID_ARR; + inline static constexpr size_t PEN20_CHICOMON_FQID_LEN = sizeof(PEN20_CHICOMON_FQID_ARR)-1; + inline static constexpr char PEN20_CHICOMON_ID_ARR[] = "chicomon"; + inline static constexpr const char* PEN20_CHICOMON_ID = PEN20_CHICOMON_ID_ARR; + inline static constexpr size_t PEN20_CHICOMON_ID_LEN = sizeof(PEN20_CHICOMON_ID)-1; + inline static constexpr char PEN20_CHICOMON_NAME_ARR[] = "Chicomon"; + inline static constexpr const char* PEN20_CHICOMON_NAME = PEN20_CHICOMON_NAME_ARR; + inline static constexpr size_t PEN20_CHICOMON_NAME_LEN = sizeof(PEN20_CHICOMON_NAME_ARR)-1; + inline static constexpr char PEN20_CHICOMON_FQNAME_ARR[] = "pen20:Chicomon"; + inline static constexpr const char* PEN20_CHICOMON_FQNAME = PEN20_CHICOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_CHICOMON_FQNAME_LEN = sizeof(PEN20_CHICOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_CHICOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_CHICOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_CHICOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_CHICOMON_ANIM_INDEX = 27; + + // Name: Choromon + inline static constexpr char PEN20_CHOROMON_FQID_ARR[] = "pen20:choromon"; + inline static constexpr const char* PEN20_CHOROMON_FQID = PEN20_CHOROMON_FQID_ARR; + inline static constexpr size_t PEN20_CHOROMON_FQID_LEN = sizeof(PEN20_CHOROMON_FQID_ARR)-1; + inline static constexpr char PEN20_CHOROMON_ID_ARR[] = "choromon"; + inline static constexpr const char* PEN20_CHOROMON_ID = PEN20_CHOROMON_ID_ARR; + inline static constexpr size_t PEN20_CHOROMON_ID_LEN = sizeof(PEN20_CHOROMON_ID)-1; + inline static constexpr char PEN20_CHOROMON_NAME_ARR[] = "Choromon"; + inline static constexpr const char* PEN20_CHOROMON_NAME = PEN20_CHOROMON_NAME_ARR; + inline static constexpr size_t PEN20_CHOROMON_NAME_LEN = sizeof(PEN20_CHOROMON_NAME_ARR)-1; + inline static constexpr char PEN20_CHOROMON_FQNAME_ARR[] = "pen20:Choromon"; + inline static constexpr const char* PEN20_CHOROMON_FQNAME = PEN20_CHOROMON_FQNAME_ARR; + inline static constexpr size_t PEN20_CHOROMON_FQNAME_LEN = sizeof(PEN20_CHOROMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_CHOROMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_CHOROMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_CHOROMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_CHOROMON_ANIM_INDEX = 28; + + // Name: Clockmon + inline static constexpr char PEN20_CLOCKMON_FQID_ARR[] = "pen20:clockmon"; + inline static constexpr const char* PEN20_CLOCKMON_FQID = PEN20_CLOCKMON_FQID_ARR; + inline static constexpr size_t PEN20_CLOCKMON_FQID_LEN = sizeof(PEN20_CLOCKMON_FQID_ARR)-1; + inline static constexpr char PEN20_CLOCKMON_ID_ARR[] = "clockmon"; + inline static constexpr const char* PEN20_CLOCKMON_ID = PEN20_CLOCKMON_ID_ARR; + inline static constexpr size_t PEN20_CLOCKMON_ID_LEN = sizeof(PEN20_CLOCKMON_ID)-1; + inline static constexpr char PEN20_CLOCKMON_NAME_ARR[] = "Clockmon"; + inline static constexpr const char* PEN20_CLOCKMON_NAME = PEN20_CLOCKMON_NAME_ARR; + inline static constexpr size_t PEN20_CLOCKMON_NAME_LEN = sizeof(PEN20_CLOCKMON_NAME_ARR)-1; + inline static constexpr char PEN20_CLOCKMON_FQNAME_ARR[] = "pen20:Clockmon"; + inline static constexpr const char* PEN20_CLOCKMON_FQNAME = PEN20_CLOCKMON_FQNAME_ARR; + inline static constexpr size_t PEN20_CLOCKMON_FQNAME_LEN = sizeof(PEN20_CLOCKMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_CLOCKMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_CLOCKMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_CLOCKMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_CLOCKMON_ANIM_INDEX = 29; + + // Name: Cocomon + inline static constexpr char PEN20_COCOMON_FQID_ARR[] = "pen20:cocomon"; + inline static constexpr const char* PEN20_COCOMON_FQID = PEN20_COCOMON_FQID_ARR; + inline static constexpr size_t PEN20_COCOMON_FQID_LEN = sizeof(PEN20_COCOMON_FQID_ARR)-1; + inline static constexpr char PEN20_COCOMON_ID_ARR[] = "cocomon"; + inline static constexpr const char* PEN20_COCOMON_ID = PEN20_COCOMON_ID_ARR; + inline static constexpr size_t PEN20_COCOMON_ID_LEN = sizeof(PEN20_COCOMON_ID)-1; + inline static constexpr char PEN20_COCOMON_NAME_ARR[] = "Cocomon"; + inline static constexpr const char* PEN20_COCOMON_NAME = PEN20_COCOMON_NAME_ARR; + inline static constexpr size_t PEN20_COCOMON_NAME_LEN = sizeof(PEN20_COCOMON_NAME_ARR)-1; + inline static constexpr char PEN20_COCOMON_FQNAME_ARR[] = "pen20:Cocomon"; + inline static constexpr const char* PEN20_COCOMON_FQNAME = PEN20_COCOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_COCOMON_FQNAME_LEN = sizeof(PEN20_COCOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_COCOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_COCOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_COCOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_COCOMON_ANIM_INDEX = 30; + + // Name: Cotsucomon + inline static constexpr char PEN20_COTSUCOMON_FQID_ARR[] = "pen20:cotsucomon"; + inline static constexpr const char* PEN20_COTSUCOMON_FQID = PEN20_COTSUCOMON_FQID_ARR; + inline static constexpr size_t PEN20_COTSUCOMON_FQID_LEN = sizeof(PEN20_COTSUCOMON_FQID_ARR)-1; + inline static constexpr char PEN20_COTSUCOMON_ID_ARR[] = "cotsucomon"; + inline static constexpr const char* PEN20_COTSUCOMON_ID = PEN20_COTSUCOMON_ID_ARR; + inline static constexpr size_t PEN20_COTSUCOMON_ID_LEN = sizeof(PEN20_COTSUCOMON_ID)-1; + inline static constexpr char PEN20_COTSUCOMON_NAME_ARR[] = "Cotsucomon"; + inline static constexpr const char* PEN20_COTSUCOMON_NAME = PEN20_COTSUCOMON_NAME_ARR; + inline static constexpr size_t PEN20_COTSUCOMON_NAME_LEN = sizeof(PEN20_COTSUCOMON_NAME_ARR)-1; + inline static constexpr char PEN20_COTSUCOMON_FQNAME_ARR[] = "pen20:Cotsucomon"; + inline static constexpr const char* PEN20_COTSUCOMON_FQNAME = PEN20_COTSUCOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_COTSUCOMON_FQNAME_LEN = sizeof(PEN20_COTSUCOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_COTSUCOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_COTSUCOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_COTSUCOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_COTSUCOMON_ANIM_INDEX = 31; + + // Name: Cyberdramon + inline static constexpr char PEN20_CYBERDRAMON_FQID_ARR[] = "pen20:cyberdramon"; + inline static constexpr const char* PEN20_CYBERDRAMON_FQID = PEN20_CYBERDRAMON_FQID_ARR; + inline static constexpr size_t PEN20_CYBERDRAMON_FQID_LEN = sizeof(PEN20_CYBERDRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_CYBERDRAMON_ID_ARR[] = "cyberdramon"; + inline static constexpr const char* PEN20_CYBERDRAMON_ID = PEN20_CYBERDRAMON_ID_ARR; + inline static constexpr size_t PEN20_CYBERDRAMON_ID_LEN = sizeof(PEN20_CYBERDRAMON_ID)-1; + inline static constexpr char PEN20_CYBERDRAMON_NAME_ARR[] = "Cyberdramon"; + inline static constexpr const char* PEN20_CYBERDRAMON_NAME = PEN20_CYBERDRAMON_NAME_ARR; + inline static constexpr size_t PEN20_CYBERDRAMON_NAME_LEN = sizeof(PEN20_CYBERDRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_CYBERDRAMON_FQNAME_ARR[] = "pen20:Cyberdramon"; + inline static constexpr const char* PEN20_CYBERDRAMON_FQNAME = PEN20_CYBERDRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_CYBERDRAMON_FQNAME_LEN = sizeof(PEN20_CYBERDRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_CYBERDRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_CYBERDRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_CYBERDRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_CYBERDRAMON_ANIM_INDEX = 32; + + // Name: Dagomon + inline static constexpr char PEN20_DAGOMON_FQID_ARR[] = "pen20:dagomon"; + inline static constexpr const char* PEN20_DAGOMON_FQID = PEN20_DAGOMON_FQID_ARR; + inline static constexpr size_t PEN20_DAGOMON_FQID_LEN = sizeof(PEN20_DAGOMON_FQID_ARR)-1; + inline static constexpr char PEN20_DAGOMON_ID_ARR[] = "dagomon"; + inline static constexpr const char* PEN20_DAGOMON_ID = PEN20_DAGOMON_ID_ARR; + inline static constexpr size_t PEN20_DAGOMON_ID_LEN = sizeof(PEN20_DAGOMON_ID)-1; + inline static constexpr char PEN20_DAGOMON_NAME_ARR[] = "Dagomon"; + inline static constexpr const char* PEN20_DAGOMON_NAME = PEN20_DAGOMON_NAME_ARR; + inline static constexpr size_t PEN20_DAGOMON_NAME_LEN = sizeof(PEN20_DAGOMON_NAME_ARR)-1; + inline static constexpr char PEN20_DAGOMON_FQNAME_ARR[] = "pen20:Dagomon"; + inline static constexpr const char* PEN20_DAGOMON_FQNAME = PEN20_DAGOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_DAGOMON_FQNAME_LEN = sizeof(PEN20_DAGOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_DAGOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_DAGOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_DAGOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_DAGOMON_ANIM_INDEX = 33; + + // Name: Darkdramon + inline static constexpr char PEN20_DARKDRAMON_FQID_ARR[] = "pen20:darkdramon"; + inline static constexpr const char* PEN20_DARKDRAMON_FQID = PEN20_DARKDRAMON_FQID_ARR; + inline static constexpr size_t PEN20_DARKDRAMON_FQID_LEN = sizeof(PEN20_DARKDRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_DARKDRAMON_ID_ARR[] = "darkdramon"; + inline static constexpr const char* PEN20_DARKDRAMON_ID = PEN20_DARKDRAMON_ID_ARR; + inline static constexpr size_t PEN20_DARKDRAMON_ID_LEN = sizeof(PEN20_DARKDRAMON_ID)-1; + inline static constexpr char PEN20_DARKDRAMON_NAME_ARR[] = "Darkdramon"; + inline static constexpr const char* PEN20_DARKDRAMON_NAME = PEN20_DARKDRAMON_NAME_ARR; + inline static constexpr size_t PEN20_DARKDRAMON_NAME_LEN = sizeof(PEN20_DARKDRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_DARKDRAMON_FQNAME_ARR[] = "pen20:Darkdramon"; + inline static constexpr const char* PEN20_DARKDRAMON_FQNAME = PEN20_DARKDRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_DARKDRAMON_FQNAME_LEN = sizeof(PEN20_DARKDRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_DARKDRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_DARKDRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_DARKDRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_DARKDRAMON_ANIM_INDEX = 34; + + // Name: Dark Knightmon + inline static constexpr char PEN20_DARK_KNIGHTMON_FQID_ARR[] = "pen20:dark_knightmon"; + inline static constexpr const char* PEN20_DARK_KNIGHTMON_FQID = PEN20_DARK_KNIGHTMON_FQID_ARR; + inline static constexpr size_t PEN20_DARK_KNIGHTMON_FQID_LEN = sizeof(PEN20_DARK_KNIGHTMON_FQID_ARR)-1; + inline static constexpr char PEN20_DARK_KNIGHTMON_ID_ARR[] = "dark_knightmon"; + inline static constexpr const char* PEN20_DARK_KNIGHTMON_ID = PEN20_DARK_KNIGHTMON_ID_ARR; + inline static constexpr size_t PEN20_DARK_KNIGHTMON_ID_LEN = sizeof(PEN20_DARK_KNIGHTMON_ID)-1; + inline static constexpr char PEN20_DARK_KNIGHTMON_NAME_ARR[] = "Dark Knightmon"; + inline static constexpr const char* PEN20_DARK_KNIGHTMON_NAME = PEN20_DARK_KNIGHTMON_NAME_ARR; + inline static constexpr size_t PEN20_DARK_KNIGHTMON_NAME_LEN = sizeof(PEN20_DARK_KNIGHTMON_NAME_ARR)-1; + inline static constexpr char PEN20_DARK_KNIGHTMON_FQNAME_ARR[] = "pen20:Dark Knightmon"; + inline static constexpr const char* PEN20_DARK_KNIGHTMON_FQNAME = PEN20_DARK_KNIGHTMON_FQNAME_ARR; + inline static constexpr size_t PEN20_DARK_KNIGHTMON_FQNAME_LEN = sizeof(PEN20_DARK_KNIGHTMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_DARK_KNIGHTMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_DARK_KNIGHTMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_DARK_KNIGHTMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_DARK_KNIGHTMON_ANIM_INDEX = 35; + + // Name: Death Meramon + inline static constexpr char PEN20_DEATH_MERAMON_FQID_ARR[] = "pen20:death_meramon"; + inline static constexpr const char* PEN20_DEATH_MERAMON_FQID = PEN20_DEATH_MERAMON_FQID_ARR; + inline static constexpr size_t PEN20_DEATH_MERAMON_FQID_LEN = sizeof(PEN20_DEATH_MERAMON_FQID_ARR)-1; + inline static constexpr char PEN20_DEATH_MERAMON_ID_ARR[] = "death_meramon"; + inline static constexpr const char* PEN20_DEATH_MERAMON_ID = PEN20_DEATH_MERAMON_ID_ARR; + inline static constexpr size_t PEN20_DEATH_MERAMON_ID_LEN = sizeof(PEN20_DEATH_MERAMON_ID)-1; + inline static constexpr char PEN20_DEATH_MERAMON_NAME_ARR[] = "Death Meramon"; + inline static constexpr const char* PEN20_DEATH_MERAMON_NAME = PEN20_DEATH_MERAMON_NAME_ARR; + inline static constexpr size_t PEN20_DEATH_MERAMON_NAME_LEN = sizeof(PEN20_DEATH_MERAMON_NAME_ARR)-1; + inline static constexpr char PEN20_DEATH_MERAMON_FQNAME_ARR[] = "pen20:Death Meramon"; + inline static constexpr const char* PEN20_DEATH_MERAMON_FQNAME = PEN20_DEATH_MERAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_DEATH_MERAMON_FQNAME_LEN = sizeof(PEN20_DEATH_MERAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_DEATH_MERAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_DEATH_MERAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_DEATH_MERAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_DEATH_MERAMON_ANIM_INDEX = 36; + + // Name: Delumon + inline static constexpr char PEN20_DELUMON_FQID_ARR[] = "pen20:delumon"; + inline static constexpr const char* PEN20_DELUMON_FQID = PEN20_DELUMON_FQID_ARR; + inline static constexpr size_t PEN20_DELUMON_FQID_LEN = sizeof(PEN20_DELUMON_FQID_ARR)-1; + inline static constexpr char PEN20_DELUMON_ID_ARR[] = "delumon"; + inline static constexpr const char* PEN20_DELUMON_ID = PEN20_DELUMON_ID_ARR; + inline static constexpr size_t PEN20_DELUMON_ID_LEN = sizeof(PEN20_DELUMON_ID)-1; + inline static constexpr char PEN20_DELUMON_NAME_ARR[] = "Delumon"; + inline static constexpr const char* PEN20_DELUMON_NAME = PEN20_DELUMON_NAME_ARR; + inline static constexpr size_t PEN20_DELUMON_NAME_LEN = sizeof(PEN20_DELUMON_NAME_ARR)-1; + inline static constexpr char PEN20_DELUMON_FQNAME_ARR[] = "pen20:Delumon"; + inline static constexpr const char* PEN20_DELUMON_FQNAME = PEN20_DELUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_DELUMON_FQNAME_LEN = sizeof(PEN20_DELUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_DELUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_DELUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_DELUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_DELUMON_ANIM_INDEX = 37; + + // Name: Dokugumon + inline static constexpr char PEN20_DOKUGUMON_FQID_ARR[] = "pen20:dokugumon"; + inline static constexpr const char* PEN20_DOKUGUMON_FQID = PEN20_DOKUGUMON_FQID_ARR; + inline static constexpr size_t PEN20_DOKUGUMON_FQID_LEN = sizeof(PEN20_DOKUGUMON_FQID_ARR)-1; + inline static constexpr char PEN20_DOKUGUMON_ID_ARR[] = "dokugumon"; + inline static constexpr const char* PEN20_DOKUGUMON_ID = PEN20_DOKUGUMON_ID_ARR; + inline static constexpr size_t PEN20_DOKUGUMON_ID_LEN = sizeof(PEN20_DOKUGUMON_ID)-1; + inline static constexpr char PEN20_DOKUGUMON_NAME_ARR[] = "Dokugumon"; + inline static constexpr const char* PEN20_DOKUGUMON_NAME = PEN20_DOKUGUMON_NAME_ARR; + inline static constexpr size_t PEN20_DOKUGUMON_NAME_LEN = sizeof(PEN20_DOKUGUMON_NAME_ARR)-1; + inline static constexpr char PEN20_DOKUGUMON_FQNAME_ARR[] = "pen20:Dokugumon"; + inline static constexpr const char* PEN20_DOKUGUMON_FQNAME = PEN20_DOKUGUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_DOKUGUMON_FQNAME_LEN = sizeof(PEN20_DOKUGUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_DOKUGUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_DOKUGUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_DOKUGUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_DOKUGUMON_ANIM_INDEX = 38; + + // Name: DORUgoramon + inline static constexpr char PEN20_DORUGORAMON_FQID_ARR[] = "pen20:dorugoramon"; + inline static constexpr const char* PEN20_DORUGORAMON_FQID = PEN20_DORUGORAMON_FQID_ARR; + inline static constexpr size_t PEN20_DORUGORAMON_FQID_LEN = sizeof(PEN20_DORUGORAMON_FQID_ARR)-1; + inline static constexpr char PEN20_DORUGORAMON_ID_ARR[] = "dorugoramon"; + inline static constexpr const char* PEN20_DORUGORAMON_ID = PEN20_DORUGORAMON_ID_ARR; + inline static constexpr size_t PEN20_DORUGORAMON_ID_LEN = sizeof(PEN20_DORUGORAMON_ID)-1; + inline static constexpr char PEN20_DORUGORAMON_NAME_ARR[] = "DORUgoramon"; + inline static constexpr const char* PEN20_DORUGORAMON_NAME = PEN20_DORUGORAMON_NAME_ARR; + inline static constexpr size_t PEN20_DORUGORAMON_NAME_LEN = sizeof(PEN20_DORUGORAMON_NAME_ARR)-1; + inline static constexpr char PEN20_DORUGORAMON_FQNAME_ARR[] = "pen20:DORUgoramon"; + inline static constexpr const char* PEN20_DORUGORAMON_FQNAME = PEN20_DORUGORAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_DORUGORAMON_FQNAME_LEN = sizeof(PEN20_DORUGORAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_DORUGORAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_DORUGORAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_DORUGORAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_DORUGORAMON_ANIM_INDEX = 39; + + // Name: Ebidramon + inline static constexpr char PEN20_EBIDRAMON_FQID_ARR[] = "pen20:ebidramon"; + inline static constexpr const char* PEN20_EBIDRAMON_FQID = PEN20_EBIDRAMON_FQID_ARR; + inline static constexpr size_t PEN20_EBIDRAMON_FQID_LEN = sizeof(PEN20_EBIDRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_EBIDRAMON_ID_ARR[] = "ebidramon"; + inline static constexpr const char* PEN20_EBIDRAMON_ID = PEN20_EBIDRAMON_ID_ARR; + inline static constexpr size_t PEN20_EBIDRAMON_ID_LEN = sizeof(PEN20_EBIDRAMON_ID)-1; + inline static constexpr char PEN20_EBIDRAMON_NAME_ARR[] = "Ebidramon"; + inline static constexpr const char* PEN20_EBIDRAMON_NAME = PEN20_EBIDRAMON_NAME_ARR; + inline static constexpr size_t PEN20_EBIDRAMON_NAME_LEN = sizeof(PEN20_EBIDRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_EBIDRAMON_FQNAME_ARR[] = "pen20:Ebidramon"; + inline static constexpr const char* PEN20_EBIDRAMON_FQNAME = PEN20_EBIDRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_EBIDRAMON_FQNAME_LEN = sizeof(PEN20_EBIDRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_EBIDRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_EBIDRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_EBIDRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_EBIDRAMON_ANIM_INDEX = 40; + + // Name: Fantomon + inline static constexpr char PEN20_FANTOMON_FQID_ARR[] = "pen20:fantomon"; + inline static constexpr const char* PEN20_FANTOMON_FQID = PEN20_FANTOMON_FQID_ARR; + inline static constexpr size_t PEN20_FANTOMON_FQID_LEN = sizeof(PEN20_FANTOMON_FQID_ARR)-1; + inline static constexpr char PEN20_FANTOMON_ID_ARR[] = "fantomon"; + inline static constexpr const char* PEN20_FANTOMON_ID = PEN20_FANTOMON_ID_ARR; + inline static constexpr size_t PEN20_FANTOMON_ID_LEN = sizeof(PEN20_FANTOMON_ID)-1; + inline static constexpr char PEN20_FANTOMON_NAME_ARR[] = "Fantomon"; + inline static constexpr const char* PEN20_FANTOMON_NAME = PEN20_FANTOMON_NAME_ARR; + inline static constexpr size_t PEN20_FANTOMON_NAME_LEN = sizeof(PEN20_FANTOMON_NAME_ARR)-1; + inline static constexpr char PEN20_FANTOMON_FQNAME_ARR[] = "pen20:Fantomon"; + inline static constexpr const char* PEN20_FANTOMON_FQNAME = PEN20_FANTOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_FANTOMON_FQNAME_LEN = sizeof(PEN20_FANTOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_FANTOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_FANTOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_FANTOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_FANTOMON_ANIM_INDEX = 41; + + // Name: Floramon + inline static constexpr char PEN20_FLORAMON_FQID_ARR[] = "pen20:floramon"; + inline static constexpr const char* PEN20_FLORAMON_FQID = PEN20_FLORAMON_FQID_ARR; + inline static constexpr size_t PEN20_FLORAMON_FQID_LEN = sizeof(PEN20_FLORAMON_FQID_ARR)-1; + inline static constexpr char PEN20_FLORAMON_ID_ARR[] = "floramon"; + inline static constexpr const char* PEN20_FLORAMON_ID = PEN20_FLORAMON_ID_ARR; + inline static constexpr size_t PEN20_FLORAMON_ID_LEN = sizeof(PEN20_FLORAMON_ID)-1; + inline static constexpr char PEN20_FLORAMON_NAME_ARR[] = "Floramon"; + inline static constexpr const char* PEN20_FLORAMON_NAME = PEN20_FLORAMON_NAME_ARR; + inline static constexpr size_t PEN20_FLORAMON_NAME_LEN = sizeof(PEN20_FLORAMON_NAME_ARR)-1; + inline static constexpr char PEN20_FLORAMON_FQNAME_ARR[] = "pen20:Floramon"; + inline static constexpr const char* PEN20_FLORAMON_FQNAME = PEN20_FLORAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_FLORAMON_FQNAME_LEN = sizeof(PEN20_FLORAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_FLORAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_FLORAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_FLORAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_FLORAMON_ANIM_INDEX = 42; + + // Name: Fufumon + inline static constexpr char PEN20_FUFUMON_FQID_ARR[] = "pen20:fufumon"; + inline static constexpr const char* PEN20_FUFUMON_FQID = PEN20_FUFUMON_FQID_ARR; + inline static constexpr size_t PEN20_FUFUMON_FQID_LEN = sizeof(PEN20_FUFUMON_FQID_ARR)-1; + inline static constexpr char PEN20_FUFUMON_ID_ARR[] = "fufumon"; + inline static constexpr const char* PEN20_FUFUMON_ID = PEN20_FUFUMON_ID_ARR; + inline static constexpr size_t PEN20_FUFUMON_ID_LEN = sizeof(PEN20_FUFUMON_ID)-1; + inline static constexpr char PEN20_FUFUMON_NAME_ARR[] = "Fufumon"; + inline static constexpr const char* PEN20_FUFUMON_NAME = PEN20_FUFUMON_NAME_ARR; + inline static constexpr size_t PEN20_FUFUMON_NAME_LEN = sizeof(PEN20_FUFUMON_NAME_ARR)-1; + inline static constexpr char PEN20_FUFUMON_FQNAME_ARR[] = "pen20:Fufumon"; + inline static constexpr const char* PEN20_FUFUMON_FQNAME = PEN20_FUFUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_FUFUMON_FQNAME_LEN = sizeof(PEN20_FUFUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_FUFUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_FUFUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_FUFUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_FUFUMON_ANIM_INDEX = 43; + + // Name: Galgomon + inline static constexpr char PEN20_GALGOMON_FQID_ARR[] = "pen20:galgomon"; + inline static constexpr const char* PEN20_GALGOMON_FQID = PEN20_GALGOMON_FQID_ARR; + inline static constexpr size_t PEN20_GALGOMON_FQID_LEN = sizeof(PEN20_GALGOMON_FQID_ARR)-1; + inline static constexpr char PEN20_GALGOMON_ID_ARR[] = "galgomon"; + inline static constexpr const char* PEN20_GALGOMON_ID = PEN20_GALGOMON_ID_ARR; + inline static constexpr size_t PEN20_GALGOMON_ID_LEN = sizeof(PEN20_GALGOMON_ID)-1; + inline static constexpr char PEN20_GALGOMON_NAME_ARR[] = "Galgomon"; + inline static constexpr const char* PEN20_GALGOMON_NAME = PEN20_GALGOMON_NAME_ARR; + inline static constexpr size_t PEN20_GALGOMON_NAME_LEN = sizeof(PEN20_GALGOMON_NAME_ARR)-1; + inline static constexpr char PEN20_GALGOMON_FQNAME_ARR[] = "pen20:Galgomon"; + inline static constexpr const char* PEN20_GALGOMON_FQNAME = PEN20_GALGOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_GALGOMON_FQNAME_LEN = sizeof(PEN20_GALGOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_GALGOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_GALGOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_GALGOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_GALGOMON_ANIM_INDEX = 44; + + // Name: Ganimon + inline static constexpr char PEN20_GANIMON_FQID_ARR[] = "pen20:ganimon"; + inline static constexpr const char* PEN20_GANIMON_FQID = PEN20_GANIMON_FQID_ARR; + inline static constexpr size_t PEN20_GANIMON_FQID_LEN = sizeof(PEN20_GANIMON_FQID_ARR)-1; + inline static constexpr char PEN20_GANIMON_ID_ARR[] = "ganimon"; + inline static constexpr const char* PEN20_GANIMON_ID = PEN20_GANIMON_ID_ARR; + inline static constexpr size_t PEN20_GANIMON_ID_LEN = sizeof(PEN20_GANIMON_ID)-1; + inline static constexpr char PEN20_GANIMON_NAME_ARR[] = "Ganimon"; + inline static constexpr const char* PEN20_GANIMON_NAME = PEN20_GANIMON_NAME_ARR; + inline static constexpr size_t PEN20_GANIMON_NAME_LEN = sizeof(PEN20_GANIMON_NAME_ARR)-1; + inline static constexpr char PEN20_GANIMON_FQNAME_ARR[] = "pen20:Ganimon"; + inline static constexpr const char* PEN20_GANIMON_FQNAME = PEN20_GANIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_GANIMON_FQNAME_LEN = sizeof(PEN20_GANIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_GANIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_GANIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_GANIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_GANIMON_ANIM_INDEX = 45; + + // Name: Garudamon + inline static constexpr char PEN20_GARUDAMON_FQID_ARR[] = "pen20:garudamon"; + inline static constexpr const char* PEN20_GARUDAMON_FQID = PEN20_GARUDAMON_FQID_ARR; + inline static constexpr size_t PEN20_GARUDAMON_FQID_LEN = sizeof(PEN20_GARUDAMON_FQID_ARR)-1; + inline static constexpr char PEN20_GARUDAMON_ID_ARR[] = "garudamon"; + inline static constexpr const char* PEN20_GARUDAMON_ID = PEN20_GARUDAMON_ID_ARR; + inline static constexpr size_t PEN20_GARUDAMON_ID_LEN = sizeof(PEN20_GARUDAMON_ID)-1; + inline static constexpr char PEN20_GARUDAMON_NAME_ARR[] = "Garudamon"; + inline static constexpr const char* PEN20_GARUDAMON_NAME = PEN20_GARUDAMON_NAME_ARR; + inline static constexpr size_t PEN20_GARUDAMON_NAME_LEN = sizeof(PEN20_GARUDAMON_NAME_ARR)-1; + inline static constexpr char PEN20_GARUDAMON_FQNAME_ARR[] = "pen20:Garudamon"; + inline static constexpr const char* PEN20_GARUDAMON_FQNAME = PEN20_GARUDAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_GARUDAMON_FQNAME_LEN = sizeof(PEN20_GARUDAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_GARUDAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_GARUDAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_GARUDAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_GARUDAMON_ANIM_INDEX = 46; + + // Name: Gekomon + inline static constexpr char PEN20_GEKOMON_FQID_ARR[] = "pen20:gekomon"; + inline static constexpr const char* PEN20_GEKOMON_FQID = PEN20_GEKOMON_FQID_ARR; + inline static constexpr size_t PEN20_GEKOMON_FQID_LEN = sizeof(PEN20_GEKOMON_FQID_ARR)-1; + inline static constexpr char PEN20_GEKOMON_ID_ARR[] = "gekomon"; + inline static constexpr const char* PEN20_GEKOMON_ID = PEN20_GEKOMON_ID_ARR; + inline static constexpr size_t PEN20_GEKOMON_ID_LEN = sizeof(PEN20_GEKOMON_ID)-1; + inline static constexpr char PEN20_GEKOMON_NAME_ARR[] = "Gekomon"; + inline static constexpr const char* PEN20_GEKOMON_NAME = PEN20_GEKOMON_NAME_ARR; + inline static constexpr size_t PEN20_GEKOMON_NAME_LEN = sizeof(PEN20_GEKOMON_NAME_ARR)-1; + inline static constexpr char PEN20_GEKOMON_FQNAME_ARR[] = "pen20:Gekomon"; + inline static constexpr const char* PEN20_GEKOMON_FQNAME = PEN20_GEKOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_GEKOMON_FQNAME_LEN = sizeof(PEN20_GEKOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_GEKOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_GEKOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_GEKOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_GEKOMON_ANIM_INDEX = 47; + + // Name: Gerbemon + inline static constexpr char PEN20_GERBEMON_FQID_ARR[] = "pen20:gerbemon"; + inline static constexpr const char* PEN20_GERBEMON_FQID = PEN20_GERBEMON_FQID_ARR; + inline static constexpr size_t PEN20_GERBEMON_FQID_LEN = sizeof(PEN20_GERBEMON_FQID_ARR)-1; + inline static constexpr char PEN20_GERBEMON_ID_ARR[] = "gerbemon"; + inline static constexpr const char* PEN20_GERBEMON_ID = PEN20_GERBEMON_ID_ARR; + inline static constexpr size_t PEN20_GERBEMON_ID_LEN = sizeof(PEN20_GERBEMON_ID)-1; + inline static constexpr char PEN20_GERBEMON_NAME_ARR[] = "Gerbemon"; + inline static constexpr const char* PEN20_GERBEMON_NAME = PEN20_GERBEMON_NAME_ARR; + inline static constexpr size_t PEN20_GERBEMON_NAME_LEN = sizeof(PEN20_GERBEMON_NAME_ARR)-1; + inline static constexpr char PEN20_GERBEMON_FQNAME_ARR[] = "pen20:Gerbemon"; + inline static constexpr const char* PEN20_GERBEMON_FQNAME = PEN20_GERBEMON_FQNAME_ARR; + inline static constexpr size_t PEN20_GERBEMON_FQNAME_LEN = sizeof(PEN20_GERBEMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_GERBEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_GERBEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_GERBEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_GERBEMON_ANIM_INDEX = 48; + + // Name: Gesomon + inline static constexpr char PEN20_GESOMON_FQID_ARR[] = "pen20:gesomon"; + inline static constexpr const char* PEN20_GESOMON_FQID = PEN20_GESOMON_FQID_ARR; + inline static constexpr size_t PEN20_GESOMON_FQID_LEN = sizeof(PEN20_GESOMON_FQID_ARR)-1; + inline static constexpr char PEN20_GESOMON_ID_ARR[] = "gesomon"; + inline static constexpr const char* PEN20_GESOMON_ID = PEN20_GESOMON_ID_ARR; + inline static constexpr size_t PEN20_GESOMON_ID_LEN = sizeof(PEN20_GESOMON_ID)-1; + inline static constexpr char PEN20_GESOMON_NAME_ARR[] = "Gesomon"; + inline static constexpr const char* PEN20_GESOMON_NAME = PEN20_GESOMON_NAME_ARR; + inline static constexpr size_t PEN20_GESOMON_NAME_LEN = sizeof(PEN20_GESOMON_NAME_ARR)-1; + inline static constexpr char PEN20_GESOMON_FQNAME_ARR[] = "pen20:Gesomon"; + inline static constexpr const char* PEN20_GESOMON_FQNAME = PEN20_GESOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_GESOMON_FQNAME_LEN = sizeof(PEN20_GESOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_GESOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_GESOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_GESOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_GESOMON_ANIM_INDEX = 49; + + // Name: Ginryumon + inline static constexpr char PEN20_GINRYUMON_FQID_ARR[] = "pen20:ginryumon"; + inline static constexpr const char* PEN20_GINRYUMON_FQID = PEN20_GINRYUMON_FQID_ARR; + inline static constexpr size_t PEN20_GINRYUMON_FQID_LEN = sizeof(PEN20_GINRYUMON_FQID_ARR)-1; + inline static constexpr char PEN20_GINRYUMON_ID_ARR[] = "ginryumon"; + inline static constexpr const char* PEN20_GINRYUMON_ID = PEN20_GINRYUMON_ID_ARR; + inline static constexpr size_t PEN20_GINRYUMON_ID_LEN = sizeof(PEN20_GINRYUMON_ID)-1; + inline static constexpr char PEN20_GINRYUMON_NAME_ARR[] = "Ginryumon"; + inline static constexpr const char* PEN20_GINRYUMON_NAME = PEN20_GINRYUMON_NAME_ARR; + inline static constexpr size_t PEN20_GINRYUMON_NAME_LEN = sizeof(PEN20_GINRYUMON_NAME_ARR)-1; + inline static constexpr char PEN20_GINRYUMON_FQNAME_ARR[] = "pen20:Ginryumon"; + inline static constexpr const char* PEN20_GINRYUMON_FQNAME = PEN20_GINRYUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_GINRYUMON_FQNAME_LEN = sizeof(PEN20_GINRYUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_GINRYUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_GINRYUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_GINRYUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_GINRYUMON_ANIM_INDEX = 50; + + // Name: Gomamon + inline static constexpr char PEN20_GOMAMON_FQID_ARR[] = "pen20:gomamon"; + inline static constexpr const char* PEN20_GOMAMON_FQID = PEN20_GOMAMON_FQID_ARR; + inline static constexpr size_t PEN20_GOMAMON_FQID_LEN = sizeof(PEN20_GOMAMON_FQID_ARR)-1; + inline static constexpr char PEN20_GOMAMON_ID_ARR[] = "gomamon"; + inline static constexpr const char* PEN20_GOMAMON_ID = PEN20_GOMAMON_ID_ARR; + inline static constexpr size_t PEN20_GOMAMON_ID_LEN = sizeof(PEN20_GOMAMON_ID)-1; + inline static constexpr char PEN20_GOMAMON_NAME_ARR[] = "Gomamon"; + inline static constexpr const char* PEN20_GOMAMON_NAME = PEN20_GOMAMON_NAME_ARR; + inline static constexpr size_t PEN20_GOMAMON_NAME_LEN = sizeof(PEN20_GOMAMON_NAME_ARR)-1; + inline static constexpr char PEN20_GOMAMON_FQNAME_ARR[] = "pen20:Gomamon"; + inline static constexpr const char* PEN20_GOMAMON_FQNAME = PEN20_GOMAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_GOMAMON_FQNAME_LEN = sizeof(PEN20_GOMAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_GOMAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_GOMAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_GOMAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_GOMAMON_ANIM_INDEX = 51; + + // Name: Gottsumon + inline static constexpr char PEN20_GOTTSUMON_FQID_ARR[] = "pen20:gottsumon"; + inline static constexpr const char* PEN20_GOTTSUMON_FQID = PEN20_GOTTSUMON_FQID_ARR; + inline static constexpr size_t PEN20_GOTTSUMON_FQID_LEN = sizeof(PEN20_GOTTSUMON_FQID_ARR)-1; + inline static constexpr char PEN20_GOTTSUMON_ID_ARR[] = "gottsumon"; + inline static constexpr const char* PEN20_GOTTSUMON_ID = PEN20_GOTTSUMON_ID_ARR; + inline static constexpr size_t PEN20_GOTTSUMON_ID_LEN = sizeof(PEN20_GOTTSUMON_ID)-1; + inline static constexpr char PEN20_GOTTSUMON_NAME_ARR[] = "Gottsumon"; + inline static constexpr const char* PEN20_GOTTSUMON_NAME = PEN20_GOTTSUMON_NAME_ARR; + inline static constexpr size_t PEN20_GOTTSUMON_NAME_LEN = sizeof(PEN20_GOTTSUMON_NAME_ARR)-1; + inline static constexpr char PEN20_GOTTSUMON_FQNAME_ARR[] = "pen20:Gottsumon"; + inline static constexpr const char* PEN20_GOTTSUMON_FQNAME = PEN20_GOTTSUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_GOTTSUMON_FQNAME_LEN = sizeof(PEN20_GOTTSUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_GOTTSUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_GOTTSUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_GOTTSUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_GOTTSUMON_ANIM_INDEX = 52; + + // Name: Griffomon + inline static constexpr char PEN20_GRIFFOMON_FQID_ARR[] = "pen20:griffomon"; + inline static constexpr const char* PEN20_GRIFFOMON_FQID = PEN20_GRIFFOMON_FQID_ARR; + inline static constexpr size_t PEN20_GRIFFOMON_FQID_LEN = sizeof(PEN20_GRIFFOMON_FQID_ARR)-1; + inline static constexpr char PEN20_GRIFFOMON_ID_ARR[] = "griffomon"; + inline static constexpr const char* PEN20_GRIFFOMON_ID = PEN20_GRIFFOMON_ID_ARR; + inline static constexpr size_t PEN20_GRIFFOMON_ID_LEN = sizeof(PEN20_GRIFFOMON_ID)-1; + inline static constexpr char PEN20_GRIFFOMON_NAME_ARR[] = "Griffomon"; + inline static constexpr const char* PEN20_GRIFFOMON_NAME = PEN20_GRIFFOMON_NAME_ARR; + inline static constexpr size_t PEN20_GRIFFOMON_NAME_LEN = sizeof(PEN20_GRIFFOMON_NAME_ARR)-1; + inline static constexpr char PEN20_GRIFFOMON_FQNAME_ARR[] = "pen20:Griffomon"; + inline static constexpr const char* PEN20_GRIFFOMON_FQNAME = PEN20_GRIFFOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_GRIFFOMON_FQNAME_LEN = sizeof(PEN20_GRIFFOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_GRIFFOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_GRIFFOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_GRIFFOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_GRIFFOMON_ANIM_INDEX = 53; + + // Name: Growmon + inline static constexpr char PEN20_GROWMON_FQID_ARR[] = "pen20:growmon"; + inline static constexpr const char* PEN20_GROWMON_FQID = PEN20_GROWMON_FQID_ARR; + inline static constexpr size_t PEN20_GROWMON_FQID_LEN = sizeof(PEN20_GROWMON_FQID_ARR)-1; + inline static constexpr char PEN20_GROWMON_ID_ARR[] = "growmon"; + inline static constexpr const char* PEN20_GROWMON_ID = PEN20_GROWMON_ID_ARR; + inline static constexpr size_t PEN20_GROWMON_ID_LEN = sizeof(PEN20_GROWMON_ID)-1; + inline static constexpr char PEN20_GROWMON_NAME_ARR[] = "Growmon"; + inline static constexpr const char* PEN20_GROWMON_NAME = PEN20_GROWMON_NAME_ARR; + inline static constexpr size_t PEN20_GROWMON_NAME_LEN = sizeof(PEN20_GROWMON_NAME_ARR)-1; + inline static constexpr char PEN20_GROWMON_FQNAME_ARR[] = "pen20:Growmon"; + inline static constexpr const char* PEN20_GROWMON_FQNAME = PEN20_GROWMON_FQNAME_ARR; + inline static constexpr size_t PEN20_GROWMON_FQNAME_LEN = sizeof(PEN20_GROWMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_GROWMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_GROWMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_GROWMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_GROWMON_ANIM_INDEX = 54; + + // Name: Guardromon + inline static constexpr char PEN20_GUARDROMON_FQID_ARR[] = "pen20:guardromon"; + inline static constexpr const char* PEN20_GUARDROMON_FQID = PEN20_GUARDROMON_FQID_ARR; + inline static constexpr size_t PEN20_GUARDROMON_FQID_LEN = sizeof(PEN20_GUARDROMON_FQID_ARR)-1; + inline static constexpr char PEN20_GUARDROMON_ID_ARR[] = "guardromon"; + inline static constexpr const char* PEN20_GUARDROMON_ID = PEN20_GUARDROMON_ID_ARR; + inline static constexpr size_t PEN20_GUARDROMON_ID_LEN = sizeof(PEN20_GUARDROMON_ID)-1; + inline static constexpr char PEN20_GUARDROMON_NAME_ARR[] = "Guardromon"; + inline static constexpr const char* PEN20_GUARDROMON_NAME = PEN20_GUARDROMON_NAME_ARR; + inline static constexpr size_t PEN20_GUARDROMON_NAME_LEN = sizeof(PEN20_GUARDROMON_NAME_ARR)-1; + inline static constexpr char PEN20_GUARDROMON_FQNAME_ARR[] = "pen20:Guardromon"; + inline static constexpr const char* PEN20_GUARDROMON_FQNAME = PEN20_GUARDROMON_FQNAME_ARR; + inline static constexpr size_t PEN20_GUARDROMON_FQNAME_LEN = sizeof(PEN20_GUARDROMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_GUARDROMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_GUARDROMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_GUARDROMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_GUARDROMON_ANIM_INDEX = 55; + + // Name: Guimon + inline static constexpr char PEN20_GUIMON_FQID_ARR[] = "pen20:guimon"; + inline static constexpr const char* PEN20_GUIMON_FQID = PEN20_GUIMON_FQID_ARR; + inline static constexpr size_t PEN20_GUIMON_FQID_LEN = sizeof(PEN20_GUIMON_FQID_ARR)-1; + inline static constexpr char PEN20_GUIMON_ID_ARR[] = "guimon"; + inline static constexpr const char* PEN20_GUIMON_ID = PEN20_GUIMON_ID_ARR; + inline static constexpr size_t PEN20_GUIMON_ID_LEN = sizeof(PEN20_GUIMON_ID)-1; + inline static constexpr char PEN20_GUIMON_NAME_ARR[] = "Guimon"; + inline static constexpr const char* PEN20_GUIMON_NAME = PEN20_GUIMON_NAME_ARR; + inline static constexpr size_t PEN20_GUIMON_NAME_LEN = sizeof(PEN20_GUIMON_NAME_ARR)-1; + inline static constexpr char PEN20_GUIMON_FQNAME_ARR[] = "pen20:Guimon"; + inline static constexpr const char* PEN20_GUIMON_FQNAME = PEN20_GUIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_GUIMON_FQNAME_LEN = sizeof(PEN20_GUIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_GUIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_GUIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_GUIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_GUIMON_ANIM_INDEX = 56; + + // Name: Gummymon + inline static constexpr char PEN20_GUMMYMON_FQID_ARR[] = "pen20:gummymon"; + inline static constexpr const char* PEN20_GUMMYMON_FQID = PEN20_GUMMYMON_FQID_ARR; + inline static constexpr size_t PEN20_GUMMYMON_FQID_LEN = sizeof(PEN20_GUMMYMON_FQID_ARR)-1; + inline static constexpr char PEN20_GUMMYMON_ID_ARR[] = "gummymon"; + inline static constexpr const char* PEN20_GUMMYMON_ID = PEN20_GUMMYMON_ID_ARR; + inline static constexpr size_t PEN20_GUMMYMON_ID_LEN = sizeof(PEN20_GUMMYMON_ID)-1; + inline static constexpr char PEN20_GUMMYMON_NAME_ARR[] = "Gummymon"; + inline static constexpr const char* PEN20_GUMMYMON_NAME = PEN20_GUMMYMON_NAME_ARR; + inline static constexpr size_t PEN20_GUMMYMON_NAME_LEN = sizeof(PEN20_GUMMYMON_NAME_ARR)-1; + inline static constexpr char PEN20_GUMMYMON_FQNAME_ARR[] = "pen20:Gummymon"; + inline static constexpr const char* PEN20_GUMMYMON_FQNAME = PEN20_GUMMYMON_FQNAME_ARR; + inline static constexpr size_t PEN20_GUMMYMON_FQNAME_LEN = sizeof(PEN20_GUMMYMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_GUMMYMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_GUMMYMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_GUMMYMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_GUMMYMON_ANIM_INDEX = 57; + + // Name: Hagurumon + inline static constexpr char PEN20_HAGURUMON_FQID_ARR[] = "pen20:hagurumon"; + inline static constexpr const char* PEN20_HAGURUMON_FQID = PEN20_HAGURUMON_FQID_ARR; + inline static constexpr size_t PEN20_HAGURUMON_FQID_LEN = sizeof(PEN20_HAGURUMON_FQID_ARR)-1; + inline static constexpr char PEN20_HAGURUMON_ID_ARR[] = "hagurumon"; + inline static constexpr const char* PEN20_HAGURUMON_ID = PEN20_HAGURUMON_ID_ARR; + inline static constexpr size_t PEN20_HAGURUMON_ID_LEN = sizeof(PEN20_HAGURUMON_ID)-1; + inline static constexpr char PEN20_HAGURUMON_NAME_ARR[] = "Hagurumon"; + inline static constexpr const char* PEN20_HAGURUMON_NAME = PEN20_HAGURUMON_NAME_ARR; + inline static constexpr size_t PEN20_HAGURUMON_NAME_LEN = sizeof(PEN20_HAGURUMON_NAME_ARR)-1; + inline static constexpr char PEN20_HAGURUMON_FQNAME_ARR[] = "pen20:Hagurumon"; + inline static constexpr const char* PEN20_HAGURUMON_FQNAME = PEN20_HAGURUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_HAGURUMON_FQNAME_LEN = sizeof(PEN20_HAGURUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_HAGURUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_HAGURUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_HAGURUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_HAGURUMON_ANIM_INDEX = 58; + + // Name: Hangymon + inline static constexpr char PEN20_HANGYMON_FQID_ARR[] = "pen20:hangymon"; + inline static constexpr const char* PEN20_HANGYMON_FQID = PEN20_HANGYMON_FQID_ARR; + inline static constexpr size_t PEN20_HANGYMON_FQID_LEN = sizeof(PEN20_HANGYMON_FQID_ARR)-1; + inline static constexpr char PEN20_HANGYMON_ID_ARR[] = "hangymon"; + inline static constexpr const char* PEN20_HANGYMON_ID = PEN20_HANGYMON_ID_ARR; + inline static constexpr size_t PEN20_HANGYMON_ID_LEN = sizeof(PEN20_HANGYMON_ID)-1; + inline static constexpr char PEN20_HANGYMON_NAME_ARR[] = "Hangymon"; + inline static constexpr const char* PEN20_HANGYMON_NAME = PEN20_HANGYMON_NAME_ARR; + inline static constexpr size_t PEN20_HANGYMON_NAME_LEN = sizeof(PEN20_HANGYMON_NAME_ARR)-1; + inline static constexpr char PEN20_HANGYMON_FQNAME_ARR[] = "pen20:Hangymon"; + inline static constexpr const char* PEN20_HANGYMON_FQNAME = PEN20_HANGYMON_FQNAME_ARR; + inline static constexpr size_t PEN20_HANGYMON_FQNAME_LEN = sizeof(PEN20_HANGYMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_HANGYMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_HANGYMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_HANGYMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_HANGYMON_ANIM_INDEX = 59; + + // Name: Hanumon + inline static constexpr char PEN20_HANUMON_FQID_ARR[] = "pen20:hanumon"; + inline static constexpr const char* PEN20_HANUMON_FQID = PEN20_HANUMON_FQID_ARR; + inline static constexpr size_t PEN20_HANUMON_FQID_LEN = sizeof(PEN20_HANUMON_FQID_ARR)-1; + inline static constexpr char PEN20_HANUMON_ID_ARR[] = "hanumon"; + inline static constexpr const char* PEN20_HANUMON_ID = PEN20_HANUMON_ID_ARR; + inline static constexpr size_t PEN20_HANUMON_ID_LEN = sizeof(PEN20_HANUMON_ID)-1; + inline static constexpr char PEN20_HANUMON_NAME_ARR[] = "Hanumon"; + inline static constexpr const char* PEN20_HANUMON_NAME = PEN20_HANUMON_NAME_ARR; + inline static constexpr size_t PEN20_HANUMON_NAME_LEN = sizeof(PEN20_HANUMON_NAME_ARR)-1; + inline static constexpr char PEN20_HANUMON_FQNAME_ARR[] = "pen20:Hanumon"; + inline static constexpr const char* PEN20_HANUMON_FQNAME = PEN20_HANUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_HANUMON_FQNAME_LEN = sizeof(PEN20_HANUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_HANUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_HANUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_HANUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_HANUMON_ANIM_INDEX = 60; + + // Name: Herkule Kabuterimon + inline static constexpr char PEN20_HERKULE_KABUTERIMON_FQID_ARR[] = "pen20:herkule_kabuterimon"; + inline static constexpr const char* PEN20_HERKULE_KABUTERIMON_FQID = PEN20_HERKULE_KABUTERIMON_FQID_ARR; + inline static constexpr size_t PEN20_HERKULE_KABUTERIMON_FQID_LEN = sizeof(PEN20_HERKULE_KABUTERIMON_FQID_ARR)-1; + inline static constexpr char PEN20_HERKULE_KABUTERIMON_ID_ARR[] = "herkule_kabuterimon"; + inline static constexpr const char* PEN20_HERKULE_KABUTERIMON_ID = PEN20_HERKULE_KABUTERIMON_ID_ARR; + inline static constexpr size_t PEN20_HERKULE_KABUTERIMON_ID_LEN = sizeof(PEN20_HERKULE_KABUTERIMON_ID)-1; + inline static constexpr char PEN20_HERKULE_KABUTERIMON_NAME_ARR[] = "Herkule Kabuterimon"; + inline static constexpr const char* PEN20_HERKULE_KABUTERIMON_NAME = PEN20_HERKULE_KABUTERIMON_NAME_ARR; + inline static constexpr size_t PEN20_HERKULE_KABUTERIMON_NAME_LEN = sizeof(PEN20_HERKULE_KABUTERIMON_NAME_ARR)-1; + inline static constexpr char PEN20_HERKULE_KABUTERIMON_FQNAME_ARR[] = "pen20:Herkule Kabuterimon"; + inline static constexpr const char* PEN20_HERKULE_KABUTERIMON_FQNAME = PEN20_HERKULE_KABUTERIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_HERKULE_KABUTERIMON_FQNAME_LEN = sizeof(PEN20_HERKULE_KABUTERIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_HERKULE_KABUTERIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_HERKULE_KABUTERIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_HERKULE_KABUTERIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_HERKULE_KABUTERIMON_ANIM_INDEX = 61; + + // Name: Hisyaryumon + inline static constexpr char PEN20_HISYARYUMON_FQID_ARR[] = "pen20:hisyaryumon"; + inline static constexpr const char* PEN20_HISYARYUMON_FQID = PEN20_HISYARYUMON_FQID_ARR; + inline static constexpr size_t PEN20_HISYARYUMON_FQID_LEN = sizeof(PEN20_HISYARYUMON_FQID_ARR)-1; + inline static constexpr char PEN20_HISYARYUMON_ID_ARR[] = "hisyaryumon"; + inline static constexpr const char* PEN20_HISYARYUMON_ID = PEN20_HISYARYUMON_ID_ARR; + inline static constexpr size_t PEN20_HISYARYUMON_ID_LEN = sizeof(PEN20_HISYARYUMON_ID)-1; + inline static constexpr char PEN20_HISYARYUMON_NAME_ARR[] = "Hisyaryumon"; + inline static constexpr const char* PEN20_HISYARYUMON_NAME = PEN20_HISYARYUMON_NAME_ARR; + inline static constexpr size_t PEN20_HISYARYUMON_NAME_LEN = sizeof(PEN20_HISYARYUMON_NAME_ARR)-1; + inline static constexpr char PEN20_HISYARYUMON_FQNAME_ARR[] = "pen20:Hisyaryumon"; + inline static constexpr const char* PEN20_HISYARYUMON_FQNAME = PEN20_HISYARYUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_HISYARYUMON_FQNAME_LEN = sizeof(PEN20_HISYARYUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_HISYARYUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_HISYARYUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_HISYARYUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_HISYARYUMON_ANIM_INDEX = 62; + + // Name: Holy Angemon + inline static constexpr char PEN20_HOLY_ANGEMON_FQID_ARR[] = "pen20:holy_angemon"; + inline static constexpr const char* PEN20_HOLY_ANGEMON_FQID = PEN20_HOLY_ANGEMON_FQID_ARR; + inline static constexpr size_t PEN20_HOLY_ANGEMON_FQID_LEN = sizeof(PEN20_HOLY_ANGEMON_FQID_ARR)-1; + inline static constexpr char PEN20_HOLY_ANGEMON_ID_ARR[] = "holy_angemon"; + inline static constexpr const char* PEN20_HOLY_ANGEMON_ID = PEN20_HOLY_ANGEMON_ID_ARR; + inline static constexpr size_t PEN20_HOLY_ANGEMON_ID_LEN = sizeof(PEN20_HOLY_ANGEMON_ID)-1; + inline static constexpr char PEN20_HOLY_ANGEMON_NAME_ARR[] = "Holy Angemon"; + inline static constexpr const char* PEN20_HOLY_ANGEMON_NAME = PEN20_HOLY_ANGEMON_NAME_ARR; + inline static constexpr size_t PEN20_HOLY_ANGEMON_NAME_LEN = sizeof(PEN20_HOLY_ANGEMON_NAME_ARR)-1; + inline static constexpr char PEN20_HOLY_ANGEMON_FQNAME_ARR[] = "pen20:Holy Angemon"; + inline static constexpr const char* PEN20_HOLY_ANGEMON_FQNAME = PEN20_HOLY_ANGEMON_FQNAME_ARR; + inline static constexpr size_t PEN20_HOLY_ANGEMON_FQNAME_LEN = sizeof(PEN20_HOLY_ANGEMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_HOLY_ANGEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_HOLY_ANGEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_HOLY_ANGEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_HOLY_ANGEMON_ANIM_INDEX = 63; + + // Name: Holydramon + inline static constexpr char PEN20_HOLYDRAMON_FQID_ARR[] = "pen20:holydramon"; + inline static constexpr const char* PEN20_HOLYDRAMON_FQID = PEN20_HOLYDRAMON_FQID_ARR; + inline static constexpr size_t PEN20_HOLYDRAMON_FQID_LEN = sizeof(PEN20_HOLYDRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_HOLYDRAMON_ID_ARR[] = "holydramon"; + inline static constexpr const char* PEN20_HOLYDRAMON_ID = PEN20_HOLYDRAMON_ID_ARR; + inline static constexpr size_t PEN20_HOLYDRAMON_ID_LEN = sizeof(PEN20_HOLYDRAMON_ID)-1; + inline static constexpr char PEN20_HOLYDRAMON_NAME_ARR[] = "Holydramon"; + inline static constexpr const char* PEN20_HOLYDRAMON_NAME = PEN20_HOLYDRAMON_NAME_ARR; + inline static constexpr size_t PEN20_HOLYDRAMON_NAME_LEN = sizeof(PEN20_HOLYDRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_HOLYDRAMON_FQNAME_ARR[] = "pen20:Holydramon"; + inline static constexpr const char* PEN20_HOLYDRAMON_FQNAME = PEN20_HOLYDRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_HOLYDRAMON_FQNAME_LEN = sizeof(PEN20_HOLYDRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_HOLYDRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_HOLYDRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_HOLYDRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_HOLYDRAMON_ANIM_INDEX = 64; + + // Name: Hououmon + inline static constexpr char PEN20_HOUOUMON_FQID_ARR[] = "pen20:hououmon"; + inline static constexpr const char* PEN20_HOUOUMON_FQID = PEN20_HOUOUMON_FQID_ARR; + inline static constexpr size_t PEN20_HOUOUMON_FQID_LEN = sizeof(PEN20_HOUOUMON_FQID_ARR)-1; + inline static constexpr char PEN20_HOUOUMON_ID_ARR[] = "hououmon"; + inline static constexpr const char* PEN20_HOUOUMON_ID = PEN20_HOUOUMON_ID_ARR; + inline static constexpr size_t PEN20_HOUOUMON_ID_LEN = sizeof(PEN20_HOUOUMON_ID)-1; + inline static constexpr char PEN20_HOUOUMON_NAME_ARR[] = "Hououmon"; + inline static constexpr const char* PEN20_HOUOUMON_NAME = PEN20_HOUOUMON_NAME_ARR; + inline static constexpr size_t PEN20_HOUOUMON_NAME_LEN = sizeof(PEN20_HOUOUMON_NAME_ARR)-1; + inline static constexpr char PEN20_HOUOUMON_FQNAME_ARR[] = "pen20:Hououmon"; + inline static constexpr const char* PEN20_HOUOUMON_FQNAME = PEN20_HOUOUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_HOUOUMON_FQNAME_LEN = sizeof(PEN20_HOUOUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_HOUOUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_HOUOUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_HOUOUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_HOUOUMON_ANIM_INDEX = 65; + + // Name: Ignamon + inline static constexpr char PEN20_IGNAMON_FQID_ARR[] = "pen20:ignamon"; + inline static constexpr const char* PEN20_IGNAMON_FQID = PEN20_IGNAMON_FQID_ARR; + inline static constexpr size_t PEN20_IGNAMON_FQID_LEN = sizeof(PEN20_IGNAMON_FQID_ARR)-1; + inline static constexpr char PEN20_IGNAMON_ID_ARR[] = "ignamon"; + inline static constexpr const char* PEN20_IGNAMON_ID = PEN20_IGNAMON_ID_ARR; + inline static constexpr size_t PEN20_IGNAMON_ID_LEN = sizeof(PEN20_IGNAMON_ID)-1; + inline static constexpr char PEN20_IGNAMON_NAME_ARR[] = "Ignamon"; + inline static constexpr const char* PEN20_IGNAMON_NAME = PEN20_IGNAMON_NAME_ARR; + inline static constexpr size_t PEN20_IGNAMON_NAME_LEN = sizeof(PEN20_IGNAMON_NAME_ARR)-1; + inline static constexpr char PEN20_IGNAMON_FQNAME_ARR[] = "pen20:Ignamon"; + inline static constexpr const char* PEN20_IGNAMON_FQNAME = PEN20_IGNAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_IGNAMON_FQNAME_LEN = sizeof(PEN20_IGNAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_IGNAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_IGNAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_IGNAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_IGNAMON_ANIM_INDEX = 66; + + // Name: Ikkakumon + inline static constexpr char PEN20_IKKAKUMON_FQID_ARR[] = "pen20:ikkakumon"; + inline static constexpr const char* PEN20_IKKAKUMON_FQID = PEN20_IKKAKUMON_FQID_ARR; + inline static constexpr size_t PEN20_IKKAKUMON_FQID_LEN = sizeof(PEN20_IKKAKUMON_FQID_ARR)-1; + inline static constexpr char PEN20_IKKAKUMON_ID_ARR[] = "ikkakumon"; + inline static constexpr const char* PEN20_IKKAKUMON_ID = PEN20_IKKAKUMON_ID_ARR; + inline static constexpr size_t PEN20_IKKAKUMON_ID_LEN = sizeof(PEN20_IKKAKUMON_ID)-1; + inline static constexpr char PEN20_IKKAKUMON_NAME_ARR[] = "Ikkakumon"; + inline static constexpr const char* PEN20_IKKAKUMON_NAME = PEN20_IKKAKUMON_NAME_ARR; + inline static constexpr size_t PEN20_IKKAKUMON_NAME_LEN = sizeof(PEN20_IKKAKUMON_NAME_ARR)-1; + inline static constexpr char PEN20_IKKAKUMON_FQNAME_ARR[] = "pen20:Ikkakumon"; + inline static constexpr const char* PEN20_IKKAKUMON_FQNAME = PEN20_IKKAKUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_IKKAKUMON_FQNAME_LEN = sizeof(PEN20_IKKAKUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_IKKAKUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_IKKAKUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_IKKAKUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_IKKAKUMON_ANIM_INDEX = 67; + + // Name: Imperialdramon Fighter Mode + inline static constexpr char PEN20_IMPERIALDRAMON_FIGHTER_MODE_FQID_ARR[] = "pen20:imperialdramon_fighter_mode"; + inline static constexpr const char* PEN20_IMPERIALDRAMON_FIGHTER_MODE_FQID = PEN20_IMPERIALDRAMON_FIGHTER_MODE_FQID_ARR; + inline static constexpr size_t PEN20_IMPERIALDRAMON_FIGHTER_MODE_FQID_LEN = sizeof(PEN20_IMPERIALDRAMON_FIGHTER_MODE_FQID_ARR)-1; + inline static constexpr char PEN20_IMPERIALDRAMON_FIGHTER_MODE_ID_ARR[] = "imperialdramon_fighter_mode"; + inline static constexpr const char* PEN20_IMPERIALDRAMON_FIGHTER_MODE_ID = PEN20_IMPERIALDRAMON_FIGHTER_MODE_ID_ARR; + inline static constexpr size_t PEN20_IMPERIALDRAMON_FIGHTER_MODE_ID_LEN = sizeof(PEN20_IMPERIALDRAMON_FIGHTER_MODE_ID)-1; + inline static constexpr char PEN20_IMPERIALDRAMON_FIGHTER_MODE_NAME_ARR[] = "Imperialdramon Fighter Mode"; + inline static constexpr const char* PEN20_IMPERIALDRAMON_FIGHTER_MODE_NAME = PEN20_IMPERIALDRAMON_FIGHTER_MODE_NAME_ARR; + inline static constexpr size_t PEN20_IMPERIALDRAMON_FIGHTER_MODE_NAME_LEN = sizeof(PEN20_IMPERIALDRAMON_FIGHTER_MODE_NAME_ARR)-1; + inline static constexpr char PEN20_IMPERIALDRAMON_FIGHTER_MODE_FQNAME_ARR[] = "pen20:Imperialdramon Fighter Mode"; + inline static constexpr const char* PEN20_IMPERIALDRAMON_FIGHTER_MODE_FQNAME = PEN20_IMPERIALDRAMON_FIGHTER_MODE_FQNAME_ARR; + inline static constexpr size_t PEN20_IMPERIALDRAMON_FIGHTER_MODE_FQNAME_LEN = sizeof(PEN20_IMPERIALDRAMON_FIGHTER_MODE_FQNAME_ARR)-1; + inline static constexpr int PEN20_IMPERIALDRAMON_FIGHTER_MODE_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_IMPERIALDRAMON_FIGHTER_MODE_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_IMPERIALDRAMON_FIGHTER_MODE_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_IMPERIALDRAMON_FIGHTER_MODE_ANIM_INDEX = 68; + + // Name: Impmon + inline static constexpr char PEN20_IMPMON_FQID_ARR[] = "pen20:impmon"; + inline static constexpr const char* PEN20_IMPMON_FQID = PEN20_IMPMON_FQID_ARR; + inline static constexpr size_t PEN20_IMPMON_FQID_LEN = sizeof(PEN20_IMPMON_FQID_ARR)-1; + inline static constexpr char PEN20_IMPMON_ID_ARR[] = "impmon"; + inline static constexpr const char* PEN20_IMPMON_ID = PEN20_IMPMON_ID_ARR; + inline static constexpr size_t PEN20_IMPMON_ID_LEN = sizeof(PEN20_IMPMON_ID)-1; + inline static constexpr char PEN20_IMPMON_NAME_ARR[] = "Impmon"; + inline static constexpr const char* PEN20_IMPMON_NAME = PEN20_IMPMON_NAME_ARR; + inline static constexpr size_t PEN20_IMPMON_NAME_LEN = sizeof(PEN20_IMPMON_NAME_ARR)-1; + inline static constexpr char PEN20_IMPMON_FQNAME_ARR[] = "pen20:Impmon"; + inline static constexpr const char* PEN20_IMPMON_FQNAME = PEN20_IMPMON_FQNAME_ARR; + inline static constexpr size_t PEN20_IMPMON_FQNAME_LEN = sizeof(PEN20_IMPMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_IMPMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_IMPMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_IMPMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_IMPMON_ANIM_INDEX = 69; + + // Name: Jesmon X + inline static constexpr char PEN20_JESMON_X_FQID_ARR[] = "pen20:jesmon_x"; + inline static constexpr const char* PEN20_JESMON_X_FQID = PEN20_JESMON_X_FQID_ARR; + inline static constexpr size_t PEN20_JESMON_X_FQID_LEN = sizeof(PEN20_JESMON_X_FQID_ARR)-1; + inline static constexpr char PEN20_JESMON_X_ID_ARR[] = "jesmon_x"; + inline static constexpr const char* PEN20_JESMON_X_ID = PEN20_JESMON_X_ID_ARR; + inline static constexpr size_t PEN20_JESMON_X_ID_LEN = sizeof(PEN20_JESMON_X_ID)-1; + inline static constexpr char PEN20_JESMON_X_NAME_ARR[] = "Jesmon X"; + inline static constexpr const char* PEN20_JESMON_X_NAME = PEN20_JESMON_X_NAME_ARR; + inline static constexpr size_t PEN20_JESMON_X_NAME_LEN = sizeof(PEN20_JESMON_X_NAME_ARR)-1; + inline static constexpr char PEN20_JESMON_X_FQNAME_ARR[] = "pen20:Jesmon X"; + inline static constexpr const char* PEN20_JESMON_X_FQNAME = PEN20_JESMON_X_FQNAME_ARR; + inline static constexpr size_t PEN20_JESMON_X_FQNAME_LEN = sizeof(PEN20_JESMON_X_FQNAME_ARR)-1; + inline static constexpr int PEN20_JESMON_X_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_JESMON_X_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_JESMON_X_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_JESMON_X_ANIM_INDEX = 70; + + // Name: Jyagamon + inline static constexpr char PEN20_JYAGAMON_FQID_ARR[] = "pen20:jyagamon"; + inline static constexpr const char* PEN20_JYAGAMON_FQID = PEN20_JYAGAMON_FQID_ARR; + inline static constexpr size_t PEN20_JYAGAMON_FQID_LEN = sizeof(PEN20_JYAGAMON_FQID_ARR)-1; + inline static constexpr char PEN20_JYAGAMON_ID_ARR[] = "jyagamon"; + inline static constexpr const char* PEN20_JYAGAMON_ID = PEN20_JYAGAMON_ID_ARR; + inline static constexpr size_t PEN20_JYAGAMON_ID_LEN = sizeof(PEN20_JYAGAMON_ID)-1; + inline static constexpr char PEN20_JYAGAMON_NAME_ARR[] = "Jyagamon"; + inline static constexpr const char* PEN20_JYAGAMON_NAME = PEN20_JYAGAMON_NAME_ARR; + inline static constexpr size_t PEN20_JYAGAMON_NAME_LEN = sizeof(PEN20_JYAGAMON_NAME_ARR)-1; + inline static constexpr char PEN20_JYAGAMON_FQNAME_ARR[] = "pen20:Jyagamon"; + inline static constexpr const char* PEN20_JYAGAMON_FQNAME = PEN20_JYAGAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_JYAGAMON_FQNAME_LEN = sizeof(PEN20_JYAGAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_JYAGAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_JYAGAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_JYAGAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_JYAGAMON_ANIM_INDEX = 71; + + // Name: Jyureimon + inline static constexpr char PEN20_JYUREIMON_FQID_ARR[] = "pen20:jyureimon"; + inline static constexpr const char* PEN20_JYUREIMON_FQID = PEN20_JYUREIMON_FQID_ARR; + inline static constexpr size_t PEN20_JYUREIMON_FQID_LEN = sizeof(PEN20_JYUREIMON_FQID_ARR)-1; + inline static constexpr char PEN20_JYUREIMON_ID_ARR[] = "jyureimon"; + inline static constexpr const char* PEN20_JYUREIMON_ID = PEN20_JYUREIMON_ID_ARR; + inline static constexpr size_t PEN20_JYUREIMON_ID_LEN = sizeof(PEN20_JYUREIMON_ID)-1; + inline static constexpr char PEN20_JYUREIMON_NAME_ARR[] = "Jyureimon"; + inline static constexpr const char* PEN20_JYUREIMON_NAME = PEN20_JYUREIMON_NAME_ARR; + inline static constexpr size_t PEN20_JYUREIMON_NAME_LEN = sizeof(PEN20_JYUREIMON_NAME_ARR)-1; + inline static constexpr char PEN20_JYUREIMON_FQNAME_ARR[] = "pen20:Jyureimon"; + inline static constexpr const char* PEN20_JYUREIMON_FQNAME = PEN20_JYUREIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_JYUREIMON_FQNAME_LEN = sizeof(PEN20_JYUREIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_JYUREIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_JYUREIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_JYUREIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_JYUREIMON_ANIM_INDEX = 72; + + // Name: Kakkinmon + inline static constexpr char PEN20_KAKKINMON_FQID_ARR[] = "pen20:kakkinmon"; + inline static constexpr const char* PEN20_KAKKINMON_FQID = PEN20_KAKKINMON_FQID_ARR; + inline static constexpr size_t PEN20_KAKKINMON_FQID_LEN = sizeof(PEN20_KAKKINMON_FQID_ARR)-1; + inline static constexpr char PEN20_KAKKINMON_ID_ARR[] = "kakkinmon"; + inline static constexpr const char* PEN20_KAKKINMON_ID = PEN20_KAKKINMON_ID_ARR; + inline static constexpr size_t PEN20_KAKKINMON_ID_LEN = sizeof(PEN20_KAKKINMON_ID)-1; + inline static constexpr char PEN20_KAKKINMON_NAME_ARR[] = "Kakkinmon"; + inline static constexpr const char* PEN20_KAKKINMON_NAME = PEN20_KAKKINMON_NAME_ARR; + inline static constexpr size_t PEN20_KAKKINMON_NAME_LEN = sizeof(PEN20_KAKKINMON_NAME_ARR)-1; + inline static constexpr char PEN20_KAKKINMON_FQNAME_ARR[] = "pen20:Kakkinmon"; + inline static constexpr const char* PEN20_KAKKINMON_FQNAME = PEN20_KAKKINMON_FQNAME_ARR; + inline static constexpr size_t PEN20_KAKKINMON_FQNAME_LEN = sizeof(PEN20_KAKKINMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_KAKKINMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_KAKKINMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_KAKKINMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_KAKKINMON_ANIM_INDEX = 73; + + // Name: Kiwimon + inline static constexpr char PEN20_KIWIMON_FQID_ARR[] = "pen20:kiwimon"; + inline static constexpr const char* PEN20_KIWIMON_FQID = PEN20_KIWIMON_FQID_ARR; + inline static constexpr size_t PEN20_KIWIMON_FQID_LEN = sizeof(PEN20_KIWIMON_FQID_ARR)-1; + inline static constexpr char PEN20_KIWIMON_ID_ARR[] = "kiwimon"; + inline static constexpr const char* PEN20_KIWIMON_ID = PEN20_KIWIMON_ID_ARR; + inline static constexpr size_t PEN20_KIWIMON_ID_LEN = sizeof(PEN20_KIWIMON_ID)-1; + inline static constexpr char PEN20_KIWIMON_NAME_ARR[] = "Kiwimon"; + inline static constexpr const char* PEN20_KIWIMON_NAME = PEN20_KIWIMON_NAME_ARR; + inline static constexpr size_t PEN20_KIWIMON_NAME_LEN = sizeof(PEN20_KIWIMON_NAME_ARR)-1; + inline static constexpr char PEN20_KIWIMON_FQNAME_ARR[] = "pen20:Kiwimon"; + inline static constexpr const char* PEN20_KIWIMON_FQNAME = PEN20_KIWIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_KIWIMON_FQNAME_LEN = sizeof(PEN20_KIWIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_KIWIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_KIWIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_KIWIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_KIWIMON_ANIM_INDEX = 74; + + // Name: Knightmon + inline static constexpr char PEN20_KNIGHTMON_FQID_ARR[] = "pen20:knightmon"; + inline static constexpr const char* PEN20_KNIGHTMON_FQID = PEN20_KNIGHTMON_FQID_ARR; + inline static constexpr size_t PEN20_KNIGHTMON_FQID_LEN = sizeof(PEN20_KNIGHTMON_FQID_ARR)-1; + inline static constexpr char PEN20_KNIGHTMON_ID_ARR[] = "knightmon"; + inline static constexpr const char* PEN20_KNIGHTMON_ID = PEN20_KNIGHTMON_ID_ARR; + inline static constexpr size_t PEN20_KNIGHTMON_ID_LEN = sizeof(PEN20_KNIGHTMON_ID)-1; + inline static constexpr char PEN20_KNIGHTMON_NAME_ARR[] = "Knightmon"; + inline static constexpr const char* PEN20_KNIGHTMON_NAME = PEN20_KNIGHTMON_NAME_ARR; + inline static constexpr size_t PEN20_KNIGHTMON_NAME_LEN = sizeof(PEN20_KNIGHTMON_NAME_ARR)-1; + inline static constexpr char PEN20_KNIGHTMON_FQNAME_ARR[] = "pen20:Knightmon"; + inline static constexpr const char* PEN20_KNIGHTMON_FQNAME = PEN20_KNIGHTMON_FQNAME_ARR; + inline static constexpr size_t PEN20_KNIGHTMON_FQNAME_LEN = sizeof(PEN20_KNIGHTMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_KNIGHTMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_KNIGHTMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_KNIGHTMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_KNIGHTMON_ANIM_INDEX = 75; + + // Name: Kokuwamon + inline static constexpr char PEN20_KOKUWAMON_FQID_ARR[] = "pen20:kokuwamon"; + inline static constexpr const char* PEN20_KOKUWAMON_FQID = PEN20_KOKUWAMON_FQID_ARR; + inline static constexpr size_t PEN20_KOKUWAMON_FQID_LEN = sizeof(PEN20_KOKUWAMON_FQID_ARR)-1; + inline static constexpr char PEN20_KOKUWAMON_ID_ARR[] = "kokuwamon"; + inline static constexpr const char* PEN20_KOKUWAMON_ID = PEN20_KOKUWAMON_ID_ARR; + inline static constexpr size_t PEN20_KOKUWAMON_ID_LEN = sizeof(PEN20_KOKUWAMON_ID)-1; + inline static constexpr char PEN20_KOKUWAMON_NAME_ARR[] = "Kokuwamon"; + inline static constexpr const char* PEN20_KOKUWAMON_NAME = PEN20_KOKUWAMON_NAME_ARR; + inline static constexpr size_t PEN20_KOKUWAMON_NAME_LEN = sizeof(PEN20_KOKUWAMON_NAME_ARR)-1; + inline static constexpr char PEN20_KOKUWAMON_FQNAME_ARR[] = "pen20:Kokuwamon"; + inline static constexpr const char* PEN20_KOKUWAMON_FQNAME = PEN20_KOKUWAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_KOKUWAMON_FQNAME_LEN = sizeof(PEN20_KOKUWAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_KOKUWAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_KOKUWAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_KOKUWAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_KOKUWAMON_ANIM_INDEX = 76; + + // Name: Kyokyomon + inline static constexpr char PEN20_KYOKYOMON_FQID_ARR[] = "pen20:kyokyomon"; + inline static constexpr const char* PEN20_KYOKYOMON_FQID = PEN20_KYOKYOMON_FQID_ARR; + inline static constexpr size_t PEN20_KYOKYOMON_FQID_LEN = sizeof(PEN20_KYOKYOMON_FQID_ARR)-1; + inline static constexpr char PEN20_KYOKYOMON_ID_ARR[] = "kyokyomon"; + inline static constexpr const char* PEN20_KYOKYOMON_ID = PEN20_KYOKYOMON_ID_ARR; + inline static constexpr size_t PEN20_KYOKYOMON_ID_LEN = sizeof(PEN20_KYOKYOMON_ID)-1; + inline static constexpr char PEN20_KYOKYOMON_NAME_ARR[] = "Kyokyomon"; + inline static constexpr const char* PEN20_KYOKYOMON_NAME = PEN20_KYOKYOMON_NAME_ARR; + inline static constexpr size_t PEN20_KYOKYOMON_NAME_LEN = sizeof(PEN20_KYOKYOMON_NAME_ARR)-1; + inline static constexpr char PEN20_KYOKYOMON_FQNAME_ARR[] = "pen20:Kyokyomon"; + inline static constexpr const char* PEN20_KYOKYOMON_FQNAME = PEN20_KYOKYOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_KYOKYOMON_FQNAME_LEN = sizeof(PEN20_KYOKYOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_KYOKYOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_KYOKYOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_KYOKYOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_KYOKYOMON_ANIM_INDEX = 77; + + // Name: Lady Devimon + inline static constexpr char PEN20_LADY_DEVIMON_FQID_ARR[] = "pen20:lady_devimon"; + inline static constexpr const char* PEN20_LADY_DEVIMON_FQID = PEN20_LADY_DEVIMON_FQID_ARR; + inline static constexpr size_t PEN20_LADY_DEVIMON_FQID_LEN = sizeof(PEN20_LADY_DEVIMON_FQID_ARR)-1; + inline static constexpr char PEN20_LADY_DEVIMON_ID_ARR[] = "lady_devimon"; + inline static constexpr const char* PEN20_LADY_DEVIMON_ID = PEN20_LADY_DEVIMON_ID_ARR; + inline static constexpr size_t PEN20_LADY_DEVIMON_ID_LEN = sizeof(PEN20_LADY_DEVIMON_ID)-1; + inline static constexpr char PEN20_LADY_DEVIMON_NAME_ARR[] = "Lady Devimon"; + inline static constexpr const char* PEN20_LADY_DEVIMON_NAME = PEN20_LADY_DEVIMON_NAME_ARR; + inline static constexpr size_t PEN20_LADY_DEVIMON_NAME_LEN = sizeof(PEN20_LADY_DEVIMON_NAME_ARR)-1; + inline static constexpr char PEN20_LADY_DEVIMON_FQNAME_ARR[] = "pen20:Lady Devimon"; + inline static constexpr const char* PEN20_LADY_DEVIMON_FQNAME = PEN20_LADY_DEVIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_LADY_DEVIMON_FQNAME_LEN = sizeof(PEN20_LADY_DEVIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_LADY_DEVIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_LADY_DEVIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_LADY_DEVIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_LADY_DEVIMON_ANIM_INDEX = 78; + + // Name: Lalamon + inline static constexpr char PEN20_LALAMON_FQID_ARR[] = "pen20:lalamon"; + inline static constexpr const char* PEN20_LALAMON_FQID = PEN20_LALAMON_FQID_ARR; + inline static constexpr size_t PEN20_LALAMON_FQID_LEN = sizeof(PEN20_LALAMON_FQID_ARR)-1; + inline static constexpr char PEN20_LALAMON_ID_ARR[] = "lalamon"; + inline static constexpr const char* PEN20_LALAMON_ID = PEN20_LALAMON_ID_ARR; + inline static constexpr size_t PEN20_LALAMON_ID_LEN = sizeof(PEN20_LALAMON_ID)-1; + inline static constexpr char PEN20_LALAMON_NAME_ARR[] = "Lalamon"; + inline static constexpr const char* PEN20_LALAMON_NAME = PEN20_LALAMON_NAME_ARR; + inline static constexpr size_t PEN20_LALAMON_NAME_LEN = sizeof(PEN20_LALAMON_NAME_ARR)-1; + inline static constexpr char PEN20_LALAMON_FQNAME_ARR[] = "pen20:Lalamon"; + inline static constexpr const char* PEN20_LALAMON_FQNAME = PEN20_LALAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_LALAMON_FQNAME_LEN = sizeof(PEN20_LALAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_LALAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_LALAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_LALAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_LALAMON_ANIM_INDEX = 79; + + // Name: Lavogaritamon + inline static constexpr char PEN20_LAVOGARITAMON_FQID_ARR[] = "pen20:lavogaritamon"; + inline static constexpr const char* PEN20_LAVOGARITAMON_FQID = PEN20_LAVOGARITAMON_FQID_ARR; + inline static constexpr size_t PEN20_LAVOGARITAMON_FQID_LEN = sizeof(PEN20_LAVOGARITAMON_FQID_ARR)-1; + inline static constexpr char PEN20_LAVOGARITAMON_ID_ARR[] = "lavogaritamon"; + inline static constexpr const char* PEN20_LAVOGARITAMON_ID = PEN20_LAVOGARITAMON_ID_ARR; + inline static constexpr size_t PEN20_LAVOGARITAMON_ID_LEN = sizeof(PEN20_LAVOGARITAMON_ID)-1; + inline static constexpr char PEN20_LAVOGARITAMON_NAME_ARR[] = "Lavogaritamon"; + inline static constexpr const char* PEN20_LAVOGARITAMON_NAME = PEN20_LAVOGARITAMON_NAME_ARR; + inline static constexpr size_t PEN20_LAVOGARITAMON_NAME_LEN = sizeof(PEN20_LAVOGARITAMON_NAME_ARR)-1; + inline static constexpr char PEN20_LAVOGARITAMON_FQNAME_ARR[] = "pen20:Lavogaritamon"; + inline static constexpr const char* PEN20_LAVOGARITAMON_FQNAME = PEN20_LAVOGARITAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_LAVOGARITAMON_FQNAME_LEN = sizeof(PEN20_LAVOGARITAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_LAVOGARITAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_LAVOGARITAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_LAVOGARITAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_LAVOGARITAMON_ANIM_INDEX = 80; + + // Name: Lavorvomon + inline static constexpr char PEN20_LAVORVOMON_FQID_ARR[] = "pen20:lavorvomon"; + inline static constexpr const char* PEN20_LAVORVOMON_FQID = PEN20_LAVORVOMON_FQID_ARR; + inline static constexpr size_t PEN20_LAVORVOMON_FQID_LEN = sizeof(PEN20_LAVORVOMON_FQID_ARR)-1; + inline static constexpr char PEN20_LAVORVOMON_ID_ARR[] = "lavorvomon"; + inline static constexpr const char* PEN20_LAVORVOMON_ID = PEN20_LAVORVOMON_ID_ARR; + inline static constexpr size_t PEN20_LAVORVOMON_ID_LEN = sizeof(PEN20_LAVORVOMON_ID)-1; + inline static constexpr char PEN20_LAVORVOMON_NAME_ARR[] = "Lavorvomon"; + inline static constexpr const char* PEN20_LAVORVOMON_NAME = PEN20_LAVORVOMON_NAME_ARR; + inline static constexpr size_t PEN20_LAVORVOMON_NAME_LEN = sizeof(PEN20_LAVORVOMON_NAME_ARR)-1; + inline static constexpr char PEN20_LAVORVOMON_FQNAME_ARR[] = "pen20:Lavorvomon"; + inline static constexpr const char* PEN20_LAVORVOMON_FQNAME = PEN20_LAVORVOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_LAVORVOMON_FQNAME_LEN = sizeof(PEN20_LAVORVOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_LAVORVOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_LAVORVOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_LAVORVOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_LAVORVOMON_ANIM_INDEX = 81; + + // Name: Lilamon + inline static constexpr char PEN20_LILAMON_FQID_ARR[] = "pen20:lilamon"; + inline static constexpr const char* PEN20_LILAMON_FQID = PEN20_LILAMON_FQID_ARR; + inline static constexpr size_t PEN20_LILAMON_FQID_LEN = sizeof(PEN20_LILAMON_FQID_ARR)-1; + inline static constexpr char PEN20_LILAMON_ID_ARR[] = "lilamon"; + inline static constexpr const char* PEN20_LILAMON_ID = PEN20_LILAMON_ID_ARR; + inline static constexpr size_t PEN20_LILAMON_ID_LEN = sizeof(PEN20_LILAMON_ID)-1; + inline static constexpr char PEN20_LILAMON_NAME_ARR[] = "Lilamon"; + inline static constexpr const char* PEN20_LILAMON_NAME = PEN20_LILAMON_NAME_ARR; + inline static constexpr size_t PEN20_LILAMON_NAME_LEN = sizeof(PEN20_LILAMON_NAME_ARR)-1; + inline static constexpr char PEN20_LILAMON_FQNAME_ARR[] = "pen20:Lilamon"; + inline static constexpr const char* PEN20_LILAMON_FQNAME = PEN20_LILAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_LILAMON_FQNAME_LEN = sizeof(PEN20_LILAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_LILAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_LILAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_LILAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_LILAMON_ANIM_INDEX = 82; + + // Name: Lilimon + inline static constexpr char PEN20_LILIMON_FQID_ARR[] = "pen20:lilimon"; + inline static constexpr const char* PEN20_LILIMON_FQID = PEN20_LILIMON_FQID_ARR; + inline static constexpr size_t PEN20_LILIMON_FQID_LEN = sizeof(PEN20_LILIMON_FQID_ARR)-1; + inline static constexpr char PEN20_LILIMON_ID_ARR[] = "lilimon"; + inline static constexpr const char* PEN20_LILIMON_ID = PEN20_LILIMON_ID_ARR; + inline static constexpr size_t PEN20_LILIMON_ID_LEN = sizeof(PEN20_LILIMON_ID)-1; + inline static constexpr char PEN20_LILIMON_NAME_ARR[] = "Lilimon"; + inline static constexpr const char* PEN20_LILIMON_NAME = PEN20_LILIMON_NAME_ARR; + inline static constexpr size_t PEN20_LILIMON_NAME_LEN = sizeof(PEN20_LILIMON_NAME_ARR)-1; + inline static constexpr char PEN20_LILIMON_FQNAME_ARR[] = "pen20:Lilimon"; + inline static constexpr const char* PEN20_LILIMON_FQNAME = PEN20_LILIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_LILIMON_FQNAME_LEN = sizeof(PEN20_LILIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_LILIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_LILIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_LILIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_LILIMON_ANIM_INDEX = 83; + + // Name: Lopmon + inline static constexpr char PEN20_LOPMON_FQID_ARR[] = "pen20:lopmon"; + inline static constexpr const char* PEN20_LOPMON_FQID = PEN20_LOPMON_FQID_ARR; + inline static constexpr size_t PEN20_LOPMON_FQID_LEN = sizeof(PEN20_LOPMON_FQID_ARR)-1; + inline static constexpr char PEN20_LOPMON_ID_ARR[] = "lopmon"; + inline static constexpr const char* PEN20_LOPMON_ID = PEN20_LOPMON_ID_ARR; + inline static constexpr size_t PEN20_LOPMON_ID_LEN = sizeof(PEN20_LOPMON_ID)-1; + inline static constexpr char PEN20_LOPMON_NAME_ARR[] = "Lopmon"; + inline static constexpr const char* PEN20_LOPMON_NAME = PEN20_LOPMON_NAME_ARR; + inline static constexpr size_t PEN20_LOPMON_NAME_LEN = sizeof(PEN20_LOPMON_NAME_ARR)-1; + inline static constexpr char PEN20_LOPMON_FQNAME_ARR[] = "pen20:Lopmon"; + inline static constexpr const char* PEN20_LOPMON_FQNAME = PEN20_LOPMON_FQNAME_ARR; + inline static constexpr size_t PEN20_LOPMON_FQNAME_LEN = sizeof(PEN20_LOPMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_LOPMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_LOPMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_LOPMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_LOPMON_ANIM_INDEX = 84; + + // Name: Lotusmon + inline static constexpr char PEN20_LOTUSMON_FQID_ARR[] = "pen20:lotusmon"; + inline static constexpr const char* PEN20_LOTUSMON_FQID = PEN20_LOTUSMON_FQID_ARR; + inline static constexpr size_t PEN20_LOTUSMON_FQID_LEN = sizeof(PEN20_LOTUSMON_FQID_ARR)-1; + inline static constexpr char PEN20_LOTUSMON_ID_ARR[] = "lotusmon"; + inline static constexpr const char* PEN20_LOTUSMON_ID = PEN20_LOTUSMON_ID_ARR; + inline static constexpr size_t PEN20_LOTUSMON_ID_LEN = sizeof(PEN20_LOTUSMON_ID)-1; + inline static constexpr char PEN20_LOTUSMON_NAME_ARR[] = "Lotusmon"; + inline static constexpr const char* PEN20_LOTUSMON_NAME = PEN20_LOTUSMON_NAME_ARR; + inline static constexpr size_t PEN20_LOTUSMON_NAME_LEN = sizeof(PEN20_LOTUSMON_NAME_ARR)-1; + inline static constexpr char PEN20_LOTUSMON_FQNAME_ARR[] = "pen20:Lotusmon"; + inline static constexpr const char* PEN20_LOTUSMON_FQNAME = PEN20_LOTUSMON_FQNAME_ARR; + inline static constexpr size_t PEN20_LOTUSMON_FQNAME_LEN = sizeof(PEN20_LOTUSMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_LOTUSMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_LOTUSMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_LOTUSMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_LOTUSMON_ANIM_INDEX = 85; + + // Name: Ludomon + inline static constexpr char PEN20_LUDOMON_FQID_ARR[] = "pen20:ludomon"; + inline static constexpr const char* PEN20_LUDOMON_FQID = PEN20_LUDOMON_FQID_ARR; + inline static constexpr size_t PEN20_LUDOMON_FQID_LEN = sizeof(PEN20_LUDOMON_FQID_ARR)-1; + inline static constexpr char PEN20_LUDOMON_ID_ARR[] = "ludomon"; + inline static constexpr const char* PEN20_LUDOMON_ID = PEN20_LUDOMON_ID_ARR; + inline static constexpr size_t PEN20_LUDOMON_ID_LEN = sizeof(PEN20_LUDOMON_ID)-1; + inline static constexpr char PEN20_LUDOMON_NAME_ARR[] = "Ludomon"; + inline static constexpr const char* PEN20_LUDOMON_NAME = PEN20_LUDOMON_NAME_ARR; + inline static constexpr size_t PEN20_LUDOMON_NAME_LEN = sizeof(PEN20_LUDOMON_NAME_ARR)-1; + inline static constexpr char PEN20_LUDOMON_FQNAME_ARR[] = "pen20:Ludomon"; + inline static constexpr const char* PEN20_LUDOMON_FQNAME = PEN20_LUDOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_LUDOMON_FQNAME_LEN = sizeof(PEN20_LUDOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_LUDOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_LUDOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_LUDOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_LUDOMON_ANIM_INDEX = 86; + + // Name: Mad Leomon + inline static constexpr char PEN20_MAD_LEOMON_FQID_ARR[] = "pen20:mad_leomon"; + inline static constexpr const char* PEN20_MAD_LEOMON_FQID = PEN20_MAD_LEOMON_FQID_ARR; + inline static constexpr size_t PEN20_MAD_LEOMON_FQID_LEN = sizeof(PEN20_MAD_LEOMON_FQID_ARR)-1; + inline static constexpr char PEN20_MAD_LEOMON_ID_ARR[] = "mad_leomon"; + inline static constexpr const char* PEN20_MAD_LEOMON_ID = PEN20_MAD_LEOMON_ID_ARR; + inline static constexpr size_t PEN20_MAD_LEOMON_ID_LEN = sizeof(PEN20_MAD_LEOMON_ID)-1; + inline static constexpr char PEN20_MAD_LEOMON_NAME_ARR[] = "Mad Leomon"; + inline static constexpr const char* PEN20_MAD_LEOMON_NAME = PEN20_MAD_LEOMON_NAME_ARR; + inline static constexpr size_t PEN20_MAD_LEOMON_NAME_LEN = sizeof(PEN20_MAD_LEOMON_NAME_ARR)-1; + inline static constexpr char PEN20_MAD_LEOMON_FQNAME_ARR[] = "pen20:Mad Leomon"; + inline static constexpr const char* PEN20_MAD_LEOMON_FQNAME = PEN20_MAD_LEOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_MAD_LEOMON_FQNAME_LEN = sizeof(PEN20_MAD_LEOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_MAD_LEOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_MAD_LEOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_MAD_LEOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_MAD_LEOMON_ANIM_INDEX = 87; + + // Name: Mambomon + inline static constexpr char PEN20_MAMBOMON_FQID_ARR[] = "pen20:mambomon"; + inline static constexpr const char* PEN20_MAMBOMON_FQID = PEN20_MAMBOMON_FQID_ARR; + inline static constexpr size_t PEN20_MAMBOMON_FQID_LEN = sizeof(PEN20_MAMBOMON_FQID_ARR)-1; + inline static constexpr char PEN20_MAMBOMON_ID_ARR[] = "mambomon"; + inline static constexpr const char* PEN20_MAMBOMON_ID = PEN20_MAMBOMON_ID_ARR; + inline static constexpr size_t PEN20_MAMBOMON_ID_LEN = sizeof(PEN20_MAMBOMON_ID)-1; + inline static constexpr char PEN20_MAMBOMON_NAME_ARR[] = "Mambomon"; + inline static constexpr const char* PEN20_MAMBOMON_NAME = PEN20_MAMBOMON_NAME_ARR; + inline static constexpr size_t PEN20_MAMBOMON_NAME_LEN = sizeof(PEN20_MAMBOMON_NAME_ARR)-1; + inline static constexpr char PEN20_MAMBOMON_FQNAME_ARR[] = "pen20:Mambomon"; + inline static constexpr const char* PEN20_MAMBOMON_FQNAME = PEN20_MAMBOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_MAMBOMON_FQNAME_LEN = sizeof(PEN20_MAMBOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_MAMBOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_MAMBOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_MAMBOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_MAMBOMON_ANIM_INDEX = 88; + + // Name: Mammon + inline static constexpr char PEN20_MAMMON_FQID_ARR[] = "pen20:mammon"; + inline static constexpr const char* PEN20_MAMMON_FQID = PEN20_MAMMON_FQID_ARR; + inline static constexpr size_t PEN20_MAMMON_FQID_LEN = sizeof(PEN20_MAMMON_FQID_ARR)-1; + inline static constexpr char PEN20_MAMMON_ID_ARR[] = "mammon"; + inline static constexpr const char* PEN20_MAMMON_ID = PEN20_MAMMON_ID_ARR; + inline static constexpr size_t PEN20_MAMMON_ID_LEN = sizeof(PEN20_MAMMON_ID)-1; + inline static constexpr char PEN20_MAMMON_NAME_ARR[] = "Mammon"; + inline static constexpr const char* PEN20_MAMMON_NAME = PEN20_MAMMON_NAME_ARR; + inline static constexpr size_t PEN20_MAMMON_NAME_LEN = sizeof(PEN20_MAMMON_NAME_ARR)-1; + inline static constexpr char PEN20_MAMMON_FQNAME_ARR[] = "pen20:Mammon"; + inline static constexpr const char* PEN20_MAMMON_FQNAME = PEN20_MAMMON_FQNAME_ARR; + inline static constexpr size_t PEN20_MAMMON_FQNAME_LEN = sizeof(PEN20_MAMMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_MAMMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_MAMMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_MAMMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_MAMMON_ANIM_INDEX = 89; + + // Name: Marin Angemon + inline static constexpr char PEN20_MARIN_ANGEMON_FQID_ARR[] = "pen20:marin_angemon"; + inline static constexpr const char* PEN20_MARIN_ANGEMON_FQID = PEN20_MARIN_ANGEMON_FQID_ARR; + inline static constexpr size_t PEN20_MARIN_ANGEMON_FQID_LEN = sizeof(PEN20_MARIN_ANGEMON_FQID_ARR)-1; + inline static constexpr char PEN20_MARIN_ANGEMON_ID_ARR[] = "marin_angemon"; + inline static constexpr const char* PEN20_MARIN_ANGEMON_ID = PEN20_MARIN_ANGEMON_ID_ARR; + inline static constexpr size_t PEN20_MARIN_ANGEMON_ID_LEN = sizeof(PEN20_MARIN_ANGEMON_ID)-1; + inline static constexpr char PEN20_MARIN_ANGEMON_NAME_ARR[] = "Marin Angemon"; + inline static constexpr const char* PEN20_MARIN_ANGEMON_NAME = PEN20_MARIN_ANGEMON_NAME_ARR; + inline static constexpr size_t PEN20_MARIN_ANGEMON_NAME_LEN = sizeof(PEN20_MARIN_ANGEMON_NAME_ARR)-1; + inline static constexpr char PEN20_MARIN_ANGEMON_FQNAME_ARR[] = "pen20:Marin Angemon"; + inline static constexpr const char* PEN20_MARIN_ANGEMON_FQNAME = PEN20_MARIN_ANGEMON_FQNAME_ARR; + inline static constexpr size_t PEN20_MARIN_ANGEMON_FQNAME_LEN = sizeof(PEN20_MARIN_ANGEMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_MARIN_ANGEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_MARIN_ANGEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_MARIN_ANGEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_MARIN_ANGEMON_ANIM_INDEX = 90; + + // Name: Marin Devimon + inline static constexpr char PEN20_MARIN_DEVIMON_FQID_ARR[] = "pen20:marin_devimon"; + inline static constexpr const char* PEN20_MARIN_DEVIMON_FQID = PEN20_MARIN_DEVIMON_FQID_ARR; + inline static constexpr size_t PEN20_MARIN_DEVIMON_FQID_LEN = sizeof(PEN20_MARIN_DEVIMON_FQID_ARR)-1; + inline static constexpr char PEN20_MARIN_DEVIMON_ID_ARR[] = "marin_devimon"; + inline static constexpr const char* PEN20_MARIN_DEVIMON_ID = PEN20_MARIN_DEVIMON_ID_ARR; + inline static constexpr size_t PEN20_MARIN_DEVIMON_ID_LEN = sizeof(PEN20_MARIN_DEVIMON_ID)-1; + inline static constexpr char PEN20_MARIN_DEVIMON_NAME_ARR[] = "Marin Devimon"; + inline static constexpr const char* PEN20_MARIN_DEVIMON_NAME = PEN20_MARIN_DEVIMON_NAME_ARR; + inline static constexpr size_t PEN20_MARIN_DEVIMON_NAME_LEN = sizeof(PEN20_MARIN_DEVIMON_NAME_ARR)-1; + inline static constexpr char PEN20_MARIN_DEVIMON_FQNAME_ARR[] = "pen20:Marin Devimon"; + inline static constexpr const char* PEN20_MARIN_DEVIMON_FQNAME = PEN20_MARIN_DEVIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_MARIN_DEVIMON_FQNAME_LEN = sizeof(PEN20_MARIN_DEVIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_MARIN_DEVIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_MARIN_DEVIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_MARIN_DEVIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_MARIN_DEVIMON_ANIM_INDEX = 91; + + // Name: Mastemon + inline static constexpr char PEN20_MASTEMON_FQID_ARR[] = "pen20:mastemon"; + inline static constexpr const char* PEN20_MASTEMON_FQID = PEN20_MASTEMON_FQID_ARR; + inline static constexpr size_t PEN20_MASTEMON_FQID_LEN = sizeof(PEN20_MASTEMON_FQID_ARR)-1; + inline static constexpr char PEN20_MASTEMON_ID_ARR[] = "mastemon"; + inline static constexpr const char* PEN20_MASTEMON_ID = PEN20_MASTEMON_ID_ARR; + inline static constexpr size_t PEN20_MASTEMON_ID_LEN = sizeof(PEN20_MASTEMON_ID)-1; + inline static constexpr char PEN20_MASTEMON_NAME_ARR[] = "Mastemon"; + inline static constexpr const char* PEN20_MASTEMON_NAME = PEN20_MASTEMON_NAME_ARR; + inline static constexpr size_t PEN20_MASTEMON_NAME_LEN = sizeof(PEN20_MASTEMON_NAME_ARR)-1; + inline static constexpr char PEN20_MASTEMON_FQNAME_ARR[] = "pen20:Mastemon"; + inline static constexpr const char* PEN20_MASTEMON_FQNAME = PEN20_MASTEMON_FQNAME_ARR; + inline static constexpr size_t PEN20_MASTEMON_FQNAME_LEN = sizeof(PEN20_MASTEMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_MASTEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_MASTEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_MASTEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_MASTEMON_ANIM_INDEX = 92; + + // Name: Mechanorimon + inline static constexpr char PEN20_MECHANORIMON_FQID_ARR[] = "pen20:mechanorimon"; + inline static constexpr const char* PEN20_MECHANORIMON_FQID = PEN20_MECHANORIMON_FQID_ARR; + inline static constexpr size_t PEN20_MECHANORIMON_FQID_LEN = sizeof(PEN20_MECHANORIMON_FQID_ARR)-1; + inline static constexpr char PEN20_MECHANORIMON_ID_ARR[] = "mechanorimon"; + inline static constexpr const char* PEN20_MECHANORIMON_ID = PEN20_MECHANORIMON_ID_ARR; + inline static constexpr size_t PEN20_MECHANORIMON_ID_LEN = sizeof(PEN20_MECHANORIMON_ID)-1; + inline static constexpr char PEN20_MECHANORIMON_NAME_ARR[] = "Mechanorimon"; + inline static constexpr const char* PEN20_MECHANORIMON_NAME = PEN20_MECHANORIMON_NAME_ARR; + inline static constexpr size_t PEN20_MECHANORIMON_NAME_LEN = sizeof(PEN20_MECHANORIMON_NAME_ARR)-1; + inline static constexpr char PEN20_MECHANORIMON_FQNAME_ARR[] = "pen20:Mechanorimon"; + inline static constexpr const char* PEN20_MECHANORIMON_FQNAME = PEN20_MECHANORIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_MECHANORIMON_FQNAME_LEN = sizeof(PEN20_MECHANORIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_MECHANORIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_MECHANORIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_MECHANORIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_MECHANORIMON_ANIM_INDEX = 93; + + // Name: Megalo Growmon + inline static constexpr char PEN20_MEGALO_GROWMON_FQID_ARR[] = "pen20:megalo_growmon"; + inline static constexpr const char* PEN20_MEGALO_GROWMON_FQID = PEN20_MEGALO_GROWMON_FQID_ARR; + inline static constexpr size_t PEN20_MEGALO_GROWMON_FQID_LEN = sizeof(PEN20_MEGALO_GROWMON_FQID_ARR)-1; + inline static constexpr char PEN20_MEGALO_GROWMON_ID_ARR[] = "megalo_growmon"; + inline static constexpr const char* PEN20_MEGALO_GROWMON_ID = PEN20_MEGALO_GROWMON_ID_ARR; + inline static constexpr size_t PEN20_MEGALO_GROWMON_ID_LEN = sizeof(PEN20_MEGALO_GROWMON_ID)-1; + inline static constexpr char PEN20_MEGALO_GROWMON_NAME_ARR[] = "Megalo Growmon"; + inline static constexpr const char* PEN20_MEGALO_GROWMON_NAME = PEN20_MEGALO_GROWMON_NAME_ARR; + inline static constexpr size_t PEN20_MEGALO_GROWMON_NAME_LEN = sizeof(PEN20_MEGALO_GROWMON_NAME_ARR)-1; + inline static constexpr char PEN20_MEGALO_GROWMON_FQNAME_ARR[] = "pen20:Megalo Growmon"; + inline static constexpr const char* PEN20_MEGALO_GROWMON_FQNAME = PEN20_MEGALO_GROWMON_FQNAME_ARR; + inline static constexpr size_t PEN20_MEGALO_GROWMON_FQNAME_LEN = sizeof(PEN20_MEGALO_GROWMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_MEGALO_GROWMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_MEGALO_GROWMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_MEGALO_GROWMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_MEGALO_GROWMON_ANIM_INDEX = 94; + + // Name: Mega Seadramon + inline static constexpr char PEN20_MEGA_SEADRAMON_FQID_ARR[] = "pen20:mega_seadramon"; + inline static constexpr const char* PEN20_MEGA_SEADRAMON_FQID = PEN20_MEGA_SEADRAMON_FQID_ARR; + inline static constexpr size_t PEN20_MEGA_SEADRAMON_FQID_LEN = sizeof(PEN20_MEGA_SEADRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_MEGA_SEADRAMON_ID_ARR[] = "mega_seadramon"; + inline static constexpr const char* PEN20_MEGA_SEADRAMON_ID = PEN20_MEGA_SEADRAMON_ID_ARR; + inline static constexpr size_t PEN20_MEGA_SEADRAMON_ID_LEN = sizeof(PEN20_MEGA_SEADRAMON_ID)-1; + inline static constexpr char PEN20_MEGA_SEADRAMON_NAME_ARR[] = "Mega Seadramon"; + inline static constexpr const char* PEN20_MEGA_SEADRAMON_NAME = PEN20_MEGA_SEADRAMON_NAME_ARR; + inline static constexpr size_t PEN20_MEGA_SEADRAMON_NAME_LEN = sizeof(PEN20_MEGA_SEADRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_MEGA_SEADRAMON_FQNAME_ARR[] = "pen20:Mega Seadramon"; + inline static constexpr const char* PEN20_MEGA_SEADRAMON_FQNAME = PEN20_MEGA_SEADRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_MEGA_SEADRAMON_FQNAME_LEN = sizeof(PEN20_MEGA_SEADRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_MEGA_SEADRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_MEGA_SEADRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_MEGA_SEADRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_MEGA_SEADRAMON_ANIM_INDEX = 95; + + // Name: Meicrackmon Vicious Mode + inline static constexpr char PEN20_MEICRACKMON_VICIOUS_MODE_FQID_ARR[] = "pen20:meicrackmon_vicious_mode"; + inline static constexpr const char* PEN20_MEICRACKMON_VICIOUS_MODE_FQID = PEN20_MEICRACKMON_VICIOUS_MODE_FQID_ARR; + inline static constexpr size_t PEN20_MEICRACKMON_VICIOUS_MODE_FQID_LEN = sizeof(PEN20_MEICRACKMON_VICIOUS_MODE_FQID_ARR)-1; + inline static constexpr char PEN20_MEICRACKMON_VICIOUS_MODE_ID_ARR[] = "meicrackmon_vicious_mode"; + inline static constexpr const char* PEN20_MEICRACKMON_VICIOUS_MODE_ID = PEN20_MEICRACKMON_VICIOUS_MODE_ID_ARR; + inline static constexpr size_t PEN20_MEICRACKMON_VICIOUS_MODE_ID_LEN = sizeof(PEN20_MEICRACKMON_VICIOUS_MODE_ID)-1; + inline static constexpr char PEN20_MEICRACKMON_VICIOUS_MODE_NAME_ARR[] = "Meicrackmon Vicious Mode"; + inline static constexpr const char* PEN20_MEICRACKMON_VICIOUS_MODE_NAME = PEN20_MEICRACKMON_VICIOUS_MODE_NAME_ARR; + inline static constexpr size_t PEN20_MEICRACKMON_VICIOUS_MODE_NAME_LEN = sizeof(PEN20_MEICRACKMON_VICIOUS_MODE_NAME_ARR)-1; + inline static constexpr char PEN20_MEICRACKMON_VICIOUS_MODE_FQNAME_ARR[] = "pen20:Meicrackmon Vicious Mode"; + inline static constexpr const char* PEN20_MEICRACKMON_VICIOUS_MODE_FQNAME = PEN20_MEICRACKMON_VICIOUS_MODE_FQNAME_ARR; + inline static constexpr size_t PEN20_MEICRACKMON_VICIOUS_MODE_FQNAME_LEN = sizeof(PEN20_MEICRACKMON_VICIOUS_MODE_FQNAME_ARR)-1; + inline static constexpr int PEN20_MEICRACKMON_VICIOUS_MODE_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_MEICRACKMON_VICIOUS_MODE_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_MEICRACKMON_VICIOUS_MODE_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_MEICRACKMON_VICIOUS_MODE_ANIM_INDEX = 96; + + // Name: Metal Etemon + inline static constexpr char PEN20_METAL_ETEMON_FQID_ARR[] = "pen20:metal_etemon"; + inline static constexpr const char* PEN20_METAL_ETEMON_FQID = PEN20_METAL_ETEMON_FQID_ARR; + inline static constexpr size_t PEN20_METAL_ETEMON_FQID_LEN = sizeof(PEN20_METAL_ETEMON_FQID_ARR)-1; + inline static constexpr char PEN20_METAL_ETEMON_ID_ARR[] = "metal_etemon"; + inline static constexpr const char* PEN20_METAL_ETEMON_ID = PEN20_METAL_ETEMON_ID_ARR; + inline static constexpr size_t PEN20_METAL_ETEMON_ID_LEN = sizeof(PEN20_METAL_ETEMON_ID)-1; + inline static constexpr char PEN20_METAL_ETEMON_NAME_ARR[] = "Metal Etemon"; + inline static constexpr const char* PEN20_METAL_ETEMON_NAME = PEN20_METAL_ETEMON_NAME_ARR; + inline static constexpr size_t PEN20_METAL_ETEMON_NAME_LEN = sizeof(PEN20_METAL_ETEMON_NAME_ARR)-1; + inline static constexpr char PEN20_METAL_ETEMON_FQNAME_ARR[] = "pen20:Metal Etemon"; + inline static constexpr const char* PEN20_METAL_ETEMON_FQNAME = PEN20_METAL_ETEMON_FQNAME_ARR; + inline static constexpr size_t PEN20_METAL_ETEMON_FQNAME_LEN = sizeof(PEN20_METAL_ETEMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_METAL_ETEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_METAL_ETEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_METAL_ETEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_METAL_ETEMON_ANIM_INDEX = 97; + + // Name: Metal Seadramon + inline static constexpr char PEN20_METAL_SEADRAMON_FQID_ARR[] = "pen20:metal_seadramon"; + inline static constexpr const char* PEN20_METAL_SEADRAMON_FQID = PEN20_METAL_SEADRAMON_FQID_ARR; + inline static constexpr size_t PEN20_METAL_SEADRAMON_FQID_LEN = sizeof(PEN20_METAL_SEADRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_METAL_SEADRAMON_ID_ARR[] = "metal_seadramon"; + inline static constexpr const char* PEN20_METAL_SEADRAMON_ID = PEN20_METAL_SEADRAMON_ID_ARR; + inline static constexpr size_t PEN20_METAL_SEADRAMON_ID_LEN = sizeof(PEN20_METAL_SEADRAMON_ID)-1; + inline static constexpr char PEN20_METAL_SEADRAMON_NAME_ARR[] = "Metal Seadramon"; + inline static constexpr const char* PEN20_METAL_SEADRAMON_NAME = PEN20_METAL_SEADRAMON_NAME_ARR; + inline static constexpr size_t PEN20_METAL_SEADRAMON_NAME_LEN = sizeof(PEN20_METAL_SEADRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_METAL_SEADRAMON_FQNAME_ARR[] = "pen20:Metal Seadramon"; + inline static constexpr const char* PEN20_METAL_SEADRAMON_FQNAME = PEN20_METAL_SEADRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_METAL_SEADRAMON_FQNAME_LEN = sizeof(PEN20_METAL_SEADRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_METAL_SEADRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_METAL_SEADRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_METAL_SEADRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_METAL_SEADRAMON_ANIM_INDEX = 98; + + // Name: Mochimon + inline static constexpr char PEN20_MOCHIMON_FQID_ARR[] = "pen20:mochimon"; + inline static constexpr const char* PEN20_MOCHIMON_FQID = PEN20_MOCHIMON_FQID_ARR; + inline static constexpr size_t PEN20_MOCHIMON_FQID_LEN = sizeof(PEN20_MOCHIMON_FQID_ARR)-1; + inline static constexpr char PEN20_MOCHIMON_ID_ARR[] = "mochimon"; + inline static constexpr const char* PEN20_MOCHIMON_ID = PEN20_MOCHIMON_ID_ARR; + inline static constexpr size_t PEN20_MOCHIMON_ID_LEN = sizeof(PEN20_MOCHIMON_ID)-1; + inline static constexpr char PEN20_MOCHIMON_NAME_ARR[] = "Mochimon"; + inline static constexpr const char* PEN20_MOCHIMON_NAME = PEN20_MOCHIMON_NAME_ARR; + inline static constexpr size_t PEN20_MOCHIMON_NAME_LEN = sizeof(PEN20_MOCHIMON_NAME_ARR)-1; + inline static constexpr char PEN20_MOCHIMON_FQNAME_ARR[] = "pen20:Mochimon"; + inline static constexpr const char* PEN20_MOCHIMON_FQNAME = PEN20_MOCHIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_MOCHIMON_FQNAME_LEN = sizeof(PEN20_MOCHIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_MOCHIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_MOCHIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_MOCHIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_MOCHIMON_ANIM_INDEX = 99; + + // Name: Mokumon + inline static constexpr char PEN20_MOKUMON_FQID_ARR[] = "pen20:mokumon"; + inline static constexpr const char* PEN20_MOKUMON_FQID = PEN20_MOKUMON_FQID_ARR; + inline static constexpr size_t PEN20_MOKUMON_FQID_LEN = sizeof(PEN20_MOKUMON_FQID_ARR)-1; + inline static constexpr char PEN20_MOKUMON_ID_ARR[] = "mokumon"; + inline static constexpr const char* PEN20_MOKUMON_ID = PEN20_MOKUMON_ID_ARR; + inline static constexpr size_t PEN20_MOKUMON_ID_LEN = sizeof(PEN20_MOKUMON_ID)-1; + inline static constexpr char PEN20_MOKUMON_NAME_ARR[] = "Mokumon"; + inline static constexpr const char* PEN20_MOKUMON_NAME = PEN20_MOKUMON_NAME_ARR; + inline static constexpr size_t PEN20_MOKUMON_NAME_LEN = sizeof(PEN20_MOKUMON_NAME_ARR)-1; + inline static constexpr char PEN20_MOKUMON_FQNAME_ARR[] = "pen20:Mokumon"; + inline static constexpr const char* PEN20_MOKUMON_FQNAME = PEN20_MOKUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_MOKUMON_FQNAME_LEN = sizeof(PEN20_MOKUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_MOKUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_MOKUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_MOKUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_MOKUMON_ANIM_INDEX = 100; + + // Name: Mushmon + inline static constexpr char PEN20_MUSHMON_FQID_ARR[] = "pen20:mushmon"; + inline static constexpr const char* PEN20_MUSHMON_FQID = PEN20_MUSHMON_FQID_ARR; + inline static constexpr size_t PEN20_MUSHMON_FQID_LEN = sizeof(PEN20_MUSHMON_FQID_ARR)-1; + inline static constexpr char PEN20_MUSHMON_ID_ARR[] = "mushmon"; + inline static constexpr const char* PEN20_MUSHMON_ID = PEN20_MUSHMON_ID_ARR; + inline static constexpr size_t PEN20_MUSHMON_ID_LEN = sizeof(PEN20_MUSHMON_ID)-1; + inline static constexpr char PEN20_MUSHMON_NAME_ARR[] = "Mushmon"; + inline static constexpr const char* PEN20_MUSHMON_NAME = PEN20_MUSHMON_NAME_ARR; + inline static constexpr size_t PEN20_MUSHMON_NAME_LEN = sizeof(PEN20_MUSHMON_NAME_ARR)-1; + inline static constexpr char PEN20_MUSHMON_FQNAME_ARR[] = "pen20:Mushmon"; + inline static constexpr const char* PEN20_MUSHMON_FQNAME = PEN20_MUSHMON_FQNAME_ARR; + inline static constexpr size_t PEN20_MUSHMON_FQNAME_LEN = sizeof(PEN20_MUSHMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_MUSHMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_MUSHMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_MUSHMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_MUSHMON_ANIM_INDEX = 101; + + // Name: Nyokimon + inline static constexpr char PEN20_NYOKIMON_FQID_ARR[] = "pen20:nyokimon"; + inline static constexpr const char* PEN20_NYOKIMON_FQID = PEN20_NYOKIMON_FQID_ARR; + inline static constexpr size_t PEN20_NYOKIMON_FQID_LEN = sizeof(PEN20_NYOKIMON_FQID_ARR)-1; + inline static constexpr char PEN20_NYOKIMON_ID_ARR[] = "nyokimon"; + inline static constexpr const char* PEN20_NYOKIMON_ID = PEN20_NYOKIMON_ID_ARR; + inline static constexpr size_t PEN20_NYOKIMON_ID_LEN = sizeof(PEN20_NYOKIMON_ID)-1; + inline static constexpr char PEN20_NYOKIMON_NAME_ARR[] = "Nyokimon"; + inline static constexpr const char* PEN20_NYOKIMON_NAME = PEN20_NYOKIMON_NAME_ARR; + inline static constexpr size_t PEN20_NYOKIMON_NAME_LEN = sizeof(PEN20_NYOKIMON_NAME_ARR)-1; + inline static constexpr char PEN20_NYOKIMON_FQNAME_ARR[] = "pen20:Nyokimon"; + inline static constexpr const char* PEN20_NYOKIMON_FQNAME = PEN20_NYOKIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_NYOKIMON_FQNAME_LEN = sizeof(PEN20_NYOKIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_NYOKIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_NYOKIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_NYOKIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_NYOKIMON_ANIM_INDEX = 102; + + // Name: Octmon + inline static constexpr char PEN20_OCTMON_FQID_ARR[] = "pen20:octmon"; + inline static constexpr const char* PEN20_OCTMON_FQID = PEN20_OCTMON_FQID_ARR; + inline static constexpr size_t PEN20_OCTMON_FQID_LEN = sizeof(PEN20_OCTMON_FQID_ARR)-1; + inline static constexpr char PEN20_OCTMON_ID_ARR[] = "octmon"; + inline static constexpr const char* PEN20_OCTMON_ID = PEN20_OCTMON_ID_ARR; + inline static constexpr size_t PEN20_OCTMON_ID_LEN = sizeof(PEN20_OCTMON_ID)-1; + inline static constexpr char PEN20_OCTMON_NAME_ARR[] = "Octmon"; + inline static constexpr const char* PEN20_OCTMON_NAME = PEN20_OCTMON_NAME_ARR; + inline static constexpr size_t PEN20_OCTMON_NAME_LEN = sizeof(PEN20_OCTMON_NAME_ARR)-1; + inline static constexpr char PEN20_OCTMON_FQNAME_ARR[] = "pen20:Octmon"; + inline static constexpr const char* PEN20_OCTMON_FQNAME = PEN20_OCTMON_FQNAME_ARR; + inline static constexpr size_t PEN20_OCTMON_FQNAME_LEN = sizeof(PEN20_OCTMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_OCTMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_OCTMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_OCTMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_OCTMON_ANIM_INDEX = 103; + + // Name: Ofanimon + inline static constexpr char PEN20_OFANIMON_FQID_ARR[] = "pen20:ofanimon"; + inline static constexpr const char* PEN20_OFANIMON_FQID = PEN20_OFANIMON_FQID_ARR; + inline static constexpr size_t PEN20_OFANIMON_FQID_LEN = sizeof(PEN20_OFANIMON_FQID_ARR)-1; + inline static constexpr char PEN20_OFANIMON_ID_ARR[] = "ofanimon"; + inline static constexpr const char* PEN20_OFANIMON_ID = PEN20_OFANIMON_ID_ARR; + inline static constexpr size_t PEN20_OFANIMON_ID_LEN = sizeof(PEN20_OFANIMON_ID)-1; + inline static constexpr char PEN20_OFANIMON_NAME_ARR[] = "Ofanimon"; + inline static constexpr const char* PEN20_OFANIMON_NAME = PEN20_OFANIMON_NAME_ARR; + inline static constexpr size_t PEN20_OFANIMON_NAME_LEN = sizeof(PEN20_OFANIMON_NAME_ARR)-1; + inline static constexpr char PEN20_OFANIMON_FQNAME_ARR[] = "pen20:Ofanimon"; + inline static constexpr const char* PEN20_OFANIMON_FQNAME = PEN20_OFANIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_OFANIMON_FQNAME_LEN = sizeof(PEN20_OFANIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_OFANIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_OFANIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_OFANIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_OFANIMON_ANIM_INDEX = 104; + + // Name: Ogudomon + inline static constexpr char PEN20_OGUDOMON_FQID_ARR[] = "pen20:ogudomon"; + inline static constexpr const char* PEN20_OGUDOMON_FQID = PEN20_OGUDOMON_FQID_ARR; + inline static constexpr size_t PEN20_OGUDOMON_FQID_LEN = sizeof(PEN20_OGUDOMON_FQID_ARR)-1; + inline static constexpr char PEN20_OGUDOMON_ID_ARR[] = "ogudomon"; + inline static constexpr const char* PEN20_OGUDOMON_ID = PEN20_OGUDOMON_ID_ARR; + inline static constexpr size_t PEN20_OGUDOMON_ID_LEN = sizeof(PEN20_OGUDOMON_ID)-1; + inline static constexpr char PEN20_OGUDOMON_NAME_ARR[] = "Ogudomon"; + inline static constexpr const char* PEN20_OGUDOMON_NAME = PEN20_OGUDOMON_NAME_ARR; + inline static constexpr size_t PEN20_OGUDOMON_NAME_LEN = sizeof(PEN20_OGUDOMON_NAME_ARR)-1; + inline static constexpr char PEN20_OGUDOMON_FQNAME_ARR[] = "pen20:Ogudomon"; + inline static constexpr const char* PEN20_OGUDOMON_FQNAME = PEN20_OGUDOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_OGUDOMON_FQNAME_LEN = sizeof(PEN20_OGUDOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_OGUDOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_OGUDOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_OGUDOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_OGUDOMON_ANIM_INDEX = 105; + + // Name: Okuwamon + inline static constexpr char PEN20_OKUWAMON_FQID_ARR[] = "pen20:okuwamon"; + inline static constexpr const char* PEN20_OKUWAMON_FQID = PEN20_OKUWAMON_FQID_ARR; + inline static constexpr size_t PEN20_OKUWAMON_FQID_LEN = sizeof(PEN20_OKUWAMON_FQID_ARR)-1; + inline static constexpr char PEN20_OKUWAMON_ID_ARR[] = "okuwamon"; + inline static constexpr const char* PEN20_OKUWAMON_ID = PEN20_OKUWAMON_ID_ARR; + inline static constexpr size_t PEN20_OKUWAMON_ID_LEN = sizeof(PEN20_OKUWAMON_ID)-1; + inline static constexpr char PEN20_OKUWAMON_NAME_ARR[] = "Okuwamon"; + inline static constexpr const char* PEN20_OKUWAMON_NAME = PEN20_OKUWAMON_NAME_ARR; + inline static constexpr size_t PEN20_OKUWAMON_NAME_LEN = sizeof(PEN20_OKUWAMON_NAME_ARR)-1; + inline static constexpr char PEN20_OKUWAMON_FQNAME_ARR[] = "pen20:Okuwamon"; + inline static constexpr const char* PEN20_OKUWAMON_FQNAME = PEN20_OKUWAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_OKUWAMON_FQNAME_LEN = sizeof(PEN20_OKUWAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_OKUWAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_OKUWAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_OKUWAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_OKUWAMON_ANIM_INDEX = 106; + + // Name: Ordinemon + inline static constexpr char PEN20_ORDINEMON_FQID_ARR[] = "pen20:ordinemon"; + inline static constexpr const char* PEN20_ORDINEMON_FQID = PEN20_ORDINEMON_FQID_ARR; + inline static constexpr size_t PEN20_ORDINEMON_FQID_LEN = sizeof(PEN20_ORDINEMON_FQID_ARR)-1; + inline static constexpr char PEN20_ORDINEMON_ID_ARR[] = "ordinemon"; + inline static constexpr const char* PEN20_ORDINEMON_ID = PEN20_ORDINEMON_ID_ARR; + inline static constexpr size_t PEN20_ORDINEMON_ID_LEN = sizeof(PEN20_ORDINEMON_ID)-1; + inline static constexpr char PEN20_ORDINEMON_NAME_ARR[] = "Ordinemon"; + inline static constexpr const char* PEN20_ORDINEMON_NAME = PEN20_ORDINEMON_NAME_ARR; + inline static constexpr size_t PEN20_ORDINEMON_NAME_LEN = sizeof(PEN20_ORDINEMON_NAME_ARR)-1; + inline static constexpr char PEN20_ORDINEMON_FQNAME_ARR[] = "pen20:Ordinemon"; + inline static constexpr const char* PEN20_ORDINEMON_FQNAME = PEN20_ORDINEMON_FQNAME_ARR; + inline static constexpr size_t PEN20_ORDINEMON_FQNAME_LEN = sizeof(PEN20_ORDINEMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_ORDINEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_ORDINEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_ORDINEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_ORDINEMON_ANIM_INDEX = 107; + + // Name: Otamamon + inline static constexpr char PEN20_OTAMAMON_FQID_ARR[] = "pen20:otamamon"; + inline static constexpr const char* PEN20_OTAMAMON_FQID = PEN20_OTAMAMON_FQID_ARR; + inline static constexpr size_t PEN20_OTAMAMON_FQID_LEN = sizeof(PEN20_OTAMAMON_FQID_ARR)-1; + inline static constexpr char PEN20_OTAMAMON_ID_ARR[] = "otamamon"; + inline static constexpr const char* PEN20_OTAMAMON_ID = PEN20_OTAMAMON_ID_ARR; + inline static constexpr size_t PEN20_OTAMAMON_ID_LEN = sizeof(PEN20_OTAMAMON_ID)-1; + inline static constexpr char PEN20_OTAMAMON_NAME_ARR[] = "Otamamon"; + inline static constexpr const char* PEN20_OTAMAMON_NAME = PEN20_OTAMAMON_NAME_ARR; + inline static constexpr size_t PEN20_OTAMAMON_NAME_LEN = sizeof(PEN20_OTAMAMON_NAME_ARR)-1; + inline static constexpr char PEN20_OTAMAMON_FQNAME_ARR[] = "pen20:Otamamon"; + inline static constexpr const char* PEN20_OTAMAMON_FQNAME = PEN20_OTAMAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_OTAMAMON_FQNAME_LEN = sizeof(PEN20_OTAMAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_OTAMAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_OTAMAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_OTAMAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_OTAMAMON_ANIM_INDEX = 108; + + // Name: Ouryumon + inline static constexpr char PEN20_OURYUMON_FQID_ARR[] = "pen20:ouryumon"; + inline static constexpr const char* PEN20_OURYUMON_FQID = PEN20_OURYUMON_FQID_ARR; + inline static constexpr size_t PEN20_OURYUMON_FQID_LEN = sizeof(PEN20_OURYUMON_FQID_ARR)-1; + inline static constexpr char PEN20_OURYUMON_ID_ARR[] = "ouryumon"; + inline static constexpr const char* PEN20_OURYUMON_ID = PEN20_OURYUMON_ID_ARR; + inline static constexpr size_t PEN20_OURYUMON_ID_LEN = sizeof(PEN20_OURYUMON_ID)-1; + inline static constexpr char PEN20_OURYUMON_NAME_ARR[] = "Ouryumon"; + inline static constexpr const char* PEN20_OURYUMON_NAME = PEN20_OURYUMON_NAME_ARR; + inline static constexpr size_t PEN20_OURYUMON_NAME_LEN = sizeof(PEN20_OURYUMON_NAME_ARR)-1; + inline static constexpr char PEN20_OURYUMON_FQNAME_ARR[] = "pen20:Ouryumon"; + inline static constexpr const char* PEN20_OURYUMON_FQNAME = PEN20_OURYUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_OURYUMON_FQNAME_LEN = sizeof(PEN20_OURYUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_OURYUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_OURYUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_OURYUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_OURYUMON_ANIM_INDEX = 109; + + // Name: Paildramon + inline static constexpr char PEN20_PAILDRAMON_FQID_ARR[] = "pen20:paildramon"; + inline static constexpr const char* PEN20_PAILDRAMON_FQID = PEN20_PAILDRAMON_FQID_ARR; + inline static constexpr size_t PEN20_PAILDRAMON_FQID_LEN = sizeof(PEN20_PAILDRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_PAILDRAMON_ID_ARR[] = "paildramon"; + inline static constexpr const char* PEN20_PAILDRAMON_ID = PEN20_PAILDRAMON_ID_ARR; + inline static constexpr size_t PEN20_PAILDRAMON_ID_LEN = sizeof(PEN20_PAILDRAMON_ID)-1; + inline static constexpr char PEN20_PAILDRAMON_NAME_ARR[] = "Paildramon"; + inline static constexpr const char* PEN20_PAILDRAMON_NAME = PEN20_PAILDRAMON_NAME_ARR; + inline static constexpr size_t PEN20_PAILDRAMON_NAME_LEN = sizeof(PEN20_PAILDRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_PAILDRAMON_FQNAME_ARR[] = "pen20:Paildramon"; + inline static constexpr const char* PEN20_PAILDRAMON_FQNAME = PEN20_PAILDRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_PAILDRAMON_FQNAME_LEN = sizeof(PEN20_PAILDRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_PAILDRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_PAILDRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_PAILDRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_PAILDRAMON_ANIM_INDEX = 110; + + // Name: Peti Meramon + inline static constexpr char PEN20_PETI_MERAMON_FQID_ARR[] = "pen20:peti_meramon"; + inline static constexpr const char* PEN20_PETI_MERAMON_FQID = PEN20_PETI_MERAMON_FQID_ARR; + inline static constexpr size_t PEN20_PETI_MERAMON_FQID_LEN = sizeof(PEN20_PETI_MERAMON_FQID_ARR)-1; + inline static constexpr char PEN20_PETI_MERAMON_ID_ARR[] = "peti_meramon"; + inline static constexpr const char* PEN20_PETI_MERAMON_ID = PEN20_PETI_MERAMON_ID_ARR; + inline static constexpr size_t PEN20_PETI_MERAMON_ID_LEN = sizeof(PEN20_PETI_MERAMON_ID)-1; + inline static constexpr char PEN20_PETI_MERAMON_NAME_ARR[] = "Peti Meramon"; + inline static constexpr const char* PEN20_PETI_MERAMON_NAME = PEN20_PETI_MERAMON_NAME_ARR; + inline static constexpr size_t PEN20_PETI_MERAMON_NAME_LEN = sizeof(PEN20_PETI_MERAMON_NAME_ARR)-1; + inline static constexpr char PEN20_PETI_MERAMON_FQNAME_ARR[] = "pen20:Peti Meramon"; + inline static constexpr const char* PEN20_PETI_MERAMON_FQNAME = PEN20_PETI_MERAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_PETI_MERAMON_FQNAME_LEN = sizeof(PEN20_PETI_MERAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_PETI_MERAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_PETI_MERAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_PETI_MERAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_PETI_MERAMON_ANIM_INDEX = 111; + + // Name: Phascomon + inline static constexpr char PEN20_PHASCOMON_FQID_ARR[] = "pen20:phascomon"; + inline static constexpr const char* PEN20_PHASCOMON_FQID = PEN20_PHASCOMON_FQID_ARR; + inline static constexpr size_t PEN20_PHASCOMON_FQID_LEN = sizeof(PEN20_PHASCOMON_FQID_ARR)-1; + inline static constexpr char PEN20_PHASCOMON_ID_ARR[] = "phascomon"; + inline static constexpr const char* PEN20_PHASCOMON_ID = PEN20_PHASCOMON_ID_ARR; + inline static constexpr size_t PEN20_PHASCOMON_ID_LEN = sizeof(PEN20_PHASCOMON_ID)-1; + inline static constexpr char PEN20_PHASCOMON_NAME_ARR[] = "Phascomon"; + inline static constexpr const char* PEN20_PHASCOMON_NAME = PEN20_PHASCOMON_NAME_ARR; + inline static constexpr size_t PEN20_PHASCOMON_NAME_LEN = sizeof(PEN20_PHASCOMON_NAME_ARR)-1; + inline static constexpr char PEN20_PHASCOMON_FQNAME_ARR[] = "pen20:Phascomon"; + inline static constexpr const char* PEN20_PHASCOMON_FQNAME = PEN20_PHASCOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_PHASCOMON_FQNAME_LEN = sizeof(PEN20_PHASCOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_PHASCOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_PHASCOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_PHASCOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_PHASCOMON_ANIM_INDEX = 112; + + // Name: Pico Devimon + inline static constexpr char PEN20_PICO_DEVIMON_FQID_ARR[] = "pen20:pico_devimon"; + inline static constexpr const char* PEN20_PICO_DEVIMON_FQID = PEN20_PICO_DEVIMON_FQID_ARR; + inline static constexpr size_t PEN20_PICO_DEVIMON_FQID_LEN = sizeof(PEN20_PICO_DEVIMON_FQID_ARR)-1; + inline static constexpr char PEN20_PICO_DEVIMON_ID_ARR[] = "pico_devimon"; + inline static constexpr const char* PEN20_PICO_DEVIMON_ID = PEN20_PICO_DEVIMON_ID_ARR; + inline static constexpr size_t PEN20_PICO_DEVIMON_ID_LEN = sizeof(PEN20_PICO_DEVIMON_ID)-1; + inline static constexpr char PEN20_PICO_DEVIMON_NAME_ARR[] = "Pico Devimon"; + inline static constexpr const char* PEN20_PICO_DEVIMON_NAME = PEN20_PICO_DEVIMON_NAME_ARR; + inline static constexpr size_t PEN20_PICO_DEVIMON_NAME_LEN = sizeof(PEN20_PICO_DEVIMON_NAME_ARR)-1; + inline static constexpr char PEN20_PICO_DEVIMON_FQNAME_ARR[] = "pen20:Pico Devimon"; + inline static constexpr const char* PEN20_PICO_DEVIMON_FQNAME = PEN20_PICO_DEVIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_PICO_DEVIMON_FQNAME_LEN = sizeof(PEN20_PICO_DEVIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_PICO_DEVIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_PICO_DEVIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_PICO_DEVIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_PICO_DEVIMON_ANIM_INDEX = 113; + + // Name: Piemon + inline static constexpr char PEN20_PIEMON_FQID_ARR[] = "pen20:piemon"; + inline static constexpr const char* PEN20_PIEMON_FQID = PEN20_PIEMON_FQID_ARR; + inline static constexpr size_t PEN20_PIEMON_FQID_LEN = sizeof(PEN20_PIEMON_FQID_ARR)-1; + inline static constexpr char PEN20_PIEMON_ID_ARR[] = "piemon"; + inline static constexpr const char* PEN20_PIEMON_ID = PEN20_PIEMON_ID_ARR; + inline static constexpr size_t PEN20_PIEMON_ID_LEN = sizeof(PEN20_PIEMON_ID)-1; + inline static constexpr char PEN20_PIEMON_NAME_ARR[] = "Piemon"; + inline static constexpr const char* PEN20_PIEMON_NAME = PEN20_PIEMON_NAME_ARR; + inline static constexpr size_t PEN20_PIEMON_NAME_LEN = sizeof(PEN20_PIEMON_NAME_ARR)-1; + inline static constexpr char PEN20_PIEMON_FQNAME_ARR[] = "pen20:Piemon"; + inline static constexpr const char* PEN20_PIEMON_FQNAME = PEN20_PIEMON_FQNAME_ARR; + inline static constexpr size_t PEN20_PIEMON_FQNAME_LEN = sizeof(PEN20_PIEMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_PIEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_PIEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_PIEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_PIEMON_ANIM_INDEX = 114; + + // Name: Plesiomon + inline static constexpr char PEN20_PLESIOMON_FQID_ARR[] = "pen20:plesiomon"; + inline static constexpr const char* PEN20_PLESIOMON_FQID = PEN20_PLESIOMON_FQID_ARR; + inline static constexpr size_t PEN20_PLESIOMON_FQID_LEN = sizeof(PEN20_PLESIOMON_FQID_ARR)-1; + inline static constexpr char PEN20_PLESIOMON_ID_ARR[] = "plesiomon"; + inline static constexpr const char* PEN20_PLESIOMON_ID = PEN20_PLESIOMON_ID_ARR; + inline static constexpr size_t PEN20_PLESIOMON_ID_LEN = sizeof(PEN20_PLESIOMON_ID)-1; + inline static constexpr char PEN20_PLESIOMON_NAME_ARR[] = "Plesiomon"; + inline static constexpr const char* PEN20_PLESIOMON_NAME = PEN20_PLESIOMON_NAME_ARR; + inline static constexpr size_t PEN20_PLESIOMON_NAME_LEN = sizeof(PEN20_PLESIOMON_NAME_ARR)-1; + inline static constexpr char PEN20_PLESIOMON_FQNAME_ARR[] = "pen20:Plesiomon"; + inline static constexpr const char* PEN20_PLESIOMON_FQNAME = PEN20_PLESIOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_PLESIOMON_FQNAME_LEN = sizeof(PEN20_PLESIOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_PLESIOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_PLESIOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_PLESIOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_PLESIOMON_ANIM_INDEX = 115; + + // Name: Porcupmon + inline static constexpr char PEN20_PORCUPMON_FQID_ARR[] = "pen20:porcupmon"; + inline static constexpr const char* PEN20_PORCUPMON_FQID = PEN20_PORCUPMON_FQID_ARR; + inline static constexpr size_t PEN20_PORCUPMON_FQID_LEN = sizeof(PEN20_PORCUPMON_FQID_ARR)-1; + inline static constexpr char PEN20_PORCUPMON_ID_ARR[] = "porcupmon"; + inline static constexpr const char* PEN20_PORCUPMON_ID = PEN20_PORCUPMON_ID_ARR; + inline static constexpr size_t PEN20_PORCUPMON_ID_LEN = sizeof(PEN20_PORCUPMON_ID)-1; + inline static constexpr char PEN20_PORCUPMON_NAME_ARR[] = "Porcupmon"; + inline static constexpr const char* PEN20_PORCUPMON_NAME = PEN20_PORCUPMON_NAME_ARR; + inline static constexpr size_t PEN20_PORCUPMON_NAME_LEN = sizeof(PEN20_PORCUPMON_NAME_ARR)-1; + inline static constexpr char PEN20_PORCUPMON_FQNAME_ARR[] = "pen20:Porcupmon"; + inline static constexpr const char* PEN20_PORCUPMON_FQNAME = PEN20_PORCUPMON_FQNAME_ARR; + inline static constexpr size_t PEN20_PORCUPMON_FQNAME_LEN = sizeof(PEN20_PORCUPMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_PORCUPMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_PORCUPMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_PORCUPMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_PORCUPMON_ANIM_INDEX = 116; + + // Name: Pukumon + inline static constexpr char PEN20_PUKUMON_FQID_ARR[] = "pen20:pukumon"; + inline static constexpr const char* PEN20_PUKUMON_FQID = PEN20_PUKUMON_FQID_ARR; + inline static constexpr size_t PEN20_PUKUMON_FQID_LEN = sizeof(PEN20_PUKUMON_FQID_ARR)-1; + inline static constexpr char PEN20_PUKUMON_ID_ARR[] = "pukumon"; + inline static constexpr const char* PEN20_PUKUMON_ID = PEN20_PUKUMON_ID_ARR; + inline static constexpr size_t PEN20_PUKUMON_ID_LEN = sizeof(PEN20_PUKUMON_ID)-1; + inline static constexpr char PEN20_PUKUMON_NAME_ARR[] = "Pukumon"; + inline static constexpr const char* PEN20_PUKUMON_NAME = PEN20_PUKUMON_NAME_ARR; + inline static constexpr size_t PEN20_PUKUMON_NAME_LEN = sizeof(PEN20_PUKUMON_NAME_ARR)-1; + inline static constexpr char PEN20_PUKUMON_FQNAME_ARR[] = "pen20:Pukumon"; + inline static constexpr const char* PEN20_PUKUMON_FQNAME = PEN20_PUKUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_PUKUMON_FQNAME_LEN = sizeof(PEN20_PUKUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_PUKUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_PUKUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_PUKUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_PUKUMON_ANIM_INDEX = 117; + + // Name: Pumpmon + inline static constexpr char PEN20_PUMPMON_FQID_ARR[] = "pen20:pumpmon"; + inline static constexpr const char* PEN20_PUMPMON_FQID = PEN20_PUMPMON_FQID_ARR; + inline static constexpr size_t PEN20_PUMPMON_FQID_LEN = sizeof(PEN20_PUMPMON_FQID_ARR)-1; + inline static constexpr char PEN20_PUMPMON_ID_ARR[] = "pumpmon"; + inline static constexpr const char* PEN20_PUMPMON_ID = PEN20_PUMPMON_ID_ARR; + inline static constexpr size_t PEN20_PUMPMON_ID_LEN = sizeof(PEN20_PUMPMON_ID)-1; + inline static constexpr char PEN20_PUMPMON_NAME_ARR[] = "Pumpmon"; + inline static constexpr const char* PEN20_PUMPMON_NAME = PEN20_PUMPMON_NAME_ARR; + inline static constexpr size_t PEN20_PUMPMON_NAME_LEN = sizeof(PEN20_PUMPMON_NAME_ARR)-1; + inline static constexpr char PEN20_PUMPMON_FQNAME_ARR[] = "pen20:Pumpmon"; + inline static constexpr const char* PEN20_PUMPMON_FQNAME = PEN20_PUMPMON_FQNAME_ARR; + inline static constexpr size_t PEN20_PUMPMON_FQNAME_LEN = sizeof(PEN20_PUMPMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_PUMPMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_PUMPMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_PUMPMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_PUMPMON_ANIM_INDEX = 118; + + // Name: Pyocomon + inline static constexpr char PEN20_PYOCOMON_FQID_ARR[] = "pen20:pyocomon"; + inline static constexpr const char* PEN20_PYOCOMON_FQID = PEN20_PYOCOMON_FQID_ARR; + inline static constexpr size_t PEN20_PYOCOMON_FQID_LEN = sizeof(PEN20_PYOCOMON_FQID_ARR)-1; + inline static constexpr char PEN20_PYOCOMON_ID_ARR[] = "pyocomon"; + inline static constexpr const char* PEN20_PYOCOMON_ID = PEN20_PYOCOMON_ID_ARR; + inline static constexpr size_t PEN20_PYOCOMON_ID_LEN = sizeof(PEN20_PYOCOMON_ID)-1; + inline static constexpr char PEN20_PYOCOMON_NAME_ARR[] = "Pyocomon"; + inline static constexpr const char* PEN20_PYOCOMON_NAME = PEN20_PYOCOMON_NAME_ARR; + inline static constexpr size_t PEN20_PYOCOMON_NAME_LEN = sizeof(PEN20_PYOCOMON_NAME_ARR)-1; + inline static constexpr char PEN20_PYOCOMON_FQNAME_ARR[] = "pen20:Pyocomon"; + inline static constexpr const char* PEN20_PYOCOMON_FQNAME = PEN20_PYOCOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_PYOCOMON_FQNAME_LEN = sizeof(PEN20_PYOCOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_PYOCOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_PYOCOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_PYOCOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_PYOCOMON_ANIM_INDEX = 119; + + // Name: Rafflesimon + inline static constexpr char PEN20_RAFFLESIMON_FQID_ARR[] = "pen20:rafflesimon"; + inline static constexpr const char* PEN20_RAFFLESIMON_FQID = PEN20_RAFFLESIMON_FQID_ARR; + inline static constexpr size_t PEN20_RAFFLESIMON_FQID_LEN = sizeof(PEN20_RAFFLESIMON_FQID_ARR)-1; + inline static constexpr char PEN20_RAFFLESIMON_ID_ARR[] = "rafflesimon"; + inline static constexpr const char* PEN20_RAFFLESIMON_ID = PEN20_RAFFLESIMON_ID_ARR; + inline static constexpr size_t PEN20_RAFFLESIMON_ID_LEN = sizeof(PEN20_RAFFLESIMON_ID)-1; + inline static constexpr char PEN20_RAFFLESIMON_NAME_ARR[] = "Rafflesimon"; + inline static constexpr const char* PEN20_RAFFLESIMON_NAME = PEN20_RAFFLESIMON_NAME_ARR; + inline static constexpr size_t PEN20_RAFFLESIMON_NAME_LEN = sizeof(PEN20_RAFFLESIMON_NAME_ARR)-1; + inline static constexpr char PEN20_RAFFLESIMON_FQNAME_ARR[] = "pen20:Rafflesimon"; + inline static constexpr const char* PEN20_RAFFLESIMON_FQNAME = PEN20_RAFFLESIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_RAFFLESIMON_FQNAME_LEN = sizeof(PEN20_RAFFLESIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_RAFFLESIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_RAFFLESIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_RAFFLESIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_RAFFLESIMON_ANIM_INDEX = 120; + + // Name: Ragna Lordmon + inline static constexpr char PEN20_RAGNA_LORDMON_FQID_ARR[] = "pen20:ragna_lordmon"; + inline static constexpr const char* PEN20_RAGNA_LORDMON_FQID = PEN20_RAGNA_LORDMON_FQID_ARR; + inline static constexpr size_t PEN20_RAGNA_LORDMON_FQID_LEN = sizeof(PEN20_RAGNA_LORDMON_FQID_ARR)-1; + inline static constexpr char PEN20_RAGNA_LORDMON_ID_ARR[] = "ragna_lordmon"; + inline static constexpr const char* PEN20_RAGNA_LORDMON_ID = PEN20_RAGNA_LORDMON_ID_ARR; + inline static constexpr size_t PEN20_RAGNA_LORDMON_ID_LEN = sizeof(PEN20_RAGNA_LORDMON_ID)-1; + inline static constexpr char PEN20_RAGNA_LORDMON_NAME_ARR[] = "Ragna Lordmon"; + inline static constexpr const char* PEN20_RAGNA_LORDMON_NAME = PEN20_RAGNA_LORDMON_NAME_ARR; + inline static constexpr size_t PEN20_RAGNA_LORDMON_NAME_LEN = sizeof(PEN20_RAGNA_LORDMON_NAME_ARR)-1; + inline static constexpr char PEN20_RAGNA_LORDMON_FQNAME_ARR[] = "pen20:Ragna Lordmon"; + inline static constexpr const char* PEN20_RAGNA_LORDMON_FQNAME = PEN20_RAGNA_LORDMON_FQNAME_ARR; + inline static constexpr size_t PEN20_RAGNA_LORDMON_FQNAME_LEN = sizeof(PEN20_RAGNA_LORDMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_RAGNA_LORDMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_RAGNA_LORDMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_RAGNA_LORDMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_RAGNA_LORDMON_ANIM_INDEX = 121; + + // Name: Raguelmon + inline static constexpr char PEN20_RAGUELMON_FQID_ARR[] = "pen20:raguelmon"; + inline static constexpr const char* PEN20_RAGUELMON_FQID = PEN20_RAGUELMON_FQID_ARR; + inline static constexpr size_t PEN20_RAGUELMON_FQID_LEN = sizeof(PEN20_RAGUELMON_FQID_ARR)-1; + inline static constexpr char PEN20_RAGUELMON_ID_ARR[] = "raguelmon"; + inline static constexpr const char* PEN20_RAGUELMON_ID = PEN20_RAGUELMON_ID_ARR; + inline static constexpr size_t PEN20_RAGUELMON_ID_LEN = sizeof(PEN20_RAGUELMON_ID)-1; + inline static constexpr char PEN20_RAGUELMON_NAME_ARR[] = "Raguelmon"; + inline static constexpr const char* PEN20_RAGUELMON_NAME = PEN20_RAGUELMON_NAME_ARR; + inline static constexpr size_t PEN20_RAGUELMON_NAME_LEN = sizeof(PEN20_RAGUELMON_NAME_ARR)-1; + inline static constexpr char PEN20_RAGUELMON_FQNAME_ARR[] = "pen20:Raguelmon"; + inline static constexpr const char* PEN20_RAGUELMON_FQNAME = PEN20_RAGUELMON_FQNAME_ARR; + inline static constexpr size_t PEN20_RAGUELMON_FQNAME_LEN = sizeof(PEN20_RAGUELMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_RAGUELMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_RAGUELMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_RAGUELMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_RAGUELMON_ANIM_INDEX = 122; + + // Name: Raiji Ludomon + inline static constexpr char PEN20_RAIJI_LUDOMON_FQID_ARR[] = "pen20:raiji_ludomon"; + inline static constexpr const char* PEN20_RAIJI_LUDOMON_FQID = PEN20_RAIJI_LUDOMON_FQID_ARR; + inline static constexpr size_t PEN20_RAIJI_LUDOMON_FQID_LEN = sizeof(PEN20_RAIJI_LUDOMON_FQID_ARR)-1; + inline static constexpr char PEN20_RAIJI_LUDOMON_ID_ARR[] = "raiji_ludomon"; + inline static constexpr const char* PEN20_RAIJI_LUDOMON_ID = PEN20_RAIJI_LUDOMON_ID_ARR; + inline static constexpr size_t PEN20_RAIJI_LUDOMON_ID_LEN = sizeof(PEN20_RAIJI_LUDOMON_ID)-1; + inline static constexpr char PEN20_RAIJI_LUDOMON_NAME_ARR[] = "Raiji Ludomon"; + inline static constexpr const char* PEN20_RAIJI_LUDOMON_NAME = PEN20_RAIJI_LUDOMON_NAME_ARR; + inline static constexpr size_t PEN20_RAIJI_LUDOMON_NAME_LEN = sizeof(PEN20_RAIJI_LUDOMON_NAME_ARR)-1; + inline static constexpr char PEN20_RAIJI_LUDOMON_FQNAME_ARR[] = "pen20:Raiji Ludomon"; + inline static constexpr const char* PEN20_RAIJI_LUDOMON_FQNAME = PEN20_RAIJI_LUDOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_RAIJI_LUDOMON_FQNAME_LEN = sizeof(PEN20_RAIJI_LUDOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_RAIJI_LUDOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_RAIJI_LUDOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_RAIJI_LUDOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_RAIJI_LUDOMON_ANIM_INDEX = 123; + + // Name: Rakamon + inline static constexpr char PEN20_RAKAMON_FQID_ARR[] = "pen20:rakamon"; + inline static constexpr const char* PEN20_RAKAMON_FQID = PEN20_RAKAMON_FQID_ARR; + inline static constexpr size_t PEN20_RAKAMON_FQID_LEN = sizeof(PEN20_RAKAMON_FQID_ARR)-1; + inline static constexpr char PEN20_RAKAMON_ID_ARR[] = "rakamon"; + inline static constexpr const char* PEN20_RAKAMON_ID = PEN20_RAKAMON_ID_ARR; + inline static constexpr size_t PEN20_RAKAMON_ID_LEN = sizeof(PEN20_RAKAMON_ID)-1; + inline static constexpr char PEN20_RAKAMON_NAME_ARR[] = "Rakamon"; + inline static constexpr const char* PEN20_RAKAMON_NAME = PEN20_RAKAMON_NAME_ARR; + inline static constexpr size_t PEN20_RAKAMON_NAME_LEN = sizeof(PEN20_RAKAMON_NAME_ARR)-1; + inline static constexpr char PEN20_RAKAMON_FQNAME_ARR[] = "pen20:Rakamon"; + inline static constexpr const char* PEN20_RAKAMON_FQNAME = PEN20_RAKAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_RAKAMON_FQNAME_LEN = sizeof(PEN20_RAKAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_RAKAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_RAKAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_RAKAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_RAKAMON_ANIM_INDEX = 124; + + // Name: Rapidmon + inline static constexpr char PEN20_RAPIDMON_FQID_ARR[] = "pen20:rapidmon"; + inline static constexpr const char* PEN20_RAPIDMON_FQID = PEN20_RAPIDMON_FQID_ARR; + inline static constexpr size_t PEN20_RAPIDMON_FQID_LEN = sizeof(PEN20_RAPIDMON_FQID_ARR)-1; + inline static constexpr char PEN20_RAPIDMON_ID_ARR[] = "rapidmon"; + inline static constexpr const char* PEN20_RAPIDMON_ID = PEN20_RAPIDMON_ID_ARR; + inline static constexpr size_t PEN20_RAPIDMON_ID_LEN = sizeof(PEN20_RAPIDMON_ID)-1; + inline static constexpr char PEN20_RAPIDMON_NAME_ARR[] = "Rapidmon"; + inline static constexpr const char* PEN20_RAPIDMON_NAME = PEN20_RAPIDMON_NAME_ARR; + inline static constexpr size_t PEN20_RAPIDMON_NAME_LEN = sizeof(PEN20_RAPIDMON_NAME_ARR)-1; + inline static constexpr char PEN20_RAPIDMON_FQNAME_ARR[] = "pen20:Rapidmon"; + inline static constexpr const char* PEN20_RAPIDMON_FQNAME = PEN20_RAPIDMON_FQNAME_ARR; + inline static constexpr size_t PEN20_RAPIDMON_FQNAME_LEN = sizeof(PEN20_RAPIDMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_RAPIDMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_RAPIDMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_RAPIDMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_RAPIDMON_ANIM_INDEX = 125; + + // Name: Red Vegimon + inline static constexpr char PEN20_RED_VEGIMON_FQID_ARR[] = "pen20:red_vegimon"; + inline static constexpr const char* PEN20_RED_VEGIMON_FQID = PEN20_RED_VEGIMON_FQID_ARR; + inline static constexpr size_t PEN20_RED_VEGIMON_FQID_LEN = sizeof(PEN20_RED_VEGIMON_FQID_ARR)-1; + inline static constexpr char PEN20_RED_VEGIMON_ID_ARR[] = "red_vegimon"; + inline static constexpr const char* PEN20_RED_VEGIMON_ID = PEN20_RED_VEGIMON_ID_ARR; + inline static constexpr size_t PEN20_RED_VEGIMON_ID_LEN = sizeof(PEN20_RED_VEGIMON_ID)-1; + inline static constexpr char PEN20_RED_VEGIMON_NAME_ARR[] = "Red Vegimon"; + inline static constexpr const char* PEN20_RED_VEGIMON_NAME = PEN20_RED_VEGIMON_NAME_ARR; + inline static constexpr size_t PEN20_RED_VEGIMON_NAME_LEN = sizeof(PEN20_RED_VEGIMON_NAME_ARR)-1; + inline static constexpr char PEN20_RED_VEGIMON_FQNAME_ARR[] = "pen20:Red Vegimon"; + inline static constexpr const char* PEN20_RED_VEGIMON_FQNAME = PEN20_RED_VEGIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_RED_VEGIMON_FQNAME_LEN = sizeof(PEN20_RED_VEGIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_RED_VEGIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_RED_VEGIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_RED_VEGIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_RED_VEGIMON_ANIM_INDEX = 126; + + // Name: Reppamon + inline static constexpr char PEN20_REPPAMON_FQID_ARR[] = "pen20:reppamon"; + inline static constexpr const char* PEN20_REPPAMON_FQID = PEN20_REPPAMON_FQID_ARR; + inline static constexpr size_t PEN20_REPPAMON_FQID_LEN = sizeof(PEN20_REPPAMON_FQID_ARR)-1; + inline static constexpr char PEN20_REPPAMON_ID_ARR[] = "reppamon"; + inline static constexpr const char* PEN20_REPPAMON_ID = PEN20_REPPAMON_ID_ARR; + inline static constexpr size_t PEN20_REPPAMON_ID_LEN = sizeof(PEN20_REPPAMON_ID)-1; + inline static constexpr char PEN20_REPPAMON_NAME_ARR[] = "Reppamon"; + inline static constexpr const char* PEN20_REPPAMON_NAME = PEN20_REPPAMON_NAME_ARR; + inline static constexpr size_t PEN20_REPPAMON_NAME_LEN = sizeof(PEN20_REPPAMON_NAME_ARR)-1; + inline static constexpr char PEN20_REPPAMON_FQNAME_ARR[] = "pen20:Reppamon"; + inline static constexpr const char* PEN20_REPPAMON_FQNAME = PEN20_REPPAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_REPPAMON_FQNAME_LEN = sizeof(PEN20_REPPAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_REPPAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_REPPAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_REPPAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_REPPAMON_ANIM_INDEX = 127; + + // Name: Revolmon + inline static constexpr char PEN20_REVOLMON_FQID_ARR[] = "pen20:revolmon"; + inline static constexpr const char* PEN20_REVOLMON_FQID = PEN20_REVOLMON_FQID_ARR; + inline static constexpr size_t PEN20_REVOLMON_FQID_LEN = sizeof(PEN20_REVOLMON_FQID_ARR)-1; + inline static constexpr char PEN20_REVOLMON_ID_ARR[] = "revolmon"; + inline static constexpr const char* PEN20_REVOLMON_ID = PEN20_REVOLMON_ID_ARR; + inline static constexpr size_t PEN20_REVOLMON_ID_LEN = sizeof(PEN20_REVOLMON_ID)-1; + inline static constexpr char PEN20_REVOLMON_NAME_ARR[] = "Revolmon"; + inline static constexpr const char* PEN20_REVOLMON_NAME = PEN20_REVOLMON_NAME_ARR; + inline static constexpr size_t PEN20_REVOLMON_NAME_LEN = sizeof(PEN20_REVOLMON_NAME_ARR)-1; + inline static constexpr char PEN20_REVOLMON_FQNAME_ARR[] = "pen20:Revolmon"; + inline static constexpr const char* PEN20_REVOLMON_FQNAME = PEN20_REVOLMON_FQNAME_ARR; + inline static constexpr size_t PEN20_REVOLMON_FQNAME_LEN = sizeof(PEN20_REVOLMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_REVOLMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_REVOLMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_REVOLMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_REVOLMON_ANIM_INDEX = 128; + + // Name: Rize Greymon + inline static constexpr char PEN20_RIZE_GREYMON_FQID_ARR[] = "pen20:rize_greymon"; + inline static constexpr const char* PEN20_RIZE_GREYMON_FQID = PEN20_RIZE_GREYMON_FQID_ARR; + inline static constexpr size_t PEN20_RIZE_GREYMON_FQID_LEN = sizeof(PEN20_RIZE_GREYMON_FQID_ARR)-1; + inline static constexpr char PEN20_RIZE_GREYMON_ID_ARR[] = "rize_greymon"; + inline static constexpr const char* PEN20_RIZE_GREYMON_ID = PEN20_RIZE_GREYMON_ID_ARR; + inline static constexpr size_t PEN20_RIZE_GREYMON_ID_LEN = sizeof(PEN20_RIZE_GREYMON_ID)-1; + inline static constexpr char PEN20_RIZE_GREYMON_NAME_ARR[] = "Rize Greymon"; + inline static constexpr const char* PEN20_RIZE_GREYMON_NAME = PEN20_RIZE_GREYMON_NAME_ARR; + inline static constexpr size_t PEN20_RIZE_GREYMON_NAME_LEN = sizeof(PEN20_RIZE_GREYMON_NAME_ARR)-1; + inline static constexpr char PEN20_RIZE_GREYMON_FQNAME_ARR[] = "pen20:Rize Greymon"; + inline static constexpr const char* PEN20_RIZE_GREYMON_FQNAME = PEN20_RIZE_GREYMON_FQNAME_ARR; + inline static constexpr size_t PEN20_RIZE_GREYMON_FQNAME_LEN = sizeof(PEN20_RIZE_GREYMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_RIZE_GREYMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_RIZE_GREYMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_RIZE_GREYMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_RIZE_GREYMON_ANIM_INDEX = 129; + + // Name: Rosemon + inline static constexpr char PEN20_ROSEMON_FQID_ARR[] = "pen20:rosemon"; + inline static constexpr const char* PEN20_ROSEMON_FQID = PEN20_ROSEMON_FQID_ARR; + inline static constexpr size_t PEN20_ROSEMON_FQID_LEN = sizeof(PEN20_ROSEMON_FQID_ARR)-1; + inline static constexpr char PEN20_ROSEMON_ID_ARR[] = "rosemon"; + inline static constexpr const char* PEN20_ROSEMON_ID = PEN20_ROSEMON_ID_ARR; + inline static constexpr size_t PEN20_ROSEMON_ID_LEN = sizeof(PEN20_ROSEMON_ID)-1; + inline static constexpr char PEN20_ROSEMON_NAME_ARR[] = "Rosemon"; + inline static constexpr const char* PEN20_ROSEMON_NAME = PEN20_ROSEMON_NAME_ARR; + inline static constexpr size_t PEN20_ROSEMON_NAME_LEN = sizeof(PEN20_ROSEMON_NAME_ARR)-1; + inline static constexpr char PEN20_ROSEMON_FQNAME_ARR[] = "pen20:Rosemon"; + inline static constexpr const char* PEN20_ROSEMON_FQNAME = PEN20_ROSEMON_FQNAME_ARR; + inline static constexpr size_t PEN20_ROSEMON_FQNAME_LEN = sizeof(PEN20_ROSEMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_ROSEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_ROSEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_ROSEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_ROSEMON_ANIM_INDEX = 130; + + // Name: Ryudamon + inline static constexpr char PEN20_RYUDAMON_FQID_ARR[] = "pen20:ryudamon"; + inline static constexpr const char* PEN20_RYUDAMON_FQID = PEN20_RYUDAMON_FQID_ARR; + inline static constexpr size_t PEN20_RYUDAMON_FQID_LEN = sizeof(PEN20_RYUDAMON_FQID_ARR)-1; + inline static constexpr char PEN20_RYUDAMON_ID_ARR[] = "ryudamon"; + inline static constexpr const char* PEN20_RYUDAMON_ID = PEN20_RYUDAMON_ID_ARR; + inline static constexpr size_t PEN20_RYUDAMON_ID_LEN = sizeof(PEN20_RYUDAMON_ID)-1; + inline static constexpr char PEN20_RYUDAMON_NAME_ARR[] = "Ryudamon"; + inline static constexpr const char* PEN20_RYUDAMON_NAME = PEN20_RYUDAMON_NAME_ARR; + inline static constexpr size_t PEN20_RYUDAMON_NAME_LEN = sizeof(PEN20_RYUDAMON_NAME_ARR)-1; + inline static constexpr char PEN20_RYUDAMON_FQNAME_ARR[] = "pen20:Ryudamon"; + inline static constexpr const char* PEN20_RYUDAMON_FQNAME = PEN20_RYUDAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_RYUDAMON_FQNAME_LEN = sizeof(PEN20_RYUDAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_RYUDAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_RYUDAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_RYUDAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_RYUDAMON_ANIM_INDEX = 131; + + // Name: Saber Leomon + inline static constexpr char PEN20_SABER_LEOMON_FQID_ARR[] = "pen20:saber_leomon"; + inline static constexpr const char* PEN20_SABER_LEOMON_FQID = PEN20_SABER_LEOMON_FQID_ARR; + inline static constexpr size_t PEN20_SABER_LEOMON_FQID_LEN = sizeof(PEN20_SABER_LEOMON_FQID_ARR)-1; + inline static constexpr char PEN20_SABER_LEOMON_ID_ARR[] = "saber_leomon"; + inline static constexpr const char* PEN20_SABER_LEOMON_ID = PEN20_SABER_LEOMON_ID_ARR; + inline static constexpr size_t PEN20_SABER_LEOMON_ID_LEN = sizeof(PEN20_SABER_LEOMON_ID)-1; + inline static constexpr char PEN20_SABER_LEOMON_NAME_ARR[] = "Saber Leomon"; + inline static constexpr const char* PEN20_SABER_LEOMON_NAME = PEN20_SABER_LEOMON_NAME_ARR; + inline static constexpr size_t PEN20_SABER_LEOMON_NAME_LEN = sizeof(PEN20_SABER_LEOMON_NAME_ARR)-1; + inline static constexpr char PEN20_SABER_LEOMON_FQNAME_ARR[] = "pen20:Saber Leomon"; + inline static constexpr const char* PEN20_SABER_LEOMON_FQNAME = PEN20_SABER_LEOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_SABER_LEOMON_FQNAME_LEN = sizeof(PEN20_SABER_LEOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_SABER_LEOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_SABER_LEOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_SABER_LEOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_SABER_LEOMON_ANIM_INDEX = 132; + + // Name: Saint Galgomon + inline static constexpr char PEN20_SAINT_GALGOMON_FQID_ARR[] = "pen20:saint_galgomon"; + inline static constexpr const char* PEN20_SAINT_GALGOMON_FQID = PEN20_SAINT_GALGOMON_FQID_ARR; + inline static constexpr size_t PEN20_SAINT_GALGOMON_FQID_LEN = sizeof(PEN20_SAINT_GALGOMON_FQID_ARR)-1; + inline static constexpr char PEN20_SAINT_GALGOMON_ID_ARR[] = "saint_galgomon"; + inline static constexpr const char* PEN20_SAINT_GALGOMON_ID = PEN20_SAINT_GALGOMON_ID_ARR; + inline static constexpr size_t PEN20_SAINT_GALGOMON_ID_LEN = sizeof(PEN20_SAINT_GALGOMON_ID)-1; + inline static constexpr char PEN20_SAINT_GALGOMON_NAME_ARR[] = "Saint Galgomon"; + inline static constexpr const char* PEN20_SAINT_GALGOMON_NAME = PEN20_SAINT_GALGOMON_NAME_ARR; + inline static constexpr size_t PEN20_SAINT_GALGOMON_NAME_LEN = sizeof(PEN20_SAINT_GALGOMON_NAME_ARR)-1; + inline static constexpr char PEN20_SAINT_GALGOMON_FQNAME_ARR[] = "pen20:Saint Galgomon"; + inline static constexpr const char* PEN20_SAINT_GALGOMON_FQNAME = PEN20_SAINT_GALGOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_SAINT_GALGOMON_FQNAME_LEN = sizeof(PEN20_SAINT_GALGOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_SAINT_GALGOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_SAINT_GALGOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_SAINT_GALGOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_SAINT_GALGOMON_ANIM_INDEX = 133; + + // Name: Seraphimon + inline static constexpr char PEN20_SERAPHIMON_FQID_ARR[] = "pen20:seraphimon"; + inline static constexpr const char* PEN20_SERAPHIMON_FQID = PEN20_SERAPHIMON_FQID_ARR; + inline static constexpr size_t PEN20_SERAPHIMON_FQID_LEN = sizeof(PEN20_SERAPHIMON_FQID_ARR)-1; + inline static constexpr char PEN20_SERAPHIMON_ID_ARR[] = "seraphimon"; + inline static constexpr const char* PEN20_SERAPHIMON_ID = PEN20_SERAPHIMON_ID_ARR; + inline static constexpr size_t PEN20_SERAPHIMON_ID_LEN = sizeof(PEN20_SERAPHIMON_ID)-1; + inline static constexpr char PEN20_SERAPHIMON_NAME_ARR[] = "Seraphimon"; + inline static constexpr const char* PEN20_SERAPHIMON_NAME = PEN20_SERAPHIMON_NAME_ARR; + inline static constexpr size_t PEN20_SERAPHIMON_NAME_LEN = sizeof(PEN20_SERAPHIMON_NAME_ARR)-1; + inline static constexpr char PEN20_SERAPHIMON_FQNAME_ARR[] = "pen20:Seraphimon"; + inline static constexpr const char* PEN20_SERAPHIMON_FQNAME = PEN20_SERAPHIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_SERAPHIMON_FQNAME_LEN = sizeof(PEN20_SERAPHIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_SERAPHIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_SERAPHIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_SERAPHIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_SERAPHIMON_ANIM_INDEX = 134; + + // Name: Shadramon + inline static constexpr char PEN20_SHADRAMON_FQID_ARR[] = "pen20:shadramon"; + inline static constexpr const char* PEN20_SHADRAMON_FQID = PEN20_SHADRAMON_FQID_ARR; + inline static constexpr size_t PEN20_SHADRAMON_FQID_LEN = sizeof(PEN20_SHADRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_SHADRAMON_ID_ARR[] = "shadramon"; + inline static constexpr const char* PEN20_SHADRAMON_ID = PEN20_SHADRAMON_ID_ARR; + inline static constexpr size_t PEN20_SHADRAMON_ID_LEN = sizeof(PEN20_SHADRAMON_ID)-1; + inline static constexpr char PEN20_SHADRAMON_NAME_ARR[] = "Shadramon"; + inline static constexpr const char* PEN20_SHADRAMON_NAME = PEN20_SHADRAMON_NAME_ARR; + inline static constexpr size_t PEN20_SHADRAMON_NAME_LEN = sizeof(PEN20_SHADRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_SHADRAMON_FQNAME_ARR[] = "pen20:Shadramon"; + inline static constexpr const char* PEN20_SHADRAMON_FQNAME = PEN20_SHADRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_SHADRAMON_FQNAME_LEN = sizeof(PEN20_SHADRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_SHADRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_SHADRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_SHADRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_SHADRAMON_ANIM_INDEX = 135; + + // Name: Shakomon + inline static constexpr char PEN20_SHAKOMON_FQID_ARR[] = "pen20:shakomon"; + inline static constexpr const char* PEN20_SHAKOMON_FQID = PEN20_SHAKOMON_FQID_ARR; + inline static constexpr size_t PEN20_SHAKOMON_FQID_LEN = sizeof(PEN20_SHAKOMON_FQID_ARR)-1; + inline static constexpr char PEN20_SHAKOMON_ID_ARR[] = "shakomon"; + inline static constexpr const char* PEN20_SHAKOMON_ID = PEN20_SHAKOMON_ID_ARR; + inline static constexpr size_t PEN20_SHAKOMON_ID_LEN = sizeof(PEN20_SHAKOMON_ID)-1; + inline static constexpr char PEN20_SHAKOMON_NAME_ARR[] = "Shakomon"; + inline static constexpr const char* PEN20_SHAKOMON_NAME = PEN20_SHAKOMON_NAME_ARR; + inline static constexpr size_t PEN20_SHAKOMON_NAME_LEN = sizeof(PEN20_SHAKOMON_NAME_ARR)-1; + inline static constexpr char PEN20_SHAKOMON_FQNAME_ARR[] = "pen20:Shakomon"; + inline static constexpr const char* PEN20_SHAKOMON_FQNAME = PEN20_SHAKOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_SHAKOMON_FQNAME_LEN = sizeof(PEN20_SHAKOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_SHAKOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_SHAKOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_SHAKOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_SHAKOMON_ANIM_INDEX = 136; + + // Name: Starmon + inline static constexpr char PEN20_STARMON_FQID_ARR[] = "pen20:starmon"; + inline static constexpr const char* PEN20_STARMON_FQID = PEN20_STARMON_FQID_ARR; + inline static constexpr size_t PEN20_STARMON_FQID_LEN = sizeof(PEN20_STARMON_FQID_ARR)-1; + inline static constexpr char PEN20_STARMON_ID_ARR[] = "starmon"; + inline static constexpr const char* PEN20_STARMON_ID = PEN20_STARMON_ID_ARR; + inline static constexpr size_t PEN20_STARMON_ID_LEN = sizeof(PEN20_STARMON_ID)-1; + inline static constexpr char PEN20_STARMON_NAME_ARR[] = "Starmon"; + inline static constexpr const char* PEN20_STARMON_NAME = PEN20_STARMON_NAME_ARR; + inline static constexpr size_t PEN20_STARMON_NAME_LEN = sizeof(PEN20_STARMON_NAME_ARR)-1; + inline static constexpr char PEN20_STARMON_FQNAME_ARR[] = "pen20:Starmon"; + inline static constexpr const char* PEN20_STARMON_FQNAME = PEN20_STARMON_FQNAME_ARR; + inline static constexpr size_t PEN20_STARMON_FQNAME_LEN = sizeof(PEN20_STARMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_STARMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_STARMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_STARMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_STARMON_ANIM_INDEX = 137; + + // Name: Sunflowmon + inline static constexpr char PEN20_SUNFLOWMON_FQID_ARR[] = "pen20:sunflowmon"; + inline static constexpr const char* PEN20_SUNFLOWMON_FQID = PEN20_SUNFLOWMON_FQID_ARR; + inline static constexpr size_t PEN20_SUNFLOWMON_FQID_LEN = sizeof(PEN20_SUNFLOWMON_FQID_ARR)-1; + inline static constexpr char PEN20_SUNFLOWMON_ID_ARR[] = "sunflowmon"; + inline static constexpr const char* PEN20_SUNFLOWMON_ID = PEN20_SUNFLOWMON_ID_ARR; + inline static constexpr size_t PEN20_SUNFLOWMON_ID_LEN = sizeof(PEN20_SUNFLOWMON_ID)-1; + inline static constexpr char PEN20_SUNFLOWMON_NAME_ARR[] = "Sunflowmon"; + inline static constexpr const char* PEN20_SUNFLOWMON_NAME = PEN20_SUNFLOWMON_NAME_ARR; + inline static constexpr size_t PEN20_SUNFLOWMON_NAME_LEN = sizeof(PEN20_SUNFLOWMON_NAME_ARR)-1; + inline static constexpr char PEN20_SUNFLOWMON_FQNAME_ARR[] = "pen20:Sunflowmon"; + inline static constexpr const char* PEN20_SUNFLOWMON_FQNAME = PEN20_SUNFLOWMON_FQNAME_ARR; + inline static constexpr size_t PEN20_SUNFLOWMON_FQNAME_LEN = sizeof(PEN20_SUNFLOWMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_SUNFLOWMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_SUNFLOWMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_SUNFLOWMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_SUNFLOWMON_ANIM_INDEX = 138; + + // Name: Tailmon + inline static constexpr char PEN20_TAILMON_FQID_ARR[] = "pen20:tailmon"; + inline static constexpr const char* PEN20_TAILMON_FQID = PEN20_TAILMON_FQID_ARR; + inline static constexpr size_t PEN20_TAILMON_FQID_LEN = sizeof(PEN20_TAILMON_FQID_ARR)-1; + inline static constexpr char PEN20_TAILMON_ID_ARR[] = "tailmon"; + inline static constexpr const char* PEN20_TAILMON_ID = PEN20_TAILMON_ID_ARR; + inline static constexpr size_t PEN20_TAILMON_ID_LEN = sizeof(PEN20_TAILMON_ID)-1; + inline static constexpr char PEN20_TAILMON_NAME_ARR[] = "Tailmon"; + inline static constexpr const char* PEN20_TAILMON_NAME = PEN20_TAILMON_NAME_ARR; + inline static constexpr size_t PEN20_TAILMON_NAME_LEN = sizeof(PEN20_TAILMON_NAME_ARR)-1; + inline static constexpr char PEN20_TAILMON_FQNAME_ARR[] = "pen20:Tailmon"; + inline static constexpr const char* PEN20_TAILMON_FQNAME = PEN20_TAILMON_FQNAME_ARR; + inline static constexpr size_t PEN20_TAILMON_FQNAME_LEN = sizeof(PEN20_TAILMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_TAILMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_TAILMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_TAILMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_TAILMON_ANIM_INDEX = 139; + + // Name: Tankmon + inline static constexpr char PEN20_TANKMON_FQID_ARR[] = "pen20:tankmon"; + inline static constexpr const char* PEN20_TANKMON_FQID = PEN20_TANKMON_FQID_ARR; + inline static constexpr size_t PEN20_TANKMON_FQID_LEN = sizeof(PEN20_TANKMON_FQID_ARR)-1; + inline static constexpr char PEN20_TANKMON_ID_ARR[] = "tankmon"; + inline static constexpr const char* PEN20_TANKMON_ID = PEN20_TANKMON_ID_ARR; + inline static constexpr size_t PEN20_TANKMON_ID_LEN = sizeof(PEN20_TANKMON_ID)-1; + inline static constexpr char PEN20_TANKMON_NAME_ARR[] = "Tankmon"; + inline static constexpr const char* PEN20_TANKMON_NAME = PEN20_TANKMON_NAME_ARR; + inline static constexpr size_t PEN20_TANKMON_NAME_LEN = sizeof(PEN20_TANKMON_NAME_ARR)-1; + inline static constexpr char PEN20_TANKMON_FQNAME_ARR[] = "pen20:Tankmon"; + inline static constexpr const char* PEN20_TANKMON_FQNAME = PEN20_TANKMON_FQNAME_ARR; + inline static constexpr size_t PEN20_TANKMON_FQNAME_LEN = sizeof(PEN20_TANKMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_TANKMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_TANKMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_TANKMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_TANKMON_ANIM_INDEX = 140; + + // Name: Targetmon + inline static constexpr char PEN20_TARGETMON_FQID_ARR[] = "pen20:targetmon"; + inline static constexpr const char* PEN20_TARGETMON_FQID = PEN20_TARGETMON_FQID_ARR; + inline static constexpr size_t PEN20_TARGETMON_FQID_LEN = sizeof(PEN20_TARGETMON_FQID_ARR)-1; + inline static constexpr char PEN20_TARGETMON_ID_ARR[] = "targetmon"; + inline static constexpr const char* PEN20_TARGETMON_ID = PEN20_TARGETMON_ID_ARR; + inline static constexpr size_t PEN20_TARGETMON_ID_LEN = sizeof(PEN20_TARGETMON_ID)-1; + inline static constexpr char PEN20_TARGETMON_NAME_ARR[] = "Targetmon"; + inline static constexpr const char* PEN20_TARGETMON_NAME = PEN20_TARGETMON_NAME_ARR; + inline static constexpr size_t PEN20_TARGETMON_NAME_LEN = sizeof(PEN20_TARGETMON_NAME_ARR)-1; + inline static constexpr char PEN20_TARGETMON_FQNAME_ARR[] = "pen20:Targetmon"; + inline static constexpr const char* PEN20_TARGETMON_FQNAME = PEN20_TARGETMON_FQNAME_ARR; + inline static constexpr size_t PEN20_TARGETMON_FQNAME_LEN = sizeof(PEN20_TARGETMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_TARGETMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_TARGETMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_TARGETMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_TARGETMON_ANIM_INDEX = 141; + + // Name: Tentomon + inline static constexpr char PEN20_TENTOMON_FQID_ARR[] = "pen20:tentomon"; + inline static constexpr const char* PEN20_TENTOMON_FQID = PEN20_TENTOMON_FQID_ARR; + inline static constexpr size_t PEN20_TENTOMON_FQID_LEN = sizeof(PEN20_TENTOMON_FQID_ARR)-1; + inline static constexpr char PEN20_TENTOMON_ID_ARR[] = "tentomon"; + inline static constexpr const char* PEN20_TENTOMON_ID = PEN20_TENTOMON_ID_ARR; + inline static constexpr size_t PEN20_TENTOMON_ID_LEN = sizeof(PEN20_TENTOMON_ID)-1; + inline static constexpr char PEN20_TENTOMON_NAME_ARR[] = "Tentomon"; + inline static constexpr const char* PEN20_TENTOMON_NAME = PEN20_TENTOMON_NAME_ARR; + inline static constexpr size_t PEN20_TENTOMON_NAME_LEN = sizeof(PEN20_TENTOMON_NAME_ARR)-1; + inline static constexpr char PEN20_TENTOMON_FQNAME_ARR[] = "pen20:Tentomon"; + inline static constexpr const char* PEN20_TENTOMON_FQNAME = PEN20_TENTOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_TENTOMON_FQNAME_LEN = sizeof(PEN20_TENTOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_TENTOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_TENTOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_TENTOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_TENTOMON_ANIM_INDEX = 142; + + // Name: Terriermon + inline static constexpr char PEN20_TERRIERMON_FQID_ARR[] = "pen20:terriermon"; + inline static constexpr const char* PEN20_TERRIERMON_FQID = PEN20_TERRIERMON_FQID_ARR; + inline static constexpr size_t PEN20_TERRIERMON_FQID_LEN = sizeof(PEN20_TERRIERMON_FQID_ARR)-1; + inline static constexpr char PEN20_TERRIERMON_ID_ARR[] = "terriermon"; + inline static constexpr const char* PEN20_TERRIERMON_ID = PEN20_TERRIERMON_ID_ARR; + inline static constexpr size_t PEN20_TERRIERMON_ID_LEN = sizeof(PEN20_TERRIERMON_ID)-1; + inline static constexpr char PEN20_TERRIERMON_NAME_ARR[] = "Terriermon"; + inline static constexpr const char* PEN20_TERRIERMON_NAME = PEN20_TERRIERMON_NAME_ARR; + inline static constexpr size_t PEN20_TERRIERMON_NAME_LEN = sizeof(PEN20_TERRIERMON_NAME_ARR)-1; + inline static constexpr char PEN20_TERRIERMON_FQNAME_ARR[] = "pen20:Terriermon"; + inline static constexpr const char* PEN20_TERRIERMON_FQNAME = PEN20_TERRIERMON_FQNAME_ARR; + inline static constexpr size_t PEN20_TERRIERMON_FQNAME_LEN = sizeof(PEN20_TERRIERMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_TERRIERMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_TERRIERMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_TERRIERMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_TERRIERMON_ANIM_INDEX = 143; + + // Name: Thunderballmon + inline static constexpr char PEN20_THUNDERBALLMON_FQID_ARR[] = "pen20:thunderballmon"; + inline static constexpr const char* PEN20_THUNDERBALLMON_FQID = PEN20_THUNDERBALLMON_FQID_ARR; + inline static constexpr size_t PEN20_THUNDERBALLMON_FQID_LEN = sizeof(PEN20_THUNDERBALLMON_FQID_ARR)-1; + inline static constexpr char PEN20_THUNDERBALLMON_ID_ARR[] = "thunderballmon"; + inline static constexpr const char* PEN20_THUNDERBALLMON_ID = PEN20_THUNDERBALLMON_ID_ARR; + inline static constexpr size_t PEN20_THUNDERBALLMON_ID_LEN = sizeof(PEN20_THUNDERBALLMON_ID)-1; + inline static constexpr char PEN20_THUNDERBALLMON_NAME_ARR[] = "Thunderballmon"; + inline static constexpr const char* PEN20_THUNDERBALLMON_NAME = PEN20_THUNDERBALLMON_NAME_ARR; + inline static constexpr size_t PEN20_THUNDERBALLMON_NAME_LEN = sizeof(PEN20_THUNDERBALLMON_NAME_ARR)-1; + inline static constexpr char PEN20_THUNDERBALLMON_FQNAME_ARR[] = "pen20:Thunderballmon"; + inline static constexpr const char* PEN20_THUNDERBALLMON_FQNAME = PEN20_THUNDERBALLMON_FQNAME_ARR; + inline static constexpr size_t PEN20_THUNDERBALLMON_FQNAME_LEN = sizeof(PEN20_THUNDERBALLMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_THUNDERBALLMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_THUNDERBALLMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_THUNDERBALLMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_THUNDERBALLMON_ANIM_INDEX = 144; + + // Name: Tia Ludomon + inline static constexpr char PEN20_TIA_LUDOMON_FQID_ARR[] = "pen20:tia_ludomon"; + inline static constexpr const char* PEN20_TIA_LUDOMON_FQID = PEN20_TIA_LUDOMON_FQID_ARR; + inline static constexpr size_t PEN20_TIA_LUDOMON_FQID_LEN = sizeof(PEN20_TIA_LUDOMON_FQID_ARR)-1; + inline static constexpr char PEN20_TIA_LUDOMON_ID_ARR[] = "tia_ludomon"; + inline static constexpr const char* PEN20_TIA_LUDOMON_ID = PEN20_TIA_LUDOMON_ID_ARR; + inline static constexpr size_t PEN20_TIA_LUDOMON_ID_LEN = sizeof(PEN20_TIA_LUDOMON_ID)-1; + inline static constexpr char PEN20_TIA_LUDOMON_NAME_ARR[] = "Tia Ludomon"; + inline static constexpr const char* PEN20_TIA_LUDOMON_NAME = PEN20_TIA_LUDOMON_NAME_ARR; + inline static constexpr size_t PEN20_TIA_LUDOMON_NAME_LEN = sizeof(PEN20_TIA_LUDOMON_NAME_ARR)-1; + inline static constexpr char PEN20_TIA_LUDOMON_FQNAME_ARR[] = "pen20:Tia Ludomon"; + inline static constexpr const char* PEN20_TIA_LUDOMON_FQNAME = PEN20_TIA_LUDOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_TIA_LUDOMON_FQNAME_LEN = sizeof(PEN20_TIA_LUDOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_TIA_LUDOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_TIA_LUDOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_TIA_LUDOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_TIA_LUDOMON_ANIM_INDEX = 145; + + // Name: Togemon + inline static constexpr char PEN20_TOGEMON_FQID_ARR[] = "pen20:togemon"; + inline static constexpr const char* PEN20_TOGEMON_FQID = PEN20_TOGEMON_FQID_ARR; + inline static constexpr size_t PEN20_TOGEMON_FQID_LEN = sizeof(PEN20_TOGEMON_FQID_ARR)-1; + inline static constexpr char PEN20_TOGEMON_ID_ARR[] = "togemon"; + inline static constexpr const char* PEN20_TOGEMON_ID = PEN20_TOGEMON_ID_ARR; + inline static constexpr size_t PEN20_TOGEMON_ID_LEN = sizeof(PEN20_TOGEMON_ID)-1; + inline static constexpr char PEN20_TOGEMON_NAME_ARR[] = "Togemon"; + inline static constexpr const char* PEN20_TOGEMON_NAME = PEN20_TOGEMON_NAME_ARR; + inline static constexpr size_t PEN20_TOGEMON_NAME_LEN = sizeof(PEN20_TOGEMON_NAME_ARR)-1; + inline static constexpr char PEN20_TOGEMON_FQNAME_ARR[] = "pen20:Togemon"; + inline static constexpr const char* PEN20_TOGEMON_FQNAME = PEN20_TOGEMON_FQNAME_ARR; + inline static constexpr size_t PEN20_TOGEMON_FQNAME_LEN = sizeof(PEN20_TOGEMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_TOGEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_TOGEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_TOGEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_TOGEMON_ANIM_INDEX = 146; + + // Name: Tonosama Gekomon + inline static constexpr char PEN20_TONOSAMA_GEKOMON_FQID_ARR[] = "pen20:tonosama_gekomon"; + inline static constexpr const char* PEN20_TONOSAMA_GEKOMON_FQID = PEN20_TONOSAMA_GEKOMON_FQID_ARR; + inline static constexpr size_t PEN20_TONOSAMA_GEKOMON_FQID_LEN = sizeof(PEN20_TONOSAMA_GEKOMON_FQID_ARR)-1; + inline static constexpr char PEN20_TONOSAMA_GEKOMON_ID_ARR[] = "tonosama_gekomon"; + inline static constexpr const char* PEN20_TONOSAMA_GEKOMON_ID = PEN20_TONOSAMA_GEKOMON_ID_ARR; + inline static constexpr size_t PEN20_TONOSAMA_GEKOMON_ID_LEN = sizeof(PEN20_TONOSAMA_GEKOMON_ID)-1; + inline static constexpr char PEN20_TONOSAMA_GEKOMON_NAME_ARR[] = "Tonosama Gekomon"; + inline static constexpr const char* PEN20_TONOSAMA_GEKOMON_NAME = PEN20_TONOSAMA_GEKOMON_NAME_ARR; + inline static constexpr size_t PEN20_TONOSAMA_GEKOMON_NAME_LEN = sizeof(PEN20_TONOSAMA_GEKOMON_NAME_ARR)-1; + inline static constexpr char PEN20_TONOSAMA_GEKOMON_FQNAME_ARR[] = "pen20:Tonosama Gekomon"; + inline static constexpr const char* PEN20_TONOSAMA_GEKOMON_FQNAME = PEN20_TONOSAMA_GEKOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_TONOSAMA_GEKOMON_FQNAME_LEN = sizeof(PEN20_TONOSAMA_GEKOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_TONOSAMA_GEKOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_TONOSAMA_GEKOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_TONOSAMA_GEKOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_TONOSAMA_GEKOMON_ANIM_INDEX = 147; + + // Name: Tortamon + inline static constexpr char PEN20_TORTAMON_FQID_ARR[] = "pen20:tortamon"; + inline static constexpr const char* PEN20_TORTAMON_FQID = PEN20_TORTAMON_FQID_ARR; + inline static constexpr size_t PEN20_TORTAMON_FQID_LEN = sizeof(PEN20_TORTAMON_FQID_ARR)-1; + inline static constexpr char PEN20_TORTAMON_ID_ARR[] = "tortamon"; + inline static constexpr const char* PEN20_TORTAMON_ID = PEN20_TORTAMON_ID_ARR; + inline static constexpr size_t PEN20_TORTAMON_ID_LEN = sizeof(PEN20_TORTAMON_ID)-1; + inline static constexpr char PEN20_TORTAMON_NAME_ARR[] = "Tortamon"; + inline static constexpr const char* PEN20_TORTAMON_NAME = PEN20_TORTAMON_NAME_ARR; + inline static constexpr size_t PEN20_TORTAMON_NAME_LEN = sizeof(PEN20_TORTAMON_NAME_ARR)-1; + inline static constexpr char PEN20_TORTAMON_FQNAME_ARR[] = "pen20:Tortamon"; + inline static constexpr const char* PEN20_TORTAMON_FQNAME = PEN20_TORTAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_TORTAMON_FQNAME_LEN = sizeof(PEN20_TORTAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_TORTAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_TORTAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_TORTAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_TORTAMON_ANIM_INDEX = 148; + + // Name: Toy Agumon + inline static constexpr char PEN20_TOY_AGUMON_FQID_ARR[] = "pen20:toy_agumon"; + inline static constexpr const char* PEN20_TOY_AGUMON_FQID = PEN20_TOY_AGUMON_FQID_ARR; + inline static constexpr size_t PEN20_TOY_AGUMON_FQID_LEN = sizeof(PEN20_TOY_AGUMON_FQID_ARR)-1; + inline static constexpr char PEN20_TOY_AGUMON_ID_ARR[] = "toy_agumon"; + inline static constexpr const char* PEN20_TOY_AGUMON_ID = PEN20_TOY_AGUMON_ID_ARR; + inline static constexpr size_t PEN20_TOY_AGUMON_ID_LEN = sizeof(PEN20_TOY_AGUMON_ID)-1; + inline static constexpr char PEN20_TOY_AGUMON_NAME_ARR[] = "Toy Agumon"; + inline static constexpr const char* PEN20_TOY_AGUMON_NAME = PEN20_TOY_AGUMON_NAME_ARR; + inline static constexpr size_t PEN20_TOY_AGUMON_NAME_LEN = sizeof(PEN20_TOY_AGUMON_NAME_ARR)-1; + inline static constexpr char PEN20_TOY_AGUMON_FQNAME_ARR[] = "pen20:Toy Agumon"; + inline static constexpr const char* PEN20_TOY_AGUMON_FQNAME = PEN20_TOY_AGUMON_FQNAME_ARR; + inline static constexpr size_t PEN20_TOY_AGUMON_FQNAME_LEN = sizeof(PEN20_TOY_AGUMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_TOY_AGUMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_TOY_AGUMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_TOY_AGUMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_TOY_AGUMON_ANIM_INDEX = 149; + + // Name: Triceramon + inline static constexpr char PEN20_TRICERAMON_FQID_ARR[] = "pen20:triceramon"; + inline static constexpr const char* PEN20_TRICERAMON_FQID = PEN20_TRICERAMON_FQID_ARR; + inline static constexpr size_t PEN20_TRICERAMON_FQID_LEN = sizeof(PEN20_TRICERAMON_FQID_ARR)-1; + inline static constexpr char PEN20_TRICERAMON_ID_ARR[] = "triceramon"; + inline static constexpr const char* PEN20_TRICERAMON_ID = PEN20_TRICERAMON_ID_ARR; + inline static constexpr size_t PEN20_TRICERAMON_ID_LEN = sizeof(PEN20_TRICERAMON_ID)-1; + inline static constexpr char PEN20_TRICERAMON_NAME_ARR[] = "Triceramon"; + inline static constexpr const char* PEN20_TRICERAMON_NAME = PEN20_TRICERAMON_NAME_ARR; + inline static constexpr size_t PEN20_TRICERAMON_NAME_LEN = sizeof(PEN20_TRICERAMON_NAME_ARR)-1; + inline static constexpr char PEN20_TRICERAMON_FQNAME_ARR[] = "pen20:Triceramon"; + inline static constexpr const char* PEN20_TRICERAMON_FQNAME = PEN20_TRICERAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_TRICERAMON_FQNAME_LEN = sizeof(PEN20_TRICERAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_TRICERAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_TRICERAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_TRICERAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_TRICERAMON_ANIM_INDEX = 150; + + // Name: Troopmon + inline static constexpr char PEN20_TROOPMON_FQID_ARR[] = "pen20:troopmon"; + inline static constexpr const char* PEN20_TROOPMON_FQID = PEN20_TROOPMON_FQID_ARR; + inline static constexpr size_t PEN20_TROOPMON_FQID_LEN = sizeof(PEN20_TROOPMON_FQID_ARR)-1; + inline static constexpr char PEN20_TROOPMON_ID_ARR[] = "troopmon"; + inline static constexpr const char* PEN20_TROOPMON_ID = PEN20_TROOPMON_ID_ARR; + inline static constexpr size_t PEN20_TROOPMON_ID_LEN = sizeof(PEN20_TROOPMON_ID)-1; + inline static constexpr char PEN20_TROOPMON_NAME_ARR[] = "Troopmon"; + inline static constexpr const char* PEN20_TROOPMON_NAME = PEN20_TROOPMON_NAME_ARR; + inline static constexpr size_t PEN20_TROOPMON_NAME_LEN = sizeof(PEN20_TROOPMON_NAME_ARR)-1; + inline static constexpr char PEN20_TROOPMON_FQNAME_ARR[] = "pen20:Troopmon"; + inline static constexpr const char* PEN20_TROOPMON_FQNAME = PEN20_TROOPMON_FQNAME_ARR; + inline static constexpr size_t PEN20_TROOPMON_FQNAME_LEN = sizeof(PEN20_TROOPMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_TROOPMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_TROOPMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_TROOPMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_TROOPMON_ANIM_INDEX = 151; + + // Name: Turuiemon + inline static constexpr char PEN20_TURUIEMON_FQID_ARR[] = "pen20:turuiemon"; + inline static constexpr const char* PEN20_TURUIEMON_FQID = PEN20_TURUIEMON_FQID_ARR; + inline static constexpr size_t PEN20_TURUIEMON_FQID_LEN = sizeof(PEN20_TURUIEMON_FQID_ARR)-1; + inline static constexpr char PEN20_TURUIEMON_ID_ARR[] = "turuiemon"; + inline static constexpr const char* PEN20_TURUIEMON_ID = PEN20_TURUIEMON_ID_ARR; + inline static constexpr size_t PEN20_TURUIEMON_ID_LEN = sizeof(PEN20_TURUIEMON_ID)-1; + inline static constexpr char PEN20_TURUIEMON_NAME_ARR[] = "Turuiemon"; + inline static constexpr const char* PEN20_TURUIEMON_NAME = PEN20_TURUIEMON_NAME_ARR; + inline static constexpr size_t PEN20_TURUIEMON_NAME_LEN = sizeof(PEN20_TURUIEMON_NAME_ARR)-1; + inline static constexpr char PEN20_TURUIEMON_FQNAME_ARR[] = "pen20:Turuiemon"; + inline static constexpr const char* PEN20_TURUIEMON_FQNAME = PEN20_TURUIEMON_FQNAME_ARR; + inline static constexpr size_t PEN20_TURUIEMON_FQNAME_LEN = sizeof(PEN20_TURUIEMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_TURUIEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_TURUIEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_TURUIEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_TURUIEMON_ANIM_INDEX = 152; + + // Name: V-dramon + inline static constexpr char PEN20_V_DRAMON_FQID_ARR[] = "pen20:v_dramon"; + inline static constexpr const char* PEN20_V_DRAMON_FQID = PEN20_V_DRAMON_FQID_ARR; + inline static constexpr size_t PEN20_V_DRAMON_FQID_LEN = sizeof(PEN20_V_DRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_V_DRAMON_ID_ARR[] = "v_dramon"; + inline static constexpr const char* PEN20_V_DRAMON_ID = PEN20_V_DRAMON_ID_ARR; + inline static constexpr size_t PEN20_V_DRAMON_ID_LEN = sizeof(PEN20_V_DRAMON_ID)-1; + inline static constexpr char PEN20_V_DRAMON_NAME_ARR[] = "V-dramon"; + inline static constexpr const char* PEN20_V_DRAMON_NAME = PEN20_V_DRAMON_NAME_ARR; + inline static constexpr size_t PEN20_V_DRAMON_NAME_LEN = sizeof(PEN20_V_DRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_V_DRAMON_FQNAME_ARR[] = "pen20:V-dramon"; + inline static constexpr const char* PEN20_V_DRAMON_FQNAME = PEN20_V_DRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_V_DRAMON_FQNAME_LEN = sizeof(PEN20_V_DRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_V_DRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_V_DRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_V_DRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_V_DRAMON_ANIM_INDEX = 153; + + // Name: Vemdemon + inline static constexpr char PEN20_VEMDEMON_FQID_ARR[] = "pen20:vemdemon"; + inline static constexpr const char* PEN20_VEMDEMON_FQID = PEN20_VEMDEMON_FQID_ARR; + inline static constexpr size_t PEN20_VEMDEMON_FQID_LEN = sizeof(PEN20_VEMDEMON_FQID_ARR)-1; + inline static constexpr char PEN20_VEMDEMON_ID_ARR[] = "vemdemon"; + inline static constexpr const char* PEN20_VEMDEMON_ID = PEN20_VEMDEMON_ID_ARR; + inline static constexpr size_t PEN20_VEMDEMON_ID_LEN = sizeof(PEN20_VEMDEMON_ID)-1; + inline static constexpr char PEN20_VEMDEMON_NAME_ARR[] = "Vemdemon"; + inline static constexpr const char* PEN20_VEMDEMON_NAME = PEN20_VEMDEMON_NAME_ARR; + inline static constexpr size_t PEN20_VEMDEMON_NAME_LEN = sizeof(PEN20_VEMDEMON_NAME_ARR)-1; + inline static constexpr char PEN20_VEMDEMON_FQNAME_ARR[] = "pen20:Vemdemon"; + inline static constexpr const char* PEN20_VEMDEMON_FQNAME = PEN20_VEMDEMON_FQNAME_ARR; + inline static constexpr size_t PEN20_VEMDEMON_FQNAME_LEN = sizeof(PEN20_VEMDEMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_VEMDEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_VEMDEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_VEMDEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_VEMDEMON_ANIM_INDEX = 154; + + // Name: Venom Vamdemon + inline static constexpr char PEN20_VENOM_VAMDEMON_FQID_ARR[] = "pen20:venom_vamdemon"; + inline static constexpr const char* PEN20_VENOM_VAMDEMON_FQID = PEN20_VENOM_VAMDEMON_FQID_ARR; + inline static constexpr size_t PEN20_VENOM_VAMDEMON_FQID_LEN = sizeof(PEN20_VENOM_VAMDEMON_FQID_ARR)-1; + inline static constexpr char PEN20_VENOM_VAMDEMON_ID_ARR[] = "venom_vamdemon"; + inline static constexpr const char* PEN20_VENOM_VAMDEMON_ID = PEN20_VENOM_VAMDEMON_ID_ARR; + inline static constexpr size_t PEN20_VENOM_VAMDEMON_ID_LEN = sizeof(PEN20_VENOM_VAMDEMON_ID)-1; + inline static constexpr char PEN20_VENOM_VAMDEMON_NAME_ARR[] = "Venom Vamdemon"; + inline static constexpr const char* PEN20_VENOM_VAMDEMON_NAME = PEN20_VENOM_VAMDEMON_NAME_ARR; + inline static constexpr size_t PEN20_VENOM_VAMDEMON_NAME_LEN = sizeof(PEN20_VENOM_VAMDEMON_NAME_ARR)-1; + inline static constexpr char PEN20_VENOM_VAMDEMON_FQNAME_ARR[] = "pen20:Venom Vamdemon"; + inline static constexpr const char* PEN20_VENOM_VAMDEMON_FQNAME = PEN20_VENOM_VAMDEMON_FQNAME_ARR; + inline static constexpr size_t PEN20_VENOM_VAMDEMON_FQNAME_LEN = sizeof(PEN20_VENOM_VAMDEMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_VENOM_VAMDEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_VENOM_VAMDEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_VENOM_VAMDEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_VENOM_VAMDEMON_ANIM_INDEX = 155; + + // Name: V-mon + inline static constexpr char PEN20_V_MON_FQID_ARR[] = "pen20:v_mon"; + inline static constexpr const char* PEN20_V_MON_FQID = PEN20_V_MON_FQID_ARR; + inline static constexpr size_t PEN20_V_MON_FQID_LEN = sizeof(PEN20_V_MON_FQID_ARR)-1; + inline static constexpr char PEN20_V_MON_ID_ARR[] = "v_mon"; + inline static constexpr const char* PEN20_V_MON_ID = PEN20_V_MON_ID_ARR; + inline static constexpr size_t PEN20_V_MON_ID_LEN = sizeof(PEN20_V_MON_ID)-1; + inline static constexpr char PEN20_V_MON_NAME_ARR[] = "V-mon"; + inline static constexpr const char* PEN20_V_MON_NAME = PEN20_V_MON_NAME_ARR; + inline static constexpr size_t PEN20_V_MON_NAME_LEN = sizeof(PEN20_V_MON_NAME_ARR)-1; + inline static constexpr char PEN20_V_MON_FQNAME_ARR[] = "pen20:V-mon"; + inline static constexpr const char* PEN20_V_MON_FQNAME = PEN20_V_MON_FQNAME_ARR; + inline static constexpr size_t PEN20_V_MON_FQNAME_LEN = sizeof(PEN20_V_MON_FQNAME_ARR)-1; + inline static constexpr int PEN20_V_MON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_V_MON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_V_MON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_V_MON_ANIM_INDEX = 156; + + // Name: Volcanicdramon + inline static constexpr char PEN20_VOLCANICDRAMON_FQID_ARR[] = "pen20:volcanicdramon"; + inline static constexpr const char* PEN20_VOLCANICDRAMON_FQID = PEN20_VOLCANICDRAMON_FQID_ARR; + inline static constexpr size_t PEN20_VOLCANICDRAMON_FQID_LEN = sizeof(PEN20_VOLCANICDRAMON_FQID_ARR)-1; + inline static constexpr char PEN20_VOLCANICDRAMON_ID_ARR[] = "volcanicdramon"; + inline static constexpr const char* PEN20_VOLCANICDRAMON_ID = PEN20_VOLCANICDRAMON_ID_ARR; + inline static constexpr size_t PEN20_VOLCANICDRAMON_ID_LEN = sizeof(PEN20_VOLCANICDRAMON_ID)-1; + inline static constexpr char PEN20_VOLCANICDRAMON_NAME_ARR[] = "Volcanicdramon"; + inline static constexpr const char* PEN20_VOLCANICDRAMON_NAME = PEN20_VOLCANICDRAMON_NAME_ARR; + inline static constexpr size_t PEN20_VOLCANICDRAMON_NAME_LEN = sizeof(PEN20_VOLCANICDRAMON_NAME_ARR)-1; + inline static constexpr char PEN20_VOLCANICDRAMON_FQNAME_ARR[] = "pen20:Volcanicdramon"; + inline static constexpr const char* PEN20_VOLCANICDRAMON_FQNAME = PEN20_VOLCANICDRAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_VOLCANICDRAMON_FQNAME_LEN = sizeof(PEN20_VOLCANICDRAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_VOLCANICDRAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_VOLCANICDRAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_VOLCANICDRAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_VOLCANICDRAMON_ANIM_INDEX = 157; + + // Name: Voltobautamon + inline static constexpr char PEN20_VOLTOBAUTAMON_FQID_ARR[] = "pen20:voltobautamon"; + inline static constexpr const char* PEN20_VOLTOBAUTAMON_FQID = PEN20_VOLTOBAUTAMON_FQID_ARR; + inline static constexpr size_t PEN20_VOLTOBAUTAMON_FQID_LEN = sizeof(PEN20_VOLTOBAUTAMON_FQID_ARR)-1; + inline static constexpr char PEN20_VOLTOBAUTAMON_ID_ARR[] = "voltobautamon"; + inline static constexpr const char* PEN20_VOLTOBAUTAMON_ID = PEN20_VOLTOBAUTAMON_ID_ARR; + inline static constexpr size_t PEN20_VOLTOBAUTAMON_ID_LEN = sizeof(PEN20_VOLTOBAUTAMON_ID)-1; + inline static constexpr char PEN20_VOLTOBAUTAMON_NAME_ARR[] = "Voltobautamon"; + inline static constexpr const char* PEN20_VOLTOBAUTAMON_NAME = PEN20_VOLTOBAUTAMON_NAME_ARR; + inline static constexpr size_t PEN20_VOLTOBAUTAMON_NAME_LEN = sizeof(PEN20_VOLTOBAUTAMON_NAME_ARR)-1; + inline static constexpr char PEN20_VOLTOBAUTAMON_FQNAME_ARR[] = "pen20:Voltobautamon"; + inline static constexpr const char* PEN20_VOLTOBAUTAMON_FQNAME = PEN20_VOLTOBAUTAMON_FQNAME_ARR; + inline static constexpr size_t PEN20_VOLTOBAUTAMON_FQNAME_LEN = sizeof(PEN20_VOLTOBAUTAMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_VOLTOBAUTAMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_VOLTOBAUTAMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_VOLTOBAUTAMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_VOLTOBAUTAMON_ANIM_INDEX = 158; + + // Name: Vorvomon + inline static constexpr char PEN20_VORVOMON_FQID_ARR[] = "pen20:vorvomon"; + inline static constexpr const char* PEN20_VORVOMON_FQID = PEN20_VORVOMON_FQID_ARR; + inline static constexpr size_t PEN20_VORVOMON_FQID_LEN = sizeof(PEN20_VORVOMON_FQID_ARR)-1; + inline static constexpr char PEN20_VORVOMON_ID_ARR[] = "vorvomon"; + inline static constexpr const char* PEN20_VORVOMON_ID = PEN20_VORVOMON_ID_ARR; + inline static constexpr size_t PEN20_VORVOMON_ID_LEN = sizeof(PEN20_VORVOMON_ID)-1; + inline static constexpr char PEN20_VORVOMON_NAME_ARR[] = "Vorvomon"; + inline static constexpr const char* PEN20_VORVOMON_NAME = PEN20_VORVOMON_NAME_ARR; + inline static constexpr size_t PEN20_VORVOMON_NAME_LEN = sizeof(PEN20_VORVOMON_NAME_ARR)-1; + inline static constexpr char PEN20_VORVOMON_FQNAME_ARR[] = "pen20:Vorvomon"; + inline static constexpr const char* PEN20_VORVOMON_FQNAME = PEN20_VORVOMON_FQNAME_ARR; + inline static constexpr size_t PEN20_VORVOMON_FQNAME_LEN = sizeof(PEN20_VORVOMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_VORVOMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_VORVOMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_VORVOMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_VORVOMON_ANIM_INDEX = 159; + + // Name: Waru Mozaemon + inline static constexpr char PEN20_WARU_MOZAEMON_FQID_ARR[] = "pen20:waru_mozaemon"; + inline static constexpr const char* PEN20_WARU_MOZAEMON_FQID = PEN20_WARU_MOZAEMON_FQID_ARR; + inline static constexpr size_t PEN20_WARU_MOZAEMON_FQID_LEN = sizeof(PEN20_WARU_MOZAEMON_FQID_ARR)-1; + inline static constexpr char PEN20_WARU_MOZAEMON_ID_ARR[] = "waru_mozaemon"; + inline static constexpr const char* PEN20_WARU_MOZAEMON_ID = PEN20_WARU_MOZAEMON_ID_ARR; + inline static constexpr size_t PEN20_WARU_MOZAEMON_ID_LEN = sizeof(PEN20_WARU_MOZAEMON_ID)-1; + inline static constexpr char PEN20_WARU_MOZAEMON_NAME_ARR[] = "Waru Mozaemon"; + inline static constexpr const char* PEN20_WARU_MOZAEMON_NAME = PEN20_WARU_MOZAEMON_NAME_ARR; + inline static constexpr size_t PEN20_WARU_MOZAEMON_NAME_LEN = sizeof(PEN20_WARU_MOZAEMON_NAME_ARR)-1; + inline static constexpr char PEN20_WARU_MOZAEMON_FQNAME_ARR[] = "pen20:Waru Mozaemon"; + inline static constexpr const char* PEN20_WARU_MOZAEMON_FQNAME = PEN20_WARU_MOZAEMON_FQNAME_ARR; + inline static constexpr size_t PEN20_WARU_MOZAEMON_FQNAME_LEN = sizeof(PEN20_WARU_MOZAEMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_WARU_MOZAEMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_WARU_MOZAEMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_WARU_MOZAEMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_WARU_MOZAEMON_ANIM_INDEX = 160; + + // Name: Wizarmon + inline static constexpr char PEN20_WIZARMON_FQID_ARR[] = "pen20:wizarmon"; + inline static constexpr const char* PEN20_WIZARMON_FQID = PEN20_WIZARMON_FQID_ARR; + inline static constexpr size_t PEN20_WIZARMON_FQID_LEN = sizeof(PEN20_WIZARMON_FQID_ARR)-1; + inline static constexpr char PEN20_WIZARMON_ID_ARR[] = "wizarmon"; + inline static constexpr const char* PEN20_WIZARMON_ID = PEN20_WIZARMON_ID_ARR; + inline static constexpr size_t PEN20_WIZARMON_ID_LEN = sizeof(PEN20_WIZARMON_ID)-1; + inline static constexpr char PEN20_WIZARMON_NAME_ARR[] = "Wizarmon"; + inline static constexpr const char* PEN20_WIZARMON_NAME = PEN20_WIZARMON_NAME_ARR; + inline static constexpr size_t PEN20_WIZARMON_NAME_LEN = sizeof(PEN20_WIZARMON_NAME_ARR)-1; + inline static constexpr char PEN20_WIZARMON_FQNAME_ARR[] = "pen20:Wizarmon"; + inline static constexpr const char* PEN20_WIZARMON_FQNAME = PEN20_WIZARMON_FQNAME_ARR; + inline static constexpr size_t PEN20_WIZARMON_FQNAME_LEN = sizeof(PEN20_WIZARMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_WIZARMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_WIZARMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_WIZARMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_WIZARMON_ANIM_INDEX = 161; + + // Name: Woodmon + inline static constexpr char PEN20_WOODMON_FQID_ARR[] = "pen20:woodmon"; + inline static constexpr const char* PEN20_WOODMON_FQID = PEN20_WOODMON_FQID_ARR; + inline static constexpr size_t PEN20_WOODMON_FQID_LEN = sizeof(PEN20_WOODMON_FQID_ARR)-1; + inline static constexpr char PEN20_WOODMON_ID_ARR[] = "woodmon"; + inline static constexpr const char* PEN20_WOODMON_ID = PEN20_WOODMON_ID_ARR; + inline static constexpr size_t PEN20_WOODMON_ID_LEN = sizeof(PEN20_WOODMON_ID)-1; + inline static constexpr char PEN20_WOODMON_NAME_ARR[] = "Woodmon"; + inline static constexpr const char* PEN20_WOODMON_NAME = PEN20_WOODMON_NAME_ARR; + inline static constexpr size_t PEN20_WOODMON_NAME_LEN = sizeof(PEN20_WOODMON_NAME_ARR)-1; + inline static constexpr char PEN20_WOODMON_FQNAME_ARR[] = "pen20:Woodmon"; + inline static constexpr const char* PEN20_WOODMON_FQNAME = PEN20_WOODMON_FQNAME_ARR; + inline static constexpr size_t PEN20_WOODMON_FQNAME_LEN = sizeof(PEN20_WOODMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_WOODMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_WOODMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_WOODMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_WOODMON_ANIM_INDEX = 162; + + // Name: XV-mon + inline static constexpr char PEN20_XV_MON_FQID_ARR[] = "pen20:xv_mon"; + inline static constexpr const char* PEN20_XV_MON_FQID = PEN20_XV_MON_FQID_ARR; + inline static constexpr size_t PEN20_XV_MON_FQID_LEN = sizeof(PEN20_XV_MON_FQID_ARR)-1; + inline static constexpr char PEN20_XV_MON_ID_ARR[] = "xv_mon"; + inline static constexpr const char* PEN20_XV_MON_ID = PEN20_XV_MON_ID_ARR; + inline static constexpr size_t PEN20_XV_MON_ID_LEN = sizeof(PEN20_XV_MON_ID)-1; + inline static constexpr char PEN20_XV_MON_NAME_ARR[] = "XV-mon"; + inline static constexpr const char* PEN20_XV_MON_NAME = PEN20_XV_MON_NAME_ARR; + inline static constexpr size_t PEN20_XV_MON_NAME_LEN = sizeof(PEN20_XV_MON_NAME_ARR)-1; + inline static constexpr char PEN20_XV_MON_FQNAME_ARR[] = "pen20:XV-mon"; + inline static constexpr const char* PEN20_XV_MON_FQNAME = PEN20_XV_MON_FQNAME_ARR; + inline static constexpr size_t PEN20_XV_MON_FQNAME_LEN = sizeof(PEN20_XV_MON_FQNAME_ARR)-1; + inline static constexpr int PEN20_XV_MON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_XV_MON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_XV_MON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_XV_MON_ANIM_INDEX = 163; + + // Name: Zerimon + inline static constexpr char PEN20_ZERIMON_FQID_ARR[] = "pen20:zerimon"; + inline static constexpr const char* PEN20_ZERIMON_FQID = PEN20_ZERIMON_FQID_ARR; + inline static constexpr size_t PEN20_ZERIMON_FQID_LEN = sizeof(PEN20_ZERIMON_FQID_ARR)-1; + inline static constexpr char PEN20_ZERIMON_ID_ARR[] = "zerimon"; + inline static constexpr const char* PEN20_ZERIMON_ID = PEN20_ZERIMON_ID_ARR; + inline static constexpr size_t PEN20_ZERIMON_ID_LEN = sizeof(PEN20_ZERIMON_ID)-1; + inline static constexpr char PEN20_ZERIMON_NAME_ARR[] = "Zerimon"; + inline static constexpr const char* PEN20_ZERIMON_NAME = PEN20_ZERIMON_NAME_ARR; + inline static constexpr size_t PEN20_ZERIMON_NAME_LEN = sizeof(PEN20_ZERIMON_NAME_ARR)-1; + inline static constexpr char PEN20_ZERIMON_FQNAME_ARR[] = "pen20:Zerimon"; + inline static constexpr const char* PEN20_ZERIMON_FQNAME = PEN20_ZERIMON_FQNAME_ARR; + inline static constexpr size_t PEN20_ZERIMON_FQNAME_LEN = sizeof(PEN20_ZERIMON_FQNAME_ARR)-1; + inline static constexpr int PEN20_ZERIMON_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_ZERIMON_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_ZERIMON_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_ZERIMON_ANIM_INDEX = 164; + + // Name: Zudomom + inline static constexpr char PEN20_ZUDOMOM_FQID_ARR[] = "pen20:zudomom"; + inline static constexpr const char* PEN20_ZUDOMOM_FQID = PEN20_ZUDOMOM_FQID_ARR; + inline static constexpr size_t PEN20_ZUDOMOM_FQID_LEN = sizeof(PEN20_ZUDOMOM_FQID_ARR)-1; + inline static constexpr char PEN20_ZUDOMOM_ID_ARR[] = "zudomom"; + inline static constexpr const char* PEN20_ZUDOMOM_ID = PEN20_ZUDOMOM_ID_ARR; + inline static constexpr size_t PEN20_ZUDOMOM_ID_LEN = sizeof(PEN20_ZUDOMOM_ID)-1; + inline static constexpr char PEN20_ZUDOMOM_NAME_ARR[] = "Zudomom"; + inline static constexpr const char* PEN20_ZUDOMOM_NAME = PEN20_ZUDOMOM_NAME_ARR; + inline static constexpr size_t PEN20_ZUDOMOM_NAME_LEN = sizeof(PEN20_ZUDOMOM_NAME_ARR)-1; + inline static constexpr char PEN20_ZUDOMOM_FQNAME_ARR[] = "pen20:Zudomom"; + inline static constexpr const char* PEN20_ZUDOMOM_FQNAME = PEN20_ZUDOMOM_FQNAME_ARR; + inline static constexpr size_t PEN20_ZUDOMOM_FQNAME_LEN = sizeof(PEN20_ZUDOMOM_FQNAME_ARR)-1; + inline static constexpr int PEN20_ZUDOMOM_SPRITE_SHEET_COLS = 13; + inline static constexpr int PEN20_ZUDOMOM_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t PEN20_ZUDOMOM_SPRITE_SHEET_FRAMES_COUNT = 13; + inline static constexpr size_t PEN20_ZUDOMOM_ANIM_INDEX = 165; + + inline static constexpr size_t PEN20_ANIM_COUNT = 166; +} + +#endif // BONGOCAT_EMBEDDED_ASSETS_PEN20_HPP + diff --git a/include/embedded_assets/pen20/pen20_images.h b/include/embedded_assets/pen20/pen20_images.h new file mode 100644 index 00000000..b5d0e357 --- /dev/null +++ b/include/embedded_assets/pen20/pen20_images.h @@ -0,0 +1,674 @@ +#ifndef BONGOCAT_EMBEDDED_ASSETS_PEN20_H +#define BONGOCAT_EMBEDDED_ASSETS_PEN20_H + +#include + +/// @NOTE: Generated embedded assets from assets/pen20 + +// Name: Aero V-dramon +extern const unsigned char pen20_aero_v_dramon_png[]; +extern const size_t pen20_aero_v_dramon_png_size; + +// Name: Agumon Hakase +extern const unsigned char pen20_agumon_hakase_png[]; +extern const size_t pen20_agumon_hakase_png_size; + +// Name: Alphamon Ouryuken +extern const unsigned char pen20_alphamon_ouryuken_png[]; +extern const size_t pen20_alphamon_ouryuken_png_size; + +// Name: Andiramon +extern const unsigned char pen20_andiramon_png[]; +extern const size_t pen20_andiramon_png_size; + +// Name: Angewomon +extern const unsigned char pen20_angewomon_png[]; +extern const size_t pen20_angewomon_png_size; + +// Name: Anomalocarimon +extern const unsigned char pen20_anomalocarimon_png[]; +extern const size_t pen20_anomalocarimon_png_size; + +// Name: Arresterdramon +extern const unsigned char pen20_arresterdramon_png[]; +extern const size_t pen20_arresterdramon_png_size; + +// Name: Astramon +extern const unsigned char pen20_astramon_png[]; +extern const size_t pen20_astramon_png_size; + +// Name: Asuramon +extern const unsigned char pen20_asuramon_png[]; +extern const size_t pen20_asuramon_png_size; + +// Name: Atlur Kabuterimon +extern const unsigned char pen20_atlur_kabuterimon_png[]; +extern const size_t pen20_atlur_kabuterimon_png_size; + +// Name: Baalmon +extern const unsigned char pen20_baalmon_png[]; +extern const size_t pen20_baalmon_png_size; + +// Name: Bakumon +extern const unsigned char pen20_bakumon_png[]; +extern const size_t pen20_bakumon_png_size; + +// Name: Bancho Leomon +extern const unsigned char pen20_bancho_leomon_png[]; +extern const size_t pen20_bancho_leomon_png_size; + +// Name: Beelzebumon Blast Mode +extern const unsigned char pen20_beelzebumon_blast_mode_png[]; +extern const size_t pen20_beelzebumon_blast_mode_png_size; + +// Name: Beowulfmon +extern const unsigned char pen20_beowulfmon_png[]; +extern const size_t pen20_beowulfmon_png_size; + +// Name: Big Mamemon +extern const unsigned char pen20_big_mamemon_png[]; +extern const size_t pen20_big_mamemon_png_size; + +// Name: Blossomon +extern const unsigned char pen20_blossomon_png[]; +extern const size_t pen20_blossomon_png_size; + +// Name: Boltmon +extern const unsigned char pen20_boltmon_png[]; +extern const size_t pen20_boltmon_png_size; + +// Name: Bryweludramon +extern const unsigned char pen20_bryweludramon_png[]; +extern const size_t pen20_bryweludramon_png_size; + +// Name: Bubbmon +extern const unsigned char pen20_bubbmon_png[]; +extern const size_t pen20_bubbmon_png_size; + +// Name: Budmon +extern const unsigned char pen20_budmon_png[]; +extern const size_t pen20_budmon_png_size; + +// Name: Bushi Agumon +extern const unsigned char pen20_bushi_agumon_png[]; +extern const size_t pen20_bushi_agumon_png_size; + +// Name: Candmon +extern const unsigned char pen20_candmon_png[]; +extern const size_t pen20_candmon_png_size; + +// Name: Caprimon +extern const unsigned char pen20_caprimon_png[]; +extern const size_t pen20_caprimon_png_size; + +// Name: Chaosmon +extern const unsigned char pen20_chaosmon_png[]; +extern const size_t pen20_chaosmon_png_size; + +// Name: Cherubimon +extern const unsigned char pen20_cherubimon_png[]; +extern const size_t pen20_cherubimon_png_size; + +// Name: Chibimon +extern const unsigned char pen20_chibimon_png[]; +extern const size_t pen20_chibimon_png_size; + +// Name: Chicomon +extern const unsigned char pen20_chicomon_png[]; +extern const size_t pen20_chicomon_png_size; + +// Name: Choromon +extern const unsigned char pen20_choromon_png[]; +extern const size_t pen20_choromon_png_size; + +// Name: Clockmon +extern const unsigned char pen20_clockmon_png[]; +extern const size_t pen20_clockmon_png_size; + +// Name: Cocomon +extern const unsigned char pen20_cocomon_png[]; +extern const size_t pen20_cocomon_png_size; + +// Name: Cotsucomon +extern const unsigned char pen20_cotsucomon_png[]; +extern const size_t pen20_cotsucomon_png_size; + +// Name: Cyberdramon +extern const unsigned char pen20_cyberdramon_png[]; +extern const size_t pen20_cyberdramon_png_size; + +// Name: Dagomon +extern const unsigned char pen20_dagomon_png[]; +extern const size_t pen20_dagomon_png_size; + +// Name: Darkdramon +extern const unsigned char pen20_darkdramon_png[]; +extern const size_t pen20_darkdramon_png_size; + +// Name: Dark Knightmon +extern const unsigned char pen20_dark_knightmon_png[]; +extern const size_t pen20_dark_knightmon_png_size; + +// Name: Death Meramon +extern const unsigned char pen20_death_meramon_png[]; +extern const size_t pen20_death_meramon_png_size; + +// Name: Delumon +extern const unsigned char pen20_delumon_png[]; +extern const size_t pen20_delumon_png_size; + +// Name: Dokugumon +extern const unsigned char pen20_dokugumon_png[]; +extern const size_t pen20_dokugumon_png_size; + +// Name: DORUgoramon +extern const unsigned char pen20_dorugoramon_png[]; +extern const size_t pen20_dorugoramon_png_size; + +// Name: Ebidramon +extern const unsigned char pen20_ebidramon_png[]; +extern const size_t pen20_ebidramon_png_size; + +// Name: Fantomon +extern const unsigned char pen20_fantomon_png[]; +extern const size_t pen20_fantomon_png_size; + +// Name: Floramon +extern const unsigned char pen20_floramon_png[]; +extern const size_t pen20_floramon_png_size; + +// Name: Fufumon +extern const unsigned char pen20_fufumon_png[]; +extern const size_t pen20_fufumon_png_size; + +// Name: Galgomon +extern const unsigned char pen20_galgomon_png[]; +extern const size_t pen20_galgomon_png_size; + +// Name: Ganimon +extern const unsigned char pen20_ganimon_png[]; +extern const size_t pen20_ganimon_png_size; + +// Name: Garudamon +extern const unsigned char pen20_garudamon_png[]; +extern const size_t pen20_garudamon_png_size; + +// Name: Gekomon +extern const unsigned char pen20_gekomon_png[]; +extern const size_t pen20_gekomon_png_size; + +// Name: Gerbemon +extern const unsigned char pen20_gerbemon_png[]; +extern const size_t pen20_gerbemon_png_size; + +// Name: Gesomon +extern const unsigned char pen20_gesomon_png[]; +extern const size_t pen20_gesomon_png_size; + +// Name: Ginryumon +extern const unsigned char pen20_ginryumon_png[]; +extern const size_t pen20_ginryumon_png_size; + +// Name: Gomamon +extern const unsigned char pen20_gomamon_png[]; +extern const size_t pen20_gomamon_png_size; + +// Name: Gottsumon +extern const unsigned char pen20_gottsumon_png[]; +extern const size_t pen20_gottsumon_png_size; + +// Name: Griffomon +extern const unsigned char pen20_griffomon_png[]; +extern const size_t pen20_griffomon_png_size; + +// Name: Growmon +extern const unsigned char pen20_growmon_png[]; +extern const size_t pen20_growmon_png_size; + +// Name: Guardromon +extern const unsigned char pen20_guardromon_png[]; +extern const size_t pen20_guardromon_png_size; + +// Name: Guimon +extern const unsigned char pen20_guimon_png[]; +extern const size_t pen20_guimon_png_size; + +// Name: Gummymon +extern const unsigned char pen20_gummymon_png[]; +extern const size_t pen20_gummymon_png_size; + +// Name: Hagurumon +extern const unsigned char pen20_hagurumon_png[]; +extern const size_t pen20_hagurumon_png_size; + +// Name: Hangymon +extern const unsigned char pen20_hangymon_png[]; +extern const size_t pen20_hangymon_png_size; + +// Name: Hanumon +extern const unsigned char pen20_hanumon_png[]; +extern const size_t pen20_hanumon_png_size; + +// Name: Herkule Kabuterimon +extern const unsigned char pen20_herkule_kabuterimon_png[]; +extern const size_t pen20_herkule_kabuterimon_png_size; + +// Name: Hisyaryumon +extern const unsigned char pen20_hisyaryumon_png[]; +extern const size_t pen20_hisyaryumon_png_size; + +// Name: Holy Angemon +extern const unsigned char pen20_holy_angemon_png[]; +extern const size_t pen20_holy_angemon_png_size; + +// Name: Holydramon +extern const unsigned char pen20_holydramon_png[]; +extern const size_t pen20_holydramon_png_size; + +// Name: Hououmon +extern const unsigned char pen20_hououmon_png[]; +extern const size_t pen20_hououmon_png_size; + +// Name: Ignamon +extern const unsigned char pen20_ignamon_png[]; +extern const size_t pen20_ignamon_png_size; + +// Name: Ikkakumon +extern const unsigned char pen20_ikkakumon_png[]; +extern const size_t pen20_ikkakumon_png_size; + +// Name: Imperialdramon Fighter Mode +extern const unsigned char pen20_imperialdramon_fighter_mode_png[]; +extern const size_t pen20_imperialdramon_fighter_mode_png_size; + +// Name: Impmon +extern const unsigned char pen20_impmon_png[]; +extern const size_t pen20_impmon_png_size; + +// Name: Jesmon X +extern const unsigned char pen20_jesmon_x_png[]; +extern const size_t pen20_jesmon_x_png_size; + +// Name: Jyagamon +extern const unsigned char pen20_jyagamon_png[]; +extern const size_t pen20_jyagamon_png_size; + +// Name: Jyureimon +extern const unsigned char pen20_jyureimon_png[]; +extern const size_t pen20_jyureimon_png_size; + +// Name: Kakkinmon +extern const unsigned char pen20_kakkinmon_png[]; +extern const size_t pen20_kakkinmon_png_size; + +// Name: Kiwimon +extern const unsigned char pen20_kiwimon_png[]; +extern const size_t pen20_kiwimon_png_size; + +// Name: Knightmon +extern const unsigned char pen20_knightmon_png[]; +extern const size_t pen20_knightmon_png_size; + +// Name: Kokuwamon +extern const unsigned char pen20_kokuwamon_png[]; +extern const size_t pen20_kokuwamon_png_size; + +// Name: Kyokyomon +extern const unsigned char pen20_kyokyomon_png[]; +extern const size_t pen20_kyokyomon_png_size; + +// Name: Lady Devimon +extern const unsigned char pen20_lady_devimon_png[]; +extern const size_t pen20_lady_devimon_png_size; + +// Name: Lalamon +extern const unsigned char pen20_lalamon_png[]; +extern const size_t pen20_lalamon_png_size; + +// Name: Lavogaritamon +extern const unsigned char pen20_lavogaritamon_png[]; +extern const size_t pen20_lavogaritamon_png_size; + +// Name: Lavorvomon +extern const unsigned char pen20_lavorvomon_png[]; +extern const size_t pen20_lavorvomon_png_size; + +// Name: Lilamon +extern const unsigned char pen20_lilamon_png[]; +extern const size_t pen20_lilamon_png_size; + +// Name: Lilimon +extern const unsigned char pen20_lilimon_png[]; +extern const size_t pen20_lilimon_png_size; + +// Name: Lopmon +extern const unsigned char pen20_lopmon_png[]; +extern const size_t pen20_lopmon_png_size; + +// Name: Lotusmon +extern const unsigned char pen20_lotusmon_png[]; +extern const size_t pen20_lotusmon_png_size; + +// Name: Ludomon +extern const unsigned char pen20_ludomon_png[]; +extern const size_t pen20_ludomon_png_size; + +// Name: Mad Leomon +extern const unsigned char pen20_mad_leomon_png[]; +extern const size_t pen20_mad_leomon_png_size; + +// Name: Mambomon +extern const unsigned char pen20_mambomon_png[]; +extern const size_t pen20_mambomon_png_size; + +// Name: Mammon +extern const unsigned char pen20_mammon_png[]; +extern const size_t pen20_mammon_png_size; + +// Name: Marin Angemon +extern const unsigned char pen20_marin_angemon_png[]; +extern const size_t pen20_marin_angemon_png_size; + +// Name: Marin Devimon +extern const unsigned char pen20_marin_devimon_png[]; +extern const size_t pen20_marin_devimon_png_size; + +// Name: Mastemon +extern const unsigned char pen20_mastemon_png[]; +extern const size_t pen20_mastemon_png_size; + +// Name: Mechanorimon +extern const unsigned char pen20_mechanorimon_png[]; +extern const size_t pen20_mechanorimon_png_size; + +// Name: Megalo Growmon +extern const unsigned char pen20_megalo_growmon_png[]; +extern const size_t pen20_megalo_growmon_png_size; + +// Name: Mega Seadramon +extern const unsigned char pen20_mega_seadramon_png[]; +extern const size_t pen20_mega_seadramon_png_size; + +// Name: Meicrackmon Vicious Mode +extern const unsigned char pen20_meicrackmon_vicious_mode_png[]; +extern const size_t pen20_meicrackmon_vicious_mode_png_size; + +// Name: Metal Etemon +extern const unsigned char pen20_metal_etemon_png[]; +extern const size_t pen20_metal_etemon_png_size; + +// Name: Metal Seadramon +extern const unsigned char pen20_metal_seadramon_png[]; +extern const size_t pen20_metal_seadramon_png_size; + +// Name: Mochimon +extern const unsigned char pen20_mochimon_png[]; +extern const size_t pen20_mochimon_png_size; + +// Name: Mokumon +extern const unsigned char pen20_mokumon_png[]; +extern const size_t pen20_mokumon_png_size; + +// Name: Mushmon +extern const unsigned char pen20_mushmon_png[]; +extern const size_t pen20_mushmon_png_size; + +// Name: Nyokimon +extern const unsigned char pen20_nyokimon_png[]; +extern const size_t pen20_nyokimon_png_size; + +// Name: Octmon +extern const unsigned char pen20_octmon_png[]; +extern const size_t pen20_octmon_png_size; + +// Name: Ofanimon +extern const unsigned char pen20_ofanimon_png[]; +extern const size_t pen20_ofanimon_png_size; + +// Name: Ogudomon +extern const unsigned char pen20_ogudomon_png[]; +extern const size_t pen20_ogudomon_png_size; + +// Name: Okuwamon +extern const unsigned char pen20_okuwamon_png[]; +extern const size_t pen20_okuwamon_png_size; + +// Name: Ordinemon +extern const unsigned char pen20_ordinemon_png[]; +extern const size_t pen20_ordinemon_png_size; + +// Name: Otamamon +extern const unsigned char pen20_otamamon_png[]; +extern const size_t pen20_otamamon_png_size; + +// Name: Ouryumon +extern const unsigned char pen20_ouryumon_png[]; +extern const size_t pen20_ouryumon_png_size; + +// Name: Paildramon +extern const unsigned char pen20_paildramon_png[]; +extern const size_t pen20_paildramon_png_size; + +// Name: Peti Meramon +extern const unsigned char pen20_peti_meramon_png[]; +extern const size_t pen20_peti_meramon_png_size; + +// Name: Phascomon +extern const unsigned char pen20_phascomon_png[]; +extern const size_t pen20_phascomon_png_size; + +// Name: Pico Devimon +extern const unsigned char pen20_pico_devimon_png[]; +extern const size_t pen20_pico_devimon_png_size; + +// Name: Piemon +extern const unsigned char pen20_piemon_png[]; +extern const size_t pen20_piemon_png_size; + +// Name: Plesiomon +extern const unsigned char pen20_plesiomon_png[]; +extern const size_t pen20_plesiomon_png_size; + +// Name: Porcupmon +extern const unsigned char pen20_porcupmon_png[]; +extern const size_t pen20_porcupmon_png_size; + +// Name: Pukumon +extern const unsigned char pen20_pukumon_png[]; +extern const size_t pen20_pukumon_png_size; + +// Name: Pumpmon +extern const unsigned char pen20_pumpmon_png[]; +extern const size_t pen20_pumpmon_png_size; + +// Name: Pyocomon +extern const unsigned char pen20_pyocomon_png[]; +extern const size_t pen20_pyocomon_png_size; + +// Name: Rafflesimon +extern const unsigned char pen20_rafflesimon_png[]; +extern const size_t pen20_rafflesimon_png_size; + +// Name: Ragna Lordmon +extern const unsigned char pen20_ragna_lordmon_png[]; +extern const size_t pen20_ragna_lordmon_png_size; + +// Name: Raguelmon +extern const unsigned char pen20_raguelmon_png[]; +extern const size_t pen20_raguelmon_png_size; + +// Name: Raiji Ludomon +extern const unsigned char pen20_raiji_ludomon_png[]; +extern const size_t pen20_raiji_ludomon_png_size; + +// Name: Rakamon +extern const unsigned char pen20_rakamon_png[]; +extern const size_t pen20_rakamon_png_size; + +// Name: Rapidmon +extern const unsigned char pen20_rapidmon_png[]; +extern const size_t pen20_rapidmon_png_size; + +// Name: Red Vegimon +extern const unsigned char pen20_red_vegimon_png[]; +extern const size_t pen20_red_vegimon_png_size; + +// Name: Reppamon +extern const unsigned char pen20_reppamon_png[]; +extern const size_t pen20_reppamon_png_size; + +// Name: Revolmon +extern const unsigned char pen20_revolmon_png[]; +extern const size_t pen20_revolmon_png_size; + +// Name: Rize Greymon +extern const unsigned char pen20_rize_greymon_png[]; +extern const size_t pen20_rize_greymon_png_size; + +// Name: Rosemon +extern const unsigned char pen20_rosemon_png[]; +extern const size_t pen20_rosemon_png_size; + +// Name: Ryudamon +extern const unsigned char pen20_ryudamon_png[]; +extern const size_t pen20_ryudamon_png_size; + +// Name: Saber Leomon +extern const unsigned char pen20_saber_leomon_png[]; +extern const size_t pen20_saber_leomon_png_size; + +// Name: Saint Galgomon +extern const unsigned char pen20_saint_galgomon_png[]; +extern const size_t pen20_saint_galgomon_png_size; + +// Name: Seraphimon +extern const unsigned char pen20_seraphimon_png[]; +extern const size_t pen20_seraphimon_png_size; + +// Name: Shadramon +extern const unsigned char pen20_shadramon_png[]; +extern const size_t pen20_shadramon_png_size; + +// Name: Shakomon +extern const unsigned char pen20_shakomon_png[]; +extern const size_t pen20_shakomon_png_size; + +// Name: Starmon +extern const unsigned char pen20_starmon_png[]; +extern const size_t pen20_starmon_png_size; + +// Name: Sunflowmon +extern const unsigned char pen20_sunflowmon_png[]; +extern const size_t pen20_sunflowmon_png_size; + +// Name: Tailmon +extern const unsigned char pen20_tailmon_png[]; +extern const size_t pen20_tailmon_png_size; + +// Name: Tankmon +extern const unsigned char pen20_tankmon_png[]; +extern const size_t pen20_tankmon_png_size; + +// Name: Targetmon +extern const unsigned char pen20_targetmon_png[]; +extern const size_t pen20_targetmon_png_size; + +// Name: Tentomon +extern const unsigned char pen20_tentomon_png[]; +extern const size_t pen20_tentomon_png_size; + +// Name: Terriermon +extern const unsigned char pen20_terriermon_png[]; +extern const size_t pen20_terriermon_png_size; + +// Name: Thunderballmon +extern const unsigned char pen20_thunderballmon_png[]; +extern const size_t pen20_thunderballmon_png_size; + +// Name: Tia Ludomon +extern const unsigned char pen20_tia_ludomon_png[]; +extern const size_t pen20_tia_ludomon_png_size; + +// Name: Togemon +extern const unsigned char pen20_togemon_png[]; +extern const size_t pen20_togemon_png_size; + +// Name: Tonosama Gekomon +extern const unsigned char pen20_tonosama_gekomon_png[]; +extern const size_t pen20_tonosama_gekomon_png_size; + +// Name: Tortamon +extern const unsigned char pen20_tortamon_png[]; +extern const size_t pen20_tortamon_png_size; + +// Name: Toy Agumon +extern const unsigned char pen20_toy_agumon_png[]; +extern const size_t pen20_toy_agumon_png_size; + +// Name: Triceramon +extern const unsigned char pen20_triceramon_png[]; +extern const size_t pen20_triceramon_png_size; + +// Name: Troopmon +extern const unsigned char pen20_troopmon_png[]; +extern const size_t pen20_troopmon_png_size; + +// Name: Turuiemon +extern const unsigned char pen20_turuiemon_png[]; +extern const size_t pen20_turuiemon_png_size; + +// Name: V-dramon +extern const unsigned char pen20_v_dramon_png[]; +extern const size_t pen20_v_dramon_png_size; + +// Name: Vemdemon +extern const unsigned char pen20_vemdemon_png[]; +extern const size_t pen20_vemdemon_png_size; + +// Name: Venom Vamdemon +extern const unsigned char pen20_venom_vamdemon_png[]; +extern const size_t pen20_venom_vamdemon_png_size; + +// Name: V-mon +extern const unsigned char pen20_v_mon_png[]; +extern const size_t pen20_v_mon_png_size; + +// Name: Volcanicdramon +extern const unsigned char pen20_volcanicdramon_png[]; +extern const size_t pen20_volcanicdramon_png_size; + +// Name: Voltobautamon +extern const unsigned char pen20_voltobautamon_png[]; +extern const size_t pen20_voltobautamon_png_size; + +// Name: Vorvomon +extern const unsigned char pen20_vorvomon_png[]; +extern const size_t pen20_vorvomon_png_size; + +// Name: Waru Mozaemon +extern const unsigned char pen20_waru_mozaemon_png[]; +extern const size_t pen20_waru_mozaemon_png_size; + +// Name: Wizarmon +extern const unsigned char pen20_wizarmon_png[]; +extern const size_t pen20_wizarmon_png_size; + +// Name: Woodmon +extern const unsigned char pen20_woodmon_png[]; +extern const size_t pen20_woodmon_png_size; + +// Name: XV-mon +extern const unsigned char pen20_xv_mon_png[]; +extern const size_t pen20_xv_mon_png_size; + +// Name: Zerimon +extern const unsigned char pen20_zerimon_png[]; +extern const size_t pen20_zerimon_png_size; + +// Name: Zudomom +extern const unsigned char pen20_zudomom_png[]; +extern const size_t pen20_zudomom_png_size; + + +#endif // BONGOCAT_EMBEDDED_ASSETS_PEN20_H + diff --git a/include/embedded_assets/pen20/pen20_sprite.h b/include/embedded_assets/pen20/pen20_sprite.h new file mode 100644 index 00000000..3060a276 --- /dev/null +++ b/include/embedded_assets/pen20/pen20_sprite.h @@ -0,0 +1,11 @@ +#ifndef BONGOCAT_EMBEDDED_ASSETS_PEN20_SPRITE_H +#define BONGOCAT_EMBEDDED_ASSETS_PEN20_SPRITE_H + +#include "embedded_assets/embedded_image.h" + +namespace bongocat::assets { + [[nodiscard]] extern embedded_image_t get_pen20_sprite_sheet(size_t i); +} + +#endif + diff --git a/include/graphics/animation_shared_memory.h b/include/graphics/animation_shared_memory.h index 9952e2cd..b2e358a2 100644 --- a/include/graphics/animation_shared_memory.h +++ b/include/graphics/animation_shared_memory.h @@ -7,17 +7,14 @@ #include "utils/time.h" namespace bongocat::animation { - struct animation_player_data_t { - int32_t frame_index{0}; + struct animation_player_result_t { + int32_t sprite_sheet_col{0}; int32_t sprite_sheet_row{0}; - int32_t start_frame_index{0}; - int32_t end_frame_index{0}; - platform::timestamp_ms_t time_until_next_frame_ms{0}; }; struct animation_shared_memory_t { // animation state - animation_player_data_t animation_player_data{}; + animation_player_result_t animation_player_result{}; int32_t anim_index{0}; config::config_animation_sprite_sheet_layout_t anim_type{config::config_animation_sprite_sheet_layout_t::None}; config::config_animation_dm_set_t anim_dm_set{config::config_animation_dm_set_t::None}; @@ -30,22 +27,21 @@ namespace bongocat::animation { platform::MMapArray dm20_anims; platform::MMapArray dmc_anims; platform::MMapArray dmx_anims; + platform::MMapArray pen_anims; + platform::MMapArray pen20_anims; platform::MMapArray dmall_anims; platform::MMapArray min_dm_anims; platform::MMapArray ms_anims; platform::MMapArray pkmn_anims; // for sprite sheet hot reload - bongocat_animation_t bongocat_sprite_sheet; - dm_animation_t dm_sprite_sheet; - ms_agent_sprite_sheet_t ms_agent_sprite_sheet; - pkmn_animation_t pkmn_sprite_sheet; + animation_t anim; animation_shared_memory_t() = default; ~animation_shared_memory_t() { anim_type = config::config_animation_sprite_sheet_layout_t::None; anim_dm_set = config::config_animation_dm_set_t::None; - animation_player_data = {}; + animation_player_result = {}; anim_index = 0; movement_offset_x = 0; anim_direction = 0; @@ -75,6 +71,16 @@ namespace bongocat::animation { } platform::release_allocated_mmap_array(dmx_anims); + for (size_t i = 0; i < pen_anims.count; i++) { + cleanup_animation(pen_anims[i]); + } + platform::release_allocated_mmap_array(pen_anims); + + for (size_t i = 0; i < pen20_anims.count; i++) { + cleanup_animation(pen20_anims[i]); + } + platform::release_allocated_mmap_array(pen20_anims); + for (size_t i = 0; i < dmall_anims.count; i++) { cleanup_animation(dmall_anims[i]); } @@ -95,82 +101,75 @@ namespace bongocat::animation { } platform::release_allocated_mmap_array(pkmn_anims); - cleanup_animation(bongocat_sprite_sheet); - cleanup_animation(dm_sprite_sheet); - cleanup_animation(ms_agent_sprite_sheet); - cleanup_animation(pkmn_sprite_sheet); + cleanup_animation(anim); } animation_shared_memory_t(const animation_shared_memory_t& other) - : animation_player_data(other.animation_player_data), anim_index(other.anim_index), anim_type(other.anim_type), anim_dm_set(other.anim_dm_set) + : animation_player_result(other.animation_player_result), anim_index(other.anim_index), anim_type(other.anim_type), anim_dm_set(other.anim_dm_set) { bongocat_anims = other.bongocat_anims; dm_anims = other.dm_anims; dm20_anims = other.dm20_anims; dmc_anims = other.dmc_anims; dmx_anims = other.dmx_anims; + pen_anims = other.pen_anims; + pen20_anims = other.pen20_anims; dmall_anims = other.dmall_anims; min_dm_anims = other.min_dm_anims; ms_anims = other.ms_anims; pkmn_anims = other.pkmn_anims; - bongocat_sprite_sheet = other.bongocat_sprite_sheet; - dm_sprite_sheet = other.dm_sprite_sheet; - ms_agent_sprite_sheet = other.ms_agent_sprite_sheet; - pkmn_sprite_sheet = other.pkmn_sprite_sheet; + anim = other.anim; } animation_shared_memory_t& operator=(const animation_shared_memory_t& other) { if (this != &other) { anim_type = other.anim_type; anim_dm_set = other.anim_dm_set; anim_index = other.anim_index; - animation_player_data = other.animation_player_data; + animation_player_result = other.animation_player_result; bongocat_anims = other.bongocat_anims; dm_anims = other.dm_anims; dm20_anims = other.dm20_anims; dmc_anims = other.dmc_anims; dmx_anims = other.dmx_anims; + pen_anims = other.pen_anims; + pen20_anims = other.pen20_anims; dmall_anims = other.dmall_anims; min_dm_anims = other.min_dm_anims; ms_anims = other.ms_anims; pkmn_anims = other.pkmn_anims; - bongocat_sprite_sheet = other.bongocat_sprite_sheet; - dm_sprite_sheet = other.dm_sprite_sheet; - ms_agent_sprite_sheet = other.ms_agent_sprite_sheet; - pkmn_sprite_sheet = other.pkmn_sprite_sheet; + anim = other.anim; } return *this; } animation_shared_memory_t(animation_shared_memory_t&& other) noexcept - : animation_player_data(other.animation_player_data), anim_index(other.anim_index), anim_type(other.anim_type), anim_dm_set(other.anim_dm_set) + : animation_player_result(other.animation_player_result), anim_index(other.anim_index), anim_type(other.anim_type), anim_dm_set(other.anim_dm_set) { bongocat_anims = bongocat::move(other.bongocat_anims); dm_anims = bongocat::move(other.dm_anims); dm20_anims = bongocat::move(other.dm20_anims); dmc_anims = bongocat::move(other.dmc_anims); dmx_anims = bongocat::move(other.dmx_anims); + pen_anims = bongocat::move(other.pen_anims); + pen20_anims = bongocat::move(other.pen20_anims); dmall_anims = bongocat::move(other.dmall_anims); min_dm_anims = bongocat::move(other.min_dm_anims); ms_anims = bongocat::move(other.ms_anims); pkmn_anims = bongocat::move(other.pkmn_anims); - bongocat_sprite_sheet = bongocat::move(other.bongocat_sprite_sheet); - dm_sprite_sheet = bongocat::move(other.dm_sprite_sheet); - ms_agent_sprite_sheet = bongocat::move(other.ms_agent_sprite_sheet); - pkmn_sprite_sheet = bongocat::move(other.pkmn_sprite_sheet); + anim = bongocat::move(other.anim); - cleanup_animation(other.bongocat_sprite_sheet); - cleanup_animation(other.dm_sprite_sheet); - cleanup_animation(other.ms_agent_sprite_sheet); - cleanup_animation(other.pkmn_sprite_sheet); + cleanup_animation(other.anim); platform::release_allocated_mmap_array(other.bongocat_anims); platform::release_allocated_mmap_array(other.dm_anims); platform::release_allocated_mmap_array(other.dm20_anims); platform::release_allocated_mmap_array(other.dmc_anims); platform::release_allocated_mmap_array(other.dmx_anims); + platform::release_allocated_mmap_array(other.pen_anims); + platform::release_allocated_mmap_array(other.pen20_anims); platform::release_allocated_mmap_array(other.dmall_anims); platform::release_allocated_mmap_array(other.min_dm_anims); platform::release_allocated_mmap_array(other.ms_anims); @@ -178,38 +177,36 @@ namespace bongocat::animation { other.anim_type = config::config_animation_sprite_sheet_layout_t::None; other.anim_dm_set = config::config_animation_dm_set_t::None; other.anim_index = 0; - other.animation_player_data = {}; + other.animation_player_result = {}; } animation_shared_memory_t& operator=(animation_shared_memory_t&& other) noexcept { if (this != &other) { anim_type = other.anim_type; anim_index = other.anim_index; - animation_player_data = other.animation_player_data; + animation_player_result = other.animation_player_result; bongocat_anims = bongocat::move(other.bongocat_anims); dm_anims = bongocat::move(other.dm_anims); dm20_anims = bongocat::move(other.dm20_anims); dmc_anims = bongocat::move(other.dmc_anims); dmx_anims = bongocat::move(other.dmx_anims); + pen_anims = bongocat::move(other.pen_anims); + pen20_anims = bongocat::move(other.pen20_anims); dmall_anims = bongocat::move(other.dmall_anims); min_dm_anims = bongocat::move(other.min_dm_anims); ms_anims = bongocat::move(other.ms_anims); pkmn_anims = bongocat::move(other.pkmn_anims); - bongocat_sprite_sheet = bongocat::move(other.bongocat_sprite_sheet); - dm_sprite_sheet = bongocat::move(other.dm_sprite_sheet); - ms_agent_sprite_sheet = bongocat::move(other.ms_agent_sprite_sheet); - pkmn_sprite_sheet = bongocat::move(other.pkmn_sprite_sheet); + anim = bongocat::move(other.anim); - cleanup_animation(other.bongocat_sprite_sheet); - cleanup_animation(other.dm_sprite_sheet); - cleanup_animation(other.ms_agent_sprite_sheet); - cleanup_animation(other.pkmn_sprite_sheet); + cleanup_animation(other.anim); platform::release_allocated_mmap_array(other.bongocat_anims); platform::release_allocated_mmap_array(other.dm_anims); platform::release_allocated_mmap_array(other.dm20_anims); platform::release_allocated_mmap_array(other.dmc_anims); platform::release_allocated_mmap_array(other.dmx_anims); + platform::release_allocated_mmap_array(other.pen_anims); + platform::release_allocated_mmap_array(other.pen20_anims); platform::release_allocated_mmap_array(other.dmall_anims); platform::release_allocated_mmap_array(other.min_dm_anims); platform::release_allocated_mmap_array(other.ms_anims); @@ -217,7 +214,7 @@ namespace bongocat::animation { other.anim_type = config::config_animation_sprite_sheet_layout_t::None; other.anim_dm_set = config::config_animation_dm_set_t::None; other.anim_index = 0; - other.animation_player_data = {}; + other.animation_player_result = {}; } return *this; } diff --git a/include/graphics/embedded_assets_dms.h b/include/graphics/embedded_assets_dms.h index 76e6176c..558d09cb 100644 --- a/include/graphics/embedded_assets_dms.h +++ b/include/graphics/embedded_assets_dms.h @@ -3,7 +3,7 @@ #include -#if !defined(FEATURE_DM_EMBEDDED_ASSETS) && !defined(FEATURE_DM20_EMBEDDED_ASSETS) && !defined(FEATURE_DMC_EMBEDDED_ASSETS) && !defined(FEATURE_DMX_EMBEDDED_ASSETS) && !defined(FEATURE_PEN20_EMBEDDED_ASSETS) && !defined(FEATURE_DMALL_EMBEDDED_ASSETS) +#if !defined(FEATURE_DM_EMBEDDED_ASSETS) && !defined(FEATURE_DM20_EMBEDDED_ASSETS) && !defined(FEATURE_DMC_EMBEDDED_ASSETS) && !defined(FEATURE_DMX_EMBEDDED_ASSETS) && !defined(FEATURE_PEN_EMBEDDED_ASSETS) && !defined(FEATURE_PEN20_EMBEDDED_ASSETS) && !defined(FEATURE_DMALL_EMBEDDED_ASSETS) #ifdef FEATURE_ENABLE_DM_EMBEDDED_ASSETS // Fallback dm (minimal set) #ifndef FEATURE_MIN_DM_EMBEDDED_ASSETS @@ -21,6 +21,7 @@ namespace bongocat::assets { #endif namespace bongocat::assets { inline static constexpr size_t DM20_ANIM_COUNT = 0; + inline static constexpr size_t PEN_ANIM_COUNT = 0; inline static constexpr size_t PEN20_ANIM_COUNT = 0; inline static constexpr size_t DMX_ANIM_COUNT = 0; inline static constexpr size_t DMC_ANIM_COUNT = 0; @@ -51,6 +52,15 @@ namespace bongocat::assets { } #endif +/// pen +#ifdef FEATURE_PEN_EMBEDDED_ASSETS +#include "embedded_assets/pen/pen.hpp" +#else +namespace bongocat::assets { + inline static constexpr size_t PEN_ANIM_COUNT = 0; +} +#endif + /// pen20 #ifdef FEATURE_PEN20_EMBEDDED_ASSETS #include "embedded_assets/pen20/pen20.hpp" @@ -90,7 +100,7 @@ namespace bongocat::assets { #endif namespace bongocat::assets { - inline static constexpr size_t DM_ANIMATIONS_COUNT = DM_ANIM_COUNT+DM20_ANIM_COUNT+PEN20_ANIM_COUNT+DMX_ANIM_COUNT+DMC_ANIM_COUNT+DMALL_ANIM_COUNT; + inline static constexpr size_t DM_ANIMATIONS_COUNT = DM_ANIM_COUNT+DM20_ANIM_COUNT+PEN_ANIM_COUNT+PEN20_ANIM_COUNT+DMX_ANIM_COUNT+DMC_ANIM_COUNT+DMALL_ANIM_COUNT; } namespace bongocat::assets { @@ -116,6 +126,7 @@ namespace bongocat::assets { static inline constexpr int DM_HAPPY_CHANCE_PERCENT = 60; inline static constexpr size_t DM_SPRITE_SHEET_ROWS = 1; + inline static constexpr size_t DM_SPRITE_SHEET_ROW = 0; } #endif \ No newline at end of file diff --git a/include/graphics/embedded_assets_pkmn.h b/include/graphics/embedded_assets_pkmn.h index c761fb14..70f0d915 100644 --- a/include/graphics/embedded_assets_pkmn.h +++ b/include/graphics/embedded_assets_pkmn.h @@ -20,6 +20,7 @@ namespace bongocat::assets { namespace bongocat::assets { static inline constexpr int PKMN_FRAME_IDLE1 = 0; static inline constexpr int PKMN_FRAME_IDLE2 = 1; + inline static constexpr size_t PKMN_SPRITE_SHEET_ROW = 0; inline static constexpr size_t PKMN_SPRITE_SHEET_COLS = 2; inline static constexpr size_t PKMN_SPRITE_SHEET_ROWS = 1; diff --git a/include/graphics/sprite_sheet.h b/include/graphics/sprite_sheet.h index 97927664..7557818b 100644 --- a/include/graphics/sprite_sheet.h +++ b/include/graphics/sprite_sheet.h @@ -5,16 +5,20 @@ #include namespace bongocat::animation { - // both-up, left-down, right-down, both-down + // bongocat: both-up, left-down, right-down, both-down inline static constexpr size_t BONGOCAT_NUM_FRAMES = 4; - - // Idle 1, Idle 2, Angry, Down1, Happy, Eat1, Sleep1, Refuse, Down2 ~~, Eat2, Sleep2, Attack~~ - // both-up, left-down, right-down, both-down, ... - inline static constexpr size_t MAX_NUM_FRAMES = 15; - inline static constexpr size_t MAX_DIGIMON_FRAMES = 15; + // dm: Idle 1, Idle 2, Angry, Down1, Happy, Eat1, Sleep1, Refuse, Down2 ~~, Eat2, Sleep2, Attack~~ + inline static constexpr size_t MAX_DIGIMON_FRAMES = 16; + // pkmn: Idle 1, Idle 2 inline static constexpr size_t MAX_PKMN_FRAMES = 2; + // @NOTE: MS agents can have more frames and are more custom + + inline static constexpr size_t MAX_NUM_FRAMES = 16; - struct sprite_sheet_animation_region_t { + inline static constexpr size_t MAX_ANIMATION_FRAMES = 4; + // @NOTE: MS agents can have more frames per row and are more custom + + struct sprite_sheet_animation_frame_t { bool valid{false}; int32_t col{0}; int32_t row{0}; @@ -27,99 +31,136 @@ namespace bongocat::animation { AllocatedArray pixels; }; - struct dm_animation_t { + struct dm_sprite_sheet_frames_t { + sprite_sheet_animation_frame_t idle_1; // 0 + sprite_sheet_animation_frame_t idle_2; // 1 + sprite_sheet_animation_frame_t angry; // 2 + sprite_sheet_animation_frame_t down_1; // 3 + sprite_sheet_animation_frame_t happy; // 4 + sprite_sheet_animation_frame_t eat_1; // 5 + sprite_sheet_animation_frame_t sleep_1; // 6 + sprite_sheet_animation_frame_t refuse; // 7 + sprite_sheet_animation_frame_t sad; // 8 + + // optional + sprite_sheet_animation_frame_t down_2; // 9 + sprite_sheet_animation_frame_t eat_2; //10 + sprite_sheet_animation_frame_t sleep_2; //11 + sprite_sheet_animation_frame_t attack_1; //12 + + // extra frames + sprite_sheet_animation_frame_t movement_1; //13 + sprite_sheet_animation_frame_t movement_2; //14 + sprite_sheet_animation_frame_t attack_2; //15 + }; + + struct sprite_sheet_animations_t { + int32_t idle[MAX_ANIMATION_FRAMES]{}; + int32_t boring[MAX_ANIMATION_FRAMES]{}; + int32_t writing[MAX_ANIMATION_FRAMES]{}; + int32_t sleep[MAX_ANIMATION_FRAMES]{}; + int32_t wake_up[MAX_ANIMATION_FRAMES]{}; + int32_t working[MAX_ANIMATION_FRAMES]{}; // attack + int32_t moving[MAX_ANIMATION_FRAMES]{}; + int32_t happy[MAX_ANIMATION_FRAMES]{}; + }; + + struct dm_sprite_sheet_t { generic_sprite_sheet_image_t image; int32_t frame_width{0}; int32_t frame_height{0}; int32_t total_frames{0}; - sprite_sheet_animation_region_t idle_1; - sprite_sheet_animation_region_t idle_2; - sprite_sheet_animation_region_t angry; - sprite_sheet_animation_region_t down1; - sprite_sheet_animation_region_t happy; - sprite_sheet_animation_region_t eat1; - sprite_sheet_animation_region_t sleep1; - sprite_sheet_animation_region_t refuse; - sprite_sheet_animation_region_t sad; - - // optional - sprite_sheet_animation_region_t down_2; - sprite_sheet_animation_region_t eat_2; - sprite_sheet_animation_region_t sleep_2; - sprite_sheet_animation_region_t attack; + dm_sprite_sheet_frames_t frames; - // extra frames - sprite_sheet_animation_region_t movement_1; - sprite_sheet_animation_region_t movement_2; + sprite_sheet_animations_t animations; }; - struct pkmn_animation_t { + struct pkmn_sprite_sheet_t { generic_sprite_sheet_image_t image; int32_t frame_width{0}; int32_t frame_height{0}; int32_t total_frames{0}; - sprite_sheet_animation_region_t idle_1; - sprite_sheet_animation_region_t idle_2; + sprite_sheet_animation_frame_t idle_1; + sprite_sheet_animation_frame_t idle_2; - sprite_sheet_animation_region_t _placeholder[MAX_NUM_FRAMES-2]; + sprite_sheet_animations_t animations; }; - struct bongocat_animation_t { + struct bongocat_sprite_sheet_t { generic_sprite_sheet_image_t image; int32_t frame_width{0}; int32_t frame_height{0}; int32_t total_frames{0}; - sprite_sheet_animation_region_t both_up; - sprite_sheet_animation_region_t left_down; - sprite_sheet_animation_region_t right_down; - sprite_sheet_animation_region_t both_down; + sprite_sheet_animation_frame_t both_up; + sprite_sheet_animation_frame_t left_down; + sprite_sheet_animation_frame_t right_down; + sprite_sheet_animation_frame_t both_down; - sprite_sheet_animation_region_t _placeholder[MAX_NUM_FRAMES-4]; + sprite_sheet_animations_t animations; }; + struct ms_agent_sprite_sheet_animation_section_t { + bool valid{false}; + int32_t start_col{0}; + int32_t end_col{0}; + int32_t row{0}; + }; struct ms_agent_sprite_sheet_t { generic_sprite_sheet_image_t image; int32_t frame_width{0}; int32_t frame_height{0}; - int32_t _placeholder_total_frames{0}; - sprite_sheet_animation_region_t _placeholder[MAX_NUM_FRAMES]; + ms_agent_sprite_sheet_animation_section_t idle; + ms_agent_sprite_sheet_animation_section_t boring; + + ms_agent_sprite_sheet_animation_section_t start_writing; + ms_agent_sprite_sheet_animation_section_t writing; + ms_agent_sprite_sheet_animation_section_t end_writing; + + ms_agent_sprite_sheet_animation_section_t sleep; + ms_agent_sprite_sheet_animation_section_t wake_up; + + ms_agent_sprite_sheet_animation_section_t start_working; + ms_agent_sprite_sheet_animation_section_t working; + ms_agent_sprite_sheet_animation_section_t end_working; + + ms_agent_sprite_sheet_animation_section_t start_moving; + ms_agent_sprite_sheet_animation_section_t moving; + ms_agent_sprite_sheet_animation_section_t end_moving; + + ms_agent_sprite_sheet_animation_section_t happy; }; - struct generic_sprite_sheet_animation_t { - generic_sprite_sheet_image_t image; + struct generic_sprite_sheet_t { + generic_sprite_sheet_image_t image{}; int32_t frame_width{0}; int32_t frame_height{0}; int32_t total_frames{0}; - sprite_sheet_animation_region_t frames[MAX_NUM_FRAMES]; + sprite_sheet_animation_frame_t frames[MAX_NUM_FRAMES]; }; struct animation_t; void cleanup_animation(animation_t& anim); - static_assert(sizeof(dm_animation_t) == sizeof(bongocat_animation_t)); - static_assert(sizeof(bongocat_animation_t) == sizeof(dm_animation_t)); - static_assert(sizeof(generic_sprite_sheet_animation_t) == sizeof(bongocat_animation_t)); - static_assert(sizeof(generic_sprite_sheet_animation_t) == sizeof(dm_animation_t)); - static_assert(sizeof(generic_sprite_sheet_animation_t) == sizeof(ms_agent_sprite_sheet_t)); - static_assert(sizeof(generic_sprite_sheet_animation_t) == sizeof(pkmn_animation_t)); + // sprite_sheet variant struct animation_t { union { - bongocat_animation_t bongocat; - dm_animation_t dm; + bongocat_sprite_sheet_t bongocat; + dm_sprite_sheet_t dm; ms_agent_sprite_sheet_t ms_agent; - pkmn_animation_t pkmn; - generic_sprite_sheet_animation_t sprite_sheet; + pkmn_sprite_sheet_t pkmn; + generic_sprite_sheet_t sprite_sheet; }; + enum class Type : uint8_t { Generic, Bongocat, Dm, MsAgent, Pkmn } type{Type::Generic}; animation_t() { sprite_sheet.image.pixels.data = nullptr; @@ -133,85 +174,134 @@ namespace bongocat::animation { for (size_t i = 0; i < MAX_NUM_FRAMES; i++) { sprite_sheet.frames[i] = {}; } + type = Type::Generic; } ~animation_t() { cleanup_animation(*this); } animation_t(const animation_t& other) { - sprite_sheet.image.sprite_sheet_width = other.sprite_sheet.image.sprite_sheet_width; - sprite_sheet.image.sprite_sheet_height = other.sprite_sheet.image.sprite_sheet_height; - sprite_sheet.image.channels = other.sprite_sheet.image.channels; - sprite_sheet.image.pixels = other.sprite_sheet.image.pixels; - sprite_sheet.frame_width = other.sprite_sheet.frame_width; - sprite_sheet.frame_height = other.sprite_sheet.frame_height; - sprite_sheet.total_frames = other.sprite_sheet.total_frames; - for (size_t i = 0; i < MAX_NUM_FRAMES; i++) { - sprite_sheet.frames[i] = other.sprite_sheet.frames[i]; + type = other.type; + switch (other.type) { + case Type::Bongocat: bongocat = other.bongocat; break; + case Type::Dm: dm = other.dm; break; + case Type::MsAgent: ms_agent = other.ms_agent; break; + case Type::Pkmn: pkmn = other.pkmn; break; + case Type::Generic: sprite_sheet = other.sprite_sheet; break; } } animation_t& operator=(const animation_t& other) { if (this != &other) { cleanup_animation(*this); - sprite_sheet.image.sprite_sheet_width = other.sprite_sheet.image.sprite_sheet_width; - sprite_sheet.image.sprite_sheet_height = other.sprite_sheet.image.sprite_sheet_height; - sprite_sheet.image.channels = other.sprite_sheet.image.channels; - sprite_sheet.image.pixels = other.sprite_sheet.image.pixels; - sprite_sheet.frame_width = other.sprite_sheet.frame_width; - sprite_sheet.frame_height = other.sprite_sheet.frame_height; - sprite_sheet.total_frames = other.sprite_sheet.total_frames; - for (size_t i = 0; i < MAX_NUM_FRAMES; i++) { - sprite_sheet.frames[i] = other.sprite_sheet.frames[i]; + type = other.type; + switch (other.type) { + case Type::Bongocat: bongocat = other.bongocat; break; + case Type::Dm: dm = other.dm; break; + case Type::MsAgent: ms_agent = other.ms_agent; break; + case Type::Pkmn: pkmn = other.pkmn; break; + case Type::Generic: sprite_sheet = other.sprite_sheet; break; } } return *this; } animation_t(animation_t&& other) noexcept { - sprite_sheet.image.sprite_sheet_width = other.sprite_sheet.image.sprite_sheet_width; - sprite_sheet.image.sprite_sheet_height = other.sprite_sheet.image.sprite_sheet_height; - sprite_sheet.image.channels = other.sprite_sheet.image.channels; - sprite_sheet.image.pixels = bongocat::move(other.sprite_sheet.image.pixels); - sprite_sheet.frame_width = other.sprite_sheet.frame_width; - sprite_sheet.frame_height = other.sprite_sheet.frame_height; - sprite_sheet.total_frames = other.sprite_sheet.total_frames; - for (size_t i = 0; i < MAX_NUM_FRAMES; i++) { - sprite_sheet.frames[i] = bongocat::move(other.sprite_sheet.frames[i]); - } - - other.sprite_sheet.image = {}; - other.sprite_sheet.frame_width = 0; - other.sprite_sheet.frame_height = 0; - other.sprite_sheet.total_frames = 0; - for (size_t i = 0; i < MAX_NUM_FRAMES; i++) { - sprite_sheet.frames[i] = {}; + type = other.type; + switch (other.type) { + case Type::Bongocat: + new (&bongocat) bongocat_sprite_sheet_t(bongocat::move(other.bongocat)); + break; + case Type::Dm: + new (&dm) dm_sprite_sheet_t(bongocat::move(other.dm)); + break; + case Type::MsAgent: + new (&ms_agent) ms_agent_sprite_sheet_t(bongocat::move(other.ms_agent)); + break; + case Type::Pkmn: + new (&pkmn) pkmn_sprite_sheet_t(bongocat::move(other.pkmn)); + break; + case Type::Generic: + new (&sprite_sheet) generic_sprite_sheet_t(bongocat::move(other.sprite_sheet)); + break; } + other.type = Type::Generic; + new (&other.sprite_sheet) generic_sprite_sheet_t(); } animation_t& operator=(animation_t&& other) noexcept { if (this != &other) { - sprite_sheet.image.sprite_sheet_width = other.sprite_sheet.image.sprite_sheet_width; - sprite_sheet.image.sprite_sheet_height = other.sprite_sheet.image.sprite_sheet_height; - sprite_sheet.image.channels = other.sprite_sheet.image.channels; - sprite_sheet.image.pixels = bongocat::move(other.sprite_sheet.image.pixels); - sprite_sheet.frame_width = other.sprite_sheet.frame_width; - sprite_sheet.frame_height = other.sprite_sheet.frame_height; - sprite_sheet.total_frames = other.sprite_sheet.total_frames; - for (size_t i = 0; i < MAX_NUM_FRAMES; i++) { - sprite_sheet.frames[i] = bongocat::move(other.sprite_sheet.frames[i]); - } - - other.sprite_sheet.image = {}; - other.sprite_sheet.frame_width = 0; - other.sprite_sheet.frame_height = 0; - other.sprite_sheet.total_frames = 0; - for (size_t i = 0; i < MAX_NUM_FRAMES; i++) { - sprite_sheet.frames[i] = {}; + cleanup_animation(*this); + type = other.type; + switch (other.type) { + case Type::Bongocat: + new (&bongocat) bongocat_sprite_sheet_t(bongocat::move(other.bongocat)); + break; + case Type::Dm: + new (&dm) dm_sprite_sheet_t(bongocat::move(other.dm)); + break; + case Type::MsAgent: + new (&ms_agent) ms_agent_sprite_sheet_t(bongocat::move(other.ms_agent)); + break; + case Type::Pkmn: + new (&pkmn) pkmn_sprite_sheet_t(bongocat::move(other.pkmn)); + break; + case Type::Generic: + new (&sprite_sheet) generic_sprite_sheet_t(bongocat::move(other.sprite_sheet)); + break; } + other.type = Type::Generic; + new (&other.sprite_sheet) generic_sprite_sheet_t(); } return *this; } + + explicit animation_t(bongocat_sprite_sheet_t&& sheet) noexcept + : bongocat(bongocat::move(sheet)), type(Type::Bongocat) {} + + explicit animation_t(dm_sprite_sheet_t&& sheet) noexcept + : dm(bongocat::move(sheet)), type(Type::Dm) {} + + explicit animation_t(ms_agent_sprite_sheet_t&& sheet) noexcept + : ms_agent(bongocat::move(sheet)), type(Type::MsAgent) {} + + explicit animation_t(pkmn_sprite_sheet_t&& sheet) noexcept + : pkmn(bongocat::move(sheet)), type(Type::Pkmn) {} + + explicit animation_t(generic_sprite_sheet_t&& sheet) noexcept + : sprite_sheet(bongocat::move(sheet)), type(Type::Generic) {} + + + animation_t& operator=(bongocat_sprite_sheet_t&& sheet) noexcept { + cleanup_animation(*this); + new (&bongocat) bongocat_sprite_sheet_t(bongocat::move(sheet)); + type = Type::Bongocat; + return *this; + } + animation_t& operator=(dm_sprite_sheet_t&& sheet) noexcept { + cleanup_animation(*this); + new (&dm) dm_sprite_sheet_t(bongocat::move(sheet)); + type = Type::Dm; + return *this; + } + animation_t& operator=(ms_agent_sprite_sheet_t&& sheet) noexcept { + cleanup_animation(*this); + new (&ms_agent) ms_agent_sprite_sheet_t(bongocat::move(sheet)); + type = Type::MsAgent; + return *this; + } + animation_t& operator=(pkmn_sprite_sheet_t&& sheet) noexcept { + cleanup_animation(*this); + new (&pkmn) pkmn_sprite_sheet_t(bongocat::move(sheet)); + type = Type::Pkmn; + return *this; + } + animation_t& operator=(generic_sprite_sheet_t&& sheet) noexcept { + cleanup_animation(*this); + new (&sprite_sheet) generic_sprite_sheet_t(bongocat::move(sheet)); + type = Type::Generic; + return *this; + } }; - inline void cleanup_animation(generic_sprite_sheet_animation_t& sprite_sheet) { + inline void cleanup_animation(generic_sprite_sheet_t& sprite_sheet) { release_allocated_array(sprite_sheet.image.pixels); sprite_sheet.image.sprite_sheet_width = 0; sprite_sheet.image.sprite_sheet_height = 0; @@ -223,7 +313,7 @@ namespace bongocat::animation { sprite_sheet.frames[i] = {}; } } - inline void cleanup_animation(dm_animation_t& sprite_sheet) { + inline void cleanup_animation(dm_sprite_sheet_t& sprite_sheet) { release_allocated_array(sprite_sheet.image.pixels); sprite_sheet.image.sprite_sheet_width = 0; sprite_sheet.image.sprite_sheet_height = 0; @@ -231,8 +321,9 @@ namespace bongocat::animation { sprite_sheet.frame_width = 0; sprite_sheet.frame_height = 0; sprite_sheet.total_frames = 0; + sprite_sheet.animations = {}; } - inline void cleanup_animation(pkmn_animation_t& sprite_sheet) { + inline void cleanup_animation(pkmn_sprite_sheet_t& sprite_sheet) { release_allocated_array(sprite_sheet.image.pixels); sprite_sheet.image.sprite_sheet_width = 0; sprite_sheet.image.sprite_sheet_height = 0; @@ -240,8 +331,9 @@ namespace bongocat::animation { sprite_sheet.frame_width = 0; sprite_sheet.frame_height = 0; sprite_sheet.total_frames = 0; + sprite_sheet.animations = {}; } - inline void cleanup_animation(bongocat_animation_t& sprite_sheet) { + inline void cleanup_animation(bongocat_sprite_sheet_t& sprite_sheet) { release_allocated_array(sprite_sheet.image.pixels); sprite_sheet.image.sprite_sheet_width = 0; sprite_sheet.image.sprite_sheet_height = 0; @@ -249,6 +341,7 @@ namespace bongocat::animation { sprite_sheet.frame_width = 0; sprite_sheet.frame_height = 0; sprite_sheet.total_frames = 0; + sprite_sheet.animations = {}; } inline void cleanup_animation(ms_agent_sprite_sheet_t& sprite_sheet) { release_allocated_array(sprite_sheet.image.pixels); @@ -257,18 +350,70 @@ namespace bongocat::animation { sprite_sheet.image.channels = 0; sprite_sheet.frame_width = 0; sprite_sheet.frame_height = 0; + + sprite_sheet.idle = {}; + sprite_sheet.boring = {}; + sprite_sheet.start_writing = {}; + sprite_sheet.writing = {}; + sprite_sheet.end_writing = {}; + sprite_sheet.sleep = {}; + sprite_sheet.wake_up = {}; + sprite_sheet.start_working = {}; + sprite_sheet.working = {}; + sprite_sheet.end_working = {}; + sprite_sheet.start_moving = {}; + sprite_sheet.moving = {}; + sprite_sheet.end_moving = {}; } inline void cleanup_animation(animation_t& anim) { - release_allocated_array(anim.sprite_sheet.image.pixels); - anim.sprite_sheet.image.sprite_sheet_width = 0; - anim.sprite_sheet.image.sprite_sheet_height = 0; - anim.sprite_sheet.image.channels = 0; - anim.sprite_sheet.frame_width = 0; - anim.sprite_sheet.frame_height = 0; - - anim.sprite_sheet.total_frames = 0; - for (size_t i = 0; i < MAX_NUM_FRAMES; i++) { - anim.sprite_sheet.frames[i] = {}; + switch (anim.type) { + case animation_t::Type::Bongocat: + release_allocated_array(anim.bongocat.image.pixels); + anim.bongocat.image.sprite_sheet_width = 0; + anim.bongocat.image.sprite_sheet_height = 0; + anim.bongocat.image.channels = 0; + anim.bongocat.frame_width = 0; + anim.bongocat.frame_height = 0; + break; + case animation_t::Type::Dm: + release_allocated_array(anim.dm.image.pixels); + anim.dm.image.sprite_sheet_width = 0; + anim.dm.image.sprite_sheet_height = 0; + anim.dm.image.channels = 0; + anim.dm.frame_width = 0; + anim.dm.frame_height = 0; + + anim.dm.total_frames = 0; + break; + case animation_t::Type::MsAgent: + release_allocated_array(anim.ms_agent.image.pixels); + anim.ms_agent.image.sprite_sheet_width = 0; + anim.ms_agent.image.sprite_sheet_height = 0; + anim.ms_agent.image.channels = 0; + anim.ms_agent.frame_width = 0; + anim.ms_agent.frame_height = 0; + break; + case animation_t::Type::Pkmn: + release_allocated_array(anim.pkmn.image.pixels); + anim.pkmn.image.sprite_sheet_width = 0; + anim.pkmn.image.sprite_sheet_height = 0; + anim.pkmn.image.channels = 0; + anim.pkmn.frame_width = 0; + anim.pkmn.frame_height = 0; + break; + case animation_t::Type::Generic: + release_allocated_array(anim.sprite_sheet.image.pixels); + anim.sprite_sheet.image.sprite_sheet_width = 0; + anim.sprite_sheet.image.sprite_sheet_height = 0; + anim.sprite_sheet.image.channels = 0; + anim.sprite_sheet.frame_width = 0; + anim.sprite_sheet.frame_height = 0; + + anim.sprite_sheet.total_frames = 0; + for (size_t i = 0; i < MAX_NUM_FRAMES; i++) { + anim.sprite_sheet.frames[i] = {}; + } + break; } } } diff --git a/include/image_loader/base_dm/load_dm.h b/include/image_loader/base_dm/load_dm.h index 1e7ddfe1..70d6f829 100644 --- a/include/image_loader/base_dm/load_dm.h +++ b/include/image_loader/base_dm/load_dm.h @@ -6,5 +6,5 @@ namespace bongocat::animation { struct animation_context_t; - [[nodiscard]] created_result_t load_dm_anim(const animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); + [[nodiscard]] created_result_t load_dm_anim(const animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); } diff --git a/include/image_loader/bongocat/load_images_bongocat.h b/include/image_loader/bongocat/load_images_bongocat.h index 0ef5cf65..e1d68de8 100644 --- a/include/image_loader/bongocat/load_images_bongocat.h +++ b/include/image_loader/bongocat/load_images_bongocat.h @@ -6,8 +6,8 @@ namespace bongocat::animation { struct animation_context_t; - [[nodiscard]] created_result_t load_bongocat_anim(int anim_index, get_sprite_callback_t get_sprite, size_t embedded_images_count); + [[nodiscard]] created_result_t load_bongocat_anim(int anim_index, get_sprite_callback_t get_sprite, size_t embedded_images_count); bongocat_error_t init_bongocat_anim(animation_context_t& ctx, int anim_index, get_sprite_callback_t get_sprite, size_t embedded_images_count); - [[nodiscard]] created_result_t load_bongocat_sprite_sheet(const animation_context_t& /*ctx*/, int index); + [[nodiscard]] created_result_t load_bongocat_sprite_sheet(const animation_context_t& /*ctx*/, int index); } diff --git a/include/image_loader/dm/load_images_dm.h b/include/image_loader/dm/load_images_dm.h index 6a19bb90..39e39387 100644 --- a/include/image_loader/dm/load_images_dm.h +++ b/include/image_loader/dm/load_images_dm.h @@ -8,5 +8,5 @@ namespace bongocat::animation { struct animation_context_t; bongocat_error_t init_dm_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); - [[nodiscard]] created_result_t load_dm_sprite_sheet(const animation_context_t& ctx, int index); + [[nodiscard]] created_result_t load_dm_sprite_sheet(const animation_context_t& ctx, int index); } diff --git a/include/image_loader/dm20/load_images_dm20.h b/include/image_loader/dm20/load_images_dm20.h index cff2e624..c760c8f0 100644 --- a/include/image_loader/dm20/load_images_dm20.h +++ b/include/image_loader/dm20/load_images_dm20.h @@ -8,5 +8,5 @@ namespace bongocat::animation { struct animation_context_t; bongocat_error_t init_dm20_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); - [[nodiscard]] created_result_t load_dm20_sprite_sheet(const animation_context_t& ctx, int index); + [[nodiscard]] created_result_t load_dm20_sprite_sheet(const animation_context_t& ctx, int index); } diff --git a/include/image_loader/dmall/load_images_dmall.h b/include/image_loader/dmall/load_images_dmall.h index 4f3cb272..99adada1 100644 --- a/include/image_loader/dmall/load_images_dmall.h +++ b/include/image_loader/dmall/load_images_dmall.h @@ -8,5 +8,5 @@ namespace bongocat::animation { struct animation_context_t; bongocat_error_t init_dmall_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); - [[nodiscard]] created_result_t load_dmall_sprite_sheet(const animation_context_t& ctx, int index); + [[nodiscard]] created_result_t load_dmall_sprite_sheet(const animation_context_t& ctx, int index); } diff --git a/include/image_loader/dmc/load_images_dmc.h b/include/image_loader/dmc/load_images_dmc.h index 7b7203d4..5cdda86c 100644 --- a/include/image_loader/dmc/load_images_dmc.h +++ b/include/image_loader/dmc/load_images_dmc.h @@ -8,5 +8,5 @@ namespace bongocat::animation { struct animation_context_t; bongocat_error_t init_dmc_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); - [[nodiscard]] created_result_t load_dmc_sprite_sheet(const animation_context_t& ctx, int index); + [[nodiscard]] created_result_t load_dmc_sprite_sheet(const animation_context_t& ctx, int index); } diff --git a/include/image_loader/dmx/load_images_dmx.h b/include/image_loader/dmx/load_images_dmx.h index 0d66da32..497fcb63 100644 --- a/include/image_loader/dmx/load_images_dmx.h +++ b/include/image_loader/dmx/load_images_dmx.h @@ -8,5 +8,5 @@ namespace bongocat::animation { struct animation_context_t; bongocat_error_t init_dmx_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); - [[nodiscard]] created_result_t load_dmx_sprite_sheet(const animation_context_t& ctx, int index); + [[nodiscard]] created_result_t load_dmx_sprite_sheet(const animation_context_t& ctx, int index); } diff --git a/include/image_loader/load_images.h b/include/image_loader/load_images.h index d6e851d7..c08324cd 100644 --- a/include/image_loader/load_images.h +++ b/include/image_loader/load_images.h @@ -88,8 +88,8 @@ namespace bongocat::animation { using get_sprite_callback_t = assets::embedded_image_t (*)(size_t); struct animation_context_t; - [[nodiscard]] created_result_t anim_sprite_sheet_from_embedded_images(get_sprite_callback_t get_sprite, size_t embedded_images_count); - [[nodiscard]] created_result_t load_sprite_sheet_anim(const config::config_t& config, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); + [[nodiscard]] created_result_t anim_sprite_sheet_from_embedded_images(get_sprite_callback_t get_sprite, size_t embedded_images_count); + [[nodiscard]] created_result_t load_sprite_sheet_anim(const config::config_t& config, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); } #endif \ No newline at end of file diff --git a/include/image_loader/min_dm/load_images_min_dm.h b/include/image_loader/min_dm/load_images_min_dm.h index f6fe9445..fc9f6c22 100644 --- a/include/image_loader/min_dm/load_images_min_dm.h +++ b/include/image_loader/min_dm/load_images_min_dm.h @@ -8,5 +8,5 @@ namespace bongocat::animation { struct animation_context_t; bongocat_error_t init_min_dm_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); - [[nodiscard]] created_result_t load_min_dm_sprite_sheet(const animation_context_t& ctx, int index); + [[nodiscard]] created_result_t load_min_dm_sprite_sheet(const animation_context_t& ctx, int index); } diff --git a/include/image_loader/ms_agent/load_images_ms_agent.h b/include/image_loader/ms_agent/load_images_ms_agent.h index e60d14fa..776341b4 100644 --- a/include/image_loader/ms_agent/load_images_ms_agent.h +++ b/include/image_loader/ms_agent/load_images_ms_agent.h @@ -3,12 +3,13 @@ #include "core/bongocat.h" #include "graphics/sprite_sheet.h" #include "embedded_assets/embedded_image.h" +#include "embedded_assets/ms_agent/ms_agent_sprite.h" namespace bongocat::animation { struct animation_context_t; [[nodiscard]] created_result_t load_ms_agent_sprite_sheet(const config::config_t& config, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); - [[nodiscard]] created_result_t load_ms_agent_anim(const animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); - created_result_t init_ms_agent_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); + [[nodiscard]] created_result_t load_ms_agent_anim(const animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows, const assets::ms_agent_animation_indices_t& animation_data); + created_result_t init_ms_agent_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows, const assets::ms_agent_animation_indices_t& animation_data); [[nodiscard]] created_result_t load_ms_agent_sprite_sheet(const animation_context_t& ctx, int index); } diff --git a/include/image_loader/pen/load_images_pen.h b/include/image_loader/pen/load_images_pen.h new file mode 100644 index 00000000..94dd7217 --- /dev/null +++ b/include/image_loader/pen/load_images_pen.h @@ -0,0 +1,12 @@ +#pragma once + +#include "core/bongocat.h" +#include "graphics/sprite_sheet.h" +#include "embedded_assets/embedded_image.h" + +namespace bongocat::animation { + struct animation_context_t; + bongocat_error_t init_pen_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); + + [[nodiscard]] created_result_t load_pen_sprite_sheet(const animation_context_t& ctx, int index); +} diff --git a/include/image_loader/pen20/load_images_pen20.h b/include/image_loader/pen20/load_images_pen20.h new file mode 100644 index 00000000..70156954 --- /dev/null +++ b/include/image_loader/pen20/load_images_pen20.h @@ -0,0 +1,12 @@ +#pragma once + +#include "core/bongocat.h" +#include "graphics/sprite_sheet.h" +#include "embedded_assets/embedded_image.h" + +namespace bongocat::animation { + struct animation_context_t; + bongocat_error_t init_pen20_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); + + [[nodiscard]] created_result_t load_pen20_sprite_sheet(const animation_context_t& ctx, int index); +} diff --git a/include/image_loader/pkmn/load_images_pkmn.h b/include/image_loader/pkmn/load_images_pkmn.h index 065f6101..93d0251a 100644 --- a/include/image_loader/pkmn/load_images_pkmn.h +++ b/include/image_loader/pkmn/load_images_pkmn.h @@ -6,9 +6,9 @@ namespace bongocat::animation { struct animation_context_t; - [[nodiscard]] created_result_t load_pkmn_anim(const animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); + [[nodiscard]] created_result_t load_pkmn_anim(const animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); bongocat_error_t init_pkmn_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows); - [[nodiscard]] created_result_t load_pkmn_sprite_sheet(const animation_context_t& ctx, int index); + [[nodiscard]] created_result_t load_pkmn_sprite_sheet(const animation_context_t& ctx, int index); } diff --git a/scripts/all_crop_spritesheets.sh b/scripts/all_crop_spritesheets.sh index b36de34a..a7c784c7 100755 --- a/scripts/all_crop_spritesheets.sh +++ b/scripts/all_crop_spritesheets.sh @@ -85,21 +85,36 @@ for FILE in "$INPUT_DIR"/*.png; do done -#INPUT_DIR="assets/input/pen20" -#OUTPUT_DIR="assets/pen20" -#for FILE in "$INPUT_DIR"/*.png; do -# BASENAME=$(basename "$FILE") -# echo "Processing: $BASENAME" -# -# "$SCRIPT" "$FILE" "$OUTPUT_DIR/$BASENAME" "$BOTTOM_PADDING" --frame-size "$FRAME_SIZE" --padding "$PADDING" -# -# if [[ $? -ne 0 ]]; then -# echo "Failed to process $FILE" -# else -# echo "Finished $FILE" -# fi -#done +INPUT_DIR="assets/input/pen" +OUTPUT_DIR="assets/pen" +for FILE in "$INPUT_DIR"/*.png; do + BASENAME=$(basename "$FILE") + echo "Processing: $BASENAME" + + "$SCRIPT" "$FILE" "$OUTPUT_DIR/$BASENAME" "$BOTTOM_PADDING" --frame-size "$FRAME_SIZE" --padding "$PADDING" + + if [[ $? -ne 0 ]]; then + echo "Failed to process $FILE" + else + echo "Finished $FILE" + fi +done + +INPUT_DIR="assets/input/pen20" +OUTPUT_DIR="assets/pen20" +for FILE in "$INPUT_DIR"/*.png; do + BASENAME=$(basename "$FILE") + echo "Processing: $BASENAME" + + "$SCRIPT" "$FILE" "$OUTPUT_DIR/$BASENAME" "$BOTTOM_PADDING" --frame-size "$FRAME_SIZE" --padding "$PADDING" + + if [[ $? -ne 0 ]]; then + echo "Failed to process $FILE" + else + echo "Finished $FILE" + fi +done INPUT_DIR="assets/input/all-colored" OUTPUT_DIR="assets/dmall" diff --git a/scripts/all_generate_embedded_assets.sh b/scripts/all_generate_embedded_assets.sh index cabe535e..e8a3d223 100755 --- a/scripts/all_generate_embedded_assets.sh +++ b/scripts/all_generate_embedded_assets.sh @@ -5,7 +5,8 @@ ./scripts/generate_embedded_assets.sh assets/dmc assets/input/dmc-fixed include/embedded_assets/dmc/dmc_images.h src/embedded_assets/dmc/dmc_images.c include/embedded_assets/dmc/dmc.hpp include/embedded_assets/dmc/dmc_sprite.h src/embedded_assets/dmc/dmc_get_sprite_sheet.cpp src/image_loader/dmc/dmc_load_sprite_sheet.cpp --frame-size 128 --set Dm ./scripts/generate_embedded_assets.sh assets/dmx assets/input/dmx include/embedded_assets/dmx/dmx_images.h src/embedded_assets/dmx/dmx_images.c include/embedded_assets/dmx/dmx.hpp include/embedded_assets/dmx/dmx_sprite.h src/embedded_assets/dmx/dmx_get_sprite_sheet.cpp src/image_loader/dmx/dmx_load_sprite_sheet.cpp --frame-size 128 --set Dm -#./scripts/generate_embedded_assets.sh assets/pen20 assets/input/pen20 include/embedded_assets/pen20/pen20_images.h src/embedded_assets/pen20/pen20_images.c include/embedded_assets/pen20/pen20.hpp include/embedded_assets/pen20/pen20_sprite.h src/embedded_assets/pen20/pen20_get_sprite_sheet.cpp src/image_loader/pen20/pen20_load_sprite_sheet.cpp --frame-size 128 --set Dm +./scripts/generate_embedded_assets.sh assets/pen assets/input/pen include/embedded_assets/pen/pen_images.h src/embedded_assets/pen/pen_images.c include/embedded_assets/pen/pen.hpp include/embedded_assets/pen/pen_sprite.h src/embedded_assets/pen/pen_get_sprite_sheet.cpp src/image_loader/pen/pen_load_sprite_sheet.cpp --frame-size 128 --set Dm +./scripts/generate_embedded_assets.sh assets/pen20 assets/input/pen20 include/embedded_assets/pen20/pen20_images.h src/embedded_assets/pen20/pen20_images.c include/embedded_assets/pen20/pen20.hpp include/embedded_assets/pen20/pen20_sprite.h src/embedded_assets/pen20/pen20_get_sprite_sheet.cpp src/image_loader/pen20/pen20_load_sprite_sheet.cpp --frame-size 128 --set Dm ./scripts/generate_embedded_assets.sh assets/dmall assets/input/all-colored include/embedded_assets/dmall/dmall_images.h src/embedded_assets/dmall/dmall_images.c include/embedded_assets/dmall/dmall.hpp include/embedded_assets/dmall/dmall_sprite.h src/embedded_assets/dmall/dmall_get_sprite_sheet.cpp src/image_loader/dmall/dmall_load_sprite_sheet.cpp --frame-size 128 --set Dm diff --git a/scripts/all_generate_init_anim_inl.sh b/scripts/all_generate_init_anim_inl.sh index 369d7b76..67b8198c 100755 --- a/scripts/all_generate_init_anim_inl.sh +++ b/scripts/all_generate_init_anim_inl.sh @@ -5,7 +5,8 @@ ./scripts/generate_init_anim_inl.sh assets/dmc src/embedded_assets/dmc ./include/embedded_assets/dmc/dmc_images.h dmc --set Dm ./scripts/generate_init_anim_inl.sh assets/dmx src/embedded_assets/dmx ./include/embedded_assets/dmx/dmx_images.h dmx --set Dm -#./scripts/generate_init_anim_inl.sh assets/pen20 src/embedded_assets/pen20 ./include/embedded_assets/pen20/pen20_images.h pen20 --set Dm +./scripts/generate_init_anim_inl.sh assets/pen src/embedded_assets/pen ./include/embedded_assets/pen/pen_images.h pen --set Dm +./scripts/generate_init_anim_inl.sh assets/pen20 src/embedded_assets/pen20 ./include/embedded_assets/pen20/pen20_images.h pen20 --set Dm --alt pen ./scripts/generate_init_anim_inl.sh assets/dmall src/embedded_assets/dmall ./include/embedded_assets/dmall/dmall_images.h dmall --set Dm --alt dmc diff --git a/scripts/test_bongocat.sh b/scripts/test_bongocat.sh index 0c486074..0b2e254f 100755 --- a/scripts/test_bongocat.sh +++ b/scripts/test_bongocat.sh @@ -57,8 +57,8 @@ toggle_config() { else new=10 fi + sed -i -E "s/^idle_sleep_timeout=[0-9]+/idle_sleep_timeout=$new/" "$CONFIG" echo "[TEST] Setting idle_sleep_timeout=$new" - #sed -i -E "s/^idle_sleep_timeout=[0-9]+/idle_sleep_timeout=$new/" "$CONFIG" } # --- modify config to trigger hot reload --- @@ -224,6 +224,12 @@ sed -i -E 's/^animation_name=.*/animation_name=dm20:Omegamon/' "$CONFIG" echo "[INFO] Send SIGUSR2" kill -USR2 "$PID" # Reload config sleep 2 +echo "[INFO] Set Sprite Sheet: pen20:Megalo Growmon" +sed -i -E 's/^invert_color=[0-9]+/invert_color=1/' "$CONFIG" +sed -i -E 's/^animation_name=.*/animation_name=pen20:Megalo Growmon/' "$CONFIG" +echo "[INFO] Send SIGUSR2" +kill -USR2 "$PID" # Reload config +sleep 2 echo "[INFO] Set Sprite Sheet: dmc:Omegamon" sed -i -E 's/^invert_color=[0-9]+/invert_color=0/' "$CONFIG" sed -i -E 's/^animation_name=.*/animation_name=dmc:Omegamon/' "$CONFIG" diff --git a/scripts/test_bongocat_2.sh b/scripts/test_bongocat_2.sh index 3a105ac4..a5521080 100755 --- a/scripts/test_bongocat_2.sh +++ b/scripts/test_bongocat_2.sh @@ -50,8 +50,8 @@ for group in relwithdebinfo-tsan debug-all-assets-preload debug relwithdebinfo; else new=10 fi + sed -i -E "s/^idle_sleep_timeout=[0-9]+/idle_sleep_timeout=$new/" "$CONFIG" echo "[TEST] Setting idle_sleep_timeout=$new" - #sed -i -E "s/^idle_sleep_timeout=[0-9]+/idle_sleep_timeout=$new/" "$CONFIG" } # --- modify config to trigger hot reload --- @@ -273,6 +273,12 @@ for group in relwithdebinfo-tsan debug-all-assets-preload debug relwithdebinfo; echo "[INFO] Send SIGUSR2" kill -USR2 "$PID" # Reload config sleep 2 + echo "[INFO] Set Sprite Sheet: pen20:Megalo Growmon" + sed -i -E 's/^invert_color=[0-9]+/invert_color=1/' "$CONFIG" + sed -i -E 's/^animation_name=.*/animation_name=pen20:Megalo Growmon/' "$CONFIG" + echo "[INFO] Send SIGUSR2" + kill -USR2 "$PID" # Reload config + sleep 2 echo "[INFO] Set Sprite Sheet: dmc:Omegamon" sed -i -E 's/^invert_color=[0-9]+/invert_color=0/' "$CONFIG" sed -i -E 's/^animation_name=.*/animation_name=dmc:Omegamon/' "$CONFIG" diff --git a/scripts/test_bongocat_5.sh b/scripts/test_bongocat_5.sh index b0552016..b55a7246 100755 --- a/scripts/test_bongocat_5.sh +++ b/scripts/test_bongocat_5.sh @@ -57,8 +57,8 @@ toggle_config() { else new=10 fi + sed -i -E "s/^idle_sleep_timeout=[0-9]+/idle_sleep_timeout=$new/" "$CONFIG" echo "[TEST] Setting idle_sleep_timeout=$new" - #sed -i -E "s/^idle_sleep_timeout=[0-9]+/idle_sleep_timeout=$new/" "$CONFIG" } # --- modify config to trigger hot reload --- @@ -270,24 +270,30 @@ sed -i -E 's/^update_rate=[0-9]+/update_rate=5000/' "$CONFIG" sed -i -E 's/^cpu_threshold=[0-9]+/cpu_threshold=50/' "$CONFIG" echo "[INFO] Enable Movement" sed -i -E 's/^cat_align=.*+/cat_align=center/' "$CONFIG" -sed -i -E 's/^animation_speed=[0-9]+/movement_radius=500/' "$CONFIG" +sed -i -E 's/^animation_speed=[0-9]+/animation_speed=500/' "$CONFIG" sed -i -E 's/^movement_radius=[0-9]+/movement_radius=960/' "$CONFIG" sed -i -E 's/^enable_movement_debug=[0-9]+/enable_movement_debug=0/' "$CONFIG" sed -i -E 's/^movement_speed=[0-9]+/movement_speed=30/' "$CONFIG" echo "[INFO] Send SIGUSR2" kill -USR2 "$PID" # Reload config -sleep 20 +sleep 10 +echo "[INFO] Enable idle animation" +sed -i -E 's/^idle_animation=[0-9]+/idle_animation=1/' "$CONFIG" +echo "[INFO] Send SIGUSR2" +kill -USR2 "$PID" # Reload config +sleep 15 echo "[INFO] Disable CPU threshold" sed -i -E 's/^update_rate=[0-9]+/update_rate=0/' "$CONFIG" sed -i -E 's/^cpu_threshold=[0-9]+/cpu_threshold=90/' "$CONFIG" echo "[INFO] Send SIGUSR2" kill -USR2 "$PID" # Reload config -sleep 1 +sleep 5 echo "[INFO] Disable Movement" sed -i -E 's/^movement_speed=[0-9]+/movement_speed=0/' "$CONFIG" +sed -i -E 's/^idle_animation=[0-9]+/idle_animation=0/' "$CONFIG" echo "[INFO] Send SIGUSR2" kill -USR2 "$PID" # Reload config -sleep 3 +sleep 5 # --- verify running --- diff --git a/scripts/update_sprites.sh b/scripts/update_sprites.sh index 59fa7ecf..6ecd89ad 100755 --- a/scripts/update_sprites.sh +++ b/scripts/update_sprites.sh @@ -5,6 +5,7 @@ mkdir -p ./assets/dm mkdir -p ./assets/dm20 mkdir -p ./assets/dmx mkdir -p ./assets/dmc +mkdir -p ./assets/pen mkdir -p ./assets/pen20 mkdir -p ./assets/dmall mkdir -p ./assets/pkmn @@ -13,6 +14,7 @@ touch ./assets/dm/.gitkeep touch ./assets/dm20/.gitkeep touch ./assets/dmx/.gitkeep touch ./assets/dmc/.gitkeep +touch ./assets/pen/.gitkeep touch ./assets/pen20/.gitkeep touch ./assets/dmall/.gitkeep touch ./assets/pkmn/.gitkeep @@ -21,6 +23,7 @@ rm ./assets./dm/*.png 2> /dev/null rm ./assets./dm20/*.png 2> /dev/null rm ./assets./dmx/*.png 2> /dev/null rm ./assets./dmc/*.png 2> /dev/null +rm ./assets./pen/*.png 2> /dev/null rm ./assets./pen20/*.png 2> /dev/null rm ./assets./dmall/*.png 2> /dev/null rm ./assets./pkmn/*.png 2> /dev/null @@ -28,6 +31,7 @@ rm ./assets./pkmn/*.png 2> /dev/null cp ./assets/input/dm/*.png ./assets/dm/. cp ./assets/input/dm20/*.png ./assets/dm20/. cp ./assets/input/dmx/*.png ./assets/dmx/. +cp ./assets/input/pen/*.png ./assets/pen/. cp ./assets/input/pen20/*.png ./assets/pen20/. cp ./assets/input/all-colored/*.png ./assets/dmall/. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0d874896..17574a4b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -101,12 +101,14 @@ target_compile_options(bongocat_base INTERFACE -ffunction-sections -fdata-sectio # @NOTE(assets): 2. add embedded_assets sub directory add_subdirectory(embedded_assets/bongocat) -add_subdirectory(embedded_assets/ms_agent) add_subdirectory(embedded_assets/dm) add_subdirectory(embedded_assets/dm20) -add_subdirectory(embedded_assets/dmc) add_subdirectory(embedded_assets/dmx) -add_subdirectory(embedded_assets/min_dm) +add_subdirectory(embedded_assets/pen) +add_subdirectory(embedded_assets/pen20) +add_subdirectory(embedded_assets/dmc) add_subdirectory(embedded_assets/dmall) +add_subdirectory(embedded_assets/min_dm) +add_subdirectory(embedded_assets/ms_agent) add_subdirectory(embedded_assets/pkmn) add_subdirectory(image_loader) \ No newline at end of file diff --git a/src/config/config.cpp b/src/config/config.cpp index a98ae286..67d748e0 100644 --- a/src/config/config.cpp +++ b/src/config/config.cpp @@ -21,15 +21,18 @@ #ifdef FEATURE_DM20_EMBEDDED_ASSETS #include "dm20_config_parse_animation_name.h" #endif -#ifdef FEATURE_PEN20_EMBEDDED_ASSETS -#include "pen20_config_parse_animation_name.h" -#endif #ifdef FEATURE_DMX_EMBEDDED_ASSETS #include "dmx_config_parse_animation_name.h" #endif #ifdef FEATURE_DMC_EMBEDDED_ASSETS #include "dmc_config_parse_animation_name.h" #endif +#ifdef FEATURE_PEN_EMBEDDED_ASSETS +#include "pen_config_parse_animation_name.h" +#endif +#ifdef FEATURE_PEN20_EMBEDDED_ASSETS +#include "pen20_config_parse_animation_name.h" +#endif #ifdef FEATURE_DMALL_EMBEDDED_ASSETS #include "dmall_config_parse_animation_name.h" #endif @@ -701,35 +704,46 @@ namespace bongocat::config { animation_found = config.animation_index >= 0; } #endif -#ifdef FEATURE_PEN20_EMBEDDED_ASSETS +#ifdef FEATURE_DMX_EMBEDDED_ASSETS // overwrite animation when not found or full name if ((!is_fqn && animation_found) || (is_fqn && !animation_found) || (!is_fqn && !animation_found)) { - const int found_index = config_parse_animation_name_pen20(config, value); + const int found_index = config_parse_animation_name_dmx(config, value); if (found_index >= 0) { assert(found_index >= 0); - BONGOCAT_LOG_DEBUG("Animation found for %s: %s", value, get_config_animation_name_pen20(static_cast(found_index)).fqname); + BONGOCAT_LOG_DEBUG("Animation found for %s: %s", value, get_config_animation_name_dmx(static_cast(found_index)).fqname); } animation_found = config.animation_index >= 0; } #endif -#ifdef FEATURE_DMX_EMBEDDED_ASSETS +#ifdef FEATURE_DMC_EMBEDDED_ASSETS // overwrite animation when not found or full name if ((!is_fqn && animation_found) || (is_fqn && !animation_found) || (!is_fqn && !animation_found)) { - const int found_index = config_parse_animation_name_dmx(config, value); + const int found_index = config_parse_animation_name_dmc(config, value); + if (found_index >= 0) { + assert(config.animation_index >= 0); + BONGOCAT_LOG_DEBUG("Animation found for %s: %s", value, get_config_animation_name_dmc(static_cast(found_index)).fqname); + } + animation_found = config.animation_index >= 0; + } +#endif +#ifdef FEATURE_PEN_EMBEDDED_ASSETS + // overwrite animation when not found or full name + if ((!is_fqn && animation_found) || (is_fqn && !animation_found) || (!is_fqn && !animation_found)) { + const int found_index = config_parse_animation_name_pen(config, value); if (found_index >= 0) { assert(found_index >= 0); - BONGOCAT_LOG_DEBUG("Animation found for %s: %s", value, get_config_animation_name_dmx(static_cast(found_index)).fqname); + BONGOCAT_LOG_DEBUG("Animation found for %s: %s", value, get_config_animation_name_pen(static_cast(found_index)).fqname); } animation_found = config.animation_index >= 0; } #endif -#ifdef FEATURE_DMC_EMBEDDED_ASSETS +#ifdef FEATURE_PEN20_EMBEDDED_ASSETS // overwrite animation when not found or full name if ((!is_fqn && animation_found) || (is_fqn && !animation_found) || (!is_fqn && !animation_found)) { - const int found_index = config_parse_animation_name_dmc(config, value); + const int found_index = config_parse_animation_name_pen20(config, value); if (found_index >= 0) { - assert(config.animation_index >= 0); - BONGOCAT_LOG_DEBUG("Animation found for %s: %s", value, get_config_animation_name_dmc(static_cast(found_index)).fqname); + assert(found_index >= 0); + BONGOCAT_LOG_DEBUG("Animation found for %s: %s", value, get_config_animation_name_pen20(static_cast(found_index)).fqname); } animation_found = config.animation_index >= 0; } diff --git a/src/core/main.cpp b/src/core/main.cpp index e0052c6e..878ace30 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -392,26 +392,31 @@ namespace bongocat { animation::trigger_update_config(*get_main_context().animation, get_main_context().config, new_gen); // Wait for both workers to catch up - get_main_context().input->config_updated.timedwait([&] { + int timedwait_result{0}; + timedwait_result |= get_main_context().input->config_updated.timedwait([&] { return !atomic_load(&get_main_context().input->_capture_input_running) || atomic_load(&get_main_context().input->config_seen_generation) >= new_gen; }, COND_RELOAD_CONFIG_TIMEOUT_MS); - get_main_context().update->config_updated.timedwait([&] { + timedwait_result |= get_main_context().update->config_updated.timedwait([&] { return !atomic_load(&get_main_context().update->_running) || atomic_load(&get_main_context().update->config_seen_generation) >= new_gen; }, COND_RELOAD_CONFIG_TIMEOUT_MS); - get_main_context().animation->anim.config_updated.timedwait([&] { + timedwait_result |= get_main_context().animation->anim.config_updated.timedwait([&] { return !atomic_load(&get_main_context().animation->anim._animation_running) || atomic_load(&get_main_context().animation->anim.config_seen_generation) >= new_gen; }, COND_RELOAD_CONFIG_TIMEOUT_MS); + // reset config internal state get_main_context().config._keep_old_animation_index = 0; - // fallback when cond hits timeout (sync config generations) - if (atomic_load(&get_main_context().input->_capture_input_running)) { - atomic_store(&get_main_context().input->config_seen_generation, new_gen); - } - if (atomic_load(&get_main_context().update->_running)) { - atomic_store(&get_main_context().update->config_seen_generation, new_gen); - } - if (atomic_load(&get_main_context().animation->anim._animation_running)) { - atomic_store(&get_main_context().animation->anim.config_seen_generation, new_gen); + if (timedwait_result != 0) { + // fallback when cond hits timeout (sync config generations) + if (atomic_load(&get_main_context().input->_capture_input_running)) { + atomic_store(&get_main_context().input->config_seen_generation, new_gen); + } + if (atomic_load(&get_main_context().update->_running)) { + atomic_store(&get_main_context().update->config_seen_generation, new_gen); + } + if (atomic_load(&get_main_context().animation->anim._animation_running)) { + atomic_store(&get_main_context().animation->anim.config_seen_generation, new_gen); + } + BONGOCAT_LOG_VERBOSE("timedwait timeouted, sync all config gen: %d", timedwait_result); } atomic_store(&get_main_context().config_generation, new_gen); @@ -699,6 +704,12 @@ namespace bongocat { if constexpr (features::EnableDmxEmbeddedAssets) { printf(" %8s - Digital Monster X\n", "dmx"); } + if constexpr (features::EnablePenEmbeddedAssets) { + printf(" %8s - Digimon Pendulum\n", "pen"); + } + if constexpr (features::EnablePen20EmbeddedAssets) { + printf(" %8s - Digimon Pendulum Ver.20th\n", "pen20"); + } if constexpr (features::EnableDmcEmbeddedAssets) { printf(" %8s - Digital Monster Color\n", "dmc"); } diff --git a/src/embedded_assets/ms_agent/ms_agent_images.c b/src/embedded_assets/ms_agent/ms_agent_images.c index 73c1b108..168aa572 100644 --- a/src/embedded_assets/ms_agent/ms_agent_images.c +++ b/src/embedded_assets/ms_agent/ms_agent_images.c @@ -3,24 +3,24 @@ // Embedded asset data const unsigned char clippy_png[] = { -#embed "../../../assets/clippy.png" +#embed "../../../assets/ms_agent/clippy.png" }; const size_t clippy_png_size = sizeof(clippy_png); #ifdef FEATURE_MORE_MS_AGENT_EMBEDDED_ASSETS const unsigned char links_png[] = { -#embed "../../../assets/links.png" +#embed "../../../assets/ms_agent/links.png" }; const size_t links_png_size = sizeof(links_png); const unsigned char rover_png[] = { -#embed "../../../assets/rover.png" +#embed "../../../assets/ms_agent/rover.png" }; const size_t rover_png_size = sizeof(rover_png); const unsigned char merlin_png[] = { -#embed "../../../assets/merlin.png" +#embed "../../../assets/ms_agent/merlin.png" }; const size_t merlin_png_size = sizeof(merlin_png); #endif diff --git a/src/embedded_assets/pen/CMakeLists.txt b/src/embedded_assets/pen/CMakeLists.txt new file mode 100644 index 00000000..6428a63e --- /dev/null +++ b/src/embedded_assets/pen/CMakeLists.txt @@ -0,0 +1,15 @@ +add_library(assets_pen_interface INTERFACE) +target_include_directories(assets_pen_interface INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include ${SRC_DIR}/embedded_assets/pen/include) + +add_library(assets_pen_feature INTERFACE) +target_compile_definitions(assets_pen_feature INTERFACE FEATURE_ENABLE_DM_EMBEDDED_ASSETS FEATURE_PEN_EMBEDDED_ASSETS) + +add_library(assets_pen STATIC) +target_sources(assets_pen PRIVATE pen_get_sprite_sheet.cpp pen_config_parse_animation_name.cpp pen_images.c) +target_compile_options(assets_pen PRIVATE -ffunction-sections -fdata-sections -fno-unroll-loops) +target_include_directories(assets_pen + PRIVATE ${INCLUDE_DIR}/embedded_assets/pen + PUBLIC ${INCLUDE_DIR}) +target_link_libraries(assets_pen + PUBLIC assets_pen_interface + PRIVATE assets_pen_feature bongocat_options) \ No newline at end of file diff --git a/src/embedded_assets/pen/include/pen_config_parse_animation_name.h b/src/embedded_assets/pen/include/pen_config_parse_animation_name.h new file mode 100644 index 00000000..53710efc --- /dev/null +++ b/src/embedded_assets/pen/include/pen_config_parse_animation_name.h @@ -0,0 +1,13 @@ +#ifndef BONGOCAT_EMBEDDED_ASSETS_CONFIG_PARSE_PEN_ANIMATION_NAME_H +#define BONGOCAT_EMBEDDED_ASSETS_CONFIG_PARSE_PEN_ANIMATION_NAME_H + +#include "config/config.h" +#include "embedded_assets/embedded_image.h" + +namespace bongocat::assets { + [[nodiscard]] extern config_animation_entry_t get_config_animation_name_pen(size_t i); + extern int config_parse_animation_name_pen(config::config_t& config, const char *value); +} + +#endif + diff --git a/src/embedded_assets/pen/include/pen_config_parse_enum_key.cpp.inl b/src/embedded_assets/pen/include/pen_config_parse_enum_key.cpp.inl new file mode 100644 index 00000000..6dcc75e3 --- /dev/null +++ b/src/embedded_assets/pen/include/pen_config_parse_enum_key.cpp.inl @@ -0,0 +1,819 @@ +// check for Aero V-dramon (aero_v_dramon) +if (strcmp(value, PEN_AERO_V_DRAMON_NAME) == 0 || + strcmp(value, PEN_AERO_V_DRAMON_ID) == 0 || + strcmp(value, PEN_AERO_V_DRAMON_FQID) == 0 || + strcmp(value, PEN_AERO_V_DRAMON_FQNAME) == 0) { + config.animation_index = PEN_AERO_V_DRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Angewomon (angewomon) +if (strcmp(value, PEN_ANGEWOMON_NAME) == 0 || + strcmp(value, PEN_ANGEWOMON_ID) == 0 || + strcmp(value, PEN_ANGEWOMON_FQID) == 0 || + strcmp(value, PEN_ANGEWOMON_FQNAME) == 0) { + config.animation_index = PEN_ANGEWOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Anomalocarimon (anomalocarimon) +if (strcmp(value, PEN_ANOMALOCARIMON_NAME) == 0 || + strcmp(value, PEN_ANOMALOCARIMON_ID) == 0 || + strcmp(value, PEN_ANOMALOCARIMON_FQID) == 0 || + strcmp(value, PEN_ANOMALOCARIMON_FQNAME) == 0) { + config.animation_index = PEN_ANOMALOCARIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Asuramon (asuramon) +if (strcmp(value, PEN_ASURAMON_NAME) == 0 || + strcmp(value, PEN_ASURAMON_ID) == 0 || + strcmp(value, PEN_ASURAMON_FQID) == 0 || + strcmp(value, PEN_ASURAMON_FQNAME) == 0) { + config.animation_index = PEN_ASURAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Atlur Kabuterimon (atlur_kabuterimon) +if (strcmp(value, PEN_ATLUR_KABUTERIMON_NAME) == 0 || + strcmp(value, PEN_ATLUR_KABUTERIMON_ID) == 0 || + strcmp(value, PEN_ATLUR_KABUTERIMON_FQID) == 0 || + strcmp(value, PEN_ATLUR_KABUTERIMON_FQNAME) == 0) { + config.animation_index = PEN_ATLUR_KABUTERIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Bakumon (bakumon) +if (strcmp(value, PEN_BAKUMON_NAME) == 0 || + strcmp(value, PEN_BAKUMON_ID) == 0 || + strcmp(value, PEN_BAKUMON_FQID) == 0 || + strcmp(value, PEN_BAKUMON_FQNAME) == 0) { + config.animation_index = PEN_BAKUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Big Mamemon (big_mamemon) +if (strcmp(value, PEN_BIG_MAMEMON_NAME) == 0 || + strcmp(value, PEN_BIG_MAMEMON_ID) == 0 || + strcmp(value, PEN_BIG_MAMEMON_FQID) == 0 || + strcmp(value, PEN_BIG_MAMEMON_FQNAME) == 0) { + config.animation_index = PEN_BIG_MAMEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Blossomon (blossomon) +if (strcmp(value, PEN_BLOSSOMON_NAME) == 0 || + strcmp(value, PEN_BLOSSOMON_ID) == 0 || + strcmp(value, PEN_BLOSSOMON_FQID) == 0 || + strcmp(value, PEN_BLOSSOMON_FQNAME) == 0) { + config.animation_index = PEN_BLOSSOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Boltmon (boltmon) +if (strcmp(value, PEN_BOLTMON_NAME) == 0 || + strcmp(value, PEN_BOLTMON_ID) == 0 || + strcmp(value, PEN_BOLTMON_FQID) == 0 || + strcmp(value, PEN_BOLTMON_FQNAME) == 0) { + config.animation_index = PEN_BOLTMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Bubbmon (bubbmon) +if (strcmp(value, PEN_BUBBMON_NAME) == 0 || + strcmp(value, PEN_BUBBMON_ID) == 0 || + strcmp(value, PEN_BUBBMON_FQID) == 0 || + strcmp(value, PEN_BUBBMON_FQNAME) == 0) { + config.animation_index = PEN_BUBBMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Candmon (candmon) +if (strcmp(value, PEN_CANDMON_NAME) == 0 || + strcmp(value, PEN_CANDMON_ID) == 0 || + strcmp(value, PEN_CANDMON_FQID) == 0 || + strcmp(value, PEN_CANDMON_FQNAME) == 0) { + config.animation_index = PEN_CANDMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Caprimon (caprimon) +if (strcmp(value, PEN_CAPRIMON_NAME) == 0 || + strcmp(value, PEN_CAPRIMON_ID) == 0 || + strcmp(value, PEN_CAPRIMON_FQID) == 0 || + strcmp(value, PEN_CAPRIMON_FQNAME) == 0) { + config.animation_index = PEN_CAPRIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Choromon (choromon) +if (strcmp(value, PEN_CHOROMON_NAME) == 0 || + strcmp(value, PEN_CHOROMON_ID) == 0 || + strcmp(value, PEN_CHOROMON_FQID) == 0 || + strcmp(value, PEN_CHOROMON_FQNAME) == 0) { + config.animation_index = PEN_CHOROMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Clockmon (clockmon) +if (strcmp(value, PEN_CLOCKMON_NAME) == 0 || + strcmp(value, PEN_CLOCKMON_ID) == 0 || + strcmp(value, PEN_CLOCKMON_FQID) == 0 || + strcmp(value, PEN_CLOCKMON_FQNAME) == 0) { + config.animation_index = PEN_CLOCKMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Cyberdramon (cyberdramon) +if (strcmp(value, PEN_CYBERDRAMON_NAME) == 0 || + strcmp(value, PEN_CYBERDRAMON_ID) == 0 || + strcmp(value, PEN_CYBERDRAMON_FQID) == 0 || + strcmp(value, PEN_CYBERDRAMON_FQNAME) == 0) { + config.animation_index = PEN_CYBERDRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Dagomon (dagomon) +if (strcmp(value, PEN_DAGOMON_NAME) == 0 || + strcmp(value, PEN_DAGOMON_ID) == 0 || + strcmp(value, PEN_DAGOMON_FQID) == 0 || + strcmp(value, PEN_DAGOMON_FQNAME) == 0) { + config.animation_index = PEN_DAGOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Death Meramon (death_meramon) +if (strcmp(value, PEN_DEATH_MERAMON_NAME) == 0 || + strcmp(value, PEN_DEATH_MERAMON_ID) == 0 || + strcmp(value, PEN_DEATH_MERAMON_FQID) == 0 || + strcmp(value, PEN_DEATH_MERAMON_FQNAME) == 0) { + config.animation_index = PEN_DEATH_MERAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Delumon (delumon) +if (strcmp(value, PEN_DELUMON_NAME) == 0 || + strcmp(value, PEN_DELUMON_ID) == 0 || + strcmp(value, PEN_DELUMON_FQID) == 0 || + strcmp(value, PEN_DELUMON_FQNAME) == 0) { + config.animation_index = PEN_DELUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Dokugumon (dokugumon) +if (strcmp(value, PEN_DOKUGUMON_NAME) == 0 || + strcmp(value, PEN_DOKUGUMON_ID) == 0 || + strcmp(value, PEN_DOKUGUMON_FQID) == 0 || + strcmp(value, PEN_DOKUGUMON_FQNAME) == 0) { + config.animation_index = PEN_DOKUGUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ebidramon (ebidramon) +if (strcmp(value, PEN_EBIDRAMON_NAME) == 0 || + strcmp(value, PEN_EBIDRAMON_ID) == 0 || + strcmp(value, PEN_EBIDRAMON_FQID) == 0 || + strcmp(value, PEN_EBIDRAMON_FQNAME) == 0) { + config.animation_index = PEN_EBIDRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Fantomon (fantomon) +if (strcmp(value, PEN_FANTOMON_NAME) == 0 || + strcmp(value, PEN_FANTOMON_ID) == 0 || + strcmp(value, PEN_FANTOMON_FQID) == 0 || + strcmp(value, PEN_FANTOMON_FQNAME) == 0) { + config.animation_index = PEN_FANTOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Floramon (floramon) +if (strcmp(value, PEN_FLORAMON_NAME) == 0 || + strcmp(value, PEN_FLORAMON_ID) == 0 || + strcmp(value, PEN_FLORAMON_FQID) == 0 || + strcmp(value, PEN_FLORAMON_FQNAME) == 0) { + config.animation_index = PEN_FLORAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ganimon (ganimon) +if (strcmp(value, PEN_GANIMON_NAME) == 0 || + strcmp(value, PEN_GANIMON_ID) == 0 || + strcmp(value, PEN_GANIMON_FQID) == 0 || + strcmp(value, PEN_GANIMON_FQNAME) == 0) { + config.animation_index = PEN_GANIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Garudamon (garudamon) +if (strcmp(value, PEN_GARUDAMON_NAME) == 0 || + strcmp(value, PEN_GARUDAMON_ID) == 0 || + strcmp(value, PEN_GARUDAMON_FQID) == 0 || + strcmp(value, PEN_GARUDAMON_FQNAME) == 0) { + config.animation_index = PEN_GARUDAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Gekomon (gekomon) +if (strcmp(value, PEN_GEKOMON_NAME) == 0 || + strcmp(value, PEN_GEKOMON_ID) == 0 || + strcmp(value, PEN_GEKOMON_FQID) == 0 || + strcmp(value, PEN_GEKOMON_FQNAME) == 0) { + config.animation_index = PEN_GEKOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Gerbemon (gerbemon) +if (strcmp(value, PEN_GERBEMON_NAME) == 0 || + strcmp(value, PEN_GERBEMON_ID) == 0 || + strcmp(value, PEN_GERBEMON_FQID) == 0 || + strcmp(value, PEN_GERBEMON_FQNAME) == 0) { + config.animation_index = PEN_GERBEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Gesomon (gesomon) +if (strcmp(value, PEN_GESOMON_NAME) == 0 || + strcmp(value, PEN_GESOMON_ID) == 0 || + strcmp(value, PEN_GESOMON_FQID) == 0 || + strcmp(value, PEN_GESOMON_FQNAME) == 0) { + config.animation_index = PEN_GESOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Gomamon (gomamon) +if (strcmp(value, PEN_GOMAMON_NAME) == 0 || + strcmp(value, PEN_GOMAMON_ID) == 0 || + strcmp(value, PEN_GOMAMON_FQID) == 0 || + strcmp(value, PEN_GOMAMON_FQNAME) == 0) { + config.animation_index = PEN_GOMAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Gottsumon (gottsumon) +if (strcmp(value, PEN_GOTTSUMON_NAME) == 0 || + strcmp(value, PEN_GOTTSUMON_ID) == 0 || + strcmp(value, PEN_GOTTSUMON_FQID) == 0 || + strcmp(value, PEN_GOTTSUMON_FQNAME) == 0) { + config.animation_index = PEN_GOTTSUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Griffomon (griffomon) +if (strcmp(value, PEN_GRIFFOMON_NAME) == 0 || + strcmp(value, PEN_GRIFFOMON_ID) == 0 || + strcmp(value, PEN_GRIFFOMON_FQID) == 0 || + strcmp(value, PEN_GRIFFOMON_FQNAME) == 0) { + config.animation_index = PEN_GRIFFOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Guardromon (guardromon) +if (strcmp(value, PEN_GUARDROMON_NAME) == 0 || + strcmp(value, PEN_GUARDROMON_ID) == 0 || + strcmp(value, PEN_GUARDROMON_FQID) == 0 || + strcmp(value, PEN_GUARDROMON_FQNAME) == 0) { + config.animation_index = PEN_GUARDROMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Hagurumon (hagurumon) +if (strcmp(value, PEN_HAGURUMON_NAME) == 0 || + strcmp(value, PEN_HAGURUMON_ID) == 0 || + strcmp(value, PEN_HAGURUMON_FQID) == 0 || + strcmp(value, PEN_HAGURUMON_FQNAME) == 0) { + config.animation_index = PEN_HAGURUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Hangymon (hangymon) +if (strcmp(value, PEN_HANGYMON_NAME) == 0 || + strcmp(value, PEN_HANGYMON_ID) == 0 || + strcmp(value, PEN_HANGYMON_FQID) == 0 || + strcmp(value, PEN_HANGYMON_FQNAME) == 0) { + config.animation_index = PEN_HANGYMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Hanumon (hanumon) +if (strcmp(value, PEN_HANUMON_NAME) == 0 || + strcmp(value, PEN_HANUMON_ID) == 0 || + strcmp(value, PEN_HANUMON_FQID) == 0 || + strcmp(value, PEN_HANUMON_FQNAME) == 0) { + config.animation_index = PEN_HANUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Herkule Kabuterimon (herkule_kabuterimon) +if (strcmp(value, PEN_HERKULE_KABUTERIMON_NAME) == 0 || + strcmp(value, PEN_HERKULE_KABUTERIMON_ID) == 0 || + strcmp(value, PEN_HERKULE_KABUTERIMON_FQID) == 0 || + strcmp(value, PEN_HERKULE_KABUTERIMON_FQNAME) == 0) { + config.animation_index = PEN_HERKULE_KABUTERIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Holy Angemon (holy_angemon) +if (strcmp(value, PEN_HOLY_ANGEMON_NAME) == 0 || + strcmp(value, PEN_HOLY_ANGEMON_ID) == 0 || + strcmp(value, PEN_HOLY_ANGEMON_FQID) == 0 || + strcmp(value, PEN_HOLY_ANGEMON_FQNAME) == 0) { + config.animation_index = PEN_HOLY_ANGEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Holydramon (holydramon) +if (strcmp(value, PEN_HOLYDRAMON_NAME) == 0 || + strcmp(value, PEN_HOLYDRAMON_ID) == 0 || + strcmp(value, PEN_HOLYDRAMON_FQID) == 0 || + strcmp(value, PEN_HOLYDRAMON_FQNAME) == 0) { + config.animation_index = PEN_HOLYDRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Hououmon (hououmon) +if (strcmp(value, PEN_HOUOUMON_NAME) == 0 || + strcmp(value, PEN_HOUOUMON_ID) == 0 || + strcmp(value, PEN_HOUOUMON_FQID) == 0 || + strcmp(value, PEN_HOUOUMON_FQNAME) == 0) { + config.animation_index = PEN_HOUOUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ignamon (ignamon) +if (strcmp(value, PEN_IGNAMON_NAME) == 0 || + strcmp(value, PEN_IGNAMON_ID) == 0 || + strcmp(value, PEN_IGNAMON_FQID) == 0 || + strcmp(value, PEN_IGNAMON_FQNAME) == 0) { + config.animation_index = PEN_IGNAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ikkakumon (ikkakumon) +if (strcmp(value, PEN_IKKAKUMON_NAME) == 0 || + strcmp(value, PEN_IKKAKUMON_ID) == 0 || + strcmp(value, PEN_IKKAKUMON_FQID) == 0 || + strcmp(value, PEN_IKKAKUMON_FQNAME) == 0) { + config.animation_index = PEN_IKKAKUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Jyagamon (jyagamon) +if (strcmp(value, PEN_JYAGAMON_NAME) == 0 || + strcmp(value, PEN_JYAGAMON_ID) == 0 || + strcmp(value, PEN_JYAGAMON_FQID) == 0 || + strcmp(value, PEN_JYAGAMON_FQNAME) == 0) { + config.animation_index = PEN_JYAGAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Jyureimon (jyureimon) +if (strcmp(value, PEN_JYUREIMON_NAME) == 0 || + strcmp(value, PEN_JYUREIMON_ID) == 0 || + strcmp(value, PEN_JYUREIMON_FQID) == 0 || + strcmp(value, PEN_JYUREIMON_FQNAME) == 0) { + config.animation_index = PEN_JYUREIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Kiwimon (kiwimon) +if (strcmp(value, PEN_KIWIMON_NAME) == 0 || + strcmp(value, PEN_KIWIMON_ID) == 0 || + strcmp(value, PEN_KIWIMON_FQID) == 0 || + strcmp(value, PEN_KIWIMON_FQNAME) == 0) { + config.animation_index = PEN_KIWIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Knightmon (knightmon) +if (strcmp(value, PEN_KNIGHTMON_NAME) == 0 || + strcmp(value, PEN_KNIGHTMON_ID) == 0 || + strcmp(value, PEN_KNIGHTMON_FQID) == 0 || + strcmp(value, PEN_KNIGHTMON_FQNAME) == 0) { + config.animation_index = PEN_KNIGHTMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Kokuwamon (kokuwamon) +if (strcmp(value, PEN_KOKUWAMON_NAME) == 0 || + strcmp(value, PEN_KOKUWAMON_ID) == 0 || + strcmp(value, PEN_KOKUWAMON_FQID) == 0 || + strcmp(value, PEN_KOKUWAMON_FQNAME) == 0) { + config.animation_index = PEN_KOKUWAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Lady Devimon (lady_devimon) +if (strcmp(value, PEN_LADY_DEVIMON_NAME) == 0 || + strcmp(value, PEN_LADY_DEVIMON_ID) == 0 || + strcmp(value, PEN_LADY_DEVIMON_FQID) == 0 || + strcmp(value, PEN_LADY_DEVIMON_FQNAME) == 0) { + config.animation_index = PEN_LADY_DEVIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Lilimon (lilimon) +if (strcmp(value, PEN_LILIMON_NAME) == 0 || + strcmp(value, PEN_LILIMON_ID) == 0 || + strcmp(value, PEN_LILIMON_FQID) == 0 || + strcmp(value, PEN_LILIMON_FQNAME) == 0) { + config.animation_index = PEN_LILIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mammon (mammon) +if (strcmp(value, PEN_MAMMON_NAME) == 0 || + strcmp(value, PEN_MAMMON_ID) == 0 || + strcmp(value, PEN_MAMMON_FQID) == 0 || + strcmp(value, PEN_MAMMON_FQNAME) == 0) { + config.animation_index = PEN_MAMMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Marin Angemon (marin_angemon) +if (strcmp(value, PEN_MARIN_ANGEMON_NAME) == 0 || + strcmp(value, PEN_MARIN_ANGEMON_ID) == 0 || + strcmp(value, PEN_MARIN_ANGEMON_FQID) == 0 || + strcmp(value, PEN_MARIN_ANGEMON_FQNAME) == 0) { + config.animation_index = PEN_MARIN_ANGEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Marin Devimon (marin_devimon) +if (strcmp(value, PEN_MARIN_DEVIMON_NAME) == 0 || + strcmp(value, PEN_MARIN_DEVIMON_ID) == 0 || + strcmp(value, PEN_MARIN_DEVIMON_FQID) == 0 || + strcmp(value, PEN_MARIN_DEVIMON_FQNAME) == 0) { + config.animation_index = PEN_MARIN_DEVIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mechanorimon (mechanorimon) +if (strcmp(value, PEN_MECHANORIMON_NAME) == 0 || + strcmp(value, PEN_MECHANORIMON_ID) == 0 || + strcmp(value, PEN_MECHANORIMON_FQID) == 0 || + strcmp(value, PEN_MECHANORIMON_FQNAME) == 0) { + config.animation_index = PEN_MECHANORIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mega Seadramon (mega_seadramon) +if (strcmp(value, PEN_MEGA_SEADRAMON_NAME) == 0 || + strcmp(value, PEN_MEGA_SEADRAMON_ID) == 0 || + strcmp(value, PEN_MEGA_SEADRAMON_FQID) == 0 || + strcmp(value, PEN_MEGA_SEADRAMON_FQNAME) == 0) { + config.animation_index = PEN_MEGA_SEADRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Metal Etemon (metal_etemon) +if (strcmp(value, PEN_METAL_ETEMON_NAME) == 0 || + strcmp(value, PEN_METAL_ETEMON_ID) == 0 || + strcmp(value, PEN_METAL_ETEMON_FQID) == 0 || + strcmp(value, PEN_METAL_ETEMON_FQNAME) == 0) { + config.animation_index = PEN_METAL_ETEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Metal Seadramon (metal_seadramon) +if (strcmp(value, PEN_METAL_SEADRAMON_NAME) == 0 || + strcmp(value, PEN_METAL_SEADRAMON_ID) == 0 || + strcmp(value, PEN_METAL_SEADRAMON_FQID) == 0 || + strcmp(value, PEN_METAL_SEADRAMON_FQNAME) == 0) { + config.animation_index = PEN_METAL_SEADRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mochimon (mochimon) +if (strcmp(value, PEN_MOCHIMON_NAME) == 0 || + strcmp(value, PEN_MOCHIMON_ID) == 0 || + strcmp(value, PEN_MOCHIMON_FQID) == 0 || + strcmp(value, PEN_MOCHIMON_FQNAME) == 0) { + config.animation_index = PEN_MOCHIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mokumon (mokumon) +if (strcmp(value, PEN_MOKUMON_NAME) == 0 || + strcmp(value, PEN_MOKUMON_ID) == 0 || + strcmp(value, PEN_MOKUMON_FQID) == 0 || + strcmp(value, PEN_MOKUMON_FQNAME) == 0) { + config.animation_index = PEN_MOKUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mushmon (mushmon) +if (strcmp(value, PEN_MUSHMON_NAME) == 0 || + strcmp(value, PEN_MUSHMON_ID) == 0 || + strcmp(value, PEN_MUSHMON_FQID) == 0 || + strcmp(value, PEN_MUSHMON_FQNAME) == 0) { + config.animation_index = PEN_MUSHMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Nyokimon (nyokimon) +if (strcmp(value, PEN_NYOKIMON_NAME) == 0 || + strcmp(value, PEN_NYOKIMON_ID) == 0 || + strcmp(value, PEN_NYOKIMON_FQID) == 0 || + strcmp(value, PEN_NYOKIMON_FQNAME) == 0) { + config.animation_index = PEN_NYOKIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Octmon (octmon) +if (strcmp(value, PEN_OCTMON_NAME) == 0 || + strcmp(value, PEN_OCTMON_ID) == 0 || + strcmp(value, PEN_OCTMON_FQID) == 0 || + strcmp(value, PEN_OCTMON_FQNAME) == 0) { + config.animation_index = PEN_OCTMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Okuwamon (okuwamon) +if (strcmp(value, PEN_OKUWAMON_NAME) == 0 || + strcmp(value, PEN_OKUWAMON_ID) == 0 || + strcmp(value, PEN_OKUWAMON_FQID) == 0 || + strcmp(value, PEN_OKUWAMON_FQNAME) == 0) { + config.animation_index = PEN_OKUWAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Otamamon (otamamon) +if (strcmp(value, PEN_OTAMAMON_NAME) == 0 || + strcmp(value, PEN_OTAMAMON_ID) == 0 || + strcmp(value, PEN_OTAMAMON_FQID) == 0 || + strcmp(value, PEN_OTAMAMON_FQNAME) == 0) { + config.animation_index = PEN_OTAMAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Peti Meramon (peti_meramon) +if (strcmp(value, PEN_PETI_MERAMON_NAME) == 0 || + strcmp(value, PEN_PETI_MERAMON_ID) == 0 || + strcmp(value, PEN_PETI_MERAMON_FQID) == 0 || + strcmp(value, PEN_PETI_MERAMON_FQNAME) == 0) { + config.animation_index = PEN_PETI_MERAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Pico Devimon (pico_devimon) +if (strcmp(value, PEN_PICO_DEVIMON_NAME) == 0 || + strcmp(value, PEN_PICO_DEVIMON_ID) == 0 || + strcmp(value, PEN_PICO_DEVIMON_FQID) == 0 || + strcmp(value, PEN_PICO_DEVIMON_FQNAME) == 0) { + config.animation_index = PEN_PICO_DEVIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Piemon (piemon) +if (strcmp(value, PEN_PIEMON_NAME) == 0 || + strcmp(value, PEN_PIEMON_ID) == 0 || + strcmp(value, PEN_PIEMON_FQID) == 0 || + strcmp(value, PEN_PIEMON_FQNAME) == 0) { + config.animation_index = PEN_PIEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Plesiomon (plesiomon) +if (strcmp(value, PEN_PLESIOMON_NAME) == 0 || + strcmp(value, PEN_PLESIOMON_ID) == 0 || + strcmp(value, PEN_PLESIOMON_FQID) == 0 || + strcmp(value, PEN_PLESIOMON_FQNAME) == 0) { + config.animation_index = PEN_PLESIOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Pukumon (pukumon) +if (strcmp(value, PEN_PUKUMON_NAME) == 0 || + strcmp(value, PEN_PUKUMON_ID) == 0 || + strcmp(value, PEN_PUKUMON_FQID) == 0 || + strcmp(value, PEN_PUKUMON_FQNAME) == 0) { + config.animation_index = PEN_PUKUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Pumpmon (pumpmon) +if (strcmp(value, PEN_PUMPMON_NAME) == 0 || + strcmp(value, PEN_PUMPMON_ID) == 0 || + strcmp(value, PEN_PUMPMON_FQID) == 0 || + strcmp(value, PEN_PUMPMON_FQNAME) == 0) { + config.animation_index = PEN_PUMPMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Pyocomon (pyocomon) +if (strcmp(value, PEN_PYOCOMON_NAME) == 0 || + strcmp(value, PEN_PYOCOMON_ID) == 0 || + strcmp(value, PEN_PYOCOMON_FQID) == 0 || + strcmp(value, PEN_PYOCOMON_FQNAME) == 0) { + config.animation_index = PEN_PYOCOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Rakamon (rakamon) +if (strcmp(value, PEN_RAKAMON_NAME) == 0 || + strcmp(value, PEN_RAKAMON_ID) == 0 || + strcmp(value, PEN_RAKAMON_FQID) == 0 || + strcmp(value, PEN_RAKAMON_FQNAME) == 0) { + config.animation_index = PEN_RAKAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Red Vegimon (red_vegimon) +if (strcmp(value, PEN_RED_VEGIMON_NAME) == 0 || + strcmp(value, PEN_RED_VEGIMON_ID) == 0 || + strcmp(value, PEN_RED_VEGIMON_FQID) == 0 || + strcmp(value, PEN_RED_VEGIMON_FQNAME) == 0) { + config.animation_index = PEN_RED_VEGIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Revolmon (revolmon) +if (strcmp(value, PEN_REVOLMON_NAME) == 0 || + strcmp(value, PEN_REVOLMON_ID) == 0 || + strcmp(value, PEN_REVOLMON_FQID) == 0 || + strcmp(value, PEN_REVOLMON_FQNAME) == 0) { + config.animation_index = PEN_REVOLMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Rosemon (rosemon) +if (strcmp(value, PEN_ROSEMON_NAME) == 0 || + strcmp(value, PEN_ROSEMON_ID) == 0 || + strcmp(value, PEN_ROSEMON_FQID) == 0 || + strcmp(value, PEN_ROSEMON_FQNAME) == 0) { + config.animation_index = PEN_ROSEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Saber Leomon (saber_leomon) +if (strcmp(value, PEN_SABER_LEOMON_NAME) == 0 || + strcmp(value, PEN_SABER_LEOMON_ID) == 0 || + strcmp(value, PEN_SABER_LEOMON_FQID) == 0 || + strcmp(value, PEN_SABER_LEOMON_FQNAME) == 0) { + config.animation_index = PEN_SABER_LEOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Shakomon (shakomon) +if (strcmp(value, PEN_SHAKOMON_NAME) == 0 || + strcmp(value, PEN_SHAKOMON_ID) == 0 || + strcmp(value, PEN_SHAKOMON_FQID) == 0 || + strcmp(value, PEN_SHAKOMON_FQNAME) == 0) { + config.animation_index = PEN_SHAKOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Starmon (starmon) +if (strcmp(value, PEN_STARMON_NAME) == 0 || + strcmp(value, PEN_STARMON_ID) == 0 || + strcmp(value, PEN_STARMON_FQID) == 0 || + strcmp(value, PEN_STARMON_FQNAME) == 0) { + config.animation_index = PEN_STARMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Tailmon (tailmon) +if (strcmp(value, PEN_TAILMON_NAME) == 0 || + strcmp(value, PEN_TAILMON_ID) == 0 || + strcmp(value, PEN_TAILMON_FQID) == 0 || + strcmp(value, PEN_TAILMON_FQNAME) == 0) { + config.animation_index = PEN_TAILMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Tankmon (tankmon) +if (strcmp(value, PEN_TANKMON_NAME) == 0 || + strcmp(value, PEN_TANKMON_ID) == 0 || + strcmp(value, PEN_TANKMON_FQID) == 0 || + strcmp(value, PEN_TANKMON_FQNAME) == 0) { + config.animation_index = PEN_TANKMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Tentomon (tentomon) +if (strcmp(value, PEN_TENTOMON_NAME) == 0 || + strcmp(value, PEN_TENTOMON_ID) == 0 || + strcmp(value, PEN_TENTOMON_FQID) == 0 || + strcmp(value, PEN_TENTOMON_FQNAME) == 0) { + config.animation_index = PEN_TENTOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Thunderballmon (thunderballmon) +if (strcmp(value, PEN_THUNDERBALLMON_NAME) == 0 || + strcmp(value, PEN_THUNDERBALLMON_ID) == 0 || + strcmp(value, PEN_THUNDERBALLMON_FQID) == 0 || + strcmp(value, PEN_THUNDERBALLMON_FQNAME) == 0) { + config.animation_index = PEN_THUNDERBALLMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Togemon (togemon) +if (strcmp(value, PEN_TOGEMON_NAME) == 0 || + strcmp(value, PEN_TOGEMON_ID) == 0 || + strcmp(value, PEN_TOGEMON_FQID) == 0 || + strcmp(value, PEN_TOGEMON_FQNAME) == 0) { + config.animation_index = PEN_TOGEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Tonosama Gekomon (tonosama_gekomon) +if (strcmp(value, PEN_TONOSAMA_GEKOMON_NAME) == 0 || + strcmp(value, PEN_TONOSAMA_GEKOMON_ID) == 0 || + strcmp(value, PEN_TONOSAMA_GEKOMON_FQID) == 0 || + strcmp(value, PEN_TONOSAMA_GEKOMON_FQNAME) == 0) { + config.animation_index = PEN_TONOSAMA_GEKOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Tortamon (tortamon) +if (strcmp(value, PEN_TORTAMON_NAME) == 0 || + strcmp(value, PEN_TORTAMON_ID) == 0 || + strcmp(value, PEN_TORTAMON_FQID) == 0 || + strcmp(value, PEN_TORTAMON_FQNAME) == 0) { + config.animation_index = PEN_TORTAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Toy Agumon (toy_agumon) +if (strcmp(value, PEN_TOY_AGUMON_NAME) == 0 || + strcmp(value, PEN_TOY_AGUMON_ID) == 0 || + strcmp(value, PEN_TOY_AGUMON_FQID) == 0 || + strcmp(value, PEN_TOY_AGUMON_FQNAME) == 0) { + config.animation_index = PEN_TOY_AGUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Triceramon (triceramon) +if (strcmp(value, PEN_TRICERAMON_NAME) == 0 || + strcmp(value, PEN_TRICERAMON_ID) == 0 || + strcmp(value, PEN_TRICERAMON_FQID) == 0 || + strcmp(value, PEN_TRICERAMON_FQNAME) == 0) { + config.animation_index = PEN_TRICERAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for V-dramon (v_dramon) +if (strcmp(value, PEN_V_DRAMON_NAME) == 0 || + strcmp(value, PEN_V_DRAMON_ID) == 0 || + strcmp(value, PEN_V_DRAMON_FQID) == 0 || + strcmp(value, PEN_V_DRAMON_FQNAME) == 0) { + config.animation_index = PEN_V_DRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Vemdemon (vemdemon) +if (strcmp(value, PEN_VEMDEMON_NAME) == 0 || + strcmp(value, PEN_VEMDEMON_ID) == 0 || + strcmp(value, PEN_VEMDEMON_FQID) == 0 || + strcmp(value, PEN_VEMDEMON_FQNAME) == 0) { + config.animation_index = PEN_VEMDEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Venom Vamdemon (venom_vamdemon) +if (strcmp(value, PEN_VENOM_VAMDEMON_NAME) == 0 || + strcmp(value, PEN_VENOM_VAMDEMON_ID) == 0 || + strcmp(value, PEN_VENOM_VAMDEMON_FQID) == 0 || + strcmp(value, PEN_VENOM_VAMDEMON_FQNAME) == 0) { + config.animation_index = PEN_VENOM_VAMDEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Waru Mozaemon (waru_mozaemon) +if (strcmp(value, PEN_WARU_MOZAEMON_NAME) == 0 || + strcmp(value, PEN_WARU_MOZAEMON_ID) == 0 || + strcmp(value, PEN_WARU_MOZAEMON_FQID) == 0 || + strcmp(value, PEN_WARU_MOZAEMON_FQNAME) == 0) { + config.animation_index = PEN_WARU_MOZAEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Wizarmon (wizarmon) +if (strcmp(value, PEN_WIZARMON_NAME) == 0 || + strcmp(value, PEN_WIZARMON_ID) == 0 || + strcmp(value, PEN_WIZARMON_FQID) == 0 || + strcmp(value, PEN_WIZARMON_FQNAME) == 0) { + config.animation_index = PEN_WIZARMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Woodmon (woodmon) +if (strcmp(value, PEN_WOODMON_NAME) == 0 || + strcmp(value, PEN_WOODMON_ID) == 0 || + strcmp(value, PEN_WOODMON_FQID) == 0 || + strcmp(value, PEN_WOODMON_FQNAME) == 0) { + config.animation_index = PEN_WOODMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Zudomom (zudomom) +if (strcmp(value, PEN_ZUDOMOM_NAME) == 0 || + strcmp(value, PEN_ZUDOMOM_ID) == 0 || + strcmp(value, PEN_ZUDOMOM_FQID) == 0 || + strcmp(value, PEN_ZUDOMOM_FQNAME) == 0) { + config.animation_index = PEN_ZUDOMOM_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} diff --git a/src/embedded_assets/pen/include/pen_init_dm_anim.cpp.inl b/src/embedded_assets/pen/include/pen_init_dm_anim.cpp.inl new file mode 100644 index 00000000..da3c6664 --- /dev/null +++ b/src/embedded_assets/pen/include/pen_init_dm_anim.cpp.inl @@ -0,0 +1,91 @@ +init_pen_anim(ctx, PEN_AERO_V_DRAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_AERO_V_DRAMON_ANIM_INDEX), PEN_AERO_V_DRAMON_SPRITE_SHEET_COLS, PEN_AERO_V_DRAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_ANGEWOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_ANGEWOMON_ANIM_INDEX), PEN_ANGEWOMON_SPRITE_SHEET_COLS, PEN_ANGEWOMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_ANOMALOCARIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_ANOMALOCARIMON_ANIM_INDEX), PEN_ANOMALOCARIMON_SPRITE_SHEET_COLS, PEN_ANOMALOCARIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_ASURAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_ASURAMON_ANIM_INDEX), PEN_ASURAMON_SPRITE_SHEET_COLS, PEN_ASURAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_ATLUR_KABUTERIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_ATLUR_KABUTERIMON_ANIM_INDEX), PEN_ATLUR_KABUTERIMON_SPRITE_SHEET_COLS, PEN_ATLUR_KABUTERIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_BAKUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_BAKUMON_ANIM_INDEX), PEN_BAKUMON_SPRITE_SHEET_COLS, PEN_BAKUMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_BIG_MAMEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_BIG_MAMEMON_ANIM_INDEX), PEN_BIG_MAMEMON_SPRITE_SHEET_COLS, PEN_BIG_MAMEMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_BLOSSOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_BLOSSOMON_ANIM_INDEX), PEN_BLOSSOMON_SPRITE_SHEET_COLS, PEN_BLOSSOMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_BOLTMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_BOLTMON_ANIM_INDEX), PEN_BOLTMON_SPRITE_SHEET_COLS, PEN_BOLTMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_BUBBMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_BUBBMON_ANIM_INDEX), PEN_BUBBMON_SPRITE_SHEET_COLS, PEN_BUBBMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_CANDMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_CANDMON_ANIM_INDEX), PEN_CANDMON_SPRITE_SHEET_COLS, PEN_CANDMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_CAPRIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_CAPRIMON_ANIM_INDEX), PEN_CAPRIMON_SPRITE_SHEET_COLS, PEN_CAPRIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_CHOROMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_CHOROMON_ANIM_INDEX), PEN_CHOROMON_SPRITE_SHEET_COLS, PEN_CHOROMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_CLOCKMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_CLOCKMON_ANIM_INDEX), PEN_CLOCKMON_SPRITE_SHEET_COLS, PEN_CLOCKMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_CYBERDRAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_CYBERDRAMON_ANIM_INDEX), PEN_CYBERDRAMON_SPRITE_SHEET_COLS, PEN_CYBERDRAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_DAGOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_DAGOMON_ANIM_INDEX), PEN_DAGOMON_SPRITE_SHEET_COLS, PEN_DAGOMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_DEATH_MERAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_DEATH_MERAMON_ANIM_INDEX), PEN_DEATH_MERAMON_SPRITE_SHEET_COLS, PEN_DEATH_MERAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_DELUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_DELUMON_ANIM_INDEX), PEN_DELUMON_SPRITE_SHEET_COLS, PEN_DELUMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_DOKUGUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_DOKUGUMON_ANIM_INDEX), PEN_DOKUGUMON_SPRITE_SHEET_COLS, PEN_DOKUGUMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_EBIDRAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_EBIDRAMON_ANIM_INDEX), PEN_EBIDRAMON_SPRITE_SHEET_COLS, PEN_EBIDRAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_FANTOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_FANTOMON_ANIM_INDEX), PEN_FANTOMON_SPRITE_SHEET_COLS, PEN_FANTOMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_FLORAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_FLORAMON_ANIM_INDEX), PEN_FLORAMON_SPRITE_SHEET_COLS, PEN_FLORAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_GANIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GANIMON_ANIM_INDEX), PEN_GANIMON_SPRITE_SHEET_COLS, PEN_GANIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_GARUDAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GARUDAMON_ANIM_INDEX), PEN_GARUDAMON_SPRITE_SHEET_COLS, PEN_GARUDAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_GEKOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GEKOMON_ANIM_INDEX), PEN_GEKOMON_SPRITE_SHEET_COLS, PEN_GEKOMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_GERBEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GERBEMON_ANIM_INDEX), PEN_GERBEMON_SPRITE_SHEET_COLS, PEN_GERBEMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_GESOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GESOMON_ANIM_INDEX), PEN_GESOMON_SPRITE_SHEET_COLS, PEN_GESOMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_GOMAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GOMAMON_ANIM_INDEX), PEN_GOMAMON_SPRITE_SHEET_COLS, PEN_GOMAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_GOTTSUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GOTTSUMON_ANIM_INDEX), PEN_GOTTSUMON_SPRITE_SHEET_COLS, PEN_GOTTSUMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_GRIFFOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GRIFFOMON_ANIM_INDEX), PEN_GRIFFOMON_SPRITE_SHEET_COLS, PEN_GRIFFOMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_GUARDROMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GUARDROMON_ANIM_INDEX), PEN_GUARDROMON_SPRITE_SHEET_COLS, PEN_GUARDROMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_HAGURUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_HAGURUMON_ANIM_INDEX), PEN_HAGURUMON_SPRITE_SHEET_COLS, PEN_HAGURUMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_HANGYMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_HANGYMON_ANIM_INDEX), PEN_HANGYMON_SPRITE_SHEET_COLS, PEN_HANGYMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_HANUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_HANUMON_ANIM_INDEX), PEN_HANUMON_SPRITE_SHEET_COLS, PEN_HANUMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_HERKULE_KABUTERIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_HERKULE_KABUTERIMON_ANIM_INDEX), PEN_HERKULE_KABUTERIMON_SPRITE_SHEET_COLS, PEN_HERKULE_KABUTERIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_HOLY_ANGEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_HOLY_ANGEMON_ANIM_INDEX), PEN_HOLY_ANGEMON_SPRITE_SHEET_COLS, PEN_HOLY_ANGEMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_HOLYDRAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_HOLYDRAMON_ANIM_INDEX), PEN_HOLYDRAMON_SPRITE_SHEET_COLS, PEN_HOLYDRAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_HOUOUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_HOUOUMON_ANIM_INDEX), PEN_HOUOUMON_SPRITE_SHEET_COLS, PEN_HOUOUMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_IGNAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_IGNAMON_ANIM_INDEX), PEN_IGNAMON_SPRITE_SHEET_COLS, PEN_IGNAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_IKKAKUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_IKKAKUMON_ANIM_INDEX), PEN_IKKAKUMON_SPRITE_SHEET_COLS, PEN_IKKAKUMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_JYAGAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_JYAGAMON_ANIM_INDEX), PEN_JYAGAMON_SPRITE_SHEET_COLS, PEN_JYAGAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_JYUREIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_JYUREIMON_ANIM_INDEX), PEN_JYUREIMON_SPRITE_SHEET_COLS, PEN_JYUREIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_KIWIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_KIWIMON_ANIM_INDEX), PEN_KIWIMON_SPRITE_SHEET_COLS, PEN_KIWIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_KNIGHTMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_KNIGHTMON_ANIM_INDEX), PEN_KNIGHTMON_SPRITE_SHEET_COLS, PEN_KNIGHTMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_KOKUWAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_KOKUWAMON_ANIM_INDEX), PEN_KOKUWAMON_SPRITE_SHEET_COLS, PEN_KOKUWAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_LADY_DEVIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_LADY_DEVIMON_ANIM_INDEX), PEN_LADY_DEVIMON_SPRITE_SHEET_COLS, PEN_LADY_DEVIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_LILIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_LILIMON_ANIM_INDEX), PEN_LILIMON_SPRITE_SHEET_COLS, PEN_LILIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_MAMMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MAMMON_ANIM_INDEX), PEN_MAMMON_SPRITE_SHEET_COLS, PEN_MAMMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_MARIN_ANGEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MARIN_ANGEMON_ANIM_INDEX), PEN_MARIN_ANGEMON_SPRITE_SHEET_COLS, PEN_MARIN_ANGEMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_MARIN_DEVIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MARIN_DEVIMON_ANIM_INDEX), PEN_MARIN_DEVIMON_SPRITE_SHEET_COLS, PEN_MARIN_DEVIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_MECHANORIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MECHANORIMON_ANIM_INDEX), PEN_MECHANORIMON_SPRITE_SHEET_COLS, PEN_MECHANORIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_MEGA_SEADRAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MEGA_SEADRAMON_ANIM_INDEX), PEN_MEGA_SEADRAMON_SPRITE_SHEET_COLS, PEN_MEGA_SEADRAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_METAL_ETEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_METAL_ETEMON_ANIM_INDEX), PEN_METAL_ETEMON_SPRITE_SHEET_COLS, PEN_METAL_ETEMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_METAL_SEADRAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_METAL_SEADRAMON_ANIM_INDEX), PEN_METAL_SEADRAMON_SPRITE_SHEET_COLS, PEN_METAL_SEADRAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_MOCHIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MOCHIMON_ANIM_INDEX), PEN_MOCHIMON_SPRITE_SHEET_COLS, PEN_MOCHIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_MOKUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MOKUMON_ANIM_INDEX), PEN_MOKUMON_SPRITE_SHEET_COLS, PEN_MOKUMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_MUSHMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MUSHMON_ANIM_INDEX), PEN_MUSHMON_SPRITE_SHEET_COLS, PEN_MUSHMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_NYOKIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_NYOKIMON_ANIM_INDEX), PEN_NYOKIMON_SPRITE_SHEET_COLS, PEN_NYOKIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_OCTMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_OCTMON_ANIM_INDEX), PEN_OCTMON_SPRITE_SHEET_COLS, PEN_OCTMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_OKUWAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_OKUWAMON_ANIM_INDEX), PEN_OKUWAMON_SPRITE_SHEET_COLS, PEN_OKUWAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_OTAMAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_OTAMAMON_ANIM_INDEX), PEN_OTAMAMON_SPRITE_SHEET_COLS, PEN_OTAMAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_PETI_MERAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_PETI_MERAMON_ANIM_INDEX), PEN_PETI_MERAMON_SPRITE_SHEET_COLS, PEN_PETI_MERAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_PICO_DEVIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_PICO_DEVIMON_ANIM_INDEX), PEN_PICO_DEVIMON_SPRITE_SHEET_COLS, PEN_PICO_DEVIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_PIEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_PIEMON_ANIM_INDEX), PEN_PIEMON_SPRITE_SHEET_COLS, PEN_PIEMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_PLESIOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_PLESIOMON_ANIM_INDEX), PEN_PLESIOMON_SPRITE_SHEET_COLS, PEN_PLESIOMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_PUKUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_PUKUMON_ANIM_INDEX), PEN_PUKUMON_SPRITE_SHEET_COLS, PEN_PUKUMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_PUMPMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_PUMPMON_ANIM_INDEX), PEN_PUMPMON_SPRITE_SHEET_COLS, PEN_PUMPMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_PYOCOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_PYOCOMON_ANIM_INDEX), PEN_PYOCOMON_SPRITE_SHEET_COLS, PEN_PYOCOMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_RAKAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_RAKAMON_ANIM_INDEX), PEN_RAKAMON_SPRITE_SHEET_COLS, PEN_RAKAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_RED_VEGIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_RED_VEGIMON_ANIM_INDEX), PEN_RED_VEGIMON_SPRITE_SHEET_COLS, PEN_RED_VEGIMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_REVOLMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_REVOLMON_ANIM_INDEX), PEN_REVOLMON_SPRITE_SHEET_COLS, PEN_REVOLMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_ROSEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_ROSEMON_ANIM_INDEX), PEN_ROSEMON_SPRITE_SHEET_COLS, PEN_ROSEMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_SABER_LEOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_SABER_LEOMON_ANIM_INDEX), PEN_SABER_LEOMON_SPRITE_SHEET_COLS, PEN_SABER_LEOMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_SHAKOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_SHAKOMON_ANIM_INDEX), PEN_SHAKOMON_SPRITE_SHEET_COLS, PEN_SHAKOMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_STARMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_STARMON_ANIM_INDEX), PEN_STARMON_SPRITE_SHEET_COLS, PEN_STARMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_TAILMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TAILMON_ANIM_INDEX), PEN_TAILMON_SPRITE_SHEET_COLS, PEN_TAILMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_TANKMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TANKMON_ANIM_INDEX), PEN_TANKMON_SPRITE_SHEET_COLS, PEN_TANKMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_TENTOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TENTOMON_ANIM_INDEX), PEN_TENTOMON_SPRITE_SHEET_COLS, PEN_TENTOMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_THUNDERBALLMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_THUNDERBALLMON_ANIM_INDEX), PEN_THUNDERBALLMON_SPRITE_SHEET_COLS, PEN_THUNDERBALLMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_TOGEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TOGEMON_ANIM_INDEX), PEN_TOGEMON_SPRITE_SHEET_COLS, PEN_TOGEMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_TONOSAMA_GEKOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TONOSAMA_GEKOMON_ANIM_INDEX), PEN_TONOSAMA_GEKOMON_SPRITE_SHEET_COLS, PEN_TONOSAMA_GEKOMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_TORTAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TORTAMON_ANIM_INDEX), PEN_TORTAMON_SPRITE_SHEET_COLS, PEN_TORTAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_TOY_AGUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TOY_AGUMON_ANIM_INDEX), PEN_TOY_AGUMON_SPRITE_SHEET_COLS, PEN_TOY_AGUMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_TRICERAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TRICERAMON_ANIM_INDEX), PEN_TRICERAMON_SPRITE_SHEET_COLS, PEN_TRICERAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_V_DRAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_V_DRAMON_ANIM_INDEX), PEN_V_DRAMON_SPRITE_SHEET_COLS, PEN_V_DRAMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_VEMDEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_VEMDEMON_ANIM_INDEX), PEN_VEMDEMON_SPRITE_SHEET_COLS, PEN_VEMDEMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_VENOM_VAMDEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_VENOM_VAMDEMON_ANIM_INDEX), PEN_VENOM_VAMDEMON_SPRITE_SHEET_COLS, PEN_VENOM_VAMDEMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_WARU_MOZAEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_WARU_MOZAEMON_ANIM_INDEX), PEN_WARU_MOZAEMON_SPRITE_SHEET_COLS, PEN_WARU_MOZAEMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_WIZARMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_WIZARMON_ANIM_INDEX), PEN_WIZARMON_SPRITE_SHEET_COLS, PEN_WIZARMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_WOODMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_WOODMON_ANIM_INDEX), PEN_WOODMON_SPRITE_SHEET_COLS, PEN_WOODMON_SPRITE_SHEET_ROWS); +init_pen_anim(ctx, PEN_ZUDOMOM_ANIM_INDEX, get_pen_sprite_sheet(PEN_ZUDOMOM_ANIM_INDEX), PEN_ZUDOMOM_SPRITE_SHEET_COLS, PEN_ZUDOMOM_SPRITE_SHEET_ROWS); diff --git a/src/embedded_assets/pen/pen_config_parse_animation_name.cpp b/src/embedded_assets/pen/pen_config_parse_animation_name.cpp new file mode 100644 index 00000000..5a3ed5b6 --- /dev/null +++ b/src/embedded_assets/pen/pen_config_parse_animation_name.cpp @@ -0,0 +1,123 @@ +#include "embedded_assets/embedded_image.h" +#include "embedded_assets/pen/pen.hpp" +#include "pen_config_parse_animation_name.h" + +namespace bongocat::assets { + static const config_animation_entry_t pen_animation_table[] = { + { PEN_AERO_V_DRAMON_NAME, PEN_AERO_V_DRAMON_ID, PEN_AERO_V_DRAMON_FQID, PEN_AERO_V_DRAMON_FQNAME, PEN_AERO_V_DRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_ANGEWOMON_NAME, PEN_ANGEWOMON_ID, PEN_ANGEWOMON_FQID, PEN_ANGEWOMON_FQNAME, PEN_ANGEWOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_ANOMALOCARIMON_NAME, PEN_ANOMALOCARIMON_ID, PEN_ANOMALOCARIMON_FQID, PEN_ANOMALOCARIMON_FQNAME, PEN_ANOMALOCARIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_ASURAMON_NAME, PEN_ASURAMON_ID, PEN_ASURAMON_FQID, PEN_ASURAMON_FQNAME, PEN_ASURAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_ATLUR_KABUTERIMON_NAME, PEN_ATLUR_KABUTERIMON_ID, PEN_ATLUR_KABUTERIMON_FQID, PEN_ATLUR_KABUTERIMON_FQNAME, PEN_ATLUR_KABUTERIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_BAKUMON_NAME, PEN_BAKUMON_ID, PEN_BAKUMON_FQID, PEN_BAKUMON_FQNAME, PEN_BAKUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_BIG_MAMEMON_NAME, PEN_BIG_MAMEMON_ID, PEN_BIG_MAMEMON_FQID, PEN_BIG_MAMEMON_FQNAME, PEN_BIG_MAMEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_BLOSSOMON_NAME, PEN_BLOSSOMON_ID, PEN_BLOSSOMON_FQID, PEN_BLOSSOMON_FQNAME, PEN_BLOSSOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_BOLTMON_NAME, PEN_BOLTMON_ID, PEN_BOLTMON_FQID, PEN_BOLTMON_FQNAME, PEN_BOLTMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_BUBBMON_NAME, PEN_BUBBMON_ID, PEN_BUBBMON_FQID, PEN_BUBBMON_FQNAME, PEN_BUBBMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_CANDMON_NAME, PEN_CANDMON_ID, PEN_CANDMON_FQID, PEN_CANDMON_FQNAME, PEN_CANDMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_CAPRIMON_NAME, PEN_CAPRIMON_ID, PEN_CAPRIMON_FQID, PEN_CAPRIMON_FQNAME, PEN_CAPRIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_CHOROMON_NAME, PEN_CHOROMON_ID, PEN_CHOROMON_FQID, PEN_CHOROMON_FQNAME, PEN_CHOROMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_CLOCKMON_NAME, PEN_CLOCKMON_ID, PEN_CLOCKMON_FQID, PEN_CLOCKMON_FQNAME, PEN_CLOCKMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_CYBERDRAMON_NAME, PEN_CYBERDRAMON_ID, PEN_CYBERDRAMON_FQID, PEN_CYBERDRAMON_FQNAME, PEN_CYBERDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_DAGOMON_NAME, PEN_DAGOMON_ID, PEN_DAGOMON_FQID, PEN_DAGOMON_FQNAME, PEN_DAGOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_DEATH_MERAMON_NAME, PEN_DEATH_MERAMON_ID, PEN_DEATH_MERAMON_FQID, PEN_DEATH_MERAMON_FQNAME, PEN_DEATH_MERAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_DELUMON_NAME, PEN_DELUMON_ID, PEN_DELUMON_FQID, PEN_DELUMON_FQNAME, PEN_DELUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_DOKUGUMON_NAME, PEN_DOKUGUMON_ID, PEN_DOKUGUMON_FQID, PEN_DOKUGUMON_FQNAME, PEN_DOKUGUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_EBIDRAMON_NAME, PEN_EBIDRAMON_ID, PEN_EBIDRAMON_FQID, PEN_EBIDRAMON_FQNAME, PEN_EBIDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_FANTOMON_NAME, PEN_FANTOMON_ID, PEN_FANTOMON_FQID, PEN_FANTOMON_FQNAME, PEN_FANTOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_FLORAMON_NAME, PEN_FLORAMON_ID, PEN_FLORAMON_FQID, PEN_FLORAMON_FQNAME, PEN_FLORAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_GANIMON_NAME, PEN_GANIMON_ID, PEN_GANIMON_FQID, PEN_GANIMON_FQNAME, PEN_GANIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_GARUDAMON_NAME, PEN_GARUDAMON_ID, PEN_GARUDAMON_FQID, PEN_GARUDAMON_FQNAME, PEN_GARUDAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_GEKOMON_NAME, PEN_GEKOMON_ID, PEN_GEKOMON_FQID, PEN_GEKOMON_FQNAME, PEN_GEKOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_GERBEMON_NAME, PEN_GERBEMON_ID, PEN_GERBEMON_FQID, PEN_GERBEMON_FQNAME, PEN_GERBEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_GESOMON_NAME, PEN_GESOMON_ID, PEN_GESOMON_FQID, PEN_GESOMON_FQNAME, PEN_GESOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_GOMAMON_NAME, PEN_GOMAMON_ID, PEN_GOMAMON_FQID, PEN_GOMAMON_FQNAME, PEN_GOMAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_GOTTSUMON_NAME, PEN_GOTTSUMON_ID, PEN_GOTTSUMON_FQID, PEN_GOTTSUMON_FQNAME, PEN_GOTTSUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_GRIFFOMON_NAME, PEN_GRIFFOMON_ID, PEN_GRIFFOMON_FQID, PEN_GRIFFOMON_FQNAME, PEN_GRIFFOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_GUARDROMON_NAME, PEN_GUARDROMON_ID, PEN_GUARDROMON_FQID, PEN_GUARDROMON_FQNAME, PEN_GUARDROMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_HAGURUMON_NAME, PEN_HAGURUMON_ID, PEN_HAGURUMON_FQID, PEN_HAGURUMON_FQNAME, PEN_HAGURUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_HANGYMON_NAME, PEN_HANGYMON_ID, PEN_HANGYMON_FQID, PEN_HANGYMON_FQNAME, PEN_HANGYMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_HANUMON_NAME, PEN_HANUMON_ID, PEN_HANUMON_FQID, PEN_HANUMON_FQNAME, PEN_HANUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_HERKULE_KABUTERIMON_NAME, PEN_HERKULE_KABUTERIMON_ID, PEN_HERKULE_KABUTERIMON_FQID, PEN_HERKULE_KABUTERIMON_FQNAME, PEN_HERKULE_KABUTERIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_HOLY_ANGEMON_NAME, PEN_HOLY_ANGEMON_ID, PEN_HOLY_ANGEMON_FQID, PEN_HOLY_ANGEMON_FQNAME, PEN_HOLY_ANGEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_HOLYDRAMON_NAME, PEN_HOLYDRAMON_ID, PEN_HOLYDRAMON_FQID, PEN_HOLYDRAMON_FQNAME, PEN_HOLYDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_HOUOUMON_NAME, PEN_HOUOUMON_ID, PEN_HOUOUMON_FQID, PEN_HOUOUMON_FQNAME, PEN_HOUOUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_IGNAMON_NAME, PEN_IGNAMON_ID, PEN_IGNAMON_FQID, PEN_IGNAMON_FQNAME, PEN_IGNAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_IKKAKUMON_NAME, PEN_IKKAKUMON_ID, PEN_IKKAKUMON_FQID, PEN_IKKAKUMON_FQNAME, PEN_IKKAKUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_JYAGAMON_NAME, PEN_JYAGAMON_ID, PEN_JYAGAMON_FQID, PEN_JYAGAMON_FQNAME, PEN_JYAGAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_JYUREIMON_NAME, PEN_JYUREIMON_ID, PEN_JYUREIMON_FQID, PEN_JYUREIMON_FQNAME, PEN_JYUREIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_KIWIMON_NAME, PEN_KIWIMON_ID, PEN_KIWIMON_FQID, PEN_KIWIMON_FQNAME, PEN_KIWIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_KNIGHTMON_NAME, PEN_KNIGHTMON_ID, PEN_KNIGHTMON_FQID, PEN_KNIGHTMON_FQNAME, PEN_KNIGHTMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_KOKUWAMON_NAME, PEN_KOKUWAMON_ID, PEN_KOKUWAMON_FQID, PEN_KOKUWAMON_FQNAME, PEN_KOKUWAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_LADY_DEVIMON_NAME, PEN_LADY_DEVIMON_ID, PEN_LADY_DEVIMON_FQID, PEN_LADY_DEVIMON_FQNAME, PEN_LADY_DEVIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_LILIMON_NAME, PEN_LILIMON_ID, PEN_LILIMON_FQID, PEN_LILIMON_FQNAME, PEN_LILIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_MAMMON_NAME, PEN_MAMMON_ID, PEN_MAMMON_FQID, PEN_MAMMON_FQNAME, PEN_MAMMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_MARIN_ANGEMON_NAME, PEN_MARIN_ANGEMON_ID, PEN_MARIN_ANGEMON_FQID, PEN_MARIN_ANGEMON_FQNAME, PEN_MARIN_ANGEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_MARIN_DEVIMON_NAME, PEN_MARIN_DEVIMON_ID, PEN_MARIN_DEVIMON_FQID, PEN_MARIN_DEVIMON_FQNAME, PEN_MARIN_DEVIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_MECHANORIMON_NAME, PEN_MECHANORIMON_ID, PEN_MECHANORIMON_FQID, PEN_MECHANORIMON_FQNAME, PEN_MECHANORIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_MEGA_SEADRAMON_NAME, PEN_MEGA_SEADRAMON_ID, PEN_MEGA_SEADRAMON_FQID, PEN_MEGA_SEADRAMON_FQNAME, PEN_MEGA_SEADRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_METAL_ETEMON_NAME, PEN_METAL_ETEMON_ID, PEN_METAL_ETEMON_FQID, PEN_METAL_ETEMON_FQNAME, PEN_METAL_ETEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_METAL_SEADRAMON_NAME, PEN_METAL_SEADRAMON_ID, PEN_METAL_SEADRAMON_FQID, PEN_METAL_SEADRAMON_FQNAME, PEN_METAL_SEADRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_MOCHIMON_NAME, PEN_MOCHIMON_ID, PEN_MOCHIMON_FQID, PEN_MOCHIMON_FQNAME, PEN_MOCHIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_MOKUMON_NAME, PEN_MOKUMON_ID, PEN_MOKUMON_FQID, PEN_MOKUMON_FQNAME, PEN_MOKUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_MUSHMON_NAME, PEN_MUSHMON_ID, PEN_MUSHMON_FQID, PEN_MUSHMON_FQNAME, PEN_MUSHMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_NYOKIMON_NAME, PEN_NYOKIMON_ID, PEN_NYOKIMON_FQID, PEN_NYOKIMON_FQNAME, PEN_NYOKIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_OCTMON_NAME, PEN_OCTMON_ID, PEN_OCTMON_FQID, PEN_OCTMON_FQNAME, PEN_OCTMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_OKUWAMON_NAME, PEN_OKUWAMON_ID, PEN_OKUWAMON_FQID, PEN_OKUWAMON_FQNAME, PEN_OKUWAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_OTAMAMON_NAME, PEN_OTAMAMON_ID, PEN_OTAMAMON_FQID, PEN_OTAMAMON_FQNAME, PEN_OTAMAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_PETI_MERAMON_NAME, PEN_PETI_MERAMON_ID, PEN_PETI_MERAMON_FQID, PEN_PETI_MERAMON_FQNAME, PEN_PETI_MERAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_PICO_DEVIMON_NAME, PEN_PICO_DEVIMON_ID, PEN_PICO_DEVIMON_FQID, PEN_PICO_DEVIMON_FQNAME, PEN_PICO_DEVIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_PIEMON_NAME, PEN_PIEMON_ID, PEN_PIEMON_FQID, PEN_PIEMON_FQNAME, PEN_PIEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_PLESIOMON_NAME, PEN_PLESIOMON_ID, PEN_PLESIOMON_FQID, PEN_PLESIOMON_FQNAME, PEN_PLESIOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_PUKUMON_NAME, PEN_PUKUMON_ID, PEN_PUKUMON_FQID, PEN_PUKUMON_FQNAME, PEN_PUKUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_PUMPMON_NAME, PEN_PUMPMON_ID, PEN_PUMPMON_FQID, PEN_PUMPMON_FQNAME, PEN_PUMPMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_PYOCOMON_NAME, PEN_PYOCOMON_ID, PEN_PYOCOMON_FQID, PEN_PYOCOMON_FQNAME, PEN_PYOCOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_RAKAMON_NAME, PEN_RAKAMON_ID, PEN_RAKAMON_FQID, PEN_RAKAMON_FQNAME, PEN_RAKAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_RED_VEGIMON_NAME, PEN_RED_VEGIMON_ID, PEN_RED_VEGIMON_FQID, PEN_RED_VEGIMON_FQNAME, PEN_RED_VEGIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_REVOLMON_NAME, PEN_REVOLMON_ID, PEN_REVOLMON_FQID, PEN_REVOLMON_FQNAME, PEN_REVOLMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_ROSEMON_NAME, PEN_ROSEMON_ID, PEN_ROSEMON_FQID, PEN_ROSEMON_FQNAME, PEN_ROSEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_SABER_LEOMON_NAME, PEN_SABER_LEOMON_ID, PEN_SABER_LEOMON_FQID, PEN_SABER_LEOMON_FQNAME, PEN_SABER_LEOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_SHAKOMON_NAME, PEN_SHAKOMON_ID, PEN_SHAKOMON_FQID, PEN_SHAKOMON_FQNAME, PEN_SHAKOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_STARMON_NAME, PEN_STARMON_ID, PEN_STARMON_FQID, PEN_STARMON_FQNAME, PEN_STARMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_TAILMON_NAME, PEN_TAILMON_ID, PEN_TAILMON_FQID, PEN_TAILMON_FQNAME, PEN_TAILMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_TANKMON_NAME, PEN_TANKMON_ID, PEN_TANKMON_FQID, PEN_TANKMON_FQNAME, PEN_TANKMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_TENTOMON_NAME, PEN_TENTOMON_ID, PEN_TENTOMON_FQID, PEN_TENTOMON_FQNAME, PEN_TENTOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_THUNDERBALLMON_NAME, PEN_THUNDERBALLMON_ID, PEN_THUNDERBALLMON_FQID, PEN_THUNDERBALLMON_FQNAME, PEN_THUNDERBALLMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_TOGEMON_NAME, PEN_TOGEMON_ID, PEN_TOGEMON_FQID, PEN_TOGEMON_FQNAME, PEN_TOGEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_TONOSAMA_GEKOMON_NAME, PEN_TONOSAMA_GEKOMON_ID, PEN_TONOSAMA_GEKOMON_FQID, PEN_TONOSAMA_GEKOMON_FQNAME, PEN_TONOSAMA_GEKOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_TORTAMON_NAME, PEN_TORTAMON_ID, PEN_TORTAMON_FQID, PEN_TORTAMON_FQNAME, PEN_TORTAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_TOY_AGUMON_NAME, PEN_TOY_AGUMON_ID, PEN_TOY_AGUMON_FQID, PEN_TOY_AGUMON_FQNAME, PEN_TOY_AGUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_TRICERAMON_NAME, PEN_TRICERAMON_ID, PEN_TRICERAMON_FQID, PEN_TRICERAMON_FQNAME, PEN_TRICERAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_V_DRAMON_NAME, PEN_V_DRAMON_ID, PEN_V_DRAMON_FQID, PEN_V_DRAMON_FQNAME, PEN_V_DRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_VEMDEMON_NAME, PEN_VEMDEMON_ID, PEN_VEMDEMON_FQID, PEN_VEMDEMON_FQNAME, PEN_VEMDEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_VENOM_VAMDEMON_NAME, PEN_VENOM_VAMDEMON_ID, PEN_VENOM_VAMDEMON_FQID, PEN_VENOM_VAMDEMON_FQNAME, PEN_VENOM_VAMDEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_WARU_MOZAEMON_NAME, PEN_WARU_MOZAEMON_ID, PEN_WARU_MOZAEMON_FQID, PEN_WARU_MOZAEMON_FQNAME, PEN_WARU_MOZAEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_WIZARMON_NAME, PEN_WIZARMON_ID, PEN_WIZARMON_FQID, PEN_WIZARMON_FQNAME, PEN_WIZARMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_WOODMON_NAME, PEN_WOODMON_ID, PEN_WOODMON_FQID, PEN_WOODMON_FQNAME, PEN_WOODMON_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN_ZUDOMOM_NAME, PEN_ZUDOMOM_ID, PEN_ZUDOMOM_FQID, PEN_ZUDOMOM_FQNAME, PEN_ZUDOMOM_ANIM_INDEX, config::config_animation_dm_set_t::pen, config::config_animation_sprite_sheet_layout_t::Dm }, + }; + + config_animation_entry_t get_config_animation_name_pen(size_t index) { + for (const auto& entry : pen_animation_table) { + assert(entry.anim_index >= 0); + if (static_cast(entry.anim_index) == index) return entry; + } + return pen_animation_table[index]; + } + + int config_parse_animation_name_pen(config::config_t& config, const char *value) { + for (const auto& entry : pen_animation_table) { + if (strcmp(value, entry.name) == 0 || + strcmp(value, entry.id) == 0 || + strcmp(value, entry.fqid) == 0 || + strcmp(value, entry.fqname) == 0) { + config.animation_index = entry.anim_index; + config.animation_dm_set = entry.set; + config.animation_sprite_sheet_layout = entry.layout; + return entry.anim_index; + } + } + return -1; + } +} + diff --git a/src/embedded_assets/pen/pen_get_sprite_sheet.cpp b/src/embedded_assets/pen/pen_get_sprite_sheet.cpp new file mode 100644 index 00000000..22e28db0 --- /dev/null +++ b/src/embedded_assets/pen/pen_get_sprite_sheet.cpp @@ -0,0 +1,105 @@ +#include "embedded_assets/embedded_image.h" +#include "embedded_assets/pen/pen.hpp" +#include "embedded_assets/pen/pen_images.h" +#include "embedded_assets/pen/pen_sprite.h" + +namespace bongocat::assets { + embedded_image_t get_pen_sprite_sheet(size_t index) { + switch (index) { + case PEN_AERO_V_DRAMON_ANIM_INDEX: return {pen_aero_v_dramon_png, pen_aero_v_dramon_png_size, "aero_v_dramon"}; + case PEN_ANGEWOMON_ANIM_INDEX: return {pen_angewomon_png, pen_angewomon_png_size, "angewomon"}; + case PEN_ANOMALOCARIMON_ANIM_INDEX: return {pen_anomalocarimon_png, pen_anomalocarimon_png_size, "anomalocarimon"}; + case PEN_ASURAMON_ANIM_INDEX: return {pen_asuramon_png, pen_asuramon_png_size, "asuramon"}; + case PEN_ATLUR_KABUTERIMON_ANIM_INDEX: return {pen_atlur_kabuterimon_png, pen_atlur_kabuterimon_png_size, "atlur_kabuterimon"}; + case PEN_BAKUMON_ANIM_INDEX: return {pen_bakumon_png, pen_bakumon_png_size, "bakumon"}; + case PEN_BIG_MAMEMON_ANIM_INDEX: return {pen_big_mamemon_png, pen_big_mamemon_png_size, "big_mamemon"}; + case PEN_BLOSSOMON_ANIM_INDEX: return {pen_blossomon_png, pen_blossomon_png_size, "blossomon"}; + case PEN_BOLTMON_ANIM_INDEX: return {pen_boltmon_png, pen_boltmon_png_size, "boltmon"}; + case PEN_BUBBMON_ANIM_INDEX: return {pen_bubbmon_png, pen_bubbmon_png_size, "bubbmon"}; + case PEN_CANDMON_ANIM_INDEX: return {pen_candmon_png, pen_candmon_png_size, "candmon"}; + case PEN_CAPRIMON_ANIM_INDEX: return {pen_caprimon_png, pen_caprimon_png_size, "caprimon"}; + case PEN_CHOROMON_ANIM_INDEX: return {pen_choromon_png, pen_choromon_png_size, "choromon"}; + case PEN_CLOCKMON_ANIM_INDEX: return {pen_clockmon_png, pen_clockmon_png_size, "clockmon"}; + case PEN_CYBERDRAMON_ANIM_INDEX: return {pen_cyberdramon_png, pen_cyberdramon_png_size, "cyberdramon"}; + case PEN_DAGOMON_ANIM_INDEX: return {pen_dagomon_png, pen_dagomon_png_size, "dagomon"}; + case PEN_DEATH_MERAMON_ANIM_INDEX: return {pen_death_meramon_png, pen_death_meramon_png_size, "death_meramon"}; + case PEN_DELUMON_ANIM_INDEX: return {pen_delumon_png, pen_delumon_png_size, "delumon"}; + case PEN_DOKUGUMON_ANIM_INDEX: return {pen_dokugumon_png, pen_dokugumon_png_size, "dokugumon"}; + case PEN_EBIDRAMON_ANIM_INDEX: return {pen_ebidramon_png, pen_ebidramon_png_size, "ebidramon"}; + case PEN_FANTOMON_ANIM_INDEX: return {pen_fantomon_png, pen_fantomon_png_size, "fantomon"}; + case PEN_FLORAMON_ANIM_INDEX: return {pen_floramon_png, pen_floramon_png_size, "floramon"}; + case PEN_GANIMON_ANIM_INDEX: return {pen_ganimon_png, pen_ganimon_png_size, "ganimon"}; + case PEN_GARUDAMON_ANIM_INDEX: return {pen_garudamon_png, pen_garudamon_png_size, "garudamon"}; + case PEN_GEKOMON_ANIM_INDEX: return {pen_gekomon_png, pen_gekomon_png_size, "gekomon"}; + case PEN_GERBEMON_ANIM_INDEX: return {pen_gerbemon_png, pen_gerbemon_png_size, "gerbemon"}; + case PEN_GESOMON_ANIM_INDEX: return {pen_gesomon_png, pen_gesomon_png_size, "gesomon"}; + case PEN_GOMAMON_ANIM_INDEX: return {pen_gomamon_png, pen_gomamon_png_size, "gomamon"}; + case PEN_GOTTSUMON_ANIM_INDEX: return {pen_gottsumon_png, pen_gottsumon_png_size, "gottsumon"}; + case PEN_GRIFFOMON_ANIM_INDEX: return {pen_griffomon_png, pen_griffomon_png_size, "griffomon"}; + case PEN_GUARDROMON_ANIM_INDEX: return {pen_guardromon_png, pen_guardromon_png_size, "guardromon"}; + case PEN_HAGURUMON_ANIM_INDEX: return {pen_hagurumon_png, pen_hagurumon_png_size, "hagurumon"}; + case PEN_HANGYMON_ANIM_INDEX: return {pen_hangymon_png, pen_hangymon_png_size, "hangymon"}; + case PEN_HANUMON_ANIM_INDEX: return {pen_hanumon_png, pen_hanumon_png_size, "hanumon"}; + case PEN_HERKULE_KABUTERIMON_ANIM_INDEX: return {pen_herkule_kabuterimon_png, pen_herkule_kabuterimon_png_size, "herkule_kabuterimon"}; + case PEN_HOLY_ANGEMON_ANIM_INDEX: return {pen_holy_angemon_png, pen_holy_angemon_png_size, "holy_angemon"}; + case PEN_HOLYDRAMON_ANIM_INDEX: return {pen_holydramon_png, pen_holydramon_png_size, "holydramon"}; + case PEN_HOUOUMON_ANIM_INDEX: return {pen_hououmon_png, pen_hououmon_png_size, "hououmon"}; + case PEN_IGNAMON_ANIM_INDEX: return {pen_ignamon_png, pen_ignamon_png_size, "ignamon"}; + case PEN_IKKAKUMON_ANIM_INDEX: return {pen_ikkakumon_png, pen_ikkakumon_png_size, "ikkakumon"}; + case PEN_JYAGAMON_ANIM_INDEX: return {pen_jyagamon_png, pen_jyagamon_png_size, "jyagamon"}; + case PEN_JYUREIMON_ANIM_INDEX: return {pen_jyureimon_png, pen_jyureimon_png_size, "jyureimon"}; + case PEN_KIWIMON_ANIM_INDEX: return {pen_kiwimon_png, pen_kiwimon_png_size, "kiwimon"}; + case PEN_KNIGHTMON_ANIM_INDEX: return {pen_knightmon_png, pen_knightmon_png_size, "knightmon"}; + case PEN_KOKUWAMON_ANIM_INDEX: return {pen_kokuwamon_png, pen_kokuwamon_png_size, "kokuwamon"}; + case PEN_LADY_DEVIMON_ANIM_INDEX: return {pen_lady_devimon_png, pen_lady_devimon_png_size, "lady_devimon"}; + case PEN_LILIMON_ANIM_INDEX: return {pen_lilimon_png, pen_lilimon_png_size, "lilimon"}; + case PEN_MAMMON_ANIM_INDEX: return {pen_mammon_png, pen_mammon_png_size, "mammon"}; + case PEN_MARIN_ANGEMON_ANIM_INDEX: return {pen_marin_angemon_png, pen_marin_angemon_png_size, "marin_angemon"}; + case PEN_MARIN_DEVIMON_ANIM_INDEX: return {pen_marin_devimon_png, pen_marin_devimon_png_size, "marin_devimon"}; + case PEN_MECHANORIMON_ANIM_INDEX: return {pen_mechanorimon_png, pen_mechanorimon_png_size, "mechanorimon"}; + case PEN_MEGA_SEADRAMON_ANIM_INDEX: return {pen_mega_seadramon_png, pen_mega_seadramon_png_size, "mega_seadramon"}; + case PEN_METAL_ETEMON_ANIM_INDEX: return {pen_metal_etemon_png, pen_metal_etemon_png_size, "metal_etemon"}; + case PEN_METAL_SEADRAMON_ANIM_INDEX: return {pen_metal_seadramon_png, pen_metal_seadramon_png_size, "metal_seadramon"}; + case PEN_MOCHIMON_ANIM_INDEX: return {pen_mochimon_png, pen_mochimon_png_size, "mochimon"}; + case PEN_MOKUMON_ANIM_INDEX: return {pen_mokumon_png, pen_mokumon_png_size, "mokumon"}; + case PEN_MUSHMON_ANIM_INDEX: return {pen_mushmon_png, pen_mushmon_png_size, "mushmon"}; + case PEN_NYOKIMON_ANIM_INDEX: return {pen_nyokimon_png, pen_nyokimon_png_size, "nyokimon"}; + case PEN_OCTMON_ANIM_INDEX: return {pen_octmon_png, pen_octmon_png_size, "octmon"}; + case PEN_OKUWAMON_ANIM_INDEX: return {pen_okuwamon_png, pen_okuwamon_png_size, "okuwamon"}; + case PEN_OTAMAMON_ANIM_INDEX: return {pen_otamamon_png, pen_otamamon_png_size, "otamamon"}; + case PEN_PETI_MERAMON_ANIM_INDEX: return {pen_peti_meramon_png, pen_peti_meramon_png_size, "peti_meramon"}; + case PEN_PICO_DEVIMON_ANIM_INDEX: return {pen_pico_devimon_png, pen_pico_devimon_png_size, "pico_devimon"}; + case PEN_PIEMON_ANIM_INDEX: return {pen_piemon_png, pen_piemon_png_size, "piemon"}; + case PEN_PLESIOMON_ANIM_INDEX: return {pen_plesiomon_png, pen_plesiomon_png_size, "plesiomon"}; + case PEN_PUKUMON_ANIM_INDEX: return {pen_pukumon_png, pen_pukumon_png_size, "pukumon"}; + case PEN_PUMPMON_ANIM_INDEX: return {pen_pumpmon_png, pen_pumpmon_png_size, "pumpmon"}; + case PEN_PYOCOMON_ANIM_INDEX: return {pen_pyocomon_png, pen_pyocomon_png_size, "pyocomon"}; + case PEN_RAKAMON_ANIM_INDEX: return {pen_rakamon_png, pen_rakamon_png_size, "rakamon"}; + case PEN_RED_VEGIMON_ANIM_INDEX: return {pen_red_vegimon_png, pen_red_vegimon_png_size, "red_vegimon"}; + case PEN_REVOLMON_ANIM_INDEX: return {pen_revolmon_png, pen_revolmon_png_size, "revolmon"}; + case PEN_ROSEMON_ANIM_INDEX: return {pen_rosemon_png, pen_rosemon_png_size, "rosemon"}; + case PEN_SABER_LEOMON_ANIM_INDEX: return {pen_saber_leomon_png, pen_saber_leomon_png_size, "saber_leomon"}; + case PEN_SHAKOMON_ANIM_INDEX: return {pen_shakomon_png, pen_shakomon_png_size, "shakomon"}; + case PEN_STARMON_ANIM_INDEX: return {pen_starmon_png, pen_starmon_png_size, "starmon"}; + case PEN_TAILMON_ANIM_INDEX: return {pen_tailmon_png, pen_tailmon_png_size, "tailmon"}; + case PEN_TANKMON_ANIM_INDEX: return {pen_tankmon_png, pen_tankmon_png_size, "tankmon"}; + case PEN_TENTOMON_ANIM_INDEX: return {pen_tentomon_png, pen_tentomon_png_size, "tentomon"}; + case PEN_THUNDERBALLMON_ANIM_INDEX: return {pen_thunderballmon_png, pen_thunderballmon_png_size, "thunderballmon"}; + case PEN_TOGEMON_ANIM_INDEX: return {pen_togemon_png, pen_togemon_png_size, "togemon"}; + case PEN_TONOSAMA_GEKOMON_ANIM_INDEX: return {pen_tonosama_gekomon_png, pen_tonosama_gekomon_png_size, "tonosama_gekomon"}; + case PEN_TORTAMON_ANIM_INDEX: return {pen_tortamon_png, pen_tortamon_png_size, "tortamon"}; + case PEN_TOY_AGUMON_ANIM_INDEX: return {pen_toy_agumon_png, pen_toy_agumon_png_size, "toy_agumon"}; + case PEN_TRICERAMON_ANIM_INDEX: return {pen_triceramon_png, pen_triceramon_png_size, "triceramon"}; + case PEN_V_DRAMON_ANIM_INDEX: return {pen_v_dramon_png, pen_v_dramon_png_size, "v_dramon"}; + case PEN_VEMDEMON_ANIM_INDEX: return {pen_vemdemon_png, pen_vemdemon_png_size, "vemdemon"}; + case PEN_VENOM_VAMDEMON_ANIM_INDEX: return {pen_venom_vamdemon_png, pen_venom_vamdemon_png_size, "venom_vamdemon"}; + case PEN_WARU_MOZAEMON_ANIM_INDEX: return {pen_waru_mozaemon_png, pen_waru_mozaemon_png_size, "waru_mozaemon"}; + case PEN_WIZARMON_ANIM_INDEX: return {pen_wizarmon_png, pen_wizarmon_png_size, "wizarmon"}; + case PEN_WOODMON_ANIM_INDEX: return {pen_woodmon_png, pen_woodmon_png_size, "woodmon"}; + case PEN_ZUDOMOM_ANIM_INDEX: return {pen_zudomom_png, pen_zudomom_png_size, "zudomom"}; + default: return { nullptr, 0, "" }; + } + return { nullptr, 0, "" }; + } +} + diff --git a/src/embedded_assets/pen/pen_images.c b/src/embedded_assets/pen/pen_images.c new file mode 100644 index 00000000..7322d5ad --- /dev/null +++ b/src/embedded_assets/pen/pen_images.c @@ -0,0 +1,642 @@ +#include "embedded_assets/pen/pen_images.h" +#include + +/// @NOTE: Generated embedded assets from assets/pen + +// Name: Aero V-dramon +const unsigned char pen_aero_v_dramon_png[] = { +#embed "../../../assets/pen/Aero V-dramon.png" +}; +const size_t pen_aero_v_dramon_png_size = sizeof(pen_aero_v_dramon_png); + + +// Name: Angewomon +const unsigned char pen_angewomon_png[] = { +#embed "../../../assets/pen/Angewomon.png" +}; +const size_t pen_angewomon_png_size = sizeof(pen_angewomon_png); + + +// Name: Anomalocarimon +const unsigned char pen_anomalocarimon_png[] = { +#embed "../../../assets/pen/Anomalocarimon.png" +}; +const size_t pen_anomalocarimon_png_size = sizeof(pen_anomalocarimon_png); + + +// Name: Asuramon +const unsigned char pen_asuramon_png[] = { +#embed "../../../assets/pen/Asuramon.png" +}; +const size_t pen_asuramon_png_size = sizeof(pen_asuramon_png); + + +// Name: Atlur Kabuterimon +const unsigned char pen_atlur_kabuterimon_png[] = { +#embed "../../../assets/pen/Atlur Kabuterimon.png" +}; +const size_t pen_atlur_kabuterimon_png_size = sizeof(pen_atlur_kabuterimon_png); + + +// Name: Bakumon +const unsigned char pen_bakumon_png[] = { +#embed "../../../assets/pen/Bakumon.png" +}; +const size_t pen_bakumon_png_size = sizeof(pen_bakumon_png); + + +// Name: Big Mamemon +const unsigned char pen_big_mamemon_png[] = { +#embed "../../../assets/pen/Big Mamemon.png" +}; +const size_t pen_big_mamemon_png_size = sizeof(pen_big_mamemon_png); + + +// Name: Blossomon +const unsigned char pen_blossomon_png[] = { +#embed "../../../assets/pen/Blossomon.png" +}; +const size_t pen_blossomon_png_size = sizeof(pen_blossomon_png); + + +// Name: Boltmon +const unsigned char pen_boltmon_png[] = { +#embed "../../../assets/pen/Boltmon.png" +}; +const size_t pen_boltmon_png_size = sizeof(pen_boltmon_png); + + +// Name: Bubbmon +const unsigned char pen_bubbmon_png[] = { +#embed "../../../assets/pen/Bubbmon.png" +}; +const size_t pen_bubbmon_png_size = sizeof(pen_bubbmon_png); + + +// Name: Candmon +const unsigned char pen_candmon_png[] = { +#embed "../../../assets/pen/Candmon.png" +}; +const size_t pen_candmon_png_size = sizeof(pen_candmon_png); + + +// Name: Caprimon +const unsigned char pen_caprimon_png[] = { +#embed "../../../assets/pen/Caprimon.png" +}; +const size_t pen_caprimon_png_size = sizeof(pen_caprimon_png); + + +// Name: Choromon +const unsigned char pen_choromon_png[] = { +#embed "../../../assets/pen/Choromon.png" +}; +const size_t pen_choromon_png_size = sizeof(pen_choromon_png); + + +// Name: Clockmon +const unsigned char pen_clockmon_png[] = { +#embed "../../../assets/pen/Clockmon.png" +}; +const size_t pen_clockmon_png_size = sizeof(pen_clockmon_png); + + +// Name: Cyberdramon +const unsigned char pen_cyberdramon_png[] = { +#embed "../../../assets/pen/Cyberdramon.png" +}; +const size_t pen_cyberdramon_png_size = sizeof(pen_cyberdramon_png); + + +// Name: Dagomon +const unsigned char pen_dagomon_png[] = { +#embed "../../../assets/pen/Dagomon.png" +}; +const size_t pen_dagomon_png_size = sizeof(pen_dagomon_png); + + +// Name: Death Meramon +const unsigned char pen_death_meramon_png[] = { +#embed "../../../assets/pen/Death Meramon.png" +}; +const size_t pen_death_meramon_png_size = sizeof(pen_death_meramon_png); + + +// Name: Delumon +const unsigned char pen_delumon_png[] = { +#embed "../../../assets/pen/Delumon.png" +}; +const size_t pen_delumon_png_size = sizeof(pen_delumon_png); + + +// Name: Dokugumon +const unsigned char pen_dokugumon_png[] = { +#embed "../../../assets/pen/Dokugumon.png" +}; +const size_t pen_dokugumon_png_size = sizeof(pen_dokugumon_png); + + +// Name: Ebidramon +const unsigned char pen_ebidramon_png[] = { +#embed "../../../assets/pen/Ebidramon.png" +}; +const size_t pen_ebidramon_png_size = sizeof(pen_ebidramon_png); + + +// Name: Fantomon +const unsigned char pen_fantomon_png[] = { +#embed "../../../assets/pen/Fantomon.png" +}; +const size_t pen_fantomon_png_size = sizeof(pen_fantomon_png); + + +// Name: Floramon +const unsigned char pen_floramon_png[] = { +#embed "../../../assets/pen/Floramon.png" +}; +const size_t pen_floramon_png_size = sizeof(pen_floramon_png); + + +// Name: Ganimon +const unsigned char pen_ganimon_png[] = { +#embed "../../../assets/pen/Ganimon.png" +}; +const size_t pen_ganimon_png_size = sizeof(pen_ganimon_png); + + +// Name: Garudamon +const unsigned char pen_garudamon_png[] = { +#embed "../../../assets/pen/Garudamon.png" +}; +const size_t pen_garudamon_png_size = sizeof(pen_garudamon_png); + + +// Name: Gekomon +const unsigned char pen_gekomon_png[] = { +#embed "../../../assets/pen/Gekomon.png" +}; +const size_t pen_gekomon_png_size = sizeof(pen_gekomon_png); + + +// Name: Gerbemon +const unsigned char pen_gerbemon_png[] = { +#embed "../../../assets/pen/Gerbemon.png" +}; +const size_t pen_gerbemon_png_size = sizeof(pen_gerbemon_png); + + +// Name: Gesomon +const unsigned char pen_gesomon_png[] = { +#embed "../../../assets/pen/Gesomon.png" +}; +const size_t pen_gesomon_png_size = sizeof(pen_gesomon_png); + + +// Name: Gomamon +const unsigned char pen_gomamon_png[] = { +#embed "../../../assets/pen/Gomamon.png" +}; +const size_t pen_gomamon_png_size = sizeof(pen_gomamon_png); + + +// Name: Gottsumon +const unsigned char pen_gottsumon_png[] = { +#embed "../../../assets/pen/Gottsumon.png" +}; +const size_t pen_gottsumon_png_size = sizeof(pen_gottsumon_png); + + +// Name: Griffomon +const unsigned char pen_griffomon_png[] = { +#embed "../../../assets/pen/Griffomon.png" +}; +const size_t pen_griffomon_png_size = sizeof(pen_griffomon_png); + + +// Name: Guardromon +const unsigned char pen_guardromon_png[] = { +#embed "../../../assets/pen/Guardromon.png" +}; +const size_t pen_guardromon_png_size = sizeof(pen_guardromon_png); + + +// Name: Hagurumon +const unsigned char pen_hagurumon_png[] = { +#embed "../../../assets/pen/Hagurumon.png" +}; +const size_t pen_hagurumon_png_size = sizeof(pen_hagurumon_png); + + +// Name: Hangymon +const unsigned char pen_hangymon_png[] = { +#embed "../../../assets/pen/Hangymon.png" +}; +const size_t pen_hangymon_png_size = sizeof(pen_hangymon_png); + + +// Name: Hanumon +const unsigned char pen_hanumon_png[] = { +#embed "../../../assets/pen/Hanumon.png" +}; +const size_t pen_hanumon_png_size = sizeof(pen_hanumon_png); + + +// Name: Herkule Kabuterimon +const unsigned char pen_herkule_kabuterimon_png[] = { +#embed "../../../assets/pen/Herkule Kabuterimon.png" +}; +const size_t pen_herkule_kabuterimon_png_size = sizeof(pen_herkule_kabuterimon_png); + + +// Name: Holy Angemon +const unsigned char pen_holy_angemon_png[] = { +#embed "../../../assets/pen/Holy Angemon.png" +}; +const size_t pen_holy_angemon_png_size = sizeof(pen_holy_angemon_png); + + +// Name: Holydramon +const unsigned char pen_holydramon_png[] = { +#embed "../../../assets/pen/Holydramon.png" +}; +const size_t pen_holydramon_png_size = sizeof(pen_holydramon_png); + + +// Name: Hououmon +const unsigned char pen_hououmon_png[] = { +#embed "../../../assets/pen/Hououmon.png" +}; +const size_t pen_hououmon_png_size = sizeof(pen_hououmon_png); + + +// Name: Ignamon +const unsigned char pen_ignamon_png[] = { +#embed "../../../assets/pen/Ignamon.png" +}; +const size_t pen_ignamon_png_size = sizeof(pen_ignamon_png); + + +// Name: Ikkakumon +const unsigned char pen_ikkakumon_png[] = { +#embed "../../../assets/pen/Ikkakumon.png" +}; +const size_t pen_ikkakumon_png_size = sizeof(pen_ikkakumon_png); + + +// Name: Jyagamon +const unsigned char pen_jyagamon_png[] = { +#embed "../../../assets/pen/Jyagamon.png" +}; +const size_t pen_jyagamon_png_size = sizeof(pen_jyagamon_png); + + +// Name: Jyureimon +const unsigned char pen_jyureimon_png[] = { +#embed "../../../assets/pen/Jyureimon.png" +}; +const size_t pen_jyureimon_png_size = sizeof(pen_jyureimon_png); + + +// Name: Kiwimon +const unsigned char pen_kiwimon_png[] = { +#embed "../../../assets/pen/Kiwimon.png" +}; +const size_t pen_kiwimon_png_size = sizeof(pen_kiwimon_png); + + +// Name: Knightmon +const unsigned char pen_knightmon_png[] = { +#embed "../../../assets/pen/Knightmon.png" +}; +const size_t pen_knightmon_png_size = sizeof(pen_knightmon_png); + + +// Name: Kokuwamon +const unsigned char pen_kokuwamon_png[] = { +#embed "../../../assets/pen/Kokuwamon.png" +}; +const size_t pen_kokuwamon_png_size = sizeof(pen_kokuwamon_png); + + +// Name: Lady Devimon +const unsigned char pen_lady_devimon_png[] = { +#embed "../../../assets/pen/Lady Devimon.png" +}; +const size_t pen_lady_devimon_png_size = sizeof(pen_lady_devimon_png); + + +// Name: Lilimon +const unsigned char pen_lilimon_png[] = { +#embed "../../../assets/pen/Lilimon.png" +}; +const size_t pen_lilimon_png_size = sizeof(pen_lilimon_png); + + +// Name: Mammon +const unsigned char pen_mammon_png[] = { +#embed "../../../assets/pen/Mammon.png" +}; +const size_t pen_mammon_png_size = sizeof(pen_mammon_png); + + +// Name: Marin Angemon +const unsigned char pen_marin_angemon_png[] = { +#embed "../../../assets/pen/Marin Angemon.png" +}; +const size_t pen_marin_angemon_png_size = sizeof(pen_marin_angemon_png); + + +// Name: Marin Devimon +const unsigned char pen_marin_devimon_png[] = { +#embed "../../../assets/pen/Marin Devimon.png" +}; +const size_t pen_marin_devimon_png_size = sizeof(pen_marin_devimon_png); + + +// Name: Mechanorimon +const unsigned char pen_mechanorimon_png[] = { +#embed "../../../assets/pen/Mechanorimon.png" +}; +const size_t pen_mechanorimon_png_size = sizeof(pen_mechanorimon_png); + + +// Name: Mega Seadramon +const unsigned char pen_mega_seadramon_png[] = { +#embed "../../../assets/pen/Mega Seadramon.png" +}; +const size_t pen_mega_seadramon_png_size = sizeof(pen_mega_seadramon_png); + + +// Name: Metal Etemon +const unsigned char pen_metal_etemon_png[] = { +#embed "../../../assets/pen/Metal Etemon.png" +}; +const size_t pen_metal_etemon_png_size = sizeof(pen_metal_etemon_png); + + +// Name: Metal Seadramon +const unsigned char pen_metal_seadramon_png[] = { +#embed "../../../assets/pen/Metal Seadramon.png" +}; +const size_t pen_metal_seadramon_png_size = sizeof(pen_metal_seadramon_png); + + +// Name: Mochimon +const unsigned char pen_mochimon_png[] = { +#embed "../../../assets/pen/Mochimon.png" +}; +const size_t pen_mochimon_png_size = sizeof(pen_mochimon_png); + + +// Name: Mokumon +const unsigned char pen_mokumon_png[] = { +#embed "../../../assets/pen/Mokumon.png" +}; +const size_t pen_mokumon_png_size = sizeof(pen_mokumon_png); + + +// Name: Mushmon +const unsigned char pen_mushmon_png[] = { +#embed "../../../assets/pen/Mushmon.png" +}; +const size_t pen_mushmon_png_size = sizeof(pen_mushmon_png); + + +// Name: Nyokimon +const unsigned char pen_nyokimon_png[] = { +#embed "../../../assets/pen/Nyokimon.png" +}; +const size_t pen_nyokimon_png_size = sizeof(pen_nyokimon_png); + + +// Name: Octmon +const unsigned char pen_octmon_png[] = { +#embed "../../../assets/pen/Octmon.png" +}; +const size_t pen_octmon_png_size = sizeof(pen_octmon_png); + + +// Name: Okuwamon +const unsigned char pen_okuwamon_png[] = { +#embed "../../../assets/pen/Okuwamon.png" +}; +const size_t pen_okuwamon_png_size = sizeof(pen_okuwamon_png); + + +// Name: Otamamon +const unsigned char pen_otamamon_png[] = { +#embed "../../../assets/pen/Otamamon.png" +}; +const size_t pen_otamamon_png_size = sizeof(pen_otamamon_png); + + +// Name: Peti Meramon +const unsigned char pen_peti_meramon_png[] = { +#embed "../../../assets/pen/Peti Meramon.png" +}; +const size_t pen_peti_meramon_png_size = sizeof(pen_peti_meramon_png); + + +// Name: Pico Devimon +const unsigned char pen_pico_devimon_png[] = { +#embed "../../../assets/pen/Pico Devimon.png" +}; +const size_t pen_pico_devimon_png_size = sizeof(pen_pico_devimon_png); + + +// Name: Piemon +const unsigned char pen_piemon_png[] = { +#embed "../../../assets/pen/Piemon.png" +}; +const size_t pen_piemon_png_size = sizeof(pen_piemon_png); + + +// Name: Plesiomon +const unsigned char pen_plesiomon_png[] = { +#embed "../../../assets/pen/Plesiomon.png" +}; +const size_t pen_plesiomon_png_size = sizeof(pen_plesiomon_png); + + +// Name: Pukumon +const unsigned char pen_pukumon_png[] = { +#embed "../../../assets/pen/Pukumon.png" +}; +const size_t pen_pukumon_png_size = sizeof(pen_pukumon_png); + + +// Name: Pumpmon +const unsigned char pen_pumpmon_png[] = { +#embed "../../../assets/pen/Pumpmon.png" +}; +const size_t pen_pumpmon_png_size = sizeof(pen_pumpmon_png); + + +// Name: Pyocomon +const unsigned char pen_pyocomon_png[] = { +#embed "../../../assets/pen/Pyocomon.png" +}; +const size_t pen_pyocomon_png_size = sizeof(pen_pyocomon_png); + + +// Name: Rakamon +const unsigned char pen_rakamon_png[] = { +#embed "../../../assets/pen/Rakamon.png" +}; +const size_t pen_rakamon_png_size = sizeof(pen_rakamon_png); + + +// Name: Red Vegimon +const unsigned char pen_red_vegimon_png[] = { +#embed "../../../assets/pen/Red Vegimon.png" +}; +const size_t pen_red_vegimon_png_size = sizeof(pen_red_vegimon_png); + + +// Name: Revolmon +const unsigned char pen_revolmon_png[] = { +#embed "../../../assets/pen/Revolmon.png" +}; +const size_t pen_revolmon_png_size = sizeof(pen_revolmon_png); + + +// Name: Rosemon +const unsigned char pen_rosemon_png[] = { +#embed "../../../assets/pen/Rosemon.png" +}; +const size_t pen_rosemon_png_size = sizeof(pen_rosemon_png); + + +// Name: Saber Leomon +const unsigned char pen_saber_leomon_png[] = { +#embed "../../../assets/pen/Saber Leomon.png" +}; +const size_t pen_saber_leomon_png_size = sizeof(pen_saber_leomon_png); + + +// Name: Shakomon +const unsigned char pen_shakomon_png[] = { +#embed "../../../assets/pen/Shakomon.png" +}; +const size_t pen_shakomon_png_size = sizeof(pen_shakomon_png); + + +// Name: Starmon +const unsigned char pen_starmon_png[] = { +#embed "../../../assets/pen/Starmon.png" +}; +const size_t pen_starmon_png_size = sizeof(pen_starmon_png); + + +// Name: Tailmon +const unsigned char pen_tailmon_png[] = { +#embed "../../../assets/pen/Tailmon.png" +}; +const size_t pen_tailmon_png_size = sizeof(pen_tailmon_png); + + +// Name: Tankmon +const unsigned char pen_tankmon_png[] = { +#embed "../../../assets/pen/Tankmon.png" +}; +const size_t pen_tankmon_png_size = sizeof(pen_tankmon_png); + + +// Name: Tentomon +const unsigned char pen_tentomon_png[] = { +#embed "../../../assets/pen/Tentomon.png" +}; +const size_t pen_tentomon_png_size = sizeof(pen_tentomon_png); + + +// Name: Thunderballmon +const unsigned char pen_thunderballmon_png[] = { +#embed "../../../assets/pen/Thunderballmon.png" +}; +const size_t pen_thunderballmon_png_size = sizeof(pen_thunderballmon_png); + + +// Name: Togemon +const unsigned char pen_togemon_png[] = { +#embed "../../../assets/pen/Togemon.png" +}; +const size_t pen_togemon_png_size = sizeof(pen_togemon_png); + + +// Name: Tonosama Gekomon +const unsigned char pen_tonosama_gekomon_png[] = { +#embed "../../../assets/pen/Tonosama Gekomon.png" +}; +const size_t pen_tonosama_gekomon_png_size = sizeof(pen_tonosama_gekomon_png); + + +// Name: Tortamon +const unsigned char pen_tortamon_png[] = { +#embed "../../../assets/pen/Tortamon.png" +}; +const size_t pen_tortamon_png_size = sizeof(pen_tortamon_png); + + +// Name: Toy Agumon +const unsigned char pen_toy_agumon_png[] = { +#embed "../../../assets/pen/Toy Agumon.png" +}; +const size_t pen_toy_agumon_png_size = sizeof(pen_toy_agumon_png); + + +// Name: Triceramon +const unsigned char pen_triceramon_png[] = { +#embed "../../../assets/pen/Triceramon.png" +}; +const size_t pen_triceramon_png_size = sizeof(pen_triceramon_png); + + +// Name: V-dramon +const unsigned char pen_v_dramon_png[] = { +#embed "../../../assets/pen/V-dramon.png" +}; +const size_t pen_v_dramon_png_size = sizeof(pen_v_dramon_png); + + +// Name: Vemdemon +const unsigned char pen_vemdemon_png[] = { +#embed "../../../assets/pen/Vemdemon.png" +}; +const size_t pen_vemdemon_png_size = sizeof(pen_vemdemon_png); + + +// Name: Venom Vamdemon +const unsigned char pen_venom_vamdemon_png[] = { +#embed "../../../assets/pen/Venom Vamdemon.png" +}; +const size_t pen_venom_vamdemon_png_size = sizeof(pen_venom_vamdemon_png); + + +// Name: Waru Mozaemon +const unsigned char pen_waru_mozaemon_png[] = { +#embed "../../../assets/pen/Waru Mozaemon.png" +}; +const size_t pen_waru_mozaemon_png_size = sizeof(pen_waru_mozaemon_png); + + +// Name: Wizarmon +const unsigned char pen_wizarmon_png[] = { +#embed "../../../assets/pen/Wizarmon.png" +}; +const size_t pen_wizarmon_png_size = sizeof(pen_wizarmon_png); + + +// Name: Woodmon +const unsigned char pen_woodmon_png[] = { +#embed "../../../assets/pen/Woodmon.png" +}; +const size_t pen_woodmon_png_size = sizeof(pen_woodmon_png); + + +// Name: Zudomom +const unsigned char pen_zudomom_png[] = { +#embed "../../../assets/pen/Zudomom.png" +}; +const size_t pen_zudomom_png_size = sizeof(pen_zudomom_png); + + diff --git a/src/embedded_assets/pen20/CMakeLists.txt b/src/embedded_assets/pen20/CMakeLists.txt new file mode 100644 index 00000000..e5895ca6 --- /dev/null +++ b/src/embedded_assets/pen20/CMakeLists.txt @@ -0,0 +1,15 @@ +add_library(assets_pen20_interface INTERFACE) +target_include_directories(assets_pen20_interface INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include ${SRC_DIR}/embedded_assets/pen20/include) + +add_library(assets_pen20_feature INTERFACE) +target_compile_definitions(assets_pen20_feature INTERFACE FEATURE_ENABLE_DM_EMBEDDED_ASSETS FEATURE_PEN20_EMBEDDED_ASSETS) + +add_library(assets_pen20 STATIC) +target_sources(assets_pen20 PRIVATE pen20_get_sprite_sheet.cpp pen20_config_parse_animation_name.cpp pen20_images.c) +target_compile_options(assets_pen20 PRIVATE -ffunction-sections -fdata-sections -fno-unroll-loops) +target_include_directories(assets_pen20 + PRIVATE ${INCLUDE_DIR}/embedded_assets/pen20 + PUBLIC ${INCLUDE_DIR}) +target_link_libraries(assets_pen20 + PUBLIC assets_pen20_interface + PRIVATE assets_pen20_feature bongocat_options) \ No newline at end of file diff --git a/src/embedded_assets/pen20/include/pen20_config_parse_animation_name.h b/src/embedded_assets/pen20/include/pen20_config_parse_animation_name.h new file mode 100644 index 00000000..87d654f5 --- /dev/null +++ b/src/embedded_assets/pen20/include/pen20_config_parse_animation_name.h @@ -0,0 +1,13 @@ +#ifndef BONGOCAT_EMBEDDED_ASSETS_CONFIG_PARSE_PEN20_ANIMATION_NAME_H +#define BONGOCAT_EMBEDDED_ASSETS_CONFIG_PARSE_PEN20_ANIMATION_NAME_H + +#include "config/config.h" +#include "embedded_assets/embedded_image.h" + +namespace bongocat::assets { + [[nodiscard]] extern config_animation_entry_t get_config_animation_name_pen20(size_t i); + extern int config_parse_animation_name_pen20(config::config_t& config, const char *value); +} + +#endif + diff --git a/src/embedded_assets/pen20/include/pen20_config_parse_enum_key.cpp.inl b/src/embedded_assets/pen20/include/pen20_config_parse_enum_key.cpp.inl new file mode 100644 index 00000000..19f4b26d --- /dev/null +++ b/src/embedded_assets/pen20/include/pen20_config_parse_enum_key.cpp.inl @@ -0,0 +1,1992 @@ +// check for Aero V-dramon (aero_v_dramon) +if (strcmp(value, PEN20_AERO_V_DRAMON_NAME) == 0 || + strcmp(value, PEN20_AERO_V_DRAMON_ID) == 0 || + strcmp(value, PEN20_AERO_V_DRAMON_FQID) == 0 || + strcmp(value, PEN20_AERO_V_DRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:aero_v_dramon") == 0 || + strcmp(value, "pen:Aero V-dramon") == 0) { + config.animation_index = PEN20_AERO_V_DRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Agumon Hakase (agumon_hakase) +if (strcmp(value, PEN20_AGUMON_HAKASE_NAME) == 0 || + strcmp(value, PEN20_AGUMON_HAKASE_ID) == 0 || + strcmp(value, PEN20_AGUMON_HAKASE_FQID) == 0 || + strcmp(value, PEN20_AGUMON_HAKASE_FQNAME) == 0 || + // alt + strcmp(value, "pen:agumon_hakase") == 0 || + strcmp(value, "pen:Agumon Hakase") == 0) { + config.animation_index = PEN20_AGUMON_HAKASE_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Alphamon Ouryuken (alphamon_ouryuken) +if (strcmp(value, PEN20_ALPHAMON_OURYUKEN_NAME) == 0 || + strcmp(value, PEN20_ALPHAMON_OURYUKEN_ID) == 0 || + strcmp(value, PEN20_ALPHAMON_OURYUKEN_FQID) == 0 || + strcmp(value, PEN20_ALPHAMON_OURYUKEN_FQNAME) == 0 || + // alt + strcmp(value, "pen:alphamon_ouryuken") == 0 || + strcmp(value, "pen:Alphamon Ouryuken") == 0) { + config.animation_index = PEN20_ALPHAMON_OURYUKEN_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Andiramon (andiramon) +if (strcmp(value, PEN20_ANDIRAMON_NAME) == 0 || + strcmp(value, PEN20_ANDIRAMON_ID) == 0 || + strcmp(value, PEN20_ANDIRAMON_FQID) == 0 || + strcmp(value, PEN20_ANDIRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:andiramon") == 0 || + strcmp(value, "pen:Andiramon") == 0) { + config.animation_index = PEN20_ANDIRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Angewomon (angewomon) +if (strcmp(value, PEN20_ANGEWOMON_NAME) == 0 || + strcmp(value, PEN20_ANGEWOMON_ID) == 0 || + strcmp(value, PEN20_ANGEWOMON_FQID) == 0 || + strcmp(value, PEN20_ANGEWOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:angewomon") == 0 || + strcmp(value, "pen:Angewomon") == 0) { + config.animation_index = PEN20_ANGEWOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Anomalocarimon (anomalocarimon) +if (strcmp(value, PEN20_ANOMALOCARIMON_NAME) == 0 || + strcmp(value, PEN20_ANOMALOCARIMON_ID) == 0 || + strcmp(value, PEN20_ANOMALOCARIMON_FQID) == 0 || + strcmp(value, PEN20_ANOMALOCARIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:anomalocarimon") == 0 || + strcmp(value, "pen:Anomalocarimon") == 0) { + config.animation_index = PEN20_ANOMALOCARIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Arresterdramon (arresterdramon) +if (strcmp(value, PEN20_ARRESTERDRAMON_NAME) == 0 || + strcmp(value, PEN20_ARRESTERDRAMON_ID) == 0 || + strcmp(value, PEN20_ARRESTERDRAMON_FQID) == 0 || + strcmp(value, PEN20_ARRESTERDRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:arresterdramon") == 0 || + strcmp(value, "pen:Arresterdramon") == 0) { + config.animation_index = PEN20_ARRESTERDRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Astramon (astramon) +if (strcmp(value, PEN20_ASTRAMON_NAME) == 0 || + strcmp(value, PEN20_ASTRAMON_ID) == 0 || + strcmp(value, PEN20_ASTRAMON_FQID) == 0 || + strcmp(value, PEN20_ASTRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:astramon") == 0 || + strcmp(value, "pen:Astramon") == 0) { + config.animation_index = PEN20_ASTRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Asuramon (asuramon) +if (strcmp(value, PEN20_ASURAMON_NAME) == 0 || + strcmp(value, PEN20_ASURAMON_ID) == 0 || + strcmp(value, PEN20_ASURAMON_FQID) == 0 || + strcmp(value, PEN20_ASURAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:asuramon") == 0 || + strcmp(value, "pen:Asuramon") == 0) { + config.animation_index = PEN20_ASURAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Atlur Kabuterimon (atlur_kabuterimon) +if (strcmp(value, PEN20_ATLUR_KABUTERIMON_NAME) == 0 || + strcmp(value, PEN20_ATLUR_KABUTERIMON_ID) == 0 || + strcmp(value, PEN20_ATLUR_KABUTERIMON_FQID) == 0 || + strcmp(value, PEN20_ATLUR_KABUTERIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:atlur_kabuterimon") == 0 || + strcmp(value, "pen:Atlur Kabuterimon") == 0) { + config.animation_index = PEN20_ATLUR_KABUTERIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Baalmon (baalmon) +if (strcmp(value, PEN20_BAALMON_NAME) == 0 || + strcmp(value, PEN20_BAALMON_ID) == 0 || + strcmp(value, PEN20_BAALMON_FQID) == 0 || + strcmp(value, PEN20_BAALMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:baalmon") == 0 || + strcmp(value, "pen:Baalmon") == 0) { + config.animation_index = PEN20_BAALMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Bakumon (bakumon) +if (strcmp(value, PEN20_BAKUMON_NAME) == 0 || + strcmp(value, PEN20_BAKUMON_ID) == 0 || + strcmp(value, PEN20_BAKUMON_FQID) == 0 || + strcmp(value, PEN20_BAKUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:bakumon") == 0 || + strcmp(value, "pen:Bakumon") == 0) { + config.animation_index = PEN20_BAKUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Bancho Leomon (bancho_leomon) +if (strcmp(value, PEN20_BANCHO_LEOMON_NAME) == 0 || + strcmp(value, PEN20_BANCHO_LEOMON_ID) == 0 || + strcmp(value, PEN20_BANCHO_LEOMON_FQID) == 0 || + strcmp(value, PEN20_BANCHO_LEOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:bancho_leomon") == 0 || + strcmp(value, "pen:Bancho Leomon") == 0) { + config.animation_index = PEN20_BANCHO_LEOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Beelzebumon Blast Mode (beelzebumon_blast_mode) +if (strcmp(value, PEN20_BEELZEBUMON_BLAST_MODE_NAME) == 0 || + strcmp(value, PEN20_BEELZEBUMON_BLAST_MODE_ID) == 0 || + strcmp(value, PEN20_BEELZEBUMON_BLAST_MODE_FQID) == 0 || + strcmp(value, PEN20_BEELZEBUMON_BLAST_MODE_FQNAME) == 0 || + // alt + strcmp(value, "pen:beelzebumon_blast_mode") == 0 || + strcmp(value, "pen:Beelzebumon Blast Mode") == 0) { + config.animation_index = PEN20_BEELZEBUMON_BLAST_MODE_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Beowulfmon (beowulfmon) +if (strcmp(value, PEN20_BEOWULFMON_NAME) == 0 || + strcmp(value, PEN20_BEOWULFMON_ID) == 0 || + strcmp(value, PEN20_BEOWULFMON_FQID) == 0 || + strcmp(value, PEN20_BEOWULFMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:beowulfmon") == 0 || + strcmp(value, "pen:Beowulfmon") == 0) { + config.animation_index = PEN20_BEOWULFMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Big Mamemon (big_mamemon) +if (strcmp(value, PEN20_BIG_MAMEMON_NAME) == 0 || + strcmp(value, PEN20_BIG_MAMEMON_ID) == 0 || + strcmp(value, PEN20_BIG_MAMEMON_FQID) == 0 || + strcmp(value, PEN20_BIG_MAMEMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:big_mamemon") == 0 || + strcmp(value, "pen:Big Mamemon") == 0) { + config.animation_index = PEN20_BIG_MAMEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Blossomon (blossomon) +if (strcmp(value, PEN20_BLOSSOMON_NAME) == 0 || + strcmp(value, PEN20_BLOSSOMON_ID) == 0 || + strcmp(value, PEN20_BLOSSOMON_FQID) == 0 || + strcmp(value, PEN20_BLOSSOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:blossomon") == 0 || + strcmp(value, "pen:Blossomon") == 0) { + config.animation_index = PEN20_BLOSSOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Boltmon (boltmon) +if (strcmp(value, PEN20_BOLTMON_NAME) == 0 || + strcmp(value, PEN20_BOLTMON_ID) == 0 || + strcmp(value, PEN20_BOLTMON_FQID) == 0 || + strcmp(value, PEN20_BOLTMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:boltmon") == 0 || + strcmp(value, "pen:Boltmon") == 0) { + config.animation_index = PEN20_BOLTMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Bryweludramon (bryweludramon) +if (strcmp(value, PEN20_BRYWELUDRAMON_NAME) == 0 || + strcmp(value, PEN20_BRYWELUDRAMON_ID) == 0 || + strcmp(value, PEN20_BRYWELUDRAMON_FQID) == 0 || + strcmp(value, PEN20_BRYWELUDRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:bryweludramon") == 0 || + strcmp(value, "pen:Bryweludramon") == 0) { + config.animation_index = PEN20_BRYWELUDRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Bubbmon (bubbmon) +if (strcmp(value, PEN20_BUBBMON_NAME) == 0 || + strcmp(value, PEN20_BUBBMON_ID) == 0 || + strcmp(value, PEN20_BUBBMON_FQID) == 0 || + strcmp(value, PEN20_BUBBMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:bubbmon") == 0 || + strcmp(value, "pen:Bubbmon") == 0) { + config.animation_index = PEN20_BUBBMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Budmon (budmon) +if (strcmp(value, PEN20_BUDMON_NAME) == 0 || + strcmp(value, PEN20_BUDMON_ID) == 0 || + strcmp(value, PEN20_BUDMON_FQID) == 0 || + strcmp(value, PEN20_BUDMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:budmon") == 0 || + strcmp(value, "pen:Budmon") == 0) { + config.animation_index = PEN20_BUDMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Bushi Agumon (bushi_agumon) +if (strcmp(value, PEN20_BUSHI_AGUMON_NAME) == 0 || + strcmp(value, PEN20_BUSHI_AGUMON_ID) == 0 || + strcmp(value, PEN20_BUSHI_AGUMON_FQID) == 0 || + strcmp(value, PEN20_BUSHI_AGUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:bushi_agumon") == 0 || + strcmp(value, "pen:Bushi Agumon") == 0) { + config.animation_index = PEN20_BUSHI_AGUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Candmon (candmon) +if (strcmp(value, PEN20_CANDMON_NAME) == 0 || + strcmp(value, PEN20_CANDMON_ID) == 0 || + strcmp(value, PEN20_CANDMON_FQID) == 0 || + strcmp(value, PEN20_CANDMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:candmon") == 0 || + strcmp(value, "pen:Candmon") == 0) { + config.animation_index = PEN20_CANDMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Caprimon (caprimon) +if (strcmp(value, PEN20_CAPRIMON_NAME) == 0 || + strcmp(value, PEN20_CAPRIMON_ID) == 0 || + strcmp(value, PEN20_CAPRIMON_FQID) == 0 || + strcmp(value, PEN20_CAPRIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:caprimon") == 0 || + strcmp(value, "pen:Caprimon") == 0) { + config.animation_index = PEN20_CAPRIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Chaosmon (chaosmon) +if (strcmp(value, PEN20_CHAOSMON_NAME) == 0 || + strcmp(value, PEN20_CHAOSMON_ID) == 0 || + strcmp(value, PEN20_CHAOSMON_FQID) == 0 || + strcmp(value, PEN20_CHAOSMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:chaosmon") == 0 || + strcmp(value, "pen:Chaosmon") == 0) { + config.animation_index = PEN20_CHAOSMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Cherubimon (cherubimon) +if (strcmp(value, PEN20_CHERUBIMON_NAME) == 0 || + strcmp(value, PEN20_CHERUBIMON_ID) == 0 || + strcmp(value, PEN20_CHERUBIMON_FQID) == 0 || + strcmp(value, PEN20_CHERUBIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:cherubimon") == 0 || + strcmp(value, "pen:Cherubimon") == 0) { + config.animation_index = PEN20_CHERUBIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Chibimon (chibimon) +if (strcmp(value, PEN20_CHIBIMON_NAME) == 0 || + strcmp(value, PEN20_CHIBIMON_ID) == 0 || + strcmp(value, PEN20_CHIBIMON_FQID) == 0 || + strcmp(value, PEN20_CHIBIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:chibimon") == 0 || + strcmp(value, "pen:Chibimon") == 0) { + config.animation_index = PEN20_CHIBIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Chicomon (chicomon) +if (strcmp(value, PEN20_CHICOMON_NAME) == 0 || + strcmp(value, PEN20_CHICOMON_ID) == 0 || + strcmp(value, PEN20_CHICOMON_FQID) == 0 || + strcmp(value, PEN20_CHICOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:chicomon") == 0 || + strcmp(value, "pen:Chicomon") == 0) { + config.animation_index = PEN20_CHICOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Choromon (choromon) +if (strcmp(value, PEN20_CHOROMON_NAME) == 0 || + strcmp(value, PEN20_CHOROMON_ID) == 0 || + strcmp(value, PEN20_CHOROMON_FQID) == 0 || + strcmp(value, PEN20_CHOROMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:choromon") == 0 || + strcmp(value, "pen:Choromon") == 0) { + config.animation_index = PEN20_CHOROMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Clockmon (clockmon) +if (strcmp(value, PEN20_CLOCKMON_NAME) == 0 || + strcmp(value, PEN20_CLOCKMON_ID) == 0 || + strcmp(value, PEN20_CLOCKMON_FQID) == 0 || + strcmp(value, PEN20_CLOCKMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:clockmon") == 0 || + strcmp(value, "pen:Clockmon") == 0) { + config.animation_index = PEN20_CLOCKMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Cocomon (cocomon) +if (strcmp(value, PEN20_COCOMON_NAME) == 0 || + strcmp(value, PEN20_COCOMON_ID) == 0 || + strcmp(value, PEN20_COCOMON_FQID) == 0 || + strcmp(value, PEN20_COCOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:cocomon") == 0 || + strcmp(value, "pen:Cocomon") == 0) { + config.animation_index = PEN20_COCOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Cotsucomon (cotsucomon) +if (strcmp(value, PEN20_COTSUCOMON_NAME) == 0 || + strcmp(value, PEN20_COTSUCOMON_ID) == 0 || + strcmp(value, PEN20_COTSUCOMON_FQID) == 0 || + strcmp(value, PEN20_COTSUCOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:cotsucomon") == 0 || + strcmp(value, "pen:Cotsucomon") == 0) { + config.animation_index = PEN20_COTSUCOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Cyberdramon (cyberdramon) +if (strcmp(value, PEN20_CYBERDRAMON_NAME) == 0 || + strcmp(value, PEN20_CYBERDRAMON_ID) == 0 || + strcmp(value, PEN20_CYBERDRAMON_FQID) == 0 || + strcmp(value, PEN20_CYBERDRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:cyberdramon") == 0 || + strcmp(value, "pen:Cyberdramon") == 0) { + config.animation_index = PEN20_CYBERDRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Dagomon (dagomon) +if (strcmp(value, PEN20_DAGOMON_NAME) == 0 || + strcmp(value, PEN20_DAGOMON_ID) == 0 || + strcmp(value, PEN20_DAGOMON_FQID) == 0 || + strcmp(value, PEN20_DAGOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:dagomon") == 0 || + strcmp(value, "pen:Dagomon") == 0) { + config.animation_index = PEN20_DAGOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Darkdramon (darkdramon) +if (strcmp(value, PEN20_DARKDRAMON_NAME) == 0 || + strcmp(value, PEN20_DARKDRAMON_ID) == 0 || + strcmp(value, PEN20_DARKDRAMON_FQID) == 0 || + strcmp(value, PEN20_DARKDRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:darkdramon") == 0 || + strcmp(value, "pen:Darkdramon") == 0) { + config.animation_index = PEN20_DARKDRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Dark Knightmon (dark_knightmon) +if (strcmp(value, PEN20_DARK_KNIGHTMON_NAME) == 0 || + strcmp(value, PEN20_DARK_KNIGHTMON_ID) == 0 || + strcmp(value, PEN20_DARK_KNIGHTMON_FQID) == 0 || + strcmp(value, PEN20_DARK_KNIGHTMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:dark_knightmon") == 0 || + strcmp(value, "pen:Dark Knightmon") == 0) { + config.animation_index = PEN20_DARK_KNIGHTMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Death Meramon (death_meramon) +if (strcmp(value, PEN20_DEATH_MERAMON_NAME) == 0 || + strcmp(value, PEN20_DEATH_MERAMON_ID) == 0 || + strcmp(value, PEN20_DEATH_MERAMON_FQID) == 0 || + strcmp(value, PEN20_DEATH_MERAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:death_meramon") == 0 || + strcmp(value, "pen:Death Meramon") == 0) { + config.animation_index = PEN20_DEATH_MERAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Delumon (delumon) +if (strcmp(value, PEN20_DELUMON_NAME) == 0 || + strcmp(value, PEN20_DELUMON_ID) == 0 || + strcmp(value, PEN20_DELUMON_FQID) == 0 || + strcmp(value, PEN20_DELUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:delumon") == 0 || + strcmp(value, "pen:Delumon") == 0) { + config.animation_index = PEN20_DELUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Dokugumon (dokugumon) +if (strcmp(value, PEN20_DOKUGUMON_NAME) == 0 || + strcmp(value, PEN20_DOKUGUMON_ID) == 0 || + strcmp(value, PEN20_DOKUGUMON_FQID) == 0 || + strcmp(value, PEN20_DOKUGUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:dokugumon") == 0 || + strcmp(value, "pen:Dokugumon") == 0) { + config.animation_index = PEN20_DOKUGUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for DORUgoramon (dorugoramon) +if (strcmp(value, PEN20_DORUGORAMON_NAME) == 0 || + strcmp(value, PEN20_DORUGORAMON_ID) == 0 || + strcmp(value, PEN20_DORUGORAMON_FQID) == 0 || + strcmp(value, PEN20_DORUGORAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:dorugoramon") == 0 || + strcmp(value, "pen:DORUgoramon") == 0) { + config.animation_index = PEN20_DORUGORAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ebidramon (ebidramon) +if (strcmp(value, PEN20_EBIDRAMON_NAME) == 0 || + strcmp(value, PEN20_EBIDRAMON_ID) == 0 || + strcmp(value, PEN20_EBIDRAMON_FQID) == 0 || + strcmp(value, PEN20_EBIDRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:ebidramon") == 0 || + strcmp(value, "pen:Ebidramon") == 0) { + config.animation_index = PEN20_EBIDRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Fantomon (fantomon) +if (strcmp(value, PEN20_FANTOMON_NAME) == 0 || + strcmp(value, PEN20_FANTOMON_ID) == 0 || + strcmp(value, PEN20_FANTOMON_FQID) == 0 || + strcmp(value, PEN20_FANTOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:fantomon") == 0 || + strcmp(value, "pen:Fantomon") == 0) { + config.animation_index = PEN20_FANTOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Floramon (floramon) +if (strcmp(value, PEN20_FLORAMON_NAME) == 0 || + strcmp(value, PEN20_FLORAMON_ID) == 0 || + strcmp(value, PEN20_FLORAMON_FQID) == 0 || + strcmp(value, PEN20_FLORAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:floramon") == 0 || + strcmp(value, "pen:Floramon") == 0) { + config.animation_index = PEN20_FLORAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Fufumon (fufumon) +if (strcmp(value, PEN20_FUFUMON_NAME) == 0 || + strcmp(value, PEN20_FUFUMON_ID) == 0 || + strcmp(value, PEN20_FUFUMON_FQID) == 0 || + strcmp(value, PEN20_FUFUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:fufumon") == 0 || + strcmp(value, "pen:Fufumon") == 0) { + config.animation_index = PEN20_FUFUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Galgomon (galgomon) +if (strcmp(value, PEN20_GALGOMON_NAME) == 0 || + strcmp(value, PEN20_GALGOMON_ID) == 0 || + strcmp(value, PEN20_GALGOMON_FQID) == 0 || + strcmp(value, PEN20_GALGOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:galgomon") == 0 || + strcmp(value, "pen:Galgomon") == 0) { + config.animation_index = PEN20_GALGOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ganimon (ganimon) +if (strcmp(value, PEN20_GANIMON_NAME) == 0 || + strcmp(value, PEN20_GANIMON_ID) == 0 || + strcmp(value, PEN20_GANIMON_FQID) == 0 || + strcmp(value, PEN20_GANIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:ganimon") == 0 || + strcmp(value, "pen:Ganimon") == 0) { + config.animation_index = PEN20_GANIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Garudamon (garudamon) +if (strcmp(value, PEN20_GARUDAMON_NAME) == 0 || + strcmp(value, PEN20_GARUDAMON_ID) == 0 || + strcmp(value, PEN20_GARUDAMON_FQID) == 0 || + strcmp(value, PEN20_GARUDAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:garudamon") == 0 || + strcmp(value, "pen:Garudamon") == 0) { + config.animation_index = PEN20_GARUDAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Gekomon (gekomon) +if (strcmp(value, PEN20_GEKOMON_NAME) == 0 || + strcmp(value, PEN20_GEKOMON_ID) == 0 || + strcmp(value, PEN20_GEKOMON_FQID) == 0 || + strcmp(value, PEN20_GEKOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:gekomon") == 0 || + strcmp(value, "pen:Gekomon") == 0) { + config.animation_index = PEN20_GEKOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Gerbemon (gerbemon) +if (strcmp(value, PEN20_GERBEMON_NAME) == 0 || + strcmp(value, PEN20_GERBEMON_ID) == 0 || + strcmp(value, PEN20_GERBEMON_FQID) == 0 || + strcmp(value, PEN20_GERBEMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:gerbemon") == 0 || + strcmp(value, "pen:Gerbemon") == 0) { + config.animation_index = PEN20_GERBEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Gesomon (gesomon) +if (strcmp(value, PEN20_GESOMON_NAME) == 0 || + strcmp(value, PEN20_GESOMON_ID) == 0 || + strcmp(value, PEN20_GESOMON_FQID) == 0 || + strcmp(value, PEN20_GESOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:gesomon") == 0 || + strcmp(value, "pen:Gesomon") == 0) { + config.animation_index = PEN20_GESOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ginryumon (ginryumon) +if (strcmp(value, PEN20_GINRYUMON_NAME) == 0 || + strcmp(value, PEN20_GINRYUMON_ID) == 0 || + strcmp(value, PEN20_GINRYUMON_FQID) == 0 || + strcmp(value, PEN20_GINRYUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:ginryumon") == 0 || + strcmp(value, "pen:Ginryumon") == 0) { + config.animation_index = PEN20_GINRYUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Gomamon (gomamon) +if (strcmp(value, PEN20_GOMAMON_NAME) == 0 || + strcmp(value, PEN20_GOMAMON_ID) == 0 || + strcmp(value, PEN20_GOMAMON_FQID) == 0 || + strcmp(value, PEN20_GOMAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:gomamon") == 0 || + strcmp(value, "pen:Gomamon") == 0) { + config.animation_index = PEN20_GOMAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Gottsumon (gottsumon) +if (strcmp(value, PEN20_GOTTSUMON_NAME) == 0 || + strcmp(value, PEN20_GOTTSUMON_ID) == 0 || + strcmp(value, PEN20_GOTTSUMON_FQID) == 0 || + strcmp(value, PEN20_GOTTSUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:gottsumon") == 0 || + strcmp(value, "pen:Gottsumon") == 0) { + config.animation_index = PEN20_GOTTSUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Griffomon (griffomon) +if (strcmp(value, PEN20_GRIFFOMON_NAME) == 0 || + strcmp(value, PEN20_GRIFFOMON_ID) == 0 || + strcmp(value, PEN20_GRIFFOMON_FQID) == 0 || + strcmp(value, PEN20_GRIFFOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:griffomon") == 0 || + strcmp(value, "pen:Griffomon") == 0) { + config.animation_index = PEN20_GRIFFOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Growmon (growmon) +if (strcmp(value, PEN20_GROWMON_NAME) == 0 || + strcmp(value, PEN20_GROWMON_ID) == 0 || + strcmp(value, PEN20_GROWMON_FQID) == 0 || + strcmp(value, PEN20_GROWMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:growmon") == 0 || + strcmp(value, "pen:Growmon") == 0) { + config.animation_index = PEN20_GROWMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Guardromon (guardromon) +if (strcmp(value, PEN20_GUARDROMON_NAME) == 0 || + strcmp(value, PEN20_GUARDROMON_ID) == 0 || + strcmp(value, PEN20_GUARDROMON_FQID) == 0 || + strcmp(value, PEN20_GUARDROMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:guardromon") == 0 || + strcmp(value, "pen:Guardromon") == 0) { + config.animation_index = PEN20_GUARDROMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Guimon (guimon) +if (strcmp(value, PEN20_GUIMON_NAME) == 0 || + strcmp(value, PEN20_GUIMON_ID) == 0 || + strcmp(value, PEN20_GUIMON_FQID) == 0 || + strcmp(value, PEN20_GUIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:guimon") == 0 || + strcmp(value, "pen:Guimon") == 0) { + config.animation_index = PEN20_GUIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Gummymon (gummymon) +if (strcmp(value, PEN20_GUMMYMON_NAME) == 0 || + strcmp(value, PEN20_GUMMYMON_ID) == 0 || + strcmp(value, PEN20_GUMMYMON_FQID) == 0 || + strcmp(value, PEN20_GUMMYMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:gummymon") == 0 || + strcmp(value, "pen:Gummymon") == 0) { + config.animation_index = PEN20_GUMMYMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Hagurumon (hagurumon) +if (strcmp(value, PEN20_HAGURUMON_NAME) == 0 || + strcmp(value, PEN20_HAGURUMON_ID) == 0 || + strcmp(value, PEN20_HAGURUMON_FQID) == 0 || + strcmp(value, PEN20_HAGURUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:hagurumon") == 0 || + strcmp(value, "pen:Hagurumon") == 0) { + config.animation_index = PEN20_HAGURUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Hangymon (hangymon) +if (strcmp(value, PEN20_HANGYMON_NAME) == 0 || + strcmp(value, PEN20_HANGYMON_ID) == 0 || + strcmp(value, PEN20_HANGYMON_FQID) == 0 || + strcmp(value, PEN20_HANGYMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:hangymon") == 0 || + strcmp(value, "pen:Hangymon") == 0) { + config.animation_index = PEN20_HANGYMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Hanumon (hanumon) +if (strcmp(value, PEN20_HANUMON_NAME) == 0 || + strcmp(value, PEN20_HANUMON_ID) == 0 || + strcmp(value, PEN20_HANUMON_FQID) == 0 || + strcmp(value, PEN20_HANUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:hanumon") == 0 || + strcmp(value, "pen:Hanumon") == 0) { + config.animation_index = PEN20_HANUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Herkule Kabuterimon (herkule_kabuterimon) +if (strcmp(value, PEN20_HERKULE_KABUTERIMON_NAME) == 0 || + strcmp(value, PEN20_HERKULE_KABUTERIMON_ID) == 0 || + strcmp(value, PEN20_HERKULE_KABUTERIMON_FQID) == 0 || + strcmp(value, PEN20_HERKULE_KABUTERIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:herkule_kabuterimon") == 0 || + strcmp(value, "pen:Herkule Kabuterimon") == 0) { + config.animation_index = PEN20_HERKULE_KABUTERIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Hisyaryumon (hisyaryumon) +if (strcmp(value, PEN20_HISYARYUMON_NAME) == 0 || + strcmp(value, PEN20_HISYARYUMON_ID) == 0 || + strcmp(value, PEN20_HISYARYUMON_FQID) == 0 || + strcmp(value, PEN20_HISYARYUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:hisyaryumon") == 0 || + strcmp(value, "pen:Hisyaryumon") == 0) { + config.animation_index = PEN20_HISYARYUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Holy Angemon (holy_angemon) +if (strcmp(value, PEN20_HOLY_ANGEMON_NAME) == 0 || + strcmp(value, PEN20_HOLY_ANGEMON_ID) == 0 || + strcmp(value, PEN20_HOLY_ANGEMON_FQID) == 0 || + strcmp(value, PEN20_HOLY_ANGEMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:holy_angemon") == 0 || + strcmp(value, "pen:Holy Angemon") == 0) { + config.animation_index = PEN20_HOLY_ANGEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Holydramon (holydramon) +if (strcmp(value, PEN20_HOLYDRAMON_NAME) == 0 || + strcmp(value, PEN20_HOLYDRAMON_ID) == 0 || + strcmp(value, PEN20_HOLYDRAMON_FQID) == 0 || + strcmp(value, PEN20_HOLYDRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:holydramon") == 0 || + strcmp(value, "pen:Holydramon") == 0) { + config.animation_index = PEN20_HOLYDRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Hououmon (hououmon) +if (strcmp(value, PEN20_HOUOUMON_NAME) == 0 || + strcmp(value, PEN20_HOUOUMON_ID) == 0 || + strcmp(value, PEN20_HOUOUMON_FQID) == 0 || + strcmp(value, PEN20_HOUOUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:hououmon") == 0 || + strcmp(value, "pen:Hououmon") == 0) { + config.animation_index = PEN20_HOUOUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ignamon (ignamon) +if (strcmp(value, PEN20_IGNAMON_NAME) == 0 || + strcmp(value, PEN20_IGNAMON_ID) == 0 || + strcmp(value, PEN20_IGNAMON_FQID) == 0 || + strcmp(value, PEN20_IGNAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:ignamon") == 0 || + strcmp(value, "pen:Ignamon") == 0) { + config.animation_index = PEN20_IGNAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ikkakumon (ikkakumon) +if (strcmp(value, PEN20_IKKAKUMON_NAME) == 0 || + strcmp(value, PEN20_IKKAKUMON_ID) == 0 || + strcmp(value, PEN20_IKKAKUMON_FQID) == 0 || + strcmp(value, PEN20_IKKAKUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:ikkakumon") == 0 || + strcmp(value, "pen:Ikkakumon") == 0) { + config.animation_index = PEN20_IKKAKUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Imperialdramon Fighter Mode (imperialdramon_fighter_mode) +if (strcmp(value, PEN20_IMPERIALDRAMON_FIGHTER_MODE_NAME) == 0 || + strcmp(value, PEN20_IMPERIALDRAMON_FIGHTER_MODE_ID) == 0 || + strcmp(value, PEN20_IMPERIALDRAMON_FIGHTER_MODE_FQID) == 0 || + strcmp(value, PEN20_IMPERIALDRAMON_FIGHTER_MODE_FQNAME) == 0 || + // alt + strcmp(value, "pen:imperialdramon_fighter_mode") == 0 || + strcmp(value, "pen:Imperialdramon Fighter Mode") == 0) { + config.animation_index = PEN20_IMPERIALDRAMON_FIGHTER_MODE_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Impmon (impmon) +if (strcmp(value, PEN20_IMPMON_NAME) == 0 || + strcmp(value, PEN20_IMPMON_ID) == 0 || + strcmp(value, PEN20_IMPMON_FQID) == 0 || + strcmp(value, PEN20_IMPMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:impmon") == 0 || + strcmp(value, "pen:Impmon") == 0) { + config.animation_index = PEN20_IMPMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Jesmon X (jesmon_x) +if (strcmp(value, PEN20_JESMON_X_NAME) == 0 || + strcmp(value, PEN20_JESMON_X_ID) == 0 || + strcmp(value, PEN20_JESMON_X_FQID) == 0 || + strcmp(value, PEN20_JESMON_X_FQNAME) == 0 || + // alt + strcmp(value, "pen:jesmon_x") == 0 || + strcmp(value, "pen:Jesmon X") == 0) { + config.animation_index = PEN20_JESMON_X_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Jyagamon (jyagamon) +if (strcmp(value, PEN20_JYAGAMON_NAME) == 0 || + strcmp(value, PEN20_JYAGAMON_ID) == 0 || + strcmp(value, PEN20_JYAGAMON_FQID) == 0 || + strcmp(value, PEN20_JYAGAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:jyagamon") == 0 || + strcmp(value, "pen:Jyagamon") == 0) { + config.animation_index = PEN20_JYAGAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Jyureimon (jyureimon) +if (strcmp(value, PEN20_JYUREIMON_NAME) == 0 || + strcmp(value, PEN20_JYUREIMON_ID) == 0 || + strcmp(value, PEN20_JYUREIMON_FQID) == 0 || + strcmp(value, PEN20_JYUREIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:jyureimon") == 0 || + strcmp(value, "pen:Jyureimon") == 0) { + config.animation_index = PEN20_JYUREIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Kakkinmon (kakkinmon) +if (strcmp(value, PEN20_KAKKINMON_NAME) == 0 || + strcmp(value, PEN20_KAKKINMON_ID) == 0 || + strcmp(value, PEN20_KAKKINMON_FQID) == 0 || + strcmp(value, PEN20_KAKKINMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:kakkinmon") == 0 || + strcmp(value, "pen:Kakkinmon") == 0) { + config.animation_index = PEN20_KAKKINMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Kiwimon (kiwimon) +if (strcmp(value, PEN20_KIWIMON_NAME) == 0 || + strcmp(value, PEN20_KIWIMON_ID) == 0 || + strcmp(value, PEN20_KIWIMON_FQID) == 0 || + strcmp(value, PEN20_KIWIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:kiwimon") == 0 || + strcmp(value, "pen:Kiwimon") == 0) { + config.animation_index = PEN20_KIWIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Knightmon (knightmon) +if (strcmp(value, PEN20_KNIGHTMON_NAME) == 0 || + strcmp(value, PEN20_KNIGHTMON_ID) == 0 || + strcmp(value, PEN20_KNIGHTMON_FQID) == 0 || + strcmp(value, PEN20_KNIGHTMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:knightmon") == 0 || + strcmp(value, "pen:Knightmon") == 0) { + config.animation_index = PEN20_KNIGHTMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Kokuwamon (kokuwamon) +if (strcmp(value, PEN20_KOKUWAMON_NAME) == 0 || + strcmp(value, PEN20_KOKUWAMON_ID) == 0 || + strcmp(value, PEN20_KOKUWAMON_FQID) == 0 || + strcmp(value, PEN20_KOKUWAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:kokuwamon") == 0 || + strcmp(value, "pen:Kokuwamon") == 0) { + config.animation_index = PEN20_KOKUWAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Kyokyomon (kyokyomon) +if (strcmp(value, PEN20_KYOKYOMON_NAME) == 0 || + strcmp(value, PEN20_KYOKYOMON_ID) == 0 || + strcmp(value, PEN20_KYOKYOMON_FQID) == 0 || + strcmp(value, PEN20_KYOKYOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:kyokyomon") == 0 || + strcmp(value, "pen:Kyokyomon") == 0) { + config.animation_index = PEN20_KYOKYOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Lady Devimon (lady_devimon) +if (strcmp(value, PEN20_LADY_DEVIMON_NAME) == 0 || + strcmp(value, PEN20_LADY_DEVIMON_ID) == 0 || + strcmp(value, PEN20_LADY_DEVIMON_FQID) == 0 || + strcmp(value, PEN20_LADY_DEVIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:lady_devimon") == 0 || + strcmp(value, "pen:Lady Devimon") == 0) { + config.animation_index = PEN20_LADY_DEVIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Lalamon (lalamon) +if (strcmp(value, PEN20_LALAMON_NAME) == 0 || + strcmp(value, PEN20_LALAMON_ID) == 0 || + strcmp(value, PEN20_LALAMON_FQID) == 0 || + strcmp(value, PEN20_LALAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:lalamon") == 0 || + strcmp(value, "pen:Lalamon") == 0) { + config.animation_index = PEN20_LALAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Lavogaritamon (lavogaritamon) +if (strcmp(value, PEN20_LAVOGARITAMON_NAME) == 0 || + strcmp(value, PEN20_LAVOGARITAMON_ID) == 0 || + strcmp(value, PEN20_LAVOGARITAMON_FQID) == 0 || + strcmp(value, PEN20_LAVOGARITAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:lavogaritamon") == 0 || + strcmp(value, "pen:Lavogaritamon") == 0) { + config.animation_index = PEN20_LAVOGARITAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Lavorvomon (lavorvomon) +if (strcmp(value, PEN20_LAVORVOMON_NAME) == 0 || + strcmp(value, PEN20_LAVORVOMON_ID) == 0 || + strcmp(value, PEN20_LAVORVOMON_FQID) == 0 || + strcmp(value, PEN20_LAVORVOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:lavorvomon") == 0 || + strcmp(value, "pen:Lavorvomon") == 0) { + config.animation_index = PEN20_LAVORVOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Lilamon (lilamon) +if (strcmp(value, PEN20_LILAMON_NAME) == 0 || + strcmp(value, PEN20_LILAMON_ID) == 0 || + strcmp(value, PEN20_LILAMON_FQID) == 0 || + strcmp(value, PEN20_LILAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:lilamon") == 0 || + strcmp(value, "pen:Lilamon") == 0) { + config.animation_index = PEN20_LILAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Lilimon (lilimon) +if (strcmp(value, PEN20_LILIMON_NAME) == 0 || + strcmp(value, PEN20_LILIMON_ID) == 0 || + strcmp(value, PEN20_LILIMON_FQID) == 0 || + strcmp(value, PEN20_LILIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:lilimon") == 0 || + strcmp(value, "pen:Lilimon") == 0) { + config.animation_index = PEN20_LILIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Lopmon (lopmon) +if (strcmp(value, PEN20_LOPMON_NAME) == 0 || + strcmp(value, PEN20_LOPMON_ID) == 0 || + strcmp(value, PEN20_LOPMON_FQID) == 0 || + strcmp(value, PEN20_LOPMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:lopmon") == 0 || + strcmp(value, "pen:Lopmon") == 0) { + config.animation_index = PEN20_LOPMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Lotusmon (lotusmon) +if (strcmp(value, PEN20_LOTUSMON_NAME) == 0 || + strcmp(value, PEN20_LOTUSMON_ID) == 0 || + strcmp(value, PEN20_LOTUSMON_FQID) == 0 || + strcmp(value, PEN20_LOTUSMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:lotusmon") == 0 || + strcmp(value, "pen:Lotusmon") == 0) { + config.animation_index = PEN20_LOTUSMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ludomon (ludomon) +if (strcmp(value, PEN20_LUDOMON_NAME) == 0 || + strcmp(value, PEN20_LUDOMON_ID) == 0 || + strcmp(value, PEN20_LUDOMON_FQID) == 0 || + strcmp(value, PEN20_LUDOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:ludomon") == 0 || + strcmp(value, "pen:Ludomon") == 0) { + config.animation_index = PEN20_LUDOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mad Leomon (mad_leomon) +if (strcmp(value, PEN20_MAD_LEOMON_NAME) == 0 || + strcmp(value, PEN20_MAD_LEOMON_ID) == 0 || + strcmp(value, PEN20_MAD_LEOMON_FQID) == 0 || + strcmp(value, PEN20_MAD_LEOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:mad_leomon") == 0 || + strcmp(value, "pen:Mad Leomon") == 0) { + config.animation_index = PEN20_MAD_LEOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mambomon (mambomon) +if (strcmp(value, PEN20_MAMBOMON_NAME) == 0 || + strcmp(value, PEN20_MAMBOMON_ID) == 0 || + strcmp(value, PEN20_MAMBOMON_FQID) == 0 || + strcmp(value, PEN20_MAMBOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:mambomon") == 0 || + strcmp(value, "pen:Mambomon") == 0) { + config.animation_index = PEN20_MAMBOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mammon (mammon) +if (strcmp(value, PEN20_MAMMON_NAME) == 0 || + strcmp(value, PEN20_MAMMON_ID) == 0 || + strcmp(value, PEN20_MAMMON_FQID) == 0 || + strcmp(value, PEN20_MAMMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:mammon") == 0 || + strcmp(value, "pen:Mammon") == 0) { + config.animation_index = PEN20_MAMMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Marin Angemon (marin_angemon) +if (strcmp(value, PEN20_MARIN_ANGEMON_NAME) == 0 || + strcmp(value, PEN20_MARIN_ANGEMON_ID) == 0 || + strcmp(value, PEN20_MARIN_ANGEMON_FQID) == 0 || + strcmp(value, PEN20_MARIN_ANGEMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:marin_angemon") == 0 || + strcmp(value, "pen:Marin Angemon") == 0) { + config.animation_index = PEN20_MARIN_ANGEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Marin Devimon (marin_devimon) +if (strcmp(value, PEN20_MARIN_DEVIMON_NAME) == 0 || + strcmp(value, PEN20_MARIN_DEVIMON_ID) == 0 || + strcmp(value, PEN20_MARIN_DEVIMON_FQID) == 0 || + strcmp(value, PEN20_MARIN_DEVIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:marin_devimon") == 0 || + strcmp(value, "pen:Marin Devimon") == 0) { + config.animation_index = PEN20_MARIN_DEVIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mastemon (mastemon) +if (strcmp(value, PEN20_MASTEMON_NAME) == 0 || + strcmp(value, PEN20_MASTEMON_ID) == 0 || + strcmp(value, PEN20_MASTEMON_FQID) == 0 || + strcmp(value, PEN20_MASTEMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:mastemon") == 0 || + strcmp(value, "pen:Mastemon") == 0) { + config.animation_index = PEN20_MASTEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mechanorimon (mechanorimon) +if (strcmp(value, PEN20_MECHANORIMON_NAME) == 0 || + strcmp(value, PEN20_MECHANORIMON_ID) == 0 || + strcmp(value, PEN20_MECHANORIMON_FQID) == 0 || + strcmp(value, PEN20_MECHANORIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:mechanorimon") == 0 || + strcmp(value, "pen:Mechanorimon") == 0) { + config.animation_index = PEN20_MECHANORIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Megalo Growmon (megalo_growmon) +if (strcmp(value, PEN20_MEGALO_GROWMON_NAME) == 0 || + strcmp(value, PEN20_MEGALO_GROWMON_ID) == 0 || + strcmp(value, PEN20_MEGALO_GROWMON_FQID) == 0 || + strcmp(value, PEN20_MEGALO_GROWMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:megalo_growmon") == 0 || + strcmp(value, "pen:Megalo Growmon") == 0) { + config.animation_index = PEN20_MEGALO_GROWMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mega Seadramon (mega_seadramon) +if (strcmp(value, PEN20_MEGA_SEADRAMON_NAME) == 0 || + strcmp(value, PEN20_MEGA_SEADRAMON_ID) == 0 || + strcmp(value, PEN20_MEGA_SEADRAMON_FQID) == 0 || + strcmp(value, PEN20_MEGA_SEADRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:mega_seadramon") == 0 || + strcmp(value, "pen:Mega Seadramon") == 0) { + config.animation_index = PEN20_MEGA_SEADRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Meicrackmon Vicious Mode (meicrackmon_vicious_mode) +if (strcmp(value, PEN20_MEICRACKMON_VICIOUS_MODE_NAME) == 0 || + strcmp(value, PEN20_MEICRACKMON_VICIOUS_MODE_ID) == 0 || + strcmp(value, PEN20_MEICRACKMON_VICIOUS_MODE_FQID) == 0 || + strcmp(value, PEN20_MEICRACKMON_VICIOUS_MODE_FQNAME) == 0 || + // alt + strcmp(value, "pen:meicrackmon_vicious_mode") == 0 || + strcmp(value, "pen:Meicrackmon Vicious Mode") == 0) { + config.animation_index = PEN20_MEICRACKMON_VICIOUS_MODE_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Metal Etemon (metal_etemon) +if (strcmp(value, PEN20_METAL_ETEMON_NAME) == 0 || + strcmp(value, PEN20_METAL_ETEMON_ID) == 0 || + strcmp(value, PEN20_METAL_ETEMON_FQID) == 0 || + strcmp(value, PEN20_METAL_ETEMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:metal_etemon") == 0 || + strcmp(value, "pen:Metal Etemon") == 0) { + config.animation_index = PEN20_METAL_ETEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Metal Seadramon (metal_seadramon) +if (strcmp(value, PEN20_METAL_SEADRAMON_NAME) == 0 || + strcmp(value, PEN20_METAL_SEADRAMON_ID) == 0 || + strcmp(value, PEN20_METAL_SEADRAMON_FQID) == 0 || + strcmp(value, PEN20_METAL_SEADRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:metal_seadramon") == 0 || + strcmp(value, "pen:Metal Seadramon") == 0) { + config.animation_index = PEN20_METAL_SEADRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mochimon (mochimon) +if (strcmp(value, PEN20_MOCHIMON_NAME) == 0 || + strcmp(value, PEN20_MOCHIMON_ID) == 0 || + strcmp(value, PEN20_MOCHIMON_FQID) == 0 || + strcmp(value, PEN20_MOCHIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:mochimon") == 0 || + strcmp(value, "pen:Mochimon") == 0) { + config.animation_index = PEN20_MOCHIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mokumon (mokumon) +if (strcmp(value, PEN20_MOKUMON_NAME) == 0 || + strcmp(value, PEN20_MOKUMON_ID) == 0 || + strcmp(value, PEN20_MOKUMON_FQID) == 0 || + strcmp(value, PEN20_MOKUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:mokumon") == 0 || + strcmp(value, "pen:Mokumon") == 0) { + config.animation_index = PEN20_MOKUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Mushmon (mushmon) +if (strcmp(value, PEN20_MUSHMON_NAME) == 0 || + strcmp(value, PEN20_MUSHMON_ID) == 0 || + strcmp(value, PEN20_MUSHMON_FQID) == 0 || + strcmp(value, PEN20_MUSHMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:mushmon") == 0 || + strcmp(value, "pen:Mushmon") == 0) { + config.animation_index = PEN20_MUSHMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Nyokimon (nyokimon) +if (strcmp(value, PEN20_NYOKIMON_NAME) == 0 || + strcmp(value, PEN20_NYOKIMON_ID) == 0 || + strcmp(value, PEN20_NYOKIMON_FQID) == 0 || + strcmp(value, PEN20_NYOKIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:nyokimon") == 0 || + strcmp(value, "pen:Nyokimon") == 0) { + config.animation_index = PEN20_NYOKIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Octmon (octmon) +if (strcmp(value, PEN20_OCTMON_NAME) == 0 || + strcmp(value, PEN20_OCTMON_ID) == 0 || + strcmp(value, PEN20_OCTMON_FQID) == 0 || + strcmp(value, PEN20_OCTMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:octmon") == 0 || + strcmp(value, "pen:Octmon") == 0) { + config.animation_index = PEN20_OCTMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ofanimon (ofanimon) +if (strcmp(value, PEN20_OFANIMON_NAME) == 0 || + strcmp(value, PEN20_OFANIMON_ID) == 0 || + strcmp(value, PEN20_OFANIMON_FQID) == 0 || + strcmp(value, PEN20_OFANIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:ofanimon") == 0 || + strcmp(value, "pen:Ofanimon") == 0) { + config.animation_index = PEN20_OFANIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ogudomon (ogudomon) +if (strcmp(value, PEN20_OGUDOMON_NAME) == 0 || + strcmp(value, PEN20_OGUDOMON_ID) == 0 || + strcmp(value, PEN20_OGUDOMON_FQID) == 0 || + strcmp(value, PEN20_OGUDOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:ogudomon") == 0 || + strcmp(value, "pen:Ogudomon") == 0) { + config.animation_index = PEN20_OGUDOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Okuwamon (okuwamon) +if (strcmp(value, PEN20_OKUWAMON_NAME) == 0 || + strcmp(value, PEN20_OKUWAMON_ID) == 0 || + strcmp(value, PEN20_OKUWAMON_FQID) == 0 || + strcmp(value, PEN20_OKUWAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:okuwamon") == 0 || + strcmp(value, "pen:Okuwamon") == 0) { + config.animation_index = PEN20_OKUWAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ordinemon (ordinemon) +if (strcmp(value, PEN20_ORDINEMON_NAME) == 0 || + strcmp(value, PEN20_ORDINEMON_ID) == 0 || + strcmp(value, PEN20_ORDINEMON_FQID) == 0 || + strcmp(value, PEN20_ORDINEMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:ordinemon") == 0 || + strcmp(value, "pen:Ordinemon") == 0) { + config.animation_index = PEN20_ORDINEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Otamamon (otamamon) +if (strcmp(value, PEN20_OTAMAMON_NAME) == 0 || + strcmp(value, PEN20_OTAMAMON_ID) == 0 || + strcmp(value, PEN20_OTAMAMON_FQID) == 0 || + strcmp(value, PEN20_OTAMAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:otamamon") == 0 || + strcmp(value, "pen:Otamamon") == 0) { + config.animation_index = PEN20_OTAMAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ouryumon (ouryumon) +if (strcmp(value, PEN20_OURYUMON_NAME) == 0 || + strcmp(value, PEN20_OURYUMON_ID) == 0 || + strcmp(value, PEN20_OURYUMON_FQID) == 0 || + strcmp(value, PEN20_OURYUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:ouryumon") == 0 || + strcmp(value, "pen:Ouryumon") == 0) { + config.animation_index = PEN20_OURYUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Paildramon (paildramon) +if (strcmp(value, PEN20_PAILDRAMON_NAME) == 0 || + strcmp(value, PEN20_PAILDRAMON_ID) == 0 || + strcmp(value, PEN20_PAILDRAMON_FQID) == 0 || + strcmp(value, PEN20_PAILDRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:paildramon") == 0 || + strcmp(value, "pen:Paildramon") == 0) { + config.animation_index = PEN20_PAILDRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Peti Meramon (peti_meramon) +if (strcmp(value, PEN20_PETI_MERAMON_NAME) == 0 || + strcmp(value, PEN20_PETI_MERAMON_ID) == 0 || + strcmp(value, PEN20_PETI_MERAMON_FQID) == 0 || + strcmp(value, PEN20_PETI_MERAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:peti_meramon") == 0 || + strcmp(value, "pen:Peti Meramon") == 0) { + config.animation_index = PEN20_PETI_MERAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Phascomon (phascomon) +if (strcmp(value, PEN20_PHASCOMON_NAME) == 0 || + strcmp(value, PEN20_PHASCOMON_ID) == 0 || + strcmp(value, PEN20_PHASCOMON_FQID) == 0 || + strcmp(value, PEN20_PHASCOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:phascomon") == 0 || + strcmp(value, "pen:Phascomon") == 0) { + config.animation_index = PEN20_PHASCOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Pico Devimon (pico_devimon) +if (strcmp(value, PEN20_PICO_DEVIMON_NAME) == 0 || + strcmp(value, PEN20_PICO_DEVIMON_ID) == 0 || + strcmp(value, PEN20_PICO_DEVIMON_FQID) == 0 || + strcmp(value, PEN20_PICO_DEVIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:pico_devimon") == 0 || + strcmp(value, "pen:Pico Devimon") == 0) { + config.animation_index = PEN20_PICO_DEVIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Piemon (piemon) +if (strcmp(value, PEN20_PIEMON_NAME) == 0 || + strcmp(value, PEN20_PIEMON_ID) == 0 || + strcmp(value, PEN20_PIEMON_FQID) == 0 || + strcmp(value, PEN20_PIEMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:piemon") == 0 || + strcmp(value, "pen:Piemon") == 0) { + config.animation_index = PEN20_PIEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Plesiomon (plesiomon) +if (strcmp(value, PEN20_PLESIOMON_NAME) == 0 || + strcmp(value, PEN20_PLESIOMON_ID) == 0 || + strcmp(value, PEN20_PLESIOMON_FQID) == 0 || + strcmp(value, PEN20_PLESIOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:plesiomon") == 0 || + strcmp(value, "pen:Plesiomon") == 0) { + config.animation_index = PEN20_PLESIOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Porcupmon (porcupmon) +if (strcmp(value, PEN20_PORCUPMON_NAME) == 0 || + strcmp(value, PEN20_PORCUPMON_ID) == 0 || + strcmp(value, PEN20_PORCUPMON_FQID) == 0 || + strcmp(value, PEN20_PORCUPMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:porcupmon") == 0 || + strcmp(value, "pen:Porcupmon") == 0) { + config.animation_index = PEN20_PORCUPMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Pukumon (pukumon) +if (strcmp(value, PEN20_PUKUMON_NAME) == 0 || + strcmp(value, PEN20_PUKUMON_ID) == 0 || + strcmp(value, PEN20_PUKUMON_FQID) == 0 || + strcmp(value, PEN20_PUKUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:pukumon") == 0 || + strcmp(value, "pen:Pukumon") == 0) { + config.animation_index = PEN20_PUKUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Pumpmon (pumpmon) +if (strcmp(value, PEN20_PUMPMON_NAME) == 0 || + strcmp(value, PEN20_PUMPMON_ID) == 0 || + strcmp(value, PEN20_PUMPMON_FQID) == 0 || + strcmp(value, PEN20_PUMPMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:pumpmon") == 0 || + strcmp(value, "pen:Pumpmon") == 0) { + config.animation_index = PEN20_PUMPMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Pyocomon (pyocomon) +if (strcmp(value, PEN20_PYOCOMON_NAME) == 0 || + strcmp(value, PEN20_PYOCOMON_ID) == 0 || + strcmp(value, PEN20_PYOCOMON_FQID) == 0 || + strcmp(value, PEN20_PYOCOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:pyocomon") == 0 || + strcmp(value, "pen:Pyocomon") == 0) { + config.animation_index = PEN20_PYOCOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Rafflesimon (rafflesimon) +if (strcmp(value, PEN20_RAFFLESIMON_NAME) == 0 || + strcmp(value, PEN20_RAFFLESIMON_ID) == 0 || + strcmp(value, PEN20_RAFFLESIMON_FQID) == 0 || + strcmp(value, PEN20_RAFFLESIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:rafflesimon") == 0 || + strcmp(value, "pen:Rafflesimon") == 0) { + config.animation_index = PEN20_RAFFLESIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ragna Lordmon (ragna_lordmon) +if (strcmp(value, PEN20_RAGNA_LORDMON_NAME) == 0 || + strcmp(value, PEN20_RAGNA_LORDMON_ID) == 0 || + strcmp(value, PEN20_RAGNA_LORDMON_FQID) == 0 || + strcmp(value, PEN20_RAGNA_LORDMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:ragna_lordmon") == 0 || + strcmp(value, "pen:Ragna Lordmon") == 0) { + config.animation_index = PEN20_RAGNA_LORDMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Raguelmon (raguelmon) +if (strcmp(value, PEN20_RAGUELMON_NAME) == 0 || + strcmp(value, PEN20_RAGUELMON_ID) == 0 || + strcmp(value, PEN20_RAGUELMON_FQID) == 0 || + strcmp(value, PEN20_RAGUELMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:raguelmon") == 0 || + strcmp(value, "pen:Raguelmon") == 0) { + config.animation_index = PEN20_RAGUELMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Raiji Ludomon (raiji_ludomon) +if (strcmp(value, PEN20_RAIJI_LUDOMON_NAME) == 0 || + strcmp(value, PEN20_RAIJI_LUDOMON_ID) == 0 || + strcmp(value, PEN20_RAIJI_LUDOMON_FQID) == 0 || + strcmp(value, PEN20_RAIJI_LUDOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:raiji_ludomon") == 0 || + strcmp(value, "pen:Raiji Ludomon") == 0) { + config.animation_index = PEN20_RAIJI_LUDOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Rakamon (rakamon) +if (strcmp(value, PEN20_RAKAMON_NAME) == 0 || + strcmp(value, PEN20_RAKAMON_ID) == 0 || + strcmp(value, PEN20_RAKAMON_FQID) == 0 || + strcmp(value, PEN20_RAKAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:rakamon") == 0 || + strcmp(value, "pen:Rakamon") == 0) { + config.animation_index = PEN20_RAKAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Rapidmon (rapidmon) +if (strcmp(value, PEN20_RAPIDMON_NAME) == 0 || + strcmp(value, PEN20_RAPIDMON_ID) == 0 || + strcmp(value, PEN20_RAPIDMON_FQID) == 0 || + strcmp(value, PEN20_RAPIDMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:rapidmon") == 0 || + strcmp(value, "pen:Rapidmon") == 0) { + config.animation_index = PEN20_RAPIDMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Red Vegimon (red_vegimon) +if (strcmp(value, PEN20_RED_VEGIMON_NAME) == 0 || + strcmp(value, PEN20_RED_VEGIMON_ID) == 0 || + strcmp(value, PEN20_RED_VEGIMON_FQID) == 0 || + strcmp(value, PEN20_RED_VEGIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:red_vegimon") == 0 || + strcmp(value, "pen:Red Vegimon") == 0) { + config.animation_index = PEN20_RED_VEGIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Reppamon (reppamon) +if (strcmp(value, PEN20_REPPAMON_NAME) == 0 || + strcmp(value, PEN20_REPPAMON_ID) == 0 || + strcmp(value, PEN20_REPPAMON_FQID) == 0 || + strcmp(value, PEN20_REPPAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:reppamon") == 0 || + strcmp(value, "pen:Reppamon") == 0) { + config.animation_index = PEN20_REPPAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Revolmon (revolmon) +if (strcmp(value, PEN20_REVOLMON_NAME) == 0 || + strcmp(value, PEN20_REVOLMON_ID) == 0 || + strcmp(value, PEN20_REVOLMON_FQID) == 0 || + strcmp(value, PEN20_REVOLMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:revolmon") == 0 || + strcmp(value, "pen:Revolmon") == 0) { + config.animation_index = PEN20_REVOLMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Rize Greymon (rize_greymon) +if (strcmp(value, PEN20_RIZE_GREYMON_NAME) == 0 || + strcmp(value, PEN20_RIZE_GREYMON_ID) == 0 || + strcmp(value, PEN20_RIZE_GREYMON_FQID) == 0 || + strcmp(value, PEN20_RIZE_GREYMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:rize_greymon") == 0 || + strcmp(value, "pen:Rize Greymon") == 0) { + config.animation_index = PEN20_RIZE_GREYMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Rosemon (rosemon) +if (strcmp(value, PEN20_ROSEMON_NAME) == 0 || + strcmp(value, PEN20_ROSEMON_ID) == 0 || + strcmp(value, PEN20_ROSEMON_FQID) == 0 || + strcmp(value, PEN20_ROSEMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:rosemon") == 0 || + strcmp(value, "pen:Rosemon") == 0) { + config.animation_index = PEN20_ROSEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Ryudamon (ryudamon) +if (strcmp(value, PEN20_RYUDAMON_NAME) == 0 || + strcmp(value, PEN20_RYUDAMON_ID) == 0 || + strcmp(value, PEN20_RYUDAMON_FQID) == 0 || + strcmp(value, PEN20_RYUDAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:ryudamon") == 0 || + strcmp(value, "pen:Ryudamon") == 0) { + config.animation_index = PEN20_RYUDAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Saber Leomon (saber_leomon) +if (strcmp(value, PEN20_SABER_LEOMON_NAME) == 0 || + strcmp(value, PEN20_SABER_LEOMON_ID) == 0 || + strcmp(value, PEN20_SABER_LEOMON_FQID) == 0 || + strcmp(value, PEN20_SABER_LEOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:saber_leomon") == 0 || + strcmp(value, "pen:Saber Leomon") == 0) { + config.animation_index = PEN20_SABER_LEOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Saint Galgomon (saint_galgomon) +if (strcmp(value, PEN20_SAINT_GALGOMON_NAME) == 0 || + strcmp(value, PEN20_SAINT_GALGOMON_ID) == 0 || + strcmp(value, PEN20_SAINT_GALGOMON_FQID) == 0 || + strcmp(value, PEN20_SAINT_GALGOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:saint_galgomon") == 0 || + strcmp(value, "pen:Saint Galgomon") == 0) { + config.animation_index = PEN20_SAINT_GALGOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Seraphimon (seraphimon) +if (strcmp(value, PEN20_SERAPHIMON_NAME) == 0 || + strcmp(value, PEN20_SERAPHIMON_ID) == 0 || + strcmp(value, PEN20_SERAPHIMON_FQID) == 0 || + strcmp(value, PEN20_SERAPHIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:seraphimon") == 0 || + strcmp(value, "pen:Seraphimon") == 0) { + config.animation_index = PEN20_SERAPHIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Shadramon (shadramon) +if (strcmp(value, PEN20_SHADRAMON_NAME) == 0 || + strcmp(value, PEN20_SHADRAMON_ID) == 0 || + strcmp(value, PEN20_SHADRAMON_FQID) == 0 || + strcmp(value, PEN20_SHADRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:shadramon") == 0 || + strcmp(value, "pen:Shadramon") == 0) { + config.animation_index = PEN20_SHADRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Shakomon (shakomon) +if (strcmp(value, PEN20_SHAKOMON_NAME) == 0 || + strcmp(value, PEN20_SHAKOMON_ID) == 0 || + strcmp(value, PEN20_SHAKOMON_FQID) == 0 || + strcmp(value, PEN20_SHAKOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:shakomon") == 0 || + strcmp(value, "pen:Shakomon") == 0) { + config.animation_index = PEN20_SHAKOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Starmon (starmon) +if (strcmp(value, PEN20_STARMON_NAME) == 0 || + strcmp(value, PEN20_STARMON_ID) == 0 || + strcmp(value, PEN20_STARMON_FQID) == 0 || + strcmp(value, PEN20_STARMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:starmon") == 0 || + strcmp(value, "pen:Starmon") == 0) { + config.animation_index = PEN20_STARMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Sunflowmon (sunflowmon) +if (strcmp(value, PEN20_SUNFLOWMON_NAME) == 0 || + strcmp(value, PEN20_SUNFLOWMON_ID) == 0 || + strcmp(value, PEN20_SUNFLOWMON_FQID) == 0 || + strcmp(value, PEN20_SUNFLOWMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:sunflowmon") == 0 || + strcmp(value, "pen:Sunflowmon") == 0) { + config.animation_index = PEN20_SUNFLOWMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Tailmon (tailmon) +if (strcmp(value, PEN20_TAILMON_NAME) == 0 || + strcmp(value, PEN20_TAILMON_ID) == 0 || + strcmp(value, PEN20_TAILMON_FQID) == 0 || + strcmp(value, PEN20_TAILMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:tailmon") == 0 || + strcmp(value, "pen:Tailmon") == 0) { + config.animation_index = PEN20_TAILMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Tankmon (tankmon) +if (strcmp(value, PEN20_TANKMON_NAME) == 0 || + strcmp(value, PEN20_TANKMON_ID) == 0 || + strcmp(value, PEN20_TANKMON_FQID) == 0 || + strcmp(value, PEN20_TANKMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:tankmon") == 0 || + strcmp(value, "pen:Tankmon") == 0) { + config.animation_index = PEN20_TANKMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Targetmon (targetmon) +if (strcmp(value, PEN20_TARGETMON_NAME) == 0 || + strcmp(value, PEN20_TARGETMON_ID) == 0 || + strcmp(value, PEN20_TARGETMON_FQID) == 0 || + strcmp(value, PEN20_TARGETMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:targetmon") == 0 || + strcmp(value, "pen:Targetmon") == 0) { + config.animation_index = PEN20_TARGETMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Tentomon (tentomon) +if (strcmp(value, PEN20_TENTOMON_NAME) == 0 || + strcmp(value, PEN20_TENTOMON_ID) == 0 || + strcmp(value, PEN20_TENTOMON_FQID) == 0 || + strcmp(value, PEN20_TENTOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:tentomon") == 0 || + strcmp(value, "pen:Tentomon") == 0) { + config.animation_index = PEN20_TENTOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Terriermon (terriermon) +if (strcmp(value, PEN20_TERRIERMON_NAME) == 0 || + strcmp(value, PEN20_TERRIERMON_ID) == 0 || + strcmp(value, PEN20_TERRIERMON_FQID) == 0 || + strcmp(value, PEN20_TERRIERMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:terriermon") == 0 || + strcmp(value, "pen:Terriermon") == 0) { + config.animation_index = PEN20_TERRIERMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Thunderballmon (thunderballmon) +if (strcmp(value, PEN20_THUNDERBALLMON_NAME) == 0 || + strcmp(value, PEN20_THUNDERBALLMON_ID) == 0 || + strcmp(value, PEN20_THUNDERBALLMON_FQID) == 0 || + strcmp(value, PEN20_THUNDERBALLMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:thunderballmon") == 0 || + strcmp(value, "pen:Thunderballmon") == 0) { + config.animation_index = PEN20_THUNDERBALLMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Tia Ludomon (tia_ludomon) +if (strcmp(value, PEN20_TIA_LUDOMON_NAME) == 0 || + strcmp(value, PEN20_TIA_LUDOMON_ID) == 0 || + strcmp(value, PEN20_TIA_LUDOMON_FQID) == 0 || + strcmp(value, PEN20_TIA_LUDOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:tia_ludomon") == 0 || + strcmp(value, "pen:Tia Ludomon") == 0) { + config.animation_index = PEN20_TIA_LUDOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Togemon (togemon) +if (strcmp(value, PEN20_TOGEMON_NAME) == 0 || + strcmp(value, PEN20_TOGEMON_ID) == 0 || + strcmp(value, PEN20_TOGEMON_FQID) == 0 || + strcmp(value, PEN20_TOGEMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:togemon") == 0 || + strcmp(value, "pen:Togemon") == 0) { + config.animation_index = PEN20_TOGEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Tonosama Gekomon (tonosama_gekomon) +if (strcmp(value, PEN20_TONOSAMA_GEKOMON_NAME) == 0 || + strcmp(value, PEN20_TONOSAMA_GEKOMON_ID) == 0 || + strcmp(value, PEN20_TONOSAMA_GEKOMON_FQID) == 0 || + strcmp(value, PEN20_TONOSAMA_GEKOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:tonosama_gekomon") == 0 || + strcmp(value, "pen:Tonosama Gekomon") == 0) { + config.animation_index = PEN20_TONOSAMA_GEKOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Tortamon (tortamon) +if (strcmp(value, PEN20_TORTAMON_NAME) == 0 || + strcmp(value, PEN20_TORTAMON_ID) == 0 || + strcmp(value, PEN20_TORTAMON_FQID) == 0 || + strcmp(value, PEN20_TORTAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:tortamon") == 0 || + strcmp(value, "pen:Tortamon") == 0) { + config.animation_index = PEN20_TORTAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Toy Agumon (toy_agumon) +if (strcmp(value, PEN20_TOY_AGUMON_NAME) == 0 || + strcmp(value, PEN20_TOY_AGUMON_ID) == 0 || + strcmp(value, PEN20_TOY_AGUMON_FQID) == 0 || + strcmp(value, PEN20_TOY_AGUMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:toy_agumon") == 0 || + strcmp(value, "pen:Toy Agumon") == 0) { + config.animation_index = PEN20_TOY_AGUMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Triceramon (triceramon) +if (strcmp(value, PEN20_TRICERAMON_NAME) == 0 || + strcmp(value, PEN20_TRICERAMON_ID) == 0 || + strcmp(value, PEN20_TRICERAMON_FQID) == 0 || + strcmp(value, PEN20_TRICERAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:triceramon") == 0 || + strcmp(value, "pen:Triceramon") == 0) { + config.animation_index = PEN20_TRICERAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Troopmon (troopmon) +if (strcmp(value, PEN20_TROOPMON_NAME) == 0 || + strcmp(value, PEN20_TROOPMON_ID) == 0 || + strcmp(value, PEN20_TROOPMON_FQID) == 0 || + strcmp(value, PEN20_TROOPMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:troopmon") == 0 || + strcmp(value, "pen:Troopmon") == 0) { + config.animation_index = PEN20_TROOPMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Turuiemon (turuiemon) +if (strcmp(value, PEN20_TURUIEMON_NAME) == 0 || + strcmp(value, PEN20_TURUIEMON_ID) == 0 || + strcmp(value, PEN20_TURUIEMON_FQID) == 0 || + strcmp(value, PEN20_TURUIEMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:turuiemon") == 0 || + strcmp(value, "pen:Turuiemon") == 0) { + config.animation_index = PEN20_TURUIEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for V-dramon (v_dramon) +if (strcmp(value, PEN20_V_DRAMON_NAME) == 0 || + strcmp(value, PEN20_V_DRAMON_ID) == 0 || + strcmp(value, PEN20_V_DRAMON_FQID) == 0 || + strcmp(value, PEN20_V_DRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:v_dramon") == 0 || + strcmp(value, "pen:V-dramon") == 0) { + config.animation_index = PEN20_V_DRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Vemdemon (vemdemon) +if (strcmp(value, PEN20_VEMDEMON_NAME) == 0 || + strcmp(value, PEN20_VEMDEMON_ID) == 0 || + strcmp(value, PEN20_VEMDEMON_FQID) == 0 || + strcmp(value, PEN20_VEMDEMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:vemdemon") == 0 || + strcmp(value, "pen:Vemdemon") == 0) { + config.animation_index = PEN20_VEMDEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Venom Vamdemon (venom_vamdemon) +if (strcmp(value, PEN20_VENOM_VAMDEMON_NAME) == 0 || + strcmp(value, PEN20_VENOM_VAMDEMON_ID) == 0 || + strcmp(value, PEN20_VENOM_VAMDEMON_FQID) == 0 || + strcmp(value, PEN20_VENOM_VAMDEMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:venom_vamdemon") == 0 || + strcmp(value, "pen:Venom Vamdemon") == 0) { + config.animation_index = PEN20_VENOM_VAMDEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for V-mon (v_mon) +if (strcmp(value, PEN20_V_MON_NAME) == 0 || + strcmp(value, PEN20_V_MON_ID) == 0 || + strcmp(value, PEN20_V_MON_FQID) == 0 || + strcmp(value, PEN20_V_MON_FQNAME) == 0 || + // alt + strcmp(value, "pen:v_mon") == 0 || + strcmp(value, "pen:V-mon") == 0) { + config.animation_index = PEN20_V_MON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Volcanicdramon (volcanicdramon) +if (strcmp(value, PEN20_VOLCANICDRAMON_NAME) == 0 || + strcmp(value, PEN20_VOLCANICDRAMON_ID) == 0 || + strcmp(value, PEN20_VOLCANICDRAMON_FQID) == 0 || + strcmp(value, PEN20_VOLCANICDRAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:volcanicdramon") == 0 || + strcmp(value, "pen:Volcanicdramon") == 0) { + config.animation_index = PEN20_VOLCANICDRAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Voltobautamon (voltobautamon) +if (strcmp(value, PEN20_VOLTOBAUTAMON_NAME) == 0 || + strcmp(value, PEN20_VOLTOBAUTAMON_ID) == 0 || + strcmp(value, PEN20_VOLTOBAUTAMON_FQID) == 0 || + strcmp(value, PEN20_VOLTOBAUTAMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:voltobautamon") == 0 || + strcmp(value, "pen:Voltobautamon") == 0) { + config.animation_index = PEN20_VOLTOBAUTAMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Vorvomon (vorvomon) +if (strcmp(value, PEN20_VORVOMON_NAME) == 0 || + strcmp(value, PEN20_VORVOMON_ID) == 0 || + strcmp(value, PEN20_VORVOMON_FQID) == 0 || + strcmp(value, PEN20_VORVOMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:vorvomon") == 0 || + strcmp(value, "pen:Vorvomon") == 0) { + config.animation_index = PEN20_VORVOMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Waru Mozaemon (waru_mozaemon) +if (strcmp(value, PEN20_WARU_MOZAEMON_NAME) == 0 || + strcmp(value, PEN20_WARU_MOZAEMON_ID) == 0 || + strcmp(value, PEN20_WARU_MOZAEMON_FQID) == 0 || + strcmp(value, PEN20_WARU_MOZAEMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:waru_mozaemon") == 0 || + strcmp(value, "pen:Waru Mozaemon") == 0) { + config.animation_index = PEN20_WARU_MOZAEMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Wizarmon (wizarmon) +if (strcmp(value, PEN20_WIZARMON_NAME) == 0 || + strcmp(value, PEN20_WIZARMON_ID) == 0 || + strcmp(value, PEN20_WIZARMON_FQID) == 0 || + strcmp(value, PEN20_WIZARMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:wizarmon") == 0 || + strcmp(value, "pen:Wizarmon") == 0) { + config.animation_index = PEN20_WIZARMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Woodmon (woodmon) +if (strcmp(value, PEN20_WOODMON_NAME) == 0 || + strcmp(value, PEN20_WOODMON_ID) == 0 || + strcmp(value, PEN20_WOODMON_FQID) == 0 || + strcmp(value, PEN20_WOODMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:woodmon") == 0 || + strcmp(value, "pen:Woodmon") == 0) { + config.animation_index = PEN20_WOODMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for XV-mon (xv_mon) +if (strcmp(value, PEN20_XV_MON_NAME) == 0 || + strcmp(value, PEN20_XV_MON_ID) == 0 || + strcmp(value, PEN20_XV_MON_FQID) == 0 || + strcmp(value, PEN20_XV_MON_FQNAME) == 0 || + // alt + strcmp(value, "pen:xv_mon") == 0 || + strcmp(value, "pen:XV-mon") == 0) { + config.animation_index = PEN20_XV_MON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Zerimon (zerimon) +if (strcmp(value, PEN20_ZERIMON_NAME) == 0 || + strcmp(value, PEN20_ZERIMON_ID) == 0 || + strcmp(value, PEN20_ZERIMON_FQID) == 0 || + strcmp(value, PEN20_ZERIMON_FQNAME) == 0 || + // alt + strcmp(value, "pen:zerimon") == 0 || + strcmp(value, "pen:Zerimon") == 0) { + config.animation_index = PEN20_ZERIMON_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} +// check for Zudomom (zudomom) +if (strcmp(value, PEN20_ZUDOMOM_NAME) == 0 || + strcmp(value, PEN20_ZUDOMOM_ID) == 0 || + strcmp(value, PEN20_ZUDOMOM_FQID) == 0 || + strcmp(value, PEN20_ZUDOMOM_FQNAME) == 0 || + // alt + strcmp(value, "pen:zudomom") == 0 || + strcmp(value, "pen:Zudomom") == 0) { + config.animation_index = PEN20_ZUDOMOM_ANIM_INDEX; + config.animation_dm_set = config_animation_dm_set_t::pen20; + config.animation_sprite_sheet_layout = config_animation_sprite_sheet_layout_t::Dm; +} diff --git a/src/embedded_assets/pen20/include/pen20_init_dm_anim.cpp.inl b/src/embedded_assets/pen20/include/pen20_init_dm_anim.cpp.inl new file mode 100644 index 00000000..10969ba6 --- /dev/null +++ b/src/embedded_assets/pen20/include/pen20_init_dm_anim.cpp.inl @@ -0,0 +1,166 @@ +init_pen20_anim(ctx, PEN20_AERO_V_DRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_AERO_V_DRAMON_ANIM_INDEX), PEN20_AERO_V_DRAMON_SPRITE_SHEET_COLS, PEN20_AERO_V_DRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_AGUMON_HAKASE_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_AGUMON_HAKASE_ANIM_INDEX), PEN20_AGUMON_HAKASE_SPRITE_SHEET_COLS, PEN20_AGUMON_HAKASE_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_ALPHAMON_OURYUKEN_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ALPHAMON_OURYUKEN_ANIM_INDEX), PEN20_ALPHAMON_OURYUKEN_SPRITE_SHEET_COLS, PEN20_ALPHAMON_OURYUKEN_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_ANDIRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ANDIRAMON_ANIM_INDEX), PEN20_ANDIRAMON_SPRITE_SHEET_COLS, PEN20_ANDIRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_ANGEWOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ANGEWOMON_ANIM_INDEX), PEN20_ANGEWOMON_SPRITE_SHEET_COLS, PEN20_ANGEWOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_ANOMALOCARIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ANOMALOCARIMON_ANIM_INDEX), PEN20_ANOMALOCARIMON_SPRITE_SHEET_COLS, PEN20_ANOMALOCARIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_ARRESTERDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ARRESTERDRAMON_ANIM_INDEX), PEN20_ARRESTERDRAMON_SPRITE_SHEET_COLS, PEN20_ARRESTERDRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_ASTRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ASTRAMON_ANIM_INDEX), PEN20_ASTRAMON_SPRITE_SHEET_COLS, PEN20_ASTRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_ASURAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ASURAMON_ANIM_INDEX), PEN20_ASURAMON_SPRITE_SHEET_COLS, PEN20_ASURAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_ATLUR_KABUTERIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ATLUR_KABUTERIMON_ANIM_INDEX), PEN20_ATLUR_KABUTERIMON_SPRITE_SHEET_COLS, PEN20_ATLUR_KABUTERIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_BAALMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BAALMON_ANIM_INDEX), PEN20_BAALMON_SPRITE_SHEET_COLS, PEN20_BAALMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_BAKUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BAKUMON_ANIM_INDEX), PEN20_BAKUMON_SPRITE_SHEET_COLS, PEN20_BAKUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_BANCHO_LEOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BANCHO_LEOMON_ANIM_INDEX), PEN20_BANCHO_LEOMON_SPRITE_SHEET_COLS, PEN20_BANCHO_LEOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_BEELZEBUMON_BLAST_MODE_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BEELZEBUMON_BLAST_MODE_ANIM_INDEX), PEN20_BEELZEBUMON_BLAST_MODE_SPRITE_SHEET_COLS, PEN20_BEELZEBUMON_BLAST_MODE_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_BEOWULFMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BEOWULFMON_ANIM_INDEX), PEN20_BEOWULFMON_SPRITE_SHEET_COLS, PEN20_BEOWULFMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_BIG_MAMEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BIG_MAMEMON_ANIM_INDEX), PEN20_BIG_MAMEMON_SPRITE_SHEET_COLS, PEN20_BIG_MAMEMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_BLOSSOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BLOSSOMON_ANIM_INDEX), PEN20_BLOSSOMON_SPRITE_SHEET_COLS, PEN20_BLOSSOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_BOLTMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BOLTMON_ANIM_INDEX), PEN20_BOLTMON_SPRITE_SHEET_COLS, PEN20_BOLTMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_BRYWELUDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BRYWELUDRAMON_ANIM_INDEX), PEN20_BRYWELUDRAMON_SPRITE_SHEET_COLS, PEN20_BRYWELUDRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_BUBBMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BUBBMON_ANIM_INDEX), PEN20_BUBBMON_SPRITE_SHEET_COLS, PEN20_BUBBMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_BUDMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BUDMON_ANIM_INDEX), PEN20_BUDMON_SPRITE_SHEET_COLS, PEN20_BUDMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_BUSHI_AGUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BUSHI_AGUMON_ANIM_INDEX), PEN20_BUSHI_AGUMON_SPRITE_SHEET_COLS, PEN20_BUSHI_AGUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_CANDMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CANDMON_ANIM_INDEX), PEN20_CANDMON_SPRITE_SHEET_COLS, PEN20_CANDMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_CAPRIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CAPRIMON_ANIM_INDEX), PEN20_CAPRIMON_SPRITE_SHEET_COLS, PEN20_CAPRIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_CHAOSMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CHAOSMON_ANIM_INDEX), PEN20_CHAOSMON_SPRITE_SHEET_COLS, PEN20_CHAOSMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_CHERUBIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CHERUBIMON_ANIM_INDEX), PEN20_CHERUBIMON_SPRITE_SHEET_COLS, PEN20_CHERUBIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_CHIBIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CHIBIMON_ANIM_INDEX), PEN20_CHIBIMON_SPRITE_SHEET_COLS, PEN20_CHIBIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_CHICOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CHICOMON_ANIM_INDEX), PEN20_CHICOMON_SPRITE_SHEET_COLS, PEN20_CHICOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_CHOROMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CHOROMON_ANIM_INDEX), PEN20_CHOROMON_SPRITE_SHEET_COLS, PEN20_CHOROMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_CLOCKMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CLOCKMON_ANIM_INDEX), PEN20_CLOCKMON_SPRITE_SHEET_COLS, PEN20_CLOCKMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_COCOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_COCOMON_ANIM_INDEX), PEN20_COCOMON_SPRITE_SHEET_COLS, PEN20_COCOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_COTSUCOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_COTSUCOMON_ANIM_INDEX), PEN20_COTSUCOMON_SPRITE_SHEET_COLS, PEN20_COTSUCOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_CYBERDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CYBERDRAMON_ANIM_INDEX), PEN20_CYBERDRAMON_SPRITE_SHEET_COLS, PEN20_CYBERDRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_DAGOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_DAGOMON_ANIM_INDEX), PEN20_DAGOMON_SPRITE_SHEET_COLS, PEN20_DAGOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_DARKDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_DARKDRAMON_ANIM_INDEX), PEN20_DARKDRAMON_SPRITE_SHEET_COLS, PEN20_DARKDRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_DARK_KNIGHTMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_DARK_KNIGHTMON_ANIM_INDEX), PEN20_DARK_KNIGHTMON_SPRITE_SHEET_COLS, PEN20_DARK_KNIGHTMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_DEATH_MERAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_DEATH_MERAMON_ANIM_INDEX), PEN20_DEATH_MERAMON_SPRITE_SHEET_COLS, PEN20_DEATH_MERAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_DELUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_DELUMON_ANIM_INDEX), PEN20_DELUMON_SPRITE_SHEET_COLS, PEN20_DELUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_DOKUGUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_DOKUGUMON_ANIM_INDEX), PEN20_DOKUGUMON_SPRITE_SHEET_COLS, PEN20_DOKUGUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_DORUGORAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_DORUGORAMON_ANIM_INDEX), PEN20_DORUGORAMON_SPRITE_SHEET_COLS, PEN20_DORUGORAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_EBIDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_EBIDRAMON_ANIM_INDEX), PEN20_EBIDRAMON_SPRITE_SHEET_COLS, PEN20_EBIDRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_FANTOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_FANTOMON_ANIM_INDEX), PEN20_FANTOMON_SPRITE_SHEET_COLS, PEN20_FANTOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_FLORAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_FLORAMON_ANIM_INDEX), PEN20_FLORAMON_SPRITE_SHEET_COLS, PEN20_FLORAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_FUFUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_FUFUMON_ANIM_INDEX), PEN20_FUFUMON_SPRITE_SHEET_COLS, PEN20_FUFUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_GALGOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GALGOMON_ANIM_INDEX), PEN20_GALGOMON_SPRITE_SHEET_COLS, PEN20_GALGOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_GANIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GANIMON_ANIM_INDEX), PEN20_GANIMON_SPRITE_SHEET_COLS, PEN20_GANIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_GARUDAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GARUDAMON_ANIM_INDEX), PEN20_GARUDAMON_SPRITE_SHEET_COLS, PEN20_GARUDAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_GEKOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GEKOMON_ANIM_INDEX), PEN20_GEKOMON_SPRITE_SHEET_COLS, PEN20_GEKOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_GERBEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GERBEMON_ANIM_INDEX), PEN20_GERBEMON_SPRITE_SHEET_COLS, PEN20_GERBEMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_GESOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GESOMON_ANIM_INDEX), PEN20_GESOMON_SPRITE_SHEET_COLS, PEN20_GESOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_GINRYUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GINRYUMON_ANIM_INDEX), PEN20_GINRYUMON_SPRITE_SHEET_COLS, PEN20_GINRYUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_GOMAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GOMAMON_ANIM_INDEX), PEN20_GOMAMON_SPRITE_SHEET_COLS, PEN20_GOMAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_GOTTSUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GOTTSUMON_ANIM_INDEX), PEN20_GOTTSUMON_SPRITE_SHEET_COLS, PEN20_GOTTSUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_GRIFFOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GRIFFOMON_ANIM_INDEX), PEN20_GRIFFOMON_SPRITE_SHEET_COLS, PEN20_GRIFFOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_GROWMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GROWMON_ANIM_INDEX), PEN20_GROWMON_SPRITE_SHEET_COLS, PEN20_GROWMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_GUARDROMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GUARDROMON_ANIM_INDEX), PEN20_GUARDROMON_SPRITE_SHEET_COLS, PEN20_GUARDROMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_GUIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GUIMON_ANIM_INDEX), PEN20_GUIMON_SPRITE_SHEET_COLS, PEN20_GUIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_GUMMYMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GUMMYMON_ANIM_INDEX), PEN20_GUMMYMON_SPRITE_SHEET_COLS, PEN20_GUMMYMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_HAGURUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HAGURUMON_ANIM_INDEX), PEN20_HAGURUMON_SPRITE_SHEET_COLS, PEN20_HAGURUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_HANGYMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HANGYMON_ANIM_INDEX), PEN20_HANGYMON_SPRITE_SHEET_COLS, PEN20_HANGYMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_HANUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HANUMON_ANIM_INDEX), PEN20_HANUMON_SPRITE_SHEET_COLS, PEN20_HANUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_HERKULE_KABUTERIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HERKULE_KABUTERIMON_ANIM_INDEX), PEN20_HERKULE_KABUTERIMON_SPRITE_SHEET_COLS, PEN20_HERKULE_KABUTERIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_HISYARYUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HISYARYUMON_ANIM_INDEX), PEN20_HISYARYUMON_SPRITE_SHEET_COLS, PEN20_HISYARYUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_HOLY_ANGEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HOLY_ANGEMON_ANIM_INDEX), PEN20_HOLY_ANGEMON_SPRITE_SHEET_COLS, PEN20_HOLY_ANGEMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_HOLYDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HOLYDRAMON_ANIM_INDEX), PEN20_HOLYDRAMON_SPRITE_SHEET_COLS, PEN20_HOLYDRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_HOUOUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HOUOUMON_ANIM_INDEX), PEN20_HOUOUMON_SPRITE_SHEET_COLS, PEN20_HOUOUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_IGNAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_IGNAMON_ANIM_INDEX), PEN20_IGNAMON_SPRITE_SHEET_COLS, PEN20_IGNAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_IKKAKUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_IKKAKUMON_ANIM_INDEX), PEN20_IKKAKUMON_SPRITE_SHEET_COLS, PEN20_IKKAKUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_IMPERIALDRAMON_FIGHTER_MODE_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_IMPERIALDRAMON_FIGHTER_MODE_ANIM_INDEX), PEN20_IMPERIALDRAMON_FIGHTER_MODE_SPRITE_SHEET_COLS, PEN20_IMPERIALDRAMON_FIGHTER_MODE_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_IMPMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_IMPMON_ANIM_INDEX), PEN20_IMPMON_SPRITE_SHEET_COLS, PEN20_IMPMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_JESMON_X_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_JESMON_X_ANIM_INDEX), PEN20_JESMON_X_SPRITE_SHEET_COLS, PEN20_JESMON_X_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_JYAGAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_JYAGAMON_ANIM_INDEX), PEN20_JYAGAMON_SPRITE_SHEET_COLS, PEN20_JYAGAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_JYUREIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_JYUREIMON_ANIM_INDEX), PEN20_JYUREIMON_SPRITE_SHEET_COLS, PEN20_JYUREIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_KAKKINMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_KAKKINMON_ANIM_INDEX), PEN20_KAKKINMON_SPRITE_SHEET_COLS, PEN20_KAKKINMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_KIWIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_KIWIMON_ANIM_INDEX), PEN20_KIWIMON_SPRITE_SHEET_COLS, PEN20_KIWIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_KNIGHTMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_KNIGHTMON_ANIM_INDEX), PEN20_KNIGHTMON_SPRITE_SHEET_COLS, PEN20_KNIGHTMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_KOKUWAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_KOKUWAMON_ANIM_INDEX), PEN20_KOKUWAMON_SPRITE_SHEET_COLS, PEN20_KOKUWAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_KYOKYOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_KYOKYOMON_ANIM_INDEX), PEN20_KYOKYOMON_SPRITE_SHEET_COLS, PEN20_KYOKYOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_LADY_DEVIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LADY_DEVIMON_ANIM_INDEX), PEN20_LADY_DEVIMON_SPRITE_SHEET_COLS, PEN20_LADY_DEVIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_LALAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LALAMON_ANIM_INDEX), PEN20_LALAMON_SPRITE_SHEET_COLS, PEN20_LALAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_LAVOGARITAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LAVOGARITAMON_ANIM_INDEX), PEN20_LAVOGARITAMON_SPRITE_SHEET_COLS, PEN20_LAVOGARITAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_LAVORVOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LAVORVOMON_ANIM_INDEX), PEN20_LAVORVOMON_SPRITE_SHEET_COLS, PEN20_LAVORVOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_LILAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LILAMON_ANIM_INDEX), PEN20_LILAMON_SPRITE_SHEET_COLS, PEN20_LILAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_LILIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LILIMON_ANIM_INDEX), PEN20_LILIMON_SPRITE_SHEET_COLS, PEN20_LILIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_LOPMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LOPMON_ANIM_INDEX), PEN20_LOPMON_SPRITE_SHEET_COLS, PEN20_LOPMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_LOTUSMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LOTUSMON_ANIM_INDEX), PEN20_LOTUSMON_SPRITE_SHEET_COLS, PEN20_LOTUSMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_LUDOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LUDOMON_ANIM_INDEX), PEN20_LUDOMON_SPRITE_SHEET_COLS, PEN20_LUDOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_MAD_LEOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MAD_LEOMON_ANIM_INDEX), PEN20_MAD_LEOMON_SPRITE_SHEET_COLS, PEN20_MAD_LEOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_MAMBOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MAMBOMON_ANIM_INDEX), PEN20_MAMBOMON_SPRITE_SHEET_COLS, PEN20_MAMBOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_MAMMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MAMMON_ANIM_INDEX), PEN20_MAMMON_SPRITE_SHEET_COLS, PEN20_MAMMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_MARIN_ANGEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MARIN_ANGEMON_ANIM_INDEX), PEN20_MARIN_ANGEMON_SPRITE_SHEET_COLS, PEN20_MARIN_ANGEMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_MARIN_DEVIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MARIN_DEVIMON_ANIM_INDEX), PEN20_MARIN_DEVIMON_SPRITE_SHEET_COLS, PEN20_MARIN_DEVIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_MASTEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MASTEMON_ANIM_INDEX), PEN20_MASTEMON_SPRITE_SHEET_COLS, PEN20_MASTEMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_MECHANORIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MECHANORIMON_ANIM_INDEX), PEN20_MECHANORIMON_SPRITE_SHEET_COLS, PEN20_MECHANORIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_MEGALO_GROWMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MEGALO_GROWMON_ANIM_INDEX), PEN20_MEGALO_GROWMON_SPRITE_SHEET_COLS, PEN20_MEGALO_GROWMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_MEGA_SEADRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MEGA_SEADRAMON_ANIM_INDEX), PEN20_MEGA_SEADRAMON_SPRITE_SHEET_COLS, PEN20_MEGA_SEADRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_MEICRACKMON_VICIOUS_MODE_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MEICRACKMON_VICIOUS_MODE_ANIM_INDEX), PEN20_MEICRACKMON_VICIOUS_MODE_SPRITE_SHEET_COLS, PEN20_MEICRACKMON_VICIOUS_MODE_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_METAL_ETEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_METAL_ETEMON_ANIM_INDEX), PEN20_METAL_ETEMON_SPRITE_SHEET_COLS, PEN20_METAL_ETEMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_METAL_SEADRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_METAL_SEADRAMON_ANIM_INDEX), PEN20_METAL_SEADRAMON_SPRITE_SHEET_COLS, PEN20_METAL_SEADRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_MOCHIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MOCHIMON_ANIM_INDEX), PEN20_MOCHIMON_SPRITE_SHEET_COLS, PEN20_MOCHIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_MOKUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MOKUMON_ANIM_INDEX), PEN20_MOKUMON_SPRITE_SHEET_COLS, PEN20_MOKUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_MUSHMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MUSHMON_ANIM_INDEX), PEN20_MUSHMON_SPRITE_SHEET_COLS, PEN20_MUSHMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_NYOKIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_NYOKIMON_ANIM_INDEX), PEN20_NYOKIMON_SPRITE_SHEET_COLS, PEN20_NYOKIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_OCTMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_OCTMON_ANIM_INDEX), PEN20_OCTMON_SPRITE_SHEET_COLS, PEN20_OCTMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_OFANIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_OFANIMON_ANIM_INDEX), PEN20_OFANIMON_SPRITE_SHEET_COLS, PEN20_OFANIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_OGUDOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_OGUDOMON_ANIM_INDEX), PEN20_OGUDOMON_SPRITE_SHEET_COLS, PEN20_OGUDOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_OKUWAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_OKUWAMON_ANIM_INDEX), PEN20_OKUWAMON_SPRITE_SHEET_COLS, PEN20_OKUWAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_ORDINEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ORDINEMON_ANIM_INDEX), PEN20_ORDINEMON_SPRITE_SHEET_COLS, PEN20_ORDINEMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_OTAMAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_OTAMAMON_ANIM_INDEX), PEN20_OTAMAMON_SPRITE_SHEET_COLS, PEN20_OTAMAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_OURYUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_OURYUMON_ANIM_INDEX), PEN20_OURYUMON_SPRITE_SHEET_COLS, PEN20_OURYUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_PAILDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PAILDRAMON_ANIM_INDEX), PEN20_PAILDRAMON_SPRITE_SHEET_COLS, PEN20_PAILDRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_PETI_MERAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PETI_MERAMON_ANIM_INDEX), PEN20_PETI_MERAMON_SPRITE_SHEET_COLS, PEN20_PETI_MERAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_PHASCOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PHASCOMON_ANIM_INDEX), PEN20_PHASCOMON_SPRITE_SHEET_COLS, PEN20_PHASCOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_PICO_DEVIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PICO_DEVIMON_ANIM_INDEX), PEN20_PICO_DEVIMON_SPRITE_SHEET_COLS, PEN20_PICO_DEVIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_PIEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PIEMON_ANIM_INDEX), PEN20_PIEMON_SPRITE_SHEET_COLS, PEN20_PIEMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_PLESIOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PLESIOMON_ANIM_INDEX), PEN20_PLESIOMON_SPRITE_SHEET_COLS, PEN20_PLESIOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_PORCUPMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PORCUPMON_ANIM_INDEX), PEN20_PORCUPMON_SPRITE_SHEET_COLS, PEN20_PORCUPMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_PUKUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PUKUMON_ANIM_INDEX), PEN20_PUKUMON_SPRITE_SHEET_COLS, PEN20_PUKUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_PUMPMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PUMPMON_ANIM_INDEX), PEN20_PUMPMON_SPRITE_SHEET_COLS, PEN20_PUMPMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_PYOCOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PYOCOMON_ANIM_INDEX), PEN20_PYOCOMON_SPRITE_SHEET_COLS, PEN20_PYOCOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_RAFFLESIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RAFFLESIMON_ANIM_INDEX), PEN20_RAFFLESIMON_SPRITE_SHEET_COLS, PEN20_RAFFLESIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_RAGNA_LORDMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RAGNA_LORDMON_ANIM_INDEX), PEN20_RAGNA_LORDMON_SPRITE_SHEET_COLS, PEN20_RAGNA_LORDMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_RAGUELMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RAGUELMON_ANIM_INDEX), PEN20_RAGUELMON_SPRITE_SHEET_COLS, PEN20_RAGUELMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_RAIJI_LUDOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RAIJI_LUDOMON_ANIM_INDEX), PEN20_RAIJI_LUDOMON_SPRITE_SHEET_COLS, PEN20_RAIJI_LUDOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_RAKAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RAKAMON_ANIM_INDEX), PEN20_RAKAMON_SPRITE_SHEET_COLS, PEN20_RAKAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_RAPIDMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RAPIDMON_ANIM_INDEX), PEN20_RAPIDMON_SPRITE_SHEET_COLS, PEN20_RAPIDMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_RED_VEGIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RED_VEGIMON_ANIM_INDEX), PEN20_RED_VEGIMON_SPRITE_SHEET_COLS, PEN20_RED_VEGIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_REPPAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_REPPAMON_ANIM_INDEX), PEN20_REPPAMON_SPRITE_SHEET_COLS, PEN20_REPPAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_REVOLMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_REVOLMON_ANIM_INDEX), PEN20_REVOLMON_SPRITE_SHEET_COLS, PEN20_REVOLMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_RIZE_GREYMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RIZE_GREYMON_ANIM_INDEX), PEN20_RIZE_GREYMON_SPRITE_SHEET_COLS, PEN20_RIZE_GREYMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_ROSEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ROSEMON_ANIM_INDEX), PEN20_ROSEMON_SPRITE_SHEET_COLS, PEN20_ROSEMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_RYUDAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RYUDAMON_ANIM_INDEX), PEN20_RYUDAMON_SPRITE_SHEET_COLS, PEN20_RYUDAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_SABER_LEOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_SABER_LEOMON_ANIM_INDEX), PEN20_SABER_LEOMON_SPRITE_SHEET_COLS, PEN20_SABER_LEOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_SAINT_GALGOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_SAINT_GALGOMON_ANIM_INDEX), PEN20_SAINT_GALGOMON_SPRITE_SHEET_COLS, PEN20_SAINT_GALGOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_SERAPHIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_SERAPHIMON_ANIM_INDEX), PEN20_SERAPHIMON_SPRITE_SHEET_COLS, PEN20_SERAPHIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_SHADRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_SHADRAMON_ANIM_INDEX), PEN20_SHADRAMON_SPRITE_SHEET_COLS, PEN20_SHADRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_SHAKOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_SHAKOMON_ANIM_INDEX), PEN20_SHAKOMON_SPRITE_SHEET_COLS, PEN20_SHAKOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_STARMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_STARMON_ANIM_INDEX), PEN20_STARMON_SPRITE_SHEET_COLS, PEN20_STARMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_SUNFLOWMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_SUNFLOWMON_ANIM_INDEX), PEN20_SUNFLOWMON_SPRITE_SHEET_COLS, PEN20_SUNFLOWMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_TAILMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TAILMON_ANIM_INDEX), PEN20_TAILMON_SPRITE_SHEET_COLS, PEN20_TAILMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_TANKMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TANKMON_ANIM_INDEX), PEN20_TANKMON_SPRITE_SHEET_COLS, PEN20_TANKMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_TARGETMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TARGETMON_ANIM_INDEX), PEN20_TARGETMON_SPRITE_SHEET_COLS, PEN20_TARGETMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_TENTOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TENTOMON_ANIM_INDEX), PEN20_TENTOMON_SPRITE_SHEET_COLS, PEN20_TENTOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_TERRIERMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TERRIERMON_ANIM_INDEX), PEN20_TERRIERMON_SPRITE_SHEET_COLS, PEN20_TERRIERMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_THUNDERBALLMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_THUNDERBALLMON_ANIM_INDEX), PEN20_THUNDERBALLMON_SPRITE_SHEET_COLS, PEN20_THUNDERBALLMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_TIA_LUDOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TIA_LUDOMON_ANIM_INDEX), PEN20_TIA_LUDOMON_SPRITE_SHEET_COLS, PEN20_TIA_LUDOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_TOGEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TOGEMON_ANIM_INDEX), PEN20_TOGEMON_SPRITE_SHEET_COLS, PEN20_TOGEMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_TONOSAMA_GEKOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TONOSAMA_GEKOMON_ANIM_INDEX), PEN20_TONOSAMA_GEKOMON_SPRITE_SHEET_COLS, PEN20_TONOSAMA_GEKOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_TORTAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TORTAMON_ANIM_INDEX), PEN20_TORTAMON_SPRITE_SHEET_COLS, PEN20_TORTAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_TOY_AGUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TOY_AGUMON_ANIM_INDEX), PEN20_TOY_AGUMON_SPRITE_SHEET_COLS, PEN20_TOY_AGUMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_TRICERAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TRICERAMON_ANIM_INDEX), PEN20_TRICERAMON_SPRITE_SHEET_COLS, PEN20_TRICERAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_TROOPMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TROOPMON_ANIM_INDEX), PEN20_TROOPMON_SPRITE_SHEET_COLS, PEN20_TROOPMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_TURUIEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TURUIEMON_ANIM_INDEX), PEN20_TURUIEMON_SPRITE_SHEET_COLS, PEN20_TURUIEMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_V_DRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_V_DRAMON_ANIM_INDEX), PEN20_V_DRAMON_SPRITE_SHEET_COLS, PEN20_V_DRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_VEMDEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_VEMDEMON_ANIM_INDEX), PEN20_VEMDEMON_SPRITE_SHEET_COLS, PEN20_VEMDEMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_VENOM_VAMDEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_VENOM_VAMDEMON_ANIM_INDEX), PEN20_VENOM_VAMDEMON_SPRITE_SHEET_COLS, PEN20_VENOM_VAMDEMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_V_MON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_V_MON_ANIM_INDEX), PEN20_V_MON_SPRITE_SHEET_COLS, PEN20_V_MON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_VOLCANICDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_VOLCANICDRAMON_ANIM_INDEX), PEN20_VOLCANICDRAMON_SPRITE_SHEET_COLS, PEN20_VOLCANICDRAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_VOLTOBAUTAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_VOLTOBAUTAMON_ANIM_INDEX), PEN20_VOLTOBAUTAMON_SPRITE_SHEET_COLS, PEN20_VOLTOBAUTAMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_VORVOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_VORVOMON_ANIM_INDEX), PEN20_VORVOMON_SPRITE_SHEET_COLS, PEN20_VORVOMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_WARU_MOZAEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_WARU_MOZAEMON_ANIM_INDEX), PEN20_WARU_MOZAEMON_SPRITE_SHEET_COLS, PEN20_WARU_MOZAEMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_WIZARMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_WIZARMON_ANIM_INDEX), PEN20_WIZARMON_SPRITE_SHEET_COLS, PEN20_WIZARMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_WOODMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_WOODMON_ANIM_INDEX), PEN20_WOODMON_SPRITE_SHEET_COLS, PEN20_WOODMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_XV_MON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_XV_MON_ANIM_INDEX), PEN20_XV_MON_SPRITE_SHEET_COLS, PEN20_XV_MON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_ZERIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ZERIMON_ANIM_INDEX), PEN20_ZERIMON_SPRITE_SHEET_COLS, PEN20_ZERIMON_SPRITE_SHEET_ROWS); +init_pen20_anim(ctx, PEN20_ZUDOMOM_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ZUDOMOM_ANIM_INDEX), PEN20_ZUDOMOM_SPRITE_SHEET_COLS, PEN20_ZUDOMOM_SPRITE_SHEET_ROWS); diff --git a/src/embedded_assets/pen20/pen20_config_parse_animation_name.cpp b/src/embedded_assets/pen20/pen20_config_parse_animation_name.cpp new file mode 100644 index 00000000..c6afb56f --- /dev/null +++ b/src/embedded_assets/pen20/pen20_config_parse_animation_name.cpp @@ -0,0 +1,364 @@ +#include "embedded_assets/embedded_image.h" +#include "embedded_assets/pen20/pen20.hpp" +#include "pen20_config_parse_animation_name.h" + +namespace bongocat::assets { + static const config_animation_entry_t pen20_animation_table[] = { + { PEN20_AERO_V_DRAMON_NAME, PEN20_AERO_V_DRAMON_ID, PEN20_AERO_V_DRAMON_FQID, PEN20_AERO_V_DRAMON_FQNAME, PEN20_AERO_V_DRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_AERO_V_DRAMON_NAME, PEN20_AERO_V_DRAMON_ID, "pen:aero_v_dramon", "pen:Aero V-dramon", PEN20_AERO_V_DRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Aero V-dramon + { PEN20_AGUMON_HAKASE_NAME, PEN20_AGUMON_HAKASE_ID, PEN20_AGUMON_HAKASE_FQID, PEN20_AGUMON_HAKASE_FQNAME, PEN20_AGUMON_HAKASE_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_AGUMON_HAKASE_NAME, PEN20_AGUMON_HAKASE_ID, "pen:agumon_hakase", "pen:Agumon Hakase", PEN20_AGUMON_HAKASE_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Agumon Hakase + { PEN20_ALPHAMON_OURYUKEN_NAME, PEN20_ALPHAMON_OURYUKEN_ID, PEN20_ALPHAMON_OURYUKEN_FQID, PEN20_ALPHAMON_OURYUKEN_FQNAME, PEN20_ALPHAMON_OURYUKEN_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_ALPHAMON_OURYUKEN_NAME, PEN20_ALPHAMON_OURYUKEN_ID, "pen:alphamon_ouryuken", "pen:Alphamon Ouryuken", PEN20_ALPHAMON_OURYUKEN_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Alphamon Ouryuken + { PEN20_ANDIRAMON_NAME, PEN20_ANDIRAMON_ID, PEN20_ANDIRAMON_FQID, PEN20_ANDIRAMON_FQNAME, PEN20_ANDIRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_ANDIRAMON_NAME, PEN20_ANDIRAMON_ID, "pen:andiramon", "pen:Andiramon", PEN20_ANDIRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Andiramon + { PEN20_ANGEWOMON_NAME, PEN20_ANGEWOMON_ID, PEN20_ANGEWOMON_FQID, PEN20_ANGEWOMON_FQNAME, PEN20_ANGEWOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_ANGEWOMON_NAME, PEN20_ANGEWOMON_ID, "pen:angewomon", "pen:Angewomon", PEN20_ANGEWOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Angewomon + { PEN20_ANOMALOCARIMON_NAME, PEN20_ANOMALOCARIMON_ID, PEN20_ANOMALOCARIMON_FQID, PEN20_ANOMALOCARIMON_FQNAME, PEN20_ANOMALOCARIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_ANOMALOCARIMON_NAME, PEN20_ANOMALOCARIMON_ID, "pen:anomalocarimon", "pen:Anomalocarimon", PEN20_ANOMALOCARIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Anomalocarimon + { PEN20_ARRESTERDRAMON_NAME, PEN20_ARRESTERDRAMON_ID, PEN20_ARRESTERDRAMON_FQID, PEN20_ARRESTERDRAMON_FQNAME, PEN20_ARRESTERDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_ARRESTERDRAMON_NAME, PEN20_ARRESTERDRAMON_ID, "pen:arresterdramon", "pen:Arresterdramon", PEN20_ARRESTERDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Arresterdramon + { PEN20_ASTRAMON_NAME, PEN20_ASTRAMON_ID, PEN20_ASTRAMON_FQID, PEN20_ASTRAMON_FQNAME, PEN20_ASTRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_ASTRAMON_NAME, PEN20_ASTRAMON_ID, "pen:astramon", "pen:Astramon", PEN20_ASTRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Astramon + { PEN20_ASURAMON_NAME, PEN20_ASURAMON_ID, PEN20_ASURAMON_FQID, PEN20_ASURAMON_FQNAME, PEN20_ASURAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_ASURAMON_NAME, PEN20_ASURAMON_ID, "pen:asuramon", "pen:Asuramon", PEN20_ASURAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Asuramon + { PEN20_ATLUR_KABUTERIMON_NAME, PEN20_ATLUR_KABUTERIMON_ID, PEN20_ATLUR_KABUTERIMON_FQID, PEN20_ATLUR_KABUTERIMON_FQNAME, PEN20_ATLUR_KABUTERIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_ATLUR_KABUTERIMON_NAME, PEN20_ATLUR_KABUTERIMON_ID, "pen:atlur_kabuterimon", "pen:Atlur Kabuterimon", PEN20_ATLUR_KABUTERIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Atlur Kabuterimon + { PEN20_BAALMON_NAME, PEN20_BAALMON_ID, PEN20_BAALMON_FQID, PEN20_BAALMON_FQNAME, PEN20_BAALMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_BAALMON_NAME, PEN20_BAALMON_ID, "pen:baalmon", "pen:Baalmon", PEN20_BAALMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Baalmon + { PEN20_BAKUMON_NAME, PEN20_BAKUMON_ID, PEN20_BAKUMON_FQID, PEN20_BAKUMON_FQNAME, PEN20_BAKUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_BAKUMON_NAME, PEN20_BAKUMON_ID, "pen:bakumon", "pen:Bakumon", PEN20_BAKUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Bakumon + { PEN20_BANCHO_LEOMON_NAME, PEN20_BANCHO_LEOMON_ID, PEN20_BANCHO_LEOMON_FQID, PEN20_BANCHO_LEOMON_FQNAME, PEN20_BANCHO_LEOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_BANCHO_LEOMON_NAME, PEN20_BANCHO_LEOMON_ID, "pen:bancho_leomon", "pen:Bancho Leomon", PEN20_BANCHO_LEOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Bancho Leomon + { PEN20_BEELZEBUMON_BLAST_MODE_NAME, PEN20_BEELZEBUMON_BLAST_MODE_ID, PEN20_BEELZEBUMON_BLAST_MODE_FQID, PEN20_BEELZEBUMON_BLAST_MODE_FQNAME, PEN20_BEELZEBUMON_BLAST_MODE_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_BEELZEBUMON_BLAST_MODE_NAME, PEN20_BEELZEBUMON_BLAST_MODE_ID, "pen:beelzebumon_blast_mode", "pen:Beelzebumon Blast Mode", PEN20_BEELZEBUMON_BLAST_MODE_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Beelzebumon Blast Mode + { PEN20_BEOWULFMON_NAME, PEN20_BEOWULFMON_ID, PEN20_BEOWULFMON_FQID, PEN20_BEOWULFMON_FQNAME, PEN20_BEOWULFMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_BEOWULFMON_NAME, PEN20_BEOWULFMON_ID, "pen:beowulfmon", "pen:Beowulfmon", PEN20_BEOWULFMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Beowulfmon + { PEN20_BIG_MAMEMON_NAME, PEN20_BIG_MAMEMON_ID, PEN20_BIG_MAMEMON_FQID, PEN20_BIG_MAMEMON_FQNAME, PEN20_BIG_MAMEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_BIG_MAMEMON_NAME, PEN20_BIG_MAMEMON_ID, "pen:big_mamemon", "pen:Big Mamemon", PEN20_BIG_MAMEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Big Mamemon + { PEN20_BLOSSOMON_NAME, PEN20_BLOSSOMON_ID, PEN20_BLOSSOMON_FQID, PEN20_BLOSSOMON_FQNAME, PEN20_BLOSSOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_BLOSSOMON_NAME, PEN20_BLOSSOMON_ID, "pen:blossomon", "pen:Blossomon", PEN20_BLOSSOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Blossomon + { PEN20_BOLTMON_NAME, PEN20_BOLTMON_ID, PEN20_BOLTMON_FQID, PEN20_BOLTMON_FQNAME, PEN20_BOLTMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_BOLTMON_NAME, PEN20_BOLTMON_ID, "pen:boltmon", "pen:Boltmon", PEN20_BOLTMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Boltmon + { PEN20_BRYWELUDRAMON_NAME, PEN20_BRYWELUDRAMON_ID, PEN20_BRYWELUDRAMON_FQID, PEN20_BRYWELUDRAMON_FQNAME, PEN20_BRYWELUDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_BRYWELUDRAMON_NAME, PEN20_BRYWELUDRAMON_ID, "pen:bryweludramon", "pen:Bryweludramon", PEN20_BRYWELUDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Bryweludramon + { PEN20_BUBBMON_NAME, PEN20_BUBBMON_ID, PEN20_BUBBMON_FQID, PEN20_BUBBMON_FQNAME, PEN20_BUBBMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_BUBBMON_NAME, PEN20_BUBBMON_ID, "pen:bubbmon", "pen:Bubbmon", PEN20_BUBBMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Bubbmon + { PEN20_BUDMON_NAME, PEN20_BUDMON_ID, PEN20_BUDMON_FQID, PEN20_BUDMON_FQNAME, PEN20_BUDMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_BUDMON_NAME, PEN20_BUDMON_ID, "pen:budmon", "pen:Budmon", PEN20_BUDMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Budmon + { PEN20_BUSHI_AGUMON_NAME, PEN20_BUSHI_AGUMON_ID, PEN20_BUSHI_AGUMON_FQID, PEN20_BUSHI_AGUMON_FQNAME, PEN20_BUSHI_AGUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_BUSHI_AGUMON_NAME, PEN20_BUSHI_AGUMON_ID, "pen:bushi_agumon", "pen:Bushi Agumon", PEN20_BUSHI_AGUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Bushi Agumon + { PEN20_CANDMON_NAME, PEN20_CANDMON_ID, PEN20_CANDMON_FQID, PEN20_CANDMON_FQNAME, PEN20_CANDMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_CANDMON_NAME, PEN20_CANDMON_ID, "pen:candmon", "pen:Candmon", PEN20_CANDMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Candmon + { PEN20_CAPRIMON_NAME, PEN20_CAPRIMON_ID, PEN20_CAPRIMON_FQID, PEN20_CAPRIMON_FQNAME, PEN20_CAPRIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_CAPRIMON_NAME, PEN20_CAPRIMON_ID, "pen:caprimon", "pen:Caprimon", PEN20_CAPRIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Caprimon + { PEN20_CHAOSMON_NAME, PEN20_CHAOSMON_ID, PEN20_CHAOSMON_FQID, PEN20_CHAOSMON_FQNAME, PEN20_CHAOSMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_CHAOSMON_NAME, PEN20_CHAOSMON_ID, "pen:chaosmon", "pen:Chaosmon", PEN20_CHAOSMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Chaosmon + { PEN20_CHERUBIMON_NAME, PEN20_CHERUBIMON_ID, PEN20_CHERUBIMON_FQID, PEN20_CHERUBIMON_FQNAME, PEN20_CHERUBIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_CHERUBIMON_NAME, PEN20_CHERUBIMON_ID, "pen:cherubimon", "pen:Cherubimon", PEN20_CHERUBIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Cherubimon + { PEN20_CHIBIMON_NAME, PEN20_CHIBIMON_ID, PEN20_CHIBIMON_FQID, PEN20_CHIBIMON_FQNAME, PEN20_CHIBIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_CHIBIMON_NAME, PEN20_CHIBIMON_ID, "pen:chibimon", "pen:Chibimon", PEN20_CHIBIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Chibimon + { PEN20_CHICOMON_NAME, PEN20_CHICOMON_ID, PEN20_CHICOMON_FQID, PEN20_CHICOMON_FQNAME, PEN20_CHICOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_CHICOMON_NAME, PEN20_CHICOMON_ID, "pen:chicomon", "pen:Chicomon", PEN20_CHICOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Chicomon + { PEN20_CHOROMON_NAME, PEN20_CHOROMON_ID, PEN20_CHOROMON_FQID, PEN20_CHOROMON_FQNAME, PEN20_CHOROMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_CHOROMON_NAME, PEN20_CHOROMON_ID, "pen:choromon", "pen:Choromon", PEN20_CHOROMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Choromon + { PEN20_CLOCKMON_NAME, PEN20_CLOCKMON_ID, PEN20_CLOCKMON_FQID, PEN20_CLOCKMON_FQNAME, PEN20_CLOCKMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_CLOCKMON_NAME, PEN20_CLOCKMON_ID, "pen:clockmon", "pen:Clockmon", PEN20_CLOCKMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Clockmon + { PEN20_COCOMON_NAME, PEN20_COCOMON_ID, PEN20_COCOMON_FQID, PEN20_COCOMON_FQNAME, PEN20_COCOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_COCOMON_NAME, PEN20_COCOMON_ID, "pen:cocomon", "pen:Cocomon", PEN20_COCOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Cocomon + { PEN20_COTSUCOMON_NAME, PEN20_COTSUCOMON_ID, PEN20_COTSUCOMON_FQID, PEN20_COTSUCOMON_FQNAME, PEN20_COTSUCOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_COTSUCOMON_NAME, PEN20_COTSUCOMON_ID, "pen:cotsucomon", "pen:Cotsucomon", PEN20_COTSUCOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Cotsucomon + { PEN20_CYBERDRAMON_NAME, PEN20_CYBERDRAMON_ID, PEN20_CYBERDRAMON_FQID, PEN20_CYBERDRAMON_FQNAME, PEN20_CYBERDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_CYBERDRAMON_NAME, PEN20_CYBERDRAMON_ID, "pen:cyberdramon", "pen:Cyberdramon", PEN20_CYBERDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Cyberdramon + { PEN20_DAGOMON_NAME, PEN20_DAGOMON_ID, PEN20_DAGOMON_FQID, PEN20_DAGOMON_FQNAME, PEN20_DAGOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_DAGOMON_NAME, PEN20_DAGOMON_ID, "pen:dagomon", "pen:Dagomon", PEN20_DAGOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Dagomon + { PEN20_DARKDRAMON_NAME, PEN20_DARKDRAMON_ID, PEN20_DARKDRAMON_FQID, PEN20_DARKDRAMON_FQNAME, PEN20_DARKDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_DARKDRAMON_NAME, PEN20_DARKDRAMON_ID, "pen:darkdramon", "pen:Darkdramon", PEN20_DARKDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Darkdramon + { PEN20_DARK_KNIGHTMON_NAME, PEN20_DARK_KNIGHTMON_ID, PEN20_DARK_KNIGHTMON_FQID, PEN20_DARK_KNIGHTMON_FQNAME, PEN20_DARK_KNIGHTMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_DARK_KNIGHTMON_NAME, PEN20_DARK_KNIGHTMON_ID, "pen:dark_knightmon", "pen:Dark Knightmon", PEN20_DARK_KNIGHTMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Dark Knightmon + { PEN20_DEATH_MERAMON_NAME, PEN20_DEATH_MERAMON_ID, PEN20_DEATH_MERAMON_FQID, PEN20_DEATH_MERAMON_FQNAME, PEN20_DEATH_MERAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_DEATH_MERAMON_NAME, PEN20_DEATH_MERAMON_ID, "pen:death_meramon", "pen:Death Meramon", PEN20_DEATH_MERAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Death Meramon + { PEN20_DELUMON_NAME, PEN20_DELUMON_ID, PEN20_DELUMON_FQID, PEN20_DELUMON_FQNAME, PEN20_DELUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_DELUMON_NAME, PEN20_DELUMON_ID, "pen:delumon", "pen:Delumon", PEN20_DELUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Delumon + { PEN20_DOKUGUMON_NAME, PEN20_DOKUGUMON_ID, PEN20_DOKUGUMON_FQID, PEN20_DOKUGUMON_FQNAME, PEN20_DOKUGUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_DOKUGUMON_NAME, PEN20_DOKUGUMON_ID, "pen:dokugumon", "pen:Dokugumon", PEN20_DOKUGUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Dokugumon + { PEN20_DORUGORAMON_NAME, PEN20_DORUGORAMON_ID, PEN20_DORUGORAMON_FQID, PEN20_DORUGORAMON_FQNAME, PEN20_DORUGORAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_DORUGORAMON_NAME, PEN20_DORUGORAMON_ID, "pen:dorugoramon", "pen:DORUgoramon", PEN20_DORUGORAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for DORUgoramon + { PEN20_EBIDRAMON_NAME, PEN20_EBIDRAMON_ID, PEN20_EBIDRAMON_FQID, PEN20_EBIDRAMON_FQNAME, PEN20_EBIDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_EBIDRAMON_NAME, PEN20_EBIDRAMON_ID, "pen:ebidramon", "pen:Ebidramon", PEN20_EBIDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Ebidramon + { PEN20_FANTOMON_NAME, PEN20_FANTOMON_ID, PEN20_FANTOMON_FQID, PEN20_FANTOMON_FQNAME, PEN20_FANTOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_FANTOMON_NAME, PEN20_FANTOMON_ID, "pen:fantomon", "pen:Fantomon", PEN20_FANTOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Fantomon + { PEN20_FLORAMON_NAME, PEN20_FLORAMON_ID, PEN20_FLORAMON_FQID, PEN20_FLORAMON_FQNAME, PEN20_FLORAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_FLORAMON_NAME, PEN20_FLORAMON_ID, "pen:floramon", "pen:Floramon", PEN20_FLORAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Floramon + { PEN20_FUFUMON_NAME, PEN20_FUFUMON_ID, PEN20_FUFUMON_FQID, PEN20_FUFUMON_FQNAME, PEN20_FUFUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_FUFUMON_NAME, PEN20_FUFUMON_ID, "pen:fufumon", "pen:Fufumon", PEN20_FUFUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Fufumon + { PEN20_GALGOMON_NAME, PEN20_GALGOMON_ID, PEN20_GALGOMON_FQID, PEN20_GALGOMON_FQNAME, PEN20_GALGOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_GALGOMON_NAME, PEN20_GALGOMON_ID, "pen:galgomon", "pen:Galgomon", PEN20_GALGOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Galgomon + { PEN20_GANIMON_NAME, PEN20_GANIMON_ID, PEN20_GANIMON_FQID, PEN20_GANIMON_FQNAME, PEN20_GANIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_GANIMON_NAME, PEN20_GANIMON_ID, "pen:ganimon", "pen:Ganimon", PEN20_GANIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Ganimon + { PEN20_GARUDAMON_NAME, PEN20_GARUDAMON_ID, PEN20_GARUDAMON_FQID, PEN20_GARUDAMON_FQNAME, PEN20_GARUDAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_GARUDAMON_NAME, PEN20_GARUDAMON_ID, "pen:garudamon", "pen:Garudamon", PEN20_GARUDAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Garudamon + { PEN20_GEKOMON_NAME, PEN20_GEKOMON_ID, PEN20_GEKOMON_FQID, PEN20_GEKOMON_FQNAME, PEN20_GEKOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_GEKOMON_NAME, PEN20_GEKOMON_ID, "pen:gekomon", "pen:Gekomon", PEN20_GEKOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Gekomon + { PEN20_GERBEMON_NAME, PEN20_GERBEMON_ID, PEN20_GERBEMON_FQID, PEN20_GERBEMON_FQNAME, PEN20_GERBEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_GERBEMON_NAME, PEN20_GERBEMON_ID, "pen:gerbemon", "pen:Gerbemon", PEN20_GERBEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Gerbemon + { PEN20_GESOMON_NAME, PEN20_GESOMON_ID, PEN20_GESOMON_FQID, PEN20_GESOMON_FQNAME, PEN20_GESOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_GESOMON_NAME, PEN20_GESOMON_ID, "pen:gesomon", "pen:Gesomon", PEN20_GESOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Gesomon + { PEN20_GINRYUMON_NAME, PEN20_GINRYUMON_ID, PEN20_GINRYUMON_FQID, PEN20_GINRYUMON_FQNAME, PEN20_GINRYUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_GINRYUMON_NAME, PEN20_GINRYUMON_ID, "pen:ginryumon", "pen:Ginryumon", PEN20_GINRYUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Ginryumon + { PEN20_GOMAMON_NAME, PEN20_GOMAMON_ID, PEN20_GOMAMON_FQID, PEN20_GOMAMON_FQNAME, PEN20_GOMAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_GOMAMON_NAME, PEN20_GOMAMON_ID, "pen:gomamon", "pen:Gomamon", PEN20_GOMAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Gomamon + { PEN20_GOTTSUMON_NAME, PEN20_GOTTSUMON_ID, PEN20_GOTTSUMON_FQID, PEN20_GOTTSUMON_FQNAME, PEN20_GOTTSUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_GOTTSUMON_NAME, PEN20_GOTTSUMON_ID, "pen:gottsumon", "pen:Gottsumon", PEN20_GOTTSUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Gottsumon + { PEN20_GRIFFOMON_NAME, PEN20_GRIFFOMON_ID, PEN20_GRIFFOMON_FQID, PEN20_GRIFFOMON_FQNAME, PEN20_GRIFFOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_GRIFFOMON_NAME, PEN20_GRIFFOMON_ID, "pen:griffomon", "pen:Griffomon", PEN20_GRIFFOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Griffomon + { PEN20_GROWMON_NAME, PEN20_GROWMON_ID, PEN20_GROWMON_FQID, PEN20_GROWMON_FQNAME, PEN20_GROWMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_GROWMON_NAME, PEN20_GROWMON_ID, "pen:growmon", "pen:Growmon", PEN20_GROWMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Growmon + { PEN20_GUARDROMON_NAME, PEN20_GUARDROMON_ID, PEN20_GUARDROMON_FQID, PEN20_GUARDROMON_FQNAME, PEN20_GUARDROMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_GUARDROMON_NAME, PEN20_GUARDROMON_ID, "pen:guardromon", "pen:Guardromon", PEN20_GUARDROMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Guardromon + { PEN20_GUIMON_NAME, PEN20_GUIMON_ID, PEN20_GUIMON_FQID, PEN20_GUIMON_FQNAME, PEN20_GUIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_GUIMON_NAME, PEN20_GUIMON_ID, "pen:guimon", "pen:Guimon", PEN20_GUIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Guimon + { PEN20_GUMMYMON_NAME, PEN20_GUMMYMON_ID, PEN20_GUMMYMON_FQID, PEN20_GUMMYMON_FQNAME, PEN20_GUMMYMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_GUMMYMON_NAME, PEN20_GUMMYMON_ID, "pen:gummymon", "pen:Gummymon", PEN20_GUMMYMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Gummymon + { PEN20_HAGURUMON_NAME, PEN20_HAGURUMON_ID, PEN20_HAGURUMON_FQID, PEN20_HAGURUMON_FQNAME, PEN20_HAGURUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_HAGURUMON_NAME, PEN20_HAGURUMON_ID, "pen:hagurumon", "pen:Hagurumon", PEN20_HAGURUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Hagurumon + { PEN20_HANGYMON_NAME, PEN20_HANGYMON_ID, PEN20_HANGYMON_FQID, PEN20_HANGYMON_FQNAME, PEN20_HANGYMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_HANGYMON_NAME, PEN20_HANGYMON_ID, "pen:hangymon", "pen:Hangymon", PEN20_HANGYMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Hangymon + { PEN20_HANUMON_NAME, PEN20_HANUMON_ID, PEN20_HANUMON_FQID, PEN20_HANUMON_FQNAME, PEN20_HANUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_HANUMON_NAME, PEN20_HANUMON_ID, "pen:hanumon", "pen:Hanumon", PEN20_HANUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Hanumon + { PEN20_HERKULE_KABUTERIMON_NAME, PEN20_HERKULE_KABUTERIMON_ID, PEN20_HERKULE_KABUTERIMON_FQID, PEN20_HERKULE_KABUTERIMON_FQNAME, PEN20_HERKULE_KABUTERIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_HERKULE_KABUTERIMON_NAME, PEN20_HERKULE_KABUTERIMON_ID, "pen:herkule_kabuterimon", "pen:Herkule Kabuterimon", PEN20_HERKULE_KABUTERIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Herkule Kabuterimon + { PEN20_HISYARYUMON_NAME, PEN20_HISYARYUMON_ID, PEN20_HISYARYUMON_FQID, PEN20_HISYARYUMON_FQNAME, PEN20_HISYARYUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_HISYARYUMON_NAME, PEN20_HISYARYUMON_ID, "pen:hisyaryumon", "pen:Hisyaryumon", PEN20_HISYARYUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Hisyaryumon + { PEN20_HOLY_ANGEMON_NAME, PEN20_HOLY_ANGEMON_ID, PEN20_HOLY_ANGEMON_FQID, PEN20_HOLY_ANGEMON_FQNAME, PEN20_HOLY_ANGEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_HOLY_ANGEMON_NAME, PEN20_HOLY_ANGEMON_ID, "pen:holy_angemon", "pen:Holy Angemon", PEN20_HOLY_ANGEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Holy Angemon + { PEN20_HOLYDRAMON_NAME, PEN20_HOLYDRAMON_ID, PEN20_HOLYDRAMON_FQID, PEN20_HOLYDRAMON_FQNAME, PEN20_HOLYDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_HOLYDRAMON_NAME, PEN20_HOLYDRAMON_ID, "pen:holydramon", "pen:Holydramon", PEN20_HOLYDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Holydramon + { PEN20_HOUOUMON_NAME, PEN20_HOUOUMON_ID, PEN20_HOUOUMON_FQID, PEN20_HOUOUMON_FQNAME, PEN20_HOUOUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_HOUOUMON_NAME, PEN20_HOUOUMON_ID, "pen:hououmon", "pen:Hououmon", PEN20_HOUOUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Hououmon + { PEN20_IGNAMON_NAME, PEN20_IGNAMON_ID, PEN20_IGNAMON_FQID, PEN20_IGNAMON_FQNAME, PEN20_IGNAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_IGNAMON_NAME, PEN20_IGNAMON_ID, "pen:ignamon", "pen:Ignamon", PEN20_IGNAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Ignamon + { PEN20_IKKAKUMON_NAME, PEN20_IKKAKUMON_ID, PEN20_IKKAKUMON_FQID, PEN20_IKKAKUMON_FQNAME, PEN20_IKKAKUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_IKKAKUMON_NAME, PEN20_IKKAKUMON_ID, "pen:ikkakumon", "pen:Ikkakumon", PEN20_IKKAKUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Ikkakumon + { PEN20_IMPERIALDRAMON_FIGHTER_MODE_NAME, PEN20_IMPERIALDRAMON_FIGHTER_MODE_ID, PEN20_IMPERIALDRAMON_FIGHTER_MODE_FQID, PEN20_IMPERIALDRAMON_FIGHTER_MODE_FQNAME, PEN20_IMPERIALDRAMON_FIGHTER_MODE_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_IMPERIALDRAMON_FIGHTER_MODE_NAME, PEN20_IMPERIALDRAMON_FIGHTER_MODE_ID, "pen:imperialdramon_fighter_mode", "pen:Imperialdramon Fighter Mode", PEN20_IMPERIALDRAMON_FIGHTER_MODE_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Imperialdramon Fighter Mode + { PEN20_IMPMON_NAME, PEN20_IMPMON_ID, PEN20_IMPMON_FQID, PEN20_IMPMON_FQNAME, PEN20_IMPMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_IMPMON_NAME, PEN20_IMPMON_ID, "pen:impmon", "pen:Impmon", PEN20_IMPMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Impmon + { PEN20_JESMON_X_NAME, PEN20_JESMON_X_ID, PEN20_JESMON_X_FQID, PEN20_JESMON_X_FQNAME, PEN20_JESMON_X_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_JESMON_X_NAME, PEN20_JESMON_X_ID, "pen:jesmon_x", "pen:Jesmon X", PEN20_JESMON_X_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Jesmon X + { PEN20_JYAGAMON_NAME, PEN20_JYAGAMON_ID, PEN20_JYAGAMON_FQID, PEN20_JYAGAMON_FQNAME, PEN20_JYAGAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_JYAGAMON_NAME, PEN20_JYAGAMON_ID, "pen:jyagamon", "pen:Jyagamon", PEN20_JYAGAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Jyagamon + { PEN20_JYUREIMON_NAME, PEN20_JYUREIMON_ID, PEN20_JYUREIMON_FQID, PEN20_JYUREIMON_FQNAME, PEN20_JYUREIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_JYUREIMON_NAME, PEN20_JYUREIMON_ID, "pen:jyureimon", "pen:Jyureimon", PEN20_JYUREIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Jyureimon + { PEN20_KAKKINMON_NAME, PEN20_KAKKINMON_ID, PEN20_KAKKINMON_FQID, PEN20_KAKKINMON_FQNAME, PEN20_KAKKINMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_KAKKINMON_NAME, PEN20_KAKKINMON_ID, "pen:kakkinmon", "pen:Kakkinmon", PEN20_KAKKINMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Kakkinmon + { PEN20_KIWIMON_NAME, PEN20_KIWIMON_ID, PEN20_KIWIMON_FQID, PEN20_KIWIMON_FQNAME, PEN20_KIWIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_KIWIMON_NAME, PEN20_KIWIMON_ID, "pen:kiwimon", "pen:Kiwimon", PEN20_KIWIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Kiwimon + { PEN20_KNIGHTMON_NAME, PEN20_KNIGHTMON_ID, PEN20_KNIGHTMON_FQID, PEN20_KNIGHTMON_FQNAME, PEN20_KNIGHTMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_KNIGHTMON_NAME, PEN20_KNIGHTMON_ID, "pen:knightmon", "pen:Knightmon", PEN20_KNIGHTMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Knightmon + { PEN20_KOKUWAMON_NAME, PEN20_KOKUWAMON_ID, PEN20_KOKUWAMON_FQID, PEN20_KOKUWAMON_FQNAME, PEN20_KOKUWAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_KOKUWAMON_NAME, PEN20_KOKUWAMON_ID, "pen:kokuwamon", "pen:Kokuwamon", PEN20_KOKUWAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Kokuwamon + { PEN20_KYOKYOMON_NAME, PEN20_KYOKYOMON_ID, PEN20_KYOKYOMON_FQID, PEN20_KYOKYOMON_FQNAME, PEN20_KYOKYOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_KYOKYOMON_NAME, PEN20_KYOKYOMON_ID, "pen:kyokyomon", "pen:Kyokyomon", PEN20_KYOKYOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Kyokyomon + { PEN20_LADY_DEVIMON_NAME, PEN20_LADY_DEVIMON_ID, PEN20_LADY_DEVIMON_FQID, PEN20_LADY_DEVIMON_FQNAME, PEN20_LADY_DEVIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_LADY_DEVIMON_NAME, PEN20_LADY_DEVIMON_ID, "pen:lady_devimon", "pen:Lady Devimon", PEN20_LADY_DEVIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Lady Devimon + { PEN20_LALAMON_NAME, PEN20_LALAMON_ID, PEN20_LALAMON_FQID, PEN20_LALAMON_FQNAME, PEN20_LALAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_LALAMON_NAME, PEN20_LALAMON_ID, "pen:lalamon", "pen:Lalamon", PEN20_LALAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Lalamon + { PEN20_LAVOGARITAMON_NAME, PEN20_LAVOGARITAMON_ID, PEN20_LAVOGARITAMON_FQID, PEN20_LAVOGARITAMON_FQNAME, PEN20_LAVOGARITAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_LAVOGARITAMON_NAME, PEN20_LAVOGARITAMON_ID, "pen:lavogaritamon", "pen:Lavogaritamon", PEN20_LAVOGARITAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Lavogaritamon + { PEN20_LAVORVOMON_NAME, PEN20_LAVORVOMON_ID, PEN20_LAVORVOMON_FQID, PEN20_LAVORVOMON_FQNAME, PEN20_LAVORVOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_LAVORVOMON_NAME, PEN20_LAVORVOMON_ID, "pen:lavorvomon", "pen:Lavorvomon", PEN20_LAVORVOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Lavorvomon + { PEN20_LILAMON_NAME, PEN20_LILAMON_ID, PEN20_LILAMON_FQID, PEN20_LILAMON_FQNAME, PEN20_LILAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_LILAMON_NAME, PEN20_LILAMON_ID, "pen:lilamon", "pen:Lilamon", PEN20_LILAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Lilamon + { PEN20_LILIMON_NAME, PEN20_LILIMON_ID, PEN20_LILIMON_FQID, PEN20_LILIMON_FQNAME, PEN20_LILIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_LILIMON_NAME, PEN20_LILIMON_ID, "pen:lilimon", "pen:Lilimon", PEN20_LILIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Lilimon + { PEN20_LOPMON_NAME, PEN20_LOPMON_ID, PEN20_LOPMON_FQID, PEN20_LOPMON_FQNAME, PEN20_LOPMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_LOPMON_NAME, PEN20_LOPMON_ID, "pen:lopmon", "pen:Lopmon", PEN20_LOPMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Lopmon + { PEN20_LOTUSMON_NAME, PEN20_LOTUSMON_ID, PEN20_LOTUSMON_FQID, PEN20_LOTUSMON_FQNAME, PEN20_LOTUSMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_LOTUSMON_NAME, PEN20_LOTUSMON_ID, "pen:lotusmon", "pen:Lotusmon", PEN20_LOTUSMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Lotusmon + { PEN20_LUDOMON_NAME, PEN20_LUDOMON_ID, PEN20_LUDOMON_FQID, PEN20_LUDOMON_FQNAME, PEN20_LUDOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_LUDOMON_NAME, PEN20_LUDOMON_ID, "pen:ludomon", "pen:Ludomon", PEN20_LUDOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Ludomon + { PEN20_MAD_LEOMON_NAME, PEN20_MAD_LEOMON_ID, PEN20_MAD_LEOMON_FQID, PEN20_MAD_LEOMON_FQNAME, PEN20_MAD_LEOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_MAD_LEOMON_NAME, PEN20_MAD_LEOMON_ID, "pen:mad_leomon", "pen:Mad Leomon", PEN20_MAD_LEOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Mad Leomon + { PEN20_MAMBOMON_NAME, PEN20_MAMBOMON_ID, PEN20_MAMBOMON_FQID, PEN20_MAMBOMON_FQNAME, PEN20_MAMBOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_MAMBOMON_NAME, PEN20_MAMBOMON_ID, "pen:mambomon", "pen:Mambomon", PEN20_MAMBOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Mambomon + { PEN20_MAMMON_NAME, PEN20_MAMMON_ID, PEN20_MAMMON_FQID, PEN20_MAMMON_FQNAME, PEN20_MAMMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_MAMMON_NAME, PEN20_MAMMON_ID, "pen:mammon", "pen:Mammon", PEN20_MAMMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Mammon + { PEN20_MARIN_ANGEMON_NAME, PEN20_MARIN_ANGEMON_ID, PEN20_MARIN_ANGEMON_FQID, PEN20_MARIN_ANGEMON_FQNAME, PEN20_MARIN_ANGEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_MARIN_ANGEMON_NAME, PEN20_MARIN_ANGEMON_ID, "pen:marin_angemon", "pen:Marin Angemon", PEN20_MARIN_ANGEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Marin Angemon + { PEN20_MARIN_DEVIMON_NAME, PEN20_MARIN_DEVIMON_ID, PEN20_MARIN_DEVIMON_FQID, PEN20_MARIN_DEVIMON_FQNAME, PEN20_MARIN_DEVIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_MARIN_DEVIMON_NAME, PEN20_MARIN_DEVIMON_ID, "pen:marin_devimon", "pen:Marin Devimon", PEN20_MARIN_DEVIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Marin Devimon + { PEN20_MASTEMON_NAME, PEN20_MASTEMON_ID, PEN20_MASTEMON_FQID, PEN20_MASTEMON_FQNAME, PEN20_MASTEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_MASTEMON_NAME, PEN20_MASTEMON_ID, "pen:mastemon", "pen:Mastemon", PEN20_MASTEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Mastemon + { PEN20_MECHANORIMON_NAME, PEN20_MECHANORIMON_ID, PEN20_MECHANORIMON_FQID, PEN20_MECHANORIMON_FQNAME, PEN20_MECHANORIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_MECHANORIMON_NAME, PEN20_MECHANORIMON_ID, "pen:mechanorimon", "pen:Mechanorimon", PEN20_MECHANORIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Mechanorimon + { PEN20_MEGALO_GROWMON_NAME, PEN20_MEGALO_GROWMON_ID, PEN20_MEGALO_GROWMON_FQID, PEN20_MEGALO_GROWMON_FQNAME, PEN20_MEGALO_GROWMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_MEGALO_GROWMON_NAME, PEN20_MEGALO_GROWMON_ID, "pen:megalo_growmon", "pen:Megalo Growmon", PEN20_MEGALO_GROWMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Megalo Growmon + { PEN20_MEGA_SEADRAMON_NAME, PEN20_MEGA_SEADRAMON_ID, PEN20_MEGA_SEADRAMON_FQID, PEN20_MEGA_SEADRAMON_FQNAME, PEN20_MEGA_SEADRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_MEGA_SEADRAMON_NAME, PEN20_MEGA_SEADRAMON_ID, "pen:mega_seadramon", "pen:Mega Seadramon", PEN20_MEGA_SEADRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Mega Seadramon + { PEN20_MEICRACKMON_VICIOUS_MODE_NAME, PEN20_MEICRACKMON_VICIOUS_MODE_ID, PEN20_MEICRACKMON_VICIOUS_MODE_FQID, PEN20_MEICRACKMON_VICIOUS_MODE_FQNAME, PEN20_MEICRACKMON_VICIOUS_MODE_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_MEICRACKMON_VICIOUS_MODE_NAME, PEN20_MEICRACKMON_VICIOUS_MODE_ID, "pen:meicrackmon_vicious_mode", "pen:Meicrackmon Vicious Mode", PEN20_MEICRACKMON_VICIOUS_MODE_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Meicrackmon Vicious Mode + { PEN20_METAL_ETEMON_NAME, PEN20_METAL_ETEMON_ID, PEN20_METAL_ETEMON_FQID, PEN20_METAL_ETEMON_FQNAME, PEN20_METAL_ETEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_METAL_ETEMON_NAME, PEN20_METAL_ETEMON_ID, "pen:metal_etemon", "pen:Metal Etemon", PEN20_METAL_ETEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Metal Etemon + { PEN20_METAL_SEADRAMON_NAME, PEN20_METAL_SEADRAMON_ID, PEN20_METAL_SEADRAMON_FQID, PEN20_METAL_SEADRAMON_FQNAME, PEN20_METAL_SEADRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_METAL_SEADRAMON_NAME, PEN20_METAL_SEADRAMON_ID, "pen:metal_seadramon", "pen:Metal Seadramon", PEN20_METAL_SEADRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Metal Seadramon + { PEN20_MOCHIMON_NAME, PEN20_MOCHIMON_ID, PEN20_MOCHIMON_FQID, PEN20_MOCHIMON_FQNAME, PEN20_MOCHIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_MOCHIMON_NAME, PEN20_MOCHIMON_ID, "pen:mochimon", "pen:Mochimon", PEN20_MOCHIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Mochimon + { PEN20_MOKUMON_NAME, PEN20_MOKUMON_ID, PEN20_MOKUMON_FQID, PEN20_MOKUMON_FQNAME, PEN20_MOKUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_MOKUMON_NAME, PEN20_MOKUMON_ID, "pen:mokumon", "pen:Mokumon", PEN20_MOKUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Mokumon + { PEN20_MUSHMON_NAME, PEN20_MUSHMON_ID, PEN20_MUSHMON_FQID, PEN20_MUSHMON_FQNAME, PEN20_MUSHMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_MUSHMON_NAME, PEN20_MUSHMON_ID, "pen:mushmon", "pen:Mushmon", PEN20_MUSHMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Mushmon + { PEN20_NYOKIMON_NAME, PEN20_NYOKIMON_ID, PEN20_NYOKIMON_FQID, PEN20_NYOKIMON_FQNAME, PEN20_NYOKIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_NYOKIMON_NAME, PEN20_NYOKIMON_ID, "pen:nyokimon", "pen:Nyokimon", PEN20_NYOKIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Nyokimon + { PEN20_OCTMON_NAME, PEN20_OCTMON_ID, PEN20_OCTMON_FQID, PEN20_OCTMON_FQNAME, PEN20_OCTMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_OCTMON_NAME, PEN20_OCTMON_ID, "pen:octmon", "pen:Octmon", PEN20_OCTMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Octmon + { PEN20_OFANIMON_NAME, PEN20_OFANIMON_ID, PEN20_OFANIMON_FQID, PEN20_OFANIMON_FQNAME, PEN20_OFANIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_OFANIMON_NAME, PEN20_OFANIMON_ID, "pen:ofanimon", "pen:Ofanimon", PEN20_OFANIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Ofanimon + { PEN20_OGUDOMON_NAME, PEN20_OGUDOMON_ID, PEN20_OGUDOMON_FQID, PEN20_OGUDOMON_FQNAME, PEN20_OGUDOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_OGUDOMON_NAME, PEN20_OGUDOMON_ID, "pen:ogudomon", "pen:Ogudomon", PEN20_OGUDOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Ogudomon + { PEN20_OKUWAMON_NAME, PEN20_OKUWAMON_ID, PEN20_OKUWAMON_FQID, PEN20_OKUWAMON_FQNAME, PEN20_OKUWAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_OKUWAMON_NAME, PEN20_OKUWAMON_ID, "pen:okuwamon", "pen:Okuwamon", PEN20_OKUWAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Okuwamon + { PEN20_ORDINEMON_NAME, PEN20_ORDINEMON_ID, PEN20_ORDINEMON_FQID, PEN20_ORDINEMON_FQNAME, PEN20_ORDINEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_ORDINEMON_NAME, PEN20_ORDINEMON_ID, "pen:ordinemon", "pen:Ordinemon", PEN20_ORDINEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Ordinemon + { PEN20_OTAMAMON_NAME, PEN20_OTAMAMON_ID, PEN20_OTAMAMON_FQID, PEN20_OTAMAMON_FQNAME, PEN20_OTAMAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_OTAMAMON_NAME, PEN20_OTAMAMON_ID, "pen:otamamon", "pen:Otamamon", PEN20_OTAMAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Otamamon + { PEN20_OURYUMON_NAME, PEN20_OURYUMON_ID, PEN20_OURYUMON_FQID, PEN20_OURYUMON_FQNAME, PEN20_OURYUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_OURYUMON_NAME, PEN20_OURYUMON_ID, "pen:ouryumon", "pen:Ouryumon", PEN20_OURYUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Ouryumon + { PEN20_PAILDRAMON_NAME, PEN20_PAILDRAMON_ID, PEN20_PAILDRAMON_FQID, PEN20_PAILDRAMON_FQNAME, PEN20_PAILDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_PAILDRAMON_NAME, PEN20_PAILDRAMON_ID, "pen:paildramon", "pen:Paildramon", PEN20_PAILDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Paildramon + { PEN20_PETI_MERAMON_NAME, PEN20_PETI_MERAMON_ID, PEN20_PETI_MERAMON_FQID, PEN20_PETI_MERAMON_FQNAME, PEN20_PETI_MERAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_PETI_MERAMON_NAME, PEN20_PETI_MERAMON_ID, "pen:peti_meramon", "pen:Peti Meramon", PEN20_PETI_MERAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Peti Meramon + { PEN20_PHASCOMON_NAME, PEN20_PHASCOMON_ID, PEN20_PHASCOMON_FQID, PEN20_PHASCOMON_FQNAME, PEN20_PHASCOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_PHASCOMON_NAME, PEN20_PHASCOMON_ID, "pen:phascomon", "pen:Phascomon", PEN20_PHASCOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Phascomon + { PEN20_PICO_DEVIMON_NAME, PEN20_PICO_DEVIMON_ID, PEN20_PICO_DEVIMON_FQID, PEN20_PICO_DEVIMON_FQNAME, PEN20_PICO_DEVIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_PICO_DEVIMON_NAME, PEN20_PICO_DEVIMON_ID, "pen:pico_devimon", "pen:Pico Devimon", PEN20_PICO_DEVIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Pico Devimon + { PEN20_PIEMON_NAME, PEN20_PIEMON_ID, PEN20_PIEMON_FQID, PEN20_PIEMON_FQNAME, PEN20_PIEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_PIEMON_NAME, PEN20_PIEMON_ID, "pen:piemon", "pen:Piemon", PEN20_PIEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Piemon + { PEN20_PLESIOMON_NAME, PEN20_PLESIOMON_ID, PEN20_PLESIOMON_FQID, PEN20_PLESIOMON_FQNAME, PEN20_PLESIOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_PLESIOMON_NAME, PEN20_PLESIOMON_ID, "pen:plesiomon", "pen:Plesiomon", PEN20_PLESIOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Plesiomon + { PEN20_PORCUPMON_NAME, PEN20_PORCUPMON_ID, PEN20_PORCUPMON_FQID, PEN20_PORCUPMON_FQNAME, PEN20_PORCUPMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_PORCUPMON_NAME, PEN20_PORCUPMON_ID, "pen:porcupmon", "pen:Porcupmon", PEN20_PORCUPMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Porcupmon + { PEN20_PUKUMON_NAME, PEN20_PUKUMON_ID, PEN20_PUKUMON_FQID, PEN20_PUKUMON_FQNAME, PEN20_PUKUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_PUKUMON_NAME, PEN20_PUKUMON_ID, "pen:pukumon", "pen:Pukumon", PEN20_PUKUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Pukumon + { PEN20_PUMPMON_NAME, PEN20_PUMPMON_ID, PEN20_PUMPMON_FQID, PEN20_PUMPMON_FQNAME, PEN20_PUMPMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_PUMPMON_NAME, PEN20_PUMPMON_ID, "pen:pumpmon", "pen:Pumpmon", PEN20_PUMPMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Pumpmon + { PEN20_PYOCOMON_NAME, PEN20_PYOCOMON_ID, PEN20_PYOCOMON_FQID, PEN20_PYOCOMON_FQNAME, PEN20_PYOCOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_PYOCOMON_NAME, PEN20_PYOCOMON_ID, "pen:pyocomon", "pen:Pyocomon", PEN20_PYOCOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Pyocomon + { PEN20_RAFFLESIMON_NAME, PEN20_RAFFLESIMON_ID, PEN20_RAFFLESIMON_FQID, PEN20_RAFFLESIMON_FQNAME, PEN20_RAFFLESIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_RAFFLESIMON_NAME, PEN20_RAFFLESIMON_ID, "pen:rafflesimon", "pen:Rafflesimon", PEN20_RAFFLESIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Rafflesimon + { PEN20_RAGNA_LORDMON_NAME, PEN20_RAGNA_LORDMON_ID, PEN20_RAGNA_LORDMON_FQID, PEN20_RAGNA_LORDMON_FQNAME, PEN20_RAGNA_LORDMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_RAGNA_LORDMON_NAME, PEN20_RAGNA_LORDMON_ID, "pen:ragna_lordmon", "pen:Ragna Lordmon", PEN20_RAGNA_LORDMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Ragna Lordmon + { PEN20_RAGUELMON_NAME, PEN20_RAGUELMON_ID, PEN20_RAGUELMON_FQID, PEN20_RAGUELMON_FQNAME, PEN20_RAGUELMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_RAGUELMON_NAME, PEN20_RAGUELMON_ID, "pen:raguelmon", "pen:Raguelmon", PEN20_RAGUELMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Raguelmon + { PEN20_RAIJI_LUDOMON_NAME, PEN20_RAIJI_LUDOMON_ID, PEN20_RAIJI_LUDOMON_FQID, PEN20_RAIJI_LUDOMON_FQNAME, PEN20_RAIJI_LUDOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_RAIJI_LUDOMON_NAME, PEN20_RAIJI_LUDOMON_ID, "pen:raiji_ludomon", "pen:Raiji Ludomon", PEN20_RAIJI_LUDOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Raiji Ludomon + { PEN20_RAKAMON_NAME, PEN20_RAKAMON_ID, PEN20_RAKAMON_FQID, PEN20_RAKAMON_FQNAME, PEN20_RAKAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_RAKAMON_NAME, PEN20_RAKAMON_ID, "pen:rakamon", "pen:Rakamon", PEN20_RAKAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Rakamon + { PEN20_RAPIDMON_NAME, PEN20_RAPIDMON_ID, PEN20_RAPIDMON_FQID, PEN20_RAPIDMON_FQNAME, PEN20_RAPIDMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_RAPIDMON_NAME, PEN20_RAPIDMON_ID, "pen:rapidmon", "pen:Rapidmon", PEN20_RAPIDMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Rapidmon + { PEN20_RED_VEGIMON_NAME, PEN20_RED_VEGIMON_ID, PEN20_RED_VEGIMON_FQID, PEN20_RED_VEGIMON_FQNAME, PEN20_RED_VEGIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_RED_VEGIMON_NAME, PEN20_RED_VEGIMON_ID, "pen:red_vegimon", "pen:Red Vegimon", PEN20_RED_VEGIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Red Vegimon + { PEN20_REPPAMON_NAME, PEN20_REPPAMON_ID, PEN20_REPPAMON_FQID, PEN20_REPPAMON_FQNAME, PEN20_REPPAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_REPPAMON_NAME, PEN20_REPPAMON_ID, "pen:reppamon", "pen:Reppamon", PEN20_REPPAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Reppamon + { PEN20_REVOLMON_NAME, PEN20_REVOLMON_ID, PEN20_REVOLMON_FQID, PEN20_REVOLMON_FQNAME, PEN20_REVOLMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_REVOLMON_NAME, PEN20_REVOLMON_ID, "pen:revolmon", "pen:Revolmon", PEN20_REVOLMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Revolmon + { PEN20_RIZE_GREYMON_NAME, PEN20_RIZE_GREYMON_ID, PEN20_RIZE_GREYMON_FQID, PEN20_RIZE_GREYMON_FQNAME, PEN20_RIZE_GREYMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_RIZE_GREYMON_NAME, PEN20_RIZE_GREYMON_ID, "pen:rize_greymon", "pen:Rize Greymon", PEN20_RIZE_GREYMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Rize Greymon + { PEN20_ROSEMON_NAME, PEN20_ROSEMON_ID, PEN20_ROSEMON_FQID, PEN20_ROSEMON_FQNAME, PEN20_ROSEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_ROSEMON_NAME, PEN20_ROSEMON_ID, "pen:rosemon", "pen:Rosemon", PEN20_ROSEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Rosemon + { PEN20_RYUDAMON_NAME, PEN20_RYUDAMON_ID, PEN20_RYUDAMON_FQID, PEN20_RYUDAMON_FQNAME, PEN20_RYUDAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_RYUDAMON_NAME, PEN20_RYUDAMON_ID, "pen:ryudamon", "pen:Ryudamon", PEN20_RYUDAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Ryudamon + { PEN20_SABER_LEOMON_NAME, PEN20_SABER_LEOMON_ID, PEN20_SABER_LEOMON_FQID, PEN20_SABER_LEOMON_FQNAME, PEN20_SABER_LEOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_SABER_LEOMON_NAME, PEN20_SABER_LEOMON_ID, "pen:saber_leomon", "pen:Saber Leomon", PEN20_SABER_LEOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Saber Leomon + { PEN20_SAINT_GALGOMON_NAME, PEN20_SAINT_GALGOMON_ID, PEN20_SAINT_GALGOMON_FQID, PEN20_SAINT_GALGOMON_FQNAME, PEN20_SAINT_GALGOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_SAINT_GALGOMON_NAME, PEN20_SAINT_GALGOMON_ID, "pen:saint_galgomon", "pen:Saint Galgomon", PEN20_SAINT_GALGOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Saint Galgomon + { PEN20_SERAPHIMON_NAME, PEN20_SERAPHIMON_ID, PEN20_SERAPHIMON_FQID, PEN20_SERAPHIMON_FQNAME, PEN20_SERAPHIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_SERAPHIMON_NAME, PEN20_SERAPHIMON_ID, "pen:seraphimon", "pen:Seraphimon", PEN20_SERAPHIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Seraphimon + { PEN20_SHADRAMON_NAME, PEN20_SHADRAMON_ID, PEN20_SHADRAMON_FQID, PEN20_SHADRAMON_FQNAME, PEN20_SHADRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_SHADRAMON_NAME, PEN20_SHADRAMON_ID, "pen:shadramon", "pen:Shadramon", PEN20_SHADRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Shadramon + { PEN20_SHAKOMON_NAME, PEN20_SHAKOMON_ID, PEN20_SHAKOMON_FQID, PEN20_SHAKOMON_FQNAME, PEN20_SHAKOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_SHAKOMON_NAME, PEN20_SHAKOMON_ID, "pen:shakomon", "pen:Shakomon", PEN20_SHAKOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Shakomon + { PEN20_STARMON_NAME, PEN20_STARMON_ID, PEN20_STARMON_FQID, PEN20_STARMON_FQNAME, PEN20_STARMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_STARMON_NAME, PEN20_STARMON_ID, "pen:starmon", "pen:Starmon", PEN20_STARMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Starmon + { PEN20_SUNFLOWMON_NAME, PEN20_SUNFLOWMON_ID, PEN20_SUNFLOWMON_FQID, PEN20_SUNFLOWMON_FQNAME, PEN20_SUNFLOWMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_SUNFLOWMON_NAME, PEN20_SUNFLOWMON_ID, "pen:sunflowmon", "pen:Sunflowmon", PEN20_SUNFLOWMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Sunflowmon + { PEN20_TAILMON_NAME, PEN20_TAILMON_ID, PEN20_TAILMON_FQID, PEN20_TAILMON_FQNAME, PEN20_TAILMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_TAILMON_NAME, PEN20_TAILMON_ID, "pen:tailmon", "pen:Tailmon", PEN20_TAILMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Tailmon + { PEN20_TANKMON_NAME, PEN20_TANKMON_ID, PEN20_TANKMON_FQID, PEN20_TANKMON_FQNAME, PEN20_TANKMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_TANKMON_NAME, PEN20_TANKMON_ID, "pen:tankmon", "pen:Tankmon", PEN20_TANKMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Tankmon + { PEN20_TARGETMON_NAME, PEN20_TARGETMON_ID, PEN20_TARGETMON_FQID, PEN20_TARGETMON_FQNAME, PEN20_TARGETMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_TARGETMON_NAME, PEN20_TARGETMON_ID, "pen:targetmon", "pen:Targetmon", PEN20_TARGETMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Targetmon + { PEN20_TENTOMON_NAME, PEN20_TENTOMON_ID, PEN20_TENTOMON_FQID, PEN20_TENTOMON_FQNAME, PEN20_TENTOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_TENTOMON_NAME, PEN20_TENTOMON_ID, "pen:tentomon", "pen:Tentomon", PEN20_TENTOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Tentomon + { PEN20_TERRIERMON_NAME, PEN20_TERRIERMON_ID, PEN20_TERRIERMON_FQID, PEN20_TERRIERMON_FQNAME, PEN20_TERRIERMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_TERRIERMON_NAME, PEN20_TERRIERMON_ID, "pen:terriermon", "pen:Terriermon", PEN20_TERRIERMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Terriermon + { PEN20_THUNDERBALLMON_NAME, PEN20_THUNDERBALLMON_ID, PEN20_THUNDERBALLMON_FQID, PEN20_THUNDERBALLMON_FQNAME, PEN20_THUNDERBALLMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_THUNDERBALLMON_NAME, PEN20_THUNDERBALLMON_ID, "pen:thunderballmon", "pen:Thunderballmon", PEN20_THUNDERBALLMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Thunderballmon + { PEN20_TIA_LUDOMON_NAME, PEN20_TIA_LUDOMON_ID, PEN20_TIA_LUDOMON_FQID, PEN20_TIA_LUDOMON_FQNAME, PEN20_TIA_LUDOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_TIA_LUDOMON_NAME, PEN20_TIA_LUDOMON_ID, "pen:tia_ludomon", "pen:Tia Ludomon", PEN20_TIA_LUDOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Tia Ludomon + { PEN20_TOGEMON_NAME, PEN20_TOGEMON_ID, PEN20_TOGEMON_FQID, PEN20_TOGEMON_FQNAME, PEN20_TOGEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_TOGEMON_NAME, PEN20_TOGEMON_ID, "pen:togemon", "pen:Togemon", PEN20_TOGEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Togemon + { PEN20_TONOSAMA_GEKOMON_NAME, PEN20_TONOSAMA_GEKOMON_ID, PEN20_TONOSAMA_GEKOMON_FQID, PEN20_TONOSAMA_GEKOMON_FQNAME, PEN20_TONOSAMA_GEKOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_TONOSAMA_GEKOMON_NAME, PEN20_TONOSAMA_GEKOMON_ID, "pen:tonosama_gekomon", "pen:Tonosama Gekomon", PEN20_TONOSAMA_GEKOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Tonosama Gekomon + { PEN20_TORTAMON_NAME, PEN20_TORTAMON_ID, PEN20_TORTAMON_FQID, PEN20_TORTAMON_FQNAME, PEN20_TORTAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_TORTAMON_NAME, PEN20_TORTAMON_ID, "pen:tortamon", "pen:Tortamon", PEN20_TORTAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Tortamon + { PEN20_TOY_AGUMON_NAME, PEN20_TOY_AGUMON_ID, PEN20_TOY_AGUMON_FQID, PEN20_TOY_AGUMON_FQNAME, PEN20_TOY_AGUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_TOY_AGUMON_NAME, PEN20_TOY_AGUMON_ID, "pen:toy_agumon", "pen:Toy Agumon", PEN20_TOY_AGUMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Toy Agumon + { PEN20_TRICERAMON_NAME, PEN20_TRICERAMON_ID, PEN20_TRICERAMON_FQID, PEN20_TRICERAMON_FQNAME, PEN20_TRICERAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_TRICERAMON_NAME, PEN20_TRICERAMON_ID, "pen:triceramon", "pen:Triceramon", PEN20_TRICERAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Triceramon + { PEN20_TROOPMON_NAME, PEN20_TROOPMON_ID, PEN20_TROOPMON_FQID, PEN20_TROOPMON_FQNAME, PEN20_TROOPMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_TROOPMON_NAME, PEN20_TROOPMON_ID, "pen:troopmon", "pen:Troopmon", PEN20_TROOPMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Troopmon + { PEN20_TURUIEMON_NAME, PEN20_TURUIEMON_ID, PEN20_TURUIEMON_FQID, PEN20_TURUIEMON_FQNAME, PEN20_TURUIEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_TURUIEMON_NAME, PEN20_TURUIEMON_ID, "pen:turuiemon", "pen:Turuiemon", PEN20_TURUIEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Turuiemon + { PEN20_V_DRAMON_NAME, PEN20_V_DRAMON_ID, PEN20_V_DRAMON_FQID, PEN20_V_DRAMON_FQNAME, PEN20_V_DRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_V_DRAMON_NAME, PEN20_V_DRAMON_ID, "pen:v_dramon", "pen:V-dramon", PEN20_V_DRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for V-dramon + { PEN20_VEMDEMON_NAME, PEN20_VEMDEMON_ID, PEN20_VEMDEMON_FQID, PEN20_VEMDEMON_FQNAME, PEN20_VEMDEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_VEMDEMON_NAME, PEN20_VEMDEMON_ID, "pen:vemdemon", "pen:Vemdemon", PEN20_VEMDEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Vemdemon + { PEN20_VENOM_VAMDEMON_NAME, PEN20_VENOM_VAMDEMON_ID, PEN20_VENOM_VAMDEMON_FQID, PEN20_VENOM_VAMDEMON_FQNAME, PEN20_VENOM_VAMDEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_VENOM_VAMDEMON_NAME, PEN20_VENOM_VAMDEMON_ID, "pen:venom_vamdemon", "pen:Venom Vamdemon", PEN20_VENOM_VAMDEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Venom Vamdemon + { PEN20_V_MON_NAME, PEN20_V_MON_ID, PEN20_V_MON_FQID, PEN20_V_MON_FQNAME, PEN20_V_MON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_V_MON_NAME, PEN20_V_MON_ID, "pen:v_mon", "pen:V-mon", PEN20_V_MON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for V-mon + { PEN20_VOLCANICDRAMON_NAME, PEN20_VOLCANICDRAMON_ID, PEN20_VOLCANICDRAMON_FQID, PEN20_VOLCANICDRAMON_FQNAME, PEN20_VOLCANICDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_VOLCANICDRAMON_NAME, PEN20_VOLCANICDRAMON_ID, "pen:volcanicdramon", "pen:Volcanicdramon", PEN20_VOLCANICDRAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Volcanicdramon + { PEN20_VOLTOBAUTAMON_NAME, PEN20_VOLTOBAUTAMON_ID, PEN20_VOLTOBAUTAMON_FQID, PEN20_VOLTOBAUTAMON_FQNAME, PEN20_VOLTOBAUTAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_VOLTOBAUTAMON_NAME, PEN20_VOLTOBAUTAMON_ID, "pen:voltobautamon", "pen:Voltobautamon", PEN20_VOLTOBAUTAMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Voltobautamon + { PEN20_VORVOMON_NAME, PEN20_VORVOMON_ID, PEN20_VORVOMON_FQID, PEN20_VORVOMON_FQNAME, PEN20_VORVOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_VORVOMON_NAME, PEN20_VORVOMON_ID, "pen:vorvomon", "pen:Vorvomon", PEN20_VORVOMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Vorvomon + { PEN20_WARU_MOZAEMON_NAME, PEN20_WARU_MOZAEMON_ID, PEN20_WARU_MOZAEMON_FQID, PEN20_WARU_MOZAEMON_FQNAME, PEN20_WARU_MOZAEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_WARU_MOZAEMON_NAME, PEN20_WARU_MOZAEMON_ID, "pen:waru_mozaemon", "pen:Waru Mozaemon", PEN20_WARU_MOZAEMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Waru Mozaemon + { PEN20_WIZARMON_NAME, PEN20_WIZARMON_ID, PEN20_WIZARMON_FQID, PEN20_WIZARMON_FQNAME, PEN20_WIZARMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_WIZARMON_NAME, PEN20_WIZARMON_ID, "pen:wizarmon", "pen:Wizarmon", PEN20_WIZARMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Wizarmon + { PEN20_WOODMON_NAME, PEN20_WOODMON_ID, PEN20_WOODMON_FQID, PEN20_WOODMON_FQNAME, PEN20_WOODMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_WOODMON_NAME, PEN20_WOODMON_ID, "pen:woodmon", "pen:Woodmon", PEN20_WOODMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Woodmon + { PEN20_XV_MON_NAME, PEN20_XV_MON_ID, PEN20_XV_MON_FQID, PEN20_XV_MON_FQNAME, PEN20_XV_MON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_XV_MON_NAME, PEN20_XV_MON_ID, "pen:xv_mon", "pen:XV-mon", PEN20_XV_MON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for XV-mon + { PEN20_ZERIMON_NAME, PEN20_ZERIMON_ID, PEN20_ZERIMON_FQID, PEN20_ZERIMON_FQNAME, PEN20_ZERIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_ZERIMON_NAME, PEN20_ZERIMON_ID, "pen:zerimon", "pen:Zerimon", PEN20_ZERIMON_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Zerimon + { PEN20_ZUDOMOM_NAME, PEN20_ZUDOMOM_ID, PEN20_ZUDOMOM_FQID, PEN20_ZUDOMOM_FQNAME, PEN20_ZUDOMOM_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, + { PEN20_ZUDOMOM_NAME, PEN20_ZUDOMOM_ID, "pen:zudomom", "pen:Zudomom", PEN20_ZUDOMOM_ANIM_INDEX, config::config_animation_dm_set_t::pen20, config::config_animation_sprite_sheet_layout_t::Dm }, // alt ids for Zudomom + }; + + config_animation_entry_t get_config_animation_name_pen20(size_t index) { + for (const auto& entry : pen20_animation_table) { + assert(entry.anim_index >= 0); + if (static_cast(entry.anim_index) == index) return entry; + } + return pen20_animation_table[index]; + } + + int config_parse_animation_name_pen20(config::config_t& config, const char *value) { + for (const auto& entry : pen20_animation_table) { + if (strcmp(value, entry.name) == 0 || + strcmp(value, entry.id) == 0 || + strcmp(value, entry.fqid) == 0 || + strcmp(value, entry.fqname) == 0) { + config.animation_index = entry.anim_index; + config.animation_dm_set = entry.set; + config.animation_sprite_sheet_layout = entry.layout; + return entry.anim_index; + } + } + return -1; + } +} + diff --git a/src/embedded_assets/pen20/pen20_get_sprite_sheet.cpp b/src/embedded_assets/pen20/pen20_get_sprite_sheet.cpp new file mode 100644 index 00000000..5658ac9d --- /dev/null +++ b/src/embedded_assets/pen20/pen20_get_sprite_sheet.cpp @@ -0,0 +1,180 @@ +#include "embedded_assets/embedded_image.h" +#include "embedded_assets/pen20/pen20.hpp" +#include "embedded_assets/pen20/pen20_images.h" +#include "embedded_assets/pen20/pen20_sprite.h" + +namespace bongocat::assets { + embedded_image_t get_pen20_sprite_sheet(size_t index) { + switch (index) { + case PEN20_AERO_V_DRAMON_ANIM_INDEX: return {pen20_aero_v_dramon_png, pen20_aero_v_dramon_png_size, "aero_v_dramon"}; + case PEN20_AGUMON_HAKASE_ANIM_INDEX: return {pen20_agumon_hakase_png, pen20_agumon_hakase_png_size, "agumon_hakase"}; + case PEN20_ALPHAMON_OURYUKEN_ANIM_INDEX: return {pen20_alphamon_ouryuken_png, pen20_alphamon_ouryuken_png_size, "alphamon_ouryuken"}; + case PEN20_ANDIRAMON_ANIM_INDEX: return {pen20_andiramon_png, pen20_andiramon_png_size, "andiramon"}; + case PEN20_ANGEWOMON_ANIM_INDEX: return {pen20_angewomon_png, pen20_angewomon_png_size, "angewomon"}; + case PEN20_ANOMALOCARIMON_ANIM_INDEX: return {pen20_anomalocarimon_png, pen20_anomalocarimon_png_size, "anomalocarimon"}; + case PEN20_ARRESTERDRAMON_ANIM_INDEX: return {pen20_arresterdramon_png, pen20_arresterdramon_png_size, "arresterdramon"}; + case PEN20_ASTRAMON_ANIM_INDEX: return {pen20_astramon_png, pen20_astramon_png_size, "astramon"}; + case PEN20_ASURAMON_ANIM_INDEX: return {pen20_asuramon_png, pen20_asuramon_png_size, "asuramon"}; + case PEN20_ATLUR_KABUTERIMON_ANIM_INDEX: return {pen20_atlur_kabuterimon_png, pen20_atlur_kabuterimon_png_size, "atlur_kabuterimon"}; + case PEN20_BAALMON_ANIM_INDEX: return {pen20_baalmon_png, pen20_baalmon_png_size, "baalmon"}; + case PEN20_BAKUMON_ANIM_INDEX: return {pen20_bakumon_png, pen20_bakumon_png_size, "bakumon"}; + case PEN20_BANCHO_LEOMON_ANIM_INDEX: return {pen20_bancho_leomon_png, pen20_bancho_leomon_png_size, "bancho_leomon"}; + case PEN20_BEELZEBUMON_BLAST_MODE_ANIM_INDEX: return {pen20_beelzebumon_blast_mode_png, pen20_beelzebumon_blast_mode_png_size, "beelzebumon_blast_mode"}; + case PEN20_BEOWULFMON_ANIM_INDEX: return {pen20_beowulfmon_png, pen20_beowulfmon_png_size, "beowulfmon"}; + case PEN20_BIG_MAMEMON_ANIM_INDEX: return {pen20_big_mamemon_png, pen20_big_mamemon_png_size, "big_mamemon"}; + case PEN20_BLOSSOMON_ANIM_INDEX: return {pen20_blossomon_png, pen20_blossomon_png_size, "blossomon"}; + case PEN20_BOLTMON_ANIM_INDEX: return {pen20_boltmon_png, pen20_boltmon_png_size, "boltmon"}; + case PEN20_BRYWELUDRAMON_ANIM_INDEX: return {pen20_bryweludramon_png, pen20_bryweludramon_png_size, "bryweludramon"}; + case PEN20_BUBBMON_ANIM_INDEX: return {pen20_bubbmon_png, pen20_bubbmon_png_size, "bubbmon"}; + case PEN20_BUDMON_ANIM_INDEX: return {pen20_budmon_png, pen20_budmon_png_size, "budmon"}; + case PEN20_BUSHI_AGUMON_ANIM_INDEX: return {pen20_bushi_agumon_png, pen20_bushi_agumon_png_size, "bushi_agumon"}; + case PEN20_CANDMON_ANIM_INDEX: return {pen20_candmon_png, pen20_candmon_png_size, "candmon"}; + case PEN20_CAPRIMON_ANIM_INDEX: return {pen20_caprimon_png, pen20_caprimon_png_size, "caprimon"}; + case PEN20_CHAOSMON_ANIM_INDEX: return {pen20_chaosmon_png, pen20_chaosmon_png_size, "chaosmon"}; + case PEN20_CHERUBIMON_ANIM_INDEX: return {pen20_cherubimon_png, pen20_cherubimon_png_size, "cherubimon"}; + case PEN20_CHIBIMON_ANIM_INDEX: return {pen20_chibimon_png, pen20_chibimon_png_size, "chibimon"}; + case PEN20_CHICOMON_ANIM_INDEX: return {pen20_chicomon_png, pen20_chicomon_png_size, "chicomon"}; + case PEN20_CHOROMON_ANIM_INDEX: return {pen20_choromon_png, pen20_choromon_png_size, "choromon"}; + case PEN20_CLOCKMON_ANIM_INDEX: return {pen20_clockmon_png, pen20_clockmon_png_size, "clockmon"}; + case PEN20_COCOMON_ANIM_INDEX: return {pen20_cocomon_png, pen20_cocomon_png_size, "cocomon"}; + case PEN20_COTSUCOMON_ANIM_INDEX: return {pen20_cotsucomon_png, pen20_cotsucomon_png_size, "cotsucomon"}; + case PEN20_CYBERDRAMON_ANIM_INDEX: return {pen20_cyberdramon_png, pen20_cyberdramon_png_size, "cyberdramon"}; + case PEN20_DAGOMON_ANIM_INDEX: return {pen20_dagomon_png, pen20_dagomon_png_size, "dagomon"}; + case PEN20_DARKDRAMON_ANIM_INDEX: return {pen20_darkdramon_png, pen20_darkdramon_png_size, "darkdramon"}; + case PEN20_DARK_KNIGHTMON_ANIM_INDEX: return {pen20_dark_knightmon_png, pen20_dark_knightmon_png_size, "dark_knightmon"}; + case PEN20_DEATH_MERAMON_ANIM_INDEX: return {pen20_death_meramon_png, pen20_death_meramon_png_size, "death_meramon"}; + case PEN20_DELUMON_ANIM_INDEX: return {pen20_delumon_png, pen20_delumon_png_size, "delumon"}; + case PEN20_DOKUGUMON_ANIM_INDEX: return {pen20_dokugumon_png, pen20_dokugumon_png_size, "dokugumon"}; + case PEN20_DORUGORAMON_ANIM_INDEX: return {pen20_dorugoramon_png, pen20_dorugoramon_png_size, "dorugoramon"}; + case PEN20_EBIDRAMON_ANIM_INDEX: return {pen20_ebidramon_png, pen20_ebidramon_png_size, "ebidramon"}; + case PEN20_FANTOMON_ANIM_INDEX: return {pen20_fantomon_png, pen20_fantomon_png_size, "fantomon"}; + case PEN20_FLORAMON_ANIM_INDEX: return {pen20_floramon_png, pen20_floramon_png_size, "floramon"}; + case PEN20_FUFUMON_ANIM_INDEX: return {pen20_fufumon_png, pen20_fufumon_png_size, "fufumon"}; + case PEN20_GALGOMON_ANIM_INDEX: return {pen20_galgomon_png, pen20_galgomon_png_size, "galgomon"}; + case PEN20_GANIMON_ANIM_INDEX: return {pen20_ganimon_png, pen20_ganimon_png_size, "ganimon"}; + case PEN20_GARUDAMON_ANIM_INDEX: return {pen20_garudamon_png, pen20_garudamon_png_size, "garudamon"}; + case PEN20_GEKOMON_ANIM_INDEX: return {pen20_gekomon_png, pen20_gekomon_png_size, "gekomon"}; + case PEN20_GERBEMON_ANIM_INDEX: return {pen20_gerbemon_png, pen20_gerbemon_png_size, "gerbemon"}; + case PEN20_GESOMON_ANIM_INDEX: return {pen20_gesomon_png, pen20_gesomon_png_size, "gesomon"}; + case PEN20_GINRYUMON_ANIM_INDEX: return {pen20_ginryumon_png, pen20_ginryumon_png_size, "ginryumon"}; + case PEN20_GOMAMON_ANIM_INDEX: return {pen20_gomamon_png, pen20_gomamon_png_size, "gomamon"}; + case PEN20_GOTTSUMON_ANIM_INDEX: return {pen20_gottsumon_png, pen20_gottsumon_png_size, "gottsumon"}; + case PEN20_GRIFFOMON_ANIM_INDEX: return {pen20_griffomon_png, pen20_griffomon_png_size, "griffomon"}; + case PEN20_GROWMON_ANIM_INDEX: return {pen20_growmon_png, pen20_growmon_png_size, "growmon"}; + case PEN20_GUARDROMON_ANIM_INDEX: return {pen20_guardromon_png, pen20_guardromon_png_size, "guardromon"}; + case PEN20_GUIMON_ANIM_INDEX: return {pen20_guimon_png, pen20_guimon_png_size, "guimon"}; + case PEN20_GUMMYMON_ANIM_INDEX: return {pen20_gummymon_png, pen20_gummymon_png_size, "gummymon"}; + case PEN20_HAGURUMON_ANIM_INDEX: return {pen20_hagurumon_png, pen20_hagurumon_png_size, "hagurumon"}; + case PEN20_HANGYMON_ANIM_INDEX: return {pen20_hangymon_png, pen20_hangymon_png_size, "hangymon"}; + case PEN20_HANUMON_ANIM_INDEX: return {pen20_hanumon_png, pen20_hanumon_png_size, "hanumon"}; + case PEN20_HERKULE_KABUTERIMON_ANIM_INDEX: return {pen20_herkule_kabuterimon_png, pen20_herkule_kabuterimon_png_size, "herkule_kabuterimon"}; + case PEN20_HISYARYUMON_ANIM_INDEX: return {pen20_hisyaryumon_png, pen20_hisyaryumon_png_size, "hisyaryumon"}; + case PEN20_HOLY_ANGEMON_ANIM_INDEX: return {pen20_holy_angemon_png, pen20_holy_angemon_png_size, "holy_angemon"}; + case PEN20_HOLYDRAMON_ANIM_INDEX: return {pen20_holydramon_png, pen20_holydramon_png_size, "holydramon"}; + case PEN20_HOUOUMON_ANIM_INDEX: return {pen20_hououmon_png, pen20_hououmon_png_size, "hououmon"}; + case PEN20_IGNAMON_ANIM_INDEX: return {pen20_ignamon_png, pen20_ignamon_png_size, "ignamon"}; + case PEN20_IKKAKUMON_ANIM_INDEX: return {pen20_ikkakumon_png, pen20_ikkakumon_png_size, "ikkakumon"}; + case PEN20_IMPERIALDRAMON_FIGHTER_MODE_ANIM_INDEX: return {pen20_imperialdramon_fighter_mode_png, pen20_imperialdramon_fighter_mode_png_size, "imperialdramon_fighter_mode"}; + case PEN20_IMPMON_ANIM_INDEX: return {pen20_impmon_png, pen20_impmon_png_size, "impmon"}; + case PEN20_JESMON_X_ANIM_INDEX: return {pen20_jesmon_x_png, pen20_jesmon_x_png_size, "jesmon_x"}; + case PEN20_JYAGAMON_ANIM_INDEX: return {pen20_jyagamon_png, pen20_jyagamon_png_size, "jyagamon"}; + case PEN20_JYUREIMON_ANIM_INDEX: return {pen20_jyureimon_png, pen20_jyureimon_png_size, "jyureimon"}; + case PEN20_KAKKINMON_ANIM_INDEX: return {pen20_kakkinmon_png, pen20_kakkinmon_png_size, "kakkinmon"}; + case PEN20_KIWIMON_ANIM_INDEX: return {pen20_kiwimon_png, pen20_kiwimon_png_size, "kiwimon"}; + case PEN20_KNIGHTMON_ANIM_INDEX: return {pen20_knightmon_png, pen20_knightmon_png_size, "knightmon"}; + case PEN20_KOKUWAMON_ANIM_INDEX: return {pen20_kokuwamon_png, pen20_kokuwamon_png_size, "kokuwamon"}; + case PEN20_KYOKYOMON_ANIM_INDEX: return {pen20_kyokyomon_png, pen20_kyokyomon_png_size, "kyokyomon"}; + case PEN20_LADY_DEVIMON_ANIM_INDEX: return {pen20_lady_devimon_png, pen20_lady_devimon_png_size, "lady_devimon"}; + case PEN20_LALAMON_ANIM_INDEX: return {pen20_lalamon_png, pen20_lalamon_png_size, "lalamon"}; + case PEN20_LAVOGARITAMON_ANIM_INDEX: return {pen20_lavogaritamon_png, pen20_lavogaritamon_png_size, "lavogaritamon"}; + case PEN20_LAVORVOMON_ANIM_INDEX: return {pen20_lavorvomon_png, pen20_lavorvomon_png_size, "lavorvomon"}; + case PEN20_LILAMON_ANIM_INDEX: return {pen20_lilamon_png, pen20_lilamon_png_size, "lilamon"}; + case PEN20_LILIMON_ANIM_INDEX: return {pen20_lilimon_png, pen20_lilimon_png_size, "lilimon"}; + case PEN20_LOPMON_ANIM_INDEX: return {pen20_lopmon_png, pen20_lopmon_png_size, "lopmon"}; + case PEN20_LOTUSMON_ANIM_INDEX: return {pen20_lotusmon_png, pen20_lotusmon_png_size, "lotusmon"}; + case PEN20_LUDOMON_ANIM_INDEX: return {pen20_ludomon_png, pen20_ludomon_png_size, "ludomon"}; + case PEN20_MAD_LEOMON_ANIM_INDEX: return {pen20_mad_leomon_png, pen20_mad_leomon_png_size, "mad_leomon"}; + case PEN20_MAMBOMON_ANIM_INDEX: return {pen20_mambomon_png, pen20_mambomon_png_size, "mambomon"}; + case PEN20_MAMMON_ANIM_INDEX: return {pen20_mammon_png, pen20_mammon_png_size, "mammon"}; + case PEN20_MARIN_ANGEMON_ANIM_INDEX: return {pen20_marin_angemon_png, pen20_marin_angemon_png_size, "marin_angemon"}; + case PEN20_MARIN_DEVIMON_ANIM_INDEX: return {pen20_marin_devimon_png, pen20_marin_devimon_png_size, "marin_devimon"}; + case PEN20_MASTEMON_ANIM_INDEX: return {pen20_mastemon_png, pen20_mastemon_png_size, "mastemon"}; + case PEN20_MECHANORIMON_ANIM_INDEX: return {pen20_mechanorimon_png, pen20_mechanorimon_png_size, "mechanorimon"}; + case PEN20_MEGALO_GROWMON_ANIM_INDEX: return {pen20_megalo_growmon_png, pen20_megalo_growmon_png_size, "megalo_growmon"}; + case PEN20_MEGA_SEADRAMON_ANIM_INDEX: return {pen20_mega_seadramon_png, pen20_mega_seadramon_png_size, "mega_seadramon"}; + case PEN20_MEICRACKMON_VICIOUS_MODE_ANIM_INDEX: return {pen20_meicrackmon_vicious_mode_png, pen20_meicrackmon_vicious_mode_png_size, "meicrackmon_vicious_mode"}; + case PEN20_METAL_ETEMON_ANIM_INDEX: return {pen20_metal_etemon_png, pen20_metal_etemon_png_size, "metal_etemon"}; + case PEN20_METAL_SEADRAMON_ANIM_INDEX: return {pen20_metal_seadramon_png, pen20_metal_seadramon_png_size, "metal_seadramon"}; + case PEN20_MOCHIMON_ANIM_INDEX: return {pen20_mochimon_png, pen20_mochimon_png_size, "mochimon"}; + case PEN20_MOKUMON_ANIM_INDEX: return {pen20_mokumon_png, pen20_mokumon_png_size, "mokumon"}; + case PEN20_MUSHMON_ANIM_INDEX: return {pen20_mushmon_png, pen20_mushmon_png_size, "mushmon"}; + case PEN20_NYOKIMON_ANIM_INDEX: return {pen20_nyokimon_png, pen20_nyokimon_png_size, "nyokimon"}; + case PEN20_OCTMON_ANIM_INDEX: return {pen20_octmon_png, pen20_octmon_png_size, "octmon"}; + case PEN20_OFANIMON_ANIM_INDEX: return {pen20_ofanimon_png, pen20_ofanimon_png_size, "ofanimon"}; + case PEN20_OGUDOMON_ANIM_INDEX: return {pen20_ogudomon_png, pen20_ogudomon_png_size, "ogudomon"}; + case PEN20_OKUWAMON_ANIM_INDEX: return {pen20_okuwamon_png, pen20_okuwamon_png_size, "okuwamon"}; + case PEN20_ORDINEMON_ANIM_INDEX: return {pen20_ordinemon_png, pen20_ordinemon_png_size, "ordinemon"}; + case PEN20_OTAMAMON_ANIM_INDEX: return {pen20_otamamon_png, pen20_otamamon_png_size, "otamamon"}; + case PEN20_OURYUMON_ANIM_INDEX: return {pen20_ouryumon_png, pen20_ouryumon_png_size, "ouryumon"}; + case PEN20_PAILDRAMON_ANIM_INDEX: return {pen20_paildramon_png, pen20_paildramon_png_size, "paildramon"}; + case PEN20_PETI_MERAMON_ANIM_INDEX: return {pen20_peti_meramon_png, pen20_peti_meramon_png_size, "peti_meramon"}; + case PEN20_PHASCOMON_ANIM_INDEX: return {pen20_phascomon_png, pen20_phascomon_png_size, "phascomon"}; + case PEN20_PICO_DEVIMON_ANIM_INDEX: return {pen20_pico_devimon_png, pen20_pico_devimon_png_size, "pico_devimon"}; + case PEN20_PIEMON_ANIM_INDEX: return {pen20_piemon_png, pen20_piemon_png_size, "piemon"}; + case PEN20_PLESIOMON_ANIM_INDEX: return {pen20_plesiomon_png, pen20_plesiomon_png_size, "plesiomon"}; + case PEN20_PORCUPMON_ANIM_INDEX: return {pen20_porcupmon_png, pen20_porcupmon_png_size, "porcupmon"}; + case PEN20_PUKUMON_ANIM_INDEX: return {pen20_pukumon_png, pen20_pukumon_png_size, "pukumon"}; + case PEN20_PUMPMON_ANIM_INDEX: return {pen20_pumpmon_png, pen20_pumpmon_png_size, "pumpmon"}; + case PEN20_PYOCOMON_ANIM_INDEX: return {pen20_pyocomon_png, pen20_pyocomon_png_size, "pyocomon"}; + case PEN20_RAFFLESIMON_ANIM_INDEX: return {pen20_rafflesimon_png, pen20_rafflesimon_png_size, "rafflesimon"}; + case PEN20_RAGNA_LORDMON_ANIM_INDEX: return {pen20_ragna_lordmon_png, pen20_ragna_lordmon_png_size, "ragna_lordmon"}; + case PEN20_RAGUELMON_ANIM_INDEX: return {pen20_raguelmon_png, pen20_raguelmon_png_size, "raguelmon"}; + case PEN20_RAIJI_LUDOMON_ANIM_INDEX: return {pen20_raiji_ludomon_png, pen20_raiji_ludomon_png_size, "raiji_ludomon"}; + case PEN20_RAKAMON_ANIM_INDEX: return {pen20_rakamon_png, pen20_rakamon_png_size, "rakamon"}; + case PEN20_RAPIDMON_ANIM_INDEX: return {pen20_rapidmon_png, pen20_rapidmon_png_size, "rapidmon"}; + case PEN20_RED_VEGIMON_ANIM_INDEX: return {pen20_red_vegimon_png, pen20_red_vegimon_png_size, "red_vegimon"}; + case PEN20_REPPAMON_ANIM_INDEX: return {pen20_reppamon_png, pen20_reppamon_png_size, "reppamon"}; + case PEN20_REVOLMON_ANIM_INDEX: return {pen20_revolmon_png, pen20_revolmon_png_size, "revolmon"}; + case PEN20_RIZE_GREYMON_ANIM_INDEX: return {pen20_rize_greymon_png, pen20_rize_greymon_png_size, "rize_greymon"}; + case PEN20_ROSEMON_ANIM_INDEX: return {pen20_rosemon_png, pen20_rosemon_png_size, "rosemon"}; + case PEN20_RYUDAMON_ANIM_INDEX: return {pen20_ryudamon_png, pen20_ryudamon_png_size, "ryudamon"}; + case PEN20_SABER_LEOMON_ANIM_INDEX: return {pen20_saber_leomon_png, pen20_saber_leomon_png_size, "saber_leomon"}; + case PEN20_SAINT_GALGOMON_ANIM_INDEX: return {pen20_saint_galgomon_png, pen20_saint_galgomon_png_size, "saint_galgomon"}; + case PEN20_SERAPHIMON_ANIM_INDEX: return {pen20_seraphimon_png, pen20_seraphimon_png_size, "seraphimon"}; + case PEN20_SHADRAMON_ANIM_INDEX: return {pen20_shadramon_png, pen20_shadramon_png_size, "shadramon"}; + case PEN20_SHAKOMON_ANIM_INDEX: return {pen20_shakomon_png, pen20_shakomon_png_size, "shakomon"}; + case PEN20_STARMON_ANIM_INDEX: return {pen20_starmon_png, pen20_starmon_png_size, "starmon"}; + case PEN20_SUNFLOWMON_ANIM_INDEX: return {pen20_sunflowmon_png, pen20_sunflowmon_png_size, "sunflowmon"}; + case PEN20_TAILMON_ANIM_INDEX: return {pen20_tailmon_png, pen20_tailmon_png_size, "tailmon"}; + case PEN20_TANKMON_ANIM_INDEX: return {pen20_tankmon_png, pen20_tankmon_png_size, "tankmon"}; + case PEN20_TARGETMON_ANIM_INDEX: return {pen20_targetmon_png, pen20_targetmon_png_size, "targetmon"}; + case PEN20_TENTOMON_ANIM_INDEX: return {pen20_tentomon_png, pen20_tentomon_png_size, "tentomon"}; + case PEN20_TERRIERMON_ANIM_INDEX: return {pen20_terriermon_png, pen20_terriermon_png_size, "terriermon"}; + case PEN20_THUNDERBALLMON_ANIM_INDEX: return {pen20_thunderballmon_png, pen20_thunderballmon_png_size, "thunderballmon"}; + case PEN20_TIA_LUDOMON_ANIM_INDEX: return {pen20_tia_ludomon_png, pen20_tia_ludomon_png_size, "tia_ludomon"}; + case PEN20_TOGEMON_ANIM_INDEX: return {pen20_togemon_png, pen20_togemon_png_size, "togemon"}; + case PEN20_TONOSAMA_GEKOMON_ANIM_INDEX: return {pen20_tonosama_gekomon_png, pen20_tonosama_gekomon_png_size, "tonosama_gekomon"}; + case PEN20_TORTAMON_ANIM_INDEX: return {pen20_tortamon_png, pen20_tortamon_png_size, "tortamon"}; + case PEN20_TOY_AGUMON_ANIM_INDEX: return {pen20_toy_agumon_png, pen20_toy_agumon_png_size, "toy_agumon"}; + case PEN20_TRICERAMON_ANIM_INDEX: return {pen20_triceramon_png, pen20_triceramon_png_size, "triceramon"}; + case PEN20_TROOPMON_ANIM_INDEX: return {pen20_troopmon_png, pen20_troopmon_png_size, "troopmon"}; + case PEN20_TURUIEMON_ANIM_INDEX: return {pen20_turuiemon_png, pen20_turuiemon_png_size, "turuiemon"}; + case PEN20_V_DRAMON_ANIM_INDEX: return {pen20_v_dramon_png, pen20_v_dramon_png_size, "v_dramon"}; + case PEN20_VEMDEMON_ANIM_INDEX: return {pen20_vemdemon_png, pen20_vemdemon_png_size, "vemdemon"}; + case PEN20_VENOM_VAMDEMON_ANIM_INDEX: return {pen20_venom_vamdemon_png, pen20_venom_vamdemon_png_size, "venom_vamdemon"}; + case PEN20_V_MON_ANIM_INDEX: return {pen20_v_mon_png, pen20_v_mon_png_size, "v_mon"}; + case PEN20_VOLCANICDRAMON_ANIM_INDEX: return {pen20_volcanicdramon_png, pen20_volcanicdramon_png_size, "volcanicdramon"}; + case PEN20_VOLTOBAUTAMON_ANIM_INDEX: return {pen20_voltobautamon_png, pen20_voltobautamon_png_size, "voltobautamon"}; + case PEN20_VORVOMON_ANIM_INDEX: return {pen20_vorvomon_png, pen20_vorvomon_png_size, "vorvomon"}; + case PEN20_WARU_MOZAEMON_ANIM_INDEX: return {pen20_waru_mozaemon_png, pen20_waru_mozaemon_png_size, "waru_mozaemon"}; + case PEN20_WIZARMON_ANIM_INDEX: return {pen20_wizarmon_png, pen20_wizarmon_png_size, "wizarmon"}; + case PEN20_WOODMON_ANIM_INDEX: return {pen20_woodmon_png, pen20_woodmon_png_size, "woodmon"}; + case PEN20_XV_MON_ANIM_INDEX: return {pen20_xv_mon_png, pen20_xv_mon_png_size, "xv_mon"}; + case PEN20_ZERIMON_ANIM_INDEX: return {pen20_zerimon_png, pen20_zerimon_png_size, "zerimon"}; + case PEN20_ZUDOMOM_ANIM_INDEX: return {pen20_zudomom_png, pen20_zudomom_png_size, "zudomom"}; + default: return { nullptr, 0, "" }; + } + return { nullptr, 0, "" }; + } +} + diff --git a/src/embedded_assets/pen20/pen20_images.c b/src/embedded_assets/pen20/pen20_images.c new file mode 100644 index 00000000..dd25d02c --- /dev/null +++ b/src/embedded_assets/pen20/pen20_images.c @@ -0,0 +1,1167 @@ +#include "embedded_assets/pen20/pen20_images.h" +#include + +/// @NOTE: Generated embedded assets from assets/pen20 + +// Name: Aero V-dramon +const unsigned char pen20_aero_v_dramon_png[] = { +#embed "../../../assets/pen20/Aero V-dramon.png" +}; +const size_t pen20_aero_v_dramon_png_size = sizeof(pen20_aero_v_dramon_png); + + +// Name: Agumon Hakase +const unsigned char pen20_agumon_hakase_png[] = { +#embed "../../../assets/pen20/Agumon Hakase.png" +}; +const size_t pen20_agumon_hakase_png_size = sizeof(pen20_agumon_hakase_png); + + +// Name: Alphamon Ouryuken +const unsigned char pen20_alphamon_ouryuken_png[] = { +#embed "../../../assets/pen20/Alphamon Ouryuken.png" +}; +const size_t pen20_alphamon_ouryuken_png_size = sizeof(pen20_alphamon_ouryuken_png); + + +// Name: Andiramon +const unsigned char pen20_andiramon_png[] = { +#embed "../../../assets/pen20/Andiramon.png" +}; +const size_t pen20_andiramon_png_size = sizeof(pen20_andiramon_png); + + +// Name: Angewomon +const unsigned char pen20_angewomon_png[] = { +#embed "../../../assets/pen20/Angewomon.png" +}; +const size_t pen20_angewomon_png_size = sizeof(pen20_angewomon_png); + + +// Name: Anomalocarimon +const unsigned char pen20_anomalocarimon_png[] = { +#embed "../../../assets/pen20/Anomalocarimon.png" +}; +const size_t pen20_anomalocarimon_png_size = sizeof(pen20_anomalocarimon_png); + + +// Name: Arresterdramon +const unsigned char pen20_arresterdramon_png[] = { +#embed "../../../assets/pen20/Arresterdramon.png" +}; +const size_t pen20_arresterdramon_png_size = sizeof(pen20_arresterdramon_png); + + +// Name: Astramon +const unsigned char pen20_astramon_png[] = { +#embed "../../../assets/pen20/Astramon.png" +}; +const size_t pen20_astramon_png_size = sizeof(pen20_astramon_png); + + +// Name: Asuramon +const unsigned char pen20_asuramon_png[] = { +#embed "../../../assets/pen20/Asuramon.png" +}; +const size_t pen20_asuramon_png_size = sizeof(pen20_asuramon_png); + + +// Name: Atlur Kabuterimon +const unsigned char pen20_atlur_kabuterimon_png[] = { +#embed "../../../assets/pen20/Atlur Kabuterimon.png" +}; +const size_t pen20_atlur_kabuterimon_png_size = sizeof(pen20_atlur_kabuterimon_png); + + +// Name: Baalmon +const unsigned char pen20_baalmon_png[] = { +#embed "../../../assets/pen20/Baalmon.png" +}; +const size_t pen20_baalmon_png_size = sizeof(pen20_baalmon_png); + + +// Name: Bakumon +const unsigned char pen20_bakumon_png[] = { +#embed "../../../assets/pen20/Bakumon.png" +}; +const size_t pen20_bakumon_png_size = sizeof(pen20_bakumon_png); + + +// Name: Bancho Leomon +const unsigned char pen20_bancho_leomon_png[] = { +#embed "../../../assets/pen20/Bancho Leomon.png" +}; +const size_t pen20_bancho_leomon_png_size = sizeof(pen20_bancho_leomon_png); + + +// Name: Beelzebumon Blast Mode +const unsigned char pen20_beelzebumon_blast_mode_png[] = { +#embed "../../../assets/pen20/Beelzebumon Blast Mode.png" +}; +const size_t pen20_beelzebumon_blast_mode_png_size = sizeof(pen20_beelzebumon_blast_mode_png); + + +// Name: Beowulfmon +const unsigned char pen20_beowulfmon_png[] = { +#embed "../../../assets/pen20/Beowulfmon.png" +}; +const size_t pen20_beowulfmon_png_size = sizeof(pen20_beowulfmon_png); + + +// Name: Big Mamemon +const unsigned char pen20_big_mamemon_png[] = { +#embed "../../../assets/pen20/Big Mamemon.png" +}; +const size_t pen20_big_mamemon_png_size = sizeof(pen20_big_mamemon_png); + + +// Name: Blossomon +const unsigned char pen20_blossomon_png[] = { +#embed "../../../assets/pen20/Blossomon.png" +}; +const size_t pen20_blossomon_png_size = sizeof(pen20_blossomon_png); + + +// Name: Boltmon +const unsigned char pen20_boltmon_png[] = { +#embed "../../../assets/pen20/Boltmon.png" +}; +const size_t pen20_boltmon_png_size = sizeof(pen20_boltmon_png); + + +// Name: Bryweludramon +const unsigned char pen20_bryweludramon_png[] = { +#embed "../../../assets/pen20/Bryweludramon.png" +}; +const size_t pen20_bryweludramon_png_size = sizeof(pen20_bryweludramon_png); + + +// Name: Bubbmon +const unsigned char pen20_bubbmon_png[] = { +#embed "../../../assets/pen20/Bubbmon.png" +}; +const size_t pen20_bubbmon_png_size = sizeof(pen20_bubbmon_png); + + +// Name: Budmon +const unsigned char pen20_budmon_png[] = { +#embed "../../../assets/pen20/Budmon.png" +}; +const size_t pen20_budmon_png_size = sizeof(pen20_budmon_png); + + +// Name: Bushi Agumon +const unsigned char pen20_bushi_agumon_png[] = { +#embed "../../../assets/pen20/Bushi Agumon.png" +}; +const size_t pen20_bushi_agumon_png_size = sizeof(pen20_bushi_agumon_png); + + +// Name: Candmon +const unsigned char pen20_candmon_png[] = { +#embed "../../../assets/pen20/Candmon.png" +}; +const size_t pen20_candmon_png_size = sizeof(pen20_candmon_png); + + +// Name: Caprimon +const unsigned char pen20_caprimon_png[] = { +#embed "../../../assets/pen20/Caprimon.png" +}; +const size_t pen20_caprimon_png_size = sizeof(pen20_caprimon_png); + + +// Name: Chaosmon +const unsigned char pen20_chaosmon_png[] = { +#embed "../../../assets/pen20/Chaosmon.png" +}; +const size_t pen20_chaosmon_png_size = sizeof(pen20_chaosmon_png); + + +// Name: Cherubimon +const unsigned char pen20_cherubimon_png[] = { +#embed "../../../assets/pen20/Cherubimon.png" +}; +const size_t pen20_cherubimon_png_size = sizeof(pen20_cherubimon_png); + + +// Name: Chibimon +const unsigned char pen20_chibimon_png[] = { +#embed "../../../assets/pen20/Chibimon.png" +}; +const size_t pen20_chibimon_png_size = sizeof(pen20_chibimon_png); + + +// Name: Chicomon +const unsigned char pen20_chicomon_png[] = { +#embed "../../../assets/pen20/Chicomon.png" +}; +const size_t pen20_chicomon_png_size = sizeof(pen20_chicomon_png); + + +// Name: Choromon +const unsigned char pen20_choromon_png[] = { +#embed "../../../assets/pen20/Choromon.png" +}; +const size_t pen20_choromon_png_size = sizeof(pen20_choromon_png); + + +// Name: Clockmon +const unsigned char pen20_clockmon_png[] = { +#embed "../../../assets/pen20/Clockmon.png" +}; +const size_t pen20_clockmon_png_size = sizeof(pen20_clockmon_png); + + +// Name: Cocomon +const unsigned char pen20_cocomon_png[] = { +#embed "../../../assets/pen20/Cocomon.png" +}; +const size_t pen20_cocomon_png_size = sizeof(pen20_cocomon_png); + + +// Name: Cotsucomon +const unsigned char pen20_cotsucomon_png[] = { +#embed "../../../assets/pen20/Cotsucomon.png" +}; +const size_t pen20_cotsucomon_png_size = sizeof(pen20_cotsucomon_png); + + +// Name: Cyberdramon +const unsigned char pen20_cyberdramon_png[] = { +#embed "../../../assets/pen20/Cyberdramon.png" +}; +const size_t pen20_cyberdramon_png_size = sizeof(pen20_cyberdramon_png); + + +// Name: Dagomon +const unsigned char pen20_dagomon_png[] = { +#embed "../../../assets/pen20/Dagomon.png" +}; +const size_t pen20_dagomon_png_size = sizeof(pen20_dagomon_png); + + +// Name: Darkdramon +const unsigned char pen20_darkdramon_png[] = { +#embed "../../../assets/pen20/Darkdramon.png" +}; +const size_t pen20_darkdramon_png_size = sizeof(pen20_darkdramon_png); + + +// Name: Dark Knightmon +const unsigned char pen20_dark_knightmon_png[] = { +#embed "../../../assets/pen20/Dark Knightmon.png" +}; +const size_t pen20_dark_knightmon_png_size = sizeof(pen20_dark_knightmon_png); + + +// Name: Death Meramon +const unsigned char pen20_death_meramon_png[] = { +#embed "../../../assets/pen20/Death Meramon.png" +}; +const size_t pen20_death_meramon_png_size = sizeof(pen20_death_meramon_png); + + +// Name: Delumon +const unsigned char pen20_delumon_png[] = { +#embed "../../../assets/pen20/Delumon.png" +}; +const size_t pen20_delumon_png_size = sizeof(pen20_delumon_png); + + +// Name: Dokugumon +const unsigned char pen20_dokugumon_png[] = { +#embed "../../../assets/pen20/Dokugumon.png" +}; +const size_t pen20_dokugumon_png_size = sizeof(pen20_dokugumon_png); + + +// Name: DORUgoramon +const unsigned char pen20_dorugoramon_png[] = { +#embed "../../../assets/pen20/DORUgoramon.png" +}; +const size_t pen20_dorugoramon_png_size = sizeof(pen20_dorugoramon_png); + + +// Name: Ebidramon +const unsigned char pen20_ebidramon_png[] = { +#embed "../../../assets/pen20/Ebidramon.png" +}; +const size_t pen20_ebidramon_png_size = sizeof(pen20_ebidramon_png); + + +// Name: Fantomon +const unsigned char pen20_fantomon_png[] = { +#embed "../../../assets/pen20/Fantomon.png" +}; +const size_t pen20_fantomon_png_size = sizeof(pen20_fantomon_png); + + +// Name: Floramon +const unsigned char pen20_floramon_png[] = { +#embed "../../../assets/pen20/Floramon.png" +}; +const size_t pen20_floramon_png_size = sizeof(pen20_floramon_png); + + +// Name: Fufumon +const unsigned char pen20_fufumon_png[] = { +#embed "../../../assets/pen20/Fufumon.png" +}; +const size_t pen20_fufumon_png_size = sizeof(pen20_fufumon_png); + + +// Name: Galgomon +const unsigned char pen20_galgomon_png[] = { +#embed "../../../assets/pen20/Galgomon.png" +}; +const size_t pen20_galgomon_png_size = sizeof(pen20_galgomon_png); + + +// Name: Ganimon +const unsigned char pen20_ganimon_png[] = { +#embed "../../../assets/pen20/Ganimon.png" +}; +const size_t pen20_ganimon_png_size = sizeof(pen20_ganimon_png); + + +// Name: Garudamon +const unsigned char pen20_garudamon_png[] = { +#embed "../../../assets/pen20/Garudamon.png" +}; +const size_t pen20_garudamon_png_size = sizeof(pen20_garudamon_png); + + +// Name: Gekomon +const unsigned char pen20_gekomon_png[] = { +#embed "../../../assets/pen20/Gekomon.png" +}; +const size_t pen20_gekomon_png_size = sizeof(pen20_gekomon_png); + + +// Name: Gerbemon +const unsigned char pen20_gerbemon_png[] = { +#embed "../../../assets/pen20/Gerbemon.png" +}; +const size_t pen20_gerbemon_png_size = sizeof(pen20_gerbemon_png); + + +// Name: Gesomon +const unsigned char pen20_gesomon_png[] = { +#embed "../../../assets/pen20/Gesomon.png" +}; +const size_t pen20_gesomon_png_size = sizeof(pen20_gesomon_png); + + +// Name: Ginryumon +const unsigned char pen20_ginryumon_png[] = { +#embed "../../../assets/pen20/Ginryumon.png" +}; +const size_t pen20_ginryumon_png_size = sizeof(pen20_ginryumon_png); + + +// Name: Gomamon +const unsigned char pen20_gomamon_png[] = { +#embed "../../../assets/pen20/Gomamon.png" +}; +const size_t pen20_gomamon_png_size = sizeof(pen20_gomamon_png); + + +// Name: Gottsumon +const unsigned char pen20_gottsumon_png[] = { +#embed "../../../assets/pen20/Gottsumon.png" +}; +const size_t pen20_gottsumon_png_size = sizeof(pen20_gottsumon_png); + + +// Name: Griffomon +const unsigned char pen20_griffomon_png[] = { +#embed "../../../assets/pen20/Griffomon.png" +}; +const size_t pen20_griffomon_png_size = sizeof(pen20_griffomon_png); + + +// Name: Growmon +const unsigned char pen20_growmon_png[] = { +#embed "../../../assets/pen20/Growmon.png" +}; +const size_t pen20_growmon_png_size = sizeof(pen20_growmon_png); + + +// Name: Guardromon +const unsigned char pen20_guardromon_png[] = { +#embed "../../../assets/pen20/Guardromon.png" +}; +const size_t pen20_guardromon_png_size = sizeof(pen20_guardromon_png); + + +// Name: Guimon +const unsigned char pen20_guimon_png[] = { +#embed "../../../assets/pen20/Guimon.png" +}; +const size_t pen20_guimon_png_size = sizeof(pen20_guimon_png); + + +// Name: Gummymon +const unsigned char pen20_gummymon_png[] = { +#embed "../../../assets/pen20/Gummymon.png" +}; +const size_t pen20_gummymon_png_size = sizeof(pen20_gummymon_png); + + +// Name: Hagurumon +const unsigned char pen20_hagurumon_png[] = { +#embed "../../../assets/pen20/Hagurumon.png" +}; +const size_t pen20_hagurumon_png_size = sizeof(pen20_hagurumon_png); + + +// Name: Hangymon +const unsigned char pen20_hangymon_png[] = { +#embed "../../../assets/pen20/Hangymon.png" +}; +const size_t pen20_hangymon_png_size = sizeof(pen20_hangymon_png); + + +// Name: Hanumon +const unsigned char pen20_hanumon_png[] = { +#embed "../../../assets/pen20/Hanumon.png" +}; +const size_t pen20_hanumon_png_size = sizeof(pen20_hanumon_png); + + +// Name: Herkule Kabuterimon +const unsigned char pen20_herkule_kabuterimon_png[] = { +#embed "../../../assets/pen20/Herkule Kabuterimon.png" +}; +const size_t pen20_herkule_kabuterimon_png_size = sizeof(pen20_herkule_kabuterimon_png); + + +// Name: Hisyaryumon +const unsigned char pen20_hisyaryumon_png[] = { +#embed "../../../assets/pen20/Hisyaryumon.png" +}; +const size_t pen20_hisyaryumon_png_size = sizeof(pen20_hisyaryumon_png); + + +// Name: Holy Angemon +const unsigned char pen20_holy_angemon_png[] = { +#embed "../../../assets/pen20/Holy Angemon.png" +}; +const size_t pen20_holy_angemon_png_size = sizeof(pen20_holy_angemon_png); + + +// Name: Holydramon +const unsigned char pen20_holydramon_png[] = { +#embed "../../../assets/pen20/Holydramon.png" +}; +const size_t pen20_holydramon_png_size = sizeof(pen20_holydramon_png); + + +// Name: Hououmon +const unsigned char pen20_hououmon_png[] = { +#embed "../../../assets/pen20/Hououmon.png" +}; +const size_t pen20_hououmon_png_size = sizeof(pen20_hououmon_png); + + +// Name: Ignamon +const unsigned char pen20_ignamon_png[] = { +#embed "../../../assets/pen20/Ignamon.png" +}; +const size_t pen20_ignamon_png_size = sizeof(pen20_ignamon_png); + + +// Name: Ikkakumon +const unsigned char pen20_ikkakumon_png[] = { +#embed "../../../assets/pen20/Ikkakumon.png" +}; +const size_t pen20_ikkakumon_png_size = sizeof(pen20_ikkakumon_png); + + +// Name: Imperialdramon Fighter Mode +const unsigned char pen20_imperialdramon_fighter_mode_png[] = { +#embed "../../../assets/pen20/Imperialdramon Fighter Mode.png" +}; +const size_t pen20_imperialdramon_fighter_mode_png_size = sizeof(pen20_imperialdramon_fighter_mode_png); + + +// Name: Impmon +const unsigned char pen20_impmon_png[] = { +#embed "../../../assets/pen20/Impmon.png" +}; +const size_t pen20_impmon_png_size = sizeof(pen20_impmon_png); + + +// Name: Jesmon X +const unsigned char pen20_jesmon_x_png[] = { +#embed "../../../assets/pen20/Jesmon X.png" +}; +const size_t pen20_jesmon_x_png_size = sizeof(pen20_jesmon_x_png); + + +// Name: Jyagamon +const unsigned char pen20_jyagamon_png[] = { +#embed "../../../assets/pen20/Jyagamon.png" +}; +const size_t pen20_jyagamon_png_size = sizeof(pen20_jyagamon_png); + + +// Name: Jyureimon +const unsigned char pen20_jyureimon_png[] = { +#embed "../../../assets/pen20/Jyureimon.png" +}; +const size_t pen20_jyureimon_png_size = sizeof(pen20_jyureimon_png); + + +// Name: Kakkinmon +const unsigned char pen20_kakkinmon_png[] = { +#embed "../../../assets/pen20/Kakkinmon.png" +}; +const size_t pen20_kakkinmon_png_size = sizeof(pen20_kakkinmon_png); + + +// Name: Kiwimon +const unsigned char pen20_kiwimon_png[] = { +#embed "../../../assets/pen20/Kiwimon.png" +}; +const size_t pen20_kiwimon_png_size = sizeof(pen20_kiwimon_png); + + +// Name: Knightmon +const unsigned char pen20_knightmon_png[] = { +#embed "../../../assets/pen20/Knightmon.png" +}; +const size_t pen20_knightmon_png_size = sizeof(pen20_knightmon_png); + + +// Name: Kokuwamon +const unsigned char pen20_kokuwamon_png[] = { +#embed "../../../assets/pen20/Kokuwamon.png" +}; +const size_t pen20_kokuwamon_png_size = sizeof(pen20_kokuwamon_png); + + +// Name: Kyokyomon +const unsigned char pen20_kyokyomon_png[] = { +#embed "../../../assets/pen20/Kyokyomon.png" +}; +const size_t pen20_kyokyomon_png_size = sizeof(pen20_kyokyomon_png); + + +// Name: Lady Devimon +const unsigned char pen20_lady_devimon_png[] = { +#embed "../../../assets/pen20/Lady Devimon.png" +}; +const size_t pen20_lady_devimon_png_size = sizeof(pen20_lady_devimon_png); + + +// Name: Lalamon +const unsigned char pen20_lalamon_png[] = { +#embed "../../../assets/pen20/Lalamon.png" +}; +const size_t pen20_lalamon_png_size = sizeof(pen20_lalamon_png); + + +// Name: Lavogaritamon +const unsigned char pen20_lavogaritamon_png[] = { +#embed "../../../assets/pen20/Lavogaritamon.png" +}; +const size_t pen20_lavogaritamon_png_size = sizeof(pen20_lavogaritamon_png); + + +// Name: Lavorvomon +const unsigned char pen20_lavorvomon_png[] = { +#embed "../../../assets/pen20/Lavorvomon.png" +}; +const size_t pen20_lavorvomon_png_size = sizeof(pen20_lavorvomon_png); + + +// Name: Lilamon +const unsigned char pen20_lilamon_png[] = { +#embed "../../../assets/pen20/Lilamon.png" +}; +const size_t pen20_lilamon_png_size = sizeof(pen20_lilamon_png); + + +// Name: Lilimon +const unsigned char pen20_lilimon_png[] = { +#embed "../../../assets/pen20/Lilimon.png" +}; +const size_t pen20_lilimon_png_size = sizeof(pen20_lilimon_png); + + +// Name: Lopmon +const unsigned char pen20_lopmon_png[] = { +#embed "../../../assets/pen20/Lopmon.png" +}; +const size_t pen20_lopmon_png_size = sizeof(pen20_lopmon_png); + + +// Name: Lotusmon +const unsigned char pen20_lotusmon_png[] = { +#embed "../../../assets/pen20/Lotusmon.png" +}; +const size_t pen20_lotusmon_png_size = sizeof(pen20_lotusmon_png); + + +// Name: Ludomon +const unsigned char pen20_ludomon_png[] = { +#embed "../../../assets/pen20/Ludomon.png" +}; +const size_t pen20_ludomon_png_size = sizeof(pen20_ludomon_png); + + +// Name: Mad Leomon +const unsigned char pen20_mad_leomon_png[] = { +#embed "../../../assets/pen20/Mad Leomon.png" +}; +const size_t pen20_mad_leomon_png_size = sizeof(pen20_mad_leomon_png); + + +// Name: Mambomon +const unsigned char pen20_mambomon_png[] = { +#embed "../../../assets/pen20/Mambomon.png" +}; +const size_t pen20_mambomon_png_size = sizeof(pen20_mambomon_png); + + +// Name: Mammon +const unsigned char pen20_mammon_png[] = { +#embed "../../../assets/pen20/Mammon.png" +}; +const size_t pen20_mammon_png_size = sizeof(pen20_mammon_png); + + +// Name: Marin Angemon +const unsigned char pen20_marin_angemon_png[] = { +#embed "../../../assets/pen20/Marin Angemon.png" +}; +const size_t pen20_marin_angemon_png_size = sizeof(pen20_marin_angemon_png); + + +// Name: Marin Devimon +const unsigned char pen20_marin_devimon_png[] = { +#embed "../../../assets/pen20/Marin Devimon.png" +}; +const size_t pen20_marin_devimon_png_size = sizeof(pen20_marin_devimon_png); + + +// Name: Mastemon +const unsigned char pen20_mastemon_png[] = { +#embed "../../../assets/pen20/Mastemon.png" +}; +const size_t pen20_mastemon_png_size = sizeof(pen20_mastemon_png); + + +// Name: Mechanorimon +const unsigned char pen20_mechanorimon_png[] = { +#embed "../../../assets/pen20/Mechanorimon.png" +}; +const size_t pen20_mechanorimon_png_size = sizeof(pen20_mechanorimon_png); + + +// Name: Megalo Growmon +const unsigned char pen20_megalo_growmon_png[] = { +#embed "../../../assets/pen20/Megalo Growmon.png" +}; +const size_t pen20_megalo_growmon_png_size = sizeof(pen20_megalo_growmon_png); + + +// Name: Mega Seadramon +const unsigned char pen20_mega_seadramon_png[] = { +#embed "../../../assets/pen20/Mega Seadramon.png" +}; +const size_t pen20_mega_seadramon_png_size = sizeof(pen20_mega_seadramon_png); + + +// Name: Meicrackmon Vicious Mode +const unsigned char pen20_meicrackmon_vicious_mode_png[] = { +#embed "../../../assets/pen20/Meicrackmon Vicious Mode.png" +}; +const size_t pen20_meicrackmon_vicious_mode_png_size = sizeof(pen20_meicrackmon_vicious_mode_png); + + +// Name: Metal Etemon +const unsigned char pen20_metal_etemon_png[] = { +#embed "../../../assets/pen20/Metal Etemon.png" +}; +const size_t pen20_metal_etemon_png_size = sizeof(pen20_metal_etemon_png); + + +// Name: Metal Seadramon +const unsigned char pen20_metal_seadramon_png[] = { +#embed "../../../assets/pen20/Metal Seadramon.png" +}; +const size_t pen20_metal_seadramon_png_size = sizeof(pen20_metal_seadramon_png); + + +// Name: Mochimon +const unsigned char pen20_mochimon_png[] = { +#embed "../../../assets/pen20/Mochimon.png" +}; +const size_t pen20_mochimon_png_size = sizeof(pen20_mochimon_png); + + +// Name: Mokumon +const unsigned char pen20_mokumon_png[] = { +#embed "../../../assets/pen20/Mokumon.png" +}; +const size_t pen20_mokumon_png_size = sizeof(pen20_mokumon_png); + + +// Name: Mushmon +const unsigned char pen20_mushmon_png[] = { +#embed "../../../assets/pen20/Mushmon.png" +}; +const size_t pen20_mushmon_png_size = sizeof(pen20_mushmon_png); + + +// Name: Nyokimon +const unsigned char pen20_nyokimon_png[] = { +#embed "../../../assets/pen20/Nyokimon.png" +}; +const size_t pen20_nyokimon_png_size = sizeof(pen20_nyokimon_png); + + +// Name: Octmon +const unsigned char pen20_octmon_png[] = { +#embed "../../../assets/pen20/Octmon.png" +}; +const size_t pen20_octmon_png_size = sizeof(pen20_octmon_png); + + +// Name: Ofanimon +const unsigned char pen20_ofanimon_png[] = { +#embed "../../../assets/pen20/Ofanimon.png" +}; +const size_t pen20_ofanimon_png_size = sizeof(pen20_ofanimon_png); + + +// Name: Ogudomon +const unsigned char pen20_ogudomon_png[] = { +#embed "../../../assets/pen20/Ogudomon.png" +}; +const size_t pen20_ogudomon_png_size = sizeof(pen20_ogudomon_png); + + +// Name: Okuwamon +const unsigned char pen20_okuwamon_png[] = { +#embed "../../../assets/pen20/Okuwamon.png" +}; +const size_t pen20_okuwamon_png_size = sizeof(pen20_okuwamon_png); + + +// Name: Ordinemon +const unsigned char pen20_ordinemon_png[] = { +#embed "../../../assets/pen20/Ordinemon.png" +}; +const size_t pen20_ordinemon_png_size = sizeof(pen20_ordinemon_png); + + +// Name: Otamamon +const unsigned char pen20_otamamon_png[] = { +#embed "../../../assets/pen20/Otamamon.png" +}; +const size_t pen20_otamamon_png_size = sizeof(pen20_otamamon_png); + + +// Name: Ouryumon +const unsigned char pen20_ouryumon_png[] = { +#embed "../../../assets/pen20/Ouryumon.png" +}; +const size_t pen20_ouryumon_png_size = sizeof(pen20_ouryumon_png); + + +// Name: Paildramon +const unsigned char pen20_paildramon_png[] = { +#embed "../../../assets/pen20/Paildramon.png" +}; +const size_t pen20_paildramon_png_size = sizeof(pen20_paildramon_png); + + +// Name: Peti Meramon +const unsigned char pen20_peti_meramon_png[] = { +#embed "../../../assets/pen20/Peti Meramon.png" +}; +const size_t pen20_peti_meramon_png_size = sizeof(pen20_peti_meramon_png); + + +// Name: Phascomon +const unsigned char pen20_phascomon_png[] = { +#embed "../../../assets/pen20/Phascomon.png" +}; +const size_t pen20_phascomon_png_size = sizeof(pen20_phascomon_png); + + +// Name: Pico Devimon +const unsigned char pen20_pico_devimon_png[] = { +#embed "../../../assets/pen20/Pico Devimon.png" +}; +const size_t pen20_pico_devimon_png_size = sizeof(pen20_pico_devimon_png); + + +// Name: Piemon +const unsigned char pen20_piemon_png[] = { +#embed "../../../assets/pen20/Piemon.png" +}; +const size_t pen20_piemon_png_size = sizeof(pen20_piemon_png); + + +// Name: Plesiomon +const unsigned char pen20_plesiomon_png[] = { +#embed "../../../assets/pen20/Plesiomon.png" +}; +const size_t pen20_plesiomon_png_size = sizeof(pen20_plesiomon_png); + + +// Name: Porcupmon +const unsigned char pen20_porcupmon_png[] = { +#embed "../../../assets/pen20/Porcupmon.png" +}; +const size_t pen20_porcupmon_png_size = sizeof(pen20_porcupmon_png); + + +// Name: Pukumon +const unsigned char pen20_pukumon_png[] = { +#embed "../../../assets/pen20/Pukumon.png" +}; +const size_t pen20_pukumon_png_size = sizeof(pen20_pukumon_png); + + +// Name: Pumpmon +const unsigned char pen20_pumpmon_png[] = { +#embed "../../../assets/pen20/Pumpmon.png" +}; +const size_t pen20_pumpmon_png_size = sizeof(pen20_pumpmon_png); + + +// Name: Pyocomon +const unsigned char pen20_pyocomon_png[] = { +#embed "../../../assets/pen20/Pyocomon.png" +}; +const size_t pen20_pyocomon_png_size = sizeof(pen20_pyocomon_png); + + +// Name: Rafflesimon +const unsigned char pen20_rafflesimon_png[] = { +#embed "../../../assets/pen20/Rafflesimon.png" +}; +const size_t pen20_rafflesimon_png_size = sizeof(pen20_rafflesimon_png); + + +// Name: Ragna Lordmon +const unsigned char pen20_ragna_lordmon_png[] = { +#embed "../../../assets/pen20/Ragna Lordmon.png" +}; +const size_t pen20_ragna_lordmon_png_size = sizeof(pen20_ragna_lordmon_png); + + +// Name: Raguelmon +const unsigned char pen20_raguelmon_png[] = { +#embed "../../../assets/pen20/Raguelmon.png" +}; +const size_t pen20_raguelmon_png_size = sizeof(pen20_raguelmon_png); + + +// Name: Raiji Ludomon +const unsigned char pen20_raiji_ludomon_png[] = { +#embed "../../../assets/pen20/Raiji Ludomon.png" +}; +const size_t pen20_raiji_ludomon_png_size = sizeof(pen20_raiji_ludomon_png); + + +// Name: Rakamon +const unsigned char pen20_rakamon_png[] = { +#embed "../../../assets/pen20/Rakamon.png" +}; +const size_t pen20_rakamon_png_size = sizeof(pen20_rakamon_png); + + +// Name: Rapidmon +const unsigned char pen20_rapidmon_png[] = { +#embed "../../../assets/pen20/Rapidmon.png" +}; +const size_t pen20_rapidmon_png_size = sizeof(pen20_rapidmon_png); + + +// Name: Red Vegimon +const unsigned char pen20_red_vegimon_png[] = { +#embed "../../../assets/pen20/Red Vegimon.png" +}; +const size_t pen20_red_vegimon_png_size = sizeof(pen20_red_vegimon_png); + + +// Name: Reppamon +const unsigned char pen20_reppamon_png[] = { +#embed "../../../assets/pen20/Reppamon.png" +}; +const size_t pen20_reppamon_png_size = sizeof(pen20_reppamon_png); + + +// Name: Revolmon +const unsigned char pen20_revolmon_png[] = { +#embed "../../../assets/pen20/Revolmon.png" +}; +const size_t pen20_revolmon_png_size = sizeof(pen20_revolmon_png); + + +// Name: Rize Greymon +const unsigned char pen20_rize_greymon_png[] = { +#embed "../../../assets/pen20/Rize Greymon.png" +}; +const size_t pen20_rize_greymon_png_size = sizeof(pen20_rize_greymon_png); + + +// Name: Rosemon +const unsigned char pen20_rosemon_png[] = { +#embed "../../../assets/pen20/Rosemon.png" +}; +const size_t pen20_rosemon_png_size = sizeof(pen20_rosemon_png); + + +// Name: Ryudamon +const unsigned char pen20_ryudamon_png[] = { +#embed "../../../assets/pen20/Ryudamon.png" +}; +const size_t pen20_ryudamon_png_size = sizeof(pen20_ryudamon_png); + + +// Name: Saber Leomon +const unsigned char pen20_saber_leomon_png[] = { +#embed "../../../assets/pen20/Saber Leomon.png" +}; +const size_t pen20_saber_leomon_png_size = sizeof(pen20_saber_leomon_png); + + +// Name: Saint Galgomon +const unsigned char pen20_saint_galgomon_png[] = { +#embed "../../../assets/pen20/Saint Galgomon.png" +}; +const size_t pen20_saint_galgomon_png_size = sizeof(pen20_saint_galgomon_png); + + +// Name: Seraphimon +const unsigned char pen20_seraphimon_png[] = { +#embed "../../../assets/pen20/Seraphimon.png" +}; +const size_t pen20_seraphimon_png_size = sizeof(pen20_seraphimon_png); + + +// Name: Shadramon +const unsigned char pen20_shadramon_png[] = { +#embed "../../../assets/pen20/Shadramon.png" +}; +const size_t pen20_shadramon_png_size = sizeof(pen20_shadramon_png); + + +// Name: Shakomon +const unsigned char pen20_shakomon_png[] = { +#embed "../../../assets/pen20/Shakomon.png" +}; +const size_t pen20_shakomon_png_size = sizeof(pen20_shakomon_png); + + +// Name: Starmon +const unsigned char pen20_starmon_png[] = { +#embed "../../../assets/pen20/Starmon.png" +}; +const size_t pen20_starmon_png_size = sizeof(pen20_starmon_png); + + +// Name: Sunflowmon +const unsigned char pen20_sunflowmon_png[] = { +#embed "../../../assets/pen20/Sunflowmon.png" +}; +const size_t pen20_sunflowmon_png_size = sizeof(pen20_sunflowmon_png); + + +// Name: Tailmon +const unsigned char pen20_tailmon_png[] = { +#embed "../../../assets/pen20/Tailmon.png" +}; +const size_t pen20_tailmon_png_size = sizeof(pen20_tailmon_png); + + +// Name: Tankmon +const unsigned char pen20_tankmon_png[] = { +#embed "../../../assets/pen20/Tankmon.png" +}; +const size_t pen20_tankmon_png_size = sizeof(pen20_tankmon_png); + + +// Name: Targetmon +const unsigned char pen20_targetmon_png[] = { +#embed "../../../assets/pen20/Targetmon.png" +}; +const size_t pen20_targetmon_png_size = sizeof(pen20_targetmon_png); + + +// Name: Tentomon +const unsigned char pen20_tentomon_png[] = { +#embed "../../../assets/pen20/Tentomon.png" +}; +const size_t pen20_tentomon_png_size = sizeof(pen20_tentomon_png); + + +// Name: Terriermon +const unsigned char pen20_terriermon_png[] = { +#embed "../../../assets/pen20/Terriermon.png" +}; +const size_t pen20_terriermon_png_size = sizeof(pen20_terriermon_png); + + +// Name: Thunderballmon +const unsigned char pen20_thunderballmon_png[] = { +#embed "../../../assets/pen20/Thunderballmon.png" +}; +const size_t pen20_thunderballmon_png_size = sizeof(pen20_thunderballmon_png); + + +// Name: Tia Ludomon +const unsigned char pen20_tia_ludomon_png[] = { +#embed "../../../assets/pen20/Tia Ludomon.png" +}; +const size_t pen20_tia_ludomon_png_size = sizeof(pen20_tia_ludomon_png); + + +// Name: Togemon +const unsigned char pen20_togemon_png[] = { +#embed "../../../assets/pen20/Togemon.png" +}; +const size_t pen20_togemon_png_size = sizeof(pen20_togemon_png); + + +// Name: Tonosama Gekomon +const unsigned char pen20_tonosama_gekomon_png[] = { +#embed "../../../assets/pen20/Tonosama Gekomon.png" +}; +const size_t pen20_tonosama_gekomon_png_size = sizeof(pen20_tonosama_gekomon_png); + + +// Name: Tortamon +const unsigned char pen20_tortamon_png[] = { +#embed "../../../assets/pen20/Tortamon.png" +}; +const size_t pen20_tortamon_png_size = sizeof(pen20_tortamon_png); + + +// Name: Toy Agumon +const unsigned char pen20_toy_agumon_png[] = { +#embed "../../../assets/pen20/Toy Agumon.png" +}; +const size_t pen20_toy_agumon_png_size = sizeof(pen20_toy_agumon_png); + + +// Name: Triceramon +const unsigned char pen20_triceramon_png[] = { +#embed "../../../assets/pen20/Triceramon.png" +}; +const size_t pen20_triceramon_png_size = sizeof(pen20_triceramon_png); + + +// Name: Troopmon +const unsigned char pen20_troopmon_png[] = { +#embed "../../../assets/pen20/Troopmon.png" +}; +const size_t pen20_troopmon_png_size = sizeof(pen20_troopmon_png); + + +// Name: Turuiemon +const unsigned char pen20_turuiemon_png[] = { +#embed "../../../assets/pen20/Turuiemon.png" +}; +const size_t pen20_turuiemon_png_size = sizeof(pen20_turuiemon_png); + + +// Name: V-dramon +const unsigned char pen20_v_dramon_png[] = { +#embed "../../../assets/pen20/V-dramon.png" +}; +const size_t pen20_v_dramon_png_size = sizeof(pen20_v_dramon_png); + + +// Name: Vemdemon +const unsigned char pen20_vemdemon_png[] = { +#embed "../../../assets/pen20/Vemdemon.png" +}; +const size_t pen20_vemdemon_png_size = sizeof(pen20_vemdemon_png); + + +// Name: Venom Vamdemon +const unsigned char pen20_venom_vamdemon_png[] = { +#embed "../../../assets/pen20/Venom Vamdemon.png" +}; +const size_t pen20_venom_vamdemon_png_size = sizeof(pen20_venom_vamdemon_png); + + +// Name: V-mon +const unsigned char pen20_v_mon_png[] = { +#embed "../../../assets/pen20/V-mon.png" +}; +const size_t pen20_v_mon_png_size = sizeof(pen20_v_mon_png); + + +// Name: Volcanicdramon +const unsigned char pen20_volcanicdramon_png[] = { +#embed "../../../assets/pen20/Volcanicdramon.png" +}; +const size_t pen20_volcanicdramon_png_size = sizeof(pen20_volcanicdramon_png); + + +// Name: Voltobautamon +const unsigned char pen20_voltobautamon_png[] = { +#embed "../../../assets/pen20/Voltobautamon.png" +}; +const size_t pen20_voltobautamon_png_size = sizeof(pen20_voltobautamon_png); + + +// Name: Vorvomon +const unsigned char pen20_vorvomon_png[] = { +#embed "../../../assets/pen20/Vorvomon.png" +}; +const size_t pen20_vorvomon_png_size = sizeof(pen20_vorvomon_png); + + +// Name: Waru Mozaemon +const unsigned char pen20_waru_mozaemon_png[] = { +#embed "../../../assets/pen20/Waru Mozaemon.png" +}; +const size_t pen20_waru_mozaemon_png_size = sizeof(pen20_waru_mozaemon_png); + + +// Name: Wizarmon +const unsigned char pen20_wizarmon_png[] = { +#embed "../../../assets/pen20/Wizarmon.png" +}; +const size_t pen20_wizarmon_png_size = sizeof(pen20_wizarmon_png); + + +// Name: Woodmon +const unsigned char pen20_woodmon_png[] = { +#embed "../../../assets/pen20/Woodmon.png" +}; +const size_t pen20_woodmon_png_size = sizeof(pen20_woodmon_png); + + +// Name: XV-mon +const unsigned char pen20_xv_mon_png[] = { +#embed "../../../assets/pen20/XV-mon.png" +}; +const size_t pen20_xv_mon_png_size = sizeof(pen20_xv_mon_png); + + +// Name: Zerimon +const unsigned char pen20_zerimon_png[] = { +#embed "../../../assets/pen20/Zerimon.png" +}; +const size_t pen20_zerimon_png_size = sizeof(pen20_zerimon_png); + + +// Name: Zudomom +const unsigned char pen20_zudomom_png[] = { +#embed "../../../assets/pen20/Zudomom.png" +}; +const size_t pen20_zudomom_png_size = sizeof(pen20_zudomom_png); + + diff --git a/src/graphics/animation.cpp b/src/graphics/animation.cpp index 30ec2469..f9c4b6c0 100644 --- a/src/graphics/animation.cpp +++ b/src/graphics/animation.cpp @@ -16,8 +16,10 @@ #include "image_loader/ms_agent/load_images_ms_agent.h" #include "image_loader/dm/load_images_dm.h" #include "image_loader/dm20/load_images_dm20.h" -#include "image_loader/dmc/load_images_dmc.h" #include "image_loader/dmx/load_images_dmx.h" +#include "image_loader/pen/load_images_pen.h" +#include "image_loader/pen20/load_images_pen20.h" +#include "image_loader/dmc/load_images_dmc.h" #include "embedded_assets/bongocat/bongocat.h" #include "embedded_assets/ms_agent/ms_agent.hpp" #include "embedded_assets/ms_agent/ms_agent_sprite.h" @@ -38,14 +40,16 @@ namespace bongocat::animation { inline static constexpr platform::time_ms_t COND_RELOAD_CONFIGS_TIMEOUT_MS = 5000; inline static constexpr int CHANCE_FOR_SKIPPING_MOVEMENT_PERCENT = 30; // in percent - inline static constexpr int SMALL_MAX_DISTANCE_PER_MOVEMENT_PART = 3; // 1/3 of movement_radius (for small areas) - inline static constexpr int MAX_DISTANCE_PER_MOVEMENT_PART = 5; // 1/5 of movement_radius + inline static constexpr int SMALL_MAX_DISTANCE_PER_MOVEMENT_PART = 3; // 1/3 of movement_radius (for small areas) + inline static constexpr int MAX_DISTANCE_PER_MOVEMENT_PART = 5; // 1/5 of movement_radius static_assert(SMALL_MAX_DISTANCE_PER_MOVEMENT_PART > 0); static_assert(MAX_DISTANCE_PER_MOVEMENT_PART > 0); inline static constexpr int MAX_MOVEMENT_RADIUS_SMALL = 100; inline static constexpr int FLIP_DIRECTION_NEAR_WALL_PERCENT = 70; inline static constexpr int SMALL_FLIP_DIRECTION_NEAR_WALL_PERCENT = 40; + inline static constexpr int SLEEP_BORING_PART = 2; // 1/2 of sleep time for triggering boring animation + // ============================================================================= // ANIMATION STATE MANAGEMENT MODULE // ============================================================================= @@ -87,871 +91,2185 @@ namespace bongocat::animation { }; struct animation_state_t { + // animation timing platform::time_ms_t frame_delta_ms_counter{0}; + platform::time_ms_t update_delta_ms_counter{0}; platform::time_ns_t frame_time_ns{0}; platform::time_ms_t frame_time_ms{0}; platform::time_ms_t hold_frame_ms{0}; platform::timestamp_ms_t last_frame_update_ms{0}; - animation_state_row_t row_state{animation_state_row_t::Idle}; - bool boring_frame_showed{false}; + platform::timestamp_ms_t time_until_next_frame_ms{0}; + + // state bool hold_frame_after_release{false}; + bool show_boring_animation_once{false}; + bool is_idle_sleep{false}; + + // moving float anim_velocity{0.0}; float anim_distance{0.0}; float anim_last_direction{0.0}; int32_t anim_pause_after_movement_ms{0}; + + // animation player data + animation_state_row_t row_state{animation_state_row_t::Idle}; + // for ms agent and sprite sheets + int32_t start_col_index{0}; + int32_t end_col_index{0}; + // for am/bongocat/pkmn (cached animation frames) + int32_t animations_index{0}; // for sprite_sheet.frames (col indices) array }; struct anim_next_frame_result_t { - bool changed{false}; - int new_frame{0}; + bool moved{false}; + bool frame_changed{false}; + bool rerender{false}; + int32_t new_col{0}; + int32_t new_row{0}; }; - struct anim_handle_key_press_result_t { + + struct animation_trigger_t { + trigger_animation_cause_mask_t anim_cause{trigger_animation_cause_mask_t::NONE}; int any_key_press_counter{0}; - bool changed{false}; - trigger_animation_cause_mask_t triggered_anim_cause{trigger_animation_cause_mask_t::NONE}; + }; + struct anim_handle_key_press_result_t { + animation_trigger_t trigger; + anim_next_frame_result_t update_frame_result; }; -#ifdef FEATURE_BONGOCAT_EMBEDDED_ASSETS - static anim_next_frame_result_t anim_bongocat_idle_next_frame(animation_context_t& ctx, const platform::input::input_context_t& input, - animation_state_t& state, const anim_handle_key_press_result_t& trigger_result) { - using namespace assets; - // read-only config - assert(ctx._local_copy_config != nullptr); - const config::config_t& current_config = *ctx._local_copy_config; - + struct anim_conditions_t { + platform::timestamp_ms_t last_key_pressed_timestamp{0}; + + // trigger (start animation) + bool any_key_pressed{false}; + bool trigger_test_animation{false}; + bool check_for_idle_sleep{false}; + bool process_movement{false}; + + // trigger (back to idle) + bool release_test_frame{false}; + bool release_frame_after_press{false}; + bool release_frame_after_update{false}; + + // for continues animations + bool process_idle_animation{false}; + bool process_movement_animation{false}; + bool process_working_animation{false}; + bool go_next_frame{false}; + bool release_frame_for_non_idle{false}; + + // current animation + bool is_writing{false}; + bool is_moving{false}; + bool is_working{false}; + bool continue_writing{false}; + }; + static anim_conditions_t get_anim_conditions([[maybe_unused]] const animation_context_t& ctx, + const platform::input::input_context_t& input, + const animation_state_t& current_state, + const animation_trigger_t& trigger, + const config::config_t& current_config) { assert(input.shm != nullptr); - assert(ctx.shm != nullptr); - animation_shared_memory_t& anim_shm = *ctx.shm; const auto& input_shm = *input.shm; - auto& animation_player_data = anim_shm.animation_player_data; - const auto current_frame = animation_player_data.frame_index; - //const auto current_row = animation_player_data.sprite_sheet_row; - //const animation_state_row_t current_row_state = state.row_state; - [[maybe_unused]] const int anim_index = anim_shm.anim_index; const platform::timestamp_ms_t last_key_pressed_timestamp = input_shm.last_key_pressed_timestamp; + const platform::timestamp_ms_t fps_ms = 1000/current_config.fps; - animation_state_row_t new_row_state = state.row_state; - int new_row = animation_player_data.sprite_sheet_row; - int new_start_frame_index = animation_player_data.start_frame_index; - int new_end_frame_index = animation_player_data.end_frame_index; - int new_frame = current_frame; + const bool any_key_pressed = has_flag(trigger.anim_cause, trigger_animation_cause_mask_t::KeyPress) && trigger.any_key_press_counter > 0; - const bool any_key_pressed = has_flag(trigger_result.triggered_anim_cause, trigger_animation_cause_mask_t::KeyPress) && trigger_result.any_key_press_counter > 0; + const bool process_idle_animation_by_animation_speed = current_config.idle_animation && current_config.animation_speed_ms > 0 && current_state.frame_delta_ms_counter > current_config.animation_speed_ms; + const bool process_idle_animation_by_fps = current_config.idle_animation && current_config.animation_speed_ms <= 0 && current_state.frame_delta_ms_counter > fps_ms; + const bool process_idle_animation = process_idle_animation_by_animation_speed || process_idle_animation_by_fps; - // @TODO: get variables as struct to make it more reusable - const bool release_frame_after_press = !any_key_pressed && state.hold_frame_ms > current_config.keypress_duration_ms; - //const bool process_idle_animation = (current_config.idle_animation && current_config.animation_speed_ms > 0 && state.frame_delta_ms_counter > current_config.animation_speed_ms) || (current_config.idle_animation && current_config.animation_speed_ms <= 0 && state.frame_delta_ms_counter > 1000/current_config.fps); - const bool trigger_test_animation = current_config.test_animation_interval_sec > 0 && state.frame_delta_ms_counter > current_config.test_animation_interval_sec*1000; - const bool release_test_frame = current_config.test_animation_duration_ms > 0 && state.frame_delta_ms_counter > current_config.test_animation_duration_ms; - const bool check_for_idle_sleep = current_config.idle_sleep_timeout_sec > 0 && state.frame_delta_ms_counter > current_config.idle_sleep_timeout_sec*1000/2 && last_key_pressed_timestamp > 0; + const bool release_frame_by_animation_speed = !current_config.idle_animation && current_config.animation_speed_ms > 0 && current_state.hold_frame_ms > current_config.animation_speed_ms; + const bool release_frame_animation_by_fps = !current_config.idle_animation && current_config.animation_speed_ms <= 0 && current_state.hold_frame_ms > fps_ms; + const bool release_frame_for_non_idle = release_frame_by_animation_speed || release_frame_animation_by_fps; + const bool go_next_frame = (current_config.animation_speed_ms > 0 && current_state.frame_delta_ms_counter > current_config.animation_speed_ms) || (current_config.animation_speed_ms <= 0 && current_state.frame_delta_ms_counter > fps_ms); - if (!release_frame_after_press && !trigger_test_animation && !release_test_frame && !check_for_idle_sleep && !current_config.enable_scheduled_sleep) { - return { .changed = false, .new_frame = new_frame}; - } + const bool process_movement_animation_by_animation_speed = current_config.movement_speed > 0 && current_config.movement_radius > 0 && current_config.animation_speed_ms > 0 && current_state.frame_delta_ms_counter > current_config.animation_speed_ms; + const bool process_movement_animation_by_fps = current_config.movement_speed > 0 && current_config.movement_radius > 0 && current_config.animation_speed_ms <= 0 && current_state.frame_delta_ms_counter > fps_ms; + const bool process_movement_animation = process_movement_animation_by_animation_speed || process_movement_animation_by_fps; - // Idle/Test animation - if (!any_key_pressed && trigger_test_animation && state.row_state == animation_state_row_t::Idle) { - new_row = BONGOCAT_SPRITE_SHEET_ROWS-1; - new_start_frame_index = BONGOCAT_FRAME_LEFT_DOWN; - new_end_frame_index = BONGOCAT_FRAME_RIGHT_DOWN; - new_row_state = animation_state_row_t::Test; - // toggle frame - if (current_frame == BONGOCAT_FRAME_LEFT_DOWN) { - new_frame = BONGOCAT_FRAME_RIGHT_DOWN; - } else if (current_frame == BONGOCAT_FRAME_RIGHT_DOWN) { - new_frame = BONGOCAT_FRAME_LEFT_DOWN; - } else { - static_assert(BONGOCAT_FRAME_RIGHT_DOWN >= BONGOCAT_FRAME_LEFT_DOWN); - static_assert(BONGOCAT_FRAME_LEFT_DOWN >= 0); - static_assert(BONGOCAT_FRAME_RIGHT_DOWN >= 0); - new_frame = static_cast(ctx._rng.range(BONGOCAT_FRAME_LEFT_DOWN, BONGOCAT_FRAME_RIGHT_DOWN)); + const bool process_working_animation_by_animation_speed = current_config.cpu_threshold > 0 && current_config.update_rate_ms > 0 && current_config.animation_speed_ms > 0 && current_state.frame_delta_ms_counter > current_config.animation_speed_ms; + const bool process_working_animation_by_fps = current_config.cpu_threshold > 0 && current_config.update_rate_ms > 0 && current_config.animation_speed_ms <= 0 && current_state.frame_delta_ms_counter > fps_ms; + const bool process_working_animation = process_working_animation_by_animation_speed || process_working_animation_by_fps; + + const bool process_movement = current_config.movement_speed > 0 && current_config.movement_radius > 0 && current_state.update_delta_ms_counter > current_config.animation_speed_ms; + + const bool is_writing = current_state.row_state == animation_state_row_t::StartWriting || current_state.row_state == animation_state_row_t::Writing || current_state.row_state == animation_state_row_t::EndWriting; + const bool release_frame_after_press = !any_key_pressed && current_state.hold_frame_ms > current_config.keypress_duration_ms; + + assert(SMALL_MAX_DISTANCE_PER_MOVEMENT_PART > 0); + assert(MAX_DISTANCE_PER_MOVEMENT_PART > 0); + + // @TODO: reduce duplicated condition for when updating frames vs. movement vs. working animation + + return { + .last_key_pressed_timestamp = last_key_pressed_timestamp, + + .any_key_pressed = any_key_pressed, + .trigger_test_animation = current_config.test_animation_interval_sec > 0 && current_state.frame_delta_ms_counter > current_config.test_animation_interval_sec*1000, + .check_for_idle_sleep = current_config.idle_sleep_timeout_sec > 0 && ((SLEEP_BORING_PART > 0 && current_state.frame_delta_ms_counter > current_config.idle_sleep_timeout_sec*1000/SLEEP_BORING_PART && last_key_pressed_timestamp > 0) || process_idle_animation || process_movement), + .process_movement = process_movement, + + .release_test_frame = current_config.test_animation_duration_ms > 0 && current_state.frame_delta_ms_counter > current_config.test_animation_duration_ms, + .release_frame_after_press = release_frame_after_press, + .release_frame_after_update = (!any_key_pressed && has_flag(trigger.anim_cause, trigger_animation_cause_mask_t::CpuUpdate)) && current_state.hold_frame_ms > current_config.keypress_duration_ms, + + .process_idle_animation = process_idle_animation, + .process_movement_animation = process_movement_animation, + .process_working_animation = process_working_animation, + .go_next_frame = go_next_frame, + .release_frame_for_non_idle = release_frame_for_non_idle || go_next_frame, + + .is_writing = is_writing, + .is_moving = current_state.row_state == animation_state_row_t::StartMoving || current_state.row_state == animation_state_row_t::Moving || current_state.row_state == animation_state_row_t::EndMoving, + .is_working = current_state.row_state == animation_state_row_t::StartWorking || current_state.row_state == animation_state_row_t::Working, + .continue_writing = ((!any_key_pressed && current_state.hold_frame_ms < current_config.keypress_duration_ms) || !release_frame_after_press) && is_writing, + }; + } + + static anim_next_frame_result_t anim_update_animation_state(animation_shared_memory_t& anim_shm, + animation_state_t& state, + const animation_player_result_t& new_animation_result, + const animation_state_t& new_state, + const animation_player_result_t& current_animation_result, + const animation_state_t& current_state, + const config::config_t& current_config) { + const bool moved = static_cast(current_state.anim_distance) != static_cast(new_state.anim_distance); + const bool frame_changed = new_animation_result.sprite_sheet_col != current_animation_result.sprite_sheet_col || new_animation_result.sprite_sheet_row != current_animation_result.sprite_sheet_row; + const bool rerender = frame_changed || current_state.row_state != new_state.row_state || moved; + state = new_state; + if (new_state.animations_index != current_state.animations_index || rerender || moved) { + anim_shm.animation_player_result = new_animation_result; + if (current_config.enable_debug) { + BONGOCAT_LOG_VERBOSE("Animation frame change: %d", new_animation_result.sprite_sheet_col); } - } - // Idle Animation - if (release_frame_after_press || (trigger_test_animation && state.row_state == animation_state_row_t::Test && release_test_frame)) { - // back to idle - new_start_frame_index = BONGOCAT_FRAME_BOTH_UP; - new_end_frame_index = BONGOCAT_FRAME_BOTH_UP; - new_frame = BONGOCAT_FRAME_BOTH_UP; - new_row = BONGOCAT_SPRITE_SHEET_ROWS-1; - new_row_state = animation_state_row_t::Idle; + if (frame_changed) { + state.frame_delta_ms_counter = 0; + } + state.update_delta_ms_counter = 0; } - // Sleep Mode - if (current_config.enable_scheduled_sleep) { - if (is_sleep_time(current_config)) { - new_frame = BONGOCAT_FRAME_BOTH_DOWN; - new_start_frame_index = BONGOCAT_FRAME_BOTH_DOWN; - new_end_frame_index = BONGOCAT_FRAME_BOTH_DOWN; - new_row_state = animation_state_row_t::Sleep; - } + return { .moved = moved, .frame_changed = frame_changed, .rerender = rerender, .new_col = new_animation_result.sprite_sheet_col, .new_row = new_animation_result.sprite_sheet_row }; + } + + /// @TODO: move anim_..._animation into own cpp files per asset set, make it more modular + +#ifdef FEATURE_BONGOCAT_EMBEDDED_ASSETS + enum class anim_bongocat_process_animation_result_status_t : uint8_t { None, Started, Updated, End, Looped, NextAnimationStarted }; + struct anim_bongocat_process_animation_result_t { + animation_state_row_t row_state; + anim_bongocat_process_animation_result_status_t status{anim_bongocat_process_animation_result_status_t::None}; + }; + static anim_bongocat_process_animation_result_t anim_bongocat_process_animation(animation_player_result_t& new_animation_result, + animation_state_t& new_state, + const animation_state_t& current_state, + const bongocat_sprite_sheet_t& current_frames) { + assert(MAX_ANIMATION_FRAMES > 0); + assert(MAX_ANIMATION_FRAMES <= INT_MAX); + + anim_bongocat_process_animation_result_t ret {.row_state = new_state.row_state, .status = anim_bongocat_process_animation_result_status_t::Updated}; + // forward animation + new_state.animations_index = current_state.animations_index + 1; + if (new_state.animations_index > static_cast(MAX_ANIMATION_FRAMES-1)) { + ret.status = anim_bongocat_process_animation_result_status_t::Looped; + new_state.animations_index = 0; } - // Idle Sleep - if (current_config.idle_sleep_timeout_sec > 0 && last_key_pressed_timestamp > 0) { - const platform::timestamp_ms_t now = platform::get_current_time_ms(); - const platform::time_ms_t idle_sleep_timeout_ms = current_config.idle_sleep_timeout_sec*1000; - // boring - if (!state.boring_frame_showed && now - last_key_pressed_timestamp >= idle_sleep_timeout_ms/2) { - new_frame = BONGOCAT_FRAME_BOTH_DOWN; - new_start_frame_index = BONGOCAT_FRAME_BOTH_DOWN; - new_end_frame_index = BONGOCAT_FRAME_BOTH_DOWN; - new_row_state = animation_state_row_t::Boring; - } - // sleep - if (now - last_key_pressed_timestamp >= idle_sleep_timeout_ms) { - new_frame = BONGOCAT_FRAME_BOTH_DOWN; - new_start_frame_index = BONGOCAT_FRAME_BOTH_DOWN; - new_end_frame_index = BONGOCAT_FRAME_BOTH_DOWN; - new_row_state = animation_state_row_t::Sleep; - } + /* + // backwards animation + else if (new_state.animations_index < 0) { + ret = anim_bongocat_process_animation_result_t::End; + new_state.animations_index = MAX_ANIMATION_FRAMES-1; + } + */ + switch (new_state.row_state) { + case animation_state_row_t::Idle: + new_animation_result.sprite_sheet_col = current_frames.animations.idle[new_state.animations_index]; + break; + case animation_state_row_t::StartWriting: + case animation_state_row_t::Writing: + case animation_state_row_t::EndWriting: + new_animation_result.sprite_sheet_col = current_frames.animations.writing[new_state.animations_index]; + break; + case animation_state_row_t::Happy: + new_animation_result.sprite_sheet_col = current_frames.animations.happy[new_state.animations_index]; + break; + case animation_state_row_t::Sleep: + new_animation_result.sprite_sheet_col = current_frames.animations.sleep[new_state.animations_index]; + break; + case animation_state_row_t::WakeUp: + new_animation_result.sprite_sheet_col = current_frames.animations.wake_up[new_state.animations_index]; + break; + case animation_state_row_t::Boring: + new_animation_result.sprite_sheet_col = current_frames.animations.boring[new_state.animations_index]; + break; + case animation_state_row_t::Test: + new_animation_result.sprite_sheet_col = current_frames.animations.writing[new_state.animations_index]; + break; + case animation_state_row_t::StartWorking: + case animation_state_row_t::Working: + case animation_state_row_t::EndWorking: + new_animation_result.sprite_sheet_col = current_frames.animations.working[new_state.animations_index]; + break; + case animation_state_row_t::StartMoving: + case animation_state_row_t::Moving: + case animation_state_row_t::EndMoving: + new_animation_result.sprite_sheet_col = current_frames.animations.moving[new_state.animations_index]; + break; } + return ret; + } + static anim_bongocat_process_animation_result_t anim_bongocat_restart_animation(animation_context_t& ctx, + animation_state_row_t new_row_state, + animation_player_result_t& new_animation_result, + animation_state_t& new_state, + [[maybe_unused]] const animation_state_t& current_state, + const bongocat_sprite_sheet_t& current_frames, + const config::config_t& current_config) { + using namespace assets; + assert(MAX_ANIMATION_FRAMES > 0); + assert(MAX_ANIMATION_FRAMES <= INT_MAX); - const bool changed = animation_player_data.frame_index != new_frame || animation_player_data.sprite_sheet_row != new_row || state.row_state != new_row_state; - if (changed) { - ctx.shm->animation_player_data.frame_index = new_frame; - animation_player_data.sprite_sheet_row = new_row; - animation_player_data.start_frame_index = new_start_frame_index; - animation_player_data.end_frame_index = new_end_frame_index; - state.row_state = new_row_state; - if (new_row_state == animation_state_row_t::Boring) { - state.boring_frame_showed = true; - } - if (current_config.enable_debug) { - BONGOCAT_LOG_VERBOSE("Animation frame change: %d", new_frame); + new_state.row_state = new_row_state; + new_animation_result.sprite_sheet_row = BONGOCAT_SPRITE_SHEET_ROW; + new_state.animations_index = 0; + + anim_bongocat_process_animation_result_t ret {.row_state = new_state.row_state, .status = anim_bongocat_process_animation_result_status_t::Started}; + switch (new_state.row_state) { + case animation_state_row_t::Idle: + new_animation_result.sprite_sheet_col = current_frames.animations.idle[new_state.animations_index]; + if (current_config.idle_frame) { + new_animation_result.sprite_sheet_col = current_config.idle_frame; + } + break; + case animation_state_row_t::StartWriting: + new_state.animations_index = static_cast(ctx._rng.range(0, (MAX_ANIMATION_FRAMES-1) / 2)); + [[fallthrough]]; + case animation_state_row_t::Writing: + case animation_state_row_t::EndWriting: + new_animation_result.sprite_sheet_col = current_frames.animations.writing[new_state.animations_index]; + break; + case animation_state_row_t::Happy: + new_animation_result.sprite_sheet_col = current_frames.animations.happy[new_state.animations_index]; + break; + case animation_state_row_t::Sleep: + new_animation_result.sprite_sheet_col = current_frames.animations.sleep[new_state.animations_index]; + break; + case animation_state_row_t::WakeUp: + new_animation_result.sprite_sheet_col = current_frames.animations.wake_up[new_state.animations_index]; + break; + case animation_state_row_t::Boring: + new_animation_result.sprite_sheet_col = current_frames.animations.boring[new_state.animations_index]; + break; + case animation_state_row_t::Test: + new_animation_result.sprite_sheet_col = current_frames.animations.writing[new_state.animations_index]; + break; + case animation_state_row_t::StartWorking: + case animation_state_row_t::Working: + case animation_state_row_t::EndWorking: + new_animation_result.sprite_sheet_col = current_frames.animations.working[new_state.animations_index]; + break; + case animation_state_row_t::StartMoving: + case animation_state_row_t::Moving: + case animation_state_row_t::EndMoving: + new_animation_result.sprite_sheet_col = current_frames.animations.moving[new_state.animations_index]; + break; + } + return ret; + } + /* + static anim_bongocat_process_animation_result_t anim_bongocat_show_single_frame(animation_context_t& ctx, + animation_state_row_t new_row_state, + animation_player_result_t& new_animation_result, + animation_state_t& new_state, + [[maybe_unused]] const animation_state_t& current_state, + [[maybe_unused]] const bongocat_sprite_sheet_t& current_frames, + const config::config_t& current_config) { + using namespace assets; + assert(MAX_ANIMATION_FRAMES > 0); + assert(MAX_ANIMATION_FRAMES <= INT_MAX); + anim_bongocat_process_animation_result_t ret = anim_bongocat_process_animation_result_t::Started; + new_state.row_state = new_row_state; + new_animation_result.sprite_sheet_row = BONGOCAT_SPRITE_SHEET_ROW; + new_state.animations_index = 0; + switch (new_state.row_state) { + case animation_state_row_t::Idle: + new_animation_result.sprite_sheet_col = BONGOCAT_FRAME_BOTH_UP; + if (current_config.idle_frame) { + new_animation_result.sprite_sheet_col = current_config.idle_frame; + } + break; + case animation_state_row_t::StartWriting: + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? BONGOCAT_FRAME_LEFT_DOWN : BONGOCAT_FRAME_RIGHT_DOWN; + [[fallthrough]]; + case animation_state_row_t::Writing: + case animation_state_row_t::EndWriting: + // toggle frame + if (new_animation_result.sprite_sheet_col == BONGOCAT_FRAME_LEFT_DOWN) { + new_animation_result.sprite_sheet_col = BONGOCAT_FRAME_RIGHT_DOWN; + } else if (new_animation_result.sprite_sheet_col == BONGOCAT_FRAME_RIGHT_DOWN) { + new_animation_result.sprite_sheet_col = BONGOCAT_FRAME_LEFT_DOWN; + } else { + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? BONGOCAT_FRAME_LEFT_DOWN : BONGOCAT_FRAME_RIGHT_DOWN; + } + break; + case animation_state_row_t::Happy: + new_animation_result.sprite_sheet_col = BONGOCAT_FRAME_BOTH_UP; + break; + case animation_state_row_t::Sleep: + new_animation_result.sprite_sheet_col = BONGOCAT_FRAME_BOTH_DOWN; + break; + case animation_state_row_t::WakeUp: + new_animation_result.sprite_sheet_col = BONGOCAT_FRAME_BOTH_UP; + break; + case animation_state_row_t::Boring: + new_animation_result.sprite_sheet_col = BONGOCAT_FRAME_BOTH_DOWN; + break; + case animation_state_row_t::Test: + // toggle frame (same as writing?) + if (new_animation_result.sprite_sheet_col == BONGOCAT_FRAME_LEFT_DOWN) { + new_animation_result.sprite_sheet_col = BONGOCAT_FRAME_RIGHT_DOWN; + } else if (new_animation_result.sprite_sheet_col == BONGOCAT_FRAME_RIGHT_DOWN) { + new_animation_result.sprite_sheet_col = BONGOCAT_FRAME_LEFT_DOWN; + } else { + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? BONGOCAT_FRAME_LEFT_DOWN : BONGOCAT_FRAME_RIGHT_DOWN; + } + break; + case animation_state_row_t::StartWorking: + case animation_state_row_t::Working: + case animation_state_row_t::EndWorking: + // toggle frame (unused) + if (new_animation_result.sprite_sheet_col == BONGOCAT_FRAME_LEFT_DOWN) { + new_animation_result.sprite_sheet_col = BONGOCAT_FRAME_RIGHT_DOWN; + } else if (new_animation_result.sprite_sheet_col == BONGOCAT_FRAME_RIGHT_DOWN) { + new_animation_result.sprite_sheet_col = BONGOCAT_FRAME_LEFT_DOWN; + } else { + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? BONGOCAT_FRAME_LEFT_DOWN : BONGOCAT_FRAME_RIGHT_DOWN; + } + break; + case animation_state_row_t::StartMoving: + case animation_state_row_t::Moving: + case animation_state_row_t::EndMoving: + // toggle frame (unused) + if (new_animation_result.sprite_sheet_col == BONGOCAT_FRAME_BOTH_UP) { + new_animation_result.sprite_sheet_col = BONGOCAT_FRAME_BOTH_DOWN; + } else if (new_animation_result.sprite_sheet_col == BONGOCAT_FRAME_BOTH_UP) { + new_animation_result.sprite_sheet_col = BONGOCAT_FRAME_BOTH_DOWN; + } else { + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? BONGOCAT_FRAME_BOTH_UP : BONGOCAT_FRAME_BOTH_DOWN; + } + break; + } + return ret; + } + */ + + static anim_bongocat_process_animation_result_t anim_bongocat_start_or_process_animation(animation_context_t& ctx, + animation_state_row_t new_row_state, + animation_player_result_t& new_animation_result, + animation_state_t& new_state, + const animation_state_t& current_state, + const bongocat_sprite_sheet_t& current_frames, + const config::config_t& current_config) { + if (current_state.row_state != new_row_state) { + auto result = anim_bongocat_process_animation(new_animation_result, new_state, current_state, current_frames); + if (result.status == anim_bongocat_process_animation_result_status_t::Looped || result.status == anim_bongocat_process_animation_result_status_t::End) { + result = anim_bongocat_restart_animation(ctx, new_row_state, new_animation_result, new_state, current_state, current_frames, current_config); + result.status = anim_bongocat_process_animation_result_status_t::NextAnimationStarted; } - state.frame_delta_ms_counter = 0; + return result; } - return { .changed = changed, .new_frame = new_frame}; + return anim_bongocat_restart_animation(ctx, new_row_state, new_animation_result, new_state, + current_state, current_frames, current_config); } -#endif -#ifdef FEATURE_ENABLE_DM_EMBEDDED_ASSETS - static anim_next_frame_result_t anim_dm_idle_next_frame(animation_context_t& ctx, const platform::input::input_context_t& input, - [[maybe_unused]] const platform::update::update_context_t& upd, - animation_state_t& state, const anim_handle_key_press_result_t& trigger_result) { + static anim_next_frame_result_t anim_bongocat_idle_next_frame(animation_context_t& ctx, const platform::input::input_context_t& input, + animation_state_t& state, const anim_handle_key_press_result_t& trigger_result) { using namespace assets; - // read-only config assert(ctx._local_copy_config != nullptr); const config::config_t& current_config = *ctx._local_copy_config; assert(ctx.shm != nullptr); + assert(input.shm != nullptr); animation_shared_memory_t& anim_shm = *ctx.shm; const auto& input_shm = *input.shm; - //const auto& update_shm = *upd.shm; - auto& animation_player_data = anim_shm.animation_player_data; - const auto current_frame = animation_player_data.frame_index; - //const int current_row = animation_player_data.sprite_sheet_row; - //const animation_state_row_t current_row_state = state.row_state; - [[maybe_unused]] const auto anim_index = anim_shm.anim_index; + const auto current_state = state; + const auto& current_animation_result = anim_shm.animation_player_result; + [[maybe_unused]] const int anim_index = anim_shm.anim_index; const platform::timestamp_ms_t last_key_pressed_timestamp = input_shm.last_key_pressed_timestamp; + assert(anim_shm.anim_type == config::config_animation_sprite_sheet_layout_t::Bongocat); + assert(get_current_animation(ctx).type == animation_t::Type::Bongocat); + const auto& current_frames = get_current_animation(ctx).bongocat; - animation_state_row_t new_row_state = state.row_state; - int new_row = animation_player_data.sprite_sheet_row; - int new_start_frame_index = animation_player_data.start_frame_index; - int new_end_frame_index = animation_player_data.end_frame_index; - int new_frame = current_frame; + auto new_animation_result = anim_shm.animation_player_result; + auto new_state = state; - const bool any_key_pressed = has_flag(trigger_result.triggered_anim_cause, trigger_animation_cause_mask_t::KeyPress) && trigger_result.any_key_press_counter > 0; + const auto conditions = get_anim_conditions(ctx, input, current_state, trigger_result.trigger, current_config); - assert(SMALL_MAX_DISTANCE_PER_MOVEMENT_PART > 0); - assert(MAX_DISTANCE_PER_MOVEMENT_PART > 0); - const bool release_frame_after_press = (!any_key_pressed && !has_flag(trigger_result.triggered_anim_cause, trigger_animation_cause_mask_t::CpuUpdate)) && state.hold_frame_ms > current_config.keypress_duration_ms; - const bool release_frame_after_update = (!any_key_pressed && has_flag(trigger_result.triggered_anim_cause, trigger_animation_cause_mask_t::CpuUpdate)) && state.hold_frame_ms > current_config.keypress_duration_ms; - const bool process_idle_animation = (current_config.idle_animation && current_config.animation_speed_ms > 0 && state.frame_delta_ms_counter > current_config.animation_speed_ms) || (current_config.idle_animation && current_config.animation_speed_ms <= 0 && state.frame_delta_ms_counter > 1000/current_config.fps); - const bool process_movement = current_config.movement_speed > 0 && current_config.movement_radius > 0 && (state.frame_delta_ms_counter > current_config.movement_speed || state.frame_delta_ms_counter > 1000/current_config.fps); - const bool process_movement_animation = current_config.movement_speed > 0 && current_config.movement_radius > 0 && ((current_config.animation_speed_ms > 0 && state.frame_delta_ms_counter > current_config.animation_speed_ms) || (current_config.animation_speed_ms <= 0 && state.frame_delta_ms_counter > 1000/current_config.fps)); - const bool trigger_test_animation = current_config.test_animation_interval_sec > 0 && state.frame_delta_ms_counter > current_config.test_animation_interval_sec*1000; - const bool release_test_frame = current_config.test_animation_duration_ms > 0 && state.frame_delta_ms_counter > current_config.test_animation_duration_ms; - const bool check_for_idle_sleep = current_config.idle_sleep_timeout_sec > 0 && state.frame_delta_ms_counter > current_config.idle_sleep_timeout_sec*1000/2 && last_key_pressed_timestamp > 0; - - /// @TODO: extract set animation state - - const auto& current_frames = reinterpret_cast(get_current_animation(ctx)); - new_row = DM_SPRITE_SHEET_ROWS-1; - - const bool is_moving = state.row_state == animation_state_row_t::StartMoving || state.row_state == animation_state_row_t::Moving || state.row_state == animation_state_row_t::EndMoving || state.row_state == animation_state_row_t::StartMoving || state.row_state == animation_state_row_t::Moving || state.row_state == animation_state_row_t::EndMoving; - if (!is_moving) { - // Test Animation - if (!any_key_pressed && trigger_test_animation && state.row_state == animation_state_row_t::Idle) { - new_start_frame_index = DM_FRAME_IDLE1; - new_end_frame_index = DM_FRAME_IDLE2; - new_row_state = animation_state_row_t::Test; - // toggle frame - if (current_frame == DM_FRAME_IDLE2) { - new_frame = DM_FRAME_IDLE1; - } else if (current_frame == DM_FRAME_IDLE1) { - new_frame = DM_FRAME_IDLE2; - } else { - static_assert(DM_FRAME_IDLE2 >= DM_FRAME_IDLE1); - static_assert(DM_FRAME_IDLE1 >= 0); - static_assert(DM_FRAME_IDLE2 >= 0); - new_frame = static_cast(ctx._rng.range(DM_FRAME_IDLE1, DM_FRAME_IDLE2)); // Frame 0 or 1 (active frames) - } - } - // Idle Animation - if (release_frame_after_press || process_idle_animation || (trigger_test_animation && release_test_frame && state.row_state == animation_state_row_t::Test)) { - new_start_frame_index = DM_FRAME_IDLE1; - new_end_frame_index = DM_FRAME_IDLE2; - new_row_state = animation_state_row_t::Idle; - // toggle frame - if (current_frame == DM_FRAME_IDLE2) { - new_frame = DM_FRAME_IDLE1; - } else if (current_frame == DM_FRAME_IDLE1) { - new_frame = DM_FRAME_IDLE2; + // Idle Animation + const bool stop_writing = conditions.is_writing && conditions.release_frame_after_press; + const bool stop_test_animation = conditions.trigger_test_animation && current_state.row_state == animation_state_row_t::Test && conditions.release_test_frame; + if (stop_writing || stop_test_animation) { + // back to idle + anim_bongocat_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + + if constexpr (features::BongocatIdleAnimation) { + if (!stop_writing && !stop_test_animation && conditions.process_idle_animation) { + if (current_state.row_state == animation_state_row_t::Idle) { + // loop idle animation + anim_bongocat_process_animation(new_animation_result, new_state, current_state, current_frames); + } else if (current_state.row_state == animation_state_row_t::WakeUp) { + // process wake up animation + anim_bongocat_start_or_process_animation(ctx, animation_state_row_t::Idle, // back to idle, when animation ended + new_animation_result, new_state, + current_state, current_frames, current_config); } } - } - if (release_frame_after_update && state.row_state == animation_state_row_t::EndWorking) { - // recover from working animation - if (current_frame == DM_FRAME_ATTACK || current_frame == DM_FRAME_ANGRY) { - new_frame = DM_FRAME_IDLE1; - } else { - static_assert(DM_FRAME_IDLE2 >= DM_FRAME_IDLE1); - static_assert(DM_FRAME_IDLE1 >= 0); - static_assert(DM_FRAME_IDLE2 >= 0); - new_frame = static_cast(ctx._rng.range(DM_FRAME_IDLE1, DM_FRAME_IDLE2)); // Frame 0 or 1 (active frames) + } else { + if (current_state.row_state == animation_state_row_t::WakeUp && conditions.release_frame_for_non_idle) { + // back to idle + anim_bongocat_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); } - new_start_frame_index = DM_FRAME_IDLE1; - new_end_frame_index = DM_FRAME_IDLE2; - new_row_state = animation_state_row_t::Idle; } + // Start Test animation + if (!conditions.any_key_pressed && conditions.trigger_test_animation && current_state.row_state == animation_state_row_t::Idle) { + anim_bongocat_restart_animation(ctx, animation_state_row_t::Test, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (!conditions.any_key_pressed && conditions.trigger_test_animation && current_state.row_state == animation_state_row_t::Test) { + // loop test animation + anim_bongocat_process_animation(new_animation_result, new_state, current_state, current_frames); + } - // Move Animation - if ((process_idle_animation || process_movement || process_movement_animation) && current_config.movement_speed > 0 && current_config.movement_radius > 0 && current_config.fps > 0) { - const float delta = 1.0f / static_cast(current_config.fps); - const int32_t delta_ms = static_cast(delta * 1000); - const int frame_height = current_config.cat_height; - const int frame_width = static_cast(static_cast(frame_height) * (static_cast(current_frames.frame_width) / static_cast(current_frames.frame_height))); - const float fmovement_radius = static_cast(current_config.movement_radius); - - assert(current_config.movement_radius > 0); - float max_movement_offset_x_left = 0.0f; - float max_movement_offset_x_right = 0.0f; - float wall_distance = 0.0f; - switch (current_config.cat_align) { - case config::align_type_t::ALIGN_CENTER: - // range: [-r, +r] - max_movement_offset_x_left = -static_cast(current_config.movement_radius) + static_cast(frame_width) / 2.0f; - max_movement_offset_x_right = static_cast(current_config.movement_radius - frame_width); - wall_distance = anim_shm.movement_offset_x / fmovement_radius; - break; - case config::align_type_t::ALIGN_LEFT: - // range: [0, +2r] - max_movement_offset_x_left = 0.0f; - max_movement_offset_x_right = static_cast(current_config.movement_radius) * 2.0f - static_cast(frame_width); - wall_distance = (anim_shm.movement_offset_x / (fmovement_radius * 2.0f)) * 2.0f - 1.0f; - break; - case config::align_type_t::ALIGN_RIGHT: - // range: [-2r, 0] - max_movement_offset_x_left = -(static_cast(current_config.movement_radius) * 2.0f) + static_cast(frame_width); - max_movement_offset_x_right = 0.0f; - wall_distance = (anim_shm.movement_offset_x / (fmovement_radius * 2.0f)) * 2.0f + 1.0f; // normalize to -1 → 1 - break; - } + const bool is_sleeping_time = current_config.enable_scheduled_sleep && is_sleep_time(current_config); - if (state.row_state == animation_state_row_t::Idle && (state.anim_pause_after_movement_ms > 0 || (ctx._rng.range(0, 100) <= CHANCE_FOR_SKIPPING_MOVEMENT_PERCENT))) { - // skip movement - anim_shm.anim_direction = 0.0; - state.anim_velocity = 0.0f; - state.anim_distance = 0.0f; - if (state.anim_pause_after_movement_ms > 0) { - state.anim_pause_after_movement_ms -= delta_ms; - if (state.anim_pause_after_movement_ms <= 0) { - state.anim_pause_after_movement_ms = 0; - } - } - } else { - constexpr float DIR_EPSILON = 1e-3f; - assert(MAX_DISTANCE_PER_MOVEMENT_PART > 0); - const int movement_part = current_config.movement_radius <= MAX_MOVEMENT_RADIUS_SMALL ? SMALL_MAX_DISTANCE_PER_MOVEMENT_PART : MAX_DISTANCE_PER_MOVEMENT_PART; - const float fmovement_part = static_cast(movement_part); - if (state.row_state == animation_state_row_t::Idle) { - if (process_movement_animation) { - if (current_frames.movement_1.valid || current_frames.movement_2.valid) { - if (current_frames.movement_1.valid && current_frames.movement_2.valid) { - new_start_frame_index = DM_FRAME_MOVEMENT1; - new_end_frame_index = DM_FRAME_MOVEMENT2; - } else if (current_frames.movement_1.valid) { - new_start_frame_index = DM_FRAME_MOVEMENT1; - new_end_frame_index = DM_FRAME_MOVEMENT1; - } else if (current_frames.movement_2.valid) { - new_start_frame_index = DM_FRAME_MOVEMENT2; - new_end_frame_index = DM_FRAME_MOVEMENT2; - } - } else { - new_start_frame_index = DM_FRAME_IDLE1; - new_end_frame_index = DM_FRAME_IDLE2; + // Idle Sleep + if (conditions.check_for_idle_sleep) { + if (!is_sleeping_time) { + const platform::timestamp_ms_t now = platform::get_current_time_ms(); + const platform::time_ms_t idle_sleep_timeout_ms = current_config.idle_sleep_timeout_sec*1000; + assert(now >= last_key_pressed_timestamp); + const auto sleep_timeout = now - last_key_pressed_timestamp; + + if constexpr (features::BongocatBoringAnimation) { + const bool start_boring = SLEEP_BORING_PART > 0 && sleep_timeout >= idle_sleep_timeout_ms/SLEEP_BORING_PART; + if (current_state.row_state == animation_state_row_t::Idle) { + // start boring animation + if (start_boring && !current_state.show_boring_animation_once) { + anim_bongocat_restart_animation(ctx, animation_state_row_t::Boring, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.show_boring_animation_once = true; } - } - - const auto min_movement = current_config.movement_radius <= MAX_MOVEMENT_RADIUS_SMALL ? (fmovement_radius / fmovement_part / 2) + 1 : (fmovement_radius / fmovement_part / fmovement_part) + 1; - float max_move_distance = fmovement_radius / fmovement_part; - max_move_distance = max_move_distance <= min_movement ? min_movement : max_move_distance; - - assert(max_move_distance >= 0); - assert(min_movement >= 0); - state.anim_distance = static_cast(ctx._rng.range(static_cast(min_movement), static_cast(max_move_distance))); - - if (anim_shm.movement_offset_x >= max_movement_offset_x_right) { - // run against wall, change direction - anim_shm.anim_direction = -1.0; - anim_shm.movement_offset_x = max_movement_offset_x_right; - } else if (anim_shm.movement_offset_x <= max_movement_offset_x_left) { - // run against wall, change direction - anim_shm.anim_direction = 1.0; - anim_shm.movement_offset_x = max_movement_offset_x_left; - } else { - float toward_wall_bias = fabs(wall_distance); - toward_wall_bias = toward_wall_bias >= 1.0f ? 1.0f : toward_wall_bias; - toward_wall_bias = toward_wall_bias <= 0.0f ? 0.0f : toward_wall_bias; - - const int flip_direction_chance = current_config.movement_radius <= MAX_MOVEMENT_RADIUS_SMALL ? SMALL_FLIP_DIRECTION_NEAR_WALL_PERCENT : FLIP_DIRECTION_NEAR_WALL_PERCENT; - - assert(toward_wall_bias >= 0.0f); - // change direction: chance drops at center, changes falloff steeper near walls - const uint32_t dir_chance = static_cast(static_cast(100 - flip_direction_chance + 10) * (1.0f - pow(toward_wall_bias, 1.5f))); - - if (fabs(state.anim_last_direction) >= DIR_EPSILON) { - anim_shm.anim_direction = (ctx._rng.range(0, 100) < dir_chance) ? -state.anim_last_direction : state.anim_last_direction; - } else if (fabs(anim_shm.anim_direction) < DIR_EPSILON) { - // idle: choose random start direction - anim_shm.anim_direction = (ctx._rng.range(0, 100) < dir_chance) ? 1.0f : -1.0f; + } else if (current_state.row_state == animation_state_row_t::Boring) { + if constexpr (features::BongocatIdleAnimation) { + if (conditions.process_idle_animation) { + const auto animation_result = anim_bongocat_start_or_process_animation(ctx, animation_state_row_t::Idle, // back to idle, when animation ended + new_animation_result, new_state, + current_state, current_frames, current_config); + if (!start_boring && animation_result.row_state == animation_state_row_t::Idle) { + new_state.show_boring_animation_once = false; + } + } } else { - if (wall_distance > (100.0f / static_cast(flip_direction_chance))) { - anim_shm.anim_direction = (ctx._rng.range(0, 100) < dir_chance) ? -1.0f : 1.0f; - } else if (wall_distance < -(100.0f / static_cast(flip_direction_chance))) { - anim_shm.anim_direction = (ctx._rng.range(0, 100) < dir_chance) ? 1.0f : -1.0f; - } else { - anim_shm.anim_direction = (ctx._rng.range(0, 100) < dir_chance) ? anim_shm.anim_direction : -anim_shm.anim_direction; + if (!start_boring || (start_boring && current_state.show_boring_animation_once)) { + if (conditions.release_frame_for_non_idle) { + // back to idle + anim_bongocat_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + if (!start_boring) { + new_state.show_boring_animation_once = false; + } + } } } } - state.anim_velocity = anim_shm.anim_direction * static_cast(current_config.movement_speed); - new_row_state = animation_state_row_t::StartMoving; - } else if (state.row_state == animation_state_row_t::StartMoving) { - if (process_movement_animation) { - // start move animation - if (current_frames.movement_1.valid) { - new_start_frame_index = DM_FRAME_MOVEMENT1; - new_end_frame_index = current_frames.movement_2.valid ? DM_FRAME_MOVEMENT2 : DM_FRAME_MOVEMENT1; - new_frame = DM_FRAME_MOVEMENT1; - } else { - new_start_frame_index = DM_FRAME_IDLE1; - new_end_frame_index = DM_FRAME_IDLE2; - // toggle frame - if (current_frame == DM_FRAME_IDLE2) { - new_frame = DM_FRAME_IDLE1; - } else if (current_frame == DM_FRAME_IDLE1) { - new_frame = DM_FRAME_IDLE2; + } + + // idle sleep + if (sleep_timeout >= idle_sleep_timeout_ms) { + if (current_state.row_state == animation_state_row_t::Idle) { + anim_bongocat_restart_animation(ctx, animation_state_row_t::Sleep, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.is_idle_sleep = true; + new_state.show_boring_animation_once = false; + } else if (current_state.is_idle_sleep) { + if constexpr (features::BongocatIdleAnimation) { + if (current_state.row_state == animation_state_row_t::Sleep) { + if (conditions.process_idle_animation) { + // loop sleep animation + anim_bongocat_process_animation(new_animation_result, new_state, current_state, current_frames); + } } } } - new_row_state = animation_state_row_t::Moving; - } else if (state.row_state == animation_state_row_t::Moving) { - if (process_movement_animation) { - if (current_frames.movement_1.valid) { - new_start_frame_index = DM_FRAME_MOVEMENT1; - new_end_frame_index = current_frames.movement_2.valid ? DM_FRAME_MOVEMENT2 : DM_FRAME_MOVEMENT1; - // toggle frame - if (current_frame == DM_FRAME_MOVEMENT1) { - new_frame = current_frames.movement_2.valid ? DM_FRAME_MOVEMENT2 : DM_FRAME_IDLE1; - } else { - new_frame = current_frames.movement_1.valid ? DM_FRAME_MOVEMENT1 : DM_FRAME_IDLE2; - } - } else { - new_start_frame_index = DM_FRAME_IDLE1; - new_end_frame_index = DM_FRAME_IDLE2; - // toggle frame - if (current_frame == DM_FRAME_IDLE2) { - new_frame = DM_FRAME_IDLE1; - } else if (current_frame == DM_FRAME_IDLE1) { - new_frame = DM_FRAME_IDLE2; + } else if (current_state.row_state == animation_state_row_t::Sleep && current_state.is_idle_sleep) { + if constexpr (features::BongocatIdleAnimation) { + if (conditions.process_idle_animation) { + const auto animation_result = anim_bongocat_start_or_process_animation(ctx, animation_state_row_t::Idle, // back to idle, when animation ended + new_animation_result, new_state, + current_state, current_frames, current_config); + if (animation_result.row_state == animation_state_row_t::Idle) { + new_state.is_idle_sleep = false; } } - - state.anim_distance -= fabs(state.anim_velocity); - anim_shm.movement_offset_x += state.anim_velocity; - // clamp walking/movement area - if (anim_shm.movement_offset_x > max_movement_offset_x_right) { - anim_shm.movement_offset_x = max_movement_offset_x_right; - new_row_state = animation_state_row_t::EndMoving; - } else if (anim_shm.movement_offset_x < max_movement_offset_x_left) { - anim_shm.movement_offset_x = max_movement_offset_x_left; - new_row_state = animation_state_row_t::EndMoving; + } else { + if (conditions.release_frame_for_non_idle) { + // back to idle + anim_bongocat_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.is_idle_sleep = false; } } - if (fabs(state.anim_distance) < DIR_EPSILON || fabs(state.anim_velocity) < DIR_EPSILON) { - new_row_state = animation_state_row_t::EndMoving; - } - } else if (state.row_state == animation_state_row_t::EndMoving) { - new_start_frame_index = DM_FRAME_IDLE1; - new_end_frame_index = DM_FRAME_IDLE2; - new_frame = DM_FRAME_IDLE1; - new_row_state = animation_state_row_t::Idle; - state.anim_last_direction = anim_shm.anim_direction; - state.anim_velocity = 0.0f; - state.anim_pause_after_movement_ms = current_config.animation_speed_ms * movement_part / 2; } } - } else if (release_frame_after_press) { - // movement got disabled, back to idle - if (state.row_state == animation_state_row_t::StartMoving || state.row_state == animation_state_row_t::Moving || state.row_state == animation_state_row_t::EndMoving) { - new_start_frame_index = DM_FRAME_IDLE1; - new_end_frame_index = DM_FRAME_IDLE2; - new_frame = DM_FRAME_IDLE1; - new_row_state = animation_state_row_t::Idle; - state.anim_velocity = 0.0f; - } - } - - // Sleep animation - if (current_config.enable_scheduled_sleep && is_sleep_time(current_config) && state.row_state != animation_state_row_t::Idle) { - if (current_frames.sleep_2.valid) { - new_start_frame_index = DM_FRAME_SLEEP2; - new_end_frame_index = DM_FRAME_SLEEP2; - new_frame = DM_FRAME_SLEEP1; - new_row_state = animation_state_row_t::Sleep; - } else if (current_frames.sleep1.valid) { - new_start_frame_index = DM_FRAME_SLEEP1; - new_end_frame_index = DM_FRAME_SLEEP1; - new_frame = DM_FRAME_SLEEP1; - new_row_state = animation_state_row_t::Sleep; - } else if (current_frames.down1.valid) { - BONGOCAT_LOG_VERBOSE("No Sleeping Frame for %d", anim_index); - // fallback frame - new_start_frame_index = DM_FRAME_DOWN1; - new_end_frame_index = DM_FRAME_DOWN1; - new_frame = DM_FRAME_DOWN1; - new_row_state = animation_state_row_t::Sleep; - } - state.anim_last_direction = 0.0f; - } - // Idle Sleep - if (check_for_idle_sleep) { - const platform::timestamp_ms_t now = platform::get_current_time_ms(); - const platform::time_ms_t idle_sleep_timeout_ms = current_config.idle_sleep_timeout_sec*1000; - // boring - if (!state.boring_frame_showed && now - last_key_pressed_timestamp >= idle_sleep_timeout_ms/2) { - if (current_frames.sad.valid) { - new_start_frame_index = DM_FRAME_SAD; - new_end_frame_index = DM_FRAME_SAD; - new_frame = DM_FRAME_SAD; - new_row_state = animation_state_row_t::Boring; - } else if (current_frames.down1.valid) { - BONGOCAT_LOG_VERBOSE("No Boring Frame for %d", anim_index); - // fallback frame - new_start_frame_index = DM_FRAME_DOWN1; - new_end_frame_index = DM_FRAME_DOWN1; - new_frame = DM_FRAME_DOWN1; - new_row_state = animation_state_row_t::Boring; - } - state.anim_last_direction = 0.0f; - } - // sleep - if (now - last_key_pressed_timestamp >= idle_sleep_timeout_ms) { - // start sleeping - if (current_frames.sleep1.valid) { - new_start_frame_index = DM_FRAME_SLEEP1; - new_end_frame_index = DM_FRAME_SLEEP1; - new_frame = DM_FRAME_SLEEP1; - new_row_state = animation_state_row_t::Sleep; - } else if (current_frames.down1.valid) { - BONGOCAT_LOG_VERBOSE("No Sleeping Frame for %d", anim_index); - // fallback frame - new_start_frame_index = DM_FRAME_DOWN1; - new_end_frame_index = DM_FRAME_DOWN1; - new_frame = DM_FRAME_DOWN1; - new_row_state = animation_state_row_t::Sleep; - } - state.anim_last_direction = 0.0f; - } } - const bool changed = animation_player_data.frame_index != new_frame || animation_player_data.sprite_sheet_row != new_row || state.row_state != new_row_state; - if (changed) { - animation_player_data.frame_index = new_frame; - animation_player_data.sprite_sheet_row = new_row; - animation_player_data.start_frame_index = new_start_frame_index; - animation_player_data.end_frame_index = new_end_frame_index; - state.row_state = new_row_state; - if (new_row_state == animation_state_row_t::Boring) { - state.boring_frame_showed = true; - } else if (state.boring_frame_showed && new_row_state == animation_state_row_t::Writing) { - // reset boring frame state - state.boring_frame_showed = false; + // Sleep Mode + if (current_config.enable_scheduled_sleep) { + if (is_sleeping_time) { + if (current_state.row_state == animation_state_row_t::Idle) { + anim_bongocat_restart_animation(ctx, animation_state_row_t::Sleep, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.is_idle_sleep = false; + } else { + if constexpr (features::BongocatIdleAnimation) { + if (current_state.row_state == animation_state_row_t::Sleep && conditions.process_idle_animation) { + // loop sleep animation + anim_bongocat_process_animation(new_animation_result, new_state, current_state, current_frames); + } + } + } + } else { + if (current_state.row_state == animation_state_row_t::Sleep && !current_state.is_idle_sleep) { + if (conditions.release_frame_for_non_idle) { + // back to idle + anim_bongocat_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + } } - if (current_config.enable_debug) { - BONGOCAT_LOG_VERBOSE("Animation frame change: %d", new_frame); + } else { + if (current_state.row_state == animation_state_row_t::Sleep && !current_state.is_idle_sleep) { + if (conditions.release_frame_for_non_idle) { + // back to idle + anim_bongocat_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } } - state.frame_delta_ms_counter = 0; } - return { .changed = changed, .new_frame = new_frame}; + return anim_update_animation_state(anim_shm, state, + new_animation_result, new_state, + current_animation_result, current_state, + current_config); } -#endif -#ifdef FEATURE_MS_AGENT_EMBEDDED_ASSETS - static anim_next_frame_result_t anim_ms_pet_idle_next_frame(animation_context_t& ctx, const platform::input::input_context_t& input, - animation_state_t& state, const anim_handle_key_press_result_t& trigger_result) { + static anim_next_frame_result_t anim_bongocat_key_pressed_next_frame(animation_context_t& ctx, animation_state_t& state, + const platform::input::input_context_t& input, + const animation_trigger_t& trigger) { using namespace assets; // read-only config assert(ctx._local_copy_config != nullptr); const config::config_t& current_config = *ctx._local_copy_config; - assert(input.shm != nullptr); assert(ctx.shm != nullptr); + assert(input.shm != nullptr); animation_shared_memory_t& anim_shm = *ctx.shm; - const auto& input_shm = *input.shm; - auto& animation_player_data = anim_shm.animation_player_data; - const auto current_frame = animation_player_data.frame_index; - //const int current_row = animation_player_data.sprite_sheet_row; - //const animation_state_row_t current_row_state = state.row_state; - //const int anim_index = anim_shm.anim_index; - const platform::timestamp_ms_t last_key_pressed_timestamp = input_shm.last_key_pressed_timestamp; + //const auto& input_shm = *input.shm; + const auto current_state = state; + const auto& current_animation_result = anim_shm.animation_player_result; + [[maybe_unused]] const int anim_index = anim_shm.anim_index; + //const platform::timestamp_ms_t last_key_pressed_timestamp = input_shm.last_key_pressed_timestamp; + assert(get_current_animation(ctx).type == animation_t::Type::Bongocat); + const auto& current_frames = get_current_animation(ctx).bongocat; - animation_state_row_t new_row_state = state.row_state; - auto new_row = animation_player_data.sprite_sheet_row; - auto new_start_frame_index = animation_player_data.start_frame_index; - auto new_end_frame_index = animation_player_data.end_frame_index; - auto new_frame = current_frame; + auto new_animation_result = anim_shm.animation_player_result; + auto new_state = state; - const bool any_key_pressed = has_flag(trigger_result.triggered_anim_cause, trigger_animation_cause_mask_t::KeyPress) && trigger_result.any_key_press_counter > 0; + const auto conditions = get_anim_conditions(ctx, input, current_state, trigger, current_config); - const bool go_next_frame = (current_config.animation_speed_ms > 0 && state.frame_delta_ms_counter > current_config.animation_speed_ms) || (current_config.animation_speed_ms <= 0 && state.frame_delta_ms_counter > 1000/current_config.fps); - const bool release_frame_after_press = (!any_key_pressed && !has_flag(trigger_result.triggered_anim_cause, trigger_animation_cause_mask_t::CpuUpdate)) && state.hold_frame_ms > current_config.keypress_duration_ms; - const bool process_idle_animation = (current_config.idle_animation && current_config.animation_speed_ms > 0 && state.frame_delta_ms_counter > current_config.animation_speed_ms) || (current_config.idle_animation && current_config.animation_speed_ms <= 0 && state.frame_delta_ms_counter > 1000/current_config.fps); - //const bool trigger_test_animation = current_config.test_animation_interval_sec > 0 && state.frame_delta_ms_counter > current_config.test_animation_interval_sec*1000; - //const bool release_test_frame = current_config.test_animation_duration_ms > 0 && state.frame_delta_ms_counter > current_config.test_animation_duration_ms; - const bool check_for_idle_sleep = current_config.idle_sleep_timeout_sec > 0 && state.frame_delta_ms_counter > current_config.idle_sleep_timeout_sec*1000/2; + /// @TODO: use state machine for animation (states) - // only show next frame by animation speed or when any key was pressed (writing animation) - if (state.frame_delta_ms_counter <= current_config.animation_speed_ms && !any_key_pressed && !check_for_idle_sleep && !current_config.enable_scheduled_sleep) { - return { .changed = false, .new_frame = new_frame}; + // in Writing mode/start writing + if (!conditions.is_writing) { + if (state.row_state == animation_state_row_t::Sleep && current_state.is_idle_sleep) { + // wake up + anim_bongocat_restart_animation(ctx, animation_state_row_t::WakeUp, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (state.row_state == animation_state_row_t::Idle || conditions.is_moving) { + // start writing + anim_bongocat_restart_animation(ctx, animation_state_row_t::StartWriting, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + } else if (state.row_state == animation_state_row_t::StartWriting) { + anim_bongocat_start_or_process_animation(ctx, animation_state_row_t::Writing, + new_animation_result, new_state, + current_state, current_frames, current_config); } - /// @TODO: extract state change and player_data update - - assert(anim_shm.anim_index >= 0); - const ms_agent_animation_indices_t animation_indices = get_ms_agent_animation_indices(static_cast(anim_shm.anim_index)); - - switch (state.row_state) { - case animation_state_row_t::Test: + if constexpr (features::BongocatIdleAnimation) { + if (conditions.is_writing && conditions.process_idle_animation) { + if (conditions.release_frame_after_press && current_state.row_state == animation_state_row_t::Writing) { + anim_bongocat_start_or_process_animation(ctx, animation_state_row_t::EndWriting, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (conditions.release_frame_after_press && (current_state.row_state == animation_state_row_t::EndWriting || current_state.row_state == animation_state_row_t::WakeUp)) { + anim_bongocat_start_or_process_animation(ctx, animation_state_row_t::Idle, // back to idle + new_animation_result, new_state, + current_state, current_frames, current_config); + } + } + } else { + if (conditions.is_writing) { + if (conditions.continue_writing) { + // keep writing + anim_bongocat_process_animation(new_animation_result, new_state, current_state, current_frames); + } + } else if (((!conditions.is_writing && state.row_state == animation_state_row_t::Idle) || state.row_state == animation_state_row_t::WakeUp) && conditions.release_frame_after_press) { + // back to idle + anim_bongocat_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + } + + return anim_update_animation_state(anim_shm, state, + new_animation_result, new_state, + current_animation_result, current_state, + current_config); + } +#endif + +#ifdef FEATURE_ENABLE_DM_EMBEDDED_ASSETS + enum class anim_dm_process_animation_result_status_t : uint8_t { None, Started, Updated, End, Looped, NextAnimationStarted, SkipMovement, Moved, Stop }; + struct anim_dm_process_animation_result_t { + animation_state_row_t row_state; + anim_dm_process_animation_result_status_t status{anim_dm_process_animation_result_status_t::None}; + }; + static anim_dm_process_animation_result_t anim_dm_process_animation(animation_player_result_t& new_animation_result, + animation_state_t& new_state, + const animation_state_t& current_state, + const dm_sprite_sheet_t& current_frames) { + assert(MAX_ANIMATION_FRAMES > 0); + assert(MAX_ANIMATION_FRAMES <= INT_MAX); + + anim_dm_process_animation_result_t ret {.row_state = new_state.row_state, .status = anim_dm_process_animation_result_status_t::Updated}; + // forward animation + new_state.animations_index = current_state.animations_index + 1; + if (new_state.animations_index > static_cast(MAX_ANIMATION_FRAMES-1)) { + ret.status = anim_dm_process_animation_result_status_t::Looped; + new_state.animations_index = 0; + } + /* + // backwards animation + else if (new_state.animations_index < 0) { + ret = anim_bongocat_process_animation_result_t::End; + new_state.animations_index = MAX_ANIMATION_FRAMES-1; + } + */ + switch (new_state.row_state) { + case animation_state_row_t::Idle: + new_animation_result.sprite_sheet_col = current_frames.animations.idle[new_state.animations_index]; + break; + case animation_state_row_t::StartWriting: + case animation_state_row_t::Writing: + case animation_state_row_t::EndWriting: + new_animation_result.sprite_sheet_col = current_frames.animations.writing[new_state.animations_index]; + break; case animation_state_row_t::Happy: + new_animation_result.sprite_sheet_col = current_frames.animations.happy[new_state.animations_index]; + break; + case animation_state_row_t::Sleep: + new_animation_result.sprite_sheet_col = current_frames.animations.sleep[new_state.animations_index]; + break; + case animation_state_row_t::WakeUp: + new_animation_result.sprite_sheet_col = current_frames.animations.wake_up[new_state.animations_index]; + break; + case animation_state_row_t::Boring: + new_animation_result.sprite_sheet_col = current_frames.animations.boring[new_state.animations_index]; + break; + case animation_state_row_t::Test: + new_animation_result.sprite_sheet_col = current_frames.animations.writing[new_state.animations_index]; + break; + case animation_state_row_t::StartWorking: + case animation_state_row_t::Working: + case animation_state_row_t::EndWorking: + new_animation_result.sprite_sheet_col = current_frames.animations.working[new_state.animations_index]; + break; case animation_state_row_t::StartMoving: case animation_state_row_t::Moving: case animation_state_row_t::EndMoving: - // not supported, same as idle + new_animation_result.sprite_sheet_col = current_frames.animations.moving[new_state.animations_index]; + break; + } + return ret; + } + static anim_dm_process_animation_result_t anim_dm_restart_animation([[maybe_unused]] animation_context_t& ctx, + animation_state_row_t new_row_state, + animation_player_result_t& new_animation_result, + animation_state_t& new_state, + [[maybe_unused]] const animation_state_t& current_state, + const dm_sprite_sheet_t& current_frames, + const config::config_t& current_config) { + using namespace assets; + assert(MAX_ANIMATION_FRAMES > 0); + assert(MAX_ANIMATION_FRAMES <= INT_MAX); + + new_state.row_state = new_row_state; + new_animation_result.sprite_sheet_row = DM_SPRITE_SHEET_ROW; + new_state.animations_index = 0; + + anim_dm_process_animation_result_t ret {.row_state = new_state.row_state, .status = anim_dm_process_animation_result_status_t::Started}; + switch (new_state.row_state) { + case animation_state_row_t::Idle: + new_animation_result.sprite_sheet_col = current_frames.animations.idle[new_state.animations_index]; + if (current_config.idle_frame) { + new_animation_result.sprite_sheet_col = current_config.idle_frame; + } + break; + case animation_state_row_t::StartWriting: + case animation_state_row_t::Writing: + case animation_state_row_t::EndWriting: + new_animation_result.sprite_sheet_col = current_frames.animations.writing[new_state.animations_index]; + break; + case animation_state_row_t::Happy: + new_animation_result.sprite_sheet_col = current_frames.animations.happy[new_state.animations_index]; + break; + case animation_state_row_t::Sleep: + new_animation_result.sprite_sheet_col = current_frames.animations.sleep[new_state.animations_index]; + break; + case animation_state_row_t::WakeUp: + new_animation_result.sprite_sheet_col = current_frames.animations.wake_up[new_state.animations_index]; + break; + case animation_state_row_t::Boring: + new_animation_result.sprite_sheet_col = current_frames.animations.boring[new_state.animations_index]; + break; + case animation_state_row_t::Test: + new_animation_result.sprite_sheet_col = current_frames.animations.writing[new_state.animations_index]; break; case animation_state_row_t::StartWorking: case animation_state_row_t::Working: case animation_state_row_t::EndWorking: - // @TODO: add working (CPU state) animation + new_animation_result.sprite_sheet_col = current_frames.animations.working[new_state.animations_index]; break; - case animation_state_row_t::Idle: { - new_start_frame_index = animation_indices.start_index_frame_idle; - new_end_frame_index = animation_indices.end_index_frame_idle; - new_row = MS_AGENT_SPRITE_SHEET_ROW_IDLE; - new_row_state = animation_state_row_t::Idle; - if (current_config.idle_animation && process_idle_animation) { - // loop idle animation - new_frame = current_frame + 1; - if (new_frame > animation_player_data.end_frame_index) new_frame = animation_player_data.start_frame_index; - //if (new_frame < animation_player_data.start_frame_index) new_frame = animation_player_data.end_frame_index; - } else if (!current_config.idle_animation) { - new_frame = current_config.idle_animation; - } - // is not sleeping, yet - if (state.row_state != animation_state_row_t::Sleep) { - // Sleep Mode - if (current_config.enable_scheduled_sleep) { - if (is_sleep_time(current_config)) { - // start sleeping - new_frame = 0; - new_start_frame_index = animation_indices.start_index_frame_sleep; - new_end_frame_index = animation_indices.end_index_frame_sleep; - new_row = MS_AGENT_SPRITE_SHEET_ROW_SLEEP; - new_row_state = animation_state_row_t::Sleep; - } - } - // Idle Sleep - if (current_config.idle_sleep_timeout_sec > 0 && last_key_pressed_timestamp > 0) { - const platform::timestamp_ms_t now = platform::get_current_time_ms(); - const platform::time_ms_t idle_sleep_timeout_ms = current_config.idle_sleep_timeout_sec*1000; - // boring - if (!state.boring_frame_showed && now - last_key_pressed_timestamp >= idle_sleep_timeout_ms/2) { - // start boring animation - new_frame = 0; - new_start_frame_index = animation_indices.start_index_frame_boring; - new_end_frame_index = animation_indices.end_index_frame_boring; - new_row = MS_AGENT_SPRITE_SHEET_ROW_BORING; - new_row_state = animation_state_row_t::Boring; - } - // sleeping - if (now - last_key_pressed_timestamp >= idle_sleep_timeout_ms) { - // start sleeping - new_frame = 0; - new_start_frame_index = animation_indices.start_index_frame_sleep; - new_end_frame_index = animation_indices.end_index_frame_sleep; - new_row = MS_AGENT_SPRITE_SHEET_ROW_SLEEP; - new_row_state = animation_state_row_t::Sleep; - } - } - } - }break; - case animation_state_row_t::Writing: { - // keep writing - new_start_frame_index = animation_indices.start_index_frame_writing; - new_end_frame_index = animation_indices.end_index_frame_writing; - new_row = MS_AGENT_SPRITE_SHEET_ROW_WRITING; - new_row_state = animation_state_row_t::Writing; - if (any_key_pressed || go_next_frame) { - // loop writing animation - new_frame = current_frame + 1; - if (new_frame > animation_player_data.end_frame_index) new_frame = animation_player_data.start_frame_index; - //if (new_frame < animation_player_data.start_frame_index) new_frame = animation_player_data.end_frame_index; - } - // still in writing process ? - if (state.hold_frame_after_release && any_key_pressed) { - state.hold_frame_after_release = false; - state.hold_frame_ms = 0; - } - // cancel writing - if (release_frame_after_press) { - // start, end writing animation - new_frame = 0; - new_start_frame_index = animation_indices.start_index_frame_end_writing; - new_end_frame_index = animation_indices.end_index_frame_end_writing; - new_row = MS_AGENT_SPRITE_SHEET_ROW_END_WRITING; - new_row_state = animation_state_row_t::EndWriting; + case animation_state_row_t::StartMoving: + case animation_state_row_t::Moving: + case animation_state_row_t::EndMoving: + new_animation_result.sprite_sheet_col = current_frames.animations.moving[new_state.animations_index]; + break; + } + return ret; + } + static anim_dm_process_animation_result_t anim_dm_show_single_frame([[maybe_unused]] animation_context_t& ctx, + animation_state_row_t new_row_state, + animation_player_result_t& new_animation_result, + animation_state_t& new_state, + [[maybe_unused]] const animation_state_t& current_state, + [[maybe_unused]] const dm_sprite_sheet_t& current_frames, + const config::config_t& current_config) { + using namespace assets; + assert(MAX_ANIMATION_FRAMES > 0); + assert(MAX_ANIMATION_FRAMES <= INT_MAX); + + new_state.row_state = new_row_state; + new_animation_result.sprite_sheet_row = DM_SPRITE_SHEET_ROW; + new_state.animations_index = 0; + + anim_dm_process_animation_result_t ret {.row_state = new_state.row_state, .status = anim_dm_process_animation_result_status_t::Started}; + switch (new_state.row_state) { + case animation_state_row_t::Idle: + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE1; + if (current_config.idle_frame) { + new_animation_result.sprite_sheet_col = current_config.idle_frame; } - }break; + break; case animation_state_row_t::StartWriting: - // end current animation - new_start_frame_index = animation_indices.start_index_frame_start_writing; - new_end_frame_index = animation_indices.end_index_frame_start_writing; - new_row = MS_AGENT_SPRITE_SHEET_ROW_START_WRITING; - new_row_state = animation_state_row_t::StartWriting; - if (go_next_frame) { - new_frame = current_frame + 1; - } - if (new_frame > new_end_frame_index) { - // start writing animation - new_start_frame_index = animation_indices.start_index_frame_writing; - new_end_frame_index = animation_indices.end_index_frame_writing; - new_frame = new_start_frame_index; - new_row = MS_AGENT_SPRITE_SHEET_ROW_WRITING; - new_row_state = animation_state_row_t::Writing; - // reset release counter after writing is started (for real) - state.hold_frame_after_release = true; - state.hold_frame_ms = 0; + case animation_state_row_t::Writing: + case animation_state_row_t::EndWriting: + // toggle frame + if (new_animation_result.sprite_sheet_col == DM_FRAME_IDLE1) { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE2; + } else if (new_animation_result.sprite_sheet_col == DM_FRAME_IDLE2) { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE1; + } else { + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? DM_FRAME_IDLE1 : DM_FRAME_IDLE2; } break; - case animation_state_row_t::EndWriting: - // end current animation - new_start_frame_index = animation_indices.start_index_frame_end_writing; - new_end_frame_index = animation_indices.end_index_frame_end_writing; - new_row = MS_AGENT_SPRITE_SHEET_ROW_END_WRITING; - new_row_state = animation_state_row_t::EndWriting; - if (go_next_frame) { - new_frame = current_frame + 1; - } - if (new_frame > new_end_frame_index) { - new_start_frame_index = animation_indices.start_index_frame_idle; - new_end_frame_index = animation_indices.end_index_frame_idle; - // back to idle - if (current_config.idle_animation) { - new_frame = new_start_frame_index; + case animation_state_row_t::Happy: + if (current_frames.frames.happy.valid) { + new_animation_result.sprite_sheet_col = current_frames.frames.happy.col; + } else { + // toggle frame + if (new_animation_result.sprite_sheet_col == DM_FRAME_IDLE1) { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE2; + } else if (new_animation_result.sprite_sheet_col == DM_FRAME_IDLE2) { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE1; } else { - new_frame = current_config.idle_frame; + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? DM_FRAME_IDLE1 : DM_FRAME_IDLE2; } - new_row = MS_AGENT_SPRITE_SHEET_ROW_IDLE; - new_row_state = animation_state_row_t::Idle; } break; case animation_state_row_t::Sleep: - new_start_frame_index = animation_indices.start_index_frame_sleep; - new_end_frame_index = animation_indices.end_index_frame_sleep; - new_row = MS_AGENT_SPRITE_SHEET_ROW_SLEEP; - new_row_state = animation_state_row_t::Sleep; - // continue (start) sleeping, stop at last frame - if (go_next_frame) { - if (new_frame < new_end_frame_index) { - new_frame = current_frame + 1; + if (current_frames.frames.sleep_1.valid) { + new_animation_result.sprite_sheet_col = current_frames.frames.sleep_1.col; + } else if (current_frames.frames.down_1.valid) { + new_animation_result.sprite_sheet_col = current_frames.frames.down_1.col; + } else { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE1; + } + break; + case animation_state_row_t::WakeUp: + if (current_frames.frames.happy.valid) { + new_animation_result.sprite_sheet_col = current_frames.frames.sleep_1.col; + } else { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE2; + } + break; + case animation_state_row_t::Boring: + if (current_frames.frames.sad.valid) { + new_animation_result.sprite_sheet_col = current_frames.frames.sad.col; + } else if (current_frames.frames.angry.valid) { + new_animation_result.sprite_sheet_col = current_frames.frames.angry.col; + } else if (current_frames.frames.down_1.valid) { + new_animation_result.sprite_sheet_col = current_frames.frames.down_1.col; + } else { + // toggle frame + if (new_animation_result.sprite_sheet_col == DM_FRAME_IDLE1) { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE2; + } else if (new_animation_result.sprite_sheet_col == DM_FRAME_IDLE2) { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE1; } else { - new_frame = new_end_frame_index; + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? DM_FRAME_IDLE1 : DM_FRAME_IDLE2; } } break; - case animation_state_row_t::WakeUp: - new_start_frame_index = animation_indices.start_index_frame_wake_up; - new_end_frame_index = animation_indices.end_index_frame_wake_up; - new_row = MS_AGENT_SPRITE_SHEET_ROW_WAKE_UP; - new_row_state = animation_state_row_t::WakeUp; - if (go_next_frame) { - new_frame = current_frame + 1; - } - if (new_frame > new_end_frame_index) { - // back to idle - new_start_frame_index = animation_indices.start_index_frame_idle; - new_end_frame_index = animation_indices.end_index_frame_idle; - if (current_config.idle_animation) { - new_frame = new_start_frame_index; + case animation_state_row_t::Test: + // toggle frame + if (new_animation_result.sprite_sheet_col == DM_FRAME_IDLE1) { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE2; + } else if (new_animation_result.sprite_sheet_col == DM_FRAME_IDLE2) { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE1; + } else { + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? DM_FRAME_IDLE1 : DM_FRAME_IDLE2; + } + break; + case animation_state_row_t::StartWorking: + case animation_state_row_t::Working: + case animation_state_row_t::EndWorking: + if (current_frames.frames.attack_1.valid) { + new_animation_result.sprite_sheet_col = current_frames.frames.attack_1.col; + } else if (current_frames.frames.angry.valid) { + new_animation_result.sprite_sheet_col = current_frames.frames.angry.col; + } else { + // toggle frame + if (new_animation_result.sprite_sheet_col == DM_FRAME_IDLE1) { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE2; + } else if (new_animation_result.sprite_sheet_col == DM_FRAME_IDLE2) { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE1; } else { - new_frame = current_config.idle_frame; + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? DM_FRAME_IDLE1 : DM_FRAME_IDLE2; } - new_row = MS_AGENT_SPRITE_SHEET_ROW_IDLE; - new_row_state = animation_state_row_t::Idle; } break; - case animation_state_row_t::Boring: - // end current animation - new_start_frame_index = animation_indices.start_index_frame_boring; - new_end_frame_index = animation_indices.end_index_frame_boring; - new_row = MS_AGENT_SPRITE_SHEET_ROW_BORING; - new_row_state = animation_state_row_t::Boring; - if (go_next_frame) { - new_frame = current_frame + 1; - } - if (new_frame > new_end_frame_index) { - // back to idle - new_start_frame_index = animation_indices.start_index_frame_idle; - new_end_frame_index = animation_indices.end_index_frame_idle; - if (current_config.idle_animation) { - new_frame = new_start_frame_index; + case animation_state_row_t::StartMoving: + case animation_state_row_t::Moving: + if (current_frames.frames.movement_1.valid) { + new_animation_result.sprite_sheet_col = current_frames.frames.movement_1.col; + } else { + // toggle frame + if (new_animation_result.sprite_sheet_col == DM_FRAME_IDLE1) { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE2; + } else if (new_animation_result.sprite_sheet_col == DM_FRAME_IDLE2) { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE1; + } else { + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? DM_FRAME_IDLE1 : DM_FRAME_IDLE2; + } + } + break; + case animation_state_row_t::EndMoving: + if (current_frames.frames.movement_2.valid) { + new_animation_result.sprite_sheet_col = current_frames.frames.movement_2.col; + } else { + // toggle frame + if (new_animation_result.sprite_sheet_col == DM_FRAME_IDLE1) { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE2; + } else if (new_animation_result.sprite_sheet_col == DM_FRAME_IDLE2) { + new_animation_result.sprite_sheet_col = DM_FRAME_IDLE1; } else { - new_frame = current_config.idle_frame; + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? DM_FRAME_IDLE1 : DM_FRAME_IDLE2; } - new_row = MS_AGENT_SPRITE_SHEET_ROW_IDLE; - new_row_state = animation_state_row_t::Idle; } break; } + return ret; + } + + static anim_dm_process_animation_result_t anim_dm_start_or_process_animation(animation_context_t& ctx, + animation_state_row_t new_row_state, + animation_player_result_t& new_animation_result, + animation_state_t& new_state, + const animation_state_t& current_state, + const dm_sprite_sheet_t& current_frames, + const config::config_t& current_config) { + + if (current_state.row_state != new_row_state) { + auto result = anim_dm_process_animation(new_animation_result, new_state, current_state, current_frames); + if (result.status == anim_dm_process_animation_result_status_t::End || result.status == anim_dm_process_animation_result_status_t::Looped) { + result = anim_dm_restart_animation(ctx, new_row_state, new_animation_result, new_state, + current_state, current_frames, current_config); + result.status = anim_dm_process_animation_result_status_t::NextAnimationStarted; + } + return result; + } + + return anim_dm_restart_animation(ctx, new_row_state, new_animation_result, new_state, + current_state, current_frames, current_config); + } + + + static anim_dm_process_animation_result_t anim_dm_handle_movement(animation_context_t& ctx, + const platform::input::input_context_t& input, + animation_player_result_t& new_animation_result, + animation_state_t& new_state, + const anim_handle_key_press_result_t& trigger_result, + const animation_state_t& current_state, + const dm_sprite_sheet_t& current_frames, + const config::config_t& current_config) { + using namespace assets; + + assert(ctx.shm != nullptr); + animation_shared_memory_t& anim_shm = *ctx.shm; + + const auto conditions = get_anim_conditions(ctx, input, current_state, trigger_result.trigger, current_config); + + anim_dm_process_animation_result_t ret {.row_state = new_state.row_state, .status = anim_dm_process_animation_result_status_t::None}; + if (!conditions.is_writing && current_config.movement_speed > 0 && current_config.movement_radius > 0 && current_config.fps > 0) { + if (conditions.process_idle_animation || conditions.process_movement || conditions.process_movement_animation) { + const float delta = 1.0f / static_cast(current_config.fps); + const auto delta_ms = static_cast(delta * 1000); + const auto frame_height = current_config.cat_height; + const auto frame_width = static_cast(static_cast(frame_height) * (static_cast(current_frames.frame_width) / static_cast(current_frames.frame_height))); + const auto fmovement_radius = static_cast(current_config.movement_radius); + + assert(current_config.movement_radius > 0); + float max_movement_offset_x_left = 0.0f; + float max_movement_offset_x_right = 0.0f; + float wall_distance = 0.0f; + switch (current_config.cat_align) { + case config::align_type_t::ALIGN_CENTER: + // range: [-r, +r] + max_movement_offset_x_left = -static_cast(current_config.movement_radius) + static_cast(frame_width) / 2.0f; + max_movement_offset_x_right = static_cast(current_config.movement_radius - frame_width); + wall_distance = anim_shm.movement_offset_x / fmovement_radius; + break; + case config::align_type_t::ALIGN_LEFT: + // range: [0, +2r] + max_movement_offset_x_left = 0.0f; + max_movement_offset_x_right = static_cast(current_config.movement_radius) * 2.0f - static_cast(frame_width); + wall_distance = (anim_shm.movement_offset_x / (fmovement_radius * 2.0f)) * 2.0f - 1.0f; + break; + case config::align_type_t::ALIGN_RIGHT: + // range: [-2r, 0] + max_movement_offset_x_left = -(static_cast(current_config.movement_radius) * 2.0f) + static_cast(frame_width); + max_movement_offset_x_right = 0.0f; + wall_distance = (anim_shm.movement_offset_x / (fmovement_radius * 2.0f)) * 2.0f + 1.0f; // normalize to -1 → 1 + break; + } + + if (current_state.row_state == animation_state_row_t::Idle && (current_state.anim_pause_after_movement_ms > 0 || (ctx._rng.range(0, 100) <= CHANCE_FOR_SKIPPING_MOVEMENT_PERCENT))) { + // skip movement + anim_shm.anim_direction = 0.0; + new_state.anim_velocity = 0.0f; + new_state.anim_distance = 0.0f; + if (new_state.anim_pause_after_movement_ms > 0) { + new_state.anim_pause_after_movement_ms -= delta_ms; + if (new_state.anim_pause_after_movement_ms <= 0) { + new_state.anim_pause_after_movement_ms = 0; + } + } + ret.status = anim_dm_process_animation_result_status_t::SkipMovement; + } else { + // moving animation + constexpr float DIR_EPSILON = 1e-3f; + assert(MAX_DISTANCE_PER_MOVEMENT_PART > 0); + const int movement_part = current_config.movement_radius <= MAX_MOVEMENT_RADIUS_SMALL ? SMALL_MAX_DISTANCE_PER_MOVEMENT_PART : MAX_DISTANCE_PER_MOVEMENT_PART; + const float fmovement_part = static_cast(movement_part); + if (current_state.row_state == animation_state_row_t::Idle) { + // start movement + const auto min_movement = current_config.movement_radius <= MAX_MOVEMENT_RADIUS_SMALL ? (fmovement_radius / fmovement_part / 2) + 1 : (fmovement_radius / fmovement_part / fmovement_part) + 1; + float max_move_distance = fmovement_radius / fmovement_part; + max_move_distance = max_move_distance <= min_movement ? min_movement : max_move_distance; + + assert(max_move_distance >= 0); + assert(min_movement >= 0); + new_state.anim_distance = static_cast(ctx._rng.range(static_cast(min_movement), static_cast(max_move_distance))); + + if (anim_shm.movement_offset_x >= max_movement_offset_x_right) { + // run against wall, change direction + anim_shm.anim_direction = -1.0; + anim_shm.movement_offset_x = max_movement_offset_x_right; + } else if (anim_shm.movement_offset_x <= max_movement_offset_x_left) { + // run against wall, change direction + anim_shm.anim_direction = 1.0; + anim_shm.movement_offset_x = max_movement_offset_x_left; + } else { + float toward_wall_bias = fabs(wall_distance); + toward_wall_bias = toward_wall_bias >= 1.0f ? 1.0f : toward_wall_bias; + toward_wall_bias = toward_wall_bias <= 0.0f ? 0.0f : toward_wall_bias; + + const int flip_direction_chance = current_config.movement_radius <= MAX_MOVEMENT_RADIUS_SMALL ? SMALL_FLIP_DIRECTION_NEAR_WALL_PERCENT : FLIP_DIRECTION_NEAR_WALL_PERCENT; + + assert(toward_wall_bias >= 0.0f); + // change direction: chance drops at center, changes falloff steeper near walls + const auto dir_chance = static_cast(static_cast(100 - flip_direction_chance + 10) * (1.0f - pow(toward_wall_bias, 1.5f))); + if (fabs(new_state.anim_last_direction) >= DIR_EPSILON) { + anim_shm.anim_direction = (ctx._rng.range(0, 100) < dir_chance) ? -new_state.anim_last_direction : new_state.anim_last_direction; + } else if (fabs(anim_shm.anim_direction) < DIR_EPSILON) { + // idle: choose random start direction + anim_shm.anim_direction = (ctx._rng.range(0, 100) < dir_chance) ? 1.0f : -1.0f; + } else { + if (wall_distance > (100.0f / static_cast(flip_direction_chance))) { + anim_shm.anim_direction = (ctx._rng.range(0, 100) < dir_chance) ? -1.0f : 1.0f; + } else if (wall_distance < -(100.0f / static_cast(flip_direction_chance))) { + anim_shm.anim_direction = (ctx._rng.range(0, 100) < dir_chance) ? 1.0f : -1.0f; + } else { + anim_shm.anim_direction = (ctx._rng.range(0, 100) < dir_chance) ? anim_shm.anim_direction : -anim_shm.anim_direction; + } + } + } + // start moving animation + new_state.anim_velocity = anim_shm.anim_direction * static_cast(current_config.movement_speed); + ret = anim_dm_restart_animation(ctx, animation_state_row_t::StartMoving, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (current_state.row_state == animation_state_row_t::StartMoving) { + if (conditions.process_idle_animation) { + ret = anim_dm_start_or_process_animation(ctx, animation_state_row_t::Moving, // continue with moving + new_animation_result, new_state, + current_state, current_frames, current_config); + ret.status = anim_dm_process_animation_result_status_t::Updated; + } else if (conditions.process_movement_animation) { + ret = anim_dm_restart_animation(ctx, animation_state_row_t::Moving, + new_animation_result, new_state, + current_state, current_frames, current_config); + ret.status = anim_dm_process_animation_result_status_t::Updated; + } + } else if (current_state.row_state == animation_state_row_t::Moving) { + if (conditions.process_movement) { + ret = anim_dm_process_animation(new_animation_result, new_state, current_state, current_frames); + ret.status = anim_dm_process_animation_result_status_t::Moved; + + new_state.anim_distance -= fabs(new_state.anim_velocity); + anim_shm.movement_offset_x += new_state.anim_velocity; + // clamp walking/movement area + if (anim_shm.movement_offset_x > max_movement_offset_x_right) { + anim_shm.movement_offset_x = max_movement_offset_x_right; + ret = anim_dm_restart_animation(ctx, animation_state_row_t::EndMoving, + new_animation_result, new_state, + current_state, current_frames, current_config); + ret.status = anim_dm_process_animation_result_status_t::Stop; + } else if (anim_shm.movement_offset_x < max_movement_offset_x_left) { + anim_shm.movement_offset_x = max_movement_offset_x_left; + ret = anim_dm_restart_animation(ctx, animation_state_row_t::EndMoving, + new_animation_result, new_state, + current_state, current_frames, current_config); + ret.status = anim_dm_process_animation_result_status_t::Stop; + } - const bool changed = animation_player_data.frame_index != new_frame || animation_player_data.sprite_sheet_row != new_row || state.row_state != new_row_state; - if (changed) { - animation_player_data.frame_index = new_frame; - animation_player_data.sprite_sheet_row = new_row; - animation_player_data.start_frame_index = new_start_frame_index; - animation_player_data.end_frame_index = new_end_frame_index; - state.row_state = new_row_state; - if (new_row_state == animation_state_row_t::Boring) { - state.boring_frame_showed = true; - } else if (state.boring_frame_showed && (new_row_state == animation_state_row_t::StartWriting || new_row_state == animation_state_row_t::Writing || new_row_state == animation_state_row_t::EndWriting)) { - // reset boring frame state - state.boring_frame_showed = false; + if (new_state.anim_distance <= 0 || (fabs(new_state.anim_distance) < DIR_EPSILON || fabs(new_state.anim_velocity) < DIR_EPSILON)) { + ret = anim_dm_restart_animation(ctx, animation_state_row_t::EndMoving, + new_animation_result, new_state, + current_state, current_frames, current_config); + ret.status = anim_dm_process_animation_result_status_t::Stop; + } + } + } else if (current_state.row_state == animation_state_row_t::EndMoving) { + if (conditions.process_idle_animation) { + ret = anim_dm_start_or_process_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else { + ret = anim_dm_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + new_state.anim_last_direction = anim_shm.anim_direction; + new_state.anim_velocity = 0.0f; + if (ret.row_state == animation_state_row_t::Idle && new_state.anim_distance <= 0) { + assert(current_config.animation_speed_ms >= 0); + assert(movement_part >= 0); + const auto min_wait = current_config.animation_speed_ms * movement_part / 2; + const auto max_wait = current_config.animation_speed_ms * movement_part * 2; + assert(min_wait >= 0); + assert(max_wait >= 0); + new_state.anim_pause_after_movement_ms = static_cast(ctx._rng.range(static_cast(min_wait), static_cast(max_wait))); + ret.status = anim_dm_process_animation_result_status_t::End; + } + } + } } - if (current_config.enable_debug) { - BONGOCAT_LOG_VERBOSE("Idle Animation frame change: %d", new_frame); + } else { + // movement got disabled, back to idle + if ((current_config.movement_speed <= 0 || current_config.movement_radius <= 0) && conditions.is_moving) { + // back to idle + ret = anim_dm_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.anim_velocity = 0.0f; + ret.status = anim_dm_process_animation_result_status_t::Stop; } - state.frame_delta_ms_counter = 0; } - return { .changed = changed, .new_frame = new_frame }; + return ret; } -#endif - -#ifdef FEATURE_PKMN_EMBEDDED_ASSETS - static anim_next_frame_result_t anim_pkmn_idle_next_frame(animation_context_t& ctx, [[maybe_unused]] const platform::input::input_context_t& input, - animation_state_t& state, const anim_handle_key_press_result_t& trigger_result) { + static anim_next_frame_result_t anim_dm_idle_next_frame(animation_context_t& ctx, const platform::input::input_context_t& input, + [[maybe_unused]] const platform::update::update_context_t& upd, + animation_state_t& state, const anim_handle_key_press_result_t& trigger_result) { using namespace assets; + // read-only config assert(ctx._local_copy_config != nullptr); const config::config_t& current_config = *ctx._local_copy_config; - assert(input.shm != nullptr); assert(ctx.shm != nullptr); + assert(input.shm != nullptr); + assert(upd.shm != nullptr); animation_shared_memory_t& anim_shm = *ctx.shm; - //const auto& input_shm = *input.shm; - auto& animation_player_data = anim_shm.animation_player_data; - const auto current_frame = animation_player_data.frame_index; - //const auto current_row = animation_player_data.sprite_sheet_row; - //const animation_state_row_t current_row_state = state.row_state; + const auto& input_shm = *input.shm; + const auto& update_shm = *upd.shm; + const auto current_state = state; + const auto& current_animation_result = anim_shm.animation_player_result; [[maybe_unused]] const int anim_index = anim_shm.anim_index; - //const platform::timestamp_ms_t last_key_pressed_timestamp = input_shm.last_key_pressed_timestamp; - - volatile animation_state_row_t new_row_state = state.row_state; - int new_row = animation_player_data.sprite_sheet_row; - int new_start_frame_index = animation_player_data.start_frame_index; - int new_end_frame_index = animation_player_data.end_frame_index; - int new_frame = current_frame; + const platform::timestamp_ms_t last_key_pressed_timestamp = input_shm.last_key_pressed_timestamp; + assert(get_current_animation(ctx).type == animation_t::Type::Dm); + const auto& current_frames = get_current_animation(ctx).dm; - const bool any_key_pressed = has_flag(trigger_result.triggered_anim_cause, trigger_animation_cause_mask_t::KeyPress) && trigger_result.any_key_press_counter > 0; + auto new_animation_result = anim_shm.animation_player_result; + auto new_state = state; - // @TODO: get variables as struct to make it more reusable - const bool release_frame_after_press = !any_key_pressed && state.hold_frame_ms > current_config.keypress_duration_ms; - const bool process_idle_animation = (current_config.idle_animation && current_config.animation_speed_ms > 0 && state.frame_delta_ms_counter > current_config.animation_speed_ms) || (current_config.idle_animation && current_config.animation_speed_ms <= 0 && state.frame_delta_ms_counter > 1000/current_config.fps); - const bool trigger_test_animation = current_config.test_animation_interval_sec > 0 && state.frame_delta_ms_counter > current_config.test_animation_interval_sec*1000; - const bool release_test_frame = current_config.test_animation_duration_ms > 0 && state.frame_delta_ms_counter > current_config.test_animation_duration_ms; + const auto conditions = get_anim_conditions(ctx, input, current_state, trigger_result.trigger, current_config); - if (!release_frame_after_press && !trigger_test_animation && !release_test_frame && !process_idle_animation && !current_config.enable_scheduled_sleep) { - return { .changed = false, .new_frame = new_frame}; - } + /// @TODO: make animation state machine ? - //const auto& current_frames = reinterpret_cast(get_current_animation(ctx)); - new_row = PKMN_SPRITE_SHEET_ROWS-1; - // Test animation - if (!any_key_pressed && trigger_test_animation && state.row_state == animation_state_row_t::Idle) { - new_row = PKMN_SPRITE_SHEET_ROWS-1; - new_start_frame_index = PKMN_FRAME_IDLE1; - new_end_frame_index = PKMN_FRAME_IDLE2; - new_row_state = animation_state_row_t::Test; - // toggle frame - if (current_frame == PKMN_FRAME_IDLE2) { - new_frame = PKMN_FRAME_IDLE1; - } else if (current_frame == PKMN_FRAME_IDLE1) { - new_frame = PKMN_FRAME_IDLE2; + if (!conditions.is_moving) { + // Idle Animation + const bool stop_writing = conditions.is_writing && conditions.release_frame_after_press; + const bool stop_happy_kpm = current_state.row_state == animation_state_row_t::Happy && conditions.release_frame_after_press && !conditions.process_idle_animation; + const bool stop_test_animation = conditions.trigger_test_animation && current_state.row_state == animation_state_row_t::Test && conditions.release_test_frame; + if (stop_writing || stop_test_animation || stop_happy_kpm) { + // back to idle + anim_dm_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); } else { - static_assert(PKMN_FRAME_IDLE2 >= PKMN_FRAME_IDLE1); - static_assert(PKMN_FRAME_IDLE1 >= 0); - static_assert(PKMN_FRAME_IDLE2 >= 0); - new_frame = static_cast(ctx._rng.range(PKMN_FRAME_IDLE1, PKMN_FRAME_IDLE2)); // Frame 0 or 1 (active frames) + // Test Animation + if (!conditions.any_key_pressed && conditions.trigger_test_animation && current_state.row_state == animation_state_row_t::Test) { + anim_dm_process_animation(new_animation_result, new_state, current_state, current_frames); + } else { + // continues animations + if (current_state.row_state == animation_state_row_t::Idle) { + if (conditions.process_idle_animation) { + // Idle Animation + anim_dm_process_animation(new_animation_result, new_state, current_state, current_frames); + } + } + // finish animations, back to idle + if (current_state.row_state == animation_state_row_t::Happy) { + if (conditions.release_frame_after_press) { + if (conditions.process_idle_animation) { + // finish last happy animation + anim_dm_start_or_process_animation(ctx, animation_state_row_t::Idle, // back to idle + new_animation_result, new_state, + current_state, current_frames, current_config); + } else { + if (conditions.release_frame_for_non_idle) { + anim_dm_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + } + } + } + // Finsh wakeup + if (current_state.row_state == animation_state_row_t::WakeUp) { + // back to idle + if (conditions.process_idle_animation) { + // end current sleep animation + const auto animation_result = anim_dm_start_or_process_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + if (animation_result.row_state == animation_state_row_t::Idle) { + new_state.is_idle_sleep = false; + } + } else { + if (conditions.release_frame_for_non_idle) { + anim_dm_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.is_idle_sleep = false; + } + } + } + // Finish Working + if (current_state.row_state == animation_state_row_t::EndWorking && conditions.release_frame_after_update && !update_shm.cpu_active) { + if (conditions.process_idle_animation) { + anim_dm_start_or_process_animation(ctx, animation_state_row_t::Idle, // back to idle, when animation ended + new_animation_result, new_state, + current_state, current_frames, current_config); + } else { + if (conditions.release_frame_for_non_idle) { + // back to idle + anim_dm_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + } + } else if (conditions.is_working && current_state.row_state != animation_state_row_t::EndMoving && !update_shm.cpu_active) { + // Cancel Working + if (conditions.process_idle_animation) { + // back to idle + anim_dm_start_or_process_animation(ctx, animation_state_row_t::EndMoving, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else { + if (conditions.release_frame_for_non_idle) { + anim_dm_show_single_frame(ctx, animation_state_row_t::EndMoving, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + } + } + } } } - // Idle Animation - if (release_frame_after_press || process_idle_animation || (trigger_test_animation && release_test_frame && state.row_state == animation_state_row_t::Test)) { - new_start_frame_index = PKMN_FRAME_IDLE1; - new_end_frame_index = PKMN_FRAME_IDLE2; - new_row_state = animation_state_row_t::Idle; - // toggle frame - if (current_frame == PKMN_FRAME_IDLE2) { - new_frame = PKMN_FRAME_IDLE1; - } else if (current_frame == PKMN_FRAME_IDLE1) { - new_frame = PKMN_FRAME_IDLE2; - } else { - static_assert(PKMN_FRAME_IDLE2 >= PKMN_FRAME_IDLE1); - static_assert(PKMN_FRAME_IDLE1 >= 0); - static_assert(DM_FRAME_IDLE2 >= 0); - new_frame = static_cast(ctx._rng.range(PKMN_FRAME_IDLE1, PKMN_FRAME_IDLE2)); // Frame 0 or 1 (active frames) - } + + + /* + // Start Test animation + if (!conditions.any_key_pressed && conditions.trigger_test_animation && current_state.row_state == animation_state_row_t::Idle) { + anim_dm_restart_animation(ctx, animation_state_row_t::Test, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (!conditions.any_key_pressed && conditions.trigger_test_animation && current_state.row_state == animation_state_row_t::Test) { + // loop test animation + anim_dm_process_animation(new_animation_result, new_state, current_state, current_frames); } + */ - const bool changed = animation_player_data.frame_index != new_frame || animation_player_data.sprite_sheet_row != new_row || state.row_state != new_row_state; - if (changed) { - ctx.shm->animation_player_data.frame_index = new_frame; - animation_player_data.sprite_sheet_row = new_row; - animation_player_data.start_frame_index = new_start_frame_index; - animation_player_data.end_frame_index = new_end_frame_index; - state.row_state = new_row_state; - if (current_config.enable_debug) { - BONGOCAT_LOG_VERBOSE("Animation frame change: %d", new_frame); + /// @TODO: move moving handle into own anim_handle_moving_animation + // Move Animation + anim_dm_handle_movement(ctx, input, new_animation_result, new_state, trigger_result, current_state, current_frames, current_config); + + const bool is_sleeping_time = current_config.enable_scheduled_sleep && is_sleep_time(current_config); + + // Idle Sleep + if (conditions.check_for_idle_sleep) { + if (!is_sleeping_time) { + const platform::timestamp_ms_t now = platform::get_current_time_ms(); + const platform::time_ms_t idle_sleep_timeout_ms = current_config.idle_sleep_timeout_sec*1000; + assert(now >= last_key_pressed_timestamp); + const auto sleep_timeout = now - last_key_pressed_timestamp; + + const bool start_boring = SLEEP_BORING_PART > 0 && sleep_timeout >= idle_sleep_timeout_ms/SLEEP_BORING_PART; + if (current_state.row_state == animation_state_row_t::Idle) { + // start boring animation + if (start_boring && !current_state.show_boring_animation_once) { + if (conditions.process_idle_animation) { + anim_dm_restart_animation(ctx, animation_state_row_t::Boring, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else { + anim_dm_show_single_frame(ctx, animation_state_row_t::Boring, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + new_state.show_boring_animation_once = true; + new_state.anim_last_direction = 0.0f; + } + } else if (current_state.row_state == animation_state_row_t::Boring) { + if (conditions.process_idle_animation) { + const auto animation_result = anim_dm_start_or_process_animation(ctx, animation_state_row_t::Idle, // back to idle, when animation ended + new_animation_result, new_state, + current_state, current_frames, current_config); + if (!start_boring && animation_result.row_state == animation_state_row_t::Idle) { + new_state.show_boring_animation_once = false; + } + } else { + if (!start_boring || (start_boring && current_state.show_boring_animation_once)) { + if (conditions.release_frame_for_non_idle) { + // back to idle + anim_dm_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + if (!start_boring) { + new_state.show_boring_animation_once = false; + } + } + } + } + } + + // idle sleep + if (sleep_timeout >= idle_sleep_timeout_ms) { + if (current_state.row_state == animation_state_row_t::Idle || conditions.is_moving) { + if (conditions.process_idle_animation && conditions.is_moving) { + anim_dm_start_or_process_animation(ctx, animation_state_row_t::Sleep, // wait for moving to end + new_animation_result, new_state, + current_state, current_frames, current_config); + } else { + anim_dm_restart_animation(ctx, animation_state_row_t::Sleep, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + new_state.anim_last_direction = 0.0f; + new_state.is_idle_sleep = true; + } else if (current_state.row_state == animation_state_row_t::Sleep) { + if (conditions.process_idle_animation) { + // loop sleep animation + anim_dm_process_animation(new_animation_result, new_state, current_state, current_frames); + } + } + } else { + if (current_state.row_state == animation_state_row_t::Sleep && current_state.is_idle_sleep) { + // wake up + if (conditions.process_idle_animation) { + // end current sleep animation + const auto animation_result = anim_dm_start_or_process_animation(ctx, animation_state_row_t::WakeUp, + new_animation_result, new_state, + current_state, current_frames, current_config); + if (animation_result.row_state == animation_state_row_t::WakeUp) { + new_state.is_idle_sleep = false; + new_state.show_boring_animation_once = false; + } + } else { + if (conditions.release_frame_for_non_idle) { + anim_dm_show_single_frame(ctx, animation_state_row_t::WakeUp, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.is_idle_sleep = false; + new_state.show_boring_animation_once = false; + } + } + } + } } - state.frame_delta_ms_counter = 0; } - return { .changed = changed, .new_frame = new_frame}; + // Sleep Mode + if (current_config.enable_scheduled_sleep) { + if (is_sleeping_time) { + if (new_state.row_state == animation_state_row_t::Idle) { + anim_dm_restart_animation(ctx, animation_state_row_t::Sleep, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.anim_last_direction = 0.0f; + new_state.is_idle_sleep = false; + } else if (state.row_state == animation_state_row_t::Sleep && !new_state.is_idle_sleep) { + if (conditions.process_idle_animation) { + anim_dm_process_animation(new_animation_result, new_state, current_state, current_frames); + } + } + } else { + if (current_state.row_state == animation_state_row_t::Sleep && !new_state.is_idle_sleep) { + // wake up + if (conditions.process_idle_animation) { + // end current sleep animation + const auto animation_result = anim_dm_start_or_process_animation(ctx, animation_state_row_t::WakeUp, + new_animation_result, new_state, + current_state, current_frames, current_config); + if (animation_result.row_state == animation_state_row_t::WakeUp) { + new_state.is_idle_sleep = false; + new_state.show_boring_animation_once = false; + } + } else { + if (conditions.release_frame_for_non_idle) { + anim_dm_show_single_frame(ctx, animation_state_row_t::WakeUp, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.show_boring_animation_once = false; + } + } + } + } + } else { + if (current_state.row_state == animation_state_row_t::Sleep && !new_state.is_idle_sleep) { + // wake up + if (conditions.process_idle_animation) { + // end current sleep animation + const auto animation_result = anim_dm_start_or_process_animation(ctx, animation_state_row_t::WakeUp, + new_animation_result, new_state, + current_state, current_frames, current_config); + if (animation_result.row_state == animation_state_row_t::WakeUp) { + new_state.is_idle_sleep = false; + new_state.show_boring_animation_once = false; + } + } else { + if (conditions.release_frame_for_non_idle) { + anim_dm_show_single_frame(ctx, animation_state_row_t::WakeUp, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.show_boring_animation_once = false; + } + } + } + } + + return anim_update_animation_state(anim_shm, state, + new_animation_result, new_state, + current_animation_result, current_state, + current_config); + } + + static anim_next_frame_result_t anim_dm_key_pressed_next_frame(animation_context_t& ctx, const platform::input::input_context_t& input, + animation_state_t& state, + const animation_trigger_t& trigger) { + using namespace assets; + + // read-only config + assert(ctx._local_copy_config != nullptr); + const config::config_t& current_config = *ctx._local_copy_config; + + assert(ctx.shm != nullptr); + assert(input.shm != nullptr); + animation_shared_memory_t& anim_shm = *ctx.shm; + const auto& input_shm = *input.shm; + const auto current_state = state; + const auto& current_animation_result = anim_shm.animation_player_result; + [[maybe_unused]] const int anim_index = anim_shm.anim_index; + assert(get_current_animation(ctx).type == animation_t::Type::Dm); + const auto& current_frames = get_current_animation(ctx).dm; + + auto new_animation_result = anim_shm.animation_player_result; + auto new_state = state; + + const auto conditions = get_anim_conditions(ctx, input, current_state, trigger, current_config); + + bool show_happy = false; + if (input_shm.kpm > 0) { + if (current_config.happy_kpm > 0 && input_shm.kpm >= current_config.happy_kpm) { + show_happy = DM_HAPPY_CHANCE_PERCENT >= 100 || ctx._rng.range(0, 99) < DM_HAPPY_CHANCE_PERCENT; + } + } + + /// @TODO: use state machine for animation (states) + + if (show_happy && (conditions.is_writing || current_state.row_state == animation_state_row_t::Idle)) { + // show happy animation (KPM) + anim_dm_restart_animation(ctx, animation_state_row_t::Happy, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (conditions.is_writing || conditions.is_moving || current_state.row_state == animation_state_row_t::Idle) { + const bool end_writing = !conditions.release_frame_after_press && conditions.is_writing; + // in Writing mode/start writing + if (!conditions.is_writing || conditions.is_moving) { + anim_dm_restart_animation(ctx, animation_state_row_t::StartWriting, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.show_boring_animation_once = false; + } else { + if (conditions.process_idle_animation) { + // transition writing animations + if (current_state.row_state == animation_state_row_t::StartWriting) { + anim_dm_start_or_process_animation(ctx, animation_state_row_t::Writing, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (conditions.release_frame_after_press && current_state.row_state == animation_state_row_t::Writing) { + anim_dm_start_or_process_animation(ctx, animation_state_row_t::EndWriting, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (conditions.release_frame_after_press && current_state.row_state == animation_state_row_t::EndWriting) { + anim_dm_start_or_process_animation(ctx, animation_state_row_t::Idle, // back to idle + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (end_writing) { + // keep writing + anim_dm_process_animation(new_animation_result, new_state, current_state, current_frames); + } + } else { + if (current_state.row_state == animation_state_row_t::StartWriting) { + anim_dm_start_or_process_animation(ctx, animation_state_row_t::Writing, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (end_writing) { + // back to idle + anim_dm_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (conditions.continue_writing) { + // keep writing + anim_dm_process_animation(new_animation_result, new_state, current_state, current_frames); + } + } + } + } else if (current_state.row_state == animation_state_row_t::Happy) { + if (conditions.release_frame_after_press) { + if (conditions.process_idle_animation) { + // finish last happy animation + anim_dm_start_or_process_animation(ctx, conditions.continue_writing ? animation_state_row_t::Writing : animation_state_row_t::Idle, // back to idle + new_animation_result, new_state, + current_state, current_frames, current_config); + } else { + // back to idle + anim_dm_restart_animation(ctx, conditions.continue_writing ? animation_state_row_t::Writing : animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + } else { + if (!conditions.process_idle_animation) { + // back to idle + anim_dm_restart_animation(ctx, conditions.continue_writing ? animation_state_row_t::Writing : animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else { + // finish last happy animation + anim_dm_start_or_process_animation(ctx, conditions.continue_writing ? animation_state_row_t::Writing : animation_state_row_t::Idle, // back to idle + new_animation_result, new_state, + current_state, current_frames, current_config); + } + } + } else if (state.row_state == animation_state_row_t::Sleep && current_state.is_idle_sleep) { + // wake up + anim_dm_restart_animation(ctx, animation_state_row_t::WakeUp, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + + return anim_update_animation_state(anim_shm, state, + new_animation_result, new_state, + current_animation_result, current_state, + current_config); + } + + static anim_next_frame_result_t anim_dm_working_next_frame(animation_context_t& ctx, + const platform::input::input_context_t& input, + const platform::update::update_context_t& upd, + animation_state_t& state, + const animation_trigger_t& trigger) { + using namespace assets; + + // read-only config + assert(ctx._local_copy_config != nullptr); + const config::config_t& current_config = *ctx._local_copy_config; + + assert(ctx.shm != nullptr); + //assert(input.shm != nullptr); + assert(upd.shm != nullptr); + animation_shared_memory_t& anim_shm = *ctx.shm; + //const auto& input_shm = *input.shm; + const auto& update_shm = *upd.shm; + const auto current_state = state; + const auto& current_animation_result = anim_shm.animation_player_result; + [[maybe_unused]] const int anim_index = anim_shm.anim_index; + //const platform::timestamp_ms_t last_key_pressed_timestamp = input_shm.last_key_pressed_timestamp; + assert(get_current_animation(ctx).type == animation_t::Type::Dm); + const auto& current_frames = get_current_animation(ctx).dm; + + auto new_animation_result = anim_shm.animation_player_result; + auto new_state = state; + + const auto conditions = get_anim_conditions(ctx, input, current_state, trigger, current_config); + + /// @TODO: use state machine for animation (states) + + if (conditions.process_working_animation) { + // toggle frame, show attack animation + const bool above_threshold = current_config.cpu_threshold >= platform::ENABLED_MIN_CPU_PERCENT && (update_shm.avg_cpu_usage >= current_config.cpu_threshold || update_shm.max_cpu_usage >= current_config.cpu_threshold); + const bool lower_threshold = current_config.cpu_threshold >= platform::ENABLED_MIN_CPU_PERCENT && (update_shm.avg_cpu_usage < current_config.cpu_threshold && update_shm.max_cpu_usage < current_config.cpu_threshold); + + if (above_threshold) { + if (current_state.row_state == animation_state_row_t::Idle || conditions.is_moving) { + anim_dm_restart_animation(ctx, animation_state_row_t::StartWorking, + new_animation_result, new_state, + current_state, current_frames, current_config); + BONGOCAT_LOG_VERBOSE("Start Working: %d %d; %d%%", above_threshold, lower_threshold, update_shm.avg_cpu_usage); + } else if (conditions.is_working) { + // continues animations + if (conditions.process_idle_animation) { + if (update_shm.cpu_active && current_state.row_state == animation_state_row_t::StartWorking) { + anim_dm_start_or_process_animation(ctx, animation_state_row_t::Working, // continue working + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (!update_shm.cpu_active && (current_state.row_state == animation_state_row_t::StartWorking || state.row_state == animation_state_row_t::Working)) { + // end working, cool down + anim_dm_start_or_process_animation(ctx, animation_state_row_t::EndWorking, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (!update_shm.cpu_active && current_state.row_state == animation_state_row_t::EndWorking) { + // back to idle + anim_dm_start_or_process_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (update_shm.cpu_active && current_state.row_state == animation_state_row_t::Working) { + // keep working + anim_dm_process_animation(new_animation_result, new_state, current_state, current_frames); + } + } else { + if (update_shm.cpu_active) { + if (update_shm.cpu_active && current_state.row_state == animation_state_row_t::StartWorking) { + anim_dm_show_single_frame(ctx, animation_state_row_t::Working, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (!update_shm.cpu_active && (current_state.row_state == animation_state_row_t::StartWorking || state.row_state == animation_state_row_t::Working)) { + // end working + anim_dm_show_single_frame(ctx, animation_state_row_t::EndWorking, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (!update_shm.cpu_active && current_state.row_state == animation_state_row_t::EndWorking) { + // back to idle + anim_dm_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (update_shm.cpu_active && current_state.row_state == animation_state_row_t::Working) { + // keep working + anim_dm_process_animation(new_animation_result, new_state, current_state, current_frames); + } + } + } + } + } else if (lower_threshold) { + // End Working + if (conditions.is_working && current_state.row_state != animation_state_row_t::EndMoving) { + if (conditions.process_idle_animation) { + // end working, cool down + anim_dm_start_or_process_animation(ctx, animation_state_row_t::EndWorking, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else { + anim_dm_show_single_frame(ctx, animation_state_row_t::EndWorking, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + BONGOCAT_LOG_VERBOSE("Stop Working: %d %d; %d%%", above_threshold, lower_threshold, update_shm.avg_cpu_usage); + } + } else { + // Cancel Working + if (conditions.is_working && current_state.row_state != animation_state_row_t::EndMoving && !update_shm.cpu_active) { + if (conditions.process_idle_animation) { + // back to idle + anim_dm_start_or_process_animation(ctx, animation_state_row_t::EndMoving, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else { + anim_dm_show_single_frame(ctx, animation_state_row_t::EndMoving, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + BONGOCAT_LOG_VERBOSE("Stop Working: %d %d; %d%%", above_threshold, lower_threshold, update_shm.avg_cpu_usage); + } + } + } + + return anim_update_animation_state(anim_shm, state, + new_animation_result, new_state, + current_animation_result, current_state, + current_config); + } +#endif + +#ifdef FEATURE_MS_AGENT_EMBEDDED_ASSETS + enum class anim_ms_agent_process_animation_result_status_t : uint8_t { None, Started, Updated, End, Looped, NextAnimationStarted }; + struct anim_ms_agent_process_animation_result_t { + animation_state_row_t row_state; + anim_ms_agent_process_animation_result_status_t status{anim_ms_agent_process_animation_result_status_t::None}; + }; + static anim_ms_agent_process_animation_result_t anim_ms_agent_process_animation(animation_player_result_t& new_animation_result, + animation_state_t& new_state, + [[maybe_unused]] const animation_state_t& current_state, + const ms_agent_sprite_sheet_t& current_frames) { + using namespace assets; + assert(MAX_ANIMATION_FRAMES > 0); + assert(MAX_ANIMATION_FRAMES <= INT_MAX); + + const ms_agent_sprite_sheet_animation_section_t *section = nullptr; + switch (new_state.row_state) { + case animation_state_row_t::Idle: + section = current_frames.idle.valid ? ¤t_frames.idle : nullptr; + break; + case animation_state_row_t::StartWriting: + section = current_frames.start_writing.valid ? ¤t_frames.start_writing : nullptr; + break; + case animation_state_row_t::Writing: + section = current_frames.writing.valid ? ¤t_frames.writing : nullptr; + break; + case animation_state_row_t::EndWriting: + section = current_frames.end_writing.valid ? ¤t_frames.end_writing : nullptr; + break; + case animation_state_row_t::Happy: + section = current_frames.happy.valid ? ¤t_frames.happy : nullptr; + break; + case animation_state_row_t::Sleep: + section = current_frames.sleep.valid ? ¤t_frames.sleep : nullptr; + break; + case animation_state_row_t::WakeUp: + section = current_frames.wake_up.valid ? ¤t_frames.wake_up : nullptr; + break; + case animation_state_row_t::Boring: + section = current_frames.boring.valid ? ¤t_frames.boring : nullptr; + break; + case animation_state_row_t::Test: + section = current_frames.writing.valid ? ¤t_frames.writing : nullptr; + break; + case animation_state_row_t::StartWorking: + section = current_frames.start_working.valid ? ¤t_frames.start_working : nullptr; + break; + case animation_state_row_t::Working: + section = current_frames.working.valid ? ¤t_frames.working : nullptr; + break; + case animation_state_row_t::EndWorking: + section = current_frames.end_working.valid ? ¤t_frames.end_working : nullptr; + break; + case animation_state_row_t::StartMoving: + section = current_frames.start_moving.valid ? ¤t_frames.start_moving : nullptr; + break; + case animation_state_row_t::Moving: + section = current_frames.moving.valid ? ¤t_frames.moving : nullptr; + break; + case animation_state_row_t::EndMoving: + section = current_frames.end_moving.valid ? ¤t_frames.end_moving : nullptr; + break; + } + + anim_ms_agent_process_animation_result_t ret {.row_state = new_state.row_state, .status = anim_ms_agent_process_animation_result_status_t::Updated}; + if (section && section->valid) { + new_animation_result.sprite_sheet_row = section->row; + new_animation_result.sprite_sheet_col = new_animation_result.sprite_sheet_col + 1; + ret.status = anim_ms_agent_process_animation_result_status_t::Updated; + + if (new_animation_result.sprite_sheet_col <= section->start_col) { + // start animation + new_animation_result.sprite_sheet_col = section->start_col; + ret.status = anim_ms_agent_process_animation_result_status_t::Started; + } else if (new_animation_result.sprite_sheet_col == section->end_col) { + // last frame + new_animation_result.sprite_sheet_col = section->end_col; + ret.status = anim_ms_agent_process_animation_result_status_t::Updated; + } else if (new_animation_result.sprite_sheet_col > section->end_col) { + // don't loop at sleep, show last frame + if (new_state.row_state == animation_state_row_t::Sleep) { + // end animation + new_animation_result.sprite_sheet_col = section->end_col; + ret.status = anim_ms_agent_process_animation_result_status_t::End; + } else { + // loop animation + new_animation_result.sprite_sheet_col = section->start_col; + ret.status = anim_ms_agent_process_animation_result_status_t::Looped; + } + } + + } + + return ret; + } + static anim_ms_agent_process_animation_result_t anim_ms_agent_restart_animation([[maybe_unused]] animation_context_t& ctx, + animation_state_row_t new_row_state, + animation_player_result_t& new_animation_result, + animation_state_t& new_state, + [[maybe_unused]] const animation_state_t& current_state, + const ms_agent_sprite_sheet_t& current_frames, + [[maybe_unused]] const config::config_t& current_config) { + using namespace assets; + assert(MAX_ANIMATION_FRAMES > 0); + assert(MAX_ANIMATION_FRAMES <= INT_MAX); + + const ms_agent_sprite_sheet_animation_section_t *section = nullptr; + switch (new_row_state) { + case animation_state_row_t::Idle: + section = current_frames.idle.valid ? ¤t_frames.idle : nullptr; + break; + case animation_state_row_t::StartWriting: + section = current_frames.start_writing.valid ? ¤t_frames.start_writing : nullptr; + break; + case animation_state_row_t::Writing: + section = current_frames.writing.valid ? ¤t_frames.writing : nullptr; + break; + case animation_state_row_t::EndWriting: + section = current_frames.end_writing.valid ? ¤t_frames.end_writing : nullptr; + break; + case animation_state_row_t::Happy: + section = current_frames.happy.valid ? ¤t_frames.happy : nullptr; + break; + case animation_state_row_t::Sleep: + section = current_frames.sleep.valid ? ¤t_frames.sleep : nullptr; + break; + case animation_state_row_t::WakeUp: + section = current_frames.wake_up.valid ? ¤t_frames.wake_up : nullptr; + break; + case animation_state_row_t::Boring: + section = current_frames.boring.valid ? ¤t_frames.boring : nullptr; + break; + case animation_state_row_t::Test: + section = current_frames.writing.valid ? ¤t_frames.writing : nullptr; + break; + case animation_state_row_t::StartWorking: + section = current_frames.start_working.valid ? ¤t_frames.start_working : nullptr; + break; + case animation_state_row_t::Working: + section = current_frames.working.valid ? ¤t_frames.working : nullptr; + break; + case animation_state_row_t::EndWorking: + section = current_frames.end_working.valid ? ¤t_frames.end_working : nullptr; + break; + case animation_state_row_t::StartMoving: + section = current_frames.start_moving.valid ? ¤t_frames.start_moving : nullptr; + break; + case animation_state_row_t::Moving: + section = current_frames.moving.valid ? ¤t_frames.moving : nullptr; + break; + case animation_state_row_t::EndMoving: + section = current_frames.end_moving.valid ? ¤t_frames.end_moving : nullptr; + break; + } + + anim_ms_agent_process_animation_result_t ret {.row_state = new_state.row_state, .status = anim_ms_agent_process_animation_result_status_t::None}; + if (section && section->valid) { + new_state.row_state = new_row_state; + new_animation_result.sprite_sheet_row = section->row; + new_animation_result.sprite_sheet_col = section->start_col; + if (new_state.row_state == animation_state_row_t::Idle) { + if (current_config.idle_frame) { + new_animation_result.sprite_sheet_col = current_config.idle_frame; + } + } + ret.row_state = new_state.row_state; + ret.status = anim_ms_agent_process_animation_result_status_t::Started; + } + + return ret; + } + + static anim_ms_agent_process_animation_result_t anim_ms_agent_start_or_process_animation(animation_context_t& ctx, + animation_state_row_t new_row_state, + animation_player_result_t& new_animation_result, + animation_state_t& new_state, + const animation_state_t& current_state, + const ms_agent_sprite_sheet_t& current_frames, + const config::config_t& current_config) { + + if (current_state.row_state != new_row_state) { + auto result = anim_ms_agent_process_animation(new_animation_result, new_state, current_state, current_frames); + if (result.status == anim_ms_agent_process_animation_result_status_t::Looped || result.status == anim_ms_agent_process_animation_result_status_t::End) { + result = anim_ms_agent_restart_animation(ctx, new_row_state, new_animation_result, new_state, + current_state, current_frames, current_config); + result.status = anim_ms_agent_process_animation_result_status_t::NextAnimationStarted; + } + return result; + } + + return anim_ms_agent_restart_animation(ctx, new_row_state, new_animation_result, new_state, + current_state, current_frames, current_config); + } + + static anim_next_frame_result_t anim_ms_agent_idle_next_frame(animation_context_t& ctx, const platform::input::input_context_t& input, + animation_state_t& state, const anim_handle_key_press_result_t& trigger_result) { + using namespace assets; + + // read-only config + assert(ctx._local_copy_config != nullptr); + const config::config_t& current_config = *ctx._local_copy_config; + + assert(ctx.shm != nullptr); + assert(input.shm != nullptr); + //assert(upd.shm != nullptr); + animation_shared_memory_t& anim_shm = *ctx.shm; + const auto& input_shm = *input.shm; + //const auto& update_shm = *upd.shm; + const auto current_state = state; + const auto& current_animation_result = anim_shm.animation_player_result; + [[maybe_unused]] const int anim_index = anim_shm.anim_index; + const platform::timestamp_ms_t last_key_pressed_timestamp = input_shm.last_key_pressed_timestamp; + assert(get_current_animation(ctx).type == animation_t::Type::MsAgent); + const auto& current_frames = get_current_animation(ctx).ms_agent; + + auto new_animation_result = anim_shm.animation_player_result; + auto new_state = state; + + const auto conditions = get_anim_conditions(ctx, input, current_state, trigger_result.trigger, current_config); + + /// @TODO: make animation fsm + + const platform::timestamp_ms_t now = platform::get_current_time_ms(); + const platform::time_ms_t idle_sleep_timeout_ms = current_config.idle_sleep_timeout_sec*1000; + assert(now >= last_key_pressed_timestamp); + const auto sleep_timeout = now - last_key_pressed_timestamp; + + const bool start_boring = SLEEP_BORING_PART > 0 && sleep_timeout >= idle_sleep_timeout_ms/SLEEP_BORING_PART; + + switch (current_state.row_state) { + case animation_state_row_t::Test: + case animation_state_row_t::Happy: + case animation_state_row_t::StartMoving: + case animation_state_row_t::Moving: + case animation_state_row_t::EndMoving: + // not supported, same as idle + break; + case animation_state_row_t::StartWorking: + case animation_state_row_t::Working: + case animation_state_row_t::EndWorking: + // @TODO: add working (CPU state) animation + break; + case animation_state_row_t::Idle: { + if (current_config.idle_animation && conditions.go_next_frame) { + anim_ms_agent_process_animation(new_animation_result, new_state, current_state, current_frames); + } + + // handle sleep + const bool is_sleeping_time = current_config.enable_scheduled_sleep && is_sleep_time(current_config); + + // Idle Sleep + if (conditions.check_for_idle_sleep) { + if (!is_sleeping_time) { + if (current_state.row_state == animation_state_row_t::Idle) { + // start boring animation + if (start_boring && !current_state.show_boring_animation_once) { + anim_ms_agent_restart_animation(ctx, animation_state_row_t::Boring, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.show_boring_animation_once = true; + new_state.anim_last_direction = 0.0f; + } + } + + // idle sleep + if (sleep_timeout >= idle_sleep_timeout_ms) { + if (current_state.row_state == animation_state_row_t::Idle || conditions.is_moving) { + if (conditions.is_moving) { + anim_ms_agent_start_or_process_animation(ctx, animation_state_row_t::Sleep, // wait for moving to end + new_animation_result, new_state, + current_state, current_frames, current_config); + } else { + anim_ms_agent_restart_animation(ctx, animation_state_row_t::Sleep, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + new_state.anim_last_direction = 0.0f; + new_state.is_idle_sleep = true; + new_state.show_boring_animation_once = false; + } else if (current_state.row_state == animation_state_row_t::Sleep) { + if (conditions.go_next_frame) { + // process sleep animation + anim_ms_agent_process_animation(new_animation_result, new_state, current_state, current_frames); + } + } + } else { + if (current_state.row_state == animation_state_row_t::Sleep && current_state.is_idle_sleep) { + // wake up + if (conditions.go_next_frame) { + // end current sleep animation + anim_ms_agent_start_or_process_animation(ctx, animation_state_row_t::WakeUp, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.is_idle_sleep = false; + } + } + } + } + } + + // Sleep Mode + if (current_config.enable_scheduled_sleep) { + if (is_sleeping_time) { + if (new_state.row_state == animation_state_row_t::Idle) { + anim_ms_agent_restart_animation(ctx, animation_state_row_t::Sleep, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.anim_last_direction = 0.0f; + new_state.is_idle_sleep = false; + } else if (state.row_state == animation_state_row_t::Sleep && !new_state.is_idle_sleep) { + if (conditions.go_next_frame) { + anim_ms_agent_process_animation(new_animation_result, new_state, current_state, current_frames); + } + } + } else { + if (current_state.row_state == animation_state_row_t::Sleep && !new_state.is_idle_sleep) { + // wake up + if (conditions.go_next_frame) { + // end current sleep animation + anim_ms_agent_start_or_process_animation(ctx, animation_state_row_t::WakeUp, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + } + } + } else { + if (current_state.row_state == animation_state_row_t::Sleep && !new_state.is_idle_sleep) { + // wake up + if (conditions.go_next_frame) { + // end current sleep animation + anim_ms_agent_start_or_process_animation(ctx, animation_state_row_t::WakeUp, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + } + } + }break; + case animation_state_row_t::Writing: { + if (conditions.continue_writing) { + if (conditions.go_next_frame) { + // loop writing animation + anim_ms_agent_process_animation(new_animation_result, new_state, current_state, current_frames); + } + } else { + if (conditions.release_frame_after_press) { + // cancel writing + anim_ms_agent_start_or_process_animation(ctx, animation_state_row_t::EndWriting, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + } + }break; + case animation_state_row_t::StartWriting: + if (conditions.go_next_frame) { + const auto animation_result = anim_ms_agent_start_or_process_animation(ctx, animation_state_row_t::Writing, + new_animation_result, new_state, + current_state, current_frames, current_config); + if (animation_result.row_state == animation_state_row_t::Writing) { + // reset release counter after writing is started (for real) + new_state.hold_frame_after_release = true; + new_state.hold_frame_ms = 0; + } + } + break; + case animation_state_row_t::EndWriting: + if (conditions.go_next_frame) { + // finish animation + anim_ms_agent_start_or_process_animation(ctx, animation_state_row_t::Idle, // back to idle + new_animation_result, new_state, + current_state, current_frames, current_config); + } + break; + case animation_state_row_t::Sleep: + if (conditions.go_next_frame) { + anim_ms_agent_process_animation(new_animation_result, new_state, current_state, current_frames); + } + break; + case animation_state_row_t::WakeUp: + if (conditions.go_next_frame) { + // finish animation + anim_ms_agent_start_or_process_animation(ctx, animation_state_row_t::Idle, // back to idle + new_animation_result, new_state, + current_state, current_frames, current_config); + } + break; + case animation_state_row_t::Boring: + if (conditions.go_next_frame) { + anim_ms_agent_start_or_process_animation(ctx, animation_state_row_t::Idle, // back to idle, when animation ended + new_animation_result, new_state, + current_state, current_frames, current_config); + if (!start_boring) { + new_state.show_boring_animation_once = false; + } + } + break; + } + + return anim_update_animation_state(anim_shm, state, + new_animation_result, new_state, + current_animation_result, current_state, + current_config); + } + + + static anim_next_frame_result_t anim_ms_agent_key_pressed_next_frame(animation_context_t& ctx, + animation_state_t& state, + const platform::input::input_context_t& input, + [[maybe_unused]] const animation_trigger_t& trigger) { + using namespace assets; + + // read-only config + assert(ctx._local_copy_config != nullptr); + const config::config_t& current_config = *ctx._local_copy_config; + + assert(ctx.shm != nullptr); + assert(input.shm != nullptr); + animation_shared_memory_t& anim_shm = *ctx.shm; + //const auto& input_shm = *input.shm; + const auto current_state = state; + const auto& current_animation_result = anim_shm.animation_player_result; + [[maybe_unused]] const int anim_index = anim_shm.anim_index; + assert(get_current_animation(ctx).type == animation_t::Type::MsAgent); + const auto& current_frames = get_current_animation(ctx).ms_agent; + + auto new_animation_result = anim_shm.animation_player_result; + auto new_state = state; + + //const auto conditions = get_anim_conditions(ctx, input, current_state, trigger, current_config); + + // in Writing mode/start writing + switch (state.row_state) { + case animation_state_row_t::StartMoving: + case animation_state_row_t::Moving: + case animation_state_row_t::EndMoving: + // moving not supported + case animation_state_row_t::Test: + case animation_state_row_t::Happy: + case animation_state_row_t::Idle: + anim_ms_agent_restart_animation(ctx, animation_state_row_t::StartWriting, + new_animation_result, new_state, + current_state, current_frames, current_config); + break; + case animation_state_row_t::StartWriting: + // start end writing and process animation in anim_ms_pet_idle_next_frame + break; + case animation_state_row_t::Writing: + // reset hold frame so we can continue writing + new_state.hold_frame_ms = 0; + // start end writing and process animation in anim_ms_pet_idle_next_frame + break; + case animation_state_row_t::EndWriting: + // start end writing and process animation in anim_ms_pet_idle_next_frame + break; + case animation_state_row_t::Sleep: + if (current_state.is_idle_sleep) { + // wake up, end current sleep animation + anim_ms_agent_start_or_process_animation(ctx, animation_state_row_t::WakeUp, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.is_idle_sleep = false; + } + case animation_state_row_t::WakeUp: + // process animation in anim_ms_pet_idle_next_frame + break; + case animation_state_row_t::Boring: + // process animation in anim_ms_pet_idle_next_frame + break; + case animation_state_row_t::StartWorking: + case animation_state_row_t::Working: + case animation_state_row_t::EndWorking: + // start end writing and process animation in anim_ms_pet_idle_next_frame + break; + } + + return anim_update_animation_state(anim_shm, state, + new_animation_result, new_state, + current_animation_result, current_state, + current_config); } -#endif -#ifdef FEATURE_BONGOCAT_EMBEDDED_ASSETS - static anim_next_frame_result_t anim_bongocat_key_pressed_next_frame(animation_context_t& ctx, animation_state_t& state) { + /* + static anim_next_frame_result_t anim_ms_agent_working_next_frame(animation_context_t& ctx, const platform::update::update_context_t& upd, + animation_state_t& state) { using namespace assets; // read-only config @@ -959,320 +2277,348 @@ namespace bongocat::animation { const config::config_t& current_config = *ctx._local_copy_config; assert(ctx.shm != nullptr); + assert(upd.shm != nullptr); + //assert(input.shm != nullptr); animation_shared_memory_t& anim_shm = *ctx.shm; //const auto& input_shm = *input.shm; - auto& animation_player_data = anim_shm.animation_player_data; - const auto current_frame = animation_player_data.frame_index; - //const auto current_row = animation_player_data.sprite_sheet_row; - //const animation_state_row_t current_row_state = state.row_state; - //const auto anim_index = anim_shm.anim_index; + const auto& update_shm = *upd.shm; + const auto current_state = state; + const auto& current_animation_result = anim_shm.animation_player_result; + [[maybe_unused]] const int anim_index = anim_shm.anim_index; //const platform::timestamp_ms_t last_key_pressed_timestamp = input_shm.last_key_pressed_timestamp; + assert(get_current_animation(ctx).type == animation_t::Type::MsAgent); + const auto& current_frames = get_current_animation(ctx).ms_agent; - animation_state_row_t new_row_state = state.row_state; - auto new_row = animation_player_data.sprite_sheet_row; - auto new_start_frame_index = animation_player_data.start_frame_index; - auto new_end_frame_index = animation_player_data.end_frame_index; - auto new_frame = current_frame; + auto new_animation_result = anim_shm.animation_player_result; + auto new_state = state; - /// @TODO: use state machine for animation (states) + assert(anim_shm.anim_type == config::config_animation_sprite_sheet_layout_t::MsAgent); - // toggle frame - if (current_frame == BONGOCAT_FRAME_LEFT_DOWN) { - new_frame = BONGOCAT_FRAME_RIGHT_DOWN; - } else if (current_frame == BONGOCAT_FRAME_RIGHT_DOWN) { - new_frame = BONGOCAT_FRAME_LEFT_DOWN; - } else { - static_assert(BONGOCAT_FRAME_RIGHT_DOWN >= BONGOCAT_FRAME_LEFT_DOWN); - static_assert(BONGOCAT_FRAME_LEFT_DOWN >= 0); - static_assert(BONGOCAT_FRAME_RIGHT_DOWN >= 0); - new_frame = static_cast(ctx._rng.range(BONGOCAT_FRAME_LEFT_DOWN, BONGOCAT_FRAME_RIGHT_DOWN)); - } - // in Writing mode/start writing - new_row = BONGOCAT_SPRITE_SHEET_ROWS-1; - new_start_frame_index = BONGOCAT_FRAME_LEFT_DOWN; - new_end_frame_index = BONGOCAT_FRAME_RIGHT_DOWN; - new_row_state = animation_state_row_t::Writing; - - const bool changed = anim_shm.animation_player_data.frame_index != new_frame || anim_shm.animation_player_data.sprite_sheet_row != new_row || state.row_state != new_row_state; - if (changed) { - anim_shm.animation_player_data.frame_index = new_frame; - animation_player_data.sprite_sheet_row = new_row; - animation_player_data.start_frame_index = new_start_frame_index; - animation_player_data.end_frame_index = new_end_frame_index; - state.row_state = new_row_state; - if (current_config.enable_debug) { - BONGOCAT_LOG_VERBOSE("Animation frame change: %d", new_frame); - } - state.frame_delta_ms_counter = 0; - } + /// @TODO: use state machine for animation (states) - return { .changed = changed, .new_frame = new_frame}; + return anim_update_animation_state(anim_shm, state, + new_animation_result, new_state, + current_animation_result, current_state, + current_config); } + */ #endif -#ifdef FEATURE_ENABLE_DM_EMBEDDED_ASSETS - static anim_next_frame_result_t anim_dm_key_pressed_next_frame(animation_context_t& ctx, const platform::input::input_context_t& input, - animation_state_t& state) { +#ifdef FEATURE_PKMN_EMBEDDED_ASSETS + enum class anim_pkmn_process_animation_result_status_t : uint8_t { None, Started, Updated, End, Looped, NextAnimationStarted }; + struct anim_pkmn_process_animation_result_t { + animation_state_row_t row_state; + anim_pkmn_process_animation_result_status_t status{anim_pkmn_process_animation_result_status_t::None}; + }; + static anim_pkmn_process_animation_result_t anim_pkmn_process_animation(animation_player_result_t& new_animation_result, + animation_state_t& new_state, + const animation_state_t& current_state, + const pkmn_sprite_sheet_t& current_frames) { + assert(MAX_ANIMATION_FRAMES > 0); + assert(MAX_ANIMATION_FRAMES <= INT_MAX); + + anim_pkmn_process_animation_result_t ret {.row_state = new_state.row_state, .status = anim_pkmn_process_animation_result_status_t::Updated}; + // forward animation + new_state.animations_index = current_state.animations_index + 1; + if (new_state.animations_index > static_cast(MAX_ANIMATION_FRAMES-1)) { + ret.status = anim_pkmn_process_animation_result_status_t::Looped; + new_state.animations_index = 0; + } + /* + // backwards animation + else if (new_state.animations_index < 0) { + ret = anim_bongocat_process_animation_result_t::End; + new_state.animations_index = MAX_ANIMATION_FRAMES-1; + } + */ + switch (new_state.row_state) { + case animation_state_row_t::Idle: + new_animation_result.sprite_sheet_col = current_frames.animations.idle[new_state.animations_index]; + break; + case animation_state_row_t::StartWriting: + case animation_state_row_t::Writing: + case animation_state_row_t::EndWriting: + new_animation_result.sprite_sheet_col = current_frames.animations.writing[new_state.animations_index]; + break; + case animation_state_row_t::Happy: + new_animation_result.sprite_sheet_col = current_frames.animations.happy[new_state.animations_index]; + break; + case animation_state_row_t::Sleep: + new_animation_result.sprite_sheet_col = current_frames.animations.sleep[new_state.animations_index]; + break; + case animation_state_row_t::WakeUp: + new_animation_result.sprite_sheet_col = current_frames.animations.wake_up[new_state.animations_index]; + break; + case animation_state_row_t::Boring: + new_animation_result.sprite_sheet_col = current_frames.animations.boring[new_state.animations_index]; + break; + case animation_state_row_t::Test: + new_animation_result.sprite_sheet_col = current_frames.animations.writing[new_state.animations_index]; + break; + case animation_state_row_t::StartWorking: + case animation_state_row_t::Working: + case animation_state_row_t::EndWorking: + new_animation_result.sprite_sheet_col = current_frames.animations.working[new_state.animations_index]; + break; + case animation_state_row_t::StartMoving: + case animation_state_row_t::Moving: + case animation_state_row_t::EndMoving: + new_animation_result.sprite_sheet_col = current_frames.animations.moving[new_state.animations_index]; + break; + } + return ret; + } + static anim_pkmn_process_animation_result_t anim_pkmn_restart_animation([[maybe_unused]] animation_context_t& ctx, + animation_state_row_t new_row_state, + animation_player_result_t& new_animation_result, + animation_state_t& new_state, + [[maybe_unused]] const animation_state_t& current_state, + const pkmn_sprite_sheet_t& current_frames, + const config::config_t& current_config) { using namespace assets; + assert(MAX_ANIMATION_FRAMES > 0); + assert(MAX_ANIMATION_FRAMES <= INT_MAX); - // read-only config - assert(ctx._local_copy_config != nullptr); - const config::config_t& current_config = *ctx._local_copy_config; - - assert(input.shm != nullptr); - assert(ctx.shm != nullptr); - animation_shared_memory_t& anim_shm = *ctx.shm; - const auto& input_shm = *input.shm; - auto& animation_player_data = anim_shm.animation_player_data; - const auto current_frame = animation_player_data.frame_index; - //const auto current_row = animation_player_data.sprite_sheet_row; - //const animation_state_row_t current_row_state = state.row_state; - //const auto anim_index = anim_shm.anim_index; - //const platform::timestamp_ms_t last_key_pressed_timestamp = input_shm.last_key_pressed_timestamp; - const auto& current_frames = reinterpret_cast(get_current_animation(ctx)); - - animation_state_row_t new_row_state = state.row_state; - int new_row = animation_player_data.sprite_sheet_row; - int new_start_frame_index = animation_player_data.start_frame_index; - int new_end_frame_index = animation_player_data.end_frame_index; - int new_frame = current_frame; - - /// @TODO: use state machine for animation (states) + new_state.row_state = new_row_state; + new_animation_result.sprite_sheet_row = PKMN_SPRITE_SHEET_ROW; + new_state.animations_index = 0; - // in Writing mode/start writing - new_row = DM_SPRITE_SHEET_ROWS-1; - new_start_frame_index = DM_FRAME_IDLE1; - new_end_frame_index = DM_FRAME_IDLE2; - new_row_state = animation_state_row_t::Writing; - // toggle frame - if (current_frame == DM_FRAME_IDLE1) { - new_frame = DM_FRAME_IDLE2; - - if (input_shm.kpm > 0) { - if (current_config.happy_kpm > 0 && input_shm.kpm >= current_config.happy_kpm) { - if (current_frames.happy.valid) { - if (DM_HAPPY_CHANCE_PERCENT >= 100 || ctx._rng.range(0, 99) < DM_HAPPY_CHANCE_PERCENT) { - BONGOCAT_LOG_VERBOSE("Show Happy Frame at %d KPM", input_shm.kpm); - new_start_frame_index = DM_FRAME_HAPPY; - new_end_frame_index = DM_FRAME_HAPPY; - new_frame = DM_FRAME_HAPPY; - new_row_state = animation_state_row_t::Happy; - } - } + anim_pkmn_process_animation_result_t ret {.row_state = new_state.row_state, .status = anim_pkmn_process_animation_result_status_t::Started}; + switch (new_state.row_state) { + case animation_state_row_t::Idle: + new_animation_result.sprite_sheet_col = current_frames.animations.idle[new_state.animations_index]; + if (current_config.idle_frame) { + new_animation_result.sprite_sheet_col = current_config.idle_frame; } - } - } else if (current_frame == DM_FRAME_IDLE2) { - new_frame = DM_FRAME_IDLE1; - } else { - static_assert(DM_FRAME_IDLE2 >= DM_FRAME_IDLE1); - static_assert(DM_FRAME_IDLE1 >= 0); - static_assert(DM_FRAME_IDLE2 >= 0); - new_frame = static_cast(ctx._rng.range(DM_FRAME_IDLE1, DM_FRAME_IDLE2)); // Frame 0 or 1 (active frames) - } - - const bool changed = anim_shm.animation_player_data.frame_index != new_frame || anim_shm.animation_player_data.sprite_sheet_row != new_row || state.row_state != new_row_state; - if (changed) { - anim_shm.animation_player_data.frame_index = new_frame; - animation_player_data.sprite_sheet_row = new_row; - animation_player_data.start_frame_index = new_start_frame_index; - animation_player_data.end_frame_index = new_end_frame_index; - state.row_state = new_row_state; - if (current_config.enable_debug) { - BONGOCAT_LOG_VERBOSE("Animation frame change: %d", new_frame); - } - state.frame_delta_ms_counter = 0; + break; + case animation_state_row_t::StartWriting: + case animation_state_row_t::Writing: + case animation_state_row_t::EndWriting: + new_animation_result.sprite_sheet_col = current_frames.animations.writing[new_state.animations_index]; + break; + case animation_state_row_t::Happy: + new_animation_result.sprite_sheet_col = current_frames.animations.happy[new_state.animations_index]; + break; + case animation_state_row_t::Sleep: + new_animation_result.sprite_sheet_col = current_frames.animations.sleep[new_state.animations_index]; + break; + case animation_state_row_t::WakeUp: + new_animation_result.sprite_sheet_col = current_frames.animations.wake_up[new_state.animations_index]; + break; + case animation_state_row_t::Boring: + new_animation_result.sprite_sheet_col = current_frames.animations.boring[new_state.animations_index]; + break; + case animation_state_row_t::Test: + new_animation_result.sprite_sheet_col = current_frames.animations.writing[new_state.animations_index]; + break; + case animation_state_row_t::StartWorking: + case animation_state_row_t::Working: + case animation_state_row_t::EndWorking: + new_animation_result.sprite_sheet_col = current_frames.animations.working[new_state.animations_index]; + break; + case animation_state_row_t::StartMoving: + case animation_state_row_t::Moving: + case animation_state_row_t::EndMoving: + new_animation_result.sprite_sheet_col = current_frames.animations.moving[new_state.animations_index]; + break; } - - return { .changed = changed, .new_frame = new_frame}; + return ret; } - - static anim_next_frame_result_t anim_dm_working_next_frame(animation_context_t& ctx, const platform::update::update_context_t& upd, - animation_state_t& state) { + /* + static anim_pkmn_process_animation_result_t anim_pkmn_show_single_frame(animation_context_t& ctx, + animation_state_row_t new_row_state, + animation_player_result_t& new_animation_result, + animation_state_t& new_state, + [[maybe_unused]] const animation_state_t& current_state, + [[maybe_unused]] const pkmn_sprite_sheet_t& current_frames, + const config::config_t& current_config) { using namespace assets; + assert(MAX_ANIMATION_FRAMES > 0); + assert(MAX_ANIMATION_FRAMES <= INT_MAX); - // read-only config - assert(ctx._local_copy_config != nullptr); - const config::config_t& current_config = *ctx._local_copy_config; - - assert(upd.shm != nullptr); - assert(ctx.shm != nullptr); - animation_shared_memory_t& anim_shm = *ctx.shm; - const auto& update_shm = *upd.shm; - auto& animation_player_data = anim_shm.animation_player_data; - const auto current_frame = animation_player_data.frame_index; - //const auto current_row = animation_player_data.sprite_sheet_row; - //const animation_state_row_t current_row_state = state.row_state; - //const auto anim_index = anim_shm.anim_index; - //const platform::timestamp_ms_t last_key_pressed_timestamp = input_shm.last_key_pressed_timestamp; - const auto& current_frames = reinterpret_cast(get_current_animation(ctx)); - - /// @NOTE: add volatile for clobbered warning - volatile animation_state_row_t new_row_state = state.row_state; - int new_row = animation_player_data.sprite_sheet_row; - int new_start_frame_index = animation_player_data.start_frame_index; - int new_end_frame_index = animation_player_data.end_frame_index; - int new_frame = current_frame; - - /// @TODO: use state machine for animation (states) + new_state.row_state = new_row_state; + new_animation_result.sprite_sheet_row = PKMN_SPRITE_SHEET_ROW; + new_state.animations_index = 0; - // in Working mode/start working - new_row = DM_SPRITE_SHEET_ROWS-1; - new_start_frame_index = DM_FRAME_IDLE1; - new_end_frame_index = DM_FRAME_IDLE2; - // toggle frame, show attack animation - const bool above_threshold = current_config.cpu_threshold >= platform::ENABLED_MIN_CPU_PERCENT && (update_shm.avg_cpu_usage >= current_config.cpu_threshold || update_shm.max_cpu_usage >= current_config.cpu_threshold); - const bool lower_threshold = current_config.cpu_threshold >= platform::ENABLED_MIN_CPU_PERCENT && (update_shm.avg_cpu_usage < current_config.cpu_threshold || update_shm.max_cpu_usage < current_config.cpu_threshold); - if (above_threshold) { - if (state.row_state == animation_state_row_t::Idle) { - new_start_frame_index = DM_FRAME_IDLE1; - new_end_frame_index = DM_FRAME_IDLE2; - new_row_state = animation_state_row_t::StartWorking; - new_frame = DM_FRAME_IDLE2; - } else if (update_shm.cpu_active && state.row_state == animation_state_row_t::StartMoving) { - new_row_state = animation_state_row_t::Working; - // show attack/working frame - if (current_frames.attack.valid) { - new_start_frame_index = DM_FRAME_ATTACK; - new_end_frame_index = DM_FRAME_ATTACK; - new_frame = DM_FRAME_ATTACK; - } else if (current_frames.angry.valid) { - new_start_frame_index = DM_FRAME_ANGRY; - new_end_frame_index = DM_FRAME_ANGRY; - new_frame = DM_FRAME_ANGRY; - } else { - // toggle frame - if (current_frame == DM_FRAME_IDLE1) { - new_frame = DM_FRAME_IDLE2; - } else if (current_frame == DM_FRAME_IDLE2) { - new_frame = DM_FRAME_IDLE1; - } else { - static_assert(DM_FRAME_IDLE2 >= DM_FRAME_IDLE1); - static_assert(DM_FRAME_IDLE1 >= 0); - static_assert(DM_FRAME_IDLE2 >= 0); - new_frame = static_cast(ctx._rng.range(DM_FRAME_IDLE1, DM_FRAME_IDLE2)); // Frame 0 or 1 (active frames) - } + anim_pkmn_process_animation_result_t ret {.row_state = new_state.row_state, .status = anim_pkmn_process_animation_result_status_t::Started}; + switch (new_state.row_state) { + case animation_state_row_t::Idle: + new_animation_result.sprite_sheet_col = PKMN_FRAME_IDLE1; + if (current_config.idle_frame) { + new_animation_result.sprite_sheet_col = current_config.idle_frame; } - } else if (!update_shm.cpu_active && (state.row_state == animation_state_row_t::StartMoving || state.row_state == animation_state_row_t::Working)) { - new_row_state = animation_state_row_t::EndWorking; + break; + case animation_state_row_t::StartWriting: + case animation_state_row_t::Writing: + case animation_state_row_t::EndWriting: // toggle frame - if (current_frame == DM_FRAME_IDLE1) { - new_frame = DM_FRAME_IDLE2; - } else if (current_frame == DM_FRAME_IDLE2) { - new_frame = DM_FRAME_IDLE1; + if (new_animation_result.sprite_sheet_col == PKMN_FRAME_IDLE1) { + new_animation_result.sprite_sheet_col = PKMN_FRAME_IDLE2; + } else if (new_animation_result.sprite_sheet_col == PKMN_FRAME_IDLE2) { + new_animation_result.sprite_sheet_col = PKMN_FRAME_IDLE1; } else { - static_assert(DM_FRAME_IDLE2 >= DM_FRAME_IDLE1); - static_assert(DM_FRAME_IDLE1 >= 0); - static_assert(DM_FRAME_IDLE2 >= 0); - new_frame = static_cast(ctx._rng.range(DM_FRAME_IDLE1, DM_FRAME_IDLE2)); // Frame 0 or 1 (active frames) + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? PKMN_FRAME_IDLE1 : PKMN_FRAME_IDLE2; } - } - } else if (lower_threshold) { - if (state.row_state == animation_state_row_t::Working) { - new_row_state = animation_state_row_t::EndWorking; + break; + case animation_state_row_t::Happy: // toggle frame - if (current_frame == DM_FRAME_IDLE1) { - new_frame = DM_FRAME_IDLE2; - } else if (current_frame == DM_FRAME_IDLE2) { - new_frame = DM_FRAME_IDLE1; + if (new_animation_result.sprite_sheet_col == PKMN_FRAME_IDLE1) { + new_animation_result.sprite_sheet_col = PKMN_FRAME_IDLE2; + } else if (new_animation_result.sprite_sheet_col == PKMN_FRAME_IDLE2) { + new_animation_result.sprite_sheet_col = PKMN_FRAME_IDLE1; } else { - static_assert(DM_FRAME_IDLE2 >= DM_FRAME_IDLE1); - static_assert(DM_FRAME_IDLE1 >= 0); - static_assert(DM_FRAME_IDLE2 >= 0); - new_frame = static_cast(ctx._rng.range(DM_FRAME_IDLE1, DM_FRAME_IDLE2)); // Frame 0 or 1 (active frames) + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? PKMN_FRAME_IDLE1 : PKMN_FRAME_IDLE2; } - } else if (state.row_state == animation_state_row_t::EndWorking) { - // back to idle - new_start_frame_index = DM_FRAME_IDLE1; - new_end_frame_index = DM_FRAME_IDLE2; - new_row_state = animation_state_row_t::Idle; - new_frame = DM_FRAME_IDLE1; - } + break; + case animation_state_row_t::Sleep: + new_animation_result.sprite_sheet_col = PKMN_FRAME_IDLE2; + break; + case animation_state_row_t::WakeUp: + new_animation_result.sprite_sheet_col = PKMN_FRAME_IDLE1; + break; + case animation_state_row_t::Boring: + new_animation_result.sprite_sheet_col = PKMN_FRAME_IDLE2; + break; + case animation_state_row_t::Test: + // toggle frame (same as writing?) + if (new_animation_result.sprite_sheet_col == PKMN_FRAME_IDLE1) { + new_animation_result.sprite_sheet_col = PKMN_FRAME_IDLE2; + } else if (new_animation_result.sprite_sheet_col == PKMN_FRAME_IDLE2) { + new_animation_result.sprite_sheet_col = PKMN_FRAME_IDLE1; + } else { + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? PKMN_FRAME_IDLE1 : PKMN_FRAME_IDLE2; + } + break; + case animation_state_row_t::StartWorking: + case animation_state_row_t::Working: + case animation_state_row_t::EndWorking: + // toggle frame (unused) + if (new_animation_result.sprite_sheet_col == PKMN_FRAME_IDLE1) { + new_animation_result.sprite_sheet_col = PKMN_FRAME_IDLE2; + } else if (new_animation_result.sprite_sheet_col == PKMN_FRAME_IDLE2) { + new_animation_result.sprite_sheet_col = PKMN_FRAME_IDLE1; + } else { + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? PKMN_FRAME_IDLE1 : PKMN_FRAME_IDLE2; + } + break; + case animation_state_row_t::StartMoving: + case animation_state_row_t::Moving: + case animation_state_row_t::EndMoving: + // toggle frame (unused) + if (new_animation_result.sprite_sheet_col == PKMN_FRAME_IDLE1) { + new_animation_result.sprite_sheet_col = PKMN_FRAME_IDLE2; + } else if (new_animation_result.sprite_sheet_col == PKMN_FRAME_IDLE2) { + new_animation_result.sprite_sheet_col = PKMN_FRAME_IDLE1; + } else { + new_animation_result.sprite_sheet_col = ctx._rng.range(0, 100) <= 50 ? PKMN_FRAME_IDLE1 : PKMN_FRAME_IDLE2; + } + break; } - - const bool changed = anim_shm.animation_player_data.frame_index != new_frame || anim_shm.animation_player_data.sprite_sheet_row != new_row || state.row_state != new_row_state; - if (changed) { - anim_shm.animation_player_data.frame_index = new_frame; - animation_player_data.sprite_sheet_row = new_row; - animation_player_data.start_frame_index = new_start_frame_index; - animation_player_data.end_frame_index = new_end_frame_index; - state.row_state = new_row_state; - if (current_config.enable_debug) { - BONGOCAT_LOG_VERBOSE("Animation frame change: %d", new_frame); + return ret; + } + */ + + static anim_pkmn_process_animation_result_t anim_pkmn_start_or_process_animation(animation_context_t& ctx, + animation_state_row_t new_row_state, + animation_player_result_t& new_animation_result, + animation_state_t& new_state, + const animation_state_t& current_state, + const pkmn_sprite_sheet_t& current_frames, + const config::config_t& current_config) { + if (current_state.row_state != new_row_state) { + auto result = anim_pkmn_process_animation(new_animation_result, new_state, current_state, current_frames); + if (result.status == anim_pkmn_process_animation_result_status_t::Looped || result.status == anim_pkmn_process_animation_result_status_t::End) { + result = anim_pkmn_restart_animation(ctx, new_row_state, new_animation_result, new_state, current_state, current_frames, current_config); + result.status = anim_pkmn_process_animation_result_status_t::NextAnimationStarted; } - state.frame_delta_ms_counter = 0; + return result; } - return { .changed = changed, .new_frame = new_frame}; + return anim_pkmn_restart_animation(ctx, new_row_state, new_animation_result, new_state, + current_state, current_frames, current_config); } -#endif -#ifdef FEATURE_PKMN_EMBEDDED_ASSETS - static anim_next_frame_result_t anim_pkmn_key_pressed_next_frame(animation_context_t& ctx, [[maybe_unused]] const platform::input::input_context_t& input, - animation_state_t& state) { + static anim_next_frame_result_t anim_pkmn_idle_next_frame(animation_context_t& ctx, [[maybe_unused]] const platform::input::input_context_t& input, + animation_state_t& state, const anim_handle_key_press_result_t& trigger_result) { using namespace assets; - // read-only config assert(ctx._local_copy_config != nullptr); const config::config_t& current_config = *ctx._local_copy_config; - assert(input.shm != nullptr); assert(ctx.shm != nullptr); + assert(input.shm != nullptr); animation_shared_memory_t& anim_shm = *ctx.shm; //const auto& input_shm = *input.shm; - auto& animation_player_data = anim_shm.animation_player_data; - const auto current_frame = animation_player_data.frame_index; - //const auto current_row = animation_player_data.sprite_sheet_row; - //const animation_state_row_t current_row_state = state.row_state; - //const auto anim_index = anim_shm.anim_index; - //const platform::timestamp_ms_t last_key_pressed_timestamp = input_shm.last_key_pressed_timestamp; - //const auto& current_frames = reinterpret_cast(get_current_animation(ctx)); + const auto current_state = state; + const auto& current_animation_result = anim_shm.animation_player_result; + [[maybe_unused]] const int anim_index = anim_shm.anim_index; + assert(get_current_animation(ctx).type == animation_t::Type::Pkmn); + const auto& current_frames = get_current_animation(ctx).pkmn; - animation_state_row_t new_row_state = state.row_state; - int new_row = animation_player_data.sprite_sheet_row; - int new_start_frame_index = animation_player_data.start_frame_index; - int new_end_frame_index = animation_player_data.end_frame_index; - int new_frame = current_frame; + auto new_animation_result = anim_shm.animation_player_result; + auto new_state = state; - /// @TODO: use state machine for animation (states) + const auto conditions = get_anim_conditions(ctx, input, current_state, trigger_result.trigger, current_config); - // in Writing mode/start writing - new_row = PKMN_SPRITE_SHEET_ROWS-1; - new_start_frame_index = PKMN_FRAME_IDLE1; - new_end_frame_index = PKMN_FRAME_IDLE2; - new_row_state = animation_state_row_t::Writing; - // toggle frame - if (current_frame == PKMN_FRAME_IDLE1) { - new_frame = PKMN_FRAME_IDLE2; - } else if (current_frame == PKMN_FRAME_IDLE2) { - new_frame = PKMN_FRAME_IDLE1; + // Idle Animation + const bool stop_writing = conditions.is_writing && conditions.release_frame_after_press; + if (stop_writing) { + // back to idle + anim_pkmn_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); } else { - static_assert(PKMN_FRAME_IDLE2 >= PKMN_FRAME_IDLE1); - static_assert(PKMN_FRAME_IDLE1 >= 0); - static_assert(PKMN_FRAME_IDLE2 >= 0); - new_frame = static_cast(ctx._rng.range(PKMN_FRAME_IDLE1, PKMN_FRAME_IDLE2)); // Frame 0 or 1 (active frames) + // continues animations + if (current_state.row_state == animation_state_row_t::Idle) { + if (conditions.process_idle_animation) { + // Idle Animation + anim_pkmn_process_animation(new_animation_result, new_state, current_state, current_frames); + } + } } - const bool changed = anim_shm.animation_player_data.frame_index != new_frame || anim_shm.animation_player_data.sprite_sheet_row != new_row || state.row_state != new_row_state; - if (changed) { - anim_shm.animation_player_data.frame_index = new_frame; - animation_player_data.sprite_sheet_row = new_row; - animation_player_data.start_frame_index = new_start_frame_index; - animation_player_data.end_frame_index = new_end_frame_index; - state.row_state = new_row_state; - if (current_config.enable_debug) { - BONGOCAT_LOG_VERBOSE("Animation frame change: %d", new_frame); + const bool is_sleeping_time = current_config.enable_scheduled_sleep && is_sleep_time(current_config); + + // Sleep Mode + if (current_config.enable_scheduled_sleep) { + if (is_sleeping_time) { + if (current_state.row_state == animation_state_row_t::Idle) { + anim_pkmn_restart_animation(ctx, animation_state_row_t::Sleep, + new_animation_result, new_state, + current_state, current_frames, current_config); + new_state.is_idle_sleep = false; + } + } else { + if (current_state.row_state == animation_state_row_t::Sleep && !current_state.is_idle_sleep) { + if (conditions.release_frame_for_non_idle) { + // back to idle + anim_pkmn_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + } + } + } else { + if (current_state.row_state == animation_state_row_t::Sleep && !current_state.is_idle_sleep) { + if (conditions.release_frame_for_non_idle) { + // back to idle + anim_pkmn_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); + } } - state.frame_delta_ms_counter = 0; } - return { .changed = changed, .new_frame = new_frame}; + return anim_update_animation_state(anim_shm, state, + new_animation_result, new_state, + current_animation_result, current_state, + current_config); } -#endif -#ifdef FEATURE_MS_AGENT_EMBEDDED_ASSETS - static anim_next_frame_result_t anim_ms_pet_key_pressed_next_frame(animation_context_t& ctx, - animation_state_t& state) { + static anim_next_frame_result_t anim_pkmn_key_pressed_next_frame(animation_context_t& ctx, [[maybe_unused]] const platform::input::input_context_t& input, + animation_state_t& state, + const animation_trigger_t& trigger) { using namespace assets; // read-only config @@ -1280,85 +2626,60 @@ namespace bongocat::animation { const config::config_t& current_config = *ctx._local_copy_config; assert(ctx.shm != nullptr); + assert(input.shm != nullptr); animation_shared_memory_t& anim_shm = *ctx.shm; //const auto& input_shm = *input.shm; - auto& animation_player_data = anim_shm.animation_player_data; - const auto current_frame = animation_player_data.frame_index; - //const auto current_row = animation_player_data.sprite_sheet_row; - //const animation_state_row_t current_row_state = state.row_state; - //const auto anim_index = anim_shm.anim_index; + const auto current_state = state; + const auto& current_animation_result = anim_shm.animation_player_result; + [[maybe_unused]] const int anim_index = anim_shm.anim_index; //const platform::timestamp_ms_t last_key_pressed_timestamp = input_shm.last_key_pressed_timestamp; + assert(get_current_animation(ctx).type == animation_t::Type::Pkmn); + const auto& current_frames = get_current_animation(ctx).pkmn; - volatile animation_state_row_t new_row_state = state.row_state; - auto new_row = animation_player_data.sprite_sheet_row; - auto new_start_frame_index = animation_player_data.start_frame_index; - auto new_end_frame_index = animation_player_data.end_frame_index; - auto new_frame = current_frame; - - /// @TODO: use state machine for animation (states) + auto new_animation_result = anim_shm.animation_player_result; + auto new_state = state; - assert(anim_shm.anim_index >= 0); - const ms_agent_animation_indices_t animation_indices = get_ms_agent_animation_indices(static_cast(anim_shm.anim_index)); + const auto conditions = get_anim_conditions(ctx, input, current_state, trigger, current_config); // in Writing mode/start writing - switch (state.row_state) { - case animation_state_row_t::StartMoving: - case animation_state_row_t::Moving: - case animation_state_row_t::EndMoving: - // moving not supported - case animation_state_row_t::Test: - case animation_state_row_t::Happy: - case animation_state_row_t::Idle: - // START Writing - new_start_frame_index = animation_indices.start_index_frame_start_writing; - new_end_frame_index = animation_indices.end_index_frame_start_writing; - new_frame = new_start_frame_index; - new_row = MS_AGENT_SPRITE_SHEET_ROW_START_WRITING; - new_row_state = animation_state_row_t::StartWriting; - break; - case animation_state_row_t::StartWriting: - case animation_state_row_t::Writing: - case animation_state_row_t::EndWriting: - // start end writing and process animation in anim_ms_pet_idle_next_frame - break; - case animation_state_row_t::Sleep: - // wake up when sleeping - new_row = MS_AGENT_SPRITE_SHEET_ROW_WAKE_UP; - new_start_frame_index = animation_indices.start_index_frame_wake_up; - new_end_frame_index = animation_indices.end_index_frame_sleep; - new_frame = new_start_frame_index; - new_row_state = animation_state_row_t::WakeUp; - case animation_state_row_t::WakeUp: - // process animation in anim_ms_pet_idle_next_frame - break; - case animation_state_row_t::Boring: - // process animation in anim_ms_pet_idle_next_frame - break; - case animation_state_row_t::StartWorking: - case animation_state_row_t::Working: - case animation_state_row_t::EndWorking: - // start end writing and process animation in anim_ms_pet_idle_next_frame - break; + if (!conditions.is_writing) { + if (state.row_state == animation_state_row_t::Sleep && current_state.is_idle_sleep) { + // wake up + anim_pkmn_restart_animation(ctx, animation_state_row_t::WakeUp, + new_animation_result, new_state, + current_state, current_frames, current_config); + } else if (state.row_state == animation_state_row_t::Idle || conditions.is_moving) { + // start writing + anim_pkmn_restart_animation(ctx, animation_state_row_t::StartWriting, + new_animation_result, new_state, + current_state, current_frames, current_config); + } + } else if (state.row_state == animation_state_row_t::StartWriting) { + anim_pkmn_start_or_process_animation(ctx, animation_state_row_t::Writing, + new_animation_result, new_state, + current_state, current_frames, current_config); } - const bool changed = anim_shm.animation_player_data.frame_index != new_frame || anim_shm.animation_player_data.sprite_sheet_row != new_row || state.row_state != new_row_state; - if (changed) { - anim_shm.animation_player_data.frame_index = new_frame; - animation_player_data.sprite_sheet_row = new_row; - animation_player_data.start_frame_index = new_start_frame_index; - animation_player_data.end_frame_index = new_end_frame_index; - state.row_state = new_row_state; - if (current_config.enable_debug) { - BONGOCAT_LOG_VERBOSE("Key pressed Animation frame change: %d", new_frame); + if (conditions.is_writing) { + if (conditions.continue_writing) { + // keep writing + anim_pkmn_process_animation(new_animation_result, new_state, current_state, current_frames); } - state.frame_delta_ms_counter = 0; + } else if (((!conditions.is_writing && state.row_state == animation_state_row_t::Idle) || state.row_state == animation_state_row_t::WakeUp) && conditions.release_frame_after_press) { + // back to idle + anim_pkmn_restart_animation(ctx, animation_state_row_t::Idle, + new_animation_result, new_state, + current_state, current_frames, current_config); } - return { .changed = changed, .new_frame = new_frame }; + return anim_update_animation_state(anim_shm, state, + new_animation_result, new_state, + current_animation_result, current_state, + current_config); } #endif - static bool anim_handle_idle_animation(animation_context_t& ctx, + static anim_next_frame_result_t anim_handle_idle_animation(animation_context_t& ctx, [[maybe_unused]] const platform::input::input_context_t& input, [[maybe_unused]] const platform::update::update_context_t& upd, animation_state_t& state, const anim_handle_key_press_result_t& trigger_result) { @@ -1378,42 +2699,33 @@ namespace bongocat::animation { //const animation_state_row_t current_row_state = state.row_state; //const int anim_index = anim_shm.anim_index; - bool ret = false; switch (anim_shm.anim_type) { case config::config_animation_sprite_sheet_layout_t::None: break; case config::config_animation_sprite_sheet_layout_t::Bongocat: { #ifdef FEATURE_BONGOCAT_EMBEDDED_ASSETS - auto [changed, new_frame] = anim_bongocat_idle_next_frame(ctx, input, state, trigger_result); - ret = changed; + return anim_bongocat_idle_next_frame(ctx, input, state, trigger_result); #endif }break; case config::config_animation_sprite_sheet_layout_t::Dm: { #ifdef FEATURE_ENABLE_DM_EMBEDDED_ASSETS - auto [changed, new_frame] = anim_dm_idle_next_frame(ctx, input, upd, state, trigger_result); - ret = changed; + return anim_dm_idle_next_frame(ctx, input, upd, state, trigger_result); #endif }break; case config::config_animation_sprite_sheet_layout_t::Pkmn: { #ifdef FEATURE_PKMN_EMBEDDED_ASSETS - auto [changed, new_frame] = anim_pkmn_idle_next_frame(ctx, input, state, trigger_result); - ret = changed; + return anim_pkmn_idle_next_frame(ctx, input, state, trigger_result); #endif }break; case config::config_animation_sprite_sheet_layout_t::MsAgent: { #ifdef FEATURE_MS_AGENT_EMBEDDED_ASSETS - auto [changed, new_frame] = anim_ms_pet_idle_next_frame(ctx, input, state, trigger_result); - ret = changed; + return anim_ms_agent_idle_next_frame(ctx, input, state, trigger_result); #endif }break; } - return ret; + return {}; } - struct animation_trigger_t { - trigger_animation_cause_mask_t triggered_anim_cause{trigger_animation_cause_mask_t::NONE}; - int any_key_press_counter{0}; - }; static anim_handle_key_press_result_t anim_handle_animation_trigger(animation_session_t& animation_trigger_ctx, animation_state_t& state, const animation_trigger_t& trigger) { using namespace assets; @@ -1436,17 +2748,14 @@ namespace bongocat::animation { assert(ctx.shm != nullptr); animation_shared_memory_t& anim_shm = *ctx.shm; //const auto& input_shm = *input.shm; - auto& animation_player_data = anim_shm.animation_player_data; - const int current_frame = animation_player_data.frame_index; - //const int current_row = animation_player_data.sprite_sheet_row; - //const animation_state_row_t current_row_state = state.row_state; - //const int anim_index = anim_shm.anim_index; + //const auto current_state = state; + //const auto& current_animation_result = anim_shm.animation_player_result; + [[maybe_unused]] const int anim_index = anim_shm.anim_index; - bool ret = false; - [[maybe_unused]] int ret_new_frame = current_frame; + anim_next_frame_result_t update_frame_result{}; // handle working animation - if (has_flag(trigger.triggered_anim_cause, trigger_animation_cause_mask_t::CpuUpdate)) { + if (has_flag(trigger.anim_cause, trigger_animation_cause_mask_t::CpuUpdate)) { switch (anim_shm.anim_type) { case config::config_animation_sprite_sheet_layout_t::None: break; @@ -1454,57 +2763,50 @@ namespace bongocat::animation { break; case config::config_animation_sprite_sheet_layout_t::Dm: { #ifdef FEATURE_ENABLE_DM_EMBEDDED_ASSETS - auto [changed, new_frame] = anim_dm_working_next_frame(ctx, upd, state); - ret = changed; - ret_new_frame = new_frame; + update_frame_result = anim_dm_working_next_frame(ctx, input, upd, state, trigger); #endif }break; case config::config_animation_sprite_sheet_layout_t::Pkmn: break; - case config::config_animation_sprite_sheet_layout_t::MsAgent: - break; + case config::config_animation_sprite_sheet_layout_t::MsAgent: { +#ifdef FEATURE_MS_AGENT_EMBEDDED_ASSETS + //update_frame_result = anim_ms_agent_working_next_frame(ctx, upd, state); +#endif + }break; } - BONGOCAT_LOG_VERBOSE("CPU update detected - switching to frame %d (%zu)", ret_new_frame, trigger.triggered_anim_cause); + BONGOCAT_LOG_VERBOSE("CPU update detected - switching to frame %d (%zu)", update_frame_result.new_col, trigger.anim_cause); } // handle key press animation - if (has_flag(trigger.triggered_anim_cause, trigger_animation_cause_mask_t::KeyPress)) { + if (has_flag(trigger.anim_cause, trigger_animation_cause_mask_t::KeyPress)) { switch (anim_shm.anim_type) { case config::config_animation_sprite_sheet_layout_t::None: break; case config::config_animation_sprite_sheet_layout_t::Bongocat: { #ifdef FEATURE_BONGOCAT_EMBEDDED_ASSETS - auto [changed, new_frame] = anim_bongocat_key_pressed_next_frame(ctx, state); - ret = changed; - ret_new_frame = new_frame; + update_frame_result = anim_bongocat_key_pressed_next_frame(ctx, state, input, trigger); #endif }break; case config::config_animation_sprite_sheet_layout_t::Dm: { #ifdef FEATURE_ENABLE_DM_EMBEDDED_ASSETS - auto [changed, new_frame] = anim_dm_key_pressed_next_frame(ctx, input, state); - ret = changed; - ret_new_frame = new_frame; + update_frame_result = anim_dm_key_pressed_next_frame(ctx, input, state, trigger); #endif }break; case config::config_animation_sprite_sheet_layout_t::Pkmn: { #ifdef FEATURE_PKMN_EMBEDDED_ASSETS - auto [changed, new_frame] = anim_pkmn_key_pressed_next_frame(ctx, input, state); - ret = changed; - ret_new_frame = new_frame; + update_frame_result = anim_pkmn_key_pressed_next_frame(ctx, input, state, trigger); #endif }break; case config::config_animation_sprite_sheet_layout_t::MsAgent: { #ifdef FEATURE_MS_AGENT_EMBEDDED_ASSETS - auto [changed, new_frame] = anim_ms_pet_key_pressed_next_frame(ctx, state); - ret = changed; - ret_new_frame = new_frame; + update_frame_result = anim_ms_agent_key_pressed_next_frame(ctx, state, input, trigger); #endif }break; } - BONGOCAT_LOG_VERBOSE("Key press detected - switching to frame %d (%zu)", ret_new_frame, trigger.triggered_anim_cause); + BONGOCAT_LOG_VERBOSE("Key press detected - switching to frame %d (%zu)", update_frame_result.new_col, trigger.anim_cause); } - return { .any_key_press_counter = trigger.any_key_press_counter, .changed = ret, .triggered_anim_cause = trigger.triggered_anim_cause }; + return { .trigger = trigger, .update_frame_result = update_frame_result}; } static bool anim_update_state(animation_session_t& animation_trigger_ctx, animation_state_t& state, const animation_trigger_t& trigger) { @@ -1519,31 +2821,38 @@ namespace bongocat::animation { bool ret = false; { state.frame_delta_ms_counter += state.frame_time_ms; + state.update_delta_ms_counter += state.frame_time_ms; anim_handle_key_press_result_t trigger_result; - bool idle_changed = false; + anim_next_frame_result_t idle_update_result; bool hold_frame = false; bool key_pressed = false; { platform::LockGuard input_guard (input.input_lock); platform::LockGuard update_guard (upd.update_lock); trigger_result = anim_handle_animation_trigger(animation_trigger_ctx, state, trigger); - hold_frame = has_flag(trigger_result.triggered_anim_cause, trigger_animation_cause_mask_t::KeyPress) || has_flag(trigger_result.triggered_anim_cause, trigger_animation_cause_mask_t::CpuUpdate); - idle_changed = anim_handle_idle_animation(ctx, input, upd, state, trigger_result); + idle_update_result = anim_handle_idle_animation(ctx, input, upd, state, trigger_result); + key_pressed = has_flag(trigger_result.trigger.anim_cause, trigger_animation_cause_mask_t::KeyPress) && trigger_result.trigger.any_key_press_counter > 0; + hold_frame = key_pressed || idle_update_result.frame_changed || idle_update_result.rerender; } - key_pressed = has_flag(trigger_result.triggered_anim_cause, trigger_animation_cause_mask_t::KeyPress) && trigger_result.any_key_press_counter > 0; - ret = idle_changed || trigger_result.changed; + ret = idle_update_result.rerender || trigger_result.update_frame_result.rerender; if (key_pressed) { BONGOCAT_LOG_VERBOSE("Trigger key press animation"); } - if (idle_changed) { - BONGOCAT_LOG_VERBOSE("Trigger idle animation"); + if (idle_update_result.frame_changed) { + BONGOCAT_LOG_VERBOSE("Trigger frame changed"); + } + if (idle_update_result.moved) { + BONGOCAT_LOG_VERBOSE("Trigger movement animation"); + } + if (idle_update_result.rerender) { + BONGOCAT_LOG_VERBOSE("Trigger rerender"); } if (!state.hold_frame_after_release && hold_frame) { state.hold_frame_after_release = true; } - if (state.hold_frame_after_release && (!key_pressed && !hold_frame) && state.hold_frame_ms > current_config.keypress_duration_ms && idle_changed) { + if (state.hold_frame_after_release && (!key_pressed && !hold_frame) && state.hold_frame_ms > current_config.keypress_duration_ms) { state.hold_frame_after_release = false; state.hold_frame_ms = 0; } @@ -1567,11 +2876,11 @@ namespace bongocat::animation { state.hold_frame_ms = 0; state.frame_delta_ms_counter = 0; + state.update_delta_ms_counter = 0; state.frame_time_ns = 1000000000LL / current_config.fps; state.frame_time_ms = state.frame_time_ns/1000000LL; state.last_frame_update_ms = platform::get_current_time_ms(); state.row_state = animation_state_row_t::Idle; - state.boring_frame_showed = false; } static void cleanup_anim_thread(void* arg) { @@ -1606,9 +2915,14 @@ namespace bongocat::animation { { platform::LockGuard guard (trigger_ctx.anim.anim_lock); animation_context_t& ctx = trigger_ctx.anim; + assert(ctx.shm != nullptr); + //assert(input.shm != nullptr); animation_shared_memory_t& anim_shm = *ctx.shm; - auto& animation_player_data = anim_shm.animation_player_data; + //const auto& input_shm = *input.shm; + //auto& current_state = state; + auto& current_animation_result = anim_shm.animation_player_result; + [[maybe_unused]] const int anim_index = anim_shm.anim_index; // read-only config assert(ctx._local_copy_config != nullptr); @@ -1622,28 +2936,25 @@ namespace bongocat::animation { break; case config::config_animation_sprite_sheet_layout_t::Bongocat: #ifdef FEATURE_BONGOCAT_EMBEDDED_ASSETS - animation_player_data.frame_index = current_config.idle_frame; - animation_player_data.sprite_sheet_row = assets::BONGOCAT_SPRITE_SHEET_ROWS-1; - animation_player_data.start_frame_index = 0; - animation_player_data.end_frame_index = 1; + current_animation_result.sprite_sheet_col = current_config.idle_frame; + current_animation_result.sprite_sheet_row = BONGOCAT_SPRITE_SHEET_ROW; + state.animations_index = 0; state.row_state = animation_state_row_t::Idle; #endif break; case config::config_animation_sprite_sheet_layout_t::Dm: #ifdef FEATURE_ENABLE_DM_EMBEDDED_ASSETS - animation_player_data.frame_index = current_config.idle_frame; - animation_player_data.sprite_sheet_row = assets::DM_SPRITE_SHEET_ROWS-1; - animation_player_data.start_frame_index = 0; - animation_player_data.end_frame_index = 1; + current_animation_result.sprite_sheet_col = current_config.idle_frame; + current_animation_result.sprite_sheet_row = DM_SPRITE_SHEET_ROW; + state.animations_index = 0; state.row_state = animation_state_row_t::Idle; #endif break; case config::config_animation_sprite_sheet_layout_t::Pkmn: #ifdef FEATURE_PKMN_EMBEDDED_ASSETS - animation_player_data.frame_index = current_config.idle_frame; - animation_player_data.sprite_sheet_row = assets::PKMN_SPRITE_SHEET_ROWS-1; - animation_player_data.start_frame_index = 0; - animation_player_data.end_frame_index = 1; + current_animation_result.sprite_sheet_col = current_config.idle_frame; + current_animation_result.sprite_sheet_row = PKMN_SPRITE_SHEET_ROW; + state.animations_index = 0; state.row_state = animation_state_row_t::Idle; #endif break; @@ -1651,10 +2962,10 @@ namespace bongocat::animation { #ifdef FEATURE_MS_AGENT_EMBEDDED_ASSETS assert(anim_shm.anim_index >= 0); const ms_agent_animation_indices_t animation_indices = get_ms_agent_animation_indices(static_cast(anim_shm.anim_index)); - animation_player_data.frame_index = current_config.idle_frame; - animation_player_data.sprite_sheet_row = assets::MS_AGENT_SPRITE_SHEET_ROW_IDLE; - animation_player_data.start_frame_index = animation_indices.start_index_frame_idle; - animation_player_data.end_frame_index = animation_indices.end_index_frame_idle; + current_animation_result.sprite_sheet_col = current_config.idle_frame; + current_animation_result.sprite_sheet_row = MS_AGENT_SPRITE_SHEET_ROW_IDLE; + state.start_col_index = animation_indices.start_index_frame_idle; + state.end_col_index = animation_indices.end_index_frame_idle; state.row_state = animation_state_row_t::Idle; #endif }break; @@ -1782,7 +3093,7 @@ namespace bongocat::animation { platform::LockGuard guard (trigger_ctx.anim.anim_lock); assert(ctx.shm != nullptr); const bool frame_changed = anim_update_state(trigger_ctx, state, { - .triggered_anim_cause = triggered_anim_cause, + .anim_cause = triggered_anim_cause, .any_key_press_counter = any_key_press_counter, }); if (frame_changed) { @@ -1817,14 +3128,13 @@ namespace bongocat::animation { } while ((now.tv_sec > next_frame_time.tv_sec) || (now.tv_sec == next_frame_time.tv_sec && now.tv_nsec > next_frame_time.tv_nsec)); - ctx.shm->animation_player_data.time_until_next_frame_ms = 0; + state.time_until_next_frame_ms = 0; //BONGOCAT_LOG_VERBOSE("Animation skipped frame(s) to catch up"); } else { // Sleep until the next frame using absolute time const auto sec_diff = next_frame_time.tv_sec - now.tv_sec; const auto nsec_diff = next_frame_time.tv_nsec - now.tv_nsec; - ctx.shm->animation_player_data.time_until_next_frame_ms = - static_cast(sec_diff * 1000L + (nsec_diff + 999999LL) / 1000000LL); + state.time_until_next_frame_ms = static_cast(sec_diff * 1000L + (nsec_diff + 999999LL) / 1000000LL); if (clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &next_frame_time, nullptr) != 0) { // Interrupted, just continue @@ -1962,7 +3272,13 @@ namespace bongocat::animation { return DM20_ANIM_COUNT > 0 ? static_cast(rng.range(0, DM20_ANIM_COUNT-1)) : 0; case config::config_animation_dm_set_t::dmx: assert(DMX_ANIM_COUNT<= INT32_MAX && DMX_ANIM_COUNT <= UINT32_MAX); - return DMX_ANIM_COUNT > 0 ? static_cast(rng.range(0, DMX_ANIM_COUNT-1)) : 0; + return DMX_ANIM_COUNT > 0 ? static_cast(rng.range(0, DMX_ANIM_COUNT-1)) : 0; + case config::config_animation_dm_set_t::pen: + assert(PEN_ANIM_COUNT <= INT32_MAX && PEN_ANIM_COUNT <= UINT32_MAX); + return PEN_ANIM_COUNT > 0 ? static_cast(rng.range(0, PEN_ANIM_COUNT-1)) : 0; + case config::config_animation_dm_set_t::pen20: + assert(PEN20_ANIM_COUNT <= INT32_MAX && PEN20_ANIM_COUNT <= UINT32_MAX); + return PEN20_ANIM_COUNT > 0 ? static_cast(rng.range(0, PEN20_ANIM_COUNT-1)) : 0; case config::config_animation_dm_set_t::dmc: assert(DMC_ANIM_COUNT <= INT32_MAX && DMC_ANIM_COUNT <= UINT32_MAX); return DMC_ANIM_COUNT > 0 ? static_cast(rng.range(0, DMC_ANIM_COUNT-1)) : 0; @@ -1988,26 +3304,32 @@ namespace bongocat::animation { return ctx.shm->bongocat_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->bongocat_anims.count-1))) : 0; case config::config_animation_sprite_sheet_layout_t::Dm: switch (ctx.shm->anim_dm_set) { - case config::config_animation_dm_set_t::None: - return config.animation_index; - case config::config_animation_dm_set_t::min_dm: - assert(ctx.shm->min_dm_anims.count <= INT32_MAX && ctx.shm->min_dm_anims.count <= UINT32_MAX); - return ctx.shm->min_dm_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->min_dm_anims.count-1))) : 0; - case config::config_animation_dm_set_t::dm: - assert(ctx.shm->dm_anims.count <= INT32_MAX && ctx.shm->dm_anims.count <= UINT32_MAX); - return ctx.shm->dm_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->dm_anims.count-1))) : 0; - case config::config_animation_dm_set_t::dm20: - assert(ctx.shm->dm20_anims.count <= INT32_MAX && ctx.shm->dm20_anims.count <= UINT32_MAX); - return ctx.shm->dm20_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->dm20_anims.count-1))) : 0; - case config::config_animation_dm_set_t::dmx: - assert(ctx.shm->dmx_anims.count <= INT32_MAX && ctx.shm->dmx_anims.count <= UINT32_MAX); - return ctx.shm->dmx_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->dmx_anims.count-1))) : 0; - case config::config_animation_dm_set_t::dmc: - assert(ctx.shm->dmc_anims.count <= INT32_MAX && ctx.shm->dmc_anims.count <= UINT32_MAX); - return ctx.shm->dmc_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->dmc_anims.count-1))) : 0; - case config::config_animation_dm_set_t::dmall: - assert(ctx.shm->dmall_anims.count <= INT32_MAX && ctx.shm->dmall_anims.count <= UINT32_MAX); - return ctx.shm->dmall_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->dmall_anims.count-1))) : 0; + case config::config_animation_dm_set_t::None: + return config.animation_index; + case config::config_animation_dm_set_t::min_dm: + assert(ctx.shm->min_dm_anims.count <= INT32_MAX && ctx.shm->min_dm_anims.count <= UINT32_MAX); + return ctx.shm->min_dm_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->min_dm_anims.count-1))) : 0; + case config::config_animation_dm_set_t::dm: + assert(ctx.shm->dm_anims.count <= INT32_MAX && ctx.shm->dm_anims.count <= UINT32_MAX); + return ctx.shm->dm_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->dm_anims.count-1))) : 0; + case config::config_animation_dm_set_t::dm20: + assert(ctx.shm->dm20_anims.count <= INT32_MAX && ctx.shm->dm20_anims.count <= UINT32_MAX); + return ctx.shm->dm20_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->dm20_anims.count-1))) : 0; + case config::config_animation_dm_set_t::dmx: + assert(ctx.shm->dmx_anims.count <= INT32_MAX && ctx.shm->dmx_anims.count <= UINT32_MAX); + return ctx.shm->dmx_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->dmx_anims.count-1))) : 0; + case config::config_animation_dm_set_t::pen: + assert(ctx.shm->pen_anims.count <= INT32_MAX && ctx.shm->pen_anims.count <= UINT32_MAX); + return ctx.shm->pen_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->pen_anims.count-1))) : 0; + case config::config_animation_dm_set_t::pen20: + assert(ctx.shm->pen20_anims.count <= INT32_MAX && ctx.shm->pen20_anims.count <= UINT32_MAX); + return ctx.shm->pen20_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->pen20_anims.count-1))) : 0; + case config::config_animation_dm_set_t::dmc: + assert(ctx.shm->dmc_anims.count <= INT32_MAX && ctx.shm->dmc_anims.count <= UINT32_MAX); + return ctx.shm->dmc_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->dmc_anims.count-1))) : 0; + case config::config_animation_dm_set_t::dmall: + assert(ctx.shm->dmall_anims.count <= INT32_MAX && ctx.shm->dmall_anims.count <= UINT32_MAX); + return ctx.shm->dmall_anims.count > 0 ? static_cast(rng.range(0, static_cast(ctx.shm->dmall_anims.count-1))) : 0; } break; case config::config_animation_sprite_sheet_layout_t::Pkmn: @@ -2041,7 +3363,7 @@ namespace bongocat::animation { ctx.shm->anim_index = old_anim_index; } } - ctx.shm->animation_player_data.frame_index = !ctx._local_copy_config->idle_animation ? ctx._local_copy_config->idle_frame : ctx.shm->animation_player_data.frame_index; // initial frame + ctx.shm->animation_player_result.sprite_sheet_col = !ctx._local_copy_config->idle_animation ? ctx._local_copy_config->idle_frame : ctx.shm->animation_player_result.sprite_sheet_col; // initial frame [[maybe_unused]] const auto t1 = platform::get_current_time_us(); diff --git a/src/graphics/animation_init.cpp b/src/graphics/animation_init.cpp index b4b88187..d67e43da 100644 --- a/src/graphics/animation_init.cpp +++ b/src/graphics/animation_init.cpp @@ -17,8 +17,10 @@ #include "embedded_assets/dm/dm_sprite.h" #include "embedded_assets/min_dm/min_dm_sprite.h" #include "embedded_assets/dm20/dm20_sprite.h" -#include "embedded_assets/dmc/dmc_sprite.h" #include "embedded_assets/dmx/dmx_sprite.h" +#include "embedded_assets/pen/pen_sprite.h" +#include "embedded_assets/pen20/pen20_sprite.h" +#include "embedded_assets/dmc/dmc_sprite.h" #include "embedded_assets/dmall/dmall_sprite.h" #include "graphics/embedded_assets_pkmn.h" #include "embedded_assets/pkmn/pkmn_sprite.h" @@ -29,8 +31,10 @@ #include "image_loader/dm/load_images_dm.h" #include "image_loader/min_dm/load_images_min_dm.h" #include "image_loader/dm20/load_images_dm20.h" -#include "image_loader/dmc/load_images_dmc.h" #include "image_loader/dmx/load_images_dmx.h" +#include "image_loader/pen/load_images_pen.h" +#include "image_loader/pen20/load_images_pen20.h" +#include "image_loader/dmc/load_images_dmc.h" #include "image_loader/dmall/load_images_dmall.h" #include "image_loader/pkmn/load_images_pkmn.h" @@ -60,10 +64,7 @@ namespace bongocat::animation { switch (anim_shm.anim_type) { case config::config_animation_sprite_sheet_layout_t::None: // unload other sprite sheets - cleanup_animation(anim_shm.bongocat_sprite_sheet); - cleanup_animation(anim_shm.dm_sprite_sheet); - cleanup_animation(anim_shm.ms_agent_sprite_sheet); - cleanup_animation(anim_shm.pkmn_sprite_sheet); + cleanup_animation(anim_shm.anim); break; case config::config_animation_sprite_sheet_layout_t::Bongocat: { if constexpr (features::EnableBongocatEmbeddedAssets) { @@ -71,16 +72,12 @@ namespace bongocat::animation { if (error != bongocat_error_t::BONGOCAT_SUCCESS) [[unlikely]] { return error; } - anim_shm.bongocat_sprite_sheet = bongocat::move(result); - // unload other sprite sheets - cleanup_animation(anim_shm.dm_sprite_sheet); - cleanup_animation(anim_shm.ms_agent_sprite_sheet); - cleanup_animation(anim_shm.pkmn_sprite_sheet); + anim_shm.anim = bongocat::move(result); } }break; case config::config_animation_sprite_sheet_layout_t::Dm: { bongocat_error_t error = bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM; - dm_animation_t result; + dm_sprite_sheet_t result; switch (anim_shm.anim_dm_set) { case config::config_animation_dm_set_t::None: cleanup_animation(result); @@ -114,6 +111,20 @@ namespace bongocat::animation { error = bongocat::move(l_error); } }break; + case config::config_animation_dm_set_t::pen:{ + if constexpr (features::EnablePenEmbeddedAssets) { + auto [l_result, l_error] = load_pen_sprite_sheet(ctx, anim_index); + result = bongocat::move(l_result); + error = bongocat::move(l_error); + } + }break; + case config::config_animation_dm_set_t::pen20:{ + if constexpr (features::EnablePen20EmbeddedAssets) { + auto [l_result, l_error] = load_pen20_sprite_sheet(ctx, anim_index); + result = bongocat::move(l_result); + error = bongocat::move(l_error); + } + }break; case config::config_animation_dm_set_t::dmc:{ if constexpr (features::EnableDmcEmbeddedAssets) { auto [l_result, l_error] = load_dmc_sprite_sheet(ctx, anim_index); @@ -132,11 +143,7 @@ namespace bongocat::animation { if (error != bongocat_error_t::BONGOCAT_SUCCESS) { return error; } - anim_shm.dm_sprite_sheet = bongocat::move(result); - // unload other sprite sheets - cleanup_animation(anim_shm.bongocat_sprite_sheet); - cleanup_animation(anim_shm.ms_agent_sprite_sheet); - cleanup_animation(anim_shm.pkmn_sprite_sheet); + anim_shm.anim = bongocat::move(result); }break; case config::config_animation_sprite_sheet_layout_t::Pkmn: if constexpr (features::EnablePkmnEmbeddedAssets) { @@ -144,11 +151,7 @@ namespace bongocat::animation { if (error != bongocat_error_t::BONGOCAT_SUCCESS) { return error; } - anim_shm.pkmn_sprite_sheet = bongocat::move(result); - // unload other sprite sheets - cleanup_animation(anim_shm.bongocat_sprite_sheet); - cleanup_animation(anim_shm.dm_sprite_sheet); - cleanup_animation(anim_shm.ms_agent_sprite_sheet); + anim_shm.anim = bongocat::move(result); } break; case config::config_animation_sprite_sheet_layout_t::MsAgent: @@ -157,11 +160,7 @@ namespace bongocat::animation { if (error != bongocat_error_t::BONGOCAT_SUCCESS) { return error; } - anim_shm.ms_agent_sprite_sheet = bongocat::move(result); - // unload other sprite sheets - cleanup_animation(anim_shm.bongocat_sprite_sheet); - cleanup_animation(anim_shm.dm_sprite_sheet); - cleanup_animation(anim_shm.pkmn_sprite_sheet); + anim_shm.anim = bongocat::move(result); } break; /// @NOTE(assets): 6. add hot reload asset @@ -189,7 +188,8 @@ namespace bongocat::animation { return none_sprite_sheet; case config::config_animation_sprite_sheet_layout_t::Bongocat: { if (features::EnableLazyLoadAssets) { - return reinterpret_cast(anim_shm.bongocat_sprite_sheet); + assert(anim_shm.anim.type == animation_t::Type::Bongocat); + return anim_shm.anim; } assert(anim_index >= 0); return static_cast(anim_index) < anim_shm.bongocat_anims.count ? anim_shm.bongocat_anims[static_cast(anim_index)] : none_sprite_sheet; @@ -200,36 +200,55 @@ namespace bongocat::animation { return none_sprite_sheet; case config::config_animation_dm_set_t::min_dm: if (features::EnableLazyLoadAssets) { - return reinterpret_cast(anim_shm.dm_sprite_sheet); + assert(anim_shm.anim.type == animation_t::Type::Dm); + return anim_shm.anim; } assert(anim_index >= 0); return static_cast(anim_index) < anim_shm.min_dm_anims.count ? anim_shm.min_dm_anims[static_cast(anim_index)] : none_sprite_sheet; case config::config_animation_dm_set_t::dm: if (features::EnableLazyLoadAssets) { - return reinterpret_cast(anim_shm.dm_sprite_sheet); + assert(anim_shm.anim.type == animation_t::Type::Dm); + return anim_shm.anim; } return static_cast(anim_index) < anim_shm.dm_anims.count ? anim_shm.dm_anims[static_cast(anim_index)] : none_sprite_sheet; case config::config_animation_dm_set_t::dm20: if (features::EnableLazyLoadAssets) { - return reinterpret_cast(anim_shm.dm_sprite_sheet); + assert(anim_shm.anim.type == animation_t::Type::Dm); + return anim_shm.anim; } assert(anim_index >= 0); return static_cast(anim_index) < anim_shm.dm20_anims.count ? anim_shm.dm20_anims[static_cast(anim_index)] : none_sprite_sheet; case config::config_animation_dm_set_t::dmx: if (features::EnableLazyLoadAssets) { - return reinterpret_cast(anim_shm.dm_sprite_sheet); + assert(anim_shm.anim.type == animation_t::Type::Dm); + return anim_shm.anim; } assert(anim_index >= 0); return static_cast(anim_index) < anim_shm.dmx_anims.count ? anim_shm.dmx_anims[static_cast(anim_index)] : none_sprite_sheet; + case config::config_animation_dm_set_t::pen: + if (features::EnableLazyLoadAssets) { + assert(anim_shm.anim.type == animation_t::Type::Dm); + return anim_shm.anim; + } + return static_cast(anim_index) < anim_shm.pen_anims.count ? anim_shm.pen_anims[static_cast(anim_index)] : none_sprite_sheet; + case config::config_animation_dm_set_t::pen20: + if (features::EnableLazyLoadAssets) { + assert(anim_shm.anim.type == animation_t::Type::Dm); + return anim_shm.anim; + } + assert(anim_index >= 0); + return static_cast(anim_index) < anim_shm.pen20_anims.count ? anim_shm.pen20_anims[static_cast(anim_index)] : none_sprite_sheet; case config::config_animation_dm_set_t::dmc: if (features::EnableLazyLoadAssets) { - return reinterpret_cast(anim_shm.dm_sprite_sheet); + assert(anim_shm.anim.type == animation_t::Type::Dm); + return anim_shm.anim; } assert(anim_index >= 0); return static_cast(anim_index) < anim_shm.dmc_anims.count ? anim_shm.dmc_anims[static_cast(anim_index)] : none_sprite_sheet; case config::config_animation_dm_set_t::dmall: if (features::EnableLazyLoadAssets) { - return reinterpret_cast(anim_shm.dm_sprite_sheet); + assert(anim_shm.anim.type == animation_t::Type::Dm); + return anim_shm.anim; } assert(anim_index >= 0); return static_cast(anim_index) < anim_shm.dmall_anims.count ? anim_shm.dmall_anims[static_cast(anim_index)] : none_sprite_sheet; @@ -237,13 +256,15 @@ namespace bongocat::animation { }break; case config::config_animation_sprite_sheet_layout_t::Pkmn: if (features::EnableLazyLoadAssets) { - return reinterpret_cast(anim_shm.pkmn_sprite_sheet); + assert(anim_shm.anim.type == animation_t::Type::Pkmn); + return anim_shm.anim; } assert(anim_index >= 0); return static_cast(anim_index) < anim_shm.pkmn_anims.count ? anim_shm.pkmn_anims[static_cast(anim_index)] : none_sprite_sheet; case config::config_animation_sprite_sheet_layout_t::MsAgent: if (features::EnableLazyLoadAssets) { - return reinterpret_cast(anim_shm.ms_agent_sprite_sheet); + assert(anim_shm.anim.type == animation_t::Type::MsAgent); + return anim_shm.anim; } assert(anim_index >= 0); return static_cast(anim_index) < anim_shm.ms_anims.count ? anim_shm.ms_anims[static_cast(anim_index)] : none_sprite_sheet; @@ -284,7 +305,7 @@ namespace bongocat::animation { assert(ret->anim._local_copy_config != nullptr); //config_set_defaults(*ctx._local_copy_config); *ret->anim._local_copy_config = config; - ret->anim.shm->animation_player_data.frame_index = config.idle_frame; // initial frame + ret->anim.shm->animation_player_result.sprite_sheet_col = config.idle_frame; // initial frame ret->trigger_efd = platform::FileDescriptor(eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC)); if (ret->trigger_efd._fd < 0) { @@ -354,14 +375,6 @@ namespace bongocat::animation { #ifdef FEATURE_DM20_EMBEDDED_ASSETS // dm20 #include "dm20_init_dm_anim.cpp.inl" -#endif - } - if constexpr (features::EnablePen20EmbeddedAssets) { - BONGOCAT_LOG_INFO("Init pen20 sprite sheets: %d", PEN20_ANIM_COUNT); - //ctx.shm->pen20_anims = platform::make_allocated_mmap_array(PEN20_ANIM_COUNT); -#ifdef FEATURE_PEN20_EMBEDDED_ASSETS - // pen20 -#include "pen20_init_dm_anim.cpp.inl" #endif } if constexpr (features::EnableDmxEmbeddedAssets) { @@ -370,6 +383,22 @@ namespace bongocat::animation { #ifdef FEATURE_DMX_EMBEDDED_ASSETS // dmx #include "dmx_init_dm_anim.cpp.inl" +#endif + } + if constexpr (features::EnablePenEmbeddedAssets) { + BONGOCAT_LOG_INFO("Init pen sprite sheets: %d", PEN20_ANIM_COUNT); + ctx.shm->pen_anims = platform::make_allocated_mmap_array(PEN_ANIM_COUNT); +#ifdef FEATURE_PEN_EMBEDDED_ASSETS + // pen +#include "pen_init_dm_anim.cpp.inl" +#endif + } + if constexpr (features::EnablePen20EmbeddedAssets) { + BONGOCAT_LOG_INFO("Init pen20 sprite sheets: %d", PEN20_ANIM_COUNT); + ctx.shm->pen20_anims = platform::make_allocated_mmap_array(PEN20_ANIM_COUNT); +#ifdef FEATURE_PEN20_EMBEDDED_ASSETS + // pen20 +#include "pen20_init_dm_anim.cpp.inl" #endif } if constexpr (features::EnableDmcEmbeddedAssets) { @@ -401,12 +430,12 @@ namespace bongocat::animation { ctx.shm->ms_anims = platform::make_allocated_mmap_array(MS_AGENTS_ANIM_COUNT); // clippy - init_ms_agent_anim(ctx, CLIPPY_ANIM_INDEX, get_ms_agent_sprite_sheet(CLIPPY_ANIM_INDEX), CLIPPY_SPRITE_SHEET_COLS, CLIPPY_SPRITE_SHEET_ROWS); + init_ms_agent_anim(ctx, CLIPPY_ANIM_INDEX, get_ms_agent_sprite_sheet(CLIPPY_ANIM_INDEX), CLIPPY_SPRITE_SHEET_COLS, CLIPPY_SPRITE_SHEET_ROWS, get_ms_agent_animation_indices(CLIPPY_ANIM_INDEX)); #ifdef FEATURE_MORE_MS_AGENT_EMBEDDED_ASSETS /// @NOTE(config): add more MS Pets here - init_ms_agent_anim(ctx, LINKS_ANIM_INDEX, get_ms_agent_sprite_sheet(LINKS_ANIM_INDEX), LINKS_SPRITE_SHEET_COLS, LINKS_SPRITE_SHEET_ROWS); - init_ms_agent_anim(ctx, ROVER_ANIM_INDEX, get_ms_agent_sprite_sheet(ROVER_ANIM_INDEX), ROVER_SPRITE_SHEET_COLS, ROVER_SPRITE_SHEET_ROWS); - init_ms_agent_anim(ctx, MERLIN_ANIM_INDEX, get_ms_agent_sprite_sheet(MERLIN_ANIM_INDEX), MERLIN_SPRITE_SHEET_COLS, MERLIN_SPRITE_SHEET_ROWS); + init_ms_agent_anim(ctx, LINKS_ANIM_INDEX, get_ms_agent_sprite_sheet(LINKS_ANIM_INDEX), LINKS_SPRITE_SHEET_COLS, LINKS_SPRITE_SHEET_ROWS, get_ms_agent_animation_indices(LINKS_ANIM_INDEX)); + init_ms_agent_anim(ctx, ROVER_ANIM_INDEX, get_ms_agent_sprite_sheet(ROVER_ANIM_INDEX), ROVER_SPRITE_SHEET_COLS, ROVER_SPRITE_SHEET_ROWS, get_ms_agent_animation_indices(ROVER_ANIM_INDEX)); + init_ms_agent_anim(ctx, MERLIN_ANIM_INDEX, get_ms_agent_sprite_sheet(MERLIN_ANIM_INDEX), MERLIN_SPRITE_SHEET_COLS, MERLIN_SPRITE_SHEET_ROWS, get_ms_agent_animation_indices(MERLIN_ANIM_INDEX)); #endif } } diff --git a/src/graphics/bar.cpp b/src/graphics/bar.cpp index f6c314e6..93b32287 100644 --- a/src/graphics/bar.cpp +++ b/src/graphics/bar.cpp @@ -81,7 +81,7 @@ namespace bongocat::animation { int height; }; - cat_rect_t get_position(const platform::wayland::wayland_context_t& wayland_ctx, const generic_sprite_sheet_animation_t& sheet, const config::config_t& config) { + cat_rect_t get_position(const platform::wayland::wayland_context_t& wayland_ctx, const generic_sprite_sheet_t& sheet, const config::config_t& config) { const int cat_height = config.cat_height; const int cat_width = static_cast(static_cast(cat_height) * (static_cast(sheet.frame_width) / static_cast(sheet.frame_height))); @@ -128,7 +128,7 @@ namespace bongocat::animation { return { .x = cat_x, .y = cat_y, .width = cat_width, .height = cat_height }; } - void draw_sprite(platform::wayland::wayland_session_t& ctx, const generic_sprite_sheet_animation_t& sheet, blit_image_color_option_flags_t extra_drawing_option = blit_image_color_option_flags_t::Normal) { + void draw_sprite(platform::wayland::wayland_session_t& ctx, const generic_sprite_sheet_t& sheet, blit_image_color_option_flags_t extra_drawing_option = blit_image_color_option_flags_t::Normal) { if (sheet.frame_width <= 0 || sheet.frame_height <= 0) { return; } @@ -142,7 +142,7 @@ namespace bongocat::animation { assert(anim.shm != nullptr); const config::config_t& current_config = *wayland_ctx._local_copy_config.ptr; const animation_shared_memory_t& anim_shm = *anim.shm; - const int frame_index = anim_shm.animation_player_data.frame_index; + const int frame_index = anim_shm.animation_player_result.sprite_sheet_col; assert(wayland_ctx_shm->current_buffer_index >= 0); assert(platform::wayland::WAYLAND_NUM_BUFFERS <= INT_MAX); @@ -153,7 +153,7 @@ namespace bongocat::animation { const size_t pixels_size = shm_buffer->pixels._size_bytes; assert(frame_index >= 0 && static_cast(frame_index) < MAX_NUM_FRAMES); - const sprite_sheet_animation_region_t* region = sheet.frames[frame_index].valid + const sprite_sheet_animation_frame_t* region = sheet.frames[frame_index].valid ? &sheet.frames[frame_index] : nullptr; @@ -337,7 +337,7 @@ namespace bongocat::animation { assert(anim_shm.anim_index >= 0 && static_cast(anim_shm.anim_index) < anim_shm.bongocat_anims.count); } const animation_t& cat_anim = get_current_animation(anim); - const generic_sprite_sheet_animation_t& sheet = cat_anim.sprite_sheet; + const generic_sprite_sheet_t& sheet = cat_anim.sprite_sheet; draw_sprite(ctx, sheet, current_config.enable_antialiasing ? blit_image_color_option_flags_t::BilinearInterpolation : blit_image_color_option_flags_t::Normal); }break; case config::config_animation_sprite_sheet_layout_t::Dm: { @@ -357,6 +357,12 @@ namespace bongocat::animation { case config::config_animation_dm_set_t::dmx: { assert(anim_shm.anim_index >= 0 && static_cast(anim_shm.anim_index) < anim_shm.dmx_anims.count); }break; + case config::config_animation_dm_set_t::pen: { + assert(anim_shm.anim_index >= 0 && static_cast(anim_shm.anim_index) < anim_shm.pen_anims.count); + }break; + case config::config_animation_dm_set_t::pen20: { + assert(anim_shm.anim_index >= 0 && static_cast(anim_shm.anim_index) < anim_shm.pen20_anims.count); + }break; case config::config_animation_dm_set_t::dmc: { assert(anim_shm.anim_index >= 0 && static_cast(anim_shm.anim_index) < anim_shm.dmc_anims.count); }break; @@ -366,7 +372,7 @@ namespace bongocat::animation { } } const animation_t& dm_anim = get_current_animation(anim); - const generic_sprite_sheet_animation_t& sheet = dm_anim.sprite_sheet; + const generic_sprite_sheet_t& sheet = dm_anim.sprite_sheet; draw_sprite(ctx, sheet); }break; case config::config_animation_sprite_sheet_layout_t::Pkmn: { @@ -374,7 +380,7 @@ namespace bongocat::animation { assert(anim_shm.anim_index >= 0 && static_cast(anim_shm.anim_index) < anim_shm.pkmn_anims.count); } const animation_t& cat_anim = get_current_animation(anim); - const generic_sprite_sheet_animation_t& sheet = cat_anim.sprite_sheet; + const generic_sprite_sheet_t& sheet = cat_anim.sprite_sheet; draw_sprite(ctx, sheet); }break; case config::config_animation_sprite_sheet_layout_t::MsAgent:{ @@ -383,8 +389,8 @@ namespace bongocat::animation { } const animation_t& ms_anim = get_current_animation(anim); const ms_agent_sprite_sheet_t& sheet = ms_anim.ms_agent; - const int col = anim_shm.animation_player_data.frame_index; - const int row = anim_shm.animation_player_data.sprite_sheet_row; + const int col = anim_shm.animation_player_result.sprite_sheet_col; + const int row = anim_shm.animation_player_result.sprite_sheet_row; draw_sprite(ctx, sheet, col, row); }break; } diff --git a/src/image_loader/CMakeLists.txt b/src/image_loader/CMakeLists.txt index 002ff685..56f08636 100644 --- a/src/image_loader/CMakeLists.txt +++ b/src/image_loader/CMakeLists.txt @@ -54,14 +54,16 @@ endif() # @NOTE(assets): 3. add image_loader sub directory add_subdirectory(bongocat) -add_subdirectory(ms_agent) add_subdirectory(base_dm) add_subdirectory(dm) add_subdirectory(dm20) add_subdirectory(dmc) add_subdirectory(dmx) +add_subdirectory(pen) +add_subdirectory(pen20) add_subdirectory(dmall) add_subdirectory(min_dm) +add_subdirectory(ms_agent) add_subdirectory(pkmn) # @NOTE(assets): 3.1. add image_loader in include/image_loader (see other load_images_...h as reference) diff --git a/src/image_loader/base_dm/load_dm.cpp b/src/image_loader/base_dm/load_dm.cpp index 27ccabbb..5faae477 100644 --- a/src/image_loader/base_dm/load_dm.cpp +++ b/src/image_loader/base_dm/load_dm.cpp @@ -4,7 +4,7 @@ namespace bongocat::animation { - created_result_t load_dm_anim(const animation_context_t& ctx, [[maybe_unused]] int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows) { + created_result_t load_dm_anim(const animation_context_t& ctx, [[maybe_unused]] int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows) { using namespace assets; BONGOCAT_CHECK_NULL(ctx._local_copy_config.ptr, bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM); @@ -21,29 +21,113 @@ namespace bongocat::animation { return bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM; } - dm_animation_t ret; + dm_sprite_sheet_t ret; ret.image = bongocat::move(result.result.image); ret.frame_width = bongocat::move(result.result.frame_width); ret.frame_height = bongocat::move(result.result.frame_height); ret.total_frames = bongocat::move(result.result.total_frames); - ret.idle_1 = bongocat::move(result.result.frames[0]); - ret.idle_2 = bongocat::move(result.result.frames[1]); - ret.angry = bongocat::move(result.result.frames[2]); - ret.down1 = bongocat::move(result.result.frames[3]); - ret.happy = bongocat::move(result.result.frames[4]); - ret.eat1 = bongocat::move(result.result.frames[5]); - ret.sleep1 = bongocat::move(result.result.frames[6]); - ret.refuse = bongocat::move(result.result.frames[7]); - ret.sad = bongocat::move(result.result.frames[8]); - - ret.down_2 = bongocat::move(result.result.frames[9]); - ret.eat_2 = bongocat::move(result.result.frames[10]); - ret.sleep_2 = bongocat::move(result.result.frames[11]); - ret.attack = bongocat::move(result.result.frames[12]); - - ret.movement_1 = bongocat::move(result.result.frames[13]); - ret.movement_2 = bongocat::move(result.result.frames[14]); + ret.frames.idle_1 = bongocat::move(result.result.frames[0]); + ret.frames.idle_2 = bongocat::move(result.result.frames[1]); + ret.frames.angry = bongocat::move(result.result.frames[2]); + ret.frames.down_1 = bongocat::move(result.result.frames[3]); + ret.frames.happy = bongocat::move(result.result.frames[4]); + ret.frames.eat_1 = bongocat::move(result.result.frames[5]); + ret.frames.sleep_1 = bongocat::move(result.result.frames[6]); + ret.frames.refuse = bongocat::move(result.result.frames[7]); + ret.frames.sad = bongocat::move(result.result.frames[8]); + + ret.frames.down_2 = bongocat::move(result.result.frames[9]); + ret.frames.eat_2 = bongocat::move(result.result.frames[10]); + ret.frames.sleep_2 = bongocat::move(result.result.frames[11]); + ret.frames.attack_1 = bongocat::move(result.result.frames[12]); + + ret.frames.movement_1 = bongocat::move(result.result.frames[13]); + ret.frames.movement_2 = bongocat::move(result.result.frames[14]); + + // setup animations + using namespace assets; + + assert(ret.frames.idle_1.valid); + assert(ret.frames.idle_2.valid); + assert(ret.frames.angry.valid); + assert(ret.frames.down_1.valid); + + assert(MAX_ANIMATION_FRAMES >= 4); + ret.animations.idle[0] = ret.frames.idle_1.col; + ret.animations.idle[1] = ret.frames.idle_2.col; + ret.animations.idle[2] = ret.frames.idle_1.col; + ret.animations.idle[3] = ret.frames.idle_2.col; + + ret.animations.boring[0] = ret.frames.sad.col ? ret.frames.sad.col : ret.frames.idle_1.col; + ret.animations.boring[1] = ret.frames.down_1.col ? ret.frames.down_1.col : ret.frames.idle_2.col; + ret.animations.boring[2] = ret.frames.down_2.col ? ret.frames.down_2.col : ret.frames.idle_1.col; + ret.animations.boring[3] = ret.frames.idle_2.col; + + ret.animations.writing[0] = ret.frames.idle_2.col; + ret.animations.writing[1] = ret.frames.idle_1.col; + ret.animations.writing[2] = ret.frames.idle_2.col; + ret.animations.writing[3] = ret.frames.idle_1.col; + + // sleep animation + if (ret.frames.sleep_1.valid || ret.frames.sleep_2.valid) { + ret.animations.sleep[0] = ret.frames.sleep_1.valid ? ret.frames.sleep_1.col : ret.frames.sleep_2.col; + ret.animations.sleep[1] = ret.frames.sleep_2.valid ? ret.frames.sleep_2.col : ret.frames.sleep_1.col; + ret.animations.sleep[2] = ret.frames.sleep_1.valid ? ret.frames.sleep_1.col : ret.frames.sleep_2.col; + ret.animations.sleep[3] = ret.frames.sleep_2.valid ? ret.frames.sleep_2.col : ret.frames.sleep_1.col; + } else if (ret.frames.down_1.valid) { + ret.animations.sleep[0] = ret.frames.down_1.col; + ret.animations.sleep[1] = ret.frames.down_1.col; + ret.animations.sleep[2] = ret.frames.down_1.col; + ret.animations.sleep[3] = ret.frames.down_1.col; + } else { + // fallback + ret.animations.sleep[0] = ret.frames.idle_2.col; + ret.animations.sleep[1] = ret.frames.idle_2.col; + ret.animations.sleep[2] = ret.frames.idle_2.col; + ret.animations.sleep[3] = ret.frames.idle_2.col; + } + + ret.animations.wake_up[0] = ret.frames.idle_1.col; + ret.animations.wake_up[1] = ret.frames.idle_2.col; + ret.animations.wake_up[2] = ret.frames.idle_1.col; + ret.animations.wake_up[3] = ret.frames.idle_2.col; + + // working/attack animation + ret.animations.working[0] = ret.frames.idle_1.col; + ret.animations.working[1] = ret.frames.idle_2.col; + ret.animations.working[2] = ret.frames.angry.valid ? ret.frames.angry.col : ret.frames.idle_1.col; + ret.animations.working[3] = ret.frames.idle_2.col; + ret.animations.working[2] = ret.frames.attack_1.valid ? ret.frames.attack_1.col : ret.animations.working[2]; + ret.animations.working[3] = ret.frames.attack_2.valid ? ret.frames.attack_2.col : ret.animations.working[3]; + + // moving/walking animation + if (ret.frames.movement_1.valid || ret.frames.movement_2.valid) { + ret.animations.moving[0] = ret.frames.movement_1.valid ? ret.frames.movement_1.col : ret.frames.idle_1.col; + ret.animations.moving[1] = ret.frames.movement_1.valid ? ret.frames.movement_1.col : ret.frames.idle_1.col; + ret.animations.moving[2] = ret.frames.movement_2.valid ? ret.frames.movement_2.col : ret.frames.idle_2.col; + ret.animations.moving[3] = ret.frames.movement_2.valid ? ret.frames.movement_2.col : ret.frames.idle_2.col; + } else { + // fallback + ret.animations.moving[0] = ret.frames.idle_1.col; + ret.animations.moving[1] = ret.frames.idle_1.col; + ret.animations.moving[2] = ret.frames.idle_2.col; + ret.animations.moving[3] = ret.frames.idle_2.col; + } + + // happy animation + if (ret.frames.happy.valid) { + ret.animations.happy[0] = ret.frames.happy.valid ? ret.frames.happy.col : ret.frames.idle_2.col; + ret.animations.happy[1] = ret.frames.idle_1.col; + ret.animations.happy[2] = ret.frames.happy.valid ? ret.frames.happy.col : ret.frames.idle_2.col; + ret.animations.happy[3] = ret.frames.idle_1.col; + } else { + // fallback + ret.animations.happy[0] = ret.frames.idle_1.col; + ret.animations.happy[1] = ret.frames.idle_2.col; + ret.animations.happy[2] = ret.frames.idle_1.col; + ret.animations.happy[3] = ret.frames.idle_2.col; + } return ret; } diff --git a/src/image_loader/bongocat/load_images_bongocat.cpp b/src/image_loader/bongocat/load_images_bongocat.cpp index fcf96871..947e8cd8 100644 --- a/src/image_loader/bongocat/load_images_bongocat.cpp +++ b/src/image_loader/bongocat/load_images_bongocat.cpp @@ -9,14 +9,14 @@ namespace bongocat::animation { - created_result_t load_bongocat_anim([[maybe_unused]] int anim_index, get_sprite_callback_t get_sprite, size_t embedded_images_count) { + created_result_t load_bongocat_anim([[maybe_unused]] int anim_index, get_sprite_callback_t get_sprite, size_t embedded_images_count) { BONGOCAT_LOG_VERBOSE("Load bongocat Animation(index=%d) ...", anim_index); auto result = anim_sprite_sheet_from_embedded_images(get_sprite, embedded_images_count); if (result.error != bongocat_error_t::BONGOCAT_SUCCESS) [[unlikely]] { return result.error; } - bongocat_animation_t ret; + bongocat_sprite_sheet_t ret; ret.image = bongocat::move(result.result.image); ret.frame_width = bongocat::move(result.result.frame_width); ret.frame_height = bongocat::move(result.result.frame_height); @@ -26,6 +26,55 @@ namespace bongocat::animation { ret.right_down = bongocat::move(result.result.frames[2]); ret.both_down = bongocat::move(result.result.frames[3]); + // setup animations (cache) + using namespace assets; + + assert(ret.both_up.valid); + assert(ret.left_down.valid); + assert(ret.right_down.valid); + assert(ret.both_down.valid); + + assert(MAX_ANIMATION_FRAMES >= 4); + ret.animations.idle[0] = BONGOCAT_FRAME_BOTH_UP; + ret.animations.idle[1] = BONGOCAT_FRAME_BOTH_UP; + ret.animations.idle[2] = BONGOCAT_FRAME_BOTH_UP; + ret.animations.idle[3] = BONGOCAT_FRAME_BOTH_UP; + + ret.animations.boring[0] = BONGOCAT_FRAME_BOTH_DOWN; + ret.animations.boring[1] = BONGOCAT_FRAME_BOTH_UP; + ret.animations.boring[2] = BONGOCAT_FRAME_BOTH_UP; + ret.animations.boring[3] = BONGOCAT_FRAME_BOTH_UP; + + ret.animations.writing[0] = BONGOCAT_FRAME_LEFT_DOWN; + ret.animations.writing[1] = BONGOCAT_FRAME_RIGHT_DOWN; + ret.animations.writing[2] = BONGOCAT_FRAME_LEFT_DOWN; + ret.animations.writing[3] = BONGOCAT_FRAME_RIGHT_DOWN; + + ret.animations.sleep[0] = BONGOCAT_FRAME_BOTH_DOWN; + ret.animations.sleep[1] = BONGOCAT_FRAME_BOTH_DOWN; + ret.animations.sleep[2] = BONGOCAT_FRAME_BOTH_DOWN; + ret.animations.sleep[3] = BONGOCAT_FRAME_BOTH_DOWN; + + ret.animations.wake_up[0] = BONGOCAT_FRAME_BOTH_UP; + ret.animations.wake_up[1] = BONGOCAT_FRAME_BOTH_UP; + ret.animations.wake_up[2] = BONGOCAT_FRAME_BOTH_UP; + ret.animations.wake_up[3] = BONGOCAT_FRAME_BOTH_UP; + + ret.animations.working[0] = BONGOCAT_FRAME_LEFT_DOWN; + ret.animations.working[1] = BONGOCAT_FRAME_RIGHT_DOWN; + ret.animations.working[2] = BONGOCAT_FRAME_LEFT_DOWN; + ret.animations.working[3] = BONGOCAT_FRAME_RIGHT_DOWN; + + ret.animations.moving[0] = BONGOCAT_FRAME_BOTH_UP; + ret.animations.moving[1] = BONGOCAT_FRAME_BOTH_DOWN; + ret.animations.moving[2] = BONGOCAT_FRAME_BOTH_UP; + ret.animations.moving[3] = BONGOCAT_FRAME_BOTH_DOWN; + + ret.animations.happy[0] = BONGOCAT_FRAME_LEFT_DOWN; + ret.animations.happy[1] = BONGOCAT_FRAME_RIGHT_DOWN; + ret.animations.happy[2] = BONGOCAT_FRAME_LEFT_DOWN; + ret.animations.happy[3] = BONGOCAT_FRAME_RIGHT_DOWN; + return ret; } @@ -50,12 +99,13 @@ namespace bongocat::animation { } assert(anim_index >= 0); - ctx.shm->bongocat_anims[static_cast(anim_index)].bongocat = bongocat::move(result.result); + ctx.shm->bongocat_anims[static_cast(anim_index)] = bongocat::move(result.result); + assert(ctx.shm->bongocat_anims[static_cast(anim_index)].type == animation_t::Type::Bongocat); return bongocat_error_t::BONGOCAT_SUCCESS; } - created_result_t load_bongocat_sprite_sheet(const animation_context_t& /*ctx*/, int index) { + created_result_t load_bongocat_sprite_sheet(const animation_context_t& /*ctx*/, int index) { using namespace assets; using namespace animation; switch (index) { diff --git a/src/image_loader/dm/dm_load_sprite_sheet.cpp b/src/image_loader/dm/dm_load_sprite_sheet.cpp index 6b29e001..4932f310 100644 --- a/src/image_loader/dm/dm_load_sprite_sheet.cpp +++ b/src/image_loader/dm/dm_load_sprite_sheet.cpp @@ -8,7 +8,7 @@ #include "image_loader/dm/load_images_dm.h" namespace bongocat::animation { - created_result_t load_dm_sprite_sheet(const animation_context_t& ctx, int index) { + created_result_t load_dm_sprite_sheet(const animation_context_t& ctx, int index) { using namespace assets; switch (index) { case DM_AGUMON_ANIM_INDEX: return load_dm_anim(ctx, DM_AGUMON_ANIM_INDEX, get_dm_sprite_sheet(DM_AGUMON_ANIM_INDEX), DM_AGUMON_SPRITE_SHEET_COLS, DM_AGUMON_SPRITE_SHEET_ROWS); diff --git a/src/image_loader/dm/load_images_dm.cpp b/src/image_loader/dm/load_images_dm.cpp index 6129e8c7..84ef43aa 100644 --- a/src/image_loader/dm/load_images_dm.cpp +++ b/src/image_loader/dm/load_images_dm.cpp @@ -1,5 +1,4 @@ #include "load_images_dm.h" - #include "embedded_assets/dm/dm.hpp" #include "graphics/animation_context.h" #include "image_loader/load_images.h" @@ -21,7 +20,8 @@ bongocat_error_t init_dm_anim(animation_context_t& ctx, int anim_index, const as assert(result.result.total_frames > 0); ///< this SHOULD always work if it's an valid EMBEDDED image assert(anim_index >= 0); - ctx.shm->dm_anims[static_cast(anim_index)].dm = bongocat::move(result.result); + ctx.shm->dm_anims[static_cast(anim_index)] = bongocat::move(result.result); + assert(ctx.shm->dm_anims[static_cast(anim_index)].type == animation_t::Type::Dm); return bongocat_error_t::BONGOCAT_SUCCESS; } diff --git a/src/image_loader/dm20/dm20_load_sprite_sheet.cpp b/src/image_loader/dm20/dm20_load_sprite_sheet.cpp index e17b1956..2c5a06c9 100644 --- a/src/image_loader/dm20/dm20_load_sprite_sheet.cpp +++ b/src/image_loader/dm20/dm20_load_sprite_sheet.cpp @@ -8,7 +8,7 @@ #include "image_loader/dm20/load_images_dm20.h" namespace bongocat::animation { - created_result_t load_dm20_sprite_sheet(const animation_context_t& ctx, int index) { + created_result_t load_dm20_sprite_sheet(const animation_context_t& ctx, int index) { using namespace assets; switch (index) { case DM20_AEGISDRAMON_ANIM_INDEX: return load_dm_anim(ctx, DM20_AEGISDRAMON_ANIM_INDEX, get_dm20_sprite_sheet(DM20_AEGISDRAMON_ANIM_INDEX), DM20_AEGISDRAMON_SPRITE_SHEET_COLS, DM20_AEGISDRAMON_SPRITE_SHEET_ROWS); diff --git a/src/image_loader/dm20/load_images_dm20.cpp b/src/image_loader/dm20/load_images_dm20.cpp index 63b76afd..a7455f32 100644 --- a/src/image_loader/dm20/load_images_dm20.cpp +++ b/src/image_loader/dm20/load_images_dm20.cpp @@ -20,7 +20,7 @@ namespace bongocat::animation { assert(result.result.total_frames > 0); ///< this SHOULD always work if it's an valid EMBEDDED image assert(anim_index >= 0); - ctx.shm->dm20_anims[static_cast(anim_index)].dm = bongocat::move(result.result); + ctx.shm->dm20_anims[static_cast(anim_index)] = bongocat::move(result.result); return bongocat_error_t::BONGOCAT_SUCCESS; } diff --git a/src/image_loader/dmall/dmall_load_sprite_sheet.cpp b/src/image_loader/dmall/dmall_load_sprite_sheet.cpp index c6ad4bb6..154a57a4 100644 --- a/src/image_loader/dmall/dmall_load_sprite_sheet.cpp +++ b/src/image_loader/dmall/dmall_load_sprite_sheet.cpp @@ -8,7 +8,7 @@ #include "image_loader/dmall/load_images_dmall.h" namespace bongocat::animation { - created_result_t load_dmall_sprite_sheet(const animation_context_t& ctx, int index) { + created_result_t load_dmall_sprite_sheet(const animation_context_t& ctx, int index) { using namespace assets; switch (index) { case DMALL_AEGISDRAMON_ANIM_INDEX: return load_dm_anim(ctx, DMALL_AEGISDRAMON_ANIM_INDEX, get_dmall_sprite_sheet(DMALL_AEGISDRAMON_ANIM_INDEX), DMALL_AEGISDRAMON_SPRITE_SHEET_COLS, DMALL_AEGISDRAMON_SPRITE_SHEET_ROWS); diff --git a/src/image_loader/dmall/load_images_dmall.cpp b/src/image_loader/dmall/load_images_dmall.cpp index e0dcf35f..75a17c53 100644 --- a/src/image_loader/dmall/load_images_dmall.cpp +++ b/src/image_loader/dmall/load_images_dmall.cpp @@ -20,7 +20,7 @@ namespace bongocat::animation { assert(result.result.total_frames > 0); ///< this SHOULD always work if it's an valid EMBEDDED image assert(anim_index >= 0); - ctx.shm->dmall_anims[static_cast(anim_index)].dm = bongocat::move(result.result); + ctx.shm->dmall_anims[static_cast(anim_index)] = bongocat::move(result.result); return bongocat_error_t::BONGOCAT_SUCCESS; } diff --git a/src/image_loader/dmc/dmc_load_sprite_sheet.cpp b/src/image_loader/dmc/dmc_load_sprite_sheet.cpp index 73df7cc2..337a1ad7 100644 --- a/src/image_loader/dmc/dmc_load_sprite_sheet.cpp +++ b/src/image_loader/dmc/dmc_load_sprite_sheet.cpp @@ -8,7 +8,7 @@ #include "image_loader/dmc/load_images_dmc.h" namespace bongocat::animation { - created_result_t load_dmc_sprite_sheet(const animation_context_t& ctx, int index) { + created_result_t load_dmc_sprite_sheet(const animation_context_t& ctx, int index) { using namespace assets; switch (index) { case DMC_AGUMON_ANIM_INDEX: return load_dm_anim(ctx, DMC_AGUMON_ANIM_INDEX, get_dmc_sprite_sheet(DMC_AGUMON_ANIM_INDEX), DMC_AGUMON_SPRITE_SHEET_COLS, DMC_AGUMON_SPRITE_SHEET_ROWS); diff --git a/src/image_loader/dmc/load_images_dmc.cpp b/src/image_loader/dmc/load_images_dmc.cpp index 2443e096..173e9965 100644 --- a/src/image_loader/dmc/load_images_dmc.cpp +++ b/src/image_loader/dmc/load_images_dmc.cpp @@ -20,7 +20,7 @@ namespace bongocat::animation { assert(result.result.total_frames > 0); ///< this SHOULD always work if it's an valid EMBEDDED image assert(anim_index >= 0); - ctx.shm->dmc_anims[static_cast(anim_index)].dm = bongocat::move(result.result); + ctx.shm->dmc_anims[static_cast(anim_index)] = bongocat::move(result.result); return bongocat_error_t::BONGOCAT_SUCCESS; } diff --git a/src/image_loader/dmx/dmx_load_sprite_sheet.cpp b/src/image_loader/dmx/dmx_load_sprite_sheet.cpp index 3c5fbc68..3fd03ef8 100644 --- a/src/image_loader/dmx/dmx_load_sprite_sheet.cpp +++ b/src/image_loader/dmx/dmx_load_sprite_sheet.cpp @@ -8,7 +8,7 @@ #include "image_loader/dmx/load_images_dmx.h" namespace bongocat::animation { - created_result_t load_dmx_sprite_sheet(const animation_context_t& ctx, int index) { + created_result_t load_dmx_sprite_sheet(const animation_context_t& ctx, int index) { using namespace assets; switch (index) { case DMX_AGUMON_BLACK_X_ANIM_INDEX: return load_dm_anim(ctx, DMX_AGUMON_BLACK_X_ANIM_INDEX, get_dmx_sprite_sheet(DMX_AGUMON_BLACK_X_ANIM_INDEX), DMX_AGUMON_BLACK_X_SPRITE_SHEET_COLS, DMX_AGUMON_BLACK_X_SPRITE_SHEET_ROWS); diff --git a/src/image_loader/dmx/load_images_dmx.cpp b/src/image_loader/dmx/load_images_dmx.cpp index 138609b1..b7845d54 100644 --- a/src/image_loader/dmx/load_images_dmx.cpp +++ b/src/image_loader/dmx/load_images_dmx.cpp @@ -21,7 +21,7 @@ namespace bongocat::animation { assert(result.result.total_frames > 0); ///< this SHOULD always work if it's an valid EMBEDDED image assert(anim_index >= 0); - ctx.shm->dmx_anims[static_cast(anim_index)].dm = bongocat::move(result.result); + ctx.shm->dmx_anims[static_cast(anim_index)] = bongocat::move(result.result); return bongocat_error_t::BONGOCAT_SUCCESS; } diff --git a/src/image_loader/load_images.cpp b/src/image_loader/load_images.cpp index 3402c2bf..ab149eb6 100644 --- a/src/image_loader/load_images.cpp +++ b/src/image_loader/load_images.cpp @@ -10,10 +10,10 @@ namespace bongocat::animation { // IMAGE LOADING MODULE // ============================================================================= - [[nodiscard]] static created_result_t load_sprite_sheet_from_memory(const uint8_t* sprite_data, size_t sprite_data_size, + [[nodiscard]] static created_result_t load_sprite_sheet_from_memory(const uint8_t* sprite_data, size_t sprite_data_size, int frame_columns, int frame_rows, int padding_x, int padding_y) { - generic_sprite_sheet_animation_t ret; + generic_sprite_sheet_t ret; auto [sprite_sheet, sprite_sheet_error] = load_image(sprite_data, sprite_data_size, RGBA_CHANNELS); if (sprite_sheet_error != bongocat_error_t::BONGOCAT_SUCCESS) [[unlikely]] { @@ -111,8 +111,8 @@ namespace bongocat::animation { return ret; } - created_result_t anim_sprite_sheet_from_embedded_images(get_sprite_callback_t get_sprite, size_t embedded_images_count) { - generic_sprite_sheet_animation_t ret; + created_result_t anim_sprite_sheet_from_embedded_images(get_sprite_callback_t get_sprite, size_t embedded_images_count) { + generic_sprite_sheet_t ret; int total_frames = 0; int max_frame_width = 0; @@ -210,7 +210,7 @@ namespace bongocat::animation { return ret; } - created_result_t load_sprite_sheet_anim(const config::config_t& config, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows) { + created_result_t load_sprite_sheet_anim(const config::config_t& config, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows) { if (sprite_sheet_cols < 0 || sprite_sheet_rows < 0) { return bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM; } diff --git a/src/image_loader/min_dm/load_images_min_dm.cpp b/src/image_loader/min_dm/load_images_min_dm.cpp index e38b1e71..c1f9ecf9 100644 --- a/src/image_loader/min_dm/load_images_min_dm.cpp +++ b/src/image_loader/min_dm/load_images_min_dm.cpp @@ -20,7 +20,7 @@ namespace bongocat::animation { assert(result.result.total_frames > 0); ///< this SHOULD always work if it's an valid EMBEDDED image assert(anim_index >= 0); - ctx.shm->min_dm_anims[static_cast(anim_index)].dm = bongocat::move(result.result); + ctx.shm->min_dm_anims[static_cast(anim_index)] = bongocat::move(result.result); return bongocat_error_t::BONGOCAT_SUCCESS; } diff --git a/src/image_loader/min_dm/min_dm_load_sprite_sheet.cpp b/src/image_loader/min_dm/min_dm_load_sprite_sheet.cpp index 2d1b221e..229df1e9 100644 --- a/src/image_loader/min_dm/min_dm_load_sprite_sheet.cpp +++ b/src/image_loader/min_dm/min_dm_load_sprite_sheet.cpp @@ -8,7 +8,7 @@ #include "image_loader/min_dm/load_images_min_dm.h" namespace bongocat::animation { - created_result_t load_min_dm_sprite_sheet(const animation_context_t& ctx, int index) { + created_result_t load_min_dm_sprite_sheet(const animation_context_t& ctx, int index) { using namespace animation; using namespace assets; switch (index) { diff --git a/src/image_loader/ms_agent/load_images_ms_agent.cpp b/src/image_loader/ms_agent/load_images_ms_agent.cpp index e261f6c2..92529310 100644 --- a/src/image_loader/ms_agent/load_images_ms_agent.cpp +++ b/src/image_loader/ms_agent/load_images_ms_agent.cpp @@ -10,8 +10,8 @@ namespace bongocat::animation { [[nodiscard]] static created_result_t load_ms_agent_sprite_sheet_from_memory(const uint8_t* sprite_data, size_t sprite_data_size, - int frame_columns, int frame_rows, - int padding_x, int padding_y) { + int frame_columns, int frame_rows, + int padding_x, int padding_y) { auto [sprite_sheet, sprite_sheet_error] = load_image(sprite_data, sprite_data_size, RGBA_CHANNELS); // Force RGBA if (sprite_sheet_error != bongocat_error_t::BONGOCAT_SUCCESS) [[unlikely]] { BONGOCAT_LOG_ERROR("Failed to load sprite sheet."); @@ -127,31 +127,78 @@ namespace bongocat::animation { return result; } - created_result_t load_ms_agent_anim(const animation_context_t& ctx, [[maybe_unused]] int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows) { + created_result_t load_ms_agent_anim(const animation_context_t& ctx, [[maybe_unused]] int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows, const assets::ms_agent_animation_indices_t& animation_data) { + using namespace assets; BONGOCAT_CHECK_NULL(ctx._local_copy_config.ptr, bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM); - BONGOCAT_LOG_VERBOSE("Load bongocat Animation(index=%d) ...", anim_index); + BONGOCAT_LOG_VERBOSE("Load MS agent Animation(index=%d) ...", anim_index); auto result = load_ms_agent_sprite_sheet(*ctx._local_copy_config, sprite_sheet_image, sprite_sheet_cols, sprite_sheet_rows); if (result.error != bongocat_error_t::BONGOCAT_SUCCESS) [[unlikely]] { return result.error; } - ms_agent_sprite_sheet_t ret; - ret.image = bongocat::move(result.result.image); - ret.frame_width = bongocat::move(result.result.frame_width); - ret.frame_height = bongocat::move(result.result.frame_height); - return ret; + // setup animation frames data + if (result.result.frame_height > 0 && sprite_sheet_rows > 0) { + [[maybe_unused]] const auto rows = result.result.image.sprite_sheet_height / result.result.frame_height; + assert(rows == sprite_sheet_rows); + + assert(sprite_sheet_rows > 0); + if (static_cast(sprite_sheet_rows - 1) >= MS_AGENT_SPRITE_SHEET_ROW_IDLE) { + result.result.idle = { .valid = true, .start_col = animation_data.start_index_frame_idle, .end_col = animation_data.end_index_frame_idle, .row = MS_AGENT_SPRITE_SHEET_ROW_IDLE }; + } + if (static_cast(sprite_sheet_rows - 1) >= MS_AGENT_SPRITE_SHEET_ROW_BORING) { + result.result.boring = { .valid = true, .start_col = animation_data.start_index_frame_boring, .end_col = animation_data.end_index_frame_boring, .row = MS_AGENT_SPRITE_SHEET_ROW_BORING }; + } + if (static_cast(sprite_sheet_rows - 1) >= MS_AGENT_SPRITE_SHEET_ROW_START_WRITING) { + result.result.start_writing = { .valid = true, .start_col = animation_data.start_index_frame_start_writing, .end_col = animation_data.end_index_frame_start_writing, .row = MS_AGENT_SPRITE_SHEET_ROW_START_WRITING }; + } + if (static_cast(sprite_sheet_rows - 1) >= MS_AGENT_SPRITE_SHEET_ROW_WRITING) { + result.result.writing = { .valid = true, .start_col = animation_data.start_index_frame_writing, .end_col = animation_data.end_index_frame_writing, .row = MS_AGENT_SPRITE_SHEET_ROW_WRITING }; + } + if (static_cast(sprite_sheet_rows - 1) >= MS_AGENT_SPRITE_SHEET_ROW_END_WRITING) { + result.result.end_writing = { .valid = true, .start_col = animation_data.start_index_frame_end_writing, .end_col = animation_data.end_index_frame_end_writing, .row = MS_AGENT_SPRITE_SHEET_ROW_END_WRITING }; + } + if (static_cast(sprite_sheet_rows - 1) >= MS_AGENT_SPRITE_SHEET_ROW_SLEEP) { + result.result.sleep = { .valid = true, .start_col = animation_data.start_index_frame_sleep, .end_col = animation_data.end_index_frame_sleep, .row = MS_AGENT_SPRITE_SHEET_ROW_SLEEP }; + } + if (static_cast(sprite_sheet_rows - 1) >= MS_AGENT_SPRITE_SHEET_ROW_WAKE_UP) { + result.result.wake_up = { .valid = true, .start_col = animation_data.start_index_frame_wake_up, .end_col = animation_data.end_index_frame_wake_up, .row = MS_AGENT_SPRITE_SHEET_ROW_WAKE_UP }; + } + if (static_cast(sprite_sheet_rows - 1) >= MS_AGENT_SPRITE_SHEET_ROW_START_WORKING) { + result.result.start_working = { .valid = true, .start_col = animation_data.start_index_frame_start_working, .end_col = animation_data.end_index_frame_start_working, .row = MS_AGENT_SPRITE_SHEET_ROW_START_WORKING }; + } + if (static_cast(sprite_sheet_rows - 1) >= MS_AGENT_SPRITE_SHEET_ROW_WORKING) { + result.result.working = { .valid = true, .start_col = animation_data.start_index_frame_working, .end_col = animation_data.end_index_frame_working, .row = MS_AGENT_SPRITE_SHEET_ROW_WORKING }; + } + if (static_cast(sprite_sheet_rows - 1) >= MS_AGENT_SPRITE_SHEET_ROW_END_WORKING) { + result.result.end_working = { .valid = true, .start_col = animation_data.start_index_frame_end_working, .end_col = animation_data.end_index_frame_end_working, .row = MS_AGENT_SPRITE_SHEET_ROW_END_WORKING }; + } + if (static_cast(sprite_sheet_rows - 1) >= MS_AGENT_SPRITE_SHEET_ROW_START_MOVING) { + result.result.start_moving = { .valid = true, .start_col = animation_data.start_index_frame_start_moving, .end_col = animation_data.end_index_frame_start_moving, .row = MS_AGENT_SPRITE_SHEET_ROW_START_MOVING }; + } + if (static_cast(sprite_sheet_rows - 1) >= MS_AGENT_SPRITE_SHEET_ROW_MOVING) { + result.result.moving = { .valid = true, .start_col = animation_data.start_index_frame_moving, .end_col = animation_data.end_index_frame_moving, .row = MS_AGENT_SPRITE_SHEET_ROW_MOVING }; + } + if (static_cast(sprite_sheet_rows - 1) >= MS_AGENT_SPRITE_SHEET_ROW_END_MOVING) { + result.result.end_moving = { .valid = true, .start_col = animation_data.start_index_frame_end_moving, .end_col = animation_data.end_index_frame_end_moving, .row = MS_AGENT_SPRITE_SHEET_ROW_END_MOVING }; + } + //if (static_cast(sprite_sheet_rows - 1) >= MS_AGENT_SPRITE_SHEET_ROW_HAPPY) { + // result.result.happy = { .valid = true, .start_col = animation_data.start_index_frame_happy), .end_col = animation_data.end_index_happy_moving), .row = MS_AGENT_SPRITE_SHEET_ROW_HAPPY }; + //} + } + + return bongocat::move(result.result); } - created_result_t init_ms_agent_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows) { + created_result_t init_ms_agent_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows, const assets::ms_agent_animation_indices_t& animation_data) { using namespace assets; BONGOCAT_CHECK_NULL(ctx.shm.ptr, bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM); BONGOCAT_CHECK_NULL(ctx._local_copy_config.ptr, bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM); assert(anim_index >= 0 && static_cast(anim_index) < MS_AGENTS_ANIM_COUNT); BONGOCAT_LOG_VERBOSE("Load MS agent Animation (%d/%d): %s ...", anim_index, MS_AGENTS_ANIM_COUNT, sprite_sheet_image.name); - auto result = load_ms_agent_anim(ctx, anim_index, sprite_sheet_image, sprite_sheet_cols, sprite_sheet_rows); + auto result = load_ms_agent_anim(ctx, anim_index, sprite_sheet_image, sprite_sheet_cols, sprite_sheet_rows, animation_data); if (result.error != bongocat_error_t::BONGOCAT_SUCCESS) { BONGOCAT_LOG_ERROR("Load MS agent Animation failed: %s, index: %d", sprite_sheet_image.name, anim_index); return bongocat_error_t::BONGOCAT_ERROR_ANIMATION; @@ -159,7 +206,8 @@ namespace bongocat::animation { assert(result.error == bongocat_error_t::BONGOCAT_SUCCESS); ///< this SHOULD always work if it's an valid EMBEDDED image assert(anim_index >= 0); - ctx.shm->ms_anims[static_cast(anim_index)].ms_agent = bongocat::move(result.result); + ctx.shm->ms_anims[static_cast(anim_index)] = bongocat::move(result.result); + assert(ctx.shm->ms_anims[static_cast(anim_index)].type == animation_t::Type::MsAgent); return bongocat_error_t::BONGOCAT_SUCCESS; } @@ -168,11 +216,11 @@ namespace bongocat::animation { using namespace assets; using namespace animation; switch (index) { - case CLIPPY_ANIM_INDEX: return load_ms_agent_anim(ctx, CLIPPY_ANIM_INDEX, get_ms_agent_sprite_sheet(CLIPPY_ANIM_INDEX), CLIPPY_SPRITE_SHEET_COLS, CLIPPY_SPRITE_SHEET_ROWS); + case CLIPPY_ANIM_INDEX: return load_ms_agent_anim(ctx, CLIPPY_ANIM_INDEX, get_ms_agent_sprite_sheet(CLIPPY_ANIM_INDEX), CLIPPY_SPRITE_SHEET_COLS, CLIPPY_SPRITE_SHEET_ROWS, get_ms_agent_animation_indices(CLIPPY_ANIM_INDEX)); #ifdef FEATURE_MORE_MS_AGENT_EMBEDDED_ASSETS - case LINKS_ANIM_INDEX: return load_ms_agent_anim(ctx, LINKS_ANIM_INDEX, get_ms_agent_sprite_sheet(LINKS_ANIM_INDEX), LINKS_SPRITE_SHEET_COLS, LINKS_SPRITE_SHEET_ROWS); - case ROVER_ANIM_INDEX: return load_ms_agent_anim(ctx, ROVER_ANIM_INDEX, get_ms_agent_sprite_sheet(ROVER_ANIM_INDEX), ROVER_SPRITE_SHEET_COLS, ROVER_SPRITE_SHEET_ROWS); - case MERLIN_ANIM_INDEX: return load_ms_agent_anim(ctx, MERLIN_ANIM_INDEX, get_ms_agent_sprite_sheet(MERLIN_ANIM_INDEX), MERLIN_SPRITE_SHEET_COLS, MERLIN_SPRITE_SHEET_ROWS); + case LINKS_ANIM_INDEX: return load_ms_agent_anim(ctx, LINKS_ANIM_INDEX, get_ms_agent_sprite_sheet(LINKS_ANIM_INDEX), LINKS_SPRITE_SHEET_COLS, LINKS_SPRITE_SHEET_ROWS, get_ms_agent_animation_indices(LINKS_ANIM_INDEX)); + case ROVER_ANIM_INDEX: return load_ms_agent_anim(ctx, ROVER_ANIM_INDEX, get_ms_agent_sprite_sheet(ROVER_ANIM_INDEX), ROVER_SPRITE_SHEET_COLS, ROVER_SPRITE_SHEET_ROWS, get_ms_agent_animation_indices(ROVER_ANIM_INDEX)); + case MERLIN_ANIM_INDEX: return load_ms_agent_anim(ctx, MERLIN_ANIM_INDEX, get_ms_agent_sprite_sheet(MERLIN_ANIM_INDEX), MERLIN_SPRITE_SHEET_COLS, MERLIN_SPRITE_SHEET_ROWS, get_ms_agent_animation_indices(MERLIN_ANIM_INDEX)); #endif default: return bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM; } diff --git a/src/image_loader/pen/CMakeLists.txt b/src/image_loader/pen/CMakeLists.txt new file mode 100644 index 00000000..073b6ee9 --- /dev/null +++ b/src/image_loader/pen/CMakeLists.txt @@ -0,0 +1,9 @@ +add_library(assets_pen_loader STATIC) +target_sources(assets_pen_loader PRIVATE pen_load_sprite_sheet.cpp load_images_pen.cpp) +target_compile_options(assets_pen_loader PRIVATE -ffunction-sections -fdata-sections) +target_include_directories(assets_pen_loader + PRIVATE ${INCLUDE_DIR}/embedded_assets/pen ${INCLUDE_DIR}/image_loader/pen + PUBLIC ${INCLUDE_DIR}) +target_link_libraries(assets_pen_loader + PUBLIC assets_image_loader assets_base_dm_loader assets_pen + PRIVATE assets_pen_interface assets_pen_feature bongocat_options) \ No newline at end of file diff --git a/src/image_loader/pen/load_images_pen.cpp b/src/image_loader/pen/load_images_pen.cpp new file mode 100644 index 00000000..65ecc366 --- /dev/null +++ b/src/image_loader/pen/load_images_pen.cpp @@ -0,0 +1,27 @@ +#include "load_images_pen.h" +#include "embedded_assets/pen/pen.hpp" +#include "graphics/animation_context.h" +#include "image_loader/load_images.h" +#include "image_loader/base_dm/load_dm.h" + +namespace bongocat::animation { +bongocat_error_t init_pen_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows) { + using namespace assets; + BONGOCAT_CHECK_NULL(ctx.shm.ptr, bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM); + BONGOCAT_CHECK_NULL(ctx._local_copy_config.ptr, bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM); + + assert(anim_index >= 0 && static_cast(anim_index) < PEN_ANIM_COUNT); + BONGOCAT_LOG_VERBOSE("Load pen Animation (%d/%d): %s ...", anim_index, PEN_ANIM_COUNT, sprite_sheet_image.name); + auto result = load_dm_anim(ctx, anim_index, sprite_sheet_image, sprite_sheet_cols, sprite_sheet_rows); + if (result.error != bongocat_error_t::BONGOCAT_SUCCESS) [[unlikely]] { + BONGOCAT_LOG_ERROR("Load pen Animation failed: %s, index: %d", sprite_sheet_image.name, anim_index); + return bongocat_error_t::BONGOCAT_ERROR_ANIMATION; + } + assert(result.result.total_frames > 0); ///< this SHOULD always work if it's an valid EMBEDDED image + + assert(anim_index >= 0); + ctx.shm->pen_anims[static_cast(anim_index)].dm = bongocat::move(result.result); + + return bongocat_error_t::BONGOCAT_SUCCESS; +} +} diff --git a/src/image_loader/pen/pen_load_sprite_sheet.cpp b/src/image_loader/pen/pen_load_sprite_sheet.cpp new file mode 100644 index 00000000..fc8864aa --- /dev/null +++ b/src/image_loader/pen/pen_load_sprite_sheet.cpp @@ -0,0 +1,110 @@ +#include "core/bongocat.h" +#include "graphics/animation_context.h" +#include "graphics/sprite_sheet.h" +#include "image_loader/base_dm/load_dm.h" +#include "embedded_assets/pen/pen.hpp" +#include "embedded_assets/embedded_image.h" +#include "embedded_assets/pen/pen_sprite.h" +#include "image_loader/pen/load_images_pen.h" + +namespace bongocat::animation { + created_result_t load_pen_sprite_sheet(const animation_context_t& ctx, int index) { + using namespace assets; + switch (index) { + case PEN_AERO_V_DRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_AERO_V_DRAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_AERO_V_DRAMON_ANIM_INDEX), PEN_AERO_V_DRAMON_SPRITE_SHEET_COLS, PEN_AERO_V_DRAMON_SPRITE_SHEET_ROWS); + case PEN_ANGEWOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_ANGEWOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_ANGEWOMON_ANIM_INDEX), PEN_ANGEWOMON_SPRITE_SHEET_COLS, PEN_ANGEWOMON_SPRITE_SHEET_ROWS); + case PEN_ANOMALOCARIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_ANOMALOCARIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_ANOMALOCARIMON_ANIM_INDEX), PEN_ANOMALOCARIMON_SPRITE_SHEET_COLS, PEN_ANOMALOCARIMON_SPRITE_SHEET_ROWS); + case PEN_ASURAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_ASURAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_ASURAMON_ANIM_INDEX), PEN_ASURAMON_SPRITE_SHEET_COLS, PEN_ASURAMON_SPRITE_SHEET_ROWS); + case PEN_ATLUR_KABUTERIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_ATLUR_KABUTERIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_ATLUR_KABUTERIMON_ANIM_INDEX), PEN_ATLUR_KABUTERIMON_SPRITE_SHEET_COLS, PEN_ATLUR_KABUTERIMON_SPRITE_SHEET_ROWS); + case PEN_BAKUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_BAKUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_BAKUMON_ANIM_INDEX), PEN_BAKUMON_SPRITE_SHEET_COLS, PEN_BAKUMON_SPRITE_SHEET_ROWS); + case PEN_BIG_MAMEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_BIG_MAMEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_BIG_MAMEMON_ANIM_INDEX), PEN_BIG_MAMEMON_SPRITE_SHEET_COLS, PEN_BIG_MAMEMON_SPRITE_SHEET_ROWS); + case PEN_BLOSSOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_BLOSSOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_BLOSSOMON_ANIM_INDEX), PEN_BLOSSOMON_SPRITE_SHEET_COLS, PEN_BLOSSOMON_SPRITE_SHEET_ROWS); + case PEN_BOLTMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_BOLTMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_BOLTMON_ANIM_INDEX), PEN_BOLTMON_SPRITE_SHEET_COLS, PEN_BOLTMON_SPRITE_SHEET_ROWS); + case PEN_BUBBMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_BUBBMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_BUBBMON_ANIM_INDEX), PEN_BUBBMON_SPRITE_SHEET_COLS, PEN_BUBBMON_SPRITE_SHEET_ROWS); + case PEN_CANDMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_CANDMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_CANDMON_ANIM_INDEX), PEN_CANDMON_SPRITE_SHEET_COLS, PEN_CANDMON_SPRITE_SHEET_ROWS); + case PEN_CAPRIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_CAPRIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_CAPRIMON_ANIM_INDEX), PEN_CAPRIMON_SPRITE_SHEET_COLS, PEN_CAPRIMON_SPRITE_SHEET_ROWS); + case PEN_CHOROMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_CHOROMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_CHOROMON_ANIM_INDEX), PEN_CHOROMON_SPRITE_SHEET_COLS, PEN_CHOROMON_SPRITE_SHEET_ROWS); + case PEN_CLOCKMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_CLOCKMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_CLOCKMON_ANIM_INDEX), PEN_CLOCKMON_SPRITE_SHEET_COLS, PEN_CLOCKMON_SPRITE_SHEET_ROWS); + case PEN_CYBERDRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_CYBERDRAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_CYBERDRAMON_ANIM_INDEX), PEN_CYBERDRAMON_SPRITE_SHEET_COLS, PEN_CYBERDRAMON_SPRITE_SHEET_ROWS); + case PEN_DAGOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_DAGOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_DAGOMON_ANIM_INDEX), PEN_DAGOMON_SPRITE_SHEET_COLS, PEN_DAGOMON_SPRITE_SHEET_ROWS); + case PEN_DEATH_MERAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_DEATH_MERAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_DEATH_MERAMON_ANIM_INDEX), PEN_DEATH_MERAMON_SPRITE_SHEET_COLS, PEN_DEATH_MERAMON_SPRITE_SHEET_ROWS); + case PEN_DELUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_DELUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_DELUMON_ANIM_INDEX), PEN_DELUMON_SPRITE_SHEET_COLS, PEN_DELUMON_SPRITE_SHEET_ROWS); + case PEN_DOKUGUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_DOKUGUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_DOKUGUMON_ANIM_INDEX), PEN_DOKUGUMON_SPRITE_SHEET_COLS, PEN_DOKUGUMON_SPRITE_SHEET_ROWS); + case PEN_EBIDRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_EBIDRAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_EBIDRAMON_ANIM_INDEX), PEN_EBIDRAMON_SPRITE_SHEET_COLS, PEN_EBIDRAMON_SPRITE_SHEET_ROWS); + case PEN_FANTOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_FANTOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_FANTOMON_ANIM_INDEX), PEN_FANTOMON_SPRITE_SHEET_COLS, PEN_FANTOMON_SPRITE_SHEET_ROWS); + case PEN_FLORAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_FLORAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_FLORAMON_ANIM_INDEX), PEN_FLORAMON_SPRITE_SHEET_COLS, PEN_FLORAMON_SPRITE_SHEET_ROWS); + case PEN_GANIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_GANIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GANIMON_ANIM_INDEX), PEN_GANIMON_SPRITE_SHEET_COLS, PEN_GANIMON_SPRITE_SHEET_ROWS); + case PEN_GARUDAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_GARUDAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GARUDAMON_ANIM_INDEX), PEN_GARUDAMON_SPRITE_SHEET_COLS, PEN_GARUDAMON_SPRITE_SHEET_ROWS); + case PEN_GEKOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_GEKOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GEKOMON_ANIM_INDEX), PEN_GEKOMON_SPRITE_SHEET_COLS, PEN_GEKOMON_SPRITE_SHEET_ROWS); + case PEN_GERBEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_GERBEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GERBEMON_ANIM_INDEX), PEN_GERBEMON_SPRITE_SHEET_COLS, PEN_GERBEMON_SPRITE_SHEET_ROWS); + case PEN_GESOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_GESOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GESOMON_ANIM_INDEX), PEN_GESOMON_SPRITE_SHEET_COLS, PEN_GESOMON_SPRITE_SHEET_ROWS); + case PEN_GOMAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_GOMAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GOMAMON_ANIM_INDEX), PEN_GOMAMON_SPRITE_SHEET_COLS, PEN_GOMAMON_SPRITE_SHEET_ROWS); + case PEN_GOTTSUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_GOTTSUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GOTTSUMON_ANIM_INDEX), PEN_GOTTSUMON_SPRITE_SHEET_COLS, PEN_GOTTSUMON_SPRITE_SHEET_ROWS); + case PEN_GRIFFOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_GRIFFOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GRIFFOMON_ANIM_INDEX), PEN_GRIFFOMON_SPRITE_SHEET_COLS, PEN_GRIFFOMON_SPRITE_SHEET_ROWS); + case PEN_GUARDROMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_GUARDROMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_GUARDROMON_ANIM_INDEX), PEN_GUARDROMON_SPRITE_SHEET_COLS, PEN_GUARDROMON_SPRITE_SHEET_ROWS); + case PEN_HAGURUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_HAGURUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_HAGURUMON_ANIM_INDEX), PEN_HAGURUMON_SPRITE_SHEET_COLS, PEN_HAGURUMON_SPRITE_SHEET_ROWS); + case PEN_HANGYMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_HANGYMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_HANGYMON_ANIM_INDEX), PEN_HANGYMON_SPRITE_SHEET_COLS, PEN_HANGYMON_SPRITE_SHEET_ROWS); + case PEN_HANUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_HANUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_HANUMON_ANIM_INDEX), PEN_HANUMON_SPRITE_SHEET_COLS, PEN_HANUMON_SPRITE_SHEET_ROWS); + case PEN_HERKULE_KABUTERIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_HERKULE_KABUTERIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_HERKULE_KABUTERIMON_ANIM_INDEX), PEN_HERKULE_KABUTERIMON_SPRITE_SHEET_COLS, PEN_HERKULE_KABUTERIMON_SPRITE_SHEET_ROWS); + case PEN_HOLY_ANGEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_HOLY_ANGEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_HOLY_ANGEMON_ANIM_INDEX), PEN_HOLY_ANGEMON_SPRITE_SHEET_COLS, PEN_HOLY_ANGEMON_SPRITE_SHEET_ROWS); + case PEN_HOLYDRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_HOLYDRAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_HOLYDRAMON_ANIM_INDEX), PEN_HOLYDRAMON_SPRITE_SHEET_COLS, PEN_HOLYDRAMON_SPRITE_SHEET_ROWS); + case PEN_HOUOUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_HOUOUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_HOUOUMON_ANIM_INDEX), PEN_HOUOUMON_SPRITE_SHEET_COLS, PEN_HOUOUMON_SPRITE_SHEET_ROWS); + case PEN_IGNAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_IGNAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_IGNAMON_ANIM_INDEX), PEN_IGNAMON_SPRITE_SHEET_COLS, PEN_IGNAMON_SPRITE_SHEET_ROWS); + case PEN_IKKAKUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_IKKAKUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_IKKAKUMON_ANIM_INDEX), PEN_IKKAKUMON_SPRITE_SHEET_COLS, PEN_IKKAKUMON_SPRITE_SHEET_ROWS); + case PEN_JYAGAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_JYAGAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_JYAGAMON_ANIM_INDEX), PEN_JYAGAMON_SPRITE_SHEET_COLS, PEN_JYAGAMON_SPRITE_SHEET_ROWS); + case PEN_JYUREIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_JYUREIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_JYUREIMON_ANIM_INDEX), PEN_JYUREIMON_SPRITE_SHEET_COLS, PEN_JYUREIMON_SPRITE_SHEET_ROWS); + case PEN_KIWIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_KIWIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_KIWIMON_ANIM_INDEX), PEN_KIWIMON_SPRITE_SHEET_COLS, PEN_KIWIMON_SPRITE_SHEET_ROWS); + case PEN_KNIGHTMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_KNIGHTMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_KNIGHTMON_ANIM_INDEX), PEN_KNIGHTMON_SPRITE_SHEET_COLS, PEN_KNIGHTMON_SPRITE_SHEET_ROWS); + case PEN_KOKUWAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_KOKUWAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_KOKUWAMON_ANIM_INDEX), PEN_KOKUWAMON_SPRITE_SHEET_COLS, PEN_KOKUWAMON_SPRITE_SHEET_ROWS); + case PEN_LADY_DEVIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_LADY_DEVIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_LADY_DEVIMON_ANIM_INDEX), PEN_LADY_DEVIMON_SPRITE_SHEET_COLS, PEN_LADY_DEVIMON_SPRITE_SHEET_ROWS); + case PEN_LILIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_LILIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_LILIMON_ANIM_INDEX), PEN_LILIMON_SPRITE_SHEET_COLS, PEN_LILIMON_SPRITE_SHEET_ROWS); + case PEN_MAMMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_MAMMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MAMMON_ANIM_INDEX), PEN_MAMMON_SPRITE_SHEET_COLS, PEN_MAMMON_SPRITE_SHEET_ROWS); + case PEN_MARIN_ANGEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_MARIN_ANGEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MARIN_ANGEMON_ANIM_INDEX), PEN_MARIN_ANGEMON_SPRITE_SHEET_COLS, PEN_MARIN_ANGEMON_SPRITE_SHEET_ROWS); + case PEN_MARIN_DEVIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_MARIN_DEVIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MARIN_DEVIMON_ANIM_INDEX), PEN_MARIN_DEVIMON_SPRITE_SHEET_COLS, PEN_MARIN_DEVIMON_SPRITE_SHEET_ROWS); + case PEN_MECHANORIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_MECHANORIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MECHANORIMON_ANIM_INDEX), PEN_MECHANORIMON_SPRITE_SHEET_COLS, PEN_MECHANORIMON_SPRITE_SHEET_ROWS); + case PEN_MEGA_SEADRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_MEGA_SEADRAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MEGA_SEADRAMON_ANIM_INDEX), PEN_MEGA_SEADRAMON_SPRITE_SHEET_COLS, PEN_MEGA_SEADRAMON_SPRITE_SHEET_ROWS); + case PEN_METAL_ETEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_METAL_ETEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_METAL_ETEMON_ANIM_INDEX), PEN_METAL_ETEMON_SPRITE_SHEET_COLS, PEN_METAL_ETEMON_SPRITE_SHEET_ROWS); + case PEN_METAL_SEADRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_METAL_SEADRAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_METAL_SEADRAMON_ANIM_INDEX), PEN_METAL_SEADRAMON_SPRITE_SHEET_COLS, PEN_METAL_SEADRAMON_SPRITE_SHEET_ROWS); + case PEN_MOCHIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_MOCHIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MOCHIMON_ANIM_INDEX), PEN_MOCHIMON_SPRITE_SHEET_COLS, PEN_MOCHIMON_SPRITE_SHEET_ROWS); + case PEN_MOKUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_MOKUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MOKUMON_ANIM_INDEX), PEN_MOKUMON_SPRITE_SHEET_COLS, PEN_MOKUMON_SPRITE_SHEET_ROWS); + case PEN_MUSHMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_MUSHMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_MUSHMON_ANIM_INDEX), PEN_MUSHMON_SPRITE_SHEET_COLS, PEN_MUSHMON_SPRITE_SHEET_ROWS); + case PEN_NYOKIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_NYOKIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_NYOKIMON_ANIM_INDEX), PEN_NYOKIMON_SPRITE_SHEET_COLS, PEN_NYOKIMON_SPRITE_SHEET_ROWS); + case PEN_OCTMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_OCTMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_OCTMON_ANIM_INDEX), PEN_OCTMON_SPRITE_SHEET_COLS, PEN_OCTMON_SPRITE_SHEET_ROWS); + case PEN_OKUWAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_OKUWAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_OKUWAMON_ANIM_INDEX), PEN_OKUWAMON_SPRITE_SHEET_COLS, PEN_OKUWAMON_SPRITE_SHEET_ROWS); + case PEN_OTAMAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_OTAMAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_OTAMAMON_ANIM_INDEX), PEN_OTAMAMON_SPRITE_SHEET_COLS, PEN_OTAMAMON_SPRITE_SHEET_ROWS); + case PEN_PETI_MERAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_PETI_MERAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_PETI_MERAMON_ANIM_INDEX), PEN_PETI_MERAMON_SPRITE_SHEET_COLS, PEN_PETI_MERAMON_SPRITE_SHEET_ROWS); + case PEN_PICO_DEVIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_PICO_DEVIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_PICO_DEVIMON_ANIM_INDEX), PEN_PICO_DEVIMON_SPRITE_SHEET_COLS, PEN_PICO_DEVIMON_SPRITE_SHEET_ROWS); + case PEN_PIEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_PIEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_PIEMON_ANIM_INDEX), PEN_PIEMON_SPRITE_SHEET_COLS, PEN_PIEMON_SPRITE_SHEET_ROWS); + case PEN_PLESIOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_PLESIOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_PLESIOMON_ANIM_INDEX), PEN_PLESIOMON_SPRITE_SHEET_COLS, PEN_PLESIOMON_SPRITE_SHEET_ROWS); + case PEN_PUKUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_PUKUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_PUKUMON_ANIM_INDEX), PEN_PUKUMON_SPRITE_SHEET_COLS, PEN_PUKUMON_SPRITE_SHEET_ROWS); + case PEN_PUMPMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_PUMPMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_PUMPMON_ANIM_INDEX), PEN_PUMPMON_SPRITE_SHEET_COLS, PEN_PUMPMON_SPRITE_SHEET_ROWS); + case PEN_PYOCOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_PYOCOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_PYOCOMON_ANIM_INDEX), PEN_PYOCOMON_SPRITE_SHEET_COLS, PEN_PYOCOMON_SPRITE_SHEET_ROWS); + case PEN_RAKAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_RAKAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_RAKAMON_ANIM_INDEX), PEN_RAKAMON_SPRITE_SHEET_COLS, PEN_RAKAMON_SPRITE_SHEET_ROWS); + case PEN_RED_VEGIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_RED_VEGIMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_RED_VEGIMON_ANIM_INDEX), PEN_RED_VEGIMON_SPRITE_SHEET_COLS, PEN_RED_VEGIMON_SPRITE_SHEET_ROWS); + case PEN_REVOLMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_REVOLMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_REVOLMON_ANIM_INDEX), PEN_REVOLMON_SPRITE_SHEET_COLS, PEN_REVOLMON_SPRITE_SHEET_ROWS); + case PEN_ROSEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_ROSEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_ROSEMON_ANIM_INDEX), PEN_ROSEMON_SPRITE_SHEET_COLS, PEN_ROSEMON_SPRITE_SHEET_ROWS); + case PEN_SABER_LEOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_SABER_LEOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_SABER_LEOMON_ANIM_INDEX), PEN_SABER_LEOMON_SPRITE_SHEET_COLS, PEN_SABER_LEOMON_SPRITE_SHEET_ROWS); + case PEN_SHAKOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_SHAKOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_SHAKOMON_ANIM_INDEX), PEN_SHAKOMON_SPRITE_SHEET_COLS, PEN_SHAKOMON_SPRITE_SHEET_ROWS); + case PEN_STARMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_STARMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_STARMON_ANIM_INDEX), PEN_STARMON_SPRITE_SHEET_COLS, PEN_STARMON_SPRITE_SHEET_ROWS); + case PEN_TAILMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_TAILMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TAILMON_ANIM_INDEX), PEN_TAILMON_SPRITE_SHEET_COLS, PEN_TAILMON_SPRITE_SHEET_ROWS); + case PEN_TANKMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_TANKMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TANKMON_ANIM_INDEX), PEN_TANKMON_SPRITE_SHEET_COLS, PEN_TANKMON_SPRITE_SHEET_ROWS); + case PEN_TENTOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_TENTOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TENTOMON_ANIM_INDEX), PEN_TENTOMON_SPRITE_SHEET_COLS, PEN_TENTOMON_SPRITE_SHEET_ROWS); + case PEN_THUNDERBALLMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_THUNDERBALLMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_THUNDERBALLMON_ANIM_INDEX), PEN_THUNDERBALLMON_SPRITE_SHEET_COLS, PEN_THUNDERBALLMON_SPRITE_SHEET_ROWS); + case PEN_TOGEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_TOGEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TOGEMON_ANIM_INDEX), PEN_TOGEMON_SPRITE_SHEET_COLS, PEN_TOGEMON_SPRITE_SHEET_ROWS); + case PEN_TONOSAMA_GEKOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_TONOSAMA_GEKOMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TONOSAMA_GEKOMON_ANIM_INDEX), PEN_TONOSAMA_GEKOMON_SPRITE_SHEET_COLS, PEN_TONOSAMA_GEKOMON_SPRITE_SHEET_ROWS); + case PEN_TORTAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_TORTAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TORTAMON_ANIM_INDEX), PEN_TORTAMON_SPRITE_SHEET_COLS, PEN_TORTAMON_SPRITE_SHEET_ROWS); + case PEN_TOY_AGUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_TOY_AGUMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TOY_AGUMON_ANIM_INDEX), PEN_TOY_AGUMON_SPRITE_SHEET_COLS, PEN_TOY_AGUMON_SPRITE_SHEET_ROWS); + case PEN_TRICERAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_TRICERAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_TRICERAMON_ANIM_INDEX), PEN_TRICERAMON_SPRITE_SHEET_COLS, PEN_TRICERAMON_SPRITE_SHEET_ROWS); + case PEN_V_DRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_V_DRAMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_V_DRAMON_ANIM_INDEX), PEN_V_DRAMON_SPRITE_SHEET_COLS, PEN_V_DRAMON_SPRITE_SHEET_ROWS); + case PEN_VEMDEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_VEMDEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_VEMDEMON_ANIM_INDEX), PEN_VEMDEMON_SPRITE_SHEET_COLS, PEN_VEMDEMON_SPRITE_SHEET_ROWS); + case PEN_VENOM_VAMDEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_VENOM_VAMDEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_VENOM_VAMDEMON_ANIM_INDEX), PEN_VENOM_VAMDEMON_SPRITE_SHEET_COLS, PEN_VENOM_VAMDEMON_SPRITE_SHEET_ROWS); + case PEN_WARU_MOZAEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_WARU_MOZAEMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_WARU_MOZAEMON_ANIM_INDEX), PEN_WARU_MOZAEMON_SPRITE_SHEET_COLS, PEN_WARU_MOZAEMON_SPRITE_SHEET_ROWS); + case PEN_WIZARMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_WIZARMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_WIZARMON_ANIM_INDEX), PEN_WIZARMON_SPRITE_SHEET_COLS, PEN_WIZARMON_SPRITE_SHEET_ROWS); + case PEN_WOODMON_ANIM_INDEX: return load_dm_anim(ctx, PEN_WOODMON_ANIM_INDEX, get_pen_sprite_sheet(PEN_WOODMON_ANIM_INDEX), PEN_WOODMON_SPRITE_SHEET_COLS, PEN_WOODMON_SPRITE_SHEET_ROWS); + case PEN_ZUDOMOM_ANIM_INDEX: return load_dm_anim(ctx, PEN_ZUDOMOM_ANIM_INDEX, get_pen_sprite_sheet(PEN_ZUDOMOM_ANIM_INDEX), PEN_ZUDOMOM_SPRITE_SHEET_COLS, PEN_ZUDOMOM_SPRITE_SHEET_ROWS); + default: return bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM; + } + return bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM; + } +} + diff --git a/src/image_loader/pen20/CMakeLists.txt b/src/image_loader/pen20/CMakeLists.txt new file mode 100644 index 00000000..c7dcb0df --- /dev/null +++ b/src/image_loader/pen20/CMakeLists.txt @@ -0,0 +1,9 @@ +add_library(assets_pen20_loader STATIC) +target_sources(assets_pen20_loader PRIVATE pen20_load_sprite_sheet.cpp load_images_pen20.cpp) +target_compile_options(assets_pen20_loader PRIVATE -ffunction-sections -fdata-sections) +target_include_directories(assets_pen20_loader + PRIVATE ${INCLUDE_DIR}/embedded_assets/pen20 ${INCLUDE_DIR}/image_loader/pen20 + PUBLIC ${INCLUDE_DIR}) +target_link_libraries(assets_pen20_loader + PUBLIC assets_image_loader assets_base_dm_loader assets_pen20 + PRIVATE assets_pen20_interface assets_pen20_feature bongocat_options) \ No newline at end of file diff --git a/src/image_loader/pen20/load_images_pen20.cpp b/src/image_loader/pen20/load_images_pen20.cpp new file mode 100644 index 00000000..42dc0506 --- /dev/null +++ b/src/image_loader/pen20/load_images_pen20.cpp @@ -0,0 +1,27 @@ +#include "load_images_pen20.h" +#include "embedded_assets/pen20/pen20.hpp" +#include "graphics/animation_context.h" +#include "image_loader/load_images.h" +#include "image_loader/base_dm/load_dm.h" + +namespace bongocat::animation { +bongocat_error_t init_pen20_anim(animation_context_t& ctx, int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows) { + using namespace assets; + BONGOCAT_CHECK_NULL(ctx.shm.ptr, bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM); + BONGOCAT_CHECK_NULL(ctx._local_copy_config.ptr, bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM); + + assert(anim_index >= 0 && static_cast(anim_index) < PEN20_ANIM_COUNT); + BONGOCAT_LOG_VERBOSE("Load pen20 Animation (%d/%d): %s ...", anim_index, PEN20_ANIM_COUNT, sprite_sheet_image.name); + auto result = load_dm_anim(ctx, anim_index, sprite_sheet_image, sprite_sheet_cols, sprite_sheet_rows); + if (result.error != bongocat_error_t::BONGOCAT_SUCCESS) [[unlikely]] { + BONGOCAT_LOG_ERROR("Load pen Animation failed: %s, index: %d", sprite_sheet_image.name, anim_index); + return bongocat_error_t::BONGOCAT_ERROR_ANIMATION; + } + assert(result.result.total_frames > 0); ///< this SHOULD always work if it's an valid EMBEDDED image + + assert(anim_index >= 0); + ctx.shm->pen20_anims[static_cast(anim_index)].dm = bongocat::move(result.result); + + return bongocat_error_t::BONGOCAT_SUCCESS; +} +} diff --git a/src/image_loader/pen20/pen20_load_sprite_sheet.cpp b/src/image_loader/pen20/pen20_load_sprite_sheet.cpp new file mode 100644 index 00000000..cd7f02f7 --- /dev/null +++ b/src/image_loader/pen20/pen20_load_sprite_sheet.cpp @@ -0,0 +1,185 @@ +#include "core/bongocat.h" +#include "graphics/animation_context.h" +#include "graphics/sprite_sheet.h" +#include "image_loader/base_dm/load_dm.h" +#include "embedded_assets/pen20/pen20.hpp" +#include "embedded_assets/embedded_image.h" +#include "embedded_assets/pen20/pen20_sprite.h" +#include "image_loader/pen20/load_images_pen20.h" + +namespace bongocat::animation { + created_result_t load_pen20_sprite_sheet(const animation_context_t& ctx, int index) { + using namespace assets; + switch (index) { + case PEN20_AERO_V_DRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_AERO_V_DRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_AERO_V_DRAMON_ANIM_INDEX), PEN20_AERO_V_DRAMON_SPRITE_SHEET_COLS, PEN20_AERO_V_DRAMON_SPRITE_SHEET_ROWS); + case PEN20_AGUMON_HAKASE_ANIM_INDEX: return load_dm_anim(ctx, PEN20_AGUMON_HAKASE_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_AGUMON_HAKASE_ANIM_INDEX), PEN20_AGUMON_HAKASE_SPRITE_SHEET_COLS, PEN20_AGUMON_HAKASE_SPRITE_SHEET_ROWS); + case PEN20_ALPHAMON_OURYUKEN_ANIM_INDEX: return load_dm_anim(ctx, PEN20_ALPHAMON_OURYUKEN_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ALPHAMON_OURYUKEN_ANIM_INDEX), PEN20_ALPHAMON_OURYUKEN_SPRITE_SHEET_COLS, PEN20_ALPHAMON_OURYUKEN_SPRITE_SHEET_ROWS); + case PEN20_ANDIRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_ANDIRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ANDIRAMON_ANIM_INDEX), PEN20_ANDIRAMON_SPRITE_SHEET_COLS, PEN20_ANDIRAMON_SPRITE_SHEET_ROWS); + case PEN20_ANGEWOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_ANGEWOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ANGEWOMON_ANIM_INDEX), PEN20_ANGEWOMON_SPRITE_SHEET_COLS, PEN20_ANGEWOMON_SPRITE_SHEET_ROWS); + case PEN20_ANOMALOCARIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_ANOMALOCARIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ANOMALOCARIMON_ANIM_INDEX), PEN20_ANOMALOCARIMON_SPRITE_SHEET_COLS, PEN20_ANOMALOCARIMON_SPRITE_SHEET_ROWS); + case PEN20_ARRESTERDRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_ARRESTERDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ARRESTERDRAMON_ANIM_INDEX), PEN20_ARRESTERDRAMON_SPRITE_SHEET_COLS, PEN20_ARRESTERDRAMON_SPRITE_SHEET_ROWS); + case PEN20_ASTRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_ASTRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ASTRAMON_ANIM_INDEX), PEN20_ASTRAMON_SPRITE_SHEET_COLS, PEN20_ASTRAMON_SPRITE_SHEET_ROWS); + case PEN20_ASURAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_ASURAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ASURAMON_ANIM_INDEX), PEN20_ASURAMON_SPRITE_SHEET_COLS, PEN20_ASURAMON_SPRITE_SHEET_ROWS); + case PEN20_ATLUR_KABUTERIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_ATLUR_KABUTERIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ATLUR_KABUTERIMON_ANIM_INDEX), PEN20_ATLUR_KABUTERIMON_SPRITE_SHEET_COLS, PEN20_ATLUR_KABUTERIMON_SPRITE_SHEET_ROWS); + case PEN20_BAALMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_BAALMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BAALMON_ANIM_INDEX), PEN20_BAALMON_SPRITE_SHEET_COLS, PEN20_BAALMON_SPRITE_SHEET_ROWS); + case PEN20_BAKUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_BAKUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BAKUMON_ANIM_INDEX), PEN20_BAKUMON_SPRITE_SHEET_COLS, PEN20_BAKUMON_SPRITE_SHEET_ROWS); + case PEN20_BANCHO_LEOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_BANCHO_LEOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BANCHO_LEOMON_ANIM_INDEX), PEN20_BANCHO_LEOMON_SPRITE_SHEET_COLS, PEN20_BANCHO_LEOMON_SPRITE_SHEET_ROWS); + case PEN20_BEELZEBUMON_BLAST_MODE_ANIM_INDEX: return load_dm_anim(ctx, PEN20_BEELZEBUMON_BLAST_MODE_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BEELZEBUMON_BLAST_MODE_ANIM_INDEX), PEN20_BEELZEBUMON_BLAST_MODE_SPRITE_SHEET_COLS, PEN20_BEELZEBUMON_BLAST_MODE_SPRITE_SHEET_ROWS); + case PEN20_BEOWULFMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_BEOWULFMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BEOWULFMON_ANIM_INDEX), PEN20_BEOWULFMON_SPRITE_SHEET_COLS, PEN20_BEOWULFMON_SPRITE_SHEET_ROWS); + case PEN20_BIG_MAMEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_BIG_MAMEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BIG_MAMEMON_ANIM_INDEX), PEN20_BIG_MAMEMON_SPRITE_SHEET_COLS, PEN20_BIG_MAMEMON_SPRITE_SHEET_ROWS); + case PEN20_BLOSSOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_BLOSSOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BLOSSOMON_ANIM_INDEX), PEN20_BLOSSOMON_SPRITE_SHEET_COLS, PEN20_BLOSSOMON_SPRITE_SHEET_ROWS); + case PEN20_BOLTMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_BOLTMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BOLTMON_ANIM_INDEX), PEN20_BOLTMON_SPRITE_SHEET_COLS, PEN20_BOLTMON_SPRITE_SHEET_ROWS); + case PEN20_BRYWELUDRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_BRYWELUDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BRYWELUDRAMON_ANIM_INDEX), PEN20_BRYWELUDRAMON_SPRITE_SHEET_COLS, PEN20_BRYWELUDRAMON_SPRITE_SHEET_ROWS); + case PEN20_BUBBMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_BUBBMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BUBBMON_ANIM_INDEX), PEN20_BUBBMON_SPRITE_SHEET_COLS, PEN20_BUBBMON_SPRITE_SHEET_ROWS); + case PEN20_BUDMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_BUDMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BUDMON_ANIM_INDEX), PEN20_BUDMON_SPRITE_SHEET_COLS, PEN20_BUDMON_SPRITE_SHEET_ROWS); + case PEN20_BUSHI_AGUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_BUSHI_AGUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_BUSHI_AGUMON_ANIM_INDEX), PEN20_BUSHI_AGUMON_SPRITE_SHEET_COLS, PEN20_BUSHI_AGUMON_SPRITE_SHEET_ROWS); + case PEN20_CANDMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_CANDMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CANDMON_ANIM_INDEX), PEN20_CANDMON_SPRITE_SHEET_COLS, PEN20_CANDMON_SPRITE_SHEET_ROWS); + case PEN20_CAPRIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_CAPRIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CAPRIMON_ANIM_INDEX), PEN20_CAPRIMON_SPRITE_SHEET_COLS, PEN20_CAPRIMON_SPRITE_SHEET_ROWS); + case PEN20_CHAOSMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_CHAOSMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CHAOSMON_ANIM_INDEX), PEN20_CHAOSMON_SPRITE_SHEET_COLS, PEN20_CHAOSMON_SPRITE_SHEET_ROWS); + case PEN20_CHERUBIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_CHERUBIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CHERUBIMON_ANIM_INDEX), PEN20_CHERUBIMON_SPRITE_SHEET_COLS, PEN20_CHERUBIMON_SPRITE_SHEET_ROWS); + case PEN20_CHIBIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_CHIBIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CHIBIMON_ANIM_INDEX), PEN20_CHIBIMON_SPRITE_SHEET_COLS, PEN20_CHIBIMON_SPRITE_SHEET_ROWS); + case PEN20_CHICOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_CHICOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CHICOMON_ANIM_INDEX), PEN20_CHICOMON_SPRITE_SHEET_COLS, PEN20_CHICOMON_SPRITE_SHEET_ROWS); + case PEN20_CHOROMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_CHOROMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CHOROMON_ANIM_INDEX), PEN20_CHOROMON_SPRITE_SHEET_COLS, PEN20_CHOROMON_SPRITE_SHEET_ROWS); + case PEN20_CLOCKMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_CLOCKMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CLOCKMON_ANIM_INDEX), PEN20_CLOCKMON_SPRITE_SHEET_COLS, PEN20_CLOCKMON_SPRITE_SHEET_ROWS); + case PEN20_COCOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_COCOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_COCOMON_ANIM_INDEX), PEN20_COCOMON_SPRITE_SHEET_COLS, PEN20_COCOMON_SPRITE_SHEET_ROWS); + case PEN20_COTSUCOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_COTSUCOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_COTSUCOMON_ANIM_INDEX), PEN20_COTSUCOMON_SPRITE_SHEET_COLS, PEN20_COTSUCOMON_SPRITE_SHEET_ROWS); + case PEN20_CYBERDRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_CYBERDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_CYBERDRAMON_ANIM_INDEX), PEN20_CYBERDRAMON_SPRITE_SHEET_COLS, PEN20_CYBERDRAMON_SPRITE_SHEET_ROWS); + case PEN20_DAGOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_DAGOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_DAGOMON_ANIM_INDEX), PEN20_DAGOMON_SPRITE_SHEET_COLS, PEN20_DAGOMON_SPRITE_SHEET_ROWS); + case PEN20_DARKDRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_DARKDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_DARKDRAMON_ANIM_INDEX), PEN20_DARKDRAMON_SPRITE_SHEET_COLS, PEN20_DARKDRAMON_SPRITE_SHEET_ROWS); + case PEN20_DARK_KNIGHTMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_DARK_KNIGHTMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_DARK_KNIGHTMON_ANIM_INDEX), PEN20_DARK_KNIGHTMON_SPRITE_SHEET_COLS, PEN20_DARK_KNIGHTMON_SPRITE_SHEET_ROWS); + case PEN20_DEATH_MERAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_DEATH_MERAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_DEATH_MERAMON_ANIM_INDEX), PEN20_DEATH_MERAMON_SPRITE_SHEET_COLS, PEN20_DEATH_MERAMON_SPRITE_SHEET_ROWS); + case PEN20_DELUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_DELUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_DELUMON_ANIM_INDEX), PEN20_DELUMON_SPRITE_SHEET_COLS, PEN20_DELUMON_SPRITE_SHEET_ROWS); + case PEN20_DOKUGUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_DOKUGUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_DOKUGUMON_ANIM_INDEX), PEN20_DOKUGUMON_SPRITE_SHEET_COLS, PEN20_DOKUGUMON_SPRITE_SHEET_ROWS); + case PEN20_DORUGORAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_DORUGORAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_DORUGORAMON_ANIM_INDEX), PEN20_DORUGORAMON_SPRITE_SHEET_COLS, PEN20_DORUGORAMON_SPRITE_SHEET_ROWS); + case PEN20_EBIDRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_EBIDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_EBIDRAMON_ANIM_INDEX), PEN20_EBIDRAMON_SPRITE_SHEET_COLS, PEN20_EBIDRAMON_SPRITE_SHEET_ROWS); + case PEN20_FANTOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_FANTOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_FANTOMON_ANIM_INDEX), PEN20_FANTOMON_SPRITE_SHEET_COLS, PEN20_FANTOMON_SPRITE_SHEET_ROWS); + case PEN20_FLORAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_FLORAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_FLORAMON_ANIM_INDEX), PEN20_FLORAMON_SPRITE_SHEET_COLS, PEN20_FLORAMON_SPRITE_SHEET_ROWS); + case PEN20_FUFUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_FUFUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_FUFUMON_ANIM_INDEX), PEN20_FUFUMON_SPRITE_SHEET_COLS, PEN20_FUFUMON_SPRITE_SHEET_ROWS); + case PEN20_GALGOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_GALGOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GALGOMON_ANIM_INDEX), PEN20_GALGOMON_SPRITE_SHEET_COLS, PEN20_GALGOMON_SPRITE_SHEET_ROWS); + case PEN20_GANIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_GANIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GANIMON_ANIM_INDEX), PEN20_GANIMON_SPRITE_SHEET_COLS, PEN20_GANIMON_SPRITE_SHEET_ROWS); + case PEN20_GARUDAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_GARUDAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GARUDAMON_ANIM_INDEX), PEN20_GARUDAMON_SPRITE_SHEET_COLS, PEN20_GARUDAMON_SPRITE_SHEET_ROWS); + case PEN20_GEKOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_GEKOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GEKOMON_ANIM_INDEX), PEN20_GEKOMON_SPRITE_SHEET_COLS, PEN20_GEKOMON_SPRITE_SHEET_ROWS); + case PEN20_GERBEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_GERBEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GERBEMON_ANIM_INDEX), PEN20_GERBEMON_SPRITE_SHEET_COLS, PEN20_GERBEMON_SPRITE_SHEET_ROWS); + case PEN20_GESOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_GESOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GESOMON_ANIM_INDEX), PEN20_GESOMON_SPRITE_SHEET_COLS, PEN20_GESOMON_SPRITE_SHEET_ROWS); + case PEN20_GINRYUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_GINRYUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GINRYUMON_ANIM_INDEX), PEN20_GINRYUMON_SPRITE_SHEET_COLS, PEN20_GINRYUMON_SPRITE_SHEET_ROWS); + case PEN20_GOMAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_GOMAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GOMAMON_ANIM_INDEX), PEN20_GOMAMON_SPRITE_SHEET_COLS, PEN20_GOMAMON_SPRITE_SHEET_ROWS); + case PEN20_GOTTSUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_GOTTSUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GOTTSUMON_ANIM_INDEX), PEN20_GOTTSUMON_SPRITE_SHEET_COLS, PEN20_GOTTSUMON_SPRITE_SHEET_ROWS); + case PEN20_GRIFFOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_GRIFFOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GRIFFOMON_ANIM_INDEX), PEN20_GRIFFOMON_SPRITE_SHEET_COLS, PEN20_GRIFFOMON_SPRITE_SHEET_ROWS); + case PEN20_GROWMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_GROWMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GROWMON_ANIM_INDEX), PEN20_GROWMON_SPRITE_SHEET_COLS, PEN20_GROWMON_SPRITE_SHEET_ROWS); + case PEN20_GUARDROMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_GUARDROMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GUARDROMON_ANIM_INDEX), PEN20_GUARDROMON_SPRITE_SHEET_COLS, PEN20_GUARDROMON_SPRITE_SHEET_ROWS); + case PEN20_GUIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_GUIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GUIMON_ANIM_INDEX), PEN20_GUIMON_SPRITE_SHEET_COLS, PEN20_GUIMON_SPRITE_SHEET_ROWS); + case PEN20_GUMMYMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_GUMMYMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_GUMMYMON_ANIM_INDEX), PEN20_GUMMYMON_SPRITE_SHEET_COLS, PEN20_GUMMYMON_SPRITE_SHEET_ROWS); + case PEN20_HAGURUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_HAGURUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HAGURUMON_ANIM_INDEX), PEN20_HAGURUMON_SPRITE_SHEET_COLS, PEN20_HAGURUMON_SPRITE_SHEET_ROWS); + case PEN20_HANGYMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_HANGYMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HANGYMON_ANIM_INDEX), PEN20_HANGYMON_SPRITE_SHEET_COLS, PEN20_HANGYMON_SPRITE_SHEET_ROWS); + case PEN20_HANUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_HANUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HANUMON_ANIM_INDEX), PEN20_HANUMON_SPRITE_SHEET_COLS, PEN20_HANUMON_SPRITE_SHEET_ROWS); + case PEN20_HERKULE_KABUTERIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_HERKULE_KABUTERIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HERKULE_KABUTERIMON_ANIM_INDEX), PEN20_HERKULE_KABUTERIMON_SPRITE_SHEET_COLS, PEN20_HERKULE_KABUTERIMON_SPRITE_SHEET_ROWS); + case PEN20_HISYARYUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_HISYARYUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HISYARYUMON_ANIM_INDEX), PEN20_HISYARYUMON_SPRITE_SHEET_COLS, PEN20_HISYARYUMON_SPRITE_SHEET_ROWS); + case PEN20_HOLY_ANGEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_HOLY_ANGEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HOLY_ANGEMON_ANIM_INDEX), PEN20_HOLY_ANGEMON_SPRITE_SHEET_COLS, PEN20_HOLY_ANGEMON_SPRITE_SHEET_ROWS); + case PEN20_HOLYDRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_HOLYDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HOLYDRAMON_ANIM_INDEX), PEN20_HOLYDRAMON_SPRITE_SHEET_COLS, PEN20_HOLYDRAMON_SPRITE_SHEET_ROWS); + case PEN20_HOUOUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_HOUOUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_HOUOUMON_ANIM_INDEX), PEN20_HOUOUMON_SPRITE_SHEET_COLS, PEN20_HOUOUMON_SPRITE_SHEET_ROWS); + case PEN20_IGNAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_IGNAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_IGNAMON_ANIM_INDEX), PEN20_IGNAMON_SPRITE_SHEET_COLS, PEN20_IGNAMON_SPRITE_SHEET_ROWS); + case PEN20_IKKAKUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_IKKAKUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_IKKAKUMON_ANIM_INDEX), PEN20_IKKAKUMON_SPRITE_SHEET_COLS, PEN20_IKKAKUMON_SPRITE_SHEET_ROWS); + case PEN20_IMPERIALDRAMON_FIGHTER_MODE_ANIM_INDEX: return load_dm_anim(ctx, PEN20_IMPERIALDRAMON_FIGHTER_MODE_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_IMPERIALDRAMON_FIGHTER_MODE_ANIM_INDEX), PEN20_IMPERIALDRAMON_FIGHTER_MODE_SPRITE_SHEET_COLS, PEN20_IMPERIALDRAMON_FIGHTER_MODE_SPRITE_SHEET_ROWS); + case PEN20_IMPMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_IMPMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_IMPMON_ANIM_INDEX), PEN20_IMPMON_SPRITE_SHEET_COLS, PEN20_IMPMON_SPRITE_SHEET_ROWS); + case PEN20_JESMON_X_ANIM_INDEX: return load_dm_anim(ctx, PEN20_JESMON_X_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_JESMON_X_ANIM_INDEX), PEN20_JESMON_X_SPRITE_SHEET_COLS, PEN20_JESMON_X_SPRITE_SHEET_ROWS); + case PEN20_JYAGAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_JYAGAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_JYAGAMON_ANIM_INDEX), PEN20_JYAGAMON_SPRITE_SHEET_COLS, PEN20_JYAGAMON_SPRITE_SHEET_ROWS); + case PEN20_JYUREIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_JYUREIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_JYUREIMON_ANIM_INDEX), PEN20_JYUREIMON_SPRITE_SHEET_COLS, PEN20_JYUREIMON_SPRITE_SHEET_ROWS); + case PEN20_KAKKINMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_KAKKINMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_KAKKINMON_ANIM_INDEX), PEN20_KAKKINMON_SPRITE_SHEET_COLS, PEN20_KAKKINMON_SPRITE_SHEET_ROWS); + case PEN20_KIWIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_KIWIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_KIWIMON_ANIM_INDEX), PEN20_KIWIMON_SPRITE_SHEET_COLS, PEN20_KIWIMON_SPRITE_SHEET_ROWS); + case PEN20_KNIGHTMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_KNIGHTMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_KNIGHTMON_ANIM_INDEX), PEN20_KNIGHTMON_SPRITE_SHEET_COLS, PEN20_KNIGHTMON_SPRITE_SHEET_ROWS); + case PEN20_KOKUWAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_KOKUWAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_KOKUWAMON_ANIM_INDEX), PEN20_KOKUWAMON_SPRITE_SHEET_COLS, PEN20_KOKUWAMON_SPRITE_SHEET_ROWS); + case PEN20_KYOKYOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_KYOKYOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_KYOKYOMON_ANIM_INDEX), PEN20_KYOKYOMON_SPRITE_SHEET_COLS, PEN20_KYOKYOMON_SPRITE_SHEET_ROWS); + case PEN20_LADY_DEVIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_LADY_DEVIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LADY_DEVIMON_ANIM_INDEX), PEN20_LADY_DEVIMON_SPRITE_SHEET_COLS, PEN20_LADY_DEVIMON_SPRITE_SHEET_ROWS); + case PEN20_LALAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_LALAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LALAMON_ANIM_INDEX), PEN20_LALAMON_SPRITE_SHEET_COLS, PEN20_LALAMON_SPRITE_SHEET_ROWS); + case PEN20_LAVOGARITAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_LAVOGARITAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LAVOGARITAMON_ANIM_INDEX), PEN20_LAVOGARITAMON_SPRITE_SHEET_COLS, PEN20_LAVOGARITAMON_SPRITE_SHEET_ROWS); + case PEN20_LAVORVOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_LAVORVOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LAVORVOMON_ANIM_INDEX), PEN20_LAVORVOMON_SPRITE_SHEET_COLS, PEN20_LAVORVOMON_SPRITE_SHEET_ROWS); + case PEN20_LILAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_LILAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LILAMON_ANIM_INDEX), PEN20_LILAMON_SPRITE_SHEET_COLS, PEN20_LILAMON_SPRITE_SHEET_ROWS); + case PEN20_LILIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_LILIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LILIMON_ANIM_INDEX), PEN20_LILIMON_SPRITE_SHEET_COLS, PEN20_LILIMON_SPRITE_SHEET_ROWS); + case PEN20_LOPMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_LOPMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LOPMON_ANIM_INDEX), PEN20_LOPMON_SPRITE_SHEET_COLS, PEN20_LOPMON_SPRITE_SHEET_ROWS); + case PEN20_LOTUSMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_LOTUSMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LOTUSMON_ANIM_INDEX), PEN20_LOTUSMON_SPRITE_SHEET_COLS, PEN20_LOTUSMON_SPRITE_SHEET_ROWS); + case PEN20_LUDOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_LUDOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_LUDOMON_ANIM_INDEX), PEN20_LUDOMON_SPRITE_SHEET_COLS, PEN20_LUDOMON_SPRITE_SHEET_ROWS); + case PEN20_MAD_LEOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_MAD_LEOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MAD_LEOMON_ANIM_INDEX), PEN20_MAD_LEOMON_SPRITE_SHEET_COLS, PEN20_MAD_LEOMON_SPRITE_SHEET_ROWS); + case PEN20_MAMBOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_MAMBOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MAMBOMON_ANIM_INDEX), PEN20_MAMBOMON_SPRITE_SHEET_COLS, PEN20_MAMBOMON_SPRITE_SHEET_ROWS); + case PEN20_MAMMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_MAMMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MAMMON_ANIM_INDEX), PEN20_MAMMON_SPRITE_SHEET_COLS, PEN20_MAMMON_SPRITE_SHEET_ROWS); + case PEN20_MARIN_ANGEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_MARIN_ANGEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MARIN_ANGEMON_ANIM_INDEX), PEN20_MARIN_ANGEMON_SPRITE_SHEET_COLS, PEN20_MARIN_ANGEMON_SPRITE_SHEET_ROWS); + case PEN20_MARIN_DEVIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_MARIN_DEVIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MARIN_DEVIMON_ANIM_INDEX), PEN20_MARIN_DEVIMON_SPRITE_SHEET_COLS, PEN20_MARIN_DEVIMON_SPRITE_SHEET_ROWS); + case PEN20_MASTEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_MASTEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MASTEMON_ANIM_INDEX), PEN20_MASTEMON_SPRITE_SHEET_COLS, PEN20_MASTEMON_SPRITE_SHEET_ROWS); + case PEN20_MECHANORIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_MECHANORIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MECHANORIMON_ANIM_INDEX), PEN20_MECHANORIMON_SPRITE_SHEET_COLS, PEN20_MECHANORIMON_SPRITE_SHEET_ROWS); + case PEN20_MEGALO_GROWMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_MEGALO_GROWMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MEGALO_GROWMON_ANIM_INDEX), PEN20_MEGALO_GROWMON_SPRITE_SHEET_COLS, PEN20_MEGALO_GROWMON_SPRITE_SHEET_ROWS); + case PEN20_MEGA_SEADRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_MEGA_SEADRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MEGA_SEADRAMON_ANIM_INDEX), PEN20_MEGA_SEADRAMON_SPRITE_SHEET_COLS, PEN20_MEGA_SEADRAMON_SPRITE_SHEET_ROWS); + case PEN20_MEICRACKMON_VICIOUS_MODE_ANIM_INDEX: return load_dm_anim(ctx, PEN20_MEICRACKMON_VICIOUS_MODE_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MEICRACKMON_VICIOUS_MODE_ANIM_INDEX), PEN20_MEICRACKMON_VICIOUS_MODE_SPRITE_SHEET_COLS, PEN20_MEICRACKMON_VICIOUS_MODE_SPRITE_SHEET_ROWS); + case PEN20_METAL_ETEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_METAL_ETEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_METAL_ETEMON_ANIM_INDEX), PEN20_METAL_ETEMON_SPRITE_SHEET_COLS, PEN20_METAL_ETEMON_SPRITE_SHEET_ROWS); + case PEN20_METAL_SEADRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_METAL_SEADRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_METAL_SEADRAMON_ANIM_INDEX), PEN20_METAL_SEADRAMON_SPRITE_SHEET_COLS, PEN20_METAL_SEADRAMON_SPRITE_SHEET_ROWS); + case PEN20_MOCHIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_MOCHIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MOCHIMON_ANIM_INDEX), PEN20_MOCHIMON_SPRITE_SHEET_COLS, PEN20_MOCHIMON_SPRITE_SHEET_ROWS); + case PEN20_MOKUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_MOKUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MOKUMON_ANIM_INDEX), PEN20_MOKUMON_SPRITE_SHEET_COLS, PEN20_MOKUMON_SPRITE_SHEET_ROWS); + case PEN20_MUSHMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_MUSHMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_MUSHMON_ANIM_INDEX), PEN20_MUSHMON_SPRITE_SHEET_COLS, PEN20_MUSHMON_SPRITE_SHEET_ROWS); + case PEN20_NYOKIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_NYOKIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_NYOKIMON_ANIM_INDEX), PEN20_NYOKIMON_SPRITE_SHEET_COLS, PEN20_NYOKIMON_SPRITE_SHEET_ROWS); + case PEN20_OCTMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_OCTMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_OCTMON_ANIM_INDEX), PEN20_OCTMON_SPRITE_SHEET_COLS, PEN20_OCTMON_SPRITE_SHEET_ROWS); + case PEN20_OFANIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_OFANIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_OFANIMON_ANIM_INDEX), PEN20_OFANIMON_SPRITE_SHEET_COLS, PEN20_OFANIMON_SPRITE_SHEET_ROWS); + case PEN20_OGUDOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_OGUDOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_OGUDOMON_ANIM_INDEX), PEN20_OGUDOMON_SPRITE_SHEET_COLS, PEN20_OGUDOMON_SPRITE_SHEET_ROWS); + case PEN20_OKUWAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_OKUWAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_OKUWAMON_ANIM_INDEX), PEN20_OKUWAMON_SPRITE_SHEET_COLS, PEN20_OKUWAMON_SPRITE_SHEET_ROWS); + case PEN20_ORDINEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_ORDINEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ORDINEMON_ANIM_INDEX), PEN20_ORDINEMON_SPRITE_SHEET_COLS, PEN20_ORDINEMON_SPRITE_SHEET_ROWS); + case PEN20_OTAMAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_OTAMAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_OTAMAMON_ANIM_INDEX), PEN20_OTAMAMON_SPRITE_SHEET_COLS, PEN20_OTAMAMON_SPRITE_SHEET_ROWS); + case PEN20_OURYUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_OURYUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_OURYUMON_ANIM_INDEX), PEN20_OURYUMON_SPRITE_SHEET_COLS, PEN20_OURYUMON_SPRITE_SHEET_ROWS); + case PEN20_PAILDRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_PAILDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PAILDRAMON_ANIM_INDEX), PEN20_PAILDRAMON_SPRITE_SHEET_COLS, PEN20_PAILDRAMON_SPRITE_SHEET_ROWS); + case PEN20_PETI_MERAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_PETI_MERAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PETI_MERAMON_ANIM_INDEX), PEN20_PETI_MERAMON_SPRITE_SHEET_COLS, PEN20_PETI_MERAMON_SPRITE_SHEET_ROWS); + case PEN20_PHASCOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_PHASCOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PHASCOMON_ANIM_INDEX), PEN20_PHASCOMON_SPRITE_SHEET_COLS, PEN20_PHASCOMON_SPRITE_SHEET_ROWS); + case PEN20_PICO_DEVIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_PICO_DEVIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PICO_DEVIMON_ANIM_INDEX), PEN20_PICO_DEVIMON_SPRITE_SHEET_COLS, PEN20_PICO_DEVIMON_SPRITE_SHEET_ROWS); + case PEN20_PIEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_PIEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PIEMON_ANIM_INDEX), PEN20_PIEMON_SPRITE_SHEET_COLS, PEN20_PIEMON_SPRITE_SHEET_ROWS); + case PEN20_PLESIOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_PLESIOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PLESIOMON_ANIM_INDEX), PEN20_PLESIOMON_SPRITE_SHEET_COLS, PEN20_PLESIOMON_SPRITE_SHEET_ROWS); + case PEN20_PORCUPMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_PORCUPMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PORCUPMON_ANIM_INDEX), PEN20_PORCUPMON_SPRITE_SHEET_COLS, PEN20_PORCUPMON_SPRITE_SHEET_ROWS); + case PEN20_PUKUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_PUKUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PUKUMON_ANIM_INDEX), PEN20_PUKUMON_SPRITE_SHEET_COLS, PEN20_PUKUMON_SPRITE_SHEET_ROWS); + case PEN20_PUMPMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_PUMPMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PUMPMON_ANIM_INDEX), PEN20_PUMPMON_SPRITE_SHEET_COLS, PEN20_PUMPMON_SPRITE_SHEET_ROWS); + case PEN20_PYOCOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_PYOCOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_PYOCOMON_ANIM_INDEX), PEN20_PYOCOMON_SPRITE_SHEET_COLS, PEN20_PYOCOMON_SPRITE_SHEET_ROWS); + case PEN20_RAFFLESIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_RAFFLESIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RAFFLESIMON_ANIM_INDEX), PEN20_RAFFLESIMON_SPRITE_SHEET_COLS, PEN20_RAFFLESIMON_SPRITE_SHEET_ROWS); + case PEN20_RAGNA_LORDMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_RAGNA_LORDMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RAGNA_LORDMON_ANIM_INDEX), PEN20_RAGNA_LORDMON_SPRITE_SHEET_COLS, PEN20_RAGNA_LORDMON_SPRITE_SHEET_ROWS); + case PEN20_RAGUELMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_RAGUELMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RAGUELMON_ANIM_INDEX), PEN20_RAGUELMON_SPRITE_SHEET_COLS, PEN20_RAGUELMON_SPRITE_SHEET_ROWS); + case PEN20_RAIJI_LUDOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_RAIJI_LUDOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RAIJI_LUDOMON_ANIM_INDEX), PEN20_RAIJI_LUDOMON_SPRITE_SHEET_COLS, PEN20_RAIJI_LUDOMON_SPRITE_SHEET_ROWS); + case PEN20_RAKAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_RAKAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RAKAMON_ANIM_INDEX), PEN20_RAKAMON_SPRITE_SHEET_COLS, PEN20_RAKAMON_SPRITE_SHEET_ROWS); + case PEN20_RAPIDMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_RAPIDMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RAPIDMON_ANIM_INDEX), PEN20_RAPIDMON_SPRITE_SHEET_COLS, PEN20_RAPIDMON_SPRITE_SHEET_ROWS); + case PEN20_RED_VEGIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_RED_VEGIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RED_VEGIMON_ANIM_INDEX), PEN20_RED_VEGIMON_SPRITE_SHEET_COLS, PEN20_RED_VEGIMON_SPRITE_SHEET_ROWS); + case PEN20_REPPAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_REPPAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_REPPAMON_ANIM_INDEX), PEN20_REPPAMON_SPRITE_SHEET_COLS, PEN20_REPPAMON_SPRITE_SHEET_ROWS); + case PEN20_REVOLMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_REVOLMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_REVOLMON_ANIM_INDEX), PEN20_REVOLMON_SPRITE_SHEET_COLS, PEN20_REVOLMON_SPRITE_SHEET_ROWS); + case PEN20_RIZE_GREYMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_RIZE_GREYMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RIZE_GREYMON_ANIM_INDEX), PEN20_RIZE_GREYMON_SPRITE_SHEET_COLS, PEN20_RIZE_GREYMON_SPRITE_SHEET_ROWS); + case PEN20_ROSEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_ROSEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ROSEMON_ANIM_INDEX), PEN20_ROSEMON_SPRITE_SHEET_COLS, PEN20_ROSEMON_SPRITE_SHEET_ROWS); + case PEN20_RYUDAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_RYUDAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_RYUDAMON_ANIM_INDEX), PEN20_RYUDAMON_SPRITE_SHEET_COLS, PEN20_RYUDAMON_SPRITE_SHEET_ROWS); + case PEN20_SABER_LEOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_SABER_LEOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_SABER_LEOMON_ANIM_INDEX), PEN20_SABER_LEOMON_SPRITE_SHEET_COLS, PEN20_SABER_LEOMON_SPRITE_SHEET_ROWS); + case PEN20_SAINT_GALGOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_SAINT_GALGOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_SAINT_GALGOMON_ANIM_INDEX), PEN20_SAINT_GALGOMON_SPRITE_SHEET_COLS, PEN20_SAINT_GALGOMON_SPRITE_SHEET_ROWS); + case PEN20_SERAPHIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_SERAPHIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_SERAPHIMON_ANIM_INDEX), PEN20_SERAPHIMON_SPRITE_SHEET_COLS, PEN20_SERAPHIMON_SPRITE_SHEET_ROWS); + case PEN20_SHADRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_SHADRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_SHADRAMON_ANIM_INDEX), PEN20_SHADRAMON_SPRITE_SHEET_COLS, PEN20_SHADRAMON_SPRITE_SHEET_ROWS); + case PEN20_SHAKOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_SHAKOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_SHAKOMON_ANIM_INDEX), PEN20_SHAKOMON_SPRITE_SHEET_COLS, PEN20_SHAKOMON_SPRITE_SHEET_ROWS); + case PEN20_STARMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_STARMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_STARMON_ANIM_INDEX), PEN20_STARMON_SPRITE_SHEET_COLS, PEN20_STARMON_SPRITE_SHEET_ROWS); + case PEN20_SUNFLOWMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_SUNFLOWMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_SUNFLOWMON_ANIM_INDEX), PEN20_SUNFLOWMON_SPRITE_SHEET_COLS, PEN20_SUNFLOWMON_SPRITE_SHEET_ROWS); + case PEN20_TAILMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_TAILMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TAILMON_ANIM_INDEX), PEN20_TAILMON_SPRITE_SHEET_COLS, PEN20_TAILMON_SPRITE_SHEET_ROWS); + case PEN20_TANKMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_TANKMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TANKMON_ANIM_INDEX), PEN20_TANKMON_SPRITE_SHEET_COLS, PEN20_TANKMON_SPRITE_SHEET_ROWS); + case PEN20_TARGETMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_TARGETMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TARGETMON_ANIM_INDEX), PEN20_TARGETMON_SPRITE_SHEET_COLS, PEN20_TARGETMON_SPRITE_SHEET_ROWS); + case PEN20_TENTOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_TENTOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TENTOMON_ANIM_INDEX), PEN20_TENTOMON_SPRITE_SHEET_COLS, PEN20_TENTOMON_SPRITE_SHEET_ROWS); + case PEN20_TERRIERMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_TERRIERMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TERRIERMON_ANIM_INDEX), PEN20_TERRIERMON_SPRITE_SHEET_COLS, PEN20_TERRIERMON_SPRITE_SHEET_ROWS); + case PEN20_THUNDERBALLMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_THUNDERBALLMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_THUNDERBALLMON_ANIM_INDEX), PEN20_THUNDERBALLMON_SPRITE_SHEET_COLS, PEN20_THUNDERBALLMON_SPRITE_SHEET_ROWS); + case PEN20_TIA_LUDOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_TIA_LUDOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TIA_LUDOMON_ANIM_INDEX), PEN20_TIA_LUDOMON_SPRITE_SHEET_COLS, PEN20_TIA_LUDOMON_SPRITE_SHEET_ROWS); + case PEN20_TOGEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_TOGEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TOGEMON_ANIM_INDEX), PEN20_TOGEMON_SPRITE_SHEET_COLS, PEN20_TOGEMON_SPRITE_SHEET_ROWS); + case PEN20_TONOSAMA_GEKOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_TONOSAMA_GEKOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TONOSAMA_GEKOMON_ANIM_INDEX), PEN20_TONOSAMA_GEKOMON_SPRITE_SHEET_COLS, PEN20_TONOSAMA_GEKOMON_SPRITE_SHEET_ROWS); + case PEN20_TORTAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_TORTAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TORTAMON_ANIM_INDEX), PEN20_TORTAMON_SPRITE_SHEET_COLS, PEN20_TORTAMON_SPRITE_SHEET_ROWS); + case PEN20_TOY_AGUMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_TOY_AGUMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TOY_AGUMON_ANIM_INDEX), PEN20_TOY_AGUMON_SPRITE_SHEET_COLS, PEN20_TOY_AGUMON_SPRITE_SHEET_ROWS); + case PEN20_TRICERAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_TRICERAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TRICERAMON_ANIM_INDEX), PEN20_TRICERAMON_SPRITE_SHEET_COLS, PEN20_TRICERAMON_SPRITE_SHEET_ROWS); + case PEN20_TROOPMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_TROOPMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TROOPMON_ANIM_INDEX), PEN20_TROOPMON_SPRITE_SHEET_COLS, PEN20_TROOPMON_SPRITE_SHEET_ROWS); + case PEN20_TURUIEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_TURUIEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_TURUIEMON_ANIM_INDEX), PEN20_TURUIEMON_SPRITE_SHEET_COLS, PEN20_TURUIEMON_SPRITE_SHEET_ROWS); + case PEN20_V_DRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_V_DRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_V_DRAMON_ANIM_INDEX), PEN20_V_DRAMON_SPRITE_SHEET_COLS, PEN20_V_DRAMON_SPRITE_SHEET_ROWS); + case PEN20_VEMDEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_VEMDEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_VEMDEMON_ANIM_INDEX), PEN20_VEMDEMON_SPRITE_SHEET_COLS, PEN20_VEMDEMON_SPRITE_SHEET_ROWS); + case PEN20_VENOM_VAMDEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_VENOM_VAMDEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_VENOM_VAMDEMON_ANIM_INDEX), PEN20_VENOM_VAMDEMON_SPRITE_SHEET_COLS, PEN20_VENOM_VAMDEMON_SPRITE_SHEET_ROWS); + case PEN20_V_MON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_V_MON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_V_MON_ANIM_INDEX), PEN20_V_MON_SPRITE_SHEET_COLS, PEN20_V_MON_SPRITE_SHEET_ROWS); + case PEN20_VOLCANICDRAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_VOLCANICDRAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_VOLCANICDRAMON_ANIM_INDEX), PEN20_VOLCANICDRAMON_SPRITE_SHEET_COLS, PEN20_VOLCANICDRAMON_SPRITE_SHEET_ROWS); + case PEN20_VOLTOBAUTAMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_VOLTOBAUTAMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_VOLTOBAUTAMON_ANIM_INDEX), PEN20_VOLTOBAUTAMON_SPRITE_SHEET_COLS, PEN20_VOLTOBAUTAMON_SPRITE_SHEET_ROWS); + case PEN20_VORVOMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_VORVOMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_VORVOMON_ANIM_INDEX), PEN20_VORVOMON_SPRITE_SHEET_COLS, PEN20_VORVOMON_SPRITE_SHEET_ROWS); + case PEN20_WARU_MOZAEMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_WARU_MOZAEMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_WARU_MOZAEMON_ANIM_INDEX), PEN20_WARU_MOZAEMON_SPRITE_SHEET_COLS, PEN20_WARU_MOZAEMON_SPRITE_SHEET_ROWS); + case PEN20_WIZARMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_WIZARMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_WIZARMON_ANIM_INDEX), PEN20_WIZARMON_SPRITE_SHEET_COLS, PEN20_WIZARMON_SPRITE_SHEET_ROWS); + case PEN20_WOODMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_WOODMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_WOODMON_ANIM_INDEX), PEN20_WOODMON_SPRITE_SHEET_COLS, PEN20_WOODMON_SPRITE_SHEET_ROWS); + case PEN20_XV_MON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_XV_MON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_XV_MON_ANIM_INDEX), PEN20_XV_MON_SPRITE_SHEET_COLS, PEN20_XV_MON_SPRITE_SHEET_ROWS); + case PEN20_ZERIMON_ANIM_INDEX: return load_dm_anim(ctx, PEN20_ZERIMON_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ZERIMON_ANIM_INDEX), PEN20_ZERIMON_SPRITE_SHEET_COLS, PEN20_ZERIMON_SPRITE_SHEET_ROWS); + case PEN20_ZUDOMOM_ANIM_INDEX: return load_dm_anim(ctx, PEN20_ZUDOMOM_ANIM_INDEX, get_pen20_sprite_sheet(PEN20_ZUDOMOM_ANIM_INDEX), PEN20_ZUDOMOM_SPRITE_SHEET_COLS, PEN20_ZUDOMOM_SPRITE_SHEET_ROWS); + default: return bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM; + } + return bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM; + } +} + diff --git a/src/image_loader/pkmn/load_images_pkmn.cpp b/src/image_loader/pkmn/load_images_pkmn.cpp index 9cbc89de..d5880ff3 100644 --- a/src/image_loader/pkmn/load_images_pkmn.cpp +++ b/src/image_loader/pkmn/load_images_pkmn.cpp @@ -7,7 +7,7 @@ #include "utils/error.h" namespace bongocat::animation { - created_result_t load_pkmn_anim(const animation_context_t& ctx, [[maybe_unused]] int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows) { + created_result_t load_pkmn_anim(const animation_context_t& ctx, [[maybe_unused]] int anim_index, const assets::embedded_image_t& sprite_sheet_image, int sprite_sheet_cols, int sprite_sheet_rows) { using namespace assets; BONGOCAT_CHECK_NULL(ctx._local_copy_config.ptr, bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM); @@ -24,7 +24,7 @@ namespace bongocat::animation { return bongocat_error_t::BONGOCAT_ERROR_INVALID_PARAM; } - pkmn_animation_t ret; + pkmn_sprite_sheet_t ret; ret.image = bongocat::move(result.result.image); ret.frame_width = bongocat::move(result.result.frame_width); ret.frame_height = bongocat::move(result.result.frame_height); @@ -33,6 +33,54 @@ namespace bongocat::animation { ret.idle_1 = bongocat::move(result.result.frames[0]); ret.idle_2 = bongocat::move(result.result.frames[1]); + // setup animations + using namespace assets; + + assert(ret.idle_1.valid); + assert(ret.idle_2.valid); + + assert(MAX_ANIMATION_FRAMES >= 4); + + ret.animations.idle[0] = ret.idle_1.col; + ret.animations.idle[1] = ret.idle_2.col; + ret.animations.idle[2] = ret.idle_1.col; + ret.animations.idle[3] = ret.idle_2.col; + + ret.animations.boring[0] = ret.idle_1.col; + ret.animations.boring[1] = ret.idle_2.col; + ret.animations.boring[2] = ret.idle_1.col; + ret.animations.boring[3] = ret.idle_2.col; + + ret.animations.writing[0] = ret.idle_1.col; + ret.animations.writing[1] = ret.idle_2.col; + ret.animations.writing[2] = ret.idle_1.col; + ret.animations.writing[3] = ret.idle_2.col; + + ret.animations.sleep[0] = ret.idle_2.col; + ret.animations.sleep[1] = ret.idle_2.col; + ret.animations.sleep[2] = ret.idle_2.col; + ret.animations.sleep[3] = ret.idle_2.col; + + ret.animations.wake_up[0] = ret.idle_1.col; + ret.animations.wake_up[1] = ret.idle_2.col; + ret.animations.wake_up[2] = ret.idle_1.col; + ret.animations.wake_up[3] = ret.idle_2.col; + + ret.animations.working[0] = ret.idle_1.col; + ret.animations.working[1] = ret.idle_2.col; + ret.animations.working[2] = ret.idle_1.col; + ret.animations.working[3] = ret.idle_2.col; + + ret.animations.moving[0] = ret.idle_1.col; + ret.animations.moving[1] = ret.idle_2.col; + ret.animations.moving[2] = ret.idle_1.col; + ret.animations.moving[3] = ret.idle_2.col; + + ret.animations.happy[0] = ret.idle_1.col; + ret.animations.happy[1] = ret.idle_2.col; + ret.animations.happy[2] = ret.idle_1.col; + ret.animations.happy[3] = ret.idle_2.col; + return ret; } @@ -51,7 +99,8 @@ namespace bongocat::animation { assert(result.result.total_frames > 0); ///< this SHOULD always work if it's an valid EMBEDDED image assert(anim_index >= 0); - ctx.shm->pkmn_anims[static_cast(anim_index)].pkmn = bongocat::move(result.result); + ctx.shm->pkmn_anims[static_cast(anim_index)] = bongocat::move(result.result); + assert(ctx.shm->pkmn_anims[static_cast(anim_index)].type == animation_t::Type::Pkmn); return bongocat_error_t::BONGOCAT_SUCCESS; } diff --git a/src/image_loader/pkmn/pkmn_load_sprite_sheet.cpp b/src/image_loader/pkmn/pkmn_load_sprite_sheet.cpp index cac21fb0..56934d9c 100644 --- a/src/image_loader/pkmn/pkmn_load_sprite_sheet.cpp +++ b/src/image_loader/pkmn/pkmn_load_sprite_sheet.cpp @@ -7,7 +7,7 @@ #include "image_loader/pkmn/load_images_pkmn.h" namespace bongocat::animation { - created_result_t load_pkmn_sprite_sheet(const animation_context_t& ctx, int index) { + created_result_t load_pkmn_sprite_sheet(const animation_context_t& ctx, int index) { using namespace assets; switch (index) { case PKMN_BULBASAUR_ANIM_INDEX: return load_pkmn_anim(ctx, PKMN_BULBASAUR_ANIM_INDEX, get_pkmn_sprite_sheet(PKMN_BULBASAUR_ANIM_INDEX), PKMN_BULBASAUR_SPRITE_SHEET_COLS, PKMN_BULBASAUR_SPRITE_SHEET_ROWS);