From 4ff34cda33c55cfe9fad19246ea9a958dd18bdb5 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Wed, 9 Sep 2026 18:49:58 +0900 Subject: [PATCH 01/41] feat: restructure into monorepo and add Cursor extension Extracts vpet-core as a shared package, moves the OpenCode plugin to packages/opencode-vpet, and adds the cursor-vpet extension with its own SQLite adapters and hooks. Updates CI/CD, workspaces, and monorepo documentation. Co-authored-by: Cursor --- .github/workflows/cd.yml | 58 +- .github/workflows/ci.yml | 19 +- .gitignore | 2 + README.md | 6 +- biome.json | 14 +- bun.lock | 469 +- bunfig.toml | 3 - docs/cursor-extension-plan.md | 976 +++ docs/monorepo.md | 60 + package.json | 121 +- packages/cursor-vpet/.vscodeignore | 9 + packages/cursor-vpet/CHANGELOG.md | 10 + packages/cursor-vpet/LICENSE | 201 + packages/cursor-vpet/README.md | 42 + packages/cursor-vpet/hook-bridge.js | 59 + packages/cursor-vpet/icon.png | Bin 0 -> 303 bytes packages/cursor-vpet/package.json | 124 + packages/cursor-vpet/scripts/build.ts | 27 + .../adapters/cursor/cursor-api-watermark.ts | 142 + .../src/adapters/cursor/cursor-auth.ts | 36 + .../src/adapters/cursor/cursor-stop-mapper.ts | 24 + .../cursor/cursor-usage-event-source.ts | 141 + .../src/adapters/cursor/install-hooks.ts | 61 + .../cursor-vpet/src/adapters/cursor/paths.ts | 27 + .../cursor-vpet/src/adapters/cursor/types.ts | 47 + .../sqlite/sqlite-sidebar-snapshot-reader.ts | 107 + .../sqlite/sqlite-vpet-archive-reader.ts | 105 + .../sqlite/sqlite-vpet-write-store.ts | 28 + .../src/adapters/sqlite/sqljs-config.ts | 25 + .../src/adapters/sqlite/sqljs-driver.ts | 108 + .../src/adapters/sqlite/sqljs-runtime.ts | 15 + .../src/config/extension-settings.ts | 25 + packages/cursor-vpet/src/extension.ts | 114 + packages/cursor-vpet/src/types/sql.js.d.ts | 31 + packages/cursor-vpet/src/webview/dex-panel.ts | 33 + .../cursor-vpet/src/webview/history-panel.ts | 34 + .../cursor-vpet/src/webview/sidebar-render.ts | 144 + .../src/webview/static-monster-artwork.ts | 11 + .../src/webview/vpet-sidebar-provider.ts | 48 + .../tests/cursor-api-watermark.test.ts | 40 + .../tests/cursor-stop-mapper.test.ts | 28 + .../sqljs-vpet-repository.persistence.test.ts | 44 + .../cursor-vpet/tests/sidebar-render.test.ts | 57 + packages/cursor-vpet/tsconfig.json | 19 + packages/cursor-vpet/tsconfig.scripts.json | 19 + packages/opencode-vpet/LICENSE | 201 + packages/opencode-vpet/README.md | 832 +++ .../adapters/sqlite/app-data-path.ts | 0 .../adapters/sqlite/sqlite-migrations.ts | 8 +- .../adapters/sqlite/sqlite-vpet-schema.ts | 0 .../adapters/sqlite/sqlite-vpet-types.ts | 0 .../sqlite/sqlite-vpet-write-store.ts | 22 +- .../application/models/sidebar-card-inputs.ts | 0 .../application/models/spawn-partner.ts | 0 .../application/models/usage.ts | 0 .../application/models/vpet-archive.ts | 0 .../application/models/vpet-control.ts | 0 .../application/ports/partner-lifecycle.ts | 0 .../application/ports/sidebar-snapshot.ts | 0 .../application/ports/usage-ledger.ts | 0 .../application/ports/vpet-archive.ts | 0 .../application/ports/vpet-control.ts | 0 .../application/use-cases/freeze-vpet.ts | 0 .../use-cases/get-sidebar-card-inputs.ts | 0 .../application/use-cases/reconcile-usage.ts | 0 .../application/use-cases/record-usage.ts | 0 .../use-cases/set-vpet-cheat-node.ts | 0 .../application/use-cases/spawn-partner.ts | 0 .../application/use-cases/unfreeze-vpet.ts | 0 .../build/vpet-core-src}/config/defaults.ts | 0 .../build/vpet-core-src}/config/normalize.ts | 0 .../build/vpet-core-src}/config/types.ts | 0 .../build/vpet-core-src}/data/catalog.ts | 0 .../build/vpet-core-src}/data/digimon-data.ts | 0 .../data/monster-frame-catalog.ts | 0 .../vpet-core-src}/data/monster-frame-data.ts | 0 .../build/vpet-core-src}/data/stages.ts | 0 .../vpet-core-src}/domain/digimon-node.ts | 0 .../build/vpet-core-src}/domain/evolution.ts | 0 .../build/vpet-core-src}/domain/partner.ts | 0 .../build/vpet-core-src}/domain/stage.ts | 0 .../vpet-core-src/ports/sqlite-executor.ts | 8 + .../view-models}/dex-view-model.ts | 0 .../view-models}/history-view-model.ts | 0 .../view-models}/sidebar-view-model.ts | 0 packages/opencode-vpet/bunfig.toml | 2 + packages/opencode-vpet/package.json | 101 + .../opencode-vpet/scripts}/build.ts | 14 + packages/opencode-vpet/scripts/postpack.ts | 13 + packages/opencode-vpet/scripts/prepack.ts | 62 + .../scripts/rewrite-vpet-core-declarations.ts | 44 + .../scripts/stage-vpet-core-sources.ts | 14 + .../scripts/strip-workspace-deps.ts | 39 + .../adapters/opencode/create-server-hooks.ts | 24 +- .../adapters/opencode/session-messages.ts | 0 .../adapters/opencode/usage-event-mapper.ts | 2 +- .../src}/adapters/opencode/vpet-toast.ts | 4 +- .../src}/adapters/sqlite/bun-sqlite-driver.ts | 9 +- .../sqlite/sqlite-sidebar-snapshot-reader.ts | 6 +- .../sqlite/sqlite-vpet-archive-reader.ts | 12 +- .../sqlite/sqlite-vpet-write-store.ts | 29 + {src => packages/opencode-vpet/src}/cli.ts | 0 .../opencode-vpet/src}/cli/install.ts | 0 .../src}/commands/vpet-command-result.ts | 0 .../src}/commands/vpet-freeze.ts | 4 +- .../opencode-vpet/src}/commands/vpet-set.ts | 6 +- .../opencode-vpet/src}/commands/vpet-spawn.ts | 4 +- .../src}/commands/vpet-unfreeze.ts | 4 +- .../src}/config/global-vpet-settings.ts | 6 +- {src => packages/opencode-vpet/src}/index.ts | 8 +- {src => packages/opencode-vpet/src}/tui.tsx | 14 +- .../src}/tui/monster-action-policy.ts | 2 +- .../src}/tui/monster-animation.ts | 6 +- .../src}/tui/monster-artwork-mirror.ts | 2 +- .../src}/tui/monster-walking-policy.ts | 2 +- .../opencode-vpet/src}/tui/open-in-browser.ts | 0 .../opencode-vpet/src}/tui/sidebar-card.tsx | 2 +- .../src}/tui/sidebar-poll-loop.ts | 0 .../src}/tui/vpet-command-layer.tsx | 12 +- .../src}/tui/vpet-dex-dialog.tsx | 2 +- .../src}/tui/vpet-history-dialog.tsx | 2 +- .../tests}/architecture-boundary-helpers.ts | 3 + .../tests}/architecture-boundary.test.ts | 10 +- .../tests}/catalog-evolution.test.ts | 16 +- .../opencode-vpet/tests}/cli-config.test.ts | 0 .../tests}/config-loader.test.ts | 2 +- .../tests}/config-settings.test.ts | 4 +- .../tests}/dex-view-model.test.ts | 6 +- .../opencode-vpet/tests}/digimon-data.test.ts | 2 +- .../tests}/get-sidebar-card-inputs.test.ts | 6 +- .../tests}/hexagonal-boundary.test.ts | 20 +- .../tests}/history-view-model.test.ts | 6 +- .../tests}/monster-animation-actions.test.ts | 2 +- .../tests}/monster-animation-test-utils.ts | 6 +- .../tests}/monster-animation-walking.test.ts | 0 .../tests}/monster-animation.test.ts | 2 +- .../tests}/monster-artwork-mirror.test.ts | 4 +- .../tests}/monster-frame-catalog.test.ts | 2 +- .../tests}/monster-frame-data.test.ts | 4 +- .../opencode-vpet/tests}/package-fixture.ts | 6 +- .../sqlite-migrations.persistence.ts | 2 +- ...lite-usage-event-toast.persistence.test.ts | 4 +- ...sqlite-vpet-archive-history.persistence.ts | 12 +- .../sqlite-vpet-control.persistence.ts | 0 ...t-repository.control-ledger.persistence.ts | 0 .../sqlite-vpet-repository.fixtures.ts | 2 +- ...e-vpet-repository.lifecycle.persistence.ts | 2 +- .../sqlite-vpet-repository.persistence.ts | 0 ...te-vpet-repository.receipts.persistence.ts | 0 .../tests}/port-boundary.test.ts | 2 +- .../opencode-vpet/tests}/record-usage.test.ts | 14 +- .../tests}/release-metadata.test.ts | 8 +- .../tests}/server-hooks-lifecycle.test.ts | 12 +- .../tests}/server-thresholds.test.ts | 12 +- .../tests}/sidebar-card.test.tsx | 2 +- .../tests}/sidebar-poll-loop.test.ts | 0 .../tests}/sidebar-state.test.ts | 0 .../tests}/sidebar-view-model.test.ts | 6 +- .../opencode-vpet/tests}/sqlite-capability.ts | 0 .../tests}/sqlite-vpet-archive-reader.test.ts | 0 packages/opencode-vpet/tests/tsconfig.json | 5 + .../tests}/tui-composition-fixture.ts | 6 +- .../tests}/tui-composition.test.ts | 10 +- .../tests}/tui-settings-composition.test.ts | 10 +- .../tests}/usage-event-ingestion.test.ts | 8 +- .../usage-event-processing-time.test.ts | 8 +- .../tests}/vpet-command-layer.test.tsx | 4 +- .../opencode-vpet/tests}/vpet-control.test.ts | 8 +- .../tests}/vpet-dex-dialog-fixture.tsx | 0 .../tests}/vpet-dex-dialog-hardening.test.tsx | 2 +- .../tests}/vpet-dex-dialog.test.tsx | 2 +- .../tests}/vpet-dialog-layout.test.tsx | 0 .../opencode-vpet/tests}/vpet-freeze.test.ts | 0 .../tests}/vpet-history-dialog.test.tsx | 2 +- .../opencode-vpet/tests}/vpet-set.test.ts | 2 +- .../opencode-vpet/tests}/vpet-spawn.test.ts | 2 +- .../opencode-vpet/tests}/vpet-toast.test.ts | 2 +- .../tests}/vpet-unfreeze.test.ts | 0 .../opencode-vpet/tsconfig.build.json | 0 packages/opencode-vpet/tsconfig.json | 29 + packages/opencode-vpet/tsconfig.scripts.json | 19 + .../opencode-vpet/tsconfig.test.json | 4 +- .../tsconfig.vpet-core-declarations.json | 12 + packages/vpet-core/package.json | 26 + .../src/adapters/sqlite/app-data-path.ts | 30 + .../src/adapters/sqlite/sqlite-migrations.ts | 147 + .../src/adapters/sqlite/sqlite-vpet-schema.ts | 168 + .../src/adapters/sqlite/sqlite-vpet-types.ts | 52 + .../sqlite/sqlite-vpet-write-store.ts | 224 + .../application/models/sidebar-card-inputs.ts | 13 + .../src/application/models/spawn-partner.ts | 10 + .../vpet-core/src/application/models/usage.ts | 26 + .../src/application/models/vpet-archive.ts | 18 + .../src/application/models/vpet-control.ts | 7 + .../application/ports/partner-lifecycle.ts | 6 + .../src/application/ports/sidebar-snapshot.ts | 12 + .../src/application/ports/usage-ledger.ts | 9 + .../src/application/ports/vpet-archive.ts | 5 + .../src/application/ports/vpet-control.ts | 7 + .../src/application/use-cases/freeze-vpet.ts | 4 + .../use-cases/get-sidebar-card-inputs.ts | 23 + .../application/use-cases/reconcile-usage.ts | 27 + .../src/application/use-cases/record-usage.ts | 54 + .../use-cases/set-vpet-cheat-node.ts | 7 + .../application/use-cases/spawn-partner.ts | 13 + .../application/use-cases/unfreeze-vpet.ts | 4 + packages/vpet-core/src/config/defaults.ts | 46 + packages/vpet-core/src/config/normalize.ts | 57 + packages/vpet-core/src/config/types.ts | 29 + packages/vpet-core/src/data/catalog.ts | 51 + packages/vpet-core/src/data/digimon-data.ts | 6120 +++++++++++++++++ .../src/data/monster-frame-catalog.ts | 63 + .../vpet-core/src/data/monster-frame-data.ts | 651 ++ packages/vpet-core/src/data/stages.ts | 21 + packages/vpet-core/src/domain/digimon-node.ts | 16 + packages/vpet-core/src/domain/evolution.ts | 65 + packages/vpet-core/src/domain/partner.ts | 15 + packages/vpet-core/src/domain/stage.ts | 7 + .../vpet-core/src/ports/sqlite-executor.ts | 8 + .../src/view-models/dex-view-model.ts | 77 + .../src/view-models/history-view-model.ts | 74 + .../src/view-models/sidebar-view-model.ts | 42 + packages/vpet-core/tsconfig.json | 16 + scripts/migrate-imports.mjs | 51 + scripts/prepack.ts | 46 - scripts/release-metadata.ts | 17 +- tsconfig.json | 37 +- tsconfig.release-metadata.json | 9 +- 228 files changed, 13559 insertions(+), 400 deletions(-) create mode 100644 docs/cursor-extension-plan.md create mode 100644 docs/monorepo.md create mode 100644 packages/cursor-vpet/.vscodeignore create mode 100644 packages/cursor-vpet/CHANGELOG.md create mode 100644 packages/cursor-vpet/LICENSE create mode 100644 packages/cursor-vpet/README.md create mode 100644 packages/cursor-vpet/hook-bridge.js create mode 100644 packages/cursor-vpet/icon.png create mode 100644 packages/cursor-vpet/package.json create mode 100644 packages/cursor-vpet/scripts/build.ts create mode 100644 packages/cursor-vpet/src/adapters/cursor/cursor-api-watermark.ts create mode 100644 packages/cursor-vpet/src/adapters/cursor/cursor-auth.ts create mode 100644 packages/cursor-vpet/src/adapters/cursor/cursor-stop-mapper.ts create mode 100644 packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts create mode 100644 packages/cursor-vpet/src/adapters/cursor/install-hooks.ts create mode 100644 packages/cursor-vpet/src/adapters/cursor/paths.ts create mode 100644 packages/cursor-vpet/src/adapters/cursor/types.ts create mode 100644 packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts create mode 100644 packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts create mode 100644 packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts create mode 100644 packages/cursor-vpet/src/adapters/sqlite/sqljs-config.ts create mode 100644 packages/cursor-vpet/src/adapters/sqlite/sqljs-driver.ts create mode 100644 packages/cursor-vpet/src/adapters/sqlite/sqljs-runtime.ts create mode 100644 packages/cursor-vpet/src/config/extension-settings.ts create mode 100644 packages/cursor-vpet/src/extension.ts create mode 100644 packages/cursor-vpet/src/types/sql.js.d.ts create mode 100644 packages/cursor-vpet/src/webview/dex-panel.ts create mode 100644 packages/cursor-vpet/src/webview/history-panel.ts create mode 100644 packages/cursor-vpet/src/webview/sidebar-render.ts create mode 100644 packages/cursor-vpet/src/webview/static-monster-artwork.ts create mode 100644 packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts create mode 100644 packages/cursor-vpet/tests/cursor-api-watermark.test.ts create mode 100644 packages/cursor-vpet/tests/cursor-stop-mapper.test.ts create mode 100644 packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts create mode 100644 packages/cursor-vpet/tests/sidebar-render.test.ts create mode 100644 packages/cursor-vpet/tsconfig.json create mode 100644 packages/cursor-vpet/tsconfig.scripts.json create mode 100644 packages/opencode-vpet/LICENSE create mode 100644 packages/opencode-vpet/README.md rename {src => packages/opencode-vpet/build/vpet-core-src}/adapters/sqlite/app-data-path.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/adapters/sqlite/sqlite-migrations.ts (92%) rename {src => packages/opencode-vpet/build/vpet-core-src}/adapters/sqlite/sqlite-vpet-schema.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/adapters/sqlite/sqlite-vpet-types.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/adapters/sqlite/sqlite-vpet-write-store.ts (92%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/models/sidebar-card-inputs.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/models/spawn-partner.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/models/usage.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/models/vpet-archive.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/models/vpet-control.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/ports/partner-lifecycle.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/ports/sidebar-snapshot.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/ports/usage-ledger.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/ports/vpet-archive.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/ports/vpet-control.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/use-cases/freeze-vpet.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/use-cases/get-sidebar-card-inputs.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/use-cases/reconcile-usage.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/use-cases/record-usage.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/use-cases/set-vpet-cheat-node.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/use-cases/spawn-partner.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/application/use-cases/unfreeze-vpet.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/config/defaults.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/config/normalize.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/config/types.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/data/catalog.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/data/digimon-data.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/data/monster-frame-catalog.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/data/monster-frame-data.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/data/stages.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/domain/digimon-node.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/domain/evolution.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/domain/partner.ts (100%) rename {src => packages/opencode-vpet/build/vpet-core-src}/domain/stage.ts (100%) create mode 100644 packages/opencode-vpet/build/vpet-core-src/ports/sqlite-executor.ts rename {src/tui => packages/opencode-vpet/build/vpet-core-src/view-models}/dex-view-model.ts (100%) rename {src/tui => packages/opencode-vpet/build/vpet-core-src/view-models}/history-view-model.ts (100%) rename {src/tui => packages/opencode-vpet/build/vpet-core-src/view-models}/sidebar-view-model.ts (100%) create mode 100644 packages/opencode-vpet/bunfig.toml create mode 100644 packages/opencode-vpet/package.json rename {scripts => packages/opencode-vpet/scripts}/build.ts (61%) create mode 100644 packages/opencode-vpet/scripts/postpack.ts create mode 100644 packages/opencode-vpet/scripts/prepack.ts create mode 100644 packages/opencode-vpet/scripts/rewrite-vpet-core-declarations.ts create mode 100644 packages/opencode-vpet/scripts/stage-vpet-core-sources.ts create mode 100644 packages/opencode-vpet/scripts/strip-workspace-deps.ts rename {src => packages/opencode-vpet/src}/adapters/opencode/create-server-hooks.ts (88%) rename {src => packages/opencode-vpet/src}/adapters/opencode/session-messages.ts (100%) rename {src => packages/opencode-vpet/src}/adapters/opencode/usage-event-mapper.ts (92%) rename {src => packages/opencode-vpet/src}/adapters/opencode/vpet-toast.ts (95%) rename {src => packages/opencode-vpet/src}/adapters/sqlite/bun-sqlite-driver.ts (77%) rename {src => packages/opencode-vpet/src}/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts (89%) rename {src => packages/opencode-vpet/src}/adapters/sqlite/sqlite-vpet-archive-reader.ts (87%) create mode 100644 packages/opencode-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts rename {src => packages/opencode-vpet/src}/cli.ts (100%) rename {src => packages/opencode-vpet/src}/cli/install.ts (100%) rename {src => packages/opencode-vpet/src}/commands/vpet-command-result.ts (100%) rename {src => packages/opencode-vpet/src}/commands/vpet-freeze.ts (81%) rename {src => packages/opencode-vpet/src}/commands/vpet-set.ts (86%) rename {src => packages/opencode-vpet/src}/commands/vpet-spawn.ts (79%) rename {src => packages/opencode-vpet/src}/commands/vpet-unfreeze.ts (81%) rename {src => packages/opencode-vpet/src}/config/global-vpet-settings.ts (86%) rename {src => packages/opencode-vpet/src}/index.ts (86%) rename {src => packages/opencode-vpet/src}/tui.tsx (93%) rename {src => packages/opencode-vpet/src}/tui/monster-action-policy.ts (94%) rename {src => packages/opencode-vpet/src}/tui/monster-animation.ts (98%) rename {src => packages/opencode-vpet/src}/tui/monster-artwork-mirror.ts (96%) rename {src => packages/opencode-vpet/src}/tui/monster-walking-policy.ts (98%) rename {src => packages/opencode-vpet/src}/tui/open-in-browser.ts (100%) rename {src => packages/opencode-vpet/src}/tui/sidebar-card.tsx (98%) rename {src => packages/opencode-vpet/src}/tui/sidebar-poll-loop.ts (100%) rename {src => packages/opencode-vpet/src}/tui/vpet-command-layer.tsx (83%) rename {src => packages/opencode-vpet/src}/tui/vpet-dex-dialog.tsx (97%) rename {src => packages/opencode-vpet/src}/tui/vpet-history-dialog.tsx (97%) rename {tests => packages/opencode-vpet/tests}/architecture-boundary-helpers.ts (98%) rename {tests => packages/opencode-vpet/tests}/architecture-boundary.test.ts (92%) rename {tests => packages/opencode-vpet/tests}/catalog-evolution.test.ts (95%) rename {tests => packages/opencode-vpet/tests}/cli-config.test.ts (100%) rename {tests => packages/opencode-vpet/tests}/config-loader.test.ts (98%) rename {tests => packages/opencode-vpet/tests}/config-settings.test.ts (98%) rename {tests => packages/opencode-vpet/tests}/dex-view-model.test.ts (92%) rename {tests => packages/opencode-vpet/tests}/digimon-data.test.ts (96%) rename {tests => packages/opencode-vpet/tests}/get-sidebar-card-inputs.test.ts (93%) rename {tests => packages/opencode-vpet/tests}/hexagonal-boundary.test.ts (84%) rename {tests => packages/opencode-vpet/tests}/history-view-model.test.ts (93%) rename {tests => packages/opencode-vpet/tests}/monster-animation-actions.test.ts (98%) rename {tests => packages/opencode-vpet/tests}/monster-animation-test-utils.ts (93%) rename {tests => packages/opencode-vpet/tests}/monster-animation-walking.test.ts (100%) rename {tests => packages/opencode-vpet/tests}/monster-animation.test.ts (98%) rename {tests => packages/opencode-vpet/tests}/monster-artwork-mirror.test.ts (96%) rename {tests => packages/opencode-vpet/tests}/monster-frame-catalog.test.ts (97%) rename {tests => packages/opencode-vpet/tests}/monster-frame-data.test.ts (95%) rename {tests => packages/opencode-vpet/tests}/package-fixture.ts (96%) rename {tests => packages/opencode-vpet/tests}/persistence/sqlite-migrations.persistence.ts (98%) rename {tests => packages/opencode-vpet/tests}/persistence/sqlite-usage-event-toast.persistence.test.ts (98%) rename {tests => packages/opencode-vpet/tests}/persistence/sqlite-vpet-archive-history.persistence.ts (94%) rename {tests => packages/opencode-vpet/tests}/persistence/sqlite-vpet-control.persistence.ts (100%) rename {tests => packages/opencode-vpet/tests}/persistence/sqlite-vpet-repository.control-ledger.persistence.ts (100%) rename {tests => packages/opencode-vpet/tests}/persistence/sqlite-vpet-repository.fixtures.ts (96%) rename {tests => packages/opencode-vpet/tests}/persistence/sqlite-vpet-repository.lifecycle.persistence.ts (99%) rename {tests => packages/opencode-vpet/tests}/persistence/sqlite-vpet-repository.persistence.ts (100%) rename {tests => packages/opencode-vpet/tests}/persistence/sqlite-vpet-repository.receipts.persistence.ts (100%) rename {tests => packages/opencode-vpet/tests}/port-boundary.test.ts (99%) rename {tests => packages/opencode-vpet/tests}/record-usage.test.ts (93%) rename {tests => packages/opencode-vpet/tests}/release-metadata.test.ts (95%) rename {tests => packages/opencode-vpet/tests}/server-hooks-lifecycle.test.ts (96%) rename {tests => packages/opencode-vpet/tests}/server-thresholds.test.ts (94%) rename {tests => packages/opencode-vpet/tests}/sidebar-card.test.tsx (99%) rename {tests => packages/opencode-vpet/tests}/sidebar-poll-loop.test.ts (100%) rename {tests => packages/opencode-vpet/tests}/sidebar-state.test.ts (100%) rename {tests => packages/opencode-vpet/tests}/sidebar-view-model.test.ts (94%) rename {tests => packages/opencode-vpet/tests}/sqlite-capability.ts (100%) rename {tests => packages/opencode-vpet/tests}/sqlite-vpet-archive-reader.test.ts (100%) create mode 100644 packages/opencode-vpet/tests/tsconfig.json rename {tests => packages/opencode-vpet/tests}/tui-composition-fixture.ts (97%) rename {tests => packages/opencode-vpet/tests}/tui-composition.test.ts (97%) rename {tests => packages/opencode-vpet/tests}/tui-settings-composition.test.ts (96%) rename {tests => packages/opencode-vpet/tests}/usage-event-ingestion.test.ts (96%) rename {tests => packages/opencode-vpet/tests}/usage-event-processing-time.test.ts (89%) rename {tests => packages/opencode-vpet/tests}/vpet-command-layer.test.tsx (90%) rename {tests => packages/opencode-vpet/tests}/vpet-control.test.ts (90%) rename {tests => packages/opencode-vpet/tests}/vpet-dex-dialog-fixture.tsx (100%) rename {tests => packages/opencode-vpet/tests}/vpet-dex-dialog-hardening.test.tsx (96%) rename {tests => packages/opencode-vpet/tests}/vpet-dex-dialog.test.tsx (98%) rename {tests => packages/opencode-vpet/tests}/vpet-dialog-layout.test.tsx (100%) rename {tests => packages/opencode-vpet/tests}/vpet-freeze.test.ts (100%) rename {tests => packages/opencode-vpet/tests}/vpet-history-dialog.test.tsx (99%) rename {tests => packages/opencode-vpet/tests}/vpet-set.test.ts (98%) rename {tests => packages/opencode-vpet/tests}/vpet-spawn.test.ts (98%) rename {tests => packages/opencode-vpet/tests}/vpet-toast.test.ts (98%) rename {tests => packages/opencode-vpet/tests}/vpet-unfreeze.test.ts (100%) rename tsconfig.build.json => packages/opencode-vpet/tsconfig.build.json (100%) create mode 100644 packages/opencode-vpet/tsconfig.json create mode 100644 packages/opencode-vpet/tsconfig.scripts.json rename tsconfig.test.json => packages/opencode-vpet/tsconfig.test.json (62%) create mode 100644 packages/opencode-vpet/tsconfig.vpet-core-declarations.json create mode 100644 packages/vpet-core/package.json create mode 100644 packages/vpet-core/src/adapters/sqlite/app-data-path.ts create mode 100644 packages/vpet-core/src/adapters/sqlite/sqlite-migrations.ts create mode 100644 packages/vpet-core/src/adapters/sqlite/sqlite-vpet-schema.ts create mode 100644 packages/vpet-core/src/adapters/sqlite/sqlite-vpet-types.ts create mode 100644 packages/vpet-core/src/adapters/sqlite/sqlite-vpet-write-store.ts create mode 100644 packages/vpet-core/src/application/models/sidebar-card-inputs.ts create mode 100644 packages/vpet-core/src/application/models/spawn-partner.ts create mode 100644 packages/vpet-core/src/application/models/usage.ts create mode 100644 packages/vpet-core/src/application/models/vpet-archive.ts create mode 100644 packages/vpet-core/src/application/models/vpet-control.ts create mode 100644 packages/vpet-core/src/application/ports/partner-lifecycle.ts create mode 100644 packages/vpet-core/src/application/ports/sidebar-snapshot.ts create mode 100644 packages/vpet-core/src/application/ports/usage-ledger.ts create mode 100644 packages/vpet-core/src/application/ports/vpet-archive.ts create mode 100644 packages/vpet-core/src/application/ports/vpet-control.ts create mode 100644 packages/vpet-core/src/application/use-cases/freeze-vpet.ts create mode 100644 packages/vpet-core/src/application/use-cases/get-sidebar-card-inputs.ts create mode 100644 packages/vpet-core/src/application/use-cases/reconcile-usage.ts create mode 100644 packages/vpet-core/src/application/use-cases/record-usage.ts create mode 100644 packages/vpet-core/src/application/use-cases/set-vpet-cheat-node.ts create mode 100644 packages/vpet-core/src/application/use-cases/spawn-partner.ts create mode 100644 packages/vpet-core/src/application/use-cases/unfreeze-vpet.ts create mode 100644 packages/vpet-core/src/config/defaults.ts create mode 100644 packages/vpet-core/src/config/normalize.ts create mode 100644 packages/vpet-core/src/config/types.ts create mode 100644 packages/vpet-core/src/data/catalog.ts create mode 100644 packages/vpet-core/src/data/digimon-data.ts create mode 100644 packages/vpet-core/src/data/monster-frame-catalog.ts create mode 100644 packages/vpet-core/src/data/monster-frame-data.ts create mode 100644 packages/vpet-core/src/data/stages.ts create mode 100644 packages/vpet-core/src/domain/digimon-node.ts create mode 100644 packages/vpet-core/src/domain/evolution.ts create mode 100644 packages/vpet-core/src/domain/partner.ts create mode 100644 packages/vpet-core/src/domain/stage.ts create mode 100644 packages/vpet-core/src/ports/sqlite-executor.ts create mode 100644 packages/vpet-core/src/view-models/dex-view-model.ts create mode 100644 packages/vpet-core/src/view-models/history-view-model.ts create mode 100644 packages/vpet-core/src/view-models/sidebar-view-model.ts create mode 100644 packages/vpet-core/tsconfig.json create mode 100644 scripts/migrate-imports.mjs delete mode 100644 scripts/prepack.ts diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 671f480..28c9ae7 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -20,6 +20,9 @@ jobs: release: name: Publish release runs-on: ubuntu-latest + env: + HAS_OVSX_PAT: ${{ secrets.OVSX_PAT != '' }} + HAS_VSCE_PAT: ${{ secrets.VSCE_PAT != '' }} permissions: contents: write id-token: write @@ -52,7 +55,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6 with: - node-version: 24 + node-version: 24.11.0 registry-url: https://registry.npmjs.org/ - name: Set up Bun @@ -71,14 +74,24 @@ jobs: set -euo pipefail release_date="$(date -u +%F)" git tag --list | bun scripts/release-metadata.ts \ - --package-json package.json \ + --package-json packages/opencode-vpet/package.json \ --changelog CHANGELOG.md \ --bump "$BUMP" \ --date "$release_date" + - name: Sync workspace versions + env: + RELEASE_VERSION: ${{ steps.metadata.outputs.release_version }} + run: | + bun scripts/release-metadata.ts set-package-stable-version packages/vpet-core/package.json "$RELEASE_VERSION" + bun scripts/release-metadata.ts set-package-stable-version packages/cursor-vpet/package.json "$RELEASE_VERSION" + - name: Run release checks run: bun run release:check + - name: Build cursor-vpet + run: bun run --filter cursor-vpet build + - name: Pack release id: pack run: | @@ -86,13 +99,23 @@ jobs: package_directory="$RUNNER_TEMP/opencode-vpet-package" mkdir -p "$package_directory" - tarball_name="$(npm pack --loglevel silent --ignore-scripts \ - --pack-destination "$package_directory")" + tarball_name="$(npm pack --loglevel silent \ + --pack-destination "$package_directory" \ + --workspace @sbugallo/opencode-vpet)" test -f "$package_directory/$tarball_name" printf 'tarball_name=%s\n' "$tarball_name" >> "$GITHUB_OUTPUT" + - name: Pack VSIX + id: vsix + run: | + set -euo pipefail + vsix_path="$RUNNER_TEMP/cursor-vpet.vsix" + cd packages/cursor-vpet + npx @vscode/vsce package --no-dependencies -o "$vsix_path" + printf 'vsix_path=%s\n' "$vsix_path" >> "$GITHUB_OUTPUT" + - name: Set up Git run: | git config user.name "github-actions[bot]" @@ -104,7 +127,7 @@ jobs: run: | set -euo pipefail - git add package.json CHANGELOG.md + git add packages/opencode-vpet/package.json packages/vpet-core/package.json packages/cursor-vpet/package.json CHANGELOG.md git commit -m "chore(release): v$RELEASE_VERSION" @@ -116,9 +139,11 @@ jobs: run: | set -euo pipefail - bun scripts/release-metadata.ts set-package-version package.json "$NEXT_DEV_VERSION" + bun scripts/release-metadata.ts set-package-version packages/opencode-vpet/package.json "$NEXT_DEV_VERSION" + bun scripts/release-metadata.ts set-package-version packages/vpet-core/package.json "$NEXT_DEV_VERSION" + bun scripts/release-metadata.ts set-package-version packages/cursor-vpet/package.json "$NEXT_DEV_VERSION" - git add package.json + git add packages/opencode-vpet/package.json packages/vpet-core/package.json packages/cursor-vpet/package.json git commit -m "chore: bump v$NEXT_DEV_VERSION" @@ -156,5 +181,24 @@ jobs: run: | gh release create "v$RELEASE_VERSION" \ "$TARBALL" \ + "${{ steps.vsix.outputs.vsix_path }}" \ --title "v$RELEASE_VERSION" \ --generate-notes + + - name: Create Open VSX namespace + if: env.HAS_OVSX_PAT == 'true' + run: npx ovsx create-namespace sbugallo -p "$OVSX_PAT" || true + env: + OVSX_PAT: ${{ secrets.OVSX_PAT }} + + - name: Publish release (Open VSX) + if: env.HAS_OVSX_PAT == 'true' + run: npx ovsx publish "${{ steps.vsix.outputs.vsix_path }}" -p "$OVSX_PAT" + env: + OVSX_PAT: ${{ secrets.OVSX_PAT }} + + - name: Publish release (VS Code Marketplace) + if: env.HAS_VSCE_PAT == 'true' + run: npx @vscode/vsce publish --packagePath "${{ steps.vsix.outputs.vsix_path }}" + env: + VSCE_PAT: ${{ secrets.VSCE_PAT }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8457600..db4554b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6 with: - node-version: 24 + node-version: 24.11.0 - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 with: @@ -40,10 +40,21 @@ jobs: run: bun run check - name: Tests - run: bun test + run: bun run test + + - name: Persistence tests + run: bun run test:persistence + + - name: Build cursor-vpet + run: bun run --filter cursor-vpet build - name: Prepack run: bun run prepack - - - name: Pack + + - name: Pack npm + working-directory: packages/opencode-vpet run: npm pack --dry-run --json + + - name: Pack VSIX + working-directory: packages/cursor-vpet + run: npx @vscode/vsce package --no-dependencies diff --git a/.gitignore b/.gitignore index 4af8649..6c91d37 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,6 @@ Thumbs.db # Release workflow artifacts *.tgz +*.vsix npm-pack.json +.package.json.publish.bak diff --git a/README.md b/README.md index 8632212..c229011 100644 --- a/README.md +++ b/README.md @@ -63,8 +63,8 @@ options in that Digimon's line. Requirements: - OpenCode `>=1.18.10` -- Node `>=20` to run `npx` -- Bun `>=1.3.5` only for local development +- Node `24.11.0` to run `npx` (pinned via Volta in this repo) +- Bun `1.3.5` for local development and builds (pinned via Volta in this repo) 1. Install both plugins: @@ -816,7 +816,7 @@ To persist your partner, history, and control state, VPet uses a SQLite database | 7-044 | Ogudomon X | Ogudomon X | | 7-045 | Chaosdramon | Chaosdramon | -Check out the [Digimon Data List](src/data/digimon-data.ts) for more information about evolution +Check out the [Digimon Data List](packages/vpet-core/src/data/digimon-data.ts) for more information about evolution lines. ## License diff --git a/biome.json b/biome.json index 6d28508..1dacf5b 100644 --- a/biome.json +++ b/biome.json @@ -2,15 +2,15 @@ "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", "files": { "includes": [ - "src/**", - "tests/**", + "packages/**", "scripts/**", "package.json", "tsconfig*.json", - "!src/data/monster-frame-data.ts", + "!packages/**/dist/**", + "!packages/cursor-vpet/hook-bridge.js", + "!packages/vpet-core/src/data/monster-frame-data.ts", "!tests/**/*.jsonc", "!.omo/", - "!dist/", "!node_modules/", "!coverage/", "!**/generated/" @@ -44,7 +44,11 @@ }, "overrides": [ { - "includes": ["src/tui/sidebar-card.tsx", "src/tui/vpet-dex-dialog.tsx", "src/tui/vpet-history-dialog.tsx"], + "includes": [ + "packages/opencode-vpet/src/tui/sidebar-card.tsx", + "packages/opencode-vpet/src/tui/vpet-dex-dialog.tsx", + "packages/opencode-vpet/src/tui/vpet-history-dialog.tsx" + ], "linter": { "rules": { "a11y": { diff --git a/bun.lock b/bun.lock index 740fed9..a60422c 100644 --- a/bun.lock +++ b/bun.lock @@ -4,6 +4,37 @@ "workspaces": { "": { "name": "opencode-vpet", + "devDependencies": { + "@biomejs/biome": "2.5.10", + "@types/bun": "1.3.14", + "@types/node": "24.10.1", + "@types/semver": "7.7.1", + "semver": "7.7.4", + "typescript": "5.9.3", + }, + }, + "packages/cursor-vpet": { + "name": "cursor-vpet", + "version": "0.2.0-dev.0", + "dependencies": { + "@sbugallo/vpet-core": "workspace:*", + "sql.js": "^1.12.0", + }, + "devDependencies": { + "@types/bun": "1.3.14", + "@types/node": "24.10.1", + "@types/vscode": "1.90.0", + "@vscode/vsce": "3.2.1", + "ovsx": "0.10.0", + "typescript": "5.9.3", + }, + }, + "packages/opencode-vpet": { + "name": "@sbugallo/opencode-vpet", + "version": "0.2.0-dev.0", + "bin": { + "opencode-vpet": "./dist/cli.js", + }, "dependencies": { "solid-js": "^1.9.14", }, @@ -14,10 +45,12 @@ "@opentui/core": "^0.4.5", "@opentui/keymap": "^0.4.5", "@opentui/solid": "^0.4.5", - "@types/bun": "latest", - "@types/semver": "^7.7.1", - "semver": "^7.7.4", - "typescript": "^5.9.3", + "@sbugallo/vpet-core": "workspace:*", + "@types/bun": "1.3.14", + "@types/node": "24.10.1", + "@types/semver": "7.7.1", + "semver": "7.7.4", + "typescript": "5.9.3", }, "peerDependencies": { "@opencode-ai/plugin": ">=1.18.10", @@ -26,12 +59,44 @@ "@opentui/solid": ">=0.4.5", }, }, + "packages/vpet-core": { + "name": "@sbugallo/vpet-core", + "version": "0.2.0-dev.0", + "devDependencies": { + "@types/bun": "1.3.14", + "typescript": "5.9.3", + }, + }, }, "packages": { "@ai-sdk/provider": ["@ai-sdk/provider@3.0.8", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ=="], "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + "@azure/abort-controller": ["@azure/abort-controller@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-fNAjWnA/nZ2jz31kxR/AqRaUT8ewHBw/WuBIosK0moMy1C9e5ValbDfFdIxJzVOOYaYkV/b2F1S4H/aHiqfVQg=="], + + "@azure/core-auth": ["@azure/core-auth@1.11.0", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-util": "^1.13.0", "tslib": "^2.6.2" } }, "sha512-IUZydyTUkDnYdstOW9pFOOUQlBjAepK5teihDE3x6yxsPJs/hsAaaYpeGxdxrgtOiJbBKSjKW7MDk7AEhb4LRg=="], + + "@azure/core-client": ["@azure/core-client@1.11.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.10.0", "@azure/core-rest-pipeline": "^1.22.0", "@azure/core-tracing": "^1.3.0", "@azure/core-util": "^1.13.0", "@azure/logger": "^1.3.0", "tslib": "^2.6.2" } }, "sha512-2QygG2F76ZpMP2eMztiJvAiFMu71M9rDeU7vO/QKg5Css7MgM4frUOslFjhVjRhbGaCNPtz/S8M6y46/fFKVuQ=="], + + "@azure/core-process": ["@azure/core-process@1.0.0", "", {}, "sha512-/shnJ+ooO8WPxDhPEeI/2oRQuubn16gZ6CvlbpWbEswZfzwI9tI/sMAHmF3x1LuQ9yZYXfLW3TjzGMLEC5blKg=="], + + "@azure/core-rest-pipeline": ["@azure/core-rest-pipeline@1.25.0", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.10.0", "@azure/core-tracing": "^1.3.0", "@azure/core-util": "^1.13.0", "@azure/logger": "^1.3.0", "@typespec/ts-http-runtime": "^0.3.4", "tslib": "^2.6.2" } }, "sha512-bMs8ekJLjX8wPV+9IPBges1SLPyuDtE9g5gLDWOpxzKcoOFQnpLGkbcT1tdw3FaAmDS1gnPmMmJ6y/T5B96kIA=="], + + "@azure/core-tracing": ["@azure/core-tracing@1.4.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-eGwxD0AtncrxeBM4tG8R55Pc3rdX1hNW2WibJAgYpCVA6E93mvvVH+LcssoVjOBrSKWS55yEIHsk0X8ctHmfOQ=="], + + "@azure/core-util": ["@azure/core-util@1.14.0", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-9n2pWK61veAuN0V20t9lOuoV4CFMdyAZ1ygZzvBGk/pBBJRib/PjL9PLXa/aI2CcPpyHfqVsxxqLCYl6uZlfDw=="], + + "@azure/identity": ["@azure/identity@4.13.2", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.9.0", "@azure/core-client": "^1.9.2", "@azure/core-process": "^1.0.0", "@azure/core-rest-pipeline": "^1.17.0", "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", "@azure/msal-browser": "^5.5.0", "@azure/msal-node": "^5.1.5", "open": "^10.1.0", "tslib": "^2.2.0" } }, "sha512-NXL2/pCJctLxgw8bvrwwgge743kEq8LBT+O1pmV0vyUwetzFPH9auP6jhkU/cgZCPPtWoewAe3ncaGCgPo07fA=="], + + "@azure/logger": ["@azure/logger@1.4.0", "", { "dependencies": { "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-rbAE25KUfjU/s3XHUdJgceoCP5dEOpMx85J04kF+QMdta73XkuG9JGHHinch+XIoKpBdqljin+KqURpJriSzLA=="], + + "@azure/msal-browser": ["@azure/msal-browser@5.21.0", "", { "dependencies": { "@azure/msal-common": "16.14.0" } }, "sha512-80OcuXDErmcEDAIH9pBtSqBsed2sPT/IWmbG3xHLoPMl5zc8TINd6SlJAbVSmN5huGa3xGAg5qR7VnpaIEK0Zw=="], + + "@azure/msal-common": ["@azure/msal-common@16.14.0", "", {}, "sha512-A4rb55hI86Q9tBl/+jBj7TMz7iX2RFgQs/nExFzcAtoI/BFRVdaH5SL/MivrYD7qvweMpN8AgVvVMHV8UBYxew=="], + + "@azure/msal-node": ["@azure/msal-node@5.6.0", "", { "dependencies": { "@azure/msal-common": "16.13.0", "jsonwebtoken": "^9.0.0" } }, "sha512-uFY9NxrWHw8PwZx7gAX6PDn+9vdfS05+levc/kwkx77IkjfaldnQbbcQzzDIZ5Hq5Zdr6/z92oAIoRWKp6MnOA=="], + "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], "@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="], @@ -106,6 +171,8 @@ "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.5.10", "", { "os": "win32", "cpu": "x64" }, "sha512-M+2dgBsl3lXRiTfgPVc2p3anS4Tocojke4rzFLScZ2Y/wmF+36dRb1iHCLiyGqOzQGyTplZH1HnEYviiAqi3nA=="], + "@isaacs/cliui": ["@isaacs/cliui@9.0.0", "", {}, "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], @@ -152,16 +219,56 @@ "@opentui/solid": ["@opentui/solid@0.4.5", "", { "dependencies": { "@babel/core": "7.28.0", "@babel/preset-typescript": "7.27.1", "@opentui/core": "0.4.5", "babel-plugin-module-resolver": "5.0.2", "babel-preset-solid": "1.9.12", "entities": "7.0.1", "s-js": "^0.4.9" }, "peerDependencies": { "solid-js": "1.9.12" } }, "sha512-B0RSkXnrtPVfEJOX+Hj+axjLJ3lzbG1BZw5I7Pvb9OPp48Vzg2cW2a3cSa86/q48ndLt647i/XwFPIw/jqnI5g=="], + "@sbugallo/opencode-vpet": ["@sbugallo/opencode-vpet@workspace:packages/opencode-vpet"], + + "@sbugallo/vpet-core": ["@sbugallo/vpet-core@workspace:packages/vpet-core"], + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], - "@types/node": ["@types/node@26.1.2", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg=="], + "@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="], + + "@types/semver": ["@types/semver@7.7.1", "", {}, "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA=="], + + "@types/vscode": ["@types/vscode@1.90.0", "", {}, "sha512-oT+ZJL7qHS9Z8bs0+WKf/kQ27qWYR3trsXpq46YDjFqBsMLG4ygGGjPaJ2tyrH0wJzjOEmDyg9PDJBBhWg9pkQ=="], + + "@typespec/ts-http-runtime": ["@typespec/ts-http-runtime@0.3.9", "", { "dependencies": { "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "tslib": "^2.6.2" } }, "sha512-edSdeAqkdxBVzA1yL1LrLCml1YjyCVvPMtMqJpbF+6K609tHe8V6sQUzFQSGcYNhcuhOceZtjvN32+mpIth30A=="], + + "@vscode/vsce": ["@vscode/vsce@3.2.1", "", { "dependencies": { "@azure/identity": "^4.1.0", "@vscode/vsce-sign": "^2.0.0", "azure-devops-node-api": "^12.5.0", "chalk": "^2.4.2", "cheerio": "^1.0.0-rc.9", "cockatiel": "^3.1.2", "commander": "^6.2.1", "form-data": "^4.0.0", "glob": "^11.0.0", "hosted-git-info": "^4.0.2", "jsonc-parser": "^3.2.0", "leven": "^3.1.0", "markdown-it": "^14.1.0", "mime": "^1.3.4", "minimatch": "^3.0.3", "parse-semver": "^1.1.1", "read": "^1.0.7", "semver": "^7.5.2", "tmp": "^0.2.3", "typed-rest-client": "^1.8.4", "url-join": "^4.0.1", "xml2js": "^0.5.0", "yauzl": "^2.3.1", "yazl": "^2.2.2" }, "optionalDependencies": { "keytar": "^7.7.0" }, "bin": { "vsce": "vsce" } }, "sha512-AY9vBjwExakK1c0cI/3NN2Ey0EgiKLBye/fxl/ue+o4q6RZ7N+xzd1jAD6eI6eBeMVANi617+V2rxIAkDPco2Q=="], + + "@vscode/vsce-sign": ["@vscode/vsce-sign@2.1.0", "", { "optionalDependencies": { "@vscode/vsce-sign-alpine-arm64": "2.0.6", "@vscode/vsce-sign-alpine-x64": "2.0.6", "@vscode/vsce-sign-darwin-arm64": "2.0.6", "@vscode/vsce-sign-darwin-x64": "2.0.6", "@vscode/vsce-sign-linux-arm": "2.0.6", "@vscode/vsce-sign-linux-arm64": "2.0.6", "@vscode/vsce-sign-linux-x64": "2.0.6", "@vscode/vsce-sign-win32-arm64": "2.0.6", "@vscode/vsce-sign-win32-x64": "2.0.6" } }, "sha512-9AQrqazrBgTgRSuwleLVXUrIUphY02/SFCh2TKYoLV/xifJAdblhdmEmw5gUrYSPQ3sRwNs9iyCMD14sATEE6g=="], + + "@vscode/vsce-sign-alpine-arm64": ["@vscode/vsce-sign-alpine-arm64@2.0.6", "", { "os": "none", "cpu": "arm64" }, "sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q=="], + + "@vscode/vsce-sign-alpine-x64": ["@vscode/vsce-sign-alpine-x64@2.0.6", "", { "os": "none", "cpu": "x64" }, "sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w=="], + + "@vscode/vsce-sign-darwin-arm64": ["@vscode/vsce-sign-darwin-arm64@2.0.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ=="], + + "@vscode/vsce-sign-darwin-x64": ["@vscode/vsce-sign-darwin-x64@2.0.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw=="], + + "@vscode/vsce-sign-linux-arm": ["@vscode/vsce-sign-linux-arm@2.0.6", "", { "os": "linux", "cpu": "arm" }, "sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA=="], + + "@vscode/vsce-sign-linux-arm64": ["@vscode/vsce-sign-linux-arm64@2.0.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA=="], + + "@vscode/vsce-sign-linux-x64": ["@vscode/vsce-sign-linux-x64@2.0.6", "", { "os": "linux", "cpu": "x64" }, "sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA=="], - "@types/semver": ["@types/semver@7.8.0", "", {}, "sha512-1mAINjtQCXXeLkJ9ehXkwOcBpqtLxiVtKhpUf83DdRNdQKV0iXZpaHYqRr7nj+wvxuJzoAmAwXI+sCNMv1CzLQ=="], + "@vscode/vsce-sign-win32-arm64": ["@vscode/vsce-sign-win32-arm64@2.0.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg=="], + + "@vscode/vsce-sign-win32-x64": ["@vscode/vsce-sign-win32-x64@2.0.6", "", { "os": "win32", "cpu": "x64" }, "sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ=="], + + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "azure-devops-node-api": ["azure-devops-node-api@12.5.0", "", { "dependencies": { "tunnel": "0.0.6", "typed-rest-client": "^1.8.4" } }, "sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og=="], + "babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.40.7", "", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", "parse5": "^7.1.2" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-/O6JWUmjv03OI9lL2ry9bUjpD5S3PclM55RRJEyCdcFZ5W2SEA/59d+l2hNsk3gI6kiWRdRPdOtqZmsQzFN1pQ=="], "babel-plugin-module-resolver": ["babel-plugin-module-resolver@5.0.2", "", { "dependencies": { "find-babel-config": "^2.1.1", "glob": "^9.3.3", "pkg-up": "^3.1.0", "reselect": "^4.1.7", "resolve": "^1.22.8" } }, "sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg=="], @@ -170,50 +277,144 @@ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.8", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-zAgkquC2WYF0PIc6XbNYkA2uuxxFavzgmX61R+dHDUa558V8Ejf8ozTZFR6QzM24RWu4kBcRkhJ5kpz77j9fnQ=="], - "brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="], "browserslist": ["browserslist@4.28.7", "", { "dependencies": { "baseline-browser-mapping": "^2.10.44", "caniuse-lite": "^1.0.30001806", "electron-to-chromium": "^1.5.393", "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw=="], + "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + + "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], + + "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], + "bun-ffi-structs": ["bun-ffi-structs@0.2.4", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-AJzsqoVFs1KBbJbWHIYrVZLDC3NhTqqh25awRXqzoLzmBAKr5oqk6+CwuYHAekKx+VBCYVohBoKuRq40dV+TYg=="], "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="], + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "caniuse-lite": ["caniuse-lite@1.0.30001806", "", {}, "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw=="], + "chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "cheerio": ["cheerio@1.2.0", "", { "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "encoding-sniffer": "^0.2.1", "htmlparser2": "^10.1.0", "parse5": "^7.3.0", "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", "undici": "^7.19.0", "whatwg-mimetype": "^4.0.0" } }, "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg=="], + + "cheerio-select": ["cheerio-select@2.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", "css-what": "^6.1.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" } }, "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g=="], + + "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + + "ci-info": ["ci-info@2.0.0", "", {}, "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="], + + "cockatiel": ["cockatiel@3.2.1", "", {}, "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q=="], + + "color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "commander": ["commander@6.2.1", "", {}, "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + + "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + "cursor-vpet": ["cursor-vpet@workspace:packages/cursor-vpet"], + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + + "default-browser": ["default-browser@5.5.1", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw=="], + + "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="], + + "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], "diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], + "effect": ["effect@4.0.0-beta.83", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "fast-check": "^4.8.0", "find-my-way-ts": "^0.1.6", "ini": "^7.0.0", "kubernetes-types": "^1.30.0", "msgpackr": "^2.0.1", "multipasta": "^0.2.7", "toml": "^4.1.1", "uuid": "^14.0.0", "yaml": "^2.9.0" } }, "sha512-0wsak8RtgGAr9UWSbVDgJHZcUqMSvicHcvaZv1MbMM7MCGgW4Rn/137J1MHQbwYPcwYGxT/IqehFd+UbYuj78w=="], "electron-to-chromium": ["electron-to-chromium@1.5.398", "", {}, "sha512-AsvhAxopJGh6museTDMIjn6JpDYOfgu4RLlygomt87MUwBUqTfd/1EiPtx10/LZE8xpTvkP2E9Gafq7lkLtodQ=="], "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + "encoding-sniffer": ["encoding-sniffer@0.2.1", "", { "dependencies": { "iconv-lite": "^0.6.3", "whatwg-encoding": "^3.1.1" } }, "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw=="], + + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + "entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + "es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], + "fast-check": ["fast-check@4.9.0", "", { "dependencies": { "pure-rand": "^8.0.0" } }, "sha512-7ms6T7SybUev/PQITciI0yLM2pOSFy5zpG8Ty7tQofcVaQUvrMXp6CBwqF6fThLCLOrfBtuHAtwq6Yu4XPCllg=="], + "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], + "find-babel-config": ["find-babel-config@2.1.2", "", { "dependencies": { "json5": "^2.2.3" } }, "sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg=="], "find-my-way-ts": ["find-my-way-ts@0.1.6", "", {}, "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA=="], "find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="], + "follow-redirects": ["follow-redirects@1.16.0", "", { "peerDependencies": { "debug": "*" }, "optionalPeers": ["debug"] }, "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "form-data": ["form-data@4.0.6", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.4", "mime-types": "^2.1.35" } }, "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ=="], + + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], @@ -222,18 +423,56 @@ "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], - "glob": ["glob@9.3.5", "", { "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" } }, "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q=="], + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], + + "glob": ["glob@11.1.0", "", { "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], + "hosted-git-info": ["hosted-git-info@4.1.0", "", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], + "html-entities": ["html-entities@2.3.3", "", {}, "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="], + "htmlparser2": ["htmlparser2@10.1.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "entities": "^7.0.1" } }, "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ=="], + + "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "ini": ["ini@7.0.0", "", {}, "sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w=="], + "is-ci": ["is-ci@2.0.0", "", { "dependencies": { "ci-info": "^2.0.0" }, "bin": { "is-ci": "bin.js" } }, "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w=="], + "is-core-module": ["is-core-module@2.16.2", "", { "dependencies": { "hasown": "^2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="], + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + + "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "jackspeak": ["jackspeak@4.2.3", "", { "dependencies": { "@isaacs/cliui": "^9.0.0" } }, "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg=="], + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], @@ -242,17 +481,63 @@ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], + + "jsonwebtoken": ["jsonwebtoken@9.0.3", "", { "dependencies": { "jws": "^4.0.1", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", "lodash.isnumber": "^3.0.3", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", "ms": "^2.1.1", "semver": "^7.5.4" } }, "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g=="], + + "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="], + + "jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="], + + "keytar": ["keytar@7.9.0", "", { "dependencies": { "node-addon-api": "^4.3.0", "prebuild-install": "^7.0.1" } }, "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ=="], + "kubernetes-types": ["kubernetes-types@1.30.0", "", {}, "sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q=="], + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + + "linkify-it": ["linkify-it@5.0.2", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q=="], + "locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], - "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "lodash.includes": ["lodash.includes@4.3.0", "", {}, "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="], + + "lodash.isboolean": ["lodash.isboolean@3.0.3", "", {}, "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="], + + "lodash.isinteger": ["lodash.isinteger@4.0.4", "", {}, "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="], + + "lodash.isnumber": ["lodash.isnumber@3.0.3", "", {}, "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="], + + "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="], + + "lodash.isstring": ["lodash.isstring@4.0.1", "", {}, "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="], + + "lodash.once": ["lodash.once@4.1.1", "", {}, "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="], + + "lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "markdown-it": ["markdown-it@14.3.1", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.5.0", "linkify-it": "^5.0.2", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-4Ej49aYTDFIQ+uBkfX8GBvJGccoARxxPep+7aWTs55ozbjQJpW9M26Fe53vnGgvLeVzva/amzjQQaQu9w0vMhA=="], "marked": ["marked@17.0.1", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg=="], - "minimatch": ["minimatch@8.0.7", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg=="], + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mdurl": ["mdurl@2.1.0", "", {}, "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg=="], + + "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], - "minipass": ["minipass@4.2.8", "", {}, "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ=="], + "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + + "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], @@ -262,39 +547,89 @@ "multipasta": ["multipasta@0.2.8", "", {}, "sha512-ZPWuMKyv0cSO29f7hozp+k6+crZbQijV8ipMvxNxRf2SwtYGTX1ZX89Kd20VV4H9Znonx+EQn+iy1wGQsJ+b+Q=="], + "mute-stream": ["mute-stream@0.0.8", "", {}, "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="], + + "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], + + "node-abi": ["node-abi@3.96.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-rebQ/lz7i0EkoLzUVSrKRzA69zMkwLp95kKMWoMDkkM00Suxz0D7zEQPwRml5fQum24mj7bPvmlgLAmu2JCiYg=="], + + "node-addon-api": ["node-addon-api@4.3.0", "", {}, "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ=="], + "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="], "node-releases": ["node-releases@2.0.51", "", {}, "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ=="], + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="], + + "ovsx": ["ovsx@0.10.0", "", { "dependencies": { "@vscode/vsce": "^3.1.0", "commander": "^6.2.1", "follow-redirects": "^1.14.6", "is-ci": "^2.0.0", "leven": "^3.1.0", "semver": "^7.6.0", "tmp": "^0.2.3", "yauzl": "^3.1.3" }, "bin": "lib/ovsx" }, "sha512-DSgNXGQ444nGKag+LZh92R/hM2PfRSu+6VKfVawoZ+JzFDiGX8yhMkAuyVlHrlxLCpfQOsqs80GcHje/h2SpmA=="], + "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], "p-locate": ["p-locate@3.0.0", "", { "dependencies": { "p-limit": "^2.0.0" } }, "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="], "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "parse-semver": ["parse-semver@1.1.1", "", { "dependencies": { "semver": "^5.1.0" } }, "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ=="], + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + "parse5-htmlparser2-tree-adapter": ["parse5-htmlparser2-tree-adapter@7.1.0", "", { "dependencies": { "domhandler": "^5.0.3", "parse5": "^7.0.0" } }, "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g=="], + + "parse5-parser-stream": ["parse5-parser-stream@7.1.2", "", { "dependencies": { "parse5": "^7.0.0" } }, "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow=="], + "path-exists": ["path-exists@3.0.0", "", {}, "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], - "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + "path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + + "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "pkg-up": ["pkg-up@3.1.0", "", { "dependencies": { "find-up": "^3.0.0" } }, "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA=="], + "prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], + + "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], + + "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="], + "pure-rand": ["pure-rand@8.4.2", "", {}, "sha512-vvuOGgcuPJAirlHvuQw1TrOiw7ptaIXXmIbNuiNOY6lNGJJH49PQ1Kj4nd783nPdQhQdicgOjVI2yI/9BD6/Ng=="], + "qs": ["qs@6.16.0", "", { "dependencies": { "es-define-property": "^1.0.1", "side-channel": "^1.1.1" } }, "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA=="], + + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "read": ["read@1.0.7", "", { "dependencies": { "mute-stream": "~0.0.4" } }, "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ=="], + + "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "reselect": ["reselect@4.1.8", "", {}, "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ=="], "resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="], + "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], + "s-js": ["s-js@0.4.9", "", {}, "sha512-RtpOm+cM6O0sHg6IA70wH+UC3FZcND+rccBZpBAHzlUgNO2Bm5BN+FnM8+OBxzXdwpKWFwX11JGF0MFRkhSoIQ=="], - "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "sax": ["sax@1.6.1", "", {}, "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q=="], + + "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], "seroval": ["seroval@1.5.6", "", {}, "sha512-rVQVWjjSvlINzaQPZH5JFqsqEsIWdTxY3iJZCnTL/5gQbXIRooVZKI60tVCkOVfzcRPejboxO2t0P89dg5mQaA=="], @@ -304,46 +639,146 @@ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + "side-channel": ["side-channel@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4", "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ=="], + + "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], + + "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], + "solid-js": ["solid-js@1.9.14", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.4", "seroval-plugins": "~1.5.4" } }, "sha512-sAEXC0Kk0S1EDg+8ysEWJDbYhA3RRoEjwuySUGlKIemeo0I5YZfOyumNjNs9Sv3y2nmhD+0rW66ag2HsMuQiGQ=="], + "sql.js": ["sql.js@1.14.2", "", {}, "sha512-3ZGPovObMFrdw79zrUHbfdE/DLIsy8jdNdssmMSQuRAymedU6q84asPt0kgiqrdMYlPegDItiIMfmIXzZnYFcw=="], + "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + "tar-fs": ["tar-fs@2.1.5", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw=="], + + "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + + "tmp": ["tmp@0.2.7", "", {}, "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw=="], + "toml": ["toml@4.3.0", "", {}, "sha512-lVb8X9BsPVuH0M4BKeS91tXAmJvCjQ5UIyAbQFaxkKGyUFK2RPkhwaFSQH8vbpl1d23eu/IBH+dwVMHWaq9A5A=="], + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "tunnel": ["tunnel@0.0.6", "", {}, "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="], + + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + + "typed-rest-client": ["typed-rest-client@1.8.11", "", { "dependencies": { "qs": "^6.9.1", "tunnel": "0.0.6", "underscore": "^1.12.1" } }, "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA=="], + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + "uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="], + + "underscore": ["underscore@1.13.8", "", {}, "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ=="], + + "undici": ["undici@7.29.1", "", {}, "sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q=="], + + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + "url-join": ["url-join@4.0.1", "", {}, "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + "uuid": ["uuid@14.0.1", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew=="], "web-tree-sitter": ["web-tree-sitter@0.25.10", "", { "peerDependencies": { "@types/emscripten": "^1.40.0" }, "optionalPeers": ["@types/emscripten"] }, "sha512-Y09sF44/13XvgVKgO2cNDw5rGk6s26MgoZPXLESvMXeefBf7i6/73eFurre0IsTW6E14Y0ArIzhUMmjoc7xyzA=="], + "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="], + + "whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="], + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "wsl-utils": ["wsl-utils@0.1.0", "", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="], + + "xml2js": ["xml2js@0.5.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA=="], + + "xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], + + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], + "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], + + "yazl": ["yazl@2.5.1", "", { "dependencies": { "buffer-crc32": "~0.2.3" } }, "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw=="], + "zod": ["zod@4.1.8", "", {}, "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ=="], + "@azure/msal-node/@azure/msal-common": ["@azure/msal-common@16.13.0", "", {}, "sha512-rOAy0KUcyBbdwVJ+f3uPpthXatFLLZN+/KWAsTLzk1aB23Xl9DRmmXYwSvBFOZyXj4jUQQ5FKxxRkhAFW1fOow=="], + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "babel-plugin-jsx-dom-expressions/@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="], + "babel-plugin-module-resolver/glob": ["glob@9.3.5", "", { "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" } }, "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q=="], + + "bun-types/@types/node": ["@types/node@26.1.2", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg=="], + + "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "glob/minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], + + "markdown-it/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "ovsx/yauzl": ["yauzl@3.4.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw=="], + + "parse-semver/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + "parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], - "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "path-scurry/lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], + + "rc/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "babel-plugin-module-resolver/glob/minimatch": ["minimatch@8.0.7", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg=="], + + "babel-plugin-module-resolver/glob/minipass": ["minipass@4.2.8", "", {}, "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ=="], + + "babel-plugin-module-resolver/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "bun-types/@types/node/undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + + "glob/minimatch/brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], + + "babel-plugin-module-resolver/glob/minimatch/brace-expansion": ["brace-expansion@2.1.4", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg=="], + + "babel-plugin-module-resolver/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "babel-plugin-module-resolver/glob/path-scurry/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], - "path-scurry/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + "glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], } } diff --git a/bunfig.toml b/bunfig.toml index 0d8b3d7..08e479b 100644 --- a/bunfig.toml +++ b/bunfig.toml @@ -1,6 +1,3 @@ [jsx] runtime = "automatic" importSource = "@opentui/solid" - -[test] -preload = ["@opentui/solid/preload"] diff --git a/docs/cursor-extension-plan.md b/docs/cursor-extension-plan.md new file mode 100644 index 0000000..7bdb0d8 --- /dev/null +++ b/docs/cursor-extension-plan.md @@ -0,0 +1,976 @@ +# Plan de implementación: opencode-vpet como extensión Cursor/VS Code + +> Documento de planificación técnica — versión 1.0 +> Fecha: 2026-09-09 +> Alcance: extender opencode-vpet para publicar dos artefactos (npm + VSIX) desde un monorepo compartido. + +--- + +## 1. Resumen ejecutivo + +**opencode-vpet** es hoy un plugin dual de OpenCode (servidor + TUI) que evoluciona un Digimon virtual según el consumo de tokens de IA. La arquitectura hexagonal existente (~60–70 % reutilizable) permite extraer el núcleo de dominio y aplicación a un paquete compartido (`vpet-core`) y añadir un adaptador Cursor (`cursor-vpet`) sin duplicar lógica de evolución, persistencia ni view-models. + +El **riesgo crítico** es la obtención de tokens en Cursor: **no existe API oficial de extensión para eventos por mensaje**. OpenCode expone `message.updated` y `session.idle` con tokens fiables; Cursor obliga a estrategias no documentadas (lectura de `state.vscdb`, endpoints internos de `api2.cursor.sh` / `cursor.com`) con alta fragilidad y cobertura incompleta. + +**Recomendación:** adoptar un port `UsageEventSource` con estrategia en capas — (1) hooks Cursor `beforeSubmitPrompt` + `stop`, (2) **delta API watermark** al final de cada turno (snapshot al inicio, suma de eventos nuevos tras delay de 4–20 s), (3) reconciliación periódica — con idempotencia vía `receiptKey` ya presente en el dominio. Ver §5.12. + +**Entregables:** monorepo con tres paquetes, extensión VS Code publicable en Marketplace (compatible con Cursor), CI dual en PR/push, CD con semver unificado (npm + VSIX + GitHub Release). + +--- + +## 2. Estado actual del proyecto + +### 2.1 Arquitectura + +``` +packages/ +├── vpet-core/ +│ ├── domain/ # Evolución, etapas, partner, nodos Digimon +│ ├── application/ # Casos de uso, ports, modelos +│ │ ├── ports/ # UsageLedger, PartnerLifecycle, VpetControl, … +│ │ └── use-cases/ # recordUsage, reconcileUsage, spawn, freeze, … +│ ├── adapters/sqlite/ # Schema, migraciones, write-store (SqliteExecutor) +│ ├── data/ # Catálogo Digimon, sprites, frames +│ ├── config/ # Settings globales +│ └── view-models/ # sidebar, dex, history (sin JSX de host) +├── opencode-vpet/ +│ ├── src/adapters/opencode/ # Hooks servidor, mapeo de eventos, toasts +│ ├── src/adapters/sqlite/ # bun-sqlite-driver + factory delgada +│ ├── src/tui/ # OpenTUI + Solid: sidebar, dex, history +│ └── src/commands/ # /vpet-spawn, freeze, unfreeze, set +└── cursor-vpet/ + ├── src/adapters/cursor/ # UsageEventSource, auth, paths + ├── src/adapters/sqlite/ # sql.js driver + factory delgada + └── src/webview/ # UI embebida +``` + +**Patrón hexagonal:** `application/` no importa frameworks; `adapters/` implementan ports; tests `architecture-boundary` y `hexagonal-boundary` validan dirección de dependencias. + +### 2.2 Flujo de tokens (OpenCode) + +```mermaid +sequenceDiagram + participant OC as OpenCode SDK + participant Hooks as createServerHooks + participant Mapper as usage-event-mapper + participant UC as recordUsage / reconcileUsage + participant DB as SqliteVpetRepository + + OC->>Hooks: event message.updated + Hooks->>Mapper: toCompletedUsageFromEvent + Mapper->>UC: CompletedUsage (receiptKey, tokenDelta, …) + UC->>DB: applyUsageReceipt + + OC->>Hooks: event session.idle + Hooks->>OC: fetchMessages(sessionID) + Hooks->>Mapper: toCompletedUsageFromMessage (×N) + Hooks->>UC: reconcileUsage +``` + +Referencias clave: + +- `packages/opencode-vpet/src/adapters/opencode/create-server-hooks.ts` — suscripción a `message.updated` y `session.idle` +- `packages/opencode-vpet/src/adapters/opencode/usage-event-mapper.ts` — `tokenDelta` = input + output + reasoning + cache read/write +- `packages/vpet-core/src/application/use-cases/record-usage.ts` — idempotencia por `receiptKey` + +### 2.3 Build y runtime + +| Aspecto | Detalle | +|---------|---------| +| Package | `@sbugallo/opencode-vpet` (single package) | +| Build | `bun scripts/build.ts` — ESM, target `bun` (plugin) + `node` (CLI) | +| SQLite | `bun:sqlite` vía `SqliteExecutor` en `bun-sqlite-driver.ts` | +| UI | Solid + OpenTUI (`@opentui/solid`) — acoplada a OpenCode TUI | +| Tests | `bun test` — unitarios, persistencia, boundaries arquitectónicos | +| Datos | `~/Library/Application Support/opencode-vpet/pet.db` (macOS) | + +### 2.4 CI/CD actual + +**CI** (`.github/workflows/ci.yml`): en PR y push a `main` — format, lint, `bun run check`, tests, prepack, `npm pack --dry-run`. + +**CD** (`.github/workflows/cd.yml`): `workflow_dispatch` manual — bump semver estable, tag, publish npm con provenance, GitHub Release con tarball. + +No hay publicación VSIX ni jobs matriciales por paquete. + +--- + +## 3. Arquitectura propuesta + +### 3.1 Estructura monorepo + +``` +packages/ +├── vpet-core/ # Dominio + aplicación + data + view-models + SQLite compartido +│ ├── domain/ +│ ├── application/ +│ ├── adapters/sqlite/ # schema, migraciones, write-store (SqliteExecutor) +│ ├── data/ +│ ├── view-models/ # sidebar, dex, history (sin JSX de host) +│ └── package.json # @sbugallo/vpet-core +├── opencode-vpet/ # Plugin OpenCode (server + tui) +│ ├── src/adapters/opencode/ +│ ├── src/adapters/sqlite/ # bun-sqlite-driver + factory +│ ├── src/tui/ # OpenTUI wrappers +│ └── package.json # @sbugallo/opencode-vpet (mismo nombre público) +└── cursor-vpet/ # Extensión VS Code / Cursor + ├── src/ + │ ├── extension.ts + │ ├── adapters/cursor/ # UsageEventSource, auth, paths + │ ├── adapters/sqlite/ # node-sqlite-driver (sql.js) + │ └── webview/ # UI Solid/HTML embebida + ├── package.json # cursor-vpet o @sbugallo/cursor-vpet + └── .vscodeignore +``` + +**Workspace root:** `package.json` con `workspaces: ["packages/*"]`, scripts agregados (`bun run test --filter '*'`), Biome/TS config compartidos. + +### 3.2 Dependencias entre paquetes + +```mermaid +graph TD + Core[vpet-core] + OC[opencode-vpet] + CV[cursor-vpet] + + OC --> Core + CV --> Core + + OC --> BunSQLite[bun:sqlite] + OC --> OpenTUI[OpenTUI / Solid] + OC --> OpenCodeSDK[@opencode-ai/plugin] + + CV --> SqlJs[sql.js] + CV --> VSCodeAPI[vscode] + CV --> SolidWeb[Solid webview] +``` + +### 3.3 Principios de extracción + +1. Mover `domain/`, `application/`, `data/` y view-models puros (`sidebar-view-model`, `dex-view-model`, `history-view-model`) a `vpet-core`. +2. Mantener `SqliteExecutor` como interfaz en `vpet-core` (o `vpet-core/ports`); drivers en cada adaptador host. +3. `CompletedUsage` y `UsageLedger` permanecen en core; cada host implementa su `UsageEventSource`. +4. Config: tipos compartidos en core; loaders específicos por host (`global-vpet-settings` OpenCode vs `vscode.workspace.getConfiguration`). + +--- + +## 4. Mapa de equivalencias OpenCode ↔ Cursor + +| Concepto | OpenCode | Cursor / VS Code | +|----------|----------|------------------| +| Punto de entrada plugin | `@opencode-ai/plugin` (`server` + `tui`) | `package.json` `activationEvents`, `extension.ts` | +| Eventos de uso IA | `message.updated`, `session.idle` (SDK oficial) | **No oficial** — SQLite `bubbleId:*`, APIs dashboard | +| Sesión / conversación | `sessionID`, `message.id` | `composerId`, `bubbleId` | +| Identificador estable mensaje | `message:${message.id}` | `bubble:${composerId}:${bubbleId}` o `usage-event:${timestamp}:${hash}` | +| Tokens por mensaje | `message.tokens.*` (fiable) | `tokenCount` en bubble JSON (~4 % poblado) o API agregada | +| Reconciliación al idle | `session.idle` + `fetchMessages` | Poll API / scan incremental DB al detectar fin de stream | +| Notificaciones | `client.tui.showToast` | `vscode.window.showInformationMessage` / webview toast | +| Sidebar UI | OpenTUI `sidebar-card.tsx` | `WebviewView` + HTML/Solid | +| Comandos | `/vpet-spawn`, etc. | `contributes.commands` + palette | +| Persistencia VPET | `opencode-vpet/pet.db` | Mismo path o `cursor-vpet/pet.db` (configurable; recomendar compartir si coexisten) | +| SQLite driver | `bun:sqlite` | `sql.js` (lectura `state.vscdb`) + `better-sqlite3` opcional solo para `pet.db` escribible | +| Config usuario | OpenCode settings JSON | `contributes.configuration` | +| Instalación | `npx @sbugallo/opencode-vpet init` | Marketplace / `.vsix` | +| API Cursor específica | N/A | `vscode.cursor.mcp.*`, `vscode.cursor.plugins.addPlugin` (MCP/plugins, **no usage**) | + +```mermaid +flowchart LR + subgraph OpenCode + OCE[SDK Events] + OCH[createServerHooks] + OCM[usage-event-mapper] + end + + subgraph Cursor + CDB[state.vscdb watcher] + CAPI[api2.cursor.sh] + CMAP[cursor-usage-mapper] + end + + subgraph Shared + UES[UsageEventSource port] + RU[recordUsage] + DB[(pet.db)] + end + + OCE --> OCH --> OCM --> UES + CDB --> UES + CAPI --> UES + CMAP --> UES + UES --> RU --> DB +``` + +--- + +## 5. Análisis detallado: obtención de tokens en Cursor + +> **Esta sección es el área de mayor riesgo técnico y de producto.** Define la viabilidad del VPET en Cursor. + +### 5.1 APIs oficiales de extensión Cursor + +Según la [documentación de Extension API](https://cursor.com/docs/extension-api), el namespace `vscode.cursor` expone únicamente: + +| API | Propósito | +|-----|-----------| +| `vscode.cursor.mcp.registerServer` / `unregisterServer` | Registrar servidores MCP | +| `vscode.cursor.plugins.addPlugin` / `removePlugin` | Registrar carpetas de plugin (`.cursor-plugin/plugin.json`) | + +**No hay** métodos para: uso de tokens, eventos de chat, hooks de agente, ni métricas de billing. + +> Nota: la documentación histórica mencionaba `registerPath`; en la práctica la API real es `addPlugin({ path })` apuntando al directorio raíz de un plugin individual, no a un directorio padre. + +VS Code estándar ofrece `vscode.lm.*` y MCP server definitions, pero **no** expone consumo de tokens del proveedor Cursor. + +**Conclusión:** cualquier tracking de tokens en extensión es **reverse-engineering**, no contrato estable. + +### 5.2 Extensiones comunitarias (patrones observados) + +| Proyecto | Enfoque | Granularidad | Notas | +|----------|---------|--------------|-------| +| [Sammy970/cursor-usage-extension](https://github.com/Sammy970/cursor-usage-extension) | Token JWT de `state.vscdb` → `GET api2.cursor.sh/auth/usage` | Cuota mensual por modelo (requests) | Enterprise-style buckets | +| [ClearMeasureLabs/cursor-usage-status](https://marketplace.visualstudio.com/items?itemName=ClearMeasureLabs.cursor-usage-status) | Connect RPC `GetCurrentPeriodUsage` + `/auth/usage` | Spend del periodo / requests restantes | Multi-endpoint según plan | +| [kovaren/cursor-usage-pace](https://github.com/kovaren/cursor-usage-pace) | `cursor.com/api/usage-summary` + SQLite local | Porcentajes Auto/API del ciclo | API no documentada | +| [NaumanMoazzam/cursor-limits](https://github.com/NaumanMoazzam/cursor-limits) | sql.js + APIs dashboard | Cuotas Fast/Premium | Sin dependencia de CLI sqlite3 | +| [lixwen/cursor-usage-monitor](https://github.com/lixwen/cursor-usage-monitor) | sql.js para token; polling API | Límites y alertas | Migró de sqlite3 CLI a sql.js | +| [Dwtexe/cursor-stats](https://github.com/Dwtexe/cursor-stats) | SQLite + APIs | Estadísticas de uso | Referenciado por la comunidad | +| [tokentopapp/agent-cursor](https://github.com/tokentopapp/agent-cursor) | Parser `composerData` + `bubbleId`, fs.watch | Por burbuja asistente | Estimación cuando `tokenCount` es 0 | +| [chat-grabber](https://www.npmjs.com/package/chat-grabber) | better-sqlite3 scan global DB | Export chat; tokens ~96 % cero | Documenta fragilidad de `tokenCount` | + +**Patrón común:** leer `cursorAuth/accessToken` de `ItemTable` en `state.vscdb`, llamar APIs internas, mostrar en status bar. Ninguna replica fielmente el modelo event-driven de OpenCode. + +### 5.3 Almacenamiento interno de Cursor + +#### Ubicaciones + +| Plataforma | Ruta `state.vscdb` | +|------------|-------------------| +| macOS | `~/Library/Application Support/Cursor/User/globalStorage/state.vscdb` | +| Windows | `%APPDATA%\Cursor\User\globalStorage\state.vscdb` | +| Linux | `~/.config/Cursor/User/globalStorage/state.vscdb` | + +Archivos relacionados: `state.vscdb-wal`, `state.vscdb-shm` (modo WAL activo). La base puede crecer a **decenas de GB** en uso intensivo. + +#### Esquema relevante + +```sql +CREATE TABLE ItemTable (key TEXT UNIQUE ON CONFLICT REPLACE, value BLOB); +CREATE TABLE cursorDiskKV (key TEXT UNIQUE ON CONFLICT REPLACE, value BLOB); +``` + +#### Claves de autenticación (`ItemTable`) + +| Key | Contenido | +|-----|-----------| +| `cursorAuth/accessToken` | JWT Bearer (corto plazo) | +| `cursorAuth/refreshToken` | Refresh OAuth | +| `cursorAuth/cachedEmail` | Email | +| `cursorAuth/stripeMembershipType` | Plan (`pro`, `ultra`, …) | + +#### Claves de conversación (`cursorDiskKV`) + +| Patrón | Contenido | +|--------|-----------| +| `composerData:{composerId}` | Metadatos sesión, `fullConversationHeadersOnly`, modelo, timestamps | +| `bubbleId:{composerId}:{bubbleId}` | Mensaje individual: `text`, `type`, `tokenCount`, `toolFormerData`, `modelInfo` | +| `checkpointId:{composerId}:{id}` | Snapshots de workspace | +| `messageRequestContext:{composerId}:{messageId}` | Contexto de prompt | +| `agentKv:*` | Mensajes/metadata adicionales (familia menos documentada) | + +#### `tokenCount` en burbujas + +Estructura observada (cuando está poblada): + +```json +{ + "tokenCount": { + "inputTokens": 41263, + "outputTokens": 4901 + } +} +``` + +**Problemas documentados por la comunidad:** + +- Cursor rellena `tokenCount` de forma **asíncrona** vía polling interno (`getTokenUsage`); en agent mode a menudo no hay `usageUuid` → queda en `{0,0}`. +- [chat-grabber](https://www.npmjs.com/package/chat-grabber) reporta **~96 %** de burbujas asistente con tokens cero. +- [agent-cursor](https://github.com/tokentopapp/agent-cursor) estima `text.length / 4` como fallback de output. + +**Implicación para VPET:** la lectura local por burbuja es útil como señal temprana pero **insuficiente** como única fuente de verdad. + +### 5.4 Endpoints HTTP internos + +Base: `https://api2.cursor.sh` (Connect RPC v1, JSON). + +Documentación reverse-engineered: [openusage-opencode/docs/providers/cursor.md](https://github.com/Noisemaker111/openusage-opencode/blob/main/docs/providers/cursor.md). + +| Endpoint | Uso | Granularidad | +|----------|-----|--------------| +| `GET /auth/usage` | Cuota por modelo (`numRequests`, `maxRequestUsage`) | Agregado mensual | +| `POST /aiserver.v1.DashboardService/GetCurrentPeriodUsage` | Spend en centavos, % Auto/API | Periodo de facturación | +| `POST /aiserver.v1.DashboardService/GetPlanInfo` | Nombre plan, límite incluido | Metadatos | +| `cursor.com/api/usage-summary` | Resumen dashboard web | Agregado (no documentado) | +| `POST cursor.com/api/dashboard/get-filtered-usage-events` | Eventos paginados con `tokenUsage` | **Por llamada al modelo** (no por mensaje UI) | + +Headers típicos: `Authorization: Bearer `, `Connect-Protocol-Version: 1`, `Content-Type: application/json`. + +Refresh token: `POST /oauth/token` con `client_id` conocido (`KbZUR41cY7W6zRSdpSUJ7I7mLYBKOCmB`). + +#### APIs Enterprise (oficiales, no aplicables a usuario individual) + +- [Admin API](https://cursor.com/docs/account/teams/admin-api): `POST /teams/filtered-usage-events` con API key de equipo. +- [Analytics API](https://cursor.com/docs/account/teams/analytics-api): métricas agregadas por usuario, no eventos en tiempo real. + +Incluyen `tokenUsage` fiable pero requieren rol admin y agregación horaria — **no viable** como fuente principal para VPET consumer. + +#### Cambio de política de costes (julio 2026) + +Cursor eliminó campos de coste por solicitud (`chargedCents`, `usageBasedCosts`, `totalCents`) en planes self-service del endpoint de usage events. Los **tokens** siguen disponibles; el coste en dólares ya no es fiable para extensiones que dependían de esos campos. + +### 5.5 Enfoques evaluados + +#### Opción A — Solo API agregada (`/auth/usage`, `GetCurrentPeriodUsage`) + +| Pros | Contras | +|------|---------| +| Implementación simple | No hay eventos por mensaje → VPET no evoluciona por interacción | +| Datos alineados con dashboard | Solo sirve para UI de cuota, no para gameplay | +| Bajo riesgo de parseo SQLite | Requiere leer JWT de `state.vscdb` igualmente | + +**Veredicto:** complemento útil (status bar de cuota), **insuficiente** para mecánica de evolución. + +#### Opción B — Lectura incremental de `bubbleId:*` en `state.vscdb` + +| Pros | Contras | +|------|---------| +| Latencia baja vía `fs.watch` + queries indexadas | `tokenCount` ausente o cero en >90 % casos | +| Alineado con modelo mental de “mensaje completado” | DB enorme; WAL isolation en lectores | +| No requiere red tras lectura local | Esquema JSON cambia sin aviso | +| Comunidad probó el patrón (agent-cursor, tracedecay) | Subagentes pueden no reflejarse en una burbuja | + +**Veredicto:** **capa primaria** con deduplicación y reintentos hasta que `tokenCount` se pueble o timeout. + +#### Opción C — Polling `get-filtered-usage-events` + +| Pros | Contras | +|------|---------| +| Tokens por llamada al modelo (más fiable que bubble) | API no documentada; paginación; latencia minutos | +| Incluye cache read/write | No mapea 1:1 a burbuja UI; varios eventos por “turno” | +| Cookie/session alternativa: `WorkosCursorSessionToken` solo en browser | Requiere JWT local de todas formas para extensión | + +**Veredicto:** **capa de reconciliación** periódica (cada 5–15 min) para corregir subconteos. + +#### Opción D — FileSystemWatcher sin SQLite (solo detectar cambios) + +| Pros | Contras | +|------|---------| +| Mínimo acoplamiento al esquema | Igualmente necesita abrir SQLite para leer valores | +| Eficiente para “dirty flag” | Falsos positivos en WAL; debounce necesario | + +**Veredicto:** **mecanismo de señal**, no fuente de datos por sí solo. + +#### Opción E — Hooks oficiales de agente Cursor (`afterAgentResponse`, SDK) + +Según el foro de Cursor, hooks del SDK/agent reportan tokens del agente principal pero **no subagentes**; campos opcionales; no expuestos a extensiones VS Code estándar. + +**Veredicto:** no aplicable al packaging VSIX objetivo. + +#### Opción F — Admin API Enterprise + +**Veredicto:** fuera de alcance para extensión pública; mencionar en docs para equipos que quieran integración custom. + +### 5.6 sql.js vs better-sqlite3 + +| Criterio | sql.js | better-sqlite3 | +|----------|--------|----------------| +| Distribución en VSIX | WASM/JS puro, sin rebuild por Electron | Binario nativo — **NODE_MODULE_VERSION** debe coincidir con el host | +| Lectura `state.vscdb` grande | Carga archivo completo en memoria → riesgo OOM en DBs >2–5 GB | Lectura por archivo, queries indexadas eficientes | +| Modo WAL | No ve commits recientes del writer sin copiar WAL | Con conexión RW evita snapshot isolation (patrón agent-cursor) | +| Mantenimiento | Usado por cursor-limits, cursor-usage-monitor | Usado por chat-grabber; problemas reportados en Cursor agent worker (ABI 127 vs 137) | +| Recomendación VPET | **Lectura token + queries puntuales** (`key = ?`) | **Solo `pet.db` propio** si se necesita rendimiento de escritura (evaluar `sql.js` también para pet.db por simplicidad) | + +**Estrategia recomendada:** + +1. `state.vscdb`: sql.js con lectura de buffer + queries por clave; nunca `SELECT *` ni full scan. +2. Alternativa avanzada (fase 2): abrir URI `file:path?mode=ro&immutable=1` vía better-sqlite3 **solo si** se empaqueta prebuild para múltiples targets VS Code — alto coste de mantenimiento. +3. Evitar depender del binario `sqlite3` CLI (fragilidad Windows, sandbox). + +### 5.7 Fragilidad y compatibilidad de versiones + +| Riesgo | Probabilidad | Impacto | +|--------|--------------|---------| +| Cambio de esquema `bubbleId` JSON | Media | Parser falla; necesita actualización extensión | +| Renombre de keys `cursorAuth/*` | Baja | Auth rota; fallback a SecretStorage manual | +| Rotura endpoints Connect RPC | Media | Reconciliación API falla; modo degradado local | +| DB multi-GB | Alta en power users | OOM con sql.js; necesita path override y límites | +| Cursor vs VS Code puro | Media | Extensión funciona en VS Code pero sin `state.vscdb` de Cursor | +| Política Marketplace | Baja-Media | Lectura de tokens locales puede requerir disclosure claro | + +**Mitigaciones:** feature flags por fuente, versión de parser (`cursorStorageSchemaVersion`), telemetría **opt-in** de errores de parseo (sin tokens), tests con fixtures SQLite anonimizados. + +### 5.8 Privacidad y seguridad + +| Tema | Directriz | +|------|-----------| +| Access token | Leer solo `cursorAuth/accessToken`; **nunca** persistir en logs ni `globalState` sin cifrar | +| Alternativa | `vscode.SecretStorage` para token manual si auto-detección falla | +| Destinos red | Solo `api2.cursor.sh` / `cursor.com` — documentar en README y `package.json` | +| Permisos extensión | Evitar `readFile` amplio; rutas limitadas a globalStorage Cursor | +| Datos chat | VPET no necesita almacenar `text` de burbujas — solo IDs y conteos | +| Cumplimiento Marketplace | Sección “Privacy” explícita; no enviar datos a terceros | + +### 5.9 Recomendación concreta + +Implementar **`CursorUsageEventSource`** con tres capas, en orden de prioridad: + +```mermaid +flowchart TD + H[Cursor Hooks beforeSubmitPrompt + stop] + API[ApiWatermarkDelta] + REC[Reconciliación periódica] + OUT[CompletedUsage → recordUsage] + + H -->|"tokens en stop (rápido)"| OUT + H -->|"sin tokens / subagentes"| API + API -->|"delta por turno"| OUT + REC -->|"corregir huecos"| OUT +``` + +| Capa | Rol | Latencia | Cubre subagentes | +|------|-----|----------|------------------| +| **Hooks `stop`** | Fuente primaria cuando hay tokens en el payload | ~0 s | No (solo agente padre) | +| **API watermark delta** | Fuente secundaria por turno; suma todas las llamadas al modelo | 4–15 s | Sí | +| **Reconciliación periódica** | Corrige huecos si hooks o delta fallan | 10–60 min | Sí | + +La capa central es la **estrategia API watermark** (§5.12). Los hooks acortan la latencia y evitan polling cuando Cursor incluye tokens en `stop`; la API completa el turno cuando hay subagentes o tokens ausentes en el hook. + +### 5.12 Estrategia API watermark (delta por turno) + +> Propuesta validada: snapshot al inicio del turno, delta al final con delay para que Cursor persista los eventos. + +#### Idea + +Cada **turno de agente** (usuario envía prompt → agente termina) se trata como una ventana temporal sobre el listado de `get-filtered-usage-events`: + +1. **Inicio de ejecución** (`beforeSubmitPrompt` o equivalente): consultar la API y guardar un **watermark** — la última fila con tokens válidos. +2. **Fin de ejecución** (`stop`): esperar un delay (4 s inicial), consultar el listado desde el watermark, **sumar tokens de todas las filas nuevas** y emitir un único `CompletedUsage` por turno. + +Esto alinea la granularidad con OpenCode (un receipt por interacción completada) mientras captura **todas las llamadas al modelo** del turno (incluidos subagentes), que el hook `stop` no incluye. + +#### Detección de inicio y fin + +| Señal | Fuente | Fiabilidad | +|-------|--------|------------| +| Inicio | Hook `beforeSubmitPrompt` | Alta (oficial) | +| Fin | Hook `stop` con `status: completed` | Alta (oficial) | +| Fin (fallback) | Cambio en `composerData` / última burbuja asistente en `state.vscdb` | Media | +| Fin (fallback) | `FileSystemWatcher` en `state.vscdb-wal` tras periodo de inactividad | Baja | + +**Recomendación:** la extensión instala un hook global en `~/.cursor/hooks.json` (comando bundled en el VSIX) que escribe eventos en un archivo bajo `globalStorageUri` (`vpet-hook-events.jsonl`). La extensión observa ese archivo con `FileSystemWatcher`. Esto evita parsear `state.vscdb` solo para detectar ciclo de vida. + +El hook `stop` también puede incluir (no documentado aún en cursor.com/docs/hooks, pero presente en runtime): + +```json +{ + "hook_event_name": "stop", + "conversation_id": "a1b2c3d4-...", + "generation_id": "f0e1d2c3-...", + "input_tokens": 1180993, + "output_tokens": 8146, + "cache_read_tokens": 1007022, + "cache_write_tokens": 173957 +} +``` + +> `input_tokens` **incluye** cache read/write. Para alinear con OpenCode: +> `tokenDelta = input_tokens + output_tokens` (no sumar cache por separado). + +Si `stop` trae tokens y `vpet.usage.subagentTracking` es `false`, usar el hook directamente y **saltar** el delta API. Si es `true` (default), siempre ejecutar delta API al final del turno. + +#### Algoritmo watermark + +```typescript +type UsageWatermark = { + readonly timestampMs: number // timestamp del último evento visto + readonly fingerprint: string // hash estable del último evento (anti-colisión) + readonly conversationId?: string +} + +// Al inicio del turno (beforeSubmitPrompt) +async function captureWatermark(auth: CursorAuth): Promise { + const events = await fetchUsageEvents({ page: 1, pageSize: 1 }) // más reciente primero + const latest = events.find(hasValidTokens) + return { + timestampMs: Number(latest?.timestamp ?? Date.now()), + fingerprint: fingerprintEvent(latest), + conversationId: prompt.conversation_id, + } +} + +// Al fin del turno (stop) +async function settleTurnDelta( + watermark: UsageWatermark, + generationId: string, +): Promise { + const newEvents = await pollNewEventsSince(watermark, { + initialDelayMs: 4000, + retries: [4000, 6000, 10000], // hasta ~20 s total + minNewEvents: 1, + }) + + if (newEvents.length === 0) return null + + const tokenDelta = sumTokenDelta(newEvents) + return { + receiptKey: `cursor-turn:${generationId}`, + eventId: `cursor-api-delta:${generationId}`, + tokenDelta, + cost: null, + createdAt: new Date().toISOString(), + } +} +``` + +#### Consulta API al fin del turno + +```http +POST https://cursor.com/api/dashboard/get-filtered-usage-events +Authorization: Bearer +Origin: https://cursor.com +Content-Type: application/json + +{ + "startDate": "", + "endDate": "", + "page": 1, + "pageSize": 100 +} +``` + +Paginar mientras `page * pageSize < totalUsageEventsCount` y `hasNextPage` (Admin API) o hasta que no haya más filas. + +**Filtrado client-side:** + +```typescript +function isNewEvent(event: UsageEvent, watermark: UsageWatermark): boolean { + const ts = Number(event.timestamp) + if (ts < watermark.timestampMs) return false + if (ts === watermark.timestampMs && fingerprintEvent(event) === watermark.fingerprint) return false + return hasValidTokens(event) +} + +function hasValidTokens(event: UsageEvent): boolean { + if (!event.isTokenBasedCall || !event.tokenUsage) return false + const { inputTokens, outputTokens, cacheWriteTokens = 0, cacheReadTokens = 0 } = event.tokenUsage + return inputTokens + outputTokens + cacheWriteTokens + cacheReadTokens > 0 +} + +function sumTokenDelta(events: UsageEvent[]): number { + return events.reduce((sum, e) => { + const t = e.tokenUsage! + return sum + t.inputTokens + t.outputTokens + (t.cacheWriteTokens ?? 0) + (t.cacheReadTokens ?? 0) + }, 0) +} + +function fingerprintEvent(event: UsageEvent | undefined): string { + if (!event) return "none" + const t = event.tokenUsage + return `${event.timestamp}:${event.model}:${t?.inputTokens ?? 0}:${t?.outputTokens ?? 0}` +} +``` + +#### Delay y reintentos + +| Intento | Espera acumulada | Motivo | +|---------|------------------|--------| +| 1 | 4 s | Tiempo mínimo para que Cursor persista eventos (propuesta inicial) | +| 2 | +6 s (10 s total) | Agregación horaria puede tardar varios segundos | +| 3 | +10 s (20 s total) | Turnos con muchas tool calls / subagentes | +| Timeout | — | Emitir con tokens del hook `stop` si existen; si no, encolar reconciliación | + +No usar un único delay fijo: **poll hasta que aparezca ≥1 evento nuevo** o se agoten reintentos. + +#### Idempotencia y anti-doble-conteo + +| Riesgo | Mitigación | +|--------|------------| +| Mismo turno procesado dos veces | `receiptKey: cursor-turn:${generation_id}` (único por turno) | +| Evento en el límite del watermark | `fingerprint` del último evento + comparación `>` estricta en timestamp | +| Hook `stop` + delta API cuentan lo mismo | Si hook usado como primario, delta solo suma eventos **post-watermark**; el watermark se captura **antes** del turno | +| Turnos concurrentes en distintas conversaciones | Watermark **por `conversation_id`**, no global | +| Eventos sin ID estable | `fingerprint` = `timestamp:model:input:output`; dedup en `recordUsage` por `receiptKey` | + +#### Flujo completo (secuencia) + +```mermaid +sequenceDiagram + participant User + participant Hook as ~/.cursor/hooks + participant Ext as cursor-vpet ext + participant API as get-filtered-usage-events + participant DB as pet.db + + User->>Hook: beforeSubmitPrompt + Hook->>Ext: evento inicio + conversation_id + Ext->>API: GET último evento con tokens + API-->>Ext: watermark W + + User->>Hook: (agente trabaja…) + User->>Hook: stop (generation_id, tokens opcionales) + Hook->>Ext: evento fin + + Note over Ext: delay 4s + poll + Ext->>API: eventos desde W.timestamp + API-->>Ext: [e1, e2, e3] (subagentes incluidos) + Ext->>Ext: sum(tokenDelta) + Ext->>DB: recordUsage(receiptKey=cursor-turn:gen_id) +``` + +#### Integración con hooks (instalación) + +Al activar la extensión, registrar en `~/.cursor/hooks.json`: + +```json +{ + "version": 1, + "hooks": { + "beforeSubmitPrompt": [{ "command": "node /dist/hook-bridge.js", "args": ["beforeSubmitPrompt"] }], + "stop": [{ "command": "node /dist/hook-bridge.js", "args": ["stop"] }] + } +} +``` + +`hook-bridge.js` lee JSON por stdin, append a `globalStorageUri/vpet/hook-events.jsonl`, responde `{}` por stdout (fail-open). + +#### Configuración VS Code + +```json +{ + "vpet.usage.settleDelayMs": 4000, + "vpet.usage.settleMaxWaitMs": 20000, + "vpet.usage.subagentTracking": true, + "vpet.usage.preferHookTokens": false +} +``` + +- `subagentTracking: true` → siempre delta API al `stop` (recomendado para VPET). +- `preferHookTokens: true` → usar solo `stop` si trae tokens (más rápido, sin subagentes). + +#### Limitaciones conocidas + +| Limitación | Impacto | Mitigación | +|------------|---------|------------| +| API no documentada | Puede romperse | Contract tests + flag para desactivar capa API | +| Latencia 4–20 s por turno | XP no es instantáneo | Toast/notificación al aplicar; animación sidebar en pending | +| Cmd+K inline sin hooks Agent | Turnos Tab no disparan `stop` | Excluir o tratar Tab por separado (`beforeTabFileRead` no aporta tokens) | +| Cloud agents sin hooks de usuario | Sin watermark local | Reconciliación periódica solo | +| `input_tokens` del hook incluye cache | Conteo inflado vs OpenCode | Usar misma fórmula en ambos lados; documentar | + +### 5.9 (legacy) Capas auxiliares + +1. **Reconciliación periódica:** cada 10–60 min, `get-filtered-usage-events` desde último `receiptKey` API conocido; emite eventos huérfanos con `receiptKey: usage-event:${fingerprint}`. +2. **Parser de burbujas (opcional):** solo si hooks no están instalados; ver §5.5 opción B. Menor prioridad que watermark API. +3. **Delta vs absoluto:** nunca diferenciar cuotas agregadas (`/auth/usage`); solo deltas por evento o por turno. + +### 5.10 Diseño del port `UsageEventSource` + +```typescript +// packages/vpet-core/src/application/ports/usage-event-source.ts + +export type UsageObservation = { + readonly receiptKey: string + readonly eventId: string + readonly tokenDelta: number + readonly cost?: number | null + readonly createdAt: string + readonly source: "bubble" | "api" | "estimate" + readonly confidence: "high" | "medium" | "low" +} + +export type UsageEventSource = { + /** Suscribe callbacks; retorna dispose */ + subscribe(handler: (usage: UsageObservation) => void): { dispose(): void } + /** Fuerza reconciliación (comando manual / al activar extensión) */ + reconcile(): Promise +} +``` + +Adaptadores: + +| Paquete | Implementación | +|---------|----------------| +| `opencode-vpet` | `OpenCodeUsageEventSource` — envuelve hooks existentes | +| `cursor-vpet` | `CursorUsageEventSource` — hooks + API watermark delta + reconciliación | + +El caso de uso `recordUsage` acepta `CompletedUsage` (subset sin `source`/`confidence`); el adaptador Cursor puede filtrar observaciones `confidence: "low"` según setting `vpet.acceptEstimatedTokens`. + +### 5.11 Estrategia de tests + +| Nivel | Qué probar | +|-------|------------| +| Unit | Parsers JSON de bubble con fixtures grabados (versiones Cursor N, N-1) | +| Unit | Mapeo `tokenCount` → `tokenDelta` alineado con OpenCode (incl. cache) | +| Unit | Generación `receiptKey` estable | +| Integration | DB SQLite sintética en tmp con `ItemTable` + `cursorDiskKV` | +| Integration | Mock HTTP Connect RPC con respuestas grabadas | +| Contract | Golden files de `get-filtered-usage-events` (actualizar en CI weekly cron opcional) | +| E2E manual | Matriz: Pro, Ultra, Agent mode, Composer, subagente | +| Regression | Cuando Cursor actualiza, issue template para adjuntar bubble anonimizado | + +Fixtures: repositorio `packages/cursor-vpet/fixtures/state-vscdb-samples/` con bases mínimas (<1 MB), nunca tokens reales. + +--- + +## 6. Persistencia + +### 6.1 Abstracción `SqliteExecutor` + +Mantener la interfaz actual (`run`, `get`, `all`, `transaction`) en `vpet-core`. Implementaciones: + +| Driver | Host | Archivo | +|--------|------|---------| +| `createBunSqliteExecutor` | OpenCode | `packages/opencode-vpet/src/adapters/sqlite/bun-sqlite-driver.ts` | +| `createNodeSqliteExecutor` | Cursor | `packages/cursor-vpet/adapters/sqlite/node-sqlite-driver.ts` | + +**Cursor `pet.db`:** sql.js con persistencia write-via-export (exportar buffer tras transacciones) en `packages/cursor-vpet/src/adapters/sqlite/`. + +### 6.2 Rutas de datos + +| Archivo | Propósito | Ruta propuesta | +|---------|-----------|----------------| +| `pet.db` | Estado VPET (partner, gauge, receipts) | `{appData}/opencode-vpet/pet.db` (mantener compatibilidad) o `{appData}/cursor-vpet/pet.db` | +| `state.vscdb` | Solo lectura Cursor | Auto-detect + setting `cursorVpet.stateDbPath` | + +`resolveHostDatabasePath` se generaliza en core con parámetro `appDirectoryName`. + +### 6.3 Compartir progreso OpenCode + Cursor + +Si un usuario usa ambos hosts, opciones: + +1. **Misma ruta por defecto** (`opencode-vpet/pet.db`) — experiencia unificada. +2. Setting explícito `vpet.databasePath` en ambos hosts. + +Recomendación: **opción 1** documentada; tests de path resolution cross-platform. + +### 6.4 Migraciones + +Reutilizar `sqlite-migrations.ts` sin cambios de esquema inicial. El ledger de receipts absorbe nuevas fuentes sin migración. + +--- + +## 7. UI en Cursor + +### 7.1 Contenedor: `WebviewView` + +Registrar en `package.json`: + +```json +{ + "contributes": { + "views": { + "explorer": [ + { + "id": "cursorVpet.sidebar", + "name": "VPet", + "type": "webview" + } + ] + } + } +} +``` + +### 7.2 Reutilización de view-models + +| Componente OpenCode | En Cursor | +|--------------------|-----------| +| `buildSidebarCardModel` | Webview recibe JSON del modelo; renderiza HTML | +| `dex-view-model` | Panel modal vía `createWebviewPanel` | +| `history-view-model` | Misma API de datos, distinto shell | +| Sprites / `monster-frame-catalog` | Copiar assets a `media/`; servir vía `webview.asWebviewUri` | + +### 7.3 Stack UI recomendado + +- **Fase 1:** HTML + CSS vanilla + imágenes pixel art (menor bundle). +- **Fase 2:** SolidJS embebido en webview (misma librería que TUI) si la complejidad de animación lo justifica. + +Animaciones: portar lógica de `monster-animation.ts` (máquina de estados pura en core); rendering en canvas o CSS steps. + +### 7.4 Comandos y UX + +| Comando OpenCode | Comando VS Code | +|------------------|-----------------| +| `/vpet-spawn` | `Cursor VPet: Spawn Partner` | +| `/vpet-freeze` | `Cursor VPet: Freeze` | +| `/vpet-unfreeze` | `Cursor VPet: Unfreeze` | +| `/vpet-set` | Input box para Digimon ID | +| `/vpet-dex` | Abrir Dex webview | +| `/vpet-history` | Abrir History webview | + +Toasts de evolución: `showInformationMessage` con botón “View” → foco en sidebar. + +### 7.5 Polling de sidebar + +OpenCode usa `sidebar-poll-loop.ts`. En Cursor: push desde extensión al webview tras cada `recordUsage` + poll ligero cada 30 s como fallback. + +--- + +## 8. CI/CD dual + +### 8.1 CI (PR y push a `main`) + +```yaml +jobs: + vpet-core: + steps: [checkout, setup bun, install, test --filter vpet-core] + opencode-vpet: + needs: vpet-core + steps: [..., bun run check, bun test, npm pack --dry-run] + cursor-vpet: + needs: vpet-core + steps: + - npm install -g @vscode/vsce + - bun run build --filter cursor-vpet + - xvfb-run vsce package --no-dependencies # headless + - bun test --filter cursor-vpet +``` + +Matriz opcional: `ubuntu-latest`, `macos-latest`, `windows-latest` solo para `cursor-vpet` (paths SQLite). + +### 8.2 CD (release unificado) + +Flujo propuesto (extender `cd.yml` o workflow paralelo): + +```mermaid +flowchart LR + A[workflow_dispatch bump] --> B[version bump monorepo] + B --> C[tests + build all] + C --> D[npm publish opencode-vpet] + C --> E[vsce publish cursor-vpet] + C --> F[GitHub Release assets] + F --> G[.tgz npm] + F --> H[.vsix] +``` + +| Artefacto | Target | Secreto | +|-----------|--------|---------| +| npm | `registry.npmjs.org` | `NPM_TOKEN` (OIDC provenance ya configurado) | +| VSIX | VS Code Marketplace | `VSCE_PAT` (Azure DevOps PAT con Marketplace publish) | +| Open VSX (opcional) | open-vsx.org | `OVSX_PAT` | + +**Semver:** una versión en root o changelogs sincronizados; `opencode-vpet` y `cursor-vpet` comparten número (ej. `0.3.0`). + +### 8.3 Pre-release / canales + +- npm: tag `next` para `0.x-dev.0` (ya usado). +- VSIX: `vsce publish --pre-release` con `cursor-vpet@0.3.0-dev.0`. + +### 8.4 Quality gates antes de publish + +1. `bun run check` en todos los paquetes. +2. Tests persistencia SQLite. +3. `vsce ls` sin secretos. +4. Escaneo `state.vscdb` paths hardcodeados — solo en runtime resolve. + +--- + +## 9. Plan de implementación por fases + +| Fase | Entregable | Estimación | +|------|------------|------------| +| **0 — Spike tokens** | Prototipo `CursorHybridUsageEventSource` fuera de monorepo; matriz de cobertura tokenCount; decisión sql.js write | 3–5 días | +| **1 — Monorepo** | Extraer `vpet-core`, migrar `opencode-vpet`, CI verde, npm sin cambios de comportamiento | 4–6 días | +| **2 — Extension shell** | `cursor-vpet` activación, comandos, `pet.db` con sql.js, sidebar estático | 5–7 días | +| **3 — Usage pipeline** | Port `UsageEventSource`, watcher, parser bubbles, integración `recordUsage` | 7–10 días | +| **4 — API reconcile** | Cliente Connect RPC, polling, deduplicación cross-source | 4–5 días | +| **5 — UI completa** | Webview animado, dex, history, settings | 7–10 días | +| **6 — Hardening** | Fixtures, docs privacidad, degradación graceful, matrices OS | 4–6 días | +| **7 — CD dual** | vsce publish, Release con VSIX, documentación usuario | 2–3 días | + +**Total estimado:** 36–52 días-persona (1 dev ≈ 7–10 semanas). + +### Hitos de aceptación + +- [ ] Misma evolución de partner con tokens reales en Agent mode (>80 % de turnos con delta > 0). +- [ ] Sin doble conteo entre bubble y API (receipts únicos). +- [ ] OpenCode sin regresiones; tests boundary verdes. +- [ ] VSIX instalable en Cursor 1.x y VS Code 1.9x. +- [ ] README bilingüe (es/en) con limitaciones de tokens. + +--- + +## 10. Qué NO hacer + +1. **No** depender solo de cuota agregada (`/auth/usage`) para evolución del pet. +2. **No** escanear completa `cursorDiskKV` ni cargar `state.vscdb` entero en memoria sin límite. +3. **No** empaquetar `better-sqlite3` para leer `state.vscdb` sin matriz de prebuilds Electron. +4. **No** almacenar refresh tokens ni access tokens en `globalState` sin cifrar. +5. **No** enviar contenido de chat a servidores externos. +6. **No** asumir paridad 1:1 OpenCode ↔ Cursor en tiempo real — comunicar latencia y estimaciones al usuario. +7. **No** duplicar lógica de evolución en el adaptador Cursor. +8. **No** usar APIs Enterprise como requisito para usuarios individuales. +9. **No** bloquear publicación en VS Code “puro” — degradar con mensaje “requiere Cursor” solo para fuentes de tokens. +10. **No** romper el paquete npm existente durante la migración a monorepo (mantener nombre y exports). + +--- + +## 11. Riesgos y mitigaciones + +| ID | Riesgo | Severidad | Mitigación | +|----|--------|-----------|------------| +| R1 | `tokenCount` vacío en mayoría de mensajes | **Alta** | Reintentos, API reconcile, setting estimación opt-in | +| R2 | Cambio de esquema SQLite/JSON por Cursor | **Alta** | Parser versionado, tests fixtures, release rápido | +| R3 | DB `state.vscdb` >5 GB → OOM con sql.js | **Media** | Queries por clave; setting path; documentar límites | +| R4 | Endpoints dashboard rotos | **Media** | Modo offline local; mensaje UI; feature flag API | +| R5 | Rechazo o flags Marketplace por lectura de auth | **Media** | Disclosure transparente; SecretStorage alternativo | +| R6 | Divergencia progreso OpenCode/Cursor | **Baja** | Misma `pet.db` por defecto | +| R7 | Complejidad monorepo | **Media** | Fase 1 dedicada; tooling Bun workspaces | +| R8 | Animación webview inferior a TUI | **Baja** | MVP estático; iterar en fase 5 | +| R9 | Usuario en VS Code sin Cursor | **Baja** | Extensión instalable pero usage deshabilitado | +| R10 | Subagentes no reflejados en bubbles | **Media** | API reconcile agrega tokens por `conversationId` cuando exista en eventos | + +--- + +## Apéndice A — Referencias + +- [Cursor Extension API](https://cursor.com/docs/extension-api) +- [Cursor Admin API](https://cursor.com/docs/account/teams/admin-api) +- [openusage-opencode — provider Cursor](https://github.com/Noisemaker111/openusage-opencode/blob/main/docs/providers/cursor.md) +- [cursaves — how Cursor stores chats](https://github.com/Callum-Ward/cursaves/blob/main/docs/how-cursor-stores-chats.md) +- [cursor-usage-pace README](https://github.com/kovaren/cursor-usage-pace) +- [vibe-replay — Cursor local storage](https://vibe-replay.com/blog/cursor-local-storage/) +- Código actual: `packages/opencode-vpet/src/adapters/opencode/create-server-hooks.ts`, `packages/opencode-vpet/src/adapters/sqlite/bun-sqlite-driver.ts`, `packages/vpet-core/src/view-models/sidebar-view-model.ts` + +--- + +## Apéndice B — Ejemplo de mapeo bubble → CompletedUsage + +```typescript +const toCompletedUsageFromBubble = ( + composerId: string, + bubbleId: string, + bubble: CursorBubbleJson, +): CompletedUsage | null => { + if (bubble.type !== 2) return null // solo asistente + const tokens = bubble.tokenCount + if (!tokens) return null + + const tokenDelta = + (tokens.inputTokens ?? 0) + + (tokens.outputTokens ?? 0) + + (tokens.cacheReadTokens ?? 0) + + (tokens.cacheWriteTokens ?? 0) + + if (tokenDelta <= 0) return null + + return { + receiptKey: `bubble:${composerId}:${bubbleId}`, + eventId: `cursor-bubble:${composerId}:${bubbleId}`, + tokenDelta, + cost: null, + createdAt: bubble.createdAt ?? new Date().toISOString(), + } +} +``` + +--- + +*Fin del documento.* diff --git a/docs/monorepo.md b/docs/monorepo.md new file mode 100644 index 0000000..d50620c --- /dev/null +++ b/docs/monorepo.md @@ -0,0 +1,60 @@ +# Monorepo structure + +El root (`@sbugallo/opencode-vpet-workspace`) **no se publica en npm** — solo orquesta workspaces. + +``` +packages/ +├── vpet-core/ # @sbugallo/vpet-core (privado, compartido) +│ └── src/adapters/sqlite/ # schema, migraciones, write-store (SqliteExecutor) +├── opencode-vpet/ # @sbugallo/opencode-vpet (publicable en npm) +│ └── src/adapters/sqlite/ # bun-sqlite-driver + factory +└── cursor-vpet/ # extensión Cursor (.vsix) + └── src/adapters/sqlite/ # sql.js driver + factory +``` + +## Toolchain (Node + Bun) + +| Herramienta | Versión fijada | Uso | +|-------------|----------------|-----| +| **Bun** `1.3.5` | `packageManager`, `engines`, Volta | install, test, build, runtime del plugin OpenCode | +| **Node** `24.11.0` | `engines`, Volta, CI | CLI publicada (`opencode-vpet`), npm publish, VSIX, host de la extensión | + +Volta en el root fija ambas versiones al trabajar en el repo: + +```bash +volta install node@24.11.0 bun@1.3.5 +``` + +Sin Volta, instala manualmente esas versiones antes de `bun install`. + +## Commands (from repo root) + +```bash +bun install +bun run check +bun run test +bun run test:persistence +bun run build +bun run --filter '@sbugallo/opencode-vpet' prepack +bun run --filter cursor-vpet package # produces .vsix +``` + +## Publicación npm + +`@sbugallo/opencode-vpet` empaqueta el JS de `vpet-core` en `dist/` y copia sus declaraciones a `dist/vpet-core/`, de modo que los `.d.ts` publicados no dependen del paquete privado del workspace. + +## Cursor extension install (dev) + +```bash +cd packages/cursor-vpet +bun run build +bun run package +# In Cursor: Extensions → Install from VSIX +``` + +## Open VSX / Marketplace (CD) + +On release, if configured in GitHub Actions secrets: + +- `OVSX_PAT` — publishes to [Open VSX](https://open-vsx.org/extension/sbugallo/cursor-vpet) +- `VSCE_PAT` — publishes to VS Code Marketplace (optional) diff --git a/package.json b/package.json index 1d0e87b..37d33e5 100644 --- a/package.json +++ b/package.json @@ -1,99 +1,38 @@ { - "name": "@sbugallo/opencode-vpet", - "version": "0.2.0-dev.0", - "description": "An OpenCode virtual-pet plugin with /vpet-spawn, /vpet-freeze, /vpet-unfreeze, /vpet-set, /vpet-dex, and /vpet-history commands.", + "name": "@sbugallo/opencode-vpet-workspace", "author": "Sergio Bugallo", "license": "Apache-2.0", - "repository": { - "type": "git", - "url": "git+https://github.com/sbugallo/opencode-vpet.git" - }, - "homepage": "https://github.com/sbugallo/opencode-vpet#readme", - "bugs": { - "url": "https://github.com/sbugallo/opencode-vpet/issues" - }, - "keywords": [ - "opencode", - "plugin", - "virtual-pet", - "vpet", - "tui" - ], - "publishConfig": { - "access": "public" - }, - "oc-plugin": [ - "server", - "tui" - ], "packageManager": "bun@1.3.5", - "engines": { - "bun": ">=1.3.5", - "node": ">=20", - "opencode": ">=1.18.10" - }, - "main": "./dist/index.js", - "bin": { - "opencode-vpet": "./dist/cli.js" - }, - "dependencies": { - "solid-js": "^1.9.14" - }, - "devDependencies": { - "@biomejs/biome": "2.5.10", - "@opencode-ai/plugin": "^1.18.10", - "@opencode-ai/sdk": "^1.18.10", - "@opentui/core": "^0.4.5", - "@opentui/keymap": "^0.4.5", - "@opentui/solid": "^0.4.5", - "@types/bun": "latest", - "@types/semver": "^7.7.1", - "semver": "^7.7.4", - "typescript": "^5.9.3" - }, - "peerDependencies": { - "@opencode-ai/plugin": ">=1.18.10", - "@opentui/core": ">=0.4.5", - "@opentui/keymap": ">=0.4.5", - "@opentui/solid": ">=0.4.5" - }, - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "default": "./dist/index.js" - }, - "./server": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "default": "./dist/index.js" - }, - "./tui": { - "types": "./dist/tui.d.ts", - "import": "./dist/tui.js", - "default": "./dist/tui.js" - } - }, - "files": [ - "dist", - "README.md", - "LICENSE" + "workspaces": [ + "packages/*" ], "scripts": { - "test": "bun test", - "test:persistence": "bun test ./tests/persistence/sqlite-migrations.persistence.ts ./tests/persistence/sqlite-vpet-repository.persistence.ts", - "format": "biome format --write src tests scripts package.json biome.json tsconfig*.json", - "format:check": "biome format src tests scripts package.json biome.json tsconfig*.json", - "lint": "biome lint src tests scripts package.json biome.json tsconfig*.json", - "lint:fix": "biome lint --write src tests scripts package.json biome.json tsconfig*.json", - "check": "biome ci src tests scripts package.json biome.json tsconfig*.json && bun run typecheck && bun run typecheck:tests && bun run typecheck:release-metadata", - "typecheck": "tsc --noEmit", - "typecheck:tests": "tsc -p tsconfig.test.json --noEmit", - "typecheck:release-metadata": "tsc -p tsconfig.release-metadata.json --noEmit", - "build": "bun scripts/build.ts", - "prepack": "bun scripts/prepack.ts", - "release:check": "bun run check && bun test && bun run prepack && npm pack --dry-run --json" + "test": "bun run --filter '@sbugallo/opencode-vpet' test && bun run --filter 'cursor-vpet' test", + "test:persistence": "bun run --filter '@sbugallo/opencode-vpet' test:persistence", + "format": "biome format --write packages scripts package.json biome.json tsconfig*.json", + "format:check": "biome format packages scripts package.json biome.json tsconfig*.json", + "lint": "biome lint packages scripts package.json biome.json tsconfig*.json", + "check": "biome ci packages scripts package.json biome.json tsconfig*.json && bun run typecheck:release-metadata && bun run --filter '@sbugallo/vpet-core' typecheck && bun run --filter '@sbugallo/opencode-vpet' check && bun run --filter 'cursor-vpet' check", + "build": "bun run --filter '@sbugallo/opencode-vpet' build && bun run --filter 'cursor-vpet' build", + "prepack": "bun run --filter '@sbugallo/opencode-vpet' prepack", + "release:check": "bun run --filter '@sbugallo/opencode-vpet' release:check", + "release-metadata": "bun scripts/release-metadata.ts", + "typecheck:release-metadata": "tsc -p tsconfig.release-metadata.json --noEmit" }, - "type": "module", - "types": "./dist/index.d.ts" + "devDependencies": { + "@biomejs/biome": "2.5.10", + "@types/bun": "1.3.14", + "@types/node": "24.10.1", + "@types/semver": "7.7.1", + "semver": "7.7.4", + "typescript": "5.9.3" + }, + "engines": { + "node": "24.11.0", + "bun": "1.3.5" + }, + "volta": { + "node": "24.11.0", + "bun": "1.3.5" + } } diff --git a/packages/cursor-vpet/.vscodeignore b/packages/cursor-vpet/.vscodeignore new file mode 100644 index 0000000..9f6e4ce --- /dev/null +++ b/packages/cursor-vpet/.vscodeignore @@ -0,0 +1,9 @@ +** +!package.json +!README.md +!LICENSE +!CHANGELOG.md +!icon.png +!hook-bridge.js +!dist/extension.js +!dist/sql-wasm.wasm diff --git a/packages/cursor-vpet/CHANGELOG.md b/packages/cursor-vpet/CHANGELOG.md new file mode 100644 index 0000000..43d9585 --- /dev/null +++ b/packages/cursor-vpet/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +Extension releases follow the monorepo changelog: +[CHANGELOG.md](https://github.com/sbugallo/opencode-vpet/blob/main/CHANGELOG.md) + +## [Unreleased] + +### Added + +- Cursor/VS Code extension with sidebar, Dex, History, and Agent usage tracking. diff --git a/packages/cursor-vpet/LICENSE b/packages/cursor-vpet/LICENSE new file mode 100644 index 0000000..3d6428f --- /dev/null +++ b/packages/cursor-vpet/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or Object + form, made available under the License, as indicated by a copyright + notice that is included in or attached to the work (an example is + provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2026 Sergio Bugallo Enjamio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/cursor-vpet/README.md b/packages/cursor-vpet/README.md new file mode 100644 index 0000000..58fa6aa --- /dev/null +++ b/packages/cursor-vpet/README.md @@ -0,0 +1,42 @@ +# Cursor VPet + +Digimon virtual pet for **Cursor** that evolves as you use Agent. Shares progress with +[@sbugallo/opencode-vpet](https://www.npmjs.com/package/@sbugallo/opencode-vpet) via the same `pet.db`. + +## Features + +- Sidebar webview with static ASCII partner artwork and evolution progress +- Dex and generation history panels +- Token tracking via Cursor hooks (`beforeSubmitPrompt` + `stop`) with API watermark fallback +- Commands: spawn, freeze, unfreeze, set Digimon, install/uninstall hooks + +## Installation + +### Open VSX (Cursor / VSCodium) + +```text +ext install sbugallo.cursor-vpet +``` + +Or install from [Open VSX](https://open-vsx.org/extension/sbugallo/cursor-vpet). + +### VSIX (manual) + +Download the `.vsix` from [GitHub Releases](https://github.com/sbugallo/opencode-vpet/releases) and run +**Extensions → Install from VSIX**. + +## First run + +On first activation, the extension offers to install hooks in `~/.cursor/hooks.json`. Hooks are required +for reliable Agent token tracking. + +## Settings + +| Setting | Default | Description | +| --- | --- | --- | +| `vpet.databasePath` | _(empty)_ | Override path to `pet.db` | +| `vpet.usage.settleDelayMs` | `4000` | Delay before API watermark fallback (ms) | + +## Repository + +Monorepo: [github.com/sbugallo/opencode-vpet](https://github.com/sbugallo/opencode-vpet) diff --git a/packages/cursor-vpet/hook-bridge.js b/packages/cursor-vpet/hook-bridge.js new file mode 100644 index 0000000..9c0119a --- /dev/null +++ b/packages/cursor-vpet/hook-bridge.js @@ -0,0 +1,59 @@ +#!/usr/bin/env node +/** + * Cursor hook bridge — reads hook JSON from stdin, appends to events file, responds {}. + * Fail-open: never blocks Cursor on errors. + */ +import { appendFileSync, mkdirSync } from "node:fs" +import { homedir } from "node:os" +import { dirname, join } from "node:path" +import { Readable } from "node:stream" + +const EVENTS_PATH = + process.env.VPET_HOOK_EVENTS_PATH ?? join(homedir(), ".cursor", "vpet-hook-events.jsonl") + +const readStdin = async () => { + const chunks = [] + for await (const chunk of Readable.toWeb(process.stdin)) { + chunks.push(Buffer.from(chunk)) + } + return Buffer.concat(chunks).toString("utf8") +} + +const main = async () => { + const raw = await readStdin() + if (raw.trim().length === 0) { + process.stdout.write("{}") + return + } + + let payload + try { + payload = JSON.parse(raw) + } catch { + process.stdout.write("{}") + return + } + + const hookEventName = + typeof payload.hook_event_name === "string" ? payload.hook_event_name : process.argv[2] ?? "unknown" + + const record = { + receivedAt: new Date().toISOString(), + hookEventName, + payload, + } + + try { + mkdirSync(dirname(EVENTS_PATH), { recursive: true }) + appendFileSync(EVENTS_PATH, `${JSON.stringify(record)}\n`, "utf8") + } catch (error) { + console.error("[vpet-hook-bridge]", error) + } + + process.stdout.write("{}") +} + +main().catch((error) => { + console.error("[vpet-hook-bridge]", error) + process.stdout.write("{}") +}) diff --git a/packages/cursor-vpet/icon.png b/packages/cursor-vpet/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bd1aab4f8acb137696c8e0a561a5cea868304467 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8W8Axtq{F(=(7>k44ofvPP)Tsw@I14-?iy0WW zg+Z8+Vb&Z8pded-Pl)UP|Nnu^&_kE&fYc#R7srr_Id8A+E}PxN^kZOQX;KCo`tVFmSxM>!mI+McintT-><>ejx&mv@7b*80tQ z>EUgxU$e5~S8dC-o6>6*>U&y8R_Db+^-X-Wj_pCt&jk{z&OP!z(mM5h@!R>oCMG!F v&arY_yiwxP#-&c?OOMzn|M-|%BmQ12QOKU>{^nSqZx}pX{an^LB{Ts5lfreq literal 0 HcmV?d00001 diff --git a/packages/cursor-vpet/package.json b/packages/cursor-vpet/package.json new file mode 100644 index 0000000..a12ed1f --- /dev/null +++ b/packages/cursor-vpet/package.json @@ -0,0 +1,124 @@ +{ + "name": "cursor-vpet", + "displayName": "Cursor VPet", + "description": "Digimon virtual pet for Cursor that evolves with Agent token usage.", + "version": "0.2.0-dev.0", + "publisher": "sbugallo", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/sbugallo/opencode-vpet.git", + "directory": "packages/cursor-vpet" + }, + "homepage": "https://github.com/sbugallo/opencode-vpet#readme", + "bugs": { + "url": "https://github.com/sbugallo/opencode-vpet/issues" + }, + "keywords": [ + "cursor", + "vpet", + "virtual-pet", + "digimon", + "agent", + "ai", + "sidebar", + "opencode" + ], + "icon": "icon.png", + "galleryBanner": { + "color": "#1a1a2e", + "theme": "dark" + }, + "engines": { + "vscode": "^1.90.0", + "node": "24.11.0", + "bun": "1.3.5" + }, + "categories": [ + "Other" + ], + "activationEvents": [ + "onStartupFinished" + ], + "main": "./dist/extension.js", + "contributes": { + "views": { + "explorer": [ + { + "id": "cursorVpet.sidebar", + "name": "VPet", + "type": "webview" + } + ] + }, + "commands": [ + { + "command": "cursorVpet.spawn", + "title": "Cursor VPet: Spawn Partner" + }, + { + "command": "cursorVpet.freeze", + "title": "Cursor VPet: Freeze" + }, + { + "command": "cursorVpet.unfreeze", + "title": "Cursor VPet: Unfreeze" + }, + { + "command": "cursorVpet.set", + "title": "Cursor VPet: Set Digimon" + }, + { + "command": "cursorVpet.dex", + "title": "Cursor VPet: Open Dex" + }, + { + "command": "cursorVpet.history", + "title": "Cursor VPet: Open History" + }, + { + "command": "cursorVpet.installHooks", + "title": "Cursor VPet: Install Hooks" + }, + { + "command": "cursorVpet.uninstallHooks", + "title": "Cursor VPet: Uninstall Hooks" + } + ], + "configuration": { + "title": "Cursor VPet", + "properties": { + "vpet.databasePath": { + "type": "string", + "default": "", + "description": "Override path to pet.db (default: shared opencode-vpet/pet.db)" + }, + "vpet.usage.settleDelayMs": { + "type": "number", + "default": 4000, + "description": "Initial delay before API watermark fallback (ms)" + } + } + } + }, + "scripts": { + "build": "bun scripts/build.ts", + "check": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.scripts.json", + "test": "bun test", + "package": "npx @vscode/vsce package --no-dependencies", + "publish:openvsx": "npx ovsx publish *.vsix -p \"$OVSX_PAT\"", + "vscode:prepublish": "bun run build" + }, + "dependencies": { + "@sbugallo/vpet-core": "workspace:*", + "sql.js": "^1.12.0" + }, + "devDependencies": { + "@types/bun": "1.3.14", + "@types/node": "24.10.1", + "@types/vscode": "1.90.0", + "@vscode/vsce": "3.2.1", + "ovsx": "0.10.0", + "typescript": "5.9.3" + } +} diff --git a/packages/cursor-vpet/scripts/build.ts b/packages/cursor-vpet/scripts/build.ts new file mode 100644 index 0000000..46b014d --- /dev/null +++ b/packages/cursor-vpet/scripts/build.ts @@ -0,0 +1,27 @@ +import { copyFile, mkdir, rm } from "node:fs/promises" +import { createRequire } from "node:module" +import { dirname, resolve } from "node:path" + +const require = createRequire(import.meta.url) +const packageRoot = resolve(import.meta.dir, "..") +const distDirectory = resolve(packageRoot, "dist") +const wasmSource = require.resolve("sql.js/dist/sql-wasm.wasm") + +await rm(distDirectory, { recursive: true, force: true }) +await mkdir(distDirectory, { recursive: true }) + +const result = await Bun.build({ + entrypoints: ["./src/extension.ts"], + outdir: "./dist", + target: "node", + format: "cjs", + external: ["vscode"], + minify: true, + sourcemap: false, +}) + +if (!result.success) { + throw new Error("cursor-vpet build failed") +} + +await copyFile(wasmSource, resolve(distDirectory, "sql-wasm.wasm")) diff --git a/packages/cursor-vpet/src/adapters/cursor/cursor-api-watermark.ts b/packages/cursor-vpet/src/adapters/cursor/cursor-api-watermark.ts new file mode 100644 index 0000000..00922bd --- /dev/null +++ b/packages/cursor-vpet/src/adapters/cursor/cursor-api-watermark.ts @@ -0,0 +1,142 @@ +import type { CompletedUsage, UsageApiEvent, UsageApiResponse, UsageWatermark } from "./types.ts" +import { readCursorAccessToken } from "./cursor-auth.ts" + +const USAGE_EVENTS_URL = "https://cursor.com/api/dashboard/get-filtered-usage-events" + +export const fingerprintEvent = (event: UsageApiEvent | undefined): string => { + if (event === undefined) return "none" + const tokens = event.tokenUsage + return `${event.timestamp}:${event.model}:${tokens?.inputTokens ?? 0}:${tokens?.outputTokens ?? 0}` +} + +export const hasValidTokens = (event: UsageApiEvent): boolean => { + if (!event.isTokenBasedCall || event.tokenUsage === undefined) return false + const { inputTokens = 0, outputTokens = 0, cacheWriteTokens = 0, cacheReadTokens = 0 } = event.tokenUsage + return inputTokens + outputTokens + cacheWriteTokens + cacheReadTokens > 0 +} + +export const sumTokenDelta = (events: readonly UsageApiEvent[]): number => + events.reduce((sum, event) => { + const tokens = event.tokenUsage + if (tokens === undefined) return sum + return ( + sum + + (tokens.inputTokens ?? 0) + + (tokens.outputTokens ?? 0) + + (tokens.cacheWriteTokens ?? 0) + + (tokens.cacheReadTokens ?? 0) + ) + }, 0) + +export const isNewEvent = (event: UsageApiEvent, watermark: UsageWatermark): boolean => { + const timestampMs = Number(event.timestamp) + if (timestampMs < watermark.timestampMs) return false + if (timestampMs === watermark.timestampMs && fingerprintEvent(event) === watermark.fingerprint) return false + return hasValidTokens(event) +} + +const fetchUsagePage = async ( + accessToken: string, + body: Record, +): Promise => { + const response = await fetch(USAGE_EVENTS_URL, { + method: "POST", + headers: { + Authorization: `Bearer ${accessToken}`, + "Content-Type": "application/json", + Origin: "https://cursor.com", + }, + body: JSON.stringify(body), + }) + + if (!response.ok) { + throw new Error(`Usage API failed: ${response.status}`) + } + + return (await response.json()) as UsageApiResponse +} + +export const captureWatermark = async (): Promise => { + const accessToken = await readCursorAccessToken() + if (accessToken === null) { + return { timestampMs: Date.now(), fingerprint: "none" } + } + + const response = await fetchUsagePage(accessToken, { page: 1, pageSize: 1 }) + const latest = response.usageEventsDisplay?.find(hasValidTokens) + if (latest === undefined) { + return { timestampMs: Date.now(), fingerprint: "none" } + } + + return { + timestampMs: Number(latest.timestamp), + fingerprint: fingerprintEvent(latest), + } +} + +export const fetchNewEventsSince = async ( + watermark: UsageWatermark, + endDateMs: number, +): Promise => { + const accessToken = await readCursorAccessToken() + if (accessToken === null) return [] + + const collected: UsageApiEvent[] = [] + let page = 1 + const pageSize = 100 + + while (true) { + const response = await fetchUsagePage(accessToken, { + startDate: String(watermark.timestampMs), + endDate: String(endDateMs), + page, + pageSize, + }) + + const events = response.usageEventsDisplay ?? [] + for (const event of events) { + if (isNewEvent(event, watermark)) collected.push(event) + } + + const total = response.totalUsageEventsCount ?? 0 + if (page * pageSize >= total || events.length === 0) break + page += 1 + } + + return collected.sort((a, b) => Number(a.timestamp) - Number(b.timestamp)) +} + +const sleep = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms)) + +export type SettleOptions = { + readonly initialDelayMs: number + readonly retryDelaysMs: readonly number[] +} + +export const settleTurnDelta = async ( + watermark: UsageWatermark, + generationId: string, + options: SettleOptions, +): Promise => { + const delays = [options.initialDelayMs, ...options.retryDelaysMs] + + for (const delayMs of delays) { + await sleep(delayMs) + const endDateMs = Date.now() + const newEvents = await fetchNewEventsSince(watermark, endDateMs) + if (newEvents.length === 0) continue + + const tokenDelta = sumTokenDelta(newEvents) + if (tokenDelta <= 0) continue + + return { + receiptKey: `cursor-turn:${generationId}`, + eventId: `cursor-api-delta:${generationId}`, + tokenDelta, + cost: null, + createdAt: new Date().toISOString(), + } + } + + return null +} diff --git a/packages/cursor-vpet/src/adapters/cursor/cursor-auth.ts b/packages/cursor-vpet/src/adapters/cursor/cursor-auth.ts new file mode 100644 index 0000000..30d5095 --- /dev/null +++ b/packages/cursor-vpet/src/adapters/cursor/cursor-auth.ts @@ -0,0 +1,36 @@ +import { readFileSync } from "node:fs" +import type { Database } from "sql.js" +import { getSqlRuntime } from "../sqlite/sqljs-config.ts" +import { resolveStateVscdbPath } from "./paths.ts" + +const ACCESS_TOKEN_KEY = "cursorAuth/accessToken" + +const queryItemTable = (database: Database, key: string): string | null => { + const statement = database.prepare("SELECT value FROM ItemTable WHERE key = ?") + statement.bind([key]) + if (!statement.step()) { + statement.free() + return null + } + const row = statement.getAsObject() as { value?: unknown } + statement.free() + const cell = row.value + if (cell === null || cell === undefined) return null + return typeof cell === "string" ? cell : String(cell) +} + +export const readCursorAccessToken = async (): Promise => { + const statePath = resolveStateVscdbPath() + try { + const SQL = await getSqlRuntime() + const buffer = readFileSync(statePath) + const database = new SQL.Database(buffer) + try { + return queryItemTable(database, ACCESS_TOKEN_KEY) + } finally { + database.close() + } + } catch { + return null + } +} diff --git a/packages/cursor-vpet/src/adapters/cursor/cursor-stop-mapper.ts b/packages/cursor-vpet/src/adapters/cursor/cursor-stop-mapper.ts new file mode 100644 index 0000000..d852622 --- /dev/null +++ b/packages/cursor-vpet/src/adapters/cursor/cursor-stop-mapper.ts @@ -0,0 +1,24 @@ +import type { CompletedUsage, CursorHookPayload } from "./types.ts" + +export const hasStopTokens = (payload: CursorHookPayload): boolean => { + const input = payload.input_tokens ?? 0 + const output = payload.output_tokens ?? 0 + return input + output > 0 +} + +export const toCompletedUsageFromStop = (payload: CursorHookPayload, receivedAt: string): CompletedUsage | null => { + if (!hasStopTokens(payload)) return null + + const generationId = payload.generation_id ?? payload.conversation_id + if (generationId === undefined || generationId.length === 0) return null + + const tokenDelta = (payload.input_tokens ?? 0) + (payload.output_tokens ?? 0) + + return { + receiptKey: `cursor-turn:${generationId}`, + eventId: `cursor-stop:${generationId}`, + tokenDelta, + cost: null, + createdAt: receivedAt, + } +} diff --git a/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts b/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts new file mode 100644 index 0000000..6ef3f4b --- /dev/null +++ b/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts @@ -0,0 +1,141 @@ +import { watch } from "node:fs" +import { open, stat, writeFile } from "node:fs/promises" + +import type { UsageLedger } from "@sbugallo/vpet-core/application/ports/usage-ledger.ts" +import { recordUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { STAGE_GAUGE_THRESHOLDS } from "@sbugallo/vpet-core/domain/evolution.ts" +import { captureWatermark, settleTurnDelta } from "./cursor-api-watermark.ts" +import { hasStopTokens, toCompletedUsageFromStop } from "./cursor-stop-mapper.ts" +import { resolveHookEventsPath } from "./paths.ts" +import type { CompletedUsage, HookEventRecord, UsageWatermark } from "./types.ts" + +type TurnState = { + watermark: UsageWatermark +} + +export type CursorUsageSettleOptions = { + readonly settleDelayMs: number +} + +export type CursorUsageEventSource = { + dispose(): void +} + +const toSettleOptions = (options: CursorUsageSettleOptions) => ({ + initialDelayMs: options.settleDelayMs, + retryDelaysMs: [Math.max(options.settleDelayMs + 2000, 6000), Math.max(options.settleDelayMs + 6000, 10000)], +}) + +export const createCursorUsageEventSource = ( + ledger: UsageLedger, + onApplied?: () => void, + options: CursorUsageSettleOptions & { readonly eventsPath?: string } = { settleDelayMs: 4000 }, +): CursorUsageEventSource => { + const eventsPath = options.eventsPath ?? resolveHookEventsPath() + const settleOptions = toSettleOptions(options) + const pendingWatermarks = new Map() + const processedReceipts = new Set() + let disposed = false + let watcher: ReturnType | undefined + + const applyUsage = async (usage: CompletedUsage, source: string): Promise => { + if (processedReceipts.has(usage.receiptKey)) return + processedReceipts.add(usage.receiptKey) + const result = recordUsage({ + ledger, + usage, + digimonById: DIGIMON_CATALOG.byId, + selector: Math.random, + thresholds: STAGE_GAUGE_THRESHOLDS, + }) + console.log(`[cursor-vpet] ${source}`, result) + if (result.kind === "applied") onApplied?.() + } + + const handleBeforeSubmit = async (record: HookEventRecord): Promise => { + const conversationId = record.payload.conversation_id + const watermark = await captureWatermark() + const key = conversationId ?? `turn:${record.receivedAt}` + pendingWatermarks.set(key, { watermark }) + } + + const handleStop = async (record: HookEventRecord): Promise => { + const conversationId = record.payload.conversation_id + const generationId = record.payload.generation_id ?? conversationId + if (generationId === undefined) return + + if (hasStopTokens(record.payload)) { + const usage = toCompletedUsageFromStop(record.payload, record.receivedAt) + if (usage !== null) { + await applyUsage(usage, "hook-stop") + pendingWatermarks.delete(conversationId ?? generationId) + return + } + } + + const key = conversationId ?? generationId + const state = pendingWatermarks.get(key) + pendingWatermarks.delete(key) + const usage = await settleTurnDelta( + state?.watermark ?? { timestampMs: 0, fingerprint: "none" }, + generationId, + settleOptions, + ) + if (usage !== null) { + await applyUsage(usage, "api-watermark") + } + } + + const processLine = async (line: string): Promise => { + const trimmed = line.trim() + if (trimmed.length === 0) return + let record: HookEventRecord + try { + record = JSON.parse(trimmed) as HookEventRecord + } catch { + return + } + const eventName = record.hookEventName ?? record.payload.hook_event_name + if (eventName === "beforeSubmitPrompt") await handleBeforeSubmit(record) + if (eventName === "stop") await handleStop(record) + } + + const startWatch = async (): Promise => { + let offset = 0 + try { + const fileStat = await stat(eventsPath) + offset = fileStat.size + } catch { + await writeFile(eventsPath, "", "utf8") + } + + watcher = watch(eventsPath, async () => { + if (disposed) return + try { + const fileStat = await stat(eventsPath) + if (fileStat.size <= offset) return + const handle = await open(eventsPath, "r") + const length = fileStat.size - offset + const buffer = Buffer.alloc(length) + await handle.read(buffer, 0, length, offset) + await handle.close() + offset = fileStat.size + for (const line of buffer.toString("utf8").split("\n")) { + await processLine(line) + } + } catch (error) { + console.error("[cursor-vpet] hook watch error", error) + } + }) + } + + void startWatch() + + return { + dispose() { + disposed = true + watcher?.close() + }, + } +} diff --git a/packages/cursor-vpet/src/adapters/cursor/install-hooks.ts b/packages/cursor-vpet/src/adapters/cursor/install-hooks.ts new file mode 100644 index 0000000..1fe9119 --- /dev/null +++ b/packages/cursor-vpet/src/adapters/cursor/install-hooks.ts @@ -0,0 +1,61 @@ +import { mkdirSync, readFileSync, writeFileSync } from "node:fs" +import { dirname } from "node:path" +import { resolveHooksJsonPath } from "./paths.ts" + +const VPET_MARKER = "hook-bridge.js" + +export type HooksJson = { + readonly version: number + readonly hooks: Record +} + +const parseHooksJson = (raw: string): HooksJson => { + const parsed = JSON.parse(raw) as HooksJson + if (typeof parsed.version !== "number" || typeof parsed.hooks !== "object") { + throw new Error("Invalid hooks.json shape") + } + return parsed +} + +const isVpetHook = (entry: { readonly command: string }): boolean => entry.command.includes(VPET_MARKER) + +export const installVpetHooks = (bridgePath: string): { readonly hooksPath: string } => { + const hooksPath = resolveHooksJsonPath() + const command = `node "${bridgePath}"` + + mkdirSync(dirname(hooksPath), { recursive: true }) + + let config: HooksJson + try { + config = parseHooksJson(readFileSync(hooksPath, "utf8")) + } catch { + config = { version: 1, hooks: {} } + } + + const ensureHook = (name: string): void => { + const existing = config.hooks[name] ?? [] + config.hooks[name] = [...existing.filter((entry) => !isVpetHook(entry)), { command }] + } + + ensureHook("beforeSubmitPrompt") + ensureHook("stop") + + writeFileSync(hooksPath, `${JSON.stringify(config, null, 2)}\n`, "utf8") + return { hooksPath } +} + +export const uninstallVpetHooks = (): boolean => { + const hooksPath = resolveHooksJsonPath() + try { + const config = parseHooksJson(readFileSync(hooksPath, "utf8")) + const nextHooks: HooksJson["hooks"] = {} + for (const [name, entries] of Object.entries(config.hooks)) { + const filtered = entries.filter((entry) => !isVpetHook(entry)) + if (filtered.length > 0) nextHooks[name] = filtered + } + writeFileSync(hooksPath, `${JSON.stringify({ ...config, hooks: nextHooks }, null, 2)}\n`, "utf8") + return true + } catch { + return false + } +} diff --git a/packages/cursor-vpet/src/adapters/cursor/paths.ts b/packages/cursor-vpet/src/adapters/cursor/paths.ts new file mode 100644 index 0000000..9ce4d9a --- /dev/null +++ b/packages/cursor-vpet/src/adapters/cursor/paths.ts @@ -0,0 +1,27 @@ +import { homedir } from "node:os" +import { dirname, join } from "node:path" +import { fileURLToPath } from "node:url" + +export const resolveCursorUserDir = (): string => { + if (process.platform === "darwin") { + return join(homedir(), "Library", "Application Support", "Cursor", "User") + } + if (process.platform === "win32") { + const appData = process.env.APPDATA ?? join(homedir(), "AppData", "Roaming") + return join(appData, "Cursor", "User") + } + return join(homedir(), ".config", "Cursor", "User") +} + +export const resolveStateVscdbPath = (): string => join(resolveCursorUserDir(), "globalStorage", "state.vscdb") + +export const resolveHooksJsonPath = (): string => join(homedir(), ".cursor", "hooks.json") + +export const resolveHookEventsPath = (): string => + process.env.VPET_HOOK_EVENTS_PATH ?? join(homedir(), ".cursor", "vpet-hook-events.jsonl") + +export const resolveHookBridgePath = (): string => { + const override = process.env.VPET_HOOK_BRIDGE_PATH + if (override !== undefined && override.length > 0) return override + return join(dirname(fileURLToPath(import.meta.url)), "..", "..", "..", "hook-bridge.js") +} diff --git a/packages/cursor-vpet/src/adapters/cursor/types.ts b/packages/cursor-vpet/src/adapters/cursor/types.ts new file mode 100644 index 0000000..93330fa --- /dev/null +++ b/packages/cursor-vpet/src/adapters/cursor/types.ts @@ -0,0 +1,47 @@ +export type CompletedUsage = { + readonly receiptKey: string + readonly eventId: string + readonly tokenDelta: number + readonly cost?: number | null + readonly createdAt: string +} + +export type UsageWatermark = { + readonly timestampMs: number + readonly fingerprint: string + readonly conversationId?: string +} + +export type HookEventRecord = { + readonly receivedAt: string + readonly hookEventName: string + readonly payload: CursorHookPayload +} + +export type CursorHookPayload = { + readonly hook_event_name?: string + readonly conversation_id?: string + readonly generation_id?: string + readonly input_tokens?: number + readonly output_tokens?: number + readonly cache_read_tokens?: number + readonly cache_write_tokens?: number + readonly status?: string +} + +export type UsageApiEvent = { + readonly timestamp: string + readonly model: string + readonly isTokenBasedCall?: boolean + readonly tokenUsage?: { + readonly inputTokens?: number + readonly outputTokens?: number + readonly cacheWriteTokens?: number + readonly cacheReadTokens?: number + } +} + +export type UsageApiResponse = { + readonly totalUsageEventsCount?: number + readonly usageEventsDisplay?: readonly UsageApiEvent[] +} diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts b/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts new file mode 100644 index 0000000..88698d3 --- /dev/null +++ b/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts @@ -0,0 +1,107 @@ +import { existsSync } from "node:fs" + +import type { SidebarSnapshot, SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" +import { resolveHostDatabasePath, type HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" +import type { SqliteExecutor } from "@sbugallo/vpet-core/ports/sqlite-executor.ts" +import { openDatabaseFromPath } from "./sqljs-runtime.ts" +import { openReadonlySqlJsDatabase } from "./sqljs-driver.ts" +import { + ACTIVE_PARTNER_SELECT, + toPartner, + type PersistedPartnerRow, + type TrainerStateRow, +} from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-schema.ts" + +export type CreateSqliteSidebarSnapshotReaderOptions = HostPathOptions & { readonly databasePath?: string } + +const TRAINER_STATE_SELECT = "SELECT total_tokens FROM trainer_state WHERE trainer_id = 1" +const CONTROL_STATE_SELECT = "SELECT frozen, cheat_node_id FROM vpet_control_state WHERE control_id = 1" + +type ControlStateRow = { + readonly frozen: number + readonly cheat_node_id: string | null +} + +const isRecoverableSqliteReadError = (error: unknown): boolean => + error instanceof Error && + (error.message.includes("sqlite") || error.message.includes("database") || error.message.includes("no such table")) + +export const readSidebarSnapshotFromExecutor = ( + executor: Pick, +): SidebarSnapshot | null => { + const trainer = executor.get(TRAINER_STATE_SELECT) + const control = executor.get(CONTROL_STATE_SELECT) + if (control?.cheat_node_id !== null && control?.cheat_node_id !== undefined) { + return { + currentNodeId: control.cheat_node_id, + gauge: 0, + isTerminal: true, + frozen: false, + isSetOverride: true, + trainerTotalTokens: trainer?.total_tokens ?? 0, + } + } + + const partnerRow = executor.get(ACTIVE_PARTNER_SELECT) + if (partnerRow === null) return null + + const partner = toPartner(partnerRow) + return { + currentNodeId: partner.currentNodeId, + gauge: partner.gauge, + isTerminal: partner.isTerminal, + frozen: control?.frozen === 1, + isSetOverride: false, + trainerTotalTokens: trainer?.total_tokens ?? 0, + } +} + +export const createSqliteSidebarSnapshotReader = async ( + options: CreateSqliteSidebarSnapshotReaderOptions = {}, +): Promise => { + const databasePath = options.databasePath ?? resolveHostDatabasePath(options) + if (!existsSync(databasePath)) { + return { getSidebarSnapshot: () => null } + } + + const database = await openReadonlySqlJsDatabase(databasePath) + return { + getSidebarSnapshot(): SidebarSnapshot | null { + try { + return readSidebarSnapshotFromExecutor(database.executor) + } catch (error) { + if (isRecoverableSqliteReadError(error)) return null + throw error + } + }, + } +} + +export const readSidebarSnapshot = async ( + options: CreateSqliteSidebarSnapshotReaderOptions = {}, +): Promise => { + const databasePath = options.databasePath ?? resolveHostDatabasePath(options) + if (!existsSync(databasePath)) return null + + const database = await openDatabaseFromPath(databasePath) + try { + const statementRunner = { + get>(sql: string): TRow | null { + const statement = database.prepare(sql) + if (!statement.step()) { + statement.free() + return null + } + const row = statement.getAsObject() as TRow + statement.free() + return row + }, + } + return readSidebarSnapshotFromExecutor(statementRunner) + } catch (error) { + if (isRecoverableSqliteReadError(error)) return null + throw error + } finally { + database.close() + } +} diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts new file mode 100644 index 0000000..4dd4ff9 --- /dev/null +++ b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts @@ -0,0 +1,105 @@ +import { existsSync } from "node:fs" + +import type { + VpetArchiveEvent, + VpetArchivePartner, + VpetArchiveResult, +} from "@sbugallo/vpet-core/application/models/vpet-archive.ts" +import type { VpetArchiveReader } from "@sbugallo/vpet-core/application/ports/vpet-archive.ts" +import type { SqliteExecutor } from "@sbugallo/vpet-core/ports/sqlite-executor.ts" +import { resolveHostDatabasePath, type HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" +import { openReadonlySqlJsDatabase } from "./sqljs-driver.ts" +import { + ARCHIVE_PARTNER_EVENTS_SELECT, + ARCHIVE_PARTNERS_SELECT, + type PersistedPartnerEventRow, + type PersistedPartnerRow, +} from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-schema.ts" + +export type CreateSqliteVpetArchiveReaderOptions = HostPathOptions & { readonly databasePath?: string } + +const UNAVAILABLE_ARCHIVE_MESSAGE = "VPet archive is unavailable." + +const isRecoverableSqliteReadError = (error: unknown): boolean => + error instanceof Error && + (error.message.includes("sqlite") || error.message.includes("database") || error.message.includes("no such table")) + +const toArchiveEvent = (row: PersistedPartnerEventRow): VpetArchiveEvent => ({ + eventId: row.event_id, + currentNodeId: row.current_node_id, + createdAt: row.created_at, +}) + +const toArchivePartner = (row: PersistedPartnerRow, events: readonly VpetArchiveEvent[]): VpetArchivePartner => ({ + partnerId: row.partner_id, + generation: row.generation, + createdAt: row.created_at, + retiredAt: row.retired_at, + events, +}) + +const groupEventsByPartnerId = ( + rows: readonly PersistedPartnerEventRow[], +): ReadonlyMap => { + const eventsByPartnerId = new Map() + for (const row of rows) { + const events = eventsByPartnerId.get(row.partner_id) + if (events === undefined) { + eventsByPartnerId.set(row.partner_id, [toArchiveEvent(row)]) + continue + } + events.push(toArchiveEvent(row)) + } + return eventsByPartnerId +} + +export const readSqliteVpetArchive = (executor: Pick): VpetArchiveResult => { + const partners = executor.all(ARCHIVE_PARTNERS_SELECT) + if (partners.length === 0) return { kind: "empty" } + + const eventsByPartnerId = groupEventsByPartnerId( + executor.all(ARCHIVE_PARTNER_EVENTS_SELECT), + ) + return { + kind: "available", + partners: partners.map((partner) => toArchivePartner(partner, eventsByPartnerId.get(partner.partner_id) ?? [])), + } +} + +export const createSqliteVpetArchiveReader = async ( + options: CreateSqliteVpetArchiveReaderOptions = {}, +): Promise => { + const databasePath = options.databasePath ?? resolveHostDatabasePath(options) + if (!existsSync(databasePath)) { + return { getArchive: () => ({ kind: "empty" }) } + } + + const database = await openReadonlySqlJsDatabase(databasePath) + return { + getArchive(): VpetArchiveResult { + try { + return readSqliteVpetArchive(database.executor) + } catch (error) { + if (isRecoverableSqliteReadError(error)) return { kind: "unavailable", message: UNAVAILABLE_ARCHIVE_MESSAGE } + throw error + } + }, + } +} + +export const readArchive = async (options: CreateSqliteVpetArchiveReaderOptions = {}): Promise => { + const databasePath = options.databasePath ?? resolveHostDatabasePath(options) + if (!existsSync(databasePath)) return { kind: "empty" } + + try { + const database = await openReadonlySqlJsDatabase(databasePath) + try { + return readSqliteVpetArchive(database.executor) + } finally { + database.close() + } + } catch (error) { + if (isRecoverableSqliteReadError(error)) return { kind: "unavailable", message: UNAVAILABLE_ARCHIVE_MESSAGE } + throw error + } +} diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts new file mode 100644 index 0000000..8ae4a76 --- /dev/null +++ b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts @@ -0,0 +1,28 @@ +import type { SqliteVpetWriteStore } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-types.ts" +import { resolveHostDatabasePath, type HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" +import { createSqliteVpetWriteStore } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-write-store.ts" +import { openWritableSqlJsDatabase } from "./sqljs-driver.ts" + +export type CreateSqliteVpetRepositoryOptions = HostPathOptions & { readonly databasePath?: string } + +export { resolveHostDatabasePath } +export type { HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" +export type { + PersistedPartnerEvent, + SqliteVpetWriteStore, +} from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-types.ts" + +export const createSqliteVpetRepository = async ( + options: CreateSqliteVpetRepositoryOptions = {}, +): Promise => { + const databasePath = options.databasePath ?? resolveHostDatabasePath(options) + const database = await openWritableSqlJsDatabase(databasePath) + + return createSqliteVpetWriteStore({ + databasePath, + executor: database.executor, + close: () => { + database.close() + }, + }) +} diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqljs-config.ts b/packages/cursor-vpet/src/adapters/sqlite/sqljs-config.ts new file mode 100644 index 0000000..c189a43 --- /dev/null +++ b/packages/cursor-vpet/src/adapters/sqlite/sqljs-config.ts @@ -0,0 +1,25 @@ +import { createRequire } from "node:module" +import initSqlJs, { type SqlJsStatic } from "sql.js" + +const require = createRequire(import.meta.url) + +let sqlRuntime: SqlJsStatic | undefined +let wasmPath: string | undefined + +export const configureSqlJsWasmPath = (path: string): void => { + wasmPath = path +} + +const resolveWasmPath = (): string => { + if (wasmPath !== undefined) return wasmPath + return require.resolve("sql.js/dist/sql-wasm.wasm") +} + +export const getSqlRuntime = async (): Promise => { + if (sqlRuntime === undefined) { + sqlRuntime = await initSqlJs({ + locateFile: () => resolveWasmPath(), + }) + } + return sqlRuntime +} diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqljs-driver.ts b/packages/cursor-vpet/src/adapters/sqlite/sqljs-driver.ts new file mode 100644 index 0000000..d3a1d1e --- /dev/null +++ b/packages/cursor-vpet/src/adapters/sqlite/sqljs-driver.ts @@ -0,0 +1,108 @@ +import { mkdirSync, readFileSync, writeFileSync } from "node:fs" +import { dirname } from "node:path" +import type { Database } from "sql.js" + +import type { QueryValue, SqliteExecutor } from "@sbugallo/vpet-core/ports/sqlite-executor.ts" +import { getSqlRuntime } from "./sqljs-config.ts" + +export type SqlJsDatabase = { + readonly executor: SqliteExecutor + close(): void +} + +const persistDatabase = (database: Database, databasePath: string): void => { + mkdirSync(dirname(databasePath), { recursive: true }) + writeFileSync(databasePath, Buffer.from(database.export())) +} + +const createExecutor = (database: Database, persist: () => void): SqliteExecutor => { + let transactionDepth = 0 + + const persistIfIdle = (): void => { + if (transactionDepth === 0) persist() + } + + return { + run(sql, params = []) { + database.run(sql, Array.from(params)) + persistIfIdle() + }, + get>(sql: string, params: readonly QueryValue[] = []) { + const statement = database.prepare(sql) + statement.bind(Array.from(params)) + if (!statement.step()) { + statement.free() + return null + } + const row = statement.getAsObject() as TRow + statement.free() + return row + }, + all>(sql: string, params: readonly QueryValue[] = []) { + const statement = database.prepare(sql) + statement.bind(Array.from(params)) + const rows: TRow[] = [] + while (statement.step()) { + rows.push(statement.getAsObject() as TRow) + } + statement.free() + return rows + }, + transaction(operation) { + database.run("BEGIN IMMEDIATE") + transactionDepth += 1 + try { + const result = operation() + database.run("COMMIT") + transactionDepth -= 1 + persist() + return result + } catch (error) { + try { + database.run("ROLLBACK") + } catch { + // Ignore rollback failures when the transaction is already closed. + } + transactionDepth -= 1 + throw error + } + }, + } +} + +const configureWriter = (database: Database): void => { + database.run("PRAGMA foreign_keys = ON") +} + +export const openReadonlySqlJsDatabase = async (databasePath: string): Promise => { + const SQL = await getSqlRuntime() + const buffer = readFileSync(databasePath) + const database = new SQL.Database(buffer) + configureWriter(database) + return { + executor: createExecutor(database, () => {}), + close() { + database.close() + }, + } +} + +export const openWritableSqlJsDatabase = async (databasePath: string): Promise => { + const SQL = await getSqlRuntime() + let database: Database + try { + const buffer = readFileSync(databasePath) + database = new SQL.Database(buffer) + } catch { + database = new SQL.Database() + } + configureWriter(database) + const persist = () => persistDatabase(database, databasePath) + return { + executor: createExecutor(database, persist), + close() { + persist() + database.close() + }, + } +} diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqljs-runtime.ts b/packages/cursor-vpet/src/adapters/sqlite/sqljs-runtime.ts new file mode 100644 index 0000000..ba4b4b7 --- /dev/null +++ b/packages/cursor-vpet/src/adapters/sqlite/sqljs-runtime.ts @@ -0,0 +1,15 @@ +import { readFileSync } from "node:fs" +import type { Database } from "sql.js" + +import { getSqlRuntime } from "./sqljs-config.ts" + +export { configureSqlJsWasmPath } from "./sqljs-config.ts" + +export const openDatabaseFromPath = async (databasePath: string): Promise => { + const SQL = await getSqlRuntime() + try { + return new SQL.Database(readFileSync(databasePath)) + } catch { + return new SQL.Database() + } +} diff --git a/packages/cursor-vpet/src/config/extension-settings.ts b/packages/cursor-vpet/src/config/extension-settings.ts new file mode 100644 index 0000000..ca8b042 --- /dev/null +++ b/packages/cursor-vpet/src/config/extension-settings.ts @@ -0,0 +1,25 @@ +import * as vscode from "vscode" + +import type { HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" + +export type VpetExtensionSettings = { + readonly databasePath?: string + readonly settleDelayMs: number +} + +export const getVpetExtensionSettings = (): VpetExtensionSettings => { + const configuration = vscode.workspace.getConfiguration("vpet") + const databasePath = configuration.get("databasePath", "").trim() + const settings: VpetExtensionSettings = { + settleDelayMs: configuration.get("usage.settleDelayMs", 4000), + } + if (databasePath.length > 0) { + return { ...settings, databasePath } + } + return settings +} + +export const toDatabaseOptions = ( + settings: VpetExtensionSettings, +): HostPathOptions & { readonly databasePath?: string } => + settings.databasePath === undefined ? {} : { databasePath: settings.databasePath } diff --git a/packages/cursor-vpet/src/extension.ts b/packages/cursor-vpet/src/extension.ts new file mode 100644 index 0000000..8f6b770 --- /dev/null +++ b/packages/cursor-vpet/src/extension.ts @@ -0,0 +1,114 @@ +import { existsSync } from "node:fs" +import { join } from "node:path" +import * as vscode from "vscode" + +import { spawnPartner } from "@sbugallo/vpet-core/application/use-cases/spawn-partner.ts" +import { freezeVpet } from "@sbugallo/vpet-core/application/use-cases/freeze-vpet.ts" +import { unfreezeVpet } from "@sbugallo/vpet-core/application/use-cases/unfreeze-vpet.ts" +import { setVpetCheatNode } from "@sbugallo/vpet-core/application/use-cases/set-vpet-cheat-node.ts" +import { createCursorUsageEventSource } from "./adapters/cursor/cursor-usage-event-source.ts" +import { installVpetHooks, uninstallVpetHooks } from "./adapters/cursor/install-hooks.ts" +import { resolveStateVscdbPath } from "./adapters/cursor/paths.ts" +import { configureSqlJsWasmPath } from "./adapters/sqlite/sqljs-config.ts" +import { createSqliteVpetRepository } from "./adapters/sqlite/sqlite-vpet-write-store.ts" +import { getVpetExtensionSettings, toDatabaseOptions } from "./config/extension-settings.ts" +import { openDexPanel } from "./webview/dex-panel.ts" +import { openHistoryPanel } from "./webview/history-panel.ts" +import { VpetSidebarProvider } from "./webview/vpet-sidebar-provider.ts" + +let sidebarProvider: VpetSidebarProvider | undefined + +const isCursorRuntime = (): boolean => existsSync(resolveStateVscdbPath()) + +const ensureHooksInstalled = async (context: vscode.ExtensionContext): Promise => { + const key = "vpet.hooksInstalled" + if (context.globalState.get(key) === true) return + + const choice = await vscode.window.showInformationMessage( + "Cursor VPet needs to register hooks in ~/.cursor/hooks.json to track Agent usage.", + "Install hooks", + "Not now", + ) + if (choice !== "Install hooks") return + + const bridgePath = join(context.extensionPath, "hook-bridge.js") + const result = installVpetHooks(bridgePath) + await context.globalState.update(key, true) + vscode.window.showInformationMessage(`VPet hooks installed at ${result.hooksPath}`) +} + +export async function activate(context: vscode.ExtensionContext): Promise { + configureSqlJsWasmPath(join(context.extensionPath, "dist", "sql-wasm.wasm")) + + if (!isCursorRuntime()) { + vscode.window.showWarningMessage("Cursor VPet: token tracking requires Cursor (state.vscdb not found).") + } + + const readSettings = () => getVpetExtensionSettings() + const databaseOptions = () => toDatabaseOptions(readSettings()) + + const repository = await createSqliteVpetRepository(databaseOptions()) + context.subscriptions.push({ dispose: () => repository.close() }) + + sidebarProvider = new VpetSidebarProvider(context.extensionUri, databaseOptions()) + context.subscriptions.push(vscode.window.registerWebviewViewProvider(VpetSidebarProvider.viewType, sidebarProvider)) + + const refreshSidebar = (): void => { + void sidebarProvider?.refresh() + } + + const usageSource = createCursorUsageEventSource(repository, refreshSidebar, { + settleDelayMs: readSettings().settleDelayMs, + }) + context.subscriptions.push(usageSource) + + context.subscriptions.push( + vscode.workspace.onDidChangeConfiguration((event) => { + if (!event.affectsConfiguration("vpet")) return + vscode.window.showInformationMessage("VPet settings changed. Reload the window to apply database path changes.") + }), + vscode.commands.registerCommand("cursorVpet.spawn", async () => { + spawnPartner(repository, new Date().toISOString()) + vscode.window.showInformationMessage("VPet partner spawned.") + refreshSidebar() + }), + vscode.commands.registerCommand("cursorVpet.freeze", async () => { + const result = freezeVpet(repository) + vscode.window.showInformationMessage(result.kind === "frozen" ? "VPet frozen." : "VPet already frozen.") + refreshSidebar() + }), + vscode.commands.registerCommand("cursorVpet.unfreeze", async () => { + const result = unfreezeVpet(repository) + vscode.window.showInformationMessage(result.kind === "unfrozen" ? "VPet unfrozen." : "VPet already active.") + refreshSidebar() + }), + vscode.commands.registerCommand("cursorVpet.set", async () => { + const nodeId = await vscode.window.showInputBox({ prompt: "Digimon node ID (e.g. 0-001)" }) + if (nodeId === undefined || nodeId.length === 0) return + const result = setVpetCheatNode(repository, nodeId) + vscode.window.showInformationMessage(`Set result: ${result.kind}`) + refreshSidebar() + }), + vscode.commands.registerCommand("cursorVpet.dex", () => openDexPanel(context, databaseOptions())), + vscode.commands.registerCommand("cursorVpet.history", () => openHistoryPanel(context, databaseOptions())), + vscode.commands.registerCommand("cursorVpet.installHooks", async () => { + const bridgePath = join(context.extensionPath, "hook-bridge.js") + installVpetHooks(bridgePath) + await context.globalState.update("vpet.hooksInstalled", true) + }), + vscode.commands.registerCommand("cursorVpet.uninstallHooks", () => { + uninstallVpetHooks() + void context.globalState.update("vpet.hooksInstalled", false) + }), + ) + + const poll = setInterval(refreshSidebar, 30_000) + context.subscriptions.push({ dispose: () => clearInterval(poll) }) + + await ensureHooksInstalled(context) + refreshSidebar() +} + +export function deactivate(): void { + sidebarProvider = undefined +} diff --git a/packages/cursor-vpet/src/types/sql.js.d.ts b/packages/cursor-vpet/src/types/sql.js.d.ts new file mode 100644 index 0000000..01dd3d5 --- /dev/null +++ b/packages/cursor-vpet/src/types/sql.js.d.ts @@ -0,0 +1,31 @@ +declare module "sql.js" { + export type SqlJsStatic = { + Database: new (data?: ArrayLike | Buffer | null) => Database + } + + export type Database = { + run(sql: string, params?: readonly (string | number | boolean | null)[]): void + prepare(sql: string): Statement + exec(sql: string, params?: readonly (string | number | boolean | null)[]): QueryExecResult[] + export(): Uint8Array + close(): void + } + + export type QueryExecResult = { + columns: string[] + values: unknown[][] + } + + export type Statement = { + bind(values?: readonly (string | number | boolean | null)[]): boolean + step(): boolean + getAsObject(): Record + free(): void + } + + export type InitSqlJsConfig = { + readonly locateFile?: (file: string) => string + } + + export default function initSqlJs(config?: InitSqlJsConfig): Promise +} diff --git a/packages/cursor-vpet/src/webview/dex-panel.ts b/packages/cursor-vpet/src/webview/dex-panel.ts new file mode 100644 index 0000000..2a00039 --- /dev/null +++ b/packages/cursor-vpet/src/webview/dex-panel.ts @@ -0,0 +1,33 @@ +import * as vscode from "vscode" + +import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { buildDexViewModel } from "@sbugallo/vpet-core/view-models/dex-view-model.ts" +import type { CreateSqliteVpetArchiveReaderOptions } from "../adapters/sqlite/sqlite-vpet-archive-reader.ts" +import { readArchive } from "../adapters/sqlite/sqlite-vpet-archive-reader.ts" + +export const openDexPanel = async ( + context: vscode.ExtensionContext, + options: CreateSqliteVpetArchiveReaderOptions = {}, +): Promise => { + const archive = await readArchive(options) + const model = buildDexViewModel(archive, DIGIMON_CATALOG, DEFAULT_VPET_SETTINGS) + + const panel = vscode.window.createWebviewPanel("cursorVpetDex", "VPet Dex", vscode.ViewColumn.One, {}) + if (model.kind !== "available") { + panel.webview.html = `${model.kind === "empty" ? "No discoveries yet." : model.message}` + context.subscriptions.push(panel) + return + } + + const discoveredCount = model.rows.filter((row) => row.discovered).length + const rows = model.rows + .map((row) => `${row.name}${row.stage}${row.discovered ? "✓" : "—"}`) + .join("") + panel.webview.html = ` +

VPet Dex

+

Discovered: ${discoveredCount} / ${model.rows.length}

+ ${rows}
NameStageFound
+ ` + context.subscriptions.push(panel) +} diff --git a/packages/cursor-vpet/src/webview/history-panel.ts b/packages/cursor-vpet/src/webview/history-panel.ts new file mode 100644 index 0000000..2d7f2df --- /dev/null +++ b/packages/cursor-vpet/src/webview/history-panel.ts @@ -0,0 +1,34 @@ +import * as vscode from "vscode" + +import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { buildHistoryViewModel } from "@sbugallo/vpet-core/view-models/history-view-model.ts" +import type { CreateSqliteVpetArchiveReaderOptions } from "../adapters/sqlite/sqlite-vpet-archive-reader.ts" +import { readArchive } from "../adapters/sqlite/sqlite-vpet-archive-reader.ts" + +export const openHistoryPanel = async ( + context: vscode.ExtensionContext, + options: CreateSqliteVpetArchiveReaderOptions = {}, +): Promise => { + const archive = await readArchive(options) + const model = buildHistoryViewModel(archive, DIGIMON_CATALOG, DEFAULT_VPET_SETTINGS) + + const panel = vscode.window.createWebviewPanel("cursorVpetHistory", "VPet History", vscode.ViewColumn.One, {}) + if (model.kind !== "available") { + panel.webview.html = `${model.kind === "empty" ? "No history yet." : model.message}` + context.subscriptions.push(panel) + return + } + + const rows = model.generations + .map( + (generation) => + `Gen ${generation.generation}${generation.path.join(" → ")}${generation.createdAt}`, + ) + .join("") + panel.webview.html = ` +

VPet History

+ ${rows}
GenPathCreated
+ ` + context.subscriptions.push(panel) +} diff --git a/packages/cursor-vpet/src/webview/sidebar-render.ts b/packages/cursor-vpet/src/webview/sidebar-render.ts new file mode 100644 index 0000000..e0fa137 --- /dev/null +++ b/packages/cursor-vpet/src/webview/sidebar-render.ts @@ -0,0 +1,144 @@ +import type { SidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" +import { resolveStaticMonsterArtwork } from "./static-monster-artwork.ts" + +const NEXT_CHECK_PREFIX = "Next check: " +const NEXT_CHECK_BAR_WIDTH = 20 +const URL_LABEL = "Encyclopedia entry" + +const formatCount = (value: number): string => value.toLocaleString("en-US") + +export const buildNextCheckLine = (model: SidebarCardModel): string => { + if (model.kind === "no_partner") return "" + if (model.isTerminal && !model.isSetOverride) return `${NEXT_CHECK_PREFIX}None` + + const progress = model.isTerminal ? 1 : Math.min(Math.max(model.gauge / model.threshold, 0), 1) + const filled = Math.floor(progress * NEXT_CHECK_BAR_WIDTH) + return `${NEXT_CHECK_PREFIX}[${"█".repeat(filled)}${"░".repeat(NEXT_CHECK_BAR_WIDTH - filled)}]` +} + +export const buildGaugeLine = (model: SidebarCardModel): string => { + if (model.kind !== "partner") return "" + return model.isTerminal ? "-/-" : `${formatCount(model.gauge)}/${formatCount(model.threshold)}` +} + +export type SidebarWebviewPayload = + | { readonly type: "sidebar-model"; readonly kind: "no_partner"; readonly messageLine: string } + | { + readonly type: "sidebar-model" + readonly kind: "partner" + readonly name: string + readonly stage: string + readonly artwork: string + readonly nextCheck: string + readonly gauge: string + readonly url: string + readonly urlLabel: string + readonly frozen: boolean + } + +export const toSidebarWebviewPayload = (model: SidebarCardModel): SidebarWebviewPayload => { + if (model.kind === "no_partner") { + return { type: "sidebar-model", kind: "no_partner", messageLine: model.messageLine } + } + + return { + type: "sidebar-model", + kind: "partner", + name: model.isSetOverride ? `${model.name} (set)` : model.name, + stage: model.frozen ? `${model.stage} (frozen)` : model.stage, + artwork: resolveStaticMonsterArtwork(model.sprite), + nextCheck: buildNextCheckLine(model), + gauge: buildGaugeLine(model), + url: model.url, + urlLabel: URL_LABEL, + frozen: model.frozen, + } +} + +export const buildSidebarWebviewHtml = (nonce: string): string => ` + + + + + + + +
Loading VPet…
+ + +` diff --git a/packages/cursor-vpet/src/webview/static-monster-artwork.ts b/packages/cursor-vpet/src/webview/static-monster-artwork.ts new file mode 100644 index 0000000..e140183 --- /dev/null +++ b/packages/cursor-vpet/src/webview/static-monster-artwork.ts @@ -0,0 +1,11 @@ +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + +const STATIC_FRAME_NAMES = ["happy", "walk_1", "sleep_1"] as const + +export const resolveStaticMonsterArtwork = (sprite: string): string => { + for (const frameName of STATIC_FRAME_NAMES) { + const frame = MONSTER_FRAME_CATALOG.get(sprite, frameName) + if (frame !== undefined) return frame.content + } + return sprite.length === 0 ? "" : `Artwork unavailable: ${sprite}` +} diff --git a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts new file mode 100644 index 0000000..ee3a293 --- /dev/null +++ b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts @@ -0,0 +1,48 @@ +import * as vscode from "vscode" + +import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/get-sidebar-card-inputs.ts" +import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" +import type { HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" +import { readSidebarSnapshot } from "../adapters/sqlite/sqlite-sidebar-snapshot-reader.ts" +import { buildSidebarWebviewHtml, toSidebarWebviewPayload } from "./sidebar-render.ts" + +export type VpetSidebarProviderOptions = HostPathOptions & { + readonly databasePath?: string +} + +export class VpetSidebarProvider implements vscode.WebviewViewProvider { + public static readonly viewType = "cursorVpet.sidebar" + + private view?: vscode.WebviewView + + constructor( + private readonly extensionUri: vscode.Uri, + private readonly options: VpetSidebarProviderOptions = {}, + ) {} + + resolveWebviewView(webviewView: vscode.WebviewView): void { + this.view = webviewView + webviewView.webview.options = { + enableScripts: true, + localResourceRoots: [this.extensionUri], + } + webviewView.webview.html = buildSidebarWebviewHtml(String(Date.now())) + webviewView.webview.onDidReceiveMessage((message: { readonly type?: string; readonly url?: string }) => { + if (message.type === "open-url" && typeof message.url === "string" && message.url.length > 0) { + void vscode.env.openExternal(vscode.Uri.parse(message.url)) + } + }) + void this.refresh() + } + + async refresh(): Promise { + if (this.view === undefined) return + const snapshot = await readSidebarSnapshot(this.options) + const reader = { getSidebarSnapshot: () => snapshot } + const inputs = getSidebarCardInputs(reader, DIGIMON_CATALOG) + const model = buildSidebarCardModel(inputs, DEFAULT_VPET_SETTINGS) + await this.view.webview.postMessage(toSidebarWebviewPayload(model)) + } +} diff --git a/packages/cursor-vpet/tests/cursor-api-watermark.test.ts b/packages/cursor-vpet/tests/cursor-api-watermark.test.ts new file mode 100644 index 0000000..fa7a49e --- /dev/null +++ b/packages/cursor-vpet/tests/cursor-api-watermark.test.ts @@ -0,0 +1,40 @@ +import { describe, expect, test } from "bun:test" +import { + fingerprintEvent, + hasValidTokens, + isNewEvent, + sumTokenDelta, +} from "../src/adapters/cursor/cursor-api-watermark.ts" +import type { UsageApiEvent, UsageWatermark } from "../src/adapters/cursor/types.ts" + +describe("cursor-api-watermark", () => { + const event: UsageApiEvent = { + timestamp: "1000", + model: "composer-2", + isTokenBasedCall: true, + tokenUsage: { + inputTokens: 10, + outputTokens: 5, + cacheWriteTokens: 2, + cacheReadTokens: 3, + }, + } + + test("sums token fields", () => { + expect(sumTokenDelta([event])).toBe(20) + }) + + test("filters new events by watermark", () => { + const watermark: UsageWatermark = { + timestampMs: 1000, + fingerprint: fingerprintEvent(event), + } + expect(isNewEvent(event, watermark)).toBe(false) + expect(isNewEvent({ ...event, timestamp: "1001" }, watermark)).toBe(true) + }) + + test("validates token based events", () => { + expect(hasValidTokens(event)).toBe(true) + expect(hasValidTokens({ timestamp: "1", model: "x" })).toBe(false) + }) +}) diff --git a/packages/cursor-vpet/tests/cursor-stop-mapper.test.ts b/packages/cursor-vpet/tests/cursor-stop-mapper.test.ts new file mode 100644 index 0000000..f0d87e2 --- /dev/null +++ b/packages/cursor-vpet/tests/cursor-stop-mapper.test.ts @@ -0,0 +1,28 @@ +import { describe, expect, test } from "bun:test" +import { hasStopTokens, toCompletedUsageFromStop } from "../src/adapters/cursor/cursor-stop-mapper.ts" + +describe("cursor-stop-mapper", () => { + test("detects tokens in stop payload", () => { + expect(hasStopTokens({ input_tokens: 100, output_tokens: 50 })).toBe(true) + expect(hasStopTokens({})).toBe(false) + }) + + test("maps stop payload to CompletedUsage", () => { + const usage = toCompletedUsageFromStop( + { + generation_id: "gen-1", + input_tokens: 1000, + output_tokens: 200, + }, + "2026-09-09T00:00:00.000Z", + ) + + expect(usage).toEqual({ + receiptKey: "cursor-turn:gen-1", + eventId: "cursor-stop:gen-1", + tokenDelta: 1200, + cost: null, + createdAt: "2026-09-09T00:00:00.000Z", + }) + }) +}) diff --git a/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts b/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts new file mode 100644 index 0000000..bd06610 --- /dev/null +++ b/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts @@ -0,0 +1,44 @@ +import { afterEach, beforeEach, describe, expect, test } from "bun:test" +import { mkdir, mkdtemp, rm } from "node:fs/promises" +import { join } from "node:path" + +import { spawnPartner } from "@sbugallo/vpet-core/application/use-cases/spawn-partner.ts" +import { readSidebarSnapshot } from "../../src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts" +import { createSqliteVpetRepository } from "../../src/adapters/sqlite/sqlite-vpet-write-store.ts" + +type TempTestRoot = { readonly root: string; readonly appDataRoot: string } + +let tempRoot: TempTestRoot | undefined + +const createTempTestRoot = async (): Promise => { + const root = await mkdtemp(join(process.cwd(), ".tmp-cursor-vpet-persistence-")) + const appDataRoot = join(root, "app-data") + await mkdir(appDataRoot, { recursive: true }) + return { root, appDataRoot } +} + +beforeEach(async () => { + tempRoot = await createTempTestRoot() +}) + +afterEach(async () => { + if (tempRoot === undefined) return + await rm(tempRoot.root, { recursive: true, force: true }) + tempRoot = undefined +}) + +describe("sql.js vpet repository persistence", () => { + test("Given a spawned partner When reading the sidebar snapshot Then it returns the active partner", async () => { + if (tempRoot === undefined) throw new Error("Missing temp root.") + + const repository = await createSqliteVpetRepository({ appDataRoot: tempRoot.appDataRoot }) + try { + spawnPartner(repository, "2026-09-09T12:00:00.000Z") + const snapshot = await readSidebarSnapshot({ appDataRoot: tempRoot.appDataRoot }) + expect(snapshot?.currentNodeId).toBe("0-001") + expect(snapshot?.frozen).toBe(false) + } finally { + repository.close() + } + }) +}) diff --git a/packages/cursor-vpet/tests/sidebar-render.test.ts b/packages/cursor-vpet/tests/sidebar-render.test.ts new file mode 100644 index 0000000..478cbb6 --- /dev/null +++ b/packages/cursor-vpet/tests/sidebar-render.test.ts @@ -0,0 +1,57 @@ +import { describe, expect, test } from "bun:test" + +import { buildGaugeLine, buildNextCheckLine, toSidebarWebviewPayload } from "../src/webview/sidebar-render.ts" + +describe("sidebar render", () => { + test("builds next check bar for partner progress", () => { + const line = buildNextCheckLine({ + kind: "partner", + name: "Agumon", + sprite: "agumon", + stage: "Rookie", + stageNumber: 3, + url: "https://example.com", + gauge: 50, + threshold: 100, + isTerminal: false, + frozen: false, + isSetOverride: false, + }) + + expect(line).toBe("Next check: [██████████░░░░░░░░░░]") + }) + + test("maps partner model to static artwork payload", () => { + const payload = toSidebarWebviewPayload({ + kind: "partner", + name: "Agumon", + sprite: "agumon", + stage: "Rookie", + stageNumber: 3, + url: "https://example.com/agumon", + gauge: 10, + threshold: 100, + isTerminal: false, + frozen: false, + isSetOverride: false, + }) + + expect(payload.kind).toBe("partner") + if (payload.kind !== "partner") return + expect(payload.artwork.length).toBeGreaterThan(0) + expect(payload.artwork).not.toBe("agumon") + expect(buildGaugeLine({ + kind: "partner", + name: "Agumon", + sprite: "agumon", + stage: "Rookie", + stageNumber: 3, + url: "https://example.com/agumon", + gauge: 10, + threshold: 100, + isTerminal: false, + frozen: false, + isSetOverride: false, + })).toBe("10/100") + }) +}) diff --git a/packages/cursor-vpet/tsconfig.json b/packages/cursor-vpet/tsconfig.json new file mode 100644 index 0000000..c70bb19 --- /dev/null +++ b/packages/cursor-vpet/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "strict": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "target": "ESNext", + "lib": ["ESNext"], + "types": ["node", "vscode"], + "outDir": "dist", + "rootDir": "src", + "noEmit": true, + "skipLibCheck": true + }, + "include": ["src", "src/types"] +} diff --git a/packages/cursor-vpet/tsconfig.scripts.json b/packages/cursor-vpet/tsconfig.scripts.json new file mode 100644 index 0000000..b36d54c --- /dev/null +++ b/packages/cursor-vpet/tsconfig.scripts.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "strict": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "isolatedModules": true, + "target": "ESNext", + "lib": ["ESNext"], + "types": ["bun", "node"], + "noEmit": true, + "rootDir": "scripts", + "skipLibCheck": true + }, + "include": ["scripts/**/*.ts"] +} diff --git a/packages/opencode-vpet/LICENSE b/packages/opencode-vpet/LICENSE new file mode 100644 index 0000000..3d6428f --- /dev/null +++ b/packages/opencode-vpet/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or Object + form, made available under the License, as indicated by a copyright + notice that is included in or attached to the work (an example is + provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2026 Sergio Bugallo Enjamio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/opencode-vpet/README.md b/packages/opencode-vpet/README.md new file mode 100644 index 0000000..4f5db2a --- /dev/null +++ b/packages/opencode-vpet/README.md @@ -0,0 +1,832 @@ +
+ OpenCode VPet logo +

opencode-vpet

+

+ A Digimon virtual pet for OpenCode that evolves with usage. +

+

+ About | + Evolution | + Quick start | + Commands | + Settings | + Storage | + Partner list | + License | + Attributions + +

+
+ +--- + +## About + +
+ OpenCode VPet Overview +
+ +`@sbugallo/opencode-vpet` is an OpenCode v1 plugin that adds a Digimon virtual pet to your OpenCode TUI +sidebar. Your Digimon evolves as you use OpenCode, and you can browse your discoveries and +partner history. + +The plugin support multiple concurrent sessions, so every token counts to evolve your partner. + +There are more than 600 Digimon to discover, and the plugin is designed to be extensible so that new Digimon can be added in future releases. + +## Evolution + +Your active partner gains experience from the tokens reported for completed assistant +messages in OpenCode. This includes input, output, reasoning, and cache tokens. +Progress is shared across concurrent OpenCode sessions, so completed work in each +session contributes to the same partner. + +Each stage has a configurable experience threshold. When your partner reaches the +threshold for its current stage, it evolves and its experience gauge resets for the +next stage. Use `/vpet-freeze` to pause partner progression; usage while frozen is +not applied to your partner. + +The bundled evolution lines were extracted from the original V-Pets. When a Digimon +reaches an evolution threshold, the plugin randomly chooses one of the evolution +options in that Digimon's line. + +## Quick start + +Requirements: +- OpenCode `>=1.18.10` +- Node `>=20` to run `npx` +- Bun `>=1.3.5` only for local development + + +1. Install both plugins: + + ```sh + npx @sbugallo/opencode-vpet init + ``` + + The CLI delegates to `opencode plugin @sbugallo/opencode-vpet@ --global --force`. + It uses the package's installed exact version so OpenCode uses a version-specific cache key rather + than reusing a stale bare or `@latest` cache entry. `--force` replaces matching plugin + configuration registrations. + +2. Restart OpenCode when the command finishes. + +3. In OpenCode, run `/vpet-spawn` to hatch a partner. + +After that, use `/vpet-dex` to browse discoveries and `/vpet-history` to browse current and retired generations. + +--- + +## Commands + +| Command | Description | +| --- | --- | +| `/vpet-spawn` | Spawns a new egg. | +| `/vpet-freeze` | Pauses partner progression. | +| `/vpet-unfreeze` | Resumes partner progression. | +| `/vpet-set ` | Overrides the partner with the specified catalog ID. | +| `/vpet-dex` | Opens the partner Dex. | +| `/vpet-history` | Opens the partner History. | + +> [!NOTE] +> Using `/vpet-set` does not count for dex completion. + +## Update + +To update the plugin, run: + +```sh +npx @sbugallo/opencode-vpet update +``` + +Like `init`, `update` delegates to OpenCode's native global plugin installer with the installed exact +package version. If a legacy unscoped `opencode-vpet` registration is present, remove it manually. + +## Settings + +Settings are stored in `opencode-vpet.json` and control naming, notifications, and evolution +thresholds. + +The location of the settings file depends on your operating system: + +- Linux, WSL, and macOS: `~/.config/opencode-vpet.json` +- Windows: `%APPDATA%\opencode-vpet.json`, or `%USERPROFILE%\AppData\Roaming\opencode-vpet.json` + when `APPDATA` isn't set. + + +Available settings are: + +| Setting | Description | +| --- | --- | +| `notifications` | Enables or disables notifications. | +| `language` | Sets the naming convention. Valid values are `jp` (Japanese, e.g., Omegamon, Child, Adult...) and `en` (English, e.g., Omnimon, Rookie, Champion...). | +| `stageThresholds` | Defines the experience thresholds for each evolution stage. | + +Default values are: + +```json +{ + "notifications": true, + "language": "jp", + "stageThresholds": { + "egg": 500000, + "babyI": 1000000, + "babyII": 2000000, + "child": 4000000, + "adult": 7500000, + "perfect": 12500000, + "ultimate": 20000000, + "superUltimate": 30000000 + } +} +``` + +## Storage + +To persist your partner, history, and control state, VPet uses a SQLite database named `pet.db`. The location of the database depends on your operating system: + +- Linux, WSL: `~/.local/share/opencode-vpet/pet.db` +- macOS: `~/Library/Application Support/opencode-vpet/pet.db` +- Windows: `%APPDATA%\opencode-vpet\pet.db`, or `%USERPROFILE%\AppData\Roaming\opencode-vpet\pet.db` + when `APPDATA` isn't set. + +--- + +## Partner list + +| ID | Japanese name | English name | +| --- | --- | --- | +| 0-001 | Digitama | Digiegg | +| 1-001 | Algomon | Argomon | +| 1-002 | Botamon | Botamon | +| 1-003 | Chicomon | Chibomon | +| 1-004 | Choromon | Choromon | +| 1-005 | Cocomon | Conomon | +| 1-006 | Cotsucomon | Cotsucomon | +| 1-007 | Dodomon | Dodomon | +| 1-008 | Fufumon | Fufumon | +| 1-009 | Kiimon | Keemon | +| 1-010 | Ketomon | Ketomon | +| 1-011 | Kuramon | Kuramon | +| 1-012 | Mokumon | Mokumon | +| 1-013 | Nyokimon | Nyokimon | +| 1-014 | Bubbmon | Pabumon | +| 1-015 | Petitmon | Petitmon | +| 1-016 | Pitchmon | Pichimon | +| 1-017 | Poyomon | Poyomon | +| 1-018 | Punimon | Punimon | +| 1-019 | Pururumon | Pururumon | +| 1-020 | Puttimon | Puttimon | +| 1-021 | Sakumon | Sakumon | +| 1-022 | Tsubumon | Tsubumon | +| 1-023 | Yukimibotamon | YukimiBotamon | +| 1-024 | Yuramon | Yuramon | +| 1-025 | Zerimon | Zerimon | +| 1-026 | Zurumon | Zurumon | +| 1-027 | Chibickmon | Chibickmon | +| 1-028 | Dokimon | Dokimon | +| 1-029 | Jyarimon | Jyarimon | +| 1-030 | Relemon | Relemon | +| 1-031 | Sunamon | Sandmon | +| 2-001 | Algomon | Argomon | +| 2-002 | Babydmon | Bebydomon | +| 2-003 | Budmon | Budmon | +| 2-004 | Pukamon | Bukamon | +| 2-005 | PetiMeramon | DemiMeramon | +| 2-006 | Chibimon | DemiVeemon | +| 2-007 | Dorimon | Dorimon | +| 2-008 | Gummymon | Gummymon | +| 2-009 | Hopmon | Hopmon | +| 2-010 | Kakkinmon | Kakkinmon | +| 2-011 | Capromon | Kapurimon | +| 2-012 | Chocomon | Kokomon | +| 2-013 | Koromon | Koromon | +| 2-014 | Kyokyomon | Kyokyomon | +| 2-015 | Mochimon | Motimon | +| 2-016 | Nyaromon | Nyaromon | +| 2-017 | Pagumon | Pagumon | +| 2-018 | Poromon | Poromon | +| 2-019 | Sakuttomon | Sakuttomon | +| 2-020 | Tanemon | Tanemon | +| 2-021 | Tokomon | Tokomon | +| 2-022 | Tokomon X | Tokomon X | +| 2-023 | Tsumemon | Tsumemon | +| 2-024 | Tunomon | Tsunomon | +| 2-025 | Upamon | Upamon | +| 2-026 | Wanyamon | Wanyamon | +| 2-027 | Yarmon | Yaamon | +| 2-028 | Pyocomon | Yokomon | +| 2-029 | Bibimon | Bibimon | +| 2-030 | Gigimon | Gigimon | +| 2-031 | Goromon | Tumblemon | +| 2-032 | Hiyarimon | Hiyarimon | +| 2-033 | Minomon | Minomon | +| 2-034 | Moonmon | Moonmon | +| 2-035 | Pickmon | Pickmon | +| 2-036 | Pokomon | Viximon | +| 2-037 | Sunmon | Sunmon | +| 3-001 | Agumon | Agumon | +| 3-002 | Agumon (Black) X | Agumon (Black) X | +| 3-003 | Agumon Hakase | Agumon Expert | +| 3-004 | Agumon X | Agumon X | +| 3-005 | Algomon | Argomon | +| 3-006 | Armadimon | Armadillomon | +| 3-007 | Betamon | Betamon | +| 3-008 | Piyomon | Biyomon | +| 3-009 | Blucomon | Bulucomon | +| 3-010 | BushiAgumon | BushiAgumon | +| 3-011 | Candmon | Candlemon | +| 3-012 | Coronamon | Coronamon | +| 3-013 | Ganimon | Crabmon | +| 3-014 | PicoDevimon | DemiDevimon | +| 3-015 | DORUmon | Dorumon | +| 3-016 | Dracomon | Dracomon | +| 3-017 | Dracomon X | Dracomon X | +| 3-018 | Duskmon | Duskmon | +| 3-019 | Elecmon | Elecmon | +| 3-020 | Falcomon | Falcomon | +| 3-021 | Floramon | Floramon | +| 3-022 | Gabumon | Gabumon | +| 3-023 | Gabumon X | Gabumon X | +| 3-024 | Gaomon | Gaomon | +| 3-025 | Tailmon | Gatomon | +| 3-026 | Gazimon | Gazimon | +| 3-027 | Ghostmon | Ghostmon | +| 3-028 | Gizamon | Gizamon | +| 3-029 | Gomamon | Gomamon | +| 3-030 | Gomamon X | Gomamon X | +| 3-031 | Gottsumon | Gotsumon | +| 3-032 | Guilmon | Guilmon | +| 3-033 | Hagurumon | Hagurumon | +| 3-034 | Hawkmon | Hawkmon | +| 3-035 | Herissmon | Herissmon | +| 3-036 | Hackmon | Huckmon | +| 3-037 | Impmon | Impmon | +| 3-038 | Impmon X | Impmon X | +| 3-039 | Jazamon | Jazamon | +| 3-040 | Junkmon | Junkmon | +| 3-041 | Keramon X | Keramon X | +| 3-042 | Kokuwamon | Kokuwamon | +| 3-043 | Kokuwamon X | Kokuwamon X | +| 3-044 | Kunemon | Kunemon | +| 3-045 | Labramon | Labramon | +| 3-046 | Lalamon | Lalamon | +| 3-047 | Lopmon | Lopmon | +| 3-048 | Lopmon X | Lopmon X | +| 3-049 | Ludomon | Ludomon | +| 3-050 | Lunamon | Lunamon | +| 3-051 | Monodramon | Monodramon | +| 3-052 | Morphomon | Morphomon | +| 3-053 | Mushmon | Mushroomon | +| 3-054 | Otamamon | Otamamon | +| 3-055 | Otamamon X | Otamamon X | +| 3-056 | Palmon | Palmon | +| 3-057 | Palmon X | Palmon X | +| 3-058 | Patamon | Patamon | +| 3-059 | Phascomon | Phascomon | +| 3-060 | Pomumon | Pomumon | +| 3-061 | Renamon X | Renamon X | +| 3-062 | Ryudamon | Ryudamon | +| 3-063 | Plotmon | Salamon | +| 3-064 | Plotmon X | Salamon X | +| 3-065 | Sangomon | Sangomon | +| 3-066 | Shoutmon | Shoutmon | +| 3-067 | Sistermon Blanc | Sistermon Blanc | +| 3-068 | Sunarizamon | Sunarizamon | +| 3-069 | Swimmon | Swimmon | +| 3-070 | Shakomon | Syakomon | +| 3-071 | Shakomon X | Syakomon X | +| 3-072 | Bakumon | Tapirmon | +| 3-073 | Tentomon | Tentomon | +| 3-074 | Terriermon | Terriermon | +| 3-075 | Terriermon X | Terriermon X | +| 3-076 | Tinkermon | Tinkermon | +| 3-077 | ToyAgumon | ToyAgumon | +| 3-078 | V-mon | Veemon | +| 3-079 | Vorvomon | Vorvomon | +| 3-080 | Wormmon | Wormmon | +| 3-081 | Zubamon | Zubamon | +| 3-082 | Agumon (Black) | Agumon (Black) | +| 3-083 | Dracumon | Dracmon | +| 3-084 | Pulsemon | Pulsemon | +| 3-085 | Renamon | Renamon | +| 4-001 | Agnimon | Agunimon | +| 4-002 | Airdramon | Airdramon | +| 4-003 | Allomon X | Allomon X | +| 4-004 | Angemon | Angemon | +| 4-005 | Ankylomon | Ankylomon | +| 4-006 | Hanumon | Apemon | +| 4-007 | Aquilamon | Aquilamon | +| 4-008 | Algomon | Argomon | +| 4-009 | Arresterdramon | Arresterdramon | +| 4-010 | Baboongamon | Baboongamon | +| 4-011 | Bakemon | Bakemon | +| 4-012 | Baluchimon | Baluchimon | +| 4-013 | BaoHuckmon | BaoHuckmon | +| 4-014 | Birdramon | Birdramon | +| 4-015 | Centalmon | Centarumon | +| 4-016 | Clockmon | Clockmon | +| 4-017 | Coelamon | Coelamon | +| 4-018 | Coredramon (Blue) | Coredramon (Blue) | +| 4-019 | Coredramon (Green) | Coredramon (Green) | +| 4-020 | Cyclomon | Cyclonemon | +| 4-021 | Damemon | Damemon | +| 4-022 | Darcmon | Darcmon | +| 4-023 | DarkTyranomon | DarkTyrannomon | +| 4-024 | DarkTyranomon X | DarkTyrannomon X | +| 4-025 | Deltamon | Deltamon | +| 4-026 | Revolmon | Deputymon | +| 4-027 | Devidramon | Devidramon | +| 4-028 | Devimon | Devimon | +| 4-029 | Diatrymon | Diatrymon | +| 4-030 | Dobermon | Dobermon | +| 4-031 | Dokugumon | Dokugumon | +| 4-032 | Rukamon | Dolphmon | +| 4-033 | DORUgamon | Dorugamon | +| 4-034 | Drimogemon | Drimogemon | +| 4-035 | Duskmon | Duskmon | +| 4-036 | Ebidramon | Ebidramon | +| 4-037 | Eosmon | Eosmon | +| 4-038 | XV-mon | ExVeemon | +| 4-039 | Filmon | Filmon | +| 4-040 | Firamon | Firamon | +| 4-041 | FlareLizamon | Flarerizamon | +| 4-042 | Flymon | Flymon | +| 4-043 | Yukidarumon | Frigimon | +| 4-044 | Gaogamon | Gaogamon | +| 4-045 | Galgomon | Gargomon | +| 4-046 | Garurumon | Garurumon | +| 4-047 | Tailmon | Gatomon | +| 4-048 | Tailmon X | Gatomon X | +| 4-049 | Gekomon | Gekomon | +| 4-050 | GeoGreymon | GeoGreymon | +| 4-051 | Gesomon | Gesomon | +| 4-052 | Ginryumon | Ginryumon | +| 4-053 | Golemon | Golemon | +| 4-054 | Greymon | Greymon | +| 4-055 | Growmon | Growlmon | +| 4-056 | Growmon X | Growlmon X | +| 4-057 | Guardromon | Guardromon | +| 4-058 | Hookmon | Hookmon | +| 4-059 | Hudiemon | Hudiemon | +| 4-060 | Ikkakumon | Ikkakumon | +| 4-061 | Jazardmon | Jazardmon | +| 4-062 | Kabuterimon | Kabuterimon | +| 4-063 | Kiwimon | Kiwimon | +| 4-064 | Cockatrimon | Kokatorimon | +| 4-065 | Komondomon | Komondomon | +| 4-066 | Kuwagamon | Kuwagamon | +| 4-067 | Kuwagamon X | Kuwagamon X | +| 4-068 | Lavorvomon | Lavorvomon | +| 4-069 | Lekismon | Lekismon | +| 4-070 | Leomon | Leomon | +| 4-071 | Leomon X | Leomon X | +| 4-072 | Wolfmon | Lobomon | +| 4-073 | Machmon | Machmon | +| 4-074 | MadLeomon | MadLeomon | +| 4-075 | Manbomon | Manbomon | +| 4-076 | Mantaraymon X | Mantaraymon X | +| 4-077 | Meicoomon | Meicoomon | +| 4-078 | Mechanorimon | Mekanorimon | +| 4-079 | Meramon | Meramon | +| 4-080 | Meramon X | Meramon X | +| 4-081 | Mimicmon | Mimicmon | +| 4-082 | Minotaurmon | Minotarumon | +| 4-083 | Mojyamon | Mojyamon | +| 4-084 | Monochromon | Monochromon | +| 4-085 | Nanimon | Nanimon | +| 4-086 | Nefertimon X | Nefertimon X | +| 4-087 | Igamon | Ninjamon | +| 4-088 | Numemon | Numemon | +| 4-089 | Numemon X | Numemon X | +| 4-090 | Octmon | Octomon | +| 4-091 | Orgemon | Ogremon | +| 4-092 | Orgemon X | Ogremon X | +| 4-093 | Omekamon | Omekamon | +| 4-094 | Paledramon | Paledramon | +| 4-095 | Parasaurmon | Parasaurmon | +| 4-096 | Peckmon | Peckmon | +| 4-097 | Pegasmon X | Pegasusmon X | +| 4-098 | Petermon | Petermon | +| 4-099 | Porcupamon | Porcupamon | +| 4-100 | Pteranomon X | Pteramon X | +| 4-101 | Raremon | Raremon | +| 4-102 | RedVegimon | RedVegiemon | +| 4-103 | Reppamon | Reppamon | +| 4-104 | Rhinomon X | Rhinomon X | +| 4-105 | Gokimon | Roachmon | +| 4-106 | Sangloupmon | Sangloupmon | +| 4-107 | Seadramon | Seadramon | +| 4-108 | Seadramon X | Seadramon X | +| 4-109 | Siesamon X | Seasarmon X | +| 4-110 | Shadramon | Shadramon | +| 4-111 | Shellmon | Shellmon | +| 4-112 | KaratukiNumemon | ShellNumemon | +| 4-113 | Shoutmon X3 | Shoutmon X3 | +| 4-114 | Sistermon Ciel | Sistermon Ciel | +| 4-115 | Starmon | Starmon | +| 4-116 | Stingmon | Stingmon | +| 4-117 | Strikedramon | Strikedramon | +| 4-118 | Submarimon | Submarimon | +| 4-119 | Scumon | Sukamon | +| 4-120 | Sunflowmon | Sunflowmon | +| 4-121 | Tankmon | Tankmon | +| 4-122 | Targetmon | Targetmon | +| 4-123 | Thunderballmon | Thundermon | +| 4-124 | TiaLudomon | TiaLudomon | +| 4-125 | Tobiumon | Tobiumon | +| 4-126 | Tobucatmon | TobuCatmon | +| 4-127 | Togemon | Togemon | +| 4-128 | Togemon X | Togemon X | +| 4-129 | Tortamon | Tortomon | +| 4-130 | Troopmon | Troopmon | +| 4-131 | Turuiemon | Turuiemon | +| 4-132 | Tuskmon | Tuskmon | +| 4-133 | Tylomon | Tylomon | +| 4-134 | Tylomon X | Tylomon X | +| 4-135 | Tyranomon | Tyrannomon | +| 4-136 | Tyranomon X | Tyrannomon X | +| 4-137 | Unimon | Unimon | +| 4-138 | V-dramon | Veedramon | +| 4-139 | Vegimon | Vegiemon | +| 4-140 | Velgrmon | Velgrmon | +| 4-141 | Whamon | Whamon | +| 4-142 | Witchmon | Witchmon | +| 4-143 | Wizarmon | Wizardmon | +| 4-144 | Wizarmon X | Wizardmon X | +| 4-145 | Woodmon | Woodmon | +| 4-146 | Zubaeagermon | ZubaEagermon | +| 4-147 | Bulkmon | Bulkmon | +| 4-148 | Fugamon | Fugamon | +| 4-149 | Hyougamon | Hyogamon | +| 4-150 | Pidmon | Piddomon | +| 4-151 | Rhinomon | Rhinomon | +| 4-152 | Saberdramon | Saberdramon | +| 5-001 | AeroV-dramon | AeroVeedramon | +| 5-002 | Aldamon | Aldamon | +| 5-003 | Andromon | Andromon | +| 5-004 | Angewomon | Angewomon | +| 5-005 | Angewomon X | Angewomon X | +| 5-006 | Andiramon | Antylamon | +| 5-007 | Algomon | Argomon | +| 5-008 | Archnemon | Arukenimon | +| 5-009 | Astamon | Astamon | +| 5-010 | Asuramon | Asuramon | +| 5-011 | Baalmon | Baalmon | +| 5-012 | Beowolfmon | Beowolfmon | +| 5-013 | BigMamemon | BigMamemon | +| 5-014 | Blossomon | Blossomon | +| 5-015 | Valvemon | Bulbmon | +| 5-016 | Vritramon | BurningGreymon | +| 5-017 | CannonBeemon | CannonBeemon | +| 5-018 | Cerberumon | Cerberusmon | +| 5-019 | Cerberumon X | Cerberusmon X | +| 5-020 | Jyureimon | Cherrymon | +| 5-021 | Cho-Hakkaimon | Cho-Hakkaimon | +| 5-022 | Crescemon | Crescemon | +| 5-023 | Yatagaramon | Crowmon | +| 5-024 | CrysPaledramon | CrysPaledramon | +| 5-025 | Cyberdramon | Cyberdramon | +| 5-026 | Cyberdramon X | Cyberdramon X | +| 5-027 | DarkKnightmon | DarkKnightmon | +| 5-028 | Nanomon | Datamon | +| 5-029 | Delumon | Deramon | +| 5-030 | Digitamamon | Digitamamon | +| 5-031 | Dinobeemon | Dinobeemon | +| 5-032 | Hangyomon | Divermon | +| 5-033 | NeoDevimon | DoneDevimon | +| 5-034 | DORUguremon | DoruGreymon | +| 5-035 | Dagomon | Dragomon | +| 5-036 | Duramon | Duramon | +| 5-037 | Entmon | Entmon | +| 5-038 | Eosmon | Eosmon | +| 5-039 | Etemon | Etemon | +| 5-040 | Ex-Tyranomon | ExTyrannomon | +| 5-041 | Flaremon | Flaremon | +| 5-042 | Gerbemon | Garbagemon | +| 5-043 | Garudamon | Garudamon | +| 5-044 | Garudamon X | Garudamon X | +| 5-045 | Giromon | Giromon | +| 5-046 | Gogmamon | Gogmamon | +| 5-047 | Grademon | Grademon | +| 5-048 | Groundramon | Groundramon | +| 5-049 | Gusokumon | Gusokumon | +| 5-050 | Hippogriffomon | HippoGryphonmon | +| 5-051 | Hisyaryumon | Hisyaryumon | +| 5-052 | Jyagamon | Jagamon | +| 5-053 | KaiserLeomon | JagerLoweemon | +| 5-054 | Jazarichmon | Jazarichmon | +| 5-055 | Jewelbeemon | JewelBeemon | +| 5-056 | Garummon | KendoGarurumon | +| 5-057 | Chimairamon | Kimeramon | +| 5-058 | Knightmon | Knightmon | +| 5-059 | LadyDevimon | LadyDevimon | +| 5-060 | LadyDevimon X | LadyDevimon X | +| 5-061 | Lavogaritamon | Lavogaritamon | +| 5-062 | Lilamon | Lilamon | +| 5-063 | Lilimon | Lillymon | +| 5-064 | Lilimon X | Lillymon X | +| 5-065 | LoaderLeomon | LoaderLeomon | +| 5-066 | Locomon | Locomon | +| 5-067 | Lucemon: Falldown Mode | Lucemon: Chaos Mode | +| 5-068 | MachGaogamon | MachGaogamon | +| 5-069 | HolyAngemon | MagnaAngemon | +| 5-070 | Mamemon | Mamemon | +| 5-071 | Mamemon X | Mamemon X | +| 5-072 | Mametyramon | Mametyramon | +| 5-073 | Mammon | Mammothmon | +| 5-074 | Mammon X | Mammothmon X | +| 5-075 | Manticoremon | Manticoremon | +| 5-076 | MarinChimairamon | MarineChimairamon | +| 5-077 | MarinDevimon | MarineDevimon | +| 5-078 | Meicrackmon | Maycrackmon | +| 5-079 | Meicrackmon: Vicious Mode | Maycrackmon: Vicious Mode | +| 5-080 | Megadramon | Megadramon | +| 5-081 | AtlurKabuterimon | MegaKabuterimon (Red) | +| 5-082 | MegaSeadramon | MegaSeadramon | +| 5-083 | MegaSeadramon X | MegaSeadramon X | +| 5-084 | Mephismon X | Mephistomon X | +| 5-085 | Mermaimon | Mermaimon | +| 5-086 | MetalGreymon | MetalGreymon | +| 5-087 | MetalGreymon (Vaccine) | MetalGreymon (Vaccine) | +| 5-088 | MetalGreymon (Virus) | MetalGreymon (Virus) | +| 5-089 | MetalGreymon (Virus) X | MetalGreymon (Virus) X | +| 5-090 | MetalGreymon X | MetalGreymon X | +| 5-091 | MetalMamemon | MetalMamemon | +| 5-092 | MetalFantomon | MetalPhantomon | +| 5-093 | MetalTyranomon | MetalTyrannomon | +| 5-094 | MetalTyranomon X | MetalTyrannomon X | +| 5-095 | Monzaemon | Monzaemon | +| 5-096 | Monzaemon X | Monzaemon X | +| 5-097 | Mummymon | Mummymon | +| 5-098 | Vamdemon | Myotismon | +| 5-099 | Vamdemon X | Myotismon X | +| 5-100 | NeoDevimon | NeoDevimon | +| 5-101 | Okuwamon | Okuwamon | +| 5-102 | Okuwamon X | Okuwamon X | +| 5-103 | OmegaShoutmon X | OmniShoutmon X | +| 5-104 | Orochimon | Orochimon | +| 5-105 | Paildramon | Paildramon | +| 5-106 | Parrotmon | Parrotmon | +| 5-107 | Fantomon | Phantomon | +| 5-108 | Piranimon | Piranimon | +| 5-109 | Piccolomon | Piximon | +| 5-110 | Pumpmon | Pumpkinmon | +| 5-111 | RaijiLudomon | RaijiLudomon | +| 5-112 | Rapidmon | Rapidmon | +| 5-113 | Rebellimon | Rebellimon | +| 5-114 | Raihimon | Rhihimon | +| 5-115 | RizeGreymon | RizeGreymon | +| 5-116 | RizeGreymon X | RizeGreymon X | +| 5-117 | SaviorHackmon | SaviorHuckmon | +| 5-118 | Anomalocarimon | Scorpiomon | +| 5-119 | Anomalocarimon X | Scorpiomon X | +| 5-120 | Shakkoumon | Shakkoumon | +| 5-121 | TonosamaGekomon | ShogunGekomon | +| 5-122 | Shoutmon X5 | Shoutmon X5 | +| 5-123 | Silphymon | Silphymon | +| 5-124 | Sirenmon | Sirenmon | +| 5-125 | SkullBaluchimon | SkullBaluchimon | +| 5-126 | SkullGreymon | SkullGreymon | +| 5-127 | DeathMeramon | SkullMeramon | +| 5-128 | Stiffilmon | Stefilmon | +| 5-129 | Tekkamon | Tekkamon | +| 5-130 | Toropiamon | Toropiamon | +| 5-131 | Triceramon | Triceramon | +| 5-132 | Triceramon X | Triceramon X | +| 5-133 | Vademon | Vademon | +| 5-134 | Velgrmon | Velgrmon | +| 5-135 | MegaloGrowmon | WarGrowlmon | +| 5-136 | MegaloGrowmon X | WarGrowlmon X | +| 5-137 | WaruMonzaemon | WaruMonzaemon | +| 5-138 | WaruSeadramon | WaruSeadramon | +| 5-139 | WereGarurumon | WereGarurumon | +| 5-140 | WereGarurumon X | WereGarurumon X | +| 5-141 | Whamon | Whamon | +| 5-142 | Wingdramon | Wingdramon | +| 5-143 | Zudomon | Zudomon | +| 5-144 | Boutmon | Boutmon | +| 5-145 | DarkSuperStarmon | DarkSuperStarmon | +| 5-146 | DORUguremon | Doruguremon | +| 5-147 | Pandamon | Pandamon | +| 5-148 | Scorpiomon | SkullScorpiomon | +| 5-149 | SuperStarmon | SuperStarmon | +| 6-001 | Aegisdramon | Aegisdramon | +| 6-002 | Alphamon | Alphamon | +| 6-003 | AncientBeatmon | AncientBeetlemon | +| 6-004 | AncientGarurumon | AncientGarurumon | +| 6-005 | AncientGreymon | AncientGreymon | +| 6-006 | AncientIrismon | AncientKazemon | +| 6-007 | AncientMegatheriumon | AncientMegatheriummon | +| 6-008 | AncientMermaimon | AncientMermaimon | +| 6-009 | AncientSphinxmon | AncientSphinxmon | +| 6-010 | AncientTroiamon | AncientTroymon | +| 6-011 | AncientVolcamon | AncientVolcanomon | +| 6-012 | AncientWisemon | AncientWisemon | +| 6-013 | Anubimon | Anubismon | +| 6-014 | Apoclymon | Apocalymon | +| 6-015 | Apollomon | Apollomon | +| 6-016 | Algomon | Argomon | +| 6-017 | Armagemon | Armageddemon | +| 6-018 | Qinglongmon | Azulongmon | +| 6-019 | Bagramon | Bagramon | +| 6-020 | Baihumon | Baihumon | +| 6-021 | BanchoLeomon | BanchoLeomon | +| 6-022 | BanchoMamemon | BanchoMamemon | +| 6-023 | Barbamon | Barbamon | +| 6-024 | BeelStarmon X | BeelStarmon X | +| 6-025 | Beelzebumon | Beelzemon | +| 6-026 | Belphemon: Rage Mode | Belphemon: Rage Mode | +| 6-027 | BlackWarGreymon X | BlackWarGreymon X | +| 6-028 | BlitzGreymon | BlitzGreymon | +| 6-029 | Boltmon | Boltmon | +| 6-030 | Breakdramon | Breakdramon | +| 6-031 | BryweLudramon | BryweLudramon | +| 6-032 | Chaosdramon X | Chaosdramon X | +| 6-033 | Cherubimon (Virtue) | Cherubimon (Virtue) | +| 6-034 | Cherubimon (Virtue) X | Cherubimon (Virtue) X | +| 6-035 | Cherubimon (Vice) X | Cherubimon (Vice) X | +| 6-036 | Craniummon | Craniamon | +| 6-037 | Demon | Creepymon | +| 6-038 | CresGarurumon | CresGarurumon | +| 6-039 | Darkdramon | Darkdramon | +| 6-040 | DarkKnightmon X | DarkKnightmon X | +| 6-041 | Dianamon | Dianamon | +| 6-042 | Dinorexmon | Dinorexmon | +| 6-043 | Dinotigermon | Dinotigermon | +| 6-044 | Durandamon | Durandamon | +| 6-045 | Dynasmon | Dynasmon | +| 6-046 | Ebemon X | Ebemon X | +| 6-047 | Xuanwumon | Ebonwumon | +| 6-048 | KaiserGreymon | EmperorGreymon | +| 6-049 | Eosmon | Eosmon | +| 6-050 | Huanglongmon | Fanglongmon | +| 6-051 | Gaioumon | Gaiomon | +| 6-052 | Dukemon | Gallantmon | +| 6-053 | Dukemon X | Gallantmon X | +| 6-054 | Gankoomon | Gankoomon | +| 6-055 | Deathmon | Ghoulmon | +| 6-056 | GigaSeadramon | GigaSeadramon | +| 6-057 | Goddramon | Goldramon | +| 6-058 | Goddramon X | Goldramon X | +| 6-059 | GrandisKuwagamon | GrandisKuwagamon | +| 6-060 | GrandDracumon | GranDracmon | +| 6-061 | GranKuwagamon | GranKuwagamon | +| 6-062 | GrandLocomon | GroundLocomon | +| 6-063 | Griffomon | Gryphonmon | +| 6-064 | Gundramon | Gundramon | +| 6-065 | HeavyLeomon | HeavyLeomon | +| 6-066 | HerakleKabuterimon | HerculesKabuterimon | +| 6-067 | Hexeblaumon | Hexeblaumon | +| 6-068 | HiAndromon | HiAndromon | +| 6-069 | Jesmon | Jesmon | +| 6-070 | Justimon X | Justimon X | +| 6-071 | Justimon: Blitz Arm | Justimon: Blitz Arm | +| 6-072 | Sleipmon | Kentaurosmon | +| 6-073 | KingEtemon | KingEtemon | +| 6-074 | Duftmon | Leopardmon | +| 6-075 | Leviamon | Leviamon | +| 6-076 | Lilithmon | Lilithmon | +| 6-077 | LordKnightmon | LordKnightmon | +| 6-078 | Lotusmon | Lotosmon | +| 6-079 | Lucemon: Satan Mode | Lucemon: Satan Mode | +| 6-080 | Mugendramon | Machinedramon | +| 6-081 | Holydramon | Magnadramon | +| 6-082 | Holydramon X | Magnadramon X | +| 6-083 | MagnaGarurumon | MagnaGarurumon | +| 6-084 | Magnamon | Magnamon | +| 6-085 | BelialVamdemon | MaloMyotismon | +| 6-086 | MarinAngemon | MarineAngemon | +| 6-087 | SaintGalgomon | MegaGargomon | +| 6-088 | Megidramon | Megidramon | +| 6-089 | Megidramon X | Megidramon X | +| 6-090 | MetalEtemon | MetalEtemon | +| 6-091 | MetalGarurumon | MetalGarurumon | +| 6-092 | MetalGarurumon X | MetalGarurumon X | +| 6-093 | Metallicdramon | Metallicdramon | +| 6-094 | MetalPiranimon | MetalPiranimon | +| 6-095 | MetalSeadramon | MetalSeadramon | +| 6-096 | MirageGaogamon | MirageGaogamon | +| 6-097 | Murmukusmon | Murmukusmon | +| 6-098 | Nidhoggmon | Nidhoggmon | +| 6-099 | NoblePumpmon | NoblePumpkinmon | +| 6-100 | Ofanimon | Ophanimon | +| 6-101 | Ofanimon X | Ophanimon X | +| 6-102 | Ofanimon: Falldown Mode X | Ophanimon: Falldown Mode X | +| 6-103 | Ornismon | Ornismon | +| 6-104 | Ouryumon | Ouryumon | +| 6-105 | Hououmon | Phoenixmon | +| 6-106 | Hououmon X | Phoenixmon X | +| 6-107 | Piemon | Piedmon | +| 6-108 | PlatinumNumemon | PlatinumNumemon | +| 6-109 | Plesiomon | Plesiomon | +| 6-110 | Plesiomon X | Plesiomon X | +| 6-111 | PrinceMamemon X | PrinceMamemon X | +| 6-112 | Pukumon | Pukumon | +| 6-113 | Pinochimon | Puppetmon | +| 6-114 | Rafflesimon | Rafflesimon | +| 6-115 | Raguelmon | Raguelmon | +| 6-116 | Rapidmon X | Rapidmon X | +| 6-117 | Rasenmon | Rasenmon | +| 6-118 | Rasenmon: Fury Mode | Rasenmon: Fury Mode | +| 6-119 | Rasielmon | Rasielmon | +| 6-120 | Ravmon | Ravemon | +| 6-121 | Regalecusmon | Regalecusmon | +| 6-122 | Raihimon | Rhihimon | +| 6-123 | Rosemon | Rosemon | +| 6-124 | Rosemon X | Rosemon X | +| 6-125 | RustTyranomon | RustTyrannomon | +| 6-126 | SaberLeomon | SaberLeomon | +| 6-127 | Sakuyamon X | Sakuyamon X | +| 6-128 | Seraphimon | Seraphimon | +| 6-129 | ShineGreymon | ShineGreymon | +| 6-130 | SkullMammon | SkullMammothmon | +| 6-131 | SkullMammon X | SkullMammothmon X | +| 6-132 | SlashAngemon | SlashAngemon | +| 6-133 | Slayerdramon | Slayerdramon | +| 6-134 | Susanoomon | Susanomon | +| 6-135 | TigerVespamon | TigerVespamon | +| 6-136 | Titamon | Titamon | +| 6-137 | UlforceV-dramon | UlforceVeedramon | +| 6-138 | UltimateBrachiomon | UltimateBrachiomon | +| 6-139 | Valkyrimon | Valkyrimon | +| 6-140 | Valdurmon | Varodurumon | +| 6-141 | VenomVamdemon | VenomMyotismon | +| 6-142 | Volcanicdramon | Volcanicdramon | +| 6-143 | WarGreymon | WarGreymon | +| 6-144 | WarGreymon X | WarGreymon X | +| 6-145 | Zhuqiaomon | Zhuqiaomon | +| 6-146 | Vikemon | Vikemon | +| 6-147 | ShinMonzaemon | ShinMonzaemon | +| 6-148 | Kazuchimon | Kazuchimon | +| 6-149 | BanchoLilimon | BanchoLillymon | +| 6-150 | DORUgoramon | Dorugoramon | +| 7-001 | Alphamon: Ouryuken | Alphamon: Ouryuken | +| 7-002 | Armagemon | Armageddemon | +| 7-003 | Barbamon X | Barbamon X | +| 7-004 | Beelzebumon X | Beelzemon X | +| 7-005 | Beelzebumon: Blast Mode | Beelzemon: Blast Mode | +| 7-006 | Belphemon X | Belphemon X | +| 7-007 | Voltobautamon | Boltboutamon | +| 7-008 | Chaosmon | Chaosmon | +| 7-009 | Craniummon X | Craniamon X | +| 7-010 | Demon X | Creepymon X | +| 7-011 | DarknessBagramon | DarknessBagramon | +| 7-012 | Diablomon X | Diaboromon X | +| 7-013 | Dynasmon X | Dynasmon X | +| 7-014 | Examon | Examon | +| 7-015 | Examon X | Examon X | +| 7-016 | Dukemon X | Gallantmon X | +| 7-017 | Gankoomon X | Gankoomon X | +| 7-018 | GraceNovamon | GraceNovamon | +| 7-019 | Imperialdramon: Fighter Mode | Imperialdramon: Fighter Mode | +| 7-020 | Imperialdramon: Paladin Mode | Imperialdramon: Paladin Mode | +| 7-021 | Jesmon X | Jesmon X | +| 7-022 | Sleipmon X | Kentaurosmon X | +| 7-023 | Duftmon X | Leopardmon X | +| 7-024 | Leviamon X | Leviamon X | +| 7-025 | Lilithmon X | Lilithmon X | +| 7-026 | LordKnightmon X | LordKnightmon X | +| 7-027 | Lucemon X | Lucemon X | +| 7-028 | Magnamon X | Magnamon X | +| 7-029 | Mastemon | Mastemon | +| 7-030 | Minervamon X | Minervamon X | +| 7-031 | Ogudomon | Ogudomon | +| 7-032 | Omegamon | Omnimon | +| 7-033 | Omegamon Alter-S | Omnimon Alter-S | +| 7-034 | Omegamon X | Omnimon X | +| 7-035 | Ordinemon | Ordinemon | +| 7-036 | Rafflesimon | Rafflesimon | +| 7-037 | RagnaLordmon | RagnaLoardmon | +| 7-038 | Rasenmon | Rasenmon | +| 7-039 | RustTyranomon | RustTyrannomon | +| 7-040 | UlforceV-dramon X | UlforceVeedramon X | +| 7-041 | Agumon (Bond of Bravery) | Agumon (Bond of Bravery) | +| 7-042 | Gabumon (Bond of Friendship) | Gabumon (Bond of Friendship) | +| 7-043 | Jesmon GX | Jesmon GX | +| 7-044 | Ogudomon X | Ogudomon X | +| 7-045 | Chaosdramon | Chaosdramon | + +Check out the [Digimon Data List](packages/vpet-core/src/data/digimon-data.ts) for more information about evolution +lines. + +## License + +This project is licensed under the Apache License 2.0. See the [LICENSE](LICENSE) file for details. + +## Attributions + +The bundled sprites were derived from the following sources and were later edited and +processed for this project: + +- [sundeth/omnipet](https://github.com/sundeth/omnipet/tree/main) +- [Tortoiseshel's Full Color Digimon Dot Sprites post](https://withthewill.net/threads/full-color-digimon-dot-sprites.25843/) on the [With the Will forum](https://withthewill.net/members/tortoiseshel.4767/) diff --git a/src/adapters/sqlite/app-data-path.ts b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/app-data-path.ts similarity index 100% rename from src/adapters/sqlite/app-data-path.ts rename to packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/app-data-path.ts diff --git a/src/adapters/sqlite/sqlite-migrations.ts b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-migrations.ts similarity index 92% rename from src/adapters/sqlite/sqlite-migrations.ts rename to packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-migrations.ts index cfb2312..bae02d7 100644 --- a/src/adapters/sqlite/sqlite-migrations.ts +++ b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-migrations.ts @@ -1,10 +1,6 @@ -type QueryValue = string | number | null +import type { SqliteExecutor } from "../../ports/sqlite-executor.ts" -type SqliteMigrationExecutor = { - run: (sql: string, params?: readonly QueryValue[]) => void - all: >(sql: string, params?: readonly QueryValue[]) => readonly TRow[] - transaction: (operation: () => TReturn) => TReturn -} +type SqliteMigrationExecutor = Pick type Migration = { readonly version: number diff --git a/src/adapters/sqlite/sqlite-vpet-schema.ts b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-schema.ts similarity index 100% rename from src/adapters/sqlite/sqlite-vpet-schema.ts rename to packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-schema.ts diff --git a/src/adapters/sqlite/sqlite-vpet-types.ts b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-types.ts similarity index 100% rename from src/adapters/sqlite/sqlite-vpet-types.ts rename to packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-types.ts diff --git a/src/adapters/sqlite/sqlite-vpet-write-store.ts b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-write-store.ts similarity index 92% rename from src/adapters/sqlite/sqlite-vpet-write-store.ts rename to packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-write-store.ts index a8504fb..ac8382f 100644 --- a/src/adapters/sqlite/sqlite-vpet-write-store.ts +++ b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-write-store.ts @@ -1,8 +1,7 @@ import type { SpawnPartnerInput } from "../../application/models/spawn-partner.ts" import type { UsageReceiptMetadata } from "../../application/models/usage.ts" import type { Partner, PartnerProgression } from "../../domain/partner.ts" -import { resolveHostDatabasePath, type HostPathOptions } from "./app-data-path.ts" -import { createExecutor, openWritableDatabase } from "./bun-sqlite-driver.ts" +import type { SqliteExecutor } from "../../ports/sqlite-executor.ts" import { runMigrations } from "./sqlite-migrations.ts" import { ACTIVE_PARTNER_SELECT, @@ -20,7 +19,11 @@ import { } from "./sqlite-vpet-schema.ts" import type { SqliteVpetWriteStore } from "./sqlite-vpet-types.ts" -export type CreateSqliteVpetRepositoryOptions = HostPathOptions & { readonly databasePath?: string } +export type CreateSqliteVpetWriteStoreOptions = { + readonly databasePath: string + readonly executor: SqliteExecutor + readonly close: () => Promise | void +} type ControlStateRow = { readonly frozen: number @@ -31,21 +34,14 @@ type ReceiptLedgerRow = { readonly receipt_key: string } -export { resolveHostDatabasePath } -export type { PersistedPartnerEvent, SqliteVpetWriteStore } from "./sqlite-vpet-types.ts" - -export const createSqliteVpetRepository = async ( - options: CreateSqliteVpetRepositoryOptions = {}, -): Promise => { - const databasePath = options.databasePath ?? resolveHostDatabasePath(options) - const database = openWritableDatabase(databasePath) - const executor = createExecutor(database) +export const createSqliteVpetWriteStore = (options: CreateSqliteVpetWriteStoreOptions): SqliteVpetWriteStore => { + const { databasePath, executor, close } = options const appliedMigrations = runMigrations(executor) const store = { databasePath, async close() { - database.close() + await close() }, getAppliedMigrations() { return appliedMigrations diff --git a/src/application/models/sidebar-card-inputs.ts b/packages/opencode-vpet/build/vpet-core-src/application/models/sidebar-card-inputs.ts similarity index 100% rename from src/application/models/sidebar-card-inputs.ts rename to packages/opencode-vpet/build/vpet-core-src/application/models/sidebar-card-inputs.ts diff --git a/src/application/models/spawn-partner.ts b/packages/opencode-vpet/build/vpet-core-src/application/models/spawn-partner.ts similarity index 100% rename from src/application/models/spawn-partner.ts rename to packages/opencode-vpet/build/vpet-core-src/application/models/spawn-partner.ts diff --git a/src/application/models/usage.ts b/packages/opencode-vpet/build/vpet-core-src/application/models/usage.ts similarity index 100% rename from src/application/models/usage.ts rename to packages/opencode-vpet/build/vpet-core-src/application/models/usage.ts diff --git a/src/application/models/vpet-archive.ts b/packages/opencode-vpet/build/vpet-core-src/application/models/vpet-archive.ts similarity index 100% rename from src/application/models/vpet-archive.ts rename to packages/opencode-vpet/build/vpet-core-src/application/models/vpet-archive.ts diff --git a/src/application/models/vpet-control.ts b/packages/opencode-vpet/build/vpet-core-src/application/models/vpet-control.ts similarity index 100% rename from src/application/models/vpet-control.ts rename to packages/opencode-vpet/build/vpet-core-src/application/models/vpet-control.ts diff --git a/src/application/ports/partner-lifecycle.ts b/packages/opencode-vpet/build/vpet-core-src/application/ports/partner-lifecycle.ts similarity index 100% rename from src/application/ports/partner-lifecycle.ts rename to packages/opencode-vpet/build/vpet-core-src/application/ports/partner-lifecycle.ts diff --git a/src/application/ports/sidebar-snapshot.ts b/packages/opencode-vpet/build/vpet-core-src/application/ports/sidebar-snapshot.ts similarity index 100% rename from src/application/ports/sidebar-snapshot.ts rename to packages/opencode-vpet/build/vpet-core-src/application/ports/sidebar-snapshot.ts diff --git a/src/application/ports/usage-ledger.ts b/packages/opencode-vpet/build/vpet-core-src/application/ports/usage-ledger.ts similarity index 100% rename from src/application/ports/usage-ledger.ts rename to packages/opencode-vpet/build/vpet-core-src/application/ports/usage-ledger.ts diff --git a/src/application/ports/vpet-archive.ts b/packages/opencode-vpet/build/vpet-core-src/application/ports/vpet-archive.ts similarity index 100% rename from src/application/ports/vpet-archive.ts rename to packages/opencode-vpet/build/vpet-core-src/application/ports/vpet-archive.ts diff --git a/src/application/ports/vpet-control.ts b/packages/opencode-vpet/build/vpet-core-src/application/ports/vpet-control.ts similarity index 100% rename from src/application/ports/vpet-control.ts rename to packages/opencode-vpet/build/vpet-core-src/application/ports/vpet-control.ts diff --git a/src/application/use-cases/freeze-vpet.ts b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/freeze-vpet.ts similarity index 100% rename from src/application/use-cases/freeze-vpet.ts rename to packages/opencode-vpet/build/vpet-core-src/application/use-cases/freeze-vpet.ts diff --git a/src/application/use-cases/get-sidebar-card-inputs.ts b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/get-sidebar-card-inputs.ts similarity index 100% rename from src/application/use-cases/get-sidebar-card-inputs.ts rename to packages/opencode-vpet/build/vpet-core-src/application/use-cases/get-sidebar-card-inputs.ts diff --git a/src/application/use-cases/reconcile-usage.ts b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/reconcile-usage.ts similarity index 100% rename from src/application/use-cases/reconcile-usage.ts rename to packages/opencode-vpet/build/vpet-core-src/application/use-cases/reconcile-usage.ts diff --git a/src/application/use-cases/record-usage.ts b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/record-usage.ts similarity index 100% rename from src/application/use-cases/record-usage.ts rename to packages/opencode-vpet/build/vpet-core-src/application/use-cases/record-usage.ts diff --git a/src/application/use-cases/set-vpet-cheat-node.ts b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/set-vpet-cheat-node.ts similarity index 100% rename from src/application/use-cases/set-vpet-cheat-node.ts rename to packages/opencode-vpet/build/vpet-core-src/application/use-cases/set-vpet-cheat-node.ts diff --git a/src/application/use-cases/spawn-partner.ts b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/spawn-partner.ts similarity index 100% rename from src/application/use-cases/spawn-partner.ts rename to packages/opencode-vpet/build/vpet-core-src/application/use-cases/spawn-partner.ts diff --git a/src/application/use-cases/unfreeze-vpet.ts b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/unfreeze-vpet.ts similarity index 100% rename from src/application/use-cases/unfreeze-vpet.ts rename to packages/opencode-vpet/build/vpet-core-src/application/use-cases/unfreeze-vpet.ts diff --git a/src/config/defaults.ts b/packages/opencode-vpet/build/vpet-core-src/config/defaults.ts similarity index 100% rename from src/config/defaults.ts rename to packages/opencode-vpet/build/vpet-core-src/config/defaults.ts diff --git a/src/config/normalize.ts b/packages/opencode-vpet/build/vpet-core-src/config/normalize.ts similarity index 100% rename from src/config/normalize.ts rename to packages/opencode-vpet/build/vpet-core-src/config/normalize.ts diff --git a/src/config/types.ts b/packages/opencode-vpet/build/vpet-core-src/config/types.ts similarity index 100% rename from src/config/types.ts rename to packages/opencode-vpet/build/vpet-core-src/config/types.ts diff --git a/src/data/catalog.ts b/packages/opencode-vpet/build/vpet-core-src/data/catalog.ts similarity index 100% rename from src/data/catalog.ts rename to packages/opencode-vpet/build/vpet-core-src/data/catalog.ts diff --git a/src/data/digimon-data.ts b/packages/opencode-vpet/build/vpet-core-src/data/digimon-data.ts similarity index 100% rename from src/data/digimon-data.ts rename to packages/opencode-vpet/build/vpet-core-src/data/digimon-data.ts diff --git a/src/data/monster-frame-catalog.ts b/packages/opencode-vpet/build/vpet-core-src/data/monster-frame-catalog.ts similarity index 100% rename from src/data/monster-frame-catalog.ts rename to packages/opencode-vpet/build/vpet-core-src/data/monster-frame-catalog.ts diff --git a/src/data/monster-frame-data.ts b/packages/opencode-vpet/build/vpet-core-src/data/monster-frame-data.ts similarity index 100% rename from src/data/monster-frame-data.ts rename to packages/opencode-vpet/build/vpet-core-src/data/monster-frame-data.ts diff --git a/src/data/stages.ts b/packages/opencode-vpet/build/vpet-core-src/data/stages.ts similarity index 100% rename from src/data/stages.ts rename to packages/opencode-vpet/build/vpet-core-src/data/stages.ts diff --git a/src/domain/digimon-node.ts b/packages/opencode-vpet/build/vpet-core-src/domain/digimon-node.ts similarity index 100% rename from src/domain/digimon-node.ts rename to packages/opencode-vpet/build/vpet-core-src/domain/digimon-node.ts diff --git a/src/domain/evolution.ts b/packages/opencode-vpet/build/vpet-core-src/domain/evolution.ts similarity index 100% rename from src/domain/evolution.ts rename to packages/opencode-vpet/build/vpet-core-src/domain/evolution.ts diff --git a/src/domain/partner.ts b/packages/opencode-vpet/build/vpet-core-src/domain/partner.ts similarity index 100% rename from src/domain/partner.ts rename to packages/opencode-vpet/build/vpet-core-src/domain/partner.ts diff --git a/src/domain/stage.ts b/packages/opencode-vpet/build/vpet-core-src/domain/stage.ts similarity index 100% rename from src/domain/stage.ts rename to packages/opencode-vpet/build/vpet-core-src/domain/stage.ts diff --git a/packages/opencode-vpet/build/vpet-core-src/ports/sqlite-executor.ts b/packages/opencode-vpet/build/vpet-core-src/ports/sqlite-executor.ts new file mode 100644 index 0000000..7c71934 --- /dev/null +++ b/packages/opencode-vpet/build/vpet-core-src/ports/sqlite-executor.ts @@ -0,0 +1,8 @@ +export type QueryValue = string | number | boolean | null + +export type SqliteExecutor = { + run: (sql: string, params?: readonly QueryValue[]) => void + get: >(sql: string, params?: readonly QueryValue[]) => TRow | null + all: >(sql: string, params?: readonly QueryValue[]) => readonly TRow[] + transaction: (operation: () => TReturn) => TReturn +} diff --git a/src/tui/dex-view-model.ts b/packages/opencode-vpet/build/vpet-core-src/view-models/dex-view-model.ts similarity index 100% rename from src/tui/dex-view-model.ts rename to packages/opencode-vpet/build/vpet-core-src/view-models/dex-view-model.ts diff --git a/src/tui/history-view-model.ts b/packages/opencode-vpet/build/vpet-core-src/view-models/history-view-model.ts similarity index 100% rename from src/tui/history-view-model.ts rename to packages/opencode-vpet/build/vpet-core-src/view-models/history-view-model.ts diff --git a/src/tui/sidebar-view-model.ts b/packages/opencode-vpet/build/vpet-core-src/view-models/sidebar-view-model.ts similarity index 100% rename from src/tui/sidebar-view-model.ts rename to packages/opencode-vpet/build/vpet-core-src/view-models/sidebar-view-model.ts diff --git a/packages/opencode-vpet/bunfig.toml b/packages/opencode-vpet/bunfig.toml new file mode 100644 index 0000000..215183d --- /dev/null +++ b/packages/opencode-vpet/bunfig.toml @@ -0,0 +1,2 @@ +[test] +preload = ["@opentui/solid/preload"] diff --git a/packages/opencode-vpet/package.json b/packages/opencode-vpet/package.json new file mode 100644 index 0000000..5cf9783 --- /dev/null +++ b/packages/opencode-vpet/package.json @@ -0,0 +1,101 @@ +{ + "name": "@sbugallo/opencode-vpet", + "version": "0.2.0-dev.0", + "description": "An OpenCode virtual-pet plugin with /vpet-spawn, /vpet-freeze, /vpet-unfreeze, /vpet-set, /vpet-dex, and /vpet-history commands.", + "author": "Sergio Bugallo", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/sbugallo/opencode-vpet.git" + }, + "homepage": "https://github.com/sbugallo/opencode-vpet#readme", + "bugs": { + "url": "https://github.com/sbugallo/opencode-vpet/issues" + }, + "keywords": [ + "opencode", + "plugin", + "virtual-pet", + "vpet", + "tui" + ], + "publishConfig": { + "access": "public" + }, + "oc-plugin": [ + "server", + "tui" + ], + "packageManager": "bun@1.3.5", + "engines": { + "bun": "1.3.5", + "node": "24.11.0", + "opencode": ">=1.18.10" + }, + "main": "./dist/index.js", + "bin": { + "opencode-vpet": "./dist/cli.js" + }, + "dependencies": { + "@sbugallo/vpet-core": "workspace:*", + "solid-js": "^1.9.14" + }, + "devDependencies": { + "@biomejs/biome": "2.5.10", + "@opencode-ai/plugin": "^1.18.10", + "@opencode-ai/sdk": "^1.18.10", + "@opentui/core": "^0.4.5", + "@opentui/keymap": "^0.4.5", + "@opentui/solid": "^0.4.5", + "@types/bun": "1.3.14", + "@types/node": "24.10.1", + "@types/semver": "7.7.1", + "semver": "7.7.4", + "typescript": "5.9.3" + }, + "peerDependencies": { + "@opencode-ai/plugin": ">=1.18.10", + "@opentui/core": ">=0.4.5", + "@opentui/keymap": ">=0.4.5", + "@opentui/solid": ">=0.4.5" + }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + }, + "./server": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + }, + "./tui": { + "types": "./dist/tui.d.ts", + "import": "./dist/tui.js", + "default": "./dist/tui.js" + } + }, + "files": [ + "dist", + "README.md", + "LICENSE" + ], + "scripts": { + "test": "bun test", + "test:persistence": "bun test ./tests/persistence/sqlite-migrations.persistence.ts ./tests/persistence/sqlite-vpet-repository.persistence.ts ./tests/persistence/sqlite-vpet-control.persistence.ts ./tests/persistence/sqlite-usage-event-toast.persistence.test.ts", + "format": "biome format --write src tests scripts package.json", + "format:check": "biome format src tests scripts package.json", + "lint": "biome lint src tests scripts package.json", + "check": "biome ci src tests scripts package.json && bun run typecheck && bun run typecheck:scripts && bun run typecheck:tests", + "typecheck": "tsc --noEmit", + "typecheck:scripts": "tsc -p tsconfig.scripts.json --noEmit", + "typecheck:tests": "tsc -p tsconfig.test.json --noEmit", + "build": "bun scripts/build.ts", + "prepack": "bun scripts/prepack.ts", + "postpack": "bun scripts/postpack.ts", + "release:check": "bun run check && bun test && bun run test:persistence && npm pack --dry-run --json" + }, + "type": "module", + "types": "./dist/index.d.ts" +} diff --git a/scripts/build.ts b/packages/opencode-vpet/scripts/build.ts similarity index 61% rename from scripts/build.ts rename to packages/opencode-vpet/scripts/build.ts index e81b42e..ad9a8eb 100644 --- a/scripts/build.ts +++ b/packages/opencode-vpet/scripts/build.ts @@ -1,5 +1,9 @@ import { rm } from "node:fs/promises" +const stageSources = Bun.spawnSync(["bun", "scripts/stage-vpet-core-sources.ts"]) +if (stageSources.exitCode !== 0) { + throw new Error(new TextDecoder().decode(stageSources.stderr)) +} await rm("dist", { recursive: true, force: true }) const pluginResult = await Bun.build({ @@ -37,3 +41,13 @@ if (!pluginResult.success || !cliResult.success) { const declarations = Bun.spawnSync(["bunx", "tsc", "-p", "tsconfig.build.json"]) if (declarations.exitCode !== 0) throw new Error(new TextDecoder().decode(declarations.stderr)) + +const vpetCoreDeclarations = Bun.spawnSync(["bunx", "tsc", "-p", "tsconfig.vpet-core-declarations.json"]) +if (vpetCoreDeclarations.exitCode !== 0) { + throw new Error(new TextDecoder().decode(vpetCoreDeclarations.stderr)) +} + +const rewriteDeclarations = Bun.spawnSync(["bun", "scripts/rewrite-vpet-core-declarations.ts"]) +if (rewriteDeclarations.exitCode !== 0) { + throw new Error(new TextDecoder().decode(rewriteDeclarations.stderr)) +} diff --git a/packages/opencode-vpet/scripts/postpack.ts b/packages/opencode-vpet/scripts/postpack.ts new file mode 100644 index 0000000..4fef9ff --- /dev/null +++ b/packages/opencode-vpet/scripts/postpack.ts @@ -0,0 +1,13 @@ +import { readFile, rm } from "node:fs/promises" +import { resolve } from "node:path" + +import { restorePackageJson } from "./strip-workspace-deps.ts" + +const packageRoot = resolve(import.meta.dir, "..") +const backupPath = resolve(packageRoot, ".package.json.publish.bak") + +if (await Bun.file(backupPath).exists()) { + const originalSource = await readFile(backupPath, "utf8") + await restorePackageJson(packageRoot, originalSource) + await rm(backupPath, { force: true }) +} diff --git a/packages/opencode-vpet/scripts/prepack.ts b/packages/opencode-vpet/scripts/prepack.ts new file mode 100644 index 0000000..f611b2b --- /dev/null +++ b/packages/opencode-vpet/scripts/prepack.ts @@ -0,0 +1,62 @@ +import { rm, writeFile } from "node:fs/promises" +import { resolve } from "node:path" + +import { restorePackageJson, stripWorkspaceDependencies } from "./strip-workspace-deps.ts" + +type JsonObject = { readonly [key: string]: unknown } + +const isJsonObject = (value: unknown): value is JsonObject => + typeof value === "object" && value !== null && !Array.isArray(value) + +const collectPaths = (value: unknown, paths: Set): void => { + if (typeof value === "string") { + paths.add(value) + return + } + if (!isJsonObject(value)) return + for (const nestedValue of Object.values(value)) collectPaths(nestedValue, paths) +} + +const packageRoot = resolve(import.meta.dir, "..") +const backupPath = resolve(packageRoot, ".package.json.publish.bak") + +const originalSource = await stripWorkspaceDependencies(packageRoot) +if (!(await Bun.file(backupPath).exists())) { + await writeFile(backupPath, originalSource) +} + +try { + await Bun.$`bun run build` + + const packageJson: unknown = JSON.parse(await Bun.file(resolve(packageRoot, "package.json")).text()) + if (!isJsonObject(packageJson)) throw new Error("package.json must contain an object.") + + const publishedPaths = new Set() + collectPaths(packageJson.main, publishedPaths) + collectPaths(packageJson.types, publishedPaths) + collectPaths(packageJson.exports, publishedPaths) + collectPaths(packageJson.bin, publishedPaths) + + for (const publishedPath of publishedPaths) { + const artifactPath = resolve(packageRoot, publishedPath) + const artifact = Bun.file(artifactPath) + if (!(await artifact.exists()) || artifact.size === 0) { + throw new Error(`Published artifact is missing or empty: ${publishedPath}`) + } + } + + const binPaths = new Set() + collectPaths(packageJson.bin, binPaths) + const cliPath = binPaths.values().next().value + if (typeof cliPath !== "string") throw new Error("Package metadata does not define a bin path.") + + const cliResult = Bun.spawnSync(["node", resolve(packageRoot, cliPath), "--help"], { + stdout: "inherit", + stderr: "inherit", + }) + if (cliResult.exitCode !== 0) throw new Error(`Node CLI help failed: ${cliPath}`) +} catch (error) { + await restorePackageJson(packageRoot, originalSource) + await rm(backupPath, { force: true }) + throw error +} diff --git a/packages/opencode-vpet/scripts/rewrite-vpet-core-declarations.ts b/packages/opencode-vpet/scripts/rewrite-vpet-core-declarations.ts new file mode 100644 index 0000000..f46ddf6 --- /dev/null +++ b/packages/opencode-vpet/scripts/rewrite-vpet-core-declarations.ts @@ -0,0 +1,44 @@ +import { readdir, readFile, writeFile } from "node:fs/promises" +import { dirname, join, relative, resolve } from "node:path" + +const packageRoot = resolve(import.meta.dir, "..") +const distRoot = resolve(packageRoot, "dist") +const vpetCoreImportPattern = /(?<=(?:from|export)\s+["'])@sbugallo\/vpet-core\/([^"']+)(?=["'])/g + +const toPublishedSubpath = (importPath: string): string => importPath.replace(/\.ts$/, ".js") + +const rewriteImportPath = (filePath: string, importPath: string): string => { + const target = join(distRoot, "vpet-core", toPublishedSubpath(importPath)) + const relativePath = relative(dirname(filePath), target).replace(/\\/g, "/") + return relativePath.startsWith(".") ? relativePath : `./${relativePath}` +} + +const rewriteFile = async (filePath: string): Promise => { + const original = await readFile(filePath, "utf8") + const rewritten = original.replace(vpetCoreImportPattern, (_match, importPath: string) => + rewriteImportPath(filePath, importPath), + ) + if (rewritten !== original) { + await writeFile(filePath, rewritten) + } +} + +const walkDeclarationFiles = async (directory: string): Promise => { + const entries = await readdir(directory, { withFileTypes: true }) + const files: string[] = [] + for (const entry of entries) { + const entryPath = join(directory, entry.name) + if (entry.isDirectory()) { + if (entry.name === "vpet-core") continue + files.push(...(await walkDeclarationFiles(entryPath))) + continue + } + if (entry.name.endsWith(".d.ts")) files.push(entryPath) + } + return files +} + +const declarationFiles = await walkDeclarationFiles(distRoot) +for (const declarationFile of declarationFiles) { + await rewriteFile(declarationFile) +} diff --git a/packages/opencode-vpet/scripts/stage-vpet-core-sources.ts b/packages/opencode-vpet/scripts/stage-vpet-core-sources.ts new file mode 100644 index 0000000..b10fd7e --- /dev/null +++ b/packages/opencode-vpet/scripts/stage-vpet-core-sources.ts @@ -0,0 +1,14 @@ +import { existsSync } from "node:fs" +import { cp, rm } from "node:fs/promises" +import { resolve } from "node:path" + +const packageRoot = resolve(import.meta.dir, "..") +const workspaceSource = resolve(packageRoot, "../vpet-core/src") +const stagedSource = resolve(packageRoot, "build/vpet-core-src") + +if (existsSync(workspaceSource)) { + await rm(stagedSource, { recursive: true, force: true }) + await cp(workspaceSource, stagedSource, { recursive: true }) +} else if (!existsSync(stagedSource)) { + throw new Error("Missing vpet-core sources. Expected ../vpet-core/src or build/vpet-core-src.") +} diff --git a/packages/opencode-vpet/scripts/strip-workspace-deps.ts b/packages/opencode-vpet/scripts/strip-workspace-deps.ts new file mode 100644 index 0000000..736ffd5 --- /dev/null +++ b/packages/opencode-vpet/scripts/strip-workspace-deps.ts @@ -0,0 +1,39 @@ +import { readFile, writeFile } from "node:fs/promises" +import { resolve } from "node:path" + +type JsonObject = { readonly [key: string]: unknown } + +const isJsonObject = (value: unknown): value is JsonObject => + typeof value === "object" && value !== null && !Array.isArray(value) + +const withoutWorkspaceDependencies = (dependencies: unknown): JsonObject | undefined => { + if (!isJsonObject(dependencies)) return undefined + const filtered = Object.fromEntries( + Object.entries(dependencies).filter( + ([, version]) => typeof version !== "string" || !version.startsWith("workspace:"), + ), + ) + return Object.keys(filtered).length > 0 ? filtered : undefined +} + +export const stripWorkspaceDependencies = async (packageRoot: string): Promise => { + const packageJsonPath = resolve(packageRoot, "package.json") + const originalSource = await readFile(packageJsonPath, "utf8") + const packageMetadata = JSON.parse(originalSource) as JsonObject + if (!isJsonObject(packageMetadata)) throw new Error("package.json must contain an object.") + + const dependencies = withoutWorkspaceDependencies(packageMetadata.dependencies) + const publishMetadata = { ...packageMetadata } as Record + if (dependencies === undefined) { + delete publishMetadata.dependencies + } else { + publishMetadata.dependencies = dependencies + } + + await writeFile(packageJsonPath, `${JSON.stringify(publishMetadata, null, 2)}\n`) + return originalSource +} + +export const restorePackageJson = async (packageRoot: string, originalSource: string): Promise => { + await writeFile(resolve(packageRoot, "package.json"), originalSource) +} diff --git a/src/adapters/opencode/create-server-hooks.ts b/packages/opencode-vpet/src/adapters/opencode/create-server-hooks.ts similarity index 88% rename from src/adapters/opencode/create-server-hooks.ts rename to packages/opencode-vpet/src/adapters/opencode/create-server-hooks.ts index ea95956..5aea476 100644 --- a/src/adapters/opencode/create-server-hooks.ts +++ b/packages/opencode-vpet/src/adapters/opencode/create-server-hooks.ts @@ -5,16 +5,20 @@ import { runVpetSpawnCommand } from "../../commands/vpet-spawn.ts" import { runVpetSetCommand } from "../../commands/vpet-set.ts" import { runVpetUnfreezeCommand } from "../../commands/vpet-unfreeze.ts" import type { VpetCommandEvent } from "../../commands/vpet-command-result.ts" -import { loadDigimonCatalog } from "../../data/catalog.ts" -import type { VpetLanguage } from "../../config/types.ts" -import type { DigimonCatalog } from "../../data/catalog.ts" -import type { PartnerLifecycle } from "../../application/ports/partner-lifecycle.ts" -import type { UsageLedger } from "../../application/ports/usage-ledger.ts" -import type { VpetControl } from "../../application/ports/vpet-control.ts" -import type { UsageProcessingResult } from "../../application/models/usage.ts" -import { reconcileUsage } from "../../application/use-cases/reconcile-usage.ts" -import { recordUsage } from "../../application/use-cases/record-usage.ts" -import { STAGE_GAUGE_THRESHOLDS, type EvolutionSelector, type StageThresholds } from "../../domain/evolution.ts" +import { loadDigimonCatalog } from "@sbugallo/vpet-core/data/catalog.ts" +import type { VpetLanguage } from "@sbugallo/vpet-core/config/types.ts" +import type { DigimonCatalog } from "@sbugallo/vpet-core/data/catalog.ts" +import type { PartnerLifecycle } from "@sbugallo/vpet-core/application/ports/partner-lifecycle.ts" +import type { UsageLedger } from "@sbugallo/vpet-core/application/ports/usage-ledger.ts" +import type { VpetControl } from "@sbugallo/vpet-core/application/ports/vpet-control.ts" +import type { UsageProcessingResult } from "@sbugallo/vpet-core/application/models/usage.ts" +import { reconcileUsage } from "@sbugallo/vpet-core/application/use-cases/reconcile-usage.ts" +import { recordUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" +import { + STAGE_GAUGE_THRESHOLDS, + type EvolutionSelector, + type StageThresholds, +} from "@sbugallo/vpet-core/domain/evolution.ts" import type { SessionMessagesFetcher } from "./session-messages.ts" import { toCompletedUsageFromEvent, toCompletedUsageFromMessage } from "./usage-event-mapper.ts" import { formatVpetToast, type VpetToastEvent, type VpetToastNotifier } from "./vpet-toast.ts" diff --git a/src/adapters/opencode/session-messages.ts b/packages/opencode-vpet/src/adapters/opencode/session-messages.ts similarity index 100% rename from src/adapters/opencode/session-messages.ts rename to packages/opencode-vpet/src/adapters/opencode/session-messages.ts diff --git a/src/adapters/opencode/usage-event-mapper.ts b/packages/opencode-vpet/src/adapters/opencode/usage-event-mapper.ts similarity index 92% rename from src/adapters/opencode/usage-event-mapper.ts rename to packages/opencode-vpet/src/adapters/opencode/usage-event-mapper.ts index fc90b92..0a105a9 100644 --- a/src/adapters/opencode/usage-event-mapper.ts +++ b/packages/opencode-vpet/src/adapters/opencode/usage-event-mapper.ts @@ -1,6 +1,6 @@ import type { AssistantMessage, Event, Message } from "@opencode-ai/sdk" -import type { CompletedUsage } from "../../application/use-cases/record-usage.ts" +import type { CompletedUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" const isCompletedAssistantMessage = (message: Message): message is AssistantMessage => { return message.role === "assistant" && "time" in message && message.time.completed !== undefined diff --git a/src/adapters/opencode/vpet-toast.ts b/packages/opencode-vpet/src/adapters/opencode/vpet-toast.ts similarity index 95% rename from src/adapters/opencode/vpet-toast.ts rename to packages/opencode-vpet/src/adapters/opencode/vpet-toast.ts index beda2a6..819f860 100644 --- a/src/adapters/opencode/vpet-toast.ts +++ b/packages/opencode-vpet/src/adapters/opencode/vpet-toast.ts @@ -1,5 +1,5 @@ -import type { VpetLanguage } from "../../config/types.ts" -import type { DigimonCatalog, DigimonNode } from "../../data/catalog.ts" +import type { VpetLanguage } from "@sbugallo/vpet-core/config/types.ts" +import type { DigimonCatalog, DigimonNode } from "@sbugallo/vpet-core/data/catalog.ts" export type VpetToastPayload = Readonly<{ readonly title: string diff --git a/src/adapters/sqlite/bun-sqlite-driver.ts b/packages/opencode-vpet/src/adapters/sqlite/bun-sqlite-driver.ts similarity index 77% rename from src/adapters/sqlite/bun-sqlite-driver.ts rename to packages/opencode-vpet/src/adapters/sqlite/bun-sqlite-driver.ts index 094bc24..af1dcdf 100644 --- a/src/adapters/sqlite/bun-sqlite-driver.ts +++ b/packages/opencode-vpet/src/adapters/sqlite/bun-sqlite-driver.ts @@ -2,14 +2,9 @@ import { mkdirSync } from "node:fs" import { dirname } from "node:path" import { Database } from "bun:sqlite" -export type QueryValue = string | number | boolean | null +import type { QueryValue, SqliteExecutor } from "@sbugallo/vpet-core/ports/sqlite-executor.ts" -export type SqliteExecutor = { - run: (sql: string, params?: readonly QueryValue[]) => void - get: >(sql: string, params?: readonly QueryValue[]) => TRow | null - all: >(sql: string, params?: readonly QueryValue[]) => readonly TRow[] - transaction: (operation: () => TReturn) => TReturn -} +export type { QueryValue, SqliteExecutor } from "@sbugallo/vpet-core/ports/sqlite-executor.ts" export const createExecutor = (database: Database): SqliteExecutor => ({ run(sql, params = []) { diff --git a/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts b/packages/opencode-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts similarity index 89% rename from src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts rename to packages/opencode-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts index 115e367..ad545fa 100644 --- a/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts +++ b/packages/opencode-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts @@ -1,14 +1,14 @@ import { existsSync } from "node:fs" -import type { SidebarSnapshot, SidebarSnapshotReader } from "../../application/ports/sidebar-snapshot.ts" -import { resolveHostDatabasePath, type HostPathOptions } from "./app-data-path.ts" +import type { SidebarSnapshot, SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" +import { resolveHostDatabasePath, type HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" import { createExecutor, openReadonlyDatabase } from "./bun-sqlite-driver.ts" import { ACTIVE_PARTNER_SELECT, toPartner, type PersistedPartnerRow, type TrainerStateRow, -} from "./sqlite-vpet-schema.ts" +} from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-schema.ts" export type CreateSqliteSidebarSnapshotReaderOptions = HostPathOptions & { readonly databasePath?: string } diff --git a/src/adapters/sqlite/sqlite-vpet-archive-reader.ts b/packages/opencode-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts similarity index 87% rename from src/adapters/sqlite/sqlite-vpet-archive-reader.ts rename to packages/opencode-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts index d64076b..8acee45 100644 --- a/src/adapters/sqlite/sqlite-vpet-archive-reader.ts +++ b/packages/opencode-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts @@ -1,16 +1,20 @@ import { existsSync } from "node:fs" import { SQLiteError } from "bun:sqlite" -import type { VpetArchiveEvent, VpetArchivePartner, VpetArchiveResult } from "../../application/models/vpet-archive.ts" -import type { VpetArchiveReader } from "../../application/ports/vpet-archive.ts" -import { resolveHostDatabasePath, type HostPathOptions } from "./app-data-path.ts" +import type { + VpetArchiveEvent, + VpetArchivePartner, + VpetArchiveResult, +} from "@sbugallo/vpet-core/application/models/vpet-archive.ts" +import type { VpetArchiveReader } from "@sbugallo/vpet-core/application/ports/vpet-archive.ts" +import { resolveHostDatabasePath, type HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" import { createExecutor, openReadonlyDatabase, type SqliteExecutor } from "./bun-sqlite-driver.ts" import { ARCHIVE_PARTNER_EVENTS_SELECT, ARCHIVE_PARTNERS_SELECT, type PersistedPartnerEventRow, type PersistedPartnerRow, -} from "./sqlite-vpet-schema.ts" +} from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-schema.ts" export type CreateSqliteVpetArchiveReaderOptions = HostPathOptions & { readonly databasePath?: string } diff --git a/packages/opencode-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts b/packages/opencode-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts new file mode 100644 index 0000000..fe1f7c1 --- /dev/null +++ b/packages/opencode-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts @@ -0,0 +1,29 @@ +import type { SqliteVpetWriteStore } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-types.ts" +import { resolveHostDatabasePath, type HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" +import { createSqliteVpetWriteStore } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-write-store.ts" +import { createExecutor, openWritableDatabase } from "./bun-sqlite-driver.ts" + +export type CreateSqliteVpetRepositoryOptions = HostPathOptions & { readonly databasePath?: string } + +export { resolveHostDatabasePath } +export type { HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" +export type { + PersistedPartnerEvent, + SqliteVpetWriteStore, +} from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-types.ts" + +export const createSqliteVpetRepository = async ( + options: CreateSqliteVpetRepositoryOptions = {}, +): Promise => { + const databasePath = options.databasePath ?? resolveHostDatabasePath(options) + const database = openWritableDatabase(databasePath) + const executor = createExecutor(database) + + return createSqliteVpetWriteStore({ + databasePath, + executor, + close: () => { + database.close() + }, + }) +} diff --git a/src/cli.ts b/packages/opencode-vpet/src/cli.ts similarity index 100% rename from src/cli.ts rename to packages/opencode-vpet/src/cli.ts diff --git a/src/cli/install.ts b/packages/opencode-vpet/src/cli/install.ts similarity index 100% rename from src/cli/install.ts rename to packages/opencode-vpet/src/cli/install.ts diff --git a/src/commands/vpet-command-result.ts b/packages/opencode-vpet/src/commands/vpet-command-result.ts similarity index 100% rename from src/commands/vpet-command-result.ts rename to packages/opencode-vpet/src/commands/vpet-command-result.ts diff --git a/src/commands/vpet-freeze.ts b/packages/opencode-vpet/src/commands/vpet-freeze.ts similarity index 81% rename from src/commands/vpet-freeze.ts rename to packages/opencode-vpet/src/commands/vpet-freeze.ts index 337cbd6..af72b47 100644 --- a/src/commands/vpet-freeze.ts +++ b/packages/opencode-vpet/src/commands/vpet-freeze.ts @@ -1,5 +1,5 @@ -import type { VpetControl } from "../application/ports/vpet-control.ts" -import { freezeVpet } from "../application/use-cases/freeze-vpet.ts" +import type { VpetControl } from "@sbugallo/vpet-core/application/ports/vpet-control.ts" +import { freezeVpet } from "@sbugallo/vpet-core/application/use-cases/freeze-vpet.ts" import type { VpetCommandResult } from "./vpet-command-result.ts" export type VpetFreezeContext = { diff --git a/src/commands/vpet-set.ts b/packages/opencode-vpet/src/commands/vpet-set.ts similarity index 86% rename from src/commands/vpet-set.ts rename to packages/opencode-vpet/src/commands/vpet-set.ts index 3eb33c2..50ad975 100644 --- a/src/commands/vpet-set.ts +++ b/packages/opencode-vpet/src/commands/vpet-set.ts @@ -1,8 +1,8 @@ import type { Part } from "@opencode-ai/sdk" -import type { VpetControl } from "../application/ports/vpet-control.ts" -import { setVpetCheatNode } from "../application/use-cases/set-vpet-cheat-node.ts" -import type { DigimonCatalog } from "../data/catalog.ts" +import type { VpetControl } from "@sbugallo/vpet-core/application/ports/vpet-control.ts" +import { setVpetCheatNode } from "@sbugallo/vpet-core/application/use-cases/set-vpet-cheat-node.ts" +import type { DigimonCatalog } from "@sbugallo/vpet-core/data/catalog.ts" import type { VpetCommandResult } from "./vpet-command-result.ts" export type VpetSetContext = { diff --git a/src/commands/vpet-spawn.ts b/packages/opencode-vpet/src/commands/vpet-spawn.ts similarity index 79% rename from src/commands/vpet-spawn.ts rename to packages/opencode-vpet/src/commands/vpet-spawn.ts index 51fa9a5..e8bb863 100644 --- a/src/commands/vpet-spawn.ts +++ b/packages/opencode-vpet/src/commands/vpet-spawn.ts @@ -1,5 +1,5 @@ -import type { PartnerLifecycle } from "../application/ports/partner-lifecycle.ts" -import { spawnPartner } from "../application/use-cases/spawn-partner.ts" +import type { PartnerLifecycle } from "@sbugallo/vpet-core/application/ports/partner-lifecycle.ts" +import { spawnPartner } from "@sbugallo/vpet-core/application/use-cases/spawn-partner.ts" import type { VpetCommandResult } from "./vpet-command-result.ts" export type VpetSpawnContext = { diff --git a/src/commands/vpet-unfreeze.ts b/packages/opencode-vpet/src/commands/vpet-unfreeze.ts similarity index 81% rename from src/commands/vpet-unfreeze.ts rename to packages/opencode-vpet/src/commands/vpet-unfreeze.ts index 1383760..8ba9b1d 100644 --- a/src/commands/vpet-unfreeze.ts +++ b/packages/opencode-vpet/src/commands/vpet-unfreeze.ts @@ -1,5 +1,5 @@ -import type { VpetControl } from "../application/ports/vpet-control.ts" -import { unfreezeVpet } from "../application/use-cases/unfreeze-vpet.ts" +import type { VpetControl } from "@sbugallo/vpet-core/application/ports/vpet-control.ts" +import { unfreezeVpet } from "@sbugallo/vpet-core/application/use-cases/unfreeze-vpet.ts" import type { VpetCommandResult } from "./vpet-command-result.ts" export type VpetUnfreezeContext = { diff --git a/src/config/global-vpet-settings.ts b/packages/opencode-vpet/src/config/global-vpet-settings.ts similarity index 86% rename from src/config/global-vpet-settings.ts rename to packages/opencode-vpet/src/config/global-vpet-settings.ts index 5529952..77b495a 100644 --- a/src/config/global-vpet-settings.ts +++ b/packages/opencode-vpet/src/config/global-vpet-settings.ts @@ -3,9 +3,9 @@ import { readFile } from "node:fs/promises" import { homedir } from "node:os" import { join } from "node:path" -import { DEFAULT_VPET_SETTINGS } from "./defaults.ts" -import { normalizeVpetSettings } from "./normalize.ts" -import type { ResolvedVpetSettings } from "./types.ts" +import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" +import { normalizeVpetSettings } from "@sbugallo/vpet-core/config/normalize.ts" +import type { ResolvedVpetSettings } from "@sbugallo/vpet-core/config/types.ts" type PathApi = Readonly<{ join: (...paths: readonly string[]) => string diff --git a/src/index.ts b/packages/opencode-vpet/src/index.ts similarity index 86% rename from src/index.ts rename to packages/opencode-vpet/src/index.ts index e14b948..2de40c6 100644 --- a/src/index.ts +++ b/packages/opencode-vpet/src/index.ts @@ -5,11 +5,11 @@ import { createSessionMessagesFetcher } from "./adapters/opencode/session-messag import { createBestEffortVpetToastNotifier } from "./adapters/opencode/vpet-toast.ts" import { createSqliteVpetRepository } from "./adapters/sqlite/sqlite-vpet-write-store.ts" import { loadGlobalVpetSettings } from "./config/global-vpet-settings.ts" -import type { ResolvedVpetSettings } from "./config/types.ts" -import type { StageThresholds } from "./domain/evolution.ts" +import type { ResolvedVpetSettings } from "@sbugallo/vpet-core/config/types.ts" +import type { StageThresholds } from "@sbugallo/vpet-core/domain/evolution.ts" export { createCommandConfig } from "./adapters/opencode/create-server-hooks.ts" -export { DIGIMON_DATA } from "./data/digimon-data.js" -export type { DigimonId, DigimonRecord, DigimonStage } from "./data/digimon-data.js" +export { DIGIMON_DATA } from "@sbugallo/vpet-core/data/digimon-data.js" +export type { DigimonId, DigimonRecord, DigimonStage } from "@sbugallo/vpet-core/data/digimon-data.js" const getStringOption = (options: PluginOptions | undefined, name: string): string | undefined => { const value = options?.[name] diff --git a/src/tui.tsx b/packages/opencode-vpet/src/tui.tsx similarity index 93% rename from src/tui.tsx rename to packages/opencode-vpet/src/tui.tsx index c9a0583..2ca43af 100644 --- a/src/tui.tsx +++ b/packages/opencode-vpet/src/tui.tsx @@ -7,17 +7,17 @@ import { createSignal } from "solid-js" import { createSqliteSidebarSnapshotReader } from "./adapters/sqlite/sqlite-sidebar-snapshot-reader.ts" import { createSqliteVpetArchiveReader } from "./adapters/sqlite/sqlite-vpet-archive-reader.ts" -import type { SidebarCardInputs } from "./application/models/sidebar-card-inputs.ts" -import type { VpetArchiveReader } from "./application/ports/vpet-archive.ts" -import { getSidebarCardInputs } from "./application/use-cases/get-sidebar-card-inputs.ts" +import type { SidebarCardInputs } from "@sbugallo/vpet-core/application/models/sidebar-card-inputs.ts" +import type { VpetArchiveReader } from "@sbugallo/vpet-core/application/ports/vpet-archive.ts" +import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/get-sidebar-card-inputs.ts" import { loadGlobalVpetSettings } from "./config/global-vpet-settings.ts" -import type { ResolvedVpetSettings } from "./config/types.ts" -import { DIGIMON_CATALOG } from "./data/catalog.ts" -import { MONSTER_FRAME_CATALOG } from "./data/monster-frame-catalog.ts" +import type { ResolvedVpetSettings } from "@sbugallo/vpet-core/config/types.ts" +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { VpetSidebarCard } from "./tui/sidebar-card.tsx" import { MonsterAnimationController, type MonsterAnimationOutput } from "./tui/monster-animation.ts" import { createSidebarPollLoop } from "./tui/sidebar-poll-loop.ts" -import { buildSidebarCardModel } from "./tui/sidebar-view-model.ts" +import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" import { registerVpetCommandLayer } from "./tui/vpet-command-layer.tsx" const VISUAL_INTERVAL_MS = 500 diff --git a/src/tui/monster-action-policy.ts b/packages/opencode-vpet/src/tui/monster-action-policy.ts similarity index 94% rename from src/tui/monster-action-policy.ts rename to packages/opencode-vpet/src/tui/monster-action-policy.ts index cbe3d01..019b3d6 100644 --- a/src/tui/monster-action-policy.ts +++ b/packages/opencode-vpet/src/tui/monster-action-policy.ts @@ -1,4 +1,4 @@ -import type { MonsterFrameCatalog, MonsterFrameName } from "../data/monster-frame-catalog.ts" +import type { MonsterFrameCatalog, MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" export type CosmeticActionClip = readonly [MonsterFrameName, MonsterFrameName] export type SleepClip = readonly [MonsterFrameName, MonsterFrameName] diff --git a/src/tui/monster-animation.ts b/packages/opencode-vpet/src/tui/monster-animation.ts similarity index 98% rename from src/tui/monster-animation.ts rename to packages/opencode-vpet/src/tui/monster-animation.ts index caa222d..2454f9a 100644 --- a/src/tui/monster-animation.ts +++ b/packages/opencode-vpet/src/tui/monster-animation.ts @@ -1,4 +1,8 @@ -import type { MonsterFrame, MonsterFrameCatalog, MonsterFrameName } from "../data/monster-frame-catalog.ts" +import type { + MonsterFrame, + MonsterFrameCatalog, + MonsterFrameName, +} from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { resolveCosmeticActions, resolveSleepClip, diff --git a/src/tui/monster-artwork-mirror.ts b/packages/opencode-vpet/src/tui/monster-artwork-mirror.ts similarity index 96% rename from src/tui/monster-artwork-mirror.ts rename to packages/opencode-vpet/src/tui/monster-artwork-mirror.ts index 3a3a725..c67e3bf 100644 --- a/src/tui/monster-artwork-mirror.ts +++ b/packages/opencode-vpet/src/tui/monster-artwork-mirror.ts @@ -1,4 +1,4 @@ -import { MonsterFrame } from "../data/monster-frame-catalog.ts" +import { MonsterFrame } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" const FRAME_ROWS = 8 const FRAME_COLUMNS = 16 diff --git a/src/tui/monster-walking-policy.ts b/packages/opencode-vpet/src/tui/monster-walking-policy.ts similarity index 98% rename from src/tui/monster-walking-policy.ts rename to packages/opencode-vpet/src/tui/monster-walking-policy.ts index 49a61db..192401c 100644 --- a/src/tui/monster-walking-policy.ts +++ b/packages/opencode-vpet/src/tui/monster-walking-policy.ts @@ -1,4 +1,4 @@ -import type { MonsterFrameCatalog, MonsterFrameName } from "../data/monster-frame-catalog.ts" +import type { MonsterFrameCatalog, MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" export type WalkingFacing = "left" | "right" export type WalkFrame = "walk_1" | "walk_2" diff --git a/src/tui/open-in-browser.ts b/packages/opencode-vpet/src/tui/open-in-browser.ts similarity index 100% rename from src/tui/open-in-browser.ts rename to packages/opencode-vpet/src/tui/open-in-browser.ts diff --git a/src/tui/sidebar-card.tsx b/packages/opencode-vpet/src/tui/sidebar-card.tsx similarity index 98% rename from src/tui/sidebar-card.tsx rename to packages/opencode-vpet/src/tui/sidebar-card.tsx index 6a92926..54e895f 100644 --- a/src/tui/sidebar-card.tsx +++ b/packages/opencode-vpet/src/tui/sidebar-card.tsx @@ -4,7 +4,7 @@ import { createEffect, type Accessor } from "solid-js" import { openInBrowser } from "./open-in-browser.ts" import { mirrorMonsterFrame } from "./monster-artwork-mirror.ts" import type { MonsterAnimationOutput, MonsterAnimationResult } from "./monster-animation.ts" -import type { SidebarCardModel } from "./sidebar-view-model.ts" +import type { SidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" const ARTWORK_ROWS = 8 const ARTWORK_COLUMNS = 16 diff --git a/src/tui/sidebar-poll-loop.ts b/packages/opencode-vpet/src/tui/sidebar-poll-loop.ts similarity index 100% rename from src/tui/sidebar-poll-loop.ts rename to packages/opencode-vpet/src/tui/sidebar-poll-loop.ts diff --git a/src/tui/vpet-command-layer.tsx b/packages/opencode-vpet/src/tui/vpet-command-layer.tsx similarity index 83% rename from src/tui/vpet-command-layer.tsx rename to packages/opencode-vpet/src/tui/vpet-command-layer.tsx index 47fbe37..ab1664c 100644 --- a/src/tui/vpet-command-layer.tsx +++ b/packages/opencode-vpet/src/tui/vpet-command-layer.tsx @@ -1,12 +1,12 @@ /** @jsxImportSource @opentui/solid */ import type { TuiDialogStack, TuiKeymap, TuiTheme } from "@opencode-ai/plugin/tui" -import type { VpetArchiveResult } from "../application/models/vpet-archive.ts" -import type { VpetArchiveReader } from "../application/ports/vpet-archive.ts" -import type { ResolvedVpetSettings } from "../config/types.ts" -import type { DigimonCatalog } from "../data/catalog.ts" -import { buildDexViewModel } from "./dex-view-model.ts" -import { buildHistoryViewModel } from "./history-view-model.ts" +import type { VpetArchiveResult } from "@sbugallo/vpet-core/application/models/vpet-archive.ts" +import type { VpetArchiveReader } from "@sbugallo/vpet-core/application/ports/vpet-archive.ts" +import type { ResolvedVpetSettings } from "@sbugallo/vpet-core/config/types.ts" +import type { DigimonCatalog } from "@sbugallo/vpet-core/data/catalog.ts" +import { buildDexViewModel } from "@sbugallo/vpet-core/view-models/dex-view-model.ts" +import { buildHistoryViewModel } from "@sbugallo/vpet-core/view-models/history-view-model.ts" import { VpetDexDialog } from "./vpet-dex-dialog.tsx" import { VpetHistoryDialog } from "./vpet-history-dialog.tsx" diff --git a/src/tui/vpet-dex-dialog.tsx b/packages/opencode-vpet/src/tui/vpet-dex-dialog.tsx similarity index 97% rename from src/tui/vpet-dex-dialog.tsx rename to packages/opencode-vpet/src/tui/vpet-dex-dialog.tsx index 614ce09..267581f 100644 --- a/src/tui/vpet-dex-dialog.tsx +++ b/packages/opencode-vpet/src/tui/vpet-dex-dialog.tsx @@ -3,7 +3,7 @@ import { createTextAttributes, type KeyEvent, type ScrollBoxRenderable } from "@ import { For, createMemo } from "solid-js" import { useKeyboard, useTerminalDimensions } from "@opentui/solid" import type { TuiTheme } from "@opencode-ai/plugin/tui" -import type { DexRow, DexViewModel } from "./dex-view-model.ts" +import type { DexRow, DexViewModel } from "@sbugallo/vpet-core/view-models/dex-view-model.ts" export type VpetDexDialogTheme = { readonly current: Pick diff --git a/src/tui/vpet-history-dialog.tsx b/packages/opencode-vpet/src/tui/vpet-history-dialog.tsx similarity index 97% rename from src/tui/vpet-history-dialog.tsx rename to packages/opencode-vpet/src/tui/vpet-history-dialog.tsx index 2f17bea..e343e7a 100644 --- a/src/tui/vpet-history-dialog.tsx +++ b/packages/opencode-vpet/src/tui/vpet-history-dialog.tsx @@ -3,7 +3,7 @@ import { createTextAttributes, type KeyEvent, type ScrollBoxRenderable } from "@ import { For } from "solid-js" import { useKeyboard, useTerminalDimensions } from "@opentui/solid" import type { TuiTheme } from "@opencode-ai/plugin/tui" -import type { HistoryViewModel } from "./history-view-model.ts" +import type { HistoryViewModel } from "@sbugallo/vpet-core/view-models/history-view-model.ts" export type VpetHistoryDialogTheme = { readonly current: Pick diff --git a/tests/architecture-boundary-helpers.ts b/packages/opencode-vpet/tests/architecture-boundary-helpers.ts similarity index 98% rename from tests/architecture-boundary-helpers.ts rename to packages/opencode-vpet/tests/architecture-boundary-helpers.ts index 64de7e7..3378ee4 100644 --- a/tests/architecture-boundary-helpers.ts +++ b/packages/opencode-vpet/tests/architecture-boundary-helpers.ts @@ -25,6 +25,7 @@ export const FORBIDDEN_APPLICATION_IMPORTS = [ "/persistence/", "/runtime/", "/adapters/sqlite/", + "@sbugallo/vpet-core/adapters/", "/adapters/opencode/", "/tui/", "/commands/", @@ -40,6 +41,7 @@ export const FORBIDDEN_TUI_PRESENTATION_IMPORTS = [ "/persistence/", "/runtime/", "/adapters/sqlite/", + "@sbugallo/vpet-core/adapters/", "bun:sqlite", "sqlite-vpet-schema", "bun-sqlite-driver", @@ -51,6 +53,7 @@ export const FORBIDDEN_TUI_ANIMATION_IMPORTS = [ "/persistence/", "/runtime/", "/adapters/sqlite/", + "@sbugallo/vpet-core/adapters/", "bun:sqlite", ] as const export const FORBIDDEN_ADAPTER_IMPORTS = ["/tui/", "../tui.tsx", "../index.ts", "/persistence/", "/runtime/"] as const diff --git a/tests/architecture-boundary.test.ts b/packages/opencode-vpet/tests/architecture-boundary.test.ts similarity index 92% rename from tests/architecture-boundary.test.ts rename to packages/opencode-vpet/tests/architecture-boundary.test.ts index 94d14b8..a82383c 100644 --- a/tests/architecture-boundary.test.ts +++ b/packages/opencode-vpet/tests/architecture-boundary.test.ts @@ -98,9 +98,13 @@ describe("application architecture boundary", () => { findForbiddenImports("malformed.ts", 'import { broken\nimport "bun:sqlite"\n', FORBIDDEN_APPLICATION_IMPORTS), ).toEqual(["malformed.ts: bun:sqlite"])) test("Given the application source tree When scanned Then it contains no forbidden imports", async () => - expect(await scanApplicationImports(join(PROJECT_ROOT, "src", "application"))).toEqual([])) + expect(await scanApplicationImports(join(PROJECT_ROOT, "..", "vpet-core", "src", "application"))).toEqual([])) test("Given the application models When scanned Then they do not redeclare Partner core state", async () => - expect(await scanDuplicateCorePartnerDeclarations(join(PROJECT_ROOT, "src", "application", "models"))).toEqual([])) + expect( + await scanDuplicateCorePartnerDeclarations(join(PROJECT_ROOT, "..", "vpet-core", "src", "application", "models")), + ).toEqual([])) test("Given the application port tree When scanned Then it has no technical lifecycle contract", async () => - expect(await scanTechnicalLifecyclePorts(join(PROJECT_ROOT, "src", "application", "ports"))).toEqual([])) + expect( + await scanTechnicalLifecyclePorts(join(PROJECT_ROOT, "..", "vpet-core", "src", "application", "ports")), + ).toEqual([])) }) diff --git a/tests/catalog-evolution.test.ts b/packages/opencode-vpet/tests/catalog-evolution.test.ts similarity index 95% rename from tests/catalog-evolution.test.ts rename to packages/opencode-vpet/tests/catalog-evolution.test.ts index af386a9..24bafed 100644 --- a/tests/catalog-evolution.test.ts +++ b/packages/opencode-vpet/tests/catalog-evolution.test.ts @@ -1,11 +1,15 @@ import { describe, expect, test } from "bun:test" -import { loadDigimonCatalog, parseDigimonCatalog, type DigimonNode } from "../src/data/catalog.ts" -import { DIGIMON_DATA } from "../src/data/digimon-data.ts" -import type { DigimonNode as DomainDigimonNode } from "../src/domain/digimon-node.ts" -import { applyTokenProgress, STAGE_GAUGE_THRESHOLDS, type StageThresholds } from "../src/domain/evolution.ts" -import type { Partner, PartnerProgression } from "../src/domain/partner.ts" -import { DIGIMON_STAGES, isDigimonStage } from "../src/domain/stage.ts" +import { loadDigimonCatalog, parseDigimonCatalog, type DigimonNode } from "@sbugallo/vpet-core/data/catalog.ts" +import { DIGIMON_DATA } from "@sbugallo/vpet-core/data/digimon-data.ts" +import type { DigimonNode as DomainDigimonNode } from "@sbugallo/vpet-core/domain/digimon-node.ts" +import { + applyTokenProgress, + STAGE_GAUGE_THRESHOLDS, + type StageThresholds, +} from "@sbugallo/vpet-core/domain/evolution.ts" +import type { Partner, PartnerProgression } from "@sbugallo/vpet-core/domain/partner.ts" +import { DIGIMON_STAGES, isDigimonStage } from "@sbugallo/vpet-core/domain/stage.ts" const controlledCurrent: DigimonNode = { id: "controlled-current", diff --git a/tests/cli-config.test.ts b/packages/opencode-vpet/tests/cli-config.test.ts similarity index 100% rename from tests/cli-config.test.ts rename to packages/opencode-vpet/tests/cli-config.test.ts diff --git a/tests/config-loader.test.ts b/packages/opencode-vpet/tests/config-loader.test.ts similarity index 98% rename from tests/config-loader.test.ts rename to packages/opencode-vpet/tests/config-loader.test.ts index c28ff6d..8a7a252 100644 --- a/tests/config-loader.test.ts +++ b/packages/opencode-vpet/tests/config-loader.test.ts @@ -8,7 +8,7 @@ import { loadGlobalVpetSettingsSync, resolveGlobalVpetConfigPath, } from "../src/config/global-vpet-settings.ts" -import { DEFAULT_VPET_SETTINGS } from "../src/config/defaults.ts" +import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" const tempRoots: string[] = [] diff --git a/tests/config-settings.test.ts b/packages/opencode-vpet/tests/config-settings.test.ts similarity index 98% rename from tests/config-settings.test.ts rename to packages/opencode-vpet/tests/config-settings.test.ts index 1a78108..6855494 100644 --- a/tests/config-settings.test.ts +++ b/packages/opencode-vpet/tests/config-settings.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "bun:test" -import { normalizeVpetSettings } from "../src/config/normalize.ts" -import { STAGE_THRESHOLD_KEYS, VPET_LANGUAGES, type ResolvedVpetSettings } from "../src/config/types.ts" +import { normalizeVpetSettings } from "@sbugallo/vpet-core/config/normalize.ts" +import { STAGE_THRESHOLD_KEYS, VPET_LANGUAGES, type ResolvedVpetSettings } from "@sbugallo/vpet-core/config/types.ts" const expectedDefaults = { language: "jp", diff --git a/tests/dex-view-model.test.ts b/packages/opencode-vpet/tests/dex-view-model.test.ts similarity index 92% rename from tests/dex-view-model.test.ts rename to packages/opencode-vpet/tests/dex-view-model.test.ts index a6e5a94..e5a97dd 100644 --- a/tests/dex-view-model.test.ts +++ b/packages/opencode-vpet/tests/dex-view-model.test.ts @@ -1,8 +1,8 @@ import { describe, expect, test } from "bun:test" -import { DEFAULT_VPET_SETTINGS } from "../src/config/defaults.ts" -import { DIGIMON_CATALOG } from "../src/data/catalog.ts" -import { buildDexViewModel } from "../src/tui/dex-view-model.ts" +import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { buildDexViewModel } from "@sbugallo/vpet-core/view-models/dex-view-model.ts" const catalog = { nodes: [ diff --git a/tests/digimon-data.test.ts b/packages/opencode-vpet/tests/digimon-data.test.ts similarity index 96% rename from tests/digimon-data.test.ts rename to packages/opencode-vpet/tests/digimon-data.test.ts index 4fe215e..c009e66 100644 --- a/tests/digimon-data.test.ts +++ b/packages/opencode-vpet/tests/digimon-data.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import { DIGIMON_DATA } from "../src/data/digimon-data" +import { DIGIMON_DATA } from "@sbugallo/vpet-core/data/digimon-data" const RAW_RECORD_KEYS = ["id", "name_en", "name_jp", "next_evolutions", "sprite", "stage", "url"] diff --git a/tests/get-sidebar-card-inputs.test.ts b/packages/opencode-vpet/tests/get-sidebar-card-inputs.test.ts similarity index 93% rename from tests/get-sidebar-card-inputs.test.ts rename to packages/opencode-vpet/tests/get-sidebar-card-inputs.test.ts index 44b6693..22f56b1 100644 --- a/tests/get-sidebar-card-inputs.test.ts +++ b/packages/opencode-vpet/tests/get-sidebar-card-inputs.test.ts @@ -1,8 +1,8 @@ import { describe, expect, test } from "bun:test" -import type { DigimonCatalog, DigimonNode } from "../src/data/catalog.ts" -import type { SidebarSnapshotReader } from "../src/application/ports/sidebar-snapshot.ts" -import { getSidebarCardInputs } from "../src/application/use-cases/get-sidebar-card-inputs.ts" +import type { DigimonCatalog, DigimonNode } from "@sbugallo/vpet-core/data/catalog.ts" +import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" +import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/get-sidebar-card-inputs.ts" const agumon: DigimonNode = { id: "3-001", diff --git a/tests/hexagonal-boundary.test.ts b/packages/opencode-vpet/tests/hexagonal-boundary.test.ts similarity index 84% rename from tests/hexagonal-boundary.test.ts rename to packages/opencode-vpet/tests/hexagonal-boundary.test.ts index cac04e1..8601dea 100644 --- a/tests/hexagonal-boundary.test.ts +++ b/packages/opencode-vpet/tests/hexagonal-boundary.test.ts @@ -20,17 +20,17 @@ describe("hexagonal dependency direction", () => { test("Given domain fixtures importing data, config, application, and frameworks When scanned Then each exact violation is reported", async () => { const directory = await mkdtemp(join(tmpdir(), "opencode-vpet-domain-architecture-")) const fixtures = [ - ["data.ts", 'import type { DigimonCatalog } from "../data/catalog.ts"\n'], - ["config.ts", 'import type { ResolvedVpetSettings } from "../config/types.ts"\n'], - ["application.ts", 'import type { Partner } from "../application/models/partner.ts"\n'], + ["data.ts", 'import type { DigimonCatalog } from "@sbugallo/vpet-core/data/catalog.ts"\n'], + ["config.ts", 'import type { ResolvedVpetSettings } from "@sbugallo/vpet-core/config/types.ts"\n'], + ["application.ts", 'import type { Partner } from "@sbugallo/vpet-core/application/models/partner.ts"\n'], ["framework.ts", 'import type { Plugin } from "@opencode-ai/plugin"\n'], ] as const try { await Promise.all(fixtures.map(async ([name, source]) => writeFile(join(directory, name), source))) expect(await scanForbiddenImports(directory, FORBIDDEN_DOMAIN_IMPORTS)).toEqual([ - `${join(directory, "application.ts")}: ../application/models/partner.ts`, - `${join(directory, "config.ts")}: ../config/types.ts`, - `${join(directory, "data.ts")}: ../data/catalog.ts`, + `${join(directory, "application.ts")}: @sbugallo/vpet-core/application/models/partner.ts`, + `${join(directory, "config.ts")}: @sbugallo/vpet-core/config/types.ts`, + `${join(directory, "data.ts")}: @sbugallo/vpet-core/data/catalog.ts`, `${join(directory, "framework.ts")}: @opencode-ai/plugin`, ]) } finally { @@ -39,7 +39,9 @@ describe("hexagonal dependency direction", () => { expect(await Bun.file(directory).exists()).toBeFalse() }) test("Given the domain source tree When scanned Then it has no forbidden dependencies", async () => - expect(await scanForbiddenImports(join(PROJECT_ROOT, "src", "domain"), FORBIDDEN_DOMAIN_IMPORTS)).toEqual([])) + expect( + await scanForbiddenImports(join(PROJECT_ROOT, "..", "vpet-core", "src", "domain"), FORBIDDEN_DOMAIN_IMPORTS), + ).toEqual([])) test("Given the inner TUI source tree When scanned Then it has no persistence or SQLite dependencies", async () => expect(await scanTuiPresentationImports(join(PROJECT_ROOT, "src", "tui"))).toEqual([])) test("Given animation policy and mirror modules When scanned Then they remain TUI-private without domain, application, or SQLite dependencies", async () => { @@ -84,7 +86,9 @@ describe("hexagonal dependency direction", () => { test("Given the server hook composition When scanned Then it has no SQLite or application lifecycle port dependency", async () => { const hook = join(PROJECT_ROOT, "src", "adapters", "opencode", "create-server-hooks.ts") expect( - await Bun.file(join(PROJECT_ROOT, "src", "application", "ports", "resource-lifecycle.ts")).exists(), + await Bun.file( + join(PROJECT_ROOT, "..", "vpet-core", "src", "application", "ports", "resource-lifecycle.ts"), + ).exists(), ).toBeFalse() expect(findForbiddenImports(hook, await readFile(hook, "utf8"), FORBIDDEN_SERVER_HOOK_IMPORTS)).toEqual([]) }) diff --git a/tests/history-view-model.test.ts b/packages/opencode-vpet/tests/history-view-model.test.ts similarity index 93% rename from tests/history-view-model.test.ts rename to packages/opencode-vpet/tests/history-view-model.test.ts index c6cb208..437eebc 100644 --- a/tests/history-view-model.test.ts +++ b/packages/opencode-vpet/tests/history-view-model.test.ts @@ -1,8 +1,8 @@ import { describe, expect, test } from "bun:test" -import { DEFAULT_VPET_SETTINGS } from "../src/config/defaults.ts" -import type { DigimonNode } from "../src/domain/digimon-node.ts" -import { buildHistoryViewModel } from "../src/tui/history-view-model.ts" +import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" +import type { DigimonNode } from "@sbugallo/vpet-core/domain/digimon-node.ts" +import { buildHistoryViewModel } from "@sbugallo/vpet-core/view-models/history-view-model.ts" const eggNode: DigimonNode = { id: "0-001", diff --git a/tests/monster-animation-actions.test.ts b/packages/opencode-vpet/tests/monster-animation-actions.test.ts similarity index 98% rename from tests/monster-animation-actions.test.ts rename to packages/opencode-vpet/tests/monster-animation-actions.test.ts index 01a72a7..f54b673 100644 --- a/tests/monster-animation-actions.test.ts +++ b/packages/opencode-vpet/tests/monster-animation-actions.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "bun:test" -import type { MonsterFrameName } from "../src/data/monster-frame-catalog.ts" +import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { MonsterAnimationController } from "../src/tui/monster-animation.ts" import { catalogFor, diff --git a/tests/monster-animation-test-utils.ts b/packages/opencode-vpet/tests/monster-animation-test-utils.ts similarity index 93% rename from tests/monster-animation-test-utils.ts rename to packages/opencode-vpet/tests/monster-animation-test-utils.ts index e34c0d2..819f58f 100644 --- a/tests/monster-animation-test-utils.ts +++ b/packages/opencode-vpet/tests/monster-animation-test-utils.ts @@ -1,4 +1,8 @@ -import { MonsterFrame, MonsterFrameCatalog, type MonsterFrameName } from "../src/data/monster-frame-catalog.ts" +import { + MonsterFrame, + MonsterFrameCatalog, + type MonsterFrameName, +} from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { MonsterAnimationController, type MonsterAnimationEvent, diff --git a/tests/monster-animation-walking.test.ts b/packages/opencode-vpet/tests/monster-animation-walking.test.ts similarity index 100% rename from tests/monster-animation-walking.test.ts rename to packages/opencode-vpet/tests/monster-animation-walking.test.ts diff --git a/tests/monster-animation.test.ts b/packages/opencode-vpet/tests/monster-animation.test.ts similarity index 98% rename from tests/monster-animation.test.ts rename to packages/opencode-vpet/tests/monster-animation.test.ts index 0483089..157c84f 100644 --- a/tests/monster-animation.test.ts +++ b/packages/opencode-vpet/tests/monster-animation.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "bun:test" -import { MonsterFrame } from "../src/data/monster-frame-catalog.ts" +import { MonsterFrame } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { MonsterAnimationController } from "../src/tui/monster-animation.ts" import { catalogFor, frameContent, partnerChanged } from "./monster-animation-test-utils.ts" diff --git a/tests/monster-artwork-mirror.test.ts b/packages/opencode-vpet/tests/monster-artwork-mirror.test.ts similarity index 96% rename from tests/monster-artwork-mirror.test.ts rename to packages/opencode-vpet/tests/monster-artwork-mirror.test.ts index 7882f0e..69ce8ec 100644 --- a/tests/monster-artwork-mirror.test.ts +++ b/packages/opencode-vpet/tests/monster-artwork-mirror.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "bun:test" -import { MonsterFrame, MONSTER_FRAME_CATALOG } from "../src/data/monster-frame-catalog.ts" -import { MONSTER_FRAME_DATA } from "../src/data/monster-frame-data.ts" +import { MonsterFrame, MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { MONSTER_FRAME_DATA } from "@sbugallo/vpet-core/data/monster-frame-data.ts" import { mirrorMonsterFrame } from "../src/tui/monster-artwork-mirror.ts" const AGUMON_WALK_1_MIRROR = diff --git a/tests/monster-frame-catalog.test.ts b/packages/opencode-vpet/tests/monster-frame-catalog.test.ts similarity index 97% rename from tests/monster-frame-catalog.test.ts rename to packages/opencode-vpet/tests/monster-frame-catalog.test.ts index 3236e47..7853be1 100644 --- a/tests/monster-frame-catalog.test.ts +++ b/packages/opencode-vpet/tests/monster-frame-catalog.test.ts @@ -6,7 +6,7 @@ import { MonsterFrameCatalog, STANDARD_ANIMATION_SEQUENCE, type MonsterFrameName, -} from "../src/data/monster-frame-catalog.ts" +} from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" type Equal = (() => Value extends Left ? 1 : 2) extends () => Value extends Right ? 1 : 2 ? true : false diff --git a/tests/monster-frame-data.test.ts b/packages/opencode-vpet/tests/monster-frame-data.test.ts similarity index 95% rename from tests/monster-frame-data.test.ts rename to packages/opencode-vpet/tests/monster-frame-data.test.ts index 526e534..64a65ef 100644 --- a/tests/monster-frame-data.test.ts +++ b/packages/opencode-vpet/tests/monster-frame-data.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "bun:test" -import { MONSTER_FRAME_CATALOG } from "../src/data/monster-frame-catalog.ts" -import { MONSTER_FRAME_DATA } from "../src/data/monster-frame-data.ts" +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { MONSTER_FRAME_DATA } from "@sbugallo/vpet-core/data/monster-frame-data.ts" const AGUMON_WALK_1 = " ▄▄▄▄▄ \n ▄█ ▄▄ ▀▄ \n ▄▀▀ ▄██ ▀▄ \n ▀█▀▀ █ \n ▀██▀▀ ▄ █ \n █▄█ █▄▄ █ \n ▄▄▀▀▄▄▄▄▀ █ \n █▄█▄▄█ █▄█▄█▄█" diff --git a/tests/package-fixture.ts b/packages/opencode-vpet/tests/package-fixture.ts similarity index 96% rename from tests/package-fixture.ts rename to packages/opencode-vpet/tests/package-fixture.ts index 8209e7b..628227e 100644 --- a/tests/package-fixture.ts +++ b/packages/opencode-vpet/tests/package-fixture.ts @@ -5,7 +5,7 @@ import { fileURLToPath } from "node:url" const PROJECT_ROOT = fileURLToPath(new URL("../", import.meta.url)) const REQUIRED_ARTIFACTS = ["index.js", "index.d.ts", "tui.js", "tui.d.ts", "cli.js"] as const -const EXCLUDED_COPY_DIRECTORIES = new Set([".git", ".omo", "dist", "node_modules"]) +const EXCLUDED_COPY_DIRECTORIES = new Set([".git", ".omo", "node_modules"]) export type PackageFixture = { readonly root: string @@ -37,6 +37,10 @@ const copyPackage = async (root: string): Promise => { recursive: true, filter: (source) => !EXCLUDED_COPY_DIRECTORIES.has(basename(source)), }) + await cp(join(PROJECT_ROOT, "../vpet-core"), join(packageDirectory, "../vpet-core"), { + recursive: true, + filter: (source) => !EXCLUDED_COPY_DIRECTORIES.has(basename(source)), + }) await symlink(join(PROJECT_ROOT, "node_modules"), join(packageDirectory, "node_modules"), "dir") return packageDirectory } diff --git a/tests/persistence/sqlite-migrations.persistence.ts b/packages/opencode-vpet/tests/persistence/sqlite-migrations.persistence.ts similarity index 98% rename from tests/persistence/sqlite-migrations.persistence.ts rename to packages/opencode-vpet/tests/persistence/sqlite-migrations.persistence.ts index 75b6b56..63bf471 100644 --- a/tests/persistence/sqlite-migrations.persistence.ts +++ b/packages/opencode-vpet/tests/persistence/sqlite-migrations.persistence.ts @@ -5,7 +5,7 @@ import { join } from "node:path" import { Database } from "bun:sqlite" import { createExecutor } from "../../src/adapters/sqlite/bun-sqlite-driver.ts" -import { runMigrations } from "../../src/adapters/sqlite/sqlite-migrations.ts" +import { runMigrations } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-migrations.ts" import { isBunSqliteAvailable } from "../sqlite-capability.ts" type QueryValue = string | number | null diff --git a/tests/persistence/sqlite-usage-event-toast.persistence.test.ts b/packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts similarity index 98% rename from tests/persistence/sqlite-usage-event-toast.persistence.test.ts rename to packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts index efaa6be..ff2ef3d 100644 --- a/tests/persistence/sqlite-usage-event-toast.persistence.test.ts +++ b/packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts @@ -3,8 +3,8 @@ import type { AssistantMessage, Event } from "@opencode-ai/sdk" import { createServerHooks } from "../../src/adapters/opencode/create-server-hooks.ts" import type { VpetToastPayload } from "../../src/adapters/opencode/vpet-toast.ts" -import { DIGIMON_CATALOG } from "../../src/data/catalog.ts" -import { STAGE_GAUGE_THRESHOLDS } from "../../src/domain/evolution.ts" +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { STAGE_GAUGE_THRESHOLDS } from "@sbugallo/vpet-core/domain/evolution.ts" import { createSqliteVpetRepository } from "../../src/adapters/sqlite/sqlite-vpet-write-store.ts" import { isBunSqliteAvailable } from "../sqlite-capability.ts" import { createTempTestRoot, removeTempTestRoot, spawn, type TempTestRoot } from "./sqlite-vpet-repository.fixtures.ts" diff --git a/tests/persistence/sqlite-vpet-archive-history.persistence.ts b/packages/opencode-vpet/tests/persistence/sqlite-vpet-archive-history.persistence.ts similarity index 94% rename from tests/persistence/sqlite-vpet-archive-history.persistence.ts rename to packages/opencode-vpet/tests/persistence/sqlite-vpet-archive-history.persistence.ts index 67dbf8e..38dbf32 100644 --- a/tests/persistence/sqlite-vpet-archive-history.persistence.ts +++ b/packages/opencode-vpet/tests/persistence/sqlite-vpet-archive-history.persistence.ts @@ -5,12 +5,12 @@ import { createSqliteVpetArchiveReader } from "../../src/adapters/sqlite/sqlite- import { openWritableDatabase } from "../../src/adapters/sqlite/bun-sqlite-driver.ts" import { createSqliteVpetRepository } from "../../src/adapters/sqlite/sqlite-vpet-write-store.ts" import { runVpetSetCommand } from "../../src/commands/vpet-set.ts" -import { DEFAULT_VPET_SETTINGS } from "../../src/config/defaults.ts" -import type { ResolvedVpetSettings } from "../../src/config/types.ts" -import type { DigimonCatalog } from "../../src/data/catalog.ts" -import type { DigimonNode } from "../../src/domain/digimon-node.ts" -import { buildDexViewModel } from "../../src/tui/dex-view-model.ts" -import { buildHistoryViewModel } from "../../src/tui/history-view-model.ts" +import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" +import type { ResolvedVpetSettings } from "@sbugallo/vpet-core/config/types.ts" +import type { DigimonCatalog } from "@sbugallo/vpet-core/data/catalog.ts" +import type { DigimonNode } from "@sbugallo/vpet-core/domain/digimon-node.ts" +import { buildDexViewModel } from "@sbugallo/vpet-core/view-models/dex-view-model.ts" +import { buildHistoryViewModel } from "@sbugallo/vpet-core/view-models/history-view-model.ts" import { isBunSqliteAvailable } from "../sqlite-capability.ts" import { applyReceipt, diff --git a/tests/persistence/sqlite-vpet-control.persistence.ts b/packages/opencode-vpet/tests/persistence/sqlite-vpet-control.persistence.ts similarity index 100% rename from tests/persistence/sqlite-vpet-control.persistence.ts rename to packages/opencode-vpet/tests/persistence/sqlite-vpet-control.persistence.ts diff --git a/tests/persistence/sqlite-vpet-repository.control-ledger.persistence.ts b/packages/opencode-vpet/tests/persistence/sqlite-vpet-repository.control-ledger.persistence.ts similarity index 100% rename from tests/persistence/sqlite-vpet-repository.control-ledger.persistence.ts rename to packages/opencode-vpet/tests/persistence/sqlite-vpet-repository.control-ledger.persistence.ts diff --git a/tests/persistence/sqlite-vpet-repository.fixtures.ts b/packages/opencode-vpet/tests/persistence/sqlite-vpet-repository.fixtures.ts similarity index 96% rename from tests/persistence/sqlite-vpet-repository.fixtures.ts rename to packages/opencode-vpet/tests/persistence/sqlite-vpet-repository.fixtures.ts index 5a89ed1..2f10eed 100644 --- a/tests/persistence/sqlite-vpet-repository.fixtures.ts +++ b/packages/opencode-vpet/tests/persistence/sqlite-vpet-repository.fixtures.ts @@ -2,7 +2,7 @@ import { mkdir, mkdtemp, rm } from "node:fs/promises" import { join } from "node:path" import { openReadonlyDatabase, openWritableDatabase } from "../../src/adapters/sqlite/bun-sqlite-driver.ts" -import type { UsageReceiptMetadata } from "../../src/application/models/usage.ts" +import type { UsageReceiptMetadata } from "@sbugallo/vpet-core/application/models/usage.ts" import type { createSqliteVpetRepository } from "../../src/adapters/sqlite/sqlite-vpet-write-store.ts" export type TempTestRoot = { readonly root: string; readonly appDataRoot: string } diff --git a/tests/persistence/sqlite-vpet-repository.lifecycle.persistence.ts b/packages/opencode-vpet/tests/persistence/sqlite-vpet-repository.lifecycle.persistence.ts similarity index 99% rename from tests/persistence/sqlite-vpet-repository.lifecycle.persistence.ts rename to packages/opencode-vpet/tests/persistence/sqlite-vpet-repository.lifecycle.persistence.ts index 4dbee42..7a3080d 100644 --- a/tests/persistence/sqlite-vpet-repository.lifecycle.persistence.ts +++ b/packages/opencode-vpet/tests/persistence/sqlite-vpet-repository.lifecycle.persistence.ts @@ -3,7 +3,7 @@ import { join } from "node:path" import { Database } from "bun:sqlite" import { openReadonlyDatabase, openWritableDatabase } from "../../src/adapters/sqlite/bun-sqlite-driver.ts" -import type { Partner } from "../../src/domain/partner.ts" +import type { Partner } from "@sbugallo/vpet-core/domain/partner.ts" import { createSqliteVpetRepository, resolveHostDatabasePath, diff --git a/tests/persistence/sqlite-vpet-repository.persistence.ts b/packages/opencode-vpet/tests/persistence/sqlite-vpet-repository.persistence.ts similarity index 100% rename from tests/persistence/sqlite-vpet-repository.persistence.ts rename to packages/opencode-vpet/tests/persistence/sqlite-vpet-repository.persistence.ts diff --git a/tests/persistence/sqlite-vpet-repository.receipts.persistence.ts b/packages/opencode-vpet/tests/persistence/sqlite-vpet-repository.receipts.persistence.ts similarity index 100% rename from tests/persistence/sqlite-vpet-repository.receipts.persistence.ts rename to packages/opencode-vpet/tests/persistence/sqlite-vpet-repository.receipts.persistence.ts diff --git a/tests/port-boundary.test.ts b/packages/opencode-vpet/tests/port-boundary.test.ts similarity index 99% rename from tests/port-boundary.test.ts rename to packages/opencode-vpet/tests/port-boundary.test.ts index 09b23d6..ac69b94 100644 --- a/tests/port-boundary.test.ts +++ b/packages/opencode-vpet/tests/port-boundary.test.ts @@ -4,7 +4,7 @@ import type { JSX } from "@opentui/solid" import { chmod, mkdir, readFile, writeFile } from "node:fs/promises" import { join } from "node:path" -import { MonsterFrame, MONSTER_FRAME_CATALOG } from "../src/data/monster-frame-catalog.ts" +import { MonsterFrame, MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import entryPlugin, { createCommandConfig, plugin } from "../src/index.ts" import tuiPlugin from "../src/tui.tsx" import type { MonsterAnimationOutput } from "../src/tui/monster-animation.ts" diff --git a/tests/record-usage.test.ts b/packages/opencode-vpet/tests/record-usage.test.ts similarity index 93% rename from tests/record-usage.test.ts rename to packages/opencode-vpet/tests/record-usage.test.ts index 432b4c3..83bcc07 100644 --- a/tests/record-usage.test.ts +++ b/packages/opencode-vpet/tests/record-usage.test.ts @@ -1,12 +1,12 @@ import { describe, expect, test } from "bun:test" -import type { DigimonNode } from "../src/data/catalog.ts" -import type { Partner, PartnerProgression } from "../src/domain/partner.ts" -import type { UsageReceiptMetadata } from "../src/application/models/usage.ts" -import type { UsageLedger } from "../src/application/ports/usage-ledger.ts" -import { reconcileUsage } from "../src/application/use-cases/reconcile-usage.ts" -import { recordUsage, type CompletedUsage } from "../src/application/use-cases/record-usage.ts" -import { STAGE_GAUGE_THRESHOLDS, type StageThresholds } from "../src/domain/evolution.ts" +import type { DigimonNode } from "@sbugallo/vpet-core/data/catalog.ts" +import type { Partner, PartnerProgression } from "@sbugallo/vpet-core/domain/partner.ts" +import type { UsageReceiptMetadata } from "@sbugallo/vpet-core/application/models/usage.ts" +import type { UsageLedger } from "@sbugallo/vpet-core/application/ports/usage-ledger.ts" +import { reconcileUsage } from "@sbugallo/vpet-core/application/use-cases/reconcile-usage.ts" +import { recordUsage, type CompletedUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" +import { STAGE_GAUGE_THRESHOLDS, type StageThresholds } from "@sbugallo/vpet-core/domain/evolution.ts" const currentNode: DigimonNode = { id: "current", diff --git a/tests/release-metadata.test.ts b/packages/opencode-vpet/tests/release-metadata.test.ts similarity index 95% rename from tests/release-metadata.test.ts rename to packages/opencode-vpet/tests/release-metadata.test.ts index a8e6b13..842a796 100644 --- a/tests/release-metadata.test.ts +++ b/packages/opencode-vpet/tests/release-metadata.test.ts @@ -7,7 +7,7 @@ import { calculateNextDevelopmentVersion, calculateReleaseVersion, insertReleaseIntoChangelog, -} from "../scripts/release-metadata.ts" +} from "../../../scripts/release-metadata.ts" const tempRoots: string[] = [] @@ -91,7 +91,7 @@ describe("release metadata", () => { const result = Bun.spawnSync( [ "bun", - resolve(import.meta.dir, "../scripts/release-metadata.ts"), + resolve(import.meta.dir, "../../../scripts/release-metadata.ts"), "--package-json", packageJsonPath, "--changelog", @@ -129,7 +129,7 @@ describe("release metadata", () => { const result = Bun.spawnSync( [ "bun", - resolve(import.meta.dir, "../scripts/release-metadata.ts"), + resolve(import.meta.dir, "../../../scripts/release-metadata.ts"), "--package-json", packageJsonPath, "--changelog", @@ -161,7 +161,7 @@ describe("release metadata", () => { const result = Bun.spawnSync( [ "bun", - resolve(import.meta.dir, "../scripts/release-metadata.ts"), + resolve(import.meta.dir, "../../../scripts/release-metadata.ts"), "--package-json", packageJsonPath, "--changelog", diff --git a/tests/server-hooks-lifecycle.test.ts b/packages/opencode-vpet/tests/server-hooks-lifecycle.test.ts similarity index 96% rename from tests/server-hooks-lifecycle.test.ts rename to packages/opencode-vpet/tests/server-hooks-lifecycle.test.ts index 2ec20a5..6e2e60d 100644 --- a/tests/server-hooks-lifecycle.test.ts +++ b/packages/opencode-vpet/tests/server-hooks-lifecycle.test.ts @@ -3,12 +3,12 @@ import type { Event } from "@opencode-ai/sdk" import { createServerHooks } from "../src/adapters/opencode/create-server-hooks.ts" import type { VpetToastPayload } from "../src/adapters/opencode/vpet-toast.ts" -import type { DigimonCatalog, DigimonNode } from "../src/data/catalog.ts" -import { STAGE_GAUGE_THRESHOLDS } from "../src/domain/evolution.ts" -import type { ApplyUsageReceiptOutcome, UsageReceiptMetadata } from "../src/application/models/usage.ts" -import type { PartnerLifecycle } from "../src/application/ports/partner-lifecycle.ts" -import type { UsageLedger } from "../src/application/ports/usage-ledger.ts" -import type { VpetControl } from "../src/application/ports/vpet-control.ts" +import type { DigimonCatalog, DigimonNode } from "@sbugallo/vpet-core/data/catalog.ts" +import { STAGE_GAUGE_THRESHOLDS } from "@sbugallo/vpet-core/domain/evolution.ts" +import type { ApplyUsageReceiptOutcome, UsageReceiptMetadata } from "@sbugallo/vpet-core/application/models/usage.ts" +import type { PartnerLifecycle } from "@sbugallo/vpet-core/application/ports/partner-lifecycle.ts" +import type { UsageLedger } from "@sbugallo/vpet-core/application/ports/usage-ledger.ts" +import type { VpetControl } from "@sbugallo/vpet-core/application/ports/vpet-control.ts" const createRepository = (outcome: ApplyUsageReceiptOutcome, onReceipt?: () => void) => ({ diff --git a/tests/server-thresholds.test.ts b/packages/opencode-vpet/tests/server-thresholds.test.ts similarity index 94% rename from tests/server-thresholds.test.ts rename to packages/opencode-vpet/tests/server-thresholds.test.ts index cf1db3a..933a870 100644 --- a/tests/server-thresholds.test.ts +++ b/packages/opencode-vpet/tests/server-thresholds.test.ts @@ -6,13 +6,13 @@ import { join, posix } from "node:path" import { createServerHooks, type ServerHookDependencies } from "../src/adapters/opencode/create-server-hooks.ts" import { createSessionMessagesFetcher } from "../src/adapters/opencode/session-messages.ts" -import type { UsageReceiptMetadata } from "../src/application/models/usage.ts" -import type { PartnerLifecycle } from "../src/application/ports/partner-lifecycle.ts" -import type { UsageLedger } from "../src/application/ports/usage-ledger.ts" -import type { VpetControl } from "../src/application/ports/vpet-control.ts" +import type { UsageReceiptMetadata } from "@sbugallo/vpet-core/application/models/usage.ts" +import type { PartnerLifecycle } from "@sbugallo/vpet-core/application/ports/partner-lifecycle.ts" +import type { UsageLedger } from "@sbugallo/vpet-core/application/ports/usage-ledger.ts" +import type { VpetControl } from "@sbugallo/vpet-core/application/ports/vpet-control.ts" import { createSqliteVpetRepository } from "../src/adapters/sqlite/sqlite-vpet-write-store.ts" -import { STAGE_GAUGE_THRESHOLDS, type StageThresholds } from "../src/domain/evolution.ts" -import type { Partner, PartnerProgression } from "../src/domain/partner.ts" +import { STAGE_GAUGE_THRESHOLDS, type StageThresholds } from "@sbugallo/vpet-core/domain/evolution.ts" +import type { Partner, PartnerProgression } from "@sbugallo/vpet-core/domain/partner.ts" import { loadGlobalVpetSettings, resolveGlobalVpetConfigPath } from "../src/config/global-vpet-settings.ts" import { isBunSqliteAvailable } from "./sqlite-capability.ts" diff --git a/tests/sidebar-card.test.tsx b/packages/opencode-vpet/tests/sidebar-card.test.tsx similarity index 99% rename from tests/sidebar-card.test.tsx rename to packages/opencode-vpet/tests/sidebar-card.test.tsx index a6a48a5..6ca54d7 100644 --- a/tests/sidebar-card.test.tsx +++ b/packages/opencode-vpet/tests/sidebar-card.test.tsx @@ -3,7 +3,7 @@ import { describe, expect, test } from "bun:test" import { createMockMouse } from "@opentui/core/testing" import { testRender } from "@opentui/solid" -import { MONSTER_FRAME_CATALOG, type MonsterFrame } from "../src/data/monster-frame-catalog.ts" +import { MONSTER_FRAME_CATALOG, type MonsterFrame } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { mirrorMonsterFrame } from "../src/tui/monster-artwork-mirror.ts" import type { MonsterAnimationOutput } from "../src/tui/monster-animation.ts" import { VpetSidebarCard } from "../src/tui/sidebar-card.tsx" diff --git a/tests/sidebar-poll-loop.test.ts b/packages/opencode-vpet/tests/sidebar-poll-loop.test.ts similarity index 100% rename from tests/sidebar-poll-loop.test.ts rename to packages/opencode-vpet/tests/sidebar-poll-loop.test.ts diff --git a/tests/sidebar-state.test.ts b/packages/opencode-vpet/tests/sidebar-state.test.ts similarity index 100% rename from tests/sidebar-state.test.ts rename to packages/opencode-vpet/tests/sidebar-state.test.ts diff --git a/tests/sidebar-view-model.test.ts b/packages/opencode-vpet/tests/sidebar-view-model.test.ts similarity index 94% rename from tests/sidebar-view-model.test.ts rename to packages/opencode-vpet/tests/sidebar-view-model.test.ts index bd34682..cb1c2ef 100644 --- a/tests/sidebar-view-model.test.ts +++ b/packages/opencode-vpet/tests/sidebar-view-model.test.ts @@ -1,8 +1,8 @@ import { describe, expect, test } from "bun:test" -import { DEFAULT_VPET_SETTINGS } from "../src/config/defaults.ts" -import { normalizeVpetSettings } from "../src/config/normalize.ts" -import { buildSidebarCardModel } from "../src/tui/sidebar-view-model.ts" +import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" +import { normalizeVpetSettings } from "@sbugallo/vpet-core/config/normalize.ts" +import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" describe("static sidebar model", () => { const partnerInputs = { diff --git a/tests/sqlite-capability.ts b/packages/opencode-vpet/tests/sqlite-capability.ts similarity index 100% rename from tests/sqlite-capability.ts rename to packages/opencode-vpet/tests/sqlite-capability.ts diff --git a/tests/sqlite-vpet-archive-reader.test.ts b/packages/opencode-vpet/tests/sqlite-vpet-archive-reader.test.ts similarity index 100% rename from tests/sqlite-vpet-archive-reader.test.ts rename to packages/opencode-vpet/tests/sqlite-vpet-archive-reader.test.ts diff --git a/packages/opencode-vpet/tests/tsconfig.json b/packages/opencode-vpet/tests/tsconfig.json new file mode 100644 index 0000000..f34f24f --- /dev/null +++ b/packages/opencode-vpet/tests/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../tsconfig.test.json", + "include": ["./**/*"], + "exclude": ["../node_modules", "../dist"] +} diff --git a/tests/tui-composition-fixture.ts b/packages/opencode-vpet/tests/tui-composition-fixture.ts similarity index 97% rename from tests/tui-composition-fixture.ts rename to packages/opencode-vpet/tests/tui-composition-fixture.ts index 6dc9e7a..5cd951f 100644 --- a/tests/tui-composition-fixture.ts +++ b/packages/opencode-vpet/tests/tui-composition-fixture.ts @@ -7,9 +7,9 @@ import type { import type { TuiDialogProps, TuiTheme } from "@opencode-ai/plugin/tui" import type { JSX } from "@opentui/solid" -import type { SidebarCardInputs } from "../src/application/models/sidebar-card-inputs.ts" -import { DEFAULT_VPET_SETTINGS } from "../src/config/defaults.ts" -import type { DigimonStage } from "../src/domain/stage.ts" +import type { SidebarCardInputs } from "@sbugallo/vpet-core/application/models/sidebar-card-inputs.ts" +import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" +import type { DigimonStage } from "@sbugallo/vpet-core/domain/stage.ts" import type { MonsterAnimationOutput } from "../src/tui/monster-animation.ts" import { createTui, type TuiCompositionApi } from "../src/tui.tsx" diff --git a/tests/tui-composition.test.ts b/packages/opencode-vpet/tests/tui-composition.test.ts similarity index 97% rename from tests/tui-composition.test.ts rename to packages/opencode-vpet/tests/tui-composition.test.ts index 9bbf027..df82b5a 100644 --- a/tests/tui-composition.test.ts +++ b/packages/opencode-vpet/tests/tui-composition.test.ts @@ -1,11 +1,11 @@ import { describe, expect, test } from "bun:test" import { testRender } from "@opentui/solid" -import type { SidebarCardInputs } from "../src/application/models/sidebar-card-inputs.ts" -import type { VpetArchiveResult } from "../src/application/models/vpet-archive.ts" -import type { VpetArchiveReader } from "../src/application/ports/vpet-archive.ts" -import { DEFAULT_VPET_SETTINGS } from "../src/config/defaults.ts" -import { MONSTER_FRAME_CATALOG } from "../src/data/monster-frame-catalog.ts" +import type { SidebarCardInputs } from "@sbugallo/vpet-core/application/models/sidebar-card-inputs.ts" +import type { VpetArchiveResult } from "@sbugallo/vpet-core/application/models/vpet-archive.ts" +import type { VpetArchiveReader } from "@sbugallo/vpet-core/application/ports/vpet-archive.ts" +import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { createTui } from "../src/tui.tsx" import { messagePartUpdated, diff --git a/tests/tui-settings-composition.test.ts b/packages/opencode-vpet/tests/tui-settings-composition.test.ts similarity index 96% rename from tests/tui-settings-composition.test.ts rename to packages/opencode-vpet/tests/tui-settings-composition.test.ts index 1c1c2f5..10ebf29 100644 --- a/tests/tui-settings-composition.test.ts +++ b/packages/opencode-vpet/tests/tui-settings-composition.test.ts @@ -7,12 +7,12 @@ import { testRender } from "@opentui/solid" import type { JSX } from "@opentui/solid" import { createSqliteSidebarSnapshotReader } from "../src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts" -import type { SidebarCardInputs } from "../src/application/models/sidebar-card-inputs.ts" -import type { VpetArchiveReader } from "../src/application/ports/vpet-archive.ts" -import { getSidebarCardInputs } from "../src/application/use-cases/get-sidebar-card-inputs.ts" -import { DEFAULT_VPET_SETTINGS } from "../src/config/defaults.ts" +import type { SidebarCardInputs } from "@sbugallo/vpet-core/application/models/sidebar-card-inputs.ts" +import type { VpetArchiveReader } from "@sbugallo/vpet-core/application/ports/vpet-archive.ts" +import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/get-sidebar-card-inputs.ts" +import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" import { loadGlobalVpetSettings } from "../src/config/global-vpet-settings.ts" -import { DIGIMON_CATALOG } from "../src/data/catalog.ts" +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { createTui } from "../src/tui.tsx" import { TuiCompositionHarness } from "./tui-composition-fixture.ts" diff --git a/tests/usage-event-ingestion.test.ts b/packages/opencode-vpet/tests/usage-event-ingestion.test.ts similarity index 96% rename from tests/usage-event-ingestion.test.ts rename to packages/opencode-vpet/tests/usage-event-ingestion.test.ts index 0016870..63af2d1 100644 --- a/tests/usage-event-ingestion.test.ts +++ b/packages/opencode-vpet/tests/usage-event-ingestion.test.ts @@ -4,10 +4,10 @@ import type { AssistantMessage, Event, Message, UserMessage } from "@opencode-ai import { toCompletedUsageFromEvent, toCompletedUsageFromMessage } from "../src/adapters/opencode/usage-event-mapper.ts" import { createServerHooks } from "../src/adapters/opencode/create-server-hooks.ts" import { createSessionMessagesFetcher } from "../src/adapters/opencode/session-messages.ts" -import type { ApplyUsageReceiptOutcome, UsageReceiptMetadata } from "../src/application/models/usage.ts" -import type { PartnerLifecycle } from "../src/application/ports/partner-lifecycle.ts" -import type { UsageLedger } from "../src/application/ports/usage-ledger.ts" -import type { VpetControl } from "../src/application/ports/vpet-control.ts" +import type { ApplyUsageReceiptOutcome, UsageReceiptMetadata } from "@sbugallo/vpet-core/application/models/usage.ts" +import type { PartnerLifecycle } from "@sbugallo/vpet-core/application/ports/partner-lifecycle.ts" +import type { UsageLedger } from "@sbugallo/vpet-core/application/ports/usage-ledger.ts" +import type { VpetControl } from "@sbugallo/vpet-core/application/ports/vpet-control.ts" const completedAssistantEvent = { type: "message.updated", diff --git a/tests/usage-event-processing-time.test.ts b/packages/opencode-vpet/tests/usage-event-processing-time.test.ts similarity index 89% rename from tests/usage-event-processing-time.test.ts rename to packages/opencode-vpet/tests/usage-event-processing-time.test.ts index 4f90a33..a2c6090 100644 --- a/tests/usage-event-processing-time.test.ts +++ b/packages/opencode-vpet/tests/usage-event-processing-time.test.ts @@ -2,10 +2,10 @@ import { describe, expect, test } from "bun:test" import type { Event, Message } from "@opencode-ai/sdk" import { createServerHooks } from "../src/adapters/opencode/create-server-hooks.ts" -import type { ApplyUsageReceiptOutcome, UsageReceiptMetadata } from "../src/application/models/usage.ts" -import type { PartnerLifecycle } from "../src/application/ports/partner-lifecycle.ts" -import type { UsageLedger } from "../src/application/ports/usage-ledger.ts" -import type { VpetControl } from "../src/application/ports/vpet-control.ts" +import type { ApplyUsageReceiptOutcome, UsageReceiptMetadata } from "@sbugallo/vpet-core/application/models/usage.ts" +import type { PartnerLifecycle } from "@sbugallo/vpet-core/application/ports/partner-lifecycle.ts" +import type { UsageLedger } from "@sbugallo/vpet-core/application/ports/usage-ledger.ts" +import type { VpetControl } from "@sbugallo/vpet-core/application/ports/vpet-control.ts" const completedAssistantEvent = { type: "message.updated", diff --git a/tests/vpet-command-layer.test.tsx b/packages/opencode-vpet/tests/vpet-command-layer.test.tsx similarity index 90% rename from tests/vpet-command-layer.test.tsx rename to packages/opencode-vpet/tests/vpet-command-layer.test.tsx index a14e5de..b78e4ae 100644 --- a/tests/vpet-command-layer.test.tsx +++ b/packages/opencode-vpet/tests/vpet-command-layer.test.tsx @@ -2,8 +2,8 @@ import { describe, expect, test } from "bun:test" import { testRender } from "@opentui/solid" -import type { VpetArchiveReader } from "../src/application/ports/vpet-archive.ts" -import { DEFAULT_VPET_SETTINGS } from "../src/config/defaults.ts" +import type { VpetArchiveReader } from "@sbugallo/vpet-core/application/ports/vpet-archive.ts" +import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" import { createTui } from "../src/tui.tsx" import { partnerInputs, settle, TuiCompositionHarness } from "./tui-composition-fixture.ts" diff --git a/tests/vpet-control.test.ts b/packages/opencode-vpet/tests/vpet-control.test.ts similarity index 90% rename from tests/vpet-control.test.ts rename to packages/opencode-vpet/tests/vpet-control.test.ts index fecf9e5..dae5a9a 100644 --- a/tests/vpet-control.test.ts +++ b/packages/opencode-vpet/tests/vpet-control.test.ts @@ -1,9 +1,9 @@ import { describe, expect, test } from "bun:test" -import type { VpetControl } from "../src/application/ports/vpet-control.ts" -import { freezeVpet } from "../src/application/use-cases/freeze-vpet.ts" -import { setVpetCheatNode } from "../src/application/use-cases/set-vpet-cheat-node.ts" -import { unfreezeVpet } from "../src/application/use-cases/unfreeze-vpet.ts" +import type { VpetControl } from "@sbugallo/vpet-core/application/ports/vpet-control.ts" +import { freezeVpet } from "@sbugallo/vpet-core/application/use-cases/freeze-vpet.ts" +import { setVpetCheatNode } from "@sbugallo/vpet-core/application/use-cases/set-vpet-cheat-node.ts" +import { unfreezeVpet } from "@sbugallo/vpet-core/application/use-cases/unfreeze-vpet.ts" type ControlState = { frozen: boolean diff --git a/tests/vpet-dex-dialog-fixture.tsx b/packages/opencode-vpet/tests/vpet-dex-dialog-fixture.tsx similarity index 100% rename from tests/vpet-dex-dialog-fixture.tsx rename to packages/opencode-vpet/tests/vpet-dex-dialog-fixture.tsx diff --git a/tests/vpet-dex-dialog-hardening.test.tsx b/packages/opencode-vpet/tests/vpet-dex-dialog-hardening.test.tsx similarity index 96% rename from tests/vpet-dex-dialog-hardening.test.tsx rename to packages/opencode-vpet/tests/vpet-dex-dialog-hardening.test.tsx index 362f43c..701c10d 100644 --- a/tests/vpet-dex-dialog-hardening.test.tsx +++ b/packages/opencode-vpet/tests/vpet-dex-dialog-hardening.test.tsx @@ -2,7 +2,7 @@ import { describe, expect, test, mock } from "bun:test" import { testRender } from "@opentui/solid" import { VpetDexDialog } from "../src/tui/vpet-dex-dialog.tsx" -import type { DexViewModel } from "../src/tui/dex-view-model.ts" +import type { DexViewModel } from "@sbugallo/vpet-core/view-models/dex-view-model.ts" import { createMockTheme } from "./vpet-dex-dialog-fixture.tsx" describe("VpetDexDialog hardening", () => { diff --git a/tests/vpet-dex-dialog.test.tsx b/packages/opencode-vpet/tests/vpet-dex-dialog.test.tsx similarity index 98% rename from tests/vpet-dex-dialog.test.tsx rename to packages/opencode-vpet/tests/vpet-dex-dialog.test.tsx index c44285a..8a042b2 100644 --- a/tests/vpet-dex-dialog.test.tsx +++ b/packages/opencode-vpet/tests/vpet-dex-dialog.test.tsx @@ -3,7 +3,7 @@ import { describe, expect, test, mock } from "bun:test" import { ScrollBoxRenderable } from "@opentui/core" import { testRender } from "@opentui/solid" import { VpetDexDialog } from "../src/tui/vpet-dex-dialog.tsx" -import type { DexViewModel } from "../src/tui/dex-view-model.ts" +import type { DexViewModel } from "@sbugallo/vpet-core/view-models/dex-view-model.ts" import { createMockTheme, createTrackedDialogApi } from "./vpet-dex-dialog-fixture.tsx" describe("VpetDexDialog", () => { diff --git a/tests/vpet-dialog-layout.test.tsx b/packages/opencode-vpet/tests/vpet-dialog-layout.test.tsx similarity index 100% rename from tests/vpet-dialog-layout.test.tsx rename to packages/opencode-vpet/tests/vpet-dialog-layout.test.tsx diff --git a/tests/vpet-freeze.test.ts b/packages/opencode-vpet/tests/vpet-freeze.test.ts similarity index 100% rename from tests/vpet-freeze.test.ts rename to packages/opencode-vpet/tests/vpet-freeze.test.ts diff --git a/tests/vpet-history-dialog.test.tsx b/packages/opencode-vpet/tests/vpet-history-dialog.test.tsx similarity index 99% rename from tests/vpet-history-dialog.test.tsx rename to packages/opencode-vpet/tests/vpet-history-dialog.test.tsx index 32cc94c..e6eecdb 100644 --- a/tests/vpet-history-dialog.test.tsx +++ b/packages/opencode-vpet/tests/vpet-history-dialog.test.tsx @@ -3,7 +3,7 @@ import { describe, expect, test, mock } from "bun:test" import { ScrollBoxRenderable } from "@opentui/core" import { testRender } from "@opentui/solid" import { VpetHistoryDialog, type VpetHistoryDialogTheme } from "../src/tui/vpet-history-dialog.tsx" -import type { HistoryViewModel } from "../src/tui/history-view-model.ts" +import type { HistoryViewModel } from "@sbugallo/vpet-core/view-models/history-view-model.ts" import { parseColor } from "@opentui/core" import { createTrackedDialogApi } from "./vpet-dex-dialog-fixture.tsx" diff --git a/tests/vpet-set.test.ts b/packages/opencode-vpet/tests/vpet-set.test.ts similarity index 98% rename from tests/vpet-set.test.ts rename to packages/opencode-vpet/tests/vpet-set.test.ts index 7e6ef82..f3b9633 100644 --- a/tests/vpet-set.test.ts +++ b/packages/opencode-vpet/tests/vpet-set.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "bun:test" import type { Part } from "@opencode-ai/sdk" -import type { DigimonCatalog } from "../src/data/catalog.ts" +import type { DigimonCatalog } from "@sbugallo/vpet-core/data/catalog.ts" import { createServerHooks } from "../src/adapters/opencode/create-server-hooks.ts" import { runVpetSetCommand } from "../src/commands/vpet-set.ts" diff --git a/tests/vpet-spawn.test.ts b/packages/opencode-vpet/tests/vpet-spawn.test.ts similarity index 98% rename from tests/vpet-spawn.test.ts rename to packages/opencode-vpet/tests/vpet-spawn.test.ts index 1b7fb63..6efeaae 100644 --- a/tests/vpet-spawn.test.ts +++ b/packages/opencode-vpet/tests/vpet-spawn.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "bun:test" import type { Part } from "@opencode-ai/sdk" -import { spawnPartner } from "../src/application/use-cases/spawn-partner.ts" +import { spawnPartner } from "@sbugallo/vpet-core/application/use-cases/spawn-partner.ts" import { createServerHooks } from "../src/adapters/opencode/create-server-hooks.ts" import { runVpetSpawnCommand } from "../src/commands/vpet-spawn.ts" diff --git a/tests/vpet-toast.test.ts b/packages/opencode-vpet/tests/vpet-toast.test.ts similarity index 98% rename from tests/vpet-toast.test.ts rename to packages/opencode-vpet/tests/vpet-toast.test.ts index 69d630a..f7780b9 100644 --- a/tests/vpet-toast.test.ts +++ b/packages/opencode-vpet/tests/vpet-toast.test.ts @@ -5,7 +5,7 @@ import { formatVpetToast, type VpetToastPayload, } from "../src/adapters/opencode/vpet-toast.ts" -import type { DigimonCatalog } from "../src/data/catalog.ts" +import type { DigimonCatalog } from "@sbugallo/vpet-core/data/catalog.ts" const nodes = [ { diff --git a/tests/vpet-unfreeze.test.ts b/packages/opencode-vpet/tests/vpet-unfreeze.test.ts similarity index 100% rename from tests/vpet-unfreeze.test.ts rename to packages/opencode-vpet/tests/vpet-unfreeze.test.ts diff --git a/tsconfig.build.json b/packages/opencode-vpet/tsconfig.build.json similarity index 100% rename from tsconfig.build.json rename to packages/opencode-vpet/tsconfig.build.json diff --git a/packages/opencode-vpet/tsconfig.json b/packages/opencode-vpet/tsconfig.json new file mode 100644 index 0000000..cad9cc8 --- /dev/null +++ b/packages/opencode-vpet/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "strict": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "noFallthroughCasesInSwitch": true, + "noPropertyAccessFromIndexSignature": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "isolatedModules": true, + "target": "ESNext", + "lib": ["ESNext", "DOM"], + "types": ["bun", "node"], + "jsx": "react-jsx", + "jsxImportSource": "@opentui/solid", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "outDir": "dist", + "rootDir": "src", + "skipLibCheck": true, + "noEmit": true + }, + "include": ["src"], + "exclude": ["node_modules", "dist", "tests"] +} diff --git a/packages/opencode-vpet/tsconfig.scripts.json b/packages/opencode-vpet/tsconfig.scripts.json new file mode 100644 index 0000000..b36d54c --- /dev/null +++ b/packages/opencode-vpet/tsconfig.scripts.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "strict": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "isolatedModules": true, + "target": "ESNext", + "lib": ["ESNext"], + "types": ["bun", "node"], + "noEmit": true, + "rootDir": "scripts", + "skipLibCheck": true + }, + "include": ["scripts/**/*.ts"] +} diff --git a/tsconfig.test.json b/packages/opencode-vpet/tsconfig.test.json similarity index 62% rename from tsconfig.test.json rename to packages/opencode-vpet/tsconfig.test.json index 5f3ad31..2f01a52 100644 --- a/tsconfig.test.json +++ b/packages/opencode-vpet/tsconfig.test.json @@ -2,8 +2,10 @@ "extends": "./tsconfig.json", "compilerOptions": { "noEmit": true, + "rootDir": ".", "jsx": "react-jsx", "jsxImportSource": "@opentui/solid" }, - "include": ["src", "tests"] + "include": ["src", "tests"], + "exclude": ["node_modules", "dist"] } diff --git a/packages/opencode-vpet/tsconfig.vpet-core-declarations.json b/packages/opencode-vpet/tsconfig.vpet-core-declarations.json new file mode 100644 index 0000000..32516c5 --- /dev/null +++ b/packages/opencode-vpet/tsconfig.vpet-core-declarations.json @@ -0,0 +1,12 @@ +{ + "extends": "../vpet-core/tsconfig.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "noEmit": false, + "outDir": "dist/vpet-core", + "rootDir": "build/vpet-core-src" + }, + "include": ["build/vpet-core-src"] +} diff --git a/packages/vpet-core/package.json b/packages/vpet-core/package.json new file mode 100644 index 0000000..3605812 --- /dev/null +++ b/packages/vpet-core/package.json @@ -0,0 +1,26 @@ +{ + "name": "@sbugallo/vpet-core", + "version": "0.2.0-dev.0", + "private": true, + "type": "module", + "engines": { + "node": "24.11.0", + "bun": "1.3.5" + }, + "exports": { + "./domain/*": "./src/domain/*", + "./application/*": "./src/application/*", + "./data/*": "./src/data/*", + "./config/*": "./src/config/*", + "./view-models/*": "./src/view-models/*", + "./ports/*": "./src/ports/*", + "./adapters/*": "./src/adapters/*" + }, + "scripts": { + "typecheck": "tsc --noEmit -p tsconfig.json" + }, + "devDependencies": { + "@types/bun": "1.3.14", + "typescript": "5.9.3" + } +} diff --git a/packages/vpet-core/src/adapters/sqlite/app-data-path.ts b/packages/vpet-core/src/adapters/sqlite/app-data-path.ts new file mode 100644 index 0000000..bef3d9d --- /dev/null +++ b/packages/vpet-core/src/adapters/sqlite/app-data-path.ts @@ -0,0 +1,30 @@ +import { homedir } from "node:os" +import { join } from "node:path" + +const APP_DIRECTORY_NAME = "opencode-vpet" +const DATABASE_FILE_NAME = "pet.db" + +export type HostPathOptions = { + readonly appDataRoot?: string +} + +const resolveDefaultAppDataRoot = (): string => { + if (process.platform === "darwin") { + return join(homedir(), "Library", "Application Support") + } + + if (process.platform === "win32") { + const { APPDATA } = process.env + return APPDATA ?? join(homedir(), "AppData", "Roaming") + } + + return join(homedir(), ".local", "share") +} + +export const resolveHostDataDirectory = (options: HostPathOptions = {}): string => { + return join(options.appDataRoot ?? resolveDefaultAppDataRoot(), APP_DIRECTORY_NAME) +} + +export const resolveHostDatabasePath = (options: HostPathOptions = {}): string => { + return join(resolveHostDataDirectory(options), DATABASE_FILE_NAME) +} diff --git a/packages/vpet-core/src/adapters/sqlite/sqlite-migrations.ts b/packages/vpet-core/src/adapters/sqlite/sqlite-migrations.ts new file mode 100644 index 0000000..bae02d7 --- /dev/null +++ b/packages/vpet-core/src/adapters/sqlite/sqlite-migrations.ts @@ -0,0 +1,147 @@ +import type { SqliteExecutor } from "../../ports/sqlite-executor.ts" + +type SqliteMigrationExecutor = Pick + +type Migration = { + readonly version: number + readonly sql: readonly string[] +} + +const MIGRATIONS = [ + { + version: 1, + sql: [ + ` + CREATE TABLE IF NOT EXISTS schema_migrations ( + version INTEGER PRIMARY KEY, + applied_at TEXT NOT NULL + ) + `, + ` + CREATE TABLE IF NOT EXISTS trainer_state ( + trainer_id INTEGER PRIMARY KEY CHECK (trainer_id = 1), + total_tokens INTEGER NOT NULL + ) + `, + ` + INSERT INTO trainer_state (trainer_id, total_tokens) + VALUES (1, 0) + ON CONFLICT (trainer_id) DO NOTHING + `, + ` + CREATE TABLE IF NOT EXISTS partners ( + partner_id TEXT PRIMARY KEY, + generation INTEGER NOT NULL, + current_node_id TEXT NOT NULL, + gauge INTEGER NOT NULL, + is_terminal INTEGER NOT NULL, + created_at TEXT NOT NULL, + retired_at TEXT + ) + `, + ` + CREATE UNIQUE INDEX IF NOT EXISTS partners_one_active_partner + ON partners ((1)) + WHERE retired_at IS NULL + `, + ` + CREATE TABLE IF NOT EXISTS partner_events ( + event_id TEXT PRIMARY KEY, + partner_id TEXT NOT NULL, + kind TEXT NOT NULL, + current_node_id TEXT NOT NULL, + gauge INTEGER NOT NULL, + is_terminal INTEGER NOT NULL, + token_delta INTEGER, + receipt_key TEXT, + created_at TEXT NOT NULL, + FOREIGN KEY (partner_id) REFERENCES partners (partner_id) + ) + `, + ` + CREATE INDEX IF NOT EXISTS partner_events_partner_created_at + ON partner_events (partner_id, created_at, event_id) + `, + ` + CREATE TABLE IF NOT EXISTS usage_receipts ( + receipt_key TEXT PRIMARY KEY, + partner_id TEXT NOT NULL, + event_id TEXT NOT NULL, + token_delta INTEGER NOT NULL, + cost REAL, + created_at TEXT NOT NULL, + FOREIGN KEY (partner_id) REFERENCES partners (partner_id), + FOREIGN KEY (event_id) REFERENCES partner_events (event_id) + ) + `, + ], + }, + { + version: 2, + sql: ["CREATE UNIQUE INDEX IF NOT EXISTS partners_generation_unique ON partners (generation)"], + }, + { + version: 3, + sql: [ + ` + CREATE TABLE IF NOT EXISTS vpet_control_state ( + control_id INTEGER PRIMARY KEY CHECK (control_id = 1), + frozen INTEGER NOT NULL CHECK (frozen IN (0, 1)), + cheat_node_id TEXT + ) + `, + ` + INSERT INTO vpet_control_state (control_id, frozen, cheat_node_id) + VALUES (1, 0, NULL) + ON CONFLICT (control_id) DO NOTHING + `, + ` + CREATE TABLE IF NOT EXISTS vpet_control_receipts ( + receipt_key TEXT PRIMARY KEY, + mode TEXT NOT NULL CHECK (mode IN ('frozen', 'cheat')), + token_delta INTEGER NOT NULL, + cost REAL, + created_at TEXT NOT NULL + ) + `, + ], + }, +] as const satisfies readonly Migration[] + +type MigrationRow = { + readonly version: number +} + +export const runMigrations = (database: SqliteMigrationExecutor): readonly number[] => { + return database.transaction(() => { + database.run(` + CREATE TABLE IF NOT EXISTS schema_migrations ( + version INTEGER PRIMARY KEY, + applied_at TEXT NOT NULL + ) + `) + + const appliedVersions = new Set( + database + .all("SELECT version FROM schema_migrations ORDER BY version ASC") + .map((row) => row.version), + ) + + for (const migration of MIGRATIONS) { + if (appliedVersions.has(migration.version)) { + continue + } + + for (const statement of migration.sql) { + database.run(statement) + } + database.run("INSERT INTO schema_migrations (version, applied_at) VALUES (?, ?)", [ + migration.version, + new Date().toISOString(), + ]) + appliedVersions.add(migration.version) + } + + return [...appliedVersions].sort((left, right) => left - right) + }) +} diff --git a/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-schema.ts b/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-schema.ts new file mode 100644 index 0000000..3b79c48 --- /dev/null +++ b/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-schema.ts @@ -0,0 +1,168 @@ +import type { Partner } from "../../domain/partner.ts" +import type { PersistedPartnerEvent, PersistedPartnerEventKind, UsageReceiptRecord } from "./sqlite-vpet-types.ts" + +export type PersistedPartnerRow = { + readonly partner_id: string + readonly generation: number + readonly current_node_id: string + readonly gauge: number + readonly is_terminal: number + readonly created_at: string + readonly retired_at: string | null +} + +export type PersistedPartnerEventRow = { + readonly event_id: string + readonly partner_id: string + readonly kind: PersistedPartnerEventKind + readonly current_node_id: string + readonly gauge: number + readonly is_terminal: number + readonly token_delta: number | null + readonly receipt_key: string | null + readonly created_at: string +} + +export type UsageReceiptRow = { + readonly receipt_key: string + readonly partner_id: string + readonly event_id: string + readonly token_delta: number + readonly cost: number | null + readonly created_at: string +} + +export type TrainerStateRow = { + readonly total_tokens: number +} + +export type MigrationRow = { + readonly version: number +} + +export const ACTIVE_PARTNER_SELECT = ` + SELECT + partner_id, + generation, + current_node_id, + gauge, + is_terminal, + created_at, + retired_at + FROM partners + WHERE retired_at IS NULL + LIMIT 1 +` + +export const PARTNERS_SELECT = ` + SELECT + partner_id, + generation, + current_node_id, + gauge, + is_terminal, + created_at, + retired_at + FROM partners + ORDER BY generation ASC, created_at ASC, partner_id ASC +` + +export const ARCHIVE_PARTNERS_SELECT = ` + SELECT + partner_id, + generation, + current_node_id, + gauge, + is_terminal, + created_at, + retired_at + FROM partners + ORDER BY partner_id ASC +` + +export const PARTNER_BY_GENERATION_SELECT = ` + SELECT + partner_id, + generation, + current_node_id, + gauge, + is_terminal, + created_at, + retired_at + FROM partners + WHERE generation = ? + LIMIT 1 +` + +export const PARTNER_EVENTS_SELECT = ` + SELECT + event_id, + partner_id, + kind, + current_node_id, + gauge, + is_terminal, + token_delta, + receipt_key, + created_at + FROM partner_events + WHERE partner_id = ? + ORDER BY created_at ASC, event_id ASC +` + +export const ARCHIVE_PARTNER_EVENTS_SELECT = ` + SELECT + event_id, + partner_id, + kind, + current_node_id, + gauge, + is_terminal, + token_delta, + receipt_key, + created_at + FROM partner_events + ORDER BY partner_id ASC, created_at ASC, event_id ASC +` + +export const USAGE_RECEIPTS_SELECT = ` + SELECT receipt_key, partner_id, event_id, token_delta, cost, created_at + FROM usage_receipts + ORDER BY created_at ASC, receipt_key ASC +` + +export const toPartner = (row: PersistedPartnerRow): Partner => { + return { + partnerId: row.partner_id, + generation: row.generation, + currentNodeId: row.current_node_id, + gauge: row.gauge, + isTerminal: row.is_terminal === 1, + createdAt: row.created_at, + retiredAt: row.retired_at, + } +} + +export const toPersistedPartnerEvent = (row: PersistedPartnerEventRow): PersistedPartnerEvent => { + return { + eventId: row.event_id, + partnerId: row.partner_id, + kind: row.kind, + currentNodeId: row.current_node_id, + gauge: row.gauge, + isTerminal: row.is_terminal === 1, + tokenDelta: row.token_delta, + receiptKey: row.receipt_key, + createdAt: row.created_at, + } +} + +export const toUsageReceiptRecord = (row: UsageReceiptRow): UsageReceiptRecord => { + return { + receiptKey: row.receipt_key, + partnerId: row.partner_id, + eventId: row.event_id, + tokenDelta: row.token_delta, + createdAt: row.created_at, + } +} diff --git a/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-types.ts b/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-types.ts new file mode 100644 index 0000000..615b170 --- /dev/null +++ b/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-types.ts @@ -0,0 +1,52 @@ +import type { Partner, PartnerProgression } from "../../domain/partner.ts" +import type { SpawnPartnerInput } from "../../application/models/spawn-partner.ts" +import type { ApplyUsageReceiptOutcome, UsageReceiptMetadata } from "../../application/models/usage.ts" +import type { PartnerLifecycle } from "../../application/ports/partner-lifecycle.ts" +import type { UsageLedger } from "../../application/ports/usage-ledger.ts" +import type { VpetControl } from "../../application/ports/vpet-control.ts" + +export type PersistedPartner = Partner + +export type PersistedPartnerEventKind = "spawned" | "usage_applied" | "retired" + +export type PersistedPartnerEvent = { + readonly eventId: string + readonly partnerId: string + readonly kind: PersistedPartnerEventKind + readonly currentNodeId: string + readonly gauge: number + readonly isTerminal: boolean + readonly tokenDelta: number | null + readonly receiptKey: string | null + readonly createdAt: string +} + +export type UsageReceiptRecord = { + readonly receiptKey: string + readonly partnerId: string + readonly eventId: string + readonly tokenDelta: number + readonly createdAt: string +} + +export type TrainerState = { + readonly totalTokens: number +} + +export type PersistedPartnerSummary = Partner + +export type SqliteVpetWriteStore = PartnerLifecycle & + UsageLedger & + VpetControl & { + close: () => Promise + readonly databasePath: string + getAppliedMigrations: () => readonly number[] + getTrainerState: () => TrainerState + getActivePartner: () => PersistedPartner | null + listPartners: () => readonly PersistedPartnerSummary[] + getPartnerByGeneration: (generation: number) => PersistedPartnerSummary | null + listPartnerEvents: (partnerId: string) => readonly PersistedPartnerEvent[] + listUsageReceipts: () => readonly UsageReceiptRecord[] + } + +export type { ApplyUsageReceiptOutcome, PartnerProgression, SpawnPartnerInput, UsageReceiptMetadata } diff --git a/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-write-store.ts b/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-write-store.ts new file mode 100644 index 0000000..ac8382f --- /dev/null +++ b/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-write-store.ts @@ -0,0 +1,224 @@ +import type { SpawnPartnerInput } from "../../application/models/spawn-partner.ts" +import type { UsageReceiptMetadata } from "../../application/models/usage.ts" +import type { Partner, PartnerProgression } from "../../domain/partner.ts" +import type { SqliteExecutor } from "../../ports/sqlite-executor.ts" +import { runMigrations } from "./sqlite-migrations.ts" +import { + ACTIVE_PARTNER_SELECT, + PARTNERS_SELECT, + PARTNER_BY_GENERATION_SELECT, + PARTNER_EVENTS_SELECT, + USAGE_RECEIPTS_SELECT, + type PersistedPartnerEventRow, + type PersistedPartnerRow, + type TrainerStateRow, + type UsageReceiptRow, + toPartner, + toPersistedPartnerEvent, + toUsageReceiptRecord, +} from "./sqlite-vpet-schema.ts" +import type { SqliteVpetWriteStore } from "./sqlite-vpet-types.ts" + +export type CreateSqliteVpetWriteStoreOptions = { + readonly databasePath: string + readonly executor: SqliteExecutor + readonly close: () => Promise | void +} + +type ControlStateRow = { + readonly frozen: number + readonly cheat_node_id: string | null +} + +type ReceiptLedgerRow = { + readonly receipt_key: string +} + +export const createSqliteVpetWriteStore = (options: CreateSqliteVpetWriteStoreOptions): SqliteVpetWriteStore => { + const { databasePath, executor, close } = options + const appliedMigrations = runMigrations(executor) + + const store = { + databasePath, + async close() { + await close() + }, + getAppliedMigrations() { + return appliedMigrations + }, + getTrainerState() { + const trainerState = executor.get("SELECT total_tokens FROM trainer_state WHERE trainer_id = 1") + if (trainerState === null) throw new Error("Trainer state row is missing") + return { totalTokens: trainerState.total_tokens } + }, + getActivePartner() { + const activePartner = executor.get(ACTIVE_PARTNER_SELECT) + return activePartner === null ? null : toPartner(activePartner) + }, + listPartners() { + return executor.all(PARTNERS_SELECT).map(toPartner) + }, + getPartnerByGeneration(generation: number) { + const partner = executor.get(PARTNER_BY_GENERATION_SELECT, [generation]) + return partner === null ? null : toPartner(partner) + }, + freeze() { + return executor.transaction(() => { + const controlState = executor.get( + "SELECT frozen, cheat_node_id FROM vpet_control_state WHERE control_id = 1", + ) + if (controlState === null) throw new Error("VPet control state row is missing") + if (controlState.frozen === 1) return { kind: "already_frozen" } as const + executor.run("UPDATE vpet_control_state SET frozen = 1 WHERE control_id = 1") + return { kind: "frozen" } as const + }) + }, + unfreeze() { + return executor.transaction(() => { + const controlState = executor.get( + "SELECT frozen, cheat_node_id FROM vpet_control_state WHERE control_id = 1", + ) + if (controlState === null) throw new Error("VPet control state row is missing") + if (controlState.frozen === 0) return { kind: "already_unfrozen" } as const + executor.run("UPDATE vpet_control_state SET frozen = 0 WHERE control_id = 1") + return { kind: "unfrozen" } as const + }) + }, + setCheatNode(cheatNodeId: string) { + return executor.transaction(() => { + const controlState = executor.get( + "SELECT frozen, cheat_node_id FROM vpet_control_state WHERE control_id = 1", + ) + if (controlState === null) throw new Error("VPet control state row is missing") + if (controlState.cheat_node_id === cheatNodeId) return { kind: "already_set", cheatNodeId } as const + executor.run("UPDATE vpet_control_state SET cheat_node_id = ? WHERE control_id = 1", [cheatNodeId]) + return { kind: "set", cheatNodeId } as const + }) + }, + spawnPartner(input: SpawnPartnerInput) { + return executor.transaction(() => { + executor.run("UPDATE vpet_control_state SET frozen = 0, cheat_node_id = NULL WHERE control_id = 1") + const activePartnerRow = executor.get(ACTIVE_PARTNER_SELECT) + if (activePartnerRow !== null) { + const activePartner = toPartner(activePartnerRow) + executor.run("UPDATE partners SET retired_at = ? WHERE partner_id = ?", [ + input.createdAt, + activePartner.partnerId, + ]) + executor.run( + "INSERT INTO partner_events (event_id, partner_id, kind, current_node_id, gauge, is_terminal, token_delta, receipt_key, created_at) VALUES (?, ?, 'retired', ?, ?, ?, NULL, NULL, ?)", + [ + `event-retired-${activePartner.generation}`, + activePartner.partnerId, + activePartner.currentNodeId, + activePartner.gauge, + activePartner.isTerminal, + input.createdAt, + ], + ) + } + const generationRow = executor.get<{ readonly generation: number }>( + "SELECT COALESCE(MAX(generation), 0) + 1 AS generation FROM partners", + ) + if (generationRow === null) throw new Error("Generation allocation failed") + const partnerId = `partner-${generationRow.generation}` + executor.run( + "INSERT INTO partners (partner_id, generation, current_node_id, gauge, is_terminal, created_at, retired_at) VALUES (?, ?, ?, ?, ?, ?, NULL)", + [partnerId, generationRow.generation, input.currentNodeId, input.gauge, input.isTerminal, input.createdAt], + ) + executor.run( + "INSERT INTO partner_events (event_id, partner_id, kind, current_node_id, gauge, is_terminal, token_delta, receipt_key, created_at) VALUES (?, ?, 'spawned', ?, ?, ?, NULL, NULL, ?)", + [ + `event-spawn-${generationRow.generation}`, + partnerId, + input.currentNodeId, + input.gauge, + input.isTerminal, + input.createdAt, + ], + ) + return { partnerId, generation: generationRow.generation, ...input, retiredAt: null } + }) + }, + listPartnerEvents(partnerId: string) { + return executor.all(PARTNER_EVENTS_SELECT, [partnerId]).map(toPersistedPartnerEvent) + }, + applyUsageReceipt(metadata: UsageReceiptMetadata, evolve: (partner: Partner) => PartnerProgression) { + return executor.transaction(() => { + const canonicalReceipt = executor.get( + "SELECT receipt_key FROM usage_receipts WHERE receipt_key = ? LIMIT 1", + [metadata.receiptKey], + ) + const controlReceipt = executor.get( + "SELECT receipt_key FROM vpet_control_receipts WHERE receipt_key = ? LIMIT 1", + [metadata.receiptKey], + ) + if (canonicalReceipt !== null || controlReceipt !== null) return { kind: "duplicate" } as const + const controlState = executor.get( + "SELECT frozen, cheat_node_id FROM vpet_control_state WHERE control_id = 1", + ) + if (controlState === null) throw new Error("VPet control state row is missing") + if (controlState.cheat_node_id !== null) { + executor.run( + "INSERT INTO vpet_control_receipts (receipt_key, mode, token_delta, cost, created_at) VALUES (?, 'cheat', ?, ?, ?)", + [metadata.receiptKey, metadata.tokenDelta, metadata.cost ?? null, metadata.createdAt], + ) + return { kind: "applied" } as const + } + if (controlState.frozen === 1) { + executor.run( + "INSERT INTO vpet_control_receipts (receipt_key, mode, token_delta, cost, created_at) VALUES (?, 'frozen', ?, ?, ?)", + [metadata.receiptKey, metadata.tokenDelta, metadata.cost ?? null, metadata.createdAt], + ) + executor.run("UPDATE trainer_state SET total_tokens = total_tokens + ? WHERE trainer_id = 1", [ + metadata.tokenDelta, + ]) + return { kind: "applied" } as const + } + const activePartnerRow = executor.get(ACTIVE_PARTNER_SELECT) + if (activePartnerRow === null) return { kind: "no_active_partner" } as const + const activePartner = toPartner(activePartnerRow) + const nextState = evolve(activePartner) + executor.run("UPDATE partners SET current_node_id = ?, gauge = ?, is_terminal = ? WHERE partner_id = ?", [ + nextState.currentNodeId, + nextState.gauge, + nextState.isTerminal, + activePartner.partnerId, + ]) + executor.run( + "INSERT INTO partner_events (event_id, partner_id, kind, current_node_id, gauge, is_terminal, token_delta, receipt_key, created_at) VALUES (?, ?, 'usage_applied', ?, ?, ?, ?, ?, ?)", + [ + metadata.eventId, + activePartner.partnerId, + nextState.currentNodeId, + nextState.gauge, + nextState.isTerminal, + metadata.tokenDelta, + metadata.receiptKey, + metadata.createdAt, + ], + ) + executor.run( + "INSERT INTO usage_receipts (receipt_key, partner_id, event_id, token_delta, cost, created_at) VALUES (?, ?, ?, ?, ?, ?)", + [ + metadata.receiptKey, + activePartner.partnerId, + metadata.eventId, + metadata.tokenDelta, + metadata.cost ?? null, + metadata.createdAt, + ], + ) + executor.run("UPDATE trainer_state SET total_tokens = total_tokens + ? WHERE trainer_id = 1", [ + metadata.tokenDelta, + ]) + return { kind: "applied" } as const + }) + }, + listUsageReceipts() { + return executor.all(USAGE_RECEIPTS_SELECT).map(toUsageReceiptRecord) + }, + } satisfies SqliteVpetWriteStore + + return store +} diff --git a/packages/vpet-core/src/application/models/sidebar-card-inputs.ts b/packages/vpet-core/src/application/models/sidebar-card-inputs.ts new file mode 100644 index 0000000..57c1c11 --- /dev/null +++ b/packages/vpet-core/src/application/models/sidebar-card-inputs.ts @@ -0,0 +1,13 @@ +import type { DigimonNode } from "../../domain/digimon-node.ts" + +export type SidebarCardInputs = + | { readonly kind: "no_partner" } + | { + readonly kind: "partner" + readonly node: DigimonNode + readonly gauge: number + readonly isTerminal: boolean + readonly frozen: boolean + readonly isSetOverride: boolean + readonly trainerTotalTokens: number + } diff --git a/packages/vpet-core/src/application/models/spawn-partner.ts b/packages/vpet-core/src/application/models/spawn-partner.ts new file mode 100644 index 0000000..102e05a --- /dev/null +++ b/packages/vpet-core/src/application/models/spawn-partner.ts @@ -0,0 +1,10 @@ +export type SpawnPartnerInput = { + readonly currentNodeId: string + readonly gauge: number + readonly isTerminal: boolean + readonly createdAt: string +} + +export type SpawnPartnerResult = { + readonly generation: number +} diff --git a/packages/vpet-core/src/application/models/usage.ts b/packages/vpet-core/src/application/models/usage.ts new file mode 100644 index 0000000..e881ce5 --- /dev/null +++ b/packages/vpet-core/src/application/models/usage.ts @@ -0,0 +1,26 @@ +export type UsageReceiptMetadata = { + readonly receiptKey: string + readonly eventId: string + readonly tokenDelta: number + readonly cost?: number | null + readonly createdAt: string +} + +export type ApplyUsageReceiptOutcome = + | { readonly kind: "applied" } + | { readonly kind: "duplicate" } + | { readonly kind: "no_active_partner" } + +export type UsageEvolutionTransition = { + readonly fromNodeId: string + readonly toNodeId: string +} + +export type UsageProcessingResult = + | { + readonly kind: "applied" + readonly receiptKey: string + readonly evolution?: UsageEvolutionTransition + } + | { readonly kind: "duplicate"; readonly receiptKey: string } + | { readonly kind: "no_active_partner"; readonly receiptKey: string } diff --git a/packages/vpet-core/src/application/models/vpet-archive.ts b/packages/vpet-core/src/application/models/vpet-archive.ts new file mode 100644 index 0000000..8eb00db --- /dev/null +++ b/packages/vpet-core/src/application/models/vpet-archive.ts @@ -0,0 +1,18 @@ +export type VpetArchiveEvent = { + readonly eventId: string + readonly currentNodeId: string + readonly createdAt: string +} + +export type VpetArchivePartner = { + readonly partnerId: string + readonly generation: number + readonly createdAt: string + readonly retiredAt: string | null + readonly events: readonly VpetArchiveEvent[] +} + +export type VpetArchiveResult = + | { readonly kind: "available"; readonly partners: readonly VpetArchivePartner[] } + | { readonly kind: "empty" } + | { readonly kind: "unavailable"; readonly message: string } diff --git a/packages/vpet-core/src/application/models/vpet-control.ts b/packages/vpet-core/src/application/models/vpet-control.ts new file mode 100644 index 0000000..8ff8f37 --- /dev/null +++ b/packages/vpet-core/src/application/models/vpet-control.ts @@ -0,0 +1,7 @@ +export type FreezeVpetOutcome = { readonly kind: "frozen" } | { readonly kind: "already_frozen" } + +export type UnfreezeVpetOutcome = { readonly kind: "unfrozen" } | { readonly kind: "already_unfrozen" } + +export type SetCheatNodeOutcome = + | { readonly kind: "set"; readonly cheatNodeId: string } + | { readonly kind: "already_set"; readonly cheatNodeId: string } diff --git a/packages/vpet-core/src/application/ports/partner-lifecycle.ts b/packages/vpet-core/src/application/ports/partner-lifecycle.ts new file mode 100644 index 0000000..db72e08 --- /dev/null +++ b/packages/vpet-core/src/application/ports/partner-lifecycle.ts @@ -0,0 +1,6 @@ +import type { Partner } from "../../domain/partner.ts" +import type { SpawnPartnerInput } from "../models/spawn-partner.ts" + +export type PartnerLifecycle = { + spawnPartner: (input: SpawnPartnerInput) => Partner +} diff --git a/packages/vpet-core/src/application/ports/sidebar-snapshot.ts b/packages/vpet-core/src/application/ports/sidebar-snapshot.ts new file mode 100644 index 0000000..0bc7f77 --- /dev/null +++ b/packages/vpet-core/src/application/ports/sidebar-snapshot.ts @@ -0,0 +1,12 @@ +export type SidebarSnapshot = { + readonly currentNodeId: string + readonly gauge: number + readonly isTerminal: boolean + readonly frozen: boolean + readonly isSetOverride: boolean + readonly trainerTotalTokens: number +} + +export type SidebarSnapshotReader = { + getSidebarSnapshot: () => SidebarSnapshot | null +} diff --git a/packages/vpet-core/src/application/ports/usage-ledger.ts b/packages/vpet-core/src/application/ports/usage-ledger.ts new file mode 100644 index 0000000..4c93089 --- /dev/null +++ b/packages/vpet-core/src/application/ports/usage-ledger.ts @@ -0,0 +1,9 @@ +import type { Partner, PartnerProgression } from "../../domain/partner.ts" +import type { ApplyUsageReceiptOutcome, UsageReceiptMetadata } from "../models/usage.ts" + +export type UsageLedger = { + applyUsageReceipt: ( + metadata: UsageReceiptMetadata, + evolve: (partner: Partner) => PartnerProgression, + ) => ApplyUsageReceiptOutcome +} diff --git a/packages/vpet-core/src/application/ports/vpet-archive.ts b/packages/vpet-core/src/application/ports/vpet-archive.ts new file mode 100644 index 0000000..461f4a3 --- /dev/null +++ b/packages/vpet-core/src/application/ports/vpet-archive.ts @@ -0,0 +1,5 @@ +import type { VpetArchiveResult } from "../models/vpet-archive.ts" + +export type VpetArchiveReader = { + getArchive: () => VpetArchiveResult +} diff --git a/packages/vpet-core/src/application/ports/vpet-control.ts b/packages/vpet-core/src/application/ports/vpet-control.ts new file mode 100644 index 0000000..9f78de1 --- /dev/null +++ b/packages/vpet-core/src/application/ports/vpet-control.ts @@ -0,0 +1,7 @@ +import type { FreezeVpetOutcome, SetCheatNodeOutcome, UnfreezeVpetOutcome } from "../models/vpet-control.ts" + +export type VpetControl = { + freeze: () => FreezeVpetOutcome + unfreeze: () => UnfreezeVpetOutcome + setCheatNode: (validatedNodeId: string) => SetCheatNodeOutcome +} diff --git a/packages/vpet-core/src/application/use-cases/freeze-vpet.ts b/packages/vpet-core/src/application/use-cases/freeze-vpet.ts new file mode 100644 index 0000000..bbd8ffc --- /dev/null +++ b/packages/vpet-core/src/application/use-cases/freeze-vpet.ts @@ -0,0 +1,4 @@ +import type { FreezeVpetOutcome } from "../models/vpet-control.ts" +import type { VpetControl } from "../ports/vpet-control.ts" + +export const freezeVpet = (control: Pick): FreezeVpetOutcome => control.freeze() diff --git a/packages/vpet-core/src/application/use-cases/get-sidebar-card-inputs.ts b/packages/vpet-core/src/application/use-cases/get-sidebar-card-inputs.ts new file mode 100644 index 0000000..d1771c4 --- /dev/null +++ b/packages/vpet-core/src/application/use-cases/get-sidebar-card-inputs.ts @@ -0,0 +1,23 @@ +import type { DigimonCatalog } from "../../domain/digimon-node.ts" +import type { SidebarCardInputs } from "../models/sidebar-card-inputs.ts" +import type { SidebarSnapshotReader } from "../ports/sidebar-snapshot.ts" + +const NO_PARTNER: SidebarCardInputs = { kind: "no_partner" } + +export const getSidebarCardInputs = (reader: SidebarSnapshotReader, catalog: DigimonCatalog): SidebarCardInputs => { + const snapshot = reader.getSidebarSnapshot() + if (snapshot === null) return NO_PARTNER + + const node = catalog.byId.get(snapshot.currentNodeId) + if (node === undefined) return NO_PARTNER + + return { + kind: "partner", + node, + gauge: snapshot.gauge, + isTerminal: snapshot.isTerminal, + frozen: snapshot.frozen, + isSetOverride: snapshot.isSetOverride, + trainerTotalTokens: snapshot.trainerTotalTokens, + } +} diff --git a/packages/vpet-core/src/application/use-cases/reconcile-usage.ts b/packages/vpet-core/src/application/use-cases/reconcile-usage.ts new file mode 100644 index 0000000..bb1a404 --- /dev/null +++ b/packages/vpet-core/src/application/use-cases/reconcile-usage.ts @@ -0,0 +1,27 @@ +import type { DigimonNode } from "../../domain/digimon-node.ts" +import type { EvolutionSelector, StageThresholds } from "../../domain/evolution.ts" +import type { UsageProcessingResult } from "../models/usage.ts" +import type { UsageLedger } from "../ports/usage-ledger.ts" +import { recordUsage, type CompletedUsage } from "./record-usage.ts" + +export type ReconcileUsageInput = { + readonly usages: readonly CompletedUsage[] + readonly ledger: UsageLedger + readonly digimonById: ReadonlyMap + readonly selector: EvolutionSelector + readonly thresholds: StageThresholds +} + +export const reconcileUsage = ({ + usages, + ledger, + digimonById, + selector, + thresholds, +}: ReconcileUsageInput): readonly UsageProcessingResult[] => { + const outcomes: UsageProcessingResult[] = [] + for (const usage of usages) { + outcomes.push(recordUsage({ usage, ledger, digimonById, selector, thresholds })) + } + return outcomes +} diff --git a/packages/vpet-core/src/application/use-cases/record-usage.ts b/packages/vpet-core/src/application/use-cases/record-usage.ts new file mode 100644 index 0000000..718e073 --- /dev/null +++ b/packages/vpet-core/src/application/use-cases/record-usage.ts @@ -0,0 +1,54 @@ +import type { DigimonNode } from "../../domain/digimon-node.ts" +import { applyTokenProgress, type EvolutionSelector, type StageThresholds } from "../../domain/evolution.ts" +import type { UsageEvolutionTransition, UsageProcessingResult, UsageReceiptMetadata } from "../models/usage.ts" +import type { UsageLedger } from "../ports/usage-ledger.ts" + +export type CompletedUsage = UsageReceiptMetadata + +export type RecordUsageInput = { + readonly usage: CompletedUsage + readonly ledger: UsageLedger + readonly digimonById: ReadonlyMap + readonly selector: EvolutionSelector + readonly thresholds: StageThresholds +} + +export const recordUsage = ({ + usage, + ledger, + digimonById, + selector, + thresholds, +}: RecordUsageInput): UsageProcessingResult => { + let evolution: UsageEvolutionTransition | undefined + const outcome = ledger.applyUsageReceipt(usage, (partner) => { + const current = digimonById.get(partner.currentNodeId) + if (current === undefined) + throw new Error(`Persisted partner node ${partner.currentNodeId} is missing from the catalog`) + + const next = applyTokenProgress( + { current, gauge: partner.gauge, isTerminal: partner.isTerminal }, + usage.tokenDelta, + selector, + digimonById, + thresholds, + ) + + if (next.current.id !== current.id) { + evolution = { fromNodeId: current.id, toNodeId: next.current.id } + } + + return { currentNodeId: next.current.id, gauge: next.gauge, isTerminal: next.isTerminal } + }) + + switch (outcome.kind) { + case "applied": + return evolution === undefined + ? { kind: "applied", receiptKey: usage.receiptKey } + : { kind: "applied", receiptKey: usage.receiptKey, evolution } + case "duplicate": + return { kind: "duplicate", receiptKey: usage.receiptKey } + case "no_active_partner": + return { kind: "no_active_partner", receiptKey: usage.receiptKey } + } +} diff --git a/packages/vpet-core/src/application/use-cases/set-vpet-cheat-node.ts b/packages/vpet-core/src/application/use-cases/set-vpet-cheat-node.ts new file mode 100644 index 0000000..642982d --- /dev/null +++ b/packages/vpet-core/src/application/use-cases/set-vpet-cheat-node.ts @@ -0,0 +1,7 @@ +import type { SetCheatNodeOutcome } from "../models/vpet-control.ts" +import type { VpetControl } from "../ports/vpet-control.ts" + +export const setVpetCheatNode = ( + control: Pick, + validatedNodeId: string, +): SetCheatNodeOutcome => control.setCheatNode(validatedNodeId) diff --git a/packages/vpet-core/src/application/use-cases/spawn-partner.ts b/packages/vpet-core/src/application/use-cases/spawn-partner.ts new file mode 100644 index 0000000..0037d1c --- /dev/null +++ b/packages/vpet-core/src/application/use-cases/spawn-partner.ts @@ -0,0 +1,13 @@ +import type { PartnerLifecycle } from "../ports/partner-lifecycle.ts" +import type { SpawnPartnerResult } from "../models/spawn-partner.ts" + +export const spawnPartner = (lifecycle: PartnerLifecycle, createdAt: string): SpawnPartnerResult => { + const partner = lifecycle.spawnPartner({ + currentNodeId: "0-001", + gauge: 0, + isTerminal: false, + createdAt, + }) + + return { generation: partner.generation } +} diff --git a/packages/vpet-core/src/application/use-cases/unfreeze-vpet.ts b/packages/vpet-core/src/application/use-cases/unfreeze-vpet.ts new file mode 100644 index 0000000..10d4001 --- /dev/null +++ b/packages/vpet-core/src/application/use-cases/unfreeze-vpet.ts @@ -0,0 +1,4 @@ +import type { UnfreezeVpetOutcome } from "../models/vpet-control.ts" +import type { VpetControl } from "../ports/vpet-control.ts" + +export const unfreezeVpet = (control: Pick): UnfreezeVpetOutcome => control.unfreeze() diff --git a/packages/vpet-core/src/config/defaults.ts b/packages/vpet-core/src/config/defaults.ts new file mode 100644 index 0000000..ab6eb1c --- /dev/null +++ b/packages/vpet-core/src/config/defaults.ts @@ -0,0 +1,46 @@ +import type { ResolvedVpetSettings, StageLabels, StageThresholdSettings, VpetStageLabels } from "./types.ts" + +const EN_STAGE_LABELS = Object.freeze({ + egg: "DigiEgg", + babyI: "In Training I", + babyII: "In Training II", + child: "Rookie", + adult: "Champion", + perfect: "Ultimate", + ultimate: "Mega", + superUltimate: "Ultra", +} as const satisfies StageLabels) + +const JP_STAGE_LABELS = Object.freeze({ + egg: "Digitama", + babyI: "Baby I", + babyII: "Baby II", + child: "Child", + adult: "Adult", + perfect: "Perfect", + ultimate: "Ultimate", + superUltimate: "SuperUltimate", +} as const satisfies StageLabels) + +export const VPET_STAGE_LABELS = Object.freeze({ + en: EN_STAGE_LABELS, + jp: JP_STAGE_LABELS, +} as const satisfies VpetStageLabels) + +export const DEFAULT_STAGE_THRESHOLDS = Object.freeze({ + egg: 500_000, + babyI: 1_000_000, + babyII: 2_000_000, + child: 4_000_000, + adult: 7_500_000, + perfect: 12_500_000, + ultimate: 20_000_000, + superUltimate: 30_000_000, +} as const satisfies StageThresholdSettings) + +export const DEFAULT_VPET_SETTINGS = Object.freeze({ + language: "jp", + notifications: true, + stageLabels: VPET_STAGE_LABELS, + stageThresholds: DEFAULT_STAGE_THRESHOLDS, +} as const satisfies ResolvedVpetSettings) diff --git a/packages/vpet-core/src/config/normalize.ts b/packages/vpet-core/src/config/normalize.ts new file mode 100644 index 0000000..cef8ed4 --- /dev/null +++ b/packages/vpet-core/src/config/normalize.ts @@ -0,0 +1,57 @@ +import { DEFAULT_STAGE_THRESHOLDS, DEFAULT_VPET_SETTINGS } from "./defaults.ts" +import type { ResolvedVpetSettings, StageThresholdKey, VpetLanguage } from "./types.ts" + +const isRecord = (value: unknown): value is Readonly> => { + return typeof value === "object" && value !== null && !Array.isArray(value) +} + +const isLanguage = (value: unknown): value is VpetLanguage => value === "en" || value === "jp" + +const isBoolean = (value: unknown): value is boolean => typeof value === "boolean" + +const isThreshold = (value: unknown): value is number => { + return typeof value === "number" && Number.isSafeInteger(value) && value > 0 +} + +const read = (input: Readonly>, key: string): unknown => { + try { + return input[key] + } catch { + return undefined + } +} + +const normalizeThreshold = (input: Readonly>, key: StageThresholdKey): number => { + const value = read(input, key) + return isThreshold(value) ? value : DEFAULT_STAGE_THRESHOLDS[key] +} + +export const normalizeVpetSettings = (input: unknown): ResolvedVpetSettings => { + try { + if (!isRecord(input)) return DEFAULT_VPET_SETTINGS + + const thresholdInput = read(input, "stageThresholds") + const thresholds = isRecord(thresholdInput) ? thresholdInput : {} + const stageThresholds = Object.freeze({ + egg: normalizeThreshold(thresholds, "egg"), + babyI: normalizeThreshold(thresholds, "babyI"), + babyII: normalizeThreshold(thresholds, "babyII"), + child: normalizeThreshold(thresholds, "child"), + adult: normalizeThreshold(thresholds, "adult"), + perfect: normalizeThreshold(thresholds, "perfect"), + ultimate: normalizeThreshold(thresholds, "ultimate"), + superUltimate: normalizeThreshold(thresholds, "superUltimate"), + } as const) + + const language = read(input, "language") + const notifications = read(input, "notifications") + return Object.freeze({ + language: isLanguage(language) ? language : DEFAULT_VPET_SETTINGS.language, + notifications: isBoolean(notifications) ? notifications : DEFAULT_VPET_SETTINGS.notifications, + stageLabels: DEFAULT_VPET_SETTINGS.stageLabels, + stageThresholds, + }) + } catch { + return DEFAULT_VPET_SETTINGS + } +} diff --git a/packages/vpet-core/src/config/types.ts b/packages/vpet-core/src/config/types.ts new file mode 100644 index 0000000..d0932b3 --- /dev/null +++ b/packages/vpet-core/src/config/types.ts @@ -0,0 +1,29 @@ +export const VPET_LANGUAGES = Object.freeze(["en", "jp"] as const) + +export type VpetLanguage = (typeof VPET_LANGUAGES)[number] + +export const STAGE_THRESHOLD_KEYS = Object.freeze([ + "egg", + "babyI", + "babyII", + "child", + "adult", + "perfect", + "ultimate", + "superUltimate", +] as const) + +export type StageThresholdKey = (typeof STAGE_THRESHOLD_KEYS)[number] + +export type StageThresholdSettings = Readonly> + +export type StageLabels = Readonly> + +export type VpetStageLabels = Readonly> + +export type ResolvedVpetSettings = Readonly<{ + readonly language: VpetLanguage + readonly notifications: boolean + readonly stageLabels: VpetStageLabels + readonly stageThresholds: StageThresholdSettings +}> diff --git a/packages/vpet-core/src/data/catalog.ts b/packages/vpet-core/src/data/catalog.ts new file mode 100644 index 0000000..5d7636e --- /dev/null +++ b/packages/vpet-core/src/data/catalog.ts @@ -0,0 +1,51 @@ +import { DIGIMON_DATA } from "./digimon-data.ts" +import { isDigimonStage } from "../domain/stage.ts" +import type { DigimonCatalog, DigimonNode } from "../domain/digimon-node.ts" + +export type { DigimonCatalog, DigimonNode } from "../domain/digimon-node.ts" + +export type RawDigimonNode = { + readonly id: string + readonly name_en: string + readonly name_jp: string + readonly next_evolutions: readonly string[] + readonly sprite: string + readonly stage: number + readonly url: string +} + +const parseNode = (input: RawDigimonNode): DigimonNode => { + if (!isDigimonStage(input.stage)) throw new Error(`Invalid stage ${input.stage} for ${input.id}`) + + return Object.freeze({ + id: input.id, + nameEn: input.name_en, + nameJp: input.name_jp, + nextEvolutions: Object.freeze([...input.next_evolutions]), + sprite: input.sprite, + stage: input.stage, + url: input.url, + }) +} + +export const parseDigimonCatalog = (input: readonly RawDigimonNode[]): DigimonCatalog => { + const nodes = input.map(parseNode) + const byId = new Map() + + for (const node of nodes) { + if (byId.has(node.id)) throw new Error(`Duplicate digimon id ${node.id}`) + byId.set(node.id, node) + } + + for (const node of nodes) { + for (const targetId of node.nextEvolutions) { + if (!byId.has(targetId)) throw new Error(`Invalid next_evolutions reference ${targetId} from ${node.id}`) + } + } + + return Object.freeze({ nodes: Object.freeze(nodes), byId }) +} + +export const DIGIMON_CATALOG = parseDigimonCatalog(DIGIMON_DATA) + +export const loadDigimonCatalog = async (): Promise => DIGIMON_CATALOG diff --git a/packages/vpet-core/src/data/digimon-data.ts b/packages/vpet-core/src/data/digimon-data.ts new file mode 100644 index 0000000..2242fad --- /dev/null +++ b/packages/vpet-core/src/data/digimon-data.ts @@ -0,0 +1,6120 @@ +export type DigimonStage = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 + +export type DigimonId = `${DigimonStage}-${number}` + +export type DigimonRecord = { + readonly name_en: string + readonly name_jp: string + readonly next_evolutions: readonly DigimonId[] + readonly stage: DigimonStage + readonly sprite: string + readonly id: DigimonId + readonly url: string +} + +export const DIGIMON_DATA: readonly DigimonRecord[] = [ + { + name_en: "Digiegg", + name_jp: "Digitama", + next_evolutions: [ + "1-001", + "1-002", + "1-003", + "1-004", + "1-005", + "1-006", + "1-007", + "1-008", + "1-009", + "1-010", + "1-011", + "1-012", + "1-013", + "1-014", + "1-015", + "1-016", + "1-017", + "1-018", + "1-019", + "1-020", + "1-021", + "1-022", + "1-023", + "1-024", + "1-025", + "1-026", + "1-027", + "1-028", + "1-029", + "1-030", + "1-031", + ], + stage: 0, + sprite: "egg", + id: "0-001", + url: "https://digimon.net/reference_en/", + }, + { + name_en: "Argomon", + name_jp: "Algomon", + next_evolutions: ["2-001"], + stage: 1, + sprite: "argomon_baby_i", + id: "1-001", + url: "https://digimon.net/reference_en/detail.php?directory_name=algomon_lv1", + }, + { + name_en: "Botamon", + name_jp: "Botamon", + next_evolutions: ["2-013", "2-026", "2-003"], + stage: 1, + sprite: "botamon", + id: "1-002", + url: "https://digimon.net/reference_en/detail.php?directory_name=botamon", + }, + { + name_en: "Chibomon", + name_jp: "Chicomon", + next_evolutions: ["2-006"], + stage: 1, + sprite: "chibomon", + id: "1-003", + url: "https://digimon.net/reference_en/detail.php?directory_name=chicomon", + }, + { + name_en: "Choromon", + name_jp: "Choromon", + next_evolutions: ["2-011"], + stage: 1, + sprite: "choromon", + id: "1-004", + url: "https://digimon.net/reference_en/detail.php?directory_name=choromon", + }, + { + name_en: "Conomon", + name_jp: "Cocomon", + next_evolutions: ["2-012"], + stage: 1, + sprite: "conomon", + id: "1-005", + url: "https://digimon.net/reference_en/detail.php?directory_name=cocomon", + }, + { + name_en: "Cotsucomon", + name_jp: "Cotsucomon", + next_evolutions: ["2-010"], + stage: 1, + sprite: "cotsucomon", + id: "1-006", + url: "https://digimon.net/reference_en/detail.php?directory_name=cotsucomon", + }, + { + name_en: "Dodomon", + name_jp: "Dodomon", + next_evolutions: ["2-007"], + stage: 1, + sprite: "dodomon", + id: "1-007", + url: "https://digimon.net/reference_en/detail.php?directory_name=dodomon", + }, + { + name_en: "Fufumon", + name_jp: "Fufumon", + next_evolutions: ["2-014"], + stage: 1, + sprite: "fufumon", + id: "1-008", + url: "https://digimon.net/reference_en/detail.php?directory_name=fufumon", + }, + { + name_en: "Keemon", + name_jp: "Kiimon", + next_evolutions: ["2-027"], + stage: 1, + sprite: "keemon", + id: "1-009", + url: "https://digimon.net/reference_en/detail.php?directory_name=keemon", + }, + { + name_en: "Ketomon", + name_jp: "Ketomon", + next_evolutions: ["2-009"], + stage: 1, + sprite: "ketomon", + id: "1-010", + url: "https://digimon.net/reference_en/detail.php?directory_name=ketomon", + }, + { + name_en: "Kuramon", + name_jp: "Kuramon", + next_evolutions: ["2-023"], + stage: 1, + sprite: "kuramon", + id: "1-011", + url: "https://digimon.net/reference_en/detail.php?directory_name=kuramon", + }, + { + name_en: "Mokumon", + name_jp: "Mokumon", + next_evolutions: ["2-005", "2-011", "2-037"], + stage: 1, + sprite: "mokumon", + id: "1-012", + url: "https://digimon.net/reference_en/detail.php?directory_name=mokumon", + }, + { + name_en: "Nyokimon", + name_jp: "Nyokimon", + next_evolutions: ["2-028", "2-003"], + stage: 1, + sprite: "nyokimon", + id: "1-013", + url: "https://digimon.net/reference_en/detail.php?directory_name=nyokimon", + }, + { + name_en: "Pabumon", + name_jp: "Bubbmon", + next_evolutions: ["2-015", "2-033"], + stage: 1, + sprite: "pabumon", + id: "1-014", + url: "https://digimon.net/reference_en/detail.php?directory_name=bubbmon", + }, + { + name_en: "Petitmon", + name_jp: "Petitmon", + next_evolutions: ["2-002"], + stage: 1, + sprite: "petitmon", + id: "1-015", + url: "https://digimon.net/reference_en/detail.php?directory_name=petitmon", + }, + { + name_en: "Pichimon", + name_jp: "Pitchmon", + next_evolutions: ["2-004"], + stage: 1, + sprite: "pichimon", + id: "1-016", + url: "https://digimon.net/reference_en/detail.php?directory_name=pitchmon", + }, + { + name_en: "Poyomon", + name_jp: "Poyomon", + next_evolutions: ["2-021"], + stage: 1, + sprite: "poyomon", + id: "1-017", + url: "https://digimon.net/reference_en/detail.php?directory_name=poyomon", + }, + { + name_en: "Punimon", + name_jp: "Punimon", + next_evolutions: ["2-024"], + stage: 1, + sprite: "punimon", + id: "1-018", + url: "https://digimon.net/reference_en/detail.php?directory_name=punimon", + }, + { + name_en: "Pururumon", + name_jp: "Pururumon", + next_evolutions: ["2-018"], + stage: 1, + sprite: "pururumon", + id: "1-019", + url: "https://digimon.net/reference_en/detail.php?directory_name=pururumon", + }, + { + name_en: "Puttimon", + name_jp: "Puttimon", + next_evolutions: ["2-022"], + stage: 1, + sprite: "puttimon", + id: "1-020", + url: "https://digimon.net/reference_en/detail.php?directory_name=puttimon", + }, + { + name_en: "Sakumon", + name_jp: "Sakumon", + next_evolutions: ["2-019"], + stage: 1, + sprite: "sakumon", + id: "1-021", + url: "https://digimon.net/reference_en/detail.php?directory_name=sakumon", + }, + { + name_en: "Tsubumon", + name_jp: "Tsubumon", + next_evolutions: ["2-025"], + stage: 1, + sprite: "tsubumon", + id: "1-022", + url: "https://digimon.net/reference_en/detail.php?directory_name=tsubumon", + }, + { + name_en: "YukimiBotamon", + name_jp: "Yukimibotamon", + next_evolutions: ["2-016", "2-032", "2-034"], + stage: 1, + sprite: "yukimibotamon", + id: "1-023", + url: "https://digimon.net/reference_en/detail.php?directory_name=yukimibotamon", + }, + { + name_en: "Yuramon", + name_jp: "Yuramon", + next_evolutions: ["2-020", "2-003"], + stage: 1, + sprite: "yuramon", + id: "1-024", + url: "https://digimon.net/reference_en/detail.php?directory_name=yuramon", + }, + { + name_en: "Zerimon", + name_jp: "Zerimon", + next_evolutions: ["2-008"], + stage: 1, + sprite: "zerimon", + id: "1-025", + url: "https://digimon.net/reference_en/detail.php?directory_name=zerimon", + }, + { + name_en: "Zurumon", + name_jp: "Zurumon", + next_evolutions: ["2-017", "2-011"], + stage: 1, + sprite: "zurumon", + id: "1-026", + url: "https://digimon.net/reference_en/detail.php?directory_name=zurumon", + }, + { + name_en: "Chibickmon", + name_jp: "Chibickmon", + next_evolutions: ["2-035"], + stage: 1, + sprite: "chibickmon", + id: "1-027", + url: "https://digimon.net/reference_en/detail.php?directory_name=chibickmon", + }, + { + name_en: "Dokimon", + name_jp: "Dokimon", + next_evolutions: ["2-029"], + stage: 1, + sprite: "dokimon", + id: "1-028", + url: "https://digimon.net/reference_en/detail.php?directory_name=dokimon", + }, + { + name_en: "Jyarimon", + name_jp: "Jyarimon", + next_evolutions: ["2-030"], + stage: 1, + sprite: "jyarimon", + id: "1-029", + url: "https://digimon.net/reference_en/detail.php?directory_name=jyarimon", + }, + { + name_en: "Relemon", + name_jp: "Relemon", + next_evolutions: ["2-036"], + stage: 1, + sprite: "relemon", + id: "1-030", + url: "https://digimon.net/reference_en/detail.php?directory_name=relemon", + }, + { + name_en: "Sandmon", + name_jp: "Sunamon", + next_evolutions: ["2-031"], + stage: 1, + sprite: "sandmon", + id: "1-031", + url: "https://digimon.net/reference_en/detail.php?directory_name=sunamon", + }, + { + name_en: "Argomon", + name_jp: "Algomon", + next_evolutions: ["3-005", "3-027", "3-045", "3-080"], + stage: 2, + sprite: "argomon_baby_ii", + id: "2-001", + url: "https://digimon.net/reference_en/detail.php?directory_name=algomon_lv2", + }, + { + name_en: "Bebydomon", + name_jp: "Babydmon", + next_evolutions: ["3-016", "3-003"], + stage: 2, + sprite: "bebydomon", + id: "2-002", + url: "https://digimon.net/reference_en/detail.php?directory_name=babydmon", + }, + { + name_en: "Budmon", + name_jp: "Budmon", + next_evolutions: ["3-046"], + stage: 2, + sprite: "budmon", + id: "2-003", + url: "https://digimon.net/reference_en/detail.php?directory_name=budmon", + }, + { + name_en: "Bukamon", + name_jp: "Pukamon", + next_evolutions: ["3-050", "3-012", "3-029", "3-013", "3-070", "3-065"], + stage: 2, + sprite: "bukamon", + id: "2-004", + url: "https://digimon.net/reference_en/detail.php?directory_name=pukamon", + }, + { + name_en: "DemiMeramon", + name_jp: "PetiMeramon", + next_evolutions: ["3-072", "3-011", "3-014", "3-031", "3-079"], + stage: 2, + sprite: "demimeramon", + id: "2-005", + url: "https://digimon.net/reference_en/detail.php?directory_name=petimeramon", + }, + { + name_en: "DemiVeemon", + name_jp: "Chibimon", + next_evolutions: ["3-078"], + stage: 2, + sprite: "demiveemon", + id: "2-006", + url: "https://digimon.net/reference_en/detail.php?directory_name=chibimon", + }, + { + name_en: "Dorimon", + name_jp: "Dorimon", + next_evolutions: ["3-015", "3-082"], + stage: 2, + sprite: "dorimon", + id: "2-007", + url: "https://digimon.net/reference_en/detail.php?directory_name=dorimon", + }, + { + name_en: "Gummymon", + name_jp: "Gummymon", + next_evolutions: ["3-015", "3-075", "3-009", "3-039", "3-057", "3-074"], + stage: 2, + sprite: "gummymon", + id: "2-008", + url: "https://digimon.net/reference_en/detail.php?directory_name=gummymon", + }, + { + name_en: "Hopmon", + name_jp: "Hopmon", + next_evolutions: ["3-051", "3-040", "3-078", "3-039"], + stage: 2, + sprite: "hopmon", + id: "2-009", + url: "https://digimon.net/reference_en/detail.php?directory_name=hopmon", + }, + { + name_en: "Kakkinmon", + name_jp: "Kakkinmon", + next_evolutions: ["3-049"], + stage: 2, + sprite: "kakkinmon", + id: "2-010", + url: "https://digimon.net/reference_en/detail.php?directory_name=kakkinmon", + }, + { + name_en: "Kapurimon", + name_jp: "Capromon", + next_evolutions: ["3-033", "3-042", "3-077"], + stage: 2, + sprite: "kapurimon", + id: "2-011", + url: "https://digimon.net/reference_en/detail.php?directory_name=capromon", + }, + { + name_en: "Kokomon", + name_jp: "Chocomon", + next_evolutions: ["3-062", "3-048", "3-009", "3-039", "3-071", "3-047"], + stage: 2, + sprite: "kokomon", + id: "2-012", + url: "https://digimon.net/reference_en/detail.php?directory_name=chocomon", + }, + { + name_en: "Koromon", + name_jp: "Koromon", + next_evolutions: ["3-001", "3-007", "3-032", "3-010", "3-051", "3-082"], + stage: 2, + sprite: "koromon", + id: "2-013", + url: "https://digimon.net/reference_en/detail.php?directory_name=koromon", + }, + { + name_en: "Kyokyomon", + name_jp: "Kyokyomon", + next_evolutions: ["3-062"], + stage: 2, + sprite: "kyokyomon", + id: "2-014", + url: "https://digimon.net/reference_en/detail.php?directory_name=kyokyomon", + }, + { + name_en: "Motimon", + name_jp: "Mochimon", + next_evolutions: ["3-073", "3-031", "3-054", "3-052", "3-046"], + stage: 2, + sprite: "motimon", + id: "2-015", + url: "https://digimon.net/reference_en/detail.php?directory_name=mochimon", + }, + { + name_en: "Nyaromon", + name_jp: "Nyaromon", + next_evolutions: ["3-063", "3-001", "3-022"], + stage: 2, + sprite: "nyaromon", + id: "2-016", + url: "https://digimon.net/reference_en/detail.php?directory_name=nyaromon", + }, + { + name_en: "Pagumon", + name_jp: "Pagumon", + next_evolutions: ["3-026", "3-028", "3-027"], + stage: 2, + sprite: "pagumon", + id: "2-017", + url: "https://digimon.net/reference_en/detail.php?directory_name=pagumon", + }, + { + name_en: "Poromon", + name_jp: "Poromon", + next_evolutions: ["3-060", "3-076", "3-020", "3-034", "3-025", "3-080"], + stage: 2, + sprite: "poromon", + id: "2-018", + url: "https://digimon.net/reference_en/detail.php?directory_name=poromon", + }, + { + name_en: "Sakuttomon", + name_jp: "Sakuttomon", + next_evolutions: ["3-081", "3-036", "3-062"], + stage: 2, + sprite: "sakuttomon", + id: "2-019", + url: "https://digimon.net/reference_en/detail.php?directory_name=sakuttomon", + }, + { + name_en: "Tanemon", + name_jp: "Tanemon", + next_evolutions: ["3-008", "3-056", "3-076", "3-060"], + stage: 2, + sprite: "tanemon", + id: "2-020", + url: "https://digimon.net/reference_en/detail.php?directory_name=tanemon", + }, + { + name_en: "Tokomon", + name_jp: "Tokomon", + next_evolutions: ["3-058", "3-044", "3-066", "3-032"], + stage: 2, + sprite: "tokomon", + id: "2-021", + url: "https://digimon.net/reference_en/detail.php?directory_name=tokomon", + }, + { + name_en: "Tokomon X", + name_jp: "Tokomon X", + next_evolutions: ["3-061", "3-004", "3-035", "3-017", "3-023", "3-067"], + stage: 2, + sprite: "tokomon_x", + id: "2-022", + url: "https://digimon.net/reference_en/detail.php?directory_name=tokomon_x", + }, + { + name_en: "Tsumemon", + name_jp: "Tsumemon", + next_evolutions: ["3-041", "3-083"], + stage: 2, + sprite: "tsumemon", + id: "2-023", + url: "https://digimon.net/reference_en/detail.php?directory_name=tsumemon", + }, + { + name_en: "Tsunomon", + name_jp: "Tunomon", + next_evolutions: ["3-022", "3-019", "3-083"], + stage: 2, + sprite: "tsunomon", + id: "2-024", + url: "https://digimon.net/reference_en/detail.php?directory_name=tunomon", + }, + { + name_en: "Upamon", + name_jp: "Upamon", + next_evolutions: ["3-069", "3-065", "3-028", "3-006", "3-058", "3-078"], + stage: 2, + sprite: "upamon", + id: "2-025", + url: "https://digimon.net/reference_en/detail.php?directory_name=upamon", + }, + { + name_en: "Wanyamon", + name_jp: "Wanyamon", + next_evolutions: ["3-068", "3-024", "3-052", "3-063", "3-028", "3-059", "3-012", "3-050"], + stage: 2, + sprite: "wanyamon", + id: "2-026", + url: "https://digimon.net/reference_en/detail.php?directory_name=wanyamon", + }, + { + name_en: "Yaamon", + name_jp: "Yarmon", + next_evolutions: ["3-030", "3-043", "3-002", "3-035", "3-018", "3-064", "3-055", "3-038", "3-037"], + stage: 2, + sprite: "yaamon", + id: "2-027", + url: "https://digimon.net/reference_en/detail.php?directory_name=yarmon", + }, + { + name_en: "Yokomon", + name_jp: "Pyocomon", + next_evolutions: ["3-008", "3-021", "3-056", "3-053", "3-039"], + stage: 2, + sprite: "yokomon", + id: "2-028", + url: "https://digimon.net/reference_en/detail.php?directory_name=pyocomon", + }, + { + name_en: "Bibimon", + name_jp: "Bibimon", + next_evolutions: ["3-084", "3-066"], + stage: 2, + sprite: "bibimon", + id: "2-029", + url: "https://digimon.net/reference_en/detail.php?directory_name=bibimon", + }, + { + name_en: "Gigimon", + name_jp: "Gigimon", + next_evolutions: ["3-032"], + stage: 2, + sprite: "gigimon", + id: "2-030", + url: "https://digimon.net/reference_en/detail.php?directory_name=gigimon", + }, + { + name_en: "Tumblemon", + name_jp: "Goromon", + next_evolutions: ["3-068"], + stage: 2, + sprite: "tumblemon", + id: "2-031", + url: "https://digimon.net/reference_en/detail.php?directory_name=goromon", + }, + { + name_en: "Hiyarimon", + name_jp: "Hiyarimon", + next_evolutions: ["3-009"], + stage: 2, + sprite: "hiyarimon", + id: "2-032", + url: "https://digimon.net/reference_en/detail.php?directory_name=hiyarimon", + }, + { + name_en: "Minomon", + name_jp: "Minomon", + next_evolutions: ["3-080"], + stage: 2, + sprite: "", + id: "2-033", + url: "https://digimon.net/reference_en/detail.php?directory_name=minomon", + }, + { + name_en: "Moonmon", + name_jp: "Moonmon", + next_evolutions: ["3-082", "3-026", "3-047", "3-050"], + stage: 2, + sprite: "moonmon", + id: "2-034", + url: "https://digimon.net/reference_en/detail.php?directory_name=moonmon", + }, + { + name_en: "Pickmon", + name_jp: "Pickmon", + next_evolutions: ["3-066"], + stage: 2, + sprite: "pickmon", + id: "2-035", + url: "https://digimon.net/reference_en/detail.php?directory_name=pickmon", + }, + { + name_en: "Viximon", + name_jp: "Pokomon", + next_evolutions: ["3-085"], + stage: 2, + sprite: "viximon", + id: "2-036", + url: "https://digimon.net/reference_en/detail.php?directory_name=pokomon", + }, + { + name_en: "Sunmon", + name_jp: "Sunmon", + next_evolutions: ["3-012", "3-019", "3-032", "3-063"], + stage: 2, + sprite: "sunmon", + id: "2-037", + url: "https://digimon.net/reference_en/detail.php?directory_name=sunmon", + }, + { + name_en: "Agumon", + name_jp: "Agumon", + next_evolutions: [ + "4-054", + "4-135", + "4-028", + "4-079", + "4-088", + "4-070", + "4-004", + "4-087", + "4-046", + "4-008", + "4-091", + "4-017", + "4-023", + "4-084", + "4-101", + "4-050", + "4-055", + "4-022", + "4-019", + "4-001", + "4-013", + "7-041", + ], + stage: 3, + sprite: "agumon", + id: "3-001", + url: "https://digimon.net/reference_en/detail.php?directory_name=agumon", + }, + { + name_en: "Agumon (Black) X", + name_jp: "Agumon (Black) X", + next_evolutions: ["4-024", "4-067", "4-089", "4-003"], + stage: 3, + sprite: "agumon_black_x", + id: "3-002", + url: "https://digimon.net/reference_en/detail.php?directory_name=agumon_b_x", + }, + { + name_en: "Agumon Expert", + name_jp: "Agumon Hakase", + next_evolutions: ["4-027", "4-019"], + stage: 3, + sprite: "agumon_expert", + id: "3-003", + url: "https://digimon.net/reference_en/detail.php?directory_name=agumonhakase", + }, + { + name_en: "Agumon X", + name_jp: "Agumon X", + next_evolutions: ["4-136", "4-126", "4-021"], + stage: 3, + sprite: "agumon_x", + id: "3-004", + url: "https://digimon.net/reference_en/detail.php?directory_name=agumon_x", + }, + { + name_en: "Argomon", + name_jp: "Algomon", + next_evolutions: ["4-008", "4-028", "4-083"], + stage: 3, + sprite: "argomon_child", + id: "3-005", + url: "https://digimon.net/reference_en/detail.php?directory_name=algomon_lv3", + }, + { + name_en: "Armadillomon", + name_jp: "Armadimon", + next_evolutions: ["4-005", "4-118", "4-111"], + stage: 3, + sprite: "armadillomon", + id: "3-006", + url: "https://digimon.net/reference_en/detail.php?directory_name=armadimon", + }, + { + name_en: "Betamon", + name_jp: "Betamon", + next_evolutions: ["4-002", "4-107", "4-028", "4-079", "4-088"], + stage: 3, + sprite: "betamon", + id: "3-007", + url: "https://digimon.net/reference_en/detail.php?directory_name=betamon", + }, + { + name_en: "Biyomon", + name_jp: "Piyomon", + next_evolutions: [ + "4-084", + "4-064", + "4-070", + "4-066", + "4-085", + "4-014", + "4-063", + "4-145", + "4-102", + "4-138", + "4-127", + "4-096", + "4-150", + ], + stage: 3, + sprite: "biyomon", + id: "3-008", + url: "https://digimon.net/reference_en/detail.php?directory_name=piyomon", + }, + { + name_en: "Bulucomon", + name_jp: "Blucomon", + next_evolutions: ["4-094", "4-109", "4-080", "4-128", "4-144", "4-052", "4-093", "4-043", "4-149"], + stage: 3, + sprite: "bulucomon", + id: "3-009", + url: "https://digimon.net/reference_en/detail.php?directory_name=bulucomon", + }, + { + name_en: "BushiAgumon", + name_jp: "BushiAgumon", + next_evolutions: ["4-103", "4-009", "4-075"], + stage: 3, + sprite: "bushiagumon", + id: "3-010", + url: "https://digimon.net/reference_en/detail.php?directory_name=bushiagumon", + }, + { + name_en: "Candlemon", + name_jp: "Candmon", + next_evolutions: ["4-046", "4-079", "4-143", "4-028", "4-006"], + stage: 3, + sprite: "candlemon", + id: "3-011", + url: "https://digimon.net/reference_en/detail.php?directory_name=candmon", + }, + { + name_en: "Coronamon", + name_jp: "Coronamon", + next_evolutions: ["4-040", "4-044", "4-070", "4-001"], + stage: 3, + sprite: "coronamon", + id: "3-012", + url: "https://digimon.net/reference_en/detail.php?directory_name=coronamon", + }, + { + name_en: "Crabmon", + name_jp: "Ganimon", + next_evolutions: ["4-032", "4-107", "4-036", "4-017", "4-051", "4-090"], + stage: 3, + sprite: "crabmon", + id: "3-013", + url: "https://digimon.net/reference_en/detail.php?directory_name=ganimon", + }, + { + name_en: "DemiDevimon", + name_jp: "PicoDevimon", + next_evolutions: ["4-028", "4-079", "4-031", "4-143", "4-011"], + stage: 3, + sprite: "demidevimon", + id: "3-014", + url: "https://digimon.net/reference_en/detail.php?directory_name=picodevimon", + }, + { + name_en: "Dorumon", + name_jp: "DORUmon", + next_evolutions: ["4-033", "4-100", "4-109", "4-080", "4-093"], + stage: 3, + sprite: "dorumon", + id: "3-015", + url: "https://digimon.net/reference_en/detail.php?directory_name=dorumon", + }, + { + name_en: "Dracomon", + name_jp: "Dracomon", + next_evolutions: ["4-050"], + stage: 3, + sprite: "dracomon", + id: "3-016", + url: "https://digimon.net/reference_en/detail.php?directory_name=dracomon", + }, + { + name_en: "Dracomon X", + name_jp: "Dracomon X", + next_evolutions: ["4-056", "4-114", "4-021"], + stage: 3, + sprite: "dracomon_x", + id: "3-017", + url: "https://digimon.net/reference_en/detail.php?directory_name=dracomon_x", + }, + { + name_en: "Duskmon", + name_jp: "Duskmon", + next_evolutions: ["4-024", "4-140", "4-089", "4-092"], + stage: 3, + sprite: "duskmon", + id: "3-018", + url: "https://digimon.net/reference_en/detail.php?directory_name=duskmon", + }, + { + name_en: "Elecmon", + name_jp: "Elecmon", + next_evolutions: ["4-014", "4-141", "4-004", "4-043", "4-139"], + stage: 3, + sprite: "elecmon", + id: "3-019", + url: "https://digimon.net/reference_en/detail.php?directory_name=elecmon", + }, + { + name_en: "Falcomon", + name_jp: "Falcomon", + next_evolutions: ["4-096", "4-029", "4-139"], + stage: 3, + sprite: "falcomon", + id: "3-020", + url: "https://digimon.net/reference_en/detail.php?directory_name=falcomon", + }, + { + name_en: "Floramon", + name_jp: "Floramon", + next_evolutions: ["4-063", "4-014", "4-138", "4-102", "4-127"], + stage: 3, + sprite: "floramon", + id: "3-021", + url: "https://digimon.net/reference_en/detail.php?directory_name=floramon", + }, + { + name_en: "Gabumon", + name_jp: "Gabumon", + next_evolutions: [ + "4-062", + "4-046", + "4-004", + "4-043", + "4-139", + "4-047", + "4-070", + "4-087", + "4-031", + "4-008", + "4-034", + "4-072", + "7-042", + ], + stage: 3, + sprite: "gabumon", + id: "3-022", + url: "https://digimon.net/reference_en/detail.php?directory_name=gabumon", + }, + { + name_en: "Gabumon X", + name_jp: "Gabumon X", + next_evolutions: ["4-104", "4-126", "4-021"], + stage: 3, + sprite: "gabumon_x", + id: "3-023", + url: "https://digimon.net/reference_en/detail.php?directory_name=gabumon_x", + }, + { + name_en: "Gaomon", + name_jp: "Gaomon", + next_evolutions: ["4-010", "4-044", "4-105", "4-040", "4-069"], + stage: 3, + sprite: "gaomon", + id: "3-024", + url: "https://digimon.net/reference_en/detail.php?directory_name=gaomon", + }, + { + name_en: "Gatomon", + name_jp: "Tailmon", + next_evolutions: ["4-007", "4-047"], + stage: 3, + sprite: "gatomon", + id: "3-025", + url: "https://digimon.net/reference_en/detail.php?directory_name=tailmon", + }, + { + name_en: "Gazimon", + name_jp: "Gazimon", + next_evolutions: ["4-023", "4-020", "4-027", "4-132", "4-101", "4-035", "4-074"], + stage: 3, + sprite: "gazimon", + id: "3-026", + url: "https://digimon.net/reference_en/detail.php?directory_name=gazimon", + }, + { + name_en: "Ghostmon", + name_jp: "Ghostmon", + next_evolutions: ["4-142", "4-008", "4-041", "4-143", "4-028", "4-011", "4-152"], + stage: 3, + sprite: "ghostmon", + id: "3-027", + url: "https://digimon.net/reference_en/detail.php?directory_name=ghostmon", + }, + { + name_en: "Gizamon", + name_jp: "Gizamon", + next_evolutions: ["4-042", "4-025", "4-027", "4-132", "4-101", "4-043", "4-111", "4-112", "4-125", "4-036"], + stage: 3, + sprite: "gizamon", + id: "3-028", + url: "https://digimon.net/reference_en/detail.php?directory_name=gizamon", + }, + { + name_en: "Gomamon", + name_jp: "Gomamon", + next_evolutions: ["4-060", "4-032", "4-036", "4-017", "4-090", "4-051"], + stage: 3, + sprite: "gomamon", + id: "3-029", + url: "https://digimon.net/reference_en/detail.php?directory_name=gomamon", + }, + { + name_en: "Gomamon X", + name_jp: "Gomamon X", + next_evolutions: ["4-076", "4-067", "4-003"], + stage: 3, + sprite: "gomamon_x", + id: "3-030", + url: "https://digimon.net/reference_en/detail.php?directory_name=gomamon_x", + }, + { + name_en: "Gotsumon", + name_jp: "Gottsumon", + next_evolutions: ["4-084", "4-129", "4-115", "4-049"], + stage: 3, + sprite: "gotsumon", + id: "3-031", + url: "https://digimon.net/reference_en/detail.php?directory_name=gottsumon", + }, + { + name_en: "Guilmon", + name_jp: "Guilmon", + next_evolutions: ["4-055", "4-012", "4-050", "4-009", "4-075", "4-027", "4-001"], + stage: 3, + sprite: "guilmon", + id: "3-032", + url: "https://digimon.net/reference_en/detail.php?directory_name=guilmon", + }, + { + name_en: "Hagurumon", + name_jp: "Hagurumon", + next_evolutions: ["4-057", "4-121", "4-054", "4-078", "4-073", "4-101"], + stage: 3, + sprite: "hagurumon", + id: "3-033", + url: "https://digimon.net/reference_en/detail.php?directory_name=hagurumon", + }, + { + name_en: "Hawkmon", + name_jp: "Hawkmon", + next_evolutions: ["4-007", "4-096", "4-064"], + stage: 3, + sprite: "hawkmon", + id: "3-034", + url: "https://digimon.net/reference_en/detail.php?directory_name=hawkmon", + }, + { + name_en: "Herissmon", + name_jp: "Herissmon", + next_evolutions: ["4-106", "4-136", "4-021", "4-067", "4-039", "4-089", "4-086"], + stage: 3, + sprite: "herissmon", + id: "3-035", + url: "https://digimon.net/reference_en/detail.php?directory_name=herissmon", + }, + { + name_en: "Huckmon", + name_jp: "Hackmon", + next_evolutions: ["4-122", "4-009", "4-018", "4-013"], + stage: 3, + sprite: "huckmon", + id: "3-036", + url: "https://digimon.net/reference_en/detail.php?directory_name=huckmon", + }, + { + name_en: "Impmon", + name_jp: "Impmon", + next_evolutions: ["4-074", "4-110", "4-130", "4-143"], + stage: 3, + sprite: "impmon", + id: "3-037", + url: "https://digimon.net/reference_en/detail.php?directory_name=impmon", + }, + { + name_en: "Impmon X", + name_jp: "Impmon X", + next_evolutions: ["4-092", "4-108", "4-089", "4-003"], + stage: 3, + sprite: "impmon_x", + id: "3-038", + url: "https://digimon.net/reference_en/detail.php?directory_name=impmon_x", + }, + { + name_en: "Jazamon", + name_jp: "Jazamon", + next_evolutions: ["4-061", "4-100", "4-093", "4-097", "4-134", "4-065", "4-073", "4-101", "4-014"], + stage: 3, + sprite: "jazamon", + id: "3-039", + url: "https://digimon.net/reference_en/detail.php?directory_name=jazamon", + }, + { + name_en: "Junkmon", + name_jp: "Junkmon", + next_evolutions: ["4-065", "4-082", "4-101"], + stage: 3, + sprite: "junkmon", + id: "3-040", + url: "https://digimon.net/reference_en/detail.php?directory_name=junkmon", + }, + { + name_en: "Keramon X", + name_jp: "Keramon X", + next_evolutions: ["7-012"], + stage: 3, + sprite: "keramon_x", + id: "3-041", + url: "https://digimon.net/reference_en/detail.php?directory_name=keramon_x", + }, + { + name_en: "Kokuwamon", + name_jp: "Kokuwamon", + next_evolutions: ["4-123", "4-057", "4-121", "4-016", "4-026"], + stage: 3, + sprite: "kokuwamon", + id: "3-042", + url: "https://digimon.net/reference_en/detail.php?directory_name=kokuwamon", + }, + { + name_en: "Kokuwamon X", + name_jp: "Kokuwamon X", + next_evolutions: ["4-067", "4-039", "4-089", "4-140", "4-003"], + stage: 3, + sprite: "kokuwamon_x", + id: "3-043", + url: "https://digimon.net/reference_en/detail.php?directory_name=kokuwamon_x", + }, + { + name_en: "Kunemon", + name_jp: "Kunemon", + next_evolutions: ["4-111", "4-034", "4-091", "4-011", "4-119"], + stage: 3, + sprite: "kunemon", + id: "3-044", + url: "https://digimon.net/reference_en/detail.php?directory_name=kunemon", + }, + { + name_en: "Labramon", + name_jp: "Labramon", + next_evolutions: ["4-030", "4-008", "4-083"], + stage: 3, + sprite: "labramon", + id: "3-045", + url: "https://digimon.net/reference_en/detail.php?directory_name=labramon", + }, + { + name_en: "Lalamon", + name_jp: "Lalamon", + next_evolutions: ["4-120", "4-059"], + stage: 3, + sprite: "lalamon", + id: "3-046", + url: "https://digimon.net/reference_en/detail.php?directory_name=lalamon", + }, + { + name_en: "Lopmon", + name_jp: "Lopmon", + next_evolutions: ["4-131"], + stage: 3, + sprite: "lopmon", + id: "3-047", + url: "https://digimon.net/reference_en/detail.php?directory_name=lopmon", + }, + { + name_en: "Lopmon X", + name_jp: "Lopmon X", + next_evolutions: ["4-097", "4-048", "4-144", "4-052"], + stage: 3, + sprite: "lopmon_x", + id: "3-048", + url: "https://digimon.net/reference_en/detail.php?directory_name=lopmon_x", + }, + { + name_en: "Ludomon", + name_jp: "Ludomon", + next_evolutions: ["4-124", "4-103"], + stage: 3, + sprite: "ludomon", + id: "3-049", + url: "https://digimon.net/reference_en/detail.php?directory_name=ludomon", + }, + { + name_en: "Lunamon", + name_jp: "Lunamon", + next_evolutions: ["4-069", "4-074", "4-044"], + stage: 3, + sprite: "lunamon", + id: "3-050", + url: "https://digimon.net/reference_en/detail.php?directory_name=lunamon", + }, + { + name_en: "Monodramon", + name_jp: "Monodramon", + next_evolutions: ["4-054", "4-101", "4-117", "4-037"], + stage: 3, + sprite: "monodramon", + id: "3-051", + url: "https://digimon.net/reference_en/detail.php?directory_name=monodramon", + }, + { + name_en: "Morphomon", + name_jp: "Morphomon", + next_evolutions: ["4-059", "4-137", "4-105"], + stage: 3, + sprite: "morphomon", + id: "3-052", + url: "https://digimon.net/reference_en/detail.php?directory_name=morphomon", + }, + { + name_en: "Mushroomon", + name_jp: "Mushmon", + next_evolutions: ["4-138", "4-145", "4-127", "4-102", "4-014"], + stage: 3, + sprite: "mushroomon", + id: "3-053", + url: "https://digimon.net/reference_en/detail.php?directory_name=mushmon", + }, + { + name_en: "Otamamon", + name_jp: "Otamamon", + next_evolutions: ["4-047", "4-115", "4-066", "4-049"], + stage: 3, + sprite: "otamamon", + id: "3-054", + url: "https://digimon.net/reference_en/detail.php?directory_name=otamamon", + }, + { + name_en: "Otamamon X", + name_jp: "Otamamon X", + next_evolutions: ["4-108", "4-039", "4-089", "4-140", "4-003"], + stage: 3, + sprite: "otamamon_x", + id: "3-055", + url: "https://digimon.net/reference_en/detail.php?directory_name=otamamon_x", + }, + { + name_en: "Palmon", + name_jp: "Palmon", + next_evolutions: [ + "4-017", + "4-083", + "4-070", + "4-066", + "4-085", + "4-127", + "4-145", + "4-063", + "4-102", + "4-014", + "4-120", + "4-095", + "4-139", + ], + stage: 3, + sprite: "palmon", + id: "3-056", + url: "https://digimon.net/reference_en/detail.php?directory_name=palmon", + }, + { + name_en: "Palmon X", + name_jp: "Palmon X", + next_evolutions: ["4-128", "4-100", "4-093"], + stage: 3, + sprite: "palmon_x", + id: "3-057", + url: "https://digimon.net/reference_en/detail.php?directory_name=palmon_x", + }, + { + name_en: "Patamon", + name_jp: "Patamon", + next_evolutions: ["4-137", "4-015", "4-091", "4-011", "4-119", "4-004", "4-113", "5-122", "4-081", "4-005"], + stage: 3, + sprite: "patamon", + id: "3-058", + url: "https://digimon.net/reference_en/detail.php?directory_name=patamon", + }, + { + name_en: "Phascomon", + name_jp: "Phascomon", + next_evolutions: ["4-099", "4-110", "4-130", "4-074", "4-070"], + stage: 3, + sprite: "phascomon", + id: "3-059", + url: "https://digimon.net/reference_en/detail.php?directory_name=phascomon", + }, + { + name_en: "Pomumon", + name_jp: "Pomumon", + next_evolutions: ["4-095", "4-064", "4-139"], + stage: 3, + sprite: "pomumon", + id: "3-060", + url: "https://digimon.net/reference_en/detail.php?directory_name=pomumon", + }, + { + name_en: "Renamon X", + name_jp: "Renamon X", + next_evolutions: ["4-071", "4-106", "4-021"], + stage: 3, + sprite: "renamon_x", + id: "3-061", + url: "https://digimon.net/reference_en/detail.php?directory_name=renamon_x", + }, + { + name_en: "Ryudamon", + name_jp: "Ryudamon", + next_evolutions: ["4-052", "4-134", "4-097", "4-144", "4-093", "4-031", "4-025", "4-088"], + stage: 3, + sprite: "ryudamon", + id: "3-062", + url: "https://digimon.net/reference_en/detail.php?directory_name=ryudamon", + }, + { + name_en: "Salamon", + name_jp: "Plotmon", + next_evolutions: ["4-077", "4-047", "4-004", "4-046", "4-087", "4-054", "4-137", "4-053", "4-013"], + stage: 3, + sprite: "salamon", + id: "3-063", + url: "https://digimon.net/reference_en/detail.php?directory_name=plotmon", + }, + { + name_en: "Salamon X", + name_jp: "Plotmon X", + next_evolutions: ["4-086", "4-108", "4-003"], + stage: 3, + sprite: "salamon_x", + id: "3-064", + url: "https://digimon.net/reference_en/detail.php?directory_name=plotmon_x", + }, + { + name_en: "Sangomon", + name_jp: "Sangomon", + next_evolutions: ["4-111", "4-058", "4-112", "4-125", "4-107", "4-090"], + stage: 3, + sprite: "sangomon", + id: "3-065", + url: "https://digimon.net/reference_en/detail.php?directory_name=sangomon", + }, + { + name_en: "Shoutmon", + name_jp: "Shoutmon", + next_evolutions: ["4-113", "5-122", "4-081", "4-022", "4-103", "4-147"], + stage: 3, + sprite: "shoutmon", + id: "3-066", + url: "https://digimon.net/reference_en/detail.php?directory_name=shoutmon", + }, + { + name_en: "Sistermon Blanc", + name_jp: "Sistermon Blanc", + next_evolutions: ["4-114", "4-104", "4-021"], + stage: 3, + sprite: "sistermon_blanc", + id: "3-067", + url: "https://digimon.net/reference_en/detail.php?directory_name=sistermonblanc", + }, + { + name_en: "Sunarizamon", + name_jp: "Sunarizamon", + next_evolutions: ["4-010", "4-053", "4-105", "4-129", "4-127"], + stage: 3, + sprite: "sunarizamon", + id: "3-068", + url: "https://digimon.net/reference_en/detail.php?directory_name=sunarizamon", + }, + { + name_en: "Swimmon", + name_jp: "Swimmon", + next_evolutions: ["4-125", "4-118", "4-112"], + stage: 3, + sprite: "swimmon", + id: "3-069", + url: "https://digimon.net/reference_en/detail.php?directory_name=swimmon", + }, + { + name_en: "Syakomon", + name_jp: "Shakomon", + next_evolutions: ["4-060", "4-107", "4-051", "4-090", "4-133"], + stage: 3, + sprite: "syakomon", + id: "3-070", + url: "https://digimon.net/reference_en/detail.php?directory_name=shakomon", + }, + { + name_en: "Syakomon X", + name_jp: "Shakomon X", + next_evolutions: ["4-134", "4-144", "4-093", "4-052"], + stage: 3, + sprite: "syakomon_x", + id: "3-071", + url: "https://digimon.net/reference_en/detail.php?directory_name=shakomon_x", + }, + { + name_en: "Tapirmon", + name_jp: "Bakumon", + next_evolutions: ["4-006", "4-079", "4-143", "4-046"], + stage: 3, + sprite: "tapirmon", + id: "3-072", + url: "https://digimon.net/reference_en/detail.php?directory_name=bakumon", + }, + { + name_en: "Tentomon", + name_jp: "Tentomon", + next_evolutions: ["4-062", "4-047", "4-129", "4-066", "4-049", "4-120"], + stage: 3, + sprite: "tentomon", + id: "3-073", + url: "https://digimon.net/reference_en/detail.php?directory_name=tentomon", + }, + { + name_en: "Terriermon", + name_jp: "Terriermon", + next_evolutions: ["4-045", "4-131"], + stage: 3, + sprite: "terriermon", + id: "3-074", + url: "https://digimon.net/reference_en/detail.php?directory_name=terriermon", + }, + { + name_en: "Terriermon X", + name_jp: "Terriermon X", + next_evolutions: ["4-109", "4-033", "4-080", "4-128"], + stage: 3, + sprite: "terriermon_x", + id: "3-075", + url: "https://digimon.net/reference_en/detail.php?directory_name=terriermon_x", + }, + { + name_en: "Tinkermon", + name_jp: "Tinkermon", + next_evolutions: ["4-098", "4-064", "4-095", "4-139"], + stage: 3, + sprite: "tinkermon", + id: "3-076", + url: "https://digimon.net/reference_en/detail.php?directory_name=tinkermon", + }, + { + name_en: "ToyAgumon", + name_jp: "ToyAgumon", + next_evolutions: ["4-054", "4-123", "4-016", "4-078", "4-026"], + stage: 3, + sprite: "toyagumon", + id: "3-077", + url: "https://digimon.net/reference_en/detail.php?directory_name=toyagumon", + }, + { + name_en: "Veemon", + name_jp: "V-mon", + next_evolutions: ["4-038", "4-065", "4-082", "4-138", "4-072"], + stage: 3, + sprite: "veemon", + id: "3-078", + url: "https://digimon.net/reference_en/detail.php?directory_name=v-mon", + }, + { + name_en: "Vorvomon", + name_jp: "Vorvomon", + next_evolutions: ["4-068", "4-014", "4-135", "4-079"], + stage: 3, + sprite: "vorvomon", + id: "3-079", + url: "https://digimon.net/reference_en/detail.php?directory_name=vorvomon", + }, + { + name_en: "Wormmon", + name_jp: "Wormmon", + next_evolutions: ["4-116", "4-028", "4-142", "4-110", "4-059", "4-105"], + stage: 3, + sprite: "wormmon", + id: "3-080", + url: "https://digimon.net/reference_en/detail.php?directory_name=wormmon", + }, + { + name_en: "Zubamon", + name_jp: "Zubamon", + next_evolutions: ["4-146", "4-122", "4-031", "4-013"], + stage: 3, + sprite: "zubamon", + id: "3-081", + url: "https://digimon.net/reference_en/detail.php?directory_name=zubamon", + }, + { + name_en: "Agumon (Black)", + name_jp: "Agumon (Black)", + next_evolutions: ["4-054", "4-023", "4-084", "4-002"], + stage: 3, + sprite: "agumon_black", + id: "3-082", + url: "https://digimon.net/reference_en/detail.php?directory_name=agumon-black", + }, + { + name_en: "Dracmon", + name_jp: "Dracumon", + next_evolutions: ["5-067"], + stage: 3, + sprite: "dracmon", + id: "3-083", + url: "https://digimon.net/reference_en/detail.php?directory_name=dracumon", + }, + { + name_en: "Pulsemon", + name_jp: "Pulsemon", + next_evolutions: ["4-147", "4-123"], + stage: 3, + sprite: "pulsemon", + id: "3-084", + url: "https://digimon.net/reference_en/detail.php?directory_name=pulsemon", + }, + { + name_en: "Renamon", + name_jp: "Renamon", + next_evolutions: ["4-148", "4-096"], + stage: 3, + sprite: "renamon", + id: "3-085", + url: "https://digimon.net/reference_en/detail.php?directory_name=renamon", + }, + { + name_en: "Agunimon", + name_jp: "Agnimon", + next_evolutions: ["5-002", "5-016", "5-145", "5-149"], + stage: 4, + sprite: "agunimon", + id: "4-001", + url: "https://digimon.net/reference_en/detail.php?directory_name=agnimon", + }, + { + name_en: "Airdramon", + name_jp: "Airdramon", + next_evolutions: ["5-088", "5-086", "5-093", "5-080"], + stage: 4, + sprite: "airdramon", + id: "4-002", + url: "https://digimon.net/reference_en/detail.php?directory_name=airdramon", + }, + { + name_en: "Allomon X", + name_jp: "Allomon X", + next_evolutions: ["5-132", "5-074", "5-072", "5-092"], + stage: 4, + sprite: "allomon_x", + id: "4-003", + url: "https://digimon.net/reference_en/detail.php?directory_name=allomon_x", + }, + { + name_en: "Angemon", + name_jp: "Angemon", + next_evolutions: ["5-126", "5-069", "5-004", "5-010", "5-120", "5-036", "5-075", "5-091"], + stage: 4, + sprite: "angemon", + id: "4-004", + url: "https://digimon.net/reference_en/detail.php?directory_name=angemon", + }, + { + name_en: "Ankylomon", + name_jp: "Ankylomon", + next_evolutions: ["5-076", "5-120", "5-049", "5-085", "5-108", "5-105"], + stage: 4, + sprite: "ankylomon", + id: "4-005", + url: "https://digimon.net/reference_en/detail.php?directory_name=ankylomon", + }, + { + name_en: "Apemon", + name_jp: "Hanumon", + next_evolutions: ["5-073", "5-139", "5-110", "5-147"], + stage: 4, + sprite: "apemon", + id: "4-006", + url: "https://digimon.net/reference_en/detail.php?directory_name=hanumon", + }, + { + name_en: "Aquilamon", + name_jp: "Aquilamon", + next_evolutions: ["5-123", "5-050", "5-106", "5-130", "5-057", "5-031"], + stage: 4, + sprite: "aquilamon", + id: "4-007", + url: "https://digimon.net/reference_en/detail.php?directory_name=aquilamon", + }, + { + name_en: "Argomon", + name_jp: "Algomon", + next_evolutions: [ + "5-007", + "5-057", + "5-097", + "5-087", + "5-070", + "5-093", + "5-003", + "5-118", + "5-139", + "5-013", + "5-138", + "5-106", + "5-015", + ], + stage: 4, + sprite: "argomon_adult", + id: "4-008", + url: "https://digimon.net/reference_en/detail.php?directory_name=algomon_lv4", + }, + { + name_en: "Arresterdramon", + name_jp: "Arresterdramon", + next_evolutions: ["5-115", "5-135", "5-117"], + stage: 4, + sprite: "arresterdramon", + id: "4-009", + url: "https://digimon.net/reference_en/detail.php?directory_name=arresterdramon", + }, + { + name_en: "Baboongamon", + name_jp: "Baboongamon", + next_evolutions: ["5-046", "5-055", "5-068"], + stage: 4, + sprite: "baboongamon", + id: "4-010", + url: "https://digimon.net/reference_en/detail.php?directory_name=baboongamon", + }, + { + name_en: "Bakemon", + name_jp: "Bakemon", + next_evolutions: ["5-045", "5-107", "5-059", "5-110", "5-011", "5-098"], + stage: 4, + sprite: "bakemon", + id: "4-011", + url: "https://digimon.net/reference_en/detail.php?directory_name=bakemon", + }, + { + name_en: "Baluchimon", + name_jp: "Baluchimon", + next_evolutions: ["5-075", "5-111", "5-036", "5-135"], + stage: 4, + sprite: "baluchimon", + id: "4-012", + url: "https://digimon.net/reference_en/detail.php?directory_name=baluchimon", + }, + { + name_en: "BaoHuckmon", + name_jp: "BaoHuckmon", + next_evolutions: ["5-117", "5-039", "5-036", "5-048"], + stage: 4, + sprite: "baohuckmon", + id: "4-013", + url: "https://digimon.net/reference_en/detail.php?directory_name=baohuckmon", + }, + { + name_en: "Birdramon", + name_jp: "Birdramon", + next_evolutions: ["5-126", "5-043", "5-001", "5-014", "5-029", "5-061", "5-041", "5-048"], + stage: 4, + sprite: "birdramon", + id: "4-014", + url: "https://digimon.net/reference_en/detail.php?directory_name=birdramon", + }, + { + name_en: "Centarumon", + name_jp: "Centalmon", + next_evolutions: ["5-045"], + stage: 4, + sprite: "centarumon", + id: "4-015", + url: "https://digimon.net/reference_en/detail.php?directory_name=centalmon", + }, + { + name_en: "Clockmon", + name_jp: "Clockmon", + next_evolutions: ["5-003", "5-087", "5-058", "5-137", "5-013"], + stage: 4, + sprite: "clockmon", + id: "4-016", + url: "https://digimon.net/reference_en/detail.php?directory_name=clockmon", + }, + { + name_en: "Coelamon", + name_jp: "Coelamon", + next_evolutions: ["5-080", "5-118", "5-141", "5-082", "5-035", "5-003", "5-100", "5-087", "5-093"], + stage: 4, + sprite: "coelamon", + id: "4-017", + url: "https://digimon.net/reference_en/detail.php?directory_name=coelamon", + }, + { + name_en: "Coredramon (Blue)", + name_jp: "Coredramon (Blue)", + next_evolutions: ["5-142", "5-048", "5-080", "5-115"], + stage: 4, + sprite: "coredramon_blue", + id: "4-018", + url: "https://digimon.net/reference_en/detail.php?directory_name=coredramon_b", + }, + { + name_en: "Coredramon (Green)", + name_jp: "Coredramon (Green)", + next_evolutions: ["5-048", "5-142", "5-080", "5-117"], + stage: 4, + sprite: "coredramon_green", + id: "4-019", + url: "https://digimon.net/reference_en/detail.php?directory_name=coredramon_g", + }, + { + name_en: "Cyclonemon", + name_jp: "Cyclomon", + next_evolutions: ["5-028"], + stage: 4, + sprite: "cyclonemon", + id: "4-020", + url: "https://digimon.net/reference_en/detail.php?directory_name=cyclomon", + }, + { + name_en: "Damemon", + name_jp: "Damemon", + next_evolutions: ["5-019", "5-067", "5-125", "5-136", "5-021", "5-064", "5-003"], + stage: 4, + sprite: "damemon", + id: "4-021", + url: "https://digimon.net/reference_en/detail.php?directory_name=damemon", + }, + { + name_en: "Darcmon", + name_jp: "Darcmon", + next_evolutions: ["5-036", "5-115", "5-122", "6-097"], + stage: 4, + sprite: "darcmon", + id: "4-022", + url: "https://digimon.net/reference_en/detail.php?directory_name=darcmon", + }, + { + name_en: "DarkTyrannomon", + name_jp: "DarkTyranomon", + next_evolutions: ["5-093", "5-040", "5-072", "5-088", "5-126", "5-087", "5-080"], + stage: 4, + sprite: "darktyrannomon", + id: "4-023", + url: "https://digimon.net/reference_en/detail.php?directory_name=darktyranomon", + }, + { + name_en: "DarkTyrannomon X", + name_jp: "DarkTyranomon X", + next_evolutions: ["5-089", "5-074", "5-132", "5-072"], + stage: 4, + sprite: "darktyrannomon_x", + id: "4-024", + url: "https://digimon.net/reference_en/detail.php?directory_name=darktyranomon_x", + }, + { + name_en: "Deltamon", + name_jp: "Deltamon", + next_evolutions: ["5-028", "5-104", "5-095", "5-039"], + stage: 4, + sprite: "deltamon", + id: "4-025", + url: "https://digimon.net/reference_en/detail.php?directory_name=deltamon", + }, + { + name_en: "Deputymon", + name_jp: "Revolmon", + next_evolutions: ["5-003", "5-025", "5-058", "5-086", "5-013"], + stage: 4, + sprite: "deputymon", + id: "4-026", + url: "https://digimon.net/reference_en/detail.php?directory_name=revolmon", + }, + { + name_en: "Devidramon", + name_jp: "Devidramon", + next_evolutions: ["5-093", "5-080", "5-142", "5-048", "5-135"], + stage: 4, + sprite: "devidramon", + id: "4-027", + url: "https://digimon.net/reference_en/detail.php?directory_name=devidramon", + }, + { + name_en: "Devimon", + name_jp: "Devimon", + next_evolutions: [ + "5-088", + "5-086", + "5-098", + "5-059", + "5-127", + "5-100", + "5-057", + "5-007", + "5-110", + "5-011", + "5-107", + ], + stage: 4, + sprite: "devimon", + id: "4-028", + url: "https://digimon.net/reference_en/detail.php?directory_name=devimon", + }, + { + name_en: "Diatrymon", + name_jp: "Diatrymon", + next_evolutions: ["5-130", "5-050"], + stage: 4, + sprite: "diatrymon", + id: "4-029", + url: "https://digimon.net/reference_en/detail.php?directory_name=diatrymon", + }, + { + name_en: "Dobermon", + name_jp: "Dobermon", + next_evolutions: ["5-018", "5-040", "5-057", "5-056", "5-012", "5-124"], + stage: 4, + sprite: "dobermon", + id: "4-030", + url: "https://digimon.net/reference_en/detail.php?directory_name=dobermon", + }, + { + name_en: "Dokugumon", + name_jp: "Dokugumon", + next_evolutions: [ + "5-059", + "5-098", + "5-110", + "5-106", + "5-013", + "5-104", + "5-139", + "5-015", + "5-051", + "5-010", + "5-036", + ], + stage: 4, + sprite: "dokugumon", + id: "4-031", + url: "https://digimon.net/reference_en/detail.php?directory_name=dokugumon", + }, + { + name_en: "Dolphmon", + name_jp: "Rukamon", + next_evolutions: ["5-143", "5-141", "5-032"], + stage: 4, + sprite: "dolphmon", + id: "4-032", + url: "https://digimon.net/reference_en/detail.php?directory_name=rukamon", + }, + { + name_en: "Dorugamon", + name_jp: "DORUgamon", + next_evolutions: ["5-034", "5-017", "5-071", "5-047", "5-146"], + stage: 4, + sprite: "dorugamon", + id: "4-033", + url: "https://digimon.net/reference_en/detail.php?directory_name=dorugamon", + }, + { + name_en: "Drimogemon", + name_jp: "Drimogemon", + next_evolutions: ["5-045", "5-139", "5-018", "5-147", "4-151"], + stage: 4, + sprite: "drimogemon", + id: "4-034", + url: "https://digimon.net/reference_en/detail.php?directory_name=drimogemon", + }, + { + name_en: "Duskmon", + name_jp: "Duskmon", + next_evolutions: ["5-067", "5-134", "5-114", "5-053", "5-065"], + stage: 4, + sprite: "duskmon", + id: "4-035", + url: "https://digimon.net/reference_en/detail.php?directory_name=duskmon", + }, + { + name_en: "Ebidramon", + name_jp: "Ebidramon", + next_evolutions: ["5-032", "5-143", "5-118", "5-077", "5-082", "5-141", "5-035", "5-124", "5-012", "5-056"], + stage: 4, + sprite: "ebidramon", + id: "4-036", + url: "https://digimon.net/reference_en/detail.php?directory_name=ebidramon", + }, + { + name_en: "Eosmon", + name_jp: "Eosmon", + next_evolutions: ["5-038", "5-066", "5-113"], + stage: 4, + sprite: "eosmon_adult", + id: "4-037", + url: "https://digimon.net/reference_en/detail.php?directory_name=eosmon_lv4", + }, + { + name_en: "ExVeemon", + name_jp: "XV-mon", + next_evolutions: ["5-093", "5-105", "5-031", "5-066", "5-113", "5-001", "5-030", "5-069"], + stage: 4, + sprite: "exveemon", + id: "4-038", + url: "https://digimon.net/reference_en/detail.php?directory_name=xv-mon", + }, + { + name_en: "Filmon", + name_jp: "Filmon", + next_evolutions: ["5-089", "5-132", "5-128", "5-072", "5-053", "5-099", "5-083", "5-003"], + stage: 4, + sprite: "filmon", + id: "4-039", + url: "https://digimon.net/reference_en/detail.php?directory_name=filmon", + }, + { + name_en: "Firamon", + name_jp: "Firamon", + next_evolutions: ["5-041", "5-068"], + stage: 4, + sprite: "firamon", + id: "4-040", + url: "https://digimon.net/reference_en/detail.php?directory_name=firamon", + }, + { + name_en: "Flarerizamon", + name_jp: "FlareLizamon", + next_evolutions: ["5-007", "5-040", "5-057", "5-097"], + stage: 4, + sprite: "flarerizamon", + id: "4-041", + url: "https://digimon.net/reference_en/detail.php?directory_name=flarelizamon", + }, + { + name_en: "Flymon", + name_jp: "Flymon", + next_evolutions: ["5-093"], + stage: 4, + sprite: "flymon", + id: "4-042", + url: "https://digimon.net/reference_en/detail.php?directory_name=flymon", + }, + { + name_en: "Frigimon", + name_jp: "Yukidarumon", + next_evolutions: ["5-091", "5-076", "5-049", "5-124", "5-073", "5-022"], + stage: 4, + sprite: "frigimon", + id: "4-043", + url: "https://digimon.net/reference_en/detail.php?directory_name=yukidarumon", + }, + { + name_en: "Gaogamon", + name_jp: "Gaogamon", + next_evolutions: ["5-068", "5-046", "5-118", "5-104", "5-022", "5-148"], + stage: 4, + sprite: "gaogamon", + id: "4-044", + url: "https://digimon.net/reference_en/detail.php?directory_name=gaogamon", + }, + { + name_en: "Gargomon", + name_jp: "Galgomon", + next_evolutions: ["5-112", "5-006"], + stage: 4, + sprite: "gargomon", + id: "4-045", + url: "https://digimon.net/reference_en/detail.php?directory_name=galgomon", + }, + { + name_en: "Garurumon", + name_jp: "Garurumon", + next_evolutions: [ + "5-091", + "5-139", + "5-073", + "5-110", + "5-069", + "5-004", + "5-015", + "5-138", + "5-106", + "5-104", + "5-018", + "5-147", + "4-151", + ], + stage: 4, + sprite: "garurumon", + id: "4-046", + url: "https://digimon.net/reference_en/detail.php?directory_name=garurumon", + }, + { + name_en: "Gatomon", + name_jp: "Tailmon", + next_evolutions: ["5-004", "5-052", "5-109", "5-069", "5-139", "5-123", "5-055", "5-068", "5-097"], + stage: 4, + sprite: "gatomon", + id: "4-047", + url: "https://digimon.net/reference_en/detail.php?directory_name=tailmon", + }, + { + name_en: "Gatomon X", + name_jp: "Tailmon X", + next_evolutions: ["5-005", "5-047", "5-071", "5-096"], + stage: 4, + sprite: "gatomon_x", + id: "4-048", + url: "https://digimon.net/reference_en/detail.php?directory_name=tailmon_x", + }, + { + name_en: "Gekomon", + name_jp: "Gekomon", + next_evolutions: ["5-121", "5-131", "5-101", "5-109"], + stage: 4, + sprite: "gekomon", + id: "4-049", + url: "https://digimon.net/reference_en/detail.php?directory_name=gekomon", + }, + { + name_en: "GeoGreymon", + name_jp: "GeoGreymon", + next_evolutions: ["5-115", "5-036", "5-122", "5-142"], + stage: 4, + sprite: "geogreymon", + id: "4-050", + url: "https://digimon.net/reference_en/detail.php?directory_name=geogreymon", + }, + { + name_en: "Gesomon", + name_jp: "Gesomon", + next_evolutions: ["5-077", "5-118", "5-035", "5-032"], + stage: 4, + sprite: "gesomon", + id: "4-051", + url: "https://digimon.net/reference_en/detail.php?directory_name=gesomon", + }, + { + name_en: "Ginryumon", + name_jp: "Ginryumon", + next_evolutions: ["5-051", "5-047", "5-119", "5-071", "5-036", "5-010", "5-104"], + stage: 4, + sprite: "ginryumon", + id: "4-052", + url: "https://digimon.net/reference_en/detail.php?directory_name=ginryumon", + }, + { + name_en: "Golemon", + name_jp: "Golemon", + next_evolutions: ["5-046", "5-068", "5-104", "5-131", "5-052", "5-097", "5-118", "5-148"], + stage: 4, + sprite: "golemon", + id: "4-053", + url: "https://digimon.net/reference_en/detail.php?directory_name=golemon", + }, + { + name_en: "Greymon", + name_jp: "Greymon", + next_evolutions: [ + "5-088", + "5-086", + "5-087", + "5-025", + "5-013", + "5-010", + "5-091", + "5-118", + "5-093", + "5-003", + "5-100", + "5-126", + "5-040", + "5-072", + ], + stage: 4, + sprite: "greymon", + id: "4-054", + url: "https://digimon.net/reference_en/detail.php?directory_name=greymon", + }, + { + name_en: "Growlmon", + name_jp: "Growmon", + next_evolutions: ["5-135", "5-075", "5-122", "5-115", "5-012"], + stage: 4, + sprite: "growlmon", + id: "4-055", + url: "https://digimon.net/reference_en/detail.php?directory_name=growmon", + }, + { + name_en: "Growlmon X", + name_jp: "Growmon X", + next_evolutions: ["5-136", "5-021", "5-094", "5-023"], + stage: 4, + sprite: "growlmon_x", + id: "4-056", + url: "https://digimon.net/reference_en/detail.php?directory_name=growmon_x", + }, + { + name_en: "Guardromon", + name_jp: "Guardromon", + next_evolutions: ["5-080", "5-058", "5-137", "5-013"], + stage: 4, + sprite: "guardromon", + id: "4-057", + url: "https://digimon.net/reference_en/detail.php?directory_name=guardromon", + }, + { + name_en: "Hookmon", + name_jp: "Hookmon", + next_evolutions: ["5-124", "5-085", "5-108"], + stage: 4, + sprite: "hookmon", + id: "4-058", + url: "https://digimon.net/reference_en/detail.php?directory_name=hookmon", + }, + { + name_en: "Hudiemon", + name_jp: "Hudiemon", + next_evolutions: ["5-008", "5-055", "5-118", "5-104", "5-105", "5-031", "5-038", "5-017", "5-148"], + stage: 4, + sprite: "hudiemon", + id: "4-059", + url: "https://digimon.net/reference_en/detail.php?directory_name=hudiemon", + }, + { + name_en: "Ikkakumon", + name_jp: "Ikkakumon", + next_evolutions: ["5-143", "5-141", "5-118", "5-076", "5-119"], + stage: 4, + sprite: "ikkakumon", + id: "4-060", + url: "https://digimon.net/reference_en/detail.php?directory_name=ikkakumon", + }, + { + name_en: "Jazardmon", + name_jp: "Jazardmon", + next_evolutions: ["5-054", "5-110", "5-044", "5-017", "5-005", "5-119"], + stage: 4, + sprite: "jazardmon", + id: "4-061", + url: "https://digimon.net/reference_en/detail.php?directory_name=jazardmon", + }, + { + name_en: "Kabuterimon", + name_jp: "Kabuterimon", + next_evolutions: ["5-126", "5-081", "5-004", "5-109", "5-052", "5-062"], + stage: 4, + sprite: "kabuterimon", + id: "4-062", + url: "https://digimon.net/reference_en/detail.php?directory_name=kabuterimon", + }, + { + name_en: "Kiwimon", + name_jp: "Kiwimon", + next_evolutions: ["5-014", "5-043", "5-063", "5-042", "5-029"], + stage: 4, + sprite: "kiwimon", + id: "4-063", + url: "https://digimon.net/reference_en/detail.php?directory_name=kiwimon", + }, + { + name_en: "Kokatorimon", + name_jp: "Cockatrimon", + next_evolutions: ["5-109", "5-050", "5-106", "5-037"], + stage: 4, + sprite: "kokatorimon", + id: "4-064", + url: "https://digimon.net/reference_en/detail.php?directory_name=cockatrimon", + }, + { + name_en: "Komondomon", + name_jp: "Komondomon", + next_evolutions: ["5-066", "5-038", "5-113", "5-137"], + stage: 4, + sprite: "komondomon", + id: "4-065", + url: "https://digimon.net/reference_en/detail.php?directory_name=komondomon", + }, + { + name_en: "Kuwagamon", + name_jp: "Kuwagamon", + next_evolutions: ["5-109", "5-101", "5-121", "5-017", "5-129"], + stage: 4, + sprite: "kuwagamon", + id: "4-066", + url: "https://digimon.net/reference_en/detail.php?directory_name=kuwagamon", + }, + { + name_en: "Kuwagamon X", + name_jp: "Kuwagamon X", + next_evolutions: ["5-102", "5-072", "5-074"], + stage: 4, + sprite: "kuwagamon_x", + id: "4-067", + url: "https://digimon.net/reference_en/detail.php?directory_name=kuwagamon_x", + }, + { + name_en: "Lavorvomon", + name_jp: "Lavorvomon", + next_evolutions: ["5-061", "5-041", "5-127"], + stage: 4, + sprite: "lavorvomon", + id: "4-068", + url: "https://digimon.net/reference_en/detail.php?directory_name=lavorvomon", + }, + { + name_en: "Lekismon", + name_jp: "Lekismon", + next_evolutions: ["5-022", "5-068"], + stage: 4, + sprite: "lekismon", + id: "4-069", + url: "https://digimon.net/reference_en/detail.php?directory_name=lekismon", + }, + { + name_en: "Leomon", + name_jp: "Leomon", + next_evolutions: ["5-080", "5-010", "5-087", "5-091", "5-086", "5-009", "5-041"], + stage: 4, + sprite: "leomon", + id: "4-070", + url: "https://digimon.net/reference_en/detail.php?directory_name=leomon", + }, + { + name_en: "Leomon X", + name_jp: "Leomon X", + next_evolutions: ["5-019", "5-090", "5-094", "5-023"], + stage: 4, + sprite: "leomon_x", + id: "4-071", + url: "https://digimon.net/reference_en/detail.php?directory_name=leomon_x", + }, + { + name_en: "Lobomon", + name_jp: "Wolfmon", + next_evolutions: ["5-012", "5-056", "5-124"], + stage: 4, + sprite: "lobomon", + id: "4-072", + url: "https://digimon.net/reference_en/detail.php?directory_name=wolfmon", + }, + { + name_en: "Machmon", + name_jp: "Machmon", + next_evolutions: ["5-113", "5-025", "5-066", "5-065", "5-091"], + stage: 4, + sprite: "machmon", + id: "4-073", + url: "https://digimon.net/reference_en/detail.php?directory_name=machmon", + }, + { + name_en: "MadLeomon", + name_jp: "MadLeomon", + next_evolutions: ["5-011", "5-009", "5-067", "5-065", "5-114", "5-053", "5-134"], + stage: 4, + sprite: "madleomon", + id: "4-074", + url: "https://digimon.net/reference_en/detail.php?directory_name=madleomon", + }, + { + name_en: "Manbomon", + name_jp: "Manbomon", + next_evolutions: ["5-115", "5-032"], + stage: 4, + sprite: "manbomon", + id: "4-075", + url: "https://digimon.net/reference_en/detail.php?directory_name=manbomon", + }, + { + name_en: "Mantaraymon X", + name_jp: "Mantaraymon X", + next_evolutions: ["5-060", "5-072", "5-102"], + stage: 4, + sprite: "mantaraymon_x", + id: "4-076", + url: "https://digimon.net/reference_en/detail.php?directory_name=mantaraymon_x", + }, + { + name_en: "Meicoomon", + name_jp: "Meicoomon", + next_evolutions: ["5-078", "5-079"], + stage: 4, + sprite: "meicoomon", + id: "4-077", + url: "https://digimon.net/reference_en/detail.php?directory_name=meicoomon", + }, + { + name_en: "Mekanorimon", + name_jp: "Mechanorimon", + next_evolutions: ["5-137", "5-013", "5-080"], + stage: 4, + sprite: "mekanorimon", + id: "4-078", + url: "https://digimon.net/reference_en/detail.php?directory_name=mechanorimon", + }, + { + name_en: "Meramon", + name_jp: "Meramon", + next_evolutions: [ + "5-070", + "5-127", + "5-110", + "5-139", + "5-107", + "5-016", + "5-002", + "5-041", + "5-048", + "5-061", + "5-145", + "5-149", + ], + stage: 4, + sprite: "meramon", + id: "4-079", + url: "https://digimon.net/reference_en/detail.php?directory_name=meramon", + }, + { + name_en: "Meramon X", + name_jp: "Meramon X", + next_evolutions: ["5-026", "5-047", "5-103", "5-071", "5-044"], + stage: 4, + sprite: "meramon_x", + id: "4-080", + url: "https://digimon.net/reference_en/detail.php?directory_name=meramon_x", + }, + { + name_en: "Mimicmon", + name_jp: "Mimicmon", + next_evolutions: ["5-036", "5-075", "5-122"], + stage: 4, + sprite: "mimicmon", + id: "4-081", + url: "https://digimon.net/reference_en/detail.php?directory_name=mimicmon", + }, + { + name_en: "Minotarumon", + name_jp: "Minotaurmon", + next_evolutions: ["5-113", "5-066"], + stage: 4, + sprite: "minotarumon", + id: "4-082", + url: "https://digimon.net/reference_en/detail.php?directory_name=minotaurmon", + }, + { + name_en: "Mojyamon", + name_jp: "Mojyamon", + next_evolutions: ["5-109", "5-018", "5-040", "5-057", "5-028", "5-009"], + stage: 4, + sprite: "mojyamon", + id: "4-083", + url: "https://digimon.net/reference_en/detail.php?directory_name=mojyamon", + }, + { + name_en: "Monochromon", + name_jp: "Monochromon", + next_evolutions: [ + "5-080", + "5-131", + "5-052", + "5-109", + "5-121", + "5-004", + "5-040", + "5-072", + "5-088", + "5-126", + "5-087", + ], + stage: 4, + sprite: "monochromon", + id: "4-084", + url: "https://digimon.net/reference_en/detail.php?directory_name=monochromon", + }, + { + name_en: "Nanimon", + name_jp: "Nanimon", + next_evolutions: ["5-030"], + stage: 4, + sprite: "nanimon", + id: "4-085", + url: "https://digimon.net/reference_en/detail.php?directory_name=nanimon", + }, + { + name_en: "Nefertimon X", + name_jp: "Nefertimon X", + next_evolutions: ["5-084", "5-072", "5-083"], + stage: 4, + sprite: "nefertimon_x", + id: "4-086", + url: "https://digimon.net/reference_en/detail.php?directory_name=nefertimon_x", + }, + { + name_en: "Ninjamon", + name_jp: "Igamon", + next_evolutions: ["5-091", "5-087", "5-139", "5-004", "5-010"], + stage: 4, + sprite: "ninjamon", + id: "4-087", + url: "https://digimon.net/reference_en/detail.php?directory_name=igamon", + }, + { + name_en: "Numemon", + name_jp: "Numemon", + next_evolutions: ["5-095", "5-051", "5-039"], + stage: 4, + sprite: "numemon", + id: "4-088", + url: "https://digimon.net/reference_en/detail.php?directory_name=numemon", + }, + { + name_en: "Numemon X", + name_jp: "Numemon X", + next_evolutions: ["5-089", "5-102", "5-060", "5-132", "5-128", "5-053", "5-099", "5-083", "5-084", "5-092"], + stage: 4, + sprite: "numemon_x", + id: "4-089", + url: "https://digimon.net/reference_en/detail.php?directory_name=numemon_x", + }, + { + name_en: "Octomon", + name_jp: "Octmon", + next_evolutions: ["5-035", "5-032", "5-077", "5-118", "5-076", "5-082", "5-049", "5-085", "5-108"], + stage: 4, + sprite: "octomon", + id: "4-090", + url: "https://digimon.net/reference_en/detail.php?directory_name=octmon", + }, + { + name_en: "Ogremon", + name_jp: "Orgemon", + next_evolutions: ["5-003", "5-057", "5-070", "5-100", "5-087", "5-118"], + stage: 4, + sprite: "ogremon", + id: "4-091", + url: "https://digimon.net/reference_en/detail.php?directory_name=orgemon", + }, + { + name_en: "Ogremon X", + name_jp: "Orgemon X", + next_evolutions: ["5-099", "5-074", "5-092", "5-072"], + stage: 4, + sprite: "ogremon_x", + id: "4-092", + url: "https://digimon.net/reference_en/detail.php?directory_name=orgemon_x", + }, + { + name_en: "Omekamon", + name_jp: "Omekamon", + next_evolutions: [ + "5-024", + "5-054", + "5-110", + "5-071", + "5-103", + "5-026", + "5-034", + "5-096", + "5-116", + "5-051", + "5-047", + "5-146", + ], + stage: 4, + sprite: "omekamon", + id: "4-093", + url: "https://digimon.net/reference_en/detail.php?directory_name=omekamon", + }, + { + name_en: "Paledramon", + name_jp: "Paledramon", + next_evolutions: ["5-024", "5-110", "5-026", "5-034", "5-116", "5-051", "5-022", "5-073", "5-146"], + stage: 4, + sprite: "paledramon", + id: "4-094", + url: "https://digimon.net/reference_en/detail.php?directory_name=paledramon", + }, + { + name_en: "Parasaurmon", + name_jp: "Parasaurmon", + next_evolutions: ["5-130", "5-050", "5-037", "5-063", "5-014", "5-055"], + stage: 4, + sprite: "parasaurmon", + id: "4-095", + url: "https://digimon.net/reference_en/detail.php?directory_name=parasaurmon", + }, + { + name_en: "Peckmon", + name_jp: "Peckmon", + next_evolutions: ["5-106", "5-050", "5-054"], + stage: 4, + sprite: "peckmon", + id: "4-096", + url: "https://digimon.net/reference_en/detail.php?directory_name=peckmon", + }, + { + name_en: "Pegasusmon X", + name_jp: "Pegasmon X", + next_evolutions: ["5-096", "5-051", "5-005", "5-047"], + stage: 4, + sprite: "pegasusmon_x", + id: "4-097", + url: "https://digimon.net/reference_en/detail.php?directory_name=pegasmon_x", + }, + { + name_en: "Petermon", + name_jp: "Petermon", + next_evolutions: ["5-062", "5-050", "5-106", "5-037"], + stage: 4, + sprite: "petermon", + id: "4-098", + url: "https://digimon.net/reference_en/detail.php?directory_name=petermon", + }, + { + name_en: "Porcupamon", + name_jp: "Porcupamon", + next_evolutions: ["5-009", "5-011", "5-027", "5-125"], + stage: 4, + sprite: "porcupamon", + id: "4-099", + url: "https://digimon.net/reference_en/detail.php?directory_name=porcupamon", + }, + { + name_en: "Pteramon X", + name_jp: "Pteranomon X", + next_evolutions: ["5-044", "5-017", "5-071"], + stage: 4, + sprite: "pteramon_x", + id: "4-100", + url: "https://digimon.net/reference_en/detail.php?directory_name=pteranomon_x", + }, + { + name_en: "Raremon", + name_jp: "Raremon", + next_evolutions: ["5-040", "5-093", "5-113", "5-038", "5-065", "5-091", "5-066"], + stage: 4, + sprite: "raremon", + id: "4-101", + url: "https://digimon.net/reference_en/detail.php?directory_name=raremon", + }, + { + name_en: "RedVegiemon", + name_jp: "RedVegimon", + next_evolutions: ["5-042", "5-029", "5-020"], + stage: 4, + sprite: "redvegiemon", + id: "4-102", + url: "https://digimon.net/reference_en/detail.php?directory_name=redvegimon", + }, + { + name_en: "Reppamon", + name_jp: "Reppamon", + next_evolutions: ["5-012", "5-115", "5-111", "5-075", "5-109", "5-030", "5-045"], + stage: 4, + sprite: "reppamon", + id: "4-103", + url: "https://digimon.net/reference_en/detail.php?directory_name=reppamon", + }, + { + name_en: "Rhinomon X", + name_jp: "Rhinomon X", + next_evolutions: ["5-140", "5-136", "5-023"], + stage: 4, + sprite: "rhinomon_x", + id: "4-104", + url: "https://digimon.net/reference_en/detail.php?directory_name=rhinomon_x", + }, + { + name_en: "Roachmon", + name_jp: "Gokimon", + next_evolutions: ["5-008", "5-118", "5-104", "5-031", "5-055", "5-105", "5-148"], + stage: 4, + sprite: "roachmon", + id: "4-105", + url: "https://digimon.net/reference_en/detail.php?directory_name=gokimon", + }, + { + name_en: "Sangloupmon", + name_jp: "Sangloupmon", + next_evolutions: ["5-067", "5-019", "5-125"], + stage: 4, + sprite: "sangloupmon", + id: "4-106", + url: "https://digimon.net/reference_en/detail.php?directory_name=sangloupmon", + }, + { + name_en: "Seadramon", + name_jp: "Seadramon", + next_evolutions: ["5-070", "5-082", "5-141", "5-032", "5-035", "5-076", "5-108", "5-049", "5-085"], + stage: 4, + sprite: "seadramon", + id: "4-107", + url: "https://digimon.net/reference_en/detail.php?directory_name=seadramon", + }, + { + name_en: "Seadramon X", + name_jp: "Seadramon X", + next_evolutions: ["5-083", "5-072", "5-074"], + stage: 4, + sprite: "seadramon_x", + id: "4-108", + url: "https://digimon.net/reference_en/detail.php?directory_name=seadramon_x", + }, + { + name_en: "Seasarmon X", + name_jp: "Siesamon X", + next_evolutions: ["5-103", "5-034", "5-044", "5-047", "5-146"], + stage: 4, + sprite: "seasarmon_x", + id: "4-109", + url: "https://digimon.net/reference_en/detail.php?directory_name=siesamon_x", + }, + { + name_en: "Shadramon", + name_jp: "Shadramon", + next_evolutions: ["5-027", "5-009", "5-031", "5-055", "5-105"], + stage: 4, + sprite: "shadramon", + id: "4-110", + url: "https://digimon.net/reference_en/detail.php?directory_name=shadramon", + }, + { + name_en: "Shellmon", + name_jp: "Shellmon", + next_evolutions: ["5-003", "5-057", "5-138", "5-049", "5-085", "5-108", "5-035", "5-076"], + stage: 4, + sprite: "shellmon", + id: "4-111", + url: "https://digimon.net/reference_en/detail.php?directory_name=shellmon", + }, + { + name_en: "ShellNumemon", + name_jp: "KaratukiNumemon", + next_evolutions: ["5-130", "5-119", "5-124", "5-085", "5-108"], + stage: 4, + sprite: "shellnumemon", + id: "4-112", + url: "https://digimon.net/reference_en/detail.php?directory_name=karatukinumemon", + }, + { + name_en: "Shoutmon X3", + name_jp: "Shoutmon X3", + next_evolutions: ["5-122", "5-115", "5-135"], + stage: 4, + sprite: "shoutmon_x3", + id: "4-113", + url: "https://digimon.net/reference_en/detail.php?directory_name=shoutmonx3", + }, + { + name_en: "Sistermon Ciel", + name_jp: "Sistermon Ciel", + next_evolutions: ["5-021", "5-140", "5-064"], + stage: 4, + sprite: "sistermon_ciel", + id: "4-114", + url: "https://digimon.net/reference_en/detail.php?directory_name=sistermon_ciel", + }, + { + name_en: "Starmon", + name_jp: "Starmon", + next_evolutions: ["5-109", "5-004", "5-131", "5-121", "5-016", "5-002", "5-129", "5-145", "5-149"], + stage: 4, + sprite: "starmon", + id: "4-115", + url: "https://digimon.net/reference_en/detail.php?directory_name=starmon", + }, + { + name_en: "Stingmon", + name_jp: "Stingmon", + next_evolutions: ["5-100", "5-031", "5-105", "5-040", "5-057", "5-097", "5-055", "5-004"], + stage: 4, + sprite: "stingmon", + id: "4-116", + url: "https://digimon.net/reference_en/detail.php?directory_name=stingmon", + }, + { + name_en: "Strikedramon", + name_jp: "Strikedramon", + next_evolutions: ["5-025", "5-066"], + stage: 4, + sprite: "strikedramon", + id: "4-117", + url: "https://digimon.net/reference_en/detail.php?directory_name=strikedramon", + }, + { + name_en: "Submarimon", + name_jp: "Submarimon", + next_evolutions: ["5-138", "5-049", "5-085", "5-108", "5-105"], + stage: 4, + sprite: "submarimon", + id: "4-118", + url: "https://digimon.net/reference_en/detail.php?directory_name=sabmarimon", + }, + { + name_en: "Sukamon", + name_jp: "Scumon", + next_evolutions: ["5-039", "5-057"], + stage: 4, + sprite: "sukamon", + id: "4-119", + url: "https://digimon.net/reference_en/detail.php?directory_name=scumon", + }, + { + name_en: "Sunflowmon", + name_jp: "Sunflowmon", + next_evolutions: ["5-062", "5-055", "5-063", "5-130", "5-014", "5-038", "5-017"], + stage: 4, + sprite: "sunflowmon", + id: "4-120", + url: "https://digimon.net/reference_en/detail.php?directory_name=sunflowmon", + }, + { + name_en: "Tankmon", + name_jp: "Tankmon", + next_evolutions: ["5-087", "5-003", "5-013", "5-080", "5-058", "5-137"], + stage: 4, + sprite: "tankmon", + id: "4-121", + url: "https://digimon.net/reference_en/detail.php?directory_name=tankmon", + }, + { + name_en: "Targetmon", + name_jp: "Targetmon", + next_evolutions: ["5-039", "5-036", "5-117"], + stage: 4, + sprite: "targetmon", + id: "4-122", + url: "https://digimon.net/reference_en/detail.php?directory_name=targetmon", + }, + { + name_en: "Thundermon", + name_jp: "Thunderballmon", + next_evolutions: ["5-013", "5-025", "5-058", "5-137", "5-045", "5-144"], + stage: 4, + sprite: "thundermon", + id: "4-123", + url: "https://digimon.net/reference_en/detail.php?directory_name=thunderballmon", + }, + { + name_en: "TiaLudomon", + name_jp: "TiaLudomon", + next_evolutions: ["5-111", "5-075", "5-030", "5-109"], + stage: 4, + sprite: "tialudomon", + id: "4-124", + url: "https://digimon.net/reference_en/detail.php?directory_name=tialudomon", + }, + { + name_en: "Tobiumon", + name_jp: "Tobiumon", + next_evolutions: ["5-076", "5-049", "5-085", "5-108", "5-035", "5-082", "5-119", "5-138"], + stage: 4, + sprite: "tobiumon", + id: "4-125", + url: "https://digimon.net/reference_en/detail.php?directory_name=tobiumon", + }, + { + name_en: "TobuCatmon", + name_jp: "Tobucatmon", + next_evolutions: ["5-125", "5-090", "5-023", "5-021", "5-140"], + stage: 4, + sprite: "tobucatmon", + id: "4-126", + url: "https://digimon.net/reference_en/detail.php?directory_name=tobucatmon", + }, + { + name_en: "Togemon", + name_jp: "Togemon", + next_evolutions: [ + "5-063", + "5-001", + "5-014", + "5-020", + "5-029", + "5-043", + "5-042", + "5-052", + "5-131", + "5-046", + "5-097", + "5-118", + "5-148", + ], + stage: 4, + sprite: "togemon", + id: "4-127", + url: "https://digimon.net/reference_en/detail.php?directory_name=togemon", + }, + { + name_en: "Togemon X", + name_jp: "Togemon X", + next_evolutions: ["5-017", "5-034", "5-026", "5-071", "5-146"], + stage: 4, + sprite: "togemon_x", + id: "4-128", + url: "https://digimon.net/reference_en/detail.php?directory_name=togemon_x", + }, + { + name_en: "Tortomon", + name_jp: "Tortamon", + next_evolutions: ["5-081", "5-052", "5-109", "5-046", "5-118", "5-097", "5-131", "5-148"], + stage: 4, + sprite: "tortomon", + id: "4-129", + url: "https://digimon.net/reference_en/detail.php?directory_name=tortamon", + }, + { + name_en: "Troopmon", + name_jp: "Troopmon", + next_evolutions: ["5-027"], + stage: 4, + sprite: "troopmon", + id: "4-130", + url: "https://digimon.net/reference_en/detail.php?directory_name=troopmon", + }, + { + name_en: "Turuiemon", + name_jp: "Turuiemon", + next_evolutions: ["5-021", "5-006", "5-112"], + stage: 4, + sprite: "turuiemon", + id: "4-131", + url: "https://digimon.net/reference_en/detail.php?directory_name=turuiemon", + }, + { + name_en: "Tuskmon", + name_jp: "Tuskmon", + next_evolutions: ["5-028"], + stage: 4, + sprite: "tuskmon", + id: "4-132", + url: "https://digimon.net/reference_en/detail.php?directory_name=tuskmon", + }, + { + name_en: "Tylomon", + name_jp: "Tylomon", + next_evolutions: [], + stage: 4, + sprite: "tylomon", + id: "4-133", + url: "https://digimon.net/reference_en/detail.php?directory_name=tylomon", + }, + { + name_en: "Tylomon X", + name_jp: "Tylomon X", + next_evolutions: ["5-116", "5-071"], + stage: 4, + sprite: "tylomon_x", + id: "4-134", + url: "https://digimon.net/reference_en/detail.php?directory_name=tylomon_x", + }, + { + name_en: "Tyrannomon", + name_jp: "Tyranomon", + next_evolutions: ["5-070", "5-127", "5-048", "5-061"], + stage: 4, + sprite: "tyrannomon", + id: "4-135", + url: "https://digimon.net/reference_en/detail.php?directory_name=tyranomon", + }, + { + name_en: "Tyrannomon X", + name_jp: "Tyranomon X", + next_evolutions: ["5-090", "5-094", "5-023"], + stage: 4, + sprite: "tyrannomon_x", + id: "4-136", + url: "https://digimon.net/reference_en/detail.php?directory_name=tyranomon_x", + }, + { + name_en: "Unimon", + name_jp: "Unimon", + next_evolutions: ["5-003", "5-057", "5-068", "5-046", "5-008"], + stage: 4, + sprite: "unimon", + id: "4-137", + url: "https://digimon.net/reference_en/detail.php?directory_name=yunimon", + }, + { + name_en: "Veedramon", + name_jp: "V-dramon", + next_evolutions: ["5-001", "5-043", "5-029", "5-031", "5-030"], + stage: 4, + sprite: "veedramon", + id: "4-138", + url: "https://digimon.net/reference_en/detail.php?directory_name=v-dramon", + }, + { + name_en: "Vegiemon", + name_jp: "Vegimon", + next_evolutions: ["5-133", "5-130", "5-037", "5-062", "5-014", "5-063", "5-055"], + stage: 4, + sprite: "vegiemon", + id: "4-139", + url: "https://digimon.net/reference_en/detail.php?directory_name=vegimon", + }, + { + name_en: "Velgrmon", + name_jp: "Velgrmon", + next_evolutions: ["5-060", "5-102", "5-053", "5-072", "5-128", "5-084", "5-092"], + stage: 4, + sprite: "velgrmon", + id: "4-140", + url: "https://digimon.net/reference_en/detail.php?directory_name=velgrmon", + }, + { + name_en: "Whamon", + name_jp: "Whamon", + next_evolutions: ["5-091"], + stage: 4, + sprite: "whamon", + id: "4-141", + url: "https://digimon.net/reference_en/detail.php?directory_name=whamon", + }, + { + name_en: "Witchmon", + name_jp: "Witchmon", + next_evolutions: ["5-100", "5-040", "5-057", "5-097"], + stage: 4, + sprite: "witchmon", + id: "4-142", + url: "https://digimon.net/reference_en/detail.php?directory_name=witchmon", + }, + { + name_en: "Wizardmon", + name_jp: "Wizarmon", + next_evolutions: ["5-110", "5-127", "5-073", "5-107", "5-139", "5-011", "5-098"], + stage: 4, + sprite: "wizardmon", + id: "4-143", + url: "https://digimon.net/reference_en/detail.php?directory_name=wizarmon", + }, + { + name_en: "Wizardmon X", + name_jp: "Wizarmon X", + next_evolutions: ["5-116", "5-096", "5-119", "5-071"], + stage: 4, + sprite: "wizardmon_x", + id: "4-144", + url: "https://digimon.net/reference_en/detail.php?directory_name=wizarmon_x", + }, + { + name_en: "Woodmon", + name_jp: "Woodmon", + next_evolutions: ["5-020", "5-029", "5-042"], + stage: 4, + sprite: "woodmon", + id: "4-145", + url: "https://digimon.net/reference_en/detail.php?directory_name=woodmon", + }, + { + name_en: "ZubaEagermon", + name_jp: "Zubaeagermon", + next_evolutions: ["5-036", "5-039", "5-117", "5-010", "5-051"], + stage: 4, + sprite: "zubaeagermon", + id: "4-146", + url: "https://digimon.net/reference_en/detail.php?directory_name=zubaeagermon", + }, + { + name_en: "Bulkmon", + name_jp: "Bulkmon", + next_evolutions: ["5-144"], + stage: 4, + sprite: "bulkmon", + id: "4-147", + url: "https://digimon.net/reference_en/detail.php?directory_name=bulkmon", + }, + { + name_en: "Fugamon", + name_jp: "Fugamon", + next_evolutions: [], + stage: 4, + sprite: "fugamon", + id: "4-148", + url: "https://digimon.net/reference_en/detail.php?directory_name=fugamon", + }, + { + name_en: "Hyogamon", + name_jp: "Hyougamon", + next_evolutions: ["5-024", "5-073"], + stage: 4, + sprite: "hyogamon", + id: "4-149", + url: "https://digimon.net/reference_en/detail.php?directory_name=hyougamon", + }, + { + name_en: "Piddomon", + name_jp: "Pidmon", + next_evolutions: ["5-043"], + stage: 4, + sprite: "piddomon", + id: "4-150", + url: "https://digimon.net/reference_en/detail.php?directory_name=pidmon", + }, + { + name_en: "Rhinomon", + name_jp: "Rhinomon", + next_evolutions: [], + stage: 4, + sprite: "rhinomon", + id: "4-151", + url: "https://digimon.net/reference_en/detail.php?directory_name=rhinomon", + }, + { + name_en: "Saberdramon", + name_jp: "Saberdramon", + next_evolutions: ["5-025", "5-098", "5-107", "5-011", "5-110"], + stage: 4, + sprite: "saberdramon", + id: "4-152", + url: "https://digimon.net/reference_en/detail.php?directory_name=saberdramon", + }, + { + name_en: "AeroVeedramon", + name_jp: "AeroV-dramon", + next_evolutions: ["6-137", "6-105", "6-114", "6-084", "7-019"], + stage: 5, + sprite: "aeroveedramon", + id: "5-001", + url: "https://digimon.net/reference_en/detail.php?directory_name=earov-dramon", + }, + { + name_en: "Aldamon", + name_jp: "Aldamon", + next_evolutions: ["6-048", "6-005", "6-011"], + stage: 5, + sprite: "aldamon", + id: "5-002", + url: "https://digimon.net/reference_en/detail.php?directory_name=aldamon", + }, + { + name_en: "Andromon", + name_jp: "Andromon", + next_evolutions: ["6-068", "6-091", "6-080", "5-033", "6-143", "6-028", "6-125"], + stage: 5, + sprite: "andromon", + id: "5-003", + url: "https://digimon.net/reference_en/detail.php?directory_name=andromon", + }, + { + name_en: "Angewomon", + name_jp: "Angewomon", + next_evolutions: ["6-081", "6-066", "6-090", "7-029", "6-100", "6-020", "6-139", "7-020"], + stage: 5, + sprite: "angewomon", + id: "5-004", + url: "https://digimon.net/reference_en/detail.php?directory_name=angewomon", + }, + { + name_en: "Angewomon X", + name_jp: "Angewomon X", + next_evolutions: ["6-101", "6-043", "6-082", "6-046"], + stage: 5, + sprite: "angewomon_x", + id: "5-005", + url: "https://digimon.net/reference_en/detail.php?directory_name=angewomon_x", + }, + { + name_en: "Antylamon", + name_jp: "Andiramon", + next_evolutions: ["6-033", "6-087"], + stage: 5, + sprite: "antylamon_deva", + id: "5-006", + url: "https://digimon.net/reference_en/detail.php?directory_name=andiramon", + }, + { + name_en: "Argomon", + name_jp: "Algomon", + next_evolutions: ["6-016", "6-055", "5-033"], + stage: 5, + sprite: "argomon_perfect", + id: "5-007", + url: "https://digimon.net/reference_en/detail.php?directory_name=algomon-ultimate", + }, + { + name_en: "Arukenimon", + name_jp: "Archnemon", + next_evolutions: ["6-114", "6-085", "6-003", "6-020", "6-098"], + stage: 5, + sprite: "arukenimon", + id: "5-008", + url: "https://digimon.net/reference_en/detail.php?directory_name=archnemon", + }, + { + name_en: "Astamon", + name_jp: "Astamon", + next_evolutions: ["6-026", "6-045", "6-007", "6-065"], + stage: 5, + sprite: "astamon", + id: "5-009", + url: "https://digimon.net/reference_en/detail.php?directory_name=astamon", + }, + { + name_en: "Asuramon", + name_jp: "Asuramon", + next_evolutions: ["6-143", "6-091", "6-044", "6-104"], + stage: 5, + sprite: "asuramon", + id: "5-010", + url: "https://digimon.net/reference_en/detail.php?directory_name=asuramon", + }, + { + name_en: "Baalmon", + name_jp: "Baalmon", + next_evolutions: ["6-025", "7-005", "6-099", "6-107"], + stage: 5, + sprite: "baalmon", + id: "5-011", + url: "https://digimon.net/reference_en/detail.php?directory_name=baalmon", + }, + { + name_en: "Beowolfmon", + name_jp: "Beowolfmon", + next_evolutions: ["6-074", "6-083", "6-004", "6-008"], + stage: 5, + sprite: "beowolfmon", + id: "5-012", + url: "https://digimon.net/reference_en/detail.php?directory_name=beowolfmon", + }, + { + name_en: "BigMamemon", + name_jp: "BigMamemon", + next_evolutions: ["6-091", "6-068", "6-141", "6-098", "6-038"], + stage: 5, + sprite: "bigmamemon", + id: "5-013", + url: "https://digimon.net/reference_en/detail.php?directory_name=bigmamemon", + }, + { + name_en: "Blossomon", + name_jp: "Blossomon", + next_evolutions: ["6-114", "6-137", "6-063"], + stage: 5, + sprite: "blossomon", + id: "5-014", + url: "https://digimon.net/reference_en/detail.php?directory_name=blossomon", + }, + { + name_en: "Bulbmon", + name_jp: "Valvemon", + next_evolutions: ["6-091", "6-038", "6-098"], + stage: 5, + sprite: "bulbmon", + id: "5-015", + url: "https://digimon.net/reference_en/detail.php?directory_name=valvemon", + }, + { + name_en: "BurningGreymon", + name_jp: "Vritramon", + next_evolutions: ["6-048", "6-005", "6-011"], + stage: 5, + sprite: "burninggreymon", + id: "5-016", + url: "https://digimon.net/reference_en/detail.php?directory_name=vritramon", + }, + { + name_en: "CannonBeemon", + name_jp: "CannonBeemon", + next_evolutions: ["6-135", "6-043", "6-116", "6-082", "6-046", "6-066", "6-061"], + stage: 5, + sprite: "cannonbeemon", + id: "5-017", + url: "https://digimon.net/reference_en/detail.php?directory_name=cannonbeemon", + }, + { + name_en: "Cerberusmon", + name_jp: "Cerberumon", + next_evolutions: ["6-013", "6-055", "6-009", "6-060"], + stage: 5, + sprite: "cerberusmon", + id: "5-018", + url: "https://digimon.net/reference_en/detail.php?directory_name=cerberumon", + }, + { + name_en: "Cerberusmon X", + name_jp: "Cerberumon X", + next_evolutions: ["6-127", "7-022", "6-085", "7-021", "6-108"], + stage: 5, + sprite: "cerberusmon_x", + id: "5-019", + url: "https://digimon.net/reference_en/detail.php?directory_name=cerberumon_x", + }, + { + name_en: "Cherrymon", + name_jp: "Jyureimon", + next_evolutions: ["6-113", "6-123"], + stage: 5, + sprite: "cherrymon", + id: "5-020", + url: "https://digimon.net/reference_en/detail.php?directory_name=jyureimon", + }, + { + name_en: "Cho-Hakkaimon", + name_jp: "Cho-Hakkaimon", + next_evolutions: ["6-024", "7-009", "6-092", "6-085", "6-108"], + stage: 5, + sprite: "cho_hakkaimon", + id: "5-021", + url: "https://digimon.net/reference_en/detail.php?directory_name=chohakkaimon", + }, + { + name_en: "Crescemon", + name_jp: "Crescemon", + next_evolutions: ["6-041", "6-067", "6-007", "6-130", "6-026", "6-096"], + stage: 5, + sprite: "crescemon", + id: "5-022", + url: "https://digimon.net/reference_en/detail.php?directory_name=crescemon", + }, + { + name_en: "Crowmon", + name_jp: "Yatagaramon", + next_evolutions: ["6-127", "6-140", "6-085", "6-108", "6-024", "6-120", "6-006", "6-010", "6-093"], + stage: 5, + sprite: "crowmon", + id: "5-023", + url: "https://digimon.net/reference_en/detail.php?directory_name=yatagaramon", + }, + { + name_en: "CrysPaledramon", + name_jp: "CrysPaledramon", + next_evolutions: ["6-067", "6-082", "6-070", "6-002", "6-058", "6-104", "6-007", "6-130"], + stage: 5, + sprite: "cryspaledramon", + id: "5-024", + url: "https://digimon.net/reference_en/detail.php?directory_name=cryspaledramon", + }, + { + name_en: "Cyberdramon", + name_jp: "Cyberdramon", + next_evolutions: ["6-068", "6-141", "6-065", "6-049", "6-143", "6-071"], + stage: 5, + sprite: "cyberdramon", + id: "5-025", + url: "https://digimon.net/reference_en/detail.php?directory_name=cyberdramon", + }, + { + name_en: "Cyberdramon X", + name_jp: "Cyberdramon X", + next_evolutions: ["6-070", "6-106", "6-082", "6-135", "6-051", "6-046"], + stage: 5, + sprite: "cyberdramon_x", + id: "5-026", + url: "https://digimon.net/reference_en/detail.php?directory_name=cyberdramon_x", + }, + { + name_en: "DarkKnightmon", + name_jp: "DarkKnightmon", + next_evolutions: ["6-026", "6-025", "7-011"], + stage: 5, + sprite: "darkknightmon", + id: "5-027", + url: "https://digimon.net/reference_en/detail.php?directory_name=darkknightmon", + }, + { + name_en: "Datamon", + name_jp: "Nanomon", + next_evolutions: ["6-045"], + stage: 5, + sprite: "datamon", + id: "5-028", + url: "https://digimon.net/reference_en/detail.php?directory_name=nanomon", + }, + { + name_en: "Deramon", + name_jp: "Delumon", + next_evolutions: ["6-063", "6-105", "6-123", "6-113"], + stage: 5, + sprite: "deramon", + id: "5-029", + url: "https://digimon.net/reference_en/detail.php?directory_name=delumon", + }, + { + name_en: "Digitamamon", + name_jp: "Digitamamon", + next_evolutions: ["6-054", "6-136", "6-137", "6-084", "7-019", "6-031", "6-107"], + stage: 5, + sprite: "digitamamon", + id: "5-030", + url: "https://digimon.net/reference_en/detail.php?directory_name=digitamamon", + }, + { + name_en: "Dinobeemon", + name_jp: "Dinobeemon", + next_evolutions: [ + "6-061", + "6-013", + "6-055", + "6-088", + "6-062", + "6-065", + "6-064", + "7-020", + "7-019", + "6-137", + "6-084", + "6-081", + ], + stage: 5, + sprite: "dinobeemon", + id: "5-031", + url: "https://digimon.net/reference_en/detail.php?directory_name=dinobeemon", + }, + { + name_en: "Divermon", + name_jp: "Hangyomon", + next_evolutions: ["6-109", "6-086", "6-008", "6-112"], + stage: 5, + sprite: "divermon", + id: "5-032", + url: "https://digimon.net/reference_en/detail.php?directory_name=hangyomon", + }, + { + name_en: "DoneDevimon", + name_jp: "NeoDevimon", + next_evolutions: ["6-055", "6-088", "6-028", "6-143"], + stage: 5, + sprite: "donedevimon", + id: "5-033", + url: "https://digimon.net/reference_en/detail.php?directory_name=neodevimon", + }, + { + name_en: "DoruGreymon", + name_jp: "DORUguremon", + next_evolutions: ["6-002", "6-051", "6-082", "6-043", "6-150"], + stage: 5, + sprite: "dorugreymon", + id: "5-034", + url: "https://digimon.net/reference_en/detail.php?directory_name=doruguremon", + }, + { + name_en: "Dragomon", + name_jp: "Dagomon", + next_evolutions: ["6-112", "6-109", "6-095", "6-121"], + stage: 5, + sprite: "dragomon", + id: "5-035", + url: "https://digimon.net/reference_en/detail.php?directory_name=dagomon", + }, + { + name_en: "Duramon", + name_jp: "Duramon", + next_evolutions: ["6-044", "6-129", "6-057", "6-004", "6-104"], + stage: 5, + sprite: "duramon", + id: "5-036", + url: "https://digimon.net/reference_en/detail.php?directory_name=duramon", + }, + { + name_en: "Entmon", + name_jp: "Entmon", + next_evolutions: ["6-047", "6-103", "6-010"], + stage: 5, + sprite: "entmon", + id: "5-037", + url: "https://digimon.net/reference_en/detail.php?directory_name=entmon", + }, + { + name_en: "Eosmon", + name_jp: "Eosmon", + next_evolutions: ["6-049", "6-062", "6-012", "6-135", "6-149"], + stage: 5, + sprite: "eosmon_perfect", + id: "5-038", + url: "https://digimon.net/reference_en/detail.php?directory_name=eosmon_lv5", + }, + { + name_en: "Etemon", + name_jp: "Etemon", + next_evolutions: ["6-021", "6-073", "6-090"], + stage: 5, + sprite: "etemon", + id: "5-039", + url: "https://digimon.net/reference_en/detail.php?directory_name=etemon", + }, + { + name_en: "ExTyrannomon", + name_jp: "Ex-Tyranomon", + next_evolutions: ["6-051", "6-113", "6-013", "6-055", "6-009"], + stage: 5, + sprite: "extyrannomon", + id: "5-040", + url: "https://digimon.net/reference_en/detail.php?directory_name=ex-tyranomon", + }, + { + name_en: "Flaremon", + name_jp: "Flaremon", + next_evolutions: ["6-015", "6-011", "6-142", "6-096", "6-065"], + stage: 5, + sprite: "flaremon", + id: "5-041", + url: "https://digimon.net/reference_en/detail.php?directory_name=flaremon", + }, + { + name_en: "Garbagemon", + name_jp: "Gerbemon", + next_evolutions: ["6-114", "6-113"], + stage: 5, + sprite: "garbagemon", + id: "5-042", + url: "https://digimon.net/reference_en/detail.php?directory_name=gerbemon", + }, + { + name_en: "Garudamon", + name_jp: "Garudamon", + next_evolutions: ["6-105", "6-137", "6-063"], + stage: 5, + sprite: "garudamon", + id: "5-043", + url: "https://digimon.net/reference_en/detail.php?directory_name=garudamon", + }, + { + name_en: "Garudamon X", + name_jp: "Garudamon X", + next_evolutions: ["6-082", "6-106", "6-135", "6-051", "6-046"], + stage: 5, + sprite: "garudamon_x", + id: "5-044", + url: "https://digimon.net/reference_en/detail.php?directory_name=garudamon_x", + }, + { + name_en: "Giromon", + name_jp: "Giromon", + next_evolutions: [], + stage: 5, + sprite: "giromon", + id: "5-045", + url: "https://digimon.net/reference_en/detail.php?directory_name=giromon", + }, + { + name_en: "Gogmamon", + name_jp: "Gogmamon", + next_evolutions: ["6-011", "6-081", "6-096", "6-042", "6-009"], + stage: 5, + sprite: "gogmamon", + id: "5-046", + url: "https://digimon.net/reference_en/detail.php?directory_name=gogmamon", + }, + { + name_en: "Grademon", + name_jp: "Grademon", + next_evolutions: ["6-051", "6-099", "6-046", "6-002", "6-070", "6-106", "6-058", "6-104", "6-150"], + stage: 5, + sprite: "grademon", + id: "5-047", + url: "https://digimon.net/reference_en/detail.php?directory_name=grademon", + }, + { + name_en: "Groundramon", + name_jp: "Groundramon", + next_evolutions: ["6-030", "6-011", "6-142", "6-069"], + stage: 5, + sprite: "groundramon", + id: "5-048", + url: "https://digimon.net/reference_en/detail.php?directory_name=groundramon", + }, + { + name_en: "Gusokumon", + name_jp: "Gusokumon", + next_evolutions: ["6-121", "6-001", "6-008", "6-095", "6-109"], + stage: 5, + sprite: "gusokumon", + id: "5-049", + url: "https://digimon.net/reference_en/detail.php?directory_name=gusokumon", + }, + { + name_en: "HippoGryphonmon", + name_jp: "Hippogriffomon", + next_evolutions: ["6-103", "6-010", "6-047", "6-145", "6-107"], + stage: 5, + sprite: "hippogryphonmon", + id: "5-050", + url: "https://digimon.net/reference_en/detail.php?directory_name=hippogriffomon", + }, + { + name_en: "Hisyaryumon", + name_jp: "Hisyaryumon", + next_evolutions: ["6-104", "6-051", "6-110", "6-082", "6-044", "6-098"], + stage: 5, + sprite: "hisyaryumon", + id: "5-051", + url: "https://digimon.net/reference_en/detail.php?directory_name=hisyaryumon", + }, + { + name_en: "Jagamon", + name_jp: "Jyagamon", + next_evolutions: ["6-066", "6-126", "6-081", "6-009", "6-042"], + stage: 5, + sprite: "jagamon", + id: "5-052", + url: "https://digimon.net/reference_en/detail.php?directory_name=jyagamon", + }, + { + name_en: "JagerLoweemon", + name_jp: "KaiserLeomon", + next_evolutions: ["6-102", "6-138", "6-122", "6-019", "6-024", "6-035", "6-042", "6-009", "6-055", "6-043"], + stage: 5, + sprite: "jagerloweemon", + id: "5-053", + url: "https://digimon.net/reference_en/detail.php?directory_name=kaiserleomon", + }, + { + name_en: "Jazarichmon", + name_jp: "Jazarichmon", + next_evolutions: ["6-093", "6-046", "6-116", "6-135", "6-106", "6-101", "6-110", "6-034", "6-105"], + stage: 5, + sprite: "jazarichmon", + id: "5-054", + url: "https://digimon.net/reference_en/detail.php?directory_name=jazarichmon", + }, + { + name_en: "JewelBeemon", + name_jp: "Jewelbeemon", + next_evolutions: ["6-003", "6-081", "6-020", "6-114", "6-061", "7-020"], + stage: 5, + sprite: "jewelbeemon", + id: "5-055", + url: "https://digimon.net/reference_en/detail.php?directory_name=jewelbeemon", + }, + { + name_en: "KendoGarurumon", + name_jp: "Garummon", + next_evolutions: ["6-083", "6-004", "6-008"], + stage: 5, + sprite: "kendogarurumon", + id: "5-056", + url: "https://digimon.net/reference_en/detail.php?directory_name=garummon", + }, + { + name_en: "Kimeramon", + name_jp: "Chimairamon", + next_evolutions: ["6-021", "6-088", "6-013", "6-055", "5-033", "6-138", "6-017", "6-139", "7-019", "7-045"], + stage: 5, + sprite: "kimeramon", + id: "5-057", + url: "https://digimon.net/reference_en/detail.php?directory_name=chimairamon", + }, + { + name_en: "Knightmon", + name_jp: "Knightmon", + next_evolutions: ["6-143", "6-141", "6-091", "6-036", "6-072", "6-077"], + stage: 5, + sprite: "knightmon", + id: "5-058", + url: "https://digimon.net/reference_en/detail.php?directory_name=knightmon", + }, + { + name_en: "LadyDevimon", + name_jp: "LadyDevimon", + next_evolutions: ["6-107", "6-037", "6-099", "7-029", "6-076"], + stage: 5, + sprite: "ladydevimon", + id: "5-059", + url: "https://digimon.net/reference_en/detail.php?directory_name=ladydevimon", + }, + { + name_en: "LadyDevimon X", + name_jp: "LadyDevimon X", + next_evolutions: ["6-102", "6-059", "6-124", "6-024"], + stage: 5, + sprite: "ladydevimon_x", + id: "5-060", + url: "https://digimon.net/reference_en/detail.php?directory_name=ladydevimon_x", + }, + { + name_en: "Lavogaritamon", + name_jp: "Lavogaritamon", + next_evolutions: ["6-142", "6-011"], + stage: 5, + sprite: "lavogaritamon", + id: "5-061", + url: "https://digimon.net/reference_en/detail.php?directory_name=lavogaritamon", + }, + { + name_en: "Lilamon", + name_jp: "Lilamon", + next_evolutions: ["6-010", "6-006", "6-120", "6-103", "6-078", "6-123"], + stage: 5, + sprite: "lilamon", + id: "5-062", + url: "https://digimon.net/reference_en/detail.php?directory_name=lilamon", + }, + { + name_en: "Lillymon", + name_jp: "Lilimon", + next_evolutions: ["6-123", "6-105", "6-114", "6-149"], + stage: 5, + sprite: "lillymon", + id: "5-063", + url: "https://digimon.net/reference_en/detail.php?directory_name=lilimon", + }, + { + name_en: "Lillymon X", + name_jp: "Lilimon X", + next_evolutions: ["6-114", "6-024", "6-140", "6-108"], + stage: 5, + sprite: "lillymon_x", + id: "5-064", + url: "https://digimon.net/reference_en/detail.php?directory_name=lilimon_x", + }, + { + name_en: "LoaderLeomon", + name_jp: "LoaderLeomon", + next_evolutions: ["6-009", "6-043", "6-055", "6-062", "6-065", "6-080"], + stage: 5, + sprite: "loaderleomon", + id: "5-065", + url: "https://digimon.net/reference_en/detail.php?directory_name=loaderleomon", + }, + { + name_en: "Locomon", + name_jp: "Locomon", + next_evolutions: ["6-062", "6-049", "6-065", "6-012", "6-080"], + stage: 5, + sprite: "locomon", + id: "5-066", + url: "https://digimon.net/reference_en/detail.php?directory_name=locomon", + }, + { + name_en: "Lucemon: Chaos Mode", + name_jp: "Lucemon: Falldown Mode", + next_evolutions: ["7-004", "6-144", "6-085", "6-114", "6-108", "6-023", "6-079"], + stage: 5, + sprite: "lucemon_chaos_mode", + id: "5-067", + url: "https://digimon.net/reference_en/detail.php?directory_name=rucemonfalldownmode", + }, + { + name_en: "MachGaogamon", + name_jp: "MachGaogamon", + next_evolutions: ["6-096", "6-081", "6-020", "6-011", "6-041"], + stage: 5, + sprite: "machgaogamon", + id: "5-068", + url: "https://digimon.net/reference_en/detail.php?directory_name=machgaogamon", + }, + { + name_en: "MagnaAngemon", + name_jp: "HolyAngemon", + next_evolutions: ["6-143", "6-091", "6-128", "6-057", "6-018", "6-084", "6-146"], + stage: 5, + sprite: "magnaangemon", + id: "5-069", + url: "https://digimon.net/reference_en/detail.php?directory_name=holyangemon", + }, + { + name_en: "Mamemon", + name_jp: "Mamemon", + next_evolutions: ["6-022", "5-033", "6-028", "6-143"], + stage: 5, + sprite: "mamemon", + id: "5-070", + url: "https://digimon.net/reference_en/detail.php?directory_name=mamemon", + }, + { + name_en: "Mamemon X", + name_jp: "Mamemon X", + next_evolutions: ["6-082", "6-043", "6-046", "6-070", "6-067", "6-093", "6-058", "6-034"], + stage: 5, + sprite: "mamemon_x", + id: "5-071", + url: "https://digimon.net/reference_en/detail.php?directory_name=mamemon_x", + }, + { + name_en: "Mametyramon", + name_jp: "Mametyramon", + next_evolutions: ["6-111", "6-027", "6-019", "6-122", "6-032", "6-094", "6-118", "6-124", "6-040", "6-051"], + stage: 5, + sprite: "mametyramon", + id: "5-072", + url: "https://digimon.net/reference_en/detail.php?directory_name=mametyramon", + }, + { + name_en: "Mammothmon", + name_jp: "Mammon", + next_evolutions: ["6-130", "6-013", "6-029", "6-007", "6-067"], + stage: 5, + sprite: "mammothmon", + id: "5-073", + url: "https://digimon.net/reference_en/detail.php?directory_name=mammon", + }, + { + name_en: "Mammothmon X", + name_jp: "Mammon X", + next_evolutions: ["6-059", "6-102", "6-056", "6-035", "6-131", "6-024", "6-124"], + stage: 5, + sprite: "mammothmon_x", + id: "5-074", + url: "https://digimon.net/reference_en/detail.php?directory_name=mammon_x", + }, + { + name_en: "Manticoremon", + name_jp: "Manticoremon", + next_evolutions: ["6-005", "6-052", "6-018", "6-031"], + stage: 5, + sprite: "manticoremon", + id: "5-075", + url: "https://digimon.net/reference_en/detail.php?directory_name=manticoremon", + }, + { + name_en: "MarineChimairamon", + name_jp: "MarinChimairamon", + next_evolutions: ["6-121", "6-086", "6-007", "6-109", "6-095", "6-056", "6-108", "6-146"], + stage: 5, + sprite: "marinechimairamon", + id: "5-076", + url: "https://digimon.net/reference_en/detail.php?directory_name=marinchimairamon", + }, + { + name_en: "MarineDevimon", + name_jp: "MarinDevimon", + next_evolutions: ["6-095", "6-112", "6-086", "6-008"], + stage: 5, + sprite: "marinedevimon", + id: "5-077", + url: "https://digimon.net/reference_en/detail.php?directory_name=marindevimon", + }, + { + name_en: "Maycrackmon", + name_jp: "Meicrackmon", + next_evolutions: ["6-119"], + stage: 5, + sprite: "maycrackmon", + id: "5-078", + url: "https://digimon.net/reference_en/detail.php?directory_name=meicrackmon", + }, + { + name_en: "Maycrackmon: Vicious Mode", + name_jp: "Meicrackmon: Vicious Mode", + next_evolutions: ["6-115"], + stage: 5, + sprite: "maycrackmon_vicious_mode", + id: "5-079", + url: "https://digimon.net/reference_en/detail.php?directory_name=meicrackmon_v", + }, + { + name_en: "Megadramon", + name_jp: "Megadramon", + next_evolutions: ["6-039", "6-001", "6-080", "6-068", "6-095"], + stage: 5, + sprite: "megadramon", + id: "5-080", + url: "https://digimon.net/reference_en/detail.php?directory_name=megadramon", + }, + { + name_en: "MegaKabuterimon (Red)", + name_jp: "AtlurKabuterimon", + next_evolutions: ["6-066", "6-123"], + stage: 5, + sprite: "megakabuterimon_red", + id: "5-081", + url: "https://digimon.net/reference_en/detail.php?directory_name=atlurkabuterimon", + }, + { + name_en: "MegaSeadramon", + name_jp: "MegaSeadramon", + next_evolutions: ["6-095", "6-086", "6-112", "6-109", "6-121"], + stage: 5, + sprite: "megaseadramon", + id: "5-082", + url: "https://digimon.net/reference_en/detail.php?directory_name=megaseadramon", + }, + { + name_en: "MegaSeadramon X", + name_jp: "MegaSeadramon X", + next_evolutions: ["6-056", "6-032", "6-131"], + stage: 5, + sprite: "megaseadramon_x", + id: "5-083", + url: "https://digimon.net/reference_en/detail.php?directory_name=megaseadramon_x", + }, + { + name_en: "Mephistomon X", + name_jp: "Mephismon X", + next_evolutions: ["6-035", "6-042", "6-124", "6-024"], + stage: 5, + sprite: "mephistomon_x", + id: "5-084", + url: "https://digimon.net/reference_en/detail.php?directory_name=mephismon_x", + }, + { + name_en: "Mermaimon", + name_jp: "Mermaimon", + next_evolutions: ["6-008", "6-001", "6-007", "6-075", "6-095", "6-109", "6-121"], + stage: 5, + sprite: "mermaimon", + id: "5-085", + url: "https://digimon.net/reference_en/detail.php?directory_name=mermaimon", + }, + { + name_en: "MetalGreymon", + name_jp: "MetalGreymon", + next_evolutions: ["6-143", "6-028", "6-080", "6-062", "6-065"], + stage: 5, + sprite: "metalgreymon_vaccine", + id: "5-086", + url: "https://digimon.net/reference_en/detail.php?directory_name=metalgreymon", + }, + { + name_en: "MetalGreymon (Vaccine)", + name_jp: "MetalGreymon (Vaccine)", + next_evolutions: ["6-143", "6-080", "6-028", "5-033"], + stage: 5, + sprite: "metalgreymon_vaccine", + id: "5-087", + url: "https://digimon.net/reference_en/detail.php?directory_name=metalgreymon-v", + }, + { + name_en: "MetalGreymon (Virus)", + name_jp: "MetalGreymon (Virus)", + next_evolutions: ["6-028", "6-051", "6-143"], + stage: 5, + sprite: "metalgreymon_virus", + id: "5-088", + url: "https://digimon.net/reference_en/detail.php?directory_name=metalgreymon-web", + }, + { + name_en: "MetalGreymon (Virus) X", + name_jp: "MetalGreymon (Virus) X", + next_evolutions: ["6-027", "6-138", "6-131", "6-111", "6-094", "6-032"], + stage: 5, + sprite: "metalgreymon_virus_x", + id: "5-089", + url: "https://digimon.net/reference_en/detail.php?directory_name=metalgreymon_vi_x", + }, + { + name_en: "MetalGreymon X", + name_jp: "MetalGreymon X", + next_evolutions: ["6-144", "7-021", "6-140", "6-108"], + stage: 5, + sprite: "metalgreymon_vaccine_x", + id: "5-090", + url: "https://digimon.net/reference_en/detail.php?directory_name=metalgreymon_va_x", + }, + { + name_en: "MetalMamemon", + name_jp: "MetalMamemon", + next_evolutions: ["6-038", "6-143", "6-091", "6-080", "6-065", "6-062"], + stage: 5, + sprite: "metalmamemon", + id: "5-091", + url: "https://digimon.net/reference_en/detail.php?directory_name=metalmamemon", + }, + { + name_en: "MetalPhantomon", + name_jp: "MetalFantomon", + next_evolutions: ["6-042", "6-032", "6-131", "6-094", "6-040"], + stage: 5, + sprite: "metalphantomon", + id: "5-092", + url: "https://digimon.net/reference_en/detail.php?directory_name=metalfantomon", + }, + { + name_en: "MetalTyrannomon", + name_jp: "MetalTyranomon", + next_evolutions: ["6-080", "6-064", "6-012", "6-062", "6-143", "6-028", "5-033", "7-045"], + stage: 5, + sprite: "metaltyrannomon", + id: "5-093", + url: "https://digimon.net/reference_en/detail.php?directory_name=metaltyranomon", + }, + { + name_en: "MetalTyrannomon X", + name_jp: "MetalTyranomon X", + next_evolutions: ["7-004", "6-144", "7-022", "6-085", "6-108", "6-089", "6-092", "7-009"], + stage: 5, + sprite: "metaltyrannomon_x", + id: "5-094", + url: "https://digimon.net/reference_en/detail.php?directory_name=metaltyranomon_x", + }, + { + name_en: "Monzaemon", + name_jp: "Monzaemon", + next_evolutions: ["6-073", "6-147"], + stage: 5, + sprite: "monzaemon", + id: "5-095", + url: "https://digimon.net/reference_en/detail.php?directory_name=monzaemon", + }, + { + name_en: "Monzaemon X", + name_jp: "Monzaemon X", + next_evolutions: ["6-034", "6-101", "6-082", "6-043", "6-110", "6-046"], + stage: 5, + sprite: "monzaemon_x", + id: "5-096", + url: "https://digimon.net/reference_en/detail.php?directory_name=monzaemon_x", + }, + { + name_en: "Mummymon", + name_jp: "Mummymon", + next_evolutions: ["5-033", "6-055", "6-016", "6-009", "6-042", "6-017", "7-020", "7-019"], + stage: 5, + sprite: "mummymon", + id: "5-097", + url: "https://digimon.net/reference_en/detail.php?directory_name=mummymon", + }, + { + name_en: "Myotismon", + name_jp: "Vamdemon", + next_evolutions: ["6-107", "6-029", "7-007", "6-099"], + stage: 5, + sprite: "myotismon", + id: "5-098", + url: "https://digimon.net/reference_en/detail.php?directory_name=vamdemon", + }, + { + name_en: "Myotismon X", + name_jp: "Vamdemon X", + next_evolutions: ["6-040", "6-035", "6-094", "6-111", "6-032"], + stage: 5, + sprite: "myotismon_x", + id: "5-099", + url: "https://digimon.net/reference_en/detail.php?directory_name=vamdemon_x", + }, + { + name_en: "NeoDevimon", + name_jp: "NeoDevimon", + next_evolutions: ["5-033", "6-055", "6-088", "6-028", "6-143"], + stage: 5, + sprite: "neodevimon", + id: "5-100", + url: "https://digimon.net/reference_en/detail.php?directory_name=neodevimon", + }, + { + name_en: "Okuwamon", + name_jp: "Okuwamon", + next_evolutions: ["6-061", "6-126", "6-090", "6-066", "6-135"], + stage: 5, + sprite: "okuwamon", + id: "5-101", + url: "https://digimon.net/reference_en/detail.php?directory_name=okuwamon", + }, + { + name_en: "Okuwamon X", + name_jp: "Okuwamon X", + next_evolutions: ["6-059", "6-124", "6-024", "6-131"], + stage: 5, + sprite: "okuwamon_x", + id: "5-102", + url: "https://digimon.net/reference_en/detail.php?directory_name=okuwamon_x", + }, + { + name_en: "OmniShoutmon X", + name_jp: "OmegaShoutmon X", + next_evolutions: ["6-116", "6-002", "6-043", "6-135", "6-046"], + stage: 5, + sprite: "omnishoutmon_x", + id: "5-103", + url: "https://digimon.net/reference_en/detail.php?directory_name=omegashoutmon_x", + }, + { + name_en: "Orochimon", + name_jp: "Orochimon", + next_evolutions: ["6-098", "6-020", "6-011", "6-038", "6-091", "6-090", "6-147"], + stage: 5, + sprite: "orochimon", + id: "5-104", + url: "https://digimon.net/reference_en/detail.php?directory_name=orochimon", + }, + { + name_en: "Paildramon", + name_jp: "Paildramon", + next_evolutions: [ + "7-019", + "6-013", + "6-055", + "6-009", + "6-062", + "6-065", + "6-064", + "7-020", + "6-061", + "6-137", + "6-084", + "6-128", + ], + stage: 5, + sprite: "paildramon", + id: "5-105", + url: "https://digimon.net/reference_en/detail.php?directory_name=paildramon", + }, + { + name_en: "Parrotmon", + name_jp: "Parrotmon", + next_evolutions: ["6-120", "6-006", "6-010", "6-098", "6-091", "6-038"], + stage: 5, + sprite: "parrotmon", + id: "5-106", + url: "https://digimon.net/reference_en/detail.php?directory_name=parrotmon", + }, + { + name_en: "Phantomon", + name_jp: "Fantomon", + next_evolutions: ["6-037", "6-099", "6-107"], + stage: 5, + sprite: "phantomon", + id: "5-107", + url: "https://digimon.net/reference_en/detail.php?directory_name=fantomon", + }, + { + name_en: "Piranimon", + name_jp: "Piranimon", + next_evolutions: ["6-075", "6-008", "6-121", "6-095", "6-109"], + stage: 5, + sprite: "piranimon", + id: "5-108", + url: "https://digimon.net/reference_en/detail.php?directory_name=piranimon", + }, + { + name_en: "Piximon", + name_jp: "Piccolomon", + next_evolutions: ["6-081", "6-126", "6-061", "6-031"], + stage: 5, + sprite: "piximon", + id: "5-109", + url: "https://digimon.net/reference_en/detail.php?directory_name=picklemon", + }, + { + name_en: "Pumpkinmon", + name_jp: "Pumpmon", + next_evolutions: ["6-099", "6-043", "6-116", "6-034", "6-029", "6-013", "6-107"], + stage: 5, + sprite: "pumpkinmon", + id: "5-110", + url: "https://digimon.net/reference_en/detail.php?directory_name=pumpmon", + }, + { + name_en: "RaijiLudomon", + name_jp: "RaijiLudomon", + next_evolutions: ["6-018", "6-004", "6-057", "6-052", "6-031"], + stage: 5, + sprite: "raijiludomon", + id: "5-111", + url: "https://digimon.net/reference_en/detail.php?directory_name=raijiludomon", + }, + { + name_en: "Rapidmon", + name_jp: "Rapidmon", + next_evolutions: ["6-087", "6-033"], + stage: 5, + sprite: "rapidmon", + id: "5-112", + url: "https://digimon.net/reference_en/detail.php?directory_name=rapidmon", + }, + { + name_en: "Rebellimon", + name_jp: "Rebellimon", + next_evolutions: ["6-064", "6-012", "6-062", "6-065", "6-080"], + stage: 5, + sprite: "rebellimon", + id: "5-113", + url: "https://digimon.net/reference_en/detail.php?directory_name=rebellimon", + }, + { + name_en: "Rhihimon", + name_jp: "Raihimon", + next_evolutions: ["6-009", "6-043", "6-055"], + stage: 5, + sprite: "rhihimon", + id: "5-114", + url: "https://digimon.net/reference_en/detail.php?directory_name=raihimon", + }, + { + name_en: "RizeGreymon", + name_jp: "RizeGreymon", + next_evolutions: ["6-129", "6-005", "6-018", "6-052", "6-074", "6-133"], + stage: 5, + sprite: "rizegreymon", + id: "5-115", + url: "https://digimon.net/reference_en/detail.php?directory_name=rizegreymon", + }, + { + name_en: "RizeGreymon X", + name_jp: "RizeGreymon X", + next_evolutions: ["6-058", "6-104", "6-082", "6-110", "6-051", "6-046"], + stage: 5, + sprite: "rizegreymon_x", + id: "5-116", + url: "https://digimon.net/reference_en/detail.php?directory_name=rizegreymon_x", + }, + { + name_en: "SaviorHuckmon", + name_jp: "SaviorHackmon", + next_evolutions: ["6-069", "6-030"], + stage: 5, + sprite: "saviorhuckmon", + id: "5-117", + url: "https://digimon.net/reference_en/detail.php?directory_name=saviorhuckmon", + }, + { + name_en: "Scorpiomon", + name_jp: "Anomalocarimon", + next_evolutions: [ + "6-109", + "6-095", + "6-143", + "6-028", + "5-033", + "6-003", + "6-081", + "6-096", + "6-098", + "6-009", + "6-146", + ], + stage: 5, + sprite: "scorpiomon", + id: "5-118", + url: "https://digimon.net/reference_en/detail.php?directory_name=anomalocarimon", + }, + { + name_en: "Scorpiomon X", + name_jp: "Anomalocarimon X", + next_evolutions: ["6-110", "6-051", "6-034", "6-043", "6-046", "6-056"], + stage: 5, + sprite: "scorpiomon_x", + id: "5-119", + url: "https://digimon.net/reference_en/detail.php?directory_name=anomalocarimon-x", + }, + { + name_en: "Shakkoumon", + name_jp: "Shakkoumon", + next_evolutions: ["6-132", "6-086", "6-007", "6-121", "6-018", "6-057", "6-052", "6-085", "6-146"], + stage: 5, + sprite: "shakkoumon", + id: "5-120", + url: "https://digimon.net/reference_en/detail.php?directory_name=shakkoumon", + }, + { + name_en: "ShogunGekomon", + name_jp: "TonosamaGekomon", + next_evolutions: ["6-090", "6-061"], + stage: 5, + sprite: "shogungekomon", + id: "5-121", + url: "https://digimon.net/reference_en/detail.php?directory_name=tonosamagekomon", + }, + { + name_en: "Shoutmon X5", + name_jp: "Shoutmon X5", + next_evolutions: ["6-004", "6-018", "6-057", "6-052"], + stage: 5, + sprite: "shoutmon_x5", + id: "5-122", + url: "https://digimon.net/reference_en/detail.php?directory_name=shoutmonx5", + }, + { + name_en: "Silphymon", + name_jp: "Silphymon", + next_evolutions: ["6-139", "6-003", "6-096", "6-010", "6-006", "6-145", "6-017", "6-081"], + stage: 5, + sprite: "silphymon", + id: "5-123", + url: "https://digimon.net/reference_en/detail.php?directory_name=silphymon", + }, + { + name_en: "Sirenmon", + name_jp: "Sirenmon", + next_evolutions: ["6-008", "6-086", "6-007", "6-121", "6-004", "6-083"], + stage: 5, + sprite: "sirenmon", + id: "5-124", + url: "https://digimon.net/reference_en/detail.php?directory_name=sirenmon", + }, + { + name_en: "SkullBaluchimon", + name_jp: "SkullBaluchimon", + next_evolutions: ["6-127", "6-140", "7-022", "6-108", "6-013", "6-063"], + stage: 5, + sprite: "skullbaluchimon", + id: "5-125", + url: "https://digimon.net/reference_en/detail.php?directory_name=skullbaluchimon", + }, + { + name_en: "SkullGreymon", + name_jp: "SkullGreymon", + next_evolutions: ["6-130", "6-051", "6-143"], + stage: 5, + sprite: "skullgreymon", + id: "5-126", + url: "https://digimon.net/reference_en/detail.php?directory_name=skullgreymon", + }, + { + name_en: "SkullMeramon", + name_jp: "DeathMeramon", + next_evolutions: ["6-029", "6-130"], + stage: 5, + sprite: "skullmeramon", + id: "5-127", + url: "https://digimon.net/reference_en/detail.php?directory_name=deathmeramon", + }, + { + name_en: "Stefilmon", + name_jp: "Stiffilmon", + next_evolutions: ["6-027", "6-059", "6-118", "6-019", "6-124", "6-040", "6-056", "6-117"], + stage: 5, + sprite: "stefilmon", + id: "5-128", + url: "https://digimon.net/reference_en/detail.php?directory_name=stiffilmon", + }, + { + name_en: "Tekkamon", + name_jp: "Tekkamon", + next_evolutions: [], + stage: 5, + sprite: "tekkamon", + id: "5-129", + url: "https://digimon.net/reference_en/detail.php?directory_name=tekkamon", + }, + { + name_en: "Toropiamon", + name_jp: "Toropiamon", + next_evolutions: ["6-006", "6-145", "6-010", "6-114", "6-146"], + stage: 5, + sprite: "toropiamon", + id: "5-130", + url: "https://digimon.net/reference_en/detail.php?directory_name=toropiamon", + }, + { + name_en: "Triceramon", + name_jp: "Triceramon", + next_evolutions: ["6-126", "6-066", "6-090", "6-042", "6-009"], + stage: 5, + sprite: "triceramon", + id: "5-131", + url: "https://digimon.net/reference_en/detail.php?directory_name=triceramon", + }, + { + name_en: "Triceramon X", + name_jp: "Triceramon X", + next_evolutions: ["6-138", "6-032", "6-111", "6-131", "6-094"], + stage: 5, + sprite: "triceramon_x", + id: "5-132", + url: "https://digimon.net/reference_en/detail.php?directory_name=triceramon_x", + }, + { + name_en: "Vademon", + name_jp: "Vademon", + next_evolutions: [], + stage: 5, + sprite: "vademon", + id: "5-133", + url: "https://digimon.net/reference_en/detail.php?directory_name=vademon", + }, + { + name_en: "Velgrmon", + name_jp: "Velgrmon", + next_evolutions: ["6-043", "6-055", "6-009"], + stage: 5, + sprite: "velgrmon", + id: "5-134", + url: "https://digimon.net/reference_en/detail.php?directory_name=velgrmon", + }, + { + name_en: "WarGrowlmon", + name_jp: "MegaloGrowmon", + next_evolutions: ["6-052", "6-004", "6-129", "6-088", "6-053"], + stage: 5, + sprite: "wargrowlmon", + id: "5-135", + url: "https://digimon.net/reference_en/detail.php?directory_name=megalogrowmon", + }, + { + name_en: "WarGrowlmon X", + name_jp: "MegaloGrowmon X", + next_evolutions: ["6-089", "7-009", "7-021", "6-085", "6-108"], + stage: 5, + sprite: "wargrowlmon_x", + id: "5-136", + url: "https://digimon.net/reference_en/detail.php?directory_name=megalogrowmon_x", + }, + { + name_en: "WaruMonzaemon", + name_jp: "WaruMonzaemon", + next_evolutions: ["6-141", "6-091", "6-013", "6-126"], + stage: 5, + sprite: "warumonzaemon", + id: "5-137", + url: "https://digimon.net/reference_en/detail.php?directory_name=warumonzaemon", + }, + { + name_en: "WaruSeadramon", + name_jp: "WaruSeadramon", + next_evolutions: ["6-075", "6-008", "6-121", "6-091", "6-038", "6-098", "6-056", "6-108"], + stage: 5, + sprite: "waruseadramon", + id: "5-138", + url: "https://digimon.net/reference_en/detail.php?directory_name=waruseadramon", + }, + { + name_en: "WereGarurumon", + name_jp: "WereGarurumon", + next_evolutions: ["6-013", "6-130", "6-099", "6-091", "6-038", "6-098"], + stage: 5, + sprite: "weregarurumon", + id: "5-139", + url: "https://digimon.net/reference_en/detail.php?directory_name=weregarrumon", + }, + { + name_en: "WereGarurumon X", + name_jp: "WereGarurumon X", + next_evolutions: ["6-092", "7-021", "6-140", "6-108"], + stage: 5, + sprite: "weregarurumon_x", + id: "5-140", + url: "https://digimon.net/reference_en/detail.php?directory_name=weregarurumon_x", + }, + { + name_en: "Whamon", + name_jp: "Whamon", + next_evolutions: ["6-086", "6-109", "6-112", "6-146"], + stage: 5, + sprite: "whamon", + id: "5-141", + url: "https://digimon.net/reference_en/detail.php?directory_name=whamon", + }, + { + name_en: "Wingdramon", + name_jp: "Wingdramon", + next_evolutions: ["6-133", "6-129"], + stage: 5, + sprite: "wingdramon", + id: "5-142", + url: "https://digimon.net/reference_en/detail.php?directory_name=wingdramon", + }, + { + name_en: "Zudomon", + name_jp: "Zudomon", + next_evolutions: ["6-086", "6-056", "6-146"], + stage: 5, + sprite: "zudomon", + id: "5-143", + url: "https://digimon.net/reference_en/detail.php?directory_name=zudomon", + }, + { + name_en: "Boutmon", + name_jp: "Boutmon", + next_evolutions: ["6-148"], + stage: 5, + sprite: "boutmon", + id: "5-144", + url: "https://digimon.net/reference_en/detail.php?directory_name=boutmon", + }, + { + name_en: "DarkSuperStarmon", + name_jp: "DarkSuperStarmon", + next_evolutions: ["6-011", "6-005", "6-048"], + stage: 5, + sprite: "darksuperstarmon", + id: "5-145", + url: "https://digimon.net/reference_en/detail.php?directory_name=darksuperstarmon", + }, + { + name_en: "Doruguremon", + name_jp: "DORUguremon", + next_evolutions: ["6-002", "6-150", "6-051", "6-082", "6-043"], + stage: 5, + sprite: "doruguremon", + id: "5-146", + url: "https://digimon.net/reference_en/detail.php?directory_name=doruguremon", + }, + { + name_en: "Pandamon", + name_jp: "Pandamon", + next_evolutions: ["6-091"], + stage: 5, + sprite: "pandamon", + id: "5-147", + url: "https://digimon.net/reference_en/detail.php?directory_name=pandamon", + }, + { + name_en: "SkullScorpiomon", + name_jp: "Scorpiomon", + next_evolutions: ["6-003", "6-050", "6-096", "6-098", "6-009"], + stage: 5, + sprite: "skullscorpiomon", + id: "5-148", + url: "https://digimon.net/reference_en/detail.php?directory_name=scorpiomon", + }, + { + name_en: "SuperStarmon", + name_jp: "SuperStarmon", + next_evolutions: ["6-048", "6-011", "6-005"], + stage: 5, + sprite: "superstarmon", + id: "5-149", + url: "https://digimon.net/reference_en/detail.php?directory_name=superstarmon", + }, + { + name_en: "Aegisdramon", + name_jp: "Aegisdramon", + next_evolutions: ["7-039"], + stage: 6, + sprite: "aegisdramon", + id: "6-001", + url: "https://digimon.net/reference_en/detail.php?directory_name=ageisdramon", + }, + { + name_en: "Alphamon", + name_jp: "Alphamon", + next_evolutions: ["7-001"], + stage: 6, + sprite: "alphamon", + id: "6-002", + url: "https://digimon.net/reference_en/detail.php?directory_name=alphamon", + }, + { + name_en: "AncientBeetlemon", + name_jp: "AncientBeatmon", + next_evolutions: [], + stage: 6, + sprite: "ancientbeetlemon", + id: "6-003", + url: "https://digimon.net/reference_en/detail.php?directory_name=ancientbeatmon", + }, + { + name_en: "AncientGarurumon", + name_jp: "AncientGarurumon", + next_evolutions: [], + stage: 6, + sprite: "ancientgarurumon", + id: "6-004", + url: "https://digimon.net/reference_en/detail.php?directory_name=ancientgarurumon", + }, + { + name_en: "AncientGreymon", + name_jp: "AncientGreymon", + next_evolutions: [], + stage: 6, + sprite: "ancientgreymon", + id: "6-005", + url: "https://digimon.net/reference_en/detail.php?directory_name=ancientgreymon", + }, + { + name_en: "AncientKazemon", + name_jp: "AncientIrismon", + next_evolutions: [], + stage: 6, + sprite: "ancientkazemon", + id: "6-006", + url: "https://digimon.net/reference_en/detail.php?directory_name=ancientirismon", + }, + { + name_en: "AncientMegatheriummon", + name_jp: "AncientMegatheriumon", + next_evolutions: [], + stage: 6, + sprite: "ancientmegatheriummon", + id: "6-007", + url: "https://digimon.net/reference_en/detail.php?directory_name=ancientmegatheriumon", + }, + { + name_en: "AncientMermaimon", + name_jp: "AncientMermaimon", + next_evolutions: [], + stage: 6, + sprite: "ancientmermaimon", + id: "6-008", + url: "https://digimon.net/reference_en/detail.php?directory_name=ancientmermaimon", + }, + { + name_en: "AncientSphinxmon", + name_jp: "AncientSphinxmon", + next_evolutions: [], + stage: 6, + sprite: "ancientsphinxmon", + id: "6-009", + url: "https://digimon.net/reference_en/detail.php?directory_name=ancientsphinkmon", + }, + { + name_en: "AncientTroymon", + name_jp: "AncientTroiamon", + next_evolutions: [], + stage: 6, + sprite: "ancienttroymon", + id: "6-010", + url: "https://digimon.net/reference_en/detail.php?directory_name=ancienttroiamon", + }, + { + name_en: "AncientVolcanomon", + name_jp: "AncientVolcamon", + next_evolutions: [], + stage: 6, + sprite: "ancientvolcanomon", + id: "6-011", + url: "https://digimon.net/reference_en/detail.php?directory_name=ancientvolcamon", + }, + { + name_en: "AncientWisemon", + name_jp: "AncientWisemon", + next_evolutions: [], + stage: 6, + sprite: "ancientwisemon", + id: "6-012", + url: "https://digimon.net/reference_en/detail.php?directory_name=ancientwisetmon", + }, + { + name_en: "Anubismon", + name_jp: "Anubimon", + next_evolutions: [], + stage: 6, + sprite: "anubismon", + id: "6-013", + url: "https://digimon.net/reference_en/detail.php?directory_name=anubimon", + }, + { + name_en: "Apocalymon", + name_jp: "Apoclymon", + next_evolutions: [], + stage: 6, + sprite: "apocalymon", + id: "6-014", + url: "https://digimon.net/reference_en/detail.php?directory_name=apoclymon", + }, + { + name_en: "Apollomon", + name_jp: "Apollomon", + next_evolutions: ["7-018"], + stage: 6, + sprite: "apollomon", + id: "6-015", + url: "https://digimon.net/reference_en/detail.php?directory_name=apollomon", + }, + { + name_en: "Argomon", + name_jp: "Algomon", + next_evolutions: [], + stage: 6, + sprite: "argomon_ultimate", + id: "6-016", + url: "https://digimon.net/reference_en/detail.php?directory_name=algomon", + }, + { + name_en: "Armageddemon", + name_jp: "Armagemon", + next_evolutions: [], + stage: 6, + sprite: "armageddemon", + id: "6-017", + url: "https://digimon.net/reference_en/detail.php?directory_name=armagemon", + }, + { + name_en: "Azulongmon", + name_jp: "Qinglongmon", + next_evolutions: ["6-050"], + stage: 6, + sprite: "azulongmon", + id: "6-018", + url: "https://digimon.net/reference_en/detail.php?directory_name=qinglongmon", + }, + { + name_en: "Bagramon", + name_jp: "Bagramon", + next_evolutions: ["7-011", "7-003"], + stage: 6, + sprite: "bagramon", + id: "6-019", + url: "https://digimon.net/reference_en/detail.php?directory_name=bagramon", + }, + { + name_en: "Baihumon", + name_jp: "Baihumon", + next_evolutions: ["6-050"], + stage: 6, + sprite: "baihumon", + id: "6-020", + url: "https://digimon.net/reference_en/detail.php?directory_name=baihumon", + }, + { + name_en: "BanchoLeomon", + name_jp: "BanchoLeomon", + next_evolutions: ["7-008"], + stage: 6, + sprite: "bancholeomon", + id: "6-021", + url: "https://digimon.net/reference_en/detail.php?directory_name=bancholeomon", + }, + { + name_en: "BanchoMamemon", + name_jp: "BanchoMamemon", + next_evolutions: [], + stage: 6, + sprite: "banchomamemon", + id: "6-022", + url: "https://digimon.net/reference_en/detail.php?directory_name=banchomamemon", + }, + { + name_en: "Barbamon", + name_jp: "Barbamon", + next_evolutions: [], + stage: 6, + sprite: "barbamon", + id: "6-023", + url: "https://digimon.net/reference_en/detail.php?directory_name=barbamon", + }, + { + name_en: "BeelStarmon X", + name_jp: "BeelStarmon X", + next_evolutions: ["7-012", "7-004"], + stage: 6, + sprite: "beelstarmon_x", + id: "6-024", + url: "https://digimon.net/reference_en/detail.php?directory_name=beelstarmon_x", + }, + { + name_en: "Beelzemon", + name_jp: "Beelzebumon", + next_evolutions: ["7-005"], + stage: 6, + sprite: "beelzemon", + id: "6-025", + url: "https://digimon.net/reference_en/detail.php?directory_name=beelzebumon", + }, + { + name_en: "Belphemon: Rage Mode", + name_jp: "Belphemon: Rage Mode", + next_evolutions: ["7-031"], + stage: 6, + sprite: "belphemon_rage_mode", + id: "6-026", + url: "https://digimon.net/reference_en/detail.php?directory_name=belphemonragemode", + }, + { + name_en: "BlackWarGreymon X", + name_jp: "BlackWarGreymon X", + next_evolutions: ["7-010", "7-038", "7-003"], + stage: 6, + sprite: "blackwargreymon_x", + id: "6-027", + url: "https://digimon.net/reference_en/detail.php?directory_name=blackwargreymon_x", + }, + { + name_en: "BlitzGreymon", + name_jp: "BlitzGreymon", + next_evolutions: ["7-033"], + stage: 6, + sprite: "blitzgreymon", + id: "6-028", + url: "https://digimon.net/reference_en/detail.php?directory_name=blitzgreymon", + }, + { + name_en: "Boltmon", + name_jp: "Boltmon", + next_evolutions: [], + stage: 6, + sprite: "boltmon", + id: "6-029", + url: "https://digimon.net/reference_en/detail.php?directory_name=boltmon", + }, + { + name_en: "Breakdramon", + name_jp: "Breakdramon", + next_evolutions: ["7-014"], + stage: 6, + sprite: "breakdramon", + id: "6-030", + url: "https://digimon.net/reference_en/detail.php?directory_name=breakdramon", + }, + { + name_en: "BryweLudramon", + name_jp: "BryweLudramon", + next_evolutions: ["7-037"], + stage: 6, + sprite: "bryweludramon", + id: "6-031", + url: "https://digimon.net/reference_en/detail.php?directory_name=bryweludramon", + }, + { + name_en: "Chaosdramon X", + name_jp: "Chaosdramon X", + next_evolutions: ["7-010", "7-012", "7-027"], + stage: 6, + sprite: "chaosdramon_x", + id: "6-032", + url: "https://digimon.net/reference_en/detail.php?directory_name=chaosdramon-x", + }, + { + name_en: "Cherubimon (Virtue)", + name_jp: "Cherubimon (Virtue)", + next_evolutions: [], + stage: 6, + sprite: "cherubimon_virtue", + id: "6-033", + url: "https://digimon.net/reference_en/detail.php?directory_name=cherubimon", + }, + { + name_en: "Cherubimon (Virtue) X", + name_jp: "Cherubimon (Virtue) X", + next_evolutions: ["7-040", "7-022"], + stage: 6, + sprite: "cherubimon_virtue_x", + id: "6-034", + url: "https://digimon.net/reference_en/detail.php?directory_name=cherubimon_x", + }, + { + name_en: "Cherubimon (Vice) X", + name_jp: "Cherubimon (Vice) X", + next_evolutions: ["7-006", "7-003"], + stage: 6, + sprite: "cherubimon_vice_x", + id: "6-035", + url: "https://digimon.net/reference_en/detail.php?directory_name=cherubimondark_x", + }, + { + name_en: "Craniamon", + name_jp: "Craniummon", + next_evolutions: [], + stage: 6, + sprite: "craniamon", + id: "6-036", + url: "https://digimon.net/reference_en/detail.php?directory_name=craniummon", + }, + { + name_en: "Creepymon", + name_jp: "Demon", + next_evolutions: ["7-031"], + stage: 6, + sprite: "creepymon", + id: "6-037", + url: "https://digimon.net/reference_en/detail.php?directory_name=demon", + }, + { + name_en: "CresGarurumon", + name_jp: "CresGarurumon", + next_evolutions: ["7-033"], + stage: 6, + sprite: "cresgarurumon", + id: "6-038", + url: "https://digimon.net/reference_en/detail.php?directory_name=cresgarurumon", + }, + { + name_en: "Darkdramon", + name_jp: "Darkdramon", + next_evolutions: ["7-008", "7-045"], + stage: 6, + sprite: "darkdramon", + id: "6-039", + url: "https://digimon.net/reference_en/detail.php?directory_name=darkdramon", + }, + { + name_en: "DarkKnightmon X", + name_jp: "DarkKnightmon X", + next_evolutions: ["7-027", "7-011", "7-003"], + stage: 6, + sprite: "darkknightmon_x", + id: "6-040", + url: "https://digimon.net/reference_en/detail.php?directory_name=darkknightmon_x", + }, + { + name_en: "Dianamon", + name_jp: "Dianamon", + next_evolutions: ["7-018"], + stage: 6, + sprite: "dianamon", + id: "6-041", + url: "https://digimon.net/reference_en/detail.php?directory_name=dianamon", + }, + { + name_en: "Dinorexmon", + name_jp: "Dinorexmon", + next_evolutions: ["7-024", "7-003"], + stage: 6, + sprite: "dinorexmon", + id: "6-042", + url: "https://digimon.net/reference_en/detail.php?directory_name=dinorexmon", + }, + { + name_en: "Dinotigermon", + name_jp: "Dinotigermon", + next_evolutions: ["7-026", "7-009", "7-021", "7-022"], + stage: 6, + sprite: "dinotigermon", + id: "6-043", + url: "https://digimon.net/reference_en/detail.php?directory_name=dinotigermon", + }, + { + name_en: "Durandamon", + name_jp: "Durandamon", + next_evolutions: ["7-037"], + stage: 6, + sprite: "durandamon", + id: "6-044", + url: "https://digimon.net/reference_en/detail.php?directory_name=durandamon", + }, + { + name_en: "Dynasmon", + name_jp: "Dynasmon", + next_evolutions: [], + stage: 6, + sprite: "dynasmon", + id: "6-045", + url: "https://digimon.net/reference_en/detail.php?directory_name=dynasmon", + }, + { + name_en: "Ebemon X", + name_jp: "Ebemon X", + next_evolutions: ["7-017", "7-026", "7-015", "7-021"], + stage: 6, + sprite: "ebemon_x", + id: "6-046", + url: "https://digimon.net/reference_en/detail.php?directory_name=ebemon_x", + }, + { + name_en: "Ebonwumon", + name_jp: "Xuanwumon", + next_evolutions: ["6-050"], + stage: 6, + sprite: "ebonwumon", + id: "6-047", + url: "https://digimon.net/reference_en/detail.php?directory_name=xuanwumon", + }, + { + name_en: "EmperorGreymon", + name_jp: "KaiserGreymon", + next_evolutions: ["6-134"], + stage: 6, + sprite: "emperorgreymon", + id: "6-048", + url: "https://digimon.net/reference_en/detail.php?directory_name=kaisergreymon", + }, + { + name_en: "Eosmon", + name_jp: "Eosmon", + next_evolutions: [], + stage: 6, + sprite: "eosmon_ultimate", + id: "6-049", + url: "https://digimon.net/reference_en/detail.php?directory_name=eosmon_lv6", + }, + { + name_en: "Fanglongmon", + name_jp: "Huanglongmon", + next_evolutions: [], + stage: 6, + sprite: "fanglongmon", + id: "6-050", + url: "https://digimon.net/reference_en/detail.php?directory_name=huanglongmon", + }, + { + name_en: "Gaiomon", + name_jp: "Gaioumon", + next_evolutions: ["7-001", "7-009", "7-021"], + stage: 6, + sprite: "gaiomon", + id: "6-051", + url: "https://digimon.net/reference_en/detail.php?directory_name=gaioumon", + }, + { + name_en: "Gallantmon", + name_jp: "Dukemon", + next_evolutions: [], + stage: 6, + sprite: "gallantmon", + id: "6-052", + url: "https://digimon.net/reference_en/detail.php?directory_name=dukemon", + }, + { + name_en: "Gallantmon X", + name_jp: "Dukemon X", + next_evolutions: [], + stage: 6, + sprite: "gallantmon_x", + id: "6-053", + url: "https://digimon.net/reference_en/detail.php?directory_name=dukemon_x", + }, + { + name_en: "Gankoomon", + name_jp: "Gankoomon", + next_evolutions: [], + stage: 6, + sprite: "gankoomon", + id: "6-054", + url: "https://digimon.net/reference_en/detail.php?directory_name=gankoomon", + }, + { + name_en: "Ghoulmon", + name_jp: "Deathmon", + next_evolutions: [], + stage: 6, + sprite: "ghoulmon", + id: "6-055", + url: "https://digimon.net/reference_en/detail.php?directory_name=deathmon", + }, + { + name_en: "GigaSeadramon", + name_jp: "GigaSeadramon", + next_evolutions: ["7-024", "7-003"], + stage: 6, + sprite: "gigaseadramon", + id: "6-056", + url: "https://digimon.net/reference_en/detail.php?directory_name=gigaseadramon", + }, + { + name_en: "Goldramon", + name_jp: "Goddramon", + next_evolutions: ["6-050"], + stage: 6, + sprite: "goldramon", + id: "6-057", + url: "https://digimon.net/reference_en/detail.php?directory_name=goddramon", + }, + { + name_en: "Goldramon X", + name_jp: "Goddramon X", + next_evolutions: ["7-015", "7-021"], + stage: 6, + sprite: "goldramon_x", + id: "6-058", + url: "https://digimon.net/reference_en/detail.php?directory_name=goddramon_x", + }, + { + name_en: "GrandisKuwagamon", + name_jp: "GrandisKuwagamon", + next_evolutions: ["7-024", "7-003"], + stage: 6, + sprite: "grandiskuwagamon", + id: "6-059", + url: "https://digimon.net/reference_en/detail.php?directory_name=grandiskuwagamon", + }, + { + name_en: "GranDracmon", + name_jp: "GrandDracumon", + next_evolutions: [], + stage: 6, + sprite: "grandracmon", + id: "6-060", + url: "https://digimon.net/reference_en/detail.php?directory_name=granddracumon", + }, + { + name_en: "GranKuwagamon", + name_jp: "GranKuwagamon", + next_evolutions: [], + stage: 6, + sprite: "grankuwagamon", + id: "6-061", + url: "https://digimon.net/reference_en/detail.php?directory_name=grankuwagamon", + }, + { + name_en: "GroundLocomon", + name_jp: "GrandLocomon", + next_evolutions: [], + stage: 6, + sprite: "groundlocomon", + id: "6-062", + url: "https://digimon.net/reference_en/detail.php?directory_name=grandlocomon", + }, + { + name_en: "Gryphonmon", + name_jp: "Griffomon", + next_evolutions: [], + stage: 6, + sprite: "gryphonmon", + id: "6-063", + url: "https://digimon.net/reference_en/detail.php?directory_name=griffomon", + }, + { + name_en: "Gundramon", + name_jp: "Gundramon", + next_evolutions: ["7-002"], + stage: 6, + sprite: "gundramon", + id: "6-064", + url: "https://digimon.net/reference_en/detail.php?directory_name=gundramon", + }, + { + name_en: "HeavyLeomon", + name_jp: "HeavyLeomon", + next_evolutions: [], + stage: 6, + sprite: "heavyleomon", + id: "6-065", + url: "https://digimon.net/reference_en/detail.php?directory_name=heavyleomon", + }, + { + name_en: "HerculesKabuterimon", + name_jp: "HerakleKabuterimon", + next_evolutions: [], + stage: 6, + sprite: "herculeskabuterimon", + id: "6-066", + url: "https://digimon.net/reference_en/detail.php?directory_name=heraklekabuterimon", + }, + { + name_en: "Hexeblaumon", + name_jp: "Hexeblaumon", + next_evolutions: ["7-017", "7-028", "7-009", "7-040", "7-023", "7-021"], + stage: 6, + sprite: "hexeblaumon", + id: "6-067", + url: "https://digimon.net/reference_en/detail.php?directory_name=hexeblaumon", + }, + { + name_en: "HiAndromon", + name_jp: "HiAndromon", + next_evolutions: ["7-045"], + stage: 6, + sprite: "hiandromon", + id: "6-068", + url: "https://digimon.net/reference_en/detail.php?directory_name=hiandromon", + }, + { + name_en: "Jesmon", + name_jp: "Jesmon", + next_evolutions: ["7-021"], + stage: 6, + sprite: "jesmon", + id: "6-069", + url: "https://digimon.net/reference_en/detail.php?directory_name=jesmon", + }, + { + name_en: "Justimon X", + name_jp: "Justimon X", + next_evolutions: ["7-017", "7-026"], + stage: 6, + sprite: "justimon_x", + id: "6-070", + url: "https://digimon.net/reference_en/detail.php?directory_name=justimon_x", + }, + { + name_en: "Justimon: Blitz Arm", + name_jp: "Justimon: Blitz Arm", + next_evolutions: [], + stage: 6, + sprite: "justimon_blitz_arm", + id: "6-071", + url: "https://digimon.net/reference_en/detail.php?directory_name=justimon_blitzarm", + }, + { + name_en: "Kentaurosmon", + name_jp: "Sleipmon", + next_evolutions: [], + stage: 6, + sprite: "kentaurosmon", + id: "6-072", + url: "https://digimon.net/reference_en/detail.php?directory_name=sleipmon", + }, + { + name_en: "KingEtemon", + name_jp: "KingEtemon", + next_evolutions: [], + stage: 6, + sprite: "kingetemon", + id: "6-073", + url: "https://digimon.net/reference_en/detail.php?directory_name=kingetemon", + }, + { + name_en: "Leopardmon", + name_jp: "Duftmon", + next_evolutions: [], + stage: 6, + sprite: "leopardmon", + id: "6-074", + url: "https://digimon.net/reference_en/detail.php?directory_name=duftmon", + }, + { + name_en: "Leviamon", + name_jp: "Leviamon", + next_evolutions: ["7-002"], + stage: 6, + sprite: "leviamon", + id: "6-075", + url: "https://digimon.net/reference_en/detail.php?directory_name=leviamon", + }, + { + name_en: "Lilithmon", + name_jp: "Lilithmon", + next_evolutions: [], + stage: 6, + sprite: "lilithmon", + id: "6-076", + url: "https://digimon.net/reference_en/detail.php?directory_name=lilithmon", + }, + { + name_en: "LordKnightmon", + name_jp: "LordKnightmon", + next_evolutions: [], + stage: 6, + sprite: "lordknightmon", + id: "6-077", + url: "https://digimon.net/reference_en/detail.php?directory_name=lordknightmon", + }, + { + name_en: "Lotosmon", + name_jp: "Lotusmon", + next_evolutions: ["7-036"], + stage: 6, + sprite: "lotosmon", + id: "6-078", + url: "https://digimon.net/reference_en/detail.php?directory_name=lotusmon", + }, + { + name_en: "Lucemon: Satan Mode", + name_jp: "Lucemon: Satan Mode", + next_evolutions: [], + stage: 6, + sprite: "lucemon_satan_mode", + id: "6-079", + url: "https://digimon.net/reference_en/detail.php?directory_name=lucemonsatanmode", + }, + { + name_en: "Machinedramon", + name_jp: "Mugendramon", + next_evolutions: ["7-039", "6-014", "7-045"], + stage: 6, + sprite: "machinedramon", + id: "6-080", + url: "https://digimon.net/reference_en/detail.php?directory_name=mugendramon", + }, + { + name_en: "Magnadramon", + name_jp: "Holydramon", + next_evolutions: ["6-050"], + stage: 6, + sprite: "magnadramon", + id: "6-081", + url: "https://digimon.net/reference_en/detail.php?directory_name=holydramon", + }, + { + name_en: "Magnadramon X", + name_jp: "Holydramon X", + next_evolutions: ["7-028", "7-026", "7-040", "7-022"], + stage: 6, + sprite: "magnadramon_x", + id: "6-082", + url: "https://digimon.net/reference_en/detail.php?directory_name=holydramon_x", + }, + { + name_en: "MagnaGarurumon", + name_jp: "MagnaGarurumon", + next_evolutions: ["6-134"], + stage: 6, + sprite: "magnagarurumon", + id: "6-083", + url: "https://digimon.net/reference_en/detail.php?directory_name=magnagarurumon", + }, + { + name_en: "Magnamon", + name_jp: "Magnamon", + next_evolutions: [], + stage: 6, + sprite: "magnamon", + id: "6-084", + url: "https://digimon.net/reference_en/detail.php?directory_name=magnamon", + }, + { + name_en: "MaloMyotismon", + name_jp: "BelialVamdemon", + next_evolutions: ["7-012"], + stage: 6, + sprite: "malomyotismon", + id: "6-085", + url: "https://digimon.net/reference_en/detail.php?directory_name=belialvamdemon", + }, + { + name_en: "MarineAngemon", + name_jp: "MarinAngemon", + next_evolutions: [], + stage: 6, + sprite: "marineangemon", + id: "6-086", + url: "https://digimon.net/reference_en/detail.php?directory_name=marinangemon", + }, + { + name_en: "MegaGargomon", + name_jp: "SaintGalgomon", + next_evolutions: [], + stage: 6, + sprite: "megagargomon", + id: "6-087", + url: "https://digimon.net/reference_en/detail.php?directory_name=saintgalgomon", + }, + { + name_en: "Megidramon", + name_jp: "Megidramon", + next_evolutions: ["7-002"], + stage: 6, + sprite: "megidramon", + id: "6-088", + url: "https://digimon.net/reference_en/detail.php?directory_name=megidramon", + }, + { + name_en: "Megidramon X", + name_jp: "Megidramon X", + next_evolutions: ["7-016"], + stage: 6, + sprite: "megidramon_x", + id: "6-089", + url: "https://digimon.net/reference_en/detail.php?directory_name=megidramon_x", + }, + { + name_en: "MetalEtemon", + name_jp: "MetalEtemon", + next_evolutions: [], + stage: 6, + sprite: "metaletemon", + id: "6-090", + url: "https://digimon.net/reference_en/detail.php?directory_name=metaletemon", + }, + { + name_en: "MetalGarurumon", + name_jp: "MetalGarurumon", + next_evolutions: ["7-032"], + stage: 6, + sprite: "metalgarurumon", + id: "6-091", + url: "https://digimon.net/reference_en/detail.php?directory_name=metalgarurumon", + }, + { + name_en: "MetalGarurumon X", + name_jp: "MetalGarurumon X", + next_evolutions: ["7-034"], + stage: 6, + sprite: "metalgarurumon_x", + id: "6-092", + url: "https://digimon.net/reference_en/detail.php?directory_name=metalgarurumon_x", + }, + { + name_en: "Metallicdramon", + name_jp: "Metallicdramon", + next_evolutions: ["7-028", "7-013", "7-009", "7-015", "7-040", "7-022"], + stage: 6, + sprite: "metallicdramon", + id: "6-093", + url: "https://digimon.net/reference_en/detail.php?directory_name=metallicdramon", + }, + { + name_en: "MetalPiranimon", + name_jp: "MetalPiranimon", + next_evolutions: ["7-025", "7-003", "7-006"], + stage: 6, + sprite: "metalpiranimon", + id: "6-094", + url: "https://digimon.net/reference_en/detail.php?directory_name=metalpiranimon", + }, + { + name_en: "MetalSeadramon", + name_jp: "MetalSeadramon", + next_evolutions: ["6-001", "6-014"], + stage: 6, + sprite: "metalseadramon", + id: "6-095", + url: "https://digimon.net/reference_en/detail.php?directory_name=metalseadramon", + }, + { + name_en: "MirageGaogamon", + name_jp: "MirageGaogamon", + next_evolutions: [], + stage: 6, + sprite: "miragegaogamon", + id: "6-096", + url: "https://digimon.net/reference_en/detail.php?directory_name=miragegaogamon", + }, + { + name_en: "Murmukusmon", + name_jp: "Murmukusmon", + next_evolutions: [], + stage: 6, + sprite: "murmukusmon", + id: "6-097", + url: "https://digimon.net/reference_en/detail.php?directory_name=murmukusmon", + }, + { + name_en: "Nidhoggmon", + name_jp: "Nidhoggmon", + next_evolutions: [], + stage: 6, + sprite: "nidhoggmon", + id: "6-098", + url: "https://digimon.net/reference_en/detail.php?directory_name=nidhoggmon", + }, + { + name_en: "NoblePumpkinmon", + name_jp: "NoblePumpmon", + next_evolutions: ["7-016", "7-026", "7-034", "7-023"], + stage: 6, + sprite: "noblepumpkinmon", + id: "6-099", + url: "https://digimon.net/reference_en/detail.php?directory_name=noblepumpmon", + }, + { + name_en: "Ophanimon", + name_jp: "Ofanimon", + next_evolutions: [], + stage: 6, + sprite: "ophanimon", + id: "6-100", + url: "https://digimon.net/reference_en/detail.php?directory_name=ofanimon", + }, + { + name_en: "Ophanimon X", + name_jp: "Ofanimon X", + next_evolutions: ["7-023", "7-022"], + stage: 6, + sprite: "ophanimon_x", + id: "6-101", + url: "https://digimon.net/reference_en/detail.php?directory_name=ofanimon_x", + }, + { + name_en: "Ophanimon: Falldown Mode X", + name_jp: "Ofanimon: Falldown Mode X", + next_evolutions: ["7-025", "7-003"], + stage: 6, + sprite: "ophanimon_falldown_mode_x", + id: "6-102", + url: "https://digimon.net/reference_en/detail.php?directory_name=ofanimonfdm_x", + }, + { + name_en: "Ornismon", + name_jp: "Ornismon", + next_evolutions: [], + stage: 6, + sprite: "ornismon", + id: "6-103", + url: "https://digimon.net/reference_en/detail.php?directory_name=ornismon", + }, + { + name_en: "Ouryumon", + name_jp: "Ouryumon", + next_evolutions: ["7-001", "7-021"], + stage: 6, + sprite: "ouryumon", + id: "6-104", + url: "https://digimon.net/reference_en/detail.php?directory_name=ouryumon", + }, + { + name_en: "Phoenixmon", + name_jp: "Hououmon", + next_evolutions: [], + stage: 6, + sprite: "phoenixmon", + id: "6-105", + url: "https://digimon.net/reference_en/detail.php?directory_name=hououmon", + }, + { + name_en: "Phoenixmon X", + name_jp: "Hououmon X", + next_evolutions: ["7-013", "7-026"], + stage: 6, + sprite: "phoenixmon_x", + id: "6-106", + url: "https://digimon.net/reference_en/detail.php?directory_name=hououmon_x", + }, + { + name_en: "Piedmon", + name_jp: "Piemon", + next_evolutions: ["7-007", "6-014"], + stage: 6, + sprite: "piedmon", + id: "6-107", + url: "https://digimon.net/reference_en/detail.php?directory_name=piemon", + }, + { + name_en: "PlatinumNumemon", + name_jp: "PlatinumNumemon", + next_evolutions: ["7-034"], + stage: 6, + sprite: "platinumnumemon", + id: "6-108", + url: "https://digimon.net/reference_en/detail.php?directory_name=platinumnumemon", + }, + { + name_en: "Plesiomon", + name_jp: "Plesiomon", + next_evolutions: ["6-001"], + stage: 6, + sprite: "plesiomon", + id: "6-109", + url: "https://digimon.net/reference_en/detail.php?directory_name=plesiomon", + }, + { + name_en: "Plesiomon X", + name_jp: "Plesiomon X", + next_evolutions: ["7-034", "7-022"], + stage: 6, + sprite: "plesiomon_x", + id: "6-110", + url: "https://digimon.net/reference_en/detail.php?directory_name=plesiomon_x", + }, + { + name_en: "PrinceMamemon X", + name_jp: "PrinceMamemon X", + next_evolutions: ["7-010", "7-012", "7-027"], + stage: 6, + sprite: "princemamemon_x", + id: "6-111", + url: "https://digimon.net/reference_en/detail.php?directory_name=princemamemon_x", + }, + { + name_en: "Pukumon", + name_jp: "Pukumon", + next_evolutions: [], + stage: 6, + sprite: "pukumon", + id: "6-112", + url: "https://digimon.net/reference_en/detail.php?directory_name=pukumon", + }, + { + name_en: "Puppetmon", + name_jp: "Pinochimon", + next_evolutions: ["6-014"], + stage: 6, + sprite: "puppetmon", + id: "6-113", + url: "https://digimon.net/reference_en/detail.php?directory_name=pinochimon", + }, + { + name_en: "Rafflesimon", + name_jp: "Rafflesimon", + next_evolutions: ["7-030", "7-026"], + stage: 6, + sprite: "rafflesimon", + id: "6-114", + url: "https://digimon.net/reference_en/detail.php?directory_name=rafflesimon", + }, + { + name_en: "Raguelmon", + name_jp: "Raguelmon", + next_evolutions: ["7-035"], + stage: 6, + sprite: "raguelmon", + id: "6-115", + url: "https://digimon.net/reference_en/detail.php?directory_name=raguelmon", + }, + { + name_en: "Rapidmon X", + name_jp: "Rapidmon X", + next_evolutions: ["7-028", "7-009"], + stage: 6, + sprite: "rapidmon_x", + id: "6-116", + url: "https://digimon.net/reference_en/detail.php?directory_name=rapidmon_x", + }, + { + name_en: "Rasenmon", + name_jp: "Rasenmon", + next_evolutions: [], + stage: 6, + sprite: "rasenmon", + id: "6-117", + url: "https://digimon.net/reference_en/detail.php?directory_name=rasenmon", + }, + { + name_en: "Rasenmon: Fury Mode", + name_jp: "Rasenmon: Fury Mode", + next_evolutions: ["7-038", "7-012"], + stage: 6, + sprite: "rasenmon_fury_mode", + id: "6-118", + url: "https://digimon.net/reference_en/detail.php?directory_name=rasenmon_f", + }, + { + name_en: "Rasielmon", + name_jp: "Rasielmon", + next_evolutions: [], + stage: 6, + sprite: "rasielmon", + id: "6-119", + url: "https://digimon.net/reference_en/detail.php?directory_name=rasielmon", + }, + { + name_en: "Ravemon", + name_jp: "Ravmon", + next_evolutions: [], + stage: 6, + sprite: "ravemon", + id: "6-120", + url: "https://digimon.net/reference_en/detail.php?directory_name=ravmon", + }, + { + name_en: "Regalecusmon", + name_jp: "Regalecusmon", + next_evolutions: [], + stage: 6, + sprite: "regalecusmon", + id: "6-121", + url: "https://digimon.net/reference_en/detail.php?directory_name=regalecusmon", + }, + { + name_en: "Rhihimon", + name_jp: "Raihimon", + next_evolutions: ["6-009", "7-004"], + stage: 6, + sprite: "rhihimon", + id: "6-122", + url: "https://digimon.net/reference_en/detail.php?directory_name=raihimon", + }, + { + name_en: "Rosemon", + name_jp: "Rosemon", + next_evolutions: ["7-036"], + stage: 6, + sprite: "rosemon", + id: "6-123", + url: "https://digimon.net/reference_en/detail.php?directory_name=rosemon", + }, + { + name_en: "Rosemon X", + name_jp: "Rosemon X", + next_evolutions: ["7-025", "7-003", "7-006"], + stage: 6, + sprite: "rosemon_x", + id: "6-124", + url: "https://digimon.net/reference_en/detail.php?directory_name=rosemon_x", + }, + { + name_en: "RustTyrannomon", + name_jp: "RustTyranomon", + next_evolutions: [], + stage: 6, + sprite: "rusttyrannomon", + id: "6-125", + url: "https://digimon.net/reference_en/detail.php?directory_name=rusttyranomon", + }, + { + name_en: "SaberLeomon", + name_jp: "SaberLeomon", + next_evolutions: [], + stage: 6, + sprite: "saberleomon", + id: "6-126", + url: "https://digimon.net/reference_en/detail.php?directory_name=saberleomon", + }, + { + name_en: "Sakuyamon X", + name_jp: "Sakuyamon X", + next_evolutions: ["7-016"], + stage: 6, + sprite: "sakuyamon_x", + id: "6-127", + url: "https://digimon.net/reference_en/detail.php?directory_name=sakuyamon_x", + }, + { + name_en: "Seraphimon", + name_jp: "Seraphimon", + next_evolutions: [], + stage: 6, + sprite: "seraphimon", + id: "6-128", + url: "https://digimon.net/reference_en/detail.php?directory_name=seraphimon", + }, + { + name_en: "ShineGreymon", + name_jp: "ShineGreymon", + next_evolutions: [], + stage: 6, + sprite: "shinegreymon", + id: "6-129", + url: "https://digimon.net/reference_en/detail.php?directory_name=shinegreymon", + }, + { + name_en: "SkullMammothmon", + name_jp: "SkullMammon", + next_evolutions: [], + stage: 6, + sprite: "skullmammothmon", + id: "6-130", + url: "https://digimon.net/reference_en/detail.php?directory_name=skullmammon", + }, + { + name_en: "SkullMammothmon X", + name_jp: "SkullMammon X", + next_evolutions: ["7-024", "7-003"], + stage: 6, + sprite: "skullmammothmon_x", + id: "6-131", + url: "https://digimon.net/reference_en/detail.php?directory_name=skullmammon_x", + }, + { + name_en: "SlashAngemon", + name_jp: "SlashAngemon", + next_evolutions: [], + stage: 6, + sprite: "slashangemon", + id: "6-132", + url: "https://digimon.net/reference_en/detail.php?directory_name=slashangemon", + }, + { + name_en: "Slayerdramon", + name_jp: "Slayerdramon", + next_evolutions: ["7-014"], + stage: 6, + sprite: "slayerdramon", + id: "6-133", + url: "https://digimon.net/reference_en/detail.php?directory_name=slayerdramon", + }, + { + name_en: "Susanomon", + name_jp: "Susanoomon", + next_evolutions: [], + stage: 6, + sprite: "susanomon", + id: "6-134", + url: "https://digimon.net/reference_en/detail.php?directory_name=susanoomon", + }, + { + name_en: "TigerVespamon", + name_jp: "TigerVespamon", + next_evolutions: ["7-016", "7-009"], + stage: 6, + sprite: "tigervespamon", + id: "6-135", + url: "https://digimon.net/reference_en/detail.php?directory_name=tigervespamon", + }, + { + name_en: "Titamon", + name_jp: "Titamon", + next_evolutions: [], + stage: 6, + sprite: "titamon", + id: "6-136", + url: "https://digimon.net/reference_en/detail.php?directory_name=titamon", + }, + { + name_en: "UlforceVeedramon", + name_jp: "UlforceV-dramon", + next_evolutions: [], + stage: 6, + sprite: "ulforceveedramon", + id: "6-137", + url: "https://digimon.net/reference_en/detail.php?directory_name=ulforcevdramon", + }, + { + name_en: "UltimateBrachiomon", + name_jp: "UltimateBrachiomon", + next_evolutions: ["7-024", "7-003"], + stage: 6, + sprite: "ultimatebrachiomon", + id: "6-138", + url: "https://digimon.net/reference_en/detail.php?directory_name=ultimatebrakimon", + }, + { + name_en: "Valkyrimon", + name_jp: "Valkyrimon", + next_evolutions: [], + stage: 6, + sprite: "valkyrimon", + id: "6-139", + url: "https://digimon.net/reference_en/detail.php?directory_name=valkyrimon", + }, + { + name_en: "Varodurumon", + name_jp: "Valdurmon", + next_evolutions: ["7-016"], + stage: 6, + sprite: "varodurumon", + id: "6-140", + url: "https://digimon.net/reference_en/detail.php?directory_name=valdurmon", + }, + { + name_en: "VenomMyotismon", + name_jp: "VenomVamdemon", + next_evolutions: [], + stage: 6, + sprite: "venommyotismon", + id: "6-141", + url: "https://digimon.net/reference_en/detail.php?directory_name=venomvamdemon", + }, + { + name_en: "Volcanicdramon", + name_jp: "Volcanicdramon", + next_evolutions: [], + stage: 6, + sprite: "volcanicdramon", + id: "6-142", + url: "https://digimon.net/reference_en/detail.php?directory_name=volcanicdramon", + }, + { + name_en: "WarGreymon", + name_jp: "WarGreymon", + next_evolutions: ["7-032"], + stage: 6, + sprite: "wargreymon", + id: "6-143", + url: "https://digimon.net/reference_en/detail.php?directory_name=wargreymon", + }, + { + name_en: "WarGreymon X", + name_jp: "WarGreymon X", + next_evolutions: ["7-034"], + stage: 6, + sprite: "wargreymon_x", + id: "6-144", + url: "https://digimon.net/reference_en/detail.php?directory_name=wargreymon_x", + }, + { + name_en: "Zhuqiaomon", + name_jp: "Zhuqiaomon", + next_evolutions: ["6-050"], + stage: 6, + sprite: "zhuqiaomon", + id: "6-145", + url: "https://digimon.net/reference_en/detail.php?directory_name=zhuqiaomon", + }, + { + name_en: "Vikemon", + name_jp: "Vikemon", + next_evolutions: [], + stage: 6, + sprite: "vikemon", + id: "6-146", + url: "https://digimon.net/reference_en/detail.php?directory_name=vikemon", + }, + { + name_en: "ShinMonzaemon", + name_jp: "ShinMonzaemon", + next_evolutions: [], + stage: 6, + sprite: "shinmonzaemon", + id: "6-147", + url: "https://digimon.net/reference_en/detail.php?directory_name=shinmonzaemon", + }, + { + name_en: "Kazuchimon", + name_jp: "Kazuchimon", + next_evolutions: [], + stage: 6, + sprite: "kazuchimon", + id: "6-148", + url: "https://digimon.net/reference_en/detail.php?directory_name=kazuchimon", + }, + { + name_en: "BanchoLillymon", + name_jp: "BanchoLilimon", + next_evolutions: [], + stage: 6, + sprite: "bancholillymon", + id: "6-149", + url: "https://digimon.net/reference_en/detail.php?directory_name=bancholilimon", + }, + { + name_en: "Dorugoramon", + name_jp: "DORUgoramon", + next_evolutions: [], + stage: 6, + sprite: "dorugoramon", + id: "6-150", + url: "https://digimon.net/reference_en/detail.php?directory_name=dorugoramon", + }, + { + name_en: "Alphamon: Ouryuken", + name_jp: "Alphamon: Ouryuken", + next_evolutions: [], + stage: 7, + sprite: "alphamon_ouryuken", + id: "7-001", + url: "https://digimon.net/reference_en/detail.php?directory_name=alphamon:ouryuken", + }, + { + name_en: "Armageddemon", + name_jp: "Armagemon", + next_evolutions: [], + stage: 7, + sprite: "armageddemon", + id: "7-002", + url: "https://digimon.net/reference_en/detail.php?directory_name=armagemon", + }, + { + name_en: "Barbamon X", + name_jp: "Barbamon X", + next_evolutions: [], + stage: 7, + sprite: "barbamon_x", + id: "7-003", + url: "https://digimon.net/reference_en/detail.php?directory_name=barbamon_x", + }, + { + name_en: "Beelzemon X", + name_jp: "Beelzebumon X", + next_evolutions: ["7-012"], + stage: 7, + sprite: "beelzemon_x", + id: "7-004", + url: "https://digimon.net/reference_en/detail.php?directory_name=beelzebumon_x", + }, + { + name_en: "Beelzemon: Blast Mode", + name_jp: "Beelzebumon: Blast Mode", + next_evolutions: [], + stage: 7, + sprite: "beelzemon_blast_mode", + id: "7-005", + url: "https://digimon.net/reference_en/detail.php?directory_name=beelzebumonblastmode", + }, + { + name_en: "Belphemon X", + name_jp: "Belphemon X", + next_evolutions: [], + stage: 7, + sprite: "belphemon_x", + id: "7-006", + url: "https://digimon.net/reference_en/detail.php?directory_name=belphemon_x", + }, + { + name_en: "Boltboutamon", + name_jp: "Voltobautamon", + next_evolutions: [], + stage: 7, + sprite: "boltboutamon", + id: "7-007", + url: "https://digimon.net/reference_en/detail.php?directory_name=voltobautamon", + }, + { + name_en: "Chaosmon", + name_jp: "Chaosmon", + next_evolutions: [], + stage: 7, + sprite: "chaosmon", + id: "7-008", + url: "https://digimon.net/reference_en/detail.php?directory_name=chaosmon", + }, + { + name_en: "Craniamon X", + name_jp: "Craniummon X", + next_evolutions: ["7-026", "6-002"], + stage: 7, + sprite: "craniamon_x", + id: "7-009", + url: "https://digimon.net/reference_en/detail.php?directory_name=craniummon_x", + }, + { + name_en: "Creepymon X", + name_jp: "Demon X", + next_evolutions: [], + stage: 7, + sprite: "creepymon_x", + id: "7-010", + url: "https://digimon.net/reference_en/detail.php?directory_name=demon_x", + }, + { + name_en: "DarknessBagramon", + name_jp: "DarknessBagramon", + next_evolutions: [], + stage: 7, + sprite: "darknessbagramon", + id: "7-011", + url: "https://digimon.net/reference_en/detail.php?directory_name=darknessbagramon", + }, + { + name_en: "Diaboromon X", + name_jp: "Diablomon X", + next_evolutions: ["7-044"], + stage: 7, + sprite: "diaboromon_x", + id: "7-012", + url: "https://digimon.net/reference_en/detail.php?directory_name=diablomon_x", + }, + { + name_en: "Dynasmon X", + name_jp: "Dynasmon X", + next_evolutions: [], + stage: 7, + sprite: "dynasmon_x", + id: "7-013", + url: "https://digimon.net/reference_en/detail.php?directory_name=dynasmon_x", + }, + { + name_en: "Examon", + name_jp: "Examon", + next_evolutions: [], + stage: 7, + sprite: "examon", + id: "7-014", + url: "https://digimon.net/reference_en/detail.php?directory_name=examon", + }, + { + name_en: "Examon X", + name_jp: "Examon X", + next_evolutions: [], + stage: 7, + sprite: "examon_x", + id: "7-015", + url: "https://digimon.net/reference_en/detail.php?directory_name=examon_x", + }, + { + name_en: "Gallantmon X", + name_jp: "Dukemon X", + next_evolutions: [], + stage: 7, + sprite: "gallantmon_x", + id: "7-016", + url: "https://digimon.net/reference_en/detail.php?directory_name=dukemon_x", + }, + { + name_en: "Gankoomon X", + name_jp: "Gankoomon X", + next_evolutions: ["7-043"], + stage: 7, + sprite: "gankoomon_x", + id: "7-017", + url: "https://digimon.net/reference_en/detail.php?directory_name=gankoomon_x", + }, + { + name_en: "GraceNovamon", + name_jp: "GraceNovamon", + next_evolutions: [], + stage: 7, + sprite: "gracenovamon", + id: "7-018", + url: "https://digimon.net/reference_en/detail.php?directory_name=gracenovamon", + }, + { + name_en: "Imperialdramon: Fighter Mode", + name_jp: "Imperialdramon: Fighter Mode", + next_evolutions: ["7-020"], + stage: 7, + sprite: "imperialdramon_fighter_mode", + id: "7-019", + url: "https://digimon.net/reference_en/detail.php?directory_name=imperialdramonfightermode", + }, + { + name_en: "Imperialdramon: Paladin Mode", + name_jp: "Imperialdramon: Paladin Mode", + next_evolutions: [], + stage: 7, + sprite: "imperialdramon_paladin_mode", + id: "7-020", + url: "https://digimon.net/reference_en/detail.php?directory_name=imperialdramonpaladinmode", + }, + { + name_en: "Jesmon X", + name_jp: "Jesmon X", + next_evolutions: ["6-002", "7-043"], + stage: 7, + sprite: "jesmon_x", + id: "7-021", + url: "https://digimon.net/reference_en/detail.php?directory_name=jesmon_x", + }, + { + name_en: "Kentaurosmon X", + name_jp: "Sleipmon X", + next_evolutions: ["7-030", "6-002"], + stage: 7, + sprite: "kentaurosmon_x", + id: "7-022", + url: "https://digimon.net/reference_en/detail.php?directory_name=sleipmon_x", + }, + { + name_en: "Leopardmon X", + name_jp: "Duftmon X", + next_evolutions: [], + stage: 7, + sprite: "leopardmon_x", + id: "7-023", + url: "https://digimon.net/reference_en/detail.php?directory_name=duftmon_x", + }, + { + name_en: "Leviamon X", + name_jp: "Leviamon X", + next_evolutions: [], + stage: 7, + sprite: "leviamon_x", + id: "7-024", + url: "https://digimon.net/reference_en/detail.php?directory_name=leviamon_x", + }, + { + name_en: "Lilithmon X", + name_jp: "Lilithmon X", + next_evolutions: [], + stage: 7, + sprite: "lilithmon_x", + id: "7-025", + url: "https://digimon.net/reference_en/detail.php?directory_name=lilithmon_x", + }, + { + name_en: "LordKnightmon X", + name_jp: "LordKnightmon X", + next_evolutions: [], + stage: 7, + sprite: "lordknightmon_x", + id: "7-026", + url: "https://digimon.net/reference_en/detail.php?directory_name=lordknightmon_x", + }, + { + name_en: "Lucemon X", + name_jp: "Lucemon X", + next_evolutions: [], + stage: 7, + sprite: "lucemon_x", + id: "7-027", + url: "https://digimon.net/reference_en/detail.php?directory_name=lucemon_x", + }, + { + name_en: "Magnamon X", + name_jp: "Magnamon X", + next_evolutions: [], + stage: 7, + sprite: "magnamon_x", + id: "7-028", + url: "https://digimon.net/reference_en/detail.php?directory_name=magnamon_x", + }, + { + name_en: "Mastemon", + name_jp: "Mastemon", + next_evolutions: [], + stage: 7, + sprite: "mastemon", + id: "7-029", + url: "https://digimon.net/reference_en/detail.php?directory_name=mastemon", + }, + { + name_en: "Minervamon X", + name_jp: "Minervamon X", + next_evolutions: [], + stage: 7, + sprite: "minervamon_x", + id: "7-030", + url: "https://digimon.net/reference_en/detail.php?directory_name=minervamon_x", + }, + { + name_en: "Ogudomon", + name_jp: "Ogudomon", + next_evolutions: [], + stage: 7, + sprite: "ogudomon", + id: "7-031", + url: "https://digimon.net/reference_en/detail.php?directory_name=ogudomon", + }, + { + name_en: "Omnimon", + name_jp: "Omegamon", + next_evolutions: ["7-020"], + stage: 7, + sprite: "omnimon", + id: "7-032", + url: "https://digimon.net/reference_en/detail.php?directory_name=omegamon", + }, + { + name_en: "Omnimon Alter-S", + name_jp: "Omegamon Alter-S", + next_evolutions: [], + stage: 7, + sprite: "omnimon_alter_s", + id: "7-033", + url: "https://digimon.net/reference_en/detail.php?directory_name=omegamon-alter-s", + }, + { + name_en: "Omnimon X", + name_jp: "Omegamon X", + next_evolutions: [], + stage: 7, + sprite: "omnimon_x", + id: "7-034", + url: "https://digimon.net/reference_en/detail.php?directory_name=omegamon-x", + }, + { + name_en: "Ordinemon", + name_jp: "Ordinemon", + next_evolutions: [], + stage: 7, + sprite: "ordinemon", + id: "7-035", + url: "https://digimon.net/reference_en/detail.php?directory_name=ordinemon", + }, + { + name_en: "Rafflesimon", + name_jp: "Rafflesimon", + next_evolutions: [], + stage: 7, + sprite: "rafflesimon", + id: "7-036", + url: "https://digimon.net/reference_en/detail.php?directory_name=rafflesimon", + }, + { + name_en: "RagnaLoardmon", + name_jp: "RagnaLordmon", + next_evolutions: [], + stage: 7, + sprite: "ragnaloardmon", + id: "7-037", + url: "https://digimon.net/reference_en/detail.php?directory_name=ragnaloardmon", + }, + { + name_en: "Rasenmon", + name_jp: "Rasenmon", + next_evolutions: [], + stage: 7, + sprite: "rasenmon", + id: "7-038", + url: "https://digimon.net/reference_en/detail.php?directory_name=rasenmon", + }, + { + name_en: "RustTyrannomon", + name_jp: "RustTyranomon", + next_evolutions: [], + stage: 7, + sprite: "rusttyrannomon", + id: "7-039", + url: "https://digimon.net/reference_en/detail.php?directory_name=rusttyranomon", + }, + { + name_en: "UlforceVeedramon X", + name_jp: "UlforceV-dramon X", + next_evolutions: [], + stage: 7, + sprite: "ulforceveedramon_x", + id: "7-040", + url: "https://digimon.net/reference_en/detail.php?directory_name=ulforcevdramon_x", + }, + { + name_en: "Agumon (Bond of Bravery)", + name_jp: "Agumon (Bond of Bravery)", + next_evolutions: [], + stage: 7, + sprite: "agumon_bond_of_bravery", + id: "7-041", + url: "https://digimon.net/reference_en/detail.php?directory_name=agumon_kizuna", + }, + { + name_en: "Gabumon (Bond of Friendship)", + name_jp: "Gabumon (Bond of Friendship)", + next_evolutions: [], + stage: 7, + sprite: "gabumon_bond_of_friendship", + id: "7-042", + url: "https://digimon.net/reference_en/detail.php?directory_name=gabumon_kizuna", + }, + { + name_en: "Jesmon GX", + name_jp: "Jesmon GX", + next_evolutions: [], + stage: 7, + sprite: "jesmon_gx", + id: "7-043", + url: "https://digimon.net/reference_en/detail.php?directory_name=jesmongx", + }, + { + name_en: "Ogudomon X", + name_jp: "Ogudomon X", + next_evolutions: [], + stage: 7, + sprite: "ogudomon_x", + id: "7-044", + url: "https://digimon.net/reference_en/detail.php?directory_name=ogudomon_x", + }, + { + name_en: "Chaosdramon", + name_jp: "Chaosdramon", + next_evolutions: [], + stage: 7, + sprite: "chaosdramon", + id: "7-045", + url: "https://digimon.net/reference_en/detail.php?directory_name=chaosdramon", + }, +] diff --git a/packages/vpet-core/src/data/monster-frame-catalog.ts b/packages/vpet-core/src/data/monster-frame-catalog.ts new file mode 100644 index 0000000..99685a2 --- /dev/null +++ b/packages/vpet-core/src/data/monster-frame-catalog.ts @@ -0,0 +1,63 @@ +export const MONSTER_FRAME_NAMES = Object.freeze([ + "angry", + "attack", + "eat_1", + "eat_2", + "happy", + "injured_1", + "injured_2", + "refuse", + "sleep_1", + "sleep_2", + "walk_1", + "walk_2", +] as const) + +export type MonsterFrameName = (typeof MONSTER_FRAME_NAMES)[number] + +export const STANDARD_ANIMATION_SEQUENCE = Object.freeze([ + "angry", + "attack", + "eat_1", + "eat_2", + "happy", + "injured_1", + "injured_2", + "sleep_1", + "sleep_2", + "walk_1", + "walk_2", +] as const) + +type SpriteFrames = Iterable +type CatalogFrames = Iterable + +export class MonsterFrame { + readonly content: string + + constructor(content: string) { + this.content = content + Object.freeze(this) + } +} + +export class MonsterFrameCatalog { + readonly #frames: Map> + + constructor(frames: CatalogFrames) { + this.#frames = new Map(Array.from(frames, ([sprite, spriteFrames]) => [sprite, new Map(spriteFrames)])) + Object.freeze(this) + } + + get(sprite: string, frameName: MonsterFrameName): MonsterFrame | undefined { + return this.#frames.get(sprite)?.get(frameName) + } +} + +export const MONSTER_FRAME_CATALOG = new MonsterFrameCatalog( + MONSTER_FRAME_DATA.map(([sprite, frames]) => [ + sprite, + frames.map(([frameName, content]) => [frameName, new MonsterFrame(content)]), + ]), +) +import { MONSTER_FRAME_DATA } from "./monster-frame-data.ts" diff --git a/packages/vpet-core/src/data/monster-frame-data.ts b/packages/vpet-core/src/data/monster-frame-data.ts new file mode 100644 index 0000000..9789317 --- /dev/null +++ b/packages/vpet-core/src/data/monster-frame-data.ts @@ -0,0 +1,651 @@ +// allow: SIZE_OK — generated static artwork data +import type { MonsterFrameName } from "./monster-frame-catalog.ts" + +export const MONSTER_FRAME_DATA: readonly [string, readonly [MonsterFrameName, string][]][] = [ + ["aegisdramon", [["angry", " ▄▄▄▄▄ \n ▄▄▄▄▀ ▀ ▀ ▀▄ \n ▀▄ ▄▀▀▀█▀▀▀█▄\n█▄ █▀▀█ ▀ █ ▄█\n█▀▀ ▄▀ █▀▀█▀▀█▀ \n █▀ ▄▀▀▄▄█▄▄█▄\n ▀▀██▄ █ █▄▀\n ▀▄▄▄██▀▀▀▀ "], ["attack", " ▄▄▄▄▄ \n ▄▄▄▄▀ ▀ ▀ ▀▄ \n ▄▀▄ ▄▄▄▀▀▀█▀▀█▄\n ██▄▀ ▄█ ▀ █ ▄█\n ▀▄▄ ▀▀ █▀▀█▀█▀ \n ▄█▄▄▄▄▄▀▀▄▄█▄█▄\n▀▄ ▄██▄ █▄▄▀\n ▀▀▀▄▄▄██▀▀▀▀ "], ["eat_1", " ▄▀█▀█▀▄ \n ▄▀▀▀▀ ▄▄▄▄▄▄█▄ \n▄ ▀▄▄▄█ ▄ █ ▀█\n██▄▀ ▄▀▄▄▄█▄▄▄█▀\n▀▄▄ ▀ ▀█▄ ▀▄ ▀▄ \n █▀▀▄▄▀ ▀▀█▀█▀█\n ▀█▀▀▀▄▄▄▄█▄▀▀ \n ▀▀▀▀▀ "], ["eat_2", " \n ▄▀█▀█▀▄ \n ▄▀▀▀▀ ▄▄▄▄▄▄█▄ \n▄ ▀▄▄▄█ ▄ █ ▀█\n██▄▀ ▄▀▄▄▄█▄▄▄█▀\n▀▄▄ ▀ ▀█▄ ▀▄ ▀▄ \n ▀▄▄▄▄▀ ▀▀█▀█▀█\n ▄████▄▄▄▄█▄▀▀ "], ["happy", " ▄▀█▀█▀▄ \n ▄▀▀▀▀ ▄▄▄▄▄▄█▄ \n▄ ▀▄▄▄█ ▄ █ ▀█\n██▄▀ ▄▀▄▄▄█▄▄▄█▀\n▀▄▄ ▀ █▀▀▄▀▄ ▀▄ \n ███ ▄▀▄ ▀█▀█▀█\n ▀▀███▄█▄▄█▄▀▀ \n ▀▄▄▄▄▄▀ "], ["injured_1", " ██ \n ▀ ▄▀█▀█▀▄ \n ▄▀▀▀▀ ▄▄▄▄▄▄█▄ \n▄ ▀▄▄▄█ ▄ █ ▀█\n██▄▀▄ ▀▄▄▄█▄▄▄█▀\n▀▄▄ ▀ █▄ ▀▄ ▀▄ \n ▀▄▄▄▄▀ ▀▀█▀█▀█\n █▄▄█▄▄▄▄█▄▀▀ "], ["injured_2", " ▀ ██\n ▀▄▄▄▄▄ ▄ \n ▄▄▄▄▀ ▀ ▀ ▀▄ \n ▀▄ ▄▀▀▀█▀▀▀█▄\n█▄ █▀▀█ ▀ █ ▄█\n█▀▀ ▄▄ █▀▀█▀▀█▀ \n █▀ ▄▀▀▀▀▄█▄▄█▄\n ▀████▄▄▄▄█▄█▄▀"], ["sleep_1", " \n ▄▄▄▄▄ \n ▄▄▄▄▀ ▀ ▀ ▀▄ \n ▀▄ ▄▀▀▀█▀▀▀█▄\n█▄ █▀▀█ ▀ █ ▄█\n█▀▀ ▄▄ █▀▀█▀▀█▀ \n █▀ ▄▀▀▄▄█▄▄█▄\n ▀███▄▄▄▄▄█▄█▄▀"], ["sleep_2", " \n ▄▀█▀█▀▄ \n ▄▀▀▀▀ ▄▄▄▄▄▄█▄ \n▄ ▀▄▄▄█ ▄ █ ▀█\n██▄▀ ▀▄▄▄█▄▄▄█▀\n▀▄▄ ▀▀ █▄ ▀▄ ▀▄ \n ▀▄▄▄▄▀ ▀▀█▀█▀█\n ▄███▄▄▄▄█▄▀▀ "], ["walk_1", " ▄▀█▀█▀▄ \n ▄▀▀▀▀ ▄▄▄▄▄▄█▄ \n▄ ▀▄▄▄█ ▄ █ ▀█\n██▄▀ ▄▀▄▄▄█▄▄▄█▀\n▀▄▄ ▀▀ █▄ ▀▄ ▀▄ \n ▀▄▄▄▄▀ ▀▀█▀█▀█\n ▄▀▀▀▄▄▄▄█▄▀▀ \n ▀▀▀▀▀ "], ["walk_2", " \n ▄▀█▀█▀▄ \n ▄▀▀▀▀ ▄▄▄▄▄▄█▄ \n▄ ▀▄▄▄█ ▄ █ ▀█\n██▄▀ ▄▀▄▄▄█▄▄▄█▀\n▀▄▄ ▀▀ █▄ ▀▄ ▀▄ \n ▀▄▄▄▄▀ ▀▀█▀█▀█\n ▄████▄▄▄▄█▄▀▀ "]]], + ["aeroveedramon", [["angry", " ▄▄▄▄▄▄▄▄▄▄▄\n█▀▄▄▀ ▄▄ ▀▄ ▄▄▀\n█▀ ▀▀ ████▄\n▀█▀▀▀▄ ████\n ▀█▀▀▀▄ ▀▄▀\n▄▀▀██▄█▀ ▄▀▀ █\n▀▄▄█ ▀ █▄▄▄██\n█▄█▄██▄▄▄█▄█▄█▄█"], ["attack", "█▀▄▄▄▀▀▀▀▀█▀▀▀▀█\n█▀ ▄█▀ █▄▀█▄\n██▀█▀█▄ ▀█▀▀█\n█ ██████▄ ▀ █\n ██▄█▄█▄▀ ▄▄██\n █▄▄▄▄▄▄▄▀ █ ▀█\n█▄█▀▄▀▀ ▄ ▀▄ \n█▄█▄▄██▀▀█▄█▄█▄█"], ["eat_1", "█▀▄▄▄▀▀▀▀▀█▀▀▀▀█\n█▀ ▄▀▄ █▄█▀ \n▀█████▄ ████▄\n █████ █ ▀\n ▄█▄▄▄▀ ▄ ▄█ █ \n ▀▄▄▄▄▄▀ █ ▄█▀█\n ▄█▀▄ █▀ ▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["eat_2", " ▄▄▄▄▄▄▄▄▄▄▄\n█▀▄▄▀ ▄ ▀▄ ▄▄▀\n█▀ ▀ ▀ ███▄ \n▀█▀▀▀ ████\n ▀▀█▀▀ ▄ ▀██\n▄▀▀██▄▄█▀ ▄▀▀ ▄█\n▀▄▄█ ▀▀ █▄▄▀▄▀\n█▄█▄██▄▄▄█▄█▄█▄█"], ["happy", "█▀▄▄▄▀▀▀▀▀█▀▀▀▀█\n█▀ ▄▀▄ █▄██ \n▀█████▄ ▀████\n▄▄█████ ▄▀▀▀▀█\n█▄█▄▄▀ █ ▄ █\n▀█▄▄▄▄▄▄▀ ▀▀█▀█\n ▄█▀▄▀▀ ▀▀▀▄ \n█▄█▄▄██▀▀▀█▄▄█▄█"], ["injured_1", " ▄▄▄▄▄▄▄▄▄▄▄\n█▀▄▄▀ ▀▄ ▄▄▀\n█▀ ▄▄ ███▄ \n▀█▀▀▀ ████\n ▀█▀▀▀▄ ▀██\n ▄▀██▄█▀ ▀▄ █▀\n █▄█ ▀ ▄█▄▄█ \n█▄█▄██▄▄▄█▄█▄█▄█"], ["injured_2", " \n▄▄ ▄▀▀▀▀▀█▀▀▀▀█\n█▄▀▀ ▄ █▄██ \n█▄▄▄▄ ▀▀ ▀███▄\n ▀▄▄▄▄▄ ▀███\n ▄▄█▄ ▄█ ▄ ▀▄\n█▄▄█▀█▀ ▄▄█▄▄▀\n█▄█▄█▄▄▄▄█▄█▄█▄█"], ["sleep_1", " \n ▄█▄▀▀▀▀▀█▀▀█▄█ \n▄██ █▀████\n██ ▄ ▀█████\n▀▄▀▄ ▀▀ █ ▀█\n▄▀█▀ ▄▄▀ ▄▄▄█▄ \n█▄▀█▀▀ █ ▀ ▀ █\n█▄▄▄█▄▄▄▄▄█▄▄▄██"], ["sleep_2", " ▄ ▄▄▄▄▄▄▄▄ ▄ \n ▄██▀ ▀▄▄███\n ██▀ █████\n █▀▄ ▄▄▀ ████\n ▀█▄█ ▄ █▀█\n▄█ █▄▄▄█▀ ▄█▄▄█▄\n█▄▀█ ▀▀ █ ▀ ▀ █\n█▄▄▄█▄▄▄▄▄█▄▄▄██"], ["walk_1", "▄▄ ▄▀▀▀▀█▀▀▀▀█ \n█▄▀▀ ██▀ █▄██▄ \n█▄▄▄▄▄ ▀█████\n ▀▄▄▄▄▄ ▀█▀██\n ▄▄█ ▄█ ▄█ █▄▀\n █ █▀██▀ █ ▄█▀█\n ▄█▀▄ █▀ ▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["walk_2", " ▄▄▄▄▄▄▄▄▄▄▄\n█▀▄▄▀ ▄▄▄ ▀▄ ▄▄▀\n█▀ ▀▀ ███▄ \n▀█▀▀▀▀ ████\n ▀▀█▀▀ ▄ ▄▀██\n▄▀▀██▄▄█▀ ▄▀▀ █\n▀▄▄█ ▀▀ █▄▄▄█▀\n█▄█▄██▄▄▄█▄█▄█▄█"]]], + ["agumon", [["angry", " \n ▄▀▀▀▀▀▄ \n ▄▄▀ ▄▀ █ \n █▄▄▄▄ █ \n █▄▄ ▀ ▄█▄ \n █▄▄▄█ ▄▄▄█\n ▄▄▀▄ ▄▀ ▀▄ \n █▄█▄▄█▀█▄█▄█▄█"], ["attack", " ▄▄▄▄▀▀▀▀▀▄ \n ▀▄▄▄ ▄█▀ █ \n █ ▀▀ █ \n ▄▀▀▀ █ \n ▀██▀▀ ▄ █ \n █▄█ █▄▄ █ \n ▄▄▀▀▄▄▄▄▀ █ \n █▄█▄▄█ █▄█▄█▄█"], ["eat_1", " ▄▄▄▄▀▀▀▀▀▄ \n ▀▄▄▄ ▀█▄ █ \n █ ▀▀▀ █ \n ▄▀▀▀ █ \n ▀██▀▀ ▄ █ \n █▄█ █▄▄ █ \n ▄▄▀▀▄▄▄▄▀ █ \n █▄█▄▄█ █▄█▄█▄█"], ["eat_2", " \n ▄▀▀▀▀▀▄ \n ▄▄▀▀ ▄▄ █ \n █▄▄▄ ▀ ▀ █ \n ▀▄▄▄▄▄▄ ▄▀ \n ▄▀█ ▄▀ ▀▄ \n █▄▀▄ ▀▄▀ ▀▄ \n █▄█▄▄█▀█▄█▄█▄█"], ["happy", " ▄▄▄▄▀▀▀▀▀▄ \n ▀▄▄▄ ▄▀▀▄ █ \n █ █ \n ▄▀▀▀ █ \n ▀██▀▀ ▄ █ \n █▄█ █▄▄ █ \n ▄▄▀▀▄▄▄▄▀ █ \n █▄█▄▄█ █▄█▄█▄█"], ["injured_1", " \n ▄▀▀▀▀▀▄ \n ▄▄▀▀ █ \n █▄▄▄ ▀▄▄ █ \n ▀▄▄▄▄▄ ▄▀ \n ▄▀█ ▄▀ ▀▄ \n █▄▀▄ ▀▄▀ ▀▄ \n █▄█▄▄█▀█▄█▄█▄█"], ["injured_2", " \n ▄▄▄▄▄ \n ▄█ ▀▄ \n ▄▀▀ ▄ ▀▄ \n ▀█▀▀ ▀▀ █ \n █▀█▀▀ ▄▀ ▀▄ \n █▄▀▄ ▀▄▀ ▀▄ \n █▄█▄▄█▀█▄█▄█▄█"], ["sleep_1", " \n ▄▄▄▄▄ \n ▄█ ▀▄ \n ▄▀▀ ▄▄▄ █ \n ▀█▀▀ █ \n ▀██▀▀ ▄ ▀▄ \n █▀▀▄█ █ ▄▀▀█ \n ▀▄▄▄█▄▄███▄▄█ "], ["sleep_2", " \n ▄▀▀▀▀▀▄ \n ▄▄▀▀ ▀▄ \n █▄▄▄ ▀▀▀ █ \n ▀▄▄▄▄▄ ▄▀ \n ▄█ ▄ ▀▄ \n █▀▀▄█ █ ▄▀▀█ \n ▀▄▄▄█▄▄███▄▄█ "], ["walk_1", " ▄▄▄▄▄ \n ▄█ ▄▄ ▀▄ \n ▄▀▀ ▄██ ▀▄ \n ▀█▀▀ █ \n ▀██▀▀ ▄ █ \n █▄█ █▄▄ █ \n ▄▄▀▀▄▄▄▄▀ █ \n █▄█▄▄█ █▄█▄█▄█"], ["walk_2", " \n ▄▀▀▀▀▀▄ \n ▄▄▀▀ ▀█▄ █ \n █▄▄▄ ▀▀▀ █ \n ▀▄▄▄▄▄▄ ▄▀ \n ▄▀█ ▄▀ ▀▄ \n █▄▀▄ ▀▄▀ ▀▄ \n █▄█▄▄█▀█▄█▄█▄█"]]], + ["agumon_black", [["angry", " \n ▄█████▄ \n ▄▄███▀▄████ \n █▀▀▀▀████████ \n ████▄█████▀▀▄ \n █▄▄▄███████▀▀▄█\n ▄▄█████████▄ \n █▄█▄██▀█▄█▄█▄█"], ["attack", " ▄▄▄▄█████▄ \n ██████▀ ▄███ \n ▀▄ ▀█▄▄█████ \n █▄▄▄████████ \n ▀██████▀██ \n █▄████ ▀▀██ \n ▄▄██████████ \n █▄█▄██ █▄█▄█▄█"], ["eat_1", " ▄▄▄▄█████▄ \n ██████▄ ▀███ \n ▀▄ ▀█▄▄▄████ \n █▄▄▄████████ \n ▀██████▀██ \n █▄████ ▀▀██ \n ▄▄██████████ \n █▄█▄██ █▄█▄█▄█"], ["eat_2", " \n ▄█████▄ \n ▄▄████▀▀███ \n █▀▀▀██▄██▄███ \n ▀██████████▀ \n ▄▀████▀▄██▄ \n ██████▄▄▄██▄ \n █▄█▄██▀█▄█▄█▄█"], ["happy", " ▄▄▄▄█████▄ \n ███████▀▄▄▀█ \n ▀▄ ███████ \n █▄▄▄████████ \n ▀██████▀██ \n █▄████ ▀▀██ \n ▄▄██████████ \n █▄█▄██ █▄█▄█▄█"], ["injured_1", " \n ▄█████▄ \n ▄▄█████████ \n █▀▀▀██▄▀▀████ \n ▀██████████▀ \n ▄▀████▀▄██▄ \n ██████▄▄▄██▄ \n █▄█▄██▀█▄█▄█▄█"], ["injured_2", " \n ▄▄▄▄▄ \n ▄███████▄ \n ▄█████▀█████▄ \n ▀▄▄▄███▄▄████ \n ▄▀████▀▄██▄ \n ██████▄▄▄██▄ \n █▄█▄██▀█▄█▄█▄█"], ["sleep_1", " \n ▄▄▄▄▄ \n ▄███████▄ \n ▄█████▀▀▀████ \n ▀▄▄▄█████████ \n ▀██████▀██▄ \n ██▄▀▄██ █▀▄▄█ \n ▀███▄██▄▄████ "], ["sleep_2", " \n ▄█████▄ \n ▄▄█████████▄ \n █▀▀▀██▄▄▄████ \n ▀██████████▀ \n ▄█████▀██▄ \n ██▄▀▄██ █▀▄▄█ \n ▀███▄██▄▄████ "], ["walk_1", " ▄▄▄▄▄ \n ▄██▀▀███▄ \n ▄█████▀ ███▄ \n ▀▄▄▄█████████ \n ▀██████▀██ \n █▄████ ▀▀██ \n ▄▄██████████ \n █▄█▄██ █▄█▄█▄█"], ["walk_2", " \n ▄█████▄ \n ▄▄███▄ ▀███ \n █▀▀▀██▄▄▄████ \n ▀██████████▀ \n ▄▀████▀▄██▄ \n ██████▄▄▄██▄ \n █▄█▄██▀█▄█▄█▄█"]]], + ["agumon_black_x", [["angry", " \n ▄██████▄ \n▄████████▀ ██ \n█████▀▀██████ \n▀▄▄▄▄███████ \n ▀▀████▀▀█▄█ ▄█\n █▄██ ▀▀█▄▄███\n █▄███████▄█▄█ "], ["attack", " ▄▄▄▄██████▄ \n█▀▀▀▀███▀ ███ \n █ ▄▄▀██████ \n █▄▄▄▄▄█████▄ \n ▀█▀█████▀▄ █ ▄█\n ▀▄█████▄█████\n ▄▄█████████▀ \n █▄████ ▀█▄█▄█ "], ["eat_1", " ▄▄▄▄██████▄ \n████████▀▄ ██ \n ▀▄ ▀█▄▄███ \n █▄▄▄▄█████ \n ▀████▀▀█▄█ ▄█\n █▄██ ▀▀█▄▄███\n ▄▄█████████▀ \n █▄████ ▀█▄█▄█ "], ["eat_2", " \n ▄██████▄ \n▄███████▀▄▀██ \n█████▀▀██████ \n▀▄▄▄▄███████ \n ▀▀████▀▀█▄█ ▄█\n █▄██ ▀▀█▄▄███\n █▄███████▄█▄█ "], ["happy", " ▄▄▄▄██████▄ \n████████▀▄▀██ \n ▀▄ ██████ \n █ ▄████▀▄ \n █▀██████▄█ █▄█\n ▀▄██████▄████\n ▄▄█████████▀ \n █▄████ ▀█▄█▄█ "], ["injured_1", " \n ▄██████▄ \n▄████████▀███ \n█████▀▀██▄▄██ \n▀▄▄▄▄███████ \n ▀▀█████▀█▄█ ▄█\n █▄██▀▄█▀▄▄███\n █▄███▄▄▄█▄█▄█ "], ["injured_2", " \n ▄▄▄▄▄▄ \n ▄▄▄████████▄ \n█████████ ▀██ \n█▀▀▀▀▄▄█████▀ \n ▀███████▀█▀▄ ▄█\n █▄██▀▄█▀▄▄███\n █▄███▄▄▄█▄█▄█ "], ["sleep_1", " \n ▄▄▄▄ \n ▄█ ████ \n█▀▄ █▀▄██ ████▄ \n█▀████████ █████\n█▀█▄▀███████▀███\n█▀██▄█▄▄▀███▄███\n██████▄▄▄█████▀ "], ["sleep_2", " \n ▄▄ \n ▄▄▄▀▀██ \n█▀▄ █▀▄██ ██▄ \n█▀███████ ▄████\n█▀█▄▀███████▀███\n█▀██▄█▄▄▀███▄███\n██████▄▄▄█████▀ "], ["walk_1", " ▄██████▄ \n▄███████▀▄ ██ \n█████▀▀█▄▄███ \n▀▄▄▄▄███████ \n ▀▀████▀▀█▄█ ▄█\n █▄██ ▀▀█▄▄███\n ▄▄█████████▀ \n █▄████ ▀█▄█▄█ "], ["walk_2", " ▄▄▄▄▄▄ \n ▄▄▄█████▀▀█▄ \n████████ ▀▄██ \n█▀▀▀▀▄▄█████▀ \n ▀█████████▀▄ ▄\n ▄▀██▀▄▄█▀▀▄██\n ████▄▄▄█████▀\n █▄████▀▀█▄█▄█ "]]], + ["agumon_bond_of_bravery", [["angry", " ▄▄ ▄▄▄▄ ▄▄ \n ▀█▀███▀██▄▀ ▄█ \n ▄███▄▄██ ▀▄██ \n ▀█▀▀▀▀██▄█▀▀ \n ▄▀█▀█▀▄▀▄ \n ▄▀█ ▄ ▄▀ █ \n █▄█ ▄ ▀▀▄█▀▄ \n █▄▄█▀ ▀█▄▄██ ██"], ["attack", " ██▄▄████▄▀█ ▄\n ▀▄██▀ ██▀▄ ██\n ██▀▀▀███ ▄██▀\n █ █▀██ \n█▀▀▀▀█▀▀▀ █▄ ▀▄▄\n▀▄▄█▄█ ▀ █ ▄█▀\n █▀ █▄ ▀█▀ \n █▄▄█ ▀▄▄▄█ "], ["eat_1", " ██▄▄████▄▀█ ▄ \n ▀▄█▀▄ ▄█▀▄ ██ \n ████████ ▄██▀ \n █ ▀█▀█▀ \n ▄█▀▀▀ █ █ \n █ █ ▀ █ █▄ \n █▀ █▄ ▀█ ▀▄▄\n █▄▄█ ▀▄▄▄█ ▀▀"], ["eat_2", " ▄▄ ▄▄▄▄ ▄▄ \n ▀█▀██▀███▄▀ ▄█ \n ▄██▄█▄██ ▀▄██ \n ▀█▀▀▀▀██▄█▀▀ \n ▄▀█▀█▀▄▀▄ \n ▄▀█ ▄ ▄▀ █ \n █▄█ ▄ ▀▀▄█▀▄ \n █▄▄█▀ ▀█▄▄██ ██"], ["happy", " ██▄▄████▄▀█ ▄ \n ▀▄█▀▄▀██▀▄ ██ \n ████████ ▄██▀ \n █ ▄█▀█▀ \n ▄█▀▀▀ █ █ \n █ █ ▀ █ █▄ \n █▀ █▄ ▀█ ▀▄▄\n █▄▄█ ▀▄▄▄█ ▀▀"], ["injured_1", " \n ▄▄ ▄▄▄▄ ▄▄ \n ▀█▀██▀███▄▀ ▄█ \n ▄███▄▄██ ▀▄██ \n ▀█▀▀▀▀██▄█▀▀ \n ▄▀█▀█▀ █ \n ▄██ ▄ ▄▀ █▄ \n █▄▄▄█▄██▄▄█ ▀██"], ["injured_2", " \n \n ██▄▄████▄▀█ ▄ \n ▀▄██ ▀██▀▄ ██ \n ████████ ▄██▀ \n ▀▄▄▄▄█▀█▀ \n ▄█▄▀ ▀▄▀ █▄ \n █▄▄▄██▄█▄▄█ ▀██"], ["sleep_1", " \n \n ██▄▄████▄▀█ ▄ \n ▀▄██▀▀██▀▄ ██ \n ████████ ▄██▀ \n █▄▄▄▄█▀█▀ \n ▄▀▀▄ ▄▄█▀▀▄ \n █▄▄█████▄▄█▀██"], ["sleep_2", " \n ▄▄ ▄▄▄▄ ▄▄ \n ▀█▀██████▄▀ ▄█ \n ▄███▄▄██ ▀▄██ \n ▀█▀▀▀▀██▄█▀▀ \n ▄▀█▀█▀▄▀▄ \n ▄▀▀▄ ▄▄█▀▀▄ \n █▄▄█████▄▄█▀██"], ["walk_1", " ██▄▄████▄▀█ ▄ \n ▀▄█▀▄ ▄█▀▄ ██ \n ████████ ▄██▀ \n ▀▄▄▄▄█▀█▀▀ \n █▄▀ ▀ █ █ \n █ █ ▀ █ █▄ \n █▀ █▄ ▀█ ▀▄▄\n █▄▄█ ▀▄▄▄█ ▀▀"], ["walk_2", " ▄▄ ▄▄▄▄ ▄▄ \n ▀█▀██▀▀▀█▄▀ ▄█ \n ▄██▄█▄██ ▀▄██ \n ▀█▀▀▀▀██▄█▀▀ \n ▄▀█▀█▀▄▀▄ \n ▄▀█ ▄ ▄▀ █ \n █▄█ ▄ ▀▀▄█▀▄ \n █▄▄█▀ ▀█▄▄██ ██"]]], + ["agumon_expert", [["angry", " ▄▄▄▄▄▄▄▄▄▄▄▄▄ \n ████████ █ \n▄▀▀▀ ▄█ █ ▀ \n█ ▀▀ █ \n █▀▀▀▀▀▄▄ ▄▄█▄ \n █▀█▀▀ ▄▀ ▄ █ \n ██▀▀▄▄█▄▀█▄▄▀▄\n █▄█▄▄█▀█▄█▄█▄█▀"], ["attack", " ▄▄▄██████████▄▄\n█▄▄▄▄▄ ▄█▀ █ █\n ▀█████ ▀▀ ▄█▄▄▀\n ▄██▄▄▀ ▀▄ █ \n █▄▄▄▄▄▄▄█▄▀ ▄▀ \n ▀▄█ ▄▀ ▀▄ \n ▄█▀▀▄▄█▄▀▀▀▄▀▄\n █▄█▄▄█ █▄█▄█▄█▀"], ["eat_1", " ▄▄▄▄███████▀▀█ \n█ ▀█▄ █ ▀ \n▀▀████▄ ▀▀▀ █ \n ▄▄███▀ █ \n █▄▄▄▄▄▀█▄▄█ \n █ ▄█ █ ▄ █▄ \n ▀██▀▀▄███▀▀▀▄▀▄\n █▄█▄▄█▀█▄█▄█▄█▀"], ["eat_2", " ▄▄▄▄▄▄▄▄▄▄▄▄▄ \n ████████ █ \n▄▀▀▀ ▄▀▄ █ \n█ ▄▄ █ \n █▀▀▀ ▄▄ ▄▄▀ \n ▀██▀▀ █▀ █▄ \n █▄▀▀▄ █▄▀▀▀▄▀▄\n █▄█▄▄█▀█▄█▄█▄█▀"], ["happy", " ▄▄▄██████████▄▄\n█ ▄▀█▀█ █\n▀▀█████ █ ▀\n ▄████▀ █▄▄ \n █▄▄▄▄▄▀▀▄▄▀ ▄ █\n █▄██ █ ██▀▀\n ▄█▀▀▄▄█▄▀▀▀▄▀▄\n █▄█▄▄█▀█▄█▄█▄█▀"], ["injured_1", " ▄▄▄▄▄▄▄▄▄▄▄▄▄ \n ████████ █ \n▄▀▀▀ ▄ █ ▀ \n█ ▀▀▀ █ \n █▀▀▀ ▄▄ ▄▄▀ \n ▀██▀▀ █▀ █▄ \n █▄▀▄ █▄▀▀▀▄▀▄\n █▄█▄▄█▀█▄█▄█▄█▀"], ["injured_2", " \n ▀▀████████▀▀█ \n ▄▄▄▀▀▀▀▀▀▀▀▄ █ \n█ ▀▄▄▄ █ \n▀▄▄▄▄ █ \n ▀▄▄▄▄▄▀█▄▀▀█▄ \n █▄▀▄ █▄▀▀▀▄▀▄\n █▄█▄▄█▀█▄█▄█▄█▀"], ["sleep_1", " \n ▄▄▀▀▀▄ \n█▀▄ █ █ █ \n█▀█▄▀▀▀█ ▀▄ ██\n█▀█▄▄▄ ▀▄ ▀ ██\n█▀ █ █ ▀ █ ██\n█▀▄█▄▄ ▀▀▀▄ ▀ ██\n▀█▄▄▀▀▀█▄▄█▀▀▀▄█"], ["sleep_2", " \n ▄▄▄ █▀▀▄ \n█▀▄ ▄▄█ █▄██ █ \n█▀█▀ █ ████ █▄\n█▀█▄▄▄▀▄ ▀▀ ██\n█▀ █ ▀█ █ ██\n█▀▄█▄▄▄ ▀▀▀▄▀ ██\n▀█▄▄▀▀▀▀█▄▄█▀███"], ["walk_1", " ▀▀████████▀▀█ \n ▄▄▄▀▀▀▀██▀▀▄ ▀ \n█ ▄██ █ \n▀▄▄▄▄▀▀ █ \n ▀▄▄▄▄▄▀█▄▄█ \n █ ▄█ █ ▄ █▄ \n ▀██▀▀▄███▀▀▀▄▀▄\n █▄█▄▄█▀█▄█▄█▄█▀"], ["walk_2", " ▄▄▄▄▄▄▄▄▄▄▄▄▄ \n ████████ █ \n▄▀▀▀ ▀█▄ █ \n█ ▄▄ ▀▀▀ █ \n █▀▀▀ ▄▄ ▄▄▀ \n ▀██▀▀ █▀ █▄ \n █▄▀▀▄ █▄▀▀▀▄▀▄\n █▄█▄▄█▀█▄█▄█▄█▀"]]], + ["agumon_x", [["angry", " ▄▄▄▄▄▄ \n ▄▄▄▀ ▄▀▄ \n█ ▄█▀ █ \n▀▄▄▄▄▄▄ █ \n ▀▄▄▄▄▄▄▀ ▀▀▀▀▄ \n █ █ ▀█▀ █ \n ▄█▀▄ ▄█ ▀▀▄ \n █▄█▄▄█▀▀█▄█▄█▄█"], ["attack", " ▄▄▄▄▀▀▀▀▀▀▄ \n█ ▄█▀ █ \n █▀█▀█▄ ▀▀ ▄▀▀▄ \n ▄█▄█▄█ ▀▄ █ \n ▀▄▄▄▄▄▄▄▄▀ ▄▀ \n ▄█ ▀▄ ▀▀█▀█\n █ ▀▄▄▄█ ▀▀█▀ \n █▄█▄▄▀ █▄█▄█▄█ "], ["eat_1", " ▄▄▄▄▀▀▀▀▀▀▄ \n█ ▀█▄ █ \n▀▀████▄ ▀▀▀ █ \n ▄▄████ ▄▀ \n ▀▄▄▄▄▄▄▀▄ ▀▄ \n █▄█ █▄▄▀▀▄▄▄\n ▄▄▀▀▄▄▄█ ▀▀█▄▀\n █▄█▄▄█ █▄█▄█▄█ "], ["eat_2", " ▄▄▄▄▄▄ \n ▄▄▄▀ ▄ ▀▄ \n█ ▀ ▀ █ \n▀▄▄▄▄▀ █ \n ▀▄▄▄▄▄▄▄ ▀▄ \n █ █ █ ▄▀ ▀█▀█\n ▄█▀▄ ▀█▄ ▀▀█ \n █▄█▄▄█▀▀█▄█▄█▄█"], ["happy", " ▄▄▄▄▀▀▀▀▀▀▄ \n█ ▄▀▄ █ \n ▀█████ █ \n ████▀ ▄█▀▀▄\n ▀▄▄▄▄▄▄█▀ ▄▄▀ \n ▀▄█ █ ▀▀▄▄▄\n ▄▄▀▀▄▄▄█ ▀▀█▄▀\n █▄█▄▄█ █▄█▄█▄█ "], ["injured_1", " ▄▄▄▄▄▄ \n ▄▄▄▀ ▀▄ \n█ ▀▄▄▄ █ \n▀▄▄▄▄ █ \n ▀▄▄▄▄▄▄▄ ▀▄ \n █ █ █ ▄█ ▀▄▄▄\n █▀▀▄ ▀▀▄▀▀▀█▄▀\n █▄█▄▄█▀█▄█▄█▄█ "], ["injured_2", " \n ▄▀▀▀▀▀▀▄ \n▄▀▀▀ ▄ █ \n█ ▀▀▀ █ \n █▀▀▀ ▄▀ \n █▀█▀▀█▀ ▄ ▀▄▄▄\n █▀▀▄ ▀▀█ ▀█▄▀\n █▄█▄▄█▀█▄█▄█▄█ "], ["sleep_1", " \n ▄▀▀▀▀▀▀▄ \n▄▀▀▀ ▄▄▄ █ \n█ ▄ █ \n ▀█▀▀▀▀▀ ▄▀ \n ▄█▀█▀▀█▀ ▄▄█ \n█▄▄▀█ ▀▄█▄█▄█▀█\n█▄▄▄▄█▄▄▄█▄▄▄█▀ "], ["sleep_2", " \n ▄▄▄▄▀▀▀▀▀▀▄ \n█▄▄▄▄ ▄▄▄ █ \n ▀████ █ \n ▄▀▀▀▀▀ ▄▀ \n ▄█▀█▀▀█▀ ▄▄█ \n█▄▄▀█ ▀▄█▄█▄█▀█\n█▄▄▄▄█▄▄▄█▄▄▄█▀ "], ["walk_1", " ▄▀▀▀▀▀▀▄ \n▄▀▀▀ ▀█▄ █ \n█ ▄▄ ▀▀▀ █ \n █▀▀▀ ▄▄ ▄▀ \n ▀██▀▀▀▄▄ ▀▄ \n █▄█ █▄▄ ▀▀▄▄▄\n ▄▄▀▀▄▄▄█ ▀▀█▄▀\n █▄█▄▄█ █▄█▄█▄█ "], ["walk_2", " ▄▄▄▄▄▄ \n ▄▄▄▀ ▄▄ ▀▄ \n█ ▄██ █ \n▀▄▄▄▄▀▀ █ \n ▀▄▄▄▄▄▄▄ ▀▄ \n █ █ █ ▄▀ ▀█▀█\n ▄█▀▄ ▀█▄ ▀▀█ \n █▄█▄▄█▀▀█▄█▄█▄█"]]], + ["agunimon", [["angry", " █▀▄ ▄▄▀▀█▀▄▄▄ \n ▀▄ ███▀█▀ █▄▄█ \n ███▄▄██▀ ▄▀ \n █▄▄▄ ██▄█▀█ \n ▄▀▀▀▄█▀▄ ▀█ \n ▄▀██▀██▀▀█▀ \n ▀▄█▄▄▄█▄▄█ \n █▄▄█ ▀█▄▄▄█ "], ["attack", " ▄▄ ▄▄▄▄ \n █ ▀▄██▄▄█ █▀▀▄ \n ▀▄██▀ █▄▄▀▀█▀ \n █▀▀▀▀██ ▄█▄ \n █▀ ▄██▀▀▄█ \n ▄██▀█▄█▄▄█ \n █▄█▀ ▀█ █▄ \n █▄▄█▀▀▀▀██▄▄█ "], ["eat_1", " ▄▄ ▄▄▄▄ \n █ ▀▄██▄▄█ █▀▀▄ \n ▀▄██▄▄█▄▄▀▀█▀ \n █▀▀▀▄ █ ▄█▄ \n █▀▀ ▄█▀▀▄█ \n ▄██▀█▄█▄▄█ \n █▄█▀ ▀█ █▄ \n █▄▄█▀▀▀▀██▄▄█ "], ["eat_2", " █▀▄ ▄▄▀▀█▀▄▄▄ \n ▀▄ ███▀█▀ █▄▄█ \n ███▄▄██▀ ▄▀ \n ▀▄▄▄ ██▄█▀█ \n ▄▀▀▄█▀▄ ▀█ \n ▄▀██▀██▀▀█▀ \n ▀▄█▄▄▄█▄▄█ \n █▄▄█ ▀█▄▄▄█ "], ["happy", " █▀▄ ▄▄▀▀█▀▄▄▄ \n ▀▄ ██▀██▀ █▄▄█ \n ██▄█▄██▀ ▄▀ \n ▀▄▄▄ ██▄█▀█ \n ▄▄▄▀▀▄█▀▄▄██▄ \n █ ███▀███▄ █ \n ▀███▄▄▄████▀ \n █▄▄█ ▀█▄▄▄█ "], ["injured_1", " \n ▄▄ ▄▄▄▄ \n █ ▀▄██▄▄█ █▀▀▄ \n ▀▄██▀▀█▄▄▀▀█▀ \n █▀▀▀▀██ ▄█▄ \n █▀ ▄█▀█▀▄█ \n ▄▀▀██▀██▄▄▀▀▄ \n █▄▄█▄▄▄███▄▄█ "], ["injured_2", " \n \n █▀▄ ▄▄▀▀█▀▄▄▄ \n ▀▄ █████▀ █▄▄█ \n ███▄▄██▀ ▄▀ \n ▀▄▄ █▀▄█▀█ \n ▄▀▀▄▄▀███▄▀▀▄ \n █▄▄█▄▄▄███▄▄█ "], ["refuse", " ▄▄ ▄▄▄▄ \n █ ▀▄██▄▄█ █▀▀▄ \n ▀▄██▀ █▄▄▀▀█▀ \n █▀▀▀▀▀█ ▄█▄ \n █▀▀▀▄█▀▀▄█ \n ▄██▀█▄█▄▄█ \n █▄█▀ ▀█ █▄ \n▄ █▄▄█▀▀▀▀██▄▄█ "], ["sleep_1", " \n █▀▄ ▄▄▀▀█▀▄▄▄ \n ▀▄ █████▀ █▄▄█ \n ███▄▄██▀ ▄▀ \n ▀▄▄ ██▄█▀█ \n ▀▄▄██▀▄ ▀█ \n ▄▀▀██ ██▀▀█▀ \n █▄▄█▄▄▄█▄▄██ "], ["sleep_2", " \n ▄▄ ▄▄▄▄ \n █ ▀▄██▄▄█ █▀▀▄ \n ▀▄██▀▀█▄▄▀▀█▀ \n █▀▀▀▀██ ▄█▄ \n █▀ ▄██▀▀▄█ \n ▄▀▀██▀█▄▀▀▄▀ \n █▄▄█▄▄▄█▄▄██ "], ["walk_1", " █▀▄ ▄▄▀▀█▀▄▄▄ \n ▀▄ ███▀█▀ █▄▄█ \n ███▄▄██▀ ▄▀ \n ▀▄▄ ██▄█▀█ \n ▀▄▄██▀▄ ▀█ \n ▄▀██ ██▀▀█▀ \n ▀▄█▄▄▄█▄▄█ \n █▄▄█ ▀█▄▄▄█ "], ["walk_2", " ▄▄ ▄▄▄▄ \n █ ▀▄██▄▄█ █▀▀▄ \n ▀▄██▀ █▄▄▀▀█▀ \n █▀▀▀▀██ ▄█▄ \n █▀ ▄██▀▀▄█ \n ▄██▀█▄█▄▄█ \n █▄█▀ ▀█ █▄ \n █▄▄█▀▀▀▀██▄▄█ "]]], + ["airdramon", [["angry", " ▄▄▄ ▄▄ \n ▄▀▀▀ ▄▀ █ █ \n ▄▄▀ ▄█ ▀█ █\n█▄▄▀▀▄ ▀ █\n ▀▄▄▄▄▄▀ ▀▄█ █\n ▄▀▄▀ ▄▀ █▄▀\n █▀▄ ▄ ▀▀▀ ▄▀\n ▀▄█▄█▄█▄▀ "], ["attack", " ▄▄▀▀▀▀▀█ ▄▀█\n▄▀▀▀ ▄█ ▀█▄▀ ▄▀\n▀█▀█▀▄▀ ▄▀ █ \n ▄ ▄ █ ▄ ▄ █\n █▀▀▀▀▀█ ▄▀█ █\n ▀▀██▀ █ ▄▀▄\n ▀▄▀▄ ▄ ▀▀▀ █\n ▀▄█▄█▄█▄▀ "], ["eat_1", " ▄▄▀▀▀▀▀█ ▄▀█\n▄▀▀▀ ▄▄ ▀█▄▀ ▄▀\n▀▀▀▀▀▄ ▀ ▄▀ █ \n █ ▄ ▄ █\n █▀▀▀▀▀█ ▄▀█ █\n ▀▀██▀ █ ▄▀▄\n ▀▄▀▄ ▄ ▀▀▀ █\n ▀▄█▄█▄█▄▀ "], ["eat_2", " ▄▄ \n ▄▄▄▀▀█ █ █ \n ▄▀ ▄ ▀▄▄▀ █\n▄▀▀ ▀ ▀ ▀ █\n▀█▀▀ ▄ ▄█ █\n ▀▀█▀█▀ █▀ ▀▄▀\n █▀▄ ▄ ▀▀▀▄▄ \n ▀▄█▄█▄█▄▄▄█"], ["happy", " ▄▄▀▀▀▀▀█ ▄▀█\n▄▀▀▀ ▄▀▄ ▀█▄▀ ▄▀\n▀▀▀▀▀▄▄ ▄▀ █ \n ▄▀ ▄ ▄ █\n █▀▀▀ ▄ ▄▀█ █\n ▀▀██▀ █ ▄▀▄\n ▀▄▀▄ ▄ ▀▀▀ █\n ▀▄█▄█▄█▄▀ "], ["injured_1", " ▄▄▄ \n ▄▀▀▀ ▄▀ \n ▄▄▀ ▄ ▀█ \n█▄▄▄ ▀▀ ▀ ▀▀▄ \n ▀▄▄▄▄▀ █ ▄ ▀▄ \n ▄▀▄▀ ▄▀▀▀▄ ▀▄\n █▀▄ ▀ ▀▀▀▄█▄█\n ▀▄█▄█▄█▄▄▄▄▀"], ["injured_2", " \n ▄▄▄▀▀█ \n ▄▀ ▀▄▄ \n▄▀▀ ▀▄▄ ▄▀▄▄ \n▀█▀▀ ▄ ▄ ▄▀ \n ▀█▀█ █▄█ █ \n █▄▀▄ ▀▀ ▀▄█▄ █\n ▀▄█▄█▄█▄▄▄▄▄██"], ["sleep_1", " \n ▄▄▄ ▄▄ \n ▄▀▀▀ ▄▀ █ █ \n ▄▄▀ ▄▄ ▀█ █\n█▄▄▄ ▀ █\n ▀▄▄▄▄▄▄ ▄▀▄▄█ █\n ▄█▀▄▀ ▀▀▀▀▄█▄▀\n ▀▄█▄█▄█▄█▄▄▄▄█"], ["sleep_2", " \n ▄▄▄▀▀█ ▄▄ \n ▄▀ ▀▄▄█ █ \n▄▀▀ ▀▀ █ █\n▀█▀▀ ▄ █\n ▀█▀█▀▀ ▀▄▀▄█ █\n █▄▀▄ ▀▀▀▀▄█▄▀\n ▀▄█▄█▄█▄█▄▄▄▄█"], ["walk_1", " ▄▄▄▀▀█ █▀▄ \n ▄▀▄▄▄ ▀▄▄▀ ▀▄\n▄▀▀ ▀ ▀ ▄▀ █\n▀█▀▀ ▄ ▄ ▄ █\n ▀▀▀█▀▄ ▄▀█ █\n █▄▀ █ ▄▀▄\n ▀▄▀▄ ▄ ▀▀▀ █\n ▀▄█▄█▄█▄▀ "], ["walk_2", " ▄▄▄ ▄▄ \n ▄▀▀▀ ▄▀ █ █ \n ▄▄▀▄▀█▀ ▀█ █\n█▄▄▄ ▀ █\n ▀▄▄▄▄▄▀ ▀▄█ █\n ▄▀▄▀ ▄▀ █▄▀\n █▀▄ ▄ ▀▀▀ ▄▀\n ▀▄█▄█▄█▄▀ "]]], + ["aldamon", [["angry", " █▄ ▄▄▀▀█▀▄▄▄ \n █ ███▀█▀ █▄▄█ \n ███▄▄██▀▄▄▀ \n ▀▄▄▄ ██▄▄█▄█ \n ▄▀▀▄█▀█▀▀▄▀ \n ▄▀███▄██▀▀ █ \n ▀▄█▄▄█▄█▄▄▀ \n █▄▄█▀ ▀█▄▄█ "], ["attack", " ▄ ▄▄▄▄ \n █▀▄██▄▄█ █▀▀▄ \n ▀▄██▀ █▄▄▀▀█▀ \n █▀▀▀▀██ ▀█ ▄ \n ▀█▀ ▄█████▀█ \n ▄█▀█▀▄█▄▄▀▄ \n █ █▀▀█▀█ ▄▀ \n █▄██▀▀▀▀▀██▄█ "], ["eat_1", " ▄ ▄▄▄▄ \n █▀▄██▄▄█ █▀▀▄ \n ▀▄██▀▄▀█▄▀▀█▀ \n █▀▀▀▀██ ▀█ ▄ \n ▀█▀ ▄█████▀█ \n ▄█▀█▀▄█▄▄▀▄ \n █ █▀▀█▀█ ▄▀ \n █▄██▀▀▀▀▀██▄█ "], ["eat_2", " █▄ ▄▄▀▀█▀▄▄▄ \n █ ███▀█▀ █▄▄█ \n ███▄▄██▀▄▄▀ \n ▀▄▄▄ ██▄▄█▄█ \n ▄▀▀▄█▀█▀▀▄▀ \n ▄▀███▄██▀▀ █ \n ▀▄█▄▄█▄█▄▄▀ \n █▄▄█▀ ▀█▄▄█ "], ["happy", " █▄ ▄▄▀▀█▀▄▄▄ \n █ ███▀██ █▄▄█ \n ███▄█▄█▀▄▄▀ \n ▀▄▄▄ ██▄▄█▄█ \n ▄▀▀▄█▀█▀▀▄▀ \n ▄▀███▄██▀▀ █ \n ▀▄█▄▄█▄█▄▄▀ \n █▄▄█▀ ▀█▄▄█ "], ["injured_1", " \n ▄ ▄▄▄▄ \n █▀▄██▄▄█ █▀▀▄ \n ▀▄██▀▀██▄▀▀█▀ \n █▀▀▀▀██ ▀█ ▄ \n ▀█▀ ▄███▀▀██ \n ▄▀▀███▀▄██▀▀▄ \n █▄▄█▄██▄██▄▄█ "], ["injured_2", " \n \n █▄ ▄▄▀▀█▀▄▄▄ \n █ ██████ █▄▄█ \n ███▄▄██▀▄▄▀ \n ▀▄▄ ██▄▄█▄█ \n ▄▀▀▄▄█▀▄█▄▀▀▄ \n █▄▄█▄██▄██▄▄█ "], ["refuse", " ▄ ▄▄▄▄ \n █▀▄██▄▄█ █▀▀▄ \n ▀▄██▀ █▄▄▀▀█▀ \n █▀▀▀▀██ ▀█ ▄ \n ▄▀▀▀▄█████▀█ \n ██▀█▀▄█▄▄█▄ \n █ █▀▀█▀█ ▄▀ \n █▄██▀▀▀▀▀██▄█ "], ["sleep_1", " \n █▄ ▄▄▀▀█▀▄▄▄ \n █ ██████ █▄▄█ \n ███▄▄██▀▄▄▀ \n █▄▄ ██▄▄█▄█ \n ▀▄▄██▀█▀▀▄▀ \n ▄▀█▄█▄███▀ █ \n ██▄█▄▄█▄▄█▄▄█ "], ["sleep_2", " \n ▄ ▄▄▄▄ \n █▀▄██▄▄█ █▀▀▄ \n ▀▄██▀▀██▄▀▀█▀ \n █▀▀▀▀██ ▀█ ▄ \n ▀█▀ ▄███▀▀██ \n ▄▀███▀▄██▀ █ \n ██▄█▄██▄██▄▄█ "], ["walk_1", " █▄ ▄▄▀▀█▀▄▄▄ \n █ ███▀█▀ █▄▄█ \n ███▄▄██▀▄▄▀ \n █▄▄ ██▄▄█▄█ \n ▀▄▄██▀█▀▀▄▀ \n ▄▀█▄█▄██▀▀ █ \n ▀▄█▄▄█▄█▄▄▀ \n █▄▄█▀ ▀█▄▄█ "], ["walk_2", " ▄ ▄▄▄▄ \n █▀▄██▄▄█ █▀▀▄ \n ▀▄██▀ █▄▄▀▀█▀ \n █▀▀▀▀██ ▀█ ▄ \n ▀█▀ ▄█████▀█ \n ▄█▀█▀▄█▄▄▀▄ \n █ █▀▀█▀█ ▄▀ \n █▄██▀▀▀▀▀██▄█ "]]], + ["allomon_x", [["angry", " ▄▄▄ ▄▄▄ \n ▄█▄ ▀▀ █▄▄▀██▄\n█ ▀ ▄█ ██▄▀ █\n▀▄▄▄▄▄▄▄ ▄█▄▀█ \n █▄█▄█▄█▀▀▀ █ \n ▀▄▄▄▄█ ▄▀█▀█\n ▄█▀▄ ▀▀█ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["attack", " █▀▀▄▄▀▀█ ▄▄▄ \n▄▀█▀ ▄ ▀█ █▀█\n█▄▄▄▄▄▄▀▀ █▀▄▄▀\n █▄█▄█▄█▄ ██▀▄▀ \n ▄█▀█▀█▀█ █ ▀▄ \n█ █▀▀▀▀▀▀▄█ ▄▀█\n ██▀█▀▀▀▀ █▀▀▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["eat_1", " █▀▀▄▄▀▀█ ▄▄▄ \n▄▀█▀ ▄ ▀█ █▀█\n█ ▀ ▀ █▀▄▄▀\n ▀█████▄ ▄██▀▄▀ \n ███▄▄▀▄▀▀ ▀█ \n █▀▄▄▄▄█ █ █▀█\n ▄█▀▄ ▀▀█ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["eat_2", " ▄▄▄ ▄▄▄ \n ▄█▄ ▀▀ █▄▄▀██▄\n█ ▀ ▄▀▄ ██▄▀ █\n▀▄▄▄▄▄ ▄█▄▀█ \n █▄▄▄▄▄█▀▀▀ █ \n █ █▀▀▀█ ▄▀█▀█\n ▄█▀▄ ▀▀█ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["happy", " █▀▀▄▄▀▀█ ▄▄▄ \n▄▀█▀ ▄ ▀█ █▀█\n█ ▀ ▀ █▀▄▄▀\n ▀██████ ▄██▀▄▀ \n █████ █▀ ▀█ \n▄▀█▀▀▀▀ █ ▄█▀█\n▀▄█▀█▀▀▀▀▀█▀ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["injured_1", " \n \n █▀▀▄▄▀▀█ ▄▄▄ \n▄▀█▀ ▄ ▀██ █▀█\n█ ▀▀ ▀█▀▄▄▀\n ▀█▀▀▀ ▄▄██▀▄▀█\n▄▀▀████▀▀▀ ▄█▀▀█\n█▄▄█▄▄█▄▄▄██▄▄▄█"], ["injured_2", " \n \n ▄▄▄ ▄▄▄ \n ▄█▄ ▀▀ █▄▄▀██▄\n█ ▀ █▄ ██▄█ ▀\n▀▄▄▄▄▄ ▄█▀█▀█\n█ ▀▄▄▄▄▀▀▀ ▄█▀▀█\n█▄▄█▄▄█▄▄▄██▄▄▄█"], ["sleep_1", " \n ▄▄▄ ▄▄▄ \n ▄█▄ ▀▀ █▄▄▀██▄\n█ ▀ ▄▄▄ █▄▄▀ █\n▀▄▄▄▄▄ ▄█▄▀█ \n █▄▄▄▄▄██▀▀▄█▄ \n█▀▀█ █ ▄▀ █▄\n█▄▄▄█▄▄▄▄██▄▄▄██"], ["sleep_2", " \n █▀▀▄▄▀▀█ ▄▄▄ \n▄▀█▀ ▀██ █▀█\n█ ▀▀▀ ▀█▀▄▄▀\n ▀█▀▀▀ ▄▄██▀▄▀ \n ███████▀ ▄█▄ \n█▀▀█ █ ▄▀ █▄\n█▄▄▄█▄▄▄▄██▄▄▄██"], ["walk_1", " █▀▀▄▄▀▀█ ▄▄▄ \n▄▀█▀ ▄▄▀██ █▀█\n█ ▀▀ ▀█▀▄▄▀\n ▀█▀▀▀ ▄▄██▀▄▀ \n ▄██████▀▀ ▀█ \n █ █ █ █ █▀█\n ▄█▀▄ ▀▀█ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["walk_2", " ▄▄▄ ▄▄▄ \n ▄█▄ ▀▀ █▄▄▀██▄\n█ ▀ ▄█▀ ██▄▀ █\n▀▄▄▄▄▄ ▄█▄▀█ \n █▄▄▄▄▄█▀▀▀ █ \n █ █▀▀▀█ ▄▀█▀█\n ▄█▀▄ ▀▀█ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"]]], + ["alphamon", [["angry", " ▄██▄▄▄██▀ \n▄▄ █▄▀ ▄ █▄▄▄ \n█ ▀█ ▀ ▄▀ █ \n █▄▄██▄▀▀█▄██ \n█ ▀█ ▄▄ █ ▀██▄ \n ▀▀█▄▀▀▄▄███████\n ▄▀ ▀█▀█▀ ▀█▀██\n█▄█▄▄█ █▄█▄█▄█ ▀"], ["attack", " ▄██▄▄▄██▀ \n▄▄ █▄▀ ▄▄ █▄▄▄ \n█ ▀▀▄▄▀▀▄▀▀ █ \n █▄▄██▄▀▀█▄██ \n█ ▀█ ▄▄ █ ▀██▄ \n ▀▀█▄▀▀▄▄███████\n ▄▀ ▀█▀█▀ ▀█▀██\n█▄█▄▄█ █▄█▄█▄█ ▀"], ["eat_1", " ▄██▄▄▄██▀ \n █▄▀ ▄▄ █ \n█▀█ ▀▀ ██▀▀█ \n▀▄███ ▄█▄ ▄▄▀ █\n ▄▀█▀▀▀ ▀█▀ █▄██\n ▀▄█ ██ █▄▄████\n ▄▀▀▀▄▀▀▀▀████▀\n █▄█▄▄█▄█▄█▄█▀ "], ["eat_2", " ▄▄ ▄▄▄ \n ▄▀█▀▀▀▀█▀ \n█▀█▀ ▄▀▄ ██▀▀█ \n▀▄▀▄▄ ▄▄█ ▄▄▀ \n ▄▀█▀▀▀ ▀█▀ █▄ \n ▀▄█ ██ █▄▄███▄\n ▄▀▀█▄█▀▀▀▀████\n █▄█▄▄██▄█▄█▄█▀█"], ["happy", " ▄██▄▄▄██▀ \n▄▄ █▄▀ ▄ █▄▄▄ \n█ ▀█ ▀ ▀▄▀ █ \n █▄ ██ ▄▀█▄██▄ ▄\n█ ▀█▀██ █ ▀████\n ▀▀█▄▀▀▄▄███████\n ▄▀ ▀█▀█▀ ▀█▀▀ \n█▄█▄▄█ █▄█▄█▄█ "], ["injured_1", " \n ▄██▄▄▄██▀ \n █▄▀▄ ▀█ \n█▀█ ▀▀▀ ▄█▀▀█ \n▀▄ ██▄▄▀█▄ ▄▄▀ \n ▄▀█ ▄▄ ▀█▀ █▄ \n ▀▄█▄█▀▄▄█▄▄██ \n █▄█▄▄█▄█▄█▄███▄"], ["injured_2", " \n ▄▄ ▄▄▄ \n ▄▀█▀▀▀▀██ \n ▄█▀ █▄▄ █▄ \n█ ▀▄▄ ▄▄▀▀ ▀▄ \n▀▀▄█▀▀▀ ██▄▀█▀ \n █ █▄█▀▄▄█ ██ \n ███▄▄█▄█▄█████▄"], ["sleep_1", " \n ▄██▄▄▄██▀ \n █▄▀ █▄▄▄ \n█▀▀█ ▀▀ ▄▀ █ \n ▀▄▄█▄▄▀██▄▀█ \n █ █ ▄▄ █ ██▄ \n ▄▀▀▀█▀█▀▀▀▀████\n█▄█▄▄█▀█▄█▄█▄█▀█"], ["sleep_2", " ▄▄ ▄▄▄ \n ▄▀█▀▀▀▀█▀ \n▄▄▄█▀ ▄▄ █▀▀█ \n▀▄ ▀▄ ▄▄█ ▄▄▀ \n ▄▀█▀▀▀ ▀█▀ █▄ \n ▀▄█▄██▄▄█▄▄███▄\n ▄▀ █▄█▀ ▀████\n█▄█▄▄█ █▄█▄█▄█▀█"], ["walk_1", " ▄██▄▄▄██▀ \n▄▄ █▄▀ ▄▄ █▄▄▄ \n█ ▀█ ▀▀▄▀▀ █ \n ▀▄▄██▄▀██▄▀█ \n █ █ ▄▄ █ ██ \n ▀▀▄█▀▄▄██████▄\n ▄▀ ▀█▀ ▀█████\n █▄█▄▄█▄█▄█▄█ ▀█"], ["walk_2", " ▄▄ ▄▄▄ \n ▄▀█▀▀▀▀█▀ \n█▀▄█▀ ▄█ █▀▀█ \n▀▄▄█▄▄ ▄█▄▄█ █\n █ █▀▀█ █▄█▄██\n ▀█▀██ ▀███████\n ▄█ ▄▄▀ ▀███▀\n █▄█▄█▀▄█▄█▄█ "]]], + ["alphamon_ouryuken", [["angry", " ▄▄ ▄▄▄ \n ▄▀█▀▀▀▀█ ▄▄▄▄\n█▀█▀ ▄█ ▄█▀▀███▀\n▀▄▀▄▄ ▄█▄ ▄▄█▀▄█\n▄▀█▀▀▀ ▀█▀ █▄▀▄█\n▀▄█▄██▄ █▄▄▀ ▀▄█\n ▄▀ ▀███▀ ▀▄ ▀\n█▄█▄▄█ █▄█▄█▄█ "], ["attack", " ▄▄██▄██▀ \n █▄▀ ▄▄ █▄██\n █ ▀▀▄▀▀ ▀█\n ▄▄▀▀▀██▄███▀█▄█\n▀▄▄ ▄▄▄ ▀█ ▄▀▀█\n▀▄▄ ▄▄▀█████▀█\n ▄▀▀▀▀██▀█▀ ▀█ \n█▄█▄▄█ █▄█▄█▄█"], ["eat_1", " ▄▄██▄██▀ ▄▄▄▄\n▄▀█▄▀ ▄ ██▀▀██▀\n▀▄█ ▀ ▀ █ ▄▄▀▄█\n█ ▀███ ▄█▀▀ █▀▄█\n▀▄▄█▀▀▀▀█▄▄█▀▀▄█\n ▀▄██ ▄███ ▀\n ▄▀ ▀██▀ ▀▄ \n█▄█▄▄██▄█▄█▄█ "], ["eat_2", " ▄▄ ▄▄▄ \n ▄▀█▀▀▀▀█ ▄▄▄▄\n█▀█▀ ▄▀▄ █▀▀███▀\n▀▄▀▄▄ ▄▄█ ▄▄█▀▄█\n▄▀█▀▀▀ ▀█▀ █▄▀▄█\n▀▄█▄██▄ █▄▄▀ ▀▄█\n ▄▀ ▀███▀ ▀▄ ▀\n█▄█▄▄█ █▄█▄█▄█ "], ["happy", " ▄▄██▄██▀ ▄▄▄▄\n █▄▀ ▄ ██████▀\n█▀█ ▀ ▀▄▀ ██▄█\n▀▄████ ▄█▄█▀█▀▄█\n█ █▀▀▀▀█ ▄█▀▄█\n ▀▀█▄█▄ ███▀ ▀\n ▄▀ ▀█▀█▀ ▀▄ \n█▄█▄▄█ █▄█▄█▄█ "], ["injured_1", " \n ▄▄██▄██▀ \n▄▄█▄▀▄ █▄▄████\n█ █ ▀▀▄▀▀ ██▀▄\n █▄██▄▀█▄█▀▀█▄▀█\n█ █▄▄▄ ███ █▀█\n █▀ ▀███▀ ▀█▀▀█\n█▄█▄▄███▄█▄█▄█ "], ["injured_2", " \n ▄▄ ▄▄▄ \n ▄▀█▀▀▀▀█ ▄████\n ▄█▀ █▄ ▄█▀▀██▀▄\n█ ▀▄▄ ▄█ ▄▄▄█▄▀█\n▄█▀█▀▀ ▀██▄ ▀█▀█\n▀▄▀ ▀██▄▀ ▀▄▀▀█\n█▄█▄▄███▄█▄█▄█ "], ["sleep_1", " \n \n ▄▄██▄██▀ \n▄▄█▄▀ █▄▄████\n█ █ ▀▀▄▀▀ ██▀▄\n▄█▄██▄▀██▄██▀▄▀█\n█ ▀▄▄▄ ▄▀ ▀ ▀▄▀█\n█▄▄█████▄▄▄▄▄█▀█"], ["sleep_2", " \n ▄▄ ▄▄▄ \n ▄▀█▀▀▀▀█ ▄▄▄▄\n█▀█▀ ▄▄ ▄█▀▀███▀\n▀▄▀▄▄ ▄█▄ ▄▄█▀▄█\n▄██▀▀▀ ▀████▄▀▄█\n█ ▀▄██▄▄▀ ▀ ▀█▄█\n█▄▄█████▄▄▄▄▄█ ▀"], ["walk_1", " ▄▄██▄██▀ \n▄▄█▄▀ ▄▄ █▄▄████\n█ █ ▀▀▄▀▀ ██▀▄\n █▄██▄▀██▄▀█▀▄▀█\n█ █ ▄▄ █ █▀▄▀█\n ▀▀▄██▄▄███ ▀█\n ▄▀ ▀██▀ ▀▄ \n█▄█▄▄██▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄▄ \n ▄▀█▀▀▀▀█ ▄▄▄▄\n█▀█▀ ▄█▀▄█▀▀███▀\n▀▄▀▄▄ ▄█▄ ▄▄█▀▄█\n▄▀█▀▀▀ ▀█▀ █▄▀▄█\n▀▄█▄██▄ █▄▄▀ ▀▄█\n ▄▀ ▀███▀ ▀▄ ▀\n█▄█▄▄█ █▄█▄█▄█ "]]], + ["ancientbeetlemon", [["angry", "▄ ▄ ▄▄▄ \n▀█▄ ▄▀▄▄▀ \n ▀████▀██▄ ▄▀▀█\n ▀██▄▄███▀█ ▄▀▄\n ▄▀█▀█▀▀███▀▀▄▀ \n█ ▄█▄ ▄▄█▀ ▄▄▀ \n █▀ ██▀ █▀█▀█▄ \n█▄▄▀▀▀▀▄█▄▀▄▀▄█ "], ["attack", "█▄▀ ▄▀▀█ \n ██▄█▄▀█▄ ▄▄▄\n ▀██▄▄███▄▄▀ ▄▀\n█▀▄█ ██▀▀█▄▀▄▀\n▀▄▄█▀█▀▀██▄ █ \n ▄█▀█▄█▀████▀ \n █ ▀██▀▀▄▀█▀█▀▄ \n█▄▀▀ ▀▀█▄▀▄▀▄█ "], ["eat_1", "█▄▀ ▄▀▀█ \n ██▄█▄▀▀▄ ▄▄▄\n ▀█▄▄▄███▄▄▀ ▄▀\n ▄█ ███▄█▄▀▄▀\n▄▀ █▀█▀▀██▀ █ \n▀▄█▀█▄█▀█▄▄██ \n █ ▀██▀▀▄▀█▀█▀▄ \n█▄▀▀ ▀▀█▄▀▄▀▄█ "], ["eat_2", "▄ ▄ ▄▄▄ \n▀█▄ ▄▀▄▄▀ \n ▀████▀██▄ ▄▀▀█\n ██▄█▄██▀█ ▄▀▄\n ▄▀█▀█▀▀███▀▀▄▀ \n█ ▄█▄ ▄▄█▀ ▄▄▀ \n █▀ ██▀ █▀█▀█▄ \n█▄▄▀▀▀▀▄█▄▀▄▀▄█ "], ["happy", "█▄▀ ▄▀▀█ \n ██▄█▄▀█▄ ▄▄▄\n▄▄▀██▄█▄██▄▄▀ ▄▀\n█ ██ ████▄█▄▀▄▀\n ▀▄█▀█▀ ██▀ █ \n ▄█▀█▄█▀█▄▄██ \n █ ▀██▀▀▄▀█▀█▀▄ \n█▄▀▀ ▀▀█▄▀▄▀▄█ "], ["injured_1", " \n▄ ▄ ▄▄▄ \n▀█▄ ▄▀▄▄▀ \n ▀███▀███▄ ▄▀▀█\n ██▄▄███▀█ ▄▀▄\n ▄▀█▀█▀▀███▀█▄▀ \n █▄█▄ ▄▄██ █▀▄ \n█▄▄████▄█▄█▄█▄█ "], ["injured_2", " \n \n█▄▀ ▄▄▄▄ \n ██▄██▄▄▄▀ \n ▀██ ▀███▄ ▄▀▀█\n ▄███████▄█▄▄▀▄\n █ █ ▀ ██▀ ██▀ \n█████▄████▄▄█▄█ "], ["sleep_1", " \n▄ ▄ ▄▄▄ \n▀█▄ ▄▀▄▄▀ \n ▀███████▄ ▄▀▀█\n ██▄▄███▀█ ▄▀▄\n ▄▀█▀█▀▀███▀█▄▀ \n █▄█▄ ▄▄██ █▀▄ \n█▄▄████▄█▄█▄█▄█ "], ["sleep_2", " \n█▄▀ ▄▀▀█ \n ██▄█▄██▄ ▄▄▄\n ▀██▀▀███▄▄▀ ▄▀\n ▄███████▄█▄▀▄▀\n █ █ ▀ ██ ██ \n ▄▀▀█▄▀▀█▀▄▄█▄ \n█▄▄████▄█▄▀▄▀▄█ "], ["walk_1", " \n \n \n \n \n \n \n "], ["walk_2", "▄ ▄ ▄▄▄ \n▀█▄ ▄▀▄▄▀ \n ▀████▀▀█▄ ▄▀▀█\n █▄▄▄███▀█ ▄▀▄\n ▄▀█▀█▀▀███▀▀▄▀ \n█ ▄█▄ ▄▄█▀ ▄▄▀ \n █▀ ██▀ █▀█▀█▄ \n█▄▄▀▀▀▀▄█▄▀▄▀▄█ "]]], + ["ancientgarurumon", [["angry", " ▄██▄█▀▄ \n ▄▄▄▀ ▄ ▀▄ \n █▀ ▀▀ ▄▀▀█▀▄\n █████▄ █ ▄▀▀ \n ▄█▀▀▀▀▄███▀▀▄ \n █ ▀█▀▀▀▀█ ▄▀ \n ██▀▀███▀▀██ \n █▄█▄██ ██▄█▄█ "], ["attack", " ▄▄ ▄▄ \n ▄▀▀▀▀▀ █ \n ██▀ ▄█▀ ▄█▄▄ \n ▀▄▄▄▄▄▄ ▄▀ █▄▀\n ▀▄▄▄▄▄▀█▄▄█ \n ▄▀ █▄ ▄█▀ █ \n ▄█▀▀█▄▄▄█▄▄█▄ \n█▄█▄██▀▀▀██▄█▄█ "], ["eat_1", " ▄▄ ▄▄ \n ▄▀▀▀▀▀ █ \n ██▀ ▄▀▄ ▄█▄▄ \n ▀▄▄▄▄▄▄ ▄▀ █▄▀\n ▀▄▄▄▄▄▀█▄▄█ \n ▄▀ █▄ ▄█▀ █ \n ▄█▀▀█▄▄▄█▄▄█▄ \n█▄█▄██▀▀▀██▄█▄█ "], ["eat_2", " ▄██▄█▀▄ \n ▄▄▄▀ ▄▄ ▀▄ \n █▀ ▀ ▄▀▀█▀▄\n ████▄ █ ▄▀▀ \n █▀▀▀ ▄██▀▀▄ \n █ ██▀▀▀█ ▄▀ \n ▄█▀▀███▀▀█▄ \n █▄█▄██ ██▄█▄█ "], ["happy", " ▄██▄█▀▄ \n ▄▄▄▀ ▄ ▀▄ \n █▀ ▀ ▀ ▄▀▀█▀▄\n ██████ █ ▄▀▀ \n █▀▀▀▀▄██▀▀▄ \n █ ██▀▀▀█ ▄▀ \n ▄█▀▀███▀▀█▄ \n █▄█▄██ ██▄█▄█ "], ["injured_1", " \n ▄▄ ▄▄ \n ▄▀▀▀▀▀ █ \n ██▀ █▄ ▄█▄▄ \n ▀▄▄▄▄▄▄ ▄▀ █▄ \n █▄▄▄▄▄▀█▄▄█ \n▄▀ ▀██▄ ▄█▀ ▀█ \n█▄▄▄██▄▄▄█▄▄▄█ "], ["injured_2", " \n \n ▄██▄█▀▄ \n▄▄▄▀ ▄ ▀▄ \n█▀ ▀▀ ▄▀▀█▀▄ \n ██▀▀▀█▄█ ▄▀▀ \n▄▀ ▀██▄ ▄█▀ ▀█ \n█▄▄▄██▄▄▄█▄▄▄█ "], ["refuse", " ▄▄ ▄▄ \n ▄▀▀▀▀▀ █ \n ██▀ ▄█ ▄█▄▄ \n ▀▄▄▄▄▄▄ ▄▀ █▄▀\n ▀▄▄▄▄▄▀█▄▄█ \n ▄▀ █▄ ▄█▀ █ \n ▄█▀▀█▄▄▄█▄▄█▄ \n█▄█▄██▀▀▀██▄█▄█ "], ["sleep_1", " \n ▄▄ ▄▄ \n ▄▀▀▀▀▀ █ \n ██▀ ▄▄ ▄█▄▄ \n ▀▄▄▄▄▄▄ ▄▀ █▄ \n █▄▄▄▄▄▀█▄▄█ \n▄▀ ▀██▄ ▄█▀ ▀█ \n█▄▄▄██▄▄▄█▄▄▄█ "], ["sleep_2", " \n ▄██▄█▀▄ \n ▄▄▄▀ ▀▄ \n █▀ ▀▀ ▄▀▀█▀▄\n █▀▀▀▀▀▄█ ▄▀▀ \n ▄▀▀▀██▀███ █ \n▄▀ ▀██▄ ▄█▀ ▀█ \n█▄▄▄██▄▄▄█▄▄▄█ "], ["walk_1", " ▄██▄█▀▄ \n ▄▄▄▀ ▄▄ ▀▄ \n █▀ ▀▀ ▄▀▀█▀▄\n █▀▀▀▀▀▄█ ▄▀▀ \n █▀█▀▀ ██▀▀▄ \n █ █▀ ▀█ ▄▀ \n ▄█▀▀███▀▀█▄ \n █▄█▄██ ██▄█▄█ "], ["walk_2", " ▄▄ ▄▄ \n ▄▀▀▀▀▀ █ \n ██▀ ▄█▀ ▄█▄▄ \n ▀▄▄▄▄▄▄ ▄▀ █▄▀\n ▀▄▄▄▄▄▀█▄▄█ \n ▄▀ █▄ ▄█▀ █ \n ▄█▀▀█▄▄▄█▄▄█▄ \n█▄█▄██▀▀▀██▄█▄█ "]]], + ["ancientgreymon", [["angry", " ▄▄ ▄▄ ▄▀▄█▀▀▄ \n█ █▄▀ ▀▄▄▀ ▄ █\n█ ▀ ▄█ ▄█▄ ▀█\n█ ▄▄▄▄ ██▀ ▀▄█\n ▀████ ███▀▄▄ ▀▄\n ▀▄▄▄▀ ▀▄▄▀ ▀█▀\n ▄▀ █▄▀ █▄▄█ █ \n █▄█▄█▄█▄▀ █▄▄█ "], ["attack", " ▄▄ ▄▄ ▄▀▄█▀▀▄ \n█ █▄▀ ▀▄▄▀ ▄ █\n█ ▀ ▄█▀ ▄█▄ ▀█\n█ ▄▄▄▄ ██▀ ▀▄█\n ▀▄▄▄▄▄███▀▄▄ ▀▄\n ▄▀▀█▄ ▀▄▄▀ ▀█▀\n █▄█▄▄▄█▄█▄▄█ █ \n ▀█▄██ "], ["eat_1", " ▄ ▄▄▄ \n▄▀█ ▄▀▀▄▀ █▀ ▀▄\n█ █▀ ▄ ▀▀▄ ▀▄█\n█ ▀ ▀ ▄██▀ ▄ █\n▀▄▀▀▀▀ ▄██▄ █▀\n ▀▀██▀▀█▀ █▀▄▄█\n ▄▀ █▄▀ █▄▄█ █ \n █▄█▄█▄█▄▀ █▄██ "], ["eat_2", " ▄▄ ▄▄ ▄▀▄█▀▀▄ \n█ █▄▀ ▀▄▄▀ ▄ █\n█ ▀ ▄▄ ▄█▄ ▀█\n█ ▄▄▄ ██▀ ▀▄█\n ▀████ ███▀▄▄ ▀▄\n ▀▄▄▄▀ ▀▄▄▀ ▀█▀\n ▄▀ █▄▀ █▄▄█ █ \n █▄█▄█▄█▄▀ █▄▄█ "], ["happy", " ▄▄ ▄▄ ▄▀▄█▀▀▄ \n█ █▄▀ ▀▄▄▀ ▄ █\n█ ▀ ▄▀▄ ▄█▄ ▀█\n█ ▄▄▄▄ ██▀ ▀▄█\n ▀████ ███▀▄▄ ▀▄\n ▀▄▄▄▀ ▀▄▄▀ ▀█▀\n ▄▀ █▄▀ █▄▄█ █ \n █▄█▄█▄█▄▀ █▄▄█ "], ["injured_1", " \n ▄ ▄▄▄ \n▄▀█ ▄▀▀▄▀ █▀ ▀▄\n█ █▀▄ ▀▀▄ ▀▄█\n█ ▀▀ ▄██▀ ▄ █\n▀▄▀▀▀▀ ▄██▄▄▄ █▀\n █▀▀██ ▀▄█▄ ▀██\n █▄█▄█▄█▄█▄▄▄▄█ "], ["injured_2", " \n \n ▄▄ ▄▄ ▄▀▄█▀▀▄ \n█ █▄▀ ▀▄▄▀ ▄ █\n█ ▀ █▄ ▄█▄ ▀█\n█ ▄▄▄▄ ██▄▄▄▀▄█\n ▀▄▄▄▄▄▀▀▄█▄ ▀█▄\n █▄█▄█▄█▄█▄▄▄▄██"], ["refuse", " ▄ ▄▄▄ \n▄▀█ ▄▀▀▄▀ █▀ ▀▄\n█ █▀ ▄ ▀▀▄ ▀▄█\n█ ▀▀ ▄██▀ ▄ █\n▀▄▀▀▀▀ ▄██▄ █▀\n ▀▀██▀▀█▀ █▀▄▄█\n ▄▀ █▄▀ █▄▄█ █ \n █▄█▄█▄█▄▀ █▄██ "], ["sleep_1", " \n ▄ ▄▄▄ \n▄▀█ ▄▀▀▄▀ █▀ ▀▄\n█ █▀ ▀▀▄ ▀▄█\n█ ▀▀ ▄██▀ ▄ █\n▀▄▀▀▀▀ ▄██▄▄▄ █▀\n █▀▀██ ▀▄█▄ ▀██\n █▄█▄█▄█▄█▄▄▄▄█ "], ["sleep_2", " \n ▄▄ ▄▄ ▄▀▄█▀▀▄ \n█ █▄▀ ▀▄▄▀ ▄ █\n█ ▀ ▄▄ ▄█▄ ▀█\n█ ▄▄▄▄ ██▀ ▀▄█\n ▀▄▄▄▄▄███▀▄▄ ▀▄\n ▄▀▀█▄ ▀▄█▄ ▀█▀\n █▄█▄█▄█▄█▄▄▄▄█ "], ["walk_1", " ▄▄ ▄▄ ▄▀▄█▀▀▄ \n█ █▄▀ ▀▄▄▀ ▄ █\n█ ▀ ▄█▀ ▄█▄ ▀█\n█ ▄▄▄▄ ██▀ ▀▄█\n ▀▄▄▄▄▄███▀▄▄ ▀▄\n █▀ ▀▄▄▀ ▀█▀\n ▄▀ █▄▀ █▄▄█ █ \n █▄█▄█▄█▄▀ █▄▄█ "], ["walk_2", " ▄▄ ▄▄ ▄▀▄█▀▀▄ \n█ █▄▀ ▀▄▄▀ ▄ █\n█ ▀ ▄█▀ ▄█▄ ▀█\n█ ▄▄▄▄ ██▀ ▀▄█\n ▀▄▄▄▄▄███▀▄▄ ▀▄\n ▄▀▀█▄ ▀▄▄▀ ▀█▀\n █▄█▄▄▄█▄█▄▄█ █ \n ▀█▄██ "]]], + ["ancientkazemon", [["angry", " ▄▀▀█▄▄▄▄ \n █▄▄▀ ▀▀▄ \n █ ▄█▀▀▄▄▀▀▀ \n █▄▀▀▀ █▄██ \n █ █ ██ ██ █▀▄ \n ▀▄█▀▀▀█▄▄▀█ █ \n ▄▀▄▄▀▀▄ ▀▀ \n █▄▄█ █▄▄█ "], ["attack", " ▄▄▄ \n ▄▀ ▄▀▀▀▀▀▄▄ \n ▀█▀ ▄▄▄ ▄█▄ \n █▄▀█▄▀ █▀▄▄ \n ▀▄▄▄██▄ ▀▄ \n ▄▀▄▀▄▄▀ █▄ █ \n █▄█ ▀▄▄█ ▀▄█ \n █▄▄█▀▀▀▄▄▄█ "], ["eat_1", " ▄▄▄ \n ▄▀ ▄▀▀▀▀▀▄▄ \n ▀█▀ ▄▄▄ ▄█▄ \n █▄▄█▀▄ █▀▄▄ \n ▀▄▄▄▄█▄▄ ▀▄ \n ▄▀▀▄▀▄▄█▄ ▀▄ █ \n ▀▄▄█ ▀█▄▄▄▀▄█ \n █▄▄█▀▀▀▄▄▄█ "], ["eat_2", " ▄▀▀█▄▄▄▄ \n █▄▄▀ ▀▀▄ \n █ ▄▀█▀▄▄▀▀▀ \n ▀█▀▀▀ █ ▀█ \n █ ██ ▄▀▄ ▀▄ \n █ █▀▀█ █▀▄ █ \n █▀▄▄▀▀█ ▀▀ \n █▄▄█ █▄▄█ "], ["happy", " ▄▀▀█▄▄▄▄ \n █▄▄▀ ▀▀▄ \n █ ▄▄█▀▀▄▄▀▀▀ \n ██ ▀ ▀▄█▄▀█ \n █ ▀███ █ █ ▀▄ \n ▀▄█▄▄█▄▄█▀▄ █ \n ▄▀▄▄▀▀▄ ▀▀ \n █▄▄█ █▄▄█ "], ["injured_1", " \n \n ▄▀▀█▄▄▄▄ \n █▄▄▀ ▀▀▄ \n █ ▄▄██▀▄▄▀▀▀ \n ▀█ ▄▄▀ ▀█ \n ▄▀▀█▀██▀▀▀▄ ▀▄ \n ▀▄▄█▄▄█▄▄▄▀▄▄█ "], ["injured_2", " \n \n ▄▄▄ \n█▀ ▄▀▀▀▀▀▄▄ \n █▀ ▄▄▄ ▄█▄ \n █▄▀▀▀▀ █▀▄▄ \n ▄▀▀█▀██▀▀▀▄▀▄ \n ▀▄▄█▄▄█▄▄▄█▄▄█ "], ["refuse", " ▄▄▄ \n ▄▀ ▄▀▀▀▀▀▄▄ \n ▀█▀ ▄▄▄ ▄█▄ \n █▄▀██▀ █▀▄▄ \n ▀▄▄▄██▄ ▀▄ \n ▄▀▄▀▄▄▀ █▄ █ \n █▄█ ▀▄▄█ ▀▄█ \n █▄▄█▀▀▀▄▄▄█ "], ["sleep_1", " \n ▄▄▄ \n ▄▀ ▄▀▀▀▀▀▄▄ \n ▀█▀ ▄▄▄ ▄█▄ \n █▄▀▀▀▀ █▀▄▄ \n ▀▄▄▄██▄ ▀▄ \n █▀▀▄▀▄▄▀▀▀▄ █ \n ▀▄▄█▄▄█▄▄▄▀▀▄█ "], ["sleep_2", " \n \n ▄▀▀█▄▄▄▄ \n █▄▄▀ ▀▀▄ \n █ ▄▄██▀▄▄▀▀▀ \n ▀█ ▄▄▀ ▀█ \n █▀▀█▀██▀▀▀▄ ▀▄ \n ▀▄▄█▄▄█▄▄▄▀▄▄█ "], ["walk_1", " ▄▀▀█▄▄▄▄ \n █▄▄▀ ▀▀▄ \n █ ▄▄▀█▀▄▄▀▀▀ \n ▀█ ▀▀▄▄▀ ▀█ \n ▄▀█▀▀█▀▄ ▀▄ \n █ █ ▀█ █▀▄ █ \n █▀▄▄▀▀█ ▀▀ \n █▄▄█ █▄▄█ "], ["walk_2", " ▄▄▄ \n ▄▀ ▄▀▀▀▀▀▄▄ \n ▀█▀ ▄▄▄ ▄█▄ \n █▄▀█▄▀ █▀▄▄ \n ▀▄▄▄██▄ ▀▄ \n ▄▀▄▀▄▄▀ █▄ █ \n █▄█ ▀▄▄█ ▀▄█ \n █▄▄█▀▀▀▄▄▄█ "]]], + ["ancientmegatheriummon", [["angry", " ▄▄▄▄▄▄ \n ▄▀▄▀ ▀▄ \n▄▀▄▀▀▀▀▄▀▄▀▄▀▄ \n█▀ ▄▄▄ █ █ \n▀▄▀ ▄ █▄█ █ ▀▄ \n █ ▀▀▄██ █ ▄ █ \n ▀▄▄▀ █ ▄▄ █ ▀▄\n █▄▄█▄▄██▄▄█▄█▄█"], ["attack", "▄▀▄▀▀▀▀▄▀▀▀▄ \n█▀ ▄▄▄ █ ▄ █ \n▀▄▀ ▄ █▄█▀ ▀ █ \n █ ▀ ▀█ ▄ █ \n ▀████ █ █ ▄ █ \n ████ █▀ ▀ █ █ \n ▀▄▄▄█▀▄ ▄ ▄ █\n █▄▄▀▄▄▄█▀▄█▄█ "], ["eat_1", " ▄▀█▀▀▀▀▄ \n ▄ █▄█▄ ▄ ▄ █ \n█▄▀ ▀▄▀ ▀ █ \n█ ▄▀▀▀▄ █ ▄ █ \n █ ▄▀ ██▀ █ ▄ █ \n █▄▄▄▄ ▀ ▀ █ █ \n █▀▀▀▄█▄ ▄ ▄ █\n ███▀█▄▄█▀▄█▄█ "], ["eat_2", " ▄▄▄▄▄▄ \n ▄▀▄▀ ▀▄ \n▄▀▄▀▀▀▀▄▀▄▀▄▀▄ \n█▀ ▄▄▄ █ █ \n▀▄▀ ▄ █▄█ █ ▀▄ \n █ ▀ ▀██ █ ▄ █ \n ▀▄▄▀▀█ ▄▄ █ ▀▄\n █▄▄█▄▄██▄▄█▄█▄█"], ["happy", " ▄▀█▀▀▀▀▄ \n ▄ █▄█▄ ▄ ▄ █ \n█▄▀ ▀▄▀ ▀ █ \n█ ▄▀▀▀▄ █ ▄ █ \n █ ▄▀▄██▀ █ ▄ █ \n █▄▄▄▄ ▀ ▀ █ █ \n █▀▀▀▄█▄ ▄ ▄ █\n ███▀█▄▄█▀▄█▄█ "], ["injured_1", " \n ▄▀█▀▀▀▀▄ \n ▄ █▄█▄ ▄ ▄ █ \n█▄▀ ▀▄▀ ▀ █ \n█ ▄▀▀▀▄ █ ▄ █ \n █ █▄ ██▀ █ █ \n █ ▄▀█▀ ▀ █ █ \n█▄██▄▄█▄▄██▄█▄▄█"], ["injured_2", " \n ▄▄▄▄▄▄ \n ▄▀▄▀ ▀▄ \n▄▀▄▀▀▀▀▄▀▄▀▄▀▄ \n█▀ ▄▄▄ █ █ \n▀▄▀▄ █▄█ █ ▀▄ \n █ ▀▀▄██ █ ▄ █ \n██▄▄█▄█▄▄██▄█▄▄█"], ["sleep_1", " \n ▄▄▄▄▄▄ \n ▄▀▄▀ ▀▄ \n▄▀▄▀▀▀▀▄▀▄▀▄▀▄ \n█▀ ▄▄▄ █ █ \n▀▄▀ █▄█ █ ▀▄ \n █ ▀▀▄██ █ ▄ █ \n██▄▄█▄█▄▄██▄█▄▄█"], ["sleep_2", " \n ▄▀█▀▀▀▀▄ \n ▄ █▄█▄ ▄ ▄ █ \n█▄▀ ▀▄▀ ▀ █ \n█ ▄▀▀▀▄ █ ▄ █ \n █ ▄▄ ██▀ █ █ \n █ ▄▀█▀ ▀ █ █ \n█▄██▄▄█▄▄██▄█▄▄█"], ["walk_1", " ▄▀█▀▀▀▀▄ \n ▄ █▄█▄ ▄ ▄ █ \n█▄▀ ▀▄▀ ▀ █ \n█ ▄▀▀▀▄ █ ▄ █ \n █ ▄▀ ██▀ █ ▄ █ \n █ ▄▀█▀ ▀ █ █ \n ▀█▄ ▄▄ ▄ ▄ █\n █▄█▀█▄▄█▀▄█▄█ "], ["walk_2", " ▄▄▄▄▄▄ \n ▄▀▄▀ ▀▄ \n▄▀▄▀▀▀▀▄▀▄▀▄▀▄ \n█▀ ▄▄▄ █ █ \n▀▄▀ ▄ █▄█ █ ▀▄ \n █ ▀ ▄██ █ ▄ █ \n ▀▄▄▀ █ ▄▄ █ ▀▄\n █▄▄█▄▄██▄▄█▄█▄█"]]], + ["ancientmermaimon", [["angry", " ▄▄ \n ▄▄███▄▄ \n ▄███▀ █▀▄ \n ▀█▀▀▀▀█▄▄██▀ \n █▄▄██▄▀█ \n ▄▀█▀ ▀█▀▀▄ █▄█ \n ▀▄█▀█▀█▄▄█▄▄██ \n ▀█▄█▄█▄█▄█▀ "], ["attack", " ▄██ \n ▄███▀██▀ \n ████▄▄█ ▀▄▄▄ \n ▄█ ▄▄ █▀██▀ \n█ ▀▄██▄██ █ \n ▀▄█▄▄▄█▄▄▀ █▄█\n █▀▄▀▄▀█▄▄▄▄█▀\n ▀▄█▄█▄█▄▀▀ "], ["eat_1", " ▄██ \n ▄███▀██▀ \n ████▄██ ▀▄▄▄ \n █ ▄▄ █▀██▀ \n ▀▄██▄██▄▀ \n ▄▀█▄▄▄█ █ █▄█\n ▀█▀▄▀▄▀█▄▄▄▄█▀\n ▀▄█▄█▄█▄▀▀ "], ["eat_2", " ▄▄ \n ▄▄███▄▄ \n ▄██▀▄▀█▀▄ \n ▀█▀▀▀▀█▄▄██▀ \n █▄▄██▄▀█ \n ▄▀█▀ ▀█▀▀▄ █▄█ \n ▀▄█▀█▀█▄▄█▄▄██ \n ▀█▄█▄█▄█▄█▀ "], ["happy", " ▄██ \n ▄██▀███▀ \n ███▄█▄█ ▀▄▄▄ \n █ ▄▄ █▀██▀ \n ▄▀▄██▄█▀▀█ \n ▀▄█▄▄▄█▄▄▀ █▄█\n █▀▄▀▄▀▄█▄▄▄█▀\n ▀▄█▄█▄█▄▀▀ "], ["injured_1", " \n ▄▄ \n ▄▄███▄▄ \n ▄███ ▀█▀▄ \n ▀█▀▀▀▀█▄▄██▀ \n █▄▄██▄▀█ \n ▄▀█▀ ▀█▀▀▄ █▄█\n ▀▄█████▄▄██▄█▀ "], ["injured_2", " \n \n ▄██ \n ▄██▀███▀ \n ████▄▄█ ▀▄▄▄ \n ▀▄ ▄█▀██▀ \n▄▀▀██▀██▀▀▄ ▄ ▄\n▀▄▄█▄▄▄█▄▄██▄██▀"], ["sleep_1", " \n ▄▄ \n ▄▄███▄▄ \n ▄███▀▀█▀▄ \n ▀█▀▀▀▀█▄▄██▀ \n █▄▄██▄▀█ \n ▄▀█▀ ▀█▀▀▄ █▄█\n ▀▄█████▄▄██▄█▀ "], ["sleep_2", " \n ▄██ \n ▄██████▀ \n ████▄▄█ ▀▄▄▄ \n ▀▄ ▄█▀██▀ \n ▄██▀███▄▀ █▄█ \n █ █▄▄▄█ █ ▄██ \n ▀▀█▄█▄█████▀ "], ["walk_1", " ▄██ \n ▄███▀██▀ \n ████▄██ ▀▄▄▄ \n ▀▄ ▄█▀██▀ \n ▄██▀███▄▀ \n █ █▄▄▄█ █ █▄█\n ▀█▀▄▀▄▀█▄▄▄▄█▀\n ▀▄█▄█▄█▄▀▀ "], ["walk_2", " ▄▄ \n ▄▄███▄▄ \n ▄███▀▄█▀▄ \n ▀█▀▀▀▀█▄▄██▀ \n █▄▄██▄▀█ \n ▄▀█▀ ▀█▀▀▄ █▄█ \n ▀▄█▀█▀█▄▄█▄▄██ \n ▀█▄█▄█▄█▄█▀ "]]], + ["ancientsphinxmon", [["angry", " ▄▄▄ ▄▄ ▄▄▄\n▄█▀▀██████▀ █ ▄▀\n█▀▄▀ ▄ ▀█▄▄ █ ▄▀\n█ ▄ ▀▀ █▀▄▀ ▄▄▀\n█▀ ▀▀ ▄▀█▀███▄▄ \n █▀ ██ ▄ ▄ ██ █\n ▄█▀███▄▄▄██████\n█▄█▄█▀█▄█▄██▄█▄█"], ["attack", " ▄███▄██▄▄▄ ▄▀▀█\n██ ▄▀▀▀██▀ █ ▀▄\n█ ▀ ▄█ ██▀▄▀ ▀▄\n█▄█▄▄▄ ▄█▄█▄▄▀▀ \n▀████▀▄▀ ▀ ▀█▀▀▄\n █▄ ▄▄█▄▀ ▀▄█▄▄█\n ▀▄▄▀█████▀▀████\n █▄█▄█▄█▄█ █▄█▄█"], ["eat_1", " ▄███▄██▄▄▄ ▄▀▀█\n██ ▄▀▀▀██▀ █ ▀▄\n█ ▀ ▄▀▄ ██▀▄▀ ▀▄\n█▄█▄▄ ▄█▄█▄▄▀▀ \n▀███▀▄▀ ▀ ▀██▀▀▄\n █▄ ▄█▄▀ ▀▄██▄▄█\n ▀▄▄▀█████▀▀████\n █▄█▄█▄█▄█ █▄█▄█"], ["eat_2", " ▄▄▄ ▄▄ ▄▄▄\n▄█▀▀██████▀ █ ▄▀\n█▀▄▀ ▄ ▀█▄▄ █ ▄▀\n█ ▄ ▀ ▀ █▀▄▀ ▄▄▀\n█▀ ▀▀ ▄▀█▀███▄▄ \n █▀ ██ ▄ ▄ ██ █\n ▄█▀███▄▄▄██████\n█▄█▄█▀█▄█▄██▄█▄█"], ["happy", " ▄███▄██▄▄▄ ▄▀▀█\n██ ▄▀▀▀██▀ █ ▀▄\n█ ▀ ▄▀▄ ██▀▄▀ ▀▄\n█▄█▄▄▄ ▄█▄█▄▄▀▀ \n▀████▀▄▀ ▀ ▀█▀▀▄\n █▄ ▄▄█▄▀ ▀▄█▄▄█\n ▀▄▄▀▄████▀▀████\n █▄█▄█▄█▄█ █▄█▄█"], ["injured_1", " \n \n ▄███▄██▄▄▄ \n██ ▄▀▀▀██▀ \n█ ▀ █▄ ██▀▄ \n█▄▀▄ ▄▀█▀█▄█▀▀▄\n █▀ ██ ▄ ▄ █▀ ▀█\n█▄██▄██▄▄▄██▄███"], ["injured_2", " \n \n ▄▄▄ ▄▄ \n▄█▀▀██████▀ \n█▀▄▀▄ ▀█▄▄▄ \n█ ▄ ▀▀▄▀█▀█▄█▀▀▄\n▀█▄▀▄█ ▄ ▄ █▀ ▀█\n██▄▄███▄▄▄██▄███"], ["sleep_1", " \n ▄▄▄\n ▄███▄██▄▄▄ █ ▄▀\n██ ▄▀▀▀██▀ █ ▄▀\n█ ▀ ▄▄ █▀█▀ ▄▄▀\n█▄▀▄▄ ▄▀█▀███▄▄ \n▀▄▄ ▄█ ▄ ▄ ██▄▄█\n██▄▄███▄▄▄██▄█▄█"], ["sleep_2", " \n ▄▄▄ ▄▄ ▄▄▄\n▄█▀▀██████▀ █ ▄▀\n█▀▄▀ ▀█▄▄ █ ▄▀\n█ ▄ ▀▀ █▀▄▀ ▄▄▀\n█▀ ▀▀ ▄▀█▀███▄▄ \n █▀ ██ ▄ ▄ ██▄▄█\n█▄██▄██▄▄▄██▄█▄█"], ["walk_1", " ▄███▄██▄▄▄ ▄▀▀█\n██ ▄▀▀▀██▀ █ ▀▄\n█ ▀ ▄█▀ ██▀▄▀ ▀▄\n█▄▀▄▄ ▄█▄█▄▄▀▀ \n▀▄▄ ▄▄▀ ▀ ▀██▀▀▄\n ▀▄▄██▄▀ ▀▄██▄▄█\n ▄█▀▄████▀▀████\n █▄█▄█▄█▄█ █▄█▄█"], ["walk_2", " ▄▄▄ ▄▄ ▄▄▄\n▄█▀▀██████▀ █ ▄▀\n█▀▄▀ ▄▄▀█▄▄ █ ▄▀\n█ ▄ ▀▀ █▀▄▀ ▄▄▀\n█▀ ▀▀ ▄▀█▀███▄▄ \n █▀ ██ ▄ ▄ ██ █\n ▄█▀███▄▄▄██████\n█▄█▄█▀█▄█▄██▄█▄█"]]], + ["ancienttroymon", [["angry", " █▀▀▀▄ \n ▄▀▀▀▄ █ \n ▄▀ ▄█ █▀▀▀▀▀ \n█▄██▄ ▄▀█▀█▀▄ \n ▀█▄▀▀▀▄▀▀▀▀▀█▄ \n █ ▀ █ ▀ ▀ █▄█\n ▄▀██▀█▄▄▄█ █ \n █▄▄█▄▄█ █▄▄█ "], ["attack", " ▄▄▄▄ \n █▄▄ ▀▄ \n ▄▀ ▄▄▀▄█▄▄▄▄ \n▄▀▄ ▀▀▀ █▄▄▄▄ \n▀▄█▄▄▄▄▀▄█▄█▄█ \n █ ▄▄▀▄ ▄ ▄█▀▄\n █▄█▄▄█ ▄▀█▀\n █▄▄██ ▀▀██▄▄█ "], ["eat_1", " ▄▄▄▄ \n █▄▄ ▀▄ \n ▄▀ ▄ ▀▄█▄▄▄▄ \n▄▀▄ ▀ ▀ █▄▄▄▄ \n▀▄█▄▄▄▄▀▄█▄█▄█ \n █ ▄▄▀▄ ▄ ▄█▀▄\n █▄█▄▄█ ▄▀█▀\n █▄▄██ ▀▀██▄▄█ "], ["eat_2", " █▀▀▀▄ \n ▄▀▀▀▄ █ \n ▄▀ ▄██ █▀▀▀▀▀ \n█▄██▄ ▄▀█▀█▀▄ \n ▀█▄▀▀▀▄▀▀▀▀▀█▄ \n █ ▀ █ ▀ ▀ █▄█\n ▄▀██▀█▄▄▄█ █ \n █▄▄█▄▄█ █▄▄█ "], ["happy", " █▀▀▀▄ \n ▄▀▀▀▄ █ \n ▄▀ ▄▀▄ █▀▀▀▀▀ \n█▄██▄ ▄▀█▀█▀▄ \n ▀█▄▀▀▀▄▀▀▀▀▀█▄ \n ▄█ ▀ █ ▀ ▀ █▄█\n █ ███▀█▄▄▄█ █ \n ▀▀▀█▄▄█ █▄▄█ "], ["injured_1", " \n ▄▄▄▄ \n █▄▄ ▀▄ \n ▄▀▄ ▀▄█▄▄▄▄ \n▄▀▄ ▀▀ █▄▄▄▄ \n▀▄█▄▄▄▄▀▄█▄█▄█ \n ▄█▄▄ █ ▄ ▄▄█▀▄\n █▄█▄▄██▄▄█▄▄██▀"], ["injured_2", " \n \n █▀▀▀▄ \n ▄▀▀▀▄ █ \n ▄▀ █▄ █▀▀▀▀▀ \n█ █ ▄▀█▀█▀▄ \n ▀████▀▄▀█▀███▄ \n █▄█▄▄██▄▄█▄▄█▄█"], ["refuse", " ▄▄▄▄ \n █▄▄ ▀▄ \n ▄▀ ▄ ▀▄█▄▄▄▄ \n▄▀▄ ▀▀ █▄▄▄▄ \n▀▄█▄▄▄▄▀▄█▄█▄█ \n █ ▄▄▀▄ ▄ ▄█▀▄\n █▄█▄▄█ ▄▀█▀\n █▄▄██ ▀▀██▄▄█ "], ["sleep_1", " \n ▄▄▄▄ \n █▄▄ ▀▄ \n ▄▀ ▀▄█▄▄▄▄ \n▄▀▄ ▀▀ █▄▄▄▄ \n▀▄█▄▄▄▄▀▄█▄█▄█ \n ▄█▄▄ █ ▄ ▄▄█▀▄\n █▄█▄▄██▄▄█▄▄██▀"], ["sleep_2", " \n \n █▀▀▀▄ \n ▄▀▀▀▄ █ \n ▄▀ ▄▄ █▀▀▀▀▀ \n█ █ ▄▀█▀█▀▄ \n ▀████▀▄▀█▀███▄ \n █▄█▄▄██▄▄█▄▄█▄█"], ["walk_1", " █▀▀▀▄ \n ▄▀▀▀▄ █ \n ▄▀ ▄██ █▀▀▀▀▀ \n█ █ ▄▀█▀█▀▄ \n ▀▀█▀▀▀▄▀▀▀▀▀█▄ \n █ ▀ █ ▀ ▀ █▄█\n ▄▀██▀█▄▄▄█ █ \n █▄▄█▄▄█ █▄▄█ "], ["walk_2", " ▄▄▄▄ \n █▄▄ ▀▄ \n ▄▀ ▄▄▀▄█▄▄▄▄ \n▄▀▄ ▀▀▀ █▄▄▄▄ \n▀▄█▄▄▄▄▀▄█▄█▄█ \n █ ▄▄▀▄ ▄ ▄█▀▄\n █▄█▄▄█ ▄▀█▀\n █▄▄██ ▀▀██▄▄█ "]]], + ["ancientvolcanomon", [["angry", " ▄▄ \n▄▄ ▄▄ ▄▀██ ▀█▄ \n█ █▄█ █ ▄▄ ▄▀ \n ████▀▄█ ▀▀ ██ \n ███▄▄██ ▄█ ▀█ \n █▀ ▀█▀ █ ██▄▀ \n ▀▄▄▄▄█▄▄▄▀▀█ \n █▄█▄█ █▄█▄█ "], ["attack", " \n ▄▄▄▀█▄ \n█▀▄ █▀▄▀ ▀▀ ▀█ \n▀▄███▄▀▄ ██ █▄ \n ████▀██ ▄ ██ \n ███▄▄██ ▄▀█▄ █ \n ▀▄▄▄▄▀ ▀▄▀▀█ \n █▄█▄█▀▀▀▀█▄█▄█ "], ["eat_1", " \n ▄▄▄▀█▄ \n█▀▄ █▀▄▀ ▀▀ ▀█ \n▀▄███▄▀▄ ██ █▄ \n ████▀██ ▄ ██ \n ███▄█▄█ ▄▀█▄ █ \n ▀▄▄▄▄▀ ▀▄▀▀█ \n █▄█▄█▀▀▀▀█▄█▄█ "], ["eat_2", " ▄▄ \n▄▄ ▄▄ ▄▀██ ▀█▄ \n█ █▄█ █ ▄▄ ▄▀ \n ███▀▀▄█ ▀▀ ██ \n ██▀▀███ ▄█ ▀█ \n █ █▀ █ ██▄▀ \n ▀▄▄██▄▄▄▀▀█ \n █▄█▄█ █▄█▄█ "], ["happy", " ▄▄ \n▄▄ ▄▄ ▄▀██ ▀█▄ \n█ █▄█ █ ▄▄ ▄▀ \n ████▀▄█ ▀▀ ██ \n ███▄█▄█ ▄█ ▀█ \n █ █▀ █ ██▄▀ \n ▀▄▄██▄▄▄▀▀█ \n █▄█▄█ █▄█▄█ "], ["injured_1", " \n \n ▄▄▄▀█▄ \n█▀▄ █▀▄▀ ▀▀ ▀█ \n▀▄███▄▀▄ ██ █▄ \n ███ ▀██ ▄▄ ██ \n ███████ █▄▀▀▄▀ \n█▄█▄▄▄█▄▄▄█▄█▄█ "], ["injured_2", " \n \n ▄▄ \n▄▄ ▄▄ ▄▀██ ▀█▄ \n█ █▄█ █ ▄▄ ▄▀ \n ███▀█▄█ ▀▀ ██ \n ███▄▄██ ▄█▀▀██ \n██▄▄▄▄█▄▄▄█▄█▄█ "], ["refuse", " \n ▄▄▀█▄ \n▄▄ ▄▄ ▄▀▀▀ ▀█ \n█ █▄█ █ ██ █▄ \n █████▄█ ▄ ██ \n ███▀ ██ ▄▀█▄ █ \n █▀▀▀▀██ ▀▄▀▀█ \n ▄████▄▀▀▀█▄█▄█ "], ["sleep_1", " \n ▄▄ \n▄▄ ▄▄ ▄▀██ ▀█▄ \n█ █▄█ █ ▄▄ ▄▀ \n █████▄█ ▀▀ ██ \n ████▀▀█ ▄█ ▀█ \n▄█▀▀▀▀█▀ █▄▀▀▄▀ \n█▄████▄▄▄▄█▄█▄█ "], ["sleep_2", " \n \n ▄▄▄▀█▄ \n█▀▄ █▀▄▀ ▀▀ ▀█ \n▀▄███▄▀▄ ██ █▄ \n ███████ ▄▄ ██ \n▄████▄▄█ █▄▀▀▄▀ \n██▄▄▄▄█▄▄▄█▄█▄█ "], ["walk_1", " ▄▄ \n▄▄ ▄▄ ▄▀██ ▀█▄ \n█ █▄█ █ ▄▄ ▄▀ \n █████▄█ ▀▀ ██ \n ███▀ ██ ▄█ ▀█ \n █▀▀▀▀█▀ █ ██▄▀ \n ▀█▀▀▄▄▄▄▀▀█ \n █▄█▄█ █▄█▄█ "], ["walk_2", " \n ▄▄▄▀█▄ \n█▀▄ █▀▄▀ ▀▀ ▀█ \n▀▄███▄▀▄ ██ █▄ \n ████▀██ ▄ ██ \n ███▄▄██ ▄▀█▄ █ \n ▀▄▄▄▄▀ ▀▄▀▀█ \n █▄█▄█▀▀▀▀█▄█▄█ "]]], + ["ancientwisemon", [["angry", " ▄ ▄▄▄▄▀▄▄▄▄▄ ▄\n ▀▄▀ ▀▀▀ ▀▄▀▀ \n █▀█▀███▀█▀█ \n █ █▄▄█▄▄█ █ \n ▄▀█▄▄▄▄▄█▀▀▄ \n ▄▀▀█▄▀▀▀▄██▀▀▄ \n█▄▄█▀▄█▄██ ▀█▄▄█\n █▄▄█▄▄▄▄█▄▄█ "], ["attack", " ▄ \n ▀▄▀█▀█▄█▀▀█▀▄▄▀\n ▄█▄▄▄▄▄▄▄▄█ \n █ █▀███▀█ █ \n ▀▄█▀▀▀▀▀█▄█ \n ▀▄▄█▄▄▄█▄▄▄▀ \n █ █ █ █ █ █ \n █▄█▄█████▄▄█▄█ "], ["eat_1", " ▄ \n ▀▄▀█▀█▄█▀▀█▀▄▄▀\n ▄█▄▄▄▄▄▄▄▄█ \n █ ▀▄▀█▀▄▀ █ \n ▀▄█▀▀▀▀▀█▄█ \n ▀▄▄█▄▄▄█▄▄▄▀ \n █ █ █ █ █ █ \n █▄█▄█████▄▄█▄█ "], ["eat_2", " ▄ ▄▄▄▄▀▄▄▄▄▄ ▄\n ▀▄▀ ▀▀▀ ▀▄▀▀ \n █▀█▀███▀█▀█ \n █ █▀▀▀▀▀█ █ \n ▄▀█▄███▄█▀▀▄ \n ▄▀█▄▀▀▀▄██▀▄ \n ▀▄▀▄█▄██ ▀▄▀ \n █▄▄█▄▄▄▄█▄▄█ "], ["happy", " ▄ ▄▄▄▄▀▄▄▄▄▄ ▄\n ▀▄▀ ▀▀▀ ▀▄▀▀ \n █▀█▀███▀█▀█ \n▄▀█ ▄█▄█▄█▄ █▀▀▄\n▀▄ ▀█▄▄▄▄▄█▀█ ▄▀\n ▀▀█▄▀▀▀▄██▀▀ \n ▄▀▄█▄██ ▀▄ \n █▄▄█▄▄▄▄█▄▄█ "], ["injured_1", " \n ▄ ▄▄▄▄▀▄▄▄▄▄ ▄\n ▀▄▀ ▀▀▀ ▀▄▀▀ \n █▀██▀█▀██▀█ \n █ █▄▄█▄▄█ █ \n ▄▀▀▄ ▄▀▀▀▄ \n ▄▀█▀▀▀▀▀██▀▄ \n █▄██▄███▄███▄█ "], ["injured_2", " \n ▄ \n ▀▄▀█▀█▄█▀▀█▀▄▄▀\n ▄█▄▄▄▄▄▄▄▄█ \n █ █▀ █ ▀█ █ \n ▀▄█▀▀▀▀▀█▄█ \n █▄▄█▄▄▄█▄▄▄█ \n █▄▄█▄▄█▄▄██▄▄█ "], ["refuse", " ▄ \n ▀▄▀█▀█▄█▀▀█▀▄▄▀\n ▄█▄▄▄▄▄▄▄▄█ \n █ █ ▀█▀ █ █ \n ▀▄█▀▀▀▀▀█▄█ \n ▀▄▄█▄▄▄█▄▄▄▀ \n █ █ █ █ █ █ \n █▄█▄█████▄▄█▄█ "], ["sleep_1", " \n ▄ ▄▄▄▄▀▄▄▄▄▄ ▄\n ▀▄▀ ▀▀▀ ▀▄▀▀ \n █▀███████▀█ \n █ █▄▄█▄▄█ █ \n ▄▀▀▄ ▄▀▀▀▄ \n ▄▀█▀█▀▀█▀█▀▄ \n █▄█▄█████▄▄█▄█ "], ["sleep_2", " \n ▄ \n ▀▄▀█▀█▄█▀▀█▀▄▄▀\n ▄█▄▄▄▄▄▄▄▄█ \n █ █▀▀█▀▀█ █ \n ▀▄█▀▀▀▀▀█▄█ \n █▄▄█▄▄▄█▄▄▄█ \n █▄▄█▄█▄▄█▄██▄█ "], ["walk_1", " ▄ ▄▄▄▄▀▄▄▄▄▄ ▄\n ▀▄▀ ▀▀▀ ▀▄▀▀ \n █▀███████▀█ \n █ █▄███▄█ █ \n ▄▀▀▄ ▄▀▀▀▄ \n ▄▀█▀█▀▀█▀█▀▄ \n ▀▄▀▄█▄▄█ ▀▄▀ \n █▄▄█▄▄▄▄█▄▄█ "], ["walk_2", " ▄ \n ▀▄▀█▀█▄█▀▀█▀▄▄▀\n ▄█▄▄▄▄▄▄▄▄█ \n █ █▀███▀█ █ \n ▀▄█▀▀▀▀▀█▄█ \n ▀▄▄█▄▄▄█▄▄▄▀ \n █ █ █ █ █ █ \n █▄█▄█████▄▄█▄█ "]]], + ["andromon", [["angry", " ▄▄▄▄▄▄ \n ▄▀▀ ▀▄ \n ▄██▄ ▄▄█▀ █▄ \n▄█ ▀▀▀▀▀ ▄▀█▀ ▀▄\n█▄▀▄▀▄▀▄▄▀▄█▀▄▄▀\n█ ▀▄▄▄▄▄▄▄▀▄ █ \n█ ▄█▄▄▄█ ▄█▄ █ \n▀▄▄▄█▄▄█▀▀█▄▄▄██"], ["attack", "▄▀▀▀▄ ▄▄▄▄▄▄▀▀▀▄\n█ ▄▄▀▀ █ █\n█ ▄██▄▄▄▀█▀ █▀ █\n█ █▄ ▀▀▀▀ ███ █\n▀▄███▄██▄███▀█▄▀\n▄▀█▀███▀██▀ ▄█▀ \n▀▄▄▄▄▄▄▄▄▄▄▀ ▀▄ \n █▄▄▄▄██▀▀▄▄▄▄▄█"], ["eat_1", " ▄▄▄▄▄▄ \n ▄▄▄▀▀ ▀▄ \n█ ▄██▄▄▄▀█▀ █ \n█ █▄ ▀▀▀▀ ███ ██\n▀▄███▄██▄███▀█▄█\n▄▀█▀███▀██▀ ▄▀ █\n▀▄▄▄▄▄▄▄▄▄▀▀ ▄█ \n █▄▄▄▄██▄▄▄██▄▄█"], ["eat_2", " ▄▄▄▄▄▄ \n ▄▀▀ ▀▄ \n ▄█████▀▄ █▄ \n █▀ ▀▀▄▀█▀ ▀▄\n██▀▄▀▄▀▄▀ ▄▀▀▄▄▀\n█ ▀▄▄▄▄▄▄▀ █ \n▀▄ █ ▄▀▄ \n ███▄█▄█▀▀▀█▄▄▄█"], ["happy", "▄▀▀▀▄ ▄▄▄▄▄▄▀▀▀▄\n█ ▄▄██▄▄▄ █ █\n█ ▄█▀▀▀▀▄█▄ █▀ █\n█ █ ███ █\n▀▄██▄██▄████▀█▄▀\n▄▀█▀███▀██▀ ▄█▀ \n▀▄▄▄▄▄▄▄▄▄▄▀ ▀▄ \n █▄▄▄▄██▀▀▄▄▄▄▄█"], ["injured_1", " \n \n ▄▄▄ ▄▄ \n█ ▄▄▀▀▀▀▀▀▄▀ █ \n █ █▄▀█ \n█▀█████▀ ▄ █ █ █\n▄▀▄▄▄▄▄▄▀ █ ▀▀▄▀\n▀▄▄▄▄▄▄▄▄██▄▄▄▄█"], ["injured_2", " \n \n ▄▄▄ ▄▄ \n▄▀▄▄▀▀▀▀▀▀█ ▀▄ \n █ █▄▀█ \n█▀█████▀ ▄ █▄█▄█\n▄▀▄▄▄▄▄▄▀ █ █\n▀▄▄▄▄▄▄▄▄██▄▄▀▀ "], ["sleep_1", " ▄▄▄▄▄█▀▀▀▀▀▀█\n ▄▀ █ ▀▀█\n█ ▄▄▄ ▄▀█▀▀▄▀▀█\n█▀▀▀ ▄▀█ █ █ █\n▀█▀▀▀ ▄██▄▄█▄▄█\n█ █▀▀▀▀█ █\n█ ▄█▀▀██▄█▄█▄█▄█\n▀▄▄█▀▀█▄▄▄▄▄▄▄▄█"], ["sleep_2", " ▄▄▀▀▀█▀▀▀▀▀▀█\n █ ▄▄▄ █ ▀▀█\n▄▀██▀▀ ▄██▀▀▄▀▀█\n█ ▄ ▄▄█▀ █ █ █\n▄▀█▀▀▀ ▄██▄▄█▄▄█\n█ █▀▀▀▀█ █\n█ ▄█▀▀██▄█▄█▄█▄█\n▀▄▄█▀▀█▄▄▄▄▄▄▄▄█"], ["walk_1", " ▄▄▀▀▀▀▀▀▄ \n █▄ ▄▄▄▄ █ \n█▀▀███▄▀▄▄▄█▀▀▀▄\n▀█▄ ▄ ▄▄█ █ ▀▄▄▀\n█▄▀▀▀▀▀▀ █▀▄▀ █\n█ ▀█▀▀▀█▀ █▀▀ █\n█ ▀▀█▄▄▀▀▀▀█▄▄█▄\n▀▄▄█▄▄▄█▀▀▀▄▄▄▄█"], ["walk_2", " ▄▄▀▀▀▀▀▀▄ \n █▄ ▄▄▄ █ \n▄▀█▀▀███▄▀▄▄▄█ \n▀▄██▄ ▄ ▄▄█ █ ▀▄\n█ █▀▀▀▀▀▀ █▀▄▄▀\n▀▄▄▄▀▀▀█▀▀▀█ █ \n █▄▄▄▀▀█▀▀▀ █▄\n █▄▄▄▄█▀▀▄▄▄█▄█"]]], + ["angemon", [["angry", " █▀▄ \n ▄▀▀▀▀▀▀█▄ ▀▄ \n █ ▄█ ▄▀ \n █ ▄ █ ▀█ ▀█\n ▄█▀▀█▀▀ █▄▀▀▄▄▀\n █ ▀▄█▄▄██▄█▄ ██\n █▀▄▄█▄▄▄▄█▄▄▀ \n █▄▄█▄▄▀▄▄▄▄▄█ "], ["attack", " ▄▀▀▀▀▀▀▄█▀▄ \n █ ▄▄█▀ █\n▄▄ █▀▀ █ █ ▄▀\n█ ▀█▄▄▄▄█▀█ ▄▀▀█\n▄▀▀ ▀▄▄█ █▀ ▄▄▀\n█▄▀█▀▀▀ █▀▀▀▄ \n ▄▄▀█▀▀█▀ ▀▄█▄ \n█▄█▄█▄▄▀█▄█▄▄█ "], ["eat_1", " ▄▀██▀▀▀▄ █▀▄ \n █▄█▄▄▄ █▀ █\n ▀█████▀▄█ █▄\n ▄████▀ █ ▄▀ █\n▄▀▀▄▄▄▄▄▀▀▀▀▀▄▄▀\n█ ▀█ █▀ █ █\n █▀█▀▀█▀▀▀▀█▀▄▀ \n█▄▄█▄▄▀▄▄▄▄▄█ "], ["eat_2", " ▄▄▄▄▄▄ █▀▄ \n▄▀ ▀▄▀ █ \n█ ▄ ▄▀█ ▄▀ \n█▄▄█▄▄ █ █ ▄▀▀█ \n▀▄ █ ▄█▄▀█ ▄▀ \n█ █▀█▀▀▄▄ █▀▀█ \n▀▄▄▄▀▄▄▄▄▄▀▄▄▀ \n█▄▄█▄▄▀▄▄▄▄▄█ "], ["happy", " ▄▀▀█▀▀▀▄ █▀▄ \n █ ▀█▀▀ ▄▄█ █ \n ▀▄▄▄▄▄▀▄ █ ▄▀ \n ▄█▄▄▄▄▀ █ ▄▀▀█\n ▄▀▄▄▄▄▄▀▀▀█▄ ▄▀\n█ ▄ █▄ █▀▀█\n▀▄▀█▀▀█▀▀▀▄▄█▄▀ \n█▄▄█▄▄▀▄▄▄▄▄█ "], ["injured_1", " \n ▄▀▀▀▀▀▀▄▄▄ \n █ █ ▀▀▄ \n █ ▄▀▀█ ▄ █\n ▀█▀ █ ▄▄▀█▄▀▄█\n ▄▀█▀▀▀▀ █▄▄▀\n █▄▀▄▄▄▄▄█ █▄ █\n █▄▄█▄▄█▄█▄▄▄█▀█"], ["injured_2", " \n ▄▄▄▄▄▄ \n ▄▀ ▀█▀▄▄ \n █ ▄▄█ ▀▄\n █▄▄ ▄▀ ███▄ █\n ▄▀▄▄▄█▄▀▀ █▄█▀\n █▄▀▄▄▄▄▄█ █▄ █\n █▄▄█▄▄█▄█▄▄▄█▀█"], ["sleep_1", "▄▄ ▄▄▄▄▄▄ \n█ ▀█▀▀▄▀▄▀▄█▄▄▀▄\n█▀██ ▀█ █ █ █\n█▄▄█▄ █▄▄█ ▄▄ █\n█▀ ▄▀▀ ▀▀▄ ▀▀█\n▄▀ ▄▀\n█ ▄ ▄█ ▄▄ █\n ▀▀▀ ▀▀ ▀▀ ▀▀ "], ["sleep_2", " ▄▄ ▄▀█▀█▀▀▄ \n█▀▄█ ▄█ █ ▀█▀▀ █\n█▄▄█ █ ▀▄ ▀ █\n█▄▀▀▀▄█▄▄▀▀▀▀▀▄█\n█ ▀ ▀ ▄▀\n▀▄ █\n█ ▄▀▄▄█▄ ▄▀\n ▀▀▀▀ ▀▀▀ "], ["walk_1", " ▄▀▀▀▀▀▀▄ █▀▄ \n █ █ █▀ █ \n █▀▀█▀▀▀ ▄▀▄ ▄▀ \n █▀▄▄▄▄▀█▄▄▀▄█▀█\n ▄▀▄▄▄▄▄▄▀ █▀ ▄▀\n█ ▄ ▀ █▄ █▀▀█\n▀▄▀█▀▀█▀▀▀▄▄█▄▀ \n█▄▄█▄▄▀▄▄▄▄▄█ "], ["walk_2", " ▄▄▄▄▄▄ █▀▄ \n ▄▀ ▄ ▀█ █ \n █▄▄█▄▄▄ █ ▄▀ \n █▄ ▀ ▄▄▀ █ ▀█ \n▄▀▄▀▀▀▀ ▀█▀▀▄▄▀ \n█ ▄▀▀█▀▀▀██▄ ██ \n █▀▄▄▄▄▄▄▄█▄▄▀ \n█▄▄█▄▄▀▄▄▄▄▄█ "]]], + ["angewomon", [["angry", " \n ▄▀▀▀▀▄▄▀█ \n ▄▀ ▄ ▀▄▄█ ▄▄\n █ ▀█▀ ▄█ ▀ █\n ▀█▀▀▀▀▀▀▄▀▄▄▀ \n █ ▀▄▄▄▀▀ █ ▀▄\n ▄▀▄▄ █ ▄▄▄█ ▀▄▀\n █▄▄▄███▄▄▄▄█▄▄█"], ["attack", " ▄▀█▀▀▀▀▄▀▀▀█ \n█▀█▀▀ ▀▄▄█▄ \n ▀████▄▄▀█ ▀▄ \n █▀ █ █▀▀▄▄█ \n █▀▀▀▀ ▄█▀▄▄ ▀▄ \n█ █▀█▀▀▄▄ █▀▄▀ \n▀▄▄▄▀▄▄▄▄▄▀█ █ \n █▄▄▄▀▀▄▄▄▄▄█▀▀ "], ["eat_1", " ▄▀▀█▀▀▀▄▀▀█ \n █ ▀█▀▀ ▄█▀▄ \n █▄▄▄▄▄▄▀ █▄ ▀▄\n▄▀ █████ █ █ █\n▀▄ ▀▄▄▄▄▄▀▀█ ▀▄\n ▀█ ▄ ▀▄▀▄▀\n ▄▀█▀▀█▀▀▀▄▄▀ ▀▄\n ██▄▄▄▀▀▄▄▄▄█▀▄█"], ["eat_2", " ▄▄▄▄ ▄▄ \n ▄▀▄ █▀ █ \n█ ▄█▄ ▀█ ▀▀▄ \n█▄▄█▄▄▄▀█ ▀▀▄ █ \n █▀▀▄▄▄▀▀▀▄ █ █\n█ ▄▀ ▄ ▄█▀▄▀▄\n▀▄▄▀▄▄▄▄▀▄▄█ ▀▄▀\n █▄▄▄▀▀▄▄▄▄▄▀▄▄▀"], ["happy", " ▄▀▀▀▀▀▀▄▀▀█ \n █ ▄█▄ █▄▀ \n █▄▄█▄▄▄▀█ ▀▀▄ \n▄▀▀▄▀▀▀▀▄▀▀▀█▄ █\n▀▀▄ ▀▀▀▀ █▀▄ ▀▄\n █▄ █ █ █\n █▄▀▀▀█▀▀ █▄▀ █ \n █▄▄▄▀▀▀▄▄▄▄█▄▄█"], ["injured_1", " \n ▄▀▀▀▀▀▀▄▀▀█ \n█ █ █▄ \n█ ▄ ▄▀▀█ ▀▄ \n█▀█▀ █ ▄▄▀█▀▄█ \n▄▀█▀▀▀▀ █▄ █ \n█▄▀▄▄▄▄▄█ █ ▀█ \n█▄▄█▄▄█▄█▄▄▄█▄▄█"], ["injured_2", " \n ▄▄▄▄▄▄ \n▄▀ ▄▀▀▀█ \n█ █▄▄▀▀▄ \n█▄█▄ ▄▀ █▄▄ █ \n▀▄█▄▄█▄▀▀ ▀▄▀▀▄ \n█▄▀▄▄▄▄▄█ █▀▄█ \n█▄▄█▄▄█▄█▄▄▄█▄▄█"], ["sleep_1", " \n ▄▄▄▄▄▄ \n ▄▀ ▀▄▀█ \n █ ▄ █ ▄█ \n █ ▀█▀ ▄▀█ ▀▄ \n▄▄▀▄█▄▄█▀█▀█▄ █\n█ ▀▄▄▄▄ █ █▀▀▄\n█▄▄▄█▄▄██▄▄▄██▄█"], ["sleep_2", " \n ▄▄▄▄▄▄ \n▄▀ ▀▄▀█ \n█ █ █ ▄▄\n█ ▄█▄ ██▀ ▀▀ █\n▄█▄█▄▄▄█▀█▀▄▄██ \n█ ▀▄▄▄▄ █ █▄ █\n█▄▄▄█▄▄██▄▄▄█▄█▀"], ["walk_1", " ▄▀▀▀▀▄▄▀█ \n ▄▀ █ ▀▄▄█ \n █ ▀█▀ ▄▄▀ ▀▄ \n ▀█▀▀▀▀▀▄▀▀▄ ▀▄\n ▄▀▀▄▄▄▀▀▀▄ ▀▄▀\n █ █ █▄ █▄ █\n ▄▀█▀▀█▀▀▀▄▄█ ▀▄\n ██▄▄▄█▀▄▄▄▄█▀▄█"], ["walk_2", " ▄▄▄▄ ▄▄ \n ▄▀▄ █▀ █ \n █ ▄█▄ ▀█▀▄▀█\n █▄▄█▄▄▄▀█▄ █\n ▄▀▀▄ ▄▀▀▀█▄▀ \n█ ▀█ ▀▀▀ █▀ █ ▀▄\n ▀█▀▀▀█▀▀▀▀█▄▀▄▀\n █▄▄▄█▀▀█▄▄▄▄█▄█"]]], + ["angewomon_x", [["angry", " ▄▄▄▄▄▄▄ \n █ ▄ ▀▀▄▄ \n █ ▄█▄ █ \n ▀▄▄█▄▄▄ █ ▄▀█\n █▀▀▄ ▄▀▀▀█ ▄▀\n ▄▀▀▄█▀█▄▄▀▀▄▀ █\n █▄▄▄▀▄▀▄▄▄▄█▄▀▄\n█▄▄▄▄▄▀▀▄▄▄▄█▄▀▀"], ["attack", " █▀▀█▀▀▀▄▄ \n █▄█▄ ▀█ \n ▄ ▀▄█▄▄▄ ▄▀█\n ▄█▀ █▄ ▄▀▀▀█ \n ▀█ ▀▄ ▀█ ▄▀▀▄█\n▀▀█▀█▀██▀▀▀▀▄▄█ \n ██ ▀█▀ ▄▄ ▀▄█\n ▀█ █▄▄▀ ▀▄▄▄█"], ["eat_1", " █▀▀▀▀█▀▀▄ \n █ ▀█▀▀ █ \n █▄▄▄▄▄▄ █ ▄▄\n▄▀ ████▀▄█▄▄▀ █\n▀▄ ▀█▀▀▀▄▀ ▄█▄▀▄\n ▀▀█▀▀█ ▄▀ █ ▄▀\n ▄█▀ ▄ ▀▀▄▄▀▀▄ \n █▄▄▄▀▀▄▄▄█▀▀▀ "], ["eat_2", " ▄▄▄▄▄▄▄ \n █ ▀▀▄▄ \n █ █ █ \n ▀▄▀█▀ ▄ █ ▄▀█\n █▀▄▀▀▀▀▄▀▀▀█ ▄▀\n █ ▀█▀█ ▄▀█▀ █\n ▀▄█▄▀▄▀▄▀▄▄█▄▀ \n █▄▄▄▀▀▄▄▄█▀▀▀ "], ["happy", " █▀▀▀▀▀▀▄▄ \n ▀▄ █ ▀█ \n █ ▀█▀ ▄▀ ▄▀█\n ▄▄▀███▀▀▄█▄█ ▄▀\n█ ▀█▄▄▄▄▀ █▄▀ █\n ▀▄█ █ █▄█▀▀▄▄▀ \n ▄█▀ ▄ ▀▀██ ▄█ \n █▄▄▄▀▀▄▄▄█▀ "], ["injured_1", " \n █▀▀▀▀▀▀▄▄ \n ▀▄ ▀█ \n █ ▄ ▄▀ ▄▄\n ▄▄█▀█▀▀ ▄█▄▄▀ █\n ▀▄ █▀▀▀█ ▄▄█▄▀▄\n ▄▀▀█▀▀▄▀ █▄ ▄▀\n █▄▄▄████▄▄▄██ "], ["injured_2", " \n ▄▄▄▄▄▄▄ \n █ ▀▀▄▄ \n █ █ \n ▀▄▄█▄▄ █ ▄▀█\n █▀▀▄█▄▄▄▀▀▀█ ▄█\n ▄█▀▀▄▄▄▀▄▀▀█▀▄▀\n█▄▄▄██████▄▄▄█▄▄"], ["sleep_1", " \n ▄▄▄▄▄▄▄ \n █ ▀▀▄▄ \n █ █ █ ▄▄\n ▀▄▀█▀ ▄█▄▄▀ █\n ▄█▀▀▀▀█▀ ▄█▄▀▄\n █ ▀█▀█ ▄▀ ▀▄█\n █▄▄▄▄█▄██▄▄▄▄██"], ["sleep_2", " \n █▀▀▀▀▀▀▄▄ \n ▀▄ ▄ ▀█ \n █ ▄█▄ ▄▀ ▄▄\n █▄█▄▄▄█▀▄▄▀ █\n ▄▄▀▄▄▄▀ ▄█▄▀▄\n █ ▀█ █ ▄▀ ▀▄█\n █▄▄▄▄█▄██▄▄▄▄██"], ["walk_1", " █▀▀▀▀▀▀▄▄ \n █ █ ▀█ \n █ ▀█▀ ▄▀ ▄▄\n ▄▄█▀▀▀▀▀▄█▄▄▀ █\n ▀▄ ▀▄▄▄▀ ▄█▄▀▄\n ▄▀▄ █ █ ▄▀ █ ▄▀\n ▀▄█▀ ▄ ▀▀▄▄▀▀▄ \n █▄▄▄▀▀▄▄▄█▀▀▀ "], ["walk_2", " ▄▄▄▄▄▄▄ \n █ ▄ ▀▀▄▄ \n ▀▄ ▄█▄ █ \n ▀▄▄█▄▄▄ █ ▄▀█\n █▀▀▄ ▄▀▀██ ▄▀\n ▄▀▄ █▀█ ▄▀ █▀ █\n ▀▄▀▀▀▄▀▀▀▄▄█▄▀ \n █▄▄▄▀ ▀▄▄▄█▀▀▀ "]]], + ["ankylomon", [["angry", " ▄██▄ \n ▄▄▄▄▀█ ▀██▀▄ \n ▄▀ ▄ ▀█ ▄▄ ▄█\n█ ▀▀ ██▀ ▀█▀█\n████▄ █ ▄ ▄ ▀▄\n▀█▀▀▀▄█ ▀ ▀ ▄▄▄█\n ▄▀██▀▀█▄█▄█▄ ▀▄\n█▄▄█▄█▄█ █▄█▄█"], ["attack", " ▄▄ \n ████ \n ▄ ▀▀ ▀▄\n ▄▀▀▄▀ █▄█▀▄▄██\n▄▀ ▄▀ ▀▄▀▀ ▀▄▀\n█ ▀▀ █ ▄▀▄▀▄▄ █\n █▄▄▄▀▀▄ ▄ █▄ ▀█\n█▄▄█▄█▄█▀▀▀█▄█▄█"], ["eat_1", " ▄▄ \n ████ \n ▄ ▀▀ ▀▄\n ▄▀▀▄▀ █▄█▀▄▄██\n▄▀ ▄ ▀▄▀▀ ▀▄▀\n█ ▀ ▀ █ ▄▀▄▀▄▄ █\n █▄▄▄▀▀▄ ▄ █▄ ▀█\n█▄▄█▄█▄█▀▀▀█▄█▄█"], ["eat_2", " ▄██▄ \n ▄▄▄▄▀█ ▀██▀▄ \n ▄▀ ▄▀ ▀█ ▄▄ ▄█\n█ ▀▀ ██▀ ▀█▀█\n████▄ █ ▄ ▄ ▀▄\n▀█▀▀▀▄█ ▀ ▀ ▄▄▄█\n ▄▀██▀▀█▄█▄█▄ ▀▄\n█▄▄█▄█▄█ █▄█▄█"], ["happy", " ▄██▄ \n ▄▄▄▄▀█ ▀██▀▄ \n ▄▀ ▄ ▀█ ▄▄ ▄█\n█ ▀ ▀ ██▀ ▀█▀█\n████▄ █ ▄ ▄ ▀▄\n▀█▀▀▀▄█ ▀ ▀ ▄▄▄█\n ▄▀██▀▀█▄█▄█▄ ▀▄\n█▄▄█▄█▄█ █▄█▄█"], ["injured_1", " ▄▄ \n ████ \n ▄ ▀▀ ▀▄\n ▄▀▀▄▀ █▄█▀▄▄██\n▄▀ ▄ ▀▄▀▀ ▀▄▀\n█ ▀▀ █ ▄▀▄▀▄▄ █\n █▄▄▄▀▀▄ ▄ █▄ ▀█\n█▄▄█▄█▄█▀▀▀█▄█▄█"], ["injured_2", " \n ▄██▄ \n ▀██▀▄ \n ▄▄ ▄▀▄ ▄▄ ▀█ \n ▄▀ ▀▄ ██▀ ▀█▀█\n█ █▄ ▄▀ ▄ ▄▄▀█\n▀▄ ▄▄▀▀▄▀ ▀█▄ ▀█\n████▄█▄█▄█▄█▄█▄█"], ["refuse", " ▄▄ \n ████ \n ▄ ▀▀ ▀▄\n ▄▀▀▄▀ █▄█▀▄▄██\n▄▀ ▄ ▀▄▀▀ ▀▄▀\n█ ▀▀ █ ▄▀▄▀▄▄ █\n █▄▄▄▀▀▄ ▄ █▄ ▀█\n█▄▄█▄█▄█▀▀▀█▄█▄█"], ["sleep_1", " ▄▄ \n ████ \n ▄ ▀▀ ▀▄\n ▄▀▀▄▀ █▄█▀▄▄██\n▄▀ ▄▄ ▀▄▀▀ ▀▄▀\n█ █ ▄▀▄▀▄▄ █\n █▄▄▄▀▀▄ ▄ █▄ ▀█\n█▄▄█▄█▄█▀▀▀█▄█▄█"], ["sleep_2", " \n ▄██▄ \n ▀███ \n ▄▄ ▄▀▄ ▄▄ ▄█\n ▄▀ ▀▄ ██▀ ▀█▀█\n█ ▀▀ ▄▀ ▄ ▄▄▀▄\n▀▄ ▄▄▀▀▄▀ ▀█▄ ▀█\n████▄█▄█▄█▄█▄█▄█"], ["walk_1", " ▄██▄ \n ▀██▀▄ \n ▄▄ ▄▀▄ ▄▄ ▄█\n ▄▀ ▄▀▄ ██▀ ▀█▀█\n█ █▄ ▄▀ ▄ ▄ ▀▄\n▀▄ ▄█ ▀ ▀ ▄▄▄█\n ▄▀██▀▀█▄█▄█▄ ▀▄\n█▄▄█▄█▄█ █▄█▄█"], ["walk_2", " ▄▄ \n ████ \n ▄ ▀▀ ▀▄\n ▄▀▀▄▀ █▄█▀▄▄██\n▄▀ ▄▀ ▀▄▀▀ ▀▄▀\n█ ▀▀ █ ▄▀▄▀▄▄ █\n █▄▄▄▀▀▄ ▄ █▄ ▀█\n█▄▄█▄█▄█▀▀▀█▄█▄█"]]], + ["antylamon_deva", [["angry", " ▄▄▄ ▄▄▄▄▄\n ▄▄ ▄█▄█▀▀ ██▀\n ▀▄▀ ▄ ▄▀▀▀▀ \n █ ▀▀ ▄▀▀▄ \n ▄█▀▀▀▀ ▄▀▀▄ \n ▄▀ █▄▄▄▄█▀█ ▀▄ \n▄▀ ▄▀▀▀▀▀▄█▄ █\n█▄▄█▄▄█▀▄▄▄█▄▄▄▀"], ["attack", " ▄▀██▀▀██\n █▀▄▀▀▀█ ▄▀▀ \n ▄▀ ▄█ █▄ \n ▄▀▄█▄▄▄▄▄█ █ \n█ ▄▄█▀ \n▀▄ ▀████ \n ▀█▀▀▀▄▄ ▀▄ \n █▄▄▄▀ ▀█▄▄█ "], ["eat_1", " ▄▀██▄▀▀███\n █▀▄▀▀▀▀ ▄▄▄█▀ \n ▄▀ ▄▀▄ █▄ \n ▀▄▄▄ ▄▀ █ \n ▄██▄▀ ▄█ ▀▄ \n ▄▀ ▀▄▄███ █ █ \n▄▀ █ ▄▄ ██ █\n█▄▄█▄▄▀ ▀▄▄▀▄█▄▀"], ["eat_2", " ▄▄▄ ▄▄▄▄▄\n ▄▄ ▄█▄█▀▀ ██▀\n ▀▄▀ ▄ ▄▀▀▀▀ \n █ ▀ ▀▄▀▀▄ \n ▄█▀▀▀▀ ▄▀▄ \n ▄▀ █▄▄▄▄█▀█ ▀▄ \n▄▀ ▄▀▀▀▀▀▄█ █\n█▄▄█▄▄█▀▄▄▄█▄█▄▀"], ["happy", " ▄▄ ▄███▄▀▀▀▀██\n ▀▄▀ ▄ ▄▄▀▀▀▄\n▄▀█ ▀ ▀ █▀█ █\n█ ███ ▄▀ ▄▀ ▄▀ \n ▀▄█▀▀▀ ▄▄▀▀▀ \n ██████ \n ▄▀▀ ▄▄ █ \n ▀▄▄▀ █▄▄█ "], ["injured_1", " \n ▄▀██▄▀▀███\n █▀▄▀▀▀▀ ▄▄▄█▀ \n ▄▀ █▄ █▄ \n ▀▄▄▄▄▄▀ ▄█ \n ▄▀▄ ▄▀ █▄ \n █ ▀█▄▄█ ▀█▄ \n █▄▄▄█▀▄█▄▄▄█▄█ "], ["injured_2", " \n ▄▄▄ ▄▄▄▄▄ \n ▄▄ ▄█▄█▀▀ ██▀ \n ▀▄▀▄ ▄▀█▀▀ \n █ ▀▀ ▄▀ ▄█ \n ▀█▀▀▀ ▄▀ █▄ \n █ ▀▄▄▄█ ▀█▄ \n █▄▄▄█▀▄█▄▄▄█▄█ "], ["sleep_1", " \n ▄▄▄ ▄▄▄▄▄ \n ▄█▄█▀▀ ██▀ \n █▀█ ▄▀██▀ \n █ ▀▀▄▀ ▄▀█ \n █▀▀█▀▀▀ ▄▀ \n ▀▄▄█▄▄▄▀█ \n █▄▄█▄▄█▄▄█ "], ["sleep_2", " \n ▄▀██▄▀▀███\n █▀▄▀▀▀▀ ▄▄▄█▀ \n █ ▄▄ █▄ \n ▀▄▄▄▄▀ ▄▀▄ \n █ ▀▄▀▀▀ ▄▀ \n ▀▄▄█▄▄▄▀█ \n █▄▄█▄▄█▄▄█ "], ["walk_1", " ▄▀██▄▀▀███\n █▀▄▀▀▀▀ ▄▄▄█▀ \n ▄▀ ▄█▀ █▄ \n ▀▄▄▄▄▄▀ █ \n ▄▀▄ ▄█ ▀▄ \n ▄▀ ▀█████ █ █ \n▄▀ █ ▄▄ ██ █\n█▄▄█▄▄▀ ▀▄▄▀▄█▄▀"], ["walk_2", " ▄▄▄ ▄▄▄▄▄\n ▄▄ ▄█▄█▀▀ ██▀\n ▀▄▀ ▄▄ ▄▀▀▀▀ \n █ ▀▀ ▄▀▀▄ \n ▄█▀▀▀▀ ▄▀▀▄ \n ▄▀ █▄▄▄▄█▀█ █ \n▄▀ ▄▀▀▀▀▀▄█ █\n█▄▄█▄▄▀▀▀▄▄█▄█▄▀"]]], + ["anubismon", [["angry", " █▄ █▄ ▄▄ \n ▄███▀█▀▄▀ █ \n █████▄▄█▀▄▀▄ █ \n ▄▀█ ▀█ █▀ █\n ▀▄▀▄▄▄▄█▀▀█▀▄ █\n ▀█▀▀▀██ █▀▄█\n █ █ █ ▀█▀ \n ▄██▀▀██▄ "], ["attack", " ▄ ▄ \n ██▄██▄ █▀▄ \n ▄▄██▀▀▄█▄▀▄ ▀▄ \n ▀█▀▀▀▀██ █▄▀ ▀▄\n ▀█▀▀▄█▄▀▄▄ █\n ▄▀▄████ ▀▄ █ █\n █ ▄▀▄ ▄▀█ █ ▀▀\n ▄██▄▀▀▀▄▄██▄ "], ["eat_1", " ▄ ▄ \n ██▄██▄ █▀▄ \n ▄▄██▀▄▀█▄▀▄ ▀▄ \n ▀█▀▀▀▀██ █▄▀ ▀▄\n ▀█▀▀▄█▄▀▄▄ █\n ▄▀▄████ ▀▄ █ █\n █ ▄▀▄ ▄▀█ █ ▀▀\n ▄██▄▀▀▀▄▄██▄ "], ["eat_2", " █▄ █▄ ▄▄ \n ▄███▀█▀▄▀ █ \n ████▄▄██▀▄▀▄ █ \n █ ▄█ █▀ █\n █▀████▀▄▀▀▄ █\n ▄▀ █▀▀▀█▄ ▀▄▀▄█\n ▀▄█ █ █ ▀▄▄▀ \n ▄██▀▀██▄ "], ["happy", " █▄ █▄ ▄▄ \n ▄██▀██▀▄▀ █ \n ████▄█▄█▀▄▀▄ █ \n █ ▄█▄▀▀▄ █\n █▀████▀ ▄▀▄ █\n ▄▀ █▀▀▀██▀ ▀▄█\n ▀▄█ █ █ █ \n ▄██▀▀██▄ "], ["injured_1", " \n \n █▄ █▄ █▀▄ \n ▄██▀██▀█▄ ▀▄ \n █████▄▄█▀▄▄▀▄▀▄\n ▀▄▄▄▄▀█▄█▄ ▀ █\n ▄▀▀▄▀█▀█▄ ▀█ ▄█\n █▄█▄█▄▄▄█▄▄█▀▀ "], ["injured_2", " \n \n ▄ ▄ ▄▄ \n ██▄██▄▄▀ █ \n ▄▄███ ▀█▄▀▀▄ █ \n ▀█▀▀▀▀██▄██ █ █\n ▄▀█▀██▄█ ▀█ █\n █▄▄█▄█▄██▄▄█▄█▀"], ["refuse", " ▄ ▄ \n ██▄██▄ █▀▄ \n ▄▄███▀ █▄▀▄ ▀▄ \n ▀█▀▀▀▀██ █▄▀ ▀▄\n ▀█▀▀▄█▄▀▄▄ █\n ▄▀▄████ ▀▄ █ █\n █ ▄▀▄ ▄▀█ █ ▀▀\n ▄██▄█▄█▄▄██▄ "], ["sleep_1", " \n ▄ ▄ ▄▄ \n ██▄██▄▄▀ █ \n ▄▄███▀▀█▄▀▀▄ █ \n ▀█▀▀▀▀██ █▀ █ █\n █▀██▄█▀█▀▄ █\n ▄▀ █▀█▀█▄ ▀▄▀▄█\n █▄█▄█▄▄▄█▄▄█ "], ["sleep_2", " \n \n █▄ █▄ █▀▄ \n ▄█████▀█▄ ▀▄ \n █████▄▄█▀▄▄▀▄▀▄\n ▀▄▄▄▄▀█▄█▄ ▀ █\n ▄▀▀▄▀█▀█▄ ▀█ ▄█\n █▄█▄█▄▄▄█▄▄█▀▀ "], ["walk_1", " █▄ █▄ ▄▄ \n ▄███▀█▀▄▀ █ \n ████▄▄██▀▄▀▄ █ \n ▀▄▄▄▄▀█ █▀ █\n ▄▀▄▄██▀▄▀▀▄ █\n ▄▀ █▀▀▀█▄ ▀▄▀▄█\n ▀▄█ █ █ ▀▄▄▀ \n ▄██▀▀██▄ "], ["walk_2", " ▄ ▄ \n ██▄██▄ █▀▄ \n ▄▄██▀▀▄█▄▀▄ ▀▄ \n ▀█▀▀▀▀██ █▄▀ ▀▄\n ▀█▀▀▄█▄▀▄▄ █\n ▄▀▄████ ▀▄ █ █\n █ ▄▀▄ ▄▀█ █ ▀▀\n ▄██▄▀▀▀▄▄██▄ "]]], + ["apemon", [["angry", " ▄▄▄▀▀▀█▀ ▄▄▄▄ \n▄▀ █ █▄▀▀ ▄▀▄▄\n▀▄▀ ▀▄▀ ▀▄▀▀▀ █\n █▄ ▄█ █▄▀ █ \n █ ▄▄▄▄ ▄▀▄▄▀ █\n█ ▀▄▄▄▄▄█ █▄ ▄▀\n █▀ ▄▄▄ ▀▀▀▄ █ \n█▄█▄██ █▄█▄█▄█ "], ["attack", " ▄▀█▀▀▀▀▀█▄▄▄▄ \n █ █ ▄▄▄▀▀ ▄█▄▄\n █ ▀ ▄▀█▄▀▀ ▄▀\n █▄▄▄ ▀▀ █ ▄▀ █▄\n ███ █▀▄▄▀ █\n ▄▄▀▀▀ ▄█ █ █ \n█▄▀█▀▀▀▄▀▀▀▀▄▀ \n█▄▄▄█▀█▄█▄█▄▄█ "], ["eat_1", " ▄▄▀▀▀▀▀█▄▄▄▄ \n▄▀▀▄ ▄▄▄▀▀ ▄█▄▄\n▀▄▀ ▀ ▄▀█▄▀▀ ▄▀\n █▄▄▄▄▀ █ ▄▀ █▄\n ▄██▀▀█ █▀▄▄▀ █\n█ ▄▀▀▀ ▄█ █ █ \n █▀█▀▀▀▄▀▀▀▀▄▀ \n█▄█▄█▀█▄█▄█▄▄█ "], ["eat_2", " ▄▄▄▀▀▀█▀▄▄▄▄▄ \n▄▀▄▀ █▄▀ ▄▀ \n▀▄▀▄▀▀▀▀▄ ▄▄█▀▀█\n █ ▄▀ █ ▄ █▄\n █ ▄ █▀▄▄▀ █\n█ █▀▀▀ ▄█ █ █ \n █▀█▀▀▀▄▀▀▀▀▄▀ \n█▄█▄█▀█▄█▄█▄▄█ "], ["happy", " ▄▄▀▀▄▀▀▀▀█▄▄▀█ \n█ ▄▄█ ▄▄█▀ ▄▀█\n▀█ ▄ ▀ ▄ ▀▄▀▀ ▄▀\n █▀ ▀ ▀ ▀ █▀ ▄▀█\n █ ██████ █▄▀▀ █\n▄▀▀▄▀▀▀▀▄█ █ █ \n▀▄▄▀▀▀▀▀ ▀▀▄▀ \n█▄█▄██▀█▄█▄█▄█ "], ["injured_1", " ▄▄▄▄ \n ▄▄▄▀ █▄▄▀▀█▀ \n▄▀ █ ▄▀ █ ▄█\n█ ▄▀▄ ▄▀▀▄ ▄▀▀ █\n █ ▄ ▀ ▄ █▄█▄▀█\n█▄▀▀ ▀▀ █▀▄▄▀▄\n█ ▀▄███▄▄█▀ █\n█▄▄█▄▄▄▄▄█▄▄▄▄▄█"], ["injured_2", " \n ▄▄▀▀▀▀█▄▄▄▄ \n ▄▀█ █▀ ▄█▄ \n█ ▄▀ █ █ ▀▄\n▀▄▀▀▄▄▀ ▀▄█▄▄▄ █\n▄█▄█ █▄ █▀▄▄▀▄\n█ ▀▄▄▄▄▄▄█▀ █\n█▄▄█▄▄▄▄▄█▄▄▄▄▄█"], ["sleep_1", " \n ▄▄▄▄ \n ▄▄▄▀ █▄▄▀▀█▀ \n▄▀ █ █ ▀ █ ▄█\n█ █ ▀▄▀ ▄▄▀▀▀▀ █\n█ █ █ ▄▀ ▄▀▀▄\n █▀▄ ▀▄▀ ▄█▀▀▀▄▀\n█▄█▄█▄█▄▄█▄█▄█▄█"], ["sleep_2", " ▄▄▄▄ \n ▄▄▄▀ █▄▄▀▀█▀ \n▄▀ █ █ ▀ █ ▄█\n█ █ ▀▄▀ ▄▄▀▀▀▀ █\n▄▀█ █ ▄▀ ▄▄▄▀▄\n█ ▀▄ █ █ ▄▀ █\n █▀█▄ █ ▀▄▄▀▀▀▄▀\n█▄█▄██▄█▄█▄█▄█▄█"], ["walk_1", " ▄▄▄▀▀▀█▀ ▄▄▄▄ \n▄▀ █ █▄▀▀ ▄▀▄▄\n▀▄▀ ▀▄▀ ▀▄▀▀▀ █\n █▀▄ ▄▀ █▄▀ █ \n▄▀▄ ▄▄▄ ▄▀▄▄▀ █\n█ ▀█▄▄▄▄█ █▄ ▄▀\n █▀ ▄▄▄▄▀▀▀▄ █ \n█▄█▄██ █▄█▄█▄█ "], ["walk_2", " ▄▄▄▄▄ ▄ \n ▄▀█▀ ▄▀▄▄▀▀█▀ \n█ ▄▀▄ ▄▀▀▄ ▄█▄▀█\n █▄ ▀ ▄ █▀▀ █ \n▄█▀▀ ▀▀ █▄ █▄\n█▀▄████▄ ▄█ ██\n █▀▄▄▄▄▄█▀ ▀▀█▄ \n█▄█▄██ █▄█▄█▄█ "]]], + ["apocalymon", [["angry", " \n ▀▄▄▀ \n▄ ▄ ▄██▄ ▄ ▄\n▀█▀ ▄█▄▄▄▄█▄ ▀█▀\n ▀███▀ ▀████▀ \n ▄▀██▄▄▄███▀▄ \n ▀█▄█▀▀▀▀█▄█▀ \n ▀██▀ "], ["attack", " ▀▄▄▀ ▄ ▄\n ▄██▄ ▀█▀\n▀██ ▄▄ █▄▄▄▄█▄ █\n ▄█▀ ▄██▀█████▀ \n▀▀▀ ██ █████ \n █ ██████▀▄▀ \n ▄▄ █▀▄▄▄▄▀▀▀ \n ▄█▀ ▀▀ "], ["eat_1", " ▄ ▄ ▀▄▄▀ ▄ ▄ \n ▀█▀ ▄██▄ ▀█▀ \n ▀▄█▄▄▄▄█▄▀ \n ▄███▀████▄ \n ███ ████ \n ▄▀██▄ ▄███▀▄ \n ▀█▄█▀▀▀▀█▄█▀ \n ▀██▀ "], ["eat_2", " ▄ ▄ \n ██ \n▄▄ ▄ ▄▀▀▀▀▄ ▄ ▄▄\n▄█▀ ████████ ▀█▄\n ██▄▀▀▀▄███ \n █▄▀██████▀▄█ \n ▀▀▀▄▄▄▄▀▀▀ \n ▀▀ "], ["happy", " █▄█ ▀██▀ █▄█ \n ▀▄ ▄▀▀▀▀▄ ▄▀ \n ▀████████▀ \n ██▄ ▄███ \n █▄▀██████▀▄█ \n ▀▀▀▄▄▄▄▀▀▀ \n ▀▀ \n "], ["injured_1", " \n ▄ ▄ \n ▄██▄ \n ▄█▄▄▄▄█▄ \n ▄████████▄ \n ▄██▀▀▀▀▀███▄ \n▄▄█▄▀██████▀▄█▄▄\n▄█ ▀▀▀▄▄▄▄▀▀▀ █▄"], ["injured_2", " \n \n ▀▄█ \n ▄▀▀▀▀▄ \n ▄████████▄ \n ▄██▀ ▀███▄ \n▄▄█▄▀██████▀▄█▄▄\n▄█ ▀▀▀▄▄▄▄▀▀▀ █▄"], ["sleep_1", " \n \n ▀██▀ \n ▄▀▀▀▀▄ \n ▄████████▄ \n ███▀ ▀████ \n █▄▀██████▀▄█ \n ▀▀▀▄▄▄▄▀▀▀ "], ["sleep_2", " \n ▄▄▄▄ \n ▄██▄ \n ▄█▄▄▄▄█▄ \n ▄███▀████▄ \n ███ ████ \n █▄▀██████▀▄█ \n ▀▀▀▄▄▄▄▀▀▀ "], ["walk_1", " ▀▄▄▀ \n▀█▄ ▄██▄ ▄█▀\n▀▀ ▀▄█▄▄▄▄█▄▀ ▀▀\n ▄███▀████▄ \n ███ ████ \n █▄▀██████▀▄█ \n ▀▀▀▄▄▄▄▀▀▀ \n ▀▀ "], ["walk_2", " ▄ ▄ \n ██ \n▄▄ ▄ ▄▀▀▀▀▄ ▄ ▄▄\n▄█▀ ████████ ▀█▄\n ███▀ ▀████ \n ▄▀██▄▄▄███▀▄ \n ▀█▄█▀▀▀▀█▄█▀ \n ▀██▀ "]]], + ["apollomon", [["angry", " \n ▄▄▀▀▀▀▀▀▀▀▀█ \n █▄▄▀▀▀█▀▄▄ █▄▄\n █▀ ▄██ ▄▀ ▄▀\n █▀▀ ▄▄▀ ▄█▄██\n ▄▀███▀▀███▀▀ ▀█\n ▀▄█▀ ▀▀ ▀▄▄▄▀ \n █▄█▄█▀█▄▄█▄█ "], ["attack", " ▄▄▀▀▀▀▀▀▀▀▀█ \n █▄▄▀▀▀█▀▄▄ █▄▄\n █▀ ▄██ ▄▀ ▄▀\n █████▄▄▄█▄ ▀█\n█ ▄▄███ ▄▀\n▀▄▄▀████▀▀█▀▄▄▀ \n ▀▄▀ ▄▄ ▀▄ \n █▄█▄█ ▀▄▄█▄█ "], ["eat_1", " ▄▄▀▀▀▀▀▀▀▀▀█ \n █▄▄▀▀▀▀▀▄▄ █▄▄\n █▀ ▄▀▄ ▄▀ ▄▀\n █████▄ ▄▀ ▄█▄▀█\n█ █▀▀ ▄█▀▀ ▀█▄▀\n ▀▄▄█▀█▄█▄▄█▀▀ \n ▄▀ ▄▄ ▀▄ \n █▄█▄█ █▄▄█▄█ "], ["eat_2", " ▄▄▄▄▄▄▄▄▄▄ \n ▄▀▀▄▄▄▄▄ ▄▀ \n ▄█▀▀ ▄ ▀█ ▀▀█\n █▄▄▄ ▀ ▀▄▀ ▄ █▄\n ▀▄▄▄▄▄▀▀▄▄███ █\n ▄▀██▀▀█▀▀ ▀█▀ \n █▀▀ ▀▀▀▄▄▄▀▄ \n █▄█▄█▀▀▀█▄▄█▄█ "], ["happy", " ▄▄▀▀▀▀▀▀▀▀▀█ \n █▄▄▀▀▀▀▀▄▄ █▄▄\n █▀ ▄▀▄ ▄▀ ▄▄▀\n▄▀████▄ ▄▀ ▄▀ █\n▀▄ █▀▀▀▄█▄█ ▄█▀\n ▀▄█▀█▄█▀▀█▀ \n ▄▀ ▄▄ ▀▄ \n █▄█▄█ █▄▄█▄█ "], ["injured_1", " \n ▄▄▄▄▄▄▄▄▄▄ \n ▄▀▀▄▄▄▄▄ ▄▀ \n ▄█▀▀ ▄ ▀█ ▀▀█\n █▄▄▄ ▀▀▄▀ ▄ █▄\n ▄█▀▀▀ ▄▀ ▄███▄█\n█ ▀█▀▀█▀▀██▀ █\n▀▄▄▄█▄█▄▄▀▀▄▄▄▀ "], ["injured_2", " \n \n ▄▄▀▀▀▀▀▀▀▀▀█ \n █▄▄▀▀▀▀▀▄▄ █▄▄\n █▀ ▀▄▄ ▄▀ ▄▀\n █▀▀ ▄▄▀▄▄█▄██\n█ ▀█▀▀█▀▀██▀ █\n▀▄▄▄█▄█▄▄▀▀▄▄▄▀ "], ["sleep_1", " \n▄ ▄▄▄▄▄▄▄▄▄▄ \n█ ▄▀▀▄▄▄▄▄ ▄▀ \n█▄█▀▀ ▀█ ▀▀█\n██▄▄ ▀▀▀▄▀ ▄ █▄\n▀█▄▄▄▄▄██▄████▄█\n█ ▀▄ ▀█ ██▀ █\n▀▄▄▄█▀▀▀▀▀▀▄▄▄▀ "], ["sleep_2", " \n ▄▄▀▀▀▀▀▀▀▀▀█ \n █▄▄▀▀▀▀▀▄▄ █▄▄\n █▀ ▄▄▄ ▄▀ ▄▀\n ▀███▄ ▄▀ ▄█▄▀█\n ▄█▄▄▄▄█▄▄████▄█\n█ ▀▄ ▀█ ██▀ █\n▀▄▄▄█▀▀▀▀▀▀▄▄▄▀ "], ["walk_1", " ▄▄▀▀▀▀▀▀▀▀▀█ \n █▄▄▀▀▀▀▀▄▄ █▄▄\n █▀ ▄█▀ ▄▀ ▄▀\n █▀▀ ▄▄▀ ▄█▄▀█\n ▀████▄▄▄█▀▀█▄▀\n ▄▀ █▀▄▄▀█ ▄▀ \n ▀▄█▀ ▄▄ ▀▀▄ \n █▄█▄█ █▄▄█▄█ "], ["walk_2", " ▄▄▄▄▄▄▄▄▄▄ \n ▄▀▀▄▄▄▄▄ ▄▀ \n ▄█▀▀ ▄▄ ▀█ ▀▀█\n █▄▄▄ ▀▀ ▄▀ ▄ █▄\n ▀▄▄▄▄▄▀▀▄▄███ █\n ▄▀██▀▀█▀▀ ▀█▀ \n █▀▀ ▀▀▀▄▄▄▀▄ \n █▄█▄█▀▀▀█▄▄█▄█ "]]], + ["aquilamon", [["angry", " ▄▀██▄█▀▀█▀ ▄▄▄▄\n ▄▀ ▀ ▄▀▄▄▀ ▄▄█\n █ ▀▄ ▀▀ █▀ ▄▄▄▀\n ▀████ ▄█▀ ▄▀ \n ▀▄▄█▀ ▄██▄▄ \n ▀▄ ▄▀ ▀▄▄█ \n ▄█▀██▀█▀█▀ \n █▄█▀ █▄█▀ "], ["attack", " ▄▀██▄█▀▀█▀ \n ▄▀ ▀▄▄▀▄ \n ▄▀▄ ▀▀ █▀▀▄▄ \n █ ▄█ ▄█▀▄ ▀▄\n ▀ ███▀ ▄▄█▄█ █\n ▀▄ ▄▀ ▀▄██ \n ▄▀█▀█▀▀█▀█▀▄ \n ▀▀▀▀▀ ▀▀▀▀▀ "], ["eat_1", " \n ▄▀██▄█▀▀█▀ ▄▄▄▄\n ▄▀ ▀▄ ▀▄▄▀ ▄▄█\n ▄▀▄ ▀ ▀ █▀ ▄▄▄▀\n █ ▄█ ▄█▀ ▄▀ \n ▀ ███▀ ▄██▄▄ \n ▄▄█▄ ▄▀ █▄▄▀ \n █▄█▄██▀▀██▄█▄█ "], ["eat_2", " ▄▄▄ ▄▄▄▄▄ \n ▀ █▀█▀ ▄▀ ▄▀▀▀█\n▄▀▀▄ █ ██ ▀▀█\n█▄██▄ ▄█ ▀█▀ \n ▀█▀▀▄█▀▀ ▄▄▀ \n ▀█▀ █▀█▀▀▄ \n ▄▄█▄▄█▄▄▄█▀▀ \n █▄█▄█ █▄█▄█ "], ["happy", " ▄▀██▄█▀▀█▀ ▄▄▄▄\n ▄▀ ▀▄ ▀▄▄▀ ▄▄█\n █ ▀▄▀ ▀ █▀ ▄▄▄▀\n ▀████ ▄█▀ ▄▀ \n ▀▄▄█▀ ▄██▄▄ \n ▀▄ ▄▀ ▀▄▄█ \n ▄█▀██▀█▀█▀ \n █▄█▀ █▄█▀ "], ["injured_1", " \n ▄▄▄ ▄▄▄▄▄ \n ▀ █▀█▀ ▄▀ \n █ ▄ ██ \n █ ▀▄▀▀ ▄█▄ \n ▀▄▀█▄▄█▀ ▀▄ \n █▀▀ █ ▄ ▀▄ \n █▄█▄▄█▄██▄▄▀ "], ["injured_2", " \n \n ▄▀██▄█▀▀█▀ \n ▄▀ ▀ ▀▄▄ \n ▄▀▄ █▄ █▀ \n █ ▄█ ▄█▀▀▄ \n ▀ ███▀ ▄▄ ▀▄ \n █▄█▄▄▄▄██▄▄█ "], ["refuse", " \n▄▀▀██▄█▀▀█▀ \n ▄▀ ▀▄▄▀▄ \n ▄▀▄ ▀▀ █▀▀▄▄ \n █ ▄█ ▄█▀▄ ▀▄\n ▀ ███▀ ▄▄█▄█ █\n ▄▄█▄ ▄▀▄█▄█▀ \n █▄█▄███▀▀█▄█▄█ "], ["sleep_1", " \n \n ▄▀██▄█▀▀█▀ \n ▄▀ ▀ ▀▄▄ \n ▄▀▄ ▀▀ ██▀▄▄ \n █ ▄█ ▄█▀ ▄ ▀▄\n ▀ ███▀ ▄██▄█▄█\n █▄█▄▄█▄▄█▄▀ "], ["sleep_2", " \n ▄▄▄ ▄▄▄▄▄ \n ▀ █▀█▀ ▄▀ \n █ ▄▄ ██▄ \n █ ▀▄ ▄█▀ ▀▀▄ \n ▀▄▀█▄▄█▀ ▄█ ▄ █\n █▀▀ █▄██▀█▀\n █▄█▄▄█▄▄█▄▀ "], ["walk_1", " ▄▄▄ ▄▄▄▄▄ \n ▀ █▀█▀ ▄▀ ▄▀▀▀█\n █ ▄█▀ ██ ▀▀█\n █ ▀▄ ▄█ ▀█▀ \n ▀▄▀█▄▄█▀ ▄▄▀ \n █▀▀ █▀█▀▀▄ \n ▄▄█▄▄█▄▄▄█▀▀ \n █▄█▄█ █▄█▄█ "], ["walk_2", " ▄▀██▄█▀▀█▀ \n ▄▀ ▀▄▄▀▄ \n ▄▀▄ ▀▀ █▀▀▄▄ \n █ ▄█ ▄█▀▄ ▀▄\n ▀ ███▀ ▄▄█▄█ █\n ▀▄ ▄▀ ▀▄██ \n ▄▀█▀█▀▀█▀█▀▄ \n ▀▀▀▀▀ ▀▀▀▀▀ "]]], + ["argomon_adult", [["angry", " ▀██▄ ▀██▄ \n ▀████▀█████▄ \n ▄██ █ █████▄ \n █▀█▀▀ ▀▀█▀ ██ \n ▀███▀█▀████▀█ \n █ █ ▄ ▄ █ ▄▀ \n ▀█▀▀▀▀▀▀▀▀ ▀▄ \n ▀▄▄█▄▄█▄▄█▄▄█"], ["attack", " ▄▄▄ ▄▄▄ \n ▄███▄▄▄▄███ \n ▀██▀▄▀█████ \n █▀█▄▀▄█▀▀███ \n █▀▄▄ ▄▄▀▀▄██ \n ▄▀██ █ ██▀▀ █ \n ▀▄███▄███▄▄▀▀▄ \n ▀▄▄█▄▄█▄▄█▄▄█"], ["eat_1", " ▄▄▄ ▄▄▄ \n ▄███▄▄▄▄███ \n ███▀▄▀█████ \n █▀▄▀▄▀▄█▀▄▀██ \n ▀███▄ ▄▄█████ \n ▄▀██ █ ██▀▀ █ \n ▀▄███▄███▄▄▀▀▄ \n ▀▄▄█▄▄█▄▄█▄▄█"], ["eat_2", " ▀██▄ ▀██▄ \n ▀████▀█████▄ \n ▄██ █ █████▄ \n █▄▀▀ ▀▀▄▄▀██ \n █▄█▀█▀█▄▄█▀█ \n █▀██▀█▀██▀ ▄▀ \n ▀█▀▀▀▀▀▀▀▀ ▀▄ \n ▀▄▄█▄▄█▄▄█▄▄█"], ["happy", " ▀██▄ ▀██▄ \n ▀████▀█████▄ \n ▄█▀█ █ ██▀██▄ \n▀█▄█▄▀ ▀▀▄█▄██ \n ██▀█▄█▀███▀█ \n █▀██▄▄▄██▀ ▄▀ \n ▀█▀▀▀▀▀▀▀▀ ▀▄ \n ▀▄▄█▄▄█▄▄█▄▄█"], ["injured_1", " ▄▄▄ ▄▄▄ \n ▄███▄▄▄▄███ \n ▀██▀▄▀█████ \n ▄█▀█▄▀▄█▀████ \n █▄▄█▄ ▄█▄▄███ \n ▄███ █ ███▀ █ \n ▀▄███▄███▄▄▀▀▄ \n ▀▄▄█▄▄█▄▄█▄▄█"], ["injured_2", " \n ▀██▄ ▀██▄ \n ▀████▀█████▄ \n ▄██ █ █████▄ \n █▀ █▀ ▀█ ▀███ \n ▀███▀▄▀████▀█ \n █ ██▄▀▄██ ▄▀▄ \n ▀▀▄▄█▄▄████▄▄█"], ["refuse", " ▄▄▄ ▄▄▄ \n ▄███▄▄▄▄███ \n ▀██▀▄▀█████ \n ▄███▄▀▄███▀██ \n █▄█▄▄ ▄▄█▄▄██ \n ▄▀██ █ ██▀▀ █ \n ▀▄███▄███▄▄▀▀▄ \n ▀▄▄█▄▄█▄▄█▄▄█"], ["sleep_1", " \n ▀██▄ ▀██▄ \n ▀████▀█████▄ \n ▄██ █ █████▄ \n █▀█▀ ▀█▀▀███ \n ███▀▄▀████▀█ \n █▀██▄▀▄██▀ ▄▀▄ \n ▀▀▄▄█▄▄████▄▄█"], ["sleep_2", " ▄▄▄ ▄▄▄ \n ▄███▄▄▄▄███ \n ▀██▀▄▀█████ \n ███▄▀▄██████ \n █▄█▄ ▄█▄▄███ \n ▄▀██ █ ██▀▀ █ \n ▀▄███▄███▄▄▀▀▄ \n ▀▄▄█▄▄█▄▄█▄▄█"], ["walk_1", " ▀██▄ ▀██▄ \n ▀████▀█████▄ \n ▄██ █ █████▄ \n █▄▀▀ ▀▀▄▄▀██ \n █▄█▀▄▀█▄▄█▀█ \n █▀██▄▀▄██▀ ▄▀ \n ▀█▀▀▀▀▀▀▀▀ ▀▄ \n ▀▄▄█▄▄█▄▄█▄▄█"], ["walk_2", " ▄▄▄ ▄▄▄ \n ▄███▄▄▄▄███ \n ▀██▀▄▀█████ \n █▀█▄▀▄█▀▀███ \n █▀▄▄ ▄▄▀▀▄██ \n ▄▀██ █ ██▀▀ █ \n ▀▄███▄███▄▄▀▀▄ \n ▀▄▄█▄▄█▄▄█▄▄█"]]], + ["argomon_baby_i", [["angry", " \n ▄▀▄ \n ▄▀ ▀▄ \n ▄▀▀▀▄▀▄ \n █ ▄█ █ █ \n ▀▄ ▄▀▄▀ \n ▀█▀▄▀ \n ▄▄▄█▄▄▄ "], ["attack", " ▄▄ \n ▄▀▄ █ ▄▀ \n ▀ █▄▄ █ \n ▄▀▄▄ ▀▄▀▄ \n █▀█▄▀ █ █ \n ▀▄▄▄▀▄▀ \n ▀▄▀ \n ▄▄▄▄▄ "], ["eat_1", " ▄▄ \n ▄▀▄▀ \n █▄▄ █ \n ▄▀▄▄ ▀▄▀▄ \n █ ▄██ █ █ \n▄█▄ ▀▄▄▄▀▄▀ \n ▀▄ ▀▄▀ \n ▀▀▀ "], ["eat_2", " \n ▄▀▄ \n ▄▀ ▀▄ \n ▄▀▀▀▄▀▄ \n █ ▄▀▄ █ █ \n ▀▄ ▄▀▄▀ \n ▀█▀ █ \n ▀▄▀ "], ["happy", " ▄ \n █ █ \n █▄▄ █ \n ▄▀ ▄ ▀▄▀▄ \n █ ▀ ▀ █ █ \n ▀▄▄▄▀▄▀ \n ▀▄▀ \n ▄▄▄▄▄ "], ["injured_1", " \n ▄▄ \n █ ▄▀ \n █▄▄ █ \n ▄▀ ▀▄▀▄ \n █ █▄ █ █ \n ▀▄▄▄▀▄▀ \n ▀▄▀ "], ["injured_2", " \n \n ▄▀▀▄ \n ▄▀ ▀▄ \n ▄▀▀▀▄▀▄ \n █ ▄ █ █ \n ▀▄▀▀ ▄▀▄▀ \n ▀██▄▀ "], ["sleep_1", " \n ▄▄ \n █ ▄▀ \n █▄▄ █ \n ▄▀ ▀▄▀▄ \n █ ▀▀ █ █ \n ▀▄▄▄▀▄▀ \n ▀▄▀ "], ["sleep_2", " \n ▄▀▄ \n ▄▀ ▀▄ \n ▄▀▀▀▄▀▄ \n █ ▄▄ █ █ \n ▀▄ ▄▀▄▀ \n ▀█▀ █ \n ▀▄▀ "], ["walk_1", " ▄ \n █ █ \n █▄▄ █ \n ▄▀▄▄ ▀▄▀▄ \n █ ▄██ █ █ \n ▀▄▄▄▀▄▀ \n ▀▄▀ \n ▄▄▄▄▄ "], ["walk_2", " \n ▄▀▀▄ \n ▄▀ ▀▄ \n ▄▀▀▀▄▀▄ \n █ ▀█▄ █ █ \n ▀▄▀▀▀▄▀▄▀ \n ▀█▀▄▀ \n ▄▄▄█▄▄▄ "]]], + ["argomon_baby_ii", [["angry", " \n ▄▄ ▄▄ \n ▀▄▀▀▀▀▀▄▀ \n █▄▀▀▀▄ █ \n ▄▄█ ▄ █▄▄█▄▄ \n██ █▄▀▀ ▄▀ █ ██\n ▄▀ ▀▀▀ ▀▄ \n ▀▄▄▀▀▄▄▀▀ "], ["attack", " █▀▄▄▄▄▄▀█ \n ▄▄ ▄▀▄▄▄ ▀▄ ▄▄\n ▀█ █▀ ▄ ▀▄ ▀▄▀█\n ▀█ ▀▀ █▀▀█▀ \n ▄▀ ▀▄▄▄▀ ▀▄ \n █▀▄▄▄▄▄▀█▀ \n ▀▀ ▀▄▀ ▀▀ \n ▄▄▄▄▄ "], ["eat_1", " █▀▄▄▄▄▄▀█ \n ▄▀▄▄▄ ▀▄ \n▄▄ █▀▄▄ ▀▄ ▀▄ ▄▄\n▀▀▀█ ▄██ █▀▀█▀▀▀\n ▄▀ ▀▄▄▄▀ ▀▄ \n █▀▄▄▄▄▄▀█▀ \n ▀▀ ▀▄▀ ▀▀ \n ▄▄▄▄▄ "], ["eat_2", " ▄▄ ▄▄ \n ▀▄▀▀▀▀▀▄▀ \n █▄▀▀▀▄ █ \n ▄▄█ ▄▀▄ █▄▄█▄▄ \n██ █▄ ▄▀ █ ██\n ▄▀ ▀▀▀ ▀▄ \n ▀▄▄▀▀▄▄▀▀ \n ▄▄▄▄▄▄▄▄▄ "], ["happy", " \n █▀▄▄▄▄▄▀█ \n ▄▀▄▄▄ ▀▄ \n██ █▀ ▄ ▀▄ ▀▄ ██\n ▀▀█ ▀ ▀ █▀▀█▀▀ \n █▀▄▄▄▀ ▄▀ \n ▀▄ ▄▄ ▄▄▀ \n ▀▀ ▀▀ "], ["injured_1", " \n ▄▄▄▄▄▄▄▄▄ \n █▄▀▄▄▄ ▀▄█ \n █▀▄ ▀▄ ▀▄ \n ▄██ ▀▀ █▀▀██▄ \n██ █▀▄▄▄▀ ▄▀ ██\n ▀▄ ▄▄ ▄▄▀ \n ▀▀ ▀▀ "], ["injured_2", " \n \n ▄▀█▀▀▀▀▀█▀▄ \n ▀█▄▀▀▀▄ █▀ \n ▄█ █▄ █▄▄█▄ \n▄█▀█▄ ▄▀ █▀█▄\n▀▀▄▀ ▀▀▀ ▀▄ ▀▀\n ▀▄▄▀▀▄▄▀▀ "], ["sleep_1", " \n ▄▄ ▄▄ \n ▀▄▀▀▀▀▀▄▀ \n █▄▀▀▀▄ █ \n ▄▄█ ▄▄▄ █▄▄█▄▄ \n██ █▄ ▄▀ █ ██\n ▄▀ ▀▀▀ ▀▄ \n ▀▄▄▀▀▄▄▀▀ "], ["sleep_2", " \n \n ▄▀█▀▀▀▀▀█▀▄ \n ▀█▄▀▀▀▄ █▀ \n ▄▄█ ▄▄▄ █▄▄█▄▄ \n██ █▄ ▄▀ █ ██\n ▄▀ ▀▀▀ ▀▄ \n ▀▄▄▀▀▄▄▀▀ "], ["walk_1", " ▄▄ ▄▄ \n ▀▄▀▀▀▀▀▄▀ \n █▄▀▀▀▄ █ \n ▄▄█ ▀█▄ █▄▄█▄▄ \n██ █▄▀▀▀▄▀ █ ██\n ▄▀ ▀▀▀ ▀▄ \n ▀▄▄▀▀▄▄▀▀ \n ▄▄▄▄▄▄▄▄▄ "], ["walk_2", " \n █▀▄▄▄▄▄▀█ \n ▄▀▄▄▄ ▀▄ \n █▀▄▄ ▀▄ ▀▄ \n▄█▀█ ▄██ █▀▀█▀█▄\n▀▀ █▀▄▄▄▀ ▄▀ ▀▀\n ▀▄ ▄▄ ▄▄▀ \n ▀▀ ▀▀ "]]], + ["argomon_child", [["angry", " \n █▀▄▄▄▄▄▀█ \n ▄▀▄▄▄ ▀▄ \n █▀ ▀▄ █ \n █ ▀▀ █ ▄▀ \n ▄▀▀█▄▄▄█▄██▀▀▀▄\n ▀▄▄▀ █ █ █▀▄▄▄▀\n █▄█▄▄▀▄▄█ "], ["attack", " ▄▄ ▄▄▄ \n ▄▀▀▀▀▀ ▄▀ \n █▀▀▀▄ ▀▀▄ \n ▄▄█ ▄█ █ █ \n█ ▀▄▄▄█▀▀▄▀ \n▀▄▄▄▄█▄▄▄▄█▄ \n █ ██ █ █▄ \n █▄▄█▀█▄█▄▄█ "], ["eat_1", " █▀▄▄▄▄▄▀█ \n ▄▀▄▄▄▄ ▀▄ \n █▀▄▄▄ ▀▄ █ \n ██████ █ █ \n ▀▄▀▀▀▄██▀ \n ▄██▀██▀█▀▄▄ \n █▄█ █ █ █▄ █ \n █▄▄▀▄▀▄▄█▀▀ "], ["eat_2", " \n █▀▄▄▄▄▄▀█ \n ▄▀▄▄▄ ▀▄ \n █▀ ▄ ▀▄ █ \n █ ▀ ▀ █ ▄▀ \n ▄▀▀█▄▄▄█▄██▀▀▀▄\n ▀▄▄█▀▄▀█▄▀█▄▄▄▀\n █▄▄██▄██▄▄█ "], ["happy", " █▀▄▄▄▄▄▀█ \n ▄▀▄▄▄ ▀▄ \n █▀ ▄ ▀▄ █ \n █ ▀ ▀ █ ▄▀ \n▄▀▀▀█▄▄▄█▄██▀▀▀▄\n▀▄▄▄█▀ ▀█ ▀█▄▄▄▀\n █ █ █ █ █ \n █▄▄▀▄█▄▀▄▄█ "], ["injured_1", " \n \n █▀▄▀▀▀▀▀▄▀█ \n █▄▀▀▀▄ ▀▄ \n █ █▄ █ █ \n █▄ ▄▀▄▀ \n ▄▀▀█▀█▀█▄▀██▀▀▄\n ▀▄▄▄██▄██▄▄█▄▄▀"], ["injured_2", " \n \n ▄▄ ▄▄▄▄▄ ▄▄ \n ▀▄▀▄▄▄ ▀▄▀ \n █▀▄ ▀▄ █ \n █ ▀▀ █ ▄▀ \n ▄▀▀█▄▄▄█▄▀██▀▀▄\n ▀▄▄▄██▄██▄▄█▄▄▀"], ["sleep_1", " \n ▄▄ ▄▄ \n ▀▄▀▀▀▀▀▄▀ \n █▄▀▀▀▄ ▀▄ \n █ ▄▄ █ █ \n █▄ ▄▀▄▀ \n ▄▀▀█▀█▀█▄▀██▀▀▄\n ▀▄▄▄██▄██▄▄█▄▄▀"], ["sleep_2", " \n █▀▄▄▄▄▄▀█ \n ▄▀▄▄▄ ▀▄ \n █▀ ▀▄ █ \n █ ▀▀ █ ▄▀ \n ▀█▄▄▄█▄█▄ \n ▄▀▀█▀▄▀█▄▀██▀▀▄\n ▀▄▄▄██▄██▄▄█▄▄▀"], ["walk_1", " ▄▄ ▄▄ \n ▀▄▀▀▀▀▀▄▀ \n █▄▀▀▀▄ ▀▄ \n █ ▀█▄ █ █ \n ▀▄▀▀▀▄▀▄█ \n ▄▄▄█▀██▀███▄▄ \n █ █ █ ██ █ █\n ▀█▄▄█▄▀█▄▄▀▀▀ "], ["walk_2", " \n █▀▄▄▄▄▄▀█ \n ▄▀▄▄▄ ▀▄ \n █▀▄▄ ▀▄ █ \n █ ▄██ █ ▄▀ \n ▄▀▀█▄▄▄█▄██▀▀▀▄\n ▀▄▄█▀▄▀█▄▀█▄▄▄▀\n █▄▄██▄██▄▄█ "]]], + ["argomon_perfect", [["angry", " █▀▄ \n █▄███▀ ▄██ \n ███▀███▄ █ \n ██▄▄██▀▄▄█▄ \n █ █▀█▀ ▄▀ \n ▄█▄▄██▀▀▄▄▄▀ \n █▄█▄██▄▄▀▀ \n ▄█▄▀ ▀▄▄█▄ "], ["attack", " ▄▄ \n █ █▄▄▄ ▄▄ \n ▄█████▄ ▀▀█ \n █▀▀▀▄██▀ ▄▀ \n █▀▀▀ █▄██▀▀▄ \n █▄▄██▄█ ▀▄ \n ▄▀█ ▄█▀ ▄█▀▀ \n ▄███▀▀▀██▄█▄ "], ["eat_1", " █▀▄ \n █▄███▀ ▄██ \n ██▀▄▀██▄ █ \n ████▀█▀▄▄█▄ \n ▀▄ ▄█▀█▀ ▄▀ \n ▄█▀▀██▀▀▄▄▄▀ \n █▄█▄██▄▄▀▀ \n ▄█▄▀ ▀▄▄█▄ "], ["eat_2", " █▀▄ \n █▄███▀ ▄██ \n ████▀██▄ █ \n █▄▄▄██▀▄▄█▄ \n █ █▀█▀ ▄▀ \n ▄█▄▄██▀▀▄▄▄▀ \n █▄█▄██▄▄▀▀ \n ▄█▄▀ ▀▄▄█▄ "], ["happy", " █▀▄ \n █▄███▀ ▄██ \n ██▀▄▀██▄ █ \n ██████▀▄▄█▄ \n █ █▀█▀ ▄▀ \n ▄█▄▄██▀▀▄▄▄▀ \n █▄█▄██▄▄▀▀ \n ▄█▄▀ ▀▄▄█▄ "], ["injured_1", " \n ▄▄ \n █ █▄▄▄ ▄▄ \n ▄█████▄ ▀▀█ \n ███████▀ ▄▀ \n █▀▀▀ █▄██▀▀▄ \n ▄▀██▄▄██▄▀▀▄▀▄ \n █▄▄█▄██▄█▄▄█▀ "], ["injured_2", " \n \n █▀▄ ▄▄ \n ▄█▄███▀ ▀▀█ \n ███████▀ ▄▀ \n ████▀█▀██▀▀▄ \n ▄▀█▄ ▄█▀▀▀▄▀▄ \n █▄▄████▄█▄▄█▀ "], ["refuse", " ▄▄ \n █ █▄▄▄ ▄▄ \n ▄█████▄ ▀▀█ \n █▀▀▀▄██▀ ▄▀ \n █▀▀▀ █▄██▀▀▄ \n █▄▄██▄█ ▀▄ \n ▄▀█ ▄█▀ ▄█▀▀ \n ▄███▀▀▀██▄█▄ "], ["sleep_1", " \n █▀▄ \n █▄███▀ ▄██ \n ███████▄ █ \n █▄▄▄▀█▀▄▄█▄ \n ▀▄ ▄█▀█▀ ▄▀ \n ▄▀██▀▀█▄▄▀▀▄▄▀ \n █▄▄█▄██▄█▄▄█ "], ["sleep_2", " \n ▄▄ \n █ █▄▄▄ ▄▄ \n ▄█████▄ ▀▀█ \n █▀▀▀███▀ ▄▀ \n █▀▀▀ █▄██▀▀▄ \n ▄▀██▄▄██▄▀▀▄▀▄ \n █▄▄█▄██▄█▄▄█▀ "], ["walk_1", " █▀▄ \n █▄███▀ ▄██ \n ████▀██▄ █ \n █▄▄▄▀█▀▄▄█▄ \n ▀▄ ▄█▀█▀ ▄▀ \n ▄█▀▀██▀▀▄▄▄▀ \n █▄█▄██▄▄▀▀ \n ▄█▄▀ ▀▄▄█▄ "], ["walk_2", " ▄▄ \n █ █▄▄▄ ▄▄ \n ▄█████▄ ▀▀█ \n █▀▀▀▄██▀ ▄▀ \n █▀▀▀ █▄██▀▀▄ \n █▄▄██▄█ ▀▄ \n ▄▀█ ▄█▀ ▄█▀▀ \n ▄███▀▀▀██▄█▄ "]]], + ["argomon_ultimate", [["angry", " ▄ ▄ ▄▄ \n █ █▄████▀▄▄█ \n ████▀ ██▀▄▄█ \n ███████▀█ \n ▀█▀▀▀▄██▀██▄ \n ▄█▀▀▀██▀▀█▀ \n █▄██▄██▄▄█▀ \n █▄▄█▀▀▀█▄▄█ "], ["attack", " ▄▀▄ ▄█▄▄▄▀▀▄ \n █▄███▀██▄▀▀█ \n ████▄▄██▄▀▀▀ \n ██▀▀ █▄█▄▄ \n █ ▀▄▄▄████ █ \n ▀█▄█▄ ▄██▄▄█▀ \n █▀██▀▀██ \n █▄▄█ █▄▄█ "], ["eat_1", " ▄▀ ▄█▄▄▀▀▄ \n █▄▄█▀▀██▄▀▀█ \n ███ ▀▄██▄▀▀▀ \n █████▀█▄█▄▄ \n ▀▄ ███▄███ \n ▄▀██▀▄█▀ ▄█ \n ▀▀█▀██▀▀█▀ \n █▄▄█ █▄▄█ "], ["eat_2", " ▄ ▄ ▄▄ \n █ █▄████▀▄▄█ \n ███▀▄▀██▀▄▄█ \n ███████▀█ \n ▀█▀▀▀▄██▀██▄ \n ▄█▀▀▀██▀▀█▀ \n █▄██▄██▄▄█▀ \n █▄▄█▀▀▀█▄▄█ "], ["happy", " ▄▀▄ ▄█▄▄▄▀▀▄ \n █▄██▀███▄▀▀█ \n ███▄█▄██▄▀▀▀ \n ██▀▀▀▀█▄█▄▄ \n ▄▀▀▄▄▄██▀ ███ \n ▀▄▄█▄ ▄█▄▄▄█ \n █▀██▀▀█▀ \n █▄▄█ █▄▄█ "], ["injured_1", " \n ▄ ▄ ▄▄ \n █ █▄████▀▄▄█ \n ███▀████▀▄▄█ \n ███▄▄██▀█ \n ▀█▀▀▀▄██▀██▄ \n ▄▀█▀▀▀█▄▀▀█▀ \n █▄▄█▄███▄▄█ "], ["injured_2", " \n \n ▄▀▄ ▄█▄▄▄▀▀▄ \n █▄██████▄▀▀█ \n ███ ▀███▄▀▀▀ \n █████▀█▄█▄▄ \n ▄▀▄▄▄█▀▄▀▀█▀ \n █▄▄█▄███▄▄█ "], ["sleep_1", " \n ▄ ▄ ▄▄ \n █ █▄████▀▄▄█ \n ████████▀▄▄█ \n ███▄▄██▀█ \n ▀█▀▀▀▄██▀██▄ \n ▄▀█▀▀▀█▄▀▀█▀ \n █▄▄█▄███▄▄█ "], ["sleep_2", " \n ▄▀▄ ▄█▄▄▄▀▀▄ \n █▄██████▄▀▀█ \n ███▀▀███▄▀▀▀ \n █████▀█▄█▄▄ \n ▀▄▄▄██▀ ███ \n ▄▀█▄ ▄██▀▀█ \n █▄▄█████▄▄█ "], ["walk_1", " ▄▀ ▄█▄▄▀▀▄ \n █▄▄█▀▀██▄▀▀█ \n ███ ▀▄██▄▀▀▀ \n █████▀█▄█▄▄ \n ▀▄▄▄███▄███ \n ▄▀█▄ ▄█▀ ▄█ \n ▀▀█▀██▀▀█▀ \n █▄▄█ █▄▄█ "], ["walk_2", " ▄ ▄ ▄▄ \n █ █▄████▀▄▄█ \n ███▀▄ ██▀▄▄█ \n ███▄▄██▀█ \n ▀█▀▀▀▄██▀██▄ \n ▄█▀▀▀██▀▀█▀ \n █▄██▄██▄▄█▀ \n █▄▄█▀▀▀█▄▄█ "]]], + ["armadillomon", [["angry", " \n ▄▄▄ ▄▄▄▄ \n ▄▀▄█▄▄▀ ▄█ \n ▄▀▀▀█▀ ▀███▄ \n▄█ ▄ ▀▄ ▀█▀ ▀▄\n█ ▀▀ █▀▀ █\n ██▀▀ ▄▄█▀▀▄▄▄██\n█▄▄███▄█▄█▀█▄█▄█"], ["attack", " ▄▀█▀ ▄▄▄▄▄ \n █▄███▀ ▄█ \n ▄▀ ▄ ▀▄ ▀███▄ \n█▀ ▀▀ █ ▀█▀ ▀▄\n▀████▄ █▀▀ █\n ▀█▀▀▀ ▄██▀▄ ██\n ▄▀▀██▀▀▀▄▄▄▀▀▀▄\n█▄▄█ █▄█▄█ █▄█▄█"], ["eat_1", " ▄▄▄ \n ▄▀▄█▄▄▀▀▀█▀ \n ▄▀▀▀█▀ ▄██▄ \n▄█ ▀▄ ▀▄ ▄██▀█ \n█▄▄▄▀▀ █▄▄▀ █\n ████ █▄▄ ▄█\n ▄█▄▄▄▄██▄ ▀▄▄█▀\n█▄▄█ █▄█▄█▀█▄█▄█"], ["eat_2", " \n ▄▄▄ ▄▄▄▄ \n ▄▀▄█▄▄▀ ▄█ \n ▄▀▀▀█▀ ▀███▄ \n▄█ ▄▀▄ ▀▄ ▀█▀ ▀▄\n█ ▄ █▀▀ █\n ██▀ ▄▄█▀▀▄▄▄██\n█▄▄███▄█▄█▀█▄█▄█"], ["happy", " ▄▄▄ \n ▄▀▄█▄▄▀▀▀█▀ \n ▄▀▀▀█▀ ▄██▄ \n▄█ ▄▀▄ ▀▄ ▄██▀█ \n█▄▄▄▄ █▄▄▀ █\n ███▀ █▄▄ ▄█\n ▄█▄▄▄▄██▄ ▀▄▄█▀\n█▄▄█ █▄█▄█▀█▄█▄█"], ["injured_1", " \n ▄▄▄ ▄▄▄▄ \n ▄▀▄█▄▄▀ ▄█ \n ▄▀▀▀█▀ ▀███▄ \n▄█ ▄ ▀▄ ▀█▀ ▀▄\n█ ▀▀ █▀▀ █\n ██▀▀ ▄▄█▀▀▄▄▄██\n█▄▄███▄█▄█▀█▄█▄█"], ["injured_2", " \n \n ▄▀█▀ ▄▀▀█▀ \n █▄███▀ ▄██▄ \n ▄▀ ▀▄ ▄██▀█ \n█▀ █▄ █▄▄▀ █\n▀▄▄▄▄ █▄▄ ▄█\n███▄▄▄███▄▄█████"], ["sleep_1", " \n \n ▄▀█▀ ▄▀▀█▀ \n █▄███▀ ▄██▄ \n ▄▀ ▀▄ ▄██▀█ \n█▀ ▄▄ █▄▄▀ █\n▀▄▄▄▄ █▄▄ ▄█\n███▄▄▄███▄▄█████"], ["sleep_2", " \n ▄▄▄ ▄▄▄▄ \n ▄▀▄█▄▄▀ ▄█ \n ▄▀▀▀█▀ ▀███▄ \n▄█ ▀▄ ▀█▀ ▀▄\n█ ▀▀ █▀▀ █\n ██▀▀ ▄▄█▀▀▄▄▄██\n█▄▄███▄█▄█▀█▄█▄█"], ["walk_1", " \n ▄▀█▀ ▄▀▀█▀ \n █▄███▀ ▄██▄ \n ▄▀ ▄ ▀▄ ▄██▀█ \n█▀ ▄█ █▄▄▀ █\n▀▄▄▄▄ █▄▄ ▄█\n ▄█▄▄▄▄██▄ ▀▄▄█▀\n█▄▄█ █▄█▄█▀█▄█▄█"], ["walk_2", " \n ▄▄▄ ▄▄▄▄ \n ▄▀▄█▄▄▀ ▄█ \n ▄▀▀▀█▀ ▀███▄ \n▄█ ▀▄ ▀▄ ▀█▀ ▀▄\n█ ▀▀ █▀▀ █\n ██▀▀ ▄▄█▀▀▄▄▄██\n█▄▄███▄█▄█▀█▄█▄█"]]], + ["armageddemon", [["angry", " ▄▄▄▄ ▄▄▄▄ \n ▀▄▄▀▀▀▄▄▄ ▀▄\n ▀▀▀ █ █\n▄▄ ▄▄▄▄ ▄▄▀▄█ █\n▀▄██▀██▀█▄███▀█ \n███▄▄██▄▀██▀ █▄█\n█████▀█▄██▄█▀█ █\n ▀▄▄▄▀ ▀▀▀▄▀▄▀▀ "], ["attack", "▀█▀▀▀▀▀▀▀▄▄ \n ▀▀▀▀▀▀▄▄ ▀▀▄ \n ▀▀▄ ▀▄\n█▀▄████▄▄ ▄ █ █\n▄██▀ ██ █▀█▄██▄▀\n███████▀▄███▀▄▀▄\n▀█▀▀▀▄▀███▀▄▄█▀█\n ▀▀▀ ▄███▄█▄█"], ["eat_1", " ▄▄▄▄ ▄▄▄▄ \n ▀▄▄▀▀▀▄▄▄ ▀▄\n▄▄ ▄▄▄▄▀▀▀ █ █\n▀▄█▀▀██▀ ▄▄▀▄█ █\n██ ▀▄██▄█▄███▀█ \n██▀▀▀██ ▀██▀ █▄█\n ▀▄▄▄▄████▄█▀█ █\n ▀▀▀▄▀▄▀▀ "], ["eat_2", " \n ▀█▀▀▄▄▄▀▀▀▀▄ \n ▀▀▄▄▄▀▀▀▄ █\n█▀▄████▄▄ ▄ █ █\n▄█▀▄▀██ █▀█▄██▄▀\n████████▄███▀▄▀▄\n▀█▀▀▀▄▀███▀▄▄█▀█\n ▀▀▀ ▄███▄█▄█"], ["happy", " ▄▄▄▄ ▄▄▄▄ \n ▀▄▄▀▀▀▄▄▄ ▀▄\n▄▄ ▄▄▄▄▀▀▀ █ █\n▀▄█▀███▀ ▄▄▀▄█ █\n██▄█▄██▄█▄███▀█ \n██ ▀█ ▀██▀ █▄█\n ▀▄▄▄▄████▄█▀█ █\n ▀▀▀▄▀▄▀▀ "], ["injured_1", " \n ▀█▀▀▄▄▄▀▀▀▀▄ \n ▀▀▄▄▄▀▀▀▄ █\n ▄ █ █\n█▀▄████▄▄▀█▄██▄▀\n▄██ ▀██ ████▀▄▀▄\n███████▀▄█▀▄▄█▀█\n▀▄▄▄▄▄▀███▀█▄█▄▀"], ["injured_2", " \n \n ▄▄▄▀▀▀▀▄ \n ▀█▀▀▄▄▄▀▀▀▄ █▄\n▄▄ ▄██▄ ▄▄▀▄█ █\n▀▄█▀███▀█▄███▀█▄\n███▄▄██▄▀██▀ █▄█\n▀▄▄▄▄▄█▄██▄███▄█"], ["sleep_1", " \n ▄▄▄▄ ▄▄▄▄ \n ▀▄▄▀▀▀▄▄▄ ▀▄\n ▀▀▀ █ █\n▄▄ ▄▄▄▄ ▄▄▀▄█ █\n▀▄█████▀█▄███▀█ \n███▄▄██▄▀██▀ █▄█\n▀▄▄▄▄▄█▄██▄███▄█"], ["sleep_2", " \n ▀█▀▀▄▄▄▀▀▀▀▄ \n ▀▀▄▄▄▀▀▀▄ █\n ▄ █ █\n█▀▄████▄▄▀█▄██▄▀\n▄██▀▀██ ████▀▄▀▄\n███████▀▄█▀▄▄█▀█\n▀▄▄▄▄▄▀███▀█▄█▄▀"], ["walk_1", " ▄▄▄▄ ▄▄▄▄ \n ▀▄▄▀▀▀▄▄▄ ▀▄\n ▀▀▀ █ █\n▄▄ ▄▄▄▄ ▄▄▀▄█ █\n▀▄█▀▀██▀█▄███▀█ \n██ ▀▄██▄▀██▀ █▄█\n█████▀█▄██▄█▀█ █\n ▀▄▄▄▀ ▀▀▀▄▀▄▀▀ "], ["walk_2", " \n ▀█▀▀▄▄▄▀▀▀▀▄ \n ▀▀▄▄▄▀▀▀▄ █\n█▀▄████▄▄ ▄ █ █\n▄█▀▄ ██ █▀█▄██▄▀\n██▄▄████▄███▀▄▀▄\n▀█▀▀▀▄▀███▀▄▄█▀█\n ▀▀▀ ▄███▄█▄█"]]], + ["arresterdramon", [["angry", " ▄▀█▄▀▀▀▄ \n ▄█▀▀ ▄▀▀▄ \n▄▀ ▄▄█ ▄▀█ \n█▄▄▄ ▄▄▀▀▀█ \n ▀▄▄▄▀▀ ▄▄█▀ ▄▀▄\n █ █▄▄▄█ █▄ ▀█▀\n ▄▀▀█ █▀▀▄ ▀▄▀ \n█▄█▄█▀▀█▄█▄█ "], ["attack", " ▄██▄▀▀▀▄ \n▄▀▀▀ ▄ ▄▀▀▄ \n████▄▀▀ ▄█▀▀▄ \n▀█████ █▄ █ \n ██▄▄█ ▄▀█ ▄█ ▄ \n ▀▄▄▄▄█ ▄▀█ █▄█\n ▄▀▀█ █▀▀▄▀▀▄█ \n█▄█▄█▀▀█▄█▄█ "], ["eat_1", " ▄▀█▄▀▀▀▄ \n ▄▄▀▀▀ ▄▀▀▄ \n█ ▄▀▄ ▄▀█ \n▀███▄ ▄▄▀▀▀█ \n▄▀▀▀▀▄▄▀ ▄▀▀▄ \n▀█▀██▄▄█▀█▄▄▀▄▀▄\n ▄▀▀█ █▀▀▄ ▀█▀\n█▄█▄█▀▀█▄█▄█▀▀ "], ["eat_2", " ▄▄ ▄▄▄ \n ▄█▄▀▀ ▄▄▀ \n ▄▀▀ ▄ ▀▄▄▀ \n█ ▀ ▀ ▀▄█▄▄ \n▀█▀▀ ▄▄▀▀ ▄▄▀ ▄ \n ▄▀█▀ ▄▀▀█ █▄█\n █▀▀█▀▀█▄▄▀▄▄▄▀ \n█▄█▄█▀▀▀█▄█▄█ "], ["happy", " ▄██▄▀▀▀▄ \n ▄▄▀ ▄ ▄▀▀▄ \n█▄▄▄▀ ▀ ▄▀▀▄ \n▀█████ ▀▄ ██ \n █▀▀▀▀▄▀▀▄▄▀ ▄▀▄\n ▀███▄▄▀█▄▄ ▀█▀\n ▄▀▀█ █▀▀▄ ▀▄▀ \n█▄█▄█▀▀█▄█▄█ "], ["injured_1", " \n ▄▄ ▄▄▄ \n ▄█▄▀▀ ▄▄▀ \n ▄▀▀▄ ▀▄▄▀ \n█ ▀▀ ▀▄█▄ \n▀█▀▀ ▄▄▀▀▄▄▄█▄ \n█ ███▄▄▀█ █ █ \n█▄▄█▄▄▄▄█▄▄▄██▄█"], ["injured_2", " \n \n ▄▀█▄▀▀▀▄ \n ▄█▀▀ ▄▀▀▄ \n▄▀ █▄ ▄▀█ \n█▄▄▄ ▄▄███▄▄ \n█▀▄▄▄▀▀▄█ █ █ \n█▄▄████▄█▄▄▄██▄█"], ["sleep_1", " \n \n ▄▀█▄▀▀▀▄ \n ▄█▀▀ ▄▀▀▄ \n▄▀ ▄▄▄ ▄▀█ \n█▄▄▄ ▄▄████▄▀▄\n█▀▄▄▄▀▀▄█ █▀█▀\n█▄▄█▄██▄█▄▄▄█▀ "], ["sleep_2", " \n ▄▄ ▄▄▄ \n ▄█▄▀▀ ▄▄▀ \n ▄▀▀ ▀▄▄▀ \n█ ▀▀▀ ▀▄█▄▄ ▄ \n▀█▀▀ ▄▄▀▀▄▄▄▀█▄█\n█ ▀██▄▄▀█ █▄▀ \n█▄▄█▄▄▄▄█▄▄▄█ "], ["walk_1", " ▄▀█▄▀▀▀▄ \n ▄█▀▀ ▄▀▀▄ \n▄▀ ▄█▀ ▄▀█ \n█▄▄▄ ▄▄▀▀▀█ \n ▀▄▄▄▀▀ ▄▄█▀ ▄▀▄\n █ █▄▄▄█ █▄ ▀█▀\n ▄▀▀█ █▀▀▄ ▀▄▀ \n█▄█▄█▀▀█▄█▄█ "], ["walk_2", " ▄▄ ▄▄▄ \n ▄█▄▀▀ ▄▄▀ \n ▄▀▀ ▄▄ ▀▄▄▀ \n█ ▀▀ ▀▄█▄▄ ▄ \n▀█▀▀ ▄▄▀▀ ▄▄▀█▄█\n ▄▀█▀ ▄▀▀█▄▄ █ \n █▀▀█▀▀█▄▄▀▄ ▀ \n█▄█▄█▀▀▀█▄█▄█ "]]], + ["arukenimon", [["angry", "▄ ▄▄▄▄▄▄▄ ▄ \n██▀ ▄ ▄▄ ▀███▀ \n ▀▄▀██▀ █▄█ ▀▄ \n ██▀▀▀▀████▄▀ \n ▀▄████▄██▀█ \n █ ████ ▄██▄ \n█▀▄██ ▄████ █▄ █\n█▄▀ █▄█▀ ██▄▀▀▄█"], ["attack", "█▄▄▀▀▀▀▀▀█▄▄▄█ \n▀█▀▄█▄█▀▄ █▀▀▄ \n ▀▄▄██▄▄███▄ ▄▀ \n █▀ ▀████ \n ▀▄▄▄▄▄▄██▀█ \n▄▄█ ████ ▄█▀▀█\n█ ▄██ ▄████ ██ █\n▀▀ █▄█▀ ██▄█▀▀▀"], ["eat_1", "█▄▄▀▀▀▀▀▀█▄▄▄█ \n▀█ ▄█▄█▀▄ █▀▀▄ \n █▄██▄█████ ▄▀ \n █ █████ \n ▀█▄▄▄▄███▀█▄ \n █ ████ ▄██▄ \n█▀▄██ ▄████ █▄ █\n█▄▀ █▄█▀ ██▄▀▀▄█"], ["eat_2", "▄ ▄▄▄▄▄▄▄ ▄ \n██▀ ▄ ▄▄ ▀███▀ \n ▀▄▀██▀▄▀▄█ ▀▄ \n █▀███▀▀███▄▀ \n █▄▄▄▄███▀█ \n █ ████ ▄██▄ \n█▀▄██ ▄████ █▄ █\n█▄▀ █▄█▀ ██▄▀▀▄█"], ["happy", "█▄▄▀▀▀▀▀▀█▄▄▄█ \n▀█ ▄█▄█▀▄ █▀▀▄ \n █▄██▄█▄███ ▄▀ \n █ ████ \n ▀█▄▄▄▄███▀█▄ \n █ ████ ▄██▄ \n█▀▄██ ▄████ █▄ █\n█▄▀ █▄█▀ ██▄▀▀▄█"], ["injured_1", " \n ▄ ▄▄▄▄▄▄▄ ▄ \n ██▀ ▄ ▄▄ ▀███▀ \n ▀▄▀██▀██▄█ ▀▄\n █▄██▄▄████▄▀ \n ▄█▄▄▄▄▀▀▀██▄ \n ▄▀█ ███▄▄▀█▄ █\n █▄▀▀█▄█▀ █▄▀▀▄█"], ["injured_2", " \n \n █▄▄▀▀▀▀▀▀█▄▄▄█ \n ▀█ ▄█▄██▄ █▀▀▄ \n █ ██ ▀███▄ ▄▀\n ▀█▀▀▀▀█████ \n ▄▀█▀▀█▀█▀ █▀▄▀▄\n █▄█▄▄███▄▄█▄█▄█"], ["sleep_1", " \n▄ ▄▄▄▄▄▄▄ ▄ \n██▀ ▄ ▄▄ ▀███▀ \n ▀▄▀██▀▀█▄█ ▀▄ \n ██████████▄▀ \n ▄█▄▄▄▄█▀▀▀█▄▄ \n█▀█ █▄██▄▄▀█▄ █\n█▄▀▀█▄▀▀ ██▄▀▀▄█"], ["sleep_2", " \n█▄▄▀▀▀▀▀▀█▄▄▄█ \n▀█ ▄█▄██▄ █▀▀▄ \n █▄██▄▄███▄ ▄▀ \n ▀█▀▀▀▀█████ \n █▀▀████▀▀▄██▄ \n█▀█▄▄▀▄██▄▄▀█▄ █\n█▄▀ █▄█▀ ██▄▀▀▄█"], ["walk_1", "█▄▄▀▀▀▀▀▀█▄▄▄█ \n▀█ ▄█▄█▀▄ █▀▀▄ \n █▄██▄████▄ ▄▀ \n ▀▄▀▀▀ ▄████ \n ▄▀▀████▀▀ █▄ \n █▄▄████▄▄████ \n █ ▄██ ▄██ ██▄ █\n █▄▀ █▄▀ █▄▀ ▀▄█"], ["walk_2", "▄ ▄▄▄▄▄▄▄ ▄ \n██▀ ▄ ▄▄ ▀███▀ \n ▀▄▀██▀▄█▄█ ▀▄ \n █▀███▀▀███▄▀ \n █▄▄▄▄███▀█ \n █ ████ ▄██▄ \n█▀▄██ ▄████ █▄ █\n█▄▀ █▄█▀ ██▄▀▀▄█"]]], + ["astamon", [["angry", " \n █▀▄▄▄▄████▀ \n █▄██████▀▄ ▄▄ \n ████▀ ██ ████ \n ███▄▄▀ █ ████ \n ▄▀▄▄▄▄█▄▄█▀▄▀█ \n ▀▄▄██▀ ▀▄▄▄█ ▀ \n █▄▄▄█▀▀█▄▄▄█ "], ["attack", " █▀▄▄▄▄████▀▄ \n █▄██████▀▄ ██▄\n ████▀ ██ ████\n ████▄▀ █ █▀██\n▄█▄█▄▄▄▄█▄▄▀▄ █\n▀▄█████████▄ █ \n ▄█▀▄▄▄▄█▄▄▄█ \n █▄▄▄█ ▀▄▄█▄█ "], ["eat_1", " ▄▀█▄▄████▀ \n ████▀ ▄█▀▄ \n █▀▀▀▀▀███ █ ▄ \n █▄ ██ ▄▀▄██\n█ ▄█▄▄▄██▄▀█████\n▀▄▄▀▄▄▀ ▄█▄ █▀██\n █▀▄▄▄▀▀▄▄▄▀ █\n █▄▄▄█▀▀▄▄▄▄█ "], ["eat_2", " █▀▄▄▄▄████▀ \n █▄██████▀▄ ▄ \n ███▀▄▀██ █▄██ \n █████▀ █ ████ \n ▄▀▄▄▄▄█▄▄▀████ \n█ ▄▀▄▄▀ ▄█▄ █ █ \n ▀█▀▄▄▄▀▀▄▄▄▀ \n █▄▄▄█▀▀▄▄▄▄█ "], ["happy", " ▄▀█▄▄████▀ \n ████▀▄▀█▀▄ █▄\n █████████ ███\n█▀█ █▀▀███\n▀▄ █▄▄▄▄▄█▀ █▀█\n ▀█▀▄▄▀ ▀▄▄▀ ▀\n ▄▀█▄ ▄▀█▄ \n █▄▄▄█▀▀▀▄▄▄▄█ "], ["injured_1", " ▄▄ ▄▄▄▄ \n█▄▄███████▀▀ \n ███▀████ ▀▄ ▄ \n ████▄▄▀█ ████ \n ▀█▀▀▀ ▄▀ ▄█████\n █ █▀▀█▀█▀ █ ▀██\n ▀▄█▀▀ ▄▀ ▄█ ▀\n █▄▄██▀▀██▄▄█ "], ["injured_2", " \n▄▀▀▄▄▄▄████▄ \n▀████████▀▄ \n ███▄▀▀██ █▄█▄ \n █████▀ █ ████▄\n ▄▀▄▄▄▄█▄▄▀█▀███\n ▀▄█▀▀ ▄▀ ▄█ ▀█\n █▄▄██▀▀██▄▄█ "], ["sleep_1", " \n █▀▄▄▄▄████▀ \n █▄██████▀▄ \n ███▀▀▀██ █ █▄ \n █████▀ █ ████▄\n ▄▀▄▄▄▄█▄▄██████\n▄▀▀█▄▄▄▀▀█▄▀▄ ▀█\n▀▄▄█▄▄█▄▄█▄▄▀ "], ["sleep_2", " ▄▄ ▄▄▄▄▄ \n █ ███████▀ \n ████████ ▀▄ ▄ \n ███▄▄▄▀█ █▄██ \n ▀█▀▀▀ ▄▀ ▄█████\n █ ███▀▀██▀█▀▀██\n▄▀▀█▄▄▄▀▀█▄ █ ▀\n▀▄▄█▄▄█▄▄█▄▄▀ "], ["walk_1", " █▀▄▄▄▄████▀ \n █▄██████▀▄ \n ████▀ ██ █ █▄ \n ████▄▀ █ ████▄\n ▄▀▄▄▄▄█▄▄▀█████\n█ ▄▀▄▄▀ ▄█▄ █ ▀█\n ▀█▀▄▄▄▀▀▄▄▄▀ \n █▄▄▄█▀▀▄▄▄▄█ "], ["walk_2", " ▄▄ ▄▄▄▄▄ \n █ ███████▀ \n █████▀██ ▀▄ ▄ \n ████ ▄▀█ █▄██ \n ▀█▀▀▀ ▄▀ ▄█████\n▄▀ █▀▀█▀▀█ ▀█▀██\n▀▄█▄▀▀ ▄█▀▀ █ ▀\n█▄▄▄█▀▀▀▄███▄█ "]]], + ["asuramon", [["angry", " ▄▄▄ ▄ ▄ ▄ ▄▄ \n▄▀ ▄▀ ▀▀█ ▀█ █ \n██ ▄▄▀█▀▄▄ ██ \n█ ▀▀ ▀█▀ ▀▀▄▀▄\n██▄ ▄█ █ █▄ ▄█▀█\n█▄ ▄▀▄ █ █\n▀▄██▀█ ▄▀███▄▄▀\n█▄▄█▄█▄▄██▄▄▄▄█ "], ["attack", " █▀▄▀▀█▀▄▀▀▄▀█ \n█▀▄▄▀▀▄▄ █▀█▄▀▄ \n▀█▄ ▄█ ▀█ ▄ █▀ \n█▄▄▄▄▄▄ █ ▀▀█▀▄\n████▀▀▀█ █ ███▄█\n██▀▀▀▀▀▀▄▀ ▀▀█ █\n▀▄██▀█▀▀█▀███▄▀ \n█▄▄▄█▀▀▀▀█▄▄▄▄█ "], ["eat_1", " █▀▄▀▀█▄█▀▀▄▀█ \n█▀▄▄▀▀▄█▄▀▀▄▄▀█ \n▀█▄ ▄█ █ ▄▄ ▄█▀ \n██▄▄▄▄ █ ▄▄ █▀▄\n█████▀ █ ██ █▄█\n█▀▄▄▄▄█▄█▄▄▄▄▀█▀\n▀▄▄█ █ █▀▄▄▄▄▀ \n█▄▄▄█▀▀▀▀█▄▄▄▄█ "], ["eat_2", " \n▄█▀▄▀▀█▄█▀▀▄▀█▄ \n█▀▄▄▀▀▄█▄▀▀▄▄▀█ \n█▀▄ ▄▀▄█▄▀▄ ▄█▀▄\n█ ▄▄▄ █ ▄▄ █▀█\n█▀▄▄▄▄▀ ▀▄▄▄▄▀ █\n ███▀█▀▀█ █▄▄▄▄▀\n█▄▄█▄█▄▄██▄▄▄▄█ "], ["happy", " █▀▄▀▀█▄█▀▀▄▀█ \n█▀▄▄▀▀▄█▄▀▀▄▄▀█ \n█▀▄ ▄▀▄█ ▄▄ ▄█▀ \n█ ▄ █ ▄ █▀▄\n█ ▀▀▀ █ ▀▀▀█▄█\n█▀▄▄▄▄█▄█▄▄▄▄▀ █\n▀▄▄█ █ █▀▄▄▄▄▀ \n█▄▄▄█▀▀▀▀█▄▄▄▄█ "], ["injured_1", " \n █▀▄▀▀█▄█▀▀▄▀█ \n█▀▄▄▀▀▄█▄▀▀▄▄▀█ \n▀█ ▄ █ ▄ █▀ \n▄█▀ ▀▀ █ ▀▀ ▀█▄ \n█▀▄▄▄▄▀ ▀▄▄▄▄▀█ \n█ ▀█▀█▀▀▄█ ▄█ \n██▄▄█▄█▄▄█▄▄█▄█ "], ["injured_2", " \n ▄▄ ▄▄▄ ▄▄▄ ▄▄ \n▄█ ▀ ▀█▀ ▀ ▀█ \n█ ▄▄▀▀▄█▄▀▀▄▄▄█ \n▄█ ▄ █ ▄ █▄ \n██▀ ▀▀▄▀▄▀▀ ▀██ \n█ ▀▀█▀█▀▀██▀▀▄█ \n██▄▄█▄█▄▄█▄▄█▄█ "], ["sleep_1", " \n ▄▄ ▄▄▄ ▄▄▄ ▄▄ \n▄█ ▀ ▀█▀ ▀ █▄ \n█ ▄▄▀▀▄█▄▀▀▄▄ █ \n █▄ ▄▄ █ ▄▄ ▄█ \n █ ▄▀▄ ▄▀▄ \n ▄▀▀██▄█▄█▀█ █\n █▄▄█▄█▄▄█▄█▄▄▄█"], ["sleep_2", " \n █▀▄▀▀█▄█▀▀▄▀█ \n █▀ ▄▄ █ ▄▄ ▀█\n ▀▄▀▀ ▀█▀ ▀▀▄▀\n █▀ ▀▀ █ ▀▀ ▀█ \n ▄▀▄▄▄▄▀ ▀▄▄▄▀█ \n █ █▄▄█▄▄▀█ █\n █▄▄█▄█▄▄█▄█▄▄▄█"], ["walk_1", " █▀▄▀▀█▄█▀▀▄▀█ \n█▀▄▄▀▀▄█▄▀▀▄▄▀█ \n▀█▄ ▄█ █ ▄▄ ▄█▀ \n██▄▄▄▄ █ ▄ █▀▄\n█▀▄▄▄▄▀ ▀▄▄▄▄▀▄█\n█ ▄█▄▄█▄▄▄▀▀▄ █▀\n▀▄▄█ █ █▀▄▄▄▄▀ \n█▄▄▄█▀▀▀▀█▄▄▄▄█ "], ["walk_2", " ▄▄ ▄▄▄ ▄▄▄ ▄▄ \n▄█ ▀▄▄▀█▀▄▄▀ █▄ \n█ ▀▀ ▀█▀▄ ▀▀▄█ \n█▀▀ ▀▀ █ ▀▀ ▀█▀▄\n█▄ ▀ ▄▀▄ ▀▀▀█▀█\n█ ▀█▀▀▄ ██▀▀▄ █\n ███▀█▀▀█ █▄▄▄▄▀\n█▄▄█▄█▄▄██▄▄▄▄█ "]]], + ["azulongmon", [["angry", " ▄▀█▄▄██████▀▀ \n█▄███▀██▀████▀ \n█▀▀█▄▄█▄▄███▀█▀▄\n ██▄▀███▀▀▀█▀ █\n█▀▀▀▄▀ ▀▄▄▀▄▄▀▄█\n█▀█ █▀▄▀ █ ▀▄▀▄▀\n █ ██▀ ▀▄▀▀█▀ █ \n ▀▀ ▀▄█▄▄█▄▄▀ "], ["attack", " ▄▄ ▄▄▄▄▄▄▄▄ \n▄▀▄██▀▀█▀▀██▄▄ \n████▄▄█▄▄████▄▄ \n█▄▄▀████████▄▀ █\n█ ▀▄▀█▀█ ▄▀ ▄ █\n █ ██▄ ▄▀█ █▀▄▀█\n█▄▀ █▄▀▄ █▄▄█ █ \n ▀▄▄█▄█▄▄▀ "], ["eat_1", " ▄▄ ▄▄▄▄▄▄▄▄ \n▄▀▄█████████▄▄ \n█████▀▄▄▀████▄▄ \n█▄▄▀████████▄▀ █\n█ ▀▄▀█▀█ ▄▀ ▄ █\n █ ██▄ ▄▀█ █▀▄▀█\n█▄▀ █▄▀▄ █▄▄█ █ \n ▀▄▄█▄█▄▄▀ "], ["eat_2", " ▄▀█▄▄██████▀▀ \n█▄██▀ ▄▀ ▄███▀ \n█▀▀█████████▀█▀▄\n ██▄▀███▀▀▀█▀ █\n█▀▀▀▄▀ ▀▄▄▀▄▄▀▄█\n█▀▀▄█▀▄▀ █ ▀▄▀▄▀\n █ ██▀ ▀▄▀▀█▀ █ \n█▄▀ ▀▄█▄▄█▄▄▀ "], ["happy", " ▄▀█▄▄██████▀▀ \n█▄████▀▀█████▀ \n█▀▀██▄██▄███▀█▀▄\n ██▄▀███▀▀▀█▀ █\n█▄▄ ▄▀ ▀▄▄▀▄▄▀▄█\n█ ▀▄█▀▄▀ █ ▀▄▀▄▀\n █ ██▀ ▀▄▀▀█▀ █ \n█▄▀ ▀▄█▄▄█▄▄▀ "], ["injured_1", " \n ▄▄ ▄▄▄▄▄▄▄▄ \n▄▀▄█████████▄▄ \n████ ▀█ ▀████▄▄ \n█▄▄▀████████▄▀ █\n█ ▀▄▀█▀█ ▄▀ ▄ █\n █ ██▄ ▄▀█▄█▀▄▀█\n█▄▀ ▀▄█▄▄█▄▄█▄▀ "], ["injured_2", " \n \n ▄▀█▄▄██████▀▀ \n█▄██▀██▀█████▀ \n█▀▀█▄▄█▄▄███▀█▀ \n▀██ ████▀▀▀█▀ █\n▄▀ █▄▀ ▀▄▄▀▄▄▀▄█\n█▄▀█▄█▄█▄███▄█▄█"], ["refuse", " ▄▄ ▄▄▄▄▄▄▄▄ \n▄▀▄█████████▄▄ \n████▀ █▀ ████▄▄ \n█▄▄▀████████▄▀ █\n█ ▀▄▀█▀█ ▄▀ ▄ █\n █ ██▄ ▄▀█ █▀▄▀█\n█▄▀ █▄▀▄ █▄▄█ █ \n ▀▄▄█▄█▄▄▀ "], ["sleep_1", " ▄▄ ▄▄▄▄▄▄▄▄ \n▄▀▄█████████▄▄ \n████▄▄█▄▄████▄▄ \n█▄▄▀████████▄▀ █\n█ ▀▄▀█▀█ ▄▀ ▄ █\n █ ██▄ ▄▀█ █▀▄▀█\n█▄▀ █▄▀▄ █▄▄█ █ \n ▀▄▄█▄█▄▄▀ "], ["sleep_2", " \n ▄▀█▄▄██████▀▀ \n█▄██▀▀█▀▀████▀ \n█▀▀█████████▀█▀▄\n█▀█ ████▀▀▀█▀ █\n▀▄ █▄▀ ▀▄▄▀▄▄▀▄█\n▄▀▄▀█▀▄▀ █ ▀▄▀▄▀\n▀▀ ▀█▄█▄██▄▄█▀ "], ["walk_1", " ▄▀█▄▄██████▀▀ \n█▄██▀ ▄▀ ▄███▀ \n█▀▀█████████▀█▀▄\n█▀█ ████▀▀▀█▀ █\n▀▄ █▄▀ ▀▄▄▀▄▄▀▄█\n▄▀▄▀█▀▄▀ █ ▀▄▀▄▀\n▀▀ █▀ ▀▄▀▀█▀ █ \n ▀▄█▄▄█▄▄▀ "], ["walk_2", " ▄▄ ▄▄▄▄▄▄▄▄ \n▄▀▄██▀▀█▀▀██▄▄ \n████▄▄█▄▄████▄▄ \n█▄▄▀████████▄▀ █\n█ ▀▄▀█▀█ ▄▀ ▄ █\n █ ██▄ ▄▀█ █▀▄▀█\n█▄▀ █▄▀▄ █▄▄█ █ \n ▀▄▄█▄█▄▄▀ "]]], + ["baalmon", [["angry", " ▄▄▄▄▄▄▄ \n ▄█▀████████▄ \n ██▄██▀▀▀██ ▀█ \n █▀▀▀ ▄█ █▄ \n ▄█▄▄▄▄▄█████▄ \n▄▀ ▀█▀▀▀ ▄▀█▄▀██\n█▄▄██▀▀▀▀▀█ █ ██\n █▄▄█▀▀▀█▄█▄▀▀█"], ["attack", " ▄███████▄▄ \n ██ ██▀▀▀██▀█▄\n ███▀ ▄█ █ ▀\n ▀▄ ▄▄█▄ \n ▄▀▀█▀██▀▀██▀█▄\n ▀▄ █▄▄▄█▄▀█ █\n ▄▀▄██ ▄▄▄▀▀█▄██\n█▄██▄▄█▀ █▄▄█ ▀"], ["eat_1", " ▄███████▄▄ \n ██ ██▀▀▀██▀█▄ \n ███▀ ▄▀▄ █ ▀ \n █ ▄▄▄▄ ▄▀█▄ \n █████▄▀▄█ ██▄\n ▄▀ █▄▄▄▄█▀▄█▀██\n ▀▄▄█ ▄▄▄▀█▀ █\n █▄▄█ █▄▄█ "], ["eat_2", " ▄▄▄▄▄▄▄ \n ▄█▀████████▄ \n ██▄██▀▀▀██ ▀█ \n █▀▀▀ ▄▀▄ █▄ \n ▀▄▄▄▄▄▄████▄ \n ▄▀█▀▀▀ ▄▀█▄▀██\n █ ▄█▀▀▀▀▀█ █ ██\n █▄▄█▀▀▀█▄█▄▀ █"], ["happy", " ▄███████▄▄▄ \n ██ ██▀▀▀██▀▀█ \n ███▀ ▄▀▄ █ \n ▄█ ▄▄▄▄ ▄▀█▄ \n▀▄ ▀████▄▀▄█ ██▄\n ▀▄█▄▄▄▄█▀▄█▀██\n ▄█ ▄▄▄▀█▀ █\n █▄▄█ █▄▄█ "], ["injured_1", " \n ▄███████▄▄ \n ██▀███████▀█▄ \n ██▄█▀▄ ▀█ ▀ \n ▀▄ ▀▀▄▄██▄▄ \n ▄▀████▀▀██████\n █ █▄▄▄▄▀▄█ ███\n █▄▄██▄▄█▄▀▄█ █"], ["injured_2", " \n ▄▄▄▄▄▄▄ \n ▄██████████▄ \n ██ ██▀▀▀██ ▀█ \n █▀▀▀ █▄ █▄▄ \n █▄▄▄▄▄██████▄ \n▄▀ ▄█▄▄▄▀▄█ █▀█▄\n▀█▄▄█▄▄█▄▀▄██ █"], ["sleep_1", " \n ▄▄▄▄▄▄▄ \n ▄█▀████████▄ \n ██▄██▀▀▀██ ▀█ \n █▀▀▀ ▄▄ █▄ \n ▀▄▄▄▄▄▄█████▄ \n ▄▀██▄▄ █▀▄▀▀██▄\n █▄▄█▄█▄▀▄█▄▄█▀█"], ["sleep_2", " \n ▄███████▄▄ \n ██ ███████▀█▄ \n ████▀ ▀█ ▀ \n ▀▄ ▀▀ ▄██▄ \n ▄████▀███▀██▄\n ▄▀██▄▄ █▀▄▀▀▄██\n █▄▄█▄█▄▀▄█▄▄█▀█"], ["walk_1", " ▄███████▄▄ \n ██ ██▀▀▀██▀█▄ \n ███▀ ▄█▀ █ ▀ \n ▀▄ ▄▄██▄ \n ▄████▀▀██▀██▄\n ▄▀ █▄▄▄▄█▄▀█ ██\n ▀▄▄█ ▄▄▄▀█▄▀▄▀█\n █▄▄█ █▄▄█▀ ▀"], ["walk_2", " ▄▄▄▄▄▄▄ \n ▄█▀████████▄ \n ██▄█▀ ▄▄▀█ ▀█ \n █▀▀ ▀▀ █▄ \n ▀▄▄▄▄▄█████▄ \n ▄▀█▀▀▀ ▄▀█▄▀██\n █ ▄█▀▀▀▀▀█ █ ██\n █▄▄█▀▀▀█▄█▄▀ █"]]], + ["baboongamon", [["angry", " ▄▄ \n ▄▄▄▄ █ █ \n▄▀▄█████▀▀▄ ▀█ █\n▀▄ █ ▄▀▄█▀▀▄█ █\n█ ▀ ▀▀ ███ █ █\n ▀▄▀▀▀▀█▀█▄ █▀ \n ▄▀▀▀█▀ ▄█▄▄▀▄ \n█▄█▄▄█▀▀▀█▄▄█▄█ "], ["attack", " ▄▀▀▄ \n▄▀▄▄████▀▀▄▀▄▄▀▄\n█ ▀█▀▀▀▀▄██▄▄█ █\n▄▀▄▀ ▄█ ▄█▄ ▀▄█\n▀▄▄▄▄▄▄ ▀███▀ █\n ▀████ ▄███▀ ▄▀\n ▄▀▄▄▄▄██▀▀▀█▀ \n █▄█▄█ █▄█▄█ "], ["eat_1", " ▄▀▀▄ \n ▄ ▄█▄▄ ▀▄▄▀▄\n█ ▀██▀█ ▄██▄ █ █\n▄▀▄▀ ▀███▄ ▀█ █\n▀▄▄▄▄▄▄ ██▀ █▄▀\n ▀████ █▀ ▄▀ \n ▄▀▄▄▄▄▄█▀▀▀▄ \n █▄█▄█ █▄█▄█ "], ["eat_2", " ▄▄ \n ▄▄▄▄ █ █ \n▄▀▄█████▀▀▄ ▀█ █\n▀▄ █ ▄ ▀▄█▀▀▄█ █\n█ ▀ ▀ ▀ ███ █ █\n ▀▄▀▀▀▀█▀█▄ █▀ \n ▄▀▀▀█▀ ▄█▄▄▀▄ \n█▄█▄▄█▀▀▀█▄▄█▄█ "], ["happy", " ▄▀▀█▀▄ \n▄▀▄▄████▀█▀ ▀▄▀▄\n█ ▀█▀▀▀▀▄██ █ █\n▄▀▀ ▄▀▄ ██▄▄██ █\n▀▄▄▄▄▄▄ ▀█████▄▀\n ▀████ ▄███▀ \n ▄▀▄▄▄▄██▀▀▀▄ \n █▄█▄█ █▄█▄█ "], ["injured_1", " \n ▄▀▀▄ \n ▄ ▄████▄▄ ▀▄▄▀█\n█ ▀█▀▀▀█ ▄█▄ █ █\n▄▀▄▀ █▄ ██▄ ▀█ █\n▀▄ ▄▄▄ ███▀ █▄▀\n ▄█▄▄▄█▀ ██▄▄█ \n█▄█▄▄█▀▀▀█▄▄█▄█ "], ["injured_2", " \n ▄▄ \n ▄▄▄▄ █ █▄\n▄▀▄█████▀▀▄ ▀█ █\n▀▄ █ ▄ ▀▄█▀▀▄█ █\n█ ▀ ▀▀▄███ █ █\n █▄▀▀▀▄█▀█▄ ██ \n█▄█████▄▄████▄█ "], ["sleep_1", " \n ▄▄ \n ▄▄▄▄ █ █▄\n▄▀▄████▀▀█▄ ▀█ █\n▀▄ █▀ █▄██▀▀▄█ █\n█ ▀ ▄████ █ █\n █▄▀▀▀▄█▀█▄ ██ \n█▄█████▄▄████▄█ "], ["sleep_2", " \n ▄▀▀▄ \n ▄ ▄████▄▄ ▀▄▄▀▄\n█ ▀██▀█ ▄██▄ █ █\n▄▀▄▀ ▀███▄ ▀█ █\n▀▄ ▄▄▄▀███▀ █▄▀\n ▄█▄▄▄█▀ ██▄▄█ \n█▄█▄▄█▀▀▀█▄▄█▄█ "], ["walk_1", " ▄▀▀▄ \n ▄ ▄████▄▄ ▀▄▄▀▄\n█ ▀██▀█ ▄██▄ █ █\n▄▀▄▀ ▀███▄ ▀█ █\n▀▄ ▄▄▄▀███▀ █▄▀\n ▀▄▄▄█▀ █▀ ▄▀ \n █ ▀▀▄▄█▀▀▀▄ \n █▄█▄█ █▄█▄█ "], ["walk_2", " ▄▄ \n ▄▄▄▄ █ █ \n▄▀▄████▀▀█▄ ▀█ █\n▀▄ █▀ █▄██▀▀▄█ █\n█ ▀ ▄████ █ █\n ▀▄▀▀▀▄█▀█▄ █▀ \n ▄▀▀▀█▀ ▄█▄▄▀▄ \n█▄█▄▄█▀▀▀█▄▄█▄█ "]]], + ["bagramon", [["angry", " ▄ ▄▄ ▄▄▄▄ ▄ \n █▀█ ▀▄▄▄ ▀█▀█ \n █ ▀▄▀ ▄▀▄ █ \n █▄▀ ▀▀ █ ▀▄ \n ▀▄▄▄▄▄▀█▀▀▄█ \n ▄▀▀▄▄█▄▄██▀ █ \n█▄▄▄█▄▄▄██ ▄█▄ \n █▄█▄█▀▀▄███▄██▄"], ["attack", " █▀▄▀▀▀▀▄▄▄█\n ▄▀▄▄▀▀▀▄ ▀▄▀\n █▄▀ ▄█ ▀▄ █ \n▄▄▄ ▀█ ▄█▄▀▄\n▀▄▄▀▄▄█▀███▄███ \n▀▄▄ ▀▀▀ ▄▀▀█▄\n▀▄▄▄█▄▄▄▄▄▄▄████\n █▄██ █▄█▄█▀"], ["eat_1", " █▄█▀▄▀▀▀▀▄▄▄█ \n ▀▄▀▄▄▀▀▀▄ ▀▄▀ \n █ █ ▄▀▄ █ █ \n ▀█▄▄▄▄ █▄ ▀▄ \n ▄█▀▀█ ▄█ ▀▄▀ \n ▄▀ █▀▀▀▄▀ ▄█ \n ▀▄█▀▀▀█▀▄▄████ \n █▄█▄█ ▀▄█▄█▀▀▀"], ["eat_2", " ▄ ▄▄ ▄▄▄▄ ▄ \n █▀█ ▀▄▄▄ ▀█▀█ \n █ █▀ ▄ ▀▄ █ \n █▄▀ ▀ ▀ █ ▀▄ \n ▀▄▄▄▄▄▀█▀▄ █ \n ▄▀▄▄█▄▄█▀ █ \n █▄▄█▄▄▄█ ▄▄██▄ \n █▄█▄█▀▀▄█▄█▄██▄"], ["happy", " █▄█▀▄▀▀▀▀▄▄▄█ \n ▀▄▀▄▄▀▀▀▄ ▀▄▀ \n █ █ ▄▀▄ █ █ \n ▀█▄▄▄▄ █▄ ▀▄ \n ▄█▀▀▀ ▄█▄█▀▀▄\n ▄▀ █▀▀▀██▀ █\n ▀▄█▀▀▀████▄▄▄█ \n █▄█▄█ ▀▄█▄█▀▀▀"], ["injured_1", " \n █▄█▀▄▀▀▀▀▄▄▄█ \n ▀▄▀▄ █▀▀▄ ▀▄▀ \n █ ▄▀ ▄ █ █ \n ▀█ ▀▀▄█▄ ▀▄ \n ▄▀▀█▀▀▄█ ▀▄▀ \n ▄█▄█▀▀▀█▀ ▄█▄ \n █▄█▄███▄▄▄█▄██▄"], ["injured_2", " \n▄ ▄▄ ▄▄▄▄ ▄ \n█▀█ ▀▄▄▄ ▀█▀█ \n █ ▀▄▀ ▀▄ █ \n █▄▀ █▄ █ ▀▄ \n ▀▄▄▄▄▄▀█▀▄ █ \n ▄█▄█▀██▀▀ ██▄ \n █▄█▄██▄▄▄▄█▄██▄"], ["sleep_1", " \n \n█▄█▀▄▀▀▀▀▄▄▄█ \n▀▄▀▄ █▀▀▄ ▀▄▀ \n █ ▄▀ ▄▄ █ █ \n ▀█ ▄█▄ ▀▄ \n ▄▀█████▄█▀█▀█▀▄\n █▄▄█▄▄▄██▄▄▄▄▄█"], ["sleep_2", " \n ▄ ▄▄ ▄▄▄▄ ▄ \n █▀█ ▀▄▄▄ ▀█▀█ \n █ ▀▄▀ ▀▄ █ \n █▄▀ ▀▀ █ ▀▄ \n ▀▄▄▄▄▄▀█▀▄ █ \n █▀█▄▄█▄▄█▀█▀█▀▄\n █▄▄█▄▄▄██▄▄▄▄▄█"], ["walk_1", " █▄█▀▄▀▀▀▀▄▄▄█ \n ▀▄▀▄ █▀▀▄ ▀▄▀ \n █ ▄▀ ▄█ █ █ \n ▀█ ▄█▄ ▀▄ \n ▄▀▀█▀▀▄█ ▀▄▀ \n ▄▀ █▀▀▀█▀ ▄█ \n ▀▄█▀▀▀█▀▄▄████ \n █▄█▄█ ▀▄█▄█▀▀▀"], ["walk_2", " ▄ ▄▄ ▄▄▄▄ ▄ \n █▀█ ▀▄▄▄ ▀█▀█ \n █ ▀▄▀ ▄▀▄ █ \n █▄▀ ▀▀ █ ▀▄ \n ▀▄▄▄▄▄▀█▀▄ █ \n ▄▀▄▄█▄▄█▀ █ \n █▄▄█▄▄▄█ ▄▄██▄ \n █▄█▄█▀▀▄█▄█▄██▄"]]], + ["baihumon", [["angry", " ▄▄███▄▄ ▄ \n▄███▀ █ ▄█▄ ▄▀ █\n█ ▀█████▀▄ █ ▀▄\n████ ██▀▄▀█▄▄▀ █\n █▀▀ ▄▀▄▀ ▀ █ █ \n ▀▀█▀ █ ▄ ▄▄█\n ▄██▄██▄█▀▀▄▄▄█\n █▄█▄█▄█▄█ █▄█▄█"], ["attack", " ▄▄███▄▄ ▄▀█\n▄███▀▄█ ▄█▄ █ ▀▄\n█ ▀█████▀▄ ▄▀ █\n█▀▀ ▀█▀▄▀██▀▄█ \n █▀ ▀▀▀ ▀ █ \n█▄█▄▄█ █▄▄ ▀▀▄ \n▀▄█▄█▄▀▀▀██▄▀█▀█\n ▀▀▀▀▀▀▀"], ["eat_1", " \n ▄▄▄ ▄▀▄\n ▄██▀██▀▀▄ █ ▄▀\n█▀▀▄█▄█▄██▀ ▀▄ █\n█▄▄ ▀███▀▄█▀▄█ █\n▀▄▄ ▄▄█ ▄ ▀ ▀ ▀▄\n ▄▄█▄▄▄▄▀ ▄█▄▄ █\n█▄▄█▄█▄█▄█▄█▄█▄▀"], ["eat_2", " ▄▄███▄▄ ▄ \n▄███▀▄█ ▄█▄ ▄▀ █\n█ ▀█████▀▄ █ ▀▄\n████ ██▀▄▀█▄▄▀ █\n █▀▀ ▄▀▄▀ ▀ █ █ \n ▀▀█▀ █ ▄ ▄▄█\n ▄██▄██▄█▀▀▄▄▄█\n █▄█▄█▄█▄█ █▄█▄█"], ["happy", " ▄▄▄ \n ▄██▀██▀▀▄ ▄▀▄\n███▄█▄█▄██▄ █ ▄▀\n█ ▀████▀▄█ ▀▄ █\n████ ▀█ ▀█ ▀▄█ █\n▀▄▄ ▄▄█ ▄ ▀ ▀▄\n ▄▄█▄▄▄▄▀ ▄█▄▄ █\n█▄▄█▄█▄█▄█▄█▄█▄▀"], ["injured_1", " \n \n ▄▄▄ ▄▄ \n ▄██▀██▀▀▄▄█▄ ▀▄\n█▀▀█▄▄█▄██▄▀█▀ █\n█▄▄ ▀███▀ ▀ ▀ ▄█\n▀▄▄▄▄▄█ █ ▄▄▀ █\n█▄█▄█▄███▄█▄█▄▄▀"], ["injured_2", " \n \n \n ▄▄███▄▄ ▄▀▀▄ \n▄███ ▀█ ▄█▀██▄ █\n█ ▀█████▀█ █ █\n███▄ ▀█▀ ▄▄▄▄▀▀█\n█▄█▄██▄▄▄█▄█▄▄▄█"], ["refuse", " \n ▄▄▄ ▄▀▄\n ▄███▀█▀▀▄ █ ▄▀\n█▀▀█▄▄█▄██▀ ▀▄ █\n█▄▄ ▀███▀▄█▀▄█ █\n▀▄▄ ▄▄█ ▄ ▀ ▀ ▀▄\n ▄▄█▄▄▄▄▀ ▄█▄▄ █\n█▄▄█▄█▄█▄█▄█▄█▄▀"], ["sleep_1", " \n \n ▄▄███▄▄ ▄▀▄\n▄███▀▀█ ▄█▄▄▄▀ █\n█ ▀█████▀▄▀█▀▄▀\n█▀▀ ▀█▀ ▀ ▀ ▄█\n▄▀█▄██▀ ▄█ ▄▄▀ █\n█▄█▄█▄███▄█▄█▄▄▀"], ["sleep_2", " \n \n ▄▄▄ ▄▀▄\n ▄█████▀▀▄▄▄▄▀ █\n█▀▀█▄▄█▄██▄▀█▀▄▀\n█▄▄ ▀███▀ ▀ ▀ ▄█\n▀▄▄▄▄▄█ █ ▄▄▀ █\n█▄█▄█▄███▄█▄█▄▄▀"], ["walk_1", " ▄▄▄ ▄ \n ▄███▀█▀▀▄ ▄▀ █\n█▀▀█▄▄█▄██▀ █ ▀▄\n█▄▄ ▀███▀▄█▄▄▀ █\n▀▄▄ ▄▄█ █ ▀ █ █ \n █ ▄▀ ▄ ▄▄█\n ▄██▄██▄█▀▀▄▄▄█\n █▄█▄█▄█▄█ █▄█▄█"], ["walk_2", " ▄▄███▄▄ ▄▀█\n▄███▀▄█ ▄█▄ █ ▀▄\n█ ▀█████▀▄ ▄▀ █\n█▀▀ ▀█▀▄▀██▀▄█ \n █▀ ▀▀▀ ▀ █ \n█▄█▄▄█ █▄▄ ▀▀▄ \n▀▄█▄█▄▀▀▀██▄▀█▀█\n ▀▀▀▀▀▀▀"]]], + ["bakemon", [["angry", " ▄▀▀▀▀▀▀▄ \n █▄▄ ▄▄ █ \n▄▀█▀▀ ▀▀▄▀▀▀▄ \n█▄█▀█▀█▀██ █ █ \n▀ █▀▀▀▀▀▀▀▀ ▀▄\n █▄▀██ █▄██ █▀▀\n ▀ ▀ ▀ ▀ ▀ \n ▄▄▄▄▄▄ "], ["attack", "█▄ ▄▀▀▀▀█▀▄█▄ \n█ █▀▀ ▀▀ █ █ \n▀▄█▀█▀█▀█ █ ▀█ \n ███████ ▀█▀ \n █▀█▀█▀█ ▀▄ \n █▀▀▀▀▀▀ ▄ █ \n █▄▀██ █▄██ ▄▄█\n ▄█▄▄█▄█▄█▄▄█▄▄ "], ["eat_1", "▄▀▀▄▀▀▀▀█▀▄▄▀▀▄ \n█ █▀▀ ▀ ▀ █ █ █\n█▀█▀█▀█▀▄ █▀█ █\n ████████ ▄▀\n ████▄▄▄█ ▀▄ \n █ ▄ ▄ █ \n █▄▀██ █▄██ ▄▄█\n ▄█▄▄█▄█▄█▄▄█▄▄ "], ["eat_2", " ▄▀▀▀▀▀▀▄ \n █ █ \n ▄█▀▄ ▄▀ ▄▄█▄ \n█ █ █ ▄ █ \n█▀█ ▀▀▀▀ ▀▄▀ ▀▄\n █▄▀██ █▄██ █▀▀\n ▀ ▀ ▀ ▀ ▀ \n ▄▄▄▄▄▄ "], ["happy", "▄▀▀▄▀▀▀▀▀▀▄▄▀▀▄ \n█ █▀▀ ▀▀ █ █ █\n█▀██▄▄▄██▄ █▀█ █\n ████████ ▄▀\n ███████▀ ▀▄ \n █ ▀▀▀▀▄ ▄ █ \n █▄███ █▄██ ▄▄█\n ▄███████████▄▄ "], ["injured_1", " \n ▄▄▄▄▄▄ \n ▄█▄ ▄▄ ▀▄ \n █ ▄ ▀▄ \n▄▀█ ██ █ ▄▀▀▀▄ \n█▄█ ██ █ █ █ █ \n▀ █ ▄ ▄ ▀ ▄▀▄ \n █▄█▄▄█▄█▄█▄▄██▄"], ["injured_2", " \n \n ▄▀▀▀▀▀▀▄ \n █ ▀▄ \n █▀▀ ▀▀ ▄▀▄ \n ██▀█▀█▀▄ █ █ \n █▀▀▀▀▀▀▀ ▀▄▄▀▄\n █▄▄█▄▄██▄▄█▄█▄█"], ["sleep_1", " \n ▄▀▀▀▀▀▀▄ \n █ ▀▄ \n █▀▀ ▀▀ ▀▄ \n ▀▄▄▄▄▄▄▄ ▀▄ \n █ ▀▄ \n ▀▄█▀▄▄█▀▄▀▄▄█ \n ▄▄▄▄▄▄▄▄▄ "], ["sleep_2", " ▄▄▄▄▄▄ \n ▄▀ ▀▄ \n █▄▄ ▄▄ █ \n █▄▄▄▄▄▄ █ \n ██▄█▄█▄█ ▀▄ \n █ █ \n ▀▄▀▄▄▀▄▀▄▄▀▄▀ \n ▄▄▄▄▄▄▄▄▄▄▄ "], ["walk_1", " ▄▀▀▀▀▀▀▄ \n ███ ██ █ \n ▄█▄▄▄▄▄ ▄▄█ \n█ █▄█▄█▄██ ▄ █ \n█▀██▄█▄█▄█▄▀ ▀▄ \n █ ▄▄▄ ▄ ▄▄ ▄▄█\n █▀ █▀▄▀█▀▀▄▀ \n ▄▄▄▄▄▄▄▄ "], ["walk_2", " ▄▀▀▀▀▀▀▄ \n █▄▄ ▄▄ █ \n▄▀█ ▄▀▀▀▄ \n█▄█▀█▀█▀██ █ █ \n▀ █▀▀▀▀▀▀▀▀ ▀▄\n █▄▀██ █▄██ █▀▀\n ▀ ▀ ▀ ▀ ▀ \n ▄▄▄▄▄▄ "]]], + ["baluchimon", [["angry", " █▄ █▄ \n ▄▄▀▀▀▀██ \n█ ▄█ ██ ▄ ▄ \n▀███ ▄█▀█▄▀ ▀▄ \n █▀▀ █▀ ▄█▄█ █ \n ▀▀▄█ ▄███▀▀█ █\n ▄▀█ ▀██▄▀▀▄ \n █▄█▄▄█ █▄█▄▀ "], ["attack", " ▄ ▄ \n ▄██▄██ \n▄▀▀ ▄▄ ▀█▄ \n█▄▄ ▀ ▄██ ▄▀▄▀ \n ▀▄▄ ▄█▀ ▀█ ▄ █ \n ▀▄▀ ▄████▄▀▄\n ▄▀█ ▀███ ▄▀▀█\n █▄█▄▄█▀▀▀█▄█▄▀"], ["eat_1", " ▄ ▄ \n ▄██▄██ \n▄▀▀ ▄ ▀█▄ \n█▄▄▀ ▀ ▄██ ▄▀▄▀ \n ▀▄▄ ▄█▀ ▀█ ▄ █ \n ▀▄▀ ▄████▄▀▄\n ▄▀█ ▀███ ▄▀▀█\n █▄█▄▄█▀▀▀█▄█▄▀"], ["eat_2", " █▄ █▄ \n ▄▄▀▀▀▀██ \n█ █▀ ██ ▄ ▄ \n▀██▄ ▄█▀█▄▀ ▀▄ \n █▀▀ █▀ ▄█▄█ █ \n ▀▀▄█ ▄███▀▀█ █\n ▄▀█ ▀██▄▀▀▄ \n █▄█▄▄█ █▄█▄▀ "], ["happy", " █▄ █▄ \n ▄▄▀▀▀▀██ \n█ ▄▀▄ ██ ▄ ▄ \n▀██▄ ▄█▀█▄▀ ▀▄ \n █▀▀ █▀ ▄█▄█ █ \n ▀▀▄█ ▄███▀▀█ █\n ▄▀█ ▀██▄▀▀▄ \n █▄█▄▄█ █▄█▄▀ "], ["injured_1", " \n ▄ ▄ \n ▄██▄██ \n▄▀▀ ▄ ▀█▄ \n█▄▄ ▀▀ ▄██ ▄▀▄ \n ▀▄▄ ▄█▀ ▀█▄▄ █ \n █▄█▄ ▄██ ▄▀▀█\n █▄█▄▄█████▄█▄█"], ["injured_2", " \n \n █▄ █▄ \n ▄▄▀▀▀▀██ \n█ █▄ ██ ▄ ▄ \n▀█▀ ▄█▀███▄▀▄ \n ▀█▄██ ▄█ ▄▀▀█\n █▄█▄▄█████▄█▄█"], ["refuse", " ▄ ▄ \n ▄██▄██ \n▄▀▀ ▄ ▀█▄ \n█▄▄ ▀▀ ▄██ ▄▀▄▀ \n ▀▄▄ ▄█▀ ▀█ ▄ █ \n ▀▄▀ ▄████▄▀▄\n ▄▀█ ▀███ ▄▀▀█\n █▄█▄▄█▀▀▀█▄█▄▀"], ["sleep_1", " ▄ ▄ \n ▄██▄██ \n▄▀▀ ▀█▄ \n█▄▄ ▀▀ ▄██ ▄▀▄▀ \n ▀▄▄ ▄█▀ ▀█ ▄ █ \n ▀▄█ ▄████▄▀▄\n ▄▀█▄▀███ ▄▀▀█\n █▄█▄▄█████▄█▄█"], ["sleep_2", " \n █▄ █▄ \n ▄▄▀▀▀▀██ \n█ ▄▄ ██ ▄ \n▀█▀ ▄█▀█▄▀ ▀▄ \n ▀█ █▀ █▄█ █ \n ▄▀█▄▀███ ▄▀▀█\n █▄█▄▄█████▄█▄█"], ["walk_1", " █▄ █▄ \n ▄▄▀▀▀▀██ \n█ █▀ ██ ▄ ▄ \n▀█▀ ▄█▀█▄▀ ▀▄ \n ▀█ █▀ ▄█▄█ █ \n ▀▄ ▄███▀▀█ █\n ▄▀█ ▀██▄▀▀▄ \n █▄█▄▄█ █▄█▄▀ "], ["walk_2", " ▄ ▄ \n ▄██▄██ \n▄▀▀ ▄▄ ▀█▄ \n█▄▄ ▀ ▄██ ▄▀▄▀ \n ▀▄▄ ▄█▀ ▀█ ▄ █ \n ▀▄▀ ▄████▄▀▄\n ▄▀█ ▀███ ▄▀▀█\n █▄█▄▄█▀▀▀█▄█▄▀"]]], + ["bancholeomon", [["angry", " ▄▄ ▄▀▀█████▄ \n█ ██▀▀▄▄▄█████▀ \n█ █▄▄▀▄ ▀ ███▀█ \n█ ██ ▀▀ ▄██ █\n█▄█▄▀█▀█▀▀█▀▀ ▄▀\n█ ▀ ▄█▄▄▄▄▄█▄▀ \n ▀███▄▄ ▄ ▄▄█▄ \n █▄█▄▄█▀█▄█▄▄█ "], ["attack", "▄▀▀█▀▀▀▀▀▀▀▀▀▄ \n█ ▄███▀▀▀████▀ \n█▄▀ ▄█▀▀█▀██▀ \n█▀█▀▀ ▄█▀ █▀▀▀█\n▀▄█ ██ ▄▀▀ ▄▀\n ▀▀█▀▀▀▀▀▀▄▄▀ \n ▄██▀▀▀▀▀█▄█▄ \n █▄█▄█████▄█▄▄█"], ["eat_1", " ▄▄ ▄██▀▀▀███▄ \n█ █▀ ▄█▀▀████▄ \n█ █▀▀▀ ▀▀ ██▄▄\n█ ███████▄ ▄███▄\n█▄█▄▀██ ▀▀██▄ \n█ ▀ ▄███▄▄▄█ ▀ \n ▀███▄▄ ▄ ▄▄█▄ \n █▄█▄▄█▀█▄█▄▄█ "], ["eat_2", " ▄▄▄▄▄▄▄ \n ▄▄ █▄▄ ▀▀███▄ \n█ █▀ ▄█▀▀█▀██▀ \n█ ██▀▀ ▄▀▄ ███▀\n█ █▀▄▄▄▄▄▄▄▀▀██▀\n█▄██ █ ▀ █ ▄ █\n█ ▀ ██▀▀▀▀▀█▄▄▄█\n ███▄▄█████▄█▄▄█"], ["happy", " █▀▄██▀▀▀██▄ \n █▄▀ ▄█▀▀████▄ \n█ ▀█▀▀ ▄▀▄ ██▄▄\n█▀▀█ ███ ▄█▀▀▄\n▀▄▄ ▀█▀█▀▀▀▄▀ ▄▀\n ▀▀█▄▄▄▄▄█▀▀ \n ▄█▄▄ ▄ ▄▄█▄ \n █▄█▄▄█▀█▄█▄▄█ "], ["injured_1", " \n ▄██████▄▄ \n ▄▀ ▀██▀███▄ \n █ ▀▀▀▀ ▄█ ██▄▄ \n ▀▄▄▄▄█▀ ▀ ███▄ \n ▀▄ ▄▀█▀▄ \n ▄▀█▀▀█▀▄▄▀ ▄▀▄\n █▄▄▄██▄▄▄███▄▄█"], ["injured_2", " \n ▄▄▄▄▄ \n ████████▄▄ \n▄█ ▄█▀▄███▀ \n█ ▀▀▀ ▄█ ███▀ \n▀▄▄▄▄▄▀ ▄██▀█ \n █▄▄▄▄▄▀▄▄▀ ▄▀▄\n █▄▄▄██▄▄▄███▄▄█"], ["sleep_1", " \n ▄███████▄ \n▄▀█▄▀ ▄▄████▄ \n█ █ ▀▀▀▀ ▄▀ ██▄▄\n█ █▀▄▄▄█▀ ▄███▄\n█ █▄▀█▀▀▀▀▀▄▀▀█ \n█▀█ ██▀▀▀▀▀█▄▄▄█\n▀▄▄█▄▄█████▄█▄▄█"], ["sleep_2", " ▄▄▄▄▄▄▄ \n ▄▄ █ ▀▀███▄ \n█ █▀▀▀▀▀███▀██▀ \n█ █▄▄▄▄▀▄▄ ███▀\n█ █▀▄▄▄▄▄▄▄▀███▀\n█▄██ █ ▀ ▀▄ ▀▄ \n█ ▀ ██▀▀▀▀▀█▄▄▄█\n ███▄▄█████▄█▄▄█"], ["walk_1", " ▄▄ ▄▀▀▀████▄ \n█ █▄▀▀▀▄▄▄████▄ \n█ █▄▄▄▀▀▄▄▀ ██▄▄\n█ ██ ▀▀ ▄███▄\n█▄█▄▀█▀█▀▀▀▄▀█▀ \n█ ▀ ▄█▄▄▄▄▄▀▄ █ \n ▀███▄▄ ▄ █▄▄▄▀ \n █▄█▄▄█▀█▄█▄▄█ "], ["walk_2", " ▄▄▄▄▄▄▄ \n ▄▄ █▄▄ ▀▀███▄ \n█ █▀ ▄█▀▀█▀██▀ \n█ ██▀▀ ▄█▀ ███▀\n█ █▀▄▄▄▄▄▄▄▀▀██▀\n█▄██ █ ▀ █ ▄ █\n█ ▀ ██▀▀▀▀▀█▄▄▄█\n ███▄▄█████▄█▄▄█"]]], + ["bancholillymon", [["angry", " ▄▄ ▄▄ ▄ \n █ ▀ ▀▄ \n █ █ \n █ █▀▄ ▄▀▀▄▄▀█ \n ▄██▄ ▀▀ ▄ █▄▄▀ \n█ ▄▀▄▀ ▀ ▄▀▄ █ \n▀▄▄▄███████▄▄▄█ \n █▀█▄██▀▀██▄█▀█ "], ["attack", " ▄▀▀▀▀▄▀▄ \n █ ▄▄ █\n █▄▀ ▄▀▄▄ █\n █ ▀▀ █ ▀█\n ▀██▄▀▀▄▀▄\n ▄▄▄ ▄▄▀█ █ █\n█▀ ▀█▄▀ █▄█▀█▄ █\n▀▄█▄▀ █▄▄▀▀▄▄█▀"], ["eat_1", " ▄▀▀▄▀▀ ▄▀▄ \n █ ▄▀▄ ▄▀▄ █ \n █ █ ▄▀▀ ▄ █ █ \n ▀▄█▀ ▀ ▀ ▀█▀▀█ \n ▄▀▄▀███▀▄▀▄▀ \n ▄▀▄▀█▄▄▄██▀█▀▄ \n █▄▀▄██▄▄██▄▀▄█ \n ▀ █▄█▀▀█▄█ ▀ "], ["eat_2", " ▄▄ ▄▄ ▄ \n █ ▀ ▀▄ \n █ ▄▀▄ ▄▀▄ █ \n █ █ ▄▀▀ ▄▀▄▄▀█ \n ▀█▀ ▀ ▀ ▀█ █ \n █ █▄▄▄▄▄▀▄█▄ \n █ █▄█▄ ▄█▄█ █ \n █▀█▄██████▄█▀█ "], ["happy", " ▄▀█ ▀▀ ▀▄ \n █ ▄▀▄ ▄▀▄ █ \n █ █ ▄▀▀ ▄ █ █ \n▄█▄█▀ ▀ ▀ ▀██▄█ \n▀▄ █ █████ █ ▄▀ \n ▄▀▄▀▄▀▀▀▄▀▄▀▀▄ \n █▄▀███████▄▀▄█ \n ▀ █▄█▀▀█▄█ ▀ "], ["injured_1", " ▄▄ ▄▄ ▄ \n █ ▀ ▄ ▀▄ \n █ ▄▄ ▄▄ █ \n █ █ ▀▄▄▀ ▀▄▄▀█ \n ▀█▄█ █▄ █ █ \n █▀▄▄▄▄▄▄▀▄█▄ \n █ █▄▄▄█▄▄▄█▀ █ \n █▀█▄█████▄█▀▄█ "], ["injured_2", " \n ▄▀█ ▀▀ ▀▄ \n▄▀ ▀ █ \n█ █▀▄ ▄▀█ █▀█ \n▀▄█ ▄▀▀▄ ██ █ \n █▀▀ ▀▀▄▀▄█▄ \n █ ██████▄▄█▀ █ \n █▀█▄█████▄█▀▄█ "], ["sleep_1", " \n ▄▄ ▄▄ ▄ \n █ ▀ ▀▄ \n█ ▄▀▄ ▄▀▄ █ \n█ █ ▀▀ ▀▄ █▀█ \n ▀█▀▀ ▀▀ █▀ ▄▀ \n █▀▀▄▄▄▄▄▀ ▀▀▄ \n █▄▄▄▄█▄▄▄▄▄█▄█ "], ["sleep_2", " \n ▄▀█ ▀▀ ▀▄ \n ▄▀ ▄ ▄ █ \n █ █ ▀▄▄▀ █ █▄ \n ▀▄█▄▄ ▄▄ █▀▄▀ \n ▄█▄ ▄▀ █ \n ▄▀ ▀▀▀█▀▀ ▀▀▄ \n █▄▄▄▄▄█▄▄▄▄█▄█ "], ["walk_1", " ▄▀▀ ▀▀ ▀▄ \n ▄▀ ▄ ▄ █ \n █ █ ▀▄▄▀ █ █ \n ▀▄█ █ █ █▀▄▀ \n ▄▀▄ ▄▀▄▀ \n ▄▀▄▀█▀▀▀▀▄▀█▀▄ \n █▄▀▄██▄▄██▄▀▄█ \n ▀ █▄█▀▀█▄█ ▀ "], ["walk_2", " ▄▄ ▄▄ ▄ \n █ ▀▄ \n █ ▄▀▄ ▄▀▄ █ \n █ █ ▄▀▀▄ ▀▄▄▀█ \n ▀█ ▀ ▀ █ █ \n █ █▄▄▄▄▄▀▄█▄ \n █ █▄█▄ ▄█▄█ █ \n █▀█▄██████▄█▀█ "]]], + ["banchomamemon", [["angry", " \n \n █ ▄▄▄▄ █ \n █ █▄▄▄▄▀▄ █ \n █ ▀▄▄▄▄▄█▄██ \n █▀█████▄▄██▀▄ \n ▀▄▄██▄▄▄██▄▄▀ \n ▄▄█▀▀▀█▄▄ "], ["attack", " \n █ ▄ \n █ █ \n █ ▄▀▀▀▀▄█ \n █▄▀▀▀▀▄▀▄█▄ \n █ ████▄██▀▀▄ \n ▀▀▀▄▄▄███▄▄▀ \n ▄▄█▀▀█▄▄ "], ["eat_1", " \n █ █ \n █ ▄▄▄▄ █ \n █ █▄▄▄▄▀██ \n ▄▀▀▄▄▄▄▄▀▄▀▀▄ \n ▀▄▄██▀▀▀██▄▄▀ \n ██▄▄▄██ \n ▄▄█▀▀▀█▄▄ "], ["eat_2", " \n \n █ █ \n █ ▄▀▀▀▀▄▄█ \n █▄▀▀▀▀█▄▀█▄ \n ▄▀▀███▀▄▀█▀▀▄ \n ▀▄▄██▀▀███▄▄▀ \n ▄▄█▀▀▀█▄▄ "], ["happy", " \n █ █ \n █ ▄▄▄ █ \n █ █▄▄▄▀▀▄█ \n ▄▀▀▄▄▄▄▀██▀▀▄ \n ▀▄▄███▄█▄█▄▄▀ \n ██ ██ \n ▄▄█▀▀▀█▄▄ "], ["injured_1", " \n \n \n ▄ ▄▄▄▄ ▄ \n █ █▄▄▄▄▀█▄ █ \n █ ▀▄▄▄▄▀█▄██ \n █▀▀████▄▄█▀▀▄ \n ▀▄▄██▄▄▄██▄▄▀ "], ["injured_2", " \n \n \n ▄ ▄ \n █ ▄▀▀▀▀▄▄ █ \n █ ▄▀▀▀▀█▄▀██ \n █▀▀████ ▀█▀▀▄ \n ▀▄▄██▄▄▄██▄▄▀ "], ["sleep_1", " \n \n \n ▄ ▄▄▄▄ ▄ \n █ █▄▄▄▄▀█▄█ \n █ ▀▄▄▄▄▄█▄██ \n █▀▀████▄▄█▀▀▄ \n ▀▄▄██▄▄▄██▄▄▀ "], ["sleep_2", " \n \n \n ▄ ▄▄▄▄ ▄ \n █ █▄▄▄▄▀█▄█ \n █ ▀▄▄▄█▀▀▄██ \n █▀▀██▀▀███▀▀▄ \n ▀▄▄██▄▄▄██▄▄▀ "], ["walk_1", " \n ▄ ▄ \n █ █ \n █ ▄▀▀▀▀▄▄█ \n █▄▀▀▀▀▀▄▀█▄ \n █ █████▄█ █ \n ▀▀██▄▄▄██▀▀ \n ▄▄█▀▀▀█▄▄ "], ["walk_2", " \n \n █ █ \n █ ▄▄▄▄ █ \n █ █▄▄▄▄▀██ \n ▄▀▀▄▄▄▄▄▀▄▀▀▄ \n ▀▄▄██▀▀▀██▄▄▀ \n ▄▄███████▄▄ "]]], + ["baohuckmon", [["angry", "█ ▄▄▀▀▀▄ ▄▄\n█▄ ▄▀▀ ▄▀ ▄█▀ \n██▀ ▄█▀ ▀▀▄████▄\n█▄▄▄▄ ▀███▀▀ \n ████ ▄█████▀▀\n ▄▀▀ ▄█▀▀ ▀▀▄▄\n ▄▀█▀▀ ▄▄▀ ▄▄▀\n █▄█▄▄▄▀█▄▄▄██ "], ["attack", " ▄▄▄▄ \n█ ▄█▀ ▄▀ ▄▄▄\n██ ▄▀▄▄ ▀▄▄██▀ \n██▀ ▀▀ ▀█████▀\n█ ▄▀▀ ▄▄█████▄▄▄\n ▀▄▄██▀▀ ▀▀▀▄ \n ▄▀ ▄▄ ▄ ▄ ▀█▀ \n█▄▄▀█▄▄█ █▄▄▄█ "], ["eat_1", " ▄▄▄▄ \n█ ▄█▀ ▄▀ ▄▄▄\n██ ▄▀▄▄ ▀▄▄██▀ \n██▀ ▀▀ ▀█████▀\n█ ▄▀▀ ▄▄█████▄▄▄\n ▀▄▄██▀▀ ▀▀▀▄ \n ▄▀ ▄▄ ▄ ▄ ▀█▀ \n█▄▄▀█▄▄█ █▄▄▄█ "], ["eat_2", "▄ ▄▄▀▀▀▄ ▄▄\n█ ▄▀ ▄▀ ▄█▀ \n██▄▀▄ ▄█▄███▄\n█▀ ▀ ▀ ▄███▀▀ \n▀██████ ▄████▀▀\n █▀▀▀▄▄█▀ ▀▀▄▄\n ▄▀█▀▀ ▄▄ ▄ █\n █▄█▄▄▄▀█▄▄▄██▀▀"], ["happy", "█ ▄▄▀▀▀▄ ▄▄\n█▄ ▄▀▀ ▄▀ ▄█▀ \n██▀ ▄▀▄ ▀▀▄████▄\n█▄▄▄▄▄ ▀███▀▀ \n ███▀ ▄█████▀▀\n ▀▄▄▄▄██▀ ▀▀▄▄\n ▄▀▄▀ ▄▄▀ ▄▄▀\n █▄█▄▄▄▀█▄▄▄▄█ "], ["injured_1", " ▄▄ \n█ ▄▄▀ ▄█ ▄▄\n█▄ ▄▀ ▄█ ▄██▀ \n██▀ █▄▄ ▀█████▀\n█ ▄▄▄ ▀█████▀\n ▀▄▄▄▄▄██▀▀ ▀▀▄▄\n ▄██▀▀▀ ▄▀ ▄ █\n ▀▄▄▄▄▄█▄▄▄▄█▀▀"], ["injured_2", " \n ▄▄▄ ▄▄\n█ ▄▀ ▄▀▄██▀ \n██ ▄▀ ▄ ▀█████▀\n██▀ ▀▀ ▀█████▀\n█ ▄▀▀ ▄▄█▀▀ ▀▀▄▄\n ▀▄▄█▀▀▀ ▄▀ ▄ █\n ▀▄▄▄▄▄█▄▄▄▄█▀▀"], ["refuse", " ▄▄ \n█ ▄▄▀ ▄█ ▄▄\n█▄ ▄▀ ▄█ ▄██▀ \n██▀ ▄▀▀ ▀█████▀\n█ ▄▄▄ ▀█████▀\n ▀▄▄▄▄▄██▀▀ ▀▀▄▄\n ▄██▀▀▀ ▄▀ ▄ █\n ▀▄▄▄▄▄█▄▄▄▄█▀▀"], ["sleep_1", " ▄▄ \n█ ▄▄▀ ▄█ ▄▄\n█▄ ▄▀ ▄█ ▄██▀ \n██▀ ▄▄▄ ▀█████▀\n█ ▄▄▄ ▀█████▀\n ▀▄▄▄▄▄██▀▀ ▀▀▄▄\n ▄██▀▀▀ ▄▀ ▄ █\n ▀▄▄▄▄▄█▄▄▄▄█▀▀"], ["sleep_2", " ▄▄ \n█ ▄▄▀ ▄█ ▄▄\n█▄ ▄▀ ▄█ ▄██▀ \n██▀ ▄▄▄ ▀█████▀\n█ ▄▄▄ ▀█████▀\n ▀▄▄▄▄▄██▀▀ ▀▀▄▄\n ▄██▀▀▀ ▄▀ ▄ █\n ▀▄▄▄▄▄█▄▄▄▄█▀▀"], ["walk_1", "▄ ▄█▀▀█ ▄▄▄\n█▄ ▄▀▀ █ ▄██▀ \n██▄▀▄█▀ ▄█████▀\n█▀ ▄▄ ▄▄███▄▄ \n▀▄▀ ▄▄██▀█████▀▀\n ▀█▀▀ ▀▀▀█▄\n ▄▀ ▄ █▄ ▄ ▀█▀▀\n█▄▄█▄▄▀ █▄▄▄█ "], ["walk_2", " ▄▄▄▄ \n█ ▄█▀ ▄▀ ▄▄▄\n██ ▄▀▄▄ ▀▄▄██▀ \n██▀ ▀▀ ▀█████▀\n█ ▄▀▀ ▄▄█████▄▄▄\n ▀▄▄██▀▀ ▀▀▀▄ \n ▄▀ ▄▄ ▄ ▄ ▀█▀ \n█▄▄▀█▄▄█ █▄▄▄█ "]]], + ["barbamon", [["angry", " ▄▄ ▄▄▄▄ ▄▄▄▄ \n ███▀ ▄ ▀█ ████\n████▀ ▀▀ ▄████\n▀ █ ▄▄▄███▀██▀█\n▄▀███▀ ▀██▀▀███▄\n█▄██▀ █ █▄▄██▀█\n ██▀▄▀▄█ ▄████▄ \n██████▀▀▀███████"], ["attack", " ▄██▀▀▀▀▄▄▀▄██▄ \n▄██▄ ▄█ ▀ ████ \n██▄▄▄▄ ▄▄█████ \n ▄▄████ ██▄██▄▀ \n▄███▀▀▀▀███████ \n▀██▀ █ ██ █ ▀ \n▄██ █ ▄ █████▄ \n█▀▄█▄██▄█████▀█ "], ["eat_1", " ▄██▄▀▀▀▀▄▄▀███▄\n▄███▄ ▄▀▄ ▀ ████\n█▀█ ▄ ▄█████\n ▄██▀▀▀▀ █▀▀▄█▄▀\n▄███▀▄▄▄██▄▄████\n▀███ ▄▀ ▀████ ▀\n▄██▀▄▀▄█ ▄█████▄\n█▀█████▀██████▀█"], ["eat_2", " ▄▄ ▄▄▄▄ ▄▄▄▄ \n ███▀ ▄ ▀█ ████\n███▀▀ ▀ ▀ ▄████\n▀ █▄▄▄▄▄███▀██▀█\n ████ ▀▀██████▄\n████▀ █ ▀█▀▀█▀█\n ██▀▄▀▄█ ▄█▄▄█▄ \n██████▀▀▀███████"], ["happy", " ▄██▄▀▀▀▀▄▄▀███▄\n▄███▄ ▄▀▄ ▀ ████\n█▀█ ▄█████\n ▄██▀▀▀▀▀▄█▄██▄▀\n▄███▀▄▄▄███▀▀███\n▀███ ▄▀ ▀█▄▄█ ▀\n▄██▀▄▀▄█ ▄█████▄\n█▀█████▀██████▀█"], ["injured_1", " \n ▄██▄▀▀▀▀▄▄▀███▄\n▄███▄ █▄ ▀ ████\n█▀█▀ ▄▄▄█████\n ▄█▄▄▀▀████▄██▄▀\n▄████ ▄ ███████\n▀███ ▄▀▄ █ █▄▀\n███▄█▄██▄███████"], ["injured_2", " \n ▄▄ ▄▄▄▄ ▄▄▄▄ \n ███▀ ▄ ▀█ ████\n████▀ ▀▀ ▄████\n▀ █ ▄▄▄███▀██▀█\n ████ ▀▀██████▄\n████▀ █ ▀█▀▀█▀█\n▄███▄█▄█▄▄█▄▄██▄"], ["sleep_1", " \n ▄▄ ▄▄▄▄ ▄▄▄▄ \n ███▀ ▀█ ████\n███▀▀ ▄▄▀ ▄████\n▀ █▄▄▄▄▄███▀██▀█\n ████ ▀▀██████▄\n████▀ █ ▀█▀▀█▀█\n▄███▄█▄█▄▄█▄▄██▄"], ["sleep_2", " \n ▄██▄▀▀▀▀▄▄▀███▄\n▄███▄ ▄ ▀ ████\n█▀█ ▀▀▄▄▄█████\n ▄███▀▀████▄██▄▀\n▄████ ▄ ███████\n▀███ ▄▀▄ █ █▄▀\n███▄█▄██▄███████"], ["walk_1", " ▄██▄▀▀▀▀▄▄▀███▄\n▄███▄ ▄▀█ ▀ ████\n█▀█ ▀▀▄▄▄█████\n ▄███▀▀████▄██▄▀\n▄████ ▄ ███████\n▀███ ▄▀ ▀█ █ ▀\n▄██▀▄▀▄█ ▄█████▄\n█▀█████▀██████▀█"], ["walk_2", " ▄▄ ▄▄▄▄ ▄▄▄▄ \n ███▀ ▄▄▀█ ████\n███▀▀ █▄▀ ▄████\n▀ █▄▄▄▄▄███▀██▀█\n ████ ▀▀██████▄\n████▀ █ ▀█▀▀█▀█\n ██▀▄▀▄█ ▄█▄▄█▄ \n██████▀▀▀███████"]]], + ["barbamon_x", [["angry", " ▄▄ ▄▄ ▄▄▄\n █ ▀▀ ▀██▄ █▀ \n █▀ ▄█ ▄█▄ ▄█\n █ ▄▄████ ▀ \n ▄█ ▄▄▀ █ █▄▀██▄\n█ ▀██▄ ██ ▄█ ▀\n ▀▀█ █ ▄█ ▀████ \n ▄█▄██▄█▄▄▀█▀█ "], ["attack", " █▀▄█▀▄▄▄ ██▀\n █▄ ▄ ▀▀█ ▀ ▄\n ▄▀ ▀▀ ▄███ █▀\n▀▄▄▄█▀▀████▀█▄▄ \n █ █ █ ▄██▀█\n ▀██▄▄██▀████▄ \n █ █▄▀█ ████ \n ▀▄█▄▄█▄▀ ▀ ▀ "], ["eat_1", " █▀▄█▀▄▄▄ ██▀\n █▀ ▄ ▀▀█▄▀ ▄\n ▄▀▀ ▀ ▀▄███▄▀▀\n ▀▀▀████▀▄█▄▀██▄\n ▄▀▀▀ ▄█ ▄█ ▀\n ▄▀▄ █▀█████ \n █ █ ▄█ ▀█████\n ▀▄██▄█▄▀▀ ▀ ▀"], ["eat_2", " ▄▄ ▄▄ ▄▄▄\n █ ▀▀ ▀██▄ █▀ \n █▀ ▄▀▄ ▄█▄ ▄█\n ▄▀ ▄▄▄████ ▀ \n ▀▀█▀▀ █ █▄▀██▄\n ▄▀██▄ █ █▀ █ ▀\n ▀▄█ █ ▄█ ▀▄▄██ \n ▄█▄██▄█▄▄▀█▀█ "], ["happy", " █▀▄█▀▄▄▄ ██▀\n █▄ ▄ ▀▀█▄▀ ▄\n ▄▀▀ ▀ ▀▄███▄▀▀\n ▀▀▀████ ██▄▀██▄\n ▄▀▀▀▀ ██ █ ▀\n ▄▀▄ █▀█████ \n █ █ ▄█ ▀█████\n ▀▄██▄█▄▀▀ ▀ ▀"], ["injured_1", " \n █▀▄█▀▄▄▄ ██▀ \n █▄ ▄ ▀▀█ ▀ ▄ \n ▄▀ ▀▀ ▄███ █▀ \n █ ▄▀█▀█▀█▄▄ \n ▀▄▄▀ █ █▀ █▀█ \n █▀█ █ █▄▄█▄ \n ▀▄██▄█▄▄█████ "], ["injured_2", " \n ▄▄ ▄▄ ██▀ \n █ ▀▀ ▀██▄ ▀ ▄ \n █▀ █▄ ▄█▄ █▀ \n█ ▄▄██▀█▄▄ \n█ ▄▀ █ █▀ ███▄ \n ▀█▀█ █ █▄▄██▄▀ \n ▀▄███▄▄██████ "], ["sleep_1", " \n ▄▄ ▄▄ ▄▄▄\n █ ▀▀ ▀██▄ █▀ \n █▀ ▄▄ ▄█▄ ▄█\n ▄▀ ▄▄▄████ ▀ \n ▀██▀▀ █ █▄▀██▄\n █ ██▄ █ █ █ ▀\n ▀█▄█▄▄█▄█████▄"], ["sleep_2", " \n █▀▄█▀▄▄▄ ██▀\n █▄ ▀▀█ ▀ ▄\n ▄▀ ▀▀ ▄███ █▀\n █▄▄▄▄▀▀█▀█▀█▄▄ \n ▄▀█▄ █ █▀ █▀█\n ▀▄█▀█ █ █▄▄█▄ \n █▄██▄█▄▄█████"], ["walk_1", " █▀▄█▀▄▄▄ ██▀\n █▄ ▄ ▀▀█ ▀ ▄\n ▄▀ ▀▀ ▄███ █▀\n █▄▄▄▄▀▀█▀█▀█▄▄ \n ▄█▄ █ ██ █▀█\n █ █▀█ █ █ █▄ \n ▀█ █▄▀█ ████ \n ▀▄█▄▄█▄▀ ▀ ▀ "], ["walk_2", " ▄▄ ▄▄ ▄▄▄\n █ ▀▀ ▀██▄ █▀ \n █▀ ▄█ ▄█▄ ▄█\n ▄▀ ▄▄▄████ ▀ \n ▀▀█▀▀ █ █▄▀██▄\n ▄▀██▄ █ █▀ █ ▀\n ▀▄█ █ ▄█ ▀▄▄██ \n ▄█▄██▄█▄▄▀█▀█ "]]], + ["bebydomon", [["angry", " ▄▀▄▄▄▄▀▄ \n▀██ █▀ ▀█ ██▀\n ▀█▄▀█▄ ▄█▀▄█▀ \n ▀▄▄ ▄▄ ▄▄▀ \n ██▀██▀██ ▄ \n ▀▄▄▄▄▄▄▀▀█ \n ▀▄▄▄▄▄▄▀ \n ▄▄▄▄▄▄▄ "], ["attack", " ▄▄▄▄▄▄▄▄ \n ▄▀ ▀▄▄▀ \n ▄▀ █ █ █ \n ▀▄▄▄▄▄▄▄█ \n ▄▀ ▀█▀▄█▄ \n ▀▄ ▀▄ ▀█ \n ▀▀▀▀▄█ \n ▄▄▄▄ ▀ "], ["eat_1", " ▄▄▄▄▄▄▄▄ \n ▄▀ ▀▄▄▀ \n ▄▀ █ █ █ \n ▀▄▄▄▄▄▄▄█ \n ▄▀ ▀█▀▄█▄ \n ▀▄ ▀▄ ▀█ \n ▀▀▀▀▄█ \n ▄▄▄▄ ▀ "], ["eat_2", " \n ▄▀▀▀▀▀▄▄▄▄ \n ▀▄▄ ▀█ ▀▄▄█ \n █ █ \n █▀▀▀ █▄▄█▄ \n ▀█▀▀▀ █▄▀▀█ \n ▀▄▄▄▄▄▄█ \n ▄▄▄▄▄ ▀ "], ["happy", " \n ▄▀▀▀▀█▀▀█ \n █▄ ▄ ▀█ ▄ \n █▀ ▀ ▀ ▀▄████ \n ▀█▀▀▀▀▀█▀▄ ▀ \n ▀▄ ▀▀█ \n ▀▀▀▀▀▀ \n ▄▄▄▄ "], ["injured_1", " \n \n ▄▄▄▄▄▄▄▄ \n ▄▀ ▀▄▄▀ \n ▄█▄▀ ▀▄▄ █ \n ▀▄▄▄▄▄▄▄█ ▄ \n █▄ ▀███ \n ▀█▄▄▄▄▄▄▀ ▀ "], ["injured_2", " \n \n \n ▄▀▀▀▀█▀▀█ \n █ ▄ ▄ ▀█ \n █▀▀ ▀▀▄▀ \n ▀██▀▀▀▀▀▄█▄ \n ▀█▄▄▄▄▄▄▀▀▀█ "], ["refuse", " ▄▄ \n ▄▄▄▄█ █ \n ▄▀ ▀▄█ ▄ \n ▄▀█▄ ▄█ ████ \n ▀▄ ▄█▀▄ ▀ \n █▀▀▀▀ ▀▀█ \n ▀▄▄▄▄▄▀ \n ▄▄▄▄ "], ["sleep_1", " \n \n \n ▄ ▄ \n ▄██▄▄▄███▄ \n ▄▀ ▀▄▄▀▀█ \n ▄▀▄▄ ▄▄ █▄ █ \n ▀▄▄▄▄▄▄▄█▄▄▄▄▀ "], ["sleep_2", " \n \n \n ▄ ▄ \n ▄██▄▄▄███▄ \n ▄▀ ▀▄▄▀▀█ \n ▄▀▄▄ ▄▄ █▄ █ \n ▀▄▄▄▄▄▄▄█▄▄▄▄▀ "], ["walk_1", " \n ▄▀▀▀▀█▀▀█ \n █ ▄ ▄ ▀█ \n █ ▀ ▀ ▄▀ ▄ \n ▀▀█▀▀▀██▄███ \n █ █▄ ▀ \n ▀▄▄▄▄▄▄█▀ \n ▄▄▄▄▄▄ "], ["walk_2", " ▄▄▄▄▄▄▄▄ \n ▄▀ ▀▄▄▀ \n ▄▀ █ █ █ \n ▀▄▄▄▄▄▄▄█ \n ▄▀ ▀█▀▄█▄ \n ▀▄ ▀▄ ▀█ \n ▀▀▀▀▄█ \n ▄▄▄▄ ▀ "]]], + ["beelstarmon_x", [["angry", " ▄██ ▄█▀ \n ▄▀▄█████▀ █▄ \n ████▀ █▀▄ ██ \n ▀█▀▀▀▀█ ▀████ \n ▄▄███▀██▀█▀██ \n █ █ ▄█ ▄█ ▀█ \n ▀█▀▀██▀▀█ ▀ \n ▄██▀█ █▀██▄ "], ["attack", " ▄▄ ▄▄ \n █▀█▄██▄▄ ▄ \n █▄█▀ ▄█▀▄ ██\n ▀█▀▀▀ █ ▀███\n█▀▀▀▀▀█▀▀██▀▄███\n ▀▀▄▄▄█▄█ ▄█▀██\n █▄▀█▀█▀▄█▄ █\n ▄██▀█ ▀█▀██▄"], ["eat_1", " ▄██ ▄█▀ \n ▄▀▄█▀███▀ █▄ \n ███▄█▄█ █▄██▄ \n ████ █▄ ████ \n ▄▀▀▄▄▄█▄ ▀█ ██ \n █▄▀█▄███▄▄█ █ \n █▄▄▀▄▄█▄ \n ▄██▀█ █▀██▄ "], ["eat_2", " ▄██ ▄█▀ \n ▄▀▄█████▀ █▄ \n ███▀▄▀█▀▄ ██ \n ▀█▀▀▀▀█ ▀████ \n ███▀██▄█▀██ \n ▄▀█ ▄█▀▀█▀ ▀█ \n ▀▄█▀██▄▄█ ▀ \n ▄██▀█ █▀██▄ "], ["happy", " ▄██ ▄█▀ \n ▄▀▄█▀███▀ █▄ \n ███▄█▄█▄█▄██▄ \n ▄█▀▀▀ █ ████ \n █ ▀█▀▀█▀ ▄█ ██ \n ▀▀█▄████▀ █ \n █▄▄▀▄▄█▄ \n ▄██▀█ █▀██▄ "], ["injured_1", " \n ▄▄ ▄▄ \n █▀█▄██▄▄ ▄ \n █▄█ ▀██▀▄ ██ \n ▀█▀▀▀ █ ▀████\n ▄██████ █▀██\n█▄▄█▀█ █ ▀███ ▀█\n▄███▄███▄███▄ ▀"], ["injured_2", " \n \n ▄██ ▄█▀ ▄ \n ▄▀▄▀████▀ ██ \n ███▄▄▀█ █████ \n ▀▄▄▄▄█▄▄▀████\n█▄▄█▀█ █ ▀███ ▀█\n▄███▄███▄███▄ ▀"], ["sleep_1", " ▄▀▀▄▀█ \n █▄▄█ ▄▄█ \n ███▀ ▀████ \n ███ ▀██████▄ \n ███ ▀▀██████ \n ████ ▀██████ \n ▀██▄▀█████ \n ▀███▄██▀ "], ["sleep_2", " ▄▄ ▄▄ \n ▄▀ ▄▀ ▀▄ \n ▄████▀▄████▄ \n ████▀ ▄▄██████ \n ████ ▀████████ \n ▀███ ▀████████ \n ▀███▄▀██████ \n ▀███▄███▀ "], ["walk_1", " ▄██ ▄█▀ \n ▄▀▄█▀▀██▀ █▄ \n ███▄▄▀█ █▄██▄ \n ▀▄▄▄▄█▄ ████ \n ▄▀█▀▀▄▀▀▄█ ██ \n █▄█▄██▄▄█ █ \n █▄▄▀▄▄█▄ \n ▄██▀█ █▀██▄ "], ["walk_2", " ▄▄ ▄▄ \n █▀█▄██▄▄ ▄ \n █▄█▀ ▄█▀▄ ██ \n ▀█▀▀▀ █ ▀████ \n ▄███▀██ █▀██ \n █ █ ▄█ █▀ ▀█ \n ▄█▀█▀█▀▀█▄ ▀ \n▄██▀█ ▀█▀██▄ "]]], + ["beelzemon", [["angry", " ▄▄▄▄▄▄▄▄▄ \n █▀█▀██▀█▄▀▄ \n █ ▀▄▀ ▄██▀ \n ▄▀█▀▀▀██▀▀▄ \n █▄ ▀█▀█ ▄▄▄█ \n █ ██▀█▄█▀█ ▀█ \n ▀██████████▀ \n █▄▄▄█ █▄▄▄█ "], ["attack", " ▄███████▀█▄\n █ █▀ ████▄▀\n ██▄▄▄█████ \n████▄▄▀▄▄▄█▀ █\n▀▀▀█▀▀██ █▄▄▀▀█▀\n ▀▀██▄█▄█▄▄▀ \n ▄████████▀▄ \n █▄▄▄█ █▄▄▄█ "], ["eat_1", " ▄▀▀██▀▀█▀▄ \n ██▀▀▀▀███▀█ \n █ ███ \n █ ▀▄▄▄▄▀ █▄ \n ███▄▄█ █▄▄████▄\n█▀▀██▄█▀█▄██▄▀▀█\n▀▄▄██████████▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["eat_2", " ▄▄▄▄▄▄▄▄▄ \n ▄███▀████▄▀▄ \n █▀▄▀█▀▄▀██▀ \n ▄▀█▀▀▀██▀▀▄ \n ▄█▄▄▀█▀█ ▄▄█▄ \n █▀▀███▄███▀▀██ \n ▀▄▄███▄███▄▄█▀ \n █▄▄▄█ █▄▄▄█ "], ["happy", " ▄▄▄██▀████▀▄▄▄ \n█ █▀▄▀█▀▄▀███ █\n ████▀▀▀▀██▄███ \n ▀█ ▀▄▄█▀ ███ \n ▀█▄▄█ █▄▄██ \n ▄█▄█▀█▄██▄ \n ██████████▄ \n █▄▄▄█ █▄▄▄█ "], ["injured_1", " \n ▄██▀████▀▄ \n ██▀██▀███▀█ \n █▄▀▀▀▀▄██▀ \n █ ▀▄▄▄▄▀ ▄█ \n ████▀▀████▄ \n ▄▀▀████▀▀██ \n ▀▄▄██ █▄▄█▄█ "], ["injured_2", " \n ▄▄▄▄▄▄▄▄ \n ███▄████▄█▄ \n █▀▄██▄▀██▄▀ \n ▄▀██ ██▀▀▄ \n ▀▄▄███▄▄▄██ \n ▄▀▀█▄▄█▀▀██ \n ▀▄▄██▀█▄▄█▄█ "], ["sleep_1", " \n ▄▄▄▄▄▄▄▄ \n ███▄████▄█▄ \n █▄▄██▄▄██▄▀ \n █ ▀█▄▄█▀ █▄ \n ███▄▄█▀▄▄▄████ \n█▀█ ███ ███▀▀█\n▀▄█▄▄█▀█▄▄██▀▄▄▀"], ["sleep_2", " \n ▄██▀████▀▄ \n █▀▀██▀▀██▀█ \n ██▀▀▀▀████ \n █ ▀▄▄▄▄▀ █▄ \n ███▄▄█ █▄▄████ \n█▀█ ███ ███▀▀█\n▀▄█▄▄█▀█▄▄██▀▄▄▀"], ["walk_1", " ▄██▀████▀▄ \n █ ▀██▀ ██▀█ \n ██▀▀▀▀████ \n █ ▀███▀ █▄ \n ███▄▄█ █▄▄████▄\n█▀▀██▄█▀█▄██▄▀▀█\n▀▄▄██████████▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["walk_2", " ▄▄▄▄▄▄▄▄ \n █▀█▄██▀█▄█▄ \n █▄▄██▄▄██▄▀ \n ▄▀▀▄▄▄▄█▀▀▀▄ \n▄██▄ █▀█ ▄▄██▄\n█ ██▀█▄█▀███ █\n ▀█████▄██████▀ \n █▄▄▄█ █▄▄▄█ "]]], + ["beelzemon_blast_mode", [["angry", " ▄▄▄▄▄▄ ▄ \n ▄▀█████▄▀▄ ██ \n █▄█▀▄████▀ ███\n █▀▀▀██▀▀▄████\n▄▀▀██▀█▀ ▄▀▀▄███\n▀▄▄█▀ █▀▀█▄▄█ ██\n ▄█████████▄ █\n █▄▄█▀ ▀█▄▄▄█ █"], ["attack", " ▄█████▀▄ ▀▄\n █ ██▀███▄█ █\n ▀██▄▄███▀▀██\n ▄▄▄▄█▄▄▄██▄▀▀▄█\n█▄ ▀█ █ ▄▄██\n▀▄▄▄▄██▄▄▄██▀███\n ▄██▀████▄ ██\n █▄▄█ █▄▄▄█ █"], ["eat_1", " ▄█████▀▄ ▄ \n █ ██▀███▄█ ██ \n ▀██▄█▄███ ▄███\n ▀▄ ▄▀ █████\n ▄▄██▀█▄▄██▄▀███\n█ █▄▄█▄▄█ █ ██\n ▀▀███▀█████ █\n █▄▄█ █▄▄▄█ █"], ["eat_2", " ▄▄▄▄▄▄ ▄ \n ▄▀█████▄▀▄ ██ \n █▄█▀▄▀███▀ ███\n █▀▀▀██▀▀▄████\n ▄█▀█▀ ▄▄▀████\n▄▀▀█▀ █▀▀█▀▀▄ ██\n▀▄▄███████▄▄█ █\n █▄▄█▀ ▀█▄▄▄█ █"], ["happy", " ▄█████▀▄ █▄ \n █ █▀▄▀██▄█▄██▄\n ▀█▀▀▀▀███ ███\n ▀▄▄▄█▀█ ▄████\n ▄▀▀█ █▄▄█▀ ▀▀██\n ▀▄▄█▄█▄▄█▄ ▀█\n ▄██▀████▄ █\n █▄▄█ █▄▄▄█ ▀"], ["injured_1", " \n ▄█████▀▄ █▄ \n █ ██████▄█ ██▄\n ▀██▄▄████ ▄███\n ▀▄▄▄█▀ █████\n ▄▄██ █▄▄██▄▀▀██\n█ ▀█▄▄█▄▀ ▀█ ▀█\n█▄▄█████▄▄▄▄█ █"], ["injured_2", " \n ▄▄▄▄▄▄ ▄ \n ▄▀█████▄▀▄ ██ \n █▄█▀▀████▀ ███\n █▀▀▀▀██▀▀▄████\n▄▄ ██▀█▀ ▄▄▀████\n█ ▀█▀ ██▀ ▀▄ ██\n█▄▄█████▄▄▄▄█ █"], ["sleep_1", " \n ▄▄▄▄▄▄ ▄ \n ▄▀█████▄▀▄ ██ \n █▄█▀▀████▀ ███\n █▀▀▀▀██▀▀▄████\n ██▀█▀ ▄▄▀████\n ▄▀█▀ █▀█▀▀█▄ ██\n ████████▄▄██ █"], ["sleep_2", " \n ▄█████▀▄ █▄ \n █ ██████▄█ ██▄\n ▀██▄▄████ ▄███\n ▀▄▄▄█▀ █████\n ▄▄██ █▄▄██▄▀▀██\n█ ▄█▄▄█▄▄█ █ ▀█\n █▄▄█████████ █"], ["walk_1", " ▄█████▀▄ █▄ \n █ ██▀███▄█ ██▄\n ▀██▄▄████ ▄███\n ▀▄▄▄█▀ █████\n ▄██ █▄▄██ ▀▀██\n █ █▄█▄█ █ ▀█\n ▀███▀████▄ █\n █▄▄█ █▄▄▄█ ▀"], ["walk_2", " ▄▄▄▄▄▄ ▄ \n ▄▀█████▄▀▄ ██ \n █▄█▀ ████▀ ███\n █▀▀▀██▀▀▄████\n ▄█▀█▀ ▄▄▀████\n▄▀▀█▀ █▀▀█▀▀▄ ██\n▀▄▄███████▄▄█ █\n █▄▄█▀ ▀█▄▄▄█ █"]]], + ["beelzemon_x", [["angry", " ▄▄▄▄▄▄ \n ▄▀█ ▄▀▄ ▄▄ \n ▄▀▀ ▄█ ▄▀▄████\n █▄▄▄▄▄▄█▀██████\n▄▀▀▄▄▄█▀▄▀▀▄ ▀█\n▀▄▄██ ███▄▄██▄ ▀\n ▄███▄█▄███▀▀██ \n█▄▄▀▀ ▀▀▀▄▄█ ▀ "], ["attack", " ▄▄▀▀▀▀█▀ \n █▄▀▄ ▀▄▀▄ \n █ ▀▀ ▄█▄███\n▄▄▄▄▄█▀▀█▀ ▄█▀██\n█▄▄ █▀▀▀▀██▀█▄ █\n ▀▄██▄█ ▄██▄ \n ▄▄██▀████ ▀██\n █▄▄▀ █▄▄█ ▀"], ["eat_1", " ▄▄▀▀▀▀▀█ \n █▄▀ ▄ ▀▄▀▄██▄\n █ ▀ ▀▄█▄█████\n ▀████▀█▀ █▀▀▀██\n ▄█▀▀▀▄█▄███▄ █\n█ ██▀█ ▀▄███▄ \n ▀███▀█████▀ ▀█ \n █▄▄▀ ▀▄▄█ "], ["eat_2", " ▄▄▄▄▄▄ \n ▄▀█ ▄▀▄ ▄▄ \n ▄▀▀ ▄▀▄ ▄▀▄████\n █▄▄▄▄▄▄█▀██████\n ▄▀▄▄▄█▀ ▄█▄ ▀█\n ▄▀▀█ ██▀▀ ██▄ ▀\n ▀▄▄█▄██▄▄██▀██ \n █▄▄▀▀▀▀▄▄█ ▀ "], ["happy", " ▄▄▀▀▀▀▀█ \n █▄▀ ▄ ▀▄▀▄██▄\n █ ▀ ▀▄█▄█████\n ▀█▀▀▀▀█▀ █ ███\n▄▀██▄▄██▄█ ▄█▀ █\n▀▄███ █▀██████▄ \n ▄██▀████ ▀ ▀█ \n █▄▄▀ ▀▄▄█ "], ["injured_1", " \n ▄▄▀▀▀▀▀█ \n █▄▀▄ ▀▄▀ \n █ ▀▀ ▄█▄██▄ \n ▀█▀▀▀██▀▀█████ \n ▀▄██▀█▄▄██▀███▄\n █ ▀█ █▀ ▀█▄ ███\n █▄▄███▄▄▄█▀█ ▀▀"], ["injured_2", " \n ▄▄▄▄▄▄ \n ▄▀█ ▄▀▄ \n▄▀▀ █▄ ▄▀▄██▄ \n█▄▄▄▄▄▄█▀▀█████ \n ▀▄▄▄▀█▄▄██▀███▄\n █ ▀█ █▀ ▀█▄ ███\n █▄▄███▄▄▄█▀█ ▀▀"], ["sleep_1", " \n ▄▄▄▄▄▄ \n ▄▀█ ▄▀▄ ▄██▄\n▄▀▀ ▄▄ ▄█▄█████\n█▄▄▄▄▄▄█▀ █▀▀▀██\n ▀▄▄▄▀█▄▄███▄ █\n █ ▀█ █▀█▀ ▀██▄ \n █▄▄█████▄▄▄█▀█ "], ["sleep_2", " \n ▄▄▀▀▀▀▀█ \n █▄▀ ▀▄▀▄██▄\n █ ▀▀ ▄█▄█████\n ▀█▀▀▀██▀ █▀▀▀██\n ▀▄██▀█▄▄███▄ █\n █ ▀█ █▀█▀ ▀██▄ \n █▄▄█████▄▄▄█▀█ "], ["walk_1", " ▄▄▀▀▀▀▀█ \n █▄▀ ▄▄ ▀▄▀▄██▄\n █ ▀▀ ▄█▄█████\n ▀█▀▀▀██▀ █▀▀▀██\n ▀▄██▀█▄▄███▄ █\n ▄▀██ █▀█▀ ███▄ \n ▀▄██▀███▄▄▀ ▀█ \n █▄▄▀ ▀▄▄█ "], ["walk_2", " ▄▄▄▄▄▄ \n ▄▀█ ▄▀▄ ▄▄ \n ▄▀▀ ▄█▀ ▄▀▄████\n █▄▄▄▄▄▄█▀██████\n ▄▀▄▄▄█▀ ▄█▄ ▀█\n ▄▀██ ███▄ ▀█▄ ▀\n █▄██▄█▄██▄▄▀██ \n█▄▄▀▀ ▀▀▀▄▄█ ▀ "]]], + ["belphemon_rage_mode", [["angry", " \n ▄▀█▄█▀▀█ ▄ \n ▄█▀▀▀▄ █ ▄██▄ \n█▀ ▄█▀ █████▄\n█▀▀█▀ ▄▀ ▀██\n ▀▄▄▄▄ ▀ ▄ ██\n ▄▀▄ █▄█▄███\n █▄█▄██▀█▄█▄█▄█▀"], ["attack", " ▄▄▄▄██▄▀▀█ ▄█▄ \n█ ▄▄▀▄ ███▄\n▀████▄▀▀ ▀█████\n█▀█▀█▀ ▄ ▀█▀██\n▀█▄▄▄▄▀▀▀▄ █ █\n█ █ █ ▀▀ █ \n▀▄▄▄▄▀▄▄▄▄▄▄█▀▄ \n█▄█▄▄█▀▀▀█▄█▄█▄█"], ["eat_1", " ▄▄▄▄██▄▀▀█ ▄█▄ \n█ ▄▄▀▄▄███▄\n▀▀███▄▀▀ ██████\n▄██▀█▀ █████\n█▄▄▄▄ ▄▀▀ ████\n▄█ █ █▄▀▄ ▄█▀██\n▀▄▀▀▄ ▀▀█▀ ▀▄ ▀\n█▄█▄▄█▀▀█▄█▄█▄█ "], ["eat_2", " ▄▄ ▄▄▄▄▄ ▄ \n █▄█▀▀▀ ▄▀ ███ \n▄▀▀ ▄▀▄ ▀▄█████\n█▄▄▄▄▄ ▀█████\n ▀▄ ▀ ▄ ▀███\n ▄▀█▀▀ █▄ ███\n█▄▄▀▄ ▀▄█▄▀▄▀█\n█▄█▄▄█▀▀█▄█▄█▄█ "], ["happy", " ▄▄▀▀▀▀█▄▀▀█▄█▄ \n█ ▄▀▄ █▀███▄\n▀████▄ █ ▀▄███\n██▀ ▀▀ ▄▀ ▄███\n▀▄▀█▀ ▄▄█ ▀██\n ▀█ ▀▄ █\n ▄▀▀▄ ▄▀ █ \n█▄█▄▄█▀▀█▄█▄█▄█ "], ["injured_1", " ▄▄ ▄▄▄▄▄ \n █▄█▀▀▀ ▄▀ ▄█▄\n █▀ ▀▄▄ █▄███\n █▀▀▀█▀▄ █████\n ▀▄▄▄ ████\n ▄▀█ ▄▀ █▀█\n █ ▀▄▄▀▄ ▄▀▀▄ \n█▄█▄█▄▀█▄██▄▄█▄█"], ["injured_2", " \n ▄▀█▄██▀▀█ ▄ \n ▄▄▀▀▀ ▄ ▀▄ ███\n █▄▄▄▄▄ ▀▀ █████\n ▀▄ ▀ ▀ ▀████\n ▄▀█▀▀ ▄▀ ███\n █ ▀▄▄▀▄ ▄▀▀▄▀\n█▄█▄█▄▀█▄██▄▄█▄█"], ["sleep_1", " \n ▄▄▄ ▄▄▄ \n ▄▀▄▄ █▀█ ▄▄▀▄ \n █▄▀ ▀▀ ▀▀ ▀▄█ \n ▀█ █▀ \n▄██▄▀▀ ▄ ▀▀▄██▄ \n███▀██▀▀▀██▀███ \n▀ ▀▄█▄█▄▀ ▀ "], ["sleep_2", " \n ▄▀▀▀▄▄▄▀▀▀▄ \n █ █▀▄█ █▄▀█ █ \n ██ ██ \n ▄█ ▄▄ ▄▄ █▄ \n████▄▄▄█▄▄▄████ \n█▀▀ █▄▀▀▀▄█ ▀▀█ \n ▀▄█▄█▄▀ "], ["walk_1", " ▄▀█▄██▀▀█ ▄█▄ \n ▄█▀▀ ▄▄ █ ▄███▄\n█ ▀▀ ██████\n▀█▀▀█▀ ▀████\n ▄▀▄▄▄ ▄▀ ███\n█▄ █ █▄▀▄ ▄▀██\n▀▄▀▀▄ ▀█▀▀▀▄ ▀\n█▄█▄▄█▀▀█▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄▄▄▄ ▄ \n █▄█▀▀▀ ▄▀ ███ \n▄▀▀ ▄█▀ ▀▄█████\n█▄▄▄▄▄ ▀█████\n ▀▄ ▀ ▄ ▀███\n ▄▀█▀▀ █▄ ███\n█▄▄▀▄ █▄█▄█ ▀█\n █▄█▄███▄█▄█▄█ "]]], + ["belphemon_x", [["angry", " ▄ \n █▀▄▀█▄█▀▀█ ███ \n ▄█ ▀ ▄ █ ██▄▀█\n█ ▀▀ ███▀█▄\n▀█▀▀▀▀ ▄▄ ▀██▄▀\n▄▀▀█▀█▀█▀▄ ▄ ███\n██▀▀███▀█▄▀▀▀▄▀█\n█▄█▄▄█▀▀█▄█▄█▄█ "], ["attack", " █▀▄▀█▄█▀▀█ ▄█▄ \n█▀▀ ▀ ▄ █ ▄█▀█▄\n█▄ ▄ ▄▀▀ ████▄▀\n ▄█████ ▄▄ ▀█▄▀█\n█▀█ ▀ ▀▄▀ ▀ ██▄\n█ ▀█████▄ ▄▀██\n █▀▀▄▀▀▄██▀▀▀▄ ▀\n█▄█▄▄█▀▀█▄█▄█▄█ "], ["eat_1", " █▀▄▀█▄█▀▀█ ▄█▄ \n█▀▀ ▀ ▄▄ █ ▄█▀█▄\n█▄▄▄ ▀▀ ████▄▀\n ▄████ ▄ ▀█▄▀█\n █▀▀ ▀▄██▀ ██▄\n█▄▀█████▄▀▄ ▄▀██\n▀▄▀▀▄▀▀▄██▀▀▀▄ ▀\n█▄█▄▄█▀▀█▄█▄█▄█ "], ["eat_2", " ▄▄ ▄▄ ▄▄▄▄ ▄ \n ▀▄▀▄▀▀▀ ▄▀ ███ \n▄▀▀ ▄▀▄ ▀▄██▄▀█\n█▄▄▄▄▄ ▀██▀█▄\n ▀▄ ▀ ▄█▄ ▀█▄▀\n▄▀ █▄█▄█▀▄ ███\n██▀▀███▀█▄▀▀▀▄▀█\n█▄█▄▄█▀▀█▄█▄█▄█ "], ["happy", " █▀▄▀█▄█▀▀█ ▄█▄ \n█▀▀ ▀ ▄ █ ▄█▀█▄\n▀▄▄▄▄▀ ▀ █▀ ▀▄▀\n█ ████ ▀ ▄▄█\n▀▄█▀ ▀ ▀▄ ▄▄███▄\n ▀█▄██▄██▄ ▄▀██\n ▄▀▀▄▀▀▄██▀▀ █ ▀\n█▄█▄▄█▀▀█▄█▄█▄█ "], ["injured_1", " \n ▄▄ ▄▄ ▄▄▄▄ ▄ \n ▀▄▀▄▀▀▀ ▄▀ ███ \n▄▀▀ █▄ ▀▄██▄▀█\n█▄▄▄▄▄ ▀██▀█▄\n ▀▄ ▀ ▄█▄ ▀█▄▀\n▄▀█▀█▄▄██▀█▀▄███\n█▄▄▄▄███▄▄▄▄▄▀██"], ["injured_2", " \n ▄ \n █▀▄▀█▄█▀▀█ ███ \n ▄█ ▀ ▄ █ ██▄▀█\n█ ▀▀ ███▀█▄\n▀█▀▀█▀ ▄ ▀██▄▀\n▄▀█▀▄▄▄██▀█▀▄███\n█▄▄▄▄███▄▄▄▄▄▀██"], ["sleep_1", " \n \n █▀▄▀█▄█▀▀█ ▄█▄ \n ▄█ ▀ █ ▄█▀█▄\n█ ▀▀▀ ████▄▀\n▀█▀▀█▀ ▄ ▀█▄▀█\n ▄▀▄ ▄ █▀█ ██▄\n█▄▄██████▄██▀███"], ["sleep_2", " \n ▄▄ ▄▄ ▄▄▄▄ ▄ \n ▀▄▀▄▀▀▀ ▄▀ ███ \n▄▀▀ ▄▄▄ ▀▄██▄▀█\n█▄▄▄▄▄ ▀██▀█▄\n ▀▄ ▀ ▄█▄ ▀█▄▀\n▄▀ █▄█▄█▀▄ ▄███\n██████▄██▄██▄█▀▀"], ["walk_1", " █▀▄▀█▄█▀▀█ ▄█▄ \n ▄█ ▀ ▄▄ █ ▄█▀█▄\n█ ▀▀ ████▄▀\n▀█▀▀█▀ ▄ ▀█▄▀█\n ▄▀▄ ▄ ██▀ ██▄\n█▄ █████▄▀▄ ▄▀██\n▀▄▀▀▄▀▀▄██▀▀▀▄ ▀\n█▄█▄▄█▀▀█▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄ ▄▄▄▄ ▄ \n ▀▄▀▄▀▀▀ ▄▀ ███ \n▄▀▀ ▄█▀ ▀▄██▄▀█\n█▄▄▄▄▄ ▀██▀█▄\n ▀▄ ▀ ▄█▄ ▀█▄▀\n▄▀ █▄█▄█▀▄ ███\n██▀▀███▀█▄▀▀▀▄▀█\n█▄█▄▄█▀▀█▄█▄█▄█ "]]], + ["beowolfmon", [["angry", " ▄▄ ▄▄ \n ▄▀▀▀█▀█ █ \n █▀▀ ▀▀ ▀▄ \n █▀▀▀▀▀▄▄▄█▄ \n ▄█▀▄▀▀ ▄█▀ █ \n█ ▀▀█▀██▀▀█▀▀ █\n ▀▄▄▄█▀▀▀▀▄█▄▄▄▀\n █▄█▄█▀▀▀▀█▄█▄█ "], ["attack", " ▄██▄▄█▀▄ \n ▄▄█ ▄█ ▀▄▀ \n ▀▄▄▄▄▄▄ ▄▀▀▀▄ \n █ ▄▄▄ ▀█▄▄▀▀▄ \n▄▀█ ███ ▄██▀▀ █ \n█ ▄▀▄▄▄▀▀ ▀▄▄▀ \n▀█ ▀▄▄███▀▀▀▄█▄ \n ▀▄▄█▄█▄█▀█▄█▄█"], ["eat_1", " ▄▀▀█▀▀█▀▀█ \n █▀▀ ▀ ▀ ▀█ \n █▀▀▀▀▀▄▄▄▀ \n ▄▄█ ███ ██▀▀▀▄\n ▀▄█▄▀▀▀ ▄█▄▄▄▄█\n █ ▀ █▀▀▀ █ ▀ █\n ▀███▀▀▀▀█▀█▀▀ \n █▄█▄█▀▀█▄█▄█ "], ["eat_2", " ▄▄ ▄▄ \n ▄▀▀█▀▀█ █ \n █▀▀ ▀ ▀ ▀▄ \n █▀▀▀▀▀▄▄▄█▄ \n ██▄▀▀ ▄█▀ ▄▄█ \n █ ▀█▀██▀▀█▀ █\n ▀▄▄▄█▀▀▀▀▄█▄▄▄▀\n █▄█▄█▀▀▀▀█▄█▄█ "], ["happy", " ▄▀▀█▀▀█▀▀█ \n █▀▀ ▀ ▀ ▄▀▀▀▄ \n █▀▀▀▀▀▄█▄▄ █ \n ▄▄██████ ██ ██\n▄█▄██▀▀▀▀▄▀▄▀▀▄▀\n█ ██▀██ █▀▀ \n ▀▀█▄█▀▀▀▀██▄ \n █▄█▄█▀▀█▄█▄█ "], ["injured_1", " \n ▄▀▀▀▀▀█▀█ \n █▀▀ █▄▄ ▀▄ \n ▀▄▄▄▄▄▄▄▄▄█▄ \n █▀▄ ▄█▀ █ \n ▄▀▀█▀██▀▀▄▄▄▀ \n █▄ █▀▀█▀ █▀▄\n █▄█▄█████▄▄▄█▄█"], ["injured_2", " \n ▄▄▄▄▄▄▄▄ \n ▄▄█ ▄ ▀▄▀ \n █ ▀▀▀ ▄█▄▄ \n ▄█▀▀▀▀▀▀█▀ █ \n ▀▄▀▀▄▄▄█▀▄▄▄▄▀ \n █▄ █▀▀█▀ █▀▄\n █▄█▄█████▄▄▄█▄█"], ["sleep_1", " \n ▄██▄▄█▀▄ \n ▄█ ▀▄▀ \n █ ▀▀ █ \n ▄▀█▀▀▀██▀▀▀▀▄ \n █▀▀█▀██▀▀▄▄▄▀█\n █▄▄▄█▀▀▀▀▄█ █\n █▄█▄█▀▀▀▀█▄███ "], ["sleep_2", " ▄▄ ▄▄ \n ▄▀▀▀▀▀█ █ \n ▄▀▀ ▄▄ ▀▄ \n ▀▄▄▄▄▄▄▄▄▄█▄ \n █▀▄ ▄█▀ █ \n ▄▄▀▀█▀██▀▀██▀ █\n ▀▄▄▄█▀▀▀▀▄█▄▄▄▀\n █▄█▄█▀▀▀▀█▄█▄█ "], ["walk_1", " ▄██▄▄█▀▄ \n ▄▄█ ▄█ ▀▄▀ \n ▀▄▄▄▄▄▄ █ \n ▄█ ▄▄ ██▀▀▀▄ \n ▀▄█▄▄▄██▄▄▄▄▀ \n █▀ █ ▀▀ █▀▀ █ \n ▀▄▄█▀▀▀▀█▄▄▄▀ \n █▄█▄█▀▀█▄█▄█ "], ["walk_2", " ▄▄ ▄▄ \n ▄▀▀▀█▀█ █ \n █▀▀ ▀▀ ▀▄ \n █▀▀▀▀▀▄▄▄█▄ \n █▀▄▀▀ ▄█▀ █ \n ▄▄▀▀█▀██▀▀██▀ █\n ▀▄▄▄█▀▀▀▀▄█▄▄▄▀\n █▄█▄█▀▀▀▀█▄█▄█ "]]], + ["betamon", [["angry", " ▄▄▄▄▄ \n ▀▄ ▀▄ \n ▄▀▀▀▀▀▄▀▄ \n ▄▀▀ ▄█ ██▄ \n ▀█▀█▀█▄▄ ▀█▄▄\n █▀█▀█▀█ ▀▀▀▄█\n █▀▀▀▀▀▀▀▀▄ ▀▄\n█▄██▀▀█▄▄█▀█▄▄▄▀"], ["attack", " \n \n ▄▄▄▄▄ \n ▀▄ ▀▀▄ \n ▄▀▄▀▀▀▀▄█▄ \n ▄▀▄ ▄▀ ▀▀ ▄█▀█\n █ ▄▄▄ ▀ █▀\n██▄▄▄▄█▄▄▄▄██▄▄█"], ["eat_1", " \n \n █▀▀▀▀▄▄ \n █ ▄▄▄▄▀▄ \n ▄▀ ▀ ▄█▀▀▄▄▄\n █ █ █ ▀ ▄▀▀▄█\n █ ▄ ▄ ▀▄\n█▄██▀▀█▄▄█▀█▄▄▄▀"], ["eat_2", " ▄▄▄▄▄ \n ▀▄ ▀▄ \n ▄▀▀▀▀▀▄▀▄ \n ▄▀▀ ▀▀ ▄██▄ \n ▀█▀███▄ ▀█▄▄\n █ ████ ▀▀▀▄█\n █▀▀▀▀▀▀▀ ▄ ▄ ▀▄\n█▄██▀▀█▄▄█▀█▄▄▄▀"], ["happy", " ▄▄▄▄▄ \n ▀▄ ▀▄ \n ▄▀▀▀▀▀▄▀▄ \n ▄▀▀ ▀▀ ▄██▄ \n ▀█▀███▄ ▀█▄▄\n █ ████ ▀▀▀▄█\n █▀▀▀▀▀▀▀ ▄ ▄ ▀▄\n█▄██▀▀█▄▄█▀█▄▄▄▀"], ["injured_1", " \n \n █▀▀▀▀▄▄ \n █ ▄▄▄▄▀▄ \n ▄▀ ▀ ▄█▀▀▄▄▄\n █▄▄ ▄▄ ▀ ▄▀▀▄█\n █ ▄ ▄ ▀▄\n█▄██▀▀█▄▄█▀█▄▄▄▀"], ["injured_2", " \n \n ▄▄▄▄▄ \n ▀▄ ▀▀▄ \n ▄▀▄▀▀▀▀▄█▄ \n ▄▀ ▄▀▀ ▄█▀█\n █▀▀ ▀▀ ▀ █▀\n██▄▄▄▄█▄▄▄▄██▄▄█"], ["refuse", " \n \n █▀▀▀▀▄▄ \n █ ▄▄▄▄▀▄ \n ▄▀▀ ▄██▀▀▄▄▄\n █ ▄▄ ▀ ▄▀▀▄█\n █ ▄ ▄ ▄ ▀▄\n█▄██▀▀█▄▄█▀█▄▄▄▀"], ["sleep_1", " \n \n █▀▀▀▀▄▄ \n █ ▄▄▄▄▀▄ \n ▄▀ ▀ ▄█▀▀▄▄▄\n █▄▄ ▄▄ ▀ ▄▀▀▄█\n █ ▄ ▄ ▀▄\n█▄██▀▀█▄▄█▀█▄▄▄▀"], ["sleep_2", " \n \n ▄▄▄▄▄ \n ▀▄ ▀▀▄ \n ▄▀▄▀▀▀▀▄█▄ \n ▄▀ ▄▀▀ ▄█▀█\n █▄▄ ▄▄ ▀ █▀\n██▄▄▄▄▄▄▄▄▄██▄▄█"], ["walk_1", " \n \n █▀▀▀▀▄▄ \n █ ▄▄▄▄▀▄ \n ▄▀ ▀ ▄█▀▀▄▄▄\n █ █ █ ▀ ▄▀▀▄█\n █ ▄ ▄ ▀▄\n█▄██▀▀█▄▄█▀█▄▄▄▀"], ["walk_2", " \n \n ▄▄▄▄▄ \n ▀▄ ▀▀▄ \n ▄▀▄▀▀▀▀▄█▄ \n ▄▀▄ ▄ ▄▀▀ ▄█▀█\n █ ▀ ▀ ▀ █▀\n██▄▄▄▄█▄▄▄▄██▄▄█"]]], + ["bibimon", [["angry", " \n ▄▀█ \n ▄▀▄▀ ▀▄ \n ▀▄ ▄█▄▄▄ \n ▄▀▀▄▀ ▀▀█ \n █ █▄ \n █ █▄ ▄█ ▄▀ \n █▄▄▄▄▄▄▄▄█▀ "], ["attack", " ▄▀▄▀▀▀█ \n ▄█ ▀ ▄█▀█▄▄ \n ▄▀ ▀▄▀ ▄▀ \n █ █▄ ▄█ ▀█ \n █ ▄▄▄▄ ▄▀ \n █ ██████ █ \n █ ▀▀▀▀▀▀ █ \n █▄▀▀▀▀▄▄█▀ "], ["eat_1", " ▄▀▄▀▀▀█ \n █ ▀ ▄██▄ \n ▄▀▀▄▀ ▀▀█ \n █ ▄ ▄ █▄ \n █ ▀ ▀ ▄▀ \n █ ▀█████ █ \n █ ▀▀▀▀ █ \n █▄▀▀▄▄█▄▀ "], ["eat_2", " ▄▄ \n ▄ ▄▀▄▀ \n █ ▀ ▄▀ \n █▄ █▀▀▀▀▄▄▄ \n ▄▀ ▀ ▄▀ \n █▄▀▄ ▄▀▄ ▀█ \n ▀▄ █ \n █▄▀▀▄▄█▄▀ "], ["happy", " ▄▀▄▀▀▀█ \n █ ▀ ▄██▄ \n ▄▀▀▄▀ ▀▀█ \n █ ▄ ▄ █▄ \n █▀ ▀ ▀ ▀ ▄▀ \n █ ▀█████ █ \n █ ▀▀▀▀ █ \n █▄▀▀▄▄█▄▀ "], ["injured_1", " \n ▄▄ \n ▄ ▄▀▄▀ \n █ ▀ ▄▀ \n ▄█▄ █▀▀▀▄▄▄ \n ▄▀ ▀ ▄█ \n █ ▄█ █▄ ▄▀ \n █▄▄▄▄▄▄▄▄▄▄█▄█ "], ["injured_2", " \n \n \n ▄▀▄▀▀▀█ \n █ ▀ ▄██ \n ▄▀▀▀▄▀ ▀▀█ \n █ ▄█ █▄ ▀█ \n █▄▄▄▄▄▄▄▄▄▄█▄█ "], ["sleep_1", " \n ▄▄ \n ▄ ▄▀▄▀ \n █ ▀ ▄▀ \n █▄ █▀▀▀▀▄▄▄ \n ▄▀ ▀ ▄█ \n █ ▄▄ ▄▄ ▄▀ \n ▀█▄▄▄▄▄▄▄▄█▀ "], ["sleep_2", " \n ▄▀█ \n ▄▀▄▀ ▀▄ \n ▀▄ ▄█▄▄▄ \n ▄▀▀▄▀ ▀▀█ \n █ █▄ \n █ ▀▀ ▀▀ ▄▀ \n █▄▄▄▄▄▄▄▄█▀ "], ["walk_1", " ▄▄ \n ▄ ▄▀▄▀ \n █ ▀ ▄▀ \n █▄ █▀▀▀▀▄▄▄ \n ▄▀ ▀ ▄▀ \n █ █ █ ▀█ \n ▀▄ ▀▀ █ \n █▄▀▀▄▄█▄▀ "], ["walk_2", " \n ▄▀█ \n ▄▀▄▀ ▀▄ \n ▀▄ ▄█▄▄▄ \n ▄▀▀▄▀ ▀▀█ \n █ ▄ ▄ █▄ \n █ ▀ ▄▄ ▀ ▄▀ \n █▄▄▄▄▄▄▄▄█▀ "]]], + ["bigmamemon", [["angry", " \n ▄▄ ▄▄▄▄ ▄▄ \n ▀▀▄██████▄▀▀ \n ▄█▀▀▀▀█████▄ \n ██▄▄▄▄██████ \n ▀▀▀▀▀▀██████ \n ▄▄▄▄█████▀ \n ████▀▀▀▀▀▀████ "], ["attack", " ██ ▄▄████▄ ▄▄ \n ▄█████▀ █▄▀▀ \n █▀ █▀▀███ \n ▀███ \n ███ \n █▄ █▄ ███ \n █████████▀ \n███ ████"], ["eat_1", " ██ \n ▄████████▄ \n ███████████ ██\n ▀▀███ ██ \n ▀█████ \n ▀████ \n ████████▀ \n████ ████"], ["eat_2", " \n \n \n ▄████▄ ██ \n ▄████████▄ \n ▄█▀ ▀█████▄ \n ▄██▄███▄█████ \n████████████████"], ["happy", "██ ▄████▄ ██\n██ ▄████████▄ ██\n ██ ████ ██ \n ████ ████ \n ████ ████ \n ████ ████ \n ▀████████▀ \n████ ████"], ["injured_1", " \n \n ▄████▄ \n ▄████████▄ \n ▄███████ ▀▀▄ \n ▄█▀▀ ████████▄ \n▀▀████████▀▀██▀▀\n ██████████████ "], ["injured_2", " \n \n \n ▄▄██▄▄ \n ▄██████▀█▄ \n ███▀████▄▄▄█ \n▄██▄▄▄█████████▄\n ████████▄▄▄███ "], ["sleep_1", " \n \n \n \n ▄████▄ \n ▄████████████▄ \n████████████████\n██▄▄▄▄████▄▄▄▄██"], ["sleep_2", " \n \n \n ▄████▄ \n ▄▄██████████▄▄ \n████████████████\n██ ████ ██\n████████████████"], ["walk_1", " \n ▄████▄ \n██ ▄████████▄ ██\n ██ ████ ██ \n ████████████ \n ████ ████ \n ▀████████▀ \n████ ████"], ["walk_2", " \n \n ▄████▄ \n ▄████████▄ \n ██ ████████ \n██████████ ████\n ██ ██████ \n████████████████"]]], + ["birdramon", [["angry", " \n \n \n ▄▄▀▀▀▀█▀ \n ▄▄▀ ▄ ▀█▄▀▀▀▄ \n█▄▄█ ▀ ▄█ ▄█\n ▀▄▄█▄▄▄ █▄▄▀▀▄▀\n ▀▄▄▄▄▄▀▀ "], ["attack", " ▀█▀█▄▄▄▄█▄ \n ▄▀▀ ▄ ▄█ ▀▄ \n▄▀▀▀▄ ▀▀ █ ▀▄\n▀█████▄ █ █\n ███▀▀█ ▄▀ ▄▀█▄\n ▄██▄▄▄█ ▀▀ █\n ▀▄▄▄█▄▄▀ ▄▀\n ▀▄▄▄▄▄▀▀ "], ["eat_1", " ▄▄▄▄▄▄ \n ▄▀▀ ▄▄▀ \n▄▀▀▄ █▀ █ \n▀▀▀▀▀▄ █▀▀▄▄ \n █ █ █\n █▀▀█▀▀ █ ▄▀\n ▀▀▀▀▀▀█ ▄▀ \n █▄▄▀▀ "], ["eat_2", " ▀█▀▀▄ █▄ \n ▀▄ █ ▄▀ ▀▄ \n █ █▀ ▀▄\n ▄▄▀▀▀█ █\n ▄▄▀ ▄ ▀▄ ▄▄▀█▄\n█▄▄█ ▀ ▀ █ ▀▀ █\n ▀▄▄█▄▄▄ ▄▀\n ▀▄▄▄▄▄▀▀ "], ["happy", " ▄▄▄▄▄▄ \n ▄▀▀ ▄▄▀ \n▄▀▀▄ █▀█ █ \n▀▀▀▀▀▄ █▀▀▄▄ \n █ █ █\n █▀▀█▀▀ █ ▄▀\n ▀▀▀▀▀▀█ ▄▀ \n █▄▄▀▀ "], ["injured_1", " \n \n \n ▄▄▄▄▄▄ \n ▄▀▀ ▄▄▀▀▀▀▄ \n▄▀▀▄ ▀▄ █ █\n▀█▀▀▄ ▄▀ █\n ▀▀▀▀▀▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n \n \n ▄▄▀▀▀█▀▀▀▀▄ \n ▄▄▀ ▄ ▀█ █\n█▄▄█ ▀▄▀ █\n ▀▄▄█▄█▄▄▄▄▄▄▄▀ "], ["sleep_1", " \n \n \n ▄▄▄▄▄▄ \n ▄▀▀ ▄▄▀▀▀▀▄ \n▄▀▀▄ ▄▄ █ █\n▀█▀▀▄ ▄▀ █\n ▀▀▀▀▀▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n \n \n ▄▄▀▀▀▀▀█ \n ▄▄▀ ▀█▀▀▀▀▄ \n█▄▄█ ▀▀ █ █\n ▀▄▄█▄▄▄▀ █\n ▀▄▄▄▄▄▄▄▀ "], ["walk_1", " ▀█▀▀▄ █▄ \n ▀▄ █ ▄▀ ▀▄ \n █ █▀ ▀▄\n ▄▄▀▀▀█ █\n ▄▄▀ ▄▄ ▀▄ ▄▄▀█▄\n█▄▄█ ▀ ▄▀ ▀▀ █\n ▀▄▄█▄▄▄ ▄▀\n ▀▄▄▄▄▄▀▀ "], ["walk_2", " \n ▄▄▀▀▀▀█▀ \n ▄▄▀ ▄▄ ▀█▄▄▄ \n█▄▄█ ▀ ▄█ ▀▀▄\n ▀▄▄█▄▄▄ █ █\n ▀▄▄▀ █ \n █ ▄▄▀ \n ▀▀▀ "]]], + ["biyomon", [["angry", " \n ▄▀▀▀▀▀▄▄▄▀▄ \n ▀▄▄▀ ▄ ▄▄▀ \n █▄▄▀▀ ▄█▄▀▀▄ \n █ █ ▀ █ \n ▀▄▄▀ ▀▄▄▄▀█ \n █▄▄▄▄▄▄▄▄▀ \n █▄█▄█ █▄█▄█ "], ["attack", " ▄▀▀▀▀▀▄▄▄▀▄ \n ▀▄▄▀ ▄ ▄█▄▀▀█\n▄▀ ▀▄ ▀ ▄▀ ▀▄\n▀▄███▄█▄ ▀ ▀▄\n█ ▀█████ █ \n▀▄ ▀▄▄▄▀ ▄▀█▀▄\n ▀▀▄█▄ █ ▀ ▀█\n █▄█▄█▀▀▀▀▄▄▄▀ "], ["eat_1", " ▄▀▀▀▀▀▄▄▄▀▄ \n █▄▄▀ ▄ ▄▄▀ \n█ ▄█▄ ▀ ▄█▄▀▀▄ \n▀██████ █ █ \n ▄▀▀▀▀▄ ▄ ▄▀ \n ▀█▀▀▀ ▀▀▀ █ \n █▄▄▄▄▄▄▄▄▀ \n █▄█▄█ █▄█▄█ "], ["eat_2", " \n ▄▀▀▀▀▀▄▄▄▀▄ \n ▀▄▄▀ ▄ ▄▄▀ \n █▄▄▀ ▀ ▄█▄▀▀▄ \n █ █ ▀ █ \n ▀▄▄▀ ▀▄▄▄▀█ \n █▄▄▄▄▄▄▄▄▀ \n █▄█▄█ █▄█▄█ "], ["happy", " ▄▀▀▀▀▀▄▄▄▀▄ \n ▀▄▄▀ ▄ ▄▄▀ \n ▄█▄▄▀ ▀ ▄▀ ▄▄▄\n█ ▄▄█▄ ▄▀▄▀▀ █\n▄▀▀████ ▄▀\n▀▄ ▀▄▄▄▀ ▀▄▄▀█ \n ▀▀█▄▄ ▄▄█ \n █▄▄▄█▀▀█▄█▄█ "], ["injured_1", " █▀▄ \n ▄▀▀▀▀▀▀ ▄▀ \n █ ▄ ▀█ \n █ █ █▄ ▄▀▄ \n ▄▀▀▀▄ ▄▀ ▀▄ \n█▀█ ▄▀ ▄▀█▀█▀▄\n█▀ ▀█▀ █ ▄ █\n█▄▄▄▄█▄▄▄▄█▄▄▄▀ "], ["injured_2", " ▄▄ \n ▄▄▄▄▄▄▀ █ \n ▄▀ ▄█ \n █ ▀▄ █ \n ▀▄▄█ ▀▀ █ ▀▀▄ \n██ █ ▄▀█▀█▀▄\n█▀▄▄█ █ ▄ █\n█▄▄▄▄█▄▄▄▄█▄▄▄▀ "], ["sleep_1", " \n \n ▄▄▄▄▄ ▄ \n█ ▄ ▀▀▀ █ \n █▀ ▄▄ ▀█▀▀▀▄▄ \n▄▀▀▀▄ ▀ █\n█ ▄▀ ▀▄ █\n ▀▀▄▄▄▄▄▄▄▄█▄▄▀ "], ["sleep_2", " \n \n ▄▀▀▀▀▀▄▄▄▀▄ \n ▀▄▄▀ ▄▄▀ \n █▄▄ ▀▀ ▄█▄▄ \n █ █ ▀ ▀▄ \n ▀▄▄▀ █ █\n ▀▄▄▄▄▄▄█▄▄▄▄▀"], ["walk_1", " ▄▄▄▄▄ ▄ \n █ ▄ ▀▀▀ █ \n █▀ █ ▀█ \n ▄▀▀▀▄ █▄▄▀▀▄ \n █ ▄▀ ▀ █ \n ▀█ ▀▄▄▄▀█ \n █▄▄▄▄▄▄▄▄▀ \n █▄█▄█ █▄█▄█ "], ["walk_2", " \n ▄▀▀▀▀▀▄▄▄▀▄ \n▄▀▄▄▀ ▄ ▄▄▀▄▀▀▄\n█ █▄▄ ▀ ▄▀▀ ▀█\n █ █ ▄▀ ▀█\n ▀▄▄▀ ▀▄▄▄▀ \n █▄▄ ▄▄▄▀ \n █▄█▄█▀▀▀█▄█▄█ "]]], + ["blackwargreymon_x", [["angry", " ▄▄ ▄ \n█ ▀▄▄▀▀▀▀█▀▀ █ \n▀▄▀ ▄▄█ ▀▀▀█▀ \n ▀▄█▄▄ ▄▄▄▀████ \n ▀▄▄█▄████▄▄▀██\n▄▄▀█▄▀▀▄███▀▄▀█▀\n▀▄▄█▄██▄████▄█▄ \n█▄██▀▄▄▀▀████▄▄█"], ["attack", " ▄▀█ ▄▄▄▄▄▄▄▀▄ \n █ ▄▀ ▄ █▄▄▄█ \n █ ▄▀▀▀▄▄▄▄▀ \n▄▀▀█▀▀▀█▀▄▄██▄ \n▄▀▀█▄███▀▀▄██▀ \n ▀▀█▀██▀████ \n ███▀▀██████▄ \n █▄▄██▀▀████▄▄█ "], ["eat_1", "▄▀█ ▄▄▄▄▄▄▄▀▄ \n█ ▄▀▀ ▄ █▄▄▄█ \n █ ▄ ▀ ▀ ▄▄█▄▄ \n █████ ██▄▀▀█▀ \n▄▀█▀▀▀▀▄████▀██ \n▀▄█▀███▀██▀▄▀█▀ \n ▄██▀▀████▄█▄ \n █▄▄██▀▀████▄▄█ "], ["eat_2", " ▄▄ ▄ \n█ ▀▄▄▀▀▀▀█▀▀ █ \n▀▄▀ ▄▀▄ ▀▀▀█▀ \n ▀▄█▄▄ ▄▄▄▀████ \n ▀▄▄█▄████▄▄█▄ \n ▄▀█▄▀▀▄███▀▄██ \n▀▄██ ▀█▄██▄▀▄█▄ \n█▄▄██▀▀██████▄▄█"], ["happy", "▄▀█ ▄▄▄▄▄▄▄▀▄ \n█ ▄▀▀ ▄ █▄▄▄█▄ \n █ ▄ ▀ ▀ ▄█ █ █\n █▀▀█ █████▀▀█▀\n █▀██▀████▄▀ \n ▄▀█▀▄▄▀████ \n ▀███▀▀██████▄ \n █▄▄██▀▀████▄▄█ "], ["injured_1", " \n▄▀█ ▄▄▄▄▄▄▄▀▄ \n█ ▄▀▀▄ █▄▄▄█ \n █ ▄ ▀▀ ▄▄█▄▄ \n █▀▀█ ███▄▀▀█▀ \n ██▀▀████▀██ \n ▄██▄██▄██▄█▄█▀▄\n█▄██▄▄████▄▄██▄█"], ["injured_2", " \n ▄▄ ▄ \n█ ▀▄▄▀▀▀▀█▀▀ █ \n▀▄▀ █▄ ▀▀▀█▀ \n ▀▄█▄▄ ▄▄▄▀████ \n ▀▄▄█▄██▀▄▄▄█ \n ▄██▀▄▄▀▄▀▄███▀▄\n█▄████████▄▄██▄█"], ["sleep_1", " \n ▄▄ ▄ \n█ ▀▄▄▀▀▀▀█▀▀ █ \n▀▄▀ ▄▄▄ ▀▀▀█▀ \n █▄█▄▄ ▄▄▄▀████ \n █▄▄█▄█▀██▄▄███\n █ ▀▄▄▄██▀ ▀█▀\n █▄▄▄█▄▄██▄▄▄▄█ "], ["sleep_2", " \n ▄▀█ ▄▄▄▄▄▄▄▀▄ \n █ ▄▀▀ █▄▄▄█ \n █ ▄ ▀▀▀ ▄▄█▄▄\n ▄█▀▀█ ███▄▀▀█▀\n █▄███▀▀▄████▀██\n █ ▀▄██▄█▀ ▀█▀\n █▄▄▄█▄▄██▄▄▄▄█ "], ["walk_1", "▄▀█ ▄▄▄▄▄▄▄▀▄ \n█ ▄▀▀▄▄▄ █▄▄▄█ \n █ ▄▀▀▀ ▄▄█▄▄ \n █▀▀█ ███▄▀▀█▀ \n ▄█▀██▀███▀███ \n █ █▀▄▄▀█▀▄▀██▀ \n ███▀▀███▄██▄ \n █▄███▀▀████▄▄█ "], ["walk_2", " ▄▄ ▄ \n█ ▀▄▄▀▀▀▀█▀▀ █ \n▀▄▀ ▄██▀ ▀▀▀█▀ \n ▀▄█▄▄ ▄▄▄▀████ \n █▄▄█▄████▄ ▄█ \n █ █▄▀▀▄██▀▄▀██ \n ▄██▄██▄███▄██▄ \n█▄██▄▄█▀▀███▄█▄█"]]], + ["blitzgreymon", [["angry", " ▄▄ ▄▄ \n █▀▄▄▀▀▀▀██ █▄▄ \n ▀▄▀ ▄▀ █▄▄▄▀ █\n ▀█▀▀▀▀▄█ ▀▀▄ █\n ▄▄█▀▀█▄██▀▀█ █\n █ █▄▀▀▄█ █▄█\n ▄█▀█▄▄█▄████▀██\n█▄█▄▄█ ██▄█▄█ "], ["attack", " ▄▄ ▄▄██▄▄▀█ \n █ █▀ ▄▄▀▀ █▀▀▄\n █▄▄▄█▄▀▀██ █\n █████▀█ ▀▀▄ █\n ▄█▄▄▄▀▄██▀▀█ █\n █▄██ ██ ███\n ▄█ ▀█▀▀▄████▀▀▀\n█▄█▄▄█ ██▄█▄█ "], ["eat_1", " ▄▄ ▄▄██▄▄▀█ \n █ █▀ ▄▄▀▀ █▀▀▄\n █▄▄▄█▄▀█▀█▄ █\n █████▀█▄▄▄█ █\n ▄█▄▄▄▀█▀▀ █ █\n █▄██ █▀▄▄▄▄███\n ▄█ ▀█▀▀██▄▄█ ▀▀\n█▄█▄▄█ ██▄█▄█ "], ["eat_2", " ▄▄ ▄▄ \n █▀▄▄▀▀▀▀██ █▄▄ \n ▀▄▀ ▄▀█▄▄▄▀ █\n ▀█▀▀▀▀▄█ ▀▀▄ █\n ▄▄█▀▀█▄██▀▀█ █\n █ █▄▀▀▄█ █▄█\n ▄█▀█▄▄█▄████▀██\n█▄█▄▄█ ██▄█▄█ "], ["happy", " ▄▄ ▄▄██▄▄▀█ \n █ █▀ ▄ ▄▀▀ █▄▄ \n █ ▀ ▀▀██▀ █\n ▀█▀▀▀▀▄█ ▀▀▄ █\n ▄▄█▀▀█▄██▀▀█ █\n █▄█▄▀▀██ █▄█\n ▄█▀█▄▄█▄███████\n█▄█▄▄█ ██▄█▄█ "], ["injured_1", " ▄▄ ▄▄ \n █▀▄▄▀▀▀▀██ █▄▄ \n ▀▄▀ ▀▀ █▄▄▄▀ █\n ▀█▀▀▀▀▄█ ▀▀▄ █\n ▄█▀▀█ ██▀▀█ █\n ▄█▄▀▀▄▀▄█ █▄█\n ▄█▀█▄▄█▄█ █▀██\n█▄█▄▄█ ████▄█ "], ["injured_2", " \n ▄▄ ▄▄██▄▄▀█ \n █ █▀▄▄ ▄▀▀ █▀▀▄\n █▄▄▄▄▄▀█▀█▄ █\n ▀▄▄▄▄▀█▄▄▄█ █\n ▄█▀▄▄▀▄▀█ █ █\n ▄█▀█▄▄█▄█ █▀██\n█▄█▄▄█ ████▄█ "], ["sleep_1", " \n ▄▄ ▄▄██▄▄▀█ \n █ █▀ ▄▄▄▀▀ █▀▀▄\n █▄▄▄▄▄▀█▀█▄ █\n ▀▄▄▄▄▀█▄▄▄█ █\n ▄▀█▀▄▄▀▄▀▀ █ █\n ██▀█▄▄█▀▄▄▄▄▀██\n█▄█▄▄█ ██▄█▄█▀▀"], ["sleep_2", " ▄▄ ▄▄ \n █▀▄▄▀▀▀▀██ █▄▄ \n ▀▄▀ ▀▀█▄▄▄▀ █\n ▀█▀▀▀▀▄█ ▀▀▄ █\n ▄▄█▀▀█▄██▀▀█ █\n █ █▄▀▀▄█ █▄█\n ▄█▀█▄▄█▄████▀██\n█▄█▄▄█ ██▄█▄█ "], ["walk_1", " ▄▄ ▄▄██▄▄▀█ \n █ █▀ ▄▄▀▀ █▀▀▄\n █▄▄▄█▄▀█▀█▄ █\n ▀▄▄▄▄▀█▄▄▄█ █\n ▄▀█▀▄▄▀█▀▀ █ █\n ▀▄██ █▀▄▄▄▄███\n ▄█ ▀█▀▀██▄▄█ ▀▀\n█▄█▄▄█ ██▄█▄█ "], ["walk_2", " ▄▄ ▄▄ \n █▀▄▄▀▀▀▀██ █▄▄ \n ▀▄▀ ▄▀█▄▄▄▀ █\n ▀█▀▀▀▀▄█ ▀▀▄ █\n ▄▄█▀▀█▄██▀▀█ █\n █ █▄▀▀▄█ █▄█\n ▄█▀█▄▄█▄███████\n█▄█▄▄█ ██▄█▄█ "]]], + ["blossomon", [["angry", " \n ▄▄▄▀▀▀▄▄▄ \n ▄▀ █▄▄▄█ ▀▄ \n ▀▄▄█ ▄█▄▄▀ \n ▄▀ █▀▀ ▀▀ █ ▀▄\n ▀▄▄█ ▄▀▀▄▄ █▄▄▀\n ▀▄▄▄▀▄▄▄▄▄▀▄▄▄▀\n █▄▄▄▄▀▄▄▄▀▄▄▄▄█"], ["attack", " ▄▄▄▀▀▀▄▄▄ \n ▄▀ ▄▀▀▀▀█▄ ▀▄ \n ▀▄█▀▀ ▀▀ █▄▀ \n▄▀ ▀█▄██▄█ █ ▀▄ \n▀▄▄▄██████ █▄▄▀ \n█ ▄▀█▀██▀█ █▄ █ \n █▀▄ ▄█ █ \n█▄▄███▀▀▀█▄█▄▄█ "], ["eat_1", " ▄▄▄▀▀▀▄▄▄ \n ▄▀ ▄▀▀▀▀█▄ ▀▄ \n ▀▄█▀▀ ▀▀ █▄▀ \n▄▀ ██▄██▄███ ▀▄ \n▀▄▄█████████▄▄▀ \n█ ▄█▀▄▀ ▀██▄ █ \n █ ▀▀ ▄██ █ \n█▄█▄▄▄▄▄▀██▄▄▄█ "], ["eat_2", " \n ▄▄▄▀▀▀▄▄▄ \n ▄▀ █▄▄▄█ ▀▄ \n ▀▄▄▀▄ ▄▀▄▄▀ \n▄▀ █▀ ▀ ▀ ▀█ ▀▄ \n▀▄▄█▀▀▄▀▄▀▀█▄▄▀ \n█ ▄▀▀▄▄▄▄▄▀▀▄ █ \n█▄█▄▄▀▄▄▄▀▄▄█▄█ "], ["happy", " ▄▀▀▀▄▀▀▀▄▀▀▀▄ \n▄▀▄ ▄▀▀▀▀▀▄ ▄▀▄ \n█ █▀▄ ▄▀▄ █ █ \n █▄█▄▄▄▄▄▄██▄█ \n█ ▄█████████▄ █ \n▀▄ ▀▄▀▀▀▀▀▄▀ ▄▀ \n█ ▀▄▄█▀▀▀█▄▄▀ █ \n ▀█▄▄▄▀▀▀▄▄▄█▀ "], ["injured_1", " \n ▄▄▄ \n ▄▀▀█▄▄▄█▀▀▄ \n █ ▄▀ ▀▄ █ \n ▄▀█ ▄ ▄ █▀▄ \n█ █▀▀▀ ▀▀▀█ █ \n▀▄▀ ▀▄▄▄▄▄▀ ▀▄▀ \n ▀▄▄▄▀▄▄▄▀▄▄▄▀ "], ["injured_2", " \n \n ▄▄▄ \n ▄▀▀▀█▄▄▄█▀▀▀▄ \n ▀▄▄▀ ▀▄▄▀ \n▄▀ █ ▄ ▄ █ ▀▄ \n█ ▄█▀▀▀ ▀▀▀█▄ █ \n █▄▄▀▄▄▄▄▄▀▄▄█ "], ["sleep_1", " \n ▄▄▄▀▀▀▄▄▄ \n ▄▀ ▄▀▀▀▀▀▄ ▀▄ \n ▀▄█ █▄▀ \n▄▀ █▀▀ ▀▀█ ▀▄ \n█ ▄▀█▀▄▀▄▀█▀▄ █ \n █ ▄▀▀▀▀▀▄ █ \n█▄██▄█▀▀▀█▄██▄█ "], ["sleep_2", " \n ▄▄▄ ▄▄▄ ▄▄▄ \n █ █▄▄▄█ █ \n ▄█▄▀ ▀▄█▄ \n█ █▄▄ ▄▄█ █ \n▀▄▄█▄▄ ▄ ▄▄█▄▄▀ \n▄▀ ▀▄█▄█▄▀ ▀▄ \n██▄▄█▄▄▄▄▄█▄▄██ "], ["walk_1", " ▄▄▄▀▀▀▄▄▄ \n ▄▀ █▄▄▄█ ▀▄ \n ▀▄▄█ ▄█▄▄▀ \n▄▀ █▀▀ ▀▀ █ ▀▄ \n▀▄▄█▀▀▄▀▄▀▀█▄▄▀ \n█ ▄▄█▄▄▄▄▄▀▄▄ █ \n █ ▄▀▄▀ ▀▄▀▄ █ \n█▄▄█▄█▀▀▀█▄█▄▄█ "], ["walk_2", " ▄▄▄ \n ▄▀▀▀█ █▀▀▀▄ \n ▀▄ ▄▀▀▀▀▀▄ ▄▀ \n▄▀▀██▄ ▄█▀█ ▀▄ \n▀▄ █▄▄ ▄ ▄▄█ ▄▀ \n▄▄▀█▄ ▀ ▀ ▄█▀▀▄ \n█ █ █▀█▀█ █ █\n█▄█▄█▄▄▄▄▄█▄█▄▄█"]]], + ["boltboutamon", [["angry", " ▄ ▄▄▄▄ ▄▄ \n █▄▀▀▄▄▄ ▀▄▄▀▄ \n ▀██▀▀▀▀▀█▀ ▀▀ \n █ ▄█ █ ▄ \n ▄█▄ ▄███▄█ \n █ █ ███▀▄█ █ \n █▀▀▄▀▄▀▄█████▄\n █▄██▀▀▀██▄▄███▀"], ["attack", " ▄▀▄▄▀▀▀▀▄▀▀▄ \n ██▄▄███▄▄█▀▄█ \n █▀ ▄ █▄▄ \n █ ▀▀ ▄▀▄▄█ \n ▀▄▄▄█▀██▄▀█▄\n▄▀▀▀▀▀▀█ █ ▄██\n ▀▀█▀▀██▄ ███▀██\n █▄██▀▀▀█▄▄█ ▀"], ["eat_1", " ▄▀▄▄▀▀▀▀▄▀▀▄ \n ██▄▄███▄▄█▀▄█ \n █▀ ▄▀▄ █▄▄▄ \n █▄▄▄▄▄ █ █ \n▄▀▀██▀▀▀▄██▀ ▄▀ \n▀▄▄▀█▀█▀█▀▀████▄\n █ ▀▄▀ ▄██████\n █▄██▀▀█▄▄█ █▀ "], ["eat_2", " ▄ ▄▄▄▄ ▄▄ \n █▄▀▀▄▄▄ ▀▄▄▀▄ \n ▀██▀▀▀▀▀█▀ ▀▀ \n █ ▄▀▄ █ ▄ \n ▄▀▄ ▄█▄▀ █ \n▄▀▀█ ███▀▄▀▀▀▄ \n▀▄▄▀▀▄▀▄▀█▄▄▄██▄\n █▄██▀▀▀██▄▄███▀"], ["happy", " ▄▀▄▄▀▀▀▀▄▀▀▄ \n ██▄▄███▄▄█▀▄█ \n ▄▄█▀ ▄▀▄ █▀▀▀▄ \n█ █▄▄▄▄▄ █▄ █ \n ▀▄██▀▀▀▀▄█▄▄█▀ \n ██▀█▀█▀▀████▄\n ▄▀▀▄▀ ▄██████\n █▄██▀▀█▄▄█ █▀ "], ["injured_1", " \n ▄▀▄▄▀▀▀▀▄▀▀▄ \n ██▄▄███▄▄█▀▄█ \n █▀ ▄ █ \n █ ▀▀▄█▄▀▄ \n ▀▄▀▄▄▄█▀█▄▄█▄ \n ▄▀▄▀█▀▄█▀ ████ \n█▄▄▄█▄███▄▄▄███▄"], ["injured_2", " \n ▄ ▄▄▄▄ ▄▄ \n █▄▀▀▄▄▄ ▀▄▄▀▄ \n ▀██▀▀▀▀▀█▀ ▀▀ \n █ █▄ █ ▄ \n ▄▀▄ ▄██▀ █▄ \n ▄▀▄▀██▀▄▀▀████ \n█▄▄▄█▄▄██▄▄▄███▄"], ["sleep_1", " \n ▄ ▄▄▄▄ ▄▄ \n █▄▀▀▄▄▄ ▀▄▄▀▄ \n ▀██▀▀▀▀▀█▀ ▀▀ \n █ ▄▄▄ █ ▄ \n ▄▀▄ ▄██▀▄█ \n █ ▀██▀▄█▀ ▀█▄ \n▄██▄▄█▄█▄█▄▄▄███"], ["sleep_2", " \n ▄▀▄▄▀▀▀▀▄▀▀▄ \n ██▄▄███▄▄█▀▄█ \n █▀ █ \n █ ▀▀▀▄█▄▀▄ \n ▀▄▀▄▄▄█▀█▄▄▀ \n █ ▀██▀▄█▀ ▀█▄ \n▄██▄▄█▄█▄█▄▄▄███"], ["walk_1", " ▄▀▄▄▀▀▀▀▄▀▀▄ \n ██▄▄███▄▄█▀▄█ \n █▀ ▄ █ \n █ ▀▀ ▄█▄▀▄ \n █▄▀▄▄▄█▀█▄▄▀ \n █ █▀█▀▄█ █▄ \n ▀█ ▀▄▀ ▄██████\n █▄██▀▀█▄▄█ █▀ "], ["walk_2", " ▄ ▄▄▄▄ ▄▄ \n █▄▀▀▄▄▄ ▀▄▄▀▄ \n ▀██▀▀▀▀▀█▀ ▀▀ \n █ ▄█ █ ▄ \n ▄▀▄ ▄█▄▀ █ \n▄▀▀█ ███▀▄▀▀▀▄ \n▀▄▄▀▀▄▀▄▀█▄▄▄██▄\n █▄██▀▀▀██▄▄███▀"]]], + ["boltmon", [["angry", " ▄▀█▀█▀█▀▄ \n ▄█ ▄▀▄ █▀▀▄ \n █ █ ▀▀▀ ███▀█ \n █ █▀▀▀ █▄█ █ \n▄▀▀▄▀▀███▀ ▄▀▀▀▄\n▀▄▄█▄▄▄█▄▄▄█▄▄▄▀\n ▄███████████▄ \n █▄▄▄██ ███▄▄▄▄█"], ["attack", " ▄█▀▀▀█▀█▄ \n █▄▀▄▄▄▀▄█▀▀▄ \n █▄▄▄▄ █▄▄█ \n ▀▄▀██ █▀█ █ \n ▄▀▀▄█▄█▀▄▀▀█▄█ \n ▀▄▄█▄▄▄▄█▄▄█▄▀ \n ▄██████████▄ \n █▄▄███ ██▄▄▄█"], ["eat_1", " ▄▀▀█▀▀▀█▄ \n █▀▀ ▀▀▀ █▀▀▄ \n ▀▀███▄ ▄██▀█ \n▄▀▀▄▄███▀ █▄█ █ \n▀▄▄█▄▄▄▄▄█ █▀█ \n █▄█▄▄▄▄████ \n ▄███████████▄ \n █▄▄▄██ ██▄▄▄▄█"], ["eat_2", " ▄█▀█▀█▀█▄ \n █ ▄ ▀▄█▀▀▄ \n █▀ ▀▀▀ ▄██▀█ \n █▀▀▀▀ █▄█ █ \n ▄▀████▀▀▀ ▄▀▀█ \n ▀▄█▄█▄▄▄▄▄█▄▄▀ \n ▄███████████ \n █▄▄▄██ ██▄▄▄▄█ "], ["happy", "▄▀▀▄█▀█▀█▀█▄▀▀▀▄\n█ ▄█ ▄ ▄ █▄ █\n█▀ █▀ ▀ ▀ ▀█▄█▀█\n▀▄ █ █████ █▄█ █\n ▀█ █▀▀▀█ █ █▀▀\n ▄▀▄ ▀▀▀ ▄▀▄▀ \n ▄████████████▄ \n█▄▄▄██ ██▄▄▄█"], ["injured_1", " ▄▄▄▄▄▄▄ \n █▀ ▀ ▀▄▀█ \n ▄█▄█ █▄▄▀█▀▄▄▄\n █ █ ▄▄▄ █▀█ █\n █ █▀ ▀▄ █▀█▄█\n █▀▀█▀▀▀▀▀▀▄▀▀█ \n ▀▄▄████████▄▄█ \n █▄▄███▀▀████▄▄█"], ["injured_2", " \n ▄█▀█▀█▀█▄▄ \n █ ▄ ▀▄█ ▀▄ \n █▀ ▀▀▀ █▄█▀█ \n ▀████▄ █▄█ █ \n ▄▀▄▄▄▄▄▄▄▀▀█▀█ \n ▀▄▄█▄▄▄▄█▄▄██▄ \n █▄▄███▀▀███▄▄▄█"], ["sleep_1", "█ ▄▀ ▄▀ ▄▀ █ \n█ ▄▀▀▀▀▀▀▀▄ ▄▀ \n ██▀█▀█▀█▀██ \n ▀█▀▀█▀▀▀▀█▀▄ \n ▄█▀▀ ▀▀▀ █▄█▀█ \n█▄█ ▀ █▄█ █ \n█ ▀█▀▀█▀▀▀ █▀▀█ \n█▄▄█████████▄▄█ "], ["sleep_2", "█ █▄▄█▄▄█ █ \n █▄█▄▄▄▄▄▄▄█▄█ \n █▄█▄█▄█▄█▄█ \n █▄▄▀▄▄▄ █ █▄▄\n ▄▀█ ▄▄▄ █▀█ █\n▄█ ▀▄▄▄▄▄▄▄▀██▄█\n█ ▀█ ▀█▀ █ █ \n█▄▄█████████▄▄█ "], ["walk_1", " ▄█▀█▀█▀▄ \n ▄█ ▄ ▀▄█▀▀▄ \n █ █▀▀ ▀▀▀ █▄█▀█\n █ █ ▀▀▀ █▄█ █\n▄▀▀▄▀███▀▀▀ ▄▀▀█\n▀▄▄█▄▄█▄▄▄▄▄█▄▄▀\n ▄███████████▄ \n █▄▄▄██▀███▄▄▄▄█"], ["walk_2", " ▄▄▄▄▄▄ \n █▀ ▀ ▀▄▀▄ \n ▄█▄▄▀▄▄▄▀█▀▄▄▄\n █ █ ▄▄▄ █▀█ █\n █ ▀▄▄▄▄▄▄▄▀▀█▄▀\n▄▀▀█ ▀█▀ █▀▀▄\n▀▄▄██████████▄▄▀\n █▄▄███▀▀███▄▄▄█"]]], + ["bommon", [["angry", " \n \n █▄▄█ \n ██▀▄██ \n ▄▀█▀▄█ ▄ \n ▀▀█▀ ▀▄▀ \n ▀▀▀ \n "], ["attack", " ▄ ▄ \n ▄██▀██▄ \n ▀█▄▄█▀█ \n ▄██▄▄▀ \n ▀ ▄ ▀▄ \n ▄▀ ▀▄▀ \n ▄ ▀▄▀ ▄ \n "], ["eat_1", " \n ▄ \n ▄█▀█▀▄█ \n ▀██▀█ \n ███ \n ▀██████ ▄▀▄ \n ▀▄▄▄▀ \n "], ["eat_2", " \n \n ▄ ▄ \n ▄█▄█▀█▄ \n ▀▀▀▀███ \n ▀██████ ▄▀▄ \n ▀▄▄▄▀ \n "], ["happy", " \n █▄▄█ \n ██▄███ \n █▄█▄██ \n █ ██ \n ▄▀▄▀▀█▀ \n ▀▄▄▄▀ \n "], ["injured_1", " \n \n \n \n ▄ ▄ \n ▄█▀▀█▄ \n ▀▀█▀▀█ ▄▀▄\n ▀█████▄▄▄▀ "], ["injured_2", " \n \n \n \n ▄ ▄ \n ▄██ ▀█▄ \n ██▀█▀██ ▄ \n ▀▄▄█▄▄█▄▄▄▀▀"], ["sleep_1", " \n \n \n \n ▄ ▄ \n ▄▀▀██▄ \n ▀▀█▀▀█ ▄▀▄ \n ▀█████▄▄▀ "], ["sleep_2", " \n \n \n \n █▄▄█ \n █▄▄███ \n ▄▄█▄▄█ ▄▀▄ \n ▀█████▄▄▀ "], ["walk_1", " \n \n █▄▄█ \n ██▄███ \n █▄█▄██ \n ▀▀█▀ \n ▄▀▄▄▀ \n ▀ "], ["walk_2", " \n ▄ ▄ \n ▄█▀██▄ \n █▀█▀██ \n ▀████▀ \n ▀▄ \n ▄▀▄▀ \n ▀ "]]], + ["botamon", [["angry", " \n \n \n \n █▄▄▄▄█ \n █▄▀██▀▄█ \n ▀██▀▀██▀ \n █▄▄█ "], ["attack", " \n \n \n \n \n ▄ \n █▀██ \n ████▀ "], ["eat_1", " \n \n \n \n \n ▄ \n █▀██ \n ████▀ "], ["eat_2", " \n \n \n \n ▄████▄▄█ \n ▀█▄██ \n ███ \n ▄███████ "], ["happy", " \n \n \n \n █▄▄█ \n █▄██▄█ \n ██ ██ \n ▀████▀ "], ["injured_1", " \n \n \n \n \n ▄ ▄ \n ▄████▄ \n █▄▄██▄▄█ "], ["injured_2", " \n \n \n \n \n ▄ ▄ \n ▄████▄ \n █▄▄██▄▄█ "], ["refuse", " \n \n \n \n ▄ ▄ \n ▄█▀▀█▄ \n ▀▀▀███ \n ▀████▀ "], ["sleep_1", " \n \n \n \n \n ▄ ▄ \n ▄████▄ \n █▄▄██▄▄█ "], ["sleep_2", " \n \n \n \n \n ▄ ▄ \n ▄████▄ \n █▄▄██▄▄█ "], ["walk_1", " \n \n \n \n \n ▄█▄▄█▄ \n █▄██▄█ \n ▄██▄▄██▄ "], ["walk_2", " \n \n \n \n \n ▄ ▄ \n ▄▀███▄ \n ▄████▄█▄ "]]], + ["boutmon", [["angry", " ▄ ▄▄▄▄▄▄ \n ▄▀ ▀ ▀▄▄ \n ▀▄█████▄▄█▄▄▄ \n █▀ ▄▀ ▀▄█ ▀█ \n ▄█▄▄▄▄▄▀▀▄▄▄ \n▄▀ █ ▀▀ ▄ ▀▄\n▀▄▄███▄▄▄▄███▄▄█\n▄████▀▀▀▀▀▀████▄"], ["attack", " ▄ ▄▄▄▄▄▄ \n ▄▀ ▀ ▀▄▄ \n ▀▄█████▄▄█▄▄▄ \n █▀ ▄█ ▀▄█ ▀█ \n ▄▄█▄▄▄▄▄▀▀▄ \n█ ▄ ▀▄ ▄▀ \n ▀██████████▄▄ \n▄████▀▀ ▀▀████▄"], ["eat_1", " ▄▀▄▀▀▀▀█▀ \n █ ▄ █▀ ▄█ \n ▀█▀▀██▀█▀█▀▀ \n ▄███ ▄█▀ \n █ █▀▀▀▀ ▀▀▀▄ \n ▀▄▄█▄ █▄▄ █\n ▄███████████▀▀\n▄████ ████▄"], ["eat_2", " ▄ ▄▄▄▄▄▄ \n ▄▀ ▀ ▀▄▄ \n ▀▄█████▄▄█▄▄▄ \n █▀ ▄█ ▀▄█ ▀█ \n █▄▄▄▄▄▀▀▄▄▄ \n ▄█ ▀▀ ▄ ▀▄\n █▄▄█▄▄▄▄███▄▄█\n▄████▀▀▀▀▀▀████▄"], ["happy", " ▄ ▄▄▄▄▄▄ \n ▄▀ ▀ ▀▄▄ ▄ \n ▀▄█████▄▄█▄▀ █ \n █▀ ▄█ ▀▄▀▄▄█ \n ▀▄▄▄▄▄█▀ ▄▀ \n ▄█ ▀▀ ▄▄▀ \n █▄▄█▄▄▄▄▄██▄▄ \n▄████▀▀▀▀▀▀████▄"], ["injured_1", " \n ▄▀▄▀▀▀▀█▀ \n █ ▄▄▄▄▄ █▀ \n ▀██▀█▀▀█▀█▀█▄ \n █ ▀▀ ▄█▀ ▀ \n █▀██▀ ▀▄ \n ▄██▄ ▄▀▀ ▄█▄ \n ▀██████████▀ "], ["injured_2", " \n ▄ ▄▄▄▄▄▄ \n▄▀ ▀ ▀▄▄ \n▀▄█████▄▄█▄▄▄ \n █▀ █▄ ▀▄█ ▀█ \n ▀▄▄▄▄▄▀▀▄▀▄ \n █▄█▄ ▄▀▀ ▄█▄ \n ▀██████████▀ "], ["sleep_1", " \n ▄ ▄▄▄▄▄▄ \n▄▀ ▀ ▀▄▄ \n▀▄█████▄▄█▄▄▄ \n █▀ ▄▄ ▀▄█ ▀█ \n ▀▄▄▄▄▄▀▀▄▀▄ \n █▄█▄ ▄▀▀ ▄█▄ \n ▀██████████▀ "], ["sleep_2", " \n ▄▀▄▀▀▀▀█▀ \n █ ▄▄▄▄▄ █▀ \n ▀██▀▀▀▀█▀█▀█▄ \n █ ▀▀ ▄█▀ ▀ \n █▀██▀ ▀▄ \n ▄██▄ ▄▀▀ ▄█▄ \n ▀██████████▀ "], ["walk_1", " ▄▀▄▀▀▀▀█▀ \n █ ▄ █▀ ▄█ \n ▀██▀▀█▀█▀█▀▀ \n█▀▄█ ▀▀ ▄█▀ \n█ ▀█▀▀▀▀ ▀▀▀▄ \n ▀▀▀▀▄ █▄▄ █\n ████████████▀▀\n▄████ ████▄"], ["walk_2", " ▄ ▄▄▄▄▄▄ \n ▄▀ ▀ ▀▄▄ \n ▀▄█████▄▄█▄▄▄ \n▄▄ █▀ ▄█ ▀▄█ ▀█ \n█ ▀█▄▄▄▄▄▀▀▄▄▄ \n▀▄▄▄█ ▀▀ ▄ ▀▄\n ▄▄▄█▄▄▄▄███▄▄█\n▄████▀▀▀▀▀▀████▄"]]], + ["breakdramon", [["angry", "█▀▀▄▄▄▄▄▄▄ █▀▄ \n▄▀▀ ▄▀ ▀▄█ █▀▀▄\n██▀█▀▄ █▄█▀█▀█\n █ █ █▀▄▄█ █ █\n █▀▀▀ ▄▄▀ ▀▄█ █\n ▄█▀▀▀▄█▄▄▄ ▀█▄▀\n█ █▀█ ▄▀ ▄▀▄ \n ▀█▄▄▄█▀▀▀▀█▄▄▄█"], ["attack", " ▄▄ \n▄▄▄▄▄▀▀▀▄█▄ █▀▄ \n▀▄▄▀ ▄█ ▀▄██▀▀▄\n █▄▄▄▄ █ ▀█▀█\n ▀▄▄▄█▄▀█▄▄▄▀ █\n ██▄▄█ ▀▀█ █\n █ ▀▄ ▀█▀▀█ ▄▀▀▄\n█▄▄▄█▀▀▄▄▄▄█▄▄▄█"], ["eat_1", " ▄▄ \n▄▄▄▄▄▀▀▀▄█▄ █▀▄ \n▀▄▄▀ ▄█ ▀▄██▀▀▄\n █▄▄▄▄ █ ▀█▀█\n ▀▄▄▄█▄▀█▄▄▄▀ █\n ██▄▄█ ▀▀█ █\n █ ▀▄ ▀█▀▀█ ▄▀▀▄\n█▄▄▄█▀▀▄▄▄▄█▄▄▄█"], ["eat_2", "█▀▀▄▄▄▄▄▀█ ▄▄ \n █▀ ▄▄ ▀█▀▄█▄█ \n█ ▄▄ ▄ █▀█▄▄█ \n ████▀▀▄▄▀ █ █ \n █▄▄▄▄▀ ▀▀██▄ █ \n ▀█▀█▄▄▄ █▀ \n ▄▀█▄█ █ ▄▀▀█ \n█▄▄▄█▄▄▄▄██▄▄▄█ "], ["happy", " █▀▄▄▄▄▄▄▀█ \n ▀▄▄▀ ▄▀█▀▄ ▄▀█\n █▄▄▄▄▀ ▀ █▀▄▀▀█\n ██████▀▄▀▀▄▀█▀█\n█ █▀▀▀ ▄█ █▀ █\n▀▄▄█▀▀▀ █▄▄▀▀▄█ \n ▀██▀▀ ▄▀▄ \n █▄▄█▀▀▀▀█▄▄▄█"], ["injured_1", " \n \n \n ▄▀▀▀▀▀█▀█ \n▄▄█▄ ▄ █▄▄ \n▀▄▄▀ ▀▀▄▀█ █▀▄\n ██▀▀█▀▄▄▀▄▀▀▄█\n █▄▄██▄▄▄▄██▄▄▄█"], ["injured_2", " \n \n \n ▄▄▄▄▄▄▄▄ \n ▄▀ ▀▄█▄ \n█▀▀█ █▄ ▄█ █▀▄\n ▀█▄▄▄▄▄█▄▀▄▀▀▄█\n █▄▄██▄▄▄▄██▄▄▄█"], ["refuse", " \n ▄▄ █▀▄ \n▄▄▄▄▄▀▀▀▄█▄ █▀▀▄\n▀▄▄▀ ▄▀ ▀▄█▀█▀█\n █▄▄▄▄ █▄▄▀ █\n ▀▄▄▄█▄▀▀ ▀▀█▄▀\n ▄▀█ █▀▀█ ▄▀▄ \n█▄▄▄█▀▀▄▄▄▄█▄▄▄█"], ["sleep_1", " \n ▄▄ \n▄▄▄▄▄▀▀▀▄█▄ ▄▄\n▀▄▄▀ ▄▄ ▀▄█ █▄█\n █▄▄▄▄ █ █▄▄█\n ▄█▄▄▄█▄▄▀▀▄▄█ █\n █▄ ▄▀ █▄▄▄▀▄▄▀\n█▄▄█▄▄▄█▄▄█▄▄▄█ "], ["sleep_2", " \n ▄▄ \n▄▄▄▄▄▀▀▀▄█▄ ▄▄\n▀▄▄▀ ▄▄ ▀▄█ █▄█\n █▄▄▄▄ █ █▄▄█\n ▄█▄▄▄█▄▄▀▀▄▄█ █\n █▄ ▄▀ █▄▄▄▀▄▄▀\n█▄▄█▄▄▄█▄▄█▄▄▄█ "], ["walk_1", " ▄▄▄▀█ ▄▄ \n█▀▀█▀ ▄▀█▀▄█▄█ \n █▀ ▀▀ █▀█▄▄█\n ▀█▀▀▀▄ ▄▄▀ █ █\n █▀▀█▀ ▀▀██▄ █\n ▀█▀█▄▄▄ █▀ \n ▄▀█▄█ █ ▄▀▀█ \n █▄▄▄█▄▄▄▄██▄▄▄█"], ["walk_2", " ▄▄ \n▄▄▄▄▄▀▀▀▄█▄ █▀▄ \n▀▄▄▀ ▄█ ▀▄██▀▀▄\n █▄▄▄▄ █ ▀█▀█\n ▀▄▄▄█▄▀█▄▄▄▀ █\n ██▄▄█ ▀▀█ █\n █ ▀▄ ▀█▀▀█ ▄▀▀▄\n█▄▄▄█▀▀▄▄▄▄█▄▄▄█"]]], + ["bryweludramon", [["angry", "▄▄ ▄▄▄█▀▀█ \n█ █▀ ▄ ▀█ \n█▀ ▀▀ ▄▄█▀▀▄▄ \n▀█▀▀▀▀▀▄█ ▄█▄▄▀▄\n ▀█ █▀▄▀▄ ▀▄▄▀ \n █ █ ▄ █▀██▀▄ \n ▄▀█▄ ▄█▄▀▀▄█▀▄\n █▄██▄█▄▄▀▀▀▄▄▄█"], ["attack", " █▀▄▄▀▄▄▀█ \n ▄█▄█ ▄▀ █▄▄▄ \n █▄█ █▀ █ █▀ \n ▄█ ▄█ ██▄ \n ▀█▀▄ █▀ █ ▄▀ \n ██▀▄ █▀▀▄ \n █▄▀▄▀ █▀▀▄▄█ \n ▀▀ "], ["eat_1", "▄▄ ▄▄▄▄█▀▀█ \n█ █▀ ▄ █▀ \n█▀ ▀ ▀ ▄█▀▀▄▄ \n▀█████▄▀█ ▄█▄▄▀▄\n █▀▀▀▀▀▄█▄ ▀▄▄▀ \n ▀█▄█▀ ▀▄▀█▄▀█ \n ▄▀▄█ ▀ █▄▀▀▄▀▄\n █▄██▄█▄█▄▀▀█▄▄█"], ["eat_2", " \n▄▄ ▄▄▄█▀▀█ \n█ █▀ ▄ ▀█▀▀▄▄ \n█▀ ▀ ▀ █ ▄█▄▄▀▄\n▀█▀▀▀▀▄▄▀▄ ▀▄▄▀ \n █▄█▀ ▀▄▄▀█▄▀█ \n ▄▀▄█ ▀ █▀▄▀▀▄▀▄\n█▄██▄█▄█▄█▀▀█▄▄█"], ["happy", "▄▄ ▄▄▄█▀▀█ \n█ █▀ ▄ ▀█▄▄ \n█▀ ▀ ▀▄█▀ ▄▀▀▄ \n▀█████▀▄█ ▀█▀▀▄▀\n █▀▀▀▄▀▄ ▀▄▄█▀ \n █▀█ ▄ █▀▄▄▀█▄ \n ▄▀█▄ ▄▀▄▀▀▄█ █\n █▄██▄█▄▄▀▀█▄▄▄█"], ["injured_1", "▄▄ ▄▄▄█▀▀█ \n█ █▀▄ ▀█ \n█▀ ▀▀ ▄█▀▀▄▄ \n▀█▀▀▀▀▀██ ▄█▄▄▀▄\n ▀█▄▄▀▄▀▄ ▀▄▄▀ \n █ █ ▄ █▄▀▀█▄ \n ▄▀█▄ ▄█ ██ █▀▄\n █▄██▄█▄▄█▄▄██▄█"], ["injured_2", " \n▄▄ ▄▄▄▄▀▀█ \n█ █▀▄ ▀██▀▀▄▄ \n█▀ ▀▀ █ ▄█▄▄▀▄\n▀█▀▀▀█▀█▀▄ ▀▄▄▀ \n █▀█ ▄ █▄▀▀█▄ \n ▄██▄ ▄█ ██ █▀▄\n █▄█▄▄█▄██▄▄██▄█"], ["sleep_1", " \n ▄▄▄▄ \n█▀▄▄▀▀▀▀▄▄█▄ \n█▄▀ ▄▄ █▀ ▄▀▀▄ \n█▄▄▄▄▄▄██ ▀█▀▀▄▀\n ▀▄▄▄▄█ █▄▄█▀ \n █▄▀ ▄ ▀█ ██ █▀▄\n█▄▄█▄▄▄███▄▄██▄█"], ["sleep_2", " \n▄▄ ▄▄▄█▀▀█ \n█ █▀ ██▀▀▄▄ \n█▀ ▀▀ ▄█ ▄█▄▄▀▄\n▀████▀▀▄▀▄ ▀▄▄▀ \n ▀▄▄▄▄█ ▄▀▀█▄ \n █▄▀ ▄ ▀█ ██ █▀▄\n█▄▄█▄▄▄███▄▄██▄█"], ["walk_1", "▄▄ ▄▄▄█▀▀█ \n█ █▀ ▄▄ ▀█▄▄ \n█▀ ▀▀ ▄█▀ ▄▀▀▄ \n▀█▀▀▀▀▀▄█ ▀█▀▀▄▀\n ▀█ █▀▄ ▀▄▄█▀ \n █ █ ▄ █▀▄▄▀█▄ \n ▄▀█▄ ▄▀▄▀▀▄█ █\n █▄██▄█▄▄▀▀█▄▄▄█"], ["walk_2", " ▄▄▄▄ \n█▀▄▄▀▀▀▀█▄▄█ \n█▄▀ ▄█▀ ▄▀ ▄▀▀▄ \n█▄▄▄▄▄▄▀█ ▀█▀▀▄▀\n ▀▄▄ ▄▄▀ ▀▄▄██ \n ▀█▀ ▀▄▄▀▄▄▀█ \n ▄█ ▀ ██▄▀▀▄▀█\n ██▄█▄█ ▀▀█▄▄█"]]], + ["budmon", [["angry", " \n \n ▄▀█ ▄▄▄\n ▄▄ ▄▀ █▄ ▄▀ █\n █ ▀ ▀ ██ ▄▀ █\n█▀█ ▄█▀ █ ▄▀ \n▀▄ ▄▄ ▄▀▀▀ \n ▀▄▄▄▀▀▀ "], ["attack", " ▄▀█ \n ▄▄ ▄▀ █▄ \n █ ▀ ▀ ██▄▀▀▀█\n█▀▄ ▄█▀ █ ▄▀ █\n▀▄ ▄▄ ▄██▄▄▀ \n ▀██ █▀▀ \n ▀ \n "], ["eat_1", " \n ▄▄ \n ▄▀ █ \n █▀▄▀ ▄▀█▄ \n▄█ ▄▄ ▀█ ▄▀▀█\n█ ▀ ▀ █▀ ▄ █\n ▀▄██ ▄▄▄▀█▄▀ ▄▀\n ▀▀▀ ▀▀▀ "], ["eat_2", " \n \n ▄▄ \n ▄▀ █ \n █▀▄▀ ▄▀█▄ \n▄█ ▄▄ ▀█▄▄▄ \n█ ▀ ▀ █▄▄▄▀▄\n ▀▄▄▄▄▄▄▄▀▄▄▄▄▀ "], ["happy", " ▄▀▄▄▄▄▄▄▄ \n ▄█▀▀▀▀ ▄▀ \n █ ▀ ▄▄ ▀▀▀▄ \n ▀█▄▄▄ ▀ █ \n ▀██ ▄██ \n ▀▄▄▀█▀▄▀█ \n ▄▀ ▄▀ █ \n █▄▄▄▄▀ "], ["injured_1", " \n \n \n ▄▄▀▀▄ \n █▀▄▀ ▄▀█▄ \n▄█▄ ▄ ▀█▄▄▄▄ \n█▀ ▀▀ █▄▄ █\n ▀▄█▄▄▄▄▄█▄▄▄▄▀ "], ["injured_2", " \n \n ▄▄▄ \n ▄▄ ▄▀▀ ▄█ \n █ ▀ ▀ █▄ \n█▄▀ ▀▄▄ ▀▄▄▄ \n█ ▄▄ █▄▄ ▀▄\n ▀▄██▄▄▄▄▀▄▄▄█▄▀"], ["sleep_1", " \n \n ▄▄ \n ▄▀ █ \n █▀▄▀ ▄▀█▄ \n ▄█ █▀▀▀▄ \n █▄▄ ▄▄█ ▀▄ █ \n ▀▄▄▄▄▄▄█▄▄█▀ "], ["sleep_2", " \n \n \n ▄▄▀▀▄ \n █▀▄▀ █ █▄ \n ▄▀ ▄▀▀▀▄ \n █▄▄ ▄▄█ ▄▀ █ \n ▀▀▄▄▄▄▄█▄▄▄▀ "], ["walk_1", " \n \n ▄▄ \n ▄▀ █ ▄▄▄▄\n █▀▄▀ ▄▀█▄▀ ▄ █\n▄█ ▄▄ ▀█▄▀ ▄▀\n█ ▀ ▀ █▀▀▀ \n ▀▄▄▄▄▄▄▄▀ "], ["walk_2", " ▄▀█ \n ▄▄ ▄▀ █▄ \n █ ▀ ▀ ██ \n█▀▄ ▄▀▀ █ \n▀▄ ▄█▄ \n ▀▀▀▀▀▀▀█▄ ▀▄ \n █ ▀▄ █ \n ▀▄▄▄█ "]]], + ["bukamon", [["angry", "▀ ▄▀█ \n ▀ ▄▄▀▀ ▄▀▀▄ \n █▄▄▄▄▀▀ █ \n ▀ ▀ ▀▄ █ \n █▄█▄▄█ ▄▀ \n ▀▄▄▄▄▄ █ █▄ \n █▀▄ ▀▀▀▄▀▀\n ▀▄█▄▄▄▀ "], ["attack", " ▀ \n▄ ▄▀█ \n ▄▀▀ ▀▀▄ \n ▀ █ █ █ ▀▄ \n █ █ \n ▀▀▀█▀█▀ █ ▄ \n █▄▀▄ ▀▄▄▀█▄ \n ▀▄█▄█▄▄▄▀ "], ["eat_1", " ▀ \n▄ ▄▀█ \n ▄▀▀ ▀▀▄ \n ▀ █ █ █ ▀▄ \n █ █ \n ▀▀▀█▀█▀ █ ▄ \n █▄▀▄ ▀▄▄▀█▄ \n ▀▄█▄█▄▄▄▀ "], ["eat_2", " ▄▀▀▀▀▄▄ \n ▀▀▄ ▄▄▀▄ \n ▀▄ ▀ ▀▄ \n ▄▄▄▄█ █▀▀ \n ▀▄▄▄▄▄ ▄▀ \n █▄▀ █ \n ▀▄▀▄ ▀▄ █▄ \n ▀▄█▄▄█▄▀▀ "], ["happy", " ▀ ▄▀█ \n▀ ▄▀▀▄ ▀▀▄ \n▄ ▄▀ ▀ ▀ ▀▄ \n ▀▀▀▀█████ █ \n ▀ ▄▄██▄▄▄▀ █ \n ▀▄▄▄▄▄ ▄▀ █▄ \n █▀▄ ▀▀▀▄▀▀\n ▀▄█▄▄▄▀ "], ["injured_1", "▀ \n▄ ▄▄ \n ▄▀ █▄ \n▀ ▄▀ █ \n ▄▀ █▄ ▀▄ \n █▄▄▄▄▄▄ ▄▀ █▄ \n █▀▄ ▀▀▄▀▀ \n ▀▄█▄▄▄▀ "], ["injured_2", " \n ▄▄ \n ▄▀ █▄ \n ▄▀ █ \n ▄▀ ▀▄▄ ▀▄ \n █▄▄▄▄▄▄ ▄▀ \n █▀▄ ▀▀▄▄▄ \n ▀▄█▄▄▄▀█▀ "], ["refuse", " \n ▄▀█ \n ▄▀ ▀▀▄ \n █ ▀█ ▀▄ \n █ █ \n ▀▀▀█▀█▀ █ ▄ \n █▄▀▄ ▀▄▄▀█▄ \n ▀▄█▄█▄▄▄▀ "], ["sleep_1", " ▀ \n▀ ▄▀█ \n ▄ ▄▀▀ ▀▀▄ \n █▄ ▄▄ ▀▄ \n █ █ \n ▀▀▀█▀█▀ █ ▄ \n █▄▀▄ ▀▄▄▀█▄ \n ▀▄█▄█▄▄▄▀ "], ["sleep_2", " ▀ \n▀ ▄▀█ \n ▄ ▄▀▀ ▀▀▄ \n █▄ ▄▄ ▀▄ \n █ █ \n ▀▀▀█▀█▀ █ ▄ \n █▄▀▄ ▀▄▄▀█▄ \n ▀▄█▄█▄▄▄▀ "], ["walk_1", " ▀ ▄▀█ \n▀ ▄▀▀ ▀▀▄ \n ▀ █ ▄ ▄ ▀▄ \n █ ▀ ▀ █ \n ▀▀▀█▀█▀ █ █▄ \n █▀▄ ▀▀▀▄▀▀\n ▀▄█▄▄▄▀ \n ▄▄▄▄▄▄▄ "], ["walk_2", " ▀ \n▄ ▄▀█ \n ▄▀▀ ▀▀▄ \n ▀ █ █ █ ▀▄ \n █ █ \n ▀▀▀█▀█▀ █ ▄ \n █▄▀▄ ▀▄▄▀█▄ \n ▀▄█▄█▄▄▄▀ "]]], + ["bulbmon", [["angry", " \n \n \n ▄ ▀ \n ▄▄▄▄▄▄▄▄ \n █▄▄ ▄▄█ \n ▀▄ ██ ▄▀ \n ▀▄██▄▀ "], ["attack", " \n \n \n \n ▄ \n ▄▀▀▀▄ ▀ \n █ ▀ ▀ █ \n ▀▄▄▄█▄▄▄▀ "], ["eat_1", " \n \n \n \n ▄▀▀▀▄ ▀ \n █ ▄ █ ▄ \n ▀▄▄▄▄█ █ \n ▀▄▄▄▄▄▄▄▀ "], ["eat_2", " \n \n \n ▄▄▄ ▀ \n ▄▀ ▄ ▀▄ \n ▀▀▄ █ ▀ \n ▄▄▄▄█ █ \n ▀▄▄▄▄▄▄▄▀ "], ["happy", " \n \n ▄▄▄▄ \n ▄▀▄ ▄ ▀▄ \n █ ▄ █ \n ▀▄ ▀ ▄▀ \n ▀ ▀▀▀▀ ▄ \n ▄▄▄ "], ["injured_1", " \n \n \n \n \n ▄▄▄▄▄ \n ▄▀ ▀▄ \n ▀ ▀▄██▄██▄▀ ▄ "], ["injured_2", " \n \n \n \n \n \n ▄▀▀▀▀▀▄ \n ▄█▄██▄██▄█▄ "], ["refuse", " \n \n \n \n ▄▄▄ \n ▄▀▄▄ ▀▄ \n █▄▄▄ █ ▀ \n ▀▄▄▄▄▄▄▀ "], ["sleep_1", " \n \n \n ▄ \n ▀ \n ▄▄▄▄▄ \n ▄▀▄▄ ▄▄▀▄ \n ▀▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n \n \n ▀ \n ▄▀▀▀▀▀▄ ▀ \n █ ▀▀ ▀▀ █ \n █ ▀ █ \n ▀▄▄▄▄▄▀ "], ["walk_1", " \n \n \n \n ▄ \n ▄▀▀▀▄ ▀ \n █ ▀ ▀ █ \n ▀▄▄▄█▄▄▄▀ "], ["walk_2", " \n \n \n \n ▀ \n ▄ ▄▀▀▀▄ \n █ ▄ ▄ █ \n ▀▄▄▄▄▄▄▄▀ "]]], + ["bulkmon", [["angry", "▄ ▄▄▄ ▄▄▄▄ \n██▄ ▄█████▀ ▄▄▀ \n ▀███▀ ██▄ █▄▄ \n ████▀█▀ ▄▀ \n ▀▄▄▄▄▀▀ ▀▀▄ \n ▄▄█ ▄▀██▄ █\n █ ██▄ ▀▄▄██▄█\n ████▄█▀▀█▄█▄█▄█"], ["attack", " ▄ ▄▄▄ ▄▄▄▄\n ██▄ ▄█████▀ ▄▄▀\n ▀███▀ ▄█▄ █▄▄ \n ████▀█▀▄ ▄▀ \n ▄▄▄▄ ▄ ▄█ ▀▀▄\n█ ▀██▀▀▀▀ ▄▀██▄█\n ▀██▄▀█▀▀ █▄▄██▄\n █▄█▄▄█▀▀█▄█▄█▄█"], ["eat_1", "▄ ▄▄▄ ▄▄▄▄ \n██▄ ▄█████▀ ▄▄▀ \n ▀██▀▄▀██▄ █▄▄ \n ████▀█▀▄ ▄▀ \n ▄ ▄ ▄█ ▀▀▄ \n ▀█▀▀▀▀ ▄▀██▄ █\n █ ██▀▀ ▀▄▄██▄█\n ████▄█▀▀█▄█▄█▄█"], ["eat_2", "▄ ▄▄▄ ▄▄▄▄ \n██▄ ▄█████▀ ▄▄▀ \n ▀██▀▄▀██▄ █▄▄ \n ████▀█▀ ▄▀ \n ▀▄▄▄▄▀▀ ▀▀▄ \n ▄▄█ ▄▀██▄ █\n █ ██▄ ▀▄▄██▄█\n ████▄█▀▀█▄█▄█▄█"], ["happy", "█▄ ▄▄███▄▀▀▀█ \n▀██▄█▀███▀ ▄▀▀ \n ▄██▄█▄█▀▀ ▀█▀ \n ▀▀▀▀ ▀ █ ▄▀▀█▄ \n ▄█▄█▄█▀ ▀▄██▀█\n █▀█▄▄▄ ▀ ▄▄▄▀\n ▀▄▄█▄ ▀▄ \n █▄█▄▄█▀▀█▄█▄█▄█"], ["injured_1", "▄ ▄▄▄ ▄▄▄▄ \n██▄ ▄█████▀ ▄▄▀ \n ▀███ ▀██▄ █▄▄ \n ████▀█▀ ▄▀ \n ▀▄▄▄▄▀▀ ▀▀▄ \n ▄▄█ ▄▀██▄ █\n █ ██▄ ▀▄▄██▄█\n ████▄█▀▀█▄█▄█▄█"], ["injured_2", " \n█▄ ▄▄███▄▀▀▀█ \n▀██▄█▀███▀ ▄▀▀ \n ▄███▄▄█▀▀ ▀█▀ \n ▀█▀▀ ▀▄▄ ▀▄▄ \n ███▀ ▄▄▄ ▀▄\n █ ██ █ ▀██ █\n███████▄▄▄██████"], ["sleep_1", " \n█▄ ▄▄███▄▀▀▀█ \n▀██▄█████▀ ▄▀▀ \n ▄███▄▄█▀▀ ▀█▀ \n ▀█▀▀ ▀▄▄ ▀▄▄ \n ███▀ ▄▄▄ ▀▄\n █ ██ █ ▀██ █\n███████▄▄▄██████"], ["sleep_2", "▄ ▄▄▄ ▄▄▄▄ \n██▄ ▄█████▀ ▄▄▀ \n ▀███▀▀██▄ █▄▄ \n ████▀█▀ ▄▀ \n ▀▄▄▄▄▀▀ ▀▀▄ \n ▄▄█ ▄▀██▄ █\n █ ██▄ ▀▄▄██▄█\n ████▄█▀▀█▄█▄█▄█"], ["walk_1", "█▄ ▄▄███▄▀▀▀█ \n▀██▄██▀▀█▀ ▄▀▀ \n ▄███▄▄█▀▀ ▀█▀ \n ▀█▀▀ ▀▄▄ ▀▄▄ \n ▀▀█▀ ▄▄▄ ▀▄\n ▄▀██ █ ▀██ █\n █▄█▀▄ ▀▀▀▀█▀\n █▄█▄▄█▀▀█▄█▄█▄█"], ["walk_2", "▄ ▄▄▄ ▄▄▄▄ \n██▄ ▄█████▀ ▄▄▀ \n ▀███▀ ▄█▄ █▄▄ \n ████▀█▀ ▄▀ \n ▀▄▄▄▄▀▀ ▀▀▄ \n ▄▄█ ▄▀██▄ █\n █ ██▄ ▀▄▄██▄█\n ████▄█▀▀█▄█▄█▄█"]]], + ["bulucomon", [["angry", " ▄▀▀█▄▀▀█ \n ▄▀ ▄▀ ▄▀▀█ \n █ ▄█▀ ▄▀▄ \n█ ▄ ▄ ▄▄▀ ▄▄█ \n▀█▀ ▀ ▀▄▀▄█▀ █▀█\n ▀█▀▀▀ ▄█ ▄▀ █\n ▄▄▀█████▀▀▀▄▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["attack", " ▄▀▀█▄▀▀█ \n ▄▀ ▄▀ ▄▀▀█ \n █ ▄█▀ ▄▀▄ \n█ ▄ ▄ ▄▄▀ ▄▄█ \n▀█▀ ▀ ▀▄▀▄█▀ █▀█\n ▀█▀▀▀ ▄█ ▄▀ █\n ▄▄▀█████▀▀▀▄▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["eat_1", " ▄▀▀█▄▀▀█ \n ▄▀ ▄▀ ▄▀▀█ \n █ ▄█▀ ▄▀▄ \n█ ▄ ▄ ▄▄▀ ▄▄█ \n▀█▀ ▀ ▀▄▀▄█▀ █▀█\n ▀█▀▀▀ ▄█ ▄▀ █\n ▄▄▀█████▀▀▀▄▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["eat_2", " ▄▀▀█▄▀▀█ \n ▄▀ ▄▀ ▄▀▀█ \n █ ▄█▀ ▄▀▄ \n█ ▄ ▄ ▄▄▀ ▄▄█ \n▀█▀ ▀ ▀▄▀▄█▀ █▀█\n ▀█▀▀▀ ▄█ ▄▀ █\n ▄▄▀█████▀▀▀▄▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["happy", " ▄▀▀█▄▀▀█ \n ▄▀ ▄▀ ▄▀▀█ \n █ ▄█▀ ▄▀▄ \n█ ▄ ▄ ▄▄▀ ▄▄█ \n▀█▀ ▀ ▀▄▀▄█▀ █▀█\n ▀█▀▀▀ ▄█ ▄▀ █\n ▄▄▀█████▀▀▀▄▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["injured_1", " ▄▀▀█▄▀▀█ \n ▄▀ ▄▀ ▄▀▀█ \n █ ▄█▀ ▄▀▄ \n█ ▄ ▄ ▄▄▀ ▄▄█ \n▀█▀ ▀ ▀▄▀▄█▀ █▀█\n ▀█▀▀▀ ▄█ ▄▀ █\n ▄▄▀█████▀▀▀▄▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["injured_2", " ▄▀▀█▄▀▀█ \n ▄▀ ▄▀ ▄▀▀█ \n █ ▄█▀ ▄▀▄ \n█ ▄ ▄ ▄▄▀ ▄▄█ \n▀█▀ ▀ ▀▄▀▄█▀ █▀█\n ▀█▀▀▀ ▄█ ▄▀ █\n ▄▄▀█████▀▀▀▄▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["refuse", " ▄▀▀█▄▀▀█ \n ▄▀ ▄▀ ▄▀▀█ \n █ ▄█▀ ▄▀▄ \n█ ▄ ▄ ▄▄▀ ▄▄█ \n▀█▀ ▀ ▀▄▀▄█▀ █▀█\n ▀█▀▀▀ ▄█ ▄▀ █\n ▄▄▀█████▀▀▀▄▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["sleep_1", " ▄▀▀█▄▀▀█ \n ▄▀ ▄▀ ▄▀▀█ \n █ ▄█▀ ▄▀▄ \n█ ▄ ▄ ▄▄▀ ▄▄█ \n▀█▀ ▀ ▀▄▀▄█▀ █▀█\n ▀█▀▀▀ ▄█ ▄▀ █\n ▄▄▀█████▀▀▀▄▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["sleep_2", " ▄▀▀█▄▀▀█ \n ▄▀ ▄▀ ▄▀▀█ \n █ ▄█▀ ▄▀▄ \n█ ▄ ▄ ▄▄▀ ▄▄█ \n▀█▀ ▀ ▀▄▀▄█▀ █▀█\n ▀█▀▀▀ ▄█ ▄▀ █\n ▄▄▀█████▀▀▀▄▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["walk_1", " ▄▀▀█▄▀▀█ \n ▄▀ ▄▀ ▄▀▀█ \n █ ▄█▀ ▄▀▄ \n█ ▄ ▄ ▄▄▀ ▄▄█ \n▀█▀ ▀ ▀▄▀▄█▀ █▀█\n ▀█▀▀▀ ▄█ ▄▀ █\n ▄▄▀█████▀▀▀▄▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["walk_2", " ▄▄▀▀▀█▄▄ \n▄▄▄▀▀ ▄▄▀▀ ▄▀ \n█ ▀▀ ▀█▀▀▄ \n▀▄██▄█▄▄█▀ ▄█ \n ▄██▀▀▄▀ ▄▀▀ █ \n ▀▄▄▄▀▀ ▄██▄▄█▄ \n ▄▄▀██████▀▀▀▀█▄\n█▄█▄▄█▀ ▀█▄█▄█▄█"]]], + ["burninggreymon", [["angry", "█▀▄ ▄▄▄▄▀▀▀█ \n█ █▀ ▄ ▀█▀ ▄▀▄ \n█▀ ▀▀ ▄▄█▀ ▄ █\n ▀▄████▀████▀█ █\n █▀▀▀▀▄██▄▄▀▄ █\n ▄▀▄██▀▄██▀ █▄█\n ▀▄█▄██▄██▄▄█▄ ▀\n █▄██▄█ █▄██▄█ "], ["attack", "▄▄ ▄▄▄▄ \n█ █▄▀▀▀▀▄▄▄▀ ▄ \n█▄▀ ▄▀█▀ ▀▄▄▀ ▀▄\n▀▄ ▄▄▄▄▄███▄▄█ █\n █ ▄▄▄▀██▀▀▄▀ █\n ▄▀██▄▀███▀ █ █\n █ ▄██▄▀██ ▄███\n█▄██▄█▀▀▀▀████▄█"], ["eat_1", "▄▄ ▄▄▄▄ \n█ █▄▀▀▀▀▄▄▄▀ ▄ \n█▄▀ ▄▀▄ ▀▄▄▀ ▀▄\n▀▄ ▄▄▄▄▄███▄▄█ █\n █ ▄▄▄▀██▀▀▄▀ █\n ▄▀██▄▀███▀ █ █\n █ ▄██▄▀██ ▄███\n█▄██▄█▀▀▀▀████▄█"], ["eat_2", "█▀▄ ▄▄▄▄▀▀▀█ \n█ █▀ ▄▄▄▀█▀ ▄▀▄ \n█▀ ▀ ▀ ▄▄█▀ ▄ █\n ▀▄████▀████▀█ █\n █▀▀▀▀▄██▄▄▀▄ █\n ▄▀▄██▀▄██▀ █▄█\n ▀▄█▄██▄██▄▄█▄ ▀\n █▄██▄█ █▄██▄█ "], ["happy", "█▀▄ ▄▄▄▄▀▀▀█ \n█ █▀ ▄ ▀█▀ ▄▀▄ \n█▀ ▀ ▀ ▄▄█▀ ▄ █\n ▀▄████▀████▀█ █\n █▀▀▀▄███▄▄▀▄ █\n ▄▀▄██▀▄██▀ █▄█\n ▀▄█▄██▄██▄▄█▄ ▀\n █▄██▄█ █▄██▄█ "], ["injured_1", " \n▄▄ ▄▄▄▄ \n█ █▄▀▀▀▀▄▄▄▀ ▄ \n█▄▀ ▄▄ ▀▄▄▀ ▀▄\n▀▄ ▄▄▄▄▄███▄▄█ █\n █ ▄▄▄▀██▀▀▄▀ █\n▄▀█▀██▄▀██▀█▀▄ █\n█▄▄▄██▄███▄▄▄█▀ "], ["injured_2", " \n \n█▀▄ ▄▄▄▄▀▀▀█ \n█ █▀ ▀█▀ ▄▀▄ \n█▀ ▀▀ ▄▄█▀ █ █\n ▀▄▀▀▀█▀████▀█ █\n▄▀█▀██▄▀██▀█▀▄ █\n█▄▄▄██▄███▄▄▄█▄▀"], ["refuse", "▄▄ ▄▄▄▄ \n█ █▄▀▀▀▀▄▄▄▀ ▄ \n█▄▀ ▄█ ▀▄▄▀ ▀▄\n▀▄ ▄▄▄▄▄███▄▄█ █\n █ ▄▄▄▀███▀ █ █\n █ ▀██▄▀█ ▄█ █\n ▄████▄▀█████▄▄▀\n█▄██▄█▀▀▀▀██▄█▄█"], ["sleep_1", " \n█▀▄ ▄▄▄▄▀▀▀█ \n█ █▀ ▀█▀ ▄▀▄ \n█▀ ▀▀ ▄▄█▀ ▄ █\n ▀▄▀▀▀▀█████▀█ █\n ▀▄██▀▄██▄▄▀▄ █\n ▄▀ ██▀▄██▀ █▄▀\n█▄██▄██▄██▄▄██▄█"], ["sleep_2", " \n▄▄ ▄▄▄▄ \n█ █▄▀▀▀▀▄▄▄▀ ▄ \n█▄▀ ▄▄ ▀▄▄▀ ▀▄\n▀▄ ▄▄▄▄▄███▄▄█ █\n █ ▄▄▄▀██▀▀▄▀ █\n ▄▀██▄▀███▀ █ █\n▄█▄▄██▄███▄▄▄██▄"], ["walk_1", "█▀▄ ▄▄▄▄▀▀▀█ \n█ █▀ ▄▄▄▀█▀ ▄▀▄ \n█▀ ▀ ▀ ▄▄█▀ ▄ █\n ▀▄▀▀▀▀█████▀█ █\n ▀▄██▀▄██▄▄▀▄ █\n ▄▀ ██▀▄██▀ █▄█\n ▀▄█▄██▄██▄▄█▄ ▀\n █▄██▄█ █▄██▄█ "], ["walk_2", "▄▄ ▄▄▄▄ \n█ █▄▀▀▀▀▄▄▄▀ ▄ \n█▄▀ ▄▀█▀ ▀▄▄▀ ▀▄\n▀▄ ▄▄▄▄▄███▄▄█ █\n █ ▄▄▄▀██▀▀▄▀ █\n ▄▀██▄▀███▀ █ █\n █ ▄██▄▀██ ▄███\n█▄██▄█▀▀▀▀████▄█"]]], + ["bushiagumon", [["angry", " ▄▄▄▄ \n ▄▄▄▄███▄ \n ▄▄▄▀ ▄ ▀█ \n█ ▄█▀ █ \n▀▄▄▄▄▄▄ ▄█ \n ▀▄▄▄▄▄██▄ ▄ █▄▄\n █▄█▄▄▄██▄▄█▄▀\n █▄█▄███▄█▄█▄█ "], ["attack", "▄▀█ ▄▄▄▄▄▄██ \n█▄▀▀▀ ▄▄▀█▄▄▄\n█▀▄▄▄▄▄ ██ ██ █\n▀▄ ███▀█ ██ █\n █▀█▀▀▀ ▄▄ ▀ █ █\n ▀██▀▀▀ █ ▀▀\n ▄▄▀▀▄▄▄▄▄ ▀▀▄ \n █▄█▄▄█▀▀█▄█▄█▄█"], ["eat_1", " ▄▄▄▄███▄ \n▄▀▀▀▀ ▄▄ ▀█ \n█▄▄▄▄▄ ▄██ █ \n ▀████ █ \n █▀▀▀▀ ▄▄ ▄▀ \n ▀█▀▀██▄██ █▄▄▄\n ▄█▄█▄▄█▄▄█▄▄▄▀\n █▄█▄▄█▀█▄█▄█▄█ "], ["eat_2", " ▄▄▄▄ \n ▄▄▄▄███▄ \n ▄▄▄▀ ▄ ▀█ \n█ ▀ ▀ █ \n▀▄▄▄▄▄▀ █ \n █▄▄▄▄▄██▄ ▀▄▄▄▄\n ▀▄▄▄█▄▄█▄▄▄█▄▄▀\n █▄█▄▄██▄█▄█▄█ "], ["happy", " ▄▀█ ▄▄▄▄▄██▄ \n▄▀▀▀▀ ▄ ▀█ \n█▄▄▄▄▄▄ ▀ ▀ ██▀█\n ██████ ██ █\n █▀▀▀▀ ▄ ▀ █ █\n ██▀█▀▀▀ ▄▀▀▄█\n ██▀▀▄▄▄▄ ▀▀▄ \n █▄█▄▄█ █▄█▄█▄█ "], ["injured_1", " ▄▄▄▄ \n ▄▄▄███▄ \n ▄▄▄▀ ▀█ █▀█\n█ ▀▄▄ █ █▄█\n▀▄▄▄▄▄ █▄█▄█\n ▀▄▄▄▄▄ ▀▀ ▄██\n █▄█ ▄ ▀██ █\n █▄█▄█▄▄█▄█▄██▄█"], ["injured_2", " \n ▀▀██▄ \n ▄▀▀▀▀▀██ █▀█\n▄▀▀▀ ▄ █ █▄█\n█ ▀▀ █ █ █\n █▀▀▀▀ ▄█▀▀██\n █▀█▀▀ ▄ ▄▄█▀█\n █▄█▄█▄▄█▄█▄██▄█"], ["sleep_1", " \n ▄▄▄ \n▄▄ ▄▀█ █ \n█▄█▄▄▄█ █ ▀▄ \n█▄█▀ █ █ █ \n█▄▀▄ █ ▄ █▄\n█▄ ▄ █ ██\n█▄████▄▄█▄▄▄▄██▀"], ["sleep_2", " \n ▄▄▄ \n▄▄ █▀█ ▄█ █ \n█▄██▀█ ████ █ \n█▄█ █ ▀██▀ █ \n█▄▀▄ █ ▄ █▄\n█▄ ▄ ▄ █ ██\n█▄█████▄▄█▄▄▄██▀"], ["walk_1", " ▀▀██▄ \n ▄▀▀▀▀▀▀██ \n▄▀▀▀ ▀█▄ █ \n█ ▄▄ ▀▀▀ █ \n █▀▀▀ ▄▄ ▄▀ \n █▀▀██▄██ █▄▄▄\n ▄█▄█▄▄█▄▄█▄▄▄▀\n █▄█▄▄█▀█▄█▄█▄█ "], ["walk_2", " ▄▄▄▄ \n ▄▄▄▄███▄ \n ▄▄▄▀ ▄▄ ▀█ \n█ ▄██ █ \n▀▄▄▄▄▀▀ █ \n █▄▄▄▄▄██▄ ▀▄▄▄ \n ▀▄▄█▄▄▄█▄▄▄█▄█ \n █▄█▄█▀▀▀█▄█▄█▄█"]]], + ["candlemon", [["angry", " ▄▄▄▄▄▄ \n ▄▀ ▄▄ ▄▀ ▀\n █ ██ ▄▀ ▀ \n ▄█▄▄▄▄█▄ \n █ ▄ █ \n ▀▄ ▀ ▀▄▀ \n ▄█▀▀ ▄█▄ \n █▄▄█▄▄▄█▄▄▄█ "], ["attack", " ▄▀▀▀▀▀▀█▀ \n █ ▄██▀ ▀▄ ▀ \n ▀▄▀▀▀ ▄▀ \n ▄▀▀▀▀▀▀▀▄ \n █ ▄█ █ \n ▀██▄ █ \n ▄▄███ ▄█▄ \n █▄█▄▄▄█▄▄▄█ "], ["eat_1", " ▄▀▀▀▀▀█ \n █ ▄█▀ ▀▄ \n ▀▄▀▀ ▄▀ \n ▄▀▀▀▀▀▀▀▄ \n ▀▄▄▄▄▀▀ █ \n ████ █ \n ▄█▀▀▀ ▄█▄ \n █▄▄█▄▄▄█▄▄▄█ "], ["eat_2", " ▄▄▀▄▄█ \n ▄▀ ▄▄ █ \n █ ██ █ \n ▄█▄▄▄▄█▄ \n █ ▄ ▄ █ \n ▀▄▀ ▀ ▀▄▀ \n ▄█▀▀▀▀ ▄█▄ \n █▄▄█▄▄▄█▄▄▄█ "], ["happy", " ▀ ▄▄▄▀▀▀█ ▀ \n▀ █▀ ▄██ ▀█ ▀ \n ▄ ▀▄ ▀▀ ▄▀ ▀ \n ▄▀▀▀▀▀▀▀▀▄ ▀ \n ▀▄ ▄▀▄ █ \n ▀██▄ █ \n ▄▄██▀ █▄▄ \n █▄█▄▄▄▄█▄▄▄█ "], ["injured_1", " ▄ ▄ ▀ \n ▄▀▀ █ \n █ █ █ \n ▀▄ ▄▀ \n ▄▀▀▀▀▀▀▀▀▄ \n █ ▄█ █▄ █ \n ▄█ ▄▄ █▄ \n █▄▄█▄██▄█▄▄█ "], ["injured_2", " \n ▄ ▀▄ \n ▀▄ ▀ \n ▀▄ \n ▄▄▄▄█▄▄▄ \n █ ▄ ▄ █ \n ▄█▄▀▀ ▀▀▄█▄ \n █▄▄█▄▄██▄▄█▄▄█ "], ["sleep_1", " ▄ \n ▄▀▀ █ \n █ █▄ █ \n ▀▄ ▀▀▄▀ \n ▄▀▀▀▀▀▀▀▀▄ \n █ ▄▄ ▄▄ █ \n ▄█ ▄▄ █▄ \n █▄▄█▄▄▄▄█▄▄█ "], ["sleep_2", " ▄▀▄▄ \n ▄█ ▄ █▄ \n █ ██ █ \n ▀▄ ▀▀ ▄▀ \n ▄▀▀▀▀▀▀▀▀▄ \n █ ▀▀ ▀▀ █ \n ▄█ ██ █▄ \n █▄▄█▄▄▄▄█▄▄█ "], ["walk_1", " ▄▄▄▄▄▄█ \n ▄▀ ▄▄ ▄▀ \n █ ██ ▄▀ \n ▄█▄▄▄▄█▄ \n █ ▄ ▄ █ \n ▀▄▀ ▀ ▀▄▀ \n ▄█ ▀▀ ▄█▄ \n █▄▄█▄▄▄█▄▄▄█ "], ["walk_2", " ▄▄▄▄▄▄▄ \n ▄▀ ▄▄ ▄▀ ▄ \n █ ██ ▄▀ \n ▄▄█▄▄▄█▄ \n █ ▄ ▄ █ \n ▀▄▀ ▀ ▀▄▀ \n ▄█ ▀ ▄▀▀▀▄ \n █▄█▄▄▄▄███▀▀ "]]], + ["cannonbeemon", [["angry", " ▄▄ ▄▄ \n█▀▀▄▄▀▀▀▄▄▀▀█ \n ▀█ ▀▄▀ ▀█ ▀▄ \n ▄▀▀▀ ▀▀█▀ ▀▄▀ \n █ ▄█ █▄▀▀▀█\n ▀▄▄ ▄▄▀▄▀▀▀▄▀\n █▀█▀▀▀ █ ▀ █ \n ▀▄█▄▄▄▀▀ ▀▀▀ "], ["attack", " ▄▄█▀▀▄▄▄▀▀▄▄▄ \n ▀▄▄▀▀▄ ▄▀▀▄▄▀▄ \n ▀▄▄▄▀▄▄▄▄▀▄ █\n ▄▀ ▄▀▄ ▀▄ ▄█▄\n ▀▄ ██▀ █▀▄▄▀\n ▀▀▄▄██▀▀▀▄ \n█▀█▀▀▀ █ ▀ █ \n▀▄█▄▄▄▄█▀ ▀▀▀ "], ["eat_1", "▄▄▄▀▀▄▄▄▀▀▄▄▄ \n▀▄▄▀▀▄ ▄▀▀▄▄▀▄ \n ▀▄▄▄▀▄▄▄▄▀▄ █ \n ▄▀ ▄▀▄ ▀▄ ▄█▄▄\n█▄█▀█▄▄ █▀ ▄▀\n ▀▀ ▀▀ ▀█▄▄▀▀▀▄ \n █▀█▀▀▀ █ ▀ █ \n ▀▄█▄▄▄▀▀ ▀▀▀ "], ["eat_2", "▄▄▄▀▀▄▄▄▀▀▄▄▄ \n▀▄▄▀▀▄ ▄▀▀▄▄▀▄ \n ▀▄▄▄▀▄▄▄▄▀▄ █ \n ▄▀ ▄ ▀▄ ▄█▄▄\n ▀▄ ▀ ▀ ▄▀█▄▄ █\n ▄██▄▄█▀ █ ▄ █ \n █ █ ▄▄▀▄▄▄▀ \n ▀▀▀▀▀ "], ["happy", "▄▄▄▀▀▄▄▄▀▀▄▄▄ \n▀▄▄▀▀▄ ▄▀▀▄▄▀▄ \n ▀▄▄▄▀▄▄▄▄▀▄ █ \n ▄▀ ▄▀▄ ▀▄ ▄█▄▄\n ▀▄ ▄▄ █▀ ▄▀\n ▀▀ ▀█▄▄▀▀▀▄ \n █▀█▀▀▀ █ ▀ █ \n ▀▄█▄▄▄▀▀ ▀▀▀ "], ["injured_1", " \n ▄▄ ▄▄ \n█▀▀▄▄▀▀▀▄▄▀▀█ \n ▀█ ▀▄▀ ▀█ ▀▄ \n ▄▀▀▀ ▀▀█▀ ▀▄▀ \n █ █▄ ▀▄██▀█\n █▀█▀▄▄▀▀█ ▄ █▀\n █▄█▄▄▄▄▄▀▄▄▄▀ "], ["injured_2", " \n \n▄▄█▀▀▄▄▄▀▀▄▄▄ \n▀▄▄▀▀▄ ▄▀▀▄▄▀▄ \n █▄▀▀▀▀▀▄ ▀▄ █ \n █ █▄ ▀▄██▀█\n █▀█▀▄▄▀▀█ ▄ █▀\n █▄█▄▄▄▄▄▀▄▄▄▀ "], ["sleep_1", " \n▄▄▄▀▀▄▄▄▀▀▄▄▄ \n▀▄▄▀▀▄ ▄▀▀▄▄▀▄ \n ▀▄▄▄▀▄▄▄▄▀▄ █ \n ▄▀ ▄▄ ▀▄ ▄█▄▄\n ▀▄ ▄▄▀█▄▄ █\n █▀█▀▀▀ █ ▄ █ \n ▀▄█▄▄▄▀▀▀▄▄▄▀ "], ["sleep_2", " ▄▄ ▄▄ \n█▀▀▄▄▀▀▀▄▄▀▀█ \n ▀█ ▀▄▀ ▀█ ▀▄ \n ▄▀▀▀ ▀▀█▀ ▀▄▀ \n █ ▀▀ █▄▀▀▀█\n ▀▄▄ ▄▄▀▄▀▀▀▄▀\n █▀█▀▀▀ █ ▀ █ \n ▀▄█▄▄▄▀▀ ▀▀▀ "], ["walk_1", "▄▄▄▀▀▄▄▄▀▀▄▄▄ \n▀▄▄▀▀▄ ▄▀▀▄▄▀▄ \n ▀▄▄▄▀▄▄▄▄▀▄ █ \n ▄▀ ▄▀▄ ▀▄ ▄█▄▄\n ▀▄ ██▀ █▀ ▄▀\n ▀▀ ▀█▄▄▀▀▀▄ \n █▀█▀▀ █ ▀ █ \n ▀▄█▄▄▀▀ ▀▀▀ "], ["walk_2", "▄▄▄▀▀▄▄▄▀▀▄▄▄ \n▀▄▄▀▀▄ ▄▀▀▄▄▀▄ \n ▀▄▄▄▀▄▄▄▄▀▄ █ \n ▄▀ ▄▀▄ ▀▄ ▄█▄▄\n ▀▄ ██▀ ▄▀█▄▄ █\n ▄██▄▄█▀ █ ▄ █ \n █ █ ▄▄▀▄▄▄▀ \n ▀▀▀▀▀ "]]], + ["centarumon", [["angry", " ▄▄▄▄▄ \n █▄▄▄▄▀▄ \n ▄▀ ▀▄ ▀█ \n ▄▀█▀▀ █ █▀▀▄ \n█▀██▄▄▄█ ▄▀▀▄ █\n█▄██▄▄▄▀▀▀▀▄▄▄▄▀\n █ █▄ ▄▄ ▄ █\n █▄▄█▄▄▄█▀█▄▄█"], ["attack", " █▀▀▀▀▄ \n ▄▀▀█▀▀▄█ \n █▄▄ █▀ █ \n█▀▀█▄█▄▄ █▄▄▀ \n████▄▀ █▀ █ \n▀▀▀▀▀▄▄▄▄▄▄▄▀ ▀▄\n ▄▀ █▄ ▄▄▄ █\n █▄▄█▄▄▄█▀█▄▄▄█"], ["eat_1", " ▄▀██▀█▀▄ \n █▄█▄▄▄ █ █ \n ▀█████▀▄█ \n ▄▀▀██▀ █ ▄▀▀▀▄\n █▀██▀▀▀▀ █▀ █\n █▄██▀▀▀▀▀ ▀▀▀▄\n █ █▄ ▄▄ ▄ █\n █▄▄█▄▄▄█▀█▄▄█"], ["eat_2", " ▄▄▄▄▄ \n █▄█▄▄▀▄ \n█▀█▄▀ ▀▄█▀▀▀▄ \n█▄██▀█▀▀ █ ▄▀ █ \n █ ▀▄█▄▄▄▀▀ ▄▄▀ \n ▀▄▄▄▄▀▀▀▀▀ ▀▄\n █ █ ▀█ ▄ █\n █▄▄██▀▀▀▀█▄▄█"], ["happy", " █▀█▀▀▄ \n ▄▀▀▀█▀▄█ \n ▄▄▄█▄▄▄▄ ██▀▀▄ \n █ ██ █ ██▀ █ \n ▀█▀ ▀▀▀▀▀▄▄▄▀ \n ▀█▀▀▀▀▀▀▀▀▀▀▄\n █ █▄ ▄▄ ▄ █\n █▄▄█▄▄▄█▀█▄▄█"], ["injured_1", " ▄▄▄▄▄ \n ▄▀▄█▄▄▀▄ \n █ ▀ ▀▄▀█ \n █▀█▀ █ █ \n █▄█▄▄▄▀▀▄ \n ▄▀▄▄▄▄▄▄██ █▀▄ \n█▀█▀▄▀ ▄█ █▄█ \n█▄█▄█▄▄▄▄███▄▄█ "], ["injured_2", " \n █▀█▀▀▄ \n ▄▀▄▀▀█▀▄█ \n █ █ █ \n █▀█▀ █▄█ \n █▄█▄▄█▄█ ██▀▄ \n█▀▄▀▄▀ ▄▀ █▄█ \n█▄█▄█▄▄▄█▄▄█▄▄█ "], ["sleep_1", " \n █▀█▀▀▄ \n ▄▀▄▀▀█▀▄█ \n █ █ █ \n █▀█▀ █▄▀▀▄ \n █ ▀████▄▀▀▄▀▀▄\n █▄▀▄▀ ▄██ ▄█\n ▀▄█▄▄▄▄██▄▄▄█"], ["sleep_2", " ▄▄▄▄▄ \n ▄▀▄█▄▄▀▄ \n █ ▀ ▀▄▀█ \n █▄▄▄ █ █ \n ▄▀▀▄█▄▄▄▀▀ ▀▄ \n █▀█▄▄▄▄▄▄█▀ ▄▀▄\n █▄█▀▄▀ ▄▄█▀ ▄█\n ▀▄█▄▄▄▄██▄▄▄█"], ["walk_1", " █▀█▀▀▄ \n ▄▀▀▀█▀▄█ \n █▄▄▄▄ █ █ \n ▄█ █ █▄▀▄ \n ▄█▄ ▀▀▀▀▀▄▄ █ \n █ ██▀▀▀▀▀▀▄▄▄▀▄\n ▀▀▀█ █▄ ▄▄ ▄ █\n █▄▄█▄▄▄█▀█▄▄█"], ["walk_2", " ▄▄▄▄▄ \n █▄█▄▄▀▄ \n ▄▀ ▀▄▀█ \n ▄▀█▀█▀▀ █ █▀▀▄ \n█▀██▄█▄▄▄▀█ ▀ █ \n█▄██▄▄▄▀▀▀▀▀▀▀▀▄\n █ █ ▀█ ▄ █\n █▄▄██▀▀▀▀█▄▄█"]]], + ["cerberusmon", [["angry", " ▄▄▄ ▄▄▄ \n ▄███████▀▄ ▄▄ \n████▀ ███ ▄█ ██\n▀█▀█▀█▀█ ▀▀ █▄██\n ██ ▀ ▄ ██ \n █▀▀▀▀▄██▄▄▄▄███\n ████████▀▀████\n █▄██▄█▄█ █▄█▄█"], ["attack", " ▀██▄▄▄███ \n▄▄███▀▀██▀ █ ▄▄ \n████▄▄██▀▄█▀▄ ██\n▀▄ ▀ ▀ █ ▄ ▀███\n ▀▀████▄ ▀ ██ \n ▄▀██▀█▀████████\n ▀▀▀▀▀▀▀▀ ▀█████\n ██▄█▄█"], ["eat_1", " ▄▄▄ ▄▄▄ \n ▄███████▀▄ ▄▄ \n████▀▄▀██ ▄█ ██\n█▀▀█▀█▀█ ▀▀ █▄██\n ▀▄▄▄▄▄█ ▀ ▄ ██ \n ██▀██▄▄▄▄███\n ▄▄██▄███▀▀████\n █▄██▄█▄█ █▄█▄█"], ["eat_2", " ▄▄▄ ▄▄▄ \n ▄███████▀▄ ▄▄ \n████▀ ▄██ ▄█ ██\n▀█▀█▀█▀█ ▀▀ █▄██\n ▄▄▄▄▄▀█ ▀ ▄ ██ \n ▀▄▄▄▄███▄▄▄▄███\n ▄▄██▄███▀▀████\n █▄██▄█▄█ █▄█▄█"], ["happy", " ▄▄▄ ▄▄▄ \n ▄███████▀▄ ▄▄ \n████▀▄▀██ ▄█ ██\n▀█▀█▀█▀█ ▀▀ █▄██\n ▄▄▄▄▄▀█ ▀ ▄ ██ \n ▀▄▄▄▄███▄▄▄▄███\n ▄▄██▄███▀▀████\n █▄██▄█▄█ █▄█▄█"], ["injured_1", " \n \n ▀██▄▄▄███ \n▄▄██▀████▀ █ ▀█▄\n████▄▄██▀▄█▀▄ ██\n▀▄ ▀ ▀ █ ▄ ▀██▀\n ▄█████▀▄ ▀▄██▄\n█▄██▄█▄█████▄█▄█"], ["injured_2", " \n \n ▄▄▄ ▄▄▄ \n ▄███████▀▄ ▄▄ \n████ ▀███ ▄█ ██\n█▀▀█▀█▀█ ▀▀ █▄██\n █▄▄▄▄▄▀▄▀ ▀▄██▄\n█▄██▄█▄█████▄█▄█"], ["refuse", " \n ▄▄▄ ▄▄▄ ▄▄ \n ▄██████▀ █ ██\n████▀ ██▀▄█▀█▄██\n█▀▀█▀█▀█ ▄ ██ \n ▀▄▄▄▄▄█▄ ▀ ███\n ▄▄██████▀▀████\n █▄██▄█▄█ █▄█▄█"], ["sleep_1", " \n ▄▄▄ ▄▄▄ \n ▄███████▀▄ ▄▄ \n████▀▀███ ▄█ ██\n█▀▀█▀█▀█ ▀▀ █▄██\n ▀▄▄▄▄▄█ ▀ ▄ ██ \n ▄▄███ █▄▄▄▄███\n █▄█▄█▄█████▄█▄█"], ["sleep_2", " \n \n ▀██▄▄▄███ \n▄▄███████▀ █ ▀█▄\n████▄▄██▀▄█▀▄ ██\n▀▄ ▀ ▀ █ ▄ ▀██▀\n ▄█████▀▄ ▀▄██▄\n█▄██▄█▄█████▄█▄█"], ["walk_1", " ▄▄▄ ▄▄▄ \n ▄███████▀▄ ▄▄ \n████▀ ▄██ ▄█ ██\n█▀▀█▀█▀█ ▀▀ █▄██\n ▀▄▄▄▄▄█ ▀ ▄ ██ \n ██▀██▄▄▄▄███\n ▄▄██▄███▀▀████\n █▄██▄█▄█ █▄█▄█"], ["walk_2", " ▀██▄▄▄███ \n▄▄███▀▀██▀ █ ▄▄ \n████▄▄██▀▄█▀▄ ██\n▀▄ ▀ ▀ █ ▄ ▀███\n ▀▀████▄ ▀ ██ \n ▄▀██▀█▀████████\n ▀▀▀▀▀▀▀▀ ▀█████\n ██▄█▄█"]]], + ["cerberusmon_x", [["angry", " █▀▄ ▄▄ ▄▀█ \n ▀▄▀▀ ▀ ▄▀ \n▄▀▀ ▄█ ▄▀█▄ ▄▄ \n█▄▄▄▄▄▄█ ▀ █▄█ █\n ▀▄▄▄▄ █ ▀ █▀ █\n ▀▄ ▀▀▀ ▀▄\n ▄█ █ ▄ ▄█ █\n █▄▄█▄█▄██▄█▄▄█"], ["attack", " █▀▄ █▀▄ \n █▄█▀▀█ █ \n ▄▄▀ ▄█ █ ▄▄ \n█▄▄▄▄▄▄ █▀█▀▄█ █\n█ ███ ██▀ ▄ ██ █\n▀██████ ▀▀ █ ▀▄\n █▄▄▄▄▀▀▀▀▀▀▀ ▀█\n█▄█▄▄▄▄█▀▀▀█▄█▄█"], ["eat_1", " █▀▄ ▄▄ ▄▀█ \n ▀▄▀▀ ▀ ▄▀ \n▄▀▀ ▄▀▄ ▄█▄▄ ▄▄ \n█▄▄▄▄▄▄█ ▀ █▄█ █\n █████ ▀ █▀ █\n ▄██▄▄▀ ▀▀▀ ▀▄\n ▀▄▄▄▄█▀ ▄█▀ █\n █▄▄█▄▄▄██▄▄▄▄█"], ["eat_2", " \n █▀▄ ▄▄ ▄▀█ \n ▀▄▀▀ ▀ ▄▀ \n▄▀▀ ▄▀▄ ▄██▄ █▀▄\n█▄▄▄▄▄▄█ ▀ █▄█ █\n ▀▄▄▄▄ ▀ ▀ █ █\n ▄▄█▄▀ ▀▀██▄ ▀▄\n █▄█▄▄▄▄███▄▄▄▄█"], ["happy", " █▀▄ ▄▄ ▄▀█ \n ▀▄▀▀ ▀ ▄▀ \n ▄▀▀ ▄▀▄ ▄██▄ \n █▄▄▄▄▄▄█ ▀ █ \n ███████ ▀ █▀▄\n▄▀▀▄▄▄▄▀▀▀█▀██ █\n▀▄██ ▀▄▄█▄ ▀▄ █\n █▄▄█▄▄▄█▄▄█▄█▀ "], ["injured_1", " \n \n \n █▀█▄▀▀▄▀▀█ \n ▄▄▀▄ ▄▀█▀█▄▀▀▄\n█ ▀▀ █ ▄▄▀█▀ █\n▀█▀▀▀██▀▄▄▄▄█ ▀▄\n█▄███▄▄▄▄█▄▄▄▄▄█"], ["injured_2", " \n \n \n ▄▄▄ ▄▄ ▄▄▄ \n ▀▄▀▀ █▄▄█▄▀▀▄\n▄▀▀ █▄ █ ▀ █▀▀ █\n█▄▄▄▄▄▄█ ▀▀ █ ▄▀\n██▄▄▄██▄█████▄▄█"], ["sleep_1", " \n \n ▄▄▄ ▄▄ ▄▄▄ \n ▀▄▀▀ ▀▄▄▀ ▄▄ \n▄▀▀ ▄▄ ▄▀█▀█ █ █\n█▄▄▄▄▄▄█ ▄ ▀█▀ █\n █▄▄▄▄ ▀ ▄▄▄▀ ▀▄\n█▄█▄▄▄▄███▄▄▄▄▄█"], ["sleep_2", " \n \n █▀█▄▀▀▄▀▀█ \n ▄▄▀ ▄█ ▄▄ \n█ ▀▀ ▄▀█▀██▄ █\n▀█▀▀▀▀▀█ ▄ ▀█▀ █\n ▄███▀ ▄▄▄▀ ▀▄\n█▄█▄▄▄▄███▄▄▄▄▄█"], ["walk_1", " █▀▄ ▄▄ ▄▀█ \n ▀▄▀▀ ▀ ▄▀ \n▄▀▀ ▄█▀ ▄██▄ █▀▄\n█▄▄▄▄▄▄█ ▀ █▄█ █\n ▀▄▄▄▄ █ ▀ █ █\n █ ▀▀▀ ▀▄\n ▄▄▀ █ ▄▄▄█ █\n █▄█▄█▄█▄▀ █▄█▄█"], ["walk_2", " █▀▄ ▄▄ ▄▀█ \n ▀▄▀▀ ▀ ▄▀ \n▄▀▀ ▄█▀ ▄███ ▄▄ \n█▄▄▄▄▄▄█ ▀ █▄█ █\n ▀▄▄▄▄ █ ▀ █ █\n▄▀▄ ▄▄ ▀▀▀ ▄▀ \n█ █ ▄▀█▀█▀▄ ▀▀▄\n ▀▀▀▀▀ ▀▄█▄▄▄▀"]]], + ["chaosdramon", [["angry", "▄▄ ▄▄▄▄▄▄ \n█ █▄▀▀▀▀ ▄▄████▄\n█ ▄▄█▀ ▄█▀▀▀██\n▀▄ ▄▄▄▄▄▀▄█▀▀▄ █\n █ ▄▄▄▄▀ ▀▄▄▀██\n▄▀ ▀▀▀▄ ▄▀ ██\n █▄▀▀▀█▄ █▄▄█▄█\n█▄█▄▄▄▄▀▀█▄█▄█▄█"], ["attack", "█▀▄▄▄▄▄▄▀▀▀███▄ \n█ ▄██▀ ▀██████\n▀▄ ▄ ▄ ▀█▀▀███\n ▀████▀ ▄▀▄▄▀ █\n █▀▀▀ ▄▀ █ █\n ▀▄▀██ █▀▀█\n ██▀ ▀█▄▄▀▀▀▄▄▀\n █▄█▄▄▄▄█▄█▄█▄█ "], ["eat_1", "█▀▄ ▄▄▄▄▀▀▀███▄ \n█ ▀▀ ▄▄ ▀██████\n█ ▀ ▀▄▀█▄▄ ▀█\n ▀▄██████ █ █▄█\n ▄▀█▀▀▀▀▄▀▄█▀ ██\n▀▄ ▀▄██▀ █ ▄▀█\n ██▀ ▀█▄▄▀▀▀▄▄▀\n █▄█▄▄▄▄█▄█▄█▄█ "], ["eat_2", "▄▄ ▄▄▄▄▄▄ \n█ █▄▀▀▀▀ ▄▄████▄\n█ ▄▀▀▄ ▄█▀▀▀██\n▀▄ ▄▄▄▄▄▀▄█▀▀▄ █\n █ ▄▄▄▄▀ █▄▄▀██\n▄▀ ▀▀▀▄ █ ██\n █▄▀▀▀█▄ █▀▀▀▄█\n█▄█▄▄▄▄███▄█▄█▄█"], ["happy", "█▀▄ ▄▄▄▄▀▀▀███▄ \n█ ▀▀ ▄▄ ▀██████\n█ ▀ ▀▄▀█▄▄ ▀█\n▄▀▄██████ █ ▄▀▀█\n▀▄▀█▀▀▀▀▄▀ █ ▄█\n ▀█▄██▀ ▀▄▄█▀█\n ▄▄▀ ▀█▄▄▀▀▀▄▄▀\n █▄█▄▄▄▄█▄█▄█▄█ "], ["injured_1", " \n█▀▄ ▄▄▄▄▀▀▀█▄▄ \n█ ▀▀▄ ▀█████▄\n█ ▀▀▀▄▀███▀██\n ▀▄▀▀▀▀▀▄▀█ █▄█\n █▄██▀▀ █▀ ██\n █▄▄▀▄█ ▄▀ ▄▀█\n █▄█▄▄▄███▄▄█▄█▀"], ["injured_2", " \n▄▄ ▄▄▄▄ \n█ █▄▀▀▀▀ ▄▄███▄ \n█ ▀▄▄▄ ▄██████\n▀▄ ▄▄▄▄▄▀▄█▀▀▄▀█\n █ ▄▄▄▄▀ ▀▄▄▀██\n █▄██▀▄ ▄▀▀ ██\n █▄█▄██▄▄█▄▄▄█▄█"], ["sleep_1", " \n▄▄ ▄▄▄▄▄▄ \n█ █▄▀▀▀▀ ▄▄████▄\n█ ▄▄▄ ▄███▀██\n▀▄ ▄▄▄▄▄▀▄█ █▄█\n▄▀█ ▄▄▄▄▀ ▄██▄▄█\n█▀ ▀▄ █ █ ▀ ▀ █\n█▄▄▄▄█████▄▄▄▄▄█"], ["sleep_2", " \n█▀▄ ▄▄▄▄▀▀▀█▄▄ \n█ ▀▀ ▀█████▄\n█ ▀▀▀▄▀███▀██\n ▀▄▀▀▀▀▀▄▀█ █▄█\n▄▀█▄██▀▀ ▄██▄▄█\n█▀ ▀▄ █ █ ▀ ▀ █\n█▄▄▄▄█████▄▄▄▄▄█"], ["walk_1", "█▀▄ ▄▄▄▄▀▀▀███▄ \n█ ▀▀ ▄▄▄ ▀██████\n█ ▀▀▀ ▄▀█▄▄ ▀█\n ▀▄▀▀▀▀▀▄▀█ █▄█\n ▄▀▄██▀▀ ▄█▀ ██\n▀▄ ▄█ █ ▄▀█\n ██▀ ▀█▄▄▀▀▀▄▄▀\n █▄█▄▄▄▄█▄█▄█▄█ "], ["walk_2", "▄▄ ▄▄▄▄▄▄ \n█ █▄▀▀▀▀ ▄▄████▄\n█ ▄██▀ ▄█▀▀▀██\n▀▄ ▄▄▄▄▄▀▄█▀▀▄ █\n █ ▄▄▄▄▀ █▄▄▀██\n▄▀ ▀▀▀▄ █ ██\n █▄▀▀▀█▄ █▀▀▀▄█\n█▄█▄▄▄▄▀▀█▄█▄█▄█"]]], + ["chaosdramon_x", [["angry", "▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄ \n▀▄▄▀ ▄ ▄██▄▄██\n█ ▄ ▀▀ ▀█▀█████\n▀█▀▀▀▀▄ ▄▀▄▄███ \n ▄██▀▀▀▀▄█ ▄███▄\n█ ▄█ ▄██ ▀▄▀███\n ██▄▀▀████▄█▄██ \n█▄█▄▄████▄█▄█▀ "], ["attack", " █▀▀▄▀▀▀▀▀▀▄ \n ▄▀▀ ▄█ █▀ \n ▄█ ▄▄▄▄ █▄▄ \n█▀██▀█████████▀█\n█▄██▄█████████▄█\n ▀▀▄▀▀█▀▄ ▄███ \n ▄██▄ ▀█ ▄██▄ \n █▄█▄▄█▀▀█▄█▄█ "], ["eat_1", "█▀▀▄▀▀▀▀▀▀▄█▀▀█▄\n▄▀▀ ▄▀▄ ███████\n█▄▄█▄▄ █ ▀███▀\n ▀█████▄▀▄▀▀███ \n ▄▀▀▀▀▀▄▀▀▄ ████\n█ █▀███ ▄▀ █▀▀█▀\n▀█▄█▄ ▀█▄▄████ \n█▄█▄▄█▀▀█▄█▄█ "], ["eat_2", "▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄ \n▀▄▄▀ ▄ ▄██▄▄██\n█ ▄ ▀ ▀ █▀█████\n▀█▀▀▀▀▄ ▄▀▄▄███ \n ██▀▀▀▀▄█ ███▄\n▄▀ ▄█ ▄▀ ▄▀▄████\n█▄█▄▀▀█▄▀▄▄█▄▄█ \n█▄█▄▄████▄█▄█▀ "], ["happy", "█▀▀▄▀▀▀▀▀▀▄█▀▀█▄\n▄▀▀ ▄▀▄ █▀█████\n█▄▄█▄▄ █▄▄███▀\n▄██████▄█▀ ▄▀██ \n█ █▄▄▄▀▄▀ ▀ ▄███\n ▀▄▄█▄█▀▄▄██▀▀█▀\n ▄██▄ ▀█ ▄████ \n█▄█▄▄█▀▀█▄█▄█ "], ["injured_1", " ▄▄▄ \n▄▄▄ ▄▄▄▄▄▄ █▄▄██\n▀▄▄▀ ▄ ▄██████\n█ ▄ ▀▀ ▀█▀████ \n▀█▀▀▀▀▄ ▄▀▄▄███ \n█ ██▀▀▀▀▄▀ ▀█▀▀█\n▀▄█▄▀▀███▄█▄█▀▀ \n█▄█▄▄████▄█▄█ "], ["injured_2", " \n ▄▀▀█▄\n█▀▀▄▀▀▀▀▀▀▄█████\n▄▀▀ █▄ ▄██████▀\n█▄▄█▄▄ █ ▀███ \n▄▀▄▄▄▄█▄▀▄▀████ \n▀▄█▄▀▀███▄▄▄█▄▄▀\n█▄█▄▄████▄█▄█▀ "], ["sleep_1", " \n \n▄▄▄ ▄▄▄▄▄▄▄█▀▀█▄\n▀▄▄▀ ▄██████\n█ ▄ ▀▀ ▀█ ▀███▀\n▀█▀▀▀▀▄ ▄▀▀▀███ \n█ ▀██▀ ▄▀█▀█▀███\n█▄▄▄█▄█▄▄█▄▄▄██▀"], ["sleep_2", " \n \n█▀▀▄▀▀▀▀▀▀▄█▀▀█▄\n▄▀▀ ▄▄ ▄███████\n█▄▄█▄▄ █ ▀███▀\n █▄▄▄▄█▄▀▄▀▀███ \n█ ▀█▄ ▄▀█▀█▀███\n█▄▄▄█▄█▄▄█▄▄▄██▀"], ["walk_1", "█▀▀▄▀▀▀▀▀▀▄█▀▀█▄\n▄▀▀ ▄█ ▄███████\n█▄▄█▄▄ █ ▀███▀\n ▀▄▄▄▄█▄▀▄▀▀███ \n ▄▀▀▄ ▄▀▀▄ ████\n█ ▄▀█▄█ ▄▀ █▀▀█▀\n▀█▄█▄ ▀█▄▄████ \n█▄█▄▄█▀▀█▄█▄█ "], ["walk_2", "▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄ \n▀▄▄▀ ▄ ▄██▄▄██\n█ ▄ ▀▀ ▀█▀█████\n▀█▀▀▀▀▄ ▄▀▄▄███ \n ██▀▀▀▀▄█ ███▄\n▄▀ ▄█ ▄▀ ▄▀▄████\n█▄█▄▀▀█▄▀▄▄█▄▄█ \n█▄█▄▄████▄█▄█▀ "]]], + ["chaosmon", [["angry", " ▄▄ \n █ ▀██▄▄▄▄▄ \n █ █▀ █▄▄▀ \n ▄▄█▀█▀▀▀▄█▀▀█ \n ▀▄▄█▀█▀▀█ ▄▄▀ \n █ █ █ ▄██ █ \n ▀█ ▀███▀█ ▄█ \n █▄█▄█▀ ▀███▄█ "], ["attack", " █▀▄▄▄ \n ▄▀ ▄▄▄█▀▀█▀\n █ █▀ █▀▀█ \n ▄▄▀▀▀▀███▀▀▄ █ \n█ ██ ▄▄█▀ \n ▀▀▄▄▄▄█████ \n ▄▀ █▀ █▄ █▄ \n █▄█▄█ █▄█▄█ "], ["eat_1", " █▀▄▄▄ \n ▄▀ ▄▄▄█▀▀█▀ \n █▄█▀▄▀███▄▄ \n █▀▀██████▀ █ \n ▄▀██▀▀▀▄█▄█▀▄ \n █ █▀▀█▀▀█ ▄▀ \n ▀▀█▀▀███▀███ \n █▄█▄█ █▄█▄█ "], ["eat_2", " ▄▄ \n █ ▀▀▀▄▄▄▄▄ \n █ ▄█▀██▄▄▀ \n ▄▄███▄█▄██▀▀█ \n ▀▄▀█▄▄▄▄█ ▄▄▀ \n █ █ ▄▀ ▄██ █ \n ▀█▀▀█████ ▄█ \n █▄█▄█▀ ▀███▄█ "], ["happy", " █▀▄▄▄ \n ▄▀ ▄▄▄▀▀█▀ \n █ █▀▄▀██▀▀▄ \n █▀▀████▀█▀ ▄▀ \n ▄▀██▀▀▀▄█▄▀ \n █ ▄█▀█▀███ \n ▀▀█▀▀██▄▀█▄ \n █▄█▄█ █▄█▄█ "], ["injured_1", " \n ▄▄ \n █ ▀▀▀▄▄▄▄▄ \n █ ▄▀██▄▄▀ \n █▀▀█▄▄█▄▄██▀▀█ \n ▄█▄█▄█▄▄▄█ ▄█▀ \n █ ▀█▄ ▀ ▄█▀ █ \n ▀▄▄███████▄▄▄█ "], ["injured_2", " \n \n █▀▄▄▄ \n ▄▀ ▄▄█▀▀█▀ \n ▄▄█ █ ▀███▄▄ \n █▄█▀█▀▀▀██ ▄█ \n █ ▀█▀█▀▀▀█▀ █ \n ▀▄▄██▄▄▄██▄▄▄█ "], ["sleep_1", " \n █▀▄▄▄ \n ▄▀ █▀▀█▀ \n █▄▄███▀██▄▄ \n █▀▀▄█▄▄▄█▀ █ \n ██▀▄▀ █▄▀▀▄ \n ██ ▀█▄▄██▀ █ \n █▄█▄█▀▀▀█▄▄██ "], ["sleep_2", " ▄▄ \n █ ▀▀▀▄▄▄▄▄ \n █ ▄▄▄█▄▄▀ \n ▄▄█▀█▀▀▀▄█▀▀█ \n ▀▄▄█▀█▀▀█ ▄▄▀ \n ▄▀█ █ ▄██ █ \n ▀█ ▀███▀█ ▄█ \n █▄█▄█▀▀▀███▄█ "], ["walk_1", " █▀▄▄▄ \n ▄▀ ▄▄█▀▀█▀ \n █▄▄█▄█▀██▄▄ \n █▀▀▄█▄▄▄█▀ █ \n ▄▀█▀▄▀ █▄▀▀▄ \n █ █▄█▄▄██▀ █ \n ▀█ ▀██▄▀▄▄█ \n █▄█▄█ █▄█▄█ "], ["walk_2", " ▄▄ \n █ ▀▀▀▄▄▄▄▄ \n █ ▄▀██▄▄▀ \n ▄▄█▀█▀▀▀▄█▀▀█ \n ▀▄▄█▀█▀▀█ ▄▄▀ \n █ █ █ ▄██ █ \n ▀█ ▀███▀█ ▄█ \n █▄█▄█▀ ▀███▄█ "]]], + ["cherrymon", [["angry", " ▄▄██▀▀████▄▄ \n ▄▀▀█▄██▄█▀▀███ \n█▄██▄████▄██▄███\n███████████████▀\n█▀█ ▀█▀ ▀██▀▀██\n ▀█▄ ▄█▀ ▀ ██▀\n ▄▀▄ ▄ ▀▀█ \n█▄▄▄██▀▀█▄▄█▄▄█ "], ["attack", " ▄▄███▀▀█▄▄▄ \n █▀▄▄▀█▄██▄█▀▀█ \n█▀█████▀▀██▄██▄█\n█ ▀█ ▀ ▄▄▀███ █\n▀▄▄▄▀ ▀▀ ▀ █\n ▀▀█████▄ ▀██▀\n ▄▄██▀▀▀█ ▀▄ \n █▄▄██▀▀█▄▄█▄▄█"], ["eat_1", " ▄▄███▀▀█▄▄▄ \n █▀▄▄▀█▄██▄█▀▀█ \n▄██████▀▀██▄██▄█\n██ █ ▀ ▄ ▀███▀█\n▀█▄▄▀ ▀ ▀ ▀ █\n ▀▀█████▄ ▀██ \n ▄▄█▀▀▀▀█ ▀▄ \n █▄▄██▀▀█▄▄█▄▄█"], ["eat_2", " ▄▄███▀▀███▄▄ \n ▄████▄██▄█████ \n██▀▄▄▀████▀▄▄▀██\n█▀█████████████▀\n█ █ ▀█▀ ▀██ ███\n ▀█▀▄ ▄▀ ▀ ██▀\n ▄▀▄ ▄ ▀█ \n█▄▄▄██▀▀█▄▄█▄▄█ "], ["happy", " ▄▄▄███▀▀█▄▄▄ \n █▀▄▄▀█▄██▄█▀▀█ \n███████▀▀██▄██▄█\n█▄ █ ▀ ▄▄ ▀█▀ ▄█\n▀█▄▄▀ ▀ ▀ ▀ ██\n ▀▀▀██████ ▀█▀ \n ▄▄▄█▀▀▀██ ▀▄ \n █▄▄██▀▀▀█▄▄█▄▄█"], ["injured_1", " ▄▄▄▀▀███▄▄▄ \n ▄▄██▄█████▀▀█▄ \n▄█▀▀██████▄████▄\n█▄██▀███▀▀██████\n█▀▀█ ▄▀ ▄ █▀ ▄█\n█▀▄▄▀▀ ▀▀ ▄▀ \n ▄▀ ▄█▀▀▄ ▀▀▄ \n █▄█▄▀▀▀▀▀▄▄█▄▄█"], ["injured_2", " ▄▄▄▄▄ \n ██▀▄▄██████ \n ██▀▀█████▀▄▄██ \n██▄█████████████\n████▀██▀ ▀███▀█\n█▄ ▀▄▄ ▀▄▄ ▀ ▄▀\n▀ ▀█ ▀▀▄ \n █▄▄▄██▀▀▀▄█▄▄█"], ["sleep_1", " ▄▄▄▄▄ \n ████▀▀█████▄ \n █████▄██▄█████ \n██▀▄▄▀███▀▄▄▀███\n█▀██▀███▀▀███▀██\n█ ▀ ▀ █▀ ██\n ▀▄▀▀ ▀▀▀ ▄▄▀ \n █▄▄█▄▄▄█▄▄▄▄▄█ "], ["sleep_2", " ▄▄▄█▀▀██▄▄▄ \n ▄▄███▄██▄█████ \n▄██▀▄▄▀███▀▄▄▀█▄\n████████████████\n█ █ ▀█▀ ▀██ ██\n▀▄ ▄▄ ▄▄▄ ▀ █▀\n █ █▀ \n █▄▄█████▄▄▄▄█ "], ["walk_1", " ▄▄▄▀▀███▄▄▄ \n ▄▄██▄██▄██████ \n▄█▀▄▄▀█████▀▄▄▀▄\n█▀██████████████\n█ ▀█ ▀█▀ ▄▀██ ██\n▀▄▄▀█ █▀ ▀ █▀\n ▄█ ▀▀▄ \n █▄▄▄██▀▀█▄▄█▄▄█"], ["walk_2", " ▄▄▄▄▄ \n ██▀▄▄▀█████▄ \n ██▀▀███████▀▀█ \n██▄██▄█████▄██▄█\n█ ██▀███▀▀███▀██\n█ █▄ ▀ ▄█ █▀ ██\n ▀█▄▀ ▀ ▄▄▀ \n █▄▄▄█▄▄▄█▄▄▄▄█ "]]], + ["cherubimon_vice_x", [["angry", "▄▄ ▄ ▄▄\n████▄▀▄▀▄▄██████\n ▀█ ▄ ▄▀████▀ \n █ ▀▀ ▀▀ █ \n ▀▄▄██▄▄█▄▀▄ \n ▄▀▄▀ ▀██▀▀▄ \n █ █▄██▄ █ █ \n█▄██▀▀▀▀▀▀████ "], ["attack", "██▄ ▄ ▄ ▄█▄██ \n▀██▀ ▀ ▀██████▀ \n ██▄ ▄█ ▀█▀ \n █ ▄▄▄▄ █ \n █▄████▄█▀▀▄▄ \n▄▀▄█ ▀██▀ █ \n▀▄▄▀▄██▄▄▀▀█▄▄▀ \n █▄▄▄██▀▄▄▄▄█ "], ["eat_1", "██▄▄ ▄ ▄ ▄▄█▄██\n▀██▀▀ ▀ ▀██████▀\n █▄▀▄ ▄▀▄█▀▀▀ \n █ ▄▄▄▄ ▄▀▄ \n ▄▀████▀██▄▀▄ \n▄▀ █ ▄▄ ██▄ █ \n▀▀██████▄██▀▀▀ \n █▄▄█▀▀▀█▄▄█ "], ["eat_2", "▄▄ ▄ ▄▄\n████▄▀▄▀▄▄██████\n ▀█ ▄ ▄▀████▀ \n █▀ ▀ ▀ ▀█ \n ▀▄▄██▄▄█▄▀▄ \n ▄▀▄▀ ▀██▀▀▄ \n ▀▄█▄██▄▄█▄ ▄▀ \n █▄▄█▀▀▀█▄▄█ "], ["happy", "██▄▄ ▄ ▄ ▄▄█▄██\n▀██▀▀ ▀ ▀██████▀\n █▄▀▄ ▄▀▄█▀▀▀ \n█▀█ ▄▄▄▄ ▄█▀▀▄ \n▀▄ ▀████▀█▀ ▄▀ \n ▀█ ▄▄ ██▀ \n ▄█▄███▄██ \n █▄▄█▀▀▀█▄▄█ "], ["injured_1", " \n▄▄ ▄ ▄▄\n████▄▀▄▀▄▄██████\n ▀█ ▄ ▄ ▀████▀ \n █▀▀ ▀▀ █ \n ▀▄▄██▄▄█ \n █ ▀▄▄▀▀ █▄ \n █▄█▄██▄▄█▄▄█ "], ["injured_2", " \n \n██▄▄ ▄ ▄ ▄▄█▄██\n▀██▀▀ ▀ ▀██████▀\n █▄█ █▄ █▀▀▀ \n █ ▄▄ ▄▀ \n ▄▀█▀▀█▀▀▄▄ \n █▄█▄██▄▄█▄▄█ "], ["sleep_1", " \n▄▄ ▄ ▄▄\n████▄▀▄▀▄▄██████\n ▀█ ▀█████▀ \n █▀▀ ▀▀ █ \n▄▄█▄▄██▄▄██▄ \n█ ▀█ ▄▄▀ ▀▄▀▄ \n█▄▄████▄▄▄▄█▄█ "], ["sleep_2", " \n██▄▄ ▄ ▄ ▄▄█▄██\n▀██▀▀ ▀ ███████▀\n █▄▄ ▄▄▀█▀▀▀ \n █ ▄▄ ▄█ \n▄▄▄▀█▀▀▀██▄▀▄ \n█ ▀█ ▄▄▀ ▀▄▀▄ \n█▄▄████▄▄▄▄█▄█ "], ["walk_1", "██▄▄ ▄ ▄ ▄▄█▄██\n▀██▀▀ ▀ ▀██████▀\n █▀▄ ▄▀███▀▀▀ \n █▀ ▄▄▀ ▄▀▄ \n ▄▀█▀▀▀███▄█ \n █ █ ▄▄ █▀ █ \n ▀▄█████▄█▄▄▄▀ \n █▄▄█▀▀▀█▄▄█ "], ["walk_2", "▄▄ ▄ ▄▄\n████▄▀▄▀▄▄██████\n ▀█▄ ▄▄█████▀ \n █▄▀ ▀▄▀▀█ \n ▀▄▄██▄▄█▄▀▄ \n ▄▀▄▀ ▀██▀▀▄ \n █ █▄██▄ █ █ \n█▄██▀▀▀▀▀▀████ "]]], + ["cherubimon_virtue", [["angry", "▄▄ ▄ ▄▄\n█ ▀▀▄▀▄▀▄▄▀▀ ▀ █\n ▀▄█ ▄▀█▄▄▄▀ \n █▀▀ ▀▀ █ \n █▄▄██▄▄▀▄▀█▄ \n █ ▀▄▀▄▀▄█▀▀ █ \n █▄▄█ █ ▄▀ \n█▄███▄▄▄▄▄███▄█ "], ["attack", "█▀▄▄ ▄ ▄ ▄▄▀▄▀█\n▀▄▄▀▀ ▀ ▀█▄ ▄▀\n ██▄ ▄█ ██▀▀ \n █ ▄▄▄▄ █▄▄▄▄ \n▄▀█ ████ ▄▀ █\n█▄▄█▀█▀█▀█▀█▀▄▄█\n ▄▀▀ ▀ ▀ ▀▄ \n █▄▄▄██▀▀█▄▄▄█ "], ["eat_1", "█▀▄▄ ▄ ▄ ▄▄▀▄▀█\n▀▄ ▄▀ ▀ ▀█▄ ▄▀\n █▄▀▄ ▄▀▄█▀▀▀ \n █ ▄▄▄ ▀▄ \n▄▀█▄ ███ ▄▀ ▀▀▄ \n█ █▀█▀█▀█ ▄▀ \n ▀█▀▀ ▀ ▀ ▀▀█ \n █▄▄▄██▀▀█▄▄▄█ "], ["eat_2", "▄▄ ▄ ▄▄\n█ ▀▀▄▀▄▀▄▄▀▀ ▀ █\n ▀▄▀▄ ▄▀█▄▄▄▀ \n █▀ ▀ ▀ ▀█ \n █▄▄██▄▄▀▄▀█▄ \n █ ▀▄▀▄▀▄█▀▀ █ \n █▄▄█ █ ▄▀ \n█▄███▄▄▄▄▄███▄█ "], ["happy", "█▀▄▄ ▄ ▄ ▄▄▀▄▀█\n▀▄ ▄▀ ▀ ▀█▄ ▄▄▄▀\n █▄▀▄ ▄▀▄██ ▀█\n █ ▄▄▄▄▄ █ ▄▀\n▄▀▀▄█████▄▀ ▄▀ \n█ ▄▀▄▀▄▀▄▀▄▀ \n ▀█ ▀▀▄ \n █▄▄▄██▀▀█▄▄▄█ "], ["injured_1", "▄▄ ▄ ▄▄\n█ ▀▀▄▀▄▀▄▄▀▀ ▀ █\n ▀▄▀▄ ▄ ▀█▄▄▄▀ \n █▀▀ ▀▀ █ \n ▀▄▄██▄▄▀▄▀▄ \n ▄▀█▄▀▄▀▄█▀ █ \n █ █ █ █ \n█▄███▄▄▄▄▄███▄█ "], ["injured_2", " \n█▀▄▄ ▄ ▄ ▄▄▀▄▀█\n▀▄ ▄▀ ▀ ▀█▄ ▄▀\n █ ▄ ▄ █▀▀▀ \n █▀▀ ▀▀▄▀▄ \n ███▀█▀█ ▄▄▀▄ \n ▄█ ▀█ ▀ █ █▄ \n█▄█▄▄█▄▄▄█▄▄▄█▄█"], ["sleep_1", " \n█▀▄ ▄ ▄ ▄▄▀▄▀█ \n█ ▄▀ ▀ ▀█▄ ▄▀ \n █ █▀▀▀ \n █▀▀ ▀▀▄█▄▄ \n ▄▀██▀█▀▄▀▄▄▀▄ \n█ ▀▀▄▀ ▀ █ █ █ \n█▄▄▄█▄▄▄▄█▄▄█▀ "], ["sleep_2", " ▄▄ ▄ ▄▄\n █ ▀▀▄▀▄▀▄▄▀ ▀ █\n ▀▄▀ ▀█▄▄▀ \n █▄▄ ▄▄ █ \n ▀▄▄▄▄▄▄█▄▄ \n ▄▀█▄▀▄▀▄▀▄▄ ▀▄ \n█ ▀▀▄ █ █ █ \n█▄▄▄█▄▄▄▄█▄▄█▀ "], ["walk_1", "█▀▄▄ ▄ ▄ ▄▄▀▄▀█\n▀▄ ▄▀ ▀ ▀█▄ ▄▀\n █ █ █ █▀▀▀ \n █ ▄▄ ▄▀▄▄ \n ▄█▀█▀█▀▄█▄▀▀▄ \n █ ▀█ ▀ ▀█ █ \n ▀▄▄█ ▀▄▄▄▀ \n █▄▄▄██▀▀█▄▄▄█ "], ["walk_2", "▄▄ ▄ ▄▄\n█ ▀▀▄▀▄▀▄▄▀▀ ▀ █\n ▀▄▀▄ ▄ ▀█▄▄▄▀ \n █ ▀ ▀ █ \n ▄█▄▄██▄▄▀▄█▀▄ \n█ ▀▀▄▀▄▀▄█ █ \n▀▄▄▄▀ ▀▄▄▄▄▀ \n█▄▄▄█▄▄▄▄▄█▄▄▄█ "]]], + ["cherubimon_virtue_x", [["angry", "▄▄ ▄ ▄ ▄ ▄▄▄▄\n█ ▀█▄█▄█▄█▄▀ ▄▀\n ▀▄▀▄ ▄▀▄▄▄▀ \n █ ▀▀ ▀▀ █ \n ▀▄▄██▄▄▀▄█ \n ▄▀█▄▀▄▀▄▀▀ █ \n █▄█ ▀▄▄█▀▀▄ \n█▄▄██▄▄▄▄█▄▄█▀▀ "], ["attack", "█▀▄▄▀▄▀▄▀▄ ▄▀▀▀█\n▀▄▄▀▀▀▀▀▀█▀ ▄▄▀ \n ██▄ ▄█ █▀ \n █ ▄▄▄ █▄ \n █▄████▄▀▄▀▀▄ \n █ █▄▀▄▀▄▀▀█ █ \n ▀█▀▄ ▄▀▀█▀▄ \n █▄▄▄█▀▀█▄▄▄▄█▀ "], ["eat_1", "█▀▄▄▀▄▀▄▀▄ ▄▀▀▀█\n▀▄ █▀▀▀▀▀█▀ ▄▀ \n █▄▀▄ ▄▀▄█▀▀ \n █ ▄▄▄▄ █ \n ▀▄████▄▀▄█ \n ▄▀█▄▀▄▀▄▀▄ ▀▄ \n ▀▄█▄ ▄▄█▄▄▀▄ \n █▄▄█▀▀▀█▄▄█▀▀▀ "], ["eat_2", "▄▄ ▄ ▄ ▄ ▄▄▄▄\n█ ▀█▄█▄█▄█▄▀ ▄▀\n ▀▄▀▄ ▄▀▄▄▄▀ \n █▀ ▀ ▀ ▀█ \n ▀▄▄███▄▄▀▄ \n▄▀▀█▄▀▄▀▄█▀ ▀▄ \n▀▄▄█ █▄▄▀▄ \n█▄▄██▄▄▄▄█▄▄█▀▀ "], ["happy", "█▀▄▄▀▄▀▄▀▄ ▄▀▀▀█\n▀▄ █▀▀▀▀▀█▀ ▄▀ \n █▄▀▄ ▄▀▄█▀▀ \n▄▀█ ▄▄▄ █▄▀▀▄ \n█ ▀▄▄███▄▀▄▀ ▄▀ \n ▀▄▀▄▀▄▀▄▀▄▄▀ \n ▄█▄ ▄█▄▀▄ \n █▄▄█▀▀▀▀█▄▄█▀ "], ["injured_1", " \n█▀▄▄▀▄▀▄▀▄ ▄▀▀▀█\n▀▄ █▀▀▀▀▀█▀ ▄▄▀ \n █▄█ █▄ █▀ \n █ ▄▄ ▄▀▄ \n ▄▀█▀█▀█▀▄▀▄ \n █ ▀▄▀▄▀ ▄█▀▄ \n█▄█▄▄█▄█▄▄█▄▄▄█ "], ["injured_2", " \n▄▄ ▄ ▄ ▄ ▄▄▄▄\n█ ▀█▄█▄█▄█▄▀ ▄▀\n ▀▄▀▄ ▄ ▀▄▄▀▀ \n █▀▀ ▀▀ █▄ \n █▄▄██▄▄█▀▄ \n █ ▀▀▄▀▄▀ ▄█▀▄ \n█▄█▄▄█▄█▄▄█▄▄▄█ "], ["sleep_1", " \n█▀▄▄▀▄▀▄▀▄ ▄▀▀▀█\n▀▄ █▀▀▀▀▀█▀ ▄▀ \n █▄▄ ▄▄ █▀▀ \n █ ▄▄ ▄▀▄ \n█▀▄█▀█▀█▀█▀█▄ \n█ ▀█ ▀ █ █▀▄ \n█▄▄▄█▄▄▄█▄▄▄█▀ "], ["sleep_2", "▄▄ ▄ ▄ ▄ ▄▄▄▄\n█ ▀█▄█▄█▄█▄▀ ▄▀\n ▀▄▀ ▀▄▄▄▀ \n █▀▀ ▀▀ █ \n ▀▄▄██▄▄▀▀▄ \n█▀▄█▄▀▄▀▄█▀▄▀▄ \n█ ▀▄ █ █ █ \n█▄▄▄█▄▄▄█▄▄▄█▀ "], ["walk_1", "█▀▄▄▀▄▀▄▀▄ ▄▀▀▀█\n▀▄ █▀▀▀▀▀█▀ ▄▀ \n █ █ █ █▀▀ \n █ ▄▄ ▄▀▄ \n █▀█▀█▀▄▀▄ \n ▄▀█▀ ▀ ▀▀▄ ▀▄ \n ▀▄█▄ ▄█▄▄▀▄ \n █▄▄█▀▀▀█▄▄█▀▀▀ "], ["walk_2", "▄▄ ▄ ▄ ▄ ▄▄▄▄\n█ ▀█▄█▄█▄█▄▀ ▄▀\n ▀▄▀▄ ▄ ▀▄▄▄▀ \n █ ▀ ▀ █ \n ▀▄▄██▄▄▀▄█ \n ▄▀█▄▀▄▀▄█▄ ▀▄ \n █▄█ █▄▄▀▄ \n█▄▄██▄▄▄▄█▄▄█▀▀ "]]], + ["chibickmon", [["angry", " \n \n \n ▄▀▀▄ \n █▀█▀ ▄▀▀▀█ \n ▀▄█ ▄ █ \n ▄▀▀▀ ▀▀ ▀▄ \n ▀▄▄▄██▄▄▄▄▀ "], ["attack", " \n ▄▄ \n ▄▀▄▄▀ ▀▄▀█ \n █ █ ▀ █ \n ██▄ ▄█ ▄▀ \n ▄▀ ▄▄▄▄ ▀▄ \n █ ▀▀▀▀ █ \n █▄█████▄█ "], ["eat_1", " \n ▄▄ \n ▄▄▄▄▀ ▀▄▄▄▄ \n █ █ ▀ ▄▀ \n █ ▀ ▀ ▄▀ \n ▄▀ ███ ▀▄ \n █ ▀▀ █ \n █▄▀▀▀▀▀▄█ "], ["eat_2", " \n \n \n ▄▀▀▄ \n █▀█▀ ▄▀▀▀█ \n ▀▄▀▄ ▄ █ \n ▄▀ ▄▄▄ ▀▄ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["happy", " \n \n ▄ ▄▀▀▄ ▄▄ \n █ █▀ ▀ █ \n ▀▄▀▀ ▀ █ \n ▄▀ ████ ▀▄ \n █ ▀▀ █ \n █▄▀▀▀▀▀▄█ "], ["injured_1", " \n \n \n ▄▀▀▄ \n ▄▄▀ ▄▀▄ \n ▄▀▄▀▄ ▄ ▄ ▀▄ \n ▀▄▀▀▀ ▀▀ ▀▄▀ \n ▀▄▄▄██▄▄▄▄▀ "], ["injured_2", " \n \n \n ▄▄▄▄ \n ▄█▀ ▄▀▄ \n ▄▀▄▀ ▄ ▀▄ \n █▄▀▄█ █▄ ▀▄ █ \n ▀▄▄▄██▄▄▄▄▀▀ "], ["sleep_1", " \n \n \n ▄▀▀▄ \n ▄▄▄█▀ ▄▀▄▄▄ \n ▀▄▄▀ ▄▀ \n ▄▀▀▀ ▀▀ ▀▄ \n ▀▄▄▄██▄▄▄▄▀ "], ["sleep_2", " \n \n \n ▄▀▀▄ \n █▀█▀ ▄▀▀▀█ \n ▀▄█▄ ▄▄ █ \n ▄▀ ▄▄ ▀▄ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["walk_1", " \n \n ▄▄ \n ▄▄▄▄▀ ▀▄▄▄▄ \n █ █ ▀ ▄▀ \n █ ▀ ▀ ▄▀ \n █ ▀▀▀ █ \n █▄▀▀▀▀▀▄█ "], ["walk_2", " \n \n \n ▄▀▀▄ \n ▄▄▄█▀ ▄▀▄▄▄ \n ▀▄▄▀▄ ▄ ▄▀ \n ▄▀ ▄▄▄ ▀▄ \n ▀▄▄▄▄▄▄▄▄▄▀ "]]], + ["chibomon", [["angry", " \n \n ▄▄ \n ▄▄▀ █ \n █ ▄▀ \n ▄▀▀ ▀▀▄ \n █ █▄ ▄█ █ \n ▀▄▄██▄▄▀ "], ["attack", " \n ▄▄▄ \n ▄▀▀▀ ▄▀ \n ▄▀ ▀█ \n █▄▄ ▄█ █ \n █ ▄▀ \n ▀█▄▄▀ \n ▄▄▄▄ "], ["eat_1", " \n \n \n ▄▄▄▄ \n █▄ ▄▀▄▄ \n ▀▄ ▀▄▄\n ▄▄█ █▄▄▄▀\n ▀▄▄▄▄▄▀ "], ["eat_2", " \n \n \n ▄▄ \n ▄▀▀▀ █ \n ▄▀▀ ▄▀ \n █▄ ▄ █ \n ▀▄██▄▄▄▀ "], ["happy", " \n \n ▄▄▀█ \n █ ▄▀ \n ▄▀▄ ▄▀▄ \n █ ▄▄ █ \n ▀▄██▄▀ \n ▄▄▄▄ "], ["injured_1", " \n \n \n ▄▄▄ \n ▄▄▀ ▀▄ \n ▄▀▄ ▄▀▀▄▄█ \n █ ▀▀▄▄▀▀ █ \n ▀▄▄██▄▄▀ "], ["injured_2", " \n \n \n \n ▄▄▄▄ \n ▄▀▀ ▄▄▀▄ \n ▄▀▄█ █▄ █▄█ \n ▀▄▄▄██▄▄▄▀ "], ["sleep_1", " \n \n \n \n ▄▄▀▀▀▀▄▄▄ \n ▄▀ ▀▄ ▄▀ \n █▀▀ ▀▀█▀ \n ▀▄▄██▄▄▀ "], ["sleep_2", " \n \n \n \n ▄▄▄▄ \n ▄▄▀ ▄ ▀▀█ \n █▄▄ ▄▄█▀▀ \n █▄▄▄▄▄▄█ "], ["walk_1", " \n \n \n ▄▄▄ \n ▄▀▀ ▄▀ \n ▄▀ ▀▄ \n █ ▀ ▀ █ \n ▀▄▄██▄▄▀ "], ["walk_2", " \n \n \n ▄▄ \n ▄▀ █ \n █ ▄▀ \n ▄▀▄ ▄▀▄ \n ▀▄▄▄▄▄▄▀ "]]], + ["cho_hakkaimon", [["angry", " ▄▄▄ ▄▄ \n▄▀ ▄▀▀▀▀▀▀▀▀▄ ▀▄\n▀▀█ █▄ ▄█ █▀ \n █ ▄█▀▀▀█▄ █ \n ▄███ ▀ ▀ █▄█▄▄ \n█ ▄▄█▀▀██▀ █▄ █\n █▀ █ █ ▀█ \n █▄█▄█▀▀▀▀█▄█▄█ "], ["attack", " ▄▀█▄▄▄▄▄▄▀▀▄\n ▀▄▀ ▄ ▀▄▀\n █▄▀▀▀▄▀▀ █ \n ▄ █▄▀ ▀ █ ▄▀ \n█▄█ ▄▀█▀▀██▀▀▄ \n█▄███████ ▄█ \n▀▄▀ ▄▀▀▄▀██ ▀▄\n █▄█▄█ █▄█▄█"], ["eat_1", " ▄▀▀█▄▄▄▄▄▄▄▀▀▄ \n█▄▄█▄ ▄▄▄ ▄▄▀▄▄█\n █ ▄▀▄ ▄▀▄ █ \n ▀▄▀▄▄▄▄▄▀ ▄▀ \n ▄▀▀█▄███▄██▀▀█ \n █ ▄█▄ ▀▀ ▄█▄ █ \n █▀ █▄▄█ ▀█ \n █▄█▄█ █▄█▄█ "], ["eat_2", " ▄▄▄ ▄▄ \n▄▀ ▄▀▀▀▀▀▀▀▀▄ ▀▄\n▀▀█▄▀▄▄▄▄ ▄▀▄█▀▀\n █ ▄▀▄ ▄▀▄ █ \n ▀██▄▄▄▄▄█▄█ \n █ ▀▄▀██▀▄▀ █ \n ▄▀▀▀▄ ▄▀▀▀▄ \n █▄█▄█▀▀█▄█▄█ "], ["happy", "█▀▀▀▄▄▄▄▄▄▄▄▄▀▀█\n ▀▄▀▄▀▄▄▄ ▄▀▄█▀ \n █ ▄▀▄ ▄▀▄ █ \n█▀█▄▀▄▄▄▄▄▀ ▄▀▀▄\n █ ▀█▄▄▄▄▄▄█▀ █ \n ▀▄█▄ ▀▀▄▀▀█▀ \n █▀ █▄▄█ ▄ █ \n █▄█▄█ ▀▀▀▀▀ "], ["injured_1", " \n \n ▄▀▀█▄▄▄▄▄▄▄▀▀▄ \n█▄▄▀ ▀▄▄█\n █▀▀▄▀▀▀▄▀▀ █ \n █▄█ ▀ ▀ █ ▄▀▄ \n ▄██▀████▀█▀▄ █\n █▄▄█▄▄██▄▄█▄▄██"], ["injured_2", " \n \n \n ▄▀▄▀▀▀▀▀▀▀▀▄▀▄ \n█ █▄▄ ▄▄▄ ▄▄ █ █\n ▀█ ▄▀▄ ▄▀▄ █▀▄\n ███▄▄▄▄▄▀▄▀▄ █\n █▄▄█▄▄██▄▄█▄▄██"], ["sleep_1", " \n \n▄▀▀▄▀▀▀▀▀▀▀▀▄▀▀▄\n█ █ █ █\n▀▀█▀▀▄▀▀▀▄▀▀ █▀▀\n █▀█ ▀ ▀ █▄▀▄ \n ▀▄▄██████▄▄▀ \n █▄▄▄█▄▄█▄▄▄█ "], ["sleep_2", " \n ▄▀▀█▄▄▄▄▄▄▄▀▀▄ \n█▄▄▀ ▀▄▄█\n █▀▀▄▀▀▀▄▀▀ █ \n █▄█ ▀ ▀ █ ▄▀ \n ▄▀▀██████▀▀▄ \n ▀▄▄▄█▀▀▄▄▄▄▀ \n █▄▄▄█▄▄█▄▄▄█ "], ["walk_1", " ▄▀▀█▄▄▄▄▄▄▄▀▀▄ \n█▄▄▀▄ ▄ ▀▄▄█\n █ ▄▀▀▀▄ █ \n █▄█ ▀ ▀ █ ▄▀ \n ▄▀█▀████▀█▀▄ \n █ ▄█▄ ▀▀ ▄█▄ █ \n █▀ █▄▄█ ▀█ \n █▄█▄█ █▄█▄█ "], ["walk_2", " ▄▄▄ ▄▄ \n▄▀ ▄▀▀▀▀▀▀▀▀▄ ▀▄\n▀▀█ ▀ ▄▄▄ ▀ █▀▀\n █ ▄▀▄ ▄▀▄ █ \n ▄███▄▄▄▄▄█▄█▄▄ \n█ ▄▄█ ▀██▀ █▄▄ █\n █▀ █ █ ▀█ \n █▄█▄█▀▀▀▀█▄█▄█ "]]], + ["choromon", [["angry", " \n \n \n \n ▄ ▄ \n █▄▄▄█ \n █▄▄█▄▄█▄ \n ██▄▄▄███ "], ["attack", " \n \n ▄▀ ▄▄ \n ▄█▀█▄ \n ██▄████ \n ▀█ \n █ \n ▀██████▄ "], ["eat_1", " \n \n \n ▄▀ ▄▀ \n ▄▀█▀█▄ \n █▄█▄██▄ \n █ ███ \n █▄▄▄████ "], ["eat_2", " \n \n \n \n ▄ ▄ \n █▄▄█ \n █▄█▄█▀▄ \n █▄▄▄▄███ "], ["happy", " \n ▄▀ ▄▀ \n █▀█▀█▄ \n ██▄█▄██ \n █ ██ \n ▀█▄▄▄████ \n ▀▀▀▀▀▀ \n ▄▄▄▄▄▄ "], ["injured_1", " \n \n \n \n \n ▄▄ ▄▄ \n ▄▀█▀▀▄ \n ▄███████▄ "], ["injured_2", " \n \n \n \n \n \n ▀▀▄▄▄▄▀▀ \n ▄█▄█▄▄██▄ "], ["sleep_1", " \n \n \n \n \n ▄▀ ▄▀ \n ▄████▄▄ \n █▄█▄▄██▄ "], ["sleep_2", " \n \n \n \n ▄ ▄ \n █▄▄█ \n █▀█▀▀█▄ \n ████████ "], ["walk_1", " \n \n \n \n ▄▀ ▄▀ \n ▄▀█▀█▄ \n █▄█▄███ \n ██▄█████ "], ["walk_2", " \n \n \n \n ▄ ▄ \n █▄▄█ \n █▀█▀██▄ \n █▄█▄████ "]]], + ["clockmon", [["angry", " \n ▄▄ ▄▀▀▄ ▄▄ \n █ ▄▀▀▀███▄ █ \n ▄▄▄▀▄▀▀▀▄▀███ █\n █▄█ █▀▄▀█ █▄ ▀█\n█ █▀▄▀▄▄▄▀▄█▄▄█▀\n▀▀▀███▄▄▄██████ \n █▄▄███ ██▄▄█"], ["attack", " ▄▄ ▄▀▀▄ ▄▄ \n █ ▄▀▀▀███▄ █ \n ▄▄▄▀▄▀█▀▄▀███▄█\n▄█▄█ █████ █▀▀ █\n█ ██ █████ █▀ ▄█\n▀▀▀█ █▀█▀█ ████ \n █▄▀▀▀▄████ \n █▄▄███ ██▄▄█ "], ["eat_1", " ▄▄ ▄▀▀▄ ▄▄ \n █ ▄▀▀▀███▄ █ \n ▄▀▄▀█▀▄▀███▄█\n █ █████ ███▄█\n ▄▄█ █████ ███ █\n▄█▄█ █▀ █ █▄ ▀█\n█ █ █▄▀▀▀▄██▄▄▀ \n▀▀▀█▄▄███ ██▄▄█ "], ["eat_2", " ▄▄ \n ▄▀▀▄█▄▄█▄▀▀▄ \n ▀▄▀▄▄▄▀███▄▀▄\n █▀█ █ ▄ █ █▀▀▄█\n█▀██ █▀ ▀█ █▀ ▄█\n█▄█▄█▄▀▀▀▄█████ \n ▄▄███▀▀▀███▄ \n █▄▄███ ██▄▄█"], ["happy", " ▄▄ ▄▀▀▄ ▄▄ \n █ ▄▀▀▀███▄ █ \n ▄▀▄▀▀▀▄▀█▀▀▄█\n █ █▀▄▀█ █▀ ▄█\n ▄█ █▄▄▄▄▄█ ████\n █▄ ██▀▀ █ ███ \n█ █▀▄▀▀▀▀▀▄███ \n▀▀▀█▄▄███▀██▄▄█ "], ["injured_1", " \n ▄▄ ▄▀▀▄ ▄▄ \n █ ▄▀▀▀███▄ █ \n ▄▀▄███▄▀███ █\n █▀█ █▀▀▀█ ███▀█\n█▀█▀▄▀███▀▄█▀▀▄█\n█▄████▄▄▄███▀ ▄█\n █▄▄███ ███▄█"], ["injured_2", " \n ▄▄ \n ▄▀▀▄█▄▄█▄▀▀▄ \n ▀▄▀▄▄▄▀███▄▀▄\n ▄▄█ █████ ███▄█\n▄█▄█ █▄▄▄█ ███ █\n█ █▄█▄▀▀▀▄██▄ ▀█\n▀▀█▄▄███▀▀▀█▄▄██"], ["sleep_1", " \n ▄▄ \n ▄▀▀▄█▄▄█▄▀▀▄ \n ▀▄▀▄▄▄▀███▄▀▄\n ▄█ █ █ ███▄█\n▄▀▄█ █▀▀▀█ ██▀▄█\n▄▀█▄█▄▀▀▀▄██ ▄ █\n▀▄█▄▄███▀▀▀█▄█▄█"], ["sleep_2", " \n ▄▄ ▄▀▀▄ ▄▄ \n █ ▄▀▀▀███▄ █ \n ▄▀▄▀▀▀▄▀███ █\n ▄▀█ █▄▄▄█ ███▀█\n▀▄█▀▄▀▄▄▄▀▄██▀▄█\n▄▀ ▄█▄▄▄███ ▄ █\n▀▄██▄▄██ █▄█▄█"], ["walk_1", " ▄▄ ▄▀▀▄ ▄▄ \n █ ▄▀▀▀███▄ █ \n ▄▀▄▀█▀▄▀███▄█\n ▄▄█ █ ▀▄█ ███ █\n▄█▄█▄▀▄▄▄▀▄█▄ ▀█\n█ █ █▄▄▄███▄▄█▀\n▀▀▀▀█▄█▄█ █▄█▄ \n █▄▄███ ██▄▄█ "], ["walk_2", " ▄▄ \n ▄▀▀▄█▄▄█▄▀▀▄ \n ▀▄▀▄▄▄▀███▄▀▄\n █▀█ █ ▄█ █▀▀▄█\n█▀██ █ █ █ █▀ ▄█\n█▄█▄█▄▀▀▀▄█████ \n ▄▄███▀▀▀███▄ \n █▄▄███ ██▄▄█"]]], + ["coelamon", [["angry", " ▄▄ \n ▄▀ █ ▄▄\n ▄▄▀▀▀▀▀█▀▄▄▀ █\n▄▀ ▄▀ █ ▀ █\n█▄█▄ ▄▀▄▄ ▄ █\n ▀▄▄ █▀ ▀▀▄█▀\n ▀▀▀█ ▄ ▀▄▀ \n ▀▄▄▀▀ "], ["attack", " ▄▄ \n ▄▀▀ █ ▄▄\n ▄▄▀▀▀▀▀▀█▀▄▄▀ █\n█ ▄█ █ ▀ █\n▀▀▀▀▀█ █ ▄▄▄ █\n █ ▄▀▄▀ █▀\n █▀▀▀▀▄█▄█ ▄ ▄ █\n ▀▀▀▀ ▀▄▀▄▀▄▀"], ["eat_1", " \n ▄▄▀▀▀█ ▄▄\n ▄▄▀▀▀█▀▀█▀▄█▀ █\n█ ▀ ▀ █ ▀ █\n▀▀▀████ ▀▄▄▄▄▀▄█\n ███▀▄▀ ▄▄█ \n ▄▀▀▀ ▄▀▄ ▄▄█ \n ▀▀▀▀ ▀▀▄▄▄▀ "], ["eat_2", " ▄▄ \n ▄▀▀ █ ▄▄\n ▄▄▀▀▀▀▀█▀▄▄▀ █\n▄▀ ▄▀▄ █ ▀ █\n█▄█▄ ▄▀▄▄ ▄ █\n ▀▄▄ █▀ ▀▀▄█▀\n ▀▀▀█ ▄ ▀▄▀ \n ▀▄▄▀▀ "], ["happy", " \n ▄▀▀▀█ ▄▄\n ▄▄▀▀▀█▀▀█▀▄█▀ █\n█ ▀ ▀ █ ▀ █\n▀▀▀████ ▀▄▄▄▄▀▄█\n ███▀▄▀ ▄▄█ \n ▄▀▀▀ ▄▀▄ ▄▄█ \n ▀▀▀▀ ▀▀▄▄▄▀ "], ["injured_1", " \n \n ▄▄▄▄ \n ▄▄▄██▄▄▄▀ ▄▄\n ▄▀▀ █ ▀██▄█\n█ ▄ ▄▀▀▀ ▄▄█\n▀█ ▀▀ █ ▄▄█\n ▀▀▄▄▄██▄▄▄▄▄▄█"], ["injured_2", " \n \n \n ▄▄▀▀▀█ ▄▄\n ▄▄▀▀▀▀▀█▀█▄▄██\n▄▀ ▄▀▀▀ ▄▄█\n█▄ ▀▄▄ █ ▄▄█\n ▀▄▄▄▄▄██▄▄▄▄▄▄█"], ["sleep_1", " \n \n ▄▄▀▀▀█ \n ▄▄▀▀▀▀▀█▀█▄▄▀█\n▄▀ ▄▄▄ █▄▄▄█▄█\n█▄█▄ ▄▀ ▄▄█\n ▀▄▄ █▄ ▄▄█\n ▀▀▀▀▀▀▀▄▄▄▄▀"], ["sleep_2", " ▄▄ \n ▄▀▀ █ ▄▄\n ▄▄▀▀▀▀▀█▀▄▄▀ █\n▄▀ ▄▄▄ █ █\n█▄█▄ ▄▀▄▄ ▄ █\n ▀▄▄ █▀ ▀▀▄█▀\n ▀▀▀█ ▄ ▀▄▀ \n ▀▄▄▀▀ "], ["walk_1", " ▄▄ \n ▄▀▀ █ ▄▄\n ▄▄▀▀▀▀▀█▀▄▄▀ █\n▄▀ ▄█▀ █ ▀ █\n█▄▄█▄ ▄▀▄▄ ▄ █\n ▀▄▄ █▀ ▀▀▄█▀\n ▀▀▀█ ▀▄▀ \n ▀▄▄▀▀ "], ["walk_2", " ▄▀█ \n ▄▀ █ \n ▄▄▀▀▀▀▀█▀▄▄ ▄▄\n▄▀ ▄█▀ █ ▀ █\n█▄▄▄▄ ▄▀▄▄ ▄ █\n ▄▀▀ █▀ ▀▄▄ █\n ▀▀▀▀▀█ ▄ ▄ █▀▀\n █▄▀▄█▀▀ "]]], + ["conomon", [["angry", " \n \n \n ▄▄ ▄ ▄ \n ▄▄▄█ ▀▄▀▄ █ ▀ █\n ▀▄ ▀ ▀ ▀▄ █ █\n ██▄ ▄█ █▀ ▄▀\n ▀▄▄▄▄▄▄▄▄▄▀▀▀ "], ["attack", " \n \n █▀▄ ▄ ▄▀▄▀▄ \n █▀▀█ █ █▀▄ █\n ▄▀▄ ▄ ▀▄█ █\n █ ▀▀ ▀▀ █▄▄▀ \n █ █████▄ █ \n ▀▄██████▄▀ "], ["eat_1", " \n \n █▀▄ ▄ ▄ ▄ \n █▀▀█ █ █ █ ▀ █\n ▄▀▄ ▄ ▀▄█ █\n █▀ ▀ ▀ ▀ █▀ ▄▀\n █ █████ █▀▀ \n ▀▄█████▄▄▀ "], ["eat_2", " \n \n \n ▄▄ ▄ ▄ \n ▄▄▄█ ▀▄▀▄ █ ▀ █\n ▀▄ ▀ ▀ ▀▄ █ █\n █▄▀▄ ▄▀▄ █▀ ▄▀\n ▀▄▄▄▄▄▄▄▄▄▀▀▀ "], ["happy", " \n \n █▀▄ ▄ ▄▀▄▀▄\n █▀▀█ █ █ ▀▄ █\n ▄▀▄ ▄ ▀▄█ █\n █▀ ▀ ▀ ▀ █▄▄▀ \n █ █████ █ \n ▀▄▄███▄▄▄▀ "], ["injured_1", " \n \n \n ▄▄ \n ▄▄▄█ ▀▄▀▄ ▄▀▄▀▄\n ▀▄ ▀ ▀ ▀▄▀▄ █\n █▄▀ ▀▄ ██ █\n ▀▄▄███▄▄▄▄█▄▄▀ "], ["injured_2", " \n \n \n \n █▀▄ ▄ ▄ ▄ \n █▀▀█ █ █ █ ▀ █\n ▄▀ ▀▄█ █\n ███▄▄▄██▄▄█▄▄▄▀"], ["sleep_1", " \n \n \n █▀▄ ▄ ▄ ▄ \n █▀▀█ █ █ █ ▀ █\n ▄█▄ ▄▄ ▀▄█ █\n █ ▄▄▄ █ ▄▀ \n ▀▄▄▄▄▄▄▄▄██▀ "], ["sleep_2", " \n \n \n ▄▄ \n ▄▄▄█ ▀▄▀▄ ▄▀▄▀▄\n ▀▄ ▀ ▀ ▀▄▀▄ █\n █▀▀ ▀▀ ██ █\n ▀▄▄██▄▄▄▄▄█▄▄▀ "], ["walk_1", " \n \n \n █▀▄ ▄ ▄▀▄▀▄\n █▀▀█ █ █ ▀▄ █\n ▄▀▄ ▄ ▀▄█ █\n █ ▀▄▄▄▀ █▄▄▀ \n ▀▄▄▄▄▄▄▄▀ "], ["walk_2", " \n \n \n ▄▄ ▄ ▄ \n ▄▄▄█ ▀▄▀▄ █ ▀ █\n ▀▄ ▀ ▀ ▀▄ █ █\n █ █ █ █▀ ▄▀\n ▀▄▄███▄▄▄▄▀▀▀ "]]], + ["coredramon_blue", [["angry", " █▀▄▀▀▀▀▀█▀▀█ \n ▄▀▄▄█ ▄█ █▀▄▄ \n▄█▄▄▄▄▄▄▄ █▄▄██\n█ ▀▄█▄█▄██ █ ██\n█ ▄█▄█▄█▄▀ █ ██\n█ ▀▄▄▄▄▄▄ ▀ ▄▀█\n ▀█▀▄ ▄ ▀▀▄ ▀\n █▄█▄██▀█▄█▄█▄█ "], ["attack", "▄▄ ▄▄▄▄▄▄▄▄▄ \n█ █▀ ▀▄▄▄▀ \n█▀ ▄██ █ ▀▄ █▄\n█ ▄▄▄▄ █▀████\n ▀▄▄▄ ▀ ▄ ▀▄▄███\n▄▀▀█ ▄▀ █ ▀██\n▀▄▄█▄ ▀▄▄▄█▀▀▀▄█\n█▄█▄█▀▀▀█▄▄█▄█▄█"], ["eat_1", "▄▄ ▄▄▄▄▄▄▄▄▄ \n█ █▀ ▀▄▄▄▀ \n█▀ ▄██ █ ▀▄ █▄\n█ ▄▄▄▄ █▀████\n ▀▄▄▄ ▀ ▄ ▀▄▄███\n▄▀▀█ ▄▀ █ ▀██\n▀▄▄█▄ ▀▄▄▄█▀▀▀▄█\n█▄█▄█▀▀▀█▄▄█▄█▄█"], ["eat_2", "▄▀█▄▀▀▀▀▄▄▄▄▄▄ \n█▀▀ ▄▄▄▀▄▄▄▀ ▄\n█▄▄▄▄▄ █ ▀▄██\n ██████ █▀████\n█ ██ ▀▀ ▀▄▄███\n▀▄█ ▀▄▄▄ █ ▀██\n █▄█▄ ▄▄ ▀█ ▀\n█▄█▄▄█▀█▄▄█▄█▄█ "], ["happy", " █▀▄▀▀▀▀▀█▀▀▀█ \n █▀▄█ ▄▀▀ ███▄ \n █▄▄▄▄▄▄ █ ▀█\n ▀███ █ ▀▄▄ █\n ▄█▀▀▀▀ ▄ ▀ ▄██\n█ █▀▀▀▀ █▀ ▀█\n ▀█▀▄ ▄ ▀▀▄ ▀\n █▄█▄█▀▀█▄█▄█▄█ "], ["injured_1", " ▄ ▄▄▄▄▄▄▄▄▄ ▄ \n ██▀ ▀▄▄███▄\n██▀ ▀▄ ███\n█▀▄ ▀▄▄ ▀█▀██\n▀▄▄█ ▄ █ ▀\n ▄▀▄▄▄▄▀ █ █ \n █ ▀▄ ▄▀ █▀▀▄ \n█▄█▄██▀█▄▄█▄▄█▄█"], ["injured_2", " \n ▄█▄▀▀▀▀▀█▀▀█▄█ \n▄██ █▀▀███\n██ ▄ █▄███\n█ ▀▄ ▀▀ ▀▄▀█\n ▀█▀ ▄▀ █ █ \n █ ▀█▀▀▄▀ █▀▀▄ \n█▄█▄██▀█▄▄█▄▄█▄█"], ["refuse", "▄▄ ▄▄▄▄▄▄▄▄▄ \n█ █▀ ▀▄▄▄▀ \n█▀ ▄█ █ ▀▄ █▄\n█ ▀▀ █▀████\n▀█▀▀▀▀▄ ▄ ▀▄▄███\n ▄▀█▀ ▄▀▀ █ ▀██\n█▄▄█▄ ▀▄▄▄▀▀▀█▀█\n▀█▄█▄█▀█▄▄█▄█▄█ "], ["sleep_1", " ▄ ▄▄▄▄▄▄▄▄▄ ▄ \n ██▀ ▀▄▄███▄\n██▀ ▀▄ ███\n█▀▄ ▀▄▄ ▀█▀██\n▀▄▄█ ▄ █ ▀\n ▄▀▄▄▄▄▀ █ █ \n █ ▀▄ ▄▀ █▀▀▄ \n█▄█▄██▀█▄▄█▄▄█▄█"], ["sleep_2", " ▄ ▄▄▄▄▄▄▄▄▄ ▄ \n ██▀ ▀▄▄███▄\n██▀ ▀▄ ███\n█▀▄ ▀▄▄ ▀█▀██\n▀▄▄█ ▄ █ ▀\n ▄▀▄▄▄▄▀ █ █ \n █ ▀▄ ▄▀ █▀▀▄ \n█▄█▄██▀█▄▄█▄▄█▄█"], ["walk_1", "█▀▄▄▀▀▀▀█▀▀▀█ \n█▄▀ ▄▄ █▀█ ▄ \n█ ▀▀▀ ▀▄▄█▄██\n▀▄▀▀▀▀▄ █ ▀███\n ▄▀█▀ ▄▄▄ █▀███\n█ █ █ ▄█▄▄▀█\n █▀▀▄ ▀▀█▀ ▀▄ ▀\n█▄█▄▄█▀█▄▄█▄█▄█ "], ["walk_2", "▄▄ ▄▄▄▄▄▄▄▄▄ \n█ █▀ ▀▄▄▄▀ \n█▀ ▄██ █ ▀▄ █▄\n█ ▄▄▄▄ █▀████\n ▀▄▄▄ ▀ ▄ ▀▄▄███\n▄▀▀█ ▄▀ █ ▀██\n▀▄▄█▄ ▀▄▄▄█▀▀▀▄█\n█▄█▄█▀▀▀█▄▄█▄█▄█"]]], + ["coredramon_green", [["angry", " █▀▄██████▀▀█ \n █▄▄███▀ ██▀▄ \n ██████▄▄███▄▄█ \n▄█ █ █ █▀██▀▄▄▀█\n██▄█▄█▄█▄█▀▄██ █\n▀█▄▄▄▄▄▄▄▄███▀▄█\n ▄▄█████████▄▄ ▀\n█▄█▄██▀▀█▄█▄█▄█ "], ["attack", "▄▄ ▄▄▄▄▄▄▄▄▄▄ \n█ ████▀▀█▄▄▄▀ ▄ \n█▄███▄▄▄██ ▀▄▀ █\n █▀▀▀▄▀████▀█ █\n ▀▀████▀██▄▄█ █\n▄█ ███▀▄██▀█ ▀▄█\n▀█▄███▄▀▀▀▄███▄▀\n█▄█▄█▀▀▀▀█▄█▄█▄█"], ["eat_1", "▄▄ ▄▄▄▄▄▄▄▄▄▄ \n█ ████▀▀█▄▄▄▀ ▄ \n█▄███▄▄▄██ ▀▄▀ █\n █▀▀▀▄▀████▀█ █\n ▀▀████▀██▄▄█ █\n▄█ ███▀▄██▀█ ▀▄█\n▀█▄███▄▀▀▀▄███▄▀\n█▄█▄█▀▀▀▀█▄█▄█▄█"], ["eat_2", "█▀▄██████▄▄▄▄▄ \n▀▄███▄▄▄██▄▄▄▀ \n ▀████ ▀▄▄▀▄\n▄██ ▄█████▀█ █\n██ ▀███ ███▄▄█ █\n ▀ ███ ███ █ ▀▄█\n ▄▄████▄▄▄████▀█\n█▄█▄██▀▀█▄█▄█▄█ "], ["happy", " █▀▄▄█████▀▀▀█ \n █▄███▀▄▄██▀█▄▄ \n ▀▀▀▀▀████▄▄▀ █\n ▄███▀▄▄█ █\n██ ▀▀▀▀██▀▄███ █\n▀██ █████████▀▄█\n ▄▄▄███████▄▄▄ ▀\n█▄█▄██▀▀▀▄█▄█▄█ "], ["injured_1", " ▄ ▄▄▄▄▄▄▄▄ ▄ \n █ ▀██████▄▄█▀ █\n█ ▄████████▄ █ █\n█▀████▄▀▀███▀█ █\n▀▄ █████▀█████▄█\n ▀▀▀▀▄▄███▀██ ▀\n ▄▀████▀▄█▀▄██▄ \n█▄█▄▀▀▀▄▄▄██▄█▄█"], ["injured_2", " \n ▄▀▄▄█████▀▀█▄▀▄\n▄▀ ▄███████▀▀▄ █\n█▄████▀█████▄█ █\n█ ▀████▄▄███▄█ █\n ▀▄███▀▀▄██▀██▀█\n ▄ ▄▄▄█▀▄█▀▄██▄ \n█▄█▄▀▀▀▄▄▄██▄█▄█"], ["refuse", "▄▄ ▄▄▄▄▄▄▄▄▄ \n█ ███████▄▄▄▀ \n█▄████▀ ██ ▀▄▀▀▄\n█████▄▄████▀█ █\n▀█▀▀▀▄▀██▀█▄▄█ █\n ▄▀████▀▄▄██ ▀▄█\n█▀▄████▄▀▀▀▄██▀█\n █▄█▄█▀▀▀███▄██ "], ["sleep_1", " ▄ ▄▄▄▄▄▄▄▄ ▄ \n █ ▀██████▄▄█▀ █\n█ ▄████████▄ █ █\n█▀████▄▀▀███▀█ █\n▀▄ █████▀█████▄█\n ▀▀▀▀▄▄███▀██ ▀\n ▄▀████▀▄█▀▄██▄ \n█▄█▄▀▀▀▄▄▄██▄█▄█"], ["sleep_2", " ▄ ▄▄▄▄▄▄▄▄ ▄ \n █ ▀██████▄▄█▀ █\n█ ▄████████▄ █ █\n█▀████▄▀▀███▀█ █\n▀▄ █████▀█████▄█\n ▀▀▀▀▄▄███▀██ ▀\n ▄▀████▀▄█▀▄██▄ \n█▄█▄▀▀▀▄▄▄██▄█▄█"], ["walk_1", "█▀▄██████▀▀▀█ \n█ ███▀ ██▀█ ▄▀▄\n▀████▀████▄▄█ █\n ▀▄▄▄█▄████ ▀▄ █\n ▄ ▄██▀▀ ███▀█ █\n██ ██ ████▀█▄▄▀█\n ▄▄███▄▄▄▄███▄ \n█▄█▄██▀▀█▄█▄█▄█ "], ["walk_2", "▄▄ ▄▄▄▄▄▄▄▄▄▄ \n█ ████▀▀█▄▄▄▀ ▄ \n█▄███▄▄▄██ ▀▄▀ █\n █▀▀▀▄▀████▀█ █\n ▀▀████▀██▄▄█ █\n▄█ ███▀▄██▀█ ▀▄█\n▀█▄███▄▀▀▀▄███▄▀\n█▄█▄█▀▀▀▀█▄█▄█▄█"]]], + ["coronamon", [["angry", " ▄▄▄▀ ▄ \n ▄▀███▄▄▄▀ █ \n ▀█▀ ▄▄▀ ▄▀ \n █ ▀▀ █ ▄ \n █▀ ▄▀ ▄██\n ▄▀▀▀███▀▀▀▀▄▀▄▀\n ▀▄▄▀▄▀ ▀▄▄▀ █ \n █▄▄▄▀▀▄▄▄█▀▀ "], ["attack", " ▄███▀ ▄▀▄ ▄\n█▄█▀▀▀▀█ █ ▄██\n▄▀ ▄█▀ ▄▀▀▄▀▄▀\n▀███▄ ▄▀ ▄▀ █ \n ▀█▀ ▄█ █▀▄▀ \n ▄▀▀█▀ ▄▀▀▄ \n ▀▄ ▄▀▀█ ▄▀ \n ▀▀ ▀▀ "], ["eat_1", " ▄███▀ ▄▀▄ \n █▄█▀▀▀▀█ █ \n ▄▀ ▄▀▄ █ \n ▀▄▄▄ █ ▄█\n ██ ▄▄▀ █▀█\n ▄▀█▄▄▄▀ ▀▄ █ \n █ ▄▀█▀ █ █▄▀ \n █▄▄▄▀▀▄▄██ "], ["eat_2", " ▄███▀ ▄▀▄ \n █▄█▀▀▀▀█ █ \n ▄▀ ▄▀▄ █ \n ▀▄▄▄ █ ▄█\n ▀▄▄▄▄▄▄█ █▀█\n ▄▀▄▀█▀ ▄ ▀▄ █ \n ▀▄▀▄ ▄▀▄▄█▄▀ \n █▄▄▄▀▀▄▄▄█ "], ["happy", " ▄███▀ ▄▀▄ \n █▄█▀▀▀▀█ █ \n ▄▀ ▄▀▄ █▄ \n▄▀▀███ █ ▄▀▄█\n ▀▄ ██▄▄▄█ ▄▀█▀█\n ▀▄▀█▀ ▄▀ █ \n ▄▀▄ █▄▄▄▀ \n █▄▄▄▀▀▄▄▄█ "], ["injured_1", " \n ▄ ▄█ ▄ \n █▀▄█▀██▄▄▀ █ \n ▀▄▀ ▀▀ ▀ ▄▀ \n █▄▀ ▀▄▄ █ ▄█\n ▄█▄ ▄▄ ▄█▄█▀█\n█ ▀█▀▀█▀▀█▀ ▀█ \n▀▄▄▀▄▄█▄▄▀▄▄▄▀ "], ["injured_2", " ▄ \n ▄█ ▄██▀ ▄▀▄ \n █ █▀▄█▀▀█ █ \n █ ▄ ▄ █ \n █▀▄▄▄ ▀▀ █ ▄█ \n ▄▄█████▄▄██▄█▀█\n█ ▀▄ ▀█▀ ▄▀ ▀█ \n▀▄▄▀▄▄█▄▄▀▄▄▄▀ "], ["sleep_1", " \n ▄ ▄█ ▄ \n █▀▄█▀██▄▄▀ █ \n ▀▄▀ ▀▀ ▀ █ ▄ \n █▄ ▄▄▄ █ █▀▄\n ▄█▄ ▄ ▄█▄█▄▀\n█ ▀█▀▀█▀▀█▀ ▀█ \n▀▄▄▀▀▀▀▀▀▀▄▄▄▀ "], ["sleep_2", " ▄ \n ▄█ ▄██▀ ▄▀▄ \n █ █▀▄█▀▀█ █ \n █ █ ▄ \n █▀ ▀▀▀ █ ██▄\n ▄▄████▄▄▄██▄█▄▀\n█ ▀▄ █ ▄▀ ▀█ \n▀▄▄▀▀▀▀▀▀▀▄▄▄▀ "], ["walk_1", " ▄███▀ ▄▀▄ \n █▄█▀▀▀▀█ █ \n ▄▀ ▀█▄ █ \n ▀▄▄ ▀▀▀ █ ▄█\n ▀▄▄▄▄▄▄█ █▀█\n ▄▀▄▀█▀ ▄ ▀▄ █ \n ▀▄▀▄ ▄▀▄▄█▄▀ \n █▄▄▄▀▀▄▄▄█ "], ["walk_2", " ▄▄▄▀ ▄ \n ▄▀███▄▄▄▀ █ \n ▀█▀ ▄▄ ▀ ▄▀ \n █ ▄██ █ ▄ \n █▀ ▄▀ ▄██\n ▄▀▀▀███▀▀▀▀▄▀▄▀\n ▀▄▄▀▄▀ ▀▄▄▀ █ \n █▄▄██▄▄██▀▀ "]]], + ["cotsucomon", [["angry", " \n \n \n ▄▄▄ \n ▄██▄▄▄██▄ \n ▄█▄▄▄▄▄▄▄▄▄█▄ \n █ ▄▄ ▄▄ █ \n ▀▄▄▄▄▄▄▄▀ "], ["attack", " ▄▄▄ \n ▄██▄▄▄██▄ \n ▄█▄▄▄▄▄▄▄▄▄█▄ \n █ ▄█ █ \n █▄▄▄▄▄ █ \n █████ █ \n ▀▄▄▄▄▄▀ \n ▄▄▄▄ "], ["eat_1", " \n \n ▄▄▀▀▀▄▄ \n ▄▀▀▀▀▀▀▀▀▀▄ \n ▀▀█▀█▀▀▀▀▀█▀▀ \n █▄▄▄▄ █ \n █████ █ \n █▄▄▄▄▄▀ "], ["eat_2", " \n \n \n ▄▄▄ \n ▄██▄▄▄██▄ \n ▄█▄▄▄▄▄▄▄▄▄█▄ \n █ ▀ ▄ █ \n ▀████▄▄▄▀ "], ["happy", " \n ▄▄▀▀▀▄▄ \n ▄▀▀▀▀▀▀▀▀▀▄ \n ▀▀█▀█▀▀▀▀▀█▀▀ \n █▄▄▄▄▄ █ \n ████▀ █ \n ▀▄▄▄▄▄▀ \n ▄▄▄▄ "], ["injured_1", " \n \n \n \n ▄▄▄ \n ▄██▄▄▄██▄ \n ▄█▄▄▄▄▄▄▄▄▄█▄ \n ▀▄██▄██▄▀ "], ["injured_2", " \n \n \n \n \n ▄▄▄ \n ▄██▄▄▄██▄ \n ▄█▄▄▄▄▄▄▄▄▄█▄ "], ["sleep_1", " \n \n \n ▄▄▄ \n ▄██▄▄▄██▄ \n ▄█▄▄▄▄▄▄▄▄▄█▄ \n █ ▄▄ ▄▄ █ \n ▀▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n \n \n \n ▄▄▀▀▀▄▄ \n ▄▀▀▀▀▀▀▀▀▀▄ \n ▀▀█▀▀▀▀▀▀▀█▀▀ \n ▀▄██▄██▄▀ "], ["walk_1", " \n \n \n ▄▄▄ \n ▄██▄▄▄██▄ \n ▄█▄▄▄▄▄▄▄▄▄█▄ \n █ ▄ ▄ █ \n ▀▄▄▄█▄▄▄▀ "], ["walk_2", " \n ▄▄▄ \n ▄██▄▄▄██▄ \n ▄█▄▄▄▄▄▄▄▄▄█▄ \n █ ▄ ▄ █ \n █ ▄ █ \n ▀▄▄█▄▄▀ \n ▄▄▄▄▄ "]]], + ["crabmon", [["angry", " ▄▀▀▀▀▀▄ \n ▀█▀▀▄ █\n▄▀▀█▄ ▀▄ ▀ █\n█▄▀ █▄▄ ▄▄▄▀█ ▄▀\n▀▄ ▄▀ ▀▀ ▀▄▄▀ \n █▄ ▄█ █▄ \n ▄▀▄▄▄▄▄▄ ▄▀▄█\n█▄▄▀▄▄▄▄▄▄▄▀▄▄▄█"], ["attack", " ▄▄ ▄▀▀▀▀▀▄ \n▄▀ ▄█ ▀▀▀▀▄ █\n█ █▄▄ ▄▄▄▄█ █\n▀▄▄▀▀█▄▀▀▀▄▄▄ █\n █▄▄▄▄ ▄▀ ▀▄▄▀ \n ▀▄▀██▄ █ \n ▄▄█▄███ ▄▀█▀▄ \n█▄█▄▄▄▄▄▄█▄▄▄█▄█"], ["eat_1", " ▄▄ ▄▀▀▀▀▀▄ \n▄▀ ▄█ ▀▀▀█ █\n█ █▄▄ ▄▄▄█ █\n▀▄ ▄▀▄▄▀▀▀▄▄▄ ▄▀\n ▄▀ █▀ ▀▄▄▀ \n ▀█▀████ █▄▄ \n ▄▄█▄██▀ ▄▀▀▄ █\n█▄▀▄▄▄▄▄▄▄▄▀▄█▀▀"], ["eat_2", " \n ▄▀▀▀▀▀▄ \n▄▀▀█▄ ▀█▀▀▄ █\n█▄▀ █ ▄▄▄█▄ ▄▀\n█ ▄▀ ▀▀ ▄ ▀▄▄▀ \n █ ▀ ▀ █▄ \n █▄▄▄▄▄▄▀ ▄▀▄▀▄\n█▄█▄▄▄▄▄▄▄▄█▄▄█▀"], ["happy", " ▄▄ ▄▀▀▀▀▀▄ \n █ ▄▀ ▀▀▀▀▄ █\n █ ▀▀▄▄ ▄█▀ ▀ █\n █▄▀▄ ▀▀ ▄▀█ ▄▀\n █ ▀ ▀ ▀ ▀ █ \n ▄█ ████████ █▄ \n█▄▀▄▀█▄▄▄▄█▀▄▀▄█\n█▄▄▄▀▄▄▄▄▄▄▀▄▄▄█"], ["injured_1", " \n ▄▀▀▀▀▀▄ \n▄▀▀█▄ █▄▄▄▄▄ █\n█▄▀ █▄ ▄█▄▄▄ ▄▀\n▀▄ █ ▀▀ ▀▄▄▀ \n █ ▄ ▄ █ \n ▄█▀ ▄▄▄ ▀ ▄▀█▀▄\n█▄▄█▄▄▄▄▄▄█▄▄▄█▀"], ["injured_2", " \n ▄▄▄▄▄ \n ▄▄ █▄▄▄ ▀▄\n█ ▄▀▄▄ ▄▄█ ▀▄ █\n█▀ █ ▀▀ ▀▄▄ █\n ▀█ █▄▀ \n ▄█▄▀ ▀▄▄ ▄▀█▀▄\n█▄█▄▄▄▄▄▄▄█▄▄▄█▀"], ["sleep_1", " \n \n ▄▄▄▄▄ \n▄▀▀█▄ █▄▄▄▄ ▀▄\n█▄▀ █▄▄ █▄▄ ▀ █\n▀▄▄▀ ▀▀ ▀▄▀ \n▄▀█ ▀▀ ▀▀ █▀▄\n█▄▄█▄▄▄██▄▄▄█▄▄█"], ["sleep_2", " \n ▄▀▀▀▀▀▄ \n▄▀▀█▄ ▀█▀▀▀▄ █\n█▄▀ █▄▄ ▄█▄▄ █\n▀▄▄▀▀▄▄▀▀▄▄▀▄▄▀ \n ▄█ ▄▄ █▄ \n█▄▀▄ ▄▀▄█\n█▄▄▄█▄▄▄▄▄▄█▄▄▄█"], ["walk_1", " ▄▀▀▀▀▀▄ \n ▄▄▄ ▀█▀▀▄ █\n█ ▄▀█ ▀▄ ▀ █\n█▀ ▄▀▄▄ ▄▄▀█▀ █\n ▀▄▄▀ ▀▀ ▀▄▄▀ \n ▄█ ▀▄ ▄▀ █▄ \n█▄▀▄ ▄▄▄▄ ▄▀▄█\n█▄▄▄▀▄▄▄▄▄▄▀▄▄▄█"], ["walk_2", " \n ▄▄▄▄▄ \n ▄▄ █▄▄▄ ▀▄\n█ ▄▀█ ▀▄ ▀▀ █\n█▀ ▄█▀▀▄▄▀▀█▀ ▄▀\n ▀█ ▄ ▄ ▀█ \n▄▀█ ▀ ▀ █▀▄\n█▄▄█▄▄████▄▄█▄▄█"]]], + ["craniamon", [["angry", " ▄▄ ▄▄ ▄▄ \n▄▀ █ ▄▀▄█▀▄▀▄▀▄ \n█ ██ ▄▄ ██▄ ▀▄\n█ █ ▀▀ ▄▀▀▀█ █\n▀▄▀█▀▄▄▀▀ █▄▄█ █\n ▀▄█ ▀ ▄▀█ █ █\n ▄▀▀▀██▄ ▀▀█▀█\n █▄█▄▄▀ ▀▄█▄█▄█ "], ["attack", " ▄▄ ▄▄ \n ▄▀▄███▀▄▀▄ \n █ ▄▄ ██▄ ▀▄\n █ ▀▀ ▄▀▀▀█ █\n ▄█▀▄▄▀▀▄▀▄▄█ █\n █ █ ▀ ▄██ ██ █\n ▄▀▀▀███▄ ▀▀▀▄▀█\n█▄█▄▄▄▀ ▀▄█▄█▄█ "], ["eat_1", " ▄▀█▄▀█ ▄ \n ▄▀ ▀▀ █▄▀ █ \n ▄▀ ▄█▀ ███▄ █\n █▄ ▄▄▀▄ █ █\n ▄▀█ █▀ ▄▀ ▀██ █\n ▀▄█▄▄▄█▀▄▄▄██ █\n ▄▀ ▄▄▄▄ ▀█▀▄█\n █▄█▄█ █▄█▄█▄█ ▀"], ["eat_2", " ▄▀█▄▀█ ▄ \n ▄▀ ▀▀ █▄▀ █ \n ▄▀ ▄█▀ ███▄ █\n █▄ ▄▄▀▄ █ █\n ▄▀█ █▀ ▄▀ ▀██ █\n ▀▄█▄▄▄█▀▄▄▄██ █\n ▄▀ ▄▄▄▄ ▀█▀▄█\n █▄█▄█ █▄█▄█▄█ ▀"], ["happy", " ▄▀█▄▀█ ▄ \n ▄▀ ▀▀ █▄▀ █ \n ▄▀ ▄█▀ ███▄ █\n █▄ ▄▄▀▄ █ █\n ▄▀█ █▀ ▄▀ ▀██ █\n ▀▄█▄▄▄█▀▄▄▄██ █\n ▄▀ ▄▄▄▄ ▀█▀▄█\n █▄█▄█ █▄█▄█▄█ ▀"], ["injured_1", " ▄▀█▄▀█ ▄ \n ▄▀ ▀▀ █▄▀ █ \n ▄▀ ▄█▀ ███▄ █\n █▄ ▄▄▀▄ █ █\n ▄▀█ █▀ ▄▀ ▀██ █\n ▀▄█▄▄▄█▀▄▄▄██ █\n ▄▀ ▄▄▄▄ ▀█▀▄█\n █▄█▄█ █▄█▄█▄█ ▀"], ["injured_2", " \n ▄██▄██ ▄ \n ▄▀▀▀▀▀█▄▀ █ \n ▄▀ █▀▀ ███▄ █\n █▄ ▄▄▀▄ █ █\n ▄▄█ █▀▄▄█▄███ █\n █▄▀▄▄█ ▀ ▀ ██ █\n █▄▄▄██▄▄▄▄█▀ ▀█"], ["refuse", " ▄▀█▄▀█ ▄ \n ▄▀ ▀▀ █▄▀ █ \n ▄▀ ▄█▀ ███▄ █\n █▄ ▄▄▀▄ █ █\n ▄▀█ █▀ ▄▀ ▀██ █\n ▀▄█▄▄▄█▀▄▄▄██ █\n ▄▀ ▄▄▄▄ ▀█▀▄█\n █▄█▄█ █▄█▄█▄█ ▀"], ["sleep_1", " ▄▀█▄▀█ ▄ \n ▄▀ ▀▀ █▄▀ █ \n ▄▀ ▄█▀ ███▄ █\n █▄ ▄▄▀▄ █ █\n ▄▀█ █▀ ▄▀ ▀██ █\n ▀▄█▄▄▄█▀▄▄▄██ █\n ▄▀ ▄▄▄▄ ▀█▀▄█\n █▄█▄█ █▄█▄█▄█ ▀"], ["sleep_2", " ▄▀█▄▀█ ▄ \n ▄▀ ▀▀ █▄▀ █ \n ▄▀ ▄█▀ ███▄ █\n █▄ ▄▄▀▄ █ █\n ▄▀█ █▀ ▄▀ ▀██ █\n ▀▄█▄▄▄█▀▄▄▄██ █\n ▄▀ ▄▄▄▄ ▀█▀▄█\n █▄█▄█ █▄█▄█▄█ ▀"], ["walk_1", " ▄▀█▄▀█ ▄ \n ▄▀ ▀▀ █▄▀ █ \n ▄▀ ▄█▀ ███▄ █\n █▄ ▄▄▀▄ █ █\n ▄▀█ █▀ ▄▀ ▀██ █\n ▀▄█▄▄▄█▀▄▄▄██ █\n ▄▀ ▄▄▄▄ ▀█▀▄█\n █▄█▄█ █▄█▄█▄█ ▀"], ["walk_2", " ▄▄ ▄▄ \n ▄▀▄███▀▄▀▄ \n █ ▄▄ ██▄ ▀▄\n █ ▀▀ ▄▀▀▀█ █\n ▄█▀▄▄▀▀▄▀▄▄█ █\n █ █ ▀ ▄██ ██ █\n ▄▀▀▀███▄ ▀▀▀▄▀█\n█▄█▄▄▄▀ ▀▄█▄█▄█ "]]], + ["craniamon_x", [["angry", " ▄▄ ▄ ▄▄▄ \n ▀▄▀▄▀▀ ▄▀▀█ \n▄▄ █ ▄█ ▀█ ▄▄\n█ ▀█▄▄▄▄▄ ▄▀█▀ █\n █▄▀▄█▄█▄▀▄█▄ █ \n█ ▀█ ▄▀▄ ▄█▀▀ █\n▀▄▄▀▀█▀▀█▀ ▀▄▄▄▀\n█▄█▄█▀▄▄█▀▄▄█▄█ "], ["attack", " ▄▀▄ █▀▄▀▄▀█▀▄\n▄▀▄▀▄ ▄▀▀ ▄▄ ▄█\n█ █ █ █ ▀▀ ▄▄█▄\n▄▀█▀█▄█▀█▀█▀▄▀ █\n▀▄█▄▄▄▄▀▀█▀▀█▀▄█\n█ █ █ █▄▀█▄ ▄▀ \n▀▄▀▄▀ ▄▀█▀▀█▀▄█▄\n ▀▄▀ █▄██▄▄▀▄█▄█"], ["eat_1", " █▀▄▀▄▄▀▀█▄▄ \n ▄▀ ▀▄▄ ▀▄▄▀ \n█▀▄█▄▄▄▄▄ ▄█▄▀█\n▀▄ ▀██▀▀██ ▄▀ ▄▀\n ▄▀▀█▀▀▀▀▄▀▀▀█▄ \n █ ▄██▀█▀█▄ ▄▀ \n █▀ █▀▀█▄▀▀█ \n █▄█▄▀▄▄█▀▄█▄█ "], ["eat_2", " ▄▄ ▄ ▄▄▄ \n ▀▄▀▄▀▀ ▄▀▀█ \n▄▄ █ ▄▀▄ ▀█ ▄▄\n█ ▀█▄▄▄▄▄ ▄▀█▀ █\n █▄▀▄█▄█▄▀▄█▄ █ \n█ ▀█ ▄▀▄ ▄█▀▀ █\n▀▄▄▀▀█▀▀█▀ ▀▄▄▄▀\n█▄█▄█▀▄▄█▀█▄█▄█ "], ["happy", " █▀▄▀▄▄▀▀█▄▄ \n ▄▀ ▀ ▄ ▀▄▄▀ \n ▄▄█ ▀ ▀ ▄███▄\n█ ▀██████▄▀▄█ █\n▀▄ ▄▀▀▀▀▀▄▀█ ▄▀\n ▀▀██▀█▀▄▀█▀▀ \n ▄▀ █▀▀█▄ █ \n █▄█▄▀▄▄█▀▄█▄█ "], ["injured_1", " \n █▀▄▀▄▄▀▀█▄▄ \n ▄▀ ▀ ▄ ▀▄▄▀ \n▄ █ ▀▀ ▄█ ▄▄\n█▀▀█▀█▀█▀▄▀▄▀▀ █\n ▀▄▄█▀█▀▀ ▀█▄▄▀ \n▄▀▀ ██▄█▄▄▀▀ █▄ \n█▄▄▄▀▀█▄▄█▄▄▄█▄█"], ["injured_2", " \n ▄▄ ▄ ▄▄▄ \n ▀▄▀▄▀▀ ▄▀▀█ \n▄ █ █▄ ▀█ ▄▄\n█▀█▄▄▄▄▄ ▄▀█▀▀ █\n ▀█▄█▄█▄█▄█▄▄▄▀ \n▄▀▀ █ █ ▄▀▀ █▀▄ \n█▄▄▄██▄██▄▄▄█▄▄█"], ["sleep_1", " \n ▄▄ ▄ ▄▄▄ \n ▀▄▀▄▀▀ ▄▀▀█ \n█▀█ ▄▄ ▀█▄▀█ \n▀▄█▄▄▄▄▄ ▄▀█▀ █ \n▄▀█▄█▄█▄▀▄█▄▄█▀▄\n██ ▀█▄█▄▄▀ █ █\n █▄▄▄█▄▄██▄▄▄█▀ "], ["sleep_2", " \n █▀▄▀▄▄▀▀█▄▄ \n ▄▀ ▀ ▀▄▄▀ \n█▀▄█ ▀▀ ▄█▄▀█\n▀▄ █▀█▀█▀▄▀▄▀ ▄▀\n▄▀█▄▀▀█▀▀ ▀██▄▀▄\n██ ▀█▄█▄▄▀ █ █\n █▄▄▄█▄▄██▄▄▄█▀ "], ["walk_1", " █▀▄▀▄▄▀▀█▄▄ \n ▄▀ ▀ ▄▄▀▄▄▀ \n█▀▄█▀ ▀▀ ▄█▄▀█\n█ █▀█▀█▀▄ ▄▀ █\n▄▀█▄▀█▀██ ▀██▄▀▄\n█ ▄█▄ ▀▀ ▄▀█ ▄█\n ▀█▀ █▀▀█▄ █▀▀ \n █▄▄▀█▄▄█▀▄▄▄█ "], ["walk_2", " ▄▄ ▄ ▄▄▄ \n ▀▄▀▄▀▀ ▄▀▀█ \n▄▄ █ ▄█▀ ▀█ ▄▄\n█ ▀█▄▄▄▄▄ ▄▀█▀ █\n▄▀▄▀▄█▄█▄▀▄█▄▄▀▄\n█ █ ▄▀▄ ▄█▀ █\n ██▀▀█▀▀█▀ ▀▄▄▀ \n█▄█▄█▀▄▄█▀█▄█▄█ "]]], + ["creepymon", [["angry", " █▄ █▄ \n▄▀▀█ ████▀▀███▄\n█ ██▀████▀▀ ████\n▀█ ████ █▄▄██▀██\n▄██▄██▄██▀█ ▀█▄▀\n█▀▄▀ ▀ ██▄█▄ █▀▄\n▀▄█▄▄▄▄▄█ ▄█▄▀\n█▄▄██▀▀█▄███▄▄▄█"], ["attack", " ▄▀▀█ █▄ █▀▀█▄ \n █ ██▀████▀▀▄███\n█ █ ▀██▀ █▄█ ▀█\n█▄██▄██▄██▀█▄▄ █\n█ █ ▀ ▀ █ █ ▄█\n▀▄█ █ █▄█▀█\n ██▄▀▄▄▀▄▀▄▀ ▀▄ \n█▄█▄▄▄▄▄▄▄█▄▄█▄█"], ["eat_1", " ▄▄▄ █▄ ▄▄▄█▄ \n█ ▄█▄▄████▄ ███▄\n█▄▀▀▄█▀▀█ ▄████\n▀▄█▄██▄█▄████▀██\n █ ▀ ▀ █ █ ▀█▄▀\n█ █▄ ▄ █ █▄ █▀▄\n▀▄█ ▀▀ ▀▄▀ ▄█▄▀\n█▄▄██▀▀█▄███▄▄▄█"], ["eat_2", "▄▀▀█ █▄ █▀▀██ \n█ ██▀████▀▀ ███ \n█▀▄ ██ ▄▀▄▄████▄\n ████████▀██████\n █▄▀ ▀ ▀ ▄▀█ ▀██\n▄▀█▀▀█▀▀█ █ ▀▄\n█ █▀ ▀█▀ ▄█▄▄▀\n█▄█▄█▀▀▄█▄█▄█▄▄█"], ["happy", " ▄▀▀█ █▄ █▀▀█▄ \n █ ██▀████▀▀ ███\n██▀▄▀██▀▄▀▄▄▀▀▀█\n█▀████████▀█▄▄ █\n█ █ ▀ ▀ █ █ ▄█\n █▀▄▀▄▄▀▄▀ █ █▀█\n █▄▀▄▄▄▄▄▄▀ ▀▀▄ \n█▄█▄▄▄▀ ▀▄▄▄▄█▄█"], ["injured_1", " \n █▄▄ █▄▄ \n ▄▄▄ ███ ▄▄███ \n█ ▄██▀████▄ ███ \n▀▄██▀██▀██ █▀█ \n ▄█▄▄██▄▄███▄ █\n█ ▀▄▀ ▀ ▀▄▀ █ █\n▀▄▄███████▄▄▄█▄█"], ["injured_2", " \n ▄ ▄ \n ▀██▄ ▀██▄ \n▄▀▀████▄▄█▀▀█▄ \n█ ███▄████▀ ██ \n ██▀ ██ ▀█▄▄█ ▀▄\n█ █▀█▀█▀█▀█ █ █\n▀▄▄█▄▄▄▄▄█▄▄▄█▄█"], ["sleep_1", " ▄▄ ▄▄▄▄ ▄▄ \n █ ▄████████▄ █ \n █ ███▀█████ █ \n ████████████ \n ████████████ \n ▀████████▀ \n ▀▀▀▀ \n ▄▄▄▄▄▄▄▄▄▄▄ "], ["sleep_2", " ▄▀▀▄ ▄▄ ▄▀▀▄ \n █ ███████▀ █ \n ▀▄██▄████▄▄▀ \n ██████████ \n ▀████████▀ \n ▀██████▀ \n ▀▀ \n ▄▄▄▄▄▄▄▄▄ "], ["walk_1", "▄▀▀█ █▄ █▀▀▄█ \n█ ██▀████▀▀ ███ \n▀█ ▀██▀ █▄▄████▄\n ██▄██▄██▀██████\n █▄▀ ▀ ▀ ▄▀█ ▀██\n▄▀█▀▀█▀▀█ █ ▀▄\n█ █▀ ▀█▀ ▄█▄▄▀\n█▄█▄█▀▀▄█▄█▄█▄▄█"], ["walk_2", " ▄▄▄ █▄ ▄▄▄█▄ \n█ ▄█▄▄████▄ ███▄\n█▄▀█▄██▀█ ▄████\n █▄ ██ ▄█████▀██\n █▀█▀█▀██▀█ ▀█▄▀\n█ █▄▄▄▄▄█▄█▄ █▀▄\n▀▄▄█▄▀▄▄█ ▄█▄▀\n█▄▄██▀▀█▄███▄▄▄█"]]], + ["creepymon_x", [["angry", " ▄▄ ▄▄ \n▄▀▄█▄█▄█▄▄▀▄ █ \n█▄▀█▄██▀█ ▄▀▄██▄\n █▄▄██▄▄██▄▀████\n ▀█▀█▀█▀█ ▄ █▀██\n▄▀█▄▄▄▄█▀▀█▀█▄ █\n▀▄▄██▀▀█▄▄▄▄██▄ \n█▄█▄████████▄█▄█"], ["attack", " ▄▀█ ▄ ▄▀▀▄ ▄ \n█ ██▀████▀ █ ▄█ \n▀█ ▀██▀ █▄▀▄████\n ██▀█▀█▀█▀▀ ████\n▄▀█ █▄▀▄▀▄▀█\n▀▄█▄█▄█▄█▀ ▄█ ▀\n ▄███▄▄███████ \n █▄█▄█▀▀█▄█▄█▄█ "], ["eat_1", " ▄▀█ ▄ ▄▀▀▄ ▄ \n█ ███▀███▀ █ ▄█ \n▀█▀▄▀█▀▄▀▄█▀████\n ██▀█▀█▀█ ▄ ████\n▄▀█ ▄███▀▀▄▀█\n▀▄▄██████ ▄ ▄█ ▀\n ▄███▄▄███████ \n █▄█▄█▀▀█▄█▄█▄█ "], ["eat_2", " ▄▄ ▄▄ \n▄▀▄█▄█▄█▄▄▀▄ █ \n█▄██▄████ ▄▀▄██▄\n █▀▄▀█▀▄▀█▄▀████\n ▀█▀█▀█▀█ ▄ █▀██\n ▄▀▄▄▄▄███▀▀█▄ █\n█▄▄██▀▀█ ▄ ▄██▄ \n█▄█▄████████▄█▄█"], ["happy", " ▄▀█ ▄ ▄▀▀▄ ▄ \n█ ██▀████▀ █ ▄█ \n▀██▀███▀█▄▀▄████\n █▄█▄█▄█▄▀▀ ████\n▄▀█ ▀ ▀ █▀█▀█ ▀█\n▀▄ █▄▄▄█▀ ▄██ ▀\n ▄███▄▄███████ \n █▄█▄█▀▀█▄█▄█▄█ "], ["injured_1", " \n ▄▀█ ▄ ▄▀▀▄ ▄ \n█ ██▀████▀ █ ▄█ \n▀██▀██▀██▄▀▄████\n █▄▄██▄▄█▀▀ ████\n █ ▀ ▀▄█▄█▄█ ▀█\n▄▀ ██▀▀█▀▀ ▄▀█ ▀\n█▄█▄████▄█▄█▄▄█ "], ["injured_2", " \n ▄▄ ▄▄ \n▄▀▄█▄█▄█▄▄▀▄ █ \n█▄██▄████ ▄▀▄██▄\n █▀ ██ ▀██▄▀████\n ▀█▀█▀█▀█ ▄ █▀██\n▄▀▀▄▄▄▄█▀▀▀█▀▄ █\n█▄█▄█▄▄█▄█▄█▄▄█ "], ["sleep_1", " \n ▄▄ ▄▄ \n▄▀▄█▄█▄█▄▄▀▄ █ \n█▄██▄████ ▄█▄██▄\n █▄▄██▄▄█▀▀ ████\n ▀█▀█▀█▀█▄█▄█▀██\n▄▀█▄▄▄▄██▀▄ ▄ ▄▀\n██▄█▄▄▄██ █████ "], ["sleep_2", " \n ▄▀█ ▄ ▄▀▀▄ ▄ \n█ ██▀████▀ █ ▄█ \n▀█▀▀██▀▀█▄▀▄████\n ████████▀▀ ████\n ▄█ ▀ ▀▄█▄█▄█ ██\n█▄▀██████▀▄ ▄ ▄▀\n██▄██▄▄██ █████ "], ["walk_1", " ▄▀█ ▄ ▄▀▀▄ ▄ \n█ ██▀████▀ █ ▄█ \n▀█ ▀██▀ █▄▀▄████\n ██▄██▄██▀▀ ████\n █ ▀ ▀▄█▄█▄█ ▀█\n▄▀ █████▀▀ ██ ▀\n▀▄███▄▄█▄█▄███ \n █▄█▄█▀▀█▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄ \n▄▀▄█▄█▄█▄▄▀▄ █ \n█▄▀█▄██▀█ ▄▀▄██▄\n █▄ ██ ▄██▄▀████\n ▀█▀█▀█▀█ ▄ █▀██\n ▄▀▄▄▄▄███▀▀█▄ █\n█▄▄██▀▀█ ▄ ▄██▄ \n█▄█▄████████▄█▄█"]]], + ["crescemon", [["angry", " ▄▄ ▄▄ \n ▄█▄██▄▀ ▄▄▀ \n ████▀ ███▄▄▀ \n ████▄▄██▀ ▄▄▀ \n ▀▄▄▄███ █ \n ▄▀▀ ▄▀ ▄█▄ ▀▀▄ \n ▀▄▄█▀▀▀ ▄█▀▀▀ \n █▄▄█▀▄▄▄█ "], ["attack", " \n ▄▀█▄▀█ ▄\n ▄█ ▄████▀█▄█▀▄\n ██ ▄███▀ ▄█▀▀▀▄\n███▄██▀▀▀██ █▀ \n██▀█ █▀▀██ █▄ \n█▀ ██▄▄▀ ▀█▄▄▄▀\n▀ █▄▄▄█▀▄▄▄█ "], ["eat_1", " ▄▀█▄▀█ ▄ \n ▄████▄█▄▄▀▀▄ \n ▄███▀▄▀█▀ ▀▀ \n ▀█▀▀▀▀█▀█▀▀▀▄ \n █▄▄▄▀█ █▀ \n ▄▀ █▄▄▀█ █▄ \n █ █ ▄ ▀▄▄▄▀ \n ▀█▄▄▄▀▄▄▄█ "], ["eat_2", " ▄▀█▄▀█ ▄ \n ▄████▄█▄▄▀▀▄ \n ▄███▀▄▀█▀ ▀▀ \n ▀█▀▀▀██▀█▀▀▀▄ \n ▄▀▀█▀▀█ █▀ \n █ ▄█▄▄▀█ █▄ \n ▀█ ▄ ▀▄▄▄▀ \n █▄▄▄▀▄▄▄█ "], ["happy", " ▄▀▀▄▀▀█▄▄ \n ▄███▀██▀ ▄▄▀ \n ████▄█▄█ █ ▀ \n▄▀▀▄ ▄█▀▄ ▀▀▄ \n ▀▄ ▀▀█▀ ▄▀▀▀ \n ▀▄█▄▄▀█ \n █ ▄ ▀▄ \n █▄▄▄▀▄▄▄█ "], ["injured_1", " \n ▄▀█▄▀█ ▄ \n ▄████▄█▄▄▀▀▄ \n ▄███▄▀▀█▀ ▀▀ \n ▀█▀▀▀███▄▄▀▀▀▄\n ▄▄█▄▄▄███ █▀ \n █ ▀▄ ▀█▀ █ █▄ \n ▀▄▄█▄▄▀▄▄▀▀▄▄▄▀"], ["injured_2", " \n ▄▄ ▄▄ \n ▄█▄█▀▄▀ ▄▄▀ \n ███▀████▀▄▄▀ \n █████▄▄█ ▄▀▀▀▄\n ▄█▄▄▄▄███ █▀ \n █ ▀▄ ▀█▀ █ █▄ \n ▀▄▄█▄▄▀▄▄▀▀▄▄▄▀"], ["sleep_1", " \n ▄▄ ▄▄ \n ▄█▄█▀▄▀ ▄▄▀ \n ████████▀▄▄▀ \n ████▄▄▄█ ▄▀▀▀▄\n ▄█▄██████ █▀ \n █ ▀▄ ▀█▀ █ █▄ \n ▀▄▄█▄▄▀▄▄▀▀▄▄▄▀"], ["sleep_2", " \n ▄▀█▄▀█ \n ▄████▄█▄▄▀▀▄\n ▄███▀▀▀██ ▀▀▄\n ▀█▀█████▄▀▀▀▄\n ▄▄▄██▀▀██ ▄▀ \n █ ▀▄ ▀█▀ █ ▀▄ \n ▀▄▄█▄▄▀▄▄▀▀▄▄▄▀"], ["walk_1", " ▄▀█▄▀█ ▄ \n ▄████▄█▄▄▀▀▄ \n ▄███▀ ██▀ ▀▀ \n ▀█▀▀▀██▀█▀▀▀▄ \n ▄▀▀█▀▀█ █▀ \n █ ▄█▄▄▀█ █▄ \n ▀█ ▄ ▀▄▄▄▀ \n █▄▄▄▀▄▄▄█ "], ["walk_2", " ▄▄ ▄▄ \n ▄█▄█▀▄▀ ▄▄▀ \n ████▀████▄▄▀ \n ████▄▄██▀ ▄▄▀ \n ▀▄▄▄███ █ \n ▄▀▀ ▄▀ ▄█▄ ▀▀▄ \n ▀▄▄█▀▀▀ ▄█▀▀▀ \n █▄█▄▄▄█ "]]], + ["cresgarurumon", [["angry", " ▄▄▄▄▄▄ \n ▄▀▀ ▄▄▀ \n ▄▀▀ ▄▀ ██▄▀█ \n █▄▄▄▄▄▄█▀ ▄▄▀ \n ▀▄▄▄▄█ ▄██ \n ▄▀█▄ ▄▀█▀▀ █ \n ▀▄█▄▀ ▄█▄▄█ \n █▄▄█▀▀▀█▄▄▄█ "], ["attack", " ▄▄▀▀▀▀▀█ \n ▄▄▀ ▄▄ ▄█▀▄▄\n █ ▀▀ ▄█▀▀ █\n▄▄ ▀█▀▀▄ █▀ ▄█▀ \n▀▄█▀▀▄▄▄▄█▄▀▀ █ \n ▀▄▄█ ▀ ▄█▄▄█▀ \n ▀▄ ▀▀███▀▄▄ \n █▄█▄▄▄▄█▄▄▄█ "], ["eat_1", " ▄▄▀▀▀▀▀█ \n ▄▄▀ ▄▄ ▄█▀▄▄ \n █ ▀▀ ▄█▀▀ █ \n ▀████ ▄▀ ▄█▀ \n █▀▀▀▄█▄██▀▄ \n █ █▀█▀ █ ▄▀ \n █▀█▄▄█▀▀█▄ \n █▄▄█ █▄▄▄█ "], ["eat_2", " ▄▄▄▄▄▄ \n ▄▀▀ ▄▄▀ \n ▄▀▀ ▄█▀ ██▄▀█ \n █▄▄▄▄▄▄█▀ ▄▄▀ \n ▀▄▄▄▄█ ▄██ \n ▄▀█▄ ▄ █▀▀ █ \n ▀▄█▄▀ ▄█▄▄█ \n █▄▄█▀▀▀█▄▄▄█ "], ["happy", " ▄▄▀▀▀▀▀█ \n ▄▄▀ ▄ ▄█▀▄▄ \n █ ▀ ▀▄█▀▀ █ \n ▀███▄ █▀ ▄█▀ \n ▄▀▀▄▄▄▄█▀▀▀▄▀ \n ▀▄▄█▀▄▀▀▄▄▀ \n ▄█▀█▄▄█▀▀█▄ \n █▄▄▄█ █▄▄█ "], ["injured_1", " ▄▄▄▄▄▄ \n ▄▀▀ ▄▄▀ \n ▄▀▀ ▀▄▄ ██▄▀█ \n █▄▄▄▄▄▄█▀ ▄▄▀ \n ▀▄▄▄▄█ ▄██ \n ▄▀█▄ ▄ █▀▀ █ \n ▀▄█▄▀ ▄█▄▄█ \n █▄▄█▀▀▀█▄▄▄█ "], ["injured_2", " \n ▄▄▀▀▀▀▀█ \n ▄▄▀▄ ▄█▀▄▄ \n █ ▀▀▄█▀▀ █ \n ▀█▀▀▀▀█▀ ▄█▀ \n ▄█▀▀▀▀▄██▀▄ \n █ ██▄▀▄█ ▄▀ \n ████▀▀▀███▄█ "], ["sleep_1", " \n ▄▄▀▀▀▀▀█ \n ▄▄▀ ▄█▀▄▄ \n █ ▀▀▀▄█▀▀ █ \n ▀█▀▀▀▀█▀ ▄█▀ \n ▄█▀▀▀▀▄██▀▄ \n █ ██▄▀▄█ ▄▀ \n ████▀▀▀███▄█ "], ["sleep_2", " ▄▄▄▄▄▄ \n ▄▀▀ ▄▄▀ \n ▄▀▀ ▄▄▄ ██▄▀█ \n █▄▄▄▄▄▄█▀ ▄▄▀ \n ▀▄▄▄▄█ ▄██ \n ▄▀█▄ ▄ █▀▀ █ \n ▀▄█▄▀ ▄█▄▄█ \n █▄▄█▀▀▀█▄▄▄█ "], ["walk_1", " ▄▄▀▀▀▀▀█ \n ▄▄▀ ▄▄ ▄█▀▄▄ \n █ ▀▀ ▄█▀▀ █ \n ▀█▀▀▀▀█▀ ▄█▀ \n ▄█▀▀▀▀▄██▀▄ \n █ █▀▄▀ █ ▄▀ \n █▀█▄▄█▀▀█▄ \n █▄▄█ █▄▄▄█ "], ["walk_2", " ▄▄▄▄▄▄ \n ▄▀▀ ▄▄▀ \n ▄▀▀ ▄█▀ ██▄▀█ \n █▄▄▄▄▄▄█▀ ▄▄▀ \n ▀▄▄▄▄█ ▄██ \n ▄▀█▄ ▄ █▀▀ █ \n █▄█▄▀ ▄█▄▄█▄ \n █▄▄█▀▀▀▀▀█▄▄▄█ "]]], + ["crowmon", [["angry", " ▄▄▄█▀▀ \n ▄▀ ▀▄ ▄▄ \n █ ▄█ ▄██▄ █▄▄ \n█ ▄▄▀▀▄▀ ███▀█▄\n█▄▀▄▄█▀ ▄██▄▀█ █\n▀▄▀█████████ █▄█\n █▄▀▄█▀▀█▀▀██ █ \n ▀ ▀▄▀█▄█▀▄▀▀ "], ["attack", " ▄▀▀▀█▀█▄█▀▀ ▄█\n▄▀▄▄▄▀▀ █▄▄█▀▀█\n██▄▀███▄ ██▄ █ █\n█ █ ███▀▄▀▀█ █ █\n█▄▀▄█▄▄▀ ▄███▀▄█\n▀ ▀▄▄▄█████▄▄ ▀\n █ ▀ █ ▀ █ ▀▀ \n ▀▄█▀█▄█▀ "], ["eat_1", " ▄▀▀▀▀▀█▄█▀██▄ \n▀▀▀▄ ▀█ █▄▄█ ██ \n ▀▄ ▄█▄ █▄█ █\n ▄▄▀▀▄▀ ███▄██\n █▄▄█▀ ▄█████▀ \n ▀ ▄▄███████▄ \n █▄▀█▄▀▄█ ▀▀ \n ▀▄█▀▄█▀ "], ["eat_2", " ▄▄▄ \n ▄▀▀█▀ \n ▄▀ ▄▄ █▄▀▀▄ \n▄▀ ▀ ▄█▀█▀▄███▄ \n█ ▄▀▀▄▄▀ ▄█▀█▄▀█\n█▀▄▀██▄▄████ █▄█\n █▄▀█▄▀▄█ ██ \n ▀▄█▀▄█▀▀▀ "], ["happy", " ▄▀▀▀▀▀█▄█▀▀ \n ▀▄▄▄ ▀█ █ ▄█▄ \n ▄▀███▄ ▄██▄▀▄▀▄\n█ █ ███▀▄▀ █ █ █\n█ █ █▄▄▀ ▄██ █ █\n▀▄█▀▀▄▄█████▀▀▄█\n █▄▀█▄▀▄██▄ ▀\n ▀▄█▀▄█▀ ▀ "], ["injured_1", " ▄▄▄ \n ▄▀▀█▀ \n ▄▀▄ █▄▀▀█▄▄ \n▄▀ ▀▀▄█▀█▀▄██▀█▄\n█ ▄▀▀▄▄▀ ▄█▄▀█ █\n█▀▄███▄▄████ ██ \n █▄▀▄█▀▀█▀▀█▄▀█ \n ▀ █▄▀█▄█▀▄█ ▀ "], ["injured_2", " \n ▄▄▄█▀▀ \n ▄▀ ▀▄▄▀▀█▄▄ \n █ █▄ ▄██▀▄██▀█▄\n█ ▄▄▀▀▄▀▄█▄▀█ █\n█▄▀▄▄██▄████ ██ \n▀▄█▀▄█▀▀█▀▀█▄▀█ \n ▀ █▄▀█▄█▀▄█ ▀ "], ["sleep_1", " ▄▄▄ \n ▄▀▀█▀ \n ▄▀ █▄▀▀█▄▄ \n▄▀ ▀▀▄█▀█▀▄███▄ \n█ ▄▀▀▄▄▀ ▄▀████ \n▀█████▄▄███ ████\n ██▀▄█▀▀█▀▀█▄▀▀█\n ▀ █▄▀█▄█▀▄█ "], ["sleep_2", " ▄▄▄█▀▀ \n ▄▀ ▀▄ ▄▄ \n █ ▄▄ ▄██▄ ██ \n█ ▄▄▀▀▄▀ ████ \n█▄▀▄▄█▀ ▄█▄▀███ \n▀▄██▀██████ ███▄\n ██▀▄█▀▀█▀▀█▄▀▀█\n ▀ █▄▀█▄█▀▄█ "], ["walk_1", " ▄▄▄█▀▀ ██▄ \n ▄▀ ▀▄ ▄▄█ ██ \n █ ▄█▀▄██▄ █▄█ █\n█ ▄▄▀▀▄▀ ███▄██\n█▄▀▄▄█▀ ▄█████▀ \n▀ ▀ ▄▄███████▄ \n █▄▀█▄▀▄█ ▀▀ \n ▀▄█▀▄█ "], ["walk_2", " ▄▄▄ \n ▄▀▀█▀ \n ▄▀ ▄▄ █▄▀▀▄ \n▄▀ ▀▀▄█▀█▀▄███▄ \n█ ▄▀▀▄▄▀ ▄█▀█▄▀█\n█▀▄▀██▄▄████ █▄▀\n █▄▀█▄▀▄█ █▀ \n ▀▄█▀▄█▀▀ ▀ "]]], + ["cryspaledramon", [["angry", " ▄ ▄▄ ▄▄ ▄ \n █▄▀▄▀▀▄█ █▄█ \n █▀ ▄ ▀ ▄█▄▄▄█\n▄▀ ▀▀ ▀▄█ █\n▀█▀▀▀▄▄▄▀▀▄▄█▄ █\n ▀█▀▄ ▄▀▀█ ▀▄▀▀\n █▄█ ▀ ▄█▄▄▄▀▀█\n █▄█▄█▀██▄▄▄▄█▀ "], ["attack", " ▄▀▄▀█▄▀█ ▄▀▄ \n ▄█▀▀ ▀ ▄▀▀▄▀▀▀▄\n█▄▄▄▄ ▄█ ▄▀█▀▀▀█\n █████ ▀█ █\n █████ ▄▀▀▄▀█▄▄█\n▄▀▄▄▄▄██ ▄█▄▄ \n▀▄█▄▀▄▄▄▀▀█▄ ▄▀ \n █▄█▄█ ▀▄█▄▄█ "], ["eat_1", " ▄▀▄▀█▄▀█ ▄▀▄ \n ▄█▀ ▀ ▄▀▀▄▀▀▀▄\n ▄▀ ▄▀▄ ▄▀█▀▀▀█\n█▄▄▄▄ ▄▄▀▀▄ █\n ▀████ █▄▄█▀█▀▄█\n ▄▀▀▀▄█▀ ▄▀ █▄▄\n ██▀▄▄▄▀▀▄▄█ ▄▀\n █▄█▄█ █▄█▄▄▄█ "], ["eat_2", " ▄ ▄▄ ▄▄ ▄ \n █▄▀▄▀▀▄█ █▄█ \n █▀ ▄ ▀ ▄█▄▄▄█\n▄▀ ▀ ▀ ▀▄█ █\n▀█▀▀▀▄▄▄▀▀▄▄█▄ █\n ▀█▀▄ ▄▀▀█ ▀▄▀▀\n █▄█ ▀ ▄█▄▄▄▀▀█\n █▄█▄█▀██▄▄▄▄█▀ "], ["happy", " ▄▀▄▀█▄▀█ ▄▀▄ \n ▄█▀ ▀ ▄▀▀▄▀▀▀▄\n ▄▀ ▄▀▄ ▄▀█▀▀▀█\n█▄▄▄▄▄ ▄▄▀▀▄ █\n ▀███▀ █▄▄█▀█▀▄█\n ▀▄▄█▀▀ ▄▀ █▄▄\n ██▀▄▄▄▀▀▄▄█ ▄▀\n █▄█▄█ █▄█▄▄▄█ "], ["injured_1", " \n ▄▀▄▀█▄▀█ ▄▀▄ \n ▄█▀ ▀ ▄▀▀▄▀▀▀▄\n ▄▀ █▄ ▄▀█▀▀▀█\n█▄▄▄▄ ▄▄▀▀▄ █\n ▀▄▄▄▀▀▀▄▄█▀█▀▄█\n ▄█▄█▄▀ ▄█ █▄▄\n █▄█▄█████▄▄▄█▀ "], ["injured_2", " \n ▄ ▄▄ ▄▄ ▄▀▄ \n █▄▀▄▀▀▄█▄▀▀▀▄\n █▀ ▄ ▀ ▄█▀▀▀█\n█▀ ▀▀ ▀▄█ █\n █▀▀▀▄▄▄▀▀█ █▀▄█\n ███▄ ▄▀█▀ █▄▄\n █▄█▄█████▄▄▄█▀ "], ["sleep_1", " \n ▄ ▄▄ ▄▄ ▄ \n █▄▀▄▀▀▄█ █▄█ \n █▀ ▀ ▄█▄▄▄█\n▄▀ ▀▀ ▀▄█ █\n▀███▀▄▄▄▀█▄▄█▄ █\n█ ▀ █▄▀▀█ ▀ █▄\n█▄▄▄█▄▄▄█▄▄▄▄▄█▀"], ["sleep_2", " \n ▄▀▄▀█▄▀█ ▄▀▄ \n ▄█▀ ▀ ▄▀▀▄▀▀▀▄\n ▄▀ ▄▄ ▄▀█▀▀▀█\n█▄▄▄▄ ▄▄▀▀▄ █\n █▄▄▄▀▀▀ ▄█▄▄▀▄█\n█ ▀ █▄▀▀█▀ ▀ ▀█▄\n█▄▄▄█▄▄▄█▄▄▄▄▄█▀"], ["walk_1", " ▄▀▄▀█▄▀█ ▄▀▄ \n ▄█▀ ▀ ▄▀▀▄▀▀▀▄\n ▄▀ ▄█▀ ▄▀█▀▀▀█\n█▄▄▄▄ ▄▄▀▀▄ █\n ▀▄▄▄▀▀▀▄▄█▀█▀▄█\n ▄▀▄▀▄▀ ▄▀ █▄▄\n █▄▀▄▄▄▀▀▄▄█ ▄▀\n █▄█▄█ █▄█▄▄▄█ "], ["walk_2", " ▄ ▄▄ ▄▄ ▄ \n █▄▀▄▀▀▄█ █▄█ \n █▀ ▄▄ ▀ ▄█▄▄▄█\n▄▀ ▀▀ ▀▄█ █\n▀█▀▀▀▄▄▄▀▀▄▄█▄ █\n ▀█▀▄ ▄▀▀█ ▀▄▀▀\n █▄█ ▀ ▄█▄▄▄▀▀█\n █▄█▄█▀██▄▄▄▄█▀ "]]], + ["curimon", [["angry", " \n \n \n ▄▀▄▄ \n █▀▄▀ ▀▄ \n ▄▀ ▀ ▄▀ \n ██▄ ▄█ █ \n ▀▄▄█▄▄▄▄▄▀ "], ["attack", " \n ▄▀▄▄ \n █▀▄▀ ▀▄ \n ▄▀ ▀ ▄▀ \n ██▄ ▄█ █ \n █ ▄█▄▄ █ \n █ ▀██▀ █ \n ▀▄▄▄▄▄▄▀ "], ["eat_1", " \n \n ▄▀▄▄ \n █▀▄▀ ▀▄ \n ▄▀ ▀ ▄▀ \n █ ▀▄ ▀ ▀ █ \n █ ▀██▀ █ \n ▀▄▄▄▄▄▄▀ "], ["eat_2", " \n \n \n ▄▀▄▄ \n █▀▄▀ ▀▄ \n ▄▀ ▀ ▄▀ \n █▀▄ ▄▀▄ █ \n ▀▄▄█▄▄▄▄▄▀ "], ["happy", " ▄ \n ▄▄ ▄▀ ▀█ \n █ ▀▄ ▄▀ \n ▄█ ▄ ▀▄ \n █ ▀▄▀ ▀ █ \n █ ████ █ \n ▀▄██▄▄▄▀ \n ▄▄▄▄ "], ["injured_1", " \n \n \n \n █▀▄▄▄▀▀▀▀▄ \n ▄▀ ▀ ▄▄▄▄▀\n █▄█ █▄ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n \n \n ▄▄ ▄▄▄▄ \n █ ▀█▀ ▀▄\n ▄▀▄ ▄ ▀█▀▀ \n █▄██▄▄██▄▄▄█ "], ["sleep_1", " \n \n \n ▄▀▄▄ \n █▀▄▀ ▀▄ \n ▄▀ ▀ ▄▀ \n █▄▄ ▄▄ █ \n ▀▄▄█▄▄▄▄▄▀ "], ["sleep_2", " \n \n ▄ \n ▄▄ ▄▀ ▀█ \n █ ▀▄ ▄▀ \n ▄▀ ▀▄ \n █▀▀▄ ▀▀ █ \n ▀▄▄▄▄▄▄▀ "], ["walk_1", " \n \n ▄ \n ▄▄ ▄▀ ▀█ \n █ ▀▄ ▄▀ \n ▄▀▄ ▄ ▄▀▄ \n █ ▄▀▄▄ █ \n ▀▄▄▄▄▄▄▀ "], ["walk_2", " \n \n \n ▄▀▄▄ \n █▀▄▀ ▀▄ \n ▄▀ ▀ ▄▀ \n █ ▀▄ ▀ ▀ █ \n ▀▄█▄██▄▄▄▀ "]]], + ["cyberdramon", [["angry", " ▄▄▄\n ▄▄▄▀▀▀▀▀█▄▀ █ \n▄▀ ▄█ ▄█▄█▀▄▀▄\n▀█▀▄▄▄▄▀█▀▄█▄█ █\n ▀█▄▄▄▄██▄██▀█ █\n▄▀█▄█▄▄██▄▀▄█▀ █\n▀██▄ ▀█▀███▄▄▄▀█\n█▄████▀ █▄▄█▄█▀"], ["attack", " ▄▄▀▀██▀▀█▀ ▄▀█▀\n█▄▄ ▀▀ ▄█▄ █ ▀▄\n ▀ █▀▄█▀███▄█ █\n █▀▄██▀▄████\n ▄█▄▀ ▄███▄█████\n█▀▄▄▀▀▀█▀▀█▄█▄▀█\n▀▀██▀▀█▄█▄▄█▄▀▄█\n █▄████ █▄▄█▄█ ▀"], ["eat_1", " ▄▄▀▀▀▀▀▀█▀ ▄▀█▀\n█▄▄ ▀▀▀▄█▄ █ ▀▄\n ▀▀▄█▀███▄▀█ █\n ▄▄▀ ██▀▀█ █ █\n ▄█▄▄▄██▄████▄ █\n█▀██▄▄▄█▄▀██▀ ██\n ▀██▄▄█▄████▄ ▀\n █▄████ █▄▄█▄█ "], ["eat_2", " ▄▄▄\n ▄▄▀▀▀▀▀█▀▄▀ █ \n▄▀ ▄▀▄ ▄█▄ ▀▄▄ █\n▀█▀▄▄▄█▀█▀▀█ █ █\n█▄█▄▄▄▄█▀██▄█ █\n ▀██▄▄▄██▄▄█▀▀▄█\n ▄▄█▄▄▄▀███▄▄▄▀ \n█▄████▀ █▄▄█▄█ "], ["happy", " ▄▄▀▀█▀▀▀█▀ ▄▀█▀\n█▄▄ ▀ ▀▄█▄ █ █ \n ▀▀▄█▀██▀████ \n ▄▄▄▀ ██▄████▀█\n ▄█▄▄▄█▄▄██ ▀▄██\n█▄▀██▄▄▄▄▄█▄▄ █\n ▀██▄▄█▄▄███▄▀▄█\n █▄████ █▄▄█▄█ ▀"], ["injured_1", " ▄▄\n ▄▄▄▀▀▀▀█▀ ▄▀ █\n▄▀ █▄ ▄█▄ █ █ \n▀▄▄▄▄▄▀▀███▄▀█ █\n ▄█▄▄▄▄▀▀▄▄▀▄▀ █\n█▀█▄█▄▄█▀████▄ █\n ███▄▄▄██▄██▄ ▀█\n█▄█▄▄█▀▀█▄▄█▄█ "], ["injured_2", " \n ▄▄▄▄▄▄ ▄▄\n ▄▀▀█ ▄▀ ▄▀ █\n█ ▀▀▄███▄▀▄▄█ \n ▀█▀▀▀ ▄█▀▀█ ██ \n▄██▀█▀▀▄▄██▄█▀ █\n▀▄██▀▀▀█▄▀███▄ █\n█▄▄███████▄▄▄█▀█"], ["sleep_1", " \n \n ▄▄▄▀▀▀▀█▀ ▄▀█▀\n▄▀ ▄▄ ▄█▄ █ █ \n▀█▀▄▄▄█▀███▄▀▄▀█\n▄▄█▄▄▄▄▀▀▄▄▀▄█ █\n█ ▀▄█▄▄█▀██▀ ▀▄█\n█▄▄█▄▄▄██▄█▄▄▄█▀"], ["sleep_2", " \n ▄▄▄▄▄▄ \n ▄▀▀▀ ▄▀ ▄▀█▀\n█▄▄ ▀▀▄███▄█▄▀█ \n █▄▀▀▀▀▄█▀▄▄▀▄██\n█▄█▀█▀▀██▀████ █\n█ ▀████▀██▄▀ ▀▄█\n█▄▄█▄▄▄████▄▄▄█▀"], ["walk_1", " ▄▄▄▀▀▀▀█▀ ▄▀█▀\n▄▀ ▄█▀▄█▄ █ ▀▄\n▀█▀▄▄▄█▀███▄▀█ █\n ▀▄▄▄▄▀▀▄▄▀▄▀ █\n▄██▄█▄▄█▀████▄ █\n▀▄██▄▄▄▀█▄█▀ ██\n ▄██▄▄▀█████▄ ▀\n█▄████ █▄▄█▄█ "], ["walk_2", " ▄▄▄▄▄▄ ▄█▀\n ▄▀▀▀▄▄ ▄▀ ▄▀ ▀▄\n█▄▄ ▀▀▄███▄▀▄▄ █\n ▀▄▀▀▀▀▄█▀▀█ █ █\n▄██▀█▀▀▄▄██▄█ █\n▀▄██▀▀▀█▄▀██▀▀▄█\n ▄▄█▀▀█▀███▄▄▄▀ \n█▄████▀ █▄▄█▄█ "]]], + ["cyberdramon_x", [["angry", " ▄▄▄▄▄ \n ▄▄██▀▀▀ ▄▀ ▄▄\n ▄▀▀ ▄▄▄█▀ ▄██▀\n ▀█▀▀▀ ██▄▀▀██▀ \n █▀█▀██ ▀ █ \n ▄█▀▄▀███▀█▄ \n █ ████ ▄▀██▄ \n ▄███▀ ▀▀█▄█▄▀▀█"], ["attack", " ▄▄▄██▀▀█▀\n ▄█▀▀▀ ▄▄▀ ▄\n █▄▄▄▀████▄▄██\n▀▀▄▄█▄▄██▀▄ ██▀ \n▀▀▄█▄█▄▄█▄▄█▀ \n▀▀ ▀▄▀██████▄ \n ▄██▀█▄▀█ ▀█\n ▄█▄█▀ ▀█▄█▄ "], ["eat_1", " ▄▄▄▄██▀▀█ \n▄▄█▀▀▀ ▄▄▀ ▄██\n▀▄▄▄▄█▀██▀▄▄███ \n ███▀▄██▀▄ █▀ \n █▄▄████▄▄▄▀ \n▄▀ █▄█▄█▀▀ ██▄ \n▀▄▄███▀█▄▄█ ▀██▄\n ▄█▄█▀ ▀█▄█▄ ▀"], ["eat_2", " ▄▄▄▄▄ \n ▄▄██▀▀▀ ▄▀ ▄▄\n ▄▀▀ ▄▄▄█▀ ▄██▀\n ▀█▀▀▀ ██▄▀▀██▀ \n █▀█▀██ ▄ █ \n ▄▀█▀▄▀█▀▀ █▄ \n ▀▄█████▄▄█▀██▄ \n ██▄█▀ ▀▀█▄█▄▀▀█"], ["happy", " ▄▄▄▄██▀▀█ \n▄▄█▀▀▀ ▄▄█ ▄██\n▀▄▄▄▀▀████ ███ \n ███▀▄██ ▄██▀ \n █▄▄█▀█████▀ \n █ █▄▀▄██▀██▄ \n ▀███▀██▀█ ▀██▄\n ▄█▄█▀ ▀█▄█▄ ▀"], ["injured_1", " \n ▄▀███▀▀█ \n ▄▀▄▀▀ ▄▄▀ ▄██\n █ ▄▀█▀▄▄███ \n ▀█▄█▄██▀▄ █▀ \n █▄▀▄▀█▄▄█▀ \n ▄▀ ▀█▄█▀ █▄ \n █▄▄████▄▄▄▀██▄ "], ["injured_2", " \n ▄▄▄▄▄▄▄▄ \n ▄▀▄█▀▀ ▄▀▀ ▄▄\n ▄▀ ▀ ▄▄█▀ ▄▄██▀\n █▄ ▄▀▄█▄▀▀███▀ \n ██▀█▀█ █▄██ \n ▄▀ ▀▄▀█▀ █▄ \n █▄▄████▄▄▄▀██▄ "], ["sleep_1", " ▄▄▄▄▄ \n ▄▄██▀▀▀ ▄▀▄██\n ▄▀▀ ▄▄▄▀█▄███ \n ▀█▀▀▀ ██▀▄ █▀ \n ▄▀▀▀▀▀▀▀▀▀▀▀▀▄ \n █ ██▀█▀█▀█▀█ █ \n █ █▄█▄█▄█▄██ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▄▀ "], ["sleep_2", " ▄▄▄██▀▀█ \n ▄█▀▀▀ ▄▄▀ ▄██\n █▄▄▄▄▀██▀▄▄███ \n ▀▄▄▄▄██▀▄ █▀ \n ▄▀▀▀▀▀▀▀▀▀▀▀▀▄ \n █ ██▀█▀█▀█▀█ █ \n █ █▄█▄█▄█▄██ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▄▀ "], ["walk_1", " ▄▄▄██▀▀█ \n ▄█▀▀▀ ▄▄▀ ▄██\n █▄▄▄▄▀██▀▄▄███ \n ▀▄▄▄▄██▀▄ █▀ \n ▄█▄▀▄██▄▄▄▀ \n▄▀ █▄█▄█▀▀ ██▄ \n▀▄▄███▀█▄▄█ ▀██▄\n ▄█▄█▀ ▀█▄█▄ ▀"], ["walk_2", " ▄▄▄▄▄ \n ▄▄██▀▀▀ ▄▀ ▄▄\n ▄▀▀ ▄▄▄█▀ ▄██▀\n ▀█▀▀▀ ██▄▀▀██▀ \n █▀█▀██ ▀ █ \n ▄▀█▀▄▀███▀█▄ \n█ █████ ▄▀██▄ \n ██▄█▀ ▀▀█▄█▄▀▀█"]]], + ["cyclonemon", [["angry", " ██▄ \n ▄▄█▀█████ \n▄████▄▄███ █ \n▀█▀█▀█▀█▀ █ \n ▀█▀█ ▀▀▄ \n ▄█▄█▄█▄▀ █▀▀ █ \n ▀▄▄▄▄▄▄▄██▄▄▄▀█\n █▄█▄▄█▀█▄█▄█▄█ "], ["attack", " ▄▄ \n ▄▄▄███▄ \n ██▀▀███▀█ \n▄███▄▄███▀ █ \n▀▀█▀█▀█▀█▄▄▀▀▀▄ \n▄█▀▀▀▀▀▀▀▄▄▀▀▄ █\n▀▄███▀▀▀▀ █▄▄▄▄▀\n█▄█▄▄█▀▀▀█▄█▄█▄█"], ["eat_1", " ▄▄ \n ▄▄▄███▄ \n ██▀▀███▀█ \n▄███▄▄███▀ █ \n▀▀█▀█▀█▀█▄▄▀▀▀▄ \n▄█▀▀▀▀▀▀▀▄▄▀▀▄ █\n▀▄███▀▀▀▀ █▄▄▄▄▀\n█▄█▄▄█▀▀▀█▄█▄█▄█"], ["eat_2", " ██▄ \n ▄▄█▀█████ \n▄████▄█▄██ █▄▄▄ \n▀█▀█▀█▀█▀ █ █\n █▀█▀▄█▀ █\n ▄█▄█▄▀ ▄▀ ▄▄▀ \n ▀▄▄▄▄▄▀ ▄▄▄▄█▀█\n █▄█▄▄█▀█▄█▄█▄█ "], ["happy", " ██▄ \n ▄▄█▀█████ \n▄████▄█▄██ █▄▄▄ \n▀█▀█▀█▀█▀ █ █\n █▀█▀▄█▀ █\n ▄█▄█▄▀ ▄▀ ▄▄▀ \n ▀▄▄▄▄▄▀ ▄▄▄▄█▀█\n █▄█▄▄█▀█▄█▄█▄█ "], ["injured_1", " ▄▄▄ \n ▄▄████ \n ████████ \n ████████ █ \n ████▄▄▄█▀▄▀▀▄ \n█▀██▀▀▀▀▄▄▀█▀█▀▄\n█ █▀█▀▀▄█ █\n▀▄▄█▄█▄▄▄▄█▄▄▄▀ "], ["injured_2", " ▄▄▄ \n ▄▄████ \n ████████ \n ████████ █ \n ████▄▄▄█▀▄▀▀▄ \n█▀██▀▀▀▀▄▄▀█▀█▀▄\n█ █▀█▀▀▄█ █\n▀▄▄█▄█▄▄▄▄█▄▄▄▀ "], ["refuse", " ▄▄ \n ▄▄▄███▄ \n ██▀▀███▀█ \n▄███▄▄███▀ █ \n▀▀█▀█▀█▀█▄▄▀▀▀▄ \n▄█▀▀▀▀▀▀▀▄▄▀▀▄ █\n▀▄███▀▀▀▀ █▄▄▄▄▀\n█▄█▄▄█▀▀▀█▄█▄█▄█"], ["sleep_1", " ▄▄▄ \n ▄▄████ \n ████████ \n ████████ █ \n ████▄▄▄█▀▄▀▀▄ \n█▀██▀▀▀▀▄▄▀█▀█▀▄\n█ █▀█▀▀▄█ █\n▀▄▄█▄█▄▄▄▄█▄▄▄▀ "], ["sleep_2", " ▄▄▄ \n ▄▄████ \n ████████ \n ████████ █ \n ████▄▄▄█▀▄▀▀▄ \n█▀██▀▀▀▀▄▄▀█▀█▀▄\n█ █▀█▀▀▄█ █\n▀▄▄█▄█▄▄▄▄█▄▄▄▀ "], ["walk_1", " ██▄ \n ▄▄███████ \n ▄▄█▀ ▄███ █ \n████████▀ █ \n ▀▄▄▄▄▄▀▀▀▀▄▀▄ \n ▄▀ █▄█▄▄▀▀█ █ \n ▀▄▄█▄ ▀▄▄▄▄█▀█\n █▄█▄▄█▀█▄█▄█▄█ "], ["walk_2", " ▄▄ \n ▄▄▄███▄ \n ██▀▀███▀█ \n▄███▄▄███▀ █ \n▀▀█▀█▀█▀█▄▄▀▀▀▄ \n▄█▀▀▀▀▀▀▀▄▄▀▀▄ █\n▀▄███▀▀▀▀ █▄▄▄▄▀\n█▄█▄▄█▀▀▀█▄█▄█▄█"]]], + ["damemon", [["angry", " ▄▄ \n ▄▀ █▄ \n ▄▀▀▀▀▀▀▄ \n ▄▀▄ ▄ ▄█ \n█▀█ ▀▀ ▀▀ █▀█\n▀█ ▀█▄▄▄▄▄▄█▀ █▀\n ▀▄▄█ █▄▄▀ \n █▄▄▄█▀▀▀▀█▄▄▄█ "], ["attack", " ▄▀▀▀▄ \n ▄▀ ▄█ ▄▄▄▄\n █▄▀█▀ █▄▄▄▀\n ▄▀▀▀█ █▄▄█\n █▀▀▀█▀█▀▀██▀▄ \n ▀▄▄▀▀██▄▄▄█▄ ▀█\n ▄▀▄▄█▄▀▀▄█▀▀\n █▄▄▄█ █▄▄▄█ "], ["eat_1", " ▄▀█ \n ▄█▄▄██ \n █▄ ▄ ▀▄ \n█▀▄▀ ▀ ▀ ▀ ▀▄▀█\n▀▄█▄███████▄▄█▄▀\n█▀ ▄▀██▄▄▄▀ ▄▀ █\n ▀▀█▄▄▄▄▄▄▄██▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["eat_2", " ▄▄ \n ▄▀ █▄ \n ▄▀▀▀▀▀▀▄ \n▄▄ ▄▀ ▄█ ▄▄\n█ █ ▄▀▄ ▄▀▄ █ █\n▄▀█▀▄▄▄▄▄▄▄▀▀█▀▄\n▀▄█▄▄▀▀▀▀▀ ▄▄█▄▀\n █▄▄▄█▀▀▀▀█▄▄▄█ "], ["happy", " ▄▀█ \n ▄█▄▄██ \n█▀▄ █▄ ▄ ▀▄▄▀█\n█ █▀ ▀ ▀ ▀ ▀█ █\n▄▀█▄███████▄▄█▀▄\n▀▄█ ▀█████▀ █▄▀\n ▀▄▄▄▀▀▀▄▄▄█▀ \n █▄▄▄█▀▀█▄▄▄█ "], ["injured_1", " \n ▄▀█ \n ▄█▄▄██ \n █ ▀▄ \n▄▄▄▀ ▄ ▄ ▀▀▄▄▄\n█ █▄▀▀▀ ▀▀▀▄▄█ █\n▄▀█▀█▄▄▄▄▄▀▀▄█▀▄\n▀▄█▄▄█▄▄▄█▄▄▄█▄▀"], ["injured_2", " \n ▄▄ \n ▄▀ █▄ \n ▄▀▀▀▀▀▀▄ \n ▄▀ ▄█ \n▄▀█ ▄▄█ █▄▄ █▀▄\n█▀█▀█▄▄▄▄▄▀▀▄█▀█\n▀▄█▄▄█▄▄▄█▄▄▄█▄▀"], ["sleep_1", " \n ▄▀█ \n ▄█▄▄██ \n █ ▀▄ \n ▄▀▄▄▄▄▄▄▄▀▀▄ \n █ ▄█ \n █ ▀▀▀▀▀▀▀▀▀▀ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▄▀ "], ["sleep_2", " ▄▄ \n ▄▀ █▄ \n ▄▀▀▀▀▀▀▄ \n ▄▀ ▄█ \n █ ▀▀▀▀▀▀▀ █ \n ▄▀█▄▄▄▄▄▄▄▄█▀▄ \n █ ▀▀▀▀▀▀▀ █ \n ▀▄▄▄▄▄▄▄▄▄▄▀ "], ["walk_1", " ▄▀█ \n ▄█▄▄██ \n █ ▀▄ \n█▀▄▀▄▀▄ ▄▀▄▀▀▄▀█\n▀▄█▄ ▀ ▀ ▄▄█▄▀\n█ █ ▀█████▀ █ █\n ▀▀█▄▄▄▄▄▄▄██▀▀ \n █▄▄▄█ █▄▄▄█ "], ["walk_2", " ▄▄ \n ▄▀ █▄ \n ▄▀▀▀▀▀▀▄ \n▄▄ ▄▀▄ ▄ ▄█ ▄▄\n█ █ ▀▄▀ ▀▄▀ █ █\n▄▀█▀▄▄▄▄▄▄▄▀▀█▀▄\n▀▄█▄▄▀▀▀▀▀ ▄▄█▄▀\n █▄▄▄█▀▀▀▀█▄▄▄█ "]]], + ["darcmon", [["angry", " ▄▀█▀█████▄ \n ██▄█▀▀▀███▄▀▀▄ \n █ ▄█ ▀██ █\n ▀███▄ █ █▀▄█\n ▄▀█▄▄▄▄█▀ █▀▄ ▀\n ▀▄█▄▀▄▄█▄▀█ █ \n █▀██▀▀▄ ▀▄ █ \n █▄▄█ █▄▄█ ▀▀ "], ["attack", " ▄▄▄▄▄▄▄▄ \n █▄▀▄██████ ▄▄ \n ▀█▀▀▄▄ ▀███ ▀▄\n █▄▄▀ ▀ ▀█ ▄▄ █\n ▀▄▄▄▄▄███▄ ▀█\n ▄▀█▄█▄▄▀ █ ▀▄ \n ▀▄██▄██▄▄██ █ \n ██▄▄█▀▄▄▄▄█▀▄█ "], ["eat_1", " ▄▄▄▄▄▄▄▄ \n █▄▀▄██████ ▄▄ \n ▀█▀▀ ▄▀███ ▀▄\n █▄▄ ▀ ▀ █ ▄▄ █\n ▀▄▄▄▄▄███▄ ▀█\n ▄▀█▄█▄▄▀ █ ▀▄ \n ▀▄██▄██▄▄██ █ \n ██▄▄█▀▄▄▄▄█▀▄█ "], ["eat_2", " ▄▀█▀█████▄ \n ██▄█▀▀▀███▄▀▀▄ \n █ █▀▄ ▀█▀ █\n ▀██▄▄ ▄█▄▀▀▄█\n ▄█▀▀▀▄█▀█▀▀▄ ▀\n █ ██▀██ █▄ █ \n ▀█▀██▀▀█▀▀▄ █ \n █▄▄█ █▄▄█ ▀▀ "], ["happy", " ▄▀█▀█████▄ \n ██▄█▀▀▀███▄▀▀▄ \n █ ▄▀▄▀█▀ █\n ▀██▄▄ ▄█▄▀▀▄█\n ▄█▀▀▀▄█▀█▀▀▄ ▀\n █ ██▀██ █▄ █ \n ▀█▀██▀▀█▀▀▄ █ \n █▄▄█ █▄▄█ ▀▀ "], ["injured_1", " \n ▄▄▄▄▄▄▄▄ \n █▄▀▄██████▄▀▀▄ \n ▀█▀▀ ▄ ▀██▀ █\n █▄▄ ▀▀ ▀█▄▀▀▄█\n▄▄ ▀▄▄▄▄▄████▄ ▀\n█ ▀█▄█▄▄▀▄▀ █▀▄\n█▄▄▄█▄███▄▄▄▄▀▄█"], ["injured_2", " \n \n▄▀█▀█████▄ ▄▄ \n██▄█▀▀▀████ ▀▄ \n █ █▄ ██ ▄▄ █ \n▄██▀ ▄██▄▄██ \n█ ▀█▀█▀█▀▄▀ █▀▄\n█▄▄▄█▄███▄▄▄▄▀▄█"], ["refuse", " ▄▄▄▄▄▄▄▄ \n █▄▀▄██████ ▄▄ \n ▀█▀▀ ▄▀███ ▀▄\n █▄▄ ▀▀ ▀█ ▄▄ █\n ▀▄▄▄▄▄███▄ ▀█\n ▄▀█▄█▄▄▀ █ ▀▄ \n ▀▄██▄██▄▄██ █ \n ██▄▄█▀▄▄▄▄█▀▄█ "], ["sleep_1", " \n ▄▀█▀█████▄ \n ██▄█▀▀▀███▄▀▀▄ \n █ ▄▄ ██▀ █\n ▀█▀ ▄█▄▀▀▄█\n▄▄ ▄▀█▀▀█▀███▄ ▀\n█ ▀██▀██ ▄▀ █▀▄\n█▄▄▄█████▄▄▄▄▀▄█"], ["sleep_2", " \n ▄▄▄▄▄▄▄▄ \n █▄▀▄██████▄▀▀▄ \n ▀█▀▀ ▀██▀ █\n █▄▄ ▀▀ ▀█▄▀▀▄█\n▄▄ ▀▄▄▄▄▄████▄ ▀\n█ ▀█▄█▄▄▀▄▀ █▀▄\n█▄▄▄█▄███▄▄▄▄▀▄█"], ["walk_1", " ▄▀█▀█████▄ \n ██▄█▀▀▀███▄▀▀▄ \n █ █▀▄ ██▀ █\n ▀█▀ ▄█▄▀▀▄█\n ▄▄▀█▀▀█▀█▀▀▄ ▀\n █ ██▀██ █▄ █ \n ▀█▀██▀▀█▀▀▄ █ \n █▄▄█ █▄▄█ ▀▀ "], ["walk_2", " ▄▄▄▄▄▄▄▄ \n █▄▀▄██████ ▄▄ \n ▀█▀▀▄▄ ▀███ ▀▄\n █▄▄▀ ▀ ▀█ ▄▄ █\n ▀▄▄▄▄▄███▄ ▀█\n ▄▀█▄█▄▄▀ █ ▀▄ \n ▀▄██▄██▄▄██ █ \n ██▄▄█▀▄▄▄▄█▀▄█ "]]], + ["darkdramon", [["angry", " ▄▄ ▄▄▄▄ \n ▄▀▄▀▀ ▄▀ \n ▄▀ ▀ ▄█ █▄██▀ \n █▄▄▄▄▄ ▄█▀ █▄ \n ▀▄▄▄▄██ ▄▀ █ \n ▄▀ █ █ █▀ ▄▀ \n ██▀▀▄▄▄▄██▀▀▀▄ \n█▄█▄▄▄▀▀▀█▄█▄█▄█"], ["attack", " ▄▄▀▀▀▀█ \n ▄▀▀ ▄ ▄█▄▄\n █▄▄▄▀▀▄█▀▀█ \n ▄▄▄█▄▄▄▄█ ▄▀ \n▄▀▀ ▀▄▀ █▀ \n ▀█▄▄▄▄█▄███ \n ▄█▀▀▀█████▀▀▀▄ \n█▄█▄▄▄▀▀▀█▄█▄█▄█"], ["eat_1", " ▄▀█▄▀▀▀█ \n ▄▀▄▀ ▄ █ ▄▄▄ \n █ ▀ ▀▄█▀█▀ \n ▀█████ █▀ ▄█▀█ \n ██▀▀▀▄▀▄█▀ █ \n █ ▀█▀▀▀ ▄█ ▄▀ \n ▄█▀▀█████▀▀▀▄ \n█▄█▄▄▄▀▀█▄█▄█▄█ "], ["eat_2", " ▄▄ ▄▄▄▄ \n ▄▀▄▀▀ ▄▀ \n ▄▀ ▀ ▄▀▄ █▄██▀ \n █▄▄▄▄▄ ▄█▀ █▄ \n ▀▄▄▄▄██ ▄▀ █ \n ▄▀ █ █ █▀ ▄▀ \n ██▀▀▄▄▄▄██▀▀▀▄ \n█▄█▄▄▄▀▀▀█▄█▄█▄█"], ["happy", " ▄▀█▄▀▀▀█ ▄ \n ▄▀▄▀ ▄ █▄▀ █ \n █ ▀ ▀▄██ █ \n ▀█████ █▀ █▄▄▀ \n ▄▀█▀▀▀▄▀▄█▄▀ \n█▄▄██▀▀▀ ▄█ \n ▄█▀▀█████▀▀▀▄ \n█▄█▄▄▄▀▀█▄█▄█▄█ "], ["injured_1", " \n ▄▀█▄▀▀▀█ \n ▄▀▄▀ ▄ █ ▄▄▄ \n █ ▀▀▄█▀█▀ \n ▀█▀▀▀▀▄█▀ ▄█ \n █ █▀█▀█▀▄▀ ▀█ \n▄█ ▀▄█ █▄▀ ▄▀▄ \n█▄█▄██▄██▄▄█▄█▄█"], ["injured_2", " \n ▄▄ ▄▄▄▄ \n ▄▀▄▀▀ ▄▀▄▄▄ \n▄▀ ▀ █▄ █▀█▀ \n█▄▄▄▄▄ ▄█▀ █▄ \n▄▀▄▄▄▄█▀▀▄▀ ▀█ \n█ ▀█ █ ▄▀ ▄█▄ \n█▄▄█▄█▄██▄▄█▄█▄█"], ["sleep_1", " \n \n ▄▀█▄▀▀▀█ \n ▄▀▄▀ █ ██▀ \n█ ▀▀ ▄██▀▀▄ \n █▀▀▀▀▄█▀ ▀▄█ \n █▀██▀█ ▄▀█▀█▀▄\n █▄▄█▄█▄▄█▄▄▄▄▄█"], ["sleep_2", " \n ▄▄ ▄▄▄▄ \n ▄▀▄▀▀ ▄▀ \n ▄▀ ▀ ▄▄ █ ▄█▀ \n ▀▄▄▄▄▄ ▄█▀█ ▀▄ \n █▀▄▄▄▄█▀ █▄▀ \n █▄ █ █ ▄▀█▀█▀▄\n █▄███████▄▄▄▄▄█"], ["walk_1", " ▄▀█▄▀▀▀█ \n ▄▀▄▀ ▄▄ █ ▄▄▄ \n █ ▀▀ ▄█▀█▀ \n ▀█▀▀▀▀▄█▀ ▄█ \n █▀█▀█▀▄█ ▀█ \n ▄▀ ▄▀ ▀ █ ▄▀ \n ██▀▀█████▀▀▀▄ \n█▄█▄▄▄▀▀█▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄▄▄ \n ▄▀▄▀▀ ▄▀ \n ▄▀ ▀ ▄█▀ █▄██▀ \n █▄▄▄▄▄ ▄█▀ █▄ \n ▀▄▄▄▄██ ▄▀ █ \n ▄▀ █ █ █▀ ▄▀ \n ██▀▀▄▄▄▄██▀▀▀▄ \n█▄█▄▄▄▀▀▀█▄█▄█▄█"]]], + ["darkknightmon", [["angry", " █▀▄▄▄█▀█ \n ▀▄▀ █▄▄█▄ \n ████▀▄██ \n █▀▀████▀▄█ ▄ \n ▄▀▀▀█▀██████ \n ▄▀▄▀ ▀▄█▀ █▀█▀ \n ▀▄██▄███▄▄▀ \n █▄▄█ █▄▄█ "], ["attack", " ▄▄██▀▀█ \n ▄▀ ██▄██▄ \n ▀███▀ ▄██▄█ \n █▀▀▀███████\n ▄▄▄▀▀█▀███ ▀█▀█\n▀▄▄▄ █ █ ▄█▀ ▀\n █▀▀███████▄ \n █▄▄█▀ ▀▀█▄▄▄█ "], ["eat_1", " █▀▄▄▄█▀█ \n ▀▄▀ █▄▄█▄ \n ███▀▄▀██ ▄ \n▄▄ █▀▀▀▀███▀▀▄█ \n█ ▀█▄▄▄█▀█▀ ▄██ \n ▀▀█▀ ▀▄███▀ ▀ \n ▄██▄█████▄ \n █▄▄█ █▄▄█ "], ["eat_2", " █▀▄▄▄█▀█ \n ▀▄▀ █▄▄█▄ \n ███▀▄▀██ \n █▀█▀▀▀███▀▄█ ▄ \n █ ▄▀▀▀█▀██▀███ \n ▀▄▀ ▀▄█ ▄▀█▀ \n ▄██▄█████▀ \n █▄▄█ █▄▄█ "], ["happy", " █▀▄▄▄█▀█ \n ▀▄▀ █▄▄█▄ \n ███▀▄▀██ \n ▄█▀▀▀▀███▄▄ \n █ █ ▄▀█▀ █▄█ \n ▀▄▀▀▀▄██▄████ \n ▄██▄███▄▄▀ ▀ \n █▄▄█ █▄▄█ "], ["injured_1", " ▄▄ ▄▄▄ \n █ █▀█▀ █ \n █▄▄█████ \n ███ ▀▀██ ▄ \n ▀██████▀▄██▄█\n ▄▀ ▄█▀▄▀▀█ ███\n ▀▄▄▄█▀█▀ ██▄▀ \n █▄▄█▀█▄▄█▄█ "], ["injured_2", " \n █▀▄▄▄█▀█ \n ▀▄▀ █▄▄█▄ \n ███▀████ \n ███▄▄▄██ █▄ ▄ \n ▄▀▀██▀█▀▀▄▀███\n ▀▄▄▄█▀█▀ ██ █▀\n █▄▄█▀█▄▄█▄█ "], ["sleep_1", " \n \n █▀▄▄▄█▀█ \n █ █ █▀▄█▄ \n █▄▄█████ \n ███▄▄▄██▄▄ \n █▀██▀▀▀█▀ █ \n █▄▄██▄██▄▄▄██▄"], ["sleep_2", " \n ▄▄ ▄▄▄ \n █ █▀██ █ \n ▀▄▀ █▄███ \n ███▀▀▀██ \n ▀██████▄▄ \n █▀█▄▀ ▀▄▀ █ \n █▄▄██▄██▄▄▄██▄"], ["walk_1", " █▀▄▄▄█▀█ \n ▀▄▀ █▄▄█▄ \n ███▀ ▄██ \n █▀▀▀███▀▄█ ▄ \n ▄▀▀▀█▀██████ \n ▄▀▄▀ ▀▄█▀ █▀█▀ \n ▀▄██▄███▄▄▀ \n █▄▄█ █▄▄█ "], ["walk_2", " ▄▄ ▄▄▄ \n █ █▀█▀ █ \n █▄▄█▀▀██ \n ███▄▄███ ▄ \n ▀▄▄▄███▄██▄█ \n ▄▀▀▄ ▄▀▄▀ ▀███ \n ▀▄█▄ ▄███▄▄▀▀ \n █▄▄█▀▀▀▀█▄▄█ "]]], + ["darkknightmon_x", [["angry", " ▄▄ ▄▄▄▄ ▄▄ \n █▄▀█▀▀▀█▀ █ \n ▀█▄▄▄█▀██▀ \n ▄ █▄██▄▄██▄█▄ ▄\n █▀▀█▄▄█▀█▀ ████\n ██▄ ▄▄▀██▀█ ▀█\n █▄█▄ ▄██▄▄██ \n █▄▄█▀▀▀▀█▄▄█▀▀ "], ["attack", " █▀▄▄████▄▀█ \n ██ ▀ ▄▄█▄▄▀ \n █▀██▀ ██▄█ \n ██▀▀████ ▀▄█▄█\n ▄█▀▀▀▀▄█▀▀█▀██\n █ █▀ ██▀▀█▄█ ▀\n █ ▀█▀ ▄█████ \n ▀▄▄▄█▀█▄▄█▀▀▀ "], ["eat_1", " █▀▄▄████▄▀█ \n ██ ▀ ▄▄█▄▄▀ \n █▀██▀▄▀█ ▄ \n █▄█▀▀▀▀███▀██▄█\n █▄██▄▄███▄▄▀███\n█ █▀ ▀▀▄██ █▀▀\n▀▀███▄▄███████ \n █▄▄█ █▄▄█▀▀▀ "], ["eat_2", " ▄▄ ▄▄▄▄ ▄▄ \n █▄▀█▀▀▀█▀ █ \n ▀█▄▄▄█▀██▀ \n ▄ █▄██▄█▄█▄█▄ ▄\n █▀▀█▄▄█▀█▀ ████\n▄▀▀█▄ ▄▄▀██▀▀▄▀█\n▀▄▄█▄ ▄███▄▄█ \n █▄▄█▀▀▀▀█▄▄█▀▀ "], ["happy", " █▀▄▄████▄▀█ \n ██ ▀ ▄▄█▄▄▀ \n █▀██▀▄▀█▄▄▄ \n █▄██▀▀████ █▄█\n ▀▄▄▀▀▀▀▄█ ▄████\n ▄▀█▀ ▀▀▄████ ▀█\n ▀▄██▄▄██▄▄███ \n █▄▄█ █▄▄█▀▀▀ "], ["injured_1", " \n █▀▄▄████▄▀█ \n ██ ▀ ▄▄█▄▄▀ \n █▀███ ▀█ ▄ \n █▄██▀▀████▀█▄▄ \n ▀▄▄▀▀▀▀▄█▄▄█▀██\n▄▀▀█▀ ▀▀▄▀▀▀█▄ ▀\n█▄▄██▄▄██▄▄▄█▀█ "], ["injured_2", " \n ▄▄ ▄▄▄▄ ▄▄ \n █▄▀█▀▀▀█▀ █ \n ▀█▄▄▄█▀██▀ \n █▄███▄▄█▄█ \n █▀█▄▄█▀█▀ ███▄ \n▄▀▀█▀ ▀▀▄▀▀▀█▀██\n█▄▄██▄▄██▄▄▄██▄▀"], ["sleep_1", " \n ▄▄ ▄▄▄▄ ▄▄ \n █▄▀█▀▀▀█▀ █ \n ▀█▄▄▄████▀ \n █▄██▄▄██▄█ \n ███▄▄▀▀██▄█▄█ ▄\n█▄██▀ ▀▀▄█▄▄████\n█▄▄██▄▄███▄▄▄█▀█"], ["sleep_2", " \n █▀▄▄████▄▀█ \n ██ ▀ ▄▄█▄▄▀ \n █▀██▀▀██ ▄ \n █▄██▀▀████▀█▄ \n █▄▄▀▀▀▀▄█▄▄██▄█\n█▄██▀ ▀▀▄█▄▄████\n█▄▄██▄▄███▄▄▄█ ▀"], ["walk_1", " █▀▄▄████▄▀█ \n ██ ▀ ▄▄█▄▄▀ \n █▀██▀ ▄█ ▄ \n █▄██▀▀████▀██▄█\n ▀▄▄▀▀▀▀▄█▄▄████\n ▄▀█▀ ▀▀▄█▀ █ ▀█\n ▀▄██▄▄███▄▄██ \n █▄▄█ █▄▄█▀▀▀ "], ["walk_2", " ▄▄ ▄▄▄▄ ▄▄ \n █▄▀█▀▀▀█▀ █ \n ▀█▄▄▄█▀▀█▀ \n ▄ █▄██▄▄██▄█▄ ▄\n █▀▀█▄▄█▀█▀ ████\n ██▄ ▄▄▀██▀█ ▀█\n █▄█▄ ▄██▄▄██ \n █▄▄█▀▀▀▀█▄▄█▀▀ "]]], + ["darknessbagramon", [["angry", "▄ ▄▄ ▄▄▄▄ ▄ \n█▀▄█ ▀████▀▀█ \n ▀██▀▀ ▄▀██▀ ▄ \n ▄█▀▀ ▀▀ ███▄███\n█▄▀█▄▄▄▄▀ ▄█▀▀██\n█ ██▄ ▄ █▀ █▄▄ ▀\n ███▄▄▄███▀████▄\n█▄█▄█▀▀▀▀██▄█ ██"], ["attack", "█▄ █▀▄████▄▄█ \n▀▄██▄▄▀▀██▄▄▀ \n ██▄ ▄█ ██▄▄█▄ \n ▀▄▄▄▄ ▄█▀▀████\n ▄████ █▄▄▀▄ ▀█\n █ █▄▄▄███ ██▄ \n ██▀▀███▀█▀▀███\n █▄█▄█ ▀██▄█ ▀██"], ["eat_1", "█▄ █▀▄████▄▄█ \n▀▄██▄▄▀▀██▄▄▀ \n █▀▄ ▄▀▄██▄ ▄█▄\n ▀▄▄▄▄▄ █▀█████\n ██▀▀█ █▄█ ▀█\n ▄▀█▀▀▀▄██ ██▄▄ \n █▄█▀▀███▄▄█▀███\n █▄█▄█ ▀██▄█ ▀██"], ["eat_2", "▄ ▄▄ ▄▄▄▄ ▄ \n█▀▄█ ▀████▀▀█ \n ▀██▀▀ ▄▀██▀ ▄ \n █ ▀ ▀ ▀███▄███\n █▄▄▄▄▀ ▄█▀▀██\n ▄▀█▄ ▄ ██▀█▄▄ ▀\n █▄█▄▄▄██▄▄████▄\n█▄█▄█▀▀▀▀██▄█ ██"], ["happy", "█▄ █▀▄████▄▄█ \n▀▄██▄▄▀▀██▄▄▀ \n █▀▄ ▄▀▄██▄▄█▄ \n ▀▄▄▄▄▄ █▀▄████\n ▄█████ █▀█▀ ▀█\n █ █▀▀▀▄█ ██▄▄ \n ▀▄█▀▀███▀█ ▀███\n █▄█▄█ ▀██▄█ ▀██"], ["injured_1", " \n▄ ▄▄ ▄▄▄▄ ▄ \n█▀▄█ ▀████▀▀█ \n ▀█▀▀▀ ▀██▀ ▄ \n █▄█ █▄ ███▄███\n █▀▄▄▄▄▄█▄▄█▀▀██\n▄▀▀█▄ ▄▀▀ █▀▀█▄▀\n█▄██▄▄█▄▄▄█▄▄███"], ["injured_2", " \n \n█▄ █▀▄████▄▄█ \n▀▄██▄▄▀▀██▄▄▀ ▄ \n █ ▄ ▄ ██▄ ███\n ▄▀█▀ ▀▀▄█▀██▀██\n▄▀▀██▀█▀▀ █▀▀█▄▀\n█▄██▄▄█▄▄▄█▄▄███"], ["sleep_1", " \n \n█▄ █▀▄████▄▄█ \n▀▄██▄▄▀▀██▄▄▀ ▄ \n █▄▄ ▄▄ ██▄▄███\n ▀▄ ▄▀▄██▀██\n█▀▄██▀█▀█▀▄▄▀█▄▀\n██▄█▄▄▄██▄██▄███"], ["sleep_2", " \n▄ ▄▄ ▄▄▄▄ ▄ \n█▀▄█ ▀████▀▀█ \n ▀█▀▀▀ ▀██▀ ▄ \n █▀▀ ▀▀ ███▄███\n █▄▄▄▄▀ ▄█▄▀██\n█▀▄█▄ ▄ █▀▄▄▀█▄▀\n██▄█▄▄▄██▄██▄███"], ["walk_1", "█▄ █▀▄████▄▄█ \n▀▄██▄▄▀▀██▄▄▀ \n ██▄ ▄█ ██▄ ▄█▄\n ▀▄ ▄▀▀█████\n ▄█▀▀▀▀▄▄▀█ ▀█\n █ █▀ ▀▄█ ██▄▄ \n ▀▄█▀▀███▀█ ▀███\n █▄█▄█▀ ██▄█ ▀██"], ["walk_2", "▄ ▄▄ ▄▄▄▄ ▄ \n█▀▄█ ▀████▀▀█ \n ▀██▀▀ ▄▀██▀ ▄ \n █▀▀ ▀▀ ███▄███\n █▄▄▄▄▀ ▄█▀▀██\n ▄▀█▄ ▄ █▀ █▄▄ ▀\n █▄█▄▄▄███▀████▄\n█▄█▄█▀▀▀▀██▄█ ██"]]], + ["darksuperstarmon", [["angry", " ▄██ \n ▄█▀██▄ \n▀███▀▀███▀▀████▀\n ▄███▄ ▄ ▄████▄ \n ██▄▀█▀▀▀██ ███ \n ▀█▀▄████▄▀█▀ \n ████▀▀████ \n ▄█████ █████▄ "], ["attack", " ▄█▄ ▄██ \n █ ██████▄ \n▄▄███▄█▀▀██████▀\n ▀███▀ ▄████▀▄██\n ▀▀█▀▀▀██▀▄███\n ▄▀ ▄█▄█▀▀▀ \n ▄████████▄ \n ▄█████ █████▄ "], ["eat_1", " ▀▄ ▄██ ▄ \n ▄▄▄▄▄▀███ \n ▀████▀▀▀█████▀\n █▀ ▄▄████▀ \n ▄▄█▀▀▀███▀█▄ \n ▀█▄▀ ▄█▀▄██▀ \n ███████▄█ \n ▄████ █████▄ "], ["eat_2", " ▄ ▄██ \n ▀ ▄▀███ ▀ \n █████▀▀▀█████▀\n ▀█▀ ▄▄████▀ \n ▄█▀▀▀▀▄██▀█▄ \n ▀█▄█████▀▄██▀ \n ███████▄█ \n ▄████ █████▄ "], ["happy", " ▀ ▄██ ▄ \n ▀▄▄█▀██▄ ▀ \n▀███▀▄ █ ▄▀████▀\n ▀█▀▀▀▀▀▀▀██▀ \n ▄█▀▄▄ ▄▄▄ ███▄ \n ▀██▄▀▀▀▀▄▀▄██▀ \n █▄██████▄█ \n ▄█████ █████▄ "], ["injured_1", " \n ▄▄ \n ▄███ \n▄▄▄▄▄██▄██▄▄▄▄▄▄\n ▀██▄ ▀▀▀ ▄███▀ \n ▄█▀██▄█▄███▀▄█ \n ███ █▀▄▄▀█ ███ \n ██████████████ "], ["injured_2", " \n \n ▀███▄ \n ▄▄▄▄████▄▄▄▄ \n▄███▀▀█▄█▀▀████ \n ▄█▀█▄ ▄ ▄██▀▄█ \n ███ █▀▀▀██ ███ \n ████▄███▄▄████ "], ["sleep_1", " \n \n ██▄ \n ▄████▄▄ \n▀█████▀████████▀\n ▄▀█▀▀███▀▀██▀▄ \n ██▄▀▄ ▄ ▄█▀▄██ \n ██████████████ "], ["sleep_2", " \n ██▄ \n ▄████▄▄ \n▀█████▀████████▀\n ▀█▀▀███▀▀██▀ \n ▄▀██▄ ▄ ▄███▀▄ \n ██▄▀██████▀▄██ \n ██████████████ "], ["walk_1", " ▄██ \n ▄████▄ \n▀███▀▀█▄█▀▀████▀\n ▀██▄ ▄ ▄███▀ \n ██▀██████▀██ \n ▀█▀▄████▄▀█▀ \n ▄███▀▀███▄ \n ▄█████ █████▄ "], ["walk_2", " ▄▄ \n ▄███ \n▄▄▄▄▄██▀███▄▄▄▄▄\n ▀██▄ ▀▀▀ ▄███▀ \n ▄█▀█▄█▄██▀█▄ \n ▀██▄▀██▀▄██▀ \n ▄█▄████▄█▄ \n ▄████▀▀████▄ "]]], + ["darktyrannomon", [["angry", " ▄▄▄███▀▀█▄▀█ \n██████▄▄████▄▄ \n ▀ ▀ ▀ ▀███▄▀ \n ███▀█ \n ▄ ▄ ▄ ▄▄▀ ██ ▄\n ▀▀▀█████ ███▀▄█\n ▄▄▄██████▄▄▄██▀\n█▄████▀▀▀█▄█▄█▄█"], ["attack", " ▄▄▄▄▄ ▄▄ \n ▄▄▄███▀▀██▄▀ \n██████▄▄████▀█ \n ▀ ▀ ▀ ██████▄▄ \n ▀█▀████▀ ██▄▀▄\n ██ ████ ████▀██\n ▄▄▄█████▄▄▄▄██ \n█▄████▀▀▀█▄█▄█▄█"], ["eat_1", " ▄▄▄▄▄ ▄▄ \n ▄▄▄███▀▀██▄▀ \n██████▄▄████▀█ \n ▀ ▀ ▀ ██████▄▄ \n ▀█▀████▀ ██▄▀▄\n ██ ████ ████▀██\n ▄▄▄█████▄▄▄▄██ \n█▄████▀▀▀█▄█▄█▄█"], ["eat_2", " ▄▄▄███▀▀█▄▀█ \n██████▄█████▄▄ \n ▀ ▀ ▀ ████▄▀ \n █████▀█ \n ▄ ▄ ▄███▀ ██ ▄\n ▀▀██████ ███▀██\n ▄▄███████▄▄▄██▀\n█▄████▀▀▀█▄█▄█▄█"], ["happy", " ▄▄▄███▀▀█▄▀█ \n██████▄█████▄▄ \n ▀ ▀ ▀ ████▄▀ \n █████▀█ \n ▄ ▄ ▄███▀ ██ ▄\n ▀▀██████ ███▀██\n ▄▄███████▄▄▄██▀\n█▄████▀▀▀█▄█▄█▄█"], ["injured_1", " \n ▄██████▄▀█ \n █████▀███▄▄ \n ▄████▄▄████▄▀ \n ██████▀▄████▀█ \n▄ ▀▀▀▀▄██▀▄█▄█▄█\n███ ██▀▄▄ ██████\n████▄█▄▀█▄▀████▀"], ["injured_2", " \n ▄██████▄▀█ \n █████▀███▄▄ \n ▄████▄▄████▄▀ \n ██████▀▄████▀█ \n▄ ▀▀▀▀▄██▀▄█▄█▄█\n███ ██▀▄▄ ██████\n████▄█▄▀█▄▀████▀"], ["refuse", " ▄▄▄▄▄ ▄▄ \n ▄▄▄███▀▀██▄▀ \n██████▄▄████▀█ \n ▀ ▀ ▀ ██████▄▄ \n ▀█▀████▀ ██▄▀▄\n ██ ████ ████▀██\n ▄▄▄█████▄▄▄▄██ \n█▄████▀▀▀█▄█▄█▄█"], ["sleep_1", " \n ▄██████▄▀█ \n █████▀███▄▄ \n ▄████▄▄████▄▀ \n ██████▀▄████▀█ \n▄ ▀▀▀▀▄██▀▄█▄█▄█\n███ ██▀▄▄ ██████\n████▄█▄▀█▄▀████▀"], ["sleep_2", " \n ▄██████▄▀█ \n █████▀███▄▄ \n ▄████▄▄████▄▀ \n ██████▀▄████▀█ \n▄ ▀▀▀▀▄██▀▄█▄█▄█\n███ ██▀▄▄ ██████\n████▄█▄▀█▄▀████▀"], ["walk_1", " ▄██████▄▀█ \n ▄▄███▀ ▄███▄▄ \n█████▀██████▄▀ \n ▀▄▄▄▄▄██████▀█ \n ▄ ▄██▀▄▄████▀ \n ██ ███▄▀▀▀▀▄█▄█\n ▄▄███████████▀\n █▄████ █▄█▄█▄█"], ["walk_2", " ▄▄▄▄▄ ▄▄ \n ▄▄▄███▀▀██▄▀ \n██████▄▄████▀█ \n ▀ ▀ ▀ ██████▄▄ \n ▀█▀████▀ ██▄▀▄\n ██ ████ ████▀██\n ▄▄▄█████▄▄▄▄██ \n█▄████▀▀▀█▄█▄█▄█"]]], + ["darktyrannomon_x", [["angry", " ▄▄▄ ▄▄ ▄▄ \n ▄█▄▀▄█████▄▀ \n███▄███▀ ██▄▀ ▄\n█ ███▀▄▄▀▄▀█\n▀▄▄▄▄▄███▄█▀▄█▄█\n ▀█▄▄▄▄██▄▄███▀ \n █▄▄▀█▀██▀█▄ \n █▄█▄█▀ █▄█▄█ "], ["attack", " ▄▄ ▄▄ ▄▄ \n ▄▀█▀█████▄▀ \n▄██▀▄█▀ ▄██▄▀ ▄\n█▀▀▀▀▀█████▄▀▄▀█\n ▀▀█▀▀██▀██▀██▄█\n ▄▀▄███▄▀▀▄███▀ \n ▀█▄▄▀█▀██▀█▄ \n █▄█▄█▀ █▄█▄█ "], ["eat_1", " \n ▄▄ ▄▄ ▄▄ \n ▄▀█▀█████▄▀ \n▄██▀▄█▀▄▀██▄▀ ▄\n█▀▀▀▀▀█████▄▀▄▀█\n ▀▀█▀▀██▀██▀██▄█\n ▄█▄███▄▀▀▄█▀█▀ \n █▄█▄█▀▀▀▀█▄█▄█ "], ["eat_2", " ▄▄▄ ▄▄ ▄▄ \n ▄█▄▀▄█████▄▀ \n███▄██▀▄▀██▄▀ ▄\n▀▄ ▀█████▄▀▄▀█\n ▀▄▄▄▄█▀▀█████▄█\n ▄▀███▄▀▀▀▄███▀ \n ▀▀█▄▄▀█▀██▀█▄ \n █▄█▄█▀ █▄█▄█ "], ["happy", " ▄▄ ▄▄ ▄▄ \n ▄▀█▀█████▄▀ \n▄██▀▄█▀▄▀██▄▀ ▄\n█▀▀▀▀▀███▀▀▄▀▄▀█\n █ ██ ██ ██▄█\n ▀▄▄▄███▄█████▀ \n █▄▄▀█▀██▀█▄ \n █▄█▄█▀ █▄█▄█ "], ["injured_1", " \n \n ▄██▄██▄█▀▄ \n ▄█▄▀▄█▀███▀▄ \n███▄███▄▄██▀▄ ▄█\n▀▄▄▄▄▄██████▄█ █\n ▄▄█▄▄█▀▄█ █▀█▀▀\n █▄█▄██▄▄▄█▄█▄█ "], ["injured_2", " \n \n ▄▄ ▄▄ ▄▄ \n ▄▀█▀█████▄▀ \n▄██▀▄██ ▀██▄▀ ▄\n█▀▀▀▀▀█████▄▀▄▀█\n ▀████▀▄█▀▄█▀█▄█\n █▄█▄█▄▄▄██▄█▄█ "], ["refuse", " \n ▄▄ ▄▄ ▄▄ \n ▄▀█▀█████▄▀ \n▄██▀▄██▀ ██▄▀ ▄\n█▀▀▀▀▀█████▄▀▄▀█\n ▀▀█▀▀██▀██▀██▄█\n ▄█▄███▄▀▀▄█▀█▀ \n █▄█▄█▀▀▀▀█▄█▄█ "], ["sleep_1", " \n \n ▄▄ ▄▄ ▄▄ \n ▄▀█▀█████▄▀ \n▄██▀▄██▀▀██▄▀ ▄\n█▀▀▀▀▀█████▄█▄▀█\n▄▀█▀▀█▀▄███▀██▄█\n██████▄▄▄█▄█▄█▀ "], ["sleep_2", " \n \n \n ▄██▄██▄█▀▄ \n ▄█▄▀▄█████▀▄ \n███▄███▄▄███▄ ▄█\n▀▄▄▄▄▄▀▄███▀██ █\n█▄█▄▄█▄▄▄█▄█▄██▀"], ["walk_1", " ▄▄ ▄▄ ▄▄ \n ▄▀█▀█████▄▀ \n▄██▀▄█▀ ▄██▄▀ ▄\n█▀▀▀▀▀█████▄▀▄▀█\n ▀▀█▀▀██▀██▀██▄█\n ▄▀▄███▄▀▀▄███▀ \n ▀█▄▄▀█▀██▀█▄ \n █▄█▄█▀ █▄█▄█ "], ["walk_2", " \n ▄██▄██▄█▀▄ \n ▄█▄▀▄█▀▀██▀▄ \n███▄██▄▄███▀▄ ▄█\n▀▄▄▄▄▄██████▄█ █\n ▄▀▄▄█▀▄█▀▄███▀\n ▀▄██▀██▄▄██▀█▄ \n █▄█▄█▀ █▄█▄█ "]]], + ["datamon", [["angry", " \n \n \n \n ▄▄▄ ▄ \n █ ▄ █ \n ▀▄▄▄▀ \n ▄█▄ ▄█▄ "], ["attack", " \n \n ▀▄▀▀█▀▄▀ \n ▀▀▀▄ █ \n █ █ \n █ █ \n ▄▄█▄▄▀ \n ▄█▄ █▄ "], ["eat_1", " \n \n \n \n ▀▄▀▀█▀▄▀ \n ▀▀▀▄ █ \n ▄▄▄█▄▀ \n ▄█▄ █▄ "], ["eat_2", " \n \n \n \n \n ▄▀▀▀▄ \n █ ▄ █ \n ██▄▄▄██ "], ["happy", " \n \n \n \n █▄▀▀▀▄█ \n █████ \n ▄▀▀▀▄ \n ▄█▀▀▀█▄ "], ["injured_1", " \n \n \n \n \n ▄▀▀▀▄ \n █▀▀▀█ \n █▄█▀█▄█ "], ["injured_2", " \n \n \n \n \n ▄▄▄ \n █▄ ▄█ \n ▄█▄▄▄█▄ "], ["sleep_1", " \n \n \n \n \n ▄▄▄ \n █▄ ▄█ \n █▄▄▄▄▄█ "], ["sleep_2", " \n \n \n \n \n ▄▀▀▀▄ \n █▀ ▀█ \n ▀▄▄▄▀ "], ["walk_1", " \n \n \n \n ▄▀▀▀▄ \n ▄█▀ ▀█▄ \n ▀▄▄▄▀ \n ▄█▄ ▄█▄ "], ["walk_2", " \n \n \n \n ▄ ▄▄▄ ▄ \n ▀█▄ ▄█▀ \n ▀▄▄▄▀ \n ▄█▄ ▄█▄ "]]], + ["deltamon", [["angry", " ▄▄▄▀▀█▀▀▀█▀ ▄▄\n█▄▄▄ ▀▀▄█▀▀█▀▀▄▀\n █ █▄▄▄▀▀ █ \n ▄▄█ ▄ █ █ ▀▀▄\n █▄▄▄▄▀▄█▄█ █\n█▄▄▄▄ ▄▀▄▄▄▄▀▄▀ \n▀▄▄▄▄▄▀ ▄▄▄█▄ \n█▄█▄██▀▀▀█▄█▄█▄█"], ["attack", " ▄▀▀▀▀▀▀█▄▄▄▄▄\n▄▀▀ ▄█ ▄█▀ ▄ ▄▄▀\n▀█▀▀ █▄▄▄▀▀ ▀▄ \n ▀▀██ ▀▄▄▄▄ █ \n ▄▀▀▄▀▄ █ █ \n█▄▄▀▀ ▀ █ \n ▀▄▄▄█ ▄▄▄█▄ \n █▄█▄██▀▀█▄█▄█▄█"], ["eat_1", " ▄▀▀▀▀▀▀█▄▄▄▄▄\n▄▀▀ ▄█ ▄█▀ ▄ ▄▄▀\n▀█▀▀ █▄▄▄▀▀ ▀▄ \n ▀▀██ ▀▄▄▄▄ █ \n ▄▀▀▄▀▄ █ █ \n█▄▄▀▀ ▀ █ \n ▀▄▄▄█ ▄▄▄█▄ \n █▄█▄██▀▀█▄█▄█▄█"], ["eat_2", " ▄▀▀▀▀▀▀█▀ \n ▄▀▀▄▀█ ▀██▄▄▄▄▄\n █▄▄▄▄ ▄▀▄▄ ▄▄▀\n ▄▀ ▄▄▀▀ ▀ ▀ ▀▄ \n█ ▀ ▀█▀▀▀█ █\n ████ ▄▄▄▀ █ █\n ▀▄▄▄ ▀▄▄▄▄█▄█ \n █▄█▄██▀▀█▄█▄█▄█"], ["happy", " ▄▀▀▀▀▀▀█▀ \n ▄▀▀▄▀█ ▀██▄▄▄▄▄\n █▄▄▄▄ ▄▀▄▄ ▄▄▀\n ▄▀ ▄▄▀▀ ▀ ▀ ▀▄ \n█ ▀ ▀█▀▀▀█ █\n ████ ▄▄▄▀ █ █\n ▀▄▄▄ ▀▄▄▄▄█▄█ \n █▄█▄██▀▀█▄█▄█▄█"], ["injured_1", " █▀▀█ \n ▄▀ ▀▄ \n █ ▀▀▀▄▄ \n █ ▀▀ ▄ ▀▄ \n ▀▄▄▄▄▀▀ ▀▄ ▄▀█\n▄▀ ▄▄█ ▄▀▀▀ ▄▀\n▀▄▄▄▄▀ ▄▀ ▄▄ █\n█▄█▄██▄▄█▄▄▄▄▄▄▀"], ["injured_2", " █▀▀█ \n ▄▀ ▀▄ \n █ ▀▀▀▄▄ \n █ ▀▀ ▄ ▀▄ \n ▀▄▄▄▄▀▀ ▀▄ ▄▀█\n▄▀ ▄▄█ ▄▀▀▀ ▄▀\n▀▄▄▄▄▀ ▄▀ ▄▄ █\n█▄█▄██▄▄█▄▄▄▄▄▄▀"], ["refuse", " ▄▀▀▀▀▀▀█▄▄▄▄▄\n▄▀▀ ▄█ ▄█▀ ▄ ▄▄▀\n▀█▀▀ █▄▄▄▀▀ ▀▄ \n ▀▀██ ▀▄▄▄▄ █ \n ▄▀▀▄▀▄ █ █ \n█▄▄▀▀ ▀ █ \n ▀▄▄▄█ ▄▄▄█▄ \n █▄█▄██▀▀█▄█▄█▄█"], ["sleep_1", " █▀▀█ \n ▄▀ ▀▄ \n █ ▀▀▀▄▄ \n █ ▀▀ ▄ ▀▄ \n ▀▄▄▄▄▀▀ ▀▄ ▄▀█\n▄▀ ▄▄█ ▄▀▀▀ ▄▀\n▀▄▄▄▄▀ ▄▀ ▄▄ █\n█▄█▄██▄▄█▄▄▄▄▄▄▀"], ["sleep_2", " █▀▀█ \n ▄▀ ▀▄ \n █ ▀▀▀▄▄ \n █ ▀▀ ▄ ▀▄ \n ▀▄▄▄▄▀▀ ▀▄ ▄▀█\n▄▀ ▄▄█ ▄▀▀▀ ▄▀\n▀▄▄▄▄▀ ▄▀ ▄▄ █\n█▄█▄██▄▄█▄▄▄▄▄▄▀"], ["walk_1", " ▄▀▀▀▀▀▀█▀ \n ▄▀ ▄█ ▀█▀ ▄▀█\n █▄▄▄ ▄▀▀▀ ▄▀\n▄▀ ▄█ █ ▄▀ ▄█ ▀▄\n█▄▄▄▄▄▀ █▄▄▄▄ █\n ▀▀▄ ▀ ▄▀ \n ▄▄█ ▄▄▄█▄ \n █▄█▄██▀▀█▄█▄█▄█"], ["walk_2", " ▄▀▀▀▀▀▀█▄▄▄▄▄\n▄▀▀ ▄█ ▄█▀ ▄ ▄▄▀\n▀█▀▀ █▄▄▄▀▀ ▀▄ \n ▀▀██ ▀▄▄▄▄ █ \n ▄▀▀▄▀▄ █ █ \n█▄▄▀▀ ▀ █ \n ▀▄▄▄█ ▄▄▄█▄ \n █▄█▄██▀▀█▄█▄█▄█"]]], + ["demidevimon", [["angry", " ▄▄▄ ▄▄▄ \n▄█ ▀█▄▄▄▄█▀ ▄ \n███▄▀█████▀█ ▄██\n██ ██▄███▄██████\n█▀ █▀▀▀▀███▀ ▀██\n▀ ▄██▀▀▀█▄▄ ▀█\n ▀ ▀ ▀ ▀ ▀\n ▄▄▄▄▄▄ "], ["attack", " ▄█ ▄█ █▄ \n ▄▄▄██▄█▀ ██ \n ▀▀███▀ █▄███ \n ▀ █▄███▀███ \n ████▀ ▀██ \n ▄▄█████▄ ▀█ \n ▀ ▀ ▀ \n ▄▄▄▄▄ "], ["eat_1", " ▄█ ▄█ █\n ▄▄▄██▄█▀ ▄██\n ▀▀▀██ ▄█▄████\n ████▀▀███\n ▄███▀ ▀██\n ▀▀▀▀█▀█ ▀█\n ▀\n ▄▄▄▄▄ "], ["eat_2", " ▄█ ▄█ █ \n ▄██▄█▀ ██ \n ▄██▀████▄██▄ \n ███ ▄████▀███ \n ▀█▀▀▀▀██▀ ██ \n ▀▀▀▀█▀█ █ \n ▀ \n ▄▄▄▄▄ "], ["happy", " ▄ █▄ ▄█ ▄ \n ██ ▀█▄▄▄▄█▀ ██ \n▄██▄▀████▀██ ██▄\n███▄█▄██▄█▄█▄███\n██ █▀█▀▀▀█▀█▀ ██\n█ █ █ █\n █▄▄▄▄▄██▄ \n █▀█ ▀ ▀ "], ["injured_1", " \n ▀██ ██▀ \n ▄█ ▄██████▄ █▄ \n▄██▄█▀███▀██▄██▄\n██▀█▄█████▄█▀▀██\n█▀ ▀▄▄▄▄▄▀ ██\n▀ █▀█ █▀█ █\n ▄▄▄▄▄▄▄▄ "], ["injured_2", " \n \n \n ▀██▄▄▄▄▄██▀ \n▄█ ▄███████▄ █▄ \n████▀ ███ ▀████▄\n██ ██▀▀▀▀▀██ ▀██\n█ ▄▄█▀▀▀▀▀█▄▄ ▀█"], ["sleep_1", "▀▀▀▀▄█▄▀▄█▄▀▀▀▀▀\n ▄ █▄▄▄█ ▄ \n ▄███▄▄▄███▄ \n ██▀▀███▀▀██ \n █▀███████▀█ \n ▄█▀▀▀█▄ \n █▀ ▀█ \n "], ["sleep_2", "▀▀▀▀▄█▄▀▄█▄▀▀▀▀▀\n ▄ █▄▄▄█ ▄ \n ██▄█▄▄▄▄▄█▄██ \n ███▀▀███▀▀███ \n ▀█▀███████▀█▀ \n ▄█▀▀▀█▄ \n █▀ ▀█ \n "], ["walk_1", " ▄ █▄ ▄█ ▄ \n ██ ▀█▄▄▄▄█▀ ██▄\n███▄▀█████▀█ ███\n██▀█▄ ███ ▄█████\n██ ▀█▀▀▀▀▀█▀ ██\n█ ▄▄█▀▀▀█▄▄ ▀█\n ▀ ▀ ▀ ▀ ▀\n ▄▄▄▄▄▄ "], ["walk_2", " ▄█ ▄ ▄ █▄ \n ██▀ █▀ ▀█ ▀██ \n▄██▄███████▄▄██▄\n██ █ ▀███▀ █▀███\n█▀ ██▄███▄██ ██\n▀ ▀▄▄▄▄▄▀ ▀\n █▀█ █▀█ \n ▄▄▄▄▄▄▄▄ "]]], + ["demimeramon", [["angry", " ▄ ▄ \n ▄ ▄ ▄▀▄ \n ▄▀ ▀ ▀ █ \n █████▄ █ \n █▄▄█▄▄█ █ \n ▀█▀▀▀▀ ▄▀ \n ▀▀▀▀▀ \n ▄▄▄▄▄▄ "], ["attack", " \n ▄█ \n ▄▀ █ ▄ \n ▄▀ ▀▄▀█ \n ▄██▀█▄ █▄ \n ▀▀▀▀███ ▀ █ \n █▀ ▄▀ \n ▀███▄▄▄▀ "], ["eat_1", " ▄ ▄█ \n ▄▀█▄▀ █ \n ▄█▄▄ █ \n █▄██▄█▄ █ \n ▀▄ ██ █ \n ▄█▄▄█▀ ▄▀ \n ▀▄▄▄▄▄▀ \n ▄▄▄▄▄▄ "], ["eat_2", " \n █▄ ▄█ \n ▄▀ ▀▄▀ █ \n █▄▄▄ █ \n █▀██▀█▄ █ \n █▀▀▀▀██ █ \n ▀████▄▄▀ \n ▄▄▄▄▄ "], ["happy", " ▄ ▀ ▄█ ▀ \n ▄ ▄▀▄▀ █ ▄█ \n █▀ ▄▄▄▄▄▀ █ \n █ █▄███▄█ █ \n █ █ █ █ \n █ ▀▄ ▄▀ █ \n ▀▄▄███▄▄▀ \n ▄▄▄▄▄▄ "], ["injured_1", " \n \n ▀ ▄ \n ▄▀▄▀▄▀▄ \n ▄▀▄▄▄ █ \n ██▀█▀█▄ █ \n █▄███▄▀ █ \n ▀▄▄▄▄▄▀ "], ["injured_2", " █ ▄ \n █ ▄▀ \n ▀ █ \n ▄▀▄▀▄ ▀ \n ▄▀ █ \n █▄▀█▀█▄ █ \n █▄▄█▄▄▀ █ \n ▀▄▄▄▄▄▀ "], ["sleep_1", " \n \n ▀ ▄ \n ▄▀▄▀▄▀ █ \n ▄▀▄▄▄▄▄ ▀▄ \n ██▀▀█▀▀█ █ \n █▀█████▀ █ \n ▀▄▄▄▄▄▄▀ "], ["sleep_2", " \n ▄ ▄ \n ▄ ▄▀▄ ▄ \n ▄▀ ▀ ▀ █ \n █▄▀▀█▀▀▄ █ \n ████▀███ █ \n █ ▀▀▀▀▀ █ \n ▀▄▄▄▄▄▄▀ "], ["walk_1", " \n █▄ ▄ \n ▄ █ ▀▄▀█ \n █▀▄██▄ █ \n █ █▀█▀█ █ \n ▀▄ ▀▀▀ ▄▀ \n ▀▀▀▀▀ \n ▄▄▄▄▄ "], ["walk_2", " ▄█ \n ▄▀ █ ▄█ \n ▄▀▄▄▄▄▀ █ \n █ █▀██▀█ █ \n █ ▀████▀ █ \n ▀▄▄▄▄▄▄▀ \n \n ▄▄▄▄▄▄ "]]], + ["demiveemon", [["angry", " \n ▄▄██ ▄▄ \n ▄███▄▄████▀ \n █▀ ██▀ ▀██▀ \n █ █▄ ▄█ █ \n ▀▄ ▀▀▀ ▄▀ \n █▀█▀▀▀██▀█ \n ███▀▀███ "], ["attack", " ▄▄█▀ ▄▄██▀ \n ▄███▄████▀ \n ▄█████▀ ▀██ \n █▄▀█▀ ▄▀▀ █ \n █ ▀ ▄▄▄ ▄█▀█ \n ▀▄▄███▀▀█████▀\n ▀▄█▄ ▄███ \n ▀██ ▀▀ "], ["eat_1", " ▄▄▄▄ \n ▄███▄▄▄████▄\n ▄▀▄ ▀▀▀▄▀██▀ \n █▀ ▀ ▀ ▀ █ \n ▀▄ ████ ▄▀ \n █▀▄▀▀▄▀█ \n █▀ ▀██▄▄ \n ███▀███▀ "], ["eat_2", " \n ▄▄██▀ ▄▄ \n ████▄▄████▀ \n ▄▀ ▀██▀ ▀██▀ \n █▄▀▄ ▄▀▄ █ \n ▀▄ ▄▄ ▄▀ \n ▄▀█▀▀▀█▀▄ \n ▀███▀███▀▀ "], ["happy", " ▄▄▄▄ \n ▄███▄▄▄████▄\n ▄▀▄ ▀▀▀▄▀██▀ \n █▀ ▀ ▀ ▀ █ \n █▄ ████ ▄█ \n █ ▀▄▀▀▄▄▀ █ \n ▀█ ██▀ \n ███▀███ "], ["injured_1", " \n ▄▄███▀ ▄▄▄ \n ▄█▀███▀██████▄\n ▄▀ ▄ ▄ ▀█▀ \n █▀▀ ▄▄ ▀▀ █ \n ▀▄▄▄▄▄▄▄█▄ \n ▄▀█▀ ▀█ █ \n ▀▀███▀███▀▀ "], ["injured_2", " \n ▄▄▄ \n ▄▄█████▄▄▄▄▄ \n █▀ ▀▀▀ ▀███▀▀▀ \n█▄▄▀ ▀▄▄ █ \n▀▄ ▄▄ ▄█ \n ▀█▀█▀▀▀█ █▄ \n ▀▀███▀███▀▀ "], ["sleep_1", " \n ▄▄▄ ▄▄▄ \n ███▄▄▄████ \n █▀████▀███ \n █ ▀▀ ▀█ \n ▀▄▀▀ ▀▀▄▀ \n ▄ ██▀▀███▄ \n ███▄▄▄▄███ "], ["sleep_2", " \n ▄▄▄ \n ▄███▄▄▄████▄\n █▀ ▀█▀ ▀██▀ \n █ ▄▄ ▄▄ █ \n ▀▄ ▄▄ ▄▀ \n ▄ ██▀▀███▄ \n ███▄▄▄▄███ "], ["walk_1", " ▄▄▄ \n ███▀ ▄▄▄██ \n ▄█▀███▀████ \n ▄▀▄▀ ▀▄▀█ \n █ ▀▀▄▄ ▀▀ █ \n ▀▄▄▄▄▄▄▄█ \n █▄█▀ ▀█▄█ \n ███▀▀███ "], ["walk_2", " \n ▄▄▄▄ ▄▄ \n ▄████▄▄████▀\n █▀▄▀▀▀▄▀██▀ \n █ █▄ ▄█ █ \n ▀▄ ▀▀ ▄▀ \n ▄▀█▀▀▀██▀▄ \n ▄███▀▀███ "]]], + ["deputymon", [["angry", " \n ▄▄▀███▀█▄▄ \n ▄▄▄█▄▄█▄▄██▄▄ \n █▄▄▀ ▄▄▄▀█ █\n▄█▀██▀▀▀█▄▀ ▄▀ █\n█ ███████ ▀▄▄▀\n▀█▄██████▀▄ █▄ \n ██▄▄██▀▀▀███▄██"], ["attack", " ▄▀▀█▄▀███▀█▄▀▀▄\n █ ▄██▄▄█▄▄██▄ █\n █▄▄▀ ▄▄▄ █▀ █\n▄█▀██▀▀▀█▄▀ ▀▄█ \n█ ███████ ██ \n▀█▄██████▀▄ ██ \n █▄ ▀▀▀▄▀█▀ \n ██▄▄██▀▀▀███▄██"], ["eat_1", " ▄▄█████▀▄▄ \n ▄█▄▄█▄██▄███ \n█▀ ▀▄▄█▄▀▀▄▀▄ \n█ █████ █ █\n█ ▄██ █████ █ █\n▀█▄▄▄████▀▄ ██ \n █▄ ▀▀▀▄▀█▀ \n ██▄▄██▀▀███▄██"], ["eat_2", " ▄▄▄▄▄▄▄ \n ▀█▀▄▀█▀▄▀█▀ \n ▀█▀▀▀▀▀█▀▄ \n ▄ █ ▄▄▄ ▀▄▀▄\n▄█▀██▀▀▀█▄▀ ▄▀ █\n█▄ ▄██████▀ ▀▄▄▀\n ▀▀██▀▀▀█▄█ ▄██ \n ██▄▄██▀▀▀███▄██"], ["happy", " ▄▄█▀███▀█▄▄ \n ▄ █▄█▄█▄█▄█ \n▄▀███▀█▀▀▄▀▀█▀▀▄\n█ █████ ▄▀ █\n█ ▄██ █████ ▀▄▄▀\n▀█▄▄▄████▀▄ █▄ \n █▄ ▀▀▀▄▀█▀ \n ██▄▄██▀▀███▄██"], ["injured_1", " \n ▄▄█▀█▀██▄▄ \n █▄▄█▄▄██ \n ▄ ▄▀ ▄▄▄▀▄▀▄ \n▄█▀██▀▀▀█▄▀ █ █\n█ ███████ █ █\n▀█▄██████▀▄ ██ \n███▄▄▄▄▄████████"], ["injured_2", " \n ▄▄▄▄▄▄ \n ▀█▀ █ ▀██▀ \n ▄█▀▀▀███▀▀▄ \n ██▄▄▄▄▄█▀▀▀▄▀▄ \n█▀ ▀█▄▄▄███▄▀ █ \n█▄ ▄██████▄▀▄▄▀ \n▄████████▄██████"], ["sleep_1", " \n ▄▄▄▄▄ \n ▀█▀█▀▀██▀ \n ▄ ▄▀▀▀███▀▄▀▄ \n▄█▀██▀▀▀█▄▀ █ █\n█ ███████ █ █\n▀█▄██████▀▄ ██ \n███▄▄▄▄▄████████"], ["sleep_2", " \n ▄▄█████▄▄ \n █▄█▄▄██ \n ▄ ▄▀ ▄▄▄▀▄▀▄ \n▄█▀██▀▀▀█▄▀ █ █\n█ ███████ █ █\n▀█▄██████▀▄ ██ \n███▄▄▄▄▄████████"], ["walk_1", " ▄▄████▀▄▄ \n █▄█▄███ \n ▄ ▄▀ ▄▄▄▀▄▀▄ \n▄█▀██▀▀▀█▄▀ █ █\n█ ███████ █ █\n▀█▄██████▀▄ ██ \n █▄ ▀▀▀▄▀█▀ \n ██▄▄██▀▀███▄██"], ["walk_2", " ▄▄▄▄▄ \n ▀█▀█▀█▄█▀ \n ▄▀▀▀▀▀█▀▄ \n ▄█▄█▄▄▄█▀█ ▀▄▀▄\n█▀ ▀█▄▄▄██▄ ▄▀ █\n█▄ ▄██████▀ ▀▄▄▀\n ▀▀██▀▀▀█▄█ ▄██ \n ██▄▄██▀▀▀███▄██"]]], + ["deramon", [["angry", " ▀ ▄▀▀▀▀▄▄▄ ▀\n ▄▀█▄█▄█ ▀▄ \n ▀▄▀▀▀▀█ ▀ █ \n █ ▄▀ █ ▄ █\n▄▀▀▀▄ ▄█ ▄▀\n▀▀█▀▀ ▄ █ ▄ █\n █▄ █▄█ ▄▀\n █▄▄██▀█▄▄▄█▀▀ "], ["attack", " ▀ █▄█▄█▄▄▄ ▀ \n █████ ▄ ▀▀▄ \n ▄▀ ▄ █ ▄ █ \n▄▀▀▀▄▀▀ █ ▄ █\n▀▀███ ▄▀▀▄ ▄▀\n ▄▀▀▀ ▀▄ █ ▄ █\n ▀█ ▄▄█▀ ▄▀\n █▄█▄▄█▄▄▄█▀▀ "], ["eat_1", " ▀ █▄█▄█▄▄▄ ▀ \n▄ ▄▀▀▀▀█ ▄ ▀▀▄ \n ▄█▄ ▄▀▄ █ ▄ █ \n█▄▄▄█ █ ▄ █\n ███ ▄▀▀▀█ ▄▀\n ▀▄▄▀ ▀▄▄▀ █\n █ ▄▄█ ▀ ▄▀\n █▄█▄▄▄█▄▄▄█▀▀ "], ["eat_2", " ▀ \n ▄ █▄█▄█▄▄▄ ▄\n ▄▀▀▀▀█ ▄ ▀▀▄ \n █ ▄▀▄ █ ▀ █ \n▄▀▀▀▄ █ ▄ █\n▀▀█▀▀ ▄▀▄▄ ▄▀\n █ ▄█▄▄▀ ▄ █\n █▄█▄▄█▄▄▄▄█▄▄▄▀"], ["happy", "▄ ▄▀█▀▄▀█▀▄▄ ▀ \n ▄▀▀ █████ ▄ █▄ \n █ ▄▀ ▄ ▀▄ ▄ █\n█ █▄▄▀ ▀ █▄▄ ▄▀\n█ █▄▄▄█ ▄▀ █ █\n █▀▄ ██ ▀▄█ ▀▄\n ▀▄ █▄ ▄█▄ ▄▀\n █▄██▀▀█▄▄▄█ "], ["injured_1", " ▄▄▄ ▄▄▄ \n ▄▀▀ ▄ █ ▄ ▀▀▄ \n▄▀ ▀ █████ ▀ █ \n█ ▀▄▀ ▄ ▀▄ ▀ █\n▄▀ █▄▄ ▀▀ █ ▄ █\n▀▄█▄▄▄█ ▀▄ ▀▄\n█ ▀▄█ █▄█ █\n ▀█▄▄█▄▄▄█▄▄▄█▀ "], ["injured_2", " \n ▄ ▄ ▄ \n ▄▀▀█████▀▀▀▄ \n █ ▄▀ ▀▄▀ ▀▀▄\n█ █▄▄ ▄▄ █ ▄ █\n▀▄█▄▄▄█ ▄▀▄ ▀▄\n█ ▀▄█ █ ▄█▄▀ █\n ▀█▄▄█▄▄▄█▄▄▄█▀ "], ["sleep_1", " ▄▄▄ ▄▄▄ \n ▄▀▀ ▄ █ ▄ ▀▀▄ \n▄▀ █████ ▀ █ \n█ ▀▄▀ ▀▄ ▀ █\n▄▀ █▄▄ ▀▀ █ ▄ █\n▀▄█▄▄▄█ ▀▄ ▀▄\n█ █ █▄█ █\n ▀█▄█▄▄▄▄█▄▄▄█▀ "], ["sleep_2", " ▄▄▄ ▄▄▄ \n ▄▀▀ ▀ ▀▀▄ \n▄▀ █▄█▄█ ▀ █ \n█ ▀ █▀▀▀▀▄ ▀ █\n▄▀ █ ▄▄ █ ▄ █\n▀▄▄▀▀▀▄ ▀▄ ▀▄\n█ ▀█▀▀▀ ▀▄▄█ █\n ▀█▄█▄▄▄▄█▄▄▄█▀ "], ["walk_1", "▄ ▄▀▀▀▄▀▀▀▄▄ ▀\n ▄▀▀ ▄ ▄ ▄▀ ▀▄ \n▄▀ ▀ █████ ▀ █ \n█ ▀▄▀ ▄▀▄ ▀ █\n▄▀ █▄▄ ▀ █ ▄ █\n▀▄█▄▄▄█ ▀▄▄▄▀▄\n█ █▄ ▄█▄▀ █\n ▀█▄▄█▄▄▄█▄▄▄█▀ "], ["walk_2", "▀ ▄▄▀▀▀▄▀▀▀▄▄ ▀\n █ ▄ █▄█▄█ ▄ ▀▄ \n█ ▄ ▄▀▀▀▀█ ▄ ▀▄\n▀▄ █ █ █ █ █\n█ █ ▄▀▀▄ █ ▀ ▄█\n▀▄▀█ ▀▀▀▀ ▀▀█ █\n ▀█▄ ▄▄█▄▄▀ \n █▄▄██▀█▄▄▄█ "]]], + ["devidramon", [["angry", " ▄▀█ █▀▄ █▄ \n ▄█▄▀▀▀█▀ ▀▄█ █\n█▄▄▄▄▄▀▀ ▄ █ █\n▀ ▀ ▀ ▀▄ █ █ █\n ▄ ▄ ▄ █▀▀ ▄▀▀▄█\n █▀▀▀▀▀ ▀▀▀▄▀ █\n ▄██▀▀▀▀ ▄█▄▄▄▀\n█▄█▄██▀▀▀█▄█▄█▄█"], ["attack", " ▄▄ ▄▄ ▄ \n █ █▄▄▄█ ▀▄ █▀▄\n █▄▀ ▄ █ █\n █▄▄▄▄▀▀ ▄ █ █\n ▄▄▄▄█ ▄▀▄▄█ █\n▄▀▀▄▄▄ █▄█ █▀▄█\n▀▄▄█ ▀▄▄▄▄█▀\n█▄█▄██▀▀▀█▄█▄█▄█"], ["eat_1", " ▄▄ ▄▄ ▄ \n █ █▄▄▄█ ▀▄ █▀▄\n █▄▀ ▄ █ █\n █▄▄▄▄▀▀ ▄ █ █\n ▄▄▄▄█ ▄▀▄▄█ █\n▄▀▀▄▄▄ █▄█ █▀▄█\n▀▄▄█ ▀▄▄▄▄█▀\n█▄█▄██▀▀▀█▄█▄█▄█"], ["eat_2", " ▄▀█ █▀▄ █▄ \n ▄█▄▀▀▀█▀ ▀▄█ █\n█▄▄▄▄▄▀ ▀ █ █\n▀ ▀ ▀ ▀▄ █ █ █\n ▄ ▄ ▄ █▀▀ ▄▀▀▄█\n █▀▀▀▀▀ ▀▀▀▄▀ █\n ▄██▀▀▀▀ ▄█▄▄▄▀\n█▄█▄██▀▀▀█▄█▄█▄█"], ["happy", " ▄▀█ █▀▄ █▄ \n ▄█▄▀▀▀█▀ ▀▄█ █\n█▄▄▄▄▄▀ ▀ █ █\n▀ ▀ ▀ ▀▄ █ █ █\n ▄ ▄ ▄ █▀▀ ▄▀▀▄█\n █▀▀▀▀▀ ▀▀▀▄▀ █\n ▄██▀▀▀▀ ▄█▄▄▄▀\n█▄█▄██▀▀▀█▄█▄█▄█"], ["injured_1", " \n ▄▄ ▄▄ ▄ \n █ █▄▄▄█ ▀▄ █▀▄\n █▄▀▀ ▀ █ █\n █▀ ▄ ▄ █ █\n▄█ ▀▀ ▄█▀█▀█▀█\n█ ▀▄▄▄▀▀ █ █\n█▄▄▄█▄▄▄▄▄█▄▄▄▀ "], ["injured_2", " \n ▄▄ ▄▄ ▄ \n █ █▄▄▄█ ▀▄ █▀▄\n █▄▀▀ ▀ █ █\n █▀ ▄ ▄ █ █\n▄█ ▀▀ ▄█▀█▀█▀█\n█ ▀▄▄▄▀▀ █ █\n█▄▄▄█▄▄▄▄▄█▄▄▄▀ "], ["refuse", " ▄▄ ▄▄ ▄ \n █ █▄▄▄█ ▀▄ █▀▄\n █▄▀ ▄ █ █\n █▄▄▄▄▀▀ ▄ █ █\n ▄▄▄▄█ ▄▀▄▄█ █\n▄▀▀▄▄▄ █▄█ █▀▄█\n▀▄▄█ ▀▄▄▄▄█▀\n█▄█▄██▀▀▀█▄█▄█▄█"], ["sleep_1", " \n ▄▄ ▄▄ ▄ \n █ █▄▄▄█ ▀▄ █▀▄\n █▄▀▀ ▀ █ █\n █▀ ▄ ▄ █ █\n▄█ ▀▀ ▄█▀█▀█▀█\n█ ▀▄▄▄▀▀ █ █\n█▄▄▄█▄▄▄▄▄█▄▄▄▀ "], ["sleep_2", " \n ▄▄ ▄▄ ▄ \n █ █▄▄▄█ ▀▄ █▀▄\n █▄▀▀ ▀ █ █\n █▀ ▄ ▄ █ █\n▄█ ▀▀ ▄█▀█▀█▀█\n█ ▀▄▄▄▀▀ █ █\n█▄▄▄█▄▄▄▄▄█▄▄▄▀ "], ["walk_1", " ▄▀█ █▀▄ █▄ \n ▄▀▄▀▀▀▀▀ ▀▄█ █\n ██ ▄█▀ █ █\n █▄▄▄▄ █ █ █\n ▀▄▄▄ █▀ ▄█ █ █\n▄▀▀█ ▄▀▀█▀█ ▀█\n▀▄▄█ ▀▄▄▄▄█▄ \n█▄█▄██▀▀█▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄ ▄ \n █ █▄▄▄█ ▀▄ █▀▄\n █▄▀ ▄ █ █\n █▄▄▄▄▀▀ ▄ █ █\n ▄▄▄▄█ ▄▀▄▄█ █\n▄▀▀▄▄▄ █▄█ █▀▄█\n▀▄▄█ ▀▄▄▄▄█▀\n█▄█▄██▀▀▀█▄█▄█▄█"]]], + ["devimon", [["angry", " ▄▄▄ ▄▄▄ \n ▄█████████▀ \n ███▀███████ █ \n ██▀▄██████▄███▄\n▄▀█▀▀ ▄█▀▀ ▀████\n█ ▄▀▀▀ ▄▀ █▀██\n █▀▄▀█▀ ▀▄▄▄▀ ▀\n█▄▄▄█▀▀▄▄▄▄█ "], ["attack", " ▄▄▄▄███▄▄██ \n ▄██▀▀▄█████▀ \n ▀▀▀▀██████ █▄ \n ▄▄ █████▄████\n█ █▀▀▀ █▀▀ ▀▀███\n ▀▄▀▀▀▀ ▄▀ ███\n ▄▀▄▀█▀ █▀▀ ▀\n█▄▄▄█▀▀▄▄▄▄█ "], ["eat_1", " ▄▄▄▄███▄▄██ \n ▄██▀▄▄▀████▀ \n ▀▀▀▀███████ █▄ \n █████▄████\n▄▀█▀▀▀ █▀▀ ▀████\n▀▄▄▀▀▀▀ ▀██\n ▄▀▄▀█▀ █▀▄▄▄▀\n█▄▄▄█▀▀▄▄▄▄█ "], ["eat_2", " ▄▄▄ ▄▄▄ \n ▄█████████▀ \n ███▀███████ █ \n ██▄█▄█████▄███▄\n▄▀█▀▀ ▄█▀▀ ▀████\n█ ▄▀▀▀ ▄▀ █▀██\n █▀▄▀█▀ ▀▄▄▄▀ ▀\n█▄▄▄█▀▀▄▄▄▄█ "], ["happy", " ▄▄▄███▄▄▄██ \n ▄███▀▄▄▀███▀ \n ▀█████▀████ █▄ \n▄▄▄ ▄▄███▀▀███\n█ █▀▀▀ ██▀▀ ██\n▀▄▄▀▀▀▀ ▄▄████\n ▄▀▄▀█▀ █ ▀\n█▄▄▄█▀▀▄▄▄▄█ "], ["injured_1", " \n ▄███▄▄▄███ \n ▄██████████ \n ██████████▀▄█▄ \n █▄▄██▄▄██▀▀███▄\n ▀▄▄▄▄▄▀ ███\n █ ▄ ▄ █ █\n █▄▄█▀▄▄█▄▄█▄█▄█"], ["injured_2", " \n ▄▄▄ ▄▄▄ \n ▄█████████▀ \n▄██████████▄█▄ \n██████████▄███▄ \n▀▄▄██▄▄███ ▀██ \n █▄▄▄▄▄▄▀ █ ▀▄\n█▄▄█▄▄▄▄█▄▄█▄█▄█"], ["sleep_1", " ▄███▄▄▄███ \n ▄██████████ \n █▀▀██▀▀███▄ \n ▀█▀▀▀▀▀█▀▄██ \n █ ▀█▀▀▀ █ ██ \n █▀▀█▀▀▀▄▄██ \n ▀▄▄▀▄▄▀▀ ▀ \n ▄▄▄▄▄▄▄▄▄▄ "], ["sleep_2", " ▄▄▄ ▄▄▄ \n ▄█████████▀ \n ██████████ \n █▄▄██▄▄████▄ \n ▄▀▄▄▄▄▄▀█ ██ \n ▀▄▄▀▄▄▄▄█▄██ \n ▀▄▄▀▄▄▀▀ ▀█ \n ▄▄▄▄▄▄▄▄ "], ["walk_1", "██▄▄██████▄▄▄██ \n ██▀████▀████▀ \n █▄ ██ ▄███▀█▄ \n █████████▄████\n▄▀ ▀▄▄▄▄▄▀ ▀███\n█ ▄ ▄▄▄▄ ▄▄ ██\n █▀▄ ▀▀ ▀█▄▄█ \n█▄▄▄█▀▀▀█▄▄▄▄█ "], ["walk_2", "▄▄ ▄▄▄▄▄▄ ▄▄ \n▀█████████████▀ \n █ ▀██▀ ████ █▄\n ▄██▄██▄████▄███\n█ ▀█▀▀▀▀▀█▀ ▀█\n█▄█ ▀▀▀▀▀ █▀ █\n ▄▀▄▀██▀ ▀█▀▀\n█▄▄▄▄█▀▀▀█▄▄▄▄█ "]]], + ["diaboromon_x", [["angry", " ▄▄▄▄▄ ▄▄ \n ███▀██▀▀ █ \n ███▄▄███▀███▀█▄\n ▀███▀▀▄█ █▄▄██▀\n ▄▄▀▄▄▀▀▄████▀▄ \n██▄▀ ████▀█ █▄█\n▀█▀▀▄▀▄█▄█ ▄▀▀█▀\n ▀▀▀ █▄▄▀ ▀▀ "], ["attack", " ▄▄█████▄▀█▄▀▀▄\n ▄██▀ ▄█▄▄▄█▄█▄█\n ██████▀█ █▀█ ██\n ▀█▀ █▄██▄▄▀ \n ▄▀▄▄▄████▀ \n █▄█ █▀█▀ █ \n███▀▄ ▀█▄█ \n █▄▄▀ █▄▄▀ "], ["eat_1", " ▄▄█████▄▀█ \n ▄██▀▀██▄▄▄█▄▄▄ \n ██████▀█ █▀▀▄██\n ▀█ █▄████▀ \n ▄▀▄█▄▄████▀▄ █ \n ███ █▀█▀ █ ███ \n █▄▀▄ ▀█▄█ ▄▀▄▀ \n ▀▀▀ █▄▄▀ ▀▀ "], ["eat_2", " ▄▄▄▄▄ ▄▄ \n ███▀██▀▀ █ \n ███▄█▄██▀███▀█▄\n ▀███▀▀▄█ █▄▄██▀\n ▄▀▄▄▀▀▄███▀█ \n▄█▄▀ ████▀█ ▀▄█▄\n█▀█ ▀▄█▄▄▀ █▀█\n▀█▄█ █▄▄▀ █▄▀ "], ["happy", " ▄▄█████▄▀█▄▀▀▄\n ▄██▀▄▀█▄▄▄█▄█▄█\n ██████▀█ █▀█ ██\n ▀█▀ █▄██▄▄▀ \n ▄▀▄█▄▄████▀ \n ███ █▀█▀ █ \n █▄▀▄ ▀█▄█ \n ▀▀▀ █▄▄▀ "], ["injured_1", " \n ▄▄█████▄▀█ \n ▄██▀███▄▄▄█▄▄▄ \n ███▄▄█▀█ █▀▀▄██\n ▀█▀ ▄█▀▄█▀██▀ \n ▄▀▄▀█▄▄███▀▄ █▄\n█▀█ ▀▄█▄▄▀ █▀█\n▀█▄█ █▄▄▀ █▄▀ "], ["injured_2", " \n ▄▄▄▄▄ ▄▄ \n ██████▀▀ █ \n███ ▀███▀████▀▄▄\n▀███▀▀▄█ ██▄▄██▀\n ▄▀▄▄██▄███▄▀▀▄ \n███ ▀██▀▀█ ▀███\n█▄▄█ █▄▄▀▀ █▄▄▀"], ["sleep_1", " \n ▄▄█████▄▀█ \n▄██▀▀██▄▄▄█▄▄▄▄ \n██████▀██ █▀▀▄██\n ██▀ ▄█▀▄████▀▀ \n ▄▀████████▀▄▀▄ \n ███ █▀█▀ █ ███ \n ▀▄█ ███▀ █▄▀ "], ["sleep_2", " ▄▄▄▄▄ ▄▄ \n ██████▀▀ █ \n ███▄▄███▀███▀█▄\n ▀███▀▀▄█ █▄▄██▀\n ▄▀▄▄▀▀▄███▀█ \n █▄█ ████▀█ █▄█ \n ███ ▀▄█▄▄▀ ███ \n ▀▄█ █▄▄▀ █▄▀ "], ["walk_1", " ▄▄█████▄▀█ \n ▄██▀ ██▄▄▄█▄▄▄ \n ███▄██▀█ █▀▀▄██\n ▀█▀ ▄█▀▄████▀ \n ▄▀▄▀█▄▄███▀▄▀▄ \n █▄█ █▀█▀ █ █▄█ \n █▀█ ▀█▄█ █▀█ \n ▀█▄█ █▄▄▀ █▄▀ "], ["walk_2", " ▄▄▄▄▄ ▄▄ \n ███▀██▀▀ █ \n ███ ▄███▀███▀█▄\n ▀███▀▀▄█ █▄▄██▀\n ▄▀▄▄▀▀▄███▀█ \n █ █ ████▀█ █ █ \n███ ▀▄█▄█▀ ▀███\n▀█▄█ █▄▄▀ █▄▀ "]]], + ["dianamon", [["angry", "▄▄▄▄ \n▀▄ █▀▀▀▀▀▄ ▀▄ \n ███▀██ █ ██▄ \n ██▄▄█▀ ▄█▀▀██▄\n ▄█▀▀▀▀▀ █ ▀███\n █ ██▄▄▄████▀ ██\n▄ ▀█▄▄ ▀█▄▄▀▀█ █\n▀██▀ ▀▀▀▀ ▀▀▀▀ ▀"], ["attack", " █▀▀█▄▄▄▄▄ \n ▄ ▀▄█▄▄▄▄ ▀▄ \n ██ ██▀ ██ █▄ \n██ ▀████▄▄█ ▄█\n███▄█▀█▄ ▄█▄▄█\n██▀ ▀▄▀▀███▀▀▄▄█\n▀█▄ ▀▄ ▀██ ▀▄ \n ▀█ ▀▀▀▀█▄█ "], ["eat_1", "█▀▀█▄▄▄▄▄ ▀█▄ \n ▀▄█▄▄▄▄ ▀▄ ██▄ \n ██ ▄█ █▄███▄\n ▄█▀▀▀█▄▄█ ▄█ ██\n █▀▄▄▄▀▀▄█▄▄▀▄ █\n █▀▀███▀▀█▄▄▀ \n█▄▄█▄ ▀█▀▄ ▀▄ \n ▀▀ ▀▀▀ ▀▀▀ "], ["eat_2", "▄▄▄▄ ▄▄ \n▀▄ █▀▀▀▀▀▄ ▀█▄ \n ███▀██ █ ███ \n ██▄█▄▀ ▄▀▀█▀██\n ▄█▀▀▀▀▀█ ▀█ ▀█\n █ ██▄▄▄███▀ █ ▀\n▄ ▀█▄▄ ▀█▄▄▀▀▄ \n▀██▀ ▀▀▀▀ ▀▀▀▀ "], ["happy", "█▀▀█▄▄▄▄▄ ▀█▄ \n ▀▄█▄▄▄▄ ▀▄ ██▄ \n ██▀▄▀█ ▄█▄███▄\n▄▀█▀▀▀█▄█ ▄██▄██\n▀▄ █▄▄▀▀█▄▄▀ █ █\n █▀▀███▀▀█▀▀ \n█▄▄█▄ ▀█▀▄ ▀▄ \n ▀▀ ▀▀▀ ▀▀▀ "], ["injured_1", " ▄▄ \n▄▄▄▄ ▀█▄ \n▀▄ █▀▀▀▀▀▄ ███ \n ██▀███ █▀█▀██\n ██▄▄▄▀ █ ▀█ ▀█\n █ █▄ ▀███▀ █ ▀\n▄ ▀█▀▀▀██▀▀██ \n▀██▀▀█▄▄█▀█▄▄█ "], ["injured_2", " ▄▄ \n ▀█▄ \n█▀▀█▄▄▄▄▄ ███ \n ▀▄█▄▄▄▄ ▀▄██▀██\n ██ ▀▀█ ▄▀▄█ ▀█\n ▄▀█▀▀▀▄▄█▄▄▀▄ ▀\n▄▀▄▀▀▀▀██▀▀▄▄▀ \n▀██▀▀█▄▄█▀█▄▄█ "], ["sleep_1", " ▄▄▄▄ \n ▀▀▄▄ ▀▀▄ \n ▀▄ ▀▄ \n █▄▄▀ █ \n ▄▄▄▀▀ █ \n ▀▄▄ ▄▀ \n ▀▄▄▄▄▀▀▀▀ ▄▀ \n ▀▀▄▄▄▄▄▀▀ "], ["sleep_2", " ▄▄▀▀▀▀▄▄ \n ▀▀▄ ▀▄ \n █ ▄ █ \n ▄█▀▀ █ \n ▀█▀ █ \n ▄ ▄██▄ █ \n ▀██▀ ▄▄▀ \n ▀▀▀▀▀ "], ["walk_1", "█▀▀█▄▄▄▄▄ ▀█▄ \n ▀▄█▄▄▄▄ ▀▄ ██▄ \n ██ ▄█ █▄███▄\n ▀████▄▄█ ▄█ ██\n ▄▀█▄ ▄█▄▄▀▄ █\n ▀▄▀▀███▀▀█▄▄▀ \n█▄▄█▄ ▀█▀▄ ▀▄ \n ▀▀ ▀▀▀ ▀▀▀ "], ["walk_2", "▄▄▄▄ ▄▄ \n▀▄ █▀▀▀▀▀▄ ▀█▄ \n ██▀▀▀█ █ ███ \n ██▄▄█▀ ▄▀▀█▀██\n ▄█▀▀▀▀▀█ ▀█ ▀█\n █ ██▄▄▄███▀ █ ▀\n▄ ▀█▄▄ ▀█▄▄▀▀▄ \n▀██▀ ▀▀▀▀ ▀▀▀▀ "]]], + ["diatrymon", [["angry", " ▄▄▀▀▀██▀▀ \n ▄▄▀ ▄█ ▀█▀ \n█ ▄ ▄▄ █▀ ▄██▀\n▀▄████████▄▀ ▄█▀\n ▄▀▀▀▄▄█ ▄▄▀ \n ▀█▀▀▀▀▄▄█▀ \n ▄▄█▄▄█▄▄▄█▄ \n █▄█▄█ █▄█▄█▄█ "], ["attack", " ▄▄▄▄▄▄▄ \n ▄▀▀▄▄ ▀█▄▄ \n▄▀▀ ▀▀ ▄▄▀ ▄▄▄\n█ ▄█▄█▀ ▄█ ▄▀▀█▄\n ▀▀▄▄▄▄▀██▀ ▀█ \n ▄▀▄▄▄▀ ▄█▀ \n ▄▄█▄ ▀██▄▄▄ \n █▄█▄█▀▀▀█▄█▄█▄█"], ["eat_1", " ▄▄▄▄▄▄▄ \n ▄▀▀▄ ▀█▄▄ \n▄▀▀ ▀ ▀ ▄▄▀ ▄▄▄\n█ ▄█▄█▀ ▄█ ▄▀▀█▄\n ▀▀▄▄▄▄▀██▀ ▀█ \n ▄▀▄▄▄▀ ▄█▀ \n ▄▄█▄ ▀██▄▄▄ \n █▄█▄█▀▀▀█▄█▄█▄█"], ["eat_2", " ▄▄▀▀▀██▀▀ \n ▄▄▀ ▄█▀ ▀█▀ \n█ ▄ ▄▄▄ █▀ ▄██▀\n▀▄█████ ██▄▀ ▄█▀\n █▀▀▄▀▀█ ▄▄▀ \n █▀▀▀▀▄▄█▀ \n ▄▄█▄▄█▄▄▄█▄ \n █▄█▄█ █▄█▄█▄█ "], ["happy", " ▄▄▀▀▀██▀▀ \n ▄▄▀ ▄▀▄ ▀█▀ \n█ ▄ ▄▄▄ █▀ ▄██▀\n▀▄█████ ██▄▀ ▄█▀\n ▄▀▀▄▀▀█ ▄▄▀ \n ▀█▀▀▀▀▄▄█▀ \n ▄▄█▄▄█▄▄▄█▄ \n █▄█▄█ █▄█▄█▄█ "], ["injured_1", " \n ▄▄▄▄▄▄▄ \n ▄▀▀▄ ▀█▄▄ \n▄▀▀ ▀▀ ▄▄▀ \n█ ▄█▄█▀ ▄█▄▄ \n ▀▀▄▄▄ ▀▀█▄▄▀▄ \n █ ▀▀▀▄▄█ ▄█ \n █▄█▄▄▄▄█▄█▄▄█"], ["injured_2", " \n \n ▄▄▀▀▀██▀▀ \n ▄▄▀ █▄ ▀█▀ \n█ ▄ ▄▄ █▀ \n▀▄█▀▀▀ ▄██▀▀▄ \n ▀█▀▀▄▄█▀▄ █▄ \n █▄█▄▄▄▄█▄█▄▄█"], ["refuse", " ▄▄▄▄▄▄▄ \n ▄▀▀ ▄ ▀█▄▄ \n▄▀▀ ▀▀ ▄▄▀ ▄▄▄\n█ ▄█▄█▀ ▄█ ▄▀▀█▄\n ▀▀▄▄▄▄▀██▀ ▀█ \n ▄▀▄▄▄▀ ▄█▀ \n ▄▄█▄ ▀██▄▄▄ \n █▄█▄█▀▀▀█▄█▄█▄█"], ["sleep_1", " \n ▄▄▄▄▄▄▄ \n ▄▀▀ ▀█▄▄ \n▄▀▀ ▀▀ ▄▄▀ ▄▄▄\n█ ▄█▄█▀ ▄█ ▄▀▀█▄\n ▀▀▄▄▄▄▀██▀ ▀█ \n ▄█▀█▀▄▄▄▀█▀█▀ \n █▄▄█▄▄▄█▄▄▄▄█ "], ["sleep_2", " \n \n ▄▄▀▀▀██▀▀ \n ▄▄▀ ▄▄ ▀█▀ \n█ ▄ ▄▄ █▀ ▄██▀\n▀▄█▀▀▀ ▄██▄▀ ▄█▀\n ▄█▀█▀█▄▄▀█▀█▄▀ \n █▄▄█▄▄▄█▄▄▄▄█ "], ["walk_1", " ▄▄▀▀▀██▀▀ \n ▄▄▀ ▄█▀ ▀█▀ \n█ ▄ ▄▄ █▀ ▄██▀\n▀▄█▀▀▀ ▄██▄▀ ▄█▀\n ▀▀█▀ ▀█ ▄▄▀ \n █ ▀▀▀▄▄█▀ \n ▄▄█▄▄█▄▄▄█▄ \n █▄█▄█ █▄█▄█▄█ "], ["walk_2", " ▄▄▄▄▄▄▄ \n ▄▀▀▄▄ ▀█▄▄ \n▄▀▀ ▀▀ ▄▄▀ ▄▄▄\n█ ▄█▄█▀ ▄█ ▄▀▀█▄\n ▀▀▄▄▄▄▀██▀ ▀█ \n ▄▀▄▄▄▀ ▄█▀ \n ▄▄█▄ ▀██▄▄▄ \n █▄█▄█▀▀▀█▄█▄█▄█"]]], + ["digitamamon", [["angry", " ▄▄▄ \n ▄▀▀ ▀▀▄ \n ▄▀ ▄ ▄ ▀▄ \n █▄▄█▄▄▄█▄▄ █ \n ▀█ ▀██▀ █ ▄█ \n ▄▄▄████████ \n █▄█ ▀▀▄▀▄█▄█ \n █▄▄▄█▄▄▄█▄▄▄▄█ "], ["attack", " ▄▄▄▄██▀▀▀▀▀▄ \n █████▄███▄▀ █\n ▀▄ ▀████▀ █\n █ ███ █\n ▄▀ ▄███▄▀ \n ▄▀██████▀█▀▄ \n ▄█▄ █ ▄▀ ▄▄█▄ \n█▄▄▄▀▄▄▄▄▄▀▄▄▄▄█"], ["eat_1", " ▄▄▄▄▄▄▄ \n ▄███▀█▄▄ ▄ ▀▄\n █▀▀▀▀▀████▄▄ █\n ▀▄ ████ █\n ▄▀ ▄████▄▀ \n▄▀▀███████▀██▀▀▄\n█ ▀▄ █ ▄▀ ▄▀ █\n ▀▄▄▀▄▄▄▄▄▀█▄▄▀ "], ["eat_2", " ▄▄▄ \n ▄▀▀ ▀▀▄ \n ▄▀ ▄▀ ▄█ ▀▄ \n █▄█▀███▀██ █ \n ▀▄█▄█▄█▄█ ▄█ \n ▄▄▄█▄▄▄▄▄██ \n █▄█ ▀▀▄▀▄█▄█ \n █▄▄▄█▄▄▄█▄▄▄▄█ "], ["happy", " ▄▄▀▀▀▀▀▀▄▄ \n ▄▀ ▄ ▄ ▀▄\n █▄▄█▄▄██▄▄▄▀ █\n ▀█▄▄██▄▄███▄█\n █ ██▀ \n▄▀▀▄▄█▄▄▄▄███▀▀▄\n█ ▀▄ ▀▀ █ ▄▀ █\n ▀▄▄▀▄▄▄█▄▄▀▄▄▀ "], ["injured_1", " \n ▄▀▀▀▀▄ \n ▄▀ ▀▄ \n ▄▀ ▄▀ ▄ ▀▄ \n ▀▄▀▀█▄▀▀▄█▄█ \n █▀█▀██▀█▀█▀▄ \n █▄▄ ▄▀ ▄▄█▄ \n █▄▄▄█▄▄▄▄█▄▄▄▄█"], ["injured_2", " \n ▄▄▄▄ \n ▄▀ ▀▄ \n █ █ \n █ █ ▄▄ ▄ █ \n █▀█ ▀█ █▀█▀▄ \n █▄▄ ▄▀ ▄▄█▄ \n █▄▄▄█▄▄▄▄█▄▄▄▄█"], ["sleep_1", " \n ▄▄▄▄ \n ▄▀ ▀▄ \n █ █ \n █ █ ▄▄ ▄ █ \n █▀█ ▀█ █▀█▀▄ \n █▄▄ ▄▀ ▄▄█ \n ▀██▄▄▄▄██▀ "], ["sleep_2", " \n ▄▀▀▀▀▄ \n ▄▀ ▀▄ \n ▄▀ ▄ ▀▄ \n ▀▄▄█▄▄██▄█▄█ \n █▀█ ▀█ █▀█▀▄ \n █▄▄ ▄▀ ▄▄█ \n ▀██▄▄▄▄██▀ "], ["walk_1", " ▄▀▀▀▀▄ \n ▄▀ ▀▄ \n ▄▀ ▄▀ ▄ ▀▄ \n ▀▄███▄██▄█▄█ \n ▄▄█▄██▄███▄ \n █ ▀ ▀▀ █ ▀ █ \n ▄█▄█ ▀ ▄▄█▄ \n █▄▄▄█▀▀▀▀▄▄▄▄█ "], ["walk_2", " ▄▄▄▄ \n ▄▀ ▀▄ \n █ ▄ █ \n █ ▄█▄ ▄▄▀▄ █ \n ▀█▀██▀███▀▀ \n █▀█▀██▀█▀█▀▄ \n ▄█▄▄ ▄▀ ▄▄█▄ \n█▄▄▄▀▄▄▄▄▄▀▄▄▄▄█"]]], + ["dinobeemon", [["angry", " ▄▄▀▀▀▀█ \n▄▀ ▄ ▄▀▀█ ▄▄▄\n█ ▀▀ █▄▀▀ ▄▀ █\n ▀▄▄▄▀██▀██▄ ▄▀▄\n █▀▀▄█▀▄██▀█▄▄█\n ▄▀▀█▀▀█▀ █▀▄ \n ▀▄█▀▀▄█▄▄██▄ █\n █▄█▄▀ ▀▄█▄█▀▀"], ["attack", " \n ▄▄▀▀▀▀█▄▄ \n▄▀ ▄▄ ▄▀▄▄▀ ▄▀▀█\n█ ██▀ ███▄▄▀ ▄▀\n ▀▄▄▄██▀ ███▄▀ █\n ▄▀▄█▄██▀ ██▀▀\n █▄▄█▄ █ ▄█▄▀▄\n █▄█▄█▀▀██▄█▄█▀"], ["eat_1", " \n ▄▄▀▀▀▀█▄▄ \n▄▀ ▄ ▄▀▄▄▀ ▄▀▀█\n█ ▀ ▀ ███▄▄▀ ▄▀\n ▀▄▄▄██▀ ███▄▀ █\n ▄▀▄█▄██▀ ██▀▀\n █▄▄█▄ █ ▄█▄▀▄\n █▄█▄█▀▀██▄█▄█▀"], ["eat_2", " ▄▄▀▀▀▀█ \n▄▀ ▄▄ ▄▀▀█ ▄▄▄\n█ ██▀ █▄▀▀ ▄▀ █\n ▀▄▄▄▀██▀██▄ ▄▀▄\n █▀▀▄█▀▄██▀█▄▄█\n ▄▀▀█▀▀█▀ █▀▄ \n ▀▄█▀▀▄█▄▄██▄ █\n █▄█▄▀ ▀▄█▄█▀▀"], ["happy", " ▄▄▀▀▀▀█ \n▄▀ ▄ ▄▀▄▀█ ▄▄▄\n█ ▀ ▀ ███▀ ▄▀ █\n ▀▄▄▄█ █▀██▄ ▄▀▄\n █▀▀▄█ ▄██▀█▄▄█\n ▄▀▀█▀▀█▀ █▀▄ \n ▀▄█▀▀▄█▄▄██▄ █\n █▄█▄▀ ▀▄█▄█▀▀"], ["injured_1", " \n \n ▄▄▀▀▀▀█▄▄ ▄▄▄\n▄▀ ▄▀▄▄▀▄▀ █\n█ ▀▀ ███▄█▄ ▄▀▄\n ▀▄▄▄██▀ ██▀█▄▄█\n ▄▀█▀█▀▀█▀ █▀█▀▄\n █▄▄▄██▄█▄▄▀▄▄▄▀"], ["injured_2", " \n \n ▄▄▄▄▄ \n ▄▀▀ ▄▀▀█ ▄▀▀█\n█ ▄▄ █▄█▀▄▀ ▄▀\n▀▄ ▄██▀███▄▀ █\n ▄▀█▀█▀▄▄▀ █▀█▀▄\n █▄▄▄▄█▄█▄█▀▄▄▄▀"], ["refuse", " \n ▄▄▀▀▀▀█▄▄ \n▄▀ ▄ ▄▀▄▄▀ ▄▀▀█\n█ ▀▀ ███▄▄▀ ▄▀\n ▀▄▄▄██▀ ███▄▀ █\n ▄▀▄█▄██▀ ██▀▀\n █▄▄█▄ █ ▄█▄▀▄\n █▄█▄█▀▀██▄█▄█▀"], ["sleep_1", " \n ▄▄▄▄▄ \n ▄▀▀ ▄▀▀█ ▄▀▀█\n█ ▄▄ █▄█▀▄▀ ▄▀\n▀▄ ▄██▀███▄▀ █\n ▀█▀▄█▄▄█▀ ██▀▀\n ▀▄▄█▄ █ ▄█▄▀▄\n █▄█▄█████▄█▄█▀"], ["sleep_2", " \n \n ▄▄▀▀▀▀█▄▄ ▄▄▄\n▄▀ ▄▀▄▄▀▄▀ █\n█ ▀▀ ███▄█▄ ▄▀▄\n ▀▄▄▄██▀ ██▀█▄▄█\n ▄█▄█▀▀█▀ █▀▀▄\n █▄█▄██▄█▄▄█▄███"], ["walk_1", " ▄▄▄▄▄ \n ▄▀▀ ▄▀▀█ ▄▄▄\n█ ▄██ █▄█▀ ▄▀ █\n▀▄▀▀ ▄██▀██▄ ▄▀▄\n ▀▀█▀█ ▄██▀█▄▄█\n ▄▀ █▀▀█▀ █▀▄ \n ▀▄█▀▀▄█▄▄██▄ █\n █▄█▄▀ ▀▄█▄█▀▀"], ["walk_2", " \n ▄▄▀▀▀▀█▄▄ \n▄▀ ▄▄ ▄▀▄▄▀ ▄▀▀█\n█ ██▀ ███▄▄▀ ▄▀\n ▀▄▄▄██▀ ███▄▀ █\n ▄▀▄█▄██▀ ██▀▀\n █▄▄█▄ █ ▄█▄▀▄\n █▄█▄█▀▀██▄█▄█▀"]]], + ["dinorexmon", [["angry", " ▄▄▄▄▄ \n ██▀ ▄▀▀▀▀█ \n █ ▀ ▀ ▄ ██▄▀█ \n█▀▀ ▀▀ ▀▄█▀▀█\n▀▄ ▄█▄█▀ █▀█▀▀█\n ▀██▄▄▄██▀ █▀▀█\n▄▀█▀▄█▄▀█▀▀██▄▄█\n█▄█▄▀██▄█▄██▄█▄▀"], ["attack", " ▄▄█▀▀██▄▄▄ \n ▄▀█ ▄▀ ▄▀▄▄ \n▄█▄ ▄█ █▀▄█▄▄\n█ ▄ ▄ ▄ ██▄▄█\n ▀▄██████ █ █ ▄█\n ▄▀███▀▀▄▀ █▀▀▄\n▄▀█▀▄▄▄▀█▀▀██▄▄█\n█▄█▄▀██▄█▄██▄█▄▀"], ["eat_1", " ▄▄█▀▀██▄▄▄ \n ▄▀█ ▄▀ ▄ █▄▄ \n▄█▄ ▀ ▀ ▀ ▄██▄▄\n█ ▄ ▄ ▄▄ ▄██▄▄█\n ▀▄█████▀▄█ █ ▄█\n ▄█▀██▀▄▀ █▀▀▄\n▄▀█▀█▄▄▀█▀▀██▄▄█\n█▄█▄▀██▄█▄██▄█▄▀"], ["eat_2", " ▄▄▄▄▄ \n ██▀ ▄▀▀▀▀█ \n █ ▀ ▀ ▄ █▄▀█ \n█▀▀ ▀ ▀ ▀▄█▀▀█\n▀▄ ▄█▄█▀ █▀█▀▀█\n ▀██▄▄▄██▀ █▀▀█\n▄▀█▀▄█▄▀█▀▀██▄▄█\n█▄█▄▀██▄█▄██▄█▄▀"], ["happy", " ▄▄█▀▀██▄▄▄ \n ▄▀█ ▄▀ ▄▀▄▄ \n▄█▄ ▄▀▄ █▀▄█▄▄\n█ ▄ ▄ ▄ ▄██▄▄█\n ▀▄█████▀▄█ █ ▄█\n ▄█▀██▀▄▀ █▀▀▄\n▄▀█▀█▄▄▀█▀▀██▄▄█\n█▄█▄▀██▄█▄██▄█▄▀"], ["injured_1", " \n ▄▄█▀▀██▄▄▄ \n ▄▀█ ▄▀ ▄▄▀▄▄ \n▄█▄ ▀ █▄ █▀▄█▄▄\n█ ▄ ▄▄ ▄██▄▄█\n ▀▄▄█▀▀▀▄▄█ █ ▄█\n█▀█▀█▀▀▀█▀█▀█▀█ \n█▄▄▄█▄▄▄█▄▄▄█▄▄█"], ["injured_2", " \n ▄▄▄▄▄ \n ██▀ ▄▀▀▀▀█ \n █ ▀ █ ▄ ▀█▄▀█ \n█▀▀ ▀▀ ▀▄█▀▀█\n▀▄ ▄█▄█▀ █▀█▀▀█\n▄▀█▀█▄▄▄█▀█▀█▀█ \n█▄▄▄█▄▄▄█▄▄▄█▄▄█"], ["sleep_1", " \n ▄▄▄▄▄ \n ██▀ ▄▀▀▀▀█ \n █ ▀ █ ▀█▄▀█ \n█▀▀ ▀▀ ▀▄█▀▀█\n▀▄ ▄█▄█▀ █▀█▀▀█\n▄▀▀█▀▄▀▀█▀█▀█▀▀█\n█▄█▄██▄█▄▄██▄█▄█"], ["sleep_2", " \n ▄▄█▀▀██▄▄▄ \n ▄▀█ ▄▀ ▄▄▀▄▄ \n▄█▄ ▀ ▄▄ █▀▄█▄▄\n█ ▄ ▄▄ ▄▀█▄▄█\n ▀▄▄█▀▀▀▄▄█ █ ▄█\n▄▀▀█▀█▀▀█▀▄ █▀▀▄\n█▄█▄██▄█▄▄██▄█▄█"], ["walk_1", " ▄▄█▀▀██▄▄▄ \n ▄▀█ ▄▀ ▄▄▄▀▄▄ \n▄█▄ ▀ █▄▀█▀▄█▄▄\n█ ▄ ▄▄ ▄██▄▄█\n ▀▄▄█▀▀▀▄▄█ █ ▄█\n ▄█▀█▀▀█▀ █▀▀▄\n▄▀█▀███▀█▀▀██▄▄█\n█▄█▄▀██▄█▄██▄█▄▀"], ["walk_2", " ▄▄▄▄▄ \n ██▀ ▄▀▀▀▀█ \n █ ▀ █ ▄▀██▄▀█ \n█▀▀ ▀▀ ▀▄█▀▀█\n▀▄ ▄█▄█▀ █▀█▀▀█\n ▀██▄▄▄██▀ █▀▀█\n▄▀█▀▄█▄▀█▀▀██▄▄█\n█▄█▄▀██▄█▄██▄█▄▀"]]], + ["dinotigermon", [["angry", " \n ▄▄█▀▀▀▄▄▄▀▀ ▄▄\n▄███▀▀█▀▀▄ █ █\n███▄▄█▀▄▀▀█▀▄█ █\n▀▄█ █ █ ▄▀ ▀▀▄\n ▀▄▀ ▀█▀▀▄ █ █\n ▄▄▀▀▄▄▀ █▀█▄ █\n█▄▄▄▀█▄▄▄▀ █▄▄▄█"], ["attack", " ▄▄▄▄ ▄▄▄ \n ▄███▄▄▄█▀ ▄▄\n███▀ ██ ▀▄ █ █\n▀███▀█ ▄▀▀█▄█ █\n ██ █ ▄▀ █ ▀▀▄\n ▄▀▀▀ ▄█▄▄█ ▄ █\n ▀█▀▀▄▀ █▀▀▄ █\n █▄▄█▄▄▄▀ █▄▄█"], ["eat_1", " ▄▄▄▄▄▄ ▄▄ \n▄███▀█▄▄▄▀▀ ▄▄\n███▄█▄█ ▀▄ █ █\n █ ██ ▄▀▀█▄█ █\n ▄█▄▀ ▄█ ▄▀ ▀▀▄\n ▀▄▄▄▀ █▀▀█ █ █\n ▄▀ ▄▀ █▀█▄ █\n █▄▄█▄▄▄▀ █▄▄▄█"], ["eat_2", " \n ▄▄█▀▀▀▄▄▄▀▀ ▄▄\n▄███▀██▀▀▄ █ █\n███▄█▄▀▄▀▀█▀▄█ █\n▀▄█ █ █ ▄▀ ▀▀▄\n ▀▄▀ ▀█▀▀▄ █ █\n ▄▄▀▀█▀ █▀█▄ █\n █▄▄▄▀▄▄▄▀ █▄▄▄█"], ["happy", " ▄▄▄▄▄▄ ▄▄ \n▄███▀█▄▄▄▀▀ ▄▄\n███▄█▄█ ▀▄ █ █\n █ █▀ ▄▀▀█▀▄█ █\n █▀▄▀ █ ▄▀ ▀▀▄\n ▀▀▄▄█▀▀█ █ █\n ▄█ █ █▀▀█▄ █\n █▄▄█▄▄▄▀ █▄▄▄█"], ["injured_1", " \n \n ▄▄█▀▀▀▄▄▄▀▀ \n▄██▀███▀▀▄ ▄▀▀▀▄\n███▄▄█▀ ▄▀▀█▀▀▄▀\n▀▄█ █ █ ▄▀ █\n ▄▀▄█ ▄█▀▀█▄▄▀ █\n █▄▄▄▀▄▄▄▀█▄▄▄▄▀"], ["injured_2", " \n \n ▄▄▄▄ ▄▄▀▀ \n ▄███▄▄▄█▄ ▄▀▀▀▄\n███ ▀██ ▄▀▀█▀▀▄▀\n█▀█▀█▀ █ ▄▀ █\n █▀▄█ ▄█▀▀█▄▄▀ █\n █▄▄▄▀▄▄▄▀█▄▄▄▄▀"], ["sleep_1", " \n \n ▄▄█▀▀▀▄▄▄▀▀ \n▄██████▀▀▄▄▄▀▀▀▄\n███▄▄█▀▄▀▀█ ▀▀▄▀\n▀▄█ █ █ ▄▀ █\n ▄█▄▀▄█▀▀ █▄█ █\n█▄▄▄█▄▄▄▄▀█▄▄▄▄█"], ["sleep_2", " \n ▄▄▄▄ ▄▄ \n ▄███▄▄▄█▀▀ \n███▀▀██ ▀▄▄▀▀▀▄\n█▀█▀█▀ ▄▀▀█ ▀▀▄▀\n ▀█ █ █ ▄▀ █\n ▄▄▀▀▄█▀▀ █▄█ █\n█▄▄▄█▄▄▄▄▀█▄▄▄▄█"], ["walk_1", " ▄▄▄▄ ▄▄ \n ▄███▄▄▄█▀▀ ▄▄\n███▀ ██ ▀▄ █ █\n█▀█▀█▀ ▄▀▀█▀▄█ █\n ▀█ █ █ ▄▀ ▀▀▄\n ▀▄▄█▀▀█ █ █\n ▄█ █ █▀▀█▄ █\n █▄▄█▄▄▄▀ █▄▄▄█"], ["walk_2", " ▄▄█▀▀▀▄▄▄▀▀ \n▄███▀██▀▀▄ ▄▄\n███▄▄█▀ ▄▄█▄ █ █\n▀▄█ █ ▄▀ █ ▀█ █\n ▀▄▀ █▄▄█ ▀▀▄\n █ ▀█▀ █▀▄█ █\n▄▀ █▄▄▄▀ ▀▄ █\n▀▀▀▀ █▄▄▀"]]], + ["divermon", [["angry", " \n█▀▄ ▄▀▀▀▀▀▄ ▄▀█ \n▀▄ █▄██▄██▄█ ▄▀ \n█ ▄▀ ▄▄▄▄ ▀█ █ \n▀▀█ ▀ ▄▄ ▀ █▀▀ \n ▄██▄▀█▀█▄▄██ \n ▀█▀▄▄█▄▄█▀██▄ \n▄███▄▄▀▀▄▄████▄ "], ["attack", "█▀▄ ▄▀▀▀▀▀▄ ▄▀█ \n█▄ █▀▄ ▄▀▀█ ▄█ \n█ █▄▀▀▀▀▀▀▄ █ █ \n ▀█ ██████ ██▀ \n █ ██▀▀ █ █▀█ \n▄▀ █▄▀▀▀▀▄█▄█ ▀▄\n▀▀██▀█▄██▀▀█▄▀▀▀\n▄▄███▄▄▀▄████▄▄ "], ["eat_1", "█▀▄ ▄▀▀▀▀▀▄ ▄▀█ \n█▄ █ █ █ █ ▄█ \n█ █▄▀▀▀▀▀▀▄ █ █ \n ██ ██████ ███▄ \n█ █▀▀▄█ █ ▄█ █\n ▀█▄ ▄████▄▀ \n ▄█▀████▀▀█▄ \n▄▄███▄▄▀▄████▄▄ "], ["eat_2", " \n█▀▄ ▄▀▀▀▀▀▄ ▄▀█ \n▀▄ █ ▄ ▄ █ ▄▀ \n█ █▄▀▀▄▄▀▀▄ █ █ \n▀▀█ ▀▄▄▄▄▀ █▀▀▀ \n ███▄▄▄▄▄▄███ \n ▄▀█▄ █ ▄█▀▀▄▄ \n▄██▄▄█▀▀▄▄████▄ "], ["happy", "█▀▄ ▄▀▀▀▀▀▄ ▄▀█ \n█▄ █ ▄ ▄ █ ▄█ \n█ █▀▀▄█▄█▄▀▀█ █ \n █ ██▄▄▄▄▄██ █ \n▄█▄▀███████▀▄█▄▄\n█ █▀▄▀▀▀▀▀▄ █▄ █\n ▀█▀██▄████▀██▀ \n▄███▄▄▀▀▀▄▄███▄ "], ["injured_1", " \n \n▄▄ ▄▄▄▄▄▄ ▄▄ \n█ █▀ ▀█▀ █ \n▀▄█ ▄ ▄ █▄▀ \n█▄█▀▀ ▀▀▀ ▄█▄█ \n ▄█▀▀▀▀▀▀▀▄█▀▄ \n█▄▄█████████▄▄█ "], ["injured_2", " \n \n \n ▄▄▄▀▀▀▀▀▀▄▄▄▄ \n█ █ ▀▄ █ \n▀▄█▄█ █▄▄ █▄▀ \n█▄█▄▄▄▄▄▄▄ ██▄█ \n█▄█▄▄▄▄▄▄▄██▄▄█ "], ["sleep_1", " ▀ \n ▀ \n▄▄ ▄▄▄▄▄█▀█▄▄ \n█ ▀▄▀▀▀▀▀▀█ █ █ \n▄▀▄▀▄▄▄▄▄▄█ █▀▄ \n▀▄█▀▄▄▄▄▄█▄█▄▄▀ \n ▄██▄▄▄▄▄▄▄██▄ \n█▄▄███▄█████▄▄█ "], ["sleep_2", " ▄ ▀ \n \n▄▄ ▄▄▄▄▄█▀█▄▄ \n█ ▀▄▀▀▀▀▀▀█ █ █ \n▄▀▄▀▄▄▄▄▄▄█ █▀▄ \n▀▄█▀▄▄▄▄▄█▄█▄▄▀ \n ▄██▄▄▄▄▄▄▄██▄ \n█▄▄███▄█████▄▄█ "], ["walk_1", "█▀▄ ▄▀▀▀▀▀▄ ▄▀█ \n█▄ █▀▀ ▀▀ █ ▄█ \n█ █▄▀▀▀▀▀▀▄ █ █ \n▄██▄▀▀▀▀▀▀ █▀▀▄▄\n█ ▄▀██▀███▀▄██ █\n ▀█▄██ ███▄███▀ \n ▄█▀█▄██▀▀█▄ \n▄▄███▄▄▀▄████▄▄ "], ["walk_2", "▄▄ ▄▄▄▄▄ ▄▄ \n█ ▀▄▀▄ ▄ ▀▄▀ █ \n▄▀▄▀▄█▄▄█▄ ▀▄▀▄ \n█▄█▀▄▄▄▄▄▄▀▄█▄█ \n ▄█▄▄▄▄▄▄▄▀▄▄ \n▄▀█ ██ ███ ███▀▄\n▀▄▄█▀█▄██▀▀█▀▄▄▀\n▄▄███▄▄▀▄████▄▄ "]]], + ["dobermon", [["angry", " \n ▄▄ ▄▄▄▄ \n ▄▄██▄▄██▀ \n▄████▀ ███ ▄\n▀███████▀ █ ▄▀█\n ▄▀▀▄▄▄███▀██ \n ▄██ █▄██▀▄██ \n █▄█ █▄█▀ █▄██ "], ["attack", " \n ▄▄ ▄▄▄▄ \n ▄▄██▄▄██▀ ▄█\n▄████▀ ███ ▄▄█ █\n█████████ ██████\n▀▄ ▀██▀▄██████ \n ▀▄▄▄█▄█▀███ ██ \n █▄▄█▄▄▄█▀█▄▄██ "], ["eat_1", " \n ▄█▀ ▄██▀▀ \n ▄███▀▀██ \n▄████▄▄██▀▄ ▄\n█ ██▀▀ ▄█▄▄▄▀█\n ▀▀▀▄▄▄█████▀██ \n ▄██ █▄██▀▄██ \n █▄█ █▄█▀ █▄██ "], ["eat_2", " \n ▄█▀ ▄██▀▀ \n ▄████▀███ \n█████▄█▄█▀▄ \n▀▄▄▄██▀▀ ▄█▄ ▄\n ▀▄▄▄█████▀▄▀█\n ▄██ █▄███▄█▄▀\n █▄█ █▄███▄▄██ "], ["happy", " ▄█▀ ▄██▀▀ \n ▄████▀███ \n█████▄█▄█▀▄ \n█ ▄█▀▀ ▄█▄ ▄\n ▀██▄▄▄██████▄▀█\n █▀█▀▄▄█▄██████ \n ▀▄▀▄▄▀ █ ██ ██ \n █▄██▄▄██ "], ["injured_1", " \n \n ▄█▀ ▄██▀▀ \n ▄███▀████▄ \n█████▄▄██▀█▄ ▄\n▀▄▄▄██▀▀ ▄██▀▄▀█\n ▄▀▄▄▄▀████▀█▄▀\n █▄▄█▄▄▄██▄▄▄██ "], ["injured_2", " \n \n ▄▄ ▄▄▄▄ \n ▄▄██▄▄██▀ \n▄████ ▀████ ▄\n█▀▀▀████▀ ██▄▄▀█\n ▀█▀█▄▄▄████ █▄▀\n █▄▄█▄▄▄██▄▄▄██ "], ["sleep_1", " \n \n ▄█▀ ▄██▀▀ \n ▄████████▄ \n█████▄▄██▀█ ▄\n▀▄▄▄██▀▀ ▄██▀▄▀█\n ▄▀▄▄▄▀████▀█▄▀\n █▄▄█▄▄▄██▄▄▄██ "], ["sleep_2", " \n ▄▄ ▄▄▄▄ \n ▄▄██▄▄██▀ \n▄████▀▀████ \n█▀▀▀████▀ ██ ▄\n ▀▀█▀▀▄▄▄███▀▄▀█\n ▄▀███▀████▀█▄▀\n █▄▄█▄▄▄██▄▄▄██ "], ["walk_1", " \n ▄█▀ ▄██▀▀ \n ▄████▀▀██ \n█████▄▄██▀▄ ▄\n ▀▀▀██▀▀ ▄█▄▄▄▀█\n ▀▄▄▄█████▀██ \n ▄██ █▄██▀▄██ \n █▄█ █▄█▀ █▄██ "], ["walk_2", " ▄▄ ▄▄▄▄ \n ▄▄██▄▄██▀ \n▄████▀ ▄██ \n▀███████▀ █ ▄\n ▄▀▀ ▄▄███▄▄▀█\n ▄███▀▀█▀███▀██ \n █ █ ▀█▀▀▀█▀▄██ \n ▀ ▀▀ █▄█▄██ "]]], + ["dodomon", [["angry", " \n \n \n ▄▄ ▄▄▄ \n ▄█████████▄ \n █▄▀███▀▀▄██ \n ███▀ ▀▀████ \n ▀█▄▄█▄▄▄██▀ "], ["attack", " ▄ ▄▄ \n ▄█████▀█▄ \n █▀ ▀ ▀▄████ \n ▀█▀▀█▀▄▀███ \n █ ██ \n ▄█▄▄█▄▄█ ██ \n ▀▄▄▄▄▄▄▄█▀ \n ▄▄▄▄▄▄▄ "], ["eat_1", " █\n ▄ ▄▄ █\n ▄████▀██▄ █\n ██▀█▀▄█▄███ █\n ▀▄▄▄▄▄▄ ▀██ █\n ▀ ▀ █ ██ █\n ▄█▄█▄▄▀ ██ █\n ▀▄▄▄▄▄▄█▀ █"], ["eat_2", " \n \n \n ▄█▄▄██▄ \n ▄███▀▄▀███▄ \n █▀ ▀▀▀█████ \n █▄▀▄▀▄ ████ \n ▀▄▄▄▄████▀ "], ["happy", " \n \n \n ██▄▄▄██ \n ▄▀▄▀█▀█▀▄▀▄ \n ███▀ ▄ ▀███ \n ▀██▄▄▄▄▄██▀ \n ▄▄▄▄▄▄▄ "], ["injured_1", " \n \n \n \n ▄██▄▄███▄ \n █▀ ██ ▀▀███ \n ██▀ ▀▀████ \n ▀▄▄██▄▄▄██▀ "], ["injured_2", " \n \n \n \n █▄▄▄▄██ \n ▄█▀██▀████▄ \n █▄▄▀▀▄▄▄███ \n ▀█▄▄▄▄▄███▀ "], ["sleep_1", " \n \n \n \n █▄▄▄▄██ \n ▄█▀██▀▀███▄ \n █▄█▀▀██▄███ \n ▀█▄▄▄▄▄███▀ "], ["sleep_2", " \n \n \n \n █▄▄▄▄██ \n ▄█▀██▀▀███▄ \n █▄█▀▀██▄████ \n ▀█▄▄▄▄▄████▀ "], ["walk_1", " \n \n \n \n ██▄▄▄██ \n ▄██ █▀█ ██▄ \n ███▀ ▄ ▀███ \n ▀██▄▄▄▄▄██▀ "], ["walk_2", " \n \n \n ▄▄ ▄▄ \n ▄█▀███▀█▄ \n ███▄▀ ▀▄███ \n ███ ▀▀▀ ███ \n ▀██▄▄▄██▀ "]]], + ["dokimon", [["angry", " \n \n ▄▄ \n ▄▀ █ \n ▀▄ █▄▄▄ \n ▄▀ ▄ ▀▄ \n █ ▀▀ █ \n ▀▄▄▄▄▄▄▀ "], ["attack", " \n ▄▀█ \n ▄▀ ▄▀ \n ▀▄▀▀▀▀▄ \n ▄▀ ▄▀ █ \n ███▄ █ \n ████ █ \n ▀▄▄▄▄▄▀ "], ["eat_1", " \n ▄▀█ \n ▄▀ ▄▀ \n ▀▄▀▀▀▀▄ \n ▄▀ ▄ █ \n █▄▄▄ █ \n ████ █ \n ▀▄▄▄▄▄▀ "], ["eat_2", " \n \n ▄▄ \n ▄▀ █ \n ▀▄ █▄▄▄ \n ▄▀ ▄ ▀▄ \n █ ▀ ▀ █ \n ▀▄▄▄▄▄▄▀ "], ["happy", " ▄▀█ \n ▄▀ ▄▀ \n ▀▄▀▀▀▀▄ \n ▄▀ ▄▀▄ █ \n █▄▄▄▄▄ █ \n ████▀ █ \n ▀▄▄▄▄▄▀ \n ▄▄▄▄ "], ["injured_1", " \n \n \n ▄▀█ \n ▄▀ ▄▀ \n ▄▀▀▄▀▀▄ \n █ ▄█ █▄ █ \n ▀▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n \n ▄▄ \n ▄▀ █ \n █▄ █▄ \n ▄▀ ▄▀▄ ▀▄ \n ▀▄█▄▄▄█▄▀ "], ["sleep_1", " \n \n \n ▄▄ \n ▄▀ █ \n █▄ █▄ \n ▄▀ ▀ ▀▄ \n ▀▄██▄██▄▀ "], ["sleep_2", " \n \n \n ▄▀█ \n ▄▀ ▄▀ \n ▄▀▀▄▀▀▄ \n █ ▄▄ ▄▄ █ \n ▀▄▄▄▄▄▄▄▀ "], ["walk_1", " \n \n ▄▄ \n ▄▀ █ \n █▄ █▄ \n ▄▀ ▀ ▀▄ \n █ ▀ ▄ ▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["walk_2", " \n \n \n ▄▀█ \n ▄▀ ▄▀ \n ▄▀▀▄▀▀▄ \n █ ▄ ▄ █ \n ▀▄▄▄█▄▄▄▀ "]]], + ["dokugumon", [["angry", " \n \n ▄▄▄▄ \n ▄▀▄ ▄▄▀▄ \n ▄ ▄▄██▄ ▄ ▄▄█▄ \n█▄▀▄ ▄ ▀▀ █████ \n▄█ ▄ ▄ ▄██▀▄▀▄▀▄\n█▄█▄▄▄█▄▄█▄█▄█▄█"], ["attack", "▄▀▄█▀█▀▀▄▄▀▄ \n██▄ ▄█ ▄▄▀ \n █▄ ▄ ▄ ▀█ \n ██████ █▀▀▄ \n ▄▀█▀█▀█ ██▄▄█ \n▄▀▄▄▄▄▄▄██▀ █▀█ \n▀█ ▄▀▀███▄▄▀ ▄▀█\n ▀█▄▀▀██████▄▄▀"], ["eat_1", "▄▀▄▀▀▀▀▀▄▄▀▄ \n██▄ ▄▀▄ ▄▄▀ \n █▄ ▄ █▄ \n ▄██████ █▀▀█▄ \n█ ███▄▄█ █▄ ██ \n▀▄█▄▄▄▄▄███▄████\n ▄▀▄▀██████▄▀▄▀█\n █▄█▄▀██████▄▀▄▀"], ["eat_2", " \n ▄▀▀▀▀█▄ \n ▄█ ▀ ▀▀ ██▄ \n ▄ ▄███▄█▄█████ \n█▄▀ ▄ ▀▀ ████ \n▀█▀ ▀ ▀ ████▀▀█\n▄▀█▄▄▄▄▀▀█▀▄ ▀▄█\n█▄█▄▄▄█▄█▀▄▄█▄█ "], ["happy", " ▄ ▄▄▄▄▄ ▄ \n█▄▀ ▄ ▀▀ █ \n▀█▀ ▀ ▀ █▀ \n █▄▄▄▄██ █▀▄▄ \n█▀█████▀▄▀█▄▄█▄ \n█ █ ▀▀ ▄█ ██▀█▄\n▀▄▄▀████▄▄█ ▀▄ █\n ▀▄█▀██████▄█▄▀"], ["injured_1", " \n ▄▄▄ ▄▄ \n ▄▄▀▀▄▄█▄▀▀▄ █▀▄\n█ █▄█▄█ ██ █▄█ █\n▀▄▀▄▄▄▀▄ ███████\n▄█▄▄ ▄▄▀████████\n█▀▄ ▄▄ █████ \n ▀ ▀▀██▄▄█▄▄▀▀ "], ["injured_2", " \n \n █▀█▀▄ ▄▀█▀█▄ \n ▄█ █ ████ █ █ █\n█ █▀▀▀█ ██ █▄█ █\n▀█ ▀▀▀▀▄▄███████\n██▀▀ ▀▀ ▀▀█████▀\n▀▄█▄▄▄▄██▄█▄▄▀ "], ["sleep_1", " █ \n ▄▄█▄▄▄ \n ▄█▀▀▀▀▀██▄▄ \n ▄█ ▄ ▄▄ █▄█ \n ██ ▀ ▀▀ █▄█ \n ██▄██▄▄██▄▀ \n ▀███████ \n ▀▄▄▄▄▀ "], ["sleep_2", " █ \n ▄▄█▄▄▄▄ \n ▄█▀▀▀▀▀▀▀██▄ \n ██ ▄▄ ▄▄▄ █▄█ \n ██ ▀▀ ▀▀▀ █▄█ \n ▀██▄████▄▄██▄▀ \n ▀▀█▀▀▀▀█▀▀ \n ▀▀▀▀ "], ["walk_1", " \n ▄▀▀▀▀█▄ \n ▄█ ▀ ▀▀ ██▄ \n ▄ ▄███▄█▄█████ \n█▄▀▄ ▄ ▀▀ █████ \n▀█ ▄ ▄ █████▀▀█\n▄▀█▄▄▄▀▀█▀▀▄ ▀▄█\n█▄█▄▄█▄▀▀▀▄▄█▄█ "], ["walk_2", " \n ▄▄▄▄ \n ▄▀▄ ▄▄▀▄ \n ▄██▄ ▄ ▄▄██ \n▄▀▄▀▀▀▀██▀█████ \n██ ▀ ▀ ▄▄█████ \n▄█▄▀ █▀▀█▀▀▄▀▄▀▄\n█▄████▄█▀█▄█▄█▄█"]]], + ["dolphmon", [["angry", " ▀ ▄▀▀█ \n ▀ ▄▄▄█▄ █ \n ▀ ▄▀ ▀▄ \n ▄▀▀ ▄█▀ █ \n █▀▀▀▀ ▄ █\n ▄▀▄▄▄▀ █▄▄ █\n ▀▀ ▀▀▀ ▄▀▀ ▄▀\n ▀▀█▄▄█"], ["attack", " ▀ ▄▀▀█ \n ▀ ▄▄▄█▄ █ \n ▄▀ ▀▄ \n▄▀▀ ▄█▀ ▀▄ \n▀▀▀██▄ ▄▀▀█ █ \n ███ ▄▄█ █ \n▄▄▄▄██▀ █ ▄▀ ▀▄\n▀▄▄▄▄▄▄▀ █▄▄▀▄█"], ["eat_1", " ▀ ▄▀▀█ \n ▀ ▄▄▄█▄ █ \n ▄▀ ▄▄ ▀▄ \n▄▀▀ ▀ ▀ █ \n▀▀▀▀▀█ █ \n▄▄▄▄▄▀ ▄▄▄ █ \n▀▄▄▄▄▄▄▀▄█ ▄▀ ▀▄\n █▄▄▀▄█"], ["eat_2", " ▄▀▀█ \n ▄▄▄█▄ █ \n ▄▀ ▀▄ \n▄▀▀ ▄▀█ █ \n█▀▀▀▀▀ █ \n ▀▄▄▄▄ ▄▄▄ █ \n ▀▄█▀▄█ ▄▀▀ █ \n ▀▀█▄▄█"], ["happy", " ▄▀▄ ▄▀▀█ \n▄ ▀ ▄▄▄█▄ █ \n ▄▀ ▄ ▀▄ \n▄▀▀ ▀ ▀ █ \n▀▀▀▀███ ▄▄▄▄ █ \n ▄▀▀ █ ▄▀ █ \n█▀▀▀▀▀ ▄▀▀▀█▀ ▀▄\n ▀▀▀▀▀▀ █▄▄▀▀▀"], ["injured_1", " ▄ ▄▄▄▀▀█\n ▄▀▀█▄ █ \n▀ ▄▄█▄ █ █ █\n ▄▀ ▀▄ █\n▄▀▀ █▄ █\n█▀▀▀▀▄ ▄▀\n ▀▄▄▄▄▄ ▄▄▄▄▀ \n ▀▄█▀▄█ "], ["injured_2", " ▄▄▄\n ▄▄█▀▀ ▄▀\n ▄▀ █▀▄ ▀▄\n ▄▀▀▀▀ ▀▄▀ █\n ▄█ ▄ ▀ █\n█▄▄▄▄ ▀▀ ▄▀\n▀▄ ▀ ▄▄▄▀ \n ▀▀▀▀▀▄▄▄▄▀ "], ["sleep_1", " ▄▄▄\n ▀ ▄▄█▀▀ ▄▀\n▄ ▄▀ █▀▄ ▀▄\n ▄▀▀▀▀ ▀▄▀ █\n ▄█ ▀ █\n█▄▄▄▄ ▀▀ ▄▀\n▀▄ ▄▄▄▀ \n ▀▀▀▀▀▄▄▄▄▀ "], ["sleep_2", " ▄▄▄\n ▄▄█▀▀ ▄▀\n ▄▀ █▀▄ ▀▄\n ▄▀▀▀▀ ▀▄▀ █\n ▄█ ▀ █\n█▄▄▄▄ ▀▀ █\n▀▄ ▄ ▄▀ \n ▀▀▀▀▀▄▄▄▄▀▀ "], ["walk_1", " ▄ ▄▀▀█ \n ▄▄▄█▄ █ \n▀ ▄▀ ▀▄ \n▄▀▀ ▄ ▀█ █ \n█▀▀▀▀ ▀▀ █ \n ▀▄▄▄▄▄ ▄▄▄ █ \n ▀▄█ ▀▄█ ▄▀ ▀▄\n █▄▄▀▄█"], ["walk_2", " ▄ █▀▀▄▀▀█\n ▄▀▀█▄ █ \n▀ ▄▄█▄ █ █ █\n ▄▀ ▀▄ █\n▄▀▀ ▄ ▀█ █\n█▀▀▀▀ ▀▀ ▄▀ \n ▀▄▄▄▄▄ ▄▄▀▀ \n ▀▄█ ▀▄█ "]]], + ["donedevimon", [["angry", " ▄▀ ▄▄▄▄▄ ▀▄ \n ██▀███▀▀███ \n█▄ █▄ ▀ ▄ █ ▄█\n██ █▀▀ ▀▀▄█▀▀██\n▀████▄▄▄▄██▀ ▄▀ \n █▀█▀ ▀ ▄███▄ \n ██▄██▄████▀███ \n ▀ ▄██▀ ▀██▄ ▀ "], ["attack", " ▄ ▄ \n █▄▄█████▄▄█ \n▄ ▀█▄▀█▀ ▄▀█▀ ▄\n██ █▀█ █▀ █▄ ██\n▀█▄█▄ ▄██▀▄█▀\n ▀███▀█▀▀█▀█▀ \n ▄█ █▄ ▄▄█ ██▄ \n █▀████▀████▀▀█ "], ["eat_1", " ▄ ▄ \n █▄▄█████▄▄█ \n▄ ▀█ ▀█▀ ▀█▀ ▄\n██ █▀▄ ▄▀▄ █▄ ██\n▀█▄█▄ ▄██▀▄█▀\n ▀███▀█▀▀█▀█▀ \n ▄█ █▄ ▄▄█ ██▄ \n █▀████▀████▀▀█ "], ["eat_2", " ▄▀ ▄▄▄▄▄ ▀▄ \n ██▀███▀▀███ \n█▄ ██▄▀ ▄█ █ ▄█\n██ █ ▀ ▀ ▄██ ██\n ▀██▄ ██ ▄██▄█▀ \n ▄▀█▀▀▀▀█▀ █▄ \n ██▄██▄███▄▄███ \n ▀ ▄██▀ ▀██▄ ▀ "], ["happy", " ▄▀ ▄▄▄▄▄ ▀▄ \n ██▀███▀▀███ \n█▄ █▄ ▀ ▄ █ ▄█\n██ █ ▀ ▀ ▀▄██ ██\n ▀███▄▄▄▄███▄█▀ \n ▄▀▀█▀ ▀ ▄█▄ ▀▄ \n █▄███▄█████▄▄█ \n ▀ ▄██▀ ▀██▄ ▀ "], ["injured_1", " \n ▄▀ ▄▄▄▄▄ ▀▄ \n ██▀███▀▀███ \n█▄ █ ▄▀ ▄ █ ▄█\n██ █▀▀ ▀▀▄██ ██\n ▀███▄▄▄▄███▄█▀ \n ▄▀█▀ ▀ ▄▀ █▄ \n █▀▄██▄███▄▄▀▀█ "], ["injured_2", " \n ▄ ▄ \n █▄▄█████▄▄█ \n▄ ▀█ ▀█▀ ▀█▀ ▄\n██ █▄█ █▄ █▄ ██\n▀█▄█▄ ▄██▀▄█▀\n ▀███▀█▀▀█▀█▀ \n ▄█▄█▄▄▄▄█▄▄██▄ "], ["refuse", " ▄ ▄ \n █▄▄█████▄▄█ \n▄ ▀█ ▀█▀ ▀█▀ ▄\n██ ██▄ ▄█ █▄ ██\n▀█▄█▄ ▄██▀▄█▀\n ▀███▀█▀▀█▀█▀ \n ▄█ █▄ ▄▄█ ██▄ \n █▀████▀████▀▀█ "], ["sleep_1", " \n ▄▀ ▄▄▄▄▄ ▀▄ \n ██▀███▀▀███ \n█▄ █ ▀ █ ▄█\n██ █▀▀ ▀▀▄██ ██\n ▀███▄▄▄▄███▄█▀ \n ▄▀█▀ ▀ ▄▀ █▄ \n █▀▄██▄███▄▄▀▀█ "], ["sleep_2", " \n ▄ ▄ \n █▄▄█████▄▄█ \n▄ ▀█ ▀█▀ ▀█▀ ▄\n██ █▄▄ ▄▄ █▄ ██\n▀█▄█▄ ▄██▀▄█▀\n ▀███▀█▀▀█▀█▀ \n ▄█▄█▄▄▄▄█▄▄██▄ "], ["walk_1", " ▄▀ ▄▄▄▄▄ ▀▄ \n ██▀███▀▀███ \n█▄ ██▄▀ ▄█ █ ▄█\n██ █ ▀ ▀ ▄██ ██\n ▀███▄▄▄▄███▄█▀ \n ▄▀█▀ ▀ ▄▀ █▄ \n ██▄██▄███▄▄███ \n ▀ ▄██▀ ▀██▄ ▀ "], ["walk_2", " ▄ ▄ \n █▄▄█████▄▄█ \n▄ ▀█▄▀█▀ ▄▀█▀ ▄\n██ █▀█ █▀ █▄ ██\n▀█▄█▄ ▄██▀▄█▀\n ▀███▀█▀▀█▀█▀ \n ▄█ █▄ ▄▄█ ██▄ \n █▀████▀████▀▀█ "]]], + ["dorimon", [["angry", " \n \n ▄▄ ▄▄▄ \n ▄████████▄ \n █████▀▄████ ▄ \n █▀ ▀ ▀▀█████ \n ▀▄▀▀▀ ▄████ \n ██▀▀▀██▀ "], ["attack", " \n ▄█▄███▄ \n ▄█▀█▀█▀▄██▄ \n █▄▄▄▄▄▀█████ ▄\n ▀ ▀ ▀▄▀████ \n ▄ ▄ █ ███ \n █▀▀▀▀▀▀▀▄█▀ \n ▀██▀▀▀██ "], ["eat_1", " \n ▄█▄███▄ \n ▄████▀▄▀██▄ \n █▀ ▀ ▀▀▀████ ▄ \n ▀█▀█▀▀▄ ████ \n ▄ ▄ █ ███ \n █▀▀▀▀▀ ▄█▀ \n ██▀▀▀██ "], ["eat_2", " \n \n ▄ ▄▄▄ \n ▄███▀███▄ \n ██▀█▄█▄████ ▄ \n █ ▄ ▄ ▀█████ \n ▀█ ▀ ▀▄████ \n ██▀▀▀██▀ "], ["happy", " \n \n \n ██▄▄▄██ \n ▄█▀█████▀█▄ \n █▄█▄▀ ▀▄█▄█▄▀ \n ███ ▀ ███▀ \n ▀██▀▀▀██▀ "], ["injured_1", " \n \n \n \n ▄██▄▄███▄ \n █▀ ██ ▀▀███▄ \n ██▀ ▀▀█████▄ \n ▀▄▄██▄▄▄███▀ "], ["injured_2", " \n \n \n \n █▄▄▄▄██ \n ▄█▀██▀████▄ \n █▄▄▀▀▄▄▄████▄ \n ▀█▄▄▄▄▄████▀ "], ["sleep_1", " \n \n \n \n █▄▄▄▄██ \n ▄█████████▄ \n █▄▄▀▀▄▄▄████▄ \n ▀█▄▄▄▄▄████▀ "], ["sleep_2", " \n \n \n ▄ ▄▄ \n ▄███████▄ \n █▀▀██▀▀▀███ \n ██▀ ▀▀█████▄ \n ▀█▄▄▄▄▄████▀ "], ["walk_1", " \n \n \n ▄▄ ▄▄ \n ▄█▀███▀█▄ \n ███▄▀ ▀▄███▄▀ \n ███ ▀ ███▀ \n ▀██▀▀▀██▀ "], ["walk_2", " \n \n \n \n ██▄▄▄██ \n ▄██ █▀█ ██▄ ▄ \n ███▀ ▄ ▀████ \n ▀██▄▄▄▄▄██▀ "]]], + ["dorugamon", [["angry", " ▄▄▄▄▄▄▄▄▄ \n ▄▄█▀▀████▀▀█▄▄▄\n█▄ ▀██▀▄███▄█▀▄▀\n█▄▄▄▄███████▀▄██\n ▀▄▄▄██▄▄▄█▄▄█▀█\n ▄▀▀██ ▄▀▀███▀▄▀\n ▀▄█▀█▄█▄▄█▀▀█ \n █▄█▄▄█▀█▄█▄█▄█ "], ["attack", " ▄▄▄▄▄▄▄▄▄ \n▄▀▀█▀▀████▀▀█▀ \n█▀ ▀█▀▀████▄█▀█\n ▀██▄ ███████ █▄\n ▄▀▀▀ ██▀▀██ ███\n ▄████▀▀██████ █\n█▄▄█▀█▄ █ ████ \n█▄█▄▄█▀▀▀███▄█▄█"], ["eat_1", " ▄▄█▀▀████▀▀█▀ \n█▄ ▀██▀ ████ ▄▄▄\n▀▄▄▄▄▀███████▀▄▀\n ████ █▀▀██▀▄██\n ▄███▀▄████▄▄█▀█\n █▄▄▄█▀▄▀▀███▀▄▀\n ▀▄█▀█▄█▄▄█▀▀█ \n █▄█▄▄█▀█▄█▄█▄█ "], ["eat_2", " ▄███▄███▀ \n ▄▄█▀▀████▀ █ \n█▄ ▀██▀▄▀███▄█▀█\n█▄▄▄▄▀███████ █▄\n▀▄▄▄▄▄██▀▀█▀ ███\n ▄▀██▀▄▀▀███▀▄▀\n █▄▀█▄█▄▄█▀▀█ \n █▄█▄▄█▀█▄█▄█▄█ "], ["happy", " ▄▄▀████████▀ \n▄▀▀█▄█▀▄▀█▄▄▀▄▄▄\n█▀ ▄▀███████▀▄▀\n ▀▀▀█ ██████▀▄██\n █▀▀ ▄█▄▄▄█▄▄█▀█\n █████ ▄▀▀███▀▄▀\n ▀▄█▀█▄█▄▄█▀▀█ \n █▄█▄▄█▀█▄█▄█▄█ "], ["injured_1", " \n ▄▄███▄████▄▄ \n▄▀▀▄▄█▀███▄▄▀███\n█▀ ▀██▄▄████▀▄█\n▀▀██▄█████████▀█\n ▀▄▄▄███▄▄████▄▀\n █▄█▀█▄▄ ██▀▀█▄ \n █▄█▄▄█▀▀██▄▄█▄█"], ["injured_2", " \n \n ▄▄███▄███▄▄ \n▄▀▀▄▄█▀███▄▀███ \n█▀ ▀██▄▄████▄█ \n▀▀██▄████████▀█ \n▄█▄▄▄███▄▄▀▀█▄▀ \n█▄█▄▄█▀▀██▄▄█▄█ "], ["sleep_1", " \n \n ▄▄███▄████▄▄ \n▄▀▀▄▄▄████▄▄▀███\n█▀ ▀█▄▄▄████▀▄█\n █▀▀▀▄███▀████▀█\n█▀██▀█▄▄ ██▀▀██▀\n █▄█▄▄█▀▀██▄▄█▄█"], ["sleep_2", " \n ▄▄███▄████▄▄ \n▄▀▀▄▄▄████▄▄▀███\n█▀ ▀█▄▄▄████▀▄█\n▀▀██▄█████████▀█\n ▀▄▄▄███▄▄████▄▀\n █▄█▀█▄▄ ██▀▀█▄ \n █▄█▄▄█▀▀██▄▄█▄█"], ["walk_1", " ▄▄▄████████▀ \n▄▀▀█▄▄█▀██▄▄▀▄▄▄\n█▀ ▀█▄▄█████▀▄▀\n▀█▀▀▀███████▀▄██\n ▀▀███▄▄▄█▄▄█▀█\n ▄▀▀██ ▄▀▀███▀▄▀\n ▀▄█▀█▄█▄▄█▀▀█ \n █▄█▄▄█▀█▄█▄█▄█ "], ["walk_2", " ▄███▄███▀ \n ▄▄█▀▀████▀ █ \n█▄ ▀██▀ ████▄█▀█\n█▄▄▄ ▀███████ █▄\n ▄▀▀▀ ██▀▀█▀ ███\n ████▀▀██████ █\n █▄▄▀█▄█ ██▀ █ \n█▄█▄▄█▀▀▀███▄█▄█"]]], + ["dorugoramon", [["angry", " ▄▄▄▄▄▄ \n ▄▄▀▀▀ ▄▄▄█▀█ \n▄▀ ▄█ ▄▄▀ ▀▀▄\n▀▄ ▄▄▄▄▄▀▄▀▀▀▀▄▀\n █ ▄▄▄▄▀▀▄▄▄▀█ \n █ ▀▀▄ ▀█▄▀▀ ▀█ \n █▄▄▀█▀▀▀▄▄▄▀▄ \n █▄█▄▄▄▀▀█▄█▄█▄█"], ["attack", " ▄▄▄▀▀▀▀▀▀█▄▄ \n▄▀▀ ▄█ ▀▀██▄█ \n█ ▄▄▄▄▄ ▄▄█ ██\n ████████ ▄▀ ▄▀ \n█ ▀██▄▄█ ██▄▄▀ \n ▀▄█▄▄▄▄██ █ \n ▄█ ▀█▄▄▀▀▀▄ \n █▄█▄▄▄▀▄█▄█▄█ "], ["eat_1", " ▄▄▄▀▀▀▀▀█▄▄ \n ▄▀▀ ▄ ▀▀█▀▄█ \n█ ▀ ▀ ▄▀█▄▄▄ █\n ▀▄█████▀▄▀ ▄▄▀ \n▄▀▀████▀▄███▄ ▀▄\n▀▄▄█▄▄▄███ ▀▄▄▄▀\n ██ ▀█▄▄▀▀▀▄ \n █▄█▄▄▄▀▄█▄█▄█ "], ["eat_2", " ▄▄▄▄▄▄ \n ▄▄▀▀▀ ▄▄▄█▀█ \n▄▀ ▄▀▄ ▄▄▀ ▀▀▄\n▀▄ ▄▄▄▄▄▀▄▀▀▀▀▄▀\n █ ▄▄▄▄▀▀▄▄▄▀█ \n █ ▀▀▄ ▀█▄▀▀ ▀█ \n █▄▄▀█▀▀▀▄▄▄▀▄ \n █▄█▄▄▄▀▀█▄█▄█▄█"], ["happy", " ▄▄▄▀▀▀▀▀█▄▄ \n ▄▀▀ ▄ ▄▀▀█ █ \n█ ▀ ▀ ▄▀▄ █ █\n ▀▄█████▀▄▀ ▄█▀ \n ▄██▀▀▀ ▄███▀ \n█ ███▀▀██ ▀▄ \n ▀▀██ ▀█▄▄▀▀▀▄ \n █▄█▄▄▄▀▄█▄█▄█ "], ["injured_1", " ▄▄▄▄▄▄ \n ▄▄▀▀▀ ▄▄▄█▀█ \n▄▀ █▄ ▄▄▀ ▀▀▄\n▀▄ ▄▄▄▄▄▀▄▀▀▀▀▄▀\n █ ▄▄▄▄▀▀▄▄▄▀█ \n ▄▀█▀▄ ▀█▄█ ▀█▀ \n█ ▄▄█▀█▀▀▀█▄ █ \n █▄█▄▄▄█▀█▄███▄█"], ["injured_2", " \n ▄▄▄▀▀▀▀▀█▄▄ \n ▄▀▀ ▄ ▀▀█▀▄█ \n█ ▀▀ ▄▀█▄▄▄ █\n ▀▄▀▀▀▀▀▄█ ▄█ \n ▄█▄█▀▀█▄ █▀█▄█ \n▄▀▄▄█▀█▀▀▀█ ▀▄ \n██▄█▄▄▄█▀█▄█▄▄██"], ["sleep_1", " \n ▄▄▄▀▀▀▀▀█▄▄ \n ▄▀▀ ▀▀█▀▄█ \n█ ▀▀▀▄▀█▄▄▄ █\n ▀▄▀▀▀▀▀▄█ ▄█ \n ▄█▄█▀▀█▄ █▀█▄█ \n█ ▄▄█▀█▀▀█▀ █▄ \n▀█▄█▄▄▄█▀█▄▄██▄█"], ["sleep_2", " ▄▄▄▄▄▄ \n ▄▄▀▀▀ ▄▄▄█▀█ \n▄▀ ▄▄▄ ▄▄▀ ▀▀▄\n▀▄ ▄▄▄▄▄▀▄▀▀▀▀▄▀\n █ ▄▄▄▄▀▀▄▄▄▀█ \n ▄▀█▀▄ ▀█▄█ ▀█▀ \n█ ▄▄█▀█▀▀█ ▄█▄ \n █▄█▄▄▄█▀███▄█▄█"], ["walk_1", " ▄▄▄▀▀▀▀▀█▄▄ \n ▄▀▀ ▄▄▄ ▀▀█▀▄█ \n█ ▀▀ ▄▀█▄▄▄ █\n ▀▄▀▀▀▀▀▄█ ▄█ \n ▄▀▄█▀▀█▄ ██▀▄█ \n ▀▄ █▄▄██ ▄▀ \n ██ ▀█▄▄▀▀▀▄ \n █▄█▄▄▄▀▄█▄█▄█ "], ["walk_2", " ▄▄▄▄▄▄ \n ▄▄▀▀▀ ▄▄▄█▀█ \n▄▀ ▄█▀▀ ▄▄▀ ▀▀▄\n▀▄ ▄▄▄▄▄▀▄▀▀▀▀▄▀\n █ ▄▄▄▄▀▀▄▄▄▀█ \n █ ▀▀▄ ▀█▄▀▀ ▀█ \n █▄▄▀█▀▀▀▄▄▄▀▄ \n █▄█▄▄▄▀▀█▄█▄█▄█"]]], + ["dorugreymon", [["angry", " ▄▄ ▄▄ ▄▄ ▄███\n███ ███▄▀█▀▀▄██ \n████ ▄ ▀█████▀\n ██▀ ▀▀ ▀▄█████\n ▀▀█████ ▀▄███▀▄\n ██▀ ▄▀▄▄▀█▄▀\n ▄▀▄▄▄▀█▄ ▀▄▀█\n ███▄▄█ ████████"], ["attack", " ▄▄ ▄▄ ▄▄ \n███ ███▄▀█▀ ▄███\n████ ▄▄ ▀█▀▄██ \n ██▀ ▀▀ ▀▄████▀\n ▀▄▄▄▄▄ ▄▀▄█████\n █▄▄▄▀ ███▀▄\n ▄▀ ▀▄ █▄ ▀▄█\n███▄▄█▀▀▀███████"], ["eat_1", " ▄▄ ▄▄ ▄▄ \n███ ███▄▀█▀ ▄███\n████ ▄▄ ▀█▀▄██ \n ██▀ ▀▀ ▀▄████▀\n ▀▄▄▄▄▄ ▄▀▄█████\n █▄▄▄▀ ███▀▄\n ▄▀ ▀▄ █▄ ▀▄█\n███▄▄█▀▀▀███████"], ["eat_2", "▄██ ▄██ ▄██ ▄▄▄\n████▀▀▀▀ █▄▄▀██▀\n ██▀ ▄█▀ ▄▀▄███▄\n ▀▄▄▄▄ ▄▀████▄\n ███ █▄▀████▀\n ▄▀▀▀▄▀▄ ▄▄▀█▄█\n ▄▀▀▀▄▄█▄ ▀▄▀█\n ███▄▄█ ████████"], ["happy", "▄██ ▄██ ▄██ ▄███\n███▄▀▀▀▀ █▄▀▄██ \n▀███ ▄▀▄ ▄▀████▀\n █▀ ▄ ▄▀█████\n ▀█████ ▄▀███▀▄\n █▀▀▀▄▀ ▄▄ █▄▀\n ▄▀ ▀█▀▄▄█ ▀█ █\n███▄▄█ ███████"], ["injured_1", " \n▄██ ▄██ ▄██ \n███▄▀▀▀▀ █▄▄▀███\n▀███ ▀▄▄ ▄▀▄███ \n █▀ ▄▀█████\n ▀█▀▀▀▄▀▄▀██▄▄▀\n ▄▀ █▀▀ █▄ ▀▄█\n███▄▄█▄▄▄███████"], ["injured_2", " \n \n ▄▄ ▄██ ▄██ ▄▄▄\n▄██▄▀▀▀▀ █▄▄███▀\n▀███ ▀▄▄ ▄▀████▄\n █▀ ▄▀████▀\n ▄▀█▀▀▀▄▀█▄ ▀▄█\n███▄███▄▄███████"], ["refuse", "▄██ ▄██ ▄██ ▄███\n███▄▀▀▀▀ █▄▀▄██ \n▀███ ▄█▀ ▄▀████▀\n █▀ ▄▀█████\n ▀█▀▀▀▄▀ ▀███▀▄\n █▀▀ ▄ ▄▄▀█▄▀\n ▄▀ ▀▄▄█▄ ▀▄▀█\n ███▄▄█ ████████"], ["sleep_1", " ▄▄▄\n▄██ ▄██ ▄██ ▀██▀\n███▄▀▀▀▀ █▄▄███▄\n▀███ ▄▄▄ ▄▀▄███▄\n █▀ ▄▀█████\n ▀█▀▀▀▄▀▄▀████▀\n ▄▀ █▀▀ █▄ ▀▄█\n███▄▄█▄▄▄███████"], ["sleep_2", " ▄▄▄\n▄██ ▄██ ▄██ ▀██▀\n███▄▀▀▀▀ █▄▄███▄\n▀███ ▄▄▄ ▄▀▄███▄\n █▀ ▄▀█████\n ▀█▀▀▀▄▀▄▀████▀\n ▄▀ █▀▀ █▄ ▀▄█\n███▄▄█▄▄▄███████"], ["walk_1", "▄██ ▄██ ▄██ ▄███\n███▄▀▀▀▀ █▄▀▄██ \n▀███ ▄█▀ ▄▀████▀\n █▀ ▄▀█████\n ▀█▀▀▀▄▀ ▀███▀▄\n █▀▀ ▄ ▄▄▀█▄▀\n ▄▀ ▀▄▄█▄ ▀▄▀█\n ███▄▄█ ████████"], ["walk_2", " ▄▄ ▄▄ ▄▄ \n███ ███▄▀█▀ ▄███\n████ ▄▄ ▀█▀▄██ \n ██▀ ▀▀ ▀▄████▀\n ▀▄▄▄▄▄ ▄▀▄█████\n █▄▄▄▀ ███▀▄\n ▄▀ ▀▄ █▄ ▀▄█\n███▄▄█▀▀▀███████"]]], + ["doruguremon", [["angry", " ▄▄ ▄▄ ▄███\n▄██ ███▄▀█▀▄▄██ \n████ ▄ ▀█████▀\n▀██▀ ▀ ▀██████\n ▀▄▄▄▄▄▄▄▀▄███▀▄\n ▀▄▄▄▀▄▀▄▄▀█▄▀\n ▄▀ ▀▄▄█▄ ▀▄▀█\n ███▄▄█ ████████"], ["attack", "▄██ ▄██ ▄██ ▄▄▄\n████▀▀▀▀ █▄▄▀██▀\n ██▀ ▄█▀ ▄▀▄███▄\n ▀▄▄▄▄ ▄▀████▄\n ████ █▄▀████▀\n ▄▀▀▀▄▀▄ ▄▄▀█▄█\n ▄▀▀▀▄▄█▄ ▀▄▀█\n ███▄▄█ ████████"], ["eat_1", "▄██ ▄██ ▄██ ▄▄▄\n████▀▀▀▀ █▄▄▀██▀\n ██▀ ▄█▀ ▄▀▄███▄\n ▀▄▄▄▄ ▄▀████▄\n ███ █▄▀████▀\n ▄▀▀▀▄▀▄ ▄▄▀█▄█\n ▄▀▀▀▄▄█▄ ▀▄▀█\n ███▄▄█ ████████"], ["eat_2", " ▄▄ ▄▄ ▄▄\n▄██ ███▄▀██▄▀██▀\n████ ▄ ▀▄▄███▄\n▀██▀ ▀ ▀ ▀▄████▄\n ▀▄▄▄▄▄ ▄▀ ████▀\n ▀▄▄▄▀▄ ▀▄▀██▄\n ▄▀ ▀▄▄█▄ ▀▄ █\n ███▄▄█ ████████"], ["happy", "▄██ ▄██ ▄██ ▄███\n███▄▀▀▀▀ █▄▀▄██ \n▀███ ▄▀▄ ▄█████▀\n █▀ ▄ ▄██████\n ▀█████ ▄▀███▀▄\n █▀▀▀▄▀ ▄▄▀█▄▀\n ▄▀ ▀█▀▄▄█ ▀█ █\n███▄▄█ ███████"], ["injured_1", " \n▄██ ▄██ ▄██ \n███▄▀▀▀▀ █▄▄▀███\n▀███ ▀▄▄ ▄▀▄███ \n █▀ ▄▀█████\n ▀█▀▀▀▄▀▄▀████▀\n ▄▀ █▀▀ █▄ ▀▄█\n███▄▄█▄▄▄███████"], ["injured_2", " \n \n ▄▄ ▄██ ▄██ ▄▄▄\n▄██▄▀▀▀▀ █▄▄███▀\n▀███ ▀▄▄ ▄▀████▄\n █▀ ▄▀████▀\n ▄▀█▀▀▀▄▀█▄ ▀▄█\n███▄███▄▄███████"], ["sleep_1", " \n ▄▄ ▄▄ ▄▄ ▄███\n███ ███▄▀█▀ ▄██▀\n████ ▀█▀███▄\n ██▀ ▀▀▀ ▀▄████▄\n ▀▄▄▄▄▄ ▄▀▄████▀\n ▄▀▀▄▄▄▀ █▄ ▀▄█\n███▄▄█▄▄▄███████"], ["sleep_2", " ▄▄▄\n▄██ ▄██ ▄██ ▀███\n███▄▀▀▀▀ █▄▄███ \n▀███ ▄▄▄ ▄▀▄███▀\n █▀ ▄▀█████\n ▀█▀▀▀▄▀▄▀████▀\n ▄▀ █▀▀ █▄ ▀▄█\n███▄▄█▄▄▄███████"], ["walk_1", "▄██ ▄██ ▄██ ▄███\n███▄▀▀▀▀ █▄▀▄██ \n▀███ ▄█▀ ▄▀████▀\n █▀ ▄▀█████\n ▀█▀▀▀▄▀▄▀███▀▄\n █▀▀ ▄ ▄▄▀█▄▀\n ▄▀ ▀▄▄█▄ ▀▄▀█\n ███▄▄█ ████████"], ["walk_2", " ▄▄ ▄▄ ▄▄ \n███ ███▄▀█▀ ▄███\n████ ▄▄ ▀█▀▄██ \n ██▀ ▀▀ ▀▄████▀\n ▀▄▄▄▄▄ ▄▀██████\n █▄▄▄▀ █ ███▀▄\n ▄▀ ▀▄ █▄ ▀▄█\n███▄▄█▀▀▀███████"]]], + ["dorumon", [["angry", " ▄▄▄▄ ▄▄▄▄ \n ▄▄██▀▀▀▀▀ ▀█▀ \n █▄ ▄▀ ▀▀▄▄▄\n █▄▄▄▄ ▀▄ █\n ▀▄▄▄▄▄▄█▀██ █\n █ ▄█ █ ▄▀▄ ▄▀\n ▄█▀ ▀▄██ ▀█ \n ███▄▄▄▀███▄███ "], ["attack", " ▄▄▄▄███▀▄▄▄ \n█▀ ▄▄ ▀██ \n█████▄▀▀ ▀█▀ \n ██▀▀▀█ ▀▄▄▀█\n █▀▀▀▀ █▄▀██ █\n ▄▀▀▀█▀▀▄▀▀ █▄ █\n █▄█▀▀▄ ▀▄▄█ ▀█ \n███▄▄▄▀▀▀███▄███"], ["eat_1", " ▄▄████▄▀███ \n ▄▀▀▀▀ ▄ ▄▄▀ \n █▀ ▀▀ ▄▀▄▄\n ▀▀█████ ▄▄▀ █\n ▄▀▀▀▀ ▄▄▀██ █\n █▀██▀█ ▄▀▄ ▄▀\n ▄█▀ ▀▄██ ▀█ \n ███▄▄▄▀███▄███ "], ["eat_2", " ▄▄▄▄ ▄▄▄▄ \n ▄▄██▀▀▀▀▀ ▀█▀ \n █▄ ▄▀▄ ▀▀▄ \n █▄▄▄▄▄ ▀▄▀█\n ▀▄▄▄▄▄▄▀▄██ █\n ▄▀▀█ ▄▀▀ █▀ █\n █▄█▀▄▀▄▄▀ █▄▀ \n ███▄▄▄▀███▄███ "], ["happy", " ▄▄████▄▀███ \n ▄▀▀▀▀ ▄ ▄▄█▄ \n █▀ ▀ ▀ █ █\n ▀▀█████▀ ▄▀ ▄█\n █▀▀▀ ▄▀▄▄▀ █\n ██▀▀▀ █ ▄▀\n ▄█▀ ▀▄██ ▀█ \n ███▄▄▄▀███▄███ "], ["injured_1", " \n ▄▄████▄▀███ \n▄▀▀▀▀▄▄ ▄▄▀ ▄▄\n█▀ ▀▀ ▄█▀ █\n▀█▀▀▀ ▄ ▄▄█ █\n █▀▀█▀█▀▀▀█▄ ▄▀\n █▄▀▀▄▀▄▄▀ ▀█ \n ███▄▄▄▀███▄███ "], ["injured_2", " \n ▄▄▄▄ ▄▄▄▄ \n ▄▄██▀▀▀▀▀ ▀█▀▄▄\n█▄ ▀█▄ ▀▀▄▀ █\n█▄▄▄▄ ▀█ █\n ▀████▄▄█▄███ ▄▀\n █ ▄▀▄█ ▄▀ ▀█ \n ███▄▄▄▀▀███▄███"], ["sleep_1", " \n ▄▄▄▄ ▄▄▄▄ \n ▄▄██▀▀▀▀▀ ▀█▀▄\n █▄ ▄▄▄ ▀▀█▀█\n █▄▄▄▄ ▀▄ █\n▄▄▀▄▄▄▄▄▄█▄█▀▄▄█\n█▀▀█ ▀▄▀ █▀▀▀█\n█▄▄█▀▄▄█▄▄▀█▄▄▄█"], ["sleep_2", " \n ▄▄████▄▀███ \n ▄▀▀▀▀ ▄▄█▄▄\n █▀ ▀▀▀ ▄▀ █\n ▀█▀▀▀ ▄ ▄▄▀ █\n▄▄▀█▀▀█▀█▀▀██▄▄█\n█▀▀█ ▀▄▀ █▀▀▀█\n█▄▄█▀▄▄█▄▄▀█▄▄▄█"], ["walk_1", " ▄▄████▄▀███ \n ▄▀▀▀▀ ▄ ▄▄▀ \n █▀ ▀▀ ▄▀▄▄\n ▀█▀▀▀ ▄ ▄▄▀ █\n ███▀▀█▄▀██ █\n █ ▄█ █ ▄▀▄ ▄▀\n ▄█▀ ▀▄██ ▀█ \n ███▄▄▄▀███▄███ "], ["walk_2", " ▄▄▄▄ ▄▄▄▄ \n ▄▄██▀▀▀▀▀ ▀█▀ \n█▄ ▄█ ▀▀▄ \n█▄▄▄▄ ▀▄▄▀█\n ▀▄▄▄▄▄▄▀▄▀██ █\n ▄▀▀█ ▄▀▀ █▀▄ █\n ▄█▄▀▀▄▀▄▄█ ▀█ \n███▄▄▄▀▀▀███▄███"]]], + ["dracmon", [["angry", " ▄▄ \n ▄████████ \n █▀████▀███ \n █ ██ ███ \n █▀███▀▀▀▀██▀▀█ \n█ █ █▀▀▀▀█ █ █\n ▀▀ ███▀▀███ ▀▀ \n █▄▄█ █▄▄█ "], ["attack", " ▄▄▄▄▄▄██ \n ▄███▀█████ \n ███ █████ \n █▀▀████▀█████ \n █▄▄█▄▄████▀ \n ▄▀ ▄▄▄▄▄▄█▀ \n ▀▀▀▄▄█▄▄▄██ \n █▄▄▄▀ █▄▄█ "], ["eat_1", " ▄▄▄▄▄▄██ \n ▄█████████ \n █▄▄██▄▄███ \n █▄ ███ \n █ █▄▄▄███▄ \n ▀▄▀█▄▄▄▄▀█ ▀▄ \n ███▀▀███▄▄▀ \n █▄▄█ █▄▄█ "], ["eat_2", " ▄▄ \n ▄████████ \n █▀▀██▀▀███ \n ██▄██▄████ \n ▄███▀▀▀▀██▄▄ \n▄▀ █▀█▀▀▀▀█▀█ ▀▄\n▀▄▄▀███▀▀███▀▄▄▀\n █▄▄█ █▄▄█ "], ["happy", " ▄▄ \n▄▀▀▄▄████████▀▀▄\n▀▄ ██▀▀█▀▀███ ▄▀\n ██▄█▄█▄█▄███ \n ▀██▀▀▀▀██▀ \n █▀▀▀▀█ \n ███▀▀███ \n █▄▄█ █▄▄█ "], ["injured_1", " ▄▄ \n ▄████████ \n ██▀██▀████ \n █▄▄██▄▄███ \n ▀██▀▀▀▀██▀ \n ▄▀█▀▀▀▀█▀▄ \n ▄▀ ██████ ▀▄ \n █▄▄██▀▀██▄▄██ "], ["injured_2", " \n ▄▄▄▄▄▄██ \n ▄█████████ \n ██▀██▀████ \n █▄▄██▄▄███ \n ▀█▄▄▄▄█▀▄ \n ▄▀ █▄▄▄▄█ ▀▄ \n █▄▄██████▄▄██ "], ["sleep_1", " \n ▄▄▄▄▄▄██ \n ▄█████████ \n █▀▀██▀▀███ \n ██████████ \n ▀█▄▄▄▄██ \n ▄▀█▀ █▄▀ █▀▀▄ \n ▀▄█▄▄██▄▄█▄▄▀ "], ["sleep_2", " ▄▄ \n ▄████████ \n ██████████ \n █▄▄██▄▄███ \n ▀██▀▀▀▀██▀ \n █▀▀▀▀█ \n ▄▀█▀ ██▀ █▀▀▄ \n ▀▄█▄▄██▄▄█▄▄▀ "], ["walk_1", " ▄▄▄▄▄▄██ \n ▄▀████▀███ \n █ ██ ███ \n ▄▄██████████▄▄ \n▄▀ █▀▀▄▄▄▄██▄ ▀▄\n▀▄▄▀ █▄▄▄▄█ ▀▄▄▀\n ███▀▀███ \n █▄▄█ █▄▄█ "], ["walk_2", " ▄▄ \n ▄████████ \n █ ▀██▀ ███ \n █▄▄██▄▄███ \n ▄▄███▀▀▀▀██▄▄▄ \n▄▀▄▄▄█▀▀▀▀█▀▄ ▀▄\n▀▄█ ████████▀▄▄▀\n ▀▀▀▀▀▀▀▀▀▀▄█ "]]], + ["dracomon", [["angry", " ▄▄▀▀▀▀▄ ▄▄ \n▄▀▀▀▀ ▄▄█▀ █▀ ▀▄\n█▀█▀█▀▄ ▄▀▀▀█▀\n█ █ █ █ █▄ ▄█▄\n█▄█▄█▄█ ▄▀ ███\n▀▄▀▄▄▄▄▀ ▄██▀█\n ▀█▀▄ ▄▀ ▀▄▀▄\n █▄▄▄▀▀▄█▄█▄█▀▀"], ["attack", " ▄▄▄▄ ▄▄ \n ▄▀ ▀█▀ ▀▀█\n ▄█▀ ▄█▀ ▀█▀▀ \n█ ▀▀▀ ▀▀▄ █▄\n▀▄▄▀▀▀▀▄▀ ▀█▄███\n █▀█▀▀▄▀▀ █▀▀█\n ▄▀█▄ ▀▀█▀▀ █▄ \n █▄▄▄█▀▀▀▄█▄█▄██"], ["eat_1", " ▄▄▄▄ ▄▄ \n ▄▀ ▀█▀ ▀▀█\n ▄█▀ ▄█▀ ▀█▀▀ \n█ ▀▀▀ ▀▀▄ █▄\n▀▄▄▀▀▀▀▄▀ ▀█▄███\n █▀█▀▀▄▀▀ █▀▀█\n ▄▀█▄ ▀▀█▀▀ █▄ \n █▄▄▄█▀▀▀▄█▄█▄██"], ["eat_2", " ▄▄▀▀▀▀▄ ▄▄ \n▄▀▀▀▀ ▄▄▄ █▀ ▀█\n█▄▄▄▄▄ ▄ ▄▀▀█ \n▀██████▀ ▄▀▄██\n ▄█▀▀▀ ▄▀▀▄▀████\n █ ▀█▀▀▀▄▄▄▄▀▄ ▀\n ▀█▀▄ ▄▀▀ ▄ ▀█\n █▄▄▄▀▀▄█▄█▄█▀ "], ["happy", " ▄▄▀▀▀▀▄ ▄▄ \n▄▀▀▀▀ ▄▀▀▄ █▀ ▀█\n█▄▄▄▄▄ ▄ ▄███▄\n ██████▀ ▄▀ ▄██\n█ █▀▀▀ ▄▀ ▄█▀▀█\n ▀▄█▀▀▀ ▄▄▄▄█▀▄▄\n █▄ █ ▀ ▀ █▄▀\n █▄▄█▀▀█▄▄▄▀▀ "], ["injured_1", " ▄▄▄▄ \n ▄▀ ▀█▀█▄ \n ▄█▀ ▄▄▄ ▀▄▄█ \n█ ▀▀▄ \n▀▄▄▀▀▀▀ ▀█ ▄█▄\n ▀██▀▀ ▄ ▀███\n █▄█ ▄█▄▄█ ▀\n █▄█▄█▄▄█▄█▄█▄█ "], ["injured_2", " \n ▄▀▀▀▀▄▄▄▄ \n ▄█ ▀▄▀▀▄ \n▄▀▀ ▀▄▄ ▄▄▀▀▀ \n█ ▄▄▄▄ ▄▄▀ ▄ \n ▀█▄▄▄▄ ▄ ▀███\n █▄▄█ ▄▄█▄▄██\n █▄█▄█▄▄█▄█▄█▄█ "], ["refuse", " ▄▄▄▄ █▀▄▄▄\n ▄▀ ▀█▀ ▄▄▀\n ▄█▀ ▄█ ▀█ ▄ \n█ ▀▀ ▀▀▄██▄\n▀▄▀▀▀▀▀▄▀ ▀█████\n ▀██▀▀ █ █▀ █\n █▄█▄ █▄▄▀▀▄▀ \n █▄▄▄█▀▀▀▄█▄█▄█ "], ["sleep_1", " \n ▄▀▀▀▀▄▄▀█▄▄ \n ▄█ ▀▄▄▄▄▀ \n▄▀▀ ▄▄▀ ▄▄▀▄█▄\n█ ▄ ▄▄████\n ▀▄▄▄▄█▀ ▄▄█▄▄▀\n █▄▀█ █ ▀ ▀ █\n █▄▄▄█▄▄▄▄█▄▄▄██"], ["sleep_2", " \n ▄▀▀▀▀▄▄▀█▄▄ \n ▄█ ▀▄▄▄▄▀ \n▄▀▀ ▄▄▀ ▄▄▀▄█▄\n█ ▄ ▄▄████\n ▀▄▄▄▄█▀ ▄▄█▄▄▀\n █▄▀█ █ ▀ ▀ █\n █▄▄▄█▄▄▄▄█▄▄▄██"], ["walk_1", " ▄▀▀▀▀▄▄▄▀█▄▄\n ▄█ ▄▄ ▀▄▄▄▄▀\n▄▀▀ ▄██ ▄▄▀ ▄ \n█ ▄▄▄▄ ▄ ▄▄▀▄██\n ▀▀▄▄▄▄▀ ▀████\n ▄▀▄ ▄▀▀ ▄▀▄ ▀\n ▀▄▀▄ ▀█▀▀ ▄ ▀▄\n █▄▄▄▀▀▄█▄█▄█▀▀"], ["walk_2", " ▄▄▄▄ ▄▄ \n ▄▀ ▀█▀ ▀▀█\n ▄█▀ ▄█▀ ▀█▀▀ \n█ ▀▀▀ ▀▀▄ █▄\n▀▄▄▀▀▀▀▄▀ ▀█▄███\n █▀█▀▀▄▀▀ █▀▀█\n ▄▀█▄ ▀▀█▀▀ █▄ \n █▄▄▄█▀▀▀▄█▄█▄██"]]], + ["dracomon_x", [["angry", " ▄▄▄ ▄▄ \n ▄▀█▄ ▀█▀ ▄▀ \n▄▄█ ▀ ▄ █▀ \n█ ▀▀▀ ▄▀ \n ▀▄▄▀▀▀▀▄▄ ▀█▄▄ \n ▄▄█▀█▀▀ ▄ ▀ ▄▀▄\n ▀▄▄▀█ █▄▄▄▀ ▄▀\n █▄▄▄▄█▄▄▄█▄█▄▄█"], ["attack", " ▄▄▀▀▀▄▄▄▀▀▄ \n ▄▀▄▀▀▄▄ ▀▄▄▀ \n█▀▀ ▀▀ ▀█▄ \n▄█▄▄███▄ █ █ \n█▄▀███▄▄█ ▀ ▄▀ \n ▀▀▀▄▄▄ ▀▄▀▀█\n ▄▄▀▄ ▄ ▄▀ \n █▄▄▄▀▀▀█▄█▄▄█ "], ["eat_1", " ▄▄▀▀▀▄▄▄▀▀▄ \n ▄▀▄▀▀ ▀▄▄▀ \n█▀▀ ▀▀▀ ▀▄ \n▀▄ ▄▄▄▄▄ █▄ \n ▀███▀▀█ ▄▀▀█ \n ▄█▀▀▀▀▄▄▄ █ █\n █▄▄█▀█▀ ▀▄▄▀▄▀ \n █▄▄▄▀▀▀█▄█▄▄█ "], ["eat_2", " ▄▄▄ ▄▄ \n ▄▀█▄ ▀█▀ ▄▀ \n▄▄█ ▀ ▄▄ █▀ \n█ ▀ ▀ ▄▀ \n ▀▄▄▀▀▀▀▄▄ ▀█▄▄ \n ▄▄▀█▀▀▀ ▄ ▀ ▄▀▄\n ▀▄▄▄█ █▄▄▄▀ ▄▀\n █▄▄▄▄█▄▄▄█▄█▄▄█"], ["happy", " ▄▄▀▀▀▄▄▄▀▀▄ \n ▄▀▄▀▀ ▀▄▄▀ \n█▀▀ ▄▀▀▄ ▀▄ \n▀▄ ▄▄▄▄ ▄▀▀▄ \n ▄▀▀████▀▄▀ █▄ \n ▀▄█▄▄▄▄▀ █▄█ █\n ▄▄▀▄ ▄▀ ▄▀ \n █▄▄▄▀▀▀█▄█▄▄█ "], ["injured_1", " ▄▄▄ ▄▄ \n ▄▀█▄ ▀█▀ ▄▀ \n▄▄█ ▀ ▄ █▀ \n█ ▀▀ ▄▀ \n ▀▄▄▀▀▀▀▄▄ ▀█▄▄ \n █▀█▀▀ ▄ ▀ ▄▀▄\n █▄▀█ █▄▄▄▀▀▄▀\n █▄▄▄▄█▄▄▄█▄█▄▄█"], ["injured_2", " \n ▄▄▀▀▀▄▄▄▀▀▄ \n ▄▀▄▀▀ ▀▄▄▀ \n█▀▀ ▄▄▄ ▀▄ \n▀▄ ▄▄▄▄ █ \n ▀█▄▄▄▄▀▀ ▀█▄▄\n █▄▀█ ▄▀ ▄▀▀▄▀\n █▄▄▄▄█▄█▄█▄█▄▄█"], ["sleep_1", " \n ▄▄▀▀▀▄▄▄▀▀▄ \n ▄▀▄▀▀ ▀▄▄▀ \n█▀▀ ▄▄▄ ▀▄ \n▀▄ ▄▄▄▄ █▄ ▄▄\n ▀█▄▄▄▄▀▄ ▄▀ █\n █▀▀▄ ▀▄▀ ▄▀█▀▀▄\n ▀▄▄█▄▄█▄▄█▄▄▄▄█"], ["sleep_2", " ▄▄▄ ▄▄ \n ▄▀█▄ ▀█▀ ▄▀ \n▄▄█ ▀ █▀ \n█ ▀▀▀ ▄▀ \n ▀▄▄▀▀▀▀▄▄ ▄█▄▀▄\n █▀█▀▀ ▄ ▄▀▄▀\n █▀▀▄ ▀▄▀ ▄▀█▀▀▄\n ▀▄▄█▄▄█▄▄█▄▄▄▄█"], ["walk_1", " ▄▄▀▀▀▄▄▄▀▀▄ \n ▄▀▄▀▀ ▀▄▄▀ \n█▀▀ ▄██▀ ▀▄ \n▀▄ ▄▄▄▄ █▄ \n ▀█▄▄▄▄▀▀ ▄▀▀█ \n █▀▀▄█ ▄▀ ▄▀ █\n ▀▄▄▀▄ ▀▀█▀ ▄▀ \n █▄▄▄▀▀▀█▄▀▄▄█ "], ["walk_2", " ▄▄▄ ▄▄ \n ▄▀█▄ ▀█▀ ▄▀ \n▄▄█ ▀ ▄▄▄ █▀ \n█ ▀▀▀ ▄▀ \n ▀▄▄▀▀▀▀▄▄ ▀█▄▄ \n ▄▄█▀█▀▀ ▄ ▀ ▄▀▄\n ▀▄ ▀█ █▄▄▄▀ ▄▀\n █▄████▄▄▄█▄█▄▄█"]]], + ["dragomon", [["angry", " ▄██████▄ \n █▀████▀▀██ \n █▄▄██▄▄███▄ \n █▀▄▄▄ ██▀█▀█ \n▄▀▀▄▄▄▄▄▀█ ▀ ▀▄\n█ ▀█ ▀ █ █▀ ▄▀\n ▀█▀ ▀█▄ \n █▄▄▄██▀▀▀▄▄▄▄▄█"], ["attack", " ▄██████▄ \n █ ▀██▀ ▄██ \n ██▀▀▀█████▄ \n▄▀█ ███ █▀▀██▄ \n█ █ ███ █ ▀ █ \n▀▀▄█▄▄▄▀█▀▄▄▄▀ \n ▄▀▄ ▀ ▀▄▄ \n █▄▄▄██▀▀▀▄▄▄▄▄█"], ["eat_1", " ▄██████▄ \n ███▀▄▄▀███ \n ▄▀▄▄▀███████ \n █ ██ ████▀███▄ \n▄▀▄▀▀▄▀█ █ ▀ ▀▄\n█ █▀ ▄ ▄▀ █\n ▀█▀▄ ▀█▀ \n █▄▄▄█▀▀▀▄▄▄▄▄█ "], ["eat_2", " ▄██████▄ \n ████▀█████ \n ███▄██████▄ \n █ ▄ █████▀██▄ \n ▀▄▄▄▀ █ █ ▀ ▀▄\n █▀ █ ▄ ▄▀ █\n █▀▀▄ ▀█▀ \n █▄▄▄▄▀▀▀▄▄▄▄▄█ "], ["happy", " ▄███████▄ \n █▀▄▀██▀▄▀██ \n ██▀▀▀▀▀▀███ \n ██ ████ ████ \n▄▀▀█ █▄▄█ █▀ ▀▀▄\n█ ▀█▀▄▄▄▄█▀▄▀▀ █\n▀▄▄▀ ▀ ▀ ▀▄▄▄▀\n█▄▄▄▄▄█▀▀█▄▄▄▄▄█"], ["injured_1", " ▄▄▄▄▄▄ \n ▄████████▄ \n ██▀███▀███ \n █▄▄███▄▄███ \n █▀█▀▄▄▀███▀██ \n█ █▄▄▄▄█ ▀ ▀█ \n▀▄▀█ ▀ ▀ ▄▀▀▄█ \n█▄▄▄█▄▄▄▄█▄▄▄▄▄█"], ["injured_2", " \n ▄██████▄ \n ██████████ \n █████▀▀███▄ \n █▀▄▄▀██████▄ \n▄▀▀▄▄▄▄███▀ █ \n▀▄▀█ ▀ ▀ █▄▀▀▀█ \n█▄▄▄█▄▄▄█▄▄▄▄▄▄█"], ["sleep_1", " \n ▄██████▄ \n ██████████ \n █▄▄███▄▄██▄ \n ▄███ ▄ █████▄ \n▄▀ █▀▄▄▄█▀█ ▀█ \n▀▄▀▀▄▀ ▀ ▄▀▀▄█ \n█▄▄▄▄█▄▄▄█▄▄▄▄▄█"], ["sleep_2", " ▄▄▄▄▄▄ \n ▄████████▄ \n █▀▀███▀▀██ \n ███▀▀▀█████ \n █▀██ █ ███▀▀█ \n█ █▀▄▄▄█ ▀ ▀█ \n▀▄▀▀▄ ▀ ▀ ▄▀▀▄█ \n█▄▄▄▄█▄▄▄█▄▄▄▄▄█"], ["walk_1", " ▄███████▄ \n ▄▀█████▀███ \n ██▄███▄████ \n ██ ▄ ███▀█▀█ \n █▀▄▄▄█ █ ▀ ▀▀▄\n▄▀█ ▀ █ ▀ ▄▀ ▄▀\n▀▄▄▄▀ ▀█▄ \n ▀▄▄▄▄█▀▀▀▄▄▄▄▄█"], ["walk_2", " ▄███████▄ \n ▄█▀█████▀█▄ \n ███▄███▄███ \n ▄██▀█ ▄ █▀██▄ \n▄▀ ▀ █▄▄▄█ ▀ ▀▀▄\n▀▄ ▀▄ ▀ █ ▄▀ ▄▀\n █▀ ▀ ▀█ \n █▄▄▄▄▀▀▀▀▄▄▄▄█ "]]], + ["drimogemon", [["angry", " \n \n \n ▄▄▄██████▄ \n█▄▄▄▄ ▀▀▀▀██▄▄ \n █▀ ▄█▀ ▄███▄ \n▄▀▄▀▄▄▄▄ ▀▄█▀▄\n█▄▄█▄▄█▄█▄█▄█▄▄█"], ["attack", " \n█▀▀▀▄█████▄ \n ▀█▄▄▀ ▄▀███▄ \n █ ▄ ▀▀ ▄███▄ \n █████▄ ▀█▄ \n ███▀▀█▄ ▀█▄\n ▄▀██▄▄▀▀ ▀▄▄▀█\n █▄█▄▄█▄█▄█▄█▄▄█"], ["eat_1", "█▀▀▄▄▄▄▄▄▄ \n ▀▄▄▄▀▀▀▀███▄ \n █▄ ▄ ▀█▄ \n █▄▄█▄▄▄▄▄ █ \n ███▀▀▀██ █▄ \n▄▀█▀▄▀ ▄▀▀▀▄ █ \n█ █ █ █ ▄ ▄ █▀▄\n▀▄▀▄▄▄█▀▄▀▄▀▄█▄█"], ["eat_2", " \n \n▄▄▄▄ ▄▄▄▄▄▄ \n▀▄▄ ▀▀██████▄ \n ▄▀▀▀▀ ▄ ▀██▄ \n █ ▄ ▀ ▀ ▀▀██▄ \n▄▀█ ▀▄▄▀▀ ▀▄█▀▄\n█▄███▄█▄█▄█▄█▄▄█"], ["happy", "█▀▀▄▄▄▄▄▄▄ \n ▀▄▄▄▀▀▀▀███▄ \n █▄ ▄▀▄ ▀█▄ \n █▄▄█▄▄▄▄▄ █ \n ███▀▀▀██ █▄ \n▄▀█▀▄▀ ▄▀▀▀▄ █ \n█ █ █ █ ▄ ▄ █▀▄\n▀▄▀▄▄▄█▀▄▀▄▀▄█▄█"], ["injured_1", " \n \n▄▄▄▄ ▄▄▄▄▄▄ \n▀▄▄ ▀▀██████▄ \n ▄▀▀▀▀▄ ▀██▄ \n █ ▄ ▀▀ ▀▀██▄ \n▄▀▀▄███▀▀ ▀▄█▀▄\n█▄██▄▄█▄█▄█▄█▄▄█"], ["injured_2", " \n \n \n ▄▄▄██████▄ \n█▄▄▄▄ ▀▀▀▀██▄▄ \n █▀ █▄ ▄███▄ \n▄▀▄▀▄▄▄▄ ▀▄█▀▄\n█▄▄█▄▄█▄█▄█▄█▄▄█"], ["sleep_1", " \n \n \n ▄▄▄██████▄ \n█▄▄▄▄ ▀▀▀▀██▄▄ \n █▀ ▀▀ ▄███▄ \n▄▀▄▀▄▄▄▄▀ ▀▄█▀▄\n█▄▄█▄▄█▄█▄█▄█▄▄█"], ["sleep_2", " \n \n▄▄▄▄ ▄▄▄▄▄▄ \n▀▄▄ ▀▀██████▄ \n ▄▀▀▀▀ ▄▄ ▀██▄ \n █ ▄ ▄ ▀▀██▄ \n▄▀▀▄███▀ ▀▄█▀▄\n█▄██▄▄█▄█▄█▄█▄▄█"], ["walk_1", " \n \n█▀▀▀▄██████▄ \n ▀█▄▄▄▀▀▀▀▀██ \n █ ▄██ \n ▀▄▀▄▄ ▀██ \n▄▀▀▄▄▄▀▀ ▀▄▄▀▀█\n█▄█▄▄█▄█▄█▄█▄▄▄█"], ["walk_2", " \n▄▄▄▄ ▄▄▄▄▄ \n▀▄▄ ▀██████▄ \n ▄▀▀▀▀ ▄ ▀███ \n █ ▄ ▀▀▀██ \n █ ▀▀▄▄ ██ \n ▄▀▀▀ ▄▀ ▄▀▀█ \n █▄█▄█▄█▀█▄▄▄█ "]]], + ["duramon", [["angry", " █▀▄ ▄▄ \n ▀▄ ▀▄▀▀▀▀▄▀ \n ▄▀▀ ▄▄▀ █ \n █▄▄▄▄ ▄▄██▄▀█ \n ▀▄▄▄▄█▄█▀▄▄█ \n █ █▄▄██ ▄▀ █ \n █ ▄█▄▄█ ▄▀▄ █\n ▀█▄▄█ ▀██▄█ ▀▀ "], ["attack", " █▀▀▄ \n ▀▄ ▀▄ ▄▄ \n ▀▄ ▀▄▀▄▀▄ \n ▄▄▀▄ ▀▄▀▄▀▀█\n ▀▄▀▄▀▄ ▄█▄▀ █\n ▀▄▀▄█ ██ \n █▀▄█ █▄█\n █▄█▄▄▄▀▀▄█"], ["eat_1", "█▀▀▄▄ ▄▄▄▄▀█ \n ▀▀▄▄▀ ▄▄ ▀▄ \n █ ▀▀ █ \n █████ ▄▄██▄▀█ \n ▀▄▄▄▄█▄█▀▄▄█ \n ▄▀█▄▄█▀ ▄▀▀▄ \n █ ▄█▄█ ▄█▀▄ █\n ▀█▄▄█▀▀█▄▄█ ▀▀▀"], ["eat_2", "▄▄▄▄ ▄▄ \n▀▄▄▀▀▄▀▀▀▀▄▀ \n ▄▀▀ ▄▀▄ █ \n █▄▄▄▄ ▄▄██ ▄▄ \n ▀▄▄▄▄█▄██▀▀▄▀ \n ▄▀█▄▄▄█▀ ▀█▀▀▄\n▄▀ ▄█▄▄▀ ▄█▀▄▄█\n█▄█▄▄██▄▄█▄▄█ "], ["happy", " █▀▄ \n ▀▄▀▄▀▀▀▀█▀█ \n ▄▀▀ ▄▀▄ █ \n █▄▄▄▄ █ ▄▄ \n ███████▄█▀▀▄▀ \n ▄▀█▀▀▀▄▀ ▀█▀▄ \n ▄▀ █▀▀█▀ █ ▀▄\n █▄███▄█▄▄█▄█▄▄█"], ["injured_1", " ▄▄ \n █ ▀▄ ▄▄▄▄▀█ \n ▀▄▄▀▄ ▀▄ \n █ ▀▀ ▄█ ▄▄ \n █████▄▀██▀▀▄▀ \n ▄▀█▀▀██▀ ▀██ \n▄▀ █▀█▀ ▄▀ ▀█ \n█▄▄████▄▄█▄█▄▄█ "], ["injured_2", " \n █▀▄ ▄▄ \n ▀▄ ▀▄▀▀▀▀▄▀ \n █▀ ▄ █ \n █ ▀▀▄██▄▀█ \n ▀█████▄█▀▄▄█ \n▄▀▀ █▄▄▀▀ ▄▀▀▄ \n█▄▄▄█▄█▄▄▄█▄▄▄▄█"], ["sleep_1", " \n █▀▄ ▄▄ \n ▀▄ ▀▄▀▀▀▀▄▀ \n ▄▀▀ ▄▄▄ █ \n █▄▄▄▄ ▄▄██▄▀█ \n ▀▄▄▄▄█▄█▀▄▄█ \n ▄▀ █▄▄█▀ ▄▀▀▄ \n█▄▄██▄█▄▄▄█▄█▄█ "], ["sleep_2", " ▄▄ \n █ ▀▄ ▄▄▄▄▀█ \n ▀▄▄▀ ▀▄ \n █ ▀▀▀ ▄█ ▄▄ \n █▀▀▀▀▄▀██▀▀▄▀ \n ▄▀█▀▀██▀ ▀██ \n▄▀ █▀█▀ ▄▀ ▀█ \n█▄▄████▄▄█▄█▄▄█ "], ["walk_1", " █▀▄ ▄▄ \n ▀▄ ▀▄▀▀▀▀▄▀ \n ▄▀▀ ▄█▀ █ \n █▄▄▄▄ ▄▄██▄▀█ \n ▀▄▄▄▄█▄█▀▄▄█ \n ▄▀ █▄▄█▀ ▄▀ ▀▄\n█ ▄█▄█ ▄█▀▀▄▄█\n▀▀█▄▄█▀▀█▄▄█ "], ["walk_2", " ▄▄ \n █ ▀▄ ▄▄▄▄▀█ \n ▀▄▄▀ ▄▄ ▀▄ \n █ ▀▀ ▄█ ▄▄ \n █▀▀▀▀▄▀██▀▀▄▀ \n ██▀▀██▀ ▀█▀▄ \n ▄▀▄█▀█▀ ▄█▄ █\n ██▄▄██▄▄█▄▄█▀▀▀"]]], + ["durandamon", [["angry", "█▀▄ ▄█▀▀▀▄▀▄ \n▀▄ ▀▄▀▀ ▄█▄ ▀▄\n █▄▀ ▄█ ▄▀ █ \n█▄▄▄▄ █ █ \n ▀████ ▄▀ ▀▄ ▀▄\n █▄▄▄███▀█▀█▀▄█\n ▀▄▀███▄▀█ █ ▀\n ▀▄█ ▀▄█▀ "], ["attack", "▄▄ ▄▄▄▄ ▄ \n█ ▀▄ ▄█▀ ▄▀ ▀▄ \n █ ▄▀ ▄▄ ▀▀█ ▄▀\n▄▀▀ ▀▀ █ █ \n▀█▀▀ ▄█▀▄ ▀▄\n ██▀▀▀██▄▄▄█▀▄█\n █▄▀█▄█▄▀▄▀▄▀ ▀\n ▀▄█ ▀█▄▀ "], ["eat_1", "▄▄ ▄▄▄▄ ▄ \n█ ▀▄ ▄█▀ ▄▀ ▀▄ \n █ ▄▀ ▄▄ ▀▀█ ▄▀\n▄▀▀ ▀▀ █ █ \n▀█▀▀ ▄█▀▄ ▀▄\n ██▀▀▀██▄▄▄█▀▄█\n █▄▀█▄█▄▀▄▀▄▀ ▀\n ▀▄█ ▀█▄▀ "], ["eat_2", "█▀▄ ▄█▀▀▀▄▀▄ \n▀▄ ▀▄▀▀ ▄█▄ ▀▄\n █▄▀ ▄▀▄ ▄▀ █ \n█▄▄▄▄▄ █ █ \n ▀███▀ ▄▀ ▀▄▄ █\n █▄▄▄███▀█▀█ ▀█\n ▀▄▀▄▄█▄▀█ █ \n ▀▄█ ▀▄█▀ "], ["happy", "█▀▄ ▄█▀▀▀▄▀▄ \n▀▄ ▀▄▀▀ █ ▀▄\n █▄▀ ▄▀▄ █ █ █ \n█▄▄▄▄▄ ▄▀▄▀▄ █ \n ▀█▀▀▀ ▄█▀▀▀█▄ █\n ▄█▀▀████▄▀▀ ▀█\n ▀▄▀█▀▀▀▄▀▄ \n ▀▄█ ▀▄█ "], ["injured_1", " ▄▄▄▄ \n█▀▀▄ ▄█▀ ▄▀▀▄ \n █ ▄▀ ▀▀█ ▀▄\n▄▀▀ ▀▄▄ █ █ \n▀█▀▀ ▄█▀▄ █ \n ██▀▀▀██▄▄▄█▄ █\n █▄▀█▄█▀█▄▀▄▀ ▀█\n ▀▄█ ▀▄█▄▀ "], ["injured_2", " \n ▄▄▄ ▄█▀▀▀▄ \n ▀▄ ▀▄▀▀ ▄█▄▀▄ \n █▄▀ ▄ ▄▀ ▄▀\n █▄▄▄ ▀▀ ▄▀▄ █ \n ▀▄▄▄▄▄▄█▄▄▄█▀▄\n ▄▀█▄ ▄██▄▀▄▀▄█\n ▀▀▄█▀▀▄█▀▄▀ ▀"], ["refuse", "▄▄ ▄▄▄▄ ▄ \n█ ▀▄ ▄█▀ ▄▀ ▀▄ \n █ ▄▀ ▄ ▀▀█ ▄▀\n▄▀▀ ▀ ▀ █ █ \n▀█▀▀▀ ▄█▀▄ ▀▄\n ██▀▀▀██▄▄▄█▀▄█\n █▄▀█▄█▀█▄▀▄▀ ▀\n ▀▄█ ▀▄█▄▀ "], ["sleep_1", "▄▄ ▄▄▄▄ ▄ \n█ ▀▄ ▄█▀ ▄▀ ▀▄ \n █ ▄▀ ▀▀█ ▄▀\n▄▀▀ ▀▀▀ █ █ \n▀█▀▀ ▄█▀▄ ▀▄\n ██▀▀▀██▄▄▄█▀▄█\n █▄▀█▄█▀█▄▀▄▀ ▀\n ▀▄█ ▀▄█▄▀ "], ["sleep_2", "▄▄ ▄▄▄▄ ▄ \n█ ▀▄ ▄█▀ ▄▀ ▀▄ \n █ ▄▀ ▀▀█ ▄▀\n▄▀▀ ▀▀▀ █ █ \n▀█▀▀ ▄█▀▄ ▀▄\n ██▀▀▀██▄▄▄█▀▄█\n █▄▀█▄█▀█▄▀▄▀ ▀\n ▀▄█ ▀▄█▄▀ "], ["walk_1", "█▀▄ ▄█▀▀▀▄▀▄ \n▀▄ ▀▄▀▀ ▄█▄ ▀▄\n █▄▀ ▄█▀ ▄▀ █ \n█▄▄▄ ▄█ █ \n ▀▄▄▄▄▄▄█▀ ▀▄▄ █\n ▄▀█▄ ▄██▀█▀█ ▀█\n ▀▀▄▀█▀▄▀█ █ \n ▀▄█ ▀▄█▀ "], ["walk_2", "▄▄ ▄▄▄▄ ▄ \n█ ▀▄ ▄█▀ ▄▀ ▀▄ \n █ ▄▀ ▄▄ ▀▀█ ▄▀\n▄▀▀ ▀▀ █ █ \n▀█▀▀ ▄█▀▄ ▀▄\n ██▀▀▀██▄▄▄█▀▄█\n █▄▀█▄█▄▀▄▀▄▀ ▀\n ▀▄█ ▀█▄▀ "]]], + ["duskmon", [["angry", " ▄▄ \n ██▄█▀██▄▄██ \n ▀█▄███▄▄██▀ \n █▄ ▄█ █▀▄ \n ▀▄ ▄▀ ▀▄ \n ▄██▀██▀███▄▀ \n▄▀████▄▄███▀█▀▄ \n ▀▄████▀█████▀▀ "], ["attack", " ▄▄ ▄██▄ ▄▄ \n ██▀█▄█▀▀███ \n █▀▀▀▀█▀██▄ \n █▀ ▀▀ █▀ ▀▀▄ \n ▄█▄▄▄▄██▄▄▄▀▀▀\n █▀▀▄▀▀▄█████▀▄ \n ▀▄ ▀█████▀▀▀ \n ▄███▄▄█▀███▄ "], ["eat_1", " ▄▄ ▄██▄ ▄▄ \n ██▀█▄█▀▀███ \n █▀▀▀▀█▀██ \n █▀ ▀ ▀█ █ \n ██████ █▄ █ \n ██▄▀▀▀▀▄███ \n █▄▀██████▄▀▄█ \n ▄███▀ ▀███▄ "], ["eat_2", " ▄▄ \n ██▄█▀██▄▄██ \n ▀█▄███▄▄██▀ \n █▄ ▄ █▀▄ \n ▀▄▀ ▀ ▀█ ▀▄ \n ▄██▀██▀███▄▀ \n ▄▀███▄▄████▀▄ \n ▀█████▀█████▀ "], ["happy", " ▄▄ ▄██▄ ▄▄ \n ██▀█▄█▀▀███ \n █▀▀▀▀▀▀██ \n █▄ ▄▀▄ █ █ \n ▀▄▄▄▄ ▄█▄▄▀ \n ▄██▄▄▄▀███▄▀ \n ▀▄▀██▄▄███▄ \n ▄███▀ ▀████▄ "], ["injured_1", " \n ▄▄ ▄██▄ ▄▄ \n ██▀█▄█▀▀███ \n █▀▀▀▀▀▀██ \n █▄█ █▄ █ █ \n ▄█▄▄▄▄█▄▄ █ \n ▄██▄▀▀▄████ \n █▄████████▄██ "], ["injured_2", " \n ▄▄ \n ██▄█▀██▄▄██ \n ▀█▄███▄▄██▀ \n █ ▄ ▄ █▀▄ \n ▀█▀ ▀▀▄▀ ▀▄ \n ▄██▀██▀███▄█ \n █▄███▄▄██▄███ "], ["sleep_1", " \n ▄▄ \n ██▄█▀██▄▄██ \n ▀█▄███▄▄██▀ \n █▄ ▄▄ █▀▄ \n ▀▄ ▄▀ ▀▄ \n ▄██▀██▀███▄▀▄ \n █▄███▄▄███▄█▄█ "], ["sleep_2", " \n ▄▄ ▄██▄ ▄▄ \n ██▀█▄█▀▀███ \n █▀▀▀▀▀▀██ \n █▀ ▀▀ █ █ \n ▄█▄▄▄▄█▄▄ █ \n ▄▀██▄▀▀▄██▀█ █ \n ▀████████████▀ "], ["walk_1", " ▄▄ ▄██▄ ▄▄ \n ██▀█▄█▀▀███ \n █▀▀▀▀█▀██ \n █▀ ▀▀ █ █ \n ▄█▄▄▄▄█▄▄ █ \n ███▄▀▀▄████ \n █▄▀██████▄▀▄█ \n ▄███▀ ▀███▄ "], ["walk_2", " ▄▄ \n ██▄█▀██▄▄██ \n ▀█▄███▄▄██▀ \n █▄ ▄█ █▀▄ \n ▀▄ ▄▀ ▀▄ \n ▄██▀██▀███▄▀ \n ▄▀███▄▄████▀▄ \n ▀█████▀█████▀ "]]], + ["dynasmon", [["angry", " ▄▄ ▄▄ \n █ █▄█ █▀▀▀█ \n ▄▄▀▀ ▄▄▄▀ ▀▄ \n█▄▀█▀▀ ▀ ▄█▀▀▀▄\n▄▀▀██▄▄▀▄▀▄▄▄▄█▀\n▀█▄██▀▀████▀▀█ \n ▄▄▄▀█▄██████▄█ \n█▄█▄██▀▄▄█▄█▄█▄█"], ["attack", " ▄▄ ▄▄ \n █ █▄█ █▀▀▀█ \n ▄▀▀ ▄▄▄▀ ▀▄ \n▄▀▀█▀▀ ▀ ▄█▀▀▀▄\n▀█▄▄▀▄▄▀▄█ ▄▄▄█▀\n█▄ ███ █▄ ███ \n ███▀▀▄ ▀███▄█ \n█▄█▄██▀▄▄█▄█▄█▄█"], ["eat_1", " █▀▄ █▀▄▄▄▄▄ \n █▄▀▀▀ █ ▄▀ \n ▄█▄▄▄▀█▀ ▄▄█▄ \n█▄ ▀▄▄ ▄ ▄▀▀ ▄█\n▄▀▀█▄█▀ █▀ ███▀ \n▀█▄███ ▀█▄█▀█ \n ▄█▄ █▄ █▄▄█▄▀ \n █▄█▄██▀█▄█▄█▄█ "], ["eat_2", " █▀▄ █▀▄▄▄▄▄ \n █▄▀▀▀ █ ▄▀ \n ▄█▄▄▄▀█▀ ▄▄█▄ \n█▄ ▀▄▄ ▄ ▄▀▀ ▄█\n▄▀▀█▄█▀ █▀ ███▀ \n▀█▄███ ▀█▄█▀█ \n ▄█▄ █▄ █▄▄█▄▀ \n █▄█▄██▀█▄█▄█▄█ "], ["happy", " █▀▄ █▀▄▄▄▄▄ \n █▄▀▀▀ █ ▄▀ \n ▄█▄▄▄▀█▀ ▄▄█▄ \n█▄ ▀▄▄ ▄ ▄▀▀ ▄█\n▄▀▀█▄█▀ █▀ ███▀ \n▀█▄███ ▀█▄█▀█ \n ▄█▄ █▄ █▄▄█▄▀ \n █▄█▄██▀█▄█▄█▄█ "], ["injured_1", " █▀▄ █▀▄▄▄▄▄ \n █▄▀▀▀ █ ▄▀ \n ▄█▄▄▄▀█▀ ▄▄█▄ \n█▄ ▀▄▄ ▄ ▄▀▀ ▄█\n▄▀▀█▄█▀ █▀ ███▀ \n▀█▄███ ▀█▄█▀█ \n ▄█▄ █▄ █▄▄█▄▀ \n █▄█▄██▀█▄█▄█▄█ "], ["injured_2", " ▄▄ ▄▄ \n █ █▄█ █▀▀▀█ \n ▄▀▀ ▄▄▄▀ ▀▄ \n▄▀▀█▀▀▀▀ ▄█▀▀▀▄\n▀█▄▄▀▄▄▀▄█ ▄▄▄█▀\n ▄▀▀█ ██▀▀▄ \n ▄████▄ █████▄ \n█▄█▄█▄█▄▄█▄█▄█▄█"], ["refuse", " █▀▄ █▀▄▄▄▄▄ \n █▄▀▀▀ █ ▄▀ \n ▄█▄▄▄▀█▀ ▄▄█▄ \n█▄ ▀▄▄ ▄ ▄▀▀ ▄█\n▄▀▀█▄█▀ █▀ ███▀ \n▀█▄███ ▀█▄█▀█ \n ▄█▄ █▄ █▄▄█▄▀ \n █▄█▄██▀█▄█▄█▄█ "], ["sleep_1", " █▀▄ █▀▄▄▄▄▄ \n █▄▀▀▀ █ ▄▀ \n ▄█▄▄▄▀█▀ ▄▄█▄ \n█▄ ▀▄▄ ▄ ▄▀▀ ▄█\n▄▀▀█▄█▀ █▀ ███▀ \n▀█▄███ ▀█▄█▀█ \n ▄█▄ █▄ █▄▄█▄▀ \n █▄█▄██▀█▄█▄█▄█ "], ["sleep_2", " █▀▄ █▀▄▄▄▄▄ \n █▄▀▀▀ █ ▄▀ \n ▄█▄▄▄▀█▀ ▄▄█▄ \n█▄ ▀▄▄ ▄ ▄▀▀ ▄█\n▄▀▀█▄█▀ █▀ ███▀ \n▀█▄███ ▀█▄█▀█ \n ▄█▄ █▄ █▄▄█▄▀ \n █▄█▄██▀█▄█▄█▄█ "], ["walk_1", " █▀▄ █▀▄▄▄▄▄ \n █▄▀▀▀ █ ▄▀ \n ▄█▄▄▄▀█▀ ▄▄█▄ \n█▄ ▀▄▄ ▄ ▄▀▀ ▄█\n▄▀▀█▄█▀ █▀ ███▀ \n▀█▄███ ▀█▄█▀█ \n ▄█▄ █▄ █▄▄█▄▀ \n █▄█▄██▀█▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄ \n █ █▄█ █▀▀▀█ \n ▄▀▀ ▄▄▄▀ ▀▄ \n▄▀▀█▀▀ ▀ ▄█▀▀▀▄\n▀█▄▄▀▄▄▀▄█ ▄▄▄█▀\n█▄ ███ █▄ ███ \n ███▀▀▄ ▀███▄█ \n█▄█▄██▀▄▄█▄█▄█▄█"]]], + ["dynasmon_x", [["angry", "▄▄ ▄▄ \n█ ▀█▄▄█▄▀▀▄ ▄██\n █▀ ▄ ▀█▀▄██▀ \n █▄▄▄▀▀ ▄▀▀ ▄██▀\n █▄▄█▄█ ▄▄█▀ \n▄▀█ ▄ ██▀▀▄▀█▄ \n▀▄█▀▄▀███▄▄█▀███\n█▄█▄█▀▀▀█▄█▄█ "], ["attack", "█▀▄▄ █▀▄▄ ▄▄\n▀▄▄█▀▀▀▀▄▄█ ▄██▀\n █ ▄█ █▄▀▀█▄▄\n ▀▄▄▄▄ ▄▀ ██▀ \n ▄████▀█▄▄█▀█▄ \n█ ▀▄▄▄█ ▀▀█▀██▄\n ▀█▀▄▄█▀▀▀█ ▀▀\n █▄█▄█ █▄█▄█ "], ["eat_1", "█▀▄▄ █▀▄▄ ▄▄\n▀▄▄▀▀▀▀▀▄▄█ ▄██▀\n █ ▄▀▄ █▄▀▀█▄▄\n ▀███▄ ▄▀ ██▀ \n █▀▀▀▄█▄▄▀██▄ \n █ █▀█▀█ █▀███▄\n █▀▀▄█▀▀▀▄ ▀▀▀\n █▄█▄█▀█▄█▄█ "], ["eat_2", "▄▄ ▄▄ \n█ ▀█▄▄█▄▀▀▄ ▄██\n █▀ ▄ ▀█▀▄██▀ \n █▄▄▄▀ ▀▄▀▀ ▄██▀\n █▄▄█▄█ ▄▄█▀ \n▄▀█ ▄ ▄▀▀█ ███▄ \n▀▄█▀▄▀█▄▄█▀▄▀███\n█▄█▄█▀▀▀█▄█▄█ "], ["happy", "█▀▄▄ █▀▄▄ ▄▄\n▀▄▄▀▀▀█▀▄▄█ ▄██▀\n █ ▀ ▀ █▄▀▀█▄▄\n ▀████ ▄▀ ██▀ \n ▄▀▀▀▄▀▄▄███▄ \n ▄▀█▀█▄█ █▀███▄\n ▀▄▀█ █▀▀▀█ ▀▀▀\n █▄█▄█▀█▄█▄█ "], ["injured_1", " \n▄▄ ▄▄ \n█ ▀█▄▄█▄▀▀▄ ▄██\n █▀ ▄ ▀█▀▄██▀ \n █▄▄▄▀▀ ▄▀▀ ▄██▀\n █▄▄█▄█ ▄▄█▀ \n█▀▀▄ ▄ ▄▀█▀███▄ \n█▄▄██▄██▄▄▄█▀███"], ["injured_2", " \n▄ \n█▀▄▄ █▀▄▄ ▄▄\n▀▄▄█▀▀▀▀▄▄█ ▄██▀\n █ █▄ █▄▀▀█▄▄\n ▀█▀▀▄ ▄▀ ██▀ \n█▀▀▄▀█▀▄▀█▀███▄ \n█▄▄██▄██▄▄▄█▀███"], ["sleep_1", " \n▄▄ ▄▄ \n█ ▀█▄▄█▄▀▀▄ ▄██\n █▀ ▄▄ ▀█▀▄██▀ \n █▄▄▄ ▄▀▀ ▄██▀\n █▄▄█▄█▄▄▄▄█▀ \n▄▀▀▄▀▄█ ▄▀ ▀ ▀█▄\n█▄▄█▄▄███▄▄▄▄▄▀▀"], ["sleep_2", " \n█▀▄▄ █▀▄▄ ▄▄\n▀▄▄▀▀▀▀▀▄▄█ ▄██▀\n █ ▀▀ █▄▀▀█▄▄\n ▀█▀▀▄ ▄▀ ██▀ \n ▄▀▀▀▀█▄▄███▄ \n▄▀▀▄▀▄█ ▄▀ ▀ ▀█▄\n█▄▄█▄▄███▄▄▄▄▄▀▀"], ["walk_1", "█▀▄▄ █▀▄▄ ▄▄\n▀▄▄▀▀▀▀▀▄▄█ ▄██▀\n █ ▄█▀ █▄▀▀█▄▄\n ▀█▀▀▄ ▄▀ ██▀ \n ▄▄▀▀▀▀█▄▄▀██▄ \n█ █▄▀▄█ █▄▀███▄\n ▀█▀█ █▀▀▀▄ ▀▀▀\n █▄█▄█▀█▄█▄█ "], ["walk_2", "▄▄ ▄▄ \n█ ▀█▄▄█▄▀▀▄ ▄██\n █▀ ▄▄▀█▀▄██▀ \n █▄▄▄▀▀ ▄▀▀ ▄██▀\n █▄▄█▄█ ▄▄█▀ \n▄▀█ ▄ ▄▀▀█ ███▄ \n▀▄█▀▄▀█▄▄█▀▄▀███\n█▄█▄█▀▀▀█▄█▄█ "]]], + ["ebemon_x", [["angry", " ▄▄▄▄▄▄▄ \n ▄▀ ▄ ▄ ▀▄ \n ▀▄█ ▄█▀▄█ \n▄█ █▄▄▀▄█▄ █▄\n██ ▄▀████▀▄█ ██\n▀█▄▀▀▄ ▄▄▄ ▄▀▄█▀\n ▄▄▀█▀▀▀▀█▀▀▄▄ \n █▄▄▀▄▄▀▀▄▄▀▀▄▄█"], ["attack", " ▄▀█▀▀▀▀▄ \n █▄▀ ▄█▄ █ \n ▀▀▄▄█▀ █▀▀▄ \n █▀▀███ ██\n▀████ █▄▄█▀▄█ ██\n ▀▀█ ▄▄ ▄▀▀▀ \n ▄▀█▀█▀█▀▄ \n █▄█▄▄▀▄▄█▄█ "], ["eat_1", " ▄▀▀▀▀▀▀▄ \n ▄▀▄▀ ▄█▄ █ \n ▀▀█▄▄▀▀█ ▀▀ \n▄█ ▀▀▀███▄ █▄\n██ ▄▄▄██▀▄█ ██\n▀█▄▀█▄ ▄▄▄ ▄▀▄█▀\n ▄▄▀█▀█▀█▀▀▄ \n █▄▄▀▄▄▀▄▄▀▄▄█ "], ["eat_2", " ▄▄▄▄▄▄▄ \n ▄▀ ▄ ▄ ▀▄ \n ▄ ▀▄▀ ▄▄█▀▄█▄ \n██ ▀▄▄▀▄▀█▄ ██\n██ ▄▀████▀▄█ ██\n ▀▀▀▀▄ ▄▄▄ ▄▀▀▀ \n ▄▄▀█▀▀▀▀█▀▀▀▄ \n █▄▄▀▄▄▀▀▄▄▀▀▄▄█"], ["happy", " ▄▀▀▀▀▀▀▄ \n ▄▀▄▀ ▄█▄ █ █▄\n ▀█▄▄▀▄▀█▀▀ ██\n ▄ ████▀█▄ ▄█▀\n██ ▄█▄▄▄█▀▄██ \n██▄▀█▄ ▄▄▄ ▄▀ \n ▄▄▀█▀█▀█▀▀▄ \n █▄▄▀▄▄▀▄▄▀▄▄█ "], ["injured_1", " \n ▄▀▀▀▀▀▀▀▄ \n █ ▄▀ █▄ █ \n ▀▀▄ ▄█▄▀ \n ▄▀████▀▄█▄ \n▄▄█▀▄ ▄▄▄ ▄▀ █▄▄\n██ ▄▀█▀▀▀▀█▀▄ ██\n▀ █▄█▄▄▀▀▄▄▀▄█ ▀"], ["injured_2", " \n ▄▄▄▄▄▄▄ \n ▄▀ ▄ ▄ ▀▄ \n ▀▄█ ██▄▀ \n ▄▀█▄▄██ █▄ \n▄▄█▀▄ ▀▀▀ ▄▀ █▄▄\n██ ▄▀█▀▀▀▀█▀▄ ██\n▀ █▄█▄▄▀▀▄▄▀▄█ ▀"], ["sleep_1", " \n ▄▀▀▀▀▀▀▀▄ \n █ ▄▀ █▄ █ \n ▀▀█ ▄██▄▀ \n ██▄▄██▀▄ \n ▄▄█▀▄▀▀▀ ▄█▀█▄▄\n ██ ▄▀█▀█▀█▀▄ ██\n ▀ █▄█▄▄▀▄▄█▄█ ▀"], ["sleep_2", " ▄▄▄▄▄▄▄ \n ▄▀ ▄ ▄ ▀▄ \n █▄█ ▄█▀▄█ \n █▄▄▀▀█▄ \n ▄▀████▀▄█ \n ▄▄█▀▄ ▄▄▄ ▄▀█▄▄\n ██ ▄▀█▀█▀█▀▄ ██\n ▀ █▄█▄▄▀▄▄█▄█ ▀"], ["walk_1", " ▄▀▀▀▀▀▀▀▄ \n █ ▄▀ █▄ █ \n ▄ ▀█ ▄▀█ ▀▀▄ \n██ ███▄▄█▀▄ ██\n██ ▄█ ▀▀▀▀ ▀█ ██\n ▀▀ ▀▀▄███▄█ ▀▀ \n ▄▄▀▄ ▄ ▄ ▀▄ \n █▄▄▀▄▄▀▄▄▀▄▄█ "], ["walk_2", " ▄▄▄▄▄▄▄ \n ▄▀ ▄ ▄ ▀▄ \n▄█ ▀▄█ ▄█▀▄██▄\n██ █▄▄▀ █▄ ██\n▀█▄ ▄▀████▀▄█ █▀\n ▀▀▄ ▄▄▄ ▄▀▀ \n ▄▄▀█▀▀▀▀█▀▀▀▄ \n █▄▄▀▄▄▀▀▄▄▀▀▄▄█"]]], + ["ebidramon", [["angry", "▄▀ ▄▀▀ ▄▄▄▄▀▀▀█▀\n█ █ ▄██▀███▀▀█ \n ▀████▄███▀█▀ \n ▀█████▄█▄ \n ▄▀▀▀█▄▄ ▀▄ ▀▄\n █ ▄ █▀▄▄▄ ▀▄█ █\n ▀▄█▀ ▀▄▄▀ ▀▀ \n ▄██▀██▄ "], ["attack", " ▄▀▄▀▀▀▄▄▄▄█▀▀█▀\n█ █▄▄███▀▀██▀█ \n ▀▀▀▀▀█▄▄██▀█ █ \n ██▀▀▄▀ █\n ▄▄▄▄▄██▀▄▄ ▄▀█\n ▀▀█▄ █ █▄▀█\n ▀▄▄▄▀▄▄█▄▀ \n ▀▀██▄"], ["eat_1", " ▄▀▄▀▀▀▄▄▄▄▀▀▀█▀\n█ █▄▄██▀▀██▀▀█ \n ▀▀▀▀█▄███▀█▀ █ \n ▀███▀ ▄▀ █\n ▄██▀▄▄ ▄▀█\n ▀▀▀▀▀▄ █ █▄▀█\n █▀▀ ▄▀ ▀▄█▄\n ▀▀▀ ▄███▀▀"], ["eat_2", " ▄ ▄▄ ▄▄▄▄▄\n█ ▄▀ ▄▄████▄▄▄▀ \n█ █▄██▀▄▀██▄▄▀▄ \n ▀▀▀██████▄▀▄█▀▄\n ▀▀█▀▄ ▀▄▀█\n ▄▀▀ ▄▀▄▀ ▄█\n █▀▀ ▄▀ █▀ █\n ▀▀▀ ▄████▄"], ["happy", " ▄▀▄▀▀▀▄▄▄▀▀▀▀█▀\n█ █▄▄█▀▄▀██▀▀█▀▀\n ▀▀█▀▀▀████▀█▀▀ \n █ █████ █▄ \n ▄█▄▄█████▄▀▄█ \n ▀▄ ▀▀ █▀▄▀ \n █▀▀ ▄█▄▀ \n ▀▀▀███▀██▄▄ "], ["injured_1", " \n ▄ ▄▀▀ ▄▄▄▀▀▀▀█ \n█ █ ▄██████▀▀█ \n ▀████▄▀███▀█ ▀▄\n ▄▄▄█████▀█ ▄▀█\n▄▀ ▄▄██ █▀▄ ▄█\n█ █▄█▄ █ █▀▄▀\n ▀ ▀▄▄▄▄▀ ▄████▄"], ["injured_2", " \n ▄▄▄▄▄ \n ▄▀▄▀█▄███▄▄▄▄▀ \n▀▄█▄██▀████▄▄█ \n ▀▀▀██▄███▄▀ █▄\n ▄▀█████▀█▄▄▄▀▄█\n█ ▄█▄ █ ▀▄▀▄▀\n▀▄█▄▄▄▄▀ ▄████▄"], ["sleep_1", " ▀ \n▄▀ ▄▀ ▀ ▄▄▄▄▄\n█ █ ▄▄████▄▄▄▀ \n▀▄█▄███████▄▄▀▄ \n █▀▀▀▄▄██▄▀ █ █\n ▄▀▀▀███▀█▄ ▀ ▄█\n█ ▄ █▄ █ ▀█▀ █\n▀▄▀█▄▄▄▄▀▄▄████▄"], ["sleep_2", " \n▄▀▀▄▀▀ ▄▄▄▄▀▀▀█▀\n█ █ ▄██████▀▀█ \n ▀████▄▄██▀█▀▄▀▄\n █▄▄▄████▀ ▄▀ █\n▄▀ ▄▄██ █▀▄ ▄▀█\n█ █▄█▄ █ █ ▄▀\n ▀ ▀▄▄▄▄▀ ▄████▄"], ["walk_1", "▄▀ ▄▀▀ ▄▄▄▄▀▀▀█▀\n█ █ ▄██▀▀██▀▀█ \n ▀████▄▄██▀█▀ █ \n ▄▀▄▄█████▀ ▄▀ █\n█ ▄ ▄▀ █ █▄ ▄▀█\n▀▄█▀ ▄▀▀ ▄▀ █▄▀█\n █▀▀ ▄▀ ▄█▄▀ \n ▀▀▀ ▄██▀██▄"], ["walk_2", " ▄ ▄▄ \n █ ▄▀ ▄▄▄▄▀▀▀█▀\n █ █▄██▀▀██▀▀█ \n ▀▄███▄▄██▀█▀ █ \n ▀▄▄█████▀ █ █\n ▄▀ ▄█▄▀ █▄▀ ▄▀\n █▄█▄ ▄▀ ▄▀█ \n ▀▄▄▄▀ ▄██▀██▄"]]], + ["ebonwumon", [["angry", " ▄█████▄█████▄ \n █████████████ \n ▄██▀█▀█▀█▀▀ \n▄▀▀ ▄▀▄ █ \n█ ▀▀ █▀▄▄█▀█ ▄█\n ▀████ ▀█▄█████▀\n █▄▄▄▀▀▄ ▄ ▀▄ \n █▄▄▀▀▀▄▄█▀▀█▄▄█"], ["attack", " ▄▄▄▄▄ ▄▄▄▄▄ \n █████████████ \n ▀▀██████████▀ \n ▄ █ ▀ ▀ █ \n▄▄▀▀▀▀▄▄ ▄█▄ ▄\n█ ▀ █▄█▀█▄█▄██\n ██▄▄█▄██▀▀▀▀█▀ \n█▄▄████▄▄█▄█▄▄█▄"], ["eat_1", " ▄█████▄█████▄ \n █████████████ \n ▀█▀█▀█▀█▀▀ \n ▄█▄█ █ \n█▀ ▄ █▀▄▄█▀█ ▄█\n▀▄▀ ▀ ▄██▄█████▀\n █▀▀▀▀▀▄ ▄ ▀▄ \n █▄▄▀▀▀▄▄█▀▀█▄▄█"], ["eat_2", " ▄█████▄█████▄ \n █████████████ \n ▄▀█▀█▀█▀█▀▀ \n▄▄▀▀▀▀▄ █ \n█ ▀ ▀▄▄█▀█ ▄█\n ▀███▀ ▀█▄█████▀\n █▄▄▄▀▀▄ ▄ ▀▄ \n █▄▄▀▀▀▄▄█▀▀█▄▄█"], ["happy", " ▄█████▄█████▄ \n █████████████ \n ▄██▀█▀█▀█▀▀ \n▄▀▀▄ ▀▄ █ \n█ ▀ ▀ █▀▄▄█▀█ ▄█\n ▀████ ▀█▄█████▀\n █▄▄▄▀▀▄ ▄ ▀▄ \n █▄▄▀▀▀▄▄█▀▀█▄▄█"], ["injured_1", " ▄▄▄▄▄ ▄▄▄▄▄ \n █████████████ \n ▀▀██████████▀ \n ▄ █ ▀ ▀ █ \n▄▄▀█▀▀▄▄ ▄█▄ ▄\n█ ▀▀ █▄█▀█▄█▄██\n ██▄▄█▄██▀▀▀▀█▀ \n█▄▄████▄▄█▄█▄▄█▄"], ["injured_2", " ▄▄▄▄▄ ▄▄▄▄▄ \n █████████████ \n ▀▀██████████▀ \n █ ▀ ▀ █ \n ▄█▄█▄▄ ▄█▄ \n█▀ █▄ █▄█▀█▄██▄▀\n▀▄▄ ▄▀██▀▀▀▀▄ \n█▄▄████▄▄█▄█▄▄█ "], ["refuse", " ▄█████▄█████▄ \n █████████████ \n ▀█▀█▀█▀█▀▀ \n ▄█▄█ █ \n█▀ ▄ █▀▄▄█▀█ ▄█\n▀▄ ▀▀ ▄██▄█████▀\n █▀▀▀▀▀▄ ▄ ▀▄ \n █▄▄▀▀▀▄▄█▀▀█▄▄█"], ["sleep_1", " ▄▄▄▄▄ ▄▄▄▄▄ \n █████████████ \n ▀▀██████████▀ \n ▄ █ ▀ ▀ █ \n▄▄▀▀▀▀▄▄ ▄█▄ ▄\n█ ▀▀ █▄█▀█▄█▄██\n ██▄▄█▄██▀▀▀▀█▀ \n█▄▄████▄▄█▄█▄▄█▄"], ["sleep_2", " ▄▄▄▄▄ ▄▄▄▄▄ \n █████████████ \n ▀▀██████████▀ \n █ ▀ ▀ █ \n ▄█▄█▄▄ ▄█▄ ▄\n█▀ ▄▄ █▄█▀█▄█▄██\n▀▄▄ ▄▀██▀▀▀▀█▀ \n█▄▄████▄▄█▄█▄▄█▄"], ["walk_1", " ▄█████▄█████▄ \n █████████████ \n ▀█▀█▀█▀█▀▀ \n ▄█▄█ █ \n█▀ ▄ █▀▄▄█▀█ ▄█\n▀▄▄ ▄▀██▄█████▀\n ▄▀▀▀▀▀▄ ▄ ▀▄ \n █▄▄▀▀▀▄▄█▀▀█▄▄█"], ["walk_2", " ▄▄▄▄▄ ▄▄▄▄▄ \n █████████████ \n ▀▀██████████▀ \n ▄ █ ▀ ▀ █ \n▄▄▀▀▀▀▄▄ ▄█▄ ▄\n█ ▀ █▄█▀█▄█▄██\n ██▄▄█▄██▀▀▀▀█▀ \n█▄▄████▄▄█▄█▄▄█▄"]]], + ["egg", [["walk_1", " \n \n ▄█▀▀▀▄ \n ▄██▀ ███▄ \n ▄▀ ▄ ▀███▄ \n █ ██▄ ▀▀█ \n ▀▄▄ ▀▀ ▄██▄▀ \n ▀█▄▄▄██▀ "], ["walk_2", " \n \n \n ▄▄▀▀▀▀▄▄ \n ▄██▀ ███▄ \n ▄▀ ▄▄ ▀▀▀▄ \n █▄ ▀███ ▄▄ █ \n ▀█▄▄▄▄▄▄███▀ "]]], + ["elecmon", [["angry", " \n \n \n▀█▀▄▄ ▄▄▀█▄█ \n █▄▄▀█▀▄▄██ █▄█\n ▄▀▄ ▄▀ ▀▀███ █\n █ ▄▄▄ ▀▀▄\n██▄▄▄▄█▄▄▄██▄▄▄█"], ["attack", " █▄ ▄█ \n █▄█▄▄▀ █ ▄█ \n ▄█▄ ▄█▀▀▄▀ █ \n █▄▄▄▄▄▄ ▀▄█ ▄█\n ▀▄███▄█ ██ █\n ███▀▀█ ▀▄▀\n █▀▀▀▀▀▀▀ ▄ ▄ █\n█▄██▀▀█▄▄█▀█▄▄▄▀"], ["eat_1", " █▄ ▄█ \n █ █ █ █ ▄█ \n █▀▀▀▀ ▀▄▀ █ \n █▀▀ ▀▀ ▀▄█ ▄█\n ▀█▀████▄ ██ █\n █ ████ ▀▄▀\n █▀▀▀▀▀▀▀ ▄ ▄ █\n█▄██▀▀█▄▄█▀█▄▄▄▀"], ["eat_2", " \n \n \n▀█▀▄▄ ▄▄▀█▄█ \n █▄▄▀█▀▄▄██ █▄█\n ▄▀▄ ▄ ▀▀███ █\n █▀ ▀ ▀ ▀ ▀▀▄\n██▄▄▄▄█▄▄▄██▄▄▄█"], ["happy", " █▄ ▄█ \n ▀▄▀▄ ▄▀▄▀ ▄█ \n █▀▀▀▀ ▀▄▀ █ \n █▀▄ ▄▀▄ ▀▄█ ▄█\n ▀▄▄▄▄▄▄▄ ██ █\n ▄█ ███▀ ▀▄▀\n █▄▀▀▀▀ ▄ ▄ █\n█▄██▀▀█▄▄█▀█▄▄▄▀"], ["injured_1", " \n \n ▄ \n ▄▀▀▀▄▄▀▀▀▄▄▀█ ▄\n▀▀█▀▀ ▀ ▀█▄█▄█▀█\n █ ▄ ▄ ▀▀█▄▀\n █▀▀ ▀▀ ▄ ▄ ▀▄\n█▄██▀▀█▄▄█▀█▄▄▄▀"], ["injured_2", " \n \n \n ▄▄ ▄▄ ▄▄█ \n ▄▀▄▄▀█▀▄ ▀█ █▄█\n▀▄▀ █▄███ █\n █▄█ █▄ ▀▀▄\n██▄▄▄▄▄▄▄▄██▄▄▄█"], ["sleep_1", " \n \n \n▀█▀▄▄ ▄▄▀█▄█ \n █▄▄▀█▀▄▄██ █▄█\n ▄▀ ▀▀███ █\n █▄▄ ▄▄ ▀▀▄\n██▄▄▄▄▄▄▄▄██▄▄▄█"], ["sleep_2", " \n \n █▀▄ ▄▀█ ▄ \n █ ▀▄▄▀ █ ▄▀█ ▄\n ▄▀▀ ▀ ▀███▄█▀█\n █▄▄ ▄▄ ▀▀█▄▀\n █ ▄ ▄ ▀▄\n█▄██▀▀█▄▄█▀█▄▄▄▀"], ["walk_1", " \n \n █▀▄ ▄▀█ ▄ \n █ ▀▄▄▀ █ ▄▀█ ▄\n ▄▀▀ ▀ ▀███▄█▀█\n █ █ █ ▀▀█▄▀\n █ ▄ ▄ ▀▄\n█▄██▀▀█▄▄█▀█▄▄▄▀"], ["walk_2", " \n \n \n▀█▀▄▄ ▄▄▀█▄█ \n █▄▄▀█▀▄▄██ █▄█\n ▄▀▄ ▄ ▀▀███ █\n █ ▀ ▀ ▀▀▄\n██▄▄▄▄█▄▄▄██▄▄▄█"]]], + ["emperorgreymon", [["angry", " ▄▄ ▄ \n █ █▄▀▀▀▄█ █ \n █▀ ▄█ ▄▄▀ ▄ \n ▀▄▄▄▄▄▄ █▀██ █\n ▄▀▀▄▄▄██▀█ ▀▀▀█\n █▀█▀ ▀▄█▀▀██▀ \n ▄█▄█▀▀▀██▄▄█▄ \n█▄▄█▀█▄█▀▀█▄▄▄█ "], ["attack", " █▀▄ ▄▄▄ ▄▀▄ \n █▄▀▀ ▄▄▀▀ █ ▄ \n █ ▄▄█▄▀ █▀██ █\n ▄▀███▀█▄█ ▀▀▀█\n ▄▄█▄▄▄█▀ ██▀▀█ \n█ ██▄▄▄██▀██ █\n ▀███▄ ▄███▄█▀▀ \n █▄▄█▀▄▀▀█▄▄▄█ "], ["eat_1", " █▀▄ ▄▄▄ ▄▀▄ \n █▄▀▀ ▄▄▀▀ █ \n █ ▄▄█▄▀ ██▄▄▀▄\n ▄▀███▀█▄█ ██▄█\n ▀▄█▄▄▄█▀▄█▄▄▄▄▀\n █ █▄▄▄██ █▀ \n ▄██▄ ▄████▄ \n █▄▄█▀▄▀▀█▄▄▄█ "], ["eat_2", " ▄▄ ▄ \n █ █▄▀▀▀▄█ █ \n █▀ ▄▀▄ ▄▄▀ ▄ \n ▀▄▄▄▄▄▄ █▀██ █\n ▄▀▀▄▄▄██▀█ ▀▀▀█\n █▀█▀ ▀▄█▀▀██▀ \n ▄█▄█▀▀▀██▄▄█▄ \n█▄▄█▀█▄█▀▀█▄▄▄█ "], ["happy", " █▀▄ ▄▄▄ ▄▀▄ \n █▄▀▀ ▄ ▀▀ █ \n █ ▀ ▀ ██▄▄▀▄\n ▄▀███▀█▄█ ██▄█\n ▀▄█▄▄▄█▀▄█▄▄▄▄▀\n █ █▄▄▄██ █▀ \n ▄██▄ ▄████▄ \n █▄▄█▀▄▀▀█▄▄▄█ "], ["injured_1", " \n ▄▄ ▄ \n █ █▄▀▀▀▄█ █ \n █▀ █▄ ▄▄▀ ▄ \n ▀▄▄▄▄▄▄ █▀██ █\n ▄▀█▄▄▄██▀█▄▀▀▀█\n ▄▀▀██▄█▄██▀▀█▀ \n █▄▄█▄▄▄█▄█▄▄█ "], ["injured_2", " \n \n █▀▄ ▄▄▄ ▄▀▄ \n █▄▀▀ ▄ ▀▀ █ \n █ ▀▀ ██▄▄▀▄\n ▄█▀▀▀██▄█ ██▄█\n █▀▀██▀█▀▄█▀▄▄▄▀\n █▄▄█▄▄▄█▄█▄▄█ "], ["sleep_1", " \n \n █▀▄ ▄▄▄ ▄▀▄ \n █▄▀▀ ▀▀ █ \n █ ▀▀ ██▄▄▀▄\n ▄█▀▀▀▀█▄█ ██▄█\n ▀▄███▀█▀▄▀▀▄▄▄▀\n █▄▄█▄▄▄██▄▄██ "], ["sleep_2", " \n ▄▄ ▄ \n █ █▄▀▀▀▄█ █ \n █▀ ▄▄ ▄▄▀ ▄ \n ▀▄▄▄▄▄▄ █▀██ █\n ▄▀█▄▄▄██▀█▄▀▀▀█\n █▄██▄█▄█ ██▀ \n █▄▄█▄▄▄█▄██▄█ "], ["walk_1", " \n \n \n \n \n \n \n "], ["walk_2", " ▄▄ ▄ \n █ █▄▀▀▀▄█ █ \n █▀ ▄▀█ ▄▄▀ ▄ \n ▀▄▀▀▀▀▄ █▀██ █\n ▄▀▀▄▄▄██▀█ ▀▀▀█\n █▀█▀ ▀▄█▀▀██▀ \n ▄█▄█▀▀▀██▄▄█▄ \n█▄▄█▀█▄█▀▀█▄▄▄█ "]]], + ["entmon", [["angry", " \n ▄▄▀▀▀█ \n▄▄ ▄▀▀ ▄ ▀█ ▄▄██\n█▄▀ ▄█ ▀█ ████▀\n█ ▄ ▄▄▀ ▄▀███▀ \n▄█▄█▄▄▄▀███▀▀▀▄ \n▀▄▄▄▄▄██▀▄▀▀█▄▄█\n█▄██▄█▄█▀▀▀█▄█▄█"], ["attack", " ▄▄▀▀▀█ \n ▄▄ ▄▀▀ ▄ ▀█ ▄█\n █▄▀ ▄█ ▀█ ███\n █ ▄ ▄▄▀ ▄▀███ \n ████▀ ▀█▀▀▀▄ \n▄▀▀▀▀▀▀▀█▄█▀█▄▄█\n ▀▀█▀▀█▀▀█▄█▄ █▄\n █▄██▄█▄█ █▄█▄█"], ["eat_1", " ▄▄▄▄ \n ▄▄▀▀ ▄▄▀ ▄▄\n█▀▄▀ ▄ ▀▄▄▀▄████\n▀█▄▄▄ ▀ █▄███▀ \n █▀▀ ▄█▄███▄ \n█▀▀▀▀▀█▄█▀█▄▄ ▀▄\n ▀█▀▀█▀▀▄█▄▄▀██▀\n █▄██▄█▄█ █▄█▄█ "], ["eat_2", " \n ▄▄▀▀▀█ \n▄▄ ▄▀▀ ▄ ▀█ ▄▄██\n█▄▀ ▄▀▄ ▀█ ████▀\n█ ▄ ▄▄ ▄▀███▀ \n▄█▄█▄▄▄▀███▀▀▀▄ \n▀▄▄▄▄▄██▀▄▀▀█▄▄█\n█▄██▄█▄█▀▀▀█▄█▄█"], ["happy", " ▄▄▄▄ \n ▄▄▀▀ ▄▄▀ ▄▄\n█▀▄▀ ▄ ▀▄▄▀▄████\n█▀ ▀ ▀ █▄███▀ \n▀▄█▄██ ▄█▄███▄ \n█▀▀▀▀▀█▄█▀█▄▄ ▀▄\n ▀█▀▀█▀▀▄█▄▄▀██▀\n █▄██▄█▄█ █▄█▄█ "], ["injured_1", " \n ▄▄▄▄ \n ▄▄▀▀ ▄▄▀ ▄▄\n█▀▄▀▄ ▀▄▄▀▄████\n█▀ ▀▀▄ █▄███▀ \n▀▄▀▄▀▀ ▄█▄███▄ \n█▀▀▀▀▀█▄█▀█▄▄ ▀▄\n████████▄█▄▄████"], ["injured_2", " \n \n ▄▄▀▀▀█ \n▄▄ ▄▀▀ ▄ ▀█ ▄▄██\n█▄▀ █▄ ▀█ ████▀\n█ ▄ ▄▄▀ ▄▀███▀ \n▄█▄█▄▄▄▀███▀▀▀▄ \n█▄▄▄▄▄███▄███▄▄█"], ["sleep_1", " \n ▄▄▄▄ \n ▄▄▀▀ ▄▄▀ ▄▄\n█▀▄▀ ▀▄▄▀▄████\n█▀ ▀▀▄ █▄███▀ \n▀▄▀▄▀▀ ▄█▄███▄ \n█▀▀▀▀▀█▄█▀█▄▄ ▀▄\n▄███████▄█▄▄████"], ["sleep_2", " \n ▄▄▀▀▀█ \n▄▄ ▄▀▀ ▄ ▀█ ▄▄██\n█▄▀ ▄▄ ▀█ ████▀\n█ ▄ ▄▄▀ ▄▀███▀ \n▄█▄█▄▄▄▀███▀▀▀▄ \n▀▄▄▄▄▄██▀ ▀▀█▄▄█\n█▄██▄█▄█▄█▄█▄█▄█"], ["walk_1", " ▄▄▄▄ \n ▄▄▀▀ ▄▄▀ ▄▄\n█▀▄▀ ▄▄▀▄▄▀▄████\n█▀ ▀▀▄ █▄███▀ \n▀▄▀▄▀▀ ▄█▄███▄ \n█▀▀▀▀▀█▄█▀█▄▄ ▀▄\n ▀█▀▀█▀▀▄█▄▄▀██▀\n █▄██▄█▄█ █▄█▄█ "], ["walk_2", " \n ▄▄▀▀▀█ \n▄▄ ▄▀▀ ▄ ▀█ ▄▄██\n█▄▀ ▄█▀ ▀█ ████▀\n█ ▄ ▄▄ ▄▀███▀ \n▄█▄█▄▄▄▀███▀▀▀▄ \n▀▄▄▄▄▄██▀▄▀▀█▄▄█\n█▄██▄█▄█▀▀▀█▄█▄█"]]], + ["eosmon_adult", [["angry", " ██▄▄▄▄ ▄██▄ \n █▀▄▄▄▀██▀ \n ▄██▄▄█▄▄███▄▀▀█\n █ ███ █▄▀▄ ▄▀\n ▄▀▄▄▄▄▄█▀▄▄▀▄ \n ▀▄▀ ▀ ▀▄▀▄ █\n █▄█▄▄█ ▀▀▀\n ▀▄▀▀▄▀ "], ["attack", " ▄▄ ▄▄ \n ▀██▀▀▀▄███▀ \n ▄█▄▄▄▄▄██▄ ▄▄▄\n ▀▀█▄▀▀ ▄███▀ █\n ▀▄▀▀▀ ▄█ ▀▄▀ \n ▄▀█▀█▀▀█▀▄▀ ▀▄\n ▀▄▀ ▄ ▀▄▀▀▄▄█\n ██▀███ "], ["eat_1", " ▄▄ ▄▄ \n ▀██▀▀▀▀▄██▀ \n ▄█▀███▀██▄ ▄▄▄\n ▀▀▄█▄█▄█▄██▀ █\n ▀▄ ▄█ ▀▄▀ \n ▄▀█▀█▀▀█▀▄▀ ▀▄\n ▀▄█▄▄▄▄█▄▀▀▄▄█\n ▀▄▀▀▄▀ "], ["eat_2", " ██▄▄▄▄ ▄██▄ \n █▀ ▀██▀ \n ▄██▀██▀▀███▄▀▀█\n ██▄▄▄█▀█▀▄ ▄▀\n █▄▀▀▀▄██ ▄▀▄ \n █ █▀▀▀ █ █▄ █\n ▀▄▄█▄▄▄▀ ▀▀▀\n ▀▄▀▀▄▀ "], ["happy", " ██▄▄▄▄ ▄██▄ \n █▀▄▄▄▀██▀ \n ▄█▄█▄█▄█▄██▄▀▀█\n █ ███ ▄█▀▄ ▄▀\n ▄█▄▄▄▀█▀▄▄▀▄ \n █ █ ▀ ▀▄▀▄ █\n ▀▄▄█▄▄█ ▀▀▀\n ▀▄▀▀▄▀ "], ["injured_1", " \n ██▄▄▄▄ ▄██▄ \n █▀ ▀██▀ \n ▄███▀█▀████ ▄▄▄\n █▄▄█▄▄▀█▀▀ █\n ▄█▄▄▄▄██ ▀▄▀ \n █▄▀▀█▀▀█▄█▀ ▀▄\n █▄▄█▄▄▄█ ▀▄▄█"], ["injured_2", " \n ▄▄ ▄▄ \n ▀██▀▀▀▄███▀ \n ▄█▄▄▄▄▄██▄ ▄▄▄\n▀▀█▀ █ ▀███▄▀ █\n ▀█▀▀▀▀▄█ ▄ ▄▀ \n ██▀▀█▀▀█▄▄▀ ▀▄\n █▄▄█▄▄▄█ ▀▄▄█"], ["refuse", " ▄▄ ▄▄ \n ▀██▀▀▀▄███▀ \n ▄█▀█▄█▀██▄ ▄▄▄\n ▀▀█▄▄█▄▄███▀ █\n ▀▄▀▀▀ ▄█ ▀▄▀ \n ▄▀█▀█▀▀█▀▄▀ ▀▄\n ▀▄▀ ▄ ▀▄▀▀▄▄█\n ██▀███ "], ["sleep_1", " ▄▄ ▄▄ \n ▀██▀▀▀▄███▀ \n ▄█▄▄▄▄▄██▄ ▄▄▄\n ▀▀█▄▄█▄▄███▀ █\n █▄▀▀▀ ▄█ ▀▄▀ \n █ ██▀▀██ █▀ ▀▄\n ▀█▄▀█▄█▀ ▀▄▄█\n "], ["sleep_2", " \n ██▄▄▄▄ ▄██▄ \n █▀ ▀██▀ \n ▄██▀▀█▀▀███▄▀▀█\n █▀███▀▀█▀▄ ▄▀\n ▄▀█▄▄▄▄█▀▄▄▀▄ \n ▀▄▄▀▄▄▀▄▄█▄ █\n ▀▀ ▀▀▀ ▀▀▀"], ["walk_1", " ██▄▄▄▄ ▄██▄ \n █▀ ▀██▀ \n ▄██▀██▀▀███▄▀▀█\n █▀▄▄▄▀▀█▀▄ ▄▀\n ▄█▄▄▄▄██ ▄▀▄ \n █ █ ▀ █ █▄ █\n ▀▄▄█▄▄▄▀ ▀▀▀\n ▀▄▀▀▄▀ "], ["walk_2", " ▄▄ ▄▄ \n ▀██▀▀▀▄███▀ \n ▄█▄▄▄▄▄██▄ ▄▄▄\n ▀▀█▄▀▀ ▄███▀ █\n ▀▄▀▀▀ ▄█ ▀▄▀ \n ▄▀█▀█▀▀█▀▄▀ ▀▄\n ▀▄▀ ▄ ▀▄▀▀▄▄█\n ██▀███ "]]], + ["eosmon_perfect", [["angry", " ▄█▀▄█▀ ▄▀█▀\n ▄▀▀▀▀▄▄▀▀ ▄▀\n ██▄▄█▀█▄▄▄▀▀▀▀\n ▄███▄▄██▄▀▀▀█▀\n ▄▀▄▀▀▀▄█▀█▀▄ ▄▀\n ▀▄▀▀█▀▀▀▄▀█▄▀▀▀\n █▄█▀█▀▄▄█ ▀█ \n ▀▄█▄▀ ▀█▀ "], ["attack", " ▄▄ ▄▄ ▄▄▄\n ██▄█▀ ▄▄▀ ▀▄\n ▄█ ▄▄█▀ ▄▄█▄\n ▀▄▀▀ ▄██▀█▄▄▄▄\n █▄▀▀▀ ▄██▄ ▀▄\n █ █▀█▀▀█ █▄▀▄█▄\n █ ▄█▄▄ ▀▄▀▀▄ \n ▀▀▀▄█▄▀▀▀ ▀█▀ "], ["eat_1", " ▄▄ ▄▄ ▄▄▄\n ██▄█▀ ▄▄▀ ▀▄\n ▄█ ▄▄██ ▄▄█▄\n ▀██▀▄▀██▀█▄▄▄▄\n █▄▀▀▀▀▄██▄ ▀▄\n █ █▀█▀▀█ █▄▀▄█▄\n █ ▄█▄▄ ▀▄▀▀▄ \n ▀▀▀▄█▄▀▀▀ ▀█▀ "], ["eat_2", " ▄█▀▄█▀ ▄▀█▀\n ▄▀▀▀▀▄▄▀▀ ▄▀\n █▀▄▄▀▀█▄▄▄▀▀▀▀\n ▄█▄▄▄███▄▀▀▀█▀\n ▄▀█▀▀ ▄█▀█▀▄ ▄▀\n ▀▄▀▀█▀▀▀▄▀█▄▀▀▀\n █▄█▀█▀▄▄█ ▀█ \n ▀▄█▄▀ ▀█▀ "], ["happy", " ▄█▀▄█▀ ▄▀█▀\n ▄▀▀▀▀▄▄▀▀ ▄▀\n ██▄▄▀██▄▄▄▀▀▀▀\n ▄██▄█▄██▄▀▀▀█▀\n ▄▀▄▀▀▀▄█▀█▀▄ ▄▀\n ▀▄▀▀█▀▀▀▄▀█▄▀▀▀\n █▄█▀█▀▄▄█ ▀█ \n ▀▄█▄▀ ▀█▀ "], ["injured_1", " \n ▄▄ ▄▄ ▄▄▄\n ██▄█▀ ▄▄▀ ▀▄\n ▄█ ▄▄▄█▀ ▄▄█▄\n ▀███ ▀█▀▀█▄▄▄▄\n █▄▀▀▀▀▄██▄ ▀▄\n █ █▀█▀▀█ █ ▀▄█▄\n █▄█▄█▄▄█ ▀▀█▀ "], ["injured_2", " \n ▄▄▄ \n ▄█▀▄█▀ ▄▀ ▀▄ \n ▄▀▀▀▀▄▄▀ ▄▄█▄ \n ██▄█▀██▄▄▀▄▄▄▄ \n ▄▀██▄▄▀▄▄█ ▀▄ \n █▀▄ ▄ ▀█ █▀▄█▄ \n █▄█▄█▄▄█ "], ["refuse", " ▄▄ ▄▄ ▄▄▄\n ██▄█▀ ▄▄▀ ▀▄\n ▄█ ▄▄██ ▄▄█▄\n ▀███▀ ██▀█▄▄▄▄\n █▄▀▀▀▀▄██▄ ▀▄\n █ █▀█▀▀█ █▄▀▄█▄\n █ ▄█▄▄ ▀▄▀▀▄ \n ▀▀▀▄█▄▀▀▀ ▀█▀ "], ["sleep_1", " ▄▄ ▄▄ ▄▄▄\n ██▄█▀ ▄▄▀ ▀▄\n ▄█ ▄▄██ ▄▄█▄\n ▀███▀▀██▀█▄▄▄▄\n █▄▀▀▀▀▄██▄ ▀▄\n █ █▀█▀▀█ █▄▀▄█▄\n █ ▄█▄▄ ▀▄▀▀▄ \n ▀▀▀▄█▄▀▀▀ ▀█▀ "], ["sleep_2", " ▄▄▄\n ▄█▀▄█▀▄▄▀ ▀▄\n ▄▀▀▀▀▄▄▀ ▄▄█▄\n ██▄▄████▀█▄▄▄▄\n ▄▀██▄▄▀██▄ ▀▄\n █▀█▄▄▄▄█▀█▄▀▄█▄\n █ ▄█▄▄ ▀▄▀▀▄ \n ▀▀▀▄█▄▀▀▀ ▀█▀ "], ["walk_1", " ▄█▀▄█▀ ▄▀█▀\n ▄▀▀▀▀▄▄▀▀ ▄▀\n █▀▄▄▀▀█▄▄▄▀▀▀▀\n ▄▀▄▄▄▀▀█▄▀▀▀█▀\n ▄▀█▄▄▄▄█▀█▀▄ ▄▀\n ▀▄▀ █ ▀▄▀█▄▀▀▀\n █▄█▀█▀▄▄█ ▀█ \n ▀▄█▄▀ ▀█▀ "], ["walk_2", " ▄▄ ▄▄ ▄▄▄\n ██▄█▀ ▄▄▀ ▀▄\n ▄█ ▄▄█▀ ▄▄█▄\n ▀▄▀▀ ▄██▀█▄▄▄▄\n █▄▀▀▀ ▄██▄ ▀▄\n █ █▀█▀▀█ █▄▀▄█▄\n █ ▄█▄▄ ▀▄▀▀▄ \n ▀▀▀▄█▄▀▀▀ ▀█▀ "]]], + ["eosmon_ultimate", [["angry", " ▄ ▄▀▀▄▀▀█ ▄▄▄▄\n █ █ ▄▀▄▀█▀ █\n ██ ▀▀ ██ ▄▄▀▄\n ▀████ ▄▀▀█ ▄▄▀\n ▄█▄▄▄▄█▀▀██▄ \n █ ▄█▄▀███ ███ \n ▀▀█▀█▀█▀▀███▀▄\n ▀▄▀▄▀ ▀▀"], ["attack", " ▄▄ ▄▄▄ \n ▄▀▄▀ █ ▄█▄▀▀▀█\n █▄▀▄▄▀ █▄▀ ▄▀\n ▀█▄▄ ██▄▄▀▀ █\n ▀▄▄▄▀▄▄▄█▄▀▀ \n ▄▀▄ ▄▄▀ █▄██▄ \n ▀▄██▄█▄▄█████ \n ▀▄█▄█▄ ▀▀▀▄█"], ["eat_1", " ▄▄ ▄▄▄ \n ▄▀▄▀ █ ▄█▄▀▀▀█\n █▄▀ ▄▀▄█▄▀ ▄▀\n ▀█▄▄ ██▄▄▀▀ █\n ▀▄▄▄▀▄▄▄█▄▀▀ \n ▄▀▄ ▄▄▀ █▄██▄ \n ▀▄██▄█▄▄█████ \n ▀▄█▄█▄ ▀▀▀▄█"], ["eat_2", " ▄ ▄▀▀▄▀▀█ ▄▄▄▄\n █ █ ▄▀▄▀█▀ █\n ██ ▀▀ ██ ▄▄▀▄\n ▀███ ▄▀▀▀█ ▄▄▀\n █▄▄▄▀█▀█▀█▄ \n █ █▄▀█ █████ \n ▀█▀█▀█▀▀███▀▄\n ▀▄▀▄▀ ▀▀"], ["happy", " ▄ ▄▀▀▄▀▀█ ▄▄▄▄\n █ █ ▄▀▄▀█▀ █\n ██ ▀ ▀ █ ▄▄▀▄\n ▀███ ▄▀▀█ ▄▄▀\n ▄█▄▄▄▀█▀▀██▄ \n █ ▄█▄ ▄██ ███ \n ▀▀█▀█▀█▀▀███▀▄\n ▀▄▀▄▀ ▀▀"], ["injured_1", " \n \n ▄ ▄▀▀▄▀▀█▄▀▀▀█\n █ █ ▄▀▄▀█ ▄▀\n ██ ▀▄ ██ ▄▀▀ █\n ▀█▀ ▄▀▀▀█▄█▀ \n ▄▀█▀█▄▀▀█▄███▄\n ▀▄██▄█▄▄█▀██▄█"], ["injured_2", " \n \n ▄▄ ▄▄▄ ▄▄▄▄ \n▄▀▄▀ █ ▄█▀ █ \n█▄▀ ▄▀ █▄▀ ▄▄▀▄ \n▀█▄▄ ▀ ██ █ ▄▄▀ \n █▄▄▄█▄▀▀█████▄\n ▀▄██▄█▄▄█▀██▄█"], ["refuse", " ▄▄ ▄▄▄ \n ▄▀▄▀ █ ▄█▄▀▀▀█\n █▄▀ ▄█ █▄▀ ▄▀\n ▀█▄▄ ██▄▄▀▀ █\n ▀▄▄▄▀▄▄▄█▄▀▀ \n ▄▀▄ ▄▄▀ █▄██▄ \n ▀▄██▄█▄▄█████ \n ▀▄█▄█▄ ▀▀▀▄█"], ["sleep_1", " \n ▄▄ ▄▄▄ \n ▄▀▄▀ █ ▄█▄▀▀▀█\n █▄▀▄▄▀ █▄▀ ▄▀\n ▀█▄▄ ██▄▄▀▀ █\n ▀▄▄▄▀▄▄▄█▄█▀ \n ▄▀▄ ▄▄▀ █▄███▄\n ▀▄██▄█▄▄█▀██▄█"], ["sleep_2", " \n \n ▄ ▄▀▀▄▀▀█▄▀▀▀█\n █ █ ▄▀▄▀█ ▄▀\n ██ ▀▀ ██ ▄▀▀ █\n ▀█▀ ▄▀▀▀█▄█▀ \n ▄▀█▀█▄▀▀█▄███▄\n ▀▄██▄█▄▄█▀██▄█"], ["walk_1", " ▄ ▄▀▀▄▀▀█ ▄▄▄▄\n █ █ ▄▀▄▀█▀ █\n ██ ▀▀ ██ ▄▄▀▄\n ▀█▀ ▄▀▀▀█ ▄▄▀\n ▄▀▀▀ █▀█▀█▄ \n █ █▄▀█ █████ \n ▀█▀█▀█▀▀███▀▄\n ▀▄▀▄▀ ▀▀"], ["walk_2", " ▄▄ ▄▄▄ \n ▄▀▄▀ █ ▄█▄▀▀▀█\n █▄▀▄▄▀ █▄▀ ▄▀\n ▀█▄▄ ██▄▄▀▀ █\n ▀▄▄▄▀▄▄▄█▄▀▀ \n ▄▀▄ ▄▄▀ █▄██▄ \n ▀▄██▄█▄▄█████ \n ▀▄█▄█▄ ▀▀▀▄█"]]], + ["etemon", [["angry", " ▄▀▀▀▀▀▀▄ \n▄▀▀█▄▀▀▀▀▀▄ █▀▀▄\n█ ▄█▄█▄█▄▄██▄▄ █\n▀▄ █▄█▀█▄███ ▄▀\n █▀▄ ▄█▀█ \n █ ▄█▀▀▀▀▀▀▄▄ █ \n ▀▄▄▀ ▄ ▀▄▄█ \n █▄▄▄▄▀▀▄▄▄▄█ "], ["attack", " ▄▀▀▀▀▀▀▄ \n ▄▄█▄▀▀▀▀▀▄▄█▄▄ \n█ ▄█▄█▀█▄███▄▄ █\n█ █▄▄█▄▄▄ █ █\n █▀███▀▀▀█ ▀▀▀▀▄\n ▀▄▀ ▀▀▀ ▄▄█▀ █\n █ ▄ █▄ ▀▀ \n █▄▄▄▄█▀▄▄▄▄█ "], ["eat_1", " ▄▀▀▀▀▀▀▄ \n▄▀▀█▄▀▀▀▀▀▄ █▀▀▄\n█ ▀█▄█▀█▄███▄▀ █\n▀▄ █▄▄█▄▄▄ █ ▄▀\n ▀█▀█▀▀▀ ▄▀██▄ \n █ ▀▀▀▀▀▀▄ ▄▀ \n ▀▀▄ ▄▄ ▀▀█ \n █▄▄▄█ ▀▀▀▀ "], ["eat_2", " ▄▀▀▀▀▀▀▄ \n▄▀▀█▄▀▀▀▀▀▄ █▀▀▄\n█ ▀█▀███▀███▄▀ █\n▀▄ █▀▀▄▀▀▀▀█ ▄▀\n ▀▀▄▀ ▀▀ ▄▀█▀▄ \n █ ▀▀▀▀▀ ▀█ █\n █ █▄ ▄█ ▄ █\n █▄▄█▄█▄▄█▄▄█ "], ["happy", " ▄▄▄▄▄▄ \n ▄▄▄▀▄▄▄▄▄ ▀▄▄▄ \n█ ▄██▄▄▄▄▄█▄▀▄ █\n█ █▄█▀█▄███▀ █\n▀▄▄█▄▄█▄▄▄ ▀▄▄▄▀\n ▄▀███████ █▀▄▄\n█▄▄▀▄▄▄▄▄▄▄█▀▄▄▀\n █▄▄▄▄▀ ▀▄▄▄▄█ "], ["injured_1", " ▄▄▄▄▄▄ \n ▄▄▄█ ▀▄▄▄ \n█ ▄█▄▀▀▀▀▀▄▄▀▄ █\n█ █▄▄▄▄▄▄▄█▀ █\n ▀▄███▀█████▄▄▀▄\n ▄▀ ▀▄▄▄▄▀ ▀▄█\n ▀▄▄▀▄ ▀▄ ▀▄\n █▄▄▄█▀▀▀▄▄█▄▄▀"], ["injured_2", " \n ▄▀▀▀▀▀▀▄ \n▄▀▀█▀▄▄▄▄▄ █▀▀▄\n█ ▀█▀ ▀█▄▀ █\n▀▄ █████████ ▄▀\n █▀ █ ▀▀▀█▀▀▀▄█\n ▀▄▄█▀█▀▀ ▄ ▀▄\n █▄▄▄▄█▀█▄▄█▄▄▀"], ["sleep_1", " \n ▄▀▀▀▀▀▀▄ \n▄▀▀█ ▄▄▄▄▄ █▀▀▄\n█ ▀██▄▄▄▄▄██▄▀ █\n▀▄ ███▀█████ ▄▀\n ▀█▄ ▄▀██▀▄\n █ ██▀██ ▄ ▀▄█\n █▄▄█▄█▄▄█▄▄█ "], ["sleep_2", " ▄▄▄▄▄▄ \n ▄▄▄▀ ▀▄▄▄ \n█ ▄█▄▀▀▀▀▀▄▄▀▄ █\n█ █████████▀ █\n ▀▄█▀▀ ▀▀▀▀█▄▄▀ \n ▄▀▄▄▄▄▄▀ █▄▀▄\n █ █▄ ▄█ ▄ ▀▄█\n █▄▄█▄█▄▄█▄▄█ "], ["walk_1", " ▄▀▀▀▀▀▀▄ \n▄▀▀█▄▀▀▀▀▀▄ █▀▀▄\n█ ▀█▀███▀███▄▀ █\n▀▄ █▀▀▄▀▀▀▀█ ▄▀\n ▀█▄▄▄▄▄▄▄▀█▀ \n ▄▀ █ ▀▄ ▀▄ \n ▀▀▀█ ▄ █▀▀▀ \n █▄▄▄█▀▄▄▄█ "], ["walk_2", " ▄▄▄▄▄▄ \n ▄▄▄▀▄▄▄▄▄ ▀▄▄▄ \n█ ▄██▄▄▄▄▄█▄▀▄ █\n█ █▄█▀█▄███▀ █\n ▀▄█ ▀ █▄▄▀ \n▄▀▀▄█▀▀▀▀▄▀▀▄ █ \n▀▄▄▄█ ▄ ▀▄▄▄▄▀ \n █▄▄▄▄▀▀▄▄▄▄█ "]]], + ["examon", [["angry", "▄▀▀█▄▄▄▄▄▄███▄ \n█▀▀ ▄█ █▄▄████ \n█▄██▄▄ ▀▄██████\n█ █████ ▄█ ████\n ▀█▀▀▀ ▄▀▀ ████\n ▀█▀▀ ▀█▀███\n ▄▀▀▀▄▄▄ ▀▄ ▀█\n █▄█▄█ █▄█▄█▄█ ▀"], ["attack", " ▄▄▄ \n█▀▄ ▄▄▄▀▀▄ ███▄ \n█ █▀ ▄▄▀█ ▄████▄\n█▀ ▀▀▄ ███████\n▀▄▀▀▀▀ ▄▀▀▀█████\n ▄▀██▀▀ ▄▀ ████\n ▄▀▀▄ █▄▄█▀▄▀█\n█▄█▄█▀▀▀█▄█▄█▄██"], ["eat_1", " ▄▄▄ \n█▀▄ ▄▄▄▀▀▄ ███▄ \n█ █▀ ▄▄▀█ ▄████▄\n█▀ ▀▀▄ ███████\n▀▄▀▀▀▀ ▄▀▀▀█████\n ▄▀██▀▀ ▄▀ ████\n ▄▀▀▄ █▄▄█▀▄▀█\n█▄█▄█▀▀▀█▄█▄█▄██"], ["eat_2", "█▀▄ ▄▄▄▄▄▄▀██▄ \n█ █▀▄▄▄▀▄▄▀████ \n█▀▄▄▄▄ ▀▄██████\n ▀▀███▀ ▄███████\n █▄▄▄▄▀ ▄ ▀████\n ▄▀█▀ ▄▀ █▀██\n █▀▀▀▄▄█▄▄▀▄ ▀█\n █▄█▄█ █▄█▄█▄█ ▀"], ["happy", "█▀▄▄▄▄▄▄▄▄▀██▄ \n█▄▀ ▄▀▄▀▄▄▀████ \n█ ▄▄▄▄▄ ▀▄██████\n▄▀████▀ ▄█ ████\n▀▄▀▄▄▄▄▀▀ ▄████\n ▀▀█▀ █▀▀███\n ▄▀▀▀▄▄▄ ▀▄ ▀█\n █▄█▄█ █▄█▄█▄█ ▀"], ["injured_1", " ▄▄▄ \n█▀▄ ▄▄▄▄▄ ███▄ \n█ █▀▄ ▀▄▀▄████▄\n█▀ ▀▀▀ ███████\n▀▄▀▀▀▀ ▄█▀ █████\n ▄▀█▀▀▀ ▄▄▄████\n█ ▀█ █ █ ▀ ▀ ██\n█▄▄▄█▄█▄▄█▄▄▄▀ █"], ["injured_2", " \n▄▄ ▀██▄ \n█ █▄▀▀▀█▀▄ ████ \n█▄▀ █▄▄ ▀▄▀▄████\n█ ▄▄▄▄ ▄█▀█████\n █▀▀▀▀ ▄█▄▄▄████\n█ ▀█▀▀█ █ ▀ ▀ ██\n█▄▄▄█▄█▄▄█▄▄▄▀▀█"], ["refuse", " ▄▄▄ \n█▀▄ ▄▄▄▀▀▄ ███▄ \n█ █▀ ▄▀█ ▄████▄\n█▀ ▀▀ ███████\n▀▄▀▀▀▀ ▄▀▀▀█████\n ▄▀██▀▀ ▄▀ ████\n █▀▄ █▄▄█▄ ██\n █▄█▄█▀█▄█▄█▄█ █"], ["sleep_1", " ▄ ▄ \n▄▄ █▄█▄▀▄▀▀██▄ \n█ █▀ ▀█ ████ \n█▄▀ ▄▄▀ ███████\n█ ▄▀ ▀█████\n▀▄▄▄▄▀▀ ▄▄▄████\n█ ▀█ █ █ ▀ ▀ ██\n█▄▄▄█▄█▄▄█▄▄▄▀▀█"], ["sleep_2", " ▄ ▄ \n▄▄ █▄█▄▀▄▀▀██▄ \n█ █▀ ▀█ ████ \n█▄▀ ▄▄▀ ███████\n█ ▄▀ ▀█████\n▀▄▄▄▄▀▀ ▄▄▄████\n█ ▀█ █ █ ▀ ▀ ██\n█▄▄▄█▄█▄▄█▄▄▄▀▀█"], ["walk_1", "▄▄ ▄▄ ▀██▄ \n█ █▄▀▀▀▄▄▀ ████ \n█▄▀ ▄█▀ ▀▄██████\n█ ▄▄▄▄▀ ▄███████\n ▀▄▄▄▄▄▀ ▄ ▀████\n ▄▀█▀ █ ▄█▀██\n ▄▀▀▀▄▄▄▀▀▀▄ ▀█\n █▄█▄█ █▄█▄█▄█ ▀"], ["walk_2", " ▄▄▄ \n█▀▄ ▄▄▄▀▀▄ ███▄ \n█ █▀ ▄▄▀█ ▄████▄\n█▀ ▀▀▄ ███████\n▀▄▀▀▀▀ ▄▀▀▀█████\n ▄▀██▀▀ ▄▀ ████\n ▄▀▀▄ █▄▄█▀▄▀█\n█▄█▄█▀▀▀█▄█▄█▄██"]]], + ["examon_x", [["angry", "▄▄ ▄▄▄ ▄▄ \n█ █▄▀▀▀▀▄▄▀ ██ \n█▄▀ ▄▄▀ ▀▄ ▄███\n█ ▄▄▄▄ ▄█▀█▀███\n ▀▄▄▄▄▄▀▀▄ ▄███\n ▄▀█▄ ▄█▀▀█████\n ▄█▄▀▄▀ ▀▄▄▄█▀██\n█▄█▄▄▀▀▀▀▄▄█▄█ █"], ["attack", " █▀▄ ▄▄▄▀▀█ \n █ █▀▀▄▄ ▀█ █▄\n █▀ ▀▀ ▄█▄██\n ▀▄███▀ ▄▀ ▀ ██\n ▀▄▄▄▀▀█▄▄███\n▄▀▀▀▀█ ▄▀▀▀▀███\n ▀▀█▀▀▀██▀▀▀█ ▀█\n █▄█▄▀ ▀▄█▄█ ▀"], ["eat_1", "█▀▄ ▄▄▄▄▄▄▄▄▀█▄ \n█ █▀ ▄▄ ▀▄▄▀ ██▄\n█▀▄▄▄▄ █▄████\n▀▀▀████ ▄▀ ▀ ███\n▄▀▀▄▄▄▄▀▄█▄▄████\n▀▄▄▄█▀▄▀ █▀ ████\n ▄▀ ▀▄▄▀▀▄▄▀ ▀█\n █▄█▄▀ ▀▄█▄█ ▀"], ["eat_2", "▄▄ ▄▄▄ ▄▄ \n█ █▄▀▀▀▀▄▄▀ ██ \n█▄▀ ▄▀▄ ▀▄ ▄███\n█ ▄▄▄▄ ▄█▀█▀███\n ▀▄▄▄▄▄▀▀▄ ▄███\n ▄▀█▄ ▄▀▀█▀ ███\n █▄▄▀▄▀ ▄▀▀▄▄▀██\n█▄█▄▄▀▀▀▀▄▄█▄█ █"], ["happy", "█▀▄ ▄▄▄▄▀▀█ ▀█▄ \n█ █▀ ▄ ▀█ ▄██▄\n█▀ ▀ ▀ █▄████\n▀▄█████ ▄██ ███\n ▄▄▀▀▀▄▀▄█ ▄████\n█ ▀█▀▄▀ █▀ ▀███\n ▀█▀ ▀▄▄▀ ▀█ ▀█\n █▄█▄▀ ▀▄█▄█ ▀"], ["injured_1", "▄▄ ▄▄▄ \n█ █▄▀▀▀▀▄▄▀▄▄ \n█▄▀ ▀▄▄ ▀▄ ██ \n█ ▄▄▄▄ ▄█▄████ \n ▀▄▄▄▄▄▀█▀ ▀ ███\n ▄▄▀▄ ▄▀█▀▄▄████\n█ ▀▄ ▀▄▀ ▄▀ ▀██\n█▄▄█▄▄█▄▄█▄▄▄▄▀█"], ["injured_2", " \n█▀▄ ▄▄▄▄▀▀█ \n█ █▀▄ ▀█ ▀█▄ \n█▀ ▀▀ ▄█▄███ \n▀▄▀▀▀▀ ▄█▀ ▀ ███\n ▄█▀█▀█▀█▀▄▄████\n█ ▀▄ ▀▄▀ ▄▀ ▀██\n█▄▄█▄▄█▄▄█▄▄▄▄▀█"], ["sleep_1", " \n█▀▄ ▄▄▄▄▀▀█ \n█ █▀ ▀█ ▀█▄ \n█▀ ▀▀▀ ▄▀█▀██ \n▀▄▀▀▀▀ █▄ ▄███ \n ████▀▄▄██████ \n █ ▀▄▀ █ ▀███ \n █▄▄▄████▄▄▄████"], ["sleep_2", "▄▄ ▄▄▄ \n█ █▄▀▀▀▀▄▄▀▄▄ \n█▄▀ ▄▄▄ ▀▄ ██ \n█ ▄▄▄▄ ▄▀█▀██ \n ▀▄▄▄▄▄▀▄ ▄██▄ \n ▄██▄ ▄▄██████ \n █ ▀▄▀ █ ▀███ \n █▄▄▄████▄▄▄████"], ["walk_1", "█▀▄ ▄▄▄▄▀▀█ ▀█▄ \n█ █▀ ▄▄ ▀█ ██▄\n█▀ ▀▀ ▄█▄████\n▀▄▀▀▀▀ ▄█▀ ▀ ███\n ▀██▀▀ ▄█▄▄▀███\n █ █▀▄▀ █ ▄███\n ▄▀ ▀▄▄▀ ▀█ ▀█\n █▄█▄▀ ▀▄█▄█ ▀"], ["walk_2", "▄▄ ▄▄▄ ▄▄ \n█ █▄▀▀▀▀▄▄▀ ██ \n█▄▀ ▄█▀ ▀▄ ▄███\n█ ▄▄▄▄ ▄█▀█▀███\n ▀▄▄▄▄▄▀▀▄ ▄███\n ▄▀█▄ ▄▀█▀▀ ███\n ▄█▄▀▄▀ ▄▀▄▄█▀██\n█▄█▄▄▀▀▀▀▄▄█▄█ █"]]], + ["extyrannomon", [["angry", " ▄▀▀▀▀▀▄▀▀█ \n▄▀▀ ▄█ █ ▀▄ \n█▄▀█▀█▀▄ ▀▄█ \n▄▀███▀▀▀█ █ ▀▄\n█ █▀▀▀▀▀▀ ▀▀ █\n ▀▀▀█▀▀▀ ▄▄█▄\n ▄▄▀▀▄ ▄ ▀▄▀\n█▄█▄▄▄█▀▀█▄█▄█▄█"], ["attack", " ▄▄▄▄ ▄▄▄ \n ▄▄▀ ▄▀▀▄ █ \n█ ▀▀ ▀▄▀█ \n▀█▀█▀█▀▄ ▀▄▀▄ \n █▀▀▀▀▀▀ ▄ ▄▀▄▀ \n█▄▀█▀▀▀ █ █▄▄▀█\n ▄█▀▄▄ █▀▀▀▄ █\n█▄█▄▄▄█▀█▄█▄█▄█ "], ["eat_1", " ▄▄▄▄ ▄▄▄ \n ▄▄▀ ▄▀▀▄ █ \n█ ▀▀ ▀▄▀█ \n▀█▀█▀█▀▄ ▀▄▀▄ \n █▀▀▀▀▀▀ ▄ ▄▀▄▀ \n█▄▀█▀▀▀ █ █▄▄▀█\n ▄█▀▄▄ █▀▀▀▄ █\n█▄█▄▄▄█▀█▄█▄█▄█ "], ["eat_2", " ▄▀▀▀▀▄▄▀▀█ \n▄▀▀ ▄▀▄ █ █▄ \n█▄▄▄▄▄▄▄▄ █ █ \n▄███▀▀▀█▀ ▄█ █ \n█ █▀▀▀▀ ▄ ▀▀▄\n ▀▀▀█▀▀▀ ▀█▄▄▀\n ▄▄▀▀▄ ▄ ▀▄▀\n█▄█▄▄▄█▀▀█▄█▄█▄█"], ["happy", " ▄▀▀▀▀▄▄▀▀█ \n▄▀▀ ▄▀▄ █ █▄ \n█▄▄▄▄▄▄▄▄ █ █ \n▄███▀▀▀█▀ ▄█ █ \n█ █▀▀▀▀ ▄ ▀▀▄\n ▀▀▀█▀▀▀ ▀█▄▄▀\n ▄▄▀▀▄ ▄ ▀▄▀\n█▄█▄▄▄█▀▀█▄█▄█▄█"], ["injured_1", " ▄▀█ \n ▄█▄▄█▀▀█ \n ▄▀ ▀▄█▄▄ \n █ ▀▄ █ \n █▀▀ ▀▀ █▀ \n▄▀▀▄ ▄ ▀█▀▄\n█ █ █▀▀▀█ ▄▀ ▀█\n█▄█▄▀▄▄▄█▄██▄▄▄█"], ["injured_2", " ▄▀█ \n ▄█▄▄█▀▀█ \n ▄▀ ▀▄█▄▄ \n █ ▀▄ █ \n █▀▀ ▀▀ █▀ \n▄▀▀▄ ▄ ▀█▀▄\n█ █ █▀▀▀█ ▄▀ ▀█\n█▄█▄▀▄▄▄█▄██▄▄▄█"], ["refuse", " ▄▄▄▄ ▄▄▄ \n ▄▄▀ ▄▀▀▄ █ \n█ ▀▀ ▀▄▀█ \n▀█▀█▀█▀▄ ▀▄▀▄ \n █▀▀▀▀▀▀ ▄ ▄▀▄▀ \n█▄▀█▀▀▀ █ █▄▄▀█\n ▄█▀▄▄ █▀▀▀▄ █\n█▄█▄▄▄█▀█▄█▄█▄█ "], ["sleep_1", " ▄▀█ \n ▄█▄▄█▀▀█ \n ▄▀ ▀▄█▄▄ \n █ ▀▄ █ \n █▀▀ ▀▀ █▀ \n▄▀▀▄ ▄ ▀█▀▄\n█ █ █▀▀▀█ ▄▀ ▀█\n█▄█▄▀▄▄▄█▄██▄▄▄█"], ["sleep_2", " ▄▀█ \n ▄█▄▄█▀▀█ \n ▄▀ ▀▄█▄▄ \n █ ▀▄ █ \n █▀▀ ▀▀ █▀ \n▄▀▀▄ ▄ ▀█▀▄\n█ █ █▀▀▀█ ▄▀ ▀█\n█▄█▄▀▄▄▄█▄██▄▄▄█"], ["walk_1", " ▄▀▀▀▀▄▄▀▀█ \n▄▀▀ ▄█ █ █ \n█▄▄▄▄ █ █ \n ▀▄▄▄▄ ▄▄ █▀▄ \n █ ▄█ █ ▄▄ █▄▀ \n ▀▀ █ ▀▀ ▀▄▀█\n ▄▄▀▀▀▄▄▄▄ ▀▀▄ █\n█▄█▄▄▄█ █▄█▄█▄█ "], ["walk_2", " ▄▄▄▄ ▄▄▄ \n ▄▄▀ ▄▀▀▄ █ \n█ ▀▀ ▀▄▀█ \n▀█▀█▀█▀▄ ▀▄▀▄ \n █▀▀▀▀▀▀ ▄ ▄▀▄▀ \n█▄▀█▀▀▀ █ █▄▄▀█\n ▄█▀▄▄ █▀▀▀▄ █\n█▄█▄▄▄█▀█▄█▄█▄█ "]]], + ["exveemon", [["angry", " ▄▄ ▄▄▄ \n █ █ ▄▄▄█▄▄▀▀█▀ \n █ █ ▄ ▄▀ \n █▀ ▀▀ █▄▀▄\n ▀▄▀▀▄▀ ▀▀▄ █\n ▄▀▀█▄ ▄ ▄▀ █▀\n ▀▄▄█▄▀▄ █▄▄▄█ \n █▄█▄▄████▄█▄█▄█"], ["attack", "█▀▄ ▄███▀▀█▀ \n▀▄ █▀▀▀▀ ▄ ▄▀ ▄ \n ▀█▄███▄▀▀ █▄█ █\n ██████▄ █ ██\n ▄▄██▄▄▄█ ▀▄▄▄▀█\n█ ▀█▀▄▀ █ \n▀▄▄▀▀▀ ▀ ▄▄█▄▄ \n █▄█▄█▀▀▀█▄█▄█▄█"], ["eat_1", "█▀▀▄ ▄▄▄▄██▀▀█▀ \n ▀▄▄▀ ▄ ▄▀ \n █▄▄▄▄▀ ▀ █▄▀▄\n ███████ ▄█ █\n ▄██▀▀▀ ▀▄ ▀▄█\n █ █▀▄▀ █ █ \n ▀██▀ ▀ ▄████▀ \n █▄█▄▀▀█▄█▄█▄█ "], ["eat_2", " ▄▄ ▄▄▄ \n █ █ ▄▄▄█▄▄▀▀█▀ \n █ █ ▄ ▄▀ \n █▀ ▀ ▀ █▄▀▄\n ▀▄▀▀▄▀ ▀▀▄ █\n ▄▀▀█▄ ▄ ▄▀ █▀\n ▀▄▄█▄▀▄ █▄▄▄█ \n █▄█▄▄████▄█▄█▄█"], ["happy", " █▀▄ ▄▀▀█▄▄▄ \n █ ▀▄▀▀▀▀▀▀ ▄▀ \n ▀▄▄▀ ▄▀▄ ▄▀▀▄ \n █ ▄▄▄▄▄ ▀▄ █ \n ▄▀██████ ▀ ▄█ \n █ ██▀█ █▀ \n ███▄▀▄▄▄▄█▄ \n █▄█▄▄██▄█▄█▄█ "], ["injured_1", " █▀▄ ▄▀▀█▄▄▄ \n █ ▀▄▀▀▀▀▀▀ ▄▀ \n ▀▄▄▀ █▄▄ ▀▄ ▄ \n █ ▄▄ ▄ ▄▀▀ █\n ▀▄ ▀ ▀ █ ▄█\n ▄█▀▄▀ ▄ █ ▀\n █▄█▀ ▀ ▄▀ █ \n █▄█▄▀▀██▄▄█▄█ "], ["injured_2", "▄▄ ▄▄▄ \n█ █ ▄▄▄█▄▄▀▀█▀ \n█ █ ▄ ▄▀ \n █▀ ▀▀▀ █▄▀▄ \n ▀▄▀▀▄▀ ▀▀▄ █ \n▄▀▀█▄ ▄ ▄ █▀ \n▀▄▄█▄▀▄ ▄▀ █ \n█▄█▄▄█████▄▄█▄█ "], ["sleep_1", " \n▄▄ ▄▄▄ \n█ █ ▄▄▄█▄▄▀▀█▀ \n█ █ ▄▀ \n █▀ ▀▀▀ █▄▀▄ \n ▀▄█▀▄▀ ▀▀▄ █ \n▄▀▀▄▄▄ ▄▀ ██ \n▀▄█▄█▄█▄▄█▄▄▄█▄█"], ["sleep_2", " \n █▀▄ ▄▀▀█▄▄▄ \n █ ▀▄▀▀▀▀▀▀ ▄▀ \n ▀▄▄▀ ▄▄▄ ▀▄ ▄ \n █ ▄▄ ▄ ▀█ █\n ▄▀▀█ ▀ ▄▀ █ \n ▀▄▄██▄█ █▄▄▄█ \n █▄█▄▄████▄█▄█▄█"], ["walk_1", " █▀▄ ▄▀▀█▄▄▄ \n █ ▀▄▀▀▀▀▀▀ ▄▀ \n ▀▄▄▀ ▄██▀ ▀▄ ▄ \n █ ▄▄ ▄ ▄▀▀ █\n ▀▄ ▀ ▀ █ ▄█\n ▄▀█▀▄▀ ▄▀▀ █ ▀\n ▀▄█▀ ▀ █▄▄▄█ \n █▄█▄▀▀█▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄▄ \n █ █ ▄▄▄█▄▄▀▀█▀ \n █ █ ▄▄▄ ▄▀ \n █▀ ▀▀▀ █▄▀▄\n ▀▄▀▀▄▀ ▀▀▄ █\n ▄▀▀█▄ ▄ ▄▀ █▀\n ▀▄▄█▄▀▄ █▄▄▄█ \n █▄█▄▄████▄█▄█▄█"]]], + ["falcomon", [["angry", " █▀██▄▄▄▄▄▀▀█ \n █▄ ▄█ ▀█ \n▄█ ▄█▀▀▀ █▄▄ \n▀▄█▀▀ ▄▀█ █ \n ▀▄▀▄▄▄▄▀▄▀ ▄▀█ \n █▀█▀ ▀█▄▀ \n █▄▄▄▄▀█ \n █▄▄▀ ▀▄▄█ "], ["attack", " ▄▄▄▄ ▄▄▄ \n ▀▄▄▀▀▀▀▀▀ ▄▀ \n █▄ ▄▄██▀▄ \n █▀▀█ ▀▄█ █ \n █▀▄█▀ ▄▀▀█ \n ▄▄▀▄▀███▀█▀▄▀▄▄\n ▀▄▄█▄ ▀ ▄█▄▄▄▀\n █▄▄█▄█▀▀█▄█▄▄█ "], ["eat_1", " █▀██▄▄▄▄▄▀▀█ \n █ ▄▀ ▀█ \n ▄▀▀▄▀█▀▄ █ \n █▄██▄▄▄▄▄▀▀█ \n█ ▄█▄ ▀ ▄█▀▀█ \n ▀▀▄▀█▀▀ █▄▀ \n █▄▄▄▄▀█ \n █▄▄▀ ▀▄▄█ "], ["eat_2", " █▀▀█▄▄▄▄▄▀▀█ \n █▀ ▄▄▄▀ \n █▀▀▄▀█▀█ █ \n ▄█▄██▄ ▀▀▄▀▀█ \n█▀▀▄▀█▄█▄▄█▄▀▀▀█\n ▀▄▄█ ▀█▀ ▄▄▀ \n ▄▄█▄▄▄▄██▄ \n █▄█▄▄██▄█▄▄█ "], ["happy", " █▀██▄▄▄▄▄▀▀█ \n █▄ ▄▄▄▀ ▀█ \n▄█ ▄█ ▀ ▀ █▄▄ \n▀▄█▀▀ ▄▀█ █ \n ▀▄▀▄▄▄▄▀▄▀ ▄▀█ \n █▀█▀ ▀█▄▀ \n █▄▄▄▄▀█ \n █▄▄▀ ▀▄▄█ "], ["injured_1", " ▄▄▄▄ ▄▄▄▄ \n ▀▄▄▀▀▀▀▀▀▄▄▀ \n █ ▄█▀█ \n ██▄▄▄██ █ \n █▀█ ▄▀ ▄▀▀█ \n ▄▀▄███▀█▄█▀▄ \n ▀█ ▀ ▀▄▄▀ \n ▀▄▄▄▄▄▄▀ "], ["injured_2", " \n █▀▀█▄▄▄▄▄▀▀█ \n █▀ ▄██ \n █▄ ▄█▀ █ \n ▄██▀▀█▀▀ ▄█▄ \n ▀▄▀▄█▄▄▄█▄▄▀▄ \n ▀█ ▀▀▀ ▀▄▄▀ \n ▀▄▄▄▄▄▄▀ "], ["refuse", " ▄▄▄▄ ▄▄▄ \n ▀▄▄▀▀▀▀▀▀ ▄▀ \n █▄ ▄▄██▀▄ \n █▀▀█ ▀▄█ █ \n █▀▄█▀ ▄▀▀█ \n ▄▄▀▄▀███▀█▀▄▀▄▄\n ▀▄▄█▄ ▀ ▄█▄▄▄▀\n █▄▄█▄█▀▀█▄█▄▄█ "], ["sleep_1", " ▄▄▄▄ ▄▄▄ \n ▀▄▄▀▀▀▀▀▀▄▄▀ \n █ ▄█▀█ \n ██▄▄▄▀▄▄ █ \n █▀█ ▄█▄ ▄▀▀█ \n ▄▀▄██▄▀█▄█▀▄ \n ▀█ ▀ ▀▄▄▀ \n ▀▄▄▄▄▄▄▀ "], ["sleep_2", " \n █▀▀█▄▄▄▄▄▀▀█ \n █▀ ▄██ \n █▄ ▄▀▀ █ \n ▄██▀▀█ ▀▀▄█▄ \n ▀▄█▄██▀█▄█▀█ \n ▀█ ▀ ▀▄▄▀ \n ▀▄▄▄▄▄▄▀ "], ["walk_1", " █▀▀█▄▄▄▄▄▀▀█ \n █▀ ▄▄▄▀ \n ██▄▄▀█▀█ █ \n ▄█ ▄█ ▀▀ █▄▄ \n ▀▄▀█▄▄▄▄▄█ ▄▀ \n ▄▀█ ▀█▀ ▀▄▀▄ \n █ ▄▀█▄▄▄▄▀█▄ ▀▄\n ▀█▄█▄▄██▄█▄▄█▀▀"], ["walk_2", " ▄▄▄▄ ▄▄▄ \n ▀▄▄▀▀▀▀▀▀ ▄▀ \n █▄ ▄▄██▀▄ \n █▀▀█ ▀▄█ █ \n █▀▄█▀ ▄▀▀█ \n ▄▄▀▄▀███▀█▀▄▀▄▄\n ▀▄▄█▄ ▀ ▄█▄▄▄▀\n █▄▄█▄█▀▀█▄█▄▄█ "]]], + ["fanglongmon", [["angry", " ▄▀█▄▀█ █▀▄ \n ▄▀▄▀ █ █ ▀▄\n ▄▀ ▄ ▀▄ ▄ ▄ █ █\n▄▀ ▀▀ ▀ █ █ █ █\n█▄▄ ▄▀ ▄ ▄ ▄▀\n ▀▀█▄ ▄ ▄▀▄▀▄▀█ \n █▀▄▀ ▄▀▀█ █ \n █▄█▄█▄█ █▄█▄█ "], ["attack", " ▄▄ ▄▄ █▀▄ \n █ █▀▄▀ █ ▀▄\n █ ▀ ▄▀ ▄ ▄ █ █\n █ ▀ ▄▀█ █ █ █\n█ ▀ ▄ ▀ ▄ ▄ ▄▀\n▀▄▄▄█ ▄▀▄▀▄▀█ \n █ █ ▀█ ▀▀█ █ \n ▀▀▀▀ █▄█▄█ "], ["eat_1", " ▄▀█▄▀█ █▀▄ \n ▄▀▄▀ █ █ ▀▄\n ▄▀ ▄ ▀▄ ▄ ▄ █ █\n▄▀ ▀ ▀ █ █ █ █\n█ ▄▀ ▄ ▄ ▄▀\n ▀▀▀▄ ▄ ▄▀▄▀▄▀█ \n ▄▀▄▀ ▄▀▀█ █ \n █▄█▄█▄█ █▄█▄█ "], ["eat_2", " ▄▀█▄▀█ █▀▄ \n ▄▀▄▀ █ █ ▀▄\n ▄▀ ▄ ▀▄ ▄ ▄ █ █\n▄▀ ▄ ▀ █ █ █ █\n█▄▄ ▄▀ ▄ ▄ ▄▀\n ▀▀█▄ ▄ ▄▀▄▀▄▀█ \n █▀▄▀ ▄▀▀█ █ \n █▄█▄█▄█ █▄█▄█ "], ["happy", " ▄▄ ▄▄ █▀▄ \n █ █▀▄▀ █ ▀▄\n █ ▀ ▄▀ ▄ ▄ █ █\n █ ▄▀▄ ▀█ █ █ █\n█ ▄ ▄ ▄ ▄▀\n▀██▄▀ ▄ ▄▀▄▀▄▀█ \n █▀▄▀ ▄▀▀█ █ \n █▄█▄█▄█ █▄█▄█ "], ["injured_1", " \n ▄▀█▄▀█ █▀▄ \n ▄▀▄▀ █ █ ▀▄\n ▄▀▄ ▀▄ ▄ ▄ █ █\n▄▀ ▀▀ ▀ █ █ █ █\n█ ▄▀ ▄ ▄ ▄▀\n █▀█▀ ▄▄▀▄█ ▀█ \n█▄█▄▄▄████▄▄▄▄██"], ["injured_2", " \n ▄▄ ▄▄ \n █ █▀▄▀ ▄▀▀▄ \n █ ▀ ▄▀ ▀▀▄ ▀▄\n █ █▄ ▄▀▄▀▄▀▄▀ █\n█ ▄ ▀ ▀ ▀ █\n▀▄▄▄█ ▄█ ▀▄█ \n█▄█▄▄▄████▄▄▄▄██"], ["refuse", " ▄▄ ▄▄ ▄▄ \n █ █▀▄▀ ▀▄▀▄ \n █ ▀ ▄▀ ▀▄ █\n █ ▄█ ▄▀▄▀▄▀▄▀ █\n█ ▄ ▀ ▀ ▀ █\n▀▄▄▄▀ ▄▀▄▀▄█ \n ▄▀ ▀▄▀ █▄█▄▀ █▄\n█▄▄▄█▄▄█ █▄▄▄▄▄█"], ["sleep_1", " ▄▄ ▄▄ ▄▄ \n █ █▀▄▀ ▀▄▀▄ \n █ ▀ ▄▀ ▀▄ █\n █ ▄▄ ▄▀▄▀▄▀▄▀ █\n█ ▄ ▀ ▀ ▀ █\n▀▄▄▄▀ ▄▀▄▀▄█ \n ▄▀ ▀▄▀ █▄█▄▀ █▄\n█▄▄▄█▄▄███▄▄▄▄▄█"], ["sleep_2", " \n ▄▀█▄▀█ █▀▄ \n ▄▀▄▀ █ █ ▀▄\n ▄▀ ▀▄ ▄ ▄ █ █\n▄▀ ▀▀ ▀ █ █ █ █\n█ ▄▀ ▄ ▄ ▄▀\n █▀█▀ ▄▄▀▄█ ▀█ \n█▄█▄▄▄████▄▄▄▄██"], ["walk_1", " ▄▀█▄▀█ █▀▄ \n ▄▀▄▀ █ █ ▀▄\n ▄▀ ▄ ▀▄ ▄ ▄ █ █\n▄▀ ▄ ▀ █ █ █ █\n█ ▄▀ ▄ ▄ ▄▀\n ▀▀▀▄ ▄ ▄▀▄▀▄▀█ \n ▄▀▄▀ ▄▀▀█ █ \n █▄█▄█▄█ █▄█▄█ "], ["walk_2", " ▄▄ ▄▄ █▀▄ \n █ █▀▄▀ █ ▀▄\n █ ▀ ▄▀ ▄ ▄ █ █\n █ ▀ ▄▀█ █ █ █\n█ ▀ ▄ ▀ ▄ ▄ ▄▀\n▀▄▄▄█ ▄▀▄▀▄▀█ \n █ █ ▀█ ▀▀█ █ \n ▀▀▀▀ █▄█▄█ "]]], + ["filmon", [["angry", " ▄▄▄▄▄▄ \n ▄▀▄▄▄▄▀▀▀█▄ \n █▄█▀▀ ▄ ▄▄▀ ▄▀\n █ ▀▀ ▄▀ ▄▀\n ▀█▀▀▀ ▄█ ▄▀\n ▄█▀▄ ▄ ▀▄▄█\n █ █ ▀ █ ▄█▄ \n █▄█▄█▀▀▀█▄█▄█▄█"], ["attack", " ▄▀▀▀▀██▄▄ \n ▄ ▄█▄▀▀▀▀ ▄▀▀▄\n █▀▀ ▄█ ▀█ ▀▄\n █▄▄▄▄▄ ▀▄ ▀▄\n ███▀▀█ ▄█▀▄ ▀▄\n▄▀█▀▀▀▀▀█ ▄▀▀▀\n▀▄▄▀█▀▀▄ ▀▀█▄▄ \n █▄█▄█ ▀▄█▄█▄█ "], ["eat_1", " ▄▀▀▀▀██▄▄ \n ▄ ▄█▄▀▀▀▀ ▄▀▀▄\n █▀▀ ▄▀▄ ▀█ ▀▄\n ▀▄▄▄▄▄ ▀▄ ▀▄\n ▄█████ ▀▀▄ ▀▄\n█ ▀█▀▀▄▀ ▄ ▀█▀\n ▀▀██ ▄ █▄▄▀ \n █▄█▄█ ▀▄█▄█▄█ "], ["eat_2", " ▄▄▄▄▄▄ \n ▄▀▄▄▄▄▀▀▀█▄ \n █▄█▀▀ ▄ ▄▄▀ ▄▀\n █ ▀ ▀ ▄▀ ▄▀\n ▀█▀▀▀ ▄█ ▄▀\n ▄█▀▄ ▄ ▀▄▄█\n █ █ ▀ █ ▄█▄ \n █▄█▄█▀▀▀█▄█▄█▄█"], ["happy", " ▄▀▀▀▀██▄▄ \n ▄ ▄█▄▀▀▀▀ ▄▀▀▄\n █▀▀ ▄▀▄ ▀█ ▀▄\n █▄▄▄▄▄ ▀▄▄▄▀▄\n█ ████▀ ▀█ █▄\n ▀█▄▄▄▀▄▀▄▀ ▄▀▀▀\n ▄█ ▄ ▄▄█ \n █▄█▄█ ▀▄█▄█▄█ "], ["injured_1", " \n \n ▄▀▀▀▀██▄▄ \n ▄ ▄█▄▀▀▀▀ ▄▀▀▄\n █▀▀ █▄ ▀█ ▀▄\n ▀▄▄▄▄▄ ▀▄ ▀▄\n ▄▀█ ▄ █ █▀█ \n ▀▄█▄█▄███▄▄█▄█"], ["injured_2", " \n \n ▄▄▄▄▄▄ \n ▄▀▄▄▄▄▀▀▀█▄ \n█▄█▀▀ ▄ ▄▄▀ ▄▀ \n█ ▀▀ ▄▀ ▄▀ \n ▀██▀▀ ▄ ▄█ ▄▄▀▄\n ▀▄█▄█▄█▄█▄▄█▄█"], ["sleep_1", " \n ▄▄▄▄▄▄ \n ▄▀▄▄▄▄▀▀▀█▄ \n█▄█▀▀ ▄▄▀ ▄▀ \n█ ▀▀ ▄▀ ▄▀ \n ▀█▀▀▀ ▄█ ▄▀ \n █▀█▀▄ ▄ ▄▀█▀█ \n █▄▄█▄█▄▄▄█▄▄▄█ "], ["sleep_2", " \n ▄▀▀▀▀██▄▄ \n ▄ ▄█▄▀▀▀▀ ▄▀▀▄\n █▀▀ ▄▄ ▀█ ▀▄\n ▀▄▄▄▄▄ ▀▄ ▀▄\n ▄▀▄▄ ▀▀▄ ▀▄\n ▄▀██ ▀▄▀ ▄▀█▀█ \n █▄▄█▄▄▄▄▄█▄▄▄█ "], ["walk_1", " ▄▀▀▀▀██▄▄ \n ▄ ▄█▄▀▀▀▀ ▄▀▀▄\n █▀▀ ▄██ ▀█ ▀▄\n ▀▄▄▄▄▄ ▀▄ ▀▄\n ▀▄▄ ▀▀▄ ▀▄\n ▄▀█ ▀▄▀ ▄ █▀▀\n ▀▄█ ▄ ▀▄▄█ \n █▄█▄█ ▀▄█▄█▄█ "], ["walk_2", " ▄▄▄▄▄▄ \n ▄▀▄▄▄▄▀▀▀█▄ \n █▄█▀▀ ▄▄ ▄▄▀ ▄▀\n █ ▀▀▀ ▄▀ ▄▀\n ▀█▀▀▀ ▄█ ▄▀\n ▄█▀▄ ▄ ▀▄▄█\n █ █ ▀ █ ▄█▄ \n █▄█▄█▀▀▀█▄█▄█▄█"]]], + ["firamon", [["angry", " ▄▄▄▄▄▄▄ ▄▄\n ▄▀ ▄▄▄▄ ▀▄▀ █\n █▄▄▀ ▄ ▀▄ █ ▀█\n▄▀ ▄██ █ █▀█\n█▀▀▀▄ ▄▄▀ ▄▀ ▄▀\n █▄▄▄▄▀ ▄▀ ▀▄\n ▀▄ ▄▄▀▄▄▄█ █\n █▄█▄▀█▄▄█ █▄▄▄▀"], ["attack", " ▄▀▀▀▀▀▀█▄ \n ▄▄█▄▄▀▀▀▀▄ ▀▄▀█\n█▄▄▄▄ ▄█▀ █ █▄█\n █████▄ █ ▄█ █\n ████▀ ▄▀ ▄▀ ▀█\n▄█▄▄▄▄▄▀ ▄▀ ▄▀\n█▄█▄ ▄▄▄▀ ▄█▄ ▀▄\n ▀▀█▄▄█ █▄▄▄▀"], ["eat_1", " ▄▀▀▀▀▀▀▀▀▄ ▄▄\n ▄█▄▄▀▀▀▀▄ ▀█ █\n█ ▄▄ ▄▀▀▀ █ █▀█\n ██████ ▄▀ ▄▀█▀\n ███▀ ▄▀ ▄▀ █\n █▄▄▄▄▀ ▄▄▀ ▄▀\n█▄█▄ ▄█ ▄▄█▄ ▀▄\n ▀▀█▄▄█ █▄▄▄█"], ["eat_2", " ▄▄▄▄▄▄▄ ▄▀█\n ▄▀ ▄▄▄▄ ▀█ ▄█\n █▄▄▀ ▄▄ ▀▄ ▀█ █\n▄▀ ▀ ▀ █ █▀▄\n█▀▀▀ ▄▄▀ ▄▀ █\n █▀▀▀▀▀ ▄▀█ █ \n █▄▄ ▄█▀▄▄██ █\n █▄▄██▄▄█ █▄▄▄█"], ["happy", " ▄▀▀▀▀▀▀▀▄ ▄▀█\n ▄▀ ▄▀▀▀▀▄ █ ▄█\n▄▀▀▀ ▄▀▀▄ █ ▀▄ █\n█▄▄▄▄▄ ▄▀ ▄█▀▄\n▀██▄▄▄█ ▄▀ █ █\n ▀▄▄▄▄▀ ▄▀ █ \n █▄ ▄▀▄▄█▄ █\n █▄▄█▄█▄▄█ █▄▄▄▀"], ["injured_1", " \n ▄▄▀▀▀▀▀▀▄ \n ▄▀ ▄▄▀▀▀▄ █ ▄▄\n █▄▀ ▄ █ ▀█ █\n█ ▀▀▄▀ ▄▀▀█\n█▀▀▀ ▄▄▀ ▄▀ ▀▄\n █▀▀▀▀ ▄▄▀█▄▄ ▄▀\n███████▄▄▄█▄▄▄▄█"], ["injured_2", " \n ▄▄▄▄▄▄ \n ▄▀▀ ▄▄▄ ▀▄ ▄▄\n █ ▄▀▀ ▀▄ █▀ █\n▄▀▀ ▀▄▄ █ █▀█\n█▄▄▄ ▄▀ ▄▀▀▀▄\n▀▄▄▄▄▄▀▀ ▄█▄▄ ▄▀\n██▄▄▄▄▄██▄█▄▄▄▄█"], ["sleep_1", " \n ▄▄▄▄▄▄ \n ▄▀▀ ▄▄▄ ▀▄ ▄▄\n █ ▄▀▀ ▀▄ █▀ █\n▄▀▀ ▀▀▀ █ █▀█\n█▄▄▄ ▄▀ ▄▀▀▀▄\n▀▄▄▄▄▄▀▀ ▄█▄▄ ▄▀\n██▄▄▄▄▄██▄█▄▄▄▄█"], ["sleep_2", " \n ▄▄▀▀▀▀▀▀▄ \n ▄▀ ▄▄▀▀▀▄ █ ▄▄\n █▄▀ ▄▄▄ █ ▀█ █\n█ ▄▀ ▄▀▀█\n█▀▀▀ ▄▄▀ ▄▀ ▀▄\n █▀▀▀▀ ▄▄▀█▄▄ ▄▀\n███████▄▄▄█▄▄▄▄█"], ["walk_1", " ▄▄▄▄▄▄▄ ▄▀█\n ▄▀ ▄▄▄▄ ▀█ ▄█\n █▄▄▀ ▄▄ ▀▄ ▀█ █\n▄▀ ██▄ █ █▀▄\n█▀▀▀ ▄▄▀ ▄▀ █\n █▀▀▀▀▀ ▄▀█ █ \n █▄ ▄▄█▀▄▄██ █\n █▄▄█ █▄▄█ █▄▄▄█"], ["walk_2", " ▄▀▀▀▀▀▀▀▄▄ ▄▄\n ▄▀ ▄▀▀▀▀▄ █▀ █\n █▀▀ ▄█▀ █ █▀█\n█▄▄▄ ▀▀▀ ▄▀ ▄▀▄▀\n▀▄▄▄▄▄▄▀▀ ▄▀ █\n █▄ ▄▄▄▀ ▄ █ \n █ ▀▄█ ▀▄▀██ █\n ▀▀▀ ▀▀ ▀▄█▄▄▀"]]], + ["flaremon", [["angry", " ▄▄▀ \n ▄▄████ ▀▀▀██▄ \n █▄█▀▀▀▀▄▀▄ █▄▄ \n▄▀ ▄█ ▄▀ ▄▀ \n█▀▀ ▀▀▀▄▀▄▄▄▄█ \n█▀▄▄▄▄▄█▄██ █ \n█ ▀▀▄▄ ▀█▀▀ █▄ \n▀▄▄▄█▄█▀▀█▄▄▄█▄█"], ["attack", " ▄▄▀▀▄▄▄▄▄ \n █▀███▄▄ ▄ ▀█▀\n █▀▀▀ ▄▀ █ █▄\n █▄▄▄ ▄██ ▄▀ ▄▀\n ▄▄████▄▄▄▄█▄ █\n█ ▄██▀▀███▀ \n▀▄▄███ ▄ ▀▄ \n █▄▄▄█▀▀▀▄▄▄▄▄█"], ["eat_1", " ▄▄▄▄▀▀▄▄▄ \n █▀███▄▄▄ ▄ ▀█▄\n █▀▀▀ ▄ ▀ █ █▄\n █▄▄▄▄ ▀ ▀ ▄█ ▄▀\n█ ▀███ ▄▀ ▄▄▄▀\n█ █▀▀ ▄█▄▄▀▀█ \n ▀▀███▀ ▄▀▀ █▄ \n █▄▄▄█▀▀█▄▄▄█▄█"], ["eat_2", " ▄▄▀ \n ▄▄███ ▀▀▀▀██▄ \n █▄█▀▀▀▀▄▀▄ █▄▄ \n▄▀ ▄▀▄ ▄█ ▄▀ \n█▀▀ ▄▄▀▄▄▄▄█ \n█▀█████▄▄██ █ \n█ █▄▄ ▀█▀▀ █▄ \n ▀██▄▄█▀▀█▄▄▄█▄█"], ["happy", " ▄▄▄▀▀▄▄▄▄ \n █▀███▄▄▄ ▄ ▀█▀\n█▀█▀▀▀ ▄ ▀ █▀ █\n██▄▄▄▄ ▀ ▀ ▄█ █\n█ █████ ▄█▀ ▄▀ \n ▀▄█▀▀ ▄████▀ \n ▄██▀ ▀▀▀▀▄▄ \n █▄▄▄█▀▀▀█▄▄▄▄█"], ["injured_1", " ▄ \n ▄▄█▀▄▄▄▄▄▄ \n █▀███▄▄ ▄ ▀█▀ \n █▀▀ ▄ ▀ █ ▀▀█ \n█▄▄▄ ▀▀ █▀ ▀▄ \n▄█▀▀▀ ▄▄█▄█▀▀█▀ \n█ ▀▀██▀▀▀█▀▀ █ \n▀▄▄▄█▄█▀▀█▄▄▄██ "], ["injured_2", " \n ▄▄▄ \n ▄████ ▀▀▀▀██▄ \n █▄█▀▀▀▀▄▀▄ █▄▄ \n▄▀ ▀▄▄ ▄█ ▄▀ \n█▀▀ ▄▄█▄▄▄▄█ \n█▀▀▀██████▀▀ █ \n▀▄▄▄█▄█▀▀█▄▄▄██ "], ["sleep_1", " \n ▄ \n ▄▄▀▀▄█ ▀▀▄▄▄ \n▄▀ ▄▄██▀ ▀█▀ \n█▄▀█▄█▀▀▀▄▀▄ ▀▀█\n▄▀ ▄▀ ▀▄\n█▀▀▀▄ ▀▀▄▀▀▀▀█▀▄\n█▄▄▄█▄▄▄█▄▄▄▄█▄█"], ["sleep_2", " \n ▄▄ ▄▀▄▄ \n ▄▀▀ ▄██ ▀██▄ \n█ ▄█▀██▄▄ ▄ █▄▄\n▀█ ▀▀▀ ▀ █ ▄▀\n█ ▄▄ ▄▄ █▄ ▄▀\n█▀▀▀▄ ▄▀▀▀▀█▀▄\n█▄▄▄█▄▄▄█▄▄▄▄█▄█"], ["walk_1", " ▄▄██▀▄▄▄▄▄▄ \n █▀██▄▄▄ ▄ ▀█▀ \n █▀▀ ▄▄▀ █ ▀▀█ \n█▄▄ ▀▀ █▀ ▀▄ \n▀▄▄▄▄▄▄▀▀▄█▀▀█▀ \n█ ██▀▀▀███▀ █ \n█ ▀▀▄▄▄ ▄█▄▄█ \n▀▄▄▄█▄▄█▀▀▄▄▄▄█ "], ["walk_2", " ▄▄▀ \n ▄▄███ ▀▀▀▀██▄ \n █▄█▀▀▀▀▄▀▄ █▄▄ \n▄▀ ▄█▀ ▄█ ▄▀ \n█▀▀ ▄▄▀▄▄▄▄█ \n█▀█████▄▄██ █ \n█ █▄▄ ▀█▀▀ █▄ \n ▀██▄▄█▀▀█▄▄▄█▄█"]]], + ["flarerizamon", [["angry", " ▄▀▀▀▀█▄ ▄█ \n ▄▀▀ ▄ █▀ █ ▄\n█ ▄▄ ▀▀ ▄█▄█ ▄█\n ███████ ▀██▀ █\n ▄▀▀▀▀▀▀ ▄▀█ █ \n █▀█▀ █ █▄▀ \n ▄▄▀█▄ ▀█▀▀▀▄ \n█▄█▄▄██▀▀█▄█▄█▄█"], ["attack", " ▄▄▄▄▄ ▄ \n ▄▄▀ ▀█▄▀█ \n▄▀ ▄█▀ █ ▄▀ █\n▀▄▄▀▀▄▄▄▄▀███▄▀█\n ▀▄▄▄▄▄ ▄█▀ ▄▀\n ▄▀█ ▄▀ █ ▄▀ \n ▄█▄█ ▀▄▄▀▀▀▄ \n█▄█▄▄██▀▀█▄█▄█▄█"], ["eat_1", " ▄▄▄▄▄ ▄ \n ▄▄▀ ▀█▄▀█ \n▄▀ ▄▀▄ █ ▄▀ █\n▀▄▄▀▀▄▄▄▄▀███▄▀█\n ▀▄▄▄▄▄ ▄█▀ ▄▀\n ▄▀█ ▄▀ █ ▄▀ \n ▄█▄█ ▀▄▄▀▀▀▄ \n█▄█▄▄██▀▀█▄█▄█▄█"], ["eat_2", " ▄▀▀▀▀█▄ ▄█ \n ▄▀▀ ▄▄ █▀ █ ▄\n█ ▄▄ ▀▀ ▄█▄█ ▄█\n ███████ ▀██▀ █\n ▄▀▀▀▀▀▀ ▄▀█ █ \n █▀█▀ █ █▄▀ \n ▄▄▀█▄ ▀█▀▀▀▄ \n█▄█▄▄██▀▀█▄█▄█▄█"], ["happy", " ▄▀▀▀▀█▄ ▄█ \n ▄▀▀ ▄ █▀ █ ▄\n█ ▄▄ ▀ ▀▄█▄█ ▄█\n▄███████ ███▀ █\n█ █▀▀▀▀▀ █ ██ \n ▀█▀█▀ ▀██▀ \n ▄▄▀█▄ ▄▀▀▀▄ \n█▄█▄▄██▀▀█▄█▄█▄█"], ["injured_1", " \n ▄▀▀▀▀█▄ ▄█ \n ▄▀▀ ▄ █▀ █ ▄\n█ ▄▄ ▀▀ ▄█▄█ ▄█\n █▀ ▀▀▀▀ ▀██▀ █\n ▀██▀▀ ▄▀█ ▄▀\n ▄█▄█ █ █▄▀▄ \n█▄█▄▄██▀████▄█▄█"], ["injured_2", " \n ▄▄▄▄▄ \n ▄▄▀ ▀█▄▀█ \n▄▀ █▄ █ ▄▀ █\n▀▄▄▀▀▄▄▄▄▀███▄▀█\n ▀▄▄▄▄▄ ▄█ ▄▀\n ▄▄▀█ ▄▀ █▄█▄ \n█▄███▄▄▄█▄▄█▄█▄█"], ["refuse", " \n ▄▀▀▀▀█▄ ▄█ \n ▄▀▀ ▄ █▀ █ ▄\n█ ▄▄ ▀▀ ▄█▄█ ▄█\n █▀ ▀▀▀▀ ▀██▀ █\n ▀██▀▀ ▄▀█ ▄▀\n ▄█▄█ █ █▄▀▄ \n█▄█▄▄██▀████▄█▄█"], ["sleep_1", " ▄▄▄▄▄ ▄ \n ▄▄▀ ▀█▄▀█ \n▄▀ ▄▄ █ ▄▀ █\n▀▄▄▀▀▄▄▄▄▀███▄▀█\n ▀▄▄▄▄▄ ▄█▀ ▄▀\n ▄▀█ ▄▀ █ ▄▀ \n ▄█▄█ ▀▄▄▀▀▀▄ \n█▄█▄▄██▀▀█▄█▄█▄█"], ["sleep_2", " \n ▄▀▀▀▀█▄ ▄█ \n ▄▀▀ █▀ █ ▄\n█ ▄▄ ▀▀ ▄█▄█ ▄█\n █▀ ▀▀▀▀ ▀██▀ █\n ▀██▀▀ ▄▀█ ▄▀\n ▄█▄█ █ █▄▀▄ \n█▄█▄▄██▀████▄█▄█"], ["walk_1", " ▄▀▀▀▀█▄ ▄█ \n ▄▀▀ ▄▄ █▀ █ ▄\n█ ▄▄ ▀▀ ▄█▄█ ▄█\n █▀ ▀▀▀▀ ▀██▀ █\n ▀██▀▀ ▄▀█ █ \n █ █ █ █▄▀ \n ▄▄▀█▄ ▀█▀▀▀▄ \n█▄█▄▄██▀▀█▄█▄█▄█"], ["walk_2", " ▄▄▄▄▄ ▄ \n ▄▄▀ ▀█▄▀█ \n▄▀ ▄█▀ █ ▄▀ █\n▀▄▄▀▀▄▄▄▄▀███▄▀█\n ▀▄▄▄▄▄ ▄█▀ ▄▀\n ▄▀█ ▄▀ █ ▄▀ \n ▄█▄█ ▀▄▄▀▀▀▄ \n█▄█▄▄██▀▀█▄█▄█▄█"]]], + ["floramon", [["angry", " ▄▀▀▄▀▀▀▀▀▄ \n █ ▄ ▀ ▄ █ \n ▀▄ ▀ ▀ ▄▄▀ \n █ ▀▀▀ █ \n █▀▄ ▄ ▄▀█ \n █ █▀▄▀▀▀█▀ █ \n ▀█▀ ▀▀█▀ \n █▄▄▄▀▀▀▀▄▄▄█ "], ["attack", " ▄▀▀▄▀▀▀▀▀▄ \n █ ▄ ▀ ▄ █ \n ▀▄ ▀ ▀ ▄▄▀ \n █ ▄████▄ █ \n █▀▄██▀▀▀█ ▄▀▀█\n ▀▄ █▀█▀▀▀█▀▄▀▄▀\n █▀ ▀█▀ \n █▄▄▄▀▀▀▀▄▄▄█ "], ["eat_1", " ▄▀▀▀▄▀▀▀▀▄ \n █ ▄ ▀ ▄ █ \n ▀▄ ▀ ▀ ▄▄▀ \n █ █████ █ \n █▄ ███▀█ █ \n █ ▀▄▀▄▄▄▀▄▄▀▀█\n ▀█▀ ▀▄▄▀ \n █▄▄█▀▀▀▄▄▄█ "], ["eat_2", " ▄▀▀▀▄▀▀▀▀▄ \n █ ▀ █ \n ▀▄ █ █ ▄▄▀ \n █ ▄▄▄ █ \n ▀▄ ▄ ▄▀ \n ▄▀█▀▄▀▀█▀▄▀▄ \n █▄█▀ ▀▄▄█ \n █▄▄█▀▀▀▄▄▄█ "], ["happy", " ▀ ▄▀▀▀▄▀▀▀▀▄ ▀ \n▄ █ ▄▀▄ ▄▀▄ █ \n ▀▄ ▄▄▄▄▄▄ ▄▀ ▀\n▄ █ ██████ █ ▄\n █▄ █ ▀ █ ▄█▄ \n █▄ ▀▄▀█▀▀▄▀ ▄▄█\n ▀█▀ ▀█▀ \n █▄▄█▀▀▄▄▄█ "], ["injured_1", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ █ ▀▄ \n ▀▄ ▄ ▄ ▄▀ \n █ ▀ ▀ █ \n ▄▀▄▄▄▀▄▄▄▄▀▄ \n █ ▀▄▀ ▀ ▀▄▀ █ \n ▀▀█▄▄▄█▄▄▄▄█▀▀ "], ["injured_2", " \n \n ▄▀▀▀▄▀▀▀▀▄ \n █ █ \n ▄▀▄█ █▄ ▀▄ \n ▀▄ ▄ ▄▀ \n █ ▀█▀▄▀▀█▀▄█ \n █▄▄█▄▄▄▄▄█▄▄▄█ "], ["sleep_1", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ █ ▀▄ \n ▀▄ ▄▄▀ \n █ ▀▀ ▀▀ █ \n █▀▀▄▄▄▀▄▄▄▄▀▀█ \n ▀▄▀▄█ ▀ █▄▀▄▀ \n ▀█▄▄▄▄▄▄█▀ "], ["sleep_2", " ▄▄▄ ▄▄▄▄ \n ▄▀ █ ▀▄ \n █ ▄▄ ▄▄ █ \n ▄▀ ▄▄ ▀▀▄ \n █ █ \n █▀▀▄▄▄▀▄▄▄▄▀▀█ \n ▀▄▀▄█ ▀ █▄▀▄▀ \n ▀█▄▄▄▄▄▄█▀ "], ["walk_1", " ▄▀▀▀▄▀▀▀▀▄ ▀ \n █ ▀ █ ▄\n ▀▄ █ █ ▄▄▀ \n █ ▄▄ █ ▀ \n▄█▄ ▄ ▄▀ \n█ ▄▀█▀▄▀▀██▀▄ \n ▀▄█▀ ▀▄▀ █ \n █▄▄█▀▀▄▄▄█▀▀ "], ["walk_2", " ▄▄▄ ▄▄▄▄ ▄▀▄\n ▄▀ █ ▀▄ ▀ \n █ █ █ █ ▀\n ▄▀ ▄ ▄ ▀▀▄ ▀ \n █ █▀█ █ \n█▀▀▄▄▄▀▄▄▄▄▀▀█ \n▀▄▀▄█ ▀ █▄▀▄▀ \n ▀█▄▄█▄▄▄█▀ "]]], + ["flymon", [["angry", " ▀█▀▀▄ ▀█▀▄▄ \n ▄▄ ▀▄ █ █ ▀▄\n▄▄ █▄█▄▄ █ █\n ███▀ ▄▀█ ▄█▄\n ████▄█▀ ████▀█\n█ ▄██▄ █ █▀█ ▄▀\n▀▄▄██▄▄▀ ▄█ █▀ \n ▀▄▄▄▄▄▄▀█▀█ "], ["attack", " \n ▀▀▀▄ \n▄▀███▀▀▀▄ \n ██▀ ▄ █▀▀▄▄ \n▄▀▀▄ ▀▀ █ ▀▄\n▀▄▄█ ▄█ █\n ▀▄▀██▄█ ▄▀ \n █▄▄▀▀▄▄▄▀▀ "], ["eat_1", " \n ▀▀▀▄ \n▄▀███▀▀▀▄ \n ██▀ ▄ █▀▀▄▄ \n▄▀▀▄ ▀▀ █ ▀▄\n▀▄▄█ ▄█ █\n ▀▄▀██▄█ ▄▀ \n █▄▄▀▀▄▄▄▀▀ "], ["eat_2", " ▄▄▄ \n ▀█▀▀▄▄ █ ▀▄\n▀▀▄▀▄ ▀▄ █ █\n▀▀▄██▀▀▀█▄█ ▄▀\n ██▀ ▄▀▄ █▄▄▀▀ \n▄▀██▀▄ ██▀███▄\n▀▄██▄█▄▄▀ █ █▄▀\n █▀▀▀█▀█▀█ "], ["happy", " ▄▄▄ \n ▀█▀▀▄▄ █ ▀▄\n▀▀▄▀▄ ▀▄ █ █\n▀▀▄██▀▀▀█▄█ ▄▀\n ██▀ ▄▀▄ █▄▄▀▀ \n▄▀██▀▄ ██▀███▄\n▀▄██▄█▄▄▀ █ █▄▀\n █▀▀▀█▀█▀█ "], ["injured_1", " \n \n \n ▄▀▀ ▄▄ \n ▄▀▀▀██▄▀▀▀▄ \n █ ▀█ █ \n █ ▀▀ ▄▀ █ \n ▀▄▄▄▄█▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n \n ▄▀▀ ▄▄ \n ▄▀▀▀██▄▀▀▀▄ \n █ ▀█ █ \n █ ▀▀ ▄▀ █ \n ▀▄▄▄▄█▄▄▄▄▄▄▄▀ "], ["refuse", " \n ▀▀▀▄ \n▄▀███▀▀▀▄ \n ██▀ ▄ █▀▀▄▄ \n▄▀▀▄ ▀▀ █ ▀▄\n▀▄▄█ ▄█ █\n ▀▄▀██▄█ ▄▀ \n █▄▄▀▀▄▄▄▀▀ "], ["sleep_1", " \n \n \n ▄▀▀ ▄▄ \n ▄▀▀▀██▄▀▀▀▄ \n █ ▀█ █ \n █ ▀▀ ▄▀ █ \n ▀▄▄▄▄█▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n \n \n ▄▀▀ ▄▄ \n ▄▀▀▀██▄▀▀▀▄ \n █ ▀█ █ \n █ ▀▀ ▄▀ █ \n ▀▄▄▄▄█▄▄▄▄▄▄▄▀ "], ["walk_1", " ▀█▀▀█ ▀█▀▄▄ \n ▄▄ ▀▄ █ █ ▀▄\n ▄▄▀▄▀ █▀ █\n▀ ▄██▀▀▀▄▀ ▄▄▀ \n ██▀ ▄ ███▄▄▄ \n▄▀▀▄ ▀ ██▀████\n▀▄▄█ ▄▄▀ █ █▄▀\n █▀▀▀█▀█▀█ "], ["walk_2", " \n ▀▀▀▄ \n▄▀███▀▀▀▄ \n ██▀ ▄ █▀▀▄▄ \n▄▀▀▄ ▀▀ █ ▀▄\n▀▄▄█ ▄█ █\n ▀▄▀██▄█ ▄▀ \n █▄▄▀▀▄▄▄▀▀ "]]], + ["frigimon", [["angry", " ▄▄▄▄▄▄▄ \n ▄▀ ▀▄ \n █ ▄ █ \n █▀▀ ▀▀ █ \n▄▀▀ ▄▀▀▀▄ ▄█▀▀▄\n▀▄ ▄ ▄▄▀\n █ ▄ ▄█ \n█▄█▄▄▄▄▄▄▄▄▄█▄▄█"], ["attack", " ▄▀▀▀▀▀▀▄ \n █▄ ▄█▀ █ \n █▄▄▄▄▄▄▄ █ \n▄▀██▀▀▀▀▀▀█▄▀▀▄ \n▀▄▀▄▄▄▄▄▄▄▀ ▄▀ \n █ ▄ ▀█ \n ▄█ ▄ ▄▀▀▄ \n█▄▄█▄▄▄▄▄▄█▄▄▄▀ "], ["eat_1", " ▄▀▀▀▀▀▀▄ \n █ ▀ ▀ █ \n █ ███▀▀█ █ \n █▄ ▀▀▀▀ ▄█ \n▄▀ ▀ ▀▀▀ ▀▄ \n█ ▀ █ \n█ ▀ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ "], ["eat_2", " ▄▄▄▄▄▄ \n ▄▀ ▀▄ \n ▄█▀▄ ▄▀▄ █ \n █ ▀ █ \n ▄▀▄ ▄▄▄▀▄ \n █ ▄ █ \n █ ▄ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["happy", " ▄▀▀▀▀▀▀▄ \n █▀▀ ▀▀ █ \n █ █▄▄▄▄██ █ \n▄▀█ ▀███▀ ▄▀▀▄ \n▀▄ ▀ ▀ ▄▀ \n █ ▀ ▀█ \n █ ▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["injured_1", " \n ▄▄▄▄▄▄ \n ▄▀ ▀▄ \n ▄▀▄ ▄ █ \n █▀ ▄ ▀ █ \n▄▀ ▀ ▀▀ ▀▄ \n█ ▀ █ \n▀▄▄▄▄█▄▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n ▄▀▀▀▀▀▀▄ \n █ █ \n █ ▄ ▄ █ \n █▀▀▄ ▀▀ ▄█▀▄ \n█ ▀ ▀ █ \n▀▄▄▄▄█▄▄▄▄▄▄▄▄▀ "], ["sleep_1", " ▄▄▄▄▄▄ \n ▄▀ ▀▄ \n ▄▀ ▄▄▄ █ \n █ ▀ █ \n ▄▀▄ ▄▄▄▀▄ \n █ ▄ █ \n █ ▄ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["sleep_2", " ▄▀▀▀▀▀▀▄ \n █ ▄▄▄ █ \n █ ▀ █ \n ▀▄ ▄▀ \n ▄▀ ▀ ▀▀▀ ▀▄ \n █ ▀ █ \n █ ▀ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["walk_1", " ▄▀▀▀▀▀▀▄ \n █ █ \n █ ▀ ▄ ▀ █ \n ▀▄ ▄▀ \n ▄▀ ▀ ▀▀▀ ▀▄ \n █ ▀ █ \n █ ▀ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["walk_2", " ▄▄▄▄▄▄ \n ▄▀ ▀▄ \n ▄█▄ ▄▄ █ \n █ ▀ █ \n▄▀ ▀ ▀ ▀▄ \n█ ▄ █ \n█ ▄ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ "]]], + ["fufumon", [["angry", " \n ▄ \n ██▀▀▀▄ \n █ ▄█ █ \n ▀▄▄▄ █ \n ▀▀█ █ \n ▄█▄▀ \n ▄▄▄▄ "], ["attack", " ▄ \n ██▀▀▀▄ \n █ ▄█▀ █ \n ▀▄▄▄ █ \n ██ █ \n ▀▀▀█ ▄▀ \n ▄█▄▀ \n ▄▄▄▄▄ "], ["eat_1", " \n █▄▄▄▄ \n ▄▀▀ ▄ ▀▄ \n ▀█▄▀ █ \n ██ █ \n ▀▀▀▀▄ █ \n ▄█▀ \n ▄▄▄▄▄ "], ["eat_2", " \n ▄ \n ██▀▀▀▄ \n █ ▄▀▄ █ \n ▀▄ ▄ █ \n ▀▀▄ ▄▀ \n ▄█▄▀ \n ▄▄▄▄ "], ["happy", " ▄ \n ▄██▀▀▀▄ \n █ ▄▀▄ █ \n █ ▄ █ \n █████ █ \n ▀▀█ ▄▀ \n ▀▄█▄ \n ▄▄▄▄▄ "], ["injured_1", " \n \n \n █▄▄▄▄ \n ▄▀▀▄ █ \n █ ▀▀ █ \n ▀▄██▄ █ \n ▀▄▄▄▄█▄ "], ["injured_2", " \n \n \n ▄ \n ██▀▀▀▄ \n █ ▀▄▄▀▄ \n ▀▄▄▄▄ █ \n ▀▄▄▄▄▄█▄ "], ["sleep_1", " \n ▄ \n ██▀▀▀▄ \n █ ▄▄ █ \n ▀▄▄ █ \n ▄▀▀ ▄▀ \n ▀▀▀▀▀ \n ▄▄▄▄ "], ["sleep_2", " \n ▀▄▄▄▄▄ \n ▄▀▀ ▀▄ \n █ ▀▀ █ \n ▀▄▄▄ █ \n ▄▄▀ ▄▀ \n ▀▀▀▀ \n ▄▄▄▄▄ "], ["walk_1", " \n ▄ \n ██▀▀▀▄ \n █ █ █ \n ▀▄ ▄ █ \n ▀▀█ ▄▀ \n ▄█▄▀ \n ▄▄▄▄ "], ["walk_2", " \n █▄▄▄▄ \n ▄▀▀ ▄ ▀▄ \n █ ▀ █ \n ▀▄█▄ █ \n █ █ \n ▄█▀ \n ▄▄▄▄▄ "]]], + ["fugamon", [["angry", " \n ▄▄████▄ \n ██▀ ▀██▄ \n ▄█ ▄█ ███ \n ▄▀█▄▄▄▄▄ ██▀ \n█ ▄█▄▄▄▄▄█▄▀ █ \n█ █▄▄▄ █ █ █▄\n ▀█▄▄▄▄█▀▄▄▄▄█▄█"], ["attack", " ▄▄▄█████▄ \n ▄█▄▄▄▄▄ ███▄ \n █ █▄█ ██ ███ \n ▀███████ █ ▀▄\n ▄█▀█▀█▀██ █ █\n█ █▀▀▀▀▀▀ ▄█▀▀ █\n█▀ ▀█▀█▀▀▀ █▄▄█▄\n▀▄▄█▄▄▄█▀▀▀▄▄▄▄█"], ["eat_1", " ▄▄████▄ \n ██▀ ▄▄▀██▄ \n █ ▀ ▀ ███ \n ▀███████ ███▄ \n ▄██▀▀▀▀██ █ █\n█▄▀ ▄▀▀ ▄█▀▀ █\n██▄▄█▀█▀▀▀ █▄▄█▄\n▀▄▄█▄▄▄█▀▀▀▄▄▄▄█"], ["eat_2", " \n ▄▄████▄ \n ██▀ ▄▄▀██▄ \n ▄▄▄█ ▀ ▀ ███ \n█ ▄█▄▄▄▄▄▄▀ ██▀ \n█ ▀▄▄▄▄▄▄▄▀ █ \n ▀▀█▄▄▄ █ █ █▄\n █▄▄▄▄█▀▄▄▄▄█▄█"], ["happy", " ▄▄████▄ \n ██▀ ▄▄▀██▄ \n █ ▀ ▀ ███ \n ▀███████ ███▄ \n ▄█▀█▀█▀██ █ █\n█ █▀▀▀▀▀▀ ▄█▀▀ █\n█▀ ▀█▀█▀▀▀ █▄▄█▄\n▀▄▄█▄▄▄█▀▀▀▄▄▄▄█"], ["injured_1", " \n ▄▄▄▄ \n ▄██▀▀▀██▄ \n █▀ ▄ ▀██▄ \n ▄▄▀ ▀▀ ███ \n▄█▄█▀▀▀▀▀▀ ▄▀██▄\n█ ▀ █▀▀▀▀█▀▀█ █\n█▄▄▄█▄▄▄█▄▄▄▄▄▄█"], ["injured_2", " \n \n ▄▄████▄ \n ██▀ ▀██▄ \n █ █▄ ███ \n▄██▄▄▄▄▄▄ ████▄\n█ ▀ █▄▄▄▄█▀▀█ █\n█▄▄▄█▄▄▄█▄▄▄▄▄▄█"], ["sleep_1", " \n ▄▄▄▄ \n ▄██▀▀▀██▄ \n █▀ ▀██▄ \n ▄▄▀ ▀▀ ███ \n▄█▄█▀▀▀▀▀▀ ▄▀██▄\n█ ▀ █▀▀▀▀█▀▀█ █\n█▄▄▄█▄▄▄█▄▄▄▄▄▄█"], ["sleep_2", " \n ▄▄████▄ \n ██▀ ▀██▄ \n ▄▀ ▄▄ ▄ ███ \n ▄▀▄▄▄▄▄▀█ ███ \n▄█▄█▀▀▀▀▀▀ ▄▀▄█▄\n█ ▀ █▀▀▀▀█▀▀█ █\n█▄▄▄█▄▄▄█▄▄▄▄▄▄█"], ["walk_1", " ▄▄▄████▄ \n ██▀ ▄ ▀██▄ \n ██ █▀ ▄ ███ \n ▀▄▄▄▄█▀█ ███▄ \n ▄█▀█▀█▀██ █ █\n█ █▀▀▀▀▀▀ ▄█▀▀ █\n█▀ ▀█▀█▀▀▀ █▄▄█▄\n▀▄▄█▄▄▄█▀▀▀▄▄▄▄█"], ["walk_2", " \n ▄▄████▄ \n ██▀ ▄ ▀██▄ \n ▄▄▄█ █▀ ▄ ███ \n█ ▄█▄▄▄▄▄▄▀ ██▀ \n█ ▀▄▄▄▄▄▄▄▀ █ \n ▀▀█▄▄▄ █ █ █▄\n █▄▄▄▄█▀▄▄▄▄█▄█"]]], + ["gabumon", [["angry", "█▀▄ ▄▄▄▄▄▄▀▀▀█ \n▄▀ ▀ ▄▄ ▄▄█▀ \n▀▀▀▄ ██ ▄█ \n █ ▀██ \n ▄▀▀ ▄ ▀▀██▄ \n▄▀▀█▀▀ ▄▀▀▄ █ \n▀▄▄█▄ ▀▄▄▄▄█ \n█▄█▄█▀▀▀▀█▄▄█▄█ "], ["attack", " ▄▄ \n ▀▄▀▄▀▀▀▀▀▄▄ \n ▄▀ ▄█▀ ▀▄▄▀▀▄ \n ▀▄▄▄▀▀▀ ▄█▀▀▀ \n ▀▄▄▄ ▄▀█ \n▄▀▀▄▀ ▄▀▀ █ \n▀▄▄█▄ ▀▄▄██ \n █▄█▄█▄▄██▄█▄█ "], ["eat_1", " ▄▄ \n ▀▄▀▄▀▀▀▀▀▄▄ \n ▄▀ ▄█▀ ▀▄▄▀▀▄ \n ▀▄▄▄▀▀▀ ▄█▀▀▀ \n ▀▄▄▄ ▄▀█ \n▄▀▀▄▀ ▄▀▀ █ \n▀▄▄█▄ ▀▄▄██ \n █▄█▄█▄▄██▄█▄█ "], ["eat_2", "█▀▄ ▄▄▄▄▄▄▀▀▀█ \n▄▀ ▀ ▄▄ ▄▄█▀ \n▀▀▀▄ ██ ▄█ \n █ ▀██ \n ▄▀▀ ▄ ▀▀██▄ \n▄▀▀█▀▀ ▄▀▀▄ █ \n▀▄▄█▄ ▀▄▄▄▄█ \n█▄█▄█▀▀▀▀█▄▄█▄█ "], ["happy", "█▀▄ ▄▄▄▄▄ \n▄▀ ▀ ▄▄ ▀▀▄▄ \n▀▀▀▀▄▀ ▀▄▀▄▄█ \n █ ▀██ \n ▄▀▀ ▄ ▀▀██▄ \n▄▀▀█▀▀ ▄▀▀▄ █ \n▀▄▄█▄ ▀▄▄▄▄█ \n█▄█▄█▀▀▀▀█▄▄█▄█ "], ["injured_1", " ▄▄ \n ▀▄▀▄▀▀▀▀▀▄▄ \n ▄▀ ▀▄▄▀▀▄ \n ▀▄▄▄ ▀▄▄ ▄█▀▀▀ \n ▀▄▄▄ ▄▀█ \n▄▀▀▄▀ ▄▀▀ █ \n▀▄▄█▄ ▀▄▄██ \n █▄█▄█▄▄██▄█▄█ "], ["injured_2", " ▄▄ \n ▀▄▀▄▀▀▀▀▀▄▄ \n ▄▀ ▀▄▄▀▀▄ \n ▀▄▄▄ ▀▀ ▄█▀▀▀ \n ▀▄▄▄ ▄██ \n ▄▄▄▀ ▄███ \n █ ▀▀ █ ▀ █▀▄ \n █▄▄▄▄▄█▄▄▄█▄▄█ "], ["refuse", " ▄▄ \n ▀▄▀▄▀▀▀▀▀▄▄ \n ▄▀ ▀▄▄▀▀▄ \n ▀▄▄▄ ▀▀ ▄█▀▀▀ \n ▀▄▄▄ ▄▀█ \n▄▀▀▄▀ ▄▀▀ █ \n▀▄▄█▄ ▀▄▄██ \n █▄█▄█▄▄██▄█▄█ "], ["sleep_1", " ▄▄ \n ▀▄▀▄▀▀▀▀▀▄▄ \n ▄▀ ▀▄▄▀▀▄ \n ▀▄▄▄ ▀▀ ▄█▀▀▀ \n ▀▄▄▄ ▄██ \n ▄▄▄▀ ▄███ \n █ ▀▀ █ ▀ █▀▄ \n █▄▄▄▄▄█▄▄▄█▄▄█ "], ["sleep_2", " ▄▄ \n ▀▄▀▄▀▀▀▀▀▄▄ \n ▄▀ ▀▄▄▀▀▄ \n ▀▄▄▄ ▀▀ ▄█▀▀▀ \n ▀▄▄▄ ▄██ \n ▄▄▄▀ ▄███ \n █ ▀▀ █ ▀ █▀▄ \n █▄▄▄▄▄█▄▄▄█▄▄█ "], ["walk_1", " █▀▄ ▄▄▄▄▄ \n █ ▀ ▄▄ ▄▀▀▄▄ \n █ ██▄ ▀█▄▄█ \n █▀▀ ▀██ \n ▀█▀ ▀▀█▄ \n ▄▀█ █▄▀█▄ \n ▀▄█▄ █ ███ \n █▄█▄█▀▀██▄█▄█ "], ["walk_2", " ▄▄ \n ▀▄▀▄▀▀▀▀▀▄▄ \n ▄▀ ▄█▀ ▀▄▄▀▀▄ \n ▀▄▄▄▀▀▀ ▄█▀▀▀ \n ▀▄▄▄ ▄▀█ \n▄▀▀▄▀ ▄▀▀ █ \n▀▄▄█▄ ▀▄▄██ \n █▄█▄█▄▄██▄█▄█ "]]], + ["gabumon_bond_of_friendship", [["angry", " ▄██▄██ ▄▄ \n ▄▄██▀████▀ █▄ █\n ███▄▄████▀▄█▀▀ \n ▀██████▀ ▄█\n ▄▄▄▄▄█▀▄██▀ ▄▀█\n▄▀▀█▄█▄▀█▄ ▀███▀\n▀▄▄█▄▄████▄▄▀▀ \n █▄██ █▄█▄█ "], ["attack", " ▄▄ ▄▄ \n ▄██████▄ ▄▀▀▄\n ███▀ ▄███▄ ██▄▀\n █████████▄██ ▄\n ▄█▄▄▄██▀███ ██\n ▀█▄▀▄▀▄█▀█▄▄█▄█\n █▄█▀▀██ ██▄█▀ \n█▄██▀▀▀███▄█ "], ["eat_1", " ▄▄ ▄▄ \n ▄██████▄ ▄▀▀▄\n ███▀▄▀███▄ ██▄▀\n █████████▄██ ▄\n ▄█▄▄▄██▀███ ██\n ▀█▄▀▄▀▄█▀█▄▄█▄█\n █▄█▀▀██ ██▄█▀ \n█▄██▀▀▀███▄█ "], ["eat_2", " ▄██▄██ ▄▄ \n▄▄██▀▀███▀ █▄ █ \n███▄▄████▀▄█▀▀ \n ▀██████▀ ▄█ \n▄▄▄▄▄█▀▄██▀ ▄▀█ \n▄▀█▄█▄█▀ ██▀██▀ \n▀▄█▄▄██▄▄█▀▀▀ \n█▄██ █▄█▄█ "], ["happy", " ▄██▄██ ▄▄ \n ▄▄██▀████▀ █▄ █\n ███▄█▄███▀▄█▀▀ \n ▀██▀▀██▀ ▄█\n ▄▄▄▄▄██▄ █▀ ▄▀█\n ▄▀█▄█▄▀█▀██▀██▀\n ▀▄█▄▄█████▀▀▀ \n █▄██ █▄█▄█ "], ["injured_1", " \n ▄▄ ▄▄ ▄▄ \n ▄██████▄ █▄ █\n ███ ▀████▄▄█▀▀ \n █████████▄█▀ ▄█\n ▄█▄▄▄█▀███▀ ▄▀█\n▄▀▀█▄█▄█▀▀▀████▀\n█▄▄█▄▄██▄▄▄█▀ "], ["injured_2", " \n \n ▄██▄██ ▄▀▀▄ \n▄▄█▀█████▀ ██▄▀ \n███▄▄████▀██ ▄ \n▀█▀▀▀██▀███ ▄▀█ \n▄▀▀███▄█▀▀▀███▀ \n█▄▄█▄▄██▄▄▄█▀ "], ["refuse", " ▄▄ ▄▄ \n ▄██████▄ ▄▀▀▄\n ███▀ ████▄ ██▄▀\n █████████▄██ ▄\n ▄█▄▄▄██▀███ ██\n ▀█▄▀▄▀▄█▀█▄▄█▄█\n █▄█▀▀██ ██▄█▀ \n█▄██▀▀▀███▄█ "], ["sleep_1", " \n ▄▄ ▄▄ ▄▄ \n ▄██████▄ █▄ █\n ███▀▀████▄▄█▀▀ \n █████████▄█▀ ▄█\n ▄█▄▄▄█▀███▀ ▄▀█\n▄▀▀█▄█▄█▀▀▀████▀\n█▄▄█▄▄██▄▄▄█▀ "], ["sleep_2", " \n \n ▄██▄██ ▄▀▀▄ \n▄▄███████▀ ██▄▀ \n███▄▄████▀██ ▄ \n▀█▀▀▀██▀███ ▄▀█ \n▄▀▀███▄█▀▀▀███▀ \n█▄▄█▄▄██▄▄▄█▀ "], ["walk_1", " ▄██▄██ ▄▄ \n ▄▄██▀▀███▀ █▄ █\n ███▄▄████▀▄█▀▀ \n ▀█▀▀▀██████▀ ▄█\n ██▀█▀█▀▄██▀ ▄▀█\n ▄▀█▄█▄█▀ ██▀██▀\n ▀▄█▄▄██▄▄█▀▀▀ \n █▄██ █▄█▄█ "], ["walk_2", " ▄▄ ▄▄ \n ▄██████▄ ▄▀▀▄\n ███▀ ▄███▄ ██▄▀\n █████████▄██ ▄\n ▄█▄▄▄██▀███ ██\n ▀█▄▀▄▀▄█▀█▄▄█▄█\n █▄█▀▀██ ██▄█▀ \n█▄██▀▀▀███▄█ "]]], + ["gabumon_x", [["angry", " ▄▄▄ ▄▄▄ \n ▀▄▄█▀▀▀ ▀▀▄▄ \n▄█▄▄ ▄█▀ ▄▄▄ █▄\n█ ▀ ▀▄ ▄█▄▀▀▀\n █▄▄ █▄█▄ ▀█▄▀█\n█ ▀ █▀▄█ ▀ ▄▀▄█\n ▀███▀ ▀▀██▄▄█▀\n █▄▄██▄▄▄██▄█▄█ "], ["attack", " █▀▀▄▄▄▄▀▀█▄▄ \n ▄▀▀ ▄▄ ▄▄██▄\n█▀█▀▄ ██▄ ▄█▄ ▀▀\n▀▄▄▄▄▀▄ ▀▀▀▄ \n ▄▀▀▀▀ █▄▀▄▀▀ █\n ▀▀███▀ ▀▄▄▄█▄\n ▄█▄ █▄▄█▀\n █▄█▄█▀▀▀█▄▄█▄█"], ["eat_1", "█▀▀▄▄▄▀▀▀▀█▄▄ \n▄██▄ ▄█▀ ▄ ▀▄ \n█ ▀ ▀▄▀▀▀ ▄█▀▄██\n ▀██▀▀█▄ █▄ ▀\n ▄▀▀▀▀▀█▄▀▄▄ ▀▄ \n█ ▀▀█▀▀▄ █ ▀ █ \n ▀▄▄█▄ █ ▀█▄█▄ \n █▄█▄█▀▀▀█▄▄█▄█"], ["eat_2", " ▄▄▄ ▄▄▄ \n ▀▄▄█▀▀▀ ▀▀▄▄ \n▄█▄▄ ▄▀▄ ▄▄ ▀▄\n█ ▀ ▀▄ ▄█▄▀██\n █▀▀▀ █▄▀ ▀█ ▄▄\n ▄▀▀█▀ ▄▀ ▄▄ ▀▄█\n █ ██ ▄▀▀ ▄█▄▄█▀\n █▄███▄▄▄█▄█▄█ "], ["happy", " █▀▀▄▄▄▄▀▀█ ▄▄▄\n ▄▀▀ ▄ ▀▀▀▄█▀\n█▀█▀▄▄▀ ▀ ▄█▀▄▄▄\n▀▄▄▄▄▄▀▄ ▄█▀ █\n █▀▀▀▀ ▄▀▄ ▄▀▀ \n █▀█▀▀ █ ▀▄ \n ▄█▄ ▄█▄█ \n █▄█▄█▀▀▀█▄▄█▄█ "], ["injured_1", " ▄▄▄ ▄▄▄ \n ▀▄▄█▀▀▀ ▀▀▄ \n▄█▄▄ █▄▄ ▀▄ ▀▄ \n█ ▀ ▀▄ ▄██▄██\n ▀▄▄ █▄█▄ ▀█ ▀▀\n ▄▀█▀ █ ▄▄ ▀▄ \n █ ▄█ ▄▀▀ ▄█▄▄▀▄\n █▄███▄▄▄█▄█▄█▀"], ["injured_2", " \n █▀▀▄▄▄▄▀▀█▄ \n ▄▀▀▀ ▄ ▄ ▀▄ \n█▀█▀▄ ▀▀▀ █▄ █▄\n▀▄ ▀▄ ▄ ▀██▀██\n █▀▄▄▀▀█▀▄▄ ▀▄ \n █ ▄█ ▄▀▀ ▄█▄▄▀▄\n █▄███▄▄▄█▄█▄█▀"], ["sleep_1", " \n █▀▀▄▄▄▄▀▀█▄ \n ▄▀▀▀ ▄ ▀▀▄ \n█▀█▀▄ ▀▀▀ █▀▄▄█\n▀▄ ▀▄ ▄ ▀█▄ ▀▀\n▄▄▀█▄▄▀█▀▀ ▄█▄██\n█ ▀█ ▄▀▀ █ ▀ █▀\n█▄▄█▄▄█▄▄▄█▄▄▄█ "], ["sleep_2", " ▄▄▄ ▄▄▄ \n ▀▄▄█▀▀▀ ▀▀▄ \n▄█▄▄ ▄▄▄ ▀▄ ▀▄ \n█ ▀ ▀▄ ▄█▀▄██\n ▀▄▄ █▄█▄ ▀█ ▄▄\n▄█ ▄▀▀ ▄▀ ▄▄█▄█\n█ ▀█ ▄▀▀ █ ▀ █▀\n█▄▄█▄▄█▄▄▄█▄▄▄█ "], ["walk_1", " █▀▀▄▄▄▄▀▀█▄ \n ▄▀▀▀ ▄▄ ▀▀▄ \n█▀█▀▄ ██▄ █▀▄▄▀\n▀▄ ▀▄ ▄ ▀▄█ ▀▀\n ▀█▄▄▀▀▄▄ ▀▄▀█\n ▄▀▄▀ █ ▄█ ▀▄▀\n ▀▄▀▄ █▀▀ █▄▄█▀\n █▄▀▄▀▀▄▄▄▀▀▄▀▄▀"], ["walk_2", " ▄▄▄ ▄▄▄ \n ▀▄▄█▀▀▀ ▀▀▄▄ \n▄█▄▄ ▄█▀ ▄▄ ▀▄\n█ ▀ ▀▄▀▀▀ ▄█▄▀██\n ▀▄▄ █▄▀ ▀█ ▄▄\n ▄▀ █▀ ▄▀ ▄▄ ▀▄█\n █ ██ ▄▀▀ ▄█▄▄█▀\n █▄███▄▄▄█▄█▄█ "]]], + ["gaiomon", [["angry", " ▄▄ ▄ \n▄▀ █▄████▀▀ █▄▄ \n█▄███▀▀ ███▀ ▄▀\n▀█▀▀▀██▀▀ ▄█▄▄ █\n █▄▄▄▄▄████▀ █ \n █ █ ▀▀▀ █ ▀██ \n ▄███▄█▄██████▄ \n█▄█▄██▀▀██▄█▄█▄█"], ["attack", " ▄▄ ▄ \n ▄▀ █▄████▀▀ █▄▄\n █▄███▀▀ ███▀ ▄▀\n ▀█▀▀▀██▀▀ ▄█▄ █\n█▀▄▀▄▄▄▄▄█▀█▀ █ \n█ ▀▄ █▀▄▄ ▄█▀█▄ \n█ ▀▀▄ ▀█▀ ▄██ \n ▀▄▄▄▄█▄▄█▄▄██▄█"], ["eat_1", " ▄▀█ ▄▄▄▄▄▄▀▄ \n█ ▄███▀██▄▄▄▀▀▀▄\n█████▄█▄█▀▀▄ ▀▄\n ▀▄ ▀▀▄▄▄███▀▄█\n▄▀█ ▄█▀▀██▄▄█ \n▀▄▄██▀▄ ▄█▀ ▀█▀ \n ▄█▀████▀▄▄█▄ \n █▄█▄█▀▀█▄█▄█▄█ "], ["eat_2", " ▄▄ ▄ \n▄▀ █▄████▀▀ █▄▄ \n█▄███▀▄▀███▀ ▄▀\n▀█▀▀▀██▀▀ ▄█▄▄ █\n ▀▄▄▄▄▄████▀ █ \n ▄▀█ ▀▀▀ ▄▀ ▀██ \n █▄██▄█▄██▄▄██▄ \n█▄█▄██▀▀██▄█▄█▄█"], ["happy", " ▄▀█ ▄▄▄▄▄▄▀▄ \n█ ▄███▀██▄▄▄▀▀▀▄\n█████▄█▄█▀▀▄▄ ▀▄\n ▀▄ ▀▀ ▄▄█ █▄█\n ▄█▀███▀█ ▄▀▄ \n █▄█▄ ▄ ▄███▀▀ \n █▄▀████▀▀██▄ \n █▄█▄█▀▀█▄█▄█▄█ "], ["injured_1", " \n ▄▀█ ▄▄▄▄▄▄▀▄ \n█ ▄██▀███▄▄▄▀▀▀▄\n██████▄▄█▀█▄▄ ▀▄\n ▀▄ ▀▀ ▄▄█▀ █▄█\n ▄▀██▀▀▀▀██▀█▀ \n ▀█ ▀▄█▄█▀ ██▄ \n █▄█▄█▀▀█▄▄▄█▄█ "], ["injured_2", " \n ▄▄ ▄ \n▄▀ █▄████▀▀ █▄▄ \n█▄███▄▀▀███▀ ▄▀\n▀█▀▀▀██▀▀ ██▀▄ █\n ▄█▄▄▄▄▄███▄▄█▀▀\n█▄█ ▀▄█▄█▀ ██▄ \n █▄█▄█▀▀█▄▄▄█▄█ "], ["sleep_1", " \n ▄▄ ▄ \n▄▀ █▄████▀▀ █▀▀▄\n█▄███▀▀▀███▀ ▀▄\n▀█▀▀▀██▀▀ ▄█▄▀▄█\n▄▄█▄▄▄▄▄▀███▄▄█ \n█ ▀█▄█▄▀ ▀█ █ \n█▄▄▄████▄▄▄▄█▀ "], ["sleep_2", " \n ▄▀█ ▄▄▄▄▄▄▀▄ \n █ ▄██████▄▄▄▀▀▄\n █████▄▄▄█▀▀▄ ▀▄\n ▀▄ ▀▀ ▄▄██▀▄█\n▄▄▄▄▀▀▀▀▀▄██▄▄█ \n█ ▀█▄█▄▀ ▀█ █ \n█▄▄▄████▄▄▄▄█▀ "], ["walk_1", " ▄▀█ ▄▄▄▄▄▄▀▄ \n█ ▄███▀▀█▄▄▄▀▀▀▄\n█████▄▄██▀▀▄ ▀▄\n ▀▄ ▀▀ ▄▄███▀▄▀\n ▄█▀███▀▀██▄▄█ \n █▀█▄ ▄ ▄█▀ ▀█▀ \n ▀▄█▀████▀▄▄█▄ \n █▄█▄█▀▀█▄█▄█▄█ "], ["walk_2", " ▄▄ ▄ \n▄▀ █▄████▀▀ █▄▄ \n█▄███▀ ▄███▀ ▄▀\n▀█▀▀▀██▀▀ ▄█▄▄ █\n ▀▄▄▄▄▄████▀ █ \n▄▀██ ▀▀▀ ▄█▀▀▀█ \n▀▄███▄█▄███▄▄█▄ \n█▄█▄██▀▀██▄█▄█▄█"]]], + ["gallantmon", [["angry", " ▄▄ ▄▄▄ \n ▄██▀█ ▄█ \n █ ▄█▀█▀▀▄ \n ▄▀█▀▀▀▀█▄▀▀▀▄ \n▄▀▄█▀▀▀▀ ▀▄▄▄▀▀▄\n█▀▄█▄█▀▄████▀▀▄█\n▀▄█▀ ▄█ ▄▄██▄▄██\n █▄█▄████▄█▄█ ▀█"], ["attack", " ▄██▄▀█▄▄▄▀▀▀█▀\n▄▀▀▀ ▄█ █ ▀▀▀▄ \n█▄▄██▄▀█ █ █ \n █▄▄▄▄▀▀█▄▀▄▄ █\n▄▀▀▄▄▄ ▄█▄█▄▄▀▀█\n█ ▀▄ ▀█▀██▀ ▀▀▀\n █▄ ▀██▀▄ ▄█▄▄ \n█▄▄█▄█ ▀██▄█▄█ "], ["eat_1", " ▄▄▄██▄▀▀█ \n █ ▄▄▀▄▄█ \n █████▀█ ▄█▄ \n▄▀▀█▄▄▄▄▀█ █▄ \n█▄▄█ ▄▄ ▄▄█▀▀ █▄\n▀▄ ▄▀█▄▀▀██▀▀▄██\n ▄█▀ ▄█ ▄▄█▄▄▀▀█\n █▄█▄████▄█▄█ "], ["eat_2", " ▄▄ ▄▄▄ \n ▄██▀▀ ▄█ \n █ ▄▀ █▀▀▄ \n ▄▀█▀▀▀▀█▄▀▀▀▄ \n ▀▄█▀▀▀▀ ▀▄▄▄▀▄ \n █▄█▄█▀▄███▄▄ █▄\n█▄█▀ ▄█ ▄▄█ ███\n █▄█▄████▄███ ▀█"], ["happy", " ▄▀▀▄██▄▀▀█▀▀▄ \n▄▀▄▀▀▄▀▄▄██▄▄▀▄ \n█ █▄▄▄▄▄█ ██▄ █ \n █ █▄▄▄▄▀█ █ \n ▀██ ▄▄ ▄▄█████ \n █▀█▄▀▀▄▄█████\n ▄▀ ▄█ ▄▄█▄█▀██\n █▄█▄████▄█▄█ ▀"], ["injured_1", " \n ▄██▄▀▀█ \n ▄▀▀▀ ▄▄██ \n █▄▄████ ▄█▄ \n ▄▀█▄▄▄▄▀█ █▄ \n▄▀▀█▄█▀▄██▀▀▀██▄\n▀▄█▀ ▄█ ▄▀▀▄████\n █▄█▄█▀▀█▄▄██ ▀█"], ["injured_2", " \n ▄▄ ▄▄▄ \n ▄██▀▀ ▄█ \n █ ▄▄██▀▀▄ \n ██▀▀▀▀█▄▀▀▀▄ \n▄█▄█▀██▀▄█▄▄▄██ \n▀▄▄▀▀█▄▀█▀▀▄████\n █▄█▄█▀██▄▄██▀██"], ["sleep_1", " ▄▄ ▄▄▄ \n ▄██▀▀ ▄█ \n █ ▀▀▄▀▀▄ \n ▄▀█▀▀▀▀█▄▀▀▀▄ \n ▀▄█▀▀▀▀ ▀▄▄▄▀▄ \n █▄▀▄██▄███▄▄ █▄\n█ ▄█ █▄▄▄█ ███\n ▀█▄█▄██▄█▄█▀ ▀█"], ["sleep_2", " ▄██▄▀▀█ \n ▄▀▀▀▄▄ ██ \n █▄▄▄▄▄█ ▄█▄ \n █ █▄▄▄▄▀█ █ \n ▄▀█ ▄▄ ▄▄█▀▀ █ \n▄▀▀▄▀█▄▀▀██▀▀▄██\n▀▄██ █▄▄▄█▄▄▀██\n █▄█▄██▄█▄█ ▀"], ["walk_1", " ▄██▄▀▀█ \n ▄▀▀▀ ▄▄█▀ \n █▄▄██▄█ █▄▄ \n █ █▄▄▄▄▀█ █ \n ▄▀█ ▄▄ ▄▄█▀▀▄ \n▄▀▀▄▀ ▀█ ▀▄█▄ \n▀▄█▀▀▄█ ▄█▀████▄\n █▄█▄▄█▀█▄█▄█▀▀ "], ["walk_2", " ▄▄ ▄▄▄ \n ▄██▀▀ ▄█ \n █ ▄▄▀█▀▀▄ \n ▄▀█▀▀▀▀█▄▀▀▀▄ \n ▀▄█▀▀▀▀▄█▄▄▄▀▄ \n █▄▀▄█▀▄▀▀██▄▄ █\n▄█ ▄███▄ █ ██\n█▄█▄█▀▀▀ ▀█▄█▀▀█"]]], + ["gallantmon_x", [["angry", " ▄▄▄▄▄ ▄▄▄▄ \n ▄█▄█▀▀ ▀ ▄▀ \n █ ▀ ▄██▀█▄▄ \n █▀▀▀▀█▄▀ ▄█▄ \n ▄█▀▀▀▀▄█▄█▀ ▄█\n █ ▀█▄▄█▄█ █ █ █\n█ ▄█▀▄ ▄▀▀██ ▀▄█\n██▄█▄█▀▀█▄█▄█▄▄▀"], ["attack", " ▄▄▀██▀█▀▀▀█▀▄▄ \n █▀▀ ▄█▄▄▄▀▄▀ ▄█\n ▀▄▄█▄██ █▀█ █ █\n ▄█▄▄▄▄▀█ ▄█ █ █\n█▄▀ █ ▄▀██▄█▄ ▀█\n▀▄ █▀▀▀▄▄███▀▀\n ▀▄ █▄█ ▀███▄\n █▄█▄▄▀ ▀▄█▄▄█▀"], ["eat_1", " ▄▀███▀▄▀▀█▀ \n █▀█▀ ▄▄▄▄▀ \n ▀▄▄▄█▄█ █▀█▄ \n █████ █▄▀ ▄█ \n ▄█▄▀▀▄▀██ █ █ \n █ █▀▀▀███ ▀▄██\n █▀ █▄█ ▀█▄▄▀█\n █▄█▄▄▀ ▀▄█▄▄█ ▀"], ["eat_2", " ▄▄▄▄▄ ▄▄▄▄ \n ▄█▄█▀▀ ▀ ▄▀ \n █ ▀ ▄▀█▀█▄▄ \n █▀▀▀▀█▄▀ ▄█ \n ▄█▀▀▀▀▄█▄▀ ▄█ \n █ ▀█▄▄█▄██ █ █▄\n█ ▄█▀▄ ▄▀▀█ ▀▄██\n██▄█▄▀▀▀▀▄▄█▄▄▀▀"], ["happy", " ▄▄▀███▀▄▀▀█▀ \n █▀█▀ ▄▄▄▄▀ \n▄▀█▄▄▄▀▄▀█ █▄▀▀▄\n▀▄ █▀▀▀▀▀▄▀█ ▄▀█\n ▀██▀▀█▀█▄█ █ █\n █▀▀▀████▄ ▀█\n ▄▀ █▄█ ▀████▄\n █▄█▄▄▀ ▀▄█▄▄█▀▀"], ["injured_1", " \n ▄▀███▀▄▀▀█▀ \n █▀█▀ ▄▄▄▀ \n ▀▄▄▄███ █▄▀█▄▄ \n ▀▄▄▄▄▀▀█ ▄▀ ▄█\n ▄▀▄ ▄▀███ █ █\n █ █▀▀█▀▀██ ▀▄█\n█▄▄███▄█▄▄▄██▄▄▀"], ["injured_2", " \n ▄▄▄▄▄ ▄▄▄▄ \n▄█▄█▀▀ ▀ ▄▀ \n█ ▀ ▄▄█▀█▄▄▀█▄▄ \n █▀▀▀▀█▄▀█ ▄▀ ▄█\n ██▀▀ ▄▀███ █ █\n █ ██▀▀█▀▀██ ▀▄█\n█▄▄███▄█▄▄▄██▄▄▀"], ["sleep_1", " \n \n ▄▀███▀▄▀▀█▀ \n █▀█▀ ▄▄▀ ▄▄ \n ▀▄▄▄▄█▀▄▀█▀ ▄█ \n ▄▀▄▄▄▄▀ ██ █ █▄\n█▀▀██▄▄█▀▀█ ▀▄██\n█▄▄▄█▄▄█▄▄▄█▄▄██"], ["sleep_2", " \n ▄▄▄▄▄ ▄▄▄▄ \n ▄█▄█▀▀ ▀ ▄▀ \n █ ▀ ▄▄▀█ ▄▄ \n █▀▀▀▀▄▀▄▀ ▄█ \n ▄▀█▀▀▀▀ ██ █ █▄\n█▀▀██▄▄█▀▀█ ▀▄██\n█▄▄▄█▄▄█▄▄▄█▄▄██"], ["walk_1", " ▄▀███▀▄▀▀█▀ \n █▀█▀ ▄▄▄▄▀ \n █▄▄▄█▄█ █▀▀▄ \n █▄▄▄▄▀█ ▄▀▀▄ \n ▄▀█▄ ▄▀██ ▄▀█ \n▄▀ ▄█▀▀▀███ █ ██\n█▄█▀ █▄█ ▀▄ ▀██\n █▄█▄▄█ ▀▄█▄█▀ ▀"], ["walk_2", " ▄▄▄▄▄ ▄▄▄▄ \n ▄█▄█▀▀ ▀ ▄▀ \n █ ▀ ▄▀█▀█▄▄ \n █▀▀▀▀█▄▀ ▄█ \n ▄▀█▀▀▀▀▄█▄▀ ▄█ \n█▀ ▄█▄▄█▄██ █ █▄\n█▄█▀▀▄ ▄▀▀█ ▀▄██\n█▄█▄▄▀▀▀▀▄▄█▄▄▀▀"]]], + ["gankoomon", [["angry", " ▀███▄▄▀▀▄███▀ \n ▄ █ ▀█▄█▀ █ ▄ \n█ ▀██▄▄█▄▄██▄▀ █\n█▀▀█ ▄▄▄▄▄ █▀▀▄█\n█ ▄██▄█▄█▄██▄ ██\n█▄▄▄█ ▄▄▄ █▄▄▄▀█\n█▀▄▀▀▀▄▄▄▀▀▀▄ ▀█\n █▄▄▄█ █▄▄▄█ "], ["attack", "▄▄▄ ▄▄▄ ▄▄▄ \n████ ▄████▀ ▄▀▀█\n █▀███▀▀██▄▀ ▀▀▄\n █▄▄█▄▄█▀█▀ ▀▀▄\n█▀█▀▀▀▀▄▀▀▀▄▀▀▀ \n█▄▄▀▀▀▀ ▀▄▄▀▄ ▄▄\n█▄▀▀███▄▀▀▀▄█▀▄▀\n█▄▄▄█ █▄▄▄█▀ "], ["eat_1", "███▄▀▀█▄███ ▄▄▄\n▀███▄█████ ▄▀▄▄▀\n █ ▀█▀ ▄███ ▄▄▀\n▄██████▀▄█▄ ▄▄▄▀\n█ ▀▄▄▄▄▀▄ █ \n█▀█ ▄▄▄ █▀ █ \n▀▄▀▀▄▄▄▀▀▀▄▄▀▀▄ \n█▄▄▄█ █▄▄▄█▀▀▄█"], ["eat_2", "███▄▀▀█▄███ ▄▄▄\n▀███▄█████ ▄▀▄▄▀\n █ ▀█▀ ▄███ ▄▄▀\n▄██████▀▄█▄ ▄▄▄▀\n█ ▀▄▄▄▄▀▄ █ \n█▀█ ▄▄▄ █▀ █ \n▀▄▀▀▄▄▄▀▀▀▄▄▀▀▄ \n█▄▄▄█ █▄▄▄█▀▀▄█"], ["happy", "███▄▀▀█▄███ ▄▄▄\n▀███▄█████ ▄▀▄▄▀\n █ ▀█▀ ▄███ ▄▄▀\n▄██████▀▄█▄ ▄▄▄▀\n█ ▀▄▄▄▄▀▄ █ \n█▀█ ▄▄▄ █▀ █ \n▀▄▀▀▄▄▄▀▀▀▄▄▀▀▄ \n█▄▄▄█ █▄▄▄█▀▀▄█"], ["injured_1", "███▄▀▀█▄███ ▄▄▄\n▀███▄█████ ▄▀▄▄▀\n █ ▀█▀ ▄███ ▄▄▀\n▄██████▀▄█▄ ▄▄▄▀\n█ ▀▄▄▄▄▀▄ █ \n█▀█ ▄▄▄ █▀ █ \n▀▄▀▀▄▄▄▀▀▀▄▄▀▀▄ \n█▄▄▄█ █▄▄▄█▀▀▄█"], ["injured_2", " \n ▄▄ ▄▄▄ ▄▄▄ \n████▀ ▄█████ \n▀███▄█████ ▄▄ \n █████████▄▀ █ \n▄▀▄▄██▄▄▀ █ ▄ █\n▀█▀▄▄▄▄▄█▀▀█▄█▄█\n█▄▄█▄▄█▄█▄▄▄█▄▄█"], ["refuse", "███▄▀▀█▄███ ▄▄▄\n▀███▄█████ ▄▀▄▄▀\n █ ▀█▀ ▄███ ▄▄▀\n▄██████▀▄█▄ ▄▄▄▀\n█ ▀▄▄▄▄▀▄ █ \n█▀█ ▄▄▄ █▀ █ \n▀▄▀▀▄▄▄▀▀▀▄▄▀▀▄ \n█▄▄▄█ █▄▄▄█▀▀▄█"], ["sleep_1", "███▄▀▀█▄███ ▄▄▄\n▀███▄█████ ▄▀▄▄▀\n █ ▀█▀ ▄███ ▄▄▀\n▄██████▀▄█▄ ▄▄▄▀\n█ ▀▄▄▄▄▀▄ █ \n█▀█ ▄▄▄ █▀ █ \n▀▄▀▀▄▄▄▀▀▀▄▄▀▀▄ \n█▄▄▄█ █▄▄▄█▀▀▄█"], ["sleep_2", "███▄▀▀█▄███ ▄▄▄\n▀███▄█████ ▄▀▄▄▀\n █ ▀█▀ ▄███ ▄▄▀\n▄██████▀▄█▄ ▄▄▄▀\n█ ▀▄▄▄▄▀▄ █ \n█▀█ ▄▄▄ █▀ █ \n▀▄▀▀▄▄▄▀▀▀▄▄▀▀▄ \n█▄▄▄█ █▄▄▄█▀▀▄█"], ["walk_1", "███▄▀▀█▄███ ▄▄▄\n▀███▄█████ ▄▀▄▄▀\n █ ▀█▀ ▄███ ▄▄▀\n▄██████▀▄█▄ ▄▄▄▀\n█ ▀▄▄▄▄▀▄ █ \n█▀█ ▄▄▄ █▀ █ \n▀▄▀▀▄▄▄▀▀▀▄▄▀▀▄ \n█▄▄▄█ █▄▄▄█▀▀▄█"], ["walk_2", "▄▄▄ ▄▄▄ ▄▄▄ \n████ ▄████▀ ▄▀▀█\n █▀███▀▀██▄▀ ▀▀▄\n █▄▄█▄▄█▀█▀ ▀▀▄\n█▀█▀▀▀▀▄▀▀▀▄▀▀▀ \n█▄▄▀▀▀▀ ▀▄▄▀▄ ▄▄\n█▄▀▀███▄▀▀▀▄█▀▄▀\n█▄▄▄█ █▄▄▄█▀ "]]], + ["gankoomon_x", [["angry", " ▄▄▄▄▄▄▄▄ \n ▄▀█▀█▀█▀▀█▄ \n █ ▀▄▀ ██▄ ▄\n █▄▄▄▄▀▀█ ▀▀ \n █▄ ▄ ▄▀▀▀▄▄ \n ▄▀▄▀▀▀▀ ▄▀▀ ▄▀\n ▀▄▄▀▀▀▀▀▀▄▄█ \n █▄▄▄▀▀▀▀▀▄▄▄█ "], ["attack", " ▄▄▄██████▀ \n ▄▄█ █ █ ▀ ██▀ \n█ ▀▄ ▀ ▄███▀█▄\n▀▄ █▀▀▀▀ ▄█▄ ▄ \n ▀▄█ █▄█▄▀▄▄▄▀ █\n ▀▄▄▄▄██ ▄▀\n ▄▀ ▄▄▀▀█▀ \n █▄▄▄▀ ▀█▄█ "], ["eat_1", " ▄▀█▀█▀█▀▀██▀ \n █ ▀▄▀ ███▀ \n ▀▄▄▄▄█▀██▄▄ \n ▄▀▀▄████▀ █▄ ▀▀\n █ █▄ ▄ ▄▀▄ █▀▄\n ▀▄▀▄█▀▀▀ ▄█▀ █\n ▄▀▀▀▀▀▀▀▄▄▀ \n █▄▄▄▀▀▀▄▄▄█ "], ["eat_2", " ▄▄▄▄▄▄▄▄ \n ▄▀█▀█▀█▀▀█▄ \n █ ▀▄▀ ▄▄██▄▄ \n █▄▄▄▄▀ █ ▀▀\n ▄▀▄ ▄ ▄▀▀▀▄▄ \n ▄▀▄▀▀▀▀ ▄▀▀ ▄▀\n ▀▄▀▀▀▀▀▀▀▄▄█ \n █▄▄▄▀▀▀▀▀▄▄▄█ "], ["happy", " ▄▀█▀█▀█▀▀█▀ \n █ ▀▄▀ ██▀ \n █▄▄▄▄█▀██▀▀▄\n █▀▀▀▀ ▄█ █\n ▄▄ █▄█▄▀ ▄█ ▄▀\n █ ▀█▄▄▄▄██ ▀ \n ▀▀█▀ ▄▄ ▀▄ \n █▄▄▄▀ ▀▄▄▄█ "], ["injured_1", " ▄▄▄▄▄▄▄▄ \n █████████▄ \n █ █ █ ▀ ▄█▄▄ \n ▀▄ ▀ ▄▄██ ▀█\n █▀▀▀▀ ▄▀ █ \n ▄▀█▄█▄▀ ▄▀ █ \n █ █▄▄▄▄▀ █ \n █▄▄▄▀▄▄█▄▄▄█▄█"], ["injured_2", " \n ▄▄███████▀ \n ▄▀█▀█▀█▀▀█▀ \n █ ▀▄▀ ██▀█▄\n █▄▄▄▄▀▀█▀█ ▀\n ▄▀▄ ▄ ▄▀▄▀ █ \n █ ▀███▄▄▀ █ \n █▄▄▄▀▄▄█▄▄▄█▄█"], ["sleep_1", " \n ▄▄███████▀ \n █▀█▀█▀█▀▀█▀▄▄ \n █ ▀▄▀ ▄██▀▀ \n █▄▄▄▄▀▄█ ▀▄▀▄\n ▄█▄ ▄ ▄▀▄█▀ █\n █ ▀███▄█ ▀▄▄▀\n █▄▄▄█▄▄▄█▄▄▄█ "], ["sleep_2", " ▄▄▄▄▄▄▄▄ \n ▄█████████▄ \n █ █ █ ▀ ▄█▄▄ \n ▀▄ ▀ ▄▀█▄ ▀▀ \n █▀▀▀▀ █▀ ▀▄▀▄\n █▄█▄█▄▀ ▄█▀ █\n █ ▀▄▄▄▄█ ▀▄▄▀\n █▄▄▄█▄▄▄█▄▄▄█ "], ["walk_1", " ▄▄███████▀ \n █ █ █ ▀ ▄█▀ \n ▀▄ ▀ ▄▄█▀█▄ \n █▀▀▀▀ ▄█▄ ▀ \n ▄▀█ █▄█▄▀ ▄ █▀▄\n █ ▀▄▄▄▄▄██▀ █\n ▀▄▄▀ ▄▄ ▀▄▄▀ \n █▄▄▄▀ ▀▄▄▄█ "], ["walk_2", " ▄▄▄▄▄▄▄▄ \n ▄▀█▀█▀█▀▀█▄ \n █ ▀▄▀ ██▄▄ \n █▄▄▄▄▀▀█ ▀▀\n ▄▀▄▀▄ ▄ ▄▀▀▀▄▀▄\n █ ▀▄▀▀▀▀ ▄█▀ █\n ▀▄▄▀▀▀▀▀▀▀▀▄▄▀ \n █▄▄▄▀▀▀▀▀▄▄▄█ "]]], + ["gaogamon", [["angry", " █▀▄ ▄▀█ ▄▄▄\n █▄▀▀▀▀▀ ▄█▀▄ █\n ▄▀ ▄█ █▄▀ ▀▀\n█▀█▀ ▀▀ █▀█ █▀▄\n▀▄▄▄▄▄▄▄▀ ▄█▄▀ █\n ▀▄▄ ▄▄▄▀▄ █▄▀ \n █ ▀▀▄▀ ▄▀ █ \n █▄█▄█▄▄█▄█▄█▄█ "], ["attack", " ▄▄ ▄▄▄▄▀▀█\n ▄▀▄█▄▄▀ ▄▀▄▀█▄\n █▀ ▄█ █▀ █ █\n▄▀▄▄▄▄▀▀ █▄▀ ▄▀\n▀██████▄ █ █ █\n ▄▀▀▀▀▀▄▀▄▀ █ █\n ██▀▀██▄▀ ▄▀█ █\n█▄▄██▄▄▄▄▀ █▄█▄█"], ["eat_1", " ▄▄ ▄▄ \n █ █▄▄▄█ █ ▄▀▀█\n▄▀▀▀ ▄ █▀▄▀█▄\n█▀███▄▀ ▀ █▀ █ █\n ▀▄████ █▀█▄▀ █\n █▄▄▄▄▄▄▀ ▄▀ ▀▄\n █▄▄ ▄▄▄▀▄█▄ █\n█▄▄███▄▄▄█▄▄▄▄▄▀"], ["eat_2", " █▀█ \n ▄▄▄ ▄▄▄▄▀▄▀ \n █▄▀▀▀▀▀ ▄█▀▄▄ \n ▄▀ ▄▀▄ █ █ ▀▄\n█▀█▀ █▀█▄▀ █\n▀▄▄▄▄▄▄▄▀ ▄▀ ▀▄\n █▄▄ ▄▄▄▀▄█▄ █\n█▄▄███▄▄▄█▄▄▄▄▄▀"], ["happy", " ▄▀█▄▄▄ ▄▀█ \n █▀ ▄ ▀ ▄▀ ▄▄▄\n█▀ ▀ ▀ ▄█▄█▄▄█\n█████▄ ▄▀▄▀ █ \n▄█▀▀▀▀▀▄▀▄▀ ▄▀▄▄\n▀▄▀▀▀▀▀▄▄▀ ██ █\n ▀█▄▄▀ ▄ ▄█▄▀\n █▄▄▄█▀▀▀▄▄▄▄█ "], ["injured_1", " \n \n ▄▄ ▄▄▄▄ ▄▄▄ \n █▄▀ ▀ ▄█▀▀▀█\n▄█▄▄ ▀▄▄ ▄█▄▀▀█▀\n█▄█▄▄▄▄▄▀ ▄▀▀▀ █\n▄▀▄▄ ▄▄▄█▀▄▄▀ █\n█▄▄▄██▄▄▄▄█▄▄▄▄▀"], ["injured_2", " \n \n \n █▀▄▀▀▀▀▄▀▀█ \n █▀ ▄ █▄▀▀▀█\n█▀█▀ ▀▀▄█▀▄▀▀▀█\n██▀▀▀▀▀▀ ▄█▄▄▀ █\n█▄██▄▄███▄█▄▄▄▄▀"], ["sleep_1", " \n \n ▄▄▄ ▄▄▄▄█▀█ \n ▀▄▀▀▀▀▀▀ ▄█▀▄▀ \n ▄▀ ▄▄▄ █▄▀▀▄ \n█▀█▀ ▄▀█▀▀▀ █\n██▀▀▀▀▀▀▄█▀▄▄▀ █\n█▄██▄▄██▄▄█▄▄▄▄▀"], ["sleep_2", " \n \n █▀█▄▄▄▄█▀▀█ ▄▄▄\n █ ██▀▄▄█\n▄█▄▄ ▀▀▀ ▄█▄▀▀▄ \n█▄█▄▄▄▄▄▀ ▄▀▀▀ █\n▄▀▄▄ ▄▄▄█▀▄▄▀ █\n█▄▄▄██▄▄▄▄█▄▄▄▄▀"], ["walk_1", " ▄▄▄ ▄▄▄▄▄▀▀█\n █▄▀▀▀▀▀ ▄▀▄▀▀▀\n ▄▀ ▄▀█▀ █▀ ▄▀█\n█▀█▀ ▀▀ █▀█▄█ █\n▀▄▄▄▄▄▄▄▀ ▄▀ █\n ▀▄▄ ▄▄▄▀ ▄ █ \n ▄▀ ▀█ ▄▄▄██ █\n█▄█▄█▄█▄█ ██▄█▄█"], ["walk_2", " ▄▀██▄▄▄▀▀▀█▄▄▄\n █▀ ▄▄▄ ▄▀▄▄▄▀\n▄█▄▄ █▄▀ ▄██ ▄▀█\n█ ▀ ▄▀ █▀ ▄▀\n █▀▀▀▀▀▀ ▄▀ ▄▀ \n▄▀█▀▄▄▀▀▀ █ \n█ █ █▄▄▄▄█ ▀▀█\n ▀▀▀▀ ▀▄█▄▄▄▀"]]], + ["gaomon", [["angry", " ▄▄▄ ▄▄▄ \n █ ▄█▄▄█▄ █ \n █▄▄▄▄▄▄██▄ \n ▄▀▄ ▄█▀ █▄█ \n ▀█ ▀ ▄▀▄ \n ▄▀ ████▀█ ▄ █ \n █▄▀█▄ ▄ █▄█ \n █▄▄▄▄████▄▄▄█ "], ["attack", " ▄▄▄ ▄▄▄ \n █ ▄█▄▄█▄ █ \n █▄▄▄▄▄▄██▀█ \n ▄▄█▄ ▄█▀ ██▄▄\n █ ▀▄▄▄▄▄ ▄█ █\n ▀▀█████ ▄▀▄▄▀ \n ▀▄▄▄▄▀ ▀▄▄ \n █▄▄▄███▄▄▄█ "], ["eat_1", " █▀▀▄ █▀▀█ \n ▀▄▀▀▀▀▀▀▄█ \n █▀▀▀██▀▀█▀▄ \n █▄█▄▄▀ █▀▀ \n █ █▀▀ ▄▄▀▀▀▀▄ \n ▀▄▄▀█▀▀ ▀ ▄█▄▀ \n █▀▄ ▄ █▄▄ \n █▄▄▄███▄▄▄█ "], ["eat_2", " ▄▄▄ ▄▄▄ \n █ ▄█▄▄█▄ █ \n █▄▄▄▄▄▄██▄ \n ▄▀▄ ▄▀▄ █▄█ \n ▀█▀▀ ▄▀ \n ▄██▀█▀█ █▄▄ \n ▀█▄ █▄▄█▀ █ \n █▄▄█▄▄▄██▀ "], ["happy", " ▄▀▀▄ █▀▀▄ \n ▀▄▀▀▀▀▀▀▄█▀█ \n █▀▀▀▀█▀▀█▀ \n ▄▀█▄█▄▄▀ ▀ █▀▀▄\n ▀▄ ▀█▀▀ ▄▀▀ ▄▀\n ▀▄ ▀▀▀▀ ▄▀▀ \n ▄▀▀▄ ▄ █▄ \n █▄▄▄█▀▀▀█▄▄▄█ "], ["injured_1", " ▄▄▄ ▄▄▄ \n █ ▄█▄▄█▄ █ \n █▄▄▄▄▄▄██▄ \n ▄▀▄ ▄▄ █▄█ \n ▀█ ▀ ▄▀ \n ▄▄█▀▀▀▀▀▄█▄ \n █ ▄▀▄ ▄ █▄ █ \n ▀█▄▄▄███▄▄▄█ "], ["injured_2", " \n █▀▀▄ █▀▀▄ \n ▀▄▀▀▀▀▀▀▄█ \n █▀▀▀▀▀▀▀█▀▄ \n █▄▀▄ █▀▀ \n ▄█▄▄▄▄▄▄▀▄▄ \n █ ▄▀▄ ▄ █▄ █ \n ▀█▄▄▄███▄▄▄█ "], ["sleep_1", " \n \n \n█▀▄ ▄█▀▄▄▄▀▀█\n█ ▄▀▀▄█ ▄▀ █ █▄▀\n██ █ ▄ █ █ \n█ █▄ ▄█▄▄▀ █ █▀█\n█▄▄▄▄▄█▄▄█▄██▄▄▀"], ["sleep_2", " \n \n \n█▀▄▄▄ ▄█▀▄▄▄▀▀█\n█▄▀ ▀██▄▀ █ █▄▀\n██ █▀ ▄ █ █ \n█ █▄ ▀▄▄█ █ █▀█\n█▄▄▄▄▄▄▄▄▄███▄▄▀"], ["walk_1", " █▀▀▄ █▀▀▄ \n ▀▄▀▀▀▀▀█▄█ \n █▀▀▀██▀▀█▀▄ \n █▄▀▄ ▀ █▀▀ \n ▀▄▄▄▄▄▄▀▄ \n ▄▀▀▄▀ ▀▄▄▀▄ \n █▄▄▀▄ ▄ █▄▄▀ \n █▄▄▄███▄▄▄█ "], ["walk_2", " ▄▄▄ ▄▄▄ \n █ ▄█▄▄█▄ █ \n █▄▄▄▄▄▄██▄ \n ▄▀▄ █▀ █▄█ \n ▀█ ▀ ▄▀ \n ▄██▀█▀█ █▄▄ \n ▀█▄ █▄▄█▀ █ \n █▄▄█▄▄▄██▀ "]]], + ["garbagemon", [["angry", " ▄▄▀█▄▄ ▄ \n ▀▄█▄█▄▀ █▄ \n ▄▀ ▀▄ █▀▄\n ▄▀▀ ▀▀ ▀▄█ █\n ▄▀▀▀▀▀▀▄ ██ \n ▄█▀▀▀▀▀▀▀▀▀█▄ \n▄▀█ █ █ █ █ █ █ \n▀▀ █▄█▄█▄█▄█ ▀"], ["attack", " ▄▀▀▀▀▀▄▀█ █ \n █ ▄▄ █▀▄ ██ \n▄▀▀ ▀▀ ▀█ █ █\n ▀▀▀█████▄ █ █▄▀\n ▄▀▄▀ █ █ █▀ \n▄▄▀▀▀▀▀▀▀ ▄▀█▀ \n█ ▀█▀█▀█▀█ █▀█▄ \n ▀ █▄█▄█▄█▄█ ▀▄█"], ["eat_1", " ▄▀▀▀▀▀▄▀█ █ \n █▄ ▄▄▄ █▀█ ██ \n▄▀ ▄▀▄ █ █\n ▀▀▀██████ █ █▄▀\n ▄▀▀▄▀ ▄▄▀ █ █▀ \n█ ▀▀ █▄▄█▀█▀ \n █▄▄▄▄▀█ █ █▀█▄ \n▄▀ █▄█▄█▄█▄█ ▀▄█"], ["eat_2", " █▀▄█▀▄▀█ ▄ \n ▄▀▀▀▀▀█ █▄ \n █▄ ▄█ █ █▀▄ \n ▄▀ ▄ ▀█ █ \n ▄▀▀▀▀▀▀▀▄ ██ \n ▄█▀▀▀▀▀▀▀▀▀█▄▄ \n █ █ █ █ █ █ ▀▄█\n▀ █▄█▄█▄█▄█ "], ["happy", " ▄▀▀▀▀▀▄▀█ █ \n █ ▄▀▀▄ █▀█ ██ \n▄▀ ▄▄ ▀▄ █ █\n ▀▀▀██████ █ █▄▀\n ▄▄██▀▀▄ ▀█ █▀ \n ▀▄▄▄▄█ █ █▀ \n █ █ █ █▄▄▄█▀█▄ \n▀ █▄█▄█▄█▄█ ▀▄█"], ["injured_1", " ▄▄▀█▄▄ ▄ \n ▀▄█▄█▄▀ █▄ \n▄ ▄▀ ▄ ▀▄ █▀▄\n █ █▀ ▀▀ ▀▄█ █\n ▀▄▄▄▄ ██ \n ▀▄▄▄▄▄▄▀▀▀▀█ \n ▄█▀█ █ █ █ █ \n█▄▀ █▄█▄█▄█▄█ "], ["injured_2", " \n \n ▄▄▀▀▀▄▄ \n ▀█▀▀▀▀▀▀▀█▀ \n █ ▄█ █▄ █ \n ▄█▀▀▀▀▀▀▀▀▀█ \n █ █ █ █ █ █▀█▄ \n▄▀ █▄█▄█▄█▄█ ▀▄█"], ["sleep_1", " \n \n \n ▄▄▀▀▀▄▄ \n ▄▀▀▀▀▀▀▀▀▀▄ \n █▀▀▀▀▀▀▀▀▀█ \n █ █ █ █ █ \n █▄█▄█▄█▄█ "], ["sleep_2", " \n \n \n ▄▄▀▀▀▄▄ \n ▄▀▀▀▀▀▀▀▀▀▄ \n █▀▀▀▀▀▀▀▀▀█ \n █ █ █ █ █ \n █▄█▄█▄█▄█ "], ["walk_1", " ▄▄▀█▄▄ ▄ \n ▀▄█▄█▄▀ ██ \n▄▀ ▄▀ ▄ ▀▄ █ █\n█ ▄▀▀ ▀▀ ▀▄█ █\n█ ▄▀▀▀▀▀▀ ██ \n ▀▄█▀▀▀▀▀▀▀▀▀█ \n▄▀█ █ █ █ █ █ \n▀▀ █▄█▄█▄█▄█ "], ["walk_2", " \n \n ▄▄▀▀▀▄▄ \n▄▀ ▀█▀▀▀▀▀▀▀█▀ \n█ █ ▀▄ ▄▀ █ \n ▀▄█▀▀▀▀▀▀▀▀▀█ \n▄▀█ █ █ █ █ █ \n▀▀ █▄█▄█▄█▄█ "]]], + ["gargomon", [["angry", " ▄▄ \n █ ▀▀▄▄ \n ▄█ ▀ ▄ ▀▄▄ \n ▄▀█▀▀▄ ▀▀ ▀ ▀▄\n ▀█ ▀ ▀ ▄▄█▀█▀ \n ▄█ ▄▄▀█▀█ █▀▀█ \n █ █▄█▄█▄███ █\n█▄█▄██▀▀▀██▄█▄█ "], ["attack", " █▀▄▄ \n ▄▀▄ ▀▀▄ \n ▄▀█▄ ▄█ █▄ \n ▀▄█ ▄█▄ ▄▄▄█ \n █▀▀▀▀▄▀▀▀▄ \n ▀▄ █ ▄█ \n ▄██████████▄ \n █▄█▄█▀ ▀██▄█▄█ "], ["eat_1", " █▀▄▄ \n ▄▀▄ ▀▀▄ \n ▄█▀▄ ▄▀▄ █▀▄ \n ▀▄█ ▄█▄ ▄▄▄▄▀\n ▄▀ ▀███▄█▀█▄█▄ \n ▀▄▄▀█ █ █▄█ ▀▄\n ▄█████████▄ ▄▀\n █▄█▄▄█ █▄▄█▄█ "], ["eat_2", " ▄▄ \n █ ▀▀▄▄ \n ▄█ ▀ ▄ ▀▄▄ \n ▄▀█ ▀▄ ▀ ▀ ▀ ▀▄\n ▀█ ▀ ▀ ▄▄█▀█▀ \n ▄▀ ▄▄▀█▀█ █▀▀█ \n █▄█▄█▄█▄███ █\n█▄█▄██▀▀▀██▄█▄█ "], ["happy", " █▀▄▄ \n ▄▄▄▀▀▄ ▀▀▄ ▄▄▄\n ▀▄█▀▄ ▄▀▄ █▄▄▀\n▄▀▀▄ ▄▀▄ ▄▀ █\n▀▄ ▀▄▄▄▄▄█▀█ ▄▄▀\n ▀█▀█ █ █▄█▀ \n ▄█████████▄ \n █▄█▄▄█ █▄▄█▄█ "], ["injured_1", " ▄▄ \n █ ▀▀▄▄ \n ▄▀▄▀ ▄ ▀▄▄ \n ▄▀█▀▀▄ ▀▀ ▀ ▀▄\n ▀█ ▀ ▀ ▄▄▀█▀ \n ▄█ ▄▄▄█▀█ █▀▀█ \n █ █▄█▄█▄███ █\n█▄█▄███████▄█▄█ "], ["injured_2", " \n █▀▄▄ \n ▄▀▄ ▀▀▄ \n ▄█▄█ █▄ █▀▄ \n▀▄█ ▄▀▄ ▄▄▄▄▀ \n ▄█ ▄▄▄█▀█▄▀▀█ \n █ ██▄█▄█▄██ █\n█▄█▄███████▄█▄█ "], ["sleep_1", " \n █▀▄▄ \n ▄▀▄ ▀▀▄ \n ▄█▄▄ ▄▄ █▀▄ \n▀▄█ ▄▀▄ ▄▄▄▄▄▀ \n▄▄█▄▄▄▄▀█ █▄▀▀█ \n█ ▀▄█▄█▄█▀▀█ █\n█▄▄▄█████▄▄▄█▄█ "], ["sleep_2", " ▄▄ \n █ ▀▀▄▄ \n ▄▀ ▀ ▀▄▄ \n ▄▀█▀▀▄ ▀▀ ▀ ▀▄\n ▀█ ▀ ▀ ▄▄█▀█▀ \n▄▄█ ▄▄▀█▀█ █▀▀█ \n█ ▀█▄█▄█▄▀▀█ █\n█▄▄▄█████▄▄▄█▄█ "], ["walk_1", " █▀▄▄ \n ▄▀▄ ▀▀▄ \n ▄█ █ █ █▀▄ \n ▀▄█ ▄▀▄ ▄▄▄▄▀\n ▄▀ ▄▄▄█▀█▄█▄ \n █▀▄▀█ █ █▄█ ▀▄\n ▀▄█████████▄ ▄▀\n █▄█▄▄█ █▄▄█▄█ "], ["walk_2", " ▄▄ \n █ ▀▀▄▄ \n ▄▀▄▀ ▄ ▀▄▄ \n ▄▀█ ▀▄ ▀ ▀ ▀▄\n ▀█ ▀ ▀ ▄▄█▀█▀ \n ▄█ ▄▄▀█▀█ █▀▀█ \n █ █▄█▄█▄███ █\n█▄█▄██▀▀▀██▄█▄█ "]]], + ["garudamon", [["angry", " ▄▄ ▀█▀▄ ▀█▄ \n▄▀█ ▄▀▀ ▄ ▀▄ █ █\n█ ▄▀▀ ▀ █▄▀ █\n█ ▀▄███▄ ▄█▄ █\n█ ▄▀▄▄▄ ▀ ▄ █ █\n█ ▀▄▄▀ █▄▄█ █\n ▀▄█ ▀▄▄ █▄▀▄▀\n █▄▄▄▄▀ ▀▄▄▄▄█ "], ["attack", " ▄▀█▀ ▀█▀▄ ▀█▀▄ \n█ █▄▄▀▀ ▄▄▀▄ █ █\n█ █ ▄▄▄▀▀ █▄▀ █\n█ ▀ ███ ▀▄ █\n█ ▄▀▀▀▀▄▀▀▄ █ █\n█ █▀█▀▀ ▀▄▄▄▄█ █\n ▀▄█ ▀▄▄ █▄ ▀ \n █▄▄▄▄▀ ▀▄▄▄▄█ "], ["eat_1", " ▄▀█ ▀█▀▄ ▀█▄ \n █▄█▀▀ ▄ ▀▄ █ █\n █ ▄▄▄▀ ▀ █▄▀ █\n ▄▀▀████ ▄█▄ █\n █ ▀▄▄▄ ▄ █ █\n █▀█ █▄▄█ █\n ▄█ ▀▄▄ █▄ ▀ \n █▄▄▄▄▀ ▀▄▄▄▄█ "], ["eat_2", " ▄▄ ▀█▀▄ ▄▄ \n ▄▀ █▀▀ ▄ ▀▄ █▀▄\n █▄▀▀ ▀ ▀ █ █ █\n █▀▄▀▀▀▄▄ ▄▀▀ █\n █▄▀█▀▀ ▀▀▄ █\n █▄▄█ █▀ █ █\n ▀▄█ ▀▄▄ ██▀▄▀\n █▄▄▄▄▀ ▀▄▄▄▄█ "], ["happy", " ▄█▀ ▀█▀▄ ▀█▄ \n█ █ ▄▀▀ ▄ ▀▄ █ █\n█ ▄▀▀ ▀ ▀ █▄▀ █\n█ ▀▄▀████ █ █ █\n█ ▄▄▀▀▀█ ▄▀ █ █\n█ █ █▀▀ ▄█▄ █\n ▀▄█▀ ▄▄▄▄ ▀▄▄▀ \n █▄▄▄▄▀ ▀▄▄▄▄█ "], ["injured_1", " ▄▄ ▀█▀▄ ▄▄ \n▄▀█ ▄▀▀ ▀▄ █▀▄\n█ █▀▀ ▀▄▄ █▄▀ █\n█ ▀▄███▄ ▄▀ █\n█ ▄▀▄▄▄ ▀▄ █▄ █\n█ █ ▀▄ ▄▀ █ █ █\n ▀█▄▄▀ ▀▄▄█▄ ▀ \n █▄▄▄▀▀▀▀▄▄▄▄█ "], ["injured_2", " \n ▄▄ ▀█▀▄ ▄▄▄ \n █ █▀▀ ▀▄ █ █ \n █▀▀ ▄▄ █ █ █ \n█▀▄▀▀▀▄ ▀▄▀ █\n█ █▀▀█▀▀ █▄ █\n█ █▀▀▄▀▄▀▀▀▄ █ █\n █▄▄▄▄█▄▄▄▄▄█▀▄▀"], ["sleep_1", " ▄▄▄ ▄▄▄ \n▄▀▄▀ ▀█▀▄ ▀▄▀▄ \n█ ▀▄▀▀ ▀▄ █ █\n█▄▀▀ ▀▀▀ █▄▀ █\n█▀▄▀▀▀ ▀▄ █\n█ █▀▀█▀▄▀ █▄ █\n█ ▄▀▄▀ ▀▄▀▀▄ █ █\n █▄▄▄█▄█▄▄▄▄█ ▀ "], ["sleep_2", " ▄▄ ▄▄▄ ▄▄ \n▄▀█ ▄▄▀ ▀▄ █▀▄\n█ ▀▄█ ▄▄▄ █ █ █\n█ █ ▄▄▄ █▀ █\n█ █▄▄▄▀▀ ▀▄ █\n█ █ ▀▄ ▄▀ █▄ █\n█ ▄▀▄▀ ▀▄▀▀▄ █ █\n █▄▄▄█▄█▄▄▄▄█ ▀ "], ["walk_1", " ▄█▀ ▀█▀▄ ▀█▄ \n█ █ ▄▀▀ ▄▄▀▄ █ █\n█ ▄▀▀ ▀▀ █▄▀ █\n█ ▀▄▀▀▀▄▄ ▄▀ █\n█ █▀▀ ▀▀▄ █\n█ █▀█ █▀ █ █\n ▀▄█ ▀▄▄ ██ ▀ \n █▄▄▄▄▀ ▀▄▄▄▄█ "], ["walk_2", "▄▀█ ▀█▀▄ ▀█▀▄ \n█ ▄▀▀ ▄▄▀▄ █ ▀▄ \n█▀▀ ▀▀ █ █ █\n▀▄▀▀█▄ █▀ █\n █▀█ ▀▀▀ ▀█▀▀▄█\n ▀▀▀█▀▀▀ ▀▀▀▄\n ▀▄▄▄▄▄▄ █\n ▀▀ ▀▄█"]]], + ["garudamon_x", [["angry", " ▄▄▄▄▄▄▄▄▄ \n ▄▀▀ ▄ ▀▄▀▄▄▀ \n █ ▀▀ █ █▄▀ \n █▄█████▀█▄▀ ▄▀▄\n ▀▄▄▄▀ ▄▄██▀ █\n ▄▀▀█ ▀▀ ▄█ ▀▄ █\n █▄▄▀▀▀▀▀▀█▄▄█▄▀\n█▄▄▄█▄█▀█▄█▄▄▄█ "], ["attack", " ▄▄▄▀▀▀█▀█▀▀█ \n █ ▄█ █ █▀▄ \n ▀███▄▄▄▄█ █▀ ▄ \n ████ █ █▄▄▀ █\n █▄▄▄█▀▀█▀▄ █\n █ ██▄▄▄█ █▄ █\n ▄█ ▄▄ ▀█▄ ▀█\n █▄▄█▄▀ ▀▄█▄▄█ "], ["eat_1", " ▄▄▀▀▀█▀█▀▀█ \n ▄▀ ▄▀▄ █ █▀▄ \n ▀▄██▄▄▄▄█ █▀ ▄ \n ████ █ █▄▄▀ █\n █▄▄▄█▀▀█▀▄ █\n █ █▄▄▄▄█ █▄ █\n ▄█ ▄▄ ▀█▄ ▀█\n █▄▄█▄▀ ▀▄█▄▄█ "], ["eat_2", " ▄▄▄▄▄▄▄▄▄ \n ▄▀▀ ▄ ▀▄▀▄▄▀ \n █ ▀ ▀ █ █▄▀ \n █▄▀▀▀█▀▀█▄▀ ▄▀▄\n ▀▀█▀ ▄▄██▀ █\n ▄▀█▀▀▀ ▄▀ █ █\n ▄█▄▀▀▀▀▀▀▄▄█▄ █\n█▄▄▄█▄█▀█▄█▄▄▄█▀"], ["happy", " ▄▄▄▀▀▀█▀█▀▀█ \n █ ▄▀▄ █ █▀▄ \n ▀▄██▄▄▄▄█ █▀ ▄ \n ████ █ █▀▀█ █\n ▄▀█▄▄▄█▀█▀ ▄▀ █\n ▀▄██▄▄▄▄█▀▀▄▄ █\n ▄█ ▄▄ ▀█▄ ▀█\n █▄▄█▄▀ ▀▄█▄▄█ "], ["injured_1", " \n ▄▄▄▄▄▄▄▄▄ \n ▄▀▀ ▄ ▀▄▀▄▄▀ \n █ ▀▀ █ █▄▀ \n █▄▀▀▀█▀▀█▄▀ ▄▄ \n ▀▀█▀ ▄▄██▀ █\n ▄▀▀█▀▀▀▄▄▀▀█ █\n █▄▄█████▄▄▄█▄▄█"], ["injured_2", " \n \n ▄▄▀▀▀█▀█▀▀█ \n▄▀ █▄ █ █▀▄ \n█ ▄▄▄▄▄▄█ █▀ ▄▄ \n▀█▄▄▄▀ ▄██▄▀ █\n ▄▀▀█▀▀▀▄▄▀▀█ █\n █▄▄█████▄▄▄█▄▄█"], ["sleep_1", " \n \n ▄▄▀▀▀█▀█▀▀█ \n▄▀ ▄▄ █ █▀▄▄▄ \n█ ▄▄▄▄▄▄█ ██▀ █\n██▄▄▄▀ ███▄▄▄ █\n█ █▀█▀▀▀▄▀ █ █ █\n█▄█▄▄████▄▄█▄█▄█"], ["sleep_2", " \n ▄▄▄▄▄▄▄▄▄ \n ▄▀▀ ▀▄▀▄▄▀ \n █ ▀▀ █ █▄▀▀▄\n █▄▀▀▀█▀▀█▄▀ █\n▄▄▀▀█▀ ▄▄██▄▄ █\n█ █▀█▀▀▀▄▀ █ █ █\n█▄█▄▄████▄▄█▄█▀▀"], ["walk_1", " ▄▄▀▀▀█▀█▀▀█ \n ▄▀ ▄█▀ █ █▀▄ \n █ ▄▄▄▄▄▄█ █▀ ▄ \n ▀█▄▄▄▀ ▀█▄▄▀ █\n ▄█▄▄▄▀▀█▀▄ █\n █ █▄▄▄▄█ █▄ █\n ▄█ ▄▄ ▀█▄ ▀█\n █▄▄█▄▀ ▀▄█▄▄█ "], ["walk_2", " ▄▄▄▄▄▄▄▄▄ \n ▄▀▀ ▄ ▀▄▀▄▄▀ \n █ ▀▀ █ █▄▀ \n █▄▀▀▀█▀▀█▄▀ ▄▀▄\n ▀▀█▀ ▄▄██▀ █\n ▄▀█▀▀▀ ▄▀ █ █\n ▄█▄▀▀▀▀▀▀▄▄█▄ █\n█▄▄▄█▄█▀█▄█▄▄▄█▀"]]], + ["garurumon", [["angry", " \n █▀▄▀▀▀▀▄▀▀▀▄ \n▄▄▀ ▄ █▀ ▄▄ \n█▄▄█▄ ▀ ▄██▄▀▄▀ \n ▀▄▄▄▄ ▄█ ▄▀▀█\n █ ▄▀ ▄▀█▄▀ \n █▀▄█ ▄█ ▄█ \n █▄█▄▄▄█▄▄▄▄▄█ "], ["attack", " ▄█ ▄█ ▄▀▄\n █▄█▄▄▀ █▄ █ █\n ▄▄▀ ▄▀ █▄█ █\n█▄▄▄▄▄▀▀ ▄▀▀ ▀▄\n ▀▄▀███▄ ▀█ ▀██\n █▄████ ▄▄▄ █\n █▄▄▄▄▄▄▀ ▄▀█ █\n█▄▄█▄▄▄▄▄▀ █▄▄▄▀"], ["eat_1", " ▄▄ ▄▄ \n █▄█▄▄█ █ \n ▄▄▀ ▄ ▀█ ▄ \n█▄▄▄▄▄▀ ▀ █ █ █\n ▀▄▀███▄ ██▄█ █\n █▄████ ▀ ▀ ▀▄\n █▄▄▄▄▄▄▀ ▄█▄ █\n█▄▄█▄▄▄▄▄█▄▄▄▄▄▀"], ["eat_2", " \n ▄▄ ▄▄ \n █▄▀▀▀▀▄▀ █ \n▄▄▀ ▄▀▄ █ ▄▀▀▄\n█▄▄█▄ ▄███▄█ █\n ▀▄▄▄▄ ▀▀ ▀ ▀▄\n ▄▄█▄▄▄ ▄█▄ █\n█▄▄█▄▄▄▄▄█▄▄▄▄▄▀"], ["happy", " ▄▀█▄▄▄ ▄▀█ \n █▀ ▀ ▄▀ \n █▀ ▄▀▄ ▄█ ▄▄ \n ▀████▄ ▀▀█▀▄▀ \n▄▀█▀▀█▀▀▀ ██▄▀▀█\n▀▄▄█▀▀▄▄█ ██▄█ \n ▄█ ▄█ ▀▄█ █\n █▄▄█▄▄█▄▄▄▄█▄▄▀"], ["injured_1", " \n \n \n █▀▄▀▀▀▀▄▀▀▀▄ \n▄▄▀ ▄ ▄██▀▄ \n█▄▄▄▄▄ ▀▀▄█ ▀▀ █\n▄▀▄▄▄▄ ▄▀▄▄▀ █\n█▄█▄▄▄▄██▄█▄▄▄▄▀"], ["injured_2", " \n \n \n ▄▄ ▄▄▄▄ ▄▄▄ \n ▀▄▀ ▀ ▄█▀▄ \n█▀ ▀▄▄ █ ▀▀ █\n██▀▀▀▀ ██▄▄▀ █\n█▄████▄██▄█▄▄▄▄▀"], ["sleep_1", " \n \n \n ▄▀█▄▄▄ ▄▀█ \n █▀ ▀ ▄██▀▄ \n█▀ ▀▀ █ ▀▀ █\n██▀▀▀▀ ██▄▄▀ █\n█▄████▄██▄█▄▄▄▄▀"], ["sleep_2", " \n \n \n █▀▄▀▀▀▀▄▀▀█▄ \n▄▄▀ ▄▄ ███▀▄ \n█▄▄▄▄▄ ▄██ ▀▀ █\n▄▀▄▄▄▄ ▄▀▄▄▀ █\n█▄█▄▄▄▄██▄█▄▄▄▄▀"], ["walk_1", " ▄▄ ▄▄ \n █▄▀▀▀▀▄▀ █ ▄▄ \n▄▄▀ ▄▄▄ █ ▀▄ █\n█▄▄█▄▀▀ ▄██ ▄█ █\n ▀▄▄▄▄ ▄██ ▀▄\n █ ▄▄ ▀▄▀██\n ▄█ █ ▄▄▄▄█▄ █\n █▄▄█▄▄▄▀ █▄▄▄█"], ["walk_2", " ▄▄ ▄▄ \n █▄▀▀▀▀▄▀ █ ▄ \n▄▄▀ ▄▄ █▀ █ █\n█▄▄█▄▀▀ ▄██▄█ ▄▀\n ▀▄▄▄▄ ▄█▀ █ \n▄▀▄ ▄▄ ▄ ▄█ \n█ █ █▄██▄█ ▀▀▄\n ▀▀▀▀ ▀▄█▄▄▄▀"]]], + ["gatomon", [["angry", " █▄ ▄█ \n █▀▀▄ ▄▀▀█ \n ▀▄▀▄▀▀▀▀▀▄▀▄▀ \n █ █ ▄█\n ▄▀ █▄ ▄█ ▀▄▀█\n █▄ ▄▀▄ ▄█ ▄▀\n▄▀ ▀█▀▀▀█▀ ▀▄█\n█▄█▄▄█▄▄▄█▄█▄▄██"], ["attack", "██▀▀▀█▄▄█▀▀▀▀███\n ▀█ ▄▀█▀▀ \n ▄▀▀▀ ▀▀ ▀▄ \n █ █▄█▄█▄█ █▄█\n ▀▄██▀▀▀▀█▄▀██▀█\n ▄█▀█▀▀█▀▄▄ ▀▄▀\n▄▀ ▀▄▀▀▄▀ ▀▄ █\n█▄█▄▄█▀▀█▄█▄▄█▄█"], ["eat_1", "██▀▀▀█▄▄█▀▀▀▀███\n ▀█ ▄ ▀█▀▀ \n ▄▀ ▀ ▀ ▀ ▀▄ \n █ ███████ █▄█\n ▀▄▀██▀▀▀█▄▀██▀█\n ▄█▀█▀▀█▀▄▄ ▀▄▀\n▄▀ ▀▄▀▀▄▀ ▀▄ █\n█▄█▄▄█▀▀█▄█▄▄█▄█"], ["eat_2", "███▄▄ ▄▄▄███\n █ ▄▀▀▀▀▀ █▀ \n ▀█▄ ▄ ▀█▀ ▄\n ▄▀ ▀▄▀ ▀ ▀▄██\n ▀▄ ▀ ▀ ▄▄▀▄ █\n ▄▄▀▀██▀▀ ▄▄▀▀▄\n▄▀ ▀▄ ▄▀ ▀▄█\n█▄█▄▄█▄▄▄█▄█▄▄█▀"], ["happy", "██▀▀▀█▄▄█▀▀▀▀███\n ▀█ ▄ ▀█▀▀ \n ▄▀ ▀ ▀ ▀ ▀▄ \n █ ███████ █▄█\n █▄█████▄▄▀██▀█\n▄▀ ▀▄▄▄▀ ▄▄ ▀▄▀\n█▄█▄▄█ ▄▀ ▀▄ █\n ▀▀▀▀▀█▄█▄▄█▄█"], ["injured_1", " \n ▄▄▄▄ ▄▄▄▄▄ \n██▀ ▄▀▀▀▀▀▄ ▀██\n ▀█ █▀▀ ▄\n ▄▀ ▄▄ ▀▄▄ ▀▄██\n █▄ ▄█ ▄▀\n▄▀ ▀█▀▀▀█▀ ▀▄█\n█▄█▄▄█▄▄▄█▄█▄▄██"], ["injured_2", " \n▄▄▄▄ ▄▄▄▄ \n▀█▀ ▀▄▄▄▄▄▀ ▀█▀ \n ▀▄▀ ▀▄▀ ▄█\n ▄▀ ▄ ▀▄▀▀█\n ▀▄▄▀▀ ▀▀ ▄▄▀▀▄\n▄▀ ▀▄▄▄▄▄▀ ▀▄█\n█▄█▄▄█▄▄▄█▄█▄▄█▀"], ["sleep_1", " █▄ ▄█ \n ██▀▄ ▄▀██ \n █ ▄▀▄▄▄▄█ ▄ █ ▄\n ▀▄▀ ▀▄▀ ██\n ▄▀▄▄ ▄▄ ▀▄█ █\n ▀▄▄ ▄▀▄ ▄▄▀▀▄\n▄▀ ▀▄▄▄▄▄▀ ▀▄█\n█▄█▄▄█▄▄▄█▄█▄▄█▀"], ["sleep_2", "▀██▄ ▄██▀ \n █▀ █ ▄▀ ▀█ \n ▀▄▀▄▀▀▀▀▀▄▀▄▀ \n █ █ ▄█\n ▄▀ ▀▀▄ ▀▀ ▀▄▀█\n █▄ ▀ ▀ ▄█ ▄▀\n▄▀ ▀█▀▀▀█▀ ▀▄█\n█▄█▄▄█▄▄▄█▄█▄▄██"], ["walk_1", "██▀▀▀▄▄▄▄▀▀▀▀███\n ▀▄▄▀ ▄▄▄▀▀ \n ▄▀ █ █ ▀▄ \n ▀▄ ▄▀▄ ▄▀▄█\n ▀▄▄▄▄▄▄▀▀▄█▀█\n █▄▀▄▄▀ ▄▄ ▀▄▀\n ▄▀ ▀▄ ▄▀ ▀▄ █\n █▄█▄▄█▀█▄█▄▄█▄█"], ["walk_2", "███▄▄ ▄▄▄███\n █ ▄▀▀▀▀▀ █▀ \n ▀█ ▄ ▄▀█▀ ▄\n ▄▀ ▀▄ ▀ ▀▄██\n ▀▄ ▀ ▀ ▄▄▀▄ █\n ▄▄▀▀██▀▀ ▄▄▀▀▄\n▄▀ ▀▄ ▄▀ ▀▄█\n█▄█▄▄█▄▄▄█▄█▄▄█▀"]]], + ["gatomon_x", [["angry", "▄▄▄▄▄ ▄▄▄▄▄▄\n▀█▄ ▀█▀█▀▀▀ ██▀\n ▄▀▄ ▀ ▄ ▄▀ \n ▄▀ ▀▀▄ ▀▀ █ \n ▀▄ ▀ ▀▀ ▄█▄ █\n █▀█▀▀▀▀▀▀█▀ █ █\n █▀█▀▀▀▀▀█▄▄█ █\n █▄▄▄▄███▄▄▄██▀ "], ["attack", "██▀▀█▄▄▄▄▄█▀▀███\n ▀▀▄ ▀▄▀ ▄▀▀ \n █ █▄ ▄█ ▀▄ \n ▀▄ ▄█▄▄ ▄▀ ▄\n ▀▄████▄▀█ █ █\n █▄▀▀▀▀▄▀ ▀█ █\n ▀▄▀▀▀▀▀ ▀▄▄▀▄▀\n █▄▄▄█▀▀▄▄▄█▀ "], ["eat_1", "██▀▀█▄▄▄▄▄█▀▀███\n ▀▀▄ ▀▄▀ ▄▀▀ \n █ █ █ ▀▄ \n ▀▄ ▄▄█▄▄ ▄▀ ▄\n ▀▄ ███ ▄▀█ █ █\n ▄█▄▄▄█▄▀ ▀█ █\n ▀▄▀ ▀▄▄▀▄▀\n █▄▄▄█▀▀▄▄▄█▀ "], ["eat_2", "▄▄▄▄▄ ▄▄▄▄▄▄\n▀█▄ ▀█▀█▀▀▀ ██▀\n ▄▀▄ ▀ ▄ ▄▀ \n ▄▀▀ ▀▄ ▀ ▀ █ \n ▀▄ ▀ ▀▀ ▄█ ▄ █\n ▄▀▀▀▀▀▀▄▀▄█ █\n ▄▀█▀▀▀▀▀▄▄ █ █\n █▄▄▄▄███▄▄▄█▀▀ "], ["happy", "██▀▀█▄▄▄▄▄█▀▀███\n ▀▀▄ ▀▄▀ ▄▀▀ \n █▄▀▄ ▄▀▄ ▀▄ \n ▀▄ ▄▄█▄▄ ▄▀ ▄\n ▄▀▄ ███ ▄▀▀▄█ █\n ▀▄ █▄▄▄█▄ ▄▀█ █\n █▀ ▀▄▄▀▄▀\n █▄▄▄█▀▀▄▄▄█▀ "], ["injured_1", " \n▄▄▄▄▄ ▄▄▄▄▄▄\n▀█▄ ▀█▀█▀▀▀ ██▀\n ▄▀ ▄▀ ▄ ▄▀ \n ▄▀ ▀▀▄ ▀▀ █ ▄\n █▄ ▀ ▀▀ ▄█ █ █\n █ ▀█▀▀▀█▀ ▀█ █\n █▄▄▄█████▄▄▄█▄▀"], ["injured_2", " \n \n██▀▀█▄▄▄▄▄█▀▀███\n ▀▀▄ ▀▄▀ ▄▀▀ \n █ ▄ ▄ ▀▄ ▄\n ▀▄ ▀▀▄ ▀▀ ▄▀█ █\n █ ▀▄▀ ▀▀▄▀ ▀█ █\n █▄▄▄█████▄▄▄█▄▀"], ["sleep_1", " \n▄▄▄▄▄ ▄▄▄▄▄▄\n▀█▄ ▀█▀█▀▀▀ ██▀\n ▄▀ ▀ ▄▀ \n ▄▀▄▄ ▄▄ █ ▄\n █ ▄▀▄▄ █ █ █\n █▀█▄▄▄▄▄▄██▀█ █\n █▄▄█▄▄▄▄▄█▄▄█▄▀"], ["sleep_2", " \n██▀▀█▄▄▄▄▄█▀▀███\n ▀▀▄ ▀▄▀ ▄▀▀ \n █▄▄ ▄▄ ▀▄ \n ▀▄ ▄▀▄▄ ▄▀ ▄\n ▄▀▄▄▄▄▄▄▀█ █ █\n █▀█▄▄▄▄▄▄██▀█ █\n █▄▄█▄▄▄▄▄█▄▄█▄▀"], ["walk_1", "██▀▀█▄▄▄▄▄█▀▀███\n ▀▀▄ ▀▄▀ ▄▀▀ \n █ █ █ ▀▄ \n ▀▄ ▄▀▄▄ ▄▀ ▄\n ▀▄▄▄▄▄▄▀█ █ █\n █▄▄▄▄▄▄▀ ▀█ █\n ▀▄▀ ▀▄▄▀▄▀\n █▄▄▄█▀▀▄▄▄█▀ "], ["walk_2", "▄▄▄▄▄ ▄▄▄▄▄▄\n▀█▄ ▀█▀█▀▀▀ ██▀\n ▄▀▄ ▀ ▄ ▄▀ \n ▄▀ ▀ ▄ ▀ █ \n ▀▄ ▀ ▀▀ ▄█ ▄ █\n ▄▀▀▀▀▀▀▄▀▄█ █\n ▄▀█▀▀▀▀▀▄▄ █ █\n █▄▄▄▄███▄▄▄█▀▀ "]]], + ["gazimon", [["angry", " \n ▄▄▄▄▄▄ \n ▄▀▀ ▄▄▄ ▀▀▄▄ \n█ ▀▄█▀ ▄ █ \n █▀█▀▄ ▀▀▄▄▀ \n▄█▀▀▀▀ ▄▀▀ ▀▄ \n▀▄███▀ ▀▀█▀ █▀█\n█▄█▄██▀▀▀█▄█▄▄█ "], ["attack", " ▄▀███▄▄▄▀▀▀▀▄ \n ▄▀▀ ▄▄ ▄▀ \n█▄▄▄▄ ██ █▄▀ \n ▀▄ ▀▄ \n ▄▄▄▄▄█ ▄▀▀▄█ \n ▀▄▄▄▄ ▀▄▄▄█▀▄\n █▄▄█ ▄ █▀ █\n█▄█▄██▀▀█▄█▄▄█▀ "], ["eat_1", " ▄▄▄▄▄▄▄ \n ▄▀▀ ▄▄ ▀▀▄ \n█▄▄▄▄ ▀▄██ █ \n █ ▀▄▄▀ \n █▀▀▀ ▄▄ ▀▄ \n▄▀▀█▀ █▄▄▄ █ \n █▄▄█ ▄ ▄▀▀█\n█▄█▄██▀▀█▄█▄▄█▀ "], ["eat_2", " \n ▄▄▀▀▀▀▀▀▄▄ \n▄▀ ▄▀▀▄ ▀▄ \n▀▄▄▄▄▄ ▄ █ \n ▀▄▄▄▄ ▄▄ ▀█ \n █▄▄█ █▄▄▄ █▄▄\n ▄▄█▄ ▄ ▄▀▄▀\n █▄█▄██▀█▄█▄▄█ "], ["happy", " ▄▄▄▄▄▄▄▄▄ \n ▄▀▀ ▄▄ ▀▀▄\n█▄▄▄▄▄▀ ▀ ▄ ▄▄█\n █ █▄ \n █▀▀▀ ▀▀ █ \n▄▀▀█▀ ▄▄█ \n █▄▄█ ▄ ▄▀▀█\n█▄█▄██▀▀█▄█▄▄█▀ "], ["injured_1", " \n ▄▄▄▄▄▄ \n ▄▀▀ ▀▀▄▄ \n█ ▀▄▄ ▄ █ \n █▀▀▀ ▀▀▄▄▀ \n ▄▀▀█▀ ▄▀▀ ▀▄ \n █▄██▄ ▀▄█▀ █▀█\n█▄█▄██▀▀▀█▄█▄▄█ "], ["injured_2", " \n \n ▄▄▀▀▀▀▀▀▄▄ \n▄▀ ▄ ▀▄ \n▀▄▄▄▄ ▀▀ ▄ █ \n ▀▄▄▄▄ ▄▄▀█ \n █ ▄█ █ ▄▄ █▄▄\n█▄█▄██▄▄▄█▄█▄▄█▀"], ["sleep_1", " \n \n ▄▀▀▀▀▀▄▄ \n █ ▀▄ \n ▄▀ ▄▄ ▄ █ \n █ ▄█▀█▄ \n█ ▀▄▄▄▄ █ ▀ ▀ █ \n█▄▄▄█▄▄▄▄█▄▄▄█▄█"], ["sleep_2", " \n ▄▄▄▄▄ \n ▄▀ ▀▀▄ \n █ ▀▄ \n █ ▀▀ ▀▄▄▀ \n ▄█▄ ▄▄▀█▄ \n█ ▀▄█▀▀ █ ▀ ▀ █ \n█▄▄▄█▄▄▄▄█▄▄▄█▄█"], ["walk_1", " \n ▄▄▀▀▀▀▀▀▄▄ \n▄▀ ▄▀█▄ ▀▄ \n▀▄▄▄▄ ▀▀▀ ▄ █ \n ▀▄▄▄▄ ▄▄ ▀█ \n █▄▄█ █▄▄▄ █▄▄\n ▄▄█▄ ▄ ▄▀▄▀\n █▄█▄██▀█▄█▄▄█ "], ["walk_2", " \n ▄▄▄▄▄▄ \n ▄▀▀ ▄▄ ▀▀▄▄ \n█ ▀▄██ ▄ █ \n █▀▀▀ ▀▀▄▄▀ \n ▄▀▀█▀ ▄▀▀ ▀▄ \n █▄██▄ ▀▄█▀ █▀█\n█▄█▄██▀▀▀█▄█▄▄█ "]]], + ["gekomon", [["angry", " \n ▄▄ ▄▄ \n █▄▄█▄▄█ \n ▄▀▄▄▀▄▄▀█▄ \n█ █▄ \n▀█▀▀▀▀▀▄ █ \n █ ▄█ ▄▄ ▀▄ \n █▄█▀█▄▄▄▀▄▄▄▄█ "], ["attack", " \n ▄▀▀▄▀▀▄ \n █▄ █▄ █▄ \n▄▀ ▀ ▀ ▀▀▄ \n▀▀███████ ▀▀▄ \n ▀▄▄ ▀█▀ █ \n █▀▀▀▀▀ ▄ ▄▄ ▀█ \n█▄██▀█▄▄▄█▄▄▄▄█ "], ["eat_1", " \n ▄▀▀▄▀▀▄ \n █▄ █ ▄█▄ \n▄▀ ▀▀ ▀▀ ▀▀▄ \n▀▀██████ ▀▀▄ \n▄▀ ▄▀ ▀█ █ \n▀▄ ▀ ▄█▀▀ ▄▄ ▀▄ \n█▄██▀█▄▄▄█▄▄▄▄█ "], ["eat_2", " \n ▄▄ ▄▄ \n █ █ █ \n ▄▀█ ▀█ ▀█▄ \n█ ▄ █▄ \n▀█▀▀▀▀▀█▀ █ \n █ ▄█ ▄▄ ▀▄ \n █▄█▀█▄▄▄▀▄▄▄▄█ "], ["happy", " \n ▄▀▀▄▀▀▄ \n █▄ █▄ █▄ \n▄▀ ▀ ▀ ▄▀▀▄ \n▀███████▀ ▀▀▄ \n ██▀ ▄▀ █ \n █▀▀▀▀▄▄ ▄▄ ▀█ \n█▄█▀▀█▄▄▄▀▄▄▄▄█ "], ["injured_1", " \n \n ▄▄ ▄▄ \n █▄▄█▄▄█ \n ▄▀▄▄▀▄▄▀▀▄▄ \n▀▄▄▄▄▄▄▄ ▀▀▄ \n ▄▀▀▀▀▀█▀ ▄▄ ▀▄ \n█▄█▄▄▄█▄▄█▄▄▄▄█ "], ["injured_2", " \n \n ▄▄ ▄▄ \n █ █ █ \n ▄▀▄█ █▄▀▀▄▄ \n█ ▀ ▀▄ \n▀█▀▀▀▀▀█ ▄▄ █ \n█▄█▄▄▄█▄▄█▄▄▄▄█ "], ["sleep_1", " \n \n \n ▄▀▀▄▀▀▄ \n █▀▀█▀▀█▀▄ \n▄▀ ▀▀ ▀▀ ▀▄ \n▀█▀▀▀▀▀▀▄ ▄ █ \n█▄█▄▄▄▄█▄▄█▄▄▄█ "], ["sleep_2", " \n \n ▄▄ ▄▄ \n █▄▄█▄▄█▄ \n ▄▀▄▄▀▄▄▀ ▀▀▄ \n█▄▄▄▄▄▄▄ █ \n █ █ ▄ ▀▄ \n█▄█▄▄▄▄█▄▄█▄▄▄█ "], ["walk_1", " \n ▄▄ ▄▄ \n █ █ █ \n ▄▀█ ▀█ ▀█▄ \n█ █▄ \n▀█▀▀▀▀▀▄ █ \n █ ▄█ ▄▄ ▀▄ \n █▄█▀█▄▄▄▀▄▄▄▄█ "], ["walk_2", " ▄▄ ▄▄ \n █ █ █ \n ▄▀█▄▀▄█▀▄▄ \n█ █▄ \n▀█▀▀▀▀▀▄ █▄ \n █▄ ▄▀ ▄ ▀▄\n █▄▄▀█▄▄▀▀▄▀█▄ █\n █▄▄▀▄▄█"]]], + ["geogreymon", [["angry", "██▄▄▄█████▄▄███ \n██████▀ ▄████▀▄ \n█▀█▀█▀█████▀█ ▀▄\n█▀▀▀▀▀▀█▀ ▀▄▀▄ █\n ▀▀█▀▀█▄▄▄ ▀█ █\n █ █ █ ▄▀▄█\n ▄█▄ ▀▀▀▀█▀ ▀▄▀\n█▄█▄███▀▀▀▄█▄█▄█"], ["attack", " ▄▄▄▄▄ ▄▄▄ \n██▄▄██▀▀▀█████▀ \n█████▄█▄███▀█ █ \n▀█▀▀▀▀██▀ ▀▄▀▄ █\n ▀▀█▀▀ ▄▄▄ ▀█ █\n▄▀▀█ █ █ ▄▀▄█\n▀▄▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["eat_1", " ▄▄▄▄▄ ▄▄▄ \n██▄▄██▀▀██████▀ \n█████▄██▄██▀█ █ \n▀█▀▀▀▀██▀ ▀▄▀▄ █\n ▀▀█▀▀ ▄▄▄▀█ █\n ▄▀█ █ █ ██\n █▄▀▄ ▀█▀▀▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["eat_2", "██▄▄▄█████▄▄███ \n██████▄▄▄████▀▄ \n▀▀▀▀▀██████▀█ ▀▄\n ▄▀▀█▀ ▀▄▀▄ █\n█▀▀▀ ▄▀ ▄▄▄ ▀█ █\n▄▀▀█▀ █ █ ▄▀▄█\n▀▄▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["happy", "██▄▄▄█████▄▄███ \n██████▀▄▄▀███▀▄ \n▀▀▀▀▀██████▀█ ▀▄\n ▄▀▀█▀ ▀▄▀▄ █\n█▀▀▀ ▄▄▄ ▀█ █\n▄▀▀█▀ █ █ ▄▀▄█\n▀▄▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["injured_1", " \n▄▄ ▄█████▄▄███ \n█████▀███████▀▄ \n██████▄▄█▀█ █ ▀▄\n ▀▄▄▄▄█▀ ▀▄█ █\n █ ▄ ▄ ▀▄█\n ▄▄▀▄ █▀█▀▀▀▄▀\n█▄█▄▄█▄▄██▄█▄█▄█"], ["injured_2", " ▄▄▄▄▄ ▄▄▄ \n██▄▄██████████▀ \n█████▄▀▀███▀█ █ \n▀█▀▀▀▀██▀ ▀▄▀▄ █\n ▀▀█▀▀ ▀█ █\n █ █▄▄█ ▀▄█\n ▄▄▀▄ █ ▄▀▀▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["refuse", " ▄▄▄▄▄ ▄▄▄ \n██▄▄███▀▀█████▀ \n██████▄▄███▀█ █ \n▀█▀ ▀██▀ ▀▄▀▄ █\n ▀▀█▀▀ ▄▄▄ ▀█ █\n▄▀▀█ █ █ ▄▀▄█\n▀▄▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["sleep_1", " \n▄▄ ▄█████▄▄███ \n██████▀▀█████▀▄ \n█████████▀█ █ ▀▄\n ▀▄▄▄▄█▀ ▀▄█ █\n▄█ █ ▄▀▀▄▀▀▀▄█\n█ ▀▀▄ ▀▄▄▀ ▀█\n█▄▄▄▄█▄▄▄█▄▄▄▄▄█"], ["sleep_2", " \n ▄▄▄▄▄ ▄▄▄ \n██▄▄██████████▀ \n██████▄▄███▀█ █ \n▀█▀▀▀▀██▀ ▀▄█ █\n▄██▀▀▀▀ ▄▀█▀▀▀▄█\n█ ▀▄ █▄▀ ▀█\n█▄▄▄█▄▄▄▄█▄▄▄▄▄█"], ["walk_1", "▄▄ ▄█████▄▄███ \n█████▀▄ ▄████▀▄ \n█████████▀█ █ █ \n ▀▄▄▄▄█▀ █ █\n ▄▄▀ ▄▄▀ ▀▄█ █\n █ █ █ █ ▄█▀▄█\n ▄█▀▄ ▀▀▀█ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["walk_2", " ▄▄▄▄▄ ▄▄▄ \n██▄▄██▀▀▀█████▀ \n█████▄█▄███▀█ █ \n▀█▀▀▀▀██▀ ▀▄▀▄ █\n ▀▀█▀▀ ▄▄▄ ▀█ █\n▄▀▀█ █ █ ▄▀▄█\n▀▄▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"]]], + ["gesomon", [["angry", " ▄▀▀▄ \n ▄▀▄ ▀▄ \n ▄▀ ▄▀ ▀▄ \n ▀▄ ▄▄▄▄▄▄▄▀ \n ▄ █████▀ ███ \n█ ▀▀▄▄▄█▀▀▀▄ █ \n █▀▄ ▄▄ ▄ ▄▄▀█ \n ▀▄▄▄▀▄▄▄▀▄▄▄▄▀ "], ["attack", " ▄▀▄▄▄▄▄▄▄▄▄ \n ▀▄▄ █ \n ▄█████▄▄ █ \n ▀ ▀ ▀█▀ █ █ \n █████ ▀▄\n▄▀▀▄█▄█▄█▀▀▄ █▀ \n▀▄█▄ ▄ ▄ ▄▄▀▄ \n▀▄▄▄▄▀▄▄▀▄▄▄▄▄▀ "], ["eat_1", " ▄▄▄▀▀▀▀▀█ \n █▀ █ \n ▄███▄▄▄ █ \n ▀█▄ █▄ ▀▄ \n █████▀▀ \n▄▀▀▄▄▄▄██▀▀▄ █ \n▀▄▀▄ ▄ ▄ ▄▄▄▀▄ \n ▀▄▄▄▀▄▄▀▄▄▄▄▄▀ "], ["eat_2", " ▄▀▀▄ \n ▄▀▄ ▀▄ \n ▄▀ ▄▀ ▀▄ \n ▀▄ ▄▄▄▄▄▄▄▀\n █████▄ ███▄ \n▄▀▀▄▀▄▄▄▄█▀▀█ ▄▀\n ▀▄▄▄ ▄ ▄ ▄▄▄▀▄\n ▀▄▄▄▄▀▄▄▀▄▄▄▄▄▀"], ["happy", " ▄▀▀▀▄ \n ▄▀ ▀ ▀▄ \n ▄▀ ▀▄ \n▀▄█▀▀▄▄▄▄▄▀▀█▄▀ \n ▄█▄▀█████▀▄█▄ \n█ ▄█ █▄ █ \n▀▄▄▀▀▄▄▄▄▄▀▀▄▄▀▄\n▀▄▄▄█▄▄█▄▄█▄▄▄▄▀"], ["injured_1", " ▄▀▀▄ \n ▄▀ ▄ ▀▄ \n ▄▀ ▄▀ ▀▄ \n ▀▄▄▄▄ ▄▄▄▄▄▀ \n ▄█▀ █▀█ ▀██ \n █ ▄▀▀█▄█▀▀▀ ▀▄ \n █▄▄ ▄ ▄ ▄█▄█ \n▀▄▄▄▄█▄▄█▄▄▄▄▄▄▀"], ["injured_2", " ▄▄ \n ▄▀ ▀▄ \n ▄▀ █ ▀▄ \n ▄▀ ▀ ▀▄ \n ▀█▀▀▄▄▄▀▀██▀ \n ▄▀ ███▀████ ▀▄ \n █▄▀ ▀▀▀ ▀▄█ \n▀▄▄▄█▄▄█▄▄█▄▄▄▄▀"], ["sleep_1", " \n ▄▀▀▄ \n ▄▀ ▄ ▀▄ \n ▄▀ █ ▀▄ \n ▀▄ ▀ ▄▄▀ \n ▄█▀▀▄▄▄▀▀▀█▄ \n▄▀▄▀▄ ▄ ▄ ▄▄▀▄▀▄\n▀▄█▄▄█▄▄█▄▄▄▄█▄▀"], ["sleep_2", " ▄▄ \n ▄▀ ▀▄ \n ▄▀ █ ▀▄ \n ▄▀ ▀ ▀▄ \n ▀█▀▀▄▄▄▄▀▀█▀ \n ▄▀▀▀▀█▄▄█▀▀▀▀▄ \n█ ▄▀▄ ▄ ▄ ▄▄▀▄ █\n ▀█▄▄█▄▄█▄▄▄▄█▀ "], ["walk_1", " ▄▀▀▄ \n ▄▀ ▄ ▀▄ \n ▄▀ ▄▀ ▀▄ \n ▀▄▄▄ ▄▄▄▄▀ \n ▄█ ▀███▀ ██▄ \n▄▀ ▀▀█▄▄█▀▀▀ ▀▄\n▀▄█▄ ▄ ▄ ▄▄▀▄▀\n▀▄▄▄▄▀▄▄▀▄▄▄▄▄▀ "], ["walk_2", " ▄▄ \n ▄▀ ▀▄ \n ▄▀ █ ▀▄ \n ▄▀ ▀ ▀▄ \n ▀█▀▄▄▄▄▄▀██▀ \n ▄▀█▄▄▀▀█▄▄█▀▀▄ \n▄▀▄▄▀▄▀▀▀▄▄▄▀▄▀▄\n▀▄▄█▄▄▄█▄▄▄▄▄█▄▀"]]], + ["ghostmon", [["angry", " ▄ ▄ \n ▄ ▄█▄██ \n █▀▄▀▀▀█ ▄█▀ \n ▄▄▄███████▄▄ \n █ ▀█▀ ██ \n ▀█████▀▄ \n ██▀▄▄▄▄▀██ \n ▀ ▀███▄▄▀ "], ["attack", " ▄▀▄█ \n ▄█ ████▀ ▄▄ \n ▀▄█▄▄▄█▄▀▀ \n ▄ ▀█ ▀█▀ ██▀ ▄ \n ██ ██▀▀▀██▀▄██ \n ▀▀ █▄▄▄█ ▀ \n ▄▄▄▄ \n ▀▀▀█▄ "], ["eat_1", " ▄▀▄█ \n ▄█ ████▀ ▄▄ \n ▀▄█▄▄▄█▄▀▀ \n ▀▀█▀███▀██▀▀ \n ██▀▀▀██▀ \n ▀▄▄▄█▀▄ \n ██▀▄▄▄▄▀██ \n ▀ ▀███▄▄▀ "], ["eat_2", " ▄▀▄█ \n ▄█ ████▀ ▄▄ \n ▀▄█▄▄▄█▄▀▀ \n ▀▀█▀▄▀█▀▄▀█▀ \n ██▀▀▀▀█▀ \n ▄▄█▀▀▀▀▄█▄ \n █▀ ████ ▀█ \n ▀▀▀▀▄ "], ["happy", " ▄▀▄█ \n ▄█ ████▀ ▄▄ \n ▀▄█▄▄▄█▄▀▀ \n ▀▀█▀▄▀█▀▄▀█▀ \n ██▀▀▀▀▀█ \n ▀█▄▄▄█▀ \n ██▀▄▄▄▄▀██ \n ▀ ▀███▄▄▀ "], ["injured_1", " \n \n \n ▄▀▄█ \n ▄█ ████▀ ▄▄ \n ▀▄█▄▄▄█▄▀▀ \n ▀██████████▀ \n ████████ "], ["injured_2", " \n \n \n ▄ ▄ \n ▄ ▄█▄██ \n █▀▄▀▀▀█ ▄█▀ \n ▄▄▄███████▄▄ \n ▀████████▀ "], ["sleep_1", " \n ▄ ▄ \n ▄ ▄█▄██ \n █▀▄▀▀▀█ ▄█▀ \n ▄▄▄███████▄▄ \n █▀▀█▀▀██ \n ▀█████▀▄ \n ▄██▀▄▄▄▄▀██▄ "], ["sleep_2", " \n ▄▀▄█ \n ▄█ ████▀ ▄▄ \n ▀▄█▄▄▄█▄▀▀ \n ▀▀████████▀▀ \n █▄▄█▄▄█▀ \n ▄▄█▀▀▀▀▄█▄ \n ▀▀▀ ▀███▄▀▀▀ "], ["walk_1", " ▄▀▄█ \n ▄█ ████▀ ▄▄ \n ▀▄█▄▄▄█▄▀▀ \n ▀▀█▀███▀██▀▀ \n ██▀▀▀██▀ \n ▄▄█▀▀▀▀▄█▄ \n █▀ ████ ▀█ \n ▀▀▀▀▄ "], ["walk_2", " ▄ ▄ \n ▄ ▄█▄██ \n █▀▄▀▀▀█ ▄█▀ \n ▄▄▄███████▄▄ \n █▄███▄██ \n ▀█▄▄▄█▀▄ \n ██▀▄▄▄▄▀██ \n ▀ ▀███▄▄▀ "]]], + ["ghoulmon", [["angry", " ▄▄ \n ▄██▄█▀ ▀█████▀\n▄█████▀█▄█████▄ \n█ ▄ █ ▀▀██▀ \n▀▄▀▀▄▀ ▀▄ \n ▄▀▀ ▄▀ █ ▀▄ \n▀▄▄▄▀▄▄▄▀ ▄ ▄▀\n ▄█▄▄▄▄▀█▄▄▄▄▀ "], ["attack", " ▄█▀▄▄▄ ▀██████\n▄▀▀████▄ █████▀ \n█▄█ █▀ ▀████▀▀ \n███ █ ▀█ \n▀▄▄▀ ▄▀▀ ▄ ▀▄ \n ▀▄ ▀▄▄▀ █▀▄\n █ ▄▄ ▄█\n ▄█▄▄▄▄█▀▀▄▄▄█▀ "], ["eat_1", " ▄█▀▄▄ \n ▄█████▄ ▀████▄\n█▀██▀█ ▀▄████ \n█ ▀▀ █ ▄ ███▀▀ \n▄▀▄▄▀ ▄▀ ▄█▀▄ \n▀▄█ ▀▀ ▀▀▄\n ▀▀▄ ▄ ▄▀ \n ▄█▄▄▄▀█▄▄▄▄▀ "], ["eat_2", " ▄▄ \n ▄██▄█▀ ▀█████▀\n▄█████▀█▄█████▄ \n█▄▄ █ ▀▀██▀ \n▀▄ ▀▄▀ ▀▄ \n ▄▀▀ ▄▀ █ ▀▄ \n▀▄▄▄▀▄▄▄▀ ▄ ▄▀\n ▄█▄▄▄▄▀█▄▄▄▄▀ "], ["happy", " ▄█▀▄▄ \n ▄█████▄ ▀████▄\n█▀▀▀▀█ ▀▄████ \n█▀▀▄ █ █ ██▀▀ \n▄▀▄▄▀ █ ▄▀▄ \n▀▄█ ▀ ▀▀▄\n ▀▀▄ ▄ ▄▀ \n ▄█▄▄▄▀█▄▄▄▄▀ "], ["injured_1", " ▄ ▄ ▄▄ \n ▄██▄█▀ ▀████▄ \n▄██████▄███████▄\n█ ▄ █▀ ▀█▄ ▀█\n█ ▀▀ █ ▀▄ \n ▀▄▄▀ ▄▀ ▄ ▀▄\n ▀█ ▀█▄▀ █▄█\n █▄▄█▀▄▄▄▄▄▄▀ "], ["injured_2", " \n ▄█ ▄█ ▄▄ \n █████▄ ▀████ \n█▀▀▀▀██▀▀█████ \n█ █▄ █ ▀███ \n▀▄ ▄▀ ▄ ██▀\n ▀█▄ ▀▄ ▄▀ ▄ █\n █▄▄▄██▄▄▄▄▄█▀"], ["sleep_1", " \n ▄█ ▄█ ▄▄ \n █████▄ ▀████ \n█▀▀▀▀██▀▀█████ \n█ ▄▄ █ ▀███ \n▀▄ ▄▀ ▄ ██▀\n ▀█▄ ▀▄ ▄▀ ▄ █\n █▄▄▄██▄▄▄▄▄█▀"], ["sleep_2", " ▄ ▄ ▄▄ \n ▄██▄█▀ ▀████▄ \n███████▄███████▄\n█ █▀ ▀█▄ ▀█\n█ ▀▀ █ ▀▄ \n ▀▄▄▀ ▄▀ ▄ ▀▄\n ▀█ ▀█▄▀ █▄█\n █▄▄█▀▄▄▄▄▄▄▀ "], ["walk_1", " ▄█▀▄▄ \n ▄█████▄ ▀████▀\n█▀██▀█ ▀▄████ \n█ ██ █ ███▀▀ \n ▀▄▄▀ ▄▀ ▄ ▀▄ \n▄▀▀ █▄ ▄▀ ▀▀▄\n▀█▄▀▄ ▀▀ ▄ ▄▀ \n ▄█▄▄▄▀█▄▄▄▄▀ "], ["walk_2", " ▄▄ \n ▄██▄█▀ ▀█████▀\n▄█████▀█▄█████▄ \n█ ██ █ ▀▀██▀ \n▀▄▀▀▄▀ ▀▄ \n ▄▀▀ ▄▀ █ ▀▄ \n▀▄▄▄▀▄▄▄▀ ▄ ▄▀\n ▄█▄▄▄▄▀█▄▄▄▄▀ "]]], + ["gigaseadramon", [["angry", "█▀▄ ▄▄▄▄▀▀█▄▄▄▄\n▀▄▄▀▀ ▄ ▀▀▀▄▄▄▀ \n█ ▀▀▄▀▀█▄▄▀ \n▀▄█████▄▄▀▄▀ \n ▀▄▄▄▄█▄█▄▄▀▀▄ \n █▄█ ▄▀ ▄▀█▄▀▄\n █▄█ ▀▀▀▀▀▀ █\n ▀▄█▄▄▄▄▄▄▀▀ "], ["attack", "█▀▄ ▄▄▄▄▀▀█▄▄▄▄\n▀▄▄▀▀▄▄ ▀▀▀▄▄▄▀ \n█ ▀▀ ▄▀▀█▄▄▀ \n▀▄▀▀███▄▄▀▄▀ ▄▀▄\n ████ ██▄ ▀▄█\n █▀▀▀▀▄▀ ▄▀▄▀ █\n ▀█▀█ ▀▀▀▀ ▄▀ \n ▀█▄█▄▄▄▄▀ "], ["eat_1", "█▀▄ ▄▄▄▄▀▀█▄▄▄▄\n▀▄▄▀▀▄▄ ▀▀▀▄▄▄▀ \n█ ▀▀ ▀▀█▄▄▀ \n█▄▀▀▀▀▄ ▄▀▄▀ ▄ \n ▄▄▄▄▀ ▄█▄▄ █ █\n ▀▄▄▄ █▀ ▄▀ ▄▀█\n █▄█ ▀▀▀▀▀▀ ▄▀\n ▀▄█▄▄▄▄▄▄▀ "], ["eat_2", " \n█▀▄ ▄▄▄▄▀▀█▄▄▄▄\n▀▄▄▀▀▄ ▀▀▀▄▄▄▀ \n█ ▀ ▀▄▀▀█▄▄▀ \n█▄▀▀▀▀▀▄▄▀▄▀ \n ▀█▀█▀ ▄█▀▀▄▄▄ \n █▄█ ▀▄▄▀▀▄▀ \n ▀▄▄█▄▄▄▄▄▀▀ "], ["happy", "█▀▄ ▄▄▄▄▀▀█▄▄▄▄\n▀▄▄▀▀▄ ▀▀▀▄▄▄▀ \n█ ▀ ▀ ▀▀█▄▄▀ \n█▄▀▀▀█▄ ▄▀▄▀ ▄ \n ▄▄▄██ ██▄▄ █ █\n ▀▄▄▄ █▀ ▄▀ ▄▀█\n █▄█ ▀▀▀▀▀▀ ▄▀\n ▀▄█▄▄▄▄▄▄▀ "], ["injured_1", "▄▄ ▄▄▄ \n█ ▀▄▄▀▀▀█▄▄▀▀▀█▀\n▄▀▀ █▄ ▄▄▄▀▀█ \n█ ▄▄▄▄▄▀ ▄▀█▀ \n▀▀▄▄▄▄▄▀▀▄▀ \n ▄▀█ ▄█▀▀█ \n █▄█ ▀▄▄█▄▀▀▄ \n ▀▄▄█▄▄▄▄▄▄▀▀▄█"], ["injured_2", " \n█▀▄ ▄▄▄▄▀▀█▄▄▄▄\n▀▄▄▀▀▄ ▀▀▀▄▄▄▀ \n█ ▀▀▄▀▀█▄▄▀ \n█▄▀▀▀▀▀▄▄▀▄▀ \n ▀█▀█ ▄█▀▀█ \n █▄█ ▀▄▄█▄▄▄▄ \n ▀▄▄█▄▄▄▄▄▄█▄▄█"], ["sleep_1", " \n█▀▄ ▄▄▄▄▀▀█▄▄▄▄\n▀▄▄▀▀ ▀▀▀▄▄▄▀ \n█ ▀▀▀ ▄▀▀█▄▄▀ \n█▄▀▀▀▀▀▄▄▀▄▀ \n ▀█▀█▀ ▄█▀▀▄▄▄ \n █▄█ ▀▄▄▀▀▄▀ \n ▀▄▄█▄▄▄▄▄▀▀ "], ["sleep_2", "▄▄ ▄▄▄ \n█ ▀▄▄▀▀▀█▄▄▀▀▀█▀\n▄▀▀▄▄▄ ▄▄▄▀▀█ \n█ ▄▄▄▄▄▀ ▄▀█▀ \n▀▀▄▄▄▄▄▀▀▄▀ \n ▄▀█ ▄█▀▀█ ▄▄\n █▄█ ▀▄▄█▄▀█▄▀\n ▀▄▄█▄▄▄▄▄▄▀ "], ["walk_1", "█▀▄ ▄▄▄▄▀▀█▄▄▄▄\n▀▄▄▀▀▄▄ ▀▀▀▄▄▄▀ \n█ ▀▀ ▄▀▀█▄▄▀ \n█▄▀▀▀▀▀▄▄▀▄▀ ▄ \n ▀▀█▀█▀▄█▄▄ █ █\n █▄█ ▄▀ ▄▀ ▄▀█\n █▄█ ▀▀▀▀▀▀ ▄▀\n ▀▄█▄▄▄▄▄▄▀ "], ["walk_2", "▄▄ ▄▄▄ \n█ ▀▄▄▀▀▀█▄▄▀▀▀█▀\n▄▀▀ ▄█▀ ▄▄▄▀▀█ \n█ ▄▄▄▄▄▀ ▄▀█▀ \n▀▀▄▄▄▄▄▀▀▄▀ \n ▄▀█ ▄█▀▀█ ▄▄\n █▄█ ▀▄▄█▄▀█▄▀\n ▀▄▄█▄▄▄▄▄▄▀ "]]], + ["gigimon", [["angry", " \n ▄▄▄\n ▄▀▀▀▀▀▀▀█▄▀ ▄▀\n █ ▀▄ ▀▄▄▀ \n█ █▄ ▄█ ▄▀▄▄█▄ \n█ ▄▄▄ ▀▀ █ \n █▄ ▄█▀▄ \n█▄▀▀▀▀▀█▄▀ ▀▄█ "], ["attack", " ▀█▀▄ ▄▀▀█▀ \n ▄▀▀▀▀█▀ ▄█ \n █ ▀▀▄█ ▀█ \n ▀█▀▀█▀▄ █▀▄ \n █ █ ▀▄\n ▄ ▄ █ █▀▀▀\n █▀▀▀▀▀▀▀ ▄ ▀▄ \n█▄█▀▀▀▀█▄▀▀█▄█ "], ["eat_1", " ▄▄▄ ▄▄▄▄ \n █▄█▄▄▄▀ ▄▀ \n ▄▀ ▀ ▄▀█ ▄▄▄\n▄▀█ █ ▄ █ ▄▀\n█ ▄▄▄ ▀▀ █▄▀ \n█ ███ █ \n █▄ ▄ █ \n █▄▀▀▀▀█▄▀▀▄█ "], ["eat_2", " \n ▄▄▄ ▄▄▄▄ \n █▄█▄▄▄▀ ▄▀ \n ▄▀ ▀ ▄▀█▄▀▀█\n█▄▀▄ ▄▀▄ █ █ \n█ ▄ ▄ ▄█ █▀ \n▀▄ ▀▀ █ \n█▄█▄▄▄▄█▄▄█▄▄█ "], ["happy", " ▀█▀▄ ▄▀▀█▀ \n ▄▀▀▀▀█▀ ▄█ ▄▄▄\n▄▀▄ ▄ ▀ ▀█ ▄▀\n█▀ ▀ ▀ ▀ ▄ █▄▀ \n█ ▄▄▄▄▄▄ ▀▀ █ \n▀▄ ▀▀▀▀ ▄▀▄ \n █▀▄▄▄▄▄ ▄▀▀▄█ \n ▀▀ ▀▀ "], ["injured_1", " \n \n ▄▄▄\n ▄▀▀▀▀▀▀▀█▄▀ ▄▀\n▄▀▄ ▄ ▀▄ ▀▄▄▀ \n█▀▀ ▀██ ▀▄▄█▄ \n▀▄ ▀▀▀ ▄ █▄ \n█▄█▄▄▄█▄▄▄██▄▄█ "], ["injured_2", " \n \n \n ▄▄▄▄▄▄▄ ▄▄▄\n ▄▀ ▄ ▀█▀ ▄▀\n█▄█ █▄▄▀▄ ▀█▀ \n█ ▄▄▄ ▀█ ▀██▀ \n██▄▄▄▄▄█▄▄██▄▄█ "], ["sleep_1", " \n \n \n ▄▀▀▀▀▀▀▀▄▄ \n █ ▀▄ ▀▄▄ \n█ ▄▄ ▄▄ ▄▀▄▄█▄ \n█ ▄ ▀▀ ▄▀▀ █ ▀▄\n█▄▄█▄▄█▄▄▄█▄▄█▄█"], ["sleep_2", " \n \n ▄▄▄▄▄▄▄ \n ▄▀ ▄ ▀█ \n▄▀ ▀▄ ▀█ \n█ ▀▀ ▀▀▄█ ▀██▀ \n█ ▄ ▀▀ ▄ █ ▀▄\n█▄▄█▄▄█▄▄▄█▄▄█▄█"], ["walk_1", " \n ▀█▀▄ ▄▀▀█▀ \n ▄▀▀▀▀█▀ ▄█ ▄▄▄\n █▄ ▄ ▀ ▀█ ▄▀\n█ ▀ ▀▄█ █▄▀ \n█ ▄▄▄ █ \n █▄ ▄ █ \n █▄▀▀▀▀█▄▀▀▄█ "], ["walk_2", " \n ▄▄▄ ▄▄▄▄ \n █▄█▄▄▄▀ ▄▀ \n ▄▀ ▀ ▄▀█▄▀▀█\n▄▀█ █ ▄ █ █ \n█ ▀▀ █▀ \n▀▄ ▀▀▀ █ \n█▄█▄▄▄▄█▄▄█▄▄█ "]]], + ["ginryumon", [["angry", " ▄▄▀▀█ ▄▀█▄▄ \n ▄▀▄▄███▀ ▀ ▄▀ \n█ ▀▀▄▄▄▄▄▄▀▀ ▄▀▄\n█▀▀▀ ▄█ ██ █▄█\n ▀▄▄▄▄ ▀▄▀▄█ █\n ▄▀ █▄▄▀▀ █\n █▀▀▄▄█▄▄▄█▄▄▄▀\n █▄█▄█ █▄█▄█ █▄█"], ["attack", " ▄▄▀▀█ ▄▀█▄▄ \n ▄▀▄▄███▀ ▀ ▄▀ \n█ ▀▀▀▄▄▄▄▄█▀ ▄ \n█▀▀▀▀ ▄█ █▀▄ █ █\n▀█████▄ ▀▄▀▄█▀█\n ██▄▄█ ▄█▄█▀ █\n ▄▀▀▄ █▄▄▄█▄▄▀\n█▄█▄█▀▀▀█▄█▄██▄█"], ["eat_1", " ▄▄▀▀█ ▄▀█▄▄ \n ▄▀▄▄███▀ ▀ ▄▀ \n█ ▄▄▄▄▄▄▄▀▀ ▄▀▄\n█▀▀ ▄▀▄ █ █ █▄█\n █████ ▀▄▀▄█ █\n █▀▀▀ █▄▄▀▀ █\n ▄▀▀▄▄█▄▄▄█▄▄▄▀\n █▄█▄█ █▄█▄█ █▄█"], ["eat_2", " ▄▄▀▀█ ▄▀█▄▄ \n ▄▀▄▄███▀ ▀ ▄▀ \n█ ▀▀▄▄▄▄▄▄▀▀ ▄▀▄\n█▀▀▀ ▄▀▄ ██ █▄█\n ▀▄▄▄▄ ▀▄▀▄█ █\n ▄▀ █▄▄▀▀ █\n █▀▀▄▄█▄▄▄█▄▄▄▀\n █▄█▄█ █▄█▄█ █▄█"], ["happy", " ▄▄▀▀█ ▄▀█▄▄ \n ▄▀▄▄███▀ ▀ ▄▀ \n█ ▄▄▄▄▄▄▄█▀ ▄ \n█▀▀ ▄▀▄ ▀▄▀▄ █ █\n▀█████ ▀▄▀▄█▀█\n ▀█▀▀ ▄█▄█▀ █\n ▄▀▀▄ █▄▄▄█▄▄▀\n█▄█▄█▀▀▀█▄█▄██▄█"], ["injured_1", " ▄▄▄ ▄▄ \n ▄▀▀▄▄█▄▀▄▀▀█ \n▄▀▄▀▀▀▀▀ ▄▄▀ ▄ \n█▄▄▀▀█▀▀█▀▄ █ █\n▀▄ ▀▀ █ █ █▀█\n ▀█▀▀ ▄█▄█▀ █\n ▄█▀▄ █▄▄▄█▄▄▀\n█▄███▀▀▀█▄█▄████"], ["injured_2", " \n ▄▄▀▀█ ▄▀█▄▄ \n ▄▀▄▄███▀ ▀ ▄▀ \n█ ▀▄▄▄▄▄▄▄▀▀ ▄▀▄\n█▀▀ █▄ ▀▄▀▄ █▄█\n ▀▄▄▄ █▄██▀ █\n ▄█▄ █▄▄▄█▄▄▀\n█▄███▄▄▄█▄█▄████"], ["sleep_1", " \n ▄▄▀▀█ ▄▀█▄▄ \n ▄▀▄▄███▀ ▀ ▄▀▄ \n█ ▀▀▀▄▄▄▄▄▀▀ █ █\n█▀▀▀▀▄▄ █ █ █▀█\n ▀▄▄▄ █▄██▀ █\n ▄█▄ █▄▄▄█▄▄▀\n█▄███▄▄▄█▄█▄████"], ["sleep_2", " ▄▄▄ ▄▄ \n ▄▀▀▄▄█▄▀▄▀▀█ \n▄▀▄██▀▀▀ ▄▄▀ ▄ \n█▄▄▄▄▀▀▀█▀▄ █ █\n▀▄ ▀▀ ▀▄▀▄ █▀█\n ▀█▀▀ ▄█▄█▀ █\n ▄█▀▄ █▄▄▄█▄▄▀\n█▄███▀▀▀█▄█▄████"], ["walk_1", " ▄▄▀▀█ ▄▀█▄▄ \n ▄▀▄▄███▀ ▀ ▄▀ \n█ ▀▀▀▄▄▄▄▄▀▀ ▄▀▄\n█▀▀▀▀▄▀ █ █ █▄█\n ▀▄▄▄▄ ▀▄▀▄█ █\n ▄▀ █▄▄▀▀ █\n █▀▀▄▄█▄▄▄█▄▄▄▀\n █▄█▄█ █▄█▄█ █▄█"], ["walk_2", " ▄▄▄ ▄▄ \n ▄▀▀▄▄█▄▀▄▀▀█ \n▄▀▄██▀▀▀ ▄▄▀ ▄ \n█▄▄▄▄▀█▀█▀▄ █ █\n▀▄ ▀ ▀▄▀▄ █▀█\n ▀█▀▀ ▄█▄█▀ █\n ▄█▀▄ █▄▄▄█▄▄▀\n█▄███▀▀▀█▄█▄████"]]], + ["giromon", [["angry", " \n \n \n \n \n ▄ ▄▄█▄█ \n █▄▄██▄ \n ▄▄██▀▄ "], ["attack", " \n \n ▄ ▄ \n ▀▄███▀██▀ \n ███▄▄██ \n ███ \n ███ \n ▄▄▄██▀▄ "], ["eat_1", " \n \n \n \n ▄▄▄▄ ▄ \n ▀██▄███▀ \n ▀███ \n ▄▄██▀▄ "], ["eat_2", " \n \n \n \n \n ▄ ▄ \n ▄▀████ \n ▀██████▀ "], ["happy", " \n \n \n \n ▄ ▄ \n ▀█▀██▀█▀ \n ▄██ ██▄ \n ▀▄▄▀ "], ["injured_1", " \n \n \n \n \n █▄▄▄▄▄▄█ \n █▀██▀█ \n ▄██████▄ "], ["injured_2", " \n \n \n \n \n ▄ ▄ \n ▄▀▀██▀▀▄ \n ▄████████▄ "], ["sleep_1", " \n \n \n \n \n ▄ ▄ \n ▀██████▀ \n ▀▄▄██▄▄▀ "], ["sleep_2", " \n \n \n \n ▄ ▄ \n ▀██████▀ \n █▀▀██▀▀█ \n ▀██████▀ "], ["walk_1", " \n \n \n \n \n █▄▄▄▄▄█ \n █▄█▄█ \n █▀▄▄▄▀█ "], ["walk_2", " \n \n \n \n \n ▄ ▄ \n ▀█▀████▀ \n ▀████▄█▀ "]]], + ["gizamon", [["angry", " \n \n ▄▀▀█ ▄▄▄ \n ▄█▄████▄▄█ \n ▄▀ █▀ ▀▀████▀█\n ██▄ ▄█ ▀▀▀██▄▀\n █ ▄ ▀█▀▀▄\n█▄██▀▀█▄▄█▀█▄▄▄█"], ["attack", " ▄▄▀▀█ \n ▄▄█▄▄██▄▄▄▄▄ \n ▄█▄▀▀▄█ ▀▀█▄▄▀ \n █▄ ▄ ▄ ▄ ▀▀██▄▄\n ▀███████ █▄▀\n ▄█▀█▀█▀█ █▄\n █▄▄▄▄▄▄ ▄█▄ █\n█▄▄█ █▄▄▄▀█▄▄▄█"], ["eat_1", " ▄▄▄ \n ▄▀▄▄█ ▄▄▄ \n ▄▀██▀▀██▄ █ \n ▄▀▄▀ ▄▀▄ ▀██▄▄▄\n █▄▄▄▄▄▄ ▀▀██ █\n ███▀▀▀█ ▀▀██ \n █▄▀▀▀▀▀▄▄ ▄▄ ▀▄\n█▄▄█▀▀▀█▄▄██▄▄▄█"], ["eat_2", " \n \n ▄▀▀█ ▄▄▄ \n ▄█▄████▄▄█ \n ▄▀ █▀ ▀▀████▀█\n █▀▄ ▄▀▄ ▄███▄▀\n █ ▄ █▀▀▄\n█▄██▀▀█▄▄█▀█▄▄▄█"], ["happy", " ▄▄▄ \n ▄▀▄▄█ ▄▄▄ \n ▄▀██▀▀██▄ █ \n █▀▄▀ ▄▀▄ ▀██▄▄▄\n █▄▄▄▄▄▄▄ ▀▀██ █\n ██████▀ ▀▀██ \n █▄▀▀▀▀▄ ▄▄ ▀▄\n█▄▄█▀▀█▄▄▄▀█▄▄▄█"], ["injured_1", " \n \n ▄▄▄ \n ▄▀ ▄█▄▀▀█ \n ▄██▄███████▄▄▄\n ▄▀▄▀▀▄ ▀▀███ █\n █▀▀ ▀▀ ▀████ \n██▄▄▄▄█▄▄▄█▄▄▄▄█"], ["injured_2", " \n \n \n ▄▀▀█ ▄▄▄ \n ▄█ ▄███▄▄█ \n █▀██▀▀▀█████▀█\n █▄█ █▄ ▄███▄▀\n█▄▄▄▄▄▄▄▄▄█▄▄▄▄█"], ["sleep_1", " \n \n ▄▄▄ \n ▄▀▄▄█▄▀▀█ \n ▄▀██▀▀█████▄▄▄\n █ ▀ ▀███ █\n █▀▀ ▀▀▀ ▀▀██▀▄\n█▄█▄▄▄▄█▄█▄▄█▄▄█"], ["sleep_2", " \n \n ▄▀▀█ ▄▄▄ \n ▄█▄████▄▄█ \n ▄▀ █▀ ▀▀████▀█\n █▄▄ ▄▄▄ ▄███▄▀\n █ ▄ █▀▀▄\n█▄██▀▀█▄▄█▀█▄▄▄█"], ["walk_1", " \n \n ▄▀▀█ ▄▄▄ \n ▄█▄████▄▄█ \n ▄▀ █▀ ▀▀████▀█\n █ █ █ ▀▀▀██▄▀\n █ ▄ ▀█▀▀▄\n█▄██▀▀█▄▄█▀█▄▄▄█"], ["walk_2", " \n \n ▄▄▄ \n ▄▀▄▄█▄▀▀█ \n ▄▀██▀▀█████▄▄▄\n █ ▄▀ ▄ ▄████ █\n █ ▀ ▀ ▄███ \n██▄▄▄▄█▄▄▄█▄▄▄▄█"]]], + ["gogmamon", [["angry", " ▄▄▄\n ▄▀▀▀▀▀▀▄▀ █\n ▄▀█▄▀▀▀█ ▀▄ █ \n█ ▀ ▄ ▀▀▄ ██▄█ \n█ ▀▀ ▀█ ████ █ \n▀▄▀▀▀▀██▀█▀▀ █ \n ▄▀██▀▀ ▄█▄ ▄█ \n█▄█▄██▀▀▀▀████▄█"], ["attack", " ▄▀▀█\n ▄▀▀▀▀▀▀▄█\n ▄▀█▄▀▀▀█ ▀▄█\n █ ▀ ▄ ▀▀▄ █▀▄\n▄▀▀█ ▀▀ ▀█▀▀▄ █\n▀▄▄█▄▀▀▀▀▀█▄▄▄▄▀\n ▄▀██▀▀ ▄█▀▄ \n █▄█▄██▀▀█▄█▄█"], ["eat_1", " ▄▀▀▀▀▀▀▄▄▀▀█\n ▄▀█▄▀▀▀█ ▀▄ ▄▀\n█ ▀ ▀▀▄ ██ ▄▀ \n█ ▀▀ ▀█ ████▀▄ \n▀▄▀███▀█▄███ █ \n ▄▀▀▀▄▀ ▄█ █ \n ████▄▄███▄▄▄▀ \n █▄█▄█▀ ▀█▄█▄█ "], ["eat_2", " ▄▄▄\n ▄▀▀▀▀▀▀▄▀ █\n ▄▀█▄▀▀▀█ ▀▄ █ \n█ ▀ ▄ ▀▀▄ ██▄█ \n█ ▀ ▀ █ ███▀ █ \n▀▄▀▀▀▀██▀▀█▀ █ \n ▄▀██▀▀ ▄██ █ \n█▄█▄██▀▀▀▀████▄█"], ["happy", " ▄▀▀▀▀▀▀▄▄▀▀█\n ▄▀█▄▀▀▀█ ▀▄ ▄▀\n█ ▀ ▄ ▀▀▄ ██ ▄▀ \n█ ▀ ▀ █ ████▀▄ \n▀▄▀███▀█▄███ █ \n ▄▀▀▀▄▀ ▄█ █ \n ████▄▄███▄▄▄▀ \n █▄█▄█▀ ▀█▄█▄█ "], ["injured_1", " \n ▄▄▄▄▄▄ ▄▀▀█\n ▄▄▀▄▄▄▄ ▄▀ ▄▀\n▄▀▄▀▀ ▄▄▀ ▄█ ▄▀ \n█ █▄ ▄▀▄███▀▄ \n█ ▄▄▄▄▄█▄███ █ \n▄▀▄▄▄▄█▀ ▄▀ █ \n██▄██▄▄▄██▄▄▄█▄█"], ["injured_2", " \n ▄▄▄\n ▄▀▀▀▀▀▀▄▀ █\n ▄▀█▄▀▀▀█ ▀▄ █ \n█ ▀ ▄ ▀▀▄ ██▄█ \n█ ▀▀ █ ███▀ █ \n▀▄▀▀▀▀███▀▀ █ \n█▄███████▄▄▄▄█▄█"], ["sleep_1", " \n ▄▄▄▄▄▄ ▄▀▀█\n ▄▄▀▄▄▄▄ ▄▀ ▄▀\n▄▀▄▀▀ ▄▄▀ ▄█ ▄▀ \n█ ▄▄ ▄▀▄███▀▄ \n█ ▄▄▄▄▄█▄███ █ \n▄▀▄▄▄▄█▀ ▄▀ █▄\n██▄██▄▄▄██▄▄▄█▄█"], ["sleep_2", " ▄▄▄\n ▄▀▀▀▀▀▀▄▀ █\n ▄▀█▄▀▀▀█ ▀▄ █ \n█ ▀ ▀▀▄ ██▄█ \n█ ▀▀ █ ███▀ █ \n▀▄▀▀▀▀██▀▀█▀ █ \n ▄▀██▀▀ ▄██ █ \n█▄▄▄██████████▄█"], ["walk_1", " ▄▄▄▄▄▄ ▄▀▀█\n ▄▄▀▄▄▄▄ ▄▀ ▄▀\n▄▀▄▀▀ ▄▄▀ ▄█ ▄▀ \n█ ▄█ ▄▄▀▄███▀▄ \n█ ▄▄▄▄▄█▄███ █ \n ▀▄▄▄▄█▀ ▄█ █ \n ▄██▄▄▄███▄▄▄▀ \n █▄█▄█▀ ▀█▄█▄█ "], ["walk_2", " ▄▄▄\n ▄▀▀▀▀▀▀▄▀ █\n ▄▀█▄▀▀▀█ ▀▄ █ \n█ ▀ ▄ ▀▀▄ ██▄█ \n█ ▀▀ ▀█ ███▀ █ \n▀▄▀▀▀▀██▀▀█▀ █ \n ▄▀██▀▀ ▄██ █ \n█▄█▄██▀▀▀▀████▄█"]]], + ["goldramon", [["angry", " ▄▀▀▀▀▀█▀▀█ █▄ \n█ ▄█ ▀█ ▄▀ █ \n ████▄▄ ▄▀█ █\n █▀▀▀▀▀▄█▀▀▄ █\n ▄█▀█▀▀█▀▀▄█ █\n █ ██▀▀█ █▄▀▄█\n ▀█ ▀▀▀ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["attack", " ▄▄▀▀▀█▀▀█ █▄ \n▄▀ ▄█ ▀█ ▄▀ █ \n▀▄▄▄▄ ▄▀█ █\n ▀▄ ▀▀▀▄▀▄▄ █\n ▄▄█▀█▀▀██ █ █\n█ ▀██▀▀█ ▀██▄▀▄█\n ▀▀▀▄ ▀▀ ▄▀ \n ▀▀▀▀▀▀▀▀ "], ["eat_1", " ▄▄▄▄▄▄▄ ▄ \n ▄▀▀ ▄ ▀▄▄▀ █▀▄ \n█ ▀ ▀ █▄▀ ▀▄\n █▀▀▀▄▄▄▀▄▀ █\n ▀▄▄▄▄▄█▄▀▀▄ █\n▄▀██▄█▄▄▀█▄▄▀▄ █\n▀▄▄█▀ ▀▄▄▀▀▀ █▀\n ▀▄▄▄▄▄▄▄▄▀ "], ["eat_2", " ▄▀▀▀▀▀█▀▀█ █▄ \n█▄▄▄ ▀▄ ▀█ ▄▀ █ \n ▀███▄ ▄▀█ █\n ▀███▀▀▄▀▄▄ █\n ▄▄█▄▄▀▀██ █ █\n█ ▀██▀▀█ ▀██▄▀▄█\n ▀▀█ ▀▀ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["happy", " ▄▀▀▀█▀█▀▀█ █▄ \n█ ▀ ▀ ▀█ ▄▀ █ \n █████▄ ▄▀█▄▄ █\n ▄█▀▀▀▀▀▄▀█ █ █\n█ █▀█▀▀██▀▀█ █\n ▀▀██▀▀▀ ▀██▄▀▄█\n █ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["injured_1", " \n ▄▄▀▀▀█▀▀█ █▄ \n▄▀ █▄ ▀█ ▄▀ █ \n▀▄▄▄▄ ▄▀█ █\n ▀▄ ▀▀▀▄▀▄▄ █\n ▄█▀█▀▀██ █ █\n █▀██▀▀█ ▀██▄▀▄█\n █▄█▄▄▄█▄▄█▄▄▄▀ "], ["injured_2", " \n ▄▄▄▄▄▄▄ ▄ \n ▄▀▀▄ ▀▄▄▀ █▀▄ \n█ ▀▀ █▄▀ ▀▄\n █▀▀▀▄▄▄▀▄▀ █\n █▄▄▄▄▄█▄▀▀▄ █\n ▄██▄▀▄▄▀███▄▀▄█\n █▄█▄▄▄█▄▄█▄▄▄▀▀"], ["refuse", " ▄▄▄▄▄▄▄ ▄ \n ▄▀▀ ▄ ▀▄▄▀ █▀▄ \n█ ▀▀ █▄▀ ▀▄\n █▀▀▀▄▄▄▀▄▀ █\n ▀▄▄▄▄▄█▄▀▀▄ █\n▄▀██▄█▄▄▀█▄▄▀▄ █\n▀▄▄█▀ ▀▄▄▀▀▀ █▀\n ▀▄▄▄▄▄▄▄▄▀ "], ["sleep_1", " ▄▄▄▄▄▄▄ ▄ \n ▄▀▀ ▀▄▄▀ █▀▄ \n█ ▀▀ █▄▀ ▀▄\n █▀▀▀▄▄▄▀▄▀ █\n ▀▄▄▄▄▄█▄▀▀▄ █\n ▄█▄█▄▄▀█▄▄▀▄ █\n █ █▀ ▀▄▄█▀█ ▀▀\n ▀▀▄▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n ▄▄▀▀▀█▀▀█ █▄ \n▄▀ ▄▄ ▀█ ▄▀ █ \n▀▄▄▄▄ ▄▀█ █\n ▀▄ ▀▀▀▄▀▄▄ █\n ▄█▀█▀▀██ █ █\n █▀██▀▀█ ▀██▄▀▄█\n █▄█▄▄▄█▄▄█▄▄▄▀ "], ["walk_1", " ▄▄▀▀▀█▀▀█ █▄ \n▄▀ ▄█ ▀█ ▄▀ █ \n▀▄▄▄▄ ▄▀█ █\n ▀▄ ▀▀▀▄▀▄▄ █\n ▄▄█▀█▀▀██ █ █\n█ ▀██▀▀█ ▀██▄▀▄█\n ▀▀█ ▀▀ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["walk_2", " ▄▄▀▀▀█▀▀█ █▄ \n▄▀ ▄█ ▀█ ▄▀ █ \n▀▄▄▄▄ ▄▀█ █\n ▀▄ ▀▀▀▄▀▄▄ █\n ▄▄█▀█▀▀██ █ █\n█ ▀██▀▀█ ▀██▄▀▄█\n ▀▀▀▄ ▀▀ ▄▀ \n ▀▀▀▀▀▀▀▀ "]]], + ["goldramon_x", [["angry", "▄▄▄▄ ▄▄▄▄ ▄▄▄ \n▀▄▄▄▀▀ ▄ ▀ ▄▀ \n █ ▀▀▄▄▀█ ▄▄▄\n ▀▄▀▀▀▀ █▄▀ ▄▀\n ▀▄▄▄█▀█▀▀█ ▄▀\n ▄▀█▄█▄▄█▄▀█▀ \n █▄▀▄▄▀█ █▄▀█\n ▀▄▄▄▄▄███▄▄▄▀"], ["attack", "█▀▀▀▄▄▀▀▀▀▄▀▀█ \n ▀█▀ ▄█ ▄▄▀ \n █▄▄▄▄ ▄▀▄▀▄▀▀█\n █████ █▀▀▄ ▀▄\n █▀▀▀▀▄█▄▀▀▄▀ \n ██▀▀█▄▀█ █▄\n █ ▀▀ █▄█▀ █\n ▀▄▄▄▄▄▄▄▄▀ "], ["eat_1", "█▀▀▀▄▄▀▀▀▀▄▀▀█ \n ▀█▀ ▄▀▄ ▄▄▀ \n █ ▄▄▄▄▄▀▄▀▄▀▀█\n ▀████▀█▀▀█ ▀▄\n ▄█▀▀▀ █▄▀█▄▀ \n █ ██▀▀█ ▄▀ ▄▄\n ▀█ ▀▀ ▀█▄▄▀ █\n ▀▄▄▄▄▄▄▄▄▀ "], ["eat_2", "▄▄▄▄ ▄▄▄▄ ▄▄▄ \n▀▄▄▄▀▀ ▄ ▀ ▄▀ \n █ ▀ ▀▄▀█ ▄▄▄\n ▀▄▀▀▀▀▀▄█▄▀ ▄▀\n ▀▄▄▄█▀█ ▄█ ▄▀\n ▄▀█▄█▄▄▀▀ █▀ \n █▀▄▄▀▀▄▄██▄▀█\n ▀▄▄▄▄▄▄▄▄▄▄▄▀"], ["happy", "█▀▀▀▄▄▀▀▀▀▄▀▀█ \n ▀█▀ ▄▀▄ ▄▄▀ \n █ ▄▄▄▄▄▀▄▀▄▀▀█\n ▀████▀█▀█▄ ▀▄\n ▄▀█▀▀▀▄▀▀ █▄▀ \n ▀▄██▀▀█▄▄█▀ ▄▄\n █ ▀▀ █▄▄▀ █\n ▀▄▄▄▄▄▄▄▄▀ "], ["injured_1", " \n█▀▀▀▄▄▀▀▀▀▄▀▀█ \n ▀█▀ █▄ ▄▄▀ \n █ ▄▄▄▄▀▀▄▀▄▀▀█\n █ ▄▄█▀▀▄ ▀▄\n ▄█▀▀█ ▄█▀█▄▀ \n █ █▀▀██ ▄█▄▀█\n █▄▄▄▄▄██▄▄▄▄▀"], ["injured_2", " \n▄▄▄▄ ▄▄▄▄ ▄▄▄ \n▀▄▄▄▀▀▄ ▀ ▄▀ \n █ ▀▀▄▄▀█ \n ▀▄▀▀▀▀ █▄█▀▀▄\n █▄▄▄█▀▀█▄ █▀▄\n █ █▄▄██▀▀ ██▄▀\n ▀█▄▄▄▄█▄▄█▄▄▄█"], ["sleep_1", " \n█▀▀▀▄▄▀▀▀▀▄▀▀█ \n ▀█▀ ▄▄ ▄▄▀ \n █ ▄▄▄▄▀▀▄▀▄▀▀█\n █ ▄▄█▀▀▄ ▀▄\n █▀█▀ █▄▀█▄▀ \n ▄▀█▀▀██ ▄█▄▀█\n ████▄▄██▄▄▄▄▀"], ["sleep_2", "▄▄▄▄ ▄▄▄▄ ▄▄▄ \n▀▄▄▄▀▀ ▀ ▄▀ \n █ ▀▀▄▄▀█ ▄▄▄\n ▀▄▀▀▀▀ ▄█▄▀ ▄▀\n ▀▄▄▄█▀█ ▄█ ▄▀\n ▄▀█▄█▄▄▀▀ █▀ \n █▀▄▄▀▀▄▄██▄▀█\n ▀▄▄▄▄▄▄▄▄▄▄▄▀"], ["walk_1", "█▀▀▀▄▄▀▀▀▀▄▀▀█ \n ▀█▀ ▄█▀ ▄▄▀ \n █ ▄▄▄▄▀▀▄▀▄▀▀█\n █ ▄▄█▀▀▄ ▀▄\n ▄█▀█▀ █▄▀█▄▀ \n █ ██▀▀█ ▄▀ ▄▄\n ▀█ ▀▀ ▀█▄▄▀ █\n ▀▄▄▄▄▄▄▄▄▀ "], ["walk_2", "▄▄▄▄ ▄▄▄▄ ▄▄▄ \n▀▄▄▄▀▀ ▄▄ ▀ ▄▀ \n █ ▀▀▄▄▀█ ▄▄▄\n ▀▄▀▀▀▀ ▄█▄▀ ▄▀\n ▀▄▄▄█▀█ ▄█ ▄▀\n ▄▀█▄█▄▄▀▀ █▀ \n █▀▄▄▀▀▄▄██▄▀█\n ▀▄▄▄▄▄▄▄▄▄▄▄▀"]]], + ["golemon", [["angry", " ▄█████ ▄▄ \n ▄████▀███▄▀ █ \n ████▄▄██ █▄█▄ \n ▀▄▄▄▄▄ ▀▄█ ▄█▄ \n█▀▀████▄▀ █▀▀▄▀█\n▀▄▄██ ▄ ▄█▄▄█▀ \n █▀▄▀█▀█ \n █▄▄█▀▄▄▄█ "], ["attack", " \n ▄█████▄ █▀▄ \n ▄████▀██▀█ ▄▀ \n ████▄▄██ █▀▀▀▄ \n ▀█▀▀▀▀▀▄▀█▄▄▄▀ \n ▄██▀▀▀ █▄▄█▄ \n █ ▄▀▄▀▄▄▀█▄ █ \n ▀█▄▄███▄▄█▄▄▄▀ "], ["eat_1", " \n ▄█████▄ █▀▄ \n ▄████▀██▀█ ▄▀ \n ████▄█▄█ █▀▀▀▄ \n ▀█▀▀▀▀▀▄▀█▄▄▄▀ \n ▄██▀▀▀ █▄▄█▄ \n █ ▄▀▄▀▄▄▀█▄ █ \n ▀█▄▄███▄▄█▄▄▄▀ "], ["eat_2", " ▄█████ ▄▄ \n ▄████▀███▄▀ █ \n ████▄▄██ █▄█▄ \n ▀▄▄▄▄▄ ▀▄█ █ \n ▀████▄▀ █▀▀█ \n ▄▀▀█ ▄ ▄█▀▀▀█ \n █ ▀█▀▄▀█▀█▀ █ \n ▀█▄▄█▀▄▄▄█▀▀ "], ["happy", " ▄█████ ▄▄ \n ▄████▀███▄▀ █ \n ████▄█▄█ █▄█▄ \n █▄▄▄▄▄ ▀▄█ ▄█▄\n█ ▀████▄▀ █▀█ █\n ▀▀██ ▄ ▄█▄▀▀▀ \n █▀▄▀█▀█ \n █▄▄█▀▄▄▄█ "], ["injured_1", " \n ▄▄▄▄▄ █▀▄ \n ▄████████ ▄▀ \n █████▀██ █▀▀▀▄ \n █████▄▄▀▄█▄▄▄▀ \n █▄▄▄▄▄▀ █▄▄█▄ \n █ ▄█▀▄▀██▄ █ \n ▀▄▄▄███▄▄█▄▄▄▀ "], ["injured_2", " \n ▄▄ \n ▄█████▄▄▀ █ \n▄███████▀█▀▀▀▄ \n█████ ▀█ █▄▄▄▀ \n▀█▀▀▀▀▀▄█▀▄▄█▄▄ \n▄▀▀▀█▀█▀▄ █▄ █ \n▀▄▄█▄█▄▄▄██▄▄▄▀ "], ["refuse", " \n ▄▄▄▄▄ █▀▄ \n ▄████████▄▄█ \n █████▀ █ █ █ \n ███████▀▄█▀▀█▀ \n █▄▄▄▄▄▀ █▀▀▀▄ \n █ ▄▀▄▀▄▄▀█▀ █ \n ▀█▄▄███▄▄███▀▀ "], ["sleep_1", " \n ▄█████▄ █▀▄ \n ▄███████▀█ ▄▀ \n █████▄▄█ █▀▀▀▄ \n ▀█▀▀▀▀▀▄▀█▄▄▄▀ \n ▄██▀▀▀ █▄▄█▄ \n █ ▄▀▄▀▄▄▀█▄ █ \n ▀█▄▄███▄▄█▄▄▄▀ "], ["sleep_2", " \n ▄▄▄▄▄ █▀▄ \n ▄████████ ▄▀ \n █████▀▀█ █▀▀▀▄ \n ███████▀▄█▄▄▄▀ \n █▄▄▄▄▄▀ █▄▄█▄ \n █ ▄▀▄▀▄▄▀█▄ █ \n ▀█▄▄███▄▄█▄▄▄▀ "], ["walk_1", " ▄▄▄▄▄ ▄▄ \n ▄███████▄▀ █ \n ████▀ ██ █▄█▄ \n ███████▀▄█ █ \n ▀▄▄▄▄▄▀ █▀▀█ \n ▄▀▀█ ▄ ▄█▀▀▀█ \n █ ▀█▀▄▀█▀█▀ █ \n ▀█▄▄█▀▄▄▄█▀▀ "], ["walk_2", " \n ▄█████▄ █▀▄ \n ▄████▀██▀█ ▄▀ \n ████▄▄██ █▀▀▀▄ \n ▀█▀▀▀▀▀▄▀█▄▄▄▀ \n ▄██▀▀▀ █▄▄█▄ \n █ ▄▀▄▀▄▄▀█▄ █ \n ▀█▄▄███▄▄█▄▄▄▀ "]]], + ["gomamon", [["angry", " \n ▄▄ ▄▄▄ \n ▄▀▀▀▀▀▀▄ ▀ ▄▀\n █ ▄ █ ▄▀ \n▄▀▀ ▀▀ ▀ ▀▄ \n▀▄▄▀▄▄ █ \n ▄▀▄▄▄ █▄ ▄▀ \n█▄▄▄▀▀▄▄▄▄▄█▀ "], ["attack", " ▄▄▄ ▄▄▄ \n ▄▀▀▀▀▀▀▄ ▀ ▄▀\n █ ▄ █ ▀▄ \n█ ▄ ▀ █ █\n ▀█▀███▄ █\n █ ███ █\n ▄▄█▄██▀ █ ▀▄▄▀ \n█▄█▄▄▄▄▄█▄▄▄█ "], ["eat_1", " \n ▄▄▄▄▄▄ ▄▄ ▄▄ \n ▄▀ ▄ ▀▄ ▀ ▄▀\n▄▀ ▀ ▀ █ ▀▄ \n▀▄▄▄▄▄▄ █\n ▄███▀▀█ █\n█ ▄█▄▄▄▀ █ ▄ ▄▀\n▀▀▀▄▄▄▄▄█▄▄▄▄█ "], ["eat_2", " \n ▄▄ ▄▄▄ \n ▄▄▄▄█▄ ▀ ▄▀ \n ▄▀ ▀▄ ▀▄ \n █▄ ▄▄▄ █ ▀▄\n█ ▄ ▄ █\n █▀ ▀▀▀▀ ▄▄ █\n█▄██▀▀█▄▄▄▄▄█▄▀ "], ["happy", " \n ▄▄▄▄▄▄▀▀▄▀▀▀▄\n ▄▀ ▄ ▀▄ ▄▀ \n▄▀ ▀ ▀ █ ▀▄\n▀▄▄▄▄▄▄█ █\n ██▀▀█ █\n ▄▄█▄▄▄▀ ▄ ▄▄▀ \n█▄█▄▄▄▄▄█▄▄▄▄▄█ "], ["injured_1", " \n \n ▄▀▀▀▄▀▀▀▄ \n ▄▀▀▀▀▀▀▄ ▄▀ \n █ ▄ ▄ █ ▀▄ \n▄▀▀▀ ▀▀ █\n▀▄▄▄▀▄▄▄ ▄ ▀▄ █\n█▄█▄▄▄▄▄█▄▄▄█▄▀ "], ["injured_2", " \n \n \n ▄▀▀▀▀▀▀▄ \n █ ▄ █▀▀▄ \n▄▀▀ ▀▀ █ \n▀▄▄▀▄▄▄ ▀▄▄ ▀▄\n█▄█▄▄▄▄▄█▄▄▄▄█▄█"], ["sleep_1", " \n \n ▄▄ ▄▄▄ \n ▄▀▀▀▀▀▀▄ ▀ ▄▀\n █ █ ▀▄ \n▄▀▀ ▀▀ ▀ █\n▀▄▄█▄▄▄▀ █\n█▄▄▄█▄▄▄▄▄█▄▄▄▀ "], ["sleep_2", " \n \n ▄▀▀▀▄▀▀▀▄\n ▄▀▀▀▀▀▀▄ ▄▀ \n █ █ ▀▄\n▄▀▀ ▀▀ █\n▀▄▄█▄▄▄▀ ▄ █\n█▄▄▄█▄▄▄▄▄█▄▄▄▀ "], ["walk_1", " \n \n ▄▀▀▀▄▀▀▀▄\n ▄▀▀▀▀▀▀▄ ▄▀ \n █ ▄ ▄ █ ▀▄ \n▄▀ ▀ ▀ █ █\n▀▄▄▄▀▄▄▄▀ ▀▀▄▄▀\n█▄█▄▄▄▄▄▄█▄▄▄▄▄█"], ["walk_2", " \n \n ▄▀▀▀▀▀▀▄ \n █ ▄ ▄ █▄ \n▄▀ ▀ ▀ ▀ ▀▄ \n▀▄▄▄▀▄▄▄▀ █▄ \n ▄▀▄▄▄▄ █▄ ▀ █\n█▄▄▄▀ ▀▄▄▄▄█▄▄▄▀"]]], + ["gomamon_x", [["angry", " ▄▄▄▄ ▄▄▄ \n █ █▄▄▄▀▀▄▀ \n ▄▀█▀█▀█▀██▀ ▄█▀\n █▄ ▄ ███▄▀ \n▄▀ ▀ ▀ █ ▀▄ \n█ ▄▀▄ ▀ █\n █▄▄▄▄▄ ▀▀▄▄ ▄█\n█▄█▄█▄▄▄▄▄█▄▄█▄█"], ["attack", " ▄▀█▀ ▄▄▀█▀ \n ▄█████▀▄▄█ ▄█\n▄▀ ▀ ▀ ▄ ▀██▄█▄▀\n█ ▄ ▀ █ ▀█\n ▀█████▄ █\n █████ █\n ▄▄████▀ █ ▀▄ ▀▄\n█▄█▄▄▄▄▄█▄█▄█▄▄█"], ["eat_1", " ▄▀█▀▀ ▄▄▀█▀ \n █▄████▄▄█▄ \n █ ▀ ▀ ▀ ▀█▄ ▄█▀\n▄▀▄▀▄ ▄▀▄ █▀█▄▀ \n▀▄▄▄▄▄▄▄ ▀▄ ▀▄ \n ▀█████▀█ ▀ █\n ▄██▄▄▄▄█ ▀▄▄ ▄█\n█▄█▄█▄▄▄▄▄█▄▄█▄█"], ["eat_2", " ▄▄▄▄ ▄▄▄ \n █ █▄▄▄▀▀▄▀ \n ▄▀█▀█▀█▀██▀ ▄█▀\n █ ▄ ▄ ███▄▀ \n▄▀▀ ▀ ▀ ▀ █ ▀▄ \n█ ▀▄▄▄▀ ▀ █\n █▄▄▄▄▄ ▀▀▄▄ ▄█\n█▄█▄█▄▄▄▄▄█▄▄█▄█"], ["happy", " ▄▀█▀▀ ▄▄▀█▀ \n █▄████▄▄█▄ \n █ ▀ ▀ ▀ ▀█▄ ▄█▀\n▄▀▄▀▄ ▄▀▄ █▀█▄▀ \n█ ▄▄▄▄▄▄▄ █ ▀▄ \n█ ███████ ▀ █\n▀▄▄████▀ ▀▄▄ ▄█\n█▄█▄█▄▄▄▄▄█▄▄█▄█"], ["injured_1", " \n ▄▄▄▄ ▄▄▄ \n █ █▄▄▄▀▀▄▀ \n ▄▀█▀█▀█▀██▀ ▄▄ \n █ ▄ █▀▀▄▄█\n▄▀▀ ▀▀ █▀\n█ ▄▀▄ ▀▄▄ ▀▄\n ▀▄▄▄▄▄▄█▄█▄▄█▄█"], ["injured_2", " \n \n ▄▀█▀ ▄▄▄▄ \n █▄█████▄█▄ ▄▄ \n █▀█▀█▀█▀██▀▀▄▄█\n █ ▄ ▄ ▀ █▀\n█▀▀▀ ▀▀▀ ▀▄▄ ▀▄\n▀▄▄██▄▄▄▄▄█▄▄█▄█"], ["sleep_1", " \n ▄▄▄▄ ▄▄ \n █ █▄▄▄▀▄▀▀ ▄\n ▄██████████▄▄▀█\n▄█▀█▀█▀█▀ █▀▀██ \n█ ▄▄ ▄▄▄ ▀ █\n▀▄ ▄▀▄ ▄▄▄▄ ▄█\n██▄▄▄▄▄▄▄█▄▄▄█▄█"], ["sleep_2", " \n ▄▀█▀▀ ▄▄▀█▀ \n █▄████▄▄█▄ ▄▄\n █▀█▀█▀█▀██▄▄▀█ \n▄▀▄▄ ▄▄▄ █▀▀█▄ \n█ ▄▀▄ ▀ █\n █▄▄▄▄▄ ▄▄▄▄ ▄█\n█▄█▄█▄▄▄▄▄█▄▄█▄█"], ["walk_1", " ▄▀█▀▀ ▄▄▀█▀ \n ▄█▄████▄▄█▄ \n █ ▀ ▀ ▀ ▀█▄ ▄\n █ █ █ ██▄▀█▀\n█ ▄ █ ▀█ \n▀▄ ▀ ▀ █▄ \n ▄▀▀▀▀▀ ▀▄▄ ▀ █\n█▄█▄▀▄▄▄▄█▄▄█▄▄▀"], ["walk_2", " ▄▄▄▄ ▄▄▄ \n █ █▄▄▄▀▀▄▀ \n ▄▀█▀█▀█▀██▀ ▄█▀\n █ ▄ ▄ ███▄▀ \n▄▀ ▀ ▀ █ ▀▄ \n█ ▄▀▄ ▀ █\n █▄▄▄▄▄ ▀▀▄▄ ▄█\n█▄█▄█▄▄▄▄▄█▄▄█▄█"]]], + ["gotsumon", [["angry", " \n ▄▄▄▀▀▀▀▀▄ \n █ ▀ █▀▀█ \n █ ▄ █ \n █▀ ▀▀▀ █ \n █▄▀▀▀▄ █▀ \n ▄▀▄ ▄▄▀▀▄ \n █▄▄▄██▀█▄▄▄▄█ "], ["attack", " ▄▀▀▀▄ █▀▀▀▄\n █ ▄▀▀▀▀▄ █ █\n ▀▄█ ▄▄ ▀█▀ ▄▀\n █ ▀ ▄▄ ▄▀ \n ▀██████▄ █ ▀█ \n ▄▀██▀██ ▀ █ \n ▄▀▄▄ ▄▄▀▀▄ \n█▄▄▄▄██▀█▄▄▄▄▄█ "], ["eat_1", " \n ▄▀▀▀▀█▄▄▄ \n ▄▄█ ▄▄ ▀ ▀█ \n █ ▀ █ \n ▀█▀█████ ▄ ▀█ \n ▄█▄██▀ ▄▀ █ \n ▄▀▄▄ ▄▄▀▀▄ \n █▄▄▄▄██▀█▄▄▄▄▄█"], ["eat_2", " \n ▄▀▀▀▀█▄▄▄ \n █ ▀ ▀█ \n █▀ █▀ █ \n █ ▄▄ ▀▄ \n █▀▀▀▄ █ █ \n ▄▀▄▄ ▄▄▀▀▄ \n █▄▄▄▄██▀█▄▄▄▄▄█"], ["happy", " ▄█▀▀▀█▄▄ \n █▀█ ▄ ▄ ▀▀▄ \n █ ▀ ▀ ▀ ▀ ▄▀ \n ▀▀▄▄▀▄▄▀▀▄▄▀▀ ▄\n ▄ ▄ \n ▄▄▄ ▄▄▄ \n ▄▀▄ ▀▀▀ ▄▄▀█ \n █▄▄▄██▀▀█▄▄▄▄█ "], ["injured_1", " \n ▄▄▄▄ \n ▄▄▄▀ ▀█▀▀█▄ \n █ ▀▄ ▀▄ █ \n █ ▀█▀▀█▀ ▄█ \n █▄▀▀ █ ▄▀ \n ▄▀▄▄▀▀▀█▄█▀▀▄ \n █▄▄▄█▄▄▄▄█▄▄▄▄█"], ["injured_2", " \n \n \n ▄▄▄▀▀▀▄▄▄ \n █ █ █ ▀▄▄ \n █▄▀ ▀▄▄█▄ ▄█▄ \n█ ▀█▀ ▀█▀ █\n█▄▄▄█▄▄▄▄▄█▄▄▄▄█"], ["sleep_1", " \n \n \n ▄▀▀▀█▄▄▄▄ \n █▀█ ▀▄ ▀█ \n █ █ \n █ ▄▄▄ ▄▄▄ ▄█ \n █▄▄▄▄▄▄▄▄▄▄▄▄▄█"], ["sleep_2", " \n \n ▄▄▄▄ \n ▄▄▄▀ ▀█▀▀█▄ \n █ ▀ ▀ █ \n █ ▄█ \n █▄▀▀▀ ▀▀▀ █ \n ▄█▄▄▄▄▄▄▄▄█▄▄ "], ["walk_1", " \n ▄▀▀▀█▄▄▄▄ \n █▀█ ▀▄ ▀█ \n █ ▄ ▄ ▄█ \n █ ▀ ▀ ▀█ \n ▀█ ▄▀▀▄ █ \n ▄▀▀▄ ▄▀▀▄ \n █▄▄▄▄██▀▀█▄▄▄▄█"], ["walk_2", " \n ▄▄▄▄ \n ▄▄▄▀ ▀█▀▀█▄ \n █ ▀ ▀ █ \n █ █ █ ▄█▀ \n █▄ ▄▄ █ \n ▄▀▄ ▀ ▀ ▄▀▄ \n █▄▄▄█▄▄▄▄▄█▄▄▄█"]]], + ["gracenovamon", [["angry", " █ █ \n ▄█▀████▄▄▄ \n ███▀▀▄██ \n █▀▀▀███ ▀▀▄ \n ▄███▀▄███▀▄ \n █ █▄█▄▀██ ██ \n █ ▀█ █ ▀█████ \n ▀▄█ ▀▄█ ▀█ "], ["attack", " █ █ \n ▄█▀████▄▄▄ \n ███▀ ▄██ \n █▀▀▀███ ▀▀▄ \n ▄▄█▄▄▄▀ ███▀▄ \n█ ▄█▄█▄▄█ ▄██▄\n ▀▀█ ▀█ ▀█▀▀█▀██\n ▀▄█ ▀▄█ ▀"], ["eat_1", " █ █ \n ▄█▀████▄▄▄ \n ███▄▄▄██ \n █ ███ ▀▀▄ \n ▄███▀▄███▀▄ \n █ █▄█▄▀██ ██ \n █ ▀█ █ ▀█████ \n ▀▄█ ▀▄█ ▀█ "], ["eat_2", " ▄ ▄ \n ▄█▄▄█▄ \n ▀█▄██▀███▀ \n ███▄█▄█▀▄▄ \n ▀▄▄▄█▀█▄▄▄▀ \n ▄▀█▀█ ███▀ █▄ \n ▀▄▀██▀▄▀█▄▄██▄ \n ▀█▄█ ▀█▄█ ▀▀█ "], ["happy", " ▄ ▄ \n ▄█▄▄█▄ \n ▀█▄██▀███▀ \n ███▄█▄█▀▄▄ \n ▀▄▄▄█▀█▄▄▄▀ \n ▄▀█▀█ ██▀▀ █▄ \n ▀▄▀██▀▄▀▄▄███▄ \n ▀█▄█ ▀█▄█ ▀▀█ "], ["injured_1", " \n █ █ \n ▄█▀████▄▄▄ \n ███ ▀▀██ \n █▀▀▀███ ▀▀▄ \n ▄███▀▄███▀▄ \n █ █▄█▄▀██ ██ \n █▄▄█ █▄██▀███▄"], ["injured_2", " \n ▄ ▄ \n ▄█▄▄█▄ \n ▀█▄█▀████▀ \n ███▄▄▄█▀▄▄ \n ▀▄▄▄█▀█▄▄▄▀ \n ▄▀█▄█ ███▀ █▄ \n ▀▀▄▄███▄█▄▄███▄"], ["sleep_1", " \n ▄ ▄ \n ▄█▄▄█▄ \n ▀█▄██████▀ \n ███▄▄▄█▀▄▄ \n ▀▄▄▄█▀█▄▄▄▀ \n ▄▀█▄█ ██▀ ██▄ \n ▀▀▄▄██▄█▄▄████▄"], ["sleep_2", " \n █ █ \n ▄█▀████▄▄▄ \n ███▀▀▀██ \n █▀▀▀███ ▀▀▄ \n ▄███▀▄██▀█▄ \n █ █▄█▄▀█ ███ \n ▀▀▄▄█▄█▄███▀██▄"], ["walk_1", " █ █ \n ▄█▀████▄▄▄ \n ███▀ ▄██ \n █▀▀▀███ ▀▀▄ \n ▄███▀▄███▀▄ \n █ █▄█▄▀█ ▄██ \n █ ▀█ █ ▀█▀███ \n ▀▄█ ▀▄█ ▀█ "], ["walk_2", " ▄ ▄ \n ▄█▄▄█▄ \n ▀█▄██▀▀██▀ \n ███▄▄██▀▄▄ \n ▀▄▄▄█▀█▄▄▄▀ \n ▄▀█▀█ ██▀▀ █▄ \n ▀▄▀██▀▄▀▄▄███▄ \n ▀█▄█ ▀█▄█ ▀▀█ "]]], + ["grademon", [["angry", " ▄▄▄ ▄▄▄ \n ▄▀▄▀▀▀▄▄▀ ▄▄ \n▄▀ ▄█▀▄▄▀ █ █ \n▀▀█▀▀█ ▄███▄█ \n ▀▄█▄▄▀ █▄▄▄▀ \n █▀▄ ▄▄█▀▀ █▄ \n ▄▀▀█▀ ▄█▄█▀██▄ \n█▄█▄█▀▀▀▀█▄█▄█▀▀"], ["attack", " ▄▀██▄▀▀█ \n ▄▀ ▀▄▄▄▀▀▄ \n █▄▄▄█▄▀ ▀█▄▄ \n █ ▄▀ ▄▀▀▀▀█ \n ▄█▀▀▀ ▄██▀▄ \n ▄▀▀▄█▄▀▀█ ▄█▄\n▄▀ ▄█▀▄▄█ ▀▀███\n█▄▄▀█▄█▄█ █▄█▄█ "], ["eat_1", " ▄▀██▄▀▀█ \n ▄▀ ▀▄▄▄▀▀▄ ▄▀█ \n█▄▄▄█▄▀ ▀█▄▄▀▄▀ \n ████ ▄▀█▀▀▀█ \n ▀▄▄▄▀ ▄██▀█ \n █▀█▄▀▀█ ▄██ \n ▄▀▀▄▄█ ▀▀████▄\n █▄█▄█ █▄█▄█ "], ["eat_2", " ▄▄▄ ▄▄▄ \n ▄▀ ▄▀▀▄▄▀ ▄▄ \n▄▀ ▀ ▀ ▄▄▀ █ █ \n▀▀█▀▀█ ▄███▄█ \n ▀▄█▄▄▀ █▄▄▄▀ \n ▄▀▄ ▄▄█▀▀ █▄ \n ▄▀▀█▀ ▄█▄▀▀██▄ \n█▄█▄█▀▀▀▀█▄█▄█▀▀"], ["happy", " ▄▀▀█▄▀▀█ \n ▄▀ ▄▀▄ ▀▀▄ ▄▀█ \n█▄▄▄▄▄ ▀█▄▄▀▄▀ \n ████ ▄▀█▀▀▀█ \n ▀▄▄▄▀ ▄██▀█ \n █▀█▄▀▀█ ▄██ \n ▄▀▀▄▄█ ▀▀████▄\n █▄█▄█ █▄█▄█ "], ["injured_1", " \n ▄▄▄ ▄▄▄ \n ▄▀▄▀▀▀▄▄▀ ▄▄ \n▄▀ ▀▀ ▀▄▄▀ █ █ \n▀▀█▀▀█ ▄███▄█ \n ▀▄█▄▄▀ █▄▄▄▀ \n█▀▄▀▄ ▄▄▀▀█ █▄ \n█▄▄███▄█▄▄█████▄"], ["injured_2", " \n \n ▄▀██▄▀▀█ \n ▄▀ █▄ ▄▀▀▄ ▄▀█ \n█▄▄▄▄▄ ▀█▄▄▀▄▀ \n █ ▄▀ ▄▀█▀▀▀█ \n█▀▄▀█▀█▄▀▀█▀█▄ \n█▄▄███▄█▄▄█████▄"], ["sleep_1", " \n ▄▄▄ ▄▄▄ \n ▄▀ ▀▀▀▄▄▀ ▄▄ \n▄▀ ▀▀▀ ▄▄▀ █ █ \n▀▀█▀▀█ ▄███▄█ \n ▄█▄█▄▄▀▄█▄▄▄▀ \n█ ██▄▀▀█ ▀ ██ \n▀▄▄▄█▄▄██▄▄▄▀▀█▄"], ["sleep_2", " \n ▄▀██▄▀▀█ \n ▄▀ ▄▄▄ ▀▀▄ ▄▀█ \n█▄▄▄▄▄ ▀█▄▄▀▄▀ \n █ ▄▀ ▄▀█▀▀▀█ \n ▄▄████ ▄████ \n█ ██▄▀▀█ ▀ ██ \n▀▄▄▄█▄▄██▄▄▄▀▀█▄"], ["walk_1", " ▄▀██▄▀▀█ \n ▄▀ ▀▄▄▄▀▀▄ ▄▀█ \n█▄▄▄█▄▀ ▀█▄▄▀▄▀ \n █ ▄▀ ▄▀█▀▀▀█ \n █▀▀▀ ▄██▀█ \n █ █▄▀▀█ ▄██ \n ▄▀▀▄▄█ ▀▀████▄\n █▄█▄█ █▄█▄█ "], ["walk_2", " ▄▄▄ ▄▄▄ \n ▄▀▄▀▀▀▄▄▀ ▄▄ \n▄▀ ▄▀█▀▄▄▀ █ █ \n▀▀█▀▀█ ▄███▄█ \n ▀▄█▄▄▀ █▄▄▄▀ \n ▄▀▄ ▄▄█▀▀ █▄ \n ▄▀▀█▀ ▄█▄▀▀██▄ \n█▄█▄█▀▀▀▀█▄█▄█▀▀"]]], + ["grandiskuwagamon", [["angry", " \n ▄▀▀▀▀▀▀█ ▄█\n ██▀ ▄▄▀▄ ▄██▀\n █▄▄▄▄█ ▀█▄███▀ \n █▀▄▄▄█ █▀▀█▀ \n▄▀▀▄██▄▄▀▀█▀▄█▄ \n▀▄▄██▀▀▀▄▄▄▄███ \n██▄▄██▀▀█▄▄███▀█"], ["attack", " ▄▀▀▀▀▀▀█ ▄█\n ██▀ ▄▀▄ ▄██▀\n █▄▄▄▄▀▀▄▀▄▀▀██ \n█▀▄████ ██▄ ██ \n▀▄▀███▀▄█ ▀▄██ \n █▄▄█▄███▀███ \n ▄▀▀▄▄▄▀▀▀█ ▀██\n ███▄█ █▄███ ▀"], ["eat_1", " ▄▀▀▀▀▀▀█ ▄█\n █▀▄ ▄▄▀▄ ▄██ \n▄█▄▄▄▄█▄ ▀▄███ \n█ ▄███ █▀ █▀▀▄ \n▀▀ █▄▄█▀▀█▄▄▀ \n ▄▀█▄▄█▄ ▄██▄ \n ▀▄▀▀▄▄▄▀▀▀█▀██▄\n ███▄█ █▄███ ▀"], ["eat_2", " \n ▄▀▀▀▀▀▀█ ▄█\n █▀▄ ▄▄▀▄ ▄██▀\n █▄▄▄▄█ ▀█▄███▀ \n █▀▄▄▄▀ ▄█▀▀█▀ \n▄▀▀▄█▄▄▀▀▄▀██▄ \n▀▄▄█▄▀▀▄▄▄▄█▀██▄\n██▄▄██▀█▄▄███ ▀"], ["happy", " ▄▀▀▀▀▀▀█ ▄█\n █▀▄ ▄▄▀▄ ▄██▀\n █▄▄▄▄█▄▀█▄███▀ \n█▀████ █ ███▀ \n █▄█▄▄█▄▄▀▀▄ █▄ \n█ █▄▄▄▄█▄ ██▄\n ▀█▀▀▄▄▄▀▀▀█▀▀██\n ███▄█ █▄███ ▀"], ["injured_1", " \n ▄▄▄▄▄▄▄ ▄\n ▄█ ▄▀ ▄██\n ▄▀▀▀ ▄▀█▄▀▄███ \n ██▀▀▀█ █████ \n █▄▀█▀ ▄█▀▄▄█▄ \n ▄▀▀█▀▀█▀▀ ██▀█▄\n █▄▄████▄▄█▄▄▄█▀"], ["injured_2", " \n ▄\n ▄▀▀▀▀▀▀█ ▄██\n ██▄ ▄▄▀▄ ▄███ \n█▄▄▄▄█ ▀██████ \n█▀▄▄▄▀ ▄█▀▄▄█▄ \n▀█ ▀▄▄██▀▀ ██▀█▄\n █▄▄████▄▄█▄▄▄█▀"], ["sleep_1", " \n \n ▄▄▄▄▄▄▄ \n ▄▀ ▄▀ ▄▄\n▄▀▀▀ ▄▀█▄▀▄▄███▀\n██▀▀▀█ █████▀ \n█▄▀█▀ ▄█▀ ▀▄ \n█▄████▄█▄▄▄▄▄█ "], ["sleep_2", " \n \n ▄▀▀▀▀▀▀█ ▄█\n █▄▄ ▄▄▀▄ ▄██▀\n █▄▄▄▄█ ▀█▄███▀ \n █▀▄▄▄▀ ▄█▀██▀ \n▄▀█▄█▄▄▀ ▄▀ ▀▄ \n█▄▄█▄▄█▄▄█▄▄▄▄█ "], ["walk_1", " ▄▀▀▀▀▀▀█ ▄█\n ██▀ ▄▄▀▄ ▄██▀\n █▄▄▄▄█ ▀█▄███▀ \n █▀▄▄▄▀ ▄█▀▀█▀ \n █▄█▄▄██▄▄▀██ \n █ █▄▄▄▄██ ███ \n █▀▀▄▄▄▀▀▀█ ▀██\n ███▄█ █▄███ ▀"], ["walk_2", " ▄▄▄▄▄▄▄ ▄\n ▄█▄ ▄▀ ▄██\n ▄▀▀ ▄▀█▄▀▄███ \n ██▀▀▀█ █████ \n ▀▄▀█▀ ▄█▀ ▄█▄ \n ▄▀█▀▀▀▀██▀ ██▄ \n ▀▄██▀▀▀██▄▄▀██▄\n██▄▄██▀▀█▄▄███▀█"]]], + ["grandracmon", [["angry", " ▄▀█▀█▄▀▀█ ▄ \n ██ ▀▄▄█▄ ███▄ \n █ ▄▄▀▄██████\n ▀▄▀▀▄█▀ ▄█▀ ▀█\n ▄█ ▀▀ ██ █▄▄▄ \n█ █▀▄▄▄▀█ ██▄██\n ███████████████\n█▄█▄█▀█▄█▄█▀▄█▄█"], ["attack", " ▄▀█▀█▄▀▀█ ▄ \n ██ ▀▄▄█▄ ███▄ \n █ ▄▄▀▄██████\n ▀▄▀▀▄█▀ ▄█▀ ▀█\n ▄█ ▀▀ ██ █▄▄▄ \n█ █▀▄▄▄▀█ ██▄██\n ███████████████\n█▄█▄█▀█▄█▄█▀▄█▄█"], ["eat_1", " \n▄▀█▀█▄▀▀█ ▄▄ \n██ ▀▄▄█▄▄████ \n█ ▄▄▄▀▄██▀███ \n ▀▄▀▀▄█▀ ▄█▄▄ ▀ \n▄▀▄▀▀ █▀ ██▄█▄ \n█▄██▄▄██▄▄█████ \n█▄█▄█▄█▄█▀▄█▄█ "], ["eat_2", " ▄▄▄▄ ▄▄▄ \n █▄▀ █▀ ▄▀ ▄██▄ \n █▀ ▀▀█▀▄█████\n ▀▄ ▄▄▀█▄▀▀██▀ ▀\n ▄▀▄▄▀▀▄▄█▄ █▄ \n █ █▄▄▄▀▄██ █▄█\n ▄██████████████\n█▄█▄█▀█▄█▄█▀▄█▄█"], ["happy", " ▄▀█▀█▄▀▀█ ▄ \n ██ ▀▄▄█▄ ███▄ \n █ ▄▄▀▄██████\n ▀▄▀▀▄█▀ ▄█▀ ▀█\n ▄█ ▀▀ ██ █▄▄▄ \n█ █▀▄▄▄▀█ ██▄██\n ███████████████\n█▄█▄█▀█▄█▄█▀▄█▄█"], ["injured_1", " ▄▀█▀█▄▀▀█ ▄ \n ██ ▀▄▄█▄ ███▄ \n █ ▄▄▀▄██████\n ▀▄▀▀▄█▀ ▄█▀ ▀█\n ▄█ ▀▀ ██ █▄▄▄ \n█ █▀▄▄▄▀█ ██▄██\n ███████████████\n█▄█▄█▀█▄█▄█▀▄█▄█"], ["injured_2", " ▄▀█▀█▄▀▀█ ▄ \n ██ ▀▄▄█▄ ███▄ \n █ ▄▄▀▄██████\n ▀▄▀▀▄█▀ ▄█▀ ▀█\n ▄█ ▀▀ ██ █▄▄▄ \n█ █▀▄▄▄▀█ ██▄██\n ███████████████\n█▄█▄█▀█▄█▄█▀▄█▄█"], ["refuse", " ▄▀█▀█▄▀▀█ ▄ \n ██ ▀▄▄█▄ ███▄ \n █ ▄▄▀▄██████\n ▀▄▀▀▄█▀ ▄█▀ ▀█\n ▄█ ▀▀ ██ █▄▄▄ \n█ █▀▄▄▄▀█ ██▄██\n ███████████████\n█▄█▄█▀█▄█▄█▀▄█▄█"], ["sleep_1", " ▄▄▀▀▀▄▀▀█ \n ▄▀ ▀▄▄█ ▄██▄\n ▀▄████▄▄█▄█████\n █▀▀▀▄▀ ▄█▀ ▀█\n ▄█▀▀▀ ██▄▀▄▄▄ \n █ █▄▄▄▀█ ▄█▄██\n ▄██████████████\n█▄█▄█▀█▄█▄█▀▄█▄█"], ["sleep_2", " ▄▀█▀█▄▀▀█ ▄ \n ██ ▀▄▄█▄ ███▄ \n █ ▄▄▀▄██████\n ▀▄▀▀▄█▀ ▄█▀ ▀█\n ▄█ ▀▀ ██ █▄▄▄ \n█ █▀▄▄▄▀█ ██▄██\n ███████████████\n█▄█▄█▀█▄█▄█▀▄█▄█"], ["walk_1", " ▄▀█▀█▄▀▀█ ▄ \n ██ ▀▄▄█▄ ███▄ \n █ ▄▄▀▄██████\n ▀▄▀▀▄█▀ ▄█▀ ▀█\n ▄█ ▀▀ ██ █▄▄▄ \n█ █▀▄▄▄▀█ ██▄██\n ███████████████\n█▄█▄█▀█▄█▄█▀▄█▄█"], ["walk_2", " ▄▄▄▄ ▄▄▄ \n █▄▀ █▀ ▄▀ ▄██▄ \n █▀ ▀▀█▀▄█████\n ▀▄ ▄▄▀█▄▀▀██▀ ▀\n ▄▀▄▄▀▀▄▄▀█▄▄ \n▄▀█▄ ▄█▀ ██▄█▄\n█▄█▄███▄█▄▄█████\n█▄█▄█▀█▄███▄█▄█ "]]], + ["grankuwagamon", [["angry", " ▄▄▄▄▄▄▄▄ \n ▄██████▀▀ ▄▄▀▀█\n▄███▀ █▄▀▄▀ ▄█▄\n██▀▀▀██▄▀██▀▀ ▄▀\n▀ ▄▀▄█▀▀█▀▀ \n ▄█▀▄██▀▄ █ \n ▄▄█████▄███ \n █▄███▀ ▀█▄█▄█ "], ["attack", " \n ▄▄██████▀▀ ▄▄▄\n ████▀█▀▄ ▄▀▀ ▄▀\n ███▄▄█▀▄█▄▄▄▀▀█\n▄█ ▀██▀▀▄██▄▄▄▀ \n█ ▄█▀▄██▀ █▄ \n ▄▄██▀▄ ▄████▄ \n ██▄██▀▄▀▀▀█▄█▄█"], ["eat_1", " \n ▄▄██████▀▀ ▄▄▄\n ███▀██▀▄ ▄▀▀ ▄▀\n ██▄█▄█▀▄█▄▄▄▀▀█\n▄█ ▀██▀▀▄██▄▄▄▀ \n█ ▄█▀▄██▀ █▄ \n ▄▄██▀▄ ▄████▄ \n ██▄██▀▄▀▀▀█▄█▄█"], ["eat_2", " ▄▄▄▄▄▄▄▄ \n ▄██████▀▀ ▄▄▀▀█\n▄███▀ █▄▀▄▀ ▄█▄\n██▀▀▀██▄▀██▀▀ ▄▀\n▀ ▄▀▄█▀█▀▀▀ \n ▄█▀▄▀ ██▄ \n ▄▄█▄▀▄█████ \n █▄███▀ ▀█▄█▄█ "], ["happy", " ▄▄▄▄▄▄▄▄ \n ▄██████▀▀ ▄▄▀▀█\n ██▀▄▀█▄▀▄▀ ▄█▄\n █▀████▄▀██▀▀ ▄▀\n█▀ ▄█▀▄▄█▀█▀▀▀ \n▀ ▀▀ ████▀ ▀▄ \n ▄████▄▀▄███ \n █▄███▀ ▀█▄█▄█ "], ["injured_1", " \n \n \n ▄▄▄ \n█▀▀██▄█▀█▀▀▀▀▄ \n ██████████▄█▄\n█▄▄██████████▄██\n ▀▀▀██████████▀ "], ["injured_2", " \n \n \n \n▄████▄█▀█▀▀▀▀▄ \n█ ██████████▄█▄\n▀████████████▄██\n ▀██████████▀ "], ["refuse", " \n ▄▄██████▀▀ ▄▄▄\n ████▀█▀▄ ▄▀▀ ▄▀\n ███▄▄█▀▄█▄▄▄▀▀█\n▄█ ▀██▀▀▄██▄▄▄▀ \n█ ▄█▀▄█▀▀ █▄ \n ▄▄███▀ ▄████▄ \n ██▄██▀▀▀▀▀█▄█▄█"], ["sleep_1", " \n ▄▄▄▄▄▄▄▄ \n ▄██████▀▀ ▄▄▄ \n ███▀▀███▄▀ ▀▄\n █▀█████ ██▀▀▄▄▀\n█▀ ▄█▀▄▄█▀██▄ █\n▀ ▀▄▄█▀▄ ▄████▀▀\n █▄██▀▄█▀█▄█▄█ "], ["sleep_2", " \n \n ▄▄██████▀▀ \n ███████▄ ▄▀▀▀▄ \n ███▄▄██▀█▄▄▄ █\n▄█ ▀██▀▀▄█▀▄ ▀▀▄\n█ ▄█▀▄█▀▄ ▄██▄▄█\n █▄██▀█▄▀█▄█▄█ "], ["walk_1", " ▄▄▄▄▄▄▄▄ \n ▄██████▀▀ ▄▄▀▀█\n ███▀ █▄▀▄▀ ▄█▄\n █▀████▄▀██▀▀ ▄▀\n█▀ ▄█▀▄▄█▀█▀▀▀ \n▀ ▀▀ ██▀ ██▄ \n ▄██▄▀▄█████ \n █▄███▀ ▀█▄█▄█ "], ["walk_2", " \n ▄▄██████▀▀ ▄▄▄\n ████▀█▀▄ ▄▀▀ ▄▀\n ███▄▄█▀▄█▄▄▄▀▀█\n▄█ ▀██▀▀▄██▄▄▄▀ \n█ ▄█▀▄██▀ █▄ \n ▄▄██▀▄ ▄████▄ \n ██▄██▀▄▀▀▀█▄█▄█"]]], + ["greymon", [["angry", " \n▄▄ ▄█████▄▄███ \n███████▀▄████▀ \n████████▀▀ █ \n ▀▄▄▄▀▀▄ ▀▀▄ \n █ █ ▄▀▀ ██\n ▄█▀▄ ▀▄▄▄▀▄▀\n█▄█▄▄█▄▄▄▄█▄▄█▄█"], ["attack", "██▄ ▄█████▄▄███ \n██████▀ ▄████▀ \n ▀▀▀▀███████ \n ███▀▀ █ \n █▀▀▀▀▀▄▄▄▀ █ \n █▀█▀▀▀█ ▄ █▀█\n ▄█▀▄ ▀▀█ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["eat_1", "██▄ ▄█████▄▄███ \n██████▄▄▀████▀ \n ▀▀▀▀████▀ █ \n ▄▄▄▄█▀▀ █ \n ▀▄▄▄▄▀ ▄▄▀ █ \n █ █ █ ▄ █▀█\n ▄█▀▄ ▀▀█ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["eat_2", " ▄▄▄▄▄ ▄▄▄ \n██▄▄███▀██████▀ \n██████▄█▄███▀ \n▀█▀▀ ▀▀ █ \n ▀▀█▀▀ ▀▄ \n▄▀▀█ ▄▀▀ █▀█\n▀▄▄▀▄ ▀▄▄▄▀▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["happy", "██▄ ▄█████▄▄███ \n██████▄▄▀████▀ \n ▀▀▀▀█████▀█ ▄▄ \n ▄▄▄▄▀▀▀ ▄▀▀ █\n █▄▄▄▄▀ ▄▄▀ \n ▀█ █▀█\n ▄▄▀▄ ▄▀▀▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["injured_1", " ▄▄▄▄▄ ▄▄▄ \n██▄▄██████████▀ \n██████▄▀▀█▀█▀ \n▀█▀▀ ▀▀▀▀ █ \n ▀▀█▀▀ █ \n ▄█ ▄▀ █▀█\n █▄▀▄ █ ▄▀▀▄▀\n█▄█▄▄█▄▄▄███▄█▄█"], ["injured_2", " \n▄▄ ▄█████▄▄███ \n███████▀█████▀ \n████▀██▄▄▀ █ \n ▀▄▄▄▄▄ ▀▄ \n▄▀▀█ ▄▀▀ █▀█\n▀▄▄▀▄ ▀▄▄▄▀▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["sleep_1", " \n▄▄ ▄█████▄▄███ \n██████▀▀▀████▀ \n████▀███▀▀ █ \n ▀▄▄▄▄ ▀▄ \n ▄█ ▄▀ █▀█\n █▄▀▄ █ ▄▀▀▄▀\n█▄█▄▄█▄▄▄███▄█▄█"], ["sleep_2", " ▄▄▄▄▄ ▄▄▄\n ██▄▄██████████▀\n ██████▄▄▄█▀█▀ \n ▀█▀▀ ▀▀▀ █ \n ▀█▀▀ █ \n ▄█ ▄▀ █▀█\n █▄▀▄ █ ▄▀▀▄▀\n█▄█▄▄█▄▄▄███▄█▄█"], ["walk_1", "▄▄ ▄█████▄▄███ \n██████▀ ▄████▀ \n████▀███▀▀ █ \n ▀▄▄▄▄▄ █ \n ▄▄▀ ▄▄▀ █ \n █ █ █ ▄ █▀█\n ▄█▀▄ ▀▀█ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["walk_2", " ▄▄▄▄▄ ▄▄▄ \n██▄▄███▀▀█████▀ \n██████▄▄██▀█▀ \n▀█▀▀ ▀▀▀ █ \n ▀▀█▀▀ ▀▄ \n▄▀▀█ ▄▀▀ █▀█\n▀▄▄▀▄ ▀▄▄▄▀▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"]]], + ["groundlocomon", [["angry", " \n▀█▄▄▀▀▀▀▀▄▀▀▀█ \n▄▄█ ▄█ █▀▀█ \n █ ▄▄ ▄ ▄▀██▄▀▀▄\n▄██▄▀▀██▀ █ █▀▀▄\n█▄█ ▄▀▀▀▀█▄▄███▀\n█▄█ █▀█▀█▄▄▄█▄▄█\n▀▄██▄█▀██▄█▄█▄██"], ["attack", "▀█▄▄▀▀▀▀▀▄▀▀▀█ \n▄▄█ ▄██ █▀▀█ \n ▀▄ ▄▄ ▄▀██▄▄▄ \n ▄▀█▀▀█▀ █▀█▄▄▀\n█▀█ ▄▀▀▀██▀ █▄▄█\n█▀█ █▀██▄██████▀\n▀█▀█▄██▄█▄▄▄█▄▄█\n ▀▀▀▀ █▄█▄█▄█▄█"], ["eat_1", "▀█▄▄▀▀▀▀▀▄▀▀▀█ \n▄▄█ ▄█▀ █▀▀█ \n █ ▄▄▄▄ ▄▀▀▀▄▄▄ \n ▀█████▀█ █▀█▄▄▀\n▄▀█▄▄▄▄█▄▄▀ █▄▄█\n█▀█ ▄▀▀▀ ██████▀\n█▀█ █▀█▀█▄▄▄█▄▄█\n▀███▄█▀█▄█▄█▄█▄█"], ["eat_2", " \n▀█▄▄▀▀▀▀▀▄▀▀▀█ \n▄▄█ ▄▀▄ █▀▀█ \n █ ▄▄ ▄ ▄▀██▄▀▀▄\n▄██▄▀▀██▀ █ █▀▀▄\n█▄█ ▄▀▀▀▀█▄▄███▀\n█▄█ █▀█▀█▄▄▄█▄▄█\n▀▄██▄█▀██▄█▄█▄██"], ["happy", "▀█▄▄▀▀▀▀▀▄▀▀▀█ \n▄▄█ ▄▀▄ █▀▀█ \n █ ▄▄▄▄ ▄▀▀▀▄▄▄ \n ▀█████▀█ █▀█▄▄▀\n▄▀█▄▄▄▄█▄▄▀ █▄▄█\n█▀█ ▄▀▀▀ ██████▀\n█▀█ █▀█▀█▄▄▄█▄▄█\n▀███▄█▀█▄█▄█▄█▄█"], ["injured_1", " \n▀█▄▄▀▀▀▀▀▄▀▀▀█ \n▄▄█ █▄ █▀▀█ \n █ ▄▄ ▄ ▄▀██▄▀▀▄\n▄██▄▀▀██▀ █ █▀▀▄\n█▄█ ▄▀▀▀▀█▄▄███▀\n█▄█ █▀█▀█▄▄▄█▄▄█\n▀▄██▄█▀██▄█▄█▄██"], ["injured_2", " \n▄▄ ▄▄▄▄▄ ▄▄▄▄ \n ▀█▀ ▄ █▄▄▄▀ \n▀█▀ ▀▀ █▄▄▀▄▄ \n▄▀█▄▀▀██▀ █ █▄▄▀\n█▀█ ▄▀▀▀▀█▄▄█▄▄▀\n█▀█ █▀█▀█▄▄▄█▄▄█\n▀███▄█▀█▄█▄█▄█▄█"], ["sleep_1", " \n▄▄ ▄▄▄▄▄ ▄▄▄▄ \n ▀█▀ █▄▄▄▀ \n▀█▀ ▀▀ █▄▄▀▄▄ \n▄▀█▄▀▀██▀ █ █▄▄▀\n█▀█ ▄▀▀▀▀█▄▄█▄▄▀\n█▀█ █▀█▀█▄▄▄█▄▄█\n▀███▄█▀█▄█▄█▄█▄█"], ["sleep_2", " \n▀█▄▄▀▀▀▀▀▄▀▀▀█ \n▄▄█ ▄▄ █▀▀█ \n █ ▄▄ ▄ ▄▀██▄▀▀▄\n▄██▄▀▀██▀ █ █▀▀▄\n█▄█ ▄▀▀▀▀█▄▄███▀\n█▄█ █▀█▀█▄▄▄█▄▄█\n▀▄██▄█▀██▄█▄█▄██"], ["walk_1", "▄▄ ▄▄▄▄▄ ▄▄▄▄ \n ▀█▀ ▄▄ █▄▄▄▀ \n▀█▀ ▀▀ █▄▄▀▄▄ \n ▀▄▀▀▄█▄▀ █▀█▄▄▀\n▄▀██▀▀█▄▄▄▀ █▄▄█\n█▀█ ▄▀▀▀ ██████▀\n█▀█ █▀█▀█▄▄▄█▄▄█\n▀███▄█▀█▄█▄█▄█▄█"], ["walk_2", " \n▀█▄▄▀▀▀▀▀▄▀▀▀█ \n▄▄█ ▄█▀ █▀▀█ \n █ ▄▄ ▄ ▄▀██▄▀▀▄\n▄██▄▀▀██▀ █ █▀▀▄\n█▄█ ▄▀▀▀▀█▄▄███▀\n█▄█ █▀█▀█▄▄▄█▄▄█\n▀▄██▄█▀██▄█▄█▄██"]]], + ["groundramon", [["angry", "▄▀█ ▄▀██▄▀▀█▀▄ \n█▄██▀▀▄█ ▀█ █ \n█▄▄▄▄▄▀ █▄▄ █\n█ █ █ █ ▄▀ █ █\n █▀▀▀▀▀ ▄█ ▄▀ █\n ▀█▀▀▀▀ ▀▄ █\n ▄▀█▄ ▄█▀█ █\n█▄▄▄█▀▀▀▀▀█▄▄▄█ "], ["attack", " ▄▄▄ ▄▄▄▄▄ \n ▀▄▄██▄▄█▄ ▀▀▄ \n ▄▄ ▀███▀▀▄ █ \n█ █▄▀▀▄▄▀▄▀█▄ █\n█▀▀ ▀▀ █ █▄ █\n▀█▀▀▀ ▄ ▄▀▀▄█▄▀\n █▀█▀ ▀█▀▄ █▄ \n █▄▄▄█▀█▄▄▄██▄▄█"], ["eat_1", " ▄▄▄ ▄▄▄▄▄ \n ▀▄▄██▄▄█▄ ▀▀▄ \n ▄▄ ▀███▀▀▄ █ \n█ █▄▀▀▄▄▀▄▀█▄ █\n█▀▀ ▀▀ █ █▄ █\n▀█▀▀▀ ▄ ▄▀▀▄█▄▀\n █▀█▀ ▀█▀▄ █▄ \n █▄▄▄█▀█▄▄▄██▄▄█"], ["eat_2", " ▄▀▀█▄▀▀█▀▀▄▄ \n ▀▀██████ ▀▄ \n▄▀█ ▄█▀▀▄ █▄ ▀▄\n█▄█▀ ▄█▀ ▀▄▀█ █\n█▄▄▄▄▄ █▄▀█ █\n▀█████ ▄▀ ▀█▀ \n ▀▄▄▄▄▄█▀▄ ▄▀█ \n █▄▄█▄▄▄▄██▄▄▄█"], ["happy", " ▄▀▀█▄▄▀▀█▀▀▄ \n ▄▄▀▀█████▄ █ \n█ █▄▀▀▄ ▀▄▀█ █\n█▀▀ ▀ ▀ █ █ █\n██████ █▄▀▄ █\n▀█▀▀▀ ▄ █▀ ▀█▄▀\n ▄▀█▀▀ █▀█ ▄▀█ \n█▄▄▄█▄█▄▄▄██▄▄▄█"], ["injured_1", " \n \n ▄▀▀█▀▀▀▄▄ \n▄▄ ▄█▀▀▀█▄ ▀▄ \n█ █ ▄ ▀█ ▀▄ \n▀▄▄█ ▀▀ ▄▀█ █ \n ▀▄▄▄▄▄█▀▄ ▀▄█▄ \n █▄▄██▄▄▄▄██▄▄▄█"], ["injured_2", " \n \n ▄▄▄▄▄▄ \n ▀▄▄█▄▄ ▀▀▄ \n█▀▄▀▀ ▀█▄ █ \n█ ▀▄ ▀▄▄ █▄ █ \n █▀▀ ▄▄█ █ ▄█ \n█▄█████▄▄▄███▄▄█"], ["refuse", " \n ▄▄▄ ▄▄▄▄▄ \n ▀▄▄██▄▄█▄ ▀▀▄ \n▄▀█ ▄█▀▀▄▀█▄ ▀▄\n█▄█▀ ▄▄▄ ▀▄▀█ █\n█▄▄▄ █▄▀█ █\n ▀▄▄▄▄▀▄▄█ █▀█ \n █▄▄█▄▄▄█▄▄█▄▄▄█"], ["sleep_1", " \n \n ▄▀▀█▀▀▀▄▄ \n▄▄ ▄█▀▀▀█▄ ▀▄ \n█ █ ▄ ▀█ ▀▄ \n▀▄▄█ ▀▀ ▄▀█ █ \n ▀▄▄▄▄▄█▀▄ ▀▄█▄ \n █▄▄██▄▄▄▄██▄▄▄█"], ["sleep_2", " \n \n ▄▀▀█▀▀▀▄▄ \n▄▄ ▄█▀▀▀█▄ ▀▄ \n█ █ ▄ ▀█ ▀▄ \n▀▄▄█ ▀▀ ▄▀█ █ \n ▀▄▄▄▄▄█▀▄ ▀▄█▄ \n █▄▄██▄▄▄▄██▄▄▄█"], ["walk_1", " ▄▀▀█▄▀▀█▀▀▄▄ \n ▀▀██████ ▀▄ \n▄▀█ ▄█▀▀▄ █▄ ▀▄\n█▄█▀ ▄█▀ ▀▄▀█ █\n█▄▄▄▄ █▄▀█ █\n ▀▄▄▄▄▀▄▄█ ▀█▀ \n █▄▀▄▄ ▄ ▄▀█ \n █▄▄█▄▄▄▄██▄▄▄█"], ["walk_2", " ▄▄▄ ▄▄▄▄▄ \n ▀▄▄██▄▄█▄ ▀▀▄ \n ▄▄ ▀███▀▀▄ █ \n█ █▄▀▀▄▄▀▄▀█▄ █\n█▀▀ ▀▀ █ █▄ █\n▀█▀▀▀ ▄ ▄▀▀▄█▄▀\n █▀█▀ ▀█▀▄ █▄ \n █▄▄▄█▀█▄▄▄██▄▄█"]]], + ["growlmon", [["angry", " \n ▄█▄▀█ \n ▄█▀▀█ ▄█▀▄ \n █▀ ▄ ▄█▀ █▄█ \n █▀▀▀▀ ▄▀ ▀▄\n █▀█▀▀▀ ▀ █▄▄█\n █▄▀▀▄ ▄█▄█▄▀\n █▄█▄▄▄█▀█▄█▄█▄█"], ["attack", " ▄▄▄▄██▄▀██ \n█ ▀▄▄▀▄▀▄ \n▀▄█▄█▄▀▀ ▀█▄█▀▄\n█▀█████▄ ▄▀ █▀█\n█▀▄█▀ ▀▄ █▀\n▀▀▀▄█▀▀ ▀▀▄ \n ▄█▀▀ ▄ █ █ \n█▄█▄▄▄█▀▀█▄█▄█▄█"], ["eat_1", " ▄▄▄▄██▄▀██ \n █ ▀▄▄▀▄▀▄ \n ▀▀█▄█▄▀▀ █▀▄ \n ▄▀▀▀ ▀ █ \n ▀▀██▀▀ ▄▀▀ ▀▄▀█\n █ █ █▄▀▄ ▄█ █\n ▄█▀ ▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄▄█▀▀█▄█▄█▄█"], ["eat_2", " ▄▄ ▄▄▄ \n ▄█▀▀█▀ █▀▄ \n █▀ ▄ ▄▀▄ █▄▀ \n █▀▀▀▀ ▀▄▀ \n ▀▀▀█▀ ▄ ▀▄▄▄\n ▄▀▀█ ▄█▄▄ ██ █\n █▄▀ ▀▄▀▄█▄▀ ▀▄█\n█▄█▄▄▄█▀▀█▄█▄█▄█"], ["happy", " ▄▄▀▀▀▀▀▀▄▀▀█ \n█ ▄ ▄▀▄ ▀▄▀█▄ \n▀█████▄ ▄▀▀▄█ \n █▀▀▀▀▀ ▄▀ ▄█▄\n ▀█▀█▀ ▄▄█▀ █\n ▀█ ▀▄ █\n ▄█ ▀▄ ▄▀ █ \n █▄█▄▄▄█▀█▄█▄█▄█"], ["injured_1", " ▄▄ ▄▄▄ \n ▄█▀▀▀█▀ █▀▄ \n█▀ ▀▄▄ █▄▀ \n█▄▄▄▄█▄ ▀▄▀ \n ▀▄▄▄ ▀ ▀▄▄▄\n ▄▀▀█ ▄▀ ██ █\n █▄▀ ▀▄▀▄ █ ▀▄█\n█▄█▄█▄▀█▄█▄█▄█▄█"], ["injured_2", " \n ▄▄▄██▄▀██ \n▄▄▀▀ ▄▀ ▀▄▀▄ \n█ ▄ ▀▀ █▀▄ \n▀▀█▀▀▀▀▄ ▀▄▄▄\n ▄▀▀█▀ ▄▀ ██ █\n █▄▀ ▀▄▀▄ █ ▀▄█\n█▄█▄█▄▀█▄█▄█▄█▄█"], ["sleep_1", " \n ██▄▀██ \n ▄█▀ ▀ ▀▄▀▄ \n █▀ ▄ ▀▀▀ █▀▄ \n ▀█▀▀▀▀ ▀█ \n█▀██▀▀ ▄▀█▀█ \n█▀▀▄▀▄▄▀█▀▀▀█▀▄ \n█▄▄█▄█▄▄█▄▄▄█▄▄█"], ["sleep_2", " ▄▄ ▄▄▄ \n ▄▄▀█▀ █▀▄ \n ▄▄▀▀ ▄▄▄ █▄▀ \n █▄▄█▄ █▄▀ \n ▄▀▀▀▀ ▀▄ \n█▀██▀▀ ▄▀█▀█ \n█▀▀▄▀▄▄▀█▀▀▀█▀▄ \n█▄▄█▄█▄▄█▄▄▄█▄▄█"], ["walk_1", " ▄▄██▄▀██ \n ▄▄▀▀ ▀▄▄▀▄▀▄ \n █▄▄█▄ ▀▀ █▀▄ \n ▀▄▄▄▄▄ █ \n ▄▄▄▀ ▄▀▀ ▀▄▀█\n █▄ █ █▄▀▄ ▄ █ █\n █▄▀ ▀▄▀▀▀█▀ ▀▄▀\n█▄█▄▄▄█▀▀█▄█▄█▄█"], ["walk_2", " ▄▄ ▄▄▄ \n ▄█▀▀█▀ █▀▄ \n █▀ ▄ ▄█▀ █▄▀ \n █▀▀▀▀ ▀▄▀ \n ▀▀▀█▀ ▄ ▀▄▄▄\n ▄▀▀█ ▄█▄▄ ██ █\n █▄▀▀▄ ▀▄█▄▀ █ █\n █▄█▄▄███▄█▄█▄█ "]]], + ["growlmon_x", [["angry", " ▄▄ ▄▄▄▄ \n ▄█ ▀▀▀▀ ▄ ▄▀\n █▀▀▄ ▄▄█ ▀█▀ \n █▄▄▄▄ ▀█▄▀ \n ▀▄▄▄▄█ ▄▀▀▄▄ \n▄▀▀▄█ ▄▀▀ █▀█\n▀▄█ █ ▀▀▄▄█▀▄█\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["attack", " █▀▄▄▄▄▀▀▀▀▄\n ▄▄▄▀▀ ▄▄ ▄█▄▀ \n █ ▀ ▀▀▀ ▄▄█▄▄ \n█▀██████▄ ▄█ █\n▀▄██████▀ ▀ █▄\n ▀▄▄▄▄▄▀ ▄▄▀█ █\n ▄█ ▀▄ █ ▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["eat_1", " █▀▄▄▄▄▀▀▀▀▄\n ▄▄▄▀▀ ▄ ▄█▄▀ \n █ ▀ ▀ ▀ ▄▄▀▄ \n ▀▀█████▄ ▄█▀ \n ▄▀██▄▄█▀▀▄█▄ ▄▄\n █ █▄▄▄█▄ ▄█ █\n ▄█ ▀▄ ▀█▀ ▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["eat_2", " ▄▄ ▄▄▄▄ \n ▄█ ▀▀▀▀ ▄ ▄▀\n █▀▀▄ ▄▀▄ ▀█▀ \n █▄▄▄▄ ▀█▄▀ \n ▀▄▄▄▄█ ▄▀▀▄▄ \n ▄▀ █ ▄▀ █▀█\n █▄▀█ ▀▄▄▀▀▄█\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["happy", " █▀▄▄▄▄▀▀▀▀▄\n ▄▄▄▀▀ ▄ ▄█▄▀ \n▄█ ▀ ▀ ▀ ▄▄▀▀▄ \n█▀██████ ▄▀ █ \n ▀▄██▄▄▀ ▀ █▄▄\n █▄▄▄▄▀ ▄█ █\n ▄█ ▀▄ ▄▀ ▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["injured_1", " \n █▀▄▄▄▄▀▀▀▀▄\n ▄▄▄▀▀ ▄ ▄█▄▀ \n █ ▀ ▀▀ ▄▄▀▄ \n ▀█▀▀▀ ▄ ▄█▀ \n ▄▄▀█▀▀▀ ▄▄█▄▀█\n █▄▀█ ▄▀ █▄█▄█ █\n █▄▄▄██▄▄█▄▄▄█▄█"], ["injured_2", " \n ▄▄ ▄▄▄▄ \n ▄█ ▀▀▀▀ ▄ ▄▀ \n█▀▀▄ ▄ ▀█▀ \n█▄▄▄▄ ▀▀ ▀█▄▀ \n ▀▄▄▄▄█ ▄▄█▄▀█\n █▄▀█ ▄▀ █▄█▄█ █\n █▄▄▄██▄▄█▄▄▄█▄█"], ["sleep_1", " \n \n █▀▄▄▄▄▀▀▀▀▄ \n▄▄▄▀▀ ▄█▄▀ \n█ ▀ ▀▀▀ ▄▄▀▄ \n▀█▀▀▀ ▄ ▄▀▀▄▄▀█\n ▄█▀█▀ ▄▀ ▄▀ ▀▄█\n█▄█▄█▄▄█▄█▄█▄█▄█"], ["sleep_2", " \n ▄▄ ▄▄▄▄ \n ▄█ ▀▀▀▀ ▄ ▄▀\n █▀▀▄ ▄▄▄ ▀█▀ \n █▄▄▄▄ ▀█▄▀ \n ▀▄▄▄▄▀ ▄▀▀▄▄▀█\n ▄█▀▄ ▄▀ ▄▀ ▀▄█\n█▄█▄█▄▄█▄█▄█▄█▄█"], ["walk_1", " █▀▄▄▄▄▀▀▀▀▄\n ▄▄▄▀▀ ▄▄ ▄▀▄▀ \n █ ▀ ▀▀ ▄▄▀▄ \n ▀█▀▀▀ ▄ ▄█▀ \n ▄█▀█▀▀▄█ ▀▀█▄▄\n █ ▄█ █▄ ▄▄▀█ █\n ▄█ ▀▄ ▀▀█ ▀▄▀\n▀▄▀▄▄▀█▀▀█▄▀▄▀▄▀"], ["walk_2", " ▄▄ ▄▄▄▄ \n ▄█ ▀▀▀▀ ▄ ▄▀\n █▀▀▄ ▄█▀ ▀█▀ \n █▄▄▄▄ ▀█▄▀ \n ▀▄▄▄▄█ ▄▀█▄▄ \n █▀▄█ ▄▀▀ ▄█▀█\n ▄█ █ ▀█▄█▀ ▀▄█\n█▄█▄▄█▄▄▄█▄█▄█▄█"]]], + ["gryphonmon", [["angry", " ▄▄▄▄ ▄▄ \n ▄▀ ▀█ █ █ \n ▄▀▀▄ ▀▀ █ █ ▀▄\n █▄▀█ ▄█▀ █\n ▀ █▀▀ ▄▀▀ ▀▄█ █\n █▄▀ ▄▀ █ █\n ▄█▄█ █▄▄ █ \n █▄█▄▄█▄█▄▄▄▄█ "], ["attack", " ▄▀▀▀▀█▄ ▄▄ \n▄▀▀▄ ▄█▀ █ █ ▀▄ \n█▄▀██ ▀▄▀ █ \n▀ ██ ▄▀█ ▄ █\n ▀█▀▀ ▄▀ ▀▀▄ █\n █▄▀ ▄ █ █\n ▄█ ▄█ █▄█▄▄ █ \n█▄▄█▄▄█▄▀ █▄▄▄█ "], ["eat_1", " ▄▀▀▀▀█▄ ▄▄ \n▄▀▀▄ ▄▀▄ █ █ ▀▄ \n█▄▀██ ▀▄▀ █ \n▀ ██ ▄▀█ ▄ █\n▄▀█▀▀ ▄▀ ▀▀▄ █\n▀▄▄█▄▀ ▄ █ █\n ▄█ █▄█▄▄ █ \n █▄▄█▄▀ █▄▄▄█ "], ["eat_2", " ▄▄▄▄▄ █▀▄ \n ▄▀ ▄ ▀█ █ █ \n▄▀▀▄ ▀ █▄▀ ▀▄\n█▄▀█ ▄█ ▀▄ █\n▀ █▀▀ ▄▀▀ ▀▀█ █\n █▄▀ ▄ ▀▄▀\n ▄█▄█ █▄█▄▄ █ \n █▄█▄▄█▄▀ █▄▄▄▀ "], ["happy", " ▄▀▀▀▀█▄ █▀▄ \n▄▀▀▄ ▄▀▄ █ █ █ \n█▄▀██ ▀█ ▄ █\n▀ ▄██ ▄▀▀▀▄▄█ █\n ▄▀▄▄▄▀ █ █\n█ █ ▄ █ ▄ █ \n ▀▀▄▄▀▀▀ █▀▄▄▄ █\n ▀▀█▄▄█"], ["injured_1", " ▄▄▄▄▄ \n ▄▀ ▀█ █▀▄ \n▄▀▀▄ ▀▄▄ █ █ █ \n█▄▀█ ▄█▀ █ \n▀ █▀▀ ▄▀▀ ▀▄█ ▀▄\n █▄▀ ▄▀ ▀▄ █\n ▄█▄█ ▄ █▄ █▄▀\n█▄█▄▄▄█▄█▄▄▄▄█ "], ["injured_2", " \n ▄▄▄▄ ▄▄▄ \n ▄▀ ▀█ █ █ \n▄▀▀▄ ▄▄ ▀█ ▄ █\n█▄▀█ ▄▀▀▄▄█ █\n▀ ▄▀ ▄▀ ▄ █ █\n ▄▀▄█▄ ▀▄▀▄▄ ▀▄\n █▄█▄▄▄▄▄██▄▄▄▄█"], ["sleep_1", " \n ▄▄▄▄ ▄▄▄ \n ▄▀ ▀█ █ █ \n▄▀▀▄ ▀▀ ▀█ ▄ █\n█▄▀█ ▄▀▀▄▄█ █\n▀ ▀▄ ▄▀ ▄ █ █\n ▄▀▄█ ▀▄▀▄▄ ▀▄\n █▄█▄▄▄▄▄██▄▄▄▄█"], ["sleep_2", " \n ▄▀▀▀▀▄▄ █▀▀▄ \n ▄█ ▄▄ █ █ ▀▄\n█ ▄█ ▀█ ▄ █\n█▀ █ ▄▄▀▀▄▄█ █\n █▀ ▄▀ ▄ █ █\n ▄▀█▄ ▀▄▀▄▄ ▀▄\n █▄█▄▄▄▄▄██▄▄▄▄█"], ["walk_1", " ▄▄▄▄▄ █▀▄ \n ▄▀ ▄ ▀█ █ █ \n▄▀▀▄ ▀▀ █▄▀ ▀▄\n█▄▀█ ▄█ ▀▄ █\n▀ █▀▀ ▄▀▀ ▀▀█ █\n █▄▀ ▀▄▀\n ▄█▄█ █▄▄█▄▄ █\n █▄█▄▄█▄▀ █▄▄▄▀"], ["walk_2", " ▄▀▀▀▀█▄ █▀▄ \n ▄█ ▄█ █ █ █ \n█ ▄█ ▀█ ▄ █\n█▀▄█ ▄▀▀▀▄▄█ █\n▄▀▀▄▄▄▀ █ █\n▀▄█ ▄ █ ▄ █ \n ▀▄▄▀▀▀ █▀▄▄▄ █\n ▀▀█▄▄█"]]], + ["guardromon", [["angry", " ▄▄▄ \n ▄▀▀▀▀▀▀▀█▀ █ \n▄▀▀█▀▀▄ ▀▄▄▄ █ \n▄▀▀▀█▀▀▀▀▀█ █ \n█▄▄▄▀ ▄█▄▄█ \n█ █▄▄▄▀▀█ █ \n ███▄█▄▄█▄▄▄▄▄█ \n█▄▄█▄▄█ █▄▄█▄▄▄█"], ["attack", " ▄▀▀▀▀▀▀▀▀▄▀▀▀▄\n ▄▀███▀▀▄ █▄▄▄ █\n██▄▄█▄▄██▄▀▄▄▄█▀\n▀▄██████▀▀█ █\n██ █ █▄▄█▄▄▄▄█\n▀▀█▀▀ █ ▄█▄▄▄▄█ \n ▄▄████▀█▄▄█▄▄▄ \n█▄▄█▄▄█ █▄▄█▄▄▄█"], ["eat_1", " ▄▀▀▀▀▀▀▀▀▄▀▀▀▄\n ▄█▀█▀█▄ █▄▄▄ █\n█▄███████▀█ █▀\n▀▄██████▀ ▀▄▄▄█ \n██ █ ▄▀▀█ █\n▀▀█▀▀ █▄▄█▄▄▄▄█\n ▄▄████▀██▄█▄▄▄ \n█▄▄█▄▄█ █▄▄█▄▄▄█"], ["eat_2", " ▄▄▄▄▄▄▄▄ ▄▄▄ \n █▄▄▄▄ ▄▀ █\n▄▀█▄█▄██▄▄█▄▄▄▄▀\n██ █ █ █ \n▀██▀▀ █▀█▀▄▄▀▄ \n█ ██▀▀▀▀▀█ █ \n▀▄▄█▄██▀███▄▄▀▀▄\n█▄▄█▄▄█ █▄▄█▄▄▄█"], ["happy", " ▄▀▀▀▀▀▀▀▀▄▀▀▀▄\n ▄█▀███▀▄ █ ▄▄▄█\n██▄█▄█▄█▄█▀▀▄ █\n▀▄███████▀ █▄▄█\n██ █ ▄▀▀█ █\n▀▀█▀▀ █▄▄█▄▄▄█\n ▄▄████▀██▄█▄▄▄ \n█▄▄█▄▄█ █▄▄█▄▄▄█"], ["injured_1", " ▄▄▄ \n ▄▀▀▀▀▀▀▀▀▄▀ █\n▄█▀███▄ █▄▄▄▄█\n▄▀▀▀█▀▀▀▀▀█ █ \n█▄▄▄▀ ▄▄▄ █▄▀▀▄ \n▄▀▄▄▄▄█▄█▄█ █ \n▀▄▄█▄▄▄▄▄▄█▄▄▀▀▄\n█▄▄█▄▄█ █▄▄█▄▄▄█"], ["injured_2", " ▄▄▄ \n ▄▀▀▀▀▀▀▀▀▄▀ █\n▄████▀▄ █▄▄▄▄█\n▄▀▀▀█▀▀▀▀▀█ █ \n█▄▄▄▀ ▄▄▄▄█▄▀█ \n ▀▄▄▄▄█▄██ █ \n ▄██▄▄▄▄▄█▄▄▀▀█▄\n█▄▄█▄▄█ █▄█▄▄▄██"], ["sleep_1", " ▄▄▄ \n ▄▀▀▀▀▀▀▀▀▄▀ █\n▄▀▀█▀▀▄ █▄▄▄▄█\n▄▀▀▀█▀▀▀▀▀█ █ \n█▄▄▄▀ ▄▄▄ █▄▄▀▄ \n▄▀▄▄▄▄█▄█▄█ █ \n▀▄▄█▄▄█▀▄▄█▄▄▀▀▄\n█▄▄█▄▄█ █▄▄█▄▄▄█"], ["sleep_2", " ▄▄▄▄▄▄▄▄ ▄▄▄ \n █▄▄▄▄ ▄▀ █\n▄▀▄▄█▄▄█▄▄█▄▄▄▄█\n██ █ █ █ \n▀██▀▀ █▀█▀▄▄▀▄ \n█ ██▀▀▀▀▀█ █ \n▀▄▄█▄██▀███▄▄▀▀▄\n█▄▄█▄▄█ █▄▄█▄▄▄█"], ["walk_1", " ▄▀▀▀▀▀▀▀▀▄▀▀▀▄\n ▄█▀█▀█▄ █▄▄▄ █\n█▄▀▀▀█▀▀▀▀█ █ \n▀█▄▄▄▀ ▄▄ ▀▄▄▄█ \n█▀█▄▄▄▄█▀▀█ █\n▀▄▄██▄▄█▄▄█▄▄▄▄█\n ▄▄█▄▄█ █▄▄█▄▄▄ \n█▄▄█▄▄█ █▄▄█▄▄▄█"], ["walk_2", " ▄▄▄▄▄▄▄▄▄▄▄ \n █▄▄▄▄ ▄▀ █ \n▄▀█▄█▄██▄█▀▀▀▄█ \n██ █ █ █ \n ██▀▀▄▄██▀▀▀▀▄ \n █▀█▀█ █ █ \n ▄█████▀██████▄ \n█▄▄█▄▄█ █▄▄█▄▄▄█"]]], + ["guilmon", [["angry", " ▄▄▄ ▄▄▄▄ \n ▄█▄▄██▀ ▄▀ \n ▄█ ▄█ ▄█ \n█ ▄ ▀▀ ▀▄ \n▀█▀▀▀▀▀▄ ▄██▄▀█\n █▀█▀▀ ▄ █▄▀\n ▄█▄▀▄ ▄██▄█ \n█▄█▄██▀▀█▄█▄█▄█ "], ["attack", " ▄▄███▄▄▀▀▀▀▀█ \n█ ▄▀█▀▄▄▀ \n▀▄█▄█▄▀▀ ▀▄ \n ▀█████ ▄█▀█▄▄\n █▀ ▀ ▀ ▄ ▀ ▄█ █\n █▀█▀▀▀ ▀█ █ \n ▄▄█▀▀▄▄▄█▄▄▄█ \n█▄█▄█▄▀ █▄█▄█▄█ "], ["eat_1", " ▄▄▄▄▀▀▀▀▄▄▀▀▀█\n █ ▀█▄ ▄▄▀ \n ▀▀█▄██▄▀▀▀ ▀▄ \n ▄▄█▀█▀ ▄▀ \n █▄▄▄▄ ▄ █ ▄▀█\n ▀▄█ █▄▄ █▀▄▀\n ▄▄█▄ ▄▄▄██ \n █▄█▄██▀█▄█▄█▄█ "], ["eat_2", " \n ▄███▄█▀▀▀▀█ \n ▄█ ▄ ▄▄▀ \n █ ▄ ▄ ▀ ▀ ▀▄ \n ▀█▀▀ ▄█▀▄▄\n ▄▀█▀▀ █▀ ▀▄█ █\n █▄█▄ █▄█▄█▄▀ \n █▄█▄██▀█▄█▄█▄█ "], ["happy", " ▄▄▄▄ ▄▄▄▄▄\n ▄▀▀▀▀ ▄▀▀ ▄▀\n █▄▄▄█▄ ▀ ▀ █▀ \n █████ ▄█ \n █▄▄▄▄ ▄▀ █▀█\n ▀▄█ █▀▄▀\n ▄▀█▄▄▄█▄▄▄█ \n █▄█▄███▄█▄█▄█ "], ["injured_1", " \n ▄███▄█▀▀▀▄ \n ▄█ ▄▄▄█ \n █ ▄ ▀▄▄ ▀▄ \n ▀█▀▀▀ ▄█▀ \n ██▀ ▄▀ ▀▄▄ \n █▄█▄ █▄█▄█▄▀▄\n █▄█▄██▀█▄█▄█▄█▀"], ["injured_2", " \n ▄▄▄ ▄▄▄▄ \n ▄▀▀▀▀▀▀ ▀▄ \n ▄▀▀ ▄ ▀█▀▀ \n █▄▄█▄ ▀▀ ▄█ \n ▀▄▄▄ ▄ █▀ \n ▄█▄█ █ ▄▄██▄ \n█▄█▄██▄▄██▄█▄█▄█"], ["sleep_1", " \n \n ▄██▄▄▀▀▀▄▄▄ \n ▄▀▀ ▄▄▄▀ \n █ ▄ ▀▀▀ ▀▄ \n▄▄▀█▀▀▀ ▄▄▀▄██▄ \n█▄█ █▀▀▀▄ █▄█▄█ \n█▄▄█▄█▄█▄▄█▄▄▄██"], ["sleep_2", " \n ▄▄▄ ▄▄▄ \n ▄█▀▀▀▀ ▀▀▄ \n ▄▀ ▄▄▄ ▀█▀▀ \n ▀▄▄▄█▄ ▄ ▄█ \n▄▄▀█▄▄▄▄▀▀▀▄██▄ \n█▄█ ▀▄ ▄▀ █▄█▄█ \n█▄▄███▄████▄▄▄██"], ["walk_1", " ▄▄▄ ▄▄▄▄▄▄ \n ▄▀▀▀▀▀▀ ▄▀ \n ▄▀▀ ▀█▄ ▀█ \n █▄▄█▄ ▀▀▀ ▄█ \n ▀▄▄▄ ▄▄ █▀ ▄▄\n █▄█ █▄▄▄ ██ █\n ▄▄█▄ ▄▄▄█▄▀ \n █▄█▄██▀█▄█▄█▄█ "], ["walk_2", " \n ▄███▄█▀▀▀▀█ \n ▄█ ▄▄ ▄▄▀ \n █ ▄ ▄██ ▀▄ \n ▀█▀▀▀ ▄█▀ \n ██▀ ▄▀ ▀▄▄▀█\n █▄█▄ ███▄█▀▄▀\n █▄█▄██▄█▄█▄█ "]]], + ["gummymon", [["angry", " ▄ \n ▄▀ ▀▄▄▄ \n ▄▄▀▀▄▄▄▀ ▀▄▄ \n█ ▄ ▄ ▄ ▄ ▀█\n ▀█ ▀▀ ▀▀ █▀ \n ▀▄ ▀▀ ▄▀ \n ▄▀▀ ▀▀▄ \n █▄▄█▄▄▄▄█▄▄█ "], ["attack", " █▀▀▄▄▄▄ \n█▀█▀▄▄▄▀ ▀▄▄▀█ \n▀▄ ▄ ▄ ▄ ▄▀ \n █ ▀▀ ▀▀ █ \n █ ████▄ █ \n ▀▄▀▀▀▀▀▄▄▀ \n ▄▄▀ ▀▄▄ \n ▀▄▄█▄▄▄▄█▄▄▀ "], ["eat_1", " ▄▀▄ \n ▄█ █▀▀▄ \n▄▀▀ ▀▀▀ ▀▀▄▄\n▀▄█▄▀▄ ▄▀▄ ▀▄▄▀\n █ ▄▄▄▄▄ █ \n ▀▄ ████ ▄▀ \n █▀ ▀█ \n █▄▄█▄▄█▄▄█ "], ["eat_2", " ▄ \n ▄▀ ▀▄▄▄ \n ▄▄▀▀▄▄▄▀ ▀▄▄ \n█ ▄ ▄ ▄ ▄ ▀█\n ▀█▀ ▀ ▀ ▀ █▀ \n ▀▄ ▀▀ ▄▀ \n ▄▀▀ ▀▀▄ \n █▄▄█▄▄▄▄█▄▄█ "], ["happy", " ▄▀▄ \n▄▄ ▄█ █▀▀▄ ▄▄\n█ ▀ ▀▀▀ ▀▀ █\n ▀█▄▀▄ ▄▀▄ ▀▄▀ \n █ ▄▄▄▄▄ █ \n ▀▄▀███▀ ▄▀ \n █ █ \n █▄▄█▄▄█▄▄█ "], ["injured_1", " \n ▄ \n ▄▀ ▀▄▄▄ \n ▄▄▀▀▄▄▄▀ ▀▄▄ \n █ ▄ ▄ ▄ ▄ █\n ▀▀█ ▄▀ ▀▄ █▀\n ▀▄ ▀▀ ▄▄▀ \n █▄▄█▄▄█▄▄▄█ "], ["injured_2", " \n \n ▄▀▄ \n ▄█ █▀▀▄ \n ▄▀ ▀▀▀ ▀▄ \n █ █ ▄▄ ▄▄ █ █\n ▀█ ▀▀ ▄█▀\n █▄▄▄█▄▄█▄▄▄▄█ "], ["sleep_1", " ▄ \n ▄▀ ▀▄▄▄ \n ▄▄▀▀▄▄▄▀ ▀▄▄ \n█ ▄ ▄ ▀█\n ▀█ ▀▀ ▀▀ █▀ \n ▀▄ ▀▀ ▄▀ \n ▄▀▀ ▀▀▄ \n █▄▄█▄▄▄▄█▄▄█ "], ["sleep_2", " \n ▄▀▄ \n ▄█ █▀▀▄ \n▄▀▀ ▀▀▀ ▀▀▄▄\n▀▄█ ▄▄ ▄▄ ▀▄▄▀\n █ ▄▄ █ \n ▄▀▄ ▄▀▄ \n █▄▄▄▄█▄▄█▄▄▄▄█ "], ["walk_1", " ▄▀▄ \n ▄█ █▀▄▄ \n▄▀▀ ▀▀▀ ▀▀▄▄\n▀▄█ ▄█ ▄█ ▀▄▄▀\n █ ▄▄ █ \n ▀▄▄ ▄▄▀ \n █ █ \n █▄▄█▄▄█▄▄█ "], ["walk_2", " ▄ \n ▄▀ ▀▄▄▄ \n▄▄▄▀▀▄▄▄▀ ▀▄▄▄▄\n▀▄▄ ▄ ▄ ▄▄▄▀\n █ ▀▀ ▀▀ █ \n ▀▄ ▀▀ ▄▀ \n ▄▀▀ ▀▀▄ \n █▄▄█▄▄▄▄█▄▄█ "]]], + ["gundramon", [["angry", " ▄▄▄▄▄▄▄▄ ▄▄▄ \n █▄▄▄▄█▄▄█ █ █ \n ▄▀▀▀ ▄█ ██▄▄█ \n ▀▄▄▄▄▄▄▄ ▄█▄ █\n█▀▀▄▄▄▄▄▄█▄▄ █▄▀\n▀▀█▄█ █▄▄▀ █▀ \n ▄▄▄█▀▄ ▀██▄█▄ \n█▄█▄▄██▀▀█▄█▄█▄█"], ["attack", "█▀▀▀█████▄▄▄▄▄▄ \n▀▀█▀█▄▄▄▄▄█ █ \n █ ▄ ▄ ▀█▀▀▀█\n▄▄█▀█▄█▄█▄█▀▀▄ █\n█▄▄▀█▄▄▄ █▀▄█▀ \n ▀▀█▄▀▀▀██▄▀▄ \n ▄█▄▄█▄▄▄█▄▄▄█ \n █▄█▄▄█ █▄█▄█▄█"], ["eat_1", " █▀▀▀▀█▀▀▄ █▀█ \n ▀█▀██▀▀▀▀▄█ ▀▄ \n █ ▄ ▄ ▀█▀▀▀▄\n▄▄▀██████▄▀▀▀▄ █\n█▄▄▀▀ ▀ ▀▄▀▀▄█▀ \n ▀██▀▀▀▀▄▄▄▀▄ \n ▄█▄▄█▄▄▄▄█▄▄▄█ \n█▄█▄▄█ █▄█▄█▄█"], ["eat_2", " ▄▄▄▄▄▄▄▄ ▄▄▄ \n █▄▄▄▄█▄▄█ █ █ \n ▄▀▀▀ ▄▀▄ ██▄▄█ \n ▀▄▄▄▄▄▄▄ ▄█▄ █\n█▀▀▄▄▄▄▄▄█▄▄ █▄▀\n▀▀█▄█ █▄▄▀ █▀ \n ▄▄▄█▀▄ ▀██▄█▄ \n█▄█▄▄██▀▀█▄█▄█▄█"], ["happy", " █▀▀▀▀█▀▀▄ █▀█ \n ▀███▀▀█▀▀▄█ ▀▄ \n █ ▀ ▀ ▀█▀▀▀▄\n▄▄▀██████▄▀▀▀▄ █\n█▄▄▀▀ ▀ ▀▄▀▀▄█▀ \n ▀▀██▀▀▀▄▄▄▀▄ \n ▄█▄▄█▄▄▄█▄▄▄█ \n █▄█▄▄█ █▄█▄█▄█"], ["injured_1", " \n ▄▄▄ \n █▀▀▀▀█▀▀▄ █ █ \n ▀█▀▀▀▀█▀▀██▄▄█ \n █ ▄ ▄▀▀ ▄█▄ █\n█▀█▀ ▀ ▀▀█ ▀▄▀\n▄▀█▀█▀████▀█▀█▀▄\n█▄▄▄██▄▄▄█▄▄▄▄▄█"], ["injured_2", " \n ▄▄▄ \n▄▄▄▄▄▄▄▄ █ █ \n█▄▄▄▄█▄▄█▄█▄▄█ \n▄▀ █▄ ▄█▄ █ \n█▄▄▀▄▀▄▄▄▀ ▀▄▀ \n█▀█▀█▀█▄██▀█▀█▀▄\n█▄▄▄██▄▄▄█▄▄▄▄▄█"], ["sleep_1", " \n ▄▄▄ \n █▀▀▀▀█▀▀▄ █ █ \n ▀█▀▀▀███▀██▄▄█ \n █ ▄ ▄ ▄█▄ █\n█▀█▀▀ ▀ ▀█ ▀▄▀\n█▀█▀█▀████▀█▀█▀▄\n█▄▄▄██▄▄▄█▄▄▄▄▄█"], ["sleep_2", " \n ▄▄▄▄▄▄▄▄ ▄▄▄ \n █▄▄▄▄█▄▄█ █ █ \n ▄▀ ▀▀▀ ██▄▄█ \n ▀▄▄▄▀▄▀▄ ▄█▄ █\n█▀▀▄▄▄▄▄▄█ ▀▄▀\n█▀█▀█ █▄▄█▀█▀█▀▄\n█▄▄▄██▄▄▄█▄▄▄▄▄█"], ["walk_1", " █▀▀▀▀█▀▀▄ █▀█ \n ▀█▀██▀▀▀▀▄█ ▀▄ \n █ ▄ ▄ ▀█▀▀▀▄\n▄▄█▀▀ ▀ ▀▄▀▀▀▄ █\n█▄▄▀█▀█▀▀█▀▀▄█▀ \n ▀▀█▄▀▀▀▄▄▄▀▄ \n ▄█▄▄█▄▄▄█▄▄▄█ \n █▄█▄▄█ █▄█▄█▄█"], ["walk_2", " ▄▄▄▄▄▄▄▄ ▄▄▄ \n █▄▄▄▄█▄▄█ █ █ \n ▄▀ ▀▀ ██▄▄█ \n ▀▄▄▄▀▄▀▄ ▄█▄ █\n█▀▀▄▄▄▄▄▄█▄▄ █▄▀\n▀▀█▄█ █▄▄▀ █▀ \n ▄▄▄█▀▄ ▀██▄█▄ \n█▄█▄▄██▀▀█▄█▄█▄█"]]], + ["gusokumon", [["angry", " \n ▄▀▀ ▄▄ ▄\n █ ▄▄█▀ ▄██\n ▄██▄▄█▀▄▀▄ █\n ▄▀ ▄ █ █▀█▄██\n▄█ ▄▀▀▄██ █ █ ██\n█ ▀ ▀▀▄▄██▄█▄█▄▀\n███▀▀███▄▀▄█▄▀▄█"], ["attack", " ▄▀▀ ▄▄ \n ▄█▄▄▄█▀ ▄█\n ▄▀ ▄ █▀▄▄ ▀▀█\n █ ▀▀ ██ █▄█ ▄█\n ▀████ ██ █ █▀██\n█▀█▀█▀▄▀█▄▀▄▀▄▀█\n█▄▄▄▄██▀▀█▀█▀█▀ \n █▄▄▀▄▄▄▀ █▄▀▄█ "], ["eat_1", " ▄▄ \n ▄▀ ▄▄▀▀ ▄█\n ▄▀█▀▀▀█▄ ▄ ▀▀█\n █ ▄█▀▄█ █▄█ ▄█\n ▀▄▄▄▄███ █ █▀██\n█▀█▀█▀▄▀█▄▀▄▀▄▀█\n█▄▄▄▄██▀▀█▀█▀█▀ \n █▄▄▀▄▄▄▀ █▄▀▄█ "], ["eat_2", " \n ▄▀▀ ▄▄ ▄\n █ ▄▄█▀ ▄██\n ▄██▄▄█▀▄▀▄ █\n ▄▀ ▀▄▄ █ █▀█▄██\n▄█ ▄▀ ▄██ █ █ ██\n█ ▀ ▀▀▄▄██▄█▄█▄▀\n███▀▀███▄▀▄█▄▀▄█"], ["happy", " ▄▄ \n ▄▀ ▄▄▀▀ ▄█\n ▄▀█▀▀▀█▄ ▄ ▀▀█\n █ ▄▀▀▄█ █▄█ ▄█\n ▀▄▄▄▄███ █ █▀██\n█▀█▀█▀▄▀█▄▀▄▀▄▀█\n█▄▄▄▄██▀▀█▀█▀█▀ \n █▄▄▀▄▄▄▀ █▄▀▄█ "], ["injured_1", " \n \n ▄▀▀ ▄▄▄ ▄█\n █▄▀▀█▄ ▄ ▀▀█\n ▄▀▀█▀▀█ █▄█ ▄█\n █ ▀▀▄█ █ █▀██\n█▀▄▀▄▄▀▀█▄▀▄▀▄▀█\n█▄▄▄▄▄█████████▄"], ["injured_2", " \n \n ▄▄ ▄\n ▄▀▄▄█▀▀▄ ▄██\n ▄██▄▄█▀▄▀▄ █\n ▄▀ █▄ █ █▀█▄██\n█▀▄▀▄▄ ██ █ █ ██\n█▄▄▄▄▄█▄██▄█▄█▄▀"], ["sleep_1", " \n \n ▄▀▀ ▄▄ ▄\n █ ▄▄█▀ ▄██\n ▄██▄▄█▀▄▀▄ █\n ▄▀ ▀▄▄ █ █▀█▄██\n█▀▄▀▄▄▀██ █ █ ██\n█▄▄▄▄▄█▄██▄█▄█▄▀"], ["sleep_2", " \n ▄▄ \n ▄▀ ▄▄▀▀ ▄█\n █▄▀▀█▄ ▄ ▀▀█\n ▄▀█▀▀▀█ █▄█ ▄█\n █ ▀▀▄█ █ █▀██\n█▀▄▀▄▄▀▀█▄▀▄▀▄▀█\n█▄▄▄▄▄█████████▄"], ["walk_1", " ▄▄ \n ▄▀ ▄▄▀▀ ▄█\n █▄▀▀█▄ ▄ ▀▀█\n ▄▀█▀▀▀█ █▄█ ▄█\n █ ▄█▀▄█ █ █▀██\n█▀▄▀▄▄▀▀█▄▀▄▀▄▀█\n█▄▄▄▄▄█▀▀█▀█▀█▀ \n █▄▄▀▄▄▄▀ █▄▀▄█ "], ["walk_2", " \n ▄▀▀ ▄▄ ▄\n █ ▄▄█▀ ▄██\n ▄██▄▄█▀▄▀▄ █\n ▄▀ ▀▄▄ █ █▀█▄██\n▄█ ▄▀▀▄██ █ █ ██\n█ ▀ ▀▀▄▄██▄█▄█▄▀\n███▀▀███▄▀▄█▄▀▄█"]]], + ["hagurumon", [["angry", " \n ▄▄ ▄▄ \n ▀▄▀▀▀▀▄▀ \n █▀██▄███▄ ▀▄▀█ \n ▀█ ▀█▀ █ █▀ \n ▄▀▀██▀▀██▄▀▀▀▄ \n▀█ ▀█▄██▄██ ▀ █▀\n ▀█▀ ▀▀█▀ "], ["attack", " █▀▄▀▀▀▀▀▀█▀▀▄▀█\n ▀█ ▀████▀ █ ▀▄▀\n █ █▄▄██▄▄█ █ █ \n █▀ ▀ ▀ ▀█▀▄█ \n█▀▀▄█▄█▄█▄▄▀ █▀█\n▄██▄▄▀▀▀▀▀ ▄█▄█▄\n █ ▄ █▀▀▀▀█ ▄ █ \n▄▀▄▄▄▀▄ ▄▀▄▄▄▀▄"], ["eat_1", " ▄▄ ▄██▄ ▄▄ \n ▀▄▀▄▄▄▄▀▄▀ \n █ █▄██▄█ █ \n ████ ████ \n █▄▀▄▄▄▄▀▄█ \n ▄▀▀▀█▄▄▄▄█▀▀▀▄ \n▀█ ▀ █ ██ █ ▀ █▀\n ▀█▀ ▀█▀ "], ["eat_2", " ▄▄ ▄▄ \n ▀▄▀▀▀▀▄▀ \n █▀▄▀▄████▄▀▄▀█ \n ▀█ ▀▀██▀▀ █▀ \n▄ ▄█▄▀████▀▄█▄ ▄\n █▀▀▀█▄▄▄▄█▀▀▀█ \n █ ▀ █▀ ▀█ ▀ █ \n▄▀▀▀▀▀▄ ▄▀▀▀▀▀▄"], ["happy", " ▄▄▄▀▀▀▀▄▄▄ \n ▀█▄▀██▀▄█▀ \n █▀█▄██▄█▀█ \n ████ ████ \n █▄▀▄▄▄▄▀▄█ \n ▄▀▀▀█▄▄▄▄█▀▀▀▄ \n▀█ ▀ █ ██ █ ▀ █▀\n ▀█▀ ▀█▀ "], ["injured_1", " \n ▄▄ ▄▄ \n ▀▄▀▀▀▀▄▀ \n █▀▄▀▄████▄▀▄▀█ \n ▀██▀▀██▀▀██▀ \n ▄▀▀▀██▀▀██▀▀▀▄ \n▀█ ▀ █▄██▄█ ▀ █▀\n ▀█▀ ▀█▀ "], ["injured_2", " \n \n █▀▄▄▄▄▄▄▀█ \n ▄▄▄▀▄▄▄▄▄▄▀▄▄▄ \n ▀▄██████████▄▀ \n ▄▀▀▀▄▄██▄▄▀▀▀▄ \n▀█ ▀ █▀▄▄▀█ ▀ █▀\n ▀█▀ ▀▀▀▀ ▀█▀ "], ["sleep_1", " \n ▄▄ ▄▄ \n ▀▄▀▀▀▀▄▀ \n █▀▄▀▄████▄▀▄▀█ \n ▀█ ▀▀██▀▀ █▀ \n ▄▀▀▀██████▀▀▀▄ \n▀█ ▀ ██▄▄██ ▀ █▀\n ▀█▀ ▀█▀ "], ["sleep_2", " \n ██ \n █▀▄▀▀▀▀▄▀█ \n ▄▀▄████▄▀▄ \n▄█▀█ ▀▀██▀▀ █▀█▄\n █▀▀▀██████▀▀▀█ \n █ ▀ ██▄▄██ ▀ █ \n▄▀▀▀▀▀▄▀▀▄▀▀▀▀▀▄"], ["walk_1", " ██ \n █▀▄▀▀▀▀▄▀█ \n ▄▀▄▀██▀▄▀▄ \n ███ █▄██▄█ ███ \n █▄▀█▄▄█▀▄█ \n ▄▀▀▀█▄▄▄▄█▀▀▀▄ \n▀█ ▀ █ ██ █ ▀ █▀\n ▀█▀ ▀█▀ "], ["walk_2", " ▄▄ ▄▄ \n ▀▄▀▀▀▀▄▀ \n █▀▄▀▄████▄▀▄▀█ \n ▀█ █▄██▄█ █▀ \n▄ ▄█▄▀▄▄▄▄▀▄█▄ ▄\n █▀▀▀█▄▄▄▄█▀▀▀█ \n █ ▀ █▀ ▀█ ▀ █ \n▄▀▀▀▀▀▄ ▄▀▀▀▀▀▄"]]], + ["hawkmon", [["angry", " ▄▄▄▄▄▀█ \n ▄█▄▄▄▄▄██ \n █▀▀█▀▀▀▀█ \n █▄▄▄▀ ▄█ █ \n ████▀ █ ▄▀████\n ▀███████████▀ \n ▄▄█▀██▀██▄ \n █▄█▄▄█▀▄▄█▄█ "], ["attack", " ▄▄ \n ▄▀▀▀▀▀▄█ \n █████████ \n ▄▀ █ ▄█ █ \n ▀█▀▀ ▄█▄▄ \n ██▄█▄█▄█▄███ \n ▄▄█▀████▀███ \n █▄█▄▄▀▀▀▀▄▄█▄█ "], ["eat_1", " ▄▄ \n ▄▀▀▀▀▀▄█ \n █████████ \n ▄▀ █ ▄▀▄█ \n ▀█▀▀ ▄█▄▄ \n ██▄█▄█▄█▄███ \n ▄▄█▀████▀███ \n █▄█▄▄▀▀▀▀▄▄█▄█ "], ["eat_2", " ▄▄▄▄▄▀█ \n ▄█▄▄▄▄▄██ \n █▀▀█▀▀█▀█ \n ▄█▄▄▄▀ ▀▀ █▄▄ \n ▀██▀ █ ▄▀██▀ \n █████████ \n ▄▄█▀██▀██▄ \n █▄█▄▄█▀▄▄█▄█ "], ["happy", " ▄▄▄▄▀█ \n█▀▄▀▀ ▄▄██ █▀▄▄\n▀██▀▀█▀▀█ ▀███▄█\n █▄▄▄█ ▀ ▀ ███▀ \n ▀██▀ ▄▄█▀▄ \n ▀█▄█████▀ \n ▀████ ▀█ \n █▄█▄▄▀ "], ["injured_1", " \n \n ▄▄▄▄▄▀█ \n ▄█▄▄▄▄▄██ \n █▀▀▀▀▀▀▀█ \n ██▀▀▄ █▄ █ \n █▀▄▄▄▀▄▄▄▀██ \n ▀█▄▄███▄▄██▀ "], ["injured_2", " \n \n ▄▄ \n ▄▀▀▀▀▀▄█ \n █████████ \n ▄█▄▄ ▄ █ \n ▄█▀ █ ▀▀▄██▄ \n ▀▄███▄███▄▄█▀ "], ["refuse", " ▄▄ \n ▄▀▀▀▀▀▄█ \n █████████ \n ▄▀ █ ▄ █ \n ▀█▀▀ ▀▀▄█▄▄ \n ██▄█▄█▄█▄███ \n ▄▄█▀████▀███ \n █▄█▄▄▀▀▀▀▄▄█▄█ "], ["sleep_1", " \n ▄▄ \n ▄▀▀▀▀▀▄█ \n █████████ \n ▄▀ █ ▄▄ █ \n ▀█▀▀ ▄█▄ \n █▄█▄█▄█▄██▄ \n ████████████ "], ["sleep_2", " \n \n ▄▄▄▄▄▀█ \n ▄█▄▄▄▄▄██ \n █▀▀█▀▀▀▀█ \n █▄▄▄▀ ▀▀ █ \n █ ▄ ▄ ▄▀██▄ \n ████████████ "], ["walk_1", " ▄▄▄▄▄▀█ \n ▄█▄▄▄▄▄██ \n █▀▀█▀▀█▀█ \n █▄▄▄▀ ▀▀ █ \n ▄█ ▄ ▄ ▄▀███ \n ▀██████████▀ \n ▄▄█▀██▀██▄ \n █▄█▄▄█▀▄▄█▄█ "], ["walk_2", " ▄▄ \n ▄▀▀▀▀▀▄█ \n █████████ \n ▄▀ █ ▄█ █ \n ▀█▀▀ ▄█▄▄ \n ██▄█▄█▄█▄███ \n ▄▄█▀████▀███ \n █▄█▄▄▀▀▀▀▄▄█▄█ "]]], + ["heavyleomon", [["angry", " ▄▀▀█▀█▀▀▀▀█ \n █▄▀▀▀▀▄█ ▀▄▄\n █ ▄█ ▄█▄▄ ▄▀\n ▄███▄ █▄▄▄██ \n █ █▀▀ █▄▄██ █ \n ▀█▀▀▀ ▄█▀▄▄▀ \n ▄█▀▀▄█▄█▄▄█ \n █▄█▄██ █▄█▄▄█ "], ["attack", " ▄▄▄▄▄▄▄▄▄▄ \n ▄▀▄▄█▄▀▄ ▄▀ \n ▄▀▀ ▄▄ ▀█ ▀█\n █▄▄▀▀ ▄▀▀▀█▄▀ \n ▀▄▄▄▄▄▀▀▀█ ▀▄ \n ▄█▀ ▄ ▀██▀▀▄▀ \n █ █▄▄ ▄▀█ ▄█ \n█▄█▄▄█▀▀▀███▄▄█ "], ["eat_1", " ▄▄▄▄▄▄▄▄▄▄ \n ▄▀▄▄█▄▀▄ ▄▀ \n ▄▀▀ ▄ ▀█ ▀█\n █▄▄▀ ▀▄▀▀▀█▄▀ \n ▀▄▄▄▄▄▀▀▀█ ▀▄ \n ▄█▀ ▄ ▀██▀▀▄▀ \n █ █▄▄ ▄▀█ ▄█ \n█▄█▄▄█▀▀▀███▄▄█ "], ["eat_2", " ▄▀▀█▀█▀▀▀▀█ \n █▄▀▀▀▀▄█ ▀▄▄\n █ ▀▀ ▄█▄▄ ▄▀\n ███▄ █▄▄▄▀█ \n █▀▀ █▄▄▄█▄ █ \n ▄▀█▀▀▀ ▄█▀ █ \n ▀▄█▀▀▄█▄█▄▄█ \n █▄█▄██ █▄█▄▄█ "], ["happy", " ▄▀▀█▀█▀▀▀▀█ \n █▄▀▀▀▀▄█ ▀▄▄\n █ ▄▀▄ ▄█▄▄ ▄▀\n ████ █▄▄▄▀█ \n █▀ █▄▄▄█▄ █ \n ▄▀█▀▀▀ ▄█▀ █ \n ▀▄█▀▀▄█▄█▄▄█ \n █▄█▄██ █▄█▄▄█ "], ["injured_1", " \n \n ▄▀▀█▀█▀▀▀▀█ \n █▄▀▀▀▀▄█ ▀▄▄\n █ █▄ ▄█▄▄ ▄▀\n █▀▀ █▄▄▄▀█ \n▄▀█▀█▀▀▀▄▄▀█▀▄█ \n█▄▄▄█▄▄▄██▄▄▄█ "], ["injured_2", " \n \n ▄▄▄▄▄▄▄▄▄▄ \n ▄▀▄▄█▄▀▄ ▄▀ \n ▄▀▀▄ ▀█ ▀█ \n █ ▀▀ ▄▀▀▀█▄▀ \n▄▀█▀▄▄▄█▀█▀█▀█▄ \n█▄▄▄█▄▄▄██▄▄▄█▀ "], ["refuse", " ▄▄▄▄▄▄▄▄▄▄ \n ▄▀▄▄█▄▀▄ ▄▀ \n ▄▀▀ ▄ ▀█ ▀█\n █▄▄ ▀▀▄▀▀▀█▄▀ \n ▀▄▄▄▄▄▀▀▀█ ▀▄ \n ▄█▀ ▄ ▀██▀▀▄▀ \n █ █▄▄ ▄▀█ ▄█ \n█▄█▄▄█▀▀▀███▄▄█ "], ["sleep_1", " \n ▄▄▄▄▄▄▄▄▄▄ \n ▄▀▄▄█▄▀▄ ▄▀ \n ▄▀▀ ▀█ ▀█\n █▄▄▀▀ ▄▀▀▀█▄▀ \n ▀▄▄▄▄▄▀▀▀█ ▀▄ \n▄▀█▀█ ▀█▀█▀▄▀ \n█▄▄▄█▄▄▄██▄▄▄█ "], ["sleep_2", " \n \n ▄▀▀█▀█▀▀▀▀█ \n █▄▀▀▀▀▄█ ▀▄▄\n █ ▄▄ ▄█▄▄ ▄▀\n █▀▀ █▄▄▄▀█ \n▄▀█▀█▀▀▀▄▄▀█▀▄█ \n█▄▄▄█▄▄▄██▄▄▄█ "], ["walk_1", " ▄▀▀█▀█▀▀▀▀█ \n █▄▀▀▀▀▄█ ▀▄▄\n █ ▄█▀ ▄█▄▄ ▄▀\n █▀▀ █▄▄▄▀█ \n ██▀▀▀▄▄▄█▄ █ \n ▄▀█ ▀ ▄█▀ █ \n ▀▄█▀▀▄█▄█▄▄█ \n █▄█▄██ █▄█▄▄█ "], ["walk_2", " ▄▄▄▄▄▄▄▄▄▄ \n ▄▀▄▄█▄▀▄ ▄▀ \n ▄▀▀ ▄▄ ▀█ ▀█\n █▄▄▀▀ ▄▀▀▀█▄▀ \n ▀▄▄▄▄▄▀▀▀█ ▀▄ \n ▄█▀ ▄ ▀██▀▀▄▀ \n █ █▄▄ ▄▀█ ▄█ \n█▄█▄▄█▀▀▀███▄▄█ "]]], + ["herculeskabuterimon", [["angry", "▄█ ▄█▀ ▀█▄ █▄ \n██▄█████▄██ ██▄ \n▀█████▀▀███▄███ \n ▀█████████████▄\n █▄▀▄▀▄▀█▀▀███\n ▄▀ █▀▀█▀▀█▀▄ ██\n ▀▄▄█▀▀█▀▀█▄▄▄▀▀\n █▄█▄██▀▀█▄▄█▄█ "], ["attack", "▄█ ▄█▀ ▀█▄ █▄ \n██▄███▀█▄██ ██▄ \n▀████▄▄████▄███ \n ▀ ▀ ▀████████\n ██▀█████\n▄▀▄▄▄▄▄██▀▄ █▀██\n▀▄▄█▄█▄▄█▄▄▄█ ▀▀\n █▄█▄██▀█▄▄█▄█ "], ["eat_1", "▄█ ▄█▀ ▀█▄ █▄ \n██▄█████▄██ ██▄ \n▀████ ▄████▄███ \n ▀█▀█▀▀ ████████\n ██▀█████\n▄▀▄▄▄▄▄██▀▄ █▀██\n▀▄▄█▄█▄▄█▄▄▄█ ▀▀\n █▄█▄██▀█▄▄█▄█ "], ["eat_2", "▄█ ▄█▀ ▀█▄ █▄ \n██▄█████▄██ ██▄ \n▀████ ▄████▄███ \n ▀████▀█████████\n ▀▄▄▄▄▄██▀█████\n ▄▀█▄█▄▄█▀▄ █▀██\n ▀▄█▄█▄▄█▄▄▄█ ▀▀\n █▄█▄██▀█▄▄█▄█ "], ["happy", "▄█ ▄█▀ ▀▀█▄ ▄█\n██▄██████▄██ ███\n▀████ ▄████▀▄███\n▄▀█▀▀▀▀ █▀▀▀████\n█ █ █▀ █▀██\n▀▄▀▄▄▄▄██ ▄█▀ ▀█\n ▀▄█▄█▄▄███▄▄ █\n █▄▄██▀▀█▄▄█▄█ ▀"], ["injured_1", " \n ▄▄ ▄▄ ▄ \n▄█ ██▄▄▄ ██ ██ \n███████████ ███ \n▀█████▀████████▄\n▄▀█▀▀▀█▄█▀██▀███\n█ █▀█▀▀▀█ ███\n█▄█▄█▄▄██▄▄▄▄███"], ["injured_2", " \n \n ▄█▀ ▀█▄ █▄ \n▄█ █████▄██ ██▄ \n███████████████ \n▄▀████▀██▀██▀███\n█ ▀███▄▄█ ███\n█▄█▄▄█▄▄█▄▄▄▄███"], ["sleep_1", " \n ▄▄ ▄▄ █▄ \n ▄ ██▄▄▄ ██ ██▄ \n██▄████████▄███ \n████████████████\n▄▀████▄▄█▀▄▄▀███\n█ █▄▄▄██ ███\n█▄▄█▄█▄▄█▄▄▄▄██▀"], ["sleep_2", " \n▄█ ▄█▀ ▀█▄ █▄ \n██▄█████▄██ ██▄ \n▀██████████▄███ \n ▀████▄▄████████\n▄▀▄█▄▄▄██▀▄▄▀███\n█ █▄█▄▄█ ███\n█▄▄█▄█▄▄█▄▄▄▄██▀"], ["walk_1", "▄█ ▄█▀ ▀█▄ █▄ \n██▄█████▄██ ██▄ \n▀█████▀ ███▄███ \n ▀████▀█████████\n █▄▄▄▄███▀▀███\n █▀▄█▄█▄▄▄█▀▄ ██\n ▀▄▄█▄█▄▄▄█▄▄▄▀▀\n █▄█▄██▀▀█▄▄█▄█ "], ["walk_2", "▄█ ▄█▀ ▀█▄ █▄ \n██▄█████▄██ ██▄ \n▀█████ ▄███▄███ \n ▀████▀█████████\n █▄▄▄▄█▀█▀ ███\n █ █▄█▀▄ █▀▄ ▀█\n ▀▀▄█▄▄▄█ █ ▀\n ▀▀█▄▄▀ "]]], + ["herissmon", [["angry", " ▄ ▄▄▄▄▄▄▄ \n █ ▀▄▄▄▄ ▄▀▄ \n ▄▄█▄▀ ▄▄ ▀▀█▄▀▄\n █▀ ▀▀ ▄▀▄▀▄\n █▀▀▀ ▄█▄█▄\n ▀█ ▄ ▄ ▄▄ █▄\n ▄▄█ ▀ ▀ ▀▄▄█▄\n█▄█▄█▄▄▄▄▄██▄█▄█"], ["attack", " ▄▀▄▀▀▀▀▀▀█ \n▄▄▄█▄▄▀▀▀▀▄█▄▀▄ \n█▀ ▄█▀ █▀▄▀\n ▀████▄ ▀▄▀▄▀\n █████ ▄█▄▀▄▀\n █▄▄▄ ▄ ▄ ▄ █▄▀\n ▀▄▀ ▀ ▀ █▄▄█▄▀\n █▄█▄█▀▀▀██▄█▄█ "], ["eat_1", " ▄▀▄▀▀▀▀▀▀█ \n █ ▄▀▀▀▀▄█▄▀▄ \n ██▀▀ ▄▄▄ █▀▄▀\n ▀▄▄▄▄▄ ▀▄▀▄▀\n ▄████▀ ▀█▀▄▀\n█ ▀▄▄▄▀▄▀ ▄ █▄▀\n ▀▄▀▀ ▀▄▄█▄▀\n █▄█▄█▀▀▀██▄█▄█ "], ["eat_2", " ▄ ▄▄▄▄▄▄▄ \n █ ▀▄▄▄▄ ▄▀▄ \n ▄▄█▄▀ ▄ ▀▀█▄▀▄\n █▀ █▀█ ▄▀▄▀▄\n █▀▀▀ ▄▀▄▀▄\n ▄▀█ ▄ ▄ ▀▄▀▄\n █▄█ ▀ ▀ ▀▄▄██ \n█▄█▄█▄▄▄▄▄██▄█▄█"], ["happy", " ▄▀▄▀▀▀▀▀▀█ \n █ ▄▀▀▀▀▄█▄▀▄ \n ██▀▀ ▄█▄ █▀▄▀\n ▀▄▄▄▄▀ ▀ ▀▄█▄▀\n ███ ▄▀ █▀\n █▀▀ ▄ ▄ ▄▄▄▀▄▀\n ▄▀▀▀ ▀ ▀█▄▀\n █▄█▄█▀▀▀██▄█▄█ "], ["injured_1", " \n ▄ ▄▄▄▄▄▄▄ \n █ ▀▄▄▄▄ ▄▀▄ \n ▄▄█▄▀ ▀▀█▄▀▄\n █▀ ▀▄▄ ▄▀▄▀▄\n █▀▀▀ ▀▄▀▄\n ▄█▀█▀ ▄█ ▄ █ \n █▄▄▄█▄█▄▄▄█▄▄▄█"], ["injured_2", " \n \n ▄▀▄▀▀▀▀▀▀█ \n █ ▄▀▀▀▀▄█▄▀▄ \n██▀▀ ▄ █▀▄▀ \n▀▄▄▄▄ ▀▀ ▀▄▀▄▀ \n ▀▄▄▄▄ ▄█ ▄▀▄█ \n █▄▄█▄▄█▄▄▄█▄▄▄█"], ["sleep_1", " \n ▄ ▄▄▄▄▄▄▄ \n █ ▀▄▄▄▄ ▄▀▀▄ \n▄▄█▄▀ ▀▀█▀▄▀ \n█▀ ▀▀ ▄▀▀▄▀ \n █▀▀▀ ▄██▄▀ \n ▄▀█ ▄ ▄ █ ▀ ▀▄\n █▄▄█▄█▄▄▄█▄▄▄▄█"], ["sleep_2", " \n ▄▀▄▀▀▀▀▀▀█▄ \n █ ▄▀▀▀▀▄█▄▄▀▄\n ██▀▀ ▄▄ █▄▀▄\n ▀▄▄▄▄ ▀▄▄▀▄\n █▄▄ █▄▄▀▄\n █ ▀▄▀▄▀ █ ▀ ▀▄\n █▄▄▄█▄▄▄▄█▄▄▄▄█"], ["walk_1", " ▄▀▄▀▀▀▀▀▀█ \n █ ▄▀▀▀▀▄█▄▀▄ \n ██▀▀ ▄█▀ █▀▄▀\n ▀▄▄▄▄▀▀▀ ▀▄▀▄▀\n ▀▄▄ ▄█▄▀▄▀\n ▄▀▄▀▄▀▄▀ ▄ ▀█▄▀\n ▀▄▀ ▀▄▄█▄▀\n █▄█▄█▀▀▀██▄█▄█ "], ["walk_2", " ▄ ▄▄▄▄▄▄▄ \n █ ▀▄▄▄▄ ▄▀▄ \n ▄▄█▄▀ ▄▄ ▀▀█▄▀▄\n █▀ ██▄ ▄▀▄▀▄\n █▀▀▀ ▄▀▄▀▄\n ▄▀█ ▄ ▄ ▀▀█▄▀▄\n █▄█ ▀ ▀ ▀▄▄██ \n█▄█▄█▄▄▄▄▄██▄█▄█"]]], + ["hexeblaumon", [["angry", " \n \n ▄ \n ▄▀▀ \n ▄ \n▄▀▀ ▀ █ \n▀▄▄▀▄▄▄ ▀▄▄██▄ \n█▄▄▀█▀ ▀▄▄▄█▀▀▀ "], ["attack", " █▀▄▀▀▀▀▄▀▄▄▀▀█\n ▀▄▄▀▀▀█ ▄▀ ▄█▄\n █ ▄▀█ ▀█▄▀ ▄▀\n █▀▀▀ ▄▀ █▀▀█\n ▄ █▀▀██▀▄▄▀▄▀ \n▄▀ ▀ ▀█ ▄█▀▀▀▀▄\n ▀▄▀█▀▀██▀ ▀███▄\n █▄▄▄█ ▀▄▄▄█▀▀"], ["eat_1", "█▀▄▀▀▀▀▄▀█ ▄▄▄ \n█▄▀▄▀▀█ ▄▀▄▀ ▄█▄\n█ ▄▀█ ▀█▀▄█▀ ▄▀\n▀▄▄▄▄▄ █ █ █▀▄ \n ▄█▀▀▄▀ ▀▄▄█▀▄ █\n█ █▀▄ ▄█▄▀ ▀▀▀\n ▀█ ███ ▀██▄ \n █▄▄▀ ▀█▄▄▄▀▀▀ "], ["eat_2", " \n \n ▄ \n ▀ ▀ \n \n▄▀▀ ▀ ▄▀ \n▀▄▄▀▄▄▄ ▀▄▄▄█▄ \n█▄▄▀█▀ ▀▄▄▄█▀▀▀ "], ["happy", "█▀▄▀▀▀▀▄▀█ ▄▄▄ \n█▄▀▄▀▀█ ▄▀▄▀ ▄█▄\n█ ▄▀▄ ▀███▄▀ ▄▀\n▀▄▄▄▄▄ █ █ █▀▄ \n ▄█▀▀▄▀ █ ▄▀▀▄ █\n█ ▀█▀▄ ▄██▄ ▀▀\n ▀█ ███ ▀██▄ \n █▄▄█▀ ▀▄▄▄▀▀▀ "], ["injured_1", " ▄ \n█▀▄▀▀▀ █▀█ ▄▄▄ \n█▄▀▄▀▀█ ▄▀▄▀ ▄█▄\n█ █▄ ▀█▀▄▄▀ ▄▀\n▀█▀▀ ▄▄▀█ █▄▀ \n ▄▀█▀▄ █▀▄▄█ ▀▄\n▄█ █▄▄▀▀ █▀█▄▀\n█▄▄▄███▄▄▄▀▄▄▄█ "], ["injured_2", " \n▄▄ ▄▄▄▀▄▄▄ ▄▄▄ \n█ █ ▄▄▄▀ █▄▀ ▄█▄\n█▀ ▀▄ ▀▄█▀▄▄▀ ▄▀\n█▄▄▄▀▀ ▄█ █▄▀ \n ▀▄▄▄█▀ █▀▄▄█ ▀▄\n▄█ ▀█▄▄▀▀ █▀█▄▀\n█▄▄▄███▄▄▄▀▄▄▄█ "], ["sleep_1", " \n█▀▄▀▀▀▀▄▀█ ▄▀▀█ \n█▄▀▄▀▀█ ▄█▀ ▄▀▄ \n█ ▄▄ ▀█ ▀▀▄ █ \n ▀█▀ ▄▄▀▀▄▄▄██▄ \n ▄▄▀█ ▀▄▄█▀ █ █\n █ ▀▀██ ▀▄▄▀ ▀▀\n █▄▄▄██▄▄▄█▀█▄ "], ["sleep_2", " ▄▄ ▄▄▄▄ ▄▄ \n █ █ ▄▄▄▀ █ ▄▀▀█\n █▀ ▀ ▀▄█▄▀ ▄▀▄\n ▀▄▄▄▀▀ ▄█ ▀▀▄ █\n ▀▄▄▀▀ ▀▄▄▄██ \n ▄▄▀█ ▀▄▄█▀ █ █\n █ ▀▀██ ▀▄▄▀▀▄█\n █▄▄▄██▄▄▄█▀█▄ "], ["walk_1", " \n \n \n \n \n \n \n "], ["walk_2", " \n \n \n \n \n ▄ \n ▄▀ ▄▄▄ ▀▄▄▄▄ \n█▄▄▀█▀ ▀▄▄▄█▀▀▀ "]]], + ["hiandromon", [["angry", " ▄▄▄▄▄ \n █▀██▀▄█ \n █▀▄█▀▀▀▀██▄▄▀█ \n ▄█ █▄██▄██ █ \n█ ▀███▄▄██▀██▀▄ \n█▄▄█▄▄█▄▄█ ██▀ \n ▄███▀████▀ \n █▄▄██ ██▄▄█ "], ["attack", " ▄▄▄▄▄ \n ███▀ ██ \n █▀█▀▀▀▀██ ▄▄ \n ████▄▄██▀▀▄█ \n█▀██▀█▄▄███▄▄█▄ \n▀▀▀▀█▄█▄▄██▀█▄█ \n ▄████▀▀███▄ \n ██▄▄█ ██▄▄█ "], ["eat_1", " ▄███▀█▄ \n ▄▄ █▄█▄█▄█ ▄▄ \n ▀▄▀█ ▄▄ ██▀▀▄█ \n █▄██▀▀███▄▄█ \n ██▄▀▀█▀▀████▄█ \n█▀██▀█████▀ ▀█▀█\n▀▀▀▄███▀███▄ ▀▀▀\n █▄▄██ ██▄▄█ "], ["eat_2", " ▄▄▄▄▄ \n █▀██▀▀█ \n █▀▄█▀▀▀▀██▄▄▀█ \n █ █▄██▄██ █ \n ▄█▀██▄▄█████▀▄ \n▄███▄▄█▄▄█▀▀███▄\n█▄█████▀███▄ █▄█\n █▄▄██ ██▄▄█ "], ["happy", "▄▄ ▄███▀█▄ ▄▄▄\n█▄█ █▄█▄█▄█ █▄█\n █▀██ ▄▄ ████▀█ \n █▀██▀▀███▀▀█ \n █▀▄▀▀█▀▀██▄▄▀█ \n ▀▀▀▀█████▀ ▀▀ \n ▄███▀███▄ \n █▄▄██ ██▄▄█ "], ["injured_1", " \n ▄███▀█▄ \n ▄▄ ████▄▄█ ▄▄ \n ▀▄▀█ ▄▄ ██▀▀▄▀ \n █▄██▀▀███▄▄█ \n ██▄▀▀█▀▀████▄█ \n █▀████████▄█▀█ \n ▀█▄▄█████▄▄█▀▀ "], ["injured_2", " \n ▄▄▄▄▄ \n ████ ▀█ \n █▀▄█▀▀▀▀██▄▄▀█ \n █ █▄██▄██ █ \n ▄█▀██▄▄█████▀▄ \n █▀█▄▄█▄▄██▀█▀█ \n ▀█▄▄█████▄▄█▀▀ "], ["sleep_1", " \n ▄▄▄▄▄ \n ████▀▀█ \n █▀▄█▀▀▀▀██▄▄▀█ \n █ █▄██▄██ █ \n ▄█▀██▄▄█████▀▄ \n █▀█▄▄█▄▄██▀█▀█ \n ▀█▄▄█████▄▄█▀▀ "], ["sleep_2", " \n ▄█████▄ \n ▄▄ ████▄▄█ ▄▄ \n ▀▄▀█ ▄▄ ██▀▀▄▀ \n █▄██▀▀███▄▄█ \n ██▄▀▀█▀▀████▄█ \n █▀████████▄█▀█ \n ▀█▄▄█████▄▄█▀▀ "], ["walk_1", " ▄█████▄ \n ▄▄ █▄██▄▄█ ▄▄ \n ▀▄▀█ ▄▄ ██▀▀▄█ \n █▄██▀▀███▄▄█ \n ██▄▀▀█▀▀████▄█ \n█▀██▀█████▀ ▀█▀█\n▀▀▀▄███▀███▄ ▀▀▀\n █▄▄██ ██▄▄█ "], ["walk_2", " ▄▄▄▄▄ \n █▀██▀▀█ \n █▀▄█▀▀▀▀██▄▄▀█ \n █ █▄██▄██ █▀ \n ▄█▀██▄▄█████▀▄ \n▄███▄▄█▄▄█▀▀███▄\n█▄████▀▀▀██▄▄▀▄█\n █▄▄██ ██▄▄█ "]]], + ["hippogryphonmon", [["angry", " ▄▄▄▀▀▀▀▀▄▀▀█▀ \n█ █ ▄█ ██▄▄▄▄\n█ ▄▄█ ▄▀ ▄▄▄▄▀\n ████▄▄▀ ▄▄▄▀ \n ▀▄▄▀ ▀ ▀ ▀▄▄ \n ▀▄ █▀ █ █ ▀▄▀\n █ █ █▀▀▀█▀▄ █\n █▄▄███ █▄█▄▄█"], ["attack", " ▄▄▀▀▀▀▀▄▀▀█▀ \n▄▀ █ ▄█▀ ██▄▄▄▄\n█ █ ▄▀ ▄▄▄▄▀\n▀▄▀█ ▄▄▀ ▄▄▄▀ \n ▄▀▀ ▀ ▀ ▀▄▄ \n █ ▄█ █ █ ▀▄▀\n ▀▀▀█ █▀▀▀█▀▄ █\n █▄▄█ █▄█▄▄█"], ["eat_1", " ▄▄▀▀▀▀▀▄▀▀█▀ \n▄▀ █ ▄▀▄ ██▄▄▄▄\n█ █ ▄▀ ▄▄▄▄▀\n▀▄▀█ ▄▄▀ ▄▄▄▀ \n ▄▀▀ ▀ ▀ ▀▄▄ \n ▀▄ ▄ █ █ ▀▄▀\n █ █ █▀▀▀█▀▄ █\n █▄█▄▄█ █▄█▄▄█"], ["eat_2", " ▄▄▄▀▀▀▀▀▄▀▀█▀ \n█ █ ▄█▀ ██▄▄▄▄\n█ ▄▄█ ▄▀ ▄▄▄▄▀\n▀████▄▄▀ ▄▄▄▀ \n ▀▄▄▀ ▀ ▀ ▀▄▄ \n ▀▄ ▄ █ █ ▀▄▀\n █ █ █▀▀▀█▀▄ █\n █▄█▄▄█ █▄█▄▄█"], ["happy", " ▄▄▄▀▀▀▀▀▄▀▀█▀ \n█ █ ▄▀▄ ██▄▄▄▄\n█ ▄▄█ ▄▀ ▄▄▄▄▀\n▀████▄▄▀ ▄▄▄▀ \n ▀▄▄▀ ▀ ▀ ▀▄▄ \n ▀▄ █▀ █ █ ▀▄▀\n █ █ █▀▀▀█▀▄ █\n █▄▄███ █▄█▄▄█"], ["injured_1", " \n \n ▄▄▄▄ ▄▄▄▄ \n ▄█▀ ▀▄▄▀ \n▄▀ █ █▄ ▄▀▀▀▀▀█\n█ ▄▄▀ ▄▀ ▀▀█▀ \n █▄█▄▀█ ▄▀█▀▀▄ \n█▄█▄▄▄▄█▄▄█▄▄▄▄█"], ["injured_2", " \n \n \n ▄▄▀▀▀▀▄▀▀█▀ \n ▄▀█ ▄ ██▄▄▄▄\n█ ▀▄▀▀ ▄▀ ▄▄▄▀\n▀▄██▄▀█▀ ▄▀█▀▀▄ \n█▄█▄▄▄▄█▄▄█▄▄▄▄█"], ["refuse", " ▄▄▄ \n ▄▄▀▀▀▀▀▄▀▄▀ \n▄▀ █ ▄█ ▀█▀▀▀█\n█ █ ▄▀▀▀█▀ \n▀▄▀█ ▄▄▀▀ ▄▀█ \n ▄▀▀ ▀ ▀ █▀▄\n ▀▄ █ ▄█▄█▄ ▀▄\n █▄█▄▄█ █▄█▄▄█"], ["sleep_1", " \n \n ▄▄▀▀▀▀▀▄▀▀█▀ \n▄▀ █ ▄▄ ██▄▄▄▄\n█ █ ▄▀ ▄▄▄▄▀\n▀▄▀█ ▄▄▀ ▄▄▄▀ \n▄▀█▀▀ █ ▀ ▄ ▀▄ \n█▄█▄▄▄▄█▄▄█▄▄▄▄█"], ["sleep_2", " \n \n ▄▄▄▄▄ ▄▄▄▄ \n ▄▀█ ▀▄▄▀ \n█ ▀▄▀▀ ▄▀▀▀▀▀█\n█ ▄▄▀ ▄▀ ▀▀█▀ \n █▄█▄▀█ ▄▀█▀▀▄ \n█▄█▄▄▄▄█▄▄█▄▄▄▄█"], ["walk_1", " ▄▄▀▀▀▀▀▄▀▀█▀ \n▄▀ █ ▄█▀ ██▄▄▄▄\n█ █ ▄▀ ▄▄▄▄▀\n▀▄▀█ ▄▄▀ ▄▄▄▀ \n ▄▀▀ ▀ ▀ ▀▄▄ \n ▀▄ ▄ █ █ ▀▄▀\n █ █ █▀▀▀█▀▄ █\n █▄█▄▄█ █▄█▄▄█"], ["walk_2", " ▄▄▀▀▀▀▀▄▀▀█▀ \n▄▀ █ ▄█▀ ██▄▄▄▄\n█ █ ▄▀ ▄▄▄▄▀\n▀▄▀█ ▄▄▀ ▄▄▄▀ \n ▄▀▀ ▀ ▀ ▀▄▄ \n █ ▄█ █ █ ▀▄▀\n ▀▀▀█ █▀▀▀█▀▄ █\n █▄▄█ █▄█▄▄█"]]], + ["hisyaryumon", [["angry", " ▄▄▄▄▄▄▄ \n ▄█▀▀▀▀ ▄█▄▄ \n ▄▀ ▄█ ▄▄█▄ \n█ ▀▀▄ \n▀▄▄▀██▀▀▀█ █▀▄ \n ▄█ ▄█▀█▄▄█ █\n █ █▀█ ▄▀█▀▄ █\n ▀▀▀████▄▄▀▀▀ "], ["attack", " ▄▄▄███▀▀█▀ \n ▄▀▀ ▄█ ▀█▀▀ \n█ ▄▄▄▄▄ ▄█▀▀▀ \n ▀██▀▀▀█ ▄▄▀ ▄▄ \n ▄▀▀▀▀▀▀▄█▄ █ █\n ▄▀▀█▀▀█▀ █▄█ █\n ▀▄▄█▀▀▀▄▄▀█▀▄▄▀\n ▀█▄▄█▄▄▀▀ "], ["eat_1", " ▄▄▄███▀▀█▀ \n ▄▀▀ ▄ ▀█▀▀ \n█ ▄▄▄▀ ▀▄▄█▀▀▀ \n ████ ▄▄▄▀ ▄▄ \n ▀▄▄▄▄▀▀▀█ █ █\n ▄█ ▄█▀█▄▄█ █\n █ █▀█ ▄▀█▀ ▄▀\n ▀▀▀████▄▄▀▀ "], ["eat_2", " ▄▄▄▄▄▄▄ \n ▄█▀▀▀▀ ▄█▄▄ \n ▄▀ ▄▀▄ ▄▄█▄ \n█ ▀▀▄ \n▀▄▄▀██▀▀▀█ █▀▄ \n ▄█ ▄█▀█▄▄█ █\n █ █▀█ ▄▀█▀▄ █\n ▀▀▀████▄▄▀▀▀ "], ["happy", " ▄▄▄███▀▀█▀ \n ▄▀▀ ▄▀▄ ▀█▀▀ \n█ ▄▄▄▄ ▄▄█▀▀▀ \n ████▀ ▄▄▄▀ ▄▄ \n ▀▄▄▄▄▀▀▀█ █ █\n ▄▀█ ▄▀▀ █▄▄█ █\n ▀▄█▀▀▄▄▀▀█▀▄▄▀\n ▀▀█▄▄█▄▄▀▀ "], ["injured_1", " \n ▄▄███▀▀█▀ \n ▄▀▀ ▀█▀▀ \n▄▀ █▄ ▄▄█▀▀▀ \n█ ▄▄▄▄▄▄▄▀ \n ▀▀▄▀▀ ▄▄█▄ ▄▄▄ \n▄▀▀█▄▀▀ ███▀▄ █\n▀▄▄▄█▄▄▄██▄▄▀▀▄█"], ["injured_2", " \n ▄▄▄▄▄▄▄ \n ▄█▀▀▀▀ ▄█▄▄ \n ▄▀ ▄ ▄▄█▄ \n█ ▀▀ ▀▀▀▄ \n▀▄▄██▀▀███▄ \n ▄▀█ ▄▀▀ ██▀▀▀▄\n ▀▄▄██▄▄▄█▄▄██▄█"], ["sleep_1", " \n ▄▄███▀▀█▀ \n ▄▀▀ ▀█▀▀ \n▄▀ ▄▄ ▄▄█▀▀▀ \n█ ▄▄▄▄▄▄▄▀ ▄ \n ▀▀ █▀ ▄█▄▄ █ █\n ▄▀▀█▄▀▀ ███▀ █\n ▀▄▄██▄▄▄██▄▄█▄▀"], ["sleep_2", " ▄▄▄▄▄▄▄ \n ▄█▀▀▀▀ ▄█▄▄ \n ▄▀ ▄▄█▄ \n█ ▀▀ ▀▀▀▄ \n▀▄▄▀██▀▀▀█ █▀▄ \n ▄█ ▄█▀█▄▄█ █\n █ █▀█ ▄▀█▀▄ █\n ▀▀▀████▄▄▀▀▀ "], ["walk_1", " ▄▄███▀▀█▀ \n ▄▀▀▄▄ ▀█▀▀ \n▄▀ ▀▀ ▄▄█▀▀▀ \n█ ▄▄▄▄▄▄▄▀ \n ▀▀ █▀ █▀ █▀▄ \n ▄▀█ ▄▀▀ █▄▄█ █ \n ▀▄█▀▀▄▄▀▀█▀▄ █ \n ▀█▄▄█▄▄▀▀▀ "], ["walk_2", " ▄▄▄▄▄▄▄ \n ▄█▀▀▀▀ ▄█▄▄ \n ▄▀ ▄█▀ ▄▄█▄ \n█ ▀▀▀▄ \n▀▄▄▀██▀▀▀█ █▀▄\n ▄█ ▄█▀█▄▄█ █\n █ █▀█ ▄▀█▀▄ █\n ▀▀▀████▄▄▀▀▀ "]]], + ["hiyarimon", [["angry", " ▄▄▄ ▄▄▄ \n ▄▀ ▀▀▀▀ ▄▀ \n █▄ ▄ █ \n █▀█▄▄ ▀▀ █ \n █▀▀ ▀▄ ▄█ \n █▀▀█▀▀▀▀▀▀▀█▄▀ \n █ █ █ █▀▄\n ▀▄█▄▄▄▄█▄▄███"], ["attack", " ▄▀▀█▄▄▄▀▀█ \n ▄▀ ▀▄ \n ██▄ ▄█ █ \n ▄█▄▀▀▀▄ █ \n▄▀▄▄▄▄▄▄██▄▄▀▄▄ \n█ ▀▄ █ ▀ █▄▀\n ▀▀▀▀█ ▀▀▀▀█▄▀\n ▀▄▄▄▄▄▄▄▄▄█"], ["eat_1", " ▄▀▀█▄▄▄▀▀█ \n ▄▀ ▀▄ \n █ █ █ █ \n █▀▀▀▀▀▄ █ \n █▀▀██▀ █▄▄▄█▀▄ \n █▄▄▄▀ ▄ ▀█▄ \n ▀ █ █ █ █▄▀\n ▀▄█▄▄▄▄█▄▄█▄█"], ["eat_2", " ▄▄▄ ▄▄▄ \n ▄▀ ▀▀▀▀ ▄▀ \n █ ▄ ▄ █ \n █▀▄█▄ ▀ ▀ █ \n █▀▀ ▀▄ ▄█ \n █▀▀█▀▀▀▀▀▀▀█▄▀ \n █ █ █ █ █▀▄\n ▀▄█▄▄▄▄█▄▄███"], ["happy", " ▄▀▀█▄▄▄▀▀█ \n ▄▀ ▀▄ \n █▄▀▄ ▄▀▄ █ \n ██▄▀▀▀▄ ▄▀▀█\n █▄▄▄▄▄▄█▄▄▀ █\n █▀▄▀▄ ▄█ \n▄ ▀█ ▀█▄▀\n ▀▄▄▄▄▄▄▄▄▄█"], ["injured_1", " ▄▄▄ ▄▄▄ \n ▄▀ ▀▀▀▀ ▄▀ \n █ ▄ ▄ █ \n █▀█▄▄ ▀▀ █ \n █▀▀ ▀▄ ▄█ \n █▀▀█▀▀▀▀▀▀▀█▄▀ \n ▄▀ █ ▄▀ █▀▄\n █▄▄▀▄▄█▄▄▄█▄██"], ["injured_2", " \n ▄▀▀█▄▄▄▀▀█ \n ▄▀ ▀▄ \n █▄█ █▄ █ \n▄█▄▀▀▀▄ █▄ \n█▄▄▄▄▄▄█▄▄▄▀▀▄▀ \n▄ ▄▀ █ ▄▀ █▀▄\n █▄▄▀▄▄█▄▄▄█▄██"], ["sleep_1", " \n ▄▀▀█▄▄▄▀▀█ \n ▄▀ ▀▄ \n █▄▄ ▄▄▄ █ \n▄█▄▀▀▀▄ █▄ \n█▄▄▄▄▄▄█▄▄▄█▀▄▀ \n█ █ █ █ █▀▄\n ▀▄█▄▄▄▄█▄▄███"], ["sleep_2", " ▄▄▄ ▄▄▄ \n ▄▀ ▀▀▀▀ ▄▀ \n █ █ \n █▀█▄▄ ▀▀▀ █ \n█▀▀ ▀▄ ▄█▄ \n█▀▀▀█▀█▀▀█▀ ▀▄▀ \n █ █ █ █▀▄\n▄ ▀▄█▄▄▄▄█▄▄███"], ["walk_1", " ▄▀▀█▄▄▄▀▀█ \n ▄▀ ▀▄ \n █ █ █ █ \n ▄█▄▀▀▀▄ █ \n █▄▄▄▄▄▄█▄▄▄█▀▄ \n █ ▄▀▄ ▄ ▀█▄ \n █ █ █ █▄▀\n ▀▄█▄▄▄▄█▄▄█▄█"], ["walk_2", " ▄▄▄ ▄▄▄ \n ▄▀ ▀▀▀▀ ▄▀ \n █ ▄ ▄ █ \n █ █▄▄ ▀ █ \n █▀▀ ▀▄ ▄█ \n █▀▀█▀▀▀▀▀▀▀█▄▀ \n ▀ █ █ █ █▀▄\n ▀▄█▄▄▄▄█▄▄███"]]], + ["hookmon", [["angry", " ▄▄▄▄▄ \n ▄ █▀▄▄███ ▄ \n ▀██▄▄█▀███▀ \n ▀██▄▄█▀▄ \n ▄█▄▄▄▄██▄ ▄\n▄▀▀▀█▄██▄██▀▀▀██\n▀▀ ▄▀▄▀▀▄█▀█▄▄█ \n █▄▄█████▄▄█▀ "], ["attack", " ▄█▀▀██▄ \n ▄█ ██▀███▄█ \n ████▄▄███▀ \n ▄ ▀█▀▀▀██ \n ██▄▄███▀ █ \n ███▄▄██ ▄▄▀ \n █▀ ▄▀██▀▀█ \n █▄▄█ ▀▄▄█ "], ["eat_1", " ▄█▀▀██▄ \n █▄█ ▀████▄█ \n ▀███▀ ██▀ \n ▄▀▀▀▀█▄▀ \n ███▄▄████▄ \n▄▀▀ █▀██▀██ ▀▄▄\n▀▀ █▀▄▄▀█ ▀▄█▀ \n █▄▄█▀▄▄█ ▀ "], ["eat_2", " ▄█▀▀██▄ \n █▄█ ▀████▄█ \n ▀███▀▄▀█▀ \n ▄▀▀▀▀██▀ \n ██▀██▀███▄ \n▄▀▀ █▀██▀██ ▀▄▄\n▀▀ █▀▄▄▀█ ▀▄█▀ \n █▄▄█▀▄▄█ ▀ "], ["happy", " ▄█▀▀██▄ \n █▄█ ▀████▄█ \n ▀███▀▄▀█▀ \n ▄▀▀▀▀██▀ \n ▄▄███▄▄███▀▄▄ \n█▄ █▀██▀██▄ ▄█▀\n █▀▄▄▀█ ▀█▄ \n █▄▄█▀▄▄█ "], ["injured_1", " \n \n ▄█▀▀██▄ \n █▄█ █████▄█ \n ▀███ ▀██▀ \n ▄▀█▀▀▀▀██▀▄▄ ▄\n █ ▄▀█▀▀██▀▄ ▀█\n █▄█████▄█▀▄█ "], ["injured_2", " \n \n ▄▄▄▄▄ \n ▄ █▀▄▄███ ▄ \n ▀██▄█▀████▀ \n ▄███▄▄█▀▄▄ \n▄▀▄█▄▄▄▄██▄ ▀▀▄█\n▀ █▄▄█████▄█▄█▀ "], ["sleep_1", " \n \n ▄▄▄▄▄ \n ▄ █▀▄▄███ ▄ \n ▀██▄▄█████▀ \n ▄▄███▄▄██▄▄ ▄\n█▀ ▄▀▄▄▄▄█▀▄ ▀▀█\n ▀ █▄█████▄█▀▄▄█"], ["sleep_2", " \n \n ▄█▀▀██▄ \n █▄█ ▀████▄█ \n ▀███▀▀██▀ \n▄▄▀▀█▀▀▀▀██▀▀▄▄█\n▀▄ ▄▀█▀▀██▀▄▄ █\n █▄█████▄▄█▀▀█"], ["walk_1", " ▄█▀▀██▄ \n █▄█ ▀████▄█ \n ▀███▀ ██▀ \n ▄▀▀▀▀█▄▀ \n ██▀██▀███▄ \n▄▀▀ █▀██▀██ ▀▄▄\n▀▀ █▀▄▄▀█ ▀▄█▀ \n █▄▄█▀▄▄█ ▀ "], ["walk_2", " ▄▄▄▄▄ \n ▄ █▀▄▄███ ▄ \n ▀██▄▄█▀███▀ \n ▀██▄▄█▀▄ \n ▄█▄▄▄▄██▄ \n ▄▄▀█▄██▄██▀▀▄ \n█▄ ▄▀▄▀▀▄█▀▄ ▄█▀\n █▄▄█████▄▄█▀ "]]], + ["hopmon", [["angry", " ▄▄ \n ▄▀ █ \n █▀▄▀ ▀▄ \n █▀█ ▄ █▄▀█ \n ▄██▄ ▄█ ▀ ▀▄ \n ▀█ ███ █▀ \n █ ███ █ \n ▀▄▄▄▄▄▄▄▀ "], ["attack", " \n \n █▀▄ \n ▄█ ▄▀▄ \n ▄▄▄▀ ▀ ▀▄ ▄▄ \n ▀▄█▄ ▀ ▄▄ █▀▄▀ \n █ ▀ ▀ ▄▀ \n ▀▄▄███▄▄▄▄▀ "], ["eat_1", " \n \n █▀▄ \n ▄█ ▄▀▄ \n ▄▄▄▀ ▀ ▀▄ ▄▄ \n ▀▄█ ▀ ▄ █▀▄▀ \n █▀ ▀ ▀ ▀ ▄▀ \n ▀▄▄███▄▄▄▄▀ "], ["eat_2", " ▄▄ \n ▄▀ █ \n █▀▄▀ ▀▄ \n █▀█ ▄ █▄▀█ \n ▄█▀█ █▀ ▀ ▀▄ \n ▀█ ▄▄▄▄▄ █▀ \n █ █████ █ \n ▀▄▄▄▄▄▄▄▀ "], ["happy", " ▄▄ \n ▄▀ █ \n █▀▄▀ ▀▄ \n █▀█ ▄ █▄▀█ \n ▄█▀▄ ▄▀▄ ▀ ▀▄ \n ▀█ ▄▄▄▄▄ █▀ \n █ ▀███▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["injured_1", " \n \n ▄▄ \n ▄▀ █ \n █▀▄▀ ▀▄ \n █▀▀ ▄ █▀▀█ \n ▄▀▄█ █▄ ▀▄ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n \n █▀▄ \n ▄█ ▄▀▄ \n ▄▄▄▀ ▀ ▀▄▄▄▄ \n ▀▄ ▄ ▀ ▄ ▄▀ \n █▄██▄▄▄██▄▄▄▄█ "], ["refuse", " \n \n █▀▄ \n ▄█ ▄▀▄ \n ▄▄▄▀ ▀ ▀▄ ▄▄ \n ▀▄█ ▀ ▄ █▀▄▀ \n █ ▀▀ ▀▀ ▄▀ \n ▀▄▄███▄▄▄▄▀ "], ["sleep_1", " \n \n █▀▄ \n ▄█ ▄▀▄ \n ▄▄▄▀ ▀ ▀▄ ▄▄ \n ▀▄▀ ▀ █▀▄▀ \n █ ▀▀ ▀▀ ▄▀ \n ▀▄▄███▄▄▄▄▀ "], ["sleep_2", " \n \n ▄▄ \n ▄▀ █ \n █▀▄▀ ▀▄ \n █▀█ ▄ █▄▀█ \n ▄▀▄▄ ▄▄ ▀ ▀▄ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ "], ["walk_1", " \n ▄▄ \n ▄▀ █ \n █▀▄▀ ▀▄ \n █▀█ ▄ █▄▀█ \n ▄█ █ █ ▀ ▀▄ \n ▀█ ▄▄▄ █▀ \n ▀▄▄▄▄▄▄▄▀ "], ["walk_2", " \n \n █▀▄ \n ▄█ ▄▀▄ \n ▄▄▄▀ ▀ ▀▄ ▄▄ \n ▀▄█▄ ▀ ▄▄ █▀▄▀ \n █ ▀ ▀ ▄▀ \n ▀▄▄███▄▄▄▄▀ "]]], + ["huckmon", [["angry", " ▄▄▄ ▄▄███\n▄██ ▄▄▀ ▄▄█████▄\n███▀ ▄ ▀████████\n█ ▀ ▄█████████\n▀▄▀▀▀▀▄████████▄\n ▀▀████▄▄▀ ▄▀█▄\n ▄▄▀▀██ █▄▄█▀▀█\n█▄█▄█▄█▄▀ █▄█▄▀"], ["attack", " ▄██ ▄▀▀▀▄▄▄███\n███▄▀▀ ▄███████▄\n█ ▄█▀ ▄███████▀\n█▄█▄▄█▀▄███████▄\n ▀███▀▄████████▄\n ▀▄▄████▀█▀█▀██\n ▄▄▀▀█▀ █▀ ▄█▀▀█\n█▄██▄█▄▀▀▀▀█▄█▄▀"], ["eat_1", " ▄▄ ▄▀▀▀▄▄▄███\n███▄▀▀ ▄██████▄\n█▀▀▄█▀ ▀████████\n▀▄▄▄▄▄▀█████████\n ████ ████████▄\n ▀▄▄▄▄██▄▄▀ ▄▀█▄\n ▄▄▀▀██ █▄▄█▀▀█\n█▄█▄█▄█▄▀ █▄█▄▀"], ["eat_2", " ▄▄▄ ▄▄\n▄██ ▄▄▀ ▄▄█▄███▀\n███▀▄ ▀▀██████▄\n█ ▀ ▀ ▄████████\n▀▄▀▀▀▀▄▄███████▄\n ▀▀████▄▄▀ ▄▀█▄\n ▄▄▀▀▄█▀ █▄▄█▀▀█\n█▄█▄█▄█▄▄▀ █▄█▄▀"], ["happy", " ▄▄███\n ▄▄ ▄▀▀▀█████▄\n███▄▀▀ ▄████████\n█▀▀▄▀▄ ▄██████▀\n█▄▄▄▄▄ ▀███████▀\n ▄▀▀▀▀▄█▄▄▀ ▀██\n ▄█▀██ ▄▀ ▄█▀▀█\n█▄██▄█▄▀▀▀▀ █▄██"], ["injured_1", " \n \n ▄▄ ▄▄▀▀▄ ▄▄██\n███▄▀▀ ▄████████\n█▀▀ █▄ ▄███████▀\n█ ▄▄▄▄▀█████████\n █▄▄▄▄██▀█▀ █▀▀█\n█▄█▄█▄█▄█▄▄█▄█▄▀"], ["injured_2", " \n \n ▄▄ ▄▄\n▄██ ▄▄▀▀▄▄█▄████\n███▀▄ ▀████████\n█ ▀▀▄████████▄\n█▄▀▀▀▀▄████▀████\n█▄██████▄█▄▄█▄▄▀"], ["sleep_1", " \n \n ▄▄ ▄▄▀▀▄ ▄▄██\n███▄▀▀ ▄████████\n█▀▀ ▄▄ ▄███████▀\n█ ▄▄▄▄▀█████████\n █▄▄▄▄██▀█▀ █▀▀█\n█▄█▄█▄█▄█▄▄█▄█▄▀"], ["sleep_2", " \n ▄▄ ▄▄███\n▄██ ▄▄▀▀ ▄█████▄\n███▀ ████████\n█ ▀▀▄█████████\n▀▄▀▀▀▀ ████▀▀██ \n ▄██▄██▀▀█▄▄▀▀█ \n█▄█▄█▄█▄▀██▄█▄█ "], ["walk_1", " ▄▄▄ ▄▄███\n▄██ ▄▄▀ ▄▄█████▄\n███▀▄▄ ▀████████\n█ ▀▀ ▄█████████\n▀▄▀▀▀▀▄████████▄\n ▀▀████▄▄▀ ▄▀█▄\n ▄▄▀▀██ █▄▄█▀▀█\n█▄█▄█▄█▄▀ █▄█▄▀"], ["walk_2", " ▄▄██ \n ▄▄ ▄▀▀▀█████▄\n███▄▀▀ ▄████████\n█▀▀▄█▀ ▄████████\n█ ▄▄▄▄▀████████▄\n ▀▄▄▄▄██▄▄▀ ▀██\n ▄▄▀██ ▄▀ ▄█▀▀█\n█▄██▄█▄▀▀▀▀ █▄██"]]], + ["hudiemon", [["angry", " ▄▀▀▀▀▀▄▀▀█ ▄\n ▄▀▄ ▄▀▀█▄▄▀ ▄▀█\n ▀▄▄█▄▄▄▀ █▄▀ █\n ▀▄▄▄ ▀█▀▀▄ ▄▀ \n ▄████ █ ▄▀ █ \n █ █▄▄▄█▄█▀▄ █\n ▀█ ▄ ▀█ ▀▄▄█\n █▄▄█▀▄▄█ "], ["attack", " ▄▄▄▄▄ ▄▄▄ \n ▄▀ ▄▄▄▀ ▄▀ ▄\n █ ▀▄▀ █▀█ ▄▀█\n █▀▀▀▀▀▄ █▄▀ █\n █ ▀▀ ▄▀▀█ ▄▀ \n ▄▀▀▀▀ ▄▀▄ █ \n █▄█▀▀▀▀█ █ █\n ██▄▄█▄▄▄██ ▀▄█▀"], ["eat_1", " ▄▄▄▄▄ ▄▄▄ \n ▄▀ ▄ ▄▀ ▄▀ ▄\n █ ▀ ▀ ▀█▀█ ▄▀█\n █▀▀▀▀▀▄ █▄▀ █\n █ ▀▀ ▄▀▀█ ▄▀ \n ▄▀▀▀▀ ▄▀▄ █ \n █▄█▀▀▀▀█ █ █\n ██▄▄█▄▄▄██ ▀▄█▀"], ["eat_2", " ▄▀▀▀▀▀▄▀▀█ \n ▄▀▄ ▄▀▀█▄▄▀ ▄█\n ▀▄▄█▄▄▄▀ █ ▄▀ █\n ▀▄▄▄ █▄█▀ ▄▀\n ███▄▀ ▄▀ ▀▄ \n ▄▀▄▄▄▄▄█ ▀▄ ▀▄\n ▀▄█ ▄ ▀█▄▄▀▄ ▄█\n █▄▄█▀▄▄█ ▀▀ "], ["happy", " ▄▀▀▀▀▀▄▀▀█ ▄\n ▄▀▄ ▄▀▀█▄▄▀ ▄▀█\n ▀▄▄█▄▄▄▀ █▄▀ █\n ▀▄▄▄▄ █▀▀▄ ▄▀ \n ███▀ █ ▄▀ █ \n ▄▀▄▄▄▄█▄█▀▄ █\n ▀▄█ ▄ ▀█ ▀▄▄▀\n █▄▄█▀▄▄█ "], ["injured_1", " \n ▄▀▀▀▀▀▄▀▀█ \n ▄▀▄█ █▄█▄▄▀ ▄█\n ▀▄▄▄▄▄▄▀ █ ▄▀ █\n █ ▄▄ █▄█▀ ▄▀\n ▄▀▄▄▄▄▀ ▄▀ ▀▄ \n▄▀█▄▄▄▄▄█ ▀▄ ▀▄\n█▄█▄▄█▄▄█▄▄▀▄▄▀ "], ["injured_2", " \n ▄▄▄▄▄ ▄▄▄ \n ▄▀ ▄▀ ▄▀ ▄█ \n█ ▄█ █▄█▀█ ▄▀ █ \n █▄▄▄▄▄▄ █▀ █ \n █ ▄▄ █▀█ ▄█ \n▄▀█▄▄▄█▄█ ▀▄ ▀▄\n█▄█▄▄█▄▄█▄▄▀▄▄▀ "], ["refuse", " ▄▄▄▄▄ ▄▄▄ \n ▄▀ ▄ ▄▀ ▄▀ ▄\n █▀▀ ▀▀ █▀█ ▄▀█\n █▀▀▀▀▀▄ █▄▀ █\n █ ▀▀ ▄▀▀█ ▄▀ \n ▄▀▀▀▀ ▄▀▄ █ \n █▄█▀▀▀▀█ █ █\n ██▄▄█▄▄▄██ ▀▄█▀"], ["sleep_1", " ▄▄▄▄▄ ▄▄▄ \n ▄▀ ▄▀ ▄▀ ▄\n █▀▀ ▀▀█▀█ ▄▄▀█\n █▀▀▀▀▀▄ █▀ █\n █ ▀▀ ▄▀▀█ ▄▀ \n █ █▀▀▀ ▄▀▄▄ █ \n█▀█▄▄▄▄▄▀█ █ ▄▀\n█▄▄█▄█▄▄▄██▀▄▀ "], ["sleep_2", " \n ▄▀▀▀▀▀▄▀▀█ \n ▄█▄ ▄▄█▄▄▀ ▄█\n ▀▄▄▄▄▄▄▀ █ ▄▀ █\n █ ▄▄ █▄█▀ ▄▀\n ▄▀▄▄▄▄▀ ▄▀ ▀▄ \n█▀█▄▄▄▄▄▀█▀▄ ▀▄\n█▄▄█▄█▄▄▄█▄▀▄▄▀ "], ["walk_1", " ▄▀▀▀▀▀▄▀▀█ \n ▄▀▄ ▄▀▀█▄▄▀ ▄█\n ▀▄▄█▄▄▄▀ █ ▄▀ █\n █ ▄▄ █▄█▀ ▄▀\n ▀▄▄▄▄▀ ▄▀ ▀▄ \n ▄▀▄▄▄▄▄█ ▀▄ ▀▄\n ▀▄█ ▄ ▀█▄▄▀▄ ▄█\n █▄▄█▀▄▄█ ▀▀ "], ["walk_2", " ▄▄▄▄▄ ▄▄▄ \n ▄▀ ▄▄▄▀ ▄▀ ▄\n █ ▀▄▀ █▀█ ▄▀█\n █▀▀▀▀▀▄ █▄▀ █\n █ ▀▀ ▄▀▀█ ▄▀ \n ▄▀▀▀▀ ▄▀▄ █ \n █▄█▀▀▀▀█ █ █\n ██▄▄█▄▄▄██ ▀▄█▀"]]], + ["hyogamon", [["angry", " \n █▀▄▀██▀▀▄ \n ██▀▄▀▀ ▀▀▀█ \n ██ ▄█ ▀███ \n ▄▀█▄▄▄▄▄ █▄█ \n█ ▄█▄▄▄▄▄█▄▀ █ \n█ █▄▄▄ █ █ █▄\n ▀█▄▄▄▄█▀▄▄▄▄█▄█"], ["attack", " ▄▄▄████▀▄ \n ▄▄█▄▄▄▄▄ █▄█▄ ▄\n ▀█ █▄█ ██ █▄█▀█\n█▄▀███████ █ ▀█\n▀▄▄▀█▀█▀██ █ █\n█ █▀▀▀▀▀▀ ▄█▀▀ █\n█▀ ▀█▀█▀▀▀ █▄▄█▄\n▀▄▄█▄▄▄█▀▀▀▄▄▄▄█"], ["eat_1", " █▀▄▀██▀█▄ \n ██▀▄▀▀▄▄▀▀▀█ \n █ ▀ ▀▄██▄█ \n█▄▀███████ ██▄█ \n▀▄██▀▀▀▀██ █ █\n█▄▀ ▄▀▀ ▄█▀▀ █\n██▄▄█▀█▀▀▀ █▄▄█▄\n▀▄▄█▄▄▄█▀▀▀▄▄▄▄█"], ["eat_2", " \n █▀▄▀██▀▀▄ \n ██▀▄▀▀▄▄▀▀▀█ \n ▄▄██ ▀ ▀ ███ \n█ ▄█▄▄▄▄▄▄▀ █▄█ \n█ ▀▄▄▄▄▄▄▄▀ █ \n ▀▀█▄▄▄ █ █ █▄\n █▄▄▄▄█▀▄▄▄▄█▄█"], ["happy", " █▀▄▀██▀█▄ \n ██▀▄▀▀▄▄▀▀▀█ \n █ ▀ ▀▄██▄█ \n█▄▀███████ ██▄█ \n▀▄█▀█▀█▀██ █ █\n█ █▀▀▀▀▀▀ ▄█▀▀ █\n█▀ ▀█▀█▀▀▀ █▄▄█▄\n▀▄▄█▄▄▄█▀▀▀▄▄▄▄█"], ["injured_1", " \n █▀▄▀██▀▀▄ \n ██▀▄█▀▀▀▄▀▀█ \n ▄▄█ █ ▄ ▀█▄█ \n ▀▄█▀ ▀▀ █▄█ \n▄█▄█▀▀▀▀▀▀ ▄▀▄█▄\n█ ▀ █▀▀▀▀█▀▀█ █\n█▄▄▄█▄▄▄█▄▄▄▄▄▄█"], ["injured_2", " \n █▀▄▀██▀▀▄ \n ██▀▄█▀▀▀▄▀▀█ \n █ █ ▄ ▀█▄█ \n █▀ ▀▀ █▄█ \n▄███▀▀▀▀▀ ▄▀▄██▄\n█ ▀ █▀▀▀▀█▀▀█ █\n█▄▄▄█▄▄▄█▄▄▄▄▄▄█"], ["sleep_1", " \n █▀▄▀██▀▀▄ \n ██▀▄█▀▀▀▄▀▀█ \n ▄▄█ █ ▀█▄█ \n ▀▄█▀ ▀▀ █▄█ \n▄█▄█▀▀▀▀▀▀ ▄▀▄█▄\n█ ▀ █▀▀▀▀█▀▀█ █\n█▄▄▄█▄▄▄█▄▄▄▄▄▄█"], ["sleep_2", " \n █▀▄▀██▀▀▄ \n ██▀▄▀▀▀▀▄▀▀█ \n ▄▄█▄ ▄▄ ▄▀█▄█ \n ▀▄▀▄▄▄▄▄▀█ █▄█ \n▄█▄█▀▀▀▀▀▀ ▄▀▄█▄\n█ ▀ █▀▀▀▀█▀▀█ █\n█▄▄▄█▄▄▄█▄▄▄▄▄▄█"], ["walk_1", " █▀▄▀██▀█▄ \n ██▀▄▀▀▄ ▀▀▀█ \n ██ █▀ ▄▀██▄█ \n█▄▀▄▄▄▄█▀█ ██▄█ \n▀▄█▀█▀█▀██ █ █\n█ █▀▀▀▀▀▀ ▄█▀▀ █\n█▀ ▀█▀█▀▀▀ █▄▄█▄\n▀▄▄█▄▄▄█▀▀▀▄▄▄▄█"], ["walk_2", " \n █▀▄▀██▀▀▄ \n ██▀▄▀▀▄ ▀▀▀█ \n ▄▄██ █▀ ▄▀███ \n█ ▄█▄▄▄▄▄▄▀ █▄█ \n█ ▀▄▄▄▄▄▄▄▀ █ \n ▀▀█▄▄▄ █ █ █▄\n █▄▄▄▄█▀▄▄▄▄█▄█"]]], + ["ikkakumon", [["angry", "█▀▀▄▄ \n ▀▄ █▀▀▀▄ \n ▄▀▀▀ ▄▄ █ \n▄▀▀ ▀▀ █ \n█▄▄█▄▄▄ █ ▄▄▄\n█ █ █ █ ▀█ █\n █ ▀ █ ▄▀\n█▄▄█▄▄█▄▄▄█▄▄▀ "], ["attack", "█▀▀▄▄ \n ▀▄ █▀▀▀▄ \n █ ▀▀ ▄▄ █ \n█ ▄ ▀▀ █ \n▀█▀███▀▄ █ \n ▀▄███▄█ ▀▄▀▀█\n ▄▀▀▀▀▀▄▄ ▀▄ ▄▀\n█▄█▀▄▄█▄▄▄▄█▄▀ "], ["eat_1", " █▀▀▄▄ \n ▀▄ █▀▀▀▄ \n █ ▀▀ ▄▀▄ ▀▄ \n █ ▄ ▄ █ \n ▄▀█████▀█ █ \n ▀▄▀█▀▀█▄▀ ▀▄▀█\n ▄█ ▀ █▀ █▄ █\n█▄▄███▄▄█▄▄▄▄█▄▀"], ["eat_2", " █▀▀▄▄ \n ▀▄ █▀▀▄ \n ▄▀ ▀▀ █ \n █▀▄ ▄▀▄ █ \n█ ▄ █ \n █▀█▀▀█▀▄ █ \n █▄▀ ▀▄▀ █ ▀▀▄\n█▄▄▀▄▄▄█▄▄▄█▄▄▄█"], ["happy", " █▀▀▄▄ \n ▀▄ █▀▀▀▄ \n █ ▀▀ ▄ ▀▄ \n █ ▄ ▀ ▀ ▄ █ \n ▄▀█████▀█ █ \n ▀▄█████▄▀ █▄▀█\n ▄█ ▀▀▀▀ █▄ █\n█▄▄█▄▄▄█▄▄▄▄█▄▄▀"], ["injured_1", " █▀▀▄▄ \n ▀▄ █▀▀▄ \n ▄▀ ▀▀ █ \n █▄▀ ▀▄ █ \n█ ▄ █ \n █▀█▀▀▀█▀▄ █ \n▄▀▄▀ ▀▄▀ ▀▀▄\n█▄▄█▄▄▄█▄▄▄█▄▄▄█"], ["injured_2", " ▄▄▄ \n ▀▄ ▀▀▄▄▄ \n ▄▀▄▄▀ ▀▄ \n █ ▄ ▄ ▀▄ \n▄▀▀▀ ▀▀ █ \n▀▄▄▄█▄▄▄▄ ▀▄ \n▄▀▄█▀▀▀█▄▀ ▀▀▄\n█▄▄▄███▄▄▄▄█▄▄▄█"], ["sleep_1", " ▄▄▄ \n ▀▄ ▀▀▄▄▄ \n ▄▀▄▄▀ ▀▄ \n █ ▀▄ \n▄▀▀ ▀▀▀ █ \n▀▄▄▄█▄▄▄ █ \n▄▀▄█ █▄▀ ▀▀▄\n█▄▄▄██▄▄▄▄█▄▄▄▄█"], ["sleep_2", " █▀▀▄▄ \n ▀▄ █▀▀▄ \n ▄▀ ▀▀ ▀▄ \n █▄ ▄▄▄ █ \n█ ▄ █ \n █▀█▀▀█▀▄ ▀▄ \n▄▀▄█ █▄▀ ▄ ▀▀▄\n█▄▄▄██▄▄▄▄█▄▄▄▄█"], ["walk_1", " █▀▀▄▄ \n ▀▄ █▀▀▄ \n ▄▀ ▀▀ █ \n █▄ ▄█ █ \n█ ▄ █ \n █▀█▀▀█▀▄ █ \n █▄▀ ▀▄▀ █ ▀▀▄\n█▄▄▀▄▄▄█▄▄▄█▄▄▄█"], ["walk_2", " ▄▄▄ \n ▀▄ ▀▀▄▄▄ \n ▄▀▄▄▀ ▀▄ \n █ ▄ ▀▄ \n ▄▀▀ ▀▀ █ \n ▀▄▄▄█▄▄▄ ▀▄ \n ▄█ █ █ █ ▄ ▀▀▄\n█▄▄█▄▄▄▄█▄▄▄█▄▄█"]]], + ["imperialdramon_fighter_mode", [["angry", " \n █▀▄▄▄▄▄▄▀█ ▄ \n █▀▀ ▄█ ▀▄█▄██▄ \n █ ▀▀ ▄▀█▀▀▀██▄\n█ █▀▀▀▀▄▀▄▄▄▀▀██\n █ ▀█▀▀ █ █ ▄██\n ▄█▀▀██████▀▀▀▄▀\n █▄█▄▄█ █▄█▄█▄█"], ["attack", " █▀▄▄▄▄▄▄▀█ \n █▀▀ ▄█ ▀▄▀▄\n▄▄▄ █ ▀▀ ▄███\n█▄▄█▀█▀▀▄▄▀█ ██\n█████ ▀ █▄▄██\n ██▀▀▀▀▀ ▄▀██\n▄▄▀▀▀██████▀▀▀▄▀\n█▄█▄▄█▀ █▄█▄█▄█"], ["eat_1", " █▀▄▄▄▄▄ \n █▀▀ ▄▄ ▀█▀█▄ \n ███▄▄ ▄▀██████ \n█▄████▀▄█ ▄███\n█ █▄▄▄█ █▀▀████\n ▀▀█▄▄███▄ ▄█▀██\n▄█▀▀█████▀▀▀▄ █\n█▄█▄▄█ █▄█▄█▄█ "], ["eat_2", " ▄▄ ▄▄ \n █▄█▀▀▀▀█ █ █▄ \n █ ▄▀▄ ▄█▄████ \n▄▀▄▄▄▄▄▀▄▀▀▀▀███\n▀▄█▄▄▄▄▀▄▄▄▄▀███\n█ █ ▄█ █ ▄▀██\n▄█▀▀█████▀▀▀▄ █\n█▄█▄▄█▀█▄█▄█▄█ "], ["happy", " █▀▄▄▄▄▄▄▀█▄ \n █▀▀ ▄ ▀▄███▄ \n ▄█ ▀ ▀▄▀██▀▀█▄\n █▄█████ █ █▄▄██\n █ █▀▀▀▄▀▄▀ ▄██\n ▀▄█▀▀ ▄█▄▄▀ ▀█\n ▄█▀▀█████▀▀▀▄ ▀\n █▄█▄▄█ █▄█▄█▄█ "], ["injured_1", " ▄▄ ▄▄ \n █▄█▀▀▀▀█ █ █▄ \n █ ▀▄▄ ▄█▄████ \n▄▀▄▄▄▄▄▀▄▀▀▀▀███\n▀▄█▄▄▄▄▀▄▄▄▄████\n▄█▄█▄▄▄▄▄▀ █▀██\n█ ▄▀▀███▀▀▄▀▄ █\n █▄█▄▄█▀▄▄█▄▄█ "], ["injured_2", " \n █▀▄▄▄▄▄▄▀█ \n █▀▀▄ ▀▄▀ █▄ \n █ ▀▀▄▀█▄▄███ \n█ ████▀▄▀ ▄███\n▄██▄▄▄▀ █▀▀▀████\n█ ▄▀▀███▀▀▄▀▄▀██\n █▄█▄▄█▀▄▄█▄▄█ █"], ["sleep_1", " \n \n ▄▀█ ▄ \n▄▄ █ ▄█▄▀▀▀█ ██ \n█ █▀▀ ▀▄█▄████\n█▀ ▀▀▀ ▄█ ▄ ▀█\n██▀▀▀▀██▀▀▄▄▀ █\n█▄████▄▄▄█▄█▄█▄▀"], ["sleep_2", " \n ▄▄ \n ▄▀ █ ▄▄▄▄ ▄ \n█▀▄█▄▀▀▀▄ ▄▀▄██ \n█▄▀ ▄▄▄ ▀▄█████\n█▄▄▄▄▄▄▄▄█▀ ▄ ▀█\n▄▀▄ ▄▄█▀ ▄▄▀ █\n█▄▄██▄▄▄▄█▄█▄█▄▀"], ["walk_1", " █▀▄▄▄▄▄▄▀█ ▄ \n █▀▀ ▄▄ ▀▄▀▄██▄ \n █ ▀▀ ▄▀██████▄\n█ █▀▀▀▀▄▀ ▄███\n ██▀▀▀▀██▀▀▀████\n█ █▄▄█ █ ▄▀ ▀█\n▄█▀▀█████▀▀▀▄ ▀\n█▄█▄▄█ █▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄ \n █▄█▀▀▀▀█ █ █▄ \n █ ▄█▀ ▄█▄████ \n▄▀▄▄▄▄▄▀▄▀▀▀▀███\n▀▄█▄▄▄▄█▄▄▄▄████\n▄▀▀▄ ▄▀▀▄ █▀██\n▀▄▄████▄▄█▄▀▀▄ █\n█▄█▄▄█ █▄█▄█▄█ "]]], + ["imperialdramon_paladin_mode", [["angry", " \n █▀▄▄▄▄▄▄▀█ ▄▄ \n █▀▀ ▄█ ▀▄▀▄▀ ▀▄\n▄█ ▀▀ ▄▀█▀▀▀█ █\n█ █▀▀▀▀▄▀▄▄▄▀█ █\n █▀▀█▀▀ █ █▄▀ █\n ▀▄▀▀▄▄▄▄▀▀▀▄▀▄█\n █▄█▄▄██▄█▄█▄█ ▀"], ["attack", " ▄▄ ▄▄ \n █▄█▀▀█▀█ █ ▄▀█\n▄▄█ ▄█▀ ▄█▄▀ █\n█ █▄▄▄▄▄▀▄▀▀▀█ █\n▀▄ ▀▄▄▄▄█▄▄▀█ █\n █▀▄ █ ▀ ▄█▀▄█\n ▀▄▀▀▀▄▄▀█▀▀▀▀▄ \n █▄█▄▄█▀▀█▄█▄█▄█"], ["eat_1", " █▀▄▄▄▄▄ \n █▀▀ ▄▄ ▀█▀▄▀█ \n▄███▄▄ ▄▀█▀▀▀ ▀▄\n█▄████▀▄█▀▀▀▀█ █\n█ █▄▄▄█ █▄▄█ █\n ▀██ ▀▀▄▄▄▀ █\n ▄▀ ▀▄▄██▀▀ ▀▄▀█\n█▄█▄▄█ █▄█▄█▄█ "], ["eat_2", " ▄▄ ▄▄ \n █▄█▀▀▀▀█ █ ▄▀█ \n █ ▄▀▄ ▄█▄▀ ▀▄\n█▀▄▄▄▄▄▀▄▀▀▀▀█ █\n█▄█▄▄▄▄▀▀▄▄▄▀▄ █\n█ ██ █ █ █ █\n █▀ ▀▄▄██▀▀ ▀▄▀█\n█▄█▄▄█ █▄█▄█▄█ "], ["happy", " █▀▄▄▄▄▄▄▀█ ▄▄ \n █▀▀ ▄ ▀▄█▀ ▀▄ \n▄█ ▀ ▀▄▀█▄▀▀▄▀▄\n█▄█████ █ █▄▄█ █\n█ █▀▀▀▄▀█▀ ▄▀ █\n ▀▄█▀▀ ▀▄█▀ █\n ▄▀ ▀▄▄▄█▀▀ ▀▄▀ \n█▄█▄▄█ █▄█▄█▄█ "], ["injured_1", " ▄▄ ▄▄ \n █▄█▀▀▀▀█ █ ▄▀█ \n █ ▀▄▄ ▄█▄▀ ▀▄\n█▀▄▄▄▄▄▀▄▀▀▀▀█ █\n▀▄█▄▄▄▄▀▀▄▄▄█ █\n▄█▄█ ▄▀ █▄ █\n█ ▄▀▀▄ ▄▀▀▄▀▄ ▀█\n █▄█▄█▀▀▄▄█▄▄█ "], ["injured_2", " \n █▀▄▄▄▄▄▄▀█ ▄▄ \n █▀▀▄ ▀▄▀▄▀ █ \n▄█ ▀▀▄▀██▄▄▄ █\n█ ████▀▄█ ▄▀ █\n▄██▄▄▄▀ █▀▀█ █\n█ ▄▀▀▄ ▄▀▀▄▀▄▀▄█\n █▄█▄█▀▀▄▄█▄▄█ ▀"], ["sleep_1", " \n ▄▄ ▄▄ ▄▄ \n █▄█▀▀▀▀█ █▀ █ \n █ ▄▄▄ ▄█▄▄▄▄█\n █▀▄▄▄▄▄▀▄▀ ▄▀█\n▄█▄█▄▄▄▄█▀████▄█\n█▄▀█ █ ▀ ▀ █\n█▄▄▄█▄▄▄▄▄█▄▄▄█ "], ["sleep_2", " \n █▀▄▄▄▄▄▄▀█ ▄▄\n █▀▀ ▀▄▀▄▀ █\n ▄█ ▀▀▀▄▀█▀▀▀██\n █ █▀▀▀▀▄█▄▄▄█ █\n▄▄▀█▀▀▀▀▀ █▄▄█▄█\n█▄▀█ █ ▀ ▀ █\n█▄▄▄█▄▄▄▄▄█▄▄▄█ "], ["walk_1", " █▀▄▄▄▄▄▄▀█ ▄▄ \n █▀▀ ▄▄ ▀▄▀▄▀ █ \n▄█ ▀▀ ▄▀██▄▄▄ █\n█ █▀▀▀▀▄█ ▄▀ █\n▀▄▄█▀▀▀▄▄▀▀▀█ █\n █ █ █ █ ▄▀▀▄█\n ▄▀ ▀▄▄██▀▀ ▀▄ ▀\n█▄█▄▄█ █▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄ \n █▄█▀▀▀▀█ █ ▄▀█ \n █ ▄█▀ ▄█▄▀ ▀▄\n█▀▄▄▄▄▄▀▄▀▀▀▀█ █\n█ ▀▄▄▄▄▀▀▄▄▄█ █\n █▀█ ▄▀▀▄ █▄ █\n ▀▄▀▄▄█▄▄█▄▀▀▄▀█\n █▄█▄▄█ █▄█▄█▄█ "]]], + ["impmon", [["angry", " \n ▄██▄ ▄▄██▄ \n ▄▀█████████▀▀▄ \n █▄ ▀ ▄▄▀█ \n █▀▀ ▀▀ █▀▀█ \n ▄▄█▄▄▄▄██▄█▀ \n▄▀ ▄██▄▄███ ▀▄ \n ▀████▀▀▀████▀ "], ["attack", " ▄████▄ ▄▄███▄\n ▀█████████▀ \n ▄▄█▀ ▀ ▄▄▀█▄▄ \n █ █▀ ▀▀ █ █\n ▀▄██████ █▀▄▀ \n ▄ ▄█▄▄▄▄█▄▀ \n ████████████ \n ▀▀▀▀ ▀▀▀ "], ["eat_1", " ▄███▄▄▄████▄ \n ▀ ██▀█▀▀▀██ ▀ \n █▄ ▄▀▄ █▄▀█ \n █▄▄▄▄▄ █▄▀ \n ▄▀▀█▀▀▀▀ ▄█▀▀▄ \n ▀▄ ██▀▀███▀ ▄▀ \n ▀▀██████▀▀ \n ████▀████ "], ["eat_2", " ▄▄ ▄▄ \n ████▄▄▄█████ \n ▀ ██▀█▀▀▀██ ▀ \n █▄ ▄▀▄ █▄▄▄ \n ▀▄ ▄▄▀▄▄▀ \n ▄▀██▀▀███▀▄ \n █ ▄▀█████▄ █ \n ▀████▀████▀ "], ["happy", " ▄██▄ ▄▄██▄ \n ▄▀█████████▀▀▄ \n █▀ ▀ ▄ ▀█▄▄ \n ▄█▀ ▀ ▀▄█▄▀ \n █ █▄▄▄▄█ █ \n ▀▄▀▀█▄▄█▀▀▄▄▀ \n ▀█████▀██████▀ \n ▀▀▀ ▀▀▀ "], ["injured_1", " \n \n ▄██▄ ▄▄██▄ \n ▄▀█████████▀▀▄ \n █▀▄▀ ▄ ▀█ \n █▀▀ ▀▀ █▀▀█ \n ▄▀▀▄▄▄▄█▀▀█▀ \n █▄▄▄█████▄▄▄█ "], ["injured_2", " \n \n ▄██▄ ▄▄██▄ \n ▄▀█████████▀▀▄ \n ██▀█▀▀▀██ \n █ ▄ ▄ █▀▀█ \n ▄██▀ ▀▀▄▄██▀ \n █▄▄▄█████▄▄▄█ "], ["sleep_1", " \n ▄▄ ▄▄ \n ████▄▄▄█████ \n ▀ █████████ ▀ \n █▀ ▀ ▄▀█▄▄▄ \n ██▀ ▀▀▄▄█▄▄▀ \n █ ▀█▀▀██▀ █▄ \n ██▄▄█████▄▄█▄█ "], ["sleep_2", " \n ▄██▄ ▄▄██▄ \n ▄▀█████████▀▀▄ \n ██▀█▀▀▀██ \n █▄▄ ▄▄▀ █▀▀█ \n ▄█▄▄▄▄██▄▀▀ \n █ ▀█▄▄██▀ █▄ \n ██▄▄█████▄▄█▄█ "], ["walk_1", " ▄▄ ▄▄ \n ████▄▄▄█████ \n ▀ ██▀█▀▀▀██ ▀ \n █▄ ▄█▀ █▄▄▄ \n ▀▄ ▄▄▀▄▄▀ \n ▄▀██▀▀███▀▄ \n █ ▄▀█████▄ █ \n ▀████▀████▀ "], ["walk_2", " \n ▄██▄ ▄▄██▄ \n ▄▀█████████▀▀▄ \n █▀ ▀ ▄▄▀█ \n █▀ ▀▀ █▀▀█ \n ▄▄█▄▄▄▄██▄█▀ \n▄▀ ▄██▄▄███ ▀▄ \n ▀████▀▀▀████▀ "]]], + ["impmon_x", [["angry", " \n ▄██▄ ▄▄██▄ \n▄▀█████████▀▀▄ \n █▄▄▀ ▄▄▀█ \n █▀▀ ▀▀ █▄███▄\n ▄▄█▄▄▄▄████ ▀█\n█ ▄██▄▄███ ▀▄ \n ███▀ ▀▀████▀ "], ["attack", "▄████▄ ▄▄███▄ \n ▀█████████▀ \n ▄▄█▄▄▀ ▄ ▀█ \n█ █▀▀ ▀▀ ███▄ \n ▀▄█████▄ ██▄▀██\n ▄ ██▀▀▀▀▄█▀ ▀▄█\n █████▀█████▄▄▀ \n ▀▀▀▀ ▀▀▀ "], ["eat_1", " ▄███▄▄▄████▄ \n▀ █▀▀█▀▀▀██ ▀ \n ███ ▄▀▄ █▄▄▄ \n █▄▄▄▄▄ █████▄\n▄▀▀█▀▀▀▀ ▄██ ██\n▀▄ ██▀▀███▀ ▀▄ █\n ▀▀██▀██▀▀▄▄▀ \n ███▀ ▀███ "], ["eat_2", " ▄▄ ▄▄ \n ████▄▄▄█████ \n▀ █▀▀█▀▀▀██ ▀ \n ███ ▄▀▄ █ ▄▄ \n █▄ ▄██▀██▄\n ▄▀██▀▀███▀▄ ██\n█ ▄▀██▀██▄ █ ▀\n ▀███▀ ▀█▄█▀ "], ["happy", " ▄██▄ ▄▄██▄ \n▄▀█████████▀▀▄ \n █▄▄▀ ▄ ▀█ ▄▄▄ \n ▄█▀▀ ▀ ▀▄██▀▀██\n█ █▄▄▄▄█ █ █\n▀▄▀▀█▄▄█▀▀▄▄▀ \n▀█████ ██████▀ \n ▀▀▀ ▀▀▀ "], ["injured_1", " \n ▄▄ ▄▄ \n ████▄▄▄█████ \n▀ █████████ ▀ \n █▄▄▀ ▄ ▀█ \n █▀▀ ▀▀ ███▄ \n ▄▀▀▄▄▄▄█▀▀█ ▀█ \n█▄▄▄█████▄▄▄█ ▀█"], ["injured_2", " \n \n ▄██▄ ▄▄██▄ \n▄▀█████████▀▀▄ \n █▀▀█▀▀▀██ \n ███ ▄ █▄▄ \n ▄█▄ ▀▀▄▄██▀█▄ \n█▄▄▄█████▄▄▄█ █▄"], ["sleep_1", " \n ▄▄ ▄▄ \n ████▄▄▄█████ \n▀ █████████ ▀ \n █▄▄▀ ▄▀█ \n ██▀ ▀▀▄▄███▄ \n █ ▀█▀▀██▀ █▄▀█▄\n██▄▄█████▄▄█▄█ ▀"], ["sleep_2", " \n ▄██▄ ▄▄██▄ \n▄▀█████████▀▀▄ \n █▀▀█▀▀▀██ \n ███ ▄▄▀ █▄▄ \n ▄█▄▄▄▄███▀▀█▄ \n █ ▀█▄▄██▀ █▄ ▀█\n██▄▄█████▄▄█▄█ "], ["walk_1", " ▄▄ ▄▄ \n ████▄▄▄█████ \n▀ █▀▀█▀▀▀██ ▀ \n ███ ▄█▀ █ \n █▄ ▄████▄ \n ▄▀██▀▀███▀▄ ▀██\n█ ▄██▀██▄ █ █\n ▀█▄█▀ ▀█▄█▀ "], ["walk_2", " \n ▄██▄ ▄▄██▄ \n▄▀█████████▀▀▄ \n █▄▄▀ ▄▄▀█ \n █▀▀ ▀▀ █▄▄▄ \n ██▄▄▄▄▄███▀██▄\n▄▀ ▄██▄███ ▀▄▀█\n▀▄█▄█▀ ▀▀██▄▄▀ ▀"]]], + ["jagamon", [["angry", " ▄▀▀▄▀▀▄ \n ▀▀▄▀▀ \n ▄▀▀▀▀▄▄ ▀▄ \n █▀ ▄ ▄▀▀█ \n ▄▀▀ ▄▄▄▄ █ \n █ ▄▄▄▄▄ ▄ ▀ ▄ █\n ▄▀▀██▀▀█▄▄▄ ▄▄▀\n█▄████████▄▄█▄▄█"], ["attack", " ▄▀▀▄▀▀▄\n ▄▄█▀▀█▄▀▀▄▀▀ \n █▀ ▀ ▄ ▀▄ ▀▄ \n▄██▀▀█▄ ▀▀▄█ \n█▀█▀███▄▄▄ ▀ █\n ▀██ ▀ ▄ ▀█\n ▄ ▄ ▄██▄▄▄ ▄▄▀\n ▀████▀▀█▄▄█▀▄▄█"], ["eat_1", " ▄▀▀▄▀▀▄\n ▄▄▄▄▀▀▄▀▀ \n ▄▄▀▀▀█ ▄ ▀▄ ▀▄ \n █▄▄▄▄ ▄ ▀▀▄█ \n█▄██▄██ ▄▄ ▀ █\n▀ ██▄ ▀ ▄ ▀█\n ███▄▄ ▄▄▀\n ▀▄█▄██▀▀▄▄█▀▄▄█"], ["eat_2", " ▄▀▀▄▀▀▄\n ▄▄▄▄▀▀▄▀▀ \n ▄▄▀▀▀█ ▄ ▀▄ ▀▄ \n █▄ ▀ ▀▀▄█ \n█▀ ▀▀▀▀▄▄ ▀ █\n█ ▄▄▄▄▄ ▄ ▀ ▄ ▀█\n▀█▀██▀██▄▄▄ ▄▄▀\n ████████▄▄█▀▄▄█"], ["happy", " ▄▀▀▄▀▀▄\n ▄▀▀▀▄▄▄▀▀▄▀▀ \n ▄█▄▄▄ ▄ ▀▄ ▀▄ \n▄██▀▄▀█▄ ▀▀▄█ \n█▀█▀█▀██ █ ▀ █\n ██ ▀ ▀█\n ▄███▄▄ ▄▄▀\n ▀███▀▀▀█▄▄█▀▄▄█"], ["injured_1", " \n ▄▀▀▄▀▀▄ \n ▀▀ ▀▀▄ \n ▄▄▄▀▀▀▀▄ █ \n ▄█ ▀ █▄▀█ \n █ ▀▀▀▄ ▄ █\n ▄█▀██▀█▄▄ ▄▄ █\n █▄████▄██▄▄▄▄▄▀"], ["injured_2", " \n ▄▀▀▄ \n ▄▀▀▄▀▀▄ \n ▄▄▄▄ ▀▀ █ \n ▄█ ▀▀▀▄▄▄█ \n █ ▄ ▀▀▀▀▄ ▄▀▄\n ▀▄▄▄▄▄▄▄ ▄ █\n █▄▄██▄▄██▄▄█▄▄▀"], ["sleep_1", " ▄▄ ▄▄ \n ▀▄▄▀▄▄▀ \n ▀▄ \n ▄▄▄█▀▀▀▄ █ \n ▄█ ▀ ▄ ▀█ \n █ ▀ ▄ █ \n█▀▀ ▀▀▀▀▄▄ ▀█ \n▀▄▄▄▄▄▄▄▄▄▄▄█▀ "], ["sleep_2", " ▄▄ ▄▄ \n ▀▄▄▀▄▄▀\n ▄▄▄▄ ▀▄ \n ▄▀▀▀█ ▀▄▄█ \n █ ▄ ▀ ▀▄ \n▄█▀ ▄▄▄▄ ▀ ▄█ \n█ ▀▀▄ █ \n▀▄▄▄▄▄▄▄█▄▄▄█▀ "], ["walk_1", " ▄▀▀▄▀▀▄\n ▄▄▄▄▀▀▄▀▀ \n ▄▄▀▀▀█ ▄ ▀▄ ▀▄ \n █▄ ▀ ▀▀▄█ \n█▀ ▀▀▀▀▄▄ ▀ █\n█ ▀ ▄ ▀ ▄ ▀█\n▀▄█▀██▀█▄▄▄ ▄▄▀\n█▄███████▄▄█▀▄▄█"], ["walk_2", " ▄▄ ▄▄ \n ▀▄▄▀▄▄▀\n ▄▄▄█▀▀▀▄ ▀▄ \n █▀ ▄ ▀ ▀ █▄ █ \n▄█▀ ▄▄▄▄ ▄▀▀▄\n█ ▄ ▀▀▄ ▄█\n█▄ ▄▄▄▄ ▀▄▄ ▀ █\n █▄██▄██▄▄▄▄▄█▀"]]], + ["jagerloweemon", [["angry", " ▄▄▄▄▄ \n ▄▀ ▄▄▄██▀█ \n▄████▀███▀▀▄ ▄▄\n████▄▄██▀▀▀▄ █ █\n▀▄▄▄▄█▀▀▀▀████▄▀\n ▀▄ ███▄▄███▀▀█\n ▄▄▄█▀███████▄▄█\n█▄██▄████ █▄█▄█"], ["attack", " ▄▀▀▀▀█▄▄▄ \n ▄█▄▄█▀███▄▀ \n█████▄▄██▄▄▀█▀▄ \n█ ▀ ▀ ██▄▄▄█▄█ █\n█ ▄ ▄ █▄▄ ████▄\n ▀█▀▀████████ █\n ▄█▄█ ███▀▀████\n █▄██▄████ █▄█▄█"], ["eat_1", " ▄▀▀▀▀█▄▄▄ \n ▄█▄▄█▀███▄▀ \n█████▄█▄█▄▄▀█▀▄ \n█ ███▄▄▄█▄█ █\n █ ▄█▄▄ █████▄\n ▀█▀▀████████ █\n ▄█▄█ ███▀▀████\n █▄██▄████ █▄█▄█"], ["eat_2", " \n ▄▀▀▀▀█▄▄▄ \n ▄█▄▄█████▄▀ ▄▄\n████▀▄▀██▄▄█ █ █\n█▀▀▀▀███▄▄▄███▄▀\n ▀█▀▀█▄▄ ███▀▀█\n ▄▄██▀███████▄▄█\n█▄██▄████ █▄█▄█"], ["happy", " ▄▀▀▀▀█▄▄▄ \n ▄█▄▄█▀███▄▀ \n█████▄█▄█▄▄▀ ▄▀█\n▀▄ ▀███▄▄▄█▄█ █\n █ █▄▄ █████▄\n ▀█▀▀████████ █\n ▄█▄█ ███▀▀████\n █▄██▄████ █▄█▄█"], ["injured_1", " \n \n ▄▀▀▀▀█▄▄▄ \n ▄█▄▄█████▄▀ ▄▄\n█████ ▀██▄▄█ █ █\n█▀▀▀▀███▄▄▄███▄▀\n █████▄▄▄▄███▄▄█\n█▄██▄███████▄█▄█"], ["injured_2", " \n \n ▄▄▄▄▄ \n ▄▀ ▄▄▄██▀█ \n▄████▀███▀▀▄▄▀█ \n█████▄▄█▀▀▀██▄ █\n▀▄▄▄▄█▀▀▀▀███▀█▄\n█▄██▄███████▄█▄█"], ["sleep_1", " \n ▄▄▄▄▄ \n ▄▀ ▄▄▄██▀█ \n▄████████▀▀▄ ▄▀█\n████▄▄▄█▀▀▀█▄█ █\n▀▄▄▄▄█▀▀▀▀███▀▀▄\n ▄█▄▄███▄▄███▄▄█\n█▄██▄███████▄█▄█"], ["sleep_2", " \n ▄▀▀▀▀█▄▄▄ \n ▄█▄▄█████▄▀ ▄▄\n████▀▀▀██▄▄█ █ █\n█▀▀▀▀███▄▄▄███▄▀\n ▀█▀▀█▄▄ ███▀▀█\n ▄▄██▀███████▄▄█\n█▄██▄███████▄█▄█"], ["walk_1", " ▄▀▀▀▀█▄▄▄ \n ▄█▄▄█████▄▀ \n████▀ ▄██▄▄▀ ▄▀█\n█▀▀▀▀███▄▄▄█▄█ █\n ▀█▀▀█▄▄ █████▄\n ▀▄████████ █\n ▄▄██ ███▀▀████\n █▄██▄████ █▄█▄█"], ["walk_2", " ▄▄▄▄▄ \n ▄▀ ▄▄▄██▀█ \n▄████▀▀██▀▀▄ ▄▄\n████▄▄██▀▀▀▄ █ █\n▀▄▄▄▄█▀▀▀▀████▄▀\n ▀▄ ███▄▄███▀▀█\n ▄▄▄█▀███████▄▄█\n█▄██▄████ █▄█▄█"]]], + ["jazamon", [["angry", " \n ▄█▀▄▀▀█ \n ▄▀█ ▀▀█▄ \n █▀▀ ▄█ █▄ \n █ ▄▄▄ ▄ ▄▀ ▀█\n ▀▄▄▄▀▀█ ▀█▀\n █▄▀█ ▀▄▄██▀ \n █▄█▄█▀▀█▄█▄█ "], ["attack", " ▄█▀▄▀▀▀█ \n ▄▀█ ▀▀██▄ ▄▄\n █▀▀ ▄█ ▄▀ █\n █ ▄▄▄▄ █ ▀█\n ▀██▀▀█ █ ▀█ \n █▀▀▀▀▄█▄▄█ \n ▄▄▀███▀ ▀▄ \n █▄█▄█ █▄▄█▄█ "], ["eat_1", " ▄█▀▄▀▀█ \n ▄▀█ ▀▀█▄ ▄▄ \n █▀▀ ▄▀▄ ▄▀ █ \n █ ▄▄▄▄ █ ▀█ \n ▀████ █ ▀█ \n ▀▄▄▄▀▀▄▄█ \n ▄▄▀▄▄▄▀ ▀▄ \n █▄█▄█ █▄█▄█ "], ["eat_2", " ▄▄ ▄▄▄ \n ▄█▀ █▄▄▀ \n ▄█▄▀ ▄ ▀▀▄ \n █ ▀ ▀ ▄▀▀▄ \n ▀▄▀▀▀▄█▄▀ ▄▄█\n █▀█▄ █ ▄▄▄▀\n ▄▄▀█▀ ▄▀▀█▀ \n █▄█▄█▀▀█▄█▄█ "], ["happy", " ▄█▀▄▀▀█ \n ▄▀█ ▀▀█▄ ▄▄ \n █▀▀ ▄▀▄ ▄▀ █ \n █ ▄▄▄▄▄ ▄▀ ▀█ \n ▀████▀▄▀ ▀█ \n ▀▄▄▄▀▀▄▄█ \n ▄▄▀▄▄▄▀ ▀▄ \n █▄█▄█ █▄█▄█ "], ["injured_1", " \n ▄█▀▄▀▀█ \n ▄▀█ ▀▀█▄ \n █▀▀ █▄ █▀▀█\n █ ▄▄▄ ▄ ▄▀ ▄▄▀\n ▀▄▄▄▀▀█ ▄▄▀ \n ▄▀▀▄ █ ▄▀▀█▀▄ \n █▄▄▄█▄▄█▄▄▄▄█ "], ["injured_2", " \n ▄▄ ▄▄▄ \n ▄█▀ █▄▄▀ \n ▄█▄▀ ▄ ▀▀▄▄▄▄ \n █ ▀▀ ▄▀ █ \n ▀▄▀▀▀▄█▄▀ ▀█ \n ▄▀▀██ █ ▀█▀▄ \n █▄▄▄█▄▄████▄█ "], ["sleep_1", " \n ▄▄ ▄▄▄ \n ▄█▀ █▄▄▀ \n ▄█▄▀ ▀▀▄▄▄▄ \n █ ▀▀ ▄▀ █ \n ▀▄▀▀▀▄█▄▀ ▀█ \n ▄▀▀██ █ ▀█▀▄ \n █▄▄▄█▄▄████▄█ "], ["sleep_2", " \n ▄█▀▄▀▀█ \n ▄▀█ ▀▀█▄ \n █▀▀ ▄▄ █▀▀█\n █ ▄▄▄ ▄ ▄▀ ▄▄▀\n ▀▄▄▄▀▀█ ▄▄▀ \n ▄▀▀▄ █ ▄▀▀█▀▄ \n █▄▄▄█▄▄█▄▄▄▄█ "], ["walk_1", " ▄█▀▄▀▀█ \n ▄▀█ ▀▀█▄ \n █▀▀ ▄▀█▀ █▀▀█\n █ ▄▄▀▀▄ ▄▀ ▄▄▀\n ▀▄▄▄▀▀█ ▄▄▀ \n █ ██ ▀▄▄▄▀ \n ▄▄▀▄▄▄▀ ▀▄ \n █▄█▄█ █▄█▄█ "], ["walk_2", " ▄▄ ▄▄▄ \n ▄█▀ █▄▄▀ \n ▄█▄▀ ▄▄▄▀▀▄ \n █ █▄▀ ▄▀▀▀▄\n ▀▄▀▀ ▄█▄▀ ▄▄█\n █▀█▄ █ ▄▄▄▀ \n ▄▄▀█▀ ▄▀▀█ \n █▄█▄█▀▀█▄█▄█ "]]], + ["jazardmon", [["angry", " ▄▄ \n ▄▄████▄██ \n▄█ ▄██▀███▀█ \n█▀▀▀▀▄▄█▀ █▄▄ \n █▀▀▄▄▄ ▄ ▀▀▄ \n ▀▀▀▀█▄▄▀▀█▄ █ \n ▄██▄▄█▄▄██▀ \n █▄▄█▄▀▀▄▄█▄█ "], ["attack", " ▄▄██ ▄▄ \n ▄▀▀███████▄ \n██▄██▀ ██▀▄▀ \n▀▄▄▄▄▀▀▀ ▀▀▄▄ \n ▀████ ▄█▄ ▀▄\n ▄▀▀▀▄▀ ▄▀▀▀▄▄█\n ▀▀██▄██▄▄▄▄█ \n █▄▄█▄▀▀▄▄█▄█ "], ["eat_1", " ▄▄██ ▄▄ \n ▄▀▀███████▄ \n██▄██▀ ▄█▀▄▀ \n▀▄▄▄▄▀▀▀ ▀▀█▄ \n ███ ▄█▄ █ \n ▀▄▄██▀ ▄▀▀▄▄█ \n ▄█▄██▄▄▄▄█ \n █▄▄█▄▀▀▄▄█▄█ "], ["eat_2", " ▄▄ \n ▄▄████▄██ \n▄█ ▄██▀███▀█ \n█▀▀▀▀▄█▄▀ █▄▄ \n █▀▀▄▄▄ ▄ ▀▀▄ \n ▀▀▀▀█▄▄▀▀█▄ █ \n ▄██▄▄█▄▄██▀ \n █▄▄█▄▀▀▄▄█▄█ "], ["happy", " ▄▄ \n ▄▄████▄██ \n▄█ ▄██▀███▀█ \n█▀▀▀▀▄█▄▀ █▄ \n █▀▀▄▄▄ ▄ ▀▀▄ \n ▀▀▀▀█▄▄▀▀█▄▄ █\n ▄██▄▄█▄▄▄█▀▀\n █▄▄█▄▀▀▄▄█▄█ "], ["injured_1", " \n ▄▄██ ▄▄ \n ▄▀▀███████▄ \n██▄██▀▀██▀▄▀ \n▀▄▄▄ ▀▀▀ ▀▀▄ \n █▄▄██▀ ▄█ █ \n ▄▀▀█▀▀ ▀█ ▄▀ \n █▄▄▄▄█▀██▄██▄█ "], ["injured_2", " \n ▄▄ \n ▄▄████▄██ \n▄█ ▄██████▀█ \n█▀▀▀▀▄▄█▀ █▄ \n █▀▀▄▄▄ ▄ ▀▄ \n ▀█▀██▄▄▀█▄ █ \n █▄▄▄█▄▄▄▄█▄▄█▄█"], ["sleep_1", " \n ▄▄ \n ▄▄████▄██ \n▄█ ▄██████▀█ \n█▀▀▀▀▄▄█▀ █▄▄ \n █▀▀▄▄▄ ▄ ▀▀▄ \n ▀▀▀██▄▄▀▀█▄▄▄█ \n █▄█▄███▀█▄█▄█"], ["sleep_2", " \n ▄▄██ ▄▄ \n ▄▀▀███████▄ \n██▄██▀▀██▀▄▀ \n▀▄▄▄ ▀▀▀ ▀▀█▄ \n █▄▄██▀ ▄█▄ █ \n ▄██▀ ▄▀▀▄▄█ \n █▄█▄███▀█▄█▄█"], ["walk_1", " ▄▄██ ▄▄ \n ▄▀▀███████▄ \n██▄██▀ ▄█▀▄▀ \n▀▄▄▄ ▀▀▀ ▀▀█▄ \n █▄▄██▀ ▄█▄ █ \n ██▀ ▄▀▀▄▄█ \n ▄█▄██▄▄▄▄█ \n █▄▄█▄▀▀▄▄█▄█ "], ["walk_2", " ▄▄ \n ▄▄████▄██ \n▄█ ▄██▀▀██▀█ \n█▀▀▀▀▄▄█▀ █▄ \n █▀▀▄▄▄ ▄ ▀▀▄ \n ▀▀▀▀█▄▄▀▀█▄▄ █\n ▄██▄▄█▄▄▄█▀▀\n █▄▄█▄▀▀▄▄█▄█ "]]], + ["jazarichmon", [["angry", " \n ▄▄██▀▄▄ \n ▄▀███████▀ \n█▄██▀ ██▀▄█ \n█▀▀▀▀▀▀▄▄█▀▀▀▀▀█\n ▀▄▄▄█ ▀ ▄▄▀▀▄\n ▄▀ ▀▄▄▀ █▀▀ \n █▄▄█▄█▄▄█▄█ "], ["attack", " ▄▄██▀▄▄ \n ▄▀███████▀ \n█▄██▀ ██▀▄█ \n█▀▀▀▀▀ ▄▄█▀▀▀▀▀█\n ▀███▄ ▀ ▄▄▀▀ \n █▀▀▀ ▄▀ █▀▀█ \n ▄▀▀█▀█▀ ▄ █▀ \n ▀▀▀▀▀▀▀▀▀▀▀ "], ["eat_1", " ▄▄██▀▄▄ \n ▄▀███████▀ \n█▄██▀▀██▀▄█ \n█▀▀▀▀▀ ▄▄█▀▀▀▀▀█\n ▀████ ▀ ▄▄▀▀ \n █▀▀▀ ▄ ▀▀█▀▀█ \n █▀▀▀▄▄▀ █▀ \n █▄▄█▄█▄▄█▄█ "], ["eat_2", " ▄▄▄ \n ▄▄████▄██ \n▄▀▄██▀███▀▄ \n████▄█▄▀ ██▄▄▄▄▄\n▀▄ ▄ ▀█▀ ▄▄▀\n ▀▀▀█ ▄ █▀▀█ \n ▄▀ ▀▄▄▀ █▀ \n █▄▄█▄█▄▄█▄█ "], ["happy", " ▄▄██▀▄▄ \n ▄▀███████▀ \n█▄██▀▄▀█▀▄█ \n█▀▀▀▀▀▀▄▄█▀▀▀▀▀█\n ▀████ ▀ ▄▄▀▀ \n █▀▀ ▄▀ ▀▀█▀▀█ \n █▀▀ ▄▄▀ █▀ \n █▄▄█▄█▄▄█▄█ "], ["injured_1", " \n ▄▄██▀▄▄ \n ▄▀███████▀ \n█▄███ ▀█▀▄█ \n█▀▀▀▀▀▀▄▄█▀▀▀▀▀█\n ▀▄▄▄█ ▀ ▄▄██ \n▄▀█▀▀█▀▄▀▀█▀▄▄▀ \n█▄▄▄▄█▄█▄▄▄▄█ "], ["injured_2", " \n ▄▄▄ \n ▄▄████▄██ \n▄▀▄██▀███▀▄ \n█████▄▄▀ ██▄▄▄▄▄\n▀▄ ▄ ▀█▀ ▄▄▀\n▄▀█▀▀█▀▄▀▀█▀█▀█ \n█▄▄▄▄█▄█▄▄▄▄█▀ "], ["sleep_1", " \n ▄▄▄ \n ▄▄████▄██ \n▄▀▄██████▀▄ \n████▄▄█▀ ██▄▄▄▄▄\n▀▄ ▄ ▀█▀ ▄▄▀\n ▀███ ▄▄ █▀▀█ \n █▄▄▄██▄▄█▄█▀ "], ["sleep_2", " \n ▄▄██▀▄▄ \n ▄▀███████▀ \n█▄██▀▀██▀▄█ \n█▀▀▀▀▀▀▄▄█▀▀▀▀▀█\n ▀▄▄▄█ ▀ ▄▄██ \n ▄▄▀▄█▄▀ ▀▄▄▀ \n █▄▄█▄█▄▄█▄█ "], ["walk_1", " ▄▄██▀▄▄ \n ▄▀███████▀ \n█▄██▀ ▄█▀▄█ \n█▀▀▀▀▀ ▄▄█▀▀▀▀▀█\n ▀▄▄▄█ ▀ ▄▄▀▀ \n ▀▄▀▄ ▀▀█▀▀█ \n ▄▀ ▀▄▄▀ █▀ \n █▄▄█▄█▄▄█▄█ "], ["walk_2", " ▄▄██▀▄▄ \n ▄▀███████▀ \n█▄██▀ ▄█▀▄█ \n█▀▀▀▀▀ ▄▄█▀▀▀▀▀█\n ▀▄▄▄█ ▀ ▄▄██ \n ▄▀▄▀ ▄ ▀▄▄▀ \n ▄▀ ▄ █▀ ▄ █ \n ▀▀▀▀▀▀▀▀▀▀▀ "]]], + ["jesmon", [["angry", " ▄▄ ▄▄▄▄ \n ▄▀█ ▄██▀▀ ▄█▄ \n █ █▀▀ ▄ ▄▄▀ \n █▀ ▀ ▄█ ▄▄ \n ▀█▀▀▀ ▄██▀▀▄▀ \n █▀█▀▀██▄▄▄▄▀ \n ▄▀ █▄▄██▀ ▄█▀▄ \n█▄▄▀▀▄█▀▄▄██▀▄▄█"], ["attack", " ▄▄ ▄██▄▀▀█▀ \n █ █▄█▀▀ ▀▀█ \n █▄▀ ▄█▀ ██▄ \n █▄▄▄▄ ▄▀▀▄▀ \n ▀▄▄▄▄▄█▄▄▄▄█ \n▄▀▀▀▀▀▀█ ▄█▀▀▄ \n ▀▀▀█▀▀███▀▀█▄ █\n ▀▄█ ▀▄█ ▀▀"], ["eat_1", " ▄▄ ▄██▄▀▀█▀ \n █ █▄█▀▀ ▀▀█ \n █▄▀ ▄█▀ █▀ \n █▄▄▄▄ ▄██▄▀█ \n █▀▀▀▄▄██▀ ▀▄ \n ██▀ ██▀██ \n ▄▀█▀█▄█▀█ █ ▀▄\n █▄▀▄█ ▀▄█▄▀▀▄█"], ["eat_2", " ▄▄ ▄▄▄▄ \n ▄▀█ ▄██▀▀ ▄█▄ \n █ █▀▀ ▄ ▄▄▀ \n █▀ ▀ ▀ ▄█ ▄▄ \n ▀█▀▀▀ ▄██▀▀▄▀ \n █▀█▀▀██▄▄▄▄▀ \n ▄▀ █▄▄██▀ ▄█▀▄ \n█▄▄▀▀▄█▀▄▄██▀▄▄█"], ["happy", " ▄▄ ▄██▄▀▀█▀ \n █ █▄█▀▀ ▀▀▄ \n █▄▀ ▄▀▄ ██▄ \n█▀▄▄▄▄▄ ▄█ █ \n█ █▀▀▀ ▄█▀ ▄▀ \n ▀▀██▀▀▀██▀▀██ \n ▀▄▀█▀█ ▀██ ▀▄\n ▀▄█ ▀▄█ ▀▀▀"], ["injured_1", " ▄▄ ▄▄▄▄ \n ▄▀█ ▄██▀▀ ▄█▄ \n █ █▀▀▄ ▄▄▀ \n █▀ ▀▀▀ ▄█ ▄▄ \n ▀█▀▀▀ ▄██▀▀▄▀ \n ███▀▀██▄▄▄▄▀ \n █ ▀▄██▀ ▄█▀▄ \n ▀█▄▄█▄▄███▄▄█"], ["injured_2", " \n ▄▄ ▄██▄▀▀█▀ \n █ █▄█▀▀ ▀▀█ \n █▄▀ █▄▄ █▀ \n █▄▄▄▄ ▄██▄▀█ \n ▀▄▄▄▄▄██▀ ▀▄ \n █▀█ ▄██▀▀██ \n ▀▄▄███▄▄██▄█▄"], ["sleep_1", " \n ▄▄ ▄██▄▀▀█▀ \n █ █▄█▀▀ ▀▀█ \n █▄▀ ▄▄▄ █▀ \n █▄▄▄▄ ▄██▄▀█ \n ▀▄▄▄▄▄██▀ ▀▄ \n █▀█ ▄██▀▀██ \n ▀▄▄███▄▄██▄█▄"], ["sleep_2", " ▄▄ ▄▄▄▄ \n ▄▀█ ▄██▀▀ ▄█▄ \n █ █▀▀ ▄▄▀ \n █▀ ▀▀▀ ▄█ ▄▄ \n ▀█▀▀▀ ▄██▀▀▄▀ \n ███▀▀██▄▄▄▄▀ \n █ ▀▄██▀ ▄█▀▄ \n ▀█▄▄█▄▄███▄▄█"], ["walk_1", " ▄▄ ▄██▄▀▀█▀ \n █ █▄█▀▀ ▀▀█ \n █▄▀ ▄█▀ █▀ \n █▄▄▄▄ ▄██▄▀█ \n ▀▄▄▄▄▄██▀ ▀▄ \n ▄▀▄▀ ▄██▀▀██ \n▄▀ ▄█▀██▀ ▄██ ▀▄\n▀▀▀ ▀▄█ ▀▀▄█ ▀▄█"], ["walk_2", " ▄▄ ▄▄▄▄ \n ▄▀█ ▄██▀▀ ▄█▄ \n █ █▀▀ ▄▄ ▄▄▀ \n █▀ ▀▀ ▄▀▄▄ \n ▀█▀▀▀ ▄█▀▀▄▀ \n ▀██▀▀█▄▄▄▄█ \n ▄▀█▄▄█▀ ▄█ ▀▄ \n █▄█▄█▀▄▄▀▀▄█▄▄█"]]], + ["jesmon_gx", [["angry", "▄▄▄ ▄▄▄ \n▀▄ ▀▀▀▄▄█▀▀▀█▀ \n █▄▀▀▄ ▄▀▀▄ \n▄▀ ▀▀ ▄▄▀ ▄▀█\n ▀█▀▀▀ ▄▄▄██▀ ▄▀\n ▄▀█▀█▀ ▄▀▀██▄▄▀\n ▀▄▀▄ ▄▀▀▄▄▄▀ \n █▄▄▀▀▀▄▄█ "], ["attack", " █▀▀▄▄▄▀▀█▄▄▄▄▄\n ▀▄ ▄▄▀▀▀ ▄▄▀ \n ▄▀▀ ▄█▀ ▀ ▄▀ \n ▀▄▄▄▄▄ ▀█▄▀█\n▄▀▀▀█▄▄▄▄▀███ ▄▀\n█ ▄▄█ ▀ █ ▀█ \n ▀▀ ▀▄▀▄███▀▀▄ \n █▄▄▀ ▀▄█ "], ["eat_1", "█▀▀▄▄▄▀▀█▄▄▄▄▄ \n ▀▄ ▄▄▀▀▀ ▄▄▀ \n ▄▀▀ ▄▀▄ ▀ ▄▀ ▄▄\n▀▄▄▄▄▄ ▀█▄▄▀ █\n ▄█▀▀▀ ▄▀███▄ ▀▄\n█ ▀█▀▀▀▄█▀▀ █▀▀ \n ▀▄█▀▄█▀▀▄▄▀ \n ▀▄█▀▄▄█ "], ["eat_2", "▄▄▄ ▄▄▄ \n▀▄ ▀▀▀▄▄█▀▀▀█▀ \n █▄▀▀▄ ▄▀▀▄ \n▄▀ ▀ ▀ ▄▄▀ ▄▀█\n ▀█▀▀▀ ▄▄▄██▀ ▄▀\n ▄█▀█▀ ▄██▀█▄▄▀\n █▄▀▄ ▄█▀█ █ \n █▄▄▀ ▀▄██ "], ["happy", "█▀▀▄▄▄▀▀█▄▄▄▄▄ \n ▀▄ ▄▄▀▀▀ ▄▄▀ \n ▄▀▀ ▄▀▄ ▀ ▄▀ \n▀▄▄▄▄▄▄ ▀█▀▀▄ \n ▄█▀▀▀ ▄▀█▀ ▄▀▀█\n█ ▀█▀▀▀▄██▄▀ ▄▀ \n ▀▀█▀▄█▀ ▀█▀▄▄▀ \n ▀▄█▀▄▄█ "], ["injured_1", " \n█▀▀▄▄▄▀▀█▄▄▄▄▄ \n ▀▄ ▄▄▀▀▀ ▄▄▀ \n ▄▀▀ ▄ ▀ ▄▀ ▄▄\n▀▄▄▄▄ ▀▀ ▀█▄▄▀ █\n ▀▄▄▄▄█▀▀██▄ ▀▄\n ▄▀█▄ ▄▄█▀ ██▀ \n █▄▄▀▄█▀█▄▄▄█▄█ "], ["injured_2", " \n▄▄▄ ▄▄▄ \n▀▄ ▀▀▀▄▄█▀▀▀█▀ \n █▄▀▀ ▄▀▀▄ ▄▄\n▄▀ ▀▄▄ ▄▄█▄▀ █\n ▀█▀▀ ▄▄▄██▄ ▀▄\n ▄▀██▀▄▄█▀ ██▀ \n █▄▄▀▄█▀█▄▄▄█▄█ "], ["sleep_1", " \n█▀▀▄▄▄▀▀█▄▄▄▄▄ \n ▀▄ ▄▄▀▀▀ ▄▄▀ \n ▄▀▀ ▄▄ ▀ ▄▀ ▄▄\n▀▄▄▄▄▄ ▀█ ▄▀ █\n ▀▄▄▄▄▀▀███▄ ▀▄\n ▄▀▀█▄ ▄▀▀█ ▀█▀ \n █▄▄▄███▄▄█▄▄▀ "], ["sleep_2", " ▄▄▄ ▄▄▄ \n ▀▄ ▀▀▀▄▄█▀▀▀█▀ \n █▄▀▀ ▄▀▀▄ \n ▄▀ ▀▀ ▄▄▀ ▄▄\n ▀█▀▀▀ ▄▄▄█▄▀ █\n ▄█▀█▀ ▄██▄ ▀▄\n ▄▀▀█▄ ▄▀▀█ ▀█▀ \n █▄▄▄███▄▄█▄▄▀ "], ["walk_1", "█▀▀▄▄▄▀▀█▄▄▄▄▄ \n ▀▄ ▄▄▀▀▀ ▄▄▀ \n ▄▀▀ ▄█▀ ▀ ▄▀ ▄▄\n▀▄▄▄▄▄ ▀█▄▄▀ █\n ▀▄▄▄▄▀▀███▄ ▀▄\n ▄▀█ ▀ ▄██▀ █▀▀ \n ▀▄█▀▄█▀ ▀▄▄▀ \n ▀▄█▀▄▄█ "], ["walk_2", "▄▄▄ ▄▄▄ \n▀▄ ▀▀▀▄▄█▀▀▀█▀ \n █▄▀▀▄▄ ▄▀▀▄ \n▄▀ ▀▀ ▄▄▀ ▄▀█\n ▀█▀▀▀ ▄▄▄██▀ ▄▀\n ▄█▀█▀ ▄█▀▀█▄▄▀\n █▄▀▄ ▄█▀ █ █ \n █▄▄▀ ▀▄▄█▀ "]]], + ["jesmon_x", [["angry", " ▄▄ ▄▄▄▄ \n █ ▀▀▄██▀ ▄█▄▄ \n ▀▄▀▀▄ ▀ ▄▀ \n ▄▀ ▀▀ ▄▀█▄▄▀▀█\n ▀█▀▀▀ ▄▄█▀▀▄▄▀ \n ▄█▀█▀ ▄██▄▄▄█ \n▄▀ █▀█▀█▀██▄ █ \n█▄▀ ▀▄█ ▀▄█ ▀▀▀ "], ["attack", " █▀▄▄ ▄▄▄▀▀█▀ \n ▀▄ ▄█▀▀ ▄▀▀█▀ \n ▄▀ ▄█ ▄▄▀▄▀█\n █▄▄▄▄ ▀▄██▀ █\n █▄▄▄▄▀▀▀▄ ▀█ \n▄▀▀ ▄▄▄▀ ▀▀▀▄\n ▀▀▄▄▄▄▄ ▀ ▄▀█▀ \n ▀▄█ ▀▀▀▄▄█ "], ["eat_1", " █▀▄▄ ▄▄▄▀▀█▀ \n ▀▄ ▄█▀▀ ▄▀▀█▀ \n ▄▀ ▄█▀ ▄▄▀ ▄▄▄\n █▄▄▄▄ ▀▄██▀ ▄▀\n █▀▀▀ ▄██▄ ▀▀▄ \n ▄▀█▀█▀ ▄██▀▀█▀ \n █ █▀█▀█ ██ █ \n ▀▀ ▀▄█ ▀▄█▀▀ "], ["eat_2", " ▄▄ ▄▄▄▄ \n █ ▀▀▄██▀ ▄█▄▄ \n ▀▄▀▀▄ ▀ ▄▀ \n ▄▀ ▀ ▀ ▀█▄▄▀▀█\n ▀█▀▀▀ ▄█▀▀▄▄▀ \n ▄██▀█▀▀██▄▄▄█ \n▄▀ █▄█▄▄▀▀█ ▀▄ \n█▄▀▀▄█▀▀▀▄█▀▄▄█ "], ["happy", " █▀▄▄ ▄▄▄▀▀█▀ \n ▀▄ ▄█▀▀ ▄▀▀█▀ \n █▀ ▄▀▄ ▄▄█▄▀▀█\n▄█▄▄▄▄ ▄█▀ ▄▀\n▀▄▀▄▄▄▄▄██▀▀█▀ \n ▀█▀▄▀ ▄█▀█ \n █▀█▀█ ▀█ \n ▀▄█▀▀▄█ "], ["injured_1", " ▄▄ ▄▄▄▄ \n █ ▀▀▄██▀ ▄█▄▄ \n ▀▄▀▄ ▀ ▄▀▄▄▄\n ▄▀ ▀▀ ▄▀█▄▀ ▄▀\n ▀█▀▀▀ ▄▄█▄ ▀▀█ \n ▄▀█▀█▀▀██▀▀█▀ \n █ █▀▄▄▀██ █ \n █▄▀▄▀ ▀▄█▄▀ "], ["injured_2", " \n█▀▄▄ ▄▄▄▀▀█▀ \n▀▄ ▄▀▀▀ ▄▀▀█▀ \n ▄▀ █▄ ▄▄▀▄█▀▀█\n█▄▄▄▄ ▀▄█▀▀▄▄█ \n ▀▄▄▄▄█▀▀██▄▄▄█ \n █ █▄█▄▀▀██ █ \n █▄▀▄█ ▀▄▄█▄▀ "], ["sleep_1", " \n█▀▄▄ ▄▄▀▀▀█▀ \n▀▄ ▄█▀▀ ▄▀▀█▀ \n ▄▀ ▄▄ ▄█ ▄▄▄ \n█▄▄▄▄ ▀▄█▀ ▄▀ \n ▀▄▄▄▄▄██▄ ▀▀▄ \n ▀▄█▄▄▀ █▀▀▀█ \n █▄▄█▄▄█▄▄▄▄▄█ "], ["sleep_2", " ▄▄ ▄▄▄▄ \n █ ▀▀▄██▀ ▄█▄▄ \n ▀▄▀▀ ▀ ▄▀ \n ▄▀ ▀▀ ▄▀█▄▀▀█ \n ▀█▀▀▀ ▄▀▀▄▄▀ \n █▀█▀▀██▄▄▄█ \n █▀▄▄▀ █ ▀▄ \n █▄▄▄█▄█▄▄▄▄▄█ "], ["walk_1", " █▀▄▄ ▄▄▄▀▀█▀ \n ▀▄ ▄█▀▀ ▄▀▀█▀ \n ▄▀ ▄█▀ ▄▄▀ ▄▄▄\n █▄▄▄▄ ▀▄██▀ ▄▀\n ▀▄▄▄▄▄██▄ ▀▀▄ \n ▄▀█▀▄▀ ▄██▀▀█▀ \n█ ▄█▀█▀█ █▀▄ █ \n▀▀ ▀▄█ ▀▄█ ▀▀▀ "], ["walk_2", " ▄▄ ▄▄▄▄ \n █ ▀▀▄██▀ ▄█▄▄ \n ▀▄▀▀▄▄ ▀ ▄▀ \n ▄▀ ▀▀ ▄▀█▄▄▀▀█\n ▀█▀▀▀ ▄█▀▀▄▄▀ \n ▄██▀█▀▀██▄▄▄█ \n █▄▀▄█▄▄▀▀█▄ ▀▄\n █▄▄▀ ▀▀▄▄█▀▀▀▀"]]], + ["jewelbeemon", [["angry", " ▄▀▀▄▀▀▀▀▀▀▄▀▀▄▄\n ▀ █▄ ▄█ ▀▄ ▀\n █▄▄▄▄ ▄▀▄ \n ▀████▀▀█▀ \n ▄▀█▄▄▄▄█▀▀▄ \n █ ▄█▄▄▄▄██▀ █ \n ▀█▀▄█▄▀█▀▀▀ \n █▄▄█ ▀▄▄█ "], ["attack", " ▄▄ ▄▄▄▄▄▄ ▄▄ \n █ ▄▀ ▄▄ █ ▀█\n █▀ ▀▀ █ \n ▀▄▀▀▀▀▀▄▀▄▀ \n ▀▄▀▀ ▄█▀▄ \n ▄█▀▀▀▀█▄▀ \n █▄█▀█▀██▄█ \n █▄▄▄▀▀▀▄▄▄█ "], ["eat_1", " ▄▄ ▄▄▄▄▄▄ ▄▄ \n █ ▄▀ ▄ █ ▀█\n █▀ ▀ ▀ █ \n ▀▄▀▀▀▀▀▄▀▄▀ \n ▀▄▀▀ ▄█▀▄ \n ▄█▀▀▀▀█▄▀ \n █▄█▀█▀██▄█ \n █▄▄▄▀▀▀▄▄▄█ "], ["eat_2", " ▄▀▀▄▀▀▀▀▀▀▄▀▀▄▄\n ▀ █▄ ▄█▀ ▀▄ ▀\n █▄▄▄▄▄ ▄▀▄ \n █████▀▀█▀ \n ▄█▄▄▄▄█▀█ \n ▄▀ █▄▄▄▄██ █ \n ▀▄█▀▄█▄▀█▄▄▀ \n █▄▄█ ▀▄▄█ "], ["happy", " ▄▀▀▄▀▀▀▀▀▀▄▀▀▄▄\n ▀ █▄ ▄▀▄ ▀▄ ▀\n █▄▄▄▄ ▄▀▄ \n █████▀▀█▀ \n ▄█▄▄▄▄██▄ \n ▄▀▄█▄▄▄▄█▄▀▀▄ \n ▀▀█▀▄█▄▀█ ▀▀▀ \n █▄▄█ ▀▄▄█ "], ["injured_1", " \n ▄▄▀▀▀▀▀▀▄▄ \n ▄▀█ ▀▄▀▄ \n ▀ ██ █▄ █ ▀ \n ▀▄▄▄▄▄ ▄█ █ \n ▄█▄▄▄██ █ \n ▄▀▄█ ▄▀▀▄ \n █▄▄█▄▄▄█▄▄█ "], ["injured_2", " \n ▄▄▄▄▄▄ \n ▄█▀ █▀▄ \n█ █▄ ▄ █ █ \n █▀ ▀▀ ▄▀▄ \n ▀█▀▀▀▄█▀▄▀ \n ▄▀██▀▀▀█▀▀▄ \n █▄▄█▄▄▄█▄▄█ "], ["refuse", " ▄▄ ▄▄▄▄▄▄ ▄▄ \n █ ▄▀ ▄ █ ▀█\n █▀ ▀▀ █ \n ▀▄▀▀▀▀▀▄▀▄▀ \n ▀▄▀▀▀▄█▀▄ \n ▄▀█▀▀▀▀█▀ █ \n █▄█▀█▀███▀ \n █▄▄▄▀▀▀▄▄▄█ "], ["sleep_1", " \n ▄▀▀▄▀▀▀▀▀▀▄▀▀▄▄\n ▀ █▄ ▄▄ ▀▄ ▀\n █ ▄▄▄▄▄ ▄▀▄ \n █ ▄▄ █▄▀ \n ▄█▄▄▄██ █ \n █▀▄█▄▄▄▄█▀▄ \n █▄▄█▄▄▄█▄▄█ "], ["sleep_2", " \n ▄▄ ▄▄▄▄▄▄ ▄▄ \n █ ▄▀ ▀▄ ▀▄\n █▀ ▀▀ █ \n █▀▀▀▀▀▄█▄▀ \n ▀▄██▄▄█ █ \n █▀▄█▄▄▄▄█▀▄ \n █▄▄█▄▄▄█▄▄█ "], ["walk_1", " ▄▀▀▄▀▀▀▀▀▀▄▀▀▄▄\n ▀ █▄ ▄█▀ ▀▄ ▀\n █ ▄▄▄▄▄ ▄▀▄ \n █ ▄▄ █▄▀ \n █▄▄▄██ █ \n ▄▀█▄▄▄▄█▀▄ \n ▀▄▀▄█▄▀▄▄▀ \n █▄▄█ ▀▄▄█ "], ["walk_2", " ▄▄ ▄▄▄▄▄▄ ▄▄ \n █ ▄▀ ▄▄ █ ▀█\n █▀ ▀▀ █ \n ▀▄▀▀▀▀▀▄▀▄▀ \n ▀▄▀▀ ▄█▀▄ \n ▄█▀▀▀▀█▄▀ \n █▄█▀█▀██▄█ \n █▄▄▄▀▀▀▄▄▄█ "]]], + ["junkmon", [["angry", " ▄▀▀█▄ \n ▀▄▄█▀▀▄ \n ▄▄▄██ ▄▀▀▄ \n █ ▄▄▄▄█ ▄█▄▀▄\n █▄█▄▄▄▄▄██ █ █\n ▄▀ ▄█ ▄▄████▄\n ▀▄▄▄▄▄▄▀ ██ ██\n █▄█▀█▄█▄▀▀████▀"], ["attack", " ▄▀▀▀▄▄ \n █ ████▄ ▄▄ \n ▀▀███▀ ▀█ █ \n ▄▀▀▀▀▀▄▄█ ▄▀ \n ▄▀▄▀▀▀▀▀████▀ \n ▀█▀▀█▀▀██▄████▄\n▄█ ▀▀ █ ██ ██\n█▄█▀▀▀█▄█▀▀████▀"], ["eat_1", " ▄▀▀█▄ \n ▀▄▄██▀▄ \n ▄▀▀▀▀▀▄▀ ▀▄ \n ▄▀▄▀▀▀▀▀▄▄▄█▄▀▄\n ▀█▀█▀██▀▀▀▄ █ █\n █▄▄▄▀▀ ▄█████▄\n ▀████▄▄▀ ██ ██\n █▄█ █▄█▄▀▀████▀"], ["eat_2", " ▄▀▀█▄ \n ▀▄▄█▀▀▄ \n ▄▄▄██ ▄▀▀▄ \n █ ▄▄▄▄█ ▄█▄▀▄\n █▄█▄▄▄▄▄██ █ █\n ▄▀ ▄▀▄ ▄▄████▄\n ▀▄▄▄▄▄▄▀ ██ ██\n █▄█▀█▄█▄▀▀████▀"], ["happy", " ▄▀▀█▄ \n ▀▄▄██▀▄ \n ▄▀▀▀▀▀▄▀ ▀▄ \n ▄▀▄▀▀▀▀▀▄▄▄█▄▀▄\n ▀█▀▀▀█▀▀▀▀▄ █ █\n █▄▄▄▀ ▀ ▄█████▄\n ▀████▄▄▀ ██ ██\n █▄█ █▄█▄▀▀████▀"], ["injured_1", " ▄▄▄ \n █ ██▄ \n ▀███ █▄ \n ▄▀▀▀▀▀▄▀ █ ▄ \n ▄▀▄▀▀▀▀▀▄▄▀▀█ █\n ▀█▀▀▀██▀▀▄████▄\n █▄▄ ▄▄▄▄███ ██\n█▄▄█▀█▄█▄▄▀████▀"], ["injured_2", " ▄▄▄ \n █ ██▄ \n ▀███ █▄ \n ▄▄▄▄█▄▀ █ ▄ \n █ ▄▄▄▄█▄▄▀▀█ █\n █▄█▄▄▄▄▄█ ▄▄█▄▀\n █▄ ▄▄▄███▀▀██\n█▄▄█▀█▄█▄▄▀████▀"], ["sleep_1", " ▄▄▄ \n █ ██▄ \n ▀███ █▄ \n ▄▄▄▄█▄▀ █ ▄ \n █ ▄▄▄▄█▄▄▀▀█ █\n █▄█▄▄▄▄▄█▄████▄\n █▄ ▄▄▄▀██ ██\n █▄█▀█▄█▄▄▀████▀"], ["sleep_2", " ▄▄▄ \n █ ██▄ \n ▀███ █▄ \n ▄▀▀▀▀▀▄▀ █ ▄ \n ▄▀▄▀▀▀▀▀▄▄▀▀█ █\n ▀█▀▀▀██▀▀▄████▄\n █▄ ▄▄▄▀██ ██\n █▄█▀█▄█▄▄▀████▀"], ["walk_1", " ▄▀▀█▄ \n ▀▄▄█▀▀▄ \n ▄▄▄██ ▄▀▀▄ \n █ ▄▄▄▄█ ▄█▄▀▄\n █▄█▄▄▄▄▄██ █ █\n ▄▀ ▀▄█▀ ▄▄████▄\n ▀▄▄▄▄▄▄▀ ██ ██\n █▄█▀█▄█▄▀▀████▀"], ["walk_2", " ▄▄▄ \n █ ██▄ \n ▀███ █▄ \n ▄▀▀▀▀▀▄▀ █ ▄ \n ▄▀▄▀▀▀▀▀▄▄▀▀█ █\n ▀█▀█▀██▀▀▄████▄\n █▄ ▀█▄▄▀██ ██\n █▄█▀█▄█▄▄▀████▀"]]], + ["justimon_blitz_arm", [["angry", " ▄▄▄▄▄█▀█ \n ▄▀ ▄ █ █▄▄ \n █ ▀▀ █▀▄▄██ \n ▀███ █▀▀▄ \n ▄▀█▄▄██▀▀▄ \n ▀▄█▀▀ █▄▄▀ \n ▄▀▀█▄█▀▀▄ \n █▄▄▄█ █▄▄▄█ "], ["attack", " ▄▄▄ \n ▄▀▀▀█▀▀▄▀ \n █ ▄█▄▄▀▀█▄ \n ▀▄█▀ ██▄█▀▀▀ \n ▄█▀▀▄█ █ \n ▄▀█▀▀ █▀▀▄ \n ▄▀▄██▄██▄▄█ \n █▄▄▄█▀▀▀█▄▄▄█ "], ["eat_1", " ▄▄▄ \n ▄▀▀▀█▀▀▄▀ \n █ ▄▀▄▀▄▄▀▀█▄ \n ▀▄▄▄▄▀█▄█▀▀▀ \n █▀▀▄█ █ \n ▄▀█▀▀ █▀▀▄ \n ▄▀▄██▄██▄▄█ \n █▄▄▄█▀▀▀█▄▄▄█ "], ["eat_2", " ▄▄▄▄▄█▀█ \n ▄▀ █ █▄▄ \n █ ▄▄█▀█▀▄▄██ \n ▀███ █▀▀▄ \n ▄█▄▄██▄▄▀ \n █ █▀▀ █ █ \n ▄▀▀█▄█▀▀█ \n █▄▄▄█ █▄▄▄█ "], ["happy", " ▄▄▄▄▄█▀█ \n ▄▀ ▄ █ █▄▄ \n █ ▀ ▀ █▀▄▄██ \n ▀███ █▀▀▄ \n ██▄▄██▄▄▀ \n █ █▀▀ █ █ \n ▄▀▀█▄█▀▀█ \n █▄▄▄█ █▄▄▄█ "], ["injured_1", " \n \n ▄▄▄▄▄█▀█ \n ▄▀▄ █ █▄ \n █ ▀▀▄██▀▄▄▀▄ \n ▀▄█▀ ██▀▀█▀▀ \n ▄▀▀█▀▀ █▄▀▀▄ \n █▄▄██▄██▄▄▄█ "], ["injured_2", " \n \n ▄▄▄ \n ▄▀▀▀█▀▀▄▀ \n █ █▄ █▄▄▀▀▄ \n █ ▄▄▀ █▄██▄█ \n ▄▀▀█▀▀ █▄▀▀▄ \n █▄▄██▄██▄▄▄█ "], ["refuse", " ▄▄▄ \n ▄▀▀▀█▀▀▄▀ \n █ ▄▄█▄▄▀▀█▄ \n ▀▄█▀ ██▄█▀▀▀ \n ▄█▀▀▄█ █ \n ▄▀█▀▀ █▀▀▄ \n ▄▀▄██▄██▄▄█ \n █▄▄▄█▀▀▀█▄▄▄█ "], ["sleep_1", " \n ▄▄▄ \n ▄▀▀▀█▀▀▄▀ \n █ ▄█▄▄▀▀█▄ \n ▀█▀ ██▄█▀▀▀ \n ▄█▀▀▄█ █ \n ▄▀▀█▀▀ ██▀▀▄ \n █▄▄██▄██▄▄▄█ "], ["sleep_2", " \n \n ▄▄▄▄▄█▀█ \n ▄▀ █ █▄▄ \n █ ▄▄▀██▀▄▄██ \n ▀█▄▄▀█▀▀▄ \n ▄▀▀█▄▄██▄▀▀▄ \n █▄▄█▄▄▄█▄▄▄█ "], ["walk_1", " ▄▄▄▄▄█▀█ \n ▄▀ █ █▄▄ \n █ ▄▄▀██▀▄▄██ \n ▀█▄▄▀█▀▀▄ \n ██▄▄▀█▄▄▀ \n █ █▄ ▄█ █ \n ▄▀▀███▀▀█ \n █▄▄▄█ █▄▄▄█ "], ["walk_2", " ▄▄▄ \n ▄▀▀▀█▀▀▄▀ \n █ ▄█▄▄▀▀█▄ \n ▀▄█▀ ██▄█▀▀▀ \n ▄█▀▀▄█ █ \n ▄▀█▀▀ █▀▀▄ \n ▄▀▄██▄██▄▄█ \n █▄▄▄█▀▀▀█▄▄▄█ "]]], + ["justimon_x", [["angry", " ▄▄▄ \n ▄███▄▄█▄▄ \n ███▀ ▄▀ ▄▀ \n ▀▄▄▄██▄▄▀ ▄▀▀█\n ▀▄▄▄▄█▀▀█▄▄▀ \n ▄▀█ ▄▄ ▄▀▀ █ \n ▀▄██▄▄██▄▄█▀ \n █▄██▀ ▀▀█▄▄█ "], ["attack", " ▄▄▄▀▀█ \n ▄████▀█▀▀█ \n █▀▀ ▄█ █ \n ▀█▀▀ ▄██ ▄▀▀█ \n▄▀▀▀▀▀▀▀▄ █▄▄▀▄ \n█ ▄▄▄██▀▀▄▄▀ \n ▀███▄▄█▀█▄ \n █▄██ ▀█▄▄█ "], ["eat_1", " ▄▄▄▀▀█ \n ▄███▀▀█▀▀█ \n █▄▄▄▄█ █ ▄▄ \n █ ██▄▀▄ ▀▄\n ▄█▄▄▄█▀▄█▀▄▀▀▀\n █ █ ▄▄ █ ▄█ \n ███▄▄█▀██▀ \n █▄██▀ ▀█▄▄█ "], ["eat_2", " ▄▄▄ \n ▄███▄▄█▄▄ \n █▀██▀▀█▀▄▀ \n ▀▄▄▄▄▀█▄▀ ▄▀▀█\n ▀▄▄▄▄█▀▀█▄▄▀ \n ▄▀█ ▄▄ ▄▀▀ █ \n ▀▄██▄▄██▄▄█▀ \n █▄██▀ ▀▀█▄▄█ "], ["happy", " ▄▄▄▀▀█ \n ▄▀██▀▀██▀█ \n █▄▄▄▄██ █ \n ▄█ ▀▀▀ ██▀▀▄ \n█ ▀█▄▄▄█▀█ ▄█ \n ▀▄█ ▄▄ █▀▀▄ █ \n ▄██▄▄█▀█▄ ▀▀ \n █▄██▀ ▀█▄▄█ "], ["injured_1", " ▄▄▄ \n ▄███▄▄█▄▄ \n ██▀███▀ ▄▀ \n ▀▄▄▄▄▀▄▄█▄▄ \n ▀▄▄▄██ ▀█▄▀▀▄ \n ▄▀█▄▄▄ █▀█ ▀▄█ \n ▀█ ▀▄▄█▀ █▀▄ \n █▄▄▄█▀█▄▄█▄█ "], ["injured_2", " \n ▄▄▄▀▀█ \n ▄███████▄▄ \n █▀ ▀▀█ ▄▀ \n █▀▀▀▄█▀██▀▄▄ \n ▄▀█▀▀▀▀▄▄█▀▄ █ \n ▀█ ▀██▄▀ █▀▄▀▀ \n █▄▄▄█▀█▄▄█▄█ "], ["sleep_1", " \n ▄▄▄▀▀█ \n ▄██████▀▀█ \n █▀▀▀▀█ █▄ \n █▀▀▀ █▀▀▄▀▄ \n▄▄ ▄▀██▀██▀▀▄ █ \n█ ▀██▄▄█ █ █ \n█▄▄▄████▄▄▄█▀ "], ["sleep_2", " ▄▄▄ \n ▄███▄▄█▄▄ \n ██████▀ ▄▀ \n ▀▄▄▄▄▀▄▄▀▄ \n ▀▄▄▄▄█▀▀▄▀▄ \n▄▄ █ ▄▄ ▄█▀▀▄ █ \n█ ▀██▄▄█ █ █ \n█▄▄▄████▄▄▄█▀ "], ["walk_1", " ▄▄▄▀▀█ \n ▄████▀█▀▀█ \n █▀▀▀▄█ █ ▄▄ \n █▀▀ ▄██▄▀▄ ▀▄\n ▄▀▀▀▀▀▄▄█ ▀▀▀\n ▄▀▀▄▀▀▄█▀ █ \n ▀▄█████▀▄▄▀ \n █▄██▀ ▀█▄▄█ "], ["walk_2", " ▄▄▄ \n ▄███▄▄█▄▄ \n ████▀▄▀ ▄▀ \n ▀▄▄▄▀▀▄▄▀▄▀▀▄ \n ▀▄▄▄██▀▀▄▀▄▄█\n ▄▀█ ▄▄ ▄▀▀ █ \n ▀▄██▄▄██▄▄█▀ \n █▄██▀ ▀▀█▄▄█ "]]], + ["jyarimon", [["angry", " \n \n ▄▀▀▀█▀▄▀▀▀█▀ \n █▀▀▀▀▀ ▄▀ \n █ ▄ ▄ █ \n █ ▀▀ ▀▀ █ \n ▀▄▄▄▄▄▄▄▀ \n ▄▄▄▄▄ "], ["attack", " ▄▀▀▀█▀▄▀▀▀█▀ \n █▄▄█▄▄▀ ▄▀ \n ▀ ▄█ ▄█ \n \n \n ▄█▄▄█▄ \n ▀▄▄▄▄▄▄▄ \n ▄▄▄▄▄▄ "], ["eat_1", " ▄▄▄▄▄ ▄▄▄▄▄ \n █ ▄▀ █ ▄▀ \n █▀▀▀▀▀ █ \n █ █ █ █ \n █ ▄▄▄ █ \n ▀▄ ███ ▄▀ \n ▀▀▀▀▀▀▀ \n ▄▄▄▄ "], ["eat_2", " \n \n ▄▄▄ ▄▄▄ \n ▄▀▀▀▀▀ ▀▄ \n █▀▄ ▄▀▄▀▄▄▄█▄\n █ ▄▄▄▄ █ \n ▀▄▄▄▄▄▄▄▀ \n ▄▄▄▄▄▄▄ "], ["happy", " ▄▄▄▄▄ ▄▄▄▄▄ \n █ ▄▀ █ ▄▀ \n █▀█▀▀▀▄ █ \n █ ▀ ▀ ▀ ▀ █ \n █ █▄▄▄▄█ █ \n ▀▄ ████ ▄▀ \n ▀▀▀▀▀▀▀ \n ▄▄▄▄ "], ["injured_1", " \n \n \n \n ▄▄▄▄▄▄▄▄▄ \n ▄▀▄ ▄ ▄ ▀▄ \n █▀▀ ▀▀ ▀▄ █ \n ▀▄▄▄▄▄▄▄▄▄▀▄▀ "], ["injured_2", " \n \n \n \n \n ▄▀▀▀▀▀▀▀▀▀▄ \n █▄█ █▄ ▀▄ █ \n █▄▄▄▄▄▄▄▄▄▄█▄█▄"], ["sleep_1", " \n \n \n \n ▄▄▄ ▄▄▄ \n ▄▀▀▀▀▀ ▀▄ \n █▄▄ ▄▄ ▀▄ ▀▄\n ▀▄▄▄▄▄▄▄▄▄█▀▀ "], ["sleep_2", " \n \n \n \n ▄███▄▀▀▀▄ \n ▄▀ ▄ ▀▄ \n █▀▀ ▀▀ ▀▄▄▄▀\n ▀▄▄▄▄▄▄▄▄▄▀ "], ["walk_1", " \n ▄▄▄▄▄ ▄▄▄▄▄ \n █ ▄▀ █ ▄▀ \n █▀▀▀▀▀ █ \n █ █ █ █ \n █ ▄▀▄ █ \n ▀▄▄▄▄▄▄▄▀ \n ▄▄▄▄▄ "], ["walk_2", " \n \n ▄███▄▀▀▀▄ \n ▄▀▄ ▄ ▄ ▀▄ \n █ ▀ ▄ ▀ ▀█▀▀▀\n ▀▄ ▀ ▀ ▄▀ \n ▀▀▀▀▀▀▀ \n ▄▄▄▄▄ "]]], + ["kabuterimon", [["angry", "▄▄ \n█ █ ▄█▀▄▄ \n█ ▀▄ ▀ ▀▄▄▀▀█ \n▀▄ ▄▀ █ █ \n ▀▄▀▀▀▄▄▄▄█▄▄█▄▄\n▄▀▀▄▄▄▄▄▄█▄ ▀▄▄▀\n▀▄█▄▄█▄▄▄█▄▄▄▀ \n█▄▄█▄█▄▄█▄▄▄▄█ "], ["attack", "█▀▄ ▄▄ \n█ ▀▄▀▀ ▀▀▄ ▄▄▄ \n▀▄ ▀ ▄█ █▀ █ \n █▄███▄▄▄ █ ▄▀ \n█ █████ █▀▄▀▀▀█\n▀▄█▀ ▀▄▄▄▄▀▄▄▀ \n ▄█▀▀█▀▀▀█▄▄█ \n█▄▄█▀▀▀▀█▄▄▄▄█ "], ["eat_1", "█▀▄ ▄▄ \n█ ▀▄▀▀▄▀▀▄ ▄▄▄ \n▀▄ ▀ ▄ █▀ █ \n █▄▀█▀▄▀ █▄ ▄▀ \n█ ██████▀█▄ █▀▀█\n█▄█▀ █ █▄▄█▄▀ \n ▄█▀▀█▀▀▀█▄█▄ \n█▄▄█▀▀▀▀█▄▄▄▄█ "], ["eat_2", "█▀▄ ▄▄ \n█ ▀▄▀▀▄▀▀▄ ▄▄▄ \n█ ▀ ▄ █▀ █ \n █ ▄▄▄▀ ▀ █ ▄▀ \n █ ▀▀▀█▀▄▀▀▀█\n▄▀▄▀▀█▀▀▀▀▄ █▄▀ \n▀▄█▀▀█▀▀▀█▄▄█ \n█▄▄█▀▀▀▀█▄▄▄▄█ "], ["happy", " █▀▄ ▄▄ \n █ ▀▄▀▀ ▀▀▄ ▄▀█ \n ▀▄ ▀ ▄▀▄ █▄▄█ \n ▄█▄███▄ █▄ █▄\n █ ██████▀█▀ ▄▀█\n ▀█▀ █ █▄█▄▀ \n ▄█▀▀█▀▀▀▄█▄▄ \n █▄▄█▀▀▀▀█▄▄▄▄█ "], ["injured_1", " \n▄▄ \n█ █ ▄█▀▄▄ ▄▄▄ \n█ ▀▄ ▀ ▀▄▀ █ \n▀▄ ▄▄ █ ▄▀ \n ▀▄▀▀▀▄▄▄▄▀█▀ ▀█\n ██▄▄▄▄▄▄▀ █▄▀ \n █▄▄█▄█▄█▄▄▄█▄█ "], ["injured_2", " \n \n▄▄ ▄▀█ █▀▄ \n█ █ ▄█▀▄▄▀ █ ▄▄\n█ ▀▄ ▀ ▀▄ █▀ █\n▀▄ ▄▄ █▀▀▄▀ \n▄▀▄▀▀▀▄▄▄▄▀▀▄ ▀▄\n█▄█▄▄▄▄▄▄█▄▄▄█▄█"], ["sleep_1", " \n█▀▄ ▄▄ ▄▄▄ \n█ ▀▄▀▀▄▀▀▄█ █ \n█ ▀ █ █ \n █ ▄▄▄ ▀▀ █▄█▀▀█\n▄▀█ ▀▀▀▀█▀▄ █ \n█ ██████▀ █ \n█▄▄█▄█▄▄█▄▄▄▄█ "], ["sleep_2", " ▄▄ \n █ █ ▄█▀▄▄ \n █ ▀▄ ▀ ▀▄▀▀█ \n ▀▄ ▄▄ █ █ \n ▀▄▀▀▀▄▄▄▄█▄█▄▄\n▄▀██▄▄▄▄▄▄▄▀▄ ▄▀\n█ █▄█▄▄█ █ \n█▄▄█▄█▄▄█▄▄▄▄█ "], ["walk_1", "█▀▄ ▄▄ \n█ ▀▄▀▀▄▀▀▄ ▄▄▄ \n█ ▀ ▄ █▀ █ \n █ ▄▄▄ ▀ █ ▄▀ \n █ ▀▀▀█▀▄▀▀▀█\n▄▀▄▀▀█▀▀▀▀▄ █▄▀ \n▀▄█▀▀█▀▀▀█▄▄█ \n█▄▄█▀▀▀▀█▄▄▄▄█ "], ["walk_2", "▄▄ \n█ █ ▄█▀▄▄ \n█ ▀▄ ▀ ▀▄▄▀▀█ \n▀▄ █ █ █ \n ▀▄▀▀▀▄▄▄▄█▄▄█▄▄\n▄▀▀▄▄▄▄▄▄█▄ ▀▄▄▀\n▀▄█▄▄█▄▄▄█▄▄▄▀ \n█▄▄█▄█▄▄█▄▄▄▄█ "]]], + ["kakkinmon", [["angry", " \n \n ▄████▀▀▀▄▄ \n ▄▀▀▀▄▄▀▀▀ ▄▄▀▄\n █▄▀▄▄▄▄▄▄▀▀▄▄▄▀\n █▀▄▄▄▄▄▄▀▀██▄ \n ██▄ ▄█ ▄▀ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["attack", " ▄▄██▀▀▀▄▄ \n ▄▀█▄▄█▀▀ ▄▀▄ \n▄▀▄ ▀▀▄▄▄▄▀▀▄▄▀ \n▀▄▀▀▀▀▄▄▄▄███▄ \n ▀█▀▀ ▄█ ▀███ \n ▀██▄ ▀▄\n ███ ▄▀▀\n █▄▀▀█▄▀▄█ "], ["eat_1", " ▄▄███▀▀▀▄▄ \n ▄▀▀▀▄▄▀▀▀ ▄▀▄\n █▀▄ ▄▄▀▄▄▀\n █▄▀▀▀▀▀▀▄▄█▄ \n █ ▀▀▀▀▀▀ ▀█ \n █ ████ █ \n █ ▀▀▀▀ █ \n █▄▀▀▄█▀▄▀ "], ["eat_2", " \n ▄▄▄▄▄▄▄ \n ▄██▀▀█▄▄ ▀▀▄ \n ▄▀▄ ▀▀ ▄▄▀▀ █\n ▀█▄▀▀▀▀▀▀▄▄██▀ \n █ ▀█▀▀▀▀▄ ▀▀█ \n ▀▄▀ ▀ ▀ ▀ █ \n █▄▀▀▄█▀▄▀ "], ["happy", " ▄▄███▀▀▀▄▄ \n ▄▀▀▀▄▄▀▀▀ ▄▀▄\n █ ▀▄▄▄▄▄▄▀▀▀▄▄▀\n █▀▄▄▄▄▄▄▀▀▀█▄ \n █▄▀▄ ▄▀▄ ▀█ \n █ ▄▄▄▄▄▄ ▄▀ \n █ ▀▀▀▀ █ \n █▄▀▀▄█▀▄▀ "], ["injured_1", " \n \n ▄████▀▀▀▄▄ \n ▄▀▀▀▄▄▀▀▀ ▄▄▀▄\n █▄▀▄▄▄▄▄▄▀▀▄▄▄▀\n █▀▄▄▄▄▄▄▀▀██▄ \n █ ▄█ █▄ ▄▀ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n ▄▄▄▄▄▄ \n ▄██▀▀█▄▄ ▀▀▄ \n ▄▀▄▀▀██▀▀ ▄▀ █\n ▀▄▀▄▄▄▄▄▄▀▀▄█▀ \n █▀▄▄▄▄▄▄▀▀▀▀█ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["sleep_1", " \n \n \n ▄████▀▀▀▄▄ \n ▄▀▀▀▄▄▀▀▀ ▄▄▀▄\n █▄▀▄▄▄▄▄▄▀▀▄▄▄▀\n █▀▄▄▄▄▄▄▀▀███ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n \n ▄████▀▀▀▄▄ \n ▄▀▀▀▄▄▀▀▀ ▄▄▀▄\n █▄▀▄▄▄▄▄▄▀▀▄▄▄▀\n █▀▄▄▄▄▄▄▀▀██▄ \n █ ▄▄ ▄▄ ▄▀ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["walk_1", " \n ▄▄▄▄▄▄▄ \n ▄██▀▀█▄▄ ▀▀▄ \n ▄▀▄ ▀▀ ▄▄▀▀ █\n ▀█▄▀▀▀▀▀▀▄▄██▀ \n █ █▀▀▀▀█ ▀▀█ \n ▀▄ ▀▀ █ \n █▄▀▀▄█▀▄▀ "], ["walk_2", " \n \n ▄████▀▀▀▄▄ \n ▄▀▀▀▄▄▀▀▀ ▄▄▀▄\n █▄▀▄▄▄▄▄▄▀▀▄▄▄▀\n █▀▄▄▄▄▄▄▀▀██▄ \n █ ▀ ▄▄ ▀ ▄▀ \n ▀▄▄▄▄▄▄▄▄▄▀ "]]], + ["kapurimon", [["angry", " \n \n \n█▀▄ ▄▀█ ▄▄▄▄ \n▀▄ ██▀ ▄█▄█ ▀▀██\n██▄ ▄█ ▀███▄ █\n█ ▄▀▄ ▀██ ▀██▄▀\n ▀▄▄▄▄▄▄█▄▄▄▀▀ "], ["attack", "▄▄ ▄▄ \n█ █▄▄▄▀ █ ▄████▄\n▄█ ▀▀ ▄▀██▀ ▀██\n█ ▀▄ ▀ █▄ ▄▀\n▀█▄██▄█▄ █▀█▄▄▀ \n ███████ █▄█▀ \n██▀██▀█▀▄█ \n▀▄▄▄▄▄▄▄▀ "], ["eat_1", " \n ▄▄▄▄ \n█▀▄ ▄▀█▄▀ ▀██\n▀▄▀██▀ ▄████▄ █\n█ █ █ ▀▄ ▀███ \n█▄▄█▄▄▄ █▄▄▀▀ \n█▀██▄▄▀ ▄█ \n ▀▄▄▄▄▄▄▀ "], ["eat_2", " \n \n \n█▀▄ ▄▀█ ▄▄▄▄ \n▀▄ ██▀ █▄█ ▀▀██\n█▄▀▄ ▄▀▄ ▀██▄ █\n█ ▄▄▀▄▄ █▀██▄▀\n▀▄▄▄▄▄▄▄▄█▄▄▀▀ "], ["happy", " ▄▄▄▄ \n ▄▀▀████\n █▀▄ ▄▀█ ▀█\n ▀▄█▀▀▀█ ██▄ ▄▀\n █▀ ▀ ▀ ▀ ▀▄▀█▀ \n █▀▄▄█▄▄▀ █▄▀ \n █ ███ ▄█ \n ▀▀▄█▄█▄▄▄▀ "], ["injured_1", " \n \n \n▄▄▄ ▄▄▄ ▄▄▄▄ \n▀▄ ██▀ ▄█▄█ ▀▀██\n█▄▄ ▄▄ ▀███▄ █\n█ ▄██ ▀██▄▀\n ▀▄▄▄▄▄▄█▄▄▄▀▀ "], ["injured_2", " \n \n \n \n█▀▀▄▄▄▀▀█ ▄▄▄▄ \n▄▀ ▀▀ ▀████ ▀██\n█▀▀ ▀▀▄██ ▀█▄ █\n▀▄▄▄▄▄▄▄█▄▄██▄▄▀"], ["sleep_1", " \n \n \n █▀▄ ▄▀█ \n █▄ ▀██ ▄▀ \n █▀ ▄▄ ▄▄▄▀▀▄ \n █ ▄█ ▀█▄ █ \n ▀▄▄███▄▄▄█▄▀ "], ["sleep_2", " \n \n \n ▄▄▄▄ ▄▄▄ \n ▀▄▄ ▀██ ▄▄█ \n █▀ ▄▄▀▀▀█▄ ▀▄ \n █ ▄█▄ ▀█▄█ \n ▀▄███▄▄▄▄▄█▀ "], ["walk_1", " \n ▄▄▄▄ \n ▄▀ ▀██\n█▀▄ ▄▀████▄ █\n▀▄ ██▀ ▄█ ▀███ \n█ █ █ ▀▄▄▄▀▀ \n█ ▄▀▄▄ ▀██ \n ▀▄▄▄▄▄▄▀ "], ["walk_2", " \n \n \n▄▄▄ ▄▄▄ ▄▄▄▄ \n▀▄ ██▀ ▄█ █ ▀▀██\n█ █ █ ▀███▄ █\n█ ▄▀▄▄ ▀██ ▀██▄▀\n ▀▄▄▄▄▄▄█▄▄▄▀▀ "]]], + ["kazuchimon", [["angry", " ▄ ▄▄ ▄▄ ▄ \n▄█ ▀█▄ ▄█▀ █▄\n██ ▄▀█▀ ▀▀▄ ██\n█ █▄▀ ▄█ █ █ █\n█▄ ██▄▄▄▄▄█▄█ ▄█\n██▀▀▄▀▄ ▄▀ ▄▀▀██\n █▄▄▀▀█▀█▀▀▀▄▄█ \n ██▄███▀▀███▄██ "], ["attack", " ▄▄ ▄▄ \n ▀█▄ ▄█▀ ▄\n█ ▄▀█▀ ▀▀▄ ▄█\n█▀▄█▀ ▄█▀▄▄██ █\n█▄▀██▄▄▄▄██▀ ▄▀\n ▀█▄██▀▀ ▄▄█▀ \n█▀█▄ ▄▄█▀▀▀█▄█ \n █▄████▀▀███▄██ "], ["eat_1", " █ ▄█▀ ▀█▄ █ \n██ ▀█▄█▀▄▄ ██\n█▀▄ █ ▀ ▄▄ █ ▄▀█\n█ ▀█▄▄▄▄▀ ▄▀▄▀ █\n██▄█▀███▀█▀▀█▄█▀\n▀█ █▄█▄█▄▄█ █ \n ▀█▀▄▄▀ ▀▄▄▄▀█▀ \n █▄█▄▄█▀▀█▄▄█▄█ "], ["eat_2", " ▄ ▄▄ ▄▄ ▄ \n▄█ ▀█▄ ▄█▀ █▄\n██ ▄▀█▀ ▀▀▄ ██\n█ █▄▀ ▄▀▄ █ █ █\n█▄ ██▄▄▄▄▄█▄█ ▄█\n██▀▀▄▀▄ ▄▀ ▄▀▀██\n █▄▄▀▀█▀█▀▀▀▄▄█ \n ██▄███▀▀███▄██ "], ["happy", " █ ▄█▀ ▀█▄ █ \n██ ▀█▄█▀▄▄ ██\n█▀▄ █ ▀ ▄ █ ▄▀█\n█ ▀█▄▄▄▀ ▀▄▀▄▀ █\n██▄█▀███▀█▀▀█▄█▀\n▀█ █▄█▄█▄▄█ █ \n ▀█▀▄▄▀ ▀▄▄▄▀█▀ \n █▄█▄▄█▀▀█▄▄█▄█ "], ["injured_1", " ▄ ▄▄ ▄▄ ▄ \n▄█ ▀█▄ ▄█▀ █▄\n██ ▄▀█▀ ▀▀▄ ██\n█ █▄▀ █▄ █ █ █\n█▄ ██▄▄▄▄▄█▄█ ▄█\n██▀▀▄▀▄ ▄▀ ▄▀▀██\n █▄▄▀▀█▀█▀▀▀▄▄█▀\n ██▄███▀▀███▄██ "], ["injured_2", " ▄ ▄ \n▀▄ ▄█▀ ▀█▄ ▄▄▀\n▄█▄ ▀█▄█▀▄▄ █▄\n██ ▄█ ▀ ▄ █ ██\n█ ██▄ ▀▀▄▀ █ █\n█▄ █▀█▀▀▀█▀▀█ ▄█\n██▀▀█▄█▄█▄▄█▀▀██\n █▄▄█▄█▄█▄▄█▄▄█ "], ["sleep_1", " \n █ ▄█▀ ▀█▄ █ \n██ ▀█▄█▀▄▄ ██\n█▀▄ █ ▀ █ ▄▀█\n█ ▀██▀ ▀▀▄▀▄▀ █\n██▄█▀█▀▀▀█▀▀█▄██\n▀█ █▄█▄█▄▄█ █▀\n ███▄▄█▄█▄▄▄███ "], ["sleep_2", " ▄ ▄▄ ▄▄ ▄ \n▄█ ▀█▄ ▄█▀ █▄\n██ ▄▀█▀ ▀▀▄ ██\n█ █▄█▄ ▄▄ █ █ █\n█▄ ██▄▄▄▄▄█▄█ ▄█\n██▀▀▄▀▄ ▄▀ ▄▀▀██\n █▄▄▀▀█▀█▀▀▀▄▄█ \n ██▄███▀▀███▄██ "], ["walk_1", " █ ▄█▀ ▀█▄ █ \n██ ▀█▄█▀▄▄ ██\n█▀▄ █ ▀ ▄▄ █ ▄▀█\n█ ▀█▄ ▀▀ ▄▀▄▀ █\n██▄█▀█▀▀▀█▀▀█▄█▀\n▀█ █▄█▄█▄▄█ █ \n ▀█▀▄▄▀ ▀▄▄▄▀█▀ \n █▄█▄▄█▀▀█▄▄█▄█ "], ["walk_2", " ▄ ▄▄ ▄▄ ▄ \n▄█ ▀█▄ ▄█▀ █▄\n██ ▄▀█▀ ▀▀▄ ██\n█ █▄▀ ▄█▀ █ █ █\n█▄ ██▄▄▄▄▄█▄█ ▄█\n██▀▀▄▀▄ ▄▀ ▄▀▀██\n █▄▄▀▀█▀█▀▀▀▄▄█ \n ██▄███▀▀███▄██ "]]], + ["keemon", [["angry", " \n \n ▄▄ ▄▄ \n ███████ \n █▀██▀ ███ \n █▀█▀█▀▀██ \n ▀▄ ▄ ▄ █▀ \n ▀▀▀▀▀ "], ["attack", " \n \n \n \n ▄██▄▄██ \n ▄████▀██▄ \n █▄██▄▄███ \n ▀█▄▄███▀ "], ["eat_1", " \n \n \n \n ▄██▄▄██ \n ▄████▀██▄ \n █▄██▄█▄██ \n ▀█▄▄███▀ "], ["eat_2", " \n \n \n ▄██▄▄██ \n ▄▀███▀██▄ \n █▄███▄███ \n ██ ████▀ \n ▀█▄▄███▀ "], ["happy", " \n \n ▄▄ ▄▄ \n ███████ \n █▀██▀▄▀██ \n ██▀▀▀▀███ \n ▀█▄ ▄██▀ \n ▀▀▀▀▀ "], ["injured_1", " \n \n \n \n ▄▄ ▄▄ \n ███████ \n █▀██ ▀███ \n █████████ "], ["injured_2", " \n \n \n \n \n ▄██▄▄██ \n ▄███▀███▄ \n ▄█▄██▄▄███▄ "], ["refuse", " \n \n \n \n ▄██▄▄██ \n ▄████▀██▄ \n █▄██▄▄███ \n ▀█▄█▄█▄█▀ "], ["sleep_1", " \n \n \n \n ▄▄ ▄▄ \n ███████ \n █▀██▀▀███ \n █████████ "], ["sleep_2", " \n \n \n \n \n ▄██▄▄██ \n ▄███████▄ \n █▄██▄▄███ "], ["walk_1", " \n \n \n \n ▄██▄▄██ \n ▄████▀██▄ \n █▄██▄▄███ \n ▀█▄▄███▀ "], ["walk_2", " \n \n \n \n ▄▄ ▄▄ \n ███████ \n █▀██▀ ███ \n █████████ "]]], + ["kendogarurumon", [["angry", " ▄▄ ▄▄▄ \n █▄▀▀▀██ █ \n▄█▄▄ ██ █▄▄▄ \n█▄█▄▄▄▄ █▀ ▄█▄ \n▀███████ █▀▀▄▄▄█\n █▀▀▀▀▀▀ █ █ ▀▄ \n ▄▀▀▀█▀▀▀▄▄██▀ █\n█▄█▄█▄█▄▄█ █▄█▄█"], ["attack", " ▄▀█▄▄▄█▀█ \n █▀ ▄▄ █ \n▄█▄▄ ██ ▄█▄▄▄ \n█ ▀ ▄█ ▄█▄ \n █▀▀▀▀█▀ █▀▀▄▄▄█\n ▄▀▀▄█▄▄▄▀ █ ▀▄ \n█ █ ▄██▄▄██▀ █\n ▀▀▀▀▀▀ ▀█▄█▄█"], ["eat_1", " \n ▄▄ ▄▄▄ \n █▄▀▀▀▀▀ █▄▄▄ \n ▄▀ ▄▀▄ █ ▄█▄ \n█▀█▀ █▀▀█▄▄█\n▀▄▄▄▄▄▄▄▀█ █ ▀▄ \n ▄▀ ▀█▀▀▀▄▄██▀ █\n█▄█▄█▄█▄▄█ █▄█▄█"], ["eat_2", " ▄▄ ▄▄▄ \n █▄▀▀▀██ █ \n▄█▄▄ ██ █▄▄▄ \n█▄█▄▄▄▄ █▀ ▄█▄ \n▀███████ █▀▀▄▄▄█\n █▀▀▀▀▀▀ █ █ ▀▄ \n ▄▀▀▀█▀▀▀▄▄██▀ █\n█▄█▄█▄█▄▄█ █▄█▄█"], ["happy", " ▄▄ ▄▄▄ \n █▄▀▀▀▀▀ █ \n▄█▄▄ ▄▀▄ █▄▄▄ \n█▄█▄▄▄▄ █▀ ▄█▄ \n▀███████ █▀▀▄▄▄█\n █▀▀▀▀▀▀ █ █ ▀▄ \n ▄▀▀▀█▀▀▀▄▄██▀ █\n█▄█▄█▄█▄▄█ █▄█▄█"], ["injured_1", " \n \n ▄▀█▄▄▄█▀█▄▄▄ \n █▀ █ ▄█▄ \n▄█▄▄ █▄ ▄█▀▄▄▄█\n█ ▀ ▄█ █ ▀▄ \n █▀▀▀█▀▀▀▄ ██▀ █\n█▄█▄█▄█▄▄█▄█▄█▄█"], ["injured_2", " \n \n ▄▄ ▄▄▄ \n █▄▀▀▀▀▀ █▀▀█ \n ▄▀ ▄ █▄▀▀▀▄\n█▀█▀ ▀▀ █▀▄▀█▀▀\n▀▄▄▄▄▄▄▄█▀ █▄▄▀▄\n█▄█▄█▄█▄▄█▄█▄█▄█"], ["refuse", " \n ▄▄ ▄▄▄ \n █▄▀▀▀▀▀ █▄▄▄ \n ▄▀ ▄█ █ ▄█▄ \n█▀█▀ █▀▀▄▄▄█\n▀▄▄▄▄▄▄▄▀█ █ ▀▄ \n ▄▀ ▀█▀▀▀▄▄██▀ █\n█▄█▄█▄█▄▄█ █▄█▄█"], ["sleep_1", " \n ▄▄ ▄▄▄ \n █▄▀▀▀▀▀ █▄▄▄ \n ▄▀ ▄▄ █ ▄█▄ \n█▀█▀ █▀▀▄▄▄█\n▀▄▄▄▄▄▄▄▀█ █ ▀▄ \n ▄▀ ▀█▀▀▀▄ ██▀ █\n█▄█▄█▄█▄▄█▄█▄█▄█"], ["sleep_2", " \n \n ▄▀█▄▄▄█▀█▄▄▄ \n █▀ █ ▄█▄ \n▄█▄▄ ▀▀ ▄█▀▄▄▄█\n█ ▀ ▄█ █ ▀▄ \n █▀▀▀█▀▀▀▄ ██▀ █\n█▄█▄█▄█▄▄█▄█▄█▄█"], ["walk_1", " ▄▄ ▄▄▄ \n █▄▀▀▀▀▀ █ \n ▄▀ ▄█▀ █▄▄▄ \n█▀█▀ ▀▀ █▀ ▄█▄ \n▀▄▄▄▄▄▄▄▀█▀▀▄▄▄█\n ▀▄▄ ▄▀ █ █ ▀▄ \n ▄▀ ▀█▀▀▀▄▄██▀ █\n█▄█▄█▄█▄▄█ █▄█▄█"], ["walk_2", " ▄▀█▄▄▄█▀█ \n █▀ ▄▄ █ \n▄█▄▄ ██ ▄█▄▄▄ \n█ ▀ ▄█ ▄█▄ \n █▀▀▀▀█▀ █▀▀▄▄▄█\n ▄▀▀▄█▄▄▄▀ █ ▀▄ \n█ █ ▄██▄▄██▀ █\n ▀▀▀▀▀▀ ▀█▄█▄█"]]], + ["kentaurosmon", [["angry", "▄▀█▄▀▄▄▄▄▄▀▄▄▄█▀\n▄ █▄█ ▄▄ █ ▄▄█ \n▄▀▀█▄▀▀▄█▀█▀ ▄▄█\n█▀▀▄█▄▄▄▀█▀█▀ ▀▄\n▀▄ ▄▄█▄▄█▄▀█▀▀▄█\n█ █▄▄▀ ▀▄▄██▄▄▀▄\n █▄█ ▄ █▄ ▄▀▄▀\n█▄▄▄█▄▄▄▄█▄█▄█▄█"], ["attack", " ▀█▄ ▄▄▄▄▄ ▄▄▄█▀\n ▀▄█ ▄▄ █ ▄▀ \n ▄▀█▄▀▀▄██▀█▀▀▄ \n█▄▄▀▄▄▄▄▀▄█ ▄▄█\n█ █▄ ▄▀██▀ █\n▀▄▀█▀▄▀███▄█▀▀▄▀\n ▄██▄█▄█ ▄ █▀█ \n█▄▄█▀▀▀▀▀▄█▄█▄█ "], ["eat_1", " ▄ ▄▄▀▀▀▀▀▄▀▀▄ ▄\n ▀█▄▀▄▄▀█▄█▄▄▄▀▀\n▄▀▀█▀ ▀█▀▄▀ ▀▄\n▀██ ▀▀▀▀ ██▄▄▀█▀\n█ ▀█▄ ▄▄█▄▀█ █\n█ ▄█ █ █▄▄██▄▄ █\n ▀▄█████▄ ▄█▄▄█ \n █▄▄█▀▀▀▄█▄█▄█ "], ["eat_2", " ▄ ▄▄▀▀▀▀▀▄▀▀▄ ▄\n ▀█▄▀▄▄▀█▄█▄▄▄▀▀\n▄▀▀█▀ ▀█▀▄▀ ▀▄\n▀██ ▀▀▀▀ ██▄▄▀█▀\n█ ▀█▄ ▄▄█▄▀█ █\n█ ▄█ █ █▄▄██▄▄ █\n ▀▄█████▄ ▄█▄▄█ \n █▄▄█▀▀▀▄█▄█▄█ "], ["happy", " ▄ ▄▄▀▀▀▀▀▄▀▀▄ ▄\n ▀█▄▀▄▄▀█▄█▄▄▄▀▀\n▄▀▀█▀ ▀█▀▄▀ ▀▄\n▀██ ▀▀▀▀ ██▄▄▀█▀\n█ ▀█▄ ▄▄█▄▀█ █\n█ ▄█ █ █▄▄██▄▄ █\n ▀▄█████▄ ▄█▄▄█ \n █▄▄█▀▀▀▄█▄█▄█ "], ["injured_1", " ▄ ▄▄▀▀▀▀▀▄▀▀▄ ▄\n ▀█▄▀▄▄▀█▄█▄▄▄▀▀\n▄▀▀█▀ ▀█▀▄▀ ▀▄\n▀██ ▀▀▀▀ ██▄▄▀█▀\n█ ▀█▄ ▄▄█▄▀█ █\n█ ▄█ █ █▄▄██▄▄ █\n ▀▄█████▄ ▄█▄▄█ \n █▄▄█▀▀▀▄█▄█▄█ "], ["injured_2", " \n \n▀█▄ ▄▄▄▄▄ ▄▄▄█▀ \n ▀▄▀ █ ▄█ \n▄▀▀▄ ▄████▀ ▀▄\n█▀▀▄▀▀▀ ▄▀█▄▄▀█▀\n█ ▄▄██▀▀█▀█▄▄ ██\n▀█▄▄█▄██▀▄█▄▄█▄█"], ["refuse", " ▄ ▄▄▀▀▀▀▀▄▀▀▄ ▄\n ▀█▄▀▄▄▀█▄█▄▄▄▀▀\n▄▀▀█▀ ▀█▀▄▀ ▀▄\n▀██ ▀▀▀▀ ██▄▄▀█▀\n█ ▀█▄ ▄▄█▄▀█ █\n█ ▄█ █ █▄▄██▄▄ █\n ▀▄█████▄ ▄█▄▄█ \n █▄▄█▀▀▀▄█▄█▄█ "], ["sleep_1", " ▄ ▄▄▀▀▀▀▀▄▀▀▄ ▄\n ▀█▄▀▄▄▀█▄█▄▄▄▀▀\n▄▀▀█▀ ▀█▀▄▀ ▀▄\n▀██ ▀▀▀▀ ██▄▄▀█▀\n█ ▀█▄ ▄▄█▄▀█ █\n█ ▄█ █ █▄▄██▄▄ █\n ▀▄█████▄ ▄█▄▄█ \n █▄▄█▀▀▀▄█▄█▄█ "], ["sleep_2", " ▄ ▄▄▀▀▀▀▀▄▀▀▄ ▄\n ▀█▄▀▄▄▀█▄█▄▄▄▀▀\n▄▀▀█▀ ▀█▀▄▀ ▀▄\n▀██ ▀▀▀▀ ██▄▄▀█▀\n█ ▀█▄ ▄▄█▄▀█ █\n█ ▄█ █ █▄▄██▄▄ █\n ▀▄█████▄ ▄█▄▄█ \n █▄▄█▀▀▀▄█▄█▄█ "], ["walk_1", " ▄ ▄▄▀▀▀▀▀▄▀▀▄ ▄\n ▀█▄▀▄▄▀█▄█▄▄▄▀▀\n▄▀▀█▀ ▀█▀▄▀ ▀▄\n▀██ ▀▀▀▀ ██▄▄▀█▀\n█ ▀█▄ ▄▄█▄▀█ █\n█ ▄█ █ █▄▄██▄▄ █\n ▀▄█████▄ ▄█▄▄█ \n █▄▄█▀▀▀▄█▄█▄█ "], ["walk_2", " ▀█▄ ▄▄▄▄▄ ▄▄▄█▀\n ▀▄█ ▄▄ █ ▄▀ \n ▄▀█▄▀▀▄██▀█▀▀▄ \n█▄▄▀▄▄▄▄▀▄█ ▄▄█\n█ █▄ ▄▀██▀ █\n▀▄▀█▀▄▀███▄█▀▀▄▀\n ▄██▄█▄█ ▄ █▀█ \n█▄▄█▀▀▀▀▀▄█▄█▄█ "]]], + ["kentaurosmon_x", [["angry", "▄▄ ▄▄▄▄▄ \n▀▄▀▄▀▀▄▄▀ █▀█ \n ▄▀ ▄█ █ █▀▀ \n█ ▄▄█▄█▄█▄▄▄▄ \n ▀█▀▀▄ ▀▄ █▄ █▄█\n▄█ ▀▀▄█ █ █▀▄\n█▄████▄███████▄█\n█▄▄█▀▀█▄▄█▄▄█▄▄█"], ["attack", " ▄▀█▄ ▄▄▀▀█▀█▄▄\n █ █▀▄▀ ▄▀█ ▄█▄▀\n █ █▀ ▀▀▄█▄▀ \n ███▄▄▄█▀▀▄ █▄▀▄\n▀▄▄▄▄▄▄█▄▄▄▄▀█▄▀\n █▀█▄▄▄▄██ ▄█ █\n █ ▀▄█▄▄█▄██▄▄█▀\n ▀▄██▄▄█▄▄█▄▄█ "], ["eat_1", "█▀▄ ▄▄▀▀█▀█▄▄ \n ▀▄▀ ▀█ ▄█▄▀ \n▄▀ ▀▀▄█▄▀▄ \n▀████▄ █▀██▀▄▀▀▄\n███▄▄▀ █▄ █▄ █▄▀\n██▄▄▄▄▀█▄▄█▄▄█ █\n █▄██▄▄█▄▄█▄▄█▀\n █▄▄██▄▄█▄▄█▄▄█ "], ["eat_2", "▄▄ ▄▄▄▄▄ \n▀▄▀▄▀▀▄▄▀ █▀█ \n ▄▀▄▀▄ █ █▀▀ \n█ ▄▄█▄█▄█▄▄▄▄ \n ▀█▀▀▄ ▀▄▄▀▄▄▀▄█\n▄█ ▀▀▄██ █ █▄\n█▄████▄█████████\n█▄▄█▀▀█▄▄█▄▄█▄▄█"], ["happy", "█▀▄ ▄▄▀▀█▀█▄ \n ▀▄▀▄ ▀█ █▄▄▀ \n▄▀ ▀ ▀▄▀▄█ █ \n▀▄▄▄█▀▀██ ▄█▀▀▄\n ▄▀ ▄█ ▄█▄██ █▄▀\n▄▀▄▄▄▄▀██▀█▄▄█ █\n▀▀█▄██▄▄█▄▄█▄▄█▀\n █▄▄██▄▄█▄▄█▄▄█ "], ["injured_1", " \n▄▄ ▄▄▄▄▄ \n▀▄▀▄▀▀▄▄▀ █▀█ \n ▄▀ █▄ █ █▀▀ \n█ ▄▄██▀██▀▄▀▀▄\n █▀▀█▄ █▄ █▄ █▄▀\n▄▀▄▄▄▄▀█▄▄█▄▄█ █\n▀██▄██▄▄█▄▄█▄▄█ "], ["injured_2", " \n \n█▀▄ ▄▄▀▀█▀█▄▄ \n ▀▄▀▄ ▀█ ▄█▄▀ \n▄▀ ▀▀▄█▀██▀▄▀▀▄\n▀▄▄▄█▀▀█▄ █▄ █▄▀\n▄▀▄▄▄▄▀█▄▄█▄▄█ █\n▀██▄██▄▄█▄▄█▄▄█ "], ["sleep_1", " \n▄▄ ▄▄▄▄▄ \n▀▄▀▄▀▀▄▄▀ █▀█ \n ▄▀ ▄▄ █ █▀▀ \n█ ▄▄▀█▀▀█▀▀█▀▄\n █▀▀█▄ ▄█▄ █▄ █▀\n██▄▄▄▄█▀█▄▄█▄▄██\n█▄▄████▄▄█▄▄█▄▄█"], ["sleep_2", " \n█▀▄ ▄▄▀▀█▀█▄▄ \n ▀▄▀ ▀█ ▄█▄▀ \n▄▀ ▀▀▄▀▄▀▄ \n▀▄▄▄█▀▀█▀▀█▀▀█▀▄\n ▄▀ ▄▄ ▄█▄ █▄ █▀\n██▄▄▄▄█▀█▄▄█▄▄██\n█▄▄████▄▄█▄▄█▄▄█"], ["walk_1", "█▀▄ ▄▄▀▀█▀█▄▄ \n ▀▄▀ ▄▀█ ▄█▄▀ \n▄▀ ▀▀▄▀▄▀▄ \n▀▄▄▄█▀▀█▀██▀▄▀▀▄\n ▄▀ ▄█ █▄ █▄ █▄▀\n▄▀▄▄▄▄▀█▄▄█▄▄█ █\n▀▀█▄██▄▄█▄▄█▄▄█▀\n █▄▄██▄▄█▄▄█▄▄█ "], ["walk_2", "▄▄ ▄▄▄▄▄ \n▀▄▀▄▀▀▄▄▀ █▀█ \n ▄▀ ▄█ █ █▀▀ \n█ ▄▄█▄█▄█▄▄▄▄ \n ▀█▀▀▄ ▀▄ ▀▄ ▀▄█\n▄█ ▀▀▄██▀ █▀ █▄\n█▄████▄▄████████\n█▄▄█▀▀█▄▄█▄▄█▄▄█"]]], + ["keramon_x", [["angry", " ▄ ▄ \n▄ █ ▄▄▄▄▄ ▄▀ █ \n█ ▄▀ █ █ ▀▄ ▄▀ \n █ ▄█▄ ▀▀█▄▀▀█\n █▀▀ ▀▀▀█▄▄▀▀█\n ▀▄█▄▄█▄█▄▄▄▀▀█\n ▄▄█ █▄█ █▄▄ ▀▀▀\n█▄▄▄▀ ▀▄▄▄█ "], ["attack", "▄ █ ▄▄▄▄ ▄▀▀ \n█ ▄▀█ █ ▀▄ ▄▀ \n █ ██ ▄▄█▀ ▄▄\n █ ████▄ █▀▀▄█\n ███▀▀▀███▄▀▀▀▄█\n ▀▄ ▄ ▄ ▄█▀█▀▄█\n▄▀ █▀▀▀▀▀▄▀ █ \n▀▄▄▀ ▀▄▄▀ "], ["eat_1", " █ ▄▄▄▄▄ ▄▀▀▀ \n█ ▄▀ █ ▀ ▀▄ ▄▀▀ \n █ ▄███▄ ▄█ ▄▄\n ▀▄██████▄ █▄▀▄█\n ▄▀█████▀▀▀█▄▀▄█\n▄▀▄ ▄ ▄ ▄▀▄ ▀▄▀\n▀▄ █▀██▀█ ▄▀▀▀ \n ▀▄▀ ▀▄▀ "], ["eat_2", " ▄ ▄▄▄ \n▄ ▀▄▀█▀█▀▄▀ ▄▄ \n▀▄▀ █ ▄█▄▀ \n █ ▄███▄ ▀█▄▀▄ \n █▀ ▀▀█▄▄▀▄█\n ▀▄█▄▄█▄█▄▄▄▀▄█\n ▄▄█ ██ █▄▄ ▀▄█\n█▄▄▄▀ ▀▄▄▄█ "], ["happy", " ▀▀▄▄▄▄▄▄ ▄▀▀▀ \n▀▄▀ █ ▀█ ▀▄ ▄▀▀ \n▄▀ ██ ▄▄█ ▄▀█\n█ ▄████▄▄ ▀██▄▀█\n▀█▀ ▀▀█ █▀█\n█ ▀▄█▄▄█▄▀█▄ █▀ \n▀▄ █▀▄▀▄▀▀▄▄▀ \n ▀▀▀ "], ["injured_1", " \n █ ▄▄▄▄▄ ▄▀▀▄▄ \n█ ▄▀ █ ▀▄ \n █ ▄███▄ █▀▄ \n █▀▀ ▀▀▀█▀▄▀▄ \n ▀▄▄▄▄▄▄▀█ █ █ \n ▄▀▄█ █ █ █▄▀▄\n █▄█▄▄▀ █▄█▄█▄█"], ["injured_2", " \n \n ▀▀▄▀█▀▀▀▄▀▀▄ \n▀▄▀ █ ▀▄▄ \n █▄▄▀▀▀▄▄▄ █▄▀▄ \n ▀▄ ▄█ █ █ \n █▀██▀█ █ █▄▀▄\n █▄█▄▄▀ █▄█▄█▄█"], ["sleep_1", " \n █ ▄▄▄▄▄ ▄▀▀▀ \n█ ▄▀█ ▀▀ ▀▄ ▄▀▀ \n █ █▄ █ █▄ \n █▄▀▀▀▀▄▄▄▄█ ▀▄ \n ▀▄▄ ▄▄ ▄█ █ █ \n ▀▀▀▀▀▀ █▄▀▄▀▄\n █▄█▄█▄█"], ["sleep_2", " ▄ ▄▄▄ \n▄ ▀▄█▀██▀▄▀ ▄▄ \n▀▄▀ █▄ ▄▀▄▀ \n █ ▄██▄ ▀ █▄ \n ██▀▀▀▀██▄▄█ ▀▄ \n ▀▄▄ ▄▄ ▄█ █ █ \n ▀▀▀▀▀▀ █▄▀▄ █\n █▄█▄█▄█"], ["walk_1", " █ ▄▄▄▄▄ ▄▀▀▀ \n█ ▄▀ █ ▀ ▀▄ ▄▀▀ \n █ ▄███▄ ▄█ ▄▀█\n ██▀▀▀▀▀█▄▄▀▀▄▀█\n ▀▄ ▄ ▄ ▄▀▀▀▄▀█\n ▀▀▀█▀█▀█▀▄▄▀ \n ▄▄▀▄█ █ \n █▄▄█▄▄▄▀ "], ["walk_2", " ▄ ▄▄▄ \n▄ ▀▄▀█▀█▀▄▀ ▄▄ \n▀▄▀ ▄█▄ ▀▄▀ \n █▄█████▄ ▀█▀▀▄ \n █▀ ▀▀█▄▄▀▄█\n ▀▄█▄▄█▄█▄▄▄▀▄█\n ▄▄▀▄█ █ ▀▄█\n █▄▄█▄▄▄▀ "]]], + ["ketomon", [["angry", " \n \n ▄▄▄ \n ▄▀ ▄▀ \n ▄▀ ▀▀▄ \n ▄▀▄ ▀ ▄ █▄▄▄ \n █ ▀▀ ▀▀ ▀▄▄▀ \n ▀▄▄▄▄▄▄▀▀▀ "], ["attack", " \n ▄▀█ \n ▄▀ █ \n ▄▀ ▀▄ ▄▄ \n ▄▀▄ ▀ ▄ █▀▄▀ \n █ ▀▀ ▀▀ █▄▀ \n █ ████ █ \n ▀▄████▄▀ "], ["eat_1", " \n \n ▄▄▄ \n ▄▀ ▄▀ \n ▄▀ ▀▀▄ \n ▄▀▄ ▀ ▄ █▄▄▄ \n █ ▀▄▄▄▀ ▀▄▄▀ \n ▀▄███▄▄▀▀▀ "], ["eat_2", " \n \n ▄▄▄ \n ▄▀ ▄▀ \n ▄▀ ▀▀▄ \n ▄▀▄ ▀ ▄ █▄▄▄ \n █▀ ▀ ▀ ▀ ▀▄▄▀ \n ▀▄▄▄▄▄▄▀▀▀ "], ["happy", " \n ▄▄▄ \n ▄▀ ▄▀ \n ▄▀ ▀▀▄ \n ▄▀▄ ▀ ▄ █▄▀█ \n █▀ ▀ ▀ ▀ ▀▄▀ \n ▀▄███▄▄▀▀ \n ▀▀▀ "], ["injured_1", " \n \n \n ▄▀▀█ \n █ █▄ \n ▄▀ ▄ ▀▄ \n █ ▄█ █▄ █▀▀█ \n ▀▄▄▄▄▄▄▄▄▄█▀ "], ["injured_2", " \n \n \n ▄▄▄ \n ▄▀ ▄▀ \n ▄▀ ▀▀▄ \n ▄▀ ▄▀▄ █▄▄▄ \n ▀▄██▄██▄▄▄█▄▀ "], ["sleep_1", " \n \n ▄▄▄ \n ▄▀ ▄▀ \n ▄▀ ▀▀▄ \n ▄▀ ▀ █▄▄▄ \n █▀▀ ▀▀ ▀▄▄▀ \n ▀▄▄▄▄▄▄▀▀▀ "], ["sleep_2", " \n \n \n ▄▀▀█ \n █ █▄ \n ▄▀ ▄ ▀▄ \n █▄▄ ▄▄ █▀▀█ \n ▀▄▄▄▄▄▄▄▄▄█▀ "], ["walk_1", " \n \n ▄▄▄ \n ▄▀ ▄▀ \n ▄▀ ▀▀▄ \n ▄▀▄ ▀ ▄ █▄▄▄ \n █ ▀ ▀ ▀▄▄▀ \n ▀▄▄▄▄▄▄▀▀▀ "], ["walk_2", " \n \n \n ▄▀▀█ \n █ █▄ \n ▄▀ ▄ ▀▄ \n █ █ █ █▀▀█ \n ▀▄▄▄▄▄▄▄▄▄█▀ "]]], + ["kimeramon", [["angry", " ▄ ▄▄ \n ██▄██████▄ ▄▄\n ▀████▀ ███▀▄▀ █\n █▀▀▀█▀██▄▀ ▄▀\n ▀█▄ ▀ ██▄▀▀█\n ▄▀▀█▄ █▀██▄▄▀ \n ▀▄█▄ ▀▄ █▀▀ ▀▄ \n █▄▄▄▄████▄▄▄▄█ "], ["attack", " █▄ ▄▄▄██▄ \n ██████▀███▄ ▄▀█\n ████▄▄██▀▄▀ █\n ▀▄▄▀▀ ▀▀█▄ ▄█▄\n█▀▀▀█▀ █▀██ ▄▀\n▀▄▄▄▀▀▄ ▄█▀█▀ \n █▄ █▀▄▄ █ \n █▄▄▄█▀█▄▄▄▄█ "], ["eat_1", " █▄ ▄▄▄██▄ \n █████▀▀▀██▄ ▄▀█\n ███▄█▄██▀▄▀ █\n ▀▄▄▄▀ █▀█▄ ▄█▄\n ▄▀██ █▄▄██▀ ▄▀\n █▀█▄▄█ ▀▄█▀█▀ \n ▀█▄ ▀▀▄▄ █ \n █▄▄▄█▀█▄▄▄▄█ "], ["eat_2", " ▄ ▄▄ \n ██▄██████▄ ▄▄\n ▀███▀▄▀███▀▄▀ █\n █▀▀▀█▀██▄▀ ▄▀\n ▀█▄ ▀ ██▄▀▀█\n ▄▀▀█▄ █▀██▄▄▀ \n ▀▄█▄ ▀▄▄█▀▀ ▀▄ \n █▄▄▄▄█▀█▄▄▄▄▄█ "], ["happy", " █▄ ▄▄▄██▄ \n █████▀████▄ ▄▀█\n ███▄█▄██▀▄▀ █\n ▀▄▄▄▀ █▀█▄ ▄█▄\n ▄▀██ █▄▄██▀ ▄▀\n █▀█▄▄█ ▀▄█▀█▀ \n ▀█▄ ▀▀▄▄ █ \n █▄▄▄█▀█▄▄▄▄█ "], ["injured_1", " ▄ ▄▄ \n ██▄██████▄ \n ▀███ ▀████▀ ▄▄\n █▀▀▀█▀██▄▄▀▀ █\n ▀█▄ ▀ █ ▄▄█▄\n ▄▀▀█▄ █▀██▄▄▄▀\n ▀▄█▄ ▀▄ █▀▀ ▀▄ \n █▄▄▄▄████▄▄▄▄█ "], ["injured_2", " \n █▄ ▄▄▄██▄ \n ████▀█████▄ \n ███▄▄███▀ ▄▄▀█\n ▀▄▄ ▀ █▀█▀ ▄▀\n ▄▄█▀ ▄▄█▄▀▀▀█\n █▄▄█▀▄ ▀▄█▀▀▀█ \n █▄▄▄▄████▄▄▄▄█ "], ["sleep_1", " \n █▄ ▄▄▄██▄ \n ██████████▄ ▄▀█\n ███▄▄███▀▄▀ █\n ▀▄▄ ▀ █▀█▄ ▄█▄\n ▄▄█▀ ▄▄██▀ ▄▀\n █▄▄█▀▄ ▀▄█ ▀▀▄ \n █▄▄▄▄███▄▄▄▄▄█ "], ["sleep_2", " ▄ ▄▄ \n ██▄██████▄ ▄▄\n ▀███▀▀████▀▄▀ █\n █▀▀▀█▀██▄▀ ▄▀\n ▀█▄ ▀ ██▄▀▀█\n ▄▀▀█▄ █▀██▄▄▀ \n ▀▄█▄ ▀▄▄█▀▀ ▀▄ \n █▄▄▄▄█▀█▄▄▄▄▄█ "], ["walk_1", " █▄ ▄▄▄██▄ \n █████▀▀▀██▄ ▄▀█\n ███▄█▄██▀▄▀ █\n ▀▄▄ ▀ █▀█▄ ▄█▄\n ▄▄█▀ ▄▄██▀ ▄▀\n █ ▄▀▀▄ ▀▄█▀█▀ \n ▀█▄ ▀▀▄▄ █ \n █▄▄▄█▀█▄▄▄▄█ "], ["walk_2", " ▄ ▄▄ \n ██▄██████▄ ▄▄\n ▀███▀▄ ▄██▀▄▀ █\n █▀▀▀█▀██▄▀ ▄▀\n ▀█▄ ▀ ██▄▀▀█\n ▄▀▀█▄ █▀██▄▄▀ \n ▀▄█▄ ▀▄▄█▀▀ ▀▄ \n █▄▄▄▄█▀█▄▄▄▄▄█ "]]], + ["kingetemon", [["angry", " ▄▄█▄▄ \n █ █▀█ █ \n ▄▄▄▀▀▀▀▀▄▄▄ \n █ █▀███▀█▄█▄▀▄ \n ▀▄███▀████▀ ▄▀ \n █ ▀▄▀▀█ █▀█▄ \n █▄▄█▀██▄▄▄▄███▄\n █▄█▄▄▄█▄▄█▀▀ "], ["attack", " ▄▀███▀▄ \n ▀▄█▄█▄▀ \n ▄▀██▄▄▄▄▄▀█▀▄ \n █ █▄█▀█▄███▀ █ \n ▄██▄▄█▄▄ █▄▄█ \n▀▄ █████▀ █▀ ▄▀ \n ▀▀█▄▄▄▄▀█████▄\n █▄█▄▄▄█▄▄█▀▀ "], ["eat_1", " ▄▄█▄▄ \n █ █▀█ █ \n ▄▄▄▀▀▀▀▀▄▄▄ \n █ █▀███▀█▄█▄▀▄ \n ▀▄▀▀▀ ▀▀▀█▀ ▄▀ \n ▄▀██████ █▀▀▄ \n ▀█▄█▄▄▄▄▀▄▄███▄\n █▄█▄▄▄█▄▄█▀▀ "], ["eat_2", " ▄ \n ▄▀███▀▄ \n ▀▄█▄█▄▀ \n ▄▀██▄▄▄▄▄▀█▀▄ \n █ █▄███▄███▀ █ \n ▀█▀▀▄▀▀▀█▄▄▀ \n ▄▀ █▄▄▄▄█▀ ██▄ \n ▀▄██▄██▄█▄████▀"], ["happy", " ▄▄█▄▄ \n █ █▀█ █ \n ▄▄▄▀▀▀▀▀▄▄▄ \n █ █▀███▀█▄█▄▀▄ \n ▀▄▀▀▀ ▀▀▀█▀ ▄▀ \n ▄▀█████▀▄█▀▀▄ \n ▀█▄█▄▄▄█▀▄▄███▄\n █▄█▄▄▄█▄▄█▀▀ "], ["injured_1", " ▄ \n ▄▀███▀▄ \n ▀▄█▄█▄▀ \n ▄▀██▄▄▄▄▄▀█▀▄ \n █ █▀██▀████▀ █ \n ▀█▀▀▄▀▀▀█▄▄▀ \n ▄▀ █▄▄▄▄█▀ ██▄ \n ▀▄██▄██▄█▄████▀"], ["injured_2", " \n ▄▄█▄▄ \n █ █▀█ █ \n ▄▄▄▀▀▀▀▀▄▄▄ \n █ ███████▄█▄▀▄ \n ▀▄█▄█▀▄███▀ ▄▀ \n ▄█▀█▄█▄▄██▀██▄ \n ▀▄▄█▄██▄█▄▄███▀"], ["sleep_1", " \n ▄▄█▄▄ \n █ █▀█ █ \n ▄▄▄▀▀▀▀▀▄▄▄ \n █ ███████▄█▄▀▄ \n ▀▄█▄▄▀▄▄██▀ ▄▀ \n ▄▀▄▄█▄▄▄▀▀██▄ \n █▄▄█▄██▄██▄▄██▀"], ["sleep_2", " ▄ \n ▄▀███▀▄ \n ▀▄█▄█▄▀ \n ▄▀██▄▄▄▄▄▀█▀▄ \n █ █▀▀█▀▀███▀ █ \n ▀█▀▀▄▀▀▀█▄▄▀ \n ▄▀ █▄▄▄▄█▄ ▀█▄ \n ▀▀██▄██▄██████▀"], ["walk_1", " ▄▄█▄▄ \n █ █▀█ █ \n ▄▄▄▀▀▀▀▀▄▄▄ \n █ █▀███▀█▄█▄▀▄ \n ▀▄███▀████▀ ▄▀ \n ▄▀▄ ▀ ▄▀▀█▄ \n █▄▄█▀██▀▀█▄▄██▄\n █▄█▄▄▄█▄▄█▀▀ "], ["walk_2", " ▄ \n ▄▀███▀▄ \n ▀▄█▄█▄▀ \n ▄▀██▄▄▄▄▄▀█▀▄ \n █ █▄███▄███▀ █ \n ▀█▀▀▄▀▀▀█▄▄▀ \n ▄▀ █▄▄▄▄█▄ ▀█▄ \n ▀███▄██▄▄█████▀"]]], + ["kiwimon", [["angry", " ▄████▄ \n ███▀▄███ \n▄▀▀▀▀ ██████▄ \n▀▀▀▀▀█▀███▀█ █▄ \n ▀▀█▄▄█ █▄██▀█ \n █ █▀█▀█ █▄█ \n ▄▀█▄█▄█▀█▀ \n █▀█▀█ █▀█▀█"], ["attack", " ▄▄▄▄▀██▀▀█▄▀ \n█▄▄▄▄▄█▄▄███ \n █ ████▀█▄▄▀▄\n ▄▀ ▄██ █▄█ ██▄\n ▀▀▀▀██▀█ █▀█▀██\n ▄██▄███▄█▄█▀\n █ ▄▀▀▀▀▀▄ █ \n █▀█▀█ █▀█▀█"], ["eat_1", " ▄███▀█▄ \n▄▀▀▀▀ ██▄█▄██ \n▀▀▀▀▀█▀████▀█▄▄ \n █ ██ █▄██▀█\n ▀▀▀▀▄▄█▀█▀█ █▄█\n ▀▄█▄█▄████▀\n ▄▀▄▀▀▄▀█▀ \n █▀█▀█ █▀█▀█"], ["eat_2", " ▄▄▄▄ \n ▄███▀██▄ \n ▄▄▄▄▀██▄█▄██▄ \n█▄▄▄▄▄█ █▀█ █ █▄\n █▄▀██▄██▀█▀█\n ▀▄█ █ █▄█▄▀\n █ █▀█ █▀ \n █▀█▀█ █▀█▀█"], ["happy", " ▄▄▄▄▄▀██▀██▄ \n█▄▄▄▄▄▄█▄█▄██ \n █ ███▀██▄▀▄\n ▄▄▀ ▄█ █▄█ ██▄\n ▀▀██▀█ █▀█▀██\n ▀█ ▄██▄███▄█▄█▀\n ▀██▄▄▀▀▀▄ █▀▀ \n ▀▀ █▀█▀█ "], ["injured_1", " ▄▄▄▄▄ \n ▄██▀████ \n ▄▄▄▄▀██▄▄███▄ \n█▄▄▄▄▄███▀█ █ █▄\n ▄▀███▄██▀█▀█\n ▀▀▀▀██ █ █▄█▄▀\n ▄▀ █▀▀▀▄ █ \n █▀█▀█ █▀█▀█ "], ["injured_2", " \n \n \n ▄█████▄ \n ██▀█████▄▄ \n▄▀▀▀▀ ██▄▄█▀██▀█\n▀▀▀▀▀█▀██▀█▄██▄█\n ▄▄█▄▄▀█▄██▄██▀"], ["sleep_1", " \n \n ▄▄▄▄ \n ▄██████▄ \n ▄▄▄▄▀██▄▄███▄ \n█▄▄▄▄▄█ █▀█ █ █▄\n █▄▀██▄██▀█▀█\n ▀█▄█▄█▄█▄█▄▀"], ["sleep_2", " \n ▄▄▄▄ \n ▄██████▄ \n ▄▄▄▄▀██▄▄███ \n█▄▄▄▄▄█████▀█▀█▄\n ██ ██ █▄█▄██\n █▄██▀█▀█ █ █\n ▀█▄█▄█▄████▀"], ["walk_1", " ▄████▄ \n ███▀ ███ \n▄▀▀▀▀ ███████▄ \n▀▀▀▀█▀█ █▀█ █ █▄\n █▄▀██▄██▀█▀█\n ▀▄█ █ █▄█▄▀\n █ █▀█ █▀ \n █▀█▀█ █▀█▀█"], ["walk_2", " \n ▄▄▄▄ \n ▄███▀██▄ \n ▄▄▄▄▀██▄▄███ \n█▄▄▄▄▄█▀███▀█▀▄ \n █ █▄█ █▄█▄██\n ██ █▀█▀█ █ █\n ███▄█▄████▀"]]], + ["knightmon", [["angry", " ▄▄▄▄ \n ▄█▄▄ ▀▄ \n ▄▀ ▀▄ █ \n ████▀█████ ▀▄ \n ██▀▀ ▀▀███▄▄▀ \n ████ ████ █ \n ▄████ ████▄▄█▀ \n█▄▄███▄██▀█▄▄▄█ "], ["attack", " ▄▄▄▄ \n ▄█▄▄ ▀▄ \n ▄▀ ▀▄ █ \n █▀▄▄▄▀ █ ▀▄\n ▄█▄▄▄█▄▄▄▄█▄▀\n █ ▄█▄▄▀▀▄▀▀▄ █\n█▀▀▀ ▄▄█ ▄▄▄██ \n ▀▀██▄▄██▀▀█▄▄▄█"], ["eat_1", " ▄███▀▄ \n ▄▀▄ ▄▀ ▀▄▀▄ \n █ █ █▀▀█▀▀ █ █ \n █ ██ ████▄▄▀█▀▀\n █ █▄▄███▄▄██▀██\n▄▀▀█▀█▄▄ ▄▄█▄ ▄█\n▀▄▄██▄▄▄▄▄▄█▀▄█▀\n █▄▄▄██ █▄▄▄█ "], ["eat_2", " ▄▀▄ ▄▄▄▄ \n █ █ ▄█▄▄ ▀▄ \n █ █ ▄▀▄▄▄ ▀▄ █ \n █ █ █▀ ▀ ▀▄█▄█▄\n▄▀▀██▄▄▄▄▄▄█▀ ▀█\n▀▄▄█▄█ ██ ██\n █▄▄█▀▀ ▀▀▄▀██▄\n █▄▄▄██▀▀▀▀█▄▄▄█"], ["happy", " ▄ ▄███▀▄ \n █ █ ▄▀▄▄▄ ▀▄▀▄ \n █ █ █▀ ▀ ▀ █ █ \n █ ██ ██████ ▀█▀\n █▄█▀███▄▄▄██▀██\n█ █▀█▄▄ ▄▄█▄ ▄█\n ▀▀██▄▄▄▄▄▄▀█▄█▀\n █▄▄▄██ █▄▄▄█ "], ["injured_1", " \n █▀▀▀▄ \n ▄▀▀▀▀▄ ▀▄ \n █ █ █ \n ▄▀▀█▀▀▀▄█▄█▄\n ▄▄▄█▀▀▀▀▀█▀ ▀█\n █▄▄▀█▄▄ ▄▄██ ██\n █▄▄▄█▄▄▄▄▄▄███▄"], ["injured_2", " \n ▄▄▄▄ \n ▄█▄▄ ▀▄ \n ▄▀ ▀▄ █ \n █▄▄▄▄▄ █ █ \n ▄▄█▄▄█▄▄▄██▀██\n █▄▄▀█▄▄ ▄▄█▄ ▄█\n █▄▄▄█▄▄▄▄▄██▄█▀"], ["sleep_1", " \n ▄▀▄ \n █ █ █▀▀▀▄ \n▀█▀█▀▄████▄▄█▄ \n █ ██████ ████▄ \n █ █▄██▄▄ ▄▄██▄ \n █▄▀ ████ █████ \n ██▄█▄███▄███▄█ "], ["sleep_2", " \n ▄▀▄ ▄▄▄▄ \n █ █ ▄█▄▄ ▀▄ \n▀█▀█▀▄█▄▄▄▄█▄▄█ \n █ █▄████ ████▀▀\n █ █▀██▄▄ ▄▄██▀▄\n █▄▀ ████ ████ █\n ██▄█▄███▄███▄█ "], ["walk_1", " ▄▀▄ █▀▀▀▄ \n █ █ ▄▀▀▀▀▄ ▀▄ \n █ █ █▄▄▄▄▄ █ █ \n █ █▄▀ ▀ ▀█▀▀\n▄▀▀█▀█▀▀▀▀▀██▀██\n▀▄▄█▀█▄▄ ▄▄█▄ ▄█\n ▀▄█▄▄▄▄▄▄▀█▄█▀\n █▄▄▄██ █▄▄▄█ "], ["walk_2", " ▄ ▄▄▄▄ \n █ █ ▄█▄▄ ▀▄ \n █ █ ▄▀ ▀▄ █ \n █ █ █▀▀█▀▀▄█▄█▄\n █▄██▄▄▄▄▄▄█▀ ▀█\n█ █ █ ██ ██\n ▀████▀▀ ▀▀▄▀██▄\n █▄▄▄██▀▀▀▀█▄▄▄█"]]], + ["kokatorimon", [["angry", "███▄███▄▄▀▀▄▀▀█ \n ▀█▀▀ ▄ ▀▄ ▀ ▄█▄\n █▄▄▄▀▀ █ █ █\n█ ▄▄▄█▄ ▀ ▀ ▄▄▀\n ▀▀████ ▀ █\n ▄▀▀▀▀▄ █▀ \n ▄▄█▀██▄▄▄▄▀█▄ \n█▄▄█▄█ █▄█▄▄█ "], ["attack", "▄▄▄ ▄▄ ▄▄▄ \n▀████▀▀█ █▀▀█ \n ▄▀ ▄█▀ █ ▀ ▄█▄ \n▄▀▀▀▄ ▄▀ ▄▀ █ \n▀▄▄██ ▄▄▀▄ \n █▄▄▀ ▄▄▀ \n ▄▄█▄▄▄▄▄▄▄▀█▄ \n█▄▄█▄█ █▄█▄▄█ "], ["eat_1", "▄▄▄ ▄▄ ▄▄▄ \n▀████▀▀█ █▀▀█ \n ▄▀ ▄█▀ █ ▀ ▄█▄ \n▄▀▀▀▄ ▄▀ ▄▀ █ \n▀▄▄██ ▄▄▀▄ \n █▄▄▀ ▄▄▀ \n ▄▄█▄▄▄▄▄▄▄▀█▄ \n█▄▄█▄█ █▄█▄▄█ "], ["eat_2", "███▄███▄▄▀▀▄▀▀█ \n ▀█▀▀ ▄ ▀▄ ▀ ▄█▄\n █▄▄▄▀ ▀ █ █ █\n█ ▄▄▄██ ▀ ▀ ▄▄▀\n ▀▀████ ▀ █\n ▄▀▀▀▄▀ █▀ \n ▄▄█▀██▄▄▄▄▀█▄▄ \n█▄▄█▄█ █▄█▄▄█"], ["happy", "███▄███▄▄▀▀▄▀▀█ \n ▀█▀▀ ▄ ▀▄ ▀ ▄█▄\n █▄▄▄▀ ▀ █ █ █\n█ ▄▄▄██ ▀ ▀ ▄▄▀\n ▀▀████ ▀ █\n ▄▀▀▀▄▀ █▀ \n ▄▄█▀██▄▄▄▄▀█▄▄ \n█▄▄█▄█ █▄█▄▄█"], ["injured_1", " ▄▄▄▀▀▄▀▀▄▄▄ \n █ █ █ █ █ \n █▀▀▄ ▀ ▀ ▀ ▄▀▀█\n███▄███▄▀▀▄▄ █\n ▀███▀ ▀▄ ▀▄▀▀▄\n ▄▀▀ ▄ █ █▄▄▀\n▄▀▀▀▄▀▀ ▄▀▄▄█▄ \n▀▄▄███▀▀ █▄█▄▄█ "], ["injured_2", " \n███▄██▄▄▄▀▀▄▀▀█ \n ▀█▀▀ ▀▄ ▀ ▄█▄\n █▄▄ █▄ █ █ █\n█ ▄▀ ▀ ▀ ▄▄▀\n ▀█ ▀ █\n █▄▄▄ ▄▄▄▀▀ \n █▄▄█▄█▀▀█▄█▄█ "], ["refuse", " \n▄▄▄ ▄▄ ▄▄ ▄▄▄ \n▀████▀▀▀█ █ █ \n ▄▀ ▄▄▄ █ ▄▀▀█\n▄▀▀▀▄ ▄▀ ▄▀ █\n▀▄▄▀ ▄▀▀▄\n █▄▄▄ ▄▄▄▄▄▀\n █▄▄█▄█▄▄█▄█▄█ "], ["sleep_1", " ▄▄▄▀▀▄▀▀▄▄▄ \n █ █ █ █ █ \n █▀▀▄ ▀ ▀ ▀ ▄▀▀█\n███▄███▄▀▀▄▄ █\n ▀███▀ ▀▄ ▀▄▀▀▄\n ▄▀▀ ▄ █ █▄▄▀\n▄▀▀▀▄▀▀ ▄▀▄▄█▄ \n▀▄▄███▀▀ █▄█▄▄█ "], ["sleep_2", " ▄▄▄▀▀▄▀▀▄▄▄ \n █ █ █ █ █ \n █▀▀▄ ▀ ▀ ▀ ▄▀▀█\n███▄███▄▀▀▄▄ █\n ▀███▀ ▀▄ ▀▄▀▀▄\n ▄▀▀ ▄ █ █▄▄▀\n▄▀▀▀▄▀▀ ▄▀▄▄█▄ \n▀▄▄███▀▀ █▄█▄▄█ "], ["walk_1", "███▄██▄▄▄▀▀▄▀▀█ \n ▀█▀▀▄▄ ▀▄ ▀ ▄█▄\n █▄▄▀▀ █ █ █\n█ ▄▀ ▀ ▀ ▄▄▀\n ▀█ ▀ █\n ▀▄ ▄▄▄▀▀ \n ▄▄█▀█▀▀█ █ \n █▄▄█▄█ █▄█▄█ "], ["walk_2", "▄▄▄ ▄▄ ▄▄▄ \n▀████▀▀█ █▀▀█ \n ▄▀ ▄█▀ █ ▀ ▄█▄ \n▄▀▀▀▄ ▄▀ ▄▀ █ \n▀▄▄██ ▄▄▀▄ \n █▄▄▀ ▄▄▀ \n ▄▄█▄▄▄▄▄▄▄▀█▄ \n█▄▄█▄█ █▄█▄▄█ "]]], + ["kokomon", [["angry", " ▄ \n █▀▄█ ▀▄▄▀█ \n ▄█▀ ▀▄▄▀ ▀▀▄▄ \n█ ▄ ▄ ▄ ▄ ▀█\n ▀█ ▀▀ ▀▀ █▀ \n ▀▄ ▀▀ ▄▀ \n ▄▀▀ ▀▀▄ \n █▄▄█▄▄▄▄█▄▄█ "], ["attack", " █▀▄▀▀▄▄▄▀█ \n█▀▄▀▄▄▄▀ ▀▀▄▄▀█ \n▀▄ ▄ ▄ ▄ ▄▀ \n █ ▀▀ ▀▀ █ \n █ ████▄ █ \n ▀▄▀▀▀▀▀▄▄▀ \n ▄▄▀ ▀▄▄ \n ▀▄▄█▄▄▄▄█▄▄▀ "], ["eat_1", " ▄▄ ▄▀▄ ▄▄ \n █▄▀█ █▀▄█ \n▄█▀ ▀▀ ▀▀▄▄\n▀▄█▄▀▄ ▄▀▄ ▀▄▄▀\n █ ▄▄▄▄▄ █ \n ▀▄ ████ ▄▀ \n █▀ ▀█ \n █▄▄█▄▄█▄▄█ "], ["eat_2", " ▄ \n █▀▄█ ▀▄▄▀█ \n ▄█▀ ▀▄▄▀ ▀▀▄▄ \n█ ▄ ▄ ▄ ▄ ▀█\n ▀█▀ ▀ ▀ ▀ █▀ \n ▀▄ ▀▀ ▄▀ \n ▄▀▀ ▀▀▄ \n █▄▄█▄▄▄▄█▄▄█ "], ["happy", " ▄▄ ▄▀▄ ▄▄ \n▄▄█▄▀█ █▀▄█ ▄▄\n█ ▀ ▀▀ ▀▀ █\n ▀█▄▀▄ ▄▀▄ ▀▄▀ \n █ ▄▄▄▄▄ █ \n ▀▄▀███▀ ▄▀ \n █ █ \n █▄▄█▄▄█▄▄█ "], ["injured_1", " \n ▄ \n █▀▄█ ▀▄▄▀█ \n █▀ ▀▄▄▀ ▀▀▄ \n ▄▀▄ ▄ ▄ ▀▀▄\n ▀▄█ ▄▀ ▀▄ ▀▄█\n ▀▄ ▀▀ ▄▄▄▀ \n █▄▄█▄▄█▄▄▄█ "], ["injured_2", " \n \n ▄▄ ▄▀▄ ▄▄ \n ▀▄▀█ █▀▄█ \n ▄▀ ▀▀ █▄ \n █ █ ▄▄ ▄▄ ▄ █\n ▀█ ▀▀ ▄█▀\n █▄▄▄█▄▄█▄▄▄▄█ "], ["sleep_1", " ▄ \n █▀▄█ ▀▄▄▀█ \n ▄█▀ ▀▄▄▀ ▀▀▄▄ \n█ ▄ ▄ ▀█\n ▀█ ▀▀ ▀▀ █▀ \n ▀▄ ▀▀ ▄▀ \n ▄▀▀ ▀▀▄ \n █▄▄█▄▄▄▄█▄▄█ "], ["sleep_2", " \n ▄▄ ▄▀▄ ▄▄ \n █▄▀█ █▀▄█ \n▄▀▀ ▀▀ ▀▀▄▄\n▀▄█ ▄▄ ▄▄ ▀▄▄▀\n █ ▄▄ █ \n ▄▀▄ ▄▀▄ \n █▄▄▄▄█▄▄█▄▄▄▄█ "], ["walk_1", " ▄▄ ▄▀▄ ▄▄ \n █▄▀█ █▀▄█ \n▄█▀ ▀▀ ▀▀▄▄\n▀▄█ ▄█ ▄█ ▀▄▄▀\n █ ▄▄ █ \n ▀▄▄ ▄▄▀ \n █ █ \n █▄▄█▄▄█▄▄█ "], ["walk_2", " ▄ \n █▀▄█ ▀▄▄▀█ \n▄▄█▀ ▀▄▄▀ ▀▀▄▄▄▄\n▀▄▄ ▄ ▄ ▄▄▄▀\n █ ▀▀ ▀▀ █ \n ▀▄ ▀▀ ▄▀ \n ▄▀▀ ▀▀▄ \n █▄▄█▄▄▄▄█▄▄█ "]]], + ["kokuwamon", [["angry", " \n ▄▀█ █▀▄ \n █▄█▄▄▄▄█▄█ \n █▄ ▄ █ \n █▀▀ ▀▀ █▄ \n ▄▀▀█▀█▀▀▀█▀ █ \n ▀▄▄▄▀█▀▀▀███▄▀ \n █▄███▀▀███▄█ "], ["attack", " ▄▀█▄▀▄ ▄▀▄ ▄█▀▄\n █ █ ▀ ▀ █ █\n ▀▄▄█▀▀▀▀█▀█▀▄▀ \n█▀█ ▀█ █▀ ▀█▀█\n▀▄██▀████▀█ █▄▀\n █▀█ ████ █ █ ▀█\n ███▀█▀▀▀████▀ \n █▄▄██▀▀▀▀▄▄▄▄█ "], ["eat_1", "▄▀█ █▀▄\n▀▄ █▀▀▀▀▀▀▀▀█ ▄▀\n █▄█ ▄▄▄▄ █▄█ \n█▀█ █ ██ █ █▀█\n▀▄▀▄ █ ██ █ ▄▀▄▀\n█ ▀██▀▀█▀▀▀██▀ █\n ▀▄▄█▀▀█▀▀▀█▄▄▀ \n █▄▄██▀▀▀▀██▄▄█ "], ["eat_2", " \n ▄▀█ █▀▄ \n █▄█▄▄▄▄█▄█ \n █ ▄ ▄ █ \n █▀ ▀ ▀ ▀█ \n ▄▄▀█▀▀█▀▀▀█▀▄▄ \n▀▄▄▄█▀▀█▀▀▀█▄▄▄▀\n █▄███▀▀███▄█ "], ["happy", "▄▀█ █▀▄\n█▄▄▀▀█▀▀▀▀█▀▀▄▄█\n █ ▀ ▀ ▀ ▀ █ \n█▀█ █▀▀▀▀▀▀█ █▀█\n▀▄▀▄▀▄ ▄▀▄▀▄▀\n█ ▀██▀▀█▀▀▀██▀ █\n ▀▄▄█▀▀█▀▀▀█▄▄▀ \n █▄▄██▀▀▀▀██▄▄█ "], ["injured_1", " \n ▄▀█ █▀▄ \n █▄█▄▄▄▄█▄█ \n █ ▄ ▄ █ \n █ ▀▀ ▀▀ █ \n ▄██▀▀█▀▀▀██▄ \n █ ▄█▀▀█▀▀▀█▄ █ \n █▄███▀▀███▄█ "], ["injured_2", " \n ▄▄▄▄ \n ▄▀▀▄▀▀▄▀▀▄ \n ▄▀▀▀▀▀▀▀▀▀▀▄ \n █ ▄▄▀ ▀▄▄ █ \n ▀▄▄▄▄▄▄▄▄▄▄▀ \n █ █▄▄█▄▄▄█ █ \n █▄█▄█▄█▄██▄█▄█ "], ["sleep_1", " \n ▄▄ ▄▄ \n█ ▀▄ ▄▀ █\n ▀▄▀▀▀▀▀▀▀▀▀▀▄▀ \n █▄▄▄ ▄▄▄█ \n▄▄▀▄▄▄▄▄▄▄▄▄▄▀▄ \n█ █▄█▄▄█▄▄▄█ █\n█▄▄▄█▄▄█▄▄▄█▄▄▄█"], ["sleep_2", " \n ▄▀█ █▀▄ \n █▄█▄▄▄▄█▄█ \n █ █ \n █▀▀▀ ▀▀▀█ \n▄▄ ▀█▀▀█▀▀▀██▄▄ \n█ █▄█▄▄█▄▄▄█ █\n█▄▄▄█▄▄█▄▄▄█▄▄▄█"], ["walk_1", " ▄▄ ▄▄ \n ▄▀▄▀ ▀▄▀▄ \n ▄▀▀▀▀▀▀▀▀▀▀▄ \n █▀█ █▀█ \n ▀█▄▄▄▄▄▄▄▄█▀ \n ▄▀ █▄▄█▄▄▄█ ▀▄ \n ▀█▀█▄▄█▄▄▄█▀█▀ \n █▄█▄██▄█▄█ "], ["walk_2", " \n▄▀█ █▀▄\n▀▄ █▄▄▄▄▄▄▄▄█ ▄▀\n █ █ \n█▀█▀▀▀ ▀▀▀█▀█\n▀▄ ██▀▀█▀▀▀██ ▄▀\n ▀▄█▀▀█▀▀▀█▄▀ \n █▄███▀▀███▄█ "]]], + ["kokuwamon_x", [["angry", " ▄▄ \n ▄▀████▀▄ \n █▄██████▄█ \n █▄ ▄ █ \n █▀▀ ▀▀ █▄ \n ▄▀▀█▀█▀▀▀█▀ █\n ██▄▄▄▀█▀▀▀███▄█\n ▀█▄███▀▀███▄█▀▀"], ["attack", " ▄▀█ ▄█▄ █▀▄\n █ █ █████▄ █ █\n ▀▄▄█▀▀▀▀█▀█▀▄▀ \n█▀█ ▀█ █▀ ▀█▀█\n▀▄██▀████▀█ █▄▀\n ▄█ ████ █ ██▄ \n ▄███▀█▀▀▀██████\n █▄▄██▀▀▀▀▄▄▄▄█ "], ["eat_1", "▄▀█ ▄██▄ █▀▄\n▀▄ █▀▀▀▀▀▀▀▀█ ▄▀\n █▄█ ▄▄▄▄ █▄█ \n█▀█ █ ██ █ █▀█\n▀▄▀▄ █ ██ █ ▄▀▄▀\n█████▀▀█▀▀▀█████\n▀██▄█▀▀█▀▀▀█▄█▀▀\n █▄▄██▀▀▀▀██▄▄█ "], ["eat_2", " ▄▄ \n ▄▀████▀▄ \n █▄██████▄█ \n █ ▄ ▄ █ \n █▀ ▀ ▀ ▀█ \n ▄▄▀█▀▀█▀▀▀█▀▄▄ \n▀▄▄▄█▀▀█▀▀▀█▄▄▄▀\n▀▀█▄███▀▀███▄█▀▀"], ["happy", "▄▀█ ▄██▄ █▀▄\n█▄▄▀▀█▀▀▀▀█▀▀▄▄█\n █ ▀ ▀ ▀ ▀ █ \n█▀█ █▀▀▀▀▀▀█ █▀█\n▀▄▀▄▀▄ ▄▀▄▀▄▀\n▄████▀▀█▀▀▀████▄\n▀▀███▀▀█▀▀▀███▀▀\n █▄▄██▀▀▀▀██▄▄█ "], ["injured_1", " ▄▄ \n ▄▀████▀▄ \n █▄██████▄█ \n █ ▄ ▄ █ \n █ ▀▀ ▀▀ █ \n ▄██▀▀█▀▀▀██▄ \n▄█ ▄█▀▀█▀▀▀█▄ █▄\n▀▀█▄███▀▀███▄█▀▀"], ["injured_2", " \n ▄██▄ \n ▄▀▀▄██▄▀▀▄ \n ▄▀▀▀▀▀▀▀▀▀▀▄ \n █ ▄▄▀ ▀▄▄ █ \n ▄▀▄▄▄▄▄▄▄▄▄▄▀ \n▄██ █▄▄█▄▄▄█ ██▄\n██▄█▄█▄█▄██▄█▄██"], ["sleep_1", " \n ▄▄ ▄▄ ▄▄ \n█ ▀▄ ████ ▄▀ █\n ▀▄▀▀▀▀▀▀▀▀▀▀▄▀ \n █▄▄▄ ▄▄▄█ \n▄██▄▄▄▄▄▄▄▄▄▄██▄\n█ █▄█▄▄█▄▄▄█ █\n█▄▄▄█▄▄█▄▄▄█▄▄▄█"], ["sleep_2", " ▄▄ \n ▄▀████▀▄ \n █▄██████▄█ \n █ █ \n █▀▀▀ ▀▀▀█ \n▄▄ ██▀▀█▀▀▀███▄ \n█ ███▄▄█▄▄▄█ █\n█▄▄▄█▄▄█▄▄▄█▄▄▄█"], ["walk_1", " ▄▄██▄▄ \n ▄▀▄▀██▀▄▀▄ \n ▄▀▀▀▀▀▀▀▀▀▀▄ \n █▀█ █▀█ \n ▄██▄▄▄▄▄▄▄▄███ \n██▀ █▄▀▀▀▄▄█ ▀██\n ▀█▀█▄███▄▄█▀█▀ \n █▄█▄██▄█▄█ "], ["walk_2", " ▄▄ \n▄▀█ ████ █▀▄\n▀▄ █▄██████▄█ ▄▀\n █ █ \n█▀█▀▀▀ ▀▀▀█▀█\n▀▄ ██▀▀█▀▀▀██ ▄▀\n███▄█▀▀█▀▀▀█▄███\n █▄███▀▀███▄█ "]]], + ["komondomon", [["angry", " █▄▄ \n ▄██████▄ \n ███▀ ███▀ \n▄▀▀▀▀▀██▀█▄▄▄▄ \n▀▄█▄█ █ █▀▀▀▀▀▄\n ████ █ ▄ █ █ █\n █▄▄▄█▀▀ ▀ █▀\n█▄█▄█▄█▄▄█▄▄█▄▄█"], ["attack", " \n █▄▄ \n ▄██████▄▄ \n ███ ███ \n▄▀█▀▀▀██▀█████▄ \n█ ▄ ▄ █ ▀▄ ▄ █\n █████▀ ▀ ▀ ▀▄▀\n█▄▄█▄█▄█▄▄█▄▄█▄█"], ["eat_1", " ▄ \n ▄███▄▄ \n ███▀████▀ \n ██▄█▄███▄▄▄▄▄ \n█ ▀ █▀ █▀▀▀▀▀▄\n▀▄█▄█▄█ ▄ █ █ █\n █▄▄▄█▀▀ ▀ █▀\n█▄█▄█▄█▄▄█▄▄█▄▄█"], ["eat_2", " █▄▄ \n ▄██████▄ \n ███ ███▀ \n▄▀▀▀▀▀██▀█▄▄▄▄ \n▀▄█▄█▄█ █▀▀▀▀▀▄\n ████ █ ▄ █ █ █\n █▄▄▄█▀▀ ▀ █▀\n█▄█▄█▄█▄▄█▄▄█▄▄█"], ["happy", " █▄▄ \n ▄██████▄ \n ██▀▄▀███▀ \n▄▀▀▀▀▀██▀█▄▄▄▄ \n▀▄█▄█ █ █▀▀▀▀▀▄\n ████ █ ▄ █ █ █\n █▄▄▄█▀▀ ▀ █▀\n█▄█▄█▄█▄▄█▄▄█▄▄█"], ["injured_1", " \n ▄ \n ▄███▄▄ \n ███▀████▀ \n ███▄▄███▄▄▄▄▄ \n█ ▀ █▀ █▀▀▀▀▀▄\n▀▄█▄█▄▀ █ █ █\n█▄▄█▄█▄█▄▄█▄▄▄██"], ["injured_2", " \n \n █▄▄ \n ▄██████▄▄ \n ███ ▀███ \n█▀█▀▀▀██▀█████▄ \n█ ▄ ▄ █ █ ▄ █\n██▄█▄█▄▄▄▄█▄▄█▄█"], ["refuse", " ▄ \n ▄███▄▄ \n ████▀███▀ \n ███▄▄███▄▄▄▄▄ \n█ ▀ █▀ █▀▀▀▀▀▄\n▀▄█▄█▄█ ▄ █ █ █\n █▄▄▄█▀▀ ▀ █▀\n█▄█▄█▄█▄▄█▄▄█▄▄█"], ["sleep_1", " ▄ \n ▄███▄▄ \n ████████▀ \n ███▄▄███▄▄▄▄▄ \n█ ▀ █▀ █▀▀▀▀▀▄\n▀▄█▄█▄█ ▄ █ █ █\n █▄▄▄█▀▀ ▀ █▀\n█▄█▄█▄█▄▄█▄▄█▄▄█"], ["sleep_2", " \n ▄ \n ▄███▄▄ \n ████████▀ \n ███▄▄███▄▄▄▄▄ \n█ ▀ █▀ █▀▀▀▀▀▄\n▀▄█▄█▄▀ █ █ █\n█▄▄█▄█▄█▄▄█▄▄▄██"], ["walk_1", " ▄ \n ▄███▄▄ \n ███▀▀███▀ \n ███▄▄███▄▄▄▄▄ \n█ ▀ █▀ █▀▀▀▀▀▄\n▀▄█▄█▄█ ▄ █ █ █\n █▄▄▄█▀▀ ▀ █▀\n█▄█▄█▄█▄▄█▄▄█▄▄█"], ["walk_2", " \n █▄▄ \n ▄██████▄▄ \n ███ ███ \n▄▀█▀▀▀██▀█████▄ \n█ ▄ ▄ █ ▀▄ ▄ █\n █████▀ ▀ ▀ ▀▄▀\n█▄▄█▄█▄█▄▄█▄▄█▄█"]]], + ["koromon", [["angry", " \n \n \n ▄ ▄▄ \n ▄▀▀▀▀▀ ▀▄ \n █ ▄▄▀ █ \n █▄▄▄▄ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["attack", " ▄ ▄▄ \n ▄▀▀▀▀▄ ▀▄ \n █ ▀▀ █ \n ▀█▀▀█▀▄ █ \n █ █ \n ▄█▄▄█▄▄█ █ \n ▀▄▄▄▄▄▄▄▄▀ \n ▄▄▄▄▄▄▄ "], ["eat_1", " \n \n \n ▄▀▀▀▀▀▄▄ \n ▀▄ ▄ ▀▄ \n █ ▀▀ ▀ █ \n █▄█▄▀ █▀ \n ▀▄▄▄▄▄▄▄▄▀ "], ["eat_2", " \n \n \n ▄▄▄ \n ▄▀▀▀ ▀▄ \n ▄▀ █▀▄ █ \n █▄▄▄ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["happy", " \n ▄ ▄▄ \n ▄██▄▄▀ █ \n █ ▄▄ █ \n █ ▀ ▀ █ \n ▀█████▀ █ \n ▄████▀ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["injured_1", " \n \n \n ▄█▄▄█▀▄ \n ▄▀ ▀▄ \n █▄█ █▄▄ █ \n █ █ \n ▀▄▄██▄▄▄▄▄▀ "], ["injured_2", " \n \n \n \n █▄▄▄▄▀█ \n ▄▀ ▀▄ \n █▄█ █▄▄ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["sleep_1", " \n \n \n \n ▄▀█▄█▀▄ \n ▄▀▄▄▄ ▄▄▄▀▄ \n █ ▄▄▄ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n \n \n ▄▄ ▄▄ \n ▄▀ ▀▀▀ ▀▄ \n █ ▀▀▀ ▀▀▀ █ \n █ ▀▀▀ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["walk_1", " \n \n \n \n █▀▄▄▄▀█ \n ▄▀ ▄ ▄ ▀▄ \n █ ▀ ▄ ▀ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["walk_2", " \n \n \n ▄▄ ▄▄ \n ▄▀ ▀▀▀ ▀▄ \n █ █ █ █ \n █ ▀▀▀ █ \n ▀▄▄▄▄▄▄▄▀ "]]], + ["kunemon", [["angry", " ▄▀▀█▀ ▄▄▀▀▄ \n █▀▀▀▀▀ █▀▀▀ \n █▄▄▄▄ ▄▄ █ \n█ ▀▄ █ \n▀▄ ▄▀▀█ ▄▀▄▀▄ \n ▄▀▀█▀█▀▀▀█▄█ █ \n ▀█▀▄▄▄▀▀█▀ █ \n ▀▄▄▄▄▄▄▄█▄▀ "], ["attack", " ▄▀▀▀▀▀▀▄▀▀▀█▀\n ▄▀▀▀▀▀▄▄█ ▄▀▀ \n█▄ ▄▄▄▀▄ █ \n ▀██████▀█ █ ▄ \n▄█▀████▀ █▄▄▀█ █\n█▀▄▄▄▄▄▄▀ █▀▀▄▀\n ▀▄█▄▄▄█▄▄▀▄ ▄▀ \n ▀▄▄▄▄▄▄█▄▀ "], ["eat_1", " ▄▀▀▀▀▀▀█▀▄▄▀█\n ▄▀▀▀▀▀▄▀▀▄█▄▄▀ \n█▄ ▄▄▄▄▀▄ █ \n ▀██████▀█ █ ▄ \n▄█▀██▄▄▀ █▄▄▀█ █\n█▀▄▄▄▄▄▄▀ █▀▀▄▀\n ▀▄█▄▄▄█▄▄▀▄ ▄▀ \n ▀▄▄▄▄▄▄█▄▀ "], ["eat_2", " ▄▄▄▄ ▄▄ \n █▄▄█▄▄▀▀▄▄█▄ \n ▄▀ ▄ ▀▄ \n▄▀▀▀▀▀▄▀ ▀ █ \n█ ▄▄█ █ ▄▄ \n ▀▄▄█▄▄█▄▄█▀▄█ █\n █▄▄█ ▀▄▄▄█▄ ▀█\n █▄██▄▄▄▄▄█▄▀ "], ["happy", " ▄▀▀▀▀▀▀█▀▄▄ \n ▄▀▀▀▀▀▄▀▀▄█▄▄▀▄\n█▄ ▄▄▄▄▀▄ █ ▀▀\n ▀██████▀█ █ ▄ \n▄█▀████▀ █▄▄▀█ █\n█▀▄▄▄▄▄▄▀ █▀▀▄▀\n ▀▄█▄▄▄█▄▄▀▄ ▄▀ \n ▀▄▄▄▄▄▄█▄▀ "], ["injured_1", " \n \n ▄▀███▄▄▀▀▀▀▄ \n ▄▀ ▄ ▀▀▄▄█ \n▄▀▀▀▀▀▄▀▀ █ \n█ ▄▄█ █▀▀▄ \n ▀▄▄█▄▄█▄▄█▀▀▄ █\n █▄█▄▄▄▄█▄▄█▄▄█▀"], ["injured_2", " \n \n \n ▄▀███▄▄▀▀▀▀▄ \n ▄▀ ▄ ▀▀███ \n▄▀▀▀▀▀▄▀▀ █ ▀▄\n█ ▄▄█ █▀▀▄█\n ▀▄▄█▄▄█▄▄█▄▄▄▄▀"], ["sleep_1", " \n \n \n ▄▀███▄▄▀▀▀▀▄ \n ▄▀ ▀▀███ \n▄▀▀▀▀▀▄▀▀ █ ▀▄\n█ ▄▄█ █▀▀▄█\n ▀▄▄█▄▄█▄▄█▄▄▄▄▀"], ["sleep_2", " \n ▄▄▄▄ ▄▄ \n █▄▄█▄▄▀▀▄▄█▄ \n ▄▀ ▀▀▄ \n▄▀▀▀▀▀▄▀▀ █ \n█ ▄▄█ █▀▀▄ \n ▀▄▄█▄▄█▄▄█▀▀▄ █\n █▄█▄▄▄▄█▄▄█▄▄█▀"], ["walk_1", " ▄▀▀█▀ ▄▄▀▀▄ \n █▀▀▀▀▀ █▀▀▀ \n █▄▄▄▄ ▄█▀ █ \n█ ▀▄ █ \n▀▄ ▄▀▀█ ▄▀▄▀▄ \n ▄▀▀█▀█▀▀▀█▄█ █ \n ▀█▀▄▄▄▀▀█▀ █ \n ▀▄▄▄▄▄▄▄█▄▀ "], ["walk_2", " ▄▄▄▄ ▄▄ \n █▄▄█▄▄▀▀▄▄█▄ \n ▄▀ ▄▄▀▄ \n▄▀▀▀▀▀▄▀▀ █ \n█ ▄▄█ █ ▄▄ \n ▀▄▄█▄▄█▄▄█▀▄█ █\n █▄▄█ ▀▄▄▄█▄ ▀█\n ▀▄██▄▄▄▄▄█▄▀ "]]], + ["kuramon", [["angry", " \n \n \n ▄▄▄ ▄▄▄ \n █ ▄▀▀▀▀ █ \n █ ▄▄ █ \n ▄▀ ▀▀ ▀▄ \n █▄▀▀▄▄▀▀▄█ "], ["attack", " \n █▀▀▄▄▄▄▀▀█ \n ▀▄▀ ▄▄ ▄▀ \n █ ▀▀ █ \n █████ █ \n ▄▀▀▀▀▀▄ █ \n █▄▀▀▄▀ ▀▄█ \n ▄▄▄▄▄▄▄▄ "], ["eat_1", " \n ▄▄▄ ▄▄▄ \n █ ▄▀▀▀▀ █ \n █ ▄▀▄ █ \n █ ▀▀▀ █ \n █ ███ █ \n █ ▄▄ ▄▄▄ █ \n ▀▀ ▀ ▀▀ "], ["eat_2", " \n \n \n ▄▄▄ ▄▄▄ \n █ ▄▀▀▀▀ █ \n █ ▄ █ \n ▄▀ ▀ ▀ ▀▄ \n █▄▀▀▄▄▀▀▄█ "], ["happy", " \n █▀▀▄▄▄▄▀▀█ \n ▀▄▀ ▄ ▄▀ \n █ ▀ ▀ █ \n ▄▀ ███ ▀▄ \n █ ▄ ▄ █ \n █▄▀▀▄▀ ▀▄█ \n ▄▄▄▄▄▄▄▄ "], ["injured_1", " \n \n \n \n █▀█▀▀▀▀▄▀▀█ \n █ ▄▄ ▄▀ \n ▄▀ ▀▀ ▀▄ \n █▄▀▀▄▄▀▀▄█ "], ["injured_2", " \n \n \n \n ▄▄▄▄▄▄▄ ▄▄▄ \n ▀▄▀ ▀ ▄▀ \n ▄▀ ▀█▄ ▀▄ \n █▄█▄▄▄▄▄█▄▄█ "], ["sleep_1", " \n \n \n \n █▀▀▄▄▄▄▀▀█ \n ▀▄▀ ▄▀ \n ▄▀ ▀▀▀ ▀▄ \n ▀▄█▄▄▄█▄▄▀ "], ["sleep_2", " \n \n \n ▄▄▄ ▄▄▄ \n █ ▄▀▀▀▀ █ \n █ ▄▄▄ █ \n ▄▀ ▀▄ \n ▀▄█▄▄▄█▄▄▀ "], ["walk_1", " \n \n █▀▀▄▄▄▄▀▀█ \n ▀▄▀ ▄ ▄▀ \n █ █▄█ █ \n █ ▄ ▄ █ \n █▄▀▀▄▀ ▀▄█ \n ▄▄▄▄▄▄ "], ["walk_2", " \n \n \n █▀▀▄▄▄▄▀▀█ \n ▀▄▀ ▄ ▄▀ \n █ █▄█ █ \n █ █ \n █▄▀▀▄▄▀▀▄█ "]]], + ["kuwagamon", [["angry", " ▄▄▄ ▄▄▄▄ \n ▄▀▀ █▄ ▄█▄ ▀▀▄ \n █ ▀█▄▄▄▄▄▄█▀ █\n █▄▄▀ ▀▄▄█ \n █ ██▄ ▄██ █\n ▀▄▄█▄▄▄▄▄▄█▄▄▄▀\n ▄██▄▄█▄▄▄█▄█▄ \n █▄█▄█▄█▄▄█▄▄█▄█"], ["attack", " ▄▀█▀ ▀█▀▀▄ \n█ ▄▄█▀▀▀▀█▀▄▄▄ █\n▀▄ █▀▀ ▀▀ █ █\n ▀█▄█████▄ █▀▀ \n ▄████████ █▄ \n █ ▀██▀▀ █ █ █ \n█ █▀▀▀▀▀ █ █\n█▄▄█▄█▀▀▀▀█▄█▄▄█"], ["eat_1", " ▄▀█▀ ▀█▀▀▄ \n█ ▄▀▀ ▀▀▄▄ █\n▀▄ ▀█▀▀▀▀▀▀█ █\n ▀█▄▀▄ ▄▀▄ █▀▀ \n ▄▀█ ▄▄▄▄▄▄ █▀▀▄\n█ ▀████████▀▀ █\n█▄▄▄██▀ ▀█▄▄▄▀\n █▄█▄█▀▀▀▀▀▄▄█▄█"], ["eat_2", " ▄▄▄ ▄▄▄▄ \n ▄▀ █▄ ▄█ ▀▀▄ \n █ ▀█▄▄▄▄█▀▀ █ \n ▀█▄ ▄ ▀▄▀ \n ▄█ ▀ ▀ ▀ █▄ \n ▄▀▄▀▄▄▄▄▄▄█▄ ▀▄\n ▀▄▄█▄▄█▄▄▄█▄▄▄▀\n █▄█▄█▄█▄▄█▄▄█▄█"], ["happy", " ▄▀█▀ ▀█▀▀▄ \n█ ▄▄█▄▄▄▄▄██▄▄ █\n▀▄ █▀▄ ▄ █ ▄▀\n ▀█▀ ▀ ▀ ▀ █▀ \n ▄▀█ ██████ █▀▀▄\n█ ▀▀▄██▀▀▀█▄▀▀▀█\n▀▀▄▄█▀▀█▀▀▀█▄▄▄▀\n █▄█▄█▀▀▀▀█▄▄█▄█"], ["injured_1", " \n ▄▄▄ ▄▄▄▄ \n▄▀ █▄ ▄█▄ ▀▀▄ \n█ ▀▄▄▄▄▄▄█▀ █ \n▀▄▄▀ ▀▄▄▀▄ \n █▄█ █▄ █▄▀▀▀▄\n▄▀▀▄▄▄▄▄▄▀▀ █ ▄█\n█▄▄▄█▄█▄█▄▄▄██▄█"], ["injured_2", " \n \n ▄▄▄ ▄▄▄▄ \n▄▀ █▄ ▄█▄ ▀▀▄ \n█ ▀▄▄▄▄▄▄█▀ █ \n▀▄▄▀ ▀▄▄▀▀▀▄\n▄▀▀▄█ █▄▀▀ █ ▄█\n█▄▄▄█▄▄▄█▄▄▄██▄█"], ["sleep_1", " \n ▄▀█▀ ▀█▀▀▄ \n█ ▄▀▀ ▀▀▀▄ ▀▄ \n▀▄ ▀█▀▀▀▀▀█ ▄▀ \n ▀▄▀ ▀▄█▄ \n ▄▀█▄▄ ▄▄ █▄▄▀▄\n █ ▀▄▄▄▄▄▄█ █\n █▄▄▄█▄█▄▄█▄▄▄▄█"], ["sleep_2", " ▄▄▄ ▄▄▄▄ \n ▄▀▀ █▄ ▄█▄ ▀▀▄ \n █ ▀█▄▄▄▄▄▄█▀ █\n ▀▄▄▀ ▀▄▄▀ \n ▄█▄▄ ▄▄ █▄ \n ▄▀▄█▄▄▄▄▄▄▄█▄▀▄\n █ █▄▄█▄▄█ █\n █▄▄▄█▄█▄▄█▄▄▄▄█"], ["walk_1", " ▄▀█▀ ▀█▀▀▄ \n █ ▄▀▀ ▀▀▀▄ ▀▄\n ▀▄ ▀█▀▀▀▀▀█ ▄▀\n ▀█ ▄ ▄ █▀ \n ▄█ ▀ ▀ ▄▀▄ \n █ ▄▀▀█▀▀▀▀▄ █ \n █▄█▀▀█▀▀▀█▄▄█ \n █▄█▄█▀▀▀▀█▄▄█▄█"], ["walk_2", " ▄▄▄ ▄▄▄▄ \n ▄▀▀ █▄ ▄█▄ ▀▀▄ \n █ ▀█▄▄▄▄▄▄█▀ █\n ▀▄▄▀ ▀▄▄▀ \n ▄█ █ █ █▄ \n ▄▀▄▀▄▄▄▄▄▄█▄ ▀▄\n ▀▄▄█▄▄█▄▄▄█▄▄▄▀\n █▄█▄█▄█▄▄█▄▄█▄█"]]], + ["kuwagamon_x", [["angry", " ▄▄▄ ▄▄▄ \n ▄▀ █▄ ▄ ▄█ ▀▄ \n █ ▄█▄▄▀ ▀▄▄█▄ █\n ▀▄ ▄▀▄ ▄▀▄ ▄▀\n ▄▀█ █▄ ▄█ █▀▄ \n █ ▀▀█▄▄▄▄▄█▀▀ █\n █▄▄█▄▄█▄▄█▄▄█ \n █▄█▄▄█▄█▄█▄▄█▄█"], ["attack", " ▄▀█▀ ▀█▀▀▄ \n█ ▄▀▀ ▀▀▄ █\n█ █ ▄▀▄ █ █\n▀▄ ▀█▀ ▀█▀ ▄▀ \n ▀█ █ █ █▀ \n ▄▀▄▀▀ ▀▀▄█▀▀▄ \n █ ▀██▀█▀▀██▀ █\n █▄▄█▄█▀▀█▄█▄▄▄█"], ["eat_1", " ▄▄▀█▀ ▀█▀▄ \n █ ▄▄▀▀▄▀▄▀▀▄ ▀▄\n ▀▄ ▀█▀ ▀█▀ ▄▀\n ▀█▄▀▄ ▄▀▄█▀ \n ▄█ ▄▄▄ █▄ \n ▄▀ █▄ ███ ▄█ ▀▄\n ▀▄▄█▄█████▄█▄▄▀\n █▄█▄▄█▄█▄█▄▄█▄█"], ["eat_2", " \n ▄▄▀█▀ ▀█▀▄ \n █ ▄▄▀▀▄▀▄▀▀▄ ▀▄\n ▀▄ ▀█▀ ▀█▀ ▄▀\n ██ ▄ ▄ ██ \n ▄▀ ██ ▀ ▀ ██ ▀▄\n ▀▄▄█▄█▄▄▄█▄█▄▄▀\n █▄█▄▄█▄█▄█▄▄█▄█"], ["happy", " ▄▄▀█▀ ▀█▀▄ \n █ ▄▄▀▀▄▀▄▀▀▄ ▀▄\n ▀▄ ▀█▀ ▀█▀ ▄▀\n ▀█▄▀▄ ▄▀▄█▀ \n ▄▄█ ▄▄▄▄▄ █▄▄ \n █ █▄▀███▀▄█ █\n ███▄█████▄███ \n █▄█▄▄█▄█▄█▄▄█▄█"], ["injured_1", " \n ▄▄▄ ▄▄▄▄ \n▄▀ █▄ ▄ ▄█ ▀▄ \n█ ▀▄▄▀ ▀▄▄▀ █ \n▀▄▄▀ ▀▄▄▀▄ \n █▄█ █▄ █▄▀▀▀▄\n▄▀▀▄▄▄▄▄▄▀▀ █ ▄█\n█▄▄▄█▄█▄█▄▄▄██▄█"], ["injured_2", " \n \n ▄▀█▀ ▀█▀▀▄ \n█ ▄▀▀▄▀▄▀▀▄ █ \n█ █▀ ▀█ ▄█ \n ▀█ ▄ ▄ ██▀▀▀▄\n▄▀█▀▀ ▀▀▄█ █ ▄█\n█▄▄██████▄▄▄██▄█"], ["sleep_1", " \n ▄▄▄ ▄▄▄ \n▄▀▀ █▄ ▄ ▄█ ▀▄ \n█ ▀█▄▄▀ ▀▄▄█ █ \n ▀▄▄▀ ▀▄▄▀ \n ▀█▄▄▄ ▄▄▄█▀ \n █▀▄▀▄▄▄▄▄▀▄▀▀▄ \n █▄▄▄█▄▄█▄▄█▄▄█ "], ["sleep_2", " \n ▄▄▀█▀ ▀█▀▄ \n █ ▄▄▀▀▄▀▄▀▀▄ ▀▄\n ▀▄ ▀█▀ ▀█▀ ▄▀\n ██ ██ \n ██▀▀ ▀▀██ \n █▀▄▀▄▀▄▄▄▀▄▀▀▄ \n █▄▄▄█▄▄█▄▄█▄▄█ "], ["walk_1", " ▄▀█▀ ▀█▀▄ \n █ ▄▀▀ ▄▀▄ ▀▀▄ █\n ▀▄ ▀█▀ ▀█▀ ▄▀\n ▀█ █▄ ▄█ █▀ \n ▄█▄ ▀ ▀ ▄█▄ \n █ ▄▀▀▀█▀▀▀▄ █ \n █▄▄█▀▀█▀▀█▄▄█ \n █▄█▄▄█▀▀▀█▄▄█▄█"], ["walk_2", " ▄▄▄ ▄▄▄ \n ▄▀▀ █▄ ▄ ▄█ ▀▄ \n █ ▀█▄▄▀ ▀▄▄█ █\n ▀▄▄▀▄ ▄▀▄▄▀ \n ▄█ ▀█ █▀ █▄ \n ▄▀ ▄█▄▄▄▄▄█▄ ▀▄\n ▀▄▄█▄▄▄█▄▄▄█▄▄▀\n █▄█▄▄█▄█▄█▄▄█▄█"]]], + ["kyokyomon", [["angry", " ▄▄ ▄▄▄ \n ▄▀▄▄▀▀ ▄▀ \n ▄▀ ▄ ▀▄ \n █ ▀ ▄█▄ \n ▀▀█▀ ▄ █▄▄ \n ▀▄ ▀ ▄▀ \n ▀▄▄▄▄▀ \n ▄▄▄▄ "], ["attack", " ▄▄▀▀█▄▀▀█ \n ▄▀▀ ▀▀ ▄▄▀ \n ▀▀▀▄ ▄█ ▄▀ \n █ ▄█▄ \n ▄▀▀▀ ▀ █ \n ▀▀█▀ █▀ ▄▄ \n █ ▀▀ █ \n ▀▄▄▄▄▄▀▀ "], ["eat_1", " ▄▄▀▀█▄▄▄ \n ▄▀▀ ▀▀ ▄▄▀ \n ▀▀▀▄ ▀█ ▀▄ \n █ ▀▄ \n ▄▀▀▀ █ \n ▀█▀ ▀▄█▀█ \n █ ▀ █ \n ▀▄▄▄▄▀ "], ["eat_2", " \n ▄▀▀▄▄▀▀█ \n ▄▀ ▀▀ ▄▀ \n █ ▄▀▄ ▄▀ \n ▀▄▄▄▄▄ ▄▀ \n ▀▄ ▄ █ \n █ ▀▀█ \n ▀▄▄▄▄▄▄▀ "], ["happy", " ▄▄▀▀▄▄▄▀█ \n ▄▀ ▀▀ ▄▄▀ \n █ ▄▀▄ ▄▀ \n ▀▄▄▄▄▄▄ ▄▀▀█ \n ▄█▀▀▀ ▄▀ \n ▀▄█ █ ▄▄ \n █ ▀ █ \n ▀▀▄▄▄▄▀ "], ["injured_1", " \n ▄▀▀▄▄▀▀█ \n ▄▀ ▀▀ ▄▀ \n █ ▀▄▄ ▄▀ \n █ ▄▄ ▄▀ \n ▀▀█ ▄ █▄ \n █ ▀▄▀ ▀▄ \n ▀▄▄▄▄▄▀▄█ "], ["injured_2", " \n ▄▄ ▄▄▄ \n ▄▀▄▄▀▀ ▄▀ \n ▄▀ ▄ ▀▄ \n █ ▀▀ ▀▄ \n ▀▀█▀▀ █ \n █ █ █▀▄▄ \n ▀▄▄▄█▄▄▄▄█ "], ["sleep_1", " \n ▄▀▀▄▄▀▀█ \n ▄▀ ▀▀ ▄▀ \n █ ▄▄ ▄▀ \n █ ▄▄ ▄▀ \n ▀▀█ ▄ █ \n ▄▀ █▀▀█ \n ▀▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n ▄▄ ▄▄ \n ▄▀▄▄▀▀▀▄▀ \n ▄▀ ▀▄ \n █ ▀▀ ▀▄ \n ▀▄▄▄▀▀ █ \n ▄▀ ▀▄█▀▀█ \n ▀▄▄▄▄▄▄▄▀▀ "], ["walk_1", " ▄▀▀▄▄▀▀█ \n ▄▀ ▀▀ ▄▀ \n █ █ ▄▀ \n ▀▄▄▄▄ ▄ ▄▀ \n █ ▀▄█▀█ \n █ ▀ █ \n ▀▄▄▄▄▀ \n ▄▄▄▄ "], ["walk_2", " ▄▄ ▄▄▄ \n ▄▀▄▄▀▀ ▄▀ \n ▄▀ ▄ ▀▄ \n █ ▀ ▀▄ \n ▀▀█▀ █ █ \n █ █▀▀█ \n ▀▄▄▄▄▄▀ \n ▄▄▄▄ "]]], + ["labramon", [["angry", " ▄▄▄▄▄ \n█ ▀▀▄ \n █▄▀▀▄█▄ ▀▄ \n▄▀ ▄█ █ █ ▄ \n▀█▀ ▄ ▀▄▀ ███\n ▀█▀▄▀ ▀▄ ▄▀\n ▄█ ▄ █ ▄█ █ \n █▄██▄█▄█▄█▄█▄█ "], ["attack", "▄▀▀▀▀▀▄▄ \n▀▄ ▄▄ ▄ ▀▄ \n █▀ █▀▀▄ █ \n█▄▄ ▀▀ ▀▄▀▄ ▄█▄\n ▀███ ▄▀ ▀▄ ▀▀█\n █▄▄▄▀ ▄ ▀▄▀ \n█▀▄▀▄ █ █ ▄█ ▀▄ \n▀▀▀▀▀▀ ▀▀██▄█▄█ "], ["eat_1", "▄▀▀▀▀▀▄▄ \n▀▄ ▄▄ ▄ ▀▄ \n █▀ ▄█▀▀▄ █ ▄ \n█▄▄▄▀▀▀ ▀▄▀▄ ███\n ████ ▀▄ █ \n ▀▄▄ ▄ ▀▄▀ \n ▄█ █ █ ▄█ ▀▄ \n █▄██▄█▄▀▀█▄█▄█ "], ["eat_2", " ▄▄▄▄▄ \n█ ▀▀▄ \n █▄▀▀▄█▄ ▀▄ \n▄▀ ▄▀▄ █ █ ▄ \n▀█▀ ▄ ▀▄▀ ███\n ▀█▀▄▀ ▀▄ ▄▀\n ▄█ ▄ █ ▄█ █ \n █▄██▄█▄█▄█▄█▄█ "], ["happy", "▄▀▀▀▀▀▄▄ \n▀▄ ▄▄ ▄ ▀▄ \n █▀ ▄▀▀▀▄ █ \n█ ▀ ▀ ▀▄▀▄ ▄█▄\n ▀███ ▀▄ ▀▀█\n █▀▀ ▄▀ ▄ ▀▄▀ \n ██▀█ █ ▄█ ▀▄ \n █▄██▄█▄▀▀█▄█▄█ "], ["injured_1", " \n ▄▄▄▄▄ \n█ ▀▀▄ \n █▄▀▀▄█▄ ▀▄ ▄ \n▄▀ █▄ █ █ ███\n▀█▀ ▄ ▀▄▀▄ █\n ▄▀█▀ █ ▄ ▀▀▄▄▀\n█▄█▄▄▄█▀█▄█▄▄█ "], ["injured_2", " \n \n▄▀▀▀▀▀▄▄ \n▀▄ ▄▄ ▄ ▀▄ \n █▀ ▄▀▀▀▄ █ ▄█▄\n█▄▄ ▀▀ ▀▄▀▄ ▀▀█\n █▄▄▄ ▄▀ ▄███▄▄▀\n█▄█▄▄▄█▀█▄█▄▄█ "], ["sleep_1", " \n \n▄▀▀▀▀▀▄▄ \n▀▄ ▄▄ ▄ ▀▄ \n █▀ ▀▀▀▄ █ ▄ \n█▄▄ ▀▀ ▀▄▀▄ ███\n █▄▄▄▄▄▀▄ █▄█▄▄▀\n█▄█▄▄▄█▄▄█▄▄█▄█ "], ["sleep_2", " \n ▄▄▄▄▄ \n█ ▀▀▄ \n █▄▀▀▄█▄ ▀▄ ▄ \n▄▀ ▄▄ █ █ ███\n▀█▀ ▄ ▀▄▀▄ ▄▀\n ▄▀█▀▄▀ ▄ ▄▀▀█ \n█▄█▄▄▄█▄▄█▄▄█▄█ "], ["walk_1", "▄▀▀▀▀▀▄▄ \n▀▄ ▄▄ ▄ ▀▄ \n █▀ ▄█▀▀▄ █ \n█▄▄ ▀▀▀ ▀▄▀▄ ▄█▄\n ▀▄▄▄ ▄▀ ▀▄ ▀▀█\n █ ▀ ▄ ▀▄▀ \n ▄█ █ █ ▄█ ▀▄ \n █▄██▄█▄▀▀█▄█▄█ "], ["walk_2", " ▄▄▄▄▄ \n█ ▀▀▄ \n █▄▀▀▄█▄ ▀▄ \n▄▀ ██▄ █ █ ▄█▄\n▀█▀ ▄ ▀▄█ ▀▀█\n▄▄███▀▀ ▄ ▀▄▀ \n█▄▀▄ ▄█ █ ▄█ ▀▄ \n ▀▀▀▀ ▀███▄█▄█ "]]], + ["ladydevimon", [["angry", " ▄ ▄ \n ▄█████▄ ███ \n █████████ ▄▀ \n▄██▄▀██▀▄████▄ \n▀▄█▄▀▀▀▀▄▀▀▄▄▀█▄\n█▄▄█▀▀▀▀ ▄▄▄█ █\n ▄▄▀▀█▄█▀▀▀▄▄ \n█▄▄█▄█▀▀▀▄█▄▄█ "], ["attack", " ▄██████▄ █▄█ \n████▀ ▄██▄ ▀█▀ \n▀▀█▀▀▀▀███▄ █ \n▄▀█ ▄▀▀████▄▄ \n██▀▀▀▀█ █▄ ▀█▀█\n▀▄▀▀▀▀▀█ █▀▄▀ \n ▄██▄▄▄▄██▄▄ \n█▄▄█▄█▀▄▄█▄▄█ "], ["eat_1", " ▄▄▀███▄▄ █▄█\n ██▄█▄█████ ▄▀ \n ▄▄ ▀█████▄ \n █ ▄█▄▄▄▀▀██▀▀█▄\n ▀▄▀▄▄▄▄▄▀ ▀▀▄ █\n ▀█▄ ▄█▄ ▀▄\n ▄▄▀▀▀█▀▀██▄▀▄▀\n █▄▄█▄█▀▄█▄▄▄█ "], ["eat_2", " ▄▄▄▄▄ █▄█ \n ▄███████▄▀█▀ \n ███▀██████ \n ███▄█▄███▀▀█▄ \n ▀▄ ▄▄█▀▀▄█▄\n ▄▄█ ▀▀▀ ▄▄ ██\n ▀▄▄█▄▄▄▄█▄▄▄▀ ▀\n █▄▄█▄██▄█▄▄▄█ "], ["happy", " ▄█████▄ █▄█\n █▀▄▀█▀▄▀█▄▄▀ \n ▄██▀▀▀▀▀▀▀██▄▄ \n █ █▄▀███▀▄▀ ▄▄▀\n █ ▀▀▄▄▄▀ ▄▀▄██\n ▄▀ █▄ ▄█▀▄█ █\n ▀▀██▀▀█▀▀██ ▀ \n █▄▄█▄█▄█▄▄█ "], ["injured_1", " \n ▄█████▄ ▄▄▄\n █████████▄▀██▄\n █▀ ██ ▀██▄ \n ▄████████ ▀██▄ \n█▀▄▀▄▄▄▄▀▀▀▄▀▄▀█\n ▄█ ▄ ▄ ▄▀▄▀ █\n█▄▄█▄▄█▄▄█▄█▄█ "], ["injured_2", " \n ▄▄▄▄▄ \n ▄███████▄ ▄██▀\n ██▀██▀███▀ ▀▀▀\n █▄▄██▄▄█▀██▄ \n▄███▀▀▀▀█▀▀▄▀██ \n▀▄█ ▀█▀█ ▄▀▄▀▀█\n█▄▄█▄▄█▄▄█▄█▄█ ▀"], ["sleep_1", " ▄██████▄ \n █████████ █▄█\n ▄█▀▀██▀▀██▄ ▀█▀\n▄▀▀█▀▀▀▀█▀▄███ \n█ █ ▀█▀▀ ██ ▀█ \n █▀▄█▄█▀ █ ▀ \n ▀▄▄█▄▄█▀ \n ▄▄▄▄▄▄▄▄▄▄▄ "], ["sleep_2", " ▄██████▄ █▄█ \n █████████ ▀█▀ \n █▀▀██▀▀██▄▀ \n █▀█▀▀▀▀█▀▄▀█ \n█▀█▄▀█▀█▄▀█ ▀█ \n▀ █ ▀█▀▀▄▄▀ ▀ \n ▀▀▀▀▀▀ \n ▄▄▄▄▄▄▄▄▄▄ "], ["walk_1", " ▄█████▄ ▄ ▄\n █████████ ███\n █▄▀██▀▄███ ▄▀ \n ███▀▀▀▀▀█ ▀█▄ \n█▀▄▀▀▄▄▄▀▀▀▄ ██▄\n██ █▄ ▄█▄ █ ██\n ▀▄█▀▀█▀▀▀▄▄█ █ \n █▄▄█▄█▀▄█▄▄█▀ "], ["walk_2", " ▄█████▄ █▄█\n █████████ ▀█▀\n ██▄▀██▀▄███▄█ \n██▀█▀▀▀▀▀█▄▀▀██▄\n▀ █▄▀▄▄▄▀ █▄ ▀█\n▄▀ ▀▄ █ █▀▄█ \n▀▀▀██▀██▀▄▄█ \n █▄▄██▄▄▄█ "]]], + ["ladydevimon_x", [["angry", "▄ ▄▄▄▄▄▄ ▄▄ \n████████████▀▄ ▄\n ██▄▀█▀▄███▀ ███\n ██▀▄▀███ █ ▀█▀\n ▄█▄▀▀▀▀▄█▄▄█▀ \n█ ▄██████▄ █▄ \n▀▀██ ▀ ▄██████ \n █▄▄█▄█▀▄▄█▄█▀█ "], ["attack", " █▄██████▄▄██\n █▄▀█▀▄█████ \n ▀█▀▄▀████▀ \n▀▀▄ █▀▀▀▀▀██ \n▀▀▄█▀▀▀▄▄▄█▀▀█▄ \n▀▀█▄ ▀ ▄▄▄ ██ █ \n▀▀▄▀▀██▄▄██▄▄██▄\n▀▀ █▄▄█▄▄█▄█ ▀█"], ["eat_1", "█▄▄▀███▀█▄▄██ \n▀███▄▀▄█████ █▄█\n ▀██▄█▄███▀▄ ███\n █ █ ▀▄▄▀ \n █ █▄▄▄▄█▀█▄▀ \n ▀▄█▀█▀▀██ ██ \n ▄█▀▄▄██▄▄███ \n █▄▄█▄█▀▄▄█▄█▀▀ "], ["eat_2", "▄ ▄▄▄▄▄▄ ▄▄ \n████████████▀▄ ▄\n █▀▄▀█▀▄▀██▀ ███\n ████████ █ ▀█▀\n ▀▄▀▀▀▀▄█▄ █▀ \n ▄▀██████ ██▄ \n█▄▄█ ▀ ▄█▄▄██▄ \n █▄▄█▄█▀▄▄█▄██ "], ["happy", "█▄▄██████▄▄██ \n▀██▀███▀████ ▄ ▄\n ▀▄█▄█▄█▄█▀ ███\n▄▀█▀▀▀▀▀▀██▀▄▀█▀\n▀▄▀▄ ▄▀ ▄▀▀ \n ▀█▀█▀▀█▀██▄ \n ▄█▀▄▄███▄███ \n █▄▄█▄█▀▄▄█▄█▀█ "], ["injured_1", " \n▄ ▄▄▄▄▄▄ ▄▄ \n████████████▀ \n ███▀██▀███▀ \n █▄▄██▄▄█ █▄█\n ▀▄▀▀▀▀▄█▄ ███\n ▄▀█▀█▀▀█ ██▄ █ \n█▄▄█▄▄▄██▄▄███ "], ["injured_2", " \n \n█▄▄██████▄▄██ \n▀███████████ \n ▀█▀ ██ ▀█▀ ▄ ▄\n █▀████▀█ ███\n ▄▀█▄▄▄▄█▀█▄▄▀█▀\n█▄▄█▄▄▄██▄▄███ "], ["sleep_1", "█▄ ▄████▄ ▄██▄ ▄\n▀██████████▀ ███\n █▀██▀▀██ ▀█▀\n ▀█▀▀▀▀█▀ ▄▄▀ \n █ ▀█▀▀ █▀▀ \n █▀█▀▀█▀ \n ▀▀▀▀ \n ▄▄▄▄▄▄▄▄▄ "], ["sleep_2", "▄ ▄▄▄▄ ▄▄ \n██▄██████▄██▀ \n ▀████████▀ █▄█\n █▄██▄▄██ ███\n ▄▀▄▄▄▄▀▄▄ ▄▀ \n ▀▄▄█▄▄▄█ ▀▀ \n ▀▄█▄▄▀ \n ▄▄▄▄▄▄▄ "], ["walk_1", "█▄▄██████▄▄██ \n▀██▄▀█▀▄████ █▄█\n ▀██▀▄▀███▀▄ ███\n █▀▀▀▀▀▀█ ▀▄▄▀ \n ▄█▄▄▄▄█▀█▄▀ \n █ █▀█▀▀██ ██ \n ▀▄█▀▄▄██▄▄███ \n █▄▄█▄█▀▄▄█▄█▀█ "], ["walk_2", "▄ ▄▄▄▄▄▄ ▄▄ \n███▀███▀████▀▄ ▄\n ███▄▀▄████▀ ███\n ██▄█▄███ █ ▀█▀\n ▀▄ ▄█▄ █▀ \n ▄▀██████▄▀█▄ \n █▄█ ▀ ▄█▄▄██▄ \n █▄▄█▄█▀▄▄█▄██ "]]], + ["lalamon", [["angry", " ▄▄ ▄▄ \n ▄▄█▄▄ \n ▄▀ ▀ ▀ ▀▄ \n ██▄ ▄█ █ \n █ ▄ █ \n █▄▄▀▄ ▄▄▀▄▄█ \n █ ▄ ▀▀ ▄ █ \n ▀▀▄██▀▄▄█▀ "], ["attack", " ▀██▄██▀ \n ▄▀ ▀ ▀ ▀▄ \n █▀▄ ▄▀ █ \n █ ▄▄ █ \n ▄▀ ▄ ██ ▄ █ \n █▀▀ ▀▄▄▀▀ ▀ █ \n ▀▀▄ ▀▀█ \n ▀▄██▀▀▀▀ "], ["eat_1", " ▀██▄██▀ \n ▄▀ ▀ ▀ ▀▄ \n █ █ █ █ \n █ ██ █ \n █▄▄▀▄▀▀▄▄▀▄▄▀ \n ▀▄▄ ▀▀ ▀█ \n █▄ ▄▀ \n ▀▄██▀▄▄█ "], ["eat_2", " ▄▄ ▄▄ \n ▄▄█▄▄ \n ▄▀ ▀ ▀ ▀▄ \n █▄▀▄ ▄▀▄█ \n █ ▄▄ █ \n █▄▄▀▄ ▄▄▀▄▄█ \n ▀▄▄ ▀▀ ▄▄▀ \n █▄▄▀█▄▄▀ "], ["happy", " ▀██▄██▀ \n ▄▀ ▀ ▀ ▀▄ \n █▄▀▄ ▄▀▄█ \n █ ▄▄ █ \n ▄▀ ▄ ▀▀ ▄ ▀▄ \n ▀█▀ ▀▄▄▀▀ ▀█▀ \n █▄▄ ▄▄█ \n ▀▄██▀▄▄█ "], ["injured_1", " ▄▄ ▄▄ \n ▄▄█▄▄ \n ▄▀ ▀ ▀ ▀▄ \n █▄▀ ▀▄▄ █ \n █ ▄▄ █ \n ▀▄▄▀▄ ▄▄▀▄▄▀ \n █ ▀▀ █▀▄ \n █▄▄▀▄▄▄█▄▄█▄█ "], ["injured_2", " \n ▀▀▄▀▀ \n ▄▀█▀█▀▄ \n █ ▄ ▄ █ \n ▄▀▀ ▀▀ ▀▄ \n ▄▀ ▄ ██ ▄ ▀▄ \n ▀█ ▀▄▄▀▀ █▀▄ \n █▄▄▀▄▄▄█▄▄█▄█ "], ["sleep_1", " \n ▀▀▄▀▀ \n ▄▀█▀█▀▄ \n █ █ \n ▄▀▄▄ ▄▄ ▀▄ \n ▄▀ ▄ ▄ ▄ ▀▄ \n ▀▀█▄▀▄▄▀▀▄█▀▀ \n █▄▄█▄▄▄█▄▄█ "], ["sleep_2", " ▄▄ ▄▄ \n ▄▄█▄▄ \n ▄▀ ▀ ▀ ▀▄ \n █▄▄ ▄▄ █ \n █ ▄ █ \n █▄▄▀▄ ▄▄▀▄▄█ \n █▄ ▀▀ ▄█ \n █▄▄█▄▄▄█▄▄█ "], ["walk_1", " ▀▀▄▀▀ \n ▄▀█▀█▀▄ \n █ ▄ ▄ █ \n ▄▀ ▀ ▀ ▀▄ \n ▄▀ ▄ ▀ ▄ ▀▄ \n ▀▀█ ▀▄▄▀▀ ▀█▀ \n █▄▄ ▄▄█ \n ▀▄██▀▄▄█ "], ["walk_2", " ▄▄ ▄▄ \n ▄▄█▄▄ \n ▄▀ ▀ ▀ ▀▄ \n █ █ █ █ \n █ ▄ █ \n █▄▄▀▄ ▄▄▀▄▄█ \n ▀▄▄ ▀▀ ▄▄▀ \n █▄▄▀█▄▄▀ "]]], + ["lavogaritamon", [["angry", " ▄▄▄ \n ▄▄███▄▄▀ ▄██▀\n█████▀ ██▄██▄██▀\n█▀▀ ██████▄███▀▀\n ▀█████▀▄████▀▀ \n █ ▄███▄▀██▀ \n ▄█████████▄▄ \n█▄█▄▀▀▀▀▀▄▄█▄█ "], ["attack", " ▄▄▄▄▄▀▀█ ▄██▀\n ████▀ ███▄▀▄██▀\n ██▀▀▀▀███▀▄███▀\n █ ▄▄ ██████▄ \n █▄▄▄▄▄█████▄ \n █▀████ ▀▀ \n ▄████████▄ \n █▄█▄▀ ▀▄▄█▄█ "], ["eat_1", " ▄▄▄▄▄▀▀█ \n ████▀▄▀█▀ ▄▄██▀\n ████▀███▄▀█▄██▀\n █ ███████▀▀\n ▀█▄▄███████▀▀ \n █ ▄███ ██▀ \n ▄████████▄ \n █▄█▄▀ ▀▄▄█▄█ "], ["eat_2", " ▄▄▄ \n ▄▄███▄▄▀ ▄██▀\n █████▀▄▀█▄█▄██▀\n █▀▀ █████▄███▀▀\n ▀████▀▄████▀▀ \n █▀▀███▀██▀ \n ▄███▄█████▄▄ \n█▄█▄▀▀▀▀▀▄▄█▄█ "], ["happy", " ▄▄▄▄▄▀▀█ ▄▄▄\n ████▀▄▀█▀▄▄▀██▄\n ████▀████▀████▄\n █ ██▀████▄ \n ▀▄▄▄██▄████▄ \n █ ▄███ ▀▀ \n ▄████████▄ \n █▄█▄▀ ▀▄▄█▄█ "], ["injured_1", " \n ▄▄▄▄▄▄▄ \n ▄▄███▀██▄▄▀ \n ███▀█▄▄██▄█▀██▀\n █▄▄▄███▀▀▄███▀▀\n █ ▄███████▀▀ \n▄▀▀█████▀▀▀██▀ \n█▄▄▄████▄▄▄▄▀▀ "], ["injured_2", " \n \n ▄▄████▀▀█ \n█████ ▀██▀▄▄▄▄▄▄\n█▀▀ █████▀█▄███▄\n ▀▀█▀▀█▄▄█████▄ \n▄▀▀█▄███▀▀███▄ \n█▄▄▄████▄▄▄▀█▄ "], ["sleep_1", " \n ▄▄▄ \n ▄▄███▄▄▀ \n█████▀▀█ ▄▀███▀ \n█▄▄ █████▀███▀▀ \n ▀▀█▀▀█▄▄███▀▀ \n▄▀▀█▄██▀▀███▀ \n█▄▄▄███▄▄▄█ "], ["sleep_2", " \n ▄▄▄▀▀█ \n ▄▄██████▀ ▄▄▄▄▄\n █▀▀▀█▄▄█▄█▄███▄\n ▀██▄███▀▀▄███▄ \n █ ▄███████▄ \n▄▀▀█████▀▀▄▀▀ \n█▄▄▄████▄▄▄█ "], ["walk_1", " ▄▄▄▀▀█ ▄▄▄\n ▄▄████▀█▀ ▄▀██▄\n ███▀█▄▄█▄▀████▄\n ▀▄▄▄███▀█████▄ \n ▀███▄█▀███▄ \n █ ▄██▄ ▀▀ \n ▄████████▄ \n █▄█▄▀ ▀▄▄█▄█ "], ["walk_2", " ▄▄▄ \n ▄▄███▄▄▀ \n █████▀ █ ▄▀███▀\n █▀▀ █████▀███▀▀\n ▀████▀▄████▀▀ \n █▀▀███▀██▀ \n ▄███▄█████▄▄ \n█▄█▄▀▀▀▀▀▄▄█▄█ "]]], + ["lavorvomon", [["angry", " \n ▄▄▄ \n ▄▄████▄▄▀ \n█████▀▀ ██▀ \n█▀▀ ▀█████▀▄▄ \n ▀▀▀█████▄█▄▀ ▄█\n ▄████████████▀\n █▄███▄██▀▀███▄█"], ["attack", " ▄▄▄▄▀█▀▀█ \n█████▄▄███▄ \n█ ▀ ▀ ▀███▄ \n █ ████▀█ ▄\n▄▀ ▄ ▄ ██▀▄▀▄ ██\n ▀▀█████████▄██▀\n ▄█████████▀███ \n█▄███ █▄███ █▄█"], ["eat_1", " ▄▄▄▄▀▀█ \n▄▄███▀▀▀██▄ \n▀█▀▀▀█████▄ \n █ ▄▄ █████ \n▀▄▄▄▄████▀▄▀█ ▄\n ▄████████▄▄██\n ▄██▀█████▀███▀ \n█▄███ █▄███ █▄█ "], ["eat_2", " \n ▄▄▄▄▀▀█ \n▄▄████▀███▄ \n███▀█▄█▄██▄ \n▀▄▄▄▄████▀▄▀█ ▄\n ▄████████▄▄██\n ▄██▀█████▀███▀ \n█▄███ █▄███ █▄█ "], ["happy", " ▄▄▄▄▀▀█ \n▄▄███▀▄▀██▄ \n████▀█████▄ \n █ ████▀▄▄ \n▄▀ ▄████▄█▄▀ █ \n ▀▀█████████▄██ \n ▄██▀█████▀███ \n█▄███ █▄███ █▄█ "], ["injured_1", " \n \n ▄▄▄ \n ▄▄████▄▄▀ \n█████▀████▀ \n█▀▀ ▀█▄▄██▀█▄▄ \n ███▀█████▀████▄\n█▄███ █▄███ █▄██"], ["injured_2", " \n \n \n ▄▄▄▄▀▀█ \n▄▄████████ \n███▀█▄▀▀██▀▄ \n▀▄▄▄▄█████▀███▄ \n█▄█████▄█████▄██"], ["sleep_1", " \n \n ▄▄▄ \n ▄▄████▄▄▀ \n██████▀▀██▀ ▄\n█▀▀ ▀█████▀█▄▄██\n ███▀█████▀███▀ \n█▄███ █▄███ █▄█ "], ["sleep_2", " \n \n ▄▄▄▄▀▀█ \n▄▄████████▄ \n███▀██▄▄██▄ ▄\n▀▄▄▄▄████▀▄█▄▄██\n ▄▄█▀█████▀███▀ \n█▄███ █▄███ █▄█ "], ["walk_1", " \n ▄▄▄▄▀▀█ \n▄▄████▀▀██▄ \n███▀█▄▄███▄ \n▀▄▄▄▄████▀▄▀█ ▄\n ▄████████▄▄██\n ▄██▀█████▀███▀ \n█▄███ █▄███ █▄█ "], ["walk_2", " \n ▄▄▄ \n ▄▄████▄▄▀ \n█████▀ ▄██▀ \n█▀▀ ▀█████▀▄▄ \n ▀▀▀█████▄█▄▀ ▄█\n ▄▄████████████▀\n█▄████▄██▀▀███▄█"]]], + ["lekismon", [["angry", " ▄▄▄▄ ▄▄▄▄ \n ▀▄▄▀▄ ▀▄ █ ▄\n ▄██████▄▄▀▀▄\n ▄████▀ ██ ▀▀ \n ▀█▀▀▀██▀▄▄ \n ▄▀▄▀▀▀▄ ▄ ▀▄ \n ▀▄▄██▀ ▀▀█▄▄▀ \n █▄▄█▀█▄▄▄█ "], ["attack", " ▀█▀▀▄▀█▀▀▄ \n ▄███▀▄█▄█ \n ▄████▄▄██▀▄▄▀ \n ▀▄ ▀██▀▀▀▄▀ \n ▄▀▀▀▀▀ █ \n ▀▄▄███▀ █ \n █ █ ▀▄ \n █▄▄█▀▄▄▄▄█ "], ["eat_1", " ▀█▀▀▄ ▀█▀▀▄ \n ▀▀▄█▄▄█▄▀ ▄▄ \n ███▀▄▀██▀▄▄▀\n █▀▀▀▀▀██▀ ▀\n ▄▀▄ ▄▀▄▄▄▄ \n ▀▄▄███▄▀▄▄ █ \n ▄▀▀ ▀██ \n █▄▄█▀█▄▄▄█ "], ["eat_2", " ▀█▀▀▄ ▀█▀▀▄ \n ▀▀▄█▄▄█▄▀ ▄▄ \n ████▀███▀▄▄▀\n ████▄█▄█▀ ▀\n ▀▄▄▄▀▀▄ \n ▄▀▄▄▄▀▄▄▀▄ \n ▀▄▀▀ █▄▄▀ \n █▄▄█▀█▄▄▄█ "], ["happy", " ▀█▀▀▄ ▀█▀▀▄ \n ▀▀▄█▄▄█▄▀ ▄▄ \n ███▀▄▀██▀▄▄▀\n ▄█▀▀▀▀▀███▄ ▀\n ▀▄▀▄ ▄█▀ ▄▀ \n ▀████▀▄▄▀ \n ▄▀▀ ▀▄ \n █▄▄█▀█▄▄▄█ "], ["injured_1", " ▄▄ ▄▄▄ \n▄█▄▄▀▄▀▀▄ █ \n ▄██████▄▄▀▀▄ \n ▄███▄▀▀██ ▀▀▄ \n ▀█▀▀▀██▀▀▄ \n ▄▄█▄▄▄█▄ ▄█▄▄ \n █ ▀▄ ▀█▀ █▀ █\n ▀▄▄█▄▄▀▄▄▀▄▄▄▀ "], ["injured_2", " \n ▄▀▀▄ ▄█▀▀▄ \n▀▀▀▀▄█▄▄█▄▀ ▄▄▀ \n ███▀████▀▄▄▀ \n █████▄▄██▄ \n ▄█▄▄▄▄█▄ ▄█▄▄ \n █ ▀▄ ▀█▀ █▀ █\n ▀▄▄█▄▄▀▄▄▀▄▄▄▀ "], ["sleep_1", " \n▀█▀▀▄ ▀█▀▀▄ \n ▀▀▄█▄▄█▄▀ ▄▄ \n ████████▀▄▄▀ \n ████▄▄▄██▄ ▀ \n ▄█▄████▄ ▄█▄▄ \n █ ▀▄ ▀█▀ █▀ █\n ▀▄▄█▄▄▀▄▄▀▄▄▄▀ "], ["sleep_2", " ▄▄▄▄ ▄▄▄▄ \n ▀▄▄▀▄ ▀▄ █ ▄\n ▄██████▄▄▀▀▄\n ▄███▀▀▀██ ▀▀ \n ▀█▀▀███▀█ \n ▄▄██▀▀██ ▄█▄▄ \n █ ▀▄ ▀█▀ █▀ █\n ▀▄▄█▄▄▀▄▄▀▄▄▄▀ "], ["walk_1", " ▀█▀▀▄ ▀█▀▀▄ \n ▀▀▄█▄▄█▄▀ ▄▄ \n ████▀▀██▀▄▄▀\n ████▄▄██▀ ▀\n ▀▄▄▄▀▀▄ \n ▄▀▄▄▄▀▄▄▀▄ \n ▀▄▀▀ █▄▄▀ \n █▄▄█▀█▄▄▄█ "], ["walk_2", " ▄▄▄▄ ▄▄▄▄ \n ▀▄▄▀▄ ▀▄ █ ▄\n ▄██████▄▄▀▀▄\n ▄███▀ ▄██ ▀▀ \n ▀█▀▀▀██▀▄ \n ▄▀▄▀▀▀▄ ▄ ▀▄ \n ▀▄▄██▀ ▀█▄▄▀ \n █▄▄█▄▄▄█ "]]], + ["leomon", [["angry", " \n \n \n \n \n \n \n "], ["attack", " ▄▄▀▀▀▀▀▀▀▀▀█ \n █▀▀▄█▀▀▀▀██ █▄▄\n▄▀█▄ ▄█ █▀ ▄▀\n█▄ ▄ ▄ ▄ █ ▀▀█\n▄▀██████ █▄▄▄▀▀█\n█ █▀█▀█▀ █ █ █\n█▀▄▄▄▄▄▄▀▀▄▄▄▄█▄\n █▄▄█▄██▀▀█▄▄█▄█"], ["eat_1", " ▄▄▀▀▀▀▀▀▀▀█ \n █▀▀▄▄▀▀▄▀██ █▄▄\n█▀▀ ▀▀ ▄▀ ▄▀\n ▀██████ █ ▀▀█\n▄▀█████▀ █▄▄▄▀▀█\n█▀▄▄▄▄▄▄▀█ █ █\n█▄ █▄▄ ▀▄▄▄▄█▄\n █▄█▄██▀▀█▄▄█▄█"], ["eat_2", " ▄▄▄▄▄▄▄▄▄ \n ▄▄▄▀▀▄▄ ▄▄▄ ▄▀ \n ▀▄▀▀▀ ▀ █▀ ▀▀█\n█▀ ▄ ▄▀▀▄▀▄ ▄█▄\n▀█▀▀▀ ▄▀ ▄▄▀\n▄▀███▀█▀▀▄█▀█ █ \n█ █ █ ▀█ █ █▄\n▀▄▄▄▄██▄█▄▄▄▄█▄█"], ["happy", " ▄▄▀▀▀▀▀▄▀▀▀▄\n █▀▀▄▄▀▀▄▀▀█ █\n█▀▀ ▄▀▄ ▄▀▀▄▄ █\n▀▄▄▄▄▄▄▄ █ ▄▀ █\n █████▀▄█▄▄█ █\n▄▀▄▄▄▄▄▄▀▄▄▄▀▀▄▀\n█ ▀▀▄▄▄▄▄▄▄▄▄▄█▄\n▀▄▄▄█▄██▀▀█▄▄█▄█"], ["injured_1", " \n ▄▄▀▀▀▀▀▀▀▀█ \n █▀█▄▄▀▀▄▀██ █▄▄\n▄▄▀ ▄ ▄▀ ▄▀\n█▄▄▄▄ ▀▀ █ ▀▀█\n █▄▄▄▄▄▄▄▀▄▄▄▀█ \n █ ▀█ ▀▀█▀▀ █▄\n█▄█▄▄████▄▄▄▄█▄█"], ["injured_2", " \n ▄▄▄▄▄▄▄ \n ▄▄▄▀▀▄▄ ▄▄▄ ▀▄ \n ▀▄▀▀▀ ▀ █▀ ▀█ \n█▀ ▄ ▀▄ ▄▄█\n▀█▀▀ ▀▀ ▄▀ ▄▀▄\n █▀▀▀█▀▀▀▄▀▀▀ ██\n█▄█▄▄████▄▄▄▄█▄█"], ["sleep_1", " \n ▄▄▀▀▄▀█ ▄▄ \n▄▀▀▄ ▄▀ ▄▀▀ █▄▄\n█ ▄ ▀ █\n▄▀█ ▄▀▄▀██ █\n▀▄▀▀▀▀ ▄▀ ▄▀▄\n█▀▀▀▄ ▄▄▄▀▀▀▀█▀█\n█▄▄▄█▄▄▄█▄▄▄▄█▄█"], ["sleep_2", " ▄▄ ▄▄ \n ▄▄▀ █ ▀▄▀▀▄ \n█ ▀ ▀ ▀ █▀▄\n▀█▄▀ ▄ ▄▄▄ █\n█ █▄▄▄▀ ▀ █▀ ▄▀\n █ ▀▄ ▄▀ █\n█▀▀▀▄ ▀▀▄▀▀▀▀█▀█\n█▄▄▄█▄▄▄█▄▄▄▄█▄█"], ["walk_1", " ▄▄▀▀▀▀▀▀▀▀█ \n █▀█▄▄▀▀▄▀██ █▄▄\n▄▄▀ ▄▄ ▄▀ ▄▀\n█▄▄█▄▀▀ █ ▀▀█\n █▄▄▄▄▄▄▄█▄▄▄▀▀█\n█ █▄▄▀▄▄▄▄▄▀▀ █\n█ ▀▀▄▄ █▄▄█▄\n▀▄▄▄█▄██▀▀█▄▄█▄█"], ["walk_2", " ▄▄▄▄▄▄▄▄▄ \n ▄▄▄▀▀▄▄ ▄▄▄ ▄▀ \n ▀▄▀▀▀ ▀ █▀ ▀▀█\n█▀ ▄ ▄█▀ ▀▄ ▄█▄\n▀█▀▀▀ ▄▀ ▄▄▀\n█▀▀█▀▀█▀▀▄█▀█ █ \n▀▄▄██▀ ▀█ █ █▄\n█▄█▄▄████▄▄▄▄█▄█"]]], + ["leomon_x", [["angry", " ▄▄▄▄▄▄▄▄▄ \n ▄▄▄▀▀▄▄ ▄▄▄ ▄▀ \n ▀▄▀▄▀ ▀ ▄▀ ▀█\n ▄▀▄ ▄█ ▀▄ ▄▀ \n █▀▀▀ ▄▀ ▄▄▄▀ \n ▄▀▀███████▀██▄ \n █ █▄▄▄█ ▄███\n█▄██▄█▀▀▀███▄█▄█"], ["attack", " ▄▄▀▀▀▀▀▀▀▀█ \n █▀█ ▄▀▀█▀▀█ ▀▄▄\n ▄▀ ▀ ▀▀▄▀ ▄▀\n ▀█▄█▄█▄ █ ▀▄ \n ▄▀█▀█▀█ █▄███▄ \n▄▀▄▄▄▄▄▄███▄ ▀██\n█ ▀ █▄▄▄▄█ ▀ ██\n▀▄▄▄█▄█▀▄█▄▄▄▄▀▀"], ["eat_1", " ▄▄▀▀▀▀▀▀▀▀█ \n █▀█ ▄▀▀▄▀▀█ ▀▄▄\n ▄▀ ▀ ▀▀ ▄▀ ▄▀\n ▀██████ ▄▀ ▀▄ \n ▄█▀▀▀▀ █▄▄███▄ \n█ ▀█▀▀▀▀▀█ ▀ █\n ▀▄█▄▀▀█▀▀▀█▄▄█▀\n █▄█▄▄█▀█▄█▄█▄█ "], ["eat_2", " ▄▄▄▄▄▄▄▄▄ \n ▄▄▄▀▀▄▄ ▄▄▄ ▄▀ \n ▀▄▀▄▀ ▀ ▄▀ ▀█\n ▄▀▄ ▄▀▄ ▀▄ ▄▀ \n █▀▀▀ ▄▀ ▄▄▄▀ \n ▄▀▀██████▀▀█▀█▄\n █▄▄█▄▄▄▄█▄▄▄▄█▀\n█▄█▄▄█▀▀█▄▄█▄█▄█"], ["happy", " ▄▄▄▀█▀▀█▀▀█▀▀█ \n ▀▄▀▀▄▀▄ ▄▀ ▀▄▄\n █▄█▄▄▄▄ █ ▄▄▄▀\n ██████ █ █ █\n █▀▀▀▀ █▄██ ▄▀\n ▀█▀▀▀▀▀█ ▄█▄ \n ▄█▄▀▀█▀▀▀███▀▀\n █▄█▄▄█▀█▄█▄█▄█ "], ["injured_1", " \n ▄▄▀▀▀▀▀▀▀▀█ \n █▀█ ▄▀▀▄▀▀█ ▀▄▄\n █ ▀ ▄ ▄▀ ▄▀\n █▄█▄ ▀▀ ▄▀ ▀▄ \n ▀▄▄▄▄▄▄█▄▄███ \n █ ▀▀▄▄▄▄▄█▀ ██\n█▄█▄▄██████▄▄█▄█"], ["injured_2", " \n ▄▄▄▄▄▄▄▄▄ \n▄▄▄▀▀▄▄ ▄▄▄ ▄▀ \n▀▄▀▄▀ ▀ ▄▀ ▀█ \n▄▀▄ █▄ ▀▄ ▄▀ \n█▀▀▀ ▄▀ ▄▄▄█▄ \n █▀▀▀█▀▀▀▀█▀ ██\n█▄█▄▄██████▄▄█▄█"], ["sleep_1", " \n ▄▀▄▀▄▀▀▄▀▀█ \n ▄▀ █ ▄▀ ▀ ▀▀▀█\n█▀▀▄ ▄▀▀█ ▄█▄\n █ █ ▄▀ ▄▀ ▄▀\n ▄▀ ▀▀ ▄▀ ▄██▄\n▄▀▀▄ ▄▀▀▀▀██▀ ▀█\n█▄▄███▄▄▄███▄▄▄█"], ["sleep_2", " ▄ ▄ ▄▄ ▄▄▄ \n ▄▀▄▀ █ ▄▀ ▄█▄▄\n▄█▄ ▀ ▀ ▄▄▄ ▄▀\n▀▄ █ ▄▀ ▄▀ ▀▀█\n ▀▄▀▄▄▀ ▀▄ ▄▀ \n █ ▄▀ ▄███▄\n▄▀▀▄ ▄▀▀▀▀██▀ ▀█\n█▄▄███▄▄▄███▄▄▄█"], ["walk_1", " ▄▄▀▀▀▀▀▀▀▀█ \n █▀█ ▄▀▀▄▀▀█ ▀▄▄\n █ ▀ ▄▄ ▄▀ ▄▀\n █▄█▄▀▀ ▄▀ ▀▄ \n ▀▄▄▄▄▄▄█▄▄███ \n ▄▀ █▀▀▀▀▀█▀ ██▄\n ▀▄█▄▀▀█▀▀▀▄▄█▀▀\n █▄█▄▄█▀█▄█▄█▄█ "], ["walk_2", " ▄▄▄▄▄▄▄▄▄ \n ▄▄▄▀▀▄▄ ▄▄▄ ▄▀ \n ▀▄▀▄▀ ▀ ▄▀ ▀█\n ▄▀▄ ▄█▀ ▀▄ ▄▀ \n █▀▀▀ ▄▀ ▄▄▄▀ \n ▄▀▀███████▀▀▀█▄\n▀▄▄██▄▄▄▄▄██▄▄█▀\n█▄█▄▄█▀▀▀█▄█▄█▄█"]]], + ["leopardmon", [["angry", " ▄▄▄ ▄▄▄ ▄▄▄ \n ████ ▄████▀ ▄▄ \n █▀███▀▀██▄▀▄▄▀\n █▄ █ ▄█▀█ ▄▄▀\n █▀█▀▀▀▀▄▀▀▀▄▄▄▀\n█▀▀▄▀▀▀▀▄▀▀▄█ \n▀▄▄█▄█▀▀█▄▄▄▀▄▄ \n █▄▄▄▀▀▄▄▄█▀▄▄█"], ["attack", " ▄▄▄▄ ▄▄ ▄▄▄ \n ▀██▀▄▄███▀▄▀█\n ▄▄████▀▀██ █ ▀█\n██████▄▄███▄█ ▀█\n ▀▄ ▀ ▀██▀ █▄▀▄\n ▄▀▄▄▀▄▄▀█▀█ █\n █▄▄▄▄▄▄▀ ▄▀█ █\n█▄▄█▄▄▄▄▄▀ █▄▄▄█"], ["eat_1", "███▄▀▀█▄▄███ \n █▀█▄█▀▀██▀ ▄▄▄▄\n █▄▄█▄▄███▄▀ ▄▄▀\n █▄▄▄▄▄ ▄█▄ ▄▄▀\n█ ████▀▄ █▄▄▄▀\n▀▄█ ▄▄▄ █▀ █ \n ▄▀▀▄▄▄▀▀▀▄▄▀▀▄ \n█▄▄▄█ █▄▄▄█▀▀▄█"], ["eat_2", " ▄▄▄ ▄▄▄ ▄▄▄ \n ████ ▄████▀ \n █▀███▀███ ▄▀▀█\n █▄█▄█▄█▄▀█▀ ▀▀▄\n █▀█▀▀▀▀▄▀▀▀▄▀▀▄\n █▄▄▀▀▀▀ ▀▄▄▀█▀ \n█ ▄█▄█▀▀▄▄█ █▄ \n▀▀█▄▄▄▀▀▄▄▄█▀▄▄█"], ["happy", " ███▄█▀▀▄███ \n ██▀█▄█▀██ ▄▀▀█\n █▄█▄█▄█▄█▀ ▀▀▄\n▄▀█ ▄▄▄▄ █▀▄▀▀▄\n█ ▀▄████▄█ █▀▀ \n ▀█ ▄▄▄ ▀▄▄▀ ▄▄\n █▀▀▄▄▀▀▀▄▀▀▀▄▀\n █▄▄▄█ █▄▄▄█▀▀ "], ["injured_1", " \n▄██▄█▀▀▄███▄ \n████ ▄████▀▀ \n █████████ ▄▀▀▄ \n █▀▀██▀▀█▀▀▄ ▀▄\n█ █▀▀▀▀█ █ █ █\n▀█▀▄▄▄▄▄█▀▀██▄█▀\n█▄▄█▄▄█▄█▄▄▄█▄▄█"], ["injured_2", " \n ▄▄ ▄▄▄ ▄▄▄ \n████▀ ▄█████ \n▀███▄█████ ▄▄ \n █████████▄▀ █ \n▄▀▄▄██▄▄▀ █ ▄ █\n▀█▀▄▄▄▄▄█▀▀█▄█▄█\n█▄▄█▄▄█▄█▄▄▄█▄▄█"], ["sleep_1", " \n▄██▄▀▀█▄███▄ \n████▄█████▀▀ \n █▀▀█▀▀▀██ ▄▀▀▄ \n▄██████▀▄██ ▀▄\n▀▄█▄▄▄▄█▄▄▄█ █ █\n█ █▀▀▄█ █▄ █▄█▀\n▀▄▄██▄█▄▄▄▀▀▄▄▄█"], ["sleep_2", " ▄▄ ▄▄▄ ▄▄▄ \n████ ▄██████ \n▀█████████ ▄▄ \n █▄▄█▄▄▄▀█▄▀ █ \n█▀█▀▀▀▀▄▀▀▀▄ ▄ █\n▀▄▄▀▀▀▀▄█▄▄█▄▀▄█\n█ █▀▀▄█ █▄ █▄▄ \n▀▄▄██▄█▄▄▄▀▀▄▄▄█"], ["walk_1", "███▄▀▀█▄███ ▄▄▄\n▀███▄█████ ▄▀▄▄▀\n █ ▀█▀ ▄███ ▄▄▀\n▄██████▀▄█▄ ▄▄▄▀\n█ ▀▄▄▄▄▀▄ █ \n█▀█ ▄▄▄ █▀ █ \n▀▄▀▀▄▄▄▀▀▀▄▄▀▀▄ \n█▄▄▄█ █▄▄▄█▀▀▄█"], ["walk_2", "▄▄▄ ▄▄▄ ▄▄▄ \n████ ▄████▀ ▄▀▀█\n █▀███▀▀██▄▀ ▀▀▄\n █▄▄█▄▄█▀█▀ ▀▀▄\n█▀█▀▀▀▀▄▀▀▀▄▀▀▀ \n█▄▄▀▀▀▀ ▀▄▄█ \n▀▄█▄█▀▀▄█ █▀▄▄ \n █▄▄▄▀▀▄▄██▀▀▄▄█"]]], + ["leopardmon_x", [["angry", " ▄▄ ▄▄▄▄▄ \n █▄▀▀ █ ▀▄▀▄ \n ▄▀▀ ▄█ ▄▀▄▄▄▀ \n ▀▄▄▄▄▄ ▄▀▄▄█ \n ▀▄▄▄▄█▀▄ ██▄\n▄▀█ ▄▀▄ █▀▀██ █\n▀▄▀▀▄ ▄▀▀▄▄▄█ █\n█▄█▄█▀▀█▄█▄█ ▀▄█"], ["attack", " ▄▀█▄▀█▀█▀▄ \n ▄█▀ ▄▄▀ ▄█ ▀▄\n █ ▀▀ ▀▄██▀ \n ████▄ ▄█▀▄▄█ \n ▄█▄▄▄▄▄█▄▀▄▄▄▀█\n▀▄▄▄▄▄▄▄▄▄ █ ▄█\n ▄▀▀▄▄▄█▀▀██ █\n █▄█▄█ █▄█▄█▀▄█"], ["eat_1", " ▄▀█▄▀█▀█▀▄ \n ▄█▀ ▄ ▀ ▄█ ▀▄ \n █ ▀ ▀ ▀▄▀▀█ \n ▀█████ ▄▀ ▀▀█▄ \n ▄████▀▄▄▀▄▄▄▀ █\n█ █▄▄▄▀███▀ █ █\n █▀ ▀█▀ ▀█▄▄▀▄ █\n█▄█▄█ █▄█▄█ ▀▀"], ["eat_2", " ▄▄ ▄▄▄▄▄ \n █▄▀▀ █ ▀▄▀▄ \n ▄▀▀ ▄▀▄ ▄▀▄▄▄▀ \n ▀▄▄▄▄▄ ▄▀▄▄█ \n ▀▄▄▄▄█▀▄▄▄▄▀▀▄\n▄▀█ ▄▀▄ ██▄ ▀█ █\n▀▄▀▀▄ ▄▀ ▀█▄▄▀ █\n█▄█▄█▀▀█▄█▄█ ▀▄█"], ["happy", " ▄▀█▄▀█▀█▀▄ \n ▄█▀ ▄ ▀ ▄█ ▀▄ \n █ ▀ ▀ ▀▄▀▀█ \n ▀█████ █ ▀▀█▄ \n ▄█▀▀▀ ▄▀▄▀▀▄▀ █\n█ ██▀▀▀▄█ ▄█ █\n █▀ ▀▄▀ ▀█▀ ▀▄ █\n█▄█▄█ █▄█▄█ ▀▀"], ["injured_1", " \n ▄▄ ▄▄▄▄▄ \n █▄▀▀ █ ▀▄▀▄ \n ▄▀▀ █▄ ▄▀█▄▄▀ \n ▀▄▄▄▄▄ ▄▀▄▄█▀▄\n ▀▄▄▄▄█▀▄▄▄▄█ █\n ▄▀█ █▄▄█▀ █ █\n█▄▄▄█▄▄█▄▄▄██▀▄█"], ["injured_2", " \n \n ▄▀█▄▀█▀█▀▄ \n ▄█▀▄ ▀ ▄█ ▀▄ \n█ ▀▀ ▀▄▀▀▀▄▄ \n █▀▀▀▀▄▄▀▄ ▀▀█ █\n ▄▀█▀█▄▄█▀▀▀█ █\n█▄▄▄█▄▄█▄▄▄██▀▄█"], ["sleep_1", " \n ▄▄ ▄▄▄▄▄ \n █▄▀▀ █ ▀▄▀▄ \n ▄▀▀ ▄▄ ▄▀▄▄▄▀ \n ▀▄▄▄▄▄ ▄▀▄▄█▄ \n ▄█▄▄▄▄█▀ ▄▄▄▀ █\n█▄█▀█ ▀▄█▀ ▀ █ █\n█▄▄▄█▄███▄▄▄▄█▄█"], ["sleep_2", " \n ▄▀█▄▀█▀█▀▄ \n ▄█▀ ▀ ▄▀ ▀▄ \n █ ▀▀ ▀▄▀▀█ \n █▀▀▀▀▄▄▀ ▀▀█▄ \n ▄▄▀▀█▀█ ▀███▀ █\n█▄█▀█ ▀▄█▀ ▀ █ █\n█▄▄▄█▄███▄▄▄▄█▄█"], ["walk_1", " ▄▀█▄▀█▀█▀▄ \n ▄█▀ ▄▄▀ ▄█ ▀▄ \n █ ▀▀ ▀▄▀▀█ \n ▀█▀▀▀▀▄▄▀ ▀▀█▄ \n ▄▀▀█▀▀▄▀▄▄▄▀ █\n▄▀█▄▀ ▀▄██▀ █ █\n▀▄▀ ▀█▀ ▀█▄▄▀▄ █\n█▄█▄█ █▄█▄█ ▀▀"], ["walk_2", " ▄▄ ▄▄▄▄▄ \n █▄▀▀ █ ▀▄▀▄ \n ▄▀▀ ▄█▀ ▄▀▄▄▄▀ \n ▀▄▄▄▄▄ ▄▀▄▄█ \n ▀▄▄▄▄█▀▄▄▄▄▀▀▄\n▄▀█ ▄▀▄ ██▄ ▀█ █\n▀▄▀▀▄ ▄▀ ▀█▄▄▀ █\n█▄█▄█▀▀█▄█▄█ ▀▄█"]]], + ["leviamon", [["angry", " ██ ██ \n ▀▄ ▀▄\n ▄▄ ▄▄▀▀█▄█▄▀█\n ▄▀ ██▄▄███▄▄▀▀▄\n▄▀ █▀█▀▀▀ ▄█\n█▄ ▄▄▄▀█▀█ ▀▄ █\n▀█▀▀▀▀▀▀▀██ ▄▀█▀\n ▀▀▄█▀▀▀ ▀▀▀▀▀ "], ["attack", " ▄▀▀█ ██ ██ \n ▄█ █ ▀▄ ▀▄\n█ ▀█▀█▄█▄▀█\n▀▄███▄▄ ▀▀▀▄▀▀▄\n ▀▀▀███▄ ▄█\n ▄▄▄▄███▀ ▀▄ █\n █▀▀▀▀▀▀ █ ▄▀█▀\n ▀▀▄▄▀▀▀▀▀▀▀▀ "], ["eat_1", " ██ ██ \n ▄▄▄▄▄▄ ▀▄ ▀▄\n ▄▀ ██▄▄▄██▄█▄▀█\n▄▀ ████▀█▄▄▀▀▄\n█ ▄▄▄▄▀ ▀▀▀ ▄█\n▀▄█████▄▄▄█ ▀▄ █\n █▀▀▀▀▀▀ ▄█ ▄▀█▀\n ▀▀▄█▀▀▀ ▀▀▀▀▀ "], ["eat_2", " ██ ██ \n ▀▄ ▀▄\n ▄▄ ▄▄▀▀█▄█▄▀█\n ▄▀ ██▄▄▀██▄▄▀▀▄\n▄▀ ██▄█▄█ ▄█\n█▄ ▄▄▄▄▀ ▀▄ █\n▀█▀▀▀▀▀ ▄█ ▄▀█▀\n ▀▀▄█▀▀▀ ▀▀▀▀▀ "], ["happy", " ██ ██ \n ▄▄▄▄▄▄ ▀▄ ▀▄\n ▄▀ ██▄▄▄██▄█▄▀█\n▄▀ ██▀▄▀█▄▄▀▀▄\n█ ▀▀▀▀▀ ▄█\n▀▄████▄▄▄▄█ ▀▄ █\n █▀▀▀▀▀▀ ▄█ ▄▀█▀\n ▀▀▄█▀▀▀ ▀▀▀▀▀ "], ["injured_1", " \n \n ▄▄▄ \n ▄▀█▄▄▄██▄▄██▀▀▄\n▄▀ ███ ▀▀██▀▀▀█\n█ ▀ ▀▀██ ▄ ▄█\n▀█▄▄▄█▀▀▀▀▄ █▄█\n ▀▄▄▄▄▄▄▄▀▄█▄█ "], ["injured_2", " \n \n \n ▄▄▀▀▄▄ \n ▄▀█▄▄▄██▄▄███▄█\n▄▀ ███ ▀▀█▀ █\n█ ▀ ▀▀██ ▀▄▀█\n▀█▄▄▄█████▄▄▄██▀"], ["sleep_1", " \n \n ▄▄ ▄▄▀▀█▄▄▄▄\n █ ▀███▄▄████▄▄█\n█ ▀█▀▄▄▄█▀ █\n█▄ ▄▄▄▄█▀ ▀▄▀█\n ▀█▀▀▀ █ ▄▀█▀\n ▀▀▄█▀▀▀▀▀▀▀▀ "], ["sleep_2", " \n ██ ██ \n ▀▄ ▀▄\n ▄▄ ▄▄▀▀█▄█▄▀█\n ▄▀ ██▄▄███▄▄▀▀▄\n▄▀ █▄▄█▀▀ ▄█\n█▄ ▄▄▄█▀ ▀▄ █\n▀▀█████▄▄▄█▄▄██▀"], ["walk_1", " ▄▄ ▄▄ \n ▀█ ▀█ \n ▄▄▄ █ ▄█\n ▄▀█▄▀▀▄▄█▀▀█▄▀\n █ ▀███▀██▀▀ █\n█ ▀ ▀▀▄▄ ▄ ▀█\n██▄▄▄▄█▀▀▀▄ █▄█\n ▀▄▄▄▄▄▄▄▀█▄█▄█ "], ["walk_2", " ██▄ \n ██▄ ▀▄\n ▄▄ ▄▄█▄▀█\n ▄▀█▄▀ ▄██▄▄▀▀▄\n █ ▀█▀█▄▀▀ ▀█\n█ ▄▄▄▄▀▄ ▀▀▄█\n██▄▄█▄█▄█▄█▄ ▄▀▄\n ▀██▄▄▄▄▄▀ █▄▄▀▀"]]], + ["leviamon_x", [["angry", " \n ▄▄▄▄\n █▀▀▀▄▀▀▀▀▄█ ▄▀\n ▀▀▄██▀▀▄█▀ ▄▀\n▄▄▄██▀▄█ █▀ ▄█▄▄\n▀▄▄▀ ▄▄ ▄ ▀ █\n ▀▄▄▀▀ ▄█ █ ▀▄\n ██▄▄▀▀▀█▄█▄█▄▄█"], ["attack", " ▄▄▄▄ ▄▄▄▄ \n ▀▄▄ █▄▄▄ ▀█▀▀▀█\n▄▄▄▄███▀▄▀██ ▀▄\n▀▄▄▀▀ ▀▀ █▀ █ \n ▀▄▀▄▀▄█ ▄█▄▄\n █ ▄ ▀ █\n ▄▀▄▀▄▀▄█ █ ▀▄\n ██▄▄▄▄▄▀▄█▄▀▄▄█"], ["eat_1", " \n ▄▄▄▄ ▄▄▄▄▀█▀▀▀█\n ▀▄▄ █▄▄▄ ▄█ ▀▄\n ▄██▀▄ ▀█▀ █ \n█▀▀█▀ ▀ ▀ ▀ ▄█▄▄\n ▀▀████ ▄ ▀ █\n █▀▀ ▄█ █ ▀▄\n ██▄▄▀▀▀█▄█▄█▄▄█"], ["eat_2", " \n ▄▄▄▄\n █▀▀▀▄▀▀▀▀▄█ ▄▀\n ▀▀▄██▀▀▄█▀ ▄▀\n▄▄▄██▀▄▀▄█▀ ▄█▄▄\n▀▄▄▀ ▄▄ ▄ ▀ █\n ▀▄▄▀▀ ▄█ █ ▀▄\n ██▄▄▀▀▀█▄█▄█▄▄█"], ["happy", " \n █▀▀▀▄▀▀▀▀▄█▀▀▀█\n ▀▀▄██▀▀▄▄█ ▀▄\n▄▄▄█▀ ▄▀▄ █▀ █ \n▀▄▄█▄▄▄ ▀ ▄█▄▄\n ▀█████ ▄ ▀ █\n ███▀ ▄█ █ ▀▄\n ██▄▄▀▀▀█▄█▄█▄▄█"], ["injured_1", " \n ▄▄▄▄\n █▀▀▀▄▀▀▀▀▄█ ▄▀\n ▀▀▄█▀▀▀▄█▀ ▄▀\n▄▄▄██ █▄ █▀ ▄█▄▄\n▀▄▄▀ ▄▄ ▄ ▀ █\n ▀▄▄▀▀ ▄█ █ ▀▄\n ██▄▄▀▀▀█▄█▄█▄▄█"], ["injured_2", " \n \n ▄▄▄▄ ▄▄▄▄ ▄▀▀▀█\n ▀▄▄ █▄▄▄ ██ ▀▄\n ▄█▀▄ ▀█ ▄▀ \n█▀▀█▀ ▀▀ ▀█▀█\n █▀ ▄▄▀▀▄█ █ ▀▄\n ▄██▄▄▄▄█▄█▄█▄▄█"], ["sleep_1", " \n \n ▄▄▄▄ ▄▄▄▄ ▄▀▀▀█\n ▀▄▄ █▄▄▄ ██ ▀▄\n ▄██▀ ▀█ ▄▀ \n█▀▀█▀ ▀▀ ▄ ▀█▀█\n █▀ ▄▄▀▀▄█ █ ▀▄\n ▄██▄▄▄▄█▄█▄█▄▄█"], ["sleep_2", " \n ▄▄▄▄\n █▀▀▀▄▀▀▀▀▄█ ▄▀\n ▀▀▄██▀▀▄█▀ ▄▀\n▄▄▄██▀▄▄ █▀ ▄█▄▄\n▀▄▄▀ ▄▄ ▄ ▀ █\n ▀▄▄▀▀ ▄█ █ ▀▄\n ██▄▄▀▀▀█▄█▄█▄▄█"], ["walk_1", " \n ▀█▀▀▀█\n █▀▀▀▄▀▀▀▀▄█ ▀▄\n ▀▀▄██▀▀▄█▀ █ \n▄▄▄██▀▄█▀ ▀ ▄█▄▄\n▀▄▄▀ ▄▄ ▄ ▀ █\n ▀▄▄▀▀ ▄█ █ ▀▄\n ██▄▄▀▀▀█▄█▄█▄▄█"], ["walk_2", " \n \n ▄▄▄▄ ▄▄▄▄ ▄▀▀▀█\n ▀▄▄ █▄▄▄ ██ ▀▄\n ▄██▀▄▄▀█ ▄▀ \n█▀▀█▀ ▀▀ ▀█▀█\n █▀ ▄▀▀▀ ▄▀ ▄ ▄▀\n ▄███▀▀▀██▄▄█▄▄█"]]], + ["lilamon", [["angry", " ▄ ▄▄▄▄▄▄▄▄ ▄ \n█ █▀ ▀▄▄▀ █\n██ ▄ ▄ ▀▄ █\n▀█ ▄▀ ▀▀ ▀▄▄█ ▄▀\n ██▀▄ ▄▀ █▄█ \n▄█ █▄▄▄▄▄█ █▀▄\n█ ▀█▀▄ █▀█▀ █\n▀▀█▄▄█▀▀▀▄▄▄█▀▀▀"], ["attack", " ▄▀▀▀▀▀▀▀▄▄▀█\n █ █ █\n ▀▄▀▄▀▀▄ █ █\n█▀▄ █ ▄▀ ▄▀▀▄▄▀ \n▀▄▄▀▀▀▄▄▄█▄▀▀▄ \n█ ▄█▀▄▄ █▀▄ ▀▄\n▀▀ ▄▀█▄ ▄█▄▀ █ █\n █▄▄█ █▄▄▄█▀ ▀▀"], ["eat_1", "▄▀▄▄▀▀▀▀▀▀█▀ ▄▀▄\n█▄▀ ▄ ▄ █▀ █\n██ ▄▀▄▀▀▄▀▄ █ █\n ▀▄█ ▀ ▀ ▀█▀▄▀ \n ▄▀█▄████ ▄█▀▀▄ \n█▄▀ █▀▄▄▀█ ▄▀▄ █\n██▄█▀▄ ▄▀█▄▄█▄█\n █▄▄█▀▀▄▄▄█ "], ["eat_2", " ▄▄▄▄▄▄▄▄ \n▄▀▄▀ ▀▄ ▄▀▄\n█▄▀ ▄ ▄ ▀█ █\n▀█ ▄▀ ▀▀ ▀▄▄█ ▄▀\n ██▀▄ ▄▀▄ █▄█ \n▄▀▄▀▄▄▄▄▄▄█▀▄ ▀▄\n█ ▀▄▄█ █▄▀ █ █\n▀▀▀▀▄▄██▄▄▀▀▀▀▀▀"], ["happy", "▄▀▄▄▀▀▀▀▀▀▀█▀▄▀▄\n█▄▀ ▄ ▄ █ █\n██ ▄▀ ▀▀▀ ▀▄ █ █\n █ █▄▀▄ ▄▀▄█ █▀ \n█▀▀█ ▄▄▄▄▄ █▀▀█ \n▄▀▄▄█▄▀▀▀▄█▄▄▀ █\n█▄▄█▀▄▀▀▀ ▄▀▄▄▄█\n █▄▄█▀▀▀█▄▄▄█ "], ["injured_1", " ▄▄▄▄▄▄▄▄ \n ▄▀ ▀▄ \n █ ▄ ▄ ▀▄ \n █ ▄▀ ▀▀ ▀▄▄█▄ \n ▄▀█▄▀ ▀▄ █ ▀▄\n█ ▄▀▀▄▄▄▄▄▀▀█▄ █\n█▄▀▀█ █▀▀█ ▀█\n██▄▄██▄▄██▄▄█▄▄█"], ["injured_2", " \n ▄▀▀▀▀▀▀█▀ \n ▄▀ █ \n █ ▄▀▄▄▀▄ █ \n ▀▄█ ▄ ▄ ▀█▀▀▄ \n▄▀▄▀█ ▀▄▀▄ █\n█▄▀▀█▀▀▀▀█▀▀█▀▄█\n██▄▄██▄▄██▄▄█▄▄█"], ["sleep_1", " \n ▄▀▄ \n ▄▀ ▄▀▀▄ \n ▄▀ ▄▀▄ ▀▄ \n ▄▀ █ █ ▀▄ \n █ █ █ █ \n▄▀▀▀▄ ▄▀▀▀▄ \n ▀▄▄▄█▄▄▄█▄▄▄▀ "], ["sleep_2", " ▄ \n ▄▀ █ \n █ █ ▀▄ \n █ █ █ █ \n █ █ █ █ \n █ ▄▀ ▀▄ █ \n ▄▀▀▀▄ ▄▀▀▀▄ \n ▀▄▄▄█▄█▄▄▄▀ "], ["walk_1", "▄▀▄▄▀▀▀▀▀▀█▀ ▄▀▄\n█▄▀ █▀ █\n██ ▄▀▄▄▀▄ █ █\n ▀▄█ █ █ ▀█▀▄▀ \n ▄▀▀▄ ▄▀▀▀▄ \n█ ▄▀█▀▀▀▀█ ▀▄ █\n██ ▄▀▄ ▄▀▄▀ █▄█\n ▀█▄▄█▀▀▄▄▄█▀▀ "], ["walk_2", " ▄ ▄▄▄▄▄▄▄▄ ▄ \n█ █▀ ▀▄▄▀ █\n██ ▄ ▄ ▀▄ █\n▀█ ▄▀▄▀▀▄▀▄▄█ ▄▀\n ██ ▀ ▀ █▄█ \n▄▀ ▄█▄▄▄▄▄▀▄ ▀▄\n█▄▀▄█▄ █▄▄▀▄ █\n▀▀█▄▄█▀▀▀▄▄▄█▀▀▀"]]], + ["lilithmon", [["angry", " ▄███████▀█▄\n █ █▀ ████▄▀\n ██▄▄▄█████ \n████▄▄▀▄▄▄█▀ █\n▀▀▀█▀▀██ █▄▄▀▀█▀\n ▀▀██▄█▄█▄▄▀ \n ▄████████▀▄ \n █▄▄▄█ █▄▄▄█ "], ["attack", " ▄▄▄▄▄▄▄▄ \n █▀█▄██▀█▄█▄ \n █▄▄██▄▄██▄▀ \n ▄▀▀▄▄▄▄█▀▀▀▄ \n▄██▄ █▀█ ▄▄██▄\n█ ██▀█▄█▀███ █\n ▀█████▄██████▀ \n █▄▄▄█ █▄▄▄█ "], ["eat_1", " ▄█▀████▀▄ \n █ ▀▄█▀ ██▀█ \n ██▀▀▀▀████ \n █ ▀▄▄█▀ █▄ \n ███▄▄█ █▄▄████▄\n█▀▀██▄█▀█▄██▄▀▀█\n▀▄▄██████████▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["eat_2", " ▄█▀████▀▄ \n █ ▀▄█▀ ██▀█ \n ██▀▀▀▀████ \n █ ▀▄▄█▀ █▄ \n ███▄▄█ █▄▄████▄\n█▀▀██▄█▀█▄██▄▀▀█\n▀▄▄██████████▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["happy", " ▄█▀████▀▄ \n █ ▀▄█▀ ██▀█ \n ██▀▀▀▀████ \n █ ▀▄▄█▀ █▄ \n ███▄▄█ █▄▄████▄\n█▀▀██▄█▀█▄██▄▀▀█\n▀▄▄██████████▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["injured_1", " ▄█▀████▀▄ \n █ ▀▄█▀ ██▀█ \n ██▀▀▀▀████ \n █ ▀▄▄█▀ █▄ \n ███▄▄█ █▄▄████▄\n█▀▀██▄█▀█▄██▄▀▀█\n▀▄▄██████████▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["injured_2", " \n ▄██▀████▀▄ \n ██▀██▀███▀█ \n █▄▀▀▀▀▄██▀ \n █ ▀▄▄▄▄▀ ▄█ \n ████▀▀████▄ \n ▄▀▀████▀▀██ \n ▀▄▄██ █▄▄█▄█ "], ["refuse", " ▄█▀████▀▄ \n █ ▀▄█▀ ██▀█ \n ██▀▀▀▀████ \n █ ▀▄▄█▀ █▄ \n ███▄▄█ █▄▄████▄\n█▀▀██▄█▀█▄██▄▀▀█\n▀▄▄██████████▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["sleep_1", " ▄█▀████▀▄ \n █ ▀▄█▀ ██▀█ \n ██▀▀▀▀████ \n █ ▀▄▄█▀ █▄ \n ███▄▄█ █▄▄████▄\n█▀▀██▄█▀█▄██▄▀▀█\n▀▄▄██████████▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["sleep_2", " ▄█▀████▀▄ \n █ ▀▄█▀ ██▀█ \n ██▀▀▀▀████ \n █ ▀▄▄█▀ █▄ \n ███▄▄█ █▄▄████▄\n█▀▀██▄█▀█▄██▄▀▀█\n▀▄▄██████████▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["walk_1", " ▄█▀████▀▄ \n █ ▀▄█▀ ██▀█ \n ██▀▀▀▀████ \n █ ▀▄▄█▀ █▄ \n ███▄▄█ █▄▄████▄\n█▀▀██▄█▀█▄██▄▀▀█\n▀▄▄██████████▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["walk_2", " ▄▄▄▄▄▄▄▄ \n █▀█▄██▀█▄█▄ \n █▄▄██▄▄██▄▀ \n ▄▀▀▄▄▄▄█▀▀▀▄ \n▄██▄ █▀█ ▄▄██▄\n█ ██▀█▄█▀███ █\n ▀█████▄██████▀ \n █▄▄▄█ █▄▄▄█ "]]], + ["lilithmon_x", [["angry", " ▄▄ ▄▄▄▄▄ ▄▄ \n █▄█ ▀▀ ██▄█▄▄ \n ▄█▄▀██▀▄██▄ █ \n ██ ▄ ▄▀██▄▀▄▄\n ▀▄▀▀ ▀▀▄█▀▄██ \n ██▀▀▀█▀████▀ \n █ █▀█▀▀▀▄▀█▄ \n █▄▄▄██▄▄█▀▀▀ "], ["attack", " █▀▄▀██▀█▄▀█ \n ▀█▀▄▄▄▄▀██▀▀▀▄\n ██▀ ▀▀ ▀███ ▄▀\n ▀██▄ ▄█ ██▀▄█\n▄▄▄ █▄▄▄▄▄██▄███\n ███▄█▄▄▄█▀ ██▀ \n ▄▀█ ▀▄▄███ \n █▄▄▄█▄▄▄█ ▀▀▀"], ["eat_1", " █▀▄▀██▀█▄▀█ \n ▀█▀▄▄▄▄▀██▀▀▀▄ \n ██▀▄▀▀▄▀███ ▄▀ \n ▀█ ▀ ▀ ██▀▄█▀\n ▄▀▄████ ▄█▄███ \n ▀▄██▄▄▄█ ▀██▀ \n ▄▀ █ ▀▄ ███ \n █▄▄▄██▄▄█ ▀▀▀ "], ["eat_2", " ▄▄ ▄▄▄▄▄ ▄▄ \n █▄█ ▀▀ ██▄█▄▄ \n ▄█▄▀██▀▄██▄ █ \n ██ ▄ ▄▀█▀▄▀▄▄\n █▀ ▀ ▀ ▀█▀▄██ \n █▄▀▀ ▄▀▀███▀ \n █ █▀█▀▀▀▄ █▄ \n █▄▄▄██▄▄█▀▀▀ "], ["happy", " █▀▄▀██▀█▄▀█ \n ▀█▀▄▄▄▄▀██▀▀▀▄ \n ██▀ ▀▀ ▀███ ▄▀ \n ▀█▄▀▄ ▄▀▄██▀▄█▀\n ▀▄ ▄▄▄ ▄█▄███ \n █▀▀█████▀▀▀█▀ \n ▀▄ █ ▀▄█ ▄▀██ \n █▄▄▄███▄█ ▀▀ "], ["injured_1", " \n ▄▄ ▄▄▄▄▄ ▄▄ \n █▄█ ▀▀ ██▄█▄▄ \n ▄█▄▀██▀▄██▄ █ \n ██ ▄ ▄ ▀██▄▀ \n █▄▀▀ ▀▀ ██ ▄▄▄\n █ ▄█▄▄▄▄█▄ ███▀\n ▀█▄▄██▄▄█▀██▄ "], ["injured_2", " \n ▄▄ ▄▄▄▄▄ ▄▄ \n █▄█ ▀▀ ██▄█▄▄ \n ▄█▄▀██▀▄██▄ █ \n ██ ▄ ▄ ▀██▄▀ \n ▀▄█▀ ▀▀▄██ ▄▄▄\n █ ▄█▄▄█▄ ████▀\n ▀█▄▄██▄▄█▀██▄ "], ["sleep_1", " \n▄▄ ▄▄▄▄▄ ▄▄ \n█▄█ ▀▀ ██▄█▄▄ \n▄█▄▀██▀▄██▄ █ \n██ ▀██▄▀▄█▀\n ▀█▀ ▀▀██▀▄███ \n ▄▀▀███▀▀▀▄▀█ \n ██▄▄▄██▄▄▄█▄█ "], ["sleep_2", " \n █▀▄▀██▀█▄▀█ \n ▀█▀▄▄▄▄▀██▀▀▀▄ \n ██▀ ▀▀ ▀███ ▄▀ \n ▀█▀▀ ▀▀ ██▀▄█▀\n ▀▄▄▄▄▄██▄███ \n ▄▀▀▄▄▄▀▀▀▄▀█ \n ██▄▄▄██▄▄▄█▄█ "], ["walk_1", " █▀▄▀██▀█▄▀█ \n ▀█▀▄▄▄▄▀██▀▀▀▄ \n ██▀ ▀▀ ▀███ ▄▀ \n ▀█ █ █ ██▀▄█▀\n ▀▄▄▄▄▄██▄███ \n ▄▀█▄▄▄█ ▀██▀ \n ▀▄▀ █ ▀▄ ███ \n █▄▄▄██▄▄█ ▀▀▀ "], ["walk_2", " ▄▄ ▄▄▄▄▄ ▄▄ \n █▄█ ▀▀ ██▄█▄▄ \n ▄█▄▀██▀▄██▄ █ \n ██ ▄ ▄ ▀██▄▀▄▄\n ▀▄▀ ▀ ▄█▀▄██ \n ▄█▀▀▀█▀████▀ \n █ █▀█▀▀▀▄▀█▄ \n █▄▄▄██▄▄█▀▀▀ "]]], + ["lillymon", [["angry", "▄ ▄▄ ▄▄▄▄ ▄ ▄\n███ █▀ █ ▀▄██\n █ █ █ ██▀\n █ █▀▄ ▄▀▀▄ █▀ \n ▄▀█▄ ▀▀ ▄ █▀▄ \n█ ▄▀▄▀ ▀ ▄▀▄ █ \n█▄▄▄██▀▀▀▀█▄▄▄██\n▀ █▄▄▄█▀▀▀▄▄▄█ ▀"], ["attack", " ▄▀▀▀▀▄▀▀▄▄█\n █ ▄▀ ██\n ▀▄▄▀▀▄ ██▀\n█▀▀▄ █ ▄▀ ▀▄▀█▀ \n ▀▄▄▀▀▀▄▄▄▄▄██ \n▄▀ ▄█▄█▄▄ ▄████ \n▀▀█▀▀█ ▄▀▀▄▀███\n █▄▄▄█▀▀█▄▄▄█ ▀█"], ["eat_1", "█▄▄▀█▄▀▀▀▀▄▀▄ ▄█\n▀█ ▄▀▄ ▄▀▄ ███\n █ █ ▄▀▀ ▄ █ ██ \n ▀▄█▀ ▀ ▀ ▀█▄▀ \n █▀▄▀███▀▄▀█▄ \n▄█ ▄█▀▄▄▄▀█▄ ██▄\n██▀▀▄▀▄ ▄▀█▀▀██\n▀ █▄▄▄█▀▄▄▄█ ▀"], ["eat_2", "▄ ▄▄ ▄▄▄▄ ▄ ▄\n███ █▀ █ ▀▄██\n █ █ █ ██▀\n █ █ ▀▄▄▀ ▀▄ █▀ \n ██▄▀▄ ▄▀▄██▄ \n █ ▀▄ ▄▀ █▄ \n██▄▄▄█▀▀▀▀▄▄▄▀██\n▀ █▄▄▄█▀▀▀▄▄▄█ ▀"], ["happy", "█▄▄▀█▄▀▀▀▀▄▀▄ ▄█\n▀█ ▄▀▄ ▄▀▄ ███\n █ █ ▄▀▀ ▄ █ ██ \n▄█▄█▀ ▀ ▀ ▀█▄█▄ \n▀▄ █ █████ █ ▄▀ \n ▄███▄▀▀▀▄▀████▄\n██▀▀█▄█▀▀▄▄█▀▀██\n▀ █▄▄▄█▀▄▄▄█ ▀"], ["injured_1", " \n ▄▀█▄▀▀▀▀▄▀▄ \n▄▄▀ █ █ █▄▄\n▀█ █ ▀▄▄▀ █ ██▀\n ▀▄█▄▄ ▄▄ █▄▀ \n ▄██▄ ▄███ \n▄█ ▀██▀▀▀██▀ █▄\n█▀▄▄▄█▄▄▄█▄▄▄█▀█"], ["injured_2", " \n ▄▄ ▄▄▄▄ ▄ \n █ █▀ ▄▀ ▀▄ \n█ ▄▀▄ ▄▀▄ █▄██\n█ █ ▀▀ ▀▄ ██▀ \n▀▄█▀▀ ▀▀ ██▄█ \n▄█ ▀▄▄▄▄▄██▀ █▄\n█▀▄▄▄█▄▄▄█▄▄▄█▀█"], ["sleep_1", " ▄▄█▀█▄▄ \n ▄▀ █ █ ▀▄ \n █ █ █ █ \n █ █ █ █ \n █ ▀▄ ▄▀ █ \n ▀▄▄█▄▄▀ \n ▄▀█▀▀▄█ █▄▀▀█▀▄\n ▀▄█▄▄█▄█▄▄█▄▀ "], ["sleep_2", " ▄▄█▀▀▀█▄▄ \n ▄▀ █ █ ▀▄ \n █ █ █ █ \n █ █ █ █ \n █ ▀▄ ▄▀ █ \n ▄▄▄█▄▄███▄▄█▄▄▄\n ▀▄▀▄▀▄█ █▄▀▄▀▄▀\n ▀▀▄▄█▄█▄▄▀▀ "], ["walk_1", "█▄▄▀█▄▀▀▀▀▄▀▄ ▄█\n▀█▀ █ █ ███\n █ █ ▀▄▄▀ █ ██ \n ▀▄█ █ █ █▄▀ \n ▄▀▄ ▄███ \n▄█▀ ▄█▀▀▀▀▄ ▀██▄\n██▀▀▄▀▄ ▄▀█▀▀██\n▀ █▄▄▄█▀▄▄▄█ ▀"], ["walk_2", "█▄ ▄▄ ▄▄▄▄ ▄ ▄█\n▀██ █▀ ▄▀ ▀▄██\n █ ▄▀▄ ▄▀▄ ██ \n █ █ ▄▀▀▄ ▀▄ █ \n ██ ▀ ▀ ██▄ \n▄█▄ ▀▄▄▄▄▄▀ ▄██▄\n██▀█▀█ █▀█▀██\n▀ █▄▄▄█▀▀█▄▄▄█ ▀"]]], + ["lillymon_x", [["angry", "▄ ▄▄ ▄▄▄▄ ▄ ▄\n███ █▀ █ ▀▄██\n █ █ █ ██▀\n █ █▀▄ ▄▀▀▄ █▀ \n ▄▀█▄ ▀▀ ▄ █▀▄ \n█ ▄▀▄▀ ▀ ▄▀▄ █ \n█▄▄▄█▀▀▀▀▀▀▄▄▄██\n▀ █▄▄██▀▀▀█▄▄█ ▀"], ["attack", " ▄▀▀▀▀▄▀▀▄ █\n █ ▄▀ ██\n ▀▄▄▀▀▄ ██▀\n█▀▀▄ █ ▄▀ ▀▄██▀ \n ▀▄▄▀▀▀▄▄▄██▀ \n▄▀ ▄█▄█▄▄▄▄██▄▄ \n▀▀▀▄█▀ ▀██▀██\n █▄▄█▀▀▀██▄▄█ ▀"], ["eat_1", "█▄▄▀█▄▀▀▀▀▄▀▄ ▄█\n▀█ ▄▀▄ ▄▀▄ ███\n █ █ ▄▀▀ ▄ █ ██ \n ▀▄█▀ ▀ ▀ ▀█▄▀ \n ▄██▄▀███▀▄██▄ \n██▀ ▄█▄▄▄▀█▄ ▀█▄\n██▀██▀ ▀██▀██\n▀ █▄▄█▀▀▀██▄▄█ ▀"], ["eat_2", "▄ ▄▄ ▄▄▄▄ ▄ ▄\n███ █▀ █ ▀▄██\n▀█ █ █ ███\n █ █ ▀▄▄▀ ▀▄ █▀ \n ██▄▀▄ ▄▀▄██▄ \n █ ▀▄▄▄▄▄▄▄▀ █▄ \n███▄▄▀ ▀▄▄▀██\n▀ █▄▄█▀▀▀▀█▄▄█ ▀"], ["happy", "█▄▄▀█▄▀▀▀▀▄▀▄ ▄█\n▀█ ▄▀▄ ▄▀▄ ███\n █ █ ▄▀▀ ▄ █ ██ \n▄█▄█▀ ▀ ▀ ▀█▄█▄ \n▀▄ █ █████ █ ▄▀ \n ▄███▄▀▀▀▄█████▄\n██▀█▀ ▀▀▀ ▀█▀▀██\n▀ █▄██▀▀▀██▄█ ▀"], ["injured_1", " \n ▄▀█▄▀▀▀▀▄▀▄ \n▄▄▀ █ █ █▄▄\n▀█ █ ▀▄▄▀ █ ██▀\n ▀▄█▄▄ ▄▄ █▄▀ \n ▄██▄ ▄█▀██ \n▄█▀ ██▀▀▀█▄ ▀██▄\n█▄▄██▄▄▄▄▄██▄▄██"], ["injured_2", " \n ▄▄ ▄▄▄▄ ▄ \n █ █▀ ▄▀ ▀▄ \n█ ▄▀▄ ▄▀▄ █▄██\n█ █ ▀▀ ▀▄ ██▀ \n ██▀▀ ▀▀ ███▄ \n▄█▀▀▄▄▄▄▄█▀ ▀██▄\n█▄▄██▄▄▄▄▄██▄▄▀█"], ["sleep_1", " ▄▀▄▀▄▀▄ \n █ █ █ █ \n █ █ █ █ \n █ █ █ █ \n ▀▄ ▀▄ ▄▀ ▄▀ \n █▄ ▀▄▄█▄▄▀ ▄█ \n ▄▀▄▀▀▄█ █▄▀▀▄▀▄\n ▀▄█▄▄█▄█▄▄█▄▀ "], ["sleep_2", " ▄▀▄▄▀▄▄▀▄ \n █ ▄▀ ▀▄ █ \n █ ▄▀ ▀▄ █ \n █ ▀▄ ▄▀ █ \n ▀▄▀▄ ▄▀▄▀ \n ▄▄▄ ▀▄█▄█▄▀ ▄▄▄\n ▄▀▄▀▀▄█ █▄▀▀▄▀▄\n ▀▄█▄▄█▄█▄▄█▄▀ "], ["walk_1", "█▄▄▀█▄▀▀▀▀▄▀▄ ▄█\n▀█▀ █ █ ███\n █ █ ▀▄▄▀ █ ██ \n ▀▄█ █ █ █▄▀ \n ▄██▄▄▄▄▄██▄▄ \n▄██▀▄█ ▀▄ ▀██▄\n██▀▀█▄▄▄▄▄██▀▀██\n▀ █▄▄▄█▀▄▄▄█ ▀"], ["walk_2", "█▄ ▄▄ ▄▄▄▄ ▄ ▄█\n▀██ █▀ ▄▀ ▀▄██\n █ ▄▀▄ ▄▀▄ ██ \n █ █ ▄▀▀▄ ▀▄ █ \n ██▄▀ ▀ ▄██▄ \n ██▄ ▀█▀▀█▀ ▄█▄ \n██▀██▀ ▀██▀██\n▀ █▄▄█▀▀▀▀█▄▄█ ▀"]]], + ["loaderleomon", [["angry", " ▄▀▀▀▀▀▀▄ ▄██▄\n ▄▀█▀▀▀▀▄ █ ▀██▀\n▄█▀ ▄█ ▄█ █ █ \n█ ▄ ▄ ▄▄█ █▄▄ █\n ▀█████ ▀ ▄█▄▄█▀\n ▄▀▀▀▄▀█▀█▀ ▀▄\n ▄▀▀█ █▀▀▀▄▄ █\n █▄▄█▄▄█ █▄▄▄▀"], ["attack", " ▄▄▄▄▄▄ ▄▄ \n █▄▄▄▄▄ ▀▄ ████\n █▄▀ ▄▄ ▀▄▀▄ ▀█ \n█▀ ▀▀ ▀█ █ ▀▄\n▀▄█▄▄▀ ▀█▀ █▀▀▄█\n ▄█▄▄▄██▄▄██▀▀█ \n █ █ ▄█▄█▄█▄▄ █\n ▀▀▀▀ █▄▄█▄▄▄▀"], ["eat_1", " ▄▄▄▄▄▄ ▄██▄\n █▄▄▄▄▄ ▀▄ ▀██▀\n █▄▀ ▄ ▀▄▀▄ █ \n█▀ ▀ ▀ ▀█ █▄▄ █\n▀▄█▄▄▀ ▀█▀ █▄▄█▀\n ▀▄▄▄██▄▄██ ▀▄\n ▄▀ █ █▄▀▀▄▄ █\n █▄▄█▄▄▀ █▄▄▄▀"], ["eat_2", " ▄▀▀▀▀▀▀▄ ▄██▄\n ▄▀█▀▀▀▀▄ █ ▀██▀\n▄█▀ ▄█▀ ▄█ █ █ \n█ ▄ ▄ ▄▄█ █▄▄ █\n ▀█████ ▀ ▄█▄▄█▀\n ▄▀▀▀▄▀█▀█▀ ▀▄\n ▄▀▀█ █▀▀▀▄▄ █\n █▄▄█▄▄█ █▄▄▄▀"], ["happy", " ▄▀▀▀▀▀▀▄ ▄██▄\n ▄▀█▀▀▀▀▄ █ ▀██▀\n▄█▀ ▄▀▄ ▄█ █ █ \n█ ▄ ▄ ▄▄█ █▄▄ █\n ▀█████ ▀ ▄█▄▄█▀\n ▄▀▀▀▄▀█▀█▀ ▀▄\n ▄▀▀█ █▀▀▀▄▄ █\n █▄▄█▄▄█ █▄▄▄▀"], ["injured_1", " \n ▄▄▄▄▄▄ ▄██▄\n █▄▄▄▄▄ ▀▄ ▀██▀\n █▄▀ ▄ ▀▄▀▄ █ \n█▀ ▀▀ ▀█ █▄▄ █\n▀▄█▄▄▀ ▀█▀ █▄▄█▀\n █▄▄▄██▄▄██▄ ▀▄\n █▄▄█▄▄▄█▄█▄▄▄▄█"], ["injured_2", " \n ▄██▄\n ▄▀▀▀▀▀▀▄ ▀██▀\n ▄▀█▀▀▀▀▄ █ █ \n▄█▀ █▄ ▄█ █▄▄ █\n█ ▄ ▄ ▄▄█ █▄▄█▀\n ▀█▀▀ ▄▄▀ ▄█▄ ▀▄\n █▄███▄▄███▄▄▄▄█"], ["refuse", " ▄██▄\n ▄▀▀▀▀▀▀▄ ▀██▀\n ▄▀█▀▀▀▀▄ █ █ \n▄█▀ ▄█ ▄█ █▄▄ █\n█ ▄ ▄ ▄▄█ █▄▄█▀\n ▀█▀▀ ▄▄▀ ▄█ ▀▄\n ▄▀▀█▀▀█▄▀▀▄▄ █\n █▄▄█▄▄█▀ █▄▄▄▀"], ["sleep_1", " ▄▄ \n ▄▀▀▀▀▀▀▄ ████\n ▄▀█▀▀▀▀▄ █ ▀█ \n▄█▀ ▄▄ ▄█ █ ▀▄\n█ ▄ ▄ ▄▄█ █▀▀▄█\n ▀█▀▀ ▄▄▀ ▄█▀▀█ \n ▄▀▀█▀▀▀▀██▀▀ █\n█▄▄█▄▄▄███▄▄▄▄▄█"], ["sleep_2", " \n ▄▄▄▄▄▄ ▄██▄\n █▄▄▄▄▄ ▀▄ ▀██▀\n █▄▀ ▀▄▀▄ █ \n█▀ ▀▀ ▀█ █▄▄ █\n▀▄█▄▄▀ ▀█▀ █▄▄█▀\n ▄█▄▄▄██▄▄██▄ ▀▄\n█▄▄█▄▄▄▄█▄█▄▄▄▄█"], ["walk_1", " ▄▀▀▀▀▀▀▄ ▄██▄\n ▄▀█▀▀▀▀▄ █ ▀██▀\n▄█▀ ▄█▀ ▄█ █ █ \n█ ▄ ▄ ▄▄█ █▄▄ █\n ▀█▀▀ ▄▄▀ ▄█▄▄█▀\n █▀▀▀▀█▀█▀ ▀▄\n ▄▀ █ █▀▀▀▄▄ █\n █▄▄█▄▄█ █▄▄▄▀"], ["walk_2", " ▄▄▄▄▄▄ ▄▄ \n █▄▄▄▄▄ ▀▄ ████\n █▄▀ ▄▄ ▀▄▀▄ ▀█ \n█▀ ▀▀ ▀█ █ ▀▄\n▀▄█▄▄▀ ▀█▀ █▀▀▄█\n ▄█▄▄▄██▄▄██▀▀█ \n █ █ ▄█▄█▄█▄▄ █\n ▀▀▀▀ █▄▄█▄▄▄▀"]]], + ["lobomon", [["angry", " ▄▄██▄▄▀█ \n ▄▄█ ▄ ▄▀ \n █▀ ▀▀ ██▄ \n ▀█████▀▄▄▀▀▄ █\n ▄▀█▀▀▀▄█▄█▀▀▄ \n █ █▀▀▀▀██ ▄█ \n ▀██▀███▀██▀▀ \n █▄█▄█ █▄█▄█ "], ["attack", " ▄▄ ▄▄ \n ▄▀▀▀▀▀▀ █ \n ██▀ ▄█▀ ▀▄▄ \n █▄▄▄▄▄▄ ▄█▀▀▄ \n ▄▀▄ ▄█▀ █ █ \n▄█▀█▀██▀███▀▄ █ \n█▄▄▀▄▄▄▄█ █ \n█▄█▄█▀▀▀█████ "], ["eat_1", " ▄▄ ▄▄ \n ▄▀▀▀▀▀▀ █ \n ██▀ ▄▀▄ ▀▄▄ \n █▄▄▄▄▄▄ ▄█▀▀▄\n ▄▀▄ ▄█▀ █ █\n ▄█▀█▀██▀███▀▄ █\n █▄▄▀▄▄▄▄█ █ \n █▄█▄█▀▀▀█████ "], ["eat_2", " ▄▄██▄▄▀█ \n ▄▄█ ▄▄ ▄▀ \n █▀ ▀▀ ██▄ \n ▀█████▀▄▄▀▀▄ █\n █▄█▀▀▀▄█▄▄▄▀ █\n █▀ █▀▀▀▀█▀▀ █ ▀\n ▀▄▄█▀███▀▄▄▄▀ \n █▄█▄█ █▄█▄█ "], ["happy", " ▄▄██▄▄▀█ \n ▄▄█ ▄ ▄▀ \n █▀ ▀ ▀▄▀▀█▄ \n ▀█████▀▄█ █▀█\n █▄█▀▀▀▄█▄▄▀ █\n █▀ █▀▀▀▀▀█ ▀\n ▀▄▄█▀███▀▄█▄ \n █▄█▄█ █▄█▄█ "], ["injured_1", " \n ▄▄██▄▄▀█ \n ▄▄█ ▄ ▄▀ \n █▀ ▀▀ ██▄ \n ▀█▀▀▀▀▀▄▄▀▀▄ █\n █▄█▄▄▄██▄▄▄▀ █\n▄█▀▀█ ▀▀ █▀▀▀▄ \n█▄█▄██████▄▄█▄█ "], ["injured_2", " \n ▄▄ ▄▄ \n ▄▀▀▀▀▀▀ █ \n ██▀ █▄ ▀▄▄ \n █▄▄▄▄▄▄ ▄█▀▀▄\n ▄▀▄ ▄█▀ █ █\n▄█▀▀█▀▀▀▀█▀▀▀█ ▀\n█▄█▄██████▄▄█▄█ "], ["refuse", " ▄▄ ▄▄ \n ▄▀▀▀▀▀▀ █ \n ██▀ ▄█ ▀▄▄ \n █▄▄▄▄▄▄ ▄█▀▀▄\n ▄▀▄ ▄█▀ █ █\n ▄█▀█▀██▀███▀▄ █\n █▄▄▀▄▄▄▄█ █ \n █▄█▄█▀▀▀█████ "], ["sleep_1", " \n ▄▄ ▄▄ \n ▄▀▀▀▀▀▀ █ \n ██▀ ▄▄ ▀▄▄ \n █▄▄▄▄▄▄ ▄█▀▀▄\n ▄▀▄ ▄█▀ █ █\n▄▀█▀█▀▀▀▀█▀█▀█▄ \n█▄▄▄█▄▄▄▄█▄▄▄██ "], ["sleep_2", " \n \n ▄▄██▄▄▀█ \n ▄▄█ ▄▀ \n █▀ ▀▀ ██▄ \n ▀█▀▀▀▀▀▄▄▀▀▄ █\n▄▀█▀█▀▀▀▀█▀█▀█ ▀\n█▄▄▄█▄▄▄▄█▄▄▄██ "], ["walk_1", " ▄▄██▄▄▀█ \n ▄▄█ ▄▄ ▄▀ \n █▀ ▀▀ ██▄ \n ▀█▀▀▀▀▀▄▄▀▀▄ █\n █▄█▄▄▄██▄▄▄▀ █\n █▀ █ ▀▀ █▀▀ █ ▀\n ▀▄▄█▀███▀▄▄▄▀ \n █▄█▄█ █▄█▄█ "], ["walk_2", " ▄▄ ▄▄ \n ▄▀▀▀▀▀▀ █ \n ██▀ ▄█▀ ▀▄▄ \n █▄▄▄▄▄▄ ▄█▀▀▄ \n ▄▀▄ ▄█▀ █ █ \n▄█▀█▀██▀███▀▄ █ \n█▄▄▀▄▄▄▄█ █ \n█▄█▄█▀▀▀█████ "]]], + ["locomon", [["angry", " ▀█▀█▀ \n ▄█▀▀▀██▀▀▄ ▄▀▀▄\n█▄▀ ▄█ █▀█▀█▀▀█\n█▄▄▄▄▄ █▄█▄█▀▀█\n▄█████ █ ▄▄██▀█\n██▄▄▄▄██▄█▄█ ██\n█▀▀▀▀██ █▄█▄▄██\n▀███▀▀████▀█▄█▄▀"], ["attack", " ▄▄▄▄▄ \n ▄█▄█▄▄▄▄ ▄▄ \n▄▀█ ▀▀▄▄█▄█▄▄█\n█▀ ▄▄▀ █ █ █▄▄█\n█▀▀ ▀▀ ▄▀▀▀▀█▄▄█\n █▄▄▄▄█▄ ▄█▄█ █\n█▄▄▄█▄█▀▀█▄█ ██\n█▄▄▄▄██▄▄█▄█▄▄██"], ["eat_1", " ▄▄▄▄▄ \n ▄█▄█▄▄▄▄ ▄▄ \n▄▀█ ▀▀▄▄█▄█▄▄█\n█▀ ▄▀▄ █ █ █▄▄█\n█▀▀ ▄▀▀▀▀█▄▄█\n █▄▄▄▄█▄ ▄█▄█ █\n█▄▄▄█▄█▀▀█▄█ ██\n█▄▄▄▄██▄▄█▄█▄▄██"], ["eat_2", " ▀█▀█▀ \n ▄█▀▀▀▀█▀▀▄ ▄▀▀▄\n█▄▀ ▄▄ █▀█▀█▀▀█\n█▄▄▄▄▄ █▄█▄█▀▀█\n █████ █ ▄▄██▀█\n▄█▄▄▄▄██▄█▄█ ██\n█▀▀▀▀██ █▄█▄▄██\n▀███▀▀████▀█▄█▄▀"], ["happy", " ▀█▀█▀ \n ▄█▀▀▀▀█▀▀▄ ▄▀▀▄\n█▄▀ ▄▀▄ █▀█▀█▀▀█\n█▄▄▄▄▄ █▄█▄█▀▀█\n █████ █ ▄▄██▀█\n▄█▄▄▄▄██▄█▄█ ██\n█▀▀▀▀██ █▄█▄▄██\n▀███▀▀████▀█▄█▄▀"], ["injured_1", " \n ▀█▀█▀ \n ▄█▀▀▀██▀▀▄ ▄▀▀▄\n█▄▀ ▄ █▀█▀█▀▀█\n█▄▄ ▀▀ █▄█▄█▀▀█\n▀▄ ▄▀ ▄▄▀█▀█\n███████▀▀█▄█ ██\n█▄▄▄▄██▄▄█▄█▄▄██"], ["injured_2", " \n ▄▄▄▄▄ \n ▄█▄█▄▄▄▄ ▄▀▀▄\n▄▀█ ▀▀▄▄█▄█▀▀█\n█▀ █▄ █ █ █▀▀█\n█▀▀ ▄▀▀██▀█▀█\n▄█▄▄▄▄█▄▄█▄█ ██\n█▄▄▄▄██▄▄█▄█▄▄██"], ["refuse", " ▄▄▄▄▄ \n ▄█▄█▄▄▄▄ ▄▄ \n▄▀█ ▀▀▄▄█▄█▄▄█\n█▀ ▄█ █ █ █▄▄█\n█▀▀ ▄▀▀▀▀█▄▄█\n █▄▄▄▄█▄ ▄█▄█ █\n█▄▄▄█▄█▀▀█▄█ ██\n█▄▄▄▄██▄▄█▄█▄▄██"], ["sleep_1", " ▄▄▄▄▄ \n ▄█▄█▄▄▄▄ ▄▄ \n▄▀█ ▀▀▄▄█▄█▄▄█\n█▀ ▄▄ █ █ █▄▄█\n█▀▀ ▄▀▀▀▀█▄▄█\n █▄▄▄▄█▄ ▄█▄█ █\n█▄▄▄█▄█▀▀█▄█ ██\n█▄▄▄▄██▄▄█▄█▄▄██"], ["sleep_2", " \n ▀█▀█▀ \n ▄█▀▀▀██▀▀▄ ▄▀▀▄\n█▄▀ █▀█▀█▀▀█\n█▄▄ ▀▀ █▄█▄█▀▀█\n▀▄ ▄▀ ▄▄▀█▀█\n███████▀▀█▄█ ██\n█▄▄▄▄██▄▄█▄█▄▄██"], ["walk_1", " ▀█▀█▀ \n ▄█▀▀▀██▀▀▄ ▄▀▀▄\n█▄▀ ▄▄ █▀█▀█▀▀█\n█▄▄ ██ █▄█▄█▀▀█\n▀▄ ▄▀ ▄▄██▀█\n▄▀▀▀█▀██▄█▄█ ██\n█▀▀▀▀██ █▄█▄▄██\n▀███▀▀████▀█▄█▄▀"], ["walk_2", " ▄▄▄▄▄ \n ▄█▄█▄▄▄▄ ▄▄ \n▄▀█ ▀▀▄▄█▄█▄▄█\n█▀ ▄▄▀ █ █ █▄▄█\n█▀▀ ▀▀ ▄▀▀▀▀█▄▄█\n █▄▄▄▄█▄ ▄█▄█ █\n█▄▄▄█▄█▀▀█▄█ ██\n█▄▄▄▄██▄▄█▄█▄▄██"]]], + ["lopmon", [["angry", " ▄▄ \n █▀█ ▀▄▀█▄ \n █▄ ▄ █ \n █ ▀▀▄ ▀▀ █ \n ▀▄ ▀ ▀▀ █▄ █ \n █▀▀ ▀▄ █ \n▄▀▄█ ▀▄█ ▀▄\n▀▄█▄▄▀▀▀▀▄▄█▄▄▄▀"], ["attack", " ▄▄█▀▄ ▄▄ \n █ ▀ ▀ ▀▀▄ \n ▄▀█▄ ▄█ ▀▄ \n██ ▄█▄▄ ▄▀▀█ \n ▀█▄ ▀▄▀ ▀ ▄█▄ \n ▄▀▄ ▄█ █ \n▄▀ █ ▄▄ █▀ ▀▄\n▀▄▄▄█▄█ █▄██▄▄▄▀"], ["eat_1", " ▄▄█▀▄ ▄▄ \n █ ▀ ▀ ▀▀▄ \n ▄▀ █ █ ▀▄ \n █ ▄█▄▄ ▄ █ \n █▄ ██ ▀█ ▀▄ \n ▄▀ ▄ ▀▄▀▄ \n▄▀▀█ ▄▄ █▀▀ ▀▄\n▀▄▄█▄█ █▄█▀▄▄▄▀"], ["eat_2", " ▄▄ \n █▀█ ▀▄▀█▄ \n █▄ ▄ █ \n █▀ ▀▄ ▀ ▀ █ \n ▀▄ ▀ ▀▀ █▄ █ \n █▀▀ ▀▄ █ \n▄▀▄█ ▀▄█ ▀▄\n▀▄█▄▄▀▀▀▀▄▄█▄▄▄▀"], ["happy", " ▄▄█▀▄ ▄▄ \n █ ▀ ▀ ▀▀▄ \n ▄█▀▄ ▄▀▄ ▀▄ \n▄█ ▄█▄▄ ▄█ \n█ ▀▄▀██▀ ▄▀ ██ \n ▀▄▄ ▄▀ █ \n▄▀ █ ▄▄ █ ▀▄\n▀▄▄▄█▄█ █▄██▄▄▄▀"], ["injured_1", " \n ▄▄ \n █▀█ ▀▄▀█▄ \n █ ▄ ▄ █ \n █ ▀▀▄ ▀▀ █ \n ▀▄ ▀ ▀ █ █ \n ▄▀█▀ █▄ ▀▀▄\n█▄█▄▄▄▄▄█▄▄▄█▄▄█"], ["injured_2", " \n \n ▄▄█▀▄ ▄ \n █ ▀ ▀ ▀▀▄ \n▄▀▄█ █▄ ▀▄ \n█ ▄▀▄ ▄ ▀▄ \n █▄▄ ▀▄▄ ▀▀▄\n█▄█▄▄▄▄▄█▄▄▄█▄▄█"], ["sleep_1", " \n \n \n ▄▄█▀▄ ▄▄ \n █ ▀ ▀ ▀▀▄ \n▄▀▄▄ ▄▄ ▀██▀▄ \n█▄ ▄▀▄ ▄▄▀▄ ▀▀█\n▀▄█▄▄▄█▄▄▄██▄▄▄█"], ["sleep_2", " \n \n ▄▄ \n █▀█ ▀▄▀█▄ \n █ █▄ \n█ ▀▀▄ ▀▀ ▄ █▀▀▄ \n▀▄▄▀ ▀ ▄▄▀▄ ▀▀█ \n▀▄▄█▄▄█▄▄▄██▄▄▄█"], ["walk_1", " ▄▄█▀▄ ▄▄ \n █ ▀ ▀ ▀▀▄ \n ▄▀ █ █ ▀▄ \n █ ▄▀▄▄ ▄ █ \n █▄▄ ▀█ ▀▄ \n ▄▀▄ ▄ █ █ \n▄▀▀█ ▄▄ █▀ ▀▄\n▀▄▄▄█▄█ █▄██▄▄▄▀"], ["walk_2", " ▄▄ \n █▀█ ▀▄▀█▄ \n █ ▄ ▄ █ \n █ ▀▄ ▀ █ \n ▀▄ ▀ ▀▀ █▄ █ \n █▀▀ ▀▄ █ \n▄▀▄█ ▀▄█ ▀▄\n▀▄█▄▄▀▀▀▀▄▄█▄▄▄▀"]]], + ["lopmon_x", [["angry", " ▄▄ \n █▀█ ▀▄▀█▄ \n █▄ ▄ ▀▄ \n █ ▀▀▄ ▀▀ ▄▀▀▄ \n ▀▄ ▀ ▀▀ ▀▄▄▀ \n █▀█▀▀▀▀ ▀▄ █ \n▄▀ █ ▀▀▀ ▀▄█ ▄▀▄\n▀▄█▄█▄█▀█▄▄█▄█▄▀"], ["attack", " ▄▄█▀▄ ▄▄ \n █ ▀ ▀ ▀▀▄ \n ▄▀█▄ ▄█ ▄█ \n █ ▄█▄▄ █▄▄█ \n█ ▀▄ ▀▀▀ ▄█ █ \n ▀▄ ▀█▄▄ ▀ ▄▀█ \n▄▀ █ ▄▄ █▀ ▄▀▄\n▀▄█▄█▄█ █▄██▄▄█▀"], ["eat_1", " ▄▄█▀▄ ▄▄ \n █ ▀ ▀ ▀▀▄ \n ▄▀ █ █ ▄█ \n █ ▄█▄▄ █ █ \n █ ██ ▄▀▀ █ \n ▄▀█▄▄▄▄ ▄ █ █ \n▄▀ █ ▄▄ █▀ ▄ █\n▀▄█▄█▄█ █▄██▄█▄▀"], ["eat_2", " ▄▄ \n █▀█ ▀▄▀█▄ \n █▄ ▄ ▀▄ \n █ ▀▄ ▀ ▀▄▀▀▄ \n ▀▄ ▀ ▀▀ ▀▄▄▀ \n █▀█▀▀▀▀ ▀▄ █ \n▄▀ █ ▀▀▀ ▀▄█ ▄▀▄\n▀▄█▄█▄█▀█▄▄█▄█▄▀"], ["happy", " ▄▄█▀▄ ▄▄ \n █ ▀ ▀ ▀▀▄ \n ▄▀▀▄ ▄▀▄ ▄█ \n █ ▄█▄▄ █▄ █ \n ▀▄▄▀▀▀ ▄▀ █▀▄ \n ▄▀▄▀▀▀▀ ▄▄▀ █ \n▄▀ █ ▄▄ █▄ ▄ █\n█▄▄▀█▄█ █▄█▀▄█▄█"], ["injured_1", " \n ▄▄ \n █▀█ ▀▄▀█▄ \n █ ▄ ▄ █ \n █ ▀▀▄ ▀▀ ▄█ \n ▀▄ ▀ ▀ █ █ \n ▄▀█▀▀▀▀ ▄█▀▀▀▄\n█▄█▄▄▄▄▄█▄▄▄█▄▄█"], ["injured_2", " \n \n ▄▄█▀▄ ▄ \n █ ▀ ▀ ▀▀▄ \n▄▀▄█ █▄ ▀▄ \n█ ▄▀▄ ▄▄▀▄ \n █▄▄▄▄ ▄▄█ ▄▀▀▄\n█▄█▄▄▄▄▄█▄███▄▄█"], ["sleep_1", " \n \n \n ▄▄█▀▄ ▄▄ \n █ ▀ ▀ ▀▀▄ \n▄▀▄▄ ▄▄ ▄▀▀█▀▄ \n█▄ ▄█▄ ▄▄▀▄▀▀▀█ \n▀▄█▄▄▄█▄▄▄██▄▄▄█"], ["sleep_2", " \n \n ▄▄ \n █▀█ ▀▄▀█▄ \n █ █▄ \n█ ▀▀▄ ▀▀ ▄▀ █▀▄ \n▀▄▄▀ ▀ ▄▄▀▄▀▀▀█ \n▀▄▄█▄▄█▄▄▄██▄▄▄█"], ["walk_1", " ▄▄█▀▄ ▄▄ \n █ ▀ ▀ ▀▀▄ \n ▄▀ █ █ ▄█ \n █ ▄▀▄▄ █ █ \n ▀▄▄▄▄▄▄ ▄▀▀ █ \n ▄▀▄▀▄▄▄ ▄ █ █ \n▄▀ █ ▄▄ █▀ ▄ █\n▀▄█▄█▄█ █▄██▄█▄▀"], ["walk_2", " ▄▄ \n █▀█ ▀▄▀█▄ \n █ ▄ ▄ ▀▄ \n █ ▀▄ ▀ ▄▀▀▄ \n ▀▄ ▀ ▀▀ ▀▄▄▀ \n █▀█▀▀▀▀ ▀▄ █ \n▄▀ █ ▀▀▀ ▀▄█ ▄▀▄\n▀▄█▄█▄█▀█▄▄█▄█▄▀"]]], + ["lordknightmon", [["angry", " ▄▄▀▀▀█ ██▄\n ▄▀ ▄▀▀▀███\n ▄█▄█ ▀ █▀▄███\n ▄▄█▄▄█████▀ █\n█▀ █▄▀▄▀▄███▄█\n ▀▀▀██▀▀ █▄ ███\n ▄▀ ▄█▀█▀▀▀███\n █▄▄▄▄▀ █▄▄▄█ "], ["attack", " ▄▄▄▄ ▄▄ \n ▄▀▀ ▄█▄███ \n █ ▄ ▄▀▄▄ █▀▀█▄\n █▄▀█▄▄▄█▄█▄▄ ██\n █ ▀██▀▄ ██▀▀██\n ▀▀▀▄▀▄▀▀█▀█▄██\n █▄▀ █▀▄ ▀▀\n █▄▄▄█▄▄▀ "], ["eat_1", " ▄▄▀▀▀█ ██▄ \n ▄▀ ▄▀▀▀███▄\n ▄▀▄█ ▀ █▀▄████\n █ ▀▄███▀█▀ ██\n ▀▄█▄▀▄▀▄▄▀██▄██\n █ █▀ ▀ ▀█ ███\n ▀▄██ █▀█ ▀█▄▀██\n █▄▄▄█ █▄▄▄█ "], ["eat_2", " ▄▄▀▀▀█ ██▄ \n ▄▀ ▄▀▀▀███▄\n ▄▀▄█ ▀ █▀▄████\n █ ▀▄███▀█▀ ██\n ▀▄█▄▀▄▀▄▄▀██▄██\n █ █▀ ▀ ▀█ ███\n ▀▄██ █▀█ ▀█▄▀██\n █▄▄▄█ █▄▄▄█ "], ["happy", " ▄▄▀▀▀█ ██▄ \n ▄▀ ▄▀▀▀███▄\n ▄▀▄█ ▀ █▀▄████\n █ ▀▄███▀█▀ ██\n ▀▄█▄▀▄▀▄▄▀██▄██\n █ █▀ ▀ ▀█ ███\n ▀▄██ █▀█ ▀█▄▀██\n █▄▄▄█ █▄▄▄█ "], ["injured_1", " ▄▄▀▀▀█ ██▄ \n ▄▀ ▄▀▀▀███▄\n ▄▀▄█ ▀ █▀▄████\n █ ▀▄███▀█▀ ██\n ▀▄█▄▀▄▀▄▄▀██▄██\n █ █▀ ▀ ▀█ ███\n ▀▄██ █▀█ ▀█▄▀██\n █▄▄▄█ █▄▄▄█ "], ["injured_2", " \n ▄▄ \n ▄▄▀▀▀█▄███▄ \n ▄▀ ▄▀▀▀████▄\n ▄▀▄█ ▀▀█▀▄█▀███\n ▀▄███▀█▀▄█▄▀██\n █ █▄█ █ ▀▄▄ \n ▀▄██▄██▄▀▄▄▄▄█"], ["refuse", " ▄▄▀▀▀█ ██▄ \n ▄▀ ▄▀▀▀███▄\n ▄▀▄█ ▀ █▀▄████\n █ ▀▄███▀█▀ ██\n ▀▄█▄▀▄▀▄▄▀██▄██\n █ █▀ ▀ ▀█ ███\n ▀▄██ █▀█ ▀█▄▀██\n █▄▄▄█ █▄▄▄█ "], ["sleep_1", " ▄▄▀▀▀█ ██▄ \n ▄▀ ▄▀▀▀███▄\n ▄▀▄█ ▀ █▀▄████\n █ ▀▄███▀█▀ ██\n ▀▄█▄▀▄▀▄▄▀██▄██\n █ █▀ ▀ ▀█ ███\n ▀▄██ █▀█ ▀█▄▀██\n █▄▄▄█ █▄▄▄█ "], ["sleep_2", " ▄▄▀▀▀█ ██▄ \n ▄▀ ▄▀▀▀███▄\n ▄▀▄█ ▀ █▀▄████\n █ ▀▄███▀█▀ ██\n ▀▄█▄▀▄▀▄▄▀██▄██\n █ █▀ ▀ ▀█ ███\n ▀▄██ █▀█ ▀█▄▀██\n █▄▄▄█ █▄▄▄█ "], ["walk_1", " ▄▄▀▀▀█ ██▄ \n ▄▀ ▄▀▀▀███▄\n ▄▀▄█ ▀ █▀▄████\n █ ▀▄███▀█▀ ██\n ▀▄█▄▀▄▀▄▄▀██▄██\n █ █▀ ▀ ▀█ ███\n ▀▄██ █▀█ ▀█▄▀██\n █▄▄▄█ █▄▄▄█ "], ["walk_2", " ▄▄▄▄ ▄▄ \n ▄▀▀ ▄█▄███ \n █ ▄ ▄▀▄▄ █▀▀█▄\n █▄▀█▄▄▄█▄█▄▄ ██\n █ ▀██▀▄ ██▀▀██\n ▀▀▀▄▀▄▀▀█▀█▄██\n █▄▀ █▀▄ ▀▀\n █▄▄▄█▄▄▀ "]]], + ["lordknightmon_x", [["angry", " ▄▄▄ ▄▄ \n ▄▄▀▀ ▀▄▀ █ \n █ ██▀▀▀█▄▄▀ \n █ ▄█▄▀▀▄█▄ \n ▀▀▄▄▄██▄█▀▄ \n ▄▀▀█▄█▀█ █ █ \n ▀▄▄█ ▄█ █▄█ \n █▄▄█▀▀▀▀█▄▄▄█ "], ["attack", " ▄▄▀▀█ ▄▀█ \n ▄▀█▄▄▄▄▄▀ ▄▀ \n █ ▀█ ▄▄▀██▀▀█\n ▀▄████ ██ ▀█\n ▄█▄▄███▀▀█▀\n▄▀▀▀▀ █▀▀ █ ██ █\n ▀▀▀▀▄█▄▄█▀▀▄▄▀ \n █▄▄█ █▄▄▄█ "], ["eat_1", " ▄▄▀▀█ ▄▀█ \n ▄▀█▄▄▄▄▄▀ ▄▀ \n █ ▀█ ▄▄▀█▀ \n ▀▄████ █▀█▄ \n ▀▄▄▄▀█▀█ █ \n ▄▀█▀▀ █ █ █ \n ▀▄█▄▄█▀▄██ \n █▄▄█ █▄▄▄█ "], ["eat_2", " \n ▄▄▀▀█ ▄▀█ \n ▄▀█▄▄▄▄▄▀ ▄▀ \n █ ▀█ ▄▄▀█▀ \n ▀▄█▀▀ ▄█▀█▄ \n ▄█▀███▀█ █ \n █▄█▀▀ █ █▄█ \n █▄▄█▄▄██▄█▄▄█ "], ["happy", " ▄▄▀▀█ █▀▄ \n ▄▀█▄▄▄▄▄▀ ▄▀▄▄▄\n █ ▀█ ▄▄▀███▀ ▄█\n ▀▄████ ██ █▀▄█\n █▄▄██ ▄█▀▀ \n ▄▀█▀▀ ██▀ ▀▄ \n ▀▄█▄▄█▀▀█▄ ▄▀ \n █▄▄█ █▄▄▄█ "], ["injured_1", " \n ▄▄▄ \n ▄▄▀▀ ▀█▄ \n █ ██▀▀▀█▄ ▀▄ \n █ ▄█▄▀▀▄▀█▀▀ \n ▀▀▄▄▄██ █▀▄ \n █▀▄█▄█▀█▀▀▀█ \n █▄▄█▄▄▄█▄▄▄█ "], ["injured_2", " \n \n ▄▄▀▀█▄ \n ▄▀█▄▄▄▄▄▀▀▄ \n █ ▀█ ▄▄▀█▄▄█ \n ▀▄█▀▀▄▄▄█ █▀▄ \n ▄▀██▄█▀█▀▀▀█ \n █▄▄█▄▄▄█▄▄▄█ "], ["sleep_1", " \n ▄▄▄ \n ▄▄▀▀ ▀▄▄▄▄ \n █ ██████▄▄▄▀ \n █ ▄██▀▀▄█▀█▄ \n ▀▀▄▄▀███▀█ █ \n ▄█ █▀▀ █ █▄█ \n █▄▄██▄▄██▄█▄▄█ "], ["sleep_2", " \n ▄▄▀▀█ \n ▄▀█▄▄▄▄▄▀▀▀█ \n █ ▀████▀█▀▀ \n ▀▄█▀▀ ▄█▀█▄ \n ▄█▀███▀█ █ \n ▄█ █▀▀ █ █▄█ \n █▄▄██▄▄██▄█▄▄█ "], ["walk_1", " ▄▄▀▀█ ▄▀█ \n ▄▀█▄▄▄▄▄▀ ▄▀ \n █ ▀█ ▄▄▀█▀ \n ▀▄█▀▀ ▄█▀█▄ \n ▄█▀███▀█ █ \n █ █▀▀ █ █ █ \n ██▄▄█▀▄██ \n █▄▄█ █▄▄▄█ "], ["walk_2", " ▄▄▄ ▄▄ \n ▄▄▀▀ ▀▄▀ █ \n █ ██▀▀▀█▄▄▀ \n █ ▄█▄▀▀▄█▄ \n ▀▀▄▄▄██▄█▀▄ \n ▄▀█▄█▀█ █ █ \n █▄█ ▄█ █▄█ \n █▄▄█▀▀▀▀█▄▄▄█ "]]], + ["lotosmon", [["angry", " \n █▀▄█▀▀▀█▄▀▀█ \n█▀▄█ ▀▀▀ █ ▄▀█▄ \n█▄ █ █▀ ▄███\n▀██▀▀▄▄▄▀▀█▀▀█▀▀\n▄█ ▀▄▄▄▄▄▀█▀ █▄ \n▀█▀▀█ █▀████\n█▄▄▄█▀▀▀▀█▄▄▄█ "], ["attack", " ▄█▀▀▀█▄▀▀█▄ \n █ ▀▀▀ █▄▀ █ \n▄▄ █ ▄▀ ▄▀ \n█ ▀▄█▀▀▀ █▄▀ █▄ \n▄▀▀ ▀█▀▀▄▄▄████\n█▄▀▀█▀ ███▄ \n ▄▀▀█▄▄▄▄▀████▄\n █▄▄▄█ █▄▄▄▄█▀▀▀"], ["eat_1", " █▀▄█▀▀▀█▄▀▀█ \n█▀▄█ ▀▀▀ █ ▄▀█ \n▀▄ █▀▄▄▄▀█▀ ▄█▄ \n▄██ ▄▄▄▄▄ ██████\n▀█ ▀▀███▀▀▀ █▀▀▀\n▄█▄▄█▀ ▀▄▄███▄ \n███▀▄▄▄▄▄▀▀█████\n █▄▄▄█ █▄▄▄█ "], ["eat_2", " ▄▄ ▄▄▄▄▄ ▄▄▄ \n▄█ █▀▄▄▄▀█ █▄ \n█ ▀█ █▄▀ █ \n ▀▄█▄ ▄█▄▄▀▄▄ \n▄██▄ ▀▀▀ ▄█▄████\n▀█▀ █▀█▀▀█ ▀██▀▀\n██▄█▀▄ ▄▄█▀▄███▄\n █▄▄▄██▄▄▄▄█▀▀▀"], ["happy", "▄█▀▄█▀▀▀█▄▀▀█▄ \n█ ▀█ ▀▀▀ █▄▀ █ \n █▄█▀▄▄▄▀█ ▄█▄▄ \n█▀█ ▄▄▄▄▄ ██▀███\n▀▄ ▀██████▀ ▄▀▀▀\n ▄█▄█ ▀▀ █▄███▄ \n███▀▀▄▄▄▄▀▀█████\n █▄▄▄█ █▄▄▄█ "], ["injured_1", " \n ▄▄▄▀▀▀▄▄▄▄ \n █▄█▀▄▄▄▀█▄▄█ \n█▀ █ █ ▀█ \n▀██▀▀▄▄▄▀▀███▄ \n████▄▄▄▄▄█▀████ \n ▄█ █ █ █▀█▄ \n█▄█▄▄█▄█▄▄█▄▄▄██"], ["injured_2", " \n ▄▄▄ \n ▄▀██ ██▀▀▄ \n▄█▀█ ▀▀▀ █▀▀█▄ \n█▄▄█▄ ▄█▄▄▄▀ \n▄██▄ ▀▀▀ ▄▀███▄ \n▀██ █▀▀▀█ █▀█▀ \n█▄█▄▄█▄█▄▄█▄▄▄██"], ["sleep_1", " \n █▀▄▄▀▀▀▄▄▀▀█ \n █▀▄█ ▀▀▀ █ ▄▀█ \n ▀▄ █ █▀ ▄▀ \n ▄██▀▀▄▄▄▀▀████▄\n ▀█▀█▄▄▄▄▄▀▀████\n █▄▀▀▄ ▄▀▀▄ ▀▄ \n███▄▄█▄▄█▄▄█████"], ["sleep_2", " ▄▄ ▄▄▄▄▄ ▄▄▄ \n ▄█ █▀▄▄▄▀█ █▄ \n █ ▀█ █▄▀ █ \n █▄█▄ ▄█▄▄█▄ \n ███▄ ▀▀▀ ▄█████\n █ █▀▀▀▀█ ▀█▀▀▀\n ▄█▀▀▄ ▄▀▀▄ █▄ \n ██▄▄█▄▄█▄▄█████"], ["walk_1", " █▀▄█▀▀▀█▄▀▀█ \n█▀▄█ ▀▀▀ █ ▄▀█ \n▀▄ █ █▀ ▄▀ \n ▄█▀▀▄▄▄▀▀█▀▄██▄\n████▄▄▄▄▄▀▀█████\n ▄▀ █ ▀ █▄ █▄ \n██▄▀▀▄ ▄▀▄▄███▄\n █▄▄▄█▀▀▄▄▄▄█▀▀▀"], ["walk_2", " ▄▄ ▄▄▄▄▄ ▄▄▄ \n▄█ █▀▄▄▄▀█ █▄ \n█ ▀█ █▄▀ █ \n ▀▄█▄ ▄█▄▄▀▄▄ \n▄██▄ ▀▀▀ ▄█▄████\n▀█▀ █▀█▀▀▄ ▀██▀▀\n██▄▀█ █▀▄▄██▄\n█▄▄▄▄█▀▀█▄▄▄▄█▀▀"]]], + ["lucemon_chaos_mode", [["angry", " ▄▄▄▄▄▄▄ ▄▄▄▄ \n █▀ ▄█▄▄▄▀██▀ ▄\n █ █▀ ▄ █ █▄██\n ▀▄█▀ ▀▀ █ █▀ \n ▄█▄██▄█▄█▀██▄\n █ ▄█▀ ▄█▄ █ ▀█\n ▀▀█▀████▀█▀██ \n █▄▄▀ ▀▄▄█ ▀ "], ["attack", " ▄█▀▀█▀▀▀▄███▀ \n █ ▄█▀▀▀▀▄▀█ █ \n █ █▄ ▄█▀█ █▄██ \n ▀▄█ ▄▄▄ █ ███▀ \n ▄█▄███▄█▄▀ ██ \n █ █▄ █ █▀█▄▀ \n ▀██▀████▀▄ ██ \n █▄▄▄█ █▄▄▄█▀█ "], ["eat_1", " ▄█▀▀█▀▀▀▄███▀ \n █ ▄█▀▀▀▀▄▀█ █\n █ █▀ ▀▀ █ █▄██\n ▀█ ██ ▄▀▄██▀ \n ▄▀█▀▀▀█▀▀▄▀█▄\n █ █▄▄███ █ ▀█\n █▀███▀█▀▀█▄ \n █▄▄█ █▄▄█ ▀█ "], ["eat_2", " ▄▄▄▄▄▄▄ ▄▄▄▄ \n █▀ ▄█▄▄▄▀██▀ ▄\n █ █▀ ▄ █ █▄██\n ▀▄█▀ ▀ ▀█ ██▀ \n ▀▄▄▄▄█▄▀▀██▄\n ▄▀█ ▄█▀█▄ ▀█\n ▀▄████▄▄▀██▄ \n █▄▄█ █▄▄█ ▀█ "], ["happy", " ▄█▀▀█▀▀▀▄███▀ \n █ ▄█▀▀▀▀▄▀█ █\n █ █▄ ▄▀▄█ █▄██\n ▄▀█ ▄▄ ▄█▀██▀ \n ▀▄ █▀▀▀█ ▄▀▀█▄\n ▀█▄▄▄█▀█▄ ▀█\n ▄▀███▀▄ ▀█▄ \n █▄▄█ █▄▄█ ▀█ "], ["injured_1", " \n ▄█▀█▀▀▀▄███▀ \n █▀ ▄▀▀▀▀▄▀█ \n █ █ ▄ █ ██▄ \n ▀▄█▀ ▀▀█ ██▀█▄\n ██▄▄▄█▄████▄▀\n ▄█ █▄▄██ ██▄▀█ \n █▄▄█▄█▄█▄▄██▄ "], ["injured_2", " \n ▄▄▄▄▄▄▄ ▄██▀ \n▄█▀ █▄▄▄▀███ \n█ ▄▀ █ ███▄ \n█ █▄ ▀▄▄█ ███▀█▄\n ▀█▄ ▄▀▄████▄▀\n ▄█ █████ ██▄▀█ \n █▄▄█▄█▄█▄▄██▄ "], ["sleep_1", " \n ▄▄▄▄▄▄▄ ▄▄█▀ \n █▀ ▄█▄▄▄▀██ █ \n █ █▀ █ █▄██ \n ▀▄█▀ ▀▀ █ ██▀ \n ▀▄▄▄▄█▄██▀█▄ \n █▀█▄▄█▀ ▀█▄▀█\n █▄▄███▄▄▄▀██▄"], ["sleep_2", " \n ▄█▀▀█▀▀▀▄███▀ \n █ ▄█▀▀▀▀▄▀█ █\n █ █▄ ▄▄ █ █▄██\n ▀█ ▄▀▄██▀ \n ▄█▀▀▀██▄ ▀█▄\n █▀█▄▄█▀ ▀█▄▀█\n █▄▄███▄▄▄▀██▄"], ["walk_1", " ▄█▀▀█▀▀▀▄███▀ \n █ ▄█▀▀▀▀▄▀█ ▄█\n █ █▄ ▄█ █ ████\n ▀█ ▄▀▄██▀ \n ▄█▀▀▀███▀██▄\n █ █▄▄█▀ █▄▀██\n █▀███▀█▀██▄▀\n █▄▄█ █▄▄█ ▀█ "], ["walk_2", " ▄▄▄▄▄▄▄ ▄▄▄▄ \n █▀ ▄█▄▄▄▀██▀ ▄\n █ █▀ ▄ █ █▄██\n ▀▄█▀ ▀▀ █ ██▀ \n ▀▄▄▄▄█▄▀▀██▄\n ▄▀█ ▄█▀█▄ ▀█\n ▀▄████▄▄▀██▄ \n █▄▄█ █▄▄█ ▀█ "]]], + ["lucemon_satan_mode", [["angry", " ▄▄▄▄▄ ▄▄ \n ▄▀▀█ ▄▀ █▄▀▀▄ \n █▀▀▀ █▀█▀ ▀▄ █\n ▀█▀█▀█ █▄█▄██ █\n █▄█▄█▄▀ ███▄█\n▄█▄██▄ ▄▀ ▀▄ \n█████▄▄██▄█▀▀▀▄█\n ▀████▄█▄█▄█▄▄█▀"], ["attack", " ▄██▀▀█▀▄▄ \n ▄█▄▄▀ ██▄▄ ▀▄\n █▄▄▄▄█▄▀█ █ █\n ▄▄▄█████ █▄█ █\n▄█▄██▀▀▄▄▄▄▀▀▄ █\n█████▄ ▄ ▀▄▀\n ▀█████████▀▀▀▄█\n █▄██▄█▄█▄█▄▄█▀"], ["eat_1", " ▄██▀▀█ █▀▄▄ \n ▄█▄▄▀ █▄▄█▀▄ ▀▄\n █▄▄▄▄█▄ ▀▄ ▄█ █\n ▀███ █▀███ █\n ▄█▀▀ ▄▄▀ █▀▄▀▀\n▄█▄██▀█▀ ▄▀ ▀▄ \n██████▄▄█▄█▀▀▀▄█\n ▀████▄█▄█▄█▄▄█▀"], ["eat_2", " ▄▄▄▄▄ ▄▄ \n ▄▀▀█ ▄▀ █▄▀▀▄ \n █▀▀▀ ▄▀▀█▀ ▀▄ █\n ▀█▀▀▀ █▀▀▀▄██ █\n ▄███▀█ ██▄█\n▄█▄████▄▀▄▄▀ ▀▄ \n████████▄▄█▀▀▀▄█\n ▀████▄█▄█▄█▄▄█▀"], ["happy", " ▄██▀▀█ █▀▄▄ \n ▄█▄▄▀ █▀▀█▀▄ ▀▄\n █▄▄▄▄█ █▄█ █\n ▀███▀▄ ███ █\n ▄█▀▀ ▄▄▀ ▀█▄▀▀\n▄█▄████▀ ▄ ▀▄ \n███████▄█▄█▀▀▀▄█\n ▀████▄█▄█▄█▄▄█▀"], ["injured_1", " \n ▄▄▄ \n ▄██▀▀█ ▀▄▄▀▀▄ \n▄█▄▄▀ █▀███ ▀▄ █\n█▄▄▄▄▀▄█ ▀███ █\n▄█▄▄▄▄█▄▀ █ ▀▄█\n█▄████▀ █▀▀▀▄█\n ▀█████▄▄█▄█▄▄█▀"], ["injured_2", " \n █▀▀▀▄▄ \n ▄▄▄▄▄█▀▄▄ ▀▄ \n ▄▀▀█ ▄████▄▀▄ █\n█▀▀▀ ▄▀█ ▀███ █\n█████ █▄█ █ ▀█▀\n█▀▄▄▄▄█▀ █▀▀▄█\n ▀██████▄▄█▄▄▄█▀"], ["sleep_1", " ▄▄ \n ▄██▀▀█ █▄▀▀▄ \n ▄█▄▄▀ █▄█▀ ▀▄ █\n █▄▄▄▄▀▄▄▄█▄██ █\n █▄▄▄▄█▄ ███▄█\n▄█▄██▄ ▄▀ ▀▄ \n█████▄▄██▄█▀▀▀▄█\n ▀████▄█▄█▄█▄▄█▀"], ["sleep_2", " ▄▄ \n ▄██▀▀█ █▄▀▀▄ \n▄█▄▄▀ █▄▄▀ ▀▄ █ \n█▄▄▄▄▀▄▄▄█▄██ █ \n █▄▄▄▄█▄ ▀███▄█ \n▄█▄█▀▀▀ ▄▀ ▀▄ \n████▀ ▄▄█▄█▀▀▀▄█\n ▀████▄█▄█▄█▄▄█▀"], ["walk_1", " ▄██▀▀█ █▀▄▄ \n ▄█▄▄▀ █▄▄█▀▄ ▀▄\n █▄▄▄▄▀▄ ▀▄ ▄█ █\n ▀▄▄▄▄▀ ▀▀███ █\n ▄▄█▄▄▄█▀ █▀▄▀▀\n▄█▄███▄ ▄▀ ▀▄ \n██████▄▄█▄█▀▀▀▄█\n ▀████▄█▄█▄█▄▄█▀"], ["walk_2", " ▄▄▄▄▄ ▄▄ \n ▄▀▀█ ▄▀ █▄▀▀▄ \n █▀▀▀ ▄▀▀█▀ ▀▄ █\n ▀█▀▀▀ █ ▄█▄██ █\n ▄█████▀ ███▄█\n▄█▄██▄ ▄▀ ▀▄ \n█████▄▄██▄█▀▀▀▄█\n ▀████▄█▄█▄█▄▄█▀"]]], + ["lucemon_x", [["angry", " ▄▄ ▄▄ ▄▄▄ ▄▄▄ \n ▀▄█ ▄█▄▄ ▀ ▄▀ \n █ ▄▀ ▄▀▄▀▄ ▄▄\n ▀▄▀▀ ▀▀ █ █▀ █\n ▀▄▄▄▄█▄▀ ▄▀▄\n ▄▀█ ▀ ▀▄▀█ ▄▀\n █▄▀▄▄▄▄█▄█▀▄ \n █▄▄▄█▀█▄▄▄█▄▄█"], ["attack", " █▀▄▀▀▄▀▀▀▄▀▀█ \n █▀ █▀▀▀▄ ▄▀ \n █ █▄ ▄█ █ █▄▀█\n █▄▄▄▄▄ █▄▀ ▄▀\n ▀█████ █▄▄▀ █\n ▄▀█▄▄▄▄█▄ ▀█▀ \n ▀██ █▄ ▀█▄▄▀▀▄\n █▄▄█ █▄▄█ ▀▀▀"], ["eat_1", " █▀▄▀▀▄▀▀▀▄▀▀█ \n █▀ █▀▀▀▄ ▄▀ \n █ █▄ ▄▀▄█ █▄▀█\n █ ▄▄▄▄ █ █ ▄▀\n █ ████ █▀▀█ █\n ▄▀▄▄▄▄▀ ▄▄█▀ \n ▀█ █▄ ▀█▀▄ ▀▄\n █▄▄█ █▄▄█ ▀▀▀"], ["eat_2", " ▄▄ ▄▄ ▄▄▄ ▄▄▄ \n ▀▄█ ▄█▄▄ ▀ ▄▀ \n █ ▄▀ ▄▀▄▀▄ ▄▄\n ▀▄▀▀ ▀ ▀█ █▀ █\n ▀▄▄▄▄█▄▀ ▄▀▄\n ▄▀█ ▀ █ █▀ ▄▀\n █▄▀▄▄█▄▄██▀▄ \n █▄▄▄█▀█▄▄▄█▄▄█"], ["happy", " █▀▄▀▀▄▀▀▀▄▀▀█ \n █▀ █▀▀▀▄ ▄▀ \n █ █▄ ▄▀▄█ █▄▀█\n ▄█ ▄▄▄ █▄█ ▄▀\n █ ▀▄███▄█▀ █▀ █\n ▀▄█▄▄▄█▄▄▀▀▄▀ \n █ █▄ ▀█▀▄ ▀▄\n █▄▄█ █▄▄█ ▀▀▀"], ["injured_1", " \n █▀▄▀▀▄▀▀▀▄▀▀█ \n █▀ █▀▀▀▄ ▄▀ \n █ █▀ █▄ █ █ \n ▀▄ ▄▀▄▀▄ \n ▄█▀█▀█▀▄▄ ▀▄\n ▄▀▀▀▄ ▄█▀▀▀█▄▀\n █▄▄▄████▄▄▄█▄█"], ["injured_2", " \n▄▄ ▄▄ ▄▄▄ ▄▄▄ \n▀▄█ ▄█▄▄ ▀ ▄▀ \n █ ▄█ ▄ ▀▄▀▄ \n ▀▄▀ ▀▀ █ █▄ \n ▀█▄▄▄▄█▄▀ ▄▀▄ \n ▄▀▀▀▄ ▄█▀▀▀██ \n █▄▄▄████▄▄▄█▄█"], ["sleep_1", " \n \n █▀▄▀▀▄▀▀▀▄▀▀█ \n █▀ █▀▀▀▄ ▄█ ▄▄\n █ █▄ ▄▄ █ █▀ █\n ▀▄ █▄▀▄▀ \n ▄▀ █▀▀▀█ ▀█ ▀▄\n █▄█▄███▄█▄█▄▄█"], ["sleep_2", " \n ▄▄ ▄▄ ▄▄▄ ▄▄▄ \n ▀▄█ ▄█▄▄ ▀ ▄▀ \n █ ▄▀ ▀▄▀▄ ▄▄\n ▀▄▀▀ ▀▀ █ █▀ █\n ▄▀▄▄▄▄█▀█▄▄▀ \n █ ▄█ ▀ █▄ █ ▀▄\n ▀█▄▄███▄▄█▀▄▄█"], ["walk_1", " █▀▄▀▀▄▀▀▀▄▀▀█ \n █▀ █▀▀▀▄ ▄▀ \n █ █▄ ▄█ █ █▄▀█\n ▀▄ ▄▀▄▀ ▄▀\n ▄█▀█▀█▀▄▄▀ █\n █ █ ▄▀ █▄▄▀ \n █ █▄▀▀█▀▄ ▀▄\n █▄▄█ █▄▄█ ▀▀▀"], ["walk_2", " ▄▄ ▄▄ ▄▄▄ ▄▄▄ \n ▀▄█ ▄█▄▄ ▀ ▄▀ \n █ ▄▀ ▄▀▄▀▄ ▄▄\n ▀▄▀▀ ▀▀ █ █▀ █\n ▀▄▄▄▄█▄▀ ▄▀▄\n ▄▀█ ▀ █ █▀ ▄▀\n █▄▀▄▄█▄▄██▀▄ \n █▄▄▄█▀█▄▄▄█▄▄█"]]], + ["ludomon", [["angry", " \n ▄▀▀▀▀▀▀▄ \n▄▀▀ ▀▀▄ \n▀▀█▀█▀▀▀█▀██▀▀ \n █ ▀▀ ▀▀▄▀▀▀▀▄ \n ▄██▄▀▀▀█ ▄▀▀▄ █\n ██ █▀▀█ ▀▄▄▀ █\n ▀███▄█▄▄█▄▄▄▄▀ "], ["attack", " ▄▀▀▀▄ ▄▀▀▀▀▄ \n█ ▄▀▄ █▄█ ▄▀▀▄ █\n█ ▀▄▀ █▄█ ▀▄▄▀ █\n ▀▄▄▄▀ ▀▄▄▄▄▀ \n █ █ ▀███ █ \n ▀▄ ▀▄███▀ ▄█ \n █▄▄▄▄▄▄█▄▀ \n █▄▄▀ █▄▄▀ "], ["eat_1", " ▄▄▀▀▀▀▀▀▀▀▄▄ \n █▄▄▄▄▄▄▄▄▄▄▄▄█ \n █ ▀ ▀ ██ \n █ █████▄██▄ \n ▄████▄▄▀ ▄▄ ▀▄\n █ █▄▄▄█ █ █ █\n ██▄█ ▀▄ ▀▀ ▄▀\n █▄▄▄█▀▀████▀ "], ["eat_2", " ▄▄▄▄▄▄ \n ▄▄▀ ▀▄▄ \n█▄▄▄▄▄▄▄▄▄▄▄▄█ \n █▄▀▄ ▄▀▄██ \n █▄ ▄▄▄ ▄▀▀▀▀▄ \n ▄▀▀█▀▀▀█ ▄▀▀▄ █\n ▀▄▄██▀▀█ ▀▄▄▀ █\n █▄▄▄█▀▀█▄▄▄▄▀ "], ["happy", " ▄▀▀▀▀▀▀▄ \n ▄▀▀ ▀▀▄ \n ▀▀█▀█▀▀▀█▀██▀▀ \n █▀ ▀ ▀ ▀██▄ \n▄▀▀█ ███▄▀ ▄ ▀▄\n▀▄▄██▄▄▄▄█ █ █ █\n ▀██▄ ▀█▄ ▀ ▄▀\n █▄▄▄█▀▀█▄██▀ "], ["injured_1", " \n ▄▄▄▄▄▄ \n ▄▄▀ ▀▄▄ \n█▄▄▄▄▄▄▄▄▄▄▄▄█ \n █▄█ █▄ ▄▀▀▀▄ \n █▄ ▄▄ █ ▄▀▄ █\n █ ▄██▀▀██ ▀▄▀ █\n █▄▄█▄▄▄██▄▄▄▀ "], ["injured_2", " \n \n ▄▄▄▄▄▄ \n ▄▄▀ ▀▄▄ \n█▄▄▄▄▄▄▄▄▄█▀▀▀▄ \n █▀▀ ▀▀█ ▄▀▄ █\n ▄▀█▄███▄█ ▀▄▀ █\n ██▄▄█▄▄▄██▄▄▄▀ "], ["sleep_1", " \n \n ▄▀▀▀▀▀▀▄ \n▄▀▀ ▀▀▄ \n▀▀███▀▀███▀▀▀▀█ \n ▄█ ▄▄ █ ▄▀▀▄ █\n█ █▄▄▄▄█ ▀▄▄▀ █\n ▀██▄█▄▄▄█▄▄▄▄▀ "], ["sleep_2", " \n ▄▄▄▄▄▄ \n ▄▄▀ ▀▄▄ \n █▄▄▄▄▄▄▄▄▄▄▄▄█ \n █▀▀ ▀█▀▀▀▀▄ \n ▄▀▀▄ ▀▀█ ▄▀▀▄ █\n ▀▄▄██▀▀█ ▀▄▄▀ █\n █▄▄█▄▄▄█▄▄▄▄▀ "], ["walk_1", " ▄▀▀▀▀▀▀▄ \n ▄▀▀ ▀▀▄\n ▀▀█▀█▀▀█▀▀██▀▀\n █ ▄▄ ▄▄██ \n ▄██▄▄█▀ ▄▄ ▀▄\n █ █▄▄█ █ █ █\n ▀█▄█ ▀▄ ▀▀ ▄▀\n █▄▄▄▀▀▀████ "], ["walk_2", " ▄▄▄▄▄▄ \n ▄▄▀ ▀▄▄ \n █▄▄▄▄▄▄▄▄▄▄▄▄█\n █ ▀ ▀ ██ \n █▄ ▀█▄▀▀▀▀▄ \n ▄▀▀█▀▀█ ▄▀▀▄ █\n ▀▄▄██▀█ ▀▄▄▀ █\n █▄▄▄█▀▀▀▄▄▄▄█ "]]], + ["lunamon", [["angry", " ▄▄▄ ▄▄▄ \n █ ▄▀ █ ▄▀ \n ▄▀ ▀▀▀▀▀ █▄ \n █ ▄ ▄ ▀▄ \n █ ▀▀ ▀▀ █▄ █\n █▄▄▄▄▄▄▄▀▀▄▀▀ \n▄▀ ▄ █ █ ▄ ▀▄ \n▀▄█▄▄▄█▄▄▄▄▄█▄▀ "], ["attack", " ▄▀▀▄▀▀▄ \n ▄█▄▄▀ ▄▀ ▄▄▄ \n █ ▄ ▀▀▀▀ █\n █ ▀▀ ▄▄ ▄▄▀▀ \n ███ █ █ \n ▀██▄▄▀ ▄▀▄ \n █ █ ▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["eat_1", " ▄▀▀▄ ▄▀▀▄ \n ▄▀ ▀▀▀▀ ▄█▀ \n ▄▀▄▀▄ ▄▀▄ ▀▄ \n █ ▄▄▄ █ \n ▀▄▀▄███ ▄█▄ █\n █ ▄▀█▀█▀▀▀ █▀\n ▀█ ▀▄▀ ▀█▀ \n █▄▄▄▄▄▄▄▄▄█ "], ["eat_2", " ▄▀▀▄ ▄▀▀▄ \n █ ▄█▄▄█ ▄▀ \n ▄▀ ▄ ▄ ▀▄ \n █ ▀ ▀ ▀ ▀ ▄ ▀▄\n ▀▄ ▀▀▀ ▄█▀▄▄▀\n ▄▀█▀█▀█▀▀ ▀▄ \n █ █ ▀▄▀ █▄ █ \n ▀█▄▄▄▄▄▄▄▄▄█▀ "], ["happy", " ▄▀▀█ ▄▀▀█ \n ▄▄█ █▄▄▄█ █ ▄▄\n █▄▀ ▄ ▄ █▀ █\n █ ▀ ▀ ▀ ▀ ▄▀ \n█▀▀▄ █████ ▄▀▀▄\n ▀▄ █▀█▀█▀▀█ ▄▀ \n █▀ ▀ ▀▀▄ \n ▀▄▄▄▄▄▄▄▀ "], ["injured_1", " \n ▄▀▀▄ ▄▀▀▄ \n █ ▄█▄▄█ ▄▀ \n▄▀ ▀▄ \n█▄▄▀ ▀▄▄ ▄ ▀▄ \n▀▄ ▄▄ ▄▀▄▄▀ \n █▀█▀█▀▀█ █ ▀▄\n █▄▄██▄▄█▄▄█▄▄▄▀"], ["injured_2", " \n \n ▄▀▀▀▄ ▄▀▀▀▄ \n ▄▀ ▀▀▀▀▀ ▀█▀ \n█ ▄ ▄ ▀▄ \n█▀▀ ▀▀ ▀▄ █ \n ▀▄▄██▄▄▄▄▀█▀▀▀▄\n █▄▄██▄▄█▄▄█▄▄▄▀"], ["sleep_1", "▄▀▄ ▄▀▄ \n ▀ ▀ ▀ \n ▄▀▀▀▄ ▄▀▀▀▄ \n ▄▀ ▀▀▀▀▀ ▀█▀ \n█ ▀▄ \n█▄▄▄ ▄▄▄ ▀▄ █ \n ▀▄▄▄▄▄▄▄▄▀█▀▀▀▄\n █▄▄██▄▄█▄▄█▄▄▄▀"], ["sleep_2", " ▄▀▄ \n ▄ ▄▄ ▀ ▄▄ \n ▄▀ ▄▀ ▄▀ ▄▀ \n ▄▀ ▀▀▀▀▀ ▀▄ ▀ \n█ ▀▄ \n█▀▀▀ ▀▀▀ ▀▄ █ \n ▀▄▄█▄▄▄▄▄▀█▀▀▀▄\n █▄▄██▄▄█▄▄█▄▄▄▀"], ["walk_1", " ▄▀▀▄ ▄▀▀▄ \n █ ▄█▄▄█ ▄▀ \n ▄▀▄▄ ▄▄ ▀▄ \n █ █▄ ▄█ ▄ ▀▄\n ▀▄▀▀ ▀▀ ▄█▀▄▄▀\n ▄▀█▀█▀█▀▀ ▀▄ \n █ █ ▀▄▀ █▄ █ \n ▀█▄▄▄▄▄▄▄▄▄█▀ "], ["walk_2", " ▄▄ ▄▄ \n ▄▀ ▄▀ ▄▀ ▄▀ \n ▄▀ ▀▀▀▀▀ ▀▄ \n █ █▀ ▀█ ▀▄ \n █ ██ ██ █▄ █\n █▄▄▄▄▄▄▄▀▀▄▀▀ \n▄▀ ▄ █ █ ▄ ▀▄ \n▀▄█▄▄▄█▄▄▄▄▄█▄▀ "]]], + ["machgaogamon", [["angry", " ▄▄▄ ▄▄▄▄▄ \n ▄█▄▀▀▀▀ ▄▄█▄▄\n ▄█▄ ▄█▀ ▀▀▄█ █\n █ ▄█▀▀█▀█\n█▀▀█▀▀▀█▀▀▄▄▄ ▀█\n▀▄▀█▄▄█▄▄█▄▄▀▀▄▀\n ▀▄█████████▄▄▀ \n █▄█▄█▀▀█▄█▄█ "], ["attack", " ▄▄ ▄▄▄ \n █ █▄▄█▀ ▄▀ \n ▄▀▀▀ ▄▄ ▄█ █▀█\n █▀▀ ▀▀ ▄▄▀▀▄█\n█ ████▄ █▀█▄▄██\n ▀█▀▀▀▀▄▀▄▀ ▄█▄█\n ▄██████████▄ \n█▄█▄█▀ ▀█▄█▄█ "], ["eat_1", " █▀█▄▄█▀▀▀█ \n ▄██▀▀▄█▀ ▄█▀ \n █▄▄▄▄ ▄▄▀▄▄▄\n▄▀▀█▄▄█ ▄▀▄ █ █\n█▄▄█▄▄▄▀▀█▄▄██▀█\n▀▄ ▀▄█▄▄█ ███▀█\n ▄██████████▄▀▀▀\n█▄█▄█▀ ▀█▄█▄█ "], ["eat_2", " ▄▀█ ▄▀▀█ \n ▄█▄▀▀▀▀ ▄▀ \n ▄█▄ ▄▀▄ ▀▀▄█▀█\n █ ▄█▀▄█▄█\n▄▀▀█▀▀▀█▀▀▄▄▄█▄█\n█▄▄█▄▄█▄▄██ █▄█\n ▄███████████▄ \n█▄█▄█▀ ▀█▄█▄█ "], ["happy", " █▀▀▄▄▄▄▀▀▀▄ \n ▄██▀▀▄▀▄ ▄▀▀█▄▄\n █▄▄▄▄ ▀▄▄█ █\n ▄▀▀▀ ▄▀█ █▀█\n █▀█▀▀█▀ █ ▄██▀█\n █▀▄█▄▄█▄▄█ ▀▀▀\n █████████ \n █▄█▄█▀█▄█▄█ "], ["injured_1", " \n █▀█▄▄█▀▀▀█ \n ▄▀▀▀▄ ▄█▀ \n █▀▀ ▀▀ ▄▄▀▄▄▄\n █▄▄▄▄▄▄▄▀▀▄ █ █\n ▄█ ▄▀ █ ██▀█\n█ ▄██████▀▀▄██▀█\n █▄█▄█▀▀█▄▄█▄█▀▀"], ["injured_2", " \n ▄▄▄ ▄▄▄▄▄ \n ▄█▄▀▀▀▀ ▄▄▀ \n▄█▄ ▀▄▄ ▀▀▄ \n█ ▄██ █▀█\n ██▀▀█▀▀ █ ▀▄█▄█\n█ ▄██████▀▀▄██▄█\n █▄█▄█▀▀█▄▄█▄█▄█"], ["sleep_1", " \n \n █▀█▄▄█▀▀▀█ \n ▄▀▀▀ ▄██▄▄\n █▀▀ ▀▀▀ ▄▄█ █\n▄▄█▄▄▄▄▄▄▄▀▄▀███\n█▄▀█▀▀▄█▄▀▀█▀▄██\n█▄▄█▄▄▀▀▀▄▄█▄▄█▀"], ["sleep_2", " \n ▄▄▄ ▄▄▄▄▄ \n ▄█▄▀▀▀▀ ▄▄▀ \n ▄█▄ ▄▄▄ ▀▀█▀█\n █ ▄█▀█▄█\n▄▄▀█▀█▀▀██▀▄▀█▄█\n█▄▀█▀▀▄█▄▀▀█▀▄██\n█▄▄█▄▄▀▀▀▄▄█▄▄█ "], ["walk_1", " █▀█▄▄█▀▀▀█ \n ▄▀▀▀ ▄▄ ▄█▀ \n █▀▀ ▀▀ ▄▄▀▄▄▄\n █▄▄▄▄▄▄▄▀▀▄ █ █\n ▄▄█ ▄▀ █▄ ██▀█\n ▀▄▀▄█▄▄█ ███▀█\n ▄█████████▄▀▀▀\n █▄█▄█▀ ▀█▄█▄█ "], ["walk_2", " ▄▄▄ ▄▄▄▄▄ \n ▄█▄▀▀▀▀ ▄▄▀ \n ▄█▄ ▄█▀ ▀▀▄█▀█\n █ ▄█▀▄█▄█\n ▀██▀▀▀█▀▀▄▄ █▄█\n █ █▄▄█▄▄█▄▀▀█▄█\n ▄█████████▄▄█ \n█▄█▄█▀ ▀█▄█▄█ "]]], + ["machinedramon", [["angry", " ▄▄▄████▀▀█▀▀█\n ▄▀ ▄ ▀▄▄██▀█▀\n█ ▀▀ █ ██▄\n▀█▀▀▀▀▄ ▄▀▀▀▀▄ █\n▄▀▀█████▄▀▀▀ █ █\n▀▄▄█▄▄▄▄█▄▄▄▀█▀▄\n ▄▄█▄ ▄▄██▄▄█\n█▄█▄██▀██▄█▄▄█ "], ["attack", "█▀▀█▄▄█▀▀█▄▄▄▄▄ \n█▄▄█ █▄▄█▄▄ █\n ▄▀▀▀▀█▀▄ ▄▀▀▀█▀\n█ ▀▀ █▀█▀▀▄ \n▀█▄█▄█▄ ▄▀ █▄▄▀ \n▄▀█▀█▀█▀▄▄▀▀▄ █▄\n▀▄▄▄▄▄▄▀▀█▄▄█▄█▀\n█▄█▄▄▄█▀▀█▄█▄█▄█"], ["eat_1", " ▄▀▀▀▀▀█▀▀▀█▀▀█\n▄▀ ▄█ █▄██▀█▀\n█▄▄▄▄▄ █ ██▄\n ██████▄▀█▀▀▀▄ █\n▄█▀▀▀▀▀▄█▀▀▀ █ █\n▀▄█████▄█▄▄▄▀█▀▄\n ▄▄█▄ ▄▄██▄▄█\n█▄█▄██▀██▄█▄▄█ "], ["eat_2", " ▄▄▄████▀▀█▀▀█\n ▄▀ ▄ ▀▄▄██▀█▀\n█ ▀ ▀ █ ██▄\n▀█▀▀▀▀▄ ▄▀▀▀▀▄ █\n▄▀▀█████▄▀▀▀ █ █\n▀▄▄█▄▄▄▄█▄▄▄▀█▀▄\n ▄▄█▄ ▄▄██▄▄█\n█▄█▄██▀██▄█▄▄█ "], ["happy", " ▄▀▀▀▀▀▄▄▄▄▄▄▄▄\n▄▀ ▄▀▄ █ ▄█▄▄█\n█▄▄▄▄▄▄▄ █▀▀▀▄█ \n ███████▀█▄▄▄▀▀█\n █▄▀▀▀▀▄▀▄▄▄ █ █\n█ ▀█▀▀▀▀█ ▄█▄▀\n ████▀▀▀▀▀██▄█ █\n█▄█▄██▀▀██▄█▄▄█▀"], ["injured_1", " \n █▀█▀▀▀█▀▀█\n █▄▄█▄██▀█▀\n ▄▀▀▀▀▀█▄▀▄ ██▄\n▄▀ ▄▄ █ █ █\n█▄▄▄▄ ▀ █▄▀█ █\n █▄▄▄██▄█▄▄ ██▀▄\n█▄▄██▄▄▄█▄▄▄██▄█"], ["injured_2", " \n █▀█▀▀▀█▀▀█\n █▄▄█▄██▀█▀\n ▄▄██▄▄ ▀▄ ██▄\n ▄▀ ▀█ █ █\n█ ▀▀▄ █▄▀█ █\n▀█▀▀▀▄▄ ▄█▄ ██▀▄\n█▄██████▄█▄▄██▄█"], ["sleep_1", " \n █▀█▀▀▀█▀▀█\n ▄▀▀▀▀▀█▄▄██▀█▀\n▄▀ ▄▄ █ ██▄\n█▄▄▄▄▄ ▄▀▀▀▀▄ █\n █▄▄▄▄█▄▄▄█▀ █ █\n█▄▄█▄▄▄▄█ ▄█▀▄\n█▄▄▄█▄▄▄██████▄█"], ["sleep_2", " \n ▄▄▄███▀▀▀█▀▀█\n ▄▀ ▀▄▄██▀█▀\n█ ▀▀ █ ██▄\n▀█▀▀▀▀▄ ▄▀▀▀▀▄ █\n▄▀▀█████▄▀▀▀ █ █\n▀▄▄█▄▄▄▄█▄▄▄▀█▀▄\n█▄▄▄█▄▄▄▄▄████▄█"], ["walk_1", " ▄▀▀▀▀▀█▀▀▀█▀▀█\n▄▀ ▄█ █▄██▀█▀\n█▄▄▄▄▄ █ ██▄\n ▀▄▄▄▄█▄▀▄▀▀▀▄ █\n▄▀▀█▄▄▄▄█▀▀▀ █ █\n▀▄▄█▄▄▄▄█▄▄▄▀█▀▄\n ▄▄█▄ ▄▄██▄▄█\n█▄█▄██▀██▄█▄▄█ "], ["walk_2", " ▄▄▄▄▄▄▄▄▄▄\n ▄▀▀▀▀▀█ ▄█▄▄█\n▄▀ ▄█ █▀▀▀▄█ \n█▄▄▄▄▄ █▄▄▄▀▀█\n █▄▄▄▄█▄▀▄▄▄ █ █\n█ █▀▀▀▀█ ▄█▄▀\n ████▀▀▀▀▀██▄█ █\n█▄█▄█▀▀▀██▄█▄▄█▀"]]], + ["machmon", [["angry", " ▄▄ \n ▄▀▀▄█▀▄ \n ▄██▀██▄▀█ ▄▀▀█▀\n███▄▄████▀█▄█▀▀█\n█ ▀ ▀ █▄ █▄ ▄▄█ \n █ ▄█ █ ▄ █▄ █\n ▄▀█▀▀ ▄█▀▀██▀ █\n ▀▀▀███▀ ▀▄▄▄▄▀ "], ["attack", " \n \n ▄▄▀█▄ ▄▄ ▄▄▄▄\n ▀▄▄██▄█▄█▄▀▄▄█▄\n▄██▀ ▄█▀▀▄▀▀▀ ▄▀\n█▀█▀█▀█▀▄▀▀ █▀▀▄\n ▀▄▄▄█▀ █▄█▄██ █\n █▄█▄▄▄█▀▀▄██▄▀ "], ["eat_1", " \n \n ▄▄▀█▄ ▄▄ ▄▄▄▄\n ▀▄▄██▄█▄█▄▀▄▄█▄\n▄██▀▄▀█▀▀▄▀▀▀ ▄▀\n█▀█▀█▀█▀▄▀▀ █▀▀▄\n ▀▄▄▄█▀ █▄█▄██ █\n █▄█▄▄▄█▀▀▄██▄▀ "], ["eat_2", " ▄▄ \n ▄▀▀▄█▀▄ \n ▄██▀▀█▄▀█ ▄▀▀█▀\n█████████▀█▄█▀▀█\n█ ▀ ▀ █▄ █▄ ▄▄█ \n █ ▄█ █ ▄ █▄ █\n ▄▀█▀▀ ▄█▀▀██▀ █\n ▀▀▀███▀ ▀▄▄▄▄▀ "], ["happy", " ▄▄ \n ▄▀▀▄█▀▄ \n ▄██▀██▄▀█ ▄▀▀█▀\n███▄█▄███▀█▄█▀▀█\n█ ▀ ▀ █▄ █▄ ▄▄█ \n █ ▄█ █ ▄ █▄ █\n ▄▀█▀▀ ▄█▀▀██▀ █\n ▀▀▀███▀ ▀▄▄▄▄▀ "], ["injured_1", " \n \n ▄▄ \n ▄▀▀▄█▀▄▀█ ▄▀▀█▀\n ▄█▀█████▀█▄█▀▀█\n███▄▄██▄ █▄ ▄▄█ \n▀▄█▄█▄▀ █ ▄ █▄ █\n █▄█▄▄▄█▀▀▄██▄▄▀"], ["injured_2", " \n \n \n ▄▄▀█▄ ▄▄ ▄▄▄▄\n ▀▄▄██▄█▄█▄▀▄▄█▄\n▄██ ▀██▀▀▄▀▀▀ ▄▀\n███████▀▄▀▀ █▀▀▄\n█▄█▄▄▄▄█▄▄▄███▄█"], ["refuse", " \n ▄▄ \n ▄▀▀▄█▀▄▀█ ▄▀▀█▀\n ▄██▀████▀█▄█▀▀█\n███▄▄██▄ █▄ ▄▄█ \n▀▄▀ ▀▄█ █ ▄ █▄ █\n ▄▀█▀▀ ▄█▀▀██▀ █\n ▀▀▀███▀ ▀▄▄▄▄▀ "], ["sleep_1", " \n \n ▄▄▀█▄ ▄▄ ▄▄▄▄\n ▀▄▄██▄█▄█▄▀▄▄█▄\n▄██▀▀██▀▀▄▀▀▀ ▄▀\n█▀█▀█▀█▀▄▀▀ █▀▀▄\n ▀▄▄▄█▀ █▄█▄██ █\n █▄█▄▄▄█▀▀▄██▄▀ "], ["sleep_2", " \n \n ▄▄▀█▄ ▄▄ ▄▄▄▄\n ▀▄▄██▄█▄█▄▀▄▄█▄\n▄██▀ ██▀▀▄▀▀▀ ▄▀\n█▀█▀█▀█▀▄▀▀ █▀▀▄\n ▀▄▄▄█▀ █▄█▄██ █\n █▄█▄▄▄█▀▀▄██▄▀ "], ["walk_1", " \n ▄▄ \n ▄▀▀▄█▀▄▀█ ▄▀▀█▀\n ▄██▀▀███▀█▄█▀▀█\n███▄▄██▄ █▄ ▄▄█ \n▀▄▀ ▀▄█ █ ▄ █▄ █\n ▄▀█▀▀ ▄█▀▀██▀ █\n ▀▀▀███▀ ▀▄▄▄▄▀ "], ["walk_2", " \n \n ▄▄▀█▄ ▄▄ ▄▄▄▄\n ▀▄▄██▄█▄█▄▀▄▄█▄\n▄██▀ ▄█▀▀▄▀▀▀ ▄▀\n█▀█▀█▀█▀▄▀▀ █▀▀▄\n ▀▄▄▄█▀ █▄█▄██ █\n █▄█▄▄▄█▀▀▄██▄▀ "]]], + ["madleomon", [["angry", " ▄▄▄▄▄▄▄▄▄ \n ▄▄██▀█▀█████▀ \n ▀█▀▄▄█▄█▄▄▀████\n ▄████▀ █▀▄▄██▄\n █▀▀▀▀██▀▄████▀\n ▄▄▀█▀▀▀██▀▄▄█▀█\n █▄▄█▀▀███ ▀▀▀▄▀\n█▄███▀▀▀▀▀█▄██▄█"], ["attack", " ▄▄██▀█▀█████▀\n ▀█▀▄▄█▄█▄▄▀███\n ▄███▀ ▄█▀▄▄█▄\n █ ▀████▄███▀\n ▄▄▄████▀██▀██▄ \n█ ▄ ▄ ▄ █ ███▀▄\n▀▄▄▄▄▄▄▄▀▄█▄▄▄██\n█▄▄██▀▀▀▀▀█▄▄█▄█"], ["eat_1", " ▄▀▀▄▀█▀▀████ \n ▄██▀▀▀██ ██▄▄\n █▀▀▀▀▀███ ▀██▀\n █ ▄▄ ██ █████\n ▄▀▄▄▄▄██▄▀▀█▀█▄\n ▀▄▄█▄▄▄██ ▀▀ ██\n ▄▄█▄▄███████▀ \n █▄▄██▀▀▀█▄▄█▄█ "], ["eat_2", " ▄▄▄▄▄▄▄▄▄ \n ▄▄██▀█▀█████▀ \n ▀█▀▄▄█▄█▄▄▀████\n ▄███▀▄▀█▀▄▄██▄\n █▀▀▀▀██▀▄████▀\n ▄▀█▀▀▀██▀██▄▀█\n █ █▀▀████▄▀▀▄▀\n█▄███▀▀▀▀▀█▄██▄█"], ["happy", " ▄▀▀▄▀█▀▀████ \n ▄███▀███ ██▄▄\n ████▄█▄██ ▀██▀\n ▄█ ██ █▀▀▄ \n █ █▄▄▄██▄█▄██ █\n ▀▄▄█▄▄▄██▀▀▀▀▄▀\n ▄▄█▄▄███████ \n █▄▄██▀▀▀█▄▄█▄█ "], ["injured_1", " \n ▄▄█████████ \n ▄████▀█▀█████▄▄\n █▀▄▄█▄█▄▄▀███▀\n ▄████ ▀█▀▄████\n ▄████████▄██▀▀▄\n █ ▀█▄▄▄███▀ █\n ▀▄▄█▄▄████▄▄▄▄▀"], ["injured_2", " \n ▄▄▄▄▄▄▄▄▄ \n ▄▄██████████▀ \n ▀██▀▀▄▀▄▀▀█████\n ▀▄███▀███ ███▄\n █████▄▄█ ██▀▀█\n █ ▀█▄▄▄███▀ █\n ▀▄▄█▄▄████▄▄▄▄▀"], ["sleep_1", " \n ▄▄▄▄▄▄▄▄▄ \n ▄▄██▀█▀█████▀ \n ▀█▀▄▄█▄█▄▄▀████\n ▄███▀▀██▀▄▄██▄\n █▀▀████▀▄████▀\n ▄▀▀█▄▄▄██ ▄█ ██\n█▄███▀▀▀▀█▄▄▄▄▄█"], ["sleep_2", " \n ▄▄█████████ \n ▄██▀▀▄▀▄▀▀███▄▄\n ▀▄███████ ▀██▀\n ████▄▄██ █████\n ▀▄▄████▄▀▀█▀█▄\n ▄▀▀█▄▄▄██ ▀▀ ██\n█▄███▀▀▀▀▀█▄██▄█"], ["walk_1", " ▄▄█████████ \n ▄██▀▀▄▀▄▀▀███▄▄\n ▀▄███▀▀██ ▀██▀\n ████▄▄██ █████\n ▀▄▄████▄███▀█▄\n ▄▀ █▄▄▄██▄▀██ █\n ▀▄▄█▄▄█████▄▄▀ \n █▄▄██▀▀▀█▄▄█▄█ "], ["walk_2", " ▄▄▄▄▄▄▄▄▄ \n ▄▄██▀█▀█████▀ \n ▀█▀▄▄█▄█▄▄▀████\n ▄███▀ ▄█▀▄▄██▄\n █▀▀████▀▄████▀\n ▄▀█▀▀▀██▀██▄▀█\n █ █▀▀████▄▀▀▄▀\n█▄███▀▀▀▀▀█▄██▄█"]]], + ["magnaangemon", [["angry", " ▄▄▄▄▄ ▄▄▄ \n █▄▀ █▀▄▄▀ ▄▀ \n █ █ █▄ █ ▄▀ \n▄█ █ ▄▀▄█▄█▄▄▀ \n██▀█▀ ▀▄▀ ▄▀▀▄ \n█▀▄▄▄▄▀ ▀█▀▀▄ ██\n▀▄█▄█▄█▄▄▄█▄▄█ █\n█▄█▄█▀▀▀█▄█▄▄█▀ "], ["attack", " ▄▀▀▀▀█▄ ▄▀█\n ▄▀ ▄▀▄ █ ▀▄\n▄▄ ██▀ ▄▀▄ ▀▄█▀▄\n█ ▀█▄▄▄█▄▀█▄ █▀ \n▄▀▀ ▀▄▄█ █ █▄▀█\n█▄▀█▀▀▀ █▀▀▀▄▄▀\n ▄▄▀▀▀█▀▀ ▀▄█ ▄▀\n█▄█▄▄▀▀█▄▄█▄▄█ "], ["eat_1", " ▄▀██▀▀▀▀▄ ▄▀▀█\n█▀█▀▀ ▄▄▀▀▄▀ ▀▀▄\n▀▄▄▄▄█ ▀▄▀▄ ▀▀▄\n████▄▄█ █▀▀█▄█▀ \n█▀▄▄▄▄▄▀▄▄▄▀ ▀█\n█ █ ▄▀▄ █▄█▀ ▄▀\n █▀▀▀███▀▀▀██▀ ▀\n█▄█▄█▀▀▀█▄█▄▄█ "], ["eat_2", " ▄▄▄▄▄ ▄▄▄ \n █▄▀ █▀▄▄▀ ▄▀ \n █ █ █▄ █ ▄▀ \n █▄█▄▄▄▀▄█ █▄▄▀ \n█▀▄█ ▀▄▀▀▀▄█ ▄▄\n█▀▄▀▀█▀ ▀▄▄▀ █ █\n▀▄█▄█▄█▄▄▄█▄▄█▀▄\n█▄█▄█▀▀▀█▄█▄▄█▀ "], ["happy", " ▄▀██▀▀▀▀▄ ▄▀▀█\n█▀█▀ ▄▄▀▀▄▀ ▀▀▄\n▀▄▄▄▄█▄ ▀▄▀▄ ▀▀▄\n█▀████▀ █▀▀█▄█▀ \n█▀▄▄▄▄▄▀▄▄▄▀▄ ▀█\n▀▄ █ ▀ ▄▀ █ ▀▄\n █▀▀▀███▀▀▀██▄▀ \n█▄█▄█▀▀▀█▄█▄▄█ "], ["injured_1", " \n ▄▀█▀▀█▄ ▄▄ \n ▄▀█ █ ▀█ ▀▀▄\n █ █ █▀▄▀▄ ▀█▀\n▄█▀█▀▀█ ██▄▀█▄▄█\n▀▄▀█▄▄▄▀▄▄▄█▀ ▀▄\n█ ▀▄▄▀▄▀▀▄ █▀▀▄▀\n█▄▄████▄▄▄▄█▄█▄█"], ["injured_2", " \n ▄▄▄▄▄ \n █▄▀ █▀▄▄▀▀▄▄ \n █ █ █▄ █ ▄▄█\n▄█▄█▄▄▄▀▄█▄▀▄ ▀▄\n▀█▄█ ▀▄▄▄▄██▀█▀\n█ ▀█▀██▀▀▄ █▀▀▄█\n█▄▄██▄█▄▄▄▄█▄█▄█"], ["sleep_1", " \n ▄▄▄▄▄ ▄▀▀█ \n █▄▀ █▀▄ █ ▀▄ \n█ █ █▄ █▀▄ ▀▄ \n█▄█▄▄▄▀▄██▄▀█▀ \n█▄█ ▀▄█ ▄██▀▀█\n█▀▀▀█▀▄ ▀█ █▄▀\n█▄▄▄██████▄▄▄█ "], ["sleep_2", " \n ▄▀█▀▀█▄ ▄▀▀█ \n ▄▀█ █ ▀█ ▀▄ \n █ █ █▀▄▀▄ ▀▄ \n▄█▀█▀▀█ ██▄▀█▀ \n█▄██▄▄▄█ ▄██▀▀█\n█ ▀▄▀▄ ▀█ █▄▀\n█▄▄▄██████▄▄▄█ "], ["walk_1", " ▄▀█▀▀█▄ ▄▀▀█\n ▄▀█ █ ▀▄▀ ▀▀▄\n █▀█▀▀ █▀▄▀▄ ▀▀▄\n▄█▄█▄▄▀ ██▄▀▄▀▀ \n▀▄▀▄▄▄▄▀▄ █▀▄▀█\n█ █ ▄▀▄ █▀ █ ▄▀\n▀▄▀▀▀██▀▀▀▄▄█ ▄▀\n█▄█▄█▀▀█▄█▄▄█▀ "], ["walk_2", " ▄▄▄▄▄ ▄▄▄ \n █▄▀ █▀▄▄▀ ▄▀ \n █▄█▄▄ █▄ █ ▄▀ \n █ █ ▄▀▄█ █▄▄▀ \n█▀█▀▀▀ ▄▀▀▀▄█ ▄▄\n█▀▄▀▀█▀ ▀▄▄▀ █ █\n▀▄█▄█▄█▄▄▄█▄▄█▀▄\n█▄█▄█▀▀▀█▄█▄▄█▀ "]]], + ["magnadramon", [["angry", " ▄▄▄▄▄▄▄▄ \n ▄▀▀ ▄ ▄█▄▄ \n▄▀▄▄ ▀▀ ▄▄▀ \n▀█ ▀▀ ▄▀ ▀█▀ \n ▀█▀█▀▀ ▄▀█ █▄ \n ▄▀▄█ ▀▀▀█▀█ \n ▀▀█▀▄ ▄▀ ▀▄▀ \n █▄▄▀▀▄▄███▀ "], ["attack", " ▄▄▄▀▀▀▀█▀▀ \n▄▀ ▄█▀ ▀█▀▀ \n█████▄ ▀█▀▄▄▄ \n ██████ █ ▄▀ \n▄█▄▄▄▄▀ ▄▀█ █▀ \n▀▄▄▄▄▄▄▀▀█▀█▀▄▀█\n ▄▀▀▄ █▄▄█▀ █ \n ▀▀▀▀▀▄▄▄▄▄▄▀ "], ["eat_1", " ▄▄▄▀▀█▀▀ \n ▄▄▀ ▄ ▀▀█▀▀ \n█▄▄▄▀ ▀ ▀█▀▄▄▄ \n ▀▄ ▄▀ ▄▀ \n ▄▄▄▄▀ █▄▀█ █▀ \n ▀▄▄▄▄▀ ▀█▀█▀▄▀█\n ▄▀▀▄ █▄▄█▀ █ \n ▀▀▀▀▀▄▄▄▄▄▄▀ "], ["eat_2", " ▄▄▄▄▄ \n ▄▀▀▀ ▄█▄▄▄ \n▄▀▀ ▄▀▄ ▄▄█ \n▀█▀▀ ▄▀ ▀█▀ \n ▀█▀█▀▀ ▄▀█ █▄ \n ▄▀▄█ ▀▀▀█▀█ \n ▀▀█▀▄ ▄▀ ▀▄▀ \n █▄▄▀▀▄▄███▀ "], ["happy", " ▄▄▀▀▀▀█▀▀ \n▄▀▀ ▄▀▄▀▀█▀▀ \n▀▀▀▀▀▄ ▀█▀▄▄▄ \n █ ▄▀ ▄▀ \n ▄▄▄▀ █▄▀█ █▀ \n ▀▄▄▄▄▀ ▀█▀█▀▄▀█\n ▄▀▀▄ █▄▄█▀ █ \n ▀▀▀▀▀▄▄▄▄▄▄▀ "], ["injured_1", " \n \n ▄▄█▀▀█▀▀ \n ▄▄▀ ▀▀█▀▀ \n█▄▄ ▀▄▄ ▀█▀▄▄▄ \n▄▀▄▄▄▄▄▄▀ ▀▄▀ ▄▄\n▀▄█ ▄ ▀▄ █▀▀ █\n█▄█▄▄█▄▄▄█▄▄█▄▀ "], ["injured_2", " \n \n ▄▄▄▄▄▄ \n ▄▀▀▀ ▄█▄▄▄ \n▄▀▀ ▄ ▄▄█ \n▀█▀ ▀▀ ▄▀▄▀█▀ \n▀▄█▀▀▀█▀▄ █▄▄▀█\n█▄█▄▄█▄▄▄█▄▄█▄▄▀"], ["sleep_1", " \n \n ▄▄█▀▀█▀▀ \n ▄▄▀ ▀▀█▀▀ \n█▄▄▄▀▀ ▀█▀▄▄▄ \n▄█▄▄▄▄▄▄▄▄▀▄█ \n█ █ █ █ █▄▀█\n█▄▀▄▄▄▄█▄▄█▄▄█▄▀"], ["sleep_2", " \n ▄▄▄▄▄▄ \n ▄▀▀▀ ▄█▄▄▄ \n▄▀▀ ▄▄ ▄▄█ \n▀█▀▀ ▄▀ ▀█▀ \n▄▄▀█▀▀▀▀▄▄ ▀▄ ▄▄\n█ █ █ █ █▀ █\n█▄▀▄▄▄▄█▄▄█▄▄█▀ "], ["walk_1", " ▄▄▄▀▀█▀▀ \n ▄▄▀ ▄▄ ▀▀█▀▀ \n█▄▄▄▀▀ ▀█▀▄▄▄ \n ▀▄▄▄▄▄▄▀ ▄▀ \n ▄▀▀▄▀ ▄▀█ █▀ \n█▄█▄█ ▀█▀█▀▄▀█\n ▄▀▀▄ █▄▄█▀ █ \n ▀▀▀▀▀▄▄▄▄▄▄▀ "], ["walk_2", " ▄▄▄▄▄ \n ▄▀▀▀ ▄█▄▄▄ \n▄▀▀ ▄█▀ ▄▄█ \n▀█▀▀ ▄▀ ▀█▀ \n ▀█▀█▀▀ ▄▀█ █▄ \n ▄▀▄█ ▀▀▀█▀█ \n ▀▀█▀▄ ▄▀ ▀▄▀ \n █▄▄▀▀▄▄███▀ "]]], + ["magnadramon_x", [["angry", " ▄▄ ▄▄▄ \n ▄▄▄▄▀▀ ▀▀█▀█▄ \n █▀ ▄█ ▄▀ \n ▀█▀ ▄▄▀▄▄▀▀▀█\n ▀██▀ ▄ ▄ ▀█ \n ▄▀ █ █▄▀▀ \n █▀▄ ▀▀ ▀▄▄▀█\n ▀▄▄█▀▄▄█▄▄▄▄▀"], ["attack", " ▄▄▄▄▄▀▀▀▄███▄ \n █▀ ▄█ ▄▀ ▀▀ \n ▀▀██▄ █ ▄▀▀█\n ▄████ █▀█▀ ▄█▀\n ▀▄▄▄▄█▀▄ █▄▄▀ \n ▄█ █ █ ▄▄\n █ ▀▄▄ ▀█ ▀▀ █\n ▀▄▀ ▀▄▀▀▄▄▀ "], ["eat_1", " ▄▄▀▀▄███▄ \n ██▀▀ ▄ ▄▀ ▀█ \n █▄▄▄▀ ▀ █ ▄▄▄▄\n ▀███ █▀▀ ▄▄▀\n ▄▀▄▄▄▄▀ ▄ ▄▄▀ \n ▀▄█ ▀▄▄▀█ ▄▄\n █ ▀▄▄ ▄ ▀▀ █\n ▀▄▀ ▀▄▀▀▄▄▀ "], ["eat_2", " ▄▄ ▄▄▄ \n ▄▄▄▄▀▀ ▀▀█▀█▄ \n █▀ ▄▀▄ ▄▀ ▀ \n ▀█▀ ▄▄▀▄▄▀▀▀█\n ▀██▀ ▄ ▄ ▀█ \n ▄▀▄▀ █ ▄█▄▀▀ \n █▀ ▄▀ ▀▀▄▀█\n ▀▄█▄▄▄█▄▀▄▄▄▀"], ["happy", " ▄▄▀▀▄███▄ \n ██▀▀ ▄ ▄▀ ▀█ \n █▄ ▀ ▀ █ ▄▄▄ \n ▀████ █▀ █▀█\n █▀▀ ▄█▀ ▄█▄▀ \n █ █▀▀ ▀█ ▄▄\n █ ▀▄▄ ▄ ▀▀ █\n ▀▄▀ ▀▄▀▀▄▄▀ "], ["injured_1", " \n ▄▄ ▄▄▄ \n ▄▄▄▄▀▀ ▀▀█▀█▄ \n █▀ █▄ ▄▀ ▀ \n ▀█▀ ▄▄▀▄▀▀▀█ \n ▀██▀ ▄ ▄ ▀█ \n ▄█▀ ▄▀ █▄██▀█\n █▄█▄▄█▄▄█▄▄▄▄▀"], ["injured_2", " \n \n ▄▄▀▀▄███▄▄ \n██▀▀ ▄ ▄▀ ▀▀ \n█▄▄ ▀▀ █ ▄▄▀▀█ \n ▀▄▄▄▄▀▀ ▀█ ▀█ \n ▄█ ▄▀ █▄██▀█\n █▄█▄▄█▄▄█▄▄▄▄▀"], ["sleep_1", " \n ▄▄▀▀▄███▄ \n██▀▀ ▄▀ ▀█ \n█▄▄ ▀▀ █ ▄▄▄▄ \n ▀▄▄▄▄▀▀ ▀▀ ▄▄▀ \n ▄▀█ ▄▀ █ ▄█ \n █ █ ▀▄▀▀█▄▄▀█\n █▄█▄█▄█▄▄▄▄▄▀"], ["sleep_2", " ▄▄ ▄▄▄ \n ▄▄▄▄▀▀ ▀▀█▀█▄ \n █▀ ▄▄ ▄▀ ▀ \n ▀█▀ ▄▄▀▄▄▀▀▀█\n ▀██▀ ▄ ▄ ▀█ \n ▄▀▄▀ █ ▄█▄▀▀ \n ▀▄▀ ▄▀ ▀▀▄▀█\n ▀▄█▄▄▄█▄▀▄▄▄▀"], ["walk_1", " ▄▄▀▀▄███▄ \n ██▀▀ ▄▄ ▄▀ ▀█ \n █▄▄ ▀▀ █ ▄▄▄▄\n ▀▄▄▄▄▀▀ ▀▀ ▄▄▀\n ▄▀█ ▄▀ █ ▄▄▀ \n ▀▄█ ▀▄▀▀█ ▄▄\n █ ▀▄▄ ▄ ▀▀ █\n ▀▄▀ ▀▄▀▀▄▄▀ "], ["walk_2", " ▄▄ ▄▄▄ \n ▄▄▄▄▀▀ ▀▀█▀█▄ \n █▀ ▄█▀ ▄▀ ▄▄▄\n ▀█▀ ▄▄▀▄▄▀ ▄█\n ▀██▀ ▄ ▄ ▀█ \n ▄▀▄▀ █ ▄█▄▀▀ \n █▀▄ ▀ ▀▄▄▀█\n ▀▄▄█▀▄▄█▄▄▄▄▀"]]], + ["magnagarurumon", [["angry", " ▄▀▄▀▄ ▄▄▄ \n ▄▀ ▀ █▀ ▄▀ \n ▄▀ ▄█ █▀▀▀▀█\n ▀▄▄▄▄ ▄█▀▀▄▄▄▀\n ▄███▀ ██▄▄█ \n ██▄▄▄▀█▄▄ █ \n ▄▀ ▄▄▄▄ ▀█▀ \n █▄█▄█ ▀█▄█▄█ "], ["attack", " ▄ ▄ \n █ █ █▄▀▀█ \n ▄▀ ▄▄ ▀▄▄█▄▄▄\n █ ▀▀ ▄█▄ █\n ▀█▄▄▄▀█ █▀▀ \n ▄▀▀▄ ▄▄▀▀▀▀▄ \n █▄█▀▀▀ ▀▀▄▄▄█ \n█▄█▄▄▀▀▀▀▀▄▄█▄█ "], ["eat_1", " ▄ ▄ \n █ █ █▄▀▀█ \n ▄▀ ▄ ▀▄▄█▄▄▄\n █ ▀ ▀ ▄█▄ █\n ▀█▄▄▄▀█ █▀▀ \n ▄▀▀▄ ▄▄▀▀▀▀▄ \n █▄█▀▀▀ ▀▀▄▄▄█ \n█▄█▄▄▀▀▀▀▀▄▄█▄█ "], ["eat_2", " ▄▀▄▀▄ ▄▄▄ \n ▄▀ ▀ █▀ ▄▀ \n ▄▀ ▄█▀ █▀▀▀▀█ \n ▀▄▄▄▄ ▄█▀▀▄▄▄▀ \n ▄▄███▀ █▄▄█ \n█ █▄▄▄▀█▄ █ \n █▀ ▄▄▄▄ ▀▀█ \n█▄█▄█ ▀█▄█▄█ "], ["happy", " ▄▀▄▀▄ ▄▄▄ \n ▄▀ ▀ █▀ ▄▀ \n ▄▀ ▄▀▄ █▀▀▀▀█\n ▀▄▄▄▄ ▄█▀▀▄▄▄▀\n ▄▄███▀ █▄▄█ \n █ █▄▄▄▀█▄ █ \n █▀ ▄▄▄▄ ▀▀█ \n █▄█▄█ ▀█▄█▄█ "], ["injured_1", " ▄ ▄ \n █ █ █▄▀▀█ \n ▄▀▄ ▀▄▄█▄▄▄\n █ ▀▀ █ █\n ▀█▄▄▄▀█▀▀█▀▀ \n ▄▀▄ ▄█▀▀█ \n █▄██▀▀█▀ ▄▀▄ \n █▄█▄███▄▄█▄█▄█ "], ["injured_2", " \n ▄▀▄▀▄ ▄▄▄ \n ▄▀ ▀ █▀ ▄▀ \n▄▀ █▄ █▀▀▀▀█ \n▀▄▄ ▄▄█▄▄▄▄▀ \n ▄▀█▀▀ █▄▀▀▄ \n█▄██▀▀█▀ ▄▀▄ \n█▄█▄███▄▄█▄█▄█ "], ["refuse", " ▄ ▄ \n █ █ █▄▀▀█ \n ▄▀ ▄ ▀▄▄█▄▄▄\n █ ▀▀ ▄█▄ █\n ▀█▄▄▄▀█ █▀▀ \n ▄▀▀▄ ▄▄▀▀▀▀▄ \n █▄█▀▀▀ ▀▀▄▄▄█ \n█▄█▄▄▀▀▀▀▀▄▄█▄█ "], ["sleep_1", " \n ▄ ▄ \n █ █ █▄▀▀█ \n ▄▀ ▀▄▄█▄▄▄\n █ ▀▀ ▄█▄ █\n ▄▄██▄▄▄▀█▄▄██▀ \n█ ▀ █▄▄▀█▄█ ▀ █ \n█▄▄▄█▄▄▄▄▄█▄▄▄█ "], ["sleep_2", " \n ▄▀▄▀▄ ▄▄▄ \n ▄▀ ▀ █▀ ▄▀ \n ▄▀ ▄▄ █▀▀▀▀█\n ▀▄▄ ▄█▀▀▄▄▄▀\n ▄▄▄█▀▀▀ █▄▄█▄ \n█ ▀ █▄▄▀█▄█ ▀ █ \n█▄▄▄█▄▄▄▄▄█▄▄▄█ "], ["walk_1", " ▄▀▄▀▄ ▄▄▄ \n ▄▀ ▀ █▀ ▄▀ \n ▄▀ ▄█▀ █▀▀▀▀█\n ▀▄▄ ▄█▀▀▄▄▄▀\n ▄▄▀▀▀▀ █▄▄█ \n █ ▄█▄▄▀█▄ █ \n █▀ ▄▄▄▄ ▀▀█ \n █▄█▄█ ▀█▄█▄█ "], ["walk_2", " ▄ ▄ \n █ █ █▄▀▀█ \n ▄▀ ▄▄ ▀▄▄█▄▄▄\n █ ▀▀ ▄█▄ █\n ▀█▄▄▄▀█ █▀▀ \n ▄▀▀▄ ▄▄▀▀▀▀▄ \n █▄█▀▀▀ ▀▀▄▄▄█ \n█▄█▄▄▀▀▀▀▀▄▄█▄█ "]]], + ["magnamon", [["angry", " ▄▄▄██▄▀▀█ \n █ ▄▄▀▄▄█ ▄▄ \n▄▀█████▀█ ▄█ █ \n█▄▄█▄▄▄▄▀█ ▄▀▀█ \n▀▄ █ ▄▄ ▄█▄▄██▄\n ▀█▀█▄▀▀███████\n ▄█ █ ▄▄█▄▄▀▀█\n█▄█▄▄█ ▀█▄█▄█ "], ["attack", " ▄▄ ▄▄▄ \n ▄██▀▀ ▄█ \n █ ▄▄▀█▀▀▄ \n ▄▀█▀▀▀▀█▄▀▀▀▄ \n ▀▄█▀▀▀▀▄█▄▄▄▀▄ \n █▄▀▄█▀▄▀▀██▄▄ █\n▄█ ▄▀▀█▄ █ ██\n█▄█▄█▀▀▀ ▀█▄█▀▀█"], ["eat_1", " ▄██▄▀▀█ \n ▄▀▀▀ ▄▄█▀ \n █▄▄██▄█ █▄▄ \n █ █▄▄▄▄▀█ █ \n ▄▀█ ▄▄ ▄▄█▀▀▄ \n▄▀▀▄▀ ▀█ ▀▄█▄ \n▀▄█▀▀▄█ ▄█▀████▄\n █▄█▄▄█▀█▄█▄█▀▀ "], ["eat_2", " ▄██▄▀▀█ \n ▄▀▀▀ ▄▄█▀ \n █▄▄██▄█ █▄▄ \n █ █▄▄▄▄▀█ █ \n ▄▀█ ▄▄ ▄▄█▀▀▄ \n▄▀▀▄▀ ▀█ ▀▄█▄ \n▀▄█▀▀▄█ ▄█▀████▄\n █▄█▄▄█▀█▄█▄█▀▀ "], ["happy", " ▄██▄▀▀█ \n ▄▀▀▀ ▄▄█▀ \n █▄▄██▄█ █▄▄ \n █ █▄▄▄▄▀█ █ \n ▄▀█ ▄▄ ▄▄█▀▀▄ \n▄▀▀▄▀ ▀█ ▀▄█▄ \n▀▄█▀▀▄█ ▄█▀████▄\n █▄█▄▄█▀█▄█▄█▀▀ "], ["injured_1", " ▄██▄▀▀█ \n ▄▀▀▀ ▄▄█▀ \n █▄▄██▄█ █▄▄ \n █ █▄▄▄▄▀█ █ \n ▄▀█ ▄▄ ▄▄█▀▀▄ \n▄▀▀▄▀ ▀█ ▀▄█▄ \n▀▄█▀▀▄█ ▄█▀████▄\n █▄█▄▄█▀█▄█▄█▀▀ "], ["injured_2", " \n ▄▄ ▄▄▄ \n ▄██▀▀ ▄█ \n █ ▄▄██▀▀▄ \n ██▀▀▀▀█▄▀▀▀▄ \n▄█▄█▀██▀▄▀▄▄▄█▄ \n▀▄▄▀▀█▄▀█▀▀▄███▄\n █▄█▄█▀██▄▄██▀██"], ["refuse", " ▄██▄▀▀█ \n ▄▀▀▀ ▄▄█▀ \n █▄▄██▄█ █▄▄ \n █ █▄▄▄▄▀█ █ \n ▄▀█ ▄▄ ▄▄█▀▀▄ \n▄▀▀▄▀ ▀█ ▀▄█▄ \n▀▄█▀▀▄█ ▄█▀████▄\n █▄█▄▄█▀█▄█▄█▀▀ "], ["sleep_1", " ▄██▄▀▀█ \n ▄▀▀▀ ▄▄█▀ \n █▄▄██▄█ █▄▄ \n █ █▄▄▄▄▀█ █ \n ▄▀█ ▄▄ ▄▄█▀▀▄ \n▄▀▀▄▀ ▀█ ▀▄█▄ \n▀▄█▀▀▄█ ▄█▀████▄\n █▄█▄▄█▀█▄█▄█▀▀ "], ["sleep_2", " ▄██▄▀▀█ \n ▄▀▀▀ ▄▄█▀ \n █▄▄██▄█ █▄▄ \n █ █▄▄▄▄▀█ █ \n ▄▀█ ▄▄ ▄▄█▀▀▄ \n▄▀▀▄▀ ▀█ ▀▄█▄ \n▀▄█▀▀▄█ ▄█▀████▄\n █▄█▄▄█▀█▄█▄█▀▀ "], ["walk_1", " ▄██▄▀▀█ \n ▄▀▀▀ ▄▄█▀ \n █▄▄██▄█ █▄▄ \n █ █▄▄▄▄▀█ █ \n ▄▀█ ▄▄ ▄▄█▀▀▄ \n▄▀▀▄▀ ▀█ ▀▄█▄ \n▀▄█▀▀▄█ ▄█▀████▄\n █▄█▄▄█▀█▄█▄█▀▀ "], ["walk_2", " ▄▄ ▄▄▄ \n ▄██▀▀ ▄█ \n █ ▄▄▀█▀▀▄ \n ▄▀█▀▀▀▀█▄▀▀▀▄ \n ▀▄█▀▀▀▀▄█▄▄▄▀▄ \n █▄▀▄█▀▄▀▀██▄▄ █\n▄█ ▄▀▀█▄ █ ██\n█▄█▄█▀▀▀ ▀█▄█▀▀█"]]], + ["magnamon_x", [["angry", " ▄▄ ▄▄ \n █▄██ █▄▄▄ \n █ ▄▀ ▄▄▀▄▄▄\n █▀ ▄▀ █▀▀▄▄▀\n ▄██▄▄▀█▄ ▄▄▀ \n █ █ ▄█ █▀█ \n ▄█▀█▀▀███▀▀▄ \n █▄▄▄█▄▀▀█▄█▄▄█ "], ["attack", " ▄▀█▄▀█ \n ▄▀▀█▀ ▀▀▀█ \n █▄▀ ▄▄ ██▀▀█\n ▀▄▄▀▀▄▄▀ ▀█ \n ▄▀▀▀█▀▀▀▄▀▀█▀█ \n ▀▄▄▀▀▄▄██▄▄▄▀ \n ▄▀█ ▄█▀ ▀█▄ \n █▄▄█▀ █▄█▄▄█ "], ["eat_1", " ▄▀█▄▀█ \n ▄▀▀█▀ ▀▀▀█ \n █▄▀ ▄▀▄██▄▀▀█\n ▀▄▄▄▄ ▄▀ ▀█ \n ▄█▀▀▄▄██▄▀█ \n █ █▀▀▄█ █▄▀ \n █▀█▀▄█▀▀▀█ \n █▄▄█▀ █▄█▄▄█ "], ["eat_2", " ▄▄ ▄▄ \n █▄██ █▄▄▄ \n █ ▄▀ ▄▄▀▄▄▄\n █▀ ▄▀▄ █▀▀▄▄▀\n ██▄▄▀█▄ ▄▄▀ \n ▄▀█ ▄█▀▀█ █ \n █▄▀█▀▀█▄▄▀▀▄ \n █▄▄▄█▄▀▀█▄█▄▄█ "], ["happy", " ▄▀█▄▀█ \n ▄▀▀█▀ ▀▀▀█ \n █▄▀ ▄▀▄██▄▀▀█\n ▀▄▄▄▄ ▄▀ ▀█ \n ▄▀█▀▀▀▄█▀▀▄▀▄ \n ▀▄█▀▀█▄▀▄▄▀▄▀ \n ▄▀█▀▄▄▀▀▀█ \n █▄▄█▀ █▄█▄▄█ "], ["injured_1", " ▄▄ ▄▄ \n █▄██ █▄▄▄ \n █ ▄▀ ▄▄▀▄▄▄\n █▀ █▄ █▀▀▄▄▀\n ██▄▄▀█▄ ▄▄▀ \n ▄▀▀█ ▄▀▀█▀ █ \n ▀▄█▀█▀▀▄▄█▄█▄ \n █▄▄█▄▀▀█▄█▄▄█ "], ["injured_2", " \n ▄▀█▄▀█ \n ▄▀▀█▀ ▀▀▀█ \n █▄▀▄ ██▄▀▀█\n ▀▄▄▀▀▄▄▀ ▀█ \n ▄█▀▀▀▄██▄▀█ \n █▄█▄▄█ █▄▄█ \n █▄▄▄█▀▀██▄█▄▄█ "], ["sleep_1", " \n ▄▄ ▄▄ \n █▄██ █▄▄▄ \n █ ▄▀ ▄▄▀▄▄▄\n █▀ ▀▀ █▀▀▄▄▀\n ▄▄██▄▄██▄▄▄▄▀ \n █ ▀ █▄███ ▀ █ \n █▄▄▄█▄▄▄█▄▄▄█ "], ["sleep_2", " \n ▄▀█▄▀█ \n ▄▀▀█▀ ▀▀▀█ \n █▄▀ ▄▄ ██▄▀▀█\n ▀▄▄ ▄▄▀ ▀█ \n ▄▄█▀▀▀▄██▄██ \n █ ▀ █▄███ ▀ █ \n █▄▄▄█▄▄▄█▄▄▄█ "], ["walk_1", " ▄▀█▄▀█ \n ▄▀▀█▀ ▀▀▀█ \n █▄▀ ▄▄ ██▄▀▀█\n ▀▄▄▀▀▄▄▀ ▀█ \n ▄█▀▀▀▄██▄▀█ \n █ █▄▄██ █▄▀ \n █▀█ ▄█▀▀▀█ \n █▄▄█▀ █▄█▄▄█ "], ["walk_2", " ▄▄ ▄▄ \n █▄██ █▄▄▄ \n █ ▄▀ ▄▄▀▄▄▄\n █▀ ▄█▀ █▀▀▄▄▀\n ██▄▄▀█▄ ▄▄▀ \n ▄▀█ ▄█▀▀█ █ \n █▄▀█▀▀█▄▄▀▀▄ \n █▄▄▄█▄▀▀█▄█▄▄█ "]]], + ["malomyotismon", [["angry", " ▄▄▄ \n██▄▄▀▀▄███▀▀▄███\n ██ ▀▀▀▀ ███▀ \n█ █ █▄ ▄█ ▄▀ █ \n▀▄▄█▄ ▄▄▀█▄▄▄▀ \n▄▀ ▄█▀▀ █▀▄ ▀▄\n█ █▄▀███▀▀▄█ █\n ██▄▄█ █▄▄██▀ "], ["attack", " ▄▀▀█ \n ▄▀▀▀▀▀▄ █▄███▀\n █▄▄▄▄▄▀ ████ \n ▄▄▄█ █▀ █ \n █▀▄▄▄▄▀▀▀▄▄▄▀ \n▄▀▀▀█▄▄▄▄▀▀ █ \n▀▄▄▄▀ █▄█▄▄▄█ \n █▄▄▄█ █▄▄▄█ "], ["eat_1", "▄▄ ▄▄ ▄███▄ ▄▄▄\n▀██▀ ▄███▀ ▄███▀\n▄▀█ ▄▄ ▄▄ █▀▀▄ \n█ █▄▄▄▄▄▄▄█▄ █ \n▄▀ ██████ ▀█▄ \n█ █▀▀▀▀▄▄█▄ █ \n ▀██▀▀▀█▄▀ ▀██ \n █▄▄▄█ █▄▄▄█ "], ["eat_2", " ▄▄▄ \n██▄▄▀▀▄███▀▀▄███\n ██ ▀▀▀▀ ███▀ \n█ █▄▀▄ ▄▀▄▄▀ █ \n▀▄▄█▄ ▄▄▀█▄▄▄▀ \n▄▀ ▄█▀▀ █▀▄ ▀▄\n▀▄▄█▄▀███▀▀▄█▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["happy", "▄▄ ▄▄ ▄███▄ ▄▄▄\n▀██▀ ▄███▀ ███▀\n▄▀▀▄▄ ▄▄ ▄█▀▀▄\n█ █ ▀ ▀ ▄█▄▀ █\n ▀▄▄█▄▄██▀█▄▄▄▀ \n ▀█▀▀▄██ \n ▄█▀▀▀█▄▀ ▀▄ \n █▄▄▄█ █▄▄▄█ "], ["injured_1", " \n ▄▄ ▄███▄ \n███▀ ▄███▀ ▄████\n▄▀█ ▄ ▄ ███▀ \n█ ▀▄▀▀ ▀▀▄█ █ \n █▀▀█▄▄▀▀ ██▀▀▄ \n█ █▀▄▄▄▄▄█ █ █\n▀▄▄██▄█▄▄█▄██▄▄▀"], ["injured_2", " \n ▄▄▄ \n▄▄▄▀▀▄███▀▀▄▄▄▄ \n▀█ ▀▀▀▀ ████▀ \n██ ▄█ █▄ ▄█▀▀ █ \n▀█▀▄ ▄▄▀▀██▀▀▄ \n█ █▀█▄▄▄▄█ █ █\n▀▄▄██▄█▄▄█▄██▄▄▀"], ["sleep_1", " \n \n█▄ ▄▄ ▄███▄ ▄▄▄ \n▀█▀ ▄███▀ ▄███▀ \n██ █▀▀█ \n ▀▄▀▀ ▀▀▄█▄▄▄█ \n█▀▀█▄▄▀▀ ▄▀▄ ▀▄\n▀▄▄█▄████████▄▄▀"], ["sleep_2", " \n ▄▄▄ \n██▄▄▀▀▄███▀▀▄███\n ██ ▀▀▀▀ ███▀ \n█ █ ▄▄ ▄▄ ▄▀ █ \n █▄█▄ ▄▄▀██▀▀▄ \n█ ▄█▀▀ █ █ █\n▀▄▄█▄████████▄▄▀"], ["walk_1", "▄▄ ▄▄ ▄███▄ ▄▄▄\n▀██▀ ▄███▀ ▄███▀\n▄▀█ ▄ ▄ █▀▀▄ \n█ ▀▄ ▀ ▀ ▄█ █ \n █▀▀█▄▄▀▀ ██▀▀▄ \n█ █▀▄▄▄▄▄█ █ █\n▀▄▄█▀ ▀▄▄▀ ▀█▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["walk_2", " ▄▄▄ \n██▄▄▀▀▄███▀▀▄███\n ██ ▀▀▀▀ ███▀ \n█ █ ▀▄ ▄▀ ▄▀ █ \n▀▄▄█▄ ▄▄▀█▄▄▄▀ \n▄▀ ▄█▀▀ █▀▄ ▀▄\n█ █▄▀███▀▀▄█ █\n ██▄▄█ █▄▄██▀ "]]], + ["mamemon", [["angry", " \n \n \n \n ▄▄ \n ▀▄▀▀██▄▀ \n ▀▀▀███ \n ▄▄▄▀▀▀▀▄▄▄ "], ["attack", " \n \n ▄ ▄▄▄▄▄ ▄ \n ███▀ ██ \n ▀▀▀▀███ \n ███ \n ███ \n ▄▄▄▄▀▀▀▀▀▄▄▄▄ "], ["eat_1", " \n \n \n \n ▀▄▄▄▄ \n ▀▀██▀▄▀ \n ▀██ \n ▄▄▄▀▀▀▀▄▄▄ "], ["eat_2", " \n \n \n \n \n ▄██▄▀ \n ██▄███ \n ▄▄██████▄▄ "], ["happy", " \n \n \n \n █ ▄██▄ █ \n █▄▀▀▄█ \n ██ ██ \n ▄▄▄▀▀▀▀▄▄▄ "], ["injured_1", " \n \n \n \n \n ▄██▄ \n █▀██▀█ \n ▄▄██████▄▄ "], ["injured_2", " \n \n \n \n \n ▄▄ \n ▄▀▀██▀▀▄ \n ▄▄████████▄▄ "], ["sleep_1", " \n \n \n \n \n ▄▄ \n ▄██████▄ \n █▄▄██▄▄█ "], ["sleep_2", " \n \n \n \n \n ▄████▄ \n █▀▀██▀▀█ \n ▀██████▀ "], ["walk_1", " \n \n \n \n ▄▄ \n ▀▄▀██▀▄▀ \n ██▀▀██ \n ▄▄▄▀▀▀▀▄▄▄ "], ["walk_2", " \n \n \n \n \n ▄██▄ \n ▄▄█▄██▀█▄▄ \n ▄▄██████▄▄ "]]], + ["mamemon_x", [["angry", " \n \n \n ▄▄ ▄▄▄▄ ▄▄ \n██ ▀▄▀ ▀▄▀ ██\n ▄▄▀██▄ ▄█ █▀▄▄ \n█ █▀▄ ▄▀█ █\n ▀▀▄██▀▀▀▀██▄▀▀ "], ["attack", " \n \n ██▄ ▄██\n ▀▄▀▀▀▀▄▀ \n ▄▄▄▄██▄ ▄█ █ \n█ ▄ █ ▄▄ ▄▀▀▄ \n▀▄▄▀▀█▄██▄▄█▄▄▀ \n █▄▄▀ ▀▄▄█ "], ["eat_1", " \n \n \n▄█▀▄ ▄▀▀▀▀▄ ▄▀█▄\n▀▀ ▄█ ▀ ▀ █▄ ▀▀\n▄▀▀▄█ ██ █▄▀▀▄\n▀▄▄▀▄█▄▄▄▄█▄▀▄▄▀\n █▄▄▀ ▀▄▄█ "], ["eat_2", " \n \n \n ▄▄ ▄▄▄▄ ▄▄ \n██ ▀▄▀ ▀▄▀ ██\n ▄▄▀█ ▄ ▄ █▀▄▄ \n█ █▀▄▀ ▀▄▀█ █\n ▀▀▄██▀▀▀▀██▄▀▀ "], ["happy", " \n \n ▄▄ ▄▀▀▄ \n██ ▀▄▄▀▀▀▀▄█▀ █ \n ▄▄▄█▀▀ ▀▀█▄▀ \n█ ▄█ █▄▄█ █ \n ▀▀▀▄█▄██▄█▄ \n █▄▄▀ ▀▄▄█ "], ["injured_1", " \n \n \n ▄▄ ▄▄▄▄ ▄▄ \n██ ▀▄▀ ▀▄▀ ██\n ▄█▄█ █▄█▄ \n █ ▀▄ ▄▀ █ \n ▀▄▄██▀▀▀█▄▄▀ "], ["injured_2", " \n \n \n \n ▄▄▄ ▄▀▀▀▀▄ ▄▄ \n██ ▄█ ▄ ▄ █▄ ██\n ▄▀▀█▀ ▀█▀▀▄ \n ▀▄▄▄█▄▄█▄▄▄▀ "], ["sleep_1", " \n \n \n \n▄█▀▄ ▄▀▀▀▀▄ ▄▀█▄\n▀▀ ▄█ █▄ ▀▀\n▄▀▀▄█▀▀ ▀▀█▄▀▀▄\n▀▄▄▀▄█▄▄▄▄█▄▀▄▄▀"], ["sleep_2", " \n \n \n ▄▄ ▄▄▄▄ ▄▄ \n██ ▀▄▀ ▀▄▀ ██\n ▄▄▀█▄▄ ▄▄█▀▄▄ \n█ █▀▄ ▄▀█ █\n ▀▀▄██▀▀▀▀██▄▀▀ "], ["walk_1", " \n \n \n▄█▀▄ ▄▀▀▀▀▄ ▄▀█▄\n▀▀ ▄█ ▄ ▄ █▄ ▀▀\n▄▀▀▄█ ▄▄ █▄▀▀▄\n▀▄▄▀▄█▄▄▄▄█▄▀▄▄▀\n █▄▄▀ ▀▄▄█ "], ["walk_2", " \n \n \n ▄▄ ▄▄▄▄ ▄▄ \n██ ▀▄▀ ▀▄▀ ██\n ▄▄▀█ ▀ ▀ █▀▄▄ \n█ █▀▄ ▀▀ ▄▀█ █\n ▀▀▄██▀▀▀▀██▄▀▀ "]]], + ["mametyramon", [["angry", " \n \n ▄▄▄ \n ▄▄█▄▀▄▄ \n ▄▀ ▀▄▀▄ \n ▄▀ ▄█ █ \n ▀▄▄▄▄▄▄ ▄▀█ ▄ \n █▄█▄▄▄▄████▀ "], ["attack", " \n ▄▄▄▄ \n ▄▀▀▀▀▄▀ \n ▄▀ ▄█ ▀█▀▄ \n ▀████▄ █▀ \n █▀▀▀█ █▄ \n █▀▀▀▀▄█▄█▄▀ \n ▄█▄█▀▀▀▄▄█▄ "], ["eat_1", " \n █▀█ \n ▄▀▀▀▀▄▀█ \n █ ▄ ▀▄▀ \n █ ▀ ▀ █▄ \n ▀█████▄▄▀█▄▀ \n █▀▀▀██▄▀ \n ▄█▄██▀█▄▄█▄ "], ["eat_2", " \n \n ▄▄▄ \n ▄▄█▄▀▄▄ \n ▄▀ ▀▄▀▄ \n ▄▀ ▄▀▄ █ \n ▀▄▄▄▄▄▄ ▄▀█ ▄ \n █▄█▄▄▄▄████▀ "], ["happy", " \n █▀█ \n ▄▀▀▀▀▄▀█ \n █ ▄ ▀▄▀ \n █ ▀ ▀ █ \n ▀██████ ▀▄▄ \n ▄█▀▀▀▀ ▄█▄█▄▀\n ▄█▄█▀▀▀▀▀▄▄█▄ "], ["injured_1", " \n \n \n █▀█ \n ▄▀▀▀▀▄▀█ \n █ ▀▄▀ \n █ █▄ █▄ \n ▀██▄▄▄▄▄█▄██▀ "], ["injured_2", " \n \n \n ▄▄▄ \n ▄▄█▄▀▄▄ \n ▄▀ ▀▄▀▄ \n ▄▀ ▄ █ \n ▀▄▄▄██▄▄█▄██▀ "], ["sleep_1", " \n \n ▄▄▄ \n ▄▄█▄▀▄▄ \n ▄▀ ▀▄▀▄ \n ▄▀ █ \n █ ▀▀ ▄▄▀█ ▄ \n ██████▄▄██▀ "], ["sleep_2", " \n \n ▄▄▄ \n ▄▄█▄▀▄▄ \n ▄▀ ▀▄▀▄ \n ▄▀ ▄▄ █ \n ▀▄▄▄▄▄▄ ▄▀█ ▄ \n █▄█▄▄▄▄█▄██▀ "], ["walk_1", " \n \n █▀█ \n ▄▀▀▀▀▄▀█ \n █ ▄▄ ▀▄▀ \n █ ▀▀ █▄ \n ▀█▀▀▀▀▄█▄█▄▀ \n ▄█▄█▀▀▀▄▄█▄ "], ["walk_2", " \n \n ▄▄▄ \n ▄▄█▄▀▄▄ \n ▄▀ ▀▄▀▄ \n ▄▀ ▄█▀ █ \n ▀▄▄▄▄▄▄ ▄▀█ ▄ \n █▄█▄▄▄▄████▀ "]]], + ["mammothmon", [["angry", " ▄▄▀▀▀█▀▀▀▄▄ \n█ █ █ ██▄ \n█ ▄▄ ▀▀▀ ▄▄ █ ██\n █ ▄█ ▀▄ ███▀█\n █ ▀▀█ ▄ ██ █▄█\n ███▀█▄▄▄█▀██ █\n ▄▀▀█▄█▀▀▀█▄▀▀▀▄\n█▄█▄██▄█▄▄▀▄█▄▄█"], ["attack", " ▄▀▀▀▄▀▀▀▀▄▄ \n█ ▀ █▄▄▀ █▄▄ \n█ ▀▀ ▄▄ █▀██\n █▀███▄█▄ █▀█▄██\n █ ███ ▀ █▄██ █\n ▄▀▀▀▀▄███▀█ ███\n ▄▀██▀▀▀██▄█▀▀▀▄\n█▄██▄█▄▄▀▀█▄█▄▄█"], ["eat_1", "▄▀▀▀▀▄▀▀▀▀▄▄ \n█ █▄▄▀▀█▄ █ \n█ ▀ ▄▄ ██▄ \n █▀███▄█▄ █▀█ ██\n █ ███ ▀ █▄██▀█\n ▄▀▀▀▀▄███▀█ █▄█\n ▄▀▀██▀▀▀█▄█▀▀▀▄\n█▄█▄▀▄█▄▄▀█▄█▄▄█"], ["eat_2", " ▄▀▀▀▀▄▄▄ \n ▄▀▄▄ █▄▄ \n █▀ ▀ ▄ █ ██\n █ ▄▀▀█ ██▀█\n▄▀▀▀ ██ ███ █▄█\n█ ▀ ▄█▄▄▄█ ███ █\n ▀█▀██▀▀▀███▀▀▀▄\n █▄██▄█▄▄▀█▄█▄▄█"], ["happy", "▄▀▀▀▀▄▀▀▀▀▄▄ \n█ █▄▄▀▀█▄ █ \n█ ▀ ▄▄▄ ██▄ \n █▀█████▄ █▀█ █▄\n █ ███ ▀ █▄██▀█\n ▄▀▀▀▀▄███▀█ █▄█\n█▄███▀█▀▀▀▄█▀▀▀▄\n █▄█▄▄█▄█▄▄█"], ["injured_1", " ▄▄ ▄▄▄ \n ▄▄▀ ▄▀ ▀▄▄ \n█ █▄ ▄ ██ \n▀▄█ ▀▀▀ ▄▄ ▄█▀█▄\n█ ▄█ █▄ █ █▄██\n▀▄█ ▄ ▄▀▀ ██ █ █\n ▀▄▄▄█▀▀▀██▀▀▀▄\n █▄██▄█▄▄█▄█▄▄█"], ["injured_2", " \n ▄▄ ▄▄▄ \n ▄▀ ▄▀ ▀▄ \n▄▀█▄ ▄ ██▄ \n▀▄█▄▀▀▀ ▄▄▄ █ ██\n█ ▄ ▄█▄ ██▀█▀█\n▀▄▄▄███▄▄▄██▄█▄█\n█▄▄█▄▄▄████▄█▄▄█"], ["sleep_1", " \n \n ▄▀▀▄▀▀▀▄▄ \n▄▀█ ▀ ██▄ \n█ █▀▀▀▀ █ ██\n▄▀▀▀ ▄▀▀▄███▀█\n█ ▀ ▄▄█▀▀ ██ █▄█\n██████▄████▄█▄▄█"], ["sleep_2", " \n ▄▄ ▄▄▄ \n ▄▄▀ ▄▀ ▀▀▄▄ \n█ █▄▄▄▄ █▀█▄\n▀▄█▄ ▄▄ ▄█▄██\n█ ▄ ▄█▄ ██▀█ █\n▀▄▄▄███▄▄▄██▄███\n█▄█▄██▄█▄▄█▄█▄▄█"], ["walk_1", " ▄▀▀▄▀▀▀▄▄ \n▄▀█ ▄█ ███▄\n█ █▀▄▄▀ █ ██\n▄▀▀▄ ▄▀▀▄▄██ █\n█▄▀▀ ██ █ █ ██\n █ ▀ ▄█▄▄▄▀█ █ █\n ▄▀▀██▀▀▀█▄█▀▀▀▄\n█▄█▄▀▄█▄▄▀█▄█▄▄█"], ["walk_2", " ▄▄▄ ▄▄▄ \n ▄█ ▄▀ ▀▀▄ \n█ █▄▀▀▄ █▄ \n▀▄█ ▀▀ ▄▄ █▀█▄\n█▄▀▀ █▄ █▀█▄██\n █ ▀ ▄▄▀▀ █▄██ █\n ▄▀██▀▀▀████▀▀▀█\n█▄██▄█▄▄█▀█▄█▄▄█"]]], + ["mammothmon_x", [["angry", "▄▀▀▄█▀▀█▀▀▄▀▀▀▄ \n▄▀ █ ▄ ▄ █ █▄ \n █ █▄ ▀▀ ▄██▀ █\n █ ▄█ ▀▄ █▄▄█\n █ ▀▀█ ▄ ██ ██\n ███▀█▄▄▄███ █\n ▄▀▀█▄█▀▀▀█▄▀▀▀▄\n█▄█▄██▄█▄▄▀▄█▄▄█"], ["attack", " ▄▀▀▀▄▀▀▀▀▄▀▀▀█ \n█ ▀ █▄▄▀ █ ▀▄ \n█ ▀▀ ▄▄ █ █▀▄\n █▀███▄█▄ ██▀ ▄█\n █ ███ ▀ █▄██▀█\n ▄▀▀▀▀▄█▀▀██ █▄█\n ▄▀██▀▀▀█▄▄█▀▀▀▄\n█▄██▄█▄▄▀▀█▄█▄▄█"], ["eat_1", "▄▀▀▀▄▄▀▀▀▀▄▀▀▀█ \n█ ▀ ▀▄▄ █ ▀▄ \n █▄▀▀ ▄▄ █ █▀▄\n ▀█████▄ ██▀ ▄█\n █▀▀▀█▀▀ █▄██▀█\n ▄▀▀▀▄█▀▀██ █▄█\n ▄▀██▀▀▀█▄▄█▀▀▀▄\n█▄██▄█▄▄▀▀█▄█▄▄█"], ["eat_2", "▄▄▄ ▄▄▄▄▄ ▄▄▄ \n▀▄ █▄▀▀ ▀█▀ ▄▀ \n▀▄█▀▄▄ █ ▄▀ \n ▄█▀ ▀ ▄▄█▄▀▀▄ \n█▄▀▀ █▄ █ ▄▀██\n▀█ ▀ ▄▄▀▀ █▄█▄▀█\n ▄▀██▀▀▀████▀▀▀█\n█▄██▄█▄▄█▀█▄█▄▄█"], ["happy", " ▄▀▀▀▄▀▀▀▀▄▀▀▀█ \n█ ▀ █▀▀▄ █ ▀▄ \n█ ▀▀▄▄ ▄▄ █ █▀▄\n ███████▄ ██▀ ▄█\n ██▀▀█ ▀ █▄██▀█\n ▄▀▀▀▀▄█▀▀██ █▄█\n ▄▀██▀▀▀█▄▄█▀▀▀▄\n█▄██▄█▄▄▀▀█▄█▄▄█"], ["injured_1", " ▄▄▄▄▄ \n ▄▀ ▄▀ ▀█▀▄ \n▄▀█ ▄▄▄ ▄▀ ▀▄ \n█▄█▀▀▀▀▀▄█ ▄█▀▀▄\n█ ▄█ █▄ █▀ ▄██\n▀▄█ ▄ ▄▀▀ █▄▀█ █\n ▀▄▄▄█▀▀▀██▀▀▀▄\n █▄██▄█▄▄█▄█▄▄█"], ["injured_2", " \n ▄▀▀█▀▀▄▄▄ \n ▄█ ▀ █ █ \n█ █▄███▄ █ ██▄ \n█▀▀▄ ▄▀▀▄█▀ ▄█\n█ ██ ██ █ ▀█ █\n ▀█ ▄ ▄▀▄▄██▀▀▀▄\n █▄▄▄██▄▄█▄█▄▄█"], ["sleep_1", " \n ▄▀▀█▀▀▄▄▄ \n ▄█ ▀ █ █ \n█ █ ▀▀▀ █ ▄█▄▄\n█▀▀▄ ▄▀▀▄█▀ ▄█\n█ ██ ██▄█ ▄█▀█\n▄▀█ ▄ ▄█▀ ▀█▀ ▀█\n█▄█▄▄▄██▄▄▄█▄▄▄█"], ["sleep_2", " ▄▄▄▄▄ \n ▄▀ ▄▀ ▀█▀▄ \n▄▀█ ▄▄▄ ▄▀ ▀▄ \n█▄█ ▄█ ▄█▀▀▄\n█ ▄█ █▄ █▀ ▄██\n▀▄█ ▄ ▄▀▀▄████▄█\n█ ▀▄▄▄██▀ ▀█▀ ▀█\n█▄▄▄████▄▄▄█▄▄▄█"], ["walk_1", "█▀▀▄▀▀█▀▀▀▄█▀▀▄ \n▄▀▄▀▄█ █ ▀▄ \n ▀█▀▄▄▀ █ ▄█ \n▄▀▀▄ ▄▀▀█▀ ▄█▄\n█▄▀▀ ██ █ █ ██\n █ ▀ ▄█▄▄▄▀█ █ █\n ▄▀▀██▀▀▀█▄█▀▀▀▄\n█▄█▄▀▄█▄▄▀█▄█▄▄█"], ["walk_2", "▄▄▄ ▄▄▄▄▄ ▄▄▄ \n▀▄ █ ▄▀ ▀█▀ ▄▀ \n▀▄█▄▀▀▄ █ ▄▀ \n ▄█ ▀▀ ▄▄█▄▀▀▄ \n█▄▀▀ █▄ █ ▄▀██\n▀█ ▀ ▄▄▀▀ █▄█▄▀█\n ▄▀██▀▀▀████▀▀▀█\n█▄██▄█▄▄█▀█▄█▄▄█"]]], + ["manbomon", [["angry", " ▄▄▄▄ ▄▀█ \n ▄▀ ▄ ▀▄▀ █ \n █ ▀ ▄▄▀▀ ▄▀ \n █ ▀ ▀▀ █ █ \n▄▀▀▄████▄▀▀█ ▀▄ \n▀▄ ▀█▀▀▀█ ▄█ █ \n ▀▀ ▀▀▀ ▀▀ ▀▄█ \n "], ["attack", " ▄▀▀▀▄ ▄▀█\n ▄▀ ▄▀ █▀ █\n █▄▄▄ ▄█ ▀ ▄▀\n ▄▄ █████ ▀ █\n█ ▀█████ ▄▀▀▄▀▄\n▀▄▄▀██▄▄█ █ █ █\n ▀▄▄▄▄▄▄▀▀ ██\n "], ["eat_1", " ▄▄▄▄▄ \n ▄▀ ▄ ▀▄▄▀▀▀█\n █ ▀ ▄▄ ▀▄ █ \n █ ▀ ▀ ▀ ▄▀▄ \n▄▀▀████▄ ▄▀▀█▄▀ \n▀▄▄█████ ▀▄▄▀ █ \n █▀▀▀ █▀█▄▄█\n ▀▀▀▀▀▀ "], ["eat_2", " ▄▄▄▄ ▄▀█ \n ▄▀ ▄ ▀▄▀ █ \n █ ▀ ▄▄ ▀ ▄▀ \n █ ▀ ▀ ▀ █ █ \n ▀▄▄▄ ▄ ▀▄ \n ▄▀▀▄ ▀ ▄▀▀██ █ \n █ ▄▀▀▀█ ▄▀▄█ \n ▀▀ ▀▀ "], ["happy", " ▄▀▀▀▀▄ ▄▄▄▄\n ▄▀ ▄▀ █▀ ▄▀\n █ ▄ ▄▀▀▄ ▀ ▄▀ \n▄▀█▄▄▄▄▄▄ █ █ \n█ ██████ ▄▀▄ \n ▀▀█▄▄▄▀ ▀▄▄█▀▄\n ▀▄▄▄▄▄▄█ █▀▀\n ▀▄▄▀ "], ["injured_1", " \n ▄▄▄▄ ▄▀█\n ▄▀ ▄ ▀▄▀▀ ▄▀\n █ ▀ ▀ ▄▀ \n █ ▀ █▄ █ █ \n ▀▄▄▄ ▄ ▀▄ \n▄▀▀▄ ▀ ▄▀▀█▄▀▄\n█▄▄▄▀▀▀▀▀█▄▄▄▀▄█"], ["injured_2", " \n \n ▄▀▀▀▀▄ ▄▄▀▀█\n ▄▀ ▄▀ ▀▄ █ \n █ ▄ ▄▀▄ \n ▄█ █▄ ▄▄█▄▀ \n█ ▀▄▄▄ █ ▀▄▀▄\n▀▄▄█▄▄█▄▄█▄▄██▄█"], ["sleep_1", " \n ▄▄▄▄ ▄▄▄\n ▄▀ ▄ ▀▄▀▀ █\n █ ▀ ▀ ▄▀ \n █ ▀ ▄▄▄ █ █ \n █▄ ▄ ▄▄▄ ▀▄ \n █ █ ▀ █ ▀█ ▀▄\n ▀▄▄▀▀▀▀▀▄▄▀ ▀▀▀"], ["sleep_2", " ▄▀█ \n ▄▀▀▀▀▀▄▀ █ \n ▄▀ ▄▀ ▀ ▄▀ \n █ ▄ █ █ \n █ ▀▀ ▄ ▀▄ \n ▄▀▀▄▀▄ ▄▀▀██ █ \n █ █▄▄▄█ ▄▀▄█ \n ▀▀ ▀▀ "], ["walk_1", " ▄▄▄▄ ▄▀█ \n ▄▀ ▄ ▀▄▀ █ \n █ ▀ ▄▄ ▀ ▄▀ \n █ ▀ ▄██ █ █ \n ▀▄▄▄ ▄ ▀▄ \n ▄▀▀▄ ▀ ▄▀▀██ █ \n █ ▄▀▀▀█ ▄▀▄█ \n ▀▀ ▀▀ "], ["walk_2", " ▄▄\n ▄▀▀▀▀▄ ▄▄▀ █\n ▄▀ ▄▀ ▀▄ █ \n █ ▄ ▀█▄ ▄▀▄ \n █ ▀▀▀ ▀▄▀ \n ▄▄▀▀▀▄ ▄█▄ █ \n█ ▀▄▄▄▄▄█ ▀█ █\n▀▄▄▀ ▀▄▄▀ ▀▀"]]], + ["mantaraymon_x", [["angry", " \n ▄▀█ ▄▀█ \n █▀▀▄▄█▄▀▀▀█▄▄█▄\n █ ▄▀ ▄▀▄ ▄▀ ▄▀\n ▄▀ ▀▀ ▀ ▄▀ █\n █ █▄ ▄█ █ ▀█▄ █\n█ ▀▄ ▄▀▀█ █▀ █\n ▀▄█▀▀▀ █▄▀█▄▀ "], ["attack", " ▄▀█ ▄▀█ \n █▀▀▄▄█▄▀▀▀█▄▄█▄\n █▄▀▀ ▀▀▄▄▀ ▄▀\n ▄█ █▄ ▄█ ▀▄▄▀█ \n▄▀ █▄▄▄▄▄██ █ █\n█ ███▀▀▀██ █ █ █\n█ ▀█▀▀▀▀▀▀▄▀ █ █\n ▀▀ ██████▀██▄▀ "], ["eat_1", " ▄▀█ ▄▀█ \n █▀▀▄▄█▄▀▀▀█▄▄█▄\n █▄▄█▄▄█▄ ▄▀ ▄▀\n ▄▀ ▄ ▄ ▀ ▄▀█ \n▄█ ▀ ▀ ▀ ▀▄▀ █ █\n█ ████████ █ █ █\n█ ▀█▀▀▀▀▀▀▄▀ █ █\n ▀▀ ██████▀██▄▀ "], ["eat_2", " ▄▄ ▄▄ \n ▄▄▄ █ █▄▄▄▀ █ \n ▀▄ ▀█▀▀▄ ▀█▀▀█\n ▀▄▀▄▄▀ ▀▄▀ ▄█ \n ▄▀▄ ▄ ▄ ▄█ ▀█\n▄▀█ ▀ ▀ ▀█▄ ██ █\n█ █▄▄▄▄▄▀▄▀▄█▀ █\n ▀▄█ █▄▀██▄▀ "], ["happy", " ▄▀█ ▄▀█ \n █▀▀▄▄█▄▀▀▀█▄▄█▄\n █▄▄█▄▄█▄ ▄▀ ▄▀\n ▄▀ ▄ ▄ ▀ ▄▀█ \n▄█▄▀ ▀ ▀ ▀▄▀ █ █\n█ ██▄▄▄▄▄█ █ █ █\n█ ▀█▀▀▀▀▀▀▄▀ █ █\n ▀▀ ██████▀██▄▀ "], ["injured_1", " \n \n ▄▄ ▄▄ \n ▄▄▄ █ █▄▄▄▀ █ \n ▀▄ ██▀▀▄ ▀█▀▀█\n ▄▀▀ ▀▀ █▀█▄ ▀▄\n▄▀▄▄█ █▄ ██ ██ █\n█▄▀▄▄▄▄▄▀▄▄▄█▄▄▀"], ["injured_2", " \n \n \n ▄▀█ ▄▀█ \n █▀▀▄▄█▄▀▀▀█▄▄█▄\n █▄▀▀▄▄▀▄▄▄▀ ▄▀\n █▀ ▄ ▄ ██ ██ █\n█▄▄██▄██▄▄█▄█▄▄█"], ["sleep_1", " \n \n ▄▀█ ▄▀█ \n █▀▀▄▄█▄▀▀▀█▄▄█▄\n █ ▄▀ ▄▀▄ ▄▀ ▄▀\n █ ▀ ▀▀ ▄▀▄▄▀▀▄\n▄▀▄▄▄ ▄▄ ██ ██ █\n█▄▀▄▄▄▄▄▀▄▄▄█▄▄▀"], ["sleep_2", " \n ▄▄ ▄▄ \n ▄▄▄ █ █▄▄▄▀ █ \n ▀▄ ▀█▀▀▄ ▀█▀▀█\n ▀▄▀▄▄▀ ▀▄▀ ▄█ \n ▄▀ ▄ ▄█▄ █\n█ █▀▀ ▀▀▀██ ██ █\n█▄▀▄▄▄▄▄▀▄▄▄█▄▄▀"], ["walk_1", " ▄▀█ ▄▀█ \n █▀▀▄▄█▄▀▀▀█▄▄█▄\n █ ▄▀ ▄▀▄ ▄▀ ▄▀\n ▄▀ ▀▀ ▀ ▄▀█ \n █ █▄ ▄█ █ ▀█▄ █\n█ █▄ ▄▀▀█ ██ █\n▀▄▀▄▀▀▀ ▄▀▄██▀ █\n ▀▀ ▀▀ █▄▄▀ "], ["walk_2", " ▄▄ ▄▄ \n ▄▄▄ █ █▄▄▄▀ █ \n ▀▄ ▀█▀▀▄ ▀█▀▀█\n ▀▄▀▄▄▀ ▀▄▀ ▄█ \n ▄▀▄ ▄ ▄ ▄█ ▀█\n▄▀▄▀▀ ▀▀▄█▄ ██ █\n█ █▀▄▄▄▀ ▄▀▄█▀ █\n ▀▄█ █▄█▄▄▀▀ "]]], + ["manticoremon", [["angry", " \n ▄▄▀▀█▀ \n ▄▄██▀ ▀▄ ▀█▄\n▄███▄▄▄▄██▄ ▀█\n███▀▀▀ █ ▀█▀█▀▄█\n ▀▄▄▄▄█▄ ▄▄▄▀ \n ▄█▄ ▀▄ ▄█▄▄ █ \n █▄█▄█▄███▀▄█▄▀ "], ["attack", " ▄▄▄▀▀█▀ \n ▄▄██▀▀ ▀▄ █▄\n █████▀▄ ██ ▀█\n ▀█▀ ▄█ █▀▄ █\n▄▀█▀█▀██▀ ▄ █▀▄\n▄▀█ █ ▄███ ▄▄▀\n ▀▀▀██▀▀▀█ ▀█▄ █\n █▄█▄▄█ █▄█▄▀"], ["eat_1", " ▄▄▄▀▀█▀ \n ▄▄██▀▀ ▀▄ ▀█▄\n███▀▀▀▄ ██ ▀█\n▀▀▄█████ █▀▄▄ ▄█\n ████▀ ▀ █▀ \n ▄█▄▄▄▀ █▄ ▄█ \n ▀▄█ █ █▀▀█▄ █ \n ▀▄█▄█▄▀ █▄█▄▀ "], ["eat_2", " \n ▄▄▀▀█▀ ▄▄ \n ▄▄██▀ ▀▄ ██\n▄███▄▄▄▄██ █\n█████▀ █ █▀█▀▄█▀\n ▀▄▄▄▄█ ▄ ▄█ \n ▀▄█ █ ▄█▀█▄ █ \n ▀▄█▄█▄▄▀ █▄█▄▀ "], ["happy", " ▄▄▄▀▀█▀ \n ▄▄██▀▀ ▀▄ ▀█▄\n███▀▀▀▄ ██ ▀█\n▀▀▄███▀█ █▀▄▄ ▄█\n ▄█▄▄█▀ ▀ █▀ \n ▀▄█ █ █▄ ▄█ \n ▀▄█▄█▄▄█▀▀█▄ █ \n ▄███▀ █▄█▄▀ "], ["injured_1", " \n \n ▄▄▄▄▀█▀ \n ▄█▀██▀ ▄▄▀ ▀█▄\n████▄█▀█▀█▄ ▀█\n▀█▄▄▄▄▄▀ █▀▄█▀\n █▄▄ ▀▄▄ ▄▄▀▄ \n █▄█▄█▄▄█▀█▄█▄▀ "], ["injured_2", " \n \n ▄▄▄ \n ▄▄███▀ ▀▄ \n▄██▄▀█▄▄██ ▄▀█▄\n██████▀█ ▀▀▄▄ █\n ▀█▄▄▄▀▀▄▄ █▄▀█▀\n █▄█▄█▄▄█▀█▄█▄▀ "], ["sleep_1", " \n ▄▄▄▄ \n ▄▄█▀ ▄▀ ▄▄ \n ▄██▀▀ ▄▄▀ ██\n██████▀█▀█▄ █\n▀█▀ ▄▀ █▀▄█▀\n ███▀▀█ ▄ ▄▄▀▄ \n █▄█▄█▄██▀█▄█▄▀ "], ["sleep_2", " \n ▄▄▀▀█▀ \n ▄▄██▀ ▀▄ ▀█▄\n▄███▄▄▄▄██ ▀█\n███▀▀▀ █ ▀▀▄▄ ▄█\n ▀▄▄▄▄█▄ ▀ █▀ \n ▄█▄ ▀▄ ▄ ▄▄ █ \n █▄█▄█▄██▀█▄█▄▀ "], ["walk_1", " ▄▄▀▀█▀ \n ▄▄██▀ ▀▄ ▀█▄\n▄███▄▄▄▄██ ▀█\n███▀▀▀ █ █▀▄▄ ▄█\n ▀▄▄▄▄▀ ▀ █▀ \n ▄▄▄█▄ █▄ ▄█ \n ▀▄█ █ █▀▀█▄ █ \n ▀▄█▄█▄▀ █▄█▄▀ "], ["walk_2", " ▄▄▄▄ \n ▄▄█▀ ▄▀ ▄▄ \n ▄██▀▀ ▄▄▀ ██\n██████▀█▀█▄ █\n▀█▀ ▄▀ ▀ █▀▄█▀\n ████▄ ▄ ▄█ \n ▀▄█ █ ▄█▀█▄ █ \n ▀▄█▄█▄▄▀ █▄█▄▀ "]]], + ["marineangemon", [["angry", " ▄▄ ▄▄ \n █ ▀▀ █ \n █ ▄▀ █ \n ▄▀▀▀ ▀▄ \n █ ▀▄▄ ▄▄ █ \n ▀█▀█████▀█▀ \n ▀▄ ▀█▀ ▀▄ \n ▀▄▄▄▄▄▄▀ "], ["attack", " ▄▀█▄▀▀▄ \n ▄▀ ▄▀ ▀▄ \n ▀▀▀▀▄ █ \n ▄▀ █▄▄ \n ▄▀▀█▀ ▄▀ \n ▀▄██▄██ ▄▀ \n █▀█▀ █ \n ▀▄▄▄▄▀ "], ["eat_1", " ▄▀█▄▀▀▄ \n ▄▀ ▄▄ ▀▄ \n ▀▀▀▀▄ █▄▄ \n ▄▄ ▄▀ ▀ ▄▀ \n █ ▀██▄██ ▄▀ \n ▀▀████▀ ▀█ \n ▀▄▀ █ \n ▀▄▄▄▀ "], ["eat_2", " ▄▀█▄▀▀▄ \n ▄▀ ▄ ▀▄ \n ▀▄▄▄▀ ▀ █ \n ▄▄▀ ▀▄ \n▀▄ ██▄██ ▄ ▀▄ \n ▀▀████▀ █▀▀ \n ▀▄▀ █ \n ▀▄▄▄▀ "], ["happy", " ▄▀█▄▀▀▄ \n █▄ ▄▄▀▄ \n █▄ ▄ █ \n▄▀▀ ██████ ▀▀▀▄\n ▀▄ ▀▀▀▀ ▄▀ \n █ ██▄██ █▀ \n ▀▄ ▀█▀ ▄▀ \n ▀▄▄▄▄▄▀ "], ["injured_1", " ▄▄ ▄▄ \n █ ▀▀ ▀▄ \n █ ▀▄ █ \n ▄▀▀▀ ▀▄ \n ▄▀ ██▄██ ▄ █ \n █ ▄▀███▀ █ ▄▀ \n ▀█ ▀ ▀█ \n ▀▄▄▄▄▄▄▀ "], ["injured_2", " \n ▄▀█▄▀▀▄ \n ▄▀ █ \n █▀▄▄ ▀▀ █ \n ▄▀ ▀▄ \n █ ██▄██ █ █ \n ▀▄▀ ▀█▀ ▀▄▀ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["sleep_1", " \n ▄▀▀▄▀▀▄ \n ▄▀ █ \n █▀▀▄▄▀▀ █ \n ▄▀▄▄▄ ▄▄ ▄ ▀▄ \n ▀▄▄█████▀▄▄▄▀ \n ▄▀ ▀█▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["sleep_2", " ▄▄ ▄▄ \n █ ▀ ▀▄ \n ▄▀▀ ▀▀ █ \n ▄▀ ▀ ▀▄ \n █ ██▄██▄█ █ \n ▀▄▄▀███▀ ▀▄▀ \n █ ▀ █ \n ▀▄▄▄▄▄▀ "], ["walk_1", " ▄▄ ▄▄ \n █ ▀ █ \n █ █ █ █ \n ▄▄▀ ▄ ▀▄▄ \n▀▄ ▄▄ ▄▄ ▄ ▄▀\n ▀██████ █▀▀ \n ▀▄▀█▀ ▀▄ \n ▀▄▄▄▄▄▄▀ "], ["walk_2", " ▄▄ ▄▄ \n █ ▀ █ \n █ █ █ █ \n ▄▄▀ ▄▄ ▀▄▄▄ \n▀▄ ▄▄ ▄▄ ▄▀\n ▀▄█████ ▄▄▀ \n ▄▀ ▀█▀ █ \n ▀▄▄▄▄▄▄▄▀ "]]], + ["marinechimairamon", [["angry", "▄ ▄▄▄ ▄ \n██▄▀▀▀▄▄▀▀█▄ \n▄▀ ▄█ █ ▀ ▄▀▄ \n█▄▄▄▄▄▀ ▄▀▀█▄▀▄ \n▀▄█ █ ▄▀▄███ ▀▀▄\n ▀█▀ ▄▀▀▄▄▄██\n ▀▄█ ▄ ▄▄▄▀▀ \n ▀▄▄█▀▄▄█ "], ["attack", " █▄ ▄▄▄▀▀█▄█ \n ▀█▀ ▄▄▀█ ▄▀▀▄ \n █ ▀▀ ▄▀ ▄▄█ █\n █▀█▀█▀ ▄▀▄▄█▄▀\n ▄▀▀▄▀ █ █▀██ ▄\n▄▀ ▀▀▀▀█ ▄█▀▄▀█\n ▀▄▀▀▀▀▀▄ ▄ ▄▄█ \n ▀▄█▀▄▄█"], ["eat_1", "█▄ ▄▄▄▀▀█▄█ \n▀█▀ ▄▄▀█ ▄▀▀▄ \n█ ▀▀ ▄▀ ▄▄█ █ \n███▀██ ▄▀▄▄█▀▄█ \n ██▄███ █▀██ ▄\n ▀▄▀▄ ▄█▀▄▄▄██\n ▀▀▄ ▄ ▄▄▄▀▀ \n ▀▄█▀▄▄█ "], ["eat_2", "▄ ▄▄▄ ▄ \n██▄▀▀▀▄▄▀▀█▄ \n▄▀ ▄▀▄ █ ▀ ▄▀▄ \n█▄▄▄▄▄▀ ▄▀▀█▄▀▄ \n▀▄█ █ ▄▀▄███ ▀▀▄\n ▀█▀ ▄▀▀▄▄▄██\n ▀▄█ ▄ ▄▄▄▀▀ \n ▀▄▄█▀▄▄█ "], ["happy", "█▄ ▄▄▄▀▀█▄█ \n▀█▀ ▄ ▀█ ▄▀▀▄ \n█ ▀ ▀▄▀ ▄▄█ █ \n███▀██ ▄▀▄▄█▀▄█ \n ▀█▄███ █▀██ ▄\n ▀▄▀▄ ▄█▀▄▄▄██\n ▀▀▄ ▄ ▄▄▄▀▀ \n ▀▄█▀▄▄█ "], ["injured_1", " \n▄ ▄▄▄ ▄ \n██▄▀▀▀▄▄▀▀█▄ \n▄▀ █▄ █ ▀ ▄▀▄ \n█▄▄▄▄▄▀ ▄▀▀█▄▀▄ \n▀▄█ █ ▄▀▄███ ▀▀ \n ▀██ ▄▀█▄▄▄▀█\n ▀█▄▄▄▄██▄▄▄▀ "], ["injured_2", " \n \n█▄ ▄▄▄▀▀█▄█ \n▀█▀▄ ▀█ ▄▀▀▄ \n█ ▀▀ ▄▀ ▄▄█ █ \n█▀█▀█▀ ▄▀▄▄█▀▄█ \n ▀▀▄█▄▀ ▀██▀▄▄▄ \n ▄██▄▄█▄██▄▄▄▀"], ["sleep_1", " \n▄ ▄▄▄ ▄ \n██▄▀▀▀▄▄▀▀█▄ \n▄▀ ▄▄ █ ▀ ▄▀▄ \n█▄▄▄▄▄▀ ▄▀▀█▄▀▄ \n▀▄█ █ ▄▀▄███ ▀▀ \n ▀██ ▄▀█▄▄▀▀█\n ▀█▄▄▄▄██▄▄▀▀ "], ["sleep_2", " \n \n█▄ ▄▄▄▀▀█▄█ \n▀█▀ ▀█ ▄▀▀▄ \n█ ▀▀ ▄▀ ▄▄█ █ \n█▀█▀█▀ ▄▀▄▄█▀▄█ \n ▀▀▄█▄▀ ▀██▄▄▄▄ \n ▄██▄▄█▄██▄▄▄█"], ["walk_1", "█▄ ▄▄▄▀▀█▄█ \n▀█▀ ▄▄▀█ ▄▀▀▄ \n█ ▀▀ ▄▀ ▄▄█ █ \n█▀█▀█▀ ▄▀▄▄█▀▄█ \n ▀▀▄▀ █ █▀██ ▄\n ▄▀█ ▄█▀▄▄▄██\n ▀▀▄ ▄ ▄▄▄▀▀ \n ▀▄█▀▄▄█ "], ["walk_2", "▄ ▄▄▄ ▄ \n██▄▀▀▀▄▄▀▀█▄ \n▄▀ ▄█▀ █ ▀ ▄▀▄ \n█▄▄▄▄▄▀ ▄▀▀█▄▀▄ \n▀▄█ █ ▄▀▄███ ▀▀▄\n ▀█▀ ▄▀▀▄▄▄██\n ▀▄█ ▄ ▄▄▄▀▀ \n ▀▄▄█▀▄▄█ "]]], + ["marinedevimon", [["angry", " ▄▀██ \n ▄▀▄████ \n ▄█▄█▀ ███▄█ \n ████▄█████▀ \n ▄▄▀▄▀▄▀██▀▀▀▄ \n █ ▄█▀███▀ ▄▀ █ \n▄▀▄▄▀▄ ▀ ▄▀██▀▄\n▀▄▄▄▄▄▀▀▀█▄▄▄▄▄▀"], ["attack", " ▄▀██ \n ▄▀▄████ \n ▄█▄█▀ ▄██▄█ \n ▀█▀█▀█████▀ \n ██▀▀▀▄ \n ▄▄█▄█▄█ ▄▀ █ \n▄▀▄▀▄▀█▀ ▄▀██▀▄ \n█▄▄▄▄█▀▀█▄▄▄▄▄▀ "], ["eat_1", " ▄▄██████ \n ████▀▀▄███ ▄ \n ▀███████ \n ▄▄ ▄▀███▀▀ \n █ ▄▀▀▀▀▄██▀▀▀▄ \n ▀▄▄█▀███▀ ▄▀ █ \n▄▀▄▄▀▄ ▀ ▄▀██▀▄\n█▄▄▄▄▄▀▀▀█▄▄▄▄▄▀"], ["eat_2", " ▄██ \n ▄▀▄███▄ \n █▄█▄███▀███▄█ \n ▀████▄▄█████▀ \n ▀█▀▀▀ ▄██▄▄ \n ▄▄▀█▀███▀▀▄ █ \n ▀▄▄▀▄ ▀ ▀▄▄▀▄ \n ▀▄▄▄▄█▀█▄▄▄▄▄▀ "], ["happy", " ▄▀██▄ \n ▄ ▄▀█▄██▀█▄ ▄ \n ██▄█▄██▄█▄██▀ \n █ ▀▀▀▀▀▀ █▀ \n █▀█ ▄▄▄▄ █▀▀▄ \n █▄ █▄▄▄▄▀ █ █\n ▄▀█▄▀█▀ ▄▀▄▄▀▄\n ▀▄▄▄█▀▀▀▄▄▄▄▄▀"], ["injured_1", " ▄▄ \n ▄█ ██▄ \n ▄ ▄███ ████▄ ▄ \n ████▀███▀█████ \n ▀█▄▄███▄▄██▀ \n ▄█▄▄▄▄▄██ \n▄▀█ ▀▄▀█▀▄▀ █▄▀▄\n▀▄▄█▄█▄▄▄█▄█▄▄▄▀"], ["injured_2", " \n \n ▄█▀█▄ \n ▄ ▄███ ███▄ ▄ \n ████▀███▀████ \n ▀█▄▄███▄▄█▀ \n▄▀█ ▀█▄▄▄█▀ █▄▀▄\n▀▄▄█▄▄█▄█▄▄█▄▄▄▀"], ["sleep_1", " \n \n ▄███▄ \n ▄ ▄███ ███▄ ▄ \n ██████▄██████ \n ▀█▄▄███▄▄█▀ \n▄▀█ ▀█▀█▀█▀ █▄▀▄\n▀▄▄█▄▄█▄█▄▄█▄▄▄▀"], ["sleep_2", " ▄▄ \n ▄█ ██▄ \n ▄ ▄███ ████▄ ▄ \n ███▀▀███▀▀████ \n ▀██████████▀ \n ▄▀▄▄▄▄▄▀▀▄ \n▄▀█ █ ▀ █ █▄▀▄\n▀▄▄█▄▄█▄█▄▄█▄▄▄▀"], ["walk_1", " ▄▀█▄ \n ▄██ ███▄ \n █▄█▀██▄██▀██▄█ \n ▀██▄ ███ ▄███▀ \n ▄▀█▀▀▀▀▀█▀▀▄ \n █ ▄█▀███▀█▀▀ █ \n▄▀▄▄▀▄ ▀ ▄▀▀█▀▄\n▀▄▄▄▄▄█▀▀▀▄▄▄▄▄▀"], ["walk_2", " ▄▄ \n ▄█ ██▄ \n ▄ ▄███ ████▄ ▄ \n ███ ▀███▀ ████ \n ▀██▄███▄███▀ \n ▄▀▄█▄▄▄▄▄█▄ ▀▄ \n▄▀▄▄█ ▀█▀ ▀▄▄▄▀▄\n█▄▄▄▄█▄▄▄▄█▄▄▄▄█"]]], + ["mastemon", [["angry", " ▄▄▄▄▄ ▄▄▄ \n ▄▀ ██▀▀ \n █ ▄████▄██▄ \n █▀▀▀▀▀█▀██▀▄▄ \n ▀█▀▀▀▀ ▄█▄█▀▀█▄\n ▄██▀▀▀▀█ ▀▄█▄ \n█▄▀██▄▄██▄▄██▀█▄\n█▄▄█▀▀▀▀██▄▄▄█ "], ["attack", " ▄▀▀███▄██▀ \n ▄▀ ▄████▄ ▄█\n █▄▄███████▀▀▄\n▄▄ █▄▄▄▀ ███▄▄█▀\n█ ▀▀▄▄▄▄███▄ ▀▄ \n ▀▀▀▀▄ ▄████ █\n ▄▄▀▀███████▀▀▀\n █▄▄▄█▀ ██▄▄▄█ "], ["eat_1", " ▄▀▀▀▀█▄██▀ \n ▄▀ ▄██▄ ▄▄ \n █▄▄▄▄█▀████▀▀▀ \n █▄▄▄▄▄█▀█▀▄██▄ \n ▄█▄▀▀▀▄████▄ ▀▀\n█ █▀▀▀▀███ █▄ \n ▀█▀█▄▄█████▀ ▀▀\n █▄▄█ ██▄▄▄█ "], ["eat_2", " ▄▄▄▄▄ ▄▄▄ \n ▄▀ ██▀▀ \n █ ▄████▄██▄ \n █▀▀▀▀▀█▀██▀▄▄ \n ▀█▀▀▀▀ ▄█▄█▀▀█▄\n ▄▀█▀▀▀▀█▀▀▄█▄▄ \n █▀██▄▄██▄▄██ ▀▀\n█▄▄█▀▀▀▀██▄▄▄█ "], ["happy", " ▄▀▀▀▀█▄██▀ \n ▄▀ ▄██▄ ▄▄ \n █▄▄▄▄████▀▀█▀▀ \n█▀▄▄▄▄██▀█▄ ██▄ \n▀▄▄█▀▀▀▄██▄██ ▀▀\n █▀▀▀▀███▀██▄ \n ▄▀█▄▄████▄ ▀▀\n █▄▄█ ██▄▄▄█ "], ["injured_1", " \n ▄▀▀▀▀█▄██▀ \n ▄▀ ▄██▄ ▄▄ \n █▄▄▄▄██████▀▀▀ \n █▄▄▄▄▄▀ █▀▄██▄ \n ▀▄▄▄▄▄███▀▄ ▀▀\n▄▀▀█▄ ▄█▀▀▀██▄ \n█▄▄██████▄▄▄▀ ▀▀"], ["injured_2", " \n ▄▄▄▄▄ ▄█▀ \n ▄▀ ███ ▄▄ \n█ ▄█████▀▀▀ \n█▀▀▀▀▀█▀█▀▄██▄ \n▀█▀▀▀▀ ▄███ ▄▀▀ \n▄▀▀██▀▀██▀▀▀██▄ \n█▄▄██████▄▄▄▀ ▀▀"], ["sleep_1", " ▄▄▄▄▄ \n▄▄ ▄▄▄▄▀█ █ ▀▄ \n█ ██▀ █ █ █ █\n█▀██▄ █ ▀▄██▄ █\n█▄▀▀▀▄▄▀▀▄▄▀▀███\n▀▄ ▀ ▀ ▄▀\n█ ▄ ▄█ ▄▄ █\n ▀▀▀ ▀▀ ▀▀ ▀▀ "], ["sleep_2", " ▄█▀█▀▀▄ \n ▄▄▀█ █ █ ▀▄\n█▀▄█▀ █ █ █▄ █\n█▄▀▀▀▄█▄▄▀▀▀▀▀██\n█ ▀ ▀ ▄▀\n▀▄ █\n█ ▄▀▄▄█▄ ▄▀\n ▀▀▀▀ ▀▀▀ "], ["walk_1", " ▄▀▀▀▀█▄██▀ \n ▄▀ ▄██▄ ▄▄ \n █▄▄▄▄██████▀▀▀ \n █▄▄▄▄▄▀ █▀▄██▄ \n ▀▄▄▄▄▄███▀▄ ▀▀\n ▄▀█▄ ▄█▀▀███▄ \n ▀▄▀█████▄▄█ ▀▀\n █▄▄█ ██▄▄▄█ "], ["walk_2", " ▄▄▄▄▄ ▄▄▄ \n ▄▀ ██▀▀ \n █ ▄████▄██▄ \n █▀▀▀▀▀█▀██▀▄▄ \n ▀█▀▀▀▀ ▄█▄█▀▀█▄\n ▄█▀▀▀▀███▄█▄▄ \n █▀██▄▄██ ██▀▀▀\n█▄▄█▀▀▀▀███▄▄█ "]]], + ["maycrackmon", [["angry", " ▄▀█▄▀▀█ \n ▄▀ ▀ ▄ █ \n █ ▄ ▀▄▀▀█ \n █▄▄ ▀▀ ▄█▀▄▀ \n █▀█▄▄▄▄█▀█▀▀▄ \n █ █▀▄▀█ █▀▄▀ \n ▀█▄▄▄▄▄█▀ \n █▄▄█ █▄▄█ "], ["attack", " \n ▄▀▄▀▀▀▀▄ \n ▄▀ ▀▄▀ \n ▄▀ ▄▀▀ ▄█▀▀▄ \n █▀ █▀▄▄▀ \n ▄▀▀█▀▀▀█▀▀▄ ▀▄ \n ▀▄▄▀▀▄▀▀▄▄▀▀▄▀ \n █▄▄█▄▄▄█▄▄█ "], ["eat_1", " \n ▄▀▄▀▀▀▀▄ \n ▄▀ ▀▄▀ \n ▄▀ ▄▀▀ ▄█▀▀▄ \n █▀ █▀▄▄▀ \n ▄▀▀█▀▀▀█▀▀▄ ▀▄ \n ▀▄▄▀▀▄▀▀▄▄▀▀▄▀ \n █▄▄█▄▄▄█▄▄█ "], ["eat_2", " \n ▄▀▄▀▀▀▀▄ \n ▄▀ ▀▄▀ \n ▄▀ ▄▀▀ ▄█▀▀▄ \n ███ █▀▄▄▀ \n ▄▀▀█▀▀▀█ ▀▄ ▀▄ \n ▀▄▄▀▀▄▀▀▄▄▀▀▄▀ \n █▄▄█▄▄▄█▄▄█ "], ["happy", " ▄▀█▀▀▀▀█ \n ▄▀ ▀▄▀ \n ▄▀ ▄▀▄ █▀▀▄\n ███▄ ▄█▀▄▀ \n ███▄▄▄▀▄▀ ▀▄\n ▄▀▀ █▄ ▄▄█ ▀█▄▀\n ▀▄▄█▄ ▀ ▄█▄▄▀ \n █▄▄█▀█▄▄█ "], ["injured_1", " \n ▄▄▄▀▀▀▀▄ \n ▄▀ ▀▄▀ \n ▄▀ █▄▄ ▄█▀▀▄ \n █▀ █▀▄▄▀ \n ▄▀▀█▀▀▀█ ▀▄ ▀▄ \n ▀▄▄▀▀▄▀▀▄▄▀▀▄▀ \n █▄▄█▄▄▄█▄▄█ "], ["injured_2", " \n ▄▄▄ \n ▄▄▀▀ ▄ ▀▄ \n █ ▄ ▀▄█ \n █▄▄ ▀▀▀▄█▀▀▀▄\n ▄▄███▄▄▄█▄▄▄▄▀\n █ ▀▄▄▄▄▄▄▀ █ \n ▀▄▄▄█▄█▄█▄▄▄▀ "], ["refuse", " ▄▄▄▄▄ \n ▄▀ ▀ ▄ █ \n █ ▄▄▄ ▀▄ \n █ ▄▄ ▄█▀▀▀█ \n ▀▄██▄▄▄▀▄▄▄▀ \n ▄▀█▄ ▄▄█▀▄ ▀▄ \n █ █ ▀ █ █▀▄▀ \n ▀██▄█▀▀▄██▀ "], ["sleep_1", " \n ▄▄▄▀▀▀▀▄ \n ▄▀ ▀▄▀ \n ▄▀ ▀▀▀ ▄█▀▀▄ \n █▀ █▀▄▄▀ \n ▄▀▀█▀▀▀█ ▀▄ ▀▄ \n ▀▄▄▀▀▄▀▀▄▄▀▀▄▀ \n █▄▄█▄▄▄█▄▄█ "], ["sleep_2", " \n ▄▄▄▀▀▀▀▄ \n ▄▀ ▀▄▀ \n ▄▀ ▀▀▀ ▄█▀▀▄ \n █▀ █▀▄▄▀ \n ▄▀▀█▀▀▀█ ▀▄ ▀▄ \n ▀▄▄▀▀▄▀▀▄▄▀▀▄▀ \n █▄▄█▄▄▄█▄▄█ "], ["walk_1", " ▄ ▄▄▄▄ \n ▄▀ ▀ ▄ ▄▀ \n █ ▄▄ ▀▄▄▄ \n █▄ ▀ ▄█▀ ▄▀ \n ▀▄▄▄▄▄▄▀▄▀▀▄ \n ▄▀ █▄ ▄▄▀ █▄ █ \n ▀▄▄▀ ▀ ▀▄▄▀ ▀ \n █▄▄█▀▀▀█▄▄█ "], ["walk_2", " \n ▄▀▄▀▀▀▀▄ \n ▄▀ ▀▄▀ \n ▄▀ ▄▀▀ ▄█▀▀▄ \n █▀ █▀▄▄▀ \n ▄▀▀█▀▀▀█▀▀▄ ▀▄ \n ▀▄▄▀▀▄▀▀▄▄▀▀▄▀ \n █▄▄█▄▄▄█▄▄█ "]]], + ["maycrackmon_vicious_mode", [["angry", " ▄▄▄ ▄▄▄▄ \n ▄▀▄▀▀▀▀ ▄▀ \n █ ▄ █▄▄▄ \n █▄ ▀▀▄█ ▄█ \n ▀▄▄▄▄▄▄▀▀▄█▀ \n ▄█▄▄▀▄▄▄▀██ \n▄█▄▀ ▀▄▄███▄▄\n█▄▄█▄▄▄▄█▄▄█ ▄█▀"], ["attack", " ▄▀██▄▄▀▀█▀ \n ▄▀ ▀ ▄▄▄▀ \n █▀▄▄▄▄▀▀ █▀▀█ \n ███████ ▄█▄█▀ \n█▀███▄▄██ █ \n▀▄ █▄▄▄▄▀▄█▄███▄\n ██▄ ▄████▀▀██\n █▄▄█▀▀█▄▄█ ▀ "], ["eat_1", " ▄▀██▄▄▀▀█▀ \n ▄▀ ▀ ▄▀ \n ▄▀ ▄▀▄ █▀▀█ \n ██▄▄▄ ▄▀▄█▀ \n █████ ▄███ \n▄▀▄█▄▄▄▄▀ ▀██▄ \n▀▀▄█ ▄█▄▄████\n █▄▄█▀▀█▄▄█ ▄█▀ "], ["eat_2", " ▄▄▄ ▄▄▄▄ \n ▄▀▄▀▀▀▀ ▄▀ \n █ ▄ █▄▄▄ \n █▄ ▀ ▀▄█ ▄█ \n ▀▄▄▄▄▄▄▀▀▄█▀ \n ▄▀▄▄▀▄▄▄▀▀█▄ \n█▄▄▀ ▀▄▄▄█▄ \n█▄▄█▄▄▄▄█▄▄█▀██▄"], ["happy", " ▄▀██▄▄▀▀█▀ \n ▄▀ ▀ ▄▀ \n ▄▀ ▄▀▄ █▀▀█ \n ██▄▄▄▄ ▄▀▄█▀ \n▄▀████▀ ▄█▀█ █▄\n▀▄ █▄▄▄▄█ ▄█▄███\n ██ ▄█████▀ \n █▄▄█▀▀█▄▄█ "], ["injured_1", " \n ▄▄▄ ▄▄ \n ▄▀▄▀▀▀▀ ▄▀ \n █ █▀▀█ \n █ █▄ ▄▀▄█ \n ▀█▀ ▄▄█▀▄█ \n█▀█▀▀▀ ▄▀▀▄▄ \n█▄▄█▄▄▄▄█▄▄████▄"], ["injured_2", " \n \n ▄▀██▄▄▀▀▄ \n ▄▀ ▀ ▄█▄▄ \n▄▀ ▄ █ ▄▀ \n█▄▄ ▀▀▄▀▄█▀ \n█▀▄▄▄▀▀▀▄▀▀▄██▄ \n█▄▄█▄▄▄▄█▄▄██▀▀█"], ["sleep_1", " \n \n ▄▀██▄▄▀▀█▀ \n ▄▀ ▀ ▄█▄▄ \n ▄▀ ▄▄▄ █ ▄▀ \n █▀ ▄▀▄█▀ \n█▀█▀▀▀▀▀▄▀▀█▄▄ \n█▄▄█▄▄▄▄█▄▄█▀██▄"], ["sleep_2", " \n ▄▄▄ ▄▄▄▄ \n ▄▀▄▀▀▀▀ ▄▀ \n █ █▀▀█ \n █▄ ▀▀▀▄▀▄█ \n ▀▄▄▄▄▄▄█▀▄█ █▄\n█▀▄ ▄▀▀█▄███\n█▄▄█▄▄▄▄█▄▄█▀▀▀ "], ["walk_1", " ▄▀██▄▄▀▀█▀ \n ▄▀ ▀ ▄▀ \n ▄▀ ▄██ █▀▀█ \n █▀ ▄█▀▄█▀ \n █▀▀█▀▀ ▄██ \n █ █▀ ▀▀█▀ ███▄ \n ▀▄█ █▄▄▀████\n █▄▄█▀▀█▄▄█ ▄█▀ "], ["walk_2", " ▄▄▄ ▄▄▄▄ \n ▄▀▄▀▀▀▀ ▄▀ \n █ ▄▄ █▄▄▄ \n █▄ ▀▀▀▄█ ▄█ \n ▀▄▄▄▄▄▄▀▀▄█▀▄▄ \n ▄▀▄▄▀▄▄▄█▀█ ▄██\n█▄▄▀ ▀▄ ███▀\n█▄▄█▄▄▄▄█▄██▀▀ "]]], + ["megadramon", [["angry", " \n \n \n \n \n \n \n "], ["attack", " \n \n \n \n \n \n \n "], ["eat_1", " \n \n \n \n \n \n \n "], ["eat_2", " ▄▄▄▄▄▄▄▄ ▄ \n ▄████▀██▄▄▀ ██ \n█████▄█▄█▀▄▄████\n ▀▄ ▀▀▀▄▄▄█████\n ▄▄▀█▀▀▀▄▄▄▀█ ▀█\n█ ▀▄█▄▄█ ▄█▄▄▀\n ▀▀█▄▄▄█████████\n ▀▄▄▄█▄▄█▄▄█▄▀"], ["happy", " \n \n \n \n \n \n \n "], ["injured_1", " \n \n \n \n \n \n \n "], ["injured_2", " \n \n ▄▄▄▄▄▄▄▄ ▄ \n ▄███████▄▄▀ ██ \n▄███▄▀▀██▀▄▄████\n▀█▀▀▀▀▀▀▄▄▄██▀██\n ▄█▀█▀▀█▀▀▀ ████\n▀▄▄▄▀▄▄█▄▄▄█▄█▄▀"], ["sleep_1", " \n \n \n \n \n \n \n "], ["sleep_2", " \n \n \n \n ▄ \n ▄▀▄█▄▄█▄ ▄ ▄▄ \n▄▀ █▄▄▄██▀ ████\n▀▄▄▀▄▄▄██▄▄███▄▀"], ["walk_1", " ▄▄█████▀▀█ █▄ \n▄████▀ ███▀ ▄██▄\n▀█▀▀▀███▀ ▀█████\n ▀▄▄▄▄▄▀▀▀██▀██\n ▄█ █ ▄▄▄▀ █ █\n█ █▀▀▀██ ▄███▄\n ▀▀█▀▀█▀██████▀█\n ▀█▄▄█▄▄█▄█▀ "], ["walk_2", " ▄▄▄▄▄▄▄▄ ▄ \n ▄████▀██▄▄▀ ██ \n█████▄▄██▀▄▄████\n ▀▄ ▀▀▀▄▄▄█████\n ▄▄▀█▀▀▀▄▄▄▀█ ▀█\n█ ▀▄█▄▄█ ▄█▄▄▀\n ▀▀█▄▄▄█████████\n ▀▄▄▄█▄▄█▄▄█▄▀"]]], + ["megagargomon", [["angry", " ▄▄▄▄ \n █▀▄█▄▄▄▀▄ \n ▄▄▀ ▄ ▄████ \n █ █▀ ▀▀█ █ ▀▄\n █ █▀▀▀█ ▄█▄▄▄▀\n█ ▀██▄█▄██ ███ \n ▀█▀▄█ █▀▀▀█▀ \n▄█▄▄██▄▄█▀█▄▄█▄ "], ["attack", " ▄▄▄▄ \n █▀▄█▄▄▄▀▄▀▀▀█\n ▄▀█▀ ▄▄▀▀█▀▀█ \n █ █▀ ▀▀█ █ █\n▄▀▀██▀▀██▀▀██▄█ \n▀▄▄▄█▄▄██▄▄▄█▀ \n ▄▀▄█ █▀▀▀▄ \n▄█▄▄█▀▀▀▀▀▄▄▄█▄ "], ["eat_1", " ▄▄ █▀▀▀▄ \n ▀▄▀▀▀▀▀▄█▄▄ \n ▄█▄ ▄▀▄▄█▄▄▄▀ \n █ █▄▄▄▄█ █ ▀▄\n █▄██████ ▄█ ▄▀\n█ █▄▄▄▄██ ███ \n ▀██▀█ █▀███▀ \n▄██▄▄█▀▀█▄▄██▄ "], ["eat_2", " ▄▄▄▄ \n █▀▄█▄▄▄▀▄▄▄ \n ▄▄▀ ▄ ▄█▄▄▄▀ \n █ █▀ ▀ █ █ ▀▄\n █ █▀▀▀█ ▄█▄▄▄▀\n█ ▀██▄█▄██ ███ \n ▀█▀▄█ █▀▀▀█▀ \n▄█▄▄██▄▄█▀█▄▄█▄ "], ["happy", " ▄▄ █▀▀▀▄ \n ▀▄▀▀▀▀▀▄█▄▄ \n ▄█▄ ▄▀▄▄█▄▄▄▀ \n █ ▀▄▄▄▄█ █ ▀▄\n █ █▀▀▄█ █ ▄▀\n▄▀▀███▀▀██▀▀██▄ \n▀▄▄█▀█▀▀█▀▄▄██▀ \n▄██▄▄█▀▀█▄▄██▄ "], ["injured_1", " \n ▄▄ █▀▀▀▄ \n ▀▄▀▀▀▀▀▄█▄▄ \n ▄█▄ █▄ ▄█▄▄▄▀ \n █ ▀▄▄▄▄█ █ ▀▄\n▄█ █ ▄ █▄▄█▄▄ █\n█ ▀██▀▀▀█ ▀ ▀ █ \n█▄▄▄█▄▄██▄▄▄▄▄▀ "], ["injured_2", " \n ▄▄▄▄ \n █▀▄█▄▄▄▀▄▄▄ \n ▄▀ ▄ █▄▄▄█ \n ██▀ ▀▀ █ █ ▀▄\n▄█ ▀█▀█▀█▄▄█▄▄ █\n█ ▀██▀▀▀█ ▀ ▀ █ \n█▄▄▄█▄▄██▄▄▄▄▄▀ "], ["sleep_1", " \n ▄▄▄▄ \n █▀▄█▄▄▄▀▄▄▄ \n ▄▀ ▄ ▄ █▄▄▄█ \n ██▀ ▀ █ █ ▀▄\n █ ▀█▀█▀█ █ ▄▀\n▄▀▀███▀▀██▀▀██▄ \n█▄▄███▄▄██▄▄████"], ["sleep_2", " \n ▄▄ █▀▀▀▄ \n ▀▄▀▀▀▀▀▄█▄▄ \n ▄█▄ ▀▄▀▄█▄▄▄▀ \n █ ▀▄▄▄▄█ █ ▀▄\n █ █ ▄ █ █ ▄▀\n▄▀▀███▀▀██▀▀██▄ \n█▄▄███▄▄██▄▄████"], ["walk_1", " ▄▄ █▀▀▀▄ \n ▀▄▀▀▀▀▀▄█▄▄ \n ▄█▄ ▄█▀▄█▄▄▄▀ \n █ ▀▄▄▄▄█ █ ▀▄\n █ █ ▄ █ █ ▄▀\n▄▀▀███▀▀██▀▀██▄ \n▀▄▄█▀█ █▀▄▄██▀ \n▄██▄▄█▀▀█▄▄██▄ "], ["walk_2", " ▄▄▄▄ \n █▀▄█▄▄▄▀▄▄▄ \n ▄▄▀ ▄▄▄█▄▄▄▀ \n █ █▀ ▀▀█ █ ▀▄\n █ █▀▀▀█ ▄█▄▄▄▀\n█ ▀██▄█▄██ ███ \n ▀█▀▄█ █▀▀▀█▀ \n▄█▄▄██▄▄█▀█▄▄█▄ "]]], + ["megakabuterimon_red", [["angry", "█▄█ █▄█ \n ██▄███████▄ \n ▀█████▀ ▄██▄ \n ▀█████████▄█▄ \n ▀▄█▄█▄█▀▀██▄\n ▄▀▀▄ ▄▄█▀ ██\n █▄▄█ ▄▄█▄▄█▀ \n █▄▄▄██▀▀▄▄▄▄█ "], ["attack", "█▄█ █▄█ \n ██▄███▀▀██▄ \n ▀████▄▄████ ▄██\n ▀ ▀ ▀ ▀██▄████\n ███▀▀▀▄\n ▄█▄█▄█▄█▄ ▀█▄▀\n ▀▄█▄ ▄▄█▄▄▄█ \n █▄▄██▀█▄▄▄▄▄█ "], ["eat_1", "█▄█ █▄█ \n ██▄███▀███▄ \n ▀████▄█▄███▀███\n ▀ ▀ ▀ ██▄████\n █▀█▀▀▀▄\n ▄▀▀▄▄▄▄█▀ █▄▄▀\n ▀▄▄█▄ ▄█▄▄█▄ \n █▄▄█▀▀█▄▄▄▄█ "], ["eat_2", "█▄█ █▄█ \n ██▄███████▄ \n ▀████▀▄▀███▄▄▄▄\n ▀██████▀█▀▄███\n ▄▀█▄█▄█▄▄█▀█▀▀▄\n ▀▄▄█▄ ▄▄▄▀ █ █\n ▄█▄ ▄▄█▄▄██▀ \n █▄▄██▀▀█▄▄▄▄█ "], ["happy", "█▄█ █▄█ \n ██▄███▀███▄ ▄▄\n ▀████▄█▄███▄███\n ▀ ▀ ▀ ██▀▄███\n ▄▄ █▀▀█▀▀▄\n█ ▄█▄▄▄▄█▄▄ █ █\n▀▄▄▀▄▄ ▄▄▀▄▄▄▀▀ \n █▄▄▄█▀▀▄▄▄▄▄█ "], ["injured_1", " ▄ ▄ ▄ ▄ \n ▀██ ███▄▄▄ \n █████▀▀███▄ \n █████▄▄███ \n ▄▀ ▀ ▀ ▀█▀▄ \n ▄▄▀█▀▀▀▀██▀█▀▄ \n █ █ ▀▄▀▀ █ ██\n █▄▄█▄█▄▄█▄▄▄▄█▀"], ["injured_2", " ▄ ▄ ▄ ▄ \n ▀██ ███▄▄▄ \n ██████████▄ \n ██████████ \n █▀ ██ ▀██▀▄ \n ▄▄ █▀█▀█▀█▀█▀▄ \n █ █ ▀█▀▀▀█ ██\n █▄▄█▄█▄▄█▄▄▄▄█▀"], ["sleep_1", " \n \n▄ ▄ ▄▄▄▄▄▄ \n██▀▄█▄█▄▀▄▄▄▄▀▄ \n█████████▄▀███▄█\n██████████ █████\n██████████ █████\n ▀█████████████▀"], ["sleep_2", " \n \n█▄█ ▄ ▄▀█▀▀▀▀▄ \n██▄█████▄▀███▄▀▄\n██████████ █████\n██████████ █████\n ████████▀▄█████\n ▀█████▄█████▀ "], ["walk_1", "█▄█ █▄█ \n ██▄███████▄ \n ▀█████▀ ███▄ \n ▀████████▀▄█▄ \n ▄█▄▄▄████▀██▄\n █ █▄ ▄▄▄█▀ ██\n ██▄ ▄▄▄█▄▄█▀ \n █▄▄██▀▀█▄▄▄▄█ "], ["walk_2", "█▄█ █▄█ \n ██▄███████▄ ▄▄▄\n ▀█████ ▄███▄███\n █▀█ ▀███▀▀▄██▀\n █▄ █▄▄███▄ █ █\n ▀█▄ ▄▄█▄▄█▀▀ \n ▄█▄ ▄▄▄▄█▄ \n █▄▄██▀█▄▄▄▄█ "]]], + ["megaseadramon", [["angry", "█▀▄▄ ▄▄▄▄▀▀▀█▀ \n ▀▄ ▀ ▄▄ ▀▀█▀ \n▄▀ ▀▀▀ ▀▀▀▀▄ \n▀▄███▄ ▀▀ ▀█▀▀ \n ▀▄▄▄▄▀▄ ▀█▀▀▀ \n ▄▀▄▀ █▀▀▀ \n █▀▄▀▄ ▀▀▄▀█▀▄\n ▀▄█▄█▄▄▄▄▀ ▀▀"], ["attack", "█▀▄▄ ▄▄▄▀▀▀▀█▀ \n ▀▄ ▀ ▄▄ ▀▀▀█▀ \n▄▀ ▀▀▀ ▀▀▀▄ \n█▄▀▀▀▀▄ ▀▀ ▀█▀▀ \n ▄▀ ▀█▀▀▀ \n █▀▀▀ ▀█▀▀▀ ▄▀█\n ██▀▄ ▀▀▀▀▄▀ \n ▀▄█▄█▄█▄▄▀ "], ["eat_1", "█▀▄▄ ▄▄▀▀▀▀▀█▀ \n ▀▄ ▀▄▄▄ ▀▀▀▀█▀ \n▄▀ ▀ ▀ ▀▀▀▀▄ \n█▄▀▀▀█▄ ▀▀ ▀█▀▀ \n ██ ▀█▀▀▀▄▄\n █▀▀▀ ▀█▀▀▀ █▄▀\n █▄▀▄ ▀▀▀▀▄▀ \n ▀▄█▄█▄█▄▄▀ "], ["eat_2", "▄▄ ▄▄▄▄▄ \n▀▄▀▀▄▀▀▀▀ ▄█▄▄ \n ▄▀ ▄▀▀▄ ▄▄▄▀ \n█ ▄▄▄ ▄▄▄█▄ \n▀▀▄▄▄▄▄ ▄▄▄█▄ \n ▄▀█ ▀▄▄█▄ \n █▄▀▄ ▀▄▄▄▀█▀▄\n ▀▄█▄█▄▄▄▄▄▀ ▀▀"], ["happy", "█▀▄▄ ▄▄▀▀▀▀▀█▀▀ \n ▀▄ ▀▄▄ ▀▀▀▀█▀ \n▄▀ ▀ ▀ ▀▀▀▀▄ \n█▄▀▀▀██ ▀▀ ▀█▀▀ \n ▄██ ▀█▀▀▀ \n █▀▀▀ ▀█▀▀▀ ▄▄\n ██▀▄ ▀▀▄▄▀▄▀\n ▀▄█▄█▄█▄▄▀▀ "], ["injured_1", " ▄▄▄▄▄ \n█▀▀▀▄▀▀▀▀ ▄█▄ \n █▀ ▄ ▄▄▄▀ \n█ ▀▀▀ ▄▄▄█ \n▀▄█▀▀▀▄ ▄▄▄█▄ \n ▄▀█▀ ▀▄▄▀ \n █▀▄▀ ▀▀▀█▀▄ \n ▀█▄█▄█▄█▄▀▀▀▄█"], ["injured_2", " ▄▄▄▄▄▄ \n█▀▀▀▄▀▀▀ ▄▄▄█▄ \n █▀ ▄▄▄▀ \n█ ▀▀▀ ▄▄█ \n▀▄█▀▀▀▄ ▄▄▄█▄ \n ▄▀█▀ ▀▄▄▀ \n █▀▄▀ ▀▀▀▄▄▄ \n ▀█▄█▄█▄█▄█▄▀▄█"], ["sleep_1", " \n█▀▄▄ ▄▄▄▄▀▀▀█▀ \n ▀▄ ▀ ▀▀█▀ \n▄▀ ▄▄▀ ▀▀▀▄ \n█▄▀▀ ▀▀█▀▀ \n ▀█▀█▀▄ ▀█▀██ \n █▄▀ ▀▀█▀▄▀ \n ▀▄█▄█▄▄▄▄▀ "], ["sleep_2", "▄▄ ▄▄▄▄▄ \n▀▄▀▀▄▀▀▀▀ ▄█▄▄ \n ▄▀ ▀▀▀ ▄▄▄▀ \n█ ▄▄▄▄ ▄▄▄█▄ \n▀▀▄▄▄▄▄ ▄▄▄█▄ \n ▄▀▄▀ ▀▄▄█▄▀█ \n █▀▄ ▄ ▀ █ \n ▀▄█▄█▄▄▄▀ "], ["walk_1", "█▀▄▄ ▄▄▄▄▀▀▀█▀ \n ▀▄ ▀▄▄▄ ▀▀█▀ \n▄▀ ▀ ▀ ▀▀▀▀▄ \n█▄▀▀▀▀ ▀▀ ▀█▀▀ \n ▀▀██▀▄ ▀█▀▀▀▄▄\n ▄▀▄▀ █▀▀▀ █▄▀\n █▀▄▀▄ ▀▀▀▀▄▀ \n ▀▄█▄█▄█▄▄▀ "], ["walk_2", "▄▄ ▄▄▄▄▄ \n▀▄▀▀▄▀▀▀▀ ▄█▄▄ \n ▄▀ ▄▀█▀ ▄▄▄▄▀ \n█ ▄▄▄▄ ▄▄ ▄▄█▄ \n▀▀▄▄▄▄▄ ▄▄▄█▄ \n ▄▀█ ▀▄▄█▄ ▄▄\n █▄▀▄ ▀▄▄▄▀█▄▀\n ▀▄█▄█▄▄▄▄▄▀ "]]], + ["megaseadramon_x", [["angry", "█▀▀▀▄▄▀█▄▀▀▀█▀ \n ▀▄ ▀ ▄ ▀▀█▀ \n▄▀ ▀▀▀ ▀▀▀▀▄ \n▀▄███▄ ▀▀▀█▀▀ \n ▀▄▄▄▄▀▄ ▀█▀▀▀ \n ▄▀▄ █▀▀▀ \n █▀▄ ▄ ▀▀▄▀█▀▄\n ▀▄█▄█▄█▄▄▀ ▀▀"], ["attack", "█▀▀▀▄▄▀█▄▀▀▀█▀ \n ▀▄ ▀ ▄▄ ▀▀█▀ \n▄▀ ▀▀▀ ▀▀▀▄ \n█▄▀▀▀▀▄ ▀▀█▀▀ \n ▄▀ ▀█▀▀▀ \n █▀▀▀ ▀█▀▀▀ ▄▀█\n ██▀▄ ▀▀▀▀▄▀ \n ▀▄█▄█▄█▄▄▀ "], ["eat_1", "█▀▀▀▄█▀▄▀▀▀▀█▀ \n ▀▄ ▀ ▄▄ ▀▀█▀ \n▄▀ ▀▀ ▀▀▀▀▄ \n█▄▀▀▀█▄ ▀▀▀█▀▀ \n ██ ▀█▀▀▀▄▄\n █▀▀▀ ▀█▀▀▀ █▄▀\n █▀▄ ▄ ▀▀▀▀▄▀ \n ▀█▄█▄█▄█▄▀ "], ["eat_2", "▄▄▄▄ ▄▄ ▄▄▄▄▄ \n▀▄ █▀ ▀▀ ▄█▄▄ \n ▄▀ ▄▀▀▄ ▄▄▄▀ \n█ ▄▄▄▄ ▄▄▄█▄ \n▀▀▄▄▄▄▄ ▄▄▄█▄ \n ▄▀ ▀▄▄█▄ \n █▄▀ ▀▄▄▄▀█▀▄\n ▀▄█▄█▄█▄▄▄▀ ▀▀"], ["happy", "█▀▀▄▄▀█▄▀▀▀▀█▀▀ \n ▀▄ ▀▄▄ ▀▀█▀ \n▄▀ ▀ ▀ ▀▀▀▀▄ \n█▄▀▀▀██ ▀▀▀█▀▀ \n ▄██ ▀█▀▀▀ \n █▀▀▀ ▀█▀▀▀ ▄▄\n ██▀▄ ▀▀▄▄▀▄▀\n ▀▄█▄█▄█▄▄▀▀ "], ["injured_1", "▄▄▄▄ ▄▄ ▄▄▄▄▄ \n▀▄ █▀ ▀▀ ▄█▄ \n ▄▀ ▄ ▄▄▄▀ \n█ ▀▀▀ ▄▄▄█ \n▀▄█▀▀▀▄ ▄▄▄█▄ \n ▄▀█▀ ▀▄▄▀ \n █▀▄ ▀▀▀█▀▄ \n ▀█▄█▄█▄█▄▀▀▀▄█"], ["injured_2", " \n█▀▀▀▄▄▀█▄▀▀▀█▀ \n ▀▄ ▀ ▀▀█ \n▄▀ █▄▄ ▀▀▀▄ \n█ ▄▄▄▄ ▀▀█▀ \n ▀█▄▄▄▀▄ ▀█▀▀▀ \n █▄▀ ▀▀▀█▀▄ \n ▀▄█▄█▄█▄█▄▀▀▀▄█"], ["sleep_1", " \n█▀▀▀▄▄▀█▄▀▀▀█▀ \n ▀▄ ▀ ▀▀█▀ \n▄▀ ▄▄▄ ▀▀▀▄ \n█▄▀▀ ▀▀█▀▀ \n ▀█▀█▀▄ ▀█▀██ \n █▄▀ ▀▀█▀▄▀ \n ▀▄█▄█▄▄▄▄▀ "], ["sleep_2", "▄▄▄▄ ▄▄ ▄▄▄▄▄ \n▀▄ █▀ ▀▀ ▄█▄▄ \n ▄▀ ▄▄▄ ▄▄▄▀ \n█ ▄▄▄▄ ▄▄▄█▄ \n▀▀▄▄▄▄▄ ▄▄▄█▄ \n ▄▀▀ ▀▄▄█▄▀█ \n █▀▄ ▀ █ \n ▀▄█▄█▄▄▄▀ "], ["walk_1", "█▀▀▀▄▄▀█▄▀▀▀█▀ \n ▀▄ ▀ ▄▄ ▀▀█▀ \n▄▀ ▀▀ ▀▀▀▀▄ \n█▄▀▀▀▀ ▀▀▀█▀▀ \n ▀▀▀█▀▄ ▀█▀▀▀▄▄\n ▄▀▄ █▀▀▀ █▄▀\n █▀▄ ▄ ▀▀▀▀▄▀ \n ▀▄█▄█▄█▄▀ "], ["walk_2", "▄▄▄▄ ▄▄ ▄▄▄▄▄ \n▀▄ █▀ ▀▀ ▄█▄▄ \n ▄▀ ▄█▀ ▄▄▄▄▀ \n█ ▄▄▄▄ ▄▄▄▄█▄ \n▀▀▄▄▄▄▄ ▄▄▄█▄ \n ▄▀▀ ▀▄▄█▄ ▄▄\n █▄▀ ▀▄▄▄▀█▄▀\n ▀▄█▄█▄█▄▄▄▀ "]]], + ["megidramon", [["angry", " ▄▄▄ ▄▄▄ ▄ \n ▄▄███▀███▀ █▄█ \n█████▄▄█▀█▄ ████\n▀▄▄▀ ▀ ▄▀ ██▀██\n ▄▄▀█▀▀█▄▄▄▀▄ ▀█\n█▄▀▄▀▄▄█▄ █ \n ▀██▄▄██▄▄██▄▄██\n ▀▄▄▄▄█▄█▄█▄▀ "], ["attack", " ▄▄███▄██▀▄▀▄ \n▄████▀ ███ ███ \n▀█▀█▀█▀█ █▀▄████\n ██ █▀ ██\n █▀▀▀▀▄█▄▀ █ ▀\n▄▀██▀▀██▀▄ ▄▀ ▄▄\n ▀▄█▀▀███▄█▄▄█▄█\n ▀▀▄▄▄█▄█▄█▄▀ "], ["eat_1", " ▄▄███▄██▀▄▀▄ \n▄███▀ ▄███ ███▄\n████████ █▀▄████\n ▀ ▀ ▀▄█ █▀ ██\n █▀▀▀▀▄█▄▀ █ ▀\n▄▀██▀▀██▀▄ ▄▀ ▄▄\n ▀▄█▀▀███▄█▄▄█▄█\n ▀▀▄▄▄█▄█▄█▄▀ "], ["eat_2", " ▄▄▄ ▄▄▄ ▄ \n ▄▄██▀████▀ █▄█ \n████▄█▄█▀█▄ ████\n▀▄▄▀ ▀ ▄▀ ██▀██\n ▄▄▀█▀▀█▄▄▄▀▄ ▀█\n█▄▀▄▀▄▄█▄ █ \n ▀██▄▄██▄▄██▄▄██\n ▀▄▄▄▄█▄█▄█▄▀ "], ["happy", " ▄▄███▄██▀▄▀▄ \n▄███▀▄▀███ ███▄\n██████████▀▄████\n ▀ ▀ ▀▄█ █▀ ██\n █▀▀▀▀▄█▄▀ █ ▀\n▄▀██▀▀██▀▄ ▄▀ ▄▄\n ▀▄█▀▀███▄█▄▄█▄█\n ▀▀▄▄▄█▄█▄█▄▀ "], ["injured_1", " ▄▄▄ ▄▄▄ ▄ \n ▄▄█▀█████▀ █▄█ \n████▄▄██▀█▄ ████\n▀▄▄▀ ▀ ▄▀ ██▀██\n ▄▄▀█▀▀█▄▄▄▀▄ ▀█\n█▄▀▄▀▄▄█▄ █ \n ▀██▄▄██▄▄██▄▄██\n ▀▄▄▄▄█▄█▄█▄▀ "], ["injured_2", " \n ▄▄███▄██▀ ▄ \n▄███ ▀████ █▄█ \n█▀▀█▀█▀▀ █▀▄████\n ▀▀▄▄▄▄▄▀ █▀▀██\n▄▀█ █ █▀▀▀ █ ▀█\n▀███▄▄██▄▄██▄▄▄ \n ▀▄▄▄▄▄▄█▄█▄█▄█"], ["sleep_1", " ▄▄▄ ▄▄▄ ▄ \n ▄▄███████▀ █▄█ \n████▄▄██▀█▄ ████\n▀▄▄▀ ▀ ▄▀ ██▀██\n ▄▄▀█▀▀█▄▄▄▀▄ ▀█\n█▄▀▄▀▄▄█▄ █ \n ▀██▄▄██▄▄██▄▄██\n ▀▄▄▄▄█▄█▄█▄▀ "], ["sleep_2", " ▄▄███▄██▀▄▀▄ \n▄███▀▀████ ███▄\n█▀▀█▀█▀▀ █▀▄████\n ▀▀▄▄▄▄▄▀ █▀ ██\n █ █ ██▄▀ █ ▀\n▄▀██ ▀██▀▄ ▄▀ ▄▄\n ▀▄█▀▀███▄█▄▄█▄█\n ▀▀▄▄▄█▄█▄█▄▀ "], ["walk_1", " ▄▄███▄██▀▄▀▄ \n▄███▀ ▄███ ███▄\n█▀▀█▀█▀▀ █▀▄████\n ▀▀▄▄▄▄▄▀ █▀ ██\n █ █ ██▄▀ █ ▀\n▄▀██ ▀██▀▄ ▄▀ ▄▄\n ▀▄█▀▀███▄█▄▄█▄█\n ▀▀▄▄▄█▄█▄█▄▀ "], ["walk_2", " ▄▄▄ ▄▄▄ ▄ \n ▄▄██▀▀███▀ █▄█ \n████▄▄██▀█▄ ████\n▀▄▄▀ ▀ ▄▀ ██▀██\n ▄▄▀█▀▀█▄▄▄▀▄ ▀█\n█▄▀▄▀▄▄█▄ █ \n ▀██▄▄██▄▄██▄▄██\n ▀▄▄▄▄█▄█▄█▄▀ "]]], + ["megidramon_x", [["angry", " ▄▄ ▄▄\n ▄▄▀ █▀▀█ ██▀\n█▀▀▀ ▄█ ▄█▄████\n▀▄▀▄▀▄ ▄▄████▄\n ▀▄▄▄▄ ▄█▄ ▀█▀ ▄\n ▄▀█ ▄ █▀▀▀█▄▀█\n ▀▄█▀▄▀██▄▄█▄█▄█\n ▀█▄▄▄█▄█▄█▄▀ "], ["attack", " ▄▀█▄▄▄ ▄██\n▄▄▄▄▀▀▄▄▀ ▄▀▄██▄\n█ ▄ ▄▀▀ ▀▀████▀\n ▀████▄ █▀▀██▀▀\n ▄████▀▄▀▀█▄▀ ▄█\n ▀▄▄▄▄▄█ ▀▄▄█ █\n █▀▄▄████▀█▀ \n ▀█▄█▄█▄█▀ "], ["eat_1", " ▄▀█▄▄▄ ▄██\n▄▄▄▄▀▀▄▄▀ ▄▀▄██▄\n█ ▄▄▄▄ ▀▀████▀\n ▀██▀▀█ ▄▀▀███▀▀\n▄▀█▀▀▀▀█▀▀█▀█ ▄█\n▀▄ ▀█▀▄█▄ ▄██ █\n ▀▀█▀█▄███▀██▀ \n ▀█▄█▄█▄█▀ "], ["eat_2", " ▄▄ ▄▄\n ▄▄▀ █▀▀█ ██▀\n█▀▀▀ ▄▀▄ ▄█▄████\n▀▄▀▄▀▄ ▄▄████▄\n █▄▄▄▄ ▄█▄ ▀█▀ ▄\n█ █ ▄ █ ▀█ ▄▀█\n ▀▀▄▀▄ ▄███▄▄█▄█\n ██▄█▄█▄█▄█▄▀ "], ["happy", " ▄▀█▄▄▄ ▄██\n▄▄▄▄▀▀▄ ▀ ▄▀▄██▄\n█▄▄▄▄▀ ▀ █▀▀███▀\n █████▀ █▄ ██▀▀\n ▀▄▄▄▄ ▀█ ▄▀ ▄█\n ▄▀█ ▄ ▄▀ ▄█ █\n ▀▄█▀▄████▀▄█▀ \n ▀█▄█▄█▄█▀ "], ["injured_1", " \n ▄▀█▄▄▄ █▄ \n▄▄▄▄▀▀▄ ▀ ▄▀▄██▄\n█ ▄ ▄ ▀▀ ▀▀██▀██\n █ ▀ ▀ ▄█▀█ ▀\n ▀▀█▀▀ ▀█▄ █ ▄\n ▄▀█▄▀▄█▀ █▄▄▀█\n █▄▄▀███▄▄██▄█▄▀"], ["injured_2", " \n ▄▄ ▄ \n ▄▄▀ █▀▀█ ██ \n█▀▀▀ █▄ ▄█▄████\n▀▄▀▄▀▄ ▄▄▀█ ▀█\n ▀▄▄▄▄▄▄▀█ ▀▄ ▄\n ▄▄█ ▄▄█▀▀▄█▄▀█\n █▄▄████▄▄██▄█▄▀"], ["sleep_1", " \n ▄▄ ▄██\n ▄▄▀ █▀▀█▄██▄\n█▀▀▀ ▄▄ ▄█▄███▀\n▀▄▀▄▀▄ ▄▄███▀▀\n ▀▄▄▄▄ ▄█ ▀█▀ ▄█\n ▄▀▄▀▄▀▀▀▄█▄█ █\n █▄███▄▄███▄█▀ "], ["sleep_2", " \n ▄▀█▄▄▄ ▄██\n▄▄▄▄▀▀ ▀ ▄▀▄██▄\n█ ▄ ▄ ▀▀ ▀▀████▀\n █ ▀ ▀ ▄▀████▀▀\n ▀█▀▀ ▀█▄ █▀ ▄█\n ▄▀▄▀▄▀▀ █ ▄█ █\n █▄███▄▄███▄█▀ "], ["walk_1", " ▄▀█▄▄▄ ▄██\n▄▄▄▄▀▀▄▄▀ ▄▀▄██▄\n█ ▄ ▄▀▀ ▀▀████▀\n █ ▀ ▀ ▄▀█▀██▀▀\n ▀█▀▀ ▀█▄ █ ▄█\n ▄▀▀▄▀▄▀▀ █ ▄█ █\n █▄▀█▀█▄▄██▀▄█▀ \n ▀█▄█▄█▄█▀ "], ["walk_2", " ▄▄ ▄▄\n ▄▄▀ █▀▀█ ██▀\n█▀▀▀ ▄█▀ ▄█▄████\n▀▄▀▄▀▄ ▄▄████▄\n ▀▄▄▄▄ ▄█ ▀▄▀▀ ▄\n ▄█ ▄ ▄█▀▄▀ ▄▀█\n █ ▄█▄█ ▄██▄█▄█\n ▀▀██▄███▄█▄█▄▀ "]]], + ["meicoomon", [["angry", " █▄▄ ▄▀█▄ \n █ ██▄▄▄▄█▀▄█▀ \n ▄█▄▀▄▀▄ ██▀ \n █▄ ▄ █ \n▀█▀▀ ▀ ▀▀ ▄█▀▄ \n █▄███▄▄▄▀▄█▀▄ \n █▄█ ▀ ▀█ ▀█▀▄▄█\n █▄▄█▀▀▀▀█▄▄█ "], ["attack", " ██▄ ▄▀▀█ \n █▄██▄▄▄█ ▄█▀ \n ▄█▄▀▄▀▄ ██▀ \n █▄ ▄ █ \n █ ▀▄▄▄▀ ▄█▀▄ \n█▀▀▄███▄▄▄█▄▀▀▀█\n▀▄▄▄▀█ ▀█ ▀██▄▀ \n █▄▄█▀▀▀▀█▄▄█ "], ["eat_1", "▄▄▄▄ ▄▄▄▄ \n▀█ ██▄▄▄▄█▀▀▄█▀ \n ▄█▄▀▄▀▄ ██▀ \n █ ▄ ▄ █ \n▀█ ▀▄█▄▀ ▀▄█▀▄ \n █▄███▄▄▄█▄█▀▄ \n █▄█ ▀ ▀▀▄▄█▀▄▄█\n █▄▄█▀▀▀█▄▄█ "], ["eat_2", "██▀█▄ ▄▄█▀██ \n ▀▄▀█▀█▀▀▀▄▄█▀ \n █▀▀ ▀ ▀ ▀█ \n▄█▀▄ ▄▀▄ █▄ \n ▀▄ ▀ █▀▄█ \n ▄▀█▀█▀██▀▄█▀▄ \n ▀▄▀ ▀▄▄▀▄ ▀▄\n █▄▄█▀▀▀▄▄▄█ ▀▀▀"], ["happy", "▄▄▄ ▄▄▄▄ \n▀▄██▄▄▄▄█▀▀▄█▀ \n▄█▄▀▄▀▄ ██▀ \n█▄ ▄ █ \n█ ▀▄█▄▀ ▀▄█▀▄ \n█▀▄███▄▄▄█▄▀▀▄▄▄\n▀▄▄▀█ ▀█ ▀██▄▄▄▀\n █▄▄█▀▀▀▀█▄▄█ "], ["injured_1", " \n ▄▄▄ ▄▄▄ \n ▄▀▄▀█▀█▀▀ ▄█▀██\n ▀█▀▀ ▀ ▀ ▀██▀ \n ▄█▀▄ ▄ ▄▀ █▄ \n ▀█ ▀▀▄▀▄█ \n ▄█▀██▀█▀██▀██▀▄\n █▄▄█▄▄█▄▄█▄▄█▄█"], ["injured_2", " \n ▄▄▄▄ ▄▀██ \n █▀▄▀█▀█▀▀ ▄█▄█ \n ▀█▀▀ ▀ ▀ ▀█▀ \n ▄█▄█ ▄ █▄▄ █▄ \n ▀▄ ▄▄▄ ▄▀▄█ \n ▄█▀██▀█▀██▀██▀▄\n █▄▄█▄▄█▄▄█▄▄█▄█"], ["sleep_1", "▄▄▄▄ ▄▄▄▄ \n▀█ ██▄▄▄▄█▀▀▄█▀ \n ▄█▄▀▄▀▄ ██▀ \n █▄▄ ▄▄ █ \n▀█ ▀ ▄ █▀▄ \n █▄▄▄▄▄▄▄▀▄█▀▄ \n █▄█ ▀ ▀█▄█▀▀▄▄█\n █▄▄█▀▀▀█▄▄█ "], ["sleep_2", " \n██▀█▄ ▄▄█▀██ \n ▀▄▀█▀█▀▀▀▄▄█▀ \n █▀▀ ▀ ▀ ▀█ \n▄█▄▄ ▄▄ █▄ \n ▀▄ ▀ ▀▄▀▄█ \n █▄█▀█▀███▄██ ▀█\n█▄▄█▄▄▄▄█▄▄█ ▀▀ "], ["walk_1", "██▀█▄ ▄▄█▀██ \n ▀▄▀█▀█▀▀▀▄▄█▀ \n █▀▀ ▀ ▀ ▀█ \n▄█ █ ▄ █ ▄ █▄ \n ▀▄ █▀▄█ \n ▄█▀█▀██▀▄█▀▄ \n ▀▄▀ ▀▄▄▀▄ ▀▄\n █▄▄█▀▀▀█▄▄█ ▀▀▀"], ["walk_2", "▄▄▄▄ ▄▄▄▄ \n▀█ ██▄▄▄▄█▀▀▄█▀ \n ▄█▄▀▄▀▄ ██▀ \n █ ▄ ▄ █ \n▀█ ▀ ▀ ▀ ▀▄█▀▄ \n █▄▄▄▄▄▄▄▀▄█▀▄ \n █▄█ ▀ ▀█ ▀█▀▄▄█\n█▄▄█▀▀▀▀▀█▄▄█ "]]], + ["mekanorimon", [["angry", " ▄▄▄▄▄ ▄▄ \n▄▄▄▄█▄▄▄▄▄█▄█▄█▄\n█ █▄ ▄▄ ▄▄ █ █\n▄▀█▀▀█▀█▀▀██▀▀█ \n█▀█▄▄███▄▄██▀▀█ \n█▄▀ █ █ █ ▀▄█ \n ▀▄▄███ █▄▄█▄█ \n ██▄█▄█▀▀█▄█▄▄█ "], ["attack", " ▄▄█████▄▄ ▄▄ \n█▀█▄ ▄▄ ▄▄ █▀▀▀█\n▀▄█ ▄ ▄ ▄ ▄▀▄▄▄▀\n█ ▄████████▀█▄ █\n█ ▄████████ █▄ █\n▀▄▄█▀▀▀█▀▀▀▀█▄▄▀\n █▄▄▄▀█▀██▄▄ \n ██▄█▄█▀▀█▄█▄▄█ "], ["eat_1", " ▄▄█████▄▄ ▄▄ \n█▀█▄ ▄▄ ▄▄ █▀▀▀█\n▀▄█▀ ▀▀ ▀▀ ▀▄▄▄▀\n▄▀█▄█▄█▄█▄█▄█▄▄█\n█▀███▀▀█▄ ▀█▀▄ █\n█▀ █▀▀▀█▄ █ ▄▀ \n█▀▀█▄▄▄▀█▀███▄ \n▀██▄█▄█▀▀█▄█▄▄█ "], ["eat_2", " ▄▄▄▄▄ ▄▄ \n▄▄▄▄█▄▄▄▄▄█▄█▄█▄\n█ █▄ ▄▄ ▄▄ █ █\n▄▀█▀ ▀▀ ▀▀ █▀▀█ \n█▀▀▄█▄█▄█▀█▀▄▄▀ \n█▀ █ █▄▀▄ ▄▀ \n█▀█▀▀▀▀▄ ▄▄█▄▄ \n▀█▄█▄█▄▀▀█▄█▄▄█ "], ["happy", " ▄▄█████▄▄ ▄▄ \n█▀█▄ ▄▄ ▄▄ █▀▀▀█\n▀▄█▀ ▀▀ ▀▀ ▀▄▄▄▀\n▄▀█▄█▄█▄█▄█▄█▀▀▄\n█▀█████████ █▀▀█\n█▀ █▀▀▀█▀ ▀▀█ ▀█\n█▀▀█▄▄▄▀█▀█▀ ▀▀█\n▀██▄█▄█▀▀█▄█▄█▄▀"], ["injured_1", " \n ▄▀▀▀▀▀▄ ▄▄ \n▄▄█▀▀▀▀▀▀▀▀██▄█▄\n█ ██ ██ ██ █ █\n▄▀█ ▄ ▄ ▄▄▄█▀▀▀▄\n█▀▄▀▀█▀▀▀▄ ▀▄ ▄▀\n▀▄▄ ▀█▀▀ ▀ ▀▄▀ \n ████▄█▀▀██████ "], ["injured_2", " \n ▄▄▄▄▄ \n ▄▄█▄▄▄▄▄█▄▄▀█ \n█▀█▄ ▄▄ ▄▄ █▀▀▀█\n▀▄█▀ ▀▀ ▀▀ █▄▄▄▀\n█▄▀▄█▄█▄█▀▀█ █\n█ ▀ ▄█▄▄ █ █ █ \n ██▄▄█▄▄▄▄▄▄▄██ "], ["sleep_1", " \n ▄▀▀▀▀▀▄ ▄▀█ \n█▀█▀▀▀▀▀▀▀▀█▀▀▀█\n▀▄██ ██ ██ █▄▄▄▀\n█▄█ ▄ ▄ ▄▄▄▀█▄▄█\n █▀█▀▀█▀▀▀▀▄▀ █\n █▄█▄▄█▄▄███ ▀▀▄\n█▄█▄█▄█▄█▄█▀▄█▄█"], ["sleep_2", " ▄▄▄▄▄ \n ▄▄█▄▄▄▄▄█▄▄▀█ \n█▀█▄ ▄▄ ▄▄ █▀▀▀█\n▀▄▀▀ ▀▀ ▀▀ █▄▄▄▀\n█▄█▄█▄█▄███ █▄▄█\n █ █ █ ▄▀ █\n █▄█▄▄█▄▄███ ▀▀▄\n█▄█▄█▄█▄█▄█▀▄█▄█"], ["walk_1", " ▄▀▀▀▀▀▄ ▄▀█ \n▄▄▄▀▀▀▀▀▀▀▀▀▄█▄▄\n█ ██ ██ ██ █ █\n▄▀█ ▄ ▄ ▄▄▄▀█▀▀▄\n█▀▀█▀▀▀█▀ ▄▄█▀▀█\n█▀ █▄▄▄▀▄▄▄▄█ ▀█\n█▀▀█▄█▄▄█▄▄▀ ▀▀█\n▀██▄█▄█ █▄█▄█▄▀"], ["walk_2", " ▄▄▄▄▄ ▄▄ \n▄▄▄▄█▄▄▄▄▄█▄█▄█▄\n█ █▄ ▄▄ ▄▄ █ █\n▄▀█▀ ▀▀ ▀▀ ██▀▀▄\n█▀▀▄█▄█▄█▀▀ █▀▀█\n█▀ █ █ ▀▀█ ▀█\n█▀▀████ █▀█▀ ▀▀█\n▀██▄█▄█▀▀█▄█▄█▄▀"]]], + ["mephistomon_x", [["angry", "▄▄ ▄▄▄ ▄▄ \n█ ▀▀▄▄███▄▄▀▀ █ \n ▀▀█ ▄ ▀▄▄▀▀ \n ▄▄▀▀ ▀▀ ██████▄\n█ ██ ▀ ▄▄█ ████\n▀▄▄█▀▀▀▀█▄▄█▀███\n ██▄▄███ ▀█\n █▄▄▀▀▄▄▄█ "], ["attack", " ███ ▄▀█\n ▄▀▀▀▀█▀ ▄█\n █ ▄█ ▄█ ▀▄▀ \n ██ ▀▄ ▄▄▄ █▄ \n███▄▄▄▀▀█▄ ████\n▀██ ▀▄▄▄▀██▀▀██\n ▀█ █▄████ ▀\n ▀ █▄▀ ▀▄▄█ "], ["eat_1", "▄▄ ▄▄▄ ▄▄ \n█ ▀▀▄▄███▄▄▀▀ █ \n ▀▀█ ▄ ▀▄▄▀▀ \n █ ▀ ▀ ▀ ▄█ ▄▄ \n▄▀█ ████ █ ▀███\n█▄█▄▀▀▀▀▄██▀▀▀██\n▀▄███▄████▀▀▄▄▀█\n █▄▄▀▀▄▄▄█ "], ["eat_2", "▄▄ ▄▄▄ ▄▄ \n█ ▀▀▄▄███▄▄▀▀ █ \n ▀▀█ ▄ ▀▄▄▀▀ \n █▀▀ ▀ ▀ ▄▀ ▄▄ \n ▄▀█ ▀ ▄█▀▀█▄███\n█▄▄█▀▀▀▀█▄▄▄████\n █ ██▄▄███ █ ▀█\n █▄▄▀▀▄▄▄█▀ "], ["happy", "█▀▄▄ ███ ▄▄▀█ \n▀▄▄▄▀▀▀▀▀█▀ ▄▄▀ \n ▄▀▄ ▄▀▄ ▀█ \n ▄█▄▄▄▄▄ ▄▀▀▄██▄\n█▄▄█████ █▄▀████\n▄▀▄█▀▀▀▄██▄ ███\n▀▀ █▀▀█▀▀███▀ ▀\n █▄▀ ▀▀▄█ "], ["injured_1", " \n▄▄ ▄▄▄ ▄▄ \n█ ▀▀▄▄███▄▄▀▀ █ \n ▀▀█ ▀▄▄▀▀ \n █▄█ █▄ ▄▀ ██▄\n▄▀▀▄ ▄▄▀▀▀████\n▀█▀█▀▀▀▀█▄█▀▀▄▀█\n█▄███▄▄███▄▄▄█ ▀"], ["injured_2", " \n \n█▀▄▄ ███ ▄▄▀█ \n▀▄▄▄▀▀▀▀▀█▀ ▄▄▀ \n ▄▀▄ ▄ ▀█ ██▄\n ▄█▀▀ ▀▀ ▄▀▀████\n▀▄▄█▄▄▄██▄█▀▀▄▀█\n█▄▄██▄▄███▄▄▄█ ▀"], ["sleep_1", " \n \n█▀▄▄ ███ ▄▄▀█ \n▀▄▄▄▀▀▀▀▀█▀ ▄▄▀ \n ▄▀ ▀█ ▄▄ \n █▀▀ ▀▀ ▄█▄▄███\n▄█▀█▄▄▄▄█▀▀█████\n▀█▄▄█▄▄█▄▄▄▄█▄▀█"], ["sleep_2", " \n▄▄ ▄▄▄ ▄▄ \n█ ▀▀▄▄███▄▄▀▀ █ \n ▀▀█ ▀▄▄▀▀ \n █▄▄ ▄▄ ▄▀ ▄▄ \n █▄ ▄███▄███\n █▀█▀▀▀▀█▀▀█████\n █▄▄█▄▄█▄▄▄▄█▄▀█"], ["walk_1", "█▀▄▄ ███ ▄▄▀█ \n▀▄▄▄▀▀▀▀▀█▀ ▄▄▀ \n ▄█▄ ▄█▀ ▀█ \n █▄ ▄ ▄▄█▄ ██▄\n▄▀ █▄▄▄██ ▀████\n▀█▀█▄ ▄██▀▀█▀██\n ▀▄█▀▀█▀▀█▄▄▀ ▀\n █▄▀ ▀▀▄█ "], ["walk_2", "▄▄ ▄▄▄ ▄▄ \n█ ▀▀▄▄███▄▄▀▀ █ \n ▀▀█ ▄▄▀▄▄▀▀ \n █▀▀ ▀▀ ▄▀ ▄▄ \n ▄▀█ ▀ ▄█▀▀█▄███\n█▄▄█▀▀▀▀█▄▄▄████\n █ ██▄▄███ █ ▀█\n █▄▄▀▀▄▄▄█▀ "]]], + ["meramon", [["angry", " ▄ ▄▄ ▄▄ \n ▄▀▄▀ █▄▀ █ \n █▄█ ▄▀▄█\n █ █▄ ▄ █▄ █\n ▄▀█▀▀ ▀▀ ▄▀ ▄▀\n █ ▄▀▄▄▄▄▀▀ ▄▄ █\n █▀▄ █▄▄█\n █▄▄▄█▀▀▀▀▄▄▄▄█ "], ["attack", " ▄▄▀▀▀▀▀▀█▄▄ \n ▄▀ ▄█▀ ▀ ▄▀▀\n█▄▀▀▀▀▀▄ ▄▀ ▄█\n▀▄▀▄ █ █▄▀▄▀\n█ ▄▀▀▀▀▀▄▄▀ █\n▀▄▄▀▀▀▀▀ █▀ ▄▀\n ▄▀▄ █▀▀ \n█▄▄▄█▀▀▀▄▄▄▄█ "], ["eat_1", " ▄▄▀▀▀▀▀▀█▄▄ \n ▄▀ ▄▀▄ ▀ ▄▀▀\n█▄▀▀▀▀▀▄ ▄▀ ▄█\n▀▄▀▄ █ █▄▀▄▀\n█ ▄▀▀▀▀ ▄▀▀ █ \n▀▄▄▀▀▀▀▀ █ █\n ▄▀▄ █▀▀▀ \n█▄▄▄█▀▀▀▄▄▄▄█ "], ["eat_2", " ▄▀▄▀█ ▄▀█ \n ▄▀ ▀ ▀▀ █ \n █▄█ █ ▄█\n █ █▀▄ ▄▀▄ █▀ █\n ▄▀▀▄ ▄▄▀ ▄▀\n █ ▄ ▀▀▀▀ ▄▄ █\n █▀▄ █▄▄█\n █▄▄▄█▀▀▀▀▄▄▄▄█ "], ["happy", "▄ ▄▄▀▀▀█▀▀▀▄▄ \n█▀▄▀ ▀ ▀ ▀ ▀ ▄▀\n▄██▀▀▀▀▀▀█ ▄▀▄█\n█ ▀█ ▄▀ █▄ █\n▀▄▄▀▀▀▀▀▄▄▀ ▄▀ \n █▀▀▀▀▀ █ \n █ ▄ ▀▄ \n █▄▄▄█▀▀▀▀▄▄▄▄█ "], ["injured_1", " \n ▄▀▄▀█ ▄▀█ \n▄ ▄▀ ▀ ▀▀ █ ▄ \n█▀█ █▄▀█ \n▀▄█▄ █▄▄ █ █ \n █▀▄ ▄▄▀ █ \n █ ▀▀▀▀▄ ▄▀▀▄ \n█▄▄▄▀▄▄▄█▄▄▄█▄█ "], ["injured_2", " \n ▄ ▄▄ ▄▄ \n ▄▀▄▀ █▄▀ █ ▄ \n█▄█ ▄█▀█ \n█ █ ▄ █ █ \n▀▄█▀ ▀▀▀ ▄▀ ▀█ \n █ ▀▄▄▄▄▀▀▄ ▀▄ \n█▄▄▄▀▄▄▄▄▄▄▀▄▄▄█"], ["sleep_1", " ▄ ▄▄ ▄▄ \n ▄▀▄▀ █▄▀ █ \n █▄█ ▄▀▄█\n █ █ █▀ █\n ██▀ ▀▀▀ ▄▀ ▄▀\n █ ▄▀▄▄▄▄▀▀ ▀▄\n█▄▀▀ █ ▀ █ █\n▀█▄▄▄▄█▄▄▄▄▄▄█▄█"], ["sleep_2", " \n ▄▀▄▀█ ▄▀█ \n▄ ▄▀ ▀ ▀▀ █▄█ \n█▀█ █▀ █ \n█ █▄ ▄▄▄ █ ▄█ \n █▀▄ ▄▄▀ █ \n█▄▀ ▀▀█▀ ▀▀ ▄ █\n▀█▄▄▄▄█▄▄▄▄▄▄█▄█"], ["walk_1", " ▄▀▄▀█ ▄▀█ \n ▄▀ ▀ ▀▀ █ \n █▄█▄ ▄ █ ▄█\n █ █▀█ █▀ █▀ █\n ▄▀▀▄ ▄▄▀ ▄▀\n █ ▄ ▀▀▀▀ ▄▄ █\n █▀▄ █▄▄█\n █▄▄▄█▀▀▀▀▄▄▄▄█ "], ["walk_2", " ▄ ▄▄ ▄▄ \n ▄▀▄▀ █▄▀ █ \n ▄ █ ▄▀ ▄\n █▀██▄ ▄█ █▄▀█\n ▄▀█ ▀ ▀ ▄▀ ▄▀\n █ ▄▀▄▄▄▄▀▀ ▄▄ █\n █▀▄ █▄▄█\n █▄▄▄█▀▀▀▀▄▄▄▄█ "]]], + ["meramon_x", [["angry", " ▄ ▄▄▄ ▄▄ \n ██▄█████▄██▀ \n ▀█▀ ▀██▀ \n█▄▄██▄ ▄█ █▄█▄█\n▀█▀█▄ ▄█▀▀█▀▄\n █▄▀▀██▀███▄ ▄▀\n █ ██▄ ▄███▀ ▄ █\n █████▀▀█████▀▀"], ["attack", " ▄▄███▀ ▄▄\n ▄▀ ▀▀████▀\n ▄▀ ▄█ ██ \n ▄▄▄███ ██▀▄ \n█▄ ▀ ▄█▄▄▄█████ \n▄█▀ ▀█ ▄███▀ \n▀▄▄█▄▄█▀▀▄██▄ \n ▄███▀███▄ "], ["eat_1", " █▄ ▄███▄ ▄██ \n ██▀▀ ▀▀███ \n▄ █▀▄ ▄▀▄ █ ▄ ▄\n████ ▄▄ ▄████▀\n ▀▄▀▄▄▀▀▄▄█▄ ▀ █\n ▄▀█▄▀██▀███▀ ▀▄\n ▀▄███▄▄███▄▄█▄█\n ▄███▀ ▀███▄ "], ["eat_2", " ▄ ▄▄▄ ▄▄ \n ██▄█▀▀██▄██▀ \n ▀█ ▀█▀ \n█▄▄█▀▄ ▄▀▄ █▄█▄█\n▀█▀█▄ ▄█▀▀█▀▄\n █▄▀▀██▀███▄ ▄▀\n █ ██▄ ▄███▀ ▄ █\n █████▀▀█████▀▀"], ["happy", " █▄ ▄███▄ ▄██ \n ██▀▀ ▀▀███ \n█▄▄█▀▄ ▄▀▄ █▄█▄█\n████ ▄▄▄▄ ▄▀▀█▀▄\n █▄▀▄▄▀▀▄▄██▄ ▄▀\n█ ▀█▄▀██▀██▀ ▄ █\n ▀████▄▄████▀▀▀▀\n ▄███▀ ▀███▄ "], ["injured_1", " \n ▄ ▄▄▄ ▄▄ \n ██▄█▀▀██▄▄█▀ \n ▀█ ▀█▀ \n█▄ █▄█ █▄ █▄█▄█\n▀██▀▄▄ ▄▄█▄ ▀ █\n ▄▀█▄ ▀▀▄███▀▀██\n█▄▄███▄████▄▄▄█ "], ["injured_2", " \n \n █▄ ▄███▄ ██ \n ██▀▀ ▀▀███ \n█▄ █ ▄ ▄ █▄█▄█\n▀███▀▀ ▀▀▄▀ ▀ █\n ▄█▄▀▀▄▄▀██▄▀▀▄█\n█▄▄██▄▄▄███▄▄▄█ "], ["sleep_1", " \n ▄ ▄▄▄ ▄▄ \n ██▄█▀▀██▄▄█▀ \n ▀█ ▀█▀ \n█▄ █▄▄ ▄▄ █▄█▄█\n▀██▀▄▄ ▄▄█▄ ▀ █\n ▄▀█▄ ▀▀▄███▀▀██\n█▄▄███▄████▄▄▄█ "], ["sleep_2", " \n █▄ ▄███▄ ▄██ \n ██▀▀ ▀▀███ \n▄ █▄▄ ▄▄ █ ▄ ▄\n████ ▄████▀\n ▀▄▀█▄▄▄▄██▄ ▀ █\n ▄▀█▄ ▀▀▄███▀▀██\n█▄▄███▄████▄▄▄█ "], ["walk_1", " █▄ ▄███▄ ▄██ \n ██▀▀ ▀▀███ \n▄ ██▄ ▄█ █ ▄ ▄\n████ ▀ ▀ ▄████▀\n ▀▄▀█▄▄▄▄██▄ ▀ █\n ▄▀█▄ ▀▀▄███▀ ▀▄\n ▀▄███▄████▄▄█▄█\n ▄███▀ ▀███▄ "], ["walk_2", " ▄ ▄▄▄ ▄▄ \n ██▄█▀▀██▄██▀ \n ▀█▄ ▄▀█▀ \n█▄▄█▀█ █▀ █▄█▄█\n▀█▀█▄ ▄█▀▀█▀▄\n █▄▀▀██▀███▄ ▄▀\n █ ██▄ ▄███▀ ▄ █\n █████▀▀█████▀▀"]]], + ["mermaimon", [["angry", " \n ▄██▄███▄▄ \n ▄█▀▄▀▄▄▀████ \n ▀▄█ ▄▀▄▄█ \n ▀█▀ ▀▀ ▄█ \n ▄█▀█▀██▄█ █▄ \n █ █▀ ▀█ █▄█▀▀\n ▀▀███████▀ "], ["attack", " ▄██▄███▄▄ \n▄█▀▄▀▄▄▀███▄ \n▀▄█ ▄▀▄▄█▀ \n █▀▀ ▀▀ █ \n█▀█▄█▀▀██▄█ \n▀▄▄██▄▄▄▄█ █▄ \n █▄ ███ █▀▀▀\n ▀███████▀ "], ["eat_1", " ▄██▄███▄▄ \n ▄█▀▄▀▄▄▀███▄ \n ▀▄▀▄ ▄▀▄▄█▀ \n █ ▀▄▄▀ █ \n ▀▄██▄▄█▀▄ \n ▄▀█▄▀▄█▀▀█ ▄ \n ▀▄█▄ █▄▄▀ ██▄\n ▀████████▀ "], ["eat_2", " \n ▄██▄███▄▄ \n▄▀▀▄▄▀▄▄▄▄▀█▄▄ \n▀█▀ ▄ ▄ ▀▄▄▀ \n ▀▄▀ ▀ ▀ ▀▄▀ \n ██▀█▀███▄ █▄ \n █ █▀ ▀█ █▄█▀▀\n ▀▀███████▀ "], ["happy", " ▄██▄███▄▄ \n▄▀▀▄▄▀▄▄▄▄▀█▄▄ \n▀█▀ ▄ ▄ ▀▄▄▀ \n █ ▀ ▀ ▀ ▀ █ \n ▀▄▄██▄▄▄▀▄ \n ▄▀█▄▀▄█▀▀█ ▄ \n ▀▄█▄ █▄▄▀ ██▄\n ▀████████▀ "], ["injured_1", " \n ▄▄ ▄▄▄ \n ██▀█▀▀███▄▄ \n█▀▄▀ ▀▀▄▀▀█▀ \n █▄█ █▄ ▀█▀ ▄ \n ▀▄▄▄▄▄██▄ ██▄ \n █ █▀ ▀█ ██▀ \n ▀▀███████▀ "], ["injured_2", " \n \n ▄██▄███▄▄ \n▄█▀▄▀▄▄▀████ \n▀▄▀▄ ▄ ▀▄▄█ \n ▀█▀ ▀▀ ▄█ █▄ \n ██▀▀█▀▀█▄▄██▀\n █▄▀███▄▄██▀▀ "], ["sleep_1", " \n ▄▄ ▄▄▄ \n ██▀█▀▀███▄▄ \n█▀▄▀ ▀▀▄▀▀█▀ \n █▀▀ ▀▀▀█▀ ▄ \n ▀▄▄▄▄▄██▄ ██▄ \n █ █▀ ▀█ ██▀ \n ▀▀███████▀ "], ["sleep_2", " \n ▄██▄███▄▄ \n ▄█▀▄▀▄▄▀████ \n ▀▄█▄ ▄█▄▄█ \n ▀▄ ▄█ \n ▄█▀█▀██▄█ █▄ \n █ █▀ ▀█ █▄█▀▀\n ▀▀███████▀ "], ["walk_1", " ▄▄ ▄▄▄ \n ██▀█▀▀███▄ \n █▀▄▀ ▀▀▄▀▀██ \n █ █ █ ▀█▀ \n ▀▄██▄▄█▀▄ \n ▄▀█▄▀▄█▀▀█ ▄ \n ▀▄█▄ █▄▄▀ ██▄\n ▀████████▀ "], ["walk_2", " \n ▄██▄███▄▄ \n ▄█▀▄▀▄▄▀████ \n ▀▄▀▄ ▄▀▄▄█ \n ▀▄▀▄▄▀ ▄█ \n ▄█▀█▀██▄█ █▄ \n █ █▀ ▀█ █▄█▀▀\n ▀▀███████▀ "]]], + ["metaletemon", [["angry", " ▄██▀█▀▀██▄ \n▄▀▀██▀▀▀▀▀▀██▀▀▄\n█ ▀█▀███▀███▄▀ █\n▀▄ █▀▀▄▀▀▀▀█ ▄▀\n ▀▀▄▀ ▀▀ ▄███▄ \n ████████ ██ █\n ██ ███ █▀█▀▄█\n ███▄█▄██████ "], ["attack", " ▄██▀█▀▀██▄ \n▄▀▀██▀▀▀▀▀▀██▀▀▄\n█ ▀█▀███▀███▄▀ █\n▀▄ █▀▀▄▀▀▀▀█ ▄▀\n ▀▀▀████ ▄███▄ \n ▄████▀█ ██ █\n ▄█▄▄▄▄▄█▀█▀▄█\n █▄███▄██████ "], ["eat_1", " ▄█▀▀█▀█▄ \n ▄▄██▀▀▀▀▀███▄▄ \n█ ▄█▄█▀█▄███▄ █\n█ █▄▄█▄▄▄ █ █\n ▀███████▀██▀██ \n ▄▀█ ▀▀▀▀ ██▄██ \n ▀█▀███████▄▀▀ \n █▄███▄▀█▄███ "], ["eat_2", " ▄█▀▀█▀█▄ \n ▄▄██▀▀▀▀▀███▄▄ \n█ ▄█▄█▀█▄███▄ █\n█ █▄▄█▄▄▄ █ █\n █▀██▄▄▄▄██▀██▀ \n █▄█▀████▀█▄██ \n █ ████████▄ \n █▄██▄▀▀▄██▄██ "], ["happy", " ▄█▀▀█▀█▄ \n ▄▄███▀▀▀▀▀██▄▄ \n█ ▄█▄▄▀█▄▄██▄ █\n█ █▄▄█▄▄▄ █ █\n▄█▀█████████▀▀█▄\n▀█▄█▄▀▀▀▀▄█▀█▄██\n ▄▀████▀███▀▀▀ \n █▄███▀ █▄███▄ "], ["injured_1", " \n ▄██▀█▀▀██▄ \n▄▀▀█▀▀▀▀▀▀▀██▀▀▄\n█ ▀█▀ ██ ▀██▀▀ █\n▀▄ █▀▀▄▀▀▀▀█ ▄▀\n ▀█▄ ▀ ▄████▄\n █▀███████▀█▀▄█\n █▄█▄██▄█▄▄█▄██"], ["injured_2", " \n \n ▄██▀█▀▀██▄ \n▄▀▀█▀▀▀▀▀▀▀██▀▀▄\n█ ▀█████████▀▀ █\n▀▄ █▄▄▀█▄▄██ ▄▀\n █▀▄▄█▄▄▄▄▀██▀▄\n ██▄█▄██▄█▄▄█▄██"], ["sleep_1", " \n ▄▄▄▄▄▄▄▄ \n ▄▄███▄█▄▄███▄▄ \n█ ▄██▄▄▄▄▄▄█▀▄ █\n█ █▄▄▀█▄▄██▀ █\n ▀▄█ █ █▄▄▀▄\n ▄█▀██▄████ ██ █\n ██▄█▄██▄█▄▄█▄██"], ["sleep_2", " \n ▄██▀█▀▀██▄ \n▄▀▀██▀▀▀▀▀▀██▀▀▄\n█ ▀█▀▀██▀▀██▄▀ █\n▀▄ █▀▀▄▀▀▀▀█ ▄▀\n ██▄███▄▄▄███▀█\n ██▀██▄▄███ ██ █\n ██▄█▄██▄█▄▄█▄██"], ["walk_1", " ▄█▀█▀▀█▄ \n▄▀▀██▀▀▀▀▀▀██▀▀▄\n█ ▄█▀███▀███▄▄ █\n▀▄ █▀▀▄▀▀▀▀█ ▄▀\n ▄▀█▄▄▄▄▄▄▄█▀▀▄ \n█▄▄▄ █████ ▄▄▀█ \n ▀▀██▀███████▀ \n █▄██▄▀▀▄▄███ "], ["walk_2", " ▄█▀▀█▀█▄ \n ▄▄██▀▀▀▀▀▀██▄▄ \n█ ▄█▄█▀█▄███▄ █\n█ █▄▄█▄▄▄ █ █\n █▀███▀▀▀███▀▀█▄\n ▀█▀▄██████▄█▄██\n █ ████▀███▀▀▀ \n █▄███▄▀█▄███ "]]], + ["metalgarurumon", [["angry", " \n ▄▀█ ▄▀█ ▄▄\n █▄▄█▄▄▀ ▄▀█ █\n ▄▄▀ ▄ ▀▀▄█ █\n█▄▄▄▄▄█▀ ▄▀▀█ █▄\n █▄█▄█▄█▀█▄▄▀▄ █\n █▄▄▄▄▄▄▀ █▄█▄ █\n█▄▄█▄▄▄▄▄█▄█▄▄▄█"], ["attack", " ▄▀█ ▄▀█▄▀█\n ▄█▄█▄▄▀▄█ █ █\n ▄▄▀ ▄▀▀▄█ █\n█ ▄▄▄ ▄▀▀ ▄█▄▄▀▄\n ▀██████ ▄▀ ▄▀ █\n ▄▀██▀██▀█▀▀ █\n █▄▄▄▄▄▄▀ ▄▀█ █\n█▄▄█▄▄▄▄▄▀ █▄▄▄█"], ["eat_1", " ▄▀█ ▄▀█ \n █▄█▄▄█ ▄▀ \n ▄▄▀ ▄ ▀█ ▄▄\n█ ▀ ▀ █ █ █\n ▀▄██▄█▀▀▄▀▀▄▀ █\n ██▄▄█ █▄▄▀ ▀▄\n █▄▄▄▄▄▄▀ ▄█▄ █\n█▄▄█▄▄▄▄▄█▄▄▄▄▄▀"], ["eat_2", " \n ▄▀█ ▄▀█ \n █▄▀▀▀▀▄▀ █ \n▄▄▀ ▄▀▄▀▄█ █▀▀▄\n█▄▄▀▄▄▄▄ ▄█▄▄█ █\n ▀▄▄▄▄ █▄▄▀ ▀▄\n ▄▄█▄▄▄ ▄█▄ █\n█▄▄█▄▄▄▄▄█▄▄▄▄▄▀"], ["happy", " ▄▀██▄▄ ▄▀▀█ \n █▀ ▄ ▀▄ █ \n █▀ ▀ ▀ █ \n ▀██████▄▄▀▀█▄ \n▄▀████▀▀ ▀▀▄▄▀▀█\n▀▄▄█ ▀▄▄█ ▀▄█ \n ▄█ ▄█ ▄█ █\n █▄▄█▄▄█▄▄▄▄█▄▄▀"], ["injured_1", " \n \n \n █▀▄▀▀▀▀▄▀▀▀█ \n▄▄▀ ▀▄▄ █▀▀▀▀▄ \n█▄▄▄▄▄▄▄▄▀▀█ █\n▄▀▄ ▄▀ ▀██▄▄▀ █\n█▄▄██▄▄▄█▄█▄▄▄▄▀"], ["injured_2", " \n \n \n ▄▄ ▄▄▄▄ ▄▄▄▄ \n ▀▄▀ ▄ █ ▄▄▀▀▄ \n█▀ ▀▀ █▄▄ █\n█▀█▀▀█▀▀▀▄▄█▄▀ █\n█▄▄██▄▄▄█▄█▄▄▄▄▀"], ["sleep_1", " \n \n \n ▄▀██▄▄▄▄▀▀█ \n █▀ ▀▄▄▀▀▀▄ \n▄▀ ▀▀ █▀█▀ █\n██▀▀▀▀▀▀▀█▄▄█▀ █\n█▄████▄██▄█▄▄▄▄▀"], ["sleep_2", " \n \n ▄▄▄ ▄▄▄ \n █▄▀▀▀▀▄▀ ▄▀ \n ▄▀ ▄▄ ▀██▀▀▄ \n█▄▄▄▄▄▄▄▄▀ ▄▀▀ █\n▄▀▄▄▄▄ █▀█▄▀ █\n█▄█▄▄▄▄██▄█▄▄▄▄▀"], ["walk_1", " ▄▀▀█ ▄▀▀█ \n █▄▀▀▀▀█ ▄▀ \n▄▄▀ ▄█▀ ▀█ ▄▀█\n█▄▄▀▄▄▄▄▄▀▀█▄█ █\n ▀▄▄▄▄ ▀▄▄▄▀ ▀▄\n █ █ ▄ ▄▀ █\n ▄█ █ █▄▄█▄ █\n █▄█▄█▄█▄▀ █▄▄▄█"], ["walk_2", " ▄▄▄ ▄▄▄ \n █▄▀▀▀▀█▀▀ ▄▀ \n▄▄▀ ▄█▀ ▀▄▀ ▄▀█\n█▄▄▀▄▄▄▄▄▀▀▄█ ▄▀\n ▀▄▄▄▄▄▀▄▄▄▀ ▄▀ \n▄▀▄ ▄▄ ▄ █ \n█ █ █▄██▄█ ▀▀▄\n ▀▀▀▀ ▀▄█▄▄▄▀"]]], + ["metalgarurumon_x", [["angry", " ▄▄▄ \n ▄▀▀▀ ▄█▄▀█▄\n ██▀▀ ▄▀ ▀▄▄█▀██\n █▄▄▄▄▄▄ █▄▄███ \n ▀▄▄▄▄▄▀█ ▄▀ ▀█\n ▄▀ █▄█▄▄█▀▄▀▄▄█\n █▄█▀▀▄▄█▀▀▄█▀ \n █▄▄█▀ █▄▄█ "], ["attack", "▄▄▄▄▄▄▄▀▀▀▀▄▄▄ \n▀▄▄ ▄▀▀▀ ▄█▀▄\n ██▀▀▄▄█ ▀▄█▀█\n █▄▄▄▄▄ █▄██▀\n ▀▄▄▄▄▀▄█▀ ▀▄\n ▄▀▀▄█▄█▀▄▀▄▄█\n ▀█▀▄▄▀▀▄█▄ \n █▄▄▀ ▀▄▄▄█ "], ["eat_1", " ▄▄▄▀▀█ ▄▄ \n ██▀▀▀▄▄ ▄▀▀█▄██\n ▀▄▄▄▄▄ ▄▀▀█▄██\n ██▀▀█ █▀▀██▀ \n ▄█▀▀▀▄▀█▄█▀ ▀▄\n █ ▀██▄▄█▀▄▀▄▄▀\n ▀█▀▀▄▄▀▀█▄▀▀ \n █▄▄█▀ █▄▄▄█ "], ["eat_2", " ▄▄▄ \n ▄▀▀▀ ▄█▄▀█▄\n ██▀▀▄▀▄ ▀▄▄█▀██\n █▄▄▄▄▄ ▄█▄▄███▀\n ▀▄▄▄▄█▀█ ▄▀▀▄ \n ▄▀ █▄█▄▄██▄ ▄█ \n ▀▄█▀▀▄▄█▀▀▄▀▄▀ \n █▄▄█ ▀█▄▄██ "], ["happy", " ▄▄▄▀▀█ ▄▄ \n ▄▄▄▄▀▄ ▄▀██▄██\n █▀ ▀ ▀ ▄█ █ ██\n ▀█████ █▀█▄█▄█ \n ▄▀▄▄▄▄█▀▄█ ▄▀ \n ▀▄▄█▄█▄▄█▀▀▀ \n ▄▀▀▄▄▀▀█▄ \n █▄▄█▀ █▄▄▄█ "], ["injured_1", " \n ▄▄▄▀▀█ ▄▄ \n ▄▄▄▄▀▄ ▄▀▀█▄██\n █▀ ▀▀ ▄▀▀█▄██\n ▀█▀▀▀▀▄██▀███▀ \n ▄██▀█▀ █▀ ▀▄ \n ▄▀▀█▀▀█▀▄▀▄▄█ \n█▄█▄▄████▄██▄▄█ "], ["injured_2", " \n ▄▄▄ \n ▄▀▀▀ ▄█▄▀█▄ \n██▀▀ █▄ ▀▄▄█▀██ \n█▄▄▄▄▄ ▄█▄▄███▀ \n ▀▄▄▄▄█▀ █▀ ▀█ \n █▀▀█▀▀█▀▄▀▄▄█ \n█▄█▄▄████▄██▄▄█ "], ["sleep_1", " \n ▄▄▄ \n ▄▀▀▀ ▄█▄▀█▄ \n██▀▀ ▄▄ ▀▄▄█▀██ \n█▄▄▄▄▄ ▄█▄▄███ \n ▀▄▄▄▄█▀ █ ▄▀ ▀▄\n █▀▀█▀█▀▀█▀▄▀▄▄▀\n █▄▄▄██▄▄▄█▄██ "], ["sleep_2", " \n ▄▄▄▀▀█ ▄▄ \n ▄▄▄▄▀ ▄▀▀█▄██\n █▀ ▀▀ ▄▀▀█▄██\n ▀█▀▀▀▀▄███▀▀█▀ \n █▀█▀█▀ █▄▀ ▀▄\n █▀▀█▀█▀▀█▀▄▀▄▄▀\n █▄▄▄██▄▄▄█▄██ "], ["walk_1", " ▄▄▄▀▀█ ▄▄ \n ▄▄▄▄▀ ▄ ▄▀▀█▄██\n █▀ ▀▀ ▄▀▀█▄██\n ▀█▀▀▀ ▄██▀▀█▀▀ \n ▀█▀█▀ █▄▀ ▀▄ \n ▄▀ █▀▀█▀▄▀▄▄▀ \n ▀▄▀▀██▀▀▄█▀ \n █▄▄█▀ █▄▄▄█ "], ["walk_2", " ▄▄▄ \n ▄▀▀▀ ▄█▄▀█▄\n ██▀▀ ▄█ ▀▄▄█▀██\n █▄▄▄▄ ▄█▄▄███▀\n ▀▄▄▄▄█▀█ ▄▀ ▀▄\n ▄▄▀▄█▄▄█▀▄▀▄▄▀\n ▀▄▀▀▄▄█▀▀▄█ \n █▄▄█ ▀█▄▄▄█ "]]], + ["metalgreymon_vaccine", [["angry", " ▄▄▄▄▄ ▄▄▄ \n██▄▄███▀▀█████▀ \n██████▄▄███▀█ █ \n▀█▀ ▀██▀ ▀▄▀▄ █\n ▀▀█▀▀ ▄▄▄ ▀█ █\n▄▀▀█ █ █ ▄▀▄█\n▀▄▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["attack", "██▄▄▄█████▄▄███ \n██████▀ ▄████▀▄ \n██ ▀███▀▄█ ▀▄\n █ █▀▄▄█ ▀▄ █\n█▀▀▀▀▀▄▀ █▄ █ █\n ▀█▀▀▀ █ ▀▄▀▄█\n ▄█▄ ▀█▀ ▀▄▀\n█▄█▄███▀▀▀▄█▄█▄█"], ["eat_1", "██▄▄▄█████▄▄███ \n██████▄▄▄████▀▄ \n▀▀▀▀▀██████▀█ ▀▄\n ▄▀▀█▀ ▀▄▀▄ █\n█▀▀▀ ▄▀ ▄▄▄ ▀█ █\n▄▀▀█▀ █ █ ▄▀▄█\n▀▄▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["eat_2", " ▄▄▄▄▄ ▄▄▄ \n██▄▄██▀▀██████▀ \n█████▄██▄██▀█ █ \n▀█▀▀▀▀██▀ ▀▄▀▄ █\n ▀▀█▀▀ ▄▄▄ ▀█ █\n ▄▀█ █ █ ▄▀▄█\n █▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["happy", "██▄▄▄█████▄▄███ \n██████▀▄▄▀███▀▄ \n▀▀▀▀▀██████▀█ ▀▄\n ▄▀▀█▀ ▀▄▀▄ █\n█▀▀▀ ▄▀ ▄▄▄ ▀█ █\n▄▀▀█▀ █ █ ▄▀▄█\n▀▄▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["injured_1", " ▄▄▄▄▄ ▄▄▄ \n██▄▄██████████▀ \n█████▄▀▀███▀█ █ \n▀█▀▀▀▀██▀ ▀▄▀▄ █\n ▀▀█▀▀ ▀█ █\n █ █▄▄█ ▀▄█\n ▄▄▀▄ █ ▄▀▀▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["injured_2", " \n▄▄ ▄█████▄▄███ \n█████▀███████▀▄ \n██████▄▄█▀█ █ ▀▄\n ▀▄▄▄▄█▀ ▀▄█ █\n █ ▄ ▄ ▀▄█\n ▄▄▀▄ █▀█▀▀▀▄▀\n█▄█▄▄█▄▄██▄█▄█▄█"], ["sleep_1", " \n ▄▄▄▄▄ ▄▄▄ \n██▄▄██████████▀ \n██████▄▄███▀█ █ \n▀█▀▀▀▀██▀ ▀▄█ █\n▄██▀▀▀▀ ▄▀█▀▀▀▄█\n█ ▀▄ █▄▀ ▀█\n█▄▄▄█▄▄▄▄█▄▄▄▄▄█"], ["sleep_2", " \n▄▄ ▄█████▄▄███ \n██████▀▀█████▀▄ \n█████████▀█ █ ▀▄\n ▀▄▄▄▄█▀ ▀▄█ █\n▄█ █ ▄▀▀▄▀▀▀▄█\n█ ▀▀▄ ▀▄▄▀ ▀█\n█▄▄▄▄█▄▄▄█▄▄▄▄▄█"], ["walk_1", "▄▄ ▄█████▄▄███ \n█████▀▄ ▄████▀▄ \n█████████▀█ █ █ \n ▀▄▄▄▄█▀ █ █\n ▄▄▀ ▄▄▀ ▀▄█ █\n █ █ █ █ ▄█▀▄█\n ▄█▀▄ ▀▀▀█ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["walk_2", " ▄▄▄▄▄ ▄▄▄ \n██▄▄██▀▀▀█████▀ \n█████▄█▄███▀█ █ \n▀█▀▀▀▀██▀ ▀▄▀▄ █\n ▀▀█▀▀ ▄▄▄ ▀█ █\n▄▀▀█ █ █ ▄▀▄█\n▀▄▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"]]], + ["metalgreymon_vaccine_x", [["angry", " ▄▄ ▄▄▄▄▄ ▄▄ ▄\n█ █▀▀ ▄ ▄▀▀ █ ▄█\n█▀ ▀▀ ▀▀██ ▄█▀\n▀▄▀▀▀▀▀▄▀▀ ▀▄▀▄█\n ▀▀██▄▄▄▄▄▀▀▄▀ \n ▄█▄ █ ▄▀ ██▄\n █▄█ ▀▀▀▀█ █▄▀▄▀\n█▄█▄█▄▄▄▄███▄█▄█"], ["attack", "▄▀█▄▄▀▀▀▀█▄▀█ █\n█▄▀ ▄██ █▄▄▄▀ ██\n█ ▄▄▄▄▄ ▄▄▀█ █▀▄\n ▀███▀▀█ ▄█ █▀\n ▄█▀▀▀▀▀ ██ ▀█ \n█▄██▀████ ▀▄█▄██\n ▄▄▀▄ ▄ █ ▀\n█▄█▄▄█▀▀█▄█▄█▄█ "], ["eat_1", "▄▀█▄▄▀▀▀▀█▄▀█ █\n█▄▀ ▄▀▄ █▄▄▄▀ ██\n█ ▄▄▄▄▄ ▄▄▀█ █▀▄\n ▀█████▀█ ▄█ █▀\n ▄▀▄▄▄ ▄▀▀█▄ ▀█▄\n ▀▄█▀▄█▄▄▀█ ▄ ██\n ▄█▀▄ ▄▀▀▀█▀ \n█▄█▄▄█▀▀█▄█▄█▄█ "], ["eat_2", " ▄▄ ▄▄▄▄▄ ▄▄ ▄\n█ █▀▀▄ ▄▀▀ █ ▄█\n█▀ ▀ ▀ ▀▀██ ▄█▀\n▀▄▀▀▀▀▀▄▀▀ ▀▄▀▄█\n ▀▀██▄▄▄▄▄▀▀█▀ \n ▄█▄ █ ▄█▀ █▄\n █▄█ ▀▀▀▀ █▄█▄█▀\n█▄█▄█▄▄▄▄█▄█▄█▄█"], ["happy", "▄▀█▄▄▀▀▀▀█▄▀█ ▄█\n█▄▀ ▄▀▄ █▄▄▄▀▄██\n█ ▄▄▄▄▄ ▄▄█▀█▀█▄\n ▀ ▄▄▄▀▀ ▀▄ █▀\n ▀▄▄▄▄▀▀▀█ ▄█▄\n █▀▄▄█▄▄▀ ▀█▀ █\n ▄▄▀▄ ▄ █ \n█▄█▄▄█▀▀█▄█▄█▄█ "], ["injured_1", " \n▄▀█▄▄▀▀▀▀█▄▀█ \n█▄▀ █▄ █▄▄▄▀ ▄ \n█ ▄▄▄▄▄ ▄▄▀█ █▀█\n ▀▄▄▄▄ ▀ ▄█ █▄\n ▄▀▄▀█▀▀██ █ █\n █▄▄█▀▀▀█ ▄ █▀▄ \n█▄█▄██▄▄████▄█▄█"], ["injured_2", " \n ▄▄ ▄▄▄▄▄ ▄▄ \n█ █▀▀▄ ▄▀▀ █ \n█▀ ▀▀ ▀▀██ ▄█▄\n▀▄▀▀▀▀▀▄▀▀ ▀▄▀▄▀\n █▀██▄▄▄▄▄▀▀▄▀█\n █▄▄█▄█▄█▀▀ ▄▀▄▀\n█▄█▄█▄▄▄█▄█▄██▄█"], ["sleep_1", " \n ▄▄ ▄▄▄▄▄ ▄▄ \n█ █▀▀ ▄▀▀ █ \n█▀ ▀▀ ▀▀██ ▄█▄\n▀▄▀▀▀▀▀▄▀▀ ▀▄▀▄▀\n ▀███▄▄▄▄▄▀▀▄▀█\n █▀▀▄▄█▄▄█▀ █ ▀\n █▄▄▄█▄▄██▄█▄██ "], ["sleep_2", " \n▄▀█▄▄▀▀▀▀█▄▀█ \n█▄▀ ▄▄ █▄▄▄▀ \n█ ▄▄▄▄▄ ▄▄▀█ ▄█▄\n ▀▄▄▄▄ ▀ ▄█▀▄▀\n ▄▀▀█▀▀██ ▀▄▀█\n █▀▀█▀▀▀▀█ ▄ █ ▀\n █▄▄▄█▄▄█▄███▄█ "], ["walk_1", "▄▀█▄▄▀▀▀▀█▄▀█ █\n█▄▀ ▄█▀ █▄▄▄▀ ██\n█ ▄▄▄▄▄ ▄▄▀█ █▀▄\n ▀▄▄▄▄ ▀ ▄█ █▀\n ▄▄▀▀█▀▀██ █▄ \n █ █▀▄█▄█ ▄ ▄█▀█\n ▄█▀▄ ▀█▀▀ █ ▀\n█▄█▄▄█▀▀█▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄▄▄▄ ▄▄ ▄\n█ █▀▀▄▄ ▄▀▀ █ ▄█\n█▀ ▀▀ ▀▀██ ▄█▀\n▀▄▀▀▀▀▀▄▀▀ ▀▄▀▄█\n ▀▀██▄▄▄▄▄▀▀█▀ \n ▄▀█▄ █ ▄▀▀ ██▄\n █▄█ ▀▀▀█▄█▄▀▀▄▀\n█▄█▄█▄▄▄▄█▄█▄█▄█"]]], + ["metalgreymon_virus", [["angry", " ▄▄▄▄▄ ▄▄▄ \n█▀▄▄█ ▄▄ ▀▀ ▄▀ \n█▀ ▄▄ ▀▀ ▄▄▀█ █ \n▀█▀ ▀▄▄▀ ▀▄▀▄ █\n ▀▀█▀▀ ▄▄▄ ▀█ █\n▄▀▀█ █ █ ▄▀▄█\n▀▄▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["attack", "█▀▄▄▄▀▀▀▀▀▄▄▀▀█ \n█▀ ▄█▀ ▄▀▄ \n▀▀▀▀▀▄ ▄▄▀█ ▀▄\n ▄▀▀▄▀ ▀▄▀▄ █\n█▀▀▀ ▄▀ ▄▄▄ ▀█ █\n▄▀▀█▀ █ █ ▄▀▄█\n▀▄▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["eat_1", "█▀▄▄▄▀▀▀▀▀▄▄▀▀█ \n█▀ ▀▀▀ ▄▀▄ \n▀▀▀▀▀▄ ▄▄▀█ ▀▄\n ▄▀▀▄▀ ▀▄▀▄ █\n█▀▀▀ ▄▀ ▄▄▄ ▀█ █\n▄▀▀█▀ █ █ ▄▀▄█\n▀▄▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["eat_2", " ▄▄▄▄▄ ▄▄▄ \n█▀▄▄▀ ▄▄ ▀▀ ▄▀ \n█▀ ▀ ▀▄▄▀█ █ \n▀█▀▀▀▀▄▄▀ ▀▄▀▄ █\n ▀▀█▀▀ ▄▄▄ ▀█ █\n ▄▀█ █ █ ▄▀▄█\n █▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["happy", "█▀▄▄▄▀▀▀▀▀▄▄▀▀█ \n█▀ ▄▀▀▄ ▄▀▄ \n▀▀▀▀▀▄ ▄▄▀█ ▀▄\n ▄▀▀▄▀ ▀▄▀▄ █\n█▀▀▀ ▄▀ ▄▄▄ ▀█ █\n▄▀▀█▀ █ █ ▄▀▄█\n▀▄▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["injured_1", " ▄▄▄▄▄ ▄▄▄ \n█▀▄▄▀ ▀▀ ▄▀ \n█▀ ▀▄▄ ▄▄▀█ █ \n▀█▀▀▀▀▄▄▀ ▀▄▀▄ █\n ▀▀█▀▀ ▀█ █\n █ █▄▄█ ▀▄█\n ▄▄▀▄ █ ▄▀▀▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["injured_2", " \n▄▄ ▄▀▀▀▀▀▄▄▀▀█ \n█▄▀▀ ▄ ▄▄▀▄ \n█▄▄▄▄▄▀▀▄▀█ █ ▀▄\n ▀▄▄▄▄█▀ ▀▄█ █\n █ ▄ ▄ ▀▄█\n ▄▄▀▄ █▀█▀▀▀▄▀\n█▄█▄▄█▄▄██▄█▄█▄█"], ["sleep_1", " \n ▄▄▄▄▄ ▄▄▄ \n█▀▄▄█ ▀▀ ▄▀ \n█▀ ▀▀ ▄▄▀█ █ \n▀█▀▀▀▀▄▄▀ ▀▄█ █\n▄██▀▀▀▀ ▄▀█▀▀▀▄█\n█ ▀▄ █▄▀ ▀█\n█▄▄▄█▄▄▄▄█▄▄▄▄▄█"], ["sleep_2", " \n▄▄ ▄▀▀▀▀▀▄▄▀▀█ \n█▄▀▀▀ ▄▄ ▄▄▀▄ \n█▄▄▄▄▄ ▄▀█ █ ▀▄\n ▀▄▄▄▄█▀ ▀▄█ █\n▄█ █ ▄▀▀▄▀▀▀▄█\n█ ▀▀▄ ▀▄▄▀ ▀█\n█▄▄▄▄█▄▄▄█▄▄▄▄▄█"], ["walk_1", "▄▄ ▄▀▀▀▀▀▄▄▀▀█ \n█▄▀▀▀▄▀█▀ ▄▄▀▄ \n█▄▄▄▄▄ ▄▀█ █ █ \n ▀▄▄▄▄█▀ █ █\n ▄▄▀ ▄▄▀ ▀▄█ █\n █ █ █ █ ▄█▀▄█\n ▄█▀▄ ▀▀▀█ ▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["walk_2", " ▄▄▄▄▄ ▄▄▄ \n█▀▄▄█ ▄▄▄ ▀▀ ▄▀ \n█▀ ▀ ▀ ▄▄▀█ █ \n▀█▀▀▀▀▄▄▀ ▀▄▀▄ █\n ▀▀█▀▀ ▄▄▄ ▀█ █\n▄▀▀█ █ █ ▄▀▄█\n▀▄▄▀▄ ▀▀█▀ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"]]], + ["metalgreymon_virus_x", [["angry", " ▄▄▄ ▄▄▄▄▄ ▄▄ ▄\n█ ▄▀▀ ▄ ▄█ █ ▄█\n█▀ ▀▀ ▀▄▄▄▀▄█▀\n▀▄▀▀▀█▄████▄ ▀▄█\n ▀▀████▀█ ▄▀▄▀ \n ▄▀█ ▄▄ ▄█▀ █▄ \n █▄██▄▄██▄▀▄█▄█▀\n█▄█▄██▀▀▀██▄█▄▄█"], ["attack", " ▄▀▀█▄▀▀▀▀▀▄▀█\n █▄▀ ▄█ ▄▀▀ █\n █ ▄▄▄▄ ▄██▀ \n ▄▄▄█▄▄▄█▀▀████▄\n▀ ▀ ▀ ▀█ ▄█▄▀█ \n▀▄█▄█▄██▄ ▀▄█▀█▄\n ▄██▄▄▄█████▄ \n █▄█▄██▀██▄█▄▄█"], ["eat_1", "▄▀▀█▄▀▀▀▀▀▄▀█ █\n█▄▀ ▄▀▄ ▄▀▀ █ ██\n█ ▄▄▄ ▄▄██▀ █▀▄\n ▀████ ███▀▀▄ █▀\n █▀▀▀ █ █▄▀ █ \n █▀██▀▀▄█▀▄ ▄▀█▄\n ▄██████▄▀▄██▄ ▀\n█▄█▄██▀▀██▄█▄▄█ "], ["eat_2", " ▄▄▄ ▄▄▄▄▄ ▄▄ ▄\n█ ▄▀▀▄ ▄█ █ ▄█\n█▀ ▀ ▀ ▀▄▄▄▀▄█▀\n▀▄▀▀▀█▄████▄ ▀▄█\n ▀▀████▀█ ▄▀▄▀ \n ▄▀█ ▄▄ ▄█▀ █▄ \n █▄██▄▄██▄▀▄█▄█▀\n█▄█▄██▀▀▀██▄█▄▄█"], ["happy", "▄▀▀█▄▀▀▀▀▀▄▀█ █\n█▄▀ ▄▀▄ ▄▀▀ █ ██\n█ ▄▄▄▄ ▄▄███ █▀▄\n ▀████ ██████▀██\n▄▄█▀▀ ▄█ ██▀ ▀▄▀\n█ ▀██▀▀▄██▄▄▄▀█▄\n ████████████▄ ▀\n█▄█▄██▀▀██▄█▄▄█ "], ["injured_1", " \n ▄▄▄ ▄▄▄▄▄ ▄▄ \n█ ▄▀▀▄ ▄█ █ ▄█\n█▀ ▀▀ ▀ ▄▄▀██▀\n▀▄▀▀▀█▄▄███▄ ██\n ██▀▀▀▀▀██▀███▀\n █ ██▀▀▄█▀ ▄▀██\n█▄▄█████▄█▄█▄▄▄█"], ["injured_2", " \n \n▄▀▀█▄▀▀▀▀▀▄▀█ \n█▄▀ █▄ ▄▀▀ █ ▄█\n█ ▄▄▄▄ ▄▄█▀ ▀█▀\n ▀▄▄▄▀▀▀▀███▄▄██\n █▀██▀▀▄█▀ █▀█▀\n█▄▄█████▄█▄█▄▄▄█"], ["sleep_1", " \n \n▄▀▀█▄▀▀▀▀▀▄▀█ █\n█▄▀ ▄▄▄ ▄▀▀ █ ██\n█ ▄▄▄▄ ▄▄██▀ █▀▄\n ▀▄▄▄█████▀▀▄ █▀\n█▀▄█ ▄▄ ▄█▀█▀█▄ \n█▄▄██▄▄██▄▄▄▄▄█▀"], ["sleep_2", " \n ▄▄▄ ▄▄▄▄▄ ▄▄ ▄\n█ ▄▀▀ ▄█ █ ▄█\n█▀ ▀▀▀ ▀▄▄▄▀▄█▀\n▀▄▀▀▀█▄████▄ ▀▄█\n ▀▀████▀█ ▄▀▄▀ \n█▀▄█ ▄▄ ▄█▀█▀█▄ \n█▄▄██▄▄██▄▄▄▄▄█▀"], ["walk_1", "▄▀▀█▄▀▀▀▀▀▄▀█ █\n█▄▀ ▄█▀ ▄▀▀ █ ██\n█ ▄▄▄▄ ▄▄██▀ █▀▄\n ▀▄▄▄█████▀▀▄ █▀\n ▄▄▀▀▀▀ █▄▀ █ \n █ █▄▀▀▄█▀▄ ▄▀█▄\n ▄██████▄▀▄██▄ ▀\n█▄█▄██▀▀██▄█▄▄█ "], ["walk_2", " ▄▄▄ ▄▄▄▄▄ ▄▄ ▄\n█ ▄▀▀▄▄ ▄█ █ ▄█\n█▀ ▀▀ ▀▄▄▄▀▄█▀\n▀▄▀▀▀█▄████▄ ▀▄█\n ▀▀████▀█ ▄▀▄▀ \n ▄▀█ ▄▄ ▄█▀ █▄ \n █▄██▄▄██▄▀▄█▄█▀\n█▄█▄██▀▀▀██▄█▄▄█"]]], + ["metallicdramon", [["angry", " \n ▄▄▀▀▄▀▀█ \n▄▀██▀██▄▄▀ \n███▄▄█▀ ▄▀▀▄ \n ▀▄▄▄ ▄ ▄█ ▄▄\n █▀▄ █ ▄▄█ █\n ▄█▀ █ ▄▄█ \n █▄▄█▀▀█▄█▄▄▄▄█"], ["attack", " ▄▄▀▀▄▀▀█ ▄▄▄\n▄▀██▀▀█▄▄▀ ▄▀ ▄▀\n███▄▄▀▀ █ █ ▀▀█\n ▀▄ █ ▄▀ ▀█ \n █▄▄▀▄ ▀█▄▄\n ▀▄▄▄█▀▄ ▄█▀ ▄▀\n ▀▄ ▀▄▄█▄ ▀█ \n ▀▀▀ ▀▀ "], ["eat_1", " ▄▄▄▄▀▀▄▀▀█ \n█▄██▀▀█▄▄█▀ ▄▄▄▄\n█▀▀▀█▀▀ █ ▄▀ ▄▄▀\n ▀▄ █ █ ▄▄▄▀\n █▀▀ ▄ ▀ ▄▄▀ \n ▀█▀▄ ▄▄▄▀▀▀█\n ▄▀ ▄ ▀▄▀▀▀ \n █▄▄█ █▄█▄█ "], ["eat_2", " ▄▄ ▄▄▄ \n ▄▄██▄▄▀ ▄▀ \n█▄█▀▄▀█▀█ \n▀█▀▀▀▀ ▀▄ \n ▀▀█▄ ▄ ▀▄▄ \n █▄▀ █ ▄▄█▀█\n ▄▀▄▄▄▄█ ▄▄█ \n █▄▄█ █▄▄▄▄▄█"], ["happy", " ▄▄▀▀▄▀▀█ \n▄▀██▀██▄▄▀ █▀▀▀█\n███▄█▄▀ █ █ ▀▀▄\n █ ▄▀ ▀█ \n █▀▀▀▄ ▀█▀ \n ▀▀█▄▀ ▄▄▀▀▀▀▀█\n ▄▀ ▄▄ ▀▄▀▀▀ \n █▄▄█ █▄█▄█ "], ["injured_1", " \n ▄▄▀▀▄▀▀█ \n▄▀█▀███▄▄▀ \n███▄▄█▀ ▀▄▄▄ \n ▀▄▄ ▀ ▄█ \n █▀▄ ▀▄ ▄▄█ \n ▄█▀ ▄█ ▄▄█ \n █▄▄█▄█▄▄█▄▄▄▄█"], ["injured_2", " \n ▄▄ ▄▄▄ \n ▄▄██▄▄▀ ▄▀ \n█▄█ ▀██▀▀▄▄▄ \n▀█▀▀▀▀ ▀ ▄█ \n ▀▀█▀▄ ▀▄ ▄▄█ \n ▄█▀ ▄█ ▄▄█ \n █▄▄█▄█▄▄█▄▄▄▄█"], ["sleep_1", " \n ▄▄ ▄▄▄ \n ▄▄██▄▄▀ ▄▀ \n█▄█▀▀██▀▀▄▄▄ \n▀█▀▀▀▀ ▀ ▄█ \n ▀▀█▄ ▀▄ ▄▄█ \n ▄█▄▀ ▄█ ▄▄█ \n █▄▄█▄█▄▄█▄▄▄▄█"], ["sleep_2", " \n ▄▄▀▀▄▀▀█ \n▄▀█████▄▄▀ \n███▄▄█▀ ▀▄▄▄ \n ▀▄▄▄ ▀ ▄█ \n █▄ ▀▄ ▄▄█ \n ▄█▄▀ ▄█ ▄▄█ \n █▄▄█▄█▄▄█▄▄▄▄█"], ["walk_1", " ▄▄▀▀▄▀▀█ \n▄▀██▀▀█▄▄▀ █▀▀▀█\n███▄▄▀▀ █ █ ▀▀▄\n ▀▄▄▄ ▄▀ ▀█ \n █▀▄ ▀█▀ \n █▀ ▄▄▀▀▀▀▀█\n ▄▀ ▄ ▀▄▀▀▀ \n █▄▄█ █▄█▄█ "], ["walk_2", " ▄▄ ▄▄▄ \n ▄▄██▄▄▀ ▄▀ \n█▄█▀ ▄█▀█ \n▀█▀▀▀ ▀▀▄ \n ▀▀█▄ █ ▀▀▀▄▄▀█\n ▄▄█▄▀ █ ▀▀▄▀ \n ▀▄▀▄▄█▄▀▄ ▀▀▀▄\n ▀▀ ▀▀▀▀▀▀▀"]]], + ["metalmamemon", [["angry", " \n \n \n \n ▄▄ \n ▀▄▀▄ ▀▄▀ \n ▀▀▀▄ █ \n ▄▄▀▀▀▀▄▄ "], ["attack", " \n \n ▄ ▄▄▄▄▄ ▄ \n █ ▄█ █ \n ▀▀▀▀▄ █ \n █ █ \n █ █ \n ▄▄▀▀▀▀▀▄▄ "], ["eat_1", " \n \n \n \n ▄▀▀▀▀▄ \n ▀▀▄▀ █▀ \n █ █ \n ▄▄▀▀▀▀▄▄ "], ["eat_2", " \n \n \n \n \n ▄▄ ▄ \n ▄▀▄ ▀▄ \n ▄█▄▄▄▄█▄ "], ["happy", " \n \n \n \n █▄▀▀▀▀▄█ \n █▀▄▄▀█ \n █ ██ █ \n ▄▄▀▀▀▀▄▄ "], ["injured_1", " \n \n \n \n \n ▄▀▀▄ \n █▄ ▄█ \n ▄█▄▄▄▄█▄ "], ["injured_2", " \n \n \n \n \n ▄▄ \n ▄██ ██▄ \n ▄█▄▄▄▄▄▄█▄ "], ["sleep_1", " \n \n \n \n \n ▄▄ \n ▄▀▀ ▀▀▄ \n ███▄▄███ "], ["sleep_2", " \n \n \n \n \n ▄▀▀▀▀▄ \n █▄▄ ▄▄█ \n ▀▄▄▄▄▄▄▀ "], ["walk_1", " \n \n \n \n ▄▄ \n ▀▄▀ ▀▄▀ \n █▀ ▀█ \n ▄▄▀▀▀▀▄▄ "], ["walk_2", " \n \n \n \n \n ▄▀▀▄ \n ▀▀█▄ ▄█▀▀ \n █▄▄▄▄▄▄█ "]]], + ["metalphantomon", [["angry", " ▄▄▄ \n ▄█████▄▀██▄ \n ▄█▀▀▀▀████▄██▀\n ██ ▄█ ██▀▄▀ \n █▄▄▄▄▄▀▄███ \n ██▀▀█▀▄▀ ▀██ \n ▀█▄▀▄▀██▄▄█▀ \n █▄▀▄▄▀▄▀▄█ "], ["attack", " ▄▄▄▄▄▄ \n ▄▀▀▀█████ \n █ ▄█ ▀████ \n █ ▄ ▄▄█████ \n █▀▀▀▄██████\n▄ ▄█▀▀▀▄█▀███\n███▀▀▀█▄▄▀▀▄ ██\n ▀██▄ █▄▀▄▄▀▀▄▀█"], ["eat_1", " ▄████ \n ▄▀▀████▄ █ \n █▄ ▄▄▀██▄ █ \n ▀▄▄▄▄ ██▄ █ \n ▄████ █████▀▄\n ▄▀█▄▄▄▄▀██▄▄█▄▀\n██▄▀▄▀▀▄ ▀███ █ \n ▀█▄▀▄▄▀▄█▀▄▀ █ "], ["eat_2", " ▄█████ \n ▄█████▄ █ \n ▄█▀▀▀▀████▄ █ \n █ ▄ ▄ ███▄ █ \n ██▄▄▄▄▄███▀▀█▀▄\n█ █ ▀██▀ ▄████▄▀\n ▀█ █▀▀█ ▀███ █ \n ▀█▄▀▄▄▀▄█▀▄▀ █ "], ["happy", " ▄▄▄▄▄▄ ▄█\n ▄████████▄ ██\n ██▄ ▄ ▀█▀▄██\n▄▀█▀ ▀ ▀ ▀ █▀█▀▀\n▀▄█ ██▀▀█ ▄▀▄█ \n ▀█▀▄▀▀▀▀▄█▄██ \n ▄█▀ █▀▀█▀▀████ \n ▀▀██▀▄▄▀▀██▀██ "], ["injured_1", " █████▄ \n █ \n █ ▄█████▄ \n ███▀▀▀▀▀██▄ \n ▄▀█ ▄█ █▄ ██ \n █▄█▀▄▄▄▄▄████ \n ██ █▀▀█ ██ █ \n █▄▄██▄▄██▄█▄▄█▄"], ["injured_2", " ▄██▄ \n ▄█▀▀███▄\n ▄▄██▄ ▀██\n ▄███████▄ ▀\n ██▀▄ ▄ ▀███ \n ▄█▄▀▀ ▀▀ ▄███ \n▄█ ▀█▀▀▀████▀█ \n█▄▄██▄▄▄██▄█▄▄█▄"], ["sleep_1", " █████▄ \n █ \n █ ▄▄▄▄▄ \n █▄███████▄ \n ███████████ \n ██▀ ▀▀██ \n ███▄▀▀▀█▄████ \n█▀██▀▄▄▄▀▄█▀▄▀█▄"], ["sleep_2", " █████▄ \n █ \n █ ▄█████▄ \n ██████████▄ \n █▀▄▄ ▄▄▀███ \n ██▀▄ ▄ ▄███ \n ████▀▀▀██████ \n█▄▀█▀▄▄▄▀█▄▀▄██▄"], ["walk_1", " ████▄ \n █ ▄███████▄ \n █ ██▀▀ ▀▀███ \n █ ▄█ █▄ ▄█ ██▄\n█ █ ██▄▄▄▄▄▄█▀██\n▀▄██ ▀██▀ ▄▀▀ █\n █ █ █▄▀▀▄ ▀██▄█\n █ ▀██▀▄▄▀▄█▀██▀"], ["walk_2", " ▄▄▄ \n ▄███████▄▀██▄\n ██▀▀ ▀▀███▄▀█\n █ █▄ ▄█ █▀▄▀ \n ▀█▄▄▄▄▄▄▀▄██ \n ███▀▀█▀▄█ ▀█ \n ███▄▄▀▄▀▀▄▀▄██ \n ▀ ▀█▄▀▀▄▄▀▄█▀█ "]]], + ["metalpiranimon", [["angry", " ▄ ▀ ▄▄▄▄▄ \n ▄▀█▀▀█ ▄▄▄▀ ▄\n█▀▀█▀▀▀▀█▄▀▄▀▄▀█\n█ █ ▄█ █▄▀▄▀█▀█\n█▄▄█▄▄▄▄█▄ ▀█▀█\n▀█▀▀▀▀▀▄█ ▀▄▄█▀█\n ▀▀▀▀▀▀ ▀█▄▄█▄ \n ▀ █▄▄████"], ["attack", "▄ ▄▄▄▄▄▀▀▀▀█ ▀ \n▄▄█▄█▄▄█▄▀█▀▄ ▄█\n█ █ ▄ █▀▄▀▄█▄█\n█ █ ▀▀ █▀ ▀▄█▄█\n██▀█▀█▀█▀█▄ █▄█\n ███████ █▄▀▀█ ▀\n █▀ ▀ ▀▄▀ ▄▄█▄ \n ▀▀▀▀▀ █▄▄███ "], ["eat_1", "▀ ▄▄▄▄▄▀▀▀▀█ \n▄▄█▄█▄▄█▄▀█▀▄ ▄█\n█ █ ▄ █▀▄▀▄█▄█\n█ █ ▀ ▀█▀ ▀▄█▄█\n▀▀▀▀███▀█▀▄ █▄█\n █▀▀▀▀▄▀▀▄▄▀▀█ ▀\n ▀▀▀▀ ▄ ▄▄█▄▄ \n ▀ █▄▄████"], ["eat_2", " ▀ ▄▄▄▄▄ \n▀ ▄▀█▀▀█ ▄▄▄▀ ▄\n█▀▀█▀▀▀▀█▄▀▄▀▄▀█\n█ █ ▄▀▄█▄▀▄▀█▀█\n█▄▄█▄▄▄▄█▄ ▀█▀█\n▀█▄▄▄▄█▄█ ▀▄▄█▀█\n ▀█▄▄█▄ \n █▄▄████"], ["happy", "▄ ▄▄▄▄▄▀▀▀▀█ \n▄▄█▄█▄▄█▄▀█▀▄ ▄█\n█ █ ▄ █▀▄▀▄█▄█\n█ █ ▀ ▀█▀ ▀▄█▄█\n▀▀▀▀███▀█▀▄ █▄█\n ▀ ▄▀▀▄█▀▄▄▀▀█ ▀\n █▄▄█▀ ▄▄█▄▄ \n ▀ █▄▄████"], ["injured_1", " ▀ ▄ \n ▄▄▄▄▄▀▀▀▀█ \n▄▄█▄█▄▄█▄▀█▀▄ ▄█\n█ █ ▄ █▀▄▀▄█▄█\n█ █ ▀▀ █▀ ▀▄█▄█\n██▀▀▀▀█▀█▀▄ █▄█\n ▀▀▀▀▀▀▀▀▄▄███▄▀\n █▄▄███"], ["injured_2", " \n ▀ ▄▄▄ \n ▀ ▄▀▄▄▀ ▄\n ▄▀█▀▀█ █▀▄▀▄▀█\n█▀▀█▀▀▀▀█▄▀▄▀█▀█\n█ █ █▄ █▄ ▀█▀█\n█▄▄█▄▄▄▄█▄█▄▄█▀█\n▀█▄▄▄▄█▄██▄▄████"], ["sleep_1", " ▄ ▀ \n ▄▄▄▄▄▀▀▀▀█ \n▄▄█▄█▄▄█▄▀█▀▄ ▄█\n█ █ █▀▄▀▄█▄█\n█ █ ▀▀ █▀ ▀▄█▄█\n██▀▀▀▀█▀█▀▄ █▄█\n ▀▀▀▀▀▀▀▀▄▄███▄▀\n ▀ █▄▄████"], ["sleep_2", " ▄ ▄ \n ▄▄▄▄▄ \n ▄▀█▀▀█ ▄▄▄▀ ▄\n█▀▀█▀▀▀▀█▄▀▄▀▄▀█\n█ █ ▄▄ █▄▀▄▀█▀█\n█▄▄█▄▄▄▄█▄ ▀█▀█\n▀█▀▀▀▀▀▄█▄█▄▄█▀█\n ▀▀▀▀▀▀ █▄▄████"], ["walk_1", " ▄▄▄▄▄▀▀▀▀█ \n▄▄█▄█▄▄█▄▀█▀▄ ▄█\n█ █ ▄ █▀▄▀▄█▄█\n█ █ ▀▀ █▀ ▀▄█▄█\n██▀▀▀▀█▀█▀▄ █▄█\n ▀▀▀▀▀▀▀▀▄▄▀▀█ ▀\n ▄▄█▄ \n █▄▄███ "], ["walk_2", " ▄ ▀ ▄▄▄▄▄ \n ▄▀█▀▀█ ▄▄▄▀ ▄\n█▀▀█▀▀▀▀█▄▀▄▀▄▀█\n█ █ ▄█ █▄▀▄▀█▀█\n█▄▄█▄▄▄▄█▄ ▀█▀█\n▀█▄▄▄▄█▄█ ▀▄▄█▀█\n ▀█▄▄█▄ \n █▄▄████"]]], + ["metalseadramon", [["angry", "█▀▄▄ ▄▄▄▄▄▀▀▀▀█▀\n ▀▄▄█▀▀████▀▀█▀▀\n████▄▄█████▀█▀▀ \n▄█▄█▄█████▀█▀▀ \n ▄▀▀▀████▀▀ ▄ \n █▄ ███ ▄█▀▄ \n █▄▀█▀██▀▀██▀▄ \n ▀█▄█▄▄▄▀ ▀▄ "], ["attack", "█▀▄▄ ▄▄▄▄▄▀▀▀▀█▀\n ▀▄▄██▀▀███▀▀█▀▀\n████▄▄▄████▀█▀▀ \n▀ ▀ ▀████▀█▀▀ \n ▄ ▄ ▄██▀▀▀▄ ▄\n ▀▀█▀▄██ ▄▀ ▄█▀▄\n █▀▄▀████▀▀█▀▄\n ▀▄█▄█▄▄▄▀ ▀▄"], ["eat_1", "█▀▄▄ ▄▄▄▄▄▀▀▀▀█▀\n ▀▄▄█▀▀████▀▀█▀▀\n███████▄███▀█▀▀ \n ▀████▀█▀▀ \n ▄███▀▀▀▄ ▄\n ▀█▀▄███ ▄▀▄█▀▄\n █▀▄▀████▀▀█▀▄\n ▀▄█▄█▄▄▄▀ ▀▄"], ["eat_2", "█▀▄▄ ▄▄▄▄▄▀▀▀▀█▀\n ▀▄▄███████▀▀█▀▀\n█████▄▄▀███▀█▀▀ \n▀▄▄▄▄█████▀█▀▀ ▄\n ▄▀███▀▀▀▄ ▄▀▄\n █▀▄██ ▄▀ ▄█▀▄\n █▀▄▀████▀▀█▀▄\n ▀▄█▄█▄▄▄▀ "], ["happy", "▄▄▄▄ █▀▄ ▄▄▄▄▄\n▀▄▄▄███ ▀███▄▄▄▀\n ▀▄█▀▄▀██▀▄▀▄▄▀ \n▄ ██▀████▀██ ▄\n▀█▀▀█ █▀▀▀█\n ▀▄▄█▄▄▄▄█▀▄▄▀ \n ▄▀▄▀▄▀▀▄ ▄▄▀\n ▀█▄█▄█▄▄██▄▀"], ["injured_1", "▄▄ ▄▄▄▄▄▄\n▀▄▀▀▄█████▄▄▄▄█▄\n▄▄███▀█████▄▄█▄ \n█▀▀▀█▄▄▄███▄█▄ \n ▀▀▀█▀████▄▀ \n ▄▀▄█▀▀▀█ ▄ \n █▀▄█ ▄█▄▄▄█▄▀▄\n ▀█▄████▄▄█▀▄▀▄"], ["injured_2", " \n█▀▄▄ ▄▄▄▄▄▀▀▀▀█▀\n ▀▄▄███████▀▀█▀▀\n████▄▀▀▀███▀█▀▀ \n▀▄▄███████▀█▀▀ \n ▄▀▄████▀ ▄ \n █▄█▄ █▄▄▄█▀▄▀\n ▀▄███▄██▄█▀▀▄▀"], ["sleep_1", " ▄ ▀ \n█▀▄▄ ▄▄▄▄▄▀▀▀▀█▀\n ▀▄▄███████▀▀█▀▀\n████▀▀▀████▀█▀▀ \n▀▄▄███████▀█▀▀ \n ▄▀▄█████ ▄▀▄ \n █▄▀██ ▄█▄█▀▄▀\n ▀▄█▄█▄█▄▄█▀▀▄▀"], ["sleep_2", "▄▄ ▄▄▄▄▄▄\n▀▄▀▀▄█████▄▄▄▄█▄\n▄▄███▀▀▀███▄▄█▄ \n█▀▀▀███████▄█▄ \n ▀▀▀█▀████▄▀ ▄\n ▄▀▄██ ▄▀ ▄▀▄\n █▀▄▀█▄█▄▄▄█▄▀▄\n ▀█▄█▄██▄▄▄▀▀▀ "], ["walk_1", "█▀▄▄ ▄▄▄▄▄▀▀▀▀█▀\n ▀▄▄█▀▀████▀▀█▀▀\n████▄▄█████▀█▀▀ \n▀▄▄▄▄█████▀█▀▀ ▄\n ▄▀███▀▀▀▄ ▄▀▄\n █▀▄██ ▄▀ ▄█▀▄\n █▀▄▀████▀▀█▀▄\n ▀▄█▄█▄▄▄▀ "], ["walk_2", "▄▄ ▄▄▄▄▄▄\n▀▄▀▀▄█████▄▄▄▄█▄\n▄▄██▀▀▄████▄▄█▄ \n█▀▀▀▀██████▄█▄ \n ▀▀▀██████▄▀ ▄\n ▄▀▄██ ▄▀ ▄▀▄\n █▀▄██▄█▄▄▄██▀▄\n ▀▄█▄███▄▄▀▀▀▄"]]], + ["metaltyrannomon", [["angry", " ▄▄▄▄▄ ▄▄ \n ▄▄▄██▀ ███▄▀ \n████████████▀█ \n █▄█▄█▄███ ▀█▄▄ \n ▄▀▀█▀██ ▀ ██▄█ \n██ ██▄ ████ ▄█\n ▄▄▀█▄ ▄ ▄▄▄██▀\n█▄██▄█▀▀▀█▄█▄█▄█"], ["attack", " ▄▄▄███▀▀█▄▀█ \n██████▄▄████▄▄ \n ▀ ▀ ▀ ▀███▄▀ \n █ █▀█ \n ▄ ▄ ▄ ▄▄▀ ██ ▄\n ▀▀█▀▀▀█▀ ███▀▄█\n ▄▄▀█▄ ▄ ▄▄▄██▀\n█▄██▄█▀▀▀█▄█▄█▄█"], ["eat_1", " ▄▄▄███▀▀█▄▀█ \n██████▄█████▄▄ \n ▀ ▀ ▀ ████▄▀ \n ███ █▀█ \n ▄ ▄ ▄███▀ ██ ▄\n ▀▀█▀▀▀█▀ ███▀▄█\n ▄▄▀█▄ ▄ ▄▄▄██▀\n█▄██▄█▀▀▀█▄█▄█▄█"], ["eat_2", " ▄▄▄▄▄ ▄▄ \n ▄▄▄██▀▄▀██▄▀ \n████████████▀█ \n ▀ ▀ ▀ ███ ▀█▄▄ \n ▄▀▀█▀██ ▀ ██▄█ \n██ ██▄ ████ ▄█\n ▄▄▀█▄ ▄ ▄▄▄██▀\n█▄██▄█▀▀▀█▄█▄█▄█"], ["happy", " ▄███▀██▄▀█ \n▄█████▄█▄███▄▄ \n▀█▀█▀█▀▀████▄▀ \n ███▀█▀█ \n ▄▄▄▄▄▄████ ██ ▄\n ▀█▀▀▀█▀▀▄▄█▀▄█\n ▄▄▀█▄ ▄ ▄▄▄██▀\n█▄██▄█▀▀▀█▄█▄█▄█"], ["injured_1", " \n ▄██████▄▀█ \n ▄▄███▄▀▀███▄▄ \n████████████▄▀ \n ▀▄▄▄█████ ▀█▀█ \n ▄█▄▀▀ ▀ ███▀ \n ▄██▄ ▄ ▄████▄█\n █▄█▄██▄█▄█▄█▄█▀"], ["injured_2", " \n ▄▄▄▄▄▄ ▄▄ \n ███▀████▄▀ \n▄██████▄▄███▀█ \n▀█▀▀▀█████▀██▄▄ \n ▀▀█▀█▀▀█ ▄█▄█ \n ▄██▄ ▄ ▄████▄█\n █▄█▄██▄█▄█▄█▄█▀"], ["sleep_1", " \n ▄▄▄▄▄▄ ▄▄ \n ████████▄▀ \n▄█████▄▄▄███▀█ \n▀█▀▀▀█████▀██▄▄ \n ▀▀█▀█▀▀█ ▄█▄█ \n ▄██▄ ▄ ▄████▄█\n █▄█▄██▄█▄█▄█▄█▀"], ["sleep_2", " \n ▄██████▄▀█ \n ▄▄███▀▀▀███▄▄ \n████████████▄▀ \n ▀▄▄▄█████ ▀█▀█ \n ▄█▄▀▀ ▀ ███▀ \n ▄██▄ ▄ ▄████▄█\n █▄█▄██▄█▄█▄█▄█▀"], ["walk_1", " ▄███▀▀█▄▀█ \n▄█████▄▄████▄▄ \n██▀▀▀ ▀███ █▄▀ \n ▀▀▀█▀██▀█ ▄█▀█ \n ▄ █▄ ▀▀▄▄██▀█▀ \n██ ██▀ ▀▀▀▀▄█▄█\n ▄▄▄▀█▄▀▄██▄▄▄█▀\n█▄███▄▀▀▀█▄█▄█▄█"], ["walk_2", " ▄▄▄▄▄ ▄▄ \n ▄▄▄██▀ ▄██▄▀ \n████████████▀█ \n ▀ ▀ ▀ ███ ▀█▄▄ \n ▄▀▀█▀██ ▀ ██▄█ \n██ ██▄ ████ ▄█\n ▄▄▀█▄ ▄ ▄▄▄██▀\n█▄██▄█▀▀▀█▄█▄█▄█"]]], + ["metaltyrannomon_x", [["angry", " ▄▄▄▄ ▄▄▄ \n ▄▄▀▀ ▄ ▀▄▄▀█ \n█ ▀▀▄▄▄█▀▄▄ \n█▀▀█ ▄▀▀ ▄▀▀▀█▀█\n █▀█▀▀▀▀▀▄▀▀▄ ██\n ▀▄█ ▄▄▄ ▀▄▄█▄█ \n ▄█▀█▄ ▀▀▄▄▄▄█ \n█▄█▄▄██▄▄█▄█▄█▄█"], ["attack", " ▄▄▀▀▀▀▄▀▀█▄ \n▄▀▀ ▄█ ▀█▄▀ \n█▄▄▄ ▄▄▀▀█▀▄▄ \n ▀██▄██▀ ███▀▀█ \n ▄▀▀█▀▀▀█▀ █▄ █ \n ▀▀██▀▀ █ ▄▀▀█ \n ▄█▀█▀█▀█ ▀▄ \n █▄█▄▄██▀▄█▄█▄█ "], ["eat_1", " ▄▄▄▄▀▀▀▀▄▀▀█▄ \n█ ▄▀▄ ▀█▄▀ \n▀██▄ ▄▄▄▀██▄██▄\n▄███▄█▀ ▄▀ ▀▄ █\n▀▄▄▄▄▄▄▀▀▄█ █▄▀\n █ █ ▄▄▄█ ▀▄▀▄ \n ▄█▀█▄ ▀█▀ ▀▄\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["eat_2", " ▄▄▄▄ ▄▄▄ \n ▄▄▀▀ ▄ ▀▄▄▀█ \n█ ▀ ▀▄▄▄█▀▄▄ \n█▀▀█ ▄▀▀ ▄▀▀█▀▀█\n ▀▀█▀▀▀▀▀ ▄ ▀▄█\n ▄▀█ ▄▄▄ ▄▀▀▄ █ \n █▄▀█▄ ▀▀▄▄▄██ \n█▄█▄▄██▄▄█▄█▄█▄█"], ["happy", " ▄▄▄▄▀▀▀▀▄▀▀█▄ \n█ ▄▀▄ ▀█▄▀ \n████▄ ▄▄▀█▀▀▀█▄\n▀████▄█▀▀ █▄ ██\n █▄▄▄▄▄▀▀▀▀ ▄▀▀\n█ █▄▄▄▄ ▄█▀▀▄ \n ██▀▄▀▄ ▀▀█ ▀▄\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["injured_1", " \n ▄▄▀▀▀▀▄▀▀█▄ \n▄▀▀ █▄ ▀█▄▀ \n█▄▄▄ ▄▄▀▀██▄██▄\n▀▄▄█▄█▄▄▄▀ ▀▄ █\n ▄▀▄ ▄▄ ▀▄ █▄▀\n ▄█▀▀█ ▀▀█▀▀██ \n█▄█▄▄██▄▄▄█▄▄█▄█"], ["injured_2", " \n ▄▄▄▄ ▄▄▄ \n ▄▄▀▀ ▄ ▀▄▄▀█ \n█ ▀▀▄▄▄█▀▄▄ \n█▀▀█ ▄▀▀ ▄▀▀█▀▀█\n ▀█▀█▀▀▀▀▄▄ █ █\n ▄█▀▀▄▀▀▄▄█▀▀██ \n█▄█▄▄██▄▄▄█▄▄█▄█"], ["sleep_1", " \n ▄▄▀▀▀▀▄▀▀█▄ \n▄▀▀ ▄▄ ▀█▄▀ \n█▄▄▄ ▄▄▀▀██▄██▄\n▀▄▄█▄█▄▄▄▀ █▀█ █\n ▄▄█ ▄▄▄ ▄█▄▄██▀\n█ ▀ ▀▄ ▀█ ▀ ▀ █\n▀▄▄▄▄██▄▄█▄▄▄▄▄▀"], ["sleep_2", " ▄▄▄▄ ▄▄▄ \n ▄▄▀▀ ▀▄▄▀█ \n █ ▀▀ ▄▄▄█▀ \n █▀▀█ ▄▀▀ ▄▀███▄\n ▀█▀▀▀▀▀▀ █ █ █\n ▄▄█ ▄▄▄ ▄█▄▄██▀\n█ ▀ ▀▄ ▀█ ▀ ▀ █\n▀▄▄▄▄██▄▄█▄▄▄▄▄▀"], ["walk_1", " ▄▄▀▀▀▀▄▀▀█▄ \n▄▀▀ ▄█▀ ▀█▄▀ \n█▄▄▄ ▄▄▀▀██▄██▄\n▀▄▄█▄█▄▄▄▀ ▀▄ █\n ▄█ ▄▄▀ █▄▀\n █ █▄▀▀█ ▀▄█▀▄ \n ▄█▀▄▀▄ ▀▀█▀ ▀▄\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["walk_2", " ▄▄▄▄ ▄▄▄ \n ▄▄▀▀ ▄▄ ▀▄▄▀█ \n█ ▀▀ ▄▄▄█▀▄▄ \n█▀▀█ ▄▀▀ ▄▀▀█▀▀█\n ▀▀█▀▀▀▀▀ ▄ █ █\n ▄▀█ ▄▄▄▀▀▄ ▄█▀ \n █▄██▄ ▀▄▄▄█▀ █ \n█▄█▄▄██▄▄█▄█▄█▄█"]]], + ["mimicmon", [["angry", " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄\n█▄█▄▄▄▄▄▄▄▄▄▄▀▄█\n ▀▀█ ██ ██▀█ ▀█▄\n ▄▀█ ██ █▄▄█ █▄█\n █▀▀▄▄▄▄▄▄▄▄ ▀█ \n ▀▄▄█ ▄▄██▄█ \n▄▀██▄ ▀▄▄█ █ \n▀███▀ ▀▀▀ "], ["attack", " ▄ █▀▀▀▀▀▀▀▀█▀█\n ▀██████▀██▀▄█▀\n █▀ █ ██ ▄▀█\n ▄▄ █▀▀▀ ▀▀▄██▀\n█▄██ ▀█▀███▀█▄▀▄\n ▀▀▄ ▀▄▄▀█▀▀█▀█\n ▀▀▀ ▀██▄▀\n "], ["eat_1", "▄ █▀▀▀▀▀▀▀▀▀▀█▀█\n▀███▀██▀███▀█▄█▀\n ▄█ ██ █▄█ █▄▀█\n █▄█ ██ ███ █▀█▀\n█ █ ██ ███ █ █ \n ▀█▀▄▄▄▄▄▄▄▄█▄█ \n▄▀██▄ ▀▄▄█ █ \n▀███▀ ▀▀▀ "], ["eat_2", " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄\n█▄█▄▄▄▄▄▄▄▄▄▄▀▄█\n ▀▀█ ██ █▀██ ▀█▄\n ▄▀█ ██ ▄█▄█ █▄█\n █▀▀▄▄▄▄▄▄▄▄ ▀█ \n ▀▄▄█ ▄▄██▄█ \n▄▀██▄ ▀▄▄█ █ \n▀███▀ ▀▀▀ "], ["happy", "▄ █▀▀▀▀▀▀▀▀▀▀█▀█\n▀███▀██▀████▀▄█▀\n ▄█ ██ ▀▄▀█ ▄▀█\n █▄█ ██ ████ ██▀\n█ █▄▀▀ ▀▀▀▄█▄▀▄\n ▀█▀ ▀▀▀▀▀█▀▀█▀█\n▄▀██▄ ▀██▄▀\n▀███▀ "], ["injured_1", " \n \n \n▄ █▀▀▀▀▀▀▀▀▀▀█▀█\n▀███▀█▀████▀█▄█▀\n ▄█ █ █ ▀█ █▄▀█\n █▀█▀█▄▀▀█▀▀█▀█▀\n ▀▄███▀▀▀▀▀██▄▀ "], ["injured_2", " \n \n \n ▄▄▄▄▄▄▄▄▄▄▄▄▄▄\n█▄█▄▄▄▄▄▄▄▄▄▄▀▄█\n ▀▀█ █ █▀██ █▀█▄\n ▄▀█▀███▄▄█▄█▀▄█\n █▄████▄▄█▄▄█▄█ "], ["sleep_1", " \n▄ █▀▀▀▀▀▀▀▀▀▀█▀█\n▀███▀█▀████▀█▄█▀\n ▄█ █ █▄▄█ █▄▀█\n █▄█▄▀ ▀▀▀▀▄▀██▀\n █ █▀▀▀▀███▄▄█ \n▄▀██ ▀▄▄█ █ \n▀██▀ ▀▀▀ "], ["sleep_2", " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄\n█▄█▄▄▄▄▄▄▄▄▄▄▀▄█\n ▀▀█ █ █▀▀█ █▀█▄\n ▄▀█ █ ████ ██▄█\n █▀▀█▄▄▄▄▄▄█ ▀█ \n ▀▄▄▀ █▀▀█▀█ \n▄▀█▄ ▀██▄▀ \n▀██▀ "], ["walk_1", "▄ █▀▀▀▀▀▀▀▀▀▀█▀█\n▀███▀██▀███▀█▄█▀\n ▄█ ██ █▄█ █▄▀█\n █▄█ ▀▀ ▀▀▀▄▀██▀\n █ █▀▀▀▀▀▀█▄ █ \n █▀▀ █▀▀█▀█ \n▄▀██▄ ▀██▄▀ \n▀███▀ "], ["walk_2", " ▄▄▄▄▄▄▄▄▄▄▄▄▄▄\n█▄█▄▄▄▄▄▄▄▄▄▄▀▄█\n ▀▀█ ██ █▀█ █▀█▄\n ▄▀█ ██ ███ ██▄█\n █▀▀▄▄▄▄▄▄▄█ ▀█ \n ▀▄▄█ ▄▄██▄█ \n▄▀██▄ ▀▄▄█ █ \n▀███▀ ▀▀▀ "]]], + ["minervamon_x", [["angry", " \n ▄▄▄▄ \n ▄▀▀▀▀ ▀▄▀ \n ▄▀▄ ▄█ █ ██\n ▀▄▄▄▄▄▄█▀▀▄▄▀ \n ▀▄▄▄▀█▄▀▀▄ \n ██▄▄▄█ ██ █ \n █▄▄█▀▀▄█▄▄▀ "], ["attack", " ▄▄▄▀█▀█ \n ▄▀ ▄ ▄▀ ▄▄\n █ ▀ ▀▀▄█▄█▀▀\n █▀▀▀██▄▀▄▀▄\n █▀▄▄▀█▀▀ █▄▀▄▀\n █ ▄▀▄██▀█▀█▀ \n█ ▄▀ ▄█▀▀▀▄▄▀ \n▀▄▄▄▀▀ "], ["eat_1", " \n ▄▄▄▄▀█▀█ \n ▄▀ ▄ ▄▀ ▄▄\n █ ▀ ▀ ▀▄█▄ █▀\n ▀████▀█▄▄█▀ \n █▀▀▀▄█▀▄▄▀▄ \n ▀▄▀█▀▄█▄▀▀▄▀ \n █▄█▀▀▄▄█▀▀ "], ["eat_2", " \n ▄▄▄▄ \n ▄▀▀▀▀ ▀▄▀ \n ▄▀▄ ▄▀▄ █ \n ▀▄▄▄▄▄▄█▀▄ ██\n █▄▄▄▄█▀▀▄▀▀▀ \n ▀▄█▄▄█ ██ █ \n █▄▄▀▀▄█▄▄█ "], ["happy", " \n ▄▄▄▄▀█▀█ ▄▄\n ▄▀ ▄ ▄▀ ▄█▀\n █ ▀ ▀ ▀▄█▀▀█ \n ▀████▀█ ██ █ \n █▀▀▀▄█▀▄▄▀ \n ▄▀█▀█▄▀ \n █▄█▀▀▄▄█ "], ["injured_1", " \n \n ▄▄▄▄▀█▀█ \n ▄▀ ▄ ▄▀ \n █ ▀ ▀▀▄█▄▄ \n █▀▀▀██▄▀▀▄▀██\n █▀▄█▀▀ █ ██ █ \n █▄▄██████▄▄▀ "], ["injured_2", " \n \n ▄▄▄▄ \n ▄▀▀▀▀ ▀▄▀ \n ▄▀▄ █▄ █▄▄ \n ▀▄▄▄▄▄▄▄▄▀▀█▄▄ \n █▀▄▄▄█▀█ ██ █▀ \n █▄▄██████▄▄▀ "], ["sleep_1", " \n \n ▄▄▄▄▀█▀█ \n ▄▀ ▄▀ \n █ ▀ ▀▀▀▄█▄▄ \n █▀▀▀█▀█▄▀▀███ \n ▄▀█▀▀█▀█ ██ █▀ \n █▄▄███▄██▄▄▀ "], ["sleep_2", " \n ▄▄▄▄ \n ▄▀▀▀▀ ▀▄▀ \n ▄▀▄ ▄▄▄ █ \n ▀▄▄▄▄▄▄█▀▀▄▄██\n ▀▄▄▄▀█▄▀▀▄ ▀▀\n ▄▀█▄▄▄▀█ ██ █ \n █▄▄█▄█▄▄█▄▄▀ "], ["walk_1", " \n ▄▄▄▄▀█▀█ \n ▄▀ ▄▄ ▄▀ ▄▄\n █ ▀ ▀ ▀▄█▄ █▀\n █▀▀▀██▀▄▄▀▀ \n █▀▀ █▀▄▄▀▄ \n ▀▄▀█▀█▄▀▀▄▀ \n █▄█▀▀▄█▀▀ "], ["walk_2", " \n ▄▄▄▄ \n ▄▀▀▀▀ ▀▄▀ \n ▄▀▄ ▄▀█ █ ██\n ▀▄▄▄▄▄▄█▀▀▄▄▀ \n █▄▄▄▀█▄▀▀▄ \n ▀▄█▄▄▄█ ██ █ \n █▄▄▀▀▀▄█▄▄▀ "]]], + ["minomon", [["angry", " ▄▄▄ ▀▄ ▄▄▄\n ▀▄▀▀▀▀▀▀█ ▄▀\n █▄ ▄ █ \n ▄█▀█▄▄▀▀ █▄ \n ▀▄█ █ █▄▄█▄▀ \n ██▄▀▀▀ ▀▄█ █ \n ▀▄ ▄▀ \n ▀▀▄▄█▀ "], ["attack", " ▄▄▄ ▄▀ ▄▄▄▄ \n ▀▄▀▀▀▀▀▀▄ ▄▀ \n █▄ ▄▄ █ \n ██▀█▄▄▀▀ ▄▀█ \n ▀▄█ █ █▄█▄▄▀ \n █▄ ▀▀▀▀ ▄▄▀ \n █ ▄▄▀ \n █▄▄█▀▀ "], ["eat_1", " ▄▄▄ █ ▄▄▄▄ \n ▀▄▀▀▀▀▀▀▄ ▄▀ \n █ ▄ ▄ █ \n ▄█▀█▄▄▄▀▀ █▄ \n ▀▄█ ██ █▄▀▄▀ \n ██▄▀▀▀█▄▀ █ \n ▀▄ ▄▀ \n ▀▀▄▄▀▀ "], ["eat_2", " █ \n █▀█▄▄█▄▄▀▀▀█ \n ▄▀ ▀▄▀ \n █▀▄ ▄▀▄ █ \n █▀▄▀█▀▄ ▄▀█ \n ▄▀▀▄█▄█▀█ ▀▄ \n ▀▄ ▀▀ ▀▀ ▄▀ \n ▀▄▄▄▄▄▄▀ "], ["happy", " ▄▄▄ █ ▄▄▄▄ \n ▀▄▀▀▀▀▀▀▄ ▄▀ \n █▀▄ ▄▀▄ █ \n ██ ▄▄▄▄ ▄▀█ \n ▀▄█ ██ ██▄▄▀ \n █ ▀▀▀▀▀ █ \n ▀▄ ▄▀ \n ▀▀▄▄▀▀ "], ["injured_1", " █ \n ▄▀█▄▄█▄▄▀▀▄ \n ▀▄▀ ▀▄▄█ \n █▄█ █▄ █ \n █▀▄▀█▀▄ ▄▀█ \n ▄▀▀▄█▄█▀█ ▀▄ \n ▀▄ ▀▀ ▀▀ ▄▀ \n ▀▄▄▄▄▄▄▀ "], ["injured_2", " █ \n ▄▄ █ ▄▄ \n ▄▀▄▀▀▀▀▀▀▄ ▀▄ \n █ ▄ ▄ █▀▀ \n ▄█▀█▄▄▀▀ █▄ \n ▀▄█ █ █▄▄▀▄▀ \n █ ██▀█▄▀ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["sleep_1", " ▄▀█▄▄█▄▄▀▀▄ \n ▀▄▀ ▀▄▄█ \n █▄▄ ▄▄ █ \n █▀▄▀█▀▄ ▄▀█ \n ▄▀▀▄█▄▀▀▀ ▀▄ \n ▀▄ ▄▀ \n ▀▄▄ ▄▄▀ \n ▀▀ "], ["sleep_2", " ▄▄▄ █ ▄▄▄▄ \n ▀▄▀▀▀▀▀▀▄ ▄▀ \n █ █ \n ▄█▀█▄▄▀▀ █▄ \n ▀▄█ █ █▄▄▀▄▀ \n █ ▀▀▀ █ \n ▀▄ ▄▀ \n ▀▀▄▄▀▀ "], ["walk_1", " ▄▄▄ █ ▄▄▄▄ \n ▀▄▀▀▀▀▀▀▄ ▄▀ \n █ ▄ ▄ █ \n ▄█▀█▄▄ ▀▀ █▄ \n ▀▄█ █ █▄▄▀▄▀ \n █▄ █▄▀█▄▀ ▄█ \n ▀▄ ▄▀ \n ▀▀▄▄▀▀ "], ["walk_2", " ▄▄ █ ▄▄▄ \n █ █▄▄█▄▄▀ ▄▀ \n ▄▀ ▀█ \n █▄█ ▄█ █ \n █▀▄▀█▀▄ ▄▀█ \n ▄▀▀▄█▄█▀█ ▀▄ \n ▀▄ ▀▀ ▀▀ ▄▀ \n ▀▄▄▄▄▄▄▀ "]]], + ["minotarumon", [["angry", " ▄ ▄ \n ██▄▄▀█▀▀▀▄▄▄██ \n ▀█ ▀ ▄ ▀▀█▀ \n ▄█ ▄ ▀▀▀▄▀▄ \n ▀▄▄▄▄▄▀█▄▄▄▀ \n ▄▀▀█ ▀▄ ▄▀ █ \n ▀█▀▀▄ █ █▄▄▄▀ \n █▄▄▄▄█▄█▄▄▄▄█ "], ["attack", " ▄ ▄ \n ██▄▄▀█▀▀▀▄▄▄██ \n ▀█ ▀ ▄ ▀▀█▀ \n ▄█ ▄ ▀▀ █▀▄ \n ▀▄▄▄▄▄▀█▄▄▄▀ \n ▄▀▀█ ▀▄ ▄▀ █ \n ▀█▀▀▄ █ ▀▄▄▄█ \n █▄▄▄▄█▄▄▀▄▄▄▄█ "], ["eat_1", " ▄ ▄ \n ██▄▄▀█▀▀▀▄▄▄██ \n ▀█ ▀ ▄ ▀▀█▀ \n ▄█ ▄ ▀▀ █▀▄ \n ▀▄▄▄▄▄▀█▄▄▄▀ \n ▄▀▀█ ▀▄ ▄▀ █ \n ▀█▀▀▄ █ ▀▄▄▄█ \n █▄▄▄▄█▄▄▀▄▄▄▄█ "], ["eat_2", " ▄█ ▄▄▄▄▄ █▄ \n ▀██▀▄▀ ████▀ \n ▄█ ▄ ▀▀ ▄▄▀ \n █▄▄▄▄▄▄▄▀ ▀▄ \n ▄█▀▀▀▄▀▀█▀▀▄ \n █ █▀▀█ █ █ \n █▀▀▄ ▀ ▄▀▀█ \n █▄▄▄▄█▀▀▄▄▄▄█ "], ["happy", " ▄█ ▄▄▄▄▄ █▄ \n ▀██▀▄▀ ████▀ \n █ ▄▀▄▄▄█▄ \n █▀ ▀ ▄▄█ █ \n ▄██▀█▀ ▀█▄▄▀ \n █ █ █ █ █ \n █▀▀▄ ▀ ▄▀▀▄ \n █▄▄▄▄█▀▀▄▄▄▄█ "], ["injured_1", " \n▄█ ▄▄▄▄▄ █▄ \n▀██▀▄▀ ████▀ \n █ █▄ ▄▀ \n █▀ ▀ ▄▄▀ ▀▄ \n ▄▀▀█▀▀▄▀█▀▀▄ \n ▀█▀▀▄ ██ █ \n █▄▄▄▄█▄████▄█ "], ["injured_2", " \n ▄ ▄ \n██▄▄▀█▀▀▀▄▄▄██ \n ▀█ ▀ ▄ ▀▀█▀ \n ▄█ ▄ ▀▀▄▀▄ \n ▀▄▄▄▄▄▀█▄▄▄▀ \n ▄▀▀▄ █▄▀ █ \n █▄▄▄▄█▄█▄▄▄██ "], ["refuse", " ▄ ▄ \n ██▄▄▀▀▀▀▀▄▄▄██ \n ▀█ ▄▄▀▀█▀ \n ▄█ ▄ ▀▀▀▄▀▄ \n █▄▄▄▄▄▀█▄▄▄▀ \n █ █ ▀▄ ▄▀ █ \n ▀█▀▀▄ █ █▄▄▄▀ \n █▄▄▄▄█▄█▄▄▄▄█ "], ["sleep_1", " ▄ ▄ \n ██▄▄▀█▀▀▀▄▄▄██ \n ▀█ ▀ ▀▀█▀ \n ▄█ ▄ ▀▀ ▄▀▄ \n ▀▄▄▄▄▄▀█▄▄▄█ \n ▄█ █ ▀▄ ▄█ █ \n █ ▀▀▄ ██ ▀▀█▀▀ \n █▄▄▄▄█▄█▄▄▄█ "], ["sleep_2", " \n ▄█ ▄▄▄▄▄ █▄ \n ▀██▀ ████▀ \n █ ▄▄ ▄▀ \n █▀ ▀ ▄▄█▄█▄ \n ▄█▀█▀▀█ ▄█ █ \n █ ▀▀▄ ██ ▀▀█▀▀ \n █▄▄▄▄█▄█▄▄▄█ "], ["walk_1", " ▄█ ▄▄▄▄▄ █▄ \n ▀██▀ ████▀ \n █ ▄█ ▄▄▀ \n █▀ ▀ ▄▄▀ ▀▄ \n ▄██▀█▀ ▀█▀▀▄ \n █ █ █ █ █ \n █▀▀▄ ▀ ▄▀▀█ \n █▄▄▄▄█▀▀▄▄▄▄█ "], ["walk_2", " ▄ ▄ \n ██▄▄▀█▀▀▀▄▄▄██ \n ▀█ ▀ ▄ ▀▀█▀ \n ▄█ ▄ ▀▀ █▀▄ \n ▀▄▄▄▄▄▀█▄▄▄▀ \n ▄▀▀█ ▀▄ ▄▀ █ \n ▀█▀▀▄ █ ▀▄▄▄█ \n █▄▄▄▄█▄▄▀▄▄▄▄█ "]]], + ["miragegaogamon", [["angry", " ▄▄▄██▄▀▀█ \n ▄▀▀▀ ▄█▀▄▀ \n▄▄█▀█▀▄▀▀ ▄██▀▀▄\n▀▄▀█▀▀▀ ▄█▄█▀ █\n ▀▄▀▀█▀▀▄▀ █ ▄▄█\n ▀██▀▀▀▀██▀ \n ▄▄█▄▄█▄▄█▄▄█▄ \n█▄█▄▄█ █▄▄█▄█ "], ["attack", " ▄▄ ▄▄ \n █▀▀▀▀█ █ \n ▄▀▀ ▄█▀ █▄▄ \n ▀▀█▀▀▄▄▄▀█ ▄▀▄\n▄▄▄▀█▀▀ █▄▀▀▀▀█\n█ ▀▄█▄▄█▄▄█ █\n█▄██▄▄▄▄▄▄▄█▀▀▄█\n █▄█▄▄██▄▄█▄█ "], ["eat_1", " \n █▀▀▀▀█▀▀▄ \n ▄▀▀ ▄▀▄ ██▄ \n ▀▀█▀▀▄▄▄▀█ ▄▀▄\n ▄▀█▀▀ █▀▀█ ▄▀\n ▄▀▄▄█▄▄█▄▄█ ▀▀█\n █▄█▄▄█▄▄█▄█▄ █\n ▀▄█▄▄▄██▄▄██▄▄▀"], ["eat_2", " ▄▄██▄█▀▄ \n ▄▀▀ ▄▄ ▀▄▀ \n ▀███▄▀ ▄█▀▀▄ \n█▀▄▄▀▀▀▄▄█▄█▄▀▀█\n█ █▀█▀ ▄▀ ▄▀ █\n ▀▄▄██▀▀▀▀█▄▄▄▀ \n ▄▄█▄▄█▄▄█▄▄█ \n▀▄█▄▄▄█ █▄▄█▄█ "], ["happy", " ▄▄██▄█▀▄ \n ▄▀▀ ▄ ▀▄▀ \n▄▄████▄▀ ▀▄██▀▀█\n▀▄ ▄▀▀▀▄▄█▄█▀ █\n ▀█ ▀█▀ ▄▀ █ ▄▄▀\n ▀██▀▀▀▀██▀ \n ▄▄█▄▄█▄▄█▄▄█ \n▀▄█▄▄▄█ █▄▄█▄█ "], ["injured_1", " ▄▄ \n █▀▀▀▀█▀▄ \n █▀▀ ▄ █▄█ \n ▀▄▄▄▄ ▀▀ █▄▄▄▄ \n ▄▀▄▄▄▀█▀█▄█▄▄▀█\n█ █▀▄▄▀▀▄▀ █▀▄▄▀\n█▄▀█▄▄▄██ █▄▄█ \n█▄▄█▄▄█▄█▄▄▄█▄▄█"], ["injured_2", " \n ▄▄██▄▄▄▄ \n ▄▄▄▀ ▀▄▄█ \n █ ▀▄▄ █ ▄▄▄ \n ▄█▀▀▀▄▄▄▄▀█▄▄▀█\n█ █▀██▀▀▄▀▀█▀▄▄▀\n█▄▀█▄▄▄██ █▄▄█ \n█▄▄█▄▄█▄█▄▄▄█▄▄█"], ["refuse", " █▀▄█▀▄ \n █▀▀▀█▄█ \n ▄▀▀ ▄█▀ █▄▄ \n █▀█▀▀▄▄▄▀█▀▄█▄\n █ ▀█▀▀ █▀█ █\n█▄▄▀▄█▄▄█▄▄▄█ █\n ▄▄█▄▄█▄▄█▄▄█▀▀ \n▀▄█▄▄▄█ █▄▄█▄█ "], ["sleep_1", " \n ▄▄ ▄▄ \n █▀▀▀▀█ █ \n ▄▀▀ ▄▄ █▄▄ \n ▀██▀▀▄▄▄██▄▄▀▄\n▄▄█ ▀█▀ ▄▀ ▄▀▄▄▀\n█▄▀█▀█▀▀█▀▀█▀▄█ \n█▄▄█▄▄██▄▄▄█▄▄█ "], ["sleep_2", " \n \n ▄▄██▄█▀▄ \n ▄▄▀ ▀▄█▄ \n █▄▄▄▄▀▀ ▄█▄▄▀▄\n▄▄█ █▄▄▀█▀ ▄▀▄▄▀\n█▄▀█▀█▀▀█▀▀█▀▄█ \n█▄▄█▄▄██▄▄▄█▄▄█ "], ["walk_1", " ▄▄██▄█▀▄ \n ▄▄▀ ▄▄▀▄▀ \n █▄▄▄▄▀▀ ▄█▀▀▄ \n ▄█▄▄▀▀█▄█▄▀ █\n █ ▀▄ ▄▀ ▄▀▄█▄\n █ ▀██▀▀▀▀██ █\n█▄▄█▄▄█▄▄█▄▄█ █\n▀▄█▄▄▄█ █▄▄█▄█▀ "], ["walk_2", " ▄▄ ▄▄ \n █▀▀▀▀█ █ \n ▄▀▀ ▄█▀ █▄▄ \n ▀▀█▀▀▄▄▄▀█ ▄▀▄\n▄▄▄▀█▀▀ █▄▀▀▀▀█\n█ ▀▄█▄▄█▄▄█ █\n█▄██▄▄▄▄▄▄▄█▀▀▄█\n █▄█▄▄██▄▄█▄█ "]]], + ["mojyamon", [["angry", " ▄▀▀▀▄▀▀▀▀▄ \n █ █▄ ▄█▀ █ \n█ ▄▄▄▄▄ █ \n█ █ █▄█ █▄ ▀▀▄\n▀▄ ▀██████ ▄█ █\n█ █ █████▀ █ █\n▀▄█▄▄ ▄ ▄█▄▄▄▀\n█▄▄▄▄█▀ ▀█▄▄▄▄▄█"], ["attack", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ ▀ ▀▄ \n ▄█▄▄ ▄▄▄ ▀▄ \n▄█▄ ▄▀▄▄ ▄▄ ▀▄\n█ █ █ ▀ █\n▀▄▄▀▄ ▄▀▄▄▄▄▀\n█▄▄▄▄█▀▄▀█▄▄▄▄▄█"], ["eat_1", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ ▀ ▀▄ \n ▄█▄▄ ▄▄▄ ▀▄ \n▄█▄ ▄▀▄▄ ▄▄ ▀▄\n█ █ █ ▀ █\n▀▄▄▀▄ ▄▀▄▄▄▄▀\n█▄▄▄▄█▀▄▀█▄▄▄▄▄█"], ["eat_2", " ▄▀▀▀▄▀▀▀▀▄ \n █ ▄▀▄ ▄▀▄ █ \n █ ▄▄▄▄▄▄▄ █ \n █ █████████ ▀▄\n █▄██▀▀█▀▀██▄█▄█\n█ █ █ ▄█ █\n▀▄█▀ █ █▄▀▄▄▄▀\n█▄█▄▄▄▄▄▀█▄▄▄▄▄█"], ["happy", " ▄▀▀▀▄▀▀▀▀▄ \n █ ▄▀▄ ▄▀▄ █ \n █ ▄▄▄▄▄▄▄ █ \n █ █████████ ▀▄\n █▄██▀▀█▀▀██▄█▄█\n█ █ █ ▄█ █\n▀▄█▀ █ █▄▀▄▄▄▀\n█▄█▄▄▄▄▄▀█▄▄▄▄▄█"], ["injured_1", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ ▀ ▀▄ \n ▄▀ ▀▄ \n █ ▄▄ ▄▄ ▄ ▀▄\n▄▀▄▄ ▀ ▄▄█ █\n█▀ █ █ ▀▀ █\n▀▄▄▄██▄█▄█▄▄▄▄▀ "], ["injured_2", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ ▀ ▀▄ \n ▄▀ ▀▄ \n █ ▄▄ ▄▄ ▄ ▀▄\n▄▀▄▄ ▀ ▄▄█ █\n█▀ █ █ ▀▀ █\n▀▄▄▄██▄█▄█▄▄▄▄▀ "], ["refuse", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ ▀ ▀▄ \n ▄█▄▄ ▄▄▄ ▀▄ \n▄█▄ ▄▀▄▄ ▄▄ ▀▄\n█ █ █ ▀ █\n▀▄▄▀▄ ▄▀▄▄▄▄▀\n█▄▄▄▄█▀▄▀█▄▄▄▄▄█"], ["sleep_1", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ ▀ ▀▄ \n ▄▀ ▀▄ \n █ ▄▄ ▄▄ ▄ ▀▄\n▄▀▄▄ ▀ ▄▄█ █\n█▀ █ █ ▀▀ █\n▀▄▄▄██▄█▄█▄▄▄▄▀ "], ["sleep_2", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ ▀ ▀▄ \n ▄▀ ▀▄ \n █ ▄▄ ▄▄ ▄ ▀▄\n▄▀▄▄ ▀ ▄▄█ █\n█▀ █ █ ▀▀ █\n▀▄▄▄██▄█▄█▄▄▄▄▀ "], ["walk_1", " \n ▄▀▀▀▄▀▀▀▀▄ \n █ █ \n █ ▄ ▄ ▄ █ \n █▄▀▀ ▄ ▀▀ ▄█▄ █\n█ █ ▀ ▀▀ █ █\n▀▄▄█▀▄ ▄ ▄▀▄▄▄█ \n█▄▄▄▄▄█ ▀█▄▄▄▄▄█"], ["walk_2", " ▄▀▀▀▄ ▄▀▀▀▄ \n█ ▄ ▄█ ▄▄▄█ ▄ █\n█ ▄▀ ▀ ▀█ █\n█▄▀▄█ █▄ ▀▄ █\n▀█ ▄▄▄█▄▄▄ ▄▄▀\n ▀▄ █▄█▄█ ▄▀ \n ▄█▄█▀█▀█ ▄▄▀▄▄ \n█▄▄▄▄██▀▄█▄▄▄▄▄█"]]], + ["mokumon", [["angry", " \n \n \n ▄▀▀▀▀▄ \n █▄ ▄▄ ▀▄ \n ▀▄ ▄▀ \n ▀▀▄▀ \n ▄ "], ["attack", " \n \n \n ▄▄▀▀▀▄ \n ▀▄▄ ▀ █ \n █ █ \n ▄▀▀ ▀▄ \n ▀▀▀▀▀ ▄ "], ["eat_1", " \n \n \n ▄▀▀▀▀▄ \n ▀▀▄▀ █ \n ▄█ █ \n ▀▄▄ █ \n ▀ ▄ "], ["eat_2", " \n \n \n ▄▄▄▄ \n █ ▀▄ \n █ ▀ ▀ █ \n ▀▄▄▄ █ \n ▀ ▄ "], ["happy", " \n \n ▀ \n ▀ ▄▀▀▀▄▄ \n █ █ █ █ \n █ ▄▄▄ █ \n ▀▄███▄▄▀ \n ▄▄▄▄ "], ["injured_1", " \n \n \n \n ▄▀▀▀▄ \n █▄ ▄▄▀▄ \n ▀▄▄▄▄ ▄▀ \n ▀ ▄ "], ["injured_2", " \n \n \n \n ▄▄██▄ \n ▄██████ \n ▀▄▄█▄▄▀ \n ▀▀▄ "], ["sleep_1", " \n \n \n ▄▄▄ \n ▄▀ ▀▀▄ \n █ ▀▀ ▀▀ █ \n ▀▄ ▀ ▄▀ \n ▀▀▀▄▀▀ "], ["sleep_2", " \n \n \n ▄▄▄ \n ▄▀ ▀▀▄ \n █ ▀▀ ▀▀ █ \n ▀▄ ▀ ▄▀ \n ▀▀▀▄▀▀ "], ["walk_1", " \n \n \n ▄▀▀▀▄▄ \n ▄▀▄ ▄ █ \n ▀▄ ▄▀ \n ▀▀▄▀ \n ▀ "], ["walk_2", " \n \n \n \n ▄▄▄ ▄ \n █ ▀▀▄ \n █ ▀ ▀ █ \n ▀▄▄▄▄▀ "]]], + ["monimon", [["angry", " \n ▄▄ ▄▄ \n ▄▄█ ▀ ▄█▄▄ \n █ ▄▄▄▄▄▄ █ \n █ █▀█▀ █ █ \n █ ██▀▀██ █ \n █ ▀▀▀▀▀▀ █ \n ▀██▀▀██▀██ "], ["attack", " \n █▀▄▀▀▄ \n ▄▀▀▀ ▀▀▀▀▄ \n █ ████▀█ █ \n █ █▄█▄▄█ █ \n █ █ ██ █ \n ██ ▀▀▀▀▀██ █ \n ▀▀▀██▀▀▀██ "], ["eat_1", " \n █▀▄▀▀▄ \n ▄▀▀▀ ▀▀▀▀▄ \n █ ██████ █ \n █ █▄██▄█ █ \n █ ██ ██ █ \n █ ▀▀▀▀▀▀ █ \n ▀██▀▀██▀██ "], ["eat_2", " \n \n █▀▄▀▀▄ \n ▄▀▀▀ ▀▀▀▀▄ \n █ █▀██▀█ █ \n █ █▀██▀█ █ \n █ ██▄▄██ █ \n ▀▄▄▄▄▄▄▄▄▄▄▀ "], ["happy", " \n █▀▄▀▀▄ \n ▄▀▀▀ ▀▀▀▀▄ \n █ █▀██▀█ █ \n █ █▀▀▀▀█ █ \n █ ██▄▄██ █ \n █ ▀▀▀▀▀▀ █ \n ▀██▀▀██▀██ "], ["injured_1", " \n \n █▀▄▀▀▄ \n ▄▀▀▀ ▀▀▀▀▄ \n █ ██████ █ \n █ █ █ ▀█ █ \n █ ██████ █ \n ▀▄▄▄▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n ▄▄ ▄▄ \n ▄▄█ ▀ ▄█▄▄ \n █ ▄▄▄▄▄▄ █ \n █ █▀█▀██ █ \n █ ██▄█▄▄██ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▄▀ "], ["sleep_1", " \n \n █▀▄▀▀▄ \n ▄▀▀▀ ▀▀▀▀▄ \n █ █▀▀▀▀█ █ \n █ ██▀▄██ █ \n █ █▄▄▄▄█ █ \n ▀▄▄▄▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n \n █▀▄▀▀▄ \n ▄▀▀▀ ▀▀▀▀▄ \n █ ██▀▀██ █ \n █ ██▀▄██ █ \n █ ██▄▄██ █ \n ▀▄▄▄▄▄▄▄▄▄▄▀ "], ["walk_1", " \n ▄▄ ▄▄ \n ▄▄█ ▀ ▄█▄▄ \n █ ▄▄▄▄▄▄ █ \n █ █▀██▀█ █ \n █ ██▀▀██ █ \n █ ▀▀▀▀▀▀ █ \n ▀██▀▀██▀██ "], ["walk_2", " \n \n █▀▄▀▀▄ \n ▄▀▀▀ ▀▀▀▀▄ \n █ ██████ █ \n █ █▄██▄█ █ \n █ ██▄▄██ █ \n ▀▄▄▄▄▄▄▄▄▄▄▀ "]]], + ["monochromon", [["angry", " ▄▄ ▄▄▄ \n ███ ▄███▀▄ \n ▀███▄█████▄██▄ \n▄███████▀███▀▀█ \n██████▄▄▄██████▄\n █ █ █ ██▀▀▀▀█ █\n ▀▄█▄█▄█ ▄ ▀▄\n █▄█▄▄▄▄▄█▄▄▄▄█"], ["attack", " ▄██ ▄███▀▄ \n ▄███▄█████▄███ \n██▀▀▀▀█▀ ███▀▀█ \n ▀▄ ███████▀ \n █ █ █▄▄\n ▄█▀█▀▀▀▀ ▀▄█\n█ ██ ▄▄▄▀ ▀▄\n▀▀▀▀▀▀███▄▄▄▄▄▄█"], ["eat_1", " ▄██ ▄███▀▄ \n ▀███▄█████▄███ \n▄█████▀▄▄▀██▀▀█ \n▀█▀▀▀▀▀████████ \n █ ▄▄█ ▀▄▄▄\n ▄█▄█▄▄▀ █ █ █\n ▀▄▄▄▄▄▄▀▄ ▄ ▀▄\n █▄█▄▄▄▄▀██▄▄▄▄█"], ["eat_2", " ▄▄ ▄▄▄ \n ███ ▄███▀▄ \n ▀███▄█████▄███ \n▄██████▀▀███▀▀█ \n██████▄██▄█████▄\n ▀▄▄ ▀▀▀▀▀▀▀█ █\n ▄▄█▄▀ ▄ ▄ ▀▄\n █▄█▄▄▄▄▀██▄▄▄▄█"], ["happy", " ▄██ ▄███▀▄ \n ▀███▄█████▄███ \n▄██████▀▄▀██▀▀█ \n▀▀▀▀▀▀████████▀ \n █ ▀▄▄▄\n ▄▄▄▄▄▀▀▀ █ █\n ▀▄▄▄▀ ▄ ▄ ▀▄\n █▄▄▄█▀▀▀██▄▄▄▄█"], ["injured_1", " ▄▄▄▄ \n ██████▀▄ \n▄██ ▄██████▄███ \n█████████████▀█ \n▄██████████▄▄█▀ \n█████▀▀████▀▀█▀█\n▀█████▀▀▀▄ ▄ ▀█\n█▄█▄▄▄▄▄▄██▄▄▄▄█"], ["injured_2", " \n ▄████▄▄ \n ▄▄ ▄█████▀▄█▄ \n███▄███████████ \n▀██████████▀▀▄█ \n██████████████▀█\n▀████▄▄█▀█▀█ ▀█\n█▄█▄▄▄▄▄▄██▄▄▄▄█"], ["sleep_1", " ▄▄▄▄ \n ██████▀▄ \n▄█▄ ██████▄███ \n███▄█████████▀█ \n▀██████████▄▄██▄\n█████▀▀▄███▀▀█ █\n▀█████▀▀▀▄ ▄ ▀▄\n█▄█▄▄▄▄▄▄██▄▄▄▄█"], ["sleep_2", " \n ▄▄ ▄████▄▄ \n███ ▄█████▀▄█▄ \n███████████████ \n▄████████████▄█▄\n█████▄▄▄██████ █\n █▄▄▄▄ ▄ ▄ ▀▄\n█▄█▄▄▄▄▄▄██▄▄▄▄█"], ["walk_1", " ▄██ ███▄ \n ███▄ ▄▄███▀▄█▄ \n ▄█████▀▀██████ \n██████▄▄████▄▄█ \n▀█▀▀▀▀████████▀ \n ▀▀▄ █▀█\n █ █ ▄ ▄ ▀▄▀\n █▄█▄▄▄██▄▄▄▄█"], ["walk_2", " ▄▄ ▄▄▄ \n ███ ▄███▀▄ \n ▀███▄█████▄███ \n▄█████▀ ▄███▀▀█ \n███████████████▄\n ▀▄▄ ▀▀▀▀▀▀▀█ █\n ▄▄█▄▀ ▄ ▄ ▀▄\n █▄█▄▄▄▄▀██▄▄▄▄█"]]], + ["monodramon", [["angry", " ▄▄▀▀█ \n ▄▀ ▀▄▄ \n ▄▀▀ ▄█ ▄▄▀ \n █ ▄ ▄ ▄▄▀ ▄ \n ▀▀████▀█▄█▄▀█ \n ▄▀▀█▄▄▄█▀▀ █ █ \n ▀▄▄█▄ ▀▄▄█▄▀ \n █▄█▄█▀▀██▄█▄█ "], ["attack", " ▄▄▄ \n ▄▀▀ █ \n ▄█ ▄▄▄ ▀█ \n █ ▀▀ ▀█ \n █▄█▄█▄▄█▀▄ ▄█ \n ▄▄▀ ███▀ █ \n ▄█▄█ █ █▄▄▄▀ \n█▄█▄█▄▄▄▄██▄█▄█ "], ["eat_1", " ▄▄▄ \n ▄▀▀ █ \n ▄█ ▄ ▀█ \n █ ▀ ▀ ▀█ \n █▄█▄█▄▄█▀▄ ▄█ \n ▄▄▀ ███▀ █ \n ▄█▄█ █ █▄▄▄▀ \n█▄█▄█▄▄▄▄██▄█▄█ "], ["eat_2", " ▄▄▀▀█ \n ▄▀ ▀▄▄ \n ▄▀▀ ██▀ ▄▄▀ \n █ ▄ ▄ ▄▄▀ ▄ \n ▀▀████▀█▄█▄▀█ \n ▄▀█▄▄▄█▀█▀ █ \n █▄█▄ ▀▄█▄▄▀ \n █▄█▄█▀▀██▄█▄█ "], ["happy", " ▄▄▀▀█ \n ▄▀ ▀▄▄ \n ▄▀▀ ▄▀▄ ▄▄▀ \n █ ▄ ▄ ▄▄▀ ▄ \n ▀▀████▀█▄█▄▀█ \n ▄▀▀█▄▄▄█▀▀ █ █ \n ▀▄▄█▄ ▀▄▄█▄▀ \n █▄█▄█▀▀██▄█▄█ "], ["injured_1", " \n ▄▄▄ \n ▄▀▀ █ \n ▄█ ▄ ▀█ \n █ ▀▀ ▀█ ▄ \n ▀▄█▄█▄▄██▄▄▀█ \n ▄▄██ █ ██▄▄▀ \n█▄█▄█▄▄▄███▄█▄█ "], ["injured_2", " \n \n ▄▄▀▀█ \n ▄▀ ▀▄▄ \n ▄▀▀ █▄ ▄▄▀ ▄ \n █ ▄ ▄ ▄▄█ ▄▀█ \n ▄███▀▀▀█ ██▄▄▀ \n█▄█▄█▄▄▄███▄█▄█ "], ["refuse", " ▄▄▄ \n ▄▀▀ █ \n ▄█ ▄ ▀█ \n █ ▀▀ ▀█ \n █▄█▄█▄▄█▀▄ ▄█ \n ▄▄▀ ███▀ █ \n ▄█▄█ █ █▄▄▄▀ \n█▄█▄█▄▄▄▄██▄█▄█ "], ["sleep_1", " \n ▄▄▀▀█ \n ▄▀ ▀▄▄ \n ▄▀▀ ▄▄ ▄▄▀ \n █ ▄ ▄ ▄▄▀ ▄ \n ▀▀██▀▀▀█▄█▄▀█ \n ▄▄██ █ ██▄▄▀ \n█▄█▄█▄▄▄███▄█▄█ "], ["sleep_2", " \n ▄▄▄ \n ▄▀▀ █ \n ▄█ ▀█ \n █ ▀▀ ▀█ ▄ \n ▀▄█▄█▄▄██▄▄▀█ \n ▄▄██ █ ██▄▄▀ \n█▄█▄█▄▄▄███▄█▄█ "], ["walk_1", " ▄▄▀▀█ \n ▄▀ ▀▄▄ \n ▄▀▀ ██▀ ▄▄▀ \n █ ▄ ▄ ▄▄▀ ▄ \n ▀▀▀█▀▀▀█▄█▄▀█ \n ▄▀█ ▄▀█▀ █ \n █▄█▄ ▀▄█▄▄▀ \n █▄█▄█▀▀██▄█▄█ "], ["walk_2", " ▄▄▄ \n ▄▀▀ █ \n ▄█ ▄▄▄ ▀█ \n █ ▀▀ ▀█ \n █▄█▄█▄▄█▀▄ ▄█ \n ▄▄▀ ███▀ █ \n ▄█▄█ █ █▄▄▄▀ \n█▄█▄█▄▄▄▄██▄█▄█ "]]], + ["monzaemon", [["angry", " ▄▄ ▄▄▄▄▄ ▄▄▄ \n █ ▄▀ ▄▀ █\n █ ▀▄▄▄▀ ▀▄▄▀\n ▄▄█ ▄▄▀▄▄ █▄ \n█ ▀ ▄▄▀ █\n ▀▄▀ ▄ ▄ █▀ \n▄▀█ ▄▀▄ ▄▀▀▀▄\n█▄▄█▄▄▄▄▄▄█▄▄▄▄▀"], ["attack", " █▀▄▀▀▀▀▀▀▄▀▀▀▄\n ▀█▀▄ ▄▀ ▀▄▄█\n ▄█ █▄▀█▀ ▄█ █▄ \n█ ▀▄▀██████▀ █ █\n ▀▄ ▀ ▄▄▀ ▄▀\n ▄▀ ▄ ▄ █ \n▄▀█ ▄▀▄ ▄▀▀▀▄\n█▄▄█▄▄▄▄▄▄█▄▄▄▄▀"], ["eat_1", " █▀▄▀▀▀▀▀▀▄▀▀▀▄\n ▀█▀▀▄▄▄▀▀ ▀▄▄▀\n █ ▄▄█▄▄ █ \n ▄▀▀▄█████ █ \n █ ▄█ ▀▀▀ ▄▄▀▀▄ \n ▀▄▀ ▄ ▄ ▄ █\n▄▀█ ▄▀▄ ▄▀▀▀▄\n█▄▄█▄▄▄▄▄▄█▄▄▄▄▀"], ["eat_2", " ▄▄ ▄▄▄▄▄ ▄▄▄ \n █ ▄▀ ▀ █\n █▀▀▄▄▄▀▀ ▀▄▄▀\n █ ▄▄▀▄▄ █ \n ▄▀█▄ ▄▄▀▀▄ \n █▄▀ ▄ ▄ ▄ █\n▄▀█ ▄▀▄ ▄▀▀▀▄\n█▄▄█▄▄▄▄▄▄█▄▄▄▄▀"], ["happy", " █▀▄▀▀▀▀▀▀▄▀▀▀▄\n ▀█▀▀▄▄▄▀▀ ▀▄▄█\n ▄█ █▄▄█▄▄██ █▄ \n█ ▀▄▀██████▀ █ █\n ▀▄ ▀ ▄▄▀ ▄▀\n ▄▀ ▄ ▄ █ \n▄▀█ ▄▀▄ ▄▀▀▀▄\n█▄▄█▄▄▄▄▄▄█▄▄▄▄▀"], ["injured_1", " ▄▄ ▄▄▄▄▄ ▄▄ \n █ ▄▀ ▀ ▀▄\n █▄▀ ▀▄ ▀▄▄▀\n ▄▄█ ▀█▀ █▄ \n█ ▀ ▀ ▀ ▄▄▀ █\n ▀▄▀ ▄ ▄ █▀ \n▄▀█ ▄▀▄ ▄▀▀▀▄\n█▄▄█▄▄▄▄▄▄█▄▄▄▄▀"], ["injured_2", " \n ▄▀▄▀▀▀▀▀▀▀▀▄ \n █▄▀ ▄ █\n ▀█▄▀ ▀▄ █▄▀\n ▄▀▄ ▀█▀ ▄▄▀▄ \n █ █ ▀ ▀ ▄ █\n▄▀█ ▀▄▀ ▄▀▀▀█\n█▄▄█▄█▄█▄▄█▄▄▄▄▀"], ["sleep_1", " ▄▄ ▄▄▄▄▄ ▄▄ \n █ ▀ ▀ █ \n ▄▀▄▄ ▄▄▄ ▄▄▀▄ \n █ ▄▄▀▄▄ █ \n ▄▀▀▄ ▄▀▀▄\n █▄ █ ▄ ▄ █ ▄█\n ▄▀▀█ ▄▀▄ █▀▀▄\n ▀▄▄▄█▄▄▄▄▄█▄▄▄▀"], ["sleep_2", " ▄▀▀▄▀▀▀▀▀▄▀▀▄ \n ▀▄ ▄▀ \n █ ▀▀ ▀█▀ ▀▀ █ \n ▀▄ ▀▀▀ ▀▀▀ ▄▀ \n ▄▀ █▀ ▀█ ▀▄\n █▄ █ ▄ ▄ █ ▄█\n ▄▀▀█ ▄▀▄ █▀▀▄\n ▀▄▄▄█▄▄▄▄▄█▄▄▄▀"], ["walk_1", " ▄▀▀▄▀▀▀▀▀▄▀▀▀▄\n ▀▄█▄ ▄▄ ▄ █\n █ ▀█▀ █▀ \n █▄ ▀ ▀ ▄█ \n ▄▀▄▀▀ ▀▀▀ ▀▄\n ▀█ ▀▄▀ ▀▄▄▀\n▄▀▀▀▄▀ ▀ ▄▀▀▀▄█ \n▀▄▄▄▀▄▄▄▄█▄▄▄▄▀ "], ["walk_2", " ▄▄ ▄▄▄▄▄ ▄▄▄ \n █ ▄▀ ▀ █\n █▀▀▄▄▄▀▀ ▀▄▄▀\n ▄▄█ ▄▀▄ █▄ \n█ ▀ ▄▄▀ █\n ▀▄▀ ▄ ▄ █▀ \n▄▀█ ▄▀▄ ▄▀▀▀▄\n█▄▄█▄▄▄▄▄▄█▄▄▄▄▀"]]], + ["monzaemon_x", [["angry", " ▄▄ ▄▄▄▄▄▄ ▄▄ \n █ ▄▀ ██▀ █ █ \n ▀█▄ ▀ ▄█ █▀ \n █ ▄▀█▀▄ █▀▄ \n ▀▄█▄▄▄█▄▄█▄▄ █\n █▄██▀██ █▄ ██\n █ ▀▄ ▄▀ █▀▄█\n ▀▄▄▄█▄▄█▄▄▄▀ "], ["attack", " ▄▀▀▄▀███▀▀▄▀▀▄ \n ▀▄█ █▀ ▄ ▀▄▄▀ \n ▄▀▀▄▄▄▀▀ ▄█▄ \n █▀▄█ ▀ █▄█ █▀▄\n ▀▄▀█████▀▄ ▄▀ █\n █▄▀▀ ▀▀ ██ █ █\n █ ▀▄ ▄▀ █ ▀▀\n ▀▄▄▄█▄▄█▄▄▄▀ "], ["eat_1", " ▄▀▀▄▀█▀▀▀█▄▀▀▄ \n ▀▄█▀▄▄▄▀▀ █▄▀ \n █ █ ▀ █ █▄ \n █ █████ █▀ ▀▄\n █▄▀▀▀▄▄█▄▄ █\n █▄██▀██ █▄ █ █\n █ ▀▄ ▄▀ █▀▄█\n ▀▄▄▄█▄▄█▄▄▄▀ "], ["eat_2", " ▄▄ ▄▄▄▄▄▄ ▄▄ \n █ ▄▀ ██▀ █ █ \n ▀█▄ ▀ ▄▀▄ █▀ \n █ ▄▀█▀▄ █▀▄ \n ▀▄█▄▄▄█▄▄█▄ █\n █▄██▀██ █▄ █ █\n █ ▀▄ ▄▀ █▀▄█\n ▀▄▄▄█▄▄█▄▄▄▀ "], ["happy", " ▄▀▀▄▀███▀▀▄▀▀▄ \n ▀▄█ █▀ ▄ ▀▄▄▀ \n ▄▀▀▄▄▄▀ ▀ █▄ \n █ █ ▀ █▄ ▄█▀▀▄\n ▄▀█████ █▀ ▄█\n █▄▀▀ ▀▀ ██▀█ █\n █ ▀▄ ▄▀ █ ▀▀\n ▀▄▄▄█▄▄█▄▄▄▀ "], ["injured_1", " \n \n▄▀▀▄▀███▀▀▄▀▀▄ \n▀▄█ █▀ ▄ ▀▄▄▀ \n ▄▀▀▄▄▄ ▀▀ █▄ \n █ █ ▀ █ ▄▀▄▀▄ \n ▄▀██▀██▀▀▀▄ █ █\n ▀▄█████▄▄▄█▄█▄█"], ["injured_2", " \n \n ▄▄ ▄▄▄▄▄▄ ▄▄ \n█ ▄▀ ██▀ █ █ \n ▀█▄ ▀ █▄ █▀ \n █ ▄▀█▀▄ █▀▀▄ \n ▀▄█▄▄▄█▄▄█ ▀▄ █\n █▄█████▄▄▄█▄█▄█"], ["sleep_1", " \n \n \n ▄▄ ▄▄ \n ▄▀██▀██▀▀▄ \n ▄█ ▄▄ █▄ \n█ ▀▄ ▄▀ █ █ █\n▀▄▄▄█▄▄█▄▄▄█▄█▄█"], ["sleep_2", " \n \n \n ▄██▄██▄▄ \n ▄▀ ▀▀ ▀▀ ▀▄ \n █▄ ▄▄ █▄ \n█ ▀▄ ▄▀ █ █ █\n▀▄▄▄█▄▄█▄▄▄█▄█▄█"], ["walk_1", " ▄▀▀▄▀███▀▀▄▀▀▄ \n ▀▄█ █▀ ▀▄▄▀ \n ▄▀▀▄▄▄▀ ▀ █▄ \n █ █ ▀ █ ▄▀ ▀▄\n ▄▀█████▀█▀▄ █\n █▄▀▀ ▀▀ █▄ █ █\n █ ▀▄ ▄▀ █ ▀▀\n ▀▄▄▄█▄▄█▄▄▄▀ "], ["walk_2", " ▄▄ ▄▄▄▄▄▄ ▄▄ \n █ ▄▀ ██▀ █ █ \n ▀█▄ ▀ ▄ ▄ █▀ \n █ ▄▀█▀▄ █▀▄ \n ▀▄█▄▄▄█▄▄█▄ █\n █▄██▀██ █▄ █ █\n █ ▀▄ ▄▀ █▀▄█\n ▀▄▄▄█▄▄█▄▄▄▀ "]]], + ["moonmon", [["angry", " \n ▄▀▀▀▀▄ \n █ ▄ █ \n ▀▀█▄█ █▄▄ \n ▀ ▀▄ ▀ ▄▀ \n ▄█ ▄▀▄ \n █▀▀▄▄▀▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["attack", " ▄▀▀▀▄ \n █ ▄▄▀ ▄ \n █ ▄▀ \n █▀▀▄▀▀█ \n ▄▀ ▀▄ \n ██▄ ▄█ █ \n █ ██ █ \n ▀▄▄▄▄▄▀ "], ["eat_1", " ▄▀▀▀▄ \n █ ▄▄▄▀ \n ▄▄█ █▄▄ ▀ \n ▀▄ ▀ ▄▀ \n ▄▀ ▀▄ \n █ █ █ █ \n █ ██ █ \n ▀▄▄▄▄▄▀ "], ["eat_2", " ▄▀▀▀▄ \n █ █ \n █ █ \n █▀▀▄▀▀█ \n ▄▀ ▀▄ \n █▀▄ ▄▀▄ █ \n █ ▄▄▄▄ █ \n ▀▄▄▄▄▄▀ "], ["happy", " ▄▀▀▀▄ \n █ ▄▄▄▀ \n ▄▄█ █▄▄ ▀ \n ▀▄ ▀ ▄▀ \n ▄▀▄ ▄▀█▄ \n █ ▄▄▄▄ █ \n ▀▄ ▀▀ ▄▀ \n ▀▀▀▀▀ "], ["injured_1", " \n \n ▄▀▀▀▀▄ \n ▄▄█ ▄▄▄ █ \n ▀▄ ▀ ▄█ █ \n ▄▀ ▀█▀ \n █ ▄█ █▄ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n ▄▄▄▄ \n ▄▀ ▀▄ \n █▀▀▄▀▀█ █ \n ▄▄▀ ▀█▄▄▀ \n ▄▀ ▄ ▄ ▀▄ \n █▄▄██▄▄██▄▄▄█ "], ["sleep_1", " \n \n ▄▀▀▀▀▄ \n ▄▄█ ▄▄▄ █ \n ▀▄ ▀ ▄█ █ \n ▄▀ ▀█▀ \n █ ▄▄ ▄▄ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n \n ▄▀▀▀▀▄ \n ▄▄█ ▄▄▄ █ \n ▀▄ ▀ ▄█ █ \n ▄▀ ▀█▀ \n █ ▀▀ ▀▀ █ \n ▀▄▄▄██▄▄▄▄▀ "], ["walk_1", " ▄▀▀▀▄ \n █ █ \n █ █ \n █▀▀▄▀▀█ \n ▄▀ ▀▄ \n █ ▄ ▄ █ \n █ ▀▄▄▀ █ \n ▀▄▄▄▄▄▀ "], ["walk_2", " ▄▄▄ \n █ █ \n ▀▄ ▄▀ \n ▄▄█ █▄▄ \n ▀▄ ▀ ▄▀ \n ▄▀ ▀▄ \n █ █ █ █ \n ▀▄▄▄██▄▄▄▄▀ "]]], + ["morphomon", [["angry", " \n █▀▀▄ ▄▀▀▀▀█ \n █ ▄▀▀▀▀ █ \n ▀█ █▀ \n ▄▀█▄ ▄█ ▀▄ \n █▄█▄ ▄▄ ▄▀▄▄█\n ▄▀█▀ ▀▀▀▄ \n ▀███▄▄▄▄███ "], ["attack", " █▀▀▄ ▄▀▀▀▀█ \n █ ▄▀▀▀▀ █ \n ▀█ █▄ ▄█ █▀ \n █▀▀ ▄▄▄ ▀▀█\n ██▄ ███ ▄█▄▀ \n ▀▄▀ ▀▀▀ ▀ ▄▀ \n █▄ ▄█ \n █▄▄█▀▄▄█ "], ["eat_1", " █▀▀▄ ▄▀▀▀▀█ \n █ ▄▀▀▀▀ ▄ █ \n ▀█ ▄ ▄▄ █▀ \n ▄▀█▄ ▄██ ▀▄ \n █▄█▄ ███ ▄▀▄▄█\n ▄▀▀ ▀▀▄ \n █▄█▄ ▄▄█ \n █▄▄█▀▄▄█ "], ["eat_2", " ▄▄▄ ▄▄▄▄▄ \n █ █▄▄▄▀ █ \n █▄▀ ▀▄▄▀ \n █▄▀▄ ▄▀▄▀▄ \n ▄▀▄ ▄ ▄ ▀▄\n ▀▀▀█▄ ▄▄▀ ▀▀▀\n ▄▀▄ ▀▄ \n ▀███▄▄▄▄███ "], ["happy", " █▀▀▄ ▄▀▀▀▀█ \n █▄▀▀▀▀▀ ▀▄ █ \n █▄▀▄ ▄▀▄█▀ \n ▄▀ ▄▄▄▄▄ ▀▄ \n █▄█▄▀███▀ ▄▀▄▄█\n ▀▄▀▀ ▀▀ ▄▀ \n ▀█▄ ▄█ \n █▄▄█▀▄▄█ "], ["injured_1", " \n ▄▄▄▄ ▄▄▄▄▄▄ \n ▀▄ ▄▀▀▀▀ ▄ ▄▀ \n ▀█ █ \n █ ▄█ █▄ █ \n █▀█ ▄ ▄▄▀█ \n ▀▄ ▀▄ ▄▀ ▄▀ \n ▄███▄█▄███▄ "], ["injured_2", " \n \n ▄▀▀▀█▄▄▄▀▀▀▀▀█ \n █▄▀ ▀▄▀ \n █ ▄ ▄ ▀▄ \n █▀▄▀▀ ▀▀▄▄▀█ \n ▀▄ ▀▄▀ ▄▀ ▄▀ \n ▄███▄█▄███▄ "], ["sleep_1", " \n █▀▀ ▀▀▀█ \n █ █ \n ▀ \n ▄ ▄ \n █▄▄ ▄▄█\n ▄▀ ▀▄ \n ▀ ▀ "], ["sleep_2", " ▄▄▄ ▄▄▄▄▄ \n █ █▄▄▄▀ █ \n █▄▀ ▀▄▄▀ \n █ ▀▄ \n ▄▀▄ ▀▀ ▀▀ ▄ ▀▄\n ▀▀▀█ ▀▀ ▄▀ ▀▀▀\n ▄█▀▀▄ ▄▀▀█▄ \n ▀█▄▄█▄▄█▄▄█▀ "], ["walk_1", " █▀▀▄ ▄▀▀▀▀█ \n █ ▄▀▀▀▀ ▄ █ \n ▀█ ▄ ▄▄ █▀ \n ▄▀█▄ ▄██ ▀▄ \n █▄█▄ ▀ ▄▀▄▄█\n ▄▀▀ ▀▀▄ \n █▄█▄ ▄▄█ \n █▄▄█▀▄▄█ "], ["walk_2", " ▄▄▄ ▄▄▄▄▄ \n █ █▄▄▄▀ █ \n █▄▀ ▀▄▄▀ \n █▄▀ ▀█▄▀▄ \n ▄▀▄▀▀ ▄ ▀▀▀▄ ▀▄\n ▀▀▀█▄ ▄▄▀ ▀▀▀\n ▄▀▄ ▀▄ \n ▀███▄▄▄▄███ "]]], + ["motimon", [["angry", " \n \n ▄▄▄▄▄ \n ▄▀ ▀▄ \n █ █ \n █▀▀ ▀▀ █ \n ▀▄ ▀▀ ▄▀ \n ▀▄▄▄▄▀▄▄▄▄▀ "], ["attack", " \n ▄▄▄▄▄▄▄ \n ▄▀ ▄ ▀▄ \n █▀█▀▄▄▀▀ █ \n ▀▄ ▀▄ \n ▄ ▄ ▄ █ █ \n █▀▀▀▀▀▀▀▀ █ \n ▀▄▄▄▄▀▄▄▄▄▄▄▀ "], ["eat_1", " \n \n ▄▀▀▀▀▀▄ \n █▄▄▄ ▄▄ ▀▄ \n ▀▄ ▀ █ \n █ █ \n ▄▄▄▄▄▀ ▄▀ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["eat_2", " \n \n \n ▄▄▄▄▄▄ \n ▄▀▄ ▄ ▀▄ \n █▀ ▀ ▀ ▀ ▀▄ \n █▄▄▄▄▄▄▄▀ █ \n ▀▄▄▄▄▄▄▄█▄▄▄▀ "], ["happy", " \n ▄▄▄▄▄ \n ▄▀▄ ▄▀▄ \n █ ▄▀ ▀▄ █ \n █ ███████ █ \n █ ███████ █ \n ▀▄ ▀▀▀▀▀ ▄▀ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["injured_1", " \n \n \n \n ▄▀▀▀▀▀▀▀▄ \n ▄▀▀ ▄ ▀▀ ▀▄ \n █ ▀ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n \n \n \n ▄▀▀▀▀▀▀▀▄ \n █ ▀▄ \n ▀▄▄██▄▄██▄▄▄▄▀ "], ["sleep_1", " \n \n \n \n ▄▄▄▄▄▄ \n ▄▀▄▄ ▄▄▀▄ \n ▄▀ ▄▄▄▄ ▀▄ \n ▀▄▄▄▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n \n \n ▄▀▀▀▀▀▀▄ \n █ ▀▀ ▀▀ █ \n █ ▀▀ █ \n █ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["walk_1", " \n \n ▄▄▄▄▄ \n ▄▀ ▀▄ \n █ ▄ ▄ █ \n █ ▀ ▀ █ \n ▀▄ ▀▀▀ ▄▀ \n ▀▄▄▄▄▀▄▄▄▄▀ "], ["walk_2", " \n \n \n ▄▀▀▀▀▀▄ \n ▄▀ ▀▄ \n █ █ █ █ \n █ ▀ █ \n ▀▄▄▄▀▄▄▄▀ "]]], + ["mummymon", [["angry", " ▄█████▄ \n ▄▀▀▀ ▄▀██ \n █▄▄▄▀▀ ▄▀ \n █ █ ▄██ \n ▄▀▄▄█▀█▄█▀ \n █ █▄▀▄▄█ █ \n ▀█ ▄▄ ▀█▀ \n █▄▄█ █▄▄█ "], ["attack", " ▄▄▄▄▄ \n ███████▄ \n █ ▀▄█▀▀▄ \n █▀▀▀▄ █▄ \n █▄▄▄▄▄▀██ \n ▄▀▄▀▄▀ █▀▀▄ \n ▀▄█▀ ▀▀█▄▄▀ \n █▄▄█▀▀▀█▄▄█ "], ["eat_1", " ▄▄▄▄▄ \n ███████▄ \n █ ▄▀▄▀▀▄ \n █▀▀▀▄ █▄ \n █▄▄▄▄▄▀██ \n ▄▀▄▀▄▀ █▀▀▄ \n ▀▄█▀ ▀▀█▄▄▀ \n █▄▄█▀▀▀█▄▄█ "], ["eat_2", " ▄█████▄ \n ▄▀▀▀█▀███ \n █▄▄▄ ▀▀ ▄▀ \n █ █ ▄██ \n ▄▀▄▄█▀█▄█▀ \n █ █▄▀▄▄█ █ \n ▀█ ▄▄ ▀█▀ \n █▄▄█ █▄▄█ "], ["happy", " ▄█████▄ \n ▄▀▀▀▀█▀██ \n █▄▄▄▀ ▀ ▄▀ \n ▀▄ █ ▄██ \n ▄▀█▀█▀█▄█▀ \n █ █▄▀▄▄█ █ \n ▀█ ▄▄ ▀█▀ \n █▄▄█ █▄▄█ "], ["injured_1", " \n ▄▄▄▄▄ \n ███████▄ \n █ ▄ ▀▀▄ \n █▀▀▀▄▀▀ █▄ \n ▄█▄▄▄▄▄▀██ \n ▄▀▀█▄▀▄▄█▀▀▄ \n █▄▄█▄▄▄▄█▄▄█ "], ["injured_2", " \n \n ▄█████▄ \n ▄▀▀▀▀▀▀██ \n █▄▄▄ █▄ ▄▀ \n ▀▄ ▀ ▄██ \n ▄▀▀██▀██▄▀▀▄ \n █▄▄█▄▄▄▄█▄▄█ "], ["refuse", " ▄▄▄▄▄ \n ███▀▀██▄ \n █ ▄█ ▀▀▄ \n █▀▀▀▄ █▄ \n █▄▄▄▄▄▀██ \n ▄▀▄▀▄▀ █▀▀▄ \n ▀▄█▀ ▀▀█▄▄▀ \n █▄▄█▀▀▀█▄▄█ "], ["sleep_1", " \n ▄█████▄ \n ▄▀▀▀▀▀▀██ \n █▄▄▄ ▀▀ ▄▀ \n ▀▄ ▀ ▄██ \n ▄██▀█▀█▄█▀ \n █ █▀▄▄█ █ \n █▄██▄▄▄▄███▄ "], ["sleep_2", " \n ▄▄▄▄▄ \n ███████▄ \n █ ▄▄▀▀▄ \n █▀▀▀▄ █▄ \n ▄█▄▄▄▄▄▀██ \n █▀▀▄▀▄▄█▀▀▄ \n ██▄▄█▄▄▄█▄▄█ "], ["walk_1", " ▄█████▄ \n ▄▀▀▀█▀███ \n █▄▄▄ ▀▀ ▄▀ \n ▀▄ ▀ ▄██ \n ▄▀█▀█▀█▄█▀ \n █ █▄▀▄▄█ █ \n ▀█ ▄▄ ▀█▀ \n █▄▄█ █▄▄█ "], ["walk_2", " ▄▄▄▄▄ \n ███████▄ \n █ ▀▄█▀▀▄ \n █▀▀▀▄ █▄ \n █▄▄▄▄▄▀██ \n ▄▀▄▀▄▀ █▀▀▄ \n ▀▄█▀ ▀▀█▄▄▀ \n █▄▄█▀▀▀█▄▄█ "]]], + ["murmukusmon", [["angry", " ▄▀▀█ \n ▄▀▀▀▀▀▄ █▄███▀\n █▄▄▄▄▄▀ ████ \n ▄▄▄█ █▀ █ \n █▀▄▄▄▄▀▀▀▄▄▄▀ \n▄▀▀▀█▄▄▄▄▀▀ █ \n▀▄▄▄▀ █▄█▄▄▄█ \n █▄▄▄█ █▄▄▄█ "], ["attack", " ▄▄▄ \n██▄▄▀▀▄███▀▀▄███\n ██ ▀▀▀▀ ███▀ \n█ █ ▀▄ ▄▀ ▄▀ █ \n▀▄▄█▄ ▄▄▀█▄▄▄▀ \n▄▀ ▄█▀▀ █▀▄ ▀▄\n█ █▄▀███▀▀▄█ █\n ██▄▄█ █▄▄██▀ "], ["eat_1", "▄▄ ▄▄ ▄███▄ ▄▄▄\n▀██▀ ▄███▀ ▄███▀\n▄▀█ ▄ ▄ █▀▀▄ \n█ ▀▄ ▀ ▀ ▄█ █ \n █▀▀█▄▄▀▀ ██▀▀▄ \n█ █▀▄▄▄▄▄█ █ █\n▀▄▄█▀ ▀▄▄▀ ▀█▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["eat_2", "▄▄ ▄▄ ▄███▄ ▄▄▄\n▀██▀ ▄███▀ ▄███▀\n▄▀█ ▄ ▄ █▀▀▄ \n█ ▀▄ ▀ ▀ ▄█ █ \n █▀▀█▄▄▀▀ ██▀▀▄ \n█ █▀▄▄▄▄▄█ █ █\n▀▄▄█▀ ▀▄▄▀ ▀█▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["happy", "▄▄ ▄▄ ▄███▄ ▄▄▄\n▀██▀ ▄███▀ ▄███▀\n▄▀█ ▄ ▄ █▀▀▄ \n█ ▀▄ ▀ ▀ ▄█ █ \n █▀▀█▄▄▀▀ ██▀▀▄ \n█ █▀▄▄▄▄▄█ █ █\n▀▄▄█▀ ▀▄▄▀ ▀█▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["injured_1", "▄▄ ▄▄ ▄███▄ ▄▄▄\n▀██▀ ▄███▀ ▄███▀\n▄▀█ ▄ ▄ █▀▀▄ \n█ ▀▄ ▀ ▀ ▄█ █ \n █▀▀█▄▄▀▀ ██▀▀▄ \n█ █▀▄▄▄▄▄█ █ █\n▀▄▄█▀ ▀▄▄▀ ▀█▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["injured_2", " \n ▄▄ ▄███▄ \n███▀ ▄███▀ ▄████\n▄▀█ ▄ ▄ ███▀ \n█ ▀▄▀▀ ▀▀▄█ █ \n █▀▀█▄▄▀▀ ██▀▀▄ \n█ █▀▄▄▄▄▄█ █ █\n▀▄▄██▄█▄▄█▄██▄▄▀"], ["refuse", "▄▄ ▄▄ ▄███▄ ▄▄▄\n▀██▀ ▄███▀ ▄███▀\n▄▀█ ▄ ▄ █▀▀▄ \n█ ▀▄ ▀ ▀ ▄█ █ \n █▀▀█▄▄▀▀ ██▀▀▄ \n█ █▀▄▄▄▄▄█ █ █\n▀▄▄█▀ ▀▄▄▀ ▀█▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["sleep_1", "▄▄ ▄▄ ▄███▄ ▄▄▄\n▀██▀ ▄███▀ ▄███▀\n▄▀█ ▄ ▄ █▀▀▄ \n█ ▀▄ ▀ ▀ ▄█ █ \n █▀▀█▄▄▀▀ ██▀▀▄ \n█ █▀▄▄▄▄▄█ █ █\n▀▄▄█▀ ▀▄▄▀ ▀█▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["sleep_2", "▄▄ ▄▄ ▄███▄ ▄▄▄\n▀██▀ ▄███▀ ▄███▀\n▄▀█ ▄ ▄ █▀▀▄ \n█ ▀▄ ▀ ▀ ▄█ █ \n █▀▀█▄▄▀▀ ██▀▀▄ \n█ █▀▄▄▄▄▄█ █ █\n▀▄▄█▀ ▀▄▄▀ ▀█▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["walk_1", "▄▄ ▄▄ ▄███▄ ▄▄▄\n▀██▀ ▄███▀ ▄███▀\n▄▀█ ▄ ▄ █▀▀▄ \n█ ▀▄ ▀ ▀ ▄█ █ \n █▀▀█▄▄▀▀ ██▀▀▄ \n█ █▀▄▄▄▄▄█ █ █\n▀▄▄█▀ ▀▄▄▀ ▀█▄▄▀\n █▄▄▄█ █▄▄▄█ "], ["walk_2", " ▄▄▄ \n██▄▄▀▀▄███▀▀▄███\n ██ ▀▀▀▀ ███▀ \n█ █ ▀▄ ▄▀ ▄▀ █ \n▀▄▄█▄ ▄▄▀█▄▄▄▀ \n▄▀ ▄█▀▀ █▀▄ ▀▄\n█ █▄▀███▀▀▄█ █\n ██▄▄█ █▄▄██▀ "]]], + ["mushroomon", [["angry", " ▄▄▄▄▄▄▄ \n ▄▀██ ██ ▀▄ \n ██▀ ██▀▄ \n █ ▄▄▀█▀█▀▄ ██▄\n ▀▄ █ ▄▄ ▀▄ █\n ▀█ ▄ █▀ \n ▀▄█▀▀ ▀▄▄█ \n █▄▄██▀▀█▄▄▄█ "], ["attack", " ▄▄▀▀██▀▀▄ \n ▄▄▀▀▀ ▀▀ ▄▄▀▄ \n█ ▄▄▀█▀█▀▄ ▀▀▄█ \n▀▄▄▀ ▄ ▀▄ ▀▀▄\n █▄▄▄▄▀▀ █ █\n █▀▀▀▄ ▄ █▀ \n ▄▀█▀▀▀▀▀ ▀▄▄▀ \n █▄██▀▀▀█▄▄▄█ "], ["eat_1", " ▄██▀▀██▀▄ \n ▄▀ ▀▀ ▀▀▄▄█ \n █ ▄▀█▀█▀▄ ▀▀▄█ \n █ █▄ ▄▄▀▄ ▀▀▄\n ▀█▄▄▄▄ ▄█ █\n █ ▄█▀▀█ ▄ █▀ \n ▀█▀▀▀▀ ▄▄█▄ \n █▄██▀▀█▄▄▄▄█ "], ["eat_2", " ▄▄▄▄▄▄▄ \n ▄▀██ ██ ▀▄ \n ██▀ ██▀▄ \n █ ▄▄▀█▀█▀▄ ██▄\n ▀▄ █▄ ▄▄ ▀▄ █\n ▀█ ▄ ▄ █▀ \n ▀▄█▀▀ ▀▄▄█ \n █▄▄██▀▀█▄▄▄█ "], ["happy", " ▄▄▀▀██▀▀▄ \n ▄▀▀▀ ▀▀▄▄▀▀▄ \n █ ▄▀▀▀▀▀▄▀▀ ▄█ \n █▄▀▄ ▄▀▄ ▀▄▄▀▀▄\n█ ▀▄▄▄▄▄▄▄ ▀ █ █\n▀▄▄██▀▀▀▀█ ▄▄▀▄▀\n ▄█▀▀▀▀ ▄█▄▀ \n █▄▄██▀▀█▄▄▄█ "], ["injured_1", " \n ▄▀▀██▀▀█▄ \n █▀▄▄▀▀▄▄▀▀█ \n ▄█ ▀▀ ▀▀ ▀▀▄\n █▀ ▄█▀█▀█▀█▄ █\n █▄█▄▄ ▄▄ █▄█ \n █ ▄█ ▄█▄ █\n █▄▄█▄█▄▄█▄▄▄█ "], ["injured_2", " \n \n ▄▄▄▄▄▄▄ \n █▄▄▀▀▄▄▀▀▄ \n ▄▀ ▀▀ ▀▀ ▀▀▄\n ██ ▄▀▀▀▀▀▀▀▄ ██\n ▀▄▄█▀▀ ▀▀█▄▄▀\n █▄▄▄█▄▄▄▄▄█▄▄▄█"], ["sleep_1", " \n ▄▄▄▄▄▄▄ \n ▄█▀▀▄▄▀▀▄█▄ \n ▄▀▀▄▄▀▀▄▄▀▀█▄ \n ██ ▀▀ ▀▀ ▀▀█\n ▀▄▄█▀▀▀▀▀▀▀▄▄▄▀\n ▄█▀ ▀▀▄█▄ \n █▄▄█▄█▄▄█▄▄▄█ "], ["sleep_2", " \n ▄▀▀██▀▀█▄ \n █▀▄▄▀▀▄▄▀▀█ \n ▄█ ▀▀ ▀▀ ▀▀▄\n █▀▄▀█▀█▀█▀█▀▄ █\n ▀▄█▄ ▄▄ █▄▀ \n ▄█ ▄ ▄█▄ \n █▄▄█▄▄▄▄█▄▄▄█ "], ["walk_1", " ▄██▀▀██▀▄ \n █▄▀▀▄▄▀▀▄██ \n ▄█▀▀ ▀▀ ▀▀ █▄\n █ ▄▀█▀█▀█▀█▀▄ █\n ▀▄█ ▄ ▄ █▄▀ \n █ █ ▀ ▀ ▄▀ █ \n ▀█▄ ▀▀ ▄▄█▀ \n █▄▄█▀▀█▄▄▄█ "], ["walk_2", " ▄▄▄▄▄▄▄ \n ▄▀██ ██ █▄ \n ▄██ ██ ██▀▄ \n █▀ ▄▄▄▄▄▄▄▄▄ ▀█\n ▀▄▀▄▀ ▀ ▀ ▀▄▀▄▀\n ▀█ █ █ █▀ \n ▄▀█▄ ▄▄█▀▄ \n ▀█▄▄█▄▄█▄▄▄█▀ "]]], + ["myotismon", [["angry", " ▄ ▄▀██▀▀▀▄ ▄ \n ██ ▀ ▄ ██▀█ \n ██▀ ▀▀ ██ █ \n ▀█▄▀▀▀▀▀▄▄█▄▀ \n █ ▄▄█ ▀▄ \n █ ▄▀ █ \n █▄ █ ▀▄ \n▄█▄▄▄███▄▄▄▄▄▄█▄"], ["attack", " ▄▀██▀▀▀▄ ▄ \n█▄ ▀ ▄█ ██▀█ \n█▄▄▄▄▄▄ ██ █ \n█ ▄▄▄ █ █▄█ \n ██████ ▄▀▀▄▀▄▄ \n█▀▄▄▄▄▄▀ ▄ █ █ \n▀▄▄█▄▄▄▄█▄▀▀ █ \n▄███▀▀▀███▄▄▄▀ "], ["eat_1", " ▄▀██▀▀▀▄ ▄ \n █▄ ▀ ▄▀ ██▀█ \n █▄▄▄▄▄▄ ██ █ \n ▀▄███▄█ █▄▀▄ \n █████▀▄▀ ▄█ \n █ ▄▀ █▀▀ █ \n █ ▄█████▄ ▀▄\n ▄███ ▀█████▀▀▀"], ["eat_2", "▄ ▄▀██▀▀▀▄ ▄ \n██ ▀ ▄ ██▀█ \n██▀ ▀ ██ █ \n █ ▄▀▀▀▀▀▄█▄▀ \n ▄▀ █▄▀▄ \n █ ▄▀ ▀▄ \n █ ▄██ █ \n ▄███ █▄▄▄▄▄█▄ "], ["happy", " ▄ ▄▀▀█▀▀▀▄ ▄\n █▀█▄▀▄ ▄▀▄ ██▀█\n ▀▄▀▄▄▄▄▄▄▄ █▀▄▀\n ▄█▄█ ▄▄▄ █ █▄▀█\n █ ▀███████ █ ▄█\n █▀▄█▀▀▀▀▀▄█▄▀ █\n █ ████████ █\n ▀▄████ ████▄▀▀"], ["injured_1", " ▄▄▄▄▄▄ \n █▄▀ █▀ ▀▄▄▄█ \n ██▄█ █▄ ██ █ \n ██ ▄▄▄▄ █▀▄▀ \n █▀ █▄▀█▀ \n █ █▀▀ █ \n █ █ ▀▄ \n █▄▄▄█▄▄▄▄▄▄▄▄█▄"], ["injured_2", " \n ▄ ▄▀██▀▀▀▄ ▄ \n ██ ▀ ██▀█ \n ██▀ ▀▄▄ ██ █ \n ▀█▄▄▄▄▄ ▄█▄▀ \n █ ▄▄█▀ ▀▄ \n ▄▀ ▄▀ ▄█ \n █▄▄▄█▄▄▄▄▄▄▄█▄ "], ["sleep_1", " \n \n \n \n ▄▀▀█▀▀▀▀▀▀▀▀█ \n █▄ ▀█▀▀▀▀ █ \n █ ▀▀▀▀▀▀▀▀▀▀▀█ \n ▀▄▄▄▄▄▄▄▄▄▄▄█ "], ["sleep_2", " \n \n \n ▄▄▄▄▄▄▄▄▄▄▄▄ \n ▄▀ ▄█▄▄▄▄ █ \n █▀▄▄█▄▄▄▄▄▄▄▄█ \n ▀▄ █ \n ▀▀▀▀▀▀▀▀▀▀▀▀ "], ["walk_1", "▄ ▄▀███▀▀▄ ▄\n█▀██▄ ▀ ▄ ██▀█\n▀▄▀█ ▀ ▀ ██ █\n ▀▄█ ▄▄▀▀▀▀▀█ █ \n ▄▀ ▄▀▀█ \n █ ▄▀ █ \n █ ▄▀ ▀▄ \n▄█▄▄▄▄███▄▄▄▄▄█▄"], ["walk_2", "▄ ▄▀███▀▀▄ ▄\n█▀██▄ ▀ ▄ ██▀█\n█ ██ ▀ ▀ ██ █\n▀█▄█ █▀▀▀█ █▄█ \n█▄ ▀█▄▄▄▄▄▄▀▀ ▄█\n█ ▀▄█ ▀ ▀ ▄▄▀ █\n█ ████████ █\n▀▀▄████ ████▄▀▀"]]], + ["myotismon_x", [["angry", "█▄█▄▀██▀▀█▄▀▀ ▄ \n█ █▀█▄▄▄█▀ ██▀█ \n█ █ ▀▀ ██ █ \n ▀█▄████▀▄▄█▄▀ \n ▀███ █████▄ \n ███▄▀██████ \n ▄█████▄▀████▀ \n▄█████████▄███▄ "], ["attack", " ▄▄▄▀██▀▀█▄▄▄ \n▄ █▀█▄▄███▀█ █ \n▀██▄▄▄▄▄ █▄█▀ \n ▀█ ▄▄▄ █ █▀▄▄▄\n█▀███████ █▄██ █\n▀▄██▄▄▄▄▄███▀▀▀ \n ▄██ ▄▄ ▀███▄▄ \n ▀▀█▄▄█ █▄▄█▀▀ "], ["eat_1", " ▀█▄▀██▀██▄█▀ \n █▀█▄▄██▀ █ ██ \n █▄▄▄▄▄▄ ███▀ \n ▀▄███▄██ ██▀▄ \n ▄█▀█▀▀▀▄▄█▄█▄ \n ██▀▄█▀▀▀▀██▀█ █\n████▀ ▄▄ ▀███▄▀▀\n█ █▄▄▄█ ▀▄▄▄█▀█▄"], ["eat_2", " ▄▀▄▀██▀▀█▄▀▀ ▄ \n ██▀█▄▄▄█▀ ██▀█ \n ██ ▀▀ ██ █ \n ▀█▄████▀▄▄█▄▀ \n ▄███▀▄▄███▀ \n ███ ██████ \n ▀██▄▀██████▄ \n▄█████▄███████▄ "], ["happy", " ▄▄▄▀███▀█▄▄▄ \n█▄ █▀█▄▄▄██▀█ ▄█\n ███ ▄▀▀▀ ▄ ███▀\n ██ ██████ ██ \n█▀▄▀▄▀████▀▄█▄▀█\n▀▄████▄▄▄▄████▄▀\n ▄█▀ ▄▄ ▀█▄▄ \n ▀█▄▄█▀▀█▄▄█▀▀ "], ["injured_1", " \n ▄ ▄ \n ▄▀█▀██▀▀▀█▀ ▄ \n ██▄█▀▀█▄ ██▀█ \n ██▀ ▀▀▄██ █ \n ▀█▄▀▀▀▄ ▄█▄▀ \n ▄███▀███████ \n ████▄█████████▄"], ["injured_2", " \n \n █▄▄▄▄▄▄▄▄█ \n█▄▀▄██▄ ▀▄▄▄█ \n███▀ ▀█▄ ██ █ \n██ ▄▄▄ ▀█▀▄▀ \n ▀█▄▄▄▀▄▄███▄▄ \n ████▄█████████▄"], ["sleep_1", " \n \n \n ▄▄▄▄▄▄▄▄▄▄▄▄ \n ▄██▀ ▀▀▀▀▀████ \n █▄▀▀ ▀▀▀▀▀▀▀▀█ \n ██████████████ \n ▀████████████ "], ["sleep_2", " \n \n \n ▄██▀█████████ \n █▀█▄ ▄▄▄▄▄████ \n ██▄▄▄▄▄▄▄▄▄▄▄█ \n ▀█████████████ \n ▀▀▀▀▀▀▀▀▀▀▀▀ "], ["walk_1", "▄ ▀█▄▀███▀▀▄█▀ ▄\n█▀███▄ ▀ ▄█▀██▀█\n▀▄▀█ ▀███▀ ██ █\n ▀▄█ ▄▄▄▄▄▄ █ █ \n ▄██████▀███ \n ██████ ████ \n ██████ █████▄ \n▄█████▄▄███████▄"], ["walk_2", " ▄▄▄▀███▀▀▄▄▄ \n█▄ ███▄▀▄██▀█ ▄█\n▀███ ▀▀▀▀▀ ███▀\n ▀██ █▀▀▀█ ██▀▀ \n ▀▄▀█▄▄▄▄▄█▀▄▀ \n▄▀████▄ ▄█████▀▄\n█▄▀▄█▀ ▄ ▀██▄▀▄█\n ▀█▄▄█ █▄▄█▀▀ "]]], + ["nanimon", [["angry", " ▄▀▀▀▀▀▀▀▀▄ \n █ ▄█▀█▀█▄ ██ \n █ ████████ █ ▄\n █ █▀█▀█▀██ █▀ \n █ ▀▀▀▀▀▀▀▀ █ \n ▀█▄▄▄▄▄▄▀█ \n ▄█▄█ █▄█▄ \n █▄█▄█ █▄█▄█"], ["attack", " \n ▄ \n ▄▄▄█▄ \n ▄▀ ▀ ▀▄ \n █▄▄█▄▄█▄▄▄█ \n ████▀▀███▀█ \n ▄█▄▄▀▀▀▀▄ ▄█▄▄ \n█▄█▄█▄█▄▄█▄█▄█▄█"], ["eat_1", " ▀▄ \n ▄▄█▄▄ \n ▄▀▄ ▄ ▀▄ \n ██▀████▀███ \n █▀▀▀ ▀▀▀ █ \n ▀▄▄▀▀▀▀▄ ▄▀ \n ▄█▄█▄██▄█▀▄█▄▄ \n█▄█▄█ █▄█▄█"], ["eat_2", " ▄▀▀▀▀▀▀▀▀▄ \n █ █▀█▀█▀█ ██ \n █ ███████ █ \n █ ██▀█▀██ █▄ \n █ ▀▀▀▀▀ █ ▀\n ▀█▄▄▄▄▄▄▀█ \n ▄█▄█ █▄█▄ \n █▄█▄█ █▄█▄█"], ["happy", " ▄▀▀▀▀▀▀▀▀▄ \n █ █▀█▀█▀█ ██ \n █ ███████ █ \n █ ██▀█▀██ █▄ \n █ ▀▀▀▀▀ █ ▀\n ▀█▄▄▄▄▄▄▀█ \n ▄█▄█ █▄█▄ \n █▄█▄█ █▄█▄█"], ["injured_1", " \n ▄ \n ▄▄▄█▄ \n ▄▀ ▀ ▀▄ \n █▄▄█▄▄█▄▄▄█ \n ████▀▀███▀█ \n ▄█▄▄▀▀▀▀▄ ▄█▄▄ \n█▄█▄█▄█▄▄█▄█▄█▄█"], ["injured_2", " \n ▄ \n ▄▄▄█▄ \n ▄▀ ▀ ▀▄ \n █▄▄█▄▄█▄▄▄█ \n ████▀▀███▀█ \n ▄█▄▄▀▀▀▀▄ ▄█▄▄ \n█▄█▄█▄█▄▄█▄█▄█▄█"], ["refuse", " ▀▄ \n ▄▄█▄▄ \n ▄▀ ▀▄ \n ███▄▄▄▄▄███ \n █ ▀▀▀▀▀▀▀ █ \n ▄▄▄█▄ ▄▀ \n█▄▄▄█ ▀▄▄▄▄▄█▄█ \n █▄▄▄█"], ["sleep_1", " \n ▄ \n ▄▄▄█▄ \n ▄▀ ▀ ▀▄ \n █▄▄█▄▄█▄▄▄█ \n ████▀▀███▀█ \n ▄█▄▄▀▀▀▀▄ ▄█▄▄ \n█▄█▄█▄█▄▄█▄█▄█▄█"], ["sleep_2", " \n ▄ \n ▄▄▄█▄ \n ▄▀ ▀ ▀▄ \n █▄▄█▄▄█▄▄▄█ \n ████▀▀███▀█ \n ▄█▄▄▀▀▀▀▄ ▄█▄▄ \n█▄█▄█▄█▄▄█▄█▄█▄█"], ["walk_1", " ▀▄ \n ▄▄█▄▄ \n ▄▀▄ ▄ ▀▄ \n ██▀████▀███ \n █▀▀▀ ▀▀▀ █ \n ▀▄▄▀▀▀▀▄ ▄▀ \n ▄█▄█▄██▄█▀▄█▄▄ \n█▄█▄█ █▄█▄█"], ["walk_2", " ▄▀ \n ▄▄█▄▄ \n ▄▀ ▄ ▀▄ \n ██▀██▀█████ \n █▀▀ ▀▀▀ █▀█▀▄\n ▀▄█▀▀▀▄▄ ▄█ █\n █▄█▄█▄▄█▀ ▀▄▄▄▀\n█▄█▄█ "]]], + ["nefertimon_x", [["angry", "▄▄ ▄▄ ▄▄▄▄▄\n█ ▀▄▀▀█ ▀▄▀ ▄▀\n █▄ ▄▄▄ █ ▀▀▀█\n █ ▀▀ ▄ █ █ ▄▀ \n █▀ ▀▀ █ █▄▀ \n █▀█▀█▀▄█ █ ▄█ \n ▄▀█▀▀█▀█▀ █▄ █ \n█▄▄█▀▀█▄▄█▀█▄█▄█"], ["attack", "█▀▄ ▄▄█▀▄ ▄▀▀▀▀█\n▀▄▄▀ ▄█▄ ▀▄ ▄█▄\n █ ▀▀ ▄ █ ▀▄ ▄▀\n █▀ ▀▀ █ █ █ \n █████ █ ▄▀▀▄ \n █▄▄▄▄██▄▀▄▀▀▄ \n ▄▀ █▄▄▀ ██▄ ▄▀ \n█▄▄█▀█▄▄█▀█▄█▄█ "], ["eat_1", "█▀▄ ▄▄█▀▄ ▄▄▄▄▄\n▀▄▄▀ ▄█▄ ▀█ ▄▀\n █▄▀▀▄▄ █ █ ▀▀█\n █ ▄▄▄ █ █ ▄▀ \n █ ███ █ █▄▀ \n ▀▄███▄▀█ █ ▄█ \n ▄█▀▄ ▄▀█▀▄█▄ █ \n█▄▄█▀▀█▄▄█▀█▄█▄█"], ["eat_2", "▄▄ ▄▄ ▄▄▄▄▄\n█ ▀▄▀▀█ ▀▄▀ ▄▀\n █▄ ▄▄▄ █ ▀▀▀█\n █▄▀▀ ▄ █ █ ▄▀ \n █ ▀ ▀ ▀█ █▄▀ \n ▀▄███▄▀█ █ ▄█ \n ▄█▀▄ ▄▀█▀▄█▄ █ \n█▄▄█▀▀█▄▄█▀█▄█▄█"], ["happy", "█▀▄ ▄▄█▀▄ ▄▄▀▀█\n▀▄▄▀ ▄█▄ ▀█ ▄▀▄\n █▄▀▀▄▀▄█ █ █ \n █▄▄▄▄▄ █ █ █ \n █▀███▀ █ █▄▀ \n ▀▄▄▄▄▄▀█ █ ▄█ \n ▄█▀▄ ▄▀█▀▄█▄ █ \n█▄▄█▀▀█▄▄█▀█▄█▄█"], ["injured_1", " \n▄▄ ▄▄ \n█ ▀▄▀▀█ ▀▄▄▄ \n █▄ ▄▄▄ █ ▀▄ \n █ ▀▀ █ █ █ \n ██ █▄ █ █▀▄ █\n▄▀▄▄▄▄▄▀█ █▄ ▄█▀\n█▄▄██▄▄█▄██▄█▄█ "], ["injured_2", " \n \n█▀▄ ▄▄█▀▄ ▄▄ \n▀▄ ▀ ▀ ▀▄ ▀▄ \n █▄ ▄▄▄▄ ▀▄▄▀▄ \n █▄▀▀▄ █ █▄█ █\n █▀ ▀▀▄█ █ ▄ █▀\n█▄██████▄███▄██ "], ["sleep_1", " \n \n█▀▄ ▄▄█▀▄ ▄▀▀▄ \n▀▄ ▀ ▀ ▀█ ▄▄█\n █▀▄▄▀▀▀▄ █ ▀▄\n █▄ ▄▄ █ █▄ ▄█\n █ ▄▄ ▄▀ █▄▄▀▄ \n█▄█▄▄▄▄███▄█▄█▄█"], ["sleep_2", " \n▄▄ ▄▄ ▄▄▄▄▄\n█ ▀▄▀▀█ ▀▄▀ ▄▀\n █▄ ▄▄▄ █ ▀▀█\n █ ▀▀ █ █ ▄▀ \n █▀ ▀▀ █ █▄▀ \n █▄▀▀ █▄ █▄▄▀▄ \n█▄▄████▄▄███▄█▄█"], ["walk_1", "█▀▄ ▄▄█▀▄ ▄▀▀▀▀█\n▀▄ ▀ ▀ ▀▄ ▄▄█▄\n █▀▄▄▀▀▀▄ ▀▄ ▄▀\n █▀ ▀▀ █ █ █ \n █ ▀▀▀ ▄█ ▄▀▀▄ \n ██▀▀▀▄█▄▀▄▀▀▄ \n █ █▀█ █ █▄ ▄▀ \n █▄▄██▄▄█▀█▄█▄█ "], ["walk_2", "▄▄ ▄▄ ▄▄▄▄▄\n█ ▀▄▀▀█ ▀▄▀ ▄▀\n █▄ ▄▄▄ █ ▀▀▀█\n █▄▀▀▄▄ █ █ ▄▀ \n █ ▄▄▄ █ █▄▀ \n ▀▄▄▄▄▄▀█ █ ▄█ \n ▄█▀▄ ▄█▀█ █▄ █ \n█▄▄█▀▀█▄▄█▀█▄█▄█"]]], + ["neodevimon", [["angry", " ▄ ▄▄▄▄ ▄ \n█ █▀ ▀▀ █ ▄ \n ▀█ ▄█ █▀▄ █▄ \n █ █ ▀▄▄██ \n ▀▄▄▄▀ ▀█████ \n ▄█ ▀ █ █▀██ \n █ █████ █ ▀█ \n█▄███▀ ▀███▄█ "], ["attack", " ▄▀▄▄▀▀▀▀▄▄▀▄ \n ▀▄█ ▄█ ▄▄▀ █ \n █ ▄▄▄ █▀▄▀ ██\n ▀▄███▄▀▄▄████\n ▄▄█▀▀▀▄ ▄▀████\n▄▀ ▄█▄▄▄▄█▄ ███\n▀▄▄▀▄██▀███▄▄▀ █\n █▄▄██ ██▄▄█ "], ["eat_1", "▄▀▄▄▀▀▀▀▄▄▀▄ \n▀▄█ ▀ ▄▄▀ █ \n █ ▄▄▄ ▄▀▄▀ ██ \n ▀▄███▄▀▄▄████ \n ▄▀▀▀▄ ▄▀████ \n ▄▀▀▄▄▄▄▄▀ █ ██ \n ▀▄▄██▀██▄▄▀ █ \n █▄▄██ ██▄▄█ "], ["eat_2", " ▄ ▄▄▄▄ ▄ \n█ █▀ ▀▀ █ ▄ \n ▀█ ▄▀▄ █▀▄ █▄ \n █ █ ▀▄▄██ \n ▀▄▄▄▀ ▀█████ \n ▄█ ▀ █ █▀██ \n █ █████ █ ▀█ \n█▄███▀ ▀███▄█ "], ["happy", "▄▀▄▄▀▀▀▀▄▄▀▄ \n▀▄█ ▄ ▄▄▀ █ \n █ ▀ ▀▄▀▄▀ ██ \n ▀▄ ▄▀▄▄████ \n ▄▀▄▀▀▀▄ ▄▀▀███ \n█ █▄▄▄▄▄█▀ ██ \n ▀█▄██▀███▄▄▀ █ \n █▄▄██ ██▄▄█ "], ["injured_1", " \n ▄ ▄▄▄▄ ▄ \n █ █▀ ▀▀ █ █ \n ▀█ ▄ █▀▄ ██\n █ ▀▀ █ ▀▄███\n ▄▀▄▄▄▀ ▀█████\n ▄▀▀▀▄▄▄█▀▀▀█ ██\n █▄▄▄████▄▄▄█ ▀"], ["injured_2", " \n \n▄▀▄▄▀▀▀▀▄▄▀▄ ▄ \n▀▄█ ▄▄▀ █▄ \n █ █▄ ▄▀▄▀▄██ \n ▀▄ ▄▀▄▄████ \n ▄▀▀▀██▄█▀▀▀███ \n █▄▄▄████▄▄▄█▀█ "], ["sleep_1", " \n ▄ ▄▄▄▄ ▄ \n█ █▀ ▀▀ █ █ \n ▀█ ▄▄ █▀▄ ██ \n █ █ ▀▄███ \n ▄▀▄▄▄▀ ▀█████ \n▄▀▀▀▄▄▄█▀▀▀█ ██ \n█▄▄▄████▄▄▄█ ▀ "], ["sleep_2", " \n▄▀▄▄▀▀▀▀▄▄▀▄ \n▀▄█ ▄▄▀ █ \n █ ▀▀ ▄▀▄▀ ██ \n ▀▄ ▄▀▄▄████ \n ▄▀▄▀▀▀▄ ▄▀████ \n▄▀▀▀▄▄▄▄▀▀▀█ ██ \n█▄▄▄████▄▄▄█ ▀ "], ["walk_1", "▄▀▄▄▀▀▀▀▄▄▀▄ \n▀▄█ ▀ ▄▄▀ █ \n █ ▀ ▄▀▄▀ ██ \n ▀▄ ▀▄▀▄▄████ \n ▄▀▀▀▄ ▄▀████ \n ▄▀▀▄▄▄▄▄▀ █ ██ \n ▀▄▄██▀██▄▄▀ █ \n █▄▄██ ██▄▄█ "], ["walk_2", " ▄ ▄▄▄▄ ▄ \n█ █▀ ▄ ▀▀ █ ▄ \n ▀█ ▄ █▀▄ █▄ \n █ ▄ █ ▀▄▄██ \n ▀▄▄▄▀ ▀█████ \n ▄█ ▀ █ █▀██ \n █ █████ █ ▀█ \n█▄███▀ ▀███▄█ "]]], + ["nidhoggmon", [["angry", " ▄▄▄▄██▄ ▄ \n▄█▀█▄█▀ ███▀ ▄▀█\n▀▀█▀█▀█▀█▀ ▄█ ▄▀\n █▀▄█▀ ▄▄▀\n ▄█▄█▄███▀██▀ ▄▀\n ▄██▀█▄█▀▀ █▀▀ \n ▀ ▀ █▄█▄█▄▀ ▀▄\n ▀█████▄▄█▀"], ["attack", " ▄▄ \n ▄▄████▀█▄█▄ ▄▄\n███▄█▄████▀ ▄▀ █\n ▄▀▄▀▄▀▄█ ▄█▀ ▀▄\n ▀▀▀███▄██▄▄▀▀▄\n ▄▄██ ██▄▀█▄▄▀ \n █▀█ █▀█ ▄ █ ▀▄\n ▀█████▄▄▄█▀"], ["eat_1", " ▄▄ \n ▄███▀███▄█▄ ▄▄\n███▄███▄██▀ ▄▀ █\n ▄▀▄▀▄▀▄█ ▄█▀ ▀▄\n ▀▀▀███▄██▄▄▀▀▄\n ▄▄██ ██▄▀█▄▄▀ \n █▀█ █▀█ ▄ █ ▄\n ▀█████▄▄▄█▀"], ["eat_2", " ▄▄▄██▄ ▄ \n▄██▀█▀█▄███▀ ▄▀█\n▀▀█▀█▀█▀█▀ ▄█ ▄▀\n ▄ ▄ ▄█▀▄█▀ ▄▄▀\n ▀▀▀██▀██▀██▀ ▄▀\n ▄██▀█▄█▀▀ █▀▀ \n ▀ ▀ █▄█▄█▄▀ ▀▄\n ▀█████▄▄█▀"], ["happy", " ▄▄▄▄██▄ ▄ \n▄██▀█▄█▀███▀ ▄▀█\n▀▀█▀█▀█▀█▀ ▄█ ▄▀\n ▄ ▄ ▄█▀▄█▀ ▄▄▀\n ▀▀▀██▀██▀██▀ ▄▀\n ▄██▀█▄█▀▀ █▀▀ \n ▀ ▀ █▄█▄█▄▀ ▀▄\n ▀█████▄▄█▀"], ["injured_1", " \n \n ▄▄▄▄██▄ ▄ \n▄█▀█▄█ ▀███▀ \n▀▀█▀█▀█▀█▀▄▄▄▀▀█\n ▀▄█▄█▄█▀██▄ ▄▀▄\n ▄████ █▀ ▀██▄▄▀\n ▀ ▀ ███▄█▄█▄█▀▄"], ["injured_2", " \n \n ▄▄ \n ▄██▀█▀██▄█▄ \n██▄███▄▄██▀ ▄▄▄▄\n ▄▀▄▀▄▀▄█▄█▀ ▄▀\n ▄███▀█▀ ▀███▀ █\n█▀█▀█▄█▄█▄██▄█▀▄"], ["refuse", " ▄▄ \n ▄██▀██▀█▄█▄ ▄▄\n██▄███▄▄██▀ ▄▀ █\n ▄▀▄▀▄▀▄█ ▄█▀ ▀▄\n ▀▀▀███▄██▄▄▀▀▄\n ▄▄██ ██▄▀█▄▄▀ \n █▀█ █▀█ ▄ █ ▄\n ▀█████▄▄▄█▀"], ["sleep_1", " \n ▄▄ \n ▄███████▄█▄ ▄▀█\n████▄▄████▀▄█ ▄▀\n ▄▀▄▀▄▀▄█▄█▀ ▄▄▀\n ▀▀██▀█▄▀██▀ ▄▀\n ▄██▀█▄█▀▀ █▀▀ \n ▀ ▀ █▄█▄█▄█▄█▀▄"], ["sleep_2", " \n \n ▄▄▄▄██▄ ▄ ▄▄\n▄███▀▀█████▀▄▀ █\n▀▀█▀█▀█▀█▀ █▀ ▀▄\n ▀▄█▄█▄█▀██▄▄▀▀▄\n ▄████ █▀ ▀█▄▄▀ \n ▀ ▀ ███▄█▄█▄█▀▄"], ["walk_1", " ▄▄▄██▄ ▄ \n▄██▀█▀█▄███▀ ▄▀█\n▀▀█▀█▀█▀█▀ ▄█ ▄▀\n ▀▄█▄█▄█▀▄█▀ ▄▄▀\n ▄█▀██▀██▀ ▄▀\n ▄██▀█▄█▀▀ █▀▀ \n ▀ ▀ █▄█▄█▄▀ ▀▄\n ▀█████▄▄█▀"], ["walk_2", " ▄▄ \n ▄▄████▀█▄█▄ ▄▄\n███▄█▄████▀ ▄▀ █\n ▄▀▄▀▄▀▄█ ▄█▀ ▀▄\n ▀▀▀███▄██▄▄▀▀▄\n ▄▄██ ██▄▀█▄▄▀ \n █▀█ █▀█ ▄ █ ▀▄\n ▀█████▄▄▄█▀"]]], + ["ninjamon", [["angry", " ▄▄▄ ▄▄▄▄ \n █ █▄███▄█ █\n █ ▀█████████▀▀█\n █ ███████████ █\n █ ███████████▄█\n ██▄▀▀██▀▀▄▀▀▄▀\n ▄█▄▀▀▀▀▀▀ ▄█▄ \n █▄█▄██▀▀▀██▄█▄█"], ["attack", "▄▀█ ▄▄▄ \n█ █ ▄██████▄ \n▀▄ █▄██▀ █████▄ \n █ ▀██▄▄███████▄\n █▄▀██▀ ▄ ▀██\n █ ▄▄▄▀ ▄▀ \n ██▀▀▀██▀▀▀▀▄ \n █▄█▄▄▄▀ ▀▄▄█▄█"], ["eat_1", " ▄▄▄ \n ▄▄▄ ▄█████▄ ▄▄ \n█ ██▄▄██▄▄██ █\n█ █▀▄▄▄▄▄▄▄▀█▄ █\n▀▄█ ████▀▀█ █ █\n ▀▄ ▀▀▀▀▀▀ ▄▀▀ \n ▄█▀▀██▀▀▀▄▄ \n █▄█▄▄█ █▄█▄▄█ "], ["eat_2", " \n ▄███▄ \n ▄███████▄ \n ▄▄███████████▄ \n█ ▄█▀████▀███ █\n▀▄█▄█▄██▄█▄█▀▀▄▀\n ▄█▄▀▀▀▀▀▀ ▄█▄ \n █▄█▄██▀▀▀██▄▄▄█"], ["happy", "▄▄ ▄▄▄▄ ▄▄\n█ ▀▄▄▀████▀▄ █ █\n█ ▄█▄█▄██▄█▄█ █\n█ █ ▄▄▄▄▄▄▄ █ █\n▀▄█ ▀██▀▀█▀ █ █\n ▀▄ ▀▀▀ ▄▀▀ \n ▄█▀▀██▀▀▀▄▄ \n █▄█▄▄█ █▄█▄▄█ "], ["injured_1", " \n ▄▄▄ \n ▄█████▄ \n ▄█████████▄ \n ▄██▀██▀█████▄ \n █▀▄▄██▄▄▄▀▀▀█ \n █▄ ▄█ \n █▄▄███▀▀▀███▄▄█"], ["injured_2", " \n \n ▄███▄ \n ▄███████▄ \n ███████████ \n ███▀██▀██████ \n █▀▄▄██▄▄▄▀▀ █▄ \n█▄█▄▄▄▄▄▄▄▄▄█▄▄█"], ["sleep_1", " \n ▄ ▄ \n ▀▄ █▄▄█ ▄▀ \n ▀▄ ▄██████▄ ▄▀ \n ▄▄██████████▄▄ \n ▄▄██████████▄▄ \n ▄█ ▀▀▀▀▀▀ █▄ \n ▀ ▄▀▄█▄▄█▄▀▄ ▀ "], ["sleep_2", " \n \n ▄ ▀▄ ▄▀ ▄ \n▄ ▀▄██████▄▀ ▄\n ▀▄██████████▄▀ \n▀▀████████████▀▀\n▀▀█▀████████▀█▀▀\n▄▀▀▄▄█▄▄█▄▄█▄▀▀▄"], ["walk_1", " ▄▄▄ \n ▄█████▄ \n ▄▀████▀███▄ \n ▄█▄ ██ ▄████▄ \n ▄█ ▀▀▀▀▀▀ █▄\n █▀▄ ▀▀▀ ▄▀█ █\n ▀▄▄█▀▀██▀▀▀▄▄▄▀\n █▄█▄▄█ █▄█▄▄█ "], ["walk_2", " \n ▄███▄ \n ▄███████▄ \n ▄▄█ ▀██▀ ████▄ \n█ ▄▀█▄██▄█▀▀█ █\n▀▄█ ▄▄▄ ▀▄▀\n ▄█▄▄▄▄▄▄▄▄▄█▄ \n █▄█▄▄█ ▀█▄█▄▄█"]]], + ["noblepumpkinmon", [["angry", " \n \n \n ▀▄ ▄▀ \n ▄ ▄ ▄ ▄ ▄ \n ▀███████▄█ \n ▄▀▄█▀ ▀█▄ █▄ \n █▀█▄▄█▀█▄▄█▀▀▀"], ["attack", " ▄▄▄██████▄▄▄ \n█▄▄█▄ ▀ ▄▄ ▀▄▄█\n▀▄█ ▀▀ ▀▀ █▄▄▀\n ▀█▄█▄█▄█▄ █ \n ▄▄█▀█▀█▀█ ▄▀▄ \n █ ▀▄▄▄▄▄▄▄▀ ▄▀ \n █▀▀▀█▀ ▀▀██▄ \n ▀ █▄▄▄▀▄▄▄█▀▀ "], ["eat_1", " \n▄ ▄ ▄ ▄\n█▀█ ▀▀ ▀▀ ▄▀▀█\n ▀█▄█▄█▄█▄█ ▀█▀ \n ▄▀█▀█▀█▀ ▄▀ \n █▄▄▄▄▄▄▄▀▄ \n █▀▄█▀ ▀▀█▄█ \n █▀█▄▄█▀█▄▄█▀▀ "], ["eat_2", " \n \n \n ▄▀▄ ▄▀▄ \n \n \n ▄▀▄█▀ ▀█▄▀▄ \n █▀█▄▄█▀█▄▄█▀▀ "], ["happy", " \n▄ ▄ ▄\n█▀█▄▀▄ ▄▀▄ ▄▀▀█\n ▀█ ▄ ▄ ▄ ▄ ▀█▀ \n █▀█▀█▀█▀ ▄▀ \n ▄▀▄▄▄▄▄▄▄▀▄▀ \n ▄▀▀▄██ ▀███▄ \n▀ ▀█▄▄▀▄▄█▀▀▀ "], ["injured_1", " \n \n \n ▄▄▀ ▀▄▄ \n ▄ ▄ ▄ ▄ \n ▄▀▀▄█▄█▄█▄█▀ \n ▀▄▄▄██▀ ▀█ █▄ \n █ ▄██▄█▄█▄▄██▄"], ["injured_2", " \n \n \n ▄ ▄ \n ▀▀ ▀▀ \n ▄ ▀▄▀▄▀▄▀▄ ▄ \n ▀▄▄▄██▀▀▀█▀▀█▄ \n █ ▄██▄█▄██▄▄██"], ["sleep_1", " \n \n \n ▀▀ ▀▀ \n ▄▀▄▀▄▀▄▀ \n ▄ \n ▀▄▄▀▄▄▄▀ \n ▄███ ████▄ "], ["sleep_2", " \n \n ▄▄ ▄▄ \n ▄ ▄ ▄ ▄ \n ▀ ▀ ▀ ▀ \n ▄ ▄▄▄▄ █ \n █▄▀▄▄█ \n ▄███ ████▄ "], ["walk_1", " \n \n \n \n \n \n \n "], ["walk_2", " \n \n \n \n \n ▄▄ ▄▄ ▄ \n █▄▀▄ ▀█▄█▄ \n █ █▄▄█▀▄█▀▀ "]]], + ["numemon", [["angry", " \n █▄█ ▄ ▄ █▄█ \n █▄███ ███▄█ \n ▀▄▄▄▄▄▄▀ \n █ ▀▀ █ \n █ ▄▄ ▀▄▄ \n ▄▀ █▀▀▀█▄ ▀▄\n ▀▄▄▄▄▄▄▄▄▄▄▄▄▀"], ["attack", " █▄█ ▄ ▄ █▄█ \n █▄███ ███▄█ \n ▀▄▄▄▄▄▄█ \n █ ▀▀ █ \n █ ▄▀█▀▄ ▀▄ \n █ ███████▄ ▀▄ \n █ █▄█▄█▄██▄ █\n ▀▄▄▄▄▄▄▄▄▄▄▄▄▀"], ["eat_1", " █▄█▄█ █▄█▄█ \n ▀▄█▄█ █▄█▄▀ \n ▀▀▄▄▄▄▄▀ \n █ ▀▀ ▀▄ \n █ ███▄ ▀▄ \n █ ██████▄ ▀▄ \n █ ▀██████▀ █\n ▀▄▄▄▄▄▄▄▄▀▀▀ "], ["eat_2", " \n █▄█▄█ █▄█▄█ \n █▄█▄█ █▄█▄█ \n ▀▄ ▄▀ \n ▄▀██▀▀▄ \n █ ▀▄▄ \n ▄▀ ▀▄▄▄▀ ▀▄\n ▀▄▄▄▄▄▄▄▄▄▄▀ "], ["happy", " █▄█▄█ █▄█▄█ \n ▀▄█▄█ █▄█▄▀ \n ▀█▄▄▄▄▄█ \n █ ▀▀ ▀▄ \n █ ▄▄▄▄▄█ █ \n ▄▀ ██████ █ \n █ ███▀ ▀▄\n ▀▄▄▄▄▄▄▄▄▀▀▀ "], ["injured_1", " \n \n \n ▄ █▄█ █▄█ ▄ \n █████▄▄█████ \n ▄▀ ▀▀ ▀▄ \n ▄▀ ▄███▄ ▀▄ \n ▀▄▄▄▄▄▄▄▄▄▄▄▄▀"], ["injured_2", " \n \n \n \n ▄ █▄█ █▄█ ▄ \n █████▄▄█████ \n ▄▀ ▀▀ ▀▄▄ \n █▄▄▄██▄▄▄▄▄▄█ "], ["sleep_1", " \n \n \n \n ▄▄▄ ▄▄▄▄▄ ▄▄▄▄ \n█████ ▀█████\n ▄▀ ▀▄\n ▀▄▄██▄▄▄▄▀▀▀ "], ["sleep_2", " \n \n \n \n▄███▄▀▀▀▀▀▄████▄\n▀▀▀▀█ ▀██▀▀\n ▄▀ ▀▀ ▀▄\n ▀▄▄▄▄▄▄▄▄▀▀▀ "], ["walk_1", " \n █▄█▄█ █▄█▄█ \n █▄█▄█ █▄█▄█ \n ▀▄ ▄▀ \n ▄▀██▀▀▄ \n █ ▀▄▄ \n ▄▀ ▀▀▀ ▀▄\n ▀▄▄▄▄▄▄▄▄▀▀▀ "], ["walk_2", " \n▄ ▄ ▄ ▄ ▄ ▄ \n█▀█▀█ █▀█▀█ \n▀▀▀█▀ ▀█▀▀▀ \n █▀██▀▀▄ \n █ ▀▄▄ \n ▄▀ ▀▀▀ ▀▄\n ▀▄▄▄▄▄▄▄▄▀▀▀ "]]], + ["numemon_x", [["angry", " \n█▄█ ▄ ▄ █▄█ \n▀▄█▀█ █▀█▄▀ \n ▀▀█▄▄▄█▀ ▄\n ▀ ▄▀█▀█▀▄ ▄ \n▄ █ ▄▄▄ ▀▄▄ \n ▄▀▄█▀▀▀█▄ ▀▄\n ▀▄▄▄▄▄▄▄▄▀▀▀ "], ["attack", " █▄█ ▄ ▄ █▄█ \n █▄███ ███▄█ \n ▀▀▄▄▄▄▄▀ ▄ \n ▀ █▀█▀█▀▀▄ ▄\n▄ █ █▀█▀█▀▄▀▄ \n ▄▀▄███████▄▀▄ \n █ ▀▄█▄█▄█▄▀ █\n ▀▄▄▄▄▄▄▄▄▀▀▀ "], ["eat_1", " █▄█▄█ █▄█▄█ \n ▀▄█▄█ █▄█▄▀ \n ▄ ▀█▄█▀ ▀ \n ▄▀█▀█▀▄▄ ▀ \n▄ █▄▄▄▄▄▄▄ █ \n ▄█▀▀▀▀███ █ \n █ ▄▄▄▄▄█▀ ▀▄\n ▀▀▄▄▄▄▄▄▄▄▀▀▀ "], ["eat_2", " \n▄ ▄ ▄ ▄ ▄ ▄ \n█▀█▀█ █▀█▀█ \n ▀▀▀▀█▄▄▄█▀▀▀▀ ▄\n ▀ ▄▀█▀█▀▄ ▄ \n▄ █ ▀▄▄ \n ▄▀ ▀▄▄▄▄▀ ▀▄\n ▀▄▄▄▄▄▄▄▄▀▀▀ "], ["happy", " \n █▄█▄█ █▄█▄█ \n ▀▄█▄█ █▄█▄▀ \n ▄ ▀█▄█▀ ▀ \n ▄▀█▀█▀▄▄ ▀ \n ▀ ▄▀▄▄▄▄▄▄ ▀▄ \n ▄▀ ▀████▀ ▀▄\n ▀▄▄▄▄▄▄▄▄▀▀▀ "], ["injured_1", " \n ▄ ▄ \n ▄ ▄ \n ▄ ▄ ▄ ▄ \n▄███▄█████▄████▄\n▀▀▀▀█ ▀ ▀ ▀██▀▀\n ▄▀ ▄▀▀▄ ▀▄\n ▀▄▄▄▄▄▄▄▄▀▀▀ "], ["injured_2", " \n \n ▄ ▀ ▀ \n ▀ \n █▄█ ▄▄▄▄▄ █▄█▄ \n█████▀█▀█▀▀█████\n ▄▀ ▄▄ ▀▀▄\n █▄▄█▄▄█▄▄▄▄▄▄█"], ["sleep_1", " \n \n \n█▄█▄█ ▄▄▄ █▄█▄█ \n▀▀▀██▀█▀█▀██▀▀▀ \n ▄ █ ▄▄▄ ▀▄▄▀ \n ▄▀▄█▄█▄█▄ ▀▄\n▀ ▀▄▄▄▄▄▄▄▄▀▀▀ "], ["sleep_2", " \n \n▄ ▄ ▄ ▄ ▄ ▄ \n█████ ▄▄▄ █████ \n ▀█▀█▀█▀█▀ \n ▀ █ ▄▄▄ ▀▄▄ ▀\n▀ ▄▀▄█▄█▄█▄ ▀▄\n ▀▄▄▄▄▄▄▄▄▀▀▀ "], ["walk_1", " \n █▄█▄█ █▄█▄█ \n ▀▄█▄█ █▄█▄▀ \n ▄ ▀█▄█▀ ▀ \n ▄▀█▀█▀▄ ▀ \n ▀ █ ▄▄▄ ▀▄▄ \n ▄▀▄█▄█▄█▄ ▀▄\n ▀▄▄▄▄▄▄▄▄▀▀▀ "], ["walk_2", " \n▄ ▄ ▄ ▄ ▄ ▄ \n█▀█▀█ █▀█▀█ \n ▀▀▀▀█▄▄▄█▀▀▀▀ ▄\n ▀ ▄▀█▀█▀▄ ▄ \n▄ █ ▄▄▄ ▀▄▄ \n ▄▀▄█▄█▄█▄ ▀▄\n ▀▄▄▄▄▄▄▄▄▀▀▀ "]]], + ["nyaromon", [["angry", "▄▄ ▄▄▄ \n█ ▀▄ ▄▀ █ \n▀▄▄▄▀▀▀▀█ █▄▀█\n▄█▄ ▄▄▄ ▀█ ▄▀\n█▀▄█ █▄▀ █▄▀ \n██ ▄▄▄▄ ██ █ \n██████▀▀▀█ █ \n ▀███▄▄▄█▄▀ "], ["attack", " ▄▄ ▄▄ \n █ █ █ █ \n █ ▄█▄▄█ █ ▄▄\n ▄▀▀ ▀ █ █ █\n█▀▄ ▄▀█▄ █ ▄▀\n█▀▀ ▄ ▀▀▀ █ █ \n▀▄ ▀ ▀▀ █▄▀ \n ▀▄▄▄▄▄▄▄▀ "], ["eat_1", " ▄▄ ▄▄ \n █ █ █ █ \n █ ▄█▄▄█ █ ▄▄\n ▄▀▀ ▀ █ █ █\n█▀▄ ▄▀█▄ █ ▄▀\n█▀▀ ▄ ▀▀▀ █ █ \n▀▄ ▀ ▀▀ █▄▀ \n ▀▄▄▄▄▄▄▄▀ "], ["eat_2", " \n ▄▀▀█ ▄▄▄▄ \n █▄▀▀▀▀█▀ ▄▀ \n▄▀ ▀▄ ▄▄\n█▀▀ ▀▀▀ ██ █\n█▀▄▄█▄▄▄█ █ ▄▀\n█ ████▀▀█ ▄▀▀ \n ▀▄██▄▄█▄▄▀ "], ["happy", " \n ▄▀▀█ ▄▄▄▄ \n █▄▀▀▀▀█▀ ▄▀▄▄\n▄█ ▄▄ ▀▄█ █\n█▄█ █▄▀▀ █ ▄▀\n█ ▄▄█▄▄▄ █▀ \n█ ██████ █ \n ▀███▄▄█▄▄▀ "], ["injured_1", " \n \n \n█▀█▄▀▀▀▀▄▀▀▀█ \n▄▀ ▀▄ \n█ ▄ ▄ █▄ \n█▀▀ ▄ ▀▀▀ █ ▀▄\n ▀▄█▄██▄▄▄▄▀▀▄▄█"], ["injured_2", " \n \n \n ▄▄ ▄▄▄▄ ▄▄ \n█▄▀▀ ▀ ▀▀▄ \n█ ▀█▀ \n█▄█ █▄▄ █▀▄ \n▀▄▄▄█▄▄▄▄▄▄▄▀▄▄█"], ["refuse", " \n \n▄▄▄ ▄▄▄ \n▀▄▄▀▀▀▀▀█▀▀ ▄▀▄▄\n▄▀ ▀▄█ █\n█▄ ▄▀█ █ ▄▀\n█▀▀ ▄ ▀▀▀ █▄▀ \n ▀▄█▄██▄▄▄▄▀ "], ["sleep_1", " \n \n▄▄▄▄ █▀▀▄ \n█ ▀█▀▀▀▄█ \n▄▀ █ \n█ ▄▄▄ ▄▄█▀▄ \n█ ▄▄▀▄▀ █ \n ▀▄▄▄▄▄▄▄█▄▄▄▄▀ "], ["sleep_2", " \n \n▄▄▄▄ █▀▀▄ \n█ ▀█▀▀▀▄█ \n▄▀ █ \n█ ▄▄▄ ▄▄█▀▄ \n█ ▄▄▀▄▀ █ \n ▀▄▄▄▄▄▄▄█▄▄▄▄▀ "], ["walk_1", " \n \n ▄▀▀█ ▄▄▄▄ \n █▄▀▀▀▀█▀ ▄▀▄▄\n▄█ ▄▄ ▀▄█ █\n█▄█ █▄█▀ █ ▄▀\n█ ▄▀▄▄ █▄▀ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["walk_2", " ▄▄ ▄▄ \n █ █ █ █ \n █ ▄█▄▄█ █ ▄▄\n ▄▀▀ ▀ █ █ █\n█▀▄ ▄▀█▄ █ ▄▀\n█▀▀ ▄ ▀▀▀ █ █ \n▀▄ ▀ ▀▀ █▄▀ \n ▀▄▄▄▄▄▄▄▀ "]]], + ["nyokimon", [["angry", " \n \n \n \n ▄▀▀▄▀▀▄ \n ▀▀▄▀▀ \n ▄█▀▀█▄ \n ▄▄████ "], ["attack", " \n \n \n \n ▄▀▄ \n ▀██▀▄▄▀▄▀ \n ▀██ █ █ \n ▄▄▄██ ▀ "], ["eat_1", " \n \n \n \n ▄▀▄ \n ▀██▀▄▄▀▄▀ \n ▀██ █ █ \n ▄▄███ ▀ "], ["eat_2", " \n \n \n \n ▄▀▀▄▀▀▄ \n ▀▀▄▀▀ \n ▄▀█▄ \n █████ "], ["happy", " \n \n \n ▄▀▀▄▀▀▄ \n ▀▀▄▀▀ \n ▄▀███▀▄ \n █▀▀▀▀▀█ \n ▀█▄▄▄█▀ "], ["injured_1", " \n \n \n \n ▄▀▀▄▀▀▄ \n ▀▀▄▀▀ \n ▄▀█▀▄ \n █▄███▄█ "], ["injured_2", " \n \n \n \n ▄▀▀▄ \n ▀▀▄▀▀▄ \n ▄▄▄█▄▀▀ \n █▄▄█▄▄█ "], ["sleep_1", " \n \n \n \n ▄▄ ▄▄ \n ▀▄▄▀▄▄▀ \n ▄▄█▄▄ \n █▄▄█▄▄█ "], ["sleep_2", " \n \n \n ▄▄ ▄▄ \n ▀▄▄▀▄▄▀ \n ▄▄█▄▄ \n █▄▄█▄▄█ \n ▀██▄██▀ "], ["walk_1", " \n \n \n \n ▄▄ ▄▄ \n ▀▄▄▀▄▄▀ \n ▄▄█▄ \n █▄█▄██ "], ["walk_2", " \n \n \n \n ▄▀▀▄▀▀▄ \n ▀▀▄▀▀ \n ▄▀█▀█▄ \n ▀████▀ "]]], + ["octomon", [["angry", " ▄▀▀▀▀▀▀▄ \n ▄▀▄▀ ▀▄ \n █ ▀ █ \n ▄▀▀ ▀▀▀▀▀▀ ▀▄ \n▄▀█▄█████▀██▄▄▀ \n▀▄▄█▀▀▀▄▄███ █▀▄\n █ █ ▀ █ █ █▄▄▄▀\n▀▄▄▀▀▀▀▄▄▀▄▄▀▄▄▀"], ["attack", " ▄▀▀▀▀▀▀▄ \n ▄▀▄▀ ▀▄ \n █▄ █ \n █ ▄▄▄▄▄▄▄▄ ▀▄ \n ▄▀▄▄▄▀█▀ ██▀▀▄\n█▀█ ███ ████▀▀ █\n █▀▄▀▀▀▄▀█ █▀▀█ \n▀▄▄▀▀▀▀▄▄▀▄▄▀▄▄▀"], ["eat_1", " ▄▀▀▀▀▀▀▄ \n ▄▀▄▀ ▀▄ \n █▄ ▄▄▄▄▄▄ ▄█ \n ▄█ ▄▄▄▄▄▄▄▄▀▄ █\n█ ██▀▀▀█▀▄▀███ █\n▀▄▄█ █ ██████▄▄▀\n █ █ ▀ █ █ █▄ █ \n▀▄▄▀▀▀▀▄▄▀▄▄▀▄▄▀"], ["eat_2", " ▄▀▀▀▀▀▀▄ \n ▄▀▄▀ ▀▄ \n █ ▀ █ \n ▄▀▀ ▀▀▀▀▀▀ ▀▄ \n ▄█▄█████▀██▄▄█ \n█ ▄█▀▀▀▀▄█▄██▄ █\n▀█ █ ▀▀ █ █ █▄▄▀\n ▀▄▄▀▀▀█▄▄▀▄▄▄▀ "], ["happy", " ▄▄ ▄▀▀▀▀▀▀▄ \n █ ▄▀▄▀ ▀▄ \n▄▀▀█▄ ▄▄▄▄▄▄ ▄█ \n█ █ ▄▄▄▄▄▄▄▄▀▄ █\n▀▄▄▀▀▀▀▀█▀▄▀█▀▀█\n ▄█ ███ █████▀ █\n█ █▄▀▀▀▄▀██ █▀█ \n▀▄▄▄▀▀▀▄▄▀▄▄▀▄▄▀"], ["injured_1", " ▄▄▄▄▄▄ \n ▄▀▄ ▀▄ \n █ █ █ \n ▀▄ ▄▄▄▄▄ ▄▀ \n █ ▄▄▄▄▄▄▄▄ █ \n ▄▀█▀▄███▄▀█▀█ \n█ ▄█▀█ ▄ █▀█▄ █ \n▀▄█▄▄█▄▄▄█▄▄█▄▄▀"], ["injured_2", " ▄▄▄▄▄▄ \n ▄▀▄ ▀▄ \n █ █ █ \n ▀▄ ▄▄▄▄▄ ▄▀ \n █ ▄▄▄▄▄▄▄▄ █ \n ▄▀██▀███▀██▄▀▄ \n█ ▄▀▄▄▀▀▀▄▄█▀▄ █\n▀▄▀▄▄█▄█▄█▄▄▄▀▄▀"], ["sleep_1", " ▄▄▄▄▄▄ \n ▄▀▄ ▀▄ \n █ █ █ \n ▀▄ ▄▄▄▄▄ ▄▀ \n █ ▄▄▄▄▄▄▄▄ █ \n▄▀▀████▀▀███▀▀▀▄\n█▄▀█ ▄ █▀█▀▀█▀ █\n▀▄▄█▄▄▄█▄▄█▄▄█▀ "], ["sleep_2", " ▄▀▀▀▀▀▀▄ \n ▄▀▄▀ ▀▄ \n █ ▀ █ \n ▄▀ ▀▀▀▀▀ ▀▄ \n ▄█▄███▀▀███▄█▄ \n█ ▄█▀▀▀█████▄▄ █\n▀█ █ █ █ █▄▀█▄▄▀\n█▄▄▀▄▄▄▀▄▄█▄▄█ "], ["walk_1", " ▄▀▀▀▀▀▀▄ \n ▄▀▄▀ ▀▄ \n ▄█ ▀ █▄ \n█ ▄▀ ▀▀▀▀▀ ▀▄ █\n█ █▄▀█████▀█ █ █\n▀▄▄▀▄▄▀▀▀▄▄▀▀ ▄▀\n █ █ █ ▀ █ █▀█ \n▀▄▄▀▄▄▀▀▀▄▄▀▄▄▀ "], ["walk_2", " ▄▄▄▄▄▄ \n ▄▀▄ ▀▄ \n █ █ █ \n ▀▄ ▄▄▄▄▄ ▄▀ \n █ ▄▄▄▄▄▄▄▄ █ \n▄▀▀█ ▀███▀ █▄▀▀▄\n█ ▀▄▀█ ▄ █▀█ ▀ █\n ▀█▄▄█▄▄▄█▄▄█▀▀ "]]], + ["ogremon", [["angry", " \n ▄▀▄▄▄▄████▄▄▄▀▄\n ▀▄▄▀█▀▀ ▀▄ ▄▄▀\n █▄ ▄█ █ \n ▄▀█▄▄▄▄▄ █▄ \n█ ▄█▄▄▄▄▄█▄▀ █ \n█ █▄▄▄ █ █ █▄\n ▀█▄▄▄▄█▀▄▄▄▄█▄█"], ["attack", "▄▀▄▄▄▄████▄▄▄▀▄ \n▀▄█▄▄▄▄▄▄ █ ▄▄▀ \n █ █▄█ ██ █ \n ▀███████ █▄▄▄ \n ▄█▀█▀█▀██ █ █\n█ █▀▀▀▀▀▀ ▄█▀▀ █\n█▀ ▀█▀█▀▀▀ █▄▄█▄\n▀▄▄█▄▄▄█▀▀▀▄▄▄▄█"], ["eat_1", "▄▀▄▄▄▄████▄▄▄▀▄ \n▀▄▄▀█▀▀▄▄▀▄ ▄▄▀ \n █ ▀ ▀ █ \n ▀███████ █▄▄▄ \n ▄██▀▀▀▀██ █ █\n█▄▀ ▄▀▀ ▄█▀▀ █\n██▄▄█▀█▀▀▀ █▄▄█▄\n▀▄▄█▄▄▄█▀▀▀▄▄▄▄█"], ["eat_2", " \n ▄▀▄▄▄▄████▄▄▄▀▄\n ▀▄▄▀█▀▀▄▄▀▄ ▄▄▀\n ▄▄█ ▀ ▀ █ \n█ ▄█▄▄▄▄▄▄▀ █▄ \n█ ▀▄▄▄▄▄▄▄▀ █ \n ▀▀█▄▄▄ █ █ █▄\n █▄▄▄▄█▀▄▄▄▄█▄█"], ["happy", "▄▀▄▄▄▄████▄▄▄▀▄ \n▀▄▄▀█▀▀▄▄▀▄ ▄▄▀ \n █ ▀ ▀ █ \n ▀███████ █▄▄▄ \n ▄█▀█▀█▀██ █ █\n█ █▀▀▀▀▀▀ ▄█▀▀ █\n█▀ ▀█▀█▀▀▀ █▄▄█▄\n▀▄▄█▄▄▄█▀▀▀▄▄▄▄█"], ["injured_1", " \n ▄▀▄▄▄▄████▄▄▄▀▄\n █ ▄▀██▀▀▀█▀▀ █\n ▀█ █ ▄ ▀█▀▀ \n ▄█▀ ▀▀ █▄ \n▄█▄█▀▀▀▀▀▀ ▄▀▄█▄\n█ ▀ █▀▀▀▀█▀▀█ █\n█▄▄▄█▄▄▄█▄▄▄▄▄▄█"], ["injured_2", " \n ▄ ▄▄▄▄▄ ▄ \n█ ▀█████████▀ █ \n▀▄█ █▀ ▀▄▄▄▄▀ \n █▄▀ █▄ █▄ \n▄██▄▄▄▄▄▄ █▄█▄▄\n█ ▀ █▄▄▄▄█▀▀█ █\n█▄▄▄█▄▄▄█▄▄▄▄▄▄█"], ["sleep_1", " \n ▄▀▄▄▄▄████▄▄▄▀▄\n █ ▄▀██▀▀▀█▀▀ █\n ▀█ █ ▀█▀▀ \n ▄█▀ ▀▀ █▄ \n▄█▄█▀▀▀▀▀▀ ▄▀▄█▄\n█ ▀ █▀▀▀▀█▀▀█ █\n█▄▄▄█▄▄▄█▄▄▄▄▄▄█"], ["sleep_2", " \n ▄▀▄▄▄▄████▄▄▄▀▄\n ▀▄▄▀█▀▀ ▀▄ ▄▄▀\n █▄ ▄▄ ▄ █ \n ▄▀▄▄▄▄▄▀█ █▄ \n▄█▄█▀▀▀▀▀▀ ▄▀▄█▄\n█ ▀ █▀▀▀▀█▀▀█ █\n█▄▄▄█▄▄▄█▄▄▄▄▄▄█"], ["walk_1", "▄▀▄▄▄▄████▄▄▄▀▄ \n▀▄▄▀█▀▀▄ ▀▄ ▄▄▀ \n ██ █▀ ▄ █ \n ▀▄▄▄▄█▀█ █▄▄▄ \n ▄█▀█▀█▀██ █ █\n█ █▀▀▀▀▀▀ ▄█▀▀ █\n█▀ ▀█▀█▀▀▀ █▄▄█▄\n▀▄▄█▄▄▄█▀▀▀▄▄▄▄█"], ["walk_2", " \n ▄▀▄▄▄▄████▄▄▄▀▄\n ▀▄▄▀█▀▀▄ ▀▄ ▄▄▀\n ▄▄██ █▀ ▄ █ \n█ ▄█▄▄▄▄▄▄▀ █▄ \n█ ▀▄▄▄▄▄▄▄▀ █ \n ▀▀█▄▄▄ █ █ █▄\n █▄▄▄▄█▀▄▄▄▄█▄█"]]], + ["ogremon_x", [["angry", " \n ▄▀▄▄▄▄████▄▄▄▀▄\n ▀▄▄▀█▀▀ ▀▄ ▄▄▀\n ██ ▄█ █ \n ▄▀█▄▄▄▄▄ █▄▀█\n█▄▄█▄▄▄▄▄█▄█▄ █ \n█▀ █▄▄▄ █ █▀██▄\n ▀█▄▄▄▄█▀▄▄▄▄█▄█"], ["attack", " ▄▀▄▄▄█████▄▄▄▀▄\n ▀▄▄▀▀█▀▀ ▀▄ ▄▄▀\n ██▄ ▄█ █ ▄▄\n █▄▄▄▄▄██ █▀▄▀\n ▀▄█▄█▄█▀ █▄ █\n ▄▄▄▄██████▀▀ █ \n█ ▀▄▄▄▄ ▄█▄▄██▄\n ▀▄▄▄▄▄█▀▀▀█▄█▄█"], ["eat_1", "▄▀▄▄▄█████▄▄▄▀▄ \n▀▄▄▀█▀ ▄ ▀▄ ▄▄▀ \n █ ▀ ▀ █ ▄▀█\n ▀███████ █▀▀▀▄\n ▄██▀▀▀▀██ ███▄█\n█▄▀ ▄▀▀ ▄█ █▀\n██▄▄█▀█▀▀▀████▄▄\n▀▄▄█▄█▄█▀▀▀▄▄█▄█"], ["eat_2", " \n ▄▀▄▄▄▄████▄▄▄▀▄\n ▀▄▄▀█▀▀▄ ▀▄ ▄▄▀\n ▄▄██ ▀ ▀ █ \n█ ▄█▄▄▄▄▄▄▀ █▄▀█\n█▀ ▀▄▄▄▄▄▄▄█ █ \n ▀██▄▄▄ █ ▀███▄\n █▄█▄▄█▀▄▄▄▄█▄█"], ["happy", "▄▀▄▄▄█████▄▄▄▀▄ \n▀▄▄▀█▀ ▄▄▀▄ ▄▄▀ \n █ ▀ ▀ █ ▄▄\n ▀███████ █▄█▄▀\n ▄█▀█▀█▀██ █▄▄ █\n█▄█▀▀▀▀▀▀ ▄█▀▀██\n█▀ ▀█▀█▀▀▀ █▄▄█▄\n▀▄▄█▄█▄█▀▀▀▄▄█▄█"], ["injured_1", " \n ▄▀▄▄▄█████▄▄▄▀▄\n █ ▄▀██▀▀▀█▀▀ █\n ▀█ █ ▄ ▀█▀▀ \n ▄█▀ ▀▀ █▄▀█\n▄█▄█▀▀▀▀▀▀ ▄▀▄█▄\n█ ▀ █▀▀▀▀█▀▀█▄ █\n█▄▄▄█▄▄▄█▄▄▄▄█▄█"], ["injured_2", " \n ▄ ▄▄▄▄▄ ▄ \n█ ▀█████████▀ █ \n▀▄█ █▀ ▀▄▄▄▄▀ \n █▄▀ █▄ █ ▄▀█\n▄▀█▄▄▄▄▄▄ ██▄█▄\n█ ▀ █▄▄▄▄█▀▀█▄ █\n█▄▄▄█▄▄▄█▄▄▄▄█▄█"], ["sleep_1", " \n ▄▀▄▄▄▄████▄▄▄▀▄\n █ ▄▀██▀▀▀█▀▀ █\n ▀█ █ ▀█▀▀ \n ▄█▀ ▀▀ █▄▀█\n▄█▄█▀▀▀▀▀▀ ▄▀▄█▄\n█ ▀ █▀▀▀▀█▀▀█▄ █\n█▄▄▄█▄▄▄█▄▄▄▄███"], ["sleep_2", " \n ▄▀▄▄▄█████▄▄▄▀▄\n ▀▄▄▀█▀▀ ▀▄ ▄▄▀\n █▄ ▄▄ ▄ █ \n ▄▀▄▄▄▄▄▀█ █▄▀█\n▄█▄█▀▀▀▀▀▀ ▄▀▄█▄\n█ ▀ █▀▀▀▀█▀▀█▄ █\n█▄▄▄█▄▄▄█▄▄▄▄███"], ["walk_1", "▄▀▄▄▄█████▄▄▄▀▄ \n▀▄▄▀▀█▀▀ ▀▄ ▄▄▀ \n ██▄ ▄█▀ █ ▄▄\n▄▄█▄▄▄▄▄▀█ █▄█▄▀\n▀▄█▀█▀█▀██ █▄ ▀█\n█▄█▀▀▀▀▀▀ ▄█▀▀▄█\n█ ██▀█▀▀▀██▄▄█▄\n▀███▄█▄█▀▀▀█▄█▄█"], ["walk_2", " \n ▄▀▄▄▄▄████▄▄▄▀▄\n ▀▄▄▀█▀▀▄ ▀▄ ▄▄▀\n ▄▄██ █▀ ▄ █ \n█▄▄█▄▄▄▄▄▄▀ █▄▀█\n█ ▀▄▄▄▄▄▄▄▀ █ \n ▀▄██████ ▀█▄█▄\n █▄█▄▄█▀▄▄███▄█"]]], + ["ogudomon", [["angry", " ▄ \n ▄█▄ ▀█▀ ▄█▄ \n ▀▄▄█████▄▄▀ \n ▄██▀▀▀▀▀▀███▄ \n ▀█▄██████▄██▀ \n ▄█▄▀▀█████▀▀▄█▄\n ▀███▄ ▄███▀\n █▄▄▀▄█ █▄▀▄▄█"], ["attack", " ▄█▄ ▀█▀ ▄█▄ \n ▀▄▄█████▄▄▀ \n ▄██▀ ▀███▄ \n ▀██ ▄▄▄▄ ███▀ \n █▄▀▀█████▀▀▄█ \n ██▀ ██ \n ██▄▄ ▄▄██ \n█▄▄▀▄█ █▄▀▄▄█ "], ["eat_1", " ▄█▄ ▀█▀ ▄█▄ \n ▀▄▄█████▄▄▀ \n ▄██▄ ▄██▄ \n ▀███▄ ▄███▀ \n █▄▀▀█▄▄██▀▀▄█ \n ▀██ ██▀ \n ▄▄██ ██▄▄ \n █▄▄▀▄█ █▄▀▄▄█"], ["eat_2", " ▄ \n ▄█▄ ▀█▀ ▄█▄ \n ▀▄▄█████▄▄▀ \n ▄█▀██████▀██▄ \n ▀██▄▄▄▄▄▄███▀ \n █▄▄▀█████▀▄▄█ \n ▄███▄ ▄███▄ \n █▄▄▀▄█ █▄▀▄▄█"], ["happy", " ▄█▄ ▀█▀ ▄█▄ \n ▀▄▄█████▄▄▀ \n ▄█ ▀▀▀▀▀▀ ██▄ \n ▀██ ███▀ \n █▄▀▀▄▄▄▄█▀▀▄██ \n ▀█▄ ██▄▄\n ▄██▄ ▄▀█ ▄▀\n█▄▄▀▄█ ▀▀ ▀ "], ["injured_1", " \n \n ▄ ▄█▄ ▄ \n ▀█▀ ▄▄█▄▄ ▀█▀ \n ▄█████████▄ \n ███▀ ▀█████ \n ███ ▄▄▄ █████ \n █▄▄▀██████▀█▄▄█"], ["injured_2", " \n \n ▄ \n ▄█▄ ▀█▀ ▄█▄ \n ▀▄▄█████▄▄▀ \n ▄███▀▀▀█████▄ \n ███ ▄▄▄ █████ \n █▄▄█▀█████▀█▄▄█"], ["sleep_1", " \n \n ▄ \n ▄█▄ ▀█▀ ▄█▄ \n ▀▄▄█████▄▄▀ \n ▄████▀▀█████▄ \n ▄▀███▄▄▄ ████▀▄\n ██▄▄▀▀▀▀▀▀▀▄▄██"], ["sleep_2", " \n \n ▄ ▄█▄ ▄ \n ▀█▀ ▄▄█▄▄ ▀█▀ \n ▄███▀▀████▄ \n ████ █████ \n ▄▄▀█████ ███▀▄▄\n ███▄▄▀▀▀▀▀▄▄███"], ["walk_1", " ▄ ▄█▄ ▄ \n ▀█▀ ▄▄█▄▄ ▀█▀ \n ▄█████████▄ \n ██▄▀▀▀▀▀▀▄███ \n ▄▀██▄▄▄▄███▀▄ \n ██▀ ▀▀▀▀▀ ▀██\n ██▄▄ ▄▄██ \n █▄▄▀▄█ █▄▀▄▄█"], ["walk_2", " ▄ \n ▄█▄ ▀█▀ ▄█▄ \n ▀▄▄█████▄▄▀ \n ▄█▀██████▀██▄ \n ▄▀█▄ ▄██▀▄ \n███ ▀▀▀▀▀▀▀▄██▀ \n ▀██▄▄ ▄▀█▀▀▄\n █▄▄▀▄█ ▀▀ ▀▀ "]]], + ["ogudomon_x", [["angry", " \n █▄████▄▄█ \n ▀▄▀█▀▄▀▀ \n▀███▄▄█▄███▄███▀\n▄▄███▀▀▀▀▀████▄▄\n ▀▀█▄█████▄██▀▀ \n ██▀▀███▀ ▀██ \n ▄▄▀▄ ▄▀▄▄ "], ["attack", " ▄ ▄▄▄ ▄ \n ▄███▀██▀ \n ▄▄▀▄ ▄██▄ ▄▄\n ▀█████▀▀██▀\n ▀██ ▀ ▄██▀▀\n ▄▄██ ▀▄███▄ \n ▄▀ ▄▀ ▄█ ▀▀ ▀█ \n█▄▄▀ ▄▄▀▄ ▄▄▀▄"], ["eat_1", " █▄████▄▄█ \n▄▄▄ ▀▄▀▀▀▄▀▀▄▄▄▄\n ▀██▀██▄███▀██▀ \n▄▄██▄ ▀▀▀ ▄██▄▄\n ▀███▄ ▄███▀ \n ▄█▀█▄ ▄██▀█▄ \n ▀█▄ ▀▀▀ ▄█▀ \n ▄▄▀▄ ▄▀▄▄ "], ["eat_2", " ▄ ▄▄▄▄ ▄ \n █▀███▀██▀ \n▄▄▄▄ ▀▄ ▄█▄ ▄▄▄▄\n ▀██▀█████▀▀██▀ \n▀███▄ ▀▀▀ ▄████▀\n ▀████████▀ \n ▄█▀ ▀▀▀ ▀█▄ \n ▄▄▀█ ▄▀▄▄ "], ["happy", " █▄█▀██▄▄█ \n ▀█▄█▄█▀▀ \n▀███▄▄█████▄███▀\n▄▄██ ▀███▀ ▄██▄▄\n ▀▀██▄ ▄███▀▀ \n ▄█▀███▀▀▀██ \n █▄ █▄▄\n ▄▄▀▄ ▀ "], ["injured_1", " \n \n █▄████▄▄█ \n ▀██ ▀█▀▀ \n▀███▄▄█████▄███▀\n▄▄████▀ ▀████▄▄\n ▀▀▀██▄██▄██▀▀▀ \n▄█▀█▀▀████▀▀█▀█▄"], ["injured_2", " \n \n ▄ ▄▄▄▄ ▄ \n ███▀████▀ \n▄▄▄ ▀█▄▄█▄ ▄▄▄▄ \n▄█████▀▀██████▄▄\n ▀▀▀█▄██▄████▀▀ \n▄█▀█▀▀████▀▀█▀█▄"], ["sleep_1", " \n \n ▄ ▄▄▄▄ ▄ \n ██▀▀████▀ \n▄▄▄ ▀████▄ ▄▄▄▄ \n▄█████▀▀██████▄▄\n ▀▀█▄▄▄▄███▀▀▀ \n▄▄▀█▀▀████▀▀█▀▄▄"], ["sleep_2", " \n \n █▄████▄▄█ \n ▀█▄▄██▀▀ \n▀███▄▄█████▄███▀\n▄▄███▀ ▀████▄▄\n ▀▀▀█▄▄▄▄▄██▀▀▀ \n▄▄▀█▀▀████▀▀█▀▄▄"], ["walk_1", " █▄████▄▄█ \n ▀▄▀▀▀▄▀▀ \n▀███▄▄█▄███▄███▀\n▄▄██▄▀██▀ ▄▄██▄▄\n ▀▀██▄ ▄▄████▀▀ \n ▄█▀███▀▀█▄ \n █▄ ▄█ \n ▄▄▀▄ ▄▀▄▄ "], ["walk_2", " ▄ ▄▄▄▄ ▄ \n █▀███▀██▀ \n▄▄▄▄ ▀▄▄▄█▄ ▄▄▄▄\n ▀██▀████▀▀▀██▀ \n▀████ ▀▀ ▄█████▀\n ▀██▄█████▀ \n ▄█▀ ▀▀▀ ▀▀▀█▄ \n ▄▄▀█ ▀ ▀▀"]]], + ["okuwamon", [["angry", " ▄▄▀██▄ \n ▄▄▄▀█▄███ \n ▄███▀█████▀ \n ████▄▄████▀ \n ▄█▄ ▀▀█████▄ \n█ ▄█▀█▀▀▀▄ ███ \n▀▄▄█▀█▀▀▀▄▄████ \n █▄███▀▀████▄█ "], ["attack", " ▄▄ ▀█▄ \n ▄▄██▄▀█▄ \n ▄██▀ ▄████▀ \n █▀█▀█▀███▀▄ \n ████▄ \n ▄▄ ▄█▄ █ \n ▀▄▀▀█▀▀▀█▄▄█▀ \n █▄███▀▀████▄█ "], ["eat_1", " ▀█▄▀█▄ \n ▄▄██▄██▄██ \n █████▄ ███▀ \n ▀ ▀ ████▀▄ \n ██▀▀▀██▄\n ▄▀█▄▄▄▀▀▀█▀ ███\n ▀▄▄▀█▀▀▀██▄▄▀█▀\n █▄███▀▀████▄█ "], ["eat_2", " ▄▄ ▀█▄ \n ▄▄▀█▄▀██ \n ▄██▀█████ \n ███▄█▄███▀▄ \n █▀▀▀▄███████▄ \n ▄▄▀█▀ █▄ ████ \n ▀▄▀█▀▀█ ▄██▀█ \n █▄███▀▀████▄█ "], ["happy", "▄█▀ ▄▄ ▄▄ ▀█▄\n▀███▄█▄▄▄▄█▄███▀\n ██ ▄████▄ ██ \n ▄▄██▀█▀▀█▀██▄▄ \n█ ▀█ █▀ █\n▀▄▄█▀▄ ▄▀█▄▄▀\n ▀██▀▀▀█▀▀██▀ \n ██▄██▀▀▀▀██▄██ "], ["injured_1", " \n ▄█▀ ▄ ▄ ▀█▄ \n ██▀▄█▀▄▄▀█▄▀██ \n ████▀███▀█████ \n ▄██▄█▀▀▀█▄███▄ \n █ ▀█▄▄▄▄▄█ ▀▀ █\n █ █ ▀█▀ █ █\n █▄▄▄█▄█▄█▄▄▄▄▄▀"], ["injured_2", " \n ▄▄ ▄▄ \n ▄██ ▄█ █▄ ██▄ \n ██▄██▄██▄██▄██ \n ████▀███▀█████ \n ▀██▄▄███▄▄▀██▀▄\n █ ▀█▄█▄█▄█ █\n █▄▄█▄▄█▄▄█▄▄▄▄█"], ["sleep_1", " \n \n ▄▄▄▄▄▄▄ \n ▄█▀▄▀█▄▀▄▄▄▄▀█▄\n██▄███▄██▄▀███▄█\n██████████ █████\n█████████▀▄█████\n ▀████████████▀ "], ["sleep_2", " \n \n ▄▄ ▄▄▀█▀▀▀▀█▄ \n▄█▀▄█▄▀█▄▀███▄▀█\n██████████ █████\n██████████ █████\n█████████▀▄█████\n ▀██████▄█████▀ "], ["walk_1", " ▄█▀ ▄ ▄ ▀█▄ \n██▀▄█▀▄▄▀█▄▀██ \n▀███▀████▀███▀ \n ██▄▄██▄▄██▄ \n ▄█▄▀▀▀▀▄█▀██▄ \n █ █ ▀█▀▀ ▀▄ ██ \n ▀▄█▀▀█▀▀▀█▄▄█▀ \n █▄██▀▀▀█████▄█ "], ["walk_2", " ▄▄ ▄▄ \n██ ▄█ █▄ ██ \n████▄████▄████ \n ▀██▄ ██ ▄██▀ \n ▀█▀████▀███▄ \n ▄▀█▀▄▄▄▄▀█ ▀██ \n ▀▄█▄▄█▄▄▄▄▀ █▀ \n █▄██▄█▄▄▄███▄█ "]]], + ["okuwamon_x", [["angry", " ▄▄ ▄ ▄▄ ▄ \n██ █▀ ██ ▄█ \n▀███▄▄██████ \n ███▀ ███▀ ▄██▄\n ▀▀▀▀▀▄███████\n ▄▄██▀█▀▀▀█▄ ▀██\n█ ██▀█▀▀██▄▄▄▀ \n ███▄███▄█▄██▄█ "], ["attack", "▄█▀▄█ ▀█▄ ▀▄ \n██▄█ ▄██▄██ \n ▀████▀ ███▀▄██▄\n █▀█▀█▀██▄█▀███\n ██▄▀█▀█\n ▄██ █ \n ▀█████▄████ \n █▄█▄▀▀█▄▄█▄█ "], ["eat_1", "▄█▀▄█ ▀█▄ ▀▄ \n██▄█ ▄██▄██ \n ▀████▀████▀ ▄▄ \n ▀██▄█▄█▀▄▄████\n ▀██▀█▀██\n ▄██▀ █ ▀\n ▄████▄██▄▄▀ \n █▄█▄▀▀█▄▄█▄█ "], ["eat_2", " ▄▄ ▄ ▄▄ ▄ \n██ █▀ ██ ▄█ \n▀███▄▄██████ \n ███▀▄▀██▀ ▄██▄\n ▀▀▀▀▀▄███████\n ▀█▀█▀▀▀██▀▄▀█\n ▄▄█▀█▀▀█ ▄█ \n █▄█▄███▄████▄█ "], ["happy", "▄█▀▄█ ▀█▄ ▀▄ \n██▄█ ▄██▄██ \n ▀████▀████▀ ▄▄ \n ▀██▄█▄▀█▄▄████\n ▀███▀████\n ▄ ▄█▄█▀ ▀▄▀\n ▄███▄▄███▄▄▀ \n █▄█▄▀▀█▄▄█▄█ "], ["injured_1", " \n ▄▄ ▄ ▄▄ ▄ \n██ █▀ ██ ▄█ \n▀███▄▄██████ \n ███ ▀███▀ ▄██▄\n ▄▄▄▀▀▀▀▄█▄█████\n █ █████▀█ ▀█▀█\n █▄▄█▄█▄▄█▄▄▄█ "], ["injured_2", " \n \n▄█▀▄█ ▀█▄ ▀▄ \n██▄█ ▄██▄██ \n ▀███▀█████▀ ▄▄ \n ▄███▄▄█▀█▄▄████\n █ █▄▄▄▄▀█ ▀███\n █▄▄█▄█▄▄█▄▄▄█ ▀"], ["sleep_1", " \n \n \n ▄▄ ▄ ▄▄ \n██ █▀ ██ ▄█ █▄ \n▀███▄▄█████▀▄███\n █▀▀█▀▀██▀▄████\n ▀██████▀▄███▀ "], ["sleep_2", " \n \n \n▄█▀▄█ ▀█▄ ▀▄ ▄ \n██▄█ ▄██▄██ ██▄\n ▀█████████▀▄███\n █▄▄█▄▄██ █████\n ▀██████▀▄███▀ "], ["walk_1", "▄█▀▄█ ▀█▄ ▀▄ \n██▄█ ▄██▄██ \n ▀████▀▀███▀ ▄▄ \n ▀██▄▄█▀█▄▄████\n ▄▄▄▄▄███▀█▀██\n █▄█▄▄▄█▀ █ ▀\n ▄█▄█▄▄██▄▄▀ \n █▄█▄▀▀█▄▄█▄█ "], ["walk_2", " ▄▄ ▄ ▄▄ ▄ \n██ █▀ ██ ▄█ \n▀███▄▄██████ \n ███▀ ▄██▀ ▄██▄\n ▀▀▀▀▀▄███████\n ▀█▀█▀▀▀█▄▀▄▀█\n ▄▄█▀█▀▀██ █ \n █▄█▄███▄█▄██▄█ "]]], + ["omekamon", [["angry", "▄▄ ▄▄ ▄▄▄ \n▀▄█▀▀▄█▀▀█ ▄▀▄▄▄\n █▄ ▄▄ ▄ █▄▀ ▀█\n █▀▀▄▄▀▀ █▄ ▄▀ \n ▄███████▄███▄ \n█ █ █ ▄▀ █ █ \n ███▀▀▀▀▀████ \n█▄▄██▄▄▄█▄▄▄█ "], ["attack", " █▀▄▄█▀▄▄▄▄▀▀█\n ▀█ ▀▀ ▄▀▄▀ \n ██▄▄▄█▀ █ \n ▄▄▄▄█▄▄▄▄▄█ █ \n██ ███████ █ \n ▀▀▀▀▀▄▄▄▄▄▄▀ █ \n █▄ ▄█▄▄▀ \n █▄▄██▄▄▄█ "], ["eat_1", "█▀▄▄█▀▄▄▄▄▀▀█ \n ▀█▄ ▀▀▄▄▀▄▀▄▀██\n █▄▀▀▀▄▀ █▀ ▄▀\n █▄███▄█ ██▄▀ \n ▄██████▀▀█▀█▀ \n█ █▄▄▄▄▄▄▄█ █ \n ▀█▄ ▄▄█▀▀ \n █▄▄██▀█▄▄▄█ "], ["eat_2", "▄▄ ▄▄ ▄▄▄ \n▀▄█▀▀▄█▀▀█ ▄▀▄▄▄\n █▀▄ ▄▀▄ █▄▀ ▀█\n █▀▀▀▀▀▄ █▄ ▄▀ \n ███████▄███▄ \n▄▀█ █ ▄▀ █ ▀▄ \n▀▄██▀▀▀▀▀██▄▄▀ \n█▄▄██▄▄▄█▄▄▄█ "], ["happy", "█▀▄▄█▀▄▄▄▄▀▀█ \n ▀█▄ ▀▀▄▄▀▄▀▄▀██\n▄▄█▄███▄▀ ██▄ ▄▀\n█ █▄ ▄█ █ █ \n▀▄██████▀▀█▄▀ \n █▄▄▄▄▄▄▄█ \n █▄ ▄▄█ \n █▄▄██▀█▄▄▄█ "], ["injured_1", " \n \n█▀▄▄█▀▄▄▄▄▀▀█ \n ▀█ ▀▀ ▀▄▀▄▀██\n █▄█▀▀█▄ █▀ ▄▀\n █▄▄██▄▄ ██▄▀ \n▄▀▀▄▄ ▄▄▀▀█▄ \n█▄██▄▄▄█▄██▄█ "], ["injured_2", " \n \n▄▄ ▄▄ ▄▄▄ \n▀▄█▀▀▄█▀▀█ ▄▀▄▄▄\n █ ▄▄▄▄ █▄▀ ▀█\n █▀▀▄▄▀▀ █▄ ▄▀ \n▄▀▀█▀▀▀█▀▀██▀ \n█▄███▄██▄██▄█ "], ["sleep_1", " \n▄▄ ▄▄ ▄▄▄ \n▀▄█▀▀▄█▀▀█ ▄▀▄▄▄\n █ █▄▀ ▀█\n █▀▀ ▀▀▀ █▄ ▄▀ \n ▄███████▄███ \n█ ▀▄█▄█▄▄█ ▀ █ \n▀▄▄▄█▄▄▄▄█▄▄▄▀ "], ["sleep_2", " \n█▀▄▄█▀▄▄▄▄▀▀█ \n ▀█ ▀▀ ▀▄▀▄▀██\n █▄▄ ▄▄▄ █▀ ▄▀\n █▄▄▄▄▄▄ ██▄▀ \n ▄█▀█▀▀█▀▀█▀█ \n█ █▄█▄█▄▄█ ▀ █ \n▀▄▄▄█▄▄▄▄█▄▄▄▀ "], ["walk_1", "█▀▄▄█▀▄▄▄▄▀▀█ \n ▀█▄ ▀▀▄▄▀▄▀▄▀██\n █▄███▄▀ █▀ ▄▀\n █▄▄▄▄▄█ ██▄▀ \n ▄█▀█▀▀█▀▀█▀█▀ \n█ █▄█▄█▄▄▄█ █ \n ▀█▄ ▄▄█▀▀ \n █▄▄██▀█▄▄▄█ "], ["walk_2", "▄▄ ▄▄ ▄▄▄ \n▀▄█▀▀▄█▀▀█ ▄▀▄▄▄\n █▀▄▄▄▀█ █▄▀ ▀█\n █▀▀▀▀▀▄ █▄ ▄▀ \n ███████▄███▄ \n▄▀█ █ ▄▀ █ ▀▄ \n▀▄██▀▀▀▀▀██▄▄▀ \n█▄▄██▄▄▄█▄▄▄█ "]]], + ["omnimon", [["angry", " \n █▀▀▄█▀▀▀▀▄▀▀▀█ \n █▄▄▀ ▄ █▄▀ \n ▄▀▀▄ ▀▀ ▄▀▀▀▄ \n█ █▀▀▀▄▀█ █\n▀▄▄▀█▀▀█▀▀█▀▄▄▄█\n ▄▄▀▀██▀██▄▀▀█▄ \n█▄▄█▄▄█▀▀█▄▄█▄▄█"], ["attack", " █▀▀▀▄▄▀▀▀▄▀▀█\n ▀█▀ ▄▄ ▀█ \n ▄▀▀█ ▀▀ ▄▄█ \n█▄▄▀▀▀▀▄▀▀▀█ █\n█ █▄▄█▄▄▄▀\n ▀▀▄▄▄▄██▄▄▄▀▄ \n ▄█▀▀▄█▄▄█▀▀█▄ \n █▄▄█▄▄█▀█▄▄█▄▄█"], ["eat_1", "█▀▀▀▀█▀▀▀▀▄▀▀▀█ \n ▀█▄▀ ▄▄▄ █▄▀ \n ▄█▄▄▄▄▄▄ █▀▀▄ \n █▀██▀▀▀█▀▀█▄▄▀█\n ▄█▀█▀▀▀▀▄▀█▀ █\n█ ▄█▀█▀▀█▀▀▄ ▄▀\n▀▀██▀▀▄█▄█▄▀▀█▄ \n █▄▄█▄▄█▀█▄▄█▄▄█"], ["eat_2", " ▄▄▄▄▄▄ ▄▄▄▄ \n █▀▀▀▀▄ █ ▄▀ \n █▄▄▀ ▄ ██▄ \n ██ ▀ ▀▄█▄▄█▄\n▄▀▀█▄▄▄▄██▀ █\n▀▄ █▄▄█▄██▄▄▄▀ \n ▄█▀▀▄█ ▄█▄▀▀▄▄ \n█▄▄█▄▄█▀▀█▄▄█▄▄█"], ["happy", "█▀▀▀▀█▀▀▀▀▄▀█▀▀▄\n ▀█▄▀ ▄▀▄ █ █\n ▄█ ▄▄▄▄ █ █\n █▀██████▀▀██▄▄▀\n ██▀▀▀▀▀▄▀█▀▄▀ \n▄▀ ▄█▀█▀▀█▀▀█ \n█▄▄█▀▀▄█▄█▄▀▀█▄ \n █▄▄█▄▄█▀█▄▄█▄▄█"], ["injured_1", " ▄▄▄▄▄▄ ▄▄▄▄ \n █▀▀▀▀▄ █ ▄▀ \n █▄▄▀ ▄ ██▄ \n ██ ▀▀ █ █ \n █▀█▄▄▄▄▄█▀██▀█ \n▄▀▀▄█▄▄█▄██▄▀▀▀▄\n█ █▀▄█ ▄█▄█ █\n█▄█▄▄▄█▀▀█▄▄█▄▄█"], ["injured_2", " \n ▄▄▄██▀▀▀▀▄▀▀▀█ \n ▀▄ ▄▀ ▀▄▄▀ \n ▄█▀▀ ▄ █▀▀▄ \n ██▄ ▀▀▄█▄▄█ \n▄▀▀▄███▀▀██▄▀▀▀▄\n█ █▀▄█▀▀█▄█ █\n█▄█▄▄▄█▄██▄▄█▄▄█"], ["sleep_1", " \n ▄▄▄ ▄▄ \n ▀▄ ▀▀▀▀▀▀▄▀▀▄▀ \n █▀▀▀▀▄ ▀▄█▄ \n█▄█▄▄▀ █ █ \n█▄▄▀▀▀▄▀▀██▄█▀█ \n█▄ █ ▀█ █\n▀▄▄▄████▄▄▄▄▄█▄▀"], ["sleep_2", " \n █▀▀▄▄▄▄▄▄ ▄▄▀█ \n █▀▀▀▀▄ █ ▄▀ \n ▄█▄▄▀ █▄▄ \n█▄█ ▀▀▀ █ █ \n█▄▄▀▀▀▄▀▀▄█▄█▀█ \n█▄ █ ▀█ █\n▀▄▄▄████▄▄▄▄▄█▄▀"], ["walk_1", " █▀▀▄█▀▀▀▀▄▀▀▀█ \n █▄▄▀ ▄▄ █▄▀ \n ▄█ ▀▀ █▀▀▄ \n █ ▀▄▀▀▀▄▀▀█▄▄▀█\n ▄█▀█▀▀█▀▀▀█▀ █\n█ ▄█▀█▀▀█▀▀▄ ▄▀\n▀▀██▀▀▄█▄█▄▀▀█▄ \n █▄▄█▄▄█▀█▄▄█▄▄█"], ["walk_2", " ▄▄▄ ▄▄▄▄▄ ▄▄▄▄ \n ▀▄ ▀█ ▀▄ ▄▀ \n █▀▀ ▄█▀ ██▄ \n █▀▄ ▄▄▄ ▄▄█ █ \n █▄▄█▄▄▄█▄▄▀▀▀ █\n█ █▄▄█▄▄█ ▄▀\n ██▀▀▄█ ▄█▄▀▀█▄ \n█▄▄█▄▄█▀▀█▄▄█▄▄█"]]], + ["omnimon_alter_s", [["angry", " \n ██▄▄▄▀▀▀▀▄▄██▀ \n▄▄▀██▀ ▄ █▀ ▄▄\n▀▄▀▀▄ ▀▀ ▄▀▀▀▄▀\n█ █▀▀▀▄▀█ █\n▀▄▄▀█▀▀█▀▀█▀▄▄▄█\n ▄▄▀▀██▀██▄▀▀█▄ \n█▄▄█▄▄█▀▀█▄▄█▄▄█"], ["attack", " ▀██▄▄▄▀▀▀▄███\n █▀ ▄▄ ▀█ \n ▄▀▀█ ▀▀ ▄▄▀█\n█ ▄▄▀▀▀▄▀▀█▀ ▀▄\n█▀ █▄█▄ ▄▀\n ▀▀▄▄▄▄██▄▄▄▀█ \n ▄█▀▀▄█▄▄█▀▀█▄ \n █▄▄█▄▄█▀█▄▄█▄▄█"], ["eat_1", " ██▄▄▄▀▀▀▀▄███▀ \n ▀█▀ ▄▄▄ █▀ ▄▄\n ▄█▄▄▄▄▄▄ █▀▀▄▀\n █▀██▀▀▀█▀█ █\n▄▄██▀▀▀▀▀▄▀█▄▄▀█\n█ ▄█▀█▀▀█▀▀▄ ▄▀\n▀▀██▀▀▄█▄█▄▀▀█▄ \n █▄▄█▄▄█▀█▄▄█▄▄█"], ["eat_2", " ▄▄ ▄▄▄▄▄ ▄▄▄ \n ▀███▄ ███▀ \n▄▄▄██▀ ▄ █▄▄▀█\n▀▄█ ▀ ▀▄█▄▄█▄\n▄▀▀█▄▄▄▄▄█▀ █\n▀▄ █▄▄█▄█▄▄▄▄▀ \n ▄█▀▀▄█ ▄█▄▀▀▄▄ \n█▄▄█▄▄█▀▀█▄▄█▄▄█"], ["happy", " ██▄▄▄▀▀▀▀▄██▀▀▄\n ▀█▀ ▄▀▄ █ █\n█▀█ ▄▄▄▄ █ █\n █▀██████▀▀██▄▄▀\n ██▀▀▀▀▀▄▀█▀▄▀▄\n▄▀ ▄█▀█▀▀█▀▀█▄▄▀\n█▄▄█▀▀▄█▄█▄▀▀█▄ \n █▄▄█▄▄█▀█▄▄█▄▄█"], ["injured_1", " ▄▄ ▄▄▄▄▄ ▄▄▄ \n ▀███▄ ███▀ \n▄▄▄██▀ ▄ █▄▄▀█\n▀▄█ ▀▀▄▀ ▀▄\n █▀█▄▄▄▄▄█▀▄ ▄▀\n▄▀▀▄█▄▄█▄██▄▀▀▀▄\n█ █▀▄█ ▄█▄█ █\n█▄█▄▄▄█▀▀█▄▄█▄▄█"], ["injured_2", " \n ██▄▄▀▀▀▀▀▄▄██▀ \n ▀███ ▀█▀ \n█▀█▀▀ ▄ █▀▀▄ \n ██▄ ▀▀█ █\n▄▀▀▄███▀▀███▄▄▀▄\n█ █▀▄█▀▀█▄█ █\n█▄█▄▄▄█▄██▄▄█▄▄█"], ["sleep_1", " \n \n ██▄▄▀▀▀▀▀▄▄██▀ \n ▄████ ▀██▄▀█\n█▄█▀▀ ▄▀ ▀▄\n█▄▄▀▀▀▄▀▀██▄ ▄▀\n█▄ █ ▀█ █\n▀▄▄▄████▄▄▄▄▄█▄▀"], ["sleep_2", " \n ▄▄ ▄▄▄▄▄ ▄▄▄ \n ▀███▄ ███▀ \n ▄▄██▀ █▄▄▀█\n█▄█ ▀▀▀▄▀ ▀▄\n█▄▄▀▀▀▄▀▀▄█▄ ▄▀\n█▄ █ ▀█ █\n▀▄▄▄████▄▄▄▄▄█▄▀"], ["walk_1", " ██▄▄▄▀▀▀▀▄▄██▀ \n ▀██▀ ▄▄ █▀ ▄▄\n█▀█ ▀▀ █▀▀▄▀\n █ ▀▄▀▀▀▄▀█ █\n ▄█▀█▀▀█▀▀▀█▄▄▀█\n█ ▄█▀█▀▀█▀▀▄ ▄▀\n▀▀██▀▀▄█▄█▄▀▀█▄ \n █▄▄█▄▄█▀█▄▄█▄▄█"], ["walk_2", " ▄▄ ▄▄▄▄ ▄▄▄ \n ▀████ ▀██▀ \n▄▄▄▀▀ ▄█▀ █▄▄▀█\n▀▄▀▄ ▄▄▄ ▄▄▀ ▀▄\n █▄▄█▄▄▄█▄█▄ ▄█\n█ █▄▄█▄▄█ ▀▀▄▀\n ██▀▀▄█ ▄█▄▀▀█▄ \n█▄▄█▄▄█▀▀█▄▄█▄▄█"]]], + ["omnimon_x", [["angry", " ▄▄▄ ▄▄▄ \n ▀▄ ▀▄▀▀▀▄▀▄▄▀ \n █▄▀ ▄ ▀▀▄▄ \n ▄▀▄ ▀▀ ▄▀ ▄█ \n ▀███▀▀▀▄█▀██▀▀█\n █ █▀▀█▀ ▀█ ▄▀\n ▄█▀▀█▀▄▀██▀▀█▄ \n█▄▄█▄▄█▄██▄▄█▄▄█"], ["attack", " █▀▀▄ ▄▄▄ ▄▄▀█ \n ▀▄▄▀ ▄ █▄▄▀ \n ▄▀ ▀▀ ▄█▄ \n ▄▄████▄▄█ █ \n▄▀ ▄▄▄▀ ▀▄▀▄▄▀ \n ▀▄▄▄▄█▄▄▄▄██ \n ▄▄▀▀▄▀▀▀▄█▀▀█▄ \n█▄▄█▄▄█▀▀█▄▄█▄▄█"], ["eat_1", " █▀▀▄ ▄▄▄ ▄▀▀█ \n ▀▄ █ ▀▄█▀ \n ▄▀▀ ▀▀ ▄█▄ \n █▄██████ █▀ ▄█▄\n ▄▀▀██▄▄▀▄██▀ █\n ▀▄▄▀▄▄▄█▄▄█ █ \n ▄█▀▀▄▀▀▄█▀▀█▄ \n █▄▄█▄▄█▀█▄▄█▄▄█"], ["eat_2", " ▄▄▄ ▄▄▄ \n ▀▄ ▀▄▀▀▀▄▀▄▄▀ \n █▄▀ ▄ ▀▀▄▄ \n ▄▀▄ ▀ ▀ ▄▀ █ \n ▀▄██▀▀▀▄█▀██▀▄ \n █ █▀▀█▀ ▀█ █ \n ▄█▀▀█▀▄▀██▀▀█▄ \n█▄▄█▄▄█▄██▄▄█▄▄█"], ["happy", " █▀▀▀▄▀▀▀▄▀▀▀█▄▄\n ▀▄▀ ▄▀▄ ▀█▀ █\n █▄▄▄▄▄ ▄▄▀ ▄▀\n █ █████▀▄██▄█ \n ▄█▀█▄▄▄█▀▄█▄▀ \n█ ▄█▄▄▀▄▄▄█▄ \n▀▀██▀▀▄▀▀▄█▀▀█▄ \n █▄▄█▄▄█▀█▄▄█▄▄█"], ["injured_1", " ▄▄▄ \n █▀▀▀▄▀▀▀▄▀ ▄▀ \n ▀█▄▀ ▀▀▄▄ \n ▄▀▄ ▀▄▄ █ █ \n ▀██▄ ▄█▀▀█▀ \n ▄▀ █▀▀█▀ █▀▀▀█ \n █▄▀▀██▄▀██▄ █\n█▄▄█▄▄█▄██▄█▄▄█ "], ["injured_2", " \n▄▄▄▄ ▄▄▄ ▄▀▀█ \n▀▄▄ █ ▀▄▄▀▄▄ \n ▄▀▀ ▄ █ █ \n ▀█ ▀▀ ▄█▀▀█▀ \n ▄▀█▄▄▄▄▀ █▀▀▀█ \n █▄▀▀██▄▀██▄ █\n█▄▄█▄▄█▄██▄█▄▄█ "], ["sleep_1", " \n \n█▀▀▄ ▄▄▄ ▄▀▀█ \n ▀▄ █ ▀▄█▀▄▄ \n ▄▀▀ ▄▄ ▄▀ █▄\n█▄█▄▄▄▄ ▄█▀███▄█\n█▄▀▀▄▄▄█▀ █▀▄▄▀█\n█▄▄▄▄██▄███▄▄▄▄█"], ["sleep_2", " \n ▄▄▄ ▄▄▄ \n ▀▄ ▀▄▀▀▀▄▀▄▄▀ \n █▄▀ ▀▀▄▄ \n ▄▀▄ ▀▀ ▄▀ █▄\n▄█▄██▀▀▀▄█▀███▄█\n█▄▀▀█▀▀█▀ █▀▄▄▀█\n█▄▄▄▄██▄███▄▄▄▄█"], ["walk_1", " █▀▀▄ ▄▄▄ ▄▀▀█ \n ▀▄ █ ▀▄█▀ \n ▄▀▀ ▄█▀ ▄▀▀▄ \n █ █▄▄▄▄ ▄█▄▄▄▀█\n ▄█▀█▄▄▄█▀▄█▀ █\n█ ▄█▄▄▀▄▄▄█▄ ▄▀\n▀▀██▀▀▄▀▀▄█▀▀██ \n █▄▄█▄▄█▀█▄▄█▄▄█"], ["walk_2", " ▄▄▄ ▄▄▄ \n ▀▄ ▀▄▀▀▀▄▀▄▄▀ \n █▄▀ ▄▄ ▀▀▄▄ \n ▄▀▄ ▀▀ ▄▀ █▄\n ▀▄██▀▀▀▄█▀██▀ █\n▄▀▀ █▀▀█▀ ▀█ █\n▀▄▄▀▀█▀▄▀██▀▀▄█ \n█▄▄█▄▄█▄██▄▄█▄▄█"]]], + ["omnishoutmon_x", [["angry", " ▄▄ ▄▄▄▄▄▄▄ \n █ █▀▀ ▄▄▄▀ \n █ ▄█ ▄▀ \n █▄▄▀▀▀▀▄█▄▀▄ \n ▄▀▀▀█▀▀▀▄█ \n █▄ ▀▄ █▀ \n █ █▀▄▄ ██▀ \n ▀▀▀█▄▀▀▄█ "], ["attack", " ▄▀▀██▄▀▀▀▀▀█▀\n █ ▀ ▄▄ ▄▀█▀ \n █ ▄█▄▀▀ █▄ \n ▄▄███▄▄▄▄▀ █ \n▀▄ ▀▄ ▄█▄▄▄▀ \n▀▄▄█▀██▀▄▄█ \n ▀▄▀█▄ █▄ \n ▀▄▄▀▄▄▀ "], ["eat_1", " ▄▀█▄▄▀▀▀▀▀█▀ \n █ ▀ ▄▄▀▀█ \n █▄▄▄█▄▀ █ ▄ \n ███▀ █▀█▀ █ \n █▄▄▀█▄ █▄ █ \n ▄▀█▄ ▄▄█▀ ▀▄ \n █▄█ ▀█ ▀▄▄▀ \n █▄▀█▄▀ "], ["eat_2", " ▄▄ ▄▄▄▄▄▄▄ \n █ █▀▀ ▄▄▄▀ \n █ ▄██ ▄▀ \n █▄▄▀▀ ▀▄█▄▀▄ \n ▄▀▀▀▀▀█ █ \n █▄ ▀▀▄█▀▄▀ \n █ █▀▄█▀█ ▄▀ \n ▀▀▀█▄▀█▄█▀ "], ["happy", " ▄▀█▄▄▀▀▀▀▀█▀ \n █ ▀ ▄▄▀▀█ \n █▄▄▄▀ ▀ █▄▄ \n █ ██▀ ▄█▀ █ \n ▀█▄▄▀█▄▀█▄▀ \n ▀█▄ ▄▄█▀ \n █ ▀█ ▀▄ \n █▄▀█▄▀ "], ["injured_1", " \n ▄▀█▄▄▀▀▀▀▀█▀ \n █ ▀ ▄▄▀▀█ \n █ ▄▀▄▄ █ ▄ \n ▀▀▀▄▄▄▄██▀ █ \n ▄█ ▄▄▄█▀▄▀ \n █ █▀▄▄▄█ ▄▀ \n ▀██▄█▀ ▀███ "], ["injured_2", " \n ▄▄ ▄▄▄▄▄▄▄ \n █ █▀▀ ▄▄▄▀ \n █ ▄▀▀ ▄▀ \n █▄▄▀ ▀▀▄█▄▀▄ \n ▄▀▀▀▀▀█▄ █ \n ▄▀█▄ ▀▀█▀ ▀▄ \n █▄█▄█▀▀▀▄▄█ "], ["sleep_1", " \n \n ▄▀█▄▄▀▀▀▀▀█▀ \n █ ▀ ▄▀▀█ \n █ ▄▀█▄ █ ▄ \n ▀▀█▄▄▄▄██▀ █ \n ▄▀▀█ ▄▄▄▀▀▀▄ \n █▄▄▄█▄▄▄█▄▄▄█ "], ["sleep_2", " \n ▄▄ ▄▄▄▄▄▄▄ \n █ █▀▀ ▄▄▄▀ \n █ ▄▄▀ ▄▀ \n █▄▄▀ ▀▀▄█▄▀▄ \n ▄█▀▀▀▀▀█▄ █ \n ▄▀▀█▄ ▀▀▄▀▀▀▄ \n █▄▄▄█████▄▄▄█ "], ["walk_1", " ▄▀█▄▄▀▀▀▀▀█▀ \n █ ▀ ▄▄▀▀█ \n █ ▄█▄▀ █ ▄ \n ▀▀▀▄▄▄▄██▀ █ \n ▄▀ ▄▄ █▄ █ \n ▄▀█▄ ▄▄█▀ ▀▄ \n █▄█ ▀█ ▀▄▄▀ \n █▄▀█▄▀ "], ["walk_2", " ▄▄ ▄▄▄▄▄▄▄ \n █ █▀▀ ▄▄▄▀ \n █ ▄▀█ ▄▀ \n █▄▄▀▀▀ ▄█▄▀▄ \n ▄▀▀▀▀▀█ █ \n █▄ ▀▀▄█▀▄▀ \n █ █▀▄█▀█ ▄▀ \n ▀▀▀█▄▀█▄█▀ "]]], + ["ophanimon", [["angry", " ▄▄▄▄▄ ▄▄ \n ▄▀ ▀▄▀ █ \n █ █ ▀▄▄▀ \n █▄▄█▄▄ ▀█ ▄▄▄\n █▄█▄▄▄▀ ▀█ ▄▀\n ▄▀█▄▀▄▄███▀██ \n ▀▄█▄▄▄▄█ ▄█▀▀▄\n █▄▄██▄█▄███ ▀▄█"], ["attack", " ▄▀▀▀▀▀▄▄▀█ \n █▄█▄▄▄ ▀▄▄▀ \n █▄█▄ █ ▄▀█\n ▀▄ ▀▀▀█▀▀▄▄▀\n ▀██▀█▄▄▄▄▀ \n▄▀▀▀▀▀ █▀ ▄▀▀▄\n ▀▀▀█▀▄▄ █▄▄█▀▀ \n █▄▄█▀▀█▄▄▄█ "], ["eat_1", " ▄▀▀█▀▀▄▄▀▀█ \n █▀▀█▀▀ ▄▀▄▀ \n ███████ █▀ ▄▄▄\n █▀▀▀▀▄▀ ▀█ ▄▀\n ▄▀█▀█▀▀█▀▀█▄█ \n█▄██▀ ▀▀██▄▄▄█▀▄\n █▀█▀█▀▄█ ▀▄█\n █▄▄█▀█▄▄▄█ "], ["eat_2", " \n ▄▀▀▀▀▀▄ ▄▀█ \n █ ▄ ▄▀ ▄▀ \n █▀▀█▀▀ █▀ ▄▄▄\n ██▀▀▀▀▄█▀█▀ ▄▀\n ▄██▀███▄▄▄█▀ \n▄▀▄█▄▄▄▄██▄ ▀█▀▄\n▀█▄▄██▄█▄▄▄█▀▀▄█"], ["happy", " ▄▀▀▀▀▀▄ ▄▀█ \n █▄▄█▄▄ █▄▄▀ \n █▄▄█▄▄ █ █ \n ▀▄ ▀█▀ █▀▀█\n ▄▄▀█▀▀█▄▄█▀▄▀ \n █ █▀ ▀▀█▀█▄▀▀▄ \n ▀█▀█▀█▀▄█ ▀▄ █\n █▄▄█▀█▄▄▄█ ▀▀"], ["injured_1", " \n ▄▄▄▄▄ ▄▄ \n ▄▀ ▀▄▀ █ \n █ ▀▄█▀▄▄▄\n █▄▄█▄▄ ▄▀▄▀ ▄▀\n ▀▄█▄▄▄▀▄▄▀█ \n █▀▄█▄▄██ █▄▀▀▄\n █▄▄█▄▄█▄█▄▄█▀▄█"], ["injured_2", " \n \n ▄▀▀▀▀▀▄ ▄▀█ \n █ ▄▀▄▄▀▄▄▄\n █ ▄ █▀▄▀ ▄▀\n ▀█▀█▀▀ █▄ █▀█ \n ▄▀████▄ ▀█▄▀▀▄\n █▄▄█▄▄█▄█▄▄█▀▄█"], ["sleep_1", " \n \n ▄▀▀▀▀▀▄ ▄▀█ \n █ ▄ ▄▀ ▄▀▄▄▄\n █▀▀█▀▀ ██▄▀ ▄▀\n ▀█▀▀▀▀▀██ ▀██ \n █ ██▀██▀▀█▀█ ▀▄\n █▄▄█▄██▄▄█▄▄█▄█"], ["sleep_2", " \n ▄▄▄▄▄ ▄▄ \n ▄▀ ▀▄▀ █ \n █▄▄█▄▄ ▀▄▄▀▄▄▄\n █▄▄█▄▄▄▄▀▄█ ▄▀\n ▄▀▄▄▄▄▄▀▄▄██ \n █▀█▄▀▄▄▀▀▄ █ ▀▄\n █▄▄█▄██▄▄█▄▄█▄█"], ["walk_1", " ▄▀▀▀▀▀▄ ▄▀█ \n █▄▄█▄▄ ▄▀ ▄▀ \n █▄▄█▄▄ █▀ \n ▀▄ ▀█▀▄▄▀▀█\n ▄▄▀█▀▀█▄▄▄█▄▀ \n █ █▀ ▀▀█▀ █▀▄ \n ▀█▀█▀█▀▄▄█▀▄ █\n █▄▄█▀█▄▄▄█ ▀▀"], ["walk_2", " ▄▄▄▄▄ ▄▄ \n ▄▀ ▄ ▀▄▀ █ \n █▀▀█▀▀ ▀▄▄▀ \n █▀▀▀▀▀▄▄█ ▄▄▄\n █▄▄▄▄▄▀ ▀█ ▄▀\n ▄▀█▄▀▄▄██▀▀██ \n ▀▄█▄▄▄▄█ ▄█▀▀▄\n █▄▄██▄█▄███ ▀▄█"]]], + ["ophanimon_falldown_mode_x", [["angry", " ▄ ▄▄ ▄▄ \n ▄▀██▄██ █ ▄\n ████▀▀█▄▄█ ▄▀█\n █ ▄█ █ █ █ █\n ▀▄ █▀▀█ ▄▄▀\n █▄█▀▀▀█▄▄▄█ \n ▄▀▀█▄█▀▀▄█ ▀▄ \n █▄▄█▀▀▀█▄▄█▀▀▀▀"], ["attack", " ▄█▄▀█▄▀█ \n ▄█▄████▀ █ ▄█ \n █▀▀▀▄▄█▀█▀▄▀ █ \n █ ▀▀ █▄█▄▀ █ \n █▄▄▄▄█ ▀▄██ \n █ █▀█████▀▀ ▄█ \n ▀▀▄ ▀▄ ▄█ ▀▄\n █▄█▄▄█▄██ ▀▀▀"], ["eat_1", " ▄█▄▀█▄▀█ \n ▄█▄████▀ █ ▄█\n █▀▀ ▄ █▀█▀▄▀ █\n █ ▀ ▀█▄█▄▀ █\n ▀███ █ ▀▄▀▀ \n ▄█▄▄███▀█▀▄ \n █▄▀▀▄▀▀▄▄▀▄ ▀▄\n █▄▄▀ ▀▄▄█ ▀▀▀"], ["eat_2", " ▄ ▄▄ ▄▄ \n ▄▀██▄██ █ ▄\n ███▀▀▀█▄▄█ ▄▀█\n █ ▄▀▄█ █ █ █\n ▀▄ █▀▀█ ▄▄▀\n ▄█▀▀▀█▄▄▄█ \n ▄▀▀█▄█▀▀▄█▄▀▄ \n █▄▄█▀▀▀█▄▄█ ▀▀▀"], ["happy", " ▄█▄▀█▄▀█ \n ▄█▄████▀ █ ▄█\n █▀▀ ▄ █▀█▀▄▀ █\n █ ▀ ▀█▄█▄▀ █\n █ ████ █ ▀▄▀▀ \n ▀██▄▄▄███▀█▀▄ \n █▄█▀▀▄▀▀▄▄▀▄ ▀▄\n █▄▄▀ ▀▄▄█ ▀▀▀"], ["injured_1", " \n ▄█▄▀█▄▀█ \n ▄█▄████▀ █ \n █▀▀▄ █▀█▀▄▄ \n █ ▀▀ █▄█▄▀ ▀▄\n ▄▀▄▄▄▄█ ▀▄▀▄█\n ▄▀▀█▄ ▄█▀▀█▀▄ ▀\n █▄▄▄███▄▄▄▄█▄█▄"], ["injured_2", " \n ▄ ▄▄ ▄▄ \n ▄▀██▄██ █ \n ███▀▀▀█▄▄█▄▄ \n █ █▄ █ █ ▀ ▀▄\n ▀▄ █▀▀█▄▀▄█\n ▄▀▀██▀██▀▀▄▀▄ ▀\n █▄▄▄███▄▄▄▄█▄█▄"], ["sleep_1", " \n ▄ ▄▄ ▄▄ \n ▄▀██▄██ █ \n ███▀▀▀█▄▄█▄▄ \n █ ▄▄ █ █ ▀ ▀▄\n ▀▄ █▀▀█▄▀▄█\n ▄▀▀██▀██▀▀▄▀▄ ▀\n █▄▄▄███▄▄▄▄█▄█▄"], ["sleep_2", " \n ▄█▄▀█▄▀█ \n ▄█▄████▀ █ \n █▀▀ █▀█▀▄▄ \n █ ▀▀ █▄█▄▀ ▀▄\n ▄▀▄▄▄▄█ ▀▄▀▄█\n ▄▀▀█▄ ▄█▀▀█▀▄ ▀\n █▄▄▄███▄▄▄▄█▄█▄"], ["walk_1", " ▄█▄▀█▄▀█ \n ▄█▄████▀ █ ▄█\n █▀▀▀▄▄█▀█▀▄▀ █\n █ ▀▀ █▄█▄▀ █\n ▄▀▄▄▄▄█ ▀▄▀▀ \n ▀██▄ ▄██▀█▀▄ \n ▀▄▀▀█▀▀▄▄▀▄ ▀▄\n █▄▄▀ ▀▄▄█ ▀▀▀"], ["walk_2", " ▄ ▄▄ ▄▄ \n ▄▀██▄██ █ ▄\n ████▀▀█▄▄█ ▄▀█\n █ ▄█▀█ █ █ █\n ▀▄ █▀▀█ ▄▄▀\n █▄█▀▀▀█▄▄▄█ \n ▄▀▀█▄█▀▀▄█ ▀▄ \n █▄▄█▀▀▀█▄▄█▀▀▀▀"]]], + ["ophanimon_x", [["angry", " ▄▄▄▄▄▄███▀▀ \n ▄▀ ▀███▀ \n █▄█▄▄ █ ▄▄\n █ ▀▄ ▄▄█ ▄▀ █\n ▀▄▄▄██▄▄█ ▄▀▄\n ▄█▄▀▄▄▀█ ▀▄ ▄▀\n █ █▄▄▄▄█ ▄█▀▄ \n █▄▄█▀▄▄██ ▀▀▀ "], ["attack", " ▄▀▀▀▀▀▄███▀▀\n █▄█▄▄ ▀█▀▀ \n █▄█▄▄ ▄▀▄▀█\n ▀▄ ▀▄▀ ▀▄▄▀\n ▀████▀▀█ ▄▀\n▄▀▀▀▀▀ █ ▄▀▀▀▄ \n ▀▀▀▀█▄▀██▀▀█▀▄ \n █▄▄▀▀▄▄▄█▀▀ "], ["eat_1", " ▄▀▀█▀▀▄███▀▀ \n █ ▀█▀▀ ▀█▀▀ \n █▄▄▄▄▄ ▄▀ ▄▀█\n ▄▀███▀ █▀▄█ ▄▀\n █ ▄█▄▄▄█▀ ▄▄▀ █\n ▀█▀ ▀▀▄▀▀ █▄▀ \n █▀█▀▀▀▄▄█ ▀▄ \n █▄▄▄▀▄▄▄█ ▀▀▀ "], ["eat_2", " ▄▄▄▄▄▄███▀▀ \n ▄▀ ▀███▀ \n █▄▄█▄▄ █ ▄▄\n █▄▄█▄▄ █ ▄▀ █\n ▀▄▄▄▄█▀ ▀▀▄▀▄\n ▄▀█▄▀▄▄██▀▀█ ▄▀\n ▀▄█▄▄▄▄▀▄▄█▀▀▄ \n █▄▄█▀▄▄▄█ ▀▀▀ "], ["happy", " ▄▀▀█▀▀▄▄███▀▀\n █ ▀█▀▀ ▀█▀▀▀ \n █▄▄▄▄▄▄ ▄▀ ▄▀█\n ▄█▀████▀▄▀▀█ ▄▀\n █ █▄▄▄▄▄▀ █▀ █\n ▀▄█▀ ▀▀█▄▄▀█▄▀ \n █▀█▀▀▀█▀▄▄▀▄ \n █▄▄▄▀▄▄▄█ ▀▀ "], ["injured_1", " ▄▄▄▄▄ \n ▄▀▀▀▀▀████▄ \n █ ▀█▀ \n █▄▄█▄▄▄ ▄▀▄▀█ \n ▀▄ ▀ ▀▄█ █ \n ▄▀▀██▀▀ ▀▄▀ █\n ▄▀▀▀▄█▄▄▀▀▀█▄▀ \n █▄▄▄█▄▄█▄▄▄█▄█ "], ["injured_2", " \n ▄▄▄▄▄▄███▀▀ \n ▄▀ ▀███▀ \n █ ▄ █ ▄▀█ \n █▀▀█▀▀▀▄█▄█ █ \n ▀▄▄▄▄▄▄▀ ▀▄▀ █\n ▄▀▀▀▄█▄▄▀▀▀█▄▀ \n █▄▄▄█▄▄█▄▄▄█▄█ "], ["sleep_1", " ▄▄▄▄▄ ▄▄▄▄▄ \n ▄▀ ▀███▄ \n █▄▄█▄▄ █ ▄▄\n █▄▄█▄▄▄ █ ▄▀ █\n▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄\n█ █▀█▀█▀█▀█▀██ █\n█ ██▄█▄█▄█▄█▄█ █\n▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀"], ["sleep_2", " ▄▀▀▀▀▀▄███▀▀ \n █ ▄ ▀█▀▀ \n █▀▀█▀▀ ▄▀ ▄▀█\n ▀█▀▀▀▀▀▄▀▄▀ █\n▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄\n█ █▀█▀█▀█▀█▀██ █\n█ ██▄█▄█▄█▄█▄█ █\n▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀"], ["walk_1", " ▄▀▀▀▀▀▄███▀▀ \n █▄▄█▄▄ ▀█▀▀ \n █▄▄█▄▄ ▄▀ █▀█\n ▀▄ ▀▄▀▄█ ▄▀\n ▄▀█▀▀█ ▄▄▀ █\n ▄▀█▀ ▀▀▄▀▀ █▄▀ \n ▀▄█▀█▀▀▀▄▄█ ▀▄ \n █▄▄▄▀▄▄▄█ ▀▀▀ "], ["walk_2", " ▄▄▄▄▄ ▄▄▄▄▄ \n ▄▀ ▄ ▀███▄ \n █▀▀█▀▀ █ ▄▄▄\n █▀▀▀▀▀▄ █ ▄▀ █\n ▀▄▄▄▄▄▀ ▀▀▄▀▄\n ▄█▄▀▄▀█▄▄▀█ ▄▀\n ▀▄█▄▄▄▀▀█▄▄▀▀▄ \n █▄▄▄▀▀█▄▄▄█▀▀▀ "]]], + ["ordinemon", [["angry", " ▄▄▄ ▄▄▄ \n █▀██▄▄ ▄█▀███ \n ▄▀▀ ▄ ▀███▀██▀\n █ ▀▀ ▄██▄████\n █▀▀ ▀█ ▀████▄\n ███ ▀▄█ ███▀\n ██ █ ▄▀ ▄████▀\n ▄██▀▀▀ █▀█▀ "], ["attack", " ▄███▄▄ ▄███▄ \n▄▀▀ ▄▄▀▄█▄████▀\n▀███▄▀▀ ██▀▄███▄\n █▀▀▀ ▄███████▀\n ███ ▄▄▀▀█████\n ███ ▄ █ ███▄\n ██▄█▄▀ ▄████ \n ▄█▀ █▀█▀ "], ["eat_1", " ▄▀██▄▄ ▄███▄ \n ▄▀▀ ▄▄ ▀██▄███▄\n █▄▄ ▀▀ ██▀▄██▄\n ▀███ ▄█▀█████▀\n █▄ ▄ █ ▀████\n ███ ▄ ▀█ ███▄\n ██▄█▄▀ ▄████ \n ▄█▀ █▀█▀ "], ["eat_2", " ▄▄▄ ▄▄▄ \n █▀██▄▄ ▄█▀███ \n ▄▀▀ ▄ ▀███▀██▀\n █ ▀ ▀▄██▄████\n █▀▀ ▀█ ▀████▄\n ███ ▀▄█ ███▀\n ██ █ ▄▀ ▄████▀\n ▄██▀▀▀ █▀█▀ "], ["happy", " ▄▀██▄▄ ▄███▄ \n ▄▀▀ ▄ ▀██▄███▄\n █▄▄ ▀ ▀ ██▀▄██▄\n ▀███ ▄███████▀\n █▄ ▄▄▄▀ ▀████\n ███ ▄ ▀█ ███▄\n ██▄█▄▀ ▄████ \n ▄█▀ █▀█▀ "], ["injured_1", " ▄▄ ▄▄▄ \n ████▄ █▀███ \n █▄▀▀▀▀████▀█▄ \n █ █▄ ██▄██ \n ▀▄▄▄ ▄█▀█████▄\n █▄▄ ▄ ▀▄████▀\n ▄███▄▀▄▀ █ ████\n▄█▀ ▀▄▀▀▄▀ █▀█ "], ["injured_2", " \n ▄██▄ ▄███▄ \n █▄███▄█▄███▄ \n ▄▀▀ ▄ ▀█▀▄██▄ \n █ ▀▀ ▄█████▄ \n █▀▀ ▀▀▄▀█████\n ████ █ ▄ █▀███▄\n▄█▀ ▀▄▀▀▄▀ █▀█▀"], ["sleep_1", " \n \n ▄▄▄ \n ▄▄▄▄▀█ █▄ \n█▄█▄▄ ▀ ▄ ██▄\n▀██▄▄▄█▄▄ ▀ ▄███\n▄███████▀██▀███▄\n ▀▀██████▄██████"], ["sleep_2", " \n \n▄ ▄▄▀▀▀▄ \n██▄▀▀▀▀ █ ▀██▄\n▀██▀▀ ▄ █ ███\n▄▄▄▀▄█▄▄▀▄ ▄▀▀ \n▄███████▀██▀███▄\n ▀▀█████▄█████▀"], ["walk_1", " ▄███ ▄███▄ \n █▄▀▀▀▀▄██▄███▄\n █ ██ ██▀▄██▄\n ▀▄▄▄ ▄█▀█████▀\n █▄ ▄ █ ▀████\n ███ ▄ ▀█ ███▄\n ██▄█▄▀ ▄████ \n ▄█▀ █▀█▀ "], ["walk_2", " ▄▄▄ ▄▄▄ \n █▀██▄▄ ▄█▀███ \n ▄▀▀ ▄▄ ▀███▀██▀\n █ ▀▀ ▄██▄████\n █▀▀ ▀█ ▀████▄\n ███ ▀▄█ ███▀\n ██ █ ▄▀ ▄████▀\n ▄██▀▀▀ █▀█▀ "]]], + ["ornismon", [["angry", "▀█▀▀▀▀▄▄▀▀█ ▄▄ \n ▀█▄ ▄▀▀██ █▀▄\n ██▄▀▀ █▀ █ █\n ▄███ ▄█▀ ▀ ▄█\n ▀▄▄▄▄ ▀ ▀▄▀\n █ ▄▄█▀ \n ▀▄▀ █▀▀█▄\n ▀▄▄▀ ▀"], ["attack", " ▄▀▄▄▀▀█ \n ▄▀▄▄▄▀█▀ \n▄▀ ▀ ▀ █▄ \n█ ▄▀▀▀ █▀ ▀▀▄ \n ▀▀▀██▀ ▄▀▀ ▄█ \n ▀▄▄▀ ▄▄██▄▄ \n ▀▀▀▄ ▀▄ ▀█\n ▀▀ "], ["eat_1", " ▄ ▄▀█ ▄▄ \n ▄▀ ▀▄▄▀ █ █▀▄\n ▄▀▄▀▄ █ ▄▀ █ █\n█ ▄▄▄ ▄▀▄▀ ▀ ▄█\n▀▄█▄▄▄ ▀ ▀▄▀\n █ ▄▄█▀ \n ▀▄▀ █▀▀█▄\n ▀▄▄▀ ▀"], ["eat_2", "▀█▀▀▀▀▄▄▀▀█ ▄▄ \n ▀█▄ ▄▄▀█ █ █▀▄\n ██▄ ▀▄▀ █ █\n ▄███ ▄█▀ ▀ ▄█\n ▀▄▄▄▄ ▀ ▀▄▀\n █ ▄▄█▀ \n ▀▄▀ █▀▀█▄\n ▀▄▄▀ ▀"], ["happy", "▀█▀▀▀▀▄▄▀▀█ ▄▄ \n ▀█▄ ▄▀▀██ █▀▄\n ██▄▀ ▀ █▀ █ █\n ▄███ ▄█▀ ▀ ▄█\n ▀▄▄▄▄ ▀ ▀▄▀\n █ ▄▄█▀ \n ▀▄▀ █▀▀█▄\n ▀▄▄▀ ▀"], ["injured_1", " \n ▄▄ \n ▄▀▄▀ █ \n ▄▀▄ ▀█ \n▄▀ ▀▀ █▀▀▄▄ \n█ ▄▀▀▀ █ ▀▄ \n ▀▀▀█▀ ▀▄ ▀▄ ▀▄\n ▀▄▄▄▄██▄▄█▄█"], ["injured_2", " \n \n ▄ ▄▀█ \n ▄▀ ▀▄▄▀ \n ▄▀ █▄ █▀▀▄▄ \n█ ▄▄▄ ▄▀ ▀▄ \n▀▄█▄▄▄ ▀▄ ▀▄ ▀▄\n ▀▄▄▄▄██▄▄█▄█"], ["refuse", " ▄ ▄▀█ \n ▄▀ ▀▄▄▀ \n ▄▀ ▄█ █ \n█ ▄▄▄ ▄█▀▄▄ \n▀▄█▄▄▄▄▀ ▄▄ ▀▄ \n █▀ ▄▀ ▄█▀ \n ▀█▄▄▀▀█▀▀█▄\n ▀▄▄▀ ▀"], ["sleep_1", " ▄ ▄▀█ \n ▄▀ ▀▄▄▀ \n ▄▀ ▄▄ █ \n█ ▄▄▄ ▄▀▀▀▄ \n▀▄█▄▄▄ ▄ ▄ ▀▄ \n █ █ █ █ \n ▄█▄▀▄▄█▀█▄\n █▀█▀█▄▄▀ ▀"], ["sleep_2", " ▄▄ \n ▄▀▄▀ █ \n ▄▀ ▀█ \n▄▀ ▀▀ █▀▀▄ \n█ ▄▀▀▀ ▀▄ ▄ ▀▄ \n ▀▀▀▀▀▄ █ █ █ \n ▄█▄▀▄▄█▀█▄\n █▀█▀█▄▄▀ ▀"], ["walk_1", " ▄ ▄▀█ ▄▄ \n ▄▀ ▀▄▄▀ █ █▀▄\n ▄▀▄▀█▀ █ ▄▀ █ █\n█ ▄▄▄ ▄▀▄▀ ▀ ▄█\n▀▄█▄▄▄ ▀ ▀▄▀\n █ ▄▄█▀ \n ▀▄▀ █▀▀█▄\n ▀▄▄▀ ▀"], ["walk_2", " ▄▀▄▄▀▀█ \n ▄▀▄▄▄▀█▀ \n▄▀ ▀ ▀ █▄ \n█ ▄▀▀▀ █▀ ▀▀▄ \n ▀▀▀██▀ ▄▀▀ ▄█ \n ▀▄▄▀ ▄▄██▄▄ \n ▀▀▀▄ ▀▄ ▀█\n ▀▀ "]]], + ["orochimon", [["angry", " ▄▄▄▄ \n ▄▀▀ ▄ ▀▄\n▄▄▄▀▀▀▀▀▄▄▀▀ █\n█ ▄█ ▄█▀▀▀▀▄ █\n █▀ █ ▄█ ▀▄\n █▀▀▀▀█▀ ▄ █\n █▄▀▄ ▄▀█▀▀▀ █ \n ▀█▄█▄█▄█▄▀▀▄▄█"], ["attack", " ▄▀▀▀▀█▀▄ \n ▄▄▄▄▄▄██▄ ▀▀ █\n█ ▄▄▀▀▀▀▀▀▄ █\n▀██▄▀▀█▄▄ ▄█▀▀▄\n █▀▀▄▄▀███ ▄ █\n ▄▀█ ▀▄▄▄▀▄▄▀ \n █▀▄ ▄ ▄ ▄ ▄ ▀▄\n ▀▄█▄█▄█▄█▄▀▀▄█"], ["eat_1", " ▄▄▀▀▀▀▄ \n ▄▄▄▄█ ▀▀ █\n▄▀▀▄▄ ▄█▀▀▀▀▄ █\n█▄▄▄ █ ▀▀ ▀▄\n █▀▀ ████ █\n █▀▀▀▀█▄▄▄▄▀ █\n █▄▀▄ ▄ ▄ ▄ █ \n ▀█▄█▄█▄█▄▀▀▄▄█"], ["eat_2", " ▄▄▄▄ \n ▄▀▀ ▄ ▀▄\n▄▄▄▀▀▀▀▀▄▄▀ ▀ █\n█ ▄▀▄ ▄█▀▀▀▀▄ █\n █▀ █ ▄▀▄ ▀▄\n █▀▀▀▀█▀ ▄ █\n █▄▀▄ ▄▀█▀▀▀ █ \n ▀█▄█▄█▄█▄▀▀▄▄█"], ["happy", " ▄▄▀█▀▀▄ \n ▄▄▄▄█ ▀ ▀ █\n▄▀▀▄▀▄ ▄█▀█▀▀▄ █\n█▄▄▄▄ █ ▀ ▀ ▀▄\n █▀▀ ████▀ █\n █▀▀▀▀█▄▄▄▄▀ █\n █▄▀▄ ▄ ▄ ▄ █ \n ▀█▄█▄█▄█▄▀▀▄▄█"], ["injured_1", " \n ▄▄▄▄ \n ▄▀▀ ▄ ▀▄\n ▄▄▀▀▀▀▀▄▄▄██ █\n█ █▄▄▀▀ ▄ ▀▄▀\n▀█▀ █▄▄ ▀▀ █\n ▄▀█▀█ ▀▄▄▄▄▀ ▄█\n ▀█▄█▄█▄▄▄▄▄██▄▀"], ["injured_2", " \n \n ▄▄▀▀▀▀▄ \n ▄▄▄▄█ █▄ █\n▄▀▀ ▄ ▄█▀▀▀▀▄ █\n█▄▄ ▀▀█ █▄ ▀▄\n ▀▄▄▄▄▀█▀ ▄ █\n ██▄█▄█▄████▄▄█▀"], ["sleep_1", " \n ▄▄▄▄ \n ▄▀▀ ▀▄\n ▄▄▀▀▀▀▀▄▄▄██ █\n█ ▄▄▄▀▀ ▀▄▀\n▀█▀ █▄▄ ▀▀ █\n ▄▀█▀█ ▀▄▄▄▄▀ ▄█\n ▀█▄█▄█▄▄▄▄▄██▄▀"], ["sleep_2", " \n ▄▄▀▀▀▀▄ \n ▄▄▄▄█ ▄▄ █\n▄▀▀ ▄█▀▀▀▀▄ █\n█▄▄ ▀▀█ ▄▄ ▀▄\n ▀▄▄▄▄▀█▀ ▄▄▀\n █▄▀▄ ▄ █▀█▀▀▀▄ \n ▀▄█▄█▄█▄█▄▄▀▀▄█"], ["walk_1", " ▄▄▀▀▀▀▄ \n ▄▄▄▄█ ▄█▀ █\n▄▀▀ ▄▄ ▄█▀▀▀▀▄ █\n█▄▄▀▀ █ ▄█▀ ▀▄\n ▀▄▄▄▄██▀ ▄ █\n ▄▀▄ ▀██▀▀▄▄▀ \n █▀▄ ▄ ▄ ▄▄▄ ▀▄\n ▀▄█▄█▄█▀ ▀▄█"], ["walk_2", " ▄▄▄▄ \n ▄▀▀ ▄▄ ▀▄\n▄▄▄▀▀▀▀▀▄▄▀▀ █\n█ ▄█▀ ▄█▀▀▀▀▄ █\n █▀ █ ▄█▀ ▀▄\n █▀▀▀▀█▀ ▄ █\n █▄▀▄ ▄▀█▀▀▀ █ \n ▀█▄█▄█▄█▄▀▀▄▄█"]]], + ["otamamon", [["angry", " \n \n ▄▄▄▄▄▄▄ \n ▄█████████▄ \n █▀▀██▀▀████▀▀▄\n █▀▀▀▀▀█████▄ █\n ▄███████████▄█ \n█▄█▄██▀▀▀██▄█▄█ "], ["attack", " \n ▄███████▄ \n ███▀ ▄█████ \n █▀▀▀▀▀▀████ ▄▄ \n ▀▄██▄██ ████ █\n ▄█▀██▀█ █████▄▀\n █▄▄▄▄▄▄██████▄ \n█▄██▀▀▀▀▀██▄█▄█ "], ["eat_1", " \n ▄▀████▀█▄ \n █▄█▄██▄█▄██ \n ▀▄▄▄▄▄▄▀███ \n █████ ███▄▀▀▄\n ▄▀██▀█ ███▀▄ █\n ▄█▄▄▄▄▄█████▄▀ \n█▄█▄█▀▀▀██▄█▄█ "], ["eat_2", " \n \n ▄▄▄▄▄▄▄ \n ▄█▀███▀███▄ \n █▄█▄█▄█▄███▄▀▀▄\n █▀▀▀▀▀▀▀▄██▀▄ █\n ▀███████████▄▀ \n██▄██▀▀▀██▄█▄█ "], ["happy", " \n ▄▀████▀██▄ \n █▄█▄██▄█▄███ \n █▀▀▀▀▀▀▀▀▀██▀▀▄\n █ ███████ ██▄ █\n █ █▀██▀█▀▄██▄▀ \n ▀█▄▄▄▄▄▄████▄ \n █▄███▀▀██▄█▄█ "], ["injured_1", " \n \n \n ▄▄▄▄▄▄▄ \n ▄█████████▄ \n █▄▄██▄▄▄███▄▀▀▄\n ██▄▄▄▄▄████▄█▄▀\n█▄█████████▄█▄█ "], ["injured_2", " \n \n \n ▄▄▄▄▄▄▄ \n ▄█████████▄ \n ███████████▄▀▀▄\n █▄▄███▄▄███▄█▄▀\n█▄█████████▄█▄█ "], ["sleep_1", " \n \n \n \n ▄▄██████▄▄ ▄▄ \n ████████████ █\n █▄▄██▄▄▄█████▄▀\n ▀███████████▀ "], ["sleep_2", " \n \n \n ▄▄▄▄▄▄▄ \n ▄█████████▄ ▄▄ \n █▄▄██▄▄▄████ █\n █▀▀▀▀▀▀████▄▀▄▀\n ▀█████████▀▀▀ "], ["walk_1", " \n \n ▄▄▄▄▄▄▄ \n ▄█████████▄ \n ██ ███ ████▄▀▀▄\n ████████▀██▀▄ █\n ▀▄▄▄▄▄▄▄████▄▀ \n██▄██▀▀▀██▄█▄█ "], ["walk_2", " \n \n \n ▄███████▄ \n ██▀███▀████ ▄▄ \n ██▄███▄█████ █\n █▀▀▀▀▀▀▀▄██▄█▄▀\n█▄█████████▄█▄█ "]]], + ["otamamon_x", [["angry", " \n ▄ ▄ ▄ \n █▀▀▀█ \n ▄███████▄ \n ███████████ \n █▄▄██▄▄████ ▄ \n ██▀▄▄▀██████▀ \n ▀███████▀ "], ["attack", " █▄█▄█ \n ▄█▄▄▄█▄ \n ▄███▀ ▄███▄ \n █▀▀▀▀▀█████ \n ▀▀███▄▀███ \n ████ ███ █ \n ▄▀▀▀▀▀▄█████▀ \n ▀▀█████▀▀ "], ["eat_1", " ▄ ▄ ▄ \n █▀▀▀█ \n ▄▀████▀█▄ \n █▄█▄██▄█▄██ \n ▀▄▄▄▄▄▀████ \n ████ ████ ▄ \n ▄▀▀▀▀▄█████▀ \n ▀███████▀▀ "], ["eat_2", " \n ▄ ▄ ▄ \n █▀▀▀█ \n ▄███████▄ \n █▀▄▀█▀▄▀███ \n ███████████ \n ██▄▀▀▀▄████▄█ \n ▀███████▀▀▀ "], ["happy", " █▄█▄█ \n ▄█▄▄▄█▄▄ \n ▄▀▄▀██▀▄▀██▄ \n █▀▀▀▀▀▀▀▀▀██ \n █ ███████ ██▄█ \n █ ███████ ███▀ \n ▀█▄▀▀▀▀▀▄██▀ \n ▀▀▀▀▀▀▀▀ "], ["injured_1", " \n \n █▄█▄█ \n ▄█▄▄▄█▄ \n ▄▀▀██▀▀▀██▄ \n ███▀███████ \n ██▄█▄██████▄ \n ▀█████████▀▀█ "], ["injured_2", " \n \n ▄ ▄ ▄ \n █▀▀▀█ \n ▄███████▄ \n ███████████ \n █▀▀██▀▀████▄ \n ▀█████████▀▀█ "], ["sleep_1", " \n \n ▄ ▄ ▄ \n █▀▀▀█ \n ▄▄██████▄▄ \n ████████████ \n █▄▄██▄▄▄████▄ \n ▀███████████▀ "], ["sleep_2", " \n \n █▄█▄█ \n ▄█▄▄▄█▄ \n ▄▀▀██▀▀▀██▄ \n ███████████ \n ███▀▀██████▄█ \n ▀█████████▀▀ "], ["walk_1", " \n ▄ ▄ ▄ \n █▀▀▀█ \n ▄███████▄ \n ██▀███▀████ \n ██▄███▄████ ▄ \n ███▀▀▀██████▀ \n ▀███████▀▀ "], ["walk_2", " \n \n ▄ ▄ ▄ \n █▀▀▀█ \n ▄███████▄ \n ██▀███▀████ \n ██▄███▄████ ▄ \n ▀██▄▄▄██████▀ "]]], + ["ouryumon", [["angry", " ▄▄ ▄▄▄ ▄ \n ▄▄█▀▀▀▀ ▄█ █ \n█▀ ▄█ ▄▄▄█ █ \n █▀▀ ▄▄▄█ █▄ █\n ▀▀▀█▀▀▀ ████ █\n ▄█ ▄█ ▀█▄▀\n █ █ █▄▄▀▄▀ ▀▄\n ▀▀█▄▄█▄██▀█▄█"], ["attack", " ▄▄██▄█▀▀▄▀▄ \n█▀▀ ▄█ ▀▀▄▀▄ \n▄████▄▄ ▀█▀█ ▀▄\n█ ▀████ ▄▀█▄█▄ █\n█▄ ▀▄▄▄▀▄█▀██ █\n █▄ ▄▀ ██ █▄▀\n ▀██▄▄▀█▄ ▄█▄ █\n ▀▀█▄██▀ ▀▄█"], ["eat_1", " ▄██▄█▀▀▄▀▄ \n█▀▀▀ ▄ ▀▀█ █ \n████▄▀ ▀ ▀█▀█ █\n █▀▀▀ ▄█▀█▄██ █\n ▀██▀▀▀ ▄█▀ █ █\n █ █ █▄▀▄▄▀█▀\n ▀█▄ ▀▀▀▄▄ █\n ▀▀▄▄▄▀▀ ▀▄█"], ["eat_2", " ▄▄ ▄▄▄ ▄ \n ▄▄█▀▀▀▀ ▄█▄▀▄ \n█▀ ▄▀▄ ▄▄▄█ ▀▄\n █▀▀ ▄▄▄█ █▄ █\n ▀▀▀█▀▀▀ ████ █\n ▄▀█ ▄▀█▀ ▀██▄█\n ▀▄█ ▀█▄█▄▀ ▀▄\n ▀█▄▄▄▄▄█▀█▄█"], ["happy", " ▄██▄█▀▀▄▀▄ \n█▀▀▀ ▄ ▀▀█ █ \n ███▄▀ ▀ ▄▀█▀▄ █\n █▀▀▀ ▄██▀▀▀█ █\n ████▀▀▀█ █ █\n █ █ ▀▀▀██▀\n ▀▀█▄ ▄▄▄ █\n ▀▀▄▄▄▀▀ ▀▄█"], ["injured_1", " ▄▄ ▄▄▄ \n ▄▄█▀▀▀▀ ▄█ ▄ \n█▀ ▄ ▄▄▄█ █ \n █▀▀ ▀▀▄▄▄█ █ ▀▄\n ▀▀▀█▀▀▀ █▀██ █\n ▄█ ▄█ █ █\n █ █ █▄▀▀▄▀█▀▄\n ▀▀█▄▄███▄▄▄▄█"], ["injured_2", " \n ▄██▄█▀▀▄ \n▄▄▀▀▀ ▀▀▄▀▄ \n▀▄▄▄ █▄ ▀█▀█ █ \n ▀▄▄▄▄▄██▀█▄█▄ █\n ▄▀ ▄█▀██ █\n ▄▀▀█ ▄▀█▄ ▄█▀▄\n ▀▄▄████▄▄██▄▄▄█"], ["sleep_1", " ▄▄ ▄▄▄ ▄ \n ▄▄█▀▀▀▀ ▄█ █ \n█▀ ▄▄▄ ▄▄▄█ █ \n █▀▀ ▄▄▄█ █▄ █\n ▀▀▀█▀▀▀ ████ █\n ▄█ ▄▄▀ ▀██▄▀\n █ █ █▄▀▄▄▀ ▀▄\n ▀▀█▄██▄▄█▀█▄█"], ["sleep_2", " ▄██▄█▀▀▄▀▄ \n▄▄▀▀▀ ▀▀▄▀▄ \n▀▄▄▄▀▀▀ ▀█▀█ ▀▄\n ▀▄▄▄▄▄██▀█▄█▄ █\n ▄▀ ▄▀███ █\n ▄▀█ ▄▀█ ▄▀▀▄▀\n ▀▄█▄▀█▄▀▀▄▄▄ █\n ▀▀▄▄▄▀▀ ▀▄█"], ["walk_1", " ▄██▄█▀▀▄▀▄ \n▄▄▀▀▀ ▄▄ ▀▀█ █ \n▀▄▄▄▀▀▀ ▀█▀█ █\n ▀▄▄▄▄▄██▀█▄██ █\n ▄▀ ▄▀███ █\n ▄▀█ ▄▀█ ▄▀▀█▀\n ▀▄█▄▀█▄▀▀▄▄▄ █\n ▀▀▄▄▄▀▀ ▀▄█"], ["walk_2", " ▄▄ ▄▄▄ ▄ \n ▄▄█▀▀▀▀ ▄█▄▀▄ \n█▀ ▄▄█▀ ▄▄▄█ ▀▄\n █▀▀ ▄▄▄█ █▄ █\n ▀▀▀█▀▀▀ ████ █\n ▄▀█ ▄▀█▀ ▀██▄█\n ▀▄█ ▀█▄█▄▀ ▀▄\n ▀█▄▄▄▄▄█▀█▄█"]]], + ["pabumon", [["angry", " \n \n \n \n ▄▄▄▄ \n ▄▀▄▄ ▀▄ \n █▄▄▄ █ ▀ \n ▀▄▄▄▄▄▄▀ "], ["attack", " \n \n ▄ \n ▄▀▀▀▀▄ \n ▀▀▄▀ █ ▄ \n █ █ \n ▄▄▄▄█ █ \n ▀▄▄▄▄▄▄▄▀ "], ["eat_1", " \n \n \n ▄▄▄ ▀ \n ▄▀ ▄ ▀▄ \n ▀▀▄ █ ▀ \n ▄▄▄▄█ █ \n ▀▄▄▄▄▄▄▄▀ "], ["eat_2", " \n \n \n \n ▄▀▀▀▄ ▀ \n █ ▄ █ ▄ \n ▀▄▄▄▄█ █ \n ▀▄▄▄▄▄▄▄▀ "], ["happy", " \n \n ▄▄▄▄ \n ▄▀▄ ▄ ▀▄ \n █ ▄ █ \n ▀▄ ▀ ▄▀ \n ▀ ▀▀▀▀ ▄ \n ▄▄▄ "], ["injured_1", " \n \n \n \n \n ▄▄▄▄▄ \n ▄▀ ▀▄ \n ▀ ▀▄██▄██▄▀ ▄ "], ["injured_2", " \n \n \n \n \n \n ▄▀▀▀▀▀▄ \n ▄█▄██▄██▄█▄ "], ["sleep_1", " \n \n \n ▄ \n ▀ \n ▄▄▄▄▄ \n ▄▀▄▄ ▄▄▀▄ \n ▀▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n \n ▄ \n ▄ \n ▄▀▀▀▀▀▄ \n █ ▀▀ ▀▀ █ \n █ ▀ █ \n ▀▄▄▄▄▄▀ "], ["walk_1", " \n \n \n \n ▄ \n ▄▀▀▀▄ ▀ \n █ ▀ ▀ █ \n ▀▄▄▄█▄▄▄▀ "], ["walk_2", " \n \n \n \n ▀ \n ▄ ▄▀▀▀▄ \n █ ▄ ▄ █ \n ▀▄▄▄▄▄▄▄▀ "]]], + ["pagumon", [["angry", " \n \n ▄▄▄ ▄▄▄ \n▄▀ █▄▄▄▀▀ ▀▄\n█ ▄▀ ▄▄ █\n ▀█▄ ▄ █▀ \n █▀▀ ▄ ▀▀ █ \n ▀▄█▄█▄▄▄▄▄▀ "], ["attack", "▄▀▄▄ ▄▄▀▀▄\n█ ██▄▄▄▀▀ ▄▀\n █ █▄ ▄█ ▄▄▀ \n █ ▄▄▄▄▄▄ ▀▄ \n ▀█▀▄█▄█▄█▄ ▀▄ \n █ ███████ █ \n █▀▄█▄█▄█▄▀ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["eat_1", " \n▄▀▀▀▄ ▄▄▀▀▀▄\n▀▄ █▄▄▄▀ ▄▄▀\n █▀▄ ▄ ▄█ \n █ ▀ ▄ ▀ █ \n █ █████ █ \n █ ▀███▀ ▄▀ \n ▀▄▄▄▄▄▄▄▄▀ "], ["eat_2", " \n \n \n ▄▀█▄▄▄▄▄▀▀▄▄ \n▄▀▄ ▄ ▀▄\n█ █▄▀▄ ▄▀▄ ▀▄ █\n ▀█ ▄▄▀▄▄ █▀ \n ▀▄▄▄▄▄▄▄▄▀ "], ["happy", " \n▄▀▀▀▄ ▄▄▀▀▀▄\n▀▄ █▄▄▄▀ ▄▄▀\n █▀▄ ▄ ▄█ \n █▀ ▀▄▀ ▀ █ \n █ █████ █ \n █ ▀███▀ ▄▀ \n ▀▄▄▄▄▄▄▄▄▀ "], ["injured_1", " \n \n \n ▄▀▀▄▄▄▄▄▀▀▄▄ \n▄▀▄ ▄ ▀▄\n█ █ ▄ ▄ ▀▄ █\n ▀█▀▀ ▄ ▀▀ ▀█ \n ▀▄█▄█▄▄▄▄▄▀ "], ["injured_2", " \n \n \n \n ▄▄▀▀▀▀▀▀▀▄▄ \n▄▀ ▀▄ \n█ ▀▄█ █▄ ▄ █\n▀▄▄█▄▄▄▄▄▄█▄▄▄▄▀"], ["sleep_1", " \n \n \n \n ▄▄▀▀▀▀▀▀▀▄▄ \n▄▀ ▀▄ \n█ ▀▄▄ ▄▄ ▄ █\n▀▄▄█▄▄▄▄▄▄█▄▄▄▄▀"], ["sleep_2", " \n \n \n ▄▄▄▄▄▄▄ \n ▄▀▀ ▀▀▄ \n█ ▄ ▀▄\n█ ▀█▀ ▀▀▄▀ █\n ▀▄▄█▄▄▄▄▄█▄▄▄▀ "], ["walk_1", " \n \n \n ▄▀█▄▄▄▄▄▀▀▄▄ \n▄▀▄ ▄ ▀▄\n█ █ █ █ ▀▄ █\n ▀█ ▄▀▄ █▀ \n ▀▄▄▄▄▄▄▄▄▀ "], ["walk_2", " \n \n ▄▄▄ ▄▄▄ \n▄▀ █▄▄▄▀▀ ▀▄\n█ ▄▀ ▄▄ █\n ▀█ ▄ ▄ █▀ \n █ ▀ ▄ ▀ █ \n ▀▄█▄█▄▄▄▄▄▀ "]]], + ["paildramon", [["angry", " ▄▄▄▄▄▄ ▄▄▄▄▄\n ▄█▄ ▄▄█▄█ ▄▀\n █▀▀ █▀ █▀ █▄▀ \n █▀▀▀▀▀▀▀▄█▀▀█▄ \n █▀▀▄▄▄▀█▄▄ █ \n ▄▀▀█▄▄█▀ ▀██ \n █▄▀▀████▄▄▀▀█ \n █▄█▄▄█ █▄█▄█▄█"], ["attack", " ▄▀▀▀▀█▀▄▀▀▀▀█\n ▄██▀▄█▀██▀▄▄▄▀ \n▄█▄▄▄█▄▄█▄▀ ▀▄ \n█▀▄▄▄▄▄ ▄██▄▄▀█ \n▀▄▄████ █▀█▄▄█▀ \n ▀▄▄▄█▄█▀▀▀▄ \n ▄█▀▀██▀▀█▀▀▀█ \n █▄█▄▄█ █▄█▄█▄█"], ["eat_1", " ▄▀▀▀▀█▀▄▀▀▀▀█\n ▄██▀ ▄▄██▀▄ ▄▀ \n █▄▄▄█▀▄▀█ ██▄▄ \n ▀▄▄▄▀▀▀███▀ ▄█\n █▀▀▀▀▄█ █▄▀▀█▄\n ████▄▄██▄ ▄█\n ▄█▀▀▄▀▀█▀▀▀█ \n █▄█▄▄█ █▄█▄█▄█"], ["eat_2", " ▄▄▄▄▄▄ ▄▄▄▄▄\n ▄█▄ ▄▄█▄█ ▄▀\n █▀▀ ▄▀▄▀█ █▄▀ \n █▀▀▀███▀▄█▀▀█▄ \n █▀▀▄▄▄▀█▄▄ █ \n ▄▀▀█▄▄█▀ ▀██ \n █▄▀▀████▄▄▀▀█ \n █▄█▄▄█ █▄█▄█▄█"], ["happy", " ▄▀▀▀▀█▀▄▀▀▀▀█\n ▄██▀▄█▀██▀▄ ▄▀ \n █▄▄▄█▄█▄▀▄█▀▀▄ \n ▀▄▄▄▄▄ ▄▀█▄ ▄█\n ▄█▀▀▀▄█ █▄▀█▀ \n █ ███▄▄█▀▀▀▄ \n ▀██▀▀▄▀▀█▀▀▀█ \n █▄█▄▄█ █▄█▄█▄█"], ["injured_1", " ▄▄▄▄▄▄ ▄▄▄▄▄\n ▄█▄ ▄▄█▄█ ▄▀\n █▀▀ █▀██▀ █▄▀ \n █▀▀▀█▄▄▀▄█▀▀█▄ \n █▀▀▄▄▄▀█▄▄ █ \n ▄▀▀█▄▄███ ▀██ \n █▄▀▀███▀ ██ \n █▄█▄▄█ ▀▄▄▄██▄█"], ["injured_2", " \n ▄▀▀▀▀█▀▄▀▀▀▀█\n ▄██▀▄████▀▄ ▄▀ \n █▄▄▄█ ▀█ ▄▀▀▄▄ \n ▀▄▄▄▀▀▀▄█▄▄ █ \n ▀▄▄█▀▀▄██ ▀██ \n █▄▀▀███▀ ██ \n █▄█▄▄█ ▀▄▄▄██▄█"], ["sleep_1", " \n ▄▄▄▄▄▄ ▄▄▄▄▄ \n ▄█▄ ▄▄█▄█ ▄▀ \n█▀▀ █▀ █▄▀ \n█▀▀▀███▀▄█▀▀█▄ \n ███▄▄▄▀█▄▄▄▄█▄ \n █ ▀▄▄███ ▀ ▀ █\n █▄▄▄█████▄▄▄▄▄█"], ["sleep_2", " \n ▄▀▀▀▀█▀▄▀▀▀▀█\n ▄██▀ ▀▀██▀▄ ▄▀ \n █▄▄▄▄▄▄█ ▄██▄ \n ▀▄▄▄▀▀▀▄█▀ ▀█ \n █▄▄█▀▀▄███▄▄█ \n █ ▀█████ ▀ ▀ █\n █▄▄▄█████▄▄▄▄▄█"], ["walk_1", " ▄▀▀▀▀█▀▄▀▀▀▀█\n ▄██▀ ▀▀██▀▄ ▄▀ \n █▄▄▄▄▀██ ▄██▄ \n ▀▄▄▄▀▀▀▄█▀ ▀█ \n ▀▄▄█▀▀▄█▀▀▄▄█ \n █ ████▄ ▄█▀ \n ██▀▀▄▀▀█▀▀▀█ \n █▄█▄▄█ █▄█▄█▄█"], ["walk_2", " ▄▄▄▄▄▄ ▄▄▄▄▄\n ▄█▄ ▄▄█▄█ ▄▀\n █▀▀ ▄▄█▀ █▄▀ \n █▀▀▀█▄█▀▄█▀▀█▄ \n █▀▀▄▄▄▀█▄▄ █ \n ▄▀▀█▄▄█▀ ▀██ \n █▄▀▀████▄▄▀▀█ \n █▄█▄▄█ █▄█▄█▄█"]]], + ["paledramon", [["angry", " ▄▄ ▄▄▄ ▄▄▄▄\n █▄▀▀ ▄▀▀▀█ ▄▀\n ▄▀ ▄ ▄▀▄ ▄▄█\n▄▀ ▀▀ ▄▄▀▀▄▄▀ \n▀▄▄▄▀▀▀█▀ ▄█ ▀▄ \n ▄▀▄▄▀▀ █ ▄ ▄█\n ▀▄█▄▄▄▀▀▄█▄▄█▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["attack", " ▄▀█▄▀▀█▄▄▄▀▀▀█\n ▄▀▀ ▄▀ ▄▀ ▀▄\n█▄▄▄ ▀▀ ▀▄█ ▀█▀\n ▀███ ▄█▀ ▄▀▀▄ \n █▀▀ ▄▀ ▄▀▀ █\n █ █▀▀ ▄▄█▄▀ ▄▀ \n ██▀█▀ ▄▀▀▀█ \n █▄█▄▄█▀█▄█▄█▄█ "], ["eat_1", " ▄▀█▄▀▀█▄▄▄▀▀▀█\n ▄▀▀ ▀ ▄▀ ▀▄\n█▄▄ ▄▀▄ ▀▄█ ▀█▀\n ▀██▄ ▄█▀ ▄▀█ \n █▀▀ ▄▀ ▄█ ▀▄\n █ █▀▀ ▄▄▀█ ▄ ▄▀\n ██▀█▀ ▄▀▀▀█ \n █▄█▄▄█▀█▄█▄█▄█ "], ["eat_2", " ▄▄ ▄▄▄ ▄▄▄▄\n █▄▀▀ ▄▀▀▀█ ▄▀\n ▄▀ ▄ ▄▀▄ ▄▄█\n▄▀ ▀ ▀ ▄▄▀▀▄▄▀ \n▀▄▄▄▀▀▀█▀ █ ▀▄\n █ ▄▄▀▀ ▄▀ ▄▀\n ██▄▄▄▀▀█▄█▄█ \n █▄█▄▄█▀█▄█▄█▄█ "], ["happy", " ▄▀█▄▀▀█▄▄▄▀▀▀█\n ▄█▀ ▄ ▀ ▄▀ ▀▄\n▄▀ ▀ ▀ ▄▄▀█▀█ \n▀████▀ ▄█▀▄ ▄▀ \n ▀▄▄▄▄▄▀ ▄▀ ▄▀ \n ▀▄█▀ ▄▄▀▀▀▄ \n ▄█▀█▀ ▄▀▀▀▄ \n █▄█▄▄█▀█▄█▄█▄█ "], ["injured_1", " \n ▄▀█▄▀▀█▄▄▄▀▀▀█\n █▀ ▀ ▄▀ ▀▄\n █ █▄ ▀▄█ ▀█▀\n█ ▄▄▄▄█▀▄▀▀▀▄ \n ███▄▄▄▀ ▄█▄▄ █\n█ ▀▄ ▄█ ▀▄▀\n█▄▄▄▄██▀▀▄▄▄▄▄█ "], ["injured_2", " \n ▄▄ ▄▄▄ ▄▄▄▄\n █▄▀▀ ▄▀▀▀█ ▄▀\n ▄▀ ▄ ▄▀▄ ▄▄█\n▄▀ ▀▀ ▄▄▀█▀▄▀ \n▀▄▄▄█▀▀█▀▄█▄▄ ▀▄\n█ ▀█▀▀▄█ ▀▄█\n█▄▄▄▄█▄█▀▄▄▄▄▄█ "], ["sleep_1", " \n ▄▄ ▄▄▄ ▄▄▄▄\n █▄▀▀ ▄▀▀▀█ ▄▀\n ▄▀ ▄▀▄ ▄▄█\n▄▀ ▀▀ ▄▄▀█▀▀▄ \n▀▄▄▄▀▀▀█▀▄▀ ▄ █\n▄▀█▀▀█▀▄▄▀█▀▀▄█ \n█▄▄▄▄█▀▀█▄▄▄▄█▀ "], ["sleep_2", " \n ▄▀█▄▀▀█▄▄▄▀▀▀█\n █▀ ▀ ▄▀ ▀▄\n █ ▄▄ ▀▄█ ▀█▀\n█ ▄▄▄▄█▀ ▄▀▀▄ \n █▀▀ ▄▄▀ ▄▀ ▄ █\n▄▀█▀▀▄ ▄▄▀█▀▀▄█ \n█▄▄▄▄█▀▀█▄▄▄▄█▀ "], ["walk_1", " ▄▀█▄▀▀█▄▄▄▀▀▀█\n █▀ ▀ ▄▀ ▀▄\n █ ▄█▀ ▀▄█ ▀█▀\n█ ▄▄▄▄█▀ ▄▀█ \n ▀█▀ ▄▄▀ ▄█ ▀▄\n █ █▀ ▄▄▀█ ▄ ▄▀\n ██▀█▀ ▄▀▀▀█ \n █▄█▄▄█▀█▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄▄ ▄▄▄▄\n █▄▀▀ ▄▀▀▀█ ▄▀\n ▄▀ ▄▄ ▄▀▄ ▄▄█\n▄▀ ▀▀ ▄▄▀▀▄▄▀ \n▀▄▄▄▀▀▀█▀ █ ▀▄ \n ▄▀▄▄▀▀ ▄█▀ █\n ▀▄█▄▄▄▀▀▄█▄█▄▀ \n █▄█▄▄█▀█▄█▄█▄█ "]]], + ["palmon", [["angry", " \n ▄▄ ▄▀▀▄ ▄▄▄ \n █ ▀█ █▀ █ \n ▄▀▀ ▄ ▄ ▀▀▀▄ \n ▀▄▄▀█ █▀▄▄▄▀ \n ▄██▄▀▀▄█▀ █▄ \n █ █▄▄▄▄▄▄▄█▄ █ \n █▄▄█▄▄▄█▄▄▄█ "], ["attack", " ▄▄▄ ▄▄▄ \n ▄▀▀▀ ▄▀ ▄ ▀▀▄\n █▄▄▄▀▀▄ ▀▄▄█\n ▄▄▄█ ▄█▀ ▀▀▀ █ \n█ ▄█▄ ▄ █ \n▄▀▀ ▀▀▀▀ ▄█ \n█▄▄▀███▀▀ ▄▄█ \n █▄▄██▀▀█▄▄▄█ "], ["eat_1", " ▄▀▀▀▄▀▀▄▀▀▀▀▄ \n ▄▀▀ ▄ ▄ ▀▀▀▄ \n █▀▀█▄▄▀▀▀█▀ \n ▄▄█▀▀ ▀▀ █▄▄▄\n█ ▄█ █████▄ █ █\n ▀▄▄█ █████ █▀ █\n ▄█ ████▀ █▀▀ \n █▄▄█▄▄▄▄▄█▄█ "], ["eat_2", " ▄▄▄▄ \n ▄▀▀▀█ ▄▀▀▀▀▄ \n ▄▀▀ ▄ ▄ ▀▀▀▄ \n ▀▄▄▀▀▄▄▀▀▄▄▄▀ \n █▄▀▄ ▄▀▄ █ \n█▀▀█▄ ▄▀▀▀█\n ▀▀▄█▀▀▀▀▀█▄▄▀▀ \n █▄▄█▄▄▄█▄▄▄█ "], ["happy", " ▄▀▀▀▄▀▀▄▀▀▀▀▄ \n ▄▀▀ ▄ ▄ ▀▀▀▄ \n █▀▀█▄▄▀▀▀█▀ \n █▄▀▄ ▄▀▄█ \n █▀█ ▄▄▄▄▄▄ █▀█ \n ▀▄▀▄▀██▀▀█ █ █ \n ██ █▄▄▄▀ █▀ \n █▄▄█▄▄▄▄▄█▄█ "], ["injured_1", " ▄▄▄▄ \n ▄▀▀▀█ ▄▀▀▀▀▄ \n ▄▀▀ ▄ ▄ ▀▀▀▄ \n ▀▄▄▀▀▄▄▀▀▄▄▄▀ \n █▄▄ ▄▄ █ \n ▄▀▀▄ ▄▀▀▄ \n █ ▄█▀▀▀▀▀█▄▄ █ \n █▄▄█▄▄▄█▄▄▄█ "], ["injured_2", " ▄▄ \n ▄▀▀▄█ █▄▀▀▀▄ \n ▀▄▄ ▀ ▀ ▄▄▄▀ \n █ ▄█ █▄ █ \n ▀█ ▀▄▄▀ ▀▀█ \n ▄▀█▀▀ ▀▀ ▄▀▀▄ \n █ ▄█▀▀▀▀▀█▄▄ █ \n █▄▄█▄▄▄█▄▄▄█ "], ["sleep_1", " \n \n ▄▄▄ ▄▀▀▄ ▄▄▄ \n █ ▀█ █▀ █ \n ▄▀▀▀ ▄ ▄ ▀▀▀▄ \n ▀▄▄▄▀█ █▀▄▄▄▀ \n █ ▀▀ █ \n ▀▄▄▄▄▄▄▀ "], ["sleep_2", " \n ▄▄ \n ▄▀▀▀▄█ █▄▀▀▀▄ \n ▀▄▄▄ ▀ ▀ ▄▄▄▀ \n █ ▄█ █▄ █ \n ▀█▀ ▀▄▄▀ ▀█▀ \n █ █ \n ▀▄▄▄▄▄▄▀ "], ["walk_1", " ▄▄▄█▀▀▀▄▄▄▄ \n ▀▄▄ ▀ ▀ ▄▄▄▀ \n █ ▄█ █▄ █ \n ▀█ ▄▀▀ ▄▀▀█ \n █ ▀ ▀ █ \n █ ▀▄▄▄▄▄▄▀ █ \n ▀▄█ ▄█▄▀ \n █▄▄██▀▀█▄▄▄█ "], ["walk_2", " ▄▄▄▄ \n ▄▀▀▀█ ▄▀▀▀▀▄ \n ▄▀▀ ▄ ▄ ▀▀▀▄ \n ▀▄▄▀▀▄▄▀▀▄▄▄▀ \n▄▄ █ █ █ █ ▄▄\n█ ▀▀▄ ▄▀▀ █\n ▀▀▄█▀▀▀▀▀▀█▄▀▀ \n █▄▄█▀▀▀▀▄▄▄█ "]]], + ["palmon_x", [["angry", " ▄▄ ▄ ▄▄▄ \n ▄▀ ▄▀▄▀▄ ▀▄ \n▄████▀▄ ▄█▀████▄\n █ ▄ ▀█▀ ▄ █ \n ▀▄▀▀ ▀▀ ▄▀ \n ▄█▄████▄█▄ \n ▄█▄▄▀ ▀▄▄█▄ \n▀▀█▄▄█▄▄▄▄█▄▄█▀▀"], ["attack", " ▄▀▀▄▀▄▀▀▀▄ \n ▄█▄██▄ ▄███▄█▄ \n▀██ ▄ ▀█▀ ▄ ▀██▀\n █ ▀▀▄▄▄▀▀ █ \n ▄▀▄ ███ ▄▀▄ \n ▀▄ ████▀█ ▄▀ \n ▄███▄ ▄███▄ \n▀▀▀█▄▄█▀▀█▄▄█▀▀▀"], ["eat_1", " ▄▀▀▄▀▄▀▀▀▄ \n ▄█▄▄█ ▀ █▄▄▄█▄ \n▀▀█▀▀ █▄█▀ ▀▀█▀▀\n █ ▄▀▄▀ ▄▀▄ █ \n ▀▄ ▄▄ ▄▀ \n ▄▀█▄██▄█▀▄ \n ▄█▄█▄ ▄█▄█▄ \n▀▀▀█▄▄█▀▀█▄▄█▀▀▀"], ["eat_2", " ▄▄ ▄ ▄▄▄ \n ▄▀ ▄▀▄▀▄ ▀▄ \n▄████▀▄ ▄█▀████▄\n █ ▄▀█▀ ▄ █ \n ▀▄▀ ▀ ▀ ▀▄▀ \n ▄█▄▄▄▄▄▄█▄ \n ▄█▄▄▀ ▀▄▄█▄ \n▀▀█▄▄█▄▄▄▄█▄▄█▀▀"], ["happy", " ▄▀▀▄▀▄▀▀▀▄ \n ▄█▄▄█ ▀ █▄▄▄█▄ \n▀▀█▀▀ █▄█▀ ▀▀█▀▀\n █ ▄▀▄▀ ▄▀▄ █ \n █▀█▄ ██ ▄█▀█ \n ▀▄ ▀█▀▀▀▀█▀ ▄▀ \n▄████▄ ▄████▄\n █▄▄█▀▀█▄▄█ "], ["injured_1", " \n ▄▀▀▄▀▄▀▀▀▄ \n ▄█▄▄█▀▄▀█▄▄▄█▄ \n▀███▀█▄ ▄█▀████▀\n █ ▄▀█▀▄ █ \n █▄▀▀ ▀▀ ▄█ \n █▄▀▀▄▄▄▄▄▄▀▀▄█ \n███▄▄█▄▄▄▄█▄▄███"], ["injured_2", " \n ▄▄ ▄ ▄▄▄ \n ▄▀ ▄█ █▄ ▀▄ \n▄█████ ▀ ██████▄\n ▀█▀ ▀█▄█▀ ▀▀█▀ \n █ ▄█ ▀ █▄ █ \n █▄█▄ ▄▀▄█ \n███▄▄██████▄▄███"], ["sleep_1", " \n ▄▀▀▄▀▄▀▀▀▄ \n ▄█▄▄█ ▀ █▄▄▄█▄ \n▀▀█▀▀ █▄█▀ ▀▀█▀▀\n █ ▀ █ \n █▄▀▀ ▀▀▄█ \n ▄█▀▀█▀▀▀▀█▀▀█▄ \n▀▀█▄▄█▄▄▄▄█▄▄█▀▀"], ["sleep_2", " ▄▄ ▄ ▄▄▄ \n ▄▀ ▄▀▄▀▄ ▀▄ \n▄████▀▄ ▄█▀████▄\n █ ▀█▀ █ \n ▀▄ ▀▀ ▀▀ ▄▀ \n ▄█▄▄▄▄▄▄█▄ \n ▄█▀▀█ █▀▀█▄ \n▀▀█▄▄█▄▄▄▄█▄▄█▀▀"], ["walk_1", " ▄▀▀▄▀▄▀▀▀▄ \n ▄█▄▄█ ▀ █▄▄▄█▄ \n▀▀█▀▀ █▄█▀ ▀▀█▀▀\n █ █▀▄▀ ▄▀█ █ \n ▀▄▀▀ ▀▀▄▀ \n ▄▀▀█▀▀▀▀█▀▀▄ \n ▄█▄█▄ ▄█▄█▄ \n▀▀▀█▄▄█▀▀█▄▄█▀▀▀"], ["walk_2", " ▄▄ ▄ ▄▄▄ \n ▄▀ ▄▀▄▀▄ ▀▄ \n▄████▀▄ ▄█▀████▄\n █ ▄▄▀█▀ ▄▄ █ \n ▀▄▀▄█ █▄▀▄▀ \n ▄█▄▄▄▄▄▄█▄ \n ▄█▄▄▀ ▀▄▄█▄ \n▀▀█▄▄█▄▄▄▄█▄▄█▀▀"]]], + ["pandamon", [["angry", " ▄▄▄ ▄▄▄ \n ███▀▀▀▀▀▀████ \n ▀█▄ ▄▄▀█▀ \n▄▀█▀▀ ▄ ▀▀▀ █ \n█ ▀▄ ▀ ▀▀ ▄▀ \n ████▀▀▀▀████▄ \n████ ▀▀▀▀ ████ \n▄████▀▀▀▀▀████▄ "], ["attack", " ▄███▄▄▄▄▄███▄ \n ██▀ ▀███ \n ▄██▄ ▄██ █ \n█ █▀▀▄ ▄█▀▀ █ \n▀▄▄██ ▀ █▄▄█▄ \n▄███▀████▀▀███▄ \n▀▀██▄ ▄██▀▀ \n █████▀▀▀█████ "], ["eat_1", " ▄███▄▄▄▄▄███▄ \n ██▀ ▀███ \n ▄█▀▀ ▄ ▀▀▀ █ \n█ █▄▀▀ ▀█ █ \n▄████▄▄▄█▄▄█▄ \n▀███▀▄▄▄▄▀▀███▄ \n ▄█ ▄█▄▀█ \n ████▄▄▄▄█████ "], ["eat_2", " ▄███▄▄▄▄▄███▄ \n ██▀ ▀███ \n █▄▄ ▄▄▄ █ \n▄▀█ ▄▄▀▄▄ █ \n█ ▄█▄▄▄▄▄▄▄█▄ \n▄███▀▄▄▄▄▀▀███▄ \n█▀▄█ ▄█▄▀█ \n ████▄▄▄▄█████ "], ["happy", " ▄███▄▄▄▄▄███▄ \n ██▀ ▀███ \n ▄█▀▀ ▄ ▀▀▀ █▄▄ \n███ ▀███▀ ▄████\n████▄▄▄▄▄▄█████▀\n ███▀▄▄▄▄▀▀██▀ \n ▀▄█ ▄█▄ \n ████▄▄▄▄█████ "], ["injured_1", " \n ▄███▄▄▄▄▄███▄ \n ██▀ ▀███ \n ▄█▄█ ██▄ █ \n█ █▀▀▄▀▄▀▀▀ █ \n█▄▄█▄▄▄▄▄▄▄█▄▄ \n██▄ ▀█▄ ▄█▀▄███ \n ▀██▄██▄██▄██▀ "], ["injured_2", " \n \n ▄██▀▀▀▀▀▀███▄ \n███ ▄ ▄▄ ▀███ \n ████ ▄ ███ █▀ \n█ ▀▄ ▀ ▀ ▄█▄ \n███▀▀██▀██▀████ \n ▀██▄██▄██▄██▀ "], ["sleep_1", " \n▄███▄▄▄▄▄███▄ \n██▀ ▀███ \n █ █ \n▄█▀▀ ▄ ▀▀▀ █ \n█ █▄█▄█▄▄▄███ \n███████▄███▄██▄ \n▀█████████████▀ "], ["sleep_2", " ▄▄▄ ▄▄▄ \n ███▀▀▀▀▀▀████ \n ▀█ ▀█▀ \n █▄▄ ▄▄▄ █ \n ▄▀▄ ▄▀▄ ▄▀ \n█ █████▀█████ \n███▄███▀███▄██▄ \n▀█████████████▀ "], ["walk_1", " ▄███▄▄▄▄▄███▄ \n ██▀ ▀███ \n ▄██▄ ▄██ █ \n█ █▀▀▄▀▄▀▀▀ █ \n▀▄▄█▄▄▄▄▄▄▄█▄ \n▄███▀▄▄▄▄▀▀███▄ \n▀▀██▄ ▄██▀▀ \n █████▀▀▀█████ "], ["walk_2", " ▄▄▄ ▄▄▄ \n ███▀▀▀▀▀▀████ \n ▀█▄ ▄▄▀█▀ \n▄▀███ ▄ ███ █ \n█ ▀▄ ▀ ▀ ▄▀ \n ████▀▀▀▀████▄ \n████ ▀▀▀▀ ████ \n▄████▀▀▀▀▀████▄ "]]], + ["parasaurmon", [["angry", " ▄▄ \n ▄▄▀▀▀█ ▀▄▀▄\n ▄▀ ▄▀▀ █ █\n▄▀ ▄ ▀▄▄ ▄ ▄▀ █\n█ ▀▀ ▄▀▄██▀ █\n▀█▄ ▄██ █▀ █ \n ▄▀▀██ ▀▄▄█▄ █\n █▄█▄█▄█▄▀ █▄█▄▀"], ["attack", " ▄▄▀▀▀▀█ ▄▄ \n ▄▀ ▄ █▀▀ ▀▄▀▄\n█ ▀▀ █▀▄ █ █\n████▄ █▄▀█▄▀▄▀ █\n ▀███ █▀▄▀▀ █\n █▄▄▀ ▄ ▄ █ \n █▀█▀▄█▀▀▀▀▄ █\n ▀▀▀▀ █▄█▄▀"], ["eat_1", " ▄▄▀▀▀█ ▄▄ \n ▄▀ ▄▀▀ ▀▄▀▄\n▄▀ ▀▀ ▀▄▄ █ █\n█▄▄▄ ▄▀▄█▄▀▄▀ █\n▀████ ██ █▀ █\n ▀▄▄█▀ ▀ ▄ █ \n ▄▀ ▄█ █▀▀▄ █\n █▄█▄█▄█▄▀ █▄█▄▀"], ["eat_2", " ▄▄ \n ▄▄▀▀▀█ ▀▄▀▄\n ▄▀ ▄▀▀ █ █\n▄▀ ▄ ▀▄▄ ▄ ▄▀ █\n█ ▀ ▀▄▀▄██▀ █\n▀█▄ ▄██ █▀ █ \n ▄▀▀██ ▀▄▄█▄ █\n █▄█▄█▄█▄▀ █▄█▄▀"], ["happy", " ▄▄▀▀▀█ ▄▄ \n ▄▀ ▄▀▀ ▀▄▀▄\n▄▀ ▄▀▄▀▄▄ █ █\n█▄▄▄ ▄▀▄█▄▀▄▀ █\n▀████ ██ █▀ █\n █▄▄█▀ ▀ ▄ █ \n ▄▀ ▄█ █▀▀▄ █\n █▄█▄█▄█▄▀ █▄█▄▀"], ["injured_1", " \n ▄▄▄▄ ▄▄ \n ▄▀▀ ▄▄▀ ▀▄▀▄\n ▄▀ █ █ █\n█ ▄ █▀▄▄▀▄▀ █\n█▄ ▀▀ █▄▀██ █\n ▀█▄▄█▀▀ ▀ ▄ █ \n ██▄▄▄█▄▄██▄▄▄▄█"], ["injured_2", " \n \n ▄▄▀▀▀█ ▄▄ \n ▄▀ ▄▀▀ █▄ ▀▄\n▄▀ ▀▄▄ ▄ █ █\n█ █▄ ▄▀▄██ ▀ █\n▀█▄ ██ █ ▄ ▄▀\n █▄████▄▄██▄▄▄▄█"], ["sleep_1", " \n ▄▄▄▄ ▄▄ \n ▄▀▀ ▄▄▀ ▀▄▀▄\n ▄▀ █ █ █\n█ ▄▄ █▀▄▄▀▄▀ █\n█▄ █▄▀██ █\n ▀█▄▄█▀▀ ▀ ▄ █ \n ██▄▄▄█▄▄██▄▄▄▄█"], ["sleep_2", " \n ▄▄▀▀▀█ ▄▄ \n ▄▀ ▄▀▀ ▀▄▀▄\n▄▀ ▀▄▄ █ █\n█ ▀▀ ▄▀▄█▄▀▄▀ █\n▀█▄ ▄██ █▀ █\n ▄███▀ ▀ ▄ █ \n ██▄▄▄█▄▄██▄▄▄▄█"], ["walk_1", " ▄▄▀▀▀█ ▄▄ \n ▄▀ ▄▀▀ ▀▄▀▄\n▄▀ ▄▄▀▄▄ █ █\n█ ██ ▄▀▄█▄▀▄▀ █\n▀█▄ ▄██ █▀ █\n ███▀ ▄ █ \n ▄▀ ▄█ █▀▀▄ █\n █▄█▄█▄█▄▀ █▄█▄▀"], ["walk_2", " ▄▄▀▀▀▀█ ▄▄ \n ▄▀ █▀▀ ▀▄▀▄\n█ ▄█▀ █▀▄ █ █\n█▄ ▀▀ █▄▀█▄▀▄▀ █\n ▀▀▄▄██▀▄▀▀ █\n █▀█ ▄ ▄ █ \n █▀█▀▄█▀▀▀▀▄ █\n ▀▀▀▀ █▄█▄▀"]]], + ["parrotmon", [["angry", " ▄▄▄▄▄██▀▄▄ ▄▄ \n█ ▀▀▀█▀████ █ \n█▄▀▀▄▀▀ ████ █\n ▄█ ▄████ █\n █▄▄▀▄██▀█ █ █\n▄▀ █ ▄▀ ▄ █▄▀▀ \n▀▀▀▀█▄███▄▄▄▀▀▄ \n █▄▄██▄▄▄█▀▀▀ "], ["attack", " ▄▄▄ \n ▄████▄ ██▄▀▀▄ \n▄▀ ▄█▀ ▀███▄ ▀▄\n▀▄ █▄▀ ▀███▄ █\n ▀▄▀▄ ▄▄██▀▀█ █\n ▄▀█▀ ▀█▀ ▀▄ █▄▀\n█▄▄█▄ █▄▄█▄██▄ \n █▄▄█▀▀█▄▄▄█▄█ "], ["eat_1", " ▄▄▄ \n ▄████▄ ██▄▀▀▄ \n▄▀▀▀ ▄ ▀▀███▄ ▀▄\n▀▄ ▄▀ ▀ ▀███▄ █\n ▀▄▀▄ ▄▄██▀▀█ █\n ▄▀█▀ ▀█▀ ▀▄ █▄▀\n█▄▄█▄ █▄▄█▄██▄ \n █▄▄█▀▀█▄▄▄█▄█ "], ["eat_2", " ▄▄▄▄▄██▀▄▄ ▄▄ \n█ ▀████▄███ █ \n█▄▀▀█▄▀ ████ █\n ▄█ ▄████ █\n █▄▄▀▄██▀█ █ █\n▄▀ █ ▄▀ ▄ █▄▀▀ \n▀▀▀▀█▄███▄▄▄▀▀▄ \n █▄▄██▄▄▄█▀▀▀ "], ["happy", " ▄▄▄▄▄██▀▄▄ ▄▄ \n█ ▀▀▀█▀▀███ █ \n█▄▀▀▄▀ ▀ ████ █\n ▄█ ▄████ █\n █▄▄▀▄██▀█ █ █\n▄▀ █ ▄▀ ▄ █▄▀▀ \n▀▀▀▀█▄███▄▄▄▀▀▄ \n █▄▄██▄▄▄█▀▀▀ "], ["injured_1", " \n ▄▄▄ \n ▄████▄ ██▄▀▀▄ \n▄▀▀▀ ▄ ▀███▄ ▀▄\n▀▄ ▄ ▀▀ ▀███▄ █\n █▄▀▄ ▄▄██▀▀█ █\n▄▀▄█▀ █▀▀██▄▄█▄▀\n▀█▄▄█████▄▄█▄█ "], ["injured_2", " \n \n ▄▄██▀ ▄▄ ▄▄ \n ▄██▀▀▀▀▄███ █ \n█ █▄ ████ █\n ▀▄▀▄ ▄████ █\n █▄█▀▀▄▀▀██ █ █\n█▄▄▄█████▄▄███▀ "], ["refuse", " ▄▄▄ \n ▄████▄ ██▄▀▀▄ \n▄▀▀▀ ▄ ▀███▄ ▀▄\n▀▄ ▄ ▀▀ ▀███▄ █\n ▀▄▀▄ ▄▄██▀▀█ █\n ▄▀█▀ ▀█▀ ▀▄ █▄▀\n█▄▄█▄ █▄▄█▄██▄ \n █▄▄█▀▀█▄▄▄█▄█ "], ["sleep_1", " \n ▄▄██▀ ▄▄ ▄▄ \n ▄██▀▀▀▀▄███ █ \n█ ▄▄ ████ █\n ▀▄▀▄ ▄████ █\n ▄█▄▀▄██▀█ █ █\n▄▀▄█ ▄▀ ▄▄█▄▀▀ \n▀█▄▄█████▄▄█▄█ "], ["sleep_2", " \n ▄▄▄ \n ▄████▄ ██▄▀▀▄ \n▄▀▀▀ ▀███▄ ▀▄\n▀▄ ▄ ▀▀ ▀███▄ █\n █▄▀▄ ▄▄██▀▀█ █\n▄▀▄█▀ █▀▀▄█▄▄█▄▀\n▀█▄▄█████▄▄█▄█ "], ["walk_1", " ▄▄██▀ ▄▄ ▄▄ \n ▄▀▀▀██▀▄███ █ \n█ ▄▀█ ████ █\n ▀▄▀█ ▄████ █\n ▄█▄▀▄██▀█ █ █\n▄▀ █ ▄▀ ▄ █▄▀▀ \n▀▀▀▀█▄███▄▄▄▀▀▄ \n █▄▄██▄▄▄█▀▀▀ "], ["walk_2", " ▄▄▄ \n ▄████▄ ██▄▀▀▄ \n▄▀ ▄█▀ ▀███▄ ▀▄\n▀▄ █▄▀ ▀███▄ █\n ▀▄▀▄ ▄▄██▀▀█ █\n ▄▀█▀ ▀█▀ ▀▄ █▄▀\n█▄▄█▄ █▄▄█▄██▄ \n █▄▄█▀▀█▄▄▄█▄█ "]]], + ["patamon", [["angry", " ▄▄▀▀▀▄▄▀▀▀▄ \n ▄▀ ▄▄▀▀ ▄█▄ █ \n▄█▄ ▄▄▄ ▀█▀▀ \n█ ▄▄▄▄▄▄ ▀▄▀█\n▀█ ██████▄ ▀▄▀\n █ ██▀▀▀▀█ ▀▄\n █▀▀▀▀▀▀▀▀▄ ▄ █\n█▄██▀▀▀█▄▄▀▀▄▄▄▀"], ["attack", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ ▄▄▀ ▄ ▀▄ \n █ ▄▄█ ▄█▀▀▀ \n ▄▀ ▀ ▀█▄▄▄\n█ █ █ ▀▄▀\n█ ▄▀▄▄ █\n██▄▄▄▄▄▄█▄▄█▄▄▄▀"], ["eat_1", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ ▄▄▀ ▄ ▀▄ \n █ ▄▄█ ▄█▀▀▀ \n ▄▀ ▀ ▀█▄▄▄\n█ █ █ ▀▄▀\n█ ▄▀▄▄ █\n██▄▄▄▄▄▄█▄▄█▄▄▄▀"], ["eat_2", " ▄▄▀▀▀▄▄▀▀▀▄ \n ▄▀ ▄▄▀▀ ▄█▄ █ \n▄█▄ ▄▄▄ ▀█▀▀ \n█ ▄▄▄▄▄▄ ▀▄▀█\n▀█ ██████▄ ▀▄▀\n █ ██▀▀▀▀█ ▀▄\n █▀▀▀▀▀▀▀▀▄ ▄ █\n█▄██▀▀▀█▄▄▀▀▄▄▄▀"], ["happy", " ▄▄▀▀▀▄▄▀▀▀▄ \n ▄▀ ▄▄▀▀ ▄█▄ █ \n▄█▄ ▄▄▄ ▀█▀▀ \n█ ▄▄▄▄▄▄ ▀▄▀█\n▀█ ██████▄ ▀▄▀\n █ ██▀▀▀▀█ ▀▄\n █▀▀▀▀▀▀▀▀▄ ▄ █\n█▄██▀▀▀█▄▄▀▀▄▄▄▀"], ["injured_1", " \n ▄▀▀▀▄▀▀▀▀▄ \n ▄▀ ▀█ █▄▄█ \n █ ▄▀▀▀ ▀█ \n▄▀ ▀▄▀█\n█▄▄ ▄▄▄ ▀▄\n▀▄ ▄ ▄ ▄ █\n█▄██▀▀▀█▄▄▀█▄▄▄▀"], ["injured_2", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ ▄▄▀ ▄ ▀▄ \n █ ▄▄█ ▄█▀▀▀ \n ▄▀ ▀ ▀█▄▄ \n█▄▄ ▄▄ ▀▄█\n█ ▄▀▄▄ ▀▄ █\n ▀▄▄▄▄▄▄▄▄█▄▄█▄█"], ["refuse", " \n ▄▀▀▀▄▀▀▀▀▄ \n ▄▀ ▀█ █▄▄█ \n █ ▄▀▀▀ ▀█ \n▄▀ ▀▄▀█\n█▄▄ ▄▄▄ ▀▄\n▀▄ ▄ ▄ ▄ █\n█▄██▀▀▀█▄▄▀█▄▄▄▀"], ["sleep_1", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ ▄▄▀ ▄ ▀▄ \n █ ▄▄█ ▄█▀▀▀ \n ▄▀ ▀ ▀█▄▄ \n█▄▄ ▄▄ ▀▄█\n█ ▄▀▄▄ ▀▄ █\n ▀▄▄▄▄▄▄▄▄█▄▄█▄█"], ["sleep_2", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ ▄▄▀ ▄ ▀▄ \n █ ▄▄█ ▄█▀▀▀ \n ▄▀ ▀ ▀█▄▄ \n█▄▄ ▄▄ ▀▄█\n█ ▄▀▄▄ ▀▄ █\n ▀▄▄▄▄▄▄▄▄█▄▄█▄█"], ["walk_1", " \n ▄▀▀▀▄▀▀▀▀▄ \n ▄▀ ▀█ █▄▄█ \n █ ▄▀▀▀ ▀█ \n▄▀▄ ▄ ▀▄▀█\n█ ▀ ▄ ▀ ▀▄\n▀▄ ▀ ▀▀ ▄ ▄ █\n█▄██▀▀▀█▄▄▀█▄▄▄▀"], ["walk_2", " \n ▄▄▄ ▄▄▄▄ \n ▄▀ ▄▄▀ ▄ ▀▄ \n █ ▄▄█ ▄█▀▀▀ \n ▄▀ ▀ ▀█▄▄▄\n█ █ █ ▀▄▀\n█ ▄▀▄▄ █\n██▄▄▄▄▄▄█▄▄█▄▄▄▀"]]], + ["peckmon", [["angry", " ▄▄▀▀▀▀▀█▀ \n ▀ █▀▀▀█▀▀▄███▀ \n █▄█▄▀▀ █ ▄▄█▀\n █▀ █▄▄███▀ ▄█\n ▄▀▀█ ▄▄▄█▀▄▀\n ▀▄ ▄▀▄▄▄█▀▀ \n █▀▄ █▀ \n ▄█▄█▄▄█▄ "], ["attack", " ▄▄▄▄▄▄▄ \n▄▀█▄▄▄▄▄▀ ▄▄▄▄ \n ▄▀▄ ▀ █▄█▀▀▀▄▄ \n ▀▀▀█▄██▀▄▄█▀ \n █▄▄▀▀█▀▄ ▀▄ \n █ ▀▄ ▄▀ █ \n ▄█▄█▄▀███▄▀ \n▄█▄█ ▄█▄█▄ "], ["eat_1", " ▄▄▄▄▄▄▄ \n▄▀█▄▄▄▄▄█ ▄▄▄▄ \n ▄▀▄ ▄▀▄ █▀▀▀▄▄ \n ▀▀▀█▄▄ ▄█▄█▀ \n █▄▄▄▀█▀▄ ▀▄ \n █ ▀▄ ▄▀ █ \n ▄█▄█▄▀███▄▀ \n▄█▄█ ▄█▄█▄ "], ["eat_2", " ▄▄▀▀▀▀▀█▀ \n ▀ █▀▀█▀█ ▄███▀ \n █▄█▄ ▄██▀ ▄▄▀▀\n █▀▄▀██▄█▀▀▄ \n ▄▀▀█ ▀ █ █ \n ▀▄ ▄▀▄▄█▄ ▄▀ \n ▀█▀▄ █ ▀▀ \n ▄█▄█▄▄█▄ "], ["happy", " ▄▄▀▀▀▀▀█▀ \n ▀ █▀▀▀█▀▀▄███▀ \n █▄█▄▀ ▀ █▄▄▄█▀\n █▀ █▄▄▀ ▄▀ ██\n ▄▀▀ ▀▄ ▄▀▄▀\n ▀▄ ▄▄▄██▀▀ \n █▀▄ █▀ \n ▄█▄█▄▄█▄ "], ["injured_1", " \n \n ▄▄▀▀▀▀▀█▀ \n ▀ █▀█▀▀█ ▄██▀▀ \n ▄▀▄ ▀▀▄███▄▄█▀▀\n ▀▀▀█▄█▀▀█▀▄ ▀▄ \n █ ▀▄ ▄▀ █ \n █▄██████▄▀ "], ["injured_2", " \n \n ▄▄▄▄▄▄▄ \n▄▀█▄▄▄▄▄▀ ▄██▀▀ \n ▄▀ █▄ █▄█▀▄▄█▀▀\n█▄█▄ ▄████▀▄ ▀▄ \n █▀ ▀▄ ▀▄▀ █ \n █▄██████▄▀ "], ["refuse", " ▄▄▄▄▄▄▄ \n ▄▀█▄▄▄▄▄█ ▄▄▄▄ \n ▄▀▄ ▄█ █▀▀▀▄▄\n ▀▀▀█▄▄ ▄█▄█▀ \n █▄▄▄▀█▀▄ ▀▄ \n █ ▀▄ ▄▀ █ \n ▄█▄█▄▀███▄▀ \n ▄█▄█ ▄█▄█▄ "], ["sleep_1", " \n ▄▄▄▄▄▄▄ \n ▄▀█▄▄▄▄▄▀ ▄▄▄▄ \n ▄▀▄▀▀ █▄█▀▀▀▄▄\n ▀▀▀█▄██▀▄▄█▀ \n █▄▄▀▀█▀▄ ▀▄ \n █ ▀▄ ▄▀ █ \n █▄██████▄▀ "], ["sleep_2", " \n \n ▄▄▀▀▀▀▀█▀ \n ▀ █▀██▀█ ▄██▀▀ \n █▄█▄ ▄███▄▄█▀▀\n █▄█▀▀█▀▄ ▀▄ \n █ ▀▄ ▄▀ █ \n █▄██████▄▀ "], ["walk_1", " ▄▄▀▀▀▀▀█▀ \n ▀ █▀▀█▀█ ▄███▀ \n █▄█▄ ▄██▀ ▄▄▀▀\n ▄▀▀██▄█▀▀▄ \n ▄▀▀█ ▀ █ █ \n ▀▄ ▄▀▄▄█▄ ▄▀ \n ▀█▀▄ █ ▀▀ \n ▄█▄█▄▄█▄ "], ["walk_2", " ▄▄▄▄▄▄▄ \n▄▀█▄▄▄▄▄▀ ▄▄▄▄ \n ▄▀▄ ▀ █▄█▀▀▀▄▄ \n ▀▀▀█▄██▀▄▄█▀ \n █▄▄▀▀█▀▄ ▀▄ \n █ ▀▄ ▄▀ █ \n ▄█▄█▄▀███▄▀ \n▄█▄█ ▄█▄█▄ "]]], + ["pegasusmon_x", [["angry", " ▄▄\n ▄▄▄▄▀▀█▀▄▀ █\n ▄▀▀▄ ▀▄▄▀▄▀ ▀▄\n█ ▀▀ ▄▄█▀ ▄▀▀ \n ▀▀▄▀█▀ ▀▀█▀▄▀▄ \n ▀█▄ ▀▄█▄▄▀ █ \n ▄█ █▄▀█ █▄▀█ \n █▄▄█▄▄▄▀ █▄▄▄█ "], ["attack", " ▄▄▄▄▀▀█▀ ▄▄\n ▄▀▀▄ ▀▄▄▀▄ ▄▀ █\n█▄▄▀▀ ▄▄▀ ▄▀ ▀▄\n ███ █▄▀▀▀▄▄▄▀▀ \n ▀▄▄▀▀ ▄ ▄▀ ▄▀▄ \n ██▄▀ █▄▄▄▀ █ \n ▄█ █▄▀█ █▄▀█ \n █▄▄█▄▄▄▀ █▄▄▄█ "], ["eat_1", " ▄▄▄▄▄▀▀█▀ ▄▀█\n▄▀▀ ▄▄▀▄▄▀▄▄▀ ▄▀\n█▄▄▀▀ ▄▄█▄▀ ▄▀\n ███ ▄▀▄▀▀▄▄█▀ \n █▀ █▄▀ ▄ █ ▄▀▄ \n ▀█▄▄▄▀▄█▄▄▀ █ \n ▄█ █▄▀█ █▄▀█ \n █▄▄█▄▄▄▀ █▄▄▄█ "], ["eat_2", " \n ▄▄▄▄▀▀█▀ \n ▄▀▀▄ ▀▄▄▀▄▄ \n█ ▀ ▀▄▄▀█▀ ▀▄ \n ▀▀▄▀▀▄▀█▀ ▄▄▀█ \n ▄█▀ ▄▀▄▄▀ █ \n ▄█ █▄▀█▀ █▄▀█ \n █▄▄█▄▄▄▀ █▄▄▄█ "], ["happy", " ▄▄▄▄ \n ▄▄▀▀█▀ ▄▀ ▄▀█\n▄▀ ▄▀▄ ▀█ █▄▀ ▄▀\n▀▄▄▄ ██▄▄▀ ▄▄▀\n ▄▀▀▄▀ █▀█▀▄ \n ▄▀█▄▄ █▄█▄▄▀ █ \n▄▀ ▄▀ █▀ █▄▀█ \n▀▀▀▀▀▀ █▄▄▄█ "], ["injured_1", " \n ▄▄▄▄ \n ▄▄▀▀█▀ ▄▀ \n▄▀ █▄ ▀█▄▄▄ \n▀▄▄ ▄▄▀█▄█ ▀▄ \n ▀▄ ▄▀▄▀ ▄▄▀█ \n ▄▄█▀▀▄▀▄▄█▄ █ \n █▄█▄▄▄███▄▄▄██ "], ["injured_2", " \n \n ▄▄▄▄▀▀█▀ \n ▄▀▀▄ ▀▄▄▀▄▄ \n█ ▀▀▄▄▀█▀ ▀▄ \n ▀▀▄▀▀▄▀█▀ ▄▄▀█ \n ▄▄█▀▀▄▀▄▄█▄ █ \n █▄█▄▄▄███▄▄▄██ "], ["sleep_1", " \n ▄▄▄▄ \n ▄▄▀▀█▀ ▄▀ ▄▀█\n▄▀ ▄▄ ▀█ ▀▄▀ ▄▀\n▀▄▄ ▄▄▀█▄▄▀ ▄▄▄▀\n █▄▄▀▄▄█▀▀▄▀▄ \n▄▀▀▄▀▀▀ █▄▄█▀▀█ \n█▄▄█▄▄▄▄█▄█▄▄▄█ "], ["sleep_2", " \n ▄▄▄▄▀▀█▀ ▄▄\n ▄▀▀ ▀▄▄▀▄ ▄▀ █\n█ ▀▀ ▄▄▀ ▄▀ ▀▄\n ▀▀▄▀▀▄▀▀▀▄▄▄▀▀ \n █▀▀ ▄▀█▀ ▄▀▄ \n▄▀▀▄▀▀▀ █▄▄█▀▀█ \n█▄▄█▄▄▄▄█▄█▄▄▄█ "], ["walk_1", " ▄▄▄▄▀▀█▀ ▄▄\n ▄▀▀▄▄▀▄▄▀▄ ▄▀ █\n█ ▀▀ ▄▄▀ ▄▀ ▀▄\n ▀▀▄▀▀▄▀▀▀▄▄▄▀▀ \n █▀▀ ▄ ▄▀ ▄▀▄ \n ██▄▀ █▄▄▄▀ █ \n ▄█ █▄▀█ █▄▀█ \n █▄▄█▄▄▄▀ █▄▄▄█ "], ["walk_2", " ▄▄▄▄▀▀█▀ ▄▄\n ▄▀▀▄▄▀▄▄▀▄ ▄▀ █\n█ ▀▀ ▄▄▀ ▄▀ ▀▄\n ▀▀▄▀▀▄▀▀▀▄▄▄▀▀ \n █▀▀ ▄ ▄▀ ▄▀▄ \n ▄▀▀▀▄▀ █▄▄▄▀ █ \n █ ▀██▄▀█ █▄▀█ \n ▀▀▀█▄▄▄▀ █▄▄▄█ "]]], + ["petermon", [["angry", " ▄█▀▀▀▀▀▄▀▀█ \n▄███▄▄▄▄▄█▄▄██▀ \n ▀█▀▀█▀ ▄ █▀█ \n █ ▄▀ ▀▀ █▄██▄ \n █ ▀██████▀ ▄▀█ \n ▀▄▄█▄▄█▀▄▀ \n ▄█▀ ▀▀█▄ \n █▄▄█▀▄▄▄█ "], ["attack", " ▄▄▄▄▄▄ ▄▄▄ \n ▄▄█▀ ▄▀ ▄█▄ \n▀████████████▀ \n █ █ ▄ █ █▄ \n ▀▄█▄▄▄▄▄█▀ ██ \n ▄▀█▀▀█▀▄▀▄ ▀ \n █▄█▀▀▀▀▄█ █ \n █▄▄███▄▄▄██ "], ["eat_1", " ▄▄▄▄▄▄ ▄▄▄ \n ▄▄█▀ ▄▀ ▄█▄ \n▀██████▀▀▀███▀ \n █ █ ▄▀▄█ █▄ \n ▀▄█▄▄▄▄▄█▀ ██ \n ▄▀█▀▀█▀▄▀▄ ▀ \n █▄█▀▀▀▀▄█ █ \n █▄▄███▄▄▄██ "], ["eat_2", " ▄█▀▀▀▀▀▄▀▀█ \n▄███▄▄▄▄▄█▄▄██▀ \n ▀█▀▀█▀▀▀▀█▀█ \n █ █ ▄▄▀ █▄▀█▄ \n ▀█▄██▄█▀▄ ▀█ \n ▄▀▄█▄▄█ █ █ \n ▀▄█▀ ▀▀█▄▀ \n █▄▄█▀▄▄▄█ "], ["happy", " ▄█▀▀▀▀▀▄▀▀█ \n▄███▄▄▄▄▄█▄▄██▀ \n ▀█▀▀█▀ ▄ █▀█ \n █ ▄▀ ▀ ▀█▄▀█▄ \n ████████ ▀█ \n ▄▀ ▄█▄▄█▄ ▀▄ \n ▀▄██▀ ▀▀█▄█ \n █▄▄█▀▄▄▄█ "], ["injured_1", " \n ▄▄▄▄▄▄ ▄▄▄ \n ▄▄█▀ ▄▀ ▄█▄ \n▀█████▀▀▀████▀ \n █ █ █▄ █ █▄ \n ▀▄█▄▄▄▄▄█▀ ██ \n ▄▀▀█████▀▀▀▄ ▀ \n █▄▄█▄▄▄█▄▄▄█ "], ["injured_2", " \n \n ▄█▀▀▀▀▀▄▀▀█ \n▄███▄▄▄▄▄█▄▄██▀ \n ▀█▀▀█ ▄ ▀█▀█ \n █ ▄▀ ▀▀ █▄▀█▄ \n ▄▀▀█████▀▀▀▄▀█ \n █▄▄█▄▄▄█▄▄▄█ "], ["refuse", " ▄▄▄▄▄▄ ▄▄▄ \n ▄▄█▀ ▄▀ ▄█▄ \n▀██████▀▀▀███▀ \n █ █ ▄█ █ █▄ \n ▀▄█▄▄▄▄▄█▀ ██ \n ▄▀█▀▀█▀▄▀▄ ▀ \n █▄█▀▀▀▀▄█ █ \n █▄▄███▄▄▄██ "], ["sleep_1", " \n ▄█▀▀▀▀▀▄▀▀█ \n▄███▄▄▄▄▄█▄▄██▀ \n ▀█▀▀█▀▀▀▀█▀█ \n █ ▄▀ ▀▀ █▄▀█▄ \n ▀██████▀▄ ▀█ \n ▄▀▀▄█▄▄█▀▀▀▄ \n █▄▄█▄▄▄█▄▄▄█ "], ["sleep_2", " \n ▄▄▄▄▄▄ ▄▄▄ \n ▄▄█▀ ▄▀ ▄█▄ \n▀████████████▀ \n █ █ ▄▄ █ █▄ \n ▀▄█▄▄▄▄▄█▀ ██ \n ▄▀▀█████▀▀▀▄ ▀ \n █▄▄█▄▄▄█▄▄▄█ "], ["walk_1", " ▄█▀▀▀▀▀▄▀▀█ \n▄███▄▄▄▄▄█▄▄██▀ \n ▀█▀▀█▀▀▀▀█▀█ \n █ ▄▀ ▀ █▄▀█▄ \n ▀██████▀▄ ▀█ \n ▄▀▄█▄▄█ █ █ \n ▀▄█▀ ▀▀█▄▀ \n █▄▄█▀▄▄▄█ "], ["walk_2", " ▄▄▄▄▄▄ ▄▄▄ \n ▄▄█▀ ▄▀ ▄█▄ \n▀████████████▀ \n █ █ ▄ █ █▄ \n ▀▄█▄▄▄▄▄█▀ ██ \n ▄▀█▀▀█▀▄▀▄ ▀ \n █▄█▀▀▀▀▄█ █ \n █▄▄███▄▄▄██ "]]], + ["petitmon", [["angry", " \n \n \n ▄█ ▄▀█ \n ▄▀ ▀▀▀ █▀▀▄ \n ██▄ ▄█ █▄▀▀ \n ▀▄▄▄▄▄▄▀ \n ▄▄▄▄▄▄ "], ["attack", " ▄█ \n ▄▄▄▀ █ \n █ ▄█ █▄▀▀█ \n █▄█▄ █ ▄█ \n ███ █▀ \n ▄█▀█ █ \n ▀▄▄▄▄▀ \n ▄▄▄▄▄ "], ["eat_1", " \n ▄▄ ▄▄▄ \n ▄▀ ▀▀ ▄▀ \n ▀██▄▀ █▀▀▀█ \n ▄███ █▄█▀ \n ▀▄▄▄▄▀ \n \n ▄▄▄▄▄▄ "], ["eat_2", " \n \n ▄ ▄ \n ▄▀█▄▀█▄▄ \n █▄ ▄ █ ▄█ \n █▄▄▄ █▀ \n ▀▀▀▀▀ \n ▄▄▄▄▄▄▄ "], ["happy", " ▄ ▄ \n ▄▄ ▄▀█▄▄█▀▄ ▄▄ \n █ ▀█ ▄ ▄ █▀ █ \n █▄█▀ ▀▀ ▀█▄█ \n █ ████ █ \n ▀████▀ \n \n ▄▄▄▄ "], ["injured_1", " \n \n \n \n \n ▀█▄▄▄▄▄█▀ \n ▄▀█▀▄▄ ▄▄▀█▀▄ \n █▄▄█▄▄▄▄▄▄▄█▄▄█"], ["injured_2", " \n \n \n \n \n ▄▄ ▄▄ \n ▄▄▄█▀▀▀▀▀█▄▄▄ \n █▄▄█▄██▄██▄█▄▄█"], ["sleep_1", " \n \n \n \n \n █▄ ▄█ \n ▄▀▀█ ▀▀▀ █▀▀▄ \n █▄▄▀▄██▄██▄▀▄▄█"], ["sleep_2", " \n \n \n \n ▄ ▄ \n ▄▄▀█▄█▀▄▄ \n ▄▀ █▄▄ ▄▄█ ▀▄ \n █▄▀▀▄▄▄▄▄▀▀▄█ "], ["walk_1", " \n \n ▄█ ▄█ ▄▄ \n ▄▀ ▀▀ █▀ █ \n █▀ ▀ █▄█ \n ▀▄█▄▄▄▀ \n \n ▄▄▄▄▄▄ "], ["walk_2", " \n \n ▄█ ▄█ \n ▄▀ ▀▀ █▀▄ \n █▀ ▀ █▄ █ \n ▀▀▀▀▀ ▀▀ \n \n ▄▄▄▄ "]]], + ["phantomon", [["angry", " ▄▄▄ \n ▄▀▀▀▀▀▄▀██▄ \n ▄▀▄▄▄▄ ▀▄██▀\n ▀███▀ █ ▄█▀ \n▄▀▀█▀▀▀▀▀▄█▀ █ \n▀█ ▀ ▄█▀ █ █ \n █ █ ▄█▀ ▀▀ █▀ \n ▀▄█▀▄▄▀▄▀▄█ "], ["attack", " ▄█████ \n ▄▀▀▀▀▀▀▄ █ \n█▄▄▄▄ ▀▄ █ \n ██▀ █▄ █ █ \n ▀███ ▀█▀▄ \n ▄▄▄██▀ ▄█▄▀ \n█ ▄ █ ▄█ █ \n ▀▀▄▀▄▀▄█▀ ▀ █ "], ["eat_1", " ▄▄▄▄ \n ▄▀▀▀▀▀▀███▄ \n ▄▀▄▄▄▄ ▀██▀ \n ▀█▀██▀█▄ ▄█▀▄ \n ▄▀▀▀▀▀▀██▀▄ █ \n █ ▀█▀▄█▀▄▄▀ █ \n ▀▄ █▄▀ █ █ \n ▄█▀▄▄▀▄▄█▀▄█ "], ["eat_2", " ▄█████ \n ▄▀▀▀▀▀▄ █ \n ▄▀▄▄▄ ▀▄ █ \n ▀█▀██▀█▄ ▀▄ █ \n ▄▀████▀▀ ▀█▀▄\n█ █ ▄ ▄█▄▀\n ▀█ █ ▄█ █ \n ▀▄▀▄▀▄█▀ ▀ █ "], ["happy", " ▄▄▄▄▄▄ █▄\n ▄▀ ▀▄ ██\n █▄▀███▀█▄ █ ██\n█▀▄█▄█▄█▄█ █▀▀▀\n█ █ ▄▄▄██ █ █ \n█ ▀█▄▄▄▀ ▀ █ \n▀▄█ ▄ ▄▀ \n ▀▄█▀▄▀▄▄█▀ "], ["injured_1", " █████▄ \n █ ▄▄▄▄▄ \n █▄▀ ▀▄ \n █▄██▀█▀█▄ █ \n █ ▄█▄███▄█ ▀▄ \n █ █ █ \n █ █ █ █ \n ▀▄▀▄▄▄█▄▄▄▀▄▄█▄"], ["injured_2", " ▄██▄ \n ▄█▀▀███▄\n ▄▄██▄ ▀██\n ▄▀ ▀▄ ▀\n █ ▄▀█▀█▄ █ \n ▄▀▀▄▄█▄▄█▀ █ \n▄█▀▄▀ █ █ \n█▄▄█▄▄▄█▄▄█▄▄▄█▄"], ["sleep_1", " █████▄ \n █ \n █ ▄▄▄▄▄ \n █▄▀ ▀▄ \n █▄ █ \n █ ▄█████▄▄ █ \n █ █ ▄▄▀ █ \n█▄▄█▄▄█▄▄▄█▄▄▄█▄"], ["sleep_2", " █████▄ \n █ \n █ ▄▀▀▀▀▀▄ \n █▀ ▀▄ \n █▄▀▀█▀▀▄ █ \n █ ▄█▀▀▀▀█▀ █ \n █ █ █ █ \n█▄▄█▄▄▄█▄▄█▄▄▄█▄"], ["walk_1", " █████▄ \n █ ▄▀▀▀▀▀▄ \n █ ▄▀▄▄▄ ▀▄ \n █▄▄▀█▀██▀█▄ ▀▄\n█ █ ▀▀▀▀▀▀▀ ▄ █\n █▀▄ ▄ █▀▀ █\n █ █ █▄ ▀▄ █\n █ ▀█ █▄▀▄▀▄█▀▄█"], ["walk_2", " ▄▄▄▄ \n ▄▀▀▀▀▀▀███▄ \n ▄▀▄▄▄▄ ▀██▀ \n ▀█▀██▀█▄ ▄█▀▄ \n ▄▀▀▀▀▀▀██▀▄ █ \n █ ▀█▀▄█▀▄▄▀ █ \n ▀▄ █▄▀ █ █ \n ▄█▀▄▄▀▄▄█▀▄█ "]]], + ["phascomon", [["angry", " \n ▄▄ ▄▄ \n▄▀▀█▄▀▀▀▀▄█▄▀▀▄ \n███ ▄▄ ▀██ █\n█▀█ ████ ▄█▀██ █\n ▀▀▄▀██▀ ▄█▄▀ \n █▀▀▀▀█▀▀▄ \n █▄▀▄█▄▄█▄█ "], ["attack", " \n ▄▄█▀▄▄▄▄▀█ ▄▄ \n█▄▄▀▀▄▄ ▀▀█▄▄▀▄\n███ ████ ▄█ ██ █\n▀▄█ ▄██▄▄ █▀▄▀\n ▀███▀▀█▄▀█▀ \n ▄████▀ ▄ █ \n █▄█▄▄█▄▀█▄▀ "], ["eat_1", " \n ▄▄█▀▄▄▄▄▀█ ▄▄ \n█▄▄▀▀▄▄ ▀▀█▄▄▀▄\n██▀ ████ ▄▀▄██ █\n▀█ ▄▄██▄▄ █▀▄▀\n ▀▄████▀▀█ ▄▀▀ \n █ ▄█▀▀█▀▀▄ \n ▀▀▄▄█▄▄█▄█ "], ["eat_2", " \n ▄▄ ▄▄ \n▄▀▀█▄▀▀▀▀▄█▄▀▀▄ \n███ ▄▄ ▀██ █\n█▀█ ████ ▄▀▄██ █\n ▀▀▄▀██▀ ▄█▄▀ \n █▀▀▀▀█▀▀▄ \n █▄▀▄█▄▄█▄█ "], ["happy", " ▄▄ ▄▄ \n▄▀▀█▄▀▀▀▀▄█▄▀▀▄ \n███ ▄██▄ ▄▀██ █\n█▀█ ▀██▀ ▀ ▀██ █\n ▀█ █▀████ ▄█▄▀ \n █▀▀▄▄██▄▀▀▀▄ \n ▀▀▄ █▀ \n █▄▀▀▀▀▄█ "], ["injured_1", " \n ▄▄ ▄▄ \n▄▀▀█▄▀▀▀▀▄█▄▀▀▄ \n███ ▄▄ ▀██ █\n█▀█ ████ ▄▄▄██ █\n ▀▀▄▀██▀ ▄█▄▀ \n █▀▀▀█▀▀▄ \n █▄█▄█▄▄█▄█ "], ["injured_2", " \n \n ▄▄█▀▄▄▄▄▀█ ▄▄ \n█▄▄▀▀ ▀▀█▄▄▀▄\n███ ▄██▄ ██ █\n▀▄█ ████ ▀▀▀█▀▄▀\n ▀▄██▄▄▄▄█▀▀ \n █▄█▄█▄▄█▄█ "], ["sleep_1", " \n \n ▄▄▄▄▀█▄▄ \n ▄▄▀ ▀█▄▄▀▄ \n████ ██ █ \n████ ▀▀▀ █▀▄▀ \n ▀▀▄▄▄▄▄▄▀▀▀█ \n █▄█▄▄▄▄▄█▄▄█ "], ["sleep_2", " \n ▄▄ \n ▄▀▀▀▀▄█▀▀▄ \n ▄██▄ ▀██ █ \n ████ ▄▄▄ ██ █ \n ▀██▀ ▄█▄▀ \n ▄███▀▀▀ ▀▄ \n █▄█▄▄▄▀▄▄█▄█ "], ["walk_1", " \n ▄▄█▀▄▄▄▄▀█ ▄▄ \n█▄▄▀▀ ▀▀█▄▄▀▄\n███ ▄██▄ ▄▄▄██ █\n▀▄█ ████ ▀▀ █▀▄▀\n ▀▄██▄▄▄▄█▀▀ \n ▄▀▄ ▄ ▀▄ \n █▄▀▄█▄▄█▄█ "], ["walk_2", " \n ▄▄ ▄▄ \n▄▀▀█▄▀▀▀▀▄█▄▀▀▄ \n███ ▄▄ ▀██ █\n█▀█ ████ ██▀██ █\n ▀▀▄▀██▀ ▄█▄▀ \n █▀▀▀▀▀▀▀▄ \n █▄██▄█▄▄▀ "]]], + ["phoenixmon", [["angry", " █▀█▄▀█▄▀█ \n▄▄ ▀▄ ▀ ▀ ▄▀▄▀▀█\n█ ▀█ ▄▀ █▀ █\n█ █ ▄▄ █ █\n█ █▄▀▄▄ ▄ █ █\n▀▄▀▄ █ █ █▄▀\n █▀▀▀▀▄▄▄▀ ▀▀▄ \n █▄▀▀▄█ █▄▀▀▄█ "], ["attack", " ▀█▀▀▀▄▄▄▀▀█ \n █▄ ▄▄▀▄█▄ \n ███ ▄▄▀ ▄▄\n█▀▄█▀▀▀ ▄ ▀█▀ █\n█ ▀█▀ ▀▀ █\n█ █ █ ▄█ █ █\n█ █▀▀▀▄▄▄▀ ▀▀█ █\n▀▀█▄▀▀▄▀▀▄▀▀▄█▀▀"], ["eat_1", " ▀█▀▀▀▀▄▄▄▀▀█ \n ▀█▄ ▄ ▀▄█▀ \n ██▄ █ ▄▄█ ▄▄\n█▀▄▄███ ▄ ▀▄▀ █\n█ ▀▄▄ ▀▀▀ █\n█ ▄ █ ▄█ █ █\n█ █▄▀▀ ▀█▀ ▀▀█ █\n▀▀ █▄▀▀▄█▄▀▀▄█▀▀"], ["eat_2", " █▀█▄▀█▄▀█ \n ▀▄ ▀ ▀ ▄▀ \n▄▄ █ ▄▀▀▄ █ ▄▄\n█ █ ▄▄ ▀▄▄▀ █\n█ █▄▀▄▄▄ ▀ █\n█ ▀ █ █ █ █\n█ █▄█▀▀▄▀ ▀▀▄█ █\n▀▀ █▄▀█▄▀▀▄█ ▀▀"], ["happy", " ▀█▀▀▀▀▄▄▄▀▀█ \n ▀█▄ ▄ ▀▄█▀ \n█▀▄ ██ █ ▄▄█▀█\n█ ▀▄█▀ ▀ ▄ ▀▄ █\n█ ▀▄▄ ▀▄▀▀▀ █\n█ █ █ █ █ █\n▀▄█▀▀▀▄▄▄▄▀▀▀█▄▀\n █▄▀▀▄▀▀▄▀▀▄█ "], ["injured_1", " █▀█▄▀█▄▀█ \n ▀▄ ▀ ▀ ▄▀ \n █ ▀▄▄ █ \n █ ▄▄ ▀▄▀▀▄ \n▄▀█▄▀▄▄▄ █\n█ ▀ █ █ █ █\n█ █▄▀▀▀▄▄▄▀▀▀█ █\n▀▀ █▄▀▀▄█▄▀█▄▀▀▀"], ["injured_2", " ▄▄▄▄▀▀█▄▄ \n ▀▄ ▀ ▀ ▄▀ \n █ █▄ █▄▄ \n █ ▄▄ ▀ ▀▄ \n █▄▀▄▄▄ █ \n ▄▀▄ █ █ ▄ █\n █▄▀▀▀▄ ▄ ▀▀█ █\n ▀▄█▀▄▀█▄▀█▄█▀▀"], ["sleep_1", " ▄▄▄ ▄▄ ▄▄ \n █ ▀█ █▀ █▄▄ \n ▄▀ ▄ █▀ ▀▄ \n ▄▀ ▀▀ ▀ █ \n █ ▄▀▀ █ \n █▀▄▀█▀ █ ▄▀ \n ▄▀▀ ▀▄▄▀ ▀▀▄ \n █▄▀▀▄▀▀▄▀▀▄█ "], ["sleep_2", " █▀█▄▀█▄▀█ \n ▀▄ ▀ ▀ ▄▀▄▄ \n █ ▄▄▀ █▀ █ \n █ ▄▄ ▀ █ \n █▄▀▄▄ █ \n ▀▄ █ █ ▄▀ \n ▄▀▀▀▄▄ ▀▀▄ \n █▄▀▀▄█▄▀▀▄█ "], ["walk_1", " █▀█▄▀█▄▀█ █▀▄▄ \n ▀▄ ▀ ▀ ▄▀ █ █ █\n █ ▄▀█▀ █▄▀ ▄▀ █\n█ ▄▄ ▀ ▄▀█\n█▄▀▄▄▄ ▄ ▄▀ \n▀ ▀▄▄▀▄ ▄▀▀▄ \n ▀█▀▄ █ \n ▀▄█▄▄█ "], ["walk_2", " ▄▄▄ ▄▄ ▄▄ ▀\n █ ▀█ █▀ █ ▀ \n ▄▀ ▄▄▄ █ ▀ ▄\n▄▀ ▀ ▀ █▀▀▀▀▄ \n█ ▄▀▀ ▄▄ ▀▄\n█▀▄▀██ █ █ █\n ▀▄█ █▄▄▄▀█ █ █\n ▀▀ ▀▄█▄█▄▀▀ "]]], + ["phoenixmon_x", [["angry", " ▄▄▄▄▄▄▄ \n ▄▀▀ ▄ █▄ ▀▀▄ \n█ ▀▀ ▄▀ ██▀ \n█ ▄▀▀▀ ▀▄▀ ▀▄ \n ▀▀▀▀▀▄▄▀ █ ▄ █ \n █▀ ▄▀ ▄██▄ \n ▀▀█ ▄▀▀▄ ▀█\n ▀ ▀▀ "], ["attack", " ▄▄▄▄▄▄▄▄█▀▄▄ \n▄▀▀ ▄ █▄▀█ █ █\n█ ▄▄▀▀ ▄▀ █ ▄▀ █\n▀▀████ ▀▄▀ ▄▀█\n ███▀▄ ▄▄▀ \n ▀▄▄▀▀▄ ▄▀██▄▄ \n ▀▄ ▀▄ ▀█\n ▀▀ "], ["eat_1", " ▄▄▀▀▀▀▀█▀▀▄ \n █ ▄ ▄▀▄ █▄▄▀ \n ▀███▄ █▄▀▄▄\n█▀▄█▀▀▀▄▀ █▀ ▀▀█\n█ ▀▀▀ ▀ ▄ █ █\n█ █ █ ▄█ █ █\n█ █▄▀▀ ▀█▀ ▀▀█ █\n▀▀ █▄▀▀▄█▄▀▀▄█▀▀"], ["eat_2", " ▄▄▀▀▀▀█▀▀▄▄ \n ▄▀ ▄▀▄ █▀▄▄▄▀\n █ ▄▄▄ █ ▄▀▀ \n█▀▀▄█▄▄▄▄ █▄▀▀▀█\n█ ▄ ▄ █ █\n█ █ █ ▄█ █ █\n█ █▄▀▀ ▀█▀ ▀▀█ █\n▀▀ █▄▀▀▄█▄▀▀▄█▀▀"], ["happy", " ▄▄▀▀▀▀█▀▀▄▄ \n▄▀ ▄▀▄ █▀██ █▀▄\n█ ▄▄▄▄ ▄▀▀▄▀ █ █\n ▀████ ▀▄▀ ▀ ▄█\n █▀▀ ▄▀ ▀▄▀\n ▀▀▀█ ▄▄█▀ \n ▀▄▀ █▀▀█▄\n ▀▄▄▀ ▀"], ["injured_1", " \n ▄▄▄▄▄▄▄ \n ▄▀▀▄ █▄ ▀▀▄ \n █ ▀▀ ▄▀ ██▀▄ \n▄█ ▄▀▀▀ ▀ ▄ █\n█ ▀▀▀█▀ █ ▄ █\n█ █▄▀▀▀▄▄▄▀▀▀█ █\n▀▀ █▄▀▀▄█▄▀█▄▀▀▀"], ["injured_2", " \n \n ▄▄▀▀▀▀█▀▀▄▄ \n ▄▀ █▄ █▀▄▄▄▀ \n █ ▄▄▄ █ ▀▄ \n ▀▄█▄▄▄█▀▄ ▀▄▀▄ \n █ █ ▀█ █ ▀▄█ \n ▀▀ █▄▀▄▀█▄▀▄██ "], ["sleep_1", " ▄▄▄▄▄▄▄ \n ▄▀▀ █▄ ▀▀▄ \n█ ▀▀▀▄▀ █▀▀▄ \n█ ▄▀▀▀ ▀▄▀ █ \n ▀▀█▀█▄ ▀ ▄ █ \n █ █ █ ▄▀ \n ▄▀▀▀▄▄▀ ▀▀▄ \n █▄▀▀▄█▄▀▀▄█ "], ["sleep_2", " ▄▄▀▀▀▀█▀▀▄▄ \n▄▀ ▄▄▄ █▀▄▄▄▀ \n█ ▄▄▄ █ ▄▀▀ ▀▄ \n▀▄█▄▄▄ █ █ \n █ ▄█▀ █ █ \n █ █ █ ▄▀ \n ▄▀▀▀▄▄▀ ▀▀▄ \n █▄▀▀▄█▄▀▀▄█ "], ["walk_1", " ▄▀▀█ ▄▄ \n ▄▄▀▀▀▀█▀██ █▀▄\n▄▀ ▄▀█▀ █▀▄▀ █ █\n█ ▄▄▄ █ ▄▀ ▀ ▄█\n▀▄█▄▄▄ ▀ ▀▄▀\n █ ▄▄█▀ \n ▀▄▀ █▀▀█▄\n ▀▄▄▀ ▀"], ["walk_2", " ▄▄▄▄▄▄▄ \n ▄▀▀▄▄▄ █▄ ▀▀▄ \n█ ▀ ▀ ▄▀ ██▀ \n█ ▄▀▀▀ ▀▄▀ ▀▄ \n ▀▀▀▀▀▄▄▀ █ ▄ █ \n █▀ ▄▀ ▄██▄ \n ▀▀█ ▄▀▀▄ ▀█\n ▀ ▀▀ "]]], + ["pichimon", [["angry", " \n \n ▄▄▄▄▀ \n ██▄▄██ \n ▄▄███ \n ▄▀▄▀ \n ▀ \n ▄▄▄▄ "], ["attack", " \n \n ▄▄█▄▀ \n ▀▀▀▄█▄ \n ██ \n ▀▀▀█▀█ \n ▀▄▀ \n ▄▄▄▄▄ "], ["eat_1", " \n \n ▄▄▄▄▄▀ \n ▀▄█▀█▄▀ \n ▀███ \n ▀▀█▀█ \n ▀▄▀ \n ▄▄▄▄ "], ["eat_2", " \n \n ▄ ▄ \n ▄▀█▀█▄ \n █▀▀▀███ \n ▀▀█▀█ \n ▀▄▀ \n ▄▄▄▄ "], ["happy", " ▀ \n ▀ ▀ \n ▄ ▄ \n ▄▀██▀▄ \n ██ ██ \n ▀█▀█ \n ▀▄▀ \n ▄▄▄▄ "], ["injured_1", " ▀ \n \n ▀ \n \n ▀▄▄▄▄▄▀ \n █▀▀█▀▀█ \n ▀▀███▀▀ \n ▀▄▀ "], ["injured_2", " \n \n \n \n \n ▄ ▄ \n ▄████▄ ▄ \n ▄█▄▄██▄▄█▄▀ "], ["sleep_1", " \n \n \n \n \n ▀▄▄▄▄▀ ▄ \n ▄▀▀█▀▀█▀▄▀ \n ███▄███▀ "], ["sleep_2", " ▄ \n \n ▀ \n ▄ \n \n ▄ ▄ \n ▄████▄▄▀▄ \n ▄█▄▄█▄▄█▄▀ "], ["walk_1", " \n \n ▄ ▄ \n ▄████▄ \n █▄█▄██ \n █▀█ \n ▀▄▀ \n ▄▄▄▄ "], ["walk_2", " ▀ \n ▀ \n ▄ \n ▄ ▄ \n ▄▀██▀▄ \n ██▀▀██ \n █▀█ \n ▀▄▀ "]]], + ["pickmon", [["angry", " \n \n ▄▀▀▄ \n █▄█▄▀ ▄▄██▀▄█ \n █ █ ▀▄▀ █▀█▀ █ \n ▀▄▀▀▀▄▀▀ █ ▄▀ \n █▄▀▀ ▀▀▄ ▀█ \n █▄███▀▀▀▀███▄█ "], ["attack", " \n \n▄ ▄▄ \n█▀▄▀ ▀▄█ ▄ \n███▄ ▄███▄▄▀█ \n█▀██▀██▀ █ █ \n█ ▄▄▄ ▀▄█ \n▀▄▄█▄▄▄█▄▄▄▀ "], ["eat_1", " \n ▄▀▀▄ \n █▄█▄▀ ▄▄██▀▄█ \n █ ███▄███▀█▀ █ \n ▀▄▀ ▀▄▀▀ █ ▄▀ \n █ ▄███▄ ▀█ \n ▀▄█████▄▄▄▄▀ \n █▄▄▄▀ ▀▄▄▄█ "], ["eat_2", " \n ▄▄ \n ▄ ▄ ▄▀ ▀▄▄▄ ▄ \n █▀█▀▄ ▄▀███▄▀█ \n █▀▄█▄▀▄█▄▀█ █ \n █ ▄▄▀▄▄ ▀▄█ \n ▀▄█▄▄▄█▄▄▄▄▀ \n █▄▄▄▀ ▀▄▄▄█ "], ["happy", " \n ▄▀▀▄ \n █▄█▄▀ ▄▄██▀▄█ \n █▄▀▄▀▄▀▄▀██▀ █ \n ▀▄▀▀▀▄▀▀▀ █ ▄▀ \n █ █████ ▀█ \n ▀▄▄███▄▄▄▄▄▀ \n █▄▄▄▀ ▀▄▄▄█ "], ["injured_1", " \n \n ▄▄ \n ▄ ▄▀ ▀▄ ▄ \n █▀██▄ ▄▄███▄▀█ \n █ █▀ █ ▀█ █ █ \n █ ▀▀▄▀▀ ▀▄█ \n ▀▄▄█▄█▄▄▄▄▄▀ "], ["injured_2", " \n \n \n ▄▀▀▄ \n▄▄▄▄▄▀ ▄█▄▄▄▄▄\n █ ██▀▄▀██▀█ █ \n ▀▄▀▄▄▀▄▄▀ █ █ \n █▄▄▄▄█▄▄▄▄▄█▄█ "], ["sleep_1", " \n \n ▄▄ \n ▄ ▄▀ ▀▄ ▄ \n █▀██ ▄███▄▀█ \n █ ███▄███ █ █ \n █ ▀▀▄▀▀ ▀▄█ \n ▀▄▄█▄█▄▄▄▄▄▀ "], ["sleep_2", " \n \n ▄▄ \n ▄ ▄ ▄▀ ▀▄▄▄ ▄ \n █▀██▄ ▄████▄▀█ \n █ ███▀██▀ █ █ \n █ ▄▀▄ ▀▄█ \n ▀▄█▄▄▄█▄▄▄▄▀ "], ["walk_1", " \n ▄▄ \n ▄ ▄ ▄▀ ▀▄▄▄ ▄ \n █▀██▄ ▄██▄█▄▀█ \n █ █▀█▀██▀ █ █ \n █ ▄▀▄ ▀▄█ \n ▀▄█▄▄▄█▄▄▄▄▀ \n █▄▄▄▀ ▀▄▄▄█ "], ["walk_2", " \n \n ▄▀▀▄ \n █▄█▄▀ ▄▄▀█▀▄█ \n █ ███▄███▀█▀ █ \n ▀▄▀ ▀▄▀▀ █ ▄▀ \n █ ▄▀ ▀▄ ▀█ \n █▄███▀▀▀▀███▄█ "]]], + ["piddomon", [["angry", " ▄▄▄ \n ▄▀▀▀▀▀▀▄█ ▀▄ \n █ ▄█▄ ▀▄\n █ █ ▀▄▀▄█\n ▄█▀▀▀▀▀ █▄▀▀▄ ▀\n █ ▀▄▄▄▄██▄█▄ █ \n █▀▄▄█▄▄▄▄█▄▄▀ \n █▄▄█▄▄▀▄▄▄▄▄█ "], ["attack", " ▄▀▀▀▀▀▀▄█▀▄ \n █ ▄▄█ █\n▄▄ █▀▀▀ █ █ ▄ █\n█ ▀█▄▄▄▄█▀█ ▄▀▄█\n▄▀▀ ▀▄▄█ █▀ ▀\n█▄▀█▀▀▀ █▀ \n ▄▄▀█▀▀█▀ ▀▄▄▄ \n█▄█▄█▄▄▀█▄█▄▄█ "], ["eat_1", " ▄▀██▀▀▀▄▀█▀▄ \n █▄▄▄▄▄ █▀ █ \n ▀█████▀▄█ ▀▄ █\n ▄████▀ █▄▀ ▀█\n▄▀▀▄▄▄▄▄▀▀▀▀▀▄ \n█ ▀█ █▀ █ \n █▀█▀▀█▀▀▀▀█▀ \n█▄▄█▄▄▀▄▄▄▄▄█ "], ["eat_2", " ▄▄▄▄▄▄ \n▄▀ ▀▄▀█▄ \n█ ▄▀█▄▀ █ \n█▄▄▄▄▄ █ █ ▄ █ \n▀▄ ▄█▄▀▄▄▀▄█ \n█ █▀█▀▀▄▄ █ ▀ \n▀▄▄▄▀▄▄▄▄▄▀▄▄ \n█▄▄█▄▄▀▄▄▄▄▄█ "], ["happy", " ▄▀▀▀▀▀▀▄ ▀█▄ \n █ ▀▀▀▀ ▄▄█▄▀ █ \n ▀▄▄▄▄▄▀▄ █ ▄ █\n ▄█▄▄▄▄▀ █ ▄▀▄█\n ▄▀▄▄▄▄▄▀▀▀█ ▀\n█ ▄ █▄ █ \n▀▄▀█▀▀█▀▀▀▄▄█ \n█▄▄█▄▄▀▄▄▄▄▄█ "], ["injured_1", " \n ▄▀▀▀▀▀▀▄ \n █ █▀▄▄ \n █ ▄▀▀█ ▀▄\n ▀█▀▀ █ ▄▄▀▄▀▄ █\n ▄▀█▀▀▀▀ █ ▀█\n █▄▀▄▄▄▄▄█ █ \n █▄▄█▄▄█▄█▄▄▄█ "], ["injured_2", " \n ▄▄▄▄▄▄ \n ▄▀ ▀▄▄ \n █ ▄▄█ ▀▀▄ \n █▄▄▄ ▄▀ █▄▄ █\n ▄▀▄▄▄█▄▀▀ █▀▄█\n █▄▀▄▄▄▄▄█ █ ▀\n █▄▄█▄▄█▄█▄▄▄█ "], ["sleep_1", "▄▄ ▄▄▄▄▄▄ \n█ ▀█▀▀▄▀▄▀ █ ▀▄\n█▀██ ▀█ █ █ █\n█▄▄█▄ █▄▄█ ▄▄ █\n█▀ ▄▀▀ ▀▀▄ ▀▀█\n▄▀ ▄▀\n█ ▄ ▄█ ▄▄ █\n ▀▀▀ ▀▀ ▀▀ ▀▀ "], ["sleep_2", " ▄▄ ▄▀█▀█▀▀▄ \n█▀▄█ ▄█ █ █ █\n█▄▄█ █ ▀▄ ▀ █\n█▄▀▀▀▄█▄▄▀▀▀▀▀▄█\n█ ▀ ▀ ▄▀\n▀▄ █\n█ ▄▀▄▄█▄ ▄▀\n ▀▀▀▀ ▀▀▀ "], ["walk_1", " ▄▀▀▀▀▀▀▄ ▀█▄ \n █ █▄▀ █ \n █▀▀▀▀▀▀ ▄▀▄ ▄ █\n █▀▄▄▄▄▀█▄▄█▄▀▄█\n ▄▀▄▄▄▄▄▄▀ █ ▀\n█ ▄ ▀ █▄ █ \n▀▄▀█▀▀█▀▀▀▄▄▀ \n█▄▄█▄▄▀▄▄▄▄▄█ "], ["walk_2", " ▄▄▄▄▄▄ ▀█▀▄ \n ▄▀ ▀▄▀ █ \n █▄▄▄▄▄▄ █ ▀▄ █\n █▄ ▄▄▀ █▀ ▀█\n▄▀▄▀▀▀▀ ▀█▀▀▄ \n█ ▄▀▀█▀▀▀██▄ █ \n █▀▄▄▄▄▄▄▄█▄▄▀ \n█▄▄█▄▄▀▄▄▄▄▄█ "]]], + ["piedmon", [["angry", " ▄▀▀▀▀▀▀▀▀▄ \n █▄▄▄▄▄▄▄▄▀▀█▄\n ▄▀ ▄█▄ █ ▀▀\n █▄█ ▄ █ \n ▀▄█████▄▄▄▀ \n ▄▀▄▀▄▄▀▄▄ ▀▄ \n ▀▄▀▀ ▀ ▀▄▄▀ \n █▄▄▄█▀▀▄▄▄▄█ "], ["attack", " ▄▄ ▄▀▀▀▀▀▄ \n █▄█▀ ▀█▀▄ ▀▄ \n █▄▄▄ ▀█▀ █ ▄▄█ \n ▀▄▀█▄ ▀▄▀ ██\n █ ██ ▄▀ \n █▀▀▀▀ ▄▄▀ ▀▀▄ \n█ ██▀▀▀ ▀▀▄▄▀ \n █▄▄▄█▀▀▀▄▄▄▄█ "], ["eat_1", " ▄▄ ▄▀▀▀▀▀▄ \n █▄█▀ ▀█▀▄ ▀▄ \n █▄▄▄ ▀█▀ █ ▄█ \n ▀▄▀█▄ ▀█ ██\n ▄▄ █ ██ ▄▀ \n█ ▄▀▀▀▀ ▄▄▀ ▀▄ \n ▀▄▀█▀▀▀ ▀▄▄▀ \n █▄▄▄█▀▀▀▄▄▄▄█ "], ["eat_2", " ▄▀▀▀▀▀▀▀▀▄ \n █▄▄▄▄▄▄▄▄▀▀█▄\n ▄▀ ▄█▄ █ ▀▀\n █▄█ ▀ ▄ █ \n █▄▀▀▀▀█▄▄▄▀ \n █ ▀█▀▀ █▄ ▀▄ \n ▀█▀▄▀▀▀▄▀▄▄▀ \n █▄▄▄█▀█▄▄▄▄█ "], ["happy", " ▄▀▀▀▀▀▀▀▄ \n ▄▀█▀▀▀█▀▀▄ █ \n █▀▀ ▀▄▀ █▄█ \n ▀█▀███ █ ██\n▄▀▀▄█ ███ ▄▀▀▄ \n▀▄▄▄▀▀▀▀ ▄▀ ▄▄▀ \n ▄▄█▀▀▀▀ █▄▄ \n █▄▄▄██▀▀▀▄▄▄▄█ "], ["injured_1", " ▄▄▄ ▄▄▄ \n ▄█▄ ▀▀▀▀ ▄▀█▄\n ▀▀█▀▀▀▀▀▀▀▀█ ▀▀\n ▄▀▄█▄ ▄█▄ ▀▄ \n ▀▄ ▀ ██ ▀ ▄▀ \n ▄▀██▀▀▀▀█▀▀▄ \n █▄▄ █▀▀█ ▄▄█ \n █▄▄▄█▄▄▄▄█▄▄▄█ "], ["injured_2", " \n ▄▀▀▀▄▄▄▄▀▀▀▄▄ \n███▄▄▄▄▄▄▄▄█ ██ \n ▄▀ ▄ ▄ ▀▄ \n█ ▀█▀▄▄ ▀█▀ █ \n ▀▄▄▄██▄▄▄▄▄▀ \n ▄▀▄▀▄▄▄▀▄ █▀▀▄ \n █▄▄█▄▄▄█▄▄▄█▄█ "], ["sleep_1", "▄▄▀▀▄▄ ▄▄▀▀▄▄\n▀▀▀▄ ▀▀▀▀ ▄▀▀▀\n ▄▀▄▄▄▄▄▄▄▄▀▄ \n █ ▄█▄ ▄█▄ █ \n ▀▄ ██ ▄▀ \n ▄█▀██▀▀▀▀██▀█▄ \n██ ██ ██ ██\n ▀█▄██▄▄▄▄██▄█▀ "], ["sleep_2", " ▄▄▀▀▀▄▄▄▄▀▀▀▄▄ \n██ █▄▄▄▄▄▄▄▄█ ██\n ▄▀▄█▄ ▄█▄▀▄ \n █ ██ █ \n ▀▄▄▄▄▄▄▄▄▄▄▀ \n ▄█▀▄█▀ ▀█▄▀█▄ \n ██ ██ ██ ██ \n ▀█▄██▄▄██▄█▀ "], ["walk_1", " ▄▄▀▀▀▄▄▄▄▀▀▀▄▄ \n██ █▄▄▄▄▄▄▄▄█ ██\n ▄▀▄█▄ ▄█▄▀▄ \n █ ▄ ▀ ██ ▀ ▄ █ \n ▀▄███▄▄███▄▀ \n ▄▀ ▄▀▄▄▄▄▀▄ ▀▄ \n ▀▄▄▀▀ ▀▀▄▄▀ \n █▄▄▄▄█▀▀█▄▄▄▄█ "], ["walk_2", " ▄▄▄ ▄▄▄ \n▄█▀▄ ▀▀▀▀ ▄▀█▄\n▀▀ █▀█▀▀▀▀█▀█ ▀▀\n ▄▀ ▀█▀▄▄▀█▀ ▀▄ \n ▀▄▀▄▄▄▀▀▄▄▄▀▄▀ \n ▄▀▀█▀▀▀▀█▀▀▄ \n █▄▀▄▀▀▀▀▄▀▄█ \n █▄▄▄▄█▄▄█▄▄▄▄█ "]]], + ["piranimon", [["angry", " \n █▄ \n ▄ ▄ █ ▀█▄ \n▀▄██████▄▄▀█▄ \n███▀ ██▀▀ ▀▄ ▄█▄\n█▀█▀▀█▄▄▄ ▄▀▀ █\n █▄█▀▀▄ ▄▀█ ▀▀ \n ▀▄▀ "], ["attack", " █▄ \n ▄ ▄ █ ▀█▄ \n▀▄██████▄▄▀█▄ \n██▀ ███▀▀ ▀▄ ▄█▄\n█▀█▀▀█▄▄▄ ▄▀▀ █\n ██ ▀█▀ ▀▀ \n ▄ ▄█ ▀▄▄▀ \n ▀▀▀ █▄▀ "], ["eat_1", " █▄ \n ▄ ▄ █ ▀█▄ \n▀▄██████▄▄▀█▄ \n██▀ ▄██▀▀ ▀▄ ▄█▄\n█▀█▀▀█▄▄▄ ▄▀▀ █\n █▄ ▄▀█ ▀▀ \n █▄█▀ ▀▄▀ \n "], ["eat_2", " ▄ \n ▄▀█▄ \n▄ █▄█▄█▄ ▀█▄ \n▄██▀▄▀███▀▄▀▀ ▄ \n██████▀ ▀▄█▀█\n▀▄▀▄▄█▀▀▀▄▄▀ ▄▄▀\n ▀▀▀ ▀▄▀▄▀ \n ▀ "], ["happy", " ▄ █▄ ▄▀▄ \n ▄ ▄ █ ▀█▄ ▀ \n▀▄██████▄▄▀█▄ \n██▀▄▀██▀▀ ▀▄ ▄█▄\n█▀█▀▀█▄▄▄ ▄▀▀ █\n █▄ ▄▀█ ▀▀ \n █▄█▀ ▀▄▀ ▄ \n ▀▄▀"], ["injured_1", " \n ▄▀▄ ▄ \n ▀ ▄▀█▄ \n▄ █▄█▄█▄ ▀█▄ ▀ \n▄██▀█████▀▄▀▀ ▄ \n███▄▄█▀ ▀▄█▀█\n▀▄▀▄▄█▀▀▀▄▄▀ ▄▄▀\n ▀▀▀ ▀▀▄▄▀ "], ["injured_2", " ▄ \n ▀▄▀ \n ▀ █▄ \n ▄ ▄ █ ▀█▄ \n▀▄██████▄▄▀█▄ \n███ ▀██▀▀ ▀▄ ▄█▄\n█▀█▀▀█▄▄▄ ▄▀▀ █\n █▄█▀▀▄▄▄██ ▀▀ "], ["sleep_1", " ▄ \n ▄▀█▄ \n▄ █▄█▄█▄ ▀█▄ \n▄██▀▀████▀▄▀▀ ▄ \n██████▀ ▀▄█▀█\n▀▄▀▄▄█▀▀▀▄▄▀ ▄▄▀\n ▀▀▀ ▀▄▀▄▀ \n ▀ "], ["sleep_2", " █▄ \n ▄ ▄ █ ▀█▄ \n▀▄██████▄▄▀█▄ \n███▄▄██▀▀ ▀▄ ▄█▄\n█▀█▀▀█▄▄▄ ▄▀▀ █\n ▄ ▄█▀▄ ▄▀█ ▀▀ \n ▀▀▀ ▀▄▀ \n "], ["walk_1", " ▄ \n ▄▀█▄ \n▄ █▄█▄█▄ ▀█▄ \n▄██▀▀████▀▄▀▀ ▄ \n██▄▄██▀ ▀▄█▀█\n▀ ▀ ▄█▀▀▀▄▄▀ ▄▄▀\n █▄█▀ ▀▄▀▄▀ \n ▀ "], ["walk_2", " █▄ \n ▄ ▄ █ ▀█▄ \n▀▄██████▄▄▀█▄ \n██▀ ▄██▀▀ ▀▄ ▄█▄\n█▀█▀▀█▄▄▄ ▄▀▀ █\n ▄ ▄█▀▄ ▄▀█ ▀▀ \n ▀▀▀ ▀▄▀ \n "]]], + ["piximon", [["angry", " ▄▀▀▄ \n ▄▀▄▄▀▀▄\n ▄█▄▀ ▄▄▀▀\n ▄▀▄▄ █▀ \n █ █ \n ▀▄▀▀▀▀▄▀ \n \n ▄▄▄▄▄▄ "], ["attack", " ▄▄▀█ \n ▄▄▄▄▄▀▀▄▄▄▀ \n █ ▄█ █▄ ▀▄ \n ███▄ █ ▀▄▄█ \n ███ █ \n ▄███ █ \n ▀▄▀▀▀▀▄▀ \n ▄▄▄▄▄▄▄▄ "], ["eat_1", " ▄▄▄ \n ▄▀▀▄▄▀█\n ▄▀▀▀▀▄▀▀ ▄▄▀\n ▀█▄▀ █▀▀ \n ▄███ █ \n ▀▄▀▀▀▀▄▀ \n \n ▄▄▄▄▄▄ "], ["eat_2", " ▄▀█ \n █ ▄▀█ \n █ █ ▄▀ \n ▄▄██ ▄▀ \n █ ▄ █ \n ▄█▄▄▄▄█▄ \n \n ▄▄▄▄▄▄ "], ["happy", " █▀▄ ▄▀█ \n █ ▀▄ ▄▀ █ \n █ █ █ █ \n ▀▄▀▀▀▀▄▀ \n ▄▀▀ ▀▀▄ \n ▀▄████▄▀ \n ▀▄▀▀▀▀▄▀ \n ▄▄▄▄▄▄▄▄ "], ["injured_1", " \n \n \n \n \n \n▄▀▀▀▄▀▀▀▀▀▀▄▀▀▀▄\n█▄▀▀▀▄█▄▄█▄▀▀▀▄█"], ["injured_2", " \n \n \n \n \n \n ▄▄▄▀▀▀▀▀▀▄▄▄ \n▄█▄▄█▄█▄▄█▄█▄▄█▄"], ["sleep_1", " \n \n \n \n \n ▄▄▄ ▄▄▄▄ ▄▄▄ \n▄▀ ▄█▄ ▄█▄ ▀▄\n█▄▀▀▀▄▄▄▄▄▄▀▀▀▄█"], ["sleep_2", " \n \n \n \n \n \n \n "], ["walk_1", " █▀▄ ▄▀█ \n ▀▄ █ █ ▄▀ \n ▀▄ █▄▄▄▄█ ▄▀ \n ▀█▄ ▄█▀ \n ▄▀▄▄▄▄▀▄ \n ▀ ▀ \n \n ▄▄▄▄▄▄ "], ["walk_2", " \n▄▄ ▄▄\n█ ▀▀▄ ▄▀▀ █\n ▀▀▄▄█▀▀▀▀█▄▄▀▀ \n ▄▀▀ ▀▀▄ \n ▀▀▀▀▀▀ \n \n ▄▄▄▄▄▄▄▄ "]]], + ["platinumnumemon", [["angry", " \n █▄█ ▄ ▄ █▄█ \n ▀▄██▀ ▀██▄▀ \n ▄█▄ ▄▀ ▄▄ \n▄▀ ▄▀██▀▀█▀ ▀▄\n█ █▄▀ ▄▄ ▀▄█ █\n▀▀█▀▀▀▀▀ ▀ ▀▄\n ▀█▄▄▄▄▄▄▄▄▀▀▀ "], ["attack", " █▄█ ▄ ▄ █▄█ \n ▀▄██▀ ▀██▄▀ \n█▀▄▀▄ ▄▀ ▄▀▀█\n█▀ ▀▄▀██▀▀█▀ ▀█\n▀▀▄▄▀ ▄▄ ▀▄▄▀▀\n ████████ ▀▄ \n ▄█▀ ▄██▀ █\n █▄▄██▄▄▄▄▄▀▀▀ "], ["eat_1", " █▄█▄█ █▄█▄█ \n ▀▄█▄▀ ▀▄█▄▀ \n ▄▄ █▀██▀▀█ ▄▄ \n█ ▄█ ▄▄ █ ▄▀▄\n█▄▀███████▄ ▀█▄█\n ██▀▀▀▀██ ▀█ \n ██ ▄▄▄▀ █\n ▀▄▄▄█▄▄▄▄▄▀▀▀ "], ["eat_2", " ▄ ▄ ▄ ▄ ▄ ▄ \n █▀█▀█ █▀█▀█ \n ▀▀█▀▀ ▀▀█▀▀ \n ▄▀▀▀▄▄▄▄█▄▄▀▀▄ \n█ ▄ █ ▀▀ ▀▄ ▄ █\n▀▀ █ ▀█▀▀\n █ ▀▄▄▄▄▀▀ ▀█\n ▀█▄▄▄▄▄▄▄▄▀▀▀ "], ["happy", " █▄█▄█ █▄█▄█ \n ▀▄█▄▀ ▀▄█▄▀ \n▄▄▄▀▄ ▄▀ ▄▄▄\n█▄▄▀▄▀██▀▀█▄▀ ▄█\n █ ▄█▄ ▄▄▄▀▄ ▄▀\n █▀███████ ▀▄ \n █ ▀█████▀ █\n ▀▄▄▄███▄▄▄▀▀▀ "], ["injured_1", " \n █▄█▄█ █▄█▄█ \n █▄▄▄█ █▄▄▄█ \n ▄█▄ ▄▀ ▄▄ \n▄▀ ▄▀██▀▀█▀ ▀▄\n█ █▄▀ ▄▄ ▀▄█ █\n▀▀██▀▀▀▀██▀ ▀▄\n █▄▄▄▄██▄▄▄▀▀▀ "], ["injured_2", " \n▄ ▄ ▄ ▄ ▄ ▄ \n█▀▀▀█ █▀▀▀█ \n▀▀█▀▀ ▀▀█▀▀ \n ▄▀▀▀▄▄▄▄▄█▄▀▀▄ \n█ ▄ █ ▀▀ ▀▄ ▄ █\n▀▄█▀▀▀▀▀██ ▀▀▀█\n █▄▄▄▄███▄▄▄▀▀▀ "], ["sleep_1", " \n▄ ▄ ▄ ▄ ▄ ▄ \n█▀▀▀█ █▀▀▀█ \n▀▀▀█▀ ▀▀█▀▀ \n▄▀▀▀▄▀██▀▀█▄▀▀▀▄\n█ █▄▀ █ █ █\n▀▀▄█▄▄▄▄▄▄ ▀▀▀▄\n ▀▄▄▄▄▄▄▄▄▄▀▀▀ "], ["sleep_2", " \n █▄█▄█ █▄█▄█ \n █▄▄▄█ █▄▄▄█ \n ▄▄▀▄ ▄▀ ▄▄▄ \n█ ▄ ▄▀██▀▀█▀ ▄ █\n█▄▀▄▀ ▀▄█▄▀\n ██▄▄▄▄▄▄ █\n ▀▄▄▄▄▄▄▄▄▄▀▀▀ "], ["walk_1", " ▄ ▄ ▄ ▄ ▄ ▄ \n █▀█▀█ █▀█▀█ \n ▀▀█▀▀ ▀▀█▀▀ \n ▄▀▀▀▄▄▄▄█▄▄▀▀▄ \n█ ▄ █ ▀▀ ▀▄ ▄ █\n█▄▀█▄ ▄▄ ▀█▄▀\n ▄▀ ▀▀▀ ▀ ▀▄\n ▀▄▄▄▄▄▄▄▀▀▀▀ "], ["walk_2", " \n █▄█▄█ █▄█▄█ \n █▄█▄█ █▄█▄█ \n ▄█▄ ▄▀ ▄▄ \n▄▀ ▄▀██▀▀█▀ ▀▄\n█ █▄▀ ▄▄ ▀▄█ █\n▀▀██▀▀▀███▀ ▀▄\n █▄▄██▄▄▄▄▄▀▀▀ "]]], + ["plesiomon", [["angry", " \n ▄▄██▄▄▀▄ \n ▄▄▀ ▄▀▄ ▄█ \n█▄▄▄▄▀▀ ▀▀█ █▀▄\n ▀▄▄▄▀ ██▄█ █\n ▄█ ▀▀ ▀ █\n █ ▄ ▄ █▄ ▄█\n█▄▄▄█▄█▄▄▄██▄▄▄█"], ["attack", " ▄▄▄▀▀▀▀█▀▀▀█ \n█▄▄▄ ▄█▀▀▄▀▀ \n███▀▀▄ ▄▀ ▄▀▄\n █▀▀▀▀▄ █▄▄ ▄█ █\n ▀█▀▀ ▀█▀██ ▄▀\n █▀▄▀ ▄ ▀ ▀ █ \n ▄█ ▀▄ ▀▀▄▄ █ \n█▄▄▄▄█▀▀███▀▄▄▄█"], ["eat_1", " ▄▄▄▀▀▀▀█▀▀▀█ \n█▄▄▄ █ ▀▄▄▀ \n███▀▀▄ ▄▀ ▄▀█\n █▀▀▀▀▄ ▄█▄ ▄█ █\n ▀█▀▀ ██▀██ █\n ▄▀█ █ █ █ \n █ ▄ █ ▄▄ █ \n█▄▄▄█▀█▄▄▄██▄▄▄█"], ["eat_2", " \n ▄▄██▄▄▀▄ \n ▄▄▀ ▄ ▀▄ ▄██▀▄ \n█▄▄ ▀ ▀ ▀▀█ ▀▄ █\n ▀▄▄▄▄▀ ▄█▄▄█ █\n ▄▀ ▀ █▀█ █ \n ██ █▄ █ █ \n█▄▄█▄▄▄▄█▄▄▄█▄▄█"], ["happy", " ▄▄▄▀▀▀▀█▀▀▀█ \n█▄▄▄ ▄▀▄▀▄▄▀ ▄▄\n█████▄ ▄▀ █ █\n █▀▀▀▀▄ ▄█▄ ▄▀ █\n ▀█▀▀ ▀█▀██ ▄▀\n █▀▄▀ ▄ ▀ █ \n ▄█ ▀▄ ▀▀▄▄ █ \n█▄▄▄▄█▀▀███▀▄▄▄█"], ["injured_1", " \n \n ▄▄ ▄ \n ▄▀▀▀█▀▀ █ \n▄▀▀ █▄▄ █▄█▄▄▄▀█\n▀█▀ ▄ ▀▄▀█▀ ▀▄\n ▄█▀▀▀▄ ▄ █\n█▄▄█▄█▄▄▄██▄▄▄▄█"], ["injured_2", " \n \n \n ▄▄██▄▄▀▄ \n ▄▄▀▄ ▀▄ ▄█▄▄▀█\n█▄▄ ▀▀▀ █▀██▀ ▀▄\n █▄▄▄▄█ ▄ █\n█▄▄█▄█▄▄▄██▄▄▄▄█"], ["sleep_1", " \n \n ▄ ▄▄ \n █ ▀▀█▀▀▀▄ ▄▀█\n █▀▄█ ▄▄ ▀▀█ █\n█ ▄ ▀█▀ █ \n▀▄ ▀ ▀██▀▄ ▀▄\n█▄█▄▄█▄▄▄██▄▄▄▄█"], ["sleep_2", " \n \n ▄▀▄▄██▄▄ \n ▀▄ ▄▀ ▀▄█▀▄ \n ▄▀ ▀▀ ▀▀ ▄▄█ █\n █ ▄▄▀▄▄▄▄▀ █\n ▄█ ▄▄▄ ▄ ▀▄\n█▄▄█▄█▄▄▄██▄▄▄▄█"], ["walk_1", " ▄▄██▄▄▀▄ \n ▄▄▀ ▄▄▀▄ ▄█ \n█▄▄ ▀▀ ▀▀█ █▀▄\n ▀▄▄▄▄▀ ▄▀ █ █\n █ ██▀██▀ █\n ▄▀█ ▀ █ █ \n █ ▄ ▄ ▀▄▄ █ \n█▄▄▄█▀█▄▄▄██▄▄▄█"], ["walk_2", " ▄▀▀▀▀██▄▀█ \n▄▀▀ ▄█▀ ▀▄ ▄▀ \n▀███ ▄ █ ▄▄\n ▀▄▄▄▀ ▄█▄ ▄▀ █\n █ █▀█▀ █ \n ▄▀ ▄ █ █ \n ▄▀ █ █▄ ▀▄ \n█▄▄█▀▀▄▄▄██▄▄▄▄█"]]], + ["plesiomon_x", [["angry", " ▄▄▄▄ \n ▄▀▀▀ ▄▄▄█▄ \n▄▀▀ ▄█ ▀▄ ▀ \n█▄▄▄▄ ▄▀▄▀ \n ▀▄▄▄ ▄█▄▄▀▀▀ ▄\n █ ▀ ▄ ▀▀▄ ▄█\n ▄▀▀ ▀▀▄ █▄▀\n█▄▄▄▀▀▀▀▄▄▄▄█▄▄█"], ["attack", " ▄▄▄▀▀▀▀▀▀▀▄ \n█ ▄█ ▄▀▀▀▄█▄ \n ▀██▄ ▄▀▄ ▀ \n ███ ▀▄▀ ▄▄ \n ▀▄▄▄ ▀▄▄▀ █\n ▄▀ ▄ ▀▀▄▄▀█\n ▄▀ ▄ █ █▀ \n█▄▄▄▀▀█▄▄▄█▄▄▄█ "], ["eat_1", " ▄▄▄▀▀▀▀▀▀▄ \n█ ▄▀▄ ▄▀▀▄█▄ \n ▀█▄ ▄▀▄ ▀ \n ▄▀▀ ▀▄▀ ▄▄ \n ▀▀█ █▄▄▄▀ █\n ▄▀ ▀ ▀▀▄▄▀█\n █ ▄ ▀▄ █▀ \n █▄▄▀ ▀▄▄▄█▄▄▄█ "], ["eat_2", " ▄▄▄▄ \n ▄▀▀▀ ▄▄▄█▄ \n▄▀▀▄▀▄ ▀▄ ▀ \n█▄▄▄▄ ▄▀▄▀ \n ▀▄▄▄ ▄█▄▄▀▀▀ ▄\n █ ▀ ▀▀▄ ▄█\n ▄▀▀ ▀▀▄▄ █▄▀\n█▄▄▄▀▀▀▀▄▄▄▄█▄▄█"], ["happy", " ▄▀▀▀▀▀▀▄ \n▄▀▀▄▀▄ ▄▀▀▄█▄ \n▀▄▄▄▄ ▄▀▄ ▀ \n ██▀ ▀▄▀ ▄▄ ▄\n ▀▄▄ █▄▄▄▀ ▄█\n █ ▄ ▀▀▄▀▄▀\n █ █ █ █ \n █▄▄▀ ▀▄▄█▀▄▄▄█ "], ["injured_1", " ▄▄▄▄ \n ▄▀▀ ▄▄▄▀▄ \n▄▀▀ █▄ ▀▄▀▀█ \n▀███ ▄▀▄▀ \n ▀▄▄▄ █▀ ▄▄▄ \n ▄▀ ▀ ▀▀▀▄ ▄█\n▄▀▄ ▄▀ ▄▄ ▀█▄▀\n█▄█▄▄█▄▄▄▄█▄█▄▄█"], ["injured_2", " \n ▄▄▀▀▀▀▄ \n ▄▄▀ ▄ ▀█▀▄█▄ \n█ ▀▀ ▄▀▄ ▀ \n █▀▀ █▄▀ ▄▄▄ \n ▀█▀ ▀ ▀▀▄ ▄█\n▄▀█ ▄▀ ▄▄ ▀█▄▀\n█▄█▄▄█▄▄▄▄█▄█▄▄█"], ["sleep_1", " \n ▄▄▀▀▀▀▀▄ \n █ ▀█▀▄█▄ \n▄▀ ▀▀ ▄▀▄ ▀ \n▀▄▄▀▀ █▄▀ ▄▄▄ \n ▄▀▀ ▄▀▀▀▀▄ ▄█\n █ ▀ ▀▄ ▀█▄▀\n█▄█▄▄█▄▄▄▄█▄█▄▄█"], ["sleep_2", " ▄▄▄▄▄ \n ▄▀▀ ▄▄▄▀▄ \n ▄▀ ▄▄ ▀▄▀▀█ \n█ ▄▄ ▄▀▄▀ \n ▀▀▄▄ █▀ ▄▄▄ \n ▄▀ ▄▀▀▀▀▄ ▄█\n █ ▀▄ ▀█▄▀\n█▄█▄▄█▄▄▄▄█▄█▄▄█"], ["walk_1", " ▄▄▄▀▀▀▀▄▄ \n ▄▄▀▄▄ ▄▀▀▀ ▀ \n█ ▀▀ ▄▀▄ \n▀█▀▀▀ ▀▄▀ ▄▄ \n ▀█▀ █▄▄▄▀ █\n █ ▀ ▀▀▄▄▀█\n █ ▀▄▄ █▀ \n █▄▄▀▀▀▄▄▄▄█▄▄█ "], ["walk_2", " ▄▄▄ \n ▄▀▀▀ ▄▄▀▄ \n▄▀▀▄█▀ ▀▄ ▀▀█ \n█▄▄▄▄ ▄▀▄▀ \n ▀▄▄▄ ▄█▄▄▀▀▀ ▄\n █ ▀ ▀▀▄ ▄█\n ▄▀▀ ▀▀▄▄ █▄▀\n█▄▄▄▀▀▀▀▄▄▄▄█▄▄█"]]], + ["pomumon", [["angry", " ▄▄▀██▄▀█ \n ▄▄▀ ▀ ▄▀▀▄ \n█▄██ ▄█ ▀▀█▄ █ \n ▄█ ▀▄ █ █\n ▀█▀▄▄▀▄▄█▀▀▄ ▀█\n ▀█ ▄ ▄ ▄ ▄ █▄▄\n ▄█▄▀ ▀ ▀▄▄█▄▀\n █▄█▄█▀▀▀█▄█▄█ "], ["attack", " ▄▄▄ ▄▄ \n ▄▀ ▄▀▀▀ █▄ \n ▄▀▀ ▄▄ ▄█▄ ▀▄ \n▄▀█▄ ██ ▄▀▀▄▀▄\n████ ▄ ▄▄█ ▀▄█\n █▄▀▀ ▀▀▀ ▀▄ ▀\n ▄█▄▀▄▀▄▀▄▀▄███\n █▄█▄█▄▄▄▄▄█▄█▄█"], ["eat_1", " ▄▄▄ ▄▄ \n ▄▀ ▄▀▀▀ █▄ \n ▄▀▀ ▄ ▄█▄ ▀▄ \n▄▀█▄ ▀ ▀ ▄▀▀▄▀▄\n████ ▄ ▄▄█ ▀▄█\n █▄▀▀ ▀▀▀ ▀▄ ▀\n ▄█▄▀▄▀▄▀▄▀▄███\n █▄█▄█▄▄▄▄▄█▄█▄█"], ["eat_2", " ▄▄▀██▄▀█ \n ▄▄▀ ▀ ▄▀▀▄ \n█▄██ ▀▀▄ ▀▀█▄ █ \n ▄█ ▀▄ █ █\n ▀█▀▄▄▀▄▄█▀▀▄ ▀█\n ▀█ ▄ ▄ ▄ ▄ █▄▄\n ▄█▄▀ ▀ ▀▄▄█▄▀\n █▄█▄█▀▀▀█▄█▄█ "], ["happy", " ▄▄▀██▄▀█ \n ▄▄▀ ▀ ▄▀▀▄ \n█▄██ ▄▀▄ ▀▀█▄ █ \n ▄█ ▀▄ █ █\n ▀█▀▄▄▀▄▄█▀▀▄ ▀█\n ▀█ ▄ ▄ ▄ ▄ █▄▄\n ▄█▄▀ ▀ ▀▄▄█▄▀\n █▄█▄█▀▀▀█▄█▄█ "], ["injured_1", " \n ▄▀▀█▄▄▀█ \n ▄█ ▀ ▄▀▀▄ \n █▄ █▄ ▀▀█▄ █ \n█▄██ ▀▄ █ █\n▀▀█▀▄▄▀▄▄█▀▀▄ ▀█\n ▄█▄▀ ▀▄▀▄▀▄███\n █▄█▄█▄▄▄▄▄█▄█▄█"], ["injured_2", " \n ▄▄▄ ▄▄ \n ▄▀ ▄▀▀▀ █▄ \n ▄▀▀ ▄ ▄█▄ ▀▄ \n▄▀█▄ ▀▀ ▄▀▀▄▀▄\n████ ▄ ▄▄█ ▀▄█\n ▄██▀▄▀█▀▄▀▄███\n █▄█▄█▄▄▄▄▄█▄█▄█"], ["refuse", " ▄▄▄ ▄▄ \n ▄▀ ▄▀▀▀ █▄ \n ▄▀▀ ▄ ▄█▄ ▀▄ \n▄▀█▄ ▀▀ ▄▀▀▄▀▄\n████ ▄ ▄▄█ ▀▄█\n █▄▀▀ ▀▀▀ ▀▄ ▀\n ▄█▄▀▄▀▄▀▄▀▄███\n █▄█▄█▄▄▄▄▄█▄█▄█"], ["sleep_1", " ▄▄▄ ▄▄ \n ▄▀ ▄▀▀▀ █▄ \n ▄▀▀ ▄█▄ ▀▄ \n▄▀█▄ ▀▀ ▄▀▀▄▀▄\n████ ▄ ▄▄█ ▀▄█\n █▄▀▀ ▀▀▀ ▀▄ ▀\n ▄█▄▀▄▀▄▀▄▀▄███\n █▄█▄█▄▄▄▄▄█▄█▄█"], ["sleep_2", " \n ▄▀▀█▄▄▀█ \n ▄█ ▀ ▄▀▀▄ \n █▄ ▄▄ ▀▀█▄ █ \n█▄██ ▀▄ █ █\n▀▀█▀▄▄▀▄▄█▀▀▄ ▀█\n ▄█▄▀ ▀▄▀▄▀▄███\n █▄█▄█▄▄▄▄▄█▄█▄█"], ["walk_1", " ▄▀▀█▄▄▀█ \n ▄█ ▀ ▄▀▀▄ \n █▄ ▄█▀ ▀▀█▄ █ \n█▄██ ▀▀ ▀▄ █ █\n▀▀█▀▄▄▀▄▄█▀▀▄ ▀█\n ▀█ ▄ ▄ ▄ ▄ █▄▄\n ▄█▄▀ ▀ ▀▄▄█▄▀\n █▄█▄█▀▀▀█▄█▄█ "], ["walk_2", " ▄▄▄ ▄▄ \n ▄▀ ▄▀▀▀ █▄ \n ▄▀▀ ▄▄ ▄█▄ ▀▄ \n▄▀█▄ ██ ▄▀▀▄▀▄\n████ ▄ ▄▄█ ▀▄█\n █▄▀▀ ▀▀▀ ▀▄ ▀\n ▄█▄▀▄▀▄▀▄▀▄███\n █▄█▄█▄▄▄▄▄█▄█▄█"]]], + ["popomon", [["angry", " \n \n \n \n ▄▄▄▄▄ \n ▄█ ▄▀▄▄▄ \n █▀▀ ▀▀ █▀▄▀▄\n ▀▄▄▄▄▄█▀▀▄▄█"], ["attack", " ▄ ▄ \n ▄▄▄▄▄ \n ▄█ ▄▀▄ ▄ \n █▀▀ ▀▀ █▄ \n ▄ ▀▄▄▄▄▄▀▄▀▄ \n ▀▀▄▄█ \n ▀ \n ▄▄▄▄▄ "], ["eat_1", " \n ▄ \n \n ▀ \n ▄▀▀▀▀▀▄ \n █ ▄ ▄ █ ▄▄▄ \n █ ██ █▀▄ █ \n ▀▄▄▄▄▄███▄▀ "], ["eat_2", " \n \n \n \n ▄▄▄▄▄ \n ▄▀ ▀▄ ▄▄▄\n █ ▀ ▀ █▀▄ █\n ▀▄▄▄▄▄███▄▀ "], ["happy", " \n ▀ ▀ \n▄ ▄▀▀▀▀▀▄ ▄ \n █▄▀▄ ▄▀▄█ \n ▀▄ ▄▀█ \n ▀▀▀▀█▄▀ █ \n ▀▀▀ \n ▄▄▄▄▄ "], ["injured_1", " \n \n \n \n ▄▄▄▄▄ \n ▄▀▄ ▄ ▀▄ ▄▄▄\n █▀▀ ▀▀ █▀▄ █\n ▀▄▄▄▄▄███▄▀ "], ["injured_2", " \n \n \n \n \n ▄▀▀▀▀▀▄ ▄▄▄\n █▄█ █▄ █▀▄ █\n ▀▄▄▄▄▄▄▄██▄▀ "], ["sleep_1", " \n \n \n ▄ ▄ \n ▄▀ ▀▄▀▄ \n █ █▄▀█▄▀█ ▄▄▄\n █ ▀▄ █ █▀▄ █\n ▀▄▄█▄▄███▄▀ "], ["sleep_2", " \n \n \n ▄▀▄▀▄ \n ▄▀▄ ▄█ █▄ \n █ █▀ ▀█ █ ▄▄▄\n █ ▀▄ █ █▀▄ █\n ▀▄▄█▄▄███▄▀ "], ["walk_1", " \n \n \n ▄▄▄ \n ▄▄▄▄█▀▄ █ \n ▄▀ ▀▄█ \n █ ▀ ▀ █ \n ▀▄▄▄▄▄█▀ "], ["walk_2", " \n ▄ \n ▄▄▄▄▄ \n ▄▀ ▀▄ \n █ ▀ ▀ █▄ \n ▀▄▄▄▄▄▀▄▀▄ \n ▀▀▄▄█ \n ▀ ▄▄▄▄▄ "]]], + ["porcupamon", [["angry", " ▄▄▄ ▄▄▄ \n █ ▄████▀▀▀▄ █ \n ▀█▄▀█▀ ▄▀ ▀▄█ \n ███▀▀▀▄ █ \n ▀██▄▄▄█▄▄▀▄ \n ▄█ ▄ ▄ █▄ █ \n █ █▄▀█▀ █ █▀ \n █▄███▀█▄██▄█ "], ["attack", " ▄▄▄ ▄▄▄ \n █ ▄████▀▀▀▄ █ \n ▀█ ▀█▀ ▄█ ▀▄█ \n▄▀███▀▀▀▄ █ \n▀▄▀█▄▄▄▄█▄▄▀▄ \n ▀█ ▄█ █ \n ▄▀▀▄ ▀▄█▄█▄▄ \n ▀▄▄▄█▀▀▀▀█▄▄█▄█"], ["eat_1", " ▄▀▀█▄▄▄▄▄█▀▀▄ \n █▄▀███▀ █ █ \n ▄█▄▀▀▀▀▄▀▀ ██ \n █ ▀██████ ▄▀▄█\n ▀▄ ██████▀█ ▄▀\n ██▄▄▄▄▀ █▀ \n ▄█▄ ▀ ▄▄█▄ \n █▄█▄█▀▀▀█▄▄█▄█ "], ["eat_2", " ▄▄▄ ▄▄ \n █ ▄████▀▀▀▄ █ \n ▀█▄▀█▀ ▄▀▄▀▄█ \n ███▀▀▀▄ █ \n ▄▀▀█▄▄▄█▄▀▀▀▄ \n █ █▄ ▄ █ █ \n ▀█▄▀█▀ ▄███ \n █▄▄██▀█▄▄█▄█ "], ["happy", " ▄▀▀█▄▄▄▄▄█▀▀▄ \n █▄▀███▀ ▄ █ █ \n ██▄█▄▄▀ ▀ ██ \n▄▀██▀ █ ▄▀▄█ \n▀▄ █▀▀▀▀▀▀█ ▄▀ \n ▀█ █▄█ █▀ \n ▄▄█▄ ▀ ▄█▄▄▄ \n█▄█▄█▀▀▀▀▀█▄▄█▄█"], ["injured_1", " ▄▄▄ ▄▄▄ \n █ ▄████▀▀▀▄ █ \n ▀█▀ █▀ █▄ ▀▄█ \n █▄█▀▀▀▄▀▀ █ \n ██▄▄▄▄█▄▄▀▀▄ \n █ █ █▄█ ▀▄ █ \n ▀▄██▄▀ ▄█▄▄█ \n █▄█▄█▀▀▀█▄▄█▄█ "], ["injured_2", " \n ▄▀▀█▄▄▄▄▄█▀▀▄ \n █▄█▀██▀▄ █ █ \n █ ▄█▄▄▀█▄ █▀ \n ██▀ █ ▄█ \n ▄▀█▀███▀▀█ ▀▄ \n ▀▄█▄ ▀ ▄█▄▄█ \n █▄█▄█▀▀▀█▄▄█▄█ "], ["sleep_1", " \n ▄▄▄ ▄▄▄ \n █ ▄████▀▀▀▄ █ \n ▀█▀▀█▀ ▄▄▄▀▄█ \n ███▀▀▀▄ █ \n ▀█▄▄▄▄█▄▄▀▀▄ \n▄▀▀█ ▄▀▄▄▀▀▀▄\n▀▄▄▄█▄▄▄███▄▄▄▄▀"], ["sleep_2", " \n ▄▀▀█▄▄▄▄▄█▀▀▄ \n █▄████▀ █ █ \n █▄▄█▄▄▀▀▀ █▀ \n ██▀ █ ▄▀ \n ▄▀█▀▀▀▀▀█▀▀▄ \n▄▀▀█ ▄▀▄▀▀▀▄\n▀▄▄▄█▄▄▄▄██▄▄▄▄▀"], ["walk_1", " ▄▀▀█▄▄▄▄▄█▀▀▄ \n █▄▀███▀ ▄ █ █ \n █▄▄█▄▄▀▀ █▀ \n ███ █ ▄█ \n ▄█▀▀▀▀▀▀█ ▀▄ \n █ █ █▄█ ▀▄▄▀█ \n ██▄ ▀ ▄█▄█ \n █▄█▄█▀▀▀█▄▄█▄█ "], ["walk_2", " ▄▄▄ ▄▄▄ \n █ ▄████▀▀▀▄ █ \n ▀█ ▀█▀ ▄█ ▀▄█ \n ███▀▀▀▄ █ \n ▀██▄▄▄█▄▄▀▄ \n ▄▀█ ▄ ▄ ▀▄ █ \n █▄█ ▀█▀ ▄▀█▀█▄ \n█▄█▄█▀▀▀▀▀█▄██▄█"]]], + ["poromon", [["angry", " \n \n ▄▄ \n ▄▄█▄█ \n ▄█ ▄▀▄ \n ▄▀█▀▀ ▀▀ █▀▄ \n █▄▀▄▄▀▄ ▄▀▄█ \n ▀▀▀▀▀ "], ["attack", " ▄▄ \n ▄▄ ▄▄█▄█ ▄▄ \n █ ██ ▄▀█ █ \n ██▀▀▄▄▀▀ ██ \n ▀▄█▄▄█ ▄▀ \n ▀█████ \n ▀▄▄▀ \n "], ["eat_1", " \n \n ▄▀█ \n ▄▄ ▄▀▀▀▀▀▄ ▄▄ \n █ █ █ █ █ █ \n ▀█ ▄▀▄ █▀ \n ▀████▄▀ \n ▀▄▄▀ "], ["eat_2", " \n \n ▄▀█ \n ▄▄ ▄▀▀▀▀▀▄ ▄▄ \n █ █▀▄ ▄▀▄ █ █ \n ▀█ ▄ █▀ \n ▀█▄█▄▄▀ \n "], ["happy", " \n \n ▄▀█ \n ▄▄ ▄▀▀▀▀▀▄ ▄▄\n ▀▄▀█▀▄ ▄▀▄ █▀▄▀\n ▀█ ▄▀▄ █▀ \n ▀█▀▀█▄▀ \n ▀▀ "], ["injured_1", " \n \n \n ▄▀█ \n ▄▀▀▀▀▀▄ \n ▄█▄█ █▄ █▄ \n █ █ ▄ █ █ \n ▀▀ ▀█▄█▄▄▀ ▀▀ "], ["injured_2", " \n \n \n ▄▄ \n ▄▄█▄█ \n ▄▀▄ ▄ ▀▄ \n ▄▀█▀▀ ▀▀ █▀▄ \n █▄▀▄▄█▄▄▄▄▀▄█ "], ["sleep_1", " \n \n \n ▄▀█ \n ▄▀▀▀▀▀▄ \n ▄█▄▄ ▄▄ █▄ \n █ █ ▄ █ █ \n ▀▀ ▀█▄█▄▄▀ ▀▀ "], ["sleep_2", " \n \n \n ▄▄ \n ▄▄█▄█ \n ▄▀ ▀▄ \n ▄▀█▀▀ ▀▀ █▀▄ \n █▄▀▄▄█▄▄▄▄▀▄█ "], ["walk_1", " \n ▄▄ \n ▄▄█▄█ \n ▄▀▄ ▄ ▀▄ \n ▄▀█ ▀ ▀ █▀▄ \n █▄▄▀▄▄▀▄ ▄▀▄▄█\n ▀▀▀▀▀ \n "], ["walk_2", " \n \n ▄▀█ \n ▄▄ ▄▀▀▀▀▀▄ ▄▄ \n █ █ █ █ █ █ \n ▀█ ▄ █▀ \n ▀█▄█▄▄▀ \n "]]], + ["poyomon", [["angry", " \n \n \n \n ▄▀████▀▄ \n █▀▄██▄▀█ \n █▄ ▄█ \n █ █▀▀█ █ "], ["attack", " \n \n \n \n ▄█████▄ \n ▀█▄██ \n ███ \n ▀██▀██▀█ "], ["eat_1", " \n \n \n \n ▄█████▄ \n ▀█▄██ \n ███ \n ▀██▀██▀█ "], ["eat_2", " \n \n \n \n ▄▄▄▄ \n █▀████ \n ██████ \n █▀██▀█ "], ["happy", " \n \n \n \n ▄▀██▀▄ \n ▄█▄██▄█▄ \n █ █ \n █▀█▀▀█▀█ "], ["injured_1", " \n \n \n \n \n ▄▄▄▄▄▄ \n █▀▀██▀▀█ \n ██▀██▀██ "], ["injured_2", " \n \n \n \n \n ▄▄▄▄▄▄ \n █▀▀██▀▀█ \n ██▀██▀██ "], ["refuse", " \n \n \n \n ▄▄▄▄ \n █▀▀███ \n ▀▀▀███ \n █▀██▀█ "], ["sleep_1", " \n \n \n \n \n ▄▄▄▄▄▄ \n █▀▀██▀▀█ \n ██▀██▀██ "], ["sleep_2", " \n \n \n \n \n ▄▄▄▄▄▄ \n █▀▀██▀▀█ \n ██▀██▀██ "], ["walk_1", " \n \n \n \n ▄▄▄▄ \n █▀██▀█ \n ██████ \n █▀██▀█ "], ["walk_2", " \n \n \n \n \n \n ▄████▀█▄ \n ██▄█████ "]]], + ["princemamemon_x", [["angry", " \n ▄▄█▄▄ \n █ █ █ █ \n ▄▀▀▀▀▀▄ \n ▄█ █▄ ▄█ █▄ \n █▄█ ▄▄▄ █▄█ \n █▄██▄▄▄▄▄██▄█ \n ▀█▄▄██▄██▄▄▀▀ "], ["attack", " ▄ \n ▄▀█▀█▀▄ \n ▄▄ ▀▄█▄█▄▀ \n█ █ ▄█▄ ▄█ ▀▄ \n ▀▀▄ ▀▄▄▄▄ ▄█▄ \n ▄█▀██▀▀█ ▄▄▀█\n ▄█▄▄█▀█▀█▀█▄▄█\n ▀▀█▄▄█▀▀█▄▄█▀▀"], ["eat_1", " ▄ \n ▄▀█▀█▀▄ \n ▀▄█▄█▄▀ \n ▄▀▄ ▄▀▄ \n ▄▀█ ███ █▀▄ \n █▄██▄ ███ ▄██▄█\n ███▀▀█▀█▀▀███ \n ▀▀▄▄█▀▀▀█▄▄▀▀ "], ["eat_2", " \n ▄▄█▄▄ \n █ █ █ █ \n ▄▀▀▀▀▀▄ \n ▄█ ▄ ▄ █▄ \n █▄█▀ ▀ ▀ ▀█▄█ \n █▄██▄▄█▄▄██▄█ \n ▀█▄▄██▄██▄▄▀▀ "], ["happy", " ▄ \n ▄▀█▀█▀▄ \n ▄▄ ▀▄█▄█▄▀ ▄▄ \n █ █▀▄ ▄▀█ █\n █▀█▀ ▀▄▀ ▀█▀█ \n ▄██▄ █ ▄██▄ \n ████▀█▀█▀████ \n █▄▄█▀█▄▄█ "], ["injured_1", " \n \n ▄▄█▄▄ \n █ █ █ █ \n ▄▀▀▀▀▀▄ \n ▄█ ▄█ █▄ █▄ \n ▄▀▄█▄ ▄ ▄█▄▀▄\n █▄▄█▄█▄▄▄█▄█▄▄█"], ["injured_2", " \n \n ▄ \n ▄▀█▀█▀▄ \n ▀▄█▄█▄▀ \n ▄▄▀ ▀▄▄ \n ▄▀▄█ ▄█ █▄ █▄▀▄\n █▄▄██▄▄▄▄▄██▄▄█"], ["sleep_1", " \n ▄ \n ▄▀█▀█▀▄ \n ▀▄█▄█▄▀ \n ▄▄▀ ▀▄▄ \n ▄▀█▄▄▄ ▄▄▄█▀▄ \n █▄█▄ ▄█▄█ \n ██▄█▄█████▄█▄██"], ["sleep_2", " \n ▄▄█▄▄ \n █ █ █ █ \n ▄▀▀▀▀▀▄ \n ▄█ █▄ \n ▄▀█▀▀▀ ▀▀▀█▀▄ \n █▀██▄▄▄▄▄██▀█ \n ██▄▄██▄██▄▄██ "], ["walk_1", " ▄ \n ▄▀█▀█▀▄ \n ▀▄█▄█▄▀ \n ▄▀▄ ▄▀▄ \n ▄▀█ ▀ ▄ ▀ █▀▄ \n █▀█▄ ▀ ▀ ▄█▀█ \n ████▀█▀█▀████ \n ▀▀█▄▄█▀█▄▄█▀▀ "], ["walk_2", " \n ▄▄█▄▄ \n █ █ █ █ \n ▄▀▀▀▀▀▄ \n ▄█ █ █ █▄ \n █▄█ ▄▀▄ █▄█ \n █▄██▄▄▄▄▄██▄█ \n ▀█▄▄██▄██▄▄▀▀ "]]], + ["pteramon_x", [["angry", " \n ▄▄▀▀▀█▀ \n ▄▀▄▀ ▀▀▀▄ ▄▀█\n █▀ ▄█ ▄█▄▀ ▄█\n █ ▄▄▄▄▀ ▄ ▄▀\n█ ▄▀▄▀▄ ▀▄█▄▄\n ▀ ▀ █▄▄ ▄ ▄▄▄▀\n █▄▀▄▀▄▀▄█ "], ["attack", " ▄▄▀▀▀█▀ \n ▄▀▄▀ ▀▀▀▄ ▄▀█\n ▄▀▀ ▄█ ▄█▄▀ ▄█\n█ ▄▄▄▄▄▀ ▄ ▄▀\n▀▀▀███▀▄ ▀▄█▄▄\n ▀▄▀▄ ▄ ▄ ▄▄▀\n ▄▀▄▀█▀▄▀█▀ \n ▀▀ ▀▀▀ ▀ "], ["eat_1", " ▄▄▄▄▄ \n ▄▀█ ▄█▄ ▄▄\n █▄▀ ▄ ▄▀▄▀ █\n █ ▀ ▀▄▀▀▀ ▀█\n█ ▄▄██▀▀ ▀▄ ▄▀ \n▀▀▀█▀▄█ ▀▀▀█\n ▀▀ ▄█▄ ▄█▄▀▀ \n █▄▀▄▀▄▀▄█ "], ["eat_2", " ▄▄▄▄▄ \n ▄▀█ ▄█▄ ▄▄\n █▄▀ ▄ ▄▀▄▀ █\n ▄▀ ▀ ▀▄▀▀▀ ▀█\n▄▀ ▄▀█▀▀ ▀▄ ▄▀ \n▀▄▀▄▀ █ ▀▀▀█\n ▄█▄ ▄█▄▀▀ \n █▄▀▄▀▄▀▄█ "], ["happy", " ▄▄▀▀▀█▀ \n ▄▀▄▀ ▀▀▀▄ ▄▀█\n ▄▀▀ ▄▀▄ ▄█▄▀ ▄█\n▄▀ ▄▄▄▄▀ ▄ ▄▀\n█▄████ █ ▀▄█▄▄\n ▀█▄▀▄ ▄ ▄▄▀\n ▄▀█▀▄▀█▀▄ \n ▀▀ ▀ ▀ ▀▀ "], ["injured_1", " \n ▄▄▀▀▀█▀ ▄▄\n ▄▀▄▀ ▀▀▀▄▄▀ █\n █▀ █▄ ▄█▄ ▀█\n █ ▄▄▄▄▀ ▄ ▄▀ \n█ ▄▀▄▀▄ ▀▀▀▀█\n ▀ ▀ ▄█▄ ▄▄▄▀▀ \n █▄▀▄▀▄▀▄█ "], ["injured_2", " \n ▄▄▄▄▄ \n ▄▀█ ▄█▄ ▄▀█\n █▄▀▄ ▄▀▀ █\n ▄▀ ▀▀ ▄▀▀▀ ▄▀\n▄▀ ▄▀█▀▀ ▀▄▄██▄\n▀▄▀▄▀ █▄▄ ▄▄▄▄▄▀\n █▄▀▄▀▄▀▄█ "], ["sleep_1", " \n ▄▄▄▄▄ \n ▄▀█ ▄█▄ ▄▀█\n █▄▀ ▄▀▀ █\n ▄▀ ▀▀ ▄▀▀▀ ▄▀\n▄▀ ▄▀█▀▀ ▀▄▄██▄\n▀▄▀▄▀ █▄▄ ▄▄▄▄▄▀\n █▄▀▄▀▄▀▄█ "], ["sleep_2", " \n ▄▄▀▀▀█▀ ▄▄\n ▄▀▄▀ ▀▀▀▄▄▀ █\n █▀ ▄▄ ▄█▄ ▀█\n █ ▄▄▄▄▀ ▄ ▄▀ \n█ ▄▀▄▀▄ ▀▀▀▀█\n ▀ ▀ ▄█▄ ▄▄▄▀▀ \n █▄▀▄▀▄▀▄█ "], ["walk_1", " ▄▄▀▀▀█▀ \n ▄▀▄▀ ▀▀▀▄ ▄▀█\n █▀ ▄█▀ ▄█▄▀ ▄█\n █ ▄▄▄▄▀ ▄ ▄▀\n█ ▄▀▄▀▄ ▀▄█▄▄\n ▀ ▀ ▀▄ ▄ ▄▄▀\n ▄▀█▀▄▀█▀▄ \n ▀▀ ▀ ▀ ▀▀ "], ["walk_2", " ▄▄▄▄▄ \n ▄▀█ ▄█▄ ▄▄\n █▄▀ ▄▄ ▄▀▄▀ █\n ▄▀ ▀▀ ▄▀▀▀ ▀█\n▄▀ ▄▀█▀▀ ▀▄ ▄▀ \n▀▄▀▄▀ █▄▄ ▄▄█▀▀█\n █▄▀▄▀▄▀▄█▀ \n "]]], + ["pukumon", [["angry", " ▀▄ ▀▄ █ ▄▀ ▄▀ \n▀▄ █▄██▄██▄█ ▄▀ \n ▄▀██████▀███ ▄▄\n▄▀▄▄▀▀▀▀▄▄█▀▀█ █\n█ █ ▀▀▀ ██▄▀ █▀▀\n █▀▀███████▀██▀▀\n ▄▀▄ ▄ ▄ ▄▀ ▀▄\n▀ ▄▀█▀█▀█▀█ ▀▄ "], ["attack", " ▀▄ ▀▄ █ ▄▀ ▄▀ ▄\n▀▄ █▄██▄██▄█ ▄▀ \n▄▄▀▀▀▀█▀ ▄███▄▄▀\n █ ██ ████▀▄ █▄▄\n▀█ ██ ███▀█▄▄▀▄ \n▄█▄▄▄▄█▄█▀█▀ █ ▀\n▄▀▄ ▄ ▄ ▄ ▄█ ▀▄\n▄▀ ▀█▀█▀█▀█ ▀▄ "], ["eat_1", " ▀▄ ▀▄ █ ▄▀ ▄ \n ▀▄▄██████▄▄▀ \n ▄██▀▄▀██████▄▀█\n▀▄ ████▀▄ ████ █\n █ █▀███▄▄█▄▀█▀▀\n▄▀ ████▄█▀▄▀ █▄▄\n ▀▀▄ ▄ ▄ ▄ ▄▀▄ \n ▀ ▀█▀█▀█▀▀▄ ▀ "], ["eat_2", " ▄ ▀▄ █ ▄▀ ▄ \n▀▄ █▄██▄██▄█ ▄ \n ▄█▀▀████████ ▄▄\n▄▀▀█▄█▀▄ █████ █\n▄▀ ████▄▄██▄▀▀▄█\n▀███▄██▄█▀▄▀ █▄ \n ▀▄ ▄ ▄ ▄ ▄▀▄ \n ▀ ▀█▀█▀█▀█▀▄ "], ["happy", " ▀▄ ▀▄ █ ▄▀ ▄▀ ▄\n▀▄ █▄██▄██▄█ ▄▀ \n▄▄▀▄▀███▀▄▀██▄▄▄\n▄▀██▀▀▀▀█████▀▄▄\n█ █ ████ ████ █▄\n▄██ █▄▄█ ███▀█▄▄\n ▄█▀▄▄▄▄▀▀ ▄▀▄ \n▀ █▀█▀▀█▀█▀▄ ▀▄"], ["injured_1", " \n \n ▄ █▄▀▄█ ▄ \n ▄█████████▄▀ \n▀▄███▀███████▄▄ \n▄█▀▀▀█▄█▀▄ ███ █\n █ ▀ █▀██▄▄▀ ▄▀▀\n▀ ▀██▄▄▄▄▄▄▄▄▀▀ "], ["injured_2", " \n \n ▄▄ ▄▄ \n ▀█▄▄█▄█▄▄█▀▄ \n▀▄███████████▄▄ \n▄█▀▀▀▄▄█▀▄▀███ █\n █ ▀ █▀██▄▄▀ ▄▀▀\n▀ ▀██▄▄▄▄▄▄▄▄▀▀ "], ["sleep_1", " \n ▄ ▄ ▄ \n ▀▄ █▄▀▄█ ▄▀ \n ▀▄█████████▄▀ \n ▄███████████▄▀█\n █▀▀▀▄▄█▀▄ ███ █\n █ ▀ ██▀█▄▄█ ▄▀▀\n ▀██▄███▄█▄▄▀ "], ["sleep_2", " \n ▄ ▀▄ █ ▄▀ ▄ \n ▄ █▄██▄██▄█ ▄ \n▄ ███▀▀██████ ▄▄\n █▀▀▀███▀▄ ███ █\n▀█ █ ████▄▄█▀▀▄█\n▄▀▄▄▄▀█▄█▀█▀ █▄ \n ▄▀▄▄▄▄▄▄▄▄▄▀▄ "], ["walk_1", " ▀▄ ▀▄ █ ▄▀ ▄▀ \n▀▄ █▄██▄██▄█ ▄▀ \n▄▄█ ▀███▀ ███▄▄▄\n▄████ ▄ ██████▄▄\n ████ █ ████▀█▄▄\n▀█▄▀█▄▄▄█▀▄▀▀█▄▄\n▀▀▄ ▄ ▄ ▄▀▄ \n▄▀ ▀█▀█▀█▀█▀▄ ▀▄"], ["walk_2", " ▄ ▄ ▄ ▄ ▄ \n▄ ▀▄ █▄▀▄█ ▄▀ ▄ \n ▀▄█████████▄▀ \n▀██▀█████▀████▀▀\n▀██▄▄▀▀▀▄▄████▀▀\n▄█▀██ ▀ ██▀█▄█▀▀\n▄█▀ ▀▀▀▀▀ ▀ ▄▀▀▀\n ▄▀▄█▄█▄█▄▄█ ▀▄ "]]], + ["pulsemon", [["angry", "▄ ▄▄▄▄▄▄▄▄ \n██ ▄▀▀ ▄▀ \n▀▀█ ▀▀▀▄ \n █ ▄▄▄ ▄▀ \n █ ▀▀▀ ▄▀ \n ▀▄▄▄▄▄ ▀▀▄ \n █▄▀ ▄▄▄ ▀▄▄▄█ \n ▄█████ ██████▄ "], ["attack", "▄ ▄▄▄▄▄▄▄▄ \n██ ▄▀▀ ▄▀ \n▀▀█ ▀▀▀▄ \n █ ▄██ ▄▀ \n █ ▄█▀ ▄█▄▄\n ▀▄▄▄▄▄ ▄▄▄▀\n ▄▀ ▄▄▄ █ \n ▄█████ ██████▄"], ["eat_1", "█▄ ▄▄▀▀▀▀▀▀█▀ \n██▄▀ █▄▄ \n ▄▀ ▄▄▄▄ ▄▀ \n █▄▄▄▄▄▄▄ ▀▄ \n ▀█▀ █ ▄█ \n █ ▀█▀▀ ▄ ▀▄ \n ▀█ ▄▄▄ ▀█▀▀ \n ▄█████ ██████▄ "], ["eat_2", "▄ ▄▄▄▄▄▄▄▄ \n██ ▄▀▀ ▄▀ \n▀▀█ ▀▀▀▄ \n █ ▄▄ ▄▀ \n █ ▀ ▀ ▄▀ \n ▀▄▄▄▄▄ ▀▀▄ \n █▄▀ ▄▄▄ ▀▄▄▄█ \n ▄█████ ██████▄ "], ["happy", "█▄ ▄▄▀▀▀▀▀▀█▀ \n██▄▀ █▄▄ \n ▄▀ ▄▀▀▄ ▄▀ \n █▄▄▄▄▄▄▄▄ ▀▄ \n ▄▀█▀ █ ▄▀█ \n ▀▄▄▀▀▀▀ ▄▄▀ \n █ ▄▄▄ █ \n ▄█████ ██████▄ "], ["injured_1", " ▄▄▄▄▄▄▄▄ \n ▄▄ ▄▀▀ ▄▀ \n██▀█ ▀▀▀▄\n▀ █ ▄ ▄▀ \n ▀▄▄▄ ▀▀▀ ▄▀ \n █▄▄▄▄ ▀▀▄ \n █▄▀ ▄▄▄ ▀▄▄▄█\n ▄█████ ██████▄"], ["injured_2", " \n ▄▄▀▀▀▀▀▀█▀ \n▄██▄▀ █▄▄ \n█▀▄▀ ▄▀\n █ ▀▄▄▄ ▀▄ \n ▀█▀ ▄█ \n ▄▀█▀▀▀ ▄ ▀▄\n ▄██▄▄███▄▄████"], ["sleep_1", " \n█▄ ▄▄▀▀▀▀▀▀█▀ \n██▄▀ █▄▄ \n ▄▀ ▄▀ \n █ ▄▄▄ ▀▄ \n ▀█▀ ▄▀█ \n ▄▄██▀▀ ▄▄▄█ \n ▀████▄▄▄██████"], ["sleep_2", " ▄ ▄▄▄▄▄▄▄▄ \n ██ ▄▀▀ ▄▀ \n ▀▀█ ▀▀▀▄\n █ ▄▀ \n ▀▄▄▄ ▀▀▀ ▄▀ \n ▀▄▄▄▄ ▄▀█ \n ▄▄█▄ ▄▄▄█ \n ▀████▄▄▄██████"], ["walk_1", "█▄ ▄▄▀▀▀▀▀▀█▀ \n██▄▀ █▄▄ \n ▄▀ ▄▄ ▄▀ \n █ ▀██ ▀▄ \n ▀▄ ▀▀ ▄█ \n ▄▀█▀▀▀ ▄ ▀▄ \n ▀█ ▄▄▄ ▀█▀▀ \n ▄█████ ██████▄ "], ["walk_2", "▄ ▄▄▄▄▄▄▄▄ \n██ ▄▀▀ ▄▀ \n▀▀█ ▀▀▀▄ \n █ ▄██ ▄▀ \n █ ▄█▀ ▄▀ \n ▀▄▄▄▄▄ ▀▀▄ \n █▄▀ ▄▄▄ ▀▄▄▄█ \n ▄█████ ██████▄ "]]], + ["pumpkinmon", [["angry", " ▄▄▄▀█▄▄▄▄ \n ▄▀ █▀▀▀▀▀▄ ▀▄ \n █▄▄ ▄▄ ▀ █ \n ▀▄ ▄ ▄ ▄▀ \n ▄█▀ ▀ ▀ ▄█ \n █▄ █▀█▀▀█▀▀ ▄█ \n █▀█ █▀▀ ▀▄ \n █▄▄▄▄▄▄▄▄▄▄▄█ "], ["attack", " ▄▀█▀▀▀▀█▀▄ \n █ ▄█▀ ▀ █ \n █ ▄ ▄ ▄ █ \n ▀▀█████▄ █ \n ▄▀█▀█▀▀ █▄ \n ▄▀▄▄▄▄▄▄▄▄▀ █ \n ▀▄▀█ █▀ █▄▀ \n █▄▄▄▄▄▄▄▄▄▄▄▄█ "], ["eat_1", " ▄▀▀█▀▀▀██▀▄ \n ▄██ ██ █ █ \n █▄ ▄ ▄ ▄ █ \n ███████ █ \n ▄ ▄█▀█▀█▀█ █ \n█ ▀█▄▄▄▄▄▄▄▄▀▀▀▄\n ▀▀█▀█ █▀ ▄█▄█\n █▄▄▄▄▄▄▄▄▄▄█▄ "], ["eat_2", " ▄▄▄▀█▄▄▄▄ \n ▄▀ █▀▀▀▀▀▄ ▀▄ \n ██ ██ ▀ █ \n ▀▄ ▄ ▄ ▄▀ \n █▀ ▀ ▀ ▄▀ \n █ █▀█▀█▀█▀ █ \n █ ▄▀█ █▀ ▀▄█ █ \n █▄▄▄▄▄▄▄▄▄▄▄▄█"], ["happy", " ▄▀█▀▀▀▀██▀▄ \n ▄▀▄ ▄▀▄ ▀ █ \n █▄ ▄ ▄ ▄ ▄ █ \n ████████ █ \n ▄█▀█▀█▀█ █ \n ▄▀▀▄▄▄▄▄▄▄▄▀▀▀▄\n █▄█▀█ ▀█▀ █▄█\n █▄▄▄▄▄▄▄▄▄▄▄█ "], ["injured_1", " \n ▄▄ \n ▄▀▀█▄███▀▀▄ \n █ ▀ ▀ █ \n █ ▄█ █▄ █ \n █ ▄ ▄ ▄ ▄ █ \n █ ▀▄█▄█▄█▄▀ █▄ \n█▄▄█▄▄▄▄▄▄▄█▄▄▄█"], ["injured_2", " \n ▄▄ \n ▄▀▀█▄███▀▀▄ \n █ █ █ █ \n █ ▄ ▄ █ \n █ ▀▀ ▀▀ █ \n █ ▀▄█▄█▄█▄▀ █▄ \n█▄▄█▄▄▄▄▄▄▄█▄▄▄█"], ["sleep_1", " \n ▄▄▄▀█▄▄▄▄ \n ▄▀ █▀▀▀▀▄ ▀▄ \n █ ▀ █ \n █▄▄ ▄▄ █ \n ▀▄ ▄ ▄ █▄ \n ▄▀█▄█▄█▄▄▄▀ █ \n█▄▄▄█▄█▄▄█▄█▄▄▄█"], ["sleep_2", " ▄▄ \n ▄▀▀█▄███▀▀▄ \n █ ▀ █ █ \n █▀▀ ▀▀ █ \n ▀▄▀▄▀▄ █ \n ▄▀▄▄▄▄▄▄▄▄▀▄ \n █ █▄▀▄▄█ ▄ █ \n █▄▄▄█▄▄█▄█▄▄▄▄█"], ["walk_1", " ▄▄▄▀█▄▄▄▄ \n ▄▀ █▀▀▀▀▄ ▀▄ \n ███ ██ ▀ █ \n █ ▄ ▄ ▄ ▄ ▄▀ \n █ ▀ ▀ ▀ ▄█ \n▄▀ ▀█▀█▀▀█▀ ▀▄ \n█ █ ▀█ ▀█▀ █▄ █ \n▀█▄▄▄▄▄▄▄▄▄▄▄█▀ "], ["walk_2", " ▄▄ \n ▄▀▀█▄███▀▀▄ \n █▄▄ ▀ ▄▄ █ █ \n █▀▀ ▀▀ █ \n ▀▄▀▄▀▄▀▄▀ █ \n ▄▀▄▄▄▄▄▄▄▄▀ ▀▄ \n█ ▄ █▄▀▄▄█ ▀▀▄▀ \n █▄▄▄█▄▄█▄▄▄▄▄█ "]]], + ["punimon", [["angry", " \n \n \n \n █▄█▄█ \n █▄▀█▀▄█ \n █ ▀▀▀ █ \n ▀▄▄▄▀ "], ["attack", " \n \n \n \n \n ▄ ▄ \n █▀██ \n █████ "], ["eat_1", " \n \n \n \n \n ▄ ▄ \n █▀██ \n █████ "], ["eat_2", " \n \n \n \n ▄█████▄▄ \n ▀█▄██▄ \n ███ \n ▄███████ "], ["happy", " \n \n \n \n █▄█▄█ \n █▄███▄█ \n ██ ██ \n ▀█▄▄▄█▀ "], ["injured_1", " \n \n \n \n \n ▄ ▄ ▄ \n ▄█████▄ \n █▄▄█▄▄█ "], ["injured_2", " \n \n \n \n \n ▄ ▄ ▄ \n ▄█████▄ \n █▄▄█▄▄█ "], ["refuse", " \n \n \n \n ▄ ▄ ▄ \n ▄█▀▀███ \n ▀▀▀▀███ \n ▀█████▀ "], ["sleep_1", " \n \n \n \n \n ▄ ▄ ▄ \n ▄█████▄ \n █▄▄█▄▄█ "], ["sleep_2", " \n \n \n \n \n ▄ ▄ ▄ \n ▄█████▄ \n █▄▄█▄▄█ "], ["walk_1", " \n \n \n \n \n █▄█▄█ \n ██▄█▄██ \n ▀█████▀ "], ["walk_2", " \n \n \n \n \n ▄ ▄ ▄ \n ▄███▀█▄ \n ██▄████ "]]], + ["puppetmon", [["angry", " ▄███████▄ \n ▄▀ ▄▀██▀▄█\n ▄▀▀▀▀▄ ▀ ▄▄▀▄ \n ▀▀█▀▀▄▄ ▀▀▄▀ \n ▄▀▀▄██▄▄▀▀▄ \n ▀▄▀█▄▄▄▀▄▀▄█ \n ▄▀▀▀████▀▄▄ \n ▀▀▀▀▀ █▄█▄▄█ "], ["attack", " ▄▀▀▀▀▀██▄ \n▄▀▀▀▀▀█ ▄▀ ██▀▄\n ▀▀▀█▀▄▄▄ ██ █▀▀\n ▀▄ ███ ▄▀ \n █▀▄▀█▀▀▀█▀▄▀█ \n ▀▀▄▀▄▄▄▀▄▀▀ \n ▄▄▀█████▀▄▄▄ \n █▄▄█▄█ ▀█▄▄▄█"], ["eat_1", " ▄▀▀▀▀▀██▄ \n ▄▀▀▀▀█ ▀▀ ██▀▄\n ▀▀█▀▄▄▄ ██ █▀▀\n ▀▄ ██ ▄▀ \n █▀▄▀█▀▀▀█▀▄▀█ \n ▀▀▄▀▄▄▄▀▄▀▀ \n ▄▄▀█████▀▄▄▄ \n █▄▄█▄█ ▀█▄▄▄█"], ["eat_2", " ▄███████▄ \n ▄▀ ▄▄▀██▀▄█\n ▄▀▀▀▀▄ ▄▄ ▀▄ \n ▀▀█▀▀ ▀▀ ▄▀ \n ▄▄▀█▀▀▀█▀▄▄ \n █▄▀▄▀▄▄▄▀▄▀▄█ \n ▄▄▀█████▀▄▄ \n █▄▄█▄█ █▄█▄▄█ "], ["happy", " ▄▀▀▀▀▀██▄▀█\n▄▄▄▄█▄▄ ▄▀▄ ▀█▀ \n▀▄▄▄▄▄▀ ▄ ▄▄▀▄ \n █▀ ██▀█ ▀▀▄▀ \n █ ▀▄█▄▄█▄▄▀ █ \n ▀▀▄▀▄▄▄▀▄▀▀ \n ▄▄▄▀█████▀▄▄▄ \n █▄▄▄█▀ ██▄▄▄█"], ["injured_1", " ▄▄▄▄▄▄▄ \n ▄▀▀▀▀████▀▄\n ▄▄█▄ █▄ ▀█ ▀▀\n ▀▄▄▄▄█ ██ █ \n ▀▄▄██▄▄▄▀ \n █ ▀▄ ▄▀ █ \n ▄▄▀█████▀▄▄ \n █▄▄█▄▀▀▀▄█▄▄█ "], ["injured_2", " \n ▄▄▄▄▄▄ \n ▄▀▀▀▀████▄ \n ▄▄█▄ ▀▄▄ ▀█▀▄█\n ▀▄▄▄▄█ ▄▄ █ \n ▀▄▄██▄██▀ \n █▀█ ▀▄▀ █▀█ \n █▄▄█████▄▄█ "], ["sleep_1", " \n ▄█████▄▄▄ \n ▄████████▀▄▀\n ▄▀ ▀▀▀▀▀▀▄ \n ▄▀▀▀▀▄ ▀▀▀ █ \n ▄█▀██ ▄█ ▄▄\n █ ▀█ █▀█▀█ █▀ █\n █▄▄█▄▄███▄▄█▄▄█"], ["sleep_2", " \n \n \n \n \n \n \n "], ["walk_1", " ▄███████▄ \n ▄▀ ▄ ▀██▀▄█\n ▄▀▀▀▀▄ ▀▄▄ ▀▄ \n ▀▀█▀▀ ▀▀ ▄▀ \n ▄▄▀█▀▀▀█▀▄▄ \n █▄▀▄▀▄▄▄▀▄▀▄█ \n ▄▄▀█████▀▄▄ \n █▄▄█▄█ █▄█▄▄█ "], ["walk_2", " ▄██████▄ \n ▄▀ ▄ ▀███▀▄\n▄▀▀▀▀▄ ▀▄▄ ▀█ ▀▀\n ▀▀▀█▀ ▀▀ ▄▀ \n █▀▄▀█▀▀█▀▀█▀▄ \n ▀▀▄▀▄▄▀▄█▀█▀ \n ▄█▀████▄▀█ \n █▄▄█▄█ ▀▄█ "]]], + ["pururumon", [["angry", " \n \n \n \n ▄▀▀█▀▄ \n █▄ ▀▀ ▀▄ \n ▀▄▄▀ ▄ ▀▄ \n █▄▄█▄█▄█▄▄█ "], ["attack", " \n \n ▄▀▀▀█▄ \n █▀▀▀▄▀▀ █ \n ▀▄███▄ █ \n █████ ▀▄ \n █ ▀▀▄ ▄ █ \n ▀██▀▀▄▄▀ "], ["eat_1", " \n \n \n ▄▀▀▀▀▄ \n █▄█ ▀ █ \n █ ▄▄█ ▀▄ \n ███▀ ▄ ▀▄ \n ▀▄▄█▄█▄█▄▀ "], ["eat_2", " \n \n \n \n ▄▀▀▀▀▄ \n █▄ ▀ ▀▄ \n ▀▄▄▀ ▄ ▀▄ \n █▄▄█▄█▄█▄▄█ "], ["happy", " \n ▄▄▄▄ \n ▄▀▄ ▄ ▀▄ \n ▄▀▀▀▄ █ \n ▀▄███ █ \n █▀▀▄ ▄▀▄ █ \n ▀▀██▀▄▄▀ \n "], ["injured_1", " \n \n \n \n ▄▄▄ \n ▄▀ ▄ ▀▀▄ \n █▄▄▀▀ ▄ ▀▄ \n █▄▄▄█▄█▄█▄▀ "], ["injured_2", " \n \n \n \n \n ▄▀▀▀▄▄ \n █▄ █▄ ▄▀▄ \n █▄▄█▄▄█▄█▄█ "], ["sleep_1", " \n \n \n \n ▄▄▄ \n ▄▀ ▄▄▀▀▄ \n █▄▄ ▄ ▀▄ \n █▄▄▄█▄█▄█▄▀ "], ["sleep_2", " \n \n \n \n \n ▄▀▀▀▄▄ \n █▄ ▀▀ ▄▀▄ \n █▄▄█▄▄█▄█▄█ "], ["walk_1", " \n \n \n \n ▄▄▄ \n ▄▀▄ ▄▀▀▄ \n █▄▄ ▄ ▀▄ \n █▄▄▄█▄█▄█▄▀ "], ["walk_2", " \n \n \n \n \n ▄▀▀▀▄▄ \n █▄▀ ▀ ▄▀▄ \n █▄▄█▄▄█▄█▄█ "]]], + ["puttimon", [["angry", " ▄ \n ▄▀ █ \n ▄▀ █ ▄▄ \n ▄▀▄█ ▀▄▀ ▀▄ \n █▄ ▄ █▄█ █ \n █ ▀▄▄ ▀ █ ▀▀ \n ▀▄▄▄▄▄▄▀ \n ▄▄▄▄ "], ["attack", " ▄▄▀▀▄ \n ▄▀ ▄▀ ▄▀▀█ \n █▀▄▀ ▀▄▀ █ \n █▄ ▄█▀ █▄▄▀ \n █ ▄▄▄ █ \n ▀▄████ ▄▀ \n ▀▀▀▀▀ \n ▄▄▄ "], ["eat_1", " ▄▀▀█ \n ▄▀ █ ▄▄▄▄ \n ▄▀▄▀ ▀▀▄▀ ▄▀ \n █▀▄ ▄▀▄ █▄▄▀ \n █ ▄▄ █ \n ▀▄ ███ ▄▀ \n ▀▀▀▀▀ \n ▄▄▄ "], ["eat_2", " ▄ \n ▄▀ █ \n ▄▀ █ ▄▄ \n ▄▀▄█ ▀▄▀ ▀▄ \n █▄ ▄ █▄█ █ \n █ ▀ ▀ ▀ █ ▀▀ \n ▀▄██▄▄▄▀ \n ▄▄▄▄ "], ["happy", " ▄▄▄ \n ▄▀ ▄▀ \n █ ▄ ▀▄ ▄▀▀▄ \n ▄█ ▀ ▄ ▀▄ ▄ █ \n █ ▀ ▀ ▀ █▀▀▄█ \n █ █▄▄█ ▄▀ \n ▀████▄▀ \n ▄▄▄ "], ["injured_1", " \n ▄ \n ▄▀ █ \n ▄▀ █ \n ▄▀▄█ ▀▄▀▄ \n █ ▄ ▄ █ █ \n █▀▀ ▀▀ █▄ █ \n ▀▄██▄▄▄▀ ▀▀ "], ["injured_2", " \n \n ▄ \n ▄▀ █ \n █ █▄ ▄ \n ▄▀▀▄█ █ ▀▄ \n █▄▄ ▄▄ ▀▄ ▀▄ \n ▀▄▄▄▄▄▄▄▀▀▀▄█ "], ["sleep_1", " \n \n ▄ \n ▄▀ █ \n █ █▄ ▄▄ \n ▄▀▀▄█ █ ▀▄ \n █▄▄ ▄▄ █ ▀▄ \n ▀▄▄▄▄▄▄▄▀ ▀▀▀ "], ["sleep_2", " \n ▄ \n ▄▀ █ \n ▄▀ █ \n ▄▀▄█ ▀▄▀▀▄ \n █▄▄ ▄▄ █ █ \n █ ▄▄ █▄ █ \n ▀▄▄▄▄▄▄▀ ▀▀ "], ["walk_1", " ▄ \n ▄▀ █ \n ▄▀ █ ▄▄▄▄ \n ▄▀▄█ ▀▄▀ ▄▀ \n █ ▄ ▄ █▄▄▀ \n █ ▀▄▄ ▀ █ \n ▀▄▄▄▄▄▄▀ \n ▄▄▄▄ "], ["walk_2", " ▄▀▄ \n █ █ \n █ ▄ ▀▄ ▄▀▀▄ \n ▄▀ ▀▀ ▀▄ ▄ █ \n █ █ █ █▀▀▄█ \n ▀▄ ▀▀ ▄▀ \n ▀▀▀▀▀▀ \n ▄▄▄▄ "]]], + ["puyomon", [["angry", " \n \n ▄▄▄ ▄▄▄ \n ▀▄ ▀▀▀▀ ▄▀ \n █ ▄█▀█▄ █ \n █ █▄▄██ █ \n ▀▄ ▀▀▀ ▄▀ \n █▄▄▀▄▄▀▄▄█ "], ["attack", " ▄▄ ▄▄ \n █ ▀▄▄▄▄▀ █ \n ▄▀ ▄▄▄ ▀▄ \n █ █▀ ██ █ \n █ ▀███▀ █ \n▄█▄ █ ▄ ▄ █ \n ▀▄▀▀ █▀ ▀▀ \n ▀▀▀ "], ["eat_1", " \n █▀▀▄▄▄▄▀▀█ \n ▄▀ ▄▄▄ ▀▄ \n █ █ ▄██ █ \n █ ▀██▄▀ █ \n▄█▄ █ ▄ ▄ █ \n ▀▄▀▀ █▀ ▀▀ \n ▀▀▀ "], ["eat_2", " \n \n ▄▄▄ ▄▄▄ \n ▀▄ ▀▀▀▀ ▄▀ \n █ ▄█▀█▄ █ \n █ █▄█▄█ █ \n ▀▄ ▀▀▀ ▄▀ \n █▄▄▀▄▄▀▄▄█ "], ["happy", " \n █▀▀▄▄▄▄▀▀█ \n ▄▀ ▄▄▄ ▀▄ \n █ █▀▄▀█ █ \n █ ▀███▀ █ \n █ ▄ ▄ █ \n █▄▀▄▄▀▄█ \n "], ["injured_1", " \n \n \n ▄▀█▀▀▀▀▀▀▀▀▄ \n ▀█ ▄▀██▄ █▀ \n █ █▄▄██ █ \n ▀▄ ▀▀▀ ▄▀ \n ▀▄▄█▄▄█▄▄▀ "], ["injured_2", " \n \n \n ▄▄▄▄▄▄▄▄▄▄ \n █▄▀ ▄▄▄ ▄█ \n █ █ ▀██ █ \n ▀▄▀███▀ ▄▀ \n ▀▄█▄▄▄█▄▄▀ "], ["sleep_1", " \n \n \n █▀▀▄▄▄▄▀▀█ \n ▄▀ ▄▄▄ ▀▄ \n █ █▀▀▀█ █ \n ▀▄▀███▀ ▄▀ \n ▀▄█▄▄▄█▄▄▀ "], ["sleep_2", " \n \n ▄▄▄ ▄▄▄ \n ▀▄ ▀▀▀▀ ▄▀ \n █ ▄███▄ █ \n █ █▄▄▄█ █ \n ▀▄ ▀▀▀ ▄▀ \n ▀▄▄█▄▄█▄▄▀ "], ["walk_1", " \n \n █▀▀▄▄▄▄▀▀█ \n ▄▀ ▄▄▄ ▀▄ \n █ █ ▄██ █ \n █ ▀██▄▀ █ \n ▄▀ ▄ ▄ ▀▄ \n ▀▀▀ ▀▀ ▀▀▀ "], ["walk_2", " \n █▀▀▄▄▄▄▀▀█ \n ▄▀ ▄▄▄ ▀▄ \n █ █ ▄██ █ \n █ ▀██▄▀ █ \n █ ▄ ▄ █ \n █▄▀▄▄▀▄█ \n "]]], + ["pyonmon", [["angry", " \n \n ▄▀▀▀▄ \n █ █ \n ▄▀▀▀ ▄▀▄▄ \n █▄▄ ▄▀▄ ▄▄ █ \n █ █▄ ▄█ █▄▄ \n ▀▄▄▄█▄▄▄▄█▄▀ "], ["attack", " ▄▀▀▀▄ \n █ ▄▀ \n ▄▄█ ▀▄▄ \n ▄▀ ▄ ▀ ▀▄ \n ▀█▀▄▀ ▀▄▀▀▄▀ \n █ ▀▀▄▀▀ █ \n █ ███ █▀█ \n ▀▄▄▄▄▄▄▀▀▀ "], ["eat_1", " \n ▄▄▄ \n ▄▀ █ \n ▄▀▀▀ ▄▀▀▄ \n █▄▄ ▄▀▄ ▄▄ █ \n █ ▀ ▄ ▀ █ \n █ ███ █▄ \n ▀▄▄▄▄▄▄█▄▀ "], ["eat_2", " \n \n ▄▄▄ \n ▄▀ █ \n ▄▀▀▀ ▄▀▀▄ \n █▄▄ ▄▀▄ ▄▄ █ \n █▄▀▄ ▄▀▄ █▄▄ \n ▀▄▄▄█▄▄▄▄█▄▀ "], ["happy", " ▄▄▄ \n ▄▀ █ \n ▄▀▀▀ ▄▀▀▄ \n █▄▄ ▄▀▄ ▄▄ █ \n █ ▀ ▄ ▀ █ \n █ ▀███▀ █ \n ▀▄▄▄▄▄▄▀▄█ \n ▄▄▄▄▄▄ "], ["injured_1", " \n \n \n ▄▀▀▀▀▀▄ \n ▄▀▀▀ ▄▀▀▄█ \n █ ▄ █ \n ▀█▀▄▀ ▀▄▀▀▄█ \n ▀▄▄▄█▄▄▄▄█▄█ "], ["injured_2", " \n \n \n ▄▄▄▄▄ \n ▄▄█ ▄▄▀▄ \n ▄▀ ▀ ▀█ \n █▄▄ ▄▀▄ ▄▄ █ \n ▀▄▄▄█▄▄▄█▄▄█▄█"], ["sleep_1", " \n \n ▄▄▄ \n ▄▀ █ \n ▄▀▀▀ ▄▀▀▄ \n █ ▄ █ \n ▀█▀▄▀ ▀▄▀▀▄█▄ \n ▀▄▄▄█▄▄▄▄█▄▀ "], ["sleep_2", " \n \n ▄▀▀▀▄ \n ▄▄█ ▄█ \n ▄▀ ▀ ▀▄ \n █▄▄ ▄▀▄ ▄▄ █ \n █ ▀ ▄ ▀ █▄ \n ▀▄▄▄▄▄▄█▄▀ "], ["walk_1", " \n \n ▄▀▀▀▄ \n ▄▄█ ▄█ \n ▄▀ ▄ ▀ ▀▄ \n ▀█▀▄▀ ▀▄▀▀▄▀ \n █ ▄▀▄ █▄ \n ▀▄▄▄▄▄▄█▄▀ "], ["walk_2", " \n \n ▄▀▀▀▄ \n █ █ \n ▄▀▀▀ ▄▀▄▄ \n █▄▄ ▄▀▄ ▄▄ █ \n █ ▀ ▄ ▀ █▄▄ \n ▀▄▄█▄█▄▄▄█▄▀ "]]], + ["rafflesimon", [["angry", " ▄▄ ▄▄▄ ▄▄▄ \n▄▀ █ █ ▀▄ \n█▀▄█ ▀▀▀ █▄▀▀█ \n ▀▄▄▀▄▄▄▀▄▄▄█▄▄ \n▄██▄ ▄██▀███\n▀█ ▄█▀█▀▀▄▄ █ ▀\n █▄▄█▀ ▀▀█▄▄███▄\n█▄▄▄█▄▄▄█▄▄▄██▀▀"], ["attack", " ▄▄▀█▄▀▀█▄▄ \n ▄▀ █▄▄█ ▄▀ \n █ ▄▀ ▄▀▀▀█ \n█▀▄█▀ ▀▄▄█▄▄█▄ \n█▀▀▀█▄▄▄▄▄█████▄\n█▀▄▄▄▄▀ ███▄▄ ▀▀\n▀▀ ▄▀▀▄ █▀▀██▄ \n █▄▄▄█▀▀▄▄▄▄███"], ["eat_1", " ▄▀▀▄▀▀▀▄▀▀▀▄ \n█▄ ▄▀▄▄▄▀▄ ▄▄█ \n▀▄▀▀▄ ▄▀▀ ▄▀ \n █▀ ▀▀▀ ▀█▀▀██▄\n▄███ ███ █▀ ███\n█ ▄█▄▄▄██▄▄██ \n ▀█▀▀▄ ▄▀█████▄\n █▄▄▄█▀▀▄▄▄▄█▀▀▀"], ["eat_2", " ▄▄ ▄▄▄ ▄▄▄ \n▄▀ █ █ ▀▄ \n█▀▄█ ▀▀▀ █▄▀▀█ \n ▀▄▄▀▄▄▄▀▄▄▄█▄▄ \n▄██▄ ▄██▀███\n▀█ ▀█▀██▀ █▄ ▀\n ▄█▄▄▀ ▀▄▄████▄▄\n█▄▄▄█▄▄▄█▄▄▄██▀▀"], ["happy", " ▄▀▀▄▀▀▀▄▀▀▀▄ \n█▄ ▄▀▄▄▄▀▄ ▄▄█ \n▀▄▀▀▄ ▄▀▀ ▄▀ \n▄▀█▀ ▀▀▀ ▀█▀███▄\n█ ▀█ ███ █▀ ██▀█\n ▀▄▄█▄▄▄█▄▄██▄ \n ▄▀▀▄ ▄▀▀████▄\n █▄▄▄█▀▀▄▄▄▄█▀▀▀"], ["injured_1", " \n ▄▄▄▀▀▀▄▄▄ \n▄▀▄▄▀▄▄▄▀▄▄▀▄ \n█▀ █ █ ▀█ \n▀██▀▀▄▄▄▀▀█████▄\n█▀█▀▄▄▄▄▄█ ▀▄▀▀█\n ▄█ ▀▄▀▄█▀ █▄ \n██▄█▄█▄▄█▄▄████▄"], ["injured_2", " \n ▄▄▄ \n ▄▀▀█ █▀▀▄ \n█▄▀█ ▀▀▀ █▀▄█ \n█▄▄█▄ ▄█▄▄█▄▄ \n▄██▄ ▀▀▀ ▄▀█▀███\n▀█ █▀█▀█▀█ █▄ ▀\n██▄▄█▄▄▄█▄▄████▄"], ["sleep_1", " \n ▄▄ ▄▄▄ ▄▄▄ \n▄▀ █ █ ▀▄ \n█▀▄█ ▀▀▀ █▄▀▀█ \n ▀▄▄▀▄▄▄▀▄▄▄█▄▄ \n▄██▄ ▄██▀███\n██ ▀██▀██ █▀▄ ▀\n██▄▄█▄▄▄█▄▄█▄█ "], ["sleep_2", " \n ▄▀▀▄▀▀▀▄▀▀▀▄ \n█▄ ▄▀▄▄▄▀▄ ▄▄█ \n▀▄▀▀▄ ▄▀▀ ▄▀ \n ▄█▀ ▀▀▀ ▀█████▄\n█▀██▄▄▄▄▄██▀▄▀▀█\n▄█ ▀▄▄▀▄█ █ █ \n▀█▄▄█▄▄▄█▄▄█▀▀ "], ["walk_1", " ▄▀▀▄▀▀▀▄▀▀▀▄ \n█▄ ▄▀▄▄▄▀▄ ▄▄█ \n▀▄▀▀▄ ▄▀▀ ▄▀ \n ▄█▀ ▀▀▀ ▀█████▄\n█▀▀█▄▄▄▄▄▀▀█▄▀▀█\n▄▀▀ █▄▀▄▄█ ▀▄ \n█▄▄▀▀▄ ▄▀█▄▄██▄\n █▄▄▄█▀▀▄▄▄▄█▀▀▀"], ["walk_2", " ▄▄ ▄▄▄ ▄▄▄ \n▄▀ █ █ ▀▄ \n█▀▄█ ▀▀▀ █▄▀▀█ \n ▀▄▄▀▄▄▄▀▄▄▄█▄▄ \n▄██▄ ▄██▀███\n▀▄▄▀█▀█▀▀▄ ▀▀▄ ▀\n█▄▄▄█▀ ▀▀█▄▄ █▄\n█▄▄▄█▄▄▄█▄▄▄██▀▀"]]], + ["ragnaloardmon", [["angry", " █▀▄▄▀█▄▀▀█▀▄ ▄▄\n ▀▄ █ ▀ ▄██ █ █\n█▄▄█ ▄▀██▀▀ ▀█\n█▄ ▀██▄▄▀█▄ █▄ █\n▄▀▀█▀▀▀▀▄█▄ ▀ █\n▀▄▄██▀▀▀▄█▄▀▄ █ \n ▄▀ ▀█▄█▀ ▀▄▀▀ \n █▄█▄█▀ ▀█▄█▄█ "], ["attack", " █▀▄ ▄▀█▄▀▀▀█ \n ▀▄ █▀ ▀ ▄▄▀▄ ▄▄\n▄ ▀█ ▄▀█ █ █ █\n█▀▀▄▀▀▀▀▄█▀▀ ▀█\n▀█▄█▀▀▀▀▀▀▄ █▄ █\n█ ▄█▀▄██▄█▄ ▀ █\n▀▀▄▀▀ █▄█ ▀▄ ▄▀\n █▄█▄█▀ ▀█▄█▄█▀ "], ["eat_1", " ▄▄ ▄▄ ▄▄▄▄ \n █ ▀▄█ █▀ ▄▀ \n █▄▀ ▄▄▀█ ▀▄▀█\n█▄▄▀▄▄▀▄▀██▄ ▀▄█\n▀▄ █▀▀▀▀▀█ ▄ █\n▄▀▀██▀▀▀▀█▀ ▀█ █\n▀▄▄█▀▀█▀█▀▀▄ █\n █▄█▄▀▀▀▀▀▄▄█▄█ "], ["eat_2", " █▀▄ ▄▀█▄▀▀█ \n ▀▄ █ ▀ ▄█ ▀▄▀█\n█▄▄█ ▄▀█▄█▄ ▀▄█\n█▄ ▀██▄█▄█ ▄ █\n▄▀▀▄████ █▀ ▀█ █\n▀▄▄█▀▄▄▄█▄█▄ █\n ▄▀▀ █▄█ ▀█▄█ \n █▄█▄█▀ ▀█▄█▄█ "], ["happy", " █▀▄ ▄▀█▄▀█▀▄ ▄▄\n ▀▄ █ ▀ ▄█ █ █\n▄ █ ▄▀█▄▀▀ ▀█\n█▀▀▄██▄█▄█▄ █▄ █\n▀█▄█▀▀▀▀▄█▄ ▀ █\n█ ▄█▀▀▀▀▀▄█▀▄ █ \n▀▀▄▀██▀██▀ ▀▄▀▀ \n █▄█▄█▀ ▀█▄█▄█ "], ["injured_1", " \n █▀▄ ▄▀█▄▀▀█ \n ▀▄ █ ▄▀ █ ▀▄▀█\n▄ ▀█ ▄█▀█▄ ▀▄█\n█▀▀▄▀▄█▀ █▄ ▄ █\n▄█▄█▀▄▄▄▀ █ ▀█ █\n█ ██▄▄▄▄▀▀█ ▄▀\n█▄▀█▄▄█▄█▄▄▄█▄█ "], ["injured_2", " \n▄▄ ▄▄ ▄▄▄▄ \n█ ▀▄▀ █▀ ▄█ ▀▄▀█\n▄▀▄▀ ▀ ▄▄██▄ ▀▄█\n█▀█▄ ▄█▀▄█▄ ▄ █\n▄██▄▀▀ ▄▀ █ ▀█ █\n█ ████▄▄▀▀█ ▄▀\n█▄▀█▄▄█▄█▄▄▄█▄█ "], ["refuse", " ▄▄ ▄▄ ▄▄▄▄ \n █ ▀▄█ █▀ ▄▀ \n █▄▀ ▄▀██ ▀▄▀█\n█▄▄▀▄▄█▄▄▀█▄ ▀▄█\n▀▄ █▄▄▄▄▄█ ▄ █\n▄▀▀█▄ ▄▄ ▄▀ ▀█ █\n▀▄▄█▀▀█▀█▀▀▄ █\n█▄█▄▄▀▀▀▀▀█▄█▄█ "], ["sleep_1", " ▄ ▄▄ ▄▄▄▄ \n █▀▄▀ █▀ ▄▄▀ \n ▀▄▀ ▄ █ ▀▄▀█\n█▄▄▀▄▄██▀▄█▄ ▀▄█\n█▄ █▄▄▄▄██ ▄ █\n▄▀▀█ ▄▄ ▄█▀ ▀█ █\n█▄█▀▀█▀▀█▀▀▄ ▄▀\n █▄█▄▄██▄▄█▄█▄█ "], ["sleep_2", " \n █▄ ▄▀█▄▀███ \n █ █ ▀ █ ▀▄▀█\n█▄▄█ ▄▄█ █▄ ▀▄█\n█▄ █▀▀▀▀▄█ ▄ █\n▄▀▀█▀██▀▄█▀ ▀█ █\n█▄█▀▀█▀▀█▀▀▄ ▄▀\n █▄█▄▄██▄▄█▄█▄█ "], ["walk_1", " █▀▄ ▄▀█▄▀▀▀█ \n ▀▄ █▀ ▀ ▄▄▀▄ ▄▄\n▄ ▀█ ▄▀█ █ █ █\n█▀▀▄▀▀▀▀▄█▀▀ ▀█\n▀█▄█▀▀▀▀▀▀▄ █▄ █\n█ ▄█▀▄██▄█▄ ▀ █\n▀▀▄▀▀ █▄█ ▀▄ ▄▀\n █▄█▄█▀ ▀█▄█▄█▀ "], ["walk_2", " ▄▄ ▄▄ ▄▄▄▄ \n █ ▀▄█ █▀ ▄▀ \n █▄▀ ▄▄▀█ ▀▄▀█\n█▄▄▀▄▄█▄▀▄█▄ ▀▄█\n█▄ █▄▄▄▄██ ▄ █\n█ █▀▄ ▄▄ ▄▀ ▀█ █\n▀▀▄▀▀▀█▀█▀▀▄ █\n █▄█▄▀▀▀▀▀▄▄█▄█ "]]], + ["raguelmon", [["angry", " ▄▄▄▄ ▄▄▄▄▄ \n ▄▀ ▄▄▀ ▄█▄ \n █ █▄▀ ▄ ▄▀ \n ▀█▀ ▀▀▄▀ █▄ \n ▀▄▄▄▄▀▀▄▄▀█▀█ \n ▄▀█▄▄▄▄█▀ ███▄\n █▄█▄▀▄▀█▄▄█ ██▄\n█▄██▀▀▀▀█▄█▄█ ▀█"], ["attack", " ▄▀▀▀▀▄▀▀▀█▀ \n █ ▄▄█▀▄█ ▀▀█ \n █▄▀▄▄▄ █▄ \n█ ██▀▀█ ▄█ █▄ \n ▀▄█▀▀▀▀▄█▀▄███▀\n █▀█▀▀▀███▀██▄\n ▄▄██▄█▄▄▄█▄▄ ▀█\n█▄██▀ ▀█▄█▄█ "], ["eat_1", " ▄▀▀▀▀▄▀▀▀█▀ \n █ ▄ █▀ ▄ ▀▀█ \n █▄█▀ ▀ ▀▄▀▄ \n ▀▄████ █ ▄██▄ \n ▄▄▀█▀▀▀▄██ ▀▄█ \n█ ▄▀█▀▀██ ▄██▀\n ▀███▄█▄███▀▀▀██\n █▄██ ▀█▄█▄█ ▀"], ["eat_2", " ▄▄▄▄ ▄▄▄▄▄ \n ▄▀ ▄▄▀ ▄█▄ \n █ █▄▀ ▄ ▄▀ \n ▀█▀ ▀ ▀▄▀ █▄ \n ▀▄▄▄▄▀▀▄▄▀█▀█ \n ▄▀█▄▄▄▄█▀ ███▄\n █▄█▄▀▄▀█▄▄█ ██▄\n█▄██▀▀▀▀█▄█▄█ ▀█"], ["happy", " ▄▀▀▀▀▄▀▀▀█▀ \n █ ▄ █▀ ▄ ▀▀█ \n █▄█▀ ▀ ▀▄█▄ \n█ ▀▄████ ▄▀ █▄ \n █ ██▀▀▀▄█ ▄███ \n ▀█▀█▀▀▀██▀▀██▀\n ▄██▄█▄▄▄██ ▀██\n █▄██ ▀█▄█▄█ ▀"], ["injured_1", " \n ▄▀▀▀▀▄▀▀▀█▀ \n █ ▄ █▀ ▀▀█ \n █▄█▀ █▄ ▄▀▄▄ \n █ ▄▄▀ ▄█▀█ \n ▄▄█▀▀▀ ▄█▀████▄\n█▄▄█▀█▀▀█▄▄▀▀██▄\n█▄▄██▄█▄█▄▄█▄ ▀█"], ["injured_2", " \n ▄▄▄▄ ▄▄▄▄▄ \n ▄▀ ▄▄▀ ▄█▄ \n █ █▄▀▄ ▄▀▄ \n ▀█▀ ▀▀ ▄▀ █▀█ \n █▄▄▄▄▀▀▄▄████▄\n █▄█▄▄▄▄█▄▄████▄\n █▄▄█▄█▄█▄▄█ ▀█"], ["sleep_1", " \n ▄▄▄▄ ▄▄▄▄▄ \n▄▀ ▄▄▀ ▄█▄ \n█ █▄▀ ▄▀▄▄ \n▀█▀ ▀▀ ▄▀ ██▀█ \n ▀▄▄▄▄▀▀▄▄█████▄\n▄▀█▄▄▄▄██▀▀█▀██▄\n█▄▄█▄█▄█▄▄▄▄█ ▀█"], ["sleep_2", " \n ▄▀▀▀▀▄▀▀▀█▀ \n █ ▄ █▀ ▀▀█ \n █▄█▀ ▄▄ ▄▀▄▄ \n █ ▄▄▀ ▄█▀█ \n ▄█▀▀▀ ▄█▀▀███▄\n█▀▄█▀█▀██▀▀█▀██▄\n█▄▄█████▄▄▄▄█ ▀█"], ["walk_1", " ▄▀▀▀▀▄▀▀▀█▀ \n █ ▄ █▀ ▀▀█ \n █▄█▀ ▄█▀ ▄▀▄ \n █ ▄▄▀ ▄██▄ \n █▀▀▀ ▄█▀██▄█ \n ▄▀█▀█▀▀█▀ █▀██▀\n ▀▄██▄█▄█▄▄▀ ▀██\n █▄██ ▀█▄█▄█ ▀"], ["walk_2", " ▄▄▄▄ ▄▄▄▄▄ \n ▄▀ ▄▄▀ ▄█▄ \n █ █▄▀ ▄▄ ▄▀ \n ▀█▀ ▀▀ ▄▀ █▄ \n ▀▄▄▄▄▀▀▄▄██▀█ \n ▄█▄▄▄▄██ ████▄\n █▄█▄█▄ █▄▄█ ██▄\n█▄██▀▀▀▀█▄█▄█ ▀█"]]], + ["raijiludomon", [["angry", " ▄ ▄▄ ▄▄ \n █▀█ █▄█▀ █ \n █ █ ▀ ▄█ ▄▄ \n █▄ ▄█ █▀ █▄ \n █▄ ▄██▄ █ \n ▄█ ▀██▀ ▄█▀▄█▄\n▄▀█▀▄ ▄▄█▀▄▀▄ █\n▀█▄▄▄█▄█▄▄▄█▀▄▄█"], ["attack", "█▀▄ ▄ ▄▄ ▄▄ ▄▄▀█\n█ ▀█ █ █▀ █▀ ▄▀ \n █▄█▄ ▄█▄▄█▄ \n█ █▄ ▀▀▀ ▄▄█ ▀▄\n▀▄█▄▀▄▄█▀ ▄█▄▄▀ \n █ ▀▄ ▀ ▄▀▀ █ \n ▀█▀█▀▀█▀▀█▀ \n ▀▄▄▀▀▄▄▀ "], ["eat_1", " █▄▄▀█ ▄▄▀█ \n █ █ █▀▀ ▄▀▄▄ \n ▀▄▀ ▄ ▀█▀ █▄ \n ▄▀▀ ▀ ▀ █ █ \n▄▀█▄███▄▀▀█▀▀▀▄ \n█ █▄▀▀▀ ▄█▄ ▄▀ \n ▀█▀█▄▀▀▄▀▄▀▀ \n █▄▄▄▀▀▀▄▄▄█ "], ["eat_2", " ▄ ▄▄ ▄▄ \n █▀█ █▄█▀ █ \n █ █ ▀ ▄█ ▄▄ \n █▄ ▄▀▄ █▀ █▄ \n █▄ ▄██▄ █ \n ▄█ ▀██▀ ▄▀█▄█ \n▄▀█▀▄ ▄▄█▀█▄ █ \n▀█▄▄▄█▄█▄▄▄█▀▀▀ "], ["happy", " █▄▄▀█ ▄▄▀█ \n █ █ █▀▀ ▄▀ \n ▄▀▄ ▄▀▄▀█▄ ▄▄ \n█▀█ ▄▄▄▄ ▄█▄▀ █\n█ █▀████▀▀█ ▄█ \n ▀█▄ ▀▀ ▄█▀█▀ █ \n █▀█▄▀▀▄▀▄ ▀▀▀ \n █▄▄▄▀▀▀▄▄▄█ "], ["injured_1", " ▄ ▄▄ ▄▄ \n █▀█ █▄█▀ █ \n █ ▀ ▀ ▄█ ▄▄ \n █▄▀ ▀▄▄ █▀ █▄ \n ██▄ ▄▄ ▄██▄ █ \n▄██ ▀██▀▄▄▄█▀▄█▄\n█ ▀█▄ ▄█ ▀█▄ █\n█▄▄▄██▄█▄▄▄██▀▄█"], ["injured_2", " \n █▄▄▀█ ▄▄▀█ \n █ █ █▀▀ ▄▀ \n █ ▄ ▄ ▀█▄▀█▄ \n █▀ ▀▀▄█ ▀▄ \n███▄▄▄▄█▄██▄▄▄█ \n█ ▀▄▀▀ █ ▀█▄ █\n█▄▄▄█▄██▄▄▄██▀▄█"], ["sleep_1", " \n █▄▄▀█ ▄▄▀█ \n █ █ █▀▀ ▄▀ \n ▀▄▀ ▀█▄▀█ \n ▄▀▀ ▀▀ ▄▀▄ ▀█ \n █▀▄▄▄▄▀▀ █▄▄▀▄▄\n▄█▀▀▄ ▄▄█▀▀█▄ █\n▀█▄▄▄█▄█▄▄▄█▀▄▄█"], ["sleep_2", " ▄ ▄▄ ▄▄ \n █▀█ █▄█▀ █ \n █ █ ▀ ▄█ ▄▄ \n █▄ ▄▄ █▀ █▄ \n █▄ ▄██▄ █ \n ▄█ ▀██▀ ▄█▀▄█▄\n▄█▀▀▄ ▄▄█▀▀█▄ █\n▀█▄▄▄█▄█▄▄▄█▀▄▄█"], ["walk_1", " █▄▄▀█ ▄▄▀█ \n █ █ █▀▀ ▄▀ \n ▀▄▀ ▄▄▀█▄▀█ \n ▄▀▀ ▀▀ ▄█ ▀█ \n █▀▄▄▄▄▀▀▀█▄ █ \n ██▄ ▀▀ ▄▄▀█ ▀▀█\n█▀▄▀█▄▀▀▄▀▄ █ █\n █▄▄▄▀▀▀▄▄▄█ ▀▀▀"], ["walk_2", " ▄ ▄▄ ▄▄ \n █▀█ █▄█▀ █ \n █ █ ▀ ▄█ ▄▄ \n █▄ ▄█▀ █▀ ▀█ \n ▄█▄ ▄██▄▄ █\n███ ▀██▀ ▄█ ▀▀█\n▀▄▀█▄ ▄▄▀█▀▄▀▄▄█\n█▄▄▄▀█▄▄▀▄▄▄█ "]]], + ["rapidmon", [["angry", " ▄▄▄▄▄\n ▄▄ ▄▀▀ ▄▄▄▀\n ▀▄▀█▀▀▀▄▀▀▀▄▄▄▀\n █ ▄█ ██▀▄ \n ▄█▄▄▄▄██▄ █ \n █ █ █ ▀█ \n █▀▄ ▀█▀▀▄ \n █▄▄▄█▀▀▀█▄▄▄█ "], ["attack", " ▄▄▀▀▀▀█\n █▀▄▄▄▄▄▀▄▄▄▀▀▀▄\n ▀▄▀ ▄▄▀▄▄▄▀▀▀ \n █ ▀▀ ▄▀▀ ▀▄ \n▄▀▀▀█▀█▀▀▀▀▀▄▀ \n▀▄▄▀█ ▀▄▄▄▀█ \n ▄▀▄▄▄▄▄▀▀▄ \n █▄▄▄█ █▄▄▄█ "], ["eat_1", " ▄▄▀▀▀▀█\n █▀▄▄▄▄▄▀▄▄▄▀▀▀▄\n ▀▄▀ ▄ ▀▄▄▄▀▀▀ \n █ ▀ ▀▄█▀ ▀▄ \n ▄▄▄███▀ █▄▄▄█ \n█ ██▄▄▄█ ▄▀ \n ▀▀█▀▄▄▄▄▀▀█ \n █▄▄▄█ █▄▄▄█ "], ["eat_2", " ▄▄▄▄▄\n ▄▄ ▄▀▀ ▄▄▄▀\n ▀▄▀█▀▀▀▄▀▀▀▄▄▄▀\n █ ▄▀▄ ██▀▄ \n ▀▄▄▄▄▀█ █ \n ▄▀█ █▀▀▀▀█ \n ▀▄▀▄ ▀▄▄▄▀▄ \n █▄▄▄█▀▀▀█▄▄▄█ "], ["happy", " ▄▄▀▀▀▀█\n █▀▄▄▄▄▄▀▄▄▄▀▀▀▄\n ▀▄▀ ▄ ▀▄▄▄██▀ \n █ ▀ ▀▄█▀█ █ \n▄▀▀▄███▀▄█▀ ▄▀ \n▀▄▄▄█▄▄▀▀▀█▀▀ \n ▄▀▄▄▄▄▀▀▄ \n █▄▄▄█ █▄▄▄█ "], ["injured_1", " \n \n █▀▄▄▄▄▄▀▀▀▄▄ \n ▀▄▀▄ ▀█▄▄ ▀▄ \n █ ▀▀ ▄█▀ ▀▄▄▀\n ▄▀█▀▀▀█▄█▄▄▄█▄▀\n ▀▄▀▄ █ ▄█ \n █▄▄▄█▄▄███▄▄█ "], ["injured_2", " \n \n▄▄ ▄▄▄ \n▀▄▀█▀▀▀▄▄ ▀▀▄ \n █ █▄ ███▀▄▀▄ \n ▄▀▄▄▄▄▀▄█ █▄ \n ▀▄▀▄ █ ▀██▀ \n █▄▄▄█▄▄███▄▄█ "], ["sleep_1", " \n ▄▄▄▄▄ \n▄▄ ▄▀▀ ▄▄▄▀ \n▀▄▀█▀▀▀▄▄▀▀▄▄▄▀ \n █ ▄▄ ██▀ ▀▄ \n ▄▀▄▄▄▄▀▄█▄▄▄▀ \n ▀▄▀▄ █ ▄█ \n █▄▄▄█▄▄███▄▄█ "], ["sleep_2", " \n ▄▄▀▀▀▀█\n █▀▄▄▄▄▄▀▄▄▄▀▀▀▄\n ▀▄▀ ▀▄▄▄▀▀▀ \n █ ▀▀ ▄█▀ ▀▄ \n ▄▀█▀▀▀█▄█▄▄▄▀ \n ▀▄▀▄ █ ▄█ \n █▄▄▄█▄▄███▄▄█ "], ["walk_1", " ▄▄▀▀▀▀█\n █▀▄▄▄▄▄▀▄▄▄▀▀▀▄\n ▀▄▀ ▄▄▀▄▄▄▀▀▀ \n █ ▀▀ ▄█▀ ▀▄ \n ▄▄▀▀▀█▄█▄▄▄▀ \n █ █ █ ▄▀ \n ▀█▀▄▄▄█▀▀▄ \n █▄▄▄█ █▄▄▄█ "], ["walk_2", " ▄▄▄▄▄\n ▄▄ ▄▀▀ ▄▄▄▀\n ▀▄▀█▀▀▀▄▀▀▀▄▄▄▀\n █ ▄█▀ ██▀▄ \n ▀▄▄▄▄▀█ █ \n ▄▀█ █▀▀▀▀█ \n ▀▄▀▄ ▀▄▄▄▀▄ \n █▄▄▄█▀▀▀█▄▄▄█ "]]], + ["rapidmon_x", [["angry", " ▄▄▄ \n █▀▄▄▄▄▀ ▄▀▀▀▀█ \n ▀▄▀ ▄▄▄▄▀▀▀ \n ▀▄▄█▄▀ █▀▀▄ \n ▄▀▀▄▄▄▄▄▀▀▀▀█ \n ▀▄█ ▄█▄▄▄█▄ \n ▄▀█▀▀ ▄▀▀▄▄▀ \n █▄▄▄█▀█▄▄▄▄█ "], ["attack", " ▄▄ ▄▀▀█▄▄▄▄\n ▀▄▀█▀▀ ▀ ▄▄▄▀\n █ ▄▀█▀█▄▄ \n ▄▄▄▄█▀▀█▄▄▀▄▄▀▄\n█▄ ▀█▄ ▄█▀\n▀▄▄▄▄▀█▀▄▄▄▄█ ▀█\n ▄▀█▄▄█▄▀▄▄▀ \n █▄▄▄█ █▄▄▄█ "], ["eat_1", " ▄▄ ▄▀▀█▄▄▄▄ \n ▀▄▀█▀▀▄ ▀ ▄▄▄▀ \n █ ▀ ▀ █▄▄ \n ▀███▀▄▀ ▀▄ \n ▄▄█▀▀▄██▄▄▄▀ \n █ ▀████ ▄▀█ \n █▀█▄▄█▀▀█▄▀ \n █▄▄▄█ █▄▄▄█ "], ["eat_2", " ▄▄▄ \n █▀▄▄▄▄▀ ▄▀▀▀▀█ \n ▀▄▀ ▄▀▄ ▄▀▀▀ \n ▀▄▄▄▄▄▀█▀▀▄ \n ▀▄▄▄▄▀▄ █ \n ▄▀█ ▄▀▀▀▀█▄ \n ▀█▀█▀▀█▄▄▄▀▄▀ \n █▄▄▄█▀▀▄▄▄█ "], ["happy", " ▄▄ ▄▀▀█▄▄▄▄ \n ▀▄▀█▀▀▄ ▀ ▄▄▄▀ \n █ ▀ ▀ ▄█▄ \n ▀███▀▄█ █ \n ▄▄█▄▄▀█ ▄▀ \n █ █▄▄▄██▄▀▀▀█ \n █▀█▄▄█ ▀█▄▀ \n █▄▄▄█ █▄▄▄█ "], ["injured_1", " \n ▄▄▄ \n █▀▄▄▄▄▀ ▄▀▀▀▀█ \n ▀▄▀ ▄▄▄▀▀▀ \n ▀▄▄▄██ █▀▄ \n ▄▄█▄▄▄▀▀▄▄▄█▄ \n █ ▀ █▄▄▄█ ▀ █ \n █▄▄▄█▄▄▄█▄▄▄▄██"], ["injured_2", " \n \n▄▄ ▄▀▀█▄▄▄▄ \n▀▄▀█▀▀ ▀ ▄▄▄▀ \n █ ▄█▀█▄▄ \n ▄██▀▀█▄▀▄▄█▄▄ \n █ ▀ ██▄▄█ ▀ █ \n █▄▄▄█▄▄▄█▄▄▄▄██"], ["sleep_1", " \n ▄▄▄ \n █▀▄▄▄▄▀ ▄▀▀▀▀█ \n ▀▄▀ ▄▄▄▄▀▀▀ \n ▀▄▄▀▀▀ █▀▀▄ \n ▄▄█▄▄▄▀▀▄▄▄▄█ \n █ ▀ █▄▄▄█ ▀ █ \n █▄▄▄█▄▄▄█▄▄▄▄██"], ["sleep_2", " \n ▄▄ ▄▀▀█▄▄▄▄ \n ▀▄▀█▀▀ ▀ ▄▄▄▀ \n █ ▄██▀█▄▄ \n █▀ ▄▄▀ ▀▄ \n ▄▄▄▀▀▀ █▄▄▄▀ \n █ ▀ █▄▄▄█ ▀ █ \n █▄▄▄█▄▄▄█▄▄▄▄██"], ["walk_1", " ▄▄ ▄▀▀█▄▄▄▄ \n ▀▄▀█▀▀ ▀ ▄▄▄▀ \n █ ▄▀█▀█▄▄ \n █▀▀▀▄▄▀ ▀▄ \n ▄▄▀▀▀ ▄█▄▄▄▀ \n █ ▀▄▄▄█ ▄▀█ \n █▀█▄▄█▀▀█▄▀ \n █▄▄▄█ █▄▄▄█ "], ["walk_2", " ▄▄▄ \n █▀▄▄▄▄▀ ▄▀▀▀▀█ \n ▀▄▀ ▄▄▄▄▀▀▀ \n ▀▄▄█▄▀ █▀▀▄ \n ▀▄▄▄▀▀▄ █ \n ▄▀█ ▄▀▀▀▀█▄ \n █▄▀█▀▀█▄▄▄▀▄▀ \n █▄▄▄█▀▀▀█▄▄▄█ "]]], + ["raremon", [["angry", " ▄▀▀▀▄▀▀▀▀▄ \n▄▀█▄ ▀ ▄█ █ \n█ ▀ ▀▀ █ \n█ ██ █ ██ ▄ █ \n▀▄▀███ ██ █ ▀▄ \n █ █ ▀▀█▀█▀▄ █ \n█ ▄ ▄ ▄ █ ▀▄ \n█▄█▄█▄▄█▄█▄▄█▄█ "], ["attack", " ▄▄▄▄ \n ▄▄▀▀█ ▄ █ \n █ ▄▄ ▄▀█ █ \n ▀▄▀▄█ ▀▀ ▄ ▀▄ \n █ ▀ █ ▀ █ \n █ ▄ █ █ ▀▄ █ \n █▄▀ ▄█ █▄▀▄█ \n█▄█▄█▄█▄█▄█▄▄▄█ "], ["eat_1", " ▄▄▄▄ \n ▄▄▀▀█ ▄ █ \n █ ▄▄ ▄▀█ █ \n ▀▄▀▄█ ▀▀ ▄ ▀▄ \n █ ▀ █ ▀ █ \n █ ▄ █ █ ▀▄ █ \n █▄▀ ▄█ █▄▀▄█ \n█▄█▄█▄█▄█▄█▄▄▄█ "], ["eat_2", " ▄▄▄▀▀▀▀▄ \n▄▀▀ ▀ ▄▄ ▀▄ \n█ █▀▄ █ ▀ █▄ \n▄▀ ▄ ▄ ▄█ █▀▄ \n█ ██▄██▄█▀ ▄ ▀▄ \n█ ▀ ████▀█ █ █ \n █ ▄ ▄ ▄▀ █▀ \n █▄█▄██▄█▄█▄▄▄█ "], ["happy", " ▄▄▄▀▀▀▀▄ \n▄▀▀ ▀ ▄▄ ▀▄ \n█ █▀▄ █ ▀ █▄ \n▄▀ ▄ ▄ ▄█ █▀▄ \n█ ██▄██▄█▀ ▄ ▀▄ \n█ ▀ ████▀█ █ █ \n █ ▄ ▄ ▄▀ █▀ \n █▄█▄██▄█▄█▄▄▄█ "], ["injured_1", " \n \n ▄▄▄ ▄▄▄▄ \n ▄▀ █▀ █▀▄ \n █ █ ▀ ▄ ▀ █ \n ▀▄ ▀ ▄ ▀▀ ▄ █ \n █ ▀▀▄▄▀▀▀▀ ▄ ▀▄\n█▄▄█▄▄█▄█▄█▄█▄▄█"], ["injured_2", " \n \n ▄▄▄ ▄▄▄▄ \n ▄▀ █▀ █▀▄ \n █ █ ▀ ▄ ▀ █ \n ▀▄ ▀ ▄ ▀▀ ▄ █ \n █ ▀▀▄▄▀▀▀▀ ▄ ▀▄\n█▄▄█▄▄█▄█▄█▄█▄▄█"], ["refuse", " ▄▄▄▄ \n ▄▄▀▀█ ▄ █ \n █ ▄▄ ▄▀█ █ \n ▀▄▀▄█ ▀▀ ▄ ▀▄ \n █ ▀ █ ▀ █ \n █ ▄ █ █ ▀▄ █ \n █▄▀ ▄█ █▄▀▄█ \n█▄█▄█▄█▄█▄█▄▄▄█ "], ["sleep_1", " \n \n ▄▄▄ ▄▄▄▄ \n ▄▀ █▀ █▀▄ \n █ █ ▀ ▄ ▀ █ \n ▀▄ ▀ ▄ ▀▀ ▄ █ \n █ ▀▀▄▄▀▀▀▀ ▄ ▀▄\n█▄▄█▄▄█▄█▄█▄█▄▄█"], ["sleep_2", " \n \n ▄▄▄ ▄▄▄▄ \n ▄▀ █▀ █▀▄ \n █ █ ▀ ▄ ▀ █ \n ▀▄ ▀ ▄ ▀▀ ▄ █ \n █ ▀▀▄▄▀▀▀▀ ▄ ▀▄\n█▄▄█▄▄█▄█▄█▄█▄▄█"], ["walk_1", " ▄▀▀▀▄▀▀▀▀▄ \n ▄▀ ▀ ▄▄ █ \n █ █▀▄ █▄▀ █ \n ▀▄ ▀▀ █ █ \n █ ▄ █ ▀▄ █ \n ▄█ ▀ █ ▀ █ \n █ ▄▀▄ █ ▀▀▄ \n █▄█▄█▀█▄▄█▄▄█ "], ["walk_2", " ▄▄▄▄ \n ▄▄▀▀█ ▄ █ \n █ ▄▄ ▄▀█ █ \n ▀▄▀▄█ ▀▀ ▄ ▀▄ \n █ ▀ █ ▀ █ \n █ ▄ █ █ ▀▄ █ \n █▄▀ ▄█ █▄▀▄█ \n█▄█▄█▄█▄█▄█▄▄▄█ "]]], + ["rasenmon", [["angry", " ▄ ▄▄ ▄▄▄▄▄ \n█ █▄▀▄▀▀ ▄▄▄▀ \n█ ▀▄▀ ▄▀▀ ▄▀ ▄▀█\n▄▀▄▄▄█▀ ▀█ ▄▀ █ \n ▀▄ ▄▄█▄▄▀ ▄█ \n ▄▀▀▀ ▄▀ ▀█▀▄▀▄\n█ █▄▀▀▄▄█ █▄ ▀█\n██▄▄▀▀▄▄▄██ ▀▄█"], ["attack", "▄▀▄ ▄▀█▄▀▀▀▀█ \n█ █▀ ▀▄ ▄▀▀█ ▄▄\n▀▄ ▀ ▀▀ ▄▄▀ ▄▀▄▀\n █████▄ ▀▄█ ▄▀ \n ▄██████ █▄ ▀█▄ \n█ █ ▄▄ ▄▀▄▀ ▄█ █\n ▀█▀▄▄▀▀▄█▀▀█ ▀▄\n █▄▄█ █▄▄█ ▀▄█"], ["eat_1", "▄▀▄ ▄▀█▄▀▀▀▀█ \n█ █▀ ▄▀ ▄▀▀█ ▄▄\n▀▄ ▀ ▀ ▄▄▀ ▄▀▄▀\n █████ ▀▄▀ ▄▀ \n ██▄▄▀ █▀▄▄▀▀▄ \n▄▀▄ ▄▄▀▀▄ █▀▄ █\n▀▄█▀▄▄▀▀█▄▄▀▄ ▀▄\n █▄▄█ █▄▄█ ▀▄█"], ["eat_2", " ▄ ▄▄ ▄▄▄▄▄ \n█ █▄▀ █▀ ▄▄▄▀ \n█ ▀ ▄▀▄ ▀ ▄▀ ▄▀█\n▄▀ ▀█ ▄▀ █ \n ▀█▀▀▄▄█▄▄▀ ▄█ \n ▄▀▀▀ ▄▀ ▀█▀▄▀▄\n█ █▄▀▀▄▄█ █▄ ▀█\n██▄▄▀▀▄▄▄██ ▀▄█"], ["happy", "▄▀▄ ▄▀█▄▀▀▀▀█ \n█ █▀ ▄▀ ▄▀▀█ ▄▄\n▀▄ ▀ ▀ ▄▄▀ ▄▀▄▀\n █████ ▀▄▀ ▄▀ \n ████▀ █▀▄▄▀▀▄ \n▄▀▄ ▄▄▀▀▄ █▀▄ █\n▀▄█▀▄▄▀▀█▄▄▀▄ ▀▄\n █▄▄█ █▄▄█ ▀▄█"], ["injured_1", " \n▄▀▄ ▄▀█▄▀▀▀▀█ \n█ █▀▄▀ ▄▄▀▀█ ▄▄\n▀▄ ▀ █▄ ▄▄▀ ▄▀▄▀\n▀▄▄▄▄ ▄ ▀▄▀ ▄▀ \n █▄▄▄▀▀█▀▄▄█▀▀█\n▄▀▄ ▄▄ ▀▄ █▄▄▀ \n█▄███████▄▄▀ "], ["injured_2", " \n ▄ ▄▄ ▄▄▄▄▄ \n█ █▄▀▄▀▀ ▄▄▄▀ \n█ ▀▄▀▄ ▀▀ ▄▀ ▄▀█\n▄▀ ▀▀ ▀█ ▄▀ █ \n ▀█▀▀ ▄▄█▀█ ▄█▄▄\n ▄▀█▀▀ ▀▄ █▀▄▄▀\n█▄▄███▄▄█▄▄▀▀ "], ["sleep_1", " \n ▄ ▄▄ ▄▄▄▄▄ \n█ █▄▀▄▀▀ ▄▄▄▀ \n█ ▀▄▀ ▀▀ ▄▀ ▄▀█\n▄▀ ▀▀ ▀█ ▄▀ █ \n ▀█▀ ▄▄█▄▄▀ ▄█▄▄\n ▄▀▀▀ ▄▀ ▀█ ▄▄▀\n█▄█▄██▄▄█▄▄▀▀ "], ["sleep_2", " \n▄▀▄ ▄▀█▄▀▀▀▀█ \n█ █▀▄▀ ▄▄▀▀█ ▄▄\n▀▄ ▀ ▄▄ ▄▄▀ ▄▀▄▀\n▀▄▄▄ ▄ ▀▄▀ ▄▀ \n █▄▄▀▀▀█▀▄▄▀▀▀█\n▄▀▄ ▄▄ ▀▄ █▄▀▀ \n█▄███████▄▄▀ "], ["walk_1", "▄▀▄ ▄▀█▄▀▀▀▀█ \n█ █▀▄▀ ▄▄▀▀█ ▄▄\n▀▄ ▀▄▀█ ▄▄▀ ▄▀▄▀\n▀▄▀▀▀▀ ▄ ▀▄▀ ▄▀ \n █▄▄▀▀▀█▀▄▄▀▀▄ \n▄▀▄ ▄▄ ▀▄ █▀▄ █\n▀▄█▀▄▄▀▀█▄▄▀▄ ▀▄\n █▄▄█ █▄▄█ ▀▄█"], ["walk_2", " ▄ ▄▄ ▄▄▄▄▄ \n█ █▄▀▄▀▀ ▄▄▄▀ \n█ ▀▄▀▄▄▀▀ ▄▀ ▄▀█\n▄▀▄▄█▄▀ ▀█ ▄▀ █ \n ▀▄ ▄▄█▄▄▀ ▄█ \n ▄▀▀▀ ▄▀ ▀█▀▄▀▄\n█ █▄▀▀▄▄█ █▄ ▀█\n██▄▄▀▀▄▄▄██ ▀▄█"]]], + ["rasenmon_fury_mode", [["angry", "▄▄ ▄▄▄ \n▀██▄▀▀▄▄▄██▀█ ▄█\n▄▄████▀███▄▀▄██▀\n█▀█▀█▄▄██▀▀██▀▄█\n ▀▄█▄███ ▄▄▄███▀\n▄▀▀█▀▀▀▄▀▀▄ ▀█▄█\n▀█▀██▄██▀▀█ ▄██▀\n█▄███▀▀███████▀▀"], ["attack", " ██▄ ▄▄▀▀▀▄▄▄▄ \n ▀██▄▄████▀▄▀ \n █████▀ ▄███ ▀ \n ▄▄▄▄▄▀▀▀▀▀▄▄██▄\n ▀████████████▀\n ▄▄▄ ▄▄▀▀▀▀▀▄▄▄█\n█████▄▄█████████\n ▀█████▀█████▀ "], ["eat_1", "██▄ ▄▄▀▀▀▄▄▄▄ ▄\n ▀██▄▄████▀▄▀▄██\n█████▀▄▀███▄██▀▄\n▀ ▀ ▀▀██▀ ▀█▄██\n ▄▄▄▄█▀▄█▀▀██▀▄\n▄▀██▄ ▄██▄▄▄ ███\n▀▀██████▄█▄███▀▄\n █▄███▀▄▄▄██▀▀▀ "], ["eat_2", "▄▄ ▄▄▄ \n▀██▄▀▀▄▄▄██▀█ ▄█\n▄▄████▀███▄▀▄██▀\n█▀█▀█▄█▄█▀▀██▀▄█\n ▀▄█▄███ ▄▄▄███▀\n ▄█▀▀▀▄█▀ ▀█▄█\n █ ██▄███▄▀█▀██▀\n█▄████████▄█▄█▀▀"], ["happy", "██▄ ▄▄▀▀▀▄▄▄▄ ▄\n ▀██▄▄████▀▄▀▄██\n█████▀▄▀███▄██▀▄\n▀ ▀ ▀████ █ █▄██\n █▀█▀▀▀ █▀▄\n ██▀▀▀▄██▄▄████\n ▄██▄████████▀▄\n █▄███▀█▄▄██▀▀▀ "], ["injured_1", "▄▄ ▄▄▄ \n▀██▄▀▀▄▄▄██▀█ ▄█\n▄▄███▀████▄▀▄██▀\n█▀█▀█▄▄██▀▀██▀▄█\n ▀▄█▄███ ▄▄▄███▀\n ▄█▀▀▀▄█▀ ▀█▄█\n █ ██▄███▄▀█▀██▀\n█▄████████▄█▄█▀▀"], ["injured_2", " \n██▄ ▄▄▀▀▀▄▄▄▄ ▄\n ▀██▄▄████▀▄▀▄██\n█████ ▀████▄██▀▄\n▀▄▀▄▀███▀ ▀█▄██\n ▀████▀▄█▀▀██▀▄\n ▄▀█▄ ▄██ ▄▄▄███\n██▄███████▄█▄█▀ "], ["sleep_1", " \n▄ \n▀█▄ ▄▄▀▀▀▄▄▄▄ ▄\n▄▀██▄▄████▀▄▀▄██\n█████▀▀████▄██▀▄\n▀▄▀▄▀███▀▄███▄█▀\n█▀██▀▀▀▄█▀▄ ▄▀▄█\n█▄▄██▄███ ███ █▀"], ["sleep_2", " \n▄▄ ▄▄▄ \n▀██▄▀▀▄▄▄██▀█ ▄█\n▄▄████████▄▀▄██▀\n█▀█▀█▄▄██▀▀██▀▄█\n ▀▄█▄███ ▄█████▀\n█▀▄█▀▀▀▄█▀▄ ▄▀▄█\n█▄▄██▄███ ███ █▀"], ["walk_1", "██▄ ▄▄▀▀▀▄▄▄▄ ▄\n ▀██▄▄████▀▄▀▄██\n█████▀ ▄███▄██▀▄\n▀▄▀▄▀███▀ ▀█▄██\n ▀████▀▄█▀▀██▀▄\n ▄▀█▄ ▄██ ▄▄▄███\n ▀▄███████ █ █▀▄\n █▄███▀█▄▄██▀▀▀ "], ["walk_2", "▄▄ ▄▄▄ \n▀██▄▀▀▄▄▄██▀█ ▄█\n▄▄████▀▀██▄▀▄██▀\n█▀█▀█▄▄██▀▀██▀▄█\n ▀▄█▄███ ▄▄▄███▀\n ▄█▀▀▀▄█▀ ▀█▄█\n █ ██▄███▄▀█▀██▀\n█▄████████▄█▄█▀▀"]]], + ["rasielmon", [["angry", " ▄▄▄▄ ▄▄▄ \n ▄▀ ▄▄█▀ ▄█▄▄ \n ▀▄▀▀ █▀█▀ ▄ █\n █ ▄█ █ █▄▄ ▄▀\n ▀▄▄▄ ▄▀▄▀▄▄▀▄ \n▄▀█▀▀▀▀▀▀▄▀ █ █\n▀▄▄▀██▀█▀▀▄▄█ █\n █▄▄█▄▄█▄▄▄█▀▄▄▀"], ["attack", " ▄▄▄▄ ▄▀█ \n ▄▀ ▄▄█▀ █▄ \n ▀▄▀▀▄ █▀█▀ █\n █▄▄▀▀ █ █▄▄▀\n ▄▄▄███▄▄█▄▀▀▄▄█\n█ ▀▄▄▄▄▄▄▄▀ ██\n ▀▀██▀█▀ █ ▀▄▄▀█\n █▄▄▀▀▀▀█▄▄█▀█"], ["eat_1", " ▄▄▄▄ ▄▀█ \n ▄▀ ▄▄▄█▀ █▄▄▄ \n ▀▄▀▄▄ █▀█▀ ▄ █\n █▄▄▄ █ █▄▄ ▄▀\n ▀███▄█▄▀▀▄▄▀▄ \n▄▀█▄▄▄▄▄▄▄▀ █ █\n▀▄▄▀█▀ █ ▀▄▄█ █\n █▄▄█▀▀█▄▄▄█▀▄▄▀"], ["eat_2", " ▄▀▀▀▀▄▄▀▀█ \n █ ▄▄▀▀█▄▄█▀▀▀▄\n ▄▀▄▀▄ █ █ ▀ █\n █ ▄▀▄█▀▀▄▀ \n ▄▄▀▀▀▀▀▀ ▄▀█ ▀▄\n█ ▀▄▄▄▄▄▄█ █ █\n ▀█ █▀ █ █▀█ █\n █▄▄█▀▀█▄▄▄█ ▀▀ "], ["happy", " ▄▀▀▀▀▄▄▀▀█ \n █ ▄▄▀▀█▄▄█▀▀▀▄\n ▄▄▀ ▄▀▄█▄█ ▀ █\n█ ███ ▄█ █▀▄▀ \n █▄▀▀▀▀▀▀▀▄▀█ ▀▄\n ▀▄▄▄▄▄▄█ █ █\n █▀█▀ █ █ █ █\n █▄▄█▀▀█▄▄▄█ ▀▀ "], ["injured_1", " ▄▄▄▄ ▄▀█ \n ▄▀ ▄▄▄█▀ █▄▄▄ \n ▀▄▀ █▀█▀ ▄ █\n █ ▀▄▄ █ █▄▄ ▄▀\n ▀▄▄▄▄█▄▀▀▄▄▀▄ \n▄▀█ ▄▀ █ █\n▀▄▄▀██▀█▀▀▄▄█ █\n█▄▄██▄▄██▄▄█▀▄▄▀"], ["injured_2", " ▄▄▄▄ ▄▄▄ \n ▄▀ ▄▄█▀ ▄█▄▄ \n ▀▄▀▀ █▀█▀ ▄ █\n █ ▀▄▄ █ █▄▄ ▄▀\n ▀▄▄ ▄▀▄▀▄▄▀▄ \n▄▀█▀▀▀▀▀▀▄▀ █ █\n▀▄▄▀██▀█▀▀▄▄█ █\n█▄▄██▄▄██▄▄█▀▄▄▀"], ["sleep_1", " \n ▄▀▀▀▀▄▄▀▀█ \n █ ▄▀▀▀█▄▄█▀▀▀▄\n ▄▀ ▄▄ █ █ ▀ █\n █▄▄ ▄▀▄█▀▀▄▀ \n ▄▄▀▀▀▀▀▀ ▄██▄█ \n█ ▀█▀▀▄▀▀█▀ █ \n▀▄▄▄█▄█▄▄▀▄▄▄▀ "], ["sleep_2", " ▄▄▄▄ ▄▄▄ \n ▄▀ ▄▄▄█▀ ▄█▄▄ \n ▀▄▀ █▀█▀ ▄ █\n █ ▀▀ █ █▄▄ ▄▀\n ▀██▄▄█▄▀▀ ▄▀▄ \n ▄█ ▄█▄▄█ \n█ ▀█▀▀▄▀▀█▀ █ \n▀▄▄▄█▄█▄▄▀▄▄▄▀ "], ["walk_1", " ▄▀▀▀▀▄▄▀▀█ \n █ ▄▄▀▀█▄▄█▀▀▀▄\n ▄▀ █ █ █ ▀ █\n █ ▄▀▄█▀▀▄▀ \n ▄▄▀▀▀▀▀▀ ▄▀█ ▀▄\n█ ▀▄▄▄▄▄▄█ █ █\n ▀█ █▀ █ █▀█ █\n █▄▄█▀▀█▄▄▄█ ▀▀ "], ["walk_2", " ▄▄▄▄ ▄▀█ \n ▄▀ ▄▄█▀ █▄▄▄ \n ▀▄▀▀▄ █▀█▀ ▄ █\n █ ▀ █ █▄▄ ▄▀\n ▀▄▄▄▄█▄▀▀▄▄▀▄ \n▄▀█▄▄▄▄▄▄▄▀ █ █\n▀▄▄▀█▀ █ ▀▄▄█ █\n█▄▄█▀▀▀▀█▄▄█▀▄▄▀"]]], + ["ravemon", [["angry", " ▄▀██▀▀▀█▀ \n █ ▀ ██▄ ▄▄ \n▄▀█ ▄█ █ █ ██\n█ ▀▄ ▄▄▀██ █▀██\n ▀▄██▄▄█▀▄▄█▄▄██\n █▄▄▄▀█▀ ▀█\n █▄▄ ▄█▄█▄ ▀\n █▄█▄█ █▄█▄█ "], ["attack", " ▄▄▄▄▄▄▄▄ \n ▄▀▄▀▀ ▄▄▀ \n ▄▀ ▄▀█ █ ▄▀█▄\n ▄█ ▀▀▄▄█▀▀ ▄██\n █ ▀▄▀▀▄█▄ ▀ ██\n █▀█▀▀▀██▀▀█▀██\n █▄█▀▀▀▄█▄▄█ █\n █▄█▄██▀██▄█▄█ "], ["eat_1", " ▄▄▄▄▄▄▄▄ \n ▄▀▄▀▀ ▄▄▀ \n ▄▀ ▄▀▄ █ ▄▀█▄\n ▄█ ▄▄█▀▀ ▄██\n █ ▀▄▀▀▄█▄ ▀ ██\n █▀█▀▀▀██▀▀█▀██\n █▄█▀▀▀▄█▄▄█ █\n █▄█▄██▀██▄█▄█ "], ["eat_2", " ▄█▀▀▀▀▄▄▄▄ \n ▄▀ ▀▀▄ ▄▀ ▄▄ \n ▀▄███▄ ▄█▄▀ ██\n █▀████▀█▀ ▄ ▀██\n ▀▄▄█▄▄███▄▄▄▄██\n █ █▄▄▄▀█ █ ▀█\n ██▄ ▄█▄██ ▀\n █▄█▄█ █▄█▄█ "], ["happy", " ▄▀██▀▀▀█▀ \n █ ▀▄ ██▄ ▄▄ \n █ ▀ ▀█ █ ██\n █▀▄ ▄▄▀██ █▀██\n ▀▄▄█▄▄█▀▄▄█▄▄██\n █ █▄▄▄▀█▀ ▀█\n ▀██▄ ▄█▄█▄ ▀\n █▄█▄█ █▄█▄█ "], ["injured_1", " \n ▄▄▄▄▄▄▄▄ \n ▄▀▄▀▀ ▄▄▀ \n ▄▀ █▄ █ ▄▀█▄\n ▄█ ▄▄█▀▀ ▄██\n █▄█▄▀▀▄█▄▄█▄ ██\n█ ▀ █▀▀▀██ ▀ ▀██\n█▄▄▄████▄█▄▄▄█ █"], ["injured_2", " \n \n ▄▀██▀▀▀█▀ \n █ ▀▄ ▀█ ▄▄ \n █ ▀▀ ▄█▄▀ ██\n ██▄ ▄▄▀█▀▄▄▄▀██\n█ █▄▄███ ▀ ███\n█▄▄▄█▄▄█▄█▄▄▄█▀█"], ["refuse", " ▄▄▄▄▄▄▄▄ \n ▄▀▄▀▀ ▄▄▀ \n ▄▀ ▄█ █ ▄▀█▄\n ▄█ ▄▄█▀▀ ▄██\n █ ▀▄▀▀▄█▄ ▀ ██\n █▀█▀▀▀██▀▀█▀██\n █▄█▀▀▀▄█▄▄█ █\n █▄█▄██▀██▄█▄█ "], ["sleep_1", " \n ▄▄▄▄▄▄▄▄ \n ▄▀▄▀▀ ▄▄▀ \n ▄▀ ▄▄ █ ▄▀█▄\n ▄█ ▄▄█▀▀ ▄██\n █ ▀▄▀▀▄█▄ ▀ ██\n ▄█▀█▀▀▀█████▀██\n█▄█▄████▄█▄█▄█ █"], ["sleep_2", " \n \n ▄▀██▀▀▀█▀ \n █ ▀ ▀█ ▄▄ \n █ ▀▀ ▄█▄▀ ██\n █▀▄ ▄▄▀█▀ ▄ ▀██\n █▄▄█▄▄███▄▄▄▄██\n█▄█▄████▄█▄█▄█▀█"], ["walk_1", " ▄▀██▀▀▀█▀ \n █ ▀▄▄ ▀█ ▄▄ \n █ █▄▀ ▄█▄▀ ██\n █▀▄ ▄▄▀█▀ ▄ ▀██\n ▀▄▄█▄▄███▄▄▄▄██\n █ █▄▄▄▀█ █ ▀█\n ██▄ ▄█▄██ ▀\n █▄█▄█ █▄█▄█ "], ["walk_2", " ▄▄▄▄▄▄▄▄ \n ▄▀▄▀▀ ▄▄▀ \n ▄▀ ▄▀█ █ ▄▀█▄\n ▄█ ▀▀▄▄█▀▀ ▄██\n █ ▀▄▀▀▄█▄ ▀ ██\n █▀█▀▀▀██▀▀█▀██\n █▄█▀▀▀▄█▄▄█ █\n █▄█▄██▀██▄█▄█ "]]], + ["rebellimon", [["angry", " ▄▄▄ ▄ ▄ ▄ \n █ ▀ ▀ ▀█▄ ██ \n █▄▄▀▀▀▀▄█▄██▀█\n ▄▀ ▄█ ▄▀█▀▀▄▀▄\n █▄▄▄▄▀████▀▄█▀\n▄▀█▄█▄█▀▀▄▀ █▄▄█\n▀▄▄██ ▀▄▄█▄▄▀ \n ▀████▀ "], ["attack", " █▀▀▄▀▄▀▄▄█▄ \n ▀▄ ▄▄▄▄▀██▄▄\n ▀█▀▄▄ ███▄▀\n █ ▀▀ ▄█▄█▀▄█\n▄▀▀▄█▀█▀█▄█▀▀█▀▄\n█ ▀▄█████ ██ █\n ▀▀ ██ ██▀▀▀▀ \n ▀████▀ "], ["eat_1", " █▀▀▄▀▄▀▄▄ █▄ \n ▀▄ ▄▄▄▄▀█ ██▄▄\n ▀█▀▄ ████▀▄▀\n █ ▀ ▄█▄█▄▄▀▄█\n ▄█████ █▀█▀▄▀▀▄\n█ ████▀▄▀█ █▀▀▀\n ▀▀▄▄▄▀██▀▀▀ \n ▀████▀ "], ["eat_2", " ▄▄▄ ▄ ▄ ▄ \n █ ▀ ▀ ▀█▄ ██ \n █▄▄▀▀▀▀▄█▄██▀█\n ▄▀▄▀▄ ▄▀█▀▀▄▀▄\n █▄▄▄▄▀████▀▄█▀\n▄▀█▄█▄█▀▀▄▀ █▄▄█\n▀▄▄██ ▀▄▄█▄▄▀ \n ▀████▀ "], ["happy", " █▀▀▄▀▄▀▄▄ █▄ \n ▀▄ ▄▄▄▄▀█ ██▄▄\n ▀█▀▄ ████▀▄▀\n █ ▀ ▀▄█▄█▄▄▀▄█\n ▄█▀█▀█ █▀█▀▄▀▀▄\n█ ████▀▄▀█ █▀▀▀\n ▀▀▄▄▄▀██▀▀▀ \n ▀████▀ "], ["injured_1", " \n █▀▀▄▀▄▀▄▄ █▄ \n ▀▄ ▄▄▄▄▀█ ██▄▄\n ▀█▀▄ ████▀▄▀\n █ ▀▀▄█▄█▄▄▀▄█\n ▄█▀█▀█▄█▀█▀▄▀▀▄\n█ ▀██▀█ █ █▀▀▀\n ▀▀▀████▀▀▀▀ "], ["injured_2", " \n ▄▄▄ ▄ ▄ ▄ \n █ ▀ ▀ ▀█▄ ██ \n █▄▄▀▀▀▀▄█▄██▀█\n ▄▀ █▄ ▄▀█▀▀▄▀▄\n █▄▄▄▄▀████▀▄█▀\n▄▀█▄█▄█▀▀▄▀ █▄▄█\n▀▄▄██▄█▄▄█▄▄▀ "], ["sleep_1", " \n █▀▀▄▀▄▀▄▄ █▄ \n ▀▄ ▄▄▄▄▀█ ██▄▄\n ▀█▀ ████▀▄▀\n █ ▀▀▄█▄█▄▄▀▄█\n ▄█▀█▀█▄█▀█▀▄▀▀▄\n█ ▀██▀█ █ █▀▀▀\n ▀▀▀████▀▀▀▀ "], ["sleep_2", " ▄▄▄ ▄ ▄ ▄ \n █ ▀ ▀ ▀█▄ ██ \n █▄▄▀▀▀▀▄█▄██▀█\n ▄▀ ▄▄ ▄▀█▀▀▄▀▄\n █▄▄▄▄▀████▀▄█▀\n▄▀█▄█▄█▀▀▄▀ █▄▄█\n▀▄▄██ ▀▄▄█▄▄▀ \n ▀████▀ "], ["walk_1", " █▀▀▄▀▄▀▄▄ █▄ \n ▀▄ ▄▄▄▄▀█ ██▄▄\n ▀█▀▄▄ ████▀▄▀\n █ ▀▀ ▄█▄█▄▄▀▄█\n ▄█▀█▀█▄█▀█▀▄▀▀▄\n█ ▀████ █ █▀▀▀\n ▀▀██ ██▀▀▀ \n ▀████▀ "], ["walk_2", " ▄▄▄ ▄ ▄ ▄ \n █ ▀ ▀ ▀█▄ ██ \n █▄▄▀▀▀▀▄█▄██▀█\n ▄▀▄█▀ ▄▀█▀▀▄▀▄\n █▄▄▄▄▀████▀▄█▀\n▄▀█▄█▄█▀▀▄▀ █▄▄█\n▀▄▄██ ▀▄▄█▄▄▀ \n ▀████▀ "]]], + ["redvegiemon", [["angry", " ▄█▀▄█▀▄█▀ \n ▀█████▀▀ ▄\n▀▄ ▄▀ ▀▄ █ \n █ ▄▀ ▄▀ █ █ \n █▀▄▄▄▄ ▀█▀ \n ▀▄▄▄ ▀ ▄ █ \n █ ▄▀ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["attack", " ▄ ▄█▀▄█▀▄█▀ \n █ ▄▀▀▀▀▀█▀▀ ▄\n ▀█▄ ▄█▀█ █ \n▄ ▀▄▄▄▄▄▄▄ ▀▄ █\n ▄ ██████ ▀█▀\n ▄▀█▀▀▀▀█ ▄ █ \n▀ █ █ ▄█▀ ▄▀ █ \n ▀▄▄▄█▄▄▄▄▄▄▀ "], ["eat_1", " ▄█▀▄█▀▄█▀ \n ▄▀▀▀▀▀█▀▀ ▄ \n █▄ ▄▄ █ █ \n ▀▄▄▄▄▄▄▄ ▀▄ █ \n ▄ ███████ █▀ \n█ ▄▀ ▄▀ █ █ \n ▀█▀▄ ▀ ▄█▀ █ \n ▀▄███▄▄▄▄▀ "], ["eat_2", " ▄█▀▄█▀▄█▀ \n▄ ▀█████▀▀ \n █ ▄█ ▄ ▀▄ \n█ █ ▀ ▀ ▀▄ \n█ ▀▄▄▄▄▄▄▄▀ ▀█▀▄\n ▀█ ▀▀▀▀ ▄ ▄ █ █\n █▀▀▀▀▀▀ ▄▀ █▀▄\n ▀▄▄▄▄▄▄▄▄▀ "], ["happy", "▄ ▀█▄▀█▄▀█▄ ▄ \n ▀▄ ▀▀█████▀ █\n ▄▀ ▄▀ ▄ ▀▄ █ \n ▀█▀ ▀ ▀ ▀ ▀▄ █\n ▄ ▀▄▄▄▄▄███▄ █▀\n▄ █▀▀█▀▀▀█ █ \n ▄ ▄▀▀▄▄▄▄▄█▀ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["injured_1", " ▄▄▀█▄▀█▄ \n ▀█████▀ \n ▄▀ ▀▄ \n █▄ ▀▄▄ █ ▄▀▄\n █▄▄▄▄ █▄█ \n ▀▄▄▄ ▀ ▀▄ \n █ ▄▄▀ █ \n▀▄█▀▄▄▄▄▄▄▄▄▀ "], ["injured_2", " ▄▄ ▄▄ \n ▀█▄██▄██ \n ▄▀▀▀▀█ \n █▄ █▄ █ \n ▀▄▄▄▄▄ █ \n ▄▀▀▀▀▀▀ ▀▄ \n █▀▀▀ █ \n▀▄█▀▄▄▄▄▄▄▄▀█▄▄▀"], ["sleep_1", " \n ▄█▀▄█▀▄█▀ \n ▀██████▀ \n ▄▀ █ █ \n▄▀ █ █ ▀▄\n▀▄█ ▀▀ ▀▀ █ █\n █ ▄██▄ █▀ \n ▀▄▄▄▄▄▄▄▄▀ "], ["sleep_2", " ▄█▀▄█▀▄█▀ \n ▀██████▀ \n▀▄ ▄▀ ▀▄ ▄\n▄▀ ▄▀ ▀▄ █ \n█ ▄▀▀▀ ▀▀ ▀▄ █\n ▀█ ▄████▄ ▄ █▄▀\n █ ▄▀ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["walk_1", "▄ ▄█▀▄█▀▄█▀ \n █ ▀█████▀▀ ▄▀\n█ ▄▀ ▄▀▄ █ \n▀▄▄▄▀▀ ▀ ▀▄ █ \n ▀▄▄▄▄▄▄▀ ▀█▀ \n ▀▄▄▄▄▄ ▄ █ \n █ ▄▀ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["walk_2", "▄ ▄▄▀█▄▀█▄ ▀▄ \n ▀▄ ▀█████▀ █ \n ▄▀▄▀ ▀▄ ▄▀ \n█ ▄▀▀ ▀▀ ▀▄█ ▄ \n ▀▄▄▄▄▄▄█ ▀▄ ▀▄\n █ ▀▀▀▀▀ ▄ █ \n █▀▀▀▀▀ ▄▀ █ \n▀▄ ▀▄▄▄▄▄▄▄▄▀ "]]], + ["regalecusmon", [["angry", " ▄▄▄▄▄▄▄ \n ▄▄▀▀▀▀█▀█▄▄ ▀ \n █ ▄█ █▄▄ ▀█▄ \n ▀▄▄▄▀█▀▀▄▄▀▀▄▀█\n ▀▄▄▀ ▄▀ ██ ██\n ▀▄█▀▀ ▄█▀██ █\n ▄▄▀█▄▄▄▀ ▀▀█▄ \n█▄█▄██▀▀▀██▄█▄█ "], ["attack", " ▄▄▄████▀▀▀▄ \n ▄▀▀▄ ▄▀ ▀▀█▄ \n █ ▀▀ ▄█▀▀ ▄▄▀█▄\n ████ █▄█▀▄▄▀▄█\n ▄█▀▀ █▄▄ ▄██▄▀█\n ▀▄██▀▀█ █▀▄█▀ ▀\n ▄█ ████▄▄ ▄█ \n █▄███▀ ▀██▄█▄█ "], ["eat_1", " ▄▄▄████▀▀▀▄ \n ▄▀▀▄▄ ▄▀ ▀▀█▄ \n █ ▀▀▄▄██▀ ▄▄▀█▄\n ███ █ ▄▀█▄ ▀▄█\n ▀▄▄█▄▀ ▄██▄ ▀█\n ▄▀█ █▀▄█▀ ▀\n ▄█ ███▄▄ ▄█ \n █▄███▀ ▀█▄█▄█ "], ["eat_2", " ▄▄▄▄▄▄▄ \n ▄▄▀▀▀▀█▀█▄▄ ▀ \n █ ▄▀▄ █▄▄ ▀█▄ \n ▀▄▄▄▄█▀▀▄▄▀▀▄▀█\n ▀▄▄▀ ▄▀ ██ ██\n ▀▄█▀▀ ▄█▀██ █\n ▄▄▀█▄▄▄▀ ▀▀█▄ \n█▄█▄██▀▀▀██▄█▄█ "], ["happy", " ▄▄▄████▀▀▀▄ \n ▄▀▀▄ ▄▀ ▀▀█▄ \n █ ▀ ▀▄██▀ ▄▄▀█▄\n ███▀█ ▄▀█▄ ▀▄█\n ▀▄▄█▄▀ ▄██▄ ▀█\n ▄▀█ █▀▄█▀ ▀\n ▄█ ███▄▄ ▄█ \n █▄███▀ ▀█▄█▄█ "], ["injured_1", " \n \n ▄▄▄████▀▀▀▄ \n ▄▀▀▄ ▄▀ ▀▀█▄ \n █ ▀█▄██▀ ▄▄▀█ \n █▀▀▄▀▄▀▀█▄ ▀▄ \n▄▀▀██▀▀ ▄█▀▀▀▄▀█\n█▄▄██▄▄▄█▄▄▄▄█ ▀"], ["injured_2", " \n \n ▄▄▄▄▄▄▄ \n ▄▄▀▀▀▀█▀█▄▄ ▀ \n█ █▄ █▄▄ ▀█▄ \n▀▄▄▄▀█▀█▄▄▀▀▄▀▄ \n▄▀▀██▀▀ ▄█▀▀▀▄█ \n█▄▄██▄▄▄█▄▄▄▄█▀ "], ["sleep_1", " \n \n ▄▄▄████▀▀▀▄ \n ▄▀▀ ▄▀ ▀▀█▄ \n █ ▀▀▄▄██▀ ▄▄▀█▄\n █▀▀▄▀▄▀▀█▄ ▀▄█\n▄▀▀██▀▀ ▄█▀▀▀▄▀█\n█▄▄██▄▄▄█▄▄▄▄█ ▀"], ["sleep_2", " \n ▄▄▄▄▄▄▄ \n ▄▄▀▀▀▀█▀█▄▄ ▀ \n █ ▄▄ █▄▄ ▀█▄ \n ▀▄▄▄▀█▀▀▄▄▀▀▄▀█\n ▀▄▄▀ ▄▀ ██ ██\n▄▀▀▄█▀▀ ▄█▀▀▀▄ █\n█▄▄██▄▄▄█▄▄▄▄█ "], ["walk_1", " ▄▄▄████▀▀▀▄ \n ▄▀▀▄▄ ▄▀ ▀▀█▄ \n █ ▀▀▄▄██▀ ▄▄▀█▄\n █▀▀▄▀ ▄▀█▄ ▀▄█\n ▀█▄▄▀ ▄██▄ ▀█\n ▄▀█ █▀▄█▀ ▀\n ▄█ ███▄▄ ▄█ \n █▄███▀ ▀█▄█▄█ "], ["walk_2", " ▄▄▄▄▄▄▄ \n ▄▄▀▀▀▀█▀█▄▄ ▀ \n █ ▄█▀ █▄▄ ▀█▄ \n ▀▄▄▄▀█▀▀▄▄▀▀▄▀█\n ▀▄▄▀ ▄▀ ██ ██\n ▀▄█▀▀ ▄█▀██ █\n ▄▄▀█▄▄▄▀ ▀▀█▄ \n█▄█▄██▀▀▀██▄█▄█ "]]], + ["relemon", [["angry", " \n \n \n \n ▄▄▄▄▄ ▄▀▀▄ \n ▄▀ ▀▄▀ █ \n ██▄ ▄█▀ █ ▄▀ \n ▀▄▄██▄▄▄▄▄▀▀ "], ["attack", " \n ▄▄▀▀█ \n ▄▀▀▀▀▀█ ▄▀ \n ▄█ ▄▄ ▀▄▀ \n █ ▀ ▀▀ █ \n ▀▄██ ▄▄▄▀ \n ▀▀▄▀ \n "], ["eat_1", " \n \n \n ▄▀▀▀▀▀▄ \n ▄█ ▄▄ ▀▄▄▄ \n █ ▀▄ ▀ █ ▀▄\n ▀▄██ ▄▄▄▀ ▀▄ █\n ▀▀▀ ▀ "], ["eat_2", " \n \n \n \n ▄▄▄▄▄ ▄▀▄ \n ▄▀ ▀▄█ █ \n █▀▄ ▄▀▄ █ ▄▀ \n ▀▄▄▄▄▄▄▄▄▄▀▀ "], ["happy", " \n ▄▄▄▄▄ \n ▄▀ ▀▄ \n █▀▄ ▄▀▄ █ \n ▀▄ ▄▄▄▄ ▄▀ \n ▀▄████▀ ▀▄ \n ▀▄▄▄▀ \n "], ["injured_1", " \n \n \n \n ▄▄▄▄▄ \n ▄▀ ▀▄ \n █▄▄▀ ▀▄▄ █▀▀▄ \n ▀▄▄▄█▄▄▄▄▄█▄▄▄▀"], ["injured_2", " \n \n \n \n \n ▄▀▀▀▀▀▄ \n ▄▀ ▄ ▄ ▀█▀▀▄ \n ███▄▄▄██▄▄█▄▄▄█"], ["sleep_1", " \n \n \n \n ▄▄▄▄▄▄▄ \n ▄▀ █▀▀▀▄ \n █▄▄ ▄▄█ █ \n ▀▄▄█▄▄▄▄█▄▄█▀ "], ["sleep_2", " \n \n \n \n ▄▀▀▀▀▀▀▄ \n ▄▀ █▀▀▀█▄ \n █▀▀▄ ▀▀█ █ \n ▀▄▄▄▄▄▄█▄▄█▀ "], ["walk_1", " \n \n \n ▄ \n ▄▀▀▀▀▀▄ ▄▀ █ \n ▄█ ▄▄ ▀█ █ \n █ ▀▄ ▀ █▄▀ \n ▀█▄█▄▄▄▄▀ "], ["walk_2", " \n \n \n \n ▄▄▄▄▄ ▄ \n ▄▀ ▀▄ ▄▀ █\n █▀▄ ▄▀▀ █ ▄▀\n ▀▄▄█▄▄▄▄▄▄▀▀▀ "]]], + ["renamon", [["angry", " █▀▀▄ ▄▄▀▀█ \n █ ▄██▀▀ █ \n ▄▀ ▄▀▀█ \n █ ▄▄█▀ ▀▄▀▄\n █▄▄ ▄▄▄▄▄▀▄ █\n █▀█▀█▄▄▀█▄█▄ █\n ▄█▄██ █▄███▄█ \n█▄█▄▄▄▀▀▀█▄█▄█▄█"], ["attack", " █▀▀▀▄▄▄▄▀▀▀▀▀█\n ▀▄▀▀▀ ▄▄▄▄▀ \n ▄▀ ▄█ █ ▄█\n █▄▄ ▀▀▀ ▄▀ █\n▄▀█▄▄▄▄▀▀▀██▄█ █\n▀▄███▄▀▀▀█▀█▄▄█▀\n ▄▄▀▀▀▄ █▄███▄ \n█▄█▄▄▄▀▀▀█▄█▄█▄█"], ["eat_1", " █▀▀▀▄▄▄▄▀▀▀▀▀█\n ▀▄▀▀▀ ▄▄▄▄▀ \n ▄▀ ▄▄▄ █ ▄█\n █▄▄ ▀ ▄▀ █\n ▀▄███▄▀▀██▄▀ █\n █ ██▀▀█▀██▄█▄▀\n ▄█▀▀▄ █▄████ \n █▄█▄▄▄██▄█▄█▄█ "], ["eat_2", " ▄▄▄▄ ▄▄▄▄▄▄\n ▀▄ ▄██▀▀ ▄▀\n ▄▀ ▀▀█▀ \n █ ▄▀▀▀ ▀▄▀▄\n █▄▄ ▄▄▄▄▄▀▄ █\n ▀██▀█▄▄▄██▀▄ █\n ▄█ ██ █ █████ \n█▄███▄████████▄█"], ["happy", " █▀▀▀▄▄▄▄▀▀▀▀▀█\n ▀▄▀▀▀ ▄▄▄▄▀ \n ▄▀ ▄▄▄ █ ▄█\n █▄▄ ▀ ▄▀ █\n ▄▀▄███▄▀▀███▀▄█\n ▀▄██▄▀▀▀▀█▀█▄█▀\n ▄█▀▀▄ ▄▄███ \n █▄█▄▄▄▀█▄█▄█▄█ "], ["injured_1", " \n ▄▄▀███▀▀▀▀▀▄▄ \n █▄▄▀ ▀▀▄▄▄█\n ▄▀ ▄▄██▀ ▀▄ \n ▀█▀▄▄▄▄▄▄▄▄▀▄ \n ▀█▀█▄▄▄▀█▀▀▄ \n ▄▄█▀▀▄ ▄█▀▀█▄▄█\n█▄█▄▄▄█▀▀█████▄█"], ["injured_2", " \n ▄▄▄▄▄▄▄▄▄ \n ▄▀▀▄▀▀▀ ▄▄ ▀▀▄\n ▀█▀ ▄▄▄ █▀▀▀\n ▄▀ ▀▀▀▀ ▄▀ \n ▀██▄▄▄▀▀███▀▀▄ \n ▄▄█▀▄▀▀▀█▄██▄▄█\n█▄█▄▄▄█▄██▄▄██▄█"], ["sleep_1", " \n █▀▀▀▄▄▄▄▀▀▀▀▀█\n ▀▄▀▀▀ ▄▄▄▄▀ \n ▄▀ ▄ █ \n ▄█▀▄ ▀▀▀ ▄█ \n ▀█ ▀▀▀▀▀▀█▀ ▀▄\n ▄█▄ ▀ █\n █▄██▄▄▄▄▄▄▄▄▄▀ "], ["sleep_2", " ▄▄▄▄ ▄▄▄▄▄▄\n ▀▄ ▄██▀▀ ▄▀\n ▄▀ ▀▀█▀ \n █ ▄▄▄▀ ▀▄ \n █▄▄ ▄▄▄▄▄▀▄ \n █▀█▀▀▀▀▀▀▀▄ ▀▄\n ▄█▄▄ ▀ █\n █▄█▄█▄▄▄▄▄▄▄▄▀ "], ["walk_1", " █▀▀▀▄▄▄▄▀▀▀▀▀█\n ▀▄▀▀▀ ▄▄▄▄▀ \n ▄▀ ▄▄▄▄ █ ▄█\n ▄▀ ▀▀ ▀ ▄▀ █\n ▀██▄▄▄▀▀▀██▄▀ █\n ▄▀█▄▀▀█▀██▄█▄▀\n █▄█▀▄ █▄████ \n █▄█▄▄▄▀█▄█▄█▄█ "], ["walk_2", " █▀▀▄ ▄▄▀▀█ \n █ ▄██▀▀ █ \n ▄▀ ▀▀█ \n █ ▄█▀█▀ ▀▄▀▄\n █▄▄ ▄▄▄▄▄▀▄ █\n ▀██▀█▄▄▄██▀▄ █\n ▄█ ██ █ █████ \n█▄███▄▀▀▀█████▄█"]]], + ["renamon_x", [["angry", " ▄▄▄ ▄▄▄ \n ▄▀ █▀▀ ▄▀ \n ▄▀▄ ▄▄▀▀▄ \n▄▀ ▀ ▄█ █▀█ \n▀▄ ▄▀▀ ▄ ▄ \n▄▀█▀█▀█▀▀█▄▀▄▀ █\n▀▄█▀ ▀▀▄▄▄█▀ █\n█▄▄█▀▀▀▄▄▄█▀▄▄▀ "], ["attack", " ▄▀██▄▀▀█ \n ▄▀▄ ▀ █▄ \n▄▀ ▀ ▄█ ▀█▄▄▀ \n█▄▄▄▄▄▄ █▄▀ \n ███████ █▄▄▀▄▀▄\n █▀▀▀▀ █ ▀█ █\n ▄▀▀▀▀▀ █▄▀ ▄▀\n █▄▄█▀▀█▄▄█▀▀▀ "], ["eat_1", " ▄▀██▄▀▀█ \n █ ▀ █▄ \n ▄▀▄▀ ▄ ▀█▄▄▀ \n█ ▀ ▀ █▄▀ \n ▀█████ ▄█ ▄▀▄▀▄\n █▀▀▀▀▄▀ ▀▄█ █\n ▀▄▀▀▀▀ ▀▄▄▀ ▄▀\n █▄▄█▀▀█▄▄█▀▀▀ "], ["eat_2", " ▄▄▄ ▄▄▄ \n ▄▀ █▀▀ ▄▀ \n ▄▀▄ ▄▄▀▀▄ \n▄▀ ▀ ▄▀▄ █▀█ \n▀▄ ▄▀▀ ▄ ▄ \n █▀█▀█▀█▀▄▀▄▀ █\n ▀▄█ ▀ ▀▄▄█▀ █\n █▄▄█▀▀█▄▄█▀▄▄▀ "], ["happy", " ▄▀██▄▀▀█ \n ▄▀▄ ▀ █▄ \n▄▀ ▀ ▄▀▄▀█▄▄▀ \n█▄▄▄▄▄▄ █▄█ \n ████▀ █▀ █▄▀▄\n ▀▄▄▄▄▄▀ ▄█▀ █\n ▄▀ ▄▄ ▀█ ▄▀\n █▄▄█ █▄▄█▀▀▀ "], ["injured_1", " \n ▄▀██▄▀▀█ \n █ ▀ █▄ \n ▄▀▄▀ ▀█▄▄▀ \n▄▀ █▄ █▄▀▄ ▄ \n▀▄ ▄█ ▄▀▄▀ █\n █▀█▀██ █▀█ █\n█▄▄█▄█▄▄▄█▄▄█▄▄▀"], ["injured_2", " \n ▄▄▄ ▄▄▄ \n ▄▀ █▀▀ ▄▀ \n ▄▀▄ ▄▄▀▀▄ \n █ ▀ ▄ █▀█▄ ▄ \n█ ▀▀ ▄▀▄▀▄▀ █\n █▄▄▄▄▄▀▀▄▀█ █\n█▄▄█▄█▄▄▄█▄▄█▄▄▀"], ["sleep_1", " \n ▄▀██▄▀▀█ \n █ ▀ █▄ \n ▄▀▄▀ ▀█▄▄▀ \n█ ▀▀▀ █▄▀ \n ▀▄▄▄▄▄▄█▄ ▄▀▄▀▄\n █▀▀▄▀▄▀ ▄▀▀█ █\n██▄▄▄█▄▄█▄▄▄█▄▄▀"], ["sleep_2", " ▄▄▄ ▄▄▄ \n ▄▀ █▀▀ ▄▀ \n ▄▀▄ ▄▄▀▀▄ \n▄▀ ▀ ▄▄▄ █▀█ \n▀▄ ▄▀▀ ▄ ▄ \n █▀█▀█▀█▀▄▀▄▀ █\n▄█▀▀▄▀▄▀ ▄▀▀▄ █\n▀█▄▄▄██▄█▄▄▄█▄▀ "], ["walk_1", " ▄▀██▄▀▀█ \n █ ▀ █▄ \n ▄▀▄▀ ▄▄▀█▄▄▀ \n█ ▀▀ █▄▀ \n ▀▄▄▄▄▄▄█▄ ▄▀▄▀▄\n ▄▀▄▀▄▀▄▀ ▀▄█ █\n ▀▄▀ ▄▄ ▀▄▄▀ ▄▀\n █▄▄█ █▄▄█▀▀▀ "], ["walk_2", " ▄▄▄ ▄▄▄ \n ▄▀ █▀▀ ▄▀ \n ▄▀▄ ▄▄▀▀▄ \n▄▀ ▀ ▄█▀ █▀█ \n▀▄ ▄▀▀ ▄ ▄ \n █▀█▀█▀█▀▄▀▄▀ █\n █▄▀ ▀ ▀▄ █▀ ▄▀\n█▄▄█▀▀▀▀▄██▀▀▀ "]]], + ["reppamon", [["angry", " █▀▄ \n █▀▄▀▄\n ▄▀█▄▀█ ██ █\n █ ▄▀ █▀▄ █▄█\n █ ▄▄▄█ █▀▄██▀\n█ ▀▀ ▄▀▄▀ █▀ \n ▀▄▄▄▄█▀▀ ▄ █ \n █▄█▄█▄█▀█▄█▄▀ "], ["attack", " ▄▀█▄▀▀█ █▀▄ \n ▄▀ ▀ ▄▄▄▀ ██ █ \n█▄▄▄▄▀▀ █ ▀▄█ █\n ▀████▄ █▀▄ ██ █\n █████ █ █▀▄█▄▀\n ▄▀▀▀▀▄█▄▀ █▀ \n ▀██▀ ▄ ▄▄ █ \n █▄█▄█▄██▄█▄▀ "], ["eat_1", " ▄▄▄ ▄▄ █▀▄ \n ▄▀▄▀▀▀▄▀ █▀▄▀▄\n █ ▄▀▄█ ██ █\n█▄▄▄▄ █▀▄ █▄█\n██████ ▄▀ █▀▄██▀\n ▀▄▄▄▄▀▄▄▀ █▀ \n ▄█▀ ▄ ▄▄ ▄▄ █ \n █▄█▄█▄█▀▀█▄█▄▀ "], ["eat_2", " █▀▄ \n ▄▄ ▄▄ █▀▄▀▄\n ▄▀ █▀ █ ██ █\n ▄▀ ▀ █▀▄ █▄█\n▄▀ ▄▀▄ █ █▀▄██▀\n▀▄ ▄█▄▀ █▀ \n ██▀▀▄ ▄▄ ▄▄ █ \n █▄█▄█▄█▀▀█▄█▄▀ "], ["happy", " ▄▀█▄▀█ ▄▄ \n █ ▄▀ █ █▄▀▄ \n █ ▄▀▄█ ▀▄█ █\n█▄▄▄▄▄ █▀▄ ▀█ █\n ██████ █ █▀▄██▀\n █▀▀▀▀▄█▄▀ █▀ \n ██▀▀▄ ▄▄ ▄▄ █ \n █▄█▄█▄█▀▀█▄█▄▀ "], ["injured_1", " \n \n ▄▀█▄▀█ \n █ ▄▀ █▀▄ \n █ █ █▀▄ \n█ ▀▄▄ ▄▀▄▀ █▀▄ \n ▀▄▄▄▄█▀▀▄ ██ █\n █▄█▄█▄██▄█▄▀█▄▀"], ["injured_2", " \n \n ▄▄ ▄▄ \n ▄▀ █▀ █▄ \n ▄▀ ▀ █ █▄ \n▄▀ ▄ █ █ █▄ \n▀▄ ▀▀▄█▀█ ██▀▄\n ████████▄█▄▀█▄▀"], ["sleep_1", " ▄▄ \n █▄▀▄ \n ▄▄ ▄▄ ▀▄█ █ \n ▄▀ █▀ █▀▄ ▀█ █\n ▄▀ ▀ █ █▀▄█▄█\n▄▀ ▄▄▄▀█▄▀ ███ \n▀▄ ▄█▄ ▄ █ \n ███████▀█▄█▄▀ "], ["sleep_2", " █▀▄ \n █▀▄▀▄\n ▄▀█▄▀█ ██ █\n █ ▄▀ █▀▄ █▄█\n █ ▄█ █▀▄██▀\n█ ▀▀▀▄▀▄▀ █▀ \n ▀▄▄▄▄█▀▀ ▄ █ \n █▄█▄█▄█▀█▄█▄▀ "], ["walk_1", " █▀▄ \n ▄▀█▄▀█ █▀▄▀▄\n █ ▄▀ █ ██ █\n █ ▄▄▄█▀▄ █▄█\n█ ▀▀ ▄▀ █▀▄██▀\n ▀▄▄▄▄▀▄▄▀ █▀ \n ▄█▀ ▄ ▄▄ ▄▄ █ \n █▄█▄█▄█▀▀█▄█▄▀ "], ["walk_2", " ▄▄ ▄▄ █▀▄ \n ▄▀ █▀ █ █▀▄▀▄ \n ▄▀ ▀ █ ▀█ ▀▄\n▄▀ ▄█▀▀█▀▄ █▄█\n▀▄ ▄▀ ▄▀▀▄██▀\n ▄███▀ ▀▀ █▀ \n █▄█ ▄▀▄█▄▄ ▄▄▀▄\n ▀▀▀▀▀ ▀█▄█▄▀"]]], + ["rhihimon", [["angry", " ▄▄▄▄▄▄ \n ▄██▀ ▄█▄▄█ \n ▀██▀▀█▀██▄▄▀▄▄ \n █ ▀▀ ▄█▄█▀ ▀▄\n ▀█▀▀▀█▀ █ ▄ █\n ▄▀█ ▀▄█▄▀███ █\n ▀▄█▀█▀█ ██ █▀█\n ▄███▀▀▀▀████ "], ["attack", " ▄▄██▀▀█▀▀▄ \n ▀██▀▀█▀██▀▀█\n █ ▀▀ █▀█ \n ▀███ ▄▀█▀ █\n ▄▄▄ █▀█▄▄▀▄ █\n▄▀▄▄ ▀▀▀▀█ ▄█▄█\n ▀▄▄▄▀▀████▀▀▄ ▀\n ▄██▀ ▀███ "], ["eat_1", " ▄▄██▀▀█▀▀▄ \n ▀██▀▀█▀██▀▀▄ \n █ ▀ ▀ █▀█▄▀█ \n ▀███ ▄█▀█ █\n ▄█▀██ ██ █ █\n █ █▄▄██▄▄▀▀▀▄█\n █▄█▄█▄█▄ ▀\n ▄██▀ ▀██▄ "], ["eat_2", " ▄▄▄▄▄▄ \n ▄██▀ ▄█▄▄█ \n ▀██▀▀█▀▀█▄▄▀▄▄ \n █ ▀ ▀ █▄█▀ ▀▄\n ▀█▀▀▀█▀ █ ▄ █\n ▄▀▀█ ▀▄█▄█▀▄█ █\n ▀▄█▀█▀█ ███ █▀█\n ▄███▀▀▀▀████ "], ["happy", " ▄▄██▀▀█▀▀▄ \n ▀██▀▀█▀██▀▀▄ \n █ ▀ ▀ █▀█▄▀█ \n ▀███ ▄███▄ █\n ▄▄█▀█▀██▄▀██ █\n █ ██▄▄█▀█ █▀▄█\n ▀█▄█▄█▄███▀ ▀\n ▄██▀ ▀██▄ "], ["injured_1", " \n ▄▄█▀▀█▀▀▄ \n ▄███▄▄███▀▀▄ \n █▀ █▄ ▀█▀█▄▀█ \n ▀▄▄▄▄▄██▀█ █\n ▄▄█ ▄ █▄▄█ █ █\n █▄▄█▄▄█ ▄██▀▄█\n ▄███████████▄ ▀"], ["injured_2", " \n ▄▄▄▄▄▄ \n ▄██▀ ▄█▄▄█ \n ▀██▀█▀▀██▄▄▀▄▄ \n █ ▀▀ ▄█▄█▀ ▀▄\n ▀█▀▀▀█▀ █ ▄ █\n ▄▀▀█ ▀▄▀▀▀█▄█ █\n ▀██████▄▄███▄██"], ["sleep_1", " \n \n ▄▄█▀▀█▀▀▄ \n▄███▄▄███▀▀█▀▄▄ \n █▀ ▄▄ ▀█▀█▄ ▀▄\n ▀▄▄▄▄▄██▀█▄ ▄ █\n ▄▄▀█ ▀▄█▄▀█▄█ █\n ████████████ ▀█"], ["sleep_2", " \n ▄▄▄▄▄▄ \n ▄██▀ ▄█▄▄█ \n ▀██▀▀▀▀██▄▄▀▄▄ \n █ ▀▀ ▄█▄█▀ ▀▄\n ▀█▀▀▀█▀ █ ▄ █\n ▄▄▀█ ▀▄█▄▀█▄█ █\n ████████████ ▀█"], ["walk_1", " ▄▄█▀▀█▀▀▄ \n ▄███▄▄███▀▀▄ \n █▀ ▄█ ▀█▀█▄▀█ \n ▀▄▄▄▄▄██▀█ █\n ▄█ ▄ █ ▄█ █ █\n ▄▀ █▄▄█▀█▀ █▀▄█\n ▀▄█▄█▄█▄█▄▄▀ ▀\n ▄██▀ ▀██▄ "], ["walk_2", " ▄▄▄▄▄▄ \n ▄██▀ ▄█▄▄█ \n ▀██▀▀█▀██▄▄▀▄▄ \n █ ▀▀ ▄█▄█▀ ▀▄\n ▀█▀▀▀█▀ █ ▄ █\n ▄▀█ ▀▄█▄█▀▄█ █\n █ ▄▀█▀█ █ █ ▀█\n ▄███▀▀▀▀███▄ "]]], + ["rhinomon", [["angry", " ▄▄ \n▄▀▄ ▄▄▀▀▄ ▄▀ █ \n▀▄ ▀▄▄▀▀▀▀▄▄▀ ▄▄\n▄█▄█▀ ▄▀▀▀▄▀\n█ ▀ ▄ █ █ ▄▀ █\n▀█▄▄▀▀▀▀▄█▀▀▄▄▀█\n ▄█▄▄▄▄██▄▄▄█ ▄█\n█▄█▄▄█▀▀▄█▄█▄█▄█"], ["attack", " ▄ ▄▄ ▄▀█ \n█ ▀▄▀▀ ▄█▄▀ ▄▀ \n █ ▄█▀▀ ▀█▄▄▀█\n▄▀█▀ ▄ █ ▄▀▄\n█▄ █ █▄▀▄▀▄▀ ▄█\n ▀▄▄███▄▀ ▀▄▄▀ █\n █████▀▄▄▄█▄ ▄█\n █▄█▄▄▄█▄█▄█▄█▄█"], ["eat_1", "▄▄ ▄▄ ▄▄▄ \n█ ▀▄▀▀ ▄█▄▀ ▄▀ \n █▄█▀▀▀ ▀█▄▄▀█\n█ ▀ ▄ ▄ █ ▄▀▄\n▀▄ ▄█▄█▄▀▄▀▄▀ ▄█\n ███▀▀█▀ ▀▄▄▀ █\n ▄▀▀▀▀█▄▄▄█▄ ▄█\n █▄█████▄█▄█▄█▄█"], ["eat_2", " ▄▄ \n▄▀▄ ▄▄▀▀▄ ▄▀▄▀ \n▀▄ ▀▄▄▄▀▀▀▄▄▀ ▄▄\n █▄█▀ ▄▀▀▀▄▀\n█ ▀ ▄ █ ▄ █ ▄▀ █\n▀█ █▄▀▀▄▀█▀ ▄▀█\n ▀█▄▄▄█▄▄▄█▀ ▄█\n █▄█▄██▄█▄█▄█▄█"], ["happy", " ▄ ▄▄ ▄▄▄ \n█ ▀▄▀▀ ▄█▄▀ ▄▀ \n █ ▄█▀▀ ▀█▄▄▀█\n▄▀█▀ ▄ █ ▄▀▄\n█ █ █▄█▄▀▄▀ ▄█\n ▀▄▄████▀ ▀▄▄▀ █\n ▄▀███▀▀▄▄▄█▄ ▄█\n█▄█▄▄▄▄█▄█▄█▄█▄█"], ["injured_1", " \n \n▄▀▄ ▄▄▀▀▄▀▀▀▀█ \n▀▄ ▀▄▄▄▀▀▀█▄█▄ \n █▄█▀ ▄█ █ \n█ ▀ ▄ █ ▄▄█▄▄▀ █\n▀█ █▄▀▀█▄▄█▄▄▀█\n█▄██▄▄▄▄█▄█▄█▄██"], ["injured_2", " \n \n ▄ ▄▄ ▄▄ \n█ ▀▄▀▀ ▄█▄ ▀▀▄ \n █ ▄█▀▀ ▀█▀▀▀▄\n▄▀█▀ ▄ ▄██ ▄▀█\n█▄ █ █▄█▄▄██▄▄█\n██▄▄██▄▄█▄█▄█▄██"], ["sleep_1", " \n \n▄▀▄ ▄▄▀▀▄ ▄▀▀█ \n▀▄ ▀▄▄▄▀▀▀▄▄█▄▀█\n █▄█▀ ▄▀ ▄▀▄\n█ ▀ ▄ █ ▄█▄▀ ▄█\n▀█ █▄▀▀█▄▄▄█▀ █\n█▄██▄▄▄█▄█▄▄█▄██"], ["sleep_2", " \n ▄ ▄▄ ▄▄▄ \n█ ▀▄▀▀ ▄█▄▀ ▄▀ \n █ ▄█▀▀ ▀█▄▄▀█\n▄▀█▀ ▄ █ ▄▀▄\n█▄ █ █▄▀▄█▄▀ ▄█\n █▄▄▀▀ █▄▄▄█▀ █\n█▄█▄████▄█▄▄█▄██"], ["walk_1", " ▄ ▄▄ ▄▄▄ \n█ ▀▄▀▀ ▄█▄▀ ▄▀ \n █ ▄█▀▀ ▀█▄▄▀█\n▄▀█▀ ▄ █ ▄▀▄\n█▄ █ █▄▀▄▀▄▀ ▄█\n ▀▄▄▀▀ ▄▀ ▀▄▄▀ █\n ▄█▀▀█▀▄▄▄█▄ ▄█\n █▄█▄█ █▄█▄█▄█▄█"], ["walk_2", " ▄▄ \n▄▀▄ ▄▄▀▀▄ ▄▀▄▀ \n▀▄ ▀▄▄▄▀▀▀▄▄▀ ▄▄\n █▄█▀ ▄▀▀▀▄▀\n█ ▀ ▄ █ ▄ █ ▄▀ █\n▀█ █▄▀▀▄▀▀█ ▄▀█\n ▄█▀▄▄▄▄▀▄▄▄█ ▄█\n█▄█▄▄█▀▀█▄█▄██▄█"]]], + ["rhinomon_x", [["angry", " ▄▄ ▄▄ █▀▄\n█ █ ▄█ ▀▄ █ █\n▀▄ ▀▄▄▀▀▀▀▄▄ ██\n▄▀▄▀▄ █ █ ▄▀▀▀▄▀\n█ ▀ ▀ ▀ █ ▄▀ █\n▀█▄▄▀▀▀▀▄█▀▀▄▄▀█\n ▄█▄▄▄▄██▄▄▄█ ▄█\n█▄█▄▄█▀▀▄█▄█▄█▄█"], ["attack", "▄▀▄ █▀▄ ▄▀▀▄ \n█ ▀▄▀▀ ▄█▄ ▀▀▄█\n █ ▄█▀▀ ▄ ▀█▄▄▀█\n▄▀█▀▄ █ ▀ █ ▄▀▄\n█▄▀ ▀ ▄▄▀▄▀▄▀ ▄█\n ▀▄▄███▄▀ ▀▄▄▀ █\n █████▀▄▄▄█▄ ▄█\n █▄█▄▄▄█▄█▄█▄█▄█"], ["eat_1", "█▀▄ █▀▄ █▀▄\n█ ▀▄▀▀ ▄█▄ ▀▄█\n █▄█▀▀▀ ▄ ▀█▄▄▀█\n█ █ █ █ ▀ █ ▄▀▄\n▀▄ ▄▄▄▄▄▀▄▀▄▀ ▄█\n ███▀▀█▀ ▀▄▄▀ █\n ▄▀▀▀▀█▄▄▄█▄ ▄█\n █▄█████▄█▄█▄█▄█"], ["eat_2", " ▄ ▄▄ ▄▄ \n█ █ ▄█ ▀▄ ▀▄▄▀▄\n▀▄ ▀▄▄▄▀▀▀▄▄ ██\n █▄█▀ ▄ █ ▄▀▀▀▄▀\n█ █ █ ▀ ▄ █ ▄▀ █\n▀█ ▄▄▀▀▄▀█▀ ▄▀█\n ▀█▄▄▄█▄▄▄█▀ ▄█\n █▄█▄██▄█▄█▄█▄█"], ["happy", "▄▀▄ █▀▄ ▄▀▀▄ \n█ ▀▄▀▀ ▄█▄ ▀▀▄█\n █ ▄█▀▀ ▄ ▀█▄▄▀█\n▄▀█▀▄ █ ▀ █ ▄▀▄\n█ ▀ ▀ ▄█▄▀▄▀ ▄█\n ▀▄▄▄███▀ ▀▄▄▀ █\n ▄▀███▀▀▄▄▄█▄ ▄█\n█▄█▄▄▄▄█▄█▄█▄█▄█"], ["injured_1", " \n ▄ ▄▄ ▄▄ \n█ █ ▄█ ▀▄ ▀▄▄▀▄\n▀▄ ▀▄▄▄▀▀▀▄▄▄▄██\n █▄█▀ ▄▄ ▄█ █▀\n█ █ ██▀ ▄▄█▄▄▀ █\n▀█ ▄▄▀▀█▄▄█▄▄▀█\n█▄██▄▄▄▄█▄█▄█▄██"], ["injured_2", " \n \n▄▀▄ █▀▄ ▄▄▄ \n█ ▀▄▀▀ ▄█▄ ▀▄▄▀▄\n █ ▄█▀▀ ▀█▀▀▀█\n▄▀█▀▄▄▄▀▀▄██ ▄▀█\n█▄▀ ▀▀▄▄█▄▄██▄▄█\n██▄▄██▄▄█▄█▄█▄██"], ["sleep_1", " \n ▄ ▄▄ ▄▀▀▄ \n█ █ ▄█ ▀▄ ▀▀▄█\n▀▄ ▀▄▄▄▀▀▀▄▄▄▄▀█\n █▄█▀ ▄ █ ▄▀ ▄▀▄\n█ █ █ ▀ ▄█▄▀ ▄█\n▀█ ▄▄▀▀█▄▄▄█▀ █\n█▄██▄▄▄█▄█▄▄█▄██"], ["sleep_2", " \n▄▀▄ █▀▄ ▄▀▀▄ \n█ ▀▄▀▀ ▄█▄ ▀▀▄█\n █ ▄█▀▀ ▄ ▀█▄▄▀█\n▄▀█▀▄ █ ▀ █ ▄▀▄\n█▄▀ ▀ ▄▄▀▄█▄▀ ▄█\n █▄▄▀▀ █▄▄▄█▀ █\n█▄█▄████▄█▄▄█▄██"], ["walk_1", "▄▀▄ █▀▄ ▄▀▀▄ \n█ ▀▄▀▀ ▄█▄ ▀▀▄█\n █ ▄█▀▀ ▄ ▀█▄▄▀█\n▄▀█▀▄ █ ▀ █ ▄▀▄\n█▄▀ ▀ ▄▄▀▄▀▄▀ ▄█\n ▀▄▄▀▀ ▄▀ ▀▄▄▀ █\n ▄█▀▀█▀▄▄▄█▄ ▄█\n █▄█▄█ █▄█▄█▄█▄█"], ["walk_2", " ▄ ▄▄ ▄▄ \n█ █ ▄█ ▀▄ ▀▄▄▀▄\n▀▄ ▀▄▄▄▀▀▀▄▄ ██\n █▄█▀ ▄ █ ▄▀▀▀▄▀\n█ █ █ ▀ ▄ █ ▄▀ █\n▀█ ▄▄▀▀▄▀▀█ ▄▀█\n ▄█▀▄▄▄▄▀▄▄▄█ ▄█\n█▄█▄▄█▀▀█▄█▄██▄█"]]], + ["rizegreymon", [["angry", " ▄ ▄▄▄▄▄ ▄▄▄ \n ██▄███▀ ████▀ \n▄█████▄▄██▀█▀▄▄ \n▀█▀▀ ▀▀▀ ▄█▀▄▀ \n ▀█▀▀▀▀▄█ ▄ ▀▀█\n ▄▀█▀ ▀▄▄▄▀▀▄\n █▄▀▀▄ ▄█▄ █\n █▄█▄▄█▀▀▄▄█▄██"], ["attack", " ▄█ ▄█████▄▄██▀ \n █████▀ ▄████ \n████▀███▀▀ █▄▀█ \n ▀▄▄▄▄▄ ▄▄▀▀ █▄▄\n▄▀▀▀█▀▀▀ █ ▀ ▄▄▀\n█ █ █ ▀▀█▄▄▄\n▀▄▄▄█▄▄▄▄▄▄▄▀▀▄█\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["eat_1", " ▄█ ▄█████▄▄██▀ \n █████▀ ▄████ \n██▀▀▀▀▀▀▀▀ █▄▀█ \n ▀▄█▄██▄ ▄▀▀ █▄▄\n █▀▀▀▀ ▄█ ▀ ▄▄▀\n █ █▀▀ █ ▀█▀█▀█\n ▄█▀▄ ▀▀█ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["eat_2", " ▄ ▄▄▄▄▄ ▄▄▄ \n ██▄███▀█████▀ \n▄█████▄█▄█▀█▀▄▄ \n▀█▀▀ ▀▀▀ ▄█▀▄▀ \n ▀▀█▀▀ █ ▄ ▀▀█\n ▄▀█ ▄▀▀▄▄▄██▄\n █▄▀▄ ▀▄▄█▀▀▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["happy", " ▄█ ▄█████▄▄██▀ \n █████▀▄▀████ \n████▀███▀▀ █▄▀█ \n █▄▄▄▄ ▄▄▀▀ █▄▄\n█ ▀▄▄▄ █ █ ▀ ▄▄▀\n ▀▀█ ▀▄▄██▀█▄ \n ▄▄▀▄ █▀▀▀▄█\n█▄█▄▄██▀▀█▄█▄█▄█"], ["injured_1", " ▄ ▄▄▄▄▄ ▄▄▄ \n ██▄██▀██████▀ \n▄██████▄▄█▀█▀ \n▀█▀▀ ▀▀▀ ▀▄▀█ \n ▀█▀▀▀ ▄▀▀ █▄▄\n ▄▀▀█ ▄█ ▀ ▄▄▀\n █▄▀ ▀▄▀▄ ▀█▀▀▄█\n█▄█▄█▄▀█▄█▄█▄█▄█"], ["injured_2", " \n ▄█ ▄█████▄▄██▀ \n █████▄▀▀████ \n████▀███▀▀ █ ▄▄ \n ▀▄▄▄▄▄ ▄▄▀▄▀ \n ▄▀▀█ ▄█ ▄ ▀▀█\n █▄▀ ▀▄▀▄▀▄▄▄██ \n█▄█▄█▄▀█▄█▄█▄█▄█"], ["sleep_1", " ▄ ▄▄▄▄▄ ▄▄▄ \n ██▄█████████▀ \n▄█████▄▄▄█▀█▀▄▄ \n▀█▀▀ ▀▀▀ ▄█▀▄▀ \n ▀█▀▀▀ █ ▄ ▀▀█\n█▀█▀█▀ ▄▀▄▄▄▀▀ \n██▄▄█▄ ██▀▀▀█▀▄ \n█▄█▄███▄█▄▄▄█▄▄█"], ["sleep_2", " ▄█ ▄█████▄▄██▀ \n █████▀▀▀████ \n████▀███▀▀ █▄▀█ \n ▀▄▄▄▄ ▄▀▀ █▄▄\n ▄▀▀▀ █ ▀ ▄▄▀\n█▀█▀█▀ ▄▀█▀█ \n██▄▄█▄ ██▀▀▀█▀▄ \n█▄█▄███▄█▄▄▄█▄▄█"], ["walk_1", " ▄█ ▄█████▄▄██▀ \n █████▀ ▄████ \n████▀███▀▀ █▄▀█ \n ▀▄▄▄▄▄ ▄▀▀ █▄▄\n ▄▄▀ ▄█ ▀ ▄▄▀\n █ █ █ ▀█▀█▄▄\n ▄█▀▄ ▀▀█▀▀▀▄█\n█▄█▄▄██▀▀█▄█▄█▄█"], ["walk_2", " ▄ ▄▄▄▄▄ ▄▄▄ \n ██▄███▀▀████▀ \n▄█████▄▄██▀█▀▄▄ \n▀█▀▀ ▀▀▀ ▄█▀▄▀ \n ▀▀█▀▀ █ ▄ ▀▀█\n ▄▀█ ▄▀▀▄▄▄██▄\n ▀▄▀▄ ▀▄▄▀▀▀█▄█\n █▄█▄███▀▄█▄█▄█ "]]], + ["rizegreymon_x", [["angry", " ▄ ▄▄▄▄▄ ▄▄▄ \n ██▄████▀███▀ ▄▄\n▄██████▄▄█▀█▄▀ █\n▀█▀ ▀▀ ▄▀ ▄█▄\n ▀▀█▀▀▀▀▀▄█▄▄▄▀\n ▄█ ▄▄ ▄█ ▄ █ \n █▄██▀▀█▀ ▄▄█▀█\n █▄█▄█▀█▄▄█▄█▄█ "], ["attack", " ▄█ ▄█████▄██▀ \n █████▀ ▄███ ▄▄\n███▀▀██▀▀▀ █▄▀ █\n ▀▄▄▄▄▄ ▄█▄ ▄█▄\n▄▀▀▀█▀▀▀█ ▄ █▄▄▀\n█ █ █████▄▄▄█▄▄▄\n▀▄▄▄█▄▄▄▄▄▄▄▀▀▄█\n█▄█▄▄▀▀▀▀▀▄█▄█▄█"], ["eat_1", " ▄█ ▄█████▄██▀ \n▄█████▀▄▀███ ▄▄\n█▀▄▄▄▀▀▀▀▀ █▄▀ █\n ▀██████ ▄▀▄ ▄█▄\n ▀█▀▀▀▄▀▀▄▄▄▄▄▀\n ▄▀████▄▄█ ▄ █▄▄\n ▀▄█▀▄ ▄▀ ▄▄█▄▀\n █▄█▄▄▀█▄▄█▄█▄█ "], ["eat_2", " ▄ ▄▄▄▄▄ ▄▄▄ \n ██▄███▀████▀ ▄▄\n▄█████▄█▄█▀█▄▀ █\n▀█▀ ▀▀ ▄▀ ▄█▄\n ▀▀█▀▀▀▀▀▄█▄▄▄▀\n ▄█ ▄▄ ▄█ ▄ █ \n █▄██▀▀█▀ ▄▄█▀█\n █▄█▄█▀█▄▄█▄█▄█ "], ["happy", " ▄█ ▄█████▄██▀ \n █████▀▄▀█▀ ▀█▄▄\n███▀▀██▀▀█ █ █\n ▀▄▄▄▄▄▄▄█▀ ▀██▄\n ▄▀ █ ▀ █▄▀\n ▄▀█▄██▄▄ ▀█▀▄▄▄\n ▀▄█▀▄ ▀▄▀▀▀▄▄▀\n █▄█▄▄▀▀▀▄█▄█▄█ "], ["injured_1", " \n ▄█ ▄█████▄██▀ \n ██████ ▀███ ▄▀█\n███▀▀██▀▀▀ █▀ ▄▀\n ▀▄▄▄▄▄▄▄▄▀▄▄▀▀█\n ▄█▄ ██▄▄█ \n █ ▀ █ ▄█ ▀ █\n █▄▄▄██████▄▄▄▄█"], ["injured_2", " \n ▄ ▄▄▄▄▄ ▄▄▄ \n ██▄███▀████▀▄▀█\n▄██████▄▄█▀█▀ ▄▀\n▀█▀ ▀▀ ▄▀▄▀▀█\n ███▀▀▀▀▀▄█▄▄█ \n █ ▀ █ █ ▀ █\n █▄▄▄██████▄▄▄▄█"], ["sleep_1", " \n ▄█ ▄█████▄██▀▄▄\n █████▀▀▀███▄▀ █\n███▀▀██▀▀▀ █ ▄█▄\n ▀▄▄▄▄▄▄▄▄▀▄ ▄▀\n ▄█ ▄▄ █▀▀▀█ \n █▄██▀▀▄▀ ▀ █▀█\n █▄█▄██▄▄▄▄████ "], ["sleep_2", " ▄ ▄▄▄▄▄ ▄▄▄ \n ██▄████████▀ ▄▄\n▄█████▄▄▄█▀█▄▀ █\n▀█▀ ▀▀ ▄▀ ▄█▄\n ▀▀█▀▀▀▀▀▄█▄▄▄▀\n ▄█ ▄▄ ▄█ ▄ █ \n █▄██▀▀█▀ ▄▄█▀█\n █▄█▄█▄█▄▄█▄█▄█ "], ["walk_1", " ▄█ ▄█████▄██▀ \n █████▀ ▄███ ▄▄\n███▀▀██▀▀▀ █▄▀ █\n ▀▄▄▄▄▄▄▄▄▀▄ ▄█▄\n ▄▀ ▀▄▄▄▄▄▀\n ▄▀█▄██▄▄█ ▄ █▄▄\n ▀▄█▀▄ ▄▀ ▄▄█▄▀\n █▄█▄▄▀█▄▄█▄█▄█ "], ["walk_2", " ▄ ▄▄▄▄▄ ▄▄▄ \n ██▄███▀▀███▀ ▄▄\n▄█████▄▄██▀█▄▀ █\n▀█▀ ▀▀ ▄▀ ▄█▄\n ▀▀█▀▀▀▀▀▄█▄▄▄▀\n ▄█ ▄▄ ▄█ ▄ █ \n █▄██▀▀█▀ ▄▄█▀█\n █▄█▄█▀█▄▄█▄█▄█ "]]], + ["roachmon", [["angry", " ▄▄ \n ▄▀ ▄▀▀▀▄ \n ▄▀ █ ▄▀▀▀█\n ▀▄▄▄████▄▀ ▄▀ \n▄▀███▀██▄▀█▀▀ \n█▄▄█▄▄███████▄▄▄\n▀▄▀ ▀▄█ █▀█▀█▀█▄\n█▄██▀▀▀▀█▄▄█▄█▄█"], ["attack", " ▄▀ ▄▀▀ ▄▀█ \n█ █ █ █ \n █ ▀▄ █ █▄▄▀█\n ▄██████▀███ ▄▀\n█ ▀█▀ ███▄███▀ \n█▀█▀█▀█▀███████▀\n█ ▄ ▄ █ █ █ █▀ \n ████▀█▄▄█▄█▄█▄ "], ["eat_1", " ▄▀▀ ▄▄▄ \n █ ▄▀ ▀ ▄▄▄▄\n █ █▄▄▄ ▄▀ ▄▀\n ▄▀██▀██▀█▄▄▄▀ \n█ ▀█ ▀███▄█▄▄ \n█▀█▀█▀█▀███████▀\n█▄ ▄█▄ █ █ █ \n ████▀▀█▄▄█▄█▄█ "], ["eat_2", " ▄▄ \n ▄▀ ▄▀▀▀▄ \n ▄▀ █ ▄▀▀▀█\n ▀▄▄▄████▄▀ ▄▀ \n▄█▀███▀█▄▀█▀▀ \n█▄█▄█▄█▄█████▄▄▄\n▀▄▀ ▀▄█ █▀█▀█▀█▄\n█▄██▀▀▀▀█▄▄█▄█▄█"], ["happy", " ▄▀▀ ▄▄▄ \n █ ▄▀ ▀ ▄▄▄▄\n █ █▄▄▄ ▄▀ ▄▀\n▄█▀███▀██▀▄▄▄▀ \n█▄█▄█▄█▄██ █▄ \n█▀█▀█▀█▀███████▀\n█▄ ▄█▄ █ █ █ \n ████▀▀█▄▄█▄█▄█ "], ["injured_1", " \n ▄▀▀ ▄▄▄ \n █ ▄▀ ▀ ▄▄▄▄\n █ █▄▄▄ ▄▀ ▄▀\n ▄██████▀█▄▄▄▀ \n█▀ ██ ▀██▄█▄▄ \n█▀█▀█▀█▀█▀█▀█▀█▀\n▄█▄▄▄██▄██▄█▄█▄█"], ["injured_2", " \n ▄▄ \n ▄▀ ▄▀▀▀▄ \n ▄▀ █ ▄▀▀▀█\n ▀▄▄▄████▄▀ ▄▀ \n▄█▀██▀██▄▀█▀▀ \n█▄▄██▄▄██████▄▄▄\n█▄█▄▄▄█▄█▄█▄█▄█▄"], ["sleep_1", " ▄▄ \n ▄▀ ▄▀▀▀▄ \n ▄▀ █ ▄▀▀▀█\n ▀▄▄▄████▄▀ ▄▀ \n▄███████▄▀█▀▀ \n█▄▄██▄▄██████▄▄▄\n▀▄▀ ▀▄█ █▀█▀█▀█▄\n█▄██▀▀▀▀█▄▄█▄█▄█"], ["sleep_2", " \n ▄▀▀ ▄▄▄ \n █ ▄▀ ▀ ▄▄▄▄\n █ █▄▄▄ ▄▀ ▄▀\n ▄██████▀█▄▄▄▀ \n█▀▀██▀▀██▄█▄▄ \n█▀█▀█▀█▀█▀█▀█▀█▀\n▄█▄▄▄██▄██▄█▄█▄█"], ["walk_1", " ▄▀▀ ▄▄▄ \n █ ▄▀ ▀ ▄▄▄▄\n █ █▄▄▄ ▄▀ ▄▀\n ▄▀██▀██▀█▄▄▄▀ \n█ ▀█ ▀███▄█▄▄ \n█▀█▀█▀█▀███████▀\n ▀▄▄▄██▄ █ █ █ \n █▄▄█ █▄▄█▄█▄█ "], ["walk_2", " ▄▄ \n ▄▀ ▄▀▀▀▄ \n ▄▀ █ ▄▀▀▀█\n ▀▄▄▄████▄▀ ▄▀ \n▄▀▄█▀▄██▄▀█▀▀ \n█▄▄█▄▄███████▄▄▄\n▀▄▀ ▀▄█ █▀█▀█▀█▄\n█▄██▀▀▀▀█▄▄█▄█▄█"]]], + ["rosemon", [["angry", " \n ▄▀▄▀▀▀▄▀▀▄ \n▄▄█ █ █ █▄▄ \n▀██ █▄ ▄▄▀ ██▀ \n▄▀ █ ▄▀▀▄ ██ ▀▄ \n█ ▀ █▄▄▄▄▀█ ▀ █ \n██▀▀█▄▀▄▄█▀▀███▄\n█▄▄▄█▀▀▀▀█▄▄▄███"], ["attack", " ▄▀▀▀▀▄▀▀▄ \n █ ▄▀ █ \n▄▄▄ ▀▄▄ █ ███\n▀▄ ▀▄█ ▀▀▀▄▄▄█▀ \n █▀▀▀▀▀█▀▀▄██ \n█▄▄█▀█▀▀▀ █ ██ \n ▄█▀█ ▄█▄▄▀▄▀██ \n█▄▄▄▄▀ █▄▄█▄▄███"], ["eat_1", " ▄▀▄▀▀▀▄▀▀▄ \n █ █ █ █ \n███ █▀▄▄▀▀█ ███ \n ▀█▄▀▄▄▄▄▄ ███ \n █ ▀▀████▀▀▀ █ \n██▄▄█▄▄▄▄█▄▄███▄\n███▀▀▄▄▄▄▀▀█████\n██▄▄▄█ █▄▄▄█▀██"], ["eat_2", " \n ▄▀▄▀▀▀▄▀▀▄ \n▄▄█ █ █ █▄▄ \n▀██ █▄ ▄▄▀ ██▀ \n ███▄ ▀▀ ▄████▄ \n▄██ ▀█▀▀ ████ \n██▀▀▄▄▀▄▄█▀▀███▄\n█▄▄▄█▀▀▀▀█▄▄▄███"], ["happy", " ▄▀▄▀▀▀▄▀▀▄ \n █ █ █ █ \n███ █▀▄▄▀▀█ ███ \n▄▀█▄▀▄▄▄▄▄▀▄█▀▄ \n▀▄ ▀▀████▀▄▀ ▄█ \n▄██▄█▄▄▄▄█▄▄███ \n███▀▀▄▄▄▄▀▀█████\n██▄▄▄█ █▄▄▄█▀██"], ["injured_1", " \n ▄ ▄▄▄ ▄▄ \n ▄▀▄▀ ▀▄ █ \n▄▄█ █ █ █▄▄ \n▀██▄▀▀▄▄▀▀▄▄██▀ \n ██ ▀▄▄▄▄▀▄▄██ \n █ ▀█▄▄▄▄█ ██▄ \n██▄▄█▄▄▄▄█▄▄████"], ["injured_2", " \n \n ▄▀▄▀▀▀▄▀▀▄ \n▄█ █ █ █▄▄▄ \n▀█ █▄ ▄▄▀ ███▀ \n▄█▀█ ▀▀ ▄▀▀███ \n█ ▀▄████▄▄█ █▄ \n█▄▄█▄▄▄▄▄▄█▄▄███"], ["sleep_1", " ▄▀█▀▀█▀▄ \n █ █ █ █ \n █ █ █ █ \n █ ▄▀███▀█▄ █ \n █ ██▀▄▄███ \n ███▀▄█████ \n ███ ██████▄ \n ▄████▄████████▄"], ["sleep_2", " ▄▄▄▄▄▄ \n ▄▀▄▀ ▀▄▀▄ \n ▄▀ █ █ ▀▄ \n █▄▀█████▀█▄█ \n █ ████▀▀▄███ \n █████▀▄█████ \n ▄████▀▄██████▄ \n▄█████▄████████▄"], ["walk_1", " ▄▀▄▀▀▀▄▀▀▄ \n █ █ █ █ \n███ █▄ ▄▄▀ ███ \n ███▄ ▀▀ ▄████ \n ██▀▄▀▀▀▀▄ ███▄ \n▄▀ █▄▀▀▄█ ▀██▄\n███▀▀▄▄▄▄▀▀█████\n██▄▄▄█ █▄▄▄█▀██"], ["walk_2", " ▄ ▄▄▄ ▄▄ \n ▄▀▄▀ ▀▄ █ \n▄▄█ █ █ █▄▄ \n▀██▄▀▀▄▄▀▀▄▄██▀ \n ██▀▀▄▄▄▄▀▀███ \n█▀ ▄█ ▄▄ █▄ ▀██ \n██▀▀█▀ ▀█▀▀████\n█▄▄▄█▀▀▀▀█▄▄▄███"]]], + ["rosemon_x", [["angry", " \n▄ █▀▄▀▀▀▄▀█ ▄ \n█▄█ █ █ █▄█ \n▀██ █▄ ▄▄▀ ██▀ \n▄▀ █ ▄▀▀▄ ██ ▀▄ \n█ ▀ █▄▄▄▄▀█ ▀ █ \n▄██▀▀▄▀▄▄▀▀█████\n██▄▄▄█▀▀█▄▄▄█▀██"], ["attack", " ▄▀▀▀▀▄▀█ ▄\n █ ▄▀ █▄█\n▄▄▄ ▀▄▄ █ ▄███▀\n▀▄ ▀▄█ ▀▀▀▄███▀ \n █▀▀▀▀▀█▀▀▄██▄ \n█▄▄█▀█▀▀▀ █▀██▄ \n ▄█▀ ▄█▄▄▀▄▀██▄\n▄█▄▄▄▄▀▀█▄█▄▄███"], ["eat_1", "▄ █▀▄▀▀▀▄▀█ ▄ \n█▄█ █ █ █▄█ \n▀██ ▀▀▄▄▀▀▀ ███ \n ▀██ ▄▄▄▄▄ ██▀ \n █ ▀▀████▀▀▀ █ \n █▄▄█▄ ▄▄█▄▄██▄ \n████▀ ▄▄ ▀█████▄\n███▄▄█ █▄▄██▀██"], ["eat_2", " ▄▄ ▄▄▄ ▄▄ \n█ ▄▀▄▀ ▀▄▀▄ █ \n███ █ █ ███ \n ██▄▀▀▄▄▀▀▄▄██▀ \n ▄█▀█▄▄▄▄█▀▀█▄ \n █ ▀█▀▄▀ █▀ █▄ \n███▀▀▀▄█▀▀▀████▄\n██▄▄▄▀ ▀▄▄▄█▀██"], ["happy", "▄ █▀▄▀▀▀▄▀█ ▄ \n█▄█ █ █ █▄█ \n▀██ █▄ ▄▄▀ ██▀ \n █▀█▄ ▀▀ ▄█▀▀█ \n ▀▄ ████ ▄█ \n ▄██▄▄▀▄▄█████ \n▄███▀ ▄▄ ▀█████▄\n███▄▄█ █▄▄██▀██"], ["injured_1", " \n ▄▄ ▄▄▄ ▄▄ \n█ ▄▀▄▀ ▀▄▀▄ █ \n███ █ █ ███ \n ▀█▄▀▀▄▄▀▀▄▄██▀ \n ██ ▀▄▄▄▄▀▄▄█▄ \n █ ▀█▄█▄▄█▀ ██▄ \n██▄▄█▄▄▄▄█▄▄████"], ["injured_2", " \n \n▄ █▀▄▀▀▀▄▀█ ▄ \n█▄█ █ █ █▄█ \n▀██ █▄ ▄▄▀ ██▀ \n ▄█▀▄ ▀▀ ▄▀██▄ \n █ ▀▄████▄▀ ██▄ \n██▄▄█▄▄▄▄█▄▄████"], ["sleep_1", "▄ █▀▄▀▀▀▄▀█ ▄ \n█▄█ █ █ █▄█ \n▀██ █▄▄▄▄▄▀ ███ \n ▀█▄█▀█████▄█▀ \n ▄█▄▀██▀▄█▄ \n ███▄▀▄████ \n ▄█████▄▀███▄ \n ▄████████▄███▄ "], ["sleep_2", " ▄▄ ▄▄▄ ▄▄ \n█ ▄▀▄▀ ▀▄▀▄ █ \n███ █ █ ███ \n ██ ██████▄ ██▀ \n ▀██ ████▀██ \n ██▄▀█▀▄███ \n ▄███▄▀█████▄ \n ▄██████▄█████▄ "], ["walk_1", "▄ █▀▄▀▀▀▄▀█ ▄ \n█▄█ █ █ █▄█ \n▀██ █▄ ▄▄▀ ███ \n ▀██▄ ▀▀ ▄███▀ \n ▄█▀▄█▀█▀▄▀███ \n █ █▄▀▄▄█ ██▄ \n████▀ ▄▄ ▀█████▄\n███▄▄█ █▄▄██▀██"], ["walk_2", " ▄▄ ▄▄▄ ▄▄ \n█ ▄▀▄▀ ▀▄▀▄ █ \n███ █ █ ███ \n ██▄▀▀▄▄▀▀▄▄██▀ \n ▄█▀▀▄▄▄▄▀▀██▄ \n █ ▄█▀▄▀ █▄ █▄ \n███▀▀▀▄█▀▀▀████▄\n██▄▄▄▀ ▀▄▄▄█▀██"]]], + ["rusttyrannomon", [["angry", "▄▄ ▄▄ ▄▄ \n█ █ █▄█▄█▄█ \n█ ▄█▀ ▄▄ ▄▀▄▄▀▄ \n█ ▀ ▄▀ █\n▀▄▀▄▀▄▀▄█▀▀█ █\n█▄▀█▀▀█▄ █ ▀▄▄▄▀\n▀▄▄█▄ ▀▄▄█▄▀▀▀▄ \n█▄█▄▄██▀▀▀▄█▄█▄█"], ["attack", " ██▀██▀█▀▄▄▄ \n▄▄▀█▀▀██▀▄▄█▄▀▄ \n█ █ ██▄█▄█▄█ ▀█ \n█ ▄█▀ ▄▄ ▄▀▄▄▀█ \n█ ▀▀ ▄▀ █\n▀▄▀▄▀▄▀▄█▀▀█ █\n█▄▀█▀▀█▄ █ ▀▄▄▄▀\n▀▄▄█▄▄█▄▄█▄█▄█▄█"], ["eat_1", "█▀▄ ▄▀█ ▄▀█ \n█ ▀▄▄▀▀▀▀▀█▀ ▄ \n█ ▀▀ ▄█▀ ▀ █▀ ▀▄\n█ ▄ ▄ ▄ ▄▄█▄ █\n ▀ ▀ ▀ ██ █ █\n ▄▀▄▀▄▀▄ █▄▄▀▀▀ \n ▀███▀▀▄▄█ ▀▄ \n █▄█▄██▀█▄█▄█▄█ "], ["eat_2", "█▀▄ ▄▀█ ▄▀█ \n█ ▀▄▄▀▀▀▀▀█▀ ▄ \n█ ▀▀ ▄▀▄ ▀ █▀ ▀▄\n█ ▄ ▄ ▄ ▄▄█▄ █\n▄█▄█▄█▄█▄ █ █\n█▄ █ █▄ █▄▄▀▀▀ \n█▄▄█▄ █▄▄█ ▀▄ \n █▄█▄███▀▄█▄█▄█ "], ["happy", "█▀▄ ▄▀█ ▄▀█ \n█ ▄█▀▀▀▀▀▀█▀▀▄ \n█ ▄▀▄ ▀ █▀ ▀▄\n█▄ ▄ ▄▄▄▄▄█▄ █\n█▄█▄█▄█▄ █ █ █\n▀▄▄█ ▀▄▄█▄▄▀▀▀ \n ▄█▄ █ ▀▄ \n █▄█▄███▀▄█▄█▄█ "], ["injured_1", " \n█▀▄ ▄▀█ ▄▀█ \n█ ▀▄▄▀▀▀▀▀█▀ ▄ \n█ ▀▀ █▄▄ ▀ █▀ ▀▄\n█ ▄ ▄ ▄ ▄▄█▄ █\n▄▀▄█▄█▄▀█▄▄█▄▄▄█\n█ █▄▀█▀█ ▀ ▀ █ \n█▄███▄▄███████▀ "], ["injured_2", " \n \n█▀▄ ▄██▄███ \n█ ▄█▀ ▄▀▄ ▄ \n█ ▀▀▀ ▄█▀ ▀▄\n▀▄▀▄▀▄▀▄█▀▀█ █\n█ ▀██▀█▄█▀█▀█▀█▀\n█▄███▄▄██▄▄▄▄▄█ "], ["sleep_1", " \n█▀▄ ▄██▄███ \n█ ▄█▀ ▄▀▄ ▄ \n█ ▀▀▀ ▄█▀ ▀▄\n▀▄▀▄▀▄▀▄█▀▀█ █\n ▀█▀▀▀▄▄▄ ▀▄ █\n ▄██▄ █ ▄ █▀▀▀█ \n█▄█▄▄██▀▀▀▄█▄█▄█"], ["sleep_2", " ▄▄ ▄▄ ▄▄▄ \n █ ▀▄▄▀▀▀▀▀█▀ \n █ ▀▀ ▄▄▄ ▀ █▄ \n █ ▄ ▄ ▄ ▄▄█▀ ▀▄\n ▀▄█▄█▄█▀▀█ █\n ▄▀▀▀▄▄▄ ▀▄ █\n ▄██▄ █ ▄ █▀▀▀█ \n█▄█▄▄██▀▀▀▄█▄█▄█"], ["walk_1", "█▀▄ ▄▀█ ▄▀█ \n█ ▀▄▄▀▀▀▀▀█▀ ▄ \n█ ▀▀ ▄█▀ ▀ █▀ ▀▄\n█ ▄ ▄ ▄ ▄▄█▄ █\n▄▀▄█▄█▄▀▀▄ █ █\n█▀ █ █▀ █▄▄▀▀▀ \n ▀██▄ ▀▀█ ▀▄ \n █▄█▄███▀▄█▄█▄█ "], ["walk_2", "▄▄ ▄▄ ▄▄ \n█ █ █▄█▄█▄█ \n█ ▄█▀ ▄▄ ▄▀▄▄▀▄ \n█ ▀▀ ▄▀ █\n▀▄▀▄▀▄▀▄█▀▀█ █\n█▄▀█▀▀█▄ █ ▀▄▄▄▀\n▀▄▄█▄ ▀▄▄█▄▀▀▀▄ \n█▄█▄▄██▀▀▀▄█▄█▄█"]]], + ["ryudamon", [["angry", " ▄▄▄▄▄ ▄▄▄▄ \n ▄▀████▀▀▀ ▄▀ \n█ ▀▀▀▄▄▄▄▄█▀ \n█▀▀▀▀ ▄█ █▄█ \n▀█▀▀ ▀█▄█ \n▄▀▀█▀ ▄▀██▄▄█▄▄\n▀▄▄▀▄ ▀▄██▄██▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["attack", " ▄▄▀█████▄▀▀▀█ \n█▀▀▀▀▀ ▄▄▀ \n█▀▀▀▀▀▀█▀█▀▄ \n▀████▄▀▀ █▀▄ \n ▄████ ▄▄█▀█▄▄▄\n█ ▀▄▄▄ █ ███ ▄▀\n ▀█▄▄ ▀█▀▀▀█▄ \n █▄█▄████▄█▄█▄█ "], ["eat_1", " ▄▄▀█████▄▀▀▀█ \n█▀▀▀▀▀ ▄▄▀ \n█▀▀▀▀▀█▀▀█▀▄ \n▀███▄▀ ▀ ██▀▄ \n ▀█▀▀ ███▀▄ \n ▄▀█▀ ▄▀█▄█▄█▀▀█\n █▄▀▄ ▀▄██▄▀▀▀█ \n█▄█▄▄██▀▀▀▄█▄█▄█"], ["eat_2", " ▄▄█████▄▀▀▀█ \n▄▀▄██▀▀ ▄▄▀ \n█▄▄▄▄▀█▀▀█▀▄ \n█▄▄▄ ▀ ▀ ██▀▄ \n ▀▄▄▄ ▄▄▀█▀▀▄ \n █ █ █ ██▀██ ▀█\n ▄█▀▄ ▀▀▀█ ▀█ \n█▄█▄▄██▀▀▀▄█▄█▄█"], ["happy", " ▄▄██████▄▀▀▀█ \n█▀▀▀▀▄▄▄▄▄▄▄▀ \n█▀▀▀▀▄▀▄ █▀▄ \n████▄ ▄▀▀█▄ \n █▀▀▀ ▀▄▄█▀█ \n ▀█▀ ▀██▀▀█\n ▄█▄ ▄▀▀▀█▀ \n █▄█████▀▄█▄█▄█ "], ["injured_1", " ▄▄▄▄▄ ▄▄▄▄ \n ▄▀████▀▀▀ ▄▀ \n█ ▀▀▀▄▄▄▄▄█▀ \n█▀▀▀▀ ▄ █▄█ \n▀█▀▀ ▀▀ ▀█▄█ \n▄▀▀█▀ ▄▀██▄▄█▄▄\n▀▄▄▀▄ ▀▄██▄██▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["injured_2", " \n ▄▄█████▄▀▀▀█ \n▄▀▄██▀▀ ▄▄▀ \n█▄▄▄▄▀▀▀▀█▀▄ \n█▄▄▄ █▄ ██▀▄ \n █▄▄ ▄█▀▀▄ \n ▄█▀▄ █ ██▀█▀▄\n█▄█▄▄█▄▄▄███████"], ["sleep_1", " \n ▄▄█████▄▀▀▀█ \n▄▀▄██▀▀ ▄▄▀ \n█▄▄▄▄▀▀▀▀█▀▄ \n█▄▄▄ ▀▀ ██▀▄ \n ▀▄▄▄ ▄███▄ \n █▄▀▄ █ ██▄██▄\n█▄█▄▄█▄▄▄███▄█▄█"], ["sleep_2", " ▄▄▄▄▄ ▄▄▄▄ \n ▄▀████▀▀▀ ▄▀ \n█ ▀▀▀▄▄▄▄▄█▀ \n█▀▀▀▀▄▄ █▄█ \n▀█▀▀ ▀█▄█ \n▄▀▀█▀ ▄▀██▄▄█▄▄\n▀▄▄▀▄ ▀▄██▄██▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["walk_1", " ▄▄█████▄▀▀▀█ \n▄▀▄██▀▀ ▄▄▀ \n█▄▄▄▄▀██▀█▀▄ \n█▄▄▄ ▀▀ ██▀▄ \n ▀▄▄▄ ▄▄▀█▀▀▄ \n █ █ █ ██▀██ ▀█\n ▄█▀▄ ▀▀▀█ ▀█ \n█▄█▄▄██▀▀▀▄█▄█▄█"], ["walk_2", " ▄▄▄▄▄ ▄▄▄▄ \n ▄▀████▀▀▀ ▄▀ \n█ ▀▀▀▄▄▄▄▄█▀ \n█▀▀▀▀▄█▀ █▄█ \n▀█▀▀ ▀█▄█ \n▄▀▀█▀ ▄▀██▄▄█▄▄\n▀▄▄▀▄ ▀▄██▄██▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"]]], + ["saberdramon", [["angry", " \n \n \n ▄▄█████▀ \n ▄▄███▀██▀ ███▄ \n█▄▄██▄███ ████▀█\n ▀▄▄█████ ▀▀▄▄▄▀\n ▀█████▀▀ "], ["attack", " ▀█▀█▄▄▄▄█▄ \n ▄███▀█▀ ███▄ \n▄▀▀▀██▄▄█ █████▄\n▀███▄▄▀███ █████\n ██▀▀█ █▀▄██▀▀▄\n ▄█▄▄▀▀▄█████▄██\n ▀▄▄▄█▀▀▄██████▀\n ▀█████▀▀ "], ["eat_1", " ▄▄▄▄▄▄ \n ▄██████▀ \n▄▀▀██ ▄███ \n▀▀▀▀▀█████▀██▄▄ \n ████ █████\n █▀▀█████ █████▀\n ▀▀▀▀▀▀▄█████▀ \n ███▀▀ "], ["eat_2", " ▀███▄ █▄ \n ▀████ ███▄ \n █▀▀▀▀ ████▄\n ▄▄███▀▄█████\n ▄▄███▀█▄▀█▀▀▀▄▄\n█▄▄██▄█▄█ ██▄███\n ▀▄▄██▀▀▄██████▀\n ▀█████▀▀ "], ["happy", " ▄▄▄▄▄▄ \n ▄██████▀ \n▄▀▀██ ▄ ██ \n▀▀▀▀▀█████▀██▄▄ \n ████ █████\n █▀▀█████ █████▀\n ▀▀▀▀▀▀▄█████▀ \n ███▀▀ "], ["injured_1", " \n \n \n ▄▄▄▄▄▄ \n ▄████▀▀▄▄██▄ \n▄▀▀█▄▀███ ██████\n▀█▀▀███▀▄███████\n ▀▀▀▀▀███████▀ "], ["injured_2", " \n \n \n \n ▄▄███▀▄███▄ \n ▄▄██▀███ ██████\n█▄▄███▄▀▄███████\n ▀▄▄██▄███████▀ "], ["sleep_1", " \n \n \n ▄▄▄▄▄▄ \n ▄████▀▀▄▄██▄ \n▄▀▀██▀▀██ ██████\n▀█▀▀███▀▄███████\n ▀▀▀▀▀███████▀ "], ["sleep_2", " \n \n \n ▄▄█████▀ \n ▄▄██████▀▄███▄ \n█▄▄██▄▄██ ██████\n ▀▄▄███▀▄███████\n ▀███████▀ "], ["walk_1", " ▀███▄ █▄ \n ▀████ ███▄ \n █▀▀▀▀ ████▄\n ▄▄███▀▄█████\n ▄▄██▀▀█▄▀█▀▀▀▄▄\n█▄▄██▄███ ██▄███\n ▀▄▄██▀▀▄██████▀\n ▀█████▀▀ "], ["walk_2", " \n ▄▄█████▀ \n ▄▄██▀▀██▀▄▄▄ \n█▄▄██▄███ █████▄\n ▀▄▄██▀▀▄ ██████\n ▀█▀▄█████ \n █████▀ \n ▀▀▀ "]]], + ["saberleomon", [["angry", " \n ▄▄ ▄▄▄ \n █▄▀▀▀▀▀ █ ▄▄ \n▄▀ ▄█▀ █▄ ▀▄▀█\n█▄▄▄▄▄▄ ▀████▀▄█\n█▀▄▄▄█ █ ▀█▀ ██▄\n▀▄█▄▀▀▄█▄ ▄▄ ██\n █▄▄██▄▄▄▄█▄▄▄▄█"], ["attack", " ▄▀█▄▄▄▄▀█ \n ▄█▀ ▄▄ ▄▀ ▄▄ \n█▄▄▄▄▀▀ ▄█ ▀▄▀█\n█▀████▀▄▀████▀▄█\n█ ████ █ ▀█▀ ██▄\n ▀█▀▀ ▀▀ ▄ ██\n █▀▀▄ █▄▄█▄ █\n █▄▄█▄▄▄▀ █▄▄▄█"], ["eat_1", " ▄▀█▄▄▄▄▀█ \n ▄█▀ ▄ ▄▀ ▄▄ \n█▄▄▄▄▀ ▀ ▄█ ▀▄▀█\n █████▀▄ ████▀▄█\n █ ███ █ ▀█▀ ██▄\n ▄▀▀▀▀▀ ▄ ██\n ▀█▀▀▄ █▄▄█▄ █\n █▄▄█▄▄▄▀ █▄▄▄█"], ["eat_2", " ▄▄ ▄▄▄ \n █▄▀▀▀▀▀ █ ▄▄ \n▄▀ ▄▀▄ █▄ ▀▄▀█\n█▄▄▄▄▄▄ ▀████▀▄█\n█▀▄▄▄█ █ ▀█▀ ██▄\n▀▄█ █▀▄█ ▄ ██\n ▄█ ▄ █▄▄█▄ █\n █▄▄█▄▄▄▀ █▄▄▄█"], ["happy", " ▄▀█▄▄▄█▀█ \n ▄▀▀ ▄ ▄▀ ▄▄ \n█ ▀ ▀ ▄█▄ ▀▄ █\n█▀████▀▄ █▄▄█▀▄█\n█ ████ █ ▀█▀ ██▄\n▀█████▀ ▄ ██\n █▄▄▄▄█ █▄▄█▄ █\n█▄▄█ █▄▄▄▀ █▄▄▄█"], ["injured_1", " \n \n ▄▀█▄▄█▀▀█ \n ▄▀▀ █ \n█ ▀▀ ▄█▄▄█▀▀▄\n██▀▀▀█▀▄ ███▀▀▄▀\n█ █▀▀█ █ ▀▄▄▀██\n █▄█▄▄█▄▄▄█▄▄▄▄█"], ["injured_2", " \n \n ▄▄ ▄▄▄▄ \n █▄▀▀▀▀ ▄▀ \n▄▀ █▄ ▄█▄▄█▀▀▄\n█▄▄▄▄▄▄ ███▀▀▄█\n█▀▄▄▄█ █▄ █▄▀ ▀█\n▀▄█▄▄█▄█▄█▄▄▄▄▄▀"], ["sleep_1", " \n \n ▄▄ ▄▄ \n █▄▀▀▀▀▀ ▄█ \n ▄▀ ▄▄ ████▄ \n █▄▄▄▄▄▄ ▀███ ██\n █▀▄▄█ █ █▄ █\n █▄█▄▄▄█▄▄█▄▄▄▄▀"], ["sleep_2", " \n ▄▄ ▄▄ \n █▄▀▀▀▀ ▄█ \n ▄▀ ▄▄ █▄▄▄ \n █▄▄▄▄▄▄ ▀█████▄\n █▀▄▄▄█ █ ▀█▀ ██\n ▀▄█▄▄▀▄█ ▄▄ █\n █▄▄█▄▄▄▄▄█▄▄▄▄▀"], ["walk_1", " ▄▄ ▄▄▄ \n █▄▀▀▀▀▀ █ ▄▄ \n▄▀ ▄█▀ █▄ ▀▄▀█\n█▄▄▄▄▄▄ ▀████▀▄█\n█▀▄▄▄█ █ ▀█▀ ██▄\n▀▄█ █▀▄█ ▄ ██\n ▄█ ▄ █▄▄█▄ █\n █▄▄█▄▄▄▀ █▄▄▄█"], ["walk_2", " ▄▀█▄▄▄▄▀█ \n ▄▀▀ ▄▄ ▄▀ ▄▀█▄\n█ ▀▀ ▄██▄▄█ █\n██▀▀▀█▀▄ ███▀▄█▀\n█ █▀▀█ █ ▀ ▀██\n █▀ █ ▀█▄█ █ ▀█\n▄▀ █▄▄▄▀ ▀█▀█ █\n▀▀▀ █▄█▄▄█"]]], + ["sakumon", [["angry", " \n \n ▄█ \n █ █ \n █ █ \n ▄▀█▄▄▀▀▀▄ \n █ █▄▀ ▄█ █ \n ▀▄▄▄█▄▄▄▄▄▀ "], ["attack", " \n \n ▄█ \n █ █ \n █ █ \n ▄▀█▄█▀▀▀▄ \n █ █ ▀ █ █ \n ▀▄▄▄█▄▄▄▄▄▀ "], ["eat_1", " \n \n ▄█ \n █ █ \n █ █ \n ▄▀█▄█▀▀▀▄ \n █ █ ▀ █ █ \n ▀▄▄▄█▄▄▄▄▄▀ "], ["eat_2", " ▄ \n ▄▀█ \n █ ▀▄ \n ▄█ ▄█▄▄ \n ▄▀▄▀█▀▄ ▀▄ \n █ ▀ ▀ █ \n █ ███ █ \n ▀▄███▄▄▄▀ "], ["happy", " \n ▄█ \n █ █ \n █ █ \n ▄▀█▄█▀▀▀▄ \n █ ▄ ▀ ▄ █ \n █▀ ▀ ▀ ▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["injured_1", " \n ▄█ \n █ █ \n █ █ \n ▄▀█▄█▀▀▀▄ \n █ ▄ ▀ ▄ █ \n █▀▀ ▀▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["injured_2", " \n ▄ \n ▄▀█ \n █ ▀▄ \n ▄█ ▄█▄▄ \n ▄▀ ▀█▀ ▀▄ \n █▄█ █▄ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["refuse", " ▄ \n ▄▀█ \n █ ▀▄ \n ▄█ ▄█▄▄ \n ▄▀ ▀█▀ ▀▄ \n █ █ █ █ \n █ ▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["sleep_1", " \n ▄ \n ▄▀█ \n █ ▀▄ \n ▄█ ▄█▄▄ \n ▄▀ ▀█▀ ▀▄ \n █▄▄ ▄▄ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n ▄ \n ▄▀█ \n █ ▀▄ \n ▄█ ▄█▄▄ \n ▄▀ ▀█▀ ▀▄ \n █▄▄ ▄▄ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["walk_1", " \n ▄█ \n █ █ \n █ █ \n ▄▀█▄█▀▀▀▄ \n █ ▄ ▀ ▄ █ \n █ ▀ ▄ ▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["walk_2", " \n \n ▄█ \n █ █ \n █ █ \n ▄▀█▄█▀▀▀▄ \n █ █ ▀ █ █ \n ▀▄▄▄█▄▄▄▄▄▀ "]]], + ["sakuttomon", [["angry", " \n \n ▄█ ▄█ \n ▄▀█ ▄▀█ \n █ █▀▀▀▀▀▀█ █ \n ▄▀█ ▄ ▄ █▀▄ \n █ █ ▀▀ ▀▀ █ █ \n ▀▀█▄███▄▄█▀▀ "], ["attack", " \n \n ▄█ ▄█ \n ▄▀█ ▄▀█ \n █ █▀▀▀▀▀▀█ █ \n ▄▀█ ▄ ▄ █▀▄ \n █ █ ▀ ▄ ▀ █ █ \n ▀▀█▄█▄█▄▄█▀▀ "], ["eat_1", " \n \n ▄█ ▄█ \n ▄▀█ ▄▀█ \n █ █▀▀▀▀▀▀█ █ \n ▄▀█ ▄ ▄ █▀▄ \n █ █ ▀ ▄ ▀ █ █ \n ▀▀█▄█▄█▄▄█▀▀ "], ["eat_2", " \n ▄█ ▄█ \n ▄▀█ ▄▀█ \n █ █▀▀▀▀▀▀█ █ \n ▄▀█ █ ▄ █ █▀▄ \n █ █ ███ █ █ \n ▀█ ███ █▀ \n ▀▄▀▀▀▀▀▀▄▀ "], ["happy", " \n ▄ ▄ \n ██ ██ \n █ █▄▄▄▄▄▄█ █ \n █▄▀ ▀▄█ \n █ █▄▀▄ ▄▀▄ █ █ \n ▀▄█ ▄█▄ █▄▀ \n ▀▄▀▀▀▀▀▀▄▀ "], ["injured_1", " \n ▄ ▄ \n ██ ██ \n █ █▄▄▄▄▄▄█ █ \n █▄▀ ▀▄█ \n █ █ ▄█ █▄ █ █ \n ▀▄█ █▄▀ \n ▀▄▀▀▀▀▀▀▄▀ "], ["injured_2", " \n \n ▄ ▄ \n ██ ██ \n █ █▄▄▄▄▄▄█ █ \n █▄▀ ▀▄█ \n █ █ ▄█ █▄ █ █ \n ▀▄█▄▄▄▄▄▄▄▄█▄▀ "], ["refuse", " \n ▄ ▄ \n ██ ██ \n █ █▄▄▄▄▄▄█ █ \n █▄▀▄ ▄ ▀▄█ \n █ █ ▀ ▄ ▀ █ █ \n ▀▄█ ▀ ▀ █▄▀ \n ▀▄▀▀▀▀▀▀▄▀ "], ["sleep_1", " \n \n ▄ ▄ \n ██ ██ \n █ █▄▄▄▄▄▄█ █ \n █▄▀ ▀▄█ \n █ █ ▄▄ ▄▄ █ █ \n ▀▄█▄▄▄▄▄▄▄▄█▄▀ "], ["sleep_2", " \n \n ▄ ▄ \n ██ ██ \n █ █▄▄▄▄▄▄█ █ \n █▄▀ ▀▄█ \n █ █ ▄▄ ▄▄ █ █ \n ▀▄█▄▄▄▄▄▄▄▄█▄▀ "], ["walk_1", " \n ▄ ▄ \n ██ ██ \n █ █▄▄▄▄▄▄█ █ \n █▄▀ ▀▄█ \n █ █ █ █ █ █ \n ▀▄█ ▄▀▄ █▄▀ \n ▀▄▀▀▀▀▀▀▄▀ "], ["walk_2", " \n \n ▄█ ▄█ \n ▄▀█ ▄▀█ \n █ █▀▀▀▀▀▀█ █ \n ▄▀█ ▄ ▄ █▀▄ \n █ █ ▀ ▄ ▀ █ █ \n ▀▀█▄█▄█▄▄█▀▀ "]]], + ["sakuyamon", [["angry", " ▄▄ ▄▄ ▄▀▀▀▄\n █▄██ ▀▄█▀█▀█\n ▄▄▀ ▄▄▀ ▀█▄█ \n ▀▄▄▄▄▄▄▄▀██ █ \n ▄█▀▄▄▄█ ▄▀█ ██\n ▄▀▀█ ▄▄▀▄▀█████\n █▄▄▀█ █▀ ██ █▀\n █▄▄▄▀▀▀█▄▄▄█▄█ "], ["attack", " █▀▄█▀▄▄ \n █▀▀▀▄ █ \n █▀ ▀▀ ▄█ \n ██▀▀▀█▀ █▀▄\n ▄▄▄██▄▀▀██ █ █\n█ █▄▀█▀▀▀██▀▀▀▀█\n▀▄█▄██▀▀██▀▀█▀▀▀\n █▄▄▄▀▀▄▄▄█ "], ["eat_1", " █▀▄█▀▄▄▀▀▀▄ \n █▀▀▀ █▀█▀█ \n █▀ ▀▀▀ ▄█▄█ \n ▄███████▀ █ █▀▄\n █ █▄▄▀█ ██▄█ █\n ▀██▄▀▀▄█ ▀▀█▄█\n ▄█ ▀▄▄▀ ██ █ \n █▄▄▄▀▀▄▄▄█▄█ "], ["eat_2", " ▄▄ ▄▄ ▄▄▄ \n █▄█▀ ▀█▄▄▄█ \n ▄▄▀ ▄▀▄ ▀▄▀▄▀ \n ▀▄▄▄▄▄▄▄▀█▀█▄ \n ▄█▀▄▄▄█ ▄█ █ █\n ▄▀▀█ ▄▄▀▄▀███ █\n █▄▄▀█ █▀▄▄ █▀▀\n █▄▄▄▀▀▄▄▄█▄█ "], ["happy", " █▀▄█▀▄▄▀▀▀▄ \n █▀▀▄ █▀█▀█ \n ▄█▀ ▀ ▀ ▄█▄█ \n███▀█████▀ █ █▀▄\n █ █▄▄▀█ ██▄█ █\n ▀██▄▀▀▄█ ▀▀█▄█\n ▄█ ▀▄▄▀ ██ █ \n █▄▄▄▀▀▄▄▄█▄█ "], ["injured_1", " ▄▄ ▄▄ ▄▄▄ \n █▄██ ▀█▄▄▄█ \n ▄▄▀ ▀▄▄ ▀▄▀▄▀ \n ▀▄▄▄▄▄▄▄▀█▀█▄ \n ▄█▀▄▄▄█ ▄█ █ █\n ▄▀▀█ ▄▄▀▄▀█▄█ █\n █ ▀█ █▀▄█▀█▀▀\n ▀██▄▄▀▀▄▄▄█▄█ "], ["injured_2", " ▄▄▄ \n █▀▄█▀▄▄█▄▄▄█ \n █▀█▀ █▀▄▀▄▀ \n █▀ ▀▀ ▄██▀█▄ \n ▀█▀▀▀█▀ ██ █ █\n ▄▀▀█▀██ █▀█ █ █\n █ ▀█ █▀▄███▀▀\n ███▄▄██▄▄▄█▄█ "], ["sleep_1", " \n ▄▄ ▄▄ \n █▄██ ▀█ \n ▄▄▀ ▄▄ ▀▄ \n ▀▄▄▄▄▄▄▄▀█▀▄ \n ▄▀█▄▄▄█ ▄▀▄▄▀▄\n █▀▀▄█▄▀▀▄▀▀▄█▄█\n █▄▄▄██▄▄█▄▄▄██ "], ["sleep_2", " \n █▀▄█▀▄▄ \n █▀▀▀ █ \n █▀ ▀▀ ▄█ \n ██▀▀▀█▀ █▀▄ \n ▄▀█▄▀▀▀█ █▀▄ █\n █▀▀▄█▄▀▀▄▀▀▄█▄█\n █▄▄▄██▄▄█▄▄▄██ "], ["walk_1", " █▀▄█▀▄▄▀▀▀▄ \n █▀▀▀ █▀█▀█ \n █▀ ▀▀▀ ▄█▄█ \n ██▀▀▀█▀ █ █▀▄\n ██▄▀▀▀█ ██▄█ █\n █ █▄▀▀▄█ ▀▀█▄█\n ▀██ ▀▄▄▀ ██ █ \n █▄▄▄▀▀▄▄▄█▄█ "], ["walk_2", " ▄▄ ▄▄ ▄▄▄ \n █▄██ ▀▄█▄▄▄█\n ▄▄▀ ▄▄▄ ▀▄▀▄▀\n ▀▄▄▄▄▄▄▄▀██▀█ \n ▄█▀▄▄▄█ ▄▀█ ██\n ▄▀▀█ ▄▄▀▄▀█████\n █▄▄▀█ █▀ ██ █▀\n █▄▄▄▀▀▀█▄▄▄█▄█ "]]], + ["sakuyamon_x", [["angry", " ▄▄ ▄▄ \n █ ▀▀ ▀▄▄ \n █ █ ▄▀ █ █ \n █▄▄▄▄▄▄ ▄▀▀▄ \n ▄▀▄▄▄▀▄█▄▄▀▄ \n ▄▀█ ▄▄ ▄▀▀ █▀ \n ▀▄██ ██▄▄█▄▀▄\n █▄▄▀▀▀▀▀▄▄█▀▄█"], ["attack", "█▀▄▀█ █▀▄█▀▄ \n▄▀ ▀▄ ▄▀ ▄▄ ▄▀▀▄\n▀▄▀▄▀▄▀ ▀▀ █▄▀█\n █ ▀█▀▀▀██ █ \n ▄▀▀▄█▄▀▀█▀▀██▄█\n ▀▄▄▄▀▀▄▀▀▄▄▄▀▄ \n █ ▄██▄▄███▀▄█\n █ █▄▄█▀ █▄▄█ "], ["eat_1", " █▀▄█▀▄ \n ▄▀▄ █▀▄ \n ▄▀ ▀ ▀▀ ▀▄█ \n ▀▀█████ █ █ \n ▄█▀▀▀▄▀██▀▄█ \n █ ██▀▀▄█ ▄█ \n ███▄▄███▀▀▄▀▄\n █▄▄▀ ▀▄▄█ ▀▄█"], ["eat_2", " ▄▄ ▄▄ \n █ ▀▀ ▀▄▄ \n █ █ ▄▀▄█ █ \n █▄▄▄▄▄▄ ▄▀▀▄ \n ▄▄▀▄▄▄▀▄█▄▄▀▄ \n █ █ ▄▄ ▄█ █▀ \n ▀███ █████▄▀▄\n █▄▄▀▀▀▀▀▄▄█▀▄█"], ["happy", " █▀▄█▀▄ \n ▄▀▄ ▄ █▀▄ \n ▄▀ ▀ ▀ ▀▀▄▀▀▄ \n ▀█▀████ █▀ ▄▀ \n ▄▀▄▄▄▀▀█▄▀▄█ \n ▄▀ █▄▀▀▄██▀█▀▄ \n ▀▄███▄▄███ ▀▄▀▄\n █▄▄▀ ▀▄▄█ ▀▄█"], ["injured_1", " \n \n █▀▄█▀▄ \n ▄▀▄ ▄ █▀▄ \n ▄▀ ▀ ▀▀ ▄▀▀▄ \n ▀▀█▀▀▀█▄█▄▄▀▄ \n ▄▀██▀▀▀▄▀▀█▀█▄ \n█▄▄█▀███▄▄▄▀▄▄▄█"], ["injured_2", " \n \n ▄▄ ▄▄ \n █ ▀▀ ▀▄▄ \n █ █ █▄ ▀▄▀▀▄ \n█▄▄▄▄▄▄ ██▄▄▀▄ \n ▄▀▄▄▄▀█▀▀██▀█▄ \n█▄▄█▀██▄▄▄█▀▄▄▄█"], ["sleep_1", " \n ▄▄ ▄▄ \n █ ▀▀ ▀▄▄ \n █ █ ▄▄ █ █ \n █▄▄▄▄▄▄ ▄▀▀▄ \n ██▄▄▄▀▄█▄▄▀▄ \n █▀▀▄█▄▀▀▄▀▀█▄▀▄\n █▄▄▄██▄▄█▄▄▄▀▄█"], ["sleep_2", " \n █▀▄█▀▄ \n ▄▀▄ █▀▄ \n ▄▀ ▀ ▀▀ ▀▄█ \n ▀██▀▀▀█ █ █ \n ▄█▄▀▀▀ ▀██▀▄ \n █▀▀▄█▄▀▀▄▀▀█▄▀▄\n █▄▄▄██▄▄█▄▄▄▀▄█"], ["walk_1", " █▀▄█▀▄ \n ▄▀▄ ▄ █▀▄ \n ▄▀ ▀ ▀▀ ▀▄█ \n ▀▀█▀▀▀█ █ █ \n █▄▀▀▀ ▀▄█▀▄█ \n █ █▄▀▀▄█ ▄▀▄ \n █▄▀▄▄▀▄█▀▀▄▀▄\n █▄▄▀ ▀▄▄█ ▀▄▀"], ["walk_2", " ▄▄ ▄▄ \n █ ▀▀ ▀▄▄ \n █ █ ▄█ █ █ \n █▄▄▄▄▄▄ ▄▀▀▄ \n ▄▀▄▄▄▀▄█▄▄▀▄ \n ▄▀█ ▄▄ ▄█▀ █▀ \n ▀▄██ ███▄▄█▀▄\n █▄▄▀▀▀▀▀▄▄█▀▄█"]]], + ["salamon", [["angry", " \n ▄▄▀▀▀▀▀▄▄ \n ▄▀ ▀▄ \n▄▀ ▀▄ \n█ █▀▄ ▄▀█ ▀▄\n██ ▀▀▀▄ ▀▀▀ ▄ █\n▀▄█▄▄▄▄▄▄▄▄▄██▄▀\n█▄█▄█▄▄▄▄▄█▄█▄█ "], ["attack", " ▄▄▀▀▀▀▀▀▄▄▄ \n▄▀ ▀▄ \n█ ▀█▄ ▄█▀ ▄ █\n█▄ ▄▄▄█▄▄▄▄ ▀▄ █\n██ ██████▀█ ▄▀▄█\n ▀▄███▄▄▄█▄▀▀▄ \n ▄█▄ █▄ ▀▄\n █▄▄▄████▀█▄▄█▄█"], ["eat_1", " ▄▄▀▀▀▀▀▄▄ \n ▄▀▄▄ ▄▄ ▀▄ \n▄▀▀ ▀ ▀ ▀ ▄ █ \n█▄ █▄▄█▄▄█ ▀▄ █\n█▀▄ █████ ▄▀█ █\n▀▄█▀██▄▄█▄▀ ▄█▄▀\n █▄ ▄█ ▀▄ \n █▄▄██▀█▄▄█▄█ "], ["eat_2", " \n ▄▄▀▀▀▀▀▄▄ \n ▄▀ ▀▄ \n▄▀ ▀▄ \n█ ▄▀▀▄ ▄▀▀▄ ▀▄\n██ ▄▄▀▄▄ █ █\n█▄█▄▄▄▄▄▄▄▄▄██▄▀\n █▄▄█▄▄▄▄▄██▄▄█ "], ["happy", " ▄▄▀▀▀▀▀▄▄ \n ▄█▄ ▄▄ ▀▄ \n▄▀ ▀ ▄ ▀ ▀ █ \n█▄ ██████ ▀▄ █\n█▀▄ ▀██▄▄▀ ▄▀█ █\n▀▄█▀▄▄▄▄▄▄▀ ▄█▄▀\n ▄█ ▄█ ▀▄ \n █▄▄███▀█▄▄█▄█ "], ["injured_1", " \n \n ▄▄▀▀▀▀▀▄▄ \n ▄▀ ▀▄ \n▄▀ ▄ ▄ ▀▄ \n█ ▀▀▀ ▀▀▀ ▄ ▀▄\n█▄▀▀▄▄█▄▄▀▀▄▄█ █\n▀▄▄▄▄█▄█▄▄▄▄██▄▀"], ["injured_2", " \n \n ▄▄▄▄▄ \n ▄▀▀ ▀▀▄ \n █ ▀▄ \n█ ▄▄█ █▄▄ ▀▄\n█▄▀▀▄ ▄ ▄▀▀▄█▄ █\n█▄▄▄▄███▄▄▄▄██▄█"], ["sleep_1", " \n ▄▄▀▀▀▀▀▄▄ \n ▄▀ ▀▄ \n▄▀ ▀▄ \n█ ▄▄▄ ▄▄▄ ▀▄\n██ ▄▄▀▄▄ █ █\n▀▄▀▀▄▄▄▄▄▄▀▀▀█▀█\n █▄▄█▄▄▄▄█▄▄▄▄██"], ["sleep_2", " \n ▄▄▄▄▄ \n ▄▀▀ ▀▀▄ \n █ █ \n█ █ \n█▄ ▀▀▀▄ ▀▀▀ ▄ █\n█▄▀▀▄▀ ▀▀▄▀▀▀█ █\n █▄▄██████▄▄▄▄██"], ["walk_1", " ▄▄▄▄▄ \n ▄▀▀ ▀▀▄ \n █ ▄▄ ▄▄ ▀▄ \n█ ██▄ ▄██ █ ▀▄\n██ ▄▄▀▄▄ ▄█ █\n█▄▀▄▄▄▄▄▄▄▀▀▄▀▄█\n █▄ ▄█ ▀▄ \n █▄▄██▀█▄▄█▄█ "], ["walk_2", " \n ▄▄▀▀▀▀▀▄▄ \n ▄▀ ▀▄ \n▄▀▄█▀ ▀█▄ ▄ █ \n█▄▀▀▀ ▄ ▀▀▀ ▀▄ █\n█▀▄ ▀▀ ▀▀ ▄▄▀█ █\n▀▀ ██▀▀▀▀▀ ▄█▀█▀\n █▄▄█▄▄▄▄█▄▄██ "]]], + ["salamon_x", [["angry", "▄▄ ▄▄\n█ ▀▄▄▀▀▀▀▀▀▄▄▀ █\n▀▄▄▀▄ ▄ ▄▄▄▀\n █ ▀▀▄ ▀▀ █ \n █ █▀█▀█▀▄ █ \n ▀▄▀▀▀▀▀▀▀▄▀▄ \n ▄█▀▀▀▀▀▀▀▄▄▀▀▄\n █▄▄█▄▄▄▄▄█▄▄█▄█"], ["attack", "█▀▄ ▄▄▄▄▄▄ ▄▀█\n█ █▀ ▀▀ █\n ▀█ █▄ ▄█ █▀▀ \n █ ▄█▄▄ █ \n █ █ █ █ \n █▀▄▄▄▄█▄▀ █▄ \n ▄█▄ ▄█ █\n █▄▄██▀▀▀▀█▄▄█▄█"], ["eat_1", "▄▄ ▄▄\n█ ▀▄▄▀▀▀▀▀▀▄▄▀ █\n▀▄▄▀ ▄ ▄ ▄▄▄▀\n █ ▀ █ ▀ ▀█ \n █ ██████▄ █ \n █ ███▄▄▄█ █▄ \n ▄█▄▄▄▄▄▄▄█▄▀▀▄\n █▄▄█▄▄▄▄▄█▄▄█▄█"], ["eat_2", " \n█▀▄ ▄▄▄▄▄ ▄▄▀█\n█ █▀ ▀▀ █\n▀▀█▀▄▀▄ ▄▀▄▄▀▀▀ \n █ ▄▀▄ █ \n ▀▄▄ ▄▄▀▄▄ \n ▄█ ▀▀▀▀▀ ▄█ ▀▄\n █▄▄█▄▄▄▄▄█▄▄█▄█"], ["happy", "▄▄ ▄▄\n█ ▀▄▄▀▀▀▀▀▀▄▄▀ █\n▀▄▄▀ ▄ ▄ ▄▄▄▀\n █ ▀ █ ▀ ▀█ \n █ ██████ █ \n █ ██████ █▄ \n ▄█▄████▄▄█▄▀▀▄\n █▄▄█▄▄▄▄▄█▄▄█▄█"], ["injured_1", " \n \n▄▀▀▄▄▀▀▀▀▀▄▄▀▀▄ \n█ ▄ ▄ █\n█ █ █ █\n▀█▀▄▄█ █▄▄ ▀█▀\n ▀▄▄ ▄█▄ ▄▄▄▀▄\n █▄▄█▄▄▄▄▄█▄▄█▄▀"], ["injured_2", " \n \n ▄▄▄▄▄ \n ▄▀█▀ ▀▀▀▀▄ \n█ ▄ ▄ █\n█ █ ▄ ▄ █ █\n▀▀██▀▀ ▄ ▀▀█▄█▀█\n █▄▄█▄█▄█▄█▄▄█▄▀"], ["sleep_1", " \n \n ▄▄▄▄▄▄▄ \n ▄█▀ ▀▄ \n▄▀█ ▄ ▀▄ \n█ █ ▀▀▄ ▀▀ █ █ \n ▀█▄ ▀ ▀ ▄▀█▀▀▄\n █▄▄███████▄▄█▄█"], ["sleep_2", " \n \n ▄▄▀▀▀▀▀▄▄ \n ▄▀█ ▀▄ \n█ █ ▀▀▄ ▀▀ █ █ \n▀▄█▄ ▀ ▀ █▄▄▀ \n ▄█▀█▄▄▄█▀ █ ▀▄\n █▄▄█▄▄▄▄▄█▄▄█▄█"], ["walk_1", "▄▄ ▄▄\n█ ▀▄▄▀▀▀▀▀▄▄▀▀ █\n█▄▄█ ▄ ▄ ▄▄▄▀\n █ ▀▀▄ ▀▀ █ \n ▀▄ ▀ ▀ █ \n ▄▀█▄▄▄▀▀ █▀▄ \n █▄ ▄▄▀ ▀▄\n █▄▄██▀█▄▄█▀▄▄█"], ["walk_2", " \n█▀▄ ▄▄▄▄▄ ▄▄▀█\n█ █▀ ▀▀ █\n▀▀█▀▄█ ▄█ ▄▀▀▀ \n █ ▄▀▄ █ \n ▀▄▄ ▄▄▀▄▄ \n ▄█ ▀▀▀▀▀ ▄█ ▀▄\n █▄▄█▄▄▄▄▄█▄▄█▄█"]]], + ["sandmon", [["angry", " \n \n \n \n ▄▄▄▄▄▄ \n ▄█▄ ▀█▀ \n █▄▄▄ █ \n ▀▄▄▄▄▄▄▀ "], ["attack", " \n \n \n ▄▀▀██▄██ \n ▀▀▄ █ \n █ █ \n ▄▄▄▄█ █ \n ▀▄▄▄▄▄▄▄▀ "], ["eat_1", " \n \n \n ▄▄▄ ▄▄ \n ▄▀▀▀ ▀█▀ \n ▀▀▄ █ \n ▄▄▄▄█ █ \n ▀▄▄▄▄▄▄▄▀ "], ["eat_2", " \n \n \n \n ▄▀▀▀▄██ \n █▄▄ █ \n ▀▄▄▄▄█ █ \n ▀▄▄▄▄▄▄▄▀ "], ["happy", " \n \n ██▄▄▄▄██ \n ▄▀▄▄▄ ▀▄ \n █ ▄ ▀ █ \n ▀▄ ▄▀ \n ▀▀▀▀ \n ▄▄▄ "], ["injured_1", " \n \n \n \n \n ▄▄ ▄▄▄ ▄▄ \n ▀█▀▄▄▄▀█▀ \n ▀▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n \n \n \n \n ██▄▀▀▀▀▀▄██ \n ▄█▄▄███▄▄█▄ "], ["sleep_1", " \n \n \n \n \n ██▄▄▄▄▄██ \n ▄▀ ▄▄▄ ▀▄ \n ▀▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n \n \n ▄▄ ▄▄ \n ▀█▀▀▀▀▀█▀ \n █ ▀▀▀ █ \n █ ▀ █ \n ▀▄▄▄▄▄▀ "], ["walk_1", " \n \n \n \n ▄▄ ▄▄ \n ▀█▀▀▀█▀ \n █ ▀▀▀ █ \n ▀▄▄▄█▄▄▄▀ "], ["walk_2", " \n \n \n \n \n ██▄▄▄██ \n ▄▀▄▄▄▀▄ \n ▀▄▄▄▄▄▄▄▀ "]]], + ["sangloupmon", [["angry", " \n █▀▄ █▀▄ ▄▄▄ \n ▄▀▀▀▀ █▄ ▀▄ █\n▄▄▀▀ ▀█████ ▄▀ █\n█▄▄▄▄ ▀▀██▀▀▄▀\n▀█▄█▄█ ▄██▀ ▄█▄\n █▄▄▄▄█▄▄ ▄█▄▄▀█\n█▄▄▄██▄▄▄███▄▄▄█"], ["attack", " █▀▄ █▀▄ ▄▄\n▄▄▄▄▀▀▀▀ █▄ █ █\n▀▄▄▄▄ ▀████ █ █\n ▀████▄ ▀▀██▀▀▄▀\n █████ ▄██▀ ▄█▄\n █▀▀▀▀ ▀ ▀██\n ▀██▀█▀▄█▄▄█▄ █\n █▄▄█▄▄▄▀ █▄▄▄█"], ["eat_1", " █▀▄ █▀▄ ▄▄\n ▄▀▀▀▀ █▄ █ █\n██▀▀ ▀█████ █ █\n█▄▄▄▄▄ ▀▀██▀▀▄▀\n █▀▀█ ▄██▀ ▄█▄\n █▀▀▀ ▀ ▀██\n ▀██ █▀▄█▄▄█▄ █\n █▄▄█▄▄▄▀ █▄▄▄█"], ["eat_2", " ▄▄ ▄▄ \n ▀▄█▄█ █ █▀▀▄\n ▄█ ▄▄▄▄██ █ █\n█▀ ▀▀███▄█▄ █\n█▀▀▀ ▄▀ ▄██ █ \n ▀▀▀█ █▀▀ ███\n ▄█▄▄█▄▄ ▄█▄▄▀█\n █▄▄▄█▄▄▄▀▀█▄▄▄█"], ["happy", " █▀▄ █▀▄ ▄▄\n ▄▀▀▀▀ █▄ █ █\n▄▄▀▀ ▀█████ █ █\n█▄▄▄▄▄ ▀▀██▀▀▄▀\n ████▀ ▄██▀ ▄█▄\n ▀▄▄▄ ▄ ▀ ▀██\n ▄█▀█▀▄█▄▄█▄ █\n █▄▄█▄▄▄▀ █▄▄▄█"], ["injured_1", " \n \n █▀▄ █▀▄ \n ▄▀▀▀▀ █▄ ▄▄ \n▄▄▀▀ ▀█▄▄██▄█▄ █\n█▄▄▄▄ ▀▀ ██ █▀\n █▄▄▄▄▄█▀▀█▄▄█▀█\n█▄▄███▄▄▄███▄▄▄█"], ["injured_2", " \n \n \n █▀▄ █▀▄ ▄▄ \n ▄▀▀▀▀ █▄▄█▄ █\n▄▄▀▀ ▀██▄███ █▀\n▀▄▄▄▄ ▄█▀█▄▄█▀█\n██▄▄▄▄█▄▄▄██▄▄▄█"], ["sleep_1", " \n ▄▄ ▄▄ \n ▀▄█▄█ █ █▀▀▄\n ▄█ ▄██ █ █\n█▀ ▀███▀█▄█▄ █\n█▀▀▀ ▄ ▄██ █ \n █████▄▄█▀█▄▄█▀█\n█▄▄▄██▄▄▄███▄▄▄█"], ["sleep_2", " \n █▀▄ █▀▄ ▄▄▄ \n ▄▀▀▀▀ █▄ ▀▄ █\n▄▄▀▀ ▄▄▄███ ▄▀ █\n█▄▄▄ ▀▀▀ ██▀▀▄▀\n▀▄▄▄▄▀ ▄██▀ ▄█▄\n ▄▄█▄█▄▄▄ ▄█▄▄▀█\n█▄▄▄██▄▄▄███▄▄▄█"], ["walk_1", " █▀▄ █▀▄ ▄▄\n ▄▀▀▀▀ █▄ █ █\n▄▄▀▀ ▀█████ █ █\n█▄▄▄ ▄ ▀▀██▀▀▄▀\n▀▄▄▄▄▀ ▄██▀ ▄█▄\n █ ▄ ▀ ▀██\n ▄█▀█▀▄█▄▄█▄ █\n █▄▄█▄▄▄▀ █▄▄▄█"], ["walk_2", " ▄▄ ▄▄ \n ▀▄█▄█ █ ▄▀█\n ▄█ ▄▄▄▄██ ▄▀ █\n█▀ ▀▀███▄█▄ █\n█▀▀▀ ▄▀ ▄██ █ \n ▀▀▀█ █▀▀ ███\n ▄█▄█▄▄▄ ▄█▄▄ █\n █▄▄█▄▄▄▀▀▀▀█▄▄█"]]], + ["sangomon", [["angry", " \n ▄ ▄█ █▄▀ ▄ \n ▀▀█▄▄█▄█▄ ▄▀▀ \n ▀▄▀ ▀▀ ▀▄▄▀ \n █ █▄ ▄█ █ \n █▄▄▄▄▄▄▄▄▄▄█ \n▄█ █ ▀ ▀ █ █▄\n█▄▀▄██▄▀▀▄██▄▀▄█"], ["attack", " ▄ ▄█ █▄▀ ▄ \n ▀▀█▄▄█▄█▄ ▄▀▀ \n ▀▄▀▄ ▀▀ ▄▀▄▄▀ \n▄▄ █ ▀▀ ▀▀ █ ▄▄\n█ █ ██▄██▄██ █ █\n▀▄▄█▀█▀██▀█▀█▄▄▀\n ▀▄▄ ▄▄ ▄▄▀ \n █▄█ █▄█ "], ["eat_1", " ▄ ▄█ █▄▀ ▄ \n ▀▀█▄▄█▄█▄ ▄▀▀ \n ▀▄▀▄▄▀▀▄▄▀▄▄▀ \n █ █▄ ▄█ █ \n █▄▄▄▄▄▄▄▄▄▄█ \n ▄▀▄▀██████▀▄▀▄ \n█▀▄▀▄▄ ▄▄ ▄▄▀▄▀█\n▀▀ █▄█ █▄█ ▀▀"], ["eat_2", " \n ▄ ▄█ █▄▀ ▄ \n ▀▀█▄▄█▄█▄ ▄▀▀ \n ▀▄▀ ▀▀ ▀▄▄▀ \n █▄▀▄ ▄▀▄█ \n █▄▄▄▄▄▄▄▄▄▄█ \n▄█ █ ▀ ▀ █ █▄\n█▄▀▄██▄▀▀▄██▄▀▄█"], ["happy", " ▄ ▄█ █▄▀ ▄ \n ▀▀█▄▄█▄█▄ ▄▀▀ \n ▀▄▀▄ ▀▀ ▄▀▄▄▀ \n █▀ ▀ ▀ ▀█ \n █▄████████▄█ \n ▄▀▄▀██████▀▄▀▄ \n█▀▄▀▄▄ ▄▄ ▄▄▀▄▀▄\n▀▀ █▄█ █▄█ ▀▀"], ["injured_1", " \n ▄ ▄ ▄ \n ▄█▄ ▀█ █▀ █▄ \n ▄ █▀▀██▀▀▄▀ ▄ \n █ ▄ ▄ █▀ \n ▄▀ ▀▀ ▀▀ ▀▄ \n ▄▀█▀▀█▀▀█▀▀█▀▄ \n█▄█▄█▄▄▄▄▄▄█▄█▄█"], ["injured_2", " \n \n ▄ ▄█ █▄▀ ▄ \n ▀▀█▄▄█▄█▄ ▄▀▀ \n ▀▄▀ ▀▀ ▀▄▄▀ \n █ ▄█ █▄ █ \n ▄█▄▄▄▄▄▄▄▄▄▄█▄ \n█▄█▄█▄▄▄▄▄▄█▄█▄█"], ["sleep_1", " \n \n ▄ ▄█ █▄▀ ▄ \n ▀▀█▄▄█▄█▄ ▄▀▀ \n ▀▄▀ ▀▀ ▀▄▄▀ \n █ ▀▀ ▀▀ █ \n █▄▄▄▄▄▄▄▄▄▄█ \n █▄█▄█▄▄▄▄█▄█▄█ "], ["sleep_2", " \n ▄ ▄ ▄ \n ▄█▄ ▀█ █▀ █▄ \n ▄ █▀▀██▀▀▄▀ ▄ \n █ ▄▄ ▄▄ █▀ \n ▄▀ ▀▄ \n ▄▀█▀▀█▀▀█▀▀█▀▄ \n█▄█▄█▄▄▄▄▄▄█▄█▄█"], ["walk_1", " ▄ ▄ ▄ \n ▄█▄ ▀█ █▀ █▄ \n ▄ █▀▀██▀▀▄▀ ▄ \n █ █▀ ▀█ █▀ \n ▄▀ ▀▀ ▀▀ ▀▄ \n ▄▀█▀▀█▀▀█▀▀█▀▄ \n█▀▄▀▄▄ ▄▄ ▄▄▀▄▀█\n▀▀ █▄█ █▄█ ▀▀"], ["walk_2", " \n ▄ ▄█ █▄▀ ▄ \n ▀▀█▄▄█▄█▄ ▄▀▀ \n ▀▄▀▄▄▀▀▄▄▀▄▄▀ \n █ █▄ ▄█ █ \n █▄▄▄▄▄▄▄▄▄▄█ \n▄█ █ ▀ ▀ █ █▄\n█▄▀▄██▄▀▀▄██▄▀▄█"]]], + ["saviorhuckmon", [["angry", " ▄▄ ▄▄▄▄ \n█▄ ▄███▀▀ ▄▀ \n█ ▀█▀▀ ▄ ▀█ \n █▀ ▀ ▄▄█▀█ \n ▀█▀▀▀ ▄█▀ ▀▄ \n ▄▀█▀█▀▀██▀▀█▄ \n▄▀ ▄██▄▄█▀ ▄▀███\n▀▀▀█▄▄█▀▀▀█▄█ ▀█"], ["attack", " ▄ ▄██▄▄▀▀█▀\n █▀▄▄██▀▀ ▄█ \n ▀▄▄▀ ▄█▀ █▄ \n █▄▄▄▄ ▄▀▀▄▀ \n ▄▀▄▄▄▄█▄▄▄▄█ \n▄▀▀▀▀▀▀█ ▄█ ▀██\n ▀▀▀▀█▀███▀▀█ ▀█\n █▄▄█ ▀█▄▄█ ▀"], ["eat_1", "▄ ▄██▄▄▀▀█▀ \n█▀▄▄██▀▀ ▄█ \n▀▄▄▀ ▄█▀ █ \n █▄▄▄▄▄ ▄█▀█ \n ████▀▄▄▀ ▀▄ \n ▀▄▄▄█▀██▀▀███▄\n ▄▀▄█▀██▀ ▄█▀▀██\n ▀▀█▄▄█ ▀█▄▄█ █"], ["eat_2", " ▄▄ ▄▄▄▄ \n█▄ ▄███▀▀ ▄▀ \n█ ▀█▀▀ ▄ ▀█ \n █▀ ▀ ▀ ▄▄█▀█ \n ▀█▀▀▀ ▄█▀ ▀▄ \n ▄▀█▀█▀▀██▀▀█▄ \n▄▀ ▄██▄▄█▀ ▄▀███\n▀▀▀█▄▄█▀▀▀█▄█ ▀█"], ["happy", "▄ ▄██▄▄▀▀█▀ \n█▀▄▄██▀▀ ▄█ \n▀▄▄▀ ▄▀▄ ▀▄▄▄ \n █▄▄▄▄▄ ▄█▀▀▄▀ \n ████▀▄██▄▄▄▄▀ \n ▄▀▄▄▄▀ ▄█▀ ▄▀█▄\n█▄▄██▀███▄▄█ ▀██\n █▄▄█ █▄▄█ █"], ["injured_1", " \n▄ ▄██▄▄▀▀█▀ \n█▀▄▄██▀▀ ▄█ \n▀▄▄▀ ▀▄▄ ▀▄▄▄ \n █▄▄▄▄ ▄█▀▀▄▀ \n ▀▄▄▄▄▄██▄▄▄▄▀ \n █ ▀▄▀ ▄█▀ ▄██ \n ██▄▄███▄▄█████"], ["injured_2", " \n ▄▄ ▄▄▄▄ \n█▄ ▄███▀▀ ▄▀ \n█ ▀█▀▀▄ ▀█ \n █▀ ▀▀ ▄▄█▀█ \n ▀█▀▀▀ ▄█▀ ▀▄ \n ▄▀█▀█▀▀██▀▀█▄ \n █▄▄█▄▄██▄▄███▄"], ["sleep_1", " \n ▄▄ ▄▄▄▄ \n█▄ ▄███▀▀ ▄▀ \n█ ▀█▀▀ ▀█ \n █▀ ▀▀▀ ▄▄█▀█ \n ▀█▀▀▀ ▄█▀ ▀▄ \n ▄▀█▀█▀▀██▀▀█▄ \n █▄▄█▄▄██▄▄███▄"], ["sleep_2", " \n▄ ▄██▄▄▀▀█▀ \n█▀▄▄██▀▀ ▄█ \n▀▄▄▀ ▄▄▄ ▀▄▄▄ \n █▄▄▄▄ ▄█▀▀▄▀ \n ▀▄▄▄▄▄██▄▄▄▄▀ \n █ ▀▄▀ ▄█▀ ▄██ \n ██▄▄███▄▄█████"], ["walk_1", "▄ ▄██▄▄▀▀█▀ \n█▀▄▄██▀▀ ▄█ \n▀▄▄▀ ▄█▀ ▀▄▄▄ \n █▄▄▄▄ ▄█▀▀▄▀ \n ▀▄▄▄▄▄██▄▄▄▄▀ \n ▄▀ █▄▀ ▄█▀ ▄▀█▄\n█▄▄██▀███▄▄█ ▀██\n █▄▄█ █▄▄█ █"], ["walk_2", " ▄▄ ▄▄▄▄ \n█▄ ▄███▀▀ ▄▀ \n█ ▀█▀▀ ▄▄ ▀█ \n █▀ ▀▀ ▄▄█▀█ \n ▀█▀▀▀ ▄█▀ ▀▄ \n ██▀█▀▀█▀▀█▄▄ \n ▄▀▄██▄▄▀ ▄█████\n ▀█▄▄█ ▀▀▀█▄▄█▀█"]]], + ["scorpiomon", [["angry", " ▄▀▀▀█▀▄\n █ ▀█▀ ▀▀\n ▄▀▀▀▀▄ \n ▄▄▄▀▀▀▀▀▄ █▄ \n █ █ ▄▄▀▄ █\n ▄▀▀██▄▄▄█▀ █▄▀\n ▀▄▀ ▄▄▄ ▀▄▀▄ █\n ▀▄▄▄█▄▄▄▄▀ █▄▀"], ["attack", " █▀▄▀▀▀▄ \n ▀▀▀█▀ █\n ▄█▄ █\n ▄▀▀▀▀▀▀▀▄ ▀█\n █▀▄ ▄▀█ █▄▄▀\n█ █▀▀▀▀▀▀▀▄ █▄ █\n██ ▄████▄ █▄ █ \n ▀▄█ █▄▄▀█▄▀ "], ["eat_1", " ▄▀█▀▀▀▄ \n ▀▀ ▀█▀ █ \n ▄▀▀▀▀▀▄ █ \n ▄▀▀▀▀▀▄ █ \n ▄▀█ ▄▄ ▀▄▀▀▄\n▄▀█▄█▄▄█▄█ ██ █\n█▀ ▄▄▄▄▄ ▀█▄ █ \n▀▄█ █▄▄▀█▄▀ "], ["eat_2", " ▄▀█▀▀▀▄ \n ▀▀ ▀█▀ █ \n ▄▀▀▀▀▄ █ \n ▄▄▄▀▀▀▀▀▄ █▄ \n █ █ ▄▄ ▀▄ █\n ▄▀█▄█▄▄█▄▀ █▄▀\n █▀▄▄▄▄ ▀▄▄▀▄ █\n ▀▄▄▀█▄▄▄▄▀ █▄▀"], ["happy", " ▄▀█▀▀▄ \n ▀▀ █▀ █\n ▄▄▄▄▄ ▄▄█ █\n ▄▀ ▄ ▀▄ ▀▄▀\n █▄█▄▄█▄█ █ █ \n▄▀▄▄▄▄▄▄ ▀▄█▄▀▀▄\n█ █▀▀▀▀█ █▄ █ █\n▀▄▄█ █▄▄▀ █▄▀▀ "], ["injured_1", " ▄▄▄▄ \n █▄▀▄▄▀▄\n ▄▀ █\n ▄▀▀▀▀▀▀▄▀▀▄ █\n █ █▄ █ █ \n ▄▀▀▀▀▀▀▄ █▄▀▀▄\n█ ▄███▄ █▀▄ █ █\n▀▄█ █▄▄▀ █▄▀▀ "], ["injured_2", " ▄▄▄ \n ▄▀▄▄▄▀▄\n ▀▀ ▄▀ █\n ▄▀▀▀▀▀▀▄▀▀▄ █\n █ ▄▄ █ █ \n ▄▀▀▀▀▀▀▄ █ ▄█ \n█ ▄███▄ █▄▀▀▄ █\n▀▄▄█ █▄▄▄▀ █▄▀▀ "], ["sleep_1", " \n ▄▀█▀▀▀▄ \n ▀▀ ▀█▀ █\n ▄▀▀▀▀▀▄▀▀█ █\n █▄ ▄▄ ▀▄ █▄▀\n █▄▄▄▄▄▄▄ █ █▄ \n▄▀ ▄▄▄ ▀▄▄▀▀▄ █\n▀▄▄▄▀▄▄▄▄▀ █▄▀▀ "], ["sleep_2", " ▄▀█▀▄ \n ▀▀ █ █\n ▄▄▄▄▄ █ █\n ▄▀ ▀█▀▀▄ █\n ▄▀▀ ▀▀ █ █ \n █▀▀▀▀▀▀█ █▄▀▀▄\n█ ▄███▄ █▀▄ █ █\n▀▄█ █▄▄▀ █▄▀▀ "], ["walk_1", " ▄▀█▀▀▀▄ \n ▀▀ ▀█▀ █ \n ▄▀▀▀▀▄█ \n ▄▄ ▄▀▀▀▀▀▄ █▄ \n █ ▄█ ▄▄ ▀▄ █\n▄▀▀█▄█▄▄█▄█ █▄▀\n█▄▀ ▄▄▄ ▀▄▄▀█ █\n ▀▄█ █▄▄▀ ▀▀ "], ["walk_2", " ▄▄▄ \n ▄▀█▄▄▄▀▄\n ▀▀ █ █\n ▄▀▀▀▀▀▄▀▀▄ █\n ▄█ ▄▄ █ █▀ \n █▄█▄▄█▄█ █▄▀▀▄\n▄▀ ▄▄▄ ▀▄█▄ █▄▀\n▀▄█ █▄▄▀ █▄▀ "]]], + ["scorpiomon_x", [["angry", " ▄▄▄▄ \n ▄▀▀█▀▄▄▄ ▀▄\n ▀▀▀▀▄█▄▄▄█ █\n ▄▄▄█▄▄▄ ▀▄█ \n ▄█ ▄ ▀█▀█ █\n ▄███▄▄██ ▄██▄ █\n█▀ ▄▄ ▄▄█▀▄ █▀ \n▀▄▄▄█▄▄▄█ █▄▄▀ "], ["attack", " ▄▀▀██▀▀▀▀▄ \n ▀▀▀▀ ▄▀▀▀▄ █ \n ▄▀▄ ▄▀▀▀▀█▀▄ \n▄▀▄▄▄█▀▀▀▀▀█▄▄ █\n█▀ ▄▀▄ ▄▀█ █▄▀█\n ▄▀▀▀▀▀▀▀▀▄█▀▀▄ \n█ ▄█████▄ █ █ █ \n▀▄▄█▄ ▀█▄▄█▀▀ "], ["eat_1", " ▄▀▀██▀▀▀▀▄ \n ▀▀▀▀ ▄▀▀▀▄ █ \n ▄▀▄ ▄▀▀▀▀█▀▄ \n █ ▄▄█▀▀▀▀▀█▄▄ █\n █▀▄▀▄ ▄▀█ █▄▀█\n ▄▀▀▀▀▀▀▀▀ █▀▀▄ \n█ ▄████▄ █ █ █ \n▀▄█▄ ▄█▄▀ ▀▀ "], ["eat_2", " ▄▄▄▄ \n ▄▀▀█▀▄▄▄ ▀▄\n ▀▀▀▀▄█▄▄▄█ █\n ▄▄▄█▄▄▄ ▀▄█ \n ▄█ ▄ ▀█▀█ █\n █▄█▄█▄█ ▄██▄ █\n █ ▄▄▄▄ █▀▀▄ █▀ \n ▀▄█▀█▄▄▀ █▄▄▀ "], ["happy", " ▄▀▀██▀▀▀▀▄ \n ▀▀▀▀ ▄▀▀▀▄ █ \n ▄▀▄ ▄▀▀▀▀█▀▄ \n █ ▄▄█▀▀▀▀▀█▄▄ █\n █▀▄▀▄ ▄▀▄ █▄▀█\n ▄▀▀▀▀▀▀▀▄█▀▀▄ \n▄▀▄██████ ▀▄█ █ \n▀▄█▄ ▄█▄▀▀▀ "], ["injured_1", " ▄▄▄▄ \n ▄▀▀█▀▄▄▄ ▀▄\n ▀▀▀▀▄█▄▄▄█ █\n ▄▄▄█▄▄▄ ▀▄█ \n ▄▀ ▄ ▀█▀█ █\n ██▄▄▄██ ▄██▄ █\n █ ▄▄▄▄ ▄▀▀▄ █▀ \n ▀▄▄▀▀▄█▄ █▄▄▀ "], ["injured_2", " \n ▄▄▄▄▀▀▀▀▄ \n ▄█▄▄▀▄▀▀▀▄ █\n ▄▀▀▀▀█▀▄▀\n ▄▀▀▀▀▀▀█▄▄█▀▄\n ██ █▄ █▄▀ █\n▄▀▀▀▀▀▀▀▄ ▀█▀█▀ \n▀▄▄█▀▀▄█▄▄█▄▄▀ "], ["sleep_1", " ▄▄▄▄ \n ▄▀▀█▀▄▄▄ ▀▄\n ▀▀▀▀▄█▄▄▄█ █\n ▄▄▄█▄▄▄ ▀▄█ \n ▄█▄ ▄▄ ▀█▀█ █\n ▄█▄▄▄▄▄▄ ▄██▄ █\n█▀ ▄▄ ▄▄█▀▄ █▀ \n▀▄▄█▀█▄▄█ █▄▄▀ "], ["sleep_2", " ▄▀▀██▀▀▀▀▄ \n ▀▀▀▀ ▄▀▀▀▄ █ \n ▄▀▄ ▄▀▀▀▀█▀▄ \n █ ▄▄▀▀▀▀▀▀█▄▄ █\n █▀▄▀▀ ▀▀ ▀█▄▀█\n ▄▀▀▀▀▀▀▀▄█▀▀▄ \n █ ▄███ ▄▀ █ █ \n ▀▄█▄ ▀▄█▄ ▀▀ "], ["walk_1", " ▄▀▀██▀▀▀▀▄ \n ▀▀▀▀ ▄▀▀▀▄ █ \n ▄▀▄ ▄▀▀▀▀█▀▄ \n █ ▄▄█▀▀▀▀▀█▄▄ █\n █▀▄▀▄ ▄▀█ ▀█▄▀█\n ▄▀▀▀▀▀▀▀▄█▀▀▄ \n █ ▄▀▀█ ▄▀ █ █ \n ▀▄█▄ ▀▄█▄ ▀▀ "], ["walk_2", " ▄▄▄▄ \n ▄▀▀█▀▄▄▄ ▀▄\n ▀▀▀▀▄█▄▄▄█ █\n ▄▄▄█▄▄▄ ▀▄█ \n ▄█ ▄▄ ▀█▀█ █\n ▄█▄█▄█▄█ ▄██▄ █\n█▀ ▄▄▄ ▄▀▀▄ █▀ \n▀▄█▄ ▀▄█▄ █▄▄▀ "]]], + ["seadramon", [["angry", " \n ▄▄▀▀▀▀▀▄▄▄▄▄ \n ▄▀ ▄█ ▄▄▄█▄ \n█▄▀▀▀▄▄ ▄▄▄█▄ \n ▀▄▄▄▄▄▄▀ █ ▄ \n █▀▄ ▄▀ █ █\n █▄▀▄ ▀▀▀ █\n ▀▄█▄█▄█▄█▄▄▀"], ["attack", " ▄▄▀▀▀▀▀▀▀▄▄▄▄\n ▄▀ ▄█▀ ▄▄▄█▄\n ▀▀▀▀▀▄ ▄▄█▄ \n █ ▄▀▄▀ \n █▀▀▀▀ ▄▀ █▄▄ \n ▀█▀█▀ █ ▀▄▀▄\n █▀▄▀▄ ▀▀▀ █\n ▀▄█▄█▄█▄▄▀ "], ["eat_1", " ▄▄▀▀▀▀▀▀▄▄▄▄ \n ▄▀ ▀▀▄ ▄▄▄█▄ \n ▀▀▀▀▀▄ ▄▄▄█▄ \n █ █ █ \n █▀▀▀▀ ▄▀ █▄▄ \n ▀█▀█▀ █ ▀▄▀▄\n █▀▄▀▄ ▀▀▀ █\n ▀▄█▄█▄█▄▄▀ "], ["eat_2", " \n ▄▄▀▀▀▀▀▄▄▄▄▄ \n ▄▀ ▄▀▄ ▄▄▄█▄ \n█▄▄ ▄▄▄█▄ \n ▀▄▄▄▄▄▄▀ ▄▀ \n ▄▀█ ▄▀ ▄ \n █▄▀▄ ▀▀▀▀ █\n ▀▄█▄█▄█▄█▄█▄▀"], ["happy", " ▄▄▀▀▀▀▀▀▄▄▄▄ \n ▄▀ ▄▀▄ ▄▄▄█▄ \n ▀▀▀▀▀▀█ ▄▄▄█▄ \n ▄▀ █ █ \n █▀▀▀ ▄▀ █▄▄ \n ▀█▀█▀ █ ▀▄▀▄\n █▀▄▀▄ ▀▀▀ █\n ▀▄█▄█▄█▄▄▀ "], ["injured_1", " \n \n \n ▄▄▀▀▀▀▀▄▄▄▄▄ \n ▄▀ ▄▄▄█▄ \n█▄▄ ▀▄▄ ▄▄▄█▄▀▄\n █▄▄▄▄▄▄█ ▄ █\n ▀▄█▄█▄█▄█▄█▄▄▀ "], ["injured_2", " \n \n \n \n ▄▄▀▀▀▀▀▄▄▄▄▄ \n ▄▀ ▄▄▄█▄ \n█▄▄ ▀▄▄ ▄▄▄█▄ █\n ▀▄▄▄▄▄▄██▄█▄▄▄▀"], ["sleep_1", " \n \n ▄▄▀▀▀▀▀▄▄▄▄▄ \n ▄▀ ▄▄▄█▄ \n█▄▄ ▀▀ ▄▄▄█▄ \n ▀▄▄▄▄▄▄▀ ▀▄ ▄▀█\n █▄▀▄ ▀▀▀▀ █\n ▀▄█▄█▄█▄█▄█▄▄▀ "], ["sleep_2", " \n ▄▄▄▄▄ \n ▄▀▀ ▀▀▀█▀ \n▄▀ ▄▄ ▀▀█▀▀ \n▀█▀ ▄▀█▀▀▀ \n █▀█▀▀▀▄█ ▄▄ \n █▄▀▄ ▀▀▀▀ █\n ▀▄█▄█▄█▄█▄█▄█▄▀"], ["walk_1", " ▄▄▀▀▀▀▀▄▄▄▄▄ \n ▄▀ ▄█▀ ▄▄▄█▄ \n█▄▄▄▄▄▄▄ ▄▄█▄ \n ▀▄▄▄▄▄▄▄▀ █ \n ▄█ █▄▄ \n █▀▄▀ █ ▀▄▀▄\n █▀▄▀▄ ▀▀▀ █\n ▀▄█▄█▄█▄▄▀ "], ["walk_2", " ▄▄▄▄▄ \n ▄▀▀ ▄▄ ▀▀▀█▀ \n▄▀ ▀▀ ▀▀█▀▀ \n▀█▀▀▀▀▀▀ ▄▀▀█▀ \n ▀▀▀▀█▀▀ ▄▀ ▄ \n █▀▄ █ █ █\n █▄▀▄ ▀▀▀ █\n ▀▄█▄█▄█▄█▄▄▀"]]], + ["seadramon_x", [["angry", " \n ▄▄▀▀▀▀▀▀█▀ \n ▄▀▀ ▄█ ▀▀▀█▀▀\n█▄▀▀▄▄▄ ▀▀█▀▀ \n ▀▄▄▄▄▄▄▀▀▀█▀▀▄ \n █▀▄ █ █ █\n █▄▀▄ ▀▀▀ █\n ▀▄█▄█▄█▄█▄▄▀"], ["attack", " ▄▄▀▀▀▀▀▀▀█▀ \n ▄▀▀ ▄█▀ ▀▀█▀▀\n ▀▀▀▀▄▄▄ ▀█▀▀ \n ▄▀▄▀█▀▀ \n █▀▀▀▀ ▄▀▄▀▄▀▄ \n ▀█▀█▀ █ ▀▄ █\n █▀▄▀▄ ▀▀▀ █\n ▀▄█▄█▄█▄▄▀ "], ["eat_1", " ▄▄▀▀▀▀▀▀▀█▀ \n ▄▀▀ ▄▀▄ ▀▀█▀▀\n ▀█████▄ ▀█▀▀ \n ██▀▀█ ▄▀█▀▀ \n █▀▀▀▀ ▄▀▄▀▄▀▄ \n ▀█▀█▀ █ ▀▄ █\n █▀▄▀▄ ▀▀▀ █\n ▀▄█▄█▄█▄▄▀ "], ["eat_2", " \n ▄▄▀▀▀▀▀▀█▀ \n ▄▀▀ ▄▀▄ ▀▀▀█▀▀\n█▄▄▄▄▄▄ ▀▀█▀▀ \n ▀▄▄▄▄▄▄▀▀▀▀█▀▄ \n ▄▀▄ ▄▀ █ █\n █▄▀▄ ▀▀ █\n ▀▄█▄█▄█▄█▄▀ "], ["happy", " ▄▄▀▀▀▀▀▀▀█▀ \n ▄▀▀ ▄▀▄ ▀▀█▀▀\n ▀▀████▄ ▀█▀▀ \n ████ ▄▀█▀▀ \n █▀▀▀▀ ▄▀▄▀▄▀▄ \n ▀█▀█▀ █ ▀▄ █\n █▀▄▀▄ ▀▀▀ █\n ▀▄█▄█▄█▄▄▀ "], ["injured_1", " \n \n \n ▄▄▀▀▀▀▀▀█▀ \n ▄▀▀▄ ▀▀▀█▀▀\n█▄▄▄ ▀▀ ▀▀▀█▀▄\n ▀▄▄▄▄▄▄█▀█▀▀ █\n ▀▄█▄█▄█▄█▄▄▄▄▀ "], ["injured_2", " \n \n \n \n ▄▄▀▀▀▀▀▀█▀ \n ▄▀▀ ▀▀▀██▀\n█▄▄ ▀▄▄ ▀▀▀█ █\n ▀▄▄▄▄▄▄█████▄▄▀"], ["sleep_1", " \n \n ▄▄▀▀▀▀▀▀█▀ \n ▄▀▀ ▄▄▄ ▀▀▀█▀▀\n█▄▄▄▄▄▄ ▀▀█▀▀ \n ▀▄▄▄▄▄▄▀▀████ \n ▄█▀▄ ▀▀▀ ▀▄\n ▀▄█▄█▄█▄█▄▄▄▀"], ["sleep_2", " \n ▄▄▄▄▄▄▄▄ \n ▄▄▀▀ ▄▄█▄▄▄\n▄▀ ▀▀▀ ▄▄▄█▄ \n▀█▀▀▀▀▀ ▄▄▄▄█▄ \n ▀▀▀█▀█ ▄ █▄ \n █▄▀▄ ▀▀ ▀▄\n ▀▄█▄█▄█▄█▄▄▀"], ["walk_1", " ▄▄▀▀▀▀▀▀█▀ \n ▄▀▀ ▄█▀ ▀▀▀█▀▀\n█▄▄▄▄▄▄ ▀▀█▀▀ \n ▀▄▄▄▄▄▄▀▀▀▀█▀ \n ▄▀▄▀ ▄▀▄▄ \n █▀▄▀ █ ▀▄▀▄\n █▀▄▀▄ ▀▀▀ █\n ▀▄█▄█▄█▄▄▀ "], ["walk_2", " ▄▄▄▄▄▄▄▄ \n ▄▄▀▀▄▄ ▄▄█▄▄▄\n▄▀ ▀▀ ▄▄▄█▄ \n▀█▀▀▀▀▀ ▄▄▄▄█▄ \n ▀▀▀▀██ ▄▀▄▄ \n ▄▀▄ █ █ █\n █▄▀▄ ▀▀ █\n ▀▄█▄█▄█▄█▄▀ "]]], + ["seasarmon_x", [["angry", "▄▄ ▄ ▄ ▄ \n█ ▀▄▀ ▀ ▀▄█▄ \n █▀ ▄█ ▀ ▄▀ \n█ ▄▀▄ ▀▄▀ ▄▀█\n▀█▀▀▀▄▄▀ █▄▄▄▀ █\n █▀▄▄▄█▀ ▄▀ ▀▄▀\n ▀ ▄▀ █ ▀▀█▄▄ █\n █▄▄█▄▄▄█ █▄▄▄█"], ["attack", "█▀▀▄▄▀▄▀▄▀▄ \n █▀▀ ▄ ▄▀▀█ \n█ ▀▀▄ ▄▀▄ ▄▀█\n▀████▀ █ ▄▀ █ █\n █████ ▄▀▀█▀▄▄▀\n▄▀▄▄▄▄▄▀▄▄█ █ \n▄▀ ▄▀ ▄▄▀▀█▄▄ █\n▀▀▀▀▀▀ █▄▄▄█"], ["eat_1", "█▀▄ ▄▀▄▀▄▀▄ \n▀▄▄▀ ▄▄ ▄▀▀█ \n▄▀ ▀▀ ▄▀▄ ▄▄\n█▄▄▄ ▄▀▄ ▄▀ █ █\n ▀███▄▄▀▄▀▀█▀▄ █\n █▀▀▀ █▄▄▀ █ \n ▀ █▀▀█ ▄▀▀▄ █\n █▄▄█▄▄▄█ █▄▄▄█"], ["eat_2", "▄▄ ▄ ▄ ▄ \n█ ▀▄▀ ▀ ▀▄█▄ \n █▀ ▄▀▀▄ ▄▀ \n█ ▄▀▄ ▀▄▀ ▄▀█\n▀█▀▀▀▄▄▀ █▄▄▄▀ █\n █▀▄▄▄█▀ ▄▀ ▀▄▀\n ▀ ▄▀ █ ▀▀█▄▄ █\n █▄▄█▄▄▄█ █▄▄▄█"], ["happy", "█▀▄ ▄▀▄▀▄▀▄ \n▀▄▄▀ ▄ ▄▀▀█ \n▄▀ ▀ ▀▄ ▄▀▄ ▄▄\n▀████▄▀ █▄▀ █ █\n ████▀▀▄▀▀█▀▄ █\n █▄▄▄▄▀▄▄▀ █ \n ▀ █ ▄ ▄▀▀▄ █\n █▄▄█▄▄▄█ █▄▄▄█"], ["injured_1", " \n▄▄ ▄ ▄ ▄ \n█ ▀▄▀ ▀ ▀▄█▄ \n █▀ █▄ ▀ ▄▀ \n█ ▄▀▄ ▀▄▀ █▀▄\n▀█▀▀▀▄▄▀ █▄▄▄▀ █\n▀▄▀▀▄▄▄█▀▄█▄ ▀▄▀\n█▄▄▄█▄▄▄██▄▄▄▄▄█"], ["injured_2", " \n \n█▀▄ ▄▀▄▀▄▀▄ \n▀▄▄▀▄ ▄▀▀█ \n▄▀ ▀▀▄ ▄▀▄ ▄▄ \n█▄▄▄▄▀ █ ▄▀▄▄█ █\n █▄▄▄██▄ ██▄ ▀▄█\n█▄▄▄█▄▄▄██▄▄▄▄▄█"], ["sleep_1", " \n▄▄ ▄ ▄ ▄ \n█ ▀▄▀ ▀ ▀▄█▄ \n █▀ ▄▄ ▀ ▄▀ \n█ ▄▀▄ ▀▄▀ ▄▀█\n▀█▀▀▀▄▄▀ █▄▄▄▀ █\n▀▄▀▀▄▄▄█▀▄█▄ ▀▄▀\n█▄▄▄█▄▄▄██▄▄▄▄▄█"], ["sleep_2", " \n█▀▄ ▄▀▄▀▄▀▄ \n▀▄▄▀ ▄▀▀█ \n▄▀ ▀▀▄ ▄▀▄ ▄▄\n█▄▄▄▄▀ █ ▄▀ █ █\n▄▀▄▄ ▀▀▄▄▀▀█▀▄ █\n ▄▀ ▀█▀▀ ▄█▄ ▀▄\n█▄▄▄█▄▄▄██▄▄▄▄▄█"], ["walk_1", "█▀▄ ▄▀▄▀▄▀▄ \n▀▄▄▀ ▄▄ ▄▀▀█ \n▄▀ ▀▀▄ ▄▀▄ ▄▄\n█▄▄▄▄▀ █ ▄▀ █ █\n ▀▄▄ ▀▀▄▄▀▀█▀▄ █\n ▄▀ █▀▀▀▄▄▀ █ \n ▄▀ █ ▄▀▀▄ █\n █▄▄█▄▄▄█ █▄▄▄█"], ["walk_2", "▄▄ ▄ ▄ ▄ \n█ ▀▄▀ ▀ ▀▄█▄ \n █▀ ▄█▀ ▀ ▄▀ \n█ ▄▀▄ ▀▄▀ ▄▀█\n▀█▀▀▀▄▄▀ █▄▄▄▀ █\n █▀▄▄▄█▀ ▄▀ ▀▄▀\n ▀ ▄▀ ▄▀▀█▄▄▄ █\n ▀▀▀▀▀▀▀ █▄▄▄█"]]], + ["seraphimon", [["angry", " ▄██ ▄▀█ \n ▄█▀▀▀▀▄ █ ▄▄ \n █ █ ▄▀ █ \n ▄█▄█▄▄ █▀▄▄▄▀▄\n█ █ ▀ █▄ █ ▄▀\n █ ▀█▀█▀▀ █▄▀▀▄ \n █▄▄▀▀█▄▄██▀▀▄ █\n█▄▄█▄▄▀█▄▄▄█ ▀▀"], ["attack", " ▄▄▄▄▀▀█ \n ▄▀ █▄▀▄▄▀█\n▄▄ █▀▀ █ ▀▄█▄ █\n█ ▀▄█▄▄▀▀▀▄▀ █▀▄\n▄▀▀ ▄█▄ █▀▀▄▄▀\n█▄▀███▄▄▀▀██▄ ▀▄\n ▄█ █▄▄█▄▄█▀▀▀\n █▄▄██▀▀▀█▄▄▄█ "], ["eat_1", " ▄▄██▄▄▀▀▀█ \n █▄█▄▄▄ █▄▀ ▄▄ \n▄▀█▄█▄▄▄▄█▀▀█ █ \n▀▄██████ █▄▄▀▀ █\n█ █▀▀▀▀ ▄▀ █▄▀ \n█ ██████ █ ▀▄\n ███ █▄███▀ ▀▄█\n█▄▄██▀▀█▄▄▄█ "], ["eat_2", " ▄▄ ▄▄▄▄ \n ▄█▀▀▀▀▄ ▄▀ ▄▄ \n █▄█▄▄▄ █ ▄▀ █ \n ▄█ ▀ █▀▄▄▄▀▄\n█ █▀▀▀▀▀█▄ █ ▄▀\n █ ▀█▀█▀▀ █▄▀▀▄ \n █▄▄▀▀█▄▄██▀▀▄ █\n█▄▄█▄▄▀█▄▄▄█ ▀▀"], ["happy", " ▄█▀▀▀▀▄▀▀█ \n █▄█▄▄▄ █▀ ▄▀█ \n▄▀█ ▀ █▀▀█ █ \n▀▄▀████▀█ ▄█▀ █\n█ █▄▄▄▄▄▀█▀ ▀▄▀ \n █▄▄█▄▄▄▄█▄▄█▀▀▄\n █▄█ █▄▄▄█▀ ▀▄█\n█▄▄██▀▀█▄▄▄█ "], ["injured_1", " \n ▄███▄▀▀▀█ \n █▀ ▀▄▀ \n ▄█ █▄▄▀▀▀█\n█ █▄█▄▄▄ █ ▀▄██▄\n▄▀█▄█▄▄▄▀▄▀█ ▄▄▀\n█▀█▄▄▄▄▄█▀▀▄█▀▄ \n█▄▄█▄▄█▄█▄▄█▀▄▄█"], ["injured_2", " \n ▄▄▄ ▄▄▄▄ \n ▄█▀▀▀▀▄ ▄▀ \n █ █▄▄▀▀▀█ \n██ ▄ █ ▀▄██▄ \n▄█▀█▀▀▀▄▀▀█ ▄▄▀ \n█▀█████▄█▀▀█▀▄ \n█▄▄█▄▄█▄█▄▄█▄▄█ "], ["sleep_1", " \n▄▀▄ ▄█▀█▀▀█▀█▄ \n█▀█▀█▄█ █ ▀█▀ ██\n█▄███ █▄█ █▄ █ \n█▀ █▀▀ ▀▀▄ ▀▀█\n▄▀ ▄▀\n█ ▄ ▄█ ▄▄ █\n ▀▀▀ ▀▀ ▀▀ ▀▀ "], ["sleep_2", " ▄ ▄▄▄▄▄▄▄ \n█▄█▄▄▀█ █ ▄█▄▀█▄\n█ █▄█▀█ █ █ █▀\n█▀▄ ▄▀█▀▀▄▄▄▄▄█ \n█▀ ▄▀▄ ▄▀\n▀▄ █\n█ ▄▀▄▄█▄ ▄▀\n ▀▀▀▀ ▀▀▀ "], ["walk_1", " ▄██▄▄▀▀▀█ \n █▀▄ ▀▄▀ ▄▀█ \n ▄█▀█▀▀▀ █▄█▄ █ \n█ █▄▄▄▄▄▄▀ █▀ █\n▄▀█▄▄▄▄▄▀▄██▄▄▀ \n▀▄█▄█▄▄▄▄▀ ▀█ ▀▄\n ███ █▄█▄▄▀ ▀▄█\n█▄▄██▀▀█▄▄▄█ "], ["walk_2", " ▄▄ ▄▄▄▄ \n ▄█▀▀▀▀▄ ▄▀ ▄▄ \n █▄█▄▄▄ █ ▄▀ █ \n▄▀█ ▀ █▀▀█▄▀▄\n▀▄█▀▀▀▀▀█ ▄▄▀ ▄▀\n█ █▀█▀▀▀▄▀ ▀█▀▄ \n ███▀▀█▀█▄▄▀▀▄ █\n█▄▄█▄▄▀█▄▄▄█ ▀▀"]]], + ["shadramon", [["angry", " ▄▄ ▄▄▄ ▄▄ ▄▄\n █▀▀ ▀██▀ ▄▀██\n █ ▄ █▄▀ ▀██\n ▀▄▄▄▀▀ ▄█▄ ▀█▀\n ▄█▄▄█▀▀█▄▀▀▀█ \n █ █▄▄ ▄██ ▄ █ \n ▀██▄▄▀▀ ██▄▄▀ \n █▄▄█ ▀▀█▄▄▄█ "], ["attack", " ██▄▀▀█▄██▀██\n ▄▀ ▄ ▀█ ▀██\n █ ▀▀ █ ▀██\n ▄▄▄█▀▀▄▄▄██▄▀▀ \n█▄ ▄▀▀ █▄ ▀█ \n▀▄▄▄██▀▄█▀▄▄▄▀ \n ▄█▄▄▄ ▄█▄ \n █▄▄█ ▀█▄▄▄█ "], ["eat_1", " ██▄▀▀█▄██ ▄▄\n ▄▀ ▄ ▀█ ▄▀██\n █▄▄▄▀ ▀ █▄▀ ▀██\n ███▄▀▀█▄▀▀▄██▀\n▄▀█▄█ ▀ ██▄▀ \n▀▄██▀▀▄▄▄█▀ \n ▄███▄▄▄██▄ \n █▄▄█ █▄▄▄█ "], ["eat_2", " ▄▄ ▄▄▄ ▄▄ ▄▄\n █▀▀ ▀██▀ ▄▀██\n █ ▄▀▄ █▄▀ ▀██\n ▀▄▄▄ ▄█▄ ▀█▀\n ▄█▄▄█▀▀█▄▀▀▀█ \n █ █▄▄ ▄██ ▄ █ \n ▀██▄▄▀▀ ██▄▄▀ \n █▄▄█ ▀▀█▄▄▄█ "], ["happy", " ██▄▀▀█▄██ ▄██\n ▄▀ ▄ ▀█ ▄▀▄██\n▄█▄▄▄▀ ▀ ██▀▀▄█▀\n█ ████ ▄█ ▀ █ \n▀▄██▀▀ █▀▄▄▄▀ \n █▀▀▄█▀▄▀ \n ███▀▄▄▄██▄ \n █▄▄█ █▄▄▄█ "], ["injured_1", " \n ▄▄ ▄▄▄ ▄▄ \n █▀▀ ▀██▀ \n █ █▄ █▄▄▀▀██\n ▀▄▄▄ ▄█▄ ▀█▀\n▄▄▀▄▄█▀▀▀▄▄█▀█ \n█ ▀▄▄▄▄▄█ █ ▀▄\n█▄▄██▄▄▄█▄▄▄██▄▀"], ["injured_2", " \n \n ██▄▀▀█▄██ \n▄▀ ▄ ▀█ ▄▄▄▄▄\n█ ▀▀ █▀▀ ▄███\n █▀▀▄▄▄█▀▀▄▄▄█▀ \n█ ▀█▄▄▄▄█ █ ▀▄\n█▄▄██▄▄▄█▄▄▄██▄▀"], ["sleep_1", " \n \n ██▄▀▀█▄██ ▄██ \n▄▀ ▀█ ▄▀▄██ \n█ ▀▀▀ █▀ ▄██ \n █▀▀▄▄▄█▀▀▄▄▄█ \n█ ▀█▄▄▄▄█ █ ▀▄\n█▄▄██▄▄▄█▄▄▄██▄▀"], ["sleep_2", " \n ▄▄ ▄▄▄ ▄▄ ▄▄\n █▀▀ ▀██▀ ▄▀██\n █ ▄▄▄ █▄▀ ▀██\n ▀▄▄▄ ▄█▄ ▀█▀\n▄▄▀▄▄█▀▀▀▄▄█▀█ \n█ ▀▄▄▄▄▄█ █ ▀▄\n█▄▄██▄▄▄█▄▄▄██▄▀"], ["walk_1", " ██▄▀▀█▄██ ▄██\n ▄▀ ▄▄▀█ ▄▀▄██\n █ █▄▀ █▀ ▄██\n █▀▀▄▄▄█▀▀▄▄▄▀ \n ▄█▀▀ █▄▀▀▀▄ \n █ █▀▀▄█▀█ ▄ █ \n ▀███▀▄▄▄██▄▄▀ \n █▄▄█ █▄▄▄█ "], ["walk_2", " ▄▄ ▄▄▄ ▄▄ ▄▄\n █▀▀ ▀██▀ ▄▀██\n █ ▄▀█ █▄▀ ▀██\n ▀▄▄▄▀▀ ▄█▄ ▀█▀\n ▄█▄▄█▀▀█▀▀▀██ \n█ █▄▄ █ ▄ █▀ \n▀▄▄█▄▄▀▀█▄▄█▄ \n █▄▄█ ▀▀█▄▄▄█ "]]], + ["shakkoumon", [["angry", " \n ▄▄▀▀▀▀▀▀▀▄ \n █▄▄█▄█▄█▄▄ ▀▄ \n ▄▀████▀█▄▀▄ \n ▄▄██▄▄██▄▄██▄▀█\n ▀▄▀▄ ▀▄ ▀▄ ▄▄▀\n ▀▀▀▀▀▀▀▀▀▀ \n ▄▄▄▄▄▄▄▄▄▄ "], ["attack", " ▄▄▄▄▄▄▄ \n ▄▀▀ ▀▄ \n ▀▀▀███▀▀██▄ ▀▄ \n ███▄▄█████ █ \n ▀ ▀ ▀ ▀███ █▄\n ▄████▄▀\n █▀█▀▀█▀▀█▀▀▀ ▄▀\n ▀▄█▄▄█▄▄█▄▄▀ "], ["eat_1", " \n ▄▄▀▀▀▀▀▀▀▄ \n █▄▄█▄█▄█▄▄ ▀▄ \n ▄█▄███▄███▄ █ \n ▀▀▄ ▀███ █▄\n ▄▀ ████▄▀\n █▀█▀▀█▀▀█▀▀▀ ▄█\n ▀▄█▄▄█▄▄█▄▄▀ "], ["eat_2", " \n \n ▄▄▄▄▄▄▄ \n ▄▀▀▄ ▄ ▄ ▀▄ \n ▀▀▀█▀██▀██▄ █ \n █▀▀▀▀▀████ █▄\n █▀█▀▀█▀▀█▀▀▀▀ █\n ▀▄█▄▄█▄▄█▄▄▀▀ "], ["happy", " ▀ \n▀ ▄▄▀▀▀▀▀▀▀▄ \n █▄▄█▄█▄█▄▄ ▀▄ \n▄ ▄█▄██▄███▄ █ \n ▄ █ ▀▀▀▀ ███ █▄\n ▀▄ ▄████▄▀\n █▀█▀▀█▀▀█▀▀▀ ▄█\n ▀▄█▄▄█▄▄█▄▄▀ "], ["injured_1", " ▄ \n \n▀ ▄▄▄▄▄▄▄▄ \n ▄▀▀▄ ▄ ▄ ▀▄ \n ▀▀▀█▀███▀█▄ ▀▄ \n █▄█▀▀▀█▄██▄█▄\n █▀█▀▀█▀▀█▀▀▀▀ █\n ▀▄█▄▄█▄▄█▄▄▀▀ "], ["injured_2", " \n \n \n ▄▄▄▄▄▄▄▄ \n ▄▀ ▄ ▄ ▀▄ \n █ ▄█ ▄█ ▄█ █▄\n ▀█ ▀█ █▀ ▀ █\n ▀▄▄▄█▄▄█▄▄▀▀ "], ["sleep_1", " ▄ \n ▄ \n \n ▀ ▄▄▄▄▄▄▄▄ \n ▄▀▀▄ ▄ ▄ ▀▄ \n ▀██▀▀██▀▀██▄ █▄\n █▀█▀▀█▀▀█▀▀▀▀ █\n ▀▄█▄▄█▄▄█▄▄▀▀ "], ["sleep_2", " \n \n ▄▄▄▄▄▄▄ \n ▄▀▀▄ ▄ ▄ ▀▄ \n ▀▀▀█▀▀█▀▀█▄ █ \n ████▀█████ █▄\n █▀█▀▀█▀▀█▀▀▀▀ █\n ▀▄█▄▄█▄▄█▄▄▀▀ "], ["walk_1", " \n \n ▄▄▄▄▄▄▄ \n ▄▀▀▄ ▄ ▄ ▀▄ \n ▀▀▀▀██████▄ █ \n ▄██▀██▀███ █▄\n █▀█▀▀█▀▀█▀▀▀▀ █\n ▀▄█▄▄█▄▄█▄▄▀▀ "], ["walk_2", " ▀ \n ▄ \n \n ▀ ▄▄▄▄▄▄▄▄ \n ▄▀▄ ▄ ▄ ▀▄ \n █▄█▀███▀█▄▄▄ █▄\n ▄▀█▀▀█▀▀█▀▀▀▀ █\n ▀▄█▄▄█▄▄█▄▄▀▀ "]]], + ["shellmon", [["angry", " \n ▄ ▄██▄ ▄\n ██▀█▄▄▄▀█▀\n ▄▄▄██▄▄▀▀██ \n ▄██▀▀ ▀▀██▄▀█\n █ ▀ ▄█ ▀██▀\n █ ▄ ▄ ▀██\n█▄██▀▀█▄▄██▄▄▄█▀"], ["attack", " \n ▄▄▄▄▄▄ ▄██▄ ▄\n▄▀ ▀ ▄█ ▀█▄▄▄▀██\n█▄▄ ▄▄▄▄ ▀█▀██ \n ▀███▀▀▀█▄ ▀█▄▀█\n ▄██▄▄▄██▀ ▀██▀\n█▄▄▄▄▄▄▄▄▀▀▄ ▀██\n█▄▄▄▀▀▀█▄▄▄█▄▄█▀"], ["eat_1", " \n ▄▄▄▄▄▄ ▄██▄ ▄\n▄▀ ▀ ▄▄▄▀█▄▄▄▀██\n█▀ ▀ ▀ ▀█▀██ \n ▀█████▀██ ▀█▄▀█\n ▄████ ▀▄ ▀██▀\n█▄▄▄▄▄█▄▄ ▄ ▀██\n█▄▄▄▀▀▀████▄▄▄█▀"], ["eat_2", " \n ▄▄ \n █▄▄█▀▀▀▄▄█\n ▀█▄▀▀██▄█ \n ▄███▀▀██▄▄▀█▄\n ▄▀█▀ ▄▄ ▀██▄█\n █ ▀ ▀ ██▄\n██▄▄▄▄▄█▄▄█▄▄▄██"], ["happy", " \n ▄▄▄▄▄▄ ▄██▄ ▄\n▄▀ ▀ ▄▄ ▀█▄▄▄▀██\n█▀ ▀ ▀ ▀█▀██ \n ▀███▀▀▀█▄ ▀█▄▀█\n ▄██▄▄▄██▀ ▀██▀\n█▄▄▄▄▄▄▄▄▀▀▄ ▀██\n█▄▄▄▀▀▀█▄▄▄█▄▄█▀"], ["injured_1", " \n ▄▄ \n █▄▄█▀▀▀▄▄█\n ▀█▄▀▀██▄█▀\n ▄██▀▀█▄▄▄▀█\n ▄▀█████▄▄▄▀█▀\n █ █▀ █▄▀██ █\n ▀▄▄▄▄███▄██▀ "], ["injured_2", " \n \n ▄ ▄██▄ ▄\n ██▀█▄▄▄▀██\n ▄██▄▄▀▀▀█▄\n ███▄▄▀▀▀█▄█\n ███▀▀█▀██▄▀▄\n █▄▄▄▄██▄██▄▀"], ["sleep_1", " \n ▄▄ \n █▄▄█▀▀▀▄▄█\n ▀█▄▀▀██▄█ \n ▄▄██████▄▄▀█▄\n ██████▀▀████▄▀\n ▄█ █▀ ▄▄████\n█▄█▄▄▄██▄█▄▄███▀"], ["sleep_2", " \n ▄ ▄██▄ ▄\n ██▀█▄▄▄▀█▀\n ▄▄▄██▄▄▀▀██ \n ▄████▀▀▀▀██▄▀█\n █▀█▀ ▀██▀\n █▄ ▄▄▄ ▄▄ ▀██\n██▄▄▄▄▄▄▄█▄▄█▄█▀"], ["walk_1", " \n ▄ ▄██▄ ▄\n ██▀█▄▄▄▀█▀\n ▄▄▄██▄▄▀▀██ \n ▄██▀▀ ▀▀██▄▀█\n █ ▀ ▄▀█▀ ▀██▀\n █ ▄ ▄ ▀██\n█▄██▀▀█▄▄██▄▄▄█▀"], ["walk_2", " \n ▄▄ \n █▄▄█▀▀▀▄▄█\n ▀█▄▀▀██▄█ \n ▄███▀▀██▄▄▀█▄\n ▄▀█▀ ▄▄▄ ▀██▄█\n █ ▀ ▀ ██▄\n██▄▄▄▄▄█▄▄█▄▄▄██"]]], + ["shellnumemon", [["angry", "█▄█ ▄ ▄ █▄█ \n▀▄█▀█ █▀█▄▀▀▀▄ \n █▄█▄█▀ █ \n ▄▀▄ ▄▄▀▄ ▀▄ █\n ▀█▀█▀█▀█▀▄ █ █\n ▄█▀█▀█▀█ ▀█ █\n▄▀ ▀▀▀▀▀ ▄██ █ \n▀▄▄▀▀▀▀▄▄▀███▀ "], ["attack", "▄ ▄ ▄ ▄ ▄ ▄ \n█▀█▀█ █▀█▀█▀▄ \n▀▀▀██▄██▀▀▀▀ █ \n ▄▀ ▀▄ ▀▄ █\n ▀▄▀▄▄█▀▄▀▄ █ █\n ▄█ █ █ █ ▀█ █\n▄▀ ▀▀▀▀▀ ▄██ █ \n▀▄▄▀▀▀▀▄▄▀███▀ "], ["eat_1", "▄ ▄ ▄ ▄ ▄ ▄ \n█▀█▀█ █▀█▀█▀▄ \n▀▀▀██▄██▀▀▀▀ █ \n ▄▀ ▀▄ ▀▄ █\n ▀█▄▄▄▄▄█▀▄ █ █\n ▄▀▄█▄█▄▀ ▀█ █\n▄▀ ▄██ █ \n▀▄▄▀▀▀▀▄▄▀███▀ "], ["eat_2", "█▄█▄█ █▄█▄█ \n█▄█▄█ █▄█▄█▀▀▄ \n █▄█▄█▀ █ \n ▄▀▄ ▄▄▀▄ ▀▄ █\n ▀███████▀▄ █ █\n ▄██▀▀ ██ ▀█ █\n▄▀ ▀▀▀▀▀ ▄██ █ \n▀▄▄▀▀▀▀▄▄▀███▀ "], ["happy", "█▄█▄█ █▄█▄█ \n█▄█▄█ █▄█▄█▀▀▄ \n █▄█▄█▀ █ \n ▄▀▄ ▄▄▀▄ ▀▄ █\n ▀███████▀▄ █ █\n ▄▀█████▀ ▀█ █\n▄▀ ▀▀▀ ▄██ █ \n▀▄▄▀▀▀▀▄▄▀███▀ "], ["injured_1", " \n \n ▄▀▀▀█▀▀▄ \n▄ █▄█ ██▄█ ▄█ █\n████▀▀▀▀███▀█ █\n ▄▀ ▄▄▄ █▄▀ █\n▄▀ ▀ ▀ ██ █ \n▀▄▄▀▀▀▀▄▄▀███▀ "], ["injured_2", " \n \n ▄▄▄▄▄▄ \n ▄ ▄ ▄█ ▄ ▀▄ ▀▄\n█▄███▄████▄██ █\n▀▀█▀ ▀▀█ ▀ █\n █ ▄▀▀▀▄ ▀██ █ \n█▄▄▄▄▄▄▄▄▄███▀ "], ["refuse", " \n█▄█ ▄ ▄ █▄█▄ \n▀▄█▀█ ▄█▀█▄▀ ▀▄ \n ▄▀▀▀▀▀█ ▄ ▀▄\n █▄ ▄█ █ █\n ▄▀▄███▄▀▄█▄▀ █\n▄▀▀▀ ▀▀▀▄█▄ ▄▀\n▀▄▄▀▀▀▀▄▄▀███▀ "], ["sleep_1", " \n \n█▄█▄█ █▄█▄█▀▀▄ \n▀▀█▀▀▀▀▀█▀▀█ █\n █▄ ▄█ █ █\n ▄▀▄▄▄▄█▀ ▀█ █\n▄▀ ▄██ █ \n▀▄▄▀▀▀▀▄▄▀███▀ "], ["sleep_2", " \n█▄█▄█ █▄█▄█▄▄ \n▀▀▀██▄██▀▀▀▀ ▀▄\n ▄▀ ▀▄ ▀▄ █\n ▀█ █▀▄ █ █\n ▄▀█████▀ ▀█ █\n▄▀ ▄██ █ \n▀▄▄▀▀▀▀▄▄▀███▀ "], ["walk_1", "█▄█▄█ █▄█▄█ \n█▄█▄█ █▄█▄█▀▀▄ \n █▄█▄█▀ █ \n ▄▀ ▀▄ ▀▄ █\n ▀▄▀▄▄█▀▄▀▄ █ █\n ▄█ █ █ █ ▀█ █\n▄▀ ▀▀▀▀▀ ▄██ █ \n▀▄▄▀▀▀▀▄▄▀███▀ "], ["walk_2", "▄ ▄ ▄ ▄ ▄ ▄ \n█▀█▀█ █▀█▀█▀▄ \n▀▀▀██▄██▀▀▀▀ █ \n ▄▀ ▀▄ ▀▄ █\n ▀▄▀▄▄█▀▄▀▄ █ █\n ▄█ █ █ █ ▀█ █\n▄▀ ▀▀▀▀▀ ▄██ █ \n▀▄▄▀▀▀▀▄▄▀███▀ "]]], + ["shinegreymon", [["angry", "█▀▄▄▄▄▄▀█ ▄▀█ \n▄▀▀ ▄█▀▄██ ▄▀▀█▄\n█▄▄▄▄▄█▀ ██▄▄▀ █\n▄█▄█▄▀ ▄▀█ █▄▀ \n█ ▀▄▄▀█ ▄█▀▀ ▄▄\n ▀▀█▀▀ ▀▄▀▀▀▄▀\n ▄▄▀▀▄▄▄▄ ▀▀▀▀▄ \n█▄█▄▄█ ▀▄▄█▄█▄█"], ["attack", "▄▄ ▄▄ ▄▄ \n▀▄█▀▀█▀ █▄▀ █▄▄ \n █ ▄▀█▀▀ █▄▀ ▄▀█\n▄▀█▀▀▀▄█▀ ▄█▀ ▄▀\n▀▀█▀▀▀▀ █▀▀▄▄▀ \n▄▀▀▄▀▀▄▀▀▄ █ ▄▄\n▀▄▄████▄▄▀▀▄▀▀▄▀\n█▄█▄▄█▀█▄█▄▄██ "], ["eat_1", "▄▄ ▄▄ ▄▄ \n▀▄█▀█▀▀ █▄▀ █▄▄ \n █ ▀ ▀▄▀ █▄▀ ▄▀█\n▄▀█▀▀▀▄█▀ ▄█▀ ▄▀\n▀▀█▀▀▀▀ █▀▀▄▄▀ \n▄▀▀▄▀▀▄▀▀▄ █▄▄▀█\n▀▄▄████▄▄█▀█▄▄▀ \n█▄█▄▄█ ▀▄▄█▄█▄█ "], ["eat_2", "█▀▄▄▄▄▄▀█ ▄▀█ \n █▀ ▄▄ ▄▀█ ▄▀▀█▄\n █▄▄▄▄▀▄▄▀▀▄▄▀ █\n█▀▀██▄█▀▄▄█▀ ▄▀ \n█ ▄▀▄▄ ▄█ █▀ \n█ ▀█▄▄█ █▄▀▄▄▀█\n ▀█▀▀████ ▀█▄▄▀ \n █▄█▄▄█ █▄█▄█▄█ "], ["happy", "█▀▄▄▄▄▄▀█ ▄▀█ \n▄▀▀▄▀▄ ▄██ ▄▀▀█▄\n█ ▄▄▄▄█▀ █▀▄▄▀ █\n ████▀▄██▄▄▀ ▄▀ \n█▀▄▄▄▀▀█ █▀▀ ▄▄\n▀▄▄█▀▀▄▀▀▄▀█▀▀▄▀\n ▄▄████▄██▀▀██▄ \n█▄█▄▄█ ▀▄▄█▄█▄█"], ["injured_1", " \n█▀▄▄▄▄▄▀█ ▄▀█ \n █▀ ▄▄ ▄▀█ ▄▀▀█▄\n▄▀▄▄▄▄▀▄▄▀▀▄▄▀ █\n▀▀█▄▄▄█▀▄▄█▀ ▄▀ \n▄▄█▄ ▄▀█▄▄█▀ \n█▄█▄█▀██▄█▄█▄▄▀█\n▀▄▄▄█▄▄█▄▄▄█▄▄▀ "], ["injured_2", " \n▄▄ ▄▄ ▄▄ \n▀▄█▀▀▀▀ █▄▀ █▄▄ \n █ ▀▀▄▀ █▄▀ ▄▀█\n█▄█▀▀▀▄█▀ ▄█▀ ▄▀\n▄▄██▀▀█ ██▄▄▀▀ \n█▄█▄█▀██▄█▄█▄▄▄ \n▀▄▄▄█▄▄█▄▄▄█▄▄▄█"], ["refuse", "▄▄ ▄▄ ▄▄ \n▀▄█▀▀██ █▄▀ █▄▄ \n █ ▀▀▄▀ █▄▀ ▄▀█\n▄▀█▀▀▀▄█▀ ▄█▀ ▄▀\n▀▀█▀▀▀▀ █▀▀▄▄▀ \n▄▀▀▄▀▀▄▀▀▄ █ \n▀▄▄▀▀██▄▄█▀▄▀▀▀▄\n █▄█▄▄█▄█▄█▄█▀▀▀"], ["sleep_1", " \n█▀▄▄▄▄▄▀█ ▄▀█ \n █▀ ▄▄ ▄▀█ ▄▀▀█▄\n █▄▄▄▄▀▄▄▀▀▄▄▀ █\n █▄▄▄█▀▄▄█▀ ▄▀ \n▄▀█▄▀▀█▀▀▄ █▀ \n▀▄█▀▀██▄▄█▀▄▀▄▄ \n █▄█▄▄█▄█▄█▄█▄▄█"], ["sleep_2", " \n▄▄ ▄▄ ▄▄ \n▀▄█▀▀▀▀ █▄▀ █▄▄ \n █ ▀▀▄▀ █▄▀ ▄▀█\n█▄█▀▀▀▄█▀ ▄█▀ ▄▀\n▄▄██▀▀█ ██▄▄▀▀ \n█▄█▄█▀██▄█▄█▄▄▄ \n▀▄▄▄█▄▄█▄▄▄█▄▄▄█"], ["walk_1", "█▀▄▄▄▄▄▀█ ▄▀█ \n █▀ ▄█▄▄▀█ ▄▀▀█▄\n █▄█▄█ ▄▄▀▀▄▄▀ █\n█▄█▄▄▄█▀▄▄█▀ ▄▀ \n ▄█ ▄▄ ▄█ █▀ \n█ █▄▄█ █▄▀▄▄▀█\n ▀█▀▀███▀ ▀█▄▄▀ \n █▄█▄▄█▄█▄█▄█ "], ["walk_2", "▄▄ ▄▄ ▄▄ \n▀▄█▀▀█▀ █▄▀ █▄▄ \n █ ▄▀█▀▀ █▄▀ ▄▀█\n▄▀█▀▀▀▄█▀ ▄█▀ ▄▀\n▀▀█▀▀▀▀ █▀▀▄▄▀ \n▄▀▀▄▀▀▄▀▀▄ █ ▄▄\n▀▄▄████▄▄▀▀▄▀▀▄▀\n█▄█▄▄█▀█▄█▄▄██ "]]], + ["shinmonzaemon", [["angry", " ▄▄▄ ▄▄▄▄ ▄▄▄ \n█ ▄▀▀ ▀ █ \n▀█ █▄ ▄█ ▄▄▀▄ \n █▄▄▄███▄▄▄▄█▄██\n █▄█▄█▄█▄▀ ████\n▄▀█ ▄▄ ▀██\n█ ▀▄ █ ▄██\n██████▀▀██████▀█"], ["attack", " ▄▄▄ ▄▄▄▄ ▄▄▄ \n█ ▄▀▀ ▀ █ \n▀█ █▄ ▄█ ▄▄▀▄ \n █▄▄▄███▄▄▄▄█▄██\n █▄█▄█▄█▄█ ▀▀██\n▄▀█▀█▀█▀█▀█ █ █\n█ ▀█▀▀▀▀▀▀ █ █\n██████▀▀██████▀█"], ["eat_1", "▄▀▀█▄▀▀▀▀▄▀▀▀▄ \n█▄▀ █ \n █ ▀▀▄▄▄▀▀ ▀█ █▄\n ▀█▀█▀█▀█▀█▀████\n▄▀▀███████▀▀▀███\n█ ██▄█▄██ ███\n ██▄▄▄▄▄▄▄█▄▄▀██\n█▄▄▄▄█ █▄▄▄▄█ ▀"], ["eat_2", " ▄▄▄ ▄▄▄▄ ▄▄▄ \n█ ▄▀▀ ▀ █ \n▀█ ██ ██ ▄▄▀▄ \n █▄▄▄███▄▄▄▄█▄██\n █▄█▄█▄█▄▀ ████\n▄▀█ ▄▄ ▀██\n█ ▀▄ █ ▄██\n██████▀▀██████▀█"], ["happy", " ▄▄▄ ▄▄▄▄ ▄▄▄ \n█ ▄▀▀ ▀ █ \n▀█ ██ ██ ▄▄▀▄ \n █▄▄▄███▄▄▄▄█▄██\n █ █ █ █ █ ▀▀██\n▄▀█▀█▄█▄█▀ █ █\n█ █ █ █\n██████▀▀██████▀█"], ["injured_1", " \n▄▀▀█▄▀▀▀▀▄▀▀▀▄ \n█▄▀ ▄ ▄ █ \n █ ▀▀▄▄▄▀▀ ▀█ █▄\n ▀█▀█▀█▀█▀█▀████\n ▄▀▀▀▀▀▀▀▀ ▀███\n▄▀▀▄ ▄▀▀▀▄ ██\n▀▄▄█▄▄▄█▄▄▄█▄▄██"], ["injured_2", " \n ▄▄▄ ▄▄▄▄ ▄▄▄ \n█ ▄▀▀ ▀ █ \n▀█ ▄█ █▄ ▄▄▀█▄\n █▄▄▄███▄▄▄▄████\n ▄█▄█▄█▄█▄▀ ▀▀██\n▄▀▀▄ ▄▀▀▀▄ █\n▀▄▄█▄▄▄█▄▄▄█▄▄▄█"], ["sleep_1", "▄▀▀▀▄▄▀▀▀▄▄▀▀▀▄ \n█ ▄▀ █ \n▄▀█ ▀▀▄▄▄▀▀ █▀▄ \n██▀▀█▀█▀█▀█▀▀██ \n█▀▀█▀▀▀▀▀▀▀█▀▀█ \n█ ▄█▀█▀█▀█▀█▄ █ \n█ ▀▄█▄█▄█▄█▄▀ █ \n▀▄▄▄▄▄▄▄▄▄▄▄▄▄▀ "], ["sleep_2", "▄▀▀▀▄▄▀▀▀▄▄▀▀▀▄ \n█ ▄▀ █ \n▄▀█ ▀▀▄▄▄▀▀ █▀▄ \n██▀▀█▀█▀█▀█▀▀██ \n▀█▀▀█▀▀▀▀▀▀▀█▀▀▄\n █ ▄█▀█▀█▀█▀█▄ █\n █ ▀▄█▄█▄█▄█▄▀ █\n ▀▄▄▄▄▄▄▄▄▄▄▄▄▄▀"], ["walk_1", "▄▀▀█▄▀▀▀▀▄▀▀▀▄ \n█▄▀ █ \n █ ▀▀▄▄▄▀▀ ▀█ █▄\n ▀█▀█▀█▀█▀█▀████\n ▄█▀▀▀▀▀▀▀ ▀███\n█ █ █▀ ██\n▀▄▄█▄▄▄▄▄█▄▄▄▀██\n█▄▄▄▄█ █▄▄▄▄█ ▀"], ["walk_2", " ▄▄▄ ▄▄▄▄ ▄▄▄ \n█ ▄▀▀ ▀ █ \n▀█ ▄▄ ▄▄ ▄▄▀▄ \n █▄▄▄███▄▄▄▄█▄██\n █▄█▄█▄█▄▀ ████\n▄▀█ ▄▄ ▀██\n█ ▀▄ █ ▄██\n██████▀▀██████▀█"]]], + ["shogungekomon", [["angry", " █████▄ \n ▀█▀█▀ \n ▄▀▀▄▀▀▄▀ \n ▄▀█▄▀▄█▀▀▄ \n▄▀ ██▀▄ \n ▀█▀▀▀▀▀▀▄ █▀█ \n █▄ ▄▄▄ ▄▀▀█\n █▄▄█▀█▄▄▄█▄▄▄█"], ["attack", " █████▄ \n ▄▄ ▄▄▄▀▀█▀ \n █▄ █ ▄█▄▀ \n▄▀▀ ▀▀▀▄▄▀█▄ \n ▀███████▀ █▄█▄ \n ▀▄▄ ▀█ ▀▄█ \n █▄▀▀▀▀▀ ▄ ▄█ █\n█▄██▀▀█▄▄▄█▄▄▄▄█"], ["eat_1", " █████▄ \n ▄▄ ▄▄▄█▀█▀ \n █▄ █▄ █ ▄▀ \n▄▀▀▀▀ ▀▀▄▄▀▄ \n ▀█████▄▀▀ █▀▄ \n ▄▀▀█▀▀▀█ █▀█ \n █ ▀ ▄▀█▀ ▄▄▀▀▄\n█▄██▀▀█▄▄▄▀▄▄▄▄█"], ["eat_2", " █████▄ \n ▀█▀█▀ \n ▄▀▀▄▀▀█ ▄▀ \n ▄██ ██ ▀█▄ \n▄▀ ██ █▀▄ \n ▀█▀▀▀▀█▀ █▀█ \n █ ▄█ ▄▄▀▀▄\n █▄█▀█▄▄▄▀▄▄▄▄█"], ["happy", " █████▄ \n ▄▄▄ ▄▄▄█▀█▀ \n █▄ █▄ █▄▀ \n▄▀▀ ▀ ▀ ▀ ▀▄ \n ▀████████ █▀▄ \n ▄▀ ▀ █ █▀█ \n █▀████▀ ▄ ▄▄▀▀▄\n█▄█▄▄▄▄▄█▄▄█▄▄▄█"], ["injured_1", " \n ▄▄▄ \n ▄▄ ▄▄█████ \n █ █ ▀▄▀ \n ▄▀▄█ █▄ ▀█▀▄ \n▀▄▄▄▄▄▄▄ ██ █▀█ \n █▄ ▄█ █▀▀▀▄\n █▄▄█▄█▄▄▄█▄▄▄▄█"], ["injured_2", " \n \n ▄▄▄▄ \n ▄▄ ▄▄▀████ \n █ ▄█▄ ▀▀▄▄▄ \n ▄▀▀▀ ▀▀▀▄▄▀▄▀▄ \n█▄▄▄▄▄▄▄ ▀█▄▀▀█ \n █▄▄█▄▄▄▄█▄▄▄▄▄█"], ["sleep_1", " \n ▄▄▄▄▄ \n ▀█████ \n ▄▀▀▄▀▀█ █ \n ▄█▄ █▄▄ █▄▄ \n▄▀ ▄▄▀▄▀▄ \n ▀█▀▀▀▀█▄▀▀▄▀▀▀▄\n █▄█▄▄█▄▄▄█▄▄▄▄█"], ["sleep_2", " \n █████▄ \n ▄▄ ▄▄▀█▀█▀ \n █ █ █ ▄▀ \n ▄▀▀▀ ▀▀▀ ▀█▀▄ \n▀▄███▄ ██ ▀▀▄█ \n ▀▄ ▀▀▄▄ ▄▀▀▀▄\n █▄█▄▄█▄▄▄█▄▄▄▄█"], ["walk_1", " █████▄ \n ▀█▀█▀ \n ▄▀▀▄▀▀█ ▄▀ \n ▄██ ██ ▀█▄ \n▄▀ ██ █▀▄ \n ▀█▀▀▀▀▄ █▀█ \n █ ▄█ ▄▄▀▀▄\n █▄█▀█▄▄▄▀▄▄▄▄█"], ["walk_2", " ▄▄▄ \n ▄▄ ▄▄ ████ \n █▄ █▄ ▀▄▀ \n ▄▀ ▀ ▀▀▄▄▀█ \n█▄▄▄▄▄▄ ▀▀▄▀█ \n▄█▄ ▄▄ ▄▀▀█▄ \n█▄▄█▀█▄▄▄▀▀▄▄▄ █\n █▄▀▄▄▄▀"]]], + ["shoutmon", [["angry", " ▄▀█▄▄▄▀▀█\n ▄▄▄▄▀▀▀▀ ▄▀ \n▄▄▀▄ ▄▄▄ ▄▄▄▀█\n█ ▀ ▀▀▀ █ █ \n ▀▄▄▀▄▀▄▀ ▀▄▄▄▀ \n ▄▀█▀▀▀▀█▀▄ ▄ \n ▀▄▄▀▀▀ ▀▄▄█▀█ \n █▄▄▄█▀█▄▄▄█▀ "], ["attack", " ▄▄ ▄▄▄\n ▄█▄█▀▀▀ ▄▀\n █▀▀▀ ▀▄▄\n█▀▄▀ ▄██ ▄▀▀▀▄▀\n▀▄ ▄ ▄ ▄ █ █ \n ▀█▄█▄█▄▄▄██▀ \n █▄ █▄▄ █▄▄█▄█ \n █▄▄▄█▄▄▄█▄▄▄█▀ "], ["eat_1", " ▄▄ ▄▄▄\n ▄█▄█▀▀▀ ▄▀\n █▀▀▀ ▀▄▄\n█▀▄▀ ▄██ ▄▀▀▀▄▀\n▀▄ ▄ ▄ ▄ █ █ \n ▀█▄█▄█▄▄▄██▀ \n █▄ █▄▄ █▄▄█▄█ \n █▄▄▄█▄▄▄█▄▄▄█▀ "], ["eat_2", " ▄▀█▄▄▄▀▀█\n ▄▄▄▄▀▀▀▀ ▄▀ \n▄▄▀▄ ▄▄ ▄▄▄▀█\n█ ▀ ▀▀▀ █ █ \n ▀▄▄█▄█▄█▄▀▄▄▄▀ \n ▄▀▀▀▀▀▀▄█▀▄ ▄ \n ▀██▀▀▀▀▀▄▄█▀█ \n █▄▄▄█▀█▄▄▄█▀ "], ["happy", " ▄▀█▄▄▄▀▀█\n ▄▄▄▄▀▀▀▀ ▄▀ \n▄▄▀▄ ▄▄ ▄▄▄▀█\n█ ▀ ▀ ▀ █ █ \n ▀▄▄█▄█▄█▄▀▄▄▄▀ \n ▄▀▀▀▀▀▀▄█▀▄ ▄ \n ▀██▀▀▀▀▀▄▄█▀█ \n █▄▄▄█▀█▄▄▄█▀ "], ["injured_1", " \n ▄▀█▄▄▄▀▀█\n ▄▄▄▄▀▀▀▀ ▄▀ \n▄▄▀▄ ▄ ▄▄▄▀█\n█ ▀ ▀▄ █ █ \n ▀▄▄ ▄▄ ▄ ▀▄▄▄▀ \n █▀█▀▄▀██▀██▀█▄█\n █▄▄█▄▄█▄▄█▄▄█▄█"], ["injured_2", " \n ▄▄ ▄▄▄\n ▄█▄█▀▀▀ ▄▀\n █▀▀▀ ▀▄▄\n█▀▄▀ ▄▀ ▄▀▀▀▄▀\n▀▄ ▀ █ █ \n █▀█▄▀█▄█▄▄█▀█▄█\n █▄▄█▄▄█▄▄█▄▄█▄█"], ["refuse", " ▄▀█▄▄▄▀▀█\n ▄▄▄▄▀▀▀▀ ▄▀ \n▄▄▀▄ ▄▄▄ ▄▄▄▀█\n█ ▀ ▀▀▀ █ █ \n ▀▄▄▀▄▀▄▀ ▀▄▄▄▀ \n ▄▀█▀▀▀▀█▀▄ ▄ \n ▀▄▄▀▀▀ ▀▄▄█▀█ \n █▄▄▄█▀█▄▄▄█▀ "], ["sleep_1", " ▄▄▄ \n ▄▄▄▄▄▄▀ ▄▀▄▄ \n█ █▄█ █▄ ▀ █ \n█ █▄█ █▄ █ ▀▄ \n█ ▀▄▀▀█▄ █ █▀▄\n█ █▄▄▄ ▀█▀\n█ █ █ █ \n█▄▄▄▄▄█▄▄▄█▄█▄▄█"], ["sleep_2", " ▄▄▄ \n ▄▄▄▄▄▄▀ ▄▀▄▄ \n█ █▄█ █▄ ▀ █ \n█ █▄█ █▄ █ ▀▄ \n█ ▀▄▀▀█▄ █ █▀▄\n█ █▄▄▄ ▀█▀\n█ █ █ █ \n█▄▄▄▄▄█▄▄▄█▄█▄▄█"], ["walk_1", " ▄▀█▄▄▄▀▀█\n ▄▄▄▄▀▀▀▀ ▄▀ \n▄▄▀▄ ▄▄ ▄▄▄▀█\n█ ▀ ▀▀▀ █ █ \n ▀▄▄▀▄▀▄▀ ▀▄▄▄▀ \n ▄▀█▀▀▀▀█▀▄ ▄ \n ▀▄▄▀▀▀ ▀▄▄█▀█ \n █▄▄▄█▀█▄▄▄█▀ "], ["walk_2", " ▄▄ ▄▄▄\n ▄█▄█▀▀▀ ▄▀\n █▀▀▀ ▀▄▄\n█▀▄▀ ▄██ ▄▀▀▀▄▀\n▀▄ ▄ ▄ ▄ █ █ \n ▀█▄█▄█▄▄▄██▀ \n █▄ █▄▄ █▄▄█▄█ \n █▄▄▄█▄▄▄█▄▄▄█▀ "]]], + ["shoutmon_x3", [["angry", " █▀▀▄█▀▀▀▀▄▀█ ██\n █▄▄▀ ▄ █▄▄██\n ▄█ ▀▀ █ █▀\n█ █▄███▄▀ █▀ █ \n ▀▄▀█▀▀▀▀▄██▄▀ \n ▀█▀█▀███▀ \n ▄█▀▀▄████▀▀▄▄ \n █▄▄█▄▄█ █▄▄█▄▄█"], ["attack", " ▄▄▄ ▄▄▄▄▄ ▄▄ ▄▄\n ▀▄ ▀█ ▀▄▀ ██\n █▀▀ ▄█▀ █▄███\n █▀▄ ▄▄▄ ▄▄████ \n ▀▄▄█▄▄▄█▄▄█▀█▀ \n █▀ █ ▀ ▄█▀ █ \n █▄▀▀█▄█▀█▄▄▀█▄ \n█▄▄█▄▄█▀▀█▄▄█▄▄█"], ["eat_1", " ▄▄▄ ▄▄▄▄▄ ▄▄ ▄▄\n ▀▄ ▀█ ▀▄▀ ██\n █▀▀ ▄▀▄ █▄███\n █▀▄ ▄▄▄ ▄▄████ \n ▀▄▄█▄▄▄█▄▄█▀█▀ \n █▀ █ ▀ ▄█▀ █ \n █▄▀▀█▄█▀█▄▄▀█▄ \n█▄▄█▄▄█▀▀█▄▄█▄▄█"], ["eat_2", " █▀▀▄█▀▀▀▀▄▀█ ██\n █▄▄▀ ▄▄ █ ▄██\n ▄█ ▀▀ ████▀\n █ ▀▄███▄▀ ████ \n ▄█▀█▀▀▀▀▄█▀ █ \n █ █▀█▀██ ▄█ \n ██▀▀▄████▀▀▄▄ \n █▄▄█▄▄█ █▄▄█▄▄█"], ["happy", " █▀▀▄█▀▀▀▀▄▀█ ██\n █▄▄▀ ▄ █▄▄██\n █ ▀ ▀ █ █▀\n █▀█▄███▄█ █▀ █ \n ▀▄▄█▀▀▀▀ ▄█▄▀ \n █ █▀█▀███▀ \n ██▀▀▄████▀▀▄▄ \n █▄▄█▄▄█ █▄▄█▄▄█"], ["injured_1", " \n █▀▀▄█▀▀▀▀▄▀█ ██\n █▄▄▀ █ ▄██\n ▄█ ▀▀ ████▀\n █ ▀▄▀▀▀▄▀▀████ \n ▄▀▀█▀▀▀██▀▀ █ \n █▄▀▀█▄█▀█▄▄▀█▄ \n█▄▄█▄▄████▄▄█▄▄█"], ["injured_2", " \n ▄▄▄ ▄▄▄▄▄ ▄▄ ▄▄\n ▀▄ ▀█ ▀▄▀ ██\n █▀▀ ▄▄ █▄███\n █▀▄ ▄▄▄ ▄▄████ \n ▀▄▄█▄▄▄█▄▀▀ █▀ \n █▄▀▀█▄█▀█▄▄▀█▄ \n█▄▄█▄▄████▄▄█▄▄█"], ["refuse", " ▄▄▄ ▄▄▄▄▄ ▄▄ ▄▄\n ▀▄ ▀█ ▀▄▀ ██\n █▀▀ ▄█ █▄███\n █▀▄ ▄▄▄ ▄▄████ \n ▀▄▄█▄▄▄█▄▄█▀█▀ \n █▀ █ ▀ ▄█▀ █ \n █▄▀▀█▄█▀█▄▄▀█▄ \n█▄▄█▄▄█▀▀█▄▄█▄▄█"], ["sleep_1", " \n █▀▀▄█▀▀▀▀▄▀█ ██\n █▄▄▀ █ ▄██\n ▄█ ▀▀ ████▀\n █ ▀▄▀▀▀▄▀▀████ \n ▄███▀▀▀████▄█▄ \n█ ▀ █▄█▀█ ▀ █\n█▄▄▄▄█████▄▄▄▄▄█"], ["sleep_2", " \n ▄▄▄ ▄▄▄▄▄ ▄▄ ▄▄\n ▀▄ ▀█ ▀▄▀ ██\n █▀▀ ▄▄ █▄███\n █▀▄ ▄▄▄ ▄▄████ \n █▄▄█ ▄▄█▄██▄██ \n█ ▀ █▄█▀█ ▀ █\n█▄▄▄▄█████▄▄▄▄▄█"], ["walk_1", " █▀▀▄█▀▀▀▀▄▀█ ██\n █▄▄▀ ▄▄ █ ▄██\n ▄█ ▀▀ ████▀\n █ ▀▄▀▀▀▄▀▀████ \n ▄█▀█▀█▀▀██▀ █ \n █ █▄ ▄██ ▄█ \n ██▀▀██▄██▀▀▄▄ \n █▄▄█▄▄█ █▄▄█▄▄█"], ["walk_2", " ▄▄▄ ▄▄▄▄▄ ▄▄ ▄▄\n ▀▄ ▀█ ▀▄▀ ██\n █▀▀ ▄█▀ █▄███\n █▀▄ ▄▄▄ ▄▄████ \n ▀▄▄█▄▄▄█▄▄█▀█▀ \n █▀ █ ▀ ▄█▀ █ \n █▄▀▀█▄█▀█▄▄▀█▄ \n█▄▄█▄▄█▀▀█▄▄█▄▄█"]]], + ["shoutmon_x5", [["angry", " ▄ █ █▄█▀▀▄▀█ ██\n ▀███▀ ▄ █ ▄██\n ▄█ ▀▀ ██▀█▀\n █ ▀▄███▄▀▀████▄\n ▄█▀█▀▀▀▀▄██▄▀ █\n █ ██▀███▄▀ ▄▀\n ██▀▀██▄██▀▄█▄ \n █▄▄█▄▄█ █▄▄█▄▄█"], ["attack", " ▄ ▄ ▄▄▄ ▄▄ ▄▄\n ▀▄█▄██▀ ▀▄▀ ██\n ▄▀▀▀ ▄█▀ █▄███\n █▀▄ ▄▄▄ ▄▄██▄█ \n ▀▄▄█▄▄▄█▄▄█▀█▀█\n █▀ █ ▀ ▄█▀█▀ █\n █▄▀▀█▄█▀██▄ ▄▀▄\n█▄▄█▄▄█▀▀█▄▄█▄▄█"], ["eat_1", " ▄ ▄ ▄▄▄ ▄▄ ▄▄\n ▀▄█▄██▀ ▀▄▀ ██\n ▄▀▀▀ ▄▀▄ █▄███\n █▀▄ ▄▄▄ ▄▄██▄█ \n ▀▄▄█▄▄▄█▄▄█▀█▀█\n █▀ █ ▀ ▄█▀█▀ █\n █▄▀▀█▄█▀██▄ ▄▀▄\n█▄▄█▄▄█▀▀█▄▄█▄▄█"], ["eat_2", " ▄ █ █▄█▀▀▄▀█ ██\n ▀███▀ ▄▄ █ ▄██\n ▄█ ▀▀ ██▀█▀\n █ ▀▄███▄▀▀████▄\n ▄█▀█▀▀▀▀▄██▄▀ █\n █ ██▀███▄▀ ▄▀\n ██▀▀██▄██▀▄█▄ \n █▄▄█▄▄█ █▄▄█▄▄█"], ["happy", " ▄ █ █▄█▀▀▄▀█ ██\n ▀███▀ ▄ █▄▄██\n ▄█ ▀ ▀ █ ▀ █\n █ ▀▄███▄▀▀█ █\n ▄█▀█▀▀▀▀▄█ ▄▄▀ \n █ ██▀███▄▀▄▀ \n ██▀▀██▄██▀▄▄▄ \n █▄▄█▄▄█ █▄▄█▄▄█"], ["injured_1", " \n \n ▄ █ █▄█▀▀▄▀█ ██\n ▀███▀▄ █ ▄██\n █ ▀ ██▀█▀\n ▄█▄▀▀▀▄▀▀█▀██▄\n▄▀█▀█▀▀▀▄█▀█▀█▀█\n█▄▄▄██▄████▄▄▄▄█"], ["injured_2", " \n \n ▄ ▄ ▄▄▄ ▄▄ ▄▄ \n▄█▄██▀ ▀▄▀ ██ \n▄▀▀▀ ▀▄ █▄███ \n█▄ ▄▄▄ ▄▄██▄█▄ \n▄▀█▀▄▄█▄▄█▀█▀█▀▄\n█▄▄▄██▄████▄▄▄▄█"], ["refuse", " ▄ ▄ ▄▄▄ ▄▄ ▄▄\n ▀▄█▄██▀ ▀▄▀ ██\n ▄▀▀▀ ▄█ █▄███\n █▀▄ ▄▄▄ ▄▄██▄█ \n ▀▄▄█▄▄▄█▄▄█▀█▀█\n █▀ █ ▀ ▄█▀█▀ █\n █▄▀▀█▄█▀██▄ ▄▀▄\n█▄▄█▄▄█▀▀█▄▄█▄▄█"], ["sleep_1", " \n \n ▄ █ █▄█▀▀▄▀█ ██\n ▀███▀ █ ▄██\n █ ▀▀ ██▀█▀\n █ ▀▄▀▀▀▄▀▀█▀█▀▄\n▄▀█▀█▀▀▀▄█▀█▀█▀█\n█▄▄▄██▄█████▄▄▄█"], ["sleep_2", " \n ▄ ▄ ▄▄▄ ▄▄ ▄▄\n ▀▄█▄██▀ ▀▄▀ ██\n ▄▀▀▀ ▄▄ █▄███\n █▀▄ ▄▄▄ ▄▄██▄█ \n ▀▄▄█▄▄▄█▄▄█▀█▀█\n▄▀█▀█ ▀ ▄█▀█▀█▀█\n█▄▄▄██▄████▄▄▄▄█"], ["walk_1", " ▄ █ █▄█▀▀▄▀█ ██\n ▀███▀ ▄▄ █ ▄██\n ▄█ ▀▀ ██▀█▀\n █ ▀▄▀▀▀▄▀▀████▄\n ▄█▀█▀█▀▀███▄▀ █\n █ █▄ ▄██▄▀ ▄▀\n ██▀▀██▄██▀▄█▄ \n █▄▄█▄▄█ █▄▄█▄▄█"], ["walk_2", " ▄ ▄ ▄▄▄ ▄▄ ▄▄\n ▀▄█▄██▀ ▀▄▀ ██\n ▄▀▀▀ ▄█▀ █▄███\n █▀▄ ▄▄▄ ▄▄██▄█ \n ▀▄▄█▄▄▄█▄▄█▀█▀█\n █▀ █ ▀ ▄█▀█▀ █\n █▄▀▀█▄█▀██▄ ▄▀▄\n█▄▄█▄▄█▀▀█▄▄█▄▄█"]]], + ["silphymon", [["angry", " ▄███████▄ ▄▄ \n █ ▀ █ █ █▀███\n █▀▀▀▀▀▀██▀▄▄▀ \n ▀▄███ ▄██ ▄█▄\n █▀▀▀▀▄▄█▀▄▀█\n ▄▀▀▄▀▀▄▀ █▄▀ \n ▀▄█████▄▄█▄ \n █▄██▀ ▀█▄█▄█ "], ["attack", " ▄▄ \n ▄██████▄▀███ \n █ ▀ █ █ ▄▀ \n █▀▀▀▀▀██▀ ▄ \n ▀▄▄▄█▀▀▄▄▀██\n ▄█ ▄▄ █▀▀▄▀▄▀\n █ ▄█▄▄█ ▄▀▀ \n █████▀▀▀▀█████ "], ["eat_1", " \n ▄▄▄▄▄▄ ▄███ \n ▄▀█▀▀█▀█▀ ▀█ \n ▀▄▄▄▄█▄█▄▄▀ ▄ \n █ ▄██ ▄▀██\n ▄█▀██ █▀▀█▀▄▀\n █ ▄█▄▄█ ▄▀▀ \n █████▀▀▀▀█████ "], ["eat_2", " ▄██████▄ ▄▄ \n █ ▀ █ █ █▀███\n █▀▀▀▀▀██▀▄▄▀ \n ▀▄██ ▄██ ▄█▄\n ▄▀▀▀▀▄▄█▀▄▀█\n ▄▀▀▄▀▀▄▀ █▄▀ \n ▀▄█████▄▄█▄ \n █▄██▀ ▀█▄█▄█ "], ["happy", " ▄██████▄ ▄██▄\n █ ▀ █ █▀▄▀█▀\n ▀█▀▀▀▀▀▀█▄█▀ \n █ ▀▄▄▀ ██ ▄█▄\n ▄█▄▄▄▄█▄█▀▄▀█\n ▄▀ █▄▀▀▄█▄ ▀▄▀ \n ▀▄███████▄▄▄▀ \n █▄██▀ ▀█▄█▄█ "], ["injured_1", " \n ▄▄▄▄▄▄ ▄██▄ \n ▄▀█▀▀█▀█▀ ▀█▀ \n ▀▄▄▄▄█▄█▄▄▀ \n ▀▄ ▄██ ▄█▄\n ▄▀▀▀▀▄▄█▀▄▀█\n ▄▀▀█▄▀▀▄▀▀▀█▄▀ \n █▄▄█████▄▄▄█ "], ["injured_2", " \n ▄▄ \n ▄██████▄▀███ \n █ ▀ █ █ ▄▀ \n █▀▀▀▀▀██▀ ▄█▄\n ▀▄▄▄█▀█▄█▀▄▀█\n ▄▀▀█▄▀▀▄▀▀▀█▄▀ \n █▄▄█████▄▄▄█ "], ["refuse", " \n ▄▄▄▄▄▄ ▄███ \n ▄▀█▀▀█▀█▀ ▀█ \n ▀▄▄▄▄█▄█▄▄▀ ▄ \n █ ▄██ ▄▀██\n ▄█▀███ █▄▀█▀▄▀\n ▀▄██▄▄▄██ ▄▀ \n █▄███▀▀▀▀█████ "], ["sleep_1", " ▄▄▄▄▄▄ ▄██▄ \n ▄▀█▀▀█▀█▀ ▀█▀ \n ▀▄▄▄▄█▄█▄▄▀ \n ▀▄ ▄██ \n▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄\n█ ██▀█▀█▀█▀█▀█ █\n█ █▄█▄█▄█▄█▄██ █\n▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀"], ["sleep_2", " ▄▄ \n ▄██████▄▀███ \n █ ▀ █ █ ▄▀ \n █▀▀▀▀▀██▀ \n▄▀▀▀▀▀▀▀▀▀▀▀▀▀▀▄\n█ ██▀█▀█▀█▀█▀█ █\n█ █▄█▄█▄█▄█▄██ █\n▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀"], ["walk_1", " ▄▄▄▄▄▄ ▄██▄ \n ▄▀█▀▀█▀█▀ ▀█▀ \n ▀▄▄▄▄█▄█▄▄▀ \n ▀▄ ▄██ ▄█▄\n ▄▀▀▀▀▄▄█▀▄▀█\n ▄▀▀▄▀▀▄▀ █▄▀ \n ▀▄█████▄▄█▄ \n █▄██▀ ▀█▄█▄█ "], ["walk_2", " ▄▄ \n ▄██████▄▀███ \n █ ▀ █ █ ▄▀ \n █▀▀▀▀▀██▀ ▄ \n ▀▄▄▄█▀▀▄▄▀██\n ▄█ ▄▄ █▀▀▄▀▄▀\n █ ▄█▄▄█ ▄▀▀ \n █████▀▀▀▀█████ "]]], + ["sirenmon", [["angry", " ▄▄▄▄ ▄ \n ▄▀▀▀███▄█▀ █\n █ ▄ ██▄▀ ▄▀█\n █ ▀▀ ▄█▄▀▀ █\n ▀▄▀▀▀▀▀▄▀▄ █\n ▄▀▀▀▀▀ ▄▀▄█ ▄▀\n █▄█ █▄ █ █ ▀ \n █▄▄█▀▀▀▄███ "], ["attack", " ▄████▄ █▄ ▄\n ▄▀ ▄ ▀██▀█ ▄█\n █ ▄█ ▀█▀▄▄▀ █\n▄▀█▄▄▄▄ ▀█▀▀▄ █\n▀▄▀████▄▀█ █▄ █\n ▀▄ ▄ ▀▄▀ ▀ \n █▀▄██▄▄▄█ \n █▄▄▀ ▀▄▄█ "], ["eat_1", " ▄████▄ █▄ ▄\n ▄▀ ▀██▀█ ▄█\n ▄▀ ▀▀ ▀█▀▄▄▀ █\n ████▄ ▀█▀ █\n ▀███▄▄▀ █ ▄ █\n ▄▀▄ ▄ ▄▀ █▀▄▀ \n ▀▄▀▄██▄█▄▄▀ \n █▄▄▀ ▀▄▄█ "], ["eat_2", " ▄▄▄▄ ▄ \n ▄▀▀▀███▄█▀ █\n █ ▄ ██▄▀ ▄▀█\n █ ▀ ▀ ▄█▄▀▀ █\n ▀▄▀▀▀▀▀▄▀▄ █\n ▄▀▀▀▀▀ ▄▀▄█ ▄▀\n █▄█ █▄ █ █ ▀ \n █▄▄█▀▀▀▄███ "], ["happy", " ▄████▄ █▄ ▄\n ▄▀ ▄ ▀██▀█ ▄█\n ▄▀ ▀ ▀ ▀█▀▄▄▀ █\n █████ ▀█▀ █\n ▄███▄▄▄▀ █▄▄ █\n█ ▀▄ ▄ ▀▄ █▀ \n ▀█▀▄██▄▄▄█▀▀ \n █▄▄▀ ▀▄▄█ "], ["injured_1", " \n ▄████▄ █▄ \n ▄▀ ▀██▀█ █\n ▄▀ █▄ ▀█▀▄ ▄▀█\n █ ▄▄▄▄▄▀█▀ ▀ █\n ▀▄▄▄▄▄▀ █ █\n ▄▀▄ ▄ ▄▀ ██ ▄▀\n ███▄██▄█▄▄█ ▀ "], ["injured_2", " \n ▄▄▄▄ ▄ \n ▄▀▀▀███▄█▀ ▄ \n █ ▄ ██▄▀ ▄█ \n█ ▀▀ ▄█▄▀▄▀ █ \n▀▄▀▀▀▀▀▄▀ █ █ \n ▄▀█▀█▀ ▄▀ █ █ \n ███▄██▄█▄▄█▄▀ "], ["sleep_1", " \n ▄▄▄▄ ▄ ▄ \n ▄▀▀▀███▄█▀ ▄█ \n █ ██▄▀▄▀ █ \n█ ▀▀ ▄█▄▀ █ \n▀▄▀▀▀▀▀▄▀ █ █ \n ▄▀█▀█▀ ▄▀ █▄▀ \n ███▄██▄█▄▄█ "], ["sleep_2", " \n ▄████▄ █▄ ▄\n ▄▀ ▀██▀█ ▄█\n ▄▀ ▄▄ ▀█▀▄▄▀ █\n █ ▄▄▄▄▄▀█▀ █\n ▀▄▄▄▄▄▀ █ ▄ █\n ▄▀▄ ▄ ▄▀ █▀▄▀ \n ███▄██▄█▄▄█ "], ["walk_1", " ▄████▄ █▄ ▄\n ▄▀ ▄ ▀██▀█ ▄█\n ▄▀ ▄█ ▀█▀▄▄▀ █\n █ ▄▄▄▄▄▀█▀ █\n ▀▄▄▄▄▄▀ █ ▄ █\n ▄▀▄ ▄ ▄▀ █▀▄▀ \n ▀▄▀▄██▄█▄▄▀ \n █▄▄▀ ▀▄▄█ "], ["walk_2", " ▄▄▄▄ ▄ \n ▄▀▀▀███▄█▀ █\n █ ▀▄ ██▄▀ ▄▀█\n █ ▀▀ ▄█▄▀▀ █\n ▀▄▀▀▀▀▀▄▀▄ █\n ▄▀▀▀▀▀ ▄▀▄█ ▄▀\n █▄█ █▄ █ █ ▀ \n █▄▄█▀▀▀▄███ "]]], + ["sistermon_blanc", [["angry", " ▄▄▄▄▄▄ \n ▄▀ ▄ ▀▄ \n █ ▀▀ ▄ ▀▄ \n █▀▀▀▀█▀▄ █ ▀▄ \n ▀▄ ▀▀ █ ▄▀ █ \n ▄▀█▀▀▀▀▀█▀ █ █ \n ▀██ ▀█▀▄█ \n █▄▄▄█▀▀█▄▄▄█ "], ["attack", " ▄▀▀▀▀▀▀▄ \n █ ▀ ▀▄ \n █▀▀▀█▀▄ █ █ \n █ ▀▀ █ ▀▄ █\n▄▄ ███▄▄█ █ █\n▄▄█▄█▄█▄▄█▀▀▄▀▄▀\n▄▄▀ █▄▄▄▄▄█▄▄▄█\n █▄▄▄▀ ▀▄▄▄█"], ["eat_1", " ▄▀▀▀▀▀▀▄ \n █ ▀ ▀▄ \n █▀▀▀█▀▀▄ ▀▄ \n █ ▄█ █ █ █ \n ███ ▄█ ▀▄ █\n ▄▀█▀▀▀▀ ▀▄▀█ █\n ▀█▄▄▄▄▄▄▄█▀▀▄█\n █▄▄▄▀ ▀▄▄▄█ "], ["eat_2", " ▄▄▄▄▄▄ \n ▄▀ ▄ ▀▄ \n █▄▄▄▄█▄▀ ▀▄ \n █ ▄ █ ▄ █ \n ▀▄ ▀ ▀█ ▀▄ █\n ██▀▀▀▀▀█▄▀█ █\n ▀▄▀ ▀▄▄▀▄█\n █▄██▀▀▀██▄▄█ "], ["happy", " ▄▀▀▀▀▀▀▄ \n █ ▄▀▄ ▀▄ \n █▀▀▀▀▀▀▄ ▀▄ \n ▄▀█ ▄▀▄█ ▄▄▀▄\n ▀▄ ███▄▄▄█▀ ██\n ▀█ ▀▄▀█ █\n █▄▄▄▄▄▄▄█▀▀▄█\n █▄▄▄▀ ▀▄▄▄█ "], ["injured_1", " ▄▄▄▄▄▄ \n ▄▀ ▄▄ ▀▄ \n █▄▄▄▄▄ ▀▄ \n █ ▄ ▀▄ █ █▄ \n ▀▄ ▀▀█ ▀▄ █ \n ▄██▀▀▀▀█ ▄█ █ \n █▀█ █▀█▀ █ █ \n █▄▄█▄▄█▄▄██▄▀ "], ["injured_2", " \n ▄▀▀▀▀▀▀▄ \n █ ▀▀ ▀▄ \n █▀▀▀▀▀▄ ▄ █ \n █ ▀▄▄█ █ ▀▄ \n █▄▄▄▄▄█ █ █ \n █▀█ █▀█▀ █ █ \n █▄▄█▄▄█▄▄██▄▀ "], ["sleep_1", " \n ▄▄▄▄▄▄ \n ▄▀ ▄▄ ▀▄ \n █▄▄▄▄▄▄ ▀▄ \n █ █ ▄ █ \n ▀▄ ▀▀ █ ▀▄ █ \n ▄█▀█▀▀█▀▄█▀▄▀▄\n █▄█▄▄▄▄█▄▄██▀▀"], ["sleep_2", " \n ▄▀▀▀▀▀▀▄ \n █ ▀▀ ▀▄ \n █▀▀▀▀▀▀▄ █ \n █ ▄▄ █ █ ▀▄\n █▄▄▄▄▄█ ▄█ █\n ▄█ █ █ ▄█ █ █\n █▄█▄▄▄▄█▄▄██▀▀"], ["walk_1", " ▄▀▀▀▀▀▀▄ \n █ ▀ ▀▄ \n █▀▀▀█▀▀▄ ▀▄ \n █ ▄█ █ █ █ \n ▄█▄▄▄▄▄█ ▀▄ █\n ▄▀ █ ▀▄▀█ █\n ▀▀█▄▄▄▄▄▄▄█▀▀▄█\n █▄▄▄▀ ▀▄▄▄█ "], ["walk_2", " ▄▄▄▄▄▄ \n ▄▀ ▄ ▀▄ \n █▄▄▄▄▄▄ ▀▄ \n █ ▀▄ █ ▄ █ \n ▀▄ ▀▀ █ ▀▄ █\n ██▀▀▀▀▀█▄▀█ █\n ▀▄▀ ▀▄▄▀▄█\n █▄██▀▀▀██▄▄█ "]]], + ["sistermon_ciel", [["angry", " ▄▀▀▀▀▀▀▄▀▀▄ \n █ ▄█▄▄▀ ▀▄▀ \n █▀▄ ███▄ █ \n ██▄ ▀██ ▄ █ \n ▀▄▄▄▄▄▄█▄█ ▀▄\n ▄▀█▄▀▄▄▄█ ▀▄ █\n ▀▄█▄▄▄▄▄▄▄█▄█▀ \n █▄▄▀ ▀▄▄█ "], ["attack", " ▄▀▀▀▀▀▀▄▀▀▄ \n █ ▄█▄▄▀ ▀▄▀ \n █▀▄ ███▄ █ \n ██▄ ▀██ ▄ █ \n ▀▄▄▄▄▄▄█▄█ ▀▄\n ▄▀█▄▀▄▄▄█ ▀▄ █\n ▀▄█▄▄▄▄▄▄▄█▄█▀ \n █▄▄▀ ▀▄▄█ "], ["eat_1", " ▄▀▀▀▀▀▀▄▀▀▄ \n █ ▄█▄▄▀ ▀▄▀ \n █▀▄ ███▄ █ \n ██▄ ▀██ ▄ █ \n ▀▄▄▄▄▄▄█▄█ ▀▄\n ▄▀█▄▀▄▄▄█ ▀▄ █\n ▀▄█▄▄▄▄▄▄▄█▄█▀ \n █▄▄▀ ▀▄▄█ "], ["eat_2", " ▄▀▀▀▀▀▀▄▀▀▄ \n █ ▄█▄▄▀ ▀▄▀ \n █▀▄ ███▄ █ \n ██▄ ▀██ ▄ █ \n ▀▄▄▄▄▄▄█▄█ ▀▄\n ▄▀█▄▀▄▄▄█ ▀▄ █\n ▀▄█▄▄▄▄▄▄▄█▄█▀ \n █▄▄▀ ▀▄▄█ "], ["happy", " ▄▀▀▀▀▀▀▄▀▀▄ \n █ ▄█▄▄▀ ▀▄▀ \n █▀▄ ███▄ █ \n ██▄ ▀██ ▄ █ \n ▀▄▄▄▄▄▄█▄█ ▀▄\n ▄▀█▄▀▄▄▄█ ▀▄ █\n ▀▄█▄▄▄▄▄▄▄█▄█▀ \n █▄▄▀ ▀▄▄█ "], ["injured_1", " ▄▀▀▀▀▀▀▄▀▀▄ \n █ ▄█▄▄▀ ▀▄▀ \n █▀▄ ███▄ █ \n ██▄ ▀██ ▄ █ \n ▀▄▄▄▄▄▄█▄█ ▀▄\n ▄▀█▄▀▄▄▄█ ▀▄ █\n ▀▄█▄▄▄▄▄▄▄█▄█▀ \n █▄▄▀ ▀▄▄█ "], ["injured_2", " ▄▀▀▀▀▀▀▄▀▀▄ \n █ ▄█▄▄▀ ▀▄▀ \n █▀▄ ███▄ █ \n ██▄ ▀██ ▄ █ \n ▀▄▄▄▄▄▄█▄█ ▀▄\n ▄▀█▄▀▄▄▄█ ▀▄ █\n ▀▄█▄▄▄▄▄▄▄█▄█▀ \n █▄▄▀ ▀▄▄█ "], ["refuse", " ▄▀▀▀▀▀▀▄▀▀▄ \n █ ▄█▄▄▀ ▀▄▀ \n █▀▄ ███▄ █ \n ██▄ ▀██ ▄ █ \n ▀▄▄▄▄▄▄█▄█ ▀▄\n ▄▀█▄▀▄▄▄█ ▀▄ █\n ▀▄█▄▄▄▄▄▄▄█▄█▀ \n █▄▄▀ ▀▄▄█ "], ["sleep_1", " ▄▀▀▀▀▀▀▄▀▀▄ \n █ ▄█▄▄▀ ▀▄▀ \n █▀▄ ███▄ █ \n ██▄ ▀██ ▄ █ \n ▀▄▄▄▄▄▄█▄█ ▀▄\n ▄▀█▄▀▄▄▄█ ▀▄ █\n ▀▄█▄▄▄▄▄▄▄█▄█▀ \n █▄▄▀ ▀▄▄█ "], ["sleep_2", " ▄▀▀▀▀▀▀▄▀▀▄ \n █ ▄█▄▄▀ ▀▄▀ \n █▀▄ ███▄ █ \n ██▄ ▀██ ▄ █ \n ▀▄▄▄▄▄▄█▄█ ▀▄\n ▄▀█▄▀▄▄▄█ ▀▄ █\n ▀▄█▄▄▄▄▄▄▄█▄█▀ \n █▄▄▀ ▀▄▄█ "], ["walk_1", " ▄▀▀▀▀▀▀▄▀▀▄ \n █ ▄█▄▄▀ ▀▄▀ \n █▀▄ ███▄ █ \n ██▄ ▀██ ▄ █ \n ▀▄▄▄▄▄▄█▄█ ▀▄\n ▄▀█▄▀▄▄▄█ ▀▄ █\n ▀▄█▄▄▄▄▄▄▄█▄█▀ \n █▄▄▀ ▀▄▄█ "], ["walk_2", " ▄▄▄▄▄▀▀▀▄ \n ▄▀ ▄▀█ █ \n ███▀█▀▄ █ \n █▀ ▀▀ █ █ \n ▀█▄▄▄▀█ ▀▄\n █ ▄▄▀█ ▄█▀\n█▀▀▀▀▀▀█ ▄▀▀█▄ \n ▀▀▀▀████▀▀█▄▄▄█"]]], + ["skullbaluchimon", [["angry", " ▄▄▄▄ \n █▀▀▄▄▄ ▀▄ ▀█▄\n ▄▀▀ ▄▄▀█▀█ ▀▀▄▀\n█▄▄▄▀▀ ▄▄█▀██▄▀\n█▄▄▄▄██ ██ █ █▀█\n▀▄▄█ █▄█▀▄█▄▀ █ \n ▄▄▀▀▄▀ ▄▀█▄ █\n█▄█▄█▄█▄█ █▄█▄█"], ["attack", " ▄▄▀▀█\n █▀▀▄▄▄ ▄▀ ▄██▄\n ▄▀▀ ▄ ▀█▀▄ ▄▄▄▀\n█▄▄▄▀▀ ▄▄█▄▄▀ \n█▄▄▄ ██▄ █▀▄▀█▄▄\n ███▄██▀▄▀▄▀▄▀▄▀\n █▄▄▄▄▄█▀▀█▀▄ █\n█▄█▄▄▀█▄█▄██▄█▄█"], ["eat_1", " █▀▀▄▄▄ █▀▀▀▄▄ \n ▄▀▀ ▄▄▀█▀█ ▄▄▀█\n█▄▄▄▀ ▀ ▄▄▀ ▄▄▀▄\n█▄▄▄▀██ █▀█▀██▀ \n ███▄█ █ █ █ █▀█\n▀▄▄▄▄▄▀ ▀▄█▄▀ ▀▄\n ▄█ █ █ ▀█ █\n █▄█▄█▄█▄█ █▄█▄█"], ["eat_2", " ▄▄▄ █▀▀▀▄▄ \n ▀▄▄▀▀▀▄▄█▄ ▄▄▀█\n▄▀ ▄▀▄ ▀ █ ▄▄▀▄\n█▀▀▀ ▄▄ █▀▄▀██▀ \n█▀▀█▀█▀▄▀█ █ █▀█\n ▀▀▀▄▀█ █▄▀ █ \n ▄▄▀ █ █ ▀▄ █\n █▄█▄█▄█▄█ █▄█▄█"], ["happy", " █▀▀▄▄▄ █▀▀▀▄▄ \n ▄▀▀ ▄ ▀█▀█ ▄▄▀█\n█▄▄▄▀ ▀ ▄▄▀ ▄▄▀▄\n█▄▄▄▀██ █▀█▀██▀ \n ███▄█▀▄██ █ █▀█\n▀▄▄▄▄▄▀ ▀▄█▄▀ █ \n ▄█ █▀▄ █ ▀▄ █\n █▄█▄██▀▀▀ █▄█▄█"], ["injured_1", " \n ▄▄▄▄ \n █▀▀▄▄▄ █ ▀█▄\n ▄▀▀▄ ▀█▀█ ▀▀▄▀\n█▄▄▄▀▀ ▄▄█▄██▄▀\n█▄▄▄▀██ █▄▀▄▀█▄▄\n▀▄▄█▄█▄▀ ▀▄█▀▀▄█\n█▄▄███▄▄▄███▄▄▄█"], ["injured_2", " \n \n ▄▄▄ █▀▀▀▄▄ \n ▀▄▄▀▀▀▄▄█▄ ▄▄▀█\n▄▀ █▄ ▀ █ ▄▄▀▄\n█▀▀▀▄▄▄ █▀█▀███▄\n████ ██▄▀█ █▀▀▄▀\n█▄▄███▄▄▄███▄▄▄█"], ["sleep_1", " \n \n ▄▄▄ █▀▀▄▄ \n ▀▄▄▀▀▀▄▄▄█ ▄ █▄\n▄▀ ▄▄▄ ▀ █▄▀▄ █\n█▀▀▀ ▄▄ █▀█▀▄█▄█\n▀███▀██▀▀█ █ █▀▄\n█▄▄█▄█▄▄▄██▄█▄▄█"], ["sleep_2", " \n \n █▀▀▄▄▄ █▀▀▀▄▄ \n ▄▀▀ ▀█▀█ ▄▄▀█\n█▄▄▄▀▀▀ ▄▄▀ ▄▄▀▄\n█▄▄▄▄██ █▀█▀███▀\n▀▄▄█ █▄▀▀█ █ █ █\n█▄▄██▄▄▄▄██▄█▄▄█"], ["walk_1", " █▀▀▄▄▄ █▀▀▀▄▄ \n ▄▀▀ ▄▄▀█▀█ ▄▄▀█\n█▄▄▄▀▀▀ ▄▄▀ ▄▄▀▄\n█▄▄▄▄██ █▀█▀██▀▀\n▀▄▄█ █▄▀ █ █ █▀█\n █▀ ▀▄█▄▀ ▀▄\n ▄▄▀ █ █ ▀█ █\n █▄█▄█▄█▄█ █▄█▄█"], ["walk_2", " ▄▄▄ ▄▄▄▄▄\n ▀▄▄▀▀▀▄▄█▀ ▄▄▀\n▄▀ ▄██ ▀ █ ▀▄▄█\n█▀▀▀ ▄▄ ██▄▄█▀ \n█▀▀█▀█▀▄▀▄▀▄▀█▄▄\n ▀▀█▄█▀ ▄▀▄▀▄▀▄▀\n ▄▄▀ █▄ ▀██ █ \n█▄█▄▄▀█▄█▄█▄█▄█ "]]], + ["skullgreymon", [["angry", " ▄▄▄▄▄ \n ▀▄▄▄ ▀▀▀▄▄ ▄▄▄ \n ▄▄▀ ▄▀ █▀ ▄▄▀\n█▄▄▄█▄ ▀▀▄▀▄▄ \n █▄▄▄▄▄ ▄ ▄▀▄▄▀\n█ █ █▄▀▄█▄▄▀▀▄ █\n ▀▄█▄▄▀▄▄ █▄▄▄▄▀\n █▄█▄▄▄▄▄█▄█▄█▄█"], ["attack", " \n ▄▄▄▄▄ ▄▀▀▄ ▄▄▄ \n █▄▄▄ ▀▀▀▄▄▀ ▄▄▀\n█▄▄▄ ▄█ █▄▀▄▄ \n ▀▄ ▀█ ▀▄▄▀\n ▄▀ █▄▀█ █ █\n █▀▀▄▄▀▄ ▀▄▀▄▄▄▀\n█▄██▄▄▀ █▄▄█▄█▄█"], ["eat_1", " █▀▀▀▀▄▄▄ \n ▄█▀▀ ▄ ▀█▄▀▀▀▄\n█▄▄▄▄▄▀▀ ▄█ ▄▀▀ \n █ ▄ ▀▄▀▀▄\n ▄▄▄▀ ▄▀▄▀▄▀ ▀█ \n▄▀▄▄▀▀▄▀▀▄▀▀▄▄▀ \n▀▄▄█▀█ ▀▀▀▄▄▀ █ \n █▄█▄▄█▀▀▀▄█▄█▄█"], ["eat_2", " ▄▄▄▄▄ \n ▀▄▄▄ ▀▀▀▄▄ ▄▄▄ \n ▄▄▀ ▄▀▄ █▀ ▄▄▀\n█▄▄▄█▄ ▀▀▄▀▄▄ \n █▄▄▄▄▄▀ ▄ ▄▀▄▄▀\n█ █ █▄▀▄█▄▄▀▀▄ █\n ▀▄█▄▄▀▄▄ █▄▄▄▄▀\n █▄█▄▄▄▄▄█▄█▄█▄█"], ["happy", " █▀▀▀▀▄▄▄ \n ▄▀▀▀ ▄ ▀█▄▀▀▀▄\n█▄▄▄▄▄▀ ▀▄█ ▄▀▀ \n █ ▄ ▄█▄▀▀▄\n ▄▄▄▀ ▄▀▄▀ ▀ ▄▄▀\n ▀▄▄▀▀▄▀▀▄▀ █▄▀ \n ▄▄█▀█ ▀▀▀▄▄▀ █ \n █▄█▄▄█▀▀▀▄█▄█▄█"], ["injured_1", " ▄▄▄▄▄ \n ▀▄▄▄ ▀▀▀▄▄ ▄▄▄ \n ▄▄▀▄ █▀ ▄▄▀\n█▄▄▄ ▀▀ ▀▀▄▀▄▄ \n █▄▄▄▄▄▀ ▄ ▄▀▄▄▀\n█ █ █▄▀▄█▄▄▀▀▄ █\n ▀▄█▄▄▀▄▄ █▄▄▄▄▀\n █▄█▄▄▄▄▄█▄█▄█▄█"], ["injured_2", " \n █▀▀▀▀▄▄▄ \n ▀█▀ ▀█▄▀▀▀▄\n▄▀▀ ▀▄▄ ▄█ ▄▀▀ \n▀█▀▀ ▄ ▀▄▀▀▄\n ▀█▀█▀█ ▄▀ ▄ ██▄\n █▀▄▀▀ ▀▀▀█▀▀ █\n██▄███▄██▄█▄▄▄▄█"], ["sleep_1", " \n ▄▄▄▄▄ \n ▀▄▄▄ ▀▀▀▄▄▄▀▀▀▄\n ▄▄▀ ▄▄ █ ▄▀▀ \n█▄▄▄█▄ ▄▀▀▀▄▀▀▄\n █▄▄▄▄▄███▀█▀█▀ \n █▀█▀█▀▄▄█▀█▀█▄ \n ▀▄▄▄█▄▄▄█▄▄▄█▄█"], ["sleep_2", " \n █▀▀▀▀▄▄▄ \n ▀█▀ ▀█▄▀▀▀▄\n▄▀▀ ▄ ▀▀ ▄█ ▄▀▀ \n▀█▀▀▀▀ ▄ ▀▄▀▀▄\n █▀█▀█▀▄██▀█▀█▀ \n █▀█▀█▀▄▄█▀█▀█▄ \n ▀▄▄▄█▄▄▄█▄▄▄█▄█"], ["walk_1", " █▀▀▀▀▄▄▄ \n ▀█▀ ▄ ▀█▄▀▀▀▄\n▄▀▀ ▄ ▀▀ ▄█ ▄▀▀ \n▀█▀▀▀▀ ▄ ▀▄▀▀▄\n ▀█▀▀█ ▄▀▄▀ ▀█ \n▄▀▀▄▀▀▄▀▀▄▀▀▄▄▀ \n▀▄▄█▀█ ▀▀▀▄▄▀ █ \n █▄█▄▄█▀▀▀▄█▄█▄█"], ["walk_2", " ▄▄▄▄▄ \n ▀▄▄▄ ▀▀▀▄▄ ▄▄▄ \n ▄▄▀ ▄█ █▀ ▄▄▀\n█▄▄▄█▄ ▀▀▄▀▄▄ \n █▄▄▄▄▄ ▄ ▄▀▄▄▀\n█ █ █▄▀▄█▄▄▀▀▄ █\n ▀▄█▄▄▀▄▄ █▄▄▄▄▀\n █▄█▄▄▄▄▄█▄█▄█▄█"]]], + ["skullmammothmon", [["angry", " █▀▄ ▄▀█▀▀▀▀▄▄ \n ▀▄ █ ▀ ▀▄\n▄▀█ ▀▄▀█ ▀▀ ▄ █\n█ ▀▄ █ █ ▄█ ▄▀\n ▀██▀▀█▀▀▀▀█ ▀▄ \n █ █▀▀▄▀▀▀█ ▄▀ \n ▄▀█▀▀▄▀▀▀▄█▀ █▄\n█▄█▄██▀▀▀█▄█▄█▄█"], ["attack", "█▀▀▀▀▄▀▀▀▀▀▀▀▄▄ \n▀█▀█ ▀▄▀█ ▄▄ █\n █ ▀▄▄█ █ ▀▀ █\n ▀▀▄ ▀▄ █ ▄▀\n ▄▄▀ █▀█▀▀█▀▄\n █ █▀█▀▀ ▄▀▄▄▄▄▀\n ▄▀█▀▄▀▀▀ █▄▀ █▄\n█▄█▄██▀▀▀█▄█▄█▄█"], ["eat_1", "█▀▀▀▀▄▀▀▀▀▀▀▄ \n▀█▀█ ▀▄▀█ ▄ ▀▀▄\n █ ▀▄▄█ █ ▀▀ █\n ▀█ ▀▄ █ █\n ▄▄ █ █▀▀█▀▄▀\n█ █▀▀█▀▀▀▄▄▄▄▀ \n ▀█▀█▀▄▀▀▀▄▄▀ █▄\n █▄█▄██▀▀█▄█▄█▄█"], ["eat_2", " ▄▄▄ ▄▀█▀▀▀▀▄▄ \n ▀▄ █ ▄ ▀ ▀▄\n▄▀█ ▀▄▀█ ▀▀ ▄ █\n█ ▀▄ █ █ ▄█ ▄▀\n █▀█▀▄▀▀█▀▀█ █ \n ▀▄█▀▄▀▀▀▄▄▄▄▀▄ \n ▄▀█ ▀▀▀▀▄▄▀ █▄\n █▄█▄██▀▀█▄█▄█▄█"], ["happy", "█▀▀▀▀▄▀▀▀▀▀▀▀▄ \n▀█▀█ ▀▄▀█ ▄▀▄ ▀▄\n █ ▀▄▄▀ █ ▄ █\n▄▀▀█ ▀▀▀ █ ▄▀▀▀▄\n█ ▄█▄ ▄▀▀▀▄▄ █\n▀▄▄█ ▀█▀ ▀▀▀█▄▄▀\n ▄▀█▀▀▄▀▀▀██▀ █▄\n█▄█▄██▀▀▀█▄█▄█▄█"], ["injured_1", " ▄▄▄▄▄▄ \n ▄▀ ▀ ▀▀▄ \n ▄█ ▄▄ ▄ ▄ █\n █ █ █ █ ▀▀ █ █\n ▀▄█ █▄█▄▄▄█▀▄▀ \n █ ▀▄▄▀▄▄▄▄▀ █ \n █▄█▄▄▀▄▄▄█▄▀▀█▄\n█▄▄█▄▄▄▄▄█▄█▄█▄█"], ["injured_2", " \n ▄▀█▀▀▀▀▄ \n ▄▀ █▀▄ \n▄▀█ ▄▀█ ▀▄▄ █ \n█ █ █ █ ▄█ █ \n▄▀█ ▀█▀▀▀█▀ █▀ \n▀▄▄▀▀█▀▀▀▀▄█▀ █ \n█▄█▄█▄▄▄▄█▄█▄█▄█"], ["sleep_1", " \n ▄▀█▀▀▀▀▄▄ \n ▄▀ ▀▄\n ▄▀█ ▄▀█ ▀▀ █ █\n █ █ █ █▄▄▄▀█▄ █\n ▄▀█▄▄█▄▄▄▄▀ █ \n █▄█▄▀▄▄▄▄█▄▀▀█▄\n█▄▄█▄▄▄▄▄█▄█▄█▄█"], ["sleep_2", " ▄▄▄▄▄▄ \n ▄▀ ▀ ▀▀▄ \n ▄█ ▄▄ ▄ █\n █ █ █ █ ▀▀ █ █\n ▀▄█ █▄█▄▄▄█▀▄▀ \n █ ▀▄▄▀▄▄▄▄▀ █ \n █▄█▄▄▀▄▄▄█▄▀▀█▄\n█▄▄█▄▄▄▄▄█▄█▄█▄█"], ["walk_1", " ▄▄▄ ▄▀█▀▀▀▀▄▄ \n ▀▄ █ ▄ ▀ ▀▄\n▄▀█ ▀▄▀█ ▀▀ ▄ █\n█ ▀▄ █ █ ▄█ ▄▀\n▄▀▀█▀▄▀▀█▀▀▄▀█ \n▀▄▄▀▀▄▀▀▀▄▄▀▄▀▄ \n ▄▀█▀▄▀▀▀▀▄▄▀ █▄\n█▄█▄██▀▀▀█▄█▄█▄█"], ["walk_2", " ▄▄▄▄▄▄ \n▄▄▄▄ █ ▀ █▄ \n▀▄▄ █ ▄▄ ▄█ ▀▄\n█ █ █ █ █ █\n▀▄▄█▄▀▄█▄▄▄▀█ ▄▀\n ▄▀ ▄▀▄▄▄▄▀ ▄█ \n █▄█▄▀▄▄▄▀▄▄▀ █ \n█▄▄█▄▄▄▄▄█▄█▄█▄█"]]], + ["skullmammothmon_x", [["angry", " ▄▄▄▄▄▄ ▄▄\n█▀▀▀▄▀ ▀ █▀ █\n █▀▄█▄▀█ ▄█ █ █▄\n█ █▀ █ █ █▀▄█\n▀▄▄█▄▀▄▀█▀▄▀▀▀█ \n ▄▀▀█▀▀██▀▄█▀▀▄ \n ▀▄▄███▄▄▀▄█▄▄█ \n ██▄▄█▄███▄▄██▄█"], ["attack", "█▀▀▀▄▄▀▀▀▀▀▄▄▄▀█\n▀▄▄ ▄▀▄ ▄█ █ ▄▀\n ▀█ █ ▀▄ █▄▀█\n ▀██▄██ █▄█▄\n ▄▄▄▀▀▀▀▀▄█▄▄▄▀\n █ ▀█▀▀▀▀█ ▀ █\n ▀█▀█▀██▀▄█▀██ \n ██▄▄█▄▀▀▀▀▄▄█▄█"], ["eat_1", " ▄▀▀▄▄▀▀█▀▀▀▄▄▀█\n█ ▄ █▀▄ ▄▄ █ ▄▀\n█ █▄█▄█▄ ▀▄▀█\n █ ▄▀████ █▄█▀\n ▀ ▄▀▀▀▀ ▄█▄▄▀ \n▄▀▀▀█▀█▀▀█▀█▄ ▀▄\n▀▄▄█▀█▀██ ▄▀▀▄▄▀\n ██▄▄█▄▀▀█▄▄██▄█"], ["eat_2", " ▄▄▄▄▄▄ ▄▄\n█▀▀▀▄▀ ▀ █▀ █\n █▀▄█ ▄▄ ▄▀▄█ █▄\n█ █▀ █ █ █▀▄█\n▀▄▄█▄█▄█▄▄▄▀▀▀█ \n ▄▀█▀▄▄▄▄▀▀█▀▄ \n █ ▄██▀█▀▀▄▄▄▄█ \n ███▄█▄▀▀█▄▄▄█▄█"], ["happy", "█▀▀▀▄▄▀█▀▀▀▀▄▄▀█\n▀█▀ █ ▄▄ ▄▀▄█ ▄▀\n█ █▀█ █ ▄▄ █▄▀█\n ▀▀▄▄█▄████ █▀▀▄\n ▄▄██▀▀▀▀ ▄▀ ▄▀\n ▀▄ ▀█▀▀▀▀█▄▄█ \n ▄█▀████▀▄▀ █▄ \n ██▄▄█▄▀▀█▄▄██▄█"], ["injured_1", " ▄▄▄▄▄▄ ▄▄\n ▄▀ ▀ █▀ █\n █ ▄ ▄ █ █▄\n ▄▀ █ █ ▀▀ █▀▄█\n ▄▀ ▄█▄█▄▄▄▀▀▀█ \n █ ██▄▄▄▄█▀██▄▀\n▄▀▀█ ▀▀█▀▀ █ ▀ █\n█▄▄▄█▄▄█▄▄██▄▄▄█"], ["injured_2", " \n ▄▀█▀▀▀▀▄▄▀█\n █ █ ▄▀\n █ ▄▀█ █▄ █▄▀█\n▄▄▀ █ █▄ ▄█▄█▀\n█ ▄██▀▀▀▀█▄▄▄█ \n▄▀▀█ ▀▀█▀▀ █ ▀ █\n█▄▄▄█▄▄█▄▄██▄▄▄█"], ["sleep_1", " \n ▄▀█▀▀▀▄▄▄▀█ \n ▄▀ ▄▄▄ █ ▄▀ \n▄▀ ▄▀▄ █▄▀█ \n█ ▀▄ █ ▄▀▀▀█ \n ▀▄█▀▀█▀▀█▀▀▀█ \n ▄█▀▄█▀▀█▄▄█▀█ \n ██▄▄▄████▄▄▄█▄█"], ["sleep_2", " ▄▄▄▄▄ ▄▄\n ▄▀ ▀ ▀█▀ █\n ▄▀ ▄ ▀▀▀ █ █▄\n █ █ █ █▀▄█\n █ ▀▄▄█▄▄▄▀▀▀█ \n █▄▀▀█▄▄▄▀▀▀█ \n ▄█▀▄█▀ █▄▄█▀█ \n ██▄▄▄████▄▄▄█▄█"], ["walk_1", "▄▄▄▄ ▄▀█▀▀▀▀▄▄▀█\n▀▄▄ █ ▄ █ ▄▀\n▄▀▄█▀▄▀█ ▀▀ █▄▀█\n█ ▀▄ █ █ ▄█▄█▀\n ▀▀▀██▀▀▀▀▀▄▄▄▀ \n ▄▀▀█▄█▀▀█▀█ █ \n█ ▄█▀█▀██ ▄▀▀█▄ \n▀██▄▄█▄▀▀█▄▄██▄█"], ["walk_2", " ▄▄▄▄▄▄ ▄▄\n█▀▀▀▄▀ ▀ █▀ █\n █▀▄█ ▄▄ ▄█ █ █▄\n█ █▀ █ █ █▀▄█\n▀▄▄█▄█▄█▄▄▄▀▀▀█ \n ▄▄█▀▄▄▄▄▄█▀▀▄ \n▄▀ ▄███▄▄▀▄█▄▄█ \n▀██▄▄█▄███▄▄██▄█"]]], + ["skullmeramon", [["angry", " ▄▄▀▀▀▀▀▀▀█▀\n ▄▀ ▄▄▄▄ ▀▄ \n ▀▄█▀███ ▄▀ \n ▄ ██▄███▀ ▄█▄█ \n █▀▀▄▄▄█▀ ▄ █ \n ▀▄▄▄▀ ▀▄▄▄▀ \n ▄▄█ ▄▄▄▄▄ █▄▄\n ▀▄▄▄▄▄▀ ▀▄▄▄▄▄▀"], ["attack", " ▄▄▀▀▀▀▀▀▀█▀\n ▄▀▄▄██▀▀█ ▀▀█\n ▄▀▀▀▀█▄▄██ █ \n ▀▄ ▀██ █▄█\n █▄▄▀ ▄▀ ▀ █\n █ ▀█▀▀ █▀ ▄▀\n ▄██▀▀▄▄▄ ▀█▄ \n ▀▄▄▄▄▄█ █▄▄▄▄▄█"], ["eat_1", " ▄▄▀▀▀▀▀▀█▀ \n ▄▀▄▄██▀██ ▀▀█\n █▄███▄█▄█ █ \n ▀▄ ▀██ █▄█\n ▄▀ ▄▀ ▀ █\n █ ▀█▀▀ █▀ ▄▀\n ▄▄█▀▀▄▄▄ ▀█▄ \n ▀▄▄▄▄▄█ █▄▄▄▄▄█"], ["eat_2", " ▄▄▄▀▄▀█▄▄▀█\n ▄▀▄ ▄▄▄▄ █\n █ ██▀▄███ █ \n ███▄███▀ █▄█\n ▄▀▄▄▄▄▀▀ ▀ █\n █ ▀▄ █▀ ▄▀\n ▄▄█▀▀▄▄▄ ▀█▄ \n ▀▄▄▄▄▄█ █▄▄▄▄▄█"], ["happy", " █▄ ▄▀▄▀▀▄▀▄ ▄█ \n █ ▀▄▄▄ ▄▄▄▀ █ \n █ ▄▀▄▀██▀▄▀▄ █ \n█▀▄▀█▀████▀█▀▄▀█\n▀▄ █ █ ▄▀\n ▀▄ ▀▄▄▄▄▀ ▄▀ \n █▄▄▀ ▀▄▄█ \n ▀▄▄▄▄█▀▀█▄▄▄▄▀ "], ["injured_1", " ▄ ▄ ▄ ▄▄ \n ▄▀▀▀ ▀ ▀▀ █ \n █ ▄▄ ▄▄ █ \n █ ██▀██▀██ ▄▀▄\n ▄▀▄█▄▄██▄▄█▄▀▀█\n █▀ ▀█▄▄▄▄█ ▄▄▄▀\n ▀▄▄▄█ █▀ ▄█ \n █▄▄▄▄█▄█▄▄▄▄▄█"], ["injured_2", " ▄ \n ▄▀▄▄▀▀▄ ▄ \n ▄▀ ▀ █ \n▄▀▄▄▄ ▄▄▄ █ ▀ \n█ █▀ ██ ▀█ ▄▀█ \n ▀▄██████▀ █▄ \n █ ▄ ▄ ▄ ▀ █\n█▄▄▄█▄█▄▄▄█▄▄█▄█"], ["sleep_1", " ▄ \n ▄▀▄▀ ▀▄ ▄█ \n ▄▀ ▀ █ \n▄▀▄▄▄ ▄▄▄ █▄█ \n█ █▀▀██▀▀█ █▀ █ \n █ ▀█████▀▀▄▄▄▀ \n █▀▄█ █ █▄█▄ █ \n ▀▄▄▄▄█▄▄▄▄▄▄▄▀ "], ["sleep_2", " ▄ ▄ ▄ ▄ \n ▄▀▀▀ ▀ ▀▄▀█ \n █▄▄▄ ▄▄▄ █ \n █ █▀▀██▀▀█ ▄▀▄ \n ▀▄▀███████▄▀▀█ \n █ ▀▄▄ ▄▄▀ ▄▄▄▀ \n █▀▄█ █ █▄█▄ █ \n ▀▄▄▄▄█▄▄▄▄▄▄▄▀ "], ["walk_1", " █▄▄▀▄▀▄▄ █▄ \n █ ▄▄ ▄▄▄▄▀ █ \n █ █ ▀██▀ █ █ \n █ ██▄██▄█▀ ▄▀▄\n▄▀▀▄▀▄▄▄▄▄▀▀█ ▀█\n█ ▀█ █ ▀ █\n▄██▀ ▀▄▄▄ ▀▀▀██ \n▀▄▄▄▄█ █▄▄▄▄▄█"], ["walk_2", " █▄▄▀▄▀▄ ▄█ \n ▄▀▄ ▄▄▄▄▄▀ █ \n █ ██▀ ███ █ \n █ ███▄███▀ █▄█\n ▀▄▀▄▄▄▄▀▀ ▀ █\n █▀ █ █▀ ▄▀\n▄▄█▀ ▀▄▄▄ ▀█▄ \n▀▄▄▄▄█ █▄▄▄▄▄█"]]], + ["skullscorpiomon", [["angry", " \n ▄▄▄▄▄ \n ▄▄▀█ █▄▄▀ █\n ▄▀▄ ▄▀▄ ▀█▀█\n█▀▀▀▀▀▄ █▀█▄▄▀▀█\n ▀▄ ▀▀ ▄▀ ▄ ▀▄▀\n ▄▀▀▀▀▄▀ █ ▄ █ \n █▄████▄▄█████▄█"], ["attack", " ▄▄▀█ ▄▀▀█▀▀▄\n ▄█▄▄▄▀▄▀▀▀▄▄▄█\n█▀▀ ▄▄▀█▄▄ █▄█\n ▀▄▄▀▀▄▄▄▄▀▀▀▄ █\n ██████ ▄▀ █ \n ███▀█▀▄█ █ █ \n █▄▄▄▄▄▀███▀▀▄ \n █▄█▄▄█ █▄▄█▄█"], ["eat_1", " ▄▄ ▄▀▀█▀▀▄\n ▄▀▀ █ ▀▀▀▄▄▄█\n▄▄█▄█▄▀ █▄▄ █▄█\n▀▄ ▀▀▄██▀▄▀▀▀▄ █\n ▀██▄▄▄▀ ▄▀ █ \n ███▀█ ▄█ █ █ \n █▄▄▄▀▄███▀▀█ \n █▄█▄▄█ █▄▄█▄█ "], ["eat_2", " ▄▄▄▄▄ \n ▄▄▀█ █▄▄▀ █\n ▄▀▄ ▄▀▄ ▀█▀█\n█▀▀▀▀▀▄ ▀▀█▄▄▀▀█\n ▀▄ ▀ ▀▄▀ ▄ ▀▄▀\n ▄▀▀▀▀▄▀ █ ▄ █ \n █▀▀▀▀ ▄██▄█▄█ \n █▄█▄▄▄█▀▀█▄▄█▄█"], ["happy", " ▄▄ ▄▀▀█▀▀▄\n ▄▀▀ █ ▀▀▀▄▄▄█\n▄▄█▄█▄▀ █▄▄ █▄█\n▀▄ ▄▀▄▀▄▀▀▀▄ █\n ▀██▄▄▄▀ ▄▀ █ \n ███▀█ ▄█ █ █ \n █▄▄▄▀▄███▀▀█ \n █▄█▄▄█ █▄▄█▄█ "], ["injured_1", " \n ▄▄▄▄▄ \n ▄▄▀█ █▄▄▀ █\n ▄▀▄ ▄▀▄ ▀█▀█\n█▀▀███ ▀▀█▄▄▀▀█\n ▀▄ ▀▀ ▄▀ ▄ ▀▄▀\n ▄▀▀▀▀▄▀ █ ▄ █ \n █▄████▄▄█████▄█"], ["injured_2", " \n \n ▄▄ ▄▄▄▄▄ \n ▄▀▀ █ █▄▄█ ▄█\n▄▄█▄█▄▀ █▄▄ █▄█\n▀▄ ▀▀█▄ ▄▀▀▀▄ █\n ▀▄▄▄▄ █ ▄▀ █ \n ██▄▄▄▄█▄▄█▄█▄██"], ["sleep_1", " \n \n ▄▄ ▄▄▄▄▄ \n ▄▀▀ █ █▄▄█ ▄█\n▄▄███▄▀ █▄▄ █▄█\n▀▄ ▀███▀▀▄▀▀▀▄ █\n ▀▄▄▄▄ █ ▄▀ █ \n ██▄▄▄▄█▄▄█▄█▄██"], ["sleep_2", " \n ▄▄▄▄▄ \n ▄▄▀█ █▄▄▀ █\n ▄█▄ ▄▀▄ ▀█▀█\n█▀▀███▄▄█▀█▄▄▀▀█\n ▀▄ ▀▀▀ ▄▀ ▄ ▀▄▀\n ▄▀▀▀▀▄▀ █ ▄ █ \n █▄████▄▄█████▄█"], ["walk_1", " ▄▄ ▄▀▀█▀▀▄\n ▄▀▀ █ ▀▀▀▄▄▄█\n▄▄█▄█▄▀ █▄▄ █▄█\n▀▄ ▀▀▄██ ▄▀▀▀▄ █\n ▀▄▄▄▄▄▀ ▄▀ █ \n ▄▀▀▀▄▀ ▄█ █ █ \n ▀█▀▀▄▄███▀▀█ \n █▄█▄▄█ █▄▄█▄█ "], ["walk_2", " ▄▄▄▄▄ \n ▄▄▀█ █▄▄▀ █\n ▄▀▄ ▄▀▄ ▀█▀█\n█▀▀██▀▄▄▀▀█▄▄▀▀█\n ▀▄ ▀▀▀▄▀ ▄ ▀▄▀\n ███▀█ █ ▄ █ \n █▄▄▄█ ▄██▄█▄█ \n █▄█▄▄▄█▀▀█▄▄█▄█"]]], + ["slashangemon", [["angry", "█▀▀▀▄▀▀▀█▀▀▄ \n ▀▄▀ ▄█ █ ▀▄▄▀▄ \n █▀▀ ▄▀ ▀█ ▀▄\n ▀████ █▄▀ ▀▄█\n▄▀██▀▀▀ █▀▀▀▄ ▀█\n█ █████▄█ ██ █\n ▀█▀ ██▀ ▀█▀ ▀█\n █▄▄▀██▀▄▄▄█ ▀"], ["attack", "▄▄▄▄ ▄▄▄▄▄▄ \n▀▄ ▄▀ █ ▄▀ ▄ \n █▄▄▀▀ █ ▄█▀ █ \n █▄▄▄▄▀▄ ▄▀ ▄ █\n ▀▄▄▄▄▄▀▀▄ ▄ ██\n █▄▀ ▀▄█ ▀▄ █\n▄▀▄█▀███▀█ ▀▄▀▄█\n██▄▄▀██▀▄▄█▄█ ▀"], ["eat_1", "▄▄▄▄ ▄▄▄▄▄▄ \n▀▄ ▄▀ ▄ █ ▄▀ ▄ \n █▄▄▀ ▀█ ▄█▀ █ \n █▄▄▄▄▀▄ ▄▀ ▄ █\n ▀▄▄▄▄▄▀▀▄ ▄ ██\n █▄▀ ▀▄█ ▀▄ █\n▄▀▄█▀███▀█ ▀▄▀▄█\n██▄▄▀██▀▄▄█▄█ ▀"], ["eat_2", "█▀▀▀▄▀▀▀█▀▀▄ \n ▀▄▀ ▄▄ █ ▀▄▄▀▄ \n █▀▀ ▄▀ ▀█ ▀▄\n ▀████ █▄▀ ▀▄█\n █▀▀▀▀ █ █ █ ▀█\n █ █████▄█▀▄ █ █\n█ ▄▀ ██▀ ▀▄ █ ▀█\n █▄▄▀██▀▄▄▄█▀ ▀"], ["happy", "█▀▀▀▄▀▀▀█▀▀▄ \n ▀▄▀ ▄▀▄█ ▀▄▄▀▄ \n █▀▀ ▄▀ ▀█ ▀▄\n █████ █▄▀ ▀▄█\n ▄▀▀▀ █ █ █ ▀█\n █ █████▄█▀▄ █ █\n█ ▄▀ ██▀ ▀▄ █ ▀█\n █▄▄▀██▀▄▄▄█▀ ▀"], ["injured_1", " \n▄▄▄▄ ▄▄▄▄▄▄ \n▀▄ ▄▀▄ █ ▄▀ ▄ \n █▄ ▀▀ █ ▄█▀ █ \n █▄▄▄▄▀▄ ▄▀ ▄ █\n ▀▄▄▄▄▄█▀▄ ▄ ██\n ▄▀▀▄ ▄█▀▀█▄ █\n██▄▄██████▄▄██▄█"], ["injured_2", " \n \n█▀▀▀▄▀▀▀█▀▀▄ \n ▀▄▀ █▄ █ ▀▄▄▀▄ \n █▀ ▄▀ ▀█ ▀▄\n █▀▀▀▀ █▄▀ ▀▄█\n ▄▀▀█▀▀▀▄█▀▀█▄ █\n██▄▄██████▄▄██▄█"], ["refuse", "▄▄▄▄ ▄▄▄▄▄▄ \n▀▄ ▄▀ ▄ █ ▄▀ ▄ \n █▄▄▀▀ █ ▄█▀ █ \n █▄▄▄▄▀▄ ▄▀ ▄ █\n ▀▄▄▄▄▄▀▀▄ ▄ ██\n █▄▀ ▀▄█ ▀▄ █\n▄▀▄█▀███▀█ ▀▄▀▄█\n██▄▄▀██▀▄▄█▄█ ▀"], ["sleep_1", " \n▄▄▄▄ ▄▄▄▄▄▄ \n▀▄ ▄▀ █ ▄▀ ▄ \n █▄ ▀▀ █ ▄█▀ █ \n █▄▄▄▄▀▄ ▄▀ ▄ █\n ▀▄▄▄▄▄█▀▄ ▄ ██\n ▄▀▀▄ ▄█▀▀█▄ █\n██▄▄██████▄▄██▄█"], ["sleep_2", " \n█▀▀▀▄▀▀▀█▀▀▄ \n ▀▄▀ ▄▄ █ ▀▄▄▀▄ \n █▀ ▄▀ ▀█ ▀▄\n █▀▀▀▀ █▄▀ ▀▄█\n ▀█▀▀▀▄ █ █ ▀█\n ▄▀▀▄ ▄█▀▀▄█ █\n██▄▄██████▄▄█▀▄█"], ["walk_1", "█▀▀▀▄▀▀▀█▀▀▄ \n ▀▄▀ ▄▄ █ ▀▄▄▀▄ \n █▀▀ ▄▀ ▀█ ▀▄\n █▀▀▀▀ █▄▀ ▀▄█\n ▄▀█▀▀▀▄ █ █ ▀█\n ▄▀█▄▄▄▄▄█▀▄ █ █\n█ ▄▀ ██▀ ▀▄ █ ▀█\n █▄▄▀██▀▄▄▄█▀ ▀"], ["walk_2", "▄▄▄▄ ▄▄▄▄▄▄ \n▀▄ ▄▀ █ ▄▀ ▄ \n █▄▄▀▀ █ ▄█▀ █ \n █▄▄▄▄▀▄ ▄▀ ▄ █\n ▀▄▄▄▄▄▀▀▄ ▄ ██\n █▄▀ ▀▄█ ▀▄ █\n▄▀▄█▀███▀█ ▀▄▀▄█\n██▄▄▀██▀▄▄█▄█ ▀"]]], + ["slayerdramon", [["angry", " █▀▄▄██▄▄▄▀█ ▄▄\n █▄▀ ▄█ ▄█▄▀ █\n █▄▄▄▄▀▀▄▀█ █ █\n█ █▄█▄█▀▄▀▄▀▀█ █\n█▀▀▄▄▄▄▄▀▀█ ▄▀ █\n ▀█ ▄▀▀▄▄▀▀█▄▄ █\n ▄█▀▄▄█▄ ▄▄█▄▀▀\n █▄█▄▄█ █▄█▄█▄█ "], ["attack", " ▄▄ ▄▄ \n █▀▄█▀▀▀█▀█▀▀▄ \n ▀▄▀ ▄▀█▄▄█▄█▄▀█\n ▄▀█▀▀▀ ▄█ █ █\n █▄▄█▀▀█ ▀█▀▀█ █\n█ █▄▀▀▄▄▀█▀▀█ █\n ▀██▀▄▄█▄▄██▀▀▄█\n █▄█▄▄█ █▄█▄█▄█▀"], ["eat_1", " ▄▄ ▄▄ \n █▀▄█▀▀▀█▀█▀▀▄ \n ▀▄▀ ▄▀█▄▄█▄█▄▀█\n ▄▀█▀▀▀ ▄█ █ █\n █▄▄█▀▀█ ▀█▀▀█ █\n█ █▄▀▀▄▄▀█▀▀█ █\n ▀██▀▄▄█▄▄██▀▀▄█\n █▄█▄▄█ █▄█▄█▄█▀"], ["eat_2", " ▄▀█▄▄██▄▄▄▄ \n █▄▀ ▄▄▀ ▄▀ ▄▄\n █▄▄▄█▄▀▀█▄▀▀ █\n▄▀▀████ █▀▀▀▄ █\n█▄▄█▄▄▄▄▀▀▄▄▄█ █\n▀▄ █▄▀▀▄▀▀▄ █ █\n ▄█▀█▄▄█▄▄▀▀██▄█\n█▄█▄▄█ █▄█▄█▄█"], ["happy", "█▀▄▄▄██▄▄▄▀█ \n▀▄▀ ▄▀▄ █ ▄▀ ▄▀█\n▄█▄▄▄▄▄▀▀██▀▀▄ █\n█ █▀▀▀ ▄█▄▀▄▄█ █\n█▀▀██▀▀█ █ █ █\n ▀▄█▄▀▀▄▄▀▀█ █\n ▄█ █▄▄█▄ ▄▄█▄ █\n█▄█▄▄█ █▄█▄█▄█▀"], ["injured_1", " \n ▄▄ ▄▄██▄▄▄▄▄ ▄▄\n █ █▀ ▄▀ █ ▄▀ █\n █▄▄▄██▀█▀▀▀▄ █\n █ ▀▄▄▄▄▀▀▄▄▄█ █\n▄█▀██▄▄█ ▄█▄▄█ █\n█ █▄ █ █ ▀▄▄█▄█\n █▄█▄█▀▀█▄██▄▄█ "], ["injured_2", " \n ▄▄ ▄▄ \n █▀▄█▀▀▀█▀█ ▄▀▄▄\n ▀▄▀ ▄█▄▄▀▀▀█ █\n ▄▀█▀▀▀▀▄▀▄▄▄█ █\n █▄▄█▀▀█ ▄█▄▄█ █\n█ █▄ █▀▀█ ▀▄▄█▄█\n▀█▄█▄█▀▀█▄██▄▄█▀"], ["refuse", " ▄▄ ▄▄ \n ▄▀▄█▀▀▀▀█▀ █ ▄▄\n ▀▄▀ ▄▀█▄▄▀▄▀ █\n ▄▀█▀▀ ▄█▀▀▀▄ █\n ▀▄▄█▀▀█ ▀▄▄▄█ █\n▄▀▄█▄▀▀▄▀▀▄ █ █\n▀▄▄█▀▄▄█▄▄▀███▄█\n █▄█▄▄█ █▄█▄█▄█ "], ["sleep_1", " \n ▄▄ ▄▄██▄▄▄▀█ \n █ █▀ ▄▄ █ ▄▀ \n █▄▄▄▄▄▀ █▄▄▀▀▄\n █ ▀▄▄▄▄▀█ █ █\n▄█▀█▀ ▄██▀▀█▀ █\n█▄▀█▀▀█ ▀ █▀█ █\n█▄▄▄█▄█▄▄▄█▄▀▀▄█"], ["sleep_2", " \n ▄▄ ▄▄██▄▄▄▀█ \n █ █▀ ▄▄ █ ▄▀ \n █▄▄▄▄▄▀ █▄▄▀▀▄\n █ ▀▄▄▄▄▀█ █ █\n▄█▀█▀ ▄██▀▀█▀ █\n█▄▀█▀▀█ ▀ █▀█ █\n█▄▄▄█▄█▄▄▄█▄▀▀▄█"], ["walk_1", " ▄▄ ▄▄██▄▄▄▀█ \n █ █▀ ▄▄▀ ▄▀▀▄▀█\n █▄▄█▄▀▀██▄█ █\n █ ▀▄▄▄▄▀█ █ █\n ▄▀█▀▄▄▀ ▄█▀▀█ █\n▄▀▀██ █▀▄█▀▀█ █\n▀▄█ ▀█▀█ ▀▄█▀▀██\n█▄█▄▄█ ██▄██▄█ "], ["walk_2", " ▄▄ ▄▄ \n █▀▄█▀▀▀█▀█▀▀▄ \n ▀▄▀ ▄▀█▄▄█▄█▄▀█\n ▄▀█▀▀▀ ▄█ █ █\n █▄▄█▀▀█ ▀█▀▀█ █\n█ █▄▀▀▄▄▀█▀▀█ █\n ▀██▀▄▄█▄▄██▀▀▄█\n █▄█▄▄█ █▄█▄█▄█▀"]]], + ["starmon", [["angry", " ▄▀█ \n ▄▀ ▀▄ \n▀█▀▀▀▄ ▄ ▄▀▀▀▀█▀\n ▄▀ ▀███▀ ▀▄ \n █ ▀▄▄▄▄▄ █ █ \n ▀▄▄▀ ▀▄▄▀ \n █ ▄▀▀▄ █ \n ▄█▄▄▄█ █▄▄▄█▄ "], ["attack", " ▄▀▄ ▄▀█ \n █ █▀ ▀▄ \n▀█▀▀▀ ▄█▀▄▀▀▀▀█▀\n ▀▄▄▄▄▄▄ ▄█ \n ▀████ ▄ █ \n ▄▄██▀ ▀▄▄▄▀ \n ▄▀ ▄▄▄▄ ▀▄ \n ▄█▄▄▄█ █▄▄▄█▄ "], ["eat_1", " ▀▄ ▄▀█ ▄ \n ▄▄▄▄▄▀ █ \n ▀▄ ▄▄ ▀▀▀█▀\n █ ▀ ▀ ▄▀ \n ▄▄▀████ ▀▄ \n ▀▄ ▄███▀▄▀ ▄▀ \n █ ▄▄▄▄ ▀█ \n ▄█▄▄█ █▄▄▄█▄ "], ["eat_2", " ▄ ▄▀█ \n ▀ ▄▀ █ ▀ \n █▀▀▀ ▄▄ ▀▀▀█▀\n ▀▄ ▀ ▀ ▄▀ \n ▄█▄▄▄▄ ▀▄ \n ▀▄ █ ▄▀ ▄▀ \n █ ▄▄▄▄ ▀█ \n ▄█▄▄█ █▄▄▄█▄ "], ["happy", " ▀ ▄▀█ ▄ \n ▀ ▄▀ ▀▄ ▀ \n▀█▀▀▀▄█▀█▄▀▀▀▀█▀\n ▀▄▄▄▄▄▄▄▄ ▄▀ \n ▄▀█▀▀█▀▀▀█ ▀▄ \n ▀▄ ▀▄▄▄▄▀▄▀ ▄▀ \n █▀ ▄▄▄▄ ▀█ \n ▄█▄▄▄█ █▄▄▄█▄ "], ["injured_1", " \n ▄▄ \n ▄▀ █ \n▄▄▄▄▄▀ █▄▄▄▄▄\n ▀▄ ▄█▀█▄ ▄▀ \n ▄▀▄ ▀ ▀ ▄▀█ \n █ █ ▄▀▀▄ █ █ \n █▄▄▄▄▄▄▄▄▄▄▄▄█ "], ["injured_2", " \n \n ▀█▀▀▄ \n ▄▄▄▄▀ ▀▄▄▄ \n▄█▄ ▀▄\n ▄▀▄ ▀▄█▄▀ █▀█ \n █ ▀▄ ▄▄▄ █ █ \n █▄▄▄█▄█▄██▄▄▄█ "], ["sleep_1", " \n \n █▀▄ \n ▄▀ ▀▄ \n▀█▀▀▀ ▀▀▀▀█▀\n ▄▀▄ ▄ ▄ ▄ ▄▀▄ \n █ ▀▄▀███▀ █ █ \n █▄▄▄▄▄▄▄▄▄▄▄▄█ "], ["sleep_2", " \n █▀▄ \n ▄▀ ▀▄ \n▀█▀▀▀ ▀▀▀▀█▀\n ▀▄ ▄ ▄ ▄ ▄▀ \n ▄▀█ ▀███▀ █▀▄ \n █ ▀▄ ▄▀ █ \n █▄▄▄▄▄▄▄▄▄▄▄▄█ "], ["walk_1", " ▄▀█ \n ▄▀ ▀▄ \n▀█▀▀▀▄ ▄ ▄▀▀▀▀█▀\n ▀▄ ███▀█ ▄▀ \n █ ▄ ▀▀▀ ▄ █ \n ▀▄▄▀ ▀▄▄▀ \n ▄▀ ▄▀▀▄ ▀▄ \n ▄█▄▄▄█ █▄▄▄█▄ "], ["walk_2", " ▄▄ \n ▄▀ █ \n▄▄▄▄▄▀ █▄▄▄▄▄\n ▀▄ ▄ ▄ ▄ ▄▀ \n ▄▀ ▀███▀ ▀▄ \n ▀▄ ▀▄ ▄▀ ▄▀ \n ▄▀▀ ▀▀▄ \n ▄█▄▄█▀▀█▄▄█▄ "]]], + ["stefilmon", [["angry", " ▄▄▄ ▄▄▄▄ \n▄▄ █ ▄▀▀▀ ▄▀▀▄\n▀▄▀▀▀▀ ▄█ ▀▄ ▀▄\n ▀▄▀▄▀▄ ▄█ ▀▄\n ▀▄▄▄▄▄▄▀▄ █ ▀▄\n ▄█▄ ▄▄█▀▄▄▀\n █▄▄█▀▀▀▀▀▀▄▄▄█ \n█▄█▄▄█▀▀▀█▄█▄█▄█"], ["attack", " ▄▀█▄▀▀▀▄▄ \n █▀▄▄▀▀ ▄ ▄▀ ▄▀\n ▀█▄▄▄ ▀▀ ▄▀ ▄▀\n ▄▄█████ ▄▀▄▄▄▀\n█ ▀▀▄▄▄▄▀ █▄ ▀█\n▀▄▄▄▄█▄▄▄███ ▄▀\n ▄▀ ▄▄▄████ \n █▄█▄█ ██▄█▄█"], ["eat_1", " ▄▀▀█▄▄▀▀▀█▄ \n█▀▄▄█▄▀ ▄ ▄▀ ▄▀\n █ ▄▄▄ ▀ ▀ ▄▀ ▄▀\n ▀█████ ▄▀▄ ▄▀\n▄▀█████▀ ▀▄▀▀▄█\n▀▄▄█▄▄▄▄▄█▀ ▄▄█▀\n ▄█▀ ▄▄ ▄█▄ \n █▄█▄▄█ █▄█▄█▄█ "], ["eat_2", " ▄▄▄ ▄▄▄▄ \n▄▄ █ ▄▀▀▀ ▄▀▀▄\n▀▄▀▀▀▀ ▄▀▄ ▀▄ ▀▄\n ▀▄▀▄▀▄ ▄█ ▀▄\n ▀▄▄▄▄▄▄▀▄ █ ▀▄\n ▄█▄▄ ▄▄▀▀▄▄▀\n █▄▄ █▀▀█ ▄█▄ \n█▄█▄██▀▀▀███▄█▄█"], ["happy", " ▄▀▀█▄▄▀▀▀█▄ \n█▀▄▄█▄▀ ▄ ▄▀ ▄▀\n █ ▄▄▄ ▀ ▀ ▄▀ ▄▀\n ▀█████ ▄▀▄ ▄▀\n▄▀▀▄████ ▀▄▀▀▄█\n▀▄ █▄▄▄▄▄▀▀ ▄█▀\n ▄██▀ ▄▄ ▀▄█▄ \n █▄█▄▄█ █▄█▄█▄█ "], ["injured_1", " \n \n ▄▄▄ ▄▄▄▄ \n▄▄ █ ▄▀▀▀ ▄▀▀▄\n▀▄▀▀▀▀ █▄ ▀▄ ▀▄\n ▀▄▀▄▀▄ ▄█ ▀▄\n █▀▄▄▄▄▄▄▀ ▀█ ▀▄\n ▀▄▄▄█▄▄██▄▄▄██▀"], ["injured_2", " \n \n \n ▄▀▀█▄▄▀▀▀█▄ \n█▀▄▄█▄▀ ▄ ▄▀ ▄▀\n █ ▄ ▄ ▀▀ ▄▀ ▄▀\n ▄█ ▀ ▀ ▄▀▀▄ ▄▀\n ▀▄██████▄▄▄▄█▄█"], ["sleep_1", " \n ▄▄▄ ▄▄▄▄ \n▄▄ █ ▄▀▀▀ ▄▀▀▄\n▀▄▀▀▀▀ ▄▄ ▀▄ ▀▄\n ▀▄▀▄▀▄ ▄█ ▀▄\n ▀▄▄▄▄▄▄▀▄ █ ▀▄\n▄▀█▀▄▄▄▄▄▀█▀▄ ██\n█▄▄▄█▄▄▄█▄▄▄█▄█ "], ["sleep_2", " \n ▄▀▀█▄▄▀▀▀█▄ \n█▀▄▄█▄▀ ▄▀ ▄▀\n █ ▄ ▄ ▀▀ ▄▀ ▄▀\n █ ▀ ▀ ▄▀▀▄ ▄▀\n █▀▀▀▀▀ ▀ ▀▄ █\n▄▀█▀▄▄▄▄▄▀█▀▄ █▀\n█▄▄▄█▄▄▄█▄▄▄█▄█ "], ["walk_1", " ▄▀▀█▄▄▀▀▀█▄ \n█▀▄▄█▄▀ ▄▄ ▄▀ ▄▀\n █ ▄ ▄ ▀▀ ▄▀ ▄▀\n █ ▀ ▀ ▄▀▀▄ ▄▀\n █▀▀▀▀▀ ▀▄█ █\n ▄▀▀█▄▄▄▄██▀ ▀▄▀\n ▀▄█▀ ▄▄ █▄▄▀ \n █▄█▄▄█ █▄█▄█▄█ "], ["walk_2", " ▄▄▄ ▄▄▄▄ \n▄▄ █ ▄▀▀▀ ▄▀▀▄\n▀▄▀▀▀▀ ▄█▀ ▀▄ ▀▄\n ▀▄▀▄▀▄ ▄█ ▀▄\n ▀▄▄▄▄▄▄▀▄ █ ▀▄\n ▄█▄ ▄▄█▀▄ █\n █▄▄█▀▀▀▀▀▀▄▄▄█ \n█▄█▄▄█▀▀▀█▄█▄█▄█"]]], + ["stingmon", [["angry", " ▄▄▄▄█▀▀▄▄▄ \n ▄▀▀ ▄ █▀▄▄▀ \n █ ▀▀ ▄█ \n ▀███ █ ▄█▄ \n ▄█▄▄▄▀▄█▀▀▄▀▄\n █ █▀██▀▀██ ██\n ▀███▄▄██▄██▀ \n █▄█▄▄▀█▄▄█▄█ "], ["attack", " ▄▄▄ \n ▄█▀▀▀▀▄▄▀▀█ \n █ ▄██▀ ▀▄▀▀ \n ▀▄▀▀ ▄▀▀▄ \n ▄▀█▀▀▀▄██▀▄ \n ▄▀█▄█▄▄██▀ █▄█\n █▄█▄██▄▄█▄▄█ ▀\n █▄█▄▄▄█▀█▄▄█▄█ "], ["eat_1", " ▄▄▄ \n ▄█▀▀▀▀▄▄▀▀█ \n █ ▄▀▄ ▀▄▀▀ \n ▀▄ ▄▀▀▄ \n ▄▀█▀▀▀▄██▀▄ \n ▄▀█▄█▄▄██▀ █▄█\n █▄█▄██▄▄█▄▄█ ▀\n █▄█▄▄▄█▀█▄▄█▄█ "], ["eat_2", " ▄▄▄▄█▀▀▄▄▄ \n ▄▀▀▄▄▄ █▀▄▄▀ \n █ ▀▀▀ ▄█ \n ▀███ █ ▄█▄ \n ▄█▄▄▄▀▄██▀▄▀▄\n █ █▀██▀▀█ █▀█\n ███▄▄██▄██▀ \n █▄█▄▄▀█▄▄█▄█ "], ["happy", " ▄▄▄▄█▀▀▄▄▄ \n ▄▀▀ ▄ █▀▄▄▀ \n █ ▀ ▀ ▄█ \n ▀███ █ ▄█▄ \n ▄█▄▄▄▀▄██▀▄▀▄\n █ █▀██▀▀█ █▀█\n ███▄▄██▄██▀ \n █▄█▄▄▀█▄▄█▄█ "], ["injured_1", " \n ▄▄▄ \n ▄█▀▀▀▀▄▄▀▀█ \n █ ▄ ▀▄▀▀ \n ▀▄ ▀▀ ▄▀▀▄▄ \n ▄▀█▀▀▀▄██▄█ \n ▄▀█▄█▄▄██▀ █▄█\n █▄█▄██▄▄██▄▄██▀"], ["injured_2", " \n ▄▄▄▄█▀▀▄▄▄ \n ▄▀▀ █▀▄▄▀ \n █ █▄ ▄█ \n ▀▄▄▄▄█ ▄█▀▄ \n ▄█ █ ▄██▀█▀▄\n █▄█▀██▀▀█ █▀█\n █▄█▄█████▄██▄█ "], ["refuse", " ▄▄▄ \n ▄█▀▀▀▀▄▄▀▀█ \n █ ▄█ ▀▄▀▀ \n ▀▄ ▄▀▀▄ \n ▄▀█▀▀▀▄██▀▄ \n ▄▀█▄█▄▄██▀ █▄█\n █▄█▄██▄▄█▄▄█ ▀\n █▄█▄▄▄█▀█▄▄█▄█ "], ["sleep_1", " \n ▄▄▄▄█▀▀▄▄▄ \n ▄▀▀ █▀▄▄▀ \n █ ▀▀ ▄█▄ \n ▀▄▄▄▄█ ▄█▀▄ \n ▄█ █ ▄██▀█▀▄\n █▄█▄█▄▄██ █▀█\n █▄█▄▄████▄██▄█ "], ["sleep_2", " \n ▄▄▄ \n ▄█▀▀▀▀▄▄▀▀█ \n █ ▄▄ ▀▄▀▀ \n ▀▄ ▄▀▀█▄ \n ▄▀█▀▀▀▄██▄█ \n ▄██▄█ ██▀ █▄█\n █▄█▄▄█████▄▄██▀"], ["walk_1", " ▄▄▄▄█▀▀▄▄▄ \n ▄▀▀▄▄▄ █▀▄▄▀ \n █ ██▀ ▄█ \n ▀▄▄▄▄█ ▄█▄ \n ▄█ █ ▄██▀▄▀▄ \n █ █▀██▀▀█ █▀█ \n ███▄▄██▄██▀ \n █▄█▄▄▀█▄▄█▄█ "], ["walk_2", " ▄▄▄ \n ▄█▀▀▀▀▄▄▀▀█ \n █ ▄██▀ ▀▄▀▀ \n ▀▄▀▀ ▄▀▀▄ \n ▄▀█▀▀▀▄██▀▄ \n ▄▀█▄█▄▄██▀ █▄█\n █▄█▄██▄▄█▄▄█ ▀\n █▄█▄▄▄█▀█▄▄█▄█ "]]], + ["strikedramon", [["angry", " ▄▄▀▀█▀▀ \n ▄▄▀ ▄▀▀▄ \n █▄▄▄▀▀ ▄▀▄ \n ▀▄▄▄▄ █▄▀▀▄ \n █▀▀ █▀▄▄█ \n ▄▀ █▀▀█▀▀ █ \n ▀▄▄████▄▄▄▀ \n █▄██ █▄█▄█ "], ["attack", " ▄▄▄▄▄ \n ▄▀▀▄▄▀ \n ▄▀▀ ▄▄▄▄█ \n █▀▀▀ █▀▄█ \n ▀█▀▀▀▀█ █ \n ▄▀█ ▀▄▄█▀█ \n █▄▄████ █ \n █▄██▀▀▀█████ "], ["eat_1", " ▄▄▄▄▄ \n ▄▀▀▄▄▀ \n ▄▀▀▄▀▄ ▄█ \n █▀▀ █▀▄█ \n ▀█▀▀▀▀█ █ \n ▄▀█ ▀▄▄█▀█ \n █▄▄████ █ \n █▄██▀▀▀█████ "], ["eat_2", " ▄▄▀▀█▀▀ \n ▄▄▀ ▀▀▄ \n █▄▄▄▀▀██▀▄ \n ▀▄▄▄▄ █▄▀▀▄ \n █▀▀ █▀▄▄█ \n ▄▀ █▀▀█▀▀ █ \n ▀▄▄████▄▄▄▀ \n █▄██ █▄█▄█ "], ["happy", " ▄▄▀▀█▀▀ \n ▄▄▀ ▄▀▀▄ \n █▄▄▄▀ ▀▄▀▄ \n ▀▄▄▄▄ █▄▀▀▄ \n █▀▀ █▀▄▄█ \n ▄▀ █▀▀▄▀▀ █ \n ▀▄▄████▄▄▄▀ \n █▄██ █▄█▄█ "], ["injured_1", " \n \n ▄▄▀▀█▀▀ \n ▄▄▀▄ ▀▀▄ \n █▄▄ ▀▀▄█▀▄ \n ▀▄▄▄▄▄█▄▀▀▄ \n ▄▀█▀█ ▀▄▀█▀█ \n █▄▄▄████▄▄▄█ "], ["injured_2", " \n \n ▄▄▄▄▄ \n ▄▀▀▄▄▀ \n ▄▀▀ █▄ ▄█ \n █▀▀ █▀▄▀▄ \n ▄▀█▀█▀▀▄▀█▀█ \n █▄▄▄████▄▄▄█ "], ["refuse", " ▄▄▄▄▄ \n ▄▀▀▄▄▀ \n ▄▀▀ ▄█ ▄█ \n █▀▀▀ █▀▄█ \n ▀█▀▀▀▀█ █ \n ▄▀█ ▀▄▄█▀█ \n █▄▄████ █ \n █▄██▀▀▀█████ "], ["sleep_1", " \n ▄▄▄▄▄ \n ▄▀▀▄▄▀ \n ▄▀▀ ▄▄▄▄█ \n █▀▀▀ █▀▄█ \n ▀█▀▀▀▀█ █ \n ▄▀█▀█ ▀▄▀█▀█ \n █▄▄▄████▄▄▄█ "], ["sleep_2", " \n \n ▄▄▀▀█▀▀ \n ▄▄▀ ▀▀▄ \n █▄▄▄▀▀██▀▄ \n ▀▄▄▄▄▄█▄▀▀▄ \n ▄▀█▀█ ▀▄▀█▀█ \n █▄▄▄████▄▄▄█ "], ["walk_1", " ▄▄▀▀█▀▀ \n ▄▄▀ ▀▀▄ \n █▄▄▄▀▀██▀▄ \n ▀▄▄▄▄▄█▄▀▀▄ \n █▄ ▄ ▀▄▄█ \n ▄▀ █▄▄█▀▀ █ \n ▀▄▄████▄▄▄▀ \n █▄██ █▄█▄█ "], ["walk_2", " ▄▄▄▄▄ \n ▄▀▀▄▄▀ \n ▄▀▀ ▄▄▄▄█ \n █▀▀▀ █▀▄█ \n ▀█▀▀▀▀█ █ \n ▄▀█ ▀▄▄█▀█ \n █▄▄████ █ \n █▄██▀▀▀█████ "]]], + ["submarimon", [["angry", " ▄▄ \n ▄▄▄▄▄▄▄▀ █ \n ▄▀ ▄█▄▀ ▀▄█▄ \n █ ▀▀ ▄ ▄▀ █ █\n █▄▄▄ ▀▀ █ ▀██ \n █▀▀██ ▄▀███▄█\n▄▀ ▄█▀███▄▄▀ ▀▀█\n ▀█▄▄▀ ▀▀▀▀ "], ["attack", " ▄▀█ \n ▄▀▀█▀█▀█ ▄▀ \n ▄▀▄▄▀▀▀ ▄▀█▀▄\n █▄▄▄ ▄█ █ ▄█▄▀\n▄▀▀▀▀▀█ █▄▄█▀▄\n ▀████▄▄▄▀ ██▀▀▀\n ▄▀▀▄▀▀▀▀▀▄ ▀▀▄\n ▀▀▀ ▀▀▀▀"], ["eat_1", " ▄▀█ \n ▄▀▀█▀█▀█ ▄▀ \n ▄▀▀▀▀ ▀ ▄▀█▀▄\n ▄█▀▀▄ ▀▀ █ ▄█▄▀\n▀▄▄▄██ █▄▄█▀▄\n ▀██▄ ▄▄▀ ██▀▀▀\n ▄▀▀ ▄▀▀▀▀▀▄ ▀▀▄\n ▀▀▀ ▀▀▀▀"], ["eat_2", " ▄▄ \n ▄▄▄▄▄▄▄▀ █ \n ▄▀ ▄█▄▀ ▀▄█▄ \n █ ▀▀ ▄ ▄▀ █ █\n █▄▄▄ ▀ ▀█ ▀██ \n █▀▀██ ▄▀███▄█\n▄▀ ▄█▀███▄▄▀▀▄▄ \n ▀█▄▄▀ ▀▄▄▄█"], ["happy", " ▄▀█ \n ▄▀▀█▀█▀█ ▄▀ \n ▄▀▀▀▀ ▀ ▄▀█▀▄\n ▄█▀▀▄ ▄▀▄█ ▄█▄▀\n▀▄▄▄██ █▄▄█▀▄\n ▀██▄ ▄▄▀ ██▀▀▀\n ▄▀▀ ▄▀▀▀▀▀▄ ▀▀▄\n ▀▀▀ ▀▀▀▀"], ["injured_1", " ▄▄ \n ▄▄▄▄▄▄▄▀ █ \n ▄▀ ▄█▄▀ ▀▄█▄ \n █ ▀▀ ▄ ▄▀ █ █\n █▄▄▄ ▀▀ █ ▀██ \n █▀▀██ ▄▀███▄█\n▄▀ ▄█▀███▄▄▀ ▀▀█\n ▀█▄▄▀ ▀▀▀▀ "], ["injured_2", " \n \n ▄▄▄▄▄▄▄▄▀▀█\n ▄▀ ▄█▄▀ ▀▄▄█ \n █ ▀▀ ▄ ▄▀ █ █\n █▄▄▄ ▀▀ █ ▀██ \n▄▀▀▄▄██ ▄▀███▄█\n▀▀█▄▄▄███▄█▄▄▄▄▀"], ["sleep_1", " ▄▄ \n ▄▄▄▄▄▄▄▀ █ \n ▄▀ ▄█▄▀ ▀▄█▄ \n █ ▀▀ ▄▀ █ █\n █▄▄▄ ▀▀ █ ▀██ \n █▀▀██ ▄▀███▄█\n▄▀ ▄█▀███▄▄▀ ▀▀█\n ▀█▄▄▀ ▀▀▀▀ "], ["sleep_2", " ▄▀█ \n ▄▀▀█▀█▀█ ▄▀ \n ▄▀▄▄▀▀▀ ▄▀█▀▄\n █ ▄▄ █ ▄█▄▀\n ████▄ █▄▄█▀▄\n ▄▀ ▄██▄▄▀ ██▀▀▀\n▀▄▄▀▀▄▀▀▀▀▀▄ ▀▀▄\n ▀▀▀ ▀▀▀▀"], ["walk_1", " ▄▀█ \n ▄▀▀█▀█▀█ ▄▀ \n ▄▀▄▄▀▀▀ ▄▀█▀▄\n █ ▄█ █ ▄█▄▀\n ████▄ █▄▄█▀▄\n ▄▀ ▄██▄▄▀ ██▀▀▀\n▀▄▄▀▀▄▀▀▀▀▀▄ ▀▀▄\n ▀▀▀ ▀▀▀▀"], ["walk_2", " ▄▄ \n ▄▄▄▄▄▄▄▀ █ \n ▄▀ ▄█▄▀ ▀▄█▄ \n █ ▀▀ ▄ ▄▀ █ █\n █▄▄▄ ▀▀ █ ▀██ \n █▀▀██ ▄▀███▄█\n▄▀ ▄█▀███▄▄▀▀▄▄ \n ▀█▄▄▀ ▀▄▄▄█"]]], + ["sukamon", [["angry", " ▄▄ \n ▄▀▀ ▄▀ ▄▄ \n ▄▀ ▀█ █ ▄█\n ▄▀ ▀█ █▄▀\n █ █▄▄ ▄▄█ █▀ \n▄▀▀▀▀▄ ▄ ▄ ▄█ \n█ ▄█▀▄▀▀▄▀ █ \n ▀▀█▄█▄▄▄▄▄▄▄▀ "], ["attack", " ▄▄▀▀▀█ \n ▄▀ ▄█ \n▄▀▀▄█ ▄█ ▀▄▄▀▀▄\n▀▄ █ ▄ ▄▄ ▀ ▄▄▀\n ████▄███ ▄▀▄ \n █▀██████ ██ █ \n█▀ ▀█▀██▀ ██ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ "], ["eat_1", " ▄▄▀▀▀█ \n ▄▀ ▄█ \n ▄█ ▄█ ▀▄ \n █ ▄ ▄▄ ▀▄ \n ████▄███ ▄▀▄ \n █▀██████ ██ █ \n█▀ ▀█▀██▀ ██ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ "], ["eat_2", " \n ▄▄▄ \n █▄ ▀▀▄ \n █▀ █ \n █▄▀▄ ▄▀▄█ \n ▄▀ ▀▄ \n█ ▀▄▀▄▄▀▄▄▀▄▀ █ \n ▀▄▄█▄▄█▄▄█▄▄▀ "], ["happy", " ▄▄▀▀▀▄ \n ▄▀ ▄█▀ \n ▄▀▄ ▄▀▄ \n ▄▀▀ ▀ ▀ ▀▀▄ \n ▄██▄█▄ ▄ █▄▀▄ \n▄▀ █████████▄▀▄ \n█ ▀█ ██▀█▀ ▀ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ "], ["injured_1", " \n \n ▄▄▀▀▀▀▄ \n ▄▀ ▀▄▄█ \n ▄▀ ▀▄ \n █ █ █ ▀▄ \n█ ▀▀ ▀▀ █ \n▀▄▄▄▄▄▄▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n ▄▄▄▄ \n ▄▀▀ ▄▄ ▀█ \n ▄▀ ▀█ \n █ ▄ ▄ ▀▄ \n█▄▄▀ ▀▄▄▄ █ \n▀▄▄▄▄▄▄▄▄▄▄▄▄▄▀ "], ["sleep_1", " \n \n ▄▄▄▄ \n █▄ ▀▀▄ \n █▀ ▀▄ \n ▄▀▄▄▄ ▄▄▄▀▄ \n▄▀ ▄ ▄ ▄ ▀▄ \n▀▄▄█▄██▄██▄█▄▄▀ "], ["sleep_2", " \n ▄▄▄ \n █▄ ▀▀▄ \n █▀ █ \n ▄█▄▄ ▄▄█▄ \n █ █ \n█ ▄▀▄▄▀▄▄▀▄ █ \n ▀▄▄█▄▄█▄▄█▄▄▀ "], ["walk_1", " \n ▄▄▀▀▀▄ \n ▄▀ ▄█▀ \n ▄▀ ▀▄ \n █▀█▄ ▄█▀ █ \n █ ▄ ▄ ▄ ▄█ \n█ ▀▄▀▀▄▀▀▄▀▀ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ "], ["walk_2", " \n \n ▄▄▀▀▀▀▄ \n ▄▀ ▀▄▄█ \n ▄█ ▄▄ ▀▄ \n █ ▀▀ ▀▀ ▀▄ \n█▀▄▀▄▄▀▄▄▀▄▄▀ █ \n▀▄▄█▄▄█▄▄█▄▄▄▄▀ "]]], + ["sunarizamon", [["angry", " \n \n ▄▄ \n ▄▄▄ ▀▄▀▄\n▄██▀███ █ ▄ █ █\n██▄▄█▀▀▀ ▀▀▄▄▀ █\n▀▄▄▄▄▄█ ▀▄ ▄▀\n▄█▄▄▄▀██▄▄▄█▄▄▄█"], ["attack", " \n ▄▄ \n ▄▄███▄ ▀▄▀▄\n███▀ ██ █ ▄ █ █\n▀█▀▀▀██▀ ▀▀▄▄▀ █\n ▀▄▄▄▄▀ ▄ ▄▀\n █ ▄▀ █▀ █ \n █▄▄██▄▄▄█▄▄▀ "], ["eat_1", " \n \n ▄▄▄ █▀▄ \n▄██▀▀██ ▄ █ █\n██▄▄███▄▀▄█ █ █\n █ ▀█ ▄ ▀▀ █\n █▀▀█▄▄ █▄ █ \n █▄▄█ █▄▄▄▀▄▄▄▀ "], ["eat_2", " \n \n ▄▄ \n ▄▄▄ ▀▄▀▄\n▄██▀███ █ ▄ █ █\n██▄█▄▀▀▀ ▀▀▄▄▀ █\n▀▄▄▄▄▄█ ▀▄ ▄▀\n▄█▄▄▄▀██▄▄▄█▄▄▄█"], ["happy", " \n \n ▄▄▄ █▀▄ \n▄██▀███ ▄ █ █\n██▄█▄██▄▀▄█ █ █\n █ █▀ ▄ ▀▀ █\n █▀▀▄▄▄ █▄ █ \n █▄▄█ █▄▄▄▀▄▄▄▀ "], ["injured_1", " \n \n ▄▄ \n ▄▄▄ ▀▄▀▄\n▄█▀████ █ ▄ █ █\n██▄▄█▀▀▀ ▀▀▄▄▀ █\n▀▄▄▄▄▄█ ▀▄ ▄▀\n▄█▄▄▄▀██▄▄▄█▄▄▄█"], ["injured_2", " \n \n \n █▀▄ \n ▄▄███▄ ▄ █ █\n██ ▀███▄▀▄█ █ █\n█▀▀▀▀ ▄ ▄ ▀▀▄ █\n▄██████▄▄▄█▄▄▄█▄"], ["sleep_1", " \n \n \n █▀▄ \n ▄▄███▄ ▄ █ █\n██▀▀███▄▀▄█ █ █\n█▀▀▀▀ ▄ ▄ ▀▀▄ █\n▄██████▄▄▄█▄▄▄█▄"], ["sleep_2", " \n \n ▄▄ \n ▄▄▄ ▀▄▀▄\n▄█▀████ █ ▄ █ █\n██▄▄█▀▀▀ ▀▀▄▄▀ █\n▀▄▄▄▄▄█ ▀▄ ▄▀\n▄█▄▄▄▀██▄▄▄█▄▄▄█"], ["walk_1", " \n \n █▀▄ \n ▄▄███▄ █ ▄ █ █\n██▀ ▄██▀ ▀▀▄█ █\n█▀▀▀▀ ▄ ▄ ▄▀ █\n ▀█▀▀██▄ █▄ █ \n █▄▄█ █▄▄▄▀▄▄▄▀ "], ["walk_2", " \n \n ▄▄ \n ▄▄▄ ▀▄▀▄\n▄██▀▀██ █ ▄ █ █\n██▄▄█▀▀▀ ▀▀▄▄▀ █\n▀▄▄▄▄▄█ ▀▄ ▄▀\n▄█▄▄▄▀██▄▄▄█▄▄▄█"]]], + ["sunflowmon", [["angry", " ▄▄ \n ▄▀▀█▄▄█▀▀▄ \n ▄▀▄▀███▀▀▄▀▄ \n ▀▄█▄ ▄ █▄▀ \n █ ▀█▀ ▀▀▄▀ █ \n ██▄█▀▀█▄██▄▄▀█\n▄▀ ▄▄▀▀▀▀▄▄ ▀▄▄▀\n▀▄█▄█▄▄▄▄█▄█▄█ "], ["attack", " ▄▀▀▄██▄▀▀▄ \n ▄▀▄█▄ ▄█▀▄█ \n █ █▄▄▄▄▄ █ █ \n ▄▀██▀▀▀█ █▀▄ \n ▄▀▄█▀▀▀▀▀ █▀█ \n ▀▄ ▀▄███▄▀ ▄▀▀█\n ███ ▄██▄▄▀ \n █▄███▄▄█ "], ["eat_1", " ▄▄▄▀▀▄▄▄ \n █ ▄████▄ █ \n █ █▄▀▀▀▄ █ █ \n ▄▀█ ▀ ▀ ▀█▀▄ \n ▀▄█ ███ █▄▄▀ ▄▄\n ▄▄▀▀▄▄▄█▀▀▄▄█ █\n█▄▄▄█ █▄▄▄█▀ \n █▄▄█▀▀█▄▄█ "], ["eat_2", " ▄▄ \n ▄▀▀█▄▄█▀▀▄ \n ▄▀▄▀███▀▀▄▀▄ \n ▀▄█▀▄ ▄▀▄█▄▀ \n █ ▀▄ ▄ ▄▀ █ \n ██▄█▀▀█▄██▄▄▀█\n▄▀▄▄▄▀▀▀▀▄▄▄▀▄▄▀\n▀█▄▄█▄▄▄▄█▄▄██ "], ["happy", " ▄▄▄▀▀▄▄▄ \n █ ▄████▄ █ \n █ █▄▀▀▀▄ █ █ \n ▄▀█ ▀ ▀ ▀█▀▄ \n▄██▄▀███▀▄█▄█ \n▀▄▄▀▀▄▄▄█▀▀▄▄█▄ \n ██ ██▀ ▄▀ \n █▄▄█▀▀█▄▄█▀ "], ["injured_1", " \n ▄▄▄▀▀▄▄▄ \n █ ▄████▄ █ \n █ █ ▀▀▀ █ █ \n ▄▀█▄█ █▄ █▀▄ \n ▀▄▄▀▄▄▄▄▀▄▄█▀▀█\n ▄█▀█▀▄▄▀██▀█▄▀ \n █▄██▄▄▄▄█▄█▄█ "], ["injured_2", " \n ▄▄ \n ▄▀▀█▄▄█▀▀▄ \n ▄▀▄▀███▀▀▄▀▄ \n ▀▄█ ▄ ▄ █▄▀ \n █ ▀█▀ ▀▀▄▀ █ \n ▄██▄█▀▀█▄████▀█\n█▄▄██▄██▄██▄▄█▀ "], ["sleep_1", " \n ▄▄▄▀▀▄▄▄ \n █ ▄████▄ █ \n █ █ ▀▀▀ █ █ \n ▄▀█▀▀ ▀▀▀█▀▄ \n ▀▄▄▀▄▄▄▄▀▄▄▀▄▀█\n ▄█▀█▀▄▄▀██▀█▄▄▀\n █▄██▄▄▄▄█▄█▄█ "], ["sleep_2", " ▄▄ \n ▄▀▀█▄▄█▀▀▄ \n ▄▀▄▀███▀▀▄▀▄ \n ▀▄█▄▄ ▄▄▄█▄▀ \n █ ▀▄ ▄▀ █ \n ██▄█▀▀█▄██▄▄▀█\n ▄█ ▄▀▀▀▀▄▄▀▄▄▄▀\n █▄██▄▄▄▄█▄█▄█ "], ["walk_1", " ▄▄▄▀▀▄▄▄ \n █ ▄████▄ █ \n █ █▄▀▀▀▄ █ █ \n ▄▀█ ▄▄▄ █▀▄ \n ▀▄▄▀▄▄▄▄▀▄▄▀ ▄▄\n ▄▀▀█▄▄█▀▀▄▄▀ █\n █ ▄█ █▄ █▄▀ \n ▀█▄▄█▀▀█▄███ "], ["walk_2", " ▄▄ \n ▄▀▀█▄▄█▀▀▄ \n ▄▀▄▀███▀▀▄▀▄ \n ▀▄█▀ ▀ █▄▀ \n █ ▀▄▀▀▀ ▄▀ █ \n ██▄█▀▀█▄██▄▄▀█\n▄▀▄▄▄▀▀▀▀▄▄▄▀▄▄▀\n▀█▄▄█▄▄▄▄█▄▄██ "]]], + ["sunmon", [["angry", " ▄▄▄▄ \n ▄▀ ▄█▄▀ \n ▀▄ ▄▀ \n █▀▄▀▀▀▀▀▄▀█ \n ▄██▄ ▄█ █▄ \n ▀▄█ ▄▄ █▄▀ \n █▀▄▄▄▄▄▀█ \n ▀▀ ▀▄▀ ▀▀ "], ["attack", " ▄ ▄▀▀▀▀▄ ▄▄▄ \n █ ▄ ▀▄▀ \n ▀ ▄▄ █▄▄▄█▀▄▄ ▀\n ▀▄█ ▄▀▄▀ \n ▄▀█▀▀ ▀▀ █▀▄ \n ▀█ ███▄ █▀ \n ▄▀█▄▄▄▄▄█▀▄ \n ▀▀ ▀▄▀ ▀▀ "], ["eat_1", " ▄▀▄ \n ▀▄ █ \n ▄▄ ▄█▄█▄ ▄▄ \n ▀▄▀▄ ▄ ▀▄▀ \n ▄▀█ ▀▄▄▀ █▀▄ \n ▀█▄ ██ ▄█▀ \n █▄▀█▀█▀▄█ \n ▀ "], ["eat_2", " ▄▄▀ \n ▄▀ ▄▀ \n ▀▄ ▄▀ \n █▀▄▀▀▀▀▀▄▀█ \n ▄█▀▄ ▄▀▄█▄ \n ▀▄█ ▄▄▄▄ █▄▀ \n █▀▄▄▄▄▄▀█ \n ▀▀ ▀▄▀ ▀▀ "], ["happy", " ▄▀▀▀▄▀▀▄▀▀ \n ▀▄ ▄▄▀ ▀ \n ▄▄ ▄█▄█▄ ▄▄ \n ▀▄▀▄ ▄▀█▄▀ \n ▄▀█ ▄▄▄▄ █▀▄ \n ▀█▄ ▀▀ ▄█▀ \n █▄▀█▀█▀▄█ \n ▀ "], ["injured_1", " \n \n ▄▀██▀ \n ▄███▄ \n ▄▀█▀ ▀█▀▄ \n ▀▀█▄█ █▄ █▀▀ \n ▄▀█▄ ▄█▀▄ \n ▀▀█▄▀███▀▄█▀▀ "], ["injured_2", " \n \n \n ▄██▀ ▄ \n ▄▄▄▀▀▀▀▀▄▄▄ \n █▄█ ▄ ▄ █▄█ \n ▄█▀▀ ▀▀ █▄ \n █▄██▄▄▄▄▄██▄█ "], ["sleep_1", " \n ▄█ \n █ █ \n ▄▄ ▄█▄█▄ ▄▄ \n ▀▄▀ ▀▄▀ \n ▄▀█▀▀ ▀▀ █▀▄ \n ▀█▄ ▀▀ ▄█▀ \n █▄▀███▀▄█ "], ["sleep_2", " ▀ \n ▄▀▄ \n █ █ \n ▄▄ ▄█▄█▄ ▄▄ \n ▀▄▀ ▀▄▀ \n ▄▀█▀▀ ▀▀ █▀▄ \n ▀█▄ ▀▀ ▄█▀ \n █▄▀███▀▄█ "], ["walk_1", " ▄▀▄ \n █ ▄▀ \n ▄▄ ▄█▄█▄ ▄▄ \n ▀▄▀▄ ▄ ▀▄▀ \n ▄▀█ ▀ ▀ █▀▄ \n ▀█▄ ▀▀ ▄█▀ \n █▄▀█▀█▀▄█ \n ▀ "], ["walk_2", " ▄▄▄ ▄ \n ▄▀ ▀▄ \n ▄▀▄▀ \n █▀▄▀▀▀▀▀▄▀█ \n ▄█ █ █ █▄ \n ▀▄█ ▄▄ █▄▀ \n █▀▄▄▄▄▄▀█ \n ▀▀ ▀▄▀ ▀▀ "]]], + ["superstarmon", [["angry", " ▄▀█ ▄▀█ \n ▄▀ ▀█▄▀▄ \n▀█▀▀█▄ ▄█▀▀▀█▀\n ▄▀ ▀██▀██▀ ▀▄ \n █ ▀▄ ▄▄▄▄ █ █ \n ▀▄▄▀ ▀▄▄▀ \n █ ▄▀▀▄ █ \n ▄█▄▄▄█ █▄▄▄█▄ "], ["attack", " ▄▀▄ ▄▀█▄▀▀▀█ \n █ █▀ ▀▄▀▀█ \n▄▄█▄█ ▄█ ▀▀▀█▀\n ▀▄ ███▀ ▄▀ █\n ▀▀▄▄▄▄ ▄▀ █\n ▄███▀ ▀▄▀▀▀ \n ▄▀ ▄▄▄▄ ▀▄ \n ▄█▄▄▄█ █▄▄▄█▄ "], ["eat_1", " ▀▄ ▄▀█ ▄ \n ▄▄▄▄▄▀ █ \n ▀▄ ▄▄ ▀▀▀█▀\n █ ███▀ ▄▀▄ \n ▄▄▀▄▄▄▄ ▀▄▀\n ▀▄ ▄███▀▄▀ ▄▀ \n █ ▄▄▄▄ ▀█ \n ▄█▄▄█ █▄▄▄█▄ "], ["eat_2", " ▄ ▄▀█ \n ▀ ▄▀ █ ▀ \n █▀▀▀ ▄▄ ▀▀▀█▀\n ▀▄▀███▀ ▄▀▄ \n ▄█▄▄▄▄▀ ▀▄▀\n ▀▄ █ ▄▀ ▄▀ \n █ ▄▄▄▄ ▀█ \n ▄█▄▄█ █▄▄▄█▄ "], ["happy", " ▀ ▄▀█ ▄ \n ▀▄▄▀ █▄ ▀ \n▀█▀▀▀██▀██▀▀▀▀█▀\n ▀▄▄▄▄▄▄▄▄ ▄▀ \n ▄▀█▀▀█▀▀▀█ ▀▄ \n ▀▄ ▀▄▄▄▄▀▄▀ ▄▀ \n █▀ ▄▄▄▄ ▀█ \n ▄█▄▄▄█ █▄▄▄█▄ "], ["injured_1", " \n ▄▄ \n ▄▀ █ ▄▀▀▄ \n▄▄▄▄▄▀ █▄██▄█\n ▀▄ ██▄▄▄██ ▄▀ \n ▄▀▄ ▀▀ ▀▀ ▄▀█ \n █ █ ▄▀▀▄ █ █ \n █▄▄▄▄▄▄▄▄▄▄▄▄█ "], ["injured_2", " \n \n ▀█▀▀▄ ▄▀▀▄ \n ▄▄▄▄▀ ▀▄██▄▀\n▄█▄ ▄▄ ▄▄ ▀▄\n ▄▀▄▀██▀██▀ █▀█ \n █ ▀▄ ▄▄▄ █ █ \n █▄▄▄█▄█▄██▄▄▄█ "], ["sleep_1", " \n \n █▀▄ ▄▀█ \n ▄▀ ▀▄█▄▀▄ \n▀█▀▀▀ ▀▀▀▀█▀\n ▄▀▄▄▄ ▄▄ ▄▀▄ \n █ ▀██▀██▀█ █ \n █▄▄▄▄▄▄▄▄▄▄▄▄█ "], ["sleep_2", " \n █▀▄ ▄▄ \n ▄▀ ▀▄▄▀▄▀▄ \n▀█▀▀▀ ▀▀▀▀█▀\n ▀▄▄▄ ▄▄ ▄▀ \n ▄▀█▀██▀██▀ █▀▄ \n █ ▀▄ ▄▀ █ \n █▄▄▄▄▄▄▄▄▄▄▄▄█ "], ["walk_1", " ▄▀█ ▄▀█ \n ▄▀ ▀█▄▀▄ \n▀█▀▀█▄ ▄█▀▀▀█▀\n ▀▄▀██▀██▀ ▄▀ \n █ ▄ ▄▄ ▄ █ \n ▀▄▄▀ ▀▄▄▀ \n ▄▀ ▄▀▀▄ ▀▄ \n ▄█▄▄▄█ █▄▄▄█▄ "], ["walk_2", " ▄▄ ▄▄ \n ▄▀ █▄▀▄▀ \n▄▄▄▄▄▀ ██▄█▄▄\n ▀▄ ██▄▄▄██ ▄▀ \n ▄▀ ▀▀ ▀▀ ▀▄ \n ▀▄ ▀▄▀▀▄▀ ▄▀ \n ▄▀▀ ▀▀▄ \n ▄█▄▄█▀▀█▄▄█▄ "]]], + ["susanomon", [["angry", " ▄▄▄▄ ▄▄▄▄ \n ▀▄ █▄█ ▄█ \n █▀███▀██ ▄ \n █ █▄▄█▄▄██▄█▀█\n █▄▀▀▄▄▄▄█▀▄▄ ▀█\n ▀█▀█▄▄▄▄██▀ █▀ \n █▄█ ▄ ▄██▄▄▀ \n █▄█▄█▀▀▀█▄█▄█ "], ["attack", " █▀▀█ █▀▀█ \n ▀▀▄█▀█▄██▄ ▄ \n ▄▀▀█▀▀▀ ▄██▄█▀▄\n █ ██▀▀▀█▀▄▄ ▀█\n ██ █▀▀▀▀█ ▀█▀\n ▀▀█▀▀▀▀▀▀█▀▀ \n ██▄█▄███▄ \n █▄███ █▄█▄█ "], ["eat_1", " █▀▀█ █▀▀█ \n ▀▄█▀█▄██▄ \n ▄ █▀▀▀ ▄██ ▄█ \n ▄▀▄████▀██▀▀▀▄█\n ██▄█▀▀▀▄█▄█▀▄▄█\n █ █▀▀▀▀██ █ \n ██▄█▄█▀▀█▀ \n █▄█▄█ █▄█▄█ "], ["eat_2", " ▄▄▄▄ ▄▄▄▄ \n ▀▄ █▄█ ▄█ \n ██▄█▀▀██ ▄ \n █ █▄▄▄▄███▄█▀█\n █▄▀▀▄▄▄██▀▄▄ ▀█\n ▀█▀█▄▄▄▄██▀ █▀ \n ▄█▄█ ▄ ██▄▄█ \n█▄█▄█▀▀▀▀▀█▄█▄█ "], ["happy", " █▀▀█ █▀▀█ \n ▀▄███▄██▄ \n ▄ █▀▀▄▄▀██ ▄█ \n ▄▀▄████▀██▀▀▀▄█\n ██▄█▀▀▀▄█▄█▀▄▄█\n █ █▀▀▀▀██ █ \n ██▄█▄█▀▀█▀ \n █▄█▄█ █▄█▄█ "], ["injured_1", " \n █▀▀█ █▀▀█ \n ▀▄███▄██▄ \n ▄ █▀ █ ▀██ ▄█▄\n ▄▀▄█▀▀▀▀██▀▀▀▄█\n ██▄▄▀▀▀▀█▄█▀▄▄▀\n ▄█▄█▀▀▀▀██ █ \n█▄█▄█▄█▄▄██▄█▄█ "], ["injured_2", " \n ▄▄▄▄ ▄▄▄▄ \n ▀▄ █▄█ ▄█ \n ██▀█▀███ ▄ \n █ █▄▄█▄▄██▄█▀█\n █▄▀▀▄▄▄▄█▀▄▄ ▀█\n ████▄▄▄▄██▀ █▀ \n█▄█▄█▄█▄▄██▄▄█▄ "], ["sleep_1", " \n ▄▄▄▄ ▄▄▄▄ \n ▀▄ █▄█ ▄█ \n ██▄█████ ▄ \n █ █▄▄▄▄███▄█▀█\n █▄▀▀▄▄▄██▀▄▄ ▀█\n ████▄▄▄▄██▀ █▀ \n█▄█▄█▄█▄▄██▄▄█▄ "], ["sleep_2", " \n █▀▀█ █▀▀█ \n ▀▄█▀█▄██▄ \n ▄ █▀▀▀▀███ ▄█▄\n ▄▀▄█▀▀▀███▀▀▀▄█\n ██▄▄▀▀▀▀█▄█▀▄▄▀\n ▄█▄█▀▀▀▀██ █ \n█▄█▄█▄█▄▄██▄█▄█ "], ["walk_1", " █▀▀█ █▀▀█ \n ▀▄█▀█▄██▄ \n ▄ █▀▀▀ ▄██ ▄█ \n ▄▀▄█▀▀▀███▀▀▀▄█\n ██▄▄▀▀▀▀█▄█▀▄▄█\n █ █▀▀▀▀██ █ \n ██▄█▄█▀▀█▀ \n █▄█▄█ █▄█▄█ "], ["walk_2", " ▄▄▄▄ ▄▄▄▄ \n ▀▄ █▄█ ▄█ \n ██▄█▀▀██ ▄ \n █ █▄▄▄▄███▄█▀█\n █▄▀▀▄▄▄██▀▄▄ ▀█\n ▀█▀█▄▄▄▄██▀ █▀ \n █▄█ ▄ ▄██▄▄▀ \n █▄█▄█▀▀▀█▄█▄█ "]]], + ["swimmon", [["angry", " ▄▄▄▄ \n ▄▀▀ ▄█▄▄▄▀▀▄ \n █ ▀▀▄ ▄█\n▄▀▀▄ ▄█ ▀█▄ \n█▀▀█ █▄ ▀█▄ █\n ▀█▄ ▄██ ▀▄▄ █ \n ▄███▄█▀█▄ ▀█▀ \n ██▀▀ ▀█▄▄▀ "], ["attack", " ▄▀▀█▀ ▄▄ \n ▄▀ ▄▀▀██▀ ▀▄ \n ▄█ ▄▄ ▀▄▄█▄▄\n█▄▄█ ▀▀ ▄▄█▀ ▄▀\n████ █▀ ▄▄▀▄ \n ▀▄█▄ ▄████▄▄▀█ \n ▀▀█▄▄█▀▀▀██ █\n ██▄▀ "], ["eat_1", " ▄▄▄▄ \n ▄▀▀ ▄█▄▄▄▀▀▄ \n ▄█ ▄ ▀▀▄ ▄█\n█▄▄█ ▀ ▀▄ ▀█▄ \n▀███▄ ██ ▀█▄ █\n ▀▄▄▀ ▄██ ▀▄▄ █ \n ▄███▄█▀█▄ ▀█▀ \n ██▀▀ ▀█▄▄▀ "], ["eat_2", " ▄▄▄▄ \n ▄▀▀ ▄█▄▄▄▀▀▄ \n ▄█ ▄ ▀▀▄ ▄█\n█▄▄█ ▀ ▀▄ ▀█▄ \n▀▄▄▀ ██ ▀█▄ █\n █▄ ▄██ ▀▄▄ █ \n ▄███▄█▀█▄ ▀█▀ \n ██▀▀ ▀█▄▄▀ "], ["happy", " ▄▀▀█▀ ▄▄ \n ▄▀ ▄▀▀██▀ ▀▄ \n ▄█ ▄ ▀▄▄█▄▄\n█▄▄█ ▀ ▀▄▄█▀ ▄▀\n ████ █▀ ▄▄▀▄ \n ▀▄▄█ ▄████▄▄▀█ \n ▀▀█▄▄█▀▀▀██ █\n ██▄▀ "], ["injured_1", " \n ▄▄▄▄ \n ▄▀▀ ▄█▄▄▄▀▀▄ \n ▄█ ▀▀▄ ▄█\n█▄▄█ █▄ ▄ ▀█▄ \n▀▄▄▀ ██ ▀█▄ █\n ▄█▄ ▄█ ▀▄▄ ▀▄\n██████████▄▄▄███"], ["injured_2", " \n \n ▄▄▀▀█▀ ▄▄ \n ▄▀ ▀▀██▀ ▀▄\n ▄█ ▄ ▀▄▄▀▀\n█▄▄█ ▀▀ █▄ ▄▄▀▀▄\n▀▄▄▀ ▄█▀▄ ▀█▄▀\n████▄▄████▄█▄▄██"], ["sleep_1", " \n ▄▄▄▄ \n ▄▀▀ ▄█▄▄▄▀▀▄ \n ▄█ ▀▀▄ ▄█\n█▄▄█ ▀▀ ▄ ▀█▄ \n▀▄▄▀ ██ ▀█▄ █\n ▄█▄ ▄██ ▀▀▄▄█ \n██████▄███▄▄▄▄▄█"], ["sleep_2", " \n ▄▄▀▀█▀ ▄▄ \n ▄▀ ▀▀██▀ ▀▄\n▄▀▀▄ ▄▄ ▀▄▄▀▀\n█▀▀█ █▄ ▄▄▀▀▄\n ▀█ ▄█▀▄ ▀▀▄▀\n ▄███▄▀██▄ ▀▀▄▀ \n████▀▀▀▀ ▀▀▄▄▄█ "], ["walk_1", " ▄▄▀▀█▀ ▄▄ \n ▄▀ ▀▀██▀ ▀▄\n▄▀▀▄ █ ▀▄▄▀▀\n█▀▀█ █▄ ▄▄▀▀▄\n ▀█ ▄█▀▄ ▀█▄█\n ▀█▄▄▀██▄ █▄█▀▀\n ███▀▀ ▀▄ █ \n ██ ▀▄█ "], ["walk_2", " ▄▄▄▄ \n ▄▀▀ ▄█▄▄▄▀▀▄ \n ▄█ ▄ ▀▀▄ ▄█\n█▄▄█ ▀ ▄ ▀█▄ \n▀▄▄▀ ██ ▀█▄ █\n █▄ ▄██ ▀▄▄ █ \n ▄███▄█▀█▄ ▀█▀ \n ██▀▀ ▀█▄▄▀ "]]], + ["syakomon", [["angry", " ▄▄▄▄▄▄▄ \n▄▀▀▄ ▄ ▄ ▀▄ \n▀▀█▀████▀█▄ ▀▄ \n █▄▄██▄▄███ █ \n █▀ ▀ ▀ ▀ ▀█▄▀█ \n █ ▄ ▄ ▄ ▄ █▀▀▄ \n█▀▀█▀▀█▀▀█▀▀ █▀ \n ▀▄▄▄▄▄▄▄▄▄▄▀ "], ["attack", " \n \n ▄▄▄▄▄▄▄ \n▄▀▀▄ ▄ ▄ ▀▄ \n▀▀▀▀██████▄ █ \n ▄██▀██▀███ █▄ \n█▀█▀▀█▀▀█▀▀▀▀ █ \n ▀▄█▄▄█▄▄█▄▄▀▀ "], ["eat_1", " \n \n ▄▄▄▄▄▄▄ \n▄▀▀▄ ▄ ▄ ▀▄ \n▀▀▀█▀██▀██▄ █ \n █▀▀▀▀▀████ █▄ \n█▀█▀▀█▀▀█▀▀▀▀ █ \n ▀▄█▄▄█▄▄█▄▄▀▀ "], ["eat_2", " \n ▄▄▀▀▀▀▀▀▀▄ \n█▄▄█▄█▄█▄▄ ▀▄ \n ▄█▄███▄███▄ █ \n ▀▀▄ ▀███ █▄ \n ▄▀ ████▄▀ \n█▀█▀▀█▀▀█▀▀▀ ▄█ \n ▀▄█▄▄█▄▄█▄▄▀ "], ["happy", " ▀ \n▀ ▄▄▀▀▀▀▀▀▀▄ \n █▄▄█▄█▄█▄▄ ▀▄ \n▄ ▄█▄██▄███▄ █ \n ▄ █ ▀▀▀▀ ███ █▄\n ▀▄ ▄████▄▀\n █▀█▀▀█▀▀█▀▀▀ ▄█\n ▀▄█▄▄█▄▄█▄▄▀ "], ["injured_1", " \n \n ▄▄▄▄▄▄▄▄ \n▄▀▀▄ ▄ ▄ ▀▄ \n▀▀▀█▀███▀█▄ ▀▄ \n █▄█▀▀▀█▄██▄█▄ \n█▀█▀▀█▀▀█▀▀▀▀ █ \n ▀▄█▄▄█▄▄█▄▄▀▀ "], ["injured_2", " \n \n \n ▄▄▄▄▄▄▄▄ \n ▄▀ ▄ ▄ ▀▄ \n█ ▄█ ▄█ ▄█ █▄ \n▀█ ▀█ █▀ ▀ █ \n ▀▄▄▄█▄▄█▄▄▀▀ "], ["refuse", " \n ▄▄▀▀▀▀▀▀▀▄ \n█▄▄█▄█▄█▄▄ ▀▄ \n ▄▀████▀█▄▀▄ \n▄▄██▄▄██▄▄██▄▀█ \n▀▄▀▄ ▀▄ ▀▄ ▄▄▀ \n ▀▀▀▀▀▀▀▀▀▀ \n ▄▄▄▄▄▄▄▄▄▄ "], ["sleep_1", " ▄ \n▄ \n \n▀ ▄▄▄▄▄▄▄▄ \n▄▀▀▄ ▄ ▄ ▀▄ \n▀▀█▀▀██▀▀██▄ █▄ \n▄▀█▀▀█▀▀█▀▀▀▀ █ \n ▀▄█▄▄█▄▄█▄▄▀▀ "], ["sleep_2", " \n \n ▄▄▄▄▄▄▄ \n▄▀▀▄ ▄ ▄ ▀▄ \n▀▀▀█▀▀█▀▀█▄ █ \n ████▀█████ █▄ \n█▀█▀▀█▀▀█▀▀▀▀ █ \n ▀▄█▄▄█▄▄█▄▄▀▀ "], ["walk_1", " \n \n ▄▄▄▄▄▄▄ \n▄▀▀▄ ▄ ▄ ▀▄ \n▀▀▀▀██████▄ █ \n ▄██▀██▀███ █▄ \n█▀█▀▀█▀▀█▀▀▀▀ █ \n ▀▄█▄▄█▄▄█▄▄▀▀ "], ["walk_2", " ▀ \n▄ \n \n▀ ▄▄▄▄▄▄▄▄ \n ▄▀▄ ▄ ▄ ▀▄ \n█▄█▀███▀█▄▄▄ █▄ \n▄▀█▀▀█▀▀█▀▀▀▀ █ \n ▀▄█▄▄█▄▄█▄▄▀▀ "]]], + ["syakomon_x", [["angry", " \n ▄▀██▀█▀▀█▄ \n ▄▀ ▀▀▀▀ ▄▀ ▄█ \n ▀▀█▀███▀█▄▀ █ \n █▄▄█▄▄██▄▄▄█ \n ██▀ ▀▄▄ ▄█ \n █▀█▀▀█▀▀▀▀█▀█ \n ▀▄█▄▄█▄▄▄▄▀ "], ["attack", " \n \n ▄▀██▀█▀▀▄▄ \n ▄▀ ▀▀▀▀ ▄▀ ▄█ \n ▀▀███████▄▀ █ \n ██▄██▄█▀▀▀▀▀█ \n █▀█▀▀█▀▀▀▀▄▄▀█ \n ▀▄█▄▄█▄▄▄▄▄▀ "], ["eat_1", " \n \n ▄▀██▀█▀▀█▄ \n ▄▀ ▀▀▀▀ ▄▀ ▄█ \n ▀▀███████▄▀ █ \n █▀▄▀█▀▄▀█▀▀▀█ \n █▀█▀▀█▀▀▀▀▄▄▀█ \n ▀▄█▄▄█▄▄▄▄▄▀ "], ["eat_2", " \n ▄▀██▀█▀▀█▄ \n ▄▀ ▀▀▀▀ ▄▀ ▄█ \n ▀▀███████▄▀ █ \n ▄█▄██▄███ █ \n ██ ██▀▀▀▀█ \n █▀█▀▀█▀▀▀▀▄▄▀█ \n ▀▄█▄▄█▄▄▄▄▄▀ "], ["happy", " \n ▄▀██▀█▀▀█▄ \n ▄▀ ▀▀▀▀ ▄▀ ▄█ \n ▀▀█▀███▀█▄▀ █ \n █▄█▄█▄█▄█ █ \n █▄ ▄▀▀▀▀▀█ \n █▀█▀▀█▀▀▀▀▄▄▀█ \n ▀▄█▄▄█▄▄▄▄▄▀ "], ["injured_1", " \n \n ▄▄▄▄▄▄▄▄ \n ▄▀▄██▄▀ ▄▀▀▄ \n █▄▄▄▄▄▄▄█ ▄▀▀▄ \n ▄▀ ██ ▀█▀▀▀▀█ \n █▀█▀▀█▀▀▀▀▄▄▀█ \n ▀▄█▄▄█▄▄▄▄▄▀ "], ["injured_2", " \n \n \n ▄▄▄▄▄▄▄▄ \n ▄▀▄██▄▀ ▄▀▀▄ \n █ ▄▄▄▄▄▄█▄▄▀▀█ \n █▀█▀▀█▀▀▀▀▄▄▀█ \n ▀▄█▄▄█▄▄▄▄▄▀ "], ["refuse", " \n \n ▄▀██▀█▀▀█▄ \n ▄▀ ▀▀▀▀ ▄▀ ▄█ \n ▀▀█▀███▀█▄▀ █ \n ██▄▄█▄▄▀▀▀▀▀█ \n █▀█▀▀█▀▀▀▀▄▄▀█ \n ▀▄▄▄▄█▄▄▄▄▄▀ "], ["sleep_1", " \n \n ▄▀██▀█▀▀█▄ \n ▄▀ ▀▀▀▀ ▄▀ ▄█ \n ▀▀███████▄▀ █ \n █▀▀▀█▀▀▀█▀▀▀█ \n █▀█▀▀█▀▀▀▀▄▄▀█ \n ▀▄█▄▄█▄▄▄▄▄▀ "], ["sleep_2", " \n \n ▄▄▄▄▄▄▄▄ \n ▄▀▄██▄▀ ▄▀▀▄ \n █▄▄▄▄▄▄▄█ ▄▀▀▄ \n ▄▀▀▀█▀▀▀█▀▀▀█ \n █▀█▀▀█▀▀▀▀▄▄▀█ \n ▀▄█▄▄█▄▄▄▄▄▀ "], ["walk_1", " \n \n ▄▀██▀█▀▀▄▄ \n ▄▀ ▀▀▀▀ ▄▀ ▄█ \n ▀▀███████▄▀ █ \n ██▄██▄█▀▀▀▀▀█ \n █▀█▀▀█▀▀▀▀▄▄▀█ \n ▀▄█▄▄█▄▄▄▄▄▀ "], ["walk_2", " \n \n ▄▄▄▄▄▄▄▄ \n ▄▀▄██▄▀ ▄▀█▄ \n █▄▄▄▄▄▄▄█▄▄▀▀▄ \n ██▀██▀██▀▀▀▀█ \n █▀█▀▀█▀▀▀▀▄▄▀█ \n ▀▄█▄▄█▄▄▄▄▄▀ "]]], + ["tanemon", [["angry", " \n ▄ ▄▄ ▄▄ ▄ \n ██████▀██████ \n ▀▀ █ █ ▀▀ \n ▄▀▀▄▄▄▀▀▄ \n █ ▄ █ \n █▄▄ ▀▀ █ \n █▄█▄▄█▄▄▄▄▄▄█ "], ["attack", " ▄███▄▄▄▄▄███▄ \n ███▀▀▀█ █▀▀▀███\n ▀ ▄▀▀▀▀▀▀▀▄ ▀\n █ ▄█ █ \n ▀▄▀█▀█▀▄ █ \n ███████ █ \n ▄▀ ▀ ▀ ▀ ▄█▀ \n █▄▄▄█▀▀▄▄▄▄▄█ "], ["eat_1", " ▄███▄▄▄▄▄███▄ \n ███▀▀▀█ █▀▀▀███\n ▀ ▄▀▀▀▀▀▀▀▄ ▀\n █ █ █ █ \n █ ▄▄▄▄▄▄▄▄ █ \n █ ███▀▀▀██ █ \n █▄▀▀▀▀▀▀ ▄█▀ \n █▄▄██▀▀█▄▄▄▄█ "], ["eat_2", " \n █▄▄██▄▄▄██▄▄█ \n ▀██▀▀█ █▀▀██▀ \n ▄▄▀ ▀▄▄ \n ▄▀ ▀▀▀ ▀▄ \n █ █ █ █ \n █▄ ▀▀ ▄█ \n █▄▄██▀▀█▄▄▄▄█ "], ["happy", " ▄███▄▄▄▄▄███▄ \n ███▀▀▀█ █▀▀▀███\n ▀ ▄▀▀▀▀▀▀▀▄ ▀\n █ ▀▀ ▀▀ █ \n █ █▄▄▄▄▄▄█ █ \n █ ███▀▀▀██ █ \n █▄▀▀▀▀▀▀ ▄█▀ \n █▄▄██▀▀█▄▄▄▄█ "], ["injured_1", " \n ▄ ▄▄ ▄▄ ▄ \n ██████▀██████ \n ▀▀ █ █ ▀▀ \n ▄▀▀▄▄▄▀▀▄ \n █ ▄ ▄ █ \n █ ▀ ▄ ▀ █ \n █▄▄█▄▄▄▄█▄▄▄█ "], ["injured_2", " \n \n ▄███▄▄▄▄▄███▄ \n ███▀▀▀█ █▀▀▀███\n ▀ ▄▀▀▄▄▄▀▀▄ ▀\n █ ▄ ▄ █ \n █ ▀▀ ▀▀ █ \n █▄▄█▄▄▄▄█▄▄▄█ "], ["sleep_1", " \n \n ▄███▄▄▄▄▄███▄ \n ███▀▀▀█ █▀▀▀███\n ▀ ▄▀▀▄▄▄▀▀▄ ▀\n █ ▄▄ ▄▄ █ \n █ ▄ █ \n █▄▄█▄▄▄▄█▄▄▄█ "], ["sleep_2", " \n \n █▄▄██▄▄▄██▄▄█ \n ▀██▀▀█ █▀▀██▀ \n ▄▄▀ ▀▄▄ \n ▄▀ ▀▀▀ ▀▄ \n █ ▀▀ ▀▀ █ \n █▄▄█▄█▄▄█▄▄▄█ "], ["walk_1", " \n █▄▄██▄▄▄██▄▄█ \n ▀██▀▀█ █▀▀██▀ \n ▄▄▀ ▀▄▄ \n ▄▀ ▀▀▀ ▀▄ \n █ █ █ █ \n █▄ ▀ ▄█ \n █▄▄██▀▀█▄▄▄▄█ "], ["walk_2", " \n ▄ ▄▄ ▄▄ ▄ \n ██████▀██████ \n ▀▀ █ █ ▀▀ \n ▄▀▀▄▄▄▀▀▄ \n █ ▄ ▄ █ \n █ ▀ ▄ ▀ █ \n █▄▄█▄▄▄▄█▄▄▄█ "]]], + ["tankmon", [["angry", " ▄▄▄▄▄ \n█▀▀▀▀█ ▄▀▀▄▄ \n ▀▀█▀▀ ▀▀ ▄▀ \n █▄▀▀▀▄ ▄▀▀▀▄ \n▄▄▄█▄███▄█▄▄▄▄ █\n█ █ █▄▄ ▀█ █ ▄▀\n▄▀▀█ ▄▀█▀█▀▀█▀▄\n▀▄▄████▄█▄█▄▄█▄▀"], ["attack", "█▀▀▄▄█▀▀▀▀▄▄ \n▀▀▄▄▄█ ▄█▀ ▀█ \n █ ▄ ▄ ▄ ▄█▄ \n▄▄▄███████▄█▄▄▀▄\n█ █ █▀█▀█▀█ █ █\n▀▀▀▀▄▄▄▄▄▄▀▀█▀▀ \n▄▀▀█ ▄▀█▀█▀▀█▀▄\n▀▄▄████▄█▄█▄▄█▄▀"], ["eat_1", "█▀▀▄▄█▀▀▀▀▄▄ \n▀▀▄▄▄█ ▄█ ▀█ \n █▄▄▄▄▄▄ ▄█▄ \n▄▄▄▀██▀▀▀█▄█▄▄▀▄\n█ █▄▀▀▀▀▀ █ █ █\n▀▀▀▀███▀▀▀▀▀█▀▀ \n▄▀▀█ ▄▀█▀█▀▀█▀▄\n▀▄▄████▄█▄█▄▄█▄▀"], ["eat_2", "▄▄▄ ▄▄▄▄▄ \n█▄ ▀▀█ ▄ ▀▀▄▄ \n ▀█▀▀ ▀ ▀ ▄▀ \n █▀▀▀▀▀▀▄▀▀▀▄ \n▄▄▄█▀████▀▄▄▄▄ █\n█ █ █▄▄ ▀█ █ ▄▀\n▄▀▀█ ▄▀█▀█▀▀█▀▄\n▀▄▄████▄█▄█▄▄█▄▀"], ["happy", "█▀▀▄▄▄▀▀▀▀▄▄ \n▀▀▄▄▄█ ▄▀▄ ▀█ \n▄▄▄█▄▄▄▄▄▄ ▄█▄ \n█ █ ██▀▀█▀▄█▄▄▀▄\n▀▀▀▀▄▀▀▀ ▄█ █ █\n ███▀▀▀▀▀█▀▀ \n▄▀▀█ ▄▀█▀█▀▀█▀▄\n▀▄▄████▄█▄█▄▄█▄▀"], ["injured_1", " \n ▄█▀▀▀▀▀▄▄ \n▄▀▀▄▄█ █▄ ▄ ▀█ \n▀▀▀█▄▄▄▄ █▄█ \n ▄▀▄▄▄▄█▀ ▀▄ \n █ ▄▄█ █ █ \n▄▀▀█ ▄▀█▀██▄▄█▄\n▀▄▄████▄█▄██▄▄█▀"], ["injured_2", " \n ▄▄▄▄▄ \n ▄█▄ ▀▀▄▄ \n▄▀ ▄▀ ▀▀ █ ▄▀ \n█▄█▀▀▀▀▀▄█▀█▄ \n █ ▀███▀▀ ▄ ▀▄ \n▄▀▀█ ▄▀█▀█▀▄▄█▄\n▀▄▄████▄█▄█▄█▄▄█"], ["sleep_1", " \n ▄█▀▀▀▀▀▄▄ \n█▀▀▄▄█ ▄▄ ▄ ▀█ \n▀▀▀█▄▄▄▄▄▀█▄█ \n ▄▀▄▄▄▄▄▀ ▀▄ \n ▄▀ ▄█▄ ▀▄ ▀▄ \n▄▀▀█ ▄▀█▀█▀▄▄█▄\n▀▄▄████▄█▄█▄█▄▄█"], ["sleep_2", " ▄▄▄▄▄▄ \n▄▄▄▀▀▄ ▀▀▄▄ \n█▄▄█▀▀ ▀▀▄█ ▄▀ \n █▀▀▀▀▀▄▀▀█ \n █ ▀█▀▀▀ ▄ █ \n █ ▄██▀▀ █ █ \n▄▀▀█ ▄▀█▀██▄▄█▄\n▀▄▄████▄█▄██▄▄█▀"], ["walk_1", "█▀▀▄▄█▀▀▀▀▄▄ \n▀▀▄▄▄█ ▄█ ▄ ▀█ \n █▄▄▄▄▄▀█▄█ \n ▀▄▄▄▄▄▀ ▀▄ \n▄▄▄█ █▄▄▄ ▄▄█▄ █\n█ █ █▄▄ ▀█ █ ▄▀\n▄▀▀█ ▄▀█▀█▀▀█▀▄\n▀▄▄████▄█▄█▄▄█▄▀"], ["walk_2", "▄▄▄ ▄▄▄▄▄ \n█▄ ▀▀█ ▄ ▀▀▄▄ \n ▀█▀▀ ▀▀▄█ ▄▀ \n █▀▀▀▀▀▄▄▀▀▀▀▄\n█▀█▀▀████ █▀█ █\n▀▄█▄█▄▄ ▀█▄█▄▀ \n▄▀▀█ ▄▀█▀█▀▀█▀▄\n▀▄▄████▄█▄█▄▄█▄▀"]]], + ["tapirmon", [["angry", " █▀▄▄▄▄█▀█ \n ▄███████ \n▄████▀▄███▀▄ \n█████████▀ █▀▄ \n██▀▄▄██▀▄ ▄▀ █▀▄\n▀▀ █▄▄▄██▄ ▀ ▄█\n ███▀▀███ █▄███\n █▄▄▀ ▀▄▄█▄▄▄█ "], ["attack", " █▀▄▄▄▄█▀█ \n ▄████▀███ \n▄█████ ▄██▀▄▄ \n███▀▀▀███▀ █ █▄ \n██ █ █▀▄ ▀ ▄▀ █\n ▄▀ ▄█▄█ ▀ ██\n ███ ███▄▀▀▄██▀\n █▄▄▀ ▀▄▄█ █▄▄▄█"], ["eat_1", " █▀▄▄▄▄█▀█ \n ▄████▀▀███ \n██████▄███▀▄ \n██▀█▀▀███▀ █▀▄ \n▀▀ █ █▀▄ ▄▀ █▀▄\n █▄▄▀▄██ ▄▀ ██\n ██▄███▄▀█▄███\n █▄▄▀█▄▄▀█▄▄▄█ "], ["eat_2", " █▀▄▄▄▄█▀█ \n ▄███████ \n▄█████ ▄██▀▄ \n█████████▀ █▀▄ \n██▀▄▄██▀▄ ▄▀ █▀▄\n▀▀ █▄ ▄██ ▄▀ ██\n ██▄███▄▀█▄███\n █▄▄▀█▄▄▀█▄▄▄█ "], ["happy", " █▀▄▄▄█▀█ \n ▄█████▀██ \n██████▄█▄█▀▄▄ \n██▀█▀▀ ██▀ █ █▄ \n▀▀ █ █ ▀ ▄▀ █\n █▄▄▄▀▄█▄ ▄ ██\n▄▀▀█▀▄▀▀█▀██▄██▄\n▀▀▀ ▀▀▀ █▄█▄▄▄▀"], ["injured_1", " \n █▀▄▄▄▄█▀█ \n ▄███████▄▄ \n████▄▀▀███ █▀▄ \n████████▀ ▄▀ █▀▄\n██▀▄▄▀▀▄█ ▄▀ ▄█\n▀▀ ██▄███▄▀█▄███\n █▄▄▀█▄▄▀█▄▄▄█ "], ["injured_2", " \n ▄▄ ▄▄ \n █▄█████▄█ \n ▄████████▄ \n█████ ▀██▀ █▀▄ \n███▀▀██▀ ▀ ▄▀▀▄\n▀▀▄██████ █▄▄██\n █▄█▄▄██▀▀█▄▄▄█▀"], ["sleep_1", " \n ▄▄ ▄▄▄ \n ▀▄█████▄▀ \n ▄████████▀▄▄ \n█████▄▄██▀ █ █▄ \n███▀▀██▀ ▀ ▄▀ █\n██ ██▄████ █▄▄██\n █▄█▄▄██▀█▄▄▄█▀"], ["sleep_2", " \n ▄▄ ▄▄▄ \n ▀▄█████▄█▄ \n ▄████████ █▀▄ \n█████▄▄██▀▄▀ █▀▄\n███▀▀██▀ ▀ █\n██ ██▄████ █▄▄██\n █▄█▄▄██▀█▄▄▄█▀"], ["walk_1", " █▀▄▄▄▄█▀█ \n ▄███████ \n▄█████▀ ██▀▄▄ \n█████████▀ █ █▄ \n██▀▄▄██▀▄ ▀ ▄▀ █\n▀▀ █▄ ▄██ ▀ ██\n ██▄███▄▀▀▄██▄\n █▄▄▀█▄▄▀ █▄▄▄▀"], ["walk_2", " █▀▄▄▄▄█▀█ \n ▄████▀██ \n▄█████▄▄███▄ \n███▀▀███▀ █ █▀▄ \n▀▀ ▀█▀▀▄▄▀ ▄▀ ██\n ▄██ ███ █▀\n█▄▄▀▀███▀▀██▄▄▀█\n █▄▄▀ █▄▄▀▄▄█"]]], + ["targetmon", [["angry", " ▄▄▄▄ \n ▄▄▀▀▀ ▄▀ \n▄▀▀▄█ ▄▄▄▀▀▄ \n█ █ ▀▀▀▀ █ █\n█▄▄█▀▀▀▀▀▀█ █\n ▀▀█▀█▀█▀██▀█▀▀ \n ▄██▀▀▀▀▀▄██▄ \n █▄█▄██▀▀▀█▄█▄█ "], ["attack", " ▄▀▀▀▄ ▄▄▀█▀▀█ \n █ ▄██▄▄█ █ \n █▄█▄▄▄▄██ █ \n ▀▄█▄▄▄▄▄█▀▀▀█ \n ▀▄█▄█▄█▄▀▀▄ \n ████ █ \n █▀▀▀▀▀▄██ \n ████▀▀█▄█▄█ "], ["eat_1", " ▄▄▄▀▀▀█ \n ▄▀▀ █ \n▄▀▀█▄▀▀▀▀▀█▄▀▀▄ \n█ █▄▀▀▀▀▀█ █\n█▄▄█▀█▀█▀██ █\n ▀█████████▀█▀▀ \n ▄██▀▀▀▀▀▄██▄ \n █▄█▄██▀▀▀█▄█▄█ "], ["eat_2", " ▄▄ ▄▄▄▀▀█▄ \n█ ▀▄▀▀ ▄▀ ▀▄\n█ █▄▄▄▄▄▄█ █\n█▀█▀▄▄▄▄▄█▀▄▄▄▄▀\n▀▄█ ▄▄ █▄▀ \n ▀█▀▀▀▀▀▀ █ \n ▄▀▄▄▄▄▄▄▄██▄ \n █▄█▄██ █▄█▄█ "], ["happy", " ▄▄▄▀▀▀█ \n ▄▀▀ █ \n▄▀▀█▄▀▀▀▀▀█▄▀▀▄ \n█ █▄▀▀▀▀▀█ █\n█▄▄████████ █\n ▀▄███▀▀▀▀█▀█▀▀ \n ▄██▀▀▀▀▀▄██▄ \n █▄█▄██▀▀▀█▄█▄█ "], ["injured_1", " \n ▄▄▄▀▀▀▄ \n ▄▀▀ ▄▀ \n █▄ ▄█▄ \n █▀███████▀█▄ \n▄▀█▄▄▄▄▄▄▄ ▄█▄▀▄\n██ ▀▄█▄█▄█▀ ██\n██▄▄▄█▄▄▄▄█▄▄▄██"], ["injured_2", " \n ▄▄▄ \n ▄▄▀▀▀ █ \n ▄▀ █ \n ███▄▄▄▄▄▄██▄ \n▄▀█▄▀▀▀▀▀▀▀▄█▄▀▄\n██ ▀▄▄▄▄▄█▀ ██\n██▄▄▄█▄█▄██▄▄▄██"], ["sleep_1", " ▄▀▀▀▄ \n █ █ \n ▀▄▀ \n ▄▄▀▀▄▄▄ \n █ █ ██▀ ▀▄ \n█▀▄█ ▀ ██ ▀▄ \n█▄▀▀▀▀▄██▄ ▀▄ \n██▄▄▄▄█▄██▄▄▄▄▄█"], ["sleep_2", " ▄ \n █ █ \n █▄ \n ▄▀█ ▄██▀▄ \n▄▄ █ █ ██ █ \n█ ▀█ ██ █ \n█▄▀▀▀▀▄██▄ ▀▄ \n██▄▄▄▄█▄██▄▄▄▄▄█"], ["walk_1", " ▄▄ ▄▄▄▀▀█▄ \n█ ▀▄▀▀ ▄▀ ▀▄\n█ █▄▄▄▄▄▄█ █\n█▀█▀▄▄▄▄▄█▀▄▄▄▄▀\n▀▄█▄▄▄▄▄▄▄▄ █▄▀ \n ▀█▄█▄█▄█▀ █ \n ▄▀▄▄▄▄▄▄▄██▄ \n █▄█▄██ █▄█▄█ "], ["walk_2", " ▄▄▄▄ \n ▄▄▀▀▀ ▄▀ \n▄▀▀▄▀ ▄▀▀▄ \n█ █▀▀▀▀▀██ █\n█▄▄█▀▀▀▀▀▀█ █\n ▀▀█▀█▀█▀██▀█▀▀ \n ▄██▀▀▀▀▀▄██▄ \n █▄█▄██▀▀▀█▄█▄█ "]]], + ["tekkamon", [["angry", " \n \n \n \n \n ▀█▄ ▄▄▄ \n █▄▄██▄ \n ▄▄██▀▄ "], ["attack", " \n \n █▄ \n ▀▄███▀█▄ \n ███▄▄██ \n ███ \n ███ \n ▄▄▄██▀▄ "], ["eat_1", " \n \n \n \n ▄▄▄▄ \n ▀██▄██▄ \n ▀███ \n ▄▄██▀▄ "], ["eat_2", " \n \n \n \n \n \n ▄▀███▄ \n ▀██████▀▄ "], ["happy", " \n \n \n \n \n ▄▀██▀▄ \n ▀█▄██ ██▄ \n ▀▄▄▀ "], ["injured_1", " \n \n \n \n \n ▄▄▄▄ \n █▀██▀█ \n ▄▄▄██████▄ "], ["injured_2", " \n \n \n \n \n \n ▄▀▀██▀▀▄ \n ▄▄▄████████▄ "], ["sleep_1", " \n \n \n \n \n \n ▄████▄ \n ▄▄▀▄▄██▄▄▀ "], ["sleep_2", " \n \n \n \n \n ▄████▄ \n █▀▀██▀▀█ \n ▄▄▀██████▀ "], ["walk_1", " \n \n \n \n \n ▄▄▄ \n █▄█▄█ \n ▄▄█▀▄▄▄▀█ "], ["walk_2", " \n \n \n \n \n \n ▄▀███▄ \n ▄▄▀████▄█▀ "]]], + ["tentomon", [["angry", " ▀▀▄▄▄ \n ▄▀▀ ▀▄ \n █ ▄▄▀ █▀▀▄ \n █▄▄▄ ██▄█ \n █ ▀ ▀███▄ █\n █▀▄▀▀█▀▀▀▄ █▄▀\n ▀▄▄▀▀█▀▀▀▄▄██ \n █▄▄██▀▀▀█▄▄▄▄█ "], ["attack", " ▀▀▄▄▄ \n ▄▀▀ ▄▀▄ ▄██▀▀▄\n█ █▀▀ █ ▄█▄██\n▀▀▀▀▄ ████▀▀▄\n █ ▄▄██▄ █\n ▄▄▄█ █▄ █▀▀▀ \n ▀▄▄▄▄▄█▄▄█▄ \n █▄▄▄█▀█▄▄▄▄█ "], ["eat_1", " ▀▀▄▄▄▄▀▀ \n ▄▀ ▀▀▄ \n █▀▄ ▄▀▄ ██▄ \n ▀▄▄▄▄▄▄ █▄ █ \n █████▀███▀▀▄\n ▄▀█ ▀▀▀ ▄▀ ██▄█\n ▀▄▄▀▀█▀▀▀▄▄██▀ \n █▄▄██▀▀▀█▄▄▄▄█ "], ["eat_2", " ▀▀▄▄▄▄▀▀ \n ▄▀ ▀▀▄ \n █▀▄ ▄▀▄ ██▄ \n ▀▄▄▄▄▄ █▄ █ \n █ ▀▀███▀▀▄\n ▄▀█▀▀█▀▀██▄▀█▄█\n ▀▄█▀▀█▀▀▀█▄▄█▀ \n █▄▄██▀▀▀█▄▄▄▄█ "], ["happy", " ▀▀▄▄▄▄▀▀ \n ▄▀ ▀▀▄ \n █▀▄ ▄▀▄ ██▄ \n ▄▀▄▄▄▄▄▄ █▄ █ \n █ ▄█▀███▀█ █▀▄\n ▀█ ▀▀▀ ▄█▀ █▄█\n ▄▀▀▀▀▀▀▀▀ ██▀▀ \n █▄▄▀▀▀▀▀▄▄▄▄█ "], ["injured_1", " \n ▀▀▄▄▄▄▀▀ \n ▄▀ ▀▀▄▄▄ \n █▀ ▀▄▄ █▀▀▄ \n ▀▄███▄ ██▄█ \n ▄▀▀▀▀▀ ▀█▀█▀▄█\n █ █▀▀█▀▀▀█ ██\n ▀▄▄█▄█▄▄█▄▄▄▄█ "], ["injured_2", " \n \n ▄▄ ▄▀▀▀▀▀▄▄▄▄ \n ▀▄▀ █▀ █▄█▄ \n █▄ ▄▄▄ █▄ █ \n ▀▄ ▄█▀█▀██\n ▄▀█▀▀█▀▀▀█ ██\n ▀▄▄█▄█▄▄█▄▄▄▄█ "], ["sleep_1", " \n \n ▄ \n ▀▄▀▀███▀▀▄ \n▀▀▄█ ▄██ █▄ \n ██████▀▀█▄▄████\n █ ▀██ ███▀ █\n ▀▄▄███▄▄████▄▄▀"], ["sleep_2", " \n \n █ ▄▄▄▄▄▄▄ \n▄▄ ▄▀ ██▀ ▀▄ \n ▄██▄▄███▄ ▄██▄\n █▀███▀ ▀████▀█\n █ ██▄ ▄███ █\n ▀█████████████▀"], ["walk_1", " ▀▀▄▄▄▄▀▀ \n ▄▀ ▀▀▄ \n █▀ ▀█▄ ██▄ \n █▀▄▄▄▀▀▀ █▄ █ \n █ ▀███▀▀▄\n ▄▀▄▀▀█▀▀▀█▄▀█▄█\n ▀▄█▀▀█▀▀▀█▄▄█▀ \n █▄▄██▀▀▀▀▄▄▄▄█ "], ["walk_2", " ▄▄ ▄▄ \n ▄▀▀▀▀▄▄ \n █▄ ▄▄ ▀▄▄ \n █▄ ▄██ █▀▀▄ \n ▀▄███▄ ▄▄██▄█ \n ▄▀▄▄▄▄▄▄█▄▀▄ █\n █ █▄▄█▄▄▄█▄▄██▀\n █▄█▄█▄▄█▄▄▄▄█ "]]], + ["terriermon", [["angry", " ▄▄ \n ▄█ ▀█▀▄▄ \n █▄ ▄ █ \n █ ▀▀▄ ▀▀ █ \n ▀▄ ▀ ▀▀ █▄ █ \n █▀▀ ▀▄ █ \n▄▀▄█ ▀▄█ ▀▄\n▀▄█▄▄▀▀▀▀▄▄█▄▄▄▀"], ["attack", " ▄▀█▄▄ \n ▄▀▀ ▀ ▀▀▄ \n ▄▀█▄ ▄█ ▀▄ \n██ ▄█▄▄ ▄▀▀█ \n ▀█▄ ▀▄▀ ▀ ▄█▄ \n ▄▀▄ ▄█ █ \n▄▀ █ ▄▄ █▀ ▀▄\n▀▄▄▄█▄█ █▄██▄▄▄▀"], ["eat_1", " ▄▀█▄▄ \n ▄▀▀ ▀ ▀▀▄ \n ▄▀ █ █ ▀▄ \n █ ▄█▄▄ ▄ █ \n █▄ ██ ▀█ ▀▄ \n ▄▀ ▄ ▀▄▀▄ \n▄▀▀█ ▄▄ █▀▀ ▀▄\n▀▄▄█▄█ █▄█▀▄▄▄▀"], ["eat_2", " ▄▄ \n ▄█ ▀█▀▄▄ \n █▄ ▄ █ \n █▀ ▀▄ ▀ ▀ █ \n ▀▄ ▀ ▀▀ █▄ █ \n █▀▀ ▀▄ █ \n▄▀▄█ ▀▄█ ▀▄\n▀▄█▄▄▀▀▀▀▄▄█▄▄▄▀"], ["happy", " ▄▀█▄▄ \n ▄▀▀ ▀ ▀▀▄ \n ▄█▀▄ ▄▀▄ ▀▄ \n▄█ ▄█▄▄ ▄█ \n█ ▀▄▀██▀ ▄▀ ██ \n ▀▄▄ ▄▀ █ \n▄▀ █ ▄▄ █ ▀▄\n▀▄▄▄█▄█ █▄██▄▄▄▀"], ["injured_1", " \n ▄▄ \n ▄█ ▀█▀▄▄ \n █ ▄ ▄ █ \n █ ▀▀▄ ▀▀ █ \n ▀▄ ▀ ▀ █ █ \n ▄▀█▀ █▄ ▀▀▄\n█▄█▄▄▄▄▄█▄▄▄█▄▄█"], ["injured_2", " \n \n ▄▀█▄▄ \n ▄▀▀ ▀ ▀▀▄ \n▄▀▄█ █▄ ▀▄ \n█ ▄▀▄ ▄ ▀▄ \n █▄▄ ▀▄▄ ▀▀▄\n█▄█▄▄▄▄▄█▄▄▄█▄▄█"], ["sleep_1", " \n \n \n ▄▀█▄▄ \n ▄▀▀ ▀ ▀▀▄ \n▄▀▄▄ ▄▄ ▀██▀▄ \n█▄ ▄▀▄ ▄▄▀▄ ▀▀█\n▀▄█▄▄▄█▄▄▄██▄▄▄█"], ["sleep_2", " \n \n ▄▄ \n ▄█ ▀█▀▄▄ \n █ █▄ \n█ ▀▀▄ ▀▀ ▄ █▀▀▄ \n▀▄▄▀ ▀ ▄▄▀▄ ▀▀█ \n▀▄▄█▄▄█▄▄▄██▄▄▄█"], ["walk_1", " ▄▀█▄▄ \n ▄▀▀ ▀ ▀▀▄ \n ▄▀ █ █ ▀▄ \n █ ▄▀▄▄ ▄ █ \n █▄▄ ▀█ ▀▄ \n ▄▀▄ ▄ █ █ \n▄▀▀█ ▄▄ █▀ ▀▄\n▀▄▄▄█▄█ █▄██▄▄▄▀"], ["walk_2", " ▄▄ \n ▄█ ▀█▀▄▄ \n █ ▄ ▄ █ \n █ ▀▄ ▀ █ \n ▀▄ ▀ ▀▀ █▄ █ \n █▀▀ ▀▄ █ \n▄▀▄█ ▀▄█ ▀▄\n▀▄█▄▄▀▀▀▀▄▄█▄▄▄▀"]]], + ["terriermon_x", [["angry", " ▄▄ \n ▄▀▀█ ▀▄▀▄▀▀▄ \n ▀▄▄ ▄ ▄ █ \n █ ▀▀▄ ▀▀ █ \n ▀▄ ▀ ▀▀ █▄ █ \n ▄▀▀ ▀▀ ▀▄ █ \n▄▀▄█ ▀▄█ ▄▀▄\n▀▄█▄▄▀▀▀▀▄▄█▄▄█▀"], ["attack", " ▄▄█▀▄ ▄ ▄▄ \n █ ▀ █ ▀ ▀▄ \n ▄▀█▄ ▄█ ▀▄▀ \n██ ▄█▄▄ ▄▀▀█ \n ▀█▄ ▀▄▀ ▀ ▄█▄ \n ▄▀▄ ▄█ █ \n▄▀ █ ▄▄ █▀ ▄▀▄\n▀▄█▄█▄█ █▄██▄▄█▀"], ["eat_1", " ▄▄█▀▄ ▄ ▄▄ \n █ ▀ █ ▀ ▀▄ \n ▄▀ █ █ ▀▄▀ \n █ ▄█▄▄ ▄ █ \n █▄ ██ ▄▀█ ▀▄ \n ▄▀▄▀ ▀ ▄ █ ▀▄ \n▄▀▀█ ▄▄ █ ▄▀▄█\n▀▄█▄█▄█ █▄█▄▄█▄▀"], ["eat_2", " ▄▄ \n ▄▀▀█ ▀▄▀▄▀▀▄ \n ▀▄▄ ▀▄ ▄ █ \n █▀ ▀▄ ▀ ▀ █ \n ▀▄ ▀ ▀▀ █▄ █ \n █▀▀ ▀▀ ▀▄ █ \n▄▀▄█ ▀▄█ ▄▀▄\n▀▄█▄▄▀▀▀▀▄▄█▄▄█▀"], ["happy", " ▄▄█▀▄ ▄ ▄▄ \n█ ▀ █ ▀ ▀▄ \n █▄▀▄ ▄▀▄ ▀▄▀ \n▄█ ▄█▄▄ █▄ \n█ ▀▄▀██▀ ▄▀ ▄█ \n ▀▄ ▀ ▀▀ █ █ \n▄▀ █ ▄▄ █ ▀▄█\n▀▄█▄█▄█ █▄██▄▄▄▀"], ["injured_1", " \n ▄▄ \n ▄▀▀█ ▀▄▀▄▀▀▄ \n ▀▄ ▄ ▄ ▄ █ \n █ ▀▀▄ ▀▀ █ \n ▀▄ ▀ ▀ █ █ \n ▄▀█▀ █▄ █▀▄\n█▄█▄▄▄▄▄█▄▄█▄▄██"], ["injured_2", " \n \n ▄▄█▀▄ ▄ ▄▄ \n█ ▀ ▀ ▀ ▀▄ \n▄▀▄█ █▄ ▀▄▀ \n█ ▄▀▄ ▄ ▀▄ \n █▄▄ ▀▄▄ █▀▄\n█▄█▄▄▄▄▄█▄▄█▄▄██"], ["sleep_1", " \n \n \n ▄▄█▀▄ ▄ ▄▄ \n█ ▀ █ ▀ ▀▄ \n▄▀▄▄ ▄▄ ▀▄█ ▄ \n█▄ ▄█▄ ▄▄▀▄ ▀▀▄\n▀▄█▄▄▄█▄▄▄██▄▄▄█"], ["sleep_2", " \n \n ▄▄ \n ▄▀▀█ ▀▄▀▄▀▀▄ \n █ ▀ ▄ █ \n█ ▀▀▄ ▀▀ █ █▀▀▄ \n▀▄▄▀ ▀ ▄▄▀▄ ▀▀█ \n▀▄▄█▄▄█▄▄▄██▄▄▄█"], ["walk_1", " ▄▄█▀▄ ▄ ▄▄ \n █ ▀ █ ▀ ▀▄ \n ▄▀ █ █ ▀▄▀ \n █ ▄▀▄▄ ▄ █ \n ▀▄▄ ▄▄▀█ █ \n ▄▀▄ ▄ █ █ \n▄▀ █ ▄▄ █▀ ▄ █\n▀▄█▄█▄█ █▄██▄█▄▀"], ["walk_2", " ▄▄ \n ▄▀▀█ ▀▄▀▄▀▀▄ \n ▀▄ ▄ ▀▄ ▄ █ \n █ ▀▄ ▀ █ \n ▀▄ ▀ ▀▀ █▄ █ \n ▄▀▀ ▀▀ ▀▄ █ \n▄▀▄█ ▀▄█ ▄▀▄\n▀▄█▄▄▀▀▀▀▄▄█▄▄█▀"]]], + ["thundermon", [["angry", " ▄▄▄▄ ▄▄▄▄ \n█ █ ▄▀▀█▀█ █\n█▀█▀▄▀ █▄▄ ▀█▀█\n█ ▀▄██▀ ▄███▄▀ █\n ▀▄███▄█████▄▄▀ \n █ ▀████▀ ██ \n ▄██▄▄██▄▄███▄▄ \n█▄█▄██▀▀▀██▄█▄▄█"], ["attack", " ▄▀▀▀▀▀██▀ \n ▄▀ ▄█▀ \n ▄█▄▄ ▀▀▄ \n ▄██▀ ▄███▄▄ \n█ █▄▄▄▄▄████ █\n▀▄█ ▀███▀ ███▄▄▀\n ▄▄▀▄███▄██▀▄▄▄ \n█▄█▄▄█ █▄▄█▄▄█"], ["eat_1", " ▄▀▀█▀ \n▄▀▀█▄▀ █▄▄ █▀▀▄\n█▄████▀ ▄████▄▄█\n█ █▀▄▀▄█▀▄▀██▀ █\n▀▄██▀▀▀▀▀████▄▀ \n █ ▄▄▄▄ ███ \n ▄▄▀█▄▄▄▄██▀▄▄▄ \n█▄█▄▄█ █▄▄█▄▄█"], ["eat_2", " \n ▄▀▀█▀ \n ▄█▀ ███▄ \n ████▀ ▄████ \n▄▀█▀██▄██▀███▀▀▄\n█ █▄███▄█▄█ ▄▀\n ██▀█▄▄▄███▀██▄ \n█▄█▄▄█ █▄▄█▄▄█"], ["happy", "▄▀▀█ ▄▀▀█▀ █▀▀▄\n█▄▄█▄█▄ ▀▄▄ ▀▄▄█\n█ ▄▀▄▀▄▄▀▄▀█▄█ █\n█ ███████████ █\n▀▄█ ▀▀▀▀ ██▄▀ \n █ ▄██▀ ██ \n ▄█▀▄▄▄▄███▄▄ \n █▄█▄▄█ █▄▄█▄▄█ "], ["injured_1", " \n \n ▄▀▀█▀ \n ▄█▀ ███▄ \n ████▀ ▄████ \n ▄█▀ █▄█ ▀██▀█ \n█▄▀▀████▀▀█▀ ▄▀▄\n▀▄▄▄████▄▄▄█▀▄▄█"], ["injured_2", " \n \n ▄▄ \n ▄██▀▄███▄ \n ███▄ ▄█████ \n ▄██▀▄█▀██████▄ \n█▀▀▄▄██▄▄▀▀█▀ █▄\n█▄▄██████▄▄▄██▄█"], ["sleep_1", " \n ▄▄▄▄ \n ▄▀ ▄▀ \n ▄█▄▄ ▀██▄ \n ▄███ ▄██▄▀█ \n █████████ ██ \n ███████████▀ \n ▀████████▀ "], ["sleep_2", " \n \n ▄▀▀█▀ \n ▄▀ █▄▄ \n ▄███▀ ▄██▀█▄ \n █████▄█████ █▄ \n ██████████████ \n ▀██████████▀ "], ["walk_1", " ▄▀▀█▀ \n ▄▀ █▄▄ \n ▄███▀ ▄███▄ \n █▀██▄██▀███▀▄ \n▄▀█▄█████▄██▀▀▄█\n█▄▀██▄▄████▀▄▄▄▀\n ▄▄▀▀█▀█▀▀▀▄▄ \n █▄█▄▄▀ ▀▄▄█▄▄█ "], ["walk_2", " ▄▄▄▄ \n ▄▀ ▄▀ \n ▄█▄▄ ▀██▄ \n ▄████ ▄█████▄▄ \n█ █ █████ ██ █\n ▀███▀▀██████▄▀ \n ▄▄▀███████▀▄▄▄ \n█▄█▄▄█ █▄▄█▄▄█"]]], + ["tialudomon", [["angry", " \n ▄▀█ ▄▄▄▄ \n █ █▀▄▄▄▄▀█ \n █▀ █▀ █ ▄██ \n █▀▀▀▀▀ █▀ ▀█ \n █ █▀▀█▀█ █▀█ █ \n ▀▄▀▄▄▄▄█▄▀▀▀▄▀ \n █▄█▄█▀▀█▄█▄█ "], ["attack", " ▄▄ ▄▀▀▄ ▄▄ \n ▀▄▀▄ █▀▀▄█ █ \n ▄▀█▄▀▄▀ █ ▄█ \n▄▀█ ▀▀ ▄▄▄█▀ ▀▄ \n█ ██ █▄▀█ █▀█ █\n█ █▄▀▀ ▄▀█▄▀▀▀▄▀\n▀▄▀▄▀▀█ ▄▀█▄▀ \n ▀▀ ▀▀ "], ["eat_1", " ▄▀█ ▄▄▄▄ \n █ █▀ ▄▄▄▀█ \n █▀ ▄▀▄▀█▄█▄ \n ▄█████▀█▀ ▀▄ \n ▄▀█▄▀▀▀▄█ █▀█ █\n █ █ ▀▀▀▄█▄▀▀▀▄▀\n ▀▄███▀▀▀█▀█▄█ \n █▄█▄█▀█▄█▄█ "], ["eat_2", " ▄▄ \n █ █▄▀▀▀▀▄▄ \n █▄▀ ▄▀██ █ \n █▄▄█▄█▄█▀ █ \n ▄▀▄▄▄▄▄▀█▄▀ ▀▄ \n█ █▀ ▄▀ ▄█ █▀█ █\n█ █▄▄▄▄▀██▄▀▀▀▄▀\n █▄█▄▀▀█▄█▄█▄▀ "], ["happy", " ▄▀█ ▄▄▄▄ \n █ █▀▄▄▄▄▀█▄ \n █▀ █▀▄▀█▄▀ ▀▄ \n ██████▀█ █▀█ █\n▄▀▄█▄▄▄▄▀█▄▀▀▀▄▀\n█ █ ▀ ▄▄█▀█▄▀ \n ▀▄██▀▀▀█▀▄ \n █▄█▄█▀█▄█▄█ "], ["injured_1", " \n ▄▄ \n █ █▄▀▀▀▀▄▄ \n █▄▀▄▀██▀ █▄ \n ▄█▄▄█▄▄▀▄█▀ ▀▄ \n█▄▀▄▄▄▄▄██ █▀█ █\n█ █▀ ▄▀█ █▄▀▀▀▄▀\n█▄▄█▄▄▄█▄▄██▄▀ "], ["injured_2", " \n \n ▄▀█ ▄▄▄▄ \n █ █▀▄▄▄▄▀█ ▄ \n █▀ █ ▀█ ▄█▀ ▀▄ \n██▀▀▀▀▀▄██ █▀█ █\n█ █▀▀█▀█ █▄▀▀▀▄▀\n█▄▄█▄▄▄█▄▄██▄▀ "], ["sleep_1", " \n ▄▀█ ▄▄▄▄ \n █ █▀ ▄▄▄▀█ \n █▀ ▄██ ▄▀█▄ \n █▀▀▀▀▄▄█ ▄▀ ▀▄ \n█ █▀▀█▀ ▄█ █▀█ █\n▀▄▀▄▄▄▄███▄▀▀▀▄▀\n█▄█▄█▄▄█▄█▄█▄▀ "], ["sleep_2", " ▄▄ \n █ █▄▀▀▀▀▄▄ \n █▄▀ ▄█▀▀ █ \n █▄▄██▀ ▄▀ █ \n ▄▀▄▄▄▄▄▀█▄▀ ▀▄ \n█ █▀ ▄▀ ▄█ █▀█ █\n▀▄▀▄▄▄▄███▄▀▀▀▄▀\n█▄█▄█▄▄█▄█▄█▄▀ "], ["walk_1", " ▄▀█ ▄▄▄▄ \n █ █▀ ▄▄▄▀█ \n █▀ ▄▀█ ▄▀▄ \n █▀▀▀▀ ▄█ ▄▀█ \n▄▀▄█▀▀█▀ ▄▀▄▄▄▀▄\n█ █ ▀ ▄██ █▄█ █\n ▀▄██▀▀▀█▀█▄ ▄▀ \n █▄█▄█▀█▄█▄█▀ "], ["walk_2", " ▄▄ \n █ █▄▀▀▀▀▄▄ \n █▄▀ ▄█▀▀ █ \n █▄▄█▄▀ ▄▀▄▀█ \n ▄▀▄▄▄▄▄▀█▀▄▄▄▀▄\n█ █▀ ▄▀ ▄█ █▄█ █\n▀▄█▄▄▄▄▀▀██▄ ▄▀ \n█▄█▄█▀▀▀█▄█▄█ "]]], + ["tigervespamon", [["angry", " ▄▄▄▄ \n ▄▄▀███▀ \n ▄▀ ▄█▀▄▀█ ▄▄\n ▀▄█▄▄▄▀ ▀▄███▀\n ▀▄▄█▄▄█▀ ▀▄ \n ▄▀█▄▀▄▀▄▀▀▄▄▀ \n ▀▄▄█▀▀▀▀▄▄▄█ \n █▄█▄▄▀▀▀█▄█▄█ "], ["attack", " ▄▄▄▄ \n ▄▄▀███▀ \n▄▀ ▄▀▀▄▀█ ▄▄▄ \n▀▄█▄▄█▀ ▄▀█▀▀██▄\n ▀▄▄█▄▄█▀ ▄▀▄ \n █ ▄▀▄▀▄██ █ \n █▄ ▀▄▄ ▀▀█▀▄ \n █▄██▄▄█ ▀▄█▄█▄█"], ["eat_1", " ▄▀▀▀████▀ \n ▄▀ ▄▀▀▄▀█ \n ▀▄█▄█▄▀ █ ▄▄██\n ███ ▄▄▀█▀▀ \n █▄▄▄▄▀█▄▄ █ \n █ █▄█▄█ ▀█ \n █▀ ▄▄ ▀▀█ \n █▄█▄█ █▄█▄█ "], ["eat_2", " ▄▄▄▄ \n ▄▄▀███▀ \n ▄▀ ▄▀█▄▀█ ▄▄\n ▀▄█▄█▄▀ ▀▄███▀\n ▀▄▄█▄▄█▀ ▀▄ \n ▄▀▄▀▄▀▄▄▀▀▄▀ \n █▄█▀▀▀▀▀▄▄█ \n █▄█▄█▀▀▀█▄█▄█ "], ["happy", " ▄▄███▀▀ \n ▄▀▀▄█▀█▄ \n █ ▄▀▄▀█ ▀▄▄ \n █▀▀█▀ ▄█ █ \n ▄▄▀█▀█▀█ ▄█▄ \n █ ▀█▄█▄▀▄█ ▀██▄\n ▀█▀ ▄▄▄ ▀▄ \n █▄█▄█ █▄█▄█ "], ["injured_1", " \n ▄▄███▀ \n ▄▀▀ ▀▀█▄ \n █ ▀▄▄ ▀▄▄▄ \n █▀▀▄ ▄▀ ▀██▄ \n █▀█▀█▀█▀▄▀ ▀ \n ▄▀ █▄█▄▀ █▀▄ \n █▄▄▀▄▄█▄▄█▄▄▄█ "], ["injured_2", " \n ▄▄▄▄ \n ▄▄▀███▀ \n ▄▀ ▄ ▀█▄▄▄ \n ▀▄▄▄▀▀ ▄▀ ▀██▄ \n ▀▄▄█▄▄██▀▄▀ ▀ \n ▄▀ █▄█▄▀ █▀▄ \n █▄▄▀▄▄█▄▄█▄▄▄█ "], ["sleep_1", " \n ▄▄███▀ \n ▄▀▀ ▀▀█▄ \n █ ▄██▀ █▄▄ \n █▀▀█ ▄▄▀▀██▄\n ▄▀█▀█▀█▄█▀▄▀ ▀\n █ ▀█▀▀█ ▀▄ █ \n █▄▄▄█▄█▄▄▄█▀ "], ["sleep_2", " ▄▄▄▄ \n ▄▄▀███▀ \n ▄▀ ▄▄▄▀█ \n ▀▄▄██▀ ▀▄▄ \n ▀▄▄█▄▄█▀ ▀██▄\n ▄▀▄▀▄▀▄▄█▀▄▀ ▀\n █ ▀█▀▀█ ▀▄ █ \n █▄▄▄█▄█▄▄▄█▀ "], ["walk_1", " ▄▄███▀ \n ▄▀▀▄█▀█▄ \n █ ▄▀▀ █ █ ▄▄██\n █▀▀█▀ ▄▄▀█▀▀ \n ▄▀█▀█▀▀▄▄ █ \n ▄▀█▄█▄█▄▀ █ \n ▀▄▀ ▄▄ █▄▄▀ \n █▄█▄█ █▄█▄█ "], ["walk_2", " ▄▄▄▄ \n ▄▄▀███▀ \n ▄▀ ▄█▀▄▀█ ▄▄\n ▀▄█▄▄▄▀ ▀▄███▀\n ▀▄▄█▄▄█▀ ▀▄ \n █▄▀▄▀▄ █▀▄▀ \n █▄█▀▀▀▀█▄▄█ \n █▄█▄▄▀▀▀█▄█▄█ "]]], + ["tinkermon", [["angry", " ▄▄▄ ▄▄▄ \n █▄▄██▄▄█ ▄█\n █▀ ▄ ▄▄ ▀▄▀ █\n █ ▄▀ ▀ ▀▄ █ █\n ▀▄██▄ ▄█ █ ▄▀ \n ▄▀▄▄▄▄▄█ ▀▄ \n █▄█▄ ▄█ █▄ █ \n █▄▄█▀██▀██▄█▀▀ "], ["attack", " ▄▀█▄▀▀█ \n ▄▀▀▀▀▀▀█▀ ▄▄\n ▀▄█▀▀▀▄ ██ █\n █ ▄█ █ █ ▄▀\n ▀▄▄▄▄█▄██▀▄ \n▄█▄▄█ █▄▀█▀ █▄ █\n █▀▄▄█▄▄█ ▀▀\n █▄▄█▀▀█▄▄█ "], ["eat_1", " █▀▀▄▄▀▀█ \n ▄█▀▀▀▀▀▀▀▄ ▄▀█\n ▄▀ ▄▀▄▀▀▄ █ █\n █ █ █ █ ▀▄▀ ▄▀\n ▀▀▄ ██ ▄▀▄▀ \n ▄▀▄▀▀▀▀█▀▄ ▀▄ \n ▀▄▀█▄▄█▀▄▀▀▄█ \n █▄▄█▀▀█▄▄█ "], ["eat_2", " ▄▄▄ ▄▄▄ \n █▄▄██▄▄█ ▄█\n █▀ ▄ ▄▄ ▀▄▀ █\n █ ▄▀▄▀ █▄ █ █\n ▀▄█▀ ▀ ▀ ▀█ ▄▀ \n ▄▀▄▄▄▄▄█ ▀▄ \n █▄█▄ ▄█ █▄ █ \n █▄▄█▀██▀██▄█▀▀ "], ["happy", " █▀▀▄▄▀▀█ \n ▄█▀▀▀▀▀▀▀▄ ▄▀█\n ▄▀ ▄▀▄▀▀▄ █ █\n █ █▄▀▄ ▄▀██▀ ▄▀\n ▄▀█▄ ▄▄▄ ▄▀▄▀ \n ▀▄ █▀▀▀▀█ ▄▀▀▄ \n █▀█▄▄█▀█ ▀▄█ \n █▄▄█▀▀█▄▄█ "], ["injured_1", " \n █▀▀▄▄▀▀█ \n ▄█▀▀▀▀▀▀▀▄ ▄▀█\n ▄▀ ▄▀▄▀▀▄ █ █\n █ █▄█ █▄▀▄▀ ▄▀\n ▀█▄ ▄▀▄▀ \n ▄▀▀▄▀▀▀▀█▀▀▄▀▄ \n █▄▄██████▄▄█▄█ "], ["injured_2", " \n ▄▄▄ ▄▄▄ \n █▄▄██▄▄█ ▄▄\n █▀ ▀▄▀ █\n █ ▄▀▀▄▀▀▀▄ █ █\n ▀▄█▄█ █▄ █ ▄▀ \n ▄▀▀▄ ▄▀▀█ █ \n █▄▄██████▄▄█▄█ "], ["sleep_1", " \n █▀▀▄▄▀▀█ \n ▄█▀▀▀▀▀▀▀▄ ▄▀█\n ▄▀ ▄▀▄▀▀▄ █ █\n █ █▄▄ ▄▄▀▄▀ ▄▀\n ▀█▄ ▄▀▄▀ \n ▄▀▀▄▀▀▀▀█▀▀▄▀▄ \n █▄▄██████▄▄█▄█ "], ["sleep_2", " ▄▄▄ ▄▄▄ \n █▄▄██▄▄█ ▄▄\n █▀ ▄ ▄▄ ▀▄▀ █\n █ ▄▀ ▀ ▀▄ █ █\n ▀▄█▀▀ ▀▀ █ ▄▀ \n ▄▀▄▄▄▄▄█ ▀▄ \n ▄▀▀█▄ ▄█▀▀▄ █ \n █▄▄██████▄▄█▀▀ "], ["walk_1", " █▀▀▄▄▀▀█ \n ▄█▀▀▀▀▀▀▀▄ ▄▀█\n ▄▀ ▄▀▄▀▀▄ █ █\n █ █ █ █ ▀▄▀ ▄▀\n ▀▀▄ ▄▀▄▀ \n ▄▀▄▀▀▀▀█▀▄ ▀▄ \n ▀▄▀█▄▄█▀▄▀▀▄█ \n █▄▄█▀▀█▄▄█ "], ["walk_2", " ▄▄▄ ▄▄▄ \n █▄▄██▄▄█ ▄█\n █▀ ▄ ▄▄ ▀▄▀ █\n █ ▄▀▄▀ ▄▀▄ █ █\n ▀▄█ ▀ ▀ █ ▄▀ \n ▄▀▄▄▄▄▄█ ▀▄ \n █▄█▄ ▄█ █▄ █ \n █▄▄█▀██▀██▄█▀▀ "]]], + ["titamon", [["angry", " ▄▀█ ▄▀█ █▀▄▄▀█\n █ █▄█▄█▄▄▄█ █▄█\n █▄▄▀ ▄▄ ▀▄▄█▄█\n █▀█▄▄▄▄ ▄██▄█▄▀\n ███▄▄▄▀██████ \n ██ █▄ ▄█▀ ▀█ \n ▀██▄▄█▄██▄▄▀▄ \n █▄█▄█▄██▄█▄█▄█"], ["attack", " ▄▀█ ▄▀█ █▀▄▄▀█\n █ █▄█▄█▄▄▄█ █▄█\n █▄▄▀ ▄▄▄▀▄▄█▄█\n █▀█▄▄█▄▀▄██▄█▄▀\n█ ▀████▄███████ \n█ ▀▀█▀▄ ▄▄▀▀█ \n ▀▄▄▄▄▄▀▄▀▄█▄▀▄ \n █▄█▄█████▄█▄█"], ["eat_1", " ▄▀█ ▄▀█ █▀▄▄▀█\n █ █▄█▄█▄▄▄█ █▄█\n █▄▄▀ ▄▄▄▀▄▄█▄█\n █▄█▄▄█▄▀▄██▄█▄▀\n ████▄▄▄▀█████ \n ██ █▄ ▄█▀ ▀█ \n ▀██▄▄█▄██▄▄▀▄ \n █▄█▄█▄██▄█▄█▄█"], ["eat_2", " ▄▄ ▄▄ ▄▄ ▄▄\n ▄▀▄▀▄▀▄▀ ▀▄▀█ █\n █ ▀█▀▀▀▀▀█▀ █▀█\n ███ ▄▀▄ ▄█▀█▀█\n ▀▄██▀ ▄██████ \n ▄█▀▀█▀▀ ██▀▀▀█ \n ▀█▄▄█▀▄ ██▄▄██ \n █▄█▄█▄█▀█▄█▄█▄█"], ["happy", " ▄▀█ ▄▀█ █▀▄▄▀█\n █ █▄█▄█▄▄▄█ █▄█\n █▄▄▀ ▄ ▀▄▄█▄█\n █▀█▄▄▀ ▀▄██▄█▄▀\n ▄█▀▀██▄▀███▀██ \n ▀█▄▄█▄ ▄█ ▄█ \n ▄▄█▄▄█▄████▀▄ \n █▄█▄█▄█ █▄█▄█▄█"], ["injured_1", " \n ▄▀█ ▄▀█ █▀▄▄▀█\n █ █▄█▄█▄▄▄█ █▄█\n █▄▄▀ ▄▄▄▀▄▄█▄█\n █▀█▄▄██▀▄██▄█▄▀\n ▄█▀▀██▄▀██▀▀██ \n ▀█▄▄█▄▄ ▀█▄▄▄█ \n █▄█▄█▄█▄█▄█▄█ "], ["injured_2", " \n ▄▄ ▄▄ ▄▄ ▄▄\n ▄▀▄▀▄▀▄▀ ▀▄▀█ █\n █ ▀█▀▀▀▀▀█▀ █▀█\n ███ ▀▄ ▄█▀█▀█\n ▀▄████▀▄██████ \n ██ █▀▀ ██ ▀█ \n ██████▄██████ "], ["sleep_1", " ▄▄ ▄▄ ▄▄ ▄▄\n ▄▀▄▀▄▀▄▀ ▀▄▀█ █\n █ ▀█▀▀▀▀▀█▀ █▀█\n ███ ▀▀▀ ▄█▀█▀█\n ▀▄████▀▄██████ \n ██▀▀██▀ ▄█▀ ▀█ \n ▀██▄▄█▄██▄▄▀▄ \n █▄█▄█▄██▄█▄█▄█"], ["sleep_2", " ▄▀█ ▄▀█ █▀▄▄▀█\n █ █▄█▄█▄▄▄█ █▄█\n █▄▄▀ ▄▄▄ ▀▄▄█▄█\n █▀█▄▄▄▄ ▄██▄█▄▀\n █████▄▀██████ \n ██ █▄ ▄█▀ ▀█ \n ▀██▄▄█▄██▄▄▀▄ \n █▄█▄█▄██▄█▄█▄█"], ["walk_1", " ▄▀█ ▄▀█ █▀▄▄▀█\n █ █▄█▄█▄▄▄█ █▄█\n █▄▄▀ ▄▄▄▀▄▄█▄█\n █▀█▄▄█▄▀▄██▄█▄▀\n █████▄▀██████ \n ██ █▄ ▄█▀ ▀█ \n ▀██▄▄█▄██▄▄▀▄ \n █▄█▄█▄██▄█▄█▄█"], ["walk_2", " ▄▄ ▄▄ ▄▄ ▄▄\n ▄▀▄▀▄▀▄▀ ▀▄▀█ █\n █ ▀█▀▀▀▀▀█▀ █▀█\n ███ ▄▀█▀▄█▀█▀█\n ▀▄████▀▄██████ \n ▄█▀▀█▀▀ ██▀▀▀█ \n ▀█▄▄█▀▄ ██▄▄██ \n █▄█▄█▄█▀█▄█▄█▄█"]]], + ["tobiumon", [["angry", " \n ▄▄▀▀█ \n ▄▄▄▄▀▀ ▄▀ \n ▄▀▀▄ ▀ ▄▄▀▄ ▄█\n█ ▀▀ ▀▀▄▄▄ ▀▄▀\n▀▀██▄▄▀ ▄▀▀▀▀▄█\n ▀▄▄▀ ▀\n "], ["attack", " ▄▄▀▀█ \n ▄▄▄▀▀▀ ▄▀ \n ▄▀▀ ▄ ▄▄▀▄ ▄█\n█▄▄▄▀▀ ▄▄▄ ▀▄▀\n ████ ▄ ▀█▀▀▀▄█\n ▀▄▄▄▀▀▄ █ ▀\n ▀▀▀ \n "], ["eat_1", " \n ▄▄▀▀█ \n ▄▄▄▀▀▀ ▄▀ \n ▄▀▀ ▄▀ ▄▄▀▄ ▄█\n█▄▄▄▀▀ ▀▄▄▄ ▀▄▀\n ▀█▀ ▄▀ ▄▀▀▀▀▄█\n ▀▀▀▀▄▄▀ ▀\n "], ["eat_2", " \n ▄▄▄ \n ▄▄▀▀ ▄▀ \n ▄▄▀▀█▀ ▄▀ ▄\n▄▀ ▄▀▄ ▄ ▀▀ ▀▄▀█\n█▄▄▄ ▄ ▀▀█▄▄▄▀▄\n ▀▀▀▀▀▄ █ ▀█\n ▀▀ "], ["happy", " \n ▄▄▀▀█ \n ▄▄▄▀▀▀ ▄▀ \n ▄▀▀ ▄ ▄▄▀▄ ▄█\n█▄▄▄▀ ▀ ▄▄▄ ▀▄▀\n ▀█▀ ▄▀ ▄▀▀▀▀▄█\n ▀▀▀▀▄▄▀ ▀\n "], ["injured_1", " \n \n ▄▄▀▀█ \n ▄▄▄▄▀▀ ▄▀ \n ▄▀▀▄ ▀ ▄▄▀▄ ▄█\n█ ▀▀ ▄▄▄ ▀▄▀\n▀▀██▄▄█ ▀█▀▀▀▄█\n ▀▀▀▀ ▀"], ["injured_2", " \n \n ▄▄▄ \n ▄▄▀▀ ▄▀ \n ▄▄▀▀█▀ ▄▀ ▄\n▄▀ █▄ ▀▀ ▀▄▀█\n█▄▄▄ ▄ ▀▀▀▄▄▄▀▄\n ▀▀▀▀▀▀▀▀▀▀ ▀█"], ["sleep_1", " \n ▄▄▀▀█ \n ▄▄▄▄▀▀ ▄▀ \n ▄▀▀ ▀ ▄▄▀▄ ▄█\n█ ▀▀ ▀▀▄▄▄ ▀▄▀\n▀▀██▄▄█ ▄▀▀▀▀▄█\n ▀▄█ ▀\n "], ["sleep_2", " \n ▄▄▄ \n ▄▄▀▀ ▄▀ \n ▄▄▀▀█▀ ▄▀ ▄\n▄▀ ▄▄ ▄▄ ▀▀ ▀▄▀█\n█▄▄▄ ▄ ▀█▄▄▄▄▀▄\n ▀▀▀▀▀▄▄▄█ ▀█\n "], ["walk_1", " \n ▄▄▀▀█ \n ▄▄▄▄▀▀ ▄▀ \n ▄▀▀▄ ▀ ▄▄▀▄ ▄█\n█ ▀▀ ▀▀▄▄▄ ▀▄▀\n▀▀██▄▄▀ ▄▀▀▀▀▄█\n ▀▄▄▀ ▀\n "], ["walk_2", " \n ▄▄▄ \n ▄▄▀▀ ▄▀ \n ▄▄▀▀█▀ ▄▀ ▄\n▄▀ ▄█ ▄ ▀▀ ▀▄▀█\n█▄▄▄ ▄ ▀▀█▄▄▄▀▄\n ▀▀▀▀▀▄ █ ▀█\n ▀▀ "]]], + ["tobucatmon", [["angry", " ▄ \n█▀▄▀ █▄▀▀▀█ \n▀▄▀▄▀ ▄█ ▄▄▄▄▄\n █ ▄ ▀▄▀ ▄▄▀\n█ ▄ ▀▀ ▀▄▄█ ▄▄\n▀▄▀▀▀▀ ▄▄▀ █ █\n ▄█▀▀▀█▀ ▄▄█ █ \n█▄▄█▀█▄▄█ █▄█ "], ["attack", "▄▄ ▄▀▄ ▄▄▄▄ \n█ █ ▄▀▀ ▄▀ ▄▄▄ \n █ ▀ ▄▄▀█▄▀ ▄▀ \n█ ▄ ▀▀ █ ▄▀▄▄\n▀██████▄ ▄▀▀▀█ █\n █▀▀▀▀▀▀▄▀ █▄\n ▀█▀█▀▀█ █▄ █\n █▄▄█▀█▄▄█ ▀▀▄█"], ["eat_1", "▄▄ ▄▀▄ ▄▄▄▄ \n█ █ ▄▀▀ ▄▀ \n █ ▀ ▄ █▀▄▀▀▀▀█\n█ ▄ ▀ ▀ █ ▄▀▀ \n▀█████▄ ▄▀▀▀▄▀█\n █▀▀▀▀▀▄▀ ▀▄▀\n █▀▀██▄ █▀▄▄ █ \n █▄▄█ █▄▄█ █▄█ "], ["eat_2", " ▄ \n█▀▄▀ █▄▀▀▀█ \n▀▄▀▄▀ ▄█ ▄▄▄▄▄\n █ ▄ ▀▄▀ ▄▄▀\n█ ▄ ▀ ▀ ▀▄▄█ ▄▄\n▀▄▀ ▀▀ ▄▄▀ █ █\n █▀▀▀▀█ ▄▄█ █ \n █▄▄▀▀█▄▄█ ▀▀▄█ "], ["happy", "▄▄ ▄▀▄ ▄▄▄▄ \n█ █ ▄▀▀ ▄▀ ▄▄▄\n █ ▀ █▀▄▀▀ ▄▀\n▄▀ ▄▀▄ █ ▄▀ \n▀▄▄█▄▄▄ ▄▀▀▀▄▀█\n █▀▀▀▀▀▄▀ ▀▄▀\n ▄█▀▀▀█▄ █▀▄▄ █ \n█▄▄▄▀▀█▄▄█ █▄█ "], ["injured_1", " \n \n ▄▄▄▀▀▀▄▄▄▄▄ \n▀▄▄▀▄▀▀ ▄▀ \n █ ▄ ▀█▄▀▀▄ \n █ ▄ ▀▀ ▀▄ █ \n▄▀▄▀██ ▄▄▀▀▄▀▄▄▀\n█▄▄█▄▄█▄▄▄▄█▄▄▄█"], ["injured_2", " \n \n ▄▄▄ \n▄▀▀█ ▄▄▀▀▀▀▀▄ \n ▀█ ▀ ▄▄▀▄▄ \n ▄▀ ▀▄▄ ▀█ █ \n▄▀▄▄█▄ ▄▄▀▀▄▀▄▄▀\n█▄▄█▄▄█▄▄▄▄█▄▄▄█"], ["sleep_1", " \n \n█▀▄▀▀▀▄▀▀▀█ \n▀▄▀▄▀▀ ▄█ ▄▄ \n █ ▀▄█ ▀▄ \n█ ▄ ▀▀▀ ▀▄▀▄▄▄▀\n▀▄█▀▀▀▄▄▄▀ ▄▄ █\n█▄▄█▀█▄▄▄▄█▄▄▄▄▀"], ["sleep_2", " \n▄▄ ▄▄▄ ▄▄▄▄ \n█ █ ▄▄▀ ▄▀ \n █ ▀ █▀▄▀▀▄ \n▄▀ ▄▄▄ █▀▄ ▀▄\n█ ▄█▄▄ ▄▀ ▀▀▀▄\n▄█▄▄▄▄▄▄▀ ▄▄ █\n█▄▄█▀█▄▄▄▄█▄▄▄▄▀"], ["walk_1", "▄▄ ▄▀▄ ▄▄▄▄ \n█ █ ▄▀▀ ▄▀ \n █ ▀ ▄ █▀▄▀▀▀▀█\n▄▀ ▄█ █ ▄▀▀ \n█ ▄▀▄▄ ▄▀▀▀▄▀█\n ▀▄▄▄▄▄▀▀ ▀▄▀\n █ ▄▄▄▄ █▀▄▄ █ \n █▄▄█ █▄▄█ █▄█ "], ["walk_2", " ▄ \n█▀▄▀ █▄▀▀▀█ \n▀▄▀▄▀ ▄█ ▄▄▄▄▄\n █ ▀▄ ▀▄▀ ▄▄▀\n█ ▄ ▀▀ ▀▄▄█ ▄▄\n▀▄▀ ▀▀ ▄▄▀ █ █\n ▄█▀▀▀▀█ ▄▄█ ▀▄\n█▄▄█▀▀█▄▄█ ▀█▄█"]]], + ["togemon", [["angry", " ▄ ▄ \n ▀▄▀█▀█▀▄▀ \n █ ▀ ▀ █ \n █ ▄ ▄ █ \n ▄▀█ ▀ ▀ ▀▀▄▄ \n█ ▀█ ▄ ▄ ▄ ▄▀ █\n▀▄▄▀▄█ █ █▄▀▀▄▄▀\n█▄▄██▀▀▀▀█▄▄▄▄█ "], ["attack", " ▄ ▄█▄█▄ ▄ \n▄▀▀▄▀ ▀ ▀ ▀▄▀▀▀▄\n█▄▀█ █ █ █▀▄ █\n █ ▄▄▄▄ ▀▀▀▄▀\n ▀▄ ██████ ▄▄▀ \n █ ▀▀▀▀▀▀ █ \n █▄ ▄ ▄ ▄ ▀▄ \n █▄▄██▀▀█▄▄▄▄█ "], ["eat_1", " ▄▄▄ ▄█▄█▄ ▄▄▄▄ \n█ ▄▄▀ ▀ ▀ ▀▄▄ █\n▀█▄█ █ █ █▄█▄▀\n ▀▄█ ▄▄▄▄ ▄▀ \n █ ████ █ \n █ ████ █ \n ▄▄█ ▄ ▄ ▄ ▀▄ \n█▄▄▄██▀▀▀█▄▄▄▄█ "], ["eat_2", " ▄ ▄ \n ▀▄▀█▀█▀▄▀ \n ▄▄█ ▄ ▄ █▄▄▄ \n█ ▄█ ▀ ▀ █▄ █\n █▄█ ██ ▀▄█▄▀\n ▀▄█ ▄ ▄ ▄ ▄▄▀ \n ▄▄▀▄█ █ █▄▀▀▄ \n█▄▄██▀▀▀▀█▄▄▄▄█ "], ["happy", " ▄ ▄█▄█▄ ▄▄▄▄ \n ▄▀ ▀ ▀ █ █\n █ █ █ █▀▄ █\n ▄▄█ ▄▄▄▄ ▀▀▄▀ \n█ █ ████ █▀ \n▀▄▄█ ████ █ \n ▀▄█ ▄ ▄ ▄ ▀▄ \n █▄▄██▀▀█▄▄▄▄█ "], ["injured_1", " ▄ ▄ \n ▀▄█████▄▀ \n █████████ \n █▀ █ ▀███ \n ▄████▀███ ██▄ \n ██ ██████ ██▀ \n ▀▄█▀█▀█▀█▀ \n ██▄█▄█▄██ "], ["injured_2", " ▄ ▄ \n ▀▄█████▄▀ \n █████████ \n █████████ \n ▄██▄▄█▄▄█▀██▄ \n ██ ██▄███ ███ \n ▀▄█▀█▀█▀█▄▀ \n ███▄█▄█▄███ "], ["sleep_1", " ▄ ▄ \n ▀▄▀█▀█▀▄▀ \n █ █▀▀▄\n █▄▄ ▄▄ ▀ █\n ▄▀▀▀ ▄▄▄▀\n █ █ ▄ ▄ ▄ █ \n ▀▀█ █ █ █ █ \n ▀▄█▄█▄█▄▀ "], ["sleep_2", " ▄ ▄█▄█▄ ▄ \n ▄▀ ▀ ▀ ▀▄▄▄ \n █ █ █\n ▄▄█▀▀ ▀▀ █\n █ ▄ ▄▀▀ \n ▀▄▄█ ▄ ▄ ▄ █ \n █ █ █ █ █ \n ▀▄█▄█▄█▄▀ "], ["walk_1", " ▄ ▄█▄█▄ ▄ \n ▄▄▄▀ ▀ ▀ ▀▄▄▄▄ \n█ ▄█ █ █ █▄ █\n▀█▄█ ▄▄ █▄█▄▀\n ▀▄█ ▀▀ ▄▄▀ \n █ █ █ █ █ \n ▄█ █▄█▄█ ▀▄ \n █▄▄██ █▄▄▄▄█ "], ["walk_2", " ▄ ▄ \n ▀▄▀█▀█▀▄▀ \n ▄▄█ ▄ ▄ █▄▄▄ \n█ ▄█ ▀ ▀ █▄ █\n █▄█ ▄▄ ▀▄█▄▀\n ▀▄█ ▄ ▄ ▄ ▄▄▀ \n ▄▄▀▄█ █ █▄▀▀▄ \n█▄▄██▀▀▀▀█▄▄▄▄█ "]]], + ["togemon_x", [["angry", " \n ▄▀▀▀▄ \n █▀▀▀▀ ▀▀▀▀█ \n ▀██▀▀▀▀█▀█▀ \n▄▀▀█▀▀▄ ▀▀▄█▀▀▄ \n█ ▄█▄▄█▄█▀ █▄ █ \n ▀▄█ █ █ ▀▄█▄▀ \n █▄▄▄▄█▀▀▄▄▄▄█ "], ["attack", " ▄▄▀▀▀█ \n █▀▀▀▀▀ ▀▀▀█ \n ▀█▀▀█▀▀▀▀█▀ \n █ ▀▀ █ \n▄▀▀▀▀█▀▀▀█▀██ \n█ ▀▄█▄▄▀▄▀ █ \n ▀▀▀▄▄█▀▄█▄ ▀▄ \n █▄▄▄█▀▄▄▄▄▄█ "], ["eat_1", " ▄▀▀▀▄ \n █▀▀▀▀ ▀▀▀▀█ \n ▀██▀▀▀█▀▀█▀ \n▄▀▀█ ▀ ▀ ▀ █▀▀▄ \n█ ▄█ ████▄▀█▄ █ \n ▀▄█▀▀▀▀█ █▄▀ \n ▄█ █ █ ▀▄█▄ \n █▄▄▄▄█▀▀▄▄▄▄█ "], ["eat_2", " ▄▄▄ \n ▄▄▄▄▄▀ ▄█▄▄▄ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ \n █▀▄ ▄▀▄ █ \n▄▀▀█ ▄█▀▀▄ \n█ ▄█▄▄█▄█▀ █▄ █ \n ▀▄█ █ █ ▀▄█▄▀ \n █▄▄▄▄█▀▀▄▄▄▄█ "], ["happy", " ▄▀▀▀▄ \n █▀▀▀▀ ▀▀▀▀█ \n ▀██▀▀▀█▀▀█▀ \n▄▀▀█ ▀ ▀ ▀ █▀▀▄ \n█ ▄█ ██ ▄▄▀█▄ █ \n ▀▄█▀▀▀▀█ █▄▀ \n ▄█ █ █ ▀▄█▄ \n █▄▄▄▄█▀▀▄▄▄▄█ "], ["injured_1", " ▄▄▄ \n ▄▄▄▄▄▀ ▄█▄▄▄ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ \n █▀ █ ▀███ \n █████████▀▄ \n ██ ██▄████ ██ \n ▀█▄█▀█▀█▀█▄█▀ \n ▀█▄█▄█▄█▀ "], ["injured_2", " ▄▄▄ \n ▄▄▄▄▄▀ ▄█▄▄▄ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ \n █████████ \n ██▄▄█▄▄██▀▄ \n ██ ██▄████ ██ \n ▀█▄█▀█▀█▀█▄█▀ \n ▀█▄█▄█▄█▀ "], ["sleep_1", " ▄▄▄ \n ▄▄▄▄▄▀ ▄█▄▄▄ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ \n █▄▄ ▄▄ █▀▀▄ \n▄▀▀▀ ▄▀ █ \n█ █▄▄▄▄▀▀█▄▄▄▀ \n▀▄▄█ ▄ ▀▄█ █ \n ▀▄█▄█▄█▄▀ "], ["sleep_2", " ▄▀▀▀▄ \n █▀▀▀▀ ▀▀▀▀█ \n ▀█▀▀▀▀▀▀▀██▄ \n ▄▄█▀▀ ▀▀ █ █ \n█ ▄ ▄▄█ █ \n█ █▀▀▀█ ▄▀█▀▀ \n ▀▀█ █ ▄▀█ █ \n ▀▄█▄█▄█▄▀ "], ["walk_1", " ▄▀▀▀▄ \n █▀▀▀▀ ▀▀▀▀█ \n ▀█▀█▀▀█▀▀█▀ \n▄▀▀█ ▀▄ ▀ █▀▀▄ \n█ ▄█ ▀ ▄▄▀█▄ █ \n ▀▄█▀▀▀▀▄ █▄▀ \n ▄█ █ █ ▀▄█ \n █▄▄▄▄█▀▀▄▄▄█ "], ["walk_2", " ▄▄▄ \n ▄▄▄▄▄▀ ▄█▄▄▄ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ \n █ █ █ █ \n▄▀▀█ █ ▄█▀▀▄ \n█ ▄█▄▄▄▄█▀ █▄ █ \n ▀▄█ █ █ ▀▄█▄▀ \n █▄▄▄▄█▀▀▄▄▄▄█ "]]], + ["tokomon", [["angry", " ▄ \n ▄▀█ ▄▄▀▀▄ \n ▄▀▀▀▀▀▄ ▄▀▀ \n █ ▄▄▄▄▀▀ █ \n ▀█▄██▄█▄ █ \n █▀█▀█▀█ █ \n █▀▀▀▀▀▀ ▄▀ \n █▄██▀▀▀█▄▄█ "], ["attack", " \n \n ▄ \n ▄▀█ ▄▀▀█▀ \n ▄▀▀▀▀ ▀▄ \n █ ▄▄▀ █ \n █▄▄▄ █ \n █▄█▄▄▄▄▄▄█▄▄█ "], ["eat_1", " \n \n ▄ \n ▄▀█ ▄▀▀█▀ \n ▄▀▀▀▀ ▀▄ \n █ ▄▄▀ █ \n █▄▄▄ █ \n █▄█▄▄▄▄▄▄█▄▄█ "], ["eat_2", " ▄ \n ▄▀█ ▄▄▀▀▄ \n ▄▀▀▀▀▀▄ ▄▀▀ \n █ ▄▄▄▄▀▀ █ \n ▀█▄██▄█▄ █ \n █▀█▀█▀█ █ \n █▀▀▀▀▀▀ ▄▀ \n █▄██▀▀▀█▄▄█ "], ["happy", " \n █▀▀▄ ▄▀▀█ \n ▀▄ ▀▀▀▀▀▀ ▄▀ \n █ ▀▀ ▀▀ █ \n █ █▄▄█▄▄▄▄█ █ \n █ ███▀▀▀▀██ █ \n ▀▄▄▀▀▀▀▀▀▀ ▄▄▀ \n █▄█▀▀▀▀▀▀▄▄█ "], ["injured_1", " \n \n ▄ \n █▀▀▄ █▀▄ \n ▀▄ ▀▀▀▀▀ █ \n █ █ \n █▀▀▄▀▄ ▀▀ █ \n █▄▀▄▄▄▄▄▄▄▀▄█ "], ["injured_2", " \n \n ▄ \n █▀▀▄ █▀▄ \n ▀▄ ▀▀▀▀▀ █ \n █ █ \n █▀▀▄▀▄ ▀▀ █ \n █▄▀▄▄▄▄▄▄▄▀▄█ "], ["refuse", " \n \n ▄ \n ▄▀█ ▄▀▀█▀ \n ▄▀▀▀▀ ▀▄ \n █ ▄▄▀ █ \n █▄▄▄ █ \n █▄█▄▄▄▄▄▄█▄▄█ "], ["sleep_1", " \n \n ▄ \n █▀▀▄ █▀▄ \n ▀▄ ▀▀▀▀▀ █ \n █ █ \n █▀▀▄▀▄ ▀▀ █ \n █▄▀▄▄▄▄▄▄▄▀▄█ "], ["sleep_2", " \n \n ▄█ ▄▄▄▄ \n █ ▀▄▄▄▄█ ▄▀ \n ▄▀ ▀▄ \n █▄▄ ▄ ▄▄ █ \n ▀▄ ▀ ▀ ▄▀ \n █▄█▀▀▀▀▀▄▄█ "], ["walk_1", " \n \n ▄█ ▄▄▄▄ \n █ ▀▄▄▄▄█ ▄▀ \n ▄▀ ▀▄ \n █ █ ▄ █ █ \n ▀▄ ▀ ▀ ▄▀ \n █▄█▀▀▀▀▀▄▄█ "], ["walk_2", " \n \n ▄ \n █▀▀▄ █▀▄ \n ▀▄ ▀▀▀▀▀ █ \n █ ▄ ▄ █ \n █ ▀▄▀▄ ▀ █ \n █▄▀▄▄▄▄▄▄▄▀▄█ "]]], + ["tokomon_x", [["angry", " \n ▄▀▀▄▀▀▀▀▄ \n █ ▄▀ ▄▀▀▀▀ \n ▄▀ ▄ ▀█▀▀▀▄ \n █▄▀▀ ▀▀▄ █ \n █▀▀▄ ▀▀ █ \n █ ▀ ▀▀▀ █ \n ▀▄█▀▀▄▄▀▀▀█▄▀ "], ["attack", " ▄▀▀▄▀▀▀▀▄ \n ▄▀▄ ▀▄▄██▀▀ \n ▄▀▀ ▀▀ ▄ ▀▄ \n ▀▄▄█▄▄▄▀▀ █ \n ██████ █ \n ██████ █ \n ▄▀▀▀▀▀▀ █ \n █▄▀▀▀▀▄▄█▀▀▄█ "], ["eat_1", " ▄▀▀▄▀▀▀▀▄ \n ▄▀ ▀ ▄▀▀▀▀ \n █▄▀▄▄▀ ▀▀▀▄ \n █ ▄ ▀▀ █ \n ▀█████▄ █ \n ███▀▀█ █ \n ▄▀▀▀▀▀▀ ▄▀ \n █▄▀▀▀▀▄▄▀▀▄█ "], ["eat_2", " \n ▄▀▀▄▀▀▀▀▄ \n █ ▄▀ ▄▀▀▀▀ \n ▄▀ ▄ ▀█▀▀▀▄ \n █▄▀▀ ▀▀▄ █ \n █ ▀ ▄ ▀ ▀ █ \n █ ▀ ▀▀ █ \n ▀▄█▀▀▄▄▀▀▀█▄▀ "], ["happy", " ▄▀▄▀▀▀▀▀▄ \n ▄▀ ▄▀▀▀▀▄▀ \n █▄▀▄▄▀ ▄ ▀▄ \n █ ▄ ▀ ▀ ▀▄ \n ███████ █ \n ██████ █ \n ▄▀▀▀▀▀ ▄▀ \n █▄▀▀▀▀▄▄▀▀▄█ "], ["injured_1", " \n ▄▄ ▄▄▄▄ \n █ ▄▀ ▄▄ ▀▄ \n ▄▀ ▄ ▀█ ▀▄▄▀ \n █ ▀▀ ▀▀ █ \n █▄▀ ▀▄▄ █ \n █ ▄▄ ▄▄ ▄█ \n█▄█▄██▄█▄▄█▄█▄▄█"], ["injured_2", " \n \n ▄▀▀▄▀▀▀▀▄ \n █ ▀ ▄█▀▄ ▀▄ \n ▄▀▄▄▀▄▄▀ ▀▀▄ \n █ ▀▄ \n █▀▀ ▀▀█▄ ▄█ \n█▄█▄██▄█▄▄█▄█▄▄█"], ["sleep_1", " \n ▄▄ ▄▄▄▄▄ \n ▄▀ ▄▀ ▄▄▄▀ \n █ ▀ ▄█▄▄▄ \n ▄▀▄▄▀▄▄▀ ▀▄ \n █▄▄ ▄▄▄ ▀▄ \n █▄ ▄▄▄ ▄█ \n█▄▄█▄▄█▄▄▄█▄█▄▄█"], ["sleep_2", " \n ▄▄ ▄▄▄ \n ▄▀▄▀▀ ▄ ▀▄ \n ▄▀ ▄ ▀█▀▀▀▄ \n █ ▀▀ ▀▀ █ \n █▀▀ ▀▀▀ █ \n █▄ ▄▄▄ ▄█ \n█▄▄█▄▄█▄▄▄█▄█▄▄█"], ["walk_1", " ▄▄ ▄▄▄▄ \n ▄▀ ▄▀ ▄▄▄█ \n █ ▀ ▄█▄▄▄ \n ▄▀▄▄▀▄▄▀ ▀▄ \n █ ▄ ▄ ▀▄ \n █ ▀ ▄ ▀ █ \n █ ▀▀ ▀▀ ▄▀ \n █▄▀▀▀▀▄▄▀▀▄█ "], ["walk_2", " \n ▄▀▀▄▀▀▀▀▄ \n █ ▄▀ ▄▀▀▀▀ \n ▄▀ ▄ ▀█▀▀▀▄ \n █ ▀▀ ▀▀ █ \n █ █ ▄ █ █ \n █ ▀ ▀ █ \n ▀▄█▀▀▄▄▀▀▀█▄▀ "]]], + ["toropiamon", [["angry", "▄▀█ ▄▄▀▀█ \n█ ▄▄▀ ▄ ▄█ ▄ ▄▄\n█▀ ▀▀ █ ███▀\n▀▄▄██▄█ █▀▀██▀▀▀\n ▄▀█▀ ██▀ █ ▀▄\n ▀▄█▀▀ ▀▄▄▄▀ ▀█\n ▄██▄ ██▄▄█▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["attack", " ▄▄ ▄▄▄ \n█ ▀ ▄▀▀ █ \n█▄▀▀ ▄█ ▀▀▄ █▄██\n█ ▄▄ ▄ ▄▄█▄███▄\n ▀▀▄▄█▄██ ▀██ ▄ \n ▄▀██▀▄▀▀ █ ▄█\n ▄█▄█ ▀▄▄▄██▄▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["eat_1", " ▄▄ ▄▄▄ \n█ ▀ ▄▀▀ █ \n█▄▀▀▄▀▄ ▀▀▄ █▄██\n█ ▄▄ ▄ ▄▄█▄███▄\n ▀▀▄▄█▄██ ▀██ ▄ \n ▄▀██▀▄▀▀ █ ▄█\n ▄█▄█ ▀▄▄▄██▄▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["eat_2", "▄▀█ ▄▄▀▀█ \n█ ▄▄▀ ▄█ ▄ ▄▄\n█▀ ▀▀ █ ███▀\n▀▄▄██▄▀▄█▀███▀▀▀\n ▄▀▀▀▄▀█▄ ▀█ ▀▄\n █▀█▀ █ ▄█ ▀█\n ▄██▄ ▀██▄▄█▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["happy", "▄▀█ ▄▄▀▀█ \n█ ▄▄▀▄ █▄▄▄ ▄▄\n█▀ ▀ ▀ █ ███▀\n▀▄▄██▄▀▄█▀ ▄█▀▀▀\n ▄▀▀▀▄▀▄▄██▀ ▀▄\n █▀█▀ ▀▄ ▀█\n ▄██▄ █▄▄██▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["injured_1", " \n ▄▄ ▄▄▄ \n█ ▀ ▄▀▀ █ ▄ ▄▄\n█▄▀▀ █▄ ▀▀▄ ███▀\n█ ▄▄ ▄ ▄▄███▀█▀\n ▀▀▄▄█▄▀█▄ ▀█ ▄█\n ▄█▄█▀ █ ▄█▄▄▀\n█▄█▄▄█▄▄████▄█▄█"], ["injured_2", " \n \n▄▀█ ▄▄▀▀█ \n█ ▄▄▀▄ ▄█ █▄██\n█▀ ▀▀ █████▄\n▀▄▄▀▀▄▀▄█▀▀██ ▀▄\n ▄███▀ ▄▀▀ █▄██\n█▄█▄▄█▄█▄▄▄█▄█▄█"], ["refuse", " ▄▄ ▄▄▄ \n█ ▀ ▄▀▀ █ \n█▄▀▀ ▄█ ▀▀▄ █▄██\n█ ▄▄ ▄ ▄▄█▄███▄\n ▀▀▄▄█▄██▄ ▀█ ▄ \n ▄▀██▀ █▀ █▄█\n ▄█▄█ ▀▄▄█▄▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["sleep_1", " \n ▄▄ ▄▄▄ \n█ ▀ ▄▀▀ █ \n█▄▀▀ ▄▄ ▀▀▄ █▄██\n█ ▄▄ ▄ ▄▄█▄███▄\n ▀▀▄▄█▄██ ▀██ ▄ \n▄▀█▀██▀▄█▀█▀█▀▄█\n█▄▄▄█▄▄██▄▄▄▄▄█ "], ["sleep_2", " \n \n▄▀█ ▄▄▀▀█ \n█ ▄▄▀ ▄█ ▄ ▄▄\n█▀ ▀▀ █ ███▀\n▀▄▄▀▀▄▀▄█▀███▀▀▀\n▄▀█▀██▀▀█▀█▀█▀█▄\n█▄▄▄█▄▄██▄▄▄▄▄█▀"], ["walk_1", "▄▀█ ▄▄▀▀█ \n█ ▄▄▀ ▄ ▄█ ▄ ▄▄\n█▀ ▀▀ █ ███▀\n▀▄▄▀▀▄▀▄█▀███▀▀▀\n ████▀█▄ ▀█ ▀▄\n █ █▀ █ ▄█ ▀█\n ▄██▄ ▀██▄▄█▀ \n █▄█▄▄█▀█▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄▄ \n█ ▀ ▄▀▀ █ \n█▄▀▀ ▄█ ▀▀▄ █▄██\n█ ▄▄ ▄ ▄▄█▄███▄\n ▀▀▄▄█▄██ ▀██ ▄ \n ▄▀██▀▄▀▀ █ ▄█\n ▄█▄█ ▀▄▄▄██▄▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"]]], + ["tortomon", [["angry", " ▄ \n █▄ ▄▀█ \n █ ▀▄▄▀ ▄█ ▄█\n █▀▄ █▀ ▀▀▀ █\n █▄▀▀▄▄▀▀▄▄▄▄ █ \n █ ▄▄ ▄▄ █ ▀ █\n █ ▄▄▄▄▄▄ █▄ ▄▄▀\n█▄▀▄▄▄▄▄▄▀▄▄▀▄▄█"], ["attack", " █▄ ▄ \n █ ▀▄▀▀▄▄▄▀█ \n ▀▄ ▄▀▀▄ ▄█ ▄█\n █▄▀▀ ▄█ █ ▀█▀ █\n ▀▄ ▄ ▄ █ ▄▄ █ \n █████ █▄▄ ▀ █\n ▄▄▀█▀█▀ █▄ ▄▄▀\n█▄▀▄▄▄▄▄▀▄▄█▀▄▄█"], ["eat_1", " █▄ ▄█ \n █ ▀▄▄ ▄▀ █ ▄\n ▀▄ ▄▀▀▄▀█ ▄▀█\n █▄▀▀ ▄▄ █ ▀█▀ █\n █▄▄▄▄▄▄ █ ▄▄ █ \n ███▀▀█ █▄▄ ▀ █\n ▄██▄▄▄█ █▄ ▄▄▀\n█▄▀▄▄▄▄▄▀▄▄█▀▄▄█"], ["eat_2", " ▄ \n █▄ ▄▀█ \n █ ▀▄▄▀ ▄█ ▄█\n ▄▀▀ ▄▄▀ ▀▀▀ █\n ▄▀▄▄▀ ▀▄ ▄▄ █ \n █▀ ▀▀ █▄▄ ▀ █\n █▄▄▄▄▄█ █ ▄▄▀\n█▄▀▄▄▄▄▄▀▄▄█▀▄▄█"], ["happy", " █▄ ▄ \n █ ▀▀▄ ▄▄▀█ ▄\n ▄▀▀▀▄▀▀▀▄ █▄▀█\n █ ▄▀▄ ▄▀▄ █ ▀ █\n █ ▄ ▄▄▄ ▄ █▄▄ █\n █ ███████ █▄ █ \n █ ▀█▄▄▄█▀ █▄ █▄\n█▄█▄▄▄▄▄▄▄█▄▄▀▄█"], ["injured_1", " \n ▄ \n ▄ ▄▀█ \n ▄▀█▄▀ ▄█ ▄█\n ▄▀▀ ▄ ▀▀ █\n ▄▀▄▄▀▀▄ ▄▄ █ \n █▄ ▄▄▄▀▄▄▄ ▀ █\n ▀▄▄▄▄▄▄▄█▄▄▄▄▄▀"], ["injured_2", " \n \n ▄ ▄█ \n █▀▄ ▄▀▄█ ▄█ \n ▄▀ ▀ ▀▀▀ █ \n ▄▀▄▄▀▀▄ ▄▄ █ \n █▄ ▄▄▀▄▄▄ ▀ █ \n█▄▄▄▄▄▄▄█▄▄▄▄▄▄█"], ["sleep_1", " \n \n ▄ ▄█ \n █▀▄ ▄▀ █ ▄\n ▄▀ ▀▀ ▀▀▄▄▀█\n ▄▀▄▄▀▀▄ ▄▄ ▄▀\n █▄ ▄▄ ▀▄▄▄ ▀ █\n▀▄▄▄▄▄▄▄▄█▄▄▄▄▄▀"], ["sleep_2", " \n ▄ \n █▄ ▄▀█ ▄\n █ ▀▄▄▀ ▄█ ▄▀█\n █ ▄▄ ▀▀ ▄▀\n █ ▀▀ ▀▄ ▀▀▄▀▄\n █▀ ▀▀ █▀▀ █\n ▀▄██▄▄▄▄█▄▄▄▄▄▀"], ["walk_1", " ▄ \n █▄ ▄▀█ \n █ ▀▄▄▀ ▄█ ▄█\n ▄▀▀ ▄▄▀ ▀▀▀ █\n ▄▀▄▄▀ ▀▄ ▄▄ █ \n ██ █ █▄▄ ▀ █\n █▄▄▄▄▄ █ ▄▄▀\n█▄▀▄▄▄▄▄▀▄▄█▀▄▄█"], ["walk_2", " \n ▄ ▄█ \n █▀▄ ▄▀ █ ▄\n █▄ ▀▀▄ ▀█▄▄▀█\n █ ▄▀▀▄ ▄▀\n █▄▀▀ ▄ █ ▀▀▄▀▄\n █▀ ▀ ██▀ ▄▄▀\n█▄███▄▄▄█▄▄██▄▄█"]]], + ["toyagumon", [["angry", " ▄▄ ▄▄ \n ▄▄ █████████ \n ███████▀▄███ \n ████████████ \n █▄▄▄▄ ▄▄▄ ▄█ \n █ █ █ ▀ █▄ \n ▀██▄ ▀▀██▄▄█ \n ██████▀█▄▄▄▄▄█ "], ["attack", " ▄██▄▄██▄▄██▄ \n ███████▀ ▄██ \n ▀▄ ▀█▄▄███▄ \n █ █▀▀█ █ \n █▀▀▀▀▀▀ ▀▀ ▄▀ \n ▀▀█▀▀ ▀▀▄▄ \n ▄▄██▄▄▄▄▄▄▄▄▀ \n ██████ █▄▄▄▄▄█ "], ["eat_1", " ▄██▄▄██▄▄██▄ \n ██████▀▄▄▀██ \n ▀▄ ▀██████ \n ▄▄█▄▄▄▀▀▀▀▀█ \n █▄▄▄▄ ▄▄██ \n █▄█ █▄▄▀█ \n ▄▄██▄▄▄▄▄▄▄█ \n ██████ █▄▄▄▄▄█ "], ["eat_2", " ▄▄ ▄▄ \n▄▄ █████████ \n██████▀▀████ \n█████▄██▄███ \n█▄▄▄▄▄ ▄█ \n █▀█ █▀▀ ▀▄▄ \n ██▄ ▀▀█▄▄▄█ \n ██████▀█▄▄▄▄▄█ "], ["happy", " ▄██▄▄██▄▄██▄ \n ███████▀▄▄▀█ \n █ ██████▄▄ \n ▄▀ ▄▀▀▀▀█ █ \n █▀▀▀▀ ▄ ▄▄▄█ \n ▀▀█▀▀ ▀▀█ \n ▄▄██▄▄▄▄▄▄▄█ \n ██████ █▄▄▄▄▄█ "], ["injured_1", " \n ▄▄██▄██▄▄ \n ██▄██▀██████ \n ██████▄▄▄███ \n █▀▀▀▀▀▀▀▀▀▀█ \n ▀▀██▀▀ ▀▀▄ \n █▄█ ▀▄▄▄█ \n █████▄▄▄▄█▄▄▄▄█"], ["injured_2", " \n ▄▄ ▄▄ \n▄▄ █████████ \n█████▀██████ \n██████▄▄████ \n█▄▄▄▄▄ ▄ ▀▄ \n █▄█ ▀▄▄▄█ \n █████▄▄█▄▄▄▄█ "], ["sleep_1", " \n ▄▄ ▄▄ \n▄▄ █████████ \n████████████ \n██████▄▄▄███ \n█▄▄▄▄▄ ▄ ▄▀▀▀▄ \n ███▀ ▄▀ █ █ \n ███▄▄█▄▄▄█▄▄▄█ "], ["sleep_2", " \n ▄▄██▄██▄▄ \n ██▄█████████ \n ██████▀▀▀███ \n █▀▀▀▀▀▀▀▀▀▀█ \n ██▀█▀▀▄ ▄▀▀▀▄ \n ███▀ ▄▀ █ █ \n ███▄▄█▄▄▄█▄▄▄█ "], ["walk_1", " ▄▄██▄██▄▄ \n ██▄███▀▀████ \n ██████▀ ███ \n █▀▀▀▀▀▀▀▀▀▀█ \n ▀███▀▀ ▄▄ █▀ \n █▄█ █▄▄ ▀█ \n ▄▄██▄▄▄▄▄▄▄█ \n ██████ █▄▄▄▄▄█ "], ["walk_2", " ▄▄ ▄▄ \n▄▄ █████████ \n██████▄ ▀███ \n██████▄▄▄███ \n█▄▄▄▄▄ ▄█ \n █▀█ █▀▀ ▀▄▄ \n ▄██▄ ▀▀▀▄▄▄█▄ \n██████▀▀▀█▄▄▄▄▄█"]]], + ["triceramon", [["angry", " █▀▄ █▀▀▀▀▄ \n█▀▄█▄█▀ ▄▀ ▀▄ \n▀▄▀ ▄█ ▄▄ █ \n █ ▄▄▄▄ ▄ █ \n █▀▀▀▀▀▄▄▄█▄▄▀▄\n █ ▀█▀▀ █ █ ▄█\n ▄█▀█ ▀█▄▀▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["attack", " █▀▄ █▀▀▀▀▄ \n█▀▄█▄█▀ ▄▀ ▀▄ \n▀▄▀ ▄█▀ ▄▄ █ \n █ ▄ ▄ ▄ █ \n ▀█████▄▄▄▄▄▀▀▄\n▄▀▀█████ █ ▀ ▄█\n▀▄▄█▄ █▀▀▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["eat_1", " █▀▄ █▀▀▀▀▄ \n█▀▄█▄█▀▄▄ ▄▀ ▀▄ \n▀▄▀ ▀ ▄▄ █ \n █▄█████ ▄ █ \n █▀ █▄▄▄█▄▄▀▄\n ▄▀█▀▀▀ █ █ ▄█\n █▄▀█▀ ▀█▀▀▀▄▀\n█▄▄▄▄██▀▀█▄█▄█▄█"], ["eat_2", " █▀▄ █▀▀▀▀▄ \n█▀▄█▄█▀ ▄▀ ▀▄ \n▀▄▀ █▀ ▄▄ █ \n █ ▄ █ \n █▄▄▄▄▀▀▄▄█▄▄▀▄\n █ █ █ █ ▄█\n ▄█▀█ ▀█▀▀▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["happy", " █▀▄ █▀▀▀▀▄ \n█▀▄█▄█▀ ▄▀ ▀▄ \n▀▄▀ ▄▀▄ ▄▄ █ \n █▄▄▄▄▄▄▄ ▄ █ \n▄▀▀▄▀████ ▄▀▀▄▀▄\n█ ▀▄███▀ ▀ █▄█\n ▀█▀▄▄ ▄▀▀ ▄▀\n █▄▄▄██▀▀█▄█▄█▄█"], ["injured_1", " ▄▄ ▄▄▄▄▄ \n▄▄ █ █▄▀ ▄▀▄ \n█ █▀▀▀▄ ▀ █ \n █ ▀▀▀ ▀▀ █ \n ▀▄███▄ ▀▄ █▄\n ▄▀▄▄▄ ▄▀▀▀▀█▀ █\n ▀▄▄█ ▀▄▄▄▀▀▀▀▄\n █▄▄█▄▄▄█▄█▄█▄▄█"], ["injured_2", " \n █▀▄ █▀▀▀▀▄ \n█▀▄█▄█▀ ▄▀ ▀▄ \n▀▄▀ ▄ ▄▄ █ \n █ ▀▀▀ ▄ █ \n █▄█▀▀▀ ▄▄▄▄█▄▀▄\n█ ▄█▀▀▀█ █▄▄▄▀\n █▄▄█▄▄▄███▄▄▄▄█"], ["sleep_1", " \n █▀▄ █▀▀▀▀▄ \n█▀▄█▄█▀ ▄▀ ▀▄ \n▀▄▀ ▄▄▄ █ \n █ ▄▄▄ ▀▄ █▄\n ▄▀█▄▄▄▄▄▀▀█▀▀▄▀\n █ ▄▀ █▀ █ █\n █▄█▄▄█▄▄▄█▄▄▄▄█"], ["sleep_2", " ▄▄ ▄▄▄▄▄ \n▄▄ █ █▄▀ ▄▀▄ \n█ █▀▀▀ ▀ █ \n █ ▀▀▀ ▄ █ \n ▀▄▀▀▀▀▀▄ ▀▄▀▄\n ▄▀█▀▀ ▀▀█▀▀▄▀\n █ ▄▀ █▀ █ █\n █▄█▄▄█▄▄▄█▄▄▄▄█"], ["walk_1", " █▀▄ █▀▀▀▀▄ \n█▀▄█▄█▀ ▄▀ ▀▄ \n▀▄▀ █▀ ▄▄ █ \n █ ▄▄▄▄▄ ▄ █ \n ██▄▄▄ ▀▄▄█▄▄▀▄\n █ █ █ █ ▄█\n ▄█▀█ ▀█▀▀▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["walk_2", " ▄▄ ▄▄▄▄▄ \n▄▄ █ █▄▀ ▄▀▄ \n█ █▀▀▀▄▄ ▀ █ \n █ ▀ ▀▀ █ \n ▀▄█▀▀▀▀▄ ▀▄ █ \n ▄▀▀█▀▀ ▄▀▀▀█▀ █\n ▀▄▄█ ▀▄▄▄▀▄▀█\n █▄▄█▄▄▄▄█▄▄▄▄█ "]]], + ["triceramon_x", [["angry", " ▄▄ ▄▄▄▄▄ \n▄▄ ▀▄▀▀█ ▄▀▄ \n█ █▄▄▀▀ ▄ ▀ █ \n▀▄▀ ▀▀ ▀▀ █ \n ▀▄▀▀▀▀▀▄ ▀▄ ▄█ \n ▄▀█▀▀ ▄▀▀███▀ \n ▄█▄█ ▀▄▄▄██▄ \n█▄█▄█▄▄▄▄█▄█▄█▄█"], ["attack", " █▀▄▄█▀▀▀▀▄ \n█▀▄ ▀▄▄▀ ▄▀ ▀▄ \n█ █▀▀ ▄█▀ ▄▄ █ \n █ ▄ ▄ ▄ ▄ █ \n ▀█████▄▄▄▀▀██ \n▄▀▀█▀▀▀ █ ▀▄▄█▀ \n▀▄▄██▀▀▀ ▄ ▀█ \n█▄█▄▄██▀▀█▄█▄█▄█"], ["eat_1", " █▀▄▄█▀▀▀▀▄ \n█▀▄ ▀▄▄▀ ▄▀ ▀▄ \n█ █▀▀ ▀▀▄ ▄▄ █ \n █ ▄▄▄▄▄ █ \n ▀████▀▄ ▀▄ ▄█ \n ▄▀▄▄▄█▀▀█▀██▀ \n ▄█▄█ ▀▄▄█▄██▄ \n█▄█▄█▄▄▄▄█▄█▄█▄█"], ["eat_2", " ▄▄ ▄▄▄▄▄ \n▄▄ ▀▄▀▀█ ▄▀▄ \n█ █▄▄▀▀▄ ▀ █ \n▀▄▀ ▀ ▀ ▀▀ █ \n ▀▄▀▀▀▀▀▄ ▀▄ ▄█ \n ██▀▀▄██▀▀██▀ \n ▄█▄█ █ █▄██▄ \n█▄█▄█▄▄▄████▄█▄█"], ["happy", " █▀▄▄█▀▀▀▀▄ \n█▀▄ █▄▀▄ ▄▀ ▀▄ \n█ █▀ ▀ ▀ ▄▄ █ \n █ ████▄ █ \n ▀▄▀▀▀▀▄ ▀▄ ▄█ \n ▄▀█▀▀▄▀▀█▀██▀ \n ▄█▄█ ▀▄▄█▄██▄ \n█▄█▄█▄▄▄▄█▄█▄█▄█"], ["injured_1", " ▄▄ ▄▄▄▄▄ \n▄▄ ▀▄▀▀█ ▄▀▄ \n█ █▄▄▀▀▄ ▀ █ \n▀▄▀ ▀▀ ▀▀ █ \n ▀▄███▄ ▀▄ ▄█ \n ▄▀▄▄▄ ▄▀▀▀▀█▀██\n ▀▄▄█ ▀▄▄▄▀▀▀▄█\n █▄▄█▄▄▄▄█▄█▄█▄█"], ["injured_2", " \n █▀▄▄█▀▀▀▀▄ \n█▀▄ ▀▄▄▀ ▄▀ ▀▄ \n█ █▀▀ █▄ ▄▄ █ \n █ ▄▄▄▄ ▄ █ \n ▄▀▄▄▄▄▄▀▀▀▀█▀█▄\n ▀▄█ ▀▄▄▄▀▀▀▄█\n █▄▄█▄▄▄▄█▄█▄█▄█"], ["sleep_1", " \n \n █▀▄▄█▀▀▀▀▄ \n█▀▄ ▀▄▄▀ ▄▀ ▀▄ \n█ █▀▀ ▄▄▄ ▄▄ █ \n █ ▄▄▄▄▄ ▄ █ \n▄▀█▄▄▄▄▄█▀█▀▀▀▄ \n█▄█▄▄█▄▄█▄█▄▄▄█ "], ["sleep_2", " \n ▄▄ ▄▄▄▄▄ \n▄▄ ▀▄▀▀█ ▄▀▄ \n█ █▄▄▀▀ ▀ █ \n▀▄▀ ▀▀▀ ▀▀ █ \n ▀▄▀▀▀▀▀▄ ▀▄ ▄▀ \n▄▀█▀▀█▀▀▄▀█▀▀▀▄ \n█▄█▄▄█▄▄█▄█▄▄▄█ "], ["walk_1", " █▀▄▄█▀▀▀▀▄ \n█▀▄ ▀▄▄▀ ▄▀ ▀▄ \n█ █▀▀ ▄█▀ ▄▄ █ \n █ ▄▄▄▄▄ ▄ █ \n ▀▄▄▄▄ ▀▄▄█▄█▄ \n █ █ █ █ █▀ \n ▄▄▀█ ▀█▀▀ █ \n█▄█▄▄██▀▀█▄█▄█▄█"], ["walk_2", " ▄▄ ▄▄▄▄▄ \n▄▄ ▀▄▀▀█ ▄▀▄ \n█ █▄▄▀▀▄▄ ▀ █ \n▀▄▀ ▀▀ ▀▀ █ \n ▀▄▀▀▀▀▀▄ ▀▄ ▄█ \n ▄▀█▀▀▄▀▀█▀██▀ \n ▄█▄█ ▀▄▄█▄██▄ \n█▄█▄█▄▄▄▄█▄█▄█▄█"]]], + ["troopmon", [["angry", " ▄▄▄▄ ▄▄ \n ▄▀ ▀███▄▄▀ \n █ ▄ ▀███ \n █ ▀▀ ▄█▀▀ \n ▄▀▄ ▄█ ██▄ \n ██ ██████▄▀██ \n ▄███▀████▄ \n █▄█▄█ █▄█▄█ "], ["attack", " ▄▀▀▀██▄▄▄ \n ▄▀ ▄▀█▄▄▀ \n ▄ █▄██▄▀▀ █▀▄▄ \n██ █████ █ ███\n▀█ █▀██▀ ▄█ ███▀\n ▀█▄▄▄███ \n ████████▄ \n █▄█▄█ █▄█▄█ "], ["eat_1", " ▄▀▀██▄▄▄ \n █ ▄ ▀█▄▄▀ \n █ ▀ ▀ ███ \n▄▄ ██████ █▀▄▄▄ \n███ ██▄▄▀▄▀▄██▀ \n ▀▀ █▄▄▄▄█▄▀ \n ▄███▀████▄ \n █▄█▄█ █▄█▄█ "], ["eat_2", " ▄▀▀██▄▄▄ \n █ ▀█▄▄▀ \n █ ▄▀▄ ███ \n █ ▄█▀▀ \n ▄█ █▄▄▄██ ███▄ \n ▀█ ██████▄▀███ \n ▄███▀████▄ \n █▄█▄█ █▄█▄█ "], ["happy", " ▄▀▀▀▀█▄ \n ▄▀ ▄ █▀▄ \n ▄ █ ▀ ▀▄█▀▄▄▄\n██▄▀▄ ▄█▀▄██▀\n ▀▀▄██████▀ ▀▀ \n ███████▄ \n ▀███████▄ \n █▄█▄██▄█▄█ "], ["injured_1", " \n ▄▄▄▄ \n ▄▀ ▀███▀▀▄ \n █ ▄ ▀███ \n █ ▀▀ ██▀ \n ▀▄ ▄████▄▄ \n ▄█▄▀▀▀██ ███▄▀▄\n████ ███▀▄████▄█"], ["injured_2", " \n \n ▄▀▀███▄ ▄▄ \n█ ▀▀██▄▄▀ \n█ ▄ ███ \n █ ▀▀ ▄███▄▄▄ \n ▄▀▄▄▄▀▀█ ███▄▀▄\n███▄ ▄██▀▄████▄█"], ["sleep_1", " \n ▄▄▄▄▄ \n ▄▀ ▀██▄▄ \n █ ▄ █▄▄▀ \n █ ▀▀ ███ \n ▄█▄ ▄████▄ \n █ ▀█████▀ █ \n ██▄▄▄████▄▄███ "], ["sleep_2", " \n ▄▀▀██▄ \n █ ▀█▄▄ \n █ ▄▄▀ █▄▄▀ \n █ ▄███ \n ▄▄█▄▄▄█████▄ \n █ ▀█████▀ █ \n ██▄▄▄████▄▄███ "], ["walk_1", " ▄▀▀██▄▄▄ \n █ ▄ ▀█▄▄▀ \n █ ▄█ ███ \n █ ▄█▀▀ \n ▄█ █▄▄▄██ ███▄ \n ▀█ ██████▄▀███ \n ▄███▀████▄ \n █▄█▄█ █▄█▄█ "], ["walk_2", " ▄▄▄▄ \n ▄▀ ▀██▀▀▄ \n ▄▀ ▀▄ ███ \n █ ▀▀ ███ \n ▄▀▄ ▄█▀▄▄ \n▄██ ██████ ███▄ \n▀▀▄ ███████▄▄▄▀ \n █▄█▄█▀ ▀█▄█▄█ "]]], + ["tsubumon", [["angry", " \n \n \n ▄▄▄▄ \n ▄▀▀ ▄▄▀ \n ▄▀▀ ▀█ \n █ █▄ ▄█ █ \n ▀▄▄▄▄▄▄▄▀ "], ["attack", " \n ▄▄▄▄▄ \n ▄▀▀ ▄▄▀ \n ▄▀ ▄█ █ \n █▄▄▄▄ █ \n ████▄ █ \n ▄█████ █ \n ▀▄▄▄▄▄▀ "], ["eat_1", " \n \n ▄▄▀▀▀█ \n ▄▄▀ ▄▄▀▀ \n ▄▀▄ ▄▀▄ \n █ ▄█▄ █ \n █ ███ █ \n ▀▄▄▄▄▄▀ "], ["eat_2", " \n \n \n ▄▄▄▄ \n ▄▀▀ ▄▄▀ \n ▄▀▀ ▀█ \n █▄▀▄ ▄▀▄█ \n ▀▄▄▄▄▄▄▄▀ "], ["happy", " \n ▄▄ \n ▄▀ █ \n ▄▄▀ ▄█ \n ▄▀▄ ▄▀▄ \n █▀ ▀ ▀ ▀█ \n ▀▄ ███ ▄▀ \n ▀▀▀▀▀ "], ["injured_1", " \n \n \n ▄▄▄▄ \n ▄▀▀ ▄▄▀ \n ▄▀▀ ▀█ \n █ ▄█ █▄ █ \n ▀▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n \n \n ▄▄▄▄▄▄ \n ▄▄▀▀ ▄▄▄▄▀ \n ▄▀ ▄ ▄ ▀▄ \n ▀▄██▄██▄▀ "], ["sleep_1", " \n \n \n ▄▄▄▄ \n ▄▀▀ ▄▄▀ \n ▄▀▀ ▀█ \n █ ▀▀ ▀▀ █ \n ▀▄▄███▄▄▀ "], ["sleep_2", " \n \n \n ▄▄▀▀▀█ \n ▄▄▀ ▄▄▀▀ \n ▄▀▄▄ ▄▄▀▄ \n █ ▄▄▄ █ \n ▀▄▄▄▄▄▀ "], ["walk_1", " \n \n \n ▄▄▀▀▀█ \n ▄▄▀ ▄▄▀▀ \n ▄▀▄ ▄▀▄ \n █ ▄▀▄ █ \n ▀▄▄▄▄▄▀ "], ["walk_2", " \n \n \n ▄▄▄▄ \n ▄▀▀ ▄▄▀ \n ▄▀▀ ▀█ \n █ ▀ ▄ ▀ █ \n ▀▄▄▄▄▄▄▄▀ "]]], + ["tsumemon", [["angry", " \n \n \n ▄▀▀▀▄▀▀▄ \n ▄▀█▀▀▄▀▀▄█ \n █ █▄█ █ ▀ \n ▄▀ ▄ ▄ ▀▄ \n █▄▀█▄▀▀▄█▀▄█ "], ["attack", " \n ▄▀▀▀▄▀▀▄ \n ▄▀▀▀▀▄▀▀▄█ \n █ ▄█▀ █ ▀ \n █▄▄▄▄ ▀▄ \n ▄▀█████ █ \n ▄▀ ▄ ▄ ▄ █ \n █▄▀█▄▀▀▄█▀▄█ "], ["eat_1", " \n ▄▀▀▀▄▀▀▄ \n ▄▀█▀▀▄▀▀▄█ \n █ █▄█ █ ▀ \n █ ▄▄▄▄ ▀▄ \n ▄▀ ████ █ \n ▄▀ ▄ ▄ ▄ █ \n █▄▀█▄▀▀▄█▀▄█ "], ["eat_2", " \n \n ▄▄▄ ▄▄ ▄▄\n █▄▄▄▀▄▄▀▄▀\n ▄▀ ▀▄ ▀ \n █ ▄▀▄ █ \n ▄▀ ▄ ▄ ▀▄ \n █▄▀█▄▀▀▄█▀▄█ "], ["happy", " \n ▄▀▀▀▄▀▀▄ \n ▄▀▀▀▀▄▀▀▄█ \n █ ▄▀▄ █ ▀ \n █ ▄▄▄▄ ▀▄ \n ▄▀ ▀██▀ █ \n ▄▀ ▄ ▄ ▄ █ \n █▄▀█▄▀▀▄█▀▄█ "], ["injured_1", " \n \n \n ▄▀▀▀▄▀▀▄ \n ▄▀▀▀▀▄▀▀▄█ \n █ ▀▄▄ █ ▀ \n ▄▀ ▄ ▄ ▀▄ \n █▄▀█▄▀▀▄█▀▄█ "], ["injured_2", " \n \n \n ▄▄▄ ▄▄ \n █▄▄▄▀▄▄▀▄ \n ▄▀ ▄ ▀▄ ▀█ \n ▄▀ ▀▀ ▀▄ \n █▄▀▄█▀▄▄▄▀▄█ "], ["sleep_1", " \n \n \n ▄▀▀▀▄▀▀▄ \n ▄▀▀▀▀▄▀▀▄█ \n █ ▄▄▄ █ ▀ \n ▄▀ ▄ ▄ ▀▄ \n █▄▀█▄▀▀▄█▀▄█ "], ["sleep_2", " \n \n ▄▄▄ ▄▄ \n █▄▄▄▀▄▄▀▄ \n ▄▀ ▀▄ ▀█ \n █ ▀▀▀ █ \n ▄▀ ▄ ▄ ▀▄ \n █▄▀█▄▀▀▄█▀▄█ "], ["walk_1", " \n \n ▄▀▀▀▄▀▀▄ \n ▄▀▀▀▀▄▀▀▄█ \n █ ▄▀▄ █ ▀ \n █ ▀▀▀ ▀▄ \n ▄▀ ▄▀ ▄ █ ▀▄ \n █▄▀█▄▀▀▄█▀▄█ "], ["walk_2", " \n \n ▄▄▄ ▄▄ ▄▄\n █▄▄▄▀▄▄▀▄▀\n ▄▀ ▄ ▀▄ ▀ \n █ █▄█ █ \n ▄▀ ▄ ▄ ▀▄ \n █▄▀█▄▀▀▄█▀▄█ "]]], + ["tsunomon", [["angry", " \n \n ▄▀▄ \n ▄▀ █ \n ▄█▄█████▄ \n ██▀ ▄ ▄████ \n █ ▀▀ ▀███ \n ▀▄▄▄▄▄▄█▀ "], ["attack", " ▄▄▀█ \n ▄██▄▄█▄▄ \n ▄▀ ▀▀ ▀▀▄▀█▄ \n ▀█▀▀█▀▄▀▀ ▀█ \n █ █ \n ▄█▄▄█▄█ ██ \n ▀▄▄▄▄▄▄▄▀▀ \n ▄▄▄▄▄▄▄ "], ["eat_1", " \n ▄▄▀█ \n ▄▄██▄▄█▀ \n █▄▄ ▀▀██▄ \n ▀ █▀▄▄█ ██▄ \n █ ███ \n █▄█▄▄█ ███ \n ▀▄▄▄▄▄▄█▀▀ "], ["eat_2", " \n \n ▄▀▄ \n ▄▀ █ \n ▄█▄█████▄ \n ██▀▄▄ ▀████ \n █ ▀ ▀ ▀███ \n ▀▄▄▄▄▄▄█▀ "], ["happy", " \n ▄▀▄ \n ▄█ █▄▄▄ \n ▄▀▄▀▄▀▄ ▀█▄ \n █ ▀ ▀ ▀█ \n █ █▄▄▄▄█ █ \n █ ▀████▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["injured_1", " \n \n ▄▀▄ \n █ ▀▄ \n █ ▄█████▄ \n ██▀▀ ▄ ▀██ \n █▄▄ ▀▀ ▀█ \n ▀▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n ▄▄ \n █ █ \n █ ██████▄ \n █▄█▀▀▀▀▀███ \n █ ▀▄▄ ██ \n ▀█▄▄▄▄▄█▀ "], ["sleep_1", " \n \n ▄▀▄ \n █ █ \n ▄██▄████▄ \n █▀ ▀█▀ ▀██ \n █▀▀▄▄▄▀▀ ▀█ \n ▀▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n ▄▀▄ \n █ █ \n ▄██▄████▄ \n █▀ ▀█▀ ▀██ \n █▀▀▄▄▄▀▀ ▀█ \n █ █ \n ▀▄▄▄▄▄▄▄▀ "], ["walk_1", " \n \n ▄▀▄ \n █ █ \n ▄██▄████▄ \n █▀▄▀█▀▄ ▀██ \n █ ▀ ▄ ▀ ▀█ \n ▀▄▄▄▄▄▄▄▀ "], ["walk_2", " \n ▄ \n █ █ \n ▄█ █▄▄▄ \n ▄█▀███▀▀██▄ \n █ █ ▀ █ ██ \n █ ▀▀▀ █ \n ▀▄▄▄▄▄▄▄▀ "]]], + ["tumblemon", [["angry", " \n \n ▄▄▄▄▄ \n ▄▀ ▀▄ \n █ ▄▄▄▄▄▄ █ \n █ ▀▀▀ █ \n █ █ \n ▀▄▄▄▀▄▄▄▀ "], ["attack", " \n ▄▄▄▄▄▄▄ \n ▄▀ ▀▄ \n ██▄▄▄▄▄▀ █ \n █ █▄ █▄ █ \n ██▄▄████ █ \n █ ▀ ▀ ▀ ▀ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ "], ["eat_1", " \n ▄▄▄▄▄▄▄ \n ▄▀ ▀▄ \n ██▄▄▄▄▄▀ █ \n ███████ █ \n ███████ █ \n █ ▀ ▀ ▀ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ "], ["eat_2", " \n \n \n ▄▄▄▄▄▄ \n ▄▀▄▄▄▄ ▀▄ \n ██▀▄▄▀█▄ ▀▄ \n █ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ "], ["happy", " \n ▄▄▄▄▄ \n ▄▀ ▀▄ \n █ ▄█▀▀▀█▄ █ \n █ █▄███▄█ █ \n █ ▀ ▀ ▀ █ \n ▀▄ ▄▀ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["injured_1", " \n \n \n \n ▄▀▀▀▀▀▀▀▄ \n █ ▀████▀ ▀▄ \n █ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["injured_2", " \n \n \n \n \n ▄▀▀▀▀▀▀▀▄ \n █ ▄▄▄▄▄▄ ▀▄ \n ▀▄▄████▄▄▄▄▀ "], ["sleep_1", " \n \n \n \n ▄▄▄▄▄ \n ▄▀ ▀▄ \n ▄▀ ▀███▀ ▀▄ \n █▄▄▄▄▄▄▄▄▄█ "], ["sleep_2", " \n \n \n ▄▀▀▀▀▀▄ \n █ █ \n █ ▀███▀ █ \n █ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["walk_1", " \n \n ▄▄▄▄▄ \n ▄▀ ▀▄ \n █ ▀█▀█▀█▀ █ \n █ ▀▀▀ █ \n █ █ \n ▀▄▄▄▀▄▄▄▀ "], ["walk_2", " \n \n \n ▄▀▀▀▀▀▄ \n ▄▀▄▄▄▄▄▄▄▀▄ \n █ ▀▄█▄▀ █ \n █ █ \n ▀▄▄▄▀▀▀▄▄▄▀ "]]], + ["turuiemon", [["angry", " ▄ ▄ ▄ \n ▄▀█ █ █ █▀▀▄ \n▄▀▄▀▄ ▄ ▀▄ █ \n█ █ ▀▀▄ ▀▀ █▄ █\n█ █▄ ▀ ▀▀ ▄▀█ █\n█▄▀▄▀████▀█▀▄▀▄█\n █ ▄▀ █ █ \n ███▄▄▀▀█▄██▄█ "], ["attack", " ▄▀▄▀▄▀▄▄ \n ▄▀ ▀▄ \n █▄ ▄█▀ ▀▄ ▀▄\n ▀▄▄▄ █ █\n ▄▄▄█▀▀ ▄▄▄▀█ █\n█ ▄▄███ ▀ █▄ █\n ▀▀ ▄▀ ▄█▀▀▀▄ ▀▀\n █▄▄█ ▀▄▄▄█ "], ["eat_1", " ▄▄▀▄▀▄▀▄▄▄ \n ▄▀▄▀ ▀ ▀ ▀▄ ▀▄ \n█ █▄▀▄ ▄▀▄ █ ▀▄\n█ █ ▄▄▄▄ ██ █\n█ █▄▄ ███▄▄▄▀█▄█\n▀█▀ █▀▀█ ▀█ ▀\n ▀█▀ ▄▄ ▀▀█ \n █▄▄▄▀ ▀▄▄▄█ "], ["eat_2", " ▄ ▄ ▄ \n ▄▀█ █ █ █▀▀▄ \n▄▀▄▀▄ ▄ ▀▄ ▀▄\n█ █▀ ▀▄ ▀ ▀ █▄ █\n█ █▄ ▀ ▀▀ ▄▀█ █\n▀▀█▀▀████▀▀▀▀▄▀▀\n ▀▄█ ▀▄▄▀ \n █▄▄▄▄▀▀▀▄▄▄█ "], ["happy", " ▄▄▀▄▀▄▀▄▄▄ \n ▄▀▄▀ ▀ ▀ ▀▄ ▀▄ \n█ █▄▀▄ ▄▀▄ █ ▀▄\n█ █ ▄▄▄▄▄▄ █ █\n█▀▀▄ ████ ▄▀▀▄ █\n▀▄▄▄▀▄▄▄▄▀ ▄▄▀▀▀\n ▄▀ ▄▄ ▀▄ \n █▄▄▄▀ ▀▄▄▄█ "], ["injured_1", " \n ▄ ▄ ▄ \n ▄▀█ █ █ █▀▄ \n █▄▀▄ ▄ ▀▄ █ \n █ █▀ ▄ ▀▀ █ █\n █ ▀▄▄▄▄▄▄▄▄▀█ █\n ▄▀█ ▀█▀▄▀ █▀█ █\n █▄█▄▄█▄█▄▄█▄█▀ "], ["injured_2", " \n \n ▄▄▀▄▀▄▀▄▄ \n ▄▀▄▀ ▀ ▀ █ ▀▄ \n▄▀█▄▀ ▀▄▄ █ ▀▄ \n█ ▀▄ ▀▄▄ ▄▀█ █ \n▀▄█ ▀██▀█▀ █▀▄█ \n ██▄▄█▄▄█▄▄█▄█ "], ["sleep_1", " \n ▄ ▄ ▄ \n ▄▀█ █ █ █▀▀▄ \n▄▀▄▀ ▀▄ █ \n█ █ ▀▀▄ ▀▀ █▄ █\n█ █▄ ▀ ▀▀ ▄▀█ █\n█▄▀▄█▀██▀█▀▀▄█ █\n █▄█▄█▄▄█▄▄█▄█ "], ["sleep_2", " \n ▄▄▀▄▀▄▀▄▄▄ \n ▄▀▄▀ ▀ ▀ ▀▄ ▀▄ \n█ █ ▄▄ ▄▄ █ ▀▄\n█ █ ▄▀▄▄ ██ █\n█ █▀▄▄▄▄▄▄▄█ █ █\n▀▀ ▄█▀█▀▀▄▀ █▄▀▀\n █▄█▄█▄▄█▄▄█▄█ "], ["walk_1", " ▄▄▀▄▀▄▀▄▄▄ \n ▄▀▄▀ ▀ ▀ ▀▄ ▀▄ \n█ █ █ █ █ ▀▄\n█ █ ▄▀▄▄ ██ █\n█ █▀▄▄▄▄▄▄▄█ █ █\n▀▀▄▀ █▀▀▀▄▀ █ ▀▀\n ▀▄▀ ▄▄ ▀▄▄▀ \n █▄▄▄▀ ▀▄▄▄█ "], ["walk_2", " ▄ ▄ ▄ \n ▄▀█ █ █ █▀▀▄ \n▄▀▄▀ ▄ ▄ ▀▄ ▀▄\n█ █ ▀▄ ▀ █▄ █\n█ █▄ ▀ ▀▀ ▄▀█ █\n▀▀▄▀▀████▀▀▀▀▄▀▀\n ▀▄▀ ▀▄▄▀ \n █▄▄▄█▀▀▀▄▄▄█ "]]], + ["tuskmon", [["angry", " █▀█▄▄▄ ▄▀█\n ▄▄█▄██▀ ██ ▄▀ █\n ▀█▀█▀█▀████ ▄▀\n ██▄ █ \n ▄ ▄ ▄ █▀▀██ \n▄▄▀▀█████ ███▀▄█\n▀█▄███████▄▄▄██▀\n█▄█▄██▀▀▀█▄█▄█▄█"], ["attack", "▄▄ ▄▄ ▄▄\n█ █ █▀▄█▀▀█▄ █ █\n█ ▄████▄▄███▀ █\n▀▄▀█▀█▀█▀██▀ █ \n ▀▄▄▄▄▄▄███▄▄▀▄\n ██ ███▀▄▄██▀█▄█\n ▄▄████▄▀▀██▄██▀\n█▄█▄██▀▀▀█▄█▄█▄█"], ["eat_1", "▄▄ ▄▄ ▄▄\n█ █ █▀▄█▀▀█▄ █ █\n█ ▄████▄▄███▀ █\n▀▄▀█▀█▀█▀██▀ █ \n ▀▄▄▄▄▄▄███▄▄▀▄\n ██ ███▀▄▄██▀█▄█\n ▄▄████▄▀▀██▄██▀\n█▄█▄██▀▀▀█▄█▄█▄█"], ["eat_2", "█▀▄ ▄█▀▄▄▄▄ ▄▀█\n█ ▀▄█▄█▀▄▄▀█▄▀ █\n█ ██████▀███ ▄▀\n ▀▄█ ▄██▄ █ \n ▄▄▀████▀▀████ \n ██ ███ ████ █▄█\n ▄█████▄▄▄▄███▀\n █▄█▄███▀█▄█▄█▄█"], ["happy", "█▀▄ ▄█▀▄▄▄▄ ▄▀█\n█ ▀▄█▄█▀▄▄▀█▄▀ █\n█ ██████▀███ ▄▀\n ▀▄█ ▄██▄ █ \n ▄▄▀████▀▀████ \n ██ ███ ████ █▄█\n ▄█████▄▄▄▄███▀\n █▄█▄███▀█▄█▄█▄█"], ["injured_1", "▄▄ ▄▄ \n█ █▀▄█████▄ █ █ \n█ █ ▄███▀███ █ \n ▀▄███▄▄███ █ \n ██████▀▄██▄█▄ \n▄ ▀▀▀▀▄█▀▄█▄█▄█\n███ ██▀▄▄ ██████\n████▄█▄▀█▄▀████▀"], ["injured_2", "▄▄ ▄▄ \n█ █▀▄█████▄ █ █ \n█ █ ▄███▀███ █ \n ▀▄███▄▄███ █ \n ██████▀▄██▄█▄ \n▄ ▀▀▀▀▄█▀▄█▄█▄█\n███ ██▀▄▄ ██████\n████▄█▄▀█▄▀████▀"], ["refuse", "▄▄ ▄▄ ▄▄\n█ █ █▀▄█▀▀█▄ █ █\n█ ▄████▄▄███▀ █\n▀▄▀█▀█▀█▀██▀ █ \n ▀▄▄▄▄▄▄███▄▄▀▄\n ██ ███▀▄▄██▀█▄█\n ▄▄████▄▀▀██▄██▀\n█▄█▄██▀▀▀█▄█▄█▄█"], ["sleep_1", "▄▄ ▄▄ \n█ █▀▄█████▄ █ █ \n█ █ ▄███▀███ █ \n ▀▄███▄▄███ █ \n ██████▀▄██▄█▄ \n▄ ▀▀▀▀▄█▀▄█▄█▄█\n███ ██▀▄▄ ██████\n████▄█▄▀█▄▀████▀"], ["sleep_2", "▄▄ ▄▄ \n█ █▀▄█████▄ █ █ \n█ █ ▄███▀███ █ \n ▀▄███▄▄███ █ \n ██████▀▄██▄█▄ \n▄ ▀▀▀▀▄█▀▄█▄█▄█\n███ ██▀▄▄ ██████\n████▄█▄▀█▄▀████▀"], ["walk_1", "█▀▄ ▄█▀▄▄▄▄ ▄▀█\n█ ▀▄█▄█▀ ▄██▄▀ █\n█ ████▀█████ ▄▀\n ▀▄█▄▄▄▄▄██▄ █ \n ▄▄▀████▀▀████ \n ██ ███ ████ █▄█\n ▄█████▄▄▄▄███▀\n █▄█▄██▀▀█▄█▄█▄█"], ["walk_2", "▄▄ ▄▄ ▄▄\n█ █ █▀▄█▀▀█▄ █ █\n█ ▄████▄▄███▀ █\n▀▄▀█▀█▀█▀██▀ █ \n ▀▄▄▄▄▄▄███▄▄▀▄\n ██ ███▀▄▄██▀█▄█\n ▄▄████▄▀▀██▄██▀\n█▄█▄██▀▀▀█▄█▄█▄█"]]], + ["tylomon", [["angry", " ▀ ▄▀▀█ \n ▀ ▄▄▄█▄ █ \n ▄▀ ▀▄ \n▄▀▀ ▄█ █ \n█▀█▀█▀▄ ▄▄ ▄ █ \n ▄ ▄ █ ▀▄▄▄▀ █ \n█▀▀▀▀▀ ▄▀ ▄▀ ▀▄\n ▀▀▀▀▀▀ █▄▄▀▄█"], ["attack", " ▄ ▄▀▀█ \n ▄▄▄█▄ █ \n▀ ▄▀ ▀▄ \n▄▀▀ ▄ ▀█ █ \n█▀▀▀▀ ▀▀ █ \n ▀▄▄▄▄▄ ▄▄▄ █ \n ▀▄█ ▀▄█ ▄▀ ▀▄\n █▄▄▀▄█"], ["eat_1", " ▄▀▀█ \n ▄▄▄█▄ █ \n ▄▀ ▀▄ \n▄▀▀ ▄▀█ █ \n█▀▀▀▀▀ █ \n ▀▄▄▄▄ ▄▄▄ █ \n ▀▄█▀▄█ ▄▀▀ █ \n ▀▀█▄▄█"], ["eat_2", " ▀ ▄▀▀█ \n ▀ ▄▄▄█▄ █ \n ▄▀ ▄▄ ▀▄ \n▄▀▀ ▀ ▀ █ \n▀▀▀▀▀█ █ \n▄▄▄▄▄▀ ▄▄▄ █ \n▀▄▄▄▄▄▄▀▄█ ▄▀ ▀▄\n █▄▄▀▄█"], ["happy", " ▄▀▄ ▄▀▀█ \n▄ ▀ ▄▄▄█▄ █ \n ▄▀ ▄ ▀▄ \n▄▀▀ ▀ ▀ █ \n▀▀▀▀███ ▄▄▄▄ █ \n ▄▀▀ █ ▄▀ █ \n█▀▀▀▀▀ ▄▀▀▀█▀ ▀▄\n ▀▀▀▀▀▀ █▄▄▀▀▀"], ["injured_1", " ▄ ▄▄▄▀▀█\n ▄▀▀█▄ █ \n▀ ▄▄█▄ █ █ █\n ▄▀ ▀▄ █\n▄▀▀ █▄ █\n█▀▀▀▀▄ ▄▀ \n ▀▄▄▄▄▄ ▄▄▀▀ \n ▀▄█▀▄█ "], ["injured_2", " ▄▄▄\n ▄▄█▀▀ ▄▀\n ▄▀ █▀▄ ▀▄\n ▄▀▀▀▀ ▀▄▀ █\n ▄█ ▄ ▀ █\n█▄▄▄▄ ▀▀ ▄▀\n▀▄ ▀ ▄▄▄▀ \n ▀▀▀▀▀▄▄▄▄▀ "], ["refuse", " ▀ ▄▀▀█ \n ▀ ▄▄▄█▄ █ \n▀ ▄▀ ▀▄ \n▄▀▀ ▄█▀ █ \n█▀▀▀▀ ▄ █ \n▄▀▄▄▄▀ █▄▄ █ \n ▀▀ ▀▀▀ ▄▀▀ ▄▀ \n ▀▀█▄▄█ "], ["sleep_1", " ▄▄▄\n ▀ ▄▄█▀▀ ▄▀\n▄ ▄▀ █▀▄ ▀▄\n ▄▀▀▀▀ ▀▄▀ █\n ▄█ ▀ █\n█▄▄▄▄ ▀▀ ▄▀\n▀▄ ▄▄▄▀ \n ▀▀▀▀▀▄▄▄▄▀ "], ["sleep_2", " ▄▄▄\n ▄▄█▀▀ ▄▀\n ▄▀ █▀▄ ▀▄\n ▄▀▀▀▀ ▀▄▀ █\n ▄█ ▀ █\n█▄▄▄▄ ▀▀ █\n▀▄ ▄ ▄▀ \n ▀▀▀▀▀▄▄▄▄▀▀ "], ["walk_1", " ▄ ▄▀▀█ \n ▄▄▄█▄ █ \n▀ ▄▀ ▀▄ \n▄▀▀ ▄ ▀█ █ \n█▀▀▀▀ ▀▀ █ \n ▀▄▄▄▄▄ ▄▄▄ █ \n ▀▄█ ▀▄█ ▄▀ ▀▄\n █▄▄▀▄█"], ["walk_2", " ▄ █▀▀▄▀▀█\n ▄▀▀█▄ █ \n▀ ▄▄█▄ █ █ █\n ▄▀ ▀▄ █\n▄▀▀ ▄ ▀█ █\n█▀▀▀▀ ▀▀ ▄▀ \n ▀▄▄▄▄▄ ▄▄▀▀ \n ▀▄█ ▀▄█ "]]], + ["tylomon_x", [["angry", " \n \n ▄█ \n ▄█▀▄█ ▄█\n█▀▀▄▄▀████▀█▀█ █\n▀▄██▄▄█▀▀ ▄█▄\n ▀▀▄▄▄▄▄▄██▄█▄▀▀\n ▀██▄ "], ["attack", " ▄ ▀ ▄ \n ▀▄▀ ▄▄▀█ ▄\n█▀▀▄▄▀███▄██▄▄▀█\n▀▄██▄▄███▀ ▀ ▀▄▀\n ▀▀▄▄ ▀▄▄ ▄▀██\n █▀ ▄▄▀▀███▄ \n ▀▀▀▀ ▄ \n ▀▄▀ "], ["eat_1", " \n ▄ \n ▄▄▀█ ▄\n█▀▀▄▄▀███▄██▄▄▀█\n▀▄██▄█▄██▀ ▀ ▀▄▀\n ▀▀▄▄ ▄ ▄▄ ▄▀██\n █▀ ▄▄▀▀██▄ \n ▀▀▀ ▀▀▀ "], ["eat_2", " \n \n ▄█ \n ▄█▀▄█ ▄█\n█▀▀▄▄▀████▀█▀█ █\n▀▄██▄█▄▀▀ ▄█▄\n ▀▀▄▄▄▄▄▄██▄█▄█▀\n ▀▀▀▀▀▀"], ["happy", " ▄ \n ▄▀▄ ▄█ \n ▀ ▄█▀▄█ ▄█\n█▀▀▄▄▀████▀█▀█ █\n▀▄██▄█▄█▀ ▄█▄\n ▀▀▄ ▄▄██▄▀ ▀▀\n ▀▀▀ ▀██▄ \n "], ["injured_1", " \n ▄ \n ▀▄▀ ▄ \n ▄ ▄▄▀█ ▄\n▄▄▄ ▄▄██▄██▄▄▀█\n█ ▄██ ▀██▀ ▀ ▀▄▀\n ██▀▀▀▀ ▄▄ ▄▀██\n ▀▀▀▀▀▀▀█████▄"], ["injured_2", " \n ▄ \n ▄ \n ▀▄▀ ▄█ \n ▄█▀▄█ ▄█\n█▀▀▄▄▀████▀█▀█ █\n▀▄███▄▄▀▀ ▄▄▄█▄\n ▀▀▄▄▄▄▄███████▀"], ["sleep_1", " \n ▄▀▄ \n ▀ ▄ \n ▀ ▄▄▀█ ▄\n▄▄▄ ▄▄██▄██▄▄▀█\n█ ▄█▀▀███▀ ▀ ▀▄▀\n ██▀▀▀▀ ▄▄ ▄▀██\n ▀▀▀▀▀▀▀█████▄"], ["sleep_2", " \n ▄ \n ▄▀▄ ▄█ \n ▀ ▄█▀▄█ ▄█\n█▀▀▄▄█████▀█▀█ █\n▀▄██▄▄█▀▀ ▄█▄\n ▀▀▄▄▄▄▄▄██▄█▄█▀\n ▀▀▀▀▀▀"], ["walk_1", " \n ▄█ \n ▄█▀▄█ ▄█\n█▀▀▄▄▀████▀█▀█ █\n▀▄██▄▄█▀▀ ▄█▄\n ▀▀▄▄▄▄▄▄██▄▀ ▀▀\n ▀██▄ \n "], ["walk_2", " \n \n ▄█ \n ▄█▀▄█ ▄█\n█▀▀▄▄▀████▀█▀█ █\n▀▄██▄▄█▀▀ ▄█▄\n ▀▀▄▄▄▄▄▄██▄█▄█▀\n ▀▀▀▀▀▀"]]], + ["tyrannomon", [["angry", " ▄▄▄▄▄ ▄▄ \n ▄█ ▄ ▀▄▀ \n▄▀▀▄▄ ▀ ▄█▀█ \n▀█▀ ▀ ▀▀▀██▄▄ \n ▀▀█▀▀ ██▀█▄▀ \n▄▀▀█ █ █▀█\n▀▄▄▀▄ ▀█▀▀▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["attack", " ▄▄▄▄▀▀▀▀▀▄▀█ \n █▄▄▄ ▄ ▄█▀ █▄▄ \n ▀█████ ▄▄██▄▀ \n ▄████▀ ▄▄█▀█ \n ▀▄▄▄▄▄▀ ▄█▀▀▄ \n ▄▀ █ ▄█\n ▄█▀▄ █▀▀▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["eat_1", " ▄▀▀▀▀▀▄▀█ \n▄▀▀▀ ▄▀█▀ █▄▄ \n▀██▄█▄ ▄▄██▄▀ \n ▄████ ▀▀██▀█ \n █▄▄▄▄▀▄▀▀ ██ \n ▀▄█ ▀▄▄▄█ █▀█\n ▄▄▀▄ ▄ ▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["eat_2", " ▄▄▄▄▄ ▄▄ \n ▄█ ▄▄ ▀▄▀ \n▄▀▀ ▄ ▀ ▀▄█▀█ \n▀█▀▀▀▀ ▀▀▀██▄▄ \n ▀▀█▀▀ ██▀█▄▀ \n▄▀▀█ █ █▀█\n▀▄▄▀▄ ▀█▀▀▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["happy", " ▄▀▀▀▀▀▄▀█ \n▄▀▀▀ ▄▀▀▄ █▄▄ \n▀▀▀▀▀▄ ▄▄██▄▀ \n ▄▄▄▄█ ▄▄██▀█ \n ▀▄▄▄▄▀ ▄▄ ▀██ \n █ █ █ ▄ █▀█\n ▄█▀▄ ▀▀█ ▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄▀"], ["injured_1", " ▄▄▄▄▄ ▄▄ \n ▄█ ▄ ▀▄▀ \n▄▀▀ ▄ ▀▄ ▄█▀█ \n▀█▀▀▀▀ ▀▀██▄▄ \n ▀▀█▀▀ ██▀█▄▀ \n▄▀▀█ █ █▀█\n▀▄▄▀▄ ▀█▀▀▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["injured_2", " ▄▄▄▄▄ ▄▄ \n ▄█ ▄ ▀▄▀ \n▄▀▀ ▄ ▀▄ ▄█▀█ \n▀█▀▀▀▀ ▀▀██▄▄ \n ▀▀█▀▀ ▀███▄▀ \n ▄▀█ ▄▀ █▀█\n █▀▀▄ ▀▄▄█▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄▀"], ["sleep_1", " \n ▄▀▀▀▀▀▄▀█ \n ▄▄▀▀ ▄▄▄ █▄▄ \n█▄▄▄█▄ ▄▄██▄▀ \n ▀▄▄▄▄▄ ▄▄██▀█ \n ▄▀ ▀█▀█\n ▄██ ▄▀ █▀▄▀\n█▄█▄█▄▄▄█▄▄█▄█▄█"], ["sleep_2", " ▄▄▄▄▄ ▄▄ \n ▄█ ▀▄▀ \n ▄▀▀ ▄ ▀▀▀ ▄█▀█ \n ▀█▀▀▀▀ ▀▀▀██▄▄\n ▀▀█▀▀ ▀▀██▄▀\n ▄▀ ▄▀ █▀█\n ▄█▀▄ █ █▀▄▀\n█▄█▄▄█▄▄▄███▄█▄█"], ["walk_1", " ▄▀▀▀▀▀▄▀█ \n ▄▄▀▀ ▄▀█▀ █▄▄ \n█▄▄▄█▄ ▄▄██▄▀ \n ▀▄▄▄▄▄ ▄▄██▀█ \n ▄▄▀ ▄▄ ▀██ \n █ █ █ ▄ █▀█\n ▄█▀▄ ▀▀█ ▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄▀"], ["walk_2", " ▄▄▄▄▄ ▄▄ \n ▄█ ▄▄▄▀▄▀ \n▄▀▀ ▄ ▀ ▀ ▄█▀█ \n▀█▀▀▀▀ ▀▀▀██▄▄ \n ▀▀█▀▀ ██▀█▄▀ \n▄▀▀█ █ █▀█\n▀▄▄▀▄ ▀█▀▀▀▄▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"]]], + ["tyrannomon_x", [["angry", " \n ▄▄▄▄▄▄ \n ▄▄▀▀ ▄ ▀▄▄▀ \n█ ▀▀ ▀█▄▀ ▄▄\n▀█▀▀▀▄ ▀▀▄█▄█ █\n ▀▀▄ ▄ ▄ █\n ▄▀▀▄ █ █ ▄ ██\n █▄█▄▄█▄██▄█▄█▄█"], ["attack", " ▄▄▄▄▄▄▄ \n▄▀▀▀ ▄█ ▀▄▄▀ \n█▄▄▄▄ ▀█▄▀ ▄▀█\n █████ █ █ █ █\n █████ ▄▀ ▄▀▀ █\n ▀▄▄▄ ▄ ▄ █ \n ▄▀ ▀▄ ▄▀ ▄ █ \n █▄█▄▄▄▀█▄█▄█▄█ "], ["eat_1", " ▄▄▄▄▄▄▄ \n▄▀▀▀ ▄ ▀▄▄▀ \n█▄▄▄▀ ▀ ▀█▄▀ ▄▄\n ▀██▀▀█ ▀▀▄▀ █ █\n ▄▀▀▀▀ ▄▄ ▀▀ █\n ▀▀█ █▄▄▄▀ ▄ ▄▀\n █ ▀▄ █ ▄ █ \n █▄█▄▄▀█▄█▄█▄█ "], ["eat_2", " \n ▄▄▄▄▄▄ \n ▄▄▀▀▄ ▀▄▄▀ \n█ ▀ ▀ ▀█▄▀ ▄▀█\n▀█▀▀▀▀ ▀▀▄█▄▀ █\n ▀▀█ ▄ ▄ ▄ █\n ▄▀▀█ █▄█▀ ▄ █▀\n█▄█▄▄█▄▄▄█▄█▄█▄█"], ["happy", " ▄▄▄▄▄▄▄ \n▄▀▀▀ ▄ ▀▄▄▀ \n█▄▄▄▀ ▀ ▀█▄▀ ▄▀█\n █████ ▀▀▄▀ █ █\n ████▀▄▀▀▀ ▀▀ █\n ▀▄▄▄ ▀▀▀▄▀ ▄ █ \n ▄▀ ▀▄ █ ▄ █ \n █▄█▄▄▄▀█▄█▄█▄█ "], ["injured_1", " \n ▄▄▄▄▄▄ \n ▄▄▀▀ ▀▄▄▀ \n█ █▄ ▀█▄▀ ▄▄\n▀█▀▀ ▀▀▄█▄█ █\n ▀▀▄ ▄ ▀ █\n ▄▀▀▄ █ ▄▀ ▄▀▄█\n █▄█▄█▄▄██▄█▄█▄█"], ["injured_2", " \n \n ▄▄▀▀▀█▀▀▄ \n▄▀▀ ▄ ▄█▀▄ \n█▄▄▄ ▀▀ ▄█▀▄ ▄▀█\n ▀▄▄▄ ▀ ▀▀ █\n ▄▀▀▄ █ ▄▀ ▄▀▄█\n █▄█▄█▄▄██▄█▄█▄█"], ["sleep_1", " \n \n ▄▀▀▀██▀▀▄ \n █ ▄█▀▄ ▄▀█\n █ ▄▄ ▄█▀▄▄▀ █\n█ ▄ ▄ ▄▄▄ █\n █▄▄▄▀ █ ▄▀ ▀ █▀\n █▄▄▄█▄▄██▄▄▄▄██"], ["sleep_2", " \n ▄▄▄▄▄▄▄ \n ▄▀ ▀▀▄▄▀ \n ▄▀ ▀█▄▀ ▄▀█\n▄▀ ▀▀ ▀▀▄█▄▀ █\n▀▄ ▄▀ ▄ ▄▄▄ █\n █▀▀█ █ ▄▀ ▀ █▀\n █▄▄▄█▄▄██▄▄▄▄██"], ["walk_1", " \n ▄▄▀▀▀█▀▀▄ \n▄▀▀ ▄█▀ ▄█▀▄ ▄▄\n█▄▄▄▄▄ ▄█▀▄ █ █\n ▀▄▄▄ ▄ ▀▀▀ █\n █ █ ▄▀ ▄ ▄▀\n █ ▀▄ █ ▄ █ \n █▄█▄▄▀█▄█▄█▄█ "], ["walk_2", " \n ▄▄▄▄▄▄ \n ▄▄▀▀▄▄ ▀▄▄▀ \n█ ▀▀ ▀█▄▀ ▄▀█\n▀█▀▀▀▀ ▀▀▄█▄▀ █\n ▀▀█ ▄▀ ▄ ▄ █\n ▄▀▀▄ ▀▄█ ▄ █▀\n █▄█▄▄█▄▄█▄█▄█▄█"]]], + ["ulforceveedramon", [["angry", " ▄▄ ▄▄ \n ▄▀▄█▀▄▀▄▀▄ \n █ ▄ ██▄ ▀▄\n █ ▀▀ ▄▀▀▀█ █\n █▀▄▄▀▀██▄▄█ █\n ▄▀█ ▀ ▄█ ▀ █ █\n ▀▄▀▀████▀▀▀▀█▀█\n █▄█▄▄█ █▄█▄█▄█ "], ["attack", " ▄▄▄ ▄▄▄ ▄▄▄ \n▄▀ █▀▄▀▄█▀▄▀▄▀█ \n█ ██ ▄▄ ██▄ ▀▄\n█ █ ▀▀ ▄▀▀▀█ █\n▀▄▀█▀▄▄▀▀ █▄▄█ █\n ▀▄█ ▀ ▄▀█ █ █\n ▀▄▀▀▀██▄ ▀▀▄▀█\n █▄█▄▄█ ▀▄█▄█▄█ "], ["eat_1", " ▄▀█▄▄▀█▄ \n ▄▀ ▀▀ ▄█▀ █ \n ▄▀ ▄▀▄ █▄█▄ █\n ▄▄▀██▄ ▄▀▀▀█ █\n█ █▀██▀█▀▀▄▄█ █\n ▀▄█ ▀ ▄█▄▄▄██ █\n ▄▀▀███▄ ▀█▀▄█\n █▄█▄█ █▄█▄█▄█ ▀"], ["eat_2", " ▄▄ ▄▄ \n ▄▀▄█▀▄▀▄▀▄ \n █ ▄ ██▄ ▀▄\n █ ▀ ▀▄████ █\n ▄█▀▄▄█▀▀▄ █ █\n █ █ ▀ ▄███▀▀█ █\n █▀▀██▄▄ ▀▀█▀▀█\n █▄█▄█ █▄█▄█▄█ "], ["happy", " ▄▀█▄▀█ ▄ \n ▄▀ ▀▀ █▄█ █ \n ▄▀ ▄▀▄█ █ █\n █▄ ▄▄█ ▄██ █\n ▄▄█ █▀ ▄██▄▄█ █\n█ █▄▄▄█▀ ▀███ █\n ▀█▀ ▄▄▄▄▄ ▀█▄█\n █▄█▄█ █▄█▄█▄█▀"], ["injured_1", " \n ▄▀█▄▀█ ▄ \n ▄▀ ▀▀ █▄▀ ▀▄\n ▄▀ ▀▄▄ ███▄ █\n █▄ ▄▄▀▄ █ █\n ▄▄█ █▀▄▄█▄███ █\n █▄▀▄▄█ ▀ ▀ ██ █\n █▄▄▄██▄▄▄▄█▀ ▀█"], ["injured_2", " \n ▄▄ ▄▄ \n ▄▀▄█▀▄▀▄▀▄ \n █ ▄ ██▄ ▀▄ \n █ ▀▀▄█▀▀▀▄ █\n ▄██▄▄▀█▄▄█▄▄█ █\n █▄▀▄▄█ ▀ ▀ ██ █\n █▄▄▄██▄▄▄▄█▀▀▄█"], ["sleep_1", " \n ▄▄ ▄▄ \n ▄▀▄█▀▄█ ▄ \n █ ▄ ▄ █▄▀ █ \n █ ▀▀ ▄▀▀▀▄ █▄\n▄▄█▀▄▄▀███▄▄█▄ █\n█▄▀▄▄▄█ ▀ ▀ ██ █\n█▄▄▄████▄▄▄█▀▀▄█"], ["sleep_2", " \n ▄▀█▄▀█ \n ▄▀ ▀▀ █ ▄▀▄ \n ▄▀ █▄▀ █▀▄ ▀▄ \n █▄ ▄▄█▀▀▀█ ▀█\n▄▄█ █▀▄▄██▄▄██ █\n█▄▀▄▄██ ▀ ▀ ██ █\n█▄▄▄████▄▄▄█▀ ▀▀"], ["walk_1", " ▄▀█▄▀█ ▄ \n ▄▀ ▀▀ █▄▀ █ \n ▄▀ ▄█▀ ███▄ █\n █▄ ▄▄▀▄ █ █\n ▄▀█ █▀ ▄▀ ▀██ █\n ▀▄█▄▄▄█▀▄▄▄██ █\n ▄▀ ▄▄▄▄ ▀█▀▄█\n █▄█▄█ █▄█▄█▄█ ▀"], ["walk_2", " ▄▄ ▄▄ \n ▄▀▄█▀▄▀▄▀▄ \n █ ▄▄ ██▄ ▀▄\n █ ▀▀ ▄▀▀▀█ █\n ▄█▀▄▄▀▀▄▀▄▄█ █\n █ █ ▀ ▄██ █ █\n ▄▀▀▀███▄ ▀▀▀█▀█\n█▄█▄▄▄▀ ▀▄█▄█▄█ "]]], + ["ulforceveedramon_x", [["angry", " ▄▄ ▄▄ \n ▄▀█ ▀▀▀ █▄▀▄ \n ▄▀▀ ▄█ █▀ █ \n █ ▄▄▀█▀▀▀█ █\n █▀██▀ █ ▄▄█ █\n▄▀█▄ ▄▀▀█ ▄▀▀▄█\n▀▄▀▀▄██▄▄█▀▀▀▄ █\n█▄█▄▄█ ▀█▄█▄█▄█ "], ["attack", " ▄█▀█▄▄▀█ \n █▄▀ ▄▄ ▄█▀▄ \n █ ▀▀ ▄█▄▄▄█\n ▀▄▄▄▄▄▀ ▄▄▀█\n ▄▀▀▀▀▀█▀███▀▄ █\n▀▄ ▄▀█ █ ▀█\n ▄▀▀████▀██▀ ▀▄ \n█▄█▄▄█▀ █▄▄█▄█"], ["eat_1", " ▄▄█▀█▄▄▀█ ▄ \n █▄▀ ▄ ▄█▀ ▀▄ \n █▄▄▄▀ ▀ █▄▄▄▄▀▄\n ███ ▄█ ▄▀ █\n █▄▄▄▄██▄█▀█▄ █\n █ █ ▀ █ █▄▀ ▀█\n ▄▀▀█▄███▀▀▀▄ ▀\n█▄█▄▄█ █▄█▄█▄█ "], ["eat_2", " ▄▄ ▄▄ \n ▄▀█ ▀▀▀ █▄▀▄ \n ▄▀▀ ▄▀▄ █▀ █ \n █ ▄▄▀█▀▀▀█ █\n █▀██▀ █ ▄▄█ █\n ▄▀▄ ▄█▀▀█▄▀▀▄█\n █▄▀▄███▄▄▀▀▀▄ █\n█▄█▄▄█ ▀█▄█▄█▄█ "], ["happy", " ▄▄█▀█▄▄▀█ ▄ \n █▄▀ ▄ ▄█▀ ▀▄ \n █ ▀ ▀ █▄▄▄▄▀▄\n ▀████▀▄█▀ ▄▀ █\n▄▀▀▄▄▄█▀▀█▀▀█▄ █\n█▄▄█ ▄█▄▄█▄▀ ▀█\n▄█▀▀█████▀▀▀▄ ▀\n█▄█▄▄█ █▄█▄█▄█ "], ["injured_1", " \n ▄▄▄ ▄▄ \n ▄▀█ ▀▀▀ █▄▀▄ \n ▄▀▀ █▄ █▀ █ \n █ ▄▄▀█▀▀▀█ █\n▄▄▀▀██▀ ▄█▄▄▄▀ █\n█ ▀▄ ▄▀█ █▀▄█\n█▄▄██████▄▄▄█ █"], ["injured_2", " \n \n ▄█▀█▄▄▀█ ▄ \n █▄▀ ▄ ▄█▀ ▀▄ \n█ ▀▀▄█▄▄▄▄▀▄ \n█▄▄▄▄█▀ █▄▄▄█ █ \n█ ▀▄ ▄▀█ █▄█ \n█▄▄██████▄▄▄█ █ "], ["sleep_1", " \n ▄▄▄ ▄▄ \n ▄▀█ ▀▀▀ █▄▀▄ \n▄▀▀ ▄▄ █▀ █ \n█ ▄▄▀█▀▀▀█ █ \n █▀██▀ █ ▄▄█▄ █ \n▄▀█▀▄▄█▀█▀ ▀ ▀██\n█▄▄▄█████▄▄▄▄▄▀▀"], ["sleep_2", " \n ▄█▀█▄▄▀█ ▄ \n █▄▀ ▄█▀ ▀▄ \n █ ▀▀ ▄█▄▄▄▄▀ \n ▀▄▄▄▄█▀▄▀ ▄▀ \n █ ▀▀ ▄█▄███▄ \n▄▀▄▀▄▄█▀▄▀ ▀ ▀██\n█▄▄▄█████▄▄▄▄▄▀▀"], ["walk_1", " ▄▄▀█▄▄▀█ ▄ \n █▄▀ ▄▄ ▄█▀ ▀▄ \n █ ▀▀ ▄█▄▄▄▄▀▄\n ▀▄▄▄▄█▀▄▀ ▄▀ █\n ██ ▀▀ ▄█▄▀▀█▄ █\n█ █ ▄█ █ ▄▀ ▀█\n▄█▀▀█████▀▀▀▄ ▀\n█▄█▄▄█ █▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄ \n ▄▀█ ▀▀▀ █▄▀▄ \n ▄▀▀ ▄█▀ █▀ █ \n █ ▄▄▀█▀▀▀█ █\n █▀██▀ █ ▄▄█ █\n ▄▀▄ ▄█▀▀█▄▀▀▄█\n █▄▀▄███▄▄▀▀▀▄ █\n█▄█▄▄█ ▀█▄█▄█▄█ "]]], + ["ultimatebrachiomon", [["angry", "▄▀█ ▄████▄ \n█▄██▀████▄ █▀▀▄\n███▄▄█▀█▀ ▀▄█\n▀ ▀ ▀▄▀█ █ ▄ █\n ▄█▄█▀▄█████▄▄██\n▄█▄▄▄█▄█ ▀█▄▀█▀ \n█▀▄█▀▄▄█▀▀██▀▀█ \n▀▀▀ █▄█▄█▀▄▄█"], ["attack", "▄▀█ ▄████▄ \n█▄██▀▀███▄ █▀▀▄\n███▄▄█▀█▀ ▀▄█\n▀▄▄▄▄▄▀█ █ ▄ █\n ▄█ █████▄▄██\n █ █▀▄█ ▀█▄▀█▀ \n █▀▀▄▄█▀▀██▀▀█ \n █▄█▄█ █▄█▄█▀▄▄█"], ["eat_1", " ▄▄ ▄▄▄▄ \n█ █▄█████▀ ▄▄▄ \n███▀▄▀███▀ ▀▄ █\n█▀▀▀▀▀▄█ ▄ ▀█\n ▀▀▀█▀ █▄█▄█ ▄█\n ▄▀█▄ █▀██▀███▀\n ▄▀▀█ ▀▀█▀▀██▀█ \n█▄█▄█▀▀▀█▄█▄█▄▄█"], ["eat_2", "▄▀█ ▄████▄ \n█▄██▀████▄ █▀▀▄\n███▄█▄▀█▀ ▀▄█\n▀ ▄▀█ █ ▄ █\n █▀▀▀▄▀█████▄▄██\n █▀█▀▄█ ▀█▄▀█▀ \n █▀▀▄▄█▀▀██▀▀█ \n █▄█▄█ █▄█▄█▀▄▄█"], ["happy", "▄▀█ ▄████▄ \n█▄██▀████▄ █▀▀▄\n███▄█▄▀█▀ ▀▄█\n▀ ▄▀█ █ ▄ █\n █▀▀▀▄▀█████▄▄██\n █▀█▀▄█ ▀█▄▀█▀ \n▄▀▄█▀▄▄█▀▀██▀▀█ \n▀▀▀ █▄█▄█▀▄▄█"], ["injured_1", " \n \n▄▀█ ▄████▄ \n█▄█▀█████▄ █▀▀▄ \n███▄▄█▀█▀▄ ▄▀▀█▄\n▀▄▄▄▄▄▀█▄█▄█▄███\n ▄█▄ █▄█▄██▄█▄█\n█▄▄████▄▄▄██▄▄▄█"], ["injured_2", " \n \n ▄▄ ▄▄▄▄ \n█ █▄█████▀ █▀▀▄ \n███ ▀█████ ▀▄█▄\n█▀▀▀▀▀▄█ █▄█▄▄██\n████▀▀█▄█▄██▄█▄█\n█▄▄████▄▄▄██▄▄▄█"], ["refuse", " ▄▄ ▄▄▄▄ \n█ █▄█████▀ ▄▄▄ \n███▀ ████▀ ▀▄ █\n█▀▀▀▀▀▄█ ▄ ▀█\n ▀▀▀█▀ █▄█▄█ ▄█\n ▄▀█▄ █▀██▀███▀\n ▄▀▀█ ▀▀█▀▀██▀█ \n█▄█▄█▀▀▀█▄█▄█▄▄█"], ["sleep_1", " \n▄▀█ ▄████▄ \n█▄███████▄ █▀▀▄\n███▄▄█▀█▀ ▀▄█\n▀▄▄▄▄▄▀█ █ ▄ █\n ▄█ █████▄▄██\n ▄█▄█▀▄█▄██▄▀██ \n█▄█▄█▄▄█▄█▄█▄▄▄█"], ["sleep_2", " \n ▄▄ ▄▄▄▄ \n█ █▄█████▀ █▀▀▄\n███▀▀████▀ ▀▄█\n█▀▀▀▀▀▄█ █ ▄ █\n ▀▀██▀ █████▄▄██\n ▄█▄█▀▄█▄██▄▀██ \n█▄█▄█▄▄█▄█▄█▄▄▄█"], ["walk_1", "▄▀█ ▄████▄ \n█▄██▀▀███▄ █▀▀▄\n███▄▄█▀█▀ ▀▄█\n▀▄▄▄▄▄▀█ █ ▄ █\n ▄█ █████▄▄██\n █ █▀▄█ ▀█▄▀█▀ \n █▀▀▄▄█▀▀██▀▀█ \n █▄█▄█ █▄█▄█▀▄▄█"], ["walk_2", " ▄▄ ▄▄▄▄ \n█ █▄█████▀ ▄▄▄ \n███▀ ▄███▀ ▀▄ █\n█▀▀▀▀▀▄█ ▄ ▀█\n ▀▀▀█▀ █▄█▄█ ▄█\n ▄▀█▄ █▀██▀███▀\n ▄▀▀█ ▀▀█▀▀██▀█ \n█▄█▄█▀▀▀█▄█▄█▄▄█"]]], + ["unimon", [["angry", "█▀▀▄▄█████▄ ▄▀█\n █▄▀▀ ▄▄ ▀▀▀█ ▄█\n█▄▄▄▄▀▀ ▄█▀▄▀ █\n ▀███▄ ▄█ ▄▀▄\n ▄▄███▀ ▀▀▀ █\n ▀▄▄▄▄█▀▀ ▀▄\n ██ ███▄▄ █\n █▄███▀ █▄▄█"], ["attack", " ▄▄▄▄▄ ▄▀█ \n█▀▀▄██▀▀█▀▀█ ▄▀▄\n ▀▄ ▄▄▄ ▄█ ▄▀▄▀\n▄▀ ▀ ▀ ▄█ ▄▀▄\n▀▄▄▄▄▄▀ ▀▀▀ █\n █▀▀▀█ ▀▄\n █ ██ ██▄▄ █\n ▀▀▀█▄▄▄█ █▄▄█"], ["eat_1", "▄▄▄ ▄████▄▄▄▄▀█ \n▀▄ ▀▀▀ ▀ ▄▀▀▄▀█\n ▄▀▀ ▄█▀ ▀█ ▄▀▄▀\n█ ▄ ▀▀▀ ▀▄\n ▀▀█▀▀ █\n █ █ ▀█ ▀▄\n ▀▄█▄▄█▀████▄ █\n █▄▄█▄▄█"], ["eat_2", "█▀▀▄▄█████▄ ▄▀█\n █▄▀▀▄▄▄ ▀▀▀█ ▄█\n█▄▄▄▄▄ ▀ ▄█▀▄▀ █\n ████ ▄█ ▄▀▄\n ▄▄███▀ ▀▀▀ █\n ▀▄▄▄▄█▀▀ ▀▄\n ██ ███▄▄ █\n █▄███▀ █▄▄█"], ["happy", "█▀▀▄▄█████▄ ▄▀█\n █▄▀▀▄▄▄ ▀▀▀█ ▄█\n█▄▄▄▄▄ ▀ ▄█▀▄▀ █\n ████ ▄█ ▄▀▄\n ▄▄███▀ ▀▀▀ █\n ▀▄▄▄▄█▀▀ ▀▄\n ██ ███▄▄ █\n █▄███▀ █▄▄█"], ["injured_1", " \n \n ▄▄▄▄▄ \n█▀▀▄██▀▀█▀▀█ ▄▄▄\n ▀▄ ▄█▀▀▄▄█\n▄▀ ▀▀▀▀ ▄█▀▀▄▄▀\n▀▄▄▄▄▄▄▀ ▀▀▀▄ \n▀▄▄█▄▄▄██▄▄▄█▄▄█"], ["injured_2", " \n \n ▄▄▄▄▄ \n█▀▀▄██▀▀█▀▀█ ▄▄▄\n ▀▄ ▄█▀▀▄▄█\n▄▀ ▀▀▀▀ ▄█▀▀▄▄▀\n▀▄▄▄▄▄▄▀ ▀▀▀▄ \n▀▄▄█▄▄▄██▄▄▄█▄▄█"], ["refuse", "▄▄▄ ▄████▄▄▄▄▀█ \n▀▄ ▀▀▀ ▀ ▄▀▀▄▀█\n ▄▀▀ ▄█▀ ▀█ ▄▀▄▀\n█ ▄ ▀▀▀ ▀▄\n ▀▀█▀▀ █\n █ █ ▀█ ▀▄\n ▀▄█▄▄█▀████▄ █\n █▄▄█▄▄█"], ["sleep_1", " \n \n ▄▄▄▄▄ \n█▀▀▄██▀▀█▀▀█ ▄▄▄\n ▀▄ ▄█▀▀▄▄█\n▄▀ ▀▀▀▀ ▄█▀▀▄▄▀\n▀▄▄▄▄▄▄▀ ▀▀▀▄ \n▀▄▄█▄▄▄██▄▄▄█▄▄█"], ["sleep_2", " \n \n ▄▄▄▄▄ \n█▀▀▄██▀▀█▀▀█ ▄▄▄\n ▀▄ ▄█▀▀▄▄█\n▄▀ ▀▀▀▀ ▄█▀▀▄▄▀\n▀▄▄▄▄▄▄▀ ▀▀▀▄ \n▀▄▄█▄▄▄██▄▄▄█▄▄█"], ["walk_1", "▄▄▄ ▄████▄▄▄ ▄▀█\n▀▄ ▀▀▀ ▀ ▄█▀ ▄█\n ▄▀ ▄▀█▀ ▀█ ▄▀ █\n█ ▄ ██ ▄▀▄\n ▀▀▀█▀ ▀▀▀ █\n ▀▄▄█ ▀▄\n █ █ ██▄▄ █\n █▄█▄▄▄█ █▄▄█"], ["walk_2", " ▄▄▄▄▄ ▄▀█ \n█▀▀▄██▀▀█▀▀█ ▄▀▄\n ▀▄ ▄▄▄ ▄█ ▄▀▄▀\n▄▀ ▀ ▀ ▄█ ▄▀▄\n▀▄▄▄▄▄▀ ▀▀▀ █\n █▀▀▀█ ▀▄\n █ ██ ██▄▄ █\n ▀▀▀█▄▄▄█ █▄▄█"]]], + ["upamon", [["angry", " \n \n ▄▄ ▄▄ \n █ ▀▄▀▀▀▀▄▄▀▄█ \n ██ █▄ ▄█ ▄▄█ \n █ ▄▀▄ ▄▀ \n ▀▄▄▄▄▄▀ \n ▄▄▄▄▄▄ "], ["attack", " ▄▄▄▄ \n ▄▀▀▀▀█▀ ▄█ \n █ ▄█ ▀ █ \n █▄▄▄ ▄▄▀ \n ████ █ \n █▀▀ ▄▀ \n ▀▀▀▀ \n ▄▄▄▄ "], ["eat_1", " \n ▄▄ ▄▄ \n █ ▀▄▀▀▀▀▄▄▀▄█ \n ██ ▄ ▄ ▄▄█ \n █ ▄▄▄ █ \n ▀▄ ███ ▄▀ \n ▀▀▀▀▀ \n ▄▄▄▄▄▄ "], ["eat_2", " \n \n ▄▄▄▄ ▄▄▄▄ ▄▄▄▄\n ▀▄▄ ▀ ▀▀▄▄▄▀\n █ ▄▀▄ ▄▀▄ ▄▀ \n █ ▄▀▄ ▄▀ \n ▀▄▄▄▄▄▀ \n ▄▄▄▄▄▄▄▄ "], ["happy", " ▄▄ ▄▄ \n █ ▀▄▀▀▀▀▄▄▀▄█ \n █▀ ▄ ▄ ▄▀ \n ▀▄▀ ▀ ▀ ▀ █ \n █ █████ █ \n ▀▄ ▀▀▀ ▄▀ \n ▀▀▀▀▀ \n ▄▄▄▄▄▄ "], ["injured_1", " \n \n \n \n █▀▀▀▄▀▀▀▀▄▄▀▀▀█\n █▀ ▄ ▄ ▀▀█ \n █▀▀ ▄ ▀▀▄▀▀ \n ▀▄█▄█▄▀ "], ["injured_2", " \n \n \n \n ▄▄ ▄▄▄▄ ▄▄ \n ▄▀▄ ▀ ▀▀ ▄▀▄\n █▄█ ▄█ █▄ ▄▄▄█\n ▀▄▄▄▄▄▄▄▀ "], ["sleep_1", " \n \n \n ▄▄▄▄ ▄▄▄▄ ▄▄▄▄\n ▀▄▄ ▀ ▀▀▄▄▄▀\n ▀▄▀▀ ▄ ▀▀ ▄▄▀ \n ▀▄ ▀ ▀ ▄▀ \n ▀▀▀▀▀ "], ["sleep_2", " \n \n \n █▀▀▀▄▀▀▀▀▄▄▀▀▀█\n █▀▄▄ ▄▄ ▀▀█ \n █ ▄▀▄ ▄▀▀ \n ▀▄▄▄▄▄▀ \n ▄▄▄▄▄▄▄▄ "], ["walk_1", " \n \n █▀▄ ▄▄▄▄ ▄▀█ \n █▄ ▀ ▀▀ ▀█ \n ▀█ ▀ ▄ ▀ █▀▀ \n ▀▄ ▀ ▀ ▄▀ \n ▀▀▀▀▀ \n ▄▄▄▄▄▄ "], ["walk_2", " \n \n \n █▀▀▀▄▀▀▀▀▄▄▀▀▀█\n █▀ ▄ ▄ ▀▀█ \n █ ▄▀▄ ▄▀▀ \n ▀▄▄▄▄▄▀ \n ▄▄▄▄▄▄▄▄ "]]], + ["vademon", [["angry", " ▄▀▀█▀▀▄ \n █ █ ▀ █ \n █ ▀ █ \n ▀█▀▄▄▄▀█▀ \n ▄▄██ ██▄ \n ▀▄▀█ █▀█ █▄ \n █▀▄▀▄ █▀█▀█ ▀ \n▄▀▀▀▄▄▀▄▀▄▀▄▀▄▄ "], ["attack", " ▄▀█▀▀█▄ \n █ ▄ █ ▀ █\n █▄▄ ▄▄█\n▄ █▄█▄█▄█ \n▄ ▄ ▄ ▀▄█▄▀ \n▄▀▄█ ▀█▀▄ ███ \n▄▀ ▀▄▀█▀ █▄█▄█ \n▄ ▄▀▄▀▄▀▄▀▄"], ["eat_1", " ▄▀█▀▀█▄ \n █ ▄ █ ▀ █ \n █▄▄ ▄▄█ \n █▄█▄█▄█ \n ▄█ ▀▄█▄▀ \n ▄ ▄▄▀▄ ███ \n ▄▄▀▄▀ █▄█▄█ \n▄█▄█ █▄▀▄▀▄▀▄▀▄▄"], ["eat_2", " ▄▄▄▄▄ \n ▄▀ ▄▀ ▀▄ \n █ ▀▄ █ \n ▀▄▀ ▀ ▀▄▀ \n █▀▄ ▄▀█ \n ▄ ▄▄ ▀█▄█▀ \n ▄▄▀▄▀█▄▄█▄█▄ \n▄█▄█ █▄▀▄▀▄▀▄▀▄▄"], ["happy", " ▄▀▀█▀▀▄ \n▀▄▄▄ █ █ █ \n █▄▀▄▀█ ▄ █ ▄ █ \n ▄▀▄█ █▄ ▄█ \n ▀▄▀▄█ █▄▀█▄\n ▀▄█▀█▄▀ \n ▄▀█▀▄ \n ▄▄▀▄▀▄▀▄▀▄▄"], ["injured_1", " \n ▄▀▀█▀▀▄ \n █ █ █ \n █ █ █ █ \n █▄▀▄ ▄█ \n ▄ ▄▄ ▀▄▄▀▄▄▀ \n ▄▄▀▄▀▀▀▀█ █▀▀█▀\n▄█▄█ █▄ ▄▀█▀▄▀▄▄"], ["injured_2", " \n ▄▄▄▄▄ \n ▄▀ █ ▀▄ \n █ ▄▀ ▄ █ \n ▀▄ █ ▀▄▀ \n ▄ ▄▄ █▀ █ ▀█ \n ▄▄▀▄▀▀▄██ ██▄▄ \n▄█▄█ █▄ ▄▀▄▀▄ ▄█"], ["sleep_1", " ▄▄▄▄▄ \n ▄▀ ▀▄ █▀▄ \n ▄ ▄█ ▀ ▀ █ \n █▀█▀█▀▀▄▀▀██ \n▄▀▀█▀▀▀▀▀▀▀▀█▀▀▄\n█ ▄▀█▀█▀█▀█▀█▄ █\n█ ▀█▄█▄█▄█▄█▄▀ █\n▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀"], ["sleep_2", " ▄▀█▀▀█▄ \n █ ▄ █ ▀ █ \n ▄ ▄█▄▄▄ ▄▄▄█ \n █▀█ ▀▄▄▀▄▄▀█ \n▄▀▀█▀▀▀▀▀▀▀▀█▀▀▄\n█ ▄▀█▀█▀█▀█▀█▄ █\n█ ▀█▄█▄█▄█▄█▄▀ █\n▀▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀"], ["walk_1", " ▄▀▀█▀▀▄ \n █ █ ▄ █ \n▄ █ ▄ █ ▀ █ \n █▀█ ▄ █▄ ▄█ \n ▀▀▄▀▄ ▀▄█ █▄▀ \n ▀ ▀▀▀▄▄█▀█▄▄ \n ▄▀█▀▄ █▀\n ▄▄▀▄▀▄▀▄▀▄▄"], ["walk_2", " ▄▄▄▄▄ \n ▄▀ ▄▀ ▀▄ \n █ ▀▄ █ \n▀▄▄▄ ▀▄▀ ▀ ▀▄▀ \n █▄▀▄▀ █▀▄ ▄▀█ \n ▄▀▄█▄ ▀█▄█▀ ▄▀\n ▀▀█▄█▀▀ ▀\n ▄▄▀█ █ █▀▄▄"]]], + ["valkyrimon", [["angry", " ▄▄▀▀▀▄▀▀▀▀▀█ \n ▄▀▀▄ ▄▄▄ ▀█▀ \n ▀▄ ▄██▀ ▀█▄ \n ▀▄ ▄▄▄▀█ █▄ \n ▄▀▀█▀▀ ▀█▄▄▀▄▀ \n ▀▄▄███▄█ ▀▄▀ \n █▀▀▄█ ▀▀█▀ \n █▄▄▄█ █▄▄▄█ "], ["attack", " ▄▄▄ ▄▄▄▄▄▄ \n ▄█▀ ▀ ▄▄▄▀ \n █ ▀▀▄█▀ ▄▄▀ \n ▀▄▀▀▀▀ ▄▄▀ \n █▄▄▀█ ▄█▄ \n ▄▀▀▄▄ ▄▀▀▄ █▀▄\n █▄████▀▄▄█▀▄▀ \n █▄▄▄█ ▀▀▄▄▄██ "], ["eat_1", " ▄▄▄ ▄▄▄▄▄▄ \n ▄█▀ ▀ ▄▄▄▀ \n █ ▀▄▀▀▄ ▄▄▀ \n ▀▄▀ ▄▄▀ \n █▄▄▀█ ▄█▄ \n ▄▀▀█▄▄ ▄█▀▀ █▀▄\n ▀▄▄████▀█▄▄▀▄▀ \n █▄▄▄█ ▀▀▄▄▄██ "], ["eat_2", " ▄▄▀▀▀▄▀▀▀▀▀█ \n ▄▀▀▄ ▄▄ ▀█▀ \n ▀▄ ▄▀▀ ▀█ \n █ ██ ▀▀▄ \n ▄█▀▀ ▀▄█▀▀▄▄ \n █ ▄██▄█ █▄▀▄▀\n █▀▀▄█ ▀▀█▄▀ \n █▄▄▄█ █▄▄▄█ "], ["happy", " ▄▄▀▀▀▄▀▀▀▀▀█ \n ▄▀▀▄ ▄▄ ▀█▀ \n ▀▄ ▄▀ ▀ ▀█ \n ▀▄ ▄▄▄▀▀▄ \n ▄▀▀█▀▀ ▀▄█▀▀▄▄ \n ▀▄▄███▄███▄▄▀▄▀\n █▀▀▄█ ▀▀█▄▀ \n █▄▄▄█ █▄▄▄█ "], ["injured_1", " \n ▄▄▄ ▄▄▄▄▄▄ \n ▄█▀ ▀ ▄▄▄▀ \n █ ▀▀▄▄▄ ▄▄▀ \n ▀▄▀▀ ▀ ▄▄▀ \n █▄▄▀█ ▄█▄ \n ▄▀▀█▀▄ ▄▀█▀▀█▀▄\n █▄▄█▄███▄█▄▄██ "], ["injured_2", " \n \n ▄▄▀▀▀▄▀▀▀▀▀█ \n ▄▀▀▄▄ ▀█▀ \n ▀▄ ▄▄▀█▀ ▀█ \n ▀▄ ▄▄▀▀▄▄ \n ▄▀▀█▀█ ▄▀█▀▀█▀▄\n █▄▄█▄███▄█▄▄██ "], ["refuse", " ▄▄▄ ▄▄▄▄▄▄ \n ▄█▀ ▀ ▄▄▄▀ \n █ ▀▀▄█▀ ▄▄▀ \n ▀▄▀▀▀▀ ▄▄▀ \n █▄▄▀█ ▄█▄ \n ▄▀▀▄▄ ▄█▀▀ █▀▄\n █▄████▀█▄▄▀▄▀ \n █▄▄▄█ ▀▀▄▄▄██ "], ["sleep_1", " \n ▄▄▄ ▄▄▄▄▄▄ \n ▄█▀ ▀ ▄▄▄▀ \n █ ▀▀▄ ▄▄▀ \n ▀▄▀▀▀▀ ▄▄▀ \n █▄▄▀█ ▄█▄ \n ▄▀▀▄▄ ▄▀▀▄ █▀▄\n █▄█████▄▄██▄█ "], ["sleep_2", " \n \n ▄▄▀▀▀▄▀▀▀▀▀█ \n ▄▀▀▄▄ ▀█▀ \n ▀▄ ▄▄█▄ ▀█ \n ▀▄ ▄▄▀▀▄▄ \n ▄▀▀██ ▄▀▀▄ █▀▄\n █▄█████▄▄██▄█ "], ["walk_1", " ▄▄▀▀▀▄▀▀▀▀▀█ \n ▄▀▀▄▄ ▄▄ ▀█▀ \n ▀▄ ▄▄██ ▀█ \n ▀▄ ▄▄▀▀▄ \n ▄█▀▀ ▀▄█▀▀▄▄ \n █ ▄██▄█ █▄▀▄▀\n █▀▀▄█ ▀▀█▄▀ \n █▄▄▄█ █▄▄▄█ "], ["walk_2", " ▄▄▄ ▄▄▄▄▄▄ \n ▄█▀ ▀ ▄▄▄▀ \n █ ▀▀▄█▀ ▄▄▀ \n ▀▄▀▀▀▀ ▄▄▀ \n █▄▄▀█ ▄█▄ \n ▄▀▀▄▄ ▄▀▀▄ █▀▄\n █▄████▀▄▄█▀▄▀ \n █▄▄▄█ ▀▀▄▄▄██ "]]], + ["varodurumon", [["angry", " ▄▄▄▄ \n ▄▀▀▄▄▄▀ ▄▀▀█\n ▄▀ ▄▀ ▀▄▀▄▀ ▀█▀\n▄▀ ▄▄▀▀▄▀▀▀▄█▀█\n█ ▄▀ ▄▀█▄▀▀ ▀▄\n ▀▀▀▀ ▀▄ ▀▄ ▀█\n █▄▀▄▄█▄ ▀█\n ▀▀ ▀██"], ["attack", "▄▀▀▀▀▄▄▄▀▀█ ▄▀▀█\n █▄ ▄▄▀▀▄▀ ▀█\n ██▄▀▀ ▄█▀ ▀█\n ██▀▀█▀ ▄█▀ \n █▄▄▄▀ ▀▄ ▀▄\n ▀█▄ ▄ ▄█▀▀\n █▄▀▄█ ▄█▄\n ▀▀ ▀▄▄▄▄█"], ["eat_1", " ▄▄▄▄▀▀▀█ ▄▄\n▄▀▀ ▄▄▀█▀▄ ▄▀▄█\n▀███▄ ▄▄▀▄█ ▄▄█\n ▀██▀▀▄▄▀ ▀▄▀ \n ▀▄▄▄█▄▀ ▄ █ \n ▀▄ █ ▄█\n █▄▀▄▄█ ▄█\n ▀▀ ▀▄▄█"], ["eat_2", " ▄▄▄▄ ▄▄▄\n ▄▀▀▄▄▄▀ ▄▀ ▄█\n ▄▀▄▀▄ ▀▄▀█ ▄▀\n▄▀ ▄▄▀▀▄▀ ▀▄█▀█\n█ ▄▀ ▄▀█▄▀ ▀▄\n ▀▀▀▀ ▀▄ █▄ ▀█\n █▄▀▄▄▀▄ ▀█\n ▀▀ ▀▀▀██"], ["happy", " ▄▄▀▀▄█▀▀█ ▄▀▀█\n▄▀ ▄▀▄ █▀▄█ ▀█\n▀███▄▄ ▄▄▀█ ▀█\n ▀██▀▀▄▄▀ ▄▄▀ \n █▄▄▀▄▀ ▀▄ ▀▄\n ▀▄ █ ▄█▀▀\n █▄▀█ ▄█▄\n ▀ ▀▄▄▄▄█"], ["injured_1", " \n ▄▄▀▀▀█ \n ▄▀▄ ▀█▀▄▄▄ \n █ ▀▀▄▄▀▄ ▀▄ \n█ ▄▀▀▄▀▄▀▄ ▄▄█ \n▀▄█▄▄▀▄▀█ █ ▄▄█\n █ ▀▄ ▀▄▄▄█\n ▀▄▄▄█▄▄▄▄█"], ["injured_2", " \n ▄▄▄▄ \n ▄▀▀▄▄▄▀▄▄ \n ▄▀ █▄ ▀▄▀ ▀▄ \n▄▀ ▄▄▀█▀▄ ▄▄█ \n█ ▄▀ ▄▀█▄▀▄ ▄▄█\n ▀▀▀▀▄▀ ▀▄ ▀▄▄▄█\n ▀▄▄▄▄█▄▄▄▄█"], ["sleep_1", " \n \n ▄▄▄▄ \n ▄▀▀▄▄▄▀▀▀▀▄ \n ▄▀ ▄▄ ▀▄▀▄ ▀▄\n▄▀ ▄▄▀▀▄█ █ ▀█\n█ ▄▀ ▄▄▀▄█ ▀▄ ▀█\n ▀▀▀▀ ▀█▄▄█▄▄██▀"], ["sleep_2", " \n \n ▄▄▀▀▀█ \n ▄▀ ▀█▀▄▀▀▀▄ \n █ ▀▀▄▄▀▄▄ ▀▄\n█ ▄▀▀ ▄▀▄ █ ▀█\n▀▄█▄▄▀█▄▀█ ▀▄ ▀█\n ▀▄▄▄█▄▄██▀"], ["walk_1", " ▄▄▀▀▀█ ▄▀▀█\n ▄▀ ▄▀█▀▄▄█ ▀█\n █ ▀▀▄▄▀▄▀ ▀█\n█ ▄▀▀▄▄▀▄▀ ▄▄▀ \n▀▄█▄▄▀▄▀▀ ▄▀▄ ▀▄\n ▄▀▄ ▄█▀▀\n ▀▀▄█ ▄█▄\n ▀▄▄▄▄█"], ["walk_2", " ▄▄▄▄ ▄▄▄\n ▄▀▀▄▄▄▀ ▄▀▄▄█\n ▄▀ ▄█ ▀▄▀█ ▄▀ \n▄▀ ▄▄▀▀▄▀ ▀▄▀█\n█ ▄▀ ▄▀█▄▀▄ ▀▄\n ▀▀▀▀ ▀▄ █ ▀█\n █▄▀█▀▀▄ ▀█\n ▀ ▀▀▀"]]], + ["veedramon", [["angry", " ▄▄▄▄▄▄▄▄▄▄▄\n█▀▄▄▀ ▀▄ ▄▄▀\n█▀ ▄█▀ █▀ \n▀█▀▀▀▄ █ \n ▀▀█▀▀ ▄ ▀▄ \n▄▀▀██▄▄█▀ ▄▀▀ ▄█\n▀▄▄█ ▀▀ █▄▄▀▄▀\n█▄█▄██▄▄▄█▄█▄█▄█"], ["attack", "█▀▄▄▄▀▀▀▀▀█▀▀▀▀█\n█▀ ▄█▀ █▄▀▀ \n▀█▀█▀█▄ █ \n ██████▄ █▄▄ \n ▄█▄█▄█▄█ ▄ █\n █▄▄▄▄▄▄ █ █\n█▄█▀▄▀▀ ▄▀▀▀█▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["eat_1", "█▀▄▄▄▀▀▀▀▀█▀▀▀▀█\n█▀ ▄▀▄ █▄▀▀ \n▀█████▄ █ \n █████ █ \n ▄█▄▄▄▀ ▄ ▄█ █ \n ▀▄▄▄▄▄▀ █ ▄█▀█\n ▄█▀▄ █▀ ▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["eat_2", " ▄▄▄▄▄▄▄▄▄▄▄\n█▀▄▄▀ ▄ ▀▄ ▄▄▀\n█▀ ▄ ▀ ▀ █▀ \n▀█▀▀▀ █ \n ▀▀█▀▀ ▄ ▀▄ \n▄▀▀██▄▄█▀ ▄▀▀ ▄█\n▀▄▄█ ▀▀ █▄▄▀▄▀\n█▄█▄██▄▄▄█▄█▄█▄█"], ["happy", "█▀▄▄▄▀▀▀▀▀█▀▀▀▀█\n█▀ ▄▀▄ █▄▀▀ \n ▀█████ ▀▄▀▀▄\n▄▄▄████ ▀ ▄▀\n█▄█▄▄▀ █ \n ▀▄▄▄▄▄▄▀▄▀▄▀█▀▄\n ▄█▀▄▀▀ █ ▀ ▀ █\n█▄█▄▄██▀▀▀▀▄▄▄▀ "], ["injured_1", " ▄▄▄▄▄▄▄▄▄▄▄\n█▀▄▄▀ ▀▄ ▄▄▀\n█▀ █▄ █▀ \n▀█▀▀▀ █ \n ▀▀█▀▀ ▄ ▀▄ \n ▄▀██▄▄█▀ ▀▄ █ \n █▄█ ▀▀ ▄█▄▄█ \n█▄█▄██▄▄▄█▄█▄█▄█"], ["injured_2", " \n▄▄ ▄▀▀▀▀▀█▀▀▀▀█\n█▄▀▀ ▄ █▄▀▀ \n█▄▄▄▄ ▀▀ ▀▄ \n ▀▄▄▄▄▄ ▀▄ \n ▄▄▀█ ▄█ ▄ ▀▄\n█▄▄█▀██▀ ▄▄█▄▄▀\n█▄█▄█▄▄▄▄█▄█▄█▄█"], ["sleep_1", " \n ▄▀▀▀▀▀█▀▀█ \n █ █▀ \n█▀▄ ▄ ▀▄ \n▀▄▄▀ ▀▀ █ ▄▄\n▄▀▄ ▄▄▀ ▄▄▄█▄█\n█▄▀█▀▀ █ ▀ ▀ █\n█▄▄▄█▄▄▄▄▄█▄▄▄▄▀"], ["sleep_2", " ▄▄▄▄▄▄▄▄▄ \n ▄▀ ▀▄▄▀ \n ▄▄▀ █ \n █ ▀▄ ▄▄▀ █ \n █▀ ▄ █ \n▄█ █▄▄▄█▀ ▄█▄▄█ \n█▄▀█ ▀▀ █ ▀ ▀ █\n█▄▄▄▄▄▄▄▄▄█▄▄▄██"], ["walk_1", "▄▄ ▄▀▀▀▀▀█▀▀▀▀█\n█▄▀▀ ██▀ █▄▀▀ \n█▄▄▄▄▄ █ \n ▀▄▄▄▄▄ █ \n ▄▄█ ▄█ ▄█ █ \n █ █▀██▀ █ ▄█▀█\n ▄█▀▄ █▀ ▀▄▀\n█▄█▄▄██▀▀█▄█▄█▄█"], ["walk_2", " ▄▄▄▄▄▄▄▄▄▄▄\n█▀▄▄▀ ▄▄▄ ▀▄ ▄▄▀\n█▀ ▀▀ █▀ \n▀█▀▀▀▀ █ \n ▀▀█▀▀ ▄ ▀▄ \n▄▀▀██▄▄█▀ ▄▀▀ ▄█\n▀▄▄█ ▀▀ █▄▄▀▄▀\n█▄█▄██▄▄▄█▄█▄█▄█"]]], + ["veemon", [["angry", " ▄▄▄▄▄▄ \n ▄█▀▄ ▀▀▄▄ \n █ ▀ ▄█ ▄▄▄█ \n █ ▀▀▀ █ \n ▀▄▄▀▀▀▄ ▄▀ \n ▄▀▀█▀▀ ▄█ ▀▄▀▀█\n █▄▄▀ █ ▄█▀▀ \n█▄▄█▀▀▀▀▀██▄▄█ "], ["attack", " ▄▄▀█▀▀▀▀▄▄▄▄▄\n ▄▀ ▀ ▄█ ▄▄▀\n █████▄▀▀▀ █ \n ██████ █ \n █▀▀▀▀ ▄ ▀▄ ▄▄\n ▄▀▀█▀▀▀ ▄▀ █ █\n ▀▄▄▀▄ ▀▄▄█▄▀ \n █▄▄█▀▀▀▀█▄▄▄█ "], ["eat_1", " ▄█▀▀▀▀▀▀▄▄ \n █▀▄▀ ▄ ▀▄ \n █ ▀ ▀ █▀▄█ \n ███▀▀█ █ \n ▄▀█▄▄█▄▀▀█▄ \n ▀▄▄█ ▀▄ █▄▀█ \n ▄▀▄ ▄▀█▄▄▀ \n █▄▄█▀█▄▄▄█ "], ["eat_2", " ▄▄▄▄▄▄ \n ▄█▀▄ ▀▀▄▄ \n █ ▀ ▄▀▄ ▄▄▄█ \n █ ▄ █ \n █▀▀▀ ▄▄▀▄ \n █ █▀▀▀█ ▄█▄▀█ \n █▀▄ ▀▀▀▄▄▀ \n █▄▄█▀▀▀▀█▄▄▄█ "], ["happy", " ▄█▀▀▀▀▀▄▄ \n █▀▄▀ ▄ ▀▀█\n █▄▄▄▄▄▀ ▀ █▀▀ \n ▄███▀▀█ ▄▀▀▄ \n █ █▀▀▀ ▄▀ ▄▀ \n ▀▄█▀▀▀ ██▄ \n ▄▀▄ ▄▀▄▄▀▄\n █▄▄█▀▀▀█▄▄▄█▀▀"], ["injured_1", " ▄▄▄▄▄▄ \n ▄█▀▄ ▀▀▄ \n █ ▀ ▄ ▄ ▀▄ \n █ ▀▀ █▀▀▀ \n ▀▄▄▀▀ ▄ ▄▀ \n ▄█▀▀▀ ▄ ▀▄ \n █ █▄ █ █▀▄ \n █▄▄█▀█▄███▀▄█ "], ["injured_2", " \n ▄█▀▀▀▀▀▄▄ \n █▀▄▀ ▀▄ \n ▄▀ ▀▄▄ █▄▄█ \n █ ▄▄ █ \n ▄██▄▄▄▀ ▀▄ \n█ ▄█▄ ▀▄ █▄ \n █▄▄▄▀▀█▄▄██▀▄█ "], ["sleep_1", " \n ▄▄▄▄▄▄ \n ▄▀ ▀▀▄▄▄ \n █▀▄▀ ▄▄▄▀ \n █ ▀▀▀ █ \n ▀▄ ▄▀ ▄ ▀▀▄ ▄▄\n▄▀██▀▀█▀ ▄▀▀█ █\n▀▄▄█▄▄█▄▄█▄▄▄█▀ "], ["sleep_2", " \n ▄▀▀▀▀▀▀▄▄ \n █▄ ▄ ▀▀▄ \n ▄▀ ▀ ▄▄▄ █▀▀▀ \n █ ▄ ▄▀ \n ▀▄▄█▄▄▄ ▀▄ \n▄▀█▄ ▀▄▀ ▄▀▀▄▄▄\n▀▄▄█▄▄█▄▄█▄▄▄█▄▀"], ["walk_1", " ▄█▀▀▀▀▀▄▄ \n █▀▄▀ ▄▄ ▀▀▄ \n ▄▀ ██▄ █▀▀▀ \n █ ▄▄ █ \n ▀█▄▄▄▀ ▀▄ \n ▄▀█ ▄▀▀ █▄▄ \n ▀▄▀▄ ▀▄▄█ ▄▄█ \n █▄▄█▀█▄▄▄█ "], ["walk_2", " ▄▄▄▄▄▄ \n ▄█▀▄ ▀▀▄▄▄ \n █ ▀ ▄█▀ ▄▄▄▀ \n █ ▀▀▀ █ \n ▀▄▄▀▀ ▄▄▀▄ \n █ █▀▀▀█ ▄█▄▄▄ \n █▀▄ ▀█▀▄▄▄▀ \n █▄▄█▀▀▀█▄▄▄█ "]]], + ["vegiemon", [["angry", " ▄▄ ▄▀▄ ▄▄ \n ▀▄▄▀█▄█▀▄▄▀ \n█▀▄ ▄▀▀▀▀█▀ ▄▀█\n ▄▀ ▄▀ █ ▀▄ \n█ ▄█▀▄ ▄▀ █ █\n▀▄█▄▄▄▄▄▄ █▄▀\n █▄▄▄▄▄ ▀ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["attack", " ▄▄ ▄▀▄ ▄▄ \n ▀▄▄▀█▄█▀▄▄▀ \n ▄ ▄▄▀ ▄█▄ \n█ ▄▀▀▀▀ ▀▀▄ █ ▀▄\n █ ▀███████ ▀▄▄▀\n▄▀ ████████ █▀▄\n█ █▀██████▀ █ █\n ▀▀ ▀▄▄▄▄▄▄▄▀ ▀ "], ["eat_1", " ▄▄ ▄▀▄ ▄▄ \n ▀▄▄▀█▄█▀▄▄▀ \n ▄ ▄█ ▄▀▄ \n█ ▄▀▀ ▀ ▀ █ ▀▄\n █ ▀███████▄▀▄▄▀\n▄▀ ▄██▀▄▀ ▀█ █▀▄\n█ █ ▀▀ ▄▀ █▄▀\n ▀ ▀▄▄▄▄▄█▄▄▀ "], ["eat_2", " ▄ \n▄▄ ▄▀▀▄█ █▄▀▀▄ \n █ ▀▀▄▀▀▀▄▀▀ ▄▄\n█ ▄▄▀█ █ █ █ ▀\n ▀█ ▄ █ █ \n ▄▀▀▀▀▀▀ ▄ █▀ \n ▄▀▀▀▀▀ ▄▀ █ \n ▀▄▄▄▄▄▄▄▄▀ "], ["happy", " ▄▄ ▄▀▄ ▄▄ \n ▀▄▄▀█▄█▀▄▄▀ \n ▄ ▄█ ▄▀▄ \n█ ▄▀▀ ▀ ▀ █ ▀▄\n█ ▀▄▄▄▄▄██▄▀▄▄▀\n▀▄▄ ▄███████ █▀ \n █▀█████▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["injured_1", " ▄▄ ▄▀▄ ▄▄ \n ▀▄▄▀█▄█▀▄▄▀ \n▄▄ ▄▀▀▀▀█▀ ▄▄\n▀ █ ▄▀ █ █ ▀\n▄▀▄█▀▀ ▀▀ █ ▀▄\n█ █▀▀▀▀▀▀▄ █ █\n ▀█▀▀▀▀▀ █▀ \n ▀▄▄▄▄▄▄▄▄▀ "], ["injured_2", " \n ▄▄ ▄▀▄ ▄▄ \n █ ▄██▄██▄ █ \n ▀█▀ ▀▄▀▀ \n▀▄ ▄█▄ ▄▄ ▀▄ ▄▀\n▄▀█▄▄▄▄▄▄ ▀▄▀▄\n█ █▄▄▄▄▄ ▀ █ █\n▀▄▄▀▄▄▄▄▄▄▄▄▀▄▄▀"], ["sleep_1", " \n ▄▀▄ \n ▄▀▀▄▀▄▀▄▀▀▄ \n █▄▀▄▀▀▀▄▀▄█ \n ▄▀ ▀▄ \n █ ▀▄ \n █ ▀▀ ▀▀ █ \n▀▄▄▄▀▄▄▄▄▄▄▄▀▄▄▀"], ["sleep_2", " ▄ \n ▄▄ █ █ ▄▄ \n ▀▄▄▀▄█▄▀▄▄▀ \n ▄▀ ▀▄ \n ▄▀ ▀▄ \n █ ▄▄ ▄▄ ▀▄ \n █ █ \n▀▄▄▄▀▄▄▄▄▄▄▄▀▄▄▀"], ["walk_1", " ▄▀▄ \n▀▄ ▄▀▀▄▀▄▀▄▀▀▄ █\n ▀▄ ▀▀▄▀▀▀▄▀▀ █ \n ▄▀ █▄ ▄▀ █ ▀▄\n ▀▄▄▀ ▄ █▄▄▀\n ▀▄▀▀▀▀ █ \n █ █ \n ▀▄▄▄▄▄▄▄▀ "], ["walk_2", " ▄▄ ▄▀▄ ▄▄ \n ▀▄▄▀█▄█▀▄▄▀ \n ▄ ▄▄▀ ▄█▄ \n█ ▄▀▀▀▀ ▀▀▄ █ ▀▄\n █ ▀▄▄▄▄▄██ ▀▄▄▀\n█ ▄█████▀ █▀▄\n ▀▄█▀▀▀▀▀ █▄▀\n ▀▄▄▄▄▄▄▄▀ "]]], + ["velgrmon", [["angry", " ▄▀█▄▀█ \n ▄▀ ▀ ▄▀█ \n ▄██ ▄ ▄█▀▀▄ \n ▄▀ ▀▀ ▄█ ▄███\n █ ▄▀▀▄▄▀▄▄█████\n ▀▀▀█▀▄▀▀▄█ ▀██\n ▄▀▀ ▀██▀ ▀▀▄ \n █▄▀▀▄▀▀▄▀▀▄█ "], ["attack", "▄▀▀▀▀██▀▀█▄ ▄█\n ▀▀▄ ▄█▀ ▀▄█ █\n ▀▄ ▀█ █▄█\n █▀▀▀▀ ▄▀▀ ▄███\n ▀▀███▀▄█▀███▀ \n ▄▄█▄▄▀▄▄██▄ \n █▄ ▀█▄▄▄▀▀ ▄█ \n ▀▄█▀ ▀█▄▀ "], ["eat_1", "▄▀▀▀▀▀██▀█▄ \n ▀▀█▄ ▄▄ ▀▄▄ \n ██ ▀█ ▄█▄\n ▄▀▀▀▀ ▄▄▀▀▄▄███\n ▀▀███▀▄█▀███ █\n █▄▄▀▄▄██ ▀▄█\n ▄▀▀ ▀▄▄▄▀ ▀▀▄ \n █▄▀▀▄▀ ▀▄▀▀▄█ "], ["eat_2", " ▄▀█▄▀█ \n █▄ ▀ ▄▀█ \n █▀▀ ▄▄ ▄█▀█▄ \n ▄▀ ▀ ▀▄█ ▀███\n █ ▄▀▀▄█▀▄█▄ ██\n ▀▀██▀▄▀██▄ ▀██\n ▄▀▀ ▀█▄█▀ ▀▀▄ \n █▄▀▀▄▀ ▀▄▀▀▄█ "], ["happy", "▄▀▀▀▀██▀▀█▄ ▄▄ \n ▀▀▄ ▄▀█ ▀▄█ █\n █▄ ▀█ █▄█\n █▀▀▀ ▄▄▀▀ ▄██▀\n ▀▀███▀▄█▀█▀▀ \n ▄▄█▄▄▀▄▄██▄ \n █▄ ▀▀▄▄▄▀▀ ▄█ \n ▀▄█▀ ▀█▄▀ "], ["injured_1", " ▄▀█▄▀█ \n ▄▀ ▀ ▄▀█ \n ▄██ ▄ ▄█▄ \n ▄▀ ▀▀▄▀▀ ▀▄ \n █ ▄▀▀▄▄▀▄▄▀███ \n ▀▀█▀▀▄▀▀█▄▀██▄\n ▄▀▀█▄██▀▀█▄█▀\n █▄▀▀▄▀▀▄▀▀▄█ "], ["injured_2", " ▄▄ ▄▄ \n ▄▀ █▀ █▄ \n █▄ ▀ █▄ \n █▀▀ ▀▄▄ █▀ ▀▄ \n█ ▄▄ ▄▀▄▄▀██ \n▀▄█▄▄█▀▄▀▀█▄▀██ \n ▄▀▀█▄██▀▀█▄██\n █▄▀▀▄▀▀▄▀▀▄█▀ "], ["sleep_1", " ▄▄ ▄▄ \n ▄▀ █▀ █▄ \n ▄██ ▀ █ \n █ ▀▀▀ █▀▀█▄ \n █ ▄▄ ▄▀▄ ██▄▀▄\n ▀▄█▄▄█▄▀▀█▄██ █\n ▄▀▀ ▀█▀ ▀▀██▀\n █▄▀▀▄▀▄▀▀▄█ "], ["sleep_2", " ▄▀█▄▀█ \n █▄ ▀ ▄▀█ \n █▀▀▄▄▄ ▄█▄ \n ▄▀ ▄▀ ▄█▀▄ \n █ ▄▀▀▄█▀▀▄▀██ █\n ▀▀▀██▄▀▀████ █\n ▄▀▀ ▀█▀ ▀▀██▀\n █▄▀▀▄▀▄▀▀▄█ "], ["walk_1", " ▄▀█▄▀█ ▄█▀▄\n █▄ ▀ ▄▀█▄▀██ █\n █▀▀▄▀█ ▄█ ▄█ █▀\n█ ▀▀ ▄▀▄ ███▀ \n█ ▄▀▀▄█▄▀▀█▀█▄ \n▀▀▀▀▀ ▀▄▀▀▄▀▀▄▀▄\n █▀▄ █ ▀▀\n ▀▄█▄▄█ "], ["walk_2", " ▄▄ ▄▄ \n ▄▀ █▀ █▄ \n ▄██ ▄▄▀ █ \n▄▀ █▄▀ █▀▀▀▄▄ \n█ ▄▄ ▄█▀█ ▀█▀█▄\n█▄█▄▄▀▀▄▀▀█▄██ █\n █▀█▀██▄█\n ▀▄█▄▄█▀ "]]], + ["venommyotismon", [["angry", " █▀▄ █▀▄ \n▄▄ ▄█▄▄█ ▄▄█ █\n█ ██ ▄▄██▀ █▄ █\n ▀▄▀██▀ ▄█▀▀██▄▀\n▄▀█▀▀▀▀▀▀█▄▀ ██▄\n█▀ █▄▄▄▄█▄██ █▀\n█ ▀▄███▄█▀ ▄▀ \n█▄█▄███▀██▄█▄██ "], ["attack", " █▀▄▄▀▀▀▀▄▄▄▀█ \n▄▀▄▀▄▄█▀▀▄█▄▄▀▀▄\n█ █▄▄█▄▄▀▀█▀█▄ █\n█ █ ▄ ▄▄ █▀ ▄▀\n▄▀▄██████ █▄▄█ █\n█▀██▀ ▀ ▀▄█▄ ▀█\n █▄███████▄██▄ \n█▄▄▄▄██▀█▄▄▄▄▄█ "], ["eat_1", "█▀▄▄▀▀▀█▄▄▄▀█ \n▀▄▀▀██▀▀██▄▄▀▄▀█\n▄▄█▀▀▀▀▀ █▄▄▄▀ █\n▀▄██████ █ ▄▀▀▄▀\n█ █▄▀▀▀▄▀███▀ █\n▀▄█▄███▄▄███▄▄▄▀\n █▄█▄███▄█▄██▄ \n█▄▄▄▄██▀█▄▄▄▄▄█ "], ["eat_2", " █▀▄ █▀▄ \n█▀▄▄▀▀▀▀▄▄▄▀█ █\n▀▄▀█▄▄█▀██▄▄▀▄ █\n ▄█▄██▄█▄█ ▄██▄▀\n█ █▄ ▄▄▀█▄ ▀█▄\n█▀ ███▄▄▄█ █▀\n ███▄███▄█▄███▀ \n█▄▄▄▄██▀█▄▄▄▄▄█ "], ["happy", " █▀▄▄█▀██▄▄▄▀█ \n█▀▄▀▄▀█▀▄▀█▄▄▀▀▄\n█ ▄█▀▀▀▀▀▀█▀█▄ █\n▀▄ ██████ █▀ ▄▀\n█▄▀█▄▀▀▀▄▀█▀▀█ █\n▀ ▄█▄███▄▄█▄ ▀█\n █▄█▄███▄█▄██▄ \n█▄▄▄▄██▀█▄▄▄▄▄█ "], ["injured_1", " ▄▄ ▄▄ \n▄▄ ▄█▄█▄ ▄█ ▀▄\n█ ██▄ ▄██▀ █ █\n ▀█▀ ██ ▀█▀▀▄▄ █\n▄▀█▀▀▀▀▀▀█▄▄█▄▀█\n█▄▄▀▄▄▄▄▀▄▄▄▄▄█ \n█ ▀▄▄█▄▄▄█▄▀ █ \n█▄▄█▄▄▄▄███▄▄▄█ "], ["injured_2", " ▄▄ ▄▄ \n █ ▀▄ █ ▀▄\n█▀▄▄▀▀▀▀█▄▄▀█ █\n▀▄██▄▄▄▄██▄▄█▄ █\n ▄█▀ ██ ▀█ ▄█▄▀█\n█▄▀█▀▀▀▀█▀█▄▄▄█ \n█ ▀▄████▄██▀ █ \n█▄▄█▄▄▄▄███▄▄▄█ "], ["sleep_1", " ▄▄▄▄▄▄▄ \n ██▀▀██ ██ \n █▀▀ ▀▀█ ██ \n ████ ████ ██ \n ███ ███ ██ \n ▀██████▀▄█▀ \n ██████ ██ \n ████▄██ "], ["sleep_2", " ▄█████▀█▄ \n ▄██ ██▄▀█▄ \n ▄█▄▄ ▄▄█▄▀█▄ \n ▀███ ███▀▄█▀ \n ███▄▄███ ██ \n ██████ ██ \n ▀████▀▄█▀ \n ▀▀▀▀▀▀▀ "], ["walk_1", "█▀▄▄▀▀▀▀▄▄▄▀█ ▄ \n▀▄▀█▄▄█▀██▄▄▀█ █\n █▄██▄█▀█ ▄▄▀▀█\n▄▀▀▄ ▄▄▀▀▀▄▄ █\n▀▄█ ▀█▀ █▄▀▀▄▀█\n█ ▀████████▀ █ \n▀▄█▄███▄█▄█▄▄█ \n█▄▄▄▄██▀█▄▄▄▄▄█ "], ["walk_2", "▄▄ ▄▄▄▄ ▄▄ \n█ ██ ▄▄██▀ █▄▀▄\n ▀▄▀██▀▄██▀▀ █▄█\n▄▀█▀▀▀▀▀ █▀▀█ █\n▀▄▄▀▄▄▄▀▀▄▄▀ ▀▄█\n█ █▄▄█▄▄▄███▀ █▀\n▀▄▄█▄██▄█▄██▄▄▀ \n█▄▄▄▄██▀█▄▄▄▄▄█ "]]], + ["vikemon", [["angry", " ▄▄ ▄▄ ▄▄ ▄▄ \n████▀▄▀▀▄█ ████ \n▀██ ▄ ▀█▀██▀█\n █▀▀▄▀▀ ▄▀▄▀▄▄▀█\n ▀▄▀ ▀ ▄▀ █▄▀▀▄▀\n▄▀▄█▀▀▀█▄▀█▄▀▀▀▄\n█▀▄▀█▀▀▀▄▄ █▀▀▀█\n▀█▄▄▄███▄▄▄██▄▄█"], ["attack", "▄██▄ ▄▄ ▄▄▄██▄ \n▀███▀▄▀▀ █▀██▀▄ \n ▄▀▄ ▄▀ ▀█▀▄▄ █\n █▄▄▄▄▄ ▄▀▄▀▄▄▀█\n ▄▄▄▄▀ █▀█▄▀▀▄▀\n ▀▄▄▄▄▀ ▄▀ ▀█ \n▄▀▀ ▀▄▄▀▀▀█▄▀█ \n█▄▄▀▀▀█▄▄▄▀▄▄▄█ "], ["eat_1", "▄██▄▄█▀█▄▀█ ▄██▄\n▀███▀ ▀ ▀█▄▀██▀\n █ ▀▄ ▀ █▀▀██\n █▀███▀█ █▄▀▀▄█\n ▄▄▀████▀ ▄█▀▀▀▄\n█ ▀▄▄ ▄▄█ ▀▄ █\n▀▀▀█▀█▀▀▄█▀▀▀██▀\n █▄▄▄▀▄▄▀█▄▄▄█ "], ["eat_2", " ▄▄ ▄▄ ▄▄ ▄▄ \n████▀▄▀▀ █ ████ \n▀█▀▄ ▄▀▄ █▀██▀█\n █ ▄▀▄▄ ▄▀▄▀▄▄▀█\n ▀▄ ▄▀ █▄▀▀▄▀\n▄▀▄█▀▀▀█▄▀█▄▀▀▀▄\n█▀▄▀█▀▀▀▄▄ █▀▀▀█\n▀█▄▄▄███▄▄▄██▄▄█"], ["happy", "▄██▄▄▀█▄▄▀█ ▄██▄\n▀███ ▀ ▄ ▀▄▀██▀\n █ ▀▄ ▀ ▀ █▀▀██\n █▀███▀█ █▄▀▀▄█\n ▄▄▀████▀ ▄█▀▀▀▄\n█ ▀▄▄ ▄▄█ ▀▄ █\n▀▀▀█▀█▀▀▄█▀▀▀██▀\n █▄▄▄▀▄▄▀█▄▄▄█ "], ["injured_1", " \n ▄▄ \n ▄██▄ ████ \n ▀██▀▄▀▀ ▀▀▄▀▄ \n ▄▀█▄▀█▄▀▀▀▄▀▄\n ▄▀ ▀█▀▀█▀█▀\n█▄█ █▄ █▀▀▀█ █\n▀▄▄▀▄▄▄▄▀▄▄▄▀▄▄█"], ["injured_2", "▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n \n ▄▄ ▄██▄ \n ████ ▄▄▀██▀▄ \n ▀▀▄█ ▄▄ ▄█▄▀▄ \n ▄▀ ▀▀ ██▄▄▄█▄█\n▄▀▄ ▄ ▄█▄▄█ ▀▄\n██▄█▄▄█▄█▄▄▄█▄▄█"], ["sleep_1", " \n▄██▄ ▄▄ ▄▄ ▄██▄ \n▀███▀ ▀▀ █▄▀███ \n ▄▀ ▄▀▀█ \n █▀▀▄ ▀▀ █ ██ █ \n ▀█ ▀▀▀▀ █▄▄█▄ \n▄▀█▀▀▄▀▀▄▀█▄▄▀▀█\n▀▄█▄▄▀▄▄▄▄▀█▄▄▄█"], ["sleep_2", " \n▄██▄▄▀█▄▀█ ▄██▄ \n▀██▀ ▀ ▀▄▀███ \n █▄▄ ▄▄ ▄▀▀█ \n █ ▄ █ ██ █ \n ▀█ ▀▀▀▀ █▄▄█▄ \n▄▀█▀▀▄▀▀▄▀█▄▄▀▀█\n▀▄█▄▄▀▄▄▄▄▀█▄▄▄█"], ["walk_1", "▄██▄▄▀█▄▀█ ▄██▄ \n███▀ ▀ ▀█▄████▄\n █ ▀▄ ▀ ▄▀▄▀▀▄█\n █ ▀ ▀▀ █ █ ██ █\n ▄▀▄▄▄▄▀ ██▄▄█ \n█ ▄█▄ ▄▄▀█▄ ▀▄\n█▀▄ █▀▀▀▄▄ █▀▀▀█\n▀█▄▄▄███▄▄▄██▄▄█"], ["walk_2", " ▄▄ ▄▄ ▄▄ ▄▄ \n████▀▄▀▀▄█ ████ \n▀█▀▄ ▄ ▀█▀██▀█\n █ ▄▀▄▄ ▄▀▄▀▄▄▀█\n ▀▄ ▄▀ █▄▀▀▄▀\n▄▀▄█▀▀▀█▄▀█▄▀▀▀▄\n█▀▄▀█▀▀▀▄▄ █▀▀▀█\n▀█▄▄▄███▄▄▄██▄▄█"]]], + ["viximon", [["angry", " █▄ ▄█ \n █ ▀▄ ▄▀ █ ▄█\n █▀▀▀▀ █ ▄▀ █\n █ ▀ ▀█ █\n█ █▄ ▄█ █ ▄▀\n█ ▄▄ █▀ \n █▄ ▄█▀▄ \n█▄▀▀▀▀▀█▄▀ ▀▄█ "], ["attack", " ▄▄▄▀██▄▀▀█ \n ▄▀▀▀▀▀▀ ▄▀ ▄\n █ ▄ ▄█ ▄▀▄▀█\n ▀████▄ █ █\n ████ █ █\n ▄█▀ █ █▄▀ \n █▀▀▀▀ ▄ ▀▄ \n█▄█▀▀▀▀█▄▀▀█▄█ "], ["eat_1", " ▄▀█ ▄▀█ \n ▄█▄▄█▀ █ \n ▄▀ ▄▀▄ ▄█\n▄▀█ █ █▀ █\n█ ▄█▄ █ █\n█ ███ █ ▄▀\n █▄ ▄ █▀ \n █▄▀▀▀▀█▄▀▀▄█ "], ["eat_2", " \n ▄▀█ ▄▀█ \n ▄█▄▄█▀ █ ▄\n ▄▀ ▄▀▄ ▄▀█\n▄█▀▄ ▄▀▄ █ █\n█ ▄ █ █\n▀▄▀▀ ▀▀ █▄▀ \n█▄█▄▄▄▄█▄▄█▄▄█ "], ["happy", " █▀▄ ▄▀█ \n █ █ █ █ ▄\n █▀▀▀▀▀ ▄█ ▄▀█\n █▀▄ ▄▀▄ █ █\n█ ▄▄█▄▄ █ █\n█ ▀███▀ █▄▀ \n▄▀▄ ▄▀ ▄ █ \n▀▀▀▀▀▀██▀▀▀▄█ "], ["injured_1", " \n \n \n ▄▀▀▀▀▀▀▀▀▀▀█▄█\n▄▀▄ ▄ ▄▄▄▄█▀ █\n█▀▀ ▀▀ █ █\n▀▄ ▀▀ ▄ █▄▄▀\n█▄█▄▄▄█▄▄▄██▄▄█ "], ["injured_2", " \n \n \n ▄▀▀▀▀▀▀▀▀▀▀█ ▄\n▄▀ ▄▄▄▄▀▄▀█\n█▄█ █▄ ▀▄ █\n█▄ ▄▄ ▄ ▀▄█\n▀▄█▄▄▄█▄▄▄▄██▄▄█"], ["sleep_1", " \n \n ▄▄▄▄▄▄▄▄▄▄▄▄ \n ▄▀ ▄▀ \n▄█▄ ▄▄▄▀▄ ▀▀█▄ \n█ ▄ █ ▀▄▄ ▀▄\n▀▄█ ▀ █ ▀ █\n█▄▄█▄█▄█▄▄▄▄▄▄▄▀"], ["sleep_2", " \n \n ▄▀▀▀▀▀▀▀▀▀▀▀█ \n █ ▄▄▄▀ \n█▀▀ ▀▀█▀▄ ▀▀▄ \n█ ▄▀▄ █ ▀▄▄ █\n▀▄▄ █ ▀ █\n█▄▄█▄█▄█▄▄▄▄▄▄▄▀"], ["walk_1", " ▄▄ ▄▄ \n ▄▀ █▄▀ █ ▄\n █▀▀▀▀ █ ▄▀█\n █▄ ▄ ▀ ▀█ █\n█ ▀ ▀ █ █\n█ ▄▀▄ █▄▀ \n █▄ ▄ █ \n █▄▀▀▀▀█▄▀▀▄█ "], ["walk_2", " ▄▄ ▄▄ \n █ ▀▄ ▄▀ █ \n █▄▄█▄▄▀ █ ▄\n ▄▀ ▀▀▄▄▀█\n▄▀█ █ █ █\n█ ▄ █ █\n▀▄ ▀ ▀ █▄▀ \n█▄█▄▄▄▄█▄▄█▄▄█ "]]], + ["volcanicdramon", [["angry", " ▄▄▄▄ \n ▄██▄▄▄▀ \n▄▄███▀ ███ \n████▀█████ \n▀▄▄▄▄███▀▄██▄▄ \n ▀▄▄█ █ █▀███ \n ▄█▄██ █▀▄█▀██\n █▄█▄█▀▀▄▄▀ ██▀"], ["attack", " ▄▄▄█▀▀▀█ \n▄████▀ ▄██▀ ▄██ \n█▀▀▀▀████▀▄██▄▄ \n▀▄ █▀▀▄███▄▄ \n ▀▄▄▄▄████████▄ \n █▄▄███▄▀▀███ \n ▄█▄█████▄█▄ ▀█ \n█▄█▄█ █▄█▄█ "], ["eat_1", " ▄▄▀▀▀█ \n▄███▀▄▀███ ▄██ \n█▀▀▀▀████▀▄██▄▄ \n█▄ █▀▀▄███▄▄ \n ▀▄▄▄█▄███████▄ \n ▀▄▄████▄ ▀███ \n █▄████▄█▄ ▀█ \n █▄█▄█ █▄█▄█ "], ["eat_2", " ▄▄▄▄ \n ▄██▄▄▄▀ \n ▄▄██▀▄▀███ \n ████▀████ \n ▀▄▄▄▄█▀▄▄██▄▄ \n ▄▀ ███ █▀███ \n ▄█████ █▀▄█▀██\n █▄█▄█▀▀▀▄▄▀ ██▀"], ["happy", " ▄▄▀▀▀█ \n ▄▄█▀▄▀███ ▄██\n████▀████▀ ▄██▄▄\n█▄ █▀▀▄████▄ \n ▀▄▄▄█▄███████▄ \n ▀▄▄████▄ ▀███ \n █▄████▄█▄ ▀▀ \n █▄█▄█ █▄█▄█ "], ["injured_1", " \n \n ▄▄▄▀▀▀█ \n▄▄██▀█████ \n████▄▄▄█▀▄██▄▄ \n█▀▀▀ ██▄█▀█▀███ \n ▀██████ █▀▄█▀██\n █▄█▄████▄▄▀ ██▀"], ["injured_2", " \n \n ▄▄▄▄ \n ▄▄███▄▄▄▀ \n████ ▀▀██▀▄▄ \n████▀██▀▄█████▄ \n▀▄▄▄▄██▀█▀▄█▀██▄\n █▄█▄███▄▀▀▄███▀"], ["sleep_1", " \n ▄▄▄▄ \n ▄██▄▄▄▀ \n▄▄██▀▀▀███ \n████▀███▀▄██▄▄ \n▀▄▄▄▄██▄█▀█▀███ \n ▄█████ █▀▄█▀██\n █▄█▄████▄▄▀ ██▀"], ["sleep_2", " \n ▄▄▀▀▀█ \n ▄▄██████ \n ████▄▄▄██▀ \n █▀▀▀ ██▀▄██▄▄ \n ▀█▀▀█▄█▀█▀███ \n ▄█████ █▀▄█▀██\n █▄█▄████▄▄▀ ██▀"], ["walk_1", " ▄▄▀▀▀█ \n ▄▄█▀▀███ ▄▄ \n████▄▄███▀ ▄█▀▀ \n█▀▀▀ ██▀▀▄███▀▀ \n ▀▀█▀█▄███████▀ \n ▀▄▄████ ▀████ \n ▄█▄███▄█▄ ▀██ \n █▄█▄█ █▄█▄█ ▀ "], ["walk_2", " ▄▄▄▄ \n ▄██▄▄▄▀ \n▄▄██▀ ▄███ \n████▀████ ▄▄ \n▀▄▄▄▄▀██▄▀████▄ \n █▄▄██▀▄█ ███▄\n ▄▀█▀███▄▀ █▀▄██\n ▀▀▀▀▀ ▀▀ ▀▀ "]]], + ["vorvomon", [["angry", " ▄▄▄▄▄ \n ▄█████▄▄▄▀ \n ███████▀▀ ███ \n █████▀██████▀ \n █▄▄▄▄██▀██▀▄▀█\n ▀▄▄ ▄ █████▀█\n ▄███▄████▀█▀ \n █▄████▀▀█▄█▄█ "], ["attack", " ▄▄▄▄█▀▀▀█ \n █████████▀███ \n █▀▀▀▀▀▀█▄▄███ \n ▀▄ ▀██▀▄▀█\n ▄▀ ▀▀▀▀ ██▄█▀█\n ▀██▀█▀█████▀ \n ▄▄███▄█████▀█ \n █▄████▀▀▀▀█▄█▄█"], ["eat_1", " ▄▄▄▄█▀▀▀█ \n ████████▀▀███ \n ███████▄█▄███ \n ▀▄ ▀█████ \n ▄▀ ▄██▀▀▄█▀█\n ▀██▀▄ █████▀█\n ▄███▄████▀█▀ \n █▄████▀▀█▄█▄█ "], ["eat_2", " ▄▄▄▄▄ \n ▄█████▄▄▄▀ \n ███████▀▄▀███ \n █████▀██████▀ \n █▄▄▄▄██▀██▀▄▀█\n ▀▄▄ ▄ █████▀█\n ▄███▄████▀█▀ \n █▄████▀▀█▄█▄█ "], ["happy", " ▄▄▄▄█▀▀▀█ \n ████████▀▀███ \n ███████▄█▄███ \n ▀▄ ████▀▄▄▄\n ▄▀ ▄██▀█▄██▄█\n ▀██ ▄ █████▄▀\n ▄███▄████▀▄ \n █▄████▀▀█▄█▄█ "], ["injured_1", " \n ▄▄▄▄▄▄▄ \n ▄▄▄▄██████▄▄▄▀ \n ███████▀█████ \n ▀█▀▀▀▀█▄▄▄██ \n ▀█▀▀▀▀▀███▄ \n █▀▀██▄▀▄██▀▀▀█▄\n █▄▄▄██████▄▄▄██"], ["injured_2", " \n \n ▄▄▄██▀▀▀▀█ \n █████████████ \n ███████ ▀▀███ \n █▄▄▄▄██████ \n █▀▀██▄▀▄██▀▀▀█▄\n █▄▄▄██████▄▄▄██"], ["sleep_1", " \n ▄▄▄▄▄ \n ▄█████▄▄▄▀ \n █████████████ \n █████▀█▄▄▄██▀ \n █▄▄▄▄██▀██▄█▀█\n █▀▀██▄▀▄██▀▀▀██\n █▄▄▄██████▄▄▄█ "], ["sleep_2", " \n ▄▄▄▄█▀▀▀█ \n ▄▄▄▄█████████ \n ███████▀▀▀███ \n ▀█▀▀▀ ██████ ▄▄\n ▀█▀▀▀▀▀▄██▄█▄█\n █▀▀██▄▀▄██▀▀▀▄▀\n █▄▄▄██████▄▄▄█ "], ["walk_1", " ▄▄▄▄█▀▀▀█ \n ▄▄▄▄████▀▀███ \n ███████▄▄▄███ \n ▀█▀▀▀ █████▀▄▀█\n ▀█▀▀▀▀▀▄█▄██▀█\n ██▄▀▄████▀▀ \n ▄▄███████▄█ \n █▄████ ▀█▄█▄█ "], ["walk_2", " ▄▄▄▄▄ \n ▄█████▄▄▄▀ \n ███████▀ ███ \n █████▀██████▀ \n █▄▄▄▄██▀███ \n ▀▄▄ ▄ █▀▄██▀▄\n ▄███▄████▀█▀█\n █▄████▀▀█▄█▄█▀"]]], + ["wanyamon", [["angry", " \n \n \n █▀▄ ▄▀█ \n █▄ ▀▄▄▀ ▄█ \n ▄█ ▄ ▄ ▄█▄ \n █▄ ▀▀ ▀▀ ▄▄█▄▀█\n ▀▄▄▄▄▄▄▄▄█▄▄▀ "], ["attack", " \n ▄▄ ▄▄ \n █ ▀▄ ▄▀ █ \n █▀ ▀▀ ▀▀▄ \n █▀ █ █▀ ▀▀█▄▀▄\n ▀█▄ ██ ▀█▄▄▀ \n ▀▀█▄▄▀▀ \n "], ["eat_1", " \n \n █▀▄ ▄▀█ \n █▄ ▀▄▄▀ ▄█ \n ▄█ ▄ ▄ ▄█▄ \n █▄ ▀ ▀ ▄▄█ \n ▀▄▄██ ▄▄▄▀ █ \n ▀▀▀ ▀▄▀ "], ["eat_2", " \n \n \n ▄▄▄ ▄▄▄ \n █▄▄ ▀▄▄█ ▄▄█ \n ▄█ ▄ ▄ ▄█▄ ▄ \n █▄ ▀ ▀ ▄▄▀▀▄▀\n ▀▄▄▄▄▄▄▄▄▀▀▀ "], ["happy", " \n ▄▄ \n █ ▀▄ ▄▀▀▀█ \n █▀ ▀▀ ▀█ \n █ █▀▄ ▄▀█ ▀█ \n ▀█ ▄▄▄ ▀█▀ \n ▀▀██▀▄▀█ █ \n ▀▀ ▀▄█ "], ["injured_1", " \n \n \n \n▄▀▀▀▀▄ ▄▀▀▀▀▄ \n▀▄█▀ ▀▀ ▀█▄▀ \n █ ▄█ █▄ ▄▄█▄▄ \n ▀█▄▄▄▄▄▄▄▄█▄▄▄█"], ["injured_2", " \n \n \n \n ▄▄▄▄ ▄▄▄▄ \n█ ▄▄ ▀▄▄▀ ▄▄ █ \n █▀ ▄ ▄ ▀█▄▄ \n ▀▄██▄▄██▄▄█▄▄▄█"], ["sleep_1", " \n \n \n ▄▄▄▄ ▄▄▄▄ \n ▀▄▄ ▀▄▄▀ ▄▄▀ \n ▄█ ▄█▄ \n █▄▀▀ ▀▀ ▄▄█▄▄ \n ▀▄▄▄▄▄▄▄▄█▄▄▄█"], ["sleep_2", " \n \n \n \n █▀▀▀▄ ▄▀▀▀█ \n █▀ ▀▀ ▀█ ▄▄ \n █▀▄▄ ▄▄ ██▀ █ \n ▀▄▄▄▄▄▄▄▄█▄▀ "], ["walk_1", " \n \n \n █▀▄ ▄▀█ \n █▄ ▀▄▄▀ ▄█ \n ▄█ ▄ ▄ ▄█▄ \n █▄ ▀ ▀ ▄▄█▄▀█\n ▀▄▄▄▄▄▄▄▄█▄▄▀ "], ["walk_2", " \n \n \n █▀▀▀▄ ▄▀▀▀█ \n █▀ ▀▀ █ \n █▀ █ █ ▀▀█ \n ▀█ ▀█▀▀▄ \n ▀▀▀▀▀▀▀▀▀▀▀▄█"]]], + ["wargreymon", [["angry", " \n █▀▄ ▄▄▄▄▄▄▀█ \n ▀▄███▀▀█▄▄▄▀ \n ████▄▄████ \n▄▀▀█▀▀▀▀▀ ▄▀▀▄ \n▀█▀▀█▀██▀█▀▀█▀ \n ▄█▄▄▄██▄▄▄█▀▄▄ \n█▄█▄▄█▄▄██▄▄▄█▄█"], ["attack", " █▀▄ ▄▄▄▄▄▄▀█ \n █▄███▀ █▄▄▄▀ \n█▀█▀█▀█▀█▀██▄█▀█\n█ ▀▄ ▄ ▄ ▄▀██▀ █\n▀▄▄█▀▀▀▀▀▄█▀█▄▄▀\n ▀█▀▀▀▀▀▀█▀ \n ▄▄▀▀█▀▀█▀▀▄▄▄ \n █▄█▄▄▀▀▀▀▄▄▄█▄█"], ["eat_1", " █▀▄ ▄▄▄▄▄▄▀█ \n █▄███▀▀█▄▄▄▀ \n█▀████▄▄████▄▀▀█\n█ ▀▄ ▄█ ██▀ █\n▀▄▀█▀▀▀▀▀▄█▀█▄▄▀\n ▀▀█▀▀▀▀▀▀█▀ \n █▄▀█▀▀█▀▄█▄ \n █▄█▄██▀██▄█▄█ "], ["eat_2", " ▄▄ ▄▄ \n █ █▄████▀▀ █ \n▄▄████▀▄▀████▄▄▄\n▀▄▀██████▀▀█ ▄▀\n█ ██▄▄▄▄▄▄▀▄█▀ █\n█ ▄█▄▄▀▄▄▄█ ▄▀\n ▀███▄▄▄▄▄▄████ \n █▄█▄▄█▄▄█▄█▄█▄█"], ["happy", " █▀▄ ▄▄▄▄▄▄▀█ \n▄▄█▄██▀▄▀█▄▄▄▀▄▄\n█ █▀▀▀▀▀▀▀██▄▀ █\n▀▄▀▄ █ ██ ▄▀\n ▀▄█▀▀▀▀▀▄█▀█▄▀ \n ▀█▀▀▀▀▀▀█▀ \n ▄▄▀▀█▀▀█▀▀▄▄▄ \n █▄█▄▄▀▀▀▀▄▄▄█▄█"], ["injured_1", " \n ▄▄ ▄▄ \n █ █▄████▀▀ █ \n ▀███▀█████▀ \n █████▄▄█▀█▀▄ \n █▄█▄▄▄▄▄▄▀▄▄▄█\n ▄▀ ▄█▄▄█▄▄▄▀ █ \n █▄▄█▄▄█▄▄██▄▄██"], ["injured_2", " \n \n █▀▄ ▄▄▄▄▄▄▀█ \n █▄██████▄▄▄▀ \n ▄███▄▀▀███▀▄ \n █▀█▀▀▀▀▀▀▄█▄▄█ \n █▀▀██████▄█ ▀▄ \n █▄▄█▄▄█▄▄██▄▄██"], ["sleep_1", " \n ▄▄ ▄▄ \n █ █▄████▀▀ █ \n ▄████▀▀███▀ \n █▀██████▀▀█▀▀█ \n ▄▀▀▄▄▄▄▄▄█▄▄█▄ \n █▄ █▄▄▄▀█▀ ▀ █\n █▄███▄▄███▄▄▄▄█"], ["sleep_2", " \n █▀▄ ▄▄▄▄▄▄▀█ \n ▀▄██████▄▄▄▀ \n ▄▄█████▄▄████▄▄\n ▀▄▄█▀▀▀▀▀ ▄▀▄▄▀\n █▄ █▀█▀▀█▀▄▄█ \n █ █ ▀█▄█▄▀ ▀ █\n █▄▄████▄██▄▄▄▄█"], ["walk_1", " █▀▄ ▄▄▄▄▄▄▀█ \n ▀▄███▀▀█▄▄▄▀ \n▄▄████▄▄████▄▄▄▄\n▀▄▀█▀▀▀▀▀ ▄▀ ▄▀\n█ ▀██▀▀█▀▀ ▀█▀ █\n▀▄█▀█▀▀ ▀▀▀█ █▀▄\n█▄▄█▄▀█▀▀█▀▄█▄▄█\n █▄█▄██▀██▄█▄█ "], ["walk_2", " ▄▄ ▄▄ \n █ █▄████▀▀ █ \n█▀████▀ ▄███▀▀▀█\n▄▀▄██████▀▀█▄▄▀▄\n█ ▄█▄▄▄▄▄▄▀▄▀▄▄▀\n▄▀▀██▄▄▀▄▄▄▄▀▀ █\n ▀█▄█▄▄▄▄▄▄██▄█ \n █▄█▄▄█▄▄█▄█▄█▄█"]]], + ["wargreymon_x", [["angry", " ▄▄ ▄ \n█ ▀▄▄▀▀▀▀█▀▀ █ \n▀▄▀ ▄▄█ ▀▀▀█▀ \n ▀▄█▄▄ ▄▄▄█▀▀▀█ \n ▀▄▄█▄█▀▀▄▄▄▀▀█\n▄▄▀█ ▄▄ ▄█▀▄ ▄▀\n▀▄▄▀█▄▄█▀▀██▄█▄ \n█▄█▄▀█▄▀█▄▄█▄█▄█"], ["attack", " ▄▀█ ▄▄▄▄▄▄▄▀▄ \n █ ▄▀ ▄ █▄▄▄█ \n █ ▄▀▀▀▄▄▄▄▀ \n▄▀▀█▀▀▀█ █▀▄ \n▄▀▀█ █▄█ ▄▀ \n ▀▀█▀███ █▀█ \n ██▀█▀█▀▀█▄█▄ \n █▄█▄█▀▀█▄█▄█▄█ "], ["eat_1", "▄▀█ ▄▄▄▄▄▄▄▀▄ \n█ ▄▀▀ ▄ █▄▄▄█ \n █ ▄ ▀ ▀ ▄▄█▄▄ \n █████ ██▀ ▄▀ \n▄▀█▀▀▀▀▄▀ ██▀▀█ \n▀▄███▀▀▄▄█▀▄ ▄▀ \n ▄█▀█▀█▀▀█▄█▄ \n █▄█▄█▀▀█▄█▄█▄█ "], ["eat_2", " ▄▄ ▄ \n█ ▀▄▄▀▀▀▀█▀▀ █ \n▀▄▀ ▄▀▄ ▀▀▀█▀ \n ▀▄█▄▄ ▄▄▄█▀▀▀█ \n ▀▄▄█▄█▀▀▄▄▄█▄ \n ▄▀█ ▄▄ ▄█▀ █ \n▀▄▄▀█▄▄███▄▀▄█▄ \n█▄█▄▀█▄▀█▄▄█▄█▄█"], ["happy", "▄▀█ ▄▄▄▄▄▄▄▀▄ \n█ ▄▀▀ ▄ █▄▄▄█▄ \n █ ▄ ▀ ▀ ▄█ █ █\n █▀▀█ █████▀▀█▀\n █▀▀▀▀ █▄▄▀ \n ▄▀█▄▀▀▄▄█▀█ \n ▀██▀█▀█▀▀█▄█▄ \n █▄█▄█▀▀█▄█▄█▄█ "], ["injured_1", " \n▄▀█ ▄▄▄▄▄▄▄▀▄ \n█ ▄▀▀▄ █▄▄▄█ \n █ ▄ ▀▀ ▄▄█▄▄ \n █▀▀█ ███▀ ▄▄▀ \n ████▄ █▀▀ █ \n ▄█▄▄ ▀█▀█▄▄▄█▀▄\n█▄█▄█▄████▄█▄█▄█"], ["injured_2", " \n ▄▄ ▄ \n█ ▀▄▄▀▀▀▀█▀▀ █ \n▀▄▀ █▄ ▀▀▀█▀ \n ▀▄█▄▄ ▄▄▄█▀▀▀█ \n ▀▄▄█▄▀▀█▄▀▀█ \n ▄█▄▄ ██▀█▄▄▄█▀▄\n█▄█▄█▄▄███▄█▄█▄█"], ["sleep_1", " \n ▄▄ ▄ \n█ ▀▄▄▀▀▀▀█▀▀ █ \n▀▄▀ ▄▄▄ ▀▀▀█▀ \n █▄█▄▄ ▄▄▄█▀▀▀█ \n █▄▄█▄█▀▀▄▄█▀▀█\n █▄▀▀▄▄▄▄█▄▀▄▀▄▀\n █▄▄▄█▄▄██▄▄▄▄█ "], ["sleep_2", " \n ▄▀█ ▄▄▄▄▄▄▄▀▄ \n █ ▄▀▀ █▄▄▄█ \n █ ▄ ▀▀▀ ▄▄█▄▄\n ▄█▀▀█ ███▀ ▄▄▀\n █▄█▀▀▀▀ ███ █\n █▄▀▀▄██▄█▄▀▄▀▄▀\n █▄▄▄█▄▄██▄▄▄▄█ "], ["walk_1", "▄▀█ ▄▄▄▄▄▄▄▀▄ \n█ ▄▀▀▄▄▄ █▄▄▄█ \n █ ▄▀▀▀ ▄▄█▄▄ \n █▀▀█ ███▀ ▄▀ \n ▄█▀▀▀▀ ██▀▀█ \n █ █▄▀▀▄▄█▀▄ ▄▀ \n ██▀█▀█▀▀█▄█▄ \n █▄█▄█▀▀█▄█▄█▄█ "], ["walk_2", " ▄▄ ▄ \n█ ▀▄▄▀▀▀▀█▀▀ █ \n▀▄▀ ▄██▀ ▀▀▀█▀ \n ▀▄█▄▄ ▄▄▄█▀▀▀█ \n █▄▄█▄█▀▀▄▄▀▀█ \n █ █ ▄▄ ▄▀▄ ▄█ \n ▄█▀█▄▄██▀█▄██▄ \n█▄█▄▀█▄▀▀▄▄█▄█▄█"]]], + ["wargrowlmon", [["angry", " ▄▄ ▄▄▄ ▄▄▄ \n ▄▄▄▀▀▀█ ▀█▀ ▄▀ \n █ ▄█▀ ▄▀▄█▄▄▄\n ▄▀▀▄▄▄▄▀▄██▀█ █\n██▀▀▄▄▄▄█▀▀▄▀ █\n▀▄▀█ ▄▄██▀ ██\n █▄██ ▀▄▄▄▄▀▄▀\n █▄█▄▄██▀▀▄█▄█▄█"], ["attack", "▄▄▄██▄█▀█▄▄▀▀█ \n█ ▄█▀ █ ▄█▀▄ \n▄█▄▄▄▄▄▄▀▄███ █\n██████▀▄██▀█ ▄▀\n█▄▀ ▀ ▄█▄▄█ ▄▀█\n▀▄▀▀█▀▀▄█▀▄▄▀▄ █\n ▄█▄██▀ ▄ ▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["eat_1", " ▄▄██▄█▀█▄▄▀▀█ \n █ ▄█▀ █ ▄▀ \n ▀██▄▄▄▄▄▀▄██▀▀█\n█▀▀████ ▄██▀ ▄▀ \n█ ▄█▄▄▄▄▀ ▄██▀▀█\n▀▄ ▀▄▄▄█▀▀ ▄█\n ▄███▄ ▀▄▄▄▀▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["eat_2", " ▄▄ ▄▄▄ ▄▄▄ \n ▄▄▄▀▀▀▀ ▀█▀ ▄▀ \n █ ▄▀▄ ▄▀▄█▄▄▄\n ▄▀▀▄▄▄▄▀▄██▀ ▄▀\n ▀█▀▄▄▄▄█▀▀▄▄█▄▄\n▄▄▀█ ▄▀▀▀▀▀ ▄█\n▀▄▄▄██▀▀▄▄▄▄▄▀█▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["happy", "▄▄▄██▄█▀█▄▄▀▀█ \n█ ▄▀▄ █ ▄█▀ \n▄██▄▄▄▄▄▀▄▀ █▀▀█\n██████▀ ▀█ █▄▀ \n█▄▀▀▀ ▄███▄ ▀▄▀█\n▀▄▀▀█▀▀▄█▀▀▄ █ █\n ▄█▄██▀ ▄ ▀▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["injured_1", " ▄▄ ▄▄▄ ▄▄▄ \n▄▄▄▀▀▀▀ ▀█▀ ▄▀ \n█ ▀▄▄ ▄▀▄█▄▄▄ \n█▀▀▄▄▄▄▀▄▀██ ▄▀ \n ▀▄▄▄▄▄█▀▄ ▀█ \n█▀▄█ ▄██ █▀▀█\n██▄▄█▀▀▄▀ ▄█▄█ \n█▄█▄██▄████▄█▄▄█"], ["injured_2", " \n ██▄█▀█▄▄▀▀█ \n█▀▀ ▄ █ ▄▀ \n█▄▄ ▀▀▄▀▄██▀▀█ \n▀▄ ▀▀▀▀▄█ ▀█▄▀ \n█▀██▀▀▀▄██ █▀▀█\n██▄▄█▀▀ █▀ █▄█ \n█▄█▄██▄█▄▄▄██▄▄█"], ["sleep_1", " ▄▄ ▄▄▄ ▄▄▄ \n ▄▄▄▀▀▀▀ ▀█▀ ▄▀ \n █ ▀▀▀ ▄▀▄█▄▄▄\n ▄▀▀▄▄▄▄▀▄██▀ ▄▀\n ▀█▀▄▄▄▄█▀▀ ▄▀ \n█▀▄█ ▄█▀█▀█▀▀█\n██▄▄█▀▀ █▀▀▀█▄█ \n█▄█▄██▄▄█▄▄▄█▄▄█"], ["sleep_2", " \n ██▄█▀█▄▄▀▀█ \n█▀▀ ▄▄▄ █ ▄▀ \n▀▄▄ ▄▀▄██▀▀█ \n█▀███▀▀▄█▀▀ ▄▀ \n█▀▄▄▄▄▀██▀█▀█▀▀█\n██▄▄█▀▀ █▀▀▀█▄█ \n█▄█▄██▄▄█▄▄▄█▄▄█"], ["walk_1", " ██▄█▀█▄▄▀▀█ \n █▀▀ ▄▄ █ ▄▀ \n ▀▄▄ ▀▀ ▄▀▄██▀▀█\n █▄▄▀▀▀▀▄██▀ ▄▀ \n █▄▀▀▀▀█▄▄█▀▀▀█\n█▀▀▀▄▄█▀▀▀ ▄██\n █▄▄█▄ ▀▄▄▄▀▀▀▄▀\n█▄█▄▄██▀▀▀▄█▄█▄█"], ["walk_2", " ▄▄ ▄▄▄ ▄▄▄ \n ▄▄▄▀▀▀▀ ▀█▀ ▄▀ \n █ ▄█▀ ▄▀▄█▄▄▄\n ▄▀▀▄▄▄▄▀▄██▀ ▄▀\n ▀█▀▄▄▄▄█▀▀▄▄█▄▄\n▄▄▀█ ▄▀▀▀▀▀ ▄█\n▀▄▄▄██▀▀▄▄▄▄▄▄▀▀\n █▄█▄▄██▀▄█▄█▄█ "]]], + ["wargrowlmon_x", [["angry", " ▄▄▄ ▄▄ ▄▄ \n ▄▄▀ ▄ ▀█ █▀▄▀ \n█ ▄▄▀▀ ▄▀ ▄▀▄█▄ \n▀█ ▀▀▀▄██▀▀▄▄▀ \n █▀▀█▀▀ █▄█▄▀▀█\n▄█ ██ █▀▀▀ ▄▀\n▀██▀█▀▀█▄▄▄▄▀█ \n█▄█▄█▀▀▀▀▄█▄█▄█ "], ["attack", " ▄▀▀▀▄█▀▄▄▀█\n ▄▀▀ ▄█ █ ▀▄▀▄\n █▄██▄▄▄▀▄▄█▄█▀\n █▀▀▀▀▄█▀▀▄▄▀▄\n ▄▀▀█▀▀▀█ ▄█▀ █\n ███ █ ▄█▀ █ \n █▀▀▀███▄▄▄▄█ \n █▄█▄█▀ ▀▄█▄█▄█ "], ["eat_1", " ▄▀▀▀▄█▀▄▄▀█ \n▄▀▀ ▄▄▄ █ ▀▄▀▄ \n▀▀█▄▄▄▄▀▄▄█▄▀▀█ \n ▄█▀▀█▀▄▀█ ▄▀█ \n█ ▀▀▀ ▄▀▄██▀▀▀▀█\n █▀█▀▀▀█▀ ▄▄▀▀\n ▄█ ▀▄▄▄████▄ \n █▄█▄█ ▀▄█▄█▄█ "], ["eat_2", " ▄▄▄ ▄▄ ▄▄ \n ▄▄▀ ▄ ▀█ █▀▄▀ \n█ ▄▄▀ ▀▄▀ ▄▀▄█▄ \n▀█ ▀▀▀▄██▀▀▄▄█▄\n ▄▀▀█▀▀▀ █▄▀▄▀ █\n█ ██ █ ▄█▀▀ ▄▀\n █▀▀█▀▀██▄▄▄▀█ \n█▄█▄█▀▀▀▀▄█▄█▄█ "], ["happy", " ▄▀▀▀▄█▀▄▄▀█▄▄\n▄▀▀ ▄▀▄ █ ▀▄██ █\n▀▄██▄▄▄▀▄▄█▀█ █\n ▄▀▀▀▀▀▄█ ▄█ ▄▀\n █▀▀█▀▀ ██ ▄▀ \n█ ██ █ ▄▄▀█▀▀ \n ▀█▀▀██▄ ▄█▄ \n █▄█▄█ ▀▄█▄█▄█ "], ["injured_1", " \n ▄▀▀▀▄█▀▄▄▀█ \n▄▀▀ ▀▄▄ █ ▀▄▀▄ \n█▄▀▀▄▄▄▀▄▄█▄▀▀█ \n▄█▄▄▄▄▄█▀█ ▄█▀▀█\n█ █▄▄▀▄ ██▀ █▀\n▀▄ ▀█▄█▄▀ ▄█▄ \n█▄█▄▄██▄▄▄▄█▄█▄█"], ["injured_2", " \n ▄▄▄ ▄▄ ▄▄ \n ▄▄▀▄ ▀█ █▀▄▀ \n█ ▄▄ ▀▀▄▀ ▄▀▄█▄ \n▀█ ▀▀▀▄██▀▀▄▀▀█\n█▀█▀▀█▀▀ █▄▀ █▀\n▀▄ ▀█▄█▄▀▀ ▄█▄ \n█▄█▄▄██▄▄▄▄█▄█▄█"], ["sleep_1", " \n \n ▄▄▄ ▄▄ ▄▄ \n ▄▄▀ ▀█ █▀▄▀ \n█ ▄▄ ▀▀▄▀ ▄█▄█ \n▀█ ▀▀▀▄█▀▀▄▄▀ \n█▀▀███▀ █▀█▀█▀▄ \n█▄▄▄██▄██▄▄▄▄▄█ "], ["sleep_2", " \n \n ▄▀▀▀▄█▀▄▄▀█ \n▄▀▀ ▄▄ █ ▀▄▀▄ \n█▄▀▀▄▄▄▀▄▄█▀▀█ \n▄▀▄▄▄▄▄▀█ ▄▀▀▄ \n█▀▀█▄▄ █▀█▀█▀▄ \n█▄▄▄██▄██▄▄▄▄▄█ "], ["walk_1", " ▄▀▀▀▄█▀▄▄▀█ \n▄▀▀ ▄█▀ █ ▀▄▀▄ \n█▄▀▀▄▄▄▀▄▄█▄▀▀█ \n ▀▄▄▄▄▄█▀█ ▄▀█▄▄\n▄▀▄▄▀▄ ▄██▀▀ █\n▀▄██▄█▄▄▀ ▄▄▀ \n █ ▀▄▄▀▀▀██▄ \n █▄█▄█ ▀▄█▄█▄█ "], ["walk_2", " ▄▄▄ ▄▄ ▄▄ \n ▄▄▀ ▄▄▀█ █▀▄▀ \n█ ▄▄▀▀ ▄▀ ▄▀▄█▄ \n▀█ ▀▀▀▄██▀▀▄▄▀ \n ▄▀▀█▀▀▀ █▄█▄▀▀█\n█ ██ █ █▀▀ ▄▀\n █▀▀█▀▀█▄▄▄▄▀█ \n█▄█▄█▀▀▀▀▄█▄█▄█ "]]], + ["warumonzaemon", [["angry", " \n ▄▀▀█▄▄▄▄▄▄█▀▀▄ \n █▄█▀█████▀██ █ \n ██▄▄▀▀▀▄▄███▀ \n▄▄██ ▀█▀ ██▄▄\n██▀█▄ ▀ ▀▀ ▄█▀██\n ▄▄█ ▀▄▀ █▄▄ \n█████▄█▄█▄▄█████"], ["attack", " ▄▀▀█▄▄▄▄▄▄█▀▀▄ \n █▄█ ▀███▀ ██ █ \n ██▀▀▄▄▄▀▀███▀ \n█▄██ █▄█▄▄█ ██▄█\n████ ██████ ████\n ▀▀█ █▀██▀█ █▀▀ \n ▄█▄ ▄█▄ \n ██████▀▀██████ "], ["eat_1", " ▄▀▀█▄▄▄▄▄▄█▀▀▄ \n █▄▀▄▀███▀▄▀█ █ \n ██▀▀▄▄▄▀▀▀██▀ \n▄▄██ ██████ ██▄▄\n████ ▀█▄▄▄▀ ████\n ▀██▀ ▄ ▄ ▀██▀ \n ▄▄█ ▄▀▄ █▄▄ \n█████▄▄▄▄▄▄█████"], ["eat_2", " ▄▄▄ ▄▄▄ \n █ ▄████████▄ █ \n ▀███████████▄█ \n █▄▄▄▀▀▀▄▄▄██ \n▄██▀ ▀█▀ ▀██▄\n█▀█▄ ▀▀ ▀▀ ▄█▀█\n ▄█ ▀▄▀ █▄ \n████▄▄█▄█▄▄▄████"], ["happy", " ▄▀▀█▄▄▄▄▄▄█▀▀▄ \n █▄█▀█████▀██ █ \n▄ ██▄▄▀▀▀▄▄███▀ \n████ ▀█▀ ▄ █▀ \n▀███▄ ▀▀▀▀ ▄███ \n ▀█ ▀▄▀ ███▄\n ▄███ ▀ ▀ ▄█▄▀▀\n████▀▀▀▀▀▀█████ "], ["injured_1", " ▄▄▄ ▄▄▄ \n █ ▄████████▄ █ \n ▀███▀███▀███▄█ \n ██▄▄▀▀▀▄▄███ \n ██▀ ▀█▀ ▀██ \n▄███▄ ▀ ▀ ▄███▄\n▀▀▄█ ▀▄▀ █▄▀▀\n ████▄█▄█▄▄████ "], ["injured_2", " \n ▄▄▄▄▄▄▄▄▄▄▄▄▄▄ \n█ ▄██████████▄ █\n▀▀██▀ ███ ▀███▀▀\n ███▀▄▄▄▀▀███ \n ▄██ ▄▀▄ ██▄ \n████▀ ▄ ▄ ▀████\n ██▄▄▄▄█▄▄▄▄▄██ "], ["sleep_1", " \n ▄▀▀█▄▄▄▄▄▄█▀▀▄ \n █ ▄████████▄ █ \n ▀██▀▀███▀▀██▄█ \n ██▀▀▄▄▄▀▀▀██ \n █▄█ █ █▄█ \n ████▄▄▄▄▄█████ \n███████▄████████"], ["sleep_2", " ▄▄▄ ▄▄▄ \n █ ████████ █ \n █▄██████████ █ \n ██▄▄▀▀▀▄▄███▀ \n ▄▀█ ▀█▀ █▀▄ \n ███▄ ▀ ▄▄███ \n ▄█▀███▀████▀█▄ \n████▄▄▄▄▄▄▄▄████"], ["walk_1", " ▄▀▀█▄▄▄▄▄▄█▀▀▄ \n █▄█▀█████▀██ █ \n ██▄▄▀▀▀▄▄███▀ \n ▀█ ▄▀█▀ ▄ █▀ \n ▄██▄ ▀ ▀▀ ▄██▄ \n ▀██ ▀▄▀ █████ \n ▄█▄ ▀ ▀ ▄█▄ \n ██████▀▀██████ "], ["walk_2", " ▄▄▄ ▄▄▄ \n █ ▄████████▄ █ \n ▀██ ▀███▀ ██▄█ \n▄ ██▀▀▄▄▄▀▀▀██ ▄\n████ ▀▄▀▄▄▀ ████\n ▀██▀ ▄ ▄ ▀██▀ \n ▄▄█ ▄▀▄ █▄▄ \n█████▄▄▄▄▄▄█████"]]], + ["waruseadramon", [["angry", "▄▄ ▄▄▄▄▄ \n▀███▄██████▀▀▄▄ \n ▄███▀ ███▀▀█▀ \n███▀▀▀███▀▀▀▀█▄ \n▀▀▄█████▄████▄ \n ▄█ █▄▀██▄ ▄█\n █▀▄▀███▄▄▄▄██▀\n ▀▄█▄█▄█▄██▀ "], ["attack", "██▄▄ ▄▄▄▄████▀ \n ▀████▀████▄▄█▀ \n▄████▄▄███▄▄█▄ \n▀▀ ▀ ███▀▄▄▄▄▀▀ \n █▀███▀▀▀ \n ▀██▀███▄▀▀▀ ▄██\n █▀▄▀███████▀ \n ▀█▄█▄█▄██▀ "], ["eat_1", "██▄▄ ▄▄▄▄████▀ \n ▀███▀▀▀███▄▄█▀ \n▄███▄█▄███▄▄█▄ \n██▀▀▀▀██▀▄▄▄▄▀▀ \n █▀███▀▀▀ \n ▀██▀███▄▀▀▀ ▄██\n █▀▄▀███████▀ \n ▀█▄█▄█▄██▀ "], ["eat_2", "▄▄ ▄▄▄▄▄ \n▀███▄██████▀▀▄▄ \n ▄██▀▄▀███▀▀█▀ \n███▀▀▀███▀▀▀▀█▄ \n▀▀▄█████▄████▄ \n ▄█ █▄▀██▄ \n █▀▄▀███▄▄▄███▄\n ▀▄█▄█▄█▄█▀ ▀▀"], ["happy", "██▄▄ ▄▄▄▄████▀ \n ▀███▀█████▄▄█▀ \n▄███▄█▄███▄▄█▄ \n██▀▀▀▀██▀▄▄▄▄▀▀ \n ▄█▀███▀▀▀ \n ███▀███▄▀▀▀ ▄██\n █▄▀▄▀███████▀ \n ▀█▄█▄█▄██▀ "], ["injured_1", " \n██▄▄ ▄▄▄▄████▀ \n ▀█████████▄▄█▀ \n▄████ ▀███▄▄█▄ \n██▀▀▀███▀▄▄▄▄▀▀ \n ▀██▀█▀▀██▀▀▀ ▄\n █▀▄▀███▄▄▄▄███\n ▀▄█▄█▄█▄██▀▀ "], ["injured_2", " \n▄▄ ▄▄▄▄▄ \n▀███▄██████▀▀▄▄ \n ▄███▀████▀▀█▀ \n█████▄▄██▀▀▀▀█▄ \n▀▀▄▄▄███▄████▄ \n ▄▀█▀█▄▄██▄▄▄▄ \n ▀▄█▄█▄█▄██▀██"], ["sleep_1", " \n██▄▄ ▄▄▄▄████▀ \n ▀█████████▄▄█▀ \n▄████▄▄███▄▄█▄ \n██▀▀▀███▀▄▄▄▄▀▀ \n ▀██▀█▀▀██▀▀▀ ▄\n █▀▄▀███▄▄▄▄███\n ▀▄█▄█▄█▄██▀▀ "], ["sleep_2", "▄▄ ▄▄▄▄▄ \n▀███▄██████▀▀▄▄ \n ▄███▀▀███▀▀█▀ \n███▀▀▀███▀▀▀▀█▄ \n▀▀▄█████▄████▄ \n ▄█ █▄▀██▄ ▄█\n █▀▄▀███▄▄▄▄██▀\n ▀▄█▄█▄█▄██▀ "], ["walk_1", "██▄▄ ▄▄▄▄████▀ \n ▀███▀▀▀███▄▄█▀ \n▄███▄█▄███▄▄█▄ \n██▀▄▄▄██▀▄▄▄▄▀▀ \n ▀▀█▀█▀███▀▀▀ \n ▄█▀▄██▄▀▀▀ ▄██\n █▄▀▄▀███████▀ \n ▀█▄█▄█▄██▀ "], ["walk_2", "▄▄ ▄▄▄▄▄ \n▀███▄██████▀▀▄▄ \n ▄██▀▄ ▄██▀▀█▀ \n███▀▀▀███▀▀▀▀█▄ \n▀▀▄█████▄████▄ \n ▄█ █▄▀██▄ ▄█\n █▀▄▀███▄▄▄▄██▀\n ▀▄█▄█▄█▄██▀ "]]], + ["weregarurumon", [["angry", " ▄▀█▄▄▄ ▄▀█ \n ▄▄▄█▀ ▄ ▀ ▄▀ \n █ ▀ ▄▄██ \n ▀█▀█▀▄ ▄█ \n █▀▀▀▀▀ ▀▄▀█\n █▀█▄▄▄▄▄▀ █ █\n ▄█▄▀ ▄▄ ▀▄▄█▀ \n █▄▄▄▄█ █▄▄▄▄█ "], ["attack", " ▄▀█▄▄▄ ▄▀█ \n ▄▄▄▀▀ ▄▄▀ █ \n ▀▄▄▄▄▄▀▀ ▄██ \n ▀ ▀ █ ▄█▀ \n ▄▄▄▄▄▀ ▀▄▀█\n ▀▄▄▄▄▀ ▄▀ █ █\n █▄▄▀▀▀▀▀▀█▄▀ \n █▄▄▄█▀▀█▄▄▄▄█ "], ["eat_1", " ▄▀█▄▄▄ ▄▀█ \n ▄▄▄▀▀ ▄▄▀ ▄▀ \n ▀▄▄▄▄ ▀ ▄▄██ \n █ ▄█ \n █▀▀▀ ▄ ▄▄ ▀▄▄▄\n ▄▀█▀▀ ▀▄▄▀ █\n ▀▄▄█▀▀▀▀▀▀▄▄▀ \n █▄▄▄█▀▀█▄▄▄▄█ "], ["eat_2", " ▄▀█▄▄▄ ▄▀█ \n █▀ ▄▄▄▀ ▄▀ \n █▀▀ ▀ ▀▄▄██ \n ▀▄▄▄█▄ ▄█ \n ▀▄▄▄▄ ▄▄█ \n █ █▄▄▄▄█ █▀▀█\n ▄█▀▄▄▄▄ ▀▀▄▄▀ \n █▄▄▄▄█ █▄▄▄▄█ "], ["happy", " ▄▀█▄▄▄ ▄▀█ \n ▄▄▄▀▀ ▄▄ ▀ ▄▀ \n ▀▄▄▄▄▀ ▀▄██ \n █ ▄█ \n █▀▀▀ ▄ ▀▀▄ \n ▄▀▀█▀ ▄▀▀▄▀█\n ▀▄▄▀▀▀▀▀▀▄▄█▄▀\n █▄▄▄█▀▀▀▄▄▄▄█ "], ["injured_1", " ▄▄ ▄▄ \n █▄▀▀▀▀▄▀ █ \n ▄▄▄▀ ▄ ▄█ \n █ ▄ ▀ ▀▀█▀ \n █▀▀▀▀ ▀▀▄▄ \n ▄▀█▀▀ ▄ █▄\n ▀▄▄▀▀▀▀▀▀▄▄█ █\n █▄▄▄███▄▄▄▄▄█ "], ["injured_2", " \n █▀▄▀▀▀▀▄▀▀▀▄ \n ▄▄▄▀ ▄ ▄█▀ \n █ ▄▀▀▀ ▀██ \n █▀▀▀▀ ▀▀▄ \n ▄▀█▀▀ ▀▄ █▄ \n █ ▄▄▀▀▀▀▀▀▄█▄ █\n █▄▄▄███▄▄▄▄▄█▀"], ["sleep_1", " \n ▄▄ ▄▄ \n █▄▀▀▀▀▄▀ █ \n █ ▄█ ▄ \n █ ▄▄▄ ▄█▄▀█ \n▄▄█ ▄███▄▀ \n█ ▀▄▄▄▄▀ ▄▀ ▀█ \n█▄▄█▄▄▄▄▄█▄▄▄▄█ "], ["sleep_2", " \n ▄▀█▄▄▄ ▄▀█ \n █▀ ▀ ▄▀ \n ▄▀ ▀█ \n █ ▀▀▀ ██▄▄▀█\n▄▄█ ▄ ▀▀██ ▄▀\n█ █▀▀▀ ▄▀ ▀▄ \n█▄▄█▄▄▄▄▄█▄▄▄▄█ "], ["walk_1", " ▄▀█▄▄▄ ▄▀█ \n █▀ ▄▄▄▀ ▄▀ \n █▀▀ ▀ ▀▄▄██ \n ▀▄▄▄█▄ ▄█ \n ▀▄▄▄▄ ▀▄▀█\n █ █▄▄▄▄▄▄▀ █ █\n ▄█▀▄▄▄ ▀▄▄█▀ \n █▄▄▄▄█ █▄▄▄▄▄█ "], ["walk_2", " ▄▄ ▄▄ \n █▄▀▀▀▀▄▀ █ \n ▄▄▄▀ ▄▀█▀ ▄█ \n █ ▄ ▀▀█▀ \n █▀▀▀▀ ▀▀▄ \n ▄▀█▀▀ ▄ █▄▄\n █▄▄▀▀▀▀▀▄▄▄█ █\n █▄▄▄▄█▀█▄▄▄▄▄█ "]]], + ["weregarurumon_x", [["angry", " ▄▄ ▄▄▄▄ \n █▄▀▀▀▀▀ ▄▀ \n▄▄▄▀ ▄█ █▄▀▀█\n█ ▄ ▀██ ▄█▄\n █▀▀▀▀ ▄██▄▀ ▄▀\n ▄▀██▀ ██▄▄ █▀▄▄\n █▄▀█▀▀▀█▀▄▄█▄▄▀\n█▄█▄▄█▀▀█▄█▄█▄█ "], ["attack", " ▄▀█▄▄▄▄▀▀▀█ \n █▀ ▄▄ ▄▀█▄▄\n█▀▀ ▀▀ ▄▄█▀ ▄▀\n█▄██▄█▄ ▄█▀▄▀▀█\n▄█▀██▀█ █ █▄▄▀ \n██▄▄▄▄▄███▄█▄▄▀█\n ▄█▀▄▄▄ ▀▀██▄▄▄▀\n█▄█▄▄█ █▄█▄█▄█ "], ["eat_1", " ▄▀█▄▄▄▄▀▀▀█ \n▄▄▄█▀ ▄ ▄▀▄▄▄\n█ ▀ ▀ ▄▄█▀ ▄▀\n ▀████▄ ▄█▄▄▀▀█\n ██▄▄█ ██▀█▄▄▀ \n▄▀█▄▄▄▄███▀ █▄▄▄\n▀▄▄▀▄▄▄ ▀▀▄▄█▄▄▀\n█▄█▄▄█ █▄█▄█▄█ "], ["eat_2", " ▄▄ ▄▄ \n █▄▀▀▀▀▄▀ █ \n▄▄▄▀ ▄▀▄ ▄█▄▀▀█\n█ ▄ ▀▀██ ▄█▄\n █▀▀▀▀ ▄█▀▄▀ ▄▀\n█ ▀██▀ ██ █▀▄▄\n▀▄█▀█▀▀▀▀████▄▄▀\n█▄█▄▄█▀▀▄▄█▄█▄█ "], ["happy", " ▄▀█▄▄▄▄▀▀▀█ \n▄▄▄█▀ ▄ ▄▀▄▄▄\n█ ▀ ▀ ▄▄█▀ ▄▀\n ▀███▄ ██▄▀▀█\n█▀████ ▄█ █▄▀ \n▀▄▀▄▄▄▄██ ▄▀▄▄▀█\n ▄█▀▄▄▄ ▀▀██▄▄▄▀\n█▄█▄▄█ █▄█▄█▄█ "], ["injured_1", " \n ▄▀█▄▄▄▄▀▀▀█ \n █▀▄ ▄▀ \n█▀▀ ▀▀▀ ▄▄█▄▀▀█\n▀▄▄▄█▄ ▄██ ▄█▄\n ▀▄▄▄▄ ▄███▄▀ ▄▀\n ▄▄▀█▄▄██▀ ███▄ \n█▄▄▄█▄▄█▄▄███▄▄█"], ["injured_2", " \n ▄▄ ▄▄▄▄ \n █▄▀▀▀▀▀ ▄▀ \n▄▄▄▀ █▄▄ █ ▄▄▄\n█ ▄ ▀██▀ ▄▀\n █▀▀▀▀ ▄██▀▄▀▀█\n ▄█▀██▄███▀█▄▄█ \n█▄▄▄█▄▄█▄▄▄██▄▄█"], ["sleep_1", " \n ▄▄ ▄▄ \n █ █▄▄▄▀▀ █▄▄▄ \n █▀ ▄█▄ ▄▀ \n▄▀ ▄▄ ▄▄██ ▀▀█ \n█ ▄ ▄█▀▀█▄█ \n▄▀▀█▄▄▄█▀█▀█▀▄▀█\n█▄▄▄█▄▄█▄▄▄▄▄█▀ "], ["sleep_2", " \n ▄▀█ ▄▄▀█ \n █▄▀▀▀▀ ▄▀▄▄▄\n ▄▀ ██▀ ▄▀\n ▄▀ ▀▀ ▀██▀▄▀▀█\n ▀▄ ▄ ▄█▀▀█▄▄▀ \n▄▀▀██▄▄█▀█▀█▀▄▀█\n█▄▄▄█▄▄█▄▄▄▄▄█▀ "], ["walk_1", " ▄▀█▄▄▄▄▀▀▀█ \n █▀ ▄▄▄ ▄▀▄▄▄\n█▀▀ ▀ ▀ ▄▄█▀ ▄▀\n▀▄▄▄█▄ ▄█▀▄▀▀█\n ▀▄▄▄▄ ▄█▀▀█▄▄▀ \n █ ██▄▄███ █▄▀█\n ▄█▀▄▄▄ ▀██▄▄▄▀\n█▄█▄▄█ █▄█▄█▄█ "], ["walk_2", " ▄▄ ▄▄▄▄ \n █▄▀▀▀▀▀ ▄▀ \n▄▄▄▀ ▄▀█▀ █▄▀▀█\n█ ▄ ▀██ ▄█▄\n █▀▀▀▀ ▄█▀█▀ ▄▀\n ▄▀██▀ ██▀▀ ██▄▄\n ██▀█▀▀▀▀▄▄██▄▄▀\n█▄█▄▄█▀▀▀▄█▄█▄█ "]]], + ["whamon", [["angry", " \n \n \n \n \n \n \n "], ["attack", " ▄███▄███▄\n ▀▀███▀▀ \n ▄▄▄▄▄▄▄▀█▀▄█ \n▄█████▀ ██▄▀▄█ \n█▀▀▀▀▀▀▀█████▀▀█\n█ ███ ▄▀\n█ ▄▀▀▀▀▀▀███▀▀ \n ▀███████▀▀ "], ["eat_1", " ▄███▄███▄\n ▀▀███▀▀ \n ▄▄▄▄▄▄ ▄▀▄█ \n▄██████▀█▀▄▀▄█ \n█▀ ▀███▄█▄█ \n█ █████ \n█ ▄▀▀▀▀▀███▀▀█▄ \n ▀███████▀▀█▄▄██"], ["eat_2", " ▄▄ ▄▄ \n ▀███▄███▀\n ▀███▀ \n ▄▄▄▄▄▄ ▄▀▄▀▄ \n▄█████████▀▄▀█ \n████████▀██▄██▀█\n█▀▀▀▀▀█▄█▄██▄▄▀ \n ▀█████████▀ "], ["happy", " ▄███▄███▄\n ▀▀███▀▀ \n ▄▄▄▄▄▄ ▄▀▄█ \n▄██████▀██▄▀▄█ \n██████▄█▄███▄█ \n█ █████ \n█ ▄▀▀▀▀▀████▀▀█▄\n ▀███████▀▀▀▀▄▄█"], ["injured_1", " \n \n ▄███▄███▄\n ▄▄▄▄▄█▀█▀█▀█▀▀\n▄█████████▀▄▀█ \n███████████▄██▀█\n█▀▀▀▀▀██▄▀▀█▄▄▀ \n ▀█████████▀ "], ["injured_2", " \n \n ▄███▄███▄ \n ▀▀███▀▀ \n ▄███████▄▀▄█ \n███████████▄██ \n███████▀████▀█▄ \n▀▄▄▄▄▄██▄▄█▀▄▄██"], ["sleep_1", " \n \n ▄███▄███▄\n ▄▄▄▄▄▄▀▀███▀▀ \n▄█████████▄▀▄█ \n████████████▄█ \n█▀▀▀▀███▀▀██▀█▄ \n ▀██████████▄▄██"], ["sleep_2", " \n ▄▄▄ ▄▄▄ \n █████████\n ▄▄▄▄▄▄ ▄▀▄▀▄ \n▄█████████▀▄▀█ \n███████████▄██▀█\n█▀▀▀▀ ▀█▄▄██▄▄▀ \n ▀█████████▀ "], ["walk_1", " ▄███▄███▄ \n ▀▀███▀▀ \n ▄▄ █ █ \n ▄▄▄█▄██▀▄▀▄█ \n▄█████████▄█▄█▀█\n███████▀▄███▄▄▀ \n█▀▀▀▀ ▀█████▀ \n ▀███████▀▀ "], ["walk_2", " ▄▄ ▄▄ \n █████████ \n ▀█▀▄ \n ▄▄▄▄██▄▄▀▄▀▄ \n▄████████▄▀▄▀█▄▄\n███████▀▄███▀▀▄▀\n█▀▀▀▀ ▀██████▀ \n ▀█████████▀ "]]], + ["wingdramon", [["angry", " ▄▀▀█▄▄▄▄▄▄▄ \n █▄██▀ ██▄▄▄▀▄ \n █▀█▀█▀█▀ ▄▀▄█▄\n▄▀▀▄█▄█▄▀█▀▀████\n▀▄▄▀▄▄▄▄▀█▄▄████\n ▀▄█▀▀▀▀ ▄█ ██\n ▄▀▀▄ ▄ ▀█ \n █▄█▄▄█▀▀█▄█▄█▄█"], ["attack", " ▄▄ ▄▄▄▄▄▄▄ \n▄▀▄██▀▀██▄▄▄▀▄ \n█▄██▄▄██▀ ▄▀ ██ \n▀█▀ ▀ ▀ ▀▀▄▄████\n ▀██▀█▀▄▄ ▀████\n █ █▀▀█ ▄█ ██\n ▄▀▀█▄ ▀█▀ ▀█ \n█▄█▄▄█▀▀▀█▄█▄█▄█"], ["eat_1", " ▄▄ ▄▄▄▄▄▄▄ \n▄▀▄██▀▀██▄▄▄▀▄ \n█▄██▄▄██▀ ▄▀ ██ \n▀█▀ ▀ ▀ ▀▀▄▄████\n ▀██▀█▀▄▄ ▀████\n █ █▀▀█ ▄█ ██\n ▄▀▀█▄ ▀█▀ ▀█ \n█▄█▄▄█▀▀▀█▄█▄█▄█"], ["eat_2", " ▄▄ ▄▄▄▄▄▄▄ \n▄▀▄██▀▀██▄▄▄▀ █▄\n█▄██▄▄██▀ ▄▀▄███\n▀█▀ ▀ ▀██▀ █████\n ▄█▄ ▄█▀▀▄▀█ ██\n ▀▄ █▀ ▀▄ ▄█ ▀ \n ▄▀▀▄ ▄▀▀ ▀▄ \n █▄█▄▄█▀█▄█▄█▄█ "], ["happy", " █▀▄▄▄▄███▀▀▀█ \n █ ███▀▄▀██▀▀█ \n █████████▄▄█▄█ \n██ ▀ ▀ ▀ ██ ███\n▀▄▀▄▄▄▄▄▀█ ▄███\n ▀█▄▄█▄▄▄███ ▀█\n ▄▀▀█▄ ▄▀ ▀▄ \n█▄█▄▄█▀▀▀█▄█▄█▄█"], ["injured_1", " ▄▄ ▄▄▄▄ \n▄▀▄█▀███▄ ▀▄ \n█▄███▄▄█▀▀▄█ ▄ \n▀█▀ ▀ ▀ ▀▄▄▀▄██ \n ▀██▀█▀ ▄ ▀████\n ▄▀█▀▀▀▄▀ ▄█▀██\n ▄▀▀█▄ ▀▄▀ ▀█▀\n█▄█▄▄█▀▀▀█▄█▄█▄█"], ["injured_2", " \n █▀▄▄▄██▀▀▄ \n█ ██▄▀▀██▄ █ \n███▀█▀█▀▄ ▀█ █▄ \n ▀▄▄▄▄▄▄ ▀▀▄███▄\n ▄▀█▄█▄ █ ████\n ▄▀▀█▄ █ ▄▀ ▀██\n█▄█▄▄█▀▀▀█▄█▄█▄█"], ["refuse", " ▄▄ ▄▄▄▀▀█ ▄ \n▄▀▄███▀██▄▀█ ██▄\n█▄███▄▄█▀ ▄▀▄███\n▀█▀ ▀ ▀ ▀▀▄█████\n ▀██▀█▀ ▄▄▀█▀██\n █ █▀▀▀█ ██ ▀ \n ▄▀▀█▄ █▀ ▀█ \n█▄█▄▄█▀▀▀█▄█▄█▄█"], ["sleep_1", " ▄▄ ▄▄ \n █▄█▄▀ █ \n ████████ █▄ \n █▀███▀▄█▀█▄██▄\n ▀▄████▀▄ ▀█▀██\n ▄▄█▀▄▄▄▀ █▄▄█▄█\n █▄▀█ █ ▀ ▀ █\n █▄▄▄█▄▄▄▄█▄▄▄██"], ["sleep_2", " ▄▄ ▄▄ \n █▄█▄▀ █ \n ████████ █▄ \n █▀███▀▄█▀█▄██▄\n ▀▄████▀▄ ▀█▀██\n ▄▄█▀▄▄▄▀ █▄▄█▄█\n █▄▀█ █ ▀ ▀ █\n █▄▄▄█▄▄▄▄█▄▄▄██"], ["walk_1", " █▀▄▄▄███▀▀▀█ \n█ ██▀ ▄██▀▀█ █▄ \n███▀█▀█▀▄▄▀ ▄██▄\n ▀▄▄▄▄▄▄ ▀█████\n █▄█▄▄▀ ▀█▀██\n ▄▀█ ▄▀ ▄█ █▀\n █▀▀▄ ▀▄▄▀ ▀▄ \n █▄█▄▄█▀▀█▄█▄█▄█"], ["walk_2", " ▄▄ ▄▄▄▄▄▄▄ \n▄▀▄██▀▀██▄▄▄▀▄ \n█▄██▄▄██▀ ▄▀ ██ \n▀█▀ ▀ ▀ ▀▀▄▄████\n ▀██▀█▀▄▄ ▀████\n █ █▀▀█ ▄█ ██\n ▄▀▀█▄ ▀█▀ ▀█ \n█▄█▄▄█▀▀▀█▄█▄█▄█"]]], + ["witchmon", [["angry", " ▄█▀▀██▀▀▀ \n▀▀█▀▀▀▀▀▀█▀█▀▀ \n █ ▀▄ ▄▀ █ █ \n ▀▄ ██ ▄▀▄▀ \n ██▀██▀███▄▄ \n ▄▀▄█████ █ ▄▄▄▀\n▀▀▀█ █ ▄█▀▀▀▄▄█▀\n ▀▀▀▀ ▀"], ["attack", " ▄▄▄▄▄▄▄▄ \n▄▄▄██▄▄██▄▄▄▄▄ \n ▄▀▄ ▄▀▄▀▄ \n █ ▀ ▀ █ █ \n ▀▄██▄███▄ \n ▄▀█▄██▄▀█▀▀▀ ▄\n▄█▄█▀█▀▀█▄█▄▀▀█▄\n █▄█▄▀▀ ▀▀▀▄"], ["eat_1", " ▄▄▄▄▄▄▄▄ \n▄▄▄██▄▄██▄▄▄▄▄ \n ▄█ ▄▀▄▀▄ \n █ ▀ ▀ ▀█ █ \n ▀▄██▄███▄ \n ▄▀█▄██▄▀█▀▀▀ ▄\n▄█▄█▀█▀▀█▄█▄▀▀█▄\n █▄█▄▀▀ ▀▀▀▄"], ["eat_2", " ▄█▀▀██▀▀▀ \n▀▀▀█▀▀▀▀█▀█▀▀▀ \n █ ▀ ▀ █ █ \n ▀▄ ██ ▄█▄▀ \n ▄█▀██▀███▄▄ \n ▄▀▄█████ █ ▄▄▄▀\n▀▀▀█ █ ▄█▀▀▀▄▄█▀\n ▀▀▀▀ ▀"], ["happy", " ▄█▀▀██▀▀▀ \n▀▀█▀▀▀▀▀▀█▀█▀▀ \n █▄▀▄ ▄▀▄ █ █ \n ▀▄ ▄ ▄ ▄▀▄▀ \n █▄▀▀▄▀███▄▄ \n ▄▀▄█████ █ ▄▄▄▀\n▀▀▀█ █ ▄█▀▀▀▄▄█▀\n ▀▀▀▀ ▀"], ["injured_1", " \n ▄█▀▀██▀▀▀ \n▀▀▀█▀▀▀▀█▀█▀▀▀ \n █ ▄ ▄ █ █ \n ▀█▀ ▀██▄▀ \n ▄█▀██▀███ \n ▄▀▄▀██▀█▄█ ▀▄ \n ▀▀█▄▄█▄▄▄█▀▀▀ "], ["injured_2", " \n ▄▄▄▄▄▄▄▄ \n▄▄▄██▄▄██▄▄▄▄▄ \n ▄▀ ▀▄▀▄ \n █▄█ █▄█ █ \n ▀▄▄▄▄███▄ \n ▄█▀▄█▀▄██▀▄ \n █▄█▄▄█▄▄▄█▄▄█ "], ["refuse", " ▄▄▄▄▄▄▄▄ \n▄▄▄██▄▄██▄▄▄▄▄ \n ▄█ ▄▀▄▀▄ \n █▀▀ ▀▀ █ █ \n ▀▄██▄███▄ \n ▄▀█▄██▄▀█▀▀▀ ▄\n▄█▄█▀█▀▀█▄█▄▀▀█▄\n █▄█▄▀▀ ▀▀▀▄"], ["sleep_1", " ▄█▀▀██▀▀▀ \n▀▀▀█▀▀▀▀█▀█▀▀▀ \n █▄▄ ▄▄█ █ \n ▀▄ ▄▄ ▄█▄▀ \n ▄█▀██▀███▄▄ \n ▄▀▄█████ █ ▄▄▄▀\n▀▀▀█ █ ▄█▀▀▀▄▄█▀\n ▀▀▀▀ ▀"], ["sleep_2", " ▄▄▄▄▄▄▄▄ \n▄▄▄██▄▄██▄▄▄▄▄ \n ▄▀ ▀▄▀▄ \n █▀▀ ▀▀█ █ \n ▀▄██▄███▄ \n ▄▀█▄██▄▀█▀▀▀ ▄\n▄█▄█▀█▀▀█▄█▄▀▀█▄\n █▄█▄▀▀ ▀▀▀▄"], ["walk_1", " ▄█▀▀██▀▀▀ \n▀▀▀█▀▀▀▀█▀█▀▀▀ \n █ █ █ █ █ \n ▀▄ ▄▄ ▄█▄▀ \n ▄█▀██▀███▄▄ \n ▄▀▄█████ █ ▄▄▄▀\n▀▀▀█ █ ▄█▀▀▀▄▄█▀\n ▀▀▀▀ ▀"], ["walk_2", " ▄▄▄▄▄▄▄▄ \n▄▄▄██▄▄██▄▄▄▄▄ \n ▄▀▄ ▄▀▄▀▄ \n █ ▀ ▀ █ █ \n ▀▄██▄███▄ \n ▄▀█▄██▄▀█▀▀▀ ▄\n▄█▄█▀█▀▀█▄█▄▀▀█▄\n █▄█▄▀▀ ▀▀▀▄"]]], + ["wizardmon", [["angry", " ▄▄▄▄▄ \n ▄██████▀█ \n ████████▄ \n▄███▄▀███▀▄██▄▄ \n█ ▀█▀▀▀▀▀▀▀██▀ █\n ▀▀██▄▄▄▄▄████▀ \n ▄▀▀███▄████▀▀█ \n█▄▄▄▄█▀▀▀▀█▄▄▄▄█"], ["attack", " ▄▄███████▄ \n ███▀ ▄██▀ ▀ \n ▀▀▀▀▀▀████▄▄ \n ████ \n █▀▀▀▀▀▀ ████▀ \n█ ██▀██████▀ ▀▄ \n▀████████▀█▄▄▄▀ \n█▄▄███▀▀▄▄▄▄▄█ "], ["eat_1", " ▄▄███████▄ \n ██▀▄▀███▀ ▀ \n ▀▀▀▀▀▀████▄▄ \n ▄▄ █ ██▄▄▄\n █ █▀▀▀▀▀▄███▄ █\n ▀▀███▀██████▀▀ \n ▄▀██████▀▀▀▄ \n █▄▄▄██▀▀▄▄▄▄▄█ "], ["eat_2", " ▄▄▄▄▄ \n ▄██████▀█ \n █▀████▀█▄ \n ▀█▄█▄██▄█▄██▀ \n▄██▄▀▀▀▀▀▀▀▄███ \n█ ▄██▄▄▄▄▄███▄ █\n █▀▀███▄████▀▀█ \n█▄▄▄▄█▀▀▀▀█▄▄▄▄█"], ["happy", " ▄▄██████▄ \n ▄▀▄▀█▀▄▀█ ▀ \n ▀█▀▀▀▀▀▀▀▀██▀ \n▄▄█ ██████ █▀▄▄▄\n█ ▀█▄▀▀▀▀▄███▀ █\n ▀▀████▀█████▀▀ \n ▄▀███████▀▀▄ \n █▄▄▄▄█▀▀█▄▄▄▄█ "], ["injured_1", " \n ▄▄█████▄ \n ▄███████ ▀ \n ▄▄██▀██▀███▄▄ \n ██▄▄██▄▄███ \n ▀▀█▄ ▄███▀ \n ████████████▄ \n █▄▄█▀████▄▄█▄▄█"], ["injured_2", " \n ▄▄▄▄▄ \n ▄██████▀▀▄ \n ████████▄ \n▀██▀ ██ ▀███▀ \n▄██▀▀▀▀▀▀████▀ \n ▄██▄▄▄▄██████▄ \n█▄▄█▀██████▄▄█▄█"], ["sleep_1", " \n ▄▄▄▄▄ \n ▄██████▀▀▄ \n ████████▄ \n▀██▀▀██▀▀███▀ \n▄██▀▀▀▀▀▀█████▄ \n█ ██▄▄▄▄████▀ █ \n█▄▄███▄█████▄▄█ "], ["sleep_2", " \n ▄▄█████▄ \n ▄███████ ▀ \n ▄▄█████████▄▄ \n ██▄▄██▄▄███▄▄ \n▄███▄ ▄███▄ \n█ ▀████▀████▀ █ \n█▄▄█████████▄▄█ "], ["walk_1", " ▄▄█████▄ \n ▄███████ ▀ \n ▄▄█ ▀██▀ ██▄▄ \n ▀█████████▀ \n ▀██▄ ▄███▀ \n ▄▀▀███▀████▀▀▄ \n ▀█▀███████▀▀█▀ \n █▄▄▄▄█▀▀█▄▄▄▄█ "], ["walk_2", " ▄▄▄▄▄ \n ▄██████▀█ \n █▀████▀█▄ \n ▀██▄▄██▄▄███▀ \n▄███▀▀▀▀▀▀▀████ \n█ ▄██▄▄▄▄▄███▄ █\n █▀▀███▄████▀▀█ \n█▄▄▄▄█▀▀▀▀█▄▄▄▄█"]]], + ["wizardmon_x", [["angry", " ▄▄▄▄▄ \n ▄████▄ ▀ \n ▄█ ███▄ \n▀▀██▀▀█▀█▀▀██▀▀ \n ▀▄ █▄ ▀▀▄█ ▄▀ \n ▀▄▄▄▄▄▄▄▀ \n ▄████▀████▄ \n ██▄█▄▄▄▄▄█▄██ "], ["attack", " ▄███▀▀▄ \n █▀▀███ \n▄▄▄▄██▄▄████▄▄▄ \n ▄▀▀▄ ▀▄█ ▄▀▀▄ \n▄▄▀▄▀▀ ▀▀▄▀▄▄ \n▀█▄▄███████▄▄█▀ \n ▀▀█▀▀ ▀▀█▀▀ \n ▄██▀▀▀██▄ "], ["eat_1", " ▄███▀▀▄ \n █▀▀███ \n▄▄▄▄██▄▄████▄▄▄ \n ▄▀▀▄ ▀▄█ ▄▀▀▄ \n ▀▄▀ ▄▄▄ ▀▄▀ \n ▄█▄▀▀▀▄█▄ \n ▄█▀█▀▀▀▀▀█▀█▄ \n ▀▀ ▄██▀██▄ ▀▀ "], ["eat_2", " ▄▄▄▄▄ \n ▄████▄ ▀ \n ▄█ ███▄ \n▀▀██▀▀█▀█▀▀██▀▀ \n ▀▄ █ ▀▀ █ ▄▀ \n █▄▄▄▄▄▄▄█ \n ▄████▀████▄ \n ██▄█▄▄▄▄▄█▄██ "], ["happy", " ▄███▀▀▄ \n █▀▀███ \n▄▄▄▄██▄▄████▄▄▄ \n ▄▀▀▄ ▀▄█ ▄▀▀▄ \n▄▄▀▄▀ ▄ ▄ ▀▄▀▄▄ \n▀▀█▄█▄ ▀ ▄█▄█▀▀ \n ▀█▀▀▀▀▀█▀ \n ▄██▀██▄ "], ["injured_1", " ▄▄▄▄▄ \n ▄████▄ ▀ \n ▄█ ███▄ \n▀▀██▀▀█▀█▀▀██▀▀ \n ▀▄ ▄█ ▀ █▄ ▄▀ \n ▀▄▄▄▄▄▄▄▀ \n▄▀▀████▀████▀▀▄ \n█▄▄▄█▄▄▄▄▄█▄▄▄█ "], ["injured_2", " \n ▄███▀▀▄ \n █▀▀███ \n▄▄▄▄██▄▄████▄▄▄ \n ▄▀▀ ▄▀▄▀▄ ▀▀▄ \n ▀▄▀▀ ▀▀▄▀ \n▄▀▀████▀████▀▀▄ \n█▄▄▄█▄▄▄▄▄█▄▄▄█ "], ["sleep_1", " ▄▄▄▄ \n █▀▀██▀▀▄ \n▄▄▄▄██▄▄███▄▄▄▄ \n ▄▀▀ ▀▄█ ▀▀▄ \n █▄██▄▄▄██▄█ \n █ ▄▄▄▄▄▄▄▄▄ █ \n █ █▄█▄█▄█▄█ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ "], ["sleep_2", " ▄▄████▄ \n ▄█ ██▄ ▀ \n▀▀██▀▀█▀█▀▀██▀▀ \n ▀▄ ▄▄ ▀▀▄▄ ▄▀ \n ▄█▄▄▄▄▄▄▄█▄ \n █ ▄▄▄▄▄▄▄▄▄ █ \n █ █▄█▄█▄█▄█ █ \n ▀▄▄▄▄▄▄▄▄▄▄▄▀ "], ["walk_1", " ▄███▀▀▄ \n █▀▀███ \n▄▄▄▄██▄▄████▄▄▄ \n ▄▀▀▄ ▀▄█ ▄▀▀▄ \n ▀▄ ▀ ▀ ▄▀ \n ▄███████▄ \n ▄█▀█▀▀ ▀▀█▀█▄ \n ▀▀ ▄██▀██▄ ▀▀ "], ["walk_2", " ▄▄▄▄▄ \n ▄████▄ ▀ \n ▄█ ███▄ \n▀▀██▀▀█▀█▀▀██▀▀ \n ▀▄ ▀▄ ▀▀▄▀ ▄▀ \n ▀▄▄▄▄▄▄▄▀ \n ▄████▀████▄ \n ██▄█▄▄▄▄▄█▄██ "]]], + ["woodmon", [["angry", " ▄ ▄ ▄█▄ ▄ \n █▀ █ █▀█▄█ \n █ █ █ \n █ ▄█ █▀ █ \n █ ▄ ▄ ▄█ \n ▄█▀█▀█ ▀█ \n ▄▀▀▄ ▀▀▀▀▄ \n █▄█▄██▀█▄▄█▄▄▄█"], ["attack", " █▄▀▄▀▀█▄█ \n █ ▄▀ █ ▄█ \n █ ▄ █▀ █ █ █ \n ▀▀██▄▄ ▄█▀▀ █ \n ███▄ ▄▄▀ \n ▄▀█▀█ ▀ ▀█ \n ▄▀▄▄ ▀▀▀▀▄ \n █▄█▄██▀▀▄█▄▄▄█ "], ["eat_1", "█▄ █▄▀▄█▀█▄█ ▄█\n█ ██ ▀ ▀ █ █ █\n█ ▀ ▄▄ ▄▄ █▀▀ █\n▀▄▄ ▀ ▄▄▀\n ▀▄███▄█▄ █ \n ▄▀██████▀ █ \n▄▀▀ ▀▀▀▄ \n█▄█▄██▀▀▀▀▄▄█▄▄█"], ["eat_2", " ▄ ▄ ▄█▄ ▄ \n█▄ █▀ █▀ █▀█ ▄█\n█ ██ █ █ █\n█ ▀ ▄▄ ▄▄ █▀▀ █\n▀▄▄█ ▄ ▄▄▀\n █▀▄▀▀▄▀▀ █ \n ▄▀▀ ▀▀▀▄ \n █▄█▄██▀▀█▄▄█▄▄█"], ["happy", "█▀▄█▄▀▄█▀█▄█ ▄▀█\n█ █ ▀ ▀ █▄█ █\n█▄▀▄▀▄ ▄▀▄▀ █\n ▀▄▄ ▄▄▄▄ ▄ ▄▀▀ \n ▀███████ █ \n ▄▀██▄▄▄▄▀▄█▄ \n▄▀▀▄ ▄▀ ▄ ▀▄\n█▄█▄███▀▀▀▀▀▀▀▀▀"], ["injured_1", " ▄ \n▄ █▄▀▄█▀█▄█ ▄\n█▀▄█ ▀ ▀ █ ▄▀█\n█ █▀ ▄ █▄█ █\n█ ▄▀▀ ▀▀ ▀ █\n ▀▀██▄██▄█▄ ▄▀▀ \n ▄▀▀ ▀▀▄ \n █▄█▄▄▄▄▄█▄▄█▄▄█"], ["injured_2", " \n ▄▄█▄██▄█ \n█▄ █ ▀█▀▀█ █ ▄█\n█ █ ▄ ▄ █▄█ █\n█ ▄▀▀ ▀▀ ▀ █\n ▀▀█▄█▄█▄█▄ ▄▀▀ \n ▄▀ ▀ ▀ ▀ ▀ ▀▀▄ \n █▄█▄▄▄▄▄█▄▄█▄▄█"], ["sleep_1", " ▄ \n▄ █▄▀▄█▀█▄█ ▄\n█▀▄█ ▀ ▀ █ ▄▀█\n█ █▀ █▄█ █\n█ ▄▀▀ ▀▀ ▀ █\n ▀▀█▄ ▄▄ ▄ ▄▀▀ \n ▄▀ ▀ ▀ ▀▀▀▄ \n █▄█▄█▄▄▄█▄▄█▄▄█"], ["sleep_2", " ▄ ▄ ▄▄▄ ▄ \n █▄ █▀ █▀ █▀█ ▄█\n █ ██ ██ █\n █ ▀ ▀▀ ▀▀ █▀ █\n ▀▄▄█▄ ▄▄ ▄ ▄▄▀\n ▄██████ █ \n ▄▀▀ ▀▀▀▄ \n █▄█▄█▄▄▄█▄▄█▄▄█"], ["walk_1", " ▄ ▄ ▄█▄ ▄ \n█▄ █▀ █▀ █▀█ ▄█\n█ ██ █ █ █\n█ ▀ █▄ ▄█ █▀▀ █\n▀▄▄█ ▄▄▀\n █▀▄██▄█▀ █ \n ▄▀▀ ▀▀▀▄ \n █▄█▄██▀▀▀▄▄█▄▄█"], ["walk_2", " ▄ \n▄ █▄▀▄█▀█▄█ ▄\n█▀▄█ ▀ ▀ █ ▄▀█\n█ █▀▄ ▄ █▄█ █\n█ ▄▀▀ ▀▀ ▀ █\n ▀▀█▄ ▄▄ ▄▄ ▄▀▀ \n ▄▀ ▀▀▀▀▀ ▀▀▄ \n █▄█▄█▄▄▄█▄▄█▄▄█"]]], + ["wormmon", [["angry", " \n ▄▀▀▀▄ ▄▀▀▀▄ ▄▀█\n ▀▄▀▀▀▀▀ ▀▄ ▀ ▄▀\n █▄ ▄ █▀▀ \n █▀▀▄▄▄▀▀ █ ▄▄\n ▀▄█ █ █ ▄▀▄▀▄█\n ▄█▄▀▀▀▀█▀ ██▄ █\n █▄█▄▄▄▄▄██▄▄█▀ "], ["attack", " ▄▀▀▀▄ ▄▀▀▀▄ ▄▀█\n ▀▄▀▀▀▀▀ ▀▄ ▀ ▄▀\n █ █▄ ▄█ █▀▀ \n █ ▄▄▄▄▄▄ █ \n▄██ ████ █▄█▄▄▀█\n▀▄▀▀█▀▀▀▀█▀ █ ▀█\n ▀█ ▄▄▀██▄▀\n █▄█▄▄▄█▄█▄▄▀ "], ["eat_1", " ▄▀▀▀▄ ▄▀▀▀▄ ▄▀█\n ▀▄▀▀▀▀▀ ▀▄ ▀ ▄▀\n █▄▄ ▄▄ █▀▀ \n █ ▄▄▄▄▄ █ \n ▀█ ███ █ ▄▀ ▄▀█\n ▄▀█▀▀▀▀█▀██ ▀█\n ▀▄█ ▀▄▄▀██▄▀\n █▄█▄▄▄█▄█▄▄▀ "], ["eat_2", " ▄▄▄ ▄▄▄ ▄▄\n █ ▄▄█▄█ ▄ ▀▄▀ █\n ▄▀▄ ▄ ▀▄▄▄▀ \n █▀ ▀ ▀ ▀ █ \n █ ▄▀█▀▄ █ ▄▄\n ▀█▄█▄█▄▄█▄▄▀▄█\n ▄█▄▀ ▄▀ ██▄ █\n █▄█▄▄▄▄▄██▄▄█▀ "], ["happy", " ▄▀▀▀▄ ▄▀▀▀▄ ▄▀█\n ▀▄▀▀▀▀▀ ▀▄ ▀ ▄▀\n █▄▀▄ ▄▀▄ █▀▀ \n █ ▄▄▄▄▄ █ \n ▀█ ███ █ ▄▀ ▄▀█\n ▄▀█▀▀▀▀█▀██ ▀█\n ▀▄█ ▀▄▄▀██▄▀\n █▄█▄▄▄█▄█▄▄▀ "], ["injured_1", " \n ▄▀▀▀▄ ▄▀▀▀▄ ▄▀█\n ▀▄▀▀▀▀▀ ▀▄ ▀ ▄▀\n █ █▀▀ \n █▀▀▄▄▄▀▀ █ \n ▀▄█ █ █ ▄▀ ▄▀█\n ▄█▄▀▀▀▀█▀ ██▄ █\n █▄█▄▄▄▄▄██▄▄█▀ "], ["injured_2", " \n ▄▄▄ ▄▄▄ ▄▄\n █ ▄▄█▄█ ▄ ▀▄▀ █\n ▄▀ ▀▄▄▄▀ \n █▄▄ ▄▄ █ \n █ ▄▀█▀▄ █ ▄▀█\n ██▄█▄█▄▄▀ █▄ █\n █▄█▄▄▄▄▄█▄█▄▀ "], ["sleep_1", " \n ▄▀▀▀▄ ▄▀▀▀▄ ▄▀█\n ▀▄▀▀▀▀▀ ▀▄ ▀ ▄▀\n █ █▀▀ \n █▀▀▄▄▄▀▀ █ ▄▄\n ▀▄█ █ █ ▄▀▄▀▄█\n ▄█▄▀▀▀▀█▀ ██▄ █\n █▄█▄▄▄▄▄██▄▄█▀ "], ["sleep_2", " ▄▄▄ ▄▄▄ ▄▄\n █ ▄▄█▄█ ▄ ▀▄▀ █\n ▄▀ ▀▄▄▄▀ \n █▄▄ ▄▄ █ \n █ ▄▀█▀▄ █ ▄▄\n ▀█▄█▄█▄▄█▄▄▀▄█\n ▄█▄▀ ▄▀ ██▄ █\n █▄█▄▄▄▄▄██▄▄█▀ "], ["walk_1", " ▄▀▀▀▄ ▄▀▀▀▄ ▄▀█\n ▀▄▀▀▀▀▀ ▀▄ ▀ ▄▀\n █▄▀ ▀▄ █▀▀ \n █▀▀▄▄▄▀▀ █ \n ▀▄█ █ █ ▄▀ ▄▀█\n ▄▀█▀▀▀▀█▀██ ▀█\n ▀▄█ ▀▄▄▀██▄▀\n █▄█▄▄▄█▄█▄▄▀ "], ["walk_2", " ▄▄▄ ▄▄▄ ▄▄\n █ ▄▄█▄█ ▄ ▀▄▀ █\n ▄▀▄ ▄ ▀▄▄▄▀ \n ██▄ ▄█ █ \n █ ▄▀█▀▄ █ ▄▄\n ▀█▄█▄█▄▄█▄▄▀▄█\n ▄█▄▀ ▄▀ ██▄ █\n █▄█▄▄▄▄▄██▄▄█▀ "]]], + ["yaamon", [["angry", " \n \n \n ▀██▄▄ ▄▄██▀ \n ██████████ \n ▄▀███▀▄ ▀█ \n █▀ ▀ ▀▀ █ \n ▀▄▄▄▄▄▄▀ "], ["attack", " \n ▄▄█▀▄██▀ \n ▄█████████▀ \n █ ▄▀███▀ \n ▀▀█▄▀▀ ██ \n ██ █ \n ▄▄██ █ \n ▀▄▄▄▄▄▄▀ "], ["eat_1", " \n \n ▄██▄ ▄██▄ \n ▀▀██████████▀▀ \n ▄▀███▀▄ ▀█ \n █▀ ▀ ▀ ▀ █ \n █ █████ █ \n ▀██▄▄█▄▀ "], ["eat_2", " \n \n \n ▄██▄ ▄██▄ \n ▀▀██████████▀▀ \n ▄▀███▀▄ ▀█ \n ▄▀▀ ▀ ▀ ▀ ▀▄ \n ▀▄▄▄██▄▄▄▄▄▀ "], ["happy", " ▄▄▄▄ ▄▄▄▄ \n ▀███▄▄▄▄███▀ \n ▀█████▀▀██ \n █▄▀█▀▄▀▄ █ \n █ ▄▄▄▄▄ █ \n █ █████ █ \n ▀▄███▄▄▀ \n ▄▄▄▄▄▄ "], ["injured_1", " \n \n \n ▄▄▄ ▄▄ \n ▄████████████▄ \n ▀ ▄▀███▀▄ ▀█ ▀ \n ▄▀▀ ▀ ▀▀ ▀▄ \n ▀▄▄▄█▄▄▄▄▄▄▀ "], ["injured_2", " \n \n \n \n ▄███▄▄▄▄███▄ \n █▀▀█████▀▀██▀█ \n ▄█▄▀█▀ █▄ ▀▄ \n ▀▄▄▄▄▄▄▄▄▄▄▀ "], ["sleep_1", " \n \n \n ▄▄ ▄▄ \n ▄████▄▄▄▄████▄ \n ▀█████▀▀██ \n ▄█▄▀█▀▄▄▄ ▀▄ \n ▀▄▄▄▄▄▄▄▄▄▄▀ "], ["sleep_2", " \n \n \n ▄██▄ ▄██▄ \n ▀▀██████████▀▀ \n ▄▀███▀ ▀█ \n ▄▀▀ ▀ ▀▀▀ ▀▄ \n ▀▄▄▄██▄▄▄▄▄▀ "], ["walk_1", " \n \n \n ▄██▄ ▄██▄ \n ▀▀██████████▀▀ \n ▄▀███▀▄▄▀█ \n █▀ ▀ ▀▀ █ \n ▀▄██▄▄▄▀ "], ["walk_2", " \n \n \n ▄▄ ▄▄ \n ▄████▄▄▄▄████▄ \n ▀█████▀▀██ \n █▄▀█▀▄█▀ █ \n ▀▄▄▄▄▄▄▄▄▀ "]]], + ["yokomon", [["angry", " ▄▄ ▄▄▄ \n █ ▀█ █ \n ▀▄▄▀▄▄█ \n ▄▀ █ █ \n ▀▄▄▀█▄▄▀ \n ▄▀ ▄▄▀▄ \n █▄▄ █ \n ▀▄▄▄▄▄▄▄▀ "], ["attack", " \n ▄▄ ▄▄ \n █ ▀▄ █ \n ▄▄▄▀▀▀▀▄▄▄▀▄▀ \n █▄▄ ▄█ █▀ █ █ \n ▀ ▀▄ ▀▄▄▀▄▄▀ \n █▄█▄█ █ \n ▀▄▄▄▄▄▄▄▀ "], ["eat_1", " \n ▄▄ ▄▄ \n █ ▀▄ █ \n ▄▄▄▄▀▀▀▄▄▄▀▄▀ \n █▄▄ ▄ █▀ █ █ \n ▀▄▀ ▀▄▄▀▄▄▀ \n ▄▄▄▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["eat_2", " ▄▄ ▄▄▄ \n █ ▀█ █ \n ▀▄▄▀▄▄█ \n ▄▀ █ █ \n ▀▄▄▀█▄▄▀ \n ▄▀ ▄ █ \n █▄▄ ▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["happy", " ▄▀▀▀▄█▀▀▄ \n ▀█▄▄▀▄▄▄▀ \n █ █ ▀█ \n ▀▄▄█▀▄▄▄▀ \n ▄▀▄ ▄▀▄ \n ▄▀▄ ▀ ▀ ▄▀▄ \n █ ▀█████▀ █ \n ▀▄▄▄▄▄▄▄▀ "], ["injured_1", " \n \n ▄▀▀▀▄█▀▀▄ \n ▀█▄▄▀▄▄▄▀ \n █ ▄█ ▀█ \n █▀▀ ▀▀█ \n █ ▄▀ ▀▄ █ \n ▀▄▄▄█▄▄▄▀ "], ["injured_2", " \n \n ▄▄▄ ▄▄▄ \n █ ▄▄▀▄▄ █ \n ▄▀ █ ▀▄ \n ▀▄▀▀ ▀▀▄▀ \n █ ▄█ █▄ █ \n ▀▄▄▄▄▄▄▄▄▄▀ "], ["sleep_1", " \n \n ▄▀▀▀▄█▀▀▄ \n ▀█▄▄▀▄▄▄▀ \n █ ▄█ ▀█ \n █▀▀ ▀▀█ \n █ ▄▄ ▄▄ █ \n ▀▄▄▄▄▄▄▄▀ "], ["sleep_2", " ▄▄▄ ▄▄ \n █ █▀ █ \n █▄▄▀▄▄▄▀ \n █ █ ▀▄ \n ▀▄▄█▀▄▄▄▀ \n ▄▀▄▄ ▄▄▀▄ \n █ ▄ █ \n ▀▄▄▄▄▄▄▄▀ "], ["walk_1", " ▄▄▄ ▄▄ \n █ █▀ █ \n █▄▄▀▄▄▄▀ \n █ █ ▀▄ \n ▀▄▄█▀▄▄▄▀ \n ▄▀▄ ▄▀▄ \n █ ▀ ▀ █ \n ▀▄▄▄█▄▄▄▀ "], ["walk_2", " ▄▄▄ ▄▄ \n █ █▀ █ \n █▄▄▀▄▄▄▀ \n ▄ █ █ ▀▄ \n▀▄▀ ▀▄▄█▀▄▄▄▀ \n ▀ ▄▀ ▄▀▄ \n █ ▀▀ ▀ █ \n ▀▄▄▄█▄▄▄▀ "]]], + ["yukimibotamon", [["angry", " ▄▄ ▄▄ \n █ █▀▀▀▀█ █ \n █▀▀ ▀▀█ \n ██▄██▄██ \n ██▀██▀██ \n ▀▄▄▄▄▄▄▀ \n \n ▄▄▄▄ "], ["attack", " \n \n \n \n \n █▀▄▄▀█ \n █ ▄ ▄ █ \n ▀▄▄▄▄▄▄▀ "], ["eat_1", " \n \n \n \n \n █▀▄▄▀█ \n █ ▄ ▄ █ \n ▀▄▄▄▄▄▄▀ "], ["eat_2", " \n \n ▄▀▀▀▀▄ \n █▄▄▄▀ ▄▀ \n ████ █ \n ▄████ █ \n ▀▄▄▄▄▄▀ \n ▄▄▄▄▄ "], ["happy", " \n █▀▄▄▀█ \n █ ▄ ▄ █ \n █▀ ▀▀ ▀█ \n █ ██ █ \n ▀▄ ██ ▄▀ \n ▀▀▀▀ \n ▄▄▄▄ "], ["injured_1", " \n \n \n \n ▄▄ ▄▄ \n ▄▀ ▀▀ ▀▄ \n █ ▄▀ ▀▄ █ \n ▀▄▄▄██▄▄▄▀ "], ["injured_2", " \n \n \n \n \n █▀▄▀▀▀▀▄▀█ \n ▄▀ ▄ ▄ ▀▄ \n █▄██▄▄██▄█ "], ["refuse", " \n \n \n \n \n ▄▀█▄▄▀█ \n ▄█ ▄ ▀▄ \n ▀▄█▄▄█▄▄▄▀ "], ["sleep_1", " \n \n \n \n \n █▀▄▄▀█ \n █▄▄ ▄▄█ \n ▀▄▄▄▄▄▄▀ "], ["sleep_2", " \n \n \n \n \n █▀▄▄▀█ \n █▄▄ ▄▄█ \n ▀▄▄▄▄▄▄▀ "], ["walk_1", " \n \n \n \n ▄▄ ▄▄ \n ▄▀ ▀▀ ▀▄ \n █ ▀ ▀ █ \n ▀▄▄██▄▄▀ "], ["walk_2", " \n \n \n \n \n █▀▄▄▀█ \n █ ▄ ▄ █ \n ▀▄▄▄▄▄▄▀ "]]], + ["yuramon", [["angry", " \n \n \n \n \n ▄█▀▀██▄▄ \n ▀▀▀▀███▄ \n ▀██████▄ "], ["attack", " \n ▄▄██▄▄█▀ \n ███▀ ████▄ \n ▀█▀▀█▀███▄ \n ██▄ \n ▄█▄▄█▄▄██▄ \n ▀▀▀▀▀▀▀ \n ▄▄▄▄▄▄▄ "], ["eat_1", " \n \n \n \n ▄████▄ \n ▀█▄██▀ \n ███▀ \n ▄█████▀▀ "], ["eat_2", " \n \n \n \n \n ▄█▀███▄▄ \n ▀▀▀▀███▄ \n ▀██████▄ "], ["happy", " \n ▄▄▄▄▄ \n ██ █ ██▄ \n █▀███▀█▄ \n █ █▀ \n ▀█▄▄▄█▀▀ \n \n ▄▄▄▄▄▄▄ "], ["injured_1", " \n \n \n \n \n ▄▄▄▄▄ \n ▄▀█ ▀██▀ \n ▄▄████▀▀ "], ["injured_2", " \n \n \n \n \n \n █████▄▄ \n ▀ █ ▀██▄ "], ["sleep_1", " \n \n \n \n \n ▄▄▄▄ \n ▄██████▀ \n █▄▄█▄▄█▀ "], ["sleep_2", " \n \n \n \n \n ▄████▄▄ \n █▀▀█▀▀█▄ \n ▀██████▄ "], ["walk_1", " \n \n \n \n \n ▄█████▄ \n █▄█▄██▄ \n ▀█████▄ "], ["walk_2", " \n \n \n \n \n ▄▄▄▄▄ \n ▄██▀███▀ \n █▄████▀▀ "]]], + ["zerimon", [["angry", " \n \n \n ▄▄ ▄ ▄ \n █ ▀▄ █ ▀ █\n ▄▀▀ ▀▀▄ █ █\n ██▄ ▄█ █▀ ▄▀\n ▀▄▄▄▄▄▄▄▄▄▀▀▀ "], ["attack", " \n \n █▀▄ ▄▀▄▀▄ \n ▄█ ▀▄▄▀▄ █\n ▄▀▄ ▄ ▀▄█ █\n █ ▀▀ ▀▀ █▄▄▀ \n █ █████▄ █ \n ▀▄██████▄▀ "], ["eat_1", " \n \n █▀▄ ▄ ▄ \n ▄█ ▀▄▄ █ ▀ █\n ▄▀▄ ▄ ▀▄█ █\n █▀ ▀ ▀ ▀ █▀ ▄▀\n █ █████ █▀▀ \n ▀▄█████▄▄▀ "], ["eat_2", " \n \n \n ▄▄ ▄ ▄ \n █ ▀▄ █ ▀ █\n ▄▀▀ ▀▀▄ █ █\n █▄▀▄ ▄▀▄ █▀ ▄▀\n ▀▄▄▄▄▄▄▄▄▄▀▀▀ "], ["happy", " \n \n █▀▄ ▄▀▄▀▄\n ▄█ ▀▄▄ ▀▄ █\n ▄▀▄ ▄ ▀▄█ █\n █▀ ▀ ▀ ▀ █▄▄▀ \n █ █████ █ \n ▀▄▄███▄▄▄▀ "], ["injured_1", " \n \n \n ▄▄ \n █ ▀▄ ▄▀▄▀▄\n ▄▀▀ ▀▀▄▀▄ █\n █▄▀ ▀▄ ██ █\n ▀▄▄███▄▄▄▄█▄▄▀ "], ["injured_2", " \n \n \n \n █▀▄ ▄ ▄ \n ▄█ ▀▄▄ █ ▀ █\n ▄▀ ▀▄█ █\n ███▄▄▄██▄▄█▄▄▄▀"], ["sleep_1", " \n \n \n █▀▄ ▄ ▄ \n ▄█ ▀▄▄ █ ▀ █\n ▄█▄ ▄▄ ▀▄█ █\n █ ▄▄▄ █ ▄▀ \n ▀▄▄▄▄▄▄▄▄██▀ "], ["sleep_2", " \n \n \n ▄▄ \n █ ▀▄ ▄▀▄▀▄\n ▄▀▀ ▀▀▄▀▄ █\n █▀▀ ▀▀ ██ █\n ▀▄▄██▄▄▄▄▄█▄▄▀ "], ["walk_1", " \n \n \n █▀▄ ▄▀▄▀▄\n ▄█ ▀▄▄ ▀▄ █\n ▄▀▄ ▄ ▀▄█ █\n █ ▀▄▄▄▀ █▄▄▀ \n ▀▄▄▄▄▄▄▄▀ "], ["walk_2", " \n \n \n ▄▄ ▄ ▄ \n █ ▀▄ █ ▀ █\n ▄▀▀ ▀▀▄ █ █\n █ █ █ █▀ ▄▀\n ▀▄▄███▄▄▄▄▀▀▀ "]]], + ["zhuqiaomon", [["angry", " ▄▄▀█▀ \n ▄▀▀▄ ▄▀▄▄▀▀▀█\n▄▀ ▀▀ ▄▀█ ▄▄█ \n█▄▄███▀█▄█ ▄▀ \n ▀█▀▀▄█ ▀▄█▄▄▄ \n ██▀▀██ ▄▄▄▄▄▀\n ▀ █▄▀ ▀▄ ▀▄▄ \n ▀███▀▄▄▄▄▀ "], ["attack", " ▄▄▀█▀ \n ▄▀▀▄▄ ▄▀ \n▄▀ ▀▀ ▄▄▀▄█▀▀▀█\n█▄▄▀████▄█▀ ▀█ \n ▄█▀▀▄█ ▀ ▄▀▀ \n █▀▄ █▀▄ ▀▀▀▀▀▄\n █▄ ▀▄ ▀▀█▀ \n ▀▀▀▀▀▀▀▀▀▀ "], ["eat_1", " ▄▄▄ \n ▄▄▀▀ ▀▄ \n ▄▀ ▄▀▄ ▀▄ ▄▄▄▄▄\n█ ▄▄▄▄█▀▄█▀ ▄▄▀\n▀▀▀ ██▀▀▀█ ▄▄▀ \n ▄█ ▄█ ▄█▄▄▄ \n █▀▄ █▀▄ ▄▄▄▄▀\n ▀█▄▄▄█▄▄▄█▄ "], ["eat_2", " ▄▄▀█▀ \n ▄▀▀▄▄ ▄▀ \n▄▀ ▀▀ ▄▀▄█▀▀▀█\n█▄▄███▀█▄█▀ ▀█ \n ▀█▄▄▀█ ▀ ▄▀▀ \n ██ ██ ▀▀▀▀▀▄\n ▀ █▄▀ ▀▄ ▀██▀ \n ▀███▀▄▄▄▄▀ "], ["happy", " ▄▄▀█▀ \n ▄▀▀▄ ▄▀▄▄▀▀▀█\n▄▀ ▀ ▀ ▄▀█ ▄▄█ \n█▄▄███▀█▄█ ▄▀ \n ▀█▀▀▄█ ▀▄█▄▄▄ \n ██▀▀██ ▄▄▄▄▄▀\n ▀ █▄▀ ▀▄ ▀▄▄ \n ▀███▀▄▄▄▄▀ "], ["injured_1", " \n ▄▄▄ \n ▄▄▀▀ ▀▄ \n ▄▀ █▄ ▀▄ \n█ ▄▄▄▄▀▀█▀▀▄ \n▀▀▀▄▀▀ ▄▄▀ ▄ █ \n ██ ██▀ ▄ █▀▀▄\n ▀ ▀▄█▄▄▄▄████ "], ["injured_2", " \n \n ▄▄▀█▀ \n ▄▀█ ▄▀ \n▄▀ ▀▀ ▄▄█▄ \n█▄▄▀██▀▀▄▀ ▀▄ \n ▄█ ▄█▀ ▀▄█▄▄ \n █▀▄▄█▄▄▄██▄▄▄▀"], ["refuse", " \n ▄▄▀█▀ \n ▄▀▀▄ ▄▀ ▄▄▄▄▄\n▄▀ ▀▀ ▄▄██▀ ▄▄▀\n█▄▄███▀█▀█ ▄▄▀ \n ▄█ ▄█ ▄█▄▄▄ \n █▀▄ █▀▄ ▄▄▄▄▀\n ▀█▄▄▄█▄▄▄█▄ "], ["sleep_1", " \n ▄▄▄ \n ▄▄▀▀ ▀▄ \n ▄▀ ▄▄ ▀▄▄█▀▀▀█\n█ ▄▄▄▄█▀█▀ ▀█ \n▀▀▀▄▀▀ ▄ ▀ ▄█▀ \n ██ ██ ▀▀▀▀▀▄\n ▀ ▀▄█▄█▄▄████ "], ["sleep_2", " \n \n ▄▄▀█▀ \n ▄▀▀ ▄▀ ▄▄▄▄▄\n▄▀ ▀▀ ▄▄██▀ ▄▄▀\n█▄▄▀██▀▀ █ ▄▄▀ \n ▄█ ▄█ ▄██▄▄ \n █▀▄▄██▄▄▄▄▄▄▄▀"], ["walk_1", " ▄▄▀█▀ \n ▄▀▀▄▄ ▄▀ \n▄▀ ▀▀ ▄▄▀▄█▀▀▀█\n█▄▄▀████▄█▀ ▀█ \n ▄▀▀ ▄ ▀ ▄▀▀ \n ██ ██ ▀▀▀▀▀▄\n ▀ █▄▀ ▀▄ ▀██▀ \n ▀███▀▄▄▄▄▀ "], ["walk_2", " ▄▄▀█▀ \n ▄▀▀▄▄ ▄▀ \n▄▀ ▀▀ ▄▄▀▄█▀▀▀█\n█▄▄▀████▄█▀ ▀█ \n ▄█▀▀▄█ ▀ ▄▀▀ \n █▀▄ █▀▄ ▀▀▀▀▀▄\n █▄ ▀▄ ▀▀█▀ \n ▀▀▀▀▀▀▀▀▀▀ "]]], + ["zubaeagermon", [["angry", " ▄▄ \n▄▀█ ▄▀█▄▄▄ █ █ \n█ █▄▀▀▀▀▄▄▀ █▄▀▄\n█ █ ▄█ █ ██ █\n█▀ ▄█▄▀▀ █\n█████ ▄ █ █▀\n▀▄▄▄▄▄█ ▀█▄██ █ \n█▄█▄▀▀▄█▄█ █▄▄█ "], ["attack", " ▄▄ \n▄▀█ ▄▀█ ▄▀█ █ █\n█ █▄▀▀▀▀▄█ ▄█ █\n█ █ ▄█▀ █ ██ █\n█▀ █▀██ █\n▀█▀▀▀ ▄█ █▀ █▀\n ██▀▀█ ▀▄ ██ █ \n █▄█▄█▄█▄▀▀█▄▄█ "], ["eat_1", " ▄▄ \n▄▀█ ▄▀█ ▄▀█ █ █\n█ █▄▀▀▀▀▄█ ▄█ █\n█ █ ▄█▀ █ ██ █\n█▀ █▀██ █\n▀█▀▀▀ ▄█ █▀ █▀\n ██▀▀█ ▀▄ ██ █ \n █▄█▄█▄█▄▀▀█▄▄█ "], ["eat_2", "▄▀█ \n█ █ ▄▀█▄▄▄ █▀▄\n█ █▄▀▀▀▀▄▄▀ █ █\n█▀ ▀▀ █ ██ █\n▀█████ █▄██ █\n █▀▀▀▀▄█ █▀ ▀▀▄█\n ██▀▀█ ▀▄ ▄▄ █ \n █▄█▄█▄█▄▀▀█▄▄█ "], ["happy", "▄▀█ ▄▀█ ▄▀█ \n█ █▄▀▀▀▀▄█ █▀▄ \n█ █ ▄▀▄ █ █ █ \n█▀ ▄█ █▄ █\n▀█████ █▄█▀▄██ █\n ▀▄▄▄▄█ ▀▄ ▀▀▀▄█\n ▄▀█▄▀▄ ▄▀▄▄▄ █ \n ▀▀▀▀▀▀▀ █▄▄█ "], ["injured_1", " \n▄▀█ ▄▀█ ▄▀█ ▄▄ \n█ █▄▀▀▀▀▄█ █ █ \n█ █ █▄▄ █ █▄▀▄\n█▀ █▀██ █\n▀███▄ ▄█ █▀ █▀\n ▀██▀▀█ ▀▄ ██ █ \n █▄█▄█▄█▄▀▀█▄▄█ "], ["injured_2", " \n ▄▄ \n█ █ ▄███▀▀█ █▀▄ \n█ █▀▄ ▀▀▄ █ █ \n█▄▀ ▀▀▀ █▄██ █\n█▄▄▄ ▄ ▄█ █▀\n ████▄█▀▄▀ ▄▄ █ \n█▄██▄█▄█▄▄▄█▄▄█ "], ["refuse", " ▄▄ ▄▄ ▄▄ \n█ █ █▄█▄▀▄▀ ▄▄ \n█ █▀ ▀▀▄ █ █ \n█▄▀ ▀▀▀ █ █ ▀▄\n█▄▄▄▄ ▄ ▄█▄██ █\n ▀███▄█▀▄▀ ▀▀▀▄█\n ▄█ █ █▄▄▄ █ \n █▄█▄█▄█▄▀ █▄▄█ "], ["sleep_1", " \n ▄▄ ▄▄▄▄ \n█ █ ▄▄█▄▀▄▀ \n█ █▀ ▀▀▄ \n█▄▀ ▀▀▀ █▄▄▄ \n█▄▄▄▄ ▄ ▄█ ▀▄▀▄\n █▄▄▄▄█▀▄▀█▄ █ █\n█▄██▄█▄█▄█▄▄█▄▄▀"], ["sleep_2", " \n ▄▄ ▄▄▄▄ \n█ █ ▄▄█▄▀▄▀ \n█ █▀ ▀▀▄ \n█▄▀ ▀▀▀ █▄▄▄ \n█▄▄▄▄ ▄ ▄█ ▀▄▀▄\n █▄▄▄▄█▀▄▀█▄ █ █\n█▄██▄█▄█▄█▄▄█▄▄▀"], ["walk_1", " ▄▄ ▄▄ ▄▄ \n█ █ █▄█▄▀▄▀ █▀▄\n█ █▀ ▄▄▀▀▄ █ █\n█▄▀ ▀▀ █ ██ █\n█▄▄▄▄ ▄ ▄█▄██ █\n ▀▄▄▄▄█▀▄▀ ▀▀▀▄█\n ▄█ █ █▄▄▄ █ \n █▄█▄█▄█▄▀ █▄▄█ "], ["walk_2", " ▄▄ \n▄▀█ ▄▀█ ▄▀█ █ █\n█ █▄▀▀▀▀▄█ ▄█ █\n█ █ ▄█▀ █ ██ █\n█▀ █▀██ █\n▀█▀▀▀ ▄█ █▀ █▀\n ██▀▀█ ▀▄ ██ █ \n █▄█▄█▄█▄▀▀█▄▄█ "]]], + ["zubamon", [["angry", " ▄▀▀█ ▄▄▄▄ ▄▄ \n ▀▄▄▀▀ ▄▄▀▄▀ \n █▄▄▄ ██ ▄█ \n ████ █ \n ▀▄▄▄ ▄ █ \n █▄█ █▄▄ █ \n ▄█▀▄▄▄▄▀ █ \n █▄█▄█ █▄█▄█▄█ "], ["attack", " ▄▄▄ \n █ █ ▄▄▄▄ ▄▄ \n ▀▄▄▀▀ ▄▄ ▀▄▀ \n █ ▄██ ▄█ \n █▀▀ ▄▀ \n ▄▀█▀ ▄▀ ▀▄ \n ▀▄█ ▄ ▀▄▀ ▀▄ \n █▄█▄█▀█▄█▄█▄█ "], ["eat_1", " ▄▄▄ \n █ █ ▄▄▄▄ ▄▄ \n ▀▄▄▀▀ ▄▄ ▀▄▀ \n █ ▄██ ▄█ \n █▀▀ ▄▀ \n ▄▀█▀ ▄▀ ▀▄ \n ▀▄█ ▄ ▀▄▀ ▀▄ \n █▄█▄█▀█▄█▄█▄█ "], ["eat_2", " ▄▀▀█ ▄▄▄▄ ▄▄ \n ▀▄▄▀▀ ▄ ▀▄▀ \n ▀▄▄▄▄ ▀ ▀ ▄█ \n █ █▀▄ \n ▄▀▀▀▀ ▀ ▄▀ \n ▀█▀▀ ▄ █ \n ▄█▀▄▄▄▄▀ █ \n █▄█▄█ █▄█▄█▄█ "], ["happy", " ▄▀▀█ \n █ █▄▀▀▀▀▄▀█ \n ▄▀▀ ▄▀▄ ▀▄ \n ▀▄▄▄▄▄▄ ▀█▀█ \n █▀▀▀▀ ▀ ▄▀ \n ▀█▀▀ ▄ █ \n ▄█▀▄▄▄▄▀ █ \n █▄█▄█ █▄█▄█▄█ "], ["injured_1", " ▄▄▄ \n █ █ ▄▄▄▄ ▄▄ \n ▀▄▄▀▀ ▄ ▀▄▀ \n █ ▀▀ ▄█ \n █▀▀ ▄▀ \n ▄█▀▀ ▄█▄▄▄ \n █ ▀█▀▄▄▀█ ▀ ▀ █\n ▀▄▄▀▄██▄▀▄▄▄▄▄▀"], ["injured_2", " \n ▄▀▀█ \n █ █▄▀▀▀▀▄▀█ \n ▄▀▀ ▀▄▄ ▀▄ \n ▀▄▄▄ ▀█ \n █▄▄▄ ▄█▄▄▄ \n █ ▀▄▄ ▄█ ▀ ▀ █\n ▀▄▄█▄██▄█▄▄▄▄▄▀"], ["refuse", " ▄▄▄ \n █ █ ▄▄▄▄ ▄▄ \n ▀▄▄▀▀ ▀▄▀ \n █ ▄▀▄ ▄█ \n █▀▀ ▄▀ \n ▄▀█▀ ▄▀ ▀▄ \n ▀██▄ ▀██ ▀▄ \n █▄█▄█▀█▄█▄█▄█ "], ["sleep_1", " ▄▄▄ \n █ █ ▄▄▄▄ ▄▄ \n ▀▄▄▀▀ ▀▄▀ \n █ ▀▀▀ ▄█ \n █▀▀ ▄▀ \n ▄▀█▀ ▄▀ ▀▄ \n ▀██▄ ▀██ ▀▄ \n █▄█▄█▀█▄█▄█▄█ "], ["sleep_2", " ▄▄▄ \n █ █ ▄▄▄▄ ▄▄ \n ▀▄▄▀▀ ▀▄▀ \n █ ▀▀▀ ▄█ \n █▀▀ ▄▀ \n ▄▀█▀ ▄▀ ▀▄ \n ▀██▄ ▀██ ▀▄ \n █▄█▄█▀█▄█▄█▄█ "], ["walk_1", " ▄▀▀█ \n █ █▄▀▀▀▀▄▀█ \n ▄▀▀ ▀█▄ ▀▄ \n ▀▄▄▄ ▀▀▀ ▀█ \n ▀▄▄▄ ▄ █ \n █▄█ █▄▄ █ \n ▄█▀▄▄▄▄▀ █ \n █▄█▄█ █▄█▄█▄█ "], ["walk_2", " ▄▄▄ \n █ █ ▄▄▄▄ ▄▄ \n ▀▄▄▀▀ ▄▄ ▀▄▀ \n █ ▄██ ▄█ \n █▀▀ ▄▀ \n ▄▀█▀ ▄▀ ▀▄ \n ▀▄█ ▄ ▀▄▀ ▀▄ \n █▄█▄█▀█▄█▄█▄█ "]]], + ["zudomon", [["angry", "▀▀▄▄ █\n▀▄ █▀▀▀▄█▀█ \n▄▀▀▀ ▄▄ █▀█ \n█▀ ▀▀ █▀█ ▄\n▀█▀████▀█▄ █▀ █\n ▀▄█ ▀▄█ ▀ █▀█ \n█▀▀▄ ▀▀▀▄▄▀ \n▄█▄▄█▀▀▀█▄█▄█▄██"], ["attack", "█▀▀▄▄ █\n ▀▄ █▀▀▀▄█▀█ ▄\n ▄▀▀▀▄█▀ █▀█ ▄\n █▄▄▄▄▄▄ █▀█ \n ▄█ ███ █ ▀▀▀█▀█\n█ ▀█████▀ ▄ █▄▀\n▄▀▀▄ ▀▀▀▄▀▀\n▄█▄▄█▀▀█▄█▄█▄▄█ "], ["eat_1", "▀▀▄▄ █\n▀▄ █▀▀▀▄█▀█ ▄\n▄▀▀▀ ▄█ █▀█ ▄\n█▄▄▄▄▄▄▄ █▀█ \n▄█ ███ █▄ ▀█▀ █\n █▀▀▀█ █▄▄▀█ ▀\n█▀▄ ▀▀ ▀▄█ ▀\n▄█▄██▀█▄█▄█▄▄█ "], ["eat_2", "▀▀▄▄ \n▀▄ █▀▀▀▄█▀█ █\n▄▀▀▀ ▄ █▀█ \n█▀ ▀▀ █▀█ \n▄█▀████▀█▄ █▀ \n ▀▄█ █▄▀ █ █▀█ \n█▀ ▄ ▀▀▀▀▄▄▀█\n▄█▄▄█▀▀▄█▄█▄▄█ █"], ["happy", "▀▀▄▄ █\n▀▄ █▀▀▀▄█▀█ \n▄▀▀▀ ▄▀▄ █▀█ \n▀▄▄▄▄▄▄▄▄ ▄▀▀▄ \n █ ████ █▄▀ █ █\n▀▄▀████▀▀ ▄▀▀█▀\n▄▀▀▄ ▀▀▄▀ \n▄█▄▄█▀▀█▄█▄█▄█ █"], ["injured_1", "▄▄ \n▄ ▀▀▄▄▄▄ ▄▄▄ █\n █▄▄▀ ▀▀▄█▄ \n█ █▄ ▀▄█▄ \n▀▄▄▄▄▄▄▄▄ ▀▄█ \n▀█ █▀▀█ █▄ █▀█ \n▄▄█▀ ▀▀█▄▄█▄▄▀█\n▄▄▄█▄▄▄█▄▄▄▄▄▄██"], ["injured_2", " \n▀▀▄▄ \n▀▄ █▀▀▀▄█▀█ \n▄▀▀▀ ▄ █▀█ \n█▀ ▀▀ █▀█ \n▄█▀████▀█▄ █▀ \n▄█▄█ ▀▄█▄▄▄▀▀▄ \n▄▄█▄▄▄█▄▄▄▄▄█▄▀█"], ["sleep_1", " ▄\n▀▀▄▄ ▀\n▀▄ █▀▀▀▄█▀█ \n▄▀▀▀ ▄ █▀█ \n█ ▀▀ █▀█ \n▄█▀████▀█▄ █▀ ▄\n▄█▄█ ▀▄█▄▄▄▀▀▄▀\n▄▄█▄▄▄█▄▄▄▄▄█▄▀█"], ["sleep_2", "▄▄ \n▄ ▀▀▄▄▄▄ ▄▄▄ \n █▄▄▀ ▄▀▀▄█▄ \n█ ▀▀ ▀▄█▄ \n▀▄▄▄▄▄▄▄▄ ▀▄█ \n▀█ █▀▀█ █▀ █▀██\n▄▄▀▀ ▀▀▄▄█▄▄▀▀\n▄▄█▄▄▄▄█▄▄▄▄▄▄█ "], ["walk_1", "▀▀▄▄ ▄\n▀▄ █▀▀▀▄█▀█ ▀\n▄▀▀▀ ▄ █▀█ \n█▀ ▀▀ ▄▀▀█▀█ \n █▀████▀█▄ █▀ \n▄▀▄█ ▀▄█ ▀ █▀█▄\n▄▀▀▄ ▀▀▄▄▀▀\n▄█▄▄█▀▀█▄█▄█▄█ █"], ["walk_2", "▄▄ █\n▄ ▀▀▄▄▄▄ ▄▄▄ \n █▄▄▀ ▀▀▄█▄ \n█▄ ▄█ ▀▄█▄ \n▀▄▄▄▄▄▄▄▄ ▀▄█ \n▀█ █▀▀█ █▀ █▀██\n▄▄█▀ ▀▀ ▀▀▀▄▄▀ \n▄█▄█▄▄▄█▄█▄█▄█ █"]]], + ["zurumon", [["angry", " \n \n \n \n \n ▄▄▄▄ \n ██▄▄██ \n ▄▄▄████▄ "], ["attack", " \n \n ▄▄▄▄▄ \n ▄████▀██▄ \n ████▄▄███ \n ▀ ▀ ▀██ \n ▄ ▄ ██ \n ▀█████████▄ "], ["eat_1", " \n \n \n \n ▄██▀█▄ \n ▀███▄ \n ███ \n ▄███████ "], ["eat_2", " \n \n \n \n \n ▄▄▄▄ \n ██▄███ \n ▄▄▄████▄ "], ["happy", " \n \n \n \n ▄▀█▀█▄ \n ▄███████ \n █ ▄█ \n ▀█▄▄▄██▀ "], ["injured_1", " \n \n \n \n \n \n ▄▀█▀█▄ \n ▄▄█▄▄██▄ "], ["injured_2", " \n \n \n \n \n \n ▄▄▄▄▄ \n ▄▀ █ ▀██▄ "], ["sleep_1", " \n \n \n \n \n \n ▄████▄ \n ▄▄█▄▄██ "], ["sleep_2", " \n \n \n \n \n ▄████▄ \n ▀▀█▀▀██ \n ▀█████▀ "], ["walk_1", " \n \n \n \n \n ▄▄▄▄ \n █▄█▄██ \n ▀█▄████▄ "], ["walk_2", " \n \n \n \n \n \n ▄████▄ \n █▄█▄███▄ "]]], +] diff --git a/packages/vpet-core/src/data/stages.ts b/packages/vpet-core/src/data/stages.ts new file mode 100644 index 0000000..b2e7d37 --- /dev/null +++ b/packages/vpet-core/src/data/stages.ts @@ -0,0 +1,21 @@ +import type { StageLabels, StageThresholdKey } from "../config/types.ts" +import { DIGIMON_STAGES, isDigimonStage, type DigimonStage } from "../domain/stage.ts" + +export { isDigimonStage, type DigimonStage } + +export const STAGE_VALUES = DIGIMON_STAGES + +export const STAGE_THRESHOLD_KEYS = { + 0: "egg", + 1: "babyI", + 2: "babyII", + 3: "child", + 4: "adult", + 5: "perfect", + 6: "ultimate", + 7: "superUltimate", +} as const satisfies Record + +export const getStageKey = (stage: DigimonStage): StageThresholdKey => STAGE_THRESHOLD_KEYS[stage] + +export const getStageLabel = (stage: DigimonStage, labels: StageLabels): string => labels[getStageKey(stage)] diff --git a/packages/vpet-core/src/domain/digimon-node.ts b/packages/vpet-core/src/domain/digimon-node.ts new file mode 100644 index 0000000..7a7ee5f --- /dev/null +++ b/packages/vpet-core/src/domain/digimon-node.ts @@ -0,0 +1,16 @@ +import type { DigimonStage } from "./stage.ts" + +export type DigimonNode = { + readonly id: string + readonly nameEn: string + readonly nameJp: string + readonly nextEvolutions: readonly string[] + readonly sprite: string + readonly stage: DigimonStage + readonly url: string +} + +export type DigimonCatalog = { + readonly nodes: readonly DigimonNode[] + readonly byId: ReadonlyMap +} diff --git a/packages/vpet-core/src/domain/evolution.ts b/packages/vpet-core/src/domain/evolution.ts new file mode 100644 index 0000000..25f0f5b --- /dev/null +++ b/packages/vpet-core/src/domain/evolution.ts @@ -0,0 +1,65 @@ +import type { DigimonNode } from "./digimon-node.ts" +import { DIGIMON_STAGES, type DigimonStage } from "./stage.ts" + +export type StageThresholds = Readonly> + +export const STAGE_GAUGE_THRESHOLDS = Object.freeze({ + 0: 500_000, + 1: 1_000_000, + 2: 2_000_000, + 3: 4_000_000, + 4: 7_500_000, + 5: 12_500_000, + 6: 20_000_000, + 7: 30_000_000, +} as const satisfies StageThresholds) + +export type PartnerEvolutionState = { + readonly current: DigimonNode + readonly gauge: number + readonly isTerminal: boolean +} + +export type EvolutionSelector = () => number + +const isRecord = (value: unknown): value is Readonly> => { + return typeof value === "object" && value !== null +} + +const isStageThresholds = (thresholds: unknown): thresholds is StageThresholds => { + if (!isRecord(thresholds) || !Object.isFrozen(thresholds)) return false + + return DIGIMON_STAGES.every((stage) => { + const threshold = thresholds[stage] + return typeof threshold === "number" && Number.isFinite(threshold) && threshold > 0 + }) +} + +export const applyTokenProgress = ( + state: PartnerEvolutionState, + tokenDelta: number, + selector: EvolutionSelector, + digimonById: ReadonlyMap, + thresholds: unknown, +): PartnerEvolutionState => { + if (!isStageThresholds(thresholds)) { + throw new Error("Evolution thresholds must be a complete frozen policy of positive finite numbers") + } + if (state.isTerminal) return state + + const gauge = state.gauge + tokenDelta + if (gauge < thresholds[state.current.stage]) return { ...state, gauge } + if (state.current.nextEvolutions.length === 0) return { ...state, gauge: 0, isTerminal: true } + + const selection = selector() + if (!Number.isFinite(selection) || selection < 0 || selection >= 1) { + throw new Error(`Evolution selector must return a finite number in [0, 1), received ${selection}`) + } + + const targetId = state.current.nextEvolutions[Math.floor(selection * state.current.nextEvolutions.length)] + if (targetId === undefined) throw new Error("Evolution target selection failed") + const current = digimonById.get(targetId) + if (current === undefined) throw new Error(`Evolution target ${targetId} is missing from the catalog`) + + return { current, gauge: 0, isTerminal: current.nextEvolutions.length === 0 } +} diff --git a/packages/vpet-core/src/domain/partner.ts b/packages/vpet-core/src/domain/partner.ts new file mode 100644 index 0000000..d153747 --- /dev/null +++ b/packages/vpet-core/src/domain/partner.ts @@ -0,0 +1,15 @@ +export type Partner = { + readonly partnerId: string + readonly generation: number + readonly currentNodeId: string + readonly gauge: number + readonly isTerminal: boolean + readonly createdAt: string + readonly retiredAt: string | null +} + +export type PartnerProgression = { + readonly currentNodeId: string + readonly gauge: number + readonly isTerminal: boolean +} diff --git a/packages/vpet-core/src/domain/stage.ts b/packages/vpet-core/src/domain/stage.ts new file mode 100644 index 0000000..1456c93 --- /dev/null +++ b/packages/vpet-core/src/domain/stage.ts @@ -0,0 +1,7 @@ +export const DIGIMON_STAGES = [0, 1, 2, 3, 4, 5, 6, 7] as const + +export type DigimonStage = (typeof DIGIMON_STAGES)[number] + +export const isDigimonStage = (value: number): value is DigimonStage => { + return DIGIMON_STAGES.some((stage) => stage === value) +} diff --git a/packages/vpet-core/src/ports/sqlite-executor.ts b/packages/vpet-core/src/ports/sqlite-executor.ts new file mode 100644 index 0000000..7c71934 --- /dev/null +++ b/packages/vpet-core/src/ports/sqlite-executor.ts @@ -0,0 +1,8 @@ +export type QueryValue = string | number | boolean | null + +export type SqliteExecutor = { + run: (sql: string, params?: readonly QueryValue[]) => void + get: >(sql: string, params?: readonly QueryValue[]) => TRow | null + all: >(sql: string, params?: readonly QueryValue[]) => readonly TRow[] + transaction: (operation: () => TReturn) => TReturn +} diff --git a/packages/vpet-core/src/view-models/dex-view-model.ts b/packages/vpet-core/src/view-models/dex-view-model.ts new file mode 100644 index 0000000..2173605 --- /dev/null +++ b/packages/vpet-core/src/view-models/dex-view-model.ts @@ -0,0 +1,77 @@ +import type { VpetArchiveResult } from "../application/models/vpet-archive.ts" +import type { ResolvedVpetSettings } from "../config/types.ts" +import type { DigimonCatalog } from "../data/catalog.ts" +import { getStageLabel } from "../data/stages.ts" +import { DIGIMON_STAGES } from "../domain/stage.ts" +import type { DigimonNode } from "../domain/digimon-node.ts" + +export type DexRow = { + readonly id: string + readonly stage: string + readonly discovered: boolean + readonly name: string +} + +export type DexViewModel = + | { readonly kind: "available"; readonly rows: readonly DexRow[] } + | { readonly kind: "empty" } + | { readonly kind: "unavailable"; readonly message: string } + +const REDACTED_NAME = "------" + +const assertNever = (value: never): never => { + throw new Error(`Unexpected archive result: ${JSON.stringify(value)}`) +} + +const compareCatalogNodes = (left: DigimonNode, right: DigimonNode): number => { + const stageDifference = DIGIMON_STAGES.indexOf(left.stage) - DIGIMON_STAGES.indexOf(right.stage) + if (stageDifference !== 0) return stageDifference + const [, leftSerial = ""] = left.id.split("-") + const [, rightSerial = ""] = right.id.split("-") + const serialDifference = Number(leftSerial) - Number(rightSerial) + if (serialDifference !== 0) return serialDifference + if (left.id < right.id) return -1 + if (left.id > right.id) return 1 + return 0 +} + +const discoveredNodeIds = ( + archive: Extract, +): ReadonlySet => { + const nodeIds = new Set() + for (const partner of archive.partners) { + for (const event of partner.events) nodeIds.add(event.currentNodeId) + } + return nodeIds +} + +export const buildDexViewModel = ( + archive: VpetArchiveResult, + catalog: DigimonCatalog, + settings: ResolvedVpetSettings, +): DexViewModel => { + switch (archive.kind) { + case "available": { + const discoveredIds = discoveredNodeIds(archive) + const labels = settings.stageLabels[settings.language] + return { + kind: "available", + rows: catalog.nodes + .slice() + .sort(compareCatalogNodes) + .map((node) => ({ + id: node.id, + stage: getStageLabel(node.stage, labels), + discovered: discoveredIds.has(node.id), + name: discoveredIds.has(node.id) ? (settings.language === "en" ? node.nameEn : node.nameJp) : REDACTED_NAME, + })), + } + } + case "empty": + return { kind: "empty" } + case "unavailable": + return { kind: "unavailable", message: archive.message } + default: + return assertNever(archive) + } +} diff --git a/packages/vpet-core/src/view-models/history-view-model.ts b/packages/vpet-core/src/view-models/history-view-model.ts new file mode 100644 index 0000000..6eb6b2a --- /dev/null +++ b/packages/vpet-core/src/view-models/history-view-model.ts @@ -0,0 +1,74 @@ +import type { VpetArchiveEvent, VpetArchivePartner, VpetArchiveResult } from "../application/models/vpet-archive.ts" +import type { ResolvedVpetSettings } from "../config/types.ts" +import type { DigimonCatalog } from "../data/catalog.ts" + +export type HistoryGeneration = { + readonly partnerId: string + readonly generation: number + readonly createdAt: string + readonly retiredAt: string | null + readonly path: readonly string[] +} + +export type HistoryViewModel = + | { readonly kind: "available"; readonly generations: readonly HistoryGeneration[] } + | { readonly kind: "empty" } + | { readonly kind: "unavailable"; readonly message: string } + +const assertNever = (value: never): never => { + throw new Error(`Unexpected archive result: ${JSON.stringify(value)}`) +} + +const comparePartners = (left: VpetArchivePartner, right: VpetArchivePartner): number => { + const createdAtComparison = right.createdAt.localeCompare(left.createdAt) + if (createdAtComparison !== 0) return createdAtComparison + const generationDifference = right.generation - left.generation + if (generationDifference !== 0) return generationDifference + return right.partnerId.localeCompare(left.partnerId) +} + +const dedupeAdjacentEvents = (events: readonly VpetArchiveEvent[]): readonly VpetArchiveEvent[] => { + const distinctEvents: VpetArchiveEvent[] = [] + for (const event of events) { + const previousEvent = distinctEvents.at(-1) + if (previousEvent?.currentNodeId !== event.currentNodeId) distinctEvents.push(event) + } + return distinctEvents +} + +const displayNodeId = (nodeId: string, catalog: DigimonCatalog, settings: ResolvedVpetSettings): string => { + const node = catalog.byId.get(nodeId) + if (node === undefined) return nodeId + return `${node.id} ${settings.language === "en" ? node.nameEn : node.nameJp}` +} + +export const buildHistoryViewModel = ( + archive: VpetArchiveResult, + catalog: DigimonCatalog, + settings: ResolvedVpetSettings, +): HistoryViewModel => { + switch (archive.kind) { + case "available": + return { + kind: "available", + generations: archive.partners + .slice() + .sort(comparePartners) + .map((partner) => ({ + partnerId: partner.partnerId, + generation: partner.generation, + createdAt: partner.createdAt, + retiredAt: partner.retiredAt, + path: dedupeAdjacentEvents(partner.events).map((event) => + displayNodeId(event.currentNodeId, catalog, settings), + ), + })), + } + case "empty": + return { kind: "empty" } + case "unavailable": + return { kind: "unavailable", message: archive.message } + default: + return assertNever(archive) + } +} diff --git a/packages/vpet-core/src/view-models/sidebar-view-model.ts b/packages/vpet-core/src/view-models/sidebar-view-model.ts new file mode 100644 index 0000000..c345e99 --- /dev/null +++ b/packages/vpet-core/src/view-models/sidebar-view-model.ts @@ -0,0 +1,42 @@ +import type { SidebarCardInputs } from "../application/models/sidebar-card-inputs.ts" +import { DEFAULT_VPET_SETTINGS } from "../config/defaults.ts" +import type { ResolvedVpetSettings } from "../config/types.ts" +import { getStageKey, getStageLabel } from "../data/stages.ts" + +export type SidebarCardModel = + | { readonly kind: "no_partner"; readonly messageLine: string } + | { + readonly kind: "partner" + readonly name: string + readonly sprite: string + readonly stage: string + readonly stageNumber: number + readonly url: string + readonly gauge: number + readonly threshold: number + readonly isTerminal: boolean + readonly frozen: boolean + readonly isSetOverride: boolean + } + +export const buildSidebarCardModel = ( + inputs: SidebarCardInputs, + settings: ResolvedVpetSettings = DEFAULT_VPET_SETTINGS, +): SidebarCardModel => { + if (inputs.kind === "no_partner") return { kind: "no_partner", messageLine: "No active partner" } + + const stageKey = getStageKey(inputs.node.stage) + return { + kind: "partner", + name: settings.language === "en" ? inputs.node.nameEn : inputs.node.nameJp, + sprite: inputs.node.sprite, + stage: getStageLabel(inputs.node.stage, settings.stageLabels[settings.language]), + stageNumber: inputs.node.stage, + url: inputs.node.url, + gauge: inputs.gauge, + threshold: settings.stageThresholds[stageKey], + isTerminal: inputs.isTerminal, + frozen: inputs.frozen, + isSetOverride: inputs.isSetOverride, + } +} diff --git a/packages/vpet-core/tsconfig.json b/packages/vpet-core/tsconfig.json new file mode 100644 index 0000000..dad5ed4 --- /dev/null +++ b/packages/vpet-core/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "strict": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "target": "ESNext", + "lib": ["ESNext"], + "noEmit": true, + "skipLibCheck": true + }, + "include": ["src"] +} diff --git a/scripts/migrate-imports.mjs b/scripts/migrate-imports.mjs new file mode 100644 index 0000000..643a0bf --- /dev/null +++ b/scripts/migrate-imports.mjs @@ -0,0 +1,51 @@ +import { readdir, readFile, writeFile } from "node:fs/promises" +import { join } from "node:path" + +const ROOT = join(import.meta.dirname, "..", "packages", "opencode-vpet") + +const REPLACEMENTS = [ + [/from "(\.\.\/)+domain\//g, 'from "@sbugallo/vpet-core/domain/'], + [/from "\.\/domain\//g, 'from "@sbugallo/vpet-core/domain/'], + [/from "(\.\.\/)+application\//g, 'from "@sbugallo/vpet-core/application/'], + [/from "\.\/application\//g, 'from "@sbugallo/vpet-core/application/'], + [/from "(\.\.\/)+data\//g, 'from "@sbugallo/vpet-core/data/'], + [/from "\.\/data\//g, 'from "@sbugallo/vpet-core/data/'], + [/from "(\.\.\/)+config\/types\.ts"/g, 'from "@sbugallo/vpet-core/config/types.ts"'], + [/from "\.\/config\/types\.ts"/g, 'from "@sbugallo/vpet-core/config/types.ts"'], + [/from "(\.\.\/)+config\/defaults\.ts"/g, 'from "@sbugallo/vpet-core/config/defaults.ts"'], + [/from "\.\/config\/defaults\.ts"/g, 'from "@sbugallo/vpet-core/config/defaults.ts"'], + [/from "(\.\.\/)+config\/normalize\.ts"/g, 'from "@sbugallo/vpet-core/config/normalize.ts"'], + [/from "\.\/config\/normalize\.ts"/g, 'from "@sbugallo/vpet-core/config/normalize.ts"'], + [/from "\.\/sidebar-view-model\.ts"/g, 'from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts"'], + [/from "\.\/dex-view-model\.ts"/g, 'from "@sbugallo/vpet-core/view-models/dex-view-model.ts"'], + [/from "\.\/history-view-model\.ts"/g, 'from "@sbugallo/vpet-core/view-models/history-view-model.ts"'], + [/from "\.\.\/tui\/sidebar-view-model\.ts"/g, 'from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts"'], + [/from "\.\.\/tui\/dex-view-model\.ts"/g, 'from "@sbugallo/vpet-core/view-models/dex-view-model.ts"'], + [/from "\.\.\/tui\/history-view-model\.ts"/g, 'from "@sbugallo/vpet-core/view-models/history-view-model.ts"'], + [/from "\.\.\/src\/domain\//g, 'from "@sbugallo/vpet-core/domain/'], + [/from "\.\.\/\.\.\/src\/domain\//g, 'from "@sbugallo/vpet-core/domain/'], + [/from "\.\.\/src\/application\//g, 'from "@sbugallo/vpet-core/application/'], + [/from "\.\.\/\.\.\/src\/application\//g, 'from "@sbugallo/vpet-core/application/'], + [/from "\.\.\/src\/data\//g, 'from "@sbugallo/vpet-core/data/'], + [/from "\.\.\/\.\.\/src\/data\//g, 'from "@sbugallo/vpet-core/data/'], + [/from "\.\.\/src\/data\/digimon-data"/g, 'from "@sbugallo/vpet-core/data/digimon-data.ts"'], +] + +const walk = async (dir) => { + const entries = await readdir(dir, { withFileTypes: true }) + for (const entry of entries) { + const path = join(dir, entry.name) + if (entry.isDirectory()) await walk(path) + else if (entry.name.endsWith(".ts") || entry.name.endsWith(".tsx")) { + let content = await readFile(path, "utf8") + for (const [pattern, replacement] of REPLACEMENTS) { + content = content.replace(pattern, replacement) + } + await writeFile(path, content) + } + } +} + +await walk(join(ROOT, "src")) +await walk(join(ROOT, "tests")) +console.log("Import migration complete") diff --git a/scripts/prepack.ts b/scripts/prepack.ts deleted file mode 100644 index 1de84fa..0000000 --- a/scripts/prepack.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { resolve } from "node:path" - -type JsonObject = { readonly [key: string]: unknown } - -const isJsonObject = (value: unknown): value is JsonObject => - typeof value === "object" && value !== null && !Array.isArray(value) - -const collectPaths = (value: unknown, paths: Set): void => { - if (typeof value === "string") { - paths.add(value) - return - } - if (!isJsonObject(value)) return - for (const nestedValue of Object.values(value)) collectPaths(nestedValue, paths) -} - -await Bun.$`bun run build` - -const packageRoot = resolve(import.meta.dir, "..") -const packageJson: unknown = JSON.parse(await Bun.file(resolve(packageRoot, "package.json")).text()) -if (!isJsonObject(packageJson)) throw new Error("package.json must contain an object.") - -const publishedPaths = new Set() -collectPaths(packageJson.main, publishedPaths) -collectPaths(packageJson.types, publishedPaths) -collectPaths(packageJson.exports, publishedPaths) -collectPaths(packageJson.bin, publishedPaths) - -for (const publishedPath of publishedPaths) { - const artifactPath = resolve(packageRoot, publishedPath) - const artifact = Bun.file(artifactPath) - if (!(await artifact.exists()) || artifact.size === 0) { - throw new Error(`Published artifact is missing or empty: ${publishedPath}`) - } -} - -const binPaths = new Set() -collectPaths(packageJson.bin, binPaths) -const cliPath = binPaths.values().next().value -if (typeof cliPath !== "string") throw new Error("Package metadata does not define a bin path.") - -const cliResult = Bun.spawnSync(["node", resolve(packageRoot, cliPath), "--help"], { - stdout: "inherit", - stderr: "inherit", -}) -if (cliResult.exitCode !== 0) throw new Error(`Node CLI help failed: ${cliPath}`) diff --git a/scripts/release-metadata.ts b/scripts/release-metadata.ts index 5fcbdf7..a6a1ff0 100644 --- a/scripts/release-metadata.ts +++ b/scripts/release-metadata.ts @@ -150,6 +150,15 @@ export const runReleaseMetadataCli = async ( return { nextDevVersion, releaseVersion } } +export const setStablePackageVersion = async (packageJsonPath: string, version: string): Promise => { + if (!isStableVersion(version)) { + throw new Error(`Package version must be stable SemVer: ${version}.`) + } + const packageMetadata = parsePackageMetadata(await readFile(packageJsonPath, "utf8")) + if (packageMetadata.version === version) return + await writeFile(packageJsonPath, `${JSON.stringify({ ...packageMetadata, version }, null, 2)}\n`) +} + export const setPackageVersion = async (packageJsonPath: string, version: string): Promise => { if (semver.valid(version) !== version || semver.prerelease(version) === null) { throw new Error(`Package version must be an exact prerelease SemVer version: ${version}.`) @@ -174,7 +183,13 @@ const writeGithubOutputs = async (result: { if (import.meta.main) { const [command, ...arguments_] = Bun.argv.slice(2) - if (command === "set-package-version") { + if (command === "set-package-stable-version") { + const [packageJsonPath, version] = arguments_ + if (packageJsonPath === undefined || version === undefined || arguments_.length !== 2) { + throw new Error("Expected set-package-stable-version .") + } + await setStablePackageVersion(packageJsonPath, version) + } else if (command === "set-package-version") { const [packageJsonPath, version] = arguments_ if (packageJsonPath === undefined || version === undefined || arguments_.length !== 2) { throw new Error("Expected set-package-version .") diff --git a/tsconfig.json b/tsconfig.json index 6e32e0e..ee50164 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,29 +1,12 @@ { - "compilerOptions": { - "strict": true, - "noUncheckedIndexedAccess": true, - "exactOptionalPropertyTypes": true, - "noFallthroughCasesInSwitch": true, - "noPropertyAccessFromIndexSignature": true, - "forceConsistentCasingInFileNames": true, - "module": "ESNext", - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "verbatimModuleSyntax": true, - "isolatedModules": true, - "target": "ESNext", - "lib": ["ESNext", "DOM"], - "types": ["bun"], - "jsx": "react-jsx", - "jsxImportSource": "@opentui/solid", - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "outDir": "dist", - "rootDir": "src", - "skipLibCheck": true, - "noEmit": true - }, - "include": ["src"], - "exclude": ["node_modules", "dist", "tests"] + "files": [], + "references": [ + { "path": "./packages/vpet-core" }, + { "path": "./packages/opencode-vpet" }, + { "path": "./packages/opencode-vpet/tsconfig.scripts.json" }, + { "path": "./packages/opencode-vpet/tsconfig.test.json" }, + { "path": "./packages/cursor-vpet" }, + { "path": "./packages/cursor-vpet/tsconfig.scripts.json" }, + { "path": "./tsconfig.release-metadata.json" } + ] } diff --git a/tsconfig.release-metadata.json b/tsconfig.release-metadata.json index a49dcd4..4216dac 100644 --- a/tsconfig.release-metadata.json +++ b/tsconfig.release-metadata.json @@ -1,8 +1,13 @@ { - "extends": "./tsconfig.json", "compilerOptions": { + "strict": true, + "module": "ESNext", + "moduleResolution": "bundler", + "target": "ESNext", + "types": ["bun", "node"], "noEmit": true, - "rootDir": "scripts" + "rootDir": "scripts", + "skipLibCheck": true }, "include": ["scripts/release-metadata.ts"] } From 19db60d2020006087d50842c179a84cd6e539dd5 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Thu, 10 Sep 2026 12:27:57 +0900 Subject: [PATCH 02/41] feat(cursor-vpet): animate sidebar and package monorepo changelog Adds walking, action, and sleep animation in the sidebar webview and copies the root CHANGELOG.md when packing npm and VSIX artifacts, removing the local stub. Co-authored-by: Cursor --- .gitignore | 2 + packages/cursor-vpet/CHANGELOG.md | 10 - packages/cursor-vpet/scripts/build.ts | 5 +- packages/cursor-vpet/src/extension.ts | 11 +- .../src/webview/animated-artwork.ts | 47 +++ .../src/webview/monster-action-policy.ts | 46 +++ .../src/webview/monster-animation.ts | 330 ++++++++++++++++++ .../src/webview/monster-artwork-mirror.ts | 77 ++++ .../src/webview/monster-walking-policy.ts | 150 ++++++++ .../cursor-vpet/src/webview/sidebar-render.ts | 77 +++- .../src/webview/static-monster-artwork.ts | 11 - .../src/webview/vpet-sidebar-provider.ts | 104 +++++- .../cursor-vpet/tests/sidebar-render.test.ts | 7 +- packages/opencode-vpet/package.json | 3 +- packages/opencode-vpet/scripts/postpack.ts | 3 + packages/opencode-vpet/scripts/prepack.ts | 3 + scripts/stage-changelog.ts | 35 ++ tsconfig.release-metadata.json | 2 +- 18 files changed, 865 insertions(+), 58 deletions(-) delete mode 100644 packages/cursor-vpet/CHANGELOG.md create mode 100644 packages/cursor-vpet/src/webview/animated-artwork.ts create mode 100644 packages/cursor-vpet/src/webview/monster-action-policy.ts create mode 100644 packages/cursor-vpet/src/webview/monster-animation.ts create mode 100644 packages/cursor-vpet/src/webview/monster-artwork-mirror.ts create mode 100644 packages/cursor-vpet/src/webview/monster-walking-policy.ts delete mode 100644 packages/cursor-vpet/src/webview/static-monster-artwork.ts create mode 100644 scripts/stage-changelog.ts diff --git a/.gitignore b/.gitignore index 6c91d37..ee46c7c 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,5 @@ Thumbs.db *.vsix npm-pack.json .package.json.publish.bak +packages/opencode-vpet/CHANGELOG.md +packages/cursor-vpet/CHANGELOG.md diff --git a/packages/cursor-vpet/CHANGELOG.md b/packages/cursor-vpet/CHANGELOG.md deleted file mode 100644 index 43d9585..0000000 --- a/packages/cursor-vpet/CHANGELOG.md +++ /dev/null @@ -1,10 +0,0 @@ -# Changelog - -Extension releases follow the monorepo changelog: -[CHANGELOG.md](https://github.com/sbugallo/opencode-vpet/blob/main/CHANGELOG.md) - -## [Unreleased] - -### Added - -- Cursor/VS Code extension with sidebar, Dex, History, and Agent usage tracking. diff --git a/packages/cursor-vpet/scripts/build.ts b/packages/cursor-vpet/scripts/build.ts index 46b014d..b619fdf 100644 --- a/packages/cursor-vpet/scripts/build.ts +++ b/packages/cursor-vpet/scripts/build.ts @@ -1,6 +1,8 @@ import { copyFile, mkdir, rm } from "node:fs/promises" import { createRequire } from "node:module" -import { dirname, resolve } from "node:path" +import { resolve } from "node:path" + +import { stageChangelog } from "../../../scripts/stage-changelog.ts" const require = createRequire(import.meta.url) const packageRoot = resolve(import.meta.dir, "..") @@ -9,6 +11,7 @@ const wasmSource = require.resolve("sql.js/dist/sql-wasm.wasm") await rm(distDirectory, { recursive: true, force: true }) await mkdir(distDirectory, { recursive: true }) +await stageChangelog(packageRoot) const result = await Bun.build({ entrypoints: ["./src/extension.ts"], diff --git a/packages/cursor-vpet/src/extension.ts b/packages/cursor-vpet/src/extension.ts index 8f6b770..6d8433b 100644 --- a/packages/cursor-vpet/src/extension.ts +++ b/packages/cursor-vpet/src/extension.ts @@ -10,6 +10,7 @@ import { createCursorUsageEventSource } from "./adapters/cursor/cursor-usage-eve import { installVpetHooks, uninstallVpetHooks } from "./adapters/cursor/install-hooks.ts" import { resolveStateVscdbPath } from "./adapters/cursor/paths.ts" import { configureSqlJsWasmPath } from "./adapters/sqlite/sqljs-config.ts" +import { createSqliteSidebarSnapshotReader } from "./adapters/sqlite/sqlite-sidebar-snapshot-reader.ts" import { createSqliteVpetRepository } from "./adapters/sqlite/sqlite-vpet-write-store.ts" import { getVpetExtensionSettings, toDatabaseOptions } from "./config/extension-settings.ts" import { openDexPanel } from "./webview/dex-panel.ts" @@ -50,8 +51,14 @@ export async function activate(context: vscode.ExtensionContext): Promise const repository = await createSqliteVpetRepository(databaseOptions()) context.subscriptions.push({ dispose: () => repository.close() }) - sidebarProvider = new VpetSidebarProvider(context.extensionUri, databaseOptions()) - context.subscriptions.push(vscode.window.registerWebviewViewProvider(VpetSidebarProvider.viewType, sidebarProvider)) + const snapshotReader = await createSqliteSidebarSnapshotReader(databaseOptions()) + sidebarProvider = new VpetSidebarProvider(context.extensionUri, snapshotReader) + context.subscriptions.push( + vscode.window.registerWebviewViewProvider(VpetSidebarProvider.viewType, sidebarProvider, { + webviewOptions: { retainContextWhenHidden: true }, + }), + { dispose: () => sidebarProvider?.dispose() }, + ) const refreshSidebar = (): void => { void sidebarProvider?.refresh() diff --git a/packages/cursor-vpet/src/webview/animated-artwork.ts b/packages/cursor-vpet/src/webview/animated-artwork.ts new file mode 100644 index 0000000..f60dbba --- /dev/null +++ b/packages/cursor-vpet/src/webview/animated-artwork.ts @@ -0,0 +1,47 @@ +import { mirrorMonsterFrame } from "./monster-artwork-mirror.ts" +import type { MonsterAnimationOutput, MonsterAnimationResult } from "./monster-animation.ts" + +const ARTWORK_ROWS = 8 +const ARTWORK_COLUMNS = 16 + +const positionedOutput = (animation: MonsterAnimationOutput | MonsterAnimationResult): MonsterAnimationOutput => { + if ("result" in animation) return animation + switch (animation.kind) { + case "blank": + return { kind: "blank", result: animation, offset: 0, facing: "left" } + case "frame": + return { kind: "walking", result: animation, offset: 0, facing: "left" } + case "unavailable": + return { kind: "unavailable", result: animation, offset: 0, facing: "left" } + } +} + +export const renderPositionedArtwork = ( + animation: MonsterAnimationOutput | MonsterAnimationResult, + viewportWidth: number, +): string => { + const output = positionedOutput(animation) + switch (output.result.kind) { + case "blank": + return "" + case "frame": { + const mirrored = output.facing === "right" ? mirrorMonsterFrame(output.result.frame) : undefined + if (mirrored?.kind === "invalid") return "" + const content = mirrored?.frame.content ?? output.result.frame.content + const free = Math.max(viewportWidth - ARTWORK_COLUMNS, 0) + const left = Math.max(0, Math.min(free, Math.floor(free / 2) + output.offset)) + return content + .split("\n") + .map((row) => `${" ".repeat(left)}${row}`) + .join("\n") + } + case "unavailable": { + const key = output.result.sprite === "" ? "(empty)" : output.result.sprite + const message = `Artwork unavailable: ${key}` + const padding = Math.max(Math.floor((viewportWidth - message.length) / 2), 0) + return Array.from({ length: ARTWORK_ROWS }, (_, index) => + index === 3 ? `${" ".repeat(padding)}${message}` : "", + ).join("\n") + } + } +} diff --git a/packages/cursor-vpet/src/webview/monster-action-policy.ts b/packages/cursor-vpet/src/webview/monster-action-policy.ts new file mode 100644 index 0000000..019b3d6 --- /dev/null +++ b/packages/cursor-vpet/src/webview/monster-action-policy.ts @@ -0,0 +1,46 @@ +import type { MonsterFrameCatalog, MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + +export type CosmeticActionClip = readonly [MonsterFrameName, MonsterFrameName] +export type SleepClip = readonly [MonsterFrameName, MonsterFrameName] + +const SINGLE_FRAME_ACTIONS = ["angry", "attack", "happy"] as const + +export const resolveCosmeticActions = (sprite: string, catalog: MonsterFrameCatalog): readonly CosmeticActionClip[] => { + const actions: CosmeticActionClip[] = [] + for (const frameName of SINGLE_FRAME_ACTIONS) { + if (catalog.get(sprite, frameName) !== undefined) actions.push([frameName, frameName]) + } + const injuredFirst = catalog.get(sprite, "injured_1") === undefined ? undefined : "injured_1" + const injuredSecond = catalog.get(sprite, "injured_2") === undefined ? undefined : "injured_2" + if (injuredFirst !== undefined && injuredSecond !== undefined) actions.push([injuredFirst, injuredSecond]) + else if (injuredFirst !== undefined) actions.push([injuredFirst, injuredFirst]) + else if (injuredSecond !== undefined) actions.push([injuredSecond, injuredSecond]) + return actions +} + +export const selectCosmeticAction = ( + actions: readonly CosmeticActionClip[], + random: () => number, +): CosmeticActionClip | undefined => { + if (actions.length === 0) return undefined + return actions[Math.floor(normalizedRandom(random) * actions.length)] +} + +export const resolveSleepClip = ( + sprite: string, + fallback: MonsterFrameName, + catalog: MonsterFrameCatalog, +): SleepClip => { + const first = catalog.get(sprite, "sleep_1") === undefined ? undefined : "sleep_1" + const second = catalog.get(sprite, "sleep_2") === undefined ? undefined : "sleep_2" + if (first !== undefined && second !== undefined) return [first, second] + if (first !== undefined) return [first, first] + if (second !== undefined) return [second, second] + return [fallback, fallback] +} + +const normalizedRandom = (random: () => number): number => { + const sample = random() + if (!Number.isFinite(sample) || sample <= 0) return 0 + return sample >= 1 ? 1 - Number.EPSILON : sample +} diff --git a/packages/cursor-vpet/src/webview/monster-animation.ts b/packages/cursor-vpet/src/webview/monster-animation.ts new file mode 100644 index 0000000..2454f9a --- /dev/null +++ b/packages/cursor-vpet/src/webview/monster-animation.ts @@ -0,0 +1,330 @@ +import type { + MonsterFrame, + MonsterFrameCatalog, + MonsterFrameName, +} from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { + resolveCosmeticActions, + resolveSleepClip, + selectCosmeticAction, + type CosmeticActionClip, + type SleepClip, +} from "./monster-action-policy.ts" +import { + initialWalkingPolicy, + resizeActionBoundary, + resizeWalkingPolicy, + restartWalkingPolicy, + resumeWalkingPolicy, + tickWalkingPolicy, + type ActionBoundaryState, + type WalkFrame, + type WalkingFacing, + type WalkingPolicyState, +} from "./monster-walking-policy.ts" + +export type MonsterAnimationIdentity = { + readonly sprite: string + readonly isDigitama: boolean +} + +export type MonsterAnimationEvent = + | { readonly kind: "partner_changed"; readonly partner: MonsterAnimationIdentity | undefined } + | { readonly kind: "tick" } + | { readonly kind: "activity" } + | { readonly kind: "viewport_resized"; readonly width: number } + +export type MonsterAnimationResult = + | { readonly kind: "blank" } + | { readonly kind: "frame"; readonly frame: MonsterFrame } + | { readonly kind: "unavailable"; readonly sprite: string } + +export type MonsterFacing = WalkingFacing + +type PositionedOutput = { + readonly offset: number + readonly facing: MonsterFacing +} + +export type MonsterAnimationOutput = + | ({ readonly kind: "blank"; readonly result: { readonly kind: "blank" } } & PositionedOutput) + | ({ + readonly kind: "unavailable" + readonly result: { readonly kind: "unavailable"; readonly sprite: string } + } & PositionedOutput) + | ({ + readonly kind: "digitama" + readonly result: { readonly kind: "frame"; readonly frame: MonsterFrame } + } & PositionedOutput) + | ({ + readonly kind: "walking" + readonly result: { readonly kind: "frame"; readonly frame: MonsterFrame } + } & PositionedOutput) + | ({ + readonly kind: "action" | "sleeping" + readonly result: { readonly kind: "frame"; readonly frame: MonsterFrame } + } & PositionedOutput) + +type BlankState = { readonly kind: "blank" } +type UnavailableState = { readonly kind: "unavailable"; readonly identity: MonsterAnimationIdentity } +type DigitamaState = { + readonly kind: "digitama" + readonly identity: MonsterAnimationIdentity + readonly frameName: WalkFrame +} +type WalkingState = { + readonly kind: "walking" + readonly identity: MonsterAnimationIdentity + readonly policy: WalkingPolicyState +} +type ActionState = { + readonly kind: "action" + readonly identity: MonsterAnimationIdentity + readonly boundary: ActionBoundaryState + readonly clip: CosmeticActionClip + readonly phase: 0 | 1 +} +type SleepingState = { + readonly kind: "sleeping" + readonly identity: MonsterAnimationIdentity + readonly boundary: ActionBoundaryState + readonly clip: SleepClip + readonly phase: 0 | 1 +} + +type MonsterAnimationState = BlankState | UnavailableState | DigitamaState | WalkingState | ActionState | SleepingState +const ORIGIN = { offset: 0, facing: "left" } as const +const SLEEP_AFTER_MS = 300_000 + +const assertNever = (value: never): never => { + throw new Error(`Unexpected monster animation variant: ${JSON.stringify(value)}`) +} + +const sameIdentity = (left: MonsterAnimationIdentity, right: MonsterAnimationIdentity): boolean => + left.sprite === right.sprite && left.isDigitama === right.isDigitama + +export class MonsterAnimationController { + readonly #catalog: MonsterFrameCatalog + readonly #random: () => number + readonly #nowMs: () => number + #actions: readonly CosmeticActionClip[] = [] + #lastActivityMs: number | undefined + #latestViewportWidth: number | undefined + #state: MonsterAnimationState = { kind: "blank" } + + constructor(catalog: MonsterFrameCatalog, random: () => number = Math.random, nowMs: () => number = performance.now) { + this.#catalog = catalog + this.#random = random + this.#nowMs = nowMs + } + + dispatch(event: MonsterAnimationEvent): MonsterAnimationOutput { + switch (event.kind) { + case "partner_changed": + this.#state = this.#changePartner(event.partner) + break + case "tick": + this.#state = this.#tick() + break + case "activity": + this.#state = this.#activity() + break + case "viewport_resized": + this.#latestViewportWidth = event.width + this.#state = this.#resize(event.width) + break + default: + return assertNever(event) + } + return this.output() + } + + output(): MonsterAnimationOutput { + const state = this.#state + switch (state.kind) { + case "blank": + return { kind: "blank", result: { kind: "blank" }, ...ORIGIN } + case "unavailable": + return { kind: "unavailable", result: { kind: "unavailable", sprite: state.identity.sprite }, ...ORIGIN } + case "digitama": + return { kind: "digitama", result: this.#frameResult(state.identity.sprite, state.frameName), ...ORIGIN } + case "walking": + return { + kind: state.kind, + result: this.#frameResult(state.identity.sprite, state.policy.frameName), + offset: state.policy.offset, + facing: state.policy.facing, + } + case "action": + return { + kind: state.kind, + result: this.#frameResult(state.identity.sprite, state.clip[state.phase]), + offset: state.boundary.offset, + facing: state.boundary.facing, + } + case "sleeping": + return { + kind: state.kind, + result: this.#frameResult(state.identity.sprite, state.clip[state.phase]), + offset: state.boundary.offset, + facing: state.boundary.facing, + } + default: + return assertNever(state) + } + } + + setSprite(sprite: string | undefined): void { + this.dispatch({ + kind: "partner_changed", + partner: sprite === undefined ? undefined : { sprite, isDigitama: false }, + }) + } + + advance(): void { + this.dispatch({ kind: "tick" }) + } + + get(): MonsterAnimationResult { + return this.output().result + } + + #changePartner(partner: MonsterAnimationIdentity | undefined): MonsterAnimationState { + if (partner === undefined) return { kind: "blank" } + const currentIdentity = this.#currentIdentity() + if (currentIdentity !== undefined && sameIdentity(currentIdentity, partner)) return this.#state + + const frameName = this.#firstWalkFrame(partner.sprite) + if (frameName === undefined) return { kind: "unavailable", identity: partner } + if (partner.isDigitama) return { kind: "digitama", identity: partner, frameName } + this.#actions = resolveCosmeticActions(partner.sprite, this.#catalog) + this.#lastActivityMs = this.#nowMs() + const policy = initialWalkingPolicy(frameName) + return { + kind: "walking", + identity: partner, + policy: + this.#latestViewportWidth === undefined + ? policy + : resizeWalkingPolicy(policy, this.#latestViewportWidth, this.#random), + } + } + + #tick(): MonsterAnimationState { + const state = this.#state + switch (state.kind) { + case "blank": + case "unavailable": + return state + case "digitama": + return { ...state, frameName: this.#nextWalkFrame(state.identity.sprite, state.frameName) } + case "walking": + if (this.#inactive()) return this.#sleep(state.identity, state.policy) + return this.#tickWalking(state) + case "action": + if (this.#inactive()) return this.#sleep(state.identity, state.boundary) + return state.phase === 0 + ? { ...state, phase: 1 } + : { kind: "walking", identity: state.identity, policy: resumeWalkingPolicy(state.boundary, this.#random) } + case "sleeping": + return { ...state, phase: state.phase === 0 ? 1 : 0 } + default: + return assertNever(state) + } + } + + #tickWalking(state: WalkingState): MonsterAnimationState { + const tick = tickWalkingPolicy(state.policy, state.identity.sprite, this.#catalog) + switch (tick.kind) { + case "walking": + return { ...state, policy: tick.walking } + case "action": + return this.#startAction(state.identity, tick.action) + default: + return assertNever(tick) + } + } + + #resize(width: number): MonsterAnimationState { + const state = this.#state + switch (state.kind) { + case "walking": + return { ...state, policy: resizeWalkingPolicy(state.policy, width, this.#random) } + case "action": + case "sleeping": + return { ...state, boundary: resizeActionBoundary(state.boundary, width) } + default: + return state + } + } + + #startAction(identity: MonsterAnimationIdentity, boundary: ActionBoundaryState): MonsterAnimationState { + const clip = selectCosmeticAction(this.#actions, this.#random) + return clip === undefined + ? { kind: "walking", identity, policy: resumeWalkingPolicy(boundary, this.#random) } + : { kind: "action", identity, boundary, clip, phase: 0 } + } + + #inactive(): boolean { + const baseline = this.#lastActivityMs + return baseline !== undefined && this.#nowMs() - baseline >= SLEEP_AFTER_MS + } + + #sleep(identity: MonsterAnimationIdentity, boundary: ActionBoundaryState): SleepingState { + return { + kind: "sleeping", + identity, + boundary, + clip: resolveSleepClip(identity.sprite, boundary.frameName, this.#catalog), + phase: 0, + } + } + + #activity(): MonsterAnimationState { + const state = this.#state + if (state.kind !== "walking" && state.kind !== "action" && state.kind !== "sleeping") return state + this.#lastActivityMs = this.#nowMs() + if (state.kind !== "sleeping") return state + const frameName = this.#firstWalkFrame(state.identity.sprite) + if (frameName === undefined) return state + return { + kind: "walking", + identity: state.identity, + policy: restartWalkingPolicy(state.boundary, frameName, this.#random), + } + } + + #currentIdentity(): MonsterAnimationIdentity | undefined { + const state = this.#state + switch (state.kind) { + case "blank": + return undefined + case "unavailable": + case "digitama": + case "walking": + return state.identity + case "action": + case "sleeping": + return state.identity + default: + return assertNever(state) + } + } + + #firstWalkFrame(sprite: string): WalkFrame | undefined { + if (this.#catalog.get(sprite, "walk_1") !== undefined) return "walk_1" + if (this.#catalog.get(sprite, "walk_2") !== undefined) return "walk_2" + return undefined + } + + #nextWalkFrame(sprite: string, current: WalkFrame): WalkFrame { + const alternate = current === "walk_1" ? "walk_2" : "walk_1" + return this.#catalog.get(sprite, alternate) === undefined ? current : alternate + } + + #frameResult(sprite: string, frameName: MonsterFrameName): { readonly kind: "frame"; readonly frame: MonsterFrame } { + const frame = this.#catalog.get(sprite, frameName) + if (frame === undefined) throw new Error(`Animation state references unavailable frame: ${sprite}/${frameName}`) + return { kind: "frame", frame } + } +} diff --git a/packages/cursor-vpet/src/webview/monster-artwork-mirror.ts b/packages/cursor-vpet/src/webview/monster-artwork-mirror.ts new file mode 100644 index 0000000..c67e3bf --- /dev/null +++ b/packages/cursor-vpet/src/webview/monster-artwork-mirror.ts @@ -0,0 +1,77 @@ +import { MonsterFrame } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + +const FRAME_ROWS = 8 +const FRAME_COLUMNS = 16 + +export type MalformedMonsterFrameReason = + | { readonly kind: "row_count"; readonly actual: number } + | { readonly kind: "column_count"; readonly row: number; readonly actual: number } + +export class MalformedMonsterFrameError extends Error { + readonly name = "MalformedMonsterFrameError" + + constructor(readonly reason: MalformedMonsterFrameReason) { + super("Monster frame must contain eight rows of 16 Unicode code points") + } +} + +export type MirrorMonsterFrameResult = + | { readonly kind: "mirrored"; readonly frame: MonsterFrame } + | { readonly kind: "invalid"; readonly error: MalformedMonsterFrameError } + +const mirrorGlyph = (glyph: string): string => { + switch (glyph) { + case "(": + return ")" + case ")": + return "(" + case "[": + return "]" + case "]": + return "[" + case "{": + return "}" + case "}": + return "{" + case "<": + return ">" + case ">": + return "<" + case "╱": + return "╲" + case "╲": + return "╱" + case "╭": + return "╮" + case "╮": + return "╭" + case "╰": + return "╯" + case "╯": + return "╰" + default: + return glyph + } +} + +export const mirrorMonsterFrame = (frame: MonsterFrame): MirrorMonsterFrameResult => { + const rows = frame.content.split("\n") + if (rows.length !== FRAME_ROWS) { + return { kind: "invalid", error: new MalformedMonsterFrameError({ kind: "row_count", actual: rows.length }) } + } + + for (const [row, content] of rows.entries()) { + const cells = Array.from(content) + if (cells.length !== FRAME_COLUMNS) { + return { + kind: "invalid", + error: new MalformedMonsterFrameError({ kind: "column_count", row, actual: cells.length }), + } + } + } + + return Object.freeze({ + kind: "mirrored", + frame: new MonsterFrame(rows.map((row) => Array.from(row).reverse().map(mirrorGlyph).join("")).join("\n")), + }) +} diff --git a/packages/cursor-vpet/src/webview/monster-walking-policy.ts b/packages/cursor-vpet/src/webview/monster-walking-policy.ts new file mode 100644 index 0000000..192401c --- /dev/null +++ b/packages/cursor-vpet/src/webview/monster-walking-policy.ts @@ -0,0 +1,150 @@ +import type { MonsterFrameCatalog, MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + +export type WalkingFacing = "left" | "right" +export type WalkFrame = "walk_1" | "walk_2" + +type MovementBounds = { readonly left: number; readonly right: number } +type WalkingBout = + | { readonly kind: "suspended" } + | { readonly kind: "moving"; readonly remaining: number } + | { readonly kind: "boundary_hold" | "queued_action" } + +export type WalkingPolicyState = { + readonly frameName: WalkFrame + readonly offset: number + readonly facing: WalkingFacing + readonly bounds: MovementBounds | undefined + readonly bout: WalkingBout +} + +export type ActionBoundaryState = { + readonly frameName: MonsterFrameName + readonly offset: number + readonly facing: WalkingFacing + readonly bounds: MovementBounds | undefined +} + +export type WalkingPolicyTick = + | { readonly kind: "walking"; readonly walking: WalkingPolicyState } + | { readonly kind: "action"; readonly action: ActionBoundaryState } + +const assertNever = (value: never): never => { + throw new Error(`Unexpected walking policy variant: ${JSON.stringify(value)}`) +} + +export const initialWalkingPolicy = (frameName: WalkFrame): WalkingPolicyState => ({ + frameName, + offset: 0, + facing: "left", + bounds: undefined, + bout: { kind: "suspended" }, +}) + +export const tickWalkingPolicy = ( + state: WalkingPolicyState, + sprite: string, + catalog: MonsterFrameCatalog, +): WalkingPolicyTick => { + switch (state.bout.kind) { + case "suspended": + return { kind: "walking", walking: { ...state, frameName: nextWalkFrame(state.frameName, sprite, catalog) } } + case "moving": { + const frameName = nextWalkFrame(state.frameName, sprite, catalog) + const walking = { + ...state, + frameName, + offset: state.offset + (state.facing === "left" ? -1 : 1), + } + if (state.bout.remaining > 1) { + return { + kind: "walking", + walking: { ...walking, bout: { kind: "moving", remaining: state.bout.remaining - 1 } }, + } + } + const bout = + frameName === "walk_1" && catalog.get(sprite, "walk_2") !== undefined + ? ({ kind: "boundary_hold" } as const) + : ({ kind: "queued_action" } as const) + return { kind: "walking", walking: { ...walking, bout } } + } + case "boundary_hold": + return { kind: "walking", walking: { ...state, frameName: "walk_2", bout: { kind: "queued_action" } } } + case "queued_action": + return { kind: "action", action: state } + default: + return assertNever(state.bout) + } +} + +export const resizeWalkingPolicy = ( + state: WalkingPolicyState, + width: number, + random: () => number, +): WalkingPolicyState => { + const bounds = movementBounds(width) + if (bounds === undefined) return { ...state, offset: 0, bounds: undefined, bout: { kind: "suspended" } } + const offset = Math.min(bounds.right, Math.max(bounds.left, state.offset)) + const resized = { ...state, offset, bounds } + switch (state.bout.kind) { + case "boundary_hold": + case "queued_action": + return resized + case "moving": + case "suspended": + return planBout({ ...resized, bout: { kind: "suspended" } }, random) + default: + return assertNever(state.bout) + } +} + +export const resizeActionBoundary = (state: ActionBoundaryState, width: number): ActionBoundaryState => { + const bounds = movementBounds(width) + if (bounds === undefined) return { ...state, offset: 0, bounds: undefined } + return { ...state, offset: Math.min(bounds.right, Math.max(bounds.left, state.offset)), bounds } +} + +export const resumeWalkingPolicy = (state: ActionBoundaryState, random: () => number): WalkingPolicyState => { + const bounds = state.bounds + const frameName = state.frameName === "walk_2" ? "walk_2" : "walk_1" + if (bounds === undefined) return { ...state, frameName, bout: { kind: "suspended" } } + const atFacingEdge = state.facing === "left" ? state.offset === bounds.left : state.offset === bounds.right + const facing = atFacingEdge ? (state.facing === "left" ? "right" : "left") : state.facing + return planBout({ ...state, frameName, facing, bounds, bout: { kind: "suspended" } }, random) +} + +export const restartWalkingPolicy = ( + state: ActionBoundaryState, + frameName: WalkFrame, + random: () => number, +): WalkingPolicyState => { + const walking = { ...state, frameName, bout: { kind: "suspended" } } as const + return state.bounds === undefined ? walking : planBout(walking, random) +} + +const nextWalkFrame = (current: WalkFrame, sprite: string, catalog: MonsterFrameCatalog): WalkFrame => { + const alternate = current === "walk_1" ? "walk_2" : "walk_1" + return catalog.get(sprite, alternate) === undefined ? current : alternate +} + +const movementBounds = (width: number): MovementBounds | undefined => { + if (!Number.isFinite(width) || width < 16) return undefined + const free = Math.floor(width) - 16 + return { left: -Math.floor(free / 2), right: Math.ceil(free / 2) } +} + +const planBout = (state: WalkingPolicyState, random: () => number): WalkingPolicyState => { + const bounds = state.bounds + if (bounds === undefined) return { ...state, bout: { kind: "suspended" } } + const available = state.facing === "left" ? state.offset - bounds.left : bounds.right - state.offset + if (available === 0) { + return { ...state, bout: { kind: bounds.left === bounds.right ? "suspended" : "queued_action" } } + } + const remaining = available < 5 ? available : 5 + Math.floor(normalizedRandom(random) * (available - 4)) + return { ...state, bout: { kind: "moving", remaining } } +} + +const normalizedRandom = (random: () => number): number => { + const sample = random() + if (!Number.isFinite(sample) || sample <= 0) return 0 + return sample >= 1 ? 1 - Number.EPSILON : sample +} diff --git a/packages/cursor-vpet/src/webview/sidebar-render.ts b/packages/cursor-vpet/src/webview/sidebar-render.ts index e0fa137..9d98f8b 100644 --- a/packages/cursor-vpet/src/webview/sidebar-render.ts +++ b/packages/cursor-vpet/src/webview/sidebar-render.ts @@ -1,5 +1,4 @@ import type { SidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" -import { resolveStaticMonsterArtwork } from "./static-monster-artwork.ts" const NEXT_CHECK_PREFIX = "Next check: " const NEXT_CHECK_BAR_WIDTH = 20 @@ -28,7 +27,6 @@ export type SidebarWebviewPayload = readonly kind: "partner" readonly name: string readonly stage: string - readonly artwork: string readonly nextCheck: string readonly gauge: string readonly url: string @@ -36,6 +34,11 @@ export type SidebarWebviewPayload = readonly frozen: boolean } +export type AnimationFramePayload = { + readonly type: "animation-frame" + readonly artwork: string +} + export const toSidebarWebviewPayload = (model: SidebarCardModel): SidebarWebviewPayload => { if (model.kind === "no_partner") { return { type: "sidebar-model", kind: "no_partner", messageLine: model.messageLine } @@ -46,7 +49,6 @@ export const toSidebarWebviewPayload = (model: SidebarCardModel): SidebarWebview kind: "partner", name: model.isSetOverride ? `${model.name} (set)` : model.name, stage: model.frozen ? `${model.stage} (frozen)` : model.stage, - artwork: resolveStaticMonsterArtwork(model.sprite), nextCheck: buildNextCheckLine(model), gauge: buildGaugeLine(model), url: model.url, @@ -76,12 +78,16 @@ export const buildSidebarWebviewHtml = (nonce: string): string => ` ` const vscode = acquireVsCodeApi(); const content = document.getElementById("content"); + let currentModel = null; + let currentArtwork = ""; const escapeHtml = (value) => String(value) @@ -112,33 +120,66 @@ export const buildSidebarWebviewHtml = (nonce: string): string => `", ">") .replaceAll('"', """); - const renderModel = (model) => { - if (!model || model.type !== "sidebar-model") return; - if (model.kind === "no_partner") { - content.className = "empty"; - content.textContent = model.messageLine; - return; + const reportArtworkWidth = () => { + const width = content.querySelector(".artwork-wrap")?.clientWidth ?? content.clientWidth; + if (width > 0) { + vscode.postMessage({ type: "artwork-width", width }); } + }; + const renderPartnerCard = () => { + if (!currentModel || currentModel.kind !== "partner") return; content.className = "card"; content.innerHTML = \` -
\${escapeHtml(model.artwork)}
-
\${escapeHtml(model.name)}
-
\${escapeHtml(model.stage)}
-
\${escapeHtml(model.nextCheck)}
-
\${escapeHtml(model.gauge)}
- +
\${escapeHtml(currentArtwork)}
+
\${escapeHtml(currentModel.name)}
+
\${escapeHtml(currentModel.stage)}
+
\${escapeHtml(currentModel.nextCheck)}
+
\${escapeHtml(currentModel.gauge)}
+ \`; const link = content.querySelector(".url"); link?.addEventListener("click", () => { - vscode.postMessage({ type: "open-url", url: model.url }); + vscode.postMessage({ type: "open-url", url: currentModel.url }); }); + reportArtworkWidth(); + }; + + const render = () => { + if (!currentModel || currentModel.type !== "sidebar-model") return; + if (currentModel.kind === "no_partner") { + content.className = "empty"; + content.textContent = currentModel.messageLine; + return; + } + renderPartnerCard(); }; window.addEventListener("message", (event) => { - renderModel(event.data); + const message = event.data; + if (!message || typeof message.type !== "string") return; + if (message.type === "sidebar-model") { + currentModel = message; + render(); + return; + } + if (message.type === "animation-frame" && typeof message.artwork === "string") { + currentArtwork = message.artwork; + if (currentModel?.kind === "partner") { + const artwork = content.querySelector(".artwork"); + if (artwork) { + artwork.textContent = message.artwork; + } else { + renderPartnerCard(); + } + } + } }); + + const resizeObserver = new ResizeObserver(() => reportArtworkWidth()); + resizeObserver.observe(document.body); + window.addEventListener("load", reportArtworkWidth); ` diff --git a/packages/cursor-vpet/src/webview/static-monster-artwork.ts b/packages/cursor-vpet/src/webview/static-monster-artwork.ts deleted file mode 100644 index e140183..0000000 --- a/packages/cursor-vpet/src/webview/static-monster-artwork.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" - -const STATIC_FRAME_NAMES = ["happy", "walk_1", "sleep_1"] as const - -export const resolveStaticMonsterArtwork = (sprite: string): string => { - for (const frameName of STATIC_FRAME_NAMES) { - const frame = MONSTER_FRAME_CATALOG.get(sprite, frameName) - if (frame !== undefined) return frame.content - } - return sprite.length === 0 ? "" : `Artwork unavailable: ${sprite}` -} diff --git a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts index ee3a293..1b3548c 100644 --- a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts +++ b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts @@ -2,24 +2,30 @@ import * as vscode from "vscode" import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/get-sidebar-card-inputs.ts" +import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" -import type { HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" -import { readSidebarSnapshot } from "../adapters/sqlite/sqlite-sidebar-snapshot-reader.ts" -import { buildSidebarWebviewHtml, toSidebarWebviewPayload } from "./sidebar-render.ts" +import { renderPositionedArtwork } from "./animated-artwork.ts" +import { MonsterAnimationController, type MonsterAnimationOutput } from "./monster-animation.ts" +import { buildSidebarWebviewHtml, toSidebarWebviewPayload, type SidebarWebviewPayload } from "./sidebar-render.ts" -export type VpetSidebarProviderOptions = HostPathOptions & { - readonly databasePath?: string -} +const VISUAL_INTERVAL_MS = 500 +const DEFAULT_ARTWORK_WIDTH = 32 export class VpetSidebarProvider implements vscode.WebviewViewProvider { public static readonly viewType = "cursorVpet.sidebar" private view?: vscode.WebviewView + private cachedPayload?: SidebarWebviewPayload + private cachedArtwork = "" + private artworkWidth = DEFAULT_ARTWORK_WIDTH + private visualInterval?: ReturnType + private readonly animation = new MonsterAnimationController(MONSTER_FRAME_CATALOG) constructor( private readonly extensionUri: vscode.Uri, - private readonly options: VpetSidebarProviderOptions = {}, + private readonly snapshotReader: SidebarSnapshotReader, ) {} resolveWebviewView(webviewView: vscode.WebviewView): void { @@ -28,21 +34,97 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { enableScripts: true, localResourceRoots: [this.extensionUri], } + webviewView.webview.html = buildSidebarWebviewHtml(String(Date.now())) - webviewView.webview.onDidReceiveMessage((message: { readonly type?: string; readonly url?: string }) => { + + webviewView.webview.onDidReceiveMessage((message: { readonly type?: string; readonly url?: string; readonly width?: number }) => { if (message.type === "open-url" && typeof message.url === "string" && message.url.length > 0) { void vscode.env.openExternal(vscode.Uri.parse(message.url)) + return + } + if (message.type === "artwork-width" && typeof message.width === "number" && Number.isFinite(message.width)) { + this.artworkWidth = Math.max(16, Math.floor(message.width)) + this.syncAnimationViewport() + void this.postAnimationFrame() + } + }) + + webviewView.onDidChangeVisibility(() => { + if (webviewView.visible) { + this.startVisualInterval() + void this.refresh() + } else { + this.stopVisualInterval() } }) - void this.refresh() + + if (this.cachedPayload !== undefined) { + void this.view.webview.postMessage(this.cachedPayload) + } + if (this.cachedArtwork.length > 0) { + void this.view.webview.postMessage({ type: "animation-frame", artwork: this.cachedArtwork }) + } + + if (webviewView.visible) { + this.startVisualInterval() + void this.refresh() + } } async refresh(): Promise { if (this.view === undefined) return - const snapshot = await readSidebarSnapshot(this.options) + + const snapshot = this.snapshotReader.getSidebarSnapshot() const reader = { getSidebarSnapshot: () => snapshot } const inputs = getSidebarCardInputs(reader, DIGIMON_CATALOG) const model = buildSidebarCardModel(inputs, DEFAULT_VPET_SETTINGS) - await this.view.webview.postMessage(toSidebarWebviewPayload(model)) + const payload = toSidebarWebviewPayload(model) + this.cachedPayload = payload + this.syncAnimationPartner(model) + await this.view.webview.postMessage(payload) + await this.postAnimationFrame() + } + + dispose(): void { + this.stopVisualInterval() + delete this.view + } + + private syncAnimationPartner(model: ReturnType): void { + this.animation.dispatch({ + kind: "partner_changed", + partner: + model.kind === "partner" + ? { sprite: model.sprite, isDigitama: model.stageNumber === 0 } + : undefined, + }) + } + + private syncAnimationViewport(): void { + this.animation.dispatch({ kind: "viewport_resized", width: this.artworkWidth }) + } + + private startVisualInterval(): void { + if (this.visualInterval !== undefined) return + this.visualInterval = setInterval(() => { + if (this.view === undefined || !this.view.visible) return + const nextAnimation = this.animation.dispatch({ kind: "tick" }) + void this.postAnimationFrame(nextAnimation) + }, VISUAL_INTERVAL_MS) + } + + private stopVisualInterval(): void { + if (this.visualInterval === undefined) return + clearInterval(this.visualInterval) + delete this.visualInterval + } + + private async postAnimationFrame(animation?: MonsterAnimationOutput): Promise { + if (this.view === undefined) return + const output = animation ?? this.animation.output() + const artwork = renderPositionedArtwork(output, this.artworkWidth) + if (artwork === this.cachedArtwork) return + this.cachedArtwork = artwork + await this.view.webview.postMessage({ type: "animation-frame", artwork }) } } diff --git a/packages/cursor-vpet/tests/sidebar-render.test.ts b/packages/cursor-vpet/tests/sidebar-render.test.ts index 478cbb6..adf2de1 100644 --- a/packages/cursor-vpet/tests/sidebar-render.test.ts +++ b/packages/cursor-vpet/tests/sidebar-render.test.ts @@ -21,7 +21,7 @@ describe("sidebar render", () => { expect(line).toBe("Next check: [██████████░░░░░░░░░░]") }) - test("maps partner model to static artwork payload", () => { + test("maps partner model to sidebar payload without artwork", () => { const payload = toSidebarWebviewPayload({ kind: "partner", name: "Agumon", @@ -38,8 +38,9 @@ describe("sidebar render", () => { expect(payload.kind).toBe("partner") if (payload.kind !== "partner") return - expect(payload.artwork.length).toBeGreaterThan(0) - expect(payload.artwork).not.toBe("agumon") + expect(payload.name).toBe("Agumon") + expect(payload.stage).toBe("Rookie") + expect("artwork" in payload).toBe(false) expect(buildGaugeLine({ kind: "partner", name: "Agumon", diff --git a/packages/opencode-vpet/package.json b/packages/opencode-vpet/package.json index 5cf9783..f2ae635 100644 --- a/packages/opencode-vpet/package.json +++ b/packages/opencode-vpet/package.json @@ -79,7 +79,8 @@ "files": [ "dist", "README.md", - "LICENSE" + "LICENSE", + "CHANGELOG.md" ], "scripts": { "test": "bun test", diff --git a/packages/opencode-vpet/scripts/postpack.ts b/packages/opencode-vpet/scripts/postpack.ts index 4fef9ff..a298d01 100644 --- a/packages/opencode-vpet/scripts/postpack.ts +++ b/packages/opencode-vpet/scripts/postpack.ts @@ -1,6 +1,7 @@ import { readFile, rm } from "node:fs/promises" import { resolve } from "node:path" +import { removeStagedChangelog } from "../../../scripts/stage-changelog.ts" import { restorePackageJson } from "./strip-workspace-deps.ts" const packageRoot = resolve(import.meta.dir, "..") @@ -11,3 +12,5 @@ if (await Bun.file(backupPath).exists()) { await restorePackageJson(packageRoot, originalSource) await rm(backupPath, { force: true }) } + +await removeStagedChangelog(packageRoot) diff --git a/packages/opencode-vpet/scripts/prepack.ts b/packages/opencode-vpet/scripts/prepack.ts index f611b2b..a57fc2f 100644 --- a/packages/opencode-vpet/scripts/prepack.ts +++ b/packages/opencode-vpet/scripts/prepack.ts @@ -1,6 +1,7 @@ import { rm, writeFile } from "node:fs/promises" import { resolve } from "node:path" +import { removeStagedChangelog, stageChangelog } from "../../../scripts/stage-changelog.ts" import { restorePackageJson, stripWorkspaceDependencies } from "./strip-workspace-deps.ts" type JsonObject = { readonly [key: string]: unknown } @@ -26,6 +27,7 @@ if (!(await Bun.file(backupPath).exists())) { } try { + await stageChangelog(packageRoot) await Bun.$`bun run build` const packageJson: unknown = JSON.parse(await Bun.file(resolve(packageRoot, "package.json")).text()) @@ -58,5 +60,6 @@ try { } catch (error) { await restorePackageJson(packageRoot, originalSource) await rm(backupPath, { force: true }) + await removeStagedChangelog(packageRoot) throw error } diff --git a/scripts/stage-changelog.ts b/scripts/stage-changelog.ts new file mode 100644 index 0000000..4252148 --- /dev/null +++ b/scripts/stage-changelog.ts @@ -0,0 +1,35 @@ +import { copyFile, rm } from "node:fs/promises" +import { resolve } from "node:path" + +const monorepoRoot = resolve(import.meta.dir, "..") + +export const getMonorepoChangelogPath = (): string => resolve(monorepoRoot, "CHANGELOG.md") + +export const getStagedChangelogPath = (packageRoot: string): string => resolve(packageRoot, "CHANGELOG.md") + +export const stageChangelog = async (packageRoot: string): Promise => { + const changelogSource = getMonorepoChangelogPath() + const changelogTarget = getStagedChangelogPath(packageRoot) + const source = Bun.file(changelogSource) + if (!(await source.exists()) || source.size === 0) { + throw new Error(`Monorepo changelog is missing or empty: ${changelogSource}`) + } + await copyFile(changelogSource, changelogTarget) +} + +export const removeStagedChangelog = async (packageRoot: string): Promise => { + await rm(getStagedChangelogPath(packageRoot), { force: true }) +} + +if (import.meta.main) { + const arguments_ = Bun.argv.slice(2) + if (arguments_[0] === "remove") { + const packageRoot = arguments_[1] + if (packageRoot === undefined) throw new Error("Expected remove .") + await removeStagedChangelog(resolve(packageRoot)) + } else { + const packageRoot = arguments_[0] + if (packageRoot === undefined) throw new Error("Expected .") + await stageChangelog(resolve(packageRoot)) + } +} diff --git a/tsconfig.release-metadata.json b/tsconfig.release-metadata.json index 4216dac..392d44a 100644 --- a/tsconfig.release-metadata.json +++ b/tsconfig.release-metadata.json @@ -9,5 +9,5 @@ "rootDir": "scripts", "skipLibCheck": true }, - "include": ["scripts/release-metadata.ts"] + "include": ["scripts/release-metadata.ts", "scripts/stage-changelog.ts"] } From 4798b1f183d2a1920ed372d15e6437756efe70e7 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Thu, 10 Sep 2026 12:36:18 +0900 Subject: [PATCH 03/41] fix(cursor-vpet): fix performance.now binding in sidebar animation Calls nowMs as a function instead of passing unbound performance.now, reorders partner sync after postMessage, and adds a regression test. Co-authored-by: Cursor --- .../cursor-vpet/src/webview/monster-animation.ts | 6 +++++- .../src/webview/vpet-sidebar-provider.ts | 8 ++++++-- .../cursor-vpet/tests/monster-animation.test.ts | 16 ++++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 packages/cursor-vpet/tests/monster-animation.test.ts diff --git a/packages/cursor-vpet/src/webview/monster-animation.ts b/packages/cursor-vpet/src/webview/monster-animation.ts index 2454f9a..2afec5b 100644 --- a/packages/cursor-vpet/src/webview/monster-animation.ts +++ b/packages/cursor-vpet/src/webview/monster-animation.ts @@ -112,7 +112,11 @@ export class MonsterAnimationController { #latestViewportWidth: number | undefined #state: MonsterAnimationState = { kind: "blank" } - constructor(catalog: MonsterFrameCatalog, random: () => number = Math.random, nowMs: () => number = performance.now) { + constructor( + catalog: MonsterFrameCatalog, + random: () => number = Math.random, + nowMs: () => number = () => performance.now(), + ) { this.#catalog = catalog this.#random = random this.#nowMs = nowMs diff --git a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts index 1b3548c..ba0adae 100644 --- a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts +++ b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts @@ -21,7 +21,11 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { private cachedArtwork = "" private artworkWidth = DEFAULT_ARTWORK_WIDTH private visualInterval?: ReturnType - private readonly animation = new MonsterAnimationController(MONSTER_FRAME_CATALOG) + private readonly animation = new MonsterAnimationController( + MONSTER_FRAME_CATALOG, + Math.random, + () => performance.now(), + ) constructor( private readonly extensionUri: vscode.Uri, @@ -80,8 +84,8 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { const model = buildSidebarCardModel(inputs, DEFAULT_VPET_SETTINGS) const payload = toSidebarWebviewPayload(model) this.cachedPayload = payload - this.syncAnimationPartner(model) await this.view.webview.postMessage(payload) + this.syncAnimationPartner(model) await this.postAnimationFrame() } diff --git a/packages/cursor-vpet/tests/monster-animation.test.ts b/packages/cursor-vpet/tests/monster-animation.test.ts new file mode 100644 index 0000000..fca8007 --- /dev/null +++ b/packages/cursor-vpet/tests/monster-animation.test.ts @@ -0,0 +1,16 @@ +import { describe, expect, test } from "bun:test" + +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { MonsterAnimationController } from "../src/webview/monster-animation.ts" + +describe("monster animation", () => { + test("dispatches partner_changed without performance.now binding errors", () => { + const controller = new MonsterAnimationController(MONSTER_FRAME_CATALOG) + const output = controller.dispatch({ + kind: "partner_changed", + partner: { sprite: "agumon", isDigitama: false }, + }) + + expect(output.result.kind).toBe("frame") + }) +}) From 203650e7e0cdccf8c9dbc1d0232011aa33ed9d31 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Thu, 10 Sep 2026 12:56:25 +0900 Subject: [PATCH 04/41] fix(cursor-vpet): fit artwork width to sidebar Converts pixel width to monospace columns based on the webview font so the sprite fits without overflowing. Co-authored-by: Cursor --- .../cursor-vpet/src/webview/sidebar-render.ts | 36 ++++++++++++++++--- .../src/webview/vpet-sidebar-provider.ts | 11 ++++-- .../cursor-vpet/tests/sidebar-render.test.ts | 13 ++++++- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/packages/cursor-vpet/src/webview/sidebar-render.ts b/packages/cursor-vpet/src/webview/sidebar-render.ts index 9d98f8b..31eb1c3 100644 --- a/packages/cursor-vpet/src/webview/sidebar-render.ts +++ b/packages/cursor-vpet/src/webview/sidebar-render.ts @@ -4,6 +4,15 @@ const NEXT_CHECK_PREFIX = "Next check: " const NEXT_CHECK_BAR_WIDTH = 20 const URL_LABEL = "Encyclopedia entry" +export const MIN_ARTWORK_WIDTH = 16 +export const DEFAULT_ARTWORK_WIDTH = 32 + +export const pixelWidthToArtworkColumns = (pixelWidth: number, charWidthPx: number): number => { + if (!Number.isFinite(pixelWidth) || pixelWidth <= 0) return DEFAULT_ARTWORK_WIDTH + if (!Number.isFinite(charWidthPx) || charWidthPx <= 0) return DEFAULT_ARTWORK_WIDTH + return Math.max(MIN_ARTWORK_WIDTH, Math.floor(pixelWidth / charWidthPx)) +} + const formatCount = (value: number): string => value.toLocaleString("en-US") export const buildNextCheckLine = (model: SidebarCardModel): string => { @@ -81,6 +90,7 @@ export const buildSidebarWebviewHtml = (nonce: string): string => ` `", ">") .replaceAll('"', """); + const MIN_ARTWORK_WIDTH = ${MIN_ARTWORK_WIDTH}; + let cachedCharWidth = 0; + + const measureCharWidth = () => { + if (cachedCharWidth > 0) return cachedCharWidth; + const probe = document.createElement("span"); + probe.className = "artwork"; + probe.textContent = "MMMMMMMMMM"; + probe.style.position = "absolute"; + probe.style.visibility = "hidden"; + document.body.appendChild(probe); + cachedCharWidth = probe.getBoundingClientRect().width / 10; + probe.remove(); + return cachedCharWidth; + }; + const reportArtworkWidth = () => { - const width = content.querySelector(".artwork-wrap")?.clientWidth ?? content.clientWidth; - if (width > 0) { - vscode.postMessage({ type: "artwork-width", width }); - } + const pixelWidth = content.querySelector(".artwork-wrap")?.clientWidth ?? content.clientWidth; + if (pixelWidth <= 0) return; + const charWidth = measureCharWidth(); + if (charWidth <= 0) return; + const width = Math.max(MIN_ARTWORK_WIDTH, Math.floor(pixelWidth / charWidth)); + vscode.postMessage({ type: "artwork-width", width }); }; const renderPartnerCard = () => { diff --git a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts index ba0adae..d115442 100644 --- a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts +++ b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts @@ -8,10 +8,15 @@ import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/port import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" import { renderPositionedArtwork } from "./animated-artwork.ts" import { MonsterAnimationController, type MonsterAnimationOutput } from "./monster-animation.ts" -import { buildSidebarWebviewHtml, toSidebarWebviewPayload, type SidebarWebviewPayload } from "./sidebar-render.ts" +import { + buildSidebarWebviewHtml, + DEFAULT_ARTWORK_WIDTH, + MIN_ARTWORK_WIDTH, + toSidebarWebviewPayload, + type SidebarWebviewPayload, +} from "./sidebar-render.ts" const VISUAL_INTERVAL_MS = 500 -const DEFAULT_ARTWORK_WIDTH = 32 export class VpetSidebarProvider implements vscode.WebviewViewProvider { public static readonly viewType = "cursorVpet.sidebar" @@ -47,7 +52,7 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { return } if (message.type === "artwork-width" && typeof message.width === "number" && Number.isFinite(message.width)) { - this.artworkWidth = Math.max(16, Math.floor(message.width)) + this.artworkWidth = Math.max(MIN_ARTWORK_WIDTH, Math.floor(message.width)) this.syncAnimationViewport() void this.postAnimationFrame() } diff --git a/packages/cursor-vpet/tests/sidebar-render.test.ts b/packages/cursor-vpet/tests/sidebar-render.test.ts index adf2de1..e54a4f9 100644 --- a/packages/cursor-vpet/tests/sidebar-render.test.ts +++ b/packages/cursor-vpet/tests/sidebar-render.test.ts @@ -1,8 +1,19 @@ import { describe, expect, test } from "bun:test" -import { buildGaugeLine, buildNextCheckLine, toSidebarWebviewPayload } from "../src/webview/sidebar-render.ts" +import { + buildGaugeLine, + buildNextCheckLine, + pixelWidthToArtworkColumns, + toSidebarWebviewPayload, +} from "../src/webview/sidebar-render.ts" describe("sidebar render", () => { + test("converts pixel width to monospace artwork columns", () => { + expect(pixelWidthToArtworkColumns(250, 7.5)).toBe(33) + expect(pixelWidthToArtworkColumns(120, 7.5)).toBe(16) + expect(pixelWidthToArtworkColumns(10, 7.5)).toBe(16) + }) + test("builds next check bar for partner progress", () => { const line = buildNextCheckLine({ kind: "partner", From c9ce72646cfc11070ea24afe2db61fbc1203cfbc Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Thu, 10 Sep 2026 12:56:26 +0900 Subject: [PATCH 05/41] docs: expand cursor-vpet README and add authorship credits Rewrites the extension documentation with badges, guides, and usage sections, and documents the author and contributor in the root README. Co-authored-by: Cursor --- AUTHORS | 4 + README.md | 10 ++ packages/cursor-vpet/README.md | 297 ++++++++++++++++++++++++++++++--- 3 files changed, 290 insertions(+), 21 deletions(-) create mode 100644 AUTHORS diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..a430851 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,4 @@ +# Authors sorted by whether or not they're me + +Sergio Bugallo Enjamio (https://www.linkedin.com/in/sbugallo/) +Jorge Cendal Prego (https://www.linkedin.com/in/jcendal/) diff --git a/README.md b/README.md index c229011..73b7287 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,8 @@ Settings | Storage | Partner list | + Author | + Contributors | License | Attributions @@ -819,6 +821,14 @@ To persist your partner, history, and control state, VPet uses a SQLite database Check out the [Digimon Data List](packages/vpet-core/src/data/digimon-data.ts) for more information about evolution lines. +## Author + +- [Sergio Bugallo](https://github.com/sbugallo) + +## Contributors + +- [Jorge Cendal](https://github.com/jcendal) + ## License This project is licensed under the Apache License 2.0. See the [LICENSE](LICENSE) file for details. diff --git a/packages/cursor-vpet/README.md b/packages/cursor-vpet/README.md index 58fa6aa..9437237 100644 --- a/packages/cursor-vpet/README.md +++ b/packages/cursor-vpet/README.md @@ -1,42 +1,297 @@ -# Cursor VPet +
+ Cursor VPet logo +

Cursor VPet

+

+ Digimon virtual pet for Cursor that evolves as you use Agent — shares progress with OpenCode VPet +

-Digimon virtual pet for **Cursor** that evolves as you use Agent. Shares progress with -[@sbugallo/opencode-vpet](https://www.npmjs.com/package/@sbugallo/opencode-vpet) via the same `pet.db`. +[![Version](https://img.shields.io/open-vsx/v/sbugallo/cursor-vpet?style=flat-square&label=Version)](https://open-vsx.org/extension/sbugallo/cursor-vpet) +[![Downloads](https://img.shields.io/open-vsx/dt/sbugallo/cursor-vpet?style=flat-square&label=Downloads)](https://open-vsx.org/extension/sbugallo/cursor-vpet) +[![Rating](https://img.shields.io/open-vsx/rating/sbugallo/cursor-vpet?style=flat-square&label=Rating)](https://open-vsx.org/extension/sbugallo/cursor-vpet) +[![License](https://img.shields.io/badge/License-Apache--2.0-blue?style=flat-square)](LICENSE) -## Features +[Features](#-features) • [Installation](#-installation) • [Usage](#-usage) • +[Commands](#-commands) • [Settings](#%EF%B8%8F-settings) • [Storage](#-storage) • +[How It Works](#-how-it-works) • [Authors](#-authors) -- Sidebar webview with static ASCII partner artwork and evolution progress -- Dex and generation history panels -- Token tracking via Cursor hooks (`beforeSubmitPrompt` + `stop`) with API watermark fallback -- Commands: spawn, freeze, unfreeze, set Digimon, install/uninstall hooks +[![Install from Open VSX](https://img.shields.io/badge/Open%20VSX-Install-764ABC?style=for-the-badge&logo=eclipse&logoColor=white)](https://open-vsx.org/extension/sbugallo/cursor-vpet) +   +[![Download VSIX](https://img.shields.io/badge/GitHub-Releases-24292f?style=for-the-badge&logo=github&logoColor=white)](https://github.com/sbugallo/opencode-vpet/releases) -## Installation +--- + +
+ +## 📖 About + +**Cursor Agent** turns every prompt into real work — but what if that effort also fed a partner +that grows with you? **Cursor VPet** adds a Digimon virtual pet to the Explorer sidebar. Your +partner gains experience from Agent token usage and evolves through classic Digimon stages. + +It shares the same `pet.db` database as +[@sbugallo/opencode-vpet](https://www.npmjs.com/package/@sbugallo/opencode-vpet), so progress +carries over between Cursor and OpenCode. + +
+VPet sidebar with partner artwork and evolution progress (OpenCode preview) +
+ +### 🎯 Key Highlights + +- 🐣 **Evolves with Agent usage** — Input, output, and cache tokens from Agent turns count +- 🔄 **Shared with OpenCode** — Same `pet.db`, Dex, and generation history across tools +- 🎮 **650 Digimon** — Evolution lines extracted from the original V-Pets +- 📊 **Sidebar + panels** — Live partner view, Dex browser, and generation history +- 🪝 **Reliable tracking** — Cursor hooks with API watermark fallback +- 🔒 **Privacy-first** — Local SQLite storage, no telemetry +- ⏸️ **Freeze anytime** — Pause progression without losing your partner + +--- + +## ✨ Features + +| Feature | Description | +| --- | --- | +| **Sidebar webview** | Animated ASCII partner artwork with stage gauge and evolution progress | +| **Dex panel** | Browse discovered Digimon from your collection | +| **History panel** | Review current and retired partner generations | +| **Token tracking** | Cursor hooks (`beforeSubmitPrompt` + `stop`) with API watermark fallback | +| **Shared database** | Compatible `pet.db` with the OpenCode VPet plugin | +| **Partner commands** | Spawn, freeze, unfreeze, and set Digimon by catalog ID | +| **Hook management** | Install or uninstall hooks from the Command Palette | + +--- + +## 📦 Installation ### Open VSX (Cursor / VSCodium) -```text +Open Quick Open (`Ctrl+P` / `Cmd+P`) and run: + +``` ext install sbugallo.cursor-vpet ``` -Or install from [Open VSX](https://open-vsx.org/extension/sbugallo/cursor-vpet). +Or search for **Cursor VPet** in the Extensions sidebar, or install from +[Open VSX](https://open-vsx.org/extension/sbugallo/cursor-vpet). ### VSIX (manual) -Download the `.vsix` from [GitHub Releases](https://github.com/sbugallo/opencode-vpet/releases) and run -**Extensions → Install from VSIX**. +Download the `.vsix` from +[GitHub Releases](https://github.com/sbugallo/opencode-vpet/releases) and run +**Extensions → Install from VSIX…**. + +--- + +## 🚀 Usage + +### First run — install hooks + +On first activation, the extension prompts you to register hooks in `~/.cursor/hooks.json`. +Hooks are required for reliable Agent token tracking. + +You can also run **Cursor VPet: Install Hooks** from the Command Palette at any time. + +### Sidebar -## First run +Open the **VPet** view in the Explorer sidebar to see your active partner, evolution gauge, +and animated artwork. + +### Hatch a partner + +1. Open the Command Palette (`Cmd+Shift+P` / `Ctrl+Shift+P`) +2. Run **Cursor VPet: Spawn Partner** + +Your partner starts as an egg and evolves as you complete Agent turns. + +### Other access methods + +- **Command Palette** — all `Cursor VPet:` commands +- **Explorer sidebar** — **VPet** webview panel + +--- + +## 🎮 Commands + +| Command | Description | +| --- | --- | +| **Cursor VPet: Spawn Partner** | Hatches a new egg | +| **Cursor VPet: Freeze** | Pauses partner progression | +| **Cursor VPet: Unfreeze** | Resumes partner progression | +| **Cursor VPet: Set Digimon** | Overrides the partner with a catalog ID (e.g. `3-001`) | +| **Cursor VPet: Open Dex** | Opens the partner Dex panel | +| **Cursor VPet: Open History** | Opens the generation history panel | +| **Cursor VPet: Install Hooks** | Registers hooks in `~/.cursor/hooks.json` | +| **Cursor VPet: Uninstall Hooks** | Removes VPet hooks from `~/.cursor/hooks.json` | + +> **Note:** Using **Set Digimon** does not count toward Dex completion. + +--- + +## 📝 Examples + +### Shared database with OpenCode + +By default, both Cursor VPet and OpenCode VPet use the same `pet.db` location. To share a +custom file, set the same path in both tools: + + +```json +{ + "vpet.databasePath": "/path/to/shared/pet.db" +} +``` + +### Slower API watermark fallback + +If token deltas are not captured immediately after Agent turns, increase the settle delay: + +```json +{ + "vpet.usage.settleDelayMs": 8000 +} +``` -On first activation, the extension offers to install hooks in `~/.cursor/hooks.json`. Hooks are required -for reliable Agent token tracking. +--- -## Settings +## ⚙️ Settings + +Configure via **File → Preferences → Settings** and search for `vpet`. | Setting | Default | Description | | --- | --- | --- | -| `vpet.databasePath` | _(empty)_ | Override path to `pet.db` | -| `vpet.usage.settleDelayMs` | `4000` | Delay before API watermark fallback (ms) | +| `databasePath` | _(empty)_ | Override path to `pet.db` (default: shared opencode-vpet location) | +| `usage.settleDelayMs` | `4000` | Initial delay before API watermark fallback (ms) | + +> Changing `databasePath` requires reloading the Cursor window. + +Stage labels and evolution thresholds use the built-in defaults from `@sbugallo/vpet-core` +(Japanese naming by default). The OpenCode plugin can override these via +[`opencode-vpet.json`](https://github.com/sbugallo/opencode-vpet#settings); Cursor VPet does +not read that file yet. + +--- + +## 🔧 Requirements + +| Requirement | Details | +| --- | --- | +| **Cursor** | Token tracking requires Cursor (`state.vscdb` must be present) | +| **Node.js** | Required to run `hook-bridge.js` from Cursor hooks | +| **Hooks** | `beforeSubmitPrompt` and `stop` entries in `~/.cursor/hooks.json` | + +The extension shows a warning if it cannot detect the Cursor runtime. VS Code alone is not +enough for token tracking, though the sidebar and panels still work with an existing `pet.db`. + +--- + +## 💾 Storage + +Partner state, Dex discoveries, and generation history are stored in a SQLite database named +`pet.db`. By default it uses the same location as OpenCode VPet: + +| Platform | Default path | +| --- | --- | +| **macOS** | `~/Library/Application Support/opencode-vpet/pet.db` | +| **Linux / WSL** | `~/.local/share/opencode-vpet/pet.db` | +| **Windows** | `%APPDATA%\opencode-vpet\pet.db` | + +Override with `vpet.databasePath` to use a custom file. + +--- + +## 🏗️ How It Works + +``` +┌──────────────┐ ┌───────────────┐ ┌────────────────────┐ ┌─────────┐ +│ Cursor hooks │ ──▶ │ hook-bridge.js│ ──▶ │ vpet-hook-events │ ──▶ │ pet.db │ +│ before/stop │ │ (Node) │ │ .jsonl │ │ SQLite │ +└──────────────┘ └───────────────┘ └────────────────────┘ └─────────┘ + │ + ▼ + ┌─────────────────┐ + │ Sidebar webview │ + │ Dex · History │ + └─────────────────┘ +``` + +1. Cursor hooks fire on `beforeSubmitPrompt` and `stop` for each Agent turn +2. `hook-bridge.js` appends structured events to `~/.cursor/vpet-hook-events.jsonl` +3. The extension watches the event log and maps stop payloads to completed usage +4. If stop tokens are missing, it falls back to Cursor's usage API (watermark delta) +5. Usage is applied through `@sbugallo/vpet-core` evolution logic into `pet.db` +6. The sidebar webview refreshes with updated partner state and artwork + +--- + +## 🔒 Privacy + +- ✅ No extension telemetry or analytics +- ✅ Partner data stays in your local `pet.db` +- ✅ Hook events are written only to `~/.cursor/vpet-hook-events.jsonl` +- ⚠️ API watermark fallback reads your Cursor access token from local `state.vscdb` and + queries `cursor.com/api/dashboard/get-filtered-usage-events` to compute token deltas +- ⚠️ When stop hooks include token counts, no network request is needed for that turn + +--- + +## 🐛 Known Issues + +| Issue | Workaround | +| --- | --- | +| Tokens not recorded after Agent turns | Run **Cursor VPet: Install Hooks** and retry | +| Missing token data in stop hook | Increase `vpet.usage.settleDelayMs` (e.g. `8000`) | +| Running in VS Code instead of Cursor | Token tracking is unavailable; use Cursor for Agent usage | +| Database path change not applied | Reload the Cursor window after changing settings | + +--- + +## 🤝 Contributing + +Contributions, issues, and feature requests are welcome in the monorepo! + +1. Fork the [repository](https://github.com/sbugallo/opencode-vpet) +2. Create your feature branch (`git checkout -b feature/amazing-feature`) +3. Commit your changes (`git commit -m 'feat: add amazing feature'`) +4. Push to the branch (`git push origin feature/amazing-feature`) +5. Open a Pull Request + +Package path: [`packages/cursor-vpet`](https://github.com/sbugallo/opencode-vpet/tree/main/packages/cursor-vpet) + +--- + +## 👤 Authors + +| Role | Name | +| --- | --- | +| **Author** | [Sergio Bugallo](https://github.com/sbugallo) | +| **Collaborator** | [Jorge Cendal](https://github.com/jcendal) | + +--- + +## 📜 License + +[Apache-2.0](LICENSE) + +Part of the [opencode-vpet](https://github.com/sbugallo/opencode-vpet) monorepo. Digimon +sprites were derived from community sources — see the +[root README attributions](https://github.com/sbugallo/opencode-vpet#attributions). + +--- + +
+ +**Built with ❤️ for the developer community** -## Repository +[⬆ Back to Top](#cursor-vpet) -Monorepo: [github.com/sbugallo/opencode-vpet](https://github.com/sbugallo/opencode-vpet) +
From b09a5f10f271434b8f71e31eec808597da3171cd Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Thu, 10 Sep 2026 13:02:50 +0900 Subject: [PATCH 06/41] fix(ci): make prepack, typecheck, and packaging tests pass Colocates stage-changelog in each package, aligns the test fixture with the monorepo layout, and fixes typecheck errors that blocked check. Co-authored-by: Cursor --- package.json | 4 +-- packages/cursor-vpet/scripts/build.ts | 2 +- .../cursor-vpet/scripts/stage-changelog.ts | 33 +++++++++++++++++ .../sqlite/sqlite-sidebar-snapshot-reader.ts | 4 +-- .../src/webview/vpet-sidebar-provider.ts | 35 +++++++++---------- .../cursor-vpet/tests/sidebar-render.test.ts | 28 ++++++++------- packages/opencode-vpet/scripts/postpack.ts | 2 +- packages/opencode-vpet/scripts/prepack.ts | 2 +- .../opencode-vpet/scripts/stage-changelog.ts | 33 +++++++++++++++++ .../src/config/global-vpet-settings.ts | 4 +-- .../opencode-vpet/tests/cli-config.test.ts | 2 +- .../opencode-vpet/tests/config-loader.test.ts | 16 ++++----- .../opencode-vpet/tests/digimon-data.test.ts | 2 +- .../opencode-vpet/tests/package-fixture.ts | 7 ++-- .../sqlite-migrations.persistence.ts | 3 +- .../opencode-vpet/tests/port-boundary.test.ts | 2 +- .../tests/tui-composition-fixture.ts | 2 +- .../tests/tui-composition.test.ts | 12 +++---- .../tests/tui-settings-composition.test.ts | 4 +-- packages/opencode-vpet/tsconfig.test.json | 2 +- scripts/stage-changelog.ts | 6 ++-- 21 files changed, 133 insertions(+), 72 deletions(-) create mode 100644 packages/cursor-vpet/scripts/stage-changelog.ts create mode 100644 packages/opencode-vpet/scripts/stage-changelog.ts diff --git a/package.json b/package.json index 37d33e5..caa33c4 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "@sbugallo/opencode-vpet-workspace", + "name": "@sbugallo/opencode-vpet-workspace", "author": "Sergio Bugallo", "license": "Apache-2.0", "packageManager": "bun@1.3.5", @@ -27,7 +27,7 @@ "semver": "7.7.4", "typescript": "5.9.3" }, - "engines": { + "engines": { "node": "24.11.0", "bun": "1.3.5" }, diff --git a/packages/cursor-vpet/scripts/build.ts b/packages/cursor-vpet/scripts/build.ts index b619fdf..126beee 100644 --- a/packages/cursor-vpet/scripts/build.ts +++ b/packages/cursor-vpet/scripts/build.ts @@ -2,7 +2,7 @@ import { copyFile, mkdir, rm } from "node:fs/promises" import { createRequire } from "node:module" import { resolve } from "node:path" -import { stageChangelog } from "../../../scripts/stage-changelog.ts" +import { stageChangelog } from "./stage-changelog.ts" const require = createRequire(import.meta.url) const packageRoot = resolve(import.meta.dir, "..") diff --git a/packages/cursor-vpet/scripts/stage-changelog.ts b/packages/cursor-vpet/scripts/stage-changelog.ts new file mode 100644 index 0000000..a3d37ea --- /dev/null +++ b/packages/cursor-vpet/scripts/stage-changelog.ts @@ -0,0 +1,33 @@ +import { copyFile, rm } from "node:fs/promises" +import { resolve } from "node:path" + +export const getMonorepoChangelogPath = (packageRoot: string): string => resolve(packageRoot, "../../CHANGELOG.md") + +export const getStagedChangelogPath = (packageRoot: string): string => resolve(packageRoot, "CHANGELOG.md") + +export const stageChangelog = async (packageRoot: string): Promise => { + const changelogSource = getMonorepoChangelogPath(packageRoot) + const changelogTarget = getStagedChangelogPath(packageRoot) + const source = Bun.file(changelogSource) + if (!(await source.exists()) || source.size === 0) { + throw new Error(`Monorepo changelog is missing or empty: ${changelogSource}`) + } + await copyFile(changelogSource, changelogTarget) +} + +export const removeStagedChangelog = async (packageRoot: string): Promise => { + await rm(getStagedChangelogPath(packageRoot), { force: true }) +} + +if (import.meta.main) { + const arguments_ = Bun.argv.slice(2) + if (arguments_[0] === "remove") { + const packageRoot = arguments_[1] + if (packageRoot === undefined) throw new Error("Expected remove .") + await removeStagedChangelog(resolve(packageRoot)) + } else { + const packageRoot = arguments_[0] + if (packageRoot === undefined) throw new Error("Expected .") + await stageChangelog(resolve(packageRoot)) + } +} diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts b/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts index 88698d3..2803c8d 100644 --- a/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts +++ b/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts @@ -26,9 +26,7 @@ const isRecoverableSqliteReadError = (error: unknown): boolean => error instanceof Error && (error.message.includes("sqlite") || error.message.includes("database") || error.message.includes("no such table")) -export const readSidebarSnapshotFromExecutor = ( - executor: Pick, -): SidebarSnapshot | null => { +export const readSidebarSnapshotFromExecutor = (executor: Pick): SidebarSnapshot | null => { const trainer = executor.get(TRAINER_STATE_SELECT) const control = executor.get(CONTROL_STATE_SELECT) if (control?.cheat_node_id !== null && control?.cheat_node_id !== undefined) { diff --git a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts index d115442..0868c12 100644 --- a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts +++ b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts @@ -26,10 +26,8 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { private cachedArtwork = "" private artworkWidth = DEFAULT_ARTWORK_WIDTH private visualInterval?: ReturnType - private readonly animation = new MonsterAnimationController( - MONSTER_FRAME_CATALOG, - Math.random, - () => performance.now(), + private readonly animation = new MonsterAnimationController(MONSTER_FRAME_CATALOG, Math.random, () => + performance.now(), ) constructor( @@ -46,17 +44,19 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { webviewView.webview.html = buildSidebarWebviewHtml(String(Date.now())) - webviewView.webview.onDidReceiveMessage((message: { readonly type?: string; readonly url?: string; readonly width?: number }) => { - if (message.type === "open-url" && typeof message.url === "string" && message.url.length > 0) { - void vscode.env.openExternal(vscode.Uri.parse(message.url)) - return - } - if (message.type === "artwork-width" && typeof message.width === "number" && Number.isFinite(message.width)) { - this.artworkWidth = Math.max(MIN_ARTWORK_WIDTH, Math.floor(message.width)) - this.syncAnimationViewport() - void this.postAnimationFrame() - } - }) + webviewView.webview.onDidReceiveMessage( + (message: { readonly type?: string; readonly url?: string; readonly width?: number }) => { + if (message.type === "open-url" && typeof message.url === "string" && message.url.length > 0) { + void vscode.env.openExternal(vscode.Uri.parse(message.url)) + return + } + if (message.type === "artwork-width" && typeof message.width === "number" && Number.isFinite(message.width)) { + this.artworkWidth = Math.max(MIN_ARTWORK_WIDTH, Math.floor(message.width)) + this.syncAnimationViewport() + void this.postAnimationFrame() + } + }, + ) webviewView.onDidChangeVisibility(() => { if (webviewView.visible) { @@ -102,10 +102,7 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { private syncAnimationPartner(model: ReturnType): void { this.animation.dispatch({ kind: "partner_changed", - partner: - model.kind === "partner" - ? { sprite: model.sprite, isDigitama: model.stageNumber === 0 } - : undefined, + partner: model.kind === "partner" ? { sprite: model.sprite, isDigitama: model.stageNumber === 0 } : undefined, }) } diff --git a/packages/cursor-vpet/tests/sidebar-render.test.ts b/packages/cursor-vpet/tests/sidebar-render.test.ts index e54a4f9..c304592 100644 --- a/packages/cursor-vpet/tests/sidebar-render.test.ts +++ b/packages/cursor-vpet/tests/sidebar-render.test.ts @@ -52,18 +52,20 @@ describe("sidebar render", () => { expect(payload.name).toBe("Agumon") expect(payload.stage).toBe("Rookie") expect("artwork" in payload).toBe(false) - expect(buildGaugeLine({ - kind: "partner", - name: "Agumon", - sprite: "agumon", - stage: "Rookie", - stageNumber: 3, - url: "https://example.com/agumon", - gauge: 10, - threshold: 100, - isTerminal: false, - frozen: false, - isSetOverride: false, - })).toBe("10/100") + expect( + buildGaugeLine({ + kind: "partner", + name: "Agumon", + sprite: "agumon", + stage: "Rookie", + stageNumber: 3, + url: "https://example.com/agumon", + gauge: 10, + threshold: 100, + isTerminal: false, + frozen: false, + isSetOverride: false, + }), + ).toBe("10/100") }) }) diff --git a/packages/opencode-vpet/scripts/postpack.ts b/packages/opencode-vpet/scripts/postpack.ts index a298d01..8974463 100644 --- a/packages/opencode-vpet/scripts/postpack.ts +++ b/packages/opencode-vpet/scripts/postpack.ts @@ -1,7 +1,7 @@ import { readFile, rm } from "node:fs/promises" import { resolve } from "node:path" -import { removeStagedChangelog } from "../../../scripts/stage-changelog.ts" +import { removeStagedChangelog } from "./stage-changelog.ts" import { restorePackageJson } from "./strip-workspace-deps.ts" const packageRoot = resolve(import.meta.dir, "..") diff --git a/packages/opencode-vpet/scripts/prepack.ts b/packages/opencode-vpet/scripts/prepack.ts index a57fc2f..edd3523 100644 --- a/packages/opencode-vpet/scripts/prepack.ts +++ b/packages/opencode-vpet/scripts/prepack.ts @@ -1,7 +1,7 @@ import { rm, writeFile } from "node:fs/promises" import { resolve } from "node:path" -import { removeStagedChangelog, stageChangelog } from "../../../scripts/stage-changelog.ts" +import { removeStagedChangelog, stageChangelog } from "./stage-changelog.ts" import { restorePackageJson, stripWorkspaceDependencies } from "./strip-workspace-deps.ts" type JsonObject = { readonly [key: string]: unknown } diff --git a/packages/opencode-vpet/scripts/stage-changelog.ts b/packages/opencode-vpet/scripts/stage-changelog.ts new file mode 100644 index 0000000..a3d37ea --- /dev/null +++ b/packages/opencode-vpet/scripts/stage-changelog.ts @@ -0,0 +1,33 @@ +import { copyFile, rm } from "node:fs/promises" +import { resolve } from "node:path" + +export const getMonorepoChangelogPath = (packageRoot: string): string => resolve(packageRoot, "../../CHANGELOG.md") + +export const getStagedChangelogPath = (packageRoot: string): string => resolve(packageRoot, "CHANGELOG.md") + +export const stageChangelog = async (packageRoot: string): Promise => { + const changelogSource = getMonorepoChangelogPath(packageRoot) + const changelogTarget = getStagedChangelogPath(packageRoot) + const source = Bun.file(changelogSource) + if (!(await source.exists()) || source.size === 0) { + throw new Error(`Monorepo changelog is missing or empty: ${changelogSource}`) + } + await copyFile(changelogSource, changelogTarget) +} + +export const removeStagedChangelog = async (packageRoot: string): Promise => { + await rm(getStagedChangelogPath(packageRoot), { force: true }) +} + +if (import.meta.main) { + const arguments_ = Bun.argv.slice(2) + if (arguments_[0] === "remove") { + const packageRoot = arguments_[1] + if (packageRoot === undefined) throw new Error("Expected remove .") + await removeStagedChangelog(resolve(packageRoot)) + } else { + const packageRoot = arguments_[0] + if (packageRoot === undefined) throw new Error("Expected .") + await stageChangelog(resolve(packageRoot)) + } +} diff --git a/packages/opencode-vpet/src/config/global-vpet-settings.ts b/packages/opencode-vpet/src/config/global-vpet-settings.ts index 77b495a..a16f4b3 100644 --- a/packages/opencode-vpet/src/config/global-vpet-settings.ts +++ b/packages/opencode-vpet/src/config/global-vpet-settings.ts @@ -12,9 +12,7 @@ type PathApi = Readonly<{ }> export type GlobalVpetConfigOptions = Readonly<{ - readonly env?: Readonly<{ - readonly APPDATA?: string - }> + readonly env?: NodeJS.ProcessEnv readonly home?: string readonly pathApi?: PathApi readonly platform?: NodeJS.Platform diff --git a/packages/opencode-vpet/tests/cli-config.test.ts b/packages/opencode-vpet/tests/cli-config.test.ts index 3232207..c4691d5 100644 --- a/packages/opencode-vpet/tests/cli-config.test.ts +++ b/packages/opencode-vpet/tests/cli-config.test.ts @@ -41,7 +41,7 @@ const runCli = (arguments_: readonly string[], root: string, fake: FakeOpenCode, OPENCODE_CONFIG_DIR: join(root, "opencode"), OPENCODE_FAKE_CALLS: fake.callsPath, OPENCODE_FAKE_EXIT: String(exitCode), - PATH: `${fake.binDirectory}:${process.env.PATH ?? ""}`, + PATH: `${fake.binDirectory}:${process.env["PATH"] ?? ""}`, }, stdout: "pipe", stderr: "pipe", diff --git a/packages/opencode-vpet/tests/config-loader.test.ts b/packages/opencode-vpet/tests/config-loader.test.ts index 8a7a252..2389a56 100644 --- a/packages/opencode-vpet/tests/config-loader.test.ts +++ b/packages/opencode-vpet/tests/config-loader.test.ts @@ -74,23 +74,23 @@ describe("global VPet configuration paths", () => { ) test.each([ - ["missing", async (_root: string) => undefined], + ["missing", async (_root: string): Promise => undefined], [ "unreadable directory", - async (root: string) => { + async (root: string): Promise => { await mkdir(resolveConfigPath(root), { recursive: true }) }, ], [ "malformed", - async (root: string) => { + async (root: string): Promise => { await createConfigDirectory(root) await writeFile(resolveConfigPath(root), "{") }, ], [ "scalar root", - async (root: string) => { + async (root: string): Promise => { await createConfigDirectory(root) await writeFile(resolveConfigPath(root), '"jp"') }, @@ -167,23 +167,23 @@ describe("global VPet configuration loading", () => { ) test.each([ - ["missing", async (_root: string) => undefined], + ["missing", async (_root: string): Promise => undefined], [ "unreadable directory", - async (root: string) => { + async (root: string): Promise => { await mkdir(resolveConfigPath(root), { recursive: true }) }, ], [ "malformed", - async (root: string) => { + async (root: string): Promise => { await createConfigDirectory(root) await writeFile(resolveConfigPath(root), "{") }, ], [ "scalar root", - async (root: string) => { + async (root: string): Promise => { await createConfigDirectory(root) await writeFile(resolveConfigPath(root), '"jp"') }, diff --git a/packages/opencode-vpet/tests/digimon-data.test.ts b/packages/opencode-vpet/tests/digimon-data.test.ts index c009e66..dd7237b 100644 --- a/packages/opencode-vpet/tests/digimon-data.test.ts +++ b/packages/opencode-vpet/tests/digimon-data.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import { DIGIMON_DATA } from "@sbugallo/vpet-core/data/digimon-data" +import { DIGIMON_DATA } from "@sbugallo/vpet-core/data/digimon-data.ts" const RAW_RECORD_KEYS = ["id", "name_en", "name_jp", "next_evolutions", "sprite", "stage", "url"] diff --git a/packages/opencode-vpet/tests/package-fixture.ts b/packages/opencode-vpet/tests/package-fixture.ts index 628227e..dd63184 100644 --- a/packages/opencode-vpet/tests/package-fixture.ts +++ b/packages/opencode-vpet/tests/package-fixture.ts @@ -4,6 +4,7 @@ import { basename, join } from "node:path" import { fileURLToPath } from "node:url" const PROJECT_ROOT = fileURLToPath(new URL("../", import.meta.url)) +const MONOREPO_ROOT = fileURLToPath(new URL("../../../", import.meta.url)) const REQUIRED_ARTIFACTS = ["index.js", "index.d.ts", "tui.js", "tui.d.ts", "cli.js"] as const const EXCLUDED_COPY_DIRECTORIES = new Set([".git", ".omo", "node_modules"]) @@ -32,12 +33,14 @@ const runCommand = (command: Command): string => { } const copyPackage = async (root: string): Promise => { - const packageDirectory = join(root, "package") + await cp(join(MONOREPO_ROOT, "CHANGELOG.md"), join(root, "CHANGELOG.md")) + const packagesDirectory = join(root, "packages") + const packageDirectory = join(packagesDirectory, "opencode-vpet") await cp(PROJECT_ROOT, packageDirectory, { recursive: true, filter: (source) => !EXCLUDED_COPY_DIRECTORIES.has(basename(source)), }) - await cp(join(PROJECT_ROOT, "../vpet-core"), join(packageDirectory, "../vpet-core"), { + await cp(join(PROJECT_ROOT, "../vpet-core"), join(packagesDirectory, "vpet-core"), { recursive: true, filter: (source) => !EXCLUDED_COPY_DIRECTORIES.has(basename(source)), }) diff --git a/packages/opencode-vpet/tests/persistence/sqlite-migrations.persistence.ts b/packages/opencode-vpet/tests/persistence/sqlite-migrations.persistence.ts index 63bf471..cf72c86 100644 --- a/packages/opencode-vpet/tests/persistence/sqlite-migrations.persistence.ts +++ b/packages/opencode-vpet/tests/persistence/sqlite-migrations.persistence.ts @@ -6,10 +6,9 @@ import { Database } from "bun:sqlite" import { createExecutor } from "../../src/adapters/sqlite/bun-sqlite-driver.ts" import { runMigrations } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-migrations.ts" +import type { QueryValue } from "@sbugallo/vpet-core/ports/sqlite-executor.ts" import { isBunSqliteAvailable } from "../sqlite-capability.ts" -type QueryValue = string | number | null - type MigrationExecutor = { readonly statements: string[] transactionCount: number diff --git a/packages/opencode-vpet/tests/port-boundary.test.ts b/packages/opencode-vpet/tests/port-boundary.test.ts index ac69b94..74dedb1 100644 --- a/packages/opencode-vpet/tests/port-boundary.test.ts +++ b/packages/opencode-vpet/tests/port-boundary.test.ts @@ -359,7 +359,7 @@ process.exit(Number(process.env.OPENCODE_FAKE_EXIT ?? "0")) OPENCODE_CONFIG_DIR: join(fixture.root, "opencode"), OPENCODE_FAKE_CALLS: callsPath, OPENCODE_FAKE_EXIT: String(exitCode), - PATH: `${fakeBinDirectory}:${process.env.PATH ?? ""}`, + PATH: `${fakeBinDirectory}:${process.env["PATH"] ?? ""}`, }) const runCli = (arguments_: readonly string[], exitCode = 0) => Bun.spawnSync([process.execPath, cliPath, ...arguments_], { diff --git a/packages/opencode-vpet/tests/tui-composition-fixture.ts b/packages/opencode-vpet/tests/tui-composition-fixture.ts index 5cd951f..9b48bd4 100644 --- a/packages/opencode-vpet/tests/tui-composition-fixture.ts +++ b/packages/opencode-vpet/tests/tui-composition-fixture.ts @@ -232,7 +232,7 @@ export class TuiCompositionHarness { for (const layer of this.layers) { if (!this.#activeLayers.has(layer) || layer.commands === undefined) continue for (const cmd of layer.commands) { - if (cmd.name === name || cmd.slashName === name) { + if (cmd["name"] === name || cmd["slashName"] === name) { if (cmd.run) { type RunFn = (context?: typeof ctx) => void const run = cmd.run as RunFn diff --git a/packages/opencode-vpet/tests/tui-composition.test.ts b/packages/opencode-vpet/tests/tui-composition.test.ts index df82b5a..c7a2715 100644 --- a/packages/opencode-vpet/tests/tui-composition.test.ts +++ b/packages/opencode-vpet/tests/tui-composition.test.ts @@ -87,10 +87,10 @@ describe("TUI composition", () => { expect( commands.map((command) => ({ - name: command.name, - slashName: command.slashName, - namespace: command.namespace, - category: command.category, + name: command["name"], + slashName: command["slashName"], + namespace: command["namespace"], + category: command["category"], })), ).toEqual([ { name: "vpet.dex", slashName: "vpet-dex", namespace: "palette", category: "VPet" }, @@ -140,8 +140,8 @@ describe("TUI composition", () => { expect(harness.layers).toHaveLength(1) const layer = harness.layers[0] - expect(layer?.name).toBe("opencode-vpet.layer") - expect(layer?.namespace).toBe("opencode-vpet") + expect(layer?.["name"]).toBe("opencode-vpet.layer") + expect(layer?.["namespace"]).toBe("opencode-vpet") expect(layer?.commands).toEqual([]) let testCommandRun = 0 diff --git a/packages/opencode-vpet/tests/tui-settings-composition.test.ts b/packages/opencode-vpet/tests/tui-settings-composition.test.ts index 10ebf29..b15f9d2 100644 --- a/packages/opencode-vpet/tests/tui-settings-composition.test.ts +++ b/packages/opencode-vpet/tests/tui-settings-composition.test.ts @@ -194,10 +194,10 @@ describe("TUI settings composition", () => { }) test.each([ - ["missing", async (_configPath: string) => undefined], + ["missing", async (_configPath: string): Promise => undefined], [ "invalid", - async (configPath: string) => + async (configPath: string): Promise => writeFile(configPath, JSON.stringify({ language: "fr", stageThresholds: { adult: 0 } })), ], ] as const)( diff --git a/packages/opencode-vpet/tsconfig.test.json b/packages/opencode-vpet/tsconfig.test.json index 2f01a52..aadf5af 100644 --- a/packages/opencode-vpet/tsconfig.test.json +++ b/packages/opencode-vpet/tsconfig.test.json @@ -7,5 +7,5 @@ "jsxImportSource": "@opentui/solid" }, "include": ["src", "tests"], - "exclude": ["node_modules", "dist"] + "exclude": ["node_modules", "dist", "tests/release-metadata.test.ts"] } diff --git a/scripts/stage-changelog.ts b/scripts/stage-changelog.ts index 4252148..a3d37ea 100644 --- a/scripts/stage-changelog.ts +++ b/scripts/stage-changelog.ts @@ -1,14 +1,12 @@ import { copyFile, rm } from "node:fs/promises" import { resolve } from "node:path" -const monorepoRoot = resolve(import.meta.dir, "..") - -export const getMonorepoChangelogPath = (): string => resolve(monorepoRoot, "CHANGELOG.md") +export const getMonorepoChangelogPath = (packageRoot: string): string => resolve(packageRoot, "../../CHANGELOG.md") export const getStagedChangelogPath = (packageRoot: string): string => resolve(packageRoot, "CHANGELOG.md") export const stageChangelog = async (packageRoot: string): Promise => { - const changelogSource = getMonorepoChangelogPath() + const changelogSource = getMonorepoChangelogPath(packageRoot) const changelogTarget = getStagedChangelogPath(packageRoot) const source = Bun.file(changelogSource) if (!(await source.exists()) || source.size === 0) { From 2b97032519656294ef3407ce8df5e1ae6006ee44 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 15:07:51 +0900 Subject: [PATCH 07/41] fix(cursor-vpet): read fresh sidebar snapshots and raise stage thresholds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reuse the shared SQL.js runtime so the snapshot reader reloads the database on each read instead of serving stale gauge values. Scale default evolution thresholds 10× and document Open VSX publishing setup. Co-authored-by: Cursor --- README.md | 16 +-- docs/monorepo.md | 2 +- docs/openvsx-setup.md | 120 ++++++++++++++++++ docs/openvsx-setup.pdf | Bin 0 -> 273773 bytes .../sqlite/sqlite-sidebar-snapshot-reader.ts | 55 ++++---- .../sqljs-vpet-repository.persistence.test.ts | 37 +++++- packages/opencode-vpet/README.md | 16 +-- .../tests/catalog-evolution.test.ts | 10 +- .../tests/config-settings.test.ts | 24 ++-- .../opencode-vpet/tests/record-usage.test.ts | 2 +- .../tests/sidebar-view-model.test.ts | 4 +- .../tests/tui-settings-composition.test.ts | 6 +- packages/vpet-core/src/config/defaults.ts | 16 +-- packages/vpet-core/src/domain/evolution.ts | 16 +-- 14 files changed, 238 insertions(+), 86 deletions(-) create mode 100644 docs/openvsx-setup.md create mode 100644 docs/openvsx-setup.pdf diff --git a/README.md b/README.md index 73b7287..bf4862f 100644 --- a/README.md +++ b/README.md @@ -140,14 +140,14 @@ Default values are: "notifications": true, "language": "jp", "stageThresholds": { - "egg": 500000, - "babyI": 1000000, - "babyII": 2000000, - "child": 4000000, - "adult": 7500000, - "perfect": 12500000, - "ultimate": 20000000, - "superUltimate": 30000000 + "egg": 5000000, + "babyI": 10000000, + "babyII": 20000000, + "child": 40000000, + "adult": 75000000, + "perfect": 125000000, + "ultimate": 200000000, + "superUltimate": 300000000 } } ``` diff --git a/docs/monorepo.md b/docs/monorepo.md index d50620c..94ceab1 100644 --- a/docs/monorepo.md +++ b/docs/monorepo.md @@ -56,5 +56,5 @@ bun run package On release, if configured in GitHub Actions secrets: -- `OVSX_PAT` — publishes to [Open VSX](https://open-vsx.org/extension/sbugallo/cursor-vpet) +- `OVSX_PAT` — publishes to [Open VSX](https://open-vsx.org/extension/sbugallo/cursor-vpet) (ver [openvsx-setup.md](./openvsx-setup.md)) - `VSCE_PAT` — publishes to VS Code Marketplace (optional) diff --git a/docs/openvsx-setup.md b/docs/openvsx-setup.md new file mode 100644 index 0000000..6fb6160 --- /dev/null +++ b/docs/openvsx-setup.md @@ -0,0 +1,120 @@ +# Guía: cuenta en Open VSX y secret `OVSX_PAT` + +Esta guía es para el **propietario del repositorio** (`sbugallo`), que debe tener permisos de administrador en GitHub para añadir secrets. + +El workflow de CD publica automáticamente la extensión **Cursor VPet** en Open VSX cuando existe el secret `OVSX_PAT`. Sin ese secret, el release sigue funcionando (GitHub Release, npm, etc.), pero **no** se publica en Open VSX. + +## Resumen de lo que necesitas + +| Elemento | Valor en este repo | +|---|---| +| Publisher / namespace | `sbugallo` (definido en `packages/cursor-vpet/package.json`) | +| Secret en GitHub | `OVSX_PAT` | +| URL final de la extensión | https://open-vsx.org/extension/sbugallo/cursor-vpet | + +## Paso 1: Crear cuenta en Eclipse Foundation + +Open VSX exige una cuenta de Eclipse Foundation (no basta con GitHub). + +1. Ve a https://accounts.eclipse.org/user/register +2. Completa el registro. +3. **Importante:** en el perfil de Eclipse, indica tu **GitHub username** (`sbugallo`) y usa **el mismo GitHub** con el que iniciarás sesión en Open VSX. + +## Paso 2: Iniciar sesión en Open VSX con GitHub + +1. Abre https://open-vsx.org +2. Inicia sesión con tu cuenta de **GitHub** (`sbugallo`). + +## Paso 3: Vincular la cuenta de Eclipse + +1. Ve a tu perfil: https://open-vsx.org/user-settings/profile +2. Haz clic en **“Log in with Eclipse”** (o similar). +3. Autoriza la vinculación entre Eclipse y Open VSX. + +Si no ves la opción o falla el enlace, revisa que el GitHub username en Eclipse coincida exactamente con el de Open VSX. + +## Paso 4: Firmar el Publisher Agreement + +Sin esto **no podrás publicar** (verás errores del tipo *“You must log in with an Eclipse Foundation account and sign a Publisher Agreement”*). + +1. En https://open-vsx.org/user-settings/profile +2. Haz clic en **“Show Publisher Agreement”** +3. Lee y acepta el acuerdo (**Agree**) + +> No confundir con el Eclipse Contributor Agreement (ECA): para publicar extensiones solo hace falta el **Publisher Agreement**. + +## Paso 5: Generar el Personal Access Token (PAT) + +1. Ve a https://open-vsx.org/user-settings/tokens +2. Clic en **“Generate New Token”** +3. Pon una descripción clara, por ejemplo: `opencode-vpet-github-actions` +4. Genera el token y **cópialo de inmediato** — solo se muestra una vez. + +Guárdalo en un gestor de contraseñas hasta el paso siguiente. + +## Paso 6: Añadir el secret en GitHub + +1. Abre el repositorio: https://github.com/sbugallo/opencode-vpet +2. **Settings** → **Secrets and variables** → **Actions** +3. **New repository secret** +4. Configura: + - **Name:** `OVSX_PAT` + - **Secret:** el token del paso 5 +5. Guarda. + +El workflow de CD (`.github/workflows/cd.yml`) usa este secret para: + +- Crear el namespace `sbugallo` (si no existe) +- Publicar el `.vsix` en Open VSX + +No hace falta crear el namespace manualmente: el CD lo crea en el primer release. + +## Paso 7: Verificar que todo encaja + +Checklist antes del primer release: + +- [ ] Cuenta Eclipse creada con GitHub username `sbugallo` +- [ ] Sesión en Open VSX con GitHub (`sbugallo`) +- [ ] Cuenta Eclipse vinculada en el perfil de Open VSX +- [ ] Publisher Agreement firmado +- [ ] Token generado en Open VSX +- [ ] Secret `OVSX_PAT` añadido en GitHub Actions +- [ ] Publisher en `package.json` es `sbugallo` (ya lo es en este repo) + +## Paso 8: Probar con un release + +1. En GitHub: **Actions** → workflow **CD** → **Run workflow** +2. Elige el tipo de bump (`patch`, `minor` o `major`) +3. Ejecuta desde `main` + +Si `OVSX_PAT` está configurado, en el job verás los pasos **“Create Open VSX namespace”** y **“Publish release (Open VSX)”**. + +Tras un release correcto, la extensión debería aparecer en: + +**https://open-vsx.org/extension/sbugallo/cursor-vpet** + +## Publicación manual (opcional) + +Si quieres probar antes del CD: + +```bash +cd packages/cursor-vpet +bun run build +bun run package +export OVSX_PAT="tu-token-aqui" +npx ovsx create-namespace sbugallo -p "$OVSX_PAT" +npx ovsx publish *.vsix -p "$OVSX_PAT" +``` + +## Problemas habituales + +| Error | Qué revisar | +|---|---| +| *Must log in with Eclipse Foundation account* | Cuenta Eclipse vinculada y Publisher Agreement firmado | +| *Namespace not found* / permisos | El namespace debe ser `sbugallo`; el token debe ser del mismo usuario | +| El paso de Open VSX no aparece en Actions | Falta el secret `OVSX_PAT` o está vacío | +| Token inválido | Genera uno nuevo y actualiza el secret en GitHub | + +## Nota sobre VS Code Marketplace + +El secret `VSCE_PAT` es **opcional** y solo afecta a la publicación en el Marketplace de Microsoft. Para Open VSX solo necesitas `OVSX_PAT`. diff --git a/docs/openvsx-setup.pdf b/docs/openvsx-setup.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a3ce2462d8577ba63fb82dc220cc0cf1974458a0 GIT binary patch literal 273773 zcmb@t1ym%>mhaoRL({lJ(=<*|xYM}1ySqc-);Qg`yL;pA?(XjH?tb~cbLO3M*Sxvw z&D^&tA~PduXVm`3j;zd8`&VSLg2J>wIwp9s>Epvqcpx!7v5metJQo*0(F|m1L`-32 zNNZqY?PO#RGP0)yva+$$1DV+w7}?n9=}bXZmXz=S0ed4okc~Ytg_Mn(nWd#3fSHb- zSd&6Z&%n$YWaD7UNi1d!GO{H8=pdF+AXX&?((3@3byzhiiTP}8Esa!+^d-zd0A@y3 zI!2a{6D33yr6g&HEzK;9h((MHENnguMUC_fEsY!;1WfI1tc(CaW(GR?zh1-&dd7P8 zX8%0-!x>q78$(9}qYrNsEX?!(AL@v$KCJ)4O*0#7K|RoiEI|$idIlDHb|5`H6Eg#l zo|>MX{G)u>N!b|wpG|mp;Ek*e|C%Mnf6bPG9x)Iez%NA%khZb6(zEg`J&^n2DK{?xW4h@Q?O~As_KyA^XSh2A~g_ALA1Pl;p+W|Jo2!n1VpI4jcf0 zjjfS2t&@WbosGQ-z{mw;WbN=_3~mE2fha#T02Dy>js_rE zJ$oZ-5HaxIR5AQZ`#(SSzpDz!NdF;%k(r&2tw9cS zMh2E0Di2hzdQb?UjH@mv<^lf zkeRiK1Hjha#@Ni#=s!zg`Zp=e|B@nXX892>Vt}ya$8{=bWME@x1P_ojvNi#k60@?f zvheT_JAgjEajf87Qct-p$_W~+*2l{e$HAyVzTSdkg3Zl4$!Ahd%>CeDm97%fBVUku zdPg`C8^upcayVZ(?&nbLad2e%A|(H{cb>uz_-Zp5qWvcHix zEMzl3f|i)(rVlsIz0bPn<`~CQ$U3elxmDG9vdB2ZZI9Ol_bOTy_)d23EV&Yqutxnuy=qWlr_)!ATIRTLI?x~2rcg2k3^6hO%wfDG z@~7D$cJFV9d>B6{9UNAlE9wdmKJ->rX=nJ!4@AF!mM!tPA8<G%I!qt!| z3mumb)pmKF=d-T45p#`VW6O_a5DN>{rpv1&XJXTd78$GBEGqEI3%$bjF?K9vP!s%RfCc`IG zSeB>G(CX2S#fCjgTRAYZps-GaD_{O^SH=M-#RCTusK3;tt~`ETkyK=Tio==TZq4g5 zls*V0AX|{#ntaZ8x|34uuN{K4$+^cHx*@TIBx?TsYRnmUI~j;AywHP9nyBh1(6$xN z-goPKq)?DrkL|d-_0W{f?mN8^uAh1BZ$(;g%;#4&9v0JBuBZF$m<}6_E~!FbeP$+* zvC}Uc^m#Ynf<7!}Qp?*y;^^i) z2*E5Ro##qHK4&T;S8J*|6yFbz)_lMJQS>>x0e+z&YL+Xqctdy&w*NL7Syj9aJ!yGo1or-3NiD*W?RH?eC592hH779YZCeP$R7n}_DLNyyeKMURJ!HnG2Z2GN z_jTuRIQw&Q*YaFMBw+{U3x;Br7~nDVkFO$=*z#P~myQCKz;Anxc%>8H3L)syl1-9>pB zgtRV-kvZ9so3EakXrY|g)&O%Tt!n3%LPb(%#mK;8RKb^MJDdK1X>3z4WfcxedsXP& z^+i+@ncj6byL(p{pO-j8@UJ|T>~nX*o2z7Nwjo8qcQ%`*7+wD6--k#pOCyrC*1?K$ zE>~YSYDzy$Y38sfi4hs)h$9Npj!@A}zTtr!Kt!0gR+#g(vn!Sun>jWn=l)r>i0$Nn z8aeOJSVk43S0Qd;rs+S51pNc2#x$jFu{INV-R00CVet}q?uM@5*H+Vg*6{MS>dEPI z72K#XS|Aj~9_LdELyrp?H7QCWJ~=y-(X*u^%u@N%=ea;X0q5E0N+8LVT)g*7YrTQ2 z485xHV&SA0x2xiqV5lKVPFn_zrz>ewt9Arx+-;yIL=ejMnt)8jduby3ogO{jpVCUl zlz{of<$_BEnNzQ^q(OGpsNm7!Z;@cYM2k!~Mm@~ipnDn4?xN#>O}*>^qIC1mO|TLRAE8I~ zR^|LgMJ#FciolG1PM&pZ(I<%*N~E|5I2UJZ8c^JbLZh_)&pQbt`qopf__Liz-qfkm`iom{Ut zutW9%wcE><*aok+dWI)(+n=MYb(XSQhem^HTky6_VH?dcFRinJ3m4A9q^R_!nJWm| z=7dSKhozCkVXV?L4i_v0Tsy~?Qd=z&$}-DNr_v<4dR*4|9hR`=lCV*63vE)2*V6#8 z9G2{-bs4+Rd)wh(H}nD?$K8MnLl=dr%;tA*jAxrcS?;&UTaYkmO-++y40tS0^#jE$ z(EUnL`5a;hEnfs&qUGdZZbG!U9d%-fWM7Szb3VgA+A5ib@|+ z8^W|uPhK|n(Cv&dgTFU^^*Bo5AERKdqVA&kp{PIB5SC%-mhopC?yI4U($Ns9-Hd}j z*BiKD@%S%1G#ax{DW44Y#r;pHHGXQ|vh(=|kS08=qhRGsa}A4liHE~UdgEzlL$t^1=G{of6UbL2`8^qJ z`B=^sCgtr}B4bumQG+UJr@qL7mRr}d#-$WEh%TcVNZD=udpNX*O3JQ`uT!osh|;T} z0o0OoQc+DzZ&_sn=++j~`;8T;Q`E!ItChHfnPZ?2mXV&Ag171}(n;be*eRuN-RVLg z-kI&mo|dxP1-0#r|BH4iin1=Ir+L9OO;A6=Nq%nBBbs%z189RAsRF%#+X-ou@Hw2% zS)*U+S7Y;4_Xt=}IXUkH2s!md*BH5B)s)k~x_Np^y9za6<4z;Van_~|Q&CHeK?+NM zpRs2fdeeQTiE(SqN$@C!u1Y6t!wId^GXm!J`bgAd!(jc4o@Bo5>^1LVxn}_+jDL*t zbkla}tiQ-KFNXicz^aVcbD2(ct0iqhX5hMY_iyM+h3EseTxs&@4iSJ3&D z@Y*HwnHB6j^k?F)UHdKHgT8}&XUovZv!7y}BU12;Ni5Cx&WlTvOzCh!?`qq7>^Y%h zArfjKt=;?GNJw9tvzL7S&}khgCK_7Jt|DDCgOC7idD|V%SbMrQ$YdG)Q zjtT28bHonoZw7)J!xAyO`4pb)y@1#iiwD_|+e=?V?fbHjEOv0FpMQ!gt7#f(`6&A{ zWHs3`{el1i9o>L>@dbeDR7AkuK zHv;mlvM2>-;;2!o+jhav@cmUWI@<EI4@yGO z8DSsD9YEgGnXjGadzd7~60mDIqXg{x)|C|omf2EJIJ&3IN{~zGPh$R~9^PYve(|Sz zP}I8(v01PygN6eJ^sYR-R<9Cg&@z=TzXbtDJ&BGEWRl{(Ue6wG!08!Q$z&aEHVz&x zQmObaHEXnL(n3Emixom=&R~q{5<8DRn$f(nw7VZE4H(m&`=n&g6Kpt5ej;cWCxKw4 z;5LI=Nk(-)J6n9SJt5KA)}+TToka-lB$EP36s}%ty!$GtE{T$HatQc zEAH(JVOy!VI4qM#h5W?lXQIqJ-3RvK9y8x$-)%!LzSrF~{aNe2$k<^kog@u($i}D5 zxKj8d*0pbT2hgK*;0x(g^$1EV)=NxWsyhEHu^PHV(*0KtwdJS$^g-9yB^q`ox+ps9 z?=)nb(WH@}JJGzI{4JYrY1cRM8sZR|hYVDcON?(Hg;`17V$wvl|Nc}Ywv{&O~?<06=X6m(((yubQZ^j)rHs zGVd))rh=%sgtmLqo;m!}B%Z}Nc!!yt$Ib^1Idh4D1Ff->r^CZW)67l5ql*VBte0ZQ z3N!uq`GF0Zh(R$qjDFoW8pFIjX;gze21agT4ZlA%aC-@05N{NBLu@dW0&}`c!OCGBqs)1lCwWen(QQ_A4L&%uJDr5virb;TIG{43Egk5GF zJ3Od4%zdug_(f_9>Y)rWeWOBpo?nqeSW_%2fq#0o5bKxz{M8vJP!lefgpY~tHPEO@ z)iD2HeoPan&6)Dt!*2)=n=*h-Z6?oGqBelyllI*V5;H~c=m0ZYVj>TYov-mb0-9FL zh-8g4gTlp+V{(_gF!BcR5t@f`pM}MmQo)OA)#{CxK!Qqv><}l2u($?p6>Uu3Y45N!wRS<)j#qn8x$683YNM+g^N4W zSwF_t5__FS;h438+Obr0a2P+0thqQ4Lfx0Jiq_{WJxtW12E;3`)UyWGG((e2afH

zUPL*I5IdTywi8)L(1FOF z)q=rB@G(NYK^2xvHE?*MeDq;+3BvGtN@m|ASQ1Qs-v<1mDFrBQwFO)Th`ThPqA7%v z>fq=U3Z_bIBg74W4kYrwbnz@`Q}j1ESb7VP>?XRHxo6>XwO6&uhF1|;0#@d%0I}fp zQs(u3r$RTy9$y13>Js#}`rN>~`m*)O!jg8Q@um@GYDOpJ7V4t}oz`vBXgm#Aj%Huo z<8cqqnOkLzKRqZL%-Y=y_E>zymWXQ)TY%rqF`jnWF2q3#W(CHt7Hi+nryz~a z({+ov=Bmx+9)sD#{K@Uf7A(sKuE*_71|6_q;LLFw_lir0Q8~nfov~``7VAqJmsfKs zBHvBkFf?(GDh-eG+#ss^wE5h+Gej&j3nP1q+{Ryiy{h=7tzm*>$=aWcyM7YCHjJBS zH^2jN?pIG_QQ>{-YWnP$d7vj&iz>rfe1`~|q|}&lIk9>3C^g}RlyryAWOcukMdjgy zwj~Xp7DR|=*PkCj_nRV{aV%F`V{7n<>JTC;A6*5=Xi!*$e6Y~dyp<1O=a{n5#wkGg z$`p)RHA!PHnaIVv<>XPU58tVNNOO#;v5MA6r-%xI)l)#UhUKb>uUSJ%Y5$w%N*t0mcBReUC7EqujbPa(2m@T z%6|6X2qYka^QSF9y118ZLDq0}pq{!*58h&?TEW;zGzI=dC|+$_+^7z|7Kj?GrnnGT zw&;q8Y;$phSu>$NK6*dlT6+)wO}q3`&RDc{iQy_;qQy8^t3|C`5NqaTX@7!~aLxD| zJ54?D>}C8lRSPD%%(AJ{be~6lJQ#PaHHDYm!Fn5fsbfd!NqU3B%e~Z!m*@SN;}m%& znoGU&lCr+@6~ckHrlepb0`5-?t%GpOT<*@xrsdxF^=#Rz)UBeM=Plv*CJ)aS=XhxD zrMvf28KUO&Dg~dw_Vt7?^|}4woIyoo_>N$X?jVHem5HQ_x*!sNp=qF zSCikHptqimV?ln?ZnFCfr?z?_TBrr!YDQVxG|iEMe7e;b37I)w;Tw3(ALCP9?Czp6 zW^F0*+Pe;jYxe9k(ZiUJi*G*BQA%i6+x3WnU|p;VqFz~1%h~myJx3_!yyM3+y{b%h zRZ8@#i83idCVkeP-G7;+-6B>o<9oH#Ff91)3X250jwrGqn%7KSYYiFx4%YnGaMWpI zQ`fai=+`isen~bfCYM$$fRb@~Qnxq}NO%4(sh(( zqrj%s7AcETXdP3uZ)~_;NO5F)K|R=gPu3^Us$r;Ji6yOCHIvj*-s;Vx@7TdxQlRGD z=k|^_6Ekjk;!WxHK0Twf(dco%K)-9L_6%OGVqR!q>F)rDq~8wVCQ2%w&8YW1cI73q zDpm^hRl~Psf4+$YFZ!i$B;G_AH^T*=?~yfUMpNXv63=TqY{hJvrcrt~kmQ@cBWABL zR{e4FmJtJ!h~=u^O*Hqy(`YmL18zfdTk;q$3w}WvYE!@34U8bFJBh2Zmic1)))XoyF6_NdWY`OC0*kBO@4Xj7>kI3{_+!@nKFx}K_1SCFeGIQ&%QN4IJCC}Tu-JaT zH`vZ2Z|y^ChyBr|5teG*+mD&%>r0CeH&!)VyM}TEW#^pP?e4Xd04Ma0??B>5SF#<>oLrskDq!7?Pq9z03?TdUgzpMv{yXt*tB5(;!g16M zeven4X&R|7!>Z zd;F$9I)o2lhoEXai_i9v))dl=MF@CE(?<`}Tv&336U3;#v^}}hotupomtJe?>Bu0E z+S@*a65o&L367m)ph5)`l1@&FFTt8UZ(&XLyW@F7&G%pdN4OGL@7)JA{gt5R&bhtNv@Y zK^{G9xhe-S43N%lZ2=V!2H@ecmTFUH%4&GxO0Xa0%~LN;Ot-IH)RdyRg;hKXyCngS zo6_vo?9BhFEzIBR)w?r}J^_-G!tl~$A zakneZs?%aL9At#1t9`L>mj=%7-43uZV)2 zrCXxgpWmgYsn%dHnGf$!RJysGuMSEKIcDin)fy&po>J2q{>G?>K;3)OgSeWQd4Jq8 z)qkuRXEMg@!};!rjhAwl2l9#!IZIuyoOTxN*I$>wS!ao@A1F&{|)?2HPn-&b%Q9c5sf#F;lQFL_Opj;^0@Uq*vIj#@IvK_PlacUJCu0ov>!L zZIjE4TPIL?++y>_jn$wY?9#~Sgy($ru~8BacQP{fB?&U84!MCza*SWc8a20I~wZ%Q@DX4q88gof$ z(1D)SXTCx3PPY=S>-1liS8f)pYYQw^x_UJ|D&aoD`U$tNP=s0##7z1$0rB&B?YKzR zV8@mhC`gE@%Aj)7_SU%#9B~;BU%Q;&$Clc7ZqzOx#f5L<%bNf6MvVP@IHZMe^bQNlq(!@sz z+cZux(qPIS0o_IsW09{)McXpSwC$T^Y?ln~^fnt#N$<+F`rG?Pd06vg^v3vY@23&V zUu<{OVt#YmAQ!wYTr03_z*SyWbF>0F+;zNKeVH1lWK9`~zQRel9m){#Xra?S@;Z6X?dy0owLB5f@xGF3l~0@by8Y_b>mtG! zUuOWDkOc?%1d^IQ%S#ef6Y5MAGGo8p-wnU$9sD>rrQiPP{|>_*;N$QYf$`5Y@IP4$ zrhiM~3-J8~WBdcjkQ5-M|41N<|GicDt6xg;FVaGRkN5*^_{c5)zcCw3|CU?-7>17F zzcBl^y!BsZEdPZW%fHgwAFk0c(tnKim;K)d|1$?!|25?Q6j@+k_zO~CVQ2mi{(_#J zj+L31m7ev#4Pg9l)WZMA{QpNL|35eyCbs{3HGjh-%*@PmOn)O7j6k-(#4xk4{-fjn zAD97TWAOpZ{AZSd_20Cx|KDq2XZ;)Z0W$rE7A_R`FjzK5YNe!u%J8^iLe@|HNegndlimc$$9$GdwlQ@!9S7++Tltu+T5Iz`!9w zN6yH*``m&XAY3%>+Tk7Nm`S?7ykqe(48Sr}GZagwP0ODzGUrR!F}VIhhG=m5N%O)o+wjeFl~ooeXvAEc_4Rz2D4|Oxxc)9yiIGUtZP|h~6e?ykE9a-fuR& zUmFT{WxUJk-d>N#A7{_M zKVIF>)sR1UJl?k*&hwXQ)ao)u$#FMWnES0#QtcQcR2ktVX-}Mjc&Y#mid_uF(_axTHUjq)}WTuIk@ci#tgot)5^WjpHci|j)XT$B7g83*F z^SxhM>TjUhZp>;;IRPF#I|1itrMOEo{afbfE~|5K`RwZRVOLMat}-W;w7B9&n;DA62=X)?pFMGjvCgBiTv6V(A>-WUt#H% zqC(V*l(toxFRQLd%BZM_d{Y9qmSw+u%d<>gFu-$1bV)%!%!#Nqvq*!0P?)wZIK1() z`PVnxY=d&vFP543Ba3avM-?9spLevpP?_qF9fn))$>-e_SXHV zV>y8*)L#q%lGR&WWTD2C=`a$-UPY-}Wc<-`Qj9+?_2O4<3=`eD4Z}3Sd)@ z>>jrjZKIte5~fC^HYEy6#=O*`K3URt18k5>9iA7XgMUk861oK@9yn^a5mhSB$UP}h zrnL~rO^D$4NbFDQ-PtDR7*UmPtEK8#}(D zO4{%Z855gsyz(rJN3yt?%x5bPaRyBOT8;{s47cn+s;eFeXR<^3r9?c(S*Pz-^(AGg zq9e$ZQ-?RI&2&QR@wNXcoAU*cqwnnH)8)=|L8U{fib3nGXX~42akS}jgVwq2t6!Q3ZtCUgRrup(eq+a}k0_Ljw^8;cDyB;h0a5sd)XUbD2!td3A$&yiDu# zfoWz1%8&F@k5^Wy03)hA+p~tcx7@t+xQx*(40NaK@;smH@Cnm_sJ4>wd(rLuFHwpB zvvVoZ_13l24dz>lgx$Ke3nPINRwwnSmE_crzNBN1UN~Z%)x5CZ?56H~K^z-TfZZSiW!a=4SNh}-hWzRy3i;R1TCeBc z?nh|{$7!FoT-CH{=9*I9y-Ua!La*5)(}Jzo4C4`<9E|$*o_tVcelx+dra@dzYlX+; zHBY;Y_Kznhso5mVnh{JwY{Db*qTcJdSoKbfvVlsw;Q1J?`VUpXi-Qoc1`GxZIXHLH zAVhgn1L~j$y48ATL|kXFPH}U(D`ie^$rO1iou@3nGOm{N%0{5LYZdB=6kh0Ac9$1r zGJPS2rT)Qy*2G8`dA@E_F@70lKksoT1#CHNj#xuFG@7PGIhdX*?3f%Vc*|Z?2*J~h zp7^c{vA#Dl1zUUtYcYz};Eg|jx}#R`RAy@|vdLpvBIwSrRNY}fd4_%OSRxXtezXQ7 z1HiSF&M*-T(%^_D-HfLKXe!%WTmMFh;e6Mt%J)d*XMzl0ab=x%BP*+4EVl8>wItDp?_qnA6BxoR#4 zPyO+AAdopn;Mxwk8)I@`1<~PP6r_#PA9Sl77U_XPI8Qkv-52`8+si!hQ`8=2&GuW( zwRO$3^&JDRi>m=nMzbNMV=!L%EgbW5Ef!8w&Ui(s@xo$*vxU`arzI-=+JW~({VWv@ z+as`BT57BWz3Br0VTY|j$A=zFYj+*H7RMtUU|>uzkb8^NHpF3{CtmCEN8ex!o0reo z^|zr`^?R**mRyvR8id0I8@Jxy{s~3iKXF$!W~dOK@Ko9EO$@?2(1I=G^?5M3I<1Nw z&G=ILX^N|x1j)l|JZU-(j*sO!ZYeNDwEUWqFZx%vXuI0I0SylP+;&e%G`d{!C#k#< zDQlOo85cd$5@`2p?eNXo41xzY$!xU#c%MRhMhIO@8&(y(5Wd)6pc0x`lLvnG(^U?Gpjynfb!Nm>HGy=fT2DPD~K@cS|D6CVh0$^_$!>Qf2Q@uT*6E#dZ5rHQ)5) z^v^HT`y&Kr@Ls14E7FkEz;p!DwJ1ta&XOnGdC2r}=Oa6=-BZ_3Q*4oGT6b})$3PEv zL`(c0rPYc&F6`Z!4DOX7f|N~%%V;~w)&Q-0&w;vFojcjdQ`D)orMF?FJ?mx;?cE4o zV&`*ZLcF260>9B1Vx1KnN2Ox9grjNnD*EPFTRby#Ta~E;-lqEs7muFR=>}+OP9JrG z;wNORwq}QeIMQE@UL8|o<+Il_J5SKZt(|Vpoo*^K6NIUur1^rog_cuYguE9gAm;6{ zo#G_7Z|~_>v*wr~YF5G0y>*2=q&i3}#^=fq(6R00y?bt7=E91kxQZzX4HcHh-lbz! z{NZttK5wJvdigpIlpd5u>@zvY_bF6yk@=d~?kXm$uNs@y3U@Fjv1ev%>6;|@=<42O zItUQDE@4oeQYr5L)=j(R$%l)HVTknobNQ1E_9uFm6z+0f$z7g@v6i`rte(l|Sou>l zbw|zPS?YbTd>aab1eRiGh$1o*Lho`5c*$asHf|X{4%WZuD^~7}_<x6yC4AWX`X(D31kvFw) z(4`lo5>~0mvCo?^;aUN`KboTNttG`Pmv`+pePlp|)vyF<&_AES$hdy4ntLW$M-Jc1;=-1O$yjm*RoE9^##EF`Z%Pn1<@!`qw z+20ngyapfk``MYg$DYqwUf`WMjGf_8Rxn^}UmOWBZWVH0e~Qr{o!6jv(|xMoEzXg^4Nui>o6DG^k-@T{ALk*H zM5u9dBw4IbEmkhA85XSlo>4OV5Rm)CUtO@qJ5!Wmg34o7OLFALfu+=x3&~&!zTtARAkcU|13ykyA_yS{{w3 z-w68GkNpWDtRF;nS4MIDpSMB08yDS1syXB@tx9?a(|FBPH1j?EL4x~MW962NeELk2 zYV2k>P9=8SRaZBW(Zi|q+LG(L8JJY>!Af-P#(JBQj(HFg;Dsphl^f5l z{#iWgeWN{xS1(`TG4f75=Fn8Uc(fXvYD5|dYgrn{D&HEt>arMwtR1#E#`nfgb1r`` z%WYHDvwsJ(&X7`Hi54pv-D}r;yGETQC>`f^+Qvq$`Yq9@1uVwX7AWUq@Mc}*@^=@t9c%`#6&7yW*#BBxgUbuF-(Y^jY2&MjR zbM3sfl2voxhOn$z&9}LGHEpA;>$E5$q3B|(#9@t7S3s<|Ov5LE?HFGXf5aq><99gZ z4O55h_S^yLrDQ}%gL~Sya6fphaufod;|W)e?fu_VVi}=$anj`YE>)8EPm@7eoY@UJ zoX%oQIT<$`ci)cDt(8A>3CApzX$4}e$}?64eHTM7AS~@q%&$I}iHnc$O?UcgI|g%) zNV=3Xm_}0$&6w@PU1BSs*Z)H5b3XnUknQbfCIp~?^>*A?n+er|vJFop?7Ku(5*fW1^4pA5iA^+-qe-{@k z;G9HFv%l#zSoaen0nwdGTLKNg2Y2O0!!?1{i`Ukp4jakQQ~F+jGbJa_%eHFdcEqss zG|E69r?eY3%!neX&5H;OUTj}bp?dv8lO6eMP@PuLJMmKs!}%AcO4 z3$J=&p9uKEeOK+N2z4f|Mxhc={0P4~j;}~mIU9&PGl_G@fX%t9__85Fw;2t!Iw9_t zPwQGH-m#DGp3`PcIOoZxP8KpUTF13NSgzo<-0H0*WHg|dAbfV*_v6(p1zy^3PMrx} zz=Y{j$9VwatN;-A@y+mO>&9(UXPaR6bSrz0-hz9lttP*ozseAv%z9h9v~W^fnJcOq z_~?rrw?AJzSbw|vl_qdxhSX#a&emCtSM}Ju_k#%Y;%Jw-(zD+nGE1_Ufmx)lK$wQT{$_+U)8k+g>!s;LsBSP3r+@F%rJ{OOcCwa&%r& z#kI8Zy(1-;O1{usofb2SllrwjN`Y;c-3O-#nmJA_N@h<2no@AHv3fiaTc1w1mbEJ zEY%HqCgJ0B!s%xlgVjq(ujldE{K>>?;q5I1m{V8xP`O$;u4>60yR@0KXUsFF&d^mZ zPNF;v^M_4xlZ1?ScY&sw1QDeCIq2ow{teC;rS;+DV%^#{!u4VGAa)mY=C6i#8 z0H~tREl$G;E6@$P^lr;R6;!3N_n-;DvuoNxcj?HPH?i{LhabQ|BHHf2ejxFSUrbm zC*ESBMwlaCL8V2=8deL+kI?C|Pl-Ad`~K_hD3cNR6~(=Nl%igXvn~jI;%iGv?go;$ zWO~3Me0Yndm67~VD>-nFFy6>T)RC`v!zUfNP?L_vLFL@{c9_;Q_Tou697u=*?KwqK zAg5i{SLpSMa&ux=zNnAkTSkI+czr;lQ&@nA1`%}Lvr1u&o$Ob2V^%G1$Gw>jh*G7-N1dA;TN)`wZw1kJR zG}JJ=h)wbn92()bAKl`!AKaSyOtIeYuF4b}9}mDXaD069=XDs8B*R{o4|Nj|?Xmnu z%E?@3NcRiuE2={(eg^y(Ad&d68Q!ve0Y^yWLG)!ZBib)AlF(~{q6Vekn!=)~xn{pB z6Qn&SeF_k~(b1(RJG$_oXgY&h^j`g}4@Er+bS0$YfW>g|QX>`xP#5Q4As0t*=+@m3a}rYrVRiMpdu$)BT8;bQqzmTOg^nYLWh zaKwmd%V>781wD&B92NoRgJ&Lt#d`RC(fAcb9RAvtj#3grRz49$>|4NMD?UMUf~3*? z7ylFOrRe2T0{~$7#E4vtZ7oi?k~&OpC9bcc_G53Mg4=yp#?&?U&-!u9Uo`s7IS;i0 zE3W4|$yPp53&BUL&M8mSsCf#zUyIWH=c$dVfu#ynld%Rli*((nzJq=WLnl~WfWeD? zGk2dx9W#2gE}qzT)@n)vjac1Z|kd?l+8W795#NtE)-MyLZ z=zh$e(^lPGUTE41IQw;D>r-hOB^q_)ip+^5O2=pwqtsEe9YJt&%QxL8I)aXGd;|}! zpX$jU-9>30mA{&`oz8RwCHOxQ1kj!5g($sQ>xFE3yl70+KFCpXznNMBQ-i&8kS~_ecmrS_wr9xff4SSosu?cwGL6X2niTj=WcsHauXdf zU0vPJPEO9v{dlHoQ-vQJI~7C2d@G8k-D1R3nI>Epy2l5RG2!E~@?q;e*S^(&MI?46 zYgftRkM7T8g{rH0b+&z_medG!zAJVldL-k|gV*9RQnwJ=g z94V6|8;qn27b%lV=WGJ22e%kx2ww_LL$c>k2IzsV@DDbqxm|>>@DCMwm^#Sjiz8~3 z7k_+Ign!j#4A6c4)yir(e8}_jWJdYh55x)OkssGd3%>yaYRm9Ks$(P?KSH|TG>$Rj zZ~;Fw3*bed;K1mtTrfTM}?6xJ^C_1MDc#pU+j1R4veqd;-zSC8h13Yt)Bhefm zn8;yf@y7GdKY8QmEQ+MsSH|TZayg%*7kiF9O{Mlw{>k=_;au$T~%gG zYfD+|H6L+DF`qj}G0(yBDL>Pygg@?M-LElX!jhVueA$~}qYjPu#g}LvlSFS3ZLI-D z=wAWpjj1Q+U*RwBUr0jZR7YjLxLw!Ds9*a8Lf>2_%g!=UD<4qBP-Nh4h+MaoOORx=xQ4 zVT93$bNpa;S0Wf5uRR8c)<0Lwf*=<&INb(tk21>-YC57HmzQBwKTBftD#EY8ZPy^M zn8)bK1`}NJTxL%#fFbWFOu%J#aO#f#-c#J+(B7X?f zm);sF2rj4)$=f9a#k6>b+`+t$oD%sfxbmromkVhO4~UF&_BxJr@Oq!KSaL~Ppp7!1J^c?!O` z43Lw%i82lB$eC}Fu4}JyqU?scn^wXB9u+P3iR?xe`%L03^^+9!7l(pr5o;b>a{CHy zyLgop$sTT6Y=9iK>*#?7LZtAlmX%#Jq;O24ldqw>3N7ex{agz)_omh9&S9o946|mm z473KGi~*K@hRMs{yJJ(OQWgcaQ5aLYL;y4;wkxysgV-siiL)%I(Vo1p(VrZVqv<(H z>P|lEZ}QVZw74g)a(*ml*k;&1YsbY_hnGn(@Anskr>Fb1pTqTsOK*$qyKQ&Kd&8tx zwCp#p$JBn!GTxs3GG`J>BFimbG^OQMFq~3%UVr*MXfvF|6+?DjT7ZQz*m3%U;*j{Y6d0e`7dlE+4 zyEKuyY*)4IRnw5nUEu^DKf&^6=~c!^;&F4{RJc}M%WcDQiZYK?GGc85In$ZV5|N4) zzbd#6Nf^y-MJ8O8w4RhhafC$8ejt#3TsEZp>Ru@O&5GGoy_a;mbFGHes~oF&4ElBr z5_Rx1$U)67F!`Tv=u`-r9qTN%H=9Ja_tck725wVaI!}MP^wH)!BrIbNl2{HPh$gFy zfo#7zlILdOs%XS){mIc|wON&C(l5{KayS>liy&B^wYy9bAu@eaUy1Y?n!IqeiN82d zs5k3%2=JL*eMB3s<3O_$*;63d!o(*KT63`!JbAx9&hr1c z?`eCfu`6O1f|K>x&Z?7mZHv|+AhEt_;gjKb@>M{IgJ$;l_O($7_M7s@ay>8{9w&bh zBbk28+Ih-P#uX3$TH%^8s8HcVqgR83B`>wo)moSb+stc zzYvxYw&iW%TSSyPK$a-OB(}?%3Hx%`l@6)II@`)8`zX8VIxZ@ZpnKYgj2cVX3}V5^ z-CgBMVVXK>%cz7=E_rN3H=1B&D@^yEy%ho16U%(wh=cf7>zMjM|n_ zJS#(bmCI+Xl_CX|INAJ(j^>$*+KWxiZ}b$`8hqSI;s)^myAKhKg!^2_5vxLq)a~O) z7jJXIxlCFscuE&1<9dFXtmDkXXYn9Y0Nza1pnEAl{`cACDCxzED)E1Yf?nT^;~ zwk~uU44>i$$>g_^PJycVHLv4ZXpxIVPV(DGZA;iP!$i9Lwtup$5Dt#ij#`2|O=$@QhrMvo#ugce!p{Dz2AMOaz2AA29-*$3t)?_n53rCB935oa; zZeiK8w~jUY^R89qExsO{li6UAg$ws$RFoM$#l#VIx~_iaE$;_^*<OJ@eYr;V3T${SMYwfeh#!c?(E!E zn?LhF7|gQKNIVB2RG$+^{AM4>Ap+0M8Aq*M;SK*5+OoUGldBh5b`v3@v*p_8jc=Co zQLDZ2i~idCdE<*=XVJWFixRwSCkeh?9t1@myv?6QScQT5Y0pcWU6w1F$QwRx0ilmv z&CZPux$aq<`%Uf1*A4D<%^xXHCXH`YE8COHgWTavsWm5b{kzbIgb_SJ7fnKv#Qjg^ z>`K*}gd#@=gd$6S)sw%EBi0mMkt@e{Q6z~*b_n-dZ7~>Q+*=}2s7n`ZBb>Eu8Hv;F z{3`LzE~#KP3D2*gD9kS{p+?M}E z+B*l?5`5i)ZJW1k+jjSD+qP}nwr$(Cb=$UWYx?)SdGo%AH!%@2^T#^1GovD_PMpe< zwKDeFE3Ml2jZzFwMM|W)C~VW&jjkk+gy2N-m}(w~IF$J!dhUtCw6T)O*cNpW+*t|@ z@3AbdOkt)LGB|Dusw}SNAO5?Vj!aoxj~ova8WD*cfptEIlAlq1XP#wbOPNFiJH1rJ zlv1Eb48u1dY6Gu%%He8I{OwV}++9cvrDRiSq>77jS>2UL5q^d-k0ow6Zt`+OJU)ko zF+sh6<&jFT#iVJdaG-}JC{f&{oIT9}22wZlNb$(#yoDXWsaLfDL^B}&)|0dW0UtEG z`>b%}5U*z$wtiC;g)I7A1AICcw6kG8LbZGe?D(4Cqp>;4;0qvz((xkcIm0+g_C^*3 z?yakL?;ZSC&DzckNA%HA16h*fFfiPRYB@8c!4iimuC>EV^69^&Nz{SC4CTZ#X;L2T zHk-LhEpSV8E%gt*HjRb0_V)#l_Izd)yGX(khC!++mI1*?Y$^BlHOBC$4eoIl4VsDj z67bUW3PNu|CGD=hUFL-iDcYQj+FL{+TL3JoDR z^NLFzhBV|VmZcE`ZEGzlfisI3=VrilZLZjZvP$WKEfx)?>p00>(zrEG;<)CO;F7Ng ziXUVPj&{Mxbv5XT=D+b~W;r}jWjA(PL7DeTeB3PmDBysJ`Deo{)>$YMK$&8L_(;5DOkBB>Sz(nVu=jyqn!l)m$ zhk%bpZDV>i1qxs*5HU)xH(Yros=FSv#ERYP`7mtO+5X@gUdLWa^BhO08KmO0feDAf zl0jE*yGfCxd&$DQy5HS;?bp0Ve@6-Z3{I`Qb-?U=sZ`*6`pDDa*}pVq>LMbkUj1Bx zN;{VG@qqDbtw$w`tO=ReI4y6`bYdyOHUAS*4P8C5O@!L3U4AL;fY_`?*lFIm55%fw z(5IbmK9*@$w4ZA(nGrB8yX*-Zm+}B%MNM$(oT$MB7pJk{_@EBQH``(ay4by9aDnLc z=3wv4)Wy9wi-{NW<5Dv;hqVkdZ-K$QobQ-JS<;-}?!a37<(LCBFJZ%!S?TDXkcXuj zr;=D4?k+|tzLY%vw3OkcU7Y{mSh%RQ=3Dj&g(Ax4EuiSa z0E-xkW5LgxD^V8zVKtLK{OWiNqA9q?fh;7ARdyL7SOE#9MVo(2NIxE&(I|I_8Npe6 zkDT0b0mw7{6pVS8vDA6YDQ0-sA>p{Ev1K~_l)E}O9kepnn*P9z;vzPq1Nd>8YDYSr^|Dxj07y*|(X10N!f!LG=(QPc)@J;$c|Bf{FIf*F49hi<3$AaLy7#f1`VV z{eaAf%M@#n7_t_ZLBp8rBYxYci}ab)64}II%@&aPm9T5lOWa2Di#0k(n`g;@jeE)e z>aO75+D)DE)q~pmJ>eqwBJKBF>rE}otrXpcyMPV<-)2hFAH1**(%_-_Fuh5835Vk?tpS9@xT3;O@7@Mhamjh zYxsRm`)Ph#;mre<|AO(mz=-JpKNIzWL-DElc3A+@y1@|QIW#}%^K^4AvI$-gSUWzsVET`J?ik0y9%mz+b{g^vp<5=5a@uh77r4np_J(4f< z&IF;YX$t-OZRNmhf_MB(#$bz?0y9zWqSbZwYMroAXwX|* z#X;InGGOSrNEL|0#Eb)I#)vna%rS&BJ4k^c{I(kn85e>=E15Bi*{U9G|Be#FDz~kg z$qeAEl+tOr4pHnK5~VYeo1;U?q-rN$FWJAj1zXPGa0`H$G0HnMYF#vpWC4-0K`ucu8ak-B6_Pbw<#Tc48dq z3UPOzR^lT4i}W*t-E{Gu18k|gz2+(Pu8Pp+{*1T*m8%RI83L8uuJcG>l)mm_^o zO5mL_oo_@^h~iOn!4{-^#5i_)sN^44~^0lJ$ceZPKCUY&L=b_hW>RRy- zb+bhLwfn*>tFxlS>9Qp<&7o2sKADzuB5|Be%pk5ghkR7)iJHX?=?t!G1#E0r3YoJY ziW#3yl-5rdifNzDqy{!&H-3eQUhrORiB}Z_pUxn9!G8lE3G*ojv?SQ|XgOR(@h7xL zn68_^i{BI6BGstJiUwZ{H;Pyo4+_l~^uB1BR1aP(HT3Z6dpYFons3}mn^#B-jk{Ly z6;4~lUgcg0HJu=DDkf{%aK+7m7jTnX`Vqlt{Az$w35u|9CGq{vsRI@aRzmc2Q#G9^ zEn2Q>p>9rF`nW}OKgl)!;gU%DE?f0FZ5hF9&MPC+sI9YcmF#x`nLu|@Skfo7Y;*}i zt8wUY%%UsV$||+TY|mRHjeDI!ju>@MMPybyPLkkZxHZRCbS50KhFd^Fh^Q#U@rb;VHLt z1IzJk@pplT6bEGbM~aH_Ec=j1u%O4T-vn#=1UNJ1#2#e90Zq|Sc*L>)JW8VfaUy}6 zb;p4;ZR;3QifPkp8wcuZNDrD!?39d71=$CzDH>|9b&hD62O@shmCOw5=yuQiER!M3kam$gVv5ixCM)>-7Xr&;oO7LN3xvP<}({>J|)>N z)}go5MXwljaj*avR57U(FIdS;0Ic4plrT%vDr*>%ILRb~~2QmaFX095M*=HU&O%7#T)){VVu}1edqzy1iazZ37{EH5l@QZnq-;`bt z2Sj{psVjl?to6V}hGuYcAq)6~%+T(G@OHPN*G@l{=4_gP2QK^E7p{7BQtZ@B|q}6ZrX&-(fPT;7A`$;Lz_0 zth?gi&3jOA_oe0-dWW}w#Riu_Q=K>M;PIWE;Pu*%sAX}AJ@Y>EFN8c(&EYPB%hj;p z6^B`EN}8-fq`I-_(lD5F7y>CaaTq--u!T)zQ-3E4*^8gbIomVr>l#~}w8(&~_y%H+ zL}#tTpL2hf zc>7GUHJQp`*lqvTqa$l~cTJt`l+=yXRL?Kq)xR(Bc_pyl{#9N=?fq57LhS-Y(??*9 z*DJ&WU>+8U`3ius#~0=k7K46D)sj{OqndNrp;fp=)9O5H8Q|aoCCcCeZ(GkFj17<>>lVn!%)IAs_YMe*{HYI z0*7!kv@<$2*azpQMSH^B7|Y{#^&_IbV#b~L6teYHsZ9}9-57iwaa&&BOU8(@7wH_V@~CuA^#ttfvrHW4vG>xejE1KyGc z75*nM&s41EkVbKo@mBBYauecktAt9K)iVt^U4x zG!jr}27|6O*mJ|&jx>`Dyhye!t6{N28fi{a=20V1Plo!)#5O3b0{2mV`1XSQS-A)Z zCuAT&|L1JD8r<`cCOSEnRXhxtZ||px_%jL<`)7)#X)<7gF+BR0yt``9*!ZjMq@@1O z*aLZu_tFESA-AFvRpGPXhL z_hEImJQof_O1K27#10WGyAMjwMZ5PyE8)BQ@Kr3*gsT4c3BW!iVReLHnF66XB0#Ea) zzMIzSe_EcG$8+i@cBbL&u9P@r9q{i?WO;FtrCuUiv2xD2t^bhkA?H}eQOcNN} zXdPH9>frx~fvfwiliK;uL7Kou{g$)N2KG9hRlzQrRsH~sy&KBuV_^iMY{2|^9Xp=T zn;1a_GiAMI*iF1k7bub@G(pRvQAlRDq*qLbE{Zm$jr%KxkC&EXznoXfh%S~nsfF)6 zpdR?2wmmlR6y_sLqlq*5PcpsbTw)EPM~J#7nb!DYR6~orWAhT02rVaB8^I}tv2oYY zh;a!ay0!*?LzbM1;g*H3Wg2R-^N9MK78pKAZ6%f;LRX#-h~Vx18zMx16m#4QbirYr}1(h#PGli?=LT*h9~}|F117hlhIywi!(9 zQT02{Z9r3zBP@HB#d$>2r?+hauHCA#4;H%~g1_6fq_wOtn)g11i=gYPYUhNR2VspK zt-*~2EV1lV^AM)fy<9UHKODPN>7=)u7D{@a-M;?7^KzgDVvb0s2Dv@_gyD)njl?NX zUX6CX1M0ueKJ)LhUzZWQZNI#0l7%`ONHl}_3HA%pnFtTwy{dlO-Cyii5m@b3nRy`3 zU=Em&Q)OHSH4?@jR1w%^u>?Vy7Nh@}k$`o~YL4}{q=ikjWS@@Q5HtmB#oR|5RS&Pm zHoZdHWv7CS)O10m)P?9V&qB>sBJ*1YfG?NhE6|1S%6NksapAPMPZw#g-#6PUepY`s zf79@N4_ems8BthM|8RIR31Q<-Li#5*1T?^lYCwS&t@J4s)G>cpF)uc?qpO;VMa@_3 z-A>eG<8WbJ*YU~mZ-r8eTccy{2x&=zzGJfyQ%y*0P+{)xqq$Ri2TQ{q0c@l!7b|>`ezFBkiIr133oGL> z{xrz}%K_oMg!T1|O_4sy)fh-1bJN`zu^BVU+&+~Y$hXs;tbwv!7jJV*ShpW#Yn8%i z$G>y$DzC6SNqKW#)PKdV%(=|8P{mR#rtoPB|1ug8rOG|0G2lWdjU4Cr)rrw*yP@D| zMcU*Z36pcnHl?sm<@4DVOa9ewcmET`EdQsKfuwrR>#h$!M5fO%B&Tl_{L;hv4<=zq zI7RDl_3~W+wWFES9lqvSZEiL6ehpNoa3dqzVwLskOTV_F)w@^K-m?|H^8vh3b*Xb% ze7$zAI=S~-WFlojje#BDNEI5qBZGfQgrLx*8x3! zdcJ~$=0JLDS@@H6_qx4GdVL|zMMvT-0`x7RLBc%nr~A8MkTaE5SF_IpWad|FdcIk( z_rHrxS^oc5zh+~{XJP-p)QU_@|D{&^75@E~eDVLQTJisNL2vs1CieSp0^0v4u^$IB z+pk3MziIt=EMtj(i!gtvE}j6?Bnm4e0Sxv{@m>Ph1B`;dI(E5WgEX>w*?;@;^ORSp zs6I*E9A7sG*j*o$5l6^|7nCgtNd2^?4O923E%5=bv#kFaygz$5xU0jhFA{*>Z7?%JCt=HpDvQ{Df!x61#r0SvC~bE7sD=Q6Zc ztLKA-+V|~d(zVxqlFs*S%Xa7M;p6ur?@JFKuIMn4On=a!y3{b<`DpQcK5Wb^lojdA zGHd3D=q!yyCou!Z|6KaBMUTie?1phG_xNrXivrSEX-l)O_ zqPv&HKY^M8rNXxzbJW6?(<*$>eB62hT69!=z;!mbCR<)dA1~sK| zkSdGLNaaT7XveS9lMsSC2Qq`=pH&ynq{QBY05KXs7x*tBoT8Uk zyDRbukM2GewTmS`0HlwVzWkayZK*Dj9fn%Y$x3@vj(jU0i&H3woWP|W%u%TEx30fzb+pc3_(LLcEz9WV_uP$9LgbQ{PB z%r*rDikdLGA-W2DTZSGEoC1xUDG?{h4-hc8vS&gLaoQuhSrY%8VM1(y2hjZb+PAgj zN5MSZIo`ner}3GTp4A{dbvpTG%^(^GXap_1;xPff3G!pqIOZN3ssrjg1PVc$NW7e$ zlo40?xW*o9iY>Gx2<4^@$_2K`b*_h&`zK!}=8MSF?YeQW$ z!vq2w7-eF$T6L5sGSm@B#;ucWevwprGHLY02XlF~PXyRo4Q_NYDfz4_YDtF}CbQ(* zd`aLmtSQTt&fCHf-|$whj;)@Co!7(pPS-nI?e}!0@Ba)B9?yGg=lri)@D^KgxqJ0D ze!grqO4YbfJ4jDLq3a^J%374xI{@12+oINAFBOPg-*0@q-W)GhF2X^zE`b>nbdF4Fmx2PY903Y1MC9J+MOgE|V2y)5R>}4d zCZS(FOn)1L`8S>US|qk48?9edIV0uAhB1+zx8SQCUKlPrcbrpH0g0|aOL{gVxT(e= z=3oeIv!5m{{Popo-qJv9z^jm6=zP7*yF=!w9t;d`Cr_Y1SVX|IfvRQ}2=Sxfpu@8G zffxuX`eah&(=M_?OkZ*%o80eWDK z&gn%HDBMC-AMW;pMDtXkgt;@x+Vk`aETZ@?$vXf>+tg_|?AtTD>$4dBDRb<Giqmju$bXa}@|VA@ zOXtc)PNUZWi_zCN-t#tX`VK`5y&-on5k*75Nz~V`96s`?MlT7`mRlj!lA!Ot#99r z_5Ij$Y{aQwjX71JN<$Y442*V?*Q5D+k%)Q@KDJyjvQKV_V96!ss->`!rlAh(LK z5s4p#X(9+9R7sHTXphhf$hl&#*pNho~bk}?jq$WiK zp^0S>!oi@U0rjS(*+P<+Rt3nVU2bFfV+f7bb`~HULQw49Z=i6!r@N$vs6shk*1xiW!pO zix!9ZKA3#R_?=BKl$>Zao`QhX3Q7?ZSO{gxabv_3Fv1rDgm6gtGcF|)#G~D8ts>U~ zqsq|C{OZ)Ky(Z1_u2yj|V!k||r2gvfzq<$R7I9{5))i~K|Tixc`Slq(sztT2nJ44k_ z{t9_x>8d#B{!ZMxc_OU^l_Fg;l2k%u{wkRg)df0mDC&`f9qe{_Wz=y7DJoYJ%GOX0 zYK*qSxG9v*oIZtv`5!?fn#iR&y}e#9a~Z<}_ubUh3Nxv7DzA9c_g^QIbg-WmZ{NMN z4Zdt4fz0pUvXgXt++??|c-1tyksB_{!D<>ouFb(zG;SowI82ustILELW*iRY`kyWE z;msT50to@&HXnXVKn$F!8n3Y%yq^=aaU{ALU9*ZtkoQai*?q`YbHI!!Wi5Fx%_7AF zC0i~6xX)v;!rZw1doDpVh?C@aJ-t;7iv2x5`Wjj-@;5#V^yt;q`>;B8j>J} ztqe5YR+k!z=cRl~Vyi#b(5a~Lic{hXY0z|)9P10>csmT%`t=&J8_x68ysGs&)#{0P z6`r9Zqu(Nr7KZJg^ClxdwJ4tA0b~OB&A7{bK>o^g%V5khM7opX7*A>G5UaA~nBdp# zHaJ=;I`5aj7{w}w5z^lw*DuKM^C}d3med0X!GuL%09i_A4KSxx*GlFNO`WAi+E6@# z0Y_dlaHjLZ2}RZ?E@|O*?*BQeTPiH@FCGnG=I%*?V0B zkkY#;M~TxS_#9=WLe;%cx#_-+;y0OT8~vwupM7(e-A#NnxFOT75EwB4BqjC~ zm)XymTCy*hCi`r7haTtdlxfEv_p^r{T2Wk7V5F11EiORF(gN0KpyZTC9d9UcX1Eko z(4-fqX0f1@z9z&;4*U{CV*OkrSqV<7lOA*y6%;J*AhvLoY>2>DQjb zbH*2*3W6|y_&D*#UDi19{H?QN`&?$gyS6xfdxgWxVZ&1^_g_VAmo*)Bf1rminx?XOFo zj0hK@{Z^eL$zz;&<}1zVPTo_)JtEhIuYN;dGO~H(1hxJ^V`pC~NT0$;Ufc@!%TR|y zI@Qc&avhprNlvB1+zAY{uv->DZUCDRJ&xV+>V?hQ>Rb)PN56&&=vz|ag$AlHv=U>U zLXRkflhJm;2=bpY@l{fc;_N}EhKZ%6ZFqjfp#5sAWydX(yq=||vdf%z(7>G}ZIL5s zUtO18IwaUhjOJEsEgFZn@cmWP*k~DArn{;IaLs8(6A#}JV>^kA*9B^uc2$jCd}lCY|CZU4l7^Z zmyLI<%v}brPX#M_ZFsW3AypxtQnd?#Sc!`ls@(Z;S}z-mYdn{uS-18aKmVF-%lnvv zVBdOY7}loVwBk4%eP_2mJSc7;s}dPz9Rt6y88zCJu>A)~y-@X;!&-zB)Do|$qYowB zRm+c+E!W7oPRJn)H`+fsIj)gjX#1c{ob6N(9tbuhp@zRysF8(TGne}Y4bh;^VE39i zMip_^odjDIOa*i8n6Kl@(lQ1&kcybQI&$rWHnDJV~^PJ)>hhz^T)Wg1pjw z5^ntZ>JiqbZNuR#KoihESqlhV5K*LgBtU2xZzyeITVbPAwBZ}fz%3JOcPhe!eg}`& zrkS)VKI#f9%|N*YYW|9%8GaN^TcK01gox-sv_-SgqhWV#OJ#|+VhapGG(nRquURrPcP7{=x1-%xUR;MN8V9w7OC*b58%`Dqh)aPW-=!;d*c$ z@1C|NpPTg*Vr%2)%=!bIg$p((980GD_tgTOjj!nI4>w4=HagEQI38YAXN>GG;8Rbp zb1e<46~bq4?GaKon=i2t!18#)(m+~UnBvZkY-fipIV4QplU&k*pn04mB0|%NwUvGB zltNV#rZ71;R-EL88jwaS25+e&t*LacTVusZ zudqzLx3a}Ilnd%BknqQ5I{7(}<^+yo?9|ipKC~0T@4K`8335i=8wq+=wtKn#=4L#x zI;Sc%a4FLSTuF$w0uyxqBf0vFfKhBk+~f0dkX%${?qq%svYb*Ru@&Lxq=D@Wj2sC) z<-4hmDTTKI)4#o1N|Q;OiE#Fwp%kMC&{a`c3du#k`N*TL2ioa92pT*$ z?r82VBh9J5-^?HpY->dm{2G_2{7b2D9b0bQA^}4>5~W^DA^}azz}mE0Fq712Rjgs^ zHuD(U>R}y%DUHFMun1pD6_ETHS)#-h+?ge^7?XI+E{4^R{v-jKP^vQr{(g!hP5?O0 zmvYC%Cq-NM^{@Xz!`iREBO4HHbp{|X_&>*G0B9>yzyAH1-=m=)=%JyDQt}88G=rQe zsG33-<&U8kQ@pr)|7;brH)U$dv+MyyTRk@Z~{{~NH@3lX+9ZU3hJ ztBhq>o0TyeyUJ_cvE2ZkU%NEQq~Pu~7ADO%8xt4PaHeAdb>cB{@Mi{*o6LtPKX01$^veDzM27VrGRWOKij!(S`{F6xY zM6fr#9jZ#0-5NDxf1A`{fV|XU2TJAY2KZ^p4|+9Yycd21o!HBDny)hfn~ zZe^3s#tEyJNdrKelwqLt`Y7$jnad34YnsmJYaAD%EzxC_j>6Syr(B8FdFz>V3D49f`D~gk3D+5Csw<)9`S7hZ2`Yh8n$EsQ+)lHz`c4EF;>@b&cBlO1#_Ro^ z@rCB1#QMra#(9aGjChszHFY(XH~GJqvZSeE;khURoVG=!7z7K%11nf(foj_GV0dcj zXVV1jF`xc?cyEqz!2gaVMZW!Hg} z8I6h=w0bF;=;G9H$vS47Jao6jzpl>dv{A9v@aIhOggh&irr0dT45-stUf2htc5K8) zOK3%q+wvUK|-Q;*UD_9pvX5v$Flm*{FWNy(>*k8_&KtjaYC2>Kumi@ zVuLxgdf`N6@eg-(uz&)hvZ zo{aKoKTWA=Gup~8YzS-Ja^|v_^bRg~FgDC9Ap|4{(4U!U%?=@qIj}lrK_od>+E0q! zjM<>B>HykcCQgYOvt5)J&fi3(m!K)J$k$QtWC&kKX7Td zxo+C7GH7(bD?cbDV~%SWR&QgFh!U@)D%MMnDo@Q4B#cczYKWf8wn5OZz^%e>t{Q`p zG(%ZTsfSdHVk-hU3PzEUHbid_LXvpkDGX4)PO2*iF32=wHRJ`!AQwVnc;ZM;NTZBc zss6}e6;BOkz?#P!%9fBXsKtHq^W{`ObDT?e&vfB{>r!7MtkmXwh%6@+2x&dFDGj%f z6f=3nl6t_Qx5N!X?vXwq={-^KcRa*=9|EDUu*s-a2_MwU_TZHxIA`J&b|uR?ccVr9sOb|H)B?ztRKHMV{7DzA zBSjLB2>$-d--wu{cS1SPSg%4$R_yaxT!#JUm&cyPbyP|CS@3BrzQ<{hQ@LokT`(sl zy+B$zmo?2LaAEkTs5m*cJ@z9@m;xetp6QY} z4-QuaK-lGD3`q;`GlzQmU-YzJ`A6NAki{FZc-080%|{#(gN(%m3R;Lax*2h|cP)IQ z(Ht*omef&NwhI~gncGT2yTX`};CulI_1VdCQ`SF26P6pceUwVZgjA{|pGZ-~0$5zx z& z?SdD;Igf<|q|U)%)++|Y*HZ@pw(M0C#)(nSRm%bq=gCtwV42MJ_FLT9$L5s#G$2!& z;)Dzu(9f9|F+$wTYp8GEjHSPI)#@}S%9@lo8*sd0Sit3uX|m51jCeL@BU&A9(~M)v zEkRSNqZwQ2hem-WSM!ME|9wSl(+T+--jSKxaZR|1Gw?t-{)U;`MA}j zTSo1fWu`IA{qa2{h7;c&U8vuy(HH&4hhT+x_I4i9yCb|gmWN^TJ6jzm_n-YUo|R&w z4sKpdz^4^3JO;np@%(OFqb4%fJn22w(0ok`ANuRD2;qi8cVXI>noBO0%syJpP+!6w zIT{t?7DYjK5zAoimtc-g?%-XB+PJfy>)WQcU1=ArT{|>FY!{0K)5I(_iYfD8+}jg0 zpF1^m?;=k8x9^7`=+BrNw z1h4SBh=ya1PBiNM7+e_J8#Yyf3#DX%I7K<wkq7G=rq$w$*&Gb_@U@SRrAU$s8XN%dP{Jc#FV7cI@F7}vJFip>Y0W!G$6!a zM=IgL+&n28i98kS>{;!@qPxO(LYrfBME?qXAPI7l9O#qKah7Q(=-E~qI@$Ui`Hy;SXv+)OMlPHQZCsJw=V&iqJadl{Nj=}jLcntufb3Nw z56b4Q+|)QN0Wr^r3=5himU{}hcd}_%)gSb*aetT%+^;~l#py~w^iL2$=5m2dPP)>8 z1}S8sSZk=R#a$=4C5&3oOu$N}ya*h!!eC|kCwLz{43p(0kLPPsW9o2p2SXziL!_@# zGoJ;6@vCFD_(~wzyW7?V5Eo;}OWZ%z8YR|wkSz^*p3Ed@dwXz+5$#j&O~^39am{mB zLy?HL$#9;3$#onliYXH~=$FSgdY7MW|COUwXd|~_twP<{xNNy6EVuD}t+2KIw^qgO z{>t*20L9iz&DW`8Yw~8vR}Xc$kkIXt(#|I0sxg^bvgCV1cg%Y+F~c}zo-)O5y6A*^ z)pj0am%m4;<%-UivrU^LxuyE&097Q*RQ&TnW7;)-H8>X|+;?&0fLO7P!B`?yz2(;F z{beK2Tsw*4$~WWepK4EscYpDN~QZ#)*0S4t9i(^JQCi; zbeTCpcscE_>zR#m$vV?hwBo4O%kIO`fE0FVl&=V4(Fds8JK?m`ZTaF>_pwLOTP`eb zYC`Ve0j#T(-OR%p`tQ&si&MmRC;QshOpZ_TQMtY8nX`r!#EKtmOTlN^tAQG}FJjMC zCL@pKH6P_%xuaXBJ_~1|=Z~=uJjww~qY=V(-)eV&H)dU5O?QjH2(g?s7iUZ+A2UL} zct=yvxFj2*5*lJGVzOpeJC$eVKSc7Jnq2WDg4Y`NqYJ1~qbS?7 zgE;Uof4DCboR#pF{p>ZnG4AYi67*yq%-i?_I|tXaBssu4b1#bWj2AQ^AHY{;(fO1P z*s(jBhq(mk&y||C$NGIB*tZ?8=`hNWrxzV1lRef6K`Xg^Og%~7ezzxEP(N~WTik9j z@qy;9`5hugJK;m!c70GBDBe7{BF+u5NmglaH%h5~4IPwPkt=!wc}j3`%CT=8$ zzoE*%^yb?k!jkt9^^Nw?77p5*tj-bqgd`nBH~05cZL22oBCn(#Qg%PE!(O;BHgG1E zt7_!yNYC|LPOV7@RBliqyR1n8U4aHF_1)LDa!jx5^K^2jaPGO5kg9IlW7Tw1BlroVkuBBJwX?!#Y!9La#^5No#wGZu>f1I*TF)*S$ww&18Bn?0+uM zV!KJ5WTOGyM{9KhxpMmKL8DbuS-8EqOcl@#b0!|%Uj#oYi+FTRy!Oor?eJWhIR`8P zQ4AwXQO{oG<3+;`>o2=&OJdozr@5<7N)?J*k}hiVo`gG^oQAX=zM9S_Ds2a_XUDHQ zw!63PRe)FbqpX9dz&hDqH=ZnP)C(?De`KU?s+Y`dUMuaoic(XD7ltYuQZD zzhCQZjz-OgGy2L?B?#PXDz<^&1_NNsBFAmyU1!(x_wv!Gh;TsBY3rxzMG{WV*_mB=dq;K#YF=MX;1gUr;T+G>Nv=V$Nj2 zf9J6pvsqZ(Ub8Lh{AjG*DIBvazYuKe3EnKI3c9Aeo^qaG*<|oN7hGSgG`v)$?KE+_ z8-^?D)*|3f1hS6MRQhclp4(^?zQnqNAxF)XD$a>Iy~B#YaWK~{AI{VTz* z({fdxPL`?(gp8mBO7uwYL6+q&-ghKx062onG6?Z&;U+p@lstk?#rSfNr&)W|LQr%b z3vt|=;$$>Zqo^;JGeUM?kYPdf&mYsyZS+$RV?wS%2$h~frAI{sO|fbtZ0$q(2{Mdk z0Fo}w=eht%s-PnqXcGk6wlh>;(s6hQYEqpARtEWVP zLs89GaVz{ywW&M153I;|Pkh@5Ym0!DYUyL1+jQ;JSKpkxyjfQoHxWug$2>9bPBf)f5{MJM zti7pEvuCt#g~km{E}9YS%w45}9bGmc_ndUIqo!++Aubs{zT(XEN5q?M;$*f1KZUf05GPYF%p^YYy4e zRY?Bt*SXMaHqP;!`Vf!eJHfZ7NKVSVCteYzl*eoP9Z}5(N&z1MuRlPT(DK}a?UxciAs%iLp zVQQ?ua3~6@^s2=VDwyMC0Qi};6MnasmlRDd??YPRaRkoW{CVJOar|`Su;~i%u($3> z+qYX`yN2vLCHgws^K^woh_iiZZ-Bf^^UMomxwLU5 zru7y1!KGyW#ViRA@s|OwZ*-n?dxz;M+Z}I=+*;bg^v+}&a-HL>PaB$Z<`8CD<862~ zFF@wAWrgrKn$z30qbkZyJ>t-5=|jv;OR%(HR7x6k71Zarq2prL?pWItX8*b{fOxq& z-`K07e=Je(WZxAS^>P~@yY9a`?K^SO&{uHTzNx*@tn*AtrUZHeDpCb zx7jk!+U%jWzf=HKo;b6fdWr5#dQq9Wx;yh?QCC{gr=%i_Fdy# z**T~_Fe2`wwr?bhp<)+jtXp2Zs(V5$9v5Zcso?T4;-{==-Z)u^l}A#W-&Twr%YgWS zw)U75_`k^z`)}3&|4-Re46IBX|2>;(THV@Kn+4|E$47*hh^ErpfDv0p-KJi;EKMi zmlvP5m-OBj-omhJ@6Yo=ZmciQCk8DYT~GJ-F)6>>*ZcXgM@L64?KJ|BLYps}J`)hI zrI-rwrf(Llx^C!)ZZ@oG3zA4gxP_nHk7FB%Iy;&G3UUF#!GJ(1Be@AEd57KD)U#+L_0uq0XW711ym`i0}7hT@!ZhH z2ZaV`Kf7UAisGQD=r>a^Pvrr zdG=nTtVI=?j7}5Ks!;l3WFrJz`Krl7Ecq+K4+XK5lvN3ejnG7cOKNq}h($+X0wlxe z2q~h6Fy2j0U`k0oSU!M=gd*J?Fc8m#sBRl!w^$VA&aCMm#c#FRDdu1#$svCuH9jXT zfQ>`PQ9-c*kYLNmG|iI*+t4Def#8(}wyd!E7b@^y!8I%i0N=vlDS%Uz`Yu3$~O9vl0~_%_#PXii!QjIR`)tCV?x)+T~(45o9Z76#LCc0m(M z?FE60cM_R&rfT77iIPa<$M?ruBqlY=U>EGnN?2~9i8ZjPH3>wD)M_dnM^CF1c)~+J z&rV3zg;7ItU)GVUc zxCH-8ufk&#-sz1%FK6Z!q#=f;Bh2W4N4$a43HQt$$=XbcrJ1q}6f^2Hy z9w!Ey&W+v)c{x2%Y@P0AKKACO?effd`I>*ShK_CRGo|``(lXk?4%qA3$^%7~r>?u+9$Wqo26-fz2n-oHd5~V0Ag``x3N>W->grZWCzyG(#`;M8pUH5ga?Of+vpZhxEKjd^G-Igvno3N@|rriJGH^bg) zx7Hq&pK(W8B!q3gZvCmKA#p6IMe`4j{5bLE^tC_b=DBt}`6XBPYwm=-A0p1zM&7(@ zn*L;>S=y5~cf$D3R=xi<=BNUBOTx`_dDX3(=NSiuR&BF9(DwPq+MJxeb&BRIw}aCt z?;A(H>u$LmA^HosIK|$S*5Blr{71WUCn_j~+OM7u`f0`xkrWG;C?!PQCj9xCvuHyS*u{gdHuc1 zlvdSKwtcp($`75Vq)c&sdS`N9fz$n6_O%B_ogAm3pf7cPrJ=>ag)T`sZbh?3xz$EI zj5uuJ8Tq9C@Z2K}AGiT|t)9ko|46 z%$Pu%#m=ec`iqrx$41aR5Bpbf%{d(># z8<)kr%55zAxyA9EHdpbO@D=XbV z9bBl6ziQyGx&Xhdwbe(*)W_Dxk@}}PWC9gkYy!~6vf7>=KGe^&DFo^%J0{>0a83*U zn*xD)Ru1(uMFRDR8|rUL1nTiH)Zdf|)WcP%zY*mK;0OPmNFWkvzmo_=>R7OA$OIyG zSL*c?0{Fo{mnRTu_aiD0zz_bpB7sP|CsBz2e(=wg2}Ig`Npb}613xDb3E&6+okSqf z?n@#Qzz_a8g+QX+7aX<&e(=u~2qfBlNs0vUgMY3>AkpqiQYL^O_&HgQ0Di#lOTj;I zgps3zi>P-u2aA%SCrpmauRM-=Ry1njIP69NUh6KX)%VL?C} z^ado)-hkw(%>ADM{f7h2NR8}2YfRV!G$wTBgNICd^HCm#`A|dIKVUv|bJxEVPyTAo zLFSpi5$^{gxjfTIP6Q|4u?yu`Xdfax(xkjie z46$rh5>&t)2qjJ=4)UllWS(Y84L2e>YT%5w0qs)1XEkC#+|$FEI%*nY`UH#xY7$5@ z5$cq}iU^&F(CE;yL`JAlO=$SknCOBik5Hq2&x#t&Mwqc>1(Hn#I71FnR2-2*Fe6Ju z&P>F5@= zBo<)bvl{uJ>CqU|CtxffrU%Z3WUXF0)1%R$Gd-|xM>Ax_5gD=~7C3==kXT1TJQe$% z)c|Rx$BZp2us*@qp;IS2V`e*A65{(xBQj(~CXt>3GK*!QfMGh0DrPKn9X15yqpEMid?wgfA% zeXt7bK-k*3foa;*9-L@O06B`Aue%4>OQ-wN#M9q&v#kdKxEK8w;Bwj*fTpe{LBaz} z`f}Jm5}A6$D?Ujnjc8g?!nDoc+ej$HzWiO3(8DpP%E&Pgt3GAxAKT`LS|&i z$h@UIqFF{6^JjWbAtUnw_Wj=;E!ghD*r6Nkh&-9;Xpu<*`<@klW(>Ax1@%k7gl>SE=g(wXL#qCBUM?U~pf$ zlulvn0x``%2L((U!LS7U?=VnyGvkmjiQ5%TLdbZrw1|~(@kI77Hi%$842oqijR7~n z;vaa$#Dm<3h}FAT-HE|0n5-r!NWwwHYH6(Ku~<%kDjO`n(J?r(_(`kTp>|6_G7chk z0V@U>R%%38`5Vm8h*+7A6$Jx3H_Y&9wLv;wkX11eD-yDz#2|boVTgj{KSZp!IDC4v zx+EQcNWMbEE?`A(z{hDrrTRE5aWeIB2J4~saf}AbyXiu)4){2TCs-5(c7w$jP|3v% z9km~1#1(DA}DF&HN{`_he*UHG9{ zC9R@NH%>Iez{<(2_+l6*Gpj@=N32xMir(OM4Uxtim>^+Q8}U1=w9SeR17Fm@LCpz} zJu?bAgJCny@ae&7Iz2skH1uH?u%gF&oN(ep#);M4SX2m4E5HUysgR#h?&Oa2hz_4BT z7s|z)10CncGEb)CqzfYKQH=q@Z zu?tx7hXgeU=ArJ05@G!w32H-|o3iAKMv9IvG>F7b691j~T;xUoZk z2c40#D_9MQ*wA5t!(dkW_ae1C^>0~?kzQsHI7lB370_@v6n?^Bcq}3{z;0sf&~1dV zg`m)UpBef@0gbF|5hDykWilx#qLGzt^`4#{1f0-|P7#ewZ1FJzk(xGCYV?E{1E!Ih zVdIiMQnQ7-;Kq%n2sp@v2vIHob&I76s1akx1Xkum(-uTBFh~Q9tRsWE5Sh|LBP)iI zV8t1OwwOeIMKmH};0sptkVs8q4n%4Q)<7aP1~Fkphk-8!rBWlSBAOOs_hLnlnO^a9 z5@LG*li1+FE9L^IezB@MOX~RA9imYf^oz~_BSWVUnbJdpHCtp3lW{`~0YHoov182Y zS&kD7jV^tLJ_%%oDG1Pn`yNP5X!z;#$gnmkiJj7S?ITR027 zl|u9crhVEvPM?5UDO>2ykZEF&4nW&Me(2^245Gnmj0_wO`u8AZ)ILWBkRc)nnL&DV z_DS_6R{SCH0%Cu#%#INxLmU}OhDaj?GP^;(P}>+8c7=$5R|e^!vn*TmiWWeQf*J&k zF%T0WWCgKTwwvw4&?Sl$g*Rg*d^}QF9f%_`#&sgyiDz zj`Yb2MuZjrcyOn|j;J?-SRvFY1HK92CaBQZE>qwNA5{fJ>;Pi;;s4rw5Evpv>Hr;M!w1}A0Tb0RW)ZB|9kRfMu>;V=gD=$8-&*LB zFc=4`yVD7agg`Y09SQ~blCa9{2nY^t)FA|sAWdS6OBpna0rse7fvFWWixDm92T0L* z6bkNzSFjo>HhYpVC=uAP2f-Ig+XOHNR~96Q*FdZRUd@WAx|^r{CSzYuANUjp7R4Fd z6u@0^_US0I%d{9Y&5SaNBqm|N5LT?RN>;%`r4Vj`vdFe3kB2)F?V(tD&h+QKAnZ&lfPsD?lQw_=iD^ zL_?!sH-lLn6eciRI4C-ev2&^cjWLa~=zPK!t-v5)rUa4sgv1sUz(A1M1chQ$No-LN zNF<^?dJQ5GEcGLihE#mF!Z ze=$-tykIwDWrECfi#r`ecmN&aNgPB%(8WP&63UV~b#;$y8skA7#8fPf0opK`!$

zk~y}32YPM7@;NeNP?HpD&nDUq8Hp{zgJFY!1S|0<1!|_lN-zv8G4p&Bw?|?N5@D5f zP}^5vsTZm{3?;ydMcN!jYfV7spD1RJ#I_*MFj~yM7!*K311DBPW5pXiL0V%3dJd5t z3KClg!a&wR8!a^vfTcX9SqEc8pwBwkqFZpU8w~SSB#7Don!>$p2uy)AT$lohR=cN{ z2Rf0k#Q`t~n5liDA(}1l0SSOK_CNrH)qTWqMh1BJi;<$C9?K6$U`kAF6Akrj>%f08 zQfy&?j+CnB5io`&rHoF4hWe4A4@e05V9*Rv03N)86^G16$_PJzN@7Kai8sKmFu*`y z0fmG^P)KlV5PXh%2^<9)*VuvyXmJe|;Ta@~A_hq#gAkA)27!?vQq+Z4u#yBKQ5t)| zOCUS|u^qO64ki-Cu?9GobP^kGriRq}2TevE4cu%iW%O}{IYBgVvn|upvJ-fY)kZrHfihuZNeHoqD{7Ca(bcB>c@1^9Rqpc7h=ATS89f{z879BNi<0R^i@E8a(^&K>7vjr~<1V@N_U88pTAyD_D)2VGRmQ1m9i9yHt>1(HeCMwrByGQ$U;n!^lxIB#CWdpI$A@38KM! zWL16=Lrxzk z0F?kXsG%^x>ySnMaA61}T4A0p5l}><*2rK8e?bsU?M4PeAi;_~qsCFsW(z|Y)Ht&! zVFjF$1VIU?(_rOBRtjR!I5X0U=!$fh@C6c`#_`D;hcDp50PHf>RpDQ;VwbV53N4Uo zMZ=rJHC?>z>1Xhf!5v7njve%-hAy$$LNOR(9|=MUkW^-5fC&;)zyu1KgIBN;E35rC zs$C6nO|~Ehdb?tZOi)C#Rkro|AyUJPYEWuqw%7*R`~b`P48Ev@fCtEI(Fod}UKsR? z#GDrBt~c;txDj}^$Vc17(aiz$FZOf;oq_D_=q!*tvc466aZ4oFkw=CPATz}WC?Sha zcm*r_8Hi0x%gvMMHQbsARGfL#zQ5W0BUgO9mfC`WUS)Picy+5`~@wAk(mQ^S-|RUbguOmw?qOG8LJMDfFQO2WRwTut7HrW zz=|Nv9GEj_1?BXnI6`RcL3!6rOJ;5o93>#^H_i)D!GD*)i z)$&;01(tBhv_{}`Glw#=!A53_E*P*g=Cnv7va^waBmRPYBqf4Zu#^N`8KV9STQUH1 zfIFpR2$ewnnEiwMH2E^iU6j!<#ulwGC|{I^`Hl?mKxTeRG^}A)jL?4Z z3NRT*6p$gJfKI+_qYzEL%ytt%a}^}TVOtL$6fkpQBTG!!_Ew;`VA{z7bQTO+Vxa?| zhEY}`W}t}ekTIAXXi|kzWH(z5%tcJuv!eEIB14P-s=?rc#lL-r5`Eebs51{tEuoY}%SXe%^W zMrSm8G+2!cctK`P5X}Wf2D~66&-@II8hsuCUcpKqgVneJ_5iR80)&xiWMo|*21wEA z6~+FOF@9MwMsFwx@B$er8Y!_WSP^7CQb-LMDO;ETJ!4FDiemrCBWwIXhL8gWt3$!` z@QS}NQY<$^MvAe{iVh53WZGdvU>BVXu}8o_@W6pXOUO91gbeirj!}YTGJG^>3}#=t z#8U+b;9wL4n%j)5^8%SUK{TARE#}heo>m{Ew{kQj{LVyB;W>8c(nJof^&A35^NgmP~fjlxW3Uhsv(U>tZ5D6IpkqibQ z6l)HzVC7Qm#tl{lLqH^Cw#Wr~^)NLhw8b!#3@bL7cs@ih0CU9C6C6fB#?cH=@WV+)Ybja@rJ1>zVMGDO+{s<6ERLX|yM7K{|lEAe?A7zLhJ!ZEOgv@q*i!gf+Z^mDC4x$&@)Okjp}*=<-pv*a`-d8^p9CY@&;? zk-;j+v^D~Cvls>4>|hHgK~gK)$Uzbbu@s1XVZ~Wi@*B=b(FA}kHiMoZf>}UBhsG1O zzyjtYh1ddQq$5Lm{Dm#k#U*wdEDUu@E9g!j9z(MRuXx4=)eYX`r3EMyaDF0YS7@d- zGIR+UL6;!XMYAF73Re1O7z7zYNl>}6+je76I5t-?#t1Y#v&VYi9lyymum?2@#t{Wf zx-h`J7r7&S&6O>T0kN;a$N$N&5d$g*YP=nhBr)wH6h;OlAtOMNLFJ;jZ+HbOmRK#+ zL0}vLA|bOyG|(%X)^dR^j-gFs$!t+6jP?gn7pTHFYG?+^wx`6vlmg)z z@Ubgwwnf=uR}7?Mi|Mij94$m1(o}*xGQ0&D!CN5XMdv2Acnelm0+M6cD*=g86t z%V=XroZp>JoGt>f^j#=T~FlKfIH)fUx zmrrnb=;DAfvfdOF1fYRP5Xr&d6|AfVw>(m@$YYUCLXeTEAgQJ~rk)ZxFGQ1200&W=8g?6}xR}4p{c&Y;Y2clvA zIsakXXoKF|nc_mwhkht*K@7B*fs7enIt(k3{C8LlyL}&KRs%P<;P6mSgh@Y3CBq|i z2lu+^QWqQ)QPIGN_GN*h3$JqOe6uv06$i0=tEY z6Oz}B4825wfEDOX7%l2j8o>=xFa!%LIWr6yNo)q_p?MA44j}_^nJH_a*BxXDH3rJa zpi9gLjb=4$0W0)_hUgv!A)+%nTg=knmf-+%ASyv*4WitUA#(;uQ7wN!8R)Fb7Cpc) zPQ;!E=%JG?+u{=&>yfEAova#9%kI&6^}|# z?|^44l7d%EKH!xxM`Q~j(DbzTb$9fjo-1SvjuVn_^p?>wl>`<=fTdchS6V?30Rb=0 z!h#|J@5Bsu*}-{pkQI2Epb2;nb8RBdG7*{-IAH?+9IpW5&C@|YYM4{teW^j)VE7*I zY6+S+Vlff4v4XJ@c8mhg(BS|$5-uwIIbZO=FccO3>>GF-46_^X3hz&Xdp7`!fTKwS8VZuEv(lP@Q2#*vJNhDytsqcc3|O+ zfLC_#2VZe%;60t;em;H>I02U|eBO@nWM(K896^X5H4IMOgv!9r-39OAWwgUk@k1|x z5#dIGKM62+s3BAW5vIAc!~ei5lmLEG9&(Nsem#z!96ZMh=L0GWoaY7ojEJKr@q??t z2`|tXh%iQg_xODv(habCW5z11fS!7hr`lIw3d4?5eM-E=La^JqqT7ZuQ+|&A8DP+V2dyi zhj47$VA~}8`hm7dINgD!KsXjOxB}jak@nca zpo>xUi$(K+DFhFTWQM7Mp)@dLsvxt)bVHXIg6+ml5yyDb(8}NyAJPEK5}M*5%n}#H z0L&6s!C!&2@acajSPQz?P|y~Be>{4TnPZ0lhydpUo}Yq%4e-Ao03G1`4}cEvzr#%z zFZ6>c8@~<@MX&@6ObVZw@bVv6cEP{L>r1ra2zbS_E8Mj3&0(-SgYqBTHiY-Vw-3Q` z4a#BY_6YuWc&NeG`XDvHugBL=gC<42KW0)x6F>ZxxXSSaok;=+RY^+(2S^XaHyhb{ zfwa%e%MrBq2FFQy69C?wLYvpX%!|7>m_u>L1G5~|3kA$ea0H-6heLS5A&rNCMV za?xKQi>bmk@$>|_HYgfn@&I}EfErdhZuQZ33;+U0KP6CT;B{S1>feL+7*ELB44YAK zmf#uk8n!;RZl2CmI?g~c(69Mq4Q;(P>3TSM4z|~%eFDF8bRhV6`GRIqe6nC!=xdKz z2bJN0wSa|-qranVV`K-1KyS+DO$;kXkRI#0+vM%Cv=QShlu--L`T^Ba^R&{Y0-?OTvdLPav z_>DR;3YGxkW5kC;h5OS+147Lrkbz-q5~@W~|8pSnF(X8cEyEC&61A~7jr`UVzUI2w zFINaO^osa$@TWQ@maC;rS=Rk(j8yNqm&^SWj5#Guq%3EoUw!`e@WqvucEua?UHeL6 zCEw|XUX>5-TRJ;R>Om7{pvc}2u69>4x*X?;tmslH+pA@`$vVQ%$lvvR?eSZkkJ9aS z1<72M@Gw))ByW>QkK31UzD>|V>U+L#AHPSq>kZNqcD zXO!J3Kkh}$+3^O`l0YT%wLk*?UjSYJ0boP>UXw?-_tF8zizCysLBjllf z1{H+v9hbsyVpvo**?o+W_wy%8J6DioA9BkGl4hw+Q%jwhD<`RE&{O5H{r(QWWfqCn zmdnO&{pwd6JV!4`Tx@2T)~Zzd^}>XY5987^%kpJ*n1(i3oH21I7vc91u@x1To_p;1 zqETy;yXr*7Z?od>v+PX$9&V#!W>VpPd+Y>?R+mk*!t)tRc746avDk0){LgC@U!J;A zr`}Sq$64n}J*muIPw`-#Pp$9NrZvwcYDCVbzt8bmc*nGB%8{C`&+W38c@!@G>`^c6 zQOk=y8|j;9W6-McO8e6;m&BOBGlB7`$AS_+=(c?P(L=iYSS30-aQ~=H*IQH4dZtZT zO4iHs8dFN%aztn8+Lf7Gr*i$){idAOTt={SS|vavE*22dO$uM5I;-CCzQNaPAD6xM zJtVnz&6^n>Nofx1bLVrN+?3Z;N@x_G@PLpr-KECh{8P&frL_)cA`b>`GTi>PO(6Po z`x~;e!KM`t2$#z*CAtug`(5Nw*S!6_I>6y)T??m?=ZnzKF1_CG=C*t;xOwZ?Nutx& zQDN6t_RJ8=>aZ{Ra?iivvA}b!7s7lZDGo_HVpYkWhi267Qt!A|a_WTXg8C(C?))`c zb_Kn;VIOYXx>k%+W!GoV z9bTi~=Szi`T<;9f?eBhWQ+~62S-E)Ny`ZbiypWn~4#Nu-9{#F*6;AEt~NtmBNv`fp4UfC@nn`Qv`@Tn`}s1Hwka_N=^0(~ z)LtYMg@~sRCNEm7+k9$yYMsm6EW!16^p3o_SSeT0=x7t+bMWky^TKaWJ)BjUP;Hl?1fy*4^shF_e8UmeUzn@HKyyFK87g4V5$63KDaJ3iWIS}X0= zzj(@`zI5E{S>!2Zk$xUygfDW-q`jO;&R;KbOQ7zW?fvJjkA)3A*A`Hg9eWd86rf|d zKDnj-xiy);F7U~?;O?sP2dYcXpXT4_?#i9(o5^pdWmGhOv((CuCwijaB`iDftWoP( zy!7KMfeRl9Z`$LodpGTCveVX?{Yxh+Yb7jF?q6DQSkL^+l9#j1W~T*jnXhngowdOm zE1Mbvl^^vdFW+@_2sld$h&u2pUEBUl^hDj84PKKwqMz=mZ$2A-FjM|>wUdnHX+4|X4BvWZuBI(sKI7LDj8DnR zY!?^1IOFNTYm2`w5j(ng3(vvk6&t5S6jnwa4t=wQV`sU=Xkkx-9DAdMBpv-p@06z> z=Xfu5vc}Bh(Zf3uMs)z&*yH{Ixl?0 zQZR2`UdS7s@;HKr;rjlW*=ohR|Ad}algU_XXabD=vDzm->oZd`I~UtTXc`@LIbVBl zt;*RWa>9B(iLVLov+sn4y-2O8+q*IMb-wS+4Jl(DoXO?mew0@u`7k#yu|jLKul2p# ztGGWAc=x{%>?;|Q(%0pkF(Z6S%leIOlk-;E9|+tuPE9;0%j>f0N*0hQA?|C<>K%qS2=fp0R7ttms3s%PN z|52=WFWvIY$$Ne?O7{Ksf2|^<&DX>E@W2H9*tti*-k{!<2LZQt&3$s3!%?qt%{Q@C zUWe|UrJOa^&D~qP+dPr$a8II_QRTH6h6&S1Letjdb-TWQlQB_5MpFEirFd~pQ+WHQ z;;~;FCKOC3n9t9RR<^spIXdX!_#0}M|8h$bj0`cWXCb(B^#aR7gS2m zIluP8+=A$!Ba^>-)cB5CdB=QFTb9Mw&39YHLOiq_YHYl73AIS_>~(z3*Ig3HFKJQ%)KvTZIZaet{IpcwKqQvjGqv( z^>j!a_jld}8+Xoj&b~EomuiGl_JZF&9C0E`gT-YM+UJixCFF4^Y;J*b`EFBkFvv(Pdv)g#5wzb7h36rl!pHn^W99WuiQI*(Ur6vx+>o)mfWhp zBJs#`?V&KIJ>5BTHmV!0zGrsry*9V`s%Yte0RE;oJ~LhPrd@B4;EB_2iM;qWEx9G> zxH_{=8XHPZ3YS-XW3gIyU)jw)lb#6Mtd|yVZ{9cSo_er?*0QEx zKeDevV0}!tSlrC-eq{!k9!K1Z%BS3q>220qz9W2oBS*~|&#&M2RJ7#vt+{yA zA@Dly=*@Az<|mgNnyNdh`^@uc)8>*A+9xmN6rG)8N_h1nNF=X{bbFo9w#239G&Y@G zx<~g$#4o#^n5wa+->YYDnxEeslB;-S#*_RBa#wa<)76k^=DS?AtNPNF4&tnv{9)%a zpPXKCJJ`17Ny=^i3A)R@x~C3;Fze~H}p zvrWgvc-O>!ny$a}+TxDvvwaOe6Xw{O{|qs-4^5YJ)zIzTxqR~?~$xOwu#3+l$rOn;CjaGb)!{Q z?U%hHIOU1SP2%qYpt*P7c1OuGR^%YS_Pp;Llf@%9uDh z`?}eBt@n5E*|^?wvv(j-jk?-juVbR7x!xcAHA!8A`T?J;E?C&Q*sFOsgXJW6t6{r& z1tbr)=E>A$tE0OG*h2(MXiM4`aun)~-E5t`320?>aLyVWBp~2x=M%6Q@JIa+5TuUE z(ALMxWh=pI5#WHLqy%Yx{@7*- zq%)`v0tFTk_+(eR0P%qh39yw;osq$I4wKa+ZB_Z-_zKD_ltqdpd2HY8zi|Lmo{91l z#YLcX23B|YCk81Fj#$ODvt{`s5!69fC-eh&@#|HlNctxVmzmZi>FMqZxw*p@DEeF_b@<4gv> zV>|zRvd+NlD75WlXCMj+4JG2N4L14VruI_skD6Cda|jCB%Yjuk_TRjzi#EVuHAYaV zLo-g_IQ{Vr%LO#LmxeFepx$2voxad8B;L$V2$6^a{hu zxDVPsIwlz>DRZXyYLr{nHto^dc&t}}BxpZQPciC=-;%u*E7DB1AG=yzUY)(M|60(4 z;%TY-PA@kJb(;S4xq5Tgh7t!!o-?WON3X?d7hK6Q==&OwPkN@=wC}^zz~Xsd?if_1 zt?6Hr=n^>XcS+fpWcfUmH^pksS{*(Ir373W{0xh*zL~IJ^hUI&U0N~MMI+X z#{X>mK1N*U)P|a;PsK%Bjbi$qe73Zm*3;6q%BnB%_yUa*FW${NHg&JP<&Uaa-v zUizacK0Q2gH-nUOxI7f&r?t&?D0*E}SlJx5y0W`ryV%W`W@h~uYuI0NOScIGV^SI&R=l2^Vjv5 zyLX&g`1vO(9sOw+KAHFXSJ#bmyHzInlwTizWyj`DiR-qRpKhGs^Ke%-I~l6#eg9iP zGM{Z>kEo>gnpeMe1+A`|{-kYXQ0@g>K0{J!eLZjX7vrIG@Z#0@41>E+gNCI*SU{Vtj_$4W3aVz%R+`K?Ptq$*_i z#`r7b)a*XHKZVkolriOcz+HL27v32evWfH30#&x{e3g1VM!fUP?q!Xe56oV(p#Y^l$jq5vp5I(J<<75oUX@AqJU<%3b*Vd z?#j{t6`tIm1^o&KzPexGbXc%7GeatL(zu6}^G~}J?mCnCK({3#YuYJqSHap29bev~ z$t5j$ZtsHs$aaWbaPBUSj?4ZTV=Zc|qF%SFwA||M%SVl-*W|}$9ltKTMf2zdem!#B z=SeC?ug;G_%EjM%8MymTH8CTOc$L-p72Xl?Z#Wzw#-JQPPwjEQg_wr_YP&OfX zci!hiGQ1YvXMzHz*Ca$|Cxq%n##$vV*INBPKQr@PO}r9WrXlrZn@y#2;1i$sBI;3M z*AClu&IwdMqIg|A=x*1q{MwxFoBGymA4L{FqRC7>)CqbRVGbbg=qnKxy4mj)1VAO? z`VJnT9veZ2FJArb%kO>e@NjSzk-lgt9cRZ^W+cxsdWxli^{v~Z?K-Ed&yIe7o_qFP z?OEgdZJeSWKl!2lM0juRR3WRlise$(_Zv3wrj#}dEqW)%XKB%VWz_hx&o4GkDs(Lv zwQo-1qkVbC;fE$IUCr&4;8^l@zC)xmPqBcwn0{95J*8Xj-m4MWSe zrJJ!;@8DgjGQs1^Hyv-i1xCPu(+DY}xf9ZnW{v*qP(>=Xma4X%nMcbl);&ks9BuaC46_ z_xBiSsuq)t6plMScoy;^{ruF3ojvhCf}+KLZ@pC#t9o2*ww$5%rgO{ZMDH**oV$2~ z@(j`f#chjLmN_IW-E1$N?z2HgT4?$N_eEwEx7u4SgbH6VUb}K}*d!Z?ht)=xdj!7E z)w!}vEjh!Jz*FRT^3Y#dWQc^o%gm%4cRwCx%X(x2pzY|-zOSz;#i~BdifuXIt4#=93xCr>e<*`yZimBHp4a#&8C&Fy z)DMmq;-+bkxT3m@C3a8ZkN=q#@VKi{GQ7T>BY)SVWAR7UZul5c9w~9+tLiu5#cx;7 zO8qWoweZfSYy3s4wLcY1xez*f&E6S$fu6^9zki=WJecV#J9r zzZ@$}b6a&LDgD-`jT1#5T@tG_d3{lQfoBIrxT2oVFy44JuY6V5^esk)%%K8 zUD_n++mnj-8uk>J%y7EYt6e%KC40{5+3wd*-@gCeZiC-Nb+P;M#+S<9k;cirJ(O?# zD9fWDi?>6sF{SF(oV52BJ+2DmATh{PGh6EW8UQJeM~R+h?<3ZS*=1 zK66>&BkH9w@~gv_Dy~gvS=D~AV*131Ki;@Vxczv?pQ|i+IC9(fHrLl7(qYYWh9=T>F^tvapOV zI5$YWZ2q%{LNhF#SMk=r?s_Nlu3sgh{MW^zob_Q@X=%(9GtAmEcz6I+Oz=T{4^ezZ zCWMwPtEyEy5boXYeo|~dIgHEZ$EHk6yV&Iu_MKDYjjrBpCgiZZwTtt9?V82cbPvCY zo8A?)W~>$ehw$kMFE=f}CzPJ1k#J}FW%+3&3$;2Emm@|l&#SWzztz6$kjeAz;%iaC z2;r<}W&-7FR1~{bEKiujnR?kgjAMVw7VWxB1>dya`?B5#^z2isP`0jVv0u~N{cPq7 z;#1GZd{Mhp3nY?PE4ypt`mc<&TD-)3i&a!@-r{|#zptCSPyMt+L_#~|c)s0IeXWL< zHbLQadW(Pc_$e&8`eMfZB+Aon>bMvYaALn@`JPbOK|BF}cd4}261Ii0zou}+E zuJ8PGGt4*UQJz#n+Qa1ybEl=Ho24%vt^3?*Yl%g+&bA|8S8q6^G1@!ym~*;hh(V1X zx6Yv-Gos#AthmNq)M>TufYs*)admOo?pHSzq>4VS(8?%Zy1##Z6C>N(73^Rv?Y)CeMM>6*4=01^e?KuZ}vJe zU;6ii76p~5p0>MJt~I%!5p6%upsuANZquwQv%4!Np3Xeh%roA;@cU%#h2B@Wr+z=4 zI5ELEDEZGSk;V%9Pr=2_Y5j{|j{Ow6dFHkB<%_jr(~8O?M}IBO4qtg*DF-8Z7A7UCDAvwMXchR(Nft}< zbbh$1skdUw_lmdcH^1HFziL}tQ6$HQ{=P>7pB6kWDh^6^PoK-H96aOY4zuGPuTGvc za+Jj3}>jPN9N~`4p_s1D7 zUeU8(Jxik2tWH!3-EH0O*_*Xd_4~`Mf@RvNuebTf5%ME$2Z{B>7aSn?H9uG-bbF_B zqvj&A=e#|2rXQLq-x`;!+|RqjE%SJ{gGMBA&EEM@={hwYKE{)(Wb?we84Z;uk_rC< zl^voowYmhVM6j|0@U4HNvIC#d89`;|U#}Yw0bX~J9DpptQqjLokR1ggcmiXQva$jO z#)cOw$}24bhofTfaJGLgr$An$0NR~X(XXukQzR=d% zR##_UoPbYBfr13pDk<=B1nN7WQ3`xa6?>-!-eC_TP~QPXF_Nr*3uts{z zUK=M5f#ZG)-YkFd;JVOxx7_Dh7jNsWKA~pqxI)Ef&M_Y?fkLUnk9*I{s2C^2c5RDq zUznPhEuvw@wPt~JX4sL6S+d&=-|O*jefA|!XI4mirAT~>-mm31dcObs#^d4>bv}dV zP=S2k;>FyxA*FoxGv~j0_1Wd<&E0YiOXO~T*H^FUxv=c((<0)Y9Mj`Rrf}$MiP|K; zcCx?N+{ABgcIVA64$lW>?vc{d<`-)m-K`#8es6bdL`AyF&7?v;%c$;A*>y%1XVc3c z%{wSETSECochk3t6M1aA>$;nGUOkfPIJn8!$^WQY)%Drm-QS6K z_V9S@N}lF&4*u~Hc#sKB$(eV6`XRD-=g~FCqhYv!%@f6<7GUQAIe{g*U$Pc{p-LXf~)?U z>Ew6%yFTAa^G`lg_hE@zt>D3YU3=fFdWy$*1694N<(|a`^b(YZddTl|# z*F0t8ot_S7o?WR}b@lp|)oo&uEnQ}NVc~=hVm*0Gpt9hco-|qL}wvJUtH8nco*8c8Je09}r zU6oB_qj`bqqo6PKwv|)AC7q7ikv!=}O{|I6=Qy)c%@a=>eu(F!w(Q=Vw72WaxzLif zB_`X~pSU(HJnHi#{-UPOAH|Qh^;?%#l`q?WQ@o#JflcV_p-C+Td%SZPeyKPtJ<7pIr%gB%5lH@5^+_`%()oaPC|neR|P` zic!R$Wk*-rdZmZ)Q1$#Ao@T1?>NJ&l8HT5xtNg zCtoO_Bzkc1lMNSDBiBsk+_ynrXOeWa_UQ#W6LU9BEv@0z{lq2vpi|P}7|-dA4GVl^ z9-H2t@M2?jR_CwVZ+1Ty;nPx@cdArxwa=n0Q=iPQe^hhJ#51h-Ef1yM>->>32Hdfl z4HvC<>rGx#@;a@-E>1i1^p4)?ll&!2r|X@aW;uEO;jj4%{9^fR#HSUt1Z#a%{>14# zclSr(#UClpPhO67h_N)7KefJk^ZJLov`v56rQQ;(4vkrUZ>mm%@SJA?N&W7J);@_T z_*5u6Uw^JwJ)dNLBuP%o(_iPIoWtiY$4vGsE|e;Ad;U9fyVj47rFG_WGp@V;QsZq) zJar&nHD{sKfx_n-(iNn5xg99^&&-TN9X=g!&1kq|F53L1D3!m~EB8pP@$3(o-sRdw zeH%;4dp!NtdwA*f2+UL8^d{-l?xOpbHb0KDvz!<11;ptRW`0{oXO7mfJ#*}Z`8Q6B z{FHSs=G2+A660+jT(p!dCS~*<%@%o9^*f~W*x@rRy}xz}+a%w5+xA}h-Eut<_l`3s z$AUW6wRX;pyWJJ;t}|+I_FO@#;4J+TmHOb<)OmX^D9_%&tN7tM=bVnLgS+R6lyCP8 z+4N^z$HJ_OAtf!Er=J;#NS>H(!tK4kNyz_lf%J>j+9~rkmBdw4$BN`mOZSsKOOkTt zi(2K(`#|ZYmF@E%JZIb`T-SCM{y3S;JH1G?cf-=Hl|fAs?KdtQF|mIzAzu2x)%@|# z<4aTy{eD?{VsEfVjqTJwQHonn{|tzM#Wl;@em?Yf*&Qf#WbXU35d zfGFn`PMR<;ET>j9q`zSN#E6CaaxU@4_KHTNm_2bzY~TI)@rSb6SM8HixsNJuo>|}G zHs0z?bLbswF6 zbR+SZZ|m1CXJSW-uja&O$KG;Qomy~TQz1U6OG-cEz}M`wn{6A7Mb>nQd=gArS;#eS z>AvGP-nk{~wu{|Sxj$9yy!@q;n=eq)z6JKw*G~w|Q<3EvK!mQ@D z+8jFYI%kE_oF|u`)>T_}=a*x7&Yy@3^s`a;(Vb31{~4oVLiTJXIoKxO#G! z!on&ab&pOJ($r#&gr{}7@|r&kF5fOb7&337roy<2(SHObOJWPsEJXI?ZVgw;wF_HQ zweEUL*-r6Jm35!`ozIW6s8%)>j{R`|dP?kK^XL`HqYVV?TrQazTb_AZ^Cqt4MU|7> z{Tcy>@}#|!3{Kx{Gn!zKxm)T4W`fhy`#G`r)gYnR)_qJ(#2YFP%7&TJPO ziQ*S|FC2Pb?8)oPtaNVLFLkrHjmKQ6pF>Ba>*+hA_$$4d`!9K{b?3!>zIr@AjU6m*WKio(cOo9wK2?&8p0VJ&RG{*oO!fU7>vfDZ zu24FvJ$|-rNI3J_;^Up*mZC4jm>JCh_D*qOIwva@#5nBmo`3h<;%s?s@fPD(TlII^ zXy~tK{86R3TPk7Ag$3$Yrua)q2c?y~wzbT%xZ(ab>vyAe-p+^RmtP3B-pSV zit7GbZ6Sn8P5ot_maTmyU3T?W)0EV!Q^Y)1y?rHC)%LRkpsdHOiSa37=61uZ22+o= z9rQZ$sEgxn5d^q`R(;_Y>>(=HCQIn4{qUS4D5Up&^@|$|_sg9d!<|Q{=6_SYe4WTy zjW3mkk6T;p&i}EjK3eyF;{Dy4`6_2c_g#xm`nJtd?D&;styW8`xMyTBV-VQ|VwI`` zU@pp`H5~}N-o<3CVCaSgCpE+$KOB3v=J~|OaR=Uq^%q%=m+ZQ5U*H<~!J=~xGKq$F zm!{Q?o7bL2j@4eKW%$g*bLOESip3e#`_>brMxAqb`M^F^t+0}_c~ASkK-JSqO&=V# z>050O2bH_*@`rh@`L_}zcZpBGJ5PE!59Kk(xkj_Ct2t-g&rPJfi!=Q8d9D2R8Lzwv zFPv?%T`nt9#-vM1)d_c|3f`5S!tw6G&3aq&%ZWvqJim?j-)VhW$M-ttePl9MXYH0U z9gg3>kg&`1$6z7rcdL2kYx6 zj4_P$;gMf>|Lv1pj|+E6#p*fYS8s=b2dNJnas|(^uOB_X!&O{_*H!JwXy4rtKSPPf zPS(`P7-m0AY4hFL*7vED^R|a^-df(CDSoE$M@0ocoDy80v#Dmx#aUj4=CL{{4^~d# z2-SP@rSnUWK0mk6jUTpGykY}4olh*@k)yxn&yopQKd$aIH8;KcCglvLefpvxu6%2a z+U-XTuWC&7X_nXY&#k?cVSD`L;ZNuM@?J&1_U)VAbTutHL40RH%ubybyr+4ZlnQl) z)&07T20KV;U9(%6LYO8Z2kOt*3HCZC_BJBz8`_;D-t1}N}IyEo9)jl^Vyg=~6 zhM1EVuu*U#-&3=enQ=UGw9mGg^4wn)S{QCVS+{dRUddBQF6ryqtw%nV zE}ZRXnV|fRo11&io1qgN1wFEoCEL^%{ev5C)(6za zm&);QbzBdf@YrtL)ZfWxTZ{Yp^CE>8xa?P5JBC9*!dT`|`1voKPIn$n76=KIjVFq1p7ZaZqvohcW$K~vk@cx_E?RWL_MMy8L^S!rcyb98*Qswo{2@)Mn#K7*;^V&Cd z3Y1SzywbB01U&Wp5jmVbNf zvrC!a>L+V&W`u6G9V#*;UHk{KAbABe2?9-Y|3(r7`*{A3CqbZ9xdK3_DPqsJGG-m1 ze>oBK9ssMw|Gy*)MAC3^N1$!?UraT4#|mdEEeh-?4JICHn{61%=qDcZgjd)ckw{P= zlBpKPq8%g|^v^|I|Dol$&8DjZmvjerFYQ}XQ@h`NTD|&&Spv^W@^1+qOrErF+^ov^ zV=igVoUU*v{GS%PhI~SS;tw zvblMqPyBH4@VTrOetpcS zjKmpN+-5dLkLCDqxGC{?gGx_H(*zFg{hZq*&K(L=ZZ6Q{kRtT)QEtB;(_*-ki(^cM z6!ACLk(jgJWXHs-M3HuMk8`JZMDD+N>ez8d5!14q+AlNiC;I;$-}JD4XR?P(X57!J zn+ZSeKDv{_|JMH7TDkadwU;J|>}dMj{*tJ%Gg5hDiJi2X=>3QYjt9kk8!Nv@$Zl^e zG8^}0>3eIQJiU2gSqk0qzSrG+On$Tla7Mvb3dN zXFY#MX>5P>tB1Y0LB>VdGqn1}JHrf}XZ;w{5MgSh-C*t~zV<>`NU?g>iEv9^ej<78 zRu29*i`QzK%WOS#^wBlx+ozk9vm9nkl|D4n`k4M(Zp*!5Hp`D*5DMCSsIu0yK6X<@ z$ouQL;(VMj%Zp97a(29)I{vlwsV!mQTevzd%AG5=wJ1}+IwsuwVu+KYucdDDMV>R8 zxpcmmj`2H``K)BtuPN2`c~;kJ3)t~`+Y4@w z-o85SvHB}}|E9~&vqjAso6gtgbKWvf*Q!quy*;n7V&&`9*0PC<|3CKLGODg+TNe!y z+=9EiyF<_r+zB3Bf(CbYw-DTeI|O$P?(S~E2@v#6$XaJ5d$HHce&@8;?!E0celV+Q z%rR=z=%Z#;?_d8uU+-xM-}?6{2FK3F7+2+e%5cxga+SVf8B_Q7U&@?O+3WZh%Bi=z z<##7PvvJYl%-~f1VEnNrh}RUTp`}@e@(3xKlAQwP13yiX4;t}UneXxPH6)MRcVBZE zrsrcuVsq8tOzrKG?+?%dE6FA0r;|2UhCkh#9m!>tmr>wKq#EbqNtziIg)6YKc8`fE zpYI~o;pUm<4u$owNd{Z0`k+;2dl$&Hnip{~*Q=Q%;`Fqr&%}AwQrw~H(vdQnI!J?k z)3<1cQN5EP1`*e%pDxYj9Z)60P^Mxkm6#yHn5OhT9Ys#5CdU;6t@mDlj#_ASY#k5M zOYpC#A;*2UC#3-BWLODgb{TtdjxOZ=;oB+_#FGVRJ-DGw8#1p`FB1`@Ndu%hB*kh% zjA<$?Z{vh<jPUJEf=-ZYJBm1=KcE*T9B_QGJx z6JZz;Q4Ad0^rybcsCUjn8y(YFShzcoA)Fdo?ni_0qeCo{CG<8W^u=Nk%d||0On;^wYQ|V?x@E;sMmqc;UJpc9`^ zB*O=7jHBbgcp%=KS4Yjph?&hMi7hxqsh~3qQg=z}eyP!)2jt2uT*9w)ecLPam?^=6 zn(I8roC{g#itb{qLJPVv-Q*H_*?*MAsMOENVxt;mUXh_fU~}z&mJ};j!pe+*gK0T2 zG12q9f#8tP8gRYBWCjZ4N$-Z?zHbrYhFew5XGiUH7)4*DRcNd+r$STB=xL9nL!6b& zmzqv0-YzzL?^8P=!m0PCJ0)4g>>a_VFUXalIFHSoUl~_7*S>hRp&ee0J&!r9Q6+nb zZMa}IV|1v%7Ba_OJHOT`G{ESnBYW&nlp8`SG3hr52Lr4AzE&hCTAT!JZ>*qrb;S8A z`xa#}mTw0rYv{ya96OJy!qCibuV^yYL>ci zN_4GxVB_y1L#|{%(pua5QClTW|Drrfhm^IGU9XT8u8bn}B-k4zVH9xHa} z0EwemJR#_t*JZ6;&k{S|RU}9nBo4f*iu0wE$fs;GNRJSfL^MUM5RGW-&qs0la1C`* zuvxwf=(0wp2&?MNhfnSk3iDFW4LW;$sC$X~WIk%oARB03eSu%g34ssk>q1!rvFlZC zdl%QGUf2~-QQ)WcU7^;YM7~MXF-X zk~?06F2*OSs&AG2jg4ngbd5Z(Ut(m*zf7T%`ZgNAHP%CZs|bIqAG0VXSLeUz(oVFf zE@I)ZO~-v!$4};_heigrBVy;Ye+j+H;;qTm9*!p-utqn0OzZa5Kf0p~6esu?Pbwo5 z>=s{41ZrpE&1Uc$SSJ>yc{Hre5*PO{2Yp^wcQ_ngWEB6Yk#us`p|qEHS>E1f<^16D zXNKCl$0PQzS4iHPjN4pb`xavzcgbg~yd@500q2crfv%cP{Fz&GAgkZWZPA9Uot-XE$DGh|X@L zlQ|g~M&VjyK5s8I=HeM|wH@g_AI`^24%@Toi>PRb6`>GS1%xaN9%8FHKjA>g1 zF0>^zyPXM()2QRkkF)nNFidlIdv$Nhr}Ij`lDBKBDD$&Pn~oV>Q6Q{8#RM)w9&wR5 ze87b0JBu+PXOCHCG0e)|v=3lK)1pOSJTY0Z;EfrbY2b~O%wmB7YQ#b0nnLg`G`RFe zqA^Wo!>a~~%7wBOp{Rfi>R=}$?PyX|RN3fP7g#n+)lsWWxK~P12Q0ZGY0jt)9Xvdh zErRy&qc{8s)zO%{JQ><#6V67(;hXH+Sh96}!uE?R2=E!RNR?lo#p{KHpkr@nR#J{MH+sT~8;FX}(tbu^6hf9_)#F)wRnEW3h93~Qb)+_Mt^y(MMULWBLjJTbWq zHw`#Z9vSq@CNb4~n<*uN0a?6=fstHMn*tvxhamJDU*TLOIVNhmC}`+F7{NlHQ(VGM zT5`UiWb}Ej=Md&P7_sve;fgoSO-CXwhm6lUpB+>|F!(h?oU)7(f(nJjYAH@ItgoA7 z2`i>=8bPu~8^dsX$24Y$*XkWXglfvhuAjM?m~5bWOGIP9)X$;nHKv0hDAn{zl^Rvq zsuFbI9nNE^P)XUk5_D=RX02?dDa1~lKbq-a5;k6%E;l_0UTxDVJ$5k3M9jq&TEM-T~ ztxi}*eBqu4YAm=Gb4r}caW%%R#Q;Yxk))Hn4y zxL9y#1ku1>K=(_})N65aADOUNdi#_0$C1!K(UTY)LBu4Ad@Pb6@)L`QU(#)FUO$z^ z{ixdW2YmQ1ufSg{fYJNd&H!)b=@S_Mgoymsx&UfIfbZwCwcs04*XKCIIIj08RpslVM|GpanDl1bP6vQGm@j3mf|bapJ?*0Q*CIK>X#0 zO4U#7Q;#5&zuoqa@BDT1fG_@$BqE?~t^aU7e7YwF;lH>c0aT3-2R)1<0JrpSh#LXb z@{ZO3KFU887XT!e#sH8NfHRXHK#ipjpv;uE($lwkAmbzdlkX8wDQ|0OX{!Gq$@Zv* zNcZMJm;;cg!b;CbOV0ur62L7By?Jc=lVj^q>EbuA;f!p*Y?L)32i|qyBl}+Pc4`b# zgAGXM(14~7AbiPq$(#&M?-UIc`a&1g@j4@0ep_H=%o)HfYrLSTn#nV4&(;UW12aqR z-`BtyIJ}k%+hZl8dX>CNOQsE3G$&q7gPSu6!<0w)?8-A!vte%eC~Ffp+^31dS1R!Z z+*BPG;%w2R+nP@o2vL%Eo9FPA@bnu7f?;y5&rqRLZd@9B2PLc46%dZ=)V4&1zQHJn z$@D}~K@45&3X)^YNolh82Yp$);NMBqa|gxYP;~XXKv2RX4+aBMka&bBPlbBy?Z3F+ znh&An6_Q6;L?;dI9Pz3k*9#;1(h4S2L#*#&W8x8o>-u|sZk;Qco&i%-ep#X%aPoIY z+D~rqzh0Stp$G*efBvJ*{K>BP7o{i7>px!^J#B#D0_^BPL*$3r65!GP#P|6_z~pCZ z{wcuuPaY8lre6|;75lj0Ko}r|M-~gTKw>?X;jaTTD8AgyK^TI4Js>#Hj)8>8ml4GR z$|Db8b&w|zLO{7J?(Em{RoLXcwUAYJ>_y&b;#zzc`ZB*{1b0#&bgr5#)^<4X zN~TS81kYb2)>TUEPuCcyPAp(cecGz@!R@Jp5s` ze=2+Y6v1YBRR8(Y4fnJN#-rrSZx}uU!%ru6NYV)7e;5#u!-h7z03T11^_PmD{lDIq zOc)fr+J%HRsEH}!sC+`1IrRX<0&&=_Q z+=-$BAcdbEVtx-Q7^vFE6b@nbcK8LVH%i?qbd(pRxHX;a$K*C1M3pDx4 ztU(U6tSiAKC2aFKXs z+`W!?-jN7e7P~d--Szi&O+CFH6th|;O z!TuN2o6D_ukr0BHqilFj$K`kRmS)oah z%k)k8+~7@vP_PUAcCEuzG3TeTFCpS?Z&4IEtS1l%m7vKdl0?$l*9%w2bx~at8`(ah zM+>Z%$Bz;W#%?T*xg|PXZ3&cYHo>{f)=@1Jw=U?L!2n8!|TR;RLeW z_0vd^%HjPUq6JDkWf6i^(nsThO$nIa7n45UWi+uIPyi(%m8%yx3=BcGx-p>FVxlf} zu#T$~<+ts9VJdD@z4~rX%-0P0%|H~#F9Ac1L4GI? zdKl0aXU#G^gmPokHFqJW-1}xRXt_NKBs<9Tc!Ac})7uAWu^=6y+U&>|aXjKi0yM{O zsRKwUu6MOU!mMopUOtyErl+fwb|Ehl6l&Lj-o7GuBJRWdC_DEXhQa=eU1$XT=;5Jb zryJiFR^tTlK!=A8QW1Wutmuy@;%j9#wXv7+#{bsrV3(GHE159=0^MI-D8d;r>HlcZtDNg}4`r1PN z^+|s)n>jhcu*))IAY>G?mI`Px|Lz&|o7f1<+eRIb)EaR`{s6V>Q&G5ifVhz6M+$Qx zp<&B8RDR5Im}$`&G>PFo!~#^IXrF!a>a6rFV}wy7^ox3W4KWJLLFKCGVV%-@WcjNd zkPnMkN}R245RA6gl8mW4n(UldeiQ8QnCTK-X^y1r!4wpD&{LYcAdHN|pVBOU%R1yYWhsK+u^`bnHeGFq)BLs|M zdU{L(YhQCBoGsGF;1SI%l%?F}NPV6_?K4^mAfwTBo!{K8QMHKN(G0Aux8S(&J1e=c zfjG1j)0DKalhQWPJIBqE@oM&g(%%6qDPWBhu-x9RMo23x;AI85k8gvXzjlA&>$Tlyn5>_z zlCFhLTE}Ii#8-&yC-}ayAt^m*!_yl&KZ4@^`^>N@`79Zo1jh%r3+=J@TeOKu2{ia@ zPj&7mJn0_`pP#c(SRN@k7yx@28UU$1Gd>d_XPx0e1&jf(OL?eb0%+|4c*Gw*Sm{F< zJf#lyD8Bg{Q^CK$1p3M#TL5Uz5lwj`PY+})YY^XvwwY$0gSxCykmG%*Al%mWc+moh zQ%3Hn)p~o^)>q?8w&mI%cqiKqu;9%lwwaM^p1R+k7JC1$uWBX_sV~jjRzimbA*87$bOKUrX+RPf-LkHpuB`{Ci_mvO`;@s3bD8WJ zJr1?&M;L-*H%y$-Znv+Po@f-1<+$S6+y%5+K{2mMkp zj*bcr7+jMD!3C>I%~<+e@cyoDdU37pi}VvwfBQVW_3vRH+}A0O#=k7g8Sdm#%txMS z5|&|Jt@kz5bd=&3UX4>(55sfCQHgjKZ;C@X;~iQgc*ES;C`?^Ra7bO}XL-|~yHn-! znc9j!6Mr{{uPa9{SH5C0f_uXmpyixcc-sv&{@vh|w$H;kaq*k%$-&&A3pan@_>J*B zkiN_!@Ka{+o2$fs@d+qK@rOMpczEf&pl!N=UvNuHle&-G-^~T)E)4dHki3?K>PeHZ zOb7Xd42+4i4IWrDoGx<(SD0;+v)eGNF8$&KOzWP!YS)fuXgr)e&xhji{vlNpGaCnU zGT_LHkrmns$MJ!rV&)m9h3H5#35Hp75HaXj281Nv;z|x+lVsOKvr_2JSNv1T%$F(Z zVurfz)5nARLDfYDD!lIw5vG&{P2pbR>tpbn6J^s{uaO8^zWZ3C1`P8;(Vbws4$mln zecgCZz&b3YHBzngnz43iYbNzQDbewie34ZBx1evY%92!fFq-EIVgl8KZb5{daEdSF z7j~kTeHmTX)OW;ghswOdPov$&@Ro9X_@5fr-&_VV{<;nnmg9=*q=(qEhN4}DVPs7` z)iX26q#dX4!ar*Ty=n!*>p06}vKF||W_!(Ib35z+Jrs*Agpg;#@?FmKE zZM=^?_UO+Bj^FJ>KG`5>m5EdPifxW|B&WoYE1Ygmz%MlR zy6s}hl=GhF4hSsAOY^Cr{>|KOHilm~?i3Zpqo~;+=BFrXJUC-qK$CKC;OM$8mN@z3 z22SC`AV@?7__Ifd`HcB^AYMnH-})NHN0Z-P$E{RMs;U&Lx(Nuyl+H#7BVMAzUUqL^ ze~E#oOz~UsE6sSx8QSk!=u_EbID?kX#R3l7bq&)eVi(mK2}+Gw-ay-86aaq9o#Y-z zw!9U|f#vAR7llv9cn(Z8*`ne|1kVu;mttG|^#WMO96c*%_W2br>Es)k8?%I@o>6#R zkhXFCkH@a+HDg-tM@h*AKt3rQqeg_a3&Y{EP)i{&9Kstqn5Mo&NNjW>m3clK1y-&1 zw{e{dW&AI@m7eR9!w$4XavH}SwaP7=0izaPd}0Yr3hi2b=U>E#Ha3*`+{QQQ^^86z zWuj$OX8m46#)2{)(WaA*4>E98)flJ?UZIk>m@Sx}oE)~?Y^S>H`|iQ~{>2m+zUW~V zn3$$rzJRjxkL0+upV{&2uGigzz!bZ`J7pE950Ah1^~Q`yo(cQFqbAi?{LOX#>$EKQ zTG$8q0~Ni!45o~wg)t(Zygg9V*F^n91Ytag8DusdwOyU7TDW|$I9H~m_Luon2JljB z_n&LM#c+4d-=Pxb)KvxC9A2 z*r;E3E2pM8m%ty-CKkQ)HGh_Fucu&aQOe9`G%;;Bl_ahCwrdw6&$=|_W-hfD#nm*= ztip@|u<^G7u^y}-$O@27HJn;5&K{qkBc-rhqQ%(OlpZO{&*T2mP8Q$P(N&*{W&kS< z-QSlq(R}16xDb5;i)Vgn84j5Tw9lXDwu9MM;^)Z(A)qTd0Fx$}+&M|PZ1>qX11B=t z?@E8|(ptnq%|v1jwUX21y3fhNGIHBUT{bkODzLy+iIZ_I>G`La!gE!~;48szfn?w7 z)Wl;3Q}?fLPH%2+z{w?)o?v=rdDKh)jo)`BhF>9|BjUmB_z2IIuWz8j=LAQ%=e!`y zX8GW*wJL6b@}$b!x&q4lZ>~F)>q@~lqWgUuhx0kuUO5ZAoF`U0%bI${k(5&({o0(} z2t-sYCid=F)q=wg)o3DVPXC;pH9OVAT40+D>BofKG&E!4l+bfx>1MW_?5TGgjLE z!Ym&4h(jA6L`EsNYNOqG5mw|di`g7Gv*xwFbJ1*bKuIT|=#)KTL1c8>j2)teAsFaj z9DYObbAYe6i9}zb_S;Flb&Coqgdw#)umfT;8L&fD@SxY;w)(T7ixJ;vnwul~M?`L9 z9*4?jyq5^B2rc0`+hWgNei+$W);$w`RuZ(W`mDL*l5pHEkOevKnP#^;>dfqNX7uno zfWEKa$pJQI^MPryT3j6KrFucK=@+OiGz`1Q!Kdb=pEeeMIfefUCHxVN_)o>L0Q%EE zzWE~pBlv_k*5ASM|)USTnJpi`; z;4%MeyzyD+AD#%H{%`76zdDfrbR_@$pMmKSlK6Ag|JTn9Ke)tx{yM`C5BJYifL$Bo zqn!G$mA_X4II(|lA2P5oK5R;U{R33~TJcc&v6cLL{r_wY1H&WZ+TTyg!1n0lerR~I zdp{cf$DYCC>6qvr7QR0|GCgcO|Md?LmHcl}G5&Y6ZyEl(C-|REz5#%7|2dn5>333? z0Zxm5KFj}fw*kC|&vR*kb(x!e^oX$vgRv z4zK?mg3JKC1mFh$Sm`|FYh`#CK?VRl01d;#u}sWtfB0GfzqJoltbj&lz^@nJ!@u#h zve5sgd-HE`T+wnIhDR!PK6?UhjKNd4Pmi3LzBy7#u?*hS-YX*kkYIJK7@$Z9+u&%0 zQghqL@V@%s_cY_WAs*E#a(|a~6cDuN*Yj*;z=46qZb0 zW!qY1wQN68iuU$fDDj1CyD#sXw8kdD+8hBDM?FdBs+=d8_l?!@xw1m}j#N^eN!BC) zxLPlL**Lmy%L075lA1z=r`#1fBf?Vp9iOe3)KwO^Mq0lPFS?7lwqJ%go4~+|fcZO_ z8fUsM-T;1=_b@B}+~`X^96phAN>h~4#6h#*59kY3r^zq8aUgi&4`T8NV5%I2wwvl8 z$8bVFQd%E!68Qw~IP=#xF54Z@9h4C%R#V$sE&x#qhD3ZS$e@!wI9efaG{Q6S~Zc9e5 zFebANWDiv9vuF2l+Kw%yTbK;oEL3>wchp<5AmUb>t+0M4OjxS3XZuEZ8&|W8fwAnB z+PGa>B5l}OpH)XbbCm(h>~j&aS>$gQ-}bJcD{QWw$m?gJ|4q*_Am`|3N3CL{xH&Ze zjPO?Bs`)d$wRDnqU-bCmv2kQ#h8@LsQ@CO=8elPUW_+ z5U#Oh0>@Vt&Rj6Ys5&cJ^)emT78UiWe$v`JPi#18kOf*{8Qs&(NqmWZPA)c399y4A z-1%N7RcXbI^F1^)V!xcHb;Am#!MA{24+ibnVH|nse!^}R8!m&*QwFQbeg${n_sk>= z#RN{-5Eb>qDl)@l^%@^hXQ!_gsoX;E*Oo4UY;JW8pV*20yodRxd5VSUmlzK~0ik%F z4`LpmfZ$QI3BUCoxzTs&w)%xceR7T-D=j*CTG|VFZD7ncPcdM2;b$voaLitiOSe3h zPAxof`(#p;USe2IDgFJxBAjeO2q9y;Z+f;3T^e}%V!2U@(|xF}S}+_k;u(yT4GkQ} zwBKj7vvA)Gy!H=pe5ai$PaxdayPn-0cxw@rq$s+@?Y1sxGzNk=5hS4CcF6WSFq|pxx&9Ak(rw1_uayH1QzU1gX1XSvEJdi;TxO zLun4VBOZ%;a{~iX{^g($)Sl>^8Usv2nXbo1z`vLpL(W%_`vi%yt=WsUE84~;LC|{E z$S1Jdv_DuhT|38c1Mdc90(p>lUY%G}l36z}uKeL-vHASyt1 z)#r{f1$>uMRzGWTH)Q*b|a2f|!B>HX9*{!M2-Gt;jgW&i|>`p;*K$ImS-*$^i@bX!fw zS5$5v*h$8eo*0LK0KugohsEau9C9SsDdP!tgCYz$oU1`g2%E1CHF_kMJ3!}KUpgaf zU?3ynqJNewFJ#N-^ZSAlvv-Xx>-~{zJGA>dUl)YO?xrmWd4^EepU<;GO*6X{G3E_|58` z8?e(EwlyUAoS$iKu)0+5W1^TOMYr>JNRE~ZkNZn)lmxW8V#FefL^~1y9b{A=HN=5{I2s+NE2cZyEhulD+q^K)-|`-GiSeV6YRc=GfsxnyU~ ztPU`F9n29OXNKap3TpA>XAN>F+f6z3!#YSEHVK`o9@p04%eA zdBXvyly!WVIcuo59>{k(sbuo<79)pua}-#w4a?;qrlY96vOvJn2yC!dJjfwTA>2#T zUzEaL(u}{C@R!!Dx_=KNo_p3pF)Rq9x2*r24;~LKLB*qV^ZUxjwuO!x9fMeP-TI_> zvhC8td?yrbnZR9YOSVwOIwkIR7ofUyI7t2Qb#qC3Tn8v`N_fBVI$pq(7sQQF8@wpT zxUif@@Sipq12Oy9xdOZpzhWNXlPH;rm`I!fvz=WT*_+$w%Tc7R{91b84Ni9LzH;*G zQ7<;MN?94$#fJUdQPYc2nj@Cyne%NP^%&RM*lGMC=c5)#3RdPCy@WV&&!a~%OE>~% zyz;<&C@zM+4y_nEvmfHA?iwR;+5d5r&S{KH5VtSvGIH#(;)qABlIM+S& z+_t^(gW%AHwZbw-l=Y|@VZG3?GnO2~zT zrV!-Eh+3btsl#O|X8&fQZ&pM|Cs~{3FZV63!S_zik=OY`LsCWg)*&NsRsp`%=uN@XCk!mY#PC&`Mei|jj=zZV*x|- zlH+|V3Qy{#dvxSg!^%}i$;ymx$Fg(HH9$lF^|bzTRK^l3Wvz~*WM|iIcJ{6C4OmnZaf?8kvwV+bA@oC2O7ydXDP&j$=(heL!@`0m-?n zorBlOuKpr{Zp)=}2E*REH&EAAyQhMnzDVoz7+p3rTT{*`)G(@^dTTEkwjtV#Sy6hG2kJScjacAe2>HJ>z_eK3O)Ocj16tw5bTg>>Q< zZt!zdapvHQB~4-sxq;TBKxjAUttmGlfW=lfUyY`sss zTe`|tcqksXPqSzRVhB`njNlZ^N)@YmnnYF{#uCl~`4_n>+rA#*AK>lT!FAS>nmIc=IxHr^=0IZg)%V zH9R#cd+?}x155E;$8~qijb|I1-l6eWdVj7&EEO1YGv)}4$cQqN>82GxpH?2Hs@)R1 z6HG&Nf3RQqHBSNe@`4?SB{Es_7dDciTbp@q*y$h&f|6thO{OYicyA=Kc!X&i>Solp z8ZAkO&<6#$8`U>4@Gr)+IG-A+-}I?5{!4CzoTzyRJPZJs zf;hPdvM2{(U!bVE5!4o;HVg3BM;QMo>MI-rE8&+K?{+`szsvdHM zW-X_~u+tR8(cv@Cqc!<71(<{aSbeWe*CJzAT^wqT6rAV6(~HiBh}~5l+(R-dHunxC z$4pJ#c-!_K>Q9aLZ~CIxf7$B_hw#IB;3I$>UI)3gWcliQ-lMMp-Mh0G#mo^W=Mj4a z1W6X+WEeu!_h)+5P|q^4z=)IFs=JUTBN4ez_m&I4b#mxJUYyd-!Lb7=UqQ=wqGOLi z&EG&fF#L*k5FTWJ0s)Aej%en@L8CLr>KPv*2?Pz?&S`-=*Mnct>x_Ho5M#2?(K~oL z$Wo&Om4v9~w9zbFm-%PfhV_gO5KGH)go$pNzpl_db;ww*=)~Ce;Y1TdDeB*n_-;^B zvUk6r#(NTrw_Z!0{8X=h(|5o?|BGu+7{HGYAguy*mO6%pa0rT7oF{`&C%>-tL}4#J z2x{l}fWK}eg^~oru4$ft&l}4z{0ccX?{K@Noc7jLC{1!_v``J6*LFgF$g(mLsW0j4 zGE1?pwO$&@Mc&>d?Y*M)T4l8>kctrD6NqUR#^2luGqU^wD-o8JH3#6@u7@aGJl}W{ zAPkNf&x+XJFHsoJDh9nnEH%x{_rXWR`#_!R;IF?Tj#b}owOl>oC?vF=Zw%bW&6x|- z$IdzUih%lhBt27WXE^D$V}_Iv`psBmVqo@ge)}dkCSDfk04dS!{%5p-wX~_L)KHem ztddz%?6u$+7%|AY>OCY(&*$Nw+fN*R!&l+s4QMEL z_Kw;C--Eh_KOR^|yxqNVa{5AxCbfgN{FGt-=EjAI;g?Qoj0^;M(?5WRxP`;^(}m26 zG$1@#m5xeZ7S4f}_H2Vqk~8pJo{J;ywBg3ktw~rKIHU1q3*#5!2gx_)G^OibAjP9Hms>^|>(*P!1h@jAX$-u{NKI)oz2Hk8v!mKo<0O|4?ruOWTQP2be*g?WO$`5k0B`930P*|~ zCj}^C{^#s$ER25yCVv}v^8<0g@)%nCSMFu!#3_pZX*?tS00+_~s?fO%fWdo#gJXH_4kw0(r>E_?51*nYv zd>8}EWA5yU5KDGfy3ZNJkZ$0a(#MwyFEICgrwi041XMEnH&nSn~~RrOikx73E0OJhHS#*P3%RG zB_AA}vv078EncP$q-#!O+98Vae0s(WpCWVREu(Pl(G|9NP{4{nQnX1$JZ+b^lP{gN zy6AVl9GJa8!5I=fd;KzggC3^)Gj;J%$m_Shx!oh}+%L3)R)%ECYN^qqXk6O4IiA0; zh5qy{)>omrr>(t^_QUGkK@^#7EL7YE*wC;O_yNd-Negv)xTnIFmO0D5#)tl5Dl^vv z51CZida7}WQsd}R_b;yeSeT7i$)5hobjPfgla7jw9VTYIj^8Y{hCqmfcrY#HiDMd{ z0qIcLsd9)>iK)c{CmeHzplB6?^XSgau}@E}b*^_x<1?NIe*TbGOH`#ugTHqY|G^&V z-A9U;}%Ue z?r8l@Pa3zauBB(i96c2K%Hk3iNIMP<8%n~V248M6-GwZz;i&{Xul@T1l!fs(eNZgy zzidq<0U^(?e+0c~?_X~9j2Ecr9W=Y@b3WE*|Yp6@~cD$ZIIWGB{lvhL&e4F31LM>!|5y ztW-Q?u}K?AIRbWQpk^_VzAJ$Oznpn-^z}FfyJ$EU4CPrdl=mdi6n%7Ni>l?Bxl5z9 zZk&zYMO8ph*cO3PR%*W$y5Aa9FqJyd=oJ3$-nMp10Db3?Mc%YJDohV*lXgmqSAY}P zC)-|u{O||E!=>!JZ5B_NRH4+0#ZnjCYqX@x;2wT>Y;glF@a0A8QzrSF z&OQJ{@|S2DAP&3sCp*BM*Qvw1cc_O8?p)8KaL5uX^??>7$vRLy_@cEURzL}fw0vIL zIDpBt9j?r_L`vCTfM&?=W@^RKBNw-Sxh}j~zg03!f`>C4}SKS*!HsP3OjcR7ZzvXz^2U0-wUcHxVZsl_r&50!605;UTV@(Rq0G8N1l zA#+;tZPuO;c1R`N$5)k|_FgK52^2*=k@b{&)a7L!CSN1H>B(Yhp*6ZgTp9|Zk1qS; zp(vV2Ez1an8o~AG5oYCx=%Y3dgyNuxvg`zjO|+4^m|bFxAlgHlQzXl%FvU5lO3T~p z!!1n_O%MyJuGp}wOmVP}gl8>;l`1sfq3|jxEGs=LSzB6BvI}fIWKcm%@(eetTGfYZ zMFQ)b6_%*gFf4D}>3~|&+G<>gS>^Sq4IaH}1YH8WhAa!R``ss-oT%eL+Jc6@8VBE* zQ#NhwLt(8PMxdI&{WV(jW>xl&m| zIeW_l%NWtJs?NOrf`=PcNGy>p0b+XbXhX9{o+i2;FJLTfX-b|*Z@f% zvnA!o=TVbhEM=E2Fwt>ow|Mvrm;wQhb!g>-MsxWb1()DIN4wLMI+0V{U=77-PwPUL zs-X)Elm$w65*AX!h6!s!u%1T~FLn`y`2Z}h6Sod#KFWZFxrpTl&KXXG8MbqEhVb1g zWPE!yrbI!poqSNS8UF?PhjMNhmfe-Cv4g(p*@UWMCHCXm8pt?^DDMNR^1IW4Qh6PE z61u`KDZxD$7azW@v8H?Xfo2*MMfr-gk;fO{kxGRmxz*{H51exFIFa%1{;CJzN| zBi1F#MK1IL4^G|JHlNQ^NPSQHb$8K|Oibib2xi#Sa4pR?CWc0hM7nMc0ysCN(r=kT zD?YD&{UEI}ajr=U-kfj202808_#UB3lQ+b^Iy%|&l4^j!H3g1{|#JDz4F)Wg;S<42N zQ7b&$=jZ50Tpg>O{UI1u)N#NPpz>(y-U?cNKs1GFz({6|N%1{El3Gz;02=16&&zK> zNu!&G`w7+Bkjue(Q`n$;z3c_$^ZPvxG1aDA6VfY)Q{lr~Tmz!57xam0VDSyRu_b)<@M{)Cy=f$jO%a*p?hgvVC zIyYUuj36~lXT4mD6P?_}x;(ehq$5FHGX81?@A*YCU=ftkRGc*ibwmquVdt$cb!DRI z#O#J(o9s$(E*7q`x5GOA+i0)_ta~{kpL82BOIZEy=sx^aIXjFMI27u%7u!?av?!Q3 zbma;H2_-D?YBXYHL}Nzt|OJ zj~Q_mHq26YCe3Y~>fZ_NW-(5GxrQh4c~AH$gZarn_fH1H@+;;1BPSO=%)B*}#|oD6?uHX^o4|`h?h`{9`(p<(UzKr-(;Es z2z6&QY-h_bYfbl-+<9u@$|%h!hI-au?(0MJxhqiam&rKireM~xdBu<#TLN*eso>f+ zQOawkPMwu_D=dSH`@R$Kbmwj3%IC(w(Ho9f9uZ4uz9%)YGnwL5uHx?gzIyf5Fmf-M zlALQW%CS!tRJBXw7Qi6{&#oEc&;8CTY2ymylWP5UZ^@r;d#>B6sB(b*F6 z@jPB9eTRQD?k34HKXCh!VWXw-@MYXqA_=6aS5FPyZ-!P_ zS${$5X())pQE~jhdaD7j-aSUl!Tq<@(pvRnPKluPu(bJ5M4~OANpK*BV9PMza6axw z<;E=x{||d_0anMdZi_;2cbDJ}!QGu82^!qpgS!QS1b4R}L4ybh54%?$}882EQ%6(N4BxvJrY2APViD)sf z3@3ieqOYwu(jc3_OB#Z)`;0YgP6%$?@D79L$JfoH`IG5^q>2@2kic5*?Z!%i;$jgX zrZ^J%PgyMQTguT$xqJ}dDY;t1X>p3PT^K6bMr(y^XH%5m{FV)I@KwLr_;$B4ONK`X zt0Bm}kC4?$C;|7j!Qu$&+&&j^y9i+a)Dy}Zmx1fy+69Xs#7^8|lx9yS+wNgB(Q?!2 z9X0iZ9rXHZf(51qyN08xQ**c2NHU7(ZM255-y+(|nR5H|A`DLk;_}aDRJIH%BHW?xlpeTj&v>+w{n{sO-;_8oys4BxtcU2acVlT zG}fOG<6HHv-xw z1&wt1R+QeMr#Vv$=Csz;GJ!oeH+&{dZA8a{w^21Rqs}*^yLCZDw1b~r%hgeEx)Yrm zM(utOD^FQ(Z*DUZK2Jt;0ALpp1VWaA-X_YSh%EvOQmENS6jm(vEMe0aj!}2K zu3BFIRQsK-Os^ugvHZtKa=WR*9;dyr%qY3zg*s}){r(GWpdC+enp-4Ei0_n+8}2bk zpIIE=8+69M<*M3MZagqey4f|7xgJjP@T$=I_*jEHG1$od8;MTw7dbSAAbI58pK@rj zFTqyUqui>@_*<+|UCgc75V`y!I#|kHPrawJA9+rFeO8++N2^xOs$^l4IOJT$rS;>x z`g0o)nq+MM$LjXPfD{w`Z(}>)X8j~Z1-SwFmLod73K6y4`f+Cun!%bSHv^2@rOc8a ztwPZ@Euk)sd-iTzqJET3BBBy~fC4?;!a6IsAVBG>szAaJaeuq9O=R^)Z7Oo7g|vJ5OtL$;$PPZf55ivb!GKdQr+?U~P3K9gO7f00!dP z42$2Gl{{Q8)z=#ER&fxEN!UUI$wx}(*y-h>`fegeNwDo9WyZi%p^g2hxAXRLXZp>~ zSov|V4;v@)Wq_Ka2qI-wTo~3~4 z+(`lfDTxa&||(y@8n_x^Uhsy@pnj$uBX0a}d+y7s&A;3(bEyUHa! z!3OADb__d}iz95uLfO}tk#Se(smWqSACx_-rU#YCTCpC!9)Sl1wnz_DUzyOLH=5#_+0sYx zLpAulXz~THMiM&ql2hK}R1g%H=g*#_G+Aq}(;WjS4CsNcyyb@~*P8RQ?{J-tZ38zj z;&g%$&zYWovxW}|y9r3}Wv*!1?AqBcLT%nEn(Vxo-tP>inPI16&acK-uJvV~PUm`5>vfS;FFE^`Q8-b77EuG8e{076Acb&__`?nEnqW9yqat_bc2qGfeLr$3L94ikB`bL2h)2YGMd31wK*q4=vNLX5!AeE< zt=zfzjrroNzgukvXY|S5*l&t-; zi7CbYh8X|0JV2+aoWa1@woT8oxOvy_E7b(>v_x3NJh*V3blD*RG>7WwF%>ga5>CLD z_!=WGhOwc^nf*(LYjA*sw9q`xL?ulMx(JDfsKW}^Hnfa+MWo@RKy7I zt5mKb=CFA9Na&M}f-lbRUMv^o4x;VX9!wKYy%;Ql_$U{ZLIK$&3M&I9wbG6q9mbrxUk+14y>xk_;`YV3Q_Kx*?qhDqDP>N*mei-ck?n0_m_weW^IS#Q%069Nd7g0L3)8y7 zj47?OD2p~JCD5)J(SpOY-OFwqqSD*!)=OQ zos&B=-=tJondnO@oc?j0c2Jg`X1iy>P-lMN_PWwzD0&PT9zT5hJ22dTuiZA?8QxX1T#`n zfHb%5r;S9iV*%ntyjc zVYbw~i0?(m(g;QZ?H2ab4m@MlD?iqX@>ciKx4g&|B6!68UP!Bz5vr4V{_LXo2nP{j zBv?dyDKsuLJF;&|)ZF|Okq&l~v3TvP0yQE{737RRxohY7x(thOCJX zL%y9*xu6euZI<6MDJHWJ5Pm|F-cS0f8?)Bp9KQB5$6gcU^D^Sdt`)rJA#z~C^B7-h zpJfavsI#u-@e4<{)?9ChqV~`+UJhe1Zz6Tb_1mIEiu4LVraeCsPa%DG>Gr}mK=;j1 z@30bY&!r*Krt7y4`=$N}?g>Vr-!7*5Trbaa3#ZvhzquyNg5)lhVvQLx=zKknHh>bN zYhq1}OaZ@&q9jQ$S<*AenO*?+T=omNFy`h;7@o* z1jW$%klH5k_L(#A&kS-HeL&)<=5x@5l!bSAW#lWP*b~Q_Gq=<@zJ8-&F!9;;B}H#R z2R*eGF1k=XvvUOA8P5nmjlGs$U#nRBGqs8vPWqT{xR^GFjI#9k!40Sq&qiV{H!^db z%1V{#Fm{);gj>OHG)n8$%@sXjQQyBj^tm2FXtcOA=sDUt+%3Op9~_>MKFtE$c-=R?>o@K?h!V zWQ%nQumVD(QiFg7&4d<$)5PFf)a1jA@vz_7+$2X+<1NnsaZ} z$D{%{YUsZ|szujzVmnbLCqtwRhUCp44X&UO?55A@B|LD!ffY=yi}_Ua!cba#hKnqV z3|E^5tz3Yzba)p!Bt+i8h+b;pe87yoT_YJ0lIKIvL8oy0fX%LUqi8qTOVn?UtwClN zoOSfAuB%!_`7%S;uXqB*@e@A|@zQx-`e1fAAor6Ber8r9@EQI-|Kp;4_uA4GR@6VO zj|m-?5L2o^lHbXSJ0BZ8VtD^UG}BV}DyX;+=F0rsrX^?ecajd@j0hMSBXi|R?Pm-JW%SFP84swu|5@KXlTidy>WVGlgk7{Yw&psiLosKO> zSx^kY?~Hg}Mfvq|W0<^E^pMJQs%qMduIDPBrcF&3|6odaR#3F^>D!iGsYuy|#ZnK--@my7c4ac)Rd((;uEGK!sG7(%k{- z;>1y{&rtom#bLsgy#|&LG%3K%q3?E>5iweCkV6+Y2h2>-O~YEzIxkp8`dPPBqY_lK zmsGjgCTZm-gU8S`9TzE@fj%z!VR32P-QzJ^T&q5Si02;6mn?ZumhiPa@zDwa~ zI4^C--tXq)f@#{1%5(4z5p`)vhp4tnHQ2jIFAC)>j!Ll$B9~^!7>V=n*DveZtP4!U zr8wqkEca|b29-abuiPs;9dG^CAj&$@;>ImAXY*dz6%rb4Aj`ZUodRg;humbXfn-Nu z_0IYvMK7d~SuK>H)3x7^(u&Z}eJTj=>PslpU|MhsyMt9HsNlx8(9_AfTup?e8Bu4} z?fi8s8)27P0n@SOS=L;2>0i95&c#NP$0IJWW z&9zoc$pX4Fhkp8}%~w~Jsxi-X#4E{#(z=y19kTGfT{ZZo7I*pb#$lNr>t;_3$us_H zTjG>_uU61W08lFccwPX_T=h81DQaY0E-JAKe@lY<@!q>sL>Gx5oWd?M5Rr)gNF<~k zXt{b)#uwBPCG_q*(ahNAD+D`2AHsD|G^)kgZ8vy+nVFh3OPh)?dy6?dV|k1e18TDK zA-cxEdDOhKHoZJ0Z;sFB1j#bkAz}e$-&9F6Hp6-jOyc+%!nJK-s$FY})_Gms8455w z_3Y119rki_X5%G6y|L?1Fk@q%nJna8@K*f_5>8wRNQH_L1o!nnO<40xI|RtgpqE7v ze8_OUGEq!UuOm{I))#P0JQsx7K^s^>)i+u8N_M#ecDylJ+(&?HGI_+|<)`fK6D9_1 zjK56`q!j_&Gyq*=Kttp}a0beHB@&ih z4?gGVi7)LeFKlcjz8(*K?sAvO&#v`O1S-v+R%^#y*>slJTh@?CJ7t#LTb=CX70VTO z`(l)cL{}Q(Y+%Rc>vXb!0gq@D)pFJeJid^^^T5^&w$ z<;c+&J2zqndSxG;f%1lx|8U(vZ|KIr!FQ_CTki{@6W3XEt-BM%D=uff3Y#doa zB~P;Uq)pnHV8#~S@(OD^pWou<8=5MaTDqJ<i+rHoCZGjoK^h~&R zoIUZHJBaob5pF0bbCV7E3fXX`DDCVuH@?I5=7C=aqS9s#I952E`2v={irdMwHg-1u zcGz`z*6}2&PRuMk2}u(I`nRl*(UeWM3#iHj!I==p!W??HW-a3C3^lFL%Z2D3y_IBw z5^aMWeVhRYuMcx1W_J3=8Xoxabu%gQi6Kg zsG<25rrznuMsQim*TAWXjH5V`Ixx z!5XIDU~UUJ0YGN|{Uhwun*aoS?=maj1pxQewti70K97Vo?9_SRud_wp)v@!w1ilS| z?J&su4NjxDVhlriM*BhPnh5c-*9k$}x{U6Zr1%jjU^>I>)M>&MiIp0eQ{3*}sd*U= z^3^((?;`y?%R_KOFWpI`uhR14875KEl0KYK;Ga~i&lcppUMpni(FVNLzD(n&5m9*K z2Rm4+2ond{rU5fIK+eZW?GUYaKm#%|1uv3S2D^-hu{qO&oRP#>#a+S^I8JX6PScRn zYpPK*)o8lsc0Hb4!@I(YVjfofy>9Os_~2rKcNT{Qz*c{x*&fmopD>~@G5pqS8gi1B zcnq+!H>mYqaJw(kHqk`xU5LEbpfn>@BCx+^QlRA0wSfofAX|V(Se7g!z|9(ADaS6~ zy$*dr6iW?T8a>AYuivNJreAbzRwC+c(kLT=T#px3Rfvit^O}ULrYJJXLTW?V9Zwur zo|X3VVTSWd<#1yZ-uE^?+D+|eg-9~hkQDk(PBx`&0C*S)lVTyr@TJ(<{77$~ z-_k}-`z$Sn-!C8d9#87>0ME@-0xwfLastuPmn--XWQVzbTScF*!Rpls%a4$zRTNjv z_X&^Ph9~j^e+SZef;r&5=n+9~-2M3YD;9_e?*syLzj=P}C74&%gX3r*Ma`QQX9-6l zfPd-4|5oxuQ8@5YIeDyP#yZ+=C#>%BoS;p$n4?xeR;zj~QXU^j1rzhJx;-(91b{Jq zeTk3;I90Xr1DvV=)-=Q2_^r8@d6{&HH&)bSrftxC<~o?B&)#;wYe#j7f31mYYLMJk zL(`k9lyuv3MI*Om=!cCbG*Sjyw(7eeJJ=(dNV`?Km@d&$iyqf)(^j7K?N#j?mSX=Y zw=g|7VA>)Y<;Uv%#IOWFX8y1B79xZNx#aMB0ThHHh<}-vTAL1-ZVZP_J4e6OKf!)& zCqy{Guj=FU+GX5pg)~GsaMD!!CXXZE8^Bn7x)%C!$DCF9Y)%~fY9oFC4TtrSH5-^%Qm~GJ!_pe-L znVG`#+%?H~ryR&5iVG9z@EeCyY4n4%n+qU+(41S6K^E|YW6f_BeiM0g@Uod3=%r&@ ziBBw3=oTSSB%JOhHmSvw`PZ0*kaq}SwCnX*Ya1y8{Q{Vkd|c<~!Tu%o;Wc^DgA5H- zVscZQmHo1N5`_jDRZtw0oBaDF!D**~{aDxW@sVFz7cC~s_X;Lv;uoa3Z~3}6(m&Xn z$HHiQayv9+ZRC%0H_6!jXvBI4q?KL(t-)hKrz+|}x4cDd5m{r1t8H*+Sq0;39|HTC zH%xtryyS#Hmbay1Q#zsj99OFUxwOaKso30p^=*YGX1+!GW3Bnb*IyD@wwgV}b40Y1U+3Y;beAYE~+Kf@ze8%|V%LK|W${$iEZ} z)w-(+gnfQUJDVM?_M(XkA{oucx-&=)XefW}CD4##4+gMX66sXS&6W$b*J0QQ1bVU! zLJg4Sc+c`s1nHqq-&zBZhszhl<{{@3!mDIA*hZ43c2RsZ|Jc^)wDL&D&EcyrN$hF# zSO7T!UapyNw80m*G$D`CodF^0zXk07E=TZpca8s`n+emD0|%hG_cVe(6cv7IwKH%4qW-jiH2!-( z`hVgF|94|=764fA0Hpktj_`0h01(bUSeg6;pnpOQKbN2KKcKGnldZph7#P`^>F&?{ z_y@r9`E&nY79ZdDscRXS9?-3yyR$z?;s0A-1&s6m)-Ln}?9Bh{I{uA|{I?H%zXw2) zf$6uFVqkkf#(w`c1H*&r|2-jrk?B8+8u0%f(S*mK&BxX;{a+=S@aGl$uVBK{NCJPh z*JFSG(*+YA2go0A<$GxRLHghUkbNlKOCLO7rw^rj=>vcz?oWvNzE83|;4=@~?!^us zMvRBjz1YD6b?Im6{wRM!+f4WJ1`q6_hi&)r27sack7M4;8$7&-J#4#|H(>b_W`B@3 zVEGefzZZf4cv=7Xy?c2BmIs)f7x3?X;&cBd$HMZ&Fx&rCaQOrG>j^KaEF8Z<85#;4 z_ih;doA)VqdwtHG>o!O3cjKhP-;KDC3C5W-Np*u~fe7)?k+=|DfYH9EOHO!STpUWa zS|K4NdWA2%Jb<^E(){R!XT_>a!F$XS5S{n%x=tzJwZ^lLDcC8bXQ)+U7Pi`;j zJcd-6vs9AIR>t^zXs0o6NKvu0xB!b)p9L*T z@-A5R7rnGq%{0l;p-H)MTmH;EN$ct}D9BeYK7SZk|KbLoL4ajtQl(K*O99hnn>V5s z!5|+WIhUyJ|z^PoHi|$mB3EIL@H9MkUEMxgioYKw9_akXG;)ot< zuFx$gYAF|w<@DV3?xbdG_Og6E47#uNYVIjz06S%ZMtJjpHX5=r-fE4M7Lq+bj=RAz z$H#@%zF`4H6UwXx`|oTg)s#P+l~To`*T$tTGIaO1 z(dcE$(YWPwV>VDqAhFbdLDiW+1(P6<33#K3q#ANFWJyO%gqw}W7PNX~-nKT?yMK1B zb<>lrurSZgR{Xd+_vWp9S*l1!-zLtxa6457UM>Gn-ST>l!^P&C7Sbuth>=d-wNtQ0 z#&60W#zpyL?!Hi^v2NXV_?-0H8)y|7G4u3ocMXIw##Vr)9K(fscR16jsh;SLpvMkY z-`o=NO?}?oJcpnV$9l{(5ukkaw~6k*%RUgZK}%4YWO9!)PR zRyb}9FuW{$*8?xuT%r2Dx#CBsfJMZDjqrZXvU-27TR^TPs}#LleDQj?x;0@v+qk|H zLb+ES{tMPep^-?ttG-hb`N3stKzTm6;ztYN!~#UxWgHZG z_WsK(<2%IQ#=QnPcJw?;EHo#mc`uT!s-i}k8#w2SGy|r>W3=D8g<6KSjGl0SY5d4Q zDo#-IrtkRnY3n0Vj7f`uV$*wX$iB*(2zsG9llg~fL95BAfGT?6kG$pHD0m7T*LDR~N~}cY z;NB(Xnr;_%pF`_l>ItUeufmUsqwKww?Y;!?D-_d?%XCdy{uC$%1+7Nx^#r%v9Ku(j} zOtOsZJG?aa6;Du2m65bLmB*3i&E*xAXBXcl7t|x^yoSPb+0{ zG$!mN?T|}*M4E3^&EwAvb*!6PCWJAB0zfWr z;JVoH5My2;0H5ZmZ2Rm;J7k~NMe}gx4yaKZ%a!)w_i=^6G!&V>mo?n&w5>B~P{+AZ5#d4=kB;muTtsytVp^6;ML6^0C1oDz z7FVfq{bv;Po-`EfPW;RBPtGGwUpXf(8#R~a%viLpK;Ax2C4A>T(O?X@s&Pa_JvX_N zws^xhLeAG|dz?2(xje?dy*CTWx$O~!2$ z-TE$D$Srapc(P-?nS-b=!YST|_$=%?0<*yVlyoz|2*<3Z*hieU?}~0QBejF~FgEBy zB=}1+^=b2`eNVknftDp#_rTZznBmjuxRS(@&nm`|Ccv zo1%?f1eE|^%A8myfck^G* zweC4|RbhX2@O9vpWL*q#rqUhq8;NSSYl&Wr)LY6dnZPUjtj|Hi#ov`~0lLI9BO)?8 zi(*Vl0$c=4=WYDu<$`IlDN#-S{0Ds{V%3h76~0{&IplT>^2%VF3PW@vf)#P1)Af#Uh$}$Re$531%Uq8# zFb>qA9X`DeJ>b;|sQV2}a`sdCCPtv8;J_-gTs>zA@ z7Ok4$$p$Xj6S{n7-nfXjdX*;aPVR~$S3%Fp&jPvP_)RXDyrqOipt|N5HqS7{35D0# zr(+Me%@*qhYXx+``Rs~tVDs7)3j&tNBwMxqM)S?!2ke#3wbnbPL!*M{D(%>Uxi;0= zHVv)ge~JDuFJhMHF2a6l!*GBmPJz$bvpm`Q!Innjnn7Xf%_o`L1dV=AV8qY`L)Ukx z>I93@)}0IMW8`8eD%>>BE<3)iZ*m&GxZaINu8{cAeKqhs&$aW^d(YK(g5OhbFx}q6 zI306Zfi}W;`W2izMIq?r<~0KLEKtB>J?oc9-M^fJvHuq5e-LZ|fa3RJ9MHTgj;S_M z{h97}MIc!_MwdC_m0l#kNHBC@zQXZke5VBF z`z5j;H2PD_tYiyC;{{XwJOcE|1Z3VSm+%hf^11J;I9soo3=~L_gZ%`x7Yu?{VOX7? zt=HlP?CxBmNTgsIzv30j>;|RKJ0iM)OGe#5C}8jsGkNe&Z;Os1(4V2-`DqAIRHj3X zanS7}n)1xQ*d;LKfHDl%7{xaNFLUvmI-8Gf{kHYePBJm#CUL_F!j23ZvyUM)!?H_Z z<}l_&ei{qy9J0*wJ*!J&Rrl;cx<)eFF)i@!4XlIRxK;I?0MPg{F&fN$(8Vbb@;dSb^X%^`d@7ajSsPf+;1M)E?##eOP1E zW^>*%9ou6K)_LzsnU)65)NicsFHMr`70U zKgVROH~e^EbJM3a1Oz2CzE$$Z=aa|@u@}TMiCvMa%Xi=0U#1=3U0HnxhQ5N4eym46 z6}@5ktw(AAcrE}!EI^T=6$8^(GpH2zj-r zl$JWEg_1|LiwJ$ghu&O6OQ^ctcUc)bQS+ui){&vxKpwa_eNY82-$Z0YaaEKhcmoyi z7}O3<#Byczn&XPT+2%2YNjD-gK|4KC;NUPERG(ArU&YYqIMQb-Y79paQ*-o=Kd94c>*nGQQLjKbLRpd%h>& z0{mDzJ`uNJqyMcPEfgh-0a8p4R(xt3VMAlG(H-?SR>brkpNS1v;ePPTMq}x>s_6)V z!U`vPZNcLLHytq!O2hkqmNc1f=~r%qoG)%3tfXk>wUX05R$HzycHT!>Fg64yIn^}Y z;3srOp6W$uk4@VY3{iWR@Qhw5WeJb_jj|;eNdsCk6-cDFLD>*#eBENG_bRId5IM#( za>P6ZahNQIZl6uLR@G{-9oQ|H;E#<%>&6B(YAr(ieOumU5aog>qKXSXigghIzF#qg zoj0c8)2RD3L!;jzv27ywY|x@vrtd6w5F?-S2Mr_?%$M`SB`X6-H8a%86X!FYLR;D2 z)C6Z!sL(6eXc6b(Ag7yK@WcgF3;@_82QtvZR7KsEcBE4&vLrQBYpIn3f`eYIV95?c zX)w7M*3g)HBjX)DguGVN9a*{dE@~p14nM z^Q47ZsWfv3se%Ts`$vPqeO`njGFXD4xj7GIe}KBa_@NhxHzYOE8HLmH7zYo3B$(1iy%kulvUYX{`w(GQTz9jRSAG zjQ(hw+{bymxTIUw)$8anqYbkZo3=zr?Aqaaf}l42vY#(1;&6FAe>1>jY-x-u2XPoq9dz9-q+ z>RuNgrb=HkPkjFnr!91eK?jS3l--Dq;CLxQhOna@7(s-rpH~;k5nQ~1ECOoprPn;~ z=d)hTRXx-FZKWW)ufXjxwm*X%Z%`MasGp%I)V3B|+1~m<0%Es_5LD(xnfawAuK-YC zw`3tan8ys3suBipY}=mn6N16XW%) zy2W~Vn*N*ki?0WB3^l%cXrx^<-J0!FY*om8x`a>0O)=S&5PK{ zxU|l*ZD%8X=ea*EgIi4w63MUq!ViR4X<><_G`o2T19H;ql_wj4*DFRCzPC%KD=Bub z3&{p?bS-O*6@&736a&55;V};R4cCZjVo+6*9euJ}WD9(vBN;0~#v?`ib2f8IN5qoJ z9s2MVu!nwF)&O%!qwuCrWI5hkA`{O_*wdR&GGiRuD2n0;UE%1XXIH`Dvu&Jr?Z;e7 zi+(q+=}lAXXSi%oq8?It(|3E)*R*FhoYW|9sg?X#uX}15|6f$Aq$Te2uI_zhykwJs zdcNo8yL5lQQ}wPjmZ@rixmj8^PUnhVfao3rJw<*Rqh0+@CcH&%gRj-rwDOGB$ zkc@9|f7{w)rt5 zv*>#J&1v}suTy%|$FAjxk-ES9f;1xTIRL1BmzR|4RUdRmb5hWSjio_U`VpeGL9$$; zkjO-XHP-eaSnRaXdmSg*crL|7G$ut|1^MPEaL%&EL^+Z>{iDPWrp-XU#Zu7T%5`YK z7lBdjlqHad30c%4VG{d#=zb}??O6Gscx&OWU{L@7K2SERx8}N|G z|A2)5ECE;q4+!K#={}MF0SEe70wnT3gzz6q_lf)u5!i>)eIh^WpDcoVsRS0*za{Gf zq!L(I|KO1sJtXq8{w-PmK9T=nlKgO#`(%CA2jPI<*ar`4EKdOH|F2>nu>Ast{E@8B z@C#S;r+~trPX>Jk=zp9Wu{>D$Jf&TJhv+n9IN$-^ZL{al9?jmy5;3=FL|aQgJZW)r zp}vMhJ25C^h>K*@y|V;8&LXMyTA___;D!@Q+Y@fylW((gf+S5q&PDsAAeS?xs+YQ~Q%?N)V;TyaEZxyiA&(fxe3Zziq7~634i0 zm|JmhoMOyvFUp5Lxt&PRFEj3!_$+B~P#^=c1tX(t=86HQ(_r+8iZJGV>!G6e@M$3^ zTvR>Efdr7TRJCjBDstoHzFs%a_9kZOO0f}!dn0J4gntx#_~0clR3>?vTuT~rdYNUY z%RqY=`ARHwa#>Xyjn%AxrCDxgPPmE4B4o}~Oz`I>?JB(Z^?0*3HPAs7C~(-(Xo7lK z*iWB3ArocY2|E0;k^1(_?dRT_`(T%@;P&u2qpG zx-YQC8(~0)nk&QzB;}@rU$c*AI{>5QvLQNz)eI8$Owx($37^3D|vAO<9AT!T^ z19sqy;*1V`yKCgvQeo;f27bP1r^qMXQ3VAYQ2f)6V>N#K&C7-fr#j5$`=t~lTeZXr#bFc#j3;cXqSDP?~K}w zM4Ozk+ud#|%Ts3@FCHhCn5ENqF%D_0d}c}C|Dr&tr^L^qly_&WV;*L_v;o-(T~_*y zVn?~ZeDWf898)+lC~jque1(!u4Nn>VfbGn=dh&jPd5Rjw`KY^wXYt|`ANvtX@nb#k ziIG*nJoHx-NhDIh@_-%^;CBp$QPKg#YMpwwo%aD?cnqDKQvmc{=L(f(y(R$4l3Cjj z6a{hXIh|93+hz4a^g*BWh8B9M;ir5)H2NE0EJGwqEV+~o{3c$&J{hQDzWohm$5tJRrb`3y2W)DV^BOR6txYiK?JPFl+JN!J`;xcUNuzNGE&Zl8nvj$eRPWoHg+B%(u<| z`0g`&c>Z3EcY7oW%p5rbuoOrYKRwf^h}IYMzWuDIAL91B4Chnm~^A6aj#=Z%A{|Og?MifgCztp5N4c2c79lQ>~KNk~71ynOL=O{N6Rc$hlM zYX=X=jmZ|-iFd1%U#7<)cs{NIXW&S2YEt=~qn4mIkpxZ?=4B1BlzM#kTTL5uNnHMx zHB+SgqSVijxcrPK0oMva?-lPZn~xYOY_|#Wv0=W%D3?}*t}_- zNnmhdXnH*Tp`sZ2J97=P@2bJaoZlEtG&)tjO> zS`o)5FuGFdH&mHp!Jt@cDw~|$PfBi?OsG3yQEm<7otyjvu48XG--MPA&N)Z%8*CfB z=Ip1d5`HG!Yzz&6RQ{;7->5#p-WmUDp#wF zh&txYgR)8Jj(6C72s7b5H<}dJye+BMMth;Eit;-C*S2IWBLy~tI>q%V!mMMWJ#L1Q zDR|-LbPTfVj}r074S6tXe9E-#ccWm95COon4HERw zqr;;a-HgEZPC*u7`|fi@plT%#LxF)8J~VLKu!&*1p^sAu1Fp}TfeFe%LndCS_vttw zMv{yEA8*E&6(xS;R%h4Tf#;!pSoR|ek{Rj1u}B$EX=1zS99?lp-8aTy_&^r;Sgn7V zul_5%fSKdBesu3Quucy-3*dt_Q+`O>Kdmp$Q;}K(c;8HKpTV2^`n`T8))c}CoPurV zqm4%r)o49nSsej;-8lCxmB>e2deVXkxoJkc<3MM;pXf%N=nKYN3ii_5j`zaUEC<+% z$|JQf8?0QGAd2_Z8q$6@wNBA+*HSE@j{e@BHm0;(%f_RKd)5`BB3!=*fjX)s)BWjFfxT zVD!)mM)XOxwiE{0)*x}NV^(!Fi-&+uRm@V?Tp$``Q>3!+qWhULr9}&bK>#!kEV?_D z&)f$nXCs|U3e~GW`3Wb99#Su^CUkD|!c*(;jsdwDM$aIi=8uodsRR>?mlr*QR5pR= z;xs*s(i@A4k*7{F*-!I;S*~%h7*Hvz$INg=um1!R%>A_ucreh_1n2vjV7hsA+mZTvKIDA!cifBxQ(bBW z!!e%0Q<+j6O$Fx*d6%i_U+ZS)JbmKWz;77F`rhc2^G$hX$&C?VYvSz_N&ctz4P@n^T%Q3n+TlsFCO zN5GtH&kyO#%Ij{F11madMfhF$G0!83YjE~;T12~8$5mu`W|}F>J%sf>@@O=nlz&OI zj5oJiK$KRUfZ)l=gj)u7bUp+pVc$rH5Fu!ZEx*YCX@J6s>89q5y@pA_kc-*&3ezon z4Nf;f&18-m)!I;wlsK(lCbZ$e$qK|4f|n_eiCA>iJ(noB^{FIeW_UnZpM~H22cwol zG!Gjt=cEr?Xr||CeLmk<>rG`Z(}%DA{zBUl6aCcfVv#MeJqR<{su^Q#N%jhH_At0Z zwp`Usa14hhii@+FAy+}O3i9^ltByAiutGslk2UraU#OV=lASW!p{+id8uuj%<{MCF+t8O@^E*9{B(67E4WTQ6*%<^Y)$yVY+2b*8dV2s`$jptG!VVcYLdu9=*ki$UeD6^ z@J5^+QXNvYV+Hwi+ya=cA)&`wrX+jWK(JI4Gy*CDz;N47q851#l+!S*|a zTLYk}vBdfyw$)6>!q?)={fB)935V562-vec6J8%sKGApdK9g$*=9tIcK!4hTXog6f})GJQOxfwCetLnY9d zBXShzSS6&nm&JCyqijqtIpM~Z^ z3Ao1r=@}-TS^;U&tz6yVbdHrE*49;4MYv1{Nl8E64jjc`O`&SVwQ_YiYu{I}soqy* zV0Kr=+fBn_JG>mE*vby7`4F{wR?YeJL^UJPC>vQvpS`?k2H#--a9XCuXW+K`ukfDx z)6@oX*2m?1|L&Ds-+Ry%y21Ge^Q*x;43g03$dN`k{NDZ${|PbBk9$0i>+n}l3m@atVJ^L*n@pl0Vw3F>hj=DdaMIM`A<~yIu{_ zu&#wF&1}>JY?4;HpqmF$Pn!qHwe0d!Tj~n|Z;z16kKZ*twLCTMo(ZtIjz9K$dg99< z6a8tGcnA$WZ-UkAfKL5H4hmO zeEe!>0QGxH5xh(NDE3v|)LO{?%#IwZ+0wv3&2#K-a5DavIe8$Oja3Ilcmc=R=JIA` zExtD!a;yL^ctrPsSdZOil7V4%EsewCFq>3e4c)Da;E=0lgS)zLy8U<%>Ue9f9w!! zo%{%N$iT?Y14+n;x z-?->^smp&Sv;Uvh2>!ug|L+t+=vOx5f0mIj+i%GApWXaF887;eA`tzZhJ0V5r<}j` z1OH~Sytiorme6mOzWd)mhyHG}`djM##Z0vuS zOMzV3*zX7R`wW0xEw*o)XZHc%C9-|n=DH66FNN*fCewWY5IP&jAHLr}McFw1aQy}< z$;RbDzq!Tzf8!*3j^Er0Wn=ymt+bYsM9B&V+#k$^seNn5QqUwpAJL}~ge-iD z2Tj5=x=9C^u;(rcB3Kk8{4j&ZxKcLGNK1mIsP@VUgI{nX*WZ8i>nBIVjD(kh-$T+* zh=$@9p1BQN0w0s(@`4mOwK)}gygD@UC`4PH-(#T|A#ZJm37yqkP|_)||2)LkurwH1 zQ_t5CicniMrG-+W_)B}_4EM=Ua*lCg%zG3|Y;DRAL8g-7Rf247(NCC`a&B$|N+Bo< zWh=(Q`ra}*T2p!>;&Mv7A-4M-!Ncumd6;i=7=3MO33qt2$Oqy4+e&Bqpi~xC2%a~k zn=WKTIb|TngLO0}xh#AR{P0lBFq2}dL1ypE3_@h6>p>!Mc}ZWVfF_RJ4r7d=$rHgA zq1FqE}DZwjD**~Uks23zu4OM%F7(u8tsw+V(@aSYzcTm@FZ0B

DUX{K_cv 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 => { - const databasePath = options.databasePath ?? resolveHostDatabasePath(options) - if (!existsSync(databasePath)) { - return { getSidebarSnapshot: () => null } - } - - const database = await openReadonlySqlJsDatabase(databasePath) - return { - getSidebarSnapshot(): SidebarSnapshot | null { - try { - return readSidebarSnapshotFromExecutor(database.executor) - } catch (error) { - if (isRecoverableSqliteReadError(error)) return null - throw error - } - }, - } -} - -export const readSidebarSnapshot = async ( - options: CreateSqliteSidebarSnapshotReaderOptions = {}, -): Promise => { - const databasePath = options.databasePath ?? resolveHostDatabasePath(options) +const readSidebarSnapshotWithRuntime = (SQL: SqlJsStatic, databasePath: string): SidebarSnapshot | null => { if (!existsSync(databasePath)) return null - const database = await openDatabaseFromPath(databasePath) + const database = new SQL.Database(readFileSync(databasePath)) try { const statementRunner = { get>(sql: string): TRow | null { @@ -103,3 +79,24 @@ export const readSidebarSnapshot = async ( database.close() } } + +export const createSqliteSidebarSnapshotReader = async ( + options: CreateSqliteSidebarSnapshotReaderOptions = {}, +): Promise => { + const databasePath = options.databasePath ?? resolveHostDatabasePath(options) + const SQL = await getSqlRuntime() + + return { + getSidebarSnapshot(): SidebarSnapshot | null { + return readSidebarSnapshotWithRuntime(SQL, databasePath) + }, + } +} + +export const readSidebarSnapshot = async ( + options: CreateSqliteSidebarSnapshotReaderOptions = {}, +): Promise => { + const databasePath = options.databasePath ?? resolveHostDatabasePath(options) + const SQL = await getSqlRuntime() + return readSidebarSnapshotWithRuntime(SQL, databasePath) +} diff --git a/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts b/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts index bd06610..af76e84 100644 --- a/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts +++ b/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts @@ -2,8 +2,14 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test" import { mkdir, mkdtemp, rm } from "node:fs/promises" import { join } from "node:path" +import { recordUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" import { spawnPartner } from "@sbugallo/vpet-core/application/use-cases/spawn-partner.ts" -import { readSidebarSnapshot } from "../../src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts" +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { STAGE_GAUGE_THRESHOLDS } from "@sbugallo/vpet-core/domain/evolution.ts" +import { + createSqliteSidebarSnapshotReader, + readSidebarSnapshot, +} from "../../src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts" import { createSqliteVpetRepository } from "../../src/adapters/sqlite/sqlite-vpet-write-store.ts" type TempTestRoot = { readonly root: string; readonly appDataRoot: string } @@ -28,6 +34,35 @@ afterEach(async () => { }) describe("sql.js vpet repository persistence", () => { + test("Given usage applied through the write store When reading through the snapshot reader Then it returns fresh gauge", async () => { + if (tempRoot === undefined) throw new Error("Missing temp root.") + + const repository = await createSqliteVpetRepository({ appDataRoot: tempRoot.appDataRoot }) + const reader = await createSqliteSidebarSnapshotReader({ appDataRoot: tempRoot.appDataRoot }) + try { + spawnPartner(repository, "2026-09-09T12:00:00.000Z") + expect(reader.getSidebarSnapshot()?.gauge).toBe(0) + + recordUsage({ + usage: { + receiptKey: "receipt-1", + eventId: "event-1", + tokenDelta: 42, + cost: null, + createdAt: "2026-09-09T12:01:00.000Z", + }, + ledger: repository, + digimonById: DIGIMON_CATALOG.byId, + selector: () => 0, + thresholds: STAGE_GAUGE_THRESHOLDS, + }) + + expect(reader.getSidebarSnapshot()?.gauge).toBe(42) + } finally { + repository.close() + } + }) + test("Given a spawned partner When reading the sidebar snapshot Then it returns the active partner", async () => { if (tempRoot === undefined) throw new Error("Missing temp root.") diff --git a/packages/opencode-vpet/README.md b/packages/opencode-vpet/README.md index 4f5db2a..8113e7f 100644 --- a/packages/opencode-vpet/README.md +++ b/packages/opencode-vpet/README.md @@ -138,14 +138,14 @@ Default values are: "notifications": true, "language": "jp", "stageThresholds": { - "egg": 500000, - "babyI": 1000000, - "babyII": 2000000, - "child": 4000000, - "adult": 7500000, - "perfect": 12500000, - "ultimate": 20000000, - "superUltimate": 30000000 + "egg": 5000000, + "babyI": 10000000, + "babyII": 20000000, + "child": 40000000, + "adult": 75000000, + "perfect": 125000000, + "ultimate": 200000000, + "superUltimate": 300000000 } } ``` diff --git a/packages/opencode-vpet/tests/catalog-evolution.test.ts b/packages/opencode-vpet/tests/catalog-evolution.test.ts index 24bafed..ca8c362 100644 --- a/packages/opencode-vpet/tests/catalog-evolution.test.ts +++ b/packages/opencode-vpet/tests/catalog-evolution.test.ts @@ -52,7 +52,7 @@ describe("catalog and evolution", () => { expect(DIGIMON_STAGES.every(isDigimonStage)).toBeTrue() expect(partner.currentNodeId).toBe(progression.currentNodeId) - expect(thresholds[node.stage]).toBe(500_000) + expect(thresholds[node.stage]).toBe(5_000_000) }) test("Given a raw catalog row with a reference URL When parsing Then the normalized node preserves the URL and evolution references are immutable", () => { @@ -129,7 +129,7 @@ describe("catalog and evolution", () => { if (andromon === undefined) throw new Error("Expected Andromon in catalog") const evolved = applyTokenProgress( - { current: andromon, gauge: 12_499_999, isTerminal: false }, + { current: andromon, gauge: 124_999_999, isTerminal: false }, 1, () => 0.5, catalog.byId, @@ -144,7 +144,7 @@ describe("catalog and evolution", () => { const lookup = new Map([[controlledTarget.id, controlledTarget]]) const evolved = applyTokenProgress( - { current: controlledCurrent, gauge: 499_999, isTerminal: false }, + { current: controlledCurrent, gauge: 4_999_999, isTerminal: false }, 1, () => 0, lookup, @@ -157,7 +157,7 @@ describe("catalog and evolution", () => { test("Given a controlled lookup missing the selected target When token progress reaches a threshold Then it retains the existing catalog error", () => { expect(() => applyTokenProgress( - { current: controlledCurrent, gauge: 499_999, isTerminal: false }, + { current: controlledCurrent, gauge: 4_999_999, isTerminal: false }, 1, () => 0, new Map(), @@ -186,7 +186,7 @@ describe("catalog and evolution", () => { test("Given an invalid selector When token progress reaches a threshold Then the existing selector error is retained", () => { expect(() => applyTokenProgress( - { current: controlledCurrent, gauge: 499_999, isTerminal: false }, + { current: controlledCurrent, gauge: 4_999_999, isTerminal: false }, 1, () => 1, new Map([[controlledTarget.id, controlledTarget]]), diff --git a/packages/opencode-vpet/tests/config-settings.test.ts b/packages/opencode-vpet/tests/config-settings.test.ts index 6855494..b6e314f 100644 --- a/packages/opencode-vpet/tests/config-settings.test.ts +++ b/packages/opencode-vpet/tests/config-settings.test.ts @@ -29,14 +29,14 @@ const expectedDefaults = { }, }, stageThresholds: { - egg: 500_000, - babyI: 1_000_000, - babyII: 2_000_000, - child: 4_000_000, - adult: 7_500_000, - perfect: 12_500_000, - ultimate: 20_000_000, - superUltimate: 30_000_000, + egg: 5_000_000, + babyI: 10_000_000, + babyII: 20_000_000, + child: 40_000_000, + adult: 75_000_000, + perfect: 125_000_000, + ultimate: 200_000_000, + superUltimate: 300_000_000, }, } as const satisfies ResolvedVpetSettings @@ -182,7 +182,7 @@ describe("vpet settings normalization", () => { throw new Error("root") }, }), - 4_000_000, + 40_000_000, ], [ "language getter", @@ -191,7 +191,7 @@ describe("vpet settings normalization", () => { throw new Error("language") }, }), - 4_000_000, + 40_000_000, ], [ "stageThresholds getter", @@ -200,7 +200,7 @@ describe("vpet settings normalization", () => { throw new Error("thresholds") }, }), - 4_000_000, + 40_000_000, ], [ "threshold getter with valid sibling", @@ -228,7 +228,7 @@ describe("vpet settings normalization", () => { }, }, ), - 4_000_000, + 40_000_000, ], [ "threshold Proxy get trap with valid sibling", diff --git a/packages/opencode-vpet/tests/record-usage.test.ts b/packages/opencode-vpet/tests/record-usage.test.ts index 83bcc07..d94c136 100644 --- a/packages/opencode-vpet/tests/record-usage.test.ts +++ b/packages/opencode-vpet/tests/record-usage.test.ts @@ -32,7 +32,7 @@ const activePartner: Partner = { partnerId: "partner-1", generation: 1, currentNodeId: currentNode.id, - gauge: 499_999, + gauge: 4_999_999, isTerminal: false, createdAt: "2026-07-31T00:00:00.000Z", retiredAt: null, diff --git a/packages/opencode-vpet/tests/sidebar-view-model.test.ts b/packages/opencode-vpet/tests/sidebar-view-model.test.ts index cb1c2ef..e4c9f8a 100644 --- a/packages/opencode-vpet/tests/sidebar-view-model.test.ts +++ b/packages/opencode-vpet/tests/sidebar-view-model.test.ts @@ -46,7 +46,7 @@ describe("static sidebar model", () => { expect(model.stageNumber).toBe(4) expect(model.url).toBe("https://example.test/tailmon") expect(model.gauge).toBe(25_000) - expect(model.threshold).toBe(7_500_000) + expect(model.threshold).toBe(75_000_000) expect(model.isTerminal).toBe(false) expect(model.frozen).toBe(false) }) @@ -121,7 +121,7 @@ describe("static sidebar model", () => { expect(model.name).toBe("Tailmon") expect(model.stage).toBe("Adult") - expect(model.threshold).toBe(7_500_000) + expect(model.threshold).toBe(75_000_000) expect(model.isTerminal).toBe(true) }) diff --git a/packages/opencode-vpet/tests/tui-settings-composition.test.ts b/packages/opencode-vpet/tests/tui-settings-composition.test.ts index b15f9d2..7adb039 100644 --- a/packages/opencode-vpet/tests/tui-settings-composition.test.ts +++ b/packages/opencode-vpet/tests/tui-settings-composition.test.ts @@ -225,11 +225,11 @@ describe("TUI settings composition", () => { stage: 4, url: "https://example.test/tailmon", }, - gauge: 7_500_000, + gauge: 75_000_000, isTerminal: false, frozen: false, isSetOverride: false, - trainerTotalTokens: 7_500_000, + trainerTotalTokens: 75_000_000, }), settings, ) @@ -259,7 +259,7 @@ describe("TUI settings composition", () => { expect(frame).toContain("Tailmon") expect(frame).toContain("Adult") - expect(frame).toContain("7,500,000/7,500,000") + expect(frame).toContain("75,000,000/75,000,000") expect(frame).not.toContain("Gatomon") expect(frame).not.toContain("Champion") setup.renderer.destroy() diff --git a/packages/vpet-core/src/config/defaults.ts b/packages/vpet-core/src/config/defaults.ts index ab6eb1c..ee9c0cc 100644 --- a/packages/vpet-core/src/config/defaults.ts +++ b/packages/vpet-core/src/config/defaults.ts @@ -28,14 +28,14 @@ export const VPET_STAGE_LABELS = Object.freeze({ } as const satisfies VpetStageLabels) export const DEFAULT_STAGE_THRESHOLDS = Object.freeze({ - egg: 500_000, - babyI: 1_000_000, - babyII: 2_000_000, - child: 4_000_000, - adult: 7_500_000, - perfect: 12_500_000, - ultimate: 20_000_000, - superUltimate: 30_000_000, + egg: 5_000_000, + babyI: 10_000_000, + babyII: 20_000_000, + child: 40_000_000, + adult: 75_000_000, + perfect: 125_000_000, + ultimate: 200_000_000, + superUltimate: 300_000_000, } as const satisfies StageThresholdSettings) export const DEFAULT_VPET_SETTINGS = Object.freeze({ diff --git a/packages/vpet-core/src/domain/evolution.ts b/packages/vpet-core/src/domain/evolution.ts index 25f0f5b..878c81e 100644 --- a/packages/vpet-core/src/domain/evolution.ts +++ b/packages/vpet-core/src/domain/evolution.ts @@ -4,14 +4,14 @@ import { DIGIMON_STAGES, type DigimonStage } from "./stage.ts" export type StageThresholds = Readonly> export const STAGE_GAUGE_THRESHOLDS = Object.freeze({ - 0: 500_000, - 1: 1_000_000, - 2: 2_000_000, - 3: 4_000_000, - 4: 7_500_000, - 5: 12_500_000, - 6: 20_000_000, - 7: 30_000_000, + 0: 5_000_000, + 1: 10_000_000, + 2: 20_000_000, + 3: 40_000_000, + 4: 75_000_000, + 5: 125_000_000, + 6: 200_000_000, + 7: 300_000_000, } as const satisfies StageThresholds) export type PartnerEvolutionState = { From 093550de0b9d8d4b15f79e5c896017f89c04dd7a Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 15:38:56 +0900 Subject: [PATCH 08/41] feat: add evolution battles before digi-evolution When a partner reaches a stage threshold, open a pending same-stage battle instead of evolving immediately. Persist battle state in SQLite, notify via toasts in OpenCode, and animate battles in the Cursor sidebar. Co-authored-by: Cursor --- packages/cursor-vpet/package.json | 4 + .../cursor/cursor-usage-event-source.ts | 1 + .../sqlite/sqlite-sidebar-snapshot-reader.ts | 4 + packages/cursor-vpet/src/config/debug.ts | 2 + packages/cursor-vpet/src/extension.ts | 7 +- .../src/webview/evolution-battle-artwork.ts | 465 ++++++++++++++++++ .../cursor-vpet/src/webview/sidebar-render.ts | 1 + .../src/webview/vpet-sidebar-provider.ts | 130 ++++- .../tests/evolution-battle-artwork.test.ts | 116 +++++ .../sqljs-vpet-repository.persistence.test.ts | 1 + .../adapters/opencode/create-server-hooks.ts | 47 +- .../src/adapters/opencode/vpet-toast.ts | 12 + .../sqlite/sqlite-sidebar-snapshot-reader.ts | 4 + .../tests/catalog-evolution.test.ts | 142 ++++-- .../tests/get-sidebar-card-inputs.test.ts | 15 + ...lite-usage-event-toast.persistence.test.ts | 16 +- .../opencode-vpet/tests/record-usage.test.ts | 48 +- .../tests/server-hooks-lifecycle.test.ts | 35 +- .../tests/server-thresholds.test.ts | 31 +- .../opencode-vpet/tests/sidebar-state.test.ts | 36 ++ .../tests/sidebar-view-model.test.ts | 2 + .../tests/tui-composition-fixture.ts | 1 + .../src/adapters/sqlite/sqlite-migrations.ts | 7 + .../src/adapters/sqlite/sqlite-vpet-schema.ts | 38 +- .../src/adapters/sqlite/sqlite-vpet-types.ts | 10 +- .../sqlite/sqlite-vpet-write-store.ts | 64 ++- .../application/models/sidebar-card-inputs.ts | 1 + .../vpet-core/src/application/models/usage.ts | 11 + .../src/application/ports/sidebar-snapshot.ts | 2 + .../use-cases/get-sidebar-card-inputs.ts | 2 + .../application/use-cases/reconcile-usage.ts | 4 +- .../src/application/use-cases/record-usage.ts | 39 +- .../use-cases/resolve-evolution-battle.ts | 54 ++ .../vpet-core/src/domain/evolution-battle.ts | 40 ++ packages/vpet-core/src/domain/evolution.ts | 67 ++- packages/vpet-core/src/domain/partner.ts | 4 + .../src/view-models/sidebar-view-model.ts | 2 + 37 files changed, 1354 insertions(+), 111 deletions(-) create mode 100644 packages/cursor-vpet/src/config/debug.ts create mode 100644 packages/cursor-vpet/src/webview/evolution-battle-artwork.ts create mode 100644 packages/cursor-vpet/tests/evolution-battle-artwork.test.ts create mode 100644 packages/vpet-core/src/application/use-cases/resolve-evolution-battle.ts create mode 100644 packages/vpet-core/src/domain/evolution-battle.ts diff --git a/packages/cursor-vpet/package.json b/packages/cursor-vpet/package.json index a12ed1f..782688a 100644 --- a/packages/cursor-vpet/package.json +++ b/packages/cursor-vpet/package.json @@ -83,6 +83,10 @@ { "command": "cursorVpet.uninstallHooks", "title": "Cursor VPet: Uninstall Hooks" + }, + { + "command": "cursorVpet.testBattle", + "title": "Cursor VPet: Test Evolution Battle (debug)" } ], "configuration": { diff --git a/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts b/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts index 6ef3f4b..ab5ed63 100644 --- a/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts +++ b/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts @@ -46,6 +46,7 @@ export const createCursorUsageEventSource = ( ledger, usage, digimonById: DIGIMON_CATALOG.byId, + catalogNodes: DIGIMON_CATALOG.nodes, selector: Math.random, thresholds: STAGE_GAUGE_THRESHOLDS, }) diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts b/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts index e96e31c..aa66b1c 100644 --- a/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts +++ b/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts @@ -37,6 +37,8 @@ export const readSidebarSnapshotFromExecutor = (executor: Pick context.subscriptions.push({ dispose: () => repository.close() }) const snapshotReader = await createSqliteSidebarSnapshotReader(databaseOptions()) - sidebarProvider = new VpetSidebarProvider(context.extensionUri, snapshotReader) + sidebarProvider = new VpetSidebarProvider(context.extensionUri, snapshotReader, repository) context.subscriptions.push( vscode.window.registerWebviewViewProvider(VpetSidebarProvider.viewType, sidebarProvider, { webviewOptions: { retainContextWhenHidden: true }, @@ -107,6 +107,11 @@ export async function activate(context: vscode.ExtensionContext): Promise uninstallVpetHooks() void context.globalState.update("vpet.hooksInstalled", false) }), + vscode.commands.registerCommand("cursorVpet.testBattle", async () => { + sidebarProvider?.resetDebugBattlePreview() + await sidebarProvider?.refresh() + await sidebarProvider?.previewEvolutionBattle() + }), ) const poll = setInterval(refreshSidebar, 30_000) diff --git a/packages/cursor-vpet/src/webview/evolution-battle-artwork.ts b/packages/cursor-vpet/src/webview/evolution-battle-artwork.ts new file mode 100644 index 0000000..ad19e1c --- /dev/null +++ b/packages/cursor-vpet/src/webview/evolution-battle-artwork.ts @@ -0,0 +1,465 @@ +import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { mirrorMonsterFrame } from "./monster-artwork-mirror.ts" + +const FRAME_ROWS = 8 +const FRAME_COLUMNS = 16 +const BATTLE_GAP_COLUMNS = 12 + +export const EVOLUTION_BATTLE_HITS_TO_WIN = 3 +export const EVOLUTION_BATTLE_MAX_SHOTS = 24 +export const EVOLUTION_BATTLE_TRAVEL_MS = 900 +export const EVOLUTION_BATTLE_PAUSE_MS = 550 +export const EVOLUTION_BATTLE_IMPACT_MS = 650 +export const EVOLUTION_BATTLE_OUTCOME_MS = 1400 +export const EVOLUTION_BATTLE_TICK_MS = 70 + +/** Block-style flame sprite matching Digimon ASCII art. */ +export const FIREBALL_LINES = Object.freeze([" ▄▀▄ ", "▄█▀▀█", " ▀▀▀ "]) + +const FIREBALL_ROWS = FIREBALL_LINES.length +const FIREBALL_COLUMNS = FIREBALL_LINES[0]?.length ?? 0 +const FIREBALL_START_ROW = Math.floor((FRAME_ROWS - FIREBALL_ROWS) / 2) + +const IMPACT_LINES = Object.freeze([" ▄█▄ ", " █▀█ ", " ▀▀▀ "]) +const IMPACT_ROWS = IMPACT_LINES.length +const IMPACT_START_ROW = FIREBALL_START_ROW + +export type EvolutionBattleShooter = "player" | "opponent" +export type EvolutionBattleOutcome = EvolutionBattleShooter +export type BattleSpritePose = "attack" | "injured" | "happy" | "idle" +export type EvolutionBattleResultLabel = "hit" | "miss" | null + +export type EvolutionBattleShot = { + readonly shooter: EvolutionBattleShooter + readonly hit: boolean +} + +export type EvolutionBattleScene = { + readonly shooter: EvolutionBattleShooter | null + readonly progress: number + readonly playerPose: BattleSpritePose + readonly opponentPose: BattleSpritePose + readonly playerInjuredAlt: boolean + readonly opponentInjuredAlt: boolean + readonly playerHits: number + readonly opponentHits: number + readonly lastResult: EvolutionBattleResultLabel + readonly outcomeLabel: string | null +} + +const poseToFrame = (pose: BattleSpritePose, injuredAlt: boolean): MonsterFrameName => { + switch (pose) { + case "attack": + return "attack" + case "injured": + return injuredAlt ? "injured_2" : "injured_1" + case "happy": + return "happy" + default: + return "walk_1" + } +} + +const frameLines = ( + catalog: MonsterFrameCatalog, + sprite: string, + facing: "left" | "right", + pose: BattleSpritePose, + injuredAlt: boolean, +): string[] => { + const frameName = poseToFrame(pose, injuredAlt) + const frame = catalog.get(sprite, frameName) ?? catalog.get(sprite, "walk_1") + if (frame === undefined) return Array.from({ length: FRAME_ROWS }, () => " ".repeat(FRAME_COLUMNS)) + if (facing === "right") { + const mirrored = mirrorMonsterFrame(frame) + if (mirrored.kind === "mirrored") return mirrored.frame.content.split("\n") + } + return frame.content.split("\n") +} + +const padRow = (row: string, width: number): string => row.padEnd(width, " ").slice(0, width) + +const overlayAt = (base: string, overlay: string, startColumn: number): string => { + const result = base.split("") + for (let index = 0; index < overlay.length; index += 1) { + const column = startColumn + index + if (column < 0 || column >= result.length) continue + const character = overlay[index] + if (character !== undefined && character !== " ") result[column] = character + } + return result.join("") +} + +const centerText = (width: number, text: string): string => { + const start = Math.max(0, Math.floor((width - text.length) / 2)) + return `${" ".repeat(start)}${text}`.padEnd(width, " ").slice(0, width) +} + +export const BATTLE_SCORE_HIT_PIP = "█" +export const BATTLE_SCORE_MISS_PIP = "░" + +export const buildBattleScorePips = ( + hits: number, + total: number = EVOLUTION_BATTLE_HITS_TO_WIN, +): string => + Array.from({ length: total }, (_, index) => + index < hits ? BATTLE_SCORE_HIT_PIP : BATTLE_SCORE_MISS_PIP, + ).join("") + +export const buildBattleScoreRow = ( + playerHits: number, + opponentHits: number, + width: number = BATTLE_GAP_COLUMNS, +): string => { + const playerPips = buildBattleScorePips(playerHits) + const opponentPips = buildBattleScorePips(opponentHits) + const spacer = Math.max(1, width - playerPips.length - opponentPips.length) + return `${playerPips}${" ".repeat(spacer)}${opponentPips}`.padEnd(width, " ").slice(0, width) +} + +const mirrorFireballLine = (line: string): string => Array.from(line).reverse().join("") + +const fireballLinesForShooter = (shooter: EvolutionBattleShooter): readonly string[] => + shooter === "opponent" ? FIREBALL_LINES.map(mirrorFireballLine) : FIREBALL_LINES + +const fireballColumn = (shooter: EvolutionBattleShooter, progress: number): number => { + const travel = BATTLE_GAP_COLUMNS - FIREBALL_COLUMNS + const clamped = Math.max(0, Math.min(1, progress)) + if (shooter === "player") return Math.round(clamped * travel) + return Math.round((1 - clamped) * travel) +} + +const impactColumn = (shooter: EvolutionBattleShooter): number => { + if (shooter === "player") return BATTLE_GAP_COLUMNS - IMPACT_LINES[0]!.length + return 0 +} + +const renderFireballInGap = (gapRows: string[], shooter: EvolutionBattleShooter, progress: number): void => { + const startColumn = fireballColumn(shooter, progress) + const fireballLines = fireballLinesForShooter(shooter) + for (let rowIndex = 0; rowIndex < FIREBALL_ROWS; rowIndex += 1) { + const gapRow = FIREBALL_START_ROW + rowIndex + const fireballLine = fireballLines[rowIndex] ?? "" + gapRows[gapRow] = overlayAt(gapRows[gapRow] ?? "", fireballLine, startColumn) + } +} + +const renderImpactInGap = (gapRows: string[], shooter: EvolutionBattleShooter): void => { + const startColumn = impactColumn(shooter) + for (let rowIndex = 0; rowIndex < IMPACT_ROWS; rowIndex += 1) { + const gapRow = IMPACT_START_ROW + rowIndex + const impactLine = IMPACT_LINES[rowIndex] ?? "" + gapRows[gapRow] = overlayAt(gapRows[gapRow] ?? "", impactLine, startColumn) + } +} + +const renderHudInGap = (gapRows: string[], scene: EvolutionBattleScene): void => { + gapRows[0] = buildBattleScoreRow(scene.playerHits, scene.opponentHits) + if (scene.outcomeLabel !== null) { + gapRows[FRAME_ROWS - 1] = centerText(BATTLE_GAP_COLUMNS, scene.outcomeLabel) + } else if (scene.lastResult !== null) { + gapRows[FRAME_ROWS - 1] = centerText(BATTLE_GAP_COLUMNS, scene.lastResult === "hit" ? "HIT!" : "MISS") + } +} + +const hitsFor = (shooter: EvolutionBattleShooter, playerHits: number, opponentHits: number): number => + shooter === "player" ? playerHits : opponentHits + +const rollShotHit = ( + outcome: EvolutionBattleOutcome, + shooter: EvolutionBattleShooter, + playerHits: number, + opponentHits: number, + random: () => number, +): boolean => { + const winner = outcome + const loser = outcome === "player" ? "opponent" : "player" + const winnerHits = hitsFor(winner, playerHits, opponentHits) + const loserHits = hitsFor(loser, playerHits, opponentHits) + + if (shooter === winner) { + if (winnerHits === EVOLUTION_BATTLE_HITS_TO_WIN - 1) return true + if (loserHits === EVOLUTION_BATTLE_HITS_TO_WIN - 1) return true + return random() < 0.65 + } + + if (loserHits === EVOLUTION_BATTLE_HITS_TO_WIN - 1) return false + return random() < 0.45 +} + +export const planEvolutionBattle = ( + outcome: EvolutionBattleOutcome, + random: () => number = Math.random, +): readonly EvolutionBattleShot[] => { + const shots: EvolutionBattleShot[] = [] + let playerHits = 0 + let opponentHits = 0 + let shooter: EvolutionBattleShooter = "player" + + while ( + playerHits < EVOLUTION_BATTLE_HITS_TO_WIN && + opponentHits < EVOLUTION_BATTLE_HITS_TO_WIN && + shots.length < EVOLUTION_BATTLE_MAX_SHOTS + ) { + const hit = rollShotHit(outcome, shooter, playerHits, opponentHits, random) + shots.push({ shooter, hit }) + if (hit) { + if (shooter === "player") playerHits += 1 + else opponentHits += 1 + } + shooter = shooter === "player" ? "opponent" : "player" + } + + return shots +} + +export const defaultBattleScene = ( + overrides: Partial = {}, +): EvolutionBattleScene => ({ + shooter: null, + progress: 0, + playerPose: "attack", + opponentPose: "attack", + playerInjuredAlt: false, + opponentInjuredAlt: false, + playerHits: 0, + opponentHits: 0, + lastResult: null, + outcomeLabel: null, + ...overrides, +}) + +export const renderEvolutionBattleArtwork = ( + catalog: MonsterFrameCatalog, + playerSprite: string, + opponentSprite: string, + scene: EvolutionBattleScene, + viewportWidth: number, +): string => { + const playerLines = frameLines(catalog, playerSprite, "right", scene.playerPose, scene.playerInjuredAlt) + const opponentLines = frameLines(catalog, opponentSprite, "left", scene.opponentPose, scene.opponentInjuredAlt) + + const gapRows = Array.from({ length: FRAME_ROWS }, () => " ".repeat(BATTLE_GAP_COLUMNS)) + renderHudInGap(gapRows, scene) + + if (scene.shooter !== null) { + renderFireballInGap(gapRows, scene.shooter, scene.progress) + } + if (scene.lastResult === "hit" && scene.shooter !== null) { + renderImpactInGap(gapRows, scene.shooter) + } + + const battleWidth = FRAME_COLUMNS + BATTLE_GAP_COLUMNS + FRAME_COLUMNS + const rows = Array.from({ length: FRAME_ROWS }, (_, rowIndex) => { + const left = padRow(playerLines[rowIndex] ?? "", FRAME_COLUMNS) + const gap = gapRows[rowIndex] ?? " ".repeat(BATTLE_GAP_COLUMNS) + const right = padRow(opponentLines[rowIndex] ?? "", FRAME_COLUMNS) + return `${left}${gap}${right}` + }) + + const padding = Math.max(Math.floor((viewportWidth - battleWidth) / 2), 0) + return rows.map((row) => `${" ".repeat(padding)}${row}`).join("\n") +} + +export const sleep = (ms: number): Promise => + new Promise((resolve) => { + setTimeout(resolve, ms) + }) + +const postScene = async ( + catalog: MonsterFrameCatalog, + playerSprite: string, + opponentSprite: string, + viewportWidth: number, + scene: EvolutionBattleScene, + onFrame: (artwork: string) => Promise, +): Promise => { + await onFrame(renderEvolutionBattleArtwork(catalog, playerSprite, opponentSprite, scene, viewportWidth)) +} + +const animateShot = async ( + catalog: MonsterFrameCatalog, + playerSprite: string, + opponentSprite: string, + viewportWidth: number, + shot: EvolutionBattleShot, + playerHits: number, + opponentHits: number, + onFrame: (artwork: string) => Promise, +): Promise => { + const steps = Math.max(1, Math.ceil(EVOLUTION_BATTLE_TRAVEL_MS / EVOLUTION_BATTLE_TICK_MS)) + for (let step = 0; step <= steps; step += 1) { + const progress = step / steps + await postScene( + catalog, + playerSprite, + opponentSprite, + viewportWidth, + defaultBattleScene({ + shooter: shot.shooter, + progress, + playerHits, + opponentHits, + playerPose: "attack", + opponentPose: "attack", + }), + onFrame, + ) + if (step < steps) await sleep(EVOLUTION_BATTLE_TICK_MS) + } +} + +const animateImpact = async ( + catalog: MonsterFrameCatalog, + playerSprite: string, + opponentSprite: string, + viewportWidth: number, + shot: EvolutionBattleShot, + playerHits: number, + opponentHits: number, + onFrame: (artwork: string) => Promise, +): Promise => { + const playerPose = shot.hit && shot.shooter === "opponent" ? "injured" : "attack" + const opponentPose = shot.hit && shot.shooter === "player" ? "injured" : "attack" + const ticks = Math.max(1, Math.ceil(EVOLUTION_BATTLE_IMPACT_MS / EVOLUTION_BATTLE_TICK_MS)) + + for (let tick = 0; tick < ticks; tick += 1) { + await postScene( + catalog, + playerSprite, + opponentSprite, + viewportWidth, + defaultBattleScene({ + shooter: shot.shooter, + progress: 1, + playerHits, + opponentHits, + playerPose, + opponentPose, + playerInjuredAlt: tick % 2 === 1 && playerPose === "injured", + opponentInjuredAlt: tick % 2 === 1 && opponentPose === "injured", + lastResult: shot.hit ? "hit" : "miss", + }), + onFrame, + ) + if (tick < ticks - 1) await sleep(EVOLUTION_BATTLE_TICK_MS) + } +} + +const animatePause = async ( + catalog: MonsterFrameCatalog, + playerSprite: string, + opponentSprite: string, + viewportWidth: number, + playerHits: number, + opponentHits: number, + onFrame: (artwork: string) => Promise, +): Promise => { + await postScene( + catalog, + playerSprite, + opponentSprite, + viewportWidth, + defaultBattleScene({ + playerHits, + opponentHits, + playerPose: "attack", + opponentPose: "attack", + }), + onFrame, + ) + await sleep(EVOLUTION_BATTLE_PAUSE_MS) +} + +const animateOutcome = async ( + catalog: MonsterFrameCatalog, + playerSprite: string, + opponentSprite: string, + viewportWidth: number, + outcome: EvolutionBattleOutcome, + playerHits: number, + opponentHits: number, + onFrame: (artwork: string) => Promise, +): Promise => { + const ticks = Math.max(1, Math.ceil(EVOLUTION_BATTLE_OUTCOME_MS / EVOLUTION_BATTLE_TICK_MS)) + const playerWon = outcome === "player" + const winnerPose: BattleSpritePose = "happy" + const loserPose: BattleSpritePose = "injured" + + for (let tick = 0; tick < ticks; tick += 1) { + const loserBlink = tick % 2 === 1 ? "injured" : loserPose + await postScene( + catalog, + playerSprite, + opponentSprite, + viewportWidth, + defaultBattleScene({ + playerHits, + opponentHits, + playerPose: playerWon ? winnerPose : loserBlink, + opponentPose: playerWon ? loserBlink : winnerPose, + playerInjuredAlt: !playerWon && tick % 2 === 1, + opponentInjuredAlt: playerWon && tick % 2 === 1, + outcomeLabel: playerWon ? "WIN!" : "LOSE!", + }), + onFrame, + ) + if (tick < ticks - 1) await sleep(EVOLUTION_BATTLE_TICK_MS) + } +} + +export const runEvolutionBattleAnimation = async ( + catalog: MonsterFrameCatalog, + playerSprite: string, + opponentSprite: string, + viewportWidth: number, + outcome: EvolutionBattleOutcome, + onFrame: (artwork: string) => Promise, + random: () => number = Math.random, +): Promise => { + const shots = planEvolutionBattle(outcome, random) + let playerHits = 0 + let opponentHits = 0 + + for (let index = 0; index < shots.length; index += 1) { + const shot = shots[index] + if (shot === undefined) continue + + await animateShot(catalog, playerSprite, opponentSprite, viewportWidth, shot, playerHits, opponentHits, onFrame) + if (shot.hit) { + if (shot.shooter === "player") playerHits += 1 + else opponentHits += 1 + } + await animateImpact( + catalog, + playerSprite, + opponentSprite, + viewportWidth, + shot, + playerHits, + opponentHits, + onFrame, + ) + + const battleOver = + playerHits >= EVOLUTION_BATTLE_HITS_TO_WIN || opponentHits >= EVOLUTION_BATTLE_HITS_TO_WIN + const isLastShot = index === shots.length - 1 + if (!battleOver && !isLastShot) { + await animatePause(catalog, playerSprite, opponentSprite, viewportWidth, playerHits, opponentHits, onFrame) + } + if (battleOver) break + } + + await animateOutcome( + catalog, + playerSprite, + opponentSprite, + viewportWidth, + outcome, + playerHits, + opponentHits, + onFrame, + ) + return outcome +} diff --git a/packages/cursor-vpet/src/webview/sidebar-render.ts b/packages/cursor-vpet/src/webview/sidebar-render.ts index 31eb1c3..6e6a02a 100644 --- a/packages/cursor-vpet/src/webview/sidebar-render.ts +++ b/packages/cursor-vpet/src/webview/sidebar-render.ts @@ -18,6 +18,7 @@ const formatCount = (value: number): string => value.toLocaleString("en-US") export const buildNextCheckLine = (model: SidebarCardModel): string => { if (model.kind === "no_partner") return "" if (model.isTerminal && !model.isSetOverride) return `${NEXT_CHECK_PREFIX}None` + if (model.evolutionBattlePending) return `${NEXT_CHECK_PREFIX}Evolution battle!` const progress = model.isTerminal ? 1 : Math.min(Math.max(model.gauge / model.threshold, 0), 1) const filled = Math.floor(progress * NEXT_CHECK_BAR_WIDTH) diff --git a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts index 0868c12..44b5b2b 100644 --- a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts +++ b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts @@ -2,11 +2,23 @@ import * as vscode from "vscode" import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { pickRandomSameStageOpponent } from "@sbugallo/vpet-core/domain/evolution-battle.ts" +import { DEBUG_FORCE_EVOLUTION_BATTLE } from "../config/debug.ts" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/get-sidebar-card-inputs.ts" +import type { SidebarSnapshot } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" +import { + resolveEvolutionBattleForPartner, + type EvolutionBattleRepository, +} from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" import { renderPositionedArtwork } from "./animated-artwork.ts" +import { + runEvolutionBattleAnimation, + sleep, + type EvolutionBattleOutcome, +} from "./evolution-battle-artwork.ts" import { MonsterAnimationController, type MonsterAnimationOutput } from "./monster-animation.ts" import { buildSidebarWebviewHtml, @@ -26,6 +38,8 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { private cachedArtwork = "" private artworkWidth = DEFAULT_ARTWORK_WIDTH private visualInterval?: ReturnType + private battleInProgress = false + private debugBattlePlayedThisVisit = false private readonly animation = new MonsterAnimationController(MONSTER_FRAME_CATALOG, Math.random, () => performance.now(), ) @@ -33,6 +47,7 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { constructor( private readonly extensionUri: vscode.Uri, private readonly snapshotReader: SidebarSnapshotReader, + private readonly battleRepository: EvolutionBattleRepository, ) {} resolveWebviewView(webviewView: vscode.WebviewView): void { @@ -61,8 +76,9 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { webviewView.onDidChangeVisibility(() => { if (webviewView.visible) { this.startVisualInterval() - void this.refresh() + void this.onSidebarShown() } else { + this.debugBattlePlayedThisVisit = false this.stopVisualInterval() } }) @@ -76,20 +92,62 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { if (webviewView.visible) { this.startVisualInterval() - void this.refresh() + void this.onSidebarShown() } } + private async onSidebarShown(): Promise { + await this.refresh() + if (!DEBUG_FORCE_EVOLUTION_BATTLE || this.debugBattlePlayedThisVisit) return + await sleep(200) + await this.previewEvolutionBattle() + } + + resetDebugBattlePreview(): void { + this.debugBattlePlayedThisVisit = false + } + + async previewEvolutionBattle(): Promise { + if (!DEBUG_FORCE_EVOLUTION_BATTLE || this.battleInProgress) return + + const snapshot = this.snapshotReader.getSidebarSnapshot() + if (snapshot === null) return + if (snapshot.pendingEvolutionTargetId !== null && snapshot.battleOpponentNodeId !== null) return + + const player = DIGIMON_CATALOG.byId.get(snapshot.currentNodeId) + if (player === undefined) return + + const opponentId = pickRandomSameStageOpponent(player, DIGIMON_CATALOG.nodes, Math.random) + const opponent = DIGIMON_CATALOG.byId.get(opponentId) + if (opponent === undefined) return + + this.debugBattlePlayedThisVisit = true + await this.runBattleAnimation(player.sprite, opponent.sprite, { + preview: true, + opponentName: opponent.nameEn, + }) + await this.refresh() + } + async refresh(): Promise { if (this.view === undefined) return const snapshot = this.snapshotReader.getSidebarSnapshot() + const battled = await this.tryResolveEvolutionBattle(snapshot) + if (battled) { + await this.refresh() + return + } + const reader = { getSidebarSnapshot: () => snapshot } const inputs = getSidebarCardInputs(reader, DIGIMON_CATALOG) const model = buildSidebarCardModel(inputs, DEFAULT_VPET_SETTINGS) const payload = toSidebarWebviewPayload(model) this.cachedPayload = payload await this.view.webview.postMessage(payload) + + if (this.battleInProgress) return + this.syncAnimationPartner(model) await this.postAnimationFrame() } @@ -99,6 +157,70 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { delete this.view } + private async tryResolveEvolutionBattle(snapshot: SidebarSnapshot | null): Promise { + if (snapshot === null) return false + if (snapshot.pendingEvolutionTargetId === null || snapshot.battleOpponentNodeId === null) return false + if (this.battleInProgress) return true + + const player = DIGIMON_CATALOG.byId.get(snapshot.currentNodeId) + const opponent = DIGIMON_CATALOG.byId.get(snapshot.battleOpponentNodeId) + if (player === undefined || opponent === undefined) return false + + await this.runBattleAnimation(player.sprite, opponent.sprite, { preview: false }) + return true + } + + private async runBattleAnimation( + playerSprite: string, + opponentSprite: string, + options: { readonly preview: boolean; readonly opponentName?: string }, + ): Promise { + if (this.battleInProgress) return + + this.battleInProgress = true + this.stopVisualInterval() + + try { + const outcome: EvolutionBattleOutcome = Math.random() < 0.5 ? "player" : "opponent" + const battleOutcome = await runEvolutionBattleAnimation( + MONSTER_FRAME_CATALOG, + playerSprite, + opponentSprite, + this.artworkWidth, + outcome, + async (artwork) => { + this.cachedArtwork = artwork + await this.view?.webview.postMessage({ type: "animation-frame", artwork }) + }, + ) + + if (options.preview) { + void vscode.window.showInformationMessage( + battleOutcome === "player" + ? `Debug victory vs ${options.opponentName ?? "opponent"} (no save).` + : `Debug defeat vs ${options.opponentName ?? "opponent"} (no save).`, + ) + return + } + + const result = resolveEvolutionBattleForPartner( + this.battleRepository, + battleOutcome === "player", + DIGIMON_CATALOG.byId, + new Date().toISOString(), + ) + + if (result.kind === "won") { + void vscode.window.showInformationMessage("Victory! Your partner evolved!") + } else if (result.kind === "lost") { + void vscode.window.showInformationMessage("Defeat! You lost all tokens for this stage.") + } + } finally { + this.battleInProgress = false + if (this.view?.visible) this.startVisualInterval() + } + } + private syncAnimationPartner(model: ReturnType): void { this.animation.dispatch({ kind: "partner_changed", @@ -113,7 +235,7 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { private startVisualInterval(): void { if (this.visualInterval !== undefined) return this.visualInterval = setInterval(() => { - if (this.view === undefined || !this.view.visible) return + if (this.view === undefined || !this.view.visible || this.battleInProgress) return const nextAnimation = this.animation.dispatch({ kind: "tick" }) void this.postAnimationFrame(nextAnimation) }, VISUAL_INTERVAL_MS) @@ -126,7 +248,7 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { } private async postAnimationFrame(animation?: MonsterAnimationOutput): Promise { - if (this.view === undefined) return + if (this.view === undefined || this.battleInProgress) return const output = animation ?? this.animation.output() const artwork = renderPositionedArtwork(output, this.artworkWidth) if (artwork === this.cachedArtwork) return diff --git a/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts b/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts new file mode 100644 index 0000000..60eaff5 --- /dev/null +++ b/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts @@ -0,0 +1,116 @@ +import { describe, expect, test } from "bun:test" + +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { + buildBattleScorePips, + buildBattleScoreRow, + defaultBattleScene, + EVOLUTION_BATTLE_HITS_TO_WIN, + FIREBALL_LINES, + planEvolutionBattle, + renderEvolutionBattleArtwork, +} from "../src/webview/evolution-battle-artwork.ts" + +const countHits = (shots: readonly { readonly shooter: "player" | "opponent"; readonly hit: boolean }[]) => ({ + playerHits: shots.filter((shot) => shot.shooter === "player" && shot.hit).length, + opponentHits: shots.filter((shot) => shot.shooter === "opponent" && shot.hit).length, +}) + +describe("evolution battle artwork", () => { + test("Given a fireball shot When rendering Then the flame uses block-style sprite art", () => { + const artwork = renderEvolutionBattleArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "gabumon", + defaultBattleScene({ shooter: "player", progress: 0.5 }), + 80, + ) + + for (const line of FIREBALL_LINES) { + for (const character of line.replaceAll(" ", "")) { + expect(artwork).toContain(character) + } + } + }) + + test("Given opponent shot When rendering Then the fireball faces the opposite direction", () => { + const playerShot = renderEvolutionBattleArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "gabumon", + defaultBattleScene({ shooter: "player", progress: 0.5 }), + 80, + ) + const opponentShot = renderEvolutionBattleArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "gabumon", + defaultBattleScene({ shooter: "opponent", progress: 0.5 }), + 80, + ) + + expect(playerShot).toContain("▄█▀▀█") + expect(opponentShot).toContain("█▀▀█▄") + expect(playerShot).not.toEqual(opponentShot) + }) + + test("Given player and opponent shots When rendering travel Then fireballs move from opposite sides", () => { + const playerStart = renderEvolutionBattleArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "gabumon", + defaultBattleScene({ shooter: "player", progress: 0 }), + 80, + ) + const playerEnd = renderEvolutionBattleArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "gabumon", + defaultBattleScene({ shooter: "player", progress: 1 }), + 80, + ) + const opponentStart = renderEvolutionBattleArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "gabumon", + defaultBattleScene({ shooter: "opponent", progress: 0 }), + 80, + ) + + expect(playerStart).not.toEqual(playerEnd) + expect(playerStart).not.toEqual(opponentStart) + expect(EVOLUTION_BATTLE_HITS_TO_WIN).toBe(3) + }) + + test("Given battle progress When rendering Then visual score pips and hit result are shown", () => { + const artwork = renderEvolutionBattleArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "gabumon", + defaultBattleScene({ playerHits: 2, opponentHits: 1, lastResult: "hit" }), + 80, + ) + + expect(buildBattleScorePips(2)).toBe("██░") + expect(buildBattleScorePips(1)).toBe("█░░") + expect(buildBattleScoreRow(2, 1)).toContain("██░") + expect(buildBattleScoreRow(2, 1)).toContain("█░░") + expect(artwork).toContain("HIT!") + }) + + test("Given planned player victory When battle ends Then player reaches three hits first", () => { + const shots = planEvolutionBattle("player", () => 0.42) + const { playerHits, opponentHits } = countHits(shots) + + expect(playerHits).toBe(EVOLUTION_BATTLE_HITS_TO_WIN) + expect(opponentHits).toBeLessThan(EVOLUTION_BATTLE_HITS_TO_WIN) + }) + + test("Given planned opponent victory When battle ends Then opponent reaches three hits first", () => { + const shots = planEvolutionBattle("opponent", () => 0.42) + const { playerHits, opponentHits } = countHits(shots) + + expect(opponentHits).toBe(EVOLUTION_BATTLE_HITS_TO_WIN) + expect(playerHits).toBeLessThan(EVOLUTION_BATTLE_HITS_TO_WIN) + }) +}) diff --git a/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts b/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts index af76e84..b63f7b2 100644 --- a/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts +++ b/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts @@ -53,6 +53,7 @@ describe("sql.js vpet repository persistence", () => { }, ledger: repository, digimonById: DIGIMON_CATALOG.byId, + catalogNodes: DIGIMON_CATALOG.nodes, selector: () => 0, thresholds: STAGE_GAUGE_THRESHOLDS, }) diff --git a/packages/opencode-vpet/src/adapters/opencode/create-server-hooks.ts b/packages/opencode-vpet/src/adapters/opencode/create-server-hooks.ts index 5aea476..db3734b 100644 --- a/packages/opencode-vpet/src/adapters/opencode/create-server-hooks.ts +++ b/packages/opencode-vpet/src/adapters/opencode/create-server-hooks.ts @@ -14,6 +14,10 @@ import type { VpetControl } from "@sbugallo/vpet-core/application/ports/vpet-con import type { UsageProcessingResult } from "@sbugallo/vpet-core/application/models/usage.ts" import { reconcileUsage } from "@sbugallo/vpet-core/application/use-cases/reconcile-usage.ts" import { recordUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" +import { + resolveEvolutionBattleForPartner, + type EvolutionBattleRepository, +} from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" import { STAGE_GAUGE_THRESHOLDS, type EvolutionSelector, @@ -45,6 +49,9 @@ const EMPTY_CATALOG: DigimonCatalog = Object.freeze({ nodes: Object.freeze([]), const toToastEvent = (result: UsageProcessingResult): VpetToastEvent | undefined => { switch (result.kind) { case "applied": + if (result.evolutionBattlePending !== undefined) { + return { kind: "evolution_battle", opponentNodeId: result.evolutionBattlePending.opponentNodeId } + } return result.evolution === undefined ? undefined : { kind: "evolution", ...result.evolution } case "duplicate": case "no_active_partner": @@ -74,6 +81,7 @@ const requiresCatalog = (event: VpetToastEvent): boolean => { case "spawn": case "set": case "evolution": + case "evolution_battle": return true case "freeze": case "unfreeze": @@ -81,6 +89,11 @@ const requiresCatalog = (event: VpetToastEvent): boolean => { } } +const isEvolutionBattleRepository = ( + repository: ServerHookDependencies["repository"], +): repository is ServerHookDependencies["repository"] & EvolutionBattleRepository => + "resolveEvolutionBattle" in repository && typeof repository.resolveEvolutionBattle === "function" + export const createCommandConfig = () => ({ "vpet-spawn": { template: "Spawn a new virtual pet." }, "vpet-freeze": { template: "Freeze virtual pet progression." }, @@ -101,6 +114,32 @@ export const createServerHooks = ({ }: ServerHookDependencies): Hooks => { let closePromise: Promise | undefined + const notifyUsageResult = async (result: UsageProcessingResult, catalog: DigimonCatalog): Promise => { + if (result.kind !== "applied") return + + if (result.evolutionBattlePending !== undefined) { + const battleToast = toToastEvent(result) + if (battleToast !== undefined) await notifyEvent(battleToast, catalog) + + if (isEvolutionBattleRepository(repository)) { + const won = evolutionSelector() < 0.5 + const resolved = resolveEvolutionBattleForPartner( + repository, + won, + catalog.byId, + new Date().toISOString(), + ) + if (resolved.kind === "won") { + await notifyEvent({ kind: "evolution", ...resolved.evolution }, catalog) + } + } + return + } + + const toastEvent = toToastEvent(result) + if (toastEvent !== undefined) await notifyEvent(toastEvent, catalog) + } + const notifyEvent = async (event: VpetToastEvent, catalog?: DigimonCatalog): Promise => { if (!notificationsEnabled) return await Promise.resolve() @@ -178,11 +217,11 @@ export const createServerHooks = ({ usage, ledger: repository, digimonById: catalog.byId, + catalogNodes: catalog.nodes, selector: evolutionSelector, thresholds: evolutionThresholds, }) - const toastEvent = toToastEvent(result) - if (toastEvent !== undefined) await notifyEvent(toastEvent, catalog) + await notifyUsageResult(result, catalog) return } case "session.idle": { @@ -197,12 +236,12 @@ export const createServerHooks = ({ usages, ledger: repository, digimonById: catalog.byId, + catalogNodes: catalog.nodes, selector: evolutionSelector, thresholds: evolutionThresholds, }) for (const result of results) { - const toastEvent = toToastEvent(result) - if (toastEvent !== undefined) await notifyEvent(toastEvent, catalog) + await notifyUsageResult(result, catalog) } return } diff --git a/packages/opencode-vpet/src/adapters/opencode/vpet-toast.ts b/packages/opencode-vpet/src/adapters/opencode/vpet-toast.ts index 819f860..6fdc451 100644 --- a/packages/opencode-vpet/src/adapters/opencode/vpet-toast.ts +++ b/packages/opencode-vpet/src/adapters/opencode/vpet-toast.ts @@ -14,6 +14,7 @@ export type VpetToastEvent = | Readonly<{ readonly kind: "unfreeze" }> | Readonly<{ readonly kind: "set"; readonly nodeId: string }> | Readonly<{ readonly kind: "evolution"; readonly fromNodeId: string; readonly toNodeId: string }> + | Readonly<{ readonly kind: "evolution_battle"; readonly opponentNodeId: string }> export type VpetToastNotifier = (payload: VpetToastPayload) => Promise @@ -83,6 +84,17 @@ export const formatVpetToast = ( duration: 5_000, } } + case "evolution_battle": { + const opponentName = namedPayload(event.opponentNodeId, language, catalog) + return opponentName === undefined + ? undefined + : { + title: "Evolution battle", + message: `Battle against ${opponentName}! Win to evolve.`, + variant: "info", + duration: 5_000, + } + } default: return assertNever(event) } diff --git a/packages/opencode-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts b/packages/opencode-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts index ad545fa..49021b9 100644 --- a/packages/opencode-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts +++ b/packages/opencode-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts @@ -50,6 +50,8 @@ export const createSqliteSidebarSnapshotReader = ( frozen: false, isSetOverride: true, trainerTotalTokens: trainer?.total_tokens ?? 0, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, } } @@ -64,6 +66,8 @@ export const createSqliteSidebarSnapshotReader = ( frozen: control?.frozen === 1, isSetOverride: false, trainerTotalTokens: trainer?.total_tokens ?? 0, + pendingEvolutionTargetId: partner.pendingEvolutionTargetId, + battleOpponentNodeId: partner.battleOpponentNodeId, } } finally { database.close() diff --git a/packages/opencode-vpet/tests/catalog-evolution.test.ts b/packages/opencode-vpet/tests/catalog-evolution.test.ts index ca8c362..01a8730 100644 --- a/packages/opencode-vpet/tests/catalog-evolution.test.ts +++ b/packages/opencode-vpet/tests/catalog-evolution.test.ts @@ -5,12 +5,18 @@ import { DIGIMON_DATA } from "@sbugallo/vpet-core/data/digimon-data.ts" import type { DigimonNode as DomainDigimonNode } from "@sbugallo/vpet-core/domain/digimon-node.ts" import { applyTokenProgress, + resolveEvolutionBattle, STAGE_GAUGE_THRESHOLDS, type StageThresholds, } from "@sbugallo/vpet-core/domain/evolution.ts" import type { Partner, PartnerProgression } from "@sbugallo/vpet-core/domain/partner.ts" import { DIGIMON_STAGES, isDigimonStage } from "@sbugallo/vpet-core/domain/stage.ts" +const noBattle = { + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, +} as const + const controlledCurrent: DigimonNode = { id: "controlled-current", nameEn: "Controlled Current", @@ -31,6 +37,19 @@ const controlledTarget: DigimonNode = { url: "https://example.test/controlled-target", } +const controlledOpponent: DigimonNode = { + id: "controlled-opponent", + nameEn: "Controlled Opponent", + nameJp: "Controlled Opponent", + nextEvolutions: [], + sprite: "controlled-opponent.png", + stage: 0, + url: "https://example.test/controlled-opponent", +} + +const controlledCatalogNodes = [controlledCurrent, controlledTarget, controlledOpponent] +const controlledLookup = new Map(controlledCatalogNodes.map((node) => [node.id, node])) + describe("catalog and evolution", () => { test("Given domain contracts When catalog data is parsed Then normalized nodes use the domain stage and node shapes", () => { const node: DomainDigimonNode = controlledCurrent @@ -40,6 +59,8 @@ describe("catalog and evolution", () => { currentNodeId: node.id, gauge: 0, isTerminal: false, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, createdAt: "2026-07-31T00:00:00.000Z", retiredAt: null, } @@ -47,6 +68,8 @@ describe("catalog and evolution", () => { currentNodeId: node.id, gauge: 0, isTerminal: false, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, } const thresholds: StageThresholds = STAGE_GAUGE_THRESHOLDS @@ -122,45 +145,67 @@ describe("catalog and evolution", () => { expect(() => parseDigimonCatalog([root])).toThrow(/next_evolutions/i) }) - test("Given a threshold crossing on a same-stage edge When token progress applies Then it resets after exactly one selected evolution", async () => { + test("Given a threshold crossing on a same-stage edge When token progress applies Then it opens a pending evolution battle", async () => { const catalog = await loadDigimonCatalog() const andromon = catalog.byId.get("5-003") if (andromon === undefined) throw new Error("Expected Andromon in catalog") - const evolved = applyTokenProgress( - { current: andromon, gauge: 124_999_999, isTerminal: false }, + const pending = applyTokenProgress( + { current: andromon, gauge: 124_999_999, isTerminal: false, ...noBattle }, 1, () => 0.5, catalog.byId, + catalog.nodes, STAGE_GAUGE_THRESHOLDS, ) + expect(pending.current.id).toBe("5-003") + expect(pending.pendingEvolutionTargetId).toBe("5-033") + expect(pending.battleOpponentNodeId).not.toBe("5-003") + expect(pending.gauge).toBe(STAGE_GAUGE_THRESHOLDS[5]) + + const evolved = resolveEvolutionBattle(pending, true, catalog.byId) expect(evolved.current.id).toBe("5-033") expect(evolved.gauge).toBe(0) + expect(evolved.pendingEvolutionTargetId).toBeNull() }) - test("Given a controlled immutable lookup When token progress reaches a threshold Then it selects the lookup target and marks terminal state", () => { - const lookup = new Map([[controlledTarget.id, controlledTarget]]) - - const evolved = applyTokenProgress( - { current: controlledCurrent, gauge: 4_999_999, isTerminal: false }, + test("Given a controlled immutable lookup When token progress reaches a threshold Then it opens a pending evolution battle", () => { + const pending = applyTokenProgress( + { current: controlledCurrent, gauge: 4_999_999, isTerminal: false, ...noBattle }, 1, () => 0, - lookup, + controlledLookup, + controlledCatalogNodes, STAGE_GAUGE_THRESHOLDS, ) - expect(evolved).toEqual({ current: controlledTarget, gauge: 0, isTerminal: true }) + expect(pending).toEqual({ + current: controlledCurrent, + gauge: STAGE_GAUGE_THRESHOLDS[0], + isTerminal: false, + pendingEvolutionTargetId: "controlled-target", + battleOpponentNodeId: "controlled-opponent", + }) + + expect(resolveEvolutionBattle(pending, true, controlledLookup)).toEqual({ + current: controlledTarget, + gauge: 0, + isTerminal: true, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + }) }) test("Given a controlled lookup missing the selected target When token progress reaches a threshold Then it retains the existing catalog error", () => { expect(() => applyTokenProgress( - { current: controlledCurrent, gauge: 4_999_999, isTerminal: false }, + { current: controlledCurrent, gauge: 4_999_999, isTerminal: false, ...noBattle }, 1, () => 0, - new Map(), + new Map([[controlledCurrent.id, controlledCurrent]]), + [controlledCurrent], STAGE_GAUGE_THRESHOLDS, ), ).toThrow("Evolution target controlled-target is missing from the catalog") @@ -172,31 +217,39 @@ describe("catalog and evolution", () => { 0: 1, }) - const evolved = applyTokenProgress( - { current: controlledCurrent, gauge: 0, isTerminal: false }, + const pending = applyTokenProgress( + { current: controlledCurrent, gauge: 0, isTerminal: false, ...noBattle }, 1, () => 0, - new Map([[controlledTarget.id, controlledTarget]]), + controlledLookup, + controlledCatalogNodes, thresholds, ) - expect(evolved).toEqual({ current: controlledTarget, gauge: 0, isTerminal: true }) + expect(resolveEvolutionBattle(pending, true, controlledLookup)).toEqual({ + current: controlledTarget, + gauge: 0, + isTerminal: true, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + }) }) test("Given an invalid selector When token progress reaches a threshold Then the existing selector error is retained", () => { expect(() => applyTokenProgress( - { current: controlledCurrent, gauge: 4_999_999, isTerminal: false }, + { current: controlledCurrent, gauge: 4_999_999, isTerminal: false, ...noBattle }, 1, () => 1, - new Map([[controlledTarget.id, controlledTarget]]), + controlledLookup, + controlledCatalogNodes, STAGE_GAUGE_THRESHOLDS, ), ).toThrow("Evolution selector must return a finite number in [0, 1), received 1") }) test("Given a terminal partner When token progress applies Then it preserves the existing terminal state", () => { - const state = { current: controlledTarget, gauge: 0, isTerminal: true } as const + const state = { current: controlledTarget, gauge: 0, isTerminal: true, ...noBattle } as const expect( applyTokenProgress( @@ -205,7 +258,8 @@ describe("catalog and evolution", () => { () => { throw new Error("selector must not run") }, - new Map(), + controlledLookup, + controlledCatalogNodes, STAGE_GAUGE_THRESHOLDS, ), ).toBe(state) @@ -219,24 +273,26 @@ describe("catalog and evolution", () => { expect( applyTokenProgress( - { current: controlledCurrent, gauge: 0, isTerminal: false }, + { current: controlledCurrent, gauge: 0, isTerminal: false, ...noBattle }, 1, () => { throw new Error("selector must not run") }, - new Map(), + controlledLookup, + controlledCatalogNodes, thresholds, ), - ).toEqual({ current: controlledCurrent, gauge: 1, isTerminal: false }) + ).toEqual({ current: controlledCurrent, gauge: 1, isTerminal: false, ...noBattle }) }) test("Given an incomplete untyped threshold policy When token progress applies Then it rejects the policy before evolution", () => { expect(() => applyTokenProgress( - { current: controlledCurrent, gauge: 0, isTerminal: false }, + { current: controlledCurrent, gauge: 0, isTerminal: false, ...noBattle }, 1, () => 0, - new Map([[controlledTarget.id, controlledTarget]]), + controlledLookup, + controlledCatalogNodes, {}, ), ).toThrow("Evolution thresholds must be a complete frozen policy of positive finite numbers") @@ -248,10 +304,11 @@ describe("catalog and evolution", () => { expect(() => applyTokenProgress( - { current: controlledCurrent, gauge: 0, isTerminal: false }, + { current: controlledCurrent, gauge: 0, isTerminal: false, ...noBattle }, 1, () => 0, - new Map([[controlledTarget.id, controlledTarget]]), + controlledLookup, + controlledCatalogNodes, thresholds, ), ).toThrow("Evolution thresholds must be a complete frozen policy of positive finite numbers") @@ -267,10 +324,11 @@ describe("catalog and evolution", () => { for (const thresholds of policies) { expect(() => applyTokenProgress( - { current: controlledCurrent, gauge: 0, isTerminal: false }, + { current: controlledCurrent, gauge: 0, isTerminal: false, ...noBattle }, 1, () => 0, - new Map([[controlledTarget.id, controlledTarget]]), + controlledLookup, + controlledCatalogNodes, thresholds, ), ).toThrow("Evolution thresholds must be a complete frozen policy of positive finite numbers") @@ -283,15 +341,35 @@ describe("catalog and evolution", () => { expect(Reflect.set(thresholds, 0, 1)).toBeFalse() expect( applyTokenProgress( - { current: controlledCurrent, gauge: 0, isTerminal: false }, + { current: controlledCurrent, gauge: 0, isTerminal: false, ...noBattle }, 1, () => { throw new Error("selector must not run") }, - new Map(), + controlledLookup, + controlledCatalogNodes, thresholds, ), - ).toEqual({ current: controlledCurrent, gauge: 1, isTerminal: false }) + ).toEqual({ current: controlledCurrent, gauge: 1, isTerminal: false, ...noBattle }) + }) + + test("Given a lost evolution battle When resolving Then gauge resets for the current stage", () => { + const pending = applyTokenProgress( + { current: controlledCurrent, gauge: 4_999_999, isTerminal: false, ...noBattle }, + 1, + () => 0, + controlledLookup, + controlledCatalogNodes, + STAGE_GAUGE_THRESHOLDS, + ) + + expect(resolveEvolutionBattle(pending, false, controlledLookup)).toEqual({ + current: controlledCurrent, + gauge: 0, + isTerminal: false, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + }) }) }) diff --git a/packages/opencode-vpet/tests/get-sidebar-card-inputs.test.ts b/packages/opencode-vpet/tests/get-sidebar-card-inputs.test.ts index 22f56b1..bd58705 100644 --- a/packages/opencode-vpet/tests/get-sidebar-card-inputs.test.ts +++ b/packages/opencode-vpet/tests/get-sidebar-card-inputs.test.ts @@ -32,6 +32,11 @@ const catalog: DigimonCatalog = { ]), } +const snapshotFields = { + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, +} as const + describe("get sidebar card inputs", () => { test("Given a reader without a snapshot When querying sidebar card inputs Then it returns no partner", () => { const reader: SidebarSnapshotReader = { @@ -50,6 +55,7 @@ describe("get sidebar card inputs", () => { frozen: false, isSetOverride: false, trainerTotalTokens: 40_000, + ...snapshotFields, }), } @@ -61,6 +67,7 @@ describe("get sidebar card inputs", () => { frozen: false, isSetOverride: false, trainerTotalTokens: 40_000, + evolutionBattlePending: false, }) }) @@ -73,6 +80,7 @@ describe("get sidebar card inputs", () => { frozen: false, isSetOverride: false, trainerTotalTokens: 40_000, + ...snapshotFields, }), } @@ -88,6 +96,7 @@ describe("get sidebar card inputs", () => { frozen: false, isSetOverride: true, trainerTotalTokens: 40_000, + ...snapshotFields, }), } @@ -103,6 +112,7 @@ describe("get sidebar card inputs", () => { frozen: false, isSetOverride: true, trainerTotalTokens: 40_000, + ...snapshotFields, }), } @@ -114,6 +124,7 @@ describe("get sidebar card inputs", () => { frozen: false, isSetOverride: true, trainerTotalTokens: 40_000, + evolutionBattlePending: false, }) }) @@ -126,6 +137,7 @@ describe("get sidebar card inputs", () => { frozen: false, isSetOverride: false, trainerTotalTokens: 40_000, + ...snapshotFields, }), } @@ -137,6 +149,7 @@ describe("get sidebar card inputs", () => { frozen: false, isSetOverride: false, trainerTotalTokens: 40_000, + evolutionBattlePending: false, }) }) @@ -149,6 +162,7 @@ describe("get sidebar card inputs", () => { frozen: true, isSetOverride: false, trainerTotalTokens: 40_000, + ...snapshotFields, }), } @@ -160,6 +174,7 @@ describe("get sidebar card inputs", () => { frozen: true, isSetOverride: false, trainerTotalTokens: 40_000, + evolutionBattlePending: false, }) }) }) diff --git a/packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts b/packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts index ff2ef3d..2064f0b 100644 --- a/packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts +++ b/packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts @@ -72,6 +72,7 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => await dispatch(createHooks(repository, delivered), directEvent("direct-only")) expect(delivered).toEqual([ + expect.objectContaining({ title: "Evolution battle", variant: "info", duration: 5_000 }), expect.objectContaining({ title: "Digi-evolution", variant: "success", duration: 5_000 }), ]) expect(repository.getActivePartner()).toEqual(expect.objectContaining({ currentNodeId: "1-001", gauge: 0 })) @@ -90,7 +91,7 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => spawn(repository) await dispatch(createHooks(repository, delivered, [completedMessage("idle-only")]), idleEvent) - expect(delivered).toHaveLength(1) + expect(delivered).toHaveLength(2) expect(repository.getActivePartner()).toEqual(expect.objectContaining({ currentNodeId: "1-001", gauge: 0 })) expect(repository.listUsageReceipts().map((receipt) => receipt.receiptKey)).toEqual(["message:idle-only"]) expect(repository.getTrainerState()).toEqual({ totalTokens: 1 }) @@ -111,7 +112,7 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => const trainer = repository.getTrainerState() await dispatch(createHooks(repository, delivered, [completedMessage("direct-then-idle")]), idleEvent) - expect(delivered).toHaveLength(1) + expect(delivered).toHaveLength(2) expect(repository.getActivePartner()).toEqual(partner) expect(repository.listUsageReceipts()).toEqual(receipts) expect(repository.getTrainerState()).toEqual(trainer) @@ -132,7 +133,7 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => const trainer = repository.getTrainerState() await dispatch(createHooks(repository, delivered), directEvent("idle-then-direct")) - expect(delivered).toHaveLength(1) + expect(delivered).toHaveLength(2) expect(repository.getActivePartner()).toEqual(partner) expect(repository.listUsageReceipts()).toEqual(receipts) expect(repository.getTrainerState()).toEqual(trainer) @@ -157,7 +158,7 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => try { await dispatch(createHooks(reopenedRepository, delivered, [completedMessage("reopen-replay")]), idleEvent) - expect(delivered).toHaveLength(1) + expect(delivered).toHaveLength(2) expect(reopenedRepository.getActivePartner()).toEqual(expectedPartner) expect(reopenedRepository.listUsageReceipts()).toEqual(expectedReceipts) expect(reopenedRepository.getTrainerState()).toEqual(expectedTrainer) @@ -189,7 +190,7 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => try { await dispatch(createHooks(reopenedRepository, delivered, [completedMessage("notifier-failure")]), idleEvent) - expect(attempts).toBe(1) + expect(attempts).toBe(2) expect(delivered).toEqual([]) expect(reopenedRepository.getActivePartner()).toEqual(expectedPartner) expect(reopenedRepository.listUsageReceipts()).toEqual(expectedReceipts) @@ -214,10 +215,7 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => idleEvent, ) - expect(delivered.map((payload) => payload.message)).toEqual([ - "Digiegg evolved into Argomon!", - "Argomon evolved into Argomon!", - ]) + expect(delivered.map((payload) => payload.title)).toEqual(["Evolution battle", "Digi-evolution"]) expect(repository.listUsageReceipts().map((receipt) => receipt.receiptKey)).toEqual([ "message:ordered-first", "message:ordered-second", diff --git a/packages/opencode-vpet/tests/record-usage.test.ts b/packages/opencode-vpet/tests/record-usage.test.ts index d94c136..89d5e15 100644 --- a/packages/opencode-vpet/tests/record-usage.test.ts +++ b/packages/opencode-vpet/tests/record-usage.test.ts @@ -28,12 +28,16 @@ const targetNode: DigimonNode = { url: "https://example.test/target", } +const catalogNodes = [currentNode, targetNode] + const activePartner: Partner = { partnerId: "partner-1", generation: 1, currentNodeId: currentNode.id, gauge: 4_999_999, isTerminal: false, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, createdAt: "2026-07-31T00:00:00.000Z", retiredAt: null, } @@ -69,7 +73,7 @@ const createLedger = (outcome: "applied" | "duplicate" | "no_active_partner", pa } describe("record usage application use case", () => { - test("Given completed usage and an active partner When recording it Then the ledger applies the transaction-scoped evolution", () => { + test("Given completed usage and an active partner When recording it Then the ledger opens a pending evolution battle", () => { const ledger = createLedger("applied") const outcome = recordUsage({ @@ -79,6 +83,7 @@ describe("record usage application use case", () => { [currentNode.id, currentNode], [targetNode.id, targetNode], ]), + catalogNodes, selector: () => 0, thresholds: STAGE_GAUGE_THRESHOLDS, }) @@ -86,14 +91,19 @@ describe("record usage application use case", () => { expect(outcome).toEqual({ kind: "applied", receiptKey: "receipt-1", - evolution: { fromNodeId: currentNode.id, toNodeId: targetNode.id }, + evolutionBattlePending: { + opponentNodeId: currentNode.id, + targetNodeId: targetNode.id, + }, }) expect(ledger.receipts).toEqual([usage("receipt-1")]) expect(ledger.evolutions).toEqual([ { - currentNodeId: targetNode.id, - gauge: 0, - isTerminal: true, + currentNodeId: currentNode.id, + gauge: STAGE_GAUGE_THRESHOLDS[0], + isTerminal: false, + pendingEvolutionTargetId: targetNode.id, + battleOpponentNodeId: currentNode.id, }, ]) }) @@ -111,6 +121,7 @@ describe("record usage application use case", () => { selector: () => { throw new Error("selector must not run") }, + catalogNodes, thresholds: STAGE_GAUGE_THRESHOLDS, }) @@ -121,6 +132,8 @@ describe("record usage application use case", () => { currentNodeId: currentNode.id, gauge: 1, isTerminal: false, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, }, ]) }) @@ -135,6 +148,7 @@ describe("record usage application use case", () => { selector: () => { throw new Error("selector must not run") }, + catalogNodes, thresholds: STAGE_GAUGE_THRESHOLDS, }) @@ -152,6 +166,7 @@ describe("record usage application use case", () => { selector: () => { throw new Error("selector must not run") }, + catalogNodes, thresholds: STAGE_GAUGE_THRESHOLDS, }) @@ -178,6 +193,7 @@ describe("record usage application use case", () => { selector: () => { throw new Error("selector must not run") }, + catalogNodes, thresholds: STAGE_GAUGE_THRESHOLDS, }) @@ -201,6 +217,7 @@ describe("record usage application use case", () => { selector: () => { throw new Error("selector must not run") }, + catalogNodes, thresholds: STAGE_GAUGE_THRESHOLDS, }) @@ -210,6 +227,8 @@ describe("record usage application use case", () => { currentNodeId: targetNode.id, gauge: 0, isTerminal: true, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, }, ]) }) @@ -233,6 +252,7 @@ describe("record usage application use case", () => { selector: () => { throw new Error("selector must not run") }, + catalogNodes, thresholds: STAGE_GAUGE_THRESHOLDS, }) @@ -254,6 +274,7 @@ describe("record usage application use case", () => { ledger, digimonById: new Map(), selector: () => 0, + catalogNodes, thresholds: STAGE_GAUGE_THRESHOLDS, }), ).toThrow("Persisted partner node missing is missing from the catalog") @@ -278,12 +299,13 @@ describe("record usage application use case", () => { [targetNode.id, targetNode], ]), selector: () => 0, + catalogNodes, thresholds: STAGE_GAUGE_THRESHOLDS, }), ).toThrow(writeFailure) }) - test("Given a custom child threshold When recording usage Then the ledger evolves at the supplied threshold", () => { + test("Given a custom child threshold When recording usage Then the ledger opens a pending evolution battle", () => { const thresholds: StageThresholds = Object.freeze({ ...STAGE_GAUGE_THRESHOLDS, 0: 1, @@ -297,6 +319,7 @@ describe("record usage application use case", () => { [currentNode.id, currentNode], [targetNode.id, targetNode], ]), + catalogNodes, selector: () => 0, thresholds, }) @@ -304,13 +327,18 @@ describe("record usage application use case", () => { expect(outcome).toEqual({ kind: "applied", receiptKey: "receipt-custom-threshold", - evolution: { fromNodeId: currentNode.id, toNodeId: targetNode.id }, + evolutionBattlePending: { + opponentNodeId: currentNode.id, + targetNodeId: targetNode.id, + }, }) expect(ledger.evolutions).toEqual([ { - currentNodeId: targetNode.id, - gauge: 0, - isTerminal: true, + currentNodeId: currentNode.id, + gauge: 1, + isTerminal: false, + pendingEvolutionTargetId: targetNode.id, + battleOpponentNodeId: currentNode.id, }, ]) }) diff --git a/packages/opencode-vpet/tests/server-hooks-lifecycle.test.ts b/packages/opencode-vpet/tests/server-hooks-lifecycle.test.ts index 6e2e60d..9d31246 100644 --- a/packages/opencode-vpet/tests/server-hooks-lifecycle.test.ts +++ b/packages/opencode-vpet/tests/server-hooks-lifecycle.test.ts @@ -63,6 +63,8 @@ const createToastRepository = () => { currentNodeId: "0-001", gauge: 0, isTerminal: false, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, createdAt: "2026-07-31T00:00:00.000Z", retiredAt: null, }), @@ -74,9 +76,17 @@ const createToastRepository = () => { readonly currentNodeId: string readonly gauge: number readonly isTerminal: boolean + readonly pendingEvolutionTargetId: string | null + readonly battleOpponentNodeId: string | null readonly createdAt: string readonly retiredAt: string | null - }) => { readonly currentNodeId: string; readonly gauge: number; readonly isTerminal: boolean }, + }) => { + readonly currentNodeId: string + readonly gauge: number + readonly isTerminal: boolean + readonly pendingEvolutionTargetId: string | null + readonly battleOpponentNodeId: string | null + }, ) => { evolve({ partnerId: "partner-1", @@ -84,6 +94,8 @@ const createToastRepository = () => { currentNodeId: "0-001", gauge: 0, isTerminal: false, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, createdAt: "2026-07-31T00:00:00.000Z", retiredAt: null, }) @@ -240,9 +252,24 @@ describe("server hook lifecycle", () => { await eventHandler({ event: { type: "session.idle", properties: { sessionID: "session-1" } } satisfies Event }) expect(delivered).toEqual([ - { title: "Digi-evolution", message: "Digitama evolved into Koromon!", variant: "success", duration: 5_000 }, - { title: "Digi-evolution", message: "Digitama evolved into Koromon!", variant: "success", duration: 5_000 }, - { title: "Digi-evolution", message: "Digitama evolved into Koromon!", variant: "success", duration: 5_000 }, + { + title: "Evolution battle", + message: "Battle against Digitama! Win to evolve.", + variant: "info", + duration: 5_000, + }, + { + title: "Evolution battle", + message: "Battle against Digitama! Win to evolve.", + variant: "info", + duration: 5_000, + }, + { + title: "Evolution battle", + message: "Battle against Digitama! Win to evolve.", + variant: "info", + duration: 5_000, + }, ]) }) diff --git a/packages/opencode-vpet/tests/server-thresholds.test.ts b/packages/opencode-vpet/tests/server-thresholds.test.ts index 933a870..b0124de 100644 --- a/packages/opencode-vpet/tests/server-thresholds.test.ts +++ b/packages/opencode-vpet/tests/server-thresholds.test.ts @@ -156,6 +156,8 @@ describe("server threshold policy", () => { currentNodeId: "3-001", gauge: 0, isTerminal: false, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, createdAt: "2026-08-21T00:00:00.000Z", retiredAt: null, } @@ -184,8 +186,15 @@ describe("server threshold policy", () => { await dispatch(idleHooks, { type: "session.idle", properties: { sessionID: "session-1" } } satisfies Event) expect(directRepository.progressions).toEqual(idleRepository.progressions) - expect(directRepository.progressions).toEqual([expect.objectContaining({ gauge: 0, isTerminal: false })]) - expect(directRepository.progressions[0]?.currentNodeId).not.toBe(partner.currentNodeId) + expect(directRepository.progressions).toEqual([ + expect.objectContaining({ + currentNodeId: partner.currentNodeId, + gauge: 1, + isTerminal: false, + pendingEvolutionTargetId: expect.any(String), + battleOpponentNodeId: expect.any(String), + }), + ]) }) test("Given default thresholds When direct usage arrives below the child threshold Then the existing timing is retained", async () => { @@ -195,6 +204,8 @@ describe("server threshold policy", () => { currentNodeId: "3-001", gauge: 0, isTerminal: false, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, createdAt: "2026-08-21T00:00:00.000Z", retiredAt: null, } @@ -211,6 +222,8 @@ describe("server threshold policy", () => { currentNodeId: partner.currentNodeId, gauge: 1, isTerminal: false, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, }, ]) }) @@ -241,7 +254,12 @@ describe("server threshold policy", () => { databasePath: join(appDataRoot, "opencode-vpet", "pet.db"), }) try { - expect(repository.getActivePartner()?.gauge).toBe(0) + expect(repository.getActivePartner()).toEqual( + expect.objectContaining({ + gauge: 1, + pendingEvolutionTargetId: "1-001", + }), + ) } finally { await repository.close() } @@ -263,7 +281,12 @@ describe("server threshold policy", () => { databasePath: join(appDataRoot, "opencode-vpet", "pet.db"), }) try { - expect(repository.getActivePartner()?.gauge).toBe(0) + expect(repository.getActivePartner()).toEqual( + expect.objectContaining({ + gauge: 1, + pendingEvolutionTargetId: "1-001", + }), + ) } finally { await repository.close() } diff --git a/packages/opencode-vpet/tests/sidebar-state.test.ts b/packages/opencode-vpet/tests/sidebar-state.test.ts index 7729c1c..54f3117 100644 --- a/packages/opencode-vpet/tests/sidebar-state.test.ts +++ b/packages/opencode-vpet/tests/sidebar-state.test.ts @@ -82,6 +82,12 @@ describe("SQLite sidebar snapshot reader", () => { frozen: false, isSetOverride: false, trainerTotalTokens: 100, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, }) expect(closeSpy).toHaveBeenCalledTimes(1) } finally { @@ -116,6 +122,12 @@ describe("SQLite sidebar snapshot reader", () => { frozen: true, isSetOverride: false, trainerTotalTokens: 0, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, }) } finally { await repository.close() @@ -149,6 +161,12 @@ describe("SQLite sidebar snapshot reader", () => { frozen: false, isSetOverride: true, trainerTotalTokens: 900, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, }) const withoutPartner = new Database(databasePath) @@ -162,6 +180,12 @@ describe("SQLite sidebar snapshot reader", () => { frozen: false, isSetOverride: true, trainerTotalTokens: 900, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, }) } finally { await repository.close() @@ -202,6 +226,12 @@ describe("SQLite sidebar snapshot reader", () => { frozen: false, isSetOverride: true, trainerTotalTokens: 900, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, }) const afterDatabase = new Database(databasePath) @@ -248,6 +278,12 @@ describe("SQLite sidebar snapshot reader", () => { frozen: false, isSetOverride: true, trainerTotalTokens: 0, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, }) const stored = new Database(databasePath) expect(stored.query("SELECT cheat_node_id FROM vpet_control_state WHERE control_id = 1").get()).toEqual({ diff --git a/packages/opencode-vpet/tests/sidebar-view-model.test.ts b/packages/opencode-vpet/tests/sidebar-view-model.test.ts index e4c9f8a..ca5535d 100644 --- a/packages/opencode-vpet/tests/sidebar-view-model.test.ts +++ b/packages/opencode-vpet/tests/sidebar-view-model.test.ts @@ -21,6 +21,7 @@ describe("static sidebar model", () => { frozen: false, isSetOverride: false, trainerTotalTokens: 25_000, + evolutionBattlePending: false, } as const test("Given default Japanese settings When building the sidebar model Then it renders catalog Japanese names and familiar labels", () => { @@ -29,6 +30,7 @@ describe("static sidebar model", () => { if (model.kind !== "partner") throw new Error("Expected partner sidebar model") expect(Object.keys(model).sort()).toEqual([ + "evolutionBattlePending", "frozen", "gauge", "isSetOverride", diff --git a/packages/opencode-vpet/tests/tui-composition-fixture.ts b/packages/opencode-vpet/tests/tui-composition-fixture.ts index 9b48bd4..d756702 100644 --- a/packages/opencode-vpet/tests/tui-composition-fixture.ts +++ b/packages/opencode-vpet/tests/tui-composition-fixture.ts @@ -55,6 +55,7 @@ export const partnerInputs = (sprite: string, options: PartnerInputOptions = {}) frozen: false, isSetOverride: options.isSetOverride ?? false, trainerTotalTokens: 100, + evolutionBattlePending: false, }) export const settle = async (): Promise => { diff --git a/packages/vpet-core/src/adapters/sqlite/sqlite-migrations.ts b/packages/vpet-core/src/adapters/sqlite/sqlite-migrations.ts index bae02d7..47878cb 100644 --- a/packages/vpet-core/src/adapters/sqlite/sqlite-migrations.ts +++ b/packages/vpet-core/src/adapters/sqlite/sqlite-migrations.ts @@ -106,6 +106,13 @@ const MIGRATIONS = [ `, ], }, + { + version: 4, + sql: [ + "ALTER TABLE partners ADD COLUMN pending_evolution_target_id TEXT", + "ALTER TABLE partners ADD COLUMN battle_opponent_node_id TEXT", + ], + }, ] as const satisfies readonly Migration[] type MigrationRow = { diff --git a/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-schema.ts b/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-schema.ts index 3b79c48..29cbf29 100644 --- a/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-schema.ts +++ b/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-schema.ts @@ -7,6 +7,8 @@ export type PersistedPartnerRow = { readonly current_node_id: string readonly gauge: number readonly is_terminal: number + readonly pending_evolution_target_id: string | null + readonly battle_opponent_node_id: string | null readonly created_at: string readonly retired_at: string | null } @@ -40,15 +42,21 @@ export type MigrationRow = { readonly version: number } -export const ACTIVE_PARTNER_SELECT = ` - SELECT +const PARTNER_COLUMNS = ` partner_id, generation, current_node_id, gauge, is_terminal, + pending_evolution_target_id, + battle_opponent_node_id, created_at, retired_at +` + +export const ACTIVE_PARTNER_SELECT = ` + SELECT + ${PARTNER_COLUMNS} FROM partners WHERE retired_at IS NULL LIMIT 1 @@ -56,39 +64,21 @@ export const ACTIVE_PARTNER_SELECT = ` export const PARTNERS_SELECT = ` SELECT - partner_id, - generation, - current_node_id, - gauge, - is_terminal, - created_at, - retired_at + ${PARTNER_COLUMNS} FROM partners ORDER BY generation ASC, created_at ASC, partner_id ASC ` export const ARCHIVE_PARTNERS_SELECT = ` SELECT - partner_id, - generation, - current_node_id, - gauge, - is_terminal, - created_at, - retired_at + ${PARTNER_COLUMNS} FROM partners ORDER BY partner_id ASC ` export const PARTNER_BY_GENERATION_SELECT = ` SELECT - partner_id, - generation, - current_node_id, - gauge, - is_terminal, - created_at, - retired_at + ${PARTNER_COLUMNS} FROM partners WHERE generation = ? LIMIT 1 @@ -138,6 +128,8 @@ export const toPartner = (row: PersistedPartnerRow): Partner => { currentNodeId: row.current_node_id, gauge: row.gauge, isTerminal: row.is_terminal === 1, + pendingEvolutionTargetId: row.pending_evolution_target_id, + battleOpponentNodeId: row.battle_opponent_node_id, createdAt: row.created_at, retiredAt: row.retired_at, } diff --git a/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-types.ts b/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-types.ts index 615b170..8ad9155 100644 --- a/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-types.ts +++ b/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-types.ts @@ -1,6 +1,10 @@ import type { Partner, PartnerProgression } from "../../domain/partner.ts" import type { SpawnPartnerInput } from "../../application/models/spawn-partner.ts" -import type { ApplyUsageReceiptOutcome, UsageReceiptMetadata } from "../../application/models/usage.ts" +import type { + ApplyUsageReceiptOutcome, + ResolveEvolutionBattleOutcome, + UsageReceiptMetadata, +} from "../../application/models/usage.ts" import type { PartnerLifecycle } from "../../application/ports/partner-lifecycle.ts" import type { UsageLedger } from "../../application/ports/usage-ledger.ts" import type { VpetControl } from "../../application/ports/vpet-control.ts" @@ -47,6 +51,10 @@ export type SqliteVpetWriteStore = PartnerLifecycle & getPartnerByGeneration: (generation: number) => PersistedPartnerSummary | null listPartnerEvents: (partnerId: string) => readonly PersistedPartnerEvent[] listUsageReceipts: () => readonly UsageReceiptRecord[] + resolveEvolutionBattle: ( + nextState: PartnerProgression, + createdAt: string, + ) => ResolveEvolutionBattleOutcome } export type { ApplyUsageReceiptOutcome, PartnerProgression, SpawnPartnerInput, UsageReceiptMetadata } diff --git a/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-write-store.ts b/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-write-store.ts index ac8382f..3084919 100644 --- a/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-write-store.ts +++ b/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-write-store.ts @@ -1,5 +1,5 @@ import type { SpawnPartnerInput } from "../../application/models/spawn-partner.ts" -import type { UsageReceiptMetadata } from "../../application/models/usage.ts" +import type { ResolveEvolutionBattleOutcome, UsageReceiptMetadata } from "../../application/models/usage.ts" import type { Partner, PartnerProgression } from "../../domain/partner.ts" import type { SqliteExecutor } from "../../ports/sqlite-executor.ts" import { runMigrations } from "./sqlite-migrations.ts" @@ -123,7 +123,7 @@ export const createSqliteVpetWriteStore = (options: CreateSqliteVpetWriteStoreOp if (generationRow === null) throw new Error("Generation allocation failed") const partnerId = `partner-${generationRow.generation}` executor.run( - "INSERT INTO partners (partner_id, generation, current_node_id, gauge, is_terminal, created_at, retired_at) VALUES (?, ?, ?, ?, ?, ?, NULL)", + "INSERT INTO partners (partner_id, generation, current_node_id, gauge, is_terminal, pending_evolution_target_id, battle_opponent_node_id, created_at, retired_at) VALUES (?, ?, ?, ?, ?, NULL, NULL, ?, NULL)", [partnerId, generationRow.generation, input.currentNodeId, input.gauge, input.isTerminal, input.createdAt], ) executor.run( @@ -179,12 +179,17 @@ export const createSqliteVpetWriteStore = (options: CreateSqliteVpetWriteStoreOp if (activePartnerRow === null) return { kind: "no_active_partner" } as const const activePartner = toPartner(activePartnerRow) const nextState = evolve(activePartner) - executor.run("UPDATE partners SET current_node_id = ?, gauge = ?, is_terminal = ? WHERE partner_id = ?", [ - nextState.currentNodeId, - nextState.gauge, - nextState.isTerminal, - activePartner.partnerId, - ]) + executor.run( + "UPDATE partners SET current_node_id = ?, gauge = ?, is_terminal = ?, pending_evolution_target_id = ?, battle_opponent_node_id = ? WHERE partner_id = ?", + [ + nextState.currentNodeId, + nextState.gauge, + nextState.isTerminal, + nextState.pendingEvolutionTargetId, + nextState.battleOpponentNodeId, + activePartner.partnerId, + ], + ) executor.run( "INSERT INTO partner_events (event_id, partner_id, kind, current_node_id, gauge, is_terminal, token_delta, receipt_key, created_at) VALUES (?, ?, 'usage_applied', ?, ?, ?, ?, ?, ?)", [ @@ -218,6 +223,49 @@ export const createSqliteVpetWriteStore = (options: CreateSqliteVpetWriteStoreOp listUsageReceipts() { return executor.all(USAGE_RECEIPTS_SELECT).map(toUsageReceiptRecord) }, + resolveEvolutionBattle(nextState: PartnerProgression, createdAt: string): ResolveEvolutionBattleOutcome { + return executor.transaction(() => { + const activePartnerRow = executor.get(ACTIVE_PARTNER_SELECT) + if (activePartnerRow === null) return { kind: "no_pending_battle" } as const + + const activePartner = toPartner(activePartnerRow) + if (activePartner.pendingEvolutionTargetId === null || activePartner.battleOpponentNodeId === null) { + return { kind: "no_pending_battle" } as const + } + + const fromNodeId = activePartner.currentNodeId + executor.run( + "UPDATE partners SET current_node_id = ?, gauge = ?, is_terminal = ?, pending_evolution_target_id = ?, battle_opponent_node_id = ? WHERE partner_id = ?", + [ + nextState.currentNodeId, + nextState.gauge, + nextState.isTerminal, + nextState.pendingEvolutionTargetId, + nextState.battleOpponentNodeId, + activePartner.partnerId, + ], + ) + executor.run( + "INSERT INTO partner_events (event_id, partner_id, kind, current_node_id, gauge, is_terminal, token_delta, receipt_key, created_at) VALUES (?, ?, 'usage_applied', ?, ?, ?, NULL, NULL, ?)", + [ + `event-battle-${createdAt}`, + activePartner.partnerId, + nextState.currentNodeId, + nextState.gauge, + nextState.isTerminal, + createdAt, + ], + ) + + if (nextState.currentNodeId !== fromNodeId) { + return { + kind: "won", + evolution: { fromNodeId, toNodeId: nextState.currentNodeId }, + } as const + } + return { kind: "lost" } as const + }) + }, } satisfies SqliteVpetWriteStore return store diff --git a/packages/vpet-core/src/application/models/sidebar-card-inputs.ts b/packages/vpet-core/src/application/models/sidebar-card-inputs.ts index 57c1c11..cc50a18 100644 --- a/packages/vpet-core/src/application/models/sidebar-card-inputs.ts +++ b/packages/vpet-core/src/application/models/sidebar-card-inputs.ts @@ -10,4 +10,5 @@ export type SidebarCardInputs = readonly frozen: boolean readonly isSetOverride: boolean readonly trainerTotalTokens: number + readonly evolutionBattlePending: boolean } diff --git a/packages/vpet-core/src/application/models/usage.ts b/packages/vpet-core/src/application/models/usage.ts index e881ce5..4779c6b 100644 --- a/packages/vpet-core/src/application/models/usage.ts +++ b/packages/vpet-core/src/application/models/usage.ts @@ -16,11 +16,22 @@ export type UsageEvolutionTransition = { readonly toNodeId: string } +export type EvolutionBattlePending = { + readonly opponentNodeId: string + readonly targetNodeId: string +} + export type UsageProcessingResult = | { readonly kind: "applied" readonly receiptKey: string readonly evolution?: UsageEvolutionTransition + readonly evolutionBattlePending?: EvolutionBattlePending } | { readonly kind: "duplicate"; readonly receiptKey: string } | { readonly kind: "no_active_partner"; readonly receiptKey: string } + +export type ResolveEvolutionBattleOutcome = + | { readonly kind: "won"; readonly evolution: UsageEvolutionTransition } + | { readonly kind: "lost" } + | { readonly kind: "no_pending_battle" } diff --git a/packages/vpet-core/src/application/ports/sidebar-snapshot.ts b/packages/vpet-core/src/application/ports/sidebar-snapshot.ts index 0bc7f77..dc7f581 100644 --- a/packages/vpet-core/src/application/ports/sidebar-snapshot.ts +++ b/packages/vpet-core/src/application/ports/sidebar-snapshot.ts @@ -5,6 +5,8 @@ export type SidebarSnapshot = { readonly frozen: boolean readonly isSetOverride: boolean readonly trainerTotalTokens: number + readonly pendingEvolutionTargetId: string | null + readonly battleOpponentNodeId: string | null } export type SidebarSnapshotReader = { diff --git a/packages/vpet-core/src/application/use-cases/get-sidebar-card-inputs.ts b/packages/vpet-core/src/application/use-cases/get-sidebar-card-inputs.ts index d1771c4..d3ed08f 100644 --- a/packages/vpet-core/src/application/use-cases/get-sidebar-card-inputs.ts +++ b/packages/vpet-core/src/application/use-cases/get-sidebar-card-inputs.ts @@ -19,5 +19,7 @@ export const getSidebarCardInputs = (reader: SidebarSnapshotReader, catalog: Dig frozen: snapshot.frozen, isSetOverride: snapshot.isSetOverride, trainerTotalTokens: snapshot.trainerTotalTokens, + evolutionBattlePending: + snapshot.pendingEvolutionTargetId !== null && snapshot.battleOpponentNodeId !== null, } } diff --git a/packages/vpet-core/src/application/use-cases/reconcile-usage.ts b/packages/vpet-core/src/application/use-cases/reconcile-usage.ts index bb1a404..5c8196b 100644 --- a/packages/vpet-core/src/application/use-cases/reconcile-usage.ts +++ b/packages/vpet-core/src/application/use-cases/reconcile-usage.ts @@ -8,6 +8,7 @@ export type ReconcileUsageInput = { readonly usages: readonly CompletedUsage[] readonly ledger: UsageLedger readonly digimonById: ReadonlyMap + readonly catalogNodes: readonly DigimonNode[] readonly selector: EvolutionSelector readonly thresholds: StageThresholds } @@ -16,12 +17,13 @@ export const reconcileUsage = ({ usages, ledger, digimonById, + catalogNodes, selector, thresholds, }: ReconcileUsageInput): readonly UsageProcessingResult[] => { const outcomes: UsageProcessingResult[] = [] for (const usage of usages) { - outcomes.push(recordUsage({ usage, ledger, digimonById, selector, thresholds })) + outcomes.push(recordUsage({ usage, ledger, digimonById, catalogNodes, selector, thresholds })) } return outcomes } diff --git a/packages/vpet-core/src/application/use-cases/record-usage.ts b/packages/vpet-core/src/application/use-cases/record-usage.ts index 718e073..25583d2 100644 --- a/packages/vpet-core/src/application/use-cases/record-usage.ts +++ b/packages/vpet-core/src/application/use-cases/record-usage.ts @@ -9,6 +9,7 @@ export type RecordUsageInput = { readonly usage: CompletedUsage readonly ledger: UsageLedger readonly digimonById: ReadonlyMap + readonly catalogNodes: readonly DigimonNode[] readonly selector: EvolutionSelector readonly thresholds: StageThresholds } @@ -17,32 +18,66 @@ export const recordUsage = ({ usage, ledger, digimonById, + catalogNodes, selector, thresholds, }: RecordUsageInput): UsageProcessingResult => { let evolution: UsageEvolutionTransition | undefined + let evolutionBattlePending: { readonly opponentNodeId: string; readonly targetNodeId: string } | undefined + const outcome = ledger.applyUsageReceipt(usage, (partner) => { const current = digimonById.get(partner.currentNodeId) if (current === undefined) throw new Error(`Persisted partner node ${partner.currentNodeId} is missing from the catalog`) + const hadPendingBattle = + partner.pendingEvolutionTargetId != null && partner.battleOpponentNodeId != null + const next = applyTokenProgress( - { current, gauge: partner.gauge, isTerminal: partner.isTerminal }, + { + current, + gauge: partner.gauge, + isTerminal: partner.isTerminal, + pendingEvolutionTargetId: partner.pendingEvolutionTargetId, + battleOpponentNodeId: partner.battleOpponentNodeId, + }, usage.tokenDelta, selector, digimonById, + catalogNodes, thresholds, ) + if ( + !hadPendingBattle && + next.pendingEvolutionTargetId !== null && + next.battleOpponentNodeId !== null && + next.current.id === current.id + ) { + evolutionBattlePending = { + opponentNodeId: next.battleOpponentNodeId, + targetNodeId: next.pendingEvolutionTargetId, + } + } + if (next.current.id !== current.id) { evolution = { fromNodeId: current.id, toNodeId: next.current.id } } - return { currentNodeId: next.current.id, gauge: next.gauge, isTerminal: next.isTerminal } + return { + currentNodeId: next.current.id, + gauge: next.gauge, + isTerminal: next.isTerminal, + pendingEvolutionTargetId: next.pendingEvolutionTargetId, + battleOpponentNodeId: next.battleOpponentNodeId, + } }) switch (outcome.kind) { case "applied": + if (evolutionBattlePending !== undefined) { + return { kind: "applied", receiptKey: usage.receiptKey, evolutionBattlePending } + } return evolution === undefined ? { kind: "applied", receiptKey: usage.receiptKey } : { kind: "applied", receiptKey: usage.receiptKey, evolution } diff --git a/packages/vpet-core/src/application/use-cases/resolve-evolution-battle.ts b/packages/vpet-core/src/application/use-cases/resolve-evolution-battle.ts new file mode 100644 index 0000000..a3a163c --- /dev/null +++ b/packages/vpet-core/src/application/use-cases/resolve-evolution-battle.ts @@ -0,0 +1,54 @@ +import type { DigimonNode } from "../../domain/digimon-node.ts" +import { resolveEvolutionBattle } from "../../domain/evolution.ts" +import type { Partner } from "../../domain/partner.ts" +import type { ResolveEvolutionBattleOutcome } from "../models/usage.ts" + +export type EvolutionBattleRepository = { + getActivePartner: () => Partner | null + resolveEvolutionBattle: ( + nextState: import("../../domain/partner.ts").PartnerProgression, + createdAt: string, + ) => ResolveEvolutionBattleOutcome +} + +export const resolveEvolutionBattleForPartner = ( + repository: EvolutionBattleRepository, + won: boolean, + digimonById: ReadonlyMap, + createdAt: string, +): ResolveEvolutionBattleOutcome => { + const partner = repository.getActivePartner() + if (partner === null) return { kind: "no_pending_battle" } + + const current = digimonById.get(partner.currentNodeId) + if (current === undefined) { + throw new Error(`Persisted partner node ${partner.currentNodeId} is missing from the catalog`) + } + + if (partner.pendingEvolutionTargetId === null || partner.battleOpponentNodeId === null) { + return { kind: "no_pending_battle" } + } + + const next = resolveEvolutionBattle( + { + current, + gauge: partner.gauge, + isTerminal: partner.isTerminal, + pendingEvolutionTargetId: partner.pendingEvolutionTargetId, + battleOpponentNodeId: partner.battleOpponentNodeId, + }, + won, + digimonById, + ) + + return repository.resolveEvolutionBattle( + { + currentNodeId: next.current.id, + gauge: next.gauge, + isTerminal: next.isTerminal, + pendingEvolutionTargetId: next.pendingEvolutionTargetId, + battleOpponentNodeId: next.battleOpponentNodeId, + }, + createdAt, + ) +} diff --git a/packages/vpet-core/src/domain/evolution-battle.ts b/packages/vpet-core/src/domain/evolution-battle.ts new file mode 100644 index 0000000..af6d791 --- /dev/null +++ b/packages/vpet-core/src/domain/evolution-battle.ts @@ -0,0 +1,40 @@ +import type { DigimonNode } from "./digimon-node.ts" +import type { EvolutionSelector } from "./evolution.ts" + +export const pickEvolutionTarget = ( + current: DigimonNode, + selector: EvolutionSelector, +): string => { + if (current.nextEvolutions.length === 0) { + throw new Error("Evolution target selection failed: partner has no evolution options") + } + + const selection = selector() + if (!Number.isFinite(selection) || selection < 0 || selection >= 1) { + throw new Error(`Evolution selector must return a finite number in [0, 1), received ${selection}`) + } + + const targetId = current.nextEvolutions[Math.floor(selection * current.nextEvolutions.length)] + if (targetId === undefined) throw new Error("Evolution target selection failed") + return targetId +} + +export const pickRandomSameStageOpponent = ( + current: DigimonNode, + catalogNodes: readonly DigimonNode[], + selector: EvolutionSelector, +): string => { + const candidates = catalogNodes.filter((node) => node.stage === current.stage && node.id !== current.id) + if (candidates.length === 0) { + return current.id + } + + const selection = selector() + if (!Number.isFinite(selection) || selection < 0 || selection >= 1) { + throw new Error(`Evolution selector must return a finite number in [0, 1), received ${selection}`) + } + + const opponent = candidates[Math.floor(selection * candidates.length)] + if (opponent === undefined) throw new Error("Same-stage opponent selection failed") + return opponent.id +} diff --git a/packages/vpet-core/src/domain/evolution.ts b/packages/vpet-core/src/domain/evolution.ts index 878c81e..0116405 100644 --- a/packages/vpet-core/src/domain/evolution.ts +++ b/packages/vpet-core/src/domain/evolution.ts @@ -1,4 +1,5 @@ import type { DigimonNode } from "./digimon-node.ts" +import { pickEvolutionTarget, pickRandomSameStageOpponent } from "./evolution-battle.ts" import { DIGIMON_STAGES, type DigimonStage } from "./stage.ts" export type StageThresholds = Readonly> @@ -18,6 +19,8 @@ export type PartnerEvolutionState = { readonly current: DigimonNode readonly gauge: number readonly isTerminal: boolean + readonly pendingEvolutionTargetId: string | null + readonly battleOpponentNodeId: string | null } export type EvolutionSelector = () => number @@ -35,31 +38,79 @@ const isStageThresholds = (thresholds: unknown): thresholds is StageThresholds = }) } +const hasPendingBattle = (state: PartnerEvolutionState): boolean => + state.pendingEvolutionTargetId != null && state.battleOpponentNodeId != null + export const applyTokenProgress = ( state: PartnerEvolutionState, tokenDelta: number, selector: EvolutionSelector, digimonById: ReadonlyMap, + catalogNodes: readonly DigimonNode[], thresholds: unknown, ): PartnerEvolutionState => { if (!isStageThresholds(thresholds)) { throw new Error("Evolution thresholds must be a complete frozen policy of positive finite numbers") } if (state.isTerminal) return state + if (hasPendingBattle(state)) return state + const threshold = thresholds[state.current.stage] const gauge = state.gauge + tokenDelta - if (gauge < thresholds[state.current.stage]) return { ...state, gauge } - if (state.current.nextEvolutions.length === 0) return { ...state, gauge: 0, isTerminal: true } + if (gauge < threshold) return { ...state, gauge } + if (state.current.nextEvolutions.length === 0) { + return { ...state, gauge: 0, isTerminal: true, pendingEvolutionTargetId: null, battleOpponentNodeId: null } + } + + const pendingEvolutionTargetId = pickEvolutionTarget(state.current, selector) + const target = digimonById.get(pendingEvolutionTargetId) + if (target === undefined) { + throw new Error(`Evolution target ${pendingEvolutionTargetId} is missing from the catalog`) + } - const selection = selector() - if (!Number.isFinite(selection) || selection < 0 || selection >= 1) { - throw new Error(`Evolution selector must return a finite number in [0, 1), received ${selection}`) + const battleOpponentNodeId = pickRandomSameStageOpponent(state.current, catalogNodes, selector) + if (digimonById.get(battleOpponentNodeId) === undefined) { + throw new Error(`Battle opponent ${battleOpponentNodeId} is missing from the catalog`) } - const targetId = state.current.nextEvolutions[Math.floor(selection * state.current.nextEvolutions.length)] - if (targetId === undefined) throw new Error("Evolution target selection failed") + return { + current: state.current, + gauge: threshold, + isTerminal: false, + pendingEvolutionTargetId, + battleOpponentNodeId, + } +} + +export const resolveEvolutionBattle = ( + state: PartnerEvolutionState, + won: boolean, + digimonById: ReadonlyMap, +): PartnerEvolutionState => { + if (!hasPendingBattle(state)) { + throw new Error("Cannot resolve evolution battle without a pending battle") + } + + if (!won) { + return { + current: state.current, + gauge: 0, + isTerminal: state.isTerminal, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + } + } + + const targetId = state.pendingEvolutionTargetId + if (targetId === null) throw new Error("Pending evolution target is missing") const current = digimonById.get(targetId) if (current === undefined) throw new Error(`Evolution target ${targetId} is missing from the catalog`) - return { current, gauge: 0, isTerminal: current.nextEvolutions.length === 0 } + return { + current, + gauge: 0, + isTerminal: current.nextEvolutions.length === 0, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + } } diff --git a/packages/vpet-core/src/domain/partner.ts b/packages/vpet-core/src/domain/partner.ts index d153747..5e2ed9b 100644 --- a/packages/vpet-core/src/domain/partner.ts +++ b/packages/vpet-core/src/domain/partner.ts @@ -4,6 +4,8 @@ export type Partner = { readonly currentNodeId: string readonly gauge: number readonly isTerminal: boolean + readonly pendingEvolutionTargetId: string | null + readonly battleOpponentNodeId: string | null readonly createdAt: string readonly retiredAt: string | null } @@ -12,4 +14,6 @@ export type PartnerProgression = { readonly currentNodeId: string readonly gauge: number readonly isTerminal: boolean + readonly pendingEvolutionTargetId: string | null + readonly battleOpponentNodeId: string | null } diff --git a/packages/vpet-core/src/view-models/sidebar-view-model.ts b/packages/vpet-core/src/view-models/sidebar-view-model.ts index c345e99..0e77d8a 100644 --- a/packages/vpet-core/src/view-models/sidebar-view-model.ts +++ b/packages/vpet-core/src/view-models/sidebar-view-model.ts @@ -17,6 +17,7 @@ export type SidebarCardModel = readonly isTerminal: boolean readonly frozen: boolean readonly isSetOverride: boolean + readonly evolutionBattlePending: boolean } export const buildSidebarCardModel = ( @@ -38,5 +39,6 @@ export const buildSidebarCardModel = ( isTerminal: inputs.isTerminal, frozen: inputs.frozen, isSetOverride: inputs.isSetOverride, + evolutionBattlePending: inputs.evolutionBattlePending, } } From 7d85b259066c64c8ab556060262564363da6ea1e Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 16:12:52 +0900 Subject: [PATCH 09/41] feat(cursor-vpet): add blinking battle intro and post-battle reveal animations Show a FIGlet BATTLE banner that blinks before combat, then play evolution or defeat animations based on the battle outcome. Co-authored-by: Cursor --- .../cursor-vpet/src/webview/defeat-artwork.ts | 67 +++++++++ .../src/webview/evolution-artwork.ts | 138 ++++++++++++++++++ .../src/webview/evolution-battle-artwork.ts | 45 ++++++ .../src/webview/vpet-sidebar-provider.ts | 81 +++++++--- .../cursor-vpet/tests/defeat-artwork.test.ts | 26 ++++ .../tests/evolution-artwork.test.ts | 58 ++++++++ .../tests/evolution-battle-artwork.test.ts | 14 ++ 7 files changed, 410 insertions(+), 19 deletions(-) create mode 100644 packages/cursor-vpet/src/webview/defeat-artwork.ts create mode 100644 packages/cursor-vpet/src/webview/evolution-artwork.ts create mode 100644 packages/cursor-vpet/tests/defeat-artwork.test.ts create mode 100644 packages/cursor-vpet/tests/evolution-artwork.test.ts diff --git a/packages/cursor-vpet/src/webview/defeat-artwork.ts b/packages/cursor-vpet/src/webview/defeat-artwork.ts new file mode 100644 index 0000000..9ae1f75 --- /dev/null +++ b/packages/cursor-vpet/src/webview/defeat-artwork.ts @@ -0,0 +1,67 @@ +import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + +const FRAME_ROWS = 8 +const FRAME_COLUMNS = 16 + +export const DEFEAT_CYCLE_MS = 550 +export const DEFEAT_CYCLES = 5 +export const DEFEAT_PRE_ANIMATION_MS = 300 + +const NORMAL_FRAME: MonsterFrameName = "walk_1" +const SAD_FRAMES: readonly MonsterFrameName[] = ["refuse", "injured_1"] + +export type DefeatArtworkScene = { + readonly sad: boolean + readonly sadAlt: boolean +} + +const frameLines = (catalog: MonsterFrameCatalog, sprite: string, frameName: MonsterFrameName): string[] => { + const frame = catalog.get(sprite, frameName) ?? catalog.get(sprite, "walk_1") + if (frame === undefined) return Array.from({ length: FRAME_ROWS }, () => " ".repeat(FRAME_COLUMNS)) + return frame.content.split("\n") +} + +const sadFrameFor = (catalog: MonsterFrameCatalog, sprite: string, sadAlt: boolean): MonsterFrameName => { + const preferred = sadAlt ? SAD_FRAMES[1] : SAD_FRAMES[0] + if (preferred !== undefined && catalog.get(sprite, preferred) !== undefined) return preferred + const fallback = SAD_FRAMES.find((frameName) => catalog.get(sprite, frameName) !== undefined) + return fallback ?? "injured_1" +} + +const centerArtwork = (rows: readonly string[], viewportWidth: number): string => { + const padding = Math.max(Math.floor((viewportWidth - FRAME_COLUMNS) / 2), 0) + return rows.map((row) => `${" ".repeat(padding)}${row}`).join("\n") +} + +export const renderDefeatArtwork = ( + catalog: MonsterFrameCatalog, + sprite: string, + scene: DefeatArtworkScene, + viewportWidth: number, +): string => { + const frameName = scene.sad ? sadFrameFor(catalog, sprite, scene.sadAlt) : NORMAL_FRAME + const spriteRows = frameLines(catalog, sprite, frameName) + return centerArtwork(spriteRows, viewportWidth) +} + +export const sleep = (ms: number): Promise => + new Promise((resolve) => { + setTimeout(resolve, ms) + }) + +export const runDefeatAnimation = async ( + catalog: MonsterFrameCatalog, + sprite: string, + viewportWidth: number, + onFrame: (artwork: string) => Promise, +): Promise => { + await sleep(DEFEAT_PRE_ANIMATION_MS) + + for (let cycle = 0; cycle < DEFEAT_CYCLES; cycle += 1) { + const sad = cycle % 2 === 1 + const sadAlt = cycle % 4 >= 2 + await onFrame(renderDefeatArtwork(catalog, sprite, { sad, sadAlt }, viewportWidth)) + if (cycle < DEFEAT_CYCLES - 1) await sleep(DEFEAT_CYCLE_MS) + } +} diff --git a/packages/cursor-vpet/src/webview/evolution-artwork.ts b/packages/cursor-vpet/src/webview/evolution-artwork.ts new file mode 100644 index 0000000..e03f034 --- /dev/null +++ b/packages/cursor-vpet/src/webview/evolution-artwork.ts @@ -0,0 +1,138 @@ +import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + +const FRAME_ROWS = 8 +const FRAME_COLUMNS = 16 + +export const EVOLUTION_PRE_ANIMATION_MS = 400 +export const EVOLUTION_GLOW_MS = 700 +export const EVOLUTION_MORPH_MS = 1300 +export const EVOLUTION_REVEAL_MS = 1500 +export const EVOLUTION_TICK_MS = 70 + +const GLOW_GLYPHS = "▄▀█░" + +export type EvolutionArtworkPhase = "glow" | "morph" | "reveal" + +export type EvolutionArtworkScene = { + readonly phase: EvolutionArtworkPhase + readonly progress: number +} + +const frameLines = (catalog: MonsterFrameCatalog, sprite: string, frameName: MonsterFrameName): string[] => { + const frame = catalog.get(sprite, frameName) ?? catalog.get(sprite, "walk_1") + if (frame === undefined) return Array.from({ length: FRAME_ROWS }, () => " ".repeat(FRAME_COLUMNS)) + return frame.content.split("\n") +} + +const padRow = (row: string, width: number): string => row.padEnd(width, " ").slice(0, width) + +const centerArtwork = (rows: readonly string[], viewportWidth: number): string => { + const padding = Math.max(Math.floor((viewportWidth - FRAME_COLUMNS) / 2), 0) + return rows.map((row) => `${" ".repeat(padding)}${row}`).join("\n") +} + +const glowRow = (row: string, intensity: number, tick: number): string => { + const cells = Array.from(padRow(row, FRAME_COLUMNS)) + return cells + .map((cell, column) => { + if (cell === " ") return cell + const wave = Math.sin((column + tick) * 0.85) * 0.5 + 0.5 + if (wave < intensity) return cell + const glyph = GLOW_GLYPHS[(column + tick) % GLOW_GLYPHS.length] ?? "█" + return glyph + }) + .join("") +} + +const morphRow = (fromRow: string, toRow: string, progress: number, rowIndex: number): string => { + const from = Array.from(padRow(fromRow, FRAME_COLUMNS)) + const to = Array.from(padRow(toRow, FRAME_COLUMNS)) + return from + .map((fromCell, column) => { + const toCell = to[column] ?? " " + const threshold = (column / FRAME_COLUMNS) * 0.65 + (rowIndex / FRAME_ROWS) * 0.35 + if (progress >= threshold) return toCell === " " ? fromCell : toCell + return fromCell + }) + .join("") +} + +const applyGlow = (rows: string[], progress: number, tick: number): string[] => + rows.map((row, rowIndex) => glowRow(row, progress * 0.75 + rowIndex * 0.02, tick + rowIndex)) + +const applyMorph = (fromRows: string[], toRows: string[], progress: number): string[] => + fromRows.map((fromRow, rowIndex) => morphRow(fromRow, toRows[rowIndex] ?? "", progress, rowIndex)) + +export const renderEvolutionArtwork = ( + catalog: MonsterFrameCatalog, + fromSprite: string, + toSprite: string, + scene: EvolutionArtworkScene, + viewportWidth: number, + tick = 0, +): string => { + const fromRows = frameLines(catalog, fromSprite, "walk_1") + const toRows = frameLines(catalog, toSprite, "walk_1") + const happyRows = frameLines(catalog, toSprite, "happy") + + let spriteRows: string[] + switch (scene.phase) { + case "glow": + spriteRows = applyGlow(fromRows, scene.progress, tick) + break + case "morph": + spriteRows = applyMorph(fromRows, toRows, scene.progress) + break + case "reveal": { + const revealBlend = scene.progress < 0.35 ? applyMorph(toRows, happyRows, scene.progress / 0.35) : happyRows + spriteRows = revealBlend + break + } + } + + return centerArtwork(spriteRows, viewportWidth) +} + +export const sleep = (ms: number): Promise => + new Promise((resolve) => { + setTimeout(resolve, ms) + }) + +const animatePhase = async ( + catalog: MonsterFrameCatalog, + fromSprite: string, + toSprite: string, + viewportWidth: number, + phase: EvolutionArtworkPhase, + durationMs: number, + onFrame: (artwork: string) => Promise, +): Promise => { + const steps = Math.max(1, Math.ceil(durationMs / EVOLUTION_TICK_MS)) + for (let step = 0; step <= steps; step += 1) { + const progress = step / steps + const artwork = renderEvolutionArtwork( + catalog, + fromSprite, + toSprite, + { phase, progress }, + viewportWidth, + step, + ) + await onFrame(artwork) + if (step < steps) await sleep(EVOLUTION_TICK_MS) + } +} + +export const runEvolutionAnimation = async ( + catalog: MonsterFrameCatalog, + fromSprite: string, + toSprite: string, + viewportWidth: number, + onFrame: (artwork: string) => Promise, +): Promise => { + await sleep(EVOLUTION_PRE_ANIMATION_MS) + await animatePhase(catalog, fromSprite, toSprite, viewportWidth, "glow", EVOLUTION_GLOW_MS, onFrame) + await animatePhase(catalog, fromSprite, toSprite, viewportWidth, "morph", EVOLUTION_MORPH_MS, onFrame) + await animatePhase(catalog, fromSprite, toSprite, viewportWidth, "reveal", EVOLUTION_REVEAL_MS, onFrame) +} diff --git a/packages/cursor-vpet/src/webview/evolution-battle-artwork.ts b/packages/cursor-vpet/src/webview/evolution-battle-artwork.ts index ad19e1c..7bc7bd0 100644 --- a/packages/cursor-vpet/src/webview/evolution-battle-artwork.ts +++ b/packages/cursor-vpet/src/webview/evolution-battle-artwork.ts @@ -8,12 +8,25 @@ const BATTLE_GAP_COLUMNS = 12 export const EVOLUTION_BATTLE_HITS_TO_WIN = 3 export const EVOLUTION_BATTLE_MAX_SHOTS = 24 +export const EVOLUTION_BATTLE_INTRO_MS = 1600 export const EVOLUTION_BATTLE_TRAVEL_MS = 900 export const EVOLUTION_BATTLE_PAUSE_MS = 550 export const EVOLUTION_BATTLE_IMPACT_MS = 650 export const EVOLUTION_BATTLE_OUTCOME_MS = 1400 export const EVOLUTION_BATTLE_TICK_MS = 70 +/** FIGlet-style BATTLE banner. */ +export const BATTLE_FIGLET_LINES = Object.freeze([ + "██████╗ █████╗ ████████╗████████╗██╗ ███████╗", + "██╔══██╗██╔══██╗╚══██╔══╝╚══██╔══╝██║ ██╔════╝", + "██████╔╝███████║ ██║ ██║ ██║ █████╗ ", + "██╔══██╗██╔══██║ ██║ ██║ ██║ ██╔══╝ ", + "██████╔╝██║ ██║ ██║ ██║ ███████╗███████╗", + "╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝╚══════╝", +]) + +export const buildBattleIntroTextLines = (): readonly string[] => BATTLE_FIGLET_LINES + /** Block-style flame sprite matching Digimon ASCII art. */ export const FIREBALL_LINES = Object.freeze([" ▄▀▄ ", "▄█▀▀█", " ▀▀▀ "]) @@ -230,6 +243,24 @@ export const defaultBattleScene = ( ...overrides, }) +const buildBattleIntroLines = (tick: number): string[] => { + const textLines = buildBattleIntroTextLines() + const visible = tick % 2 === 0 + return visible ? [...textLines] : textLines.map((line) => " ".repeat(line.length)) +} + +const padIntroRows = (rows: string[], viewportWidth: number): string[] => { + const width = rows[0]?.length ?? 0 + const horizontalPadding = Math.max(0, Math.floor((viewportWidth - width) / 2)) + const pad = " ".repeat(horizontalPadding) + return rows.map((row) => `${pad}${row}`) +} + +export const renderBattleIntroArtwork = (viewportWidth: number, _progress: number, tick = 0): string => { + const lines = buildBattleIntroLines(tick) + return padIntroRows(lines, viewportWidth).join("\n") +} + export const renderEvolutionBattleArtwork = ( catalog: MonsterFrameCatalog, playerSprite: string, @@ -278,6 +309,18 @@ const postScene = async ( await onFrame(renderEvolutionBattleArtwork(catalog, playerSprite, opponentSprite, scene, viewportWidth)) } +const animateBattleIntro = async ( + viewportWidth: number, + onFrame: (artwork: string) => Promise, +): Promise => { + const steps = Math.max(1, Math.ceil(EVOLUTION_BATTLE_INTRO_MS / EVOLUTION_BATTLE_TICK_MS)) + for (let step = 0; step <= steps; step += 1) { + const progress = step / steps + await onFrame(renderBattleIntroArtwork(viewportWidth, progress, step)) + if (step < steps) await sleep(EVOLUTION_BATTLE_TICK_MS) + } +} + const animateShot = async ( catalog: MonsterFrameCatalog, playerSprite: string, @@ -418,6 +461,8 @@ export const runEvolutionBattleAnimation = async ( onFrame: (artwork: string) => Promise, random: () => number = Math.random, ): Promise => { + await animateBattleIntro(viewportWidth, onFrame) + const shots = planEvolutionBattle(outcome, random) let playerHits = 0 let opponentHits = 0 diff --git a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts index 44b5b2b..d3256dc 100644 --- a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts +++ b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts @@ -2,7 +2,7 @@ import * as vscode from "vscode" import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" -import { pickRandomSameStageOpponent } from "@sbugallo/vpet-core/domain/evolution-battle.ts" +import { pickEvolutionTarget, pickRandomSameStageOpponent } from "@sbugallo/vpet-core/domain/evolution-battle.ts" import { DEBUG_FORCE_EVOLUTION_BATTLE } from "../config/debug.ts" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/get-sidebar-card-inputs.ts" @@ -14,6 +14,8 @@ import { } from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" import { renderPositionedArtwork } from "./animated-artwork.ts" +import { runDefeatAnimation } from "./defeat-artwork.ts" +import { runEvolutionAnimation } from "./evolution-artwork.ts" import { runEvolutionBattleAnimation, sleep, @@ -121,8 +123,14 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { const opponent = DIGIMON_CATALOG.byId.get(opponentId) if (opponent === undefined) return + const evolutionTargetId = + player.nextEvolutions.length > 0 ? pickEvolutionTarget(player, Math.random) : null + this.debugBattlePlayedThisVisit = true - await this.runBattleAnimation(player.sprite, opponent.sprite, { + await this.runBattleAnimation({ + fromSprite: player.sprite, + opponentSprite: opponent.sprite, + evolutionTargetId, preview: true, opponentName: opponent.nameEn, }) @@ -166,15 +174,46 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { const opponent = DIGIMON_CATALOG.byId.get(snapshot.battleOpponentNodeId) if (player === undefined || opponent === undefined) return false - await this.runBattleAnimation(player.sprite, opponent.sprite, { preview: false }) + await this.runBattleAnimation({ + fromSprite: player.sprite, + opponentSprite: opponent.sprite, + evolutionTargetId: snapshot.pendingEvolutionTargetId, + preview: false, + }) return true } - private async runBattleAnimation( - playerSprite: string, - opponentSprite: string, - options: { readonly preview: boolean; readonly opponentName?: string }, - ): Promise { + private async postArtwork(artwork: string): Promise { + this.cachedArtwork = artwork + await this.view?.webview.postMessage({ type: "animation-frame", artwork }) + } + + private async runDefeatReveal(sprite: string): Promise { + await runDefeatAnimation(MONSTER_FRAME_CATALOG, sprite, this.artworkWidth, async (artwork) => + this.postArtwork(artwork), + ) + } + + private async runEvolutionReveal(fromSprite: string, evolutionTargetId: string): Promise { + const target = DIGIMON_CATALOG.byId.get(evolutionTargetId) + if (target === undefined) return + + await runEvolutionAnimation( + MONSTER_FRAME_CATALOG, + fromSprite, + target.sprite, + this.artworkWidth, + async (artwork) => this.postArtwork(artwork), + ) + } + + private async runBattleAnimation(context: { + readonly fromSprite: string + readonly opponentSprite: string + readonly evolutionTargetId: string | null + readonly preview: boolean + readonly opponentName?: string + }): Promise { if (this.battleInProgress) return this.battleInProgress = true @@ -184,28 +223,32 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { const outcome: EvolutionBattleOutcome = Math.random() < 0.5 ? "player" : "opponent" const battleOutcome = await runEvolutionBattleAnimation( MONSTER_FRAME_CATALOG, - playerSprite, - opponentSprite, + context.fromSprite, + context.opponentSprite, this.artworkWidth, outcome, - async (artwork) => { - this.cachedArtwork = artwork - await this.view?.webview.postMessage({ type: "animation-frame", artwork }) - }, + async (artwork) => this.postArtwork(artwork), ) - if (options.preview) { + const playerWon = battleOutcome === "player" + if (playerWon && context.evolutionTargetId !== null) { + await this.runEvolutionReveal(context.fromSprite, context.evolutionTargetId) + } else if (!playerWon) { + await this.runDefeatReveal(context.fromSprite) + } + + if (context.preview) { void vscode.window.showInformationMessage( - battleOutcome === "player" - ? `Debug victory vs ${options.opponentName ?? "opponent"} (no save).` - : `Debug defeat vs ${options.opponentName ?? "opponent"} (no save).`, + playerWon + ? `Debug victory vs ${context.opponentName ?? "opponent"} (no save).` + : `Debug defeat vs ${context.opponentName ?? "opponent"} (no save).`, ) return } const result = resolveEvolutionBattleForPartner( this.battleRepository, - battleOutcome === "player", + playerWon, DIGIMON_CATALOG.byId, new Date().toISOString(), ) diff --git a/packages/cursor-vpet/tests/defeat-artwork.test.ts b/packages/cursor-vpet/tests/defeat-artwork.test.ts new file mode 100644 index 0000000..478afe6 --- /dev/null +++ b/packages/cursor-vpet/tests/defeat-artwork.test.ts @@ -0,0 +1,26 @@ +import { describe, expect, test } from "bun:test" + +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { renderDefeatArtwork } from "../src/webview/defeat-artwork.ts" + +describe("defeat artwork", () => { + test("Given normal and sad poses When rendering Then artwork alternates between them", () => { + const normal = renderDefeatArtwork(MONSTER_FRAME_CATALOG, "agumon", { sad: false, sadAlt: false }, 48) + const sad = renderDefeatArtwork(MONSTER_FRAME_CATALOG, "agumon", { sad: true, sadAlt: false }, 48) + + expect(normal).not.toEqual(sad) + }) + + test("Given defeat artwork When rendering Then the sprite is centered in the viewport", () => { + const artwork = renderDefeatArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + { sad: false, sadAlt: false }, + 48, + ) + const lines = artwork.split("\n").filter((line) => line.trim().length > 0) + + expect(lines.length).toBeGreaterThan(0) + expect(lines[0]?.startsWith(" ")).toBe(true) + }) +}) diff --git a/packages/cursor-vpet/tests/evolution-artwork.test.ts b/packages/cursor-vpet/tests/evolution-artwork.test.ts new file mode 100644 index 0000000..29d5743 --- /dev/null +++ b/packages/cursor-vpet/tests/evolution-artwork.test.ts @@ -0,0 +1,58 @@ +import { describe, expect, test } from "bun:test" + +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { renderEvolutionArtwork } from "../src/webview/evolution-artwork.ts" + +describe("evolution artwork", () => { + test("Given glow phase When rendering Then the sprite is still the current partner", () => { + const from = renderEvolutionArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "greymon", + { phase: "glow", progress: 0.2 }, + 48, + ) + const unchanged = renderEvolutionArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "greymon", + { phase: "glow", progress: 0 }, + 48, + ) + + expect(from.length).toBeGreaterThan(0) + expect(from).not.toEqual(unchanged) + }) + + test("Given morph phase When progress advances Then artwork moves toward the evolved sprite", () => { + const early = renderEvolutionArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "greymon", + { phase: "morph", progress: 0.1 }, + 48, + ) + const late = renderEvolutionArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "greymon", + { phase: "morph", progress: 0.9 }, + 48, + ) + + expect(early).not.toEqual(late) + }) + + test("Given reveal phase When rendering Then only the evolved sprite is shown", () => { + const artwork = renderEvolutionArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "greymon", + { phase: "reveal", progress: 0.8 }, + 48, + ) + + expect(artwork.length).toBeGreaterThan(0) + expect(artwork).not.toContain("Child") + }) +}) diff --git a/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts b/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts index 60eaff5..d5a500b 100644 --- a/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts +++ b/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts @@ -2,12 +2,14 @@ import { describe, expect, test } from "bun:test" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { + buildBattleIntroTextLines, buildBattleScorePips, buildBattleScoreRow, defaultBattleScene, EVOLUTION_BATTLE_HITS_TO_WIN, FIREBALL_LINES, planEvolutionBattle, + renderBattleIntroArtwork, renderEvolutionBattleArtwork, } from "../src/webview/evolution-battle-artwork.ts" @@ -17,6 +19,18 @@ const countHits = (shots: readonly { readonly shooter: "player" | "opponent"; re }) describe("evolution battle artwork", () => { + test("Given battle intro When ticking Then FIGlet BATTLE banner blinks", () => { + const textLines = buildBattleIntroTextLines() + const on = renderBattleIntroArtwork(80, 1, 0) + const off = renderBattleIntroArtwork(80, 1, 1) + + expect(textLines).toHaveLength(6) + expect(textLines[0]).toContain("██████╗") + expect(on).toContain("███████╗") + expect(off).not.toContain("█") + expect(on).not.toEqual(off) + }) + test("Given a fireball shot When rendering Then the flame uses block-style sprite art", () => { const artwork = renderEvolutionBattleArtwork( MONSTER_FRAME_CATALOG, From 0bd00667702b1260dcebbba806e03849686c3889 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 16:36:33 +0900 Subject: [PATCH 10/41] chore(cursor-vpet): remove debug evolution battle preview MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Elimina el flag temporal, el comando de prueba y la lógica de preview automático para dejar solo el flujo real de batalla. Co-authored-by: Cursor --- packages/cursor-vpet/package.json | 4 -- packages/cursor-vpet/src/config/debug.ts | 2 - packages/cursor-vpet/src/extension.ts | 5 -- .../src/webview/vpet-sidebar-provider.ts | 65 +------------------ 4 files changed, 3 insertions(+), 73 deletions(-) delete mode 100644 packages/cursor-vpet/src/config/debug.ts diff --git a/packages/cursor-vpet/package.json b/packages/cursor-vpet/package.json index 782688a..a12ed1f 100644 --- a/packages/cursor-vpet/package.json +++ b/packages/cursor-vpet/package.json @@ -83,10 +83,6 @@ { "command": "cursorVpet.uninstallHooks", "title": "Cursor VPet: Uninstall Hooks" - }, - { - "command": "cursorVpet.testBattle", - "title": "Cursor VPet: Test Evolution Battle (debug)" } ], "configuration": { diff --git a/packages/cursor-vpet/src/config/debug.ts b/packages/cursor-vpet/src/config/debug.ts deleted file mode 100644 index 23da3c6..0000000 --- a/packages/cursor-vpet/src/config/debug.ts +++ /dev/null @@ -1,2 +0,0 @@ -/** TEMP: set to false before shipping. Forces evolution battle preview in the sidebar. */ -export const DEBUG_FORCE_EVOLUTION_BATTLE = true diff --git a/packages/cursor-vpet/src/extension.ts b/packages/cursor-vpet/src/extension.ts index 9fa098a..589a5be 100644 --- a/packages/cursor-vpet/src/extension.ts +++ b/packages/cursor-vpet/src/extension.ts @@ -107,11 +107,6 @@ export async function activate(context: vscode.ExtensionContext): Promise uninstallVpetHooks() void context.globalState.update("vpet.hooksInstalled", false) }), - vscode.commands.registerCommand("cursorVpet.testBattle", async () => { - sidebarProvider?.resetDebugBattlePreview() - await sidebarProvider?.refresh() - await sidebarProvider?.previewEvolutionBattle() - }), ) const poll = setInterval(refreshSidebar, 30_000) diff --git a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts index d3256dc..6631716 100644 --- a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts +++ b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts @@ -2,8 +2,6 @@ import * as vscode from "vscode" import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" -import { pickEvolutionTarget, pickRandomSameStageOpponent } from "@sbugallo/vpet-core/domain/evolution-battle.ts" -import { DEBUG_FORCE_EVOLUTION_BATTLE } from "../config/debug.ts" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/get-sidebar-card-inputs.ts" import type { SidebarSnapshot } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" @@ -16,11 +14,7 @@ import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-v import { renderPositionedArtwork } from "./animated-artwork.ts" import { runDefeatAnimation } from "./defeat-artwork.ts" import { runEvolutionAnimation } from "./evolution-artwork.ts" -import { - runEvolutionBattleAnimation, - sleep, - type EvolutionBattleOutcome, -} from "./evolution-battle-artwork.ts" +import { runEvolutionBattleAnimation, type EvolutionBattleOutcome } from "./evolution-battle-artwork.ts" import { MonsterAnimationController, type MonsterAnimationOutput } from "./monster-animation.ts" import { buildSidebarWebviewHtml, @@ -41,7 +35,6 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { private artworkWidth = DEFAULT_ARTWORK_WIDTH private visualInterval?: ReturnType private battleInProgress = false - private debugBattlePlayedThisVisit = false private readonly animation = new MonsterAnimationController(MONSTER_FRAME_CATALOG, Math.random, () => performance.now(), ) @@ -78,9 +71,8 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { webviewView.onDidChangeVisibility(() => { if (webviewView.visible) { this.startVisualInterval() - void this.onSidebarShown() + void this.refresh() } else { - this.debugBattlePlayedThisVisit = false this.stopVisualInterval() } }) @@ -94,49 +86,10 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { if (webviewView.visible) { this.startVisualInterval() - void this.onSidebarShown() + void this.refresh() } } - private async onSidebarShown(): Promise { - await this.refresh() - if (!DEBUG_FORCE_EVOLUTION_BATTLE || this.debugBattlePlayedThisVisit) return - await sleep(200) - await this.previewEvolutionBattle() - } - - resetDebugBattlePreview(): void { - this.debugBattlePlayedThisVisit = false - } - - async previewEvolutionBattle(): Promise { - if (!DEBUG_FORCE_EVOLUTION_BATTLE || this.battleInProgress) return - - const snapshot = this.snapshotReader.getSidebarSnapshot() - if (snapshot === null) return - if (snapshot.pendingEvolutionTargetId !== null && snapshot.battleOpponentNodeId !== null) return - - const player = DIGIMON_CATALOG.byId.get(snapshot.currentNodeId) - if (player === undefined) return - - const opponentId = pickRandomSameStageOpponent(player, DIGIMON_CATALOG.nodes, Math.random) - const opponent = DIGIMON_CATALOG.byId.get(opponentId) - if (opponent === undefined) return - - const evolutionTargetId = - player.nextEvolutions.length > 0 ? pickEvolutionTarget(player, Math.random) : null - - this.debugBattlePlayedThisVisit = true - await this.runBattleAnimation({ - fromSprite: player.sprite, - opponentSprite: opponent.sprite, - evolutionTargetId, - preview: true, - opponentName: opponent.nameEn, - }) - await this.refresh() - } - async refresh(): Promise { if (this.view === undefined) return @@ -178,7 +131,6 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { fromSprite: player.sprite, opponentSprite: opponent.sprite, evolutionTargetId: snapshot.pendingEvolutionTargetId, - preview: false, }) return true } @@ -211,8 +163,6 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { readonly fromSprite: string readonly opponentSprite: string readonly evolutionTargetId: string | null - readonly preview: boolean - readonly opponentName?: string }): Promise { if (this.battleInProgress) return @@ -237,15 +187,6 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { await this.runDefeatReveal(context.fromSprite) } - if (context.preview) { - void vscode.window.showInformationMessage( - playerWon - ? `Debug victory vs ${context.opponentName ?? "opponent"} (no save).` - : `Debug defeat vs ${context.opponentName ?? "opponent"} (no save).`, - ) - return - } - const result = resolveEvolutionBattleForPartner( this.battleRepository, playerWon, From 78cfc3ca86501516278cd0e930a2ddc2c0495301 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 16:55:25 +0900 Subject: [PATCH 11/41] feat(cursor-vpet): sync pet database changes across extension windows Reload sql.js state when pet.db changes on disk and watch the file so the sidebar stays fresh when multiple Cursor windows share the same ledger. Co-authored-by: Cursor --- .../sqlite/database-change-watcher.ts | 64 +++++++ .../sqlite/sqlite-vpet-write-store.ts | 23 ++- .../src/adapters/sqlite/sqljs-driver.ts | 164 ++++++++++++++---- packages/cursor-vpet/src/extension.ts | 10 ++ .../tests/database-change-watcher.test.ts | 119 +++++++++++++ .../sqljs-vpet-repository.persistence.test.ts | 33 ++++ 6 files changed, 375 insertions(+), 38 deletions(-) create mode 100644 packages/cursor-vpet/src/adapters/sqlite/database-change-watcher.ts create mode 100644 packages/cursor-vpet/tests/database-change-watcher.test.ts diff --git a/packages/cursor-vpet/src/adapters/sqlite/database-change-watcher.ts b/packages/cursor-vpet/src/adapters/sqlite/database-change-watcher.ts new file mode 100644 index 0000000..4a8508b --- /dev/null +++ b/packages/cursor-vpet/src/adapters/sqlite/database-change-watcher.ts @@ -0,0 +1,64 @@ +import { watch, type FSWatcher } from "node:fs" +import { mkdirSync } from "node:fs" +import { basename, dirname } from "node:path" + +import { resolveHostDatabasePath, type HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" + +export type DatabaseChangeWatcherOptions = HostPathOptions & { + readonly databasePath?: string + readonly onChange: () => void + readonly debounceMs?: number +} + +export type DatabaseChangeWatcher = { + dispose(): void +} + +const isPetDatabaseFilename = (filename: string | null | undefined, databaseFileName: string): boolean => { + if (filename === undefined || filename === null) return true + return filename === databaseFileName +} + +export const createDatabaseChangeWatcher = (options: DatabaseChangeWatcherOptions): DatabaseChangeWatcher => { + const databasePath = options.databasePath ?? resolveHostDatabasePath(options) + const databaseDirectory = dirname(databasePath) + const databaseFileName = basename(databasePath) + const debounceMs = options.debounceMs ?? 200 + + let disposed = false + let debounceTimer: ReturnType | undefined + let watcher: FSWatcher | undefined + + const scheduleChange = (): void => { + if (disposed) return + if (debounceTimer !== undefined) clearTimeout(debounceTimer) + debounceTimer = setTimeout(() => { + debounceTimer = undefined + if (!disposed) options.onChange() + }, debounceMs) + } + + const handleWatchEvent = (filename: string | null | undefined): void => { + if (disposed) return + if (!isPetDatabaseFilename(filename, databaseFileName)) return + scheduleChange() + } + + mkdirSync(databaseDirectory, { recursive: true }) + watcher = watch(databaseDirectory, (eventType, filename) => { + if (eventType !== "change" && eventType !== "rename") return + handleWatchEvent(filename) + }) + + return { + dispose() { + disposed = true + if (debounceTimer !== undefined) { + clearTimeout(debounceTimer) + debounceTimer = undefined + } + watcher?.close() + watcher = undefined + }, + } +} diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts index 8ae4a76..e96b169 100644 --- a/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts +++ b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts @@ -12,17 +12,26 @@ export type { SqliteVpetWriteStore, } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-types.ts" +export type CursorSqliteVpetRepository = SqliteVpetWriteStore & { + reloadFromDisk(): void +} + export const createSqliteVpetRepository = async ( options: CreateSqliteVpetRepositoryOptions = {}, -): Promise => { +): Promise => { const databasePath = options.databasePath ?? resolveHostDatabasePath(options) const database = await openWritableSqlJsDatabase(databasePath) - return createSqliteVpetWriteStore({ - databasePath, - executor: database.executor, - close: () => { - database.close() + return { + ...createSqliteVpetWriteStore({ + databasePath, + executor: database.executor, + close: () => { + database.close() + }, + }), + reloadFromDisk: () => { + database.reloadFromDisk() }, - }) + } } diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqljs-driver.ts b/packages/cursor-vpet/src/adapters/sqlite/sqljs-driver.ts index d3a1d1e..ba7c5f2 100644 --- a/packages/cursor-vpet/src/adapters/sqlite/sqljs-driver.ts +++ b/packages/cursor-vpet/src/adapters/sqlite/sqljs-driver.ts @@ -1,12 +1,13 @@ -import { mkdirSync, readFileSync, writeFileSync } from "node:fs" +import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs" import { dirname } from "node:path" -import type { Database } from "sql.js" +import type { Database, SqlJsStatic } from "sql.js" import type { QueryValue, SqliteExecutor } from "@sbugallo/vpet-core/ports/sqlite-executor.ts" import { getSqlRuntime } from "./sqljs-config.ts" export type SqlJsDatabase = { readonly executor: SqliteExecutor + reloadFromDisk(): void close(): void } @@ -15,18 +16,115 @@ const persistDatabase = (database: Database, databasePath: string): void => { writeFileSync(databasePath, Buffer.from(database.export())) } -const createExecutor = (database: Database, persist: () => void): SqliteExecutor => { - let transactionDepth = 0 +const readDatabaseMtimeMs = (databasePath: string): number => { + if (!existsSync(databasePath)) return 0 + return statSync(databasePath).mtimeMs +} + +const loadDatabaseFromDisk = (SQL: SqlJsStatic, databasePath: string): Database => { + try { + const buffer = readFileSync(databasePath) + return new SQL.Database(buffer) + } catch { + return new SQL.Database() + } +} + +const configureWriter = (database: Database): void => { + database.run("PRAGMA foreign_keys = ON") +} + +type WritableDatabaseState = { + database: Database + lastLocalPersistMs: number + transactionDepth: number +} + +const createWritableExecutor = ( + SQL: SqlJsStatic, + databasePath: string, + state: WritableDatabaseState, +): SqliteExecutor => { + const replaceDatabase = (nextDatabase: Database): void => { + state.database.close() + state.database = nextDatabase + configureWriter(state.database) + } + + const persist = (): void => { + persistDatabase(state.database, databasePath) + state.lastLocalPersistMs = readDatabaseMtimeMs(databasePath) + } + + const reloadIfStale = (): void => { + if (state.transactionDepth > 0) return + const diskMtimeMs = readDatabaseMtimeMs(databasePath) + if (diskMtimeMs <= state.lastLocalPersistMs) return + replaceDatabase(loadDatabaseFromDisk(SQL, databasePath)) + state.lastLocalPersistMs = diskMtimeMs + } const persistIfIdle = (): void => { - if (transactionDepth === 0) persist() + if (state.transactionDepth === 0) persist() } return { run(sql, params = []) { - database.run(sql, Array.from(params)) + reloadIfStale() + state.database.run(sql, Array.from(params)) persistIfIdle() }, + get>(sql: string, params: readonly QueryValue[] = []) { + reloadIfStale() + const statement = state.database.prepare(sql) + statement.bind(Array.from(params)) + if (!statement.step()) { + statement.free() + return null + } + const row = statement.getAsObject() as TRow + statement.free() + return row + }, + all>(sql: string, params: readonly QueryValue[] = []) { + reloadIfStale() + const statement = state.database.prepare(sql) + statement.bind(Array.from(params)) + const rows: TRow[] = [] + while (statement.step()) { + rows.push(statement.getAsObject() as TRow) + } + statement.free() + return rows + }, + transaction(operation) { + reloadIfStale() + state.database.run("BEGIN IMMEDIATE") + state.transactionDepth += 1 + try { + const result = operation() + state.database.run("COMMIT") + state.transactionDepth -= 1 + persist() + return result + } catch (error) { + try { + state.database.run("ROLLBACK") + } catch { + // Ignore rollback failures when the transaction is already closed. + } + state.transactionDepth -= 1 + throw error + } + }, + } +} + +const createReadonlyExecutor = (database: Database): SqliteExecutor => { + return { + run(sql, params = []) { + database.run(sql, Array.from(params)) + }, get>(sql: string, params: readonly QueryValue[] = []) { const statement = database.prepare(sql) statement.bind(Array.from(params)) @@ -50,12 +148,9 @@ const createExecutor = (database: Database, persist: () => void): SqliteExecutor }, transaction(operation) { database.run("BEGIN IMMEDIATE") - transactionDepth += 1 try { const result = operation() database.run("COMMIT") - transactionDepth -= 1 - persist() return result } catch (error) { try { @@ -63,46 +158,53 @@ const createExecutor = (database: Database, persist: () => void): SqliteExecutor } catch { // Ignore rollback failures when the transaction is already closed. } - transactionDepth -= 1 throw error } }, } } -const configureWriter = (database: Database): void => { - database.run("PRAGMA foreign_keys = ON") -} +const createWritableDatabase = (SQL: SqlJsStatic, databasePath: string): SqlJsDatabase => { + const state: WritableDatabaseState = { + database: loadDatabaseFromDisk(SQL, databasePath), + lastLocalPersistMs: readDatabaseMtimeMs(databasePath), + transactionDepth: 0, + } + configureWriter(state.database) + + const reloadFromDisk = (): void => { + if (state.transactionDepth > 0) return + state.database.close() + state.database = loadDatabaseFromDisk(SQL, databasePath) + configureWriter(state.database) + state.lastLocalPersistMs = readDatabaseMtimeMs(databasePath) + } -export const openReadonlySqlJsDatabase = async (databasePath: string): Promise => { - const SQL = await getSqlRuntime() - const buffer = readFileSync(databasePath) - const database = new SQL.Database(buffer) - configureWriter(database) return { - executor: createExecutor(database, () => {}), + executor: createWritableExecutor(SQL, databasePath, state), + reloadFromDisk, close() { - database.close() + persistDatabase(state.database, databasePath) + state.lastLocalPersistMs = readDatabaseMtimeMs(databasePath) + state.database.close() }, } } -export const openWritableSqlJsDatabase = async (databasePath: string): Promise => { +export const openReadonlySqlJsDatabase = async (databasePath: string): Promise => { const SQL = await getSqlRuntime() - let database: Database - try { - const buffer = readFileSync(databasePath) - database = new SQL.Database(buffer) - } catch { - database = new SQL.Database() - } + const database = loadDatabaseFromDisk(SQL, databasePath) configureWriter(database) - const persist = () => persistDatabase(database, databasePath) return { - executor: createExecutor(database, persist), + executor: createReadonlyExecutor(database), + reloadFromDisk() {}, close() { - persist() database.close() }, } } + +export const openWritableSqlJsDatabase = async (databasePath: string): Promise => { + const SQL = await getSqlRuntime() + return createWritableDatabase(SQL, databasePath) +} diff --git a/packages/cursor-vpet/src/extension.ts b/packages/cursor-vpet/src/extension.ts index 589a5be..e75ad4e 100644 --- a/packages/cursor-vpet/src/extension.ts +++ b/packages/cursor-vpet/src/extension.ts @@ -10,6 +10,7 @@ import { createCursorUsageEventSource } from "./adapters/cursor/cursor-usage-eve import { installVpetHooks, uninstallVpetHooks } from "./adapters/cursor/install-hooks.ts" import { resolveStateVscdbPath } from "./adapters/cursor/paths.ts" import { configureSqlJsWasmPath } from "./adapters/sqlite/sqljs-config.ts" +import { createDatabaseChangeWatcher } from "./adapters/sqlite/database-change-watcher.ts" import { createSqliteSidebarSnapshotReader } from "./adapters/sqlite/sqlite-sidebar-snapshot-reader.ts" import { createSqliteVpetRepository } from "./adapters/sqlite/sqlite-vpet-write-store.ts" import { getVpetExtensionSettings, toDatabaseOptions } from "./config/extension-settings.ts" @@ -69,6 +70,15 @@ export async function activate(context: vscode.ExtensionContext): Promise }) context.subscriptions.push(usageSource) + const databaseWatcher = createDatabaseChangeWatcher({ + ...databaseOptions(), + onChange: () => { + repository.reloadFromDisk() + refreshSidebar() + }, + }) + context.subscriptions.push({ dispose: () => databaseWatcher.dispose() }) + context.subscriptions.push( vscode.workspace.onDidChangeConfiguration((event) => { if (!event.affectsConfiguration("vpet")) return diff --git a/packages/cursor-vpet/tests/database-change-watcher.test.ts b/packages/cursor-vpet/tests/database-change-watcher.test.ts new file mode 100644 index 0000000..f72f500 --- /dev/null +++ b/packages/cursor-vpet/tests/database-change-watcher.test.ts @@ -0,0 +1,119 @@ +import { afterEach, describe, expect, test } from "bun:test" +import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises" +import { dirname, join } from "node:path" + +import { createDatabaseChangeWatcher } from "../src/adapters/sqlite/database-change-watcher.ts" + +const wait = async (milliseconds: number): Promise => { + await new Promise((resolve) => setTimeout(resolve, milliseconds)) +} + +describe("database change watcher", () => { + let tempRoot: string | undefined + let watcher: ReturnType | undefined + + afterEach(async () => { + watcher?.dispose() + watcher = undefined + if (tempRoot !== undefined) { + await rm(tempRoot, { recursive: true, force: true }) + tempRoot = undefined + } + }) + + test("Given a pet.db write When watching the data directory Then onChange fires once after debounce", async () => { + tempRoot = await mkdtemp(join(process.cwd(), ".tmp-cursor-vpet-watch-")) + const appDataRoot = join(tempRoot, "app-data") + const databasePath = join(appDataRoot, "opencode-vpet", "pet.db") + await mkdir(dirname(databasePath), { recursive: true }) + + let changeCount = 0 + watcher = createDatabaseChangeWatcher({ + appDataRoot, + databasePath, + debounceMs: 80, + onChange: () => { + changeCount += 1 + }, + }) + + await writeFile(databasePath, "first") + await wait(200) + expect(changeCount).toBe(1) + + await writeFile(databasePath, "second") + await wait(200) + expect(changeCount).toBe(2) + }) + + test("Given rapid pet.db writes When watching Then onChange coalesces into one debounced callback", async () => { + tempRoot = await mkdtemp(join(process.cwd(), ".tmp-cursor-vpet-watch-")) + const appDataRoot = join(tempRoot, "app-data") + const databasePath = join(appDataRoot, "opencode-vpet", "pet.db") + await mkdir(dirname(databasePath), { recursive: true }) + + let changeCount = 0 + watcher = createDatabaseChangeWatcher({ + appDataRoot, + databasePath, + debounceMs: 120, + onChange: () => { + changeCount += 1 + }, + }) + + await writeFile(databasePath, "a") + await wait(20) + await writeFile(databasePath, "b") + await wait(20) + await writeFile(databasePath, "c") + await wait(200) + + expect(changeCount).toBe(1) + }) + + test("Given another file in the data directory When it changes Then onChange is not called", async () => { + tempRoot = await mkdtemp(join(process.cwd(), ".tmp-cursor-vpet-watch-")) + const appDataRoot = join(tempRoot, "app-data") + const databasePath = join(appDataRoot, "opencode-vpet", "pet.db") + const otherPath = join(appDataRoot, "opencode-vpet", "notes.txt") + await mkdir(dirname(databasePath), { recursive: true }) + + let changeCount = 0 + watcher = createDatabaseChangeWatcher({ + appDataRoot, + databasePath, + debounceMs: 80, + onChange: () => { + changeCount += 1 + }, + }) + + await writeFile(otherPath, "ignore me") + await wait(200) + expect(changeCount).toBe(0) + }) + + test("Given a disposed watcher When pet.db changes Then onChange is not called", async () => { + tempRoot = await mkdtemp(join(process.cwd(), ".tmp-cursor-vpet-watch-")) + const appDataRoot = join(tempRoot, "app-data") + const databasePath = join(appDataRoot, "opencode-vpet", "pet.db") + await mkdir(dirname(databasePath), { recursive: true }) + + let changeCount = 0 + watcher = createDatabaseChangeWatcher({ + appDataRoot, + databasePath, + debounceMs: 80, + onChange: () => { + changeCount += 1 + }, + }) + watcher.dispose() + watcher = undefined + + await writeFile(databasePath, "after-dispose") + await wait(200) + expect(changeCount).toBe(0) + }) +}) diff --git a/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts b/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts index b63f7b2..0a3cafc 100644 --- a/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts +++ b/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts @@ -64,6 +64,39 @@ describe("sql.js vpet repository persistence", () => { } }) + test("Given a stale in-memory repository When another instance spawns Then usage applies to the new partner", async () => { + if (tempRoot === undefined) throw new Error("Missing temp root.") + + const writer = await createSqliteVpetRepository({ appDataRoot: tempRoot.appDataRoot }) + const staleReader = await createSqliteVpetRepository({ appDataRoot: tempRoot.appDataRoot }) + const snapshotReader = await createSqliteSidebarSnapshotReader({ appDataRoot: tempRoot.appDataRoot }) + try { + spawnPartner(writer, "2026-09-09T12:00:00.000Z") + spawnPartner(writer, "2026-09-09T12:01:00.000Z") + + recordUsage({ + usage: { + receiptKey: "receipt-cross-window", + eventId: "event-cross-window", + tokenDelta: 7, + cost: null, + createdAt: "2026-09-09T12:02:00.000Z", + }, + ledger: staleReader, + digimonById: DIGIMON_CATALOG.byId, + catalogNodes: DIGIMON_CATALOG.nodes, + selector: () => 0, + thresholds: STAGE_GAUGE_THRESHOLDS, + }) + + expect(staleReader.getActivePartner()?.generation).toBe(2) + expect(snapshotReader.getSidebarSnapshot()?.gauge).toBe(7) + } finally { + writer.close() + staleReader.close() + } + }) + test("Given a spawned partner When reading the sidebar snapshot Then it returns the active partner", async () => { if (tempRoot === undefined) throw new Error("Missing temp root.") From e154b6e9ecc7fba401774d2987db75e57a2bcead Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 17:58:06 +0900 Subject: [PATCH 12/41] feat(opencode-vpet): add evolution battle TUI flow and persistence hooks. Wire battle animations, session orchestration, and sidebar updates into the OpenCode TUI so evolution now requires winning a battle before advancing. Co-authored-by: Cursor --- bun.lock | 2 +- .../adapters/sqlite/sqlite-migrations.ts | 7 + .../adapters/sqlite/sqlite-vpet-schema.ts | 38 +- .../adapters/sqlite/sqlite-vpet-types.ts | 10 +- .../sqlite/sqlite-vpet-write-store.ts | 73 ++- .../application/models/sidebar-card-inputs.ts | 1 + .../vpet-core-src/application/models/usage.ts | 11 + .../application/ports/sidebar-snapshot.ts | 2 + .../use-cases/get-sidebar-card-inputs.ts | 2 + .../application/use-cases/reconcile-usage.ts | 4 +- .../application/use-cases/record-usage.ts | 39 +- .../use-cases/resolve-evolution-battle.ts | 54 ++ .../build/vpet-core-src/config/defaults.ts | 16 +- .../vpet-core-src/domain/evolution-battle.ts | 40 ++ .../build/vpet-core-src/domain/evolution.ts | 83 ++- .../build/vpet-core-src/domain/partner.ts | 4 + .../view-models/sidebar-view-model.ts | 2 + .../adapters/opencode/create-server-hooks.ts | 23 +- .../src/adapters/opencode/vpet-toast.ts | 8 + packages/opencode-vpet/src/index.ts | 4 +- packages/opencode-vpet/src/tui.tsx | 109 +++- .../opencode-vpet/src/tui/defeat-artwork.ts | 67 +++ .../src/tui/evolution-artwork.ts | 138 +++++ .../src/tui/evolution-battle-artwork.ts | 510 ++++++++++++++++++ .../src/tui/evolution-battle-session.ts | 73 +++ .../opencode-vpet/src/tui/sidebar-card.tsx | 14 +- .../tests/defeat-artwork.test.ts | 26 + .../tests/evolution-artwork.test.ts | 58 ++ .../tests/evolution-battle-artwork.test.ts | 130 +++++ .../tests/evolution-battle-session.test.ts | 38 ++ ...lite-usage-event-toast.persistence.test.ts | 29 +- .../tests/server-thresholds.test.ts | 8 +- .../opencode-vpet/tests/vpet-toast.test.ts | 10 + .../sqlite/sqlite-vpet-write-store.ts | 9 +- 34 files changed, 1537 insertions(+), 105 deletions(-) create mode 100644 packages/opencode-vpet/build/vpet-core-src/application/use-cases/resolve-evolution-battle.ts create mode 100644 packages/opencode-vpet/build/vpet-core-src/domain/evolution-battle.ts create mode 100644 packages/opencode-vpet/src/tui/defeat-artwork.ts create mode 100644 packages/opencode-vpet/src/tui/evolution-artwork.ts create mode 100644 packages/opencode-vpet/src/tui/evolution-battle-artwork.ts create mode 100644 packages/opencode-vpet/src/tui/evolution-battle-session.ts create mode 100644 packages/opencode-vpet/tests/defeat-artwork.test.ts create mode 100644 packages/opencode-vpet/tests/evolution-artwork.test.ts create mode 100644 packages/opencode-vpet/tests/evolution-battle-artwork.test.ts create mode 100644 packages/opencode-vpet/tests/evolution-battle-session.test.ts diff --git a/bun.lock b/bun.lock index a60422c..db27d28 100644 --- a/bun.lock +++ b/bun.lock @@ -36,6 +36,7 @@ "opencode-vpet": "./dist/cli.js", }, "dependencies": { + "@sbugallo/vpet-core": "workspace:*", "solid-js": "^1.9.14", }, "devDependencies": { @@ -45,7 +46,6 @@ "@opentui/core": "^0.4.5", "@opentui/keymap": "^0.4.5", "@opentui/solid": "^0.4.5", - "@sbugallo/vpet-core": "workspace:*", "@types/bun": "1.3.14", "@types/node": "24.10.1", "@types/semver": "7.7.1", diff --git a/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-migrations.ts b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-migrations.ts index bae02d7..47878cb 100644 --- a/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-migrations.ts +++ b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-migrations.ts @@ -106,6 +106,13 @@ const MIGRATIONS = [ `, ], }, + { + version: 4, + sql: [ + "ALTER TABLE partners ADD COLUMN pending_evolution_target_id TEXT", + "ALTER TABLE partners ADD COLUMN battle_opponent_node_id TEXT", + ], + }, ] as const satisfies readonly Migration[] type MigrationRow = { diff --git a/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-schema.ts b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-schema.ts index 3b79c48..29cbf29 100644 --- a/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-schema.ts +++ b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-schema.ts @@ -7,6 +7,8 @@ export type PersistedPartnerRow = { readonly current_node_id: string readonly gauge: number readonly is_terminal: number + readonly pending_evolution_target_id: string | null + readonly battle_opponent_node_id: string | null readonly created_at: string readonly retired_at: string | null } @@ -40,15 +42,21 @@ export type MigrationRow = { readonly version: number } -export const ACTIVE_PARTNER_SELECT = ` - SELECT +const PARTNER_COLUMNS = ` partner_id, generation, current_node_id, gauge, is_terminal, + pending_evolution_target_id, + battle_opponent_node_id, created_at, retired_at +` + +export const ACTIVE_PARTNER_SELECT = ` + SELECT + ${PARTNER_COLUMNS} FROM partners WHERE retired_at IS NULL LIMIT 1 @@ -56,39 +64,21 @@ export const ACTIVE_PARTNER_SELECT = ` export const PARTNERS_SELECT = ` SELECT - partner_id, - generation, - current_node_id, - gauge, - is_terminal, - created_at, - retired_at + ${PARTNER_COLUMNS} FROM partners ORDER BY generation ASC, created_at ASC, partner_id ASC ` export const ARCHIVE_PARTNERS_SELECT = ` SELECT - partner_id, - generation, - current_node_id, - gauge, - is_terminal, - created_at, - retired_at + ${PARTNER_COLUMNS} FROM partners ORDER BY partner_id ASC ` export const PARTNER_BY_GENERATION_SELECT = ` SELECT - partner_id, - generation, - current_node_id, - gauge, - is_terminal, - created_at, - retired_at + ${PARTNER_COLUMNS} FROM partners WHERE generation = ? LIMIT 1 @@ -138,6 +128,8 @@ export const toPartner = (row: PersistedPartnerRow): Partner => { currentNodeId: row.current_node_id, gauge: row.gauge, isTerminal: row.is_terminal === 1, + pendingEvolutionTargetId: row.pending_evolution_target_id, + battleOpponentNodeId: row.battle_opponent_node_id, createdAt: row.created_at, retiredAt: row.retired_at, } diff --git a/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-types.ts b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-types.ts index 615b170..8ad9155 100644 --- a/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-types.ts +++ b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-types.ts @@ -1,6 +1,10 @@ import type { Partner, PartnerProgression } from "../../domain/partner.ts" import type { SpawnPartnerInput } from "../../application/models/spawn-partner.ts" -import type { ApplyUsageReceiptOutcome, UsageReceiptMetadata } from "../../application/models/usage.ts" +import type { + ApplyUsageReceiptOutcome, + ResolveEvolutionBattleOutcome, + UsageReceiptMetadata, +} from "../../application/models/usage.ts" import type { PartnerLifecycle } from "../../application/ports/partner-lifecycle.ts" import type { UsageLedger } from "../../application/ports/usage-ledger.ts" import type { VpetControl } from "../../application/ports/vpet-control.ts" @@ -47,6 +51,10 @@ export type SqliteVpetWriteStore = PartnerLifecycle & getPartnerByGeneration: (generation: number) => PersistedPartnerSummary | null listPartnerEvents: (partnerId: string) => readonly PersistedPartnerEvent[] listUsageReceipts: () => readonly UsageReceiptRecord[] + resolveEvolutionBattle: ( + nextState: PartnerProgression, + createdAt: string, + ) => ResolveEvolutionBattleOutcome } export type { ApplyUsageReceiptOutcome, PartnerProgression, SpawnPartnerInput, UsageReceiptMetadata } diff --git a/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-write-store.ts b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-write-store.ts index ac8382f..2ba7c10 100644 --- a/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-write-store.ts +++ b/packages/opencode-vpet/build/vpet-core-src/adapters/sqlite/sqlite-vpet-write-store.ts @@ -1,5 +1,5 @@ import type { SpawnPartnerInput } from "../../application/models/spawn-partner.ts" -import type { UsageReceiptMetadata } from "../../application/models/usage.ts" +import type { ResolveEvolutionBattleOutcome, UsageReceiptMetadata } from "../../application/models/usage.ts" import type { Partner, PartnerProgression } from "../../domain/partner.ts" import type { SqliteExecutor } from "../../ports/sqlite-executor.ts" import { runMigrations } from "./sqlite-migrations.ts" @@ -123,7 +123,7 @@ export const createSqliteVpetWriteStore = (options: CreateSqliteVpetWriteStoreOp if (generationRow === null) throw new Error("Generation allocation failed") const partnerId = `partner-${generationRow.generation}` executor.run( - "INSERT INTO partners (partner_id, generation, current_node_id, gauge, is_terminal, created_at, retired_at) VALUES (?, ?, ?, ?, ?, ?, NULL)", + "INSERT INTO partners (partner_id, generation, current_node_id, gauge, is_terminal, pending_evolution_target_id, battle_opponent_node_id, created_at, retired_at) VALUES (?, ?, ?, ?, ?, NULL, NULL, ?, NULL)", [partnerId, generationRow.generation, input.currentNodeId, input.gauge, input.isTerminal, input.createdAt], ) executor.run( @@ -137,7 +137,14 @@ export const createSqliteVpetWriteStore = (options: CreateSqliteVpetWriteStoreOp input.createdAt, ], ) - return { partnerId, generation: generationRow.generation, ...input, retiredAt: null } + return { + partnerId, + generation: generationRow.generation, + ...input, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + retiredAt: null, + } }) }, listPartnerEvents(partnerId: string) { @@ -179,12 +186,17 @@ export const createSqliteVpetWriteStore = (options: CreateSqliteVpetWriteStoreOp if (activePartnerRow === null) return { kind: "no_active_partner" } as const const activePartner = toPartner(activePartnerRow) const nextState = evolve(activePartner) - executor.run("UPDATE partners SET current_node_id = ?, gauge = ?, is_terminal = ? WHERE partner_id = ?", [ - nextState.currentNodeId, - nextState.gauge, - nextState.isTerminal, - activePartner.partnerId, - ]) + executor.run( + "UPDATE partners SET current_node_id = ?, gauge = ?, is_terminal = ?, pending_evolution_target_id = ?, battle_opponent_node_id = ? WHERE partner_id = ?", + [ + nextState.currentNodeId, + nextState.gauge, + nextState.isTerminal, + nextState.pendingEvolutionTargetId, + nextState.battleOpponentNodeId, + activePartner.partnerId, + ], + ) executor.run( "INSERT INTO partner_events (event_id, partner_id, kind, current_node_id, gauge, is_terminal, token_delta, receipt_key, created_at) VALUES (?, ?, 'usage_applied', ?, ?, ?, ?, ?, ?)", [ @@ -218,6 +230,49 @@ export const createSqliteVpetWriteStore = (options: CreateSqliteVpetWriteStoreOp listUsageReceipts() { return executor.all(USAGE_RECEIPTS_SELECT).map(toUsageReceiptRecord) }, + resolveEvolutionBattle(nextState: PartnerProgression, createdAt: string): ResolveEvolutionBattleOutcome { + return executor.transaction(() => { + const activePartnerRow = executor.get(ACTIVE_PARTNER_SELECT) + if (activePartnerRow === null) return { kind: "no_pending_battle" } as const + + const activePartner = toPartner(activePartnerRow) + if (activePartner.pendingEvolutionTargetId === null || activePartner.battleOpponentNodeId === null) { + return { kind: "no_pending_battle" } as const + } + + const fromNodeId = activePartner.currentNodeId + executor.run( + "UPDATE partners SET current_node_id = ?, gauge = ?, is_terminal = ?, pending_evolution_target_id = ?, battle_opponent_node_id = ? WHERE partner_id = ?", + [ + nextState.currentNodeId, + nextState.gauge, + nextState.isTerminal, + nextState.pendingEvolutionTargetId, + nextState.battleOpponentNodeId, + activePartner.partnerId, + ], + ) + executor.run( + "INSERT INTO partner_events (event_id, partner_id, kind, current_node_id, gauge, is_terminal, token_delta, receipt_key, created_at) VALUES (?, ?, 'usage_applied', ?, ?, ?, NULL, NULL, ?)", + [ + `event-battle-${createdAt}`, + activePartner.partnerId, + nextState.currentNodeId, + nextState.gauge, + nextState.isTerminal, + createdAt, + ], + ) + + if (nextState.currentNodeId !== fromNodeId) { + return { + kind: "won", + evolution: { fromNodeId, toNodeId: nextState.currentNodeId }, + } as const + } + return { kind: "lost" } as const + }) + }, } satisfies SqliteVpetWriteStore return store diff --git a/packages/opencode-vpet/build/vpet-core-src/application/models/sidebar-card-inputs.ts b/packages/opencode-vpet/build/vpet-core-src/application/models/sidebar-card-inputs.ts index 57c1c11..cc50a18 100644 --- a/packages/opencode-vpet/build/vpet-core-src/application/models/sidebar-card-inputs.ts +++ b/packages/opencode-vpet/build/vpet-core-src/application/models/sidebar-card-inputs.ts @@ -10,4 +10,5 @@ export type SidebarCardInputs = readonly frozen: boolean readonly isSetOverride: boolean readonly trainerTotalTokens: number + readonly evolutionBattlePending: boolean } diff --git a/packages/opencode-vpet/build/vpet-core-src/application/models/usage.ts b/packages/opencode-vpet/build/vpet-core-src/application/models/usage.ts index e881ce5..4779c6b 100644 --- a/packages/opencode-vpet/build/vpet-core-src/application/models/usage.ts +++ b/packages/opencode-vpet/build/vpet-core-src/application/models/usage.ts @@ -16,11 +16,22 @@ export type UsageEvolutionTransition = { readonly toNodeId: string } +export type EvolutionBattlePending = { + readonly opponentNodeId: string + readonly targetNodeId: string +} + export type UsageProcessingResult = | { readonly kind: "applied" readonly receiptKey: string readonly evolution?: UsageEvolutionTransition + readonly evolutionBattlePending?: EvolutionBattlePending } | { readonly kind: "duplicate"; readonly receiptKey: string } | { readonly kind: "no_active_partner"; readonly receiptKey: string } + +export type ResolveEvolutionBattleOutcome = + | { readonly kind: "won"; readonly evolution: UsageEvolutionTransition } + | { readonly kind: "lost" } + | { readonly kind: "no_pending_battle" } diff --git a/packages/opencode-vpet/build/vpet-core-src/application/ports/sidebar-snapshot.ts b/packages/opencode-vpet/build/vpet-core-src/application/ports/sidebar-snapshot.ts index 0bc7f77..dc7f581 100644 --- a/packages/opencode-vpet/build/vpet-core-src/application/ports/sidebar-snapshot.ts +++ b/packages/opencode-vpet/build/vpet-core-src/application/ports/sidebar-snapshot.ts @@ -5,6 +5,8 @@ export type SidebarSnapshot = { readonly frozen: boolean readonly isSetOverride: boolean readonly trainerTotalTokens: number + readonly pendingEvolutionTargetId: string | null + readonly battleOpponentNodeId: string | null } export type SidebarSnapshotReader = { diff --git a/packages/opencode-vpet/build/vpet-core-src/application/use-cases/get-sidebar-card-inputs.ts b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/get-sidebar-card-inputs.ts index d1771c4..d3ed08f 100644 --- a/packages/opencode-vpet/build/vpet-core-src/application/use-cases/get-sidebar-card-inputs.ts +++ b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/get-sidebar-card-inputs.ts @@ -19,5 +19,7 @@ export const getSidebarCardInputs = (reader: SidebarSnapshotReader, catalog: Dig frozen: snapshot.frozen, isSetOverride: snapshot.isSetOverride, trainerTotalTokens: snapshot.trainerTotalTokens, + evolutionBattlePending: + snapshot.pendingEvolutionTargetId !== null && snapshot.battleOpponentNodeId !== null, } } diff --git a/packages/opencode-vpet/build/vpet-core-src/application/use-cases/reconcile-usage.ts b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/reconcile-usage.ts index bb1a404..5c8196b 100644 --- a/packages/opencode-vpet/build/vpet-core-src/application/use-cases/reconcile-usage.ts +++ b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/reconcile-usage.ts @@ -8,6 +8,7 @@ export type ReconcileUsageInput = { readonly usages: readonly CompletedUsage[] readonly ledger: UsageLedger readonly digimonById: ReadonlyMap + readonly catalogNodes: readonly DigimonNode[] readonly selector: EvolutionSelector readonly thresholds: StageThresholds } @@ -16,12 +17,13 @@ export const reconcileUsage = ({ usages, ledger, digimonById, + catalogNodes, selector, thresholds, }: ReconcileUsageInput): readonly UsageProcessingResult[] => { const outcomes: UsageProcessingResult[] = [] for (const usage of usages) { - outcomes.push(recordUsage({ usage, ledger, digimonById, selector, thresholds })) + outcomes.push(recordUsage({ usage, ledger, digimonById, catalogNodes, selector, thresholds })) } return outcomes } diff --git a/packages/opencode-vpet/build/vpet-core-src/application/use-cases/record-usage.ts b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/record-usage.ts index 718e073..25583d2 100644 --- a/packages/opencode-vpet/build/vpet-core-src/application/use-cases/record-usage.ts +++ b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/record-usage.ts @@ -9,6 +9,7 @@ export type RecordUsageInput = { readonly usage: CompletedUsage readonly ledger: UsageLedger readonly digimonById: ReadonlyMap + readonly catalogNodes: readonly DigimonNode[] readonly selector: EvolutionSelector readonly thresholds: StageThresholds } @@ -17,32 +18,66 @@ export const recordUsage = ({ usage, ledger, digimonById, + catalogNodes, selector, thresholds, }: RecordUsageInput): UsageProcessingResult => { let evolution: UsageEvolutionTransition | undefined + let evolutionBattlePending: { readonly opponentNodeId: string; readonly targetNodeId: string } | undefined + const outcome = ledger.applyUsageReceipt(usage, (partner) => { const current = digimonById.get(partner.currentNodeId) if (current === undefined) throw new Error(`Persisted partner node ${partner.currentNodeId} is missing from the catalog`) + const hadPendingBattle = + partner.pendingEvolutionTargetId != null && partner.battleOpponentNodeId != null + const next = applyTokenProgress( - { current, gauge: partner.gauge, isTerminal: partner.isTerminal }, + { + current, + gauge: partner.gauge, + isTerminal: partner.isTerminal, + pendingEvolutionTargetId: partner.pendingEvolutionTargetId, + battleOpponentNodeId: partner.battleOpponentNodeId, + }, usage.tokenDelta, selector, digimonById, + catalogNodes, thresholds, ) + if ( + !hadPendingBattle && + next.pendingEvolutionTargetId !== null && + next.battleOpponentNodeId !== null && + next.current.id === current.id + ) { + evolutionBattlePending = { + opponentNodeId: next.battleOpponentNodeId, + targetNodeId: next.pendingEvolutionTargetId, + } + } + if (next.current.id !== current.id) { evolution = { fromNodeId: current.id, toNodeId: next.current.id } } - return { currentNodeId: next.current.id, gauge: next.gauge, isTerminal: next.isTerminal } + return { + currentNodeId: next.current.id, + gauge: next.gauge, + isTerminal: next.isTerminal, + pendingEvolutionTargetId: next.pendingEvolutionTargetId, + battleOpponentNodeId: next.battleOpponentNodeId, + } }) switch (outcome.kind) { case "applied": + if (evolutionBattlePending !== undefined) { + return { kind: "applied", receiptKey: usage.receiptKey, evolutionBattlePending } + } return evolution === undefined ? { kind: "applied", receiptKey: usage.receiptKey } : { kind: "applied", receiptKey: usage.receiptKey, evolution } diff --git a/packages/opencode-vpet/build/vpet-core-src/application/use-cases/resolve-evolution-battle.ts b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/resolve-evolution-battle.ts new file mode 100644 index 0000000..a3a163c --- /dev/null +++ b/packages/opencode-vpet/build/vpet-core-src/application/use-cases/resolve-evolution-battle.ts @@ -0,0 +1,54 @@ +import type { DigimonNode } from "../../domain/digimon-node.ts" +import { resolveEvolutionBattle } from "../../domain/evolution.ts" +import type { Partner } from "../../domain/partner.ts" +import type { ResolveEvolutionBattleOutcome } from "../models/usage.ts" + +export type EvolutionBattleRepository = { + getActivePartner: () => Partner | null + resolveEvolutionBattle: ( + nextState: import("../../domain/partner.ts").PartnerProgression, + createdAt: string, + ) => ResolveEvolutionBattleOutcome +} + +export const resolveEvolutionBattleForPartner = ( + repository: EvolutionBattleRepository, + won: boolean, + digimonById: ReadonlyMap, + createdAt: string, +): ResolveEvolutionBattleOutcome => { + const partner = repository.getActivePartner() + if (partner === null) return { kind: "no_pending_battle" } + + const current = digimonById.get(partner.currentNodeId) + if (current === undefined) { + throw new Error(`Persisted partner node ${partner.currentNodeId} is missing from the catalog`) + } + + if (partner.pendingEvolutionTargetId === null || partner.battleOpponentNodeId === null) { + return { kind: "no_pending_battle" } + } + + const next = resolveEvolutionBattle( + { + current, + gauge: partner.gauge, + isTerminal: partner.isTerminal, + pendingEvolutionTargetId: partner.pendingEvolutionTargetId, + battleOpponentNodeId: partner.battleOpponentNodeId, + }, + won, + digimonById, + ) + + return repository.resolveEvolutionBattle( + { + currentNodeId: next.current.id, + gauge: next.gauge, + isTerminal: next.isTerminal, + pendingEvolutionTargetId: next.pendingEvolutionTargetId, + battleOpponentNodeId: next.battleOpponentNodeId, + }, + createdAt, + ) +} diff --git a/packages/opencode-vpet/build/vpet-core-src/config/defaults.ts b/packages/opencode-vpet/build/vpet-core-src/config/defaults.ts index ab6eb1c..ee9c0cc 100644 --- a/packages/opencode-vpet/build/vpet-core-src/config/defaults.ts +++ b/packages/opencode-vpet/build/vpet-core-src/config/defaults.ts @@ -28,14 +28,14 @@ export const VPET_STAGE_LABELS = Object.freeze({ } as const satisfies VpetStageLabels) export const DEFAULT_STAGE_THRESHOLDS = Object.freeze({ - egg: 500_000, - babyI: 1_000_000, - babyII: 2_000_000, - child: 4_000_000, - adult: 7_500_000, - perfect: 12_500_000, - ultimate: 20_000_000, - superUltimate: 30_000_000, + egg: 5_000_000, + babyI: 10_000_000, + babyII: 20_000_000, + child: 40_000_000, + adult: 75_000_000, + perfect: 125_000_000, + ultimate: 200_000_000, + superUltimate: 300_000_000, } as const satisfies StageThresholdSettings) export const DEFAULT_VPET_SETTINGS = Object.freeze({ diff --git a/packages/opencode-vpet/build/vpet-core-src/domain/evolution-battle.ts b/packages/opencode-vpet/build/vpet-core-src/domain/evolution-battle.ts new file mode 100644 index 0000000..af6d791 --- /dev/null +++ b/packages/opencode-vpet/build/vpet-core-src/domain/evolution-battle.ts @@ -0,0 +1,40 @@ +import type { DigimonNode } from "./digimon-node.ts" +import type { EvolutionSelector } from "./evolution.ts" + +export const pickEvolutionTarget = ( + current: DigimonNode, + selector: EvolutionSelector, +): string => { + if (current.nextEvolutions.length === 0) { + throw new Error("Evolution target selection failed: partner has no evolution options") + } + + const selection = selector() + if (!Number.isFinite(selection) || selection < 0 || selection >= 1) { + throw new Error(`Evolution selector must return a finite number in [0, 1), received ${selection}`) + } + + const targetId = current.nextEvolutions[Math.floor(selection * current.nextEvolutions.length)] + if (targetId === undefined) throw new Error("Evolution target selection failed") + return targetId +} + +export const pickRandomSameStageOpponent = ( + current: DigimonNode, + catalogNodes: readonly DigimonNode[], + selector: EvolutionSelector, +): string => { + const candidates = catalogNodes.filter((node) => node.stage === current.stage && node.id !== current.id) + if (candidates.length === 0) { + return current.id + } + + const selection = selector() + if (!Number.isFinite(selection) || selection < 0 || selection >= 1) { + throw new Error(`Evolution selector must return a finite number in [0, 1), received ${selection}`) + } + + const opponent = candidates[Math.floor(selection * candidates.length)] + if (opponent === undefined) throw new Error("Same-stage opponent selection failed") + return opponent.id +} diff --git a/packages/opencode-vpet/build/vpet-core-src/domain/evolution.ts b/packages/opencode-vpet/build/vpet-core-src/domain/evolution.ts index 25f0f5b..0116405 100644 --- a/packages/opencode-vpet/build/vpet-core-src/domain/evolution.ts +++ b/packages/opencode-vpet/build/vpet-core-src/domain/evolution.ts @@ -1,23 +1,26 @@ import type { DigimonNode } from "./digimon-node.ts" +import { pickEvolutionTarget, pickRandomSameStageOpponent } from "./evolution-battle.ts" import { DIGIMON_STAGES, type DigimonStage } from "./stage.ts" export type StageThresholds = Readonly> export const STAGE_GAUGE_THRESHOLDS = Object.freeze({ - 0: 500_000, - 1: 1_000_000, - 2: 2_000_000, - 3: 4_000_000, - 4: 7_500_000, - 5: 12_500_000, - 6: 20_000_000, - 7: 30_000_000, + 0: 5_000_000, + 1: 10_000_000, + 2: 20_000_000, + 3: 40_000_000, + 4: 75_000_000, + 5: 125_000_000, + 6: 200_000_000, + 7: 300_000_000, } as const satisfies StageThresholds) export type PartnerEvolutionState = { readonly current: DigimonNode readonly gauge: number readonly isTerminal: boolean + readonly pendingEvolutionTargetId: string | null + readonly battleOpponentNodeId: string | null } export type EvolutionSelector = () => number @@ -35,31 +38,79 @@ const isStageThresholds = (thresholds: unknown): thresholds is StageThresholds = }) } +const hasPendingBattle = (state: PartnerEvolutionState): boolean => + state.pendingEvolutionTargetId != null && state.battleOpponentNodeId != null + export const applyTokenProgress = ( state: PartnerEvolutionState, tokenDelta: number, selector: EvolutionSelector, digimonById: ReadonlyMap, + catalogNodes: readonly DigimonNode[], thresholds: unknown, ): PartnerEvolutionState => { if (!isStageThresholds(thresholds)) { throw new Error("Evolution thresholds must be a complete frozen policy of positive finite numbers") } if (state.isTerminal) return state + if (hasPendingBattle(state)) return state + const threshold = thresholds[state.current.stage] const gauge = state.gauge + tokenDelta - if (gauge < thresholds[state.current.stage]) return { ...state, gauge } - if (state.current.nextEvolutions.length === 0) return { ...state, gauge: 0, isTerminal: true } + if (gauge < threshold) return { ...state, gauge } + if (state.current.nextEvolutions.length === 0) { + return { ...state, gauge: 0, isTerminal: true, pendingEvolutionTargetId: null, battleOpponentNodeId: null } + } + + const pendingEvolutionTargetId = pickEvolutionTarget(state.current, selector) + const target = digimonById.get(pendingEvolutionTargetId) + if (target === undefined) { + throw new Error(`Evolution target ${pendingEvolutionTargetId} is missing from the catalog`) + } - const selection = selector() - if (!Number.isFinite(selection) || selection < 0 || selection >= 1) { - throw new Error(`Evolution selector must return a finite number in [0, 1), received ${selection}`) + const battleOpponentNodeId = pickRandomSameStageOpponent(state.current, catalogNodes, selector) + if (digimonById.get(battleOpponentNodeId) === undefined) { + throw new Error(`Battle opponent ${battleOpponentNodeId} is missing from the catalog`) } - const targetId = state.current.nextEvolutions[Math.floor(selection * state.current.nextEvolutions.length)] - if (targetId === undefined) throw new Error("Evolution target selection failed") + return { + current: state.current, + gauge: threshold, + isTerminal: false, + pendingEvolutionTargetId, + battleOpponentNodeId, + } +} + +export const resolveEvolutionBattle = ( + state: PartnerEvolutionState, + won: boolean, + digimonById: ReadonlyMap, +): PartnerEvolutionState => { + if (!hasPendingBattle(state)) { + throw new Error("Cannot resolve evolution battle without a pending battle") + } + + if (!won) { + return { + current: state.current, + gauge: 0, + isTerminal: state.isTerminal, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + } + } + + const targetId = state.pendingEvolutionTargetId + if (targetId === null) throw new Error("Pending evolution target is missing") const current = digimonById.get(targetId) if (current === undefined) throw new Error(`Evolution target ${targetId} is missing from the catalog`) - return { current, gauge: 0, isTerminal: current.nextEvolutions.length === 0 } + return { + current, + gauge: 0, + isTerminal: current.nextEvolutions.length === 0, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + } } diff --git a/packages/opencode-vpet/build/vpet-core-src/domain/partner.ts b/packages/opencode-vpet/build/vpet-core-src/domain/partner.ts index d153747..5e2ed9b 100644 --- a/packages/opencode-vpet/build/vpet-core-src/domain/partner.ts +++ b/packages/opencode-vpet/build/vpet-core-src/domain/partner.ts @@ -4,6 +4,8 @@ export type Partner = { readonly currentNodeId: string readonly gauge: number readonly isTerminal: boolean + readonly pendingEvolutionTargetId: string | null + readonly battleOpponentNodeId: string | null readonly createdAt: string readonly retiredAt: string | null } @@ -12,4 +14,6 @@ export type PartnerProgression = { readonly currentNodeId: string readonly gauge: number readonly isTerminal: boolean + readonly pendingEvolutionTargetId: string | null + readonly battleOpponentNodeId: string | null } diff --git a/packages/opencode-vpet/build/vpet-core-src/view-models/sidebar-view-model.ts b/packages/opencode-vpet/build/vpet-core-src/view-models/sidebar-view-model.ts index c345e99..0e77d8a 100644 --- a/packages/opencode-vpet/build/vpet-core-src/view-models/sidebar-view-model.ts +++ b/packages/opencode-vpet/build/vpet-core-src/view-models/sidebar-view-model.ts @@ -17,6 +17,7 @@ export type SidebarCardModel = readonly isTerminal: boolean readonly frozen: boolean readonly isSetOverride: boolean + readonly evolutionBattlePending: boolean } export const buildSidebarCardModel = ( @@ -38,5 +39,6 @@ export const buildSidebarCardModel = ( isTerminal: inputs.isTerminal, frozen: inputs.frozen, isSetOverride: inputs.isSetOverride, + evolutionBattlePending: inputs.evolutionBattlePending, } } diff --git a/packages/opencode-vpet/src/adapters/opencode/create-server-hooks.ts b/packages/opencode-vpet/src/adapters/opencode/create-server-hooks.ts index db3734b..0227583 100644 --- a/packages/opencode-vpet/src/adapters/opencode/create-server-hooks.ts +++ b/packages/opencode-vpet/src/adapters/opencode/create-server-hooks.ts @@ -14,10 +14,6 @@ import type { VpetControl } from "@sbugallo/vpet-core/application/ports/vpet-con import type { UsageProcessingResult } from "@sbugallo/vpet-core/application/models/usage.ts" import { reconcileUsage } from "@sbugallo/vpet-core/application/use-cases/reconcile-usage.ts" import { recordUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" -import { - resolveEvolutionBattleForPartner, - type EvolutionBattleRepository, -} from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" import { STAGE_GAUGE_THRESHOLDS, type EvolutionSelector, @@ -85,15 +81,11 @@ const requiresCatalog = (event: VpetToastEvent): boolean => { return true case "freeze": case "unfreeze": + case "defeat": return false } } -const isEvolutionBattleRepository = ( - repository: ServerHookDependencies["repository"], -): repository is ServerHookDependencies["repository"] & EvolutionBattleRepository => - "resolveEvolutionBattle" in repository && typeof repository.resolveEvolutionBattle === "function" - export const createCommandConfig = () => ({ "vpet-spawn": { template: "Spawn a new virtual pet." }, "vpet-freeze": { template: "Freeze virtual pet progression." }, @@ -120,19 +112,6 @@ export const createServerHooks = ({ if (result.evolutionBattlePending !== undefined) { const battleToast = toToastEvent(result) if (battleToast !== undefined) await notifyEvent(battleToast, catalog) - - if (isEvolutionBattleRepository(repository)) { - const won = evolutionSelector() < 0.5 - const resolved = resolveEvolutionBattleForPartner( - repository, - won, - catalog.byId, - new Date().toISOString(), - ) - if (resolved.kind === "won") { - await notifyEvent({ kind: "evolution", ...resolved.evolution }, catalog) - } - } return } diff --git a/packages/opencode-vpet/src/adapters/opencode/vpet-toast.ts b/packages/opencode-vpet/src/adapters/opencode/vpet-toast.ts index 6fdc451..1a1f3f8 100644 --- a/packages/opencode-vpet/src/adapters/opencode/vpet-toast.ts +++ b/packages/opencode-vpet/src/adapters/opencode/vpet-toast.ts @@ -15,6 +15,7 @@ export type VpetToastEvent = | Readonly<{ readonly kind: "set"; readonly nodeId: string }> | Readonly<{ readonly kind: "evolution"; readonly fromNodeId: string; readonly toNodeId: string }> | Readonly<{ readonly kind: "evolution_battle"; readonly opponentNodeId: string }> + | Readonly<{ readonly kind: "defeat" }> export type VpetToastNotifier = (payload: VpetToastPayload) => Promise @@ -95,6 +96,13 @@ export const formatVpetToast = ( duration: 5_000, } } + case "defeat": + return { + title: "Defeat", + message: "Defeat! You lost all tokens for this stage.", + variant: "info", + duration: 5_000, + } default: return assertNever(event) } diff --git a/packages/opencode-vpet/src/index.ts b/packages/opencode-vpet/src/index.ts index 2de40c6..1d41a2b 100644 --- a/packages/opencode-vpet/src/index.ts +++ b/packages/opencode-vpet/src/index.ts @@ -8,8 +8,8 @@ import { loadGlobalVpetSettings } from "./config/global-vpet-settings.ts" import type { ResolvedVpetSettings } from "@sbugallo/vpet-core/config/types.ts" import type { StageThresholds } from "@sbugallo/vpet-core/domain/evolution.ts" export { createCommandConfig } from "./adapters/opencode/create-server-hooks.ts" -export { DIGIMON_DATA } from "@sbugallo/vpet-core/data/digimon-data.js" -export type { DigimonId, DigimonRecord, DigimonStage } from "@sbugallo/vpet-core/data/digimon-data.js" +export { DIGIMON_DATA } from "@sbugallo/vpet-core/data/digimon-data.ts" +export type { DigimonId, DigimonRecord, DigimonStage } from "@sbugallo/vpet-core/data/digimon-data.ts" const getStringOption = (options: PluginOptions | undefined, name: string): string | undefined => { const value = options?.[name] diff --git a/packages/opencode-vpet/src/tui.tsx b/packages/opencode-vpet/src/tui.tsx index 2ca43af..e5fb071 100644 --- a/packages/opencode-vpet/src/tui.tsx +++ b/packages/opencode-vpet/src/tui.tsx @@ -7,18 +7,26 @@ import { createSignal } from "solid-js" import { createSqliteSidebarSnapshotReader } from "./adapters/sqlite/sqlite-sidebar-snapshot-reader.ts" import { createSqliteVpetArchiveReader } from "./adapters/sqlite/sqlite-vpet-archive-reader.ts" +import { createSqliteVpetRepository } from "./adapters/sqlite/sqlite-vpet-write-store.ts" import type { SidebarCardInputs } from "@sbugallo/vpet-core/application/models/sidebar-card-inputs.ts" +import type { SidebarSnapshot } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" import type { VpetArchiveReader } from "@sbugallo/vpet-core/application/ports/vpet-archive.ts" import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/get-sidebar-card-inputs.ts" +import type { EvolutionBattleRepository } from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" import { loadGlobalVpetSettings } from "./config/global-vpet-settings.ts" import type { ResolvedVpetSettings } from "@sbugallo/vpet-core/config/types.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { VpetSidebarCard } from "./tui/sidebar-card.tsx" +import { + DEFAULT_BATTLE_ARTWORK_WIDTH, + runEvolutionBattleSession, +} from "./tui/evolution-battle-session.ts" import { MonsterAnimationController, type MonsterAnimationOutput } from "./tui/monster-animation.ts" import { createSidebarPollLoop } from "./tui/sidebar-poll-loop.ts" import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" import { registerVpetCommandLayer } from "./tui/vpet-command-layer.tsx" +import { formatVpetToast, type VpetToastEvent, type VpetToastNotifier } from "./adapters/opencode/vpet-toast.ts" const VISUAL_INTERVAL_MS = 500 @@ -63,6 +71,10 @@ type TuiSchedulingOptions = { readonly random?: () => number readonly onAnimation?: (output: MonsterAnimationOutput) => void readonly archiveReader?: VpetArchiveReader + readonly battleRepository?: EvolutionBattleRepository + readonly getSnapshot?: () => SidebarSnapshot | null + readonly notify?: VpetToastNotifier + readonly closeBattleRepository?: () => Promise } const sameAnimation = (left: MonsterAnimationOutput, right: MonsterAnimationOutput): boolean => @@ -89,12 +101,65 @@ export const createTui = offset: 0, facing: "left", }) + const [customArtwork, setCustomArtwork] = createSignal() const controller = new MonsterAnimationController( MONSTER_FRAME_CATALOG, scheduling.random ?? Math.random, scheduling.nowMs, ) let disposed = false + let battleInProgress = false + let artworkWidth = DEFAULT_BATTLE_ARTWORK_WIDTH + const notifyEvent = async (event: VpetToastEvent): Promise => { + if (scheduling.notify === undefined) return + const payload = formatVpetToast(event, settings.language, DIGIMON_CATALOG) + if (payload !== undefined) await scheduling.notify(payload) + } + const tryResolveEvolutionBattle = async (): Promise => { + if ( + disposed || + battleInProgress || + scheduling.battleRepository === undefined || + scheduling.getSnapshot === undefined + ) { + return false + } + const snapshot = scheduling.getSnapshot() + if (snapshot === null) return false + if (snapshot.pendingEvolutionTargetId === null || snapshot.battleOpponentNodeId === null) return false + + battleInProgress = true + try { + const battled = await runEvolutionBattleSession(snapshot, artworkWidth, { + frameCatalog: MONSTER_FRAME_CATALOG, + digimonCatalog: DIGIMON_CATALOG, + repository: scheduling.battleRepository, + ...(scheduling.random === undefined ? {} : { random: scheduling.random }), + onArtwork: async (artwork) => { + setCustomArtwork(artwork) + api.renderer.requestRender() + }, + onResolved: async (result) => { + if (result.kind === "won") { + await notifyEvent({ kind: "evolution", ...result.evolution }) + } else if (result.kind === "lost") { + await notifyEvent({ kind: "defeat" }) + } + }, + }) + if (battled) { + setCustomArtwork(undefined) + const nextInputs = await Promise.resolve().then(() => loadInputs()) + setInputs(nextInputs) + syncAnimation(nextInputs) + api.renderer.requestRender() + } + return battled + } finally { + battleInProgress = false + setCustomArtwork(undefined) + } + } const publish = (nextAnimation: MonsterAnimationOutput): boolean => { if (sameAnimation(animation(), nextAnimation)) return false setAnimation(nextAnimation) @@ -116,9 +181,17 @@ export const createTui = intervalMs: VISUAL_INTERVAL_MS, load: async () => loadInputs(), apply: (nextInputs) => { - setInputs(nextInputs) - syncAnimation(nextInputs) - api.renderer.requestRender() + void (async () => { + if (await tryResolveEvolutionBattle()) { + if (disposed) return + poller.refresh() + return + } + if (disposed || battleInProgress) return + setInputs(nextInputs) + syncAnimation(nextInputs) + api.renderer.requestRender() + })() }, schedule: (callback, intervalMs) => ( @@ -137,7 +210,7 @@ export const createTui = return () => clearInterval(handle) }) )(() => { - if (disposed) return + if (disposed || battleInProgress) return const nextAnimation = controller.dispatch({ kind: "tick" }) publish(nextAnimation) scheduling.onAnimation?.(nextAnimation) @@ -194,6 +267,7 @@ export const createTui = poller.dispose() stopVisualInterval() for (const unsubscribe of unsubscribes) unsubscribe() + void scheduling.closeBattleRepository?.() }) api.slots.register({ @@ -203,8 +277,10 @@ export const createTui = buildSidebarCardModel(inputs(), settings)} animation={animation} + customArtwork={customArtwork} onArtworkWidthChange={(width) => { if (disposed) return + artworkWidth = width if (publish(controller.dispatch({ kind: "viewport_resized", width }))) api.renderer.requestRender() }} /> @@ -215,10 +291,29 @@ export const createTui = } export const tui: TuiPlugin = async (api, options) => { - const reader = createSqliteSidebarSnapshotReader(readerOptions(options)) - const archiveReader = createSqliteVpetArchiveReader(readerOptions(options)) + const databaseOptions = readerOptions(options) + const reader = createSqliteSidebarSnapshotReader(databaseOptions) + const battleRepository = await createSqliteVpetRepository(databaseOptions) + const archiveReader = createSqliteVpetArchiveReader(databaseOptions) const settings = await loadGlobalVpetSettings() - await createTui(() => getSidebarCardInputs(reader, DIGIMON_CATALOG), settings, { archiveReader })({ + await createTui(() => getSidebarCardInputs(reader, DIGIMON_CATALOG), settings, { + archiveReader, + battleRepository, + getSnapshot: () => reader.getSidebarSnapshot(), + ...( "client" in api && api.client !== undefined && "tui" in api.client + ? { + notify: async (payload): Promise => { + void api.client.tui.showToast({ + title: payload.title, + message: payload.message, + variant: payload.variant, + duration: payload.duration, + }) + }, + } + : {}), + closeBattleRepository: () => battleRepository.close(), + })({ event: { on: (...subscription) => { switch (subscription[0]) { diff --git a/packages/opencode-vpet/src/tui/defeat-artwork.ts b/packages/opencode-vpet/src/tui/defeat-artwork.ts new file mode 100644 index 0000000..9ae1f75 --- /dev/null +++ b/packages/opencode-vpet/src/tui/defeat-artwork.ts @@ -0,0 +1,67 @@ +import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + +const FRAME_ROWS = 8 +const FRAME_COLUMNS = 16 + +export const DEFEAT_CYCLE_MS = 550 +export const DEFEAT_CYCLES = 5 +export const DEFEAT_PRE_ANIMATION_MS = 300 + +const NORMAL_FRAME: MonsterFrameName = "walk_1" +const SAD_FRAMES: readonly MonsterFrameName[] = ["refuse", "injured_1"] + +export type DefeatArtworkScene = { + readonly sad: boolean + readonly sadAlt: boolean +} + +const frameLines = (catalog: MonsterFrameCatalog, sprite: string, frameName: MonsterFrameName): string[] => { + const frame = catalog.get(sprite, frameName) ?? catalog.get(sprite, "walk_1") + if (frame === undefined) return Array.from({ length: FRAME_ROWS }, () => " ".repeat(FRAME_COLUMNS)) + return frame.content.split("\n") +} + +const sadFrameFor = (catalog: MonsterFrameCatalog, sprite: string, sadAlt: boolean): MonsterFrameName => { + const preferred = sadAlt ? SAD_FRAMES[1] : SAD_FRAMES[0] + if (preferred !== undefined && catalog.get(sprite, preferred) !== undefined) return preferred + const fallback = SAD_FRAMES.find((frameName) => catalog.get(sprite, frameName) !== undefined) + return fallback ?? "injured_1" +} + +const centerArtwork = (rows: readonly string[], viewportWidth: number): string => { + const padding = Math.max(Math.floor((viewportWidth - FRAME_COLUMNS) / 2), 0) + return rows.map((row) => `${" ".repeat(padding)}${row}`).join("\n") +} + +export const renderDefeatArtwork = ( + catalog: MonsterFrameCatalog, + sprite: string, + scene: DefeatArtworkScene, + viewportWidth: number, +): string => { + const frameName = scene.sad ? sadFrameFor(catalog, sprite, scene.sadAlt) : NORMAL_FRAME + const spriteRows = frameLines(catalog, sprite, frameName) + return centerArtwork(spriteRows, viewportWidth) +} + +export const sleep = (ms: number): Promise => + new Promise((resolve) => { + setTimeout(resolve, ms) + }) + +export const runDefeatAnimation = async ( + catalog: MonsterFrameCatalog, + sprite: string, + viewportWidth: number, + onFrame: (artwork: string) => Promise, +): Promise => { + await sleep(DEFEAT_PRE_ANIMATION_MS) + + for (let cycle = 0; cycle < DEFEAT_CYCLES; cycle += 1) { + const sad = cycle % 2 === 1 + const sadAlt = cycle % 4 >= 2 + await onFrame(renderDefeatArtwork(catalog, sprite, { sad, sadAlt }, viewportWidth)) + if (cycle < DEFEAT_CYCLES - 1) await sleep(DEFEAT_CYCLE_MS) + } +} diff --git a/packages/opencode-vpet/src/tui/evolution-artwork.ts b/packages/opencode-vpet/src/tui/evolution-artwork.ts new file mode 100644 index 0000000..e03f034 --- /dev/null +++ b/packages/opencode-vpet/src/tui/evolution-artwork.ts @@ -0,0 +1,138 @@ +import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + +const FRAME_ROWS = 8 +const FRAME_COLUMNS = 16 + +export const EVOLUTION_PRE_ANIMATION_MS = 400 +export const EVOLUTION_GLOW_MS = 700 +export const EVOLUTION_MORPH_MS = 1300 +export const EVOLUTION_REVEAL_MS = 1500 +export const EVOLUTION_TICK_MS = 70 + +const GLOW_GLYPHS = "▄▀█░" + +export type EvolutionArtworkPhase = "glow" | "morph" | "reveal" + +export type EvolutionArtworkScene = { + readonly phase: EvolutionArtworkPhase + readonly progress: number +} + +const frameLines = (catalog: MonsterFrameCatalog, sprite: string, frameName: MonsterFrameName): string[] => { + const frame = catalog.get(sprite, frameName) ?? catalog.get(sprite, "walk_1") + if (frame === undefined) return Array.from({ length: FRAME_ROWS }, () => " ".repeat(FRAME_COLUMNS)) + return frame.content.split("\n") +} + +const padRow = (row: string, width: number): string => row.padEnd(width, " ").slice(0, width) + +const centerArtwork = (rows: readonly string[], viewportWidth: number): string => { + const padding = Math.max(Math.floor((viewportWidth - FRAME_COLUMNS) / 2), 0) + return rows.map((row) => `${" ".repeat(padding)}${row}`).join("\n") +} + +const glowRow = (row: string, intensity: number, tick: number): string => { + const cells = Array.from(padRow(row, FRAME_COLUMNS)) + return cells + .map((cell, column) => { + if (cell === " ") return cell + const wave = Math.sin((column + tick) * 0.85) * 0.5 + 0.5 + if (wave < intensity) return cell + const glyph = GLOW_GLYPHS[(column + tick) % GLOW_GLYPHS.length] ?? "█" + return glyph + }) + .join("") +} + +const morphRow = (fromRow: string, toRow: string, progress: number, rowIndex: number): string => { + const from = Array.from(padRow(fromRow, FRAME_COLUMNS)) + const to = Array.from(padRow(toRow, FRAME_COLUMNS)) + return from + .map((fromCell, column) => { + const toCell = to[column] ?? " " + const threshold = (column / FRAME_COLUMNS) * 0.65 + (rowIndex / FRAME_ROWS) * 0.35 + if (progress >= threshold) return toCell === " " ? fromCell : toCell + return fromCell + }) + .join("") +} + +const applyGlow = (rows: string[], progress: number, tick: number): string[] => + rows.map((row, rowIndex) => glowRow(row, progress * 0.75 + rowIndex * 0.02, tick + rowIndex)) + +const applyMorph = (fromRows: string[], toRows: string[], progress: number): string[] => + fromRows.map((fromRow, rowIndex) => morphRow(fromRow, toRows[rowIndex] ?? "", progress, rowIndex)) + +export const renderEvolutionArtwork = ( + catalog: MonsterFrameCatalog, + fromSprite: string, + toSprite: string, + scene: EvolutionArtworkScene, + viewportWidth: number, + tick = 0, +): string => { + const fromRows = frameLines(catalog, fromSprite, "walk_1") + const toRows = frameLines(catalog, toSprite, "walk_1") + const happyRows = frameLines(catalog, toSprite, "happy") + + let spriteRows: string[] + switch (scene.phase) { + case "glow": + spriteRows = applyGlow(fromRows, scene.progress, tick) + break + case "morph": + spriteRows = applyMorph(fromRows, toRows, scene.progress) + break + case "reveal": { + const revealBlend = scene.progress < 0.35 ? applyMorph(toRows, happyRows, scene.progress / 0.35) : happyRows + spriteRows = revealBlend + break + } + } + + return centerArtwork(spriteRows, viewportWidth) +} + +export const sleep = (ms: number): Promise => + new Promise((resolve) => { + setTimeout(resolve, ms) + }) + +const animatePhase = async ( + catalog: MonsterFrameCatalog, + fromSprite: string, + toSprite: string, + viewportWidth: number, + phase: EvolutionArtworkPhase, + durationMs: number, + onFrame: (artwork: string) => Promise, +): Promise => { + const steps = Math.max(1, Math.ceil(durationMs / EVOLUTION_TICK_MS)) + for (let step = 0; step <= steps; step += 1) { + const progress = step / steps + const artwork = renderEvolutionArtwork( + catalog, + fromSprite, + toSprite, + { phase, progress }, + viewportWidth, + step, + ) + await onFrame(artwork) + if (step < steps) await sleep(EVOLUTION_TICK_MS) + } +} + +export const runEvolutionAnimation = async ( + catalog: MonsterFrameCatalog, + fromSprite: string, + toSprite: string, + viewportWidth: number, + onFrame: (artwork: string) => Promise, +): Promise => { + await sleep(EVOLUTION_PRE_ANIMATION_MS) + await animatePhase(catalog, fromSprite, toSprite, viewportWidth, "glow", EVOLUTION_GLOW_MS, onFrame) + await animatePhase(catalog, fromSprite, toSprite, viewportWidth, "morph", EVOLUTION_MORPH_MS, onFrame) + await animatePhase(catalog, fromSprite, toSprite, viewportWidth, "reveal", EVOLUTION_REVEAL_MS, onFrame) +} diff --git a/packages/opencode-vpet/src/tui/evolution-battle-artwork.ts b/packages/opencode-vpet/src/tui/evolution-battle-artwork.ts new file mode 100644 index 0000000..7bc7bd0 --- /dev/null +++ b/packages/opencode-vpet/src/tui/evolution-battle-artwork.ts @@ -0,0 +1,510 @@ +import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { mirrorMonsterFrame } from "./monster-artwork-mirror.ts" + +const FRAME_ROWS = 8 +const FRAME_COLUMNS = 16 +const BATTLE_GAP_COLUMNS = 12 + +export const EVOLUTION_BATTLE_HITS_TO_WIN = 3 +export const EVOLUTION_BATTLE_MAX_SHOTS = 24 +export const EVOLUTION_BATTLE_INTRO_MS = 1600 +export const EVOLUTION_BATTLE_TRAVEL_MS = 900 +export const EVOLUTION_BATTLE_PAUSE_MS = 550 +export const EVOLUTION_BATTLE_IMPACT_MS = 650 +export const EVOLUTION_BATTLE_OUTCOME_MS = 1400 +export const EVOLUTION_BATTLE_TICK_MS = 70 + +/** FIGlet-style BATTLE banner. */ +export const BATTLE_FIGLET_LINES = Object.freeze([ + "██████╗ █████╗ ████████╗████████╗██╗ ███████╗", + "██╔══██╗██╔══██╗╚══██╔══╝╚══██╔══╝██║ ██╔════╝", + "██████╔╝███████║ ██║ ██║ ██║ █████╗ ", + "██╔══██╗██╔══██║ ██║ ██║ ██║ ██╔══╝ ", + "██████╔╝██║ ██║ ██║ ██║ ███████╗███████╗", + "╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝╚══════╝", +]) + +export const buildBattleIntroTextLines = (): readonly string[] => BATTLE_FIGLET_LINES + +/** Block-style flame sprite matching Digimon ASCII art. */ +export const FIREBALL_LINES = Object.freeze([" ▄▀▄ ", "▄█▀▀█", " ▀▀▀ "]) + +const FIREBALL_ROWS = FIREBALL_LINES.length +const FIREBALL_COLUMNS = FIREBALL_LINES[0]?.length ?? 0 +const FIREBALL_START_ROW = Math.floor((FRAME_ROWS - FIREBALL_ROWS) / 2) + +const IMPACT_LINES = Object.freeze([" ▄█▄ ", " █▀█ ", " ▀▀▀ "]) +const IMPACT_ROWS = IMPACT_LINES.length +const IMPACT_START_ROW = FIREBALL_START_ROW + +export type EvolutionBattleShooter = "player" | "opponent" +export type EvolutionBattleOutcome = EvolutionBattleShooter +export type BattleSpritePose = "attack" | "injured" | "happy" | "idle" +export type EvolutionBattleResultLabel = "hit" | "miss" | null + +export type EvolutionBattleShot = { + readonly shooter: EvolutionBattleShooter + readonly hit: boolean +} + +export type EvolutionBattleScene = { + readonly shooter: EvolutionBattleShooter | null + readonly progress: number + readonly playerPose: BattleSpritePose + readonly opponentPose: BattleSpritePose + readonly playerInjuredAlt: boolean + readonly opponentInjuredAlt: boolean + readonly playerHits: number + readonly opponentHits: number + readonly lastResult: EvolutionBattleResultLabel + readonly outcomeLabel: string | null +} + +const poseToFrame = (pose: BattleSpritePose, injuredAlt: boolean): MonsterFrameName => { + switch (pose) { + case "attack": + return "attack" + case "injured": + return injuredAlt ? "injured_2" : "injured_1" + case "happy": + return "happy" + default: + return "walk_1" + } +} + +const frameLines = ( + catalog: MonsterFrameCatalog, + sprite: string, + facing: "left" | "right", + pose: BattleSpritePose, + injuredAlt: boolean, +): string[] => { + const frameName = poseToFrame(pose, injuredAlt) + const frame = catalog.get(sprite, frameName) ?? catalog.get(sprite, "walk_1") + if (frame === undefined) return Array.from({ length: FRAME_ROWS }, () => " ".repeat(FRAME_COLUMNS)) + if (facing === "right") { + const mirrored = mirrorMonsterFrame(frame) + if (mirrored.kind === "mirrored") return mirrored.frame.content.split("\n") + } + return frame.content.split("\n") +} + +const padRow = (row: string, width: number): string => row.padEnd(width, " ").slice(0, width) + +const overlayAt = (base: string, overlay: string, startColumn: number): string => { + const result = base.split("") + for (let index = 0; index < overlay.length; index += 1) { + const column = startColumn + index + if (column < 0 || column >= result.length) continue + const character = overlay[index] + if (character !== undefined && character !== " ") result[column] = character + } + return result.join("") +} + +const centerText = (width: number, text: string): string => { + const start = Math.max(0, Math.floor((width - text.length) / 2)) + return `${" ".repeat(start)}${text}`.padEnd(width, " ").slice(0, width) +} + +export const BATTLE_SCORE_HIT_PIP = "█" +export const BATTLE_SCORE_MISS_PIP = "░" + +export const buildBattleScorePips = ( + hits: number, + total: number = EVOLUTION_BATTLE_HITS_TO_WIN, +): string => + Array.from({ length: total }, (_, index) => + index < hits ? BATTLE_SCORE_HIT_PIP : BATTLE_SCORE_MISS_PIP, + ).join("") + +export const buildBattleScoreRow = ( + playerHits: number, + opponentHits: number, + width: number = BATTLE_GAP_COLUMNS, +): string => { + const playerPips = buildBattleScorePips(playerHits) + const opponentPips = buildBattleScorePips(opponentHits) + const spacer = Math.max(1, width - playerPips.length - opponentPips.length) + return `${playerPips}${" ".repeat(spacer)}${opponentPips}`.padEnd(width, " ").slice(0, width) +} + +const mirrorFireballLine = (line: string): string => Array.from(line).reverse().join("") + +const fireballLinesForShooter = (shooter: EvolutionBattleShooter): readonly string[] => + shooter === "opponent" ? FIREBALL_LINES.map(mirrorFireballLine) : FIREBALL_LINES + +const fireballColumn = (shooter: EvolutionBattleShooter, progress: number): number => { + const travel = BATTLE_GAP_COLUMNS - FIREBALL_COLUMNS + const clamped = Math.max(0, Math.min(1, progress)) + if (shooter === "player") return Math.round(clamped * travel) + return Math.round((1 - clamped) * travel) +} + +const impactColumn = (shooter: EvolutionBattleShooter): number => { + if (shooter === "player") return BATTLE_GAP_COLUMNS - IMPACT_LINES[0]!.length + return 0 +} + +const renderFireballInGap = (gapRows: string[], shooter: EvolutionBattleShooter, progress: number): void => { + const startColumn = fireballColumn(shooter, progress) + const fireballLines = fireballLinesForShooter(shooter) + for (let rowIndex = 0; rowIndex < FIREBALL_ROWS; rowIndex += 1) { + const gapRow = FIREBALL_START_ROW + rowIndex + const fireballLine = fireballLines[rowIndex] ?? "" + gapRows[gapRow] = overlayAt(gapRows[gapRow] ?? "", fireballLine, startColumn) + } +} + +const renderImpactInGap = (gapRows: string[], shooter: EvolutionBattleShooter): void => { + const startColumn = impactColumn(shooter) + for (let rowIndex = 0; rowIndex < IMPACT_ROWS; rowIndex += 1) { + const gapRow = IMPACT_START_ROW + rowIndex + const impactLine = IMPACT_LINES[rowIndex] ?? "" + gapRows[gapRow] = overlayAt(gapRows[gapRow] ?? "", impactLine, startColumn) + } +} + +const renderHudInGap = (gapRows: string[], scene: EvolutionBattleScene): void => { + gapRows[0] = buildBattleScoreRow(scene.playerHits, scene.opponentHits) + if (scene.outcomeLabel !== null) { + gapRows[FRAME_ROWS - 1] = centerText(BATTLE_GAP_COLUMNS, scene.outcomeLabel) + } else if (scene.lastResult !== null) { + gapRows[FRAME_ROWS - 1] = centerText(BATTLE_GAP_COLUMNS, scene.lastResult === "hit" ? "HIT!" : "MISS") + } +} + +const hitsFor = (shooter: EvolutionBattleShooter, playerHits: number, opponentHits: number): number => + shooter === "player" ? playerHits : opponentHits + +const rollShotHit = ( + outcome: EvolutionBattleOutcome, + shooter: EvolutionBattleShooter, + playerHits: number, + opponentHits: number, + random: () => number, +): boolean => { + const winner = outcome + const loser = outcome === "player" ? "opponent" : "player" + const winnerHits = hitsFor(winner, playerHits, opponentHits) + const loserHits = hitsFor(loser, playerHits, opponentHits) + + if (shooter === winner) { + if (winnerHits === EVOLUTION_BATTLE_HITS_TO_WIN - 1) return true + if (loserHits === EVOLUTION_BATTLE_HITS_TO_WIN - 1) return true + return random() < 0.65 + } + + if (loserHits === EVOLUTION_BATTLE_HITS_TO_WIN - 1) return false + return random() < 0.45 +} + +export const planEvolutionBattle = ( + outcome: EvolutionBattleOutcome, + random: () => number = Math.random, +): readonly EvolutionBattleShot[] => { + const shots: EvolutionBattleShot[] = [] + let playerHits = 0 + let opponentHits = 0 + let shooter: EvolutionBattleShooter = "player" + + while ( + playerHits < EVOLUTION_BATTLE_HITS_TO_WIN && + opponentHits < EVOLUTION_BATTLE_HITS_TO_WIN && + shots.length < EVOLUTION_BATTLE_MAX_SHOTS + ) { + const hit = rollShotHit(outcome, shooter, playerHits, opponentHits, random) + shots.push({ shooter, hit }) + if (hit) { + if (shooter === "player") playerHits += 1 + else opponentHits += 1 + } + shooter = shooter === "player" ? "opponent" : "player" + } + + return shots +} + +export const defaultBattleScene = ( + overrides: Partial = {}, +): EvolutionBattleScene => ({ + shooter: null, + progress: 0, + playerPose: "attack", + opponentPose: "attack", + playerInjuredAlt: false, + opponentInjuredAlt: false, + playerHits: 0, + opponentHits: 0, + lastResult: null, + outcomeLabel: null, + ...overrides, +}) + +const buildBattleIntroLines = (tick: number): string[] => { + const textLines = buildBattleIntroTextLines() + const visible = tick % 2 === 0 + return visible ? [...textLines] : textLines.map((line) => " ".repeat(line.length)) +} + +const padIntroRows = (rows: string[], viewportWidth: number): string[] => { + const width = rows[0]?.length ?? 0 + const horizontalPadding = Math.max(0, Math.floor((viewportWidth - width) / 2)) + const pad = " ".repeat(horizontalPadding) + return rows.map((row) => `${pad}${row}`) +} + +export const renderBattleIntroArtwork = (viewportWidth: number, _progress: number, tick = 0): string => { + const lines = buildBattleIntroLines(tick) + return padIntroRows(lines, viewportWidth).join("\n") +} + +export const renderEvolutionBattleArtwork = ( + catalog: MonsterFrameCatalog, + playerSprite: string, + opponentSprite: string, + scene: EvolutionBattleScene, + viewportWidth: number, +): string => { + const playerLines = frameLines(catalog, playerSprite, "right", scene.playerPose, scene.playerInjuredAlt) + const opponentLines = frameLines(catalog, opponentSprite, "left", scene.opponentPose, scene.opponentInjuredAlt) + + const gapRows = Array.from({ length: FRAME_ROWS }, () => " ".repeat(BATTLE_GAP_COLUMNS)) + renderHudInGap(gapRows, scene) + + if (scene.shooter !== null) { + renderFireballInGap(gapRows, scene.shooter, scene.progress) + } + if (scene.lastResult === "hit" && scene.shooter !== null) { + renderImpactInGap(gapRows, scene.shooter) + } + + const battleWidth = FRAME_COLUMNS + BATTLE_GAP_COLUMNS + FRAME_COLUMNS + const rows = Array.from({ length: FRAME_ROWS }, (_, rowIndex) => { + const left = padRow(playerLines[rowIndex] ?? "", FRAME_COLUMNS) + const gap = gapRows[rowIndex] ?? " ".repeat(BATTLE_GAP_COLUMNS) + const right = padRow(opponentLines[rowIndex] ?? "", FRAME_COLUMNS) + return `${left}${gap}${right}` + }) + + const padding = Math.max(Math.floor((viewportWidth - battleWidth) / 2), 0) + return rows.map((row) => `${" ".repeat(padding)}${row}`).join("\n") +} + +export const sleep = (ms: number): Promise => + new Promise((resolve) => { + setTimeout(resolve, ms) + }) + +const postScene = async ( + catalog: MonsterFrameCatalog, + playerSprite: string, + opponentSprite: string, + viewportWidth: number, + scene: EvolutionBattleScene, + onFrame: (artwork: string) => Promise, +): Promise => { + await onFrame(renderEvolutionBattleArtwork(catalog, playerSprite, opponentSprite, scene, viewportWidth)) +} + +const animateBattleIntro = async ( + viewportWidth: number, + onFrame: (artwork: string) => Promise, +): Promise => { + const steps = Math.max(1, Math.ceil(EVOLUTION_BATTLE_INTRO_MS / EVOLUTION_BATTLE_TICK_MS)) + for (let step = 0; step <= steps; step += 1) { + const progress = step / steps + await onFrame(renderBattleIntroArtwork(viewportWidth, progress, step)) + if (step < steps) await sleep(EVOLUTION_BATTLE_TICK_MS) + } +} + +const animateShot = async ( + catalog: MonsterFrameCatalog, + playerSprite: string, + opponentSprite: string, + viewportWidth: number, + shot: EvolutionBattleShot, + playerHits: number, + opponentHits: number, + onFrame: (artwork: string) => Promise, +): Promise => { + const steps = Math.max(1, Math.ceil(EVOLUTION_BATTLE_TRAVEL_MS / EVOLUTION_BATTLE_TICK_MS)) + for (let step = 0; step <= steps; step += 1) { + const progress = step / steps + await postScene( + catalog, + playerSprite, + opponentSprite, + viewportWidth, + defaultBattleScene({ + shooter: shot.shooter, + progress, + playerHits, + opponentHits, + playerPose: "attack", + opponentPose: "attack", + }), + onFrame, + ) + if (step < steps) await sleep(EVOLUTION_BATTLE_TICK_MS) + } +} + +const animateImpact = async ( + catalog: MonsterFrameCatalog, + playerSprite: string, + opponentSprite: string, + viewportWidth: number, + shot: EvolutionBattleShot, + playerHits: number, + opponentHits: number, + onFrame: (artwork: string) => Promise, +): Promise => { + const playerPose = shot.hit && shot.shooter === "opponent" ? "injured" : "attack" + const opponentPose = shot.hit && shot.shooter === "player" ? "injured" : "attack" + const ticks = Math.max(1, Math.ceil(EVOLUTION_BATTLE_IMPACT_MS / EVOLUTION_BATTLE_TICK_MS)) + + for (let tick = 0; tick < ticks; tick += 1) { + await postScene( + catalog, + playerSprite, + opponentSprite, + viewportWidth, + defaultBattleScene({ + shooter: shot.shooter, + progress: 1, + playerHits, + opponentHits, + playerPose, + opponentPose, + playerInjuredAlt: tick % 2 === 1 && playerPose === "injured", + opponentInjuredAlt: tick % 2 === 1 && opponentPose === "injured", + lastResult: shot.hit ? "hit" : "miss", + }), + onFrame, + ) + if (tick < ticks - 1) await sleep(EVOLUTION_BATTLE_TICK_MS) + } +} + +const animatePause = async ( + catalog: MonsterFrameCatalog, + playerSprite: string, + opponentSprite: string, + viewportWidth: number, + playerHits: number, + opponentHits: number, + onFrame: (artwork: string) => Promise, +): Promise => { + await postScene( + catalog, + playerSprite, + opponentSprite, + viewportWidth, + defaultBattleScene({ + playerHits, + opponentHits, + playerPose: "attack", + opponentPose: "attack", + }), + onFrame, + ) + await sleep(EVOLUTION_BATTLE_PAUSE_MS) +} + +const animateOutcome = async ( + catalog: MonsterFrameCatalog, + playerSprite: string, + opponentSprite: string, + viewportWidth: number, + outcome: EvolutionBattleOutcome, + playerHits: number, + opponentHits: number, + onFrame: (artwork: string) => Promise, +): Promise => { + const ticks = Math.max(1, Math.ceil(EVOLUTION_BATTLE_OUTCOME_MS / EVOLUTION_BATTLE_TICK_MS)) + const playerWon = outcome === "player" + const winnerPose: BattleSpritePose = "happy" + const loserPose: BattleSpritePose = "injured" + + for (let tick = 0; tick < ticks; tick += 1) { + const loserBlink = tick % 2 === 1 ? "injured" : loserPose + await postScene( + catalog, + playerSprite, + opponentSprite, + viewportWidth, + defaultBattleScene({ + playerHits, + opponentHits, + playerPose: playerWon ? winnerPose : loserBlink, + opponentPose: playerWon ? loserBlink : winnerPose, + playerInjuredAlt: !playerWon && tick % 2 === 1, + opponentInjuredAlt: playerWon && tick % 2 === 1, + outcomeLabel: playerWon ? "WIN!" : "LOSE!", + }), + onFrame, + ) + if (tick < ticks - 1) await sleep(EVOLUTION_BATTLE_TICK_MS) + } +} + +export const runEvolutionBattleAnimation = async ( + catalog: MonsterFrameCatalog, + playerSprite: string, + opponentSprite: string, + viewportWidth: number, + outcome: EvolutionBattleOutcome, + onFrame: (artwork: string) => Promise, + random: () => number = Math.random, +): Promise => { + await animateBattleIntro(viewportWidth, onFrame) + + const shots = planEvolutionBattle(outcome, random) + let playerHits = 0 + let opponentHits = 0 + + for (let index = 0; index < shots.length; index += 1) { + const shot = shots[index] + if (shot === undefined) continue + + await animateShot(catalog, playerSprite, opponentSprite, viewportWidth, shot, playerHits, opponentHits, onFrame) + if (shot.hit) { + if (shot.shooter === "player") playerHits += 1 + else opponentHits += 1 + } + await animateImpact( + catalog, + playerSprite, + opponentSprite, + viewportWidth, + shot, + playerHits, + opponentHits, + onFrame, + ) + + const battleOver = + playerHits >= EVOLUTION_BATTLE_HITS_TO_WIN || opponentHits >= EVOLUTION_BATTLE_HITS_TO_WIN + const isLastShot = index === shots.length - 1 + if (!battleOver && !isLastShot) { + await animatePause(catalog, playerSprite, opponentSprite, viewportWidth, playerHits, opponentHits, onFrame) + } + if (battleOver) break + } + + await animateOutcome( + catalog, + playerSprite, + opponentSprite, + viewportWidth, + outcome, + playerHits, + opponentHits, + onFrame, + ) + return outcome +} diff --git a/packages/opencode-vpet/src/tui/evolution-battle-session.ts b/packages/opencode-vpet/src/tui/evolution-battle-session.ts new file mode 100644 index 0000000..a07fb92 --- /dev/null +++ b/packages/opencode-vpet/src/tui/evolution-battle-session.ts @@ -0,0 +1,73 @@ +import type { SidebarSnapshot } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" +import type { ResolveEvolutionBattleOutcome } from "@sbugallo/vpet-core/application/models/usage.ts" +import { + resolveEvolutionBattleForPartner, + type EvolutionBattleRepository, +} from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" +import type { DigimonCatalog } from "@sbugallo/vpet-core/data/catalog.ts" +import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + +import { runDefeatAnimation } from "./defeat-artwork.ts" +import { runEvolutionAnimation } from "./evolution-artwork.ts" +import { runEvolutionBattleAnimation, type EvolutionBattleOutcome } from "./evolution-battle-artwork.ts" + +export const DEFAULT_BATTLE_ARTWORK_WIDTH = 80 + +export type EvolutionBattleSessionDependencies = { + readonly frameCatalog: MonsterFrameCatalog + readonly digimonCatalog: DigimonCatalog + readonly repository: EvolutionBattleRepository + readonly random?: () => number + readonly onArtwork: (artwork: string) => Promise + readonly onResolved?: (result: ResolveEvolutionBattleOutcome) => Promise +} + +export const runEvolutionBattleSession = async ( + snapshot: SidebarSnapshot, + viewportWidth: number, + dependencies: EvolutionBattleSessionDependencies, +): Promise => { + if (snapshot.pendingEvolutionTargetId === null || snapshot.battleOpponentNodeId === null) return false + + const player = dependencies.digimonCatalog.byId.get(snapshot.currentNodeId) + const opponent = dependencies.digimonCatalog.byId.get(snapshot.battleOpponentNodeId) + if (player === undefined || opponent === undefined) return false + + const random = dependencies.random ?? Math.random + const outcome: EvolutionBattleOutcome = random() < 0.5 ? "player" : "opponent" + const postArtwork = async (artwork: string): Promise => dependencies.onArtwork(artwork) + + await runEvolutionBattleAnimation( + dependencies.frameCatalog, + player.sprite, + opponent.sprite, + viewportWidth, + outcome, + postArtwork, + random, + ) + + if (outcome === "player") { + const target = dependencies.digimonCatalog.byId.get(snapshot.pendingEvolutionTargetId) + if (target !== undefined) { + await runEvolutionAnimation( + dependencies.frameCatalog, + player.sprite, + target.sprite, + viewportWidth, + postArtwork, + ) + } + } else { + await runDefeatAnimation(dependencies.frameCatalog, player.sprite, viewportWidth, postArtwork) + } + + const result = resolveEvolutionBattleForPartner( + dependencies.repository, + outcome === "player", + dependencies.digimonCatalog.byId, + new Date().toISOString(), + ) + await dependencies.onResolved?.(result) + return true +} diff --git a/packages/opencode-vpet/src/tui/sidebar-card.tsx b/packages/opencode-vpet/src/tui/sidebar-card.tsx index 54e895f..22af55a 100644 --- a/packages/opencode-vpet/src/tui/sidebar-card.tsx +++ b/packages/opencode-vpet/src/tui/sidebar-card.tsx @@ -27,6 +27,12 @@ const positionedOutput = (animation: MonsterAnimationOutput | MonsterAnimationRe } } +const customArtworkRows = (artwork: string): readonly string[] => { + const rows = artwork.split("\n") + if (rows.length >= ARTWORK_ROWS) return rows.slice(0, ARTWORK_ROWS) + return [...rows, ...Array.from({ length: ARTWORK_ROWS - rows.length }, () => "")] +} + const artworkRows = (animation: MonsterAnimationOutput | MonsterAnimationResult, width: number): readonly string[] => { const output = positionedOutput(animation) switch (output.result.kind) { @@ -52,6 +58,7 @@ const artworkRows = (animation: MonsterAnimationOutput | MonsterAnimationResult, const buildNextCheckLine = (model: SidebarCardModel, width: number): string => { if (model.kind === "no_partner") return "" + if (model.evolutionBattlePending) return `${NEXT_CHECK_PREFIX}Evolution battle!` if (model.isTerminal && !model.isSetOverride) return `${NEXT_CHECK_PREFIX}None` const barWidth = Math.max(width - NEXT_CHECK_PREFIX.length - 2, 0) @@ -63,6 +70,7 @@ const buildNextCheckLine = (model: SidebarCardModel, width: number): string => { export const VpetSidebarCard = (props: { readonly model: Accessor readonly animation: Accessor + readonly customArtwork?: Accessor readonly onArtworkWidthChange?: (width: number) => void readonly onUrlClick?: (url: string) => void }) => { @@ -90,7 +98,11 @@ export const VpetSidebarCard = (props: { const renderCard = (): void => { const model = props.model() - for (const [index, content] of artworkRows(props.animation(), Math.floor(artworkWidth?.width ?? 0)).entries()) { + const width = Math.floor(artworkWidth?.width ?? 0) + const battleArtwork = props.customArtwork?.() + const rows = + battleArtwork === undefined ? artworkRows(props.animation(), width) : customArtworkRows(battleArtwork) + for (const [index, content] of rows.entries()) { updateText(artwork[index], content) } diff --git a/packages/opencode-vpet/tests/defeat-artwork.test.ts b/packages/opencode-vpet/tests/defeat-artwork.test.ts new file mode 100644 index 0000000..f78eada --- /dev/null +++ b/packages/opencode-vpet/tests/defeat-artwork.test.ts @@ -0,0 +1,26 @@ +import { describe, expect, test } from "bun:test" + +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { renderDefeatArtwork } from "../src/tui/defeat-artwork.ts" + +describe("defeat artwork", () => { + test("Given normal and sad poses When rendering Then artwork alternates between them", () => { + const normal = renderDefeatArtwork(MONSTER_FRAME_CATALOG, "agumon", { sad: false, sadAlt: false }, 48) + const sad = renderDefeatArtwork(MONSTER_FRAME_CATALOG, "agumon", { sad: true, sadAlt: false }, 48) + + expect(normal).not.toEqual(sad) + }) + + test("Given defeat artwork When rendering Then the sprite is centered in the viewport", () => { + const artwork = renderDefeatArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + { sad: false, sadAlt: false }, + 48, + ) + const lines = artwork.split("\n").filter((line) => line.trim().length > 0) + + expect(lines.length).toBeGreaterThan(0) + expect(lines[0]?.startsWith(" ")).toBe(true) + }) +}) diff --git a/packages/opencode-vpet/tests/evolution-artwork.test.ts b/packages/opencode-vpet/tests/evolution-artwork.test.ts new file mode 100644 index 0000000..4f432e0 --- /dev/null +++ b/packages/opencode-vpet/tests/evolution-artwork.test.ts @@ -0,0 +1,58 @@ +import { describe, expect, test } from "bun:test" + +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { renderEvolutionArtwork } from "../src/tui/evolution-artwork.ts" + +describe("evolution artwork", () => { + test("Given glow phase When rendering Then the sprite is still the current partner", () => { + const from = renderEvolutionArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "greymon", + { phase: "glow", progress: 0.2 }, + 48, + ) + const unchanged = renderEvolutionArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "greymon", + { phase: "glow", progress: 0 }, + 48, + ) + + expect(from.length).toBeGreaterThan(0) + expect(from).not.toEqual(unchanged) + }) + + test("Given morph phase When progress advances Then artwork moves toward the evolved sprite", () => { + const early = renderEvolutionArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "greymon", + { phase: "morph", progress: 0.1 }, + 48, + ) + const late = renderEvolutionArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "greymon", + { phase: "morph", progress: 0.9 }, + 48, + ) + + expect(early).not.toEqual(late) + }) + + test("Given reveal phase When rendering Then only the evolved sprite is shown", () => { + const artwork = renderEvolutionArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "greymon", + { phase: "reveal", progress: 0.8 }, + 48, + ) + + expect(artwork.length).toBeGreaterThan(0) + expect(artwork).not.toContain("Child") + }) +}) diff --git a/packages/opencode-vpet/tests/evolution-battle-artwork.test.ts b/packages/opencode-vpet/tests/evolution-battle-artwork.test.ts new file mode 100644 index 0000000..a506254 --- /dev/null +++ b/packages/opencode-vpet/tests/evolution-battle-artwork.test.ts @@ -0,0 +1,130 @@ +import { describe, expect, test } from "bun:test" + +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { + buildBattleIntroTextLines, + buildBattleScorePips, + buildBattleScoreRow, + defaultBattleScene, + EVOLUTION_BATTLE_HITS_TO_WIN, + FIREBALL_LINES, + planEvolutionBattle, + renderBattleIntroArtwork, + renderEvolutionBattleArtwork, +} from "../src/tui/evolution-battle-artwork.ts" + +const countHits = (shots: readonly { readonly shooter: "player" | "opponent"; readonly hit: boolean }[]) => ({ + playerHits: shots.filter((shot) => shot.shooter === "player" && shot.hit).length, + opponentHits: shots.filter((shot) => shot.shooter === "opponent" && shot.hit).length, +}) + +describe("evolution battle artwork", () => { + test("Given battle intro When ticking Then FIGlet BATTLE banner blinks", () => { + const textLines = buildBattleIntroTextLines() + const on = renderBattleIntroArtwork(80, 1, 0) + const off = renderBattleIntroArtwork(80, 1, 1) + + expect(textLines).toHaveLength(6) + expect(textLines[0]).toContain("██████╗") + expect(on).toContain("███████╗") + expect(off).not.toContain("█") + expect(on).not.toEqual(off) + }) + + test("Given a fireball shot When rendering Then the flame uses block-style sprite art", () => { + const artwork = renderEvolutionBattleArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "gabumon", + defaultBattleScene({ shooter: "player", progress: 0.5 }), + 80, + ) + + for (const line of FIREBALL_LINES) { + for (const character of line.replaceAll(" ", "")) { + expect(artwork).toContain(character) + } + } + }) + + test("Given opponent shot When rendering Then the fireball faces the opposite direction", () => { + const playerShot = renderEvolutionBattleArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "gabumon", + defaultBattleScene({ shooter: "player", progress: 0.5 }), + 80, + ) + const opponentShot = renderEvolutionBattleArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "gabumon", + defaultBattleScene({ shooter: "opponent", progress: 0.5 }), + 80, + ) + + expect(playerShot).toContain("▄█▀▀█") + expect(opponentShot).toContain("█▀▀█▄") + expect(playerShot).not.toEqual(opponentShot) + }) + + test("Given player and opponent shots When rendering travel Then fireballs move from opposite sides", () => { + const playerStart = renderEvolutionBattleArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "gabumon", + defaultBattleScene({ shooter: "player", progress: 0 }), + 80, + ) + const playerEnd = renderEvolutionBattleArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "gabumon", + defaultBattleScene({ shooter: "player", progress: 1 }), + 80, + ) + const opponentStart = renderEvolutionBattleArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "gabumon", + defaultBattleScene({ shooter: "opponent", progress: 0 }), + 80, + ) + + expect(playerStart).not.toEqual(playerEnd) + expect(playerStart).not.toEqual(opponentStart) + expect(EVOLUTION_BATTLE_HITS_TO_WIN).toBe(3) + }) + + test("Given battle progress When rendering Then visual score pips and hit result are shown", () => { + const artwork = renderEvolutionBattleArtwork( + MONSTER_FRAME_CATALOG, + "agumon", + "gabumon", + defaultBattleScene({ playerHits: 2, opponentHits: 1, lastResult: "hit" }), + 80, + ) + + expect(buildBattleScorePips(2)).toBe("██░") + expect(buildBattleScorePips(1)).toBe("█░░") + expect(buildBattleScoreRow(2, 1)).toContain("██░") + expect(buildBattleScoreRow(2, 1)).toContain("█░░") + expect(artwork).toContain("HIT!") + }) + + test("Given planned player victory When battle ends Then player reaches three hits first", () => { + const shots = planEvolutionBattle("player", () => 0.42) + const { playerHits, opponentHits } = countHits(shots) + + expect(playerHits).toBe(EVOLUTION_BATTLE_HITS_TO_WIN) + expect(opponentHits).toBeLessThan(EVOLUTION_BATTLE_HITS_TO_WIN) + }) + + test("Given planned opponent victory When battle ends Then opponent reaches three hits first", () => { + const shots = planEvolutionBattle("opponent", () => 0.42) + const { playerHits, opponentHits } = countHits(shots) + + expect(opponentHits).toBe(EVOLUTION_BATTLE_HITS_TO_WIN) + expect(playerHits).toBeLessThan(EVOLUTION_BATTLE_HITS_TO_WIN) + }) +}) diff --git a/packages/opencode-vpet/tests/evolution-battle-session.test.ts b/packages/opencode-vpet/tests/evolution-battle-session.test.ts new file mode 100644 index 0000000..f5a1491 --- /dev/null +++ b/packages/opencode-vpet/tests/evolution-battle-session.test.ts @@ -0,0 +1,38 @@ +import { describe, expect, test } from "bun:test" + +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { runEvolutionBattleSession } from "../src/tui/evolution-battle-session.ts" + +describe("evolution battle session", () => { + test("Given a snapshot without a pending battle When running the session Then it is a no-op", async () => { + const frames: string[] = [] + const battled = await runEvolutionBattleSession( + { + currentNodeId: "0-001", + gauge: 0, + isTerminal: false, + frozen: false, + isSetOverride: false, + trainerTotalTokens: 0, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + }, + 80, + { + frameCatalog: MONSTER_FRAME_CATALOG, + digimonCatalog: DIGIMON_CATALOG, + repository: { + getActivePartner: () => null, + resolveEvolutionBattle: () => ({ kind: "no_pending_battle" }), + }, + onArtwork: async (artwork) => { + frames.push(artwork) + }, + }, + ) + + expect(battled).toBeFalse() + expect(frames).toEqual([]) + }) +}) diff --git a/packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts b/packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts index 2064f0b..200383f 100644 --- a/packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts +++ b/packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts @@ -73,9 +73,14 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => expect(delivered).toEqual([ expect.objectContaining({ title: "Evolution battle", variant: "info", duration: 5_000 }), - expect.objectContaining({ title: "Digi-evolution", variant: "success", duration: 5_000 }), ]) - expect(repository.getActivePartner()).toEqual(expect.objectContaining({ currentNodeId: "1-001", gauge: 0 })) + expect(repository.getActivePartner()).toEqual( + expect.objectContaining({ + currentNodeId: "0-001", + pendingEvolutionTargetId: "1-001", + battleOpponentNodeId: expect.any(String), + }), + ) expect(repository.listUsageReceipts().map((receipt) => receipt.receiptKey)).toEqual(["message:direct-only"]) expect(repository.getTrainerState()).toEqual({ totalTokens: 1 }) } finally { @@ -91,8 +96,14 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => spawn(repository) await dispatch(createHooks(repository, delivered, [completedMessage("idle-only")]), idleEvent) - expect(delivered).toHaveLength(2) - expect(repository.getActivePartner()).toEqual(expect.objectContaining({ currentNodeId: "1-001", gauge: 0 })) + expect(delivered).toHaveLength(1) + expect(repository.getActivePartner()).toEqual( + expect.objectContaining({ + currentNodeId: "0-001", + pendingEvolutionTargetId: "1-001", + battleOpponentNodeId: expect.any(String), + }), + ) expect(repository.listUsageReceipts().map((receipt) => receipt.receiptKey)).toEqual(["message:idle-only"]) expect(repository.getTrainerState()).toEqual({ totalTokens: 1 }) } finally { @@ -112,7 +123,7 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => const trainer = repository.getTrainerState() await dispatch(createHooks(repository, delivered, [completedMessage("direct-then-idle")]), idleEvent) - expect(delivered).toHaveLength(2) + expect(delivered).toHaveLength(1) expect(repository.getActivePartner()).toEqual(partner) expect(repository.listUsageReceipts()).toEqual(receipts) expect(repository.getTrainerState()).toEqual(trainer) @@ -133,7 +144,7 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => const trainer = repository.getTrainerState() await dispatch(createHooks(repository, delivered), directEvent("idle-then-direct")) - expect(delivered).toHaveLength(2) + expect(delivered).toHaveLength(1) expect(repository.getActivePartner()).toEqual(partner) expect(repository.listUsageReceipts()).toEqual(receipts) expect(repository.getTrainerState()).toEqual(trainer) @@ -158,7 +169,7 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => try { await dispatch(createHooks(reopenedRepository, delivered, [completedMessage("reopen-replay")]), idleEvent) - expect(delivered).toHaveLength(2) + expect(delivered).toHaveLength(1) expect(reopenedRepository.getActivePartner()).toEqual(expectedPartner) expect(reopenedRepository.listUsageReceipts()).toEqual(expectedReceipts) expect(reopenedRepository.getTrainerState()).toEqual(expectedTrainer) @@ -190,7 +201,7 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => try { await dispatch(createHooks(reopenedRepository, delivered, [completedMessage("notifier-failure")]), idleEvent) - expect(attempts).toBe(2) + expect(attempts).toBe(1) expect(delivered).toEqual([]) expect(reopenedRepository.getActivePartner()).toEqual(expectedPartner) expect(reopenedRepository.listUsageReceipts()).toEqual(expectedReceipts) @@ -215,7 +226,7 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => idleEvent, ) - expect(delivered.map((payload) => payload.title)).toEqual(["Evolution battle", "Digi-evolution"]) + expect(delivered.map((payload) => payload.title)).toEqual(["Evolution battle"]) expect(repository.listUsageReceipts().map((receipt) => receipt.receiptKey)).toEqual([ "message:ordered-first", "message:ordered-second", diff --git a/packages/opencode-vpet/tests/server-thresholds.test.ts b/packages/opencode-vpet/tests/server-thresholds.test.ts index b0124de..6ceb18c 100644 --- a/packages/opencode-vpet/tests/server-thresholds.test.ts +++ b/packages/opencode-vpet/tests/server-thresholds.test.ts @@ -257,7 +257,9 @@ describe("server threshold policy", () => { expect(repository.getActivePartner()).toEqual( expect.objectContaining({ gauge: 1, - pendingEvolutionTargetId: "1-001", + currentNodeId: "0-001", + pendingEvolutionTargetId: expect.any(String), + battleOpponentNodeId: expect.any(String), }), ) } finally { @@ -284,7 +286,9 @@ describe("server threshold policy", () => { expect(repository.getActivePartner()).toEqual( expect.objectContaining({ gauge: 1, - pendingEvolutionTargetId: "1-001", + currentNodeId: "0-001", + pendingEvolutionTargetId: expect.any(String), + battleOpponentNodeId: expect.any(String), }), ) } finally { diff --git a/packages/opencode-vpet/tests/vpet-toast.test.ts b/packages/opencode-vpet/tests/vpet-toast.test.ts index f7780b9..2824991 100644 --- a/packages/opencode-vpet/tests/vpet-toast.test.ts +++ b/packages/opencode-vpet/tests/vpet-toast.test.ts @@ -69,6 +69,16 @@ describe("VPet toast presentation", () => { evolution, { title: "Digi-evolution", message: "Digitama evolved into Koromon!", variant: "success", duration: 5_000 }, ], + [ + "defeat", + { kind: "defeat" }, + { + title: "Defeat", + message: "Defeat! You lost all tokens for this stage.", + variant: "info", + duration: 5_000, + }, + ], ] as const)( "Given an English catalog and a %s event When formatting Then it returns the approved payload", (_name, event, expected) => { diff --git a/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-write-store.ts b/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-write-store.ts index 3084919..2ba7c10 100644 --- a/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-write-store.ts +++ b/packages/vpet-core/src/adapters/sqlite/sqlite-vpet-write-store.ts @@ -137,7 +137,14 @@ export const createSqliteVpetWriteStore = (options: CreateSqliteVpetWriteStoreOp input.createdAt, ], ) - return { partnerId, generation: generationRow.generation, ...input, retiredAt: null } + return { + partnerId, + generation: generationRow.generation, + ...input, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + retiredAt: null, + } }) }, listPartnerEvents(partnerId: string) { From 7669efcb408299918bb3fe652d7f4e42519a7b43 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 17:58:09 +0900 Subject: [PATCH 13/41] fix(cursor-vpet): stabilize evolution battle refresh and DB reads. Use a single repository snapshot, a shared battle session, and refresh coalescing so pending battles resolve once instead of replaying in a loop. Co-authored-by: Cursor --- .../sqlite/sqlite-vpet-write-store.ts | 26 +-- packages/cursor-vpet/src/extension.ts | 7 +- .../src/webview/evolution-battle-session.ts | 71 +++++++++ .../src/webview/vpet-sidebar-provider.ts | 149 +++++++----------- .../tests/evolution-battle-session.test.ts | 38 +++++ .../sqljs-vpet-repository.persistence.test.ts | 37 +++++ 6 files changed, 221 insertions(+), 107 deletions(-) create mode 100644 packages/cursor-vpet/src/webview/evolution-battle-session.ts create mode 100644 packages/cursor-vpet/tests/evolution-battle-session.test.ts diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts index e96b169..49520bc 100644 --- a/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts +++ b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts @@ -1,6 +1,8 @@ +import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" import type { SqliteVpetWriteStore } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-types.ts" import { resolveHostDatabasePath, type HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" import { createSqliteVpetWriteStore } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-write-store.ts" +import { readSidebarSnapshotFromExecutor } from "./sqlite-sidebar-snapshot-reader.ts" import { openWritableSqlJsDatabase } from "./sqljs-driver.ts" export type CreateSqliteVpetRepositoryOptions = HostPathOptions & { readonly databasePath?: string } @@ -12,9 +14,10 @@ export type { SqliteVpetWriteStore, } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-types.ts" -export type CursorSqliteVpetRepository = SqliteVpetWriteStore & { - reloadFromDisk(): void -} +export type CursorSqliteVpetRepository = SqliteVpetWriteStore & + SidebarSnapshotReader & { + reloadFromDisk(): void + } export const createSqliteVpetRepository = async ( options: CreateSqliteVpetRepositoryOptions = {}, @@ -22,14 +25,17 @@ export const createSqliteVpetRepository = async ( const databasePath = options.databasePath ?? resolveHostDatabasePath(options) const database = await openWritableSqlJsDatabase(databasePath) + const writeStore = createSqliteVpetWriteStore({ + databasePath, + executor: database.executor, + close: () => { + database.close() + }, + }) + return { - ...createSqliteVpetWriteStore({ - databasePath, - executor: database.executor, - close: () => { - database.close() - }, - }), + ...writeStore, + getSidebarSnapshot: () => readSidebarSnapshotFromExecutor(database.executor), reloadFromDisk: () => { database.reloadFromDisk() }, diff --git a/packages/cursor-vpet/src/extension.ts b/packages/cursor-vpet/src/extension.ts index e75ad4e..cdea4e0 100644 --- a/packages/cursor-vpet/src/extension.ts +++ b/packages/cursor-vpet/src/extension.ts @@ -11,7 +11,6 @@ import { installVpetHooks, uninstallVpetHooks } from "./adapters/cursor/install- import { resolveStateVscdbPath } from "./adapters/cursor/paths.ts" import { configureSqlJsWasmPath } from "./adapters/sqlite/sqljs-config.ts" import { createDatabaseChangeWatcher } from "./adapters/sqlite/database-change-watcher.ts" -import { createSqliteSidebarSnapshotReader } from "./adapters/sqlite/sqlite-sidebar-snapshot-reader.ts" import { createSqliteVpetRepository } from "./adapters/sqlite/sqlite-vpet-write-store.ts" import { getVpetExtensionSettings, toDatabaseOptions } from "./config/extension-settings.ts" import { openDexPanel } from "./webview/dex-panel.ts" @@ -52,8 +51,7 @@ export async function activate(context: vscode.ExtensionContext): Promise const repository = await createSqliteVpetRepository(databaseOptions()) context.subscriptions.push({ dispose: () => repository.close() }) - const snapshotReader = await createSqliteSidebarSnapshotReader(databaseOptions()) - sidebarProvider = new VpetSidebarProvider(context.extensionUri, snapshotReader, repository) + sidebarProvider = new VpetSidebarProvider(context.extensionUri, repository, repository) context.subscriptions.push( vscode.window.registerWebviewViewProvider(VpetSidebarProvider.viewType, sidebarProvider, { webviewOptions: { retainContextWhenHidden: true }, @@ -74,7 +72,8 @@ export async function activate(context: vscode.ExtensionContext): Promise ...databaseOptions(), onChange: () => { repository.reloadFromDisk() - refreshSidebar() + if (sidebarProvider?.isBattleInProgress() !== true) + refreshSidebar() }, }) context.subscriptions.push({ dispose: () => databaseWatcher.dispose() }) diff --git a/packages/cursor-vpet/src/webview/evolution-battle-session.ts b/packages/cursor-vpet/src/webview/evolution-battle-session.ts new file mode 100644 index 0000000..5b575b2 --- /dev/null +++ b/packages/cursor-vpet/src/webview/evolution-battle-session.ts @@ -0,0 +1,71 @@ +import type { SidebarSnapshot } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" +import type { ResolveEvolutionBattleOutcome } from "@sbugallo/vpet-core/application/models/usage.ts" +import { + resolveEvolutionBattleForPartner, + type EvolutionBattleRepository, +} from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" +import type { DigimonCatalog } from "@sbugallo/vpet-core/data/catalog.ts" +import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + +import { runDefeatAnimation } from "./defeat-artwork.ts" +import { runEvolutionAnimation } from "./evolution-artwork.ts" +import { runEvolutionBattleAnimation, type EvolutionBattleOutcome } from "./evolution-battle-artwork.ts" + +export type EvolutionBattleSessionDependencies = { + readonly frameCatalog: MonsterFrameCatalog + readonly digimonCatalog: DigimonCatalog + readonly repository: EvolutionBattleRepository + readonly random?: () => number + readonly onArtwork: (artwork: string) => Promise + readonly onResolved?: (result: ResolveEvolutionBattleOutcome) => Promise +} + +export const runEvolutionBattleSession = async ( + snapshot: SidebarSnapshot, + viewportWidth: number, + dependencies: EvolutionBattleSessionDependencies, +): Promise => { + if (snapshot.pendingEvolutionTargetId === null || snapshot.battleOpponentNodeId === null) return false + + const player = dependencies.digimonCatalog.byId.get(snapshot.currentNodeId) + const opponent = dependencies.digimonCatalog.byId.get(snapshot.battleOpponentNodeId) + if (player === undefined || opponent === undefined) return false + + const random = dependencies.random ?? Math.random + const outcome: EvolutionBattleOutcome = random() < 0.5 ? "player" : "opponent" + const postArtwork = async (artwork: string): Promise => dependencies.onArtwork(artwork) + + await runEvolutionBattleAnimation( + dependencies.frameCatalog, + player.sprite, + opponent.sprite, + viewportWidth, + outcome, + postArtwork, + random, + ) + + if (outcome === "player") { + const target = dependencies.digimonCatalog.byId.get(snapshot.pendingEvolutionTargetId) + if (target !== undefined) { + await runEvolutionAnimation( + dependencies.frameCatalog, + player.sprite, + target.sprite, + viewportWidth, + postArtwork, + ) + } + } else { + await runDefeatAnimation(dependencies.frameCatalog, player.sprite, viewportWidth, postArtwork) + } + + const result = resolveEvolutionBattleForPartner( + dependencies.repository, + outcome === "player", + dependencies.digimonCatalog.byId, + new Date().toISOString(), + ) + await dependencies.onResolved?.(result) + return true +} diff --git a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts index 6631716..88e87da 100644 --- a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts +++ b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts @@ -4,17 +4,11 @@ import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/get-sidebar-card-inputs.ts" -import type { SidebarSnapshot } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" -import { - resolveEvolutionBattleForPartner, - type EvolutionBattleRepository, -} from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" +import type { EvolutionBattleRepository } from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" import { renderPositionedArtwork } from "./animated-artwork.ts" -import { runDefeatAnimation } from "./defeat-artwork.ts" -import { runEvolutionAnimation } from "./evolution-artwork.ts" -import { runEvolutionBattleAnimation, type EvolutionBattleOutcome } from "./evolution-battle-artwork.ts" +import { runEvolutionBattleSession } from "./evolution-battle-session.ts" import { MonsterAnimationController, type MonsterAnimationOutput } from "./monster-animation.ts" import { buildSidebarWebviewHtml, @@ -35,6 +29,8 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { private artworkWidth = DEFAULT_ARTWORK_WIDTH private visualInterval?: ReturnType private battleInProgress = false + private refreshInFlight = false + private pendingRefresh = false private readonly animation = new MonsterAnimationController(MONSTER_FRAME_CATALOG, Math.random, () => performance.now(), ) @@ -45,6 +41,10 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { private readonly battleRepository: EvolutionBattleRepository, ) {} + isBattleInProgress(): boolean { + return this.battleInProgress + } + resolveWebviewView(webviewView: vscode.WebviewView): void { this.view = webviewView webviewView.webview.options = { @@ -92,14 +92,33 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { async refresh(): Promise { if (this.view === undefined) return - - const snapshot = this.snapshotReader.getSidebarSnapshot() - const battled = await this.tryResolveEvolutionBattle(snapshot) - if (battled) { - await this.refresh() + if (this.refreshInFlight) { + this.pendingRefresh = true return } + this.refreshInFlight = true + try { + do { + this.pendingRefresh = false + await this.resolvePendingBattleIfNeeded() + if (this.view === undefined) return + await this.publishSidebarModel() + } while (this.pendingRefresh) + } finally { + this.refreshInFlight = false + } + } + + dispose(): void { + this.stopVisualInterval() + delete this.view + } + + private async publishSidebarModel(): Promise { + if (this.view === undefined) return + + const snapshot = this.snapshotReader.getSidebarSnapshot() const reader = { getSidebarSnapshot: () => snapshot } const inputs = getSidebarCardInputs(reader, DIGIMON_CATALOG) const model = buildSidebarCardModel(inputs, DEFAULT_VPET_SETTINGS) @@ -113,98 +132,42 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { await this.postAnimationFrame() } - dispose(): void { - this.stopVisualInterval() - delete this.view - } - - private async tryResolveEvolutionBattle(snapshot: SidebarSnapshot | null): Promise { - if (snapshot === null) return false - if (snapshot.pendingEvolutionTargetId === null || snapshot.battleOpponentNodeId === null) return false - if (this.battleInProgress) return true - - const player = DIGIMON_CATALOG.byId.get(snapshot.currentNodeId) - const opponent = DIGIMON_CATALOG.byId.get(snapshot.battleOpponentNodeId) - if (player === undefined || opponent === undefined) return false - - await this.runBattleAnimation({ - fromSprite: player.sprite, - opponentSprite: opponent.sprite, - evolutionTargetId: snapshot.pendingEvolutionTargetId, - }) - return true - } - - private async postArtwork(artwork: string): Promise { - this.cachedArtwork = artwork - await this.view?.webview.postMessage({ type: "animation-frame", artwork }) - } - - private async runDefeatReveal(sprite: string): Promise { - await runDefeatAnimation(MONSTER_FRAME_CATALOG, sprite, this.artworkWidth, async (artwork) => - this.postArtwork(artwork), - ) - } - - private async runEvolutionReveal(fromSprite: string, evolutionTargetId: string): Promise { - const target = DIGIMON_CATALOG.byId.get(evolutionTargetId) - if (target === undefined) return - - await runEvolutionAnimation( - MONSTER_FRAME_CATALOG, - fromSprite, - target.sprite, - this.artworkWidth, - async (artwork) => this.postArtwork(artwork), - ) - } - - private async runBattleAnimation(context: { - readonly fromSprite: string - readonly opponentSprite: string - readonly evolutionTargetId: string | null - }): Promise { + private async resolvePendingBattleIfNeeded(): Promise { if (this.battleInProgress) return + const snapshot = this.snapshotReader.getSidebarSnapshot() + if (snapshot === null) return + if (snapshot.pendingEvolutionTargetId === null || snapshot.battleOpponentNodeId === null) return + this.battleInProgress = true this.stopVisualInterval() + this.cachedArtwork = "" try { - const outcome: EvolutionBattleOutcome = Math.random() < 0.5 ? "player" : "opponent" - const battleOutcome = await runEvolutionBattleAnimation( - MONSTER_FRAME_CATALOG, - context.fromSprite, - context.opponentSprite, - this.artworkWidth, - outcome, - async (artwork) => this.postArtwork(artwork), - ) - - const playerWon = battleOutcome === "player" - if (playerWon && context.evolutionTargetId !== null) { - await this.runEvolutionReveal(context.fromSprite, context.evolutionTargetId) - } else if (!playerWon) { - await this.runDefeatReveal(context.fromSprite) - } - - const result = resolveEvolutionBattleForPartner( - this.battleRepository, - playerWon, - DIGIMON_CATALOG.byId, - new Date().toISOString(), - ) - - if (result.kind === "won") { - void vscode.window.showInformationMessage("Victory! Your partner evolved!") - } else if (result.kind === "lost") { - void vscode.window.showInformationMessage("Defeat! You lost all tokens for this stage.") - } + await runEvolutionBattleSession(snapshot, this.artworkWidth, { + frameCatalog: MONSTER_FRAME_CATALOG, + digimonCatalog: DIGIMON_CATALOG, + repository: this.battleRepository, + onArtwork: async (artwork) => this.postArtwork(artwork), + onResolved: async (result) => { + if (result.kind === "won") { + void vscode.window.showInformationMessage("Victory! Your partner evolved!") + } else if (result.kind === "lost") { + void vscode.window.showInformationMessage("Defeat! You lost all tokens for this stage.") + } + }, + }) } finally { this.battleInProgress = false if (this.view?.visible) this.startVisualInterval() } } + private async postArtwork(artwork: string): Promise { + this.cachedArtwork = artwork + await this.view?.webview.postMessage({ type: "animation-frame", artwork }) + } + private syncAnimationPartner(model: ReturnType): void { this.animation.dispatch({ kind: "partner_changed", diff --git a/packages/cursor-vpet/tests/evolution-battle-session.test.ts b/packages/cursor-vpet/tests/evolution-battle-session.test.ts new file mode 100644 index 0000000..8b43bfc --- /dev/null +++ b/packages/cursor-vpet/tests/evolution-battle-session.test.ts @@ -0,0 +1,38 @@ +import { describe, expect, test } from "bun:test" + +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { runEvolutionBattleSession } from "../src/webview/evolution-battle-session.ts" + +describe("evolution battle session", () => { + test("Given a snapshot without a pending battle When running the session Then it is a no-op", async () => { + const frames: string[] = [] + const battled = await runEvolutionBattleSession( + { + currentNodeId: "0-001", + gauge: 0, + isTerminal: false, + frozen: false, + isSetOverride: false, + trainerTotalTokens: 0, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + }, + 80, + { + frameCatalog: MONSTER_FRAME_CATALOG, + digimonCatalog: DIGIMON_CATALOG, + repository: { + getActivePartner: () => null, + resolveEvolutionBattle: () => ({ kind: "no_pending_battle" }), + }, + onArtwork: async (artwork) => { + frames.push(artwork) + }, + }, + ) + + expect(battled).toBeFalse() + expect(frames).toEqual([]) + }) +}) diff --git a/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts b/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts index 0a3cafc..e90f0ef 100644 --- a/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts +++ b/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts @@ -3,6 +3,7 @@ import { mkdir, mkdtemp, rm } from "node:fs/promises" import { join } from "node:path" import { recordUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" +import { resolveEvolutionBattleForPartner } from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" import { spawnPartner } from "@sbugallo/vpet-core/application/use-cases/spawn-partner.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { STAGE_GAUGE_THRESHOLDS } from "@sbugallo/vpet-core/domain/evolution.ts" @@ -97,6 +98,42 @@ describe("sql.js vpet repository persistence", () => { } }) + test("Given a resolved evolution battle When reading through the repository snapshot Then pending battle fields are cleared", async () => { + if (tempRoot === undefined) throw new Error("Missing temp root.") + + const repository = await createSqliteVpetRepository({ appDataRoot: tempRoot.appDataRoot }) + try { + spawnPartner(repository, "2026-09-09T12:00:00.000Z") + recordUsage({ + usage: { + receiptKey: "receipt-threshold", + eventId: "event-threshold", + tokenDelta: STAGE_GAUGE_THRESHOLDS[0], + cost: null, + createdAt: "2026-09-09T12:01:00.000Z", + }, + ledger: repository, + digimonById: DIGIMON_CATALOG.byId, + catalogNodes: DIGIMON_CATALOG.nodes, + selector: () => 0, + thresholds: STAGE_GAUGE_THRESHOLDS, + }) + + const pending = repository.getSidebarSnapshot() + expect(pending?.pendingEvolutionTargetId).not.toBeNull() + expect(pending?.battleOpponentNodeId).not.toBeNull() + + resolveEvolutionBattleForPartner(repository, true, DIGIMON_CATALOG.byId, "2026-09-09T12:02:00.000Z") + + const resolved = repository.getSidebarSnapshot() + expect(resolved?.pendingEvolutionTargetId).toBeNull() + expect(resolved?.battleOpponentNodeId).toBeNull() + expect(resolved?.currentNodeId).not.toBe("0-001") + } finally { + repository.close() + } + }) + test("Given a spawned partner When reading the sidebar snapshot Then it returns the active partner", async () => { if (tempRoot === undefined) throw new Error("Missing temp root.") From 3b91b301e848c3f558055c1ed2bfdb48e3541d3e Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 18:51:13 +0900 Subject: [PATCH 14/41] feat: evolve Digitama directly and split battle from reveal animations. Digitama now crosses stages in the database without a pending battle, while later stages keep the battle flow. Cursor queues direct-evolution reveals from usage events, and OpenCode runs battle and reveal presentations in the sidebar poll loop. Co-authored-by: Cursor --- .../cursor/cursor-usage-event-source.ts | 5 +- packages/cursor-vpet/src/extension.ts | 10 +++- .../src/webview/evolution-battle-session.ts | 21 ++++--- .../src/webview/evolution-reveal-session.ts | 30 ++++++++++ .../src/webview/vpet-sidebar-provider.ts | 51 ++++++++++++++--- .../tests/evolution-reveal-session.test.ts | 43 +++++++++++++++ .../sqljs-vpet-repository.persistence.test.ts | 21 ++++++- .../build/vpet-core-src/domain/evolution.ts | 10 ++++ packages/opencode-vpet/src/tui.tsx | 41 ++++++++++++++ .../src/tui/evolution-battle-session.ts | 21 ++++--- .../src/tui/evolution-reveal-session.ts | 30 ++++++++++ .../tests/catalog-evolution.test.ts | 55 +++++++++---------- ...lite-usage-event-toast.persistence.test.ts | 16 +++--- .../opencode-vpet/tests/record-usage.test.ts | 34 +++++------- .../tests/server-hooks-lifecycle.test.ts | 18 +++--- packages/vpet-core/src/domain/evolution.ts | 10 ++++ 16 files changed, 312 insertions(+), 104 deletions(-) create mode 100644 packages/cursor-vpet/src/webview/evolution-reveal-session.ts create mode 100644 packages/cursor-vpet/tests/evolution-reveal-session.test.ts create mode 100644 packages/opencode-vpet/src/tui/evolution-reveal-session.ts diff --git a/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts b/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts index ab5ed63..96325d4 100644 --- a/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts +++ b/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts @@ -1,6 +1,7 @@ import { watch } from "node:fs" import { open, stat, writeFile } from "node:fs/promises" +import type { UsageProcessingResult } from "@sbugallo/vpet-core/application/models/usage.ts" import type { UsageLedger } from "@sbugallo/vpet-core/application/ports/usage-ledger.ts" import { recordUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" @@ -29,7 +30,7 @@ const toSettleOptions = (options: CursorUsageSettleOptions) => ({ export const createCursorUsageEventSource = ( ledger: UsageLedger, - onApplied?: () => void, + onApplied?: (result: UsageProcessingResult) => void, options: CursorUsageSettleOptions & { readonly eventsPath?: string } = { settleDelayMs: 4000 }, ): CursorUsageEventSource => { const eventsPath = options.eventsPath ?? resolveHookEventsPath() @@ -51,7 +52,7 @@ export const createCursorUsageEventSource = ( thresholds: STAGE_GAUGE_THRESHOLDS, }) console.log(`[cursor-vpet] ${source}`, result) - if (result.kind === "applied") onApplied?.() + if (result.kind === "applied") onApplied?.(result) } const handleBeforeSubmit = async (record: HookEventRecord): Promise => { diff --git a/packages/cursor-vpet/src/extension.ts b/packages/cursor-vpet/src/extension.ts index cdea4e0..806ea59 100644 --- a/packages/cursor-vpet/src/extension.ts +++ b/packages/cursor-vpet/src/extension.ts @@ -63,7 +63,12 @@ export async function activate(context: vscode.ExtensionContext): Promise void sidebarProvider?.refresh() } - const usageSource = createCursorUsageEventSource(repository, refreshSidebar, { + const usageSource = createCursorUsageEventSource(repository, (result) => { + if (result.kind === "applied" && result.evolution !== undefined) { + sidebarProvider?.queueEvolutionReveal(result.evolution) + } + refreshSidebar() + }, { settleDelayMs: readSettings().settleDelayMs, }) context.subscriptions.push(usageSource) @@ -72,8 +77,9 @@ export async function activate(context: vscode.ExtensionContext): Promise ...databaseOptions(), onChange: () => { repository.reloadFromDisk() - if (sidebarProvider?.isBattleInProgress() !== true) + if (sidebarProvider?.isPresentationInProgress() !== true) { refreshSidebar() + } }, }) context.subscriptions.push({ dispose: () => databaseWatcher.dispose() }) diff --git a/packages/cursor-vpet/src/webview/evolution-battle-session.ts b/packages/cursor-vpet/src/webview/evolution-battle-session.ts index 5b575b2..f903ea3 100644 --- a/packages/cursor-vpet/src/webview/evolution-battle-session.ts +++ b/packages/cursor-vpet/src/webview/evolution-battle-session.ts @@ -8,8 +8,8 @@ import type { DigimonCatalog } from "@sbugallo/vpet-core/data/catalog.ts" import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { runDefeatAnimation } from "./defeat-artwork.ts" -import { runEvolutionAnimation } from "./evolution-artwork.ts" import { runEvolutionBattleAnimation, type EvolutionBattleOutcome } from "./evolution-battle-artwork.ts" +import { runEvolutionRevealSession } from "./evolution-reveal-session.ts" export type EvolutionBattleSessionDependencies = { readonly frameCatalog: MonsterFrameCatalog @@ -46,16 +46,15 @@ export const runEvolutionBattleSession = async ( ) if (outcome === "player") { - const target = dependencies.digimonCatalog.byId.get(snapshot.pendingEvolutionTargetId) - if (target !== undefined) { - await runEvolutionAnimation( - dependencies.frameCatalog, - player.sprite, - target.sprite, - viewportWidth, - postArtwork, - ) - } + await runEvolutionRevealSession( + { fromNodeId: snapshot.currentNodeId, toNodeId: snapshot.pendingEvolutionTargetId }, + viewportWidth, + { + frameCatalog: dependencies.frameCatalog, + digimonCatalog: dependencies.digimonCatalog, + onArtwork: postArtwork, + }, + ) } else { await runDefeatAnimation(dependencies.frameCatalog, player.sprite, viewportWidth, postArtwork) } diff --git a/packages/cursor-vpet/src/webview/evolution-reveal-session.ts b/packages/cursor-vpet/src/webview/evolution-reveal-session.ts new file mode 100644 index 0000000..3632b90 --- /dev/null +++ b/packages/cursor-vpet/src/webview/evolution-reveal-session.ts @@ -0,0 +1,30 @@ +import type { UsageEvolutionTransition } from "@sbugallo/vpet-core/application/models/usage.ts" +import type { DigimonCatalog } from "@sbugallo/vpet-core/data/catalog.ts" +import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + +import { runEvolutionAnimation } from "./evolution-artwork.ts" + +export type EvolutionRevealSessionDependencies = { + readonly frameCatalog: MonsterFrameCatalog + readonly digimonCatalog: DigimonCatalog + readonly onArtwork: (artwork: string) => Promise +} + +export const runEvolutionRevealSession = async ( + evolution: UsageEvolutionTransition, + viewportWidth: number, + dependencies: EvolutionRevealSessionDependencies, +): Promise => { + const from = dependencies.digimonCatalog.byId.get(evolution.fromNodeId) + const to = dependencies.digimonCatalog.byId.get(evolution.toNodeId) + if (from === undefined || to === undefined) return false + + await runEvolutionAnimation( + dependencies.frameCatalog, + from.sprite, + to.sprite, + viewportWidth, + async (artwork) => dependencies.onArtwork(artwork), + ) + return true +} diff --git a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts index 88e87da..4725b55 100644 --- a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts +++ b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts @@ -1,5 +1,6 @@ import * as vscode from "vscode" +import type { UsageEvolutionTransition } from "@sbugallo/vpet-core/application/models/usage.ts" import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" @@ -9,6 +10,7 @@ import type { EvolutionBattleRepository } from "@sbugallo/vpet-core/application/ import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" import { renderPositionedArtwork } from "./animated-artwork.ts" import { runEvolutionBattleSession } from "./evolution-battle-session.ts" +import { runEvolutionRevealSession } from "./evolution-reveal-session.ts" import { MonsterAnimationController, type MonsterAnimationOutput } from "./monster-animation.ts" import { buildSidebarWebviewHtml, @@ -28,9 +30,10 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { private cachedArtwork = "" private artworkWidth = DEFAULT_ARTWORK_WIDTH private visualInterval?: ReturnType - private battleInProgress = false + private presentationInProgress = false private refreshInFlight = false private pendingRefresh = false + private pendingEvolutionReveal: UsageEvolutionTransition | undefined private readonly animation = new MonsterAnimationController(MONSTER_FRAME_CATALOG, Math.random, () => performance.now(), ) @@ -41,8 +44,12 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { private readonly battleRepository: EvolutionBattleRepository, ) {} - isBattleInProgress(): boolean { - return this.battleInProgress + isPresentationInProgress(): boolean { + return this.presentationInProgress + } + + queueEvolutionReveal(evolution: UsageEvolutionTransition): void { + this.pendingEvolutionReveal = evolution } resolveWebviewView(webviewView: vscode.WebviewView): void { @@ -102,6 +109,7 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { do { this.pendingRefresh = false await this.resolvePendingBattleIfNeeded() + await this.playPendingEvolutionReveal() if (this.view === undefined) return await this.publishSidebarModel() } while (this.pendingRefresh) @@ -126,20 +134,20 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { this.cachedPayload = payload await this.view.webview.postMessage(payload) - if (this.battleInProgress) return + if (this.presentationInProgress) return this.syncAnimationPartner(model) await this.postAnimationFrame() } private async resolvePendingBattleIfNeeded(): Promise { - if (this.battleInProgress) return + if (this.presentationInProgress) return const snapshot = this.snapshotReader.getSidebarSnapshot() if (snapshot === null) return if (snapshot.pendingEvolutionTargetId === null || snapshot.battleOpponentNodeId === null) return - this.battleInProgress = true + this.presentationInProgress = true this.stopVisualInterval() this.cachedArtwork = "" @@ -151,6 +159,7 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { onArtwork: async (artwork) => this.postArtwork(artwork), onResolved: async (result) => { if (result.kind === "won") { + this.pendingEvolutionReveal = undefined void vscode.window.showInformationMessage("Victory! Your partner evolved!") } else if (result.kind === "lost") { void vscode.window.showInformationMessage("Defeat! You lost all tokens for this stage.") @@ -158,7 +167,31 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { }, }) } finally { - this.battleInProgress = false + this.presentationInProgress = false + if (this.view?.visible) this.startVisualInterval() + } + } + + private async playPendingEvolutionReveal(): Promise { + const evolution = this.pendingEvolutionReveal + if (evolution === undefined || this.presentationInProgress) return + + this.pendingEvolutionReveal = undefined + this.presentationInProgress = true + this.stopVisualInterval() + this.cachedArtwork = "" + + try { + const revealed = await runEvolutionRevealSession(evolution, this.artworkWidth, { + frameCatalog: MONSTER_FRAME_CATALOG, + digimonCatalog: DIGIMON_CATALOG, + onArtwork: async (artwork) => this.postArtwork(artwork), + }) + if (revealed) { + void vscode.window.showInformationMessage("Your partner evolved!") + } + } finally { + this.presentationInProgress = false if (this.view?.visible) this.startVisualInterval() } } @@ -182,7 +215,7 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { private startVisualInterval(): void { if (this.visualInterval !== undefined) return this.visualInterval = setInterval(() => { - if (this.view === undefined || !this.view.visible || this.battleInProgress) return + if (this.view === undefined || !this.view.visible || this.presentationInProgress) return const nextAnimation = this.animation.dispatch({ kind: "tick" }) void this.postAnimationFrame(nextAnimation) }, VISUAL_INTERVAL_MS) @@ -195,7 +228,7 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { } private async postAnimationFrame(animation?: MonsterAnimationOutput): Promise { - if (this.view === undefined || this.battleInProgress) return + if (this.view === undefined || this.presentationInProgress) return const output = animation ?? this.animation.output() const artwork = renderPositionedArtwork(output, this.artworkWidth) if (artwork === this.cachedArtwork) return diff --git a/packages/cursor-vpet/tests/evolution-reveal-session.test.ts b/packages/cursor-vpet/tests/evolution-reveal-session.test.ts new file mode 100644 index 0000000..65271e8 --- /dev/null +++ b/packages/cursor-vpet/tests/evolution-reveal-session.test.ts @@ -0,0 +1,43 @@ +import { describe, expect, test } from "bun:test" + +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { runEvolutionRevealSession } from "../src/webview/evolution-reveal-session.ts" + +describe("evolution reveal session", () => { + test("Given a valid evolution transition When running the session Then it renders evolution artwork", async () => { + const frames: string[] = [] + const revealed = await runEvolutionRevealSession( + { fromNodeId: "0-001", toNodeId: "1-001" }, + 80, + { + frameCatalog: MONSTER_FRAME_CATALOG, + digimonCatalog: DIGIMON_CATALOG, + onArtwork: async (artwork) => { + frames.push(artwork) + }, + }, + ) + + expect(revealed).toBeTrue() + expect(frames.length).toBeGreaterThan(0) + }) + + test("Given an unknown node When running the session Then it is a no-op", async () => { + const frames: string[] = [] + const revealed = await runEvolutionRevealSession( + { fromNodeId: "missing", toNodeId: "1-001" }, + 80, + { + frameCatalog: MONSTER_FRAME_CATALOG, + digimonCatalog: DIGIMON_CATALOG, + onArtwork: async (artwork) => { + frames.push(artwork) + }, + }, + ) + + expect(revealed).toBeFalse() + expect(frames).toEqual([]) + }) +}) diff --git a/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts b/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts index e90f0ef..a6b0cb0 100644 --- a/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts +++ b/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts @@ -101,22 +101,37 @@ describe("sql.js vpet repository persistence", () => { test("Given a resolved evolution battle When reading through the repository snapshot Then pending battle fields are cleared", async () => { if (tempRoot === undefined) throw new Error("Missing temp root.") + const battleThresholds = Object.freeze({ ...STAGE_GAUGE_THRESHOLDS, 0: 1, 1: 1 }) const repository = await createSqliteVpetRepository({ appDataRoot: tempRoot.appDataRoot }) try { spawnPartner(repository, "2026-09-09T12:00:00.000Z") + recordUsage({ + usage: { + receiptKey: "receipt-hatch", + eventId: "event-hatch", + tokenDelta: 1, + cost: null, + createdAt: "2026-09-09T12:01:00.000Z", + }, + ledger: repository, + digimonById: DIGIMON_CATALOG.byId, + catalogNodes: DIGIMON_CATALOG.nodes, + selector: () => 0, + thresholds: battleThresholds, + }) recordUsage({ usage: { receiptKey: "receipt-threshold", eventId: "event-threshold", - tokenDelta: STAGE_GAUGE_THRESHOLDS[0], + tokenDelta: 1, cost: null, - createdAt: "2026-09-09T12:01:00.000Z", + createdAt: "2026-09-09T12:01:30.000Z", }, ledger: repository, digimonById: DIGIMON_CATALOG.byId, catalogNodes: DIGIMON_CATALOG.nodes, selector: () => 0, - thresholds: STAGE_GAUGE_THRESHOLDS, + thresholds: battleThresholds, }) const pending = repository.getSidebarSnapshot() diff --git a/packages/opencode-vpet/build/vpet-core-src/domain/evolution.ts b/packages/opencode-vpet/build/vpet-core-src/domain/evolution.ts index 0116405..f8899d1 100644 --- a/packages/opencode-vpet/build/vpet-core-src/domain/evolution.ts +++ b/packages/opencode-vpet/build/vpet-core-src/domain/evolution.ts @@ -68,6 +68,16 @@ export const applyTokenProgress = ( throw new Error(`Evolution target ${pendingEvolutionTargetId} is missing from the catalog`) } + if (state.current.stage === 0) { + return { + current: target, + gauge: 0, + isTerminal: target.nextEvolutions.length === 0, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + } + } + const battleOpponentNodeId = pickRandomSameStageOpponent(state.current, catalogNodes, selector) if (digimonById.get(battleOpponentNodeId) === undefined) { throw new Error(`Battle opponent ${battleOpponentNodeId} is missing from the catalog`) diff --git a/packages/opencode-vpet/src/tui.tsx b/packages/opencode-vpet/src/tui.tsx index e5fb071..65ce3c4 100644 --- a/packages/opencode-vpet/src/tui.tsx +++ b/packages/opencode-vpet/src/tui.tsx @@ -22,6 +22,7 @@ import { DEFAULT_BATTLE_ARTWORK_WIDTH, runEvolutionBattleSession, } from "./tui/evolution-battle-session.ts" +import { runEvolutionRevealSession } from "./tui/evolution-reveal-session.ts" import { MonsterAnimationController, type MonsterAnimationOutput } from "./tui/monster-animation.ts" import { createSidebarPollLoop } from "./tui/sidebar-poll-loop.ts" import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" @@ -109,6 +110,7 @@ export const createTui = ) let disposed = false let battleInProgress = false + let lastPresentedNodeId: string | undefined let artworkWidth = DEFAULT_BATTLE_ARTWORK_WIDTH const notifyEvent = async (event: VpetToastEvent): Promise => { if (scheduling.notify === undefined) return @@ -150,6 +152,7 @@ export const createTui = if (battled) { setCustomArtwork(undefined) const nextInputs = await Promise.resolve().then(() => loadInputs()) + if (nextInputs.kind === "partner") lastPresentedNodeId = nextInputs.node.id setInputs(nextInputs) syncAnimation(nextInputs) api.renderer.requestRender() @@ -160,6 +163,38 @@ export const createTui = setCustomArtwork(undefined) } } + const tryPlayEvolutionReveal = async (nextInputs: SidebarCardInputs): Promise => { + if (disposed || battleInProgress) return false + if (nextInputs.kind !== "partner" || nextInputs.evolutionBattlePending) return false + if (lastPresentedNodeId === undefined) { + lastPresentedNodeId = nextInputs.node.id + return false + } + if (lastPresentedNodeId === nextInputs.node.id) return false + + const evolution = { fromNodeId: lastPresentedNodeId, toNodeId: nextInputs.node.id } + battleInProgress = true + try { + const revealed = await runEvolutionRevealSession(evolution, artworkWidth, { + frameCatalog: MONSTER_FRAME_CATALOG, + digimonCatalog: DIGIMON_CATALOG, + onArtwork: async (artwork) => { + setCustomArtwork(artwork) + api.renderer.requestRender() + }, + }) + if (!revealed) return false + lastPresentedNodeId = nextInputs.node.id + setCustomArtwork(undefined) + setInputs(nextInputs) + syncAnimation(nextInputs) + api.renderer.requestRender() + return true + } finally { + battleInProgress = false + setCustomArtwork(undefined) + } + } const publish = (nextAnimation: MonsterAnimationOutput): boolean => { if (sameAnimation(animation(), nextAnimation)) return false setAnimation(nextAnimation) @@ -187,7 +222,13 @@ export const createTui = poller.refresh() return } + if (await tryPlayEvolutionReveal(nextInputs)) { + if (disposed) return + poller.refresh() + return + } if (disposed || battleInProgress) return + if (nextInputs.kind === "partner") lastPresentedNodeId = nextInputs.node.id setInputs(nextInputs) syncAnimation(nextInputs) api.renderer.requestRender() diff --git a/packages/opencode-vpet/src/tui/evolution-battle-session.ts b/packages/opencode-vpet/src/tui/evolution-battle-session.ts index a07fb92..5c9c411 100644 --- a/packages/opencode-vpet/src/tui/evolution-battle-session.ts +++ b/packages/opencode-vpet/src/tui/evolution-battle-session.ts @@ -8,8 +8,8 @@ import type { DigimonCatalog } from "@sbugallo/vpet-core/data/catalog.ts" import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { runDefeatAnimation } from "./defeat-artwork.ts" -import { runEvolutionAnimation } from "./evolution-artwork.ts" import { runEvolutionBattleAnimation, type EvolutionBattleOutcome } from "./evolution-battle-artwork.ts" +import { runEvolutionRevealSession } from "./evolution-reveal-session.ts" export const DEFAULT_BATTLE_ARTWORK_WIDTH = 80 @@ -48,16 +48,15 @@ export const runEvolutionBattleSession = async ( ) if (outcome === "player") { - const target = dependencies.digimonCatalog.byId.get(snapshot.pendingEvolutionTargetId) - if (target !== undefined) { - await runEvolutionAnimation( - dependencies.frameCatalog, - player.sprite, - target.sprite, - viewportWidth, - postArtwork, - ) - } + await runEvolutionRevealSession( + { fromNodeId: snapshot.currentNodeId, toNodeId: snapshot.pendingEvolutionTargetId }, + viewportWidth, + { + frameCatalog: dependencies.frameCatalog, + digimonCatalog: dependencies.digimonCatalog, + onArtwork: postArtwork, + }, + ) } else { await runDefeatAnimation(dependencies.frameCatalog, player.sprite, viewportWidth, postArtwork) } diff --git a/packages/opencode-vpet/src/tui/evolution-reveal-session.ts b/packages/opencode-vpet/src/tui/evolution-reveal-session.ts new file mode 100644 index 0000000..3632b90 --- /dev/null +++ b/packages/opencode-vpet/src/tui/evolution-reveal-session.ts @@ -0,0 +1,30 @@ +import type { UsageEvolutionTransition } from "@sbugallo/vpet-core/application/models/usage.ts" +import type { DigimonCatalog } from "@sbugallo/vpet-core/data/catalog.ts" +import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + +import { runEvolutionAnimation } from "./evolution-artwork.ts" + +export type EvolutionRevealSessionDependencies = { + readonly frameCatalog: MonsterFrameCatalog + readonly digimonCatalog: DigimonCatalog + readonly onArtwork: (artwork: string) => Promise +} + +export const runEvolutionRevealSession = async ( + evolution: UsageEvolutionTransition, + viewportWidth: number, + dependencies: EvolutionRevealSessionDependencies, +): Promise => { + const from = dependencies.digimonCatalog.byId.get(evolution.fromNodeId) + const to = dependencies.digimonCatalog.byId.get(evolution.toNodeId) + if (from === undefined || to === undefined) return false + + await runEvolutionAnimation( + dependencies.frameCatalog, + from.sprite, + to.sprite, + viewportWidth, + async (artwork) => dependencies.onArtwork(artwork), + ) + return true +} diff --git a/packages/opencode-vpet/tests/catalog-evolution.test.ts b/packages/opencode-vpet/tests/catalog-evolution.test.ts index 01a8730..58405ac 100644 --- a/packages/opencode-vpet/tests/catalog-evolution.test.ts +++ b/packages/opencode-vpet/tests/catalog-evolution.test.ts @@ -171,8 +171,8 @@ describe("catalog and evolution", () => { expect(evolved.pendingEvolutionTargetId).toBeNull() }) - test("Given a controlled immutable lookup When token progress reaches a threshold Then it opens a pending evolution battle", () => { - const pending = applyTokenProgress( + test("Given a Digitama threshold crossing When token progress applies Then it evolves immediately without a battle", () => { + const evolved = applyTokenProgress( { current: controlledCurrent, gauge: 4_999_999, isTerminal: false, ...noBattle }, 1, () => 0, @@ -181,15 +181,7 @@ describe("catalog and evolution", () => { STAGE_GAUGE_THRESHOLDS, ) - expect(pending).toEqual({ - current: controlledCurrent, - gauge: STAGE_GAUGE_THRESHOLDS[0], - isTerminal: false, - pendingEvolutionTargetId: "controlled-target", - battleOpponentNodeId: "controlled-opponent", - }) - - expect(resolveEvolutionBattle(pending, true, controlledLookup)).toEqual({ + expect(evolved).toEqual({ current: controlledTarget, gauge: 0, isTerminal: true, @@ -211,22 +203,22 @@ describe("catalog and evolution", () => { ).toThrow("Evolution target controlled-target is missing from the catalog") }) - test("Given a custom child threshold When token progress reaches it Then evolution crosses at the supplied policy boundary", () => { + test("Given a custom Digitama threshold When token progress reaches it Then evolution crosses at the supplied policy boundary", () => { const thresholds: StageThresholds = Object.freeze({ ...STAGE_GAUGE_THRESHOLDS, 0: 1, }) - const pending = applyTokenProgress( - { current: controlledCurrent, gauge: 0, isTerminal: false, ...noBattle }, - 1, - () => 0, - controlledLookup, - controlledCatalogNodes, - thresholds, - ) - - expect(resolveEvolutionBattle(pending, true, controlledLookup)).toEqual({ + expect( + applyTokenProgress( + { current: controlledCurrent, gauge: 0, isTerminal: false, ...noBattle }, + 1, + () => 0, + controlledLookup, + controlledCatalogNodes, + thresholds, + ), + ).toEqual({ current: controlledTarget, gauge: 0, isTerminal: true, @@ -353,18 +345,23 @@ describe("catalog and evolution", () => { ).toEqual({ current: controlledCurrent, gauge: 1, isTerminal: false, ...noBattle }) }) - test("Given a lost evolution battle When resolving Then gauge resets for the current stage", () => { + test("Given a lost evolution battle When resolving Then gauge resets for the current stage", async () => { + const catalog = await loadDigimonCatalog() + const andromon = catalog.byId.get("5-003") + + if (andromon === undefined) throw new Error("Expected Andromon in catalog") + const pending = applyTokenProgress( - { current: controlledCurrent, gauge: 4_999_999, isTerminal: false, ...noBattle }, + { current: andromon, gauge: 124_999_999, isTerminal: false, ...noBattle }, 1, - () => 0, - controlledLookup, - controlledCatalogNodes, + () => 0.5, + catalog.byId, + catalog.nodes, STAGE_GAUGE_THRESHOLDS, ) - expect(resolveEvolutionBattle(pending, false, controlledLookup)).toEqual({ - current: controlledCurrent, + expect(resolveEvolutionBattle(pending, false, catalog.byId)).toEqual({ + current: andromon, gauge: 0, isTerminal: false, pendingEvolutionTargetId: null, diff --git a/packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts b/packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts index 200383f..87158f5 100644 --- a/packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts +++ b/packages/opencode-vpet/tests/persistence/sqlite-usage-event-toast.persistence.test.ts @@ -72,13 +72,13 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => await dispatch(createHooks(repository, delivered), directEvent("direct-only")) expect(delivered).toEqual([ - expect.objectContaining({ title: "Evolution battle", variant: "info", duration: 5_000 }), + expect.objectContaining({ title: "Digi-evolution", variant: "success", duration: 5_000 }), ]) expect(repository.getActivePartner()).toEqual( expect.objectContaining({ - currentNodeId: "0-001", - pendingEvolutionTargetId: "1-001", - battleOpponentNodeId: expect.any(String), + currentNodeId: "1-001", + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, }), ) expect(repository.listUsageReceipts().map((receipt) => receipt.receiptKey)).toEqual(["message:direct-only"]) @@ -99,9 +99,9 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => expect(delivered).toHaveLength(1) expect(repository.getActivePartner()).toEqual( expect.objectContaining({ - currentNodeId: "0-001", - pendingEvolutionTargetId: "1-001", - battleOpponentNodeId: expect.any(String), + currentNodeId: "1-001", + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, }), ) expect(repository.listUsageReceipts().map((receipt) => receipt.receiptKey)).toEqual(["message:idle-only"]) @@ -226,7 +226,7 @@ describe.if(isBunSqliteAvailable)("sqlite usage event toast persistence", () => idleEvent, ) - expect(delivered.map((payload) => payload.title)).toEqual(["Evolution battle"]) + expect(delivered.map((payload) => payload.title)).toEqual(["Digi-evolution", "Evolution battle"]) expect(repository.listUsageReceipts().map((receipt) => receipt.receiptKey)).toEqual([ "message:ordered-first", "message:ordered-second", diff --git a/packages/opencode-vpet/tests/record-usage.test.ts b/packages/opencode-vpet/tests/record-usage.test.ts index 89d5e15..7423195 100644 --- a/packages/opencode-vpet/tests/record-usage.test.ts +++ b/packages/opencode-vpet/tests/record-usage.test.ts @@ -73,7 +73,7 @@ const createLedger = (outcome: "applied" | "duplicate" | "no_active_partner", pa } describe("record usage application use case", () => { - test("Given completed usage and an active partner When recording it Then the ledger opens a pending evolution battle", () => { + test("Given completed usage and an active Digitama When recording it Then the ledger evolves immediately", () => { const ledger = createLedger("applied") const outcome = recordUsage({ @@ -91,19 +91,16 @@ describe("record usage application use case", () => { expect(outcome).toEqual({ kind: "applied", receiptKey: "receipt-1", - evolutionBattlePending: { - opponentNodeId: currentNode.id, - targetNodeId: targetNode.id, - }, + evolution: { fromNodeId: currentNode.id, toNodeId: targetNode.id }, }) expect(ledger.receipts).toEqual([usage("receipt-1")]) expect(ledger.evolutions).toEqual([ { - currentNodeId: currentNode.id, - gauge: STAGE_GAUGE_THRESHOLDS[0], - isTerminal: false, - pendingEvolutionTargetId: targetNode.id, - battleOpponentNodeId: currentNode.id, + currentNodeId: targetNode.id, + gauge: 0, + isTerminal: true, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, }, ]) }) @@ -305,7 +302,7 @@ describe("record usage application use case", () => { ).toThrow(writeFailure) }) - test("Given a custom child threshold When recording usage Then the ledger opens a pending evolution battle", () => { + test("Given a custom Digitama threshold When recording usage Then the ledger evolves immediately", () => { const thresholds: StageThresholds = Object.freeze({ ...STAGE_GAUGE_THRESHOLDS, 0: 1, @@ -327,18 +324,15 @@ describe("record usage application use case", () => { expect(outcome).toEqual({ kind: "applied", receiptKey: "receipt-custom-threshold", - evolutionBattlePending: { - opponentNodeId: currentNode.id, - targetNodeId: targetNode.id, - }, + evolution: { fromNodeId: currentNode.id, toNodeId: targetNode.id }, }) expect(ledger.evolutions).toEqual([ { - currentNodeId: currentNode.id, - gauge: 1, - isTerminal: false, - pendingEvolutionTargetId: targetNode.id, - battleOpponentNodeId: currentNode.id, + currentNodeId: targetNode.id, + gauge: 0, + isTerminal: true, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, }, ]) }) diff --git a/packages/opencode-vpet/tests/server-hooks-lifecycle.test.ts b/packages/opencode-vpet/tests/server-hooks-lifecycle.test.ts index 9d31246..ad61ef5 100644 --- a/packages/opencode-vpet/tests/server-hooks-lifecycle.test.ts +++ b/packages/opencode-vpet/tests/server-hooks-lifecycle.test.ts @@ -253,21 +253,21 @@ describe("server hook lifecycle", () => { expect(delivered).toEqual([ { - title: "Evolution battle", - message: "Battle against Digitama! Win to evolve.", - variant: "info", + title: "Digi-evolution", + message: "Digitama evolved into Koromon!", + variant: "success", duration: 5_000, }, { - title: "Evolution battle", - message: "Battle against Digitama! Win to evolve.", - variant: "info", + title: "Digi-evolution", + message: "Digitama evolved into Koromon!", + variant: "success", duration: 5_000, }, { - title: "Evolution battle", - message: "Battle against Digitama! Win to evolve.", - variant: "info", + title: "Digi-evolution", + message: "Digitama evolved into Koromon!", + variant: "success", duration: 5_000, }, ]) diff --git a/packages/vpet-core/src/domain/evolution.ts b/packages/vpet-core/src/domain/evolution.ts index 0116405..f8899d1 100644 --- a/packages/vpet-core/src/domain/evolution.ts +++ b/packages/vpet-core/src/domain/evolution.ts @@ -68,6 +68,16 @@ export const applyTokenProgress = ( throw new Error(`Evolution target ${pendingEvolutionTargetId} is missing from the catalog`) } + if (state.current.stage === 0) { + return { + current: target, + gauge: 0, + isTerminal: target.nextEvolutions.length === 0, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + } + } + const battleOpponentNodeId = pickRandomSameStageOpponent(state.current, catalogNodes, selector) if (digimonById.get(battleOpponentNodeId) === undefined) { throw new Error(`Battle opponent ${battleOpponentNodeId} is missing from the catalog`) From 64e843356da993573dabf85dacd45333f651ad81 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 19:40:05 +0900 Subject: [PATCH 15/41] refactor(cursor-vpet): add shared utilities and sqlite foundations Centralize pure helpers (sleep, random, assertNever, async refresh queue), deduplicate SQLite options/errors, import CompletedUsage from vpet-core, and remove unused sqljs-runtime. Co-authored-by: Cursor --- .../adapters/cursor/cursor-api-watermark.ts | 6 ++--- .../src/adapters/cursor/cursor-stop-mapper.ts | 3 ++- .../cursor/cursor-usage-event-source.ts | 3 ++- .../cursor-vpet/src/adapters/cursor/types.ts | 8 +----- .../cursor-vpet/src/adapters/sqlite/errors.ts | 3 +++ .../src/adapters/sqlite/options.ts | 8 ++++++ .../sqlite/sqlite-sidebar-snapshot-reader.ts | 13 ++++----- .../sqlite/sqlite-vpet-archive-reader.ts | 13 ++++----- .../sqlite/sqlite-vpet-write-store.ts | 9 ++++--- .../src/adapters/sqlite/sqljs-runtime.ts | 15 ----------- .../cursor-vpet/src/shared/assert-never.ts | 3 +++ .../src/shared/async-refresh-queue.ts | 27 +++++++++++++++++++ packages/cursor-vpet/src/shared/random.ts | 6 +++++ packages/cursor-vpet/src/shared/sleep.ts | 4 +++ .../cursor-vpet/src/webview/defeat-artwork.ts | 6 +---- .../src/webview/evolution-artwork.ts | 6 +---- .../src/webview/evolution-battle-artwork.ts | 6 +---- .../src/webview/monster-action-policy.ts | 6 +---- .../src/webview/monster-animation.ts | 5 +--- .../src/webview/monster-walking-policy.ts | 12 ++------- 20 files changed, 81 insertions(+), 81 deletions(-) create mode 100644 packages/cursor-vpet/src/adapters/sqlite/errors.ts create mode 100644 packages/cursor-vpet/src/adapters/sqlite/options.ts delete mode 100644 packages/cursor-vpet/src/adapters/sqlite/sqljs-runtime.ts create mode 100644 packages/cursor-vpet/src/shared/assert-never.ts create mode 100644 packages/cursor-vpet/src/shared/async-refresh-queue.ts create mode 100644 packages/cursor-vpet/src/shared/random.ts create mode 100644 packages/cursor-vpet/src/shared/sleep.ts diff --git a/packages/cursor-vpet/src/adapters/cursor/cursor-api-watermark.ts b/packages/cursor-vpet/src/adapters/cursor/cursor-api-watermark.ts index 00922bd..6c9161e 100644 --- a/packages/cursor-vpet/src/adapters/cursor/cursor-api-watermark.ts +++ b/packages/cursor-vpet/src/adapters/cursor/cursor-api-watermark.ts @@ -1,4 +1,6 @@ -import type { CompletedUsage, UsageApiEvent, UsageApiResponse, UsageWatermark } from "./types.ts" +import type { CompletedUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" +import { sleep } from "../../shared/sleep.ts" +import type { UsageApiEvent, UsageApiResponse, UsageWatermark } from "./types.ts" import { readCursorAccessToken } from "./cursor-auth.ts" const USAGE_EVENTS_URL = "https://cursor.com/api/dashboard/get-filtered-usage-events" @@ -106,8 +108,6 @@ export const fetchNewEventsSince = async ( return collected.sort((a, b) => Number(a.timestamp) - Number(b.timestamp)) } -const sleep = (ms: number): Promise => new Promise((resolve) => setTimeout(resolve, ms)) - export type SettleOptions = { readonly initialDelayMs: number readonly retryDelaysMs: readonly number[] diff --git a/packages/cursor-vpet/src/adapters/cursor/cursor-stop-mapper.ts b/packages/cursor-vpet/src/adapters/cursor/cursor-stop-mapper.ts index d852622..88d069e 100644 --- a/packages/cursor-vpet/src/adapters/cursor/cursor-stop-mapper.ts +++ b/packages/cursor-vpet/src/adapters/cursor/cursor-stop-mapper.ts @@ -1,4 +1,5 @@ -import type { CompletedUsage, CursorHookPayload } from "./types.ts" +import type { CompletedUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" +import type { CursorHookPayload } from "./types.ts" export const hasStopTokens = (payload: CursorHookPayload): boolean => { const input = payload.input_tokens ?? 0 diff --git a/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts b/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts index 96325d4..4f060c2 100644 --- a/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts +++ b/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts @@ -9,7 +9,8 @@ import { STAGE_GAUGE_THRESHOLDS } from "@sbugallo/vpet-core/domain/evolution.ts" import { captureWatermark, settleTurnDelta } from "./cursor-api-watermark.ts" import { hasStopTokens, toCompletedUsageFromStop } from "./cursor-stop-mapper.ts" import { resolveHookEventsPath } from "./paths.ts" -import type { CompletedUsage, HookEventRecord, UsageWatermark } from "./types.ts" +import type { CompletedUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" +import type { HookEventRecord, UsageWatermark } from "./types.ts" type TurnState = { watermark: UsageWatermark diff --git a/packages/cursor-vpet/src/adapters/cursor/types.ts b/packages/cursor-vpet/src/adapters/cursor/types.ts index 93330fa..6405d9b 100644 --- a/packages/cursor-vpet/src/adapters/cursor/types.ts +++ b/packages/cursor-vpet/src/adapters/cursor/types.ts @@ -1,10 +1,4 @@ -export type CompletedUsage = { - readonly receiptKey: string - readonly eventId: string - readonly tokenDelta: number - readonly cost?: number | null - readonly createdAt: string -} +export type { CompletedUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" export type UsageWatermark = { readonly timestampMs: number diff --git a/packages/cursor-vpet/src/adapters/sqlite/errors.ts b/packages/cursor-vpet/src/adapters/sqlite/errors.ts new file mode 100644 index 0000000..7726aa8 --- /dev/null +++ b/packages/cursor-vpet/src/adapters/sqlite/errors.ts @@ -0,0 +1,3 @@ +export const isRecoverableSqliteReadError = (error: unknown): boolean => + error instanceof Error && + (error.message.includes("sqlite") || error.message.includes("database") || error.message.includes("no such table")) diff --git a/packages/cursor-vpet/src/adapters/sqlite/options.ts b/packages/cursor-vpet/src/adapters/sqlite/options.ts new file mode 100644 index 0000000..b629bbc --- /dev/null +++ b/packages/cursor-vpet/src/adapters/sqlite/options.ts @@ -0,0 +1,8 @@ +import { resolveHostDatabasePath, type HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" + +export type SqliteDatabaseOptions = HostPathOptions & { + readonly databasePath?: string +} + +export const resolveDatabasePath = (options: SqliteDatabaseOptions = {}): string => + options.databasePath ?? resolveHostDatabasePath(options) diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts b/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts index aa66b1c..4e251cc 100644 --- a/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts +++ b/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts @@ -2,8 +2,9 @@ import { existsSync, readFileSync } from "node:fs" import type { SqlJsStatic } from "sql.js" import type { SidebarSnapshot, SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" -import { resolveHostDatabasePath, type HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" import type { SqliteExecutor } from "@sbugallo/vpet-core/ports/sqlite-executor.ts" +import { isRecoverableSqliteReadError } from "./errors.ts" +import { resolveDatabasePath, type SqliteDatabaseOptions } from "./options.ts" import { getSqlRuntime } from "./sqljs-config.ts" import { ACTIVE_PARTNER_SELECT, @@ -12,7 +13,7 @@ import { type TrainerStateRow, } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-schema.ts" -export type CreateSqliteSidebarSnapshotReaderOptions = HostPathOptions & { readonly databasePath?: string } +export type CreateSqliteSidebarSnapshotReaderOptions = SqliteDatabaseOptions const TRAINER_STATE_SELECT = "SELECT total_tokens FROM trainer_state WHERE trainer_id = 1" const CONTROL_STATE_SELECT = "SELECT frozen, cheat_node_id FROM vpet_control_state WHERE control_id = 1" @@ -22,10 +23,6 @@ type ControlStateRow = { readonly cheat_node_id: string | null } -const isRecoverableSqliteReadError = (error: unknown): boolean => - error instanceof Error && - (error.message.includes("sqlite") || error.message.includes("database") || error.message.includes("no such table")) - export const readSidebarSnapshotFromExecutor = (executor: Pick): SidebarSnapshot | null => { const trainer = executor.get(TRAINER_STATE_SELECT) const control = executor.get(CONTROL_STATE_SELECT) @@ -87,7 +84,7 @@ const readSidebarSnapshotWithRuntime = (SQL: SqlJsStatic, databasePath: string): export const createSqliteSidebarSnapshotReader = async ( options: CreateSqliteSidebarSnapshotReaderOptions = {}, ): Promise => { - const databasePath = options.databasePath ?? resolveHostDatabasePath(options) + const databasePath = resolveDatabasePath(options) const SQL = await getSqlRuntime() return { @@ -100,7 +97,7 @@ export const createSqliteSidebarSnapshotReader = async ( export const readSidebarSnapshot = async ( options: CreateSqliteSidebarSnapshotReaderOptions = {}, ): Promise => { - const databasePath = options.databasePath ?? resolveHostDatabasePath(options) + const databasePath = resolveDatabasePath(options) const SQL = await getSqlRuntime() return readSidebarSnapshotWithRuntime(SQL, databasePath) } diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts index 4dd4ff9..5159fd7 100644 --- a/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts +++ b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts @@ -7,7 +7,8 @@ import type { } from "@sbugallo/vpet-core/application/models/vpet-archive.ts" import type { VpetArchiveReader } from "@sbugallo/vpet-core/application/ports/vpet-archive.ts" import type { SqliteExecutor } from "@sbugallo/vpet-core/ports/sqlite-executor.ts" -import { resolveHostDatabasePath, type HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" +import { isRecoverableSqliteReadError } from "./errors.ts" +import { resolveDatabasePath, type SqliteDatabaseOptions } from "./options.ts" import { openReadonlySqlJsDatabase } from "./sqljs-driver.ts" import { ARCHIVE_PARTNER_EVENTS_SELECT, @@ -16,14 +17,10 @@ import { type PersistedPartnerRow, } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-schema.ts" -export type CreateSqliteVpetArchiveReaderOptions = HostPathOptions & { readonly databasePath?: string } +export type CreateSqliteVpetArchiveReaderOptions = SqliteDatabaseOptions const UNAVAILABLE_ARCHIVE_MESSAGE = "VPet archive is unavailable." -const isRecoverableSqliteReadError = (error: unknown): boolean => - error instanceof Error && - (error.message.includes("sqlite") || error.message.includes("database") || error.message.includes("no such table")) - const toArchiveEvent = (row: PersistedPartnerEventRow): VpetArchiveEvent => ({ eventId: row.event_id, currentNodeId: row.current_node_id, @@ -69,7 +66,7 @@ export const readSqliteVpetArchive = (executor: Pick): Vp export const createSqliteVpetArchiveReader = async ( options: CreateSqliteVpetArchiveReaderOptions = {}, ): Promise => { - const databasePath = options.databasePath ?? resolveHostDatabasePath(options) + const databasePath = resolveDatabasePath(options) if (!existsSync(databasePath)) { return { getArchive: () => ({ kind: "empty" }) } } @@ -88,7 +85,7 @@ export const createSqliteVpetArchiveReader = async ( } export const readArchive = async (options: CreateSqliteVpetArchiveReaderOptions = {}): Promise => { - const databasePath = options.databasePath ?? resolveHostDatabasePath(options) + const databasePath = resolveDatabasePath(options) if (!existsSync(databasePath)) return { kind: "empty" } try { diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts index 49520bc..4310766 100644 --- a/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts +++ b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts @@ -1,13 +1,14 @@ import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" import type { SqliteVpetWriteStore } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-types.ts" -import { resolveHostDatabasePath, type HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" import { createSqliteVpetWriteStore } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-write-store.ts" +import { resolveDatabasePath, type SqliteDatabaseOptions } from "./options.ts" import { readSidebarSnapshotFromExecutor } from "./sqlite-sidebar-snapshot-reader.ts" import { openWritableSqlJsDatabase } from "./sqljs-driver.ts" -export type CreateSqliteVpetRepositoryOptions = HostPathOptions & { readonly databasePath?: string } +export type CreateSqliteVpetRepositoryOptions = SqliteDatabaseOptions -export { resolveHostDatabasePath } +export { resolveHostDatabasePath } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" +export { resolveDatabasePath } from "./options.ts" export type { HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" export type { PersistedPartnerEvent, @@ -22,7 +23,7 @@ export type CursorSqliteVpetRepository = SqliteVpetWriteStore & export const createSqliteVpetRepository = async ( options: CreateSqliteVpetRepositoryOptions = {}, ): Promise => { - const databasePath = options.databasePath ?? resolveHostDatabasePath(options) + const databasePath = resolveDatabasePath(options) const database = await openWritableSqlJsDatabase(databasePath) const writeStore = createSqliteVpetWriteStore({ diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqljs-runtime.ts b/packages/cursor-vpet/src/adapters/sqlite/sqljs-runtime.ts deleted file mode 100644 index ba4b4b7..0000000 --- a/packages/cursor-vpet/src/adapters/sqlite/sqljs-runtime.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { readFileSync } from "node:fs" -import type { Database } from "sql.js" - -import { getSqlRuntime } from "./sqljs-config.ts" - -export { configureSqlJsWasmPath } from "./sqljs-config.ts" - -export const openDatabaseFromPath = async (databasePath: string): Promise => { - const SQL = await getSqlRuntime() - try { - return new SQL.Database(readFileSync(databasePath)) - } catch { - return new SQL.Database() - } -} diff --git a/packages/cursor-vpet/src/shared/assert-never.ts b/packages/cursor-vpet/src/shared/assert-never.ts new file mode 100644 index 0000000..1e92484 --- /dev/null +++ b/packages/cursor-vpet/src/shared/assert-never.ts @@ -0,0 +1,3 @@ +export const assertNever = (value: never): never => { + throw new Error(`Unexpected variant: ${JSON.stringify(value)}`) +} diff --git a/packages/cursor-vpet/src/shared/async-refresh-queue.ts b/packages/cursor-vpet/src/shared/async-refresh-queue.ts new file mode 100644 index 0000000..1800f64 --- /dev/null +++ b/packages/cursor-vpet/src/shared/async-refresh-queue.ts @@ -0,0 +1,27 @@ +export type AsyncRefreshQueue = { + run(task: () => Promise): Promise +} + +export const createAsyncRefreshQueue = (): AsyncRefreshQueue => { + let inFlight = false + let pending = false + + const run = async (task: () => Promise): Promise => { + if (inFlight) { + pending = true + return + } + + inFlight = true + try { + do { + pending = false + await task() + } while (pending) + } finally { + inFlight = false + } + } + + return { run } +} diff --git a/packages/cursor-vpet/src/shared/random.ts b/packages/cursor-vpet/src/shared/random.ts new file mode 100644 index 0000000..16dee68 --- /dev/null +++ b/packages/cursor-vpet/src/shared/random.ts @@ -0,0 +1,6 @@ +/** Returns value in [0, 1) safe for index selection. */ +export const normalizedRandom = (random: () => number): number => { + const sample = random() + if (!Number.isFinite(sample) || sample <= 0) return 0 + return sample >= 1 ? 1 - Number.EPSILON : sample +} diff --git a/packages/cursor-vpet/src/shared/sleep.ts b/packages/cursor-vpet/src/shared/sleep.ts new file mode 100644 index 0000000..3df1811 --- /dev/null +++ b/packages/cursor-vpet/src/shared/sleep.ts @@ -0,0 +1,4 @@ +export const sleep = (ms: number): Promise => + new Promise((resolve) => { + setTimeout(resolve, ms) + }) diff --git a/packages/cursor-vpet/src/webview/defeat-artwork.ts b/packages/cursor-vpet/src/webview/defeat-artwork.ts index 9ae1f75..ec0a321 100644 --- a/packages/cursor-vpet/src/webview/defeat-artwork.ts +++ b/packages/cursor-vpet/src/webview/defeat-artwork.ts @@ -1,5 +1,6 @@ import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { sleep } from "../shared/sleep.ts" const FRAME_ROWS = 8 const FRAME_COLUMNS = 16 @@ -45,11 +46,6 @@ export const renderDefeatArtwork = ( return centerArtwork(spriteRows, viewportWidth) } -export const sleep = (ms: number): Promise => - new Promise((resolve) => { - setTimeout(resolve, ms) - }) - export const runDefeatAnimation = async ( catalog: MonsterFrameCatalog, sprite: string, diff --git a/packages/cursor-vpet/src/webview/evolution-artwork.ts b/packages/cursor-vpet/src/webview/evolution-artwork.ts index e03f034..82dd26d 100644 --- a/packages/cursor-vpet/src/webview/evolution-artwork.ts +++ b/packages/cursor-vpet/src/webview/evolution-artwork.ts @@ -1,4 +1,5 @@ import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { sleep } from "../shared/sleep.ts" import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" const FRAME_ROWS = 8 @@ -94,11 +95,6 @@ export const renderEvolutionArtwork = ( return centerArtwork(spriteRows, viewportWidth) } -export const sleep = (ms: number): Promise => - new Promise((resolve) => { - setTimeout(resolve, ms) - }) - const animatePhase = async ( catalog: MonsterFrameCatalog, fromSprite: string, diff --git a/packages/cursor-vpet/src/webview/evolution-battle-artwork.ts b/packages/cursor-vpet/src/webview/evolution-battle-artwork.ts index 7bc7bd0..cd6968c 100644 --- a/packages/cursor-vpet/src/webview/evolution-battle-artwork.ts +++ b/packages/cursor-vpet/src/webview/evolution-battle-artwork.ts @@ -1,5 +1,6 @@ import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { sleep } from "../shared/sleep.ts" import { mirrorMonsterFrame } from "./monster-artwork-mirror.ts" const FRAME_ROWS = 8 @@ -293,11 +294,6 @@ export const renderEvolutionBattleArtwork = ( return rows.map((row) => `${" ".repeat(padding)}${row}`).join("\n") } -export const sleep = (ms: number): Promise => - new Promise((resolve) => { - setTimeout(resolve, ms) - }) - const postScene = async ( catalog: MonsterFrameCatalog, playerSprite: string, diff --git a/packages/cursor-vpet/src/webview/monster-action-policy.ts b/packages/cursor-vpet/src/webview/monster-action-policy.ts index 019b3d6..7fe2a97 100644 --- a/packages/cursor-vpet/src/webview/monster-action-policy.ts +++ b/packages/cursor-vpet/src/webview/monster-action-policy.ts @@ -1,4 +1,5 @@ import type { MonsterFrameCatalog, MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { normalizedRandom } from "../shared/random.ts" export type CosmeticActionClip = readonly [MonsterFrameName, MonsterFrameName] export type SleepClip = readonly [MonsterFrameName, MonsterFrameName] @@ -39,8 +40,3 @@ export const resolveSleepClip = ( return [fallback, fallback] } -const normalizedRandom = (random: () => number): number => { - const sample = random() - if (!Number.isFinite(sample) || sample <= 0) return 0 - return sample >= 1 ? 1 - Number.EPSILON : sample -} diff --git a/packages/cursor-vpet/src/webview/monster-animation.ts b/packages/cursor-vpet/src/webview/monster-animation.ts index 2afec5b..1fbbece 100644 --- a/packages/cursor-vpet/src/webview/monster-animation.ts +++ b/packages/cursor-vpet/src/webview/monster-animation.ts @@ -3,6 +3,7 @@ import type { MonsterFrameCatalog, MonsterFrameName, } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { assertNever } from "../shared/assert-never.ts" import { resolveCosmeticActions, resolveSleepClip, @@ -96,10 +97,6 @@ type MonsterAnimationState = BlankState | UnavailableState | DigitamaState | Wal const ORIGIN = { offset: 0, facing: "left" } as const const SLEEP_AFTER_MS = 300_000 -const assertNever = (value: never): never => { - throw new Error(`Unexpected monster animation variant: ${JSON.stringify(value)}`) -} - const sameIdentity = (left: MonsterAnimationIdentity, right: MonsterAnimationIdentity): boolean => left.sprite === right.sprite && left.isDigitama === right.isDigitama diff --git a/packages/cursor-vpet/src/webview/monster-walking-policy.ts b/packages/cursor-vpet/src/webview/monster-walking-policy.ts index 192401c..5ba8a16 100644 --- a/packages/cursor-vpet/src/webview/monster-walking-policy.ts +++ b/packages/cursor-vpet/src/webview/monster-walking-policy.ts @@ -1,4 +1,6 @@ import type { MonsterFrameCatalog, MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { assertNever } from "../shared/assert-never.ts" +import { normalizedRandom } from "../shared/random.ts" export type WalkingFacing = "left" | "right" export type WalkFrame = "walk_1" | "walk_2" @@ -28,10 +30,6 @@ export type WalkingPolicyTick = | { readonly kind: "walking"; readonly walking: WalkingPolicyState } | { readonly kind: "action"; readonly action: ActionBoundaryState } -const assertNever = (value: never): never => { - throw new Error(`Unexpected walking policy variant: ${JSON.stringify(value)}`) -} - export const initialWalkingPolicy = (frameName: WalkFrame): WalkingPolicyState => ({ frameName, offset: 0, @@ -142,9 +140,3 @@ const planBout = (state: WalkingPolicyState, random: () => number): WalkingPolic const remaining = available < 5 ? available : 5 + Math.floor(normalizedRandom(random) * (available - 4)) return { ...state, bout: { kind: "moving", remaining } } } - -const normalizedRandom = (random: () => number): number => { - const sample = random() - if (!Number.isFinite(sample) || sample <= 0) return 0 - return sample >= 1 ? 1 - Number.EPSILON : sample -} From ef274c71e47fa76b625c08bd325666c94fe47990 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 19:40:36 +0900 Subject: [PATCH 16/41] refactor(cursor-vpet): isolate pure presentation under webview/presentation Move animation, artwork, and session modules into a VS Code-free folder to separate visual logic from host-specific webview wiring. Co-authored-by: Cursor --- .../src/webview/{ => presentation}/animated-artwork.ts | 0 .../src/webview/{ => presentation}/defeat-artwork.ts | 2 +- .../src/webview/{ => presentation}/evolution-artwork.ts | 2 +- .../{ => presentation}/evolution-battle-artwork.ts | 2 +- .../{ => presentation}/evolution-battle-session.ts | 0 .../{ => presentation}/evolution-reveal-session.ts | 0 .../webview/{ => presentation}/monster-action-policy.ts | 2 +- .../src/webview/{ => presentation}/monster-animation.ts | 2 +- .../webview/{ => presentation}/monster-artwork-mirror.ts | 0 .../webview/{ => presentation}/monster-walking-policy.ts | 4 ++-- packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts | 8 ++++---- packages/cursor-vpet/tests/defeat-artwork.test.ts | 2 +- packages/cursor-vpet/tests/evolution-artwork.test.ts | 2 +- .../cursor-vpet/tests/evolution-battle-artwork.test.ts | 2 +- .../cursor-vpet/tests/evolution-battle-session.test.ts | 2 +- .../cursor-vpet/tests/evolution-reveal-session.test.ts | 2 +- packages/cursor-vpet/tests/monster-animation.test.ts | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) rename packages/cursor-vpet/src/webview/{ => presentation}/animated-artwork.ts (100%) rename packages/cursor-vpet/src/webview/{ => presentation}/defeat-artwork.ts (98%) rename packages/cursor-vpet/src/webview/{ => presentation}/evolution-artwork.ts (99%) rename packages/cursor-vpet/src/webview/{ => presentation}/evolution-battle-artwork.ts (99%) rename packages/cursor-vpet/src/webview/{ => presentation}/evolution-battle-session.ts (100%) rename packages/cursor-vpet/src/webview/{ => presentation}/evolution-reveal-session.ts (100%) rename packages/cursor-vpet/src/webview/{ => presentation}/monster-action-policy.ts (97%) rename packages/cursor-vpet/src/webview/{ => presentation}/monster-animation.ts (99%) rename packages/cursor-vpet/src/webview/{ => presentation}/monster-artwork-mirror.ts (100%) rename packages/cursor-vpet/src/webview/{ => presentation}/monster-walking-policy.ts (97%) diff --git a/packages/cursor-vpet/src/webview/animated-artwork.ts b/packages/cursor-vpet/src/webview/presentation/animated-artwork.ts similarity index 100% rename from packages/cursor-vpet/src/webview/animated-artwork.ts rename to packages/cursor-vpet/src/webview/presentation/animated-artwork.ts diff --git a/packages/cursor-vpet/src/webview/defeat-artwork.ts b/packages/cursor-vpet/src/webview/presentation/defeat-artwork.ts similarity index 98% rename from packages/cursor-vpet/src/webview/defeat-artwork.ts rename to packages/cursor-vpet/src/webview/presentation/defeat-artwork.ts index ec0a321..d1c0c02 100644 --- a/packages/cursor-vpet/src/webview/defeat-artwork.ts +++ b/packages/cursor-vpet/src/webview/presentation/defeat-artwork.ts @@ -1,6 +1,6 @@ import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" -import { sleep } from "../shared/sleep.ts" +import { sleep } from "../../shared/sleep.ts" const FRAME_ROWS = 8 const FRAME_COLUMNS = 16 diff --git a/packages/cursor-vpet/src/webview/evolution-artwork.ts b/packages/cursor-vpet/src/webview/presentation/evolution-artwork.ts similarity index 99% rename from packages/cursor-vpet/src/webview/evolution-artwork.ts rename to packages/cursor-vpet/src/webview/presentation/evolution-artwork.ts index 82dd26d..03fd054 100644 --- a/packages/cursor-vpet/src/webview/evolution-artwork.ts +++ b/packages/cursor-vpet/src/webview/presentation/evolution-artwork.ts @@ -1,5 +1,5 @@ import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" -import { sleep } from "../shared/sleep.ts" +import { sleep } from "../../shared/sleep.ts" import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" const FRAME_ROWS = 8 diff --git a/packages/cursor-vpet/src/webview/evolution-battle-artwork.ts b/packages/cursor-vpet/src/webview/presentation/evolution-battle-artwork.ts similarity index 99% rename from packages/cursor-vpet/src/webview/evolution-battle-artwork.ts rename to packages/cursor-vpet/src/webview/presentation/evolution-battle-artwork.ts index cd6968c..0c32e15 100644 --- a/packages/cursor-vpet/src/webview/evolution-battle-artwork.ts +++ b/packages/cursor-vpet/src/webview/presentation/evolution-battle-artwork.ts @@ -1,6 +1,6 @@ import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" -import { sleep } from "../shared/sleep.ts" +import { sleep } from "../../shared/sleep.ts" import { mirrorMonsterFrame } from "./monster-artwork-mirror.ts" const FRAME_ROWS = 8 diff --git a/packages/cursor-vpet/src/webview/evolution-battle-session.ts b/packages/cursor-vpet/src/webview/presentation/evolution-battle-session.ts similarity index 100% rename from packages/cursor-vpet/src/webview/evolution-battle-session.ts rename to packages/cursor-vpet/src/webview/presentation/evolution-battle-session.ts diff --git a/packages/cursor-vpet/src/webview/evolution-reveal-session.ts b/packages/cursor-vpet/src/webview/presentation/evolution-reveal-session.ts similarity index 100% rename from packages/cursor-vpet/src/webview/evolution-reveal-session.ts rename to packages/cursor-vpet/src/webview/presentation/evolution-reveal-session.ts diff --git a/packages/cursor-vpet/src/webview/monster-action-policy.ts b/packages/cursor-vpet/src/webview/presentation/monster-action-policy.ts similarity index 97% rename from packages/cursor-vpet/src/webview/monster-action-policy.ts rename to packages/cursor-vpet/src/webview/presentation/monster-action-policy.ts index 7fe2a97..2ff2f28 100644 --- a/packages/cursor-vpet/src/webview/monster-action-policy.ts +++ b/packages/cursor-vpet/src/webview/presentation/monster-action-policy.ts @@ -1,5 +1,5 @@ import type { MonsterFrameCatalog, MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" -import { normalizedRandom } from "../shared/random.ts" +import { normalizedRandom } from "../../shared/random.ts" export type CosmeticActionClip = readonly [MonsterFrameName, MonsterFrameName] export type SleepClip = readonly [MonsterFrameName, MonsterFrameName] diff --git a/packages/cursor-vpet/src/webview/monster-animation.ts b/packages/cursor-vpet/src/webview/presentation/monster-animation.ts similarity index 99% rename from packages/cursor-vpet/src/webview/monster-animation.ts rename to packages/cursor-vpet/src/webview/presentation/monster-animation.ts index 1fbbece..35d034c 100644 --- a/packages/cursor-vpet/src/webview/monster-animation.ts +++ b/packages/cursor-vpet/src/webview/presentation/monster-animation.ts @@ -3,7 +3,7 @@ import type { MonsterFrameCatalog, MonsterFrameName, } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" -import { assertNever } from "../shared/assert-never.ts" +import { assertNever } from "../../shared/assert-never.ts" import { resolveCosmeticActions, resolveSleepClip, diff --git a/packages/cursor-vpet/src/webview/monster-artwork-mirror.ts b/packages/cursor-vpet/src/webview/presentation/monster-artwork-mirror.ts similarity index 100% rename from packages/cursor-vpet/src/webview/monster-artwork-mirror.ts rename to packages/cursor-vpet/src/webview/presentation/monster-artwork-mirror.ts diff --git a/packages/cursor-vpet/src/webview/monster-walking-policy.ts b/packages/cursor-vpet/src/webview/presentation/monster-walking-policy.ts similarity index 97% rename from packages/cursor-vpet/src/webview/monster-walking-policy.ts rename to packages/cursor-vpet/src/webview/presentation/monster-walking-policy.ts index 5ba8a16..81ce933 100644 --- a/packages/cursor-vpet/src/webview/monster-walking-policy.ts +++ b/packages/cursor-vpet/src/webview/presentation/monster-walking-policy.ts @@ -1,6 +1,6 @@ import type { MonsterFrameCatalog, MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" -import { assertNever } from "../shared/assert-never.ts" -import { normalizedRandom } from "../shared/random.ts" +import { assertNever } from "../../shared/assert-never.ts" +import { normalizedRandom } from "../../shared/random.ts" export type WalkingFacing = "left" | "right" export type WalkFrame = "walk_1" | "walk_2" diff --git a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts index 4725b55..8655855 100644 --- a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts +++ b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts @@ -8,10 +8,10 @@ import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/ import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" import type { EvolutionBattleRepository } from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" -import { renderPositionedArtwork } from "./animated-artwork.ts" -import { runEvolutionBattleSession } from "./evolution-battle-session.ts" -import { runEvolutionRevealSession } from "./evolution-reveal-session.ts" -import { MonsterAnimationController, type MonsterAnimationOutput } from "./monster-animation.ts" +import { renderPositionedArtwork } from "./presentation/animated-artwork.ts" +import { runEvolutionBattleSession } from "./presentation/evolution-battle-session.ts" +import { runEvolutionRevealSession } from "./presentation/evolution-reveal-session.ts" +import { MonsterAnimationController, type MonsterAnimationOutput } from "./presentation/monster-animation.ts" import { buildSidebarWebviewHtml, DEFAULT_ARTWORK_WIDTH, diff --git a/packages/cursor-vpet/tests/defeat-artwork.test.ts b/packages/cursor-vpet/tests/defeat-artwork.test.ts index 478afe6..30ff072 100644 --- a/packages/cursor-vpet/tests/defeat-artwork.test.ts +++ b/packages/cursor-vpet/tests/defeat-artwork.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "bun:test" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" -import { renderDefeatArtwork } from "../src/webview/defeat-artwork.ts" +import { renderDefeatArtwork } from "../src/webview/presentation/defeat-artwork.ts" describe("defeat artwork", () => { test("Given normal and sad poses When rendering Then artwork alternates between them", () => { diff --git a/packages/cursor-vpet/tests/evolution-artwork.test.ts b/packages/cursor-vpet/tests/evolution-artwork.test.ts index 29d5743..f9560c3 100644 --- a/packages/cursor-vpet/tests/evolution-artwork.test.ts +++ b/packages/cursor-vpet/tests/evolution-artwork.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "bun:test" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" -import { renderEvolutionArtwork } from "../src/webview/evolution-artwork.ts" +import { renderEvolutionArtwork } from "../src/webview/presentation/evolution-artwork.ts" describe("evolution artwork", () => { test("Given glow phase When rendering Then the sprite is still the current partner", () => { diff --git a/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts b/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts index d5a500b..b026c5d 100644 --- a/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts +++ b/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts @@ -11,7 +11,7 @@ import { planEvolutionBattle, renderBattleIntroArtwork, renderEvolutionBattleArtwork, -} from "../src/webview/evolution-battle-artwork.ts" +} from "../src/webview/presentation/evolution-battle-artwork.ts" const countHits = (shots: readonly { readonly shooter: "player" | "opponent"; readonly hit: boolean }[]) => ({ playerHits: shots.filter((shot) => shot.shooter === "player" && shot.hit).length, diff --git a/packages/cursor-vpet/tests/evolution-battle-session.test.ts b/packages/cursor-vpet/tests/evolution-battle-session.test.ts index 8b43bfc..08ba301 100644 --- a/packages/cursor-vpet/tests/evolution-battle-session.test.ts +++ b/packages/cursor-vpet/tests/evolution-battle-session.test.ts @@ -2,7 +2,7 @@ import { describe, expect, test } from "bun:test" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" -import { runEvolutionBattleSession } from "../src/webview/evolution-battle-session.ts" +import { runEvolutionBattleSession } from "../src/webview/presentation/evolution-battle-session.ts" describe("evolution battle session", () => { test("Given a snapshot without a pending battle When running the session Then it is a no-op", async () => { diff --git a/packages/cursor-vpet/tests/evolution-reveal-session.test.ts b/packages/cursor-vpet/tests/evolution-reveal-session.test.ts index 65271e8..e34c4d5 100644 --- a/packages/cursor-vpet/tests/evolution-reveal-session.test.ts +++ b/packages/cursor-vpet/tests/evolution-reveal-session.test.ts @@ -2,7 +2,7 @@ import { describe, expect, test } from "bun:test" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" -import { runEvolutionRevealSession } from "../src/webview/evolution-reveal-session.ts" +import { runEvolutionRevealSession } from "../src/webview/presentation/evolution-reveal-session.ts" describe("evolution reveal session", () => { test("Given a valid evolution transition When running the session Then it renders evolution artwork", async () => { diff --git a/packages/cursor-vpet/tests/monster-animation.test.ts b/packages/cursor-vpet/tests/monster-animation.test.ts index fca8007..a29c39c 100644 --- a/packages/cursor-vpet/tests/monster-animation.test.ts +++ b/packages/cursor-vpet/tests/monster-animation.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "bun:test" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" -import { MonsterAnimationController } from "../src/webview/monster-animation.ts" +import { MonsterAnimationController } from "../src/webview/presentation/monster-animation.ts" describe("monster animation", () => { test("dispatches partner_changed without performance.now binding errors", () => { From b63c40db25c2aa4716b3df54d9740995560ab3a3 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 19:41:24 +0900 Subject: [PATCH 17/41] refactor(cursor-vpet): add VS Code ports and typed webview messages Introduce notification, scheduler, and webview messenger adapters plus discriminated union message parsing; wire provider through AnimationSink. Co-authored-by: Cursor --- .../src/adapters/vscode/animation-sink.ts | 16 +++ .../src/adapters/vscode/notification-port.ts | 11 ++ .../src/adapters/vscode/scheduler.ts | 10 ++ .../src/adapters/vscode/webview-messenger.ts | 13 ++ .../cursor-vpet/src/webview/sidebar-render.ts | 22 +-- .../src/webview/sidebar/webview-messages.ts | 36 +++++ .../src/webview/vpet-sidebar-provider.ts | 130 ++++++++++-------- .../tests/webview-messages.test.ts | 25 ++++ 8 files changed, 185 insertions(+), 78 deletions(-) create mode 100644 packages/cursor-vpet/src/adapters/vscode/animation-sink.ts create mode 100644 packages/cursor-vpet/src/adapters/vscode/notification-port.ts create mode 100644 packages/cursor-vpet/src/adapters/vscode/scheduler.ts create mode 100644 packages/cursor-vpet/src/adapters/vscode/webview-messenger.ts create mode 100644 packages/cursor-vpet/src/webview/sidebar/webview-messages.ts create mode 100644 packages/cursor-vpet/tests/webview-messages.test.ts diff --git a/packages/cursor-vpet/src/adapters/vscode/animation-sink.ts b/packages/cursor-vpet/src/adapters/vscode/animation-sink.ts new file mode 100644 index 0000000..75d76d8 --- /dev/null +++ b/packages/cursor-vpet/src/adapters/vscode/animation-sink.ts @@ -0,0 +1,16 @@ +import type { SidebarWebviewPayload } from "../../webview/sidebar/webview-messages.ts" +import type { WebviewMessenger } from "./webview-messenger.ts" + +export type AnimationSink = { + postArtwork(artwork: string): Promise + postModel(payload: SidebarWebviewPayload): Promise +} + +export const createAnimationSink = (messenger: WebviewMessenger): AnimationSink => ({ + async postArtwork(artwork: string): Promise { + await messenger.post({ type: "animation-frame", artwork }) + }, + async postModel(payload: SidebarWebviewPayload): Promise { + await messenger.post(payload) + }, +}) diff --git a/packages/cursor-vpet/src/adapters/vscode/notification-port.ts b/packages/cursor-vpet/src/adapters/vscode/notification-port.ts new file mode 100644 index 0000000..8ad53bf --- /dev/null +++ b/packages/cursor-vpet/src/adapters/vscode/notification-port.ts @@ -0,0 +1,11 @@ +import * as vscode from "vscode" + +export type NotificationPort = { + showInformation(message: string): void +} + +export const createVsCodeNotificationPort = (): NotificationPort => ({ + showInformation(message: string): void { + void vscode.window.showInformationMessage(message) + }, +}) diff --git a/packages/cursor-vpet/src/adapters/vscode/scheduler.ts b/packages/cursor-vpet/src/adapters/vscode/scheduler.ts new file mode 100644 index 0000000..d4ba074 --- /dev/null +++ b/packages/cursor-vpet/src/adapters/vscode/scheduler.ts @@ -0,0 +1,10 @@ +export type IntervalScheduler = { + start(callback: () => void, intervalMs: number): () => void +} + +export const createIntervalScheduler = (): IntervalScheduler => ({ + start(callback: () => void, intervalMs: number): () => void { + const handle = setInterval(callback, intervalMs) + return () => clearInterval(handle) + }, +}) diff --git a/packages/cursor-vpet/src/adapters/vscode/webview-messenger.ts b/packages/cursor-vpet/src/adapters/vscode/webview-messenger.ts new file mode 100644 index 0000000..b669826 --- /dev/null +++ b/packages/cursor-vpet/src/adapters/vscode/webview-messenger.ts @@ -0,0 +1,13 @@ +import type * as vscode from "vscode" + +import type { ExtensionToWebviewMessage } from "../../webview/sidebar/webview-messages.ts" + +export type WebviewMessenger = { + post(message: ExtensionToWebviewMessage): Promise +} + +export const createWebviewMessenger = (webview: vscode.Webview): WebviewMessenger => ({ + async post(message: ExtensionToWebviewMessage): Promise { + await webview.postMessage(message) + }, +}) diff --git a/packages/cursor-vpet/src/webview/sidebar-render.ts b/packages/cursor-vpet/src/webview/sidebar-render.ts index 6e6a02a..ea07402 100644 --- a/packages/cursor-vpet/src/webview/sidebar-render.ts +++ b/packages/cursor-vpet/src/webview/sidebar-render.ts @@ -1,4 +1,7 @@ import type { SidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" +import type { AnimationFramePayload, SidebarWebviewPayload } from "./sidebar/webview-messages.ts" + +export type { AnimationFramePayload, SidebarWebviewPayload } from "./sidebar/webview-messages.ts" const NEXT_CHECK_PREFIX = "Next check: " const NEXT_CHECK_BAR_WIDTH = 20 @@ -30,25 +33,6 @@ export const buildGaugeLine = (model: SidebarCardModel): string => { return model.isTerminal ? "-/-" : `${formatCount(model.gauge)}/${formatCount(model.threshold)}` } -export type SidebarWebviewPayload = - | { readonly type: "sidebar-model"; readonly kind: "no_partner"; readonly messageLine: string } - | { - readonly type: "sidebar-model" - readonly kind: "partner" - readonly name: string - readonly stage: string - readonly nextCheck: string - readonly gauge: string - readonly url: string - readonly urlLabel: string - readonly frozen: boolean - } - -export type AnimationFramePayload = { - readonly type: "animation-frame" - readonly artwork: string -} - export const toSidebarWebviewPayload = (model: SidebarCardModel): SidebarWebviewPayload => { if (model.kind === "no_partner") { return { type: "sidebar-model", kind: "no_partner", messageLine: model.messageLine } diff --git a/packages/cursor-vpet/src/webview/sidebar/webview-messages.ts b/packages/cursor-vpet/src/webview/sidebar/webview-messages.ts new file mode 100644 index 0000000..9f63900 --- /dev/null +++ b/packages/cursor-vpet/src/webview/sidebar/webview-messages.ts @@ -0,0 +1,36 @@ +export type SidebarWebviewPayload = + | { readonly type: "sidebar-model"; readonly kind: "no_partner"; readonly messageLine: string } + | { + readonly type: "sidebar-model" + readonly kind: "partner" + readonly name: string + readonly stage: string + readonly nextCheck: string + readonly gauge: string + readonly url: string + readonly urlLabel: string + readonly frozen: boolean + } + +export type AnimationFramePayload = { + readonly type: "animation-frame" + readonly artwork: string +} + +export type ExtensionToWebviewMessage = SidebarWebviewPayload | AnimationFramePayload + +export type WebviewToExtensionMessage = + | { readonly type: "open-url"; readonly url: string } + | { readonly type: "artwork-width"; readonly width: number } + +export const parseWebviewInboundMessage = (raw: unknown): WebviewToExtensionMessage | null => { + if (raw === null || typeof raw !== "object") return null + const message = raw as { readonly type?: unknown; readonly url?: unknown; readonly width?: unknown } + if (message.type === "open-url" && typeof message.url === "string" && message.url.length > 0) { + return { type: "open-url", url: message.url } + } + if (message.type === "artwork-width" && typeof message.width === "number" && Number.isFinite(message.width)) { + return { type: "artwork-width", width: message.width } + } + return null +} diff --git a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts index 8655855..aa23c85 100644 --- a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts +++ b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts @@ -8,41 +8,65 @@ import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/ import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" import type { EvolutionBattleRepository } from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" +import { createAnimationSink, type AnimationSink } from "../adapters/vscode/animation-sink.ts" +import { + createVsCodeNotificationPort, + type NotificationPort, +} from "../adapters/vscode/notification-port.ts" +import { createIntervalScheduler, type IntervalScheduler } from "../adapters/vscode/scheduler.ts" +import { createWebviewMessenger } from "../adapters/vscode/webview-messenger.ts" +import { createAsyncRefreshQueue } from "../shared/async-refresh-queue.ts" import { renderPositionedArtwork } from "./presentation/animated-artwork.ts" import { runEvolutionBattleSession } from "./presentation/evolution-battle-session.ts" import { runEvolutionRevealSession } from "./presentation/evolution-reveal-session.ts" import { MonsterAnimationController, type MonsterAnimationOutput } from "./presentation/monster-animation.ts" +import { parseWebviewInboundMessage, type SidebarWebviewPayload } from "./sidebar/webview-messages.ts" import { buildSidebarWebviewHtml, DEFAULT_ARTWORK_WIDTH, MIN_ARTWORK_WIDTH, toSidebarWebviewPayload, - type SidebarWebviewPayload, } from "./sidebar-render.ts" const VISUAL_INTERVAL_MS = 500 +export type VpetSidebarProviderOptions = { + readonly notification?: NotificationPort + readonly scheduler?: IntervalScheduler + readonly random?: () => number + readonly nowMs?: () => number +} + export class VpetSidebarProvider implements vscode.WebviewViewProvider { public static readonly viewType = "cursorVpet.sidebar" private view?: vscode.WebviewView + private messengerSink?: AnimationSink private cachedPayload?: SidebarWebviewPayload private cachedArtwork = "" private artworkWidth = DEFAULT_ARTWORK_WIDTH - private visualInterval?: ReturnType + private stopVisualInterval?: () => void private presentationInProgress = false - private refreshInFlight = false - private pendingRefresh = false private pendingEvolutionReveal: UsageEvolutionTransition | undefined - private readonly animation = new MonsterAnimationController(MONSTER_FRAME_CATALOG, Math.random, () => - performance.now(), - ) + private readonly refreshQueue = createAsyncRefreshQueue() + private readonly notification: NotificationPort + private readonly scheduler: IntervalScheduler + private readonly random: () => number + private readonly nowMs: () => number + private readonly animation: MonsterAnimationController constructor( private readonly extensionUri: vscode.Uri, private readonly snapshotReader: SidebarSnapshotReader, private readonly battleRepository: EvolutionBattleRepository, - ) {} + options: VpetSidebarProviderOptions = {}, + ) { + this.notification = options.notification ?? createVsCodeNotificationPort() + this.scheduler = options.scheduler ?? createIntervalScheduler() + this.random = options.random ?? Math.random + this.nowMs = options.nowMs ?? (() => performance.now()) + this.animation = new MonsterAnimationController(MONSTER_FRAME_CATALOG, this.random, this.nowMs) + } isPresentationInProgress(): boolean { return this.presentationInProgress @@ -54,6 +78,7 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { resolveWebviewView(webviewView: vscode.WebviewView): void { this.view = webviewView + this.messengerSink = createAnimationSink(createWebviewMessenger(webviewView.webview)) webviewView.webview.options = { enableScripts: true, localResourceRoots: [this.extensionUri], @@ -61,34 +86,33 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { webviewView.webview.html = buildSidebarWebviewHtml(String(Date.now())) - webviewView.webview.onDidReceiveMessage( - (message: { readonly type?: string; readonly url?: string; readonly width?: number }) => { - if (message.type === "open-url" && typeof message.url === "string" && message.url.length > 0) { - void vscode.env.openExternal(vscode.Uri.parse(message.url)) - return - } - if (message.type === "artwork-width" && typeof message.width === "number" && Number.isFinite(message.width)) { - this.artworkWidth = Math.max(MIN_ARTWORK_WIDTH, Math.floor(message.width)) - this.syncAnimationViewport() - void this.postAnimationFrame() - } - }, - ) + webviewView.webview.onDidReceiveMessage((message: unknown) => { + const inbound = parseWebviewInboundMessage(message) + if (inbound === null) return + if (inbound.type === "open-url") { + void vscode.env.openExternal(vscode.Uri.parse(inbound.url)) + return + } + this.artworkWidth = Math.max(MIN_ARTWORK_WIDTH, Math.floor(inbound.width)) + this.syncAnimationViewport() + void this.postAnimationFrame() + }) webviewView.onDidChangeVisibility(() => { if (webviewView.visible) { this.startVisualInterval() void this.refresh() } else { - this.stopVisualInterval() + this.stopVisualInterval?.() + delete this.stopVisualInterval } }) if (this.cachedPayload !== undefined) { - void this.view.webview.postMessage(this.cachedPayload) + void this.messengerSink?.postModel(this.cachedPayload) } if (this.cachedArtwork.length > 0) { - void this.view.webview.postMessage({ type: "animation-frame", artwork: this.cachedArtwork }) + void this.messengerSink?.postArtwork(this.cachedArtwork) } if (webviewView.visible) { @@ -99,32 +123,23 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { async refresh(): Promise { if (this.view === undefined) return - if (this.refreshInFlight) { - this.pendingRefresh = true - return - } - - this.refreshInFlight = true - try { - do { - this.pendingRefresh = false - await this.resolvePendingBattleIfNeeded() - await this.playPendingEvolutionReveal() - if (this.view === undefined) return - await this.publishSidebarModel() - } while (this.pendingRefresh) - } finally { - this.refreshInFlight = false - } + await this.refreshQueue.run(async () => { + await this.resolvePendingBattleIfNeeded() + await this.playPendingEvolutionReveal() + if (this.view === undefined) return + await this.publishSidebarModel() + }) } dispose(): void { - this.stopVisualInterval() + this.stopVisualInterval?.() + delete this.stopVisualInterval delete this.view + delete this.messengerSink } private async publishSidebarModel(): Promise { - if (this.view === undefined) return + if (this.view === undefined || this.messengerSink === undefined) return const snapshot = this.snapshotReader.getSidebarSnapshot() const reader = { getSidebarSnapshot: () => snapshot } @@ -132,7 +147,7 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { const model = buildSidebarCardModel(inputs, DEFAULT_VPET_SETTINGS) const payload = toSidebarWebviewPayload(model) this.cachedPayload = payload - await this.view.webview.postMessage(payload) + await this.messengerSink.postModel(payload) if (this.presentationInProgress) return @@ -148,7 +163,8 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { if (snapshot.pendingEvolutionTargetId === null || snapshot.battleOpponentNodeId === null) return this.presentationInProgress = true - this.stopVisualInterval() + this.stopVisualInterval?.() + delete this.stopVisualInterval this.cachedArtwork = "" try { @@ -156,13 +172,14 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { frameCatalog: MONSTER_FRAME_CATALOG, digimonCatalog: DIGIMON_CATALOG, repository: this.battleRepository, + random: this.random, onArtwork: async (artwork) => this.postArtwork(artwork), onResolved: async (result) => { if (result.kind === "won") { this.pendingEvolutionReveal = undefined - void vscode.window.showInformationMessage("Victory! Your partner evolved!") + this.notification.showInformation("Victory! Your partner evolved!") } else if (result.kind === "lost") { - void vscode.window.showInformationMessage("Defeat! You lost all tokens for this stage.") + this.notification.showInformation("Defeat! You lost all tokens for this stage.") } }, }) @@ -178,7 +195,8 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { this.pendingEvolutionReveal = undefined this.presentationInProgress = true - this.stopVisualInterval() + this.stopVisualInterval?.() + delete this.stopVisualInterval this.cachedArtwork = "" try { @@ -188,7 +206,7 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { onArtwork: async (artwork) => this.postArtwork(artwork), }) if (revealed) { - void vscode.window.showInformationMessage("Your partner evolved!") + this.notification.showInformation("Your partner evolved!") } } finally { this.presentationInProgress = false @@ -198,7 +216,7 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { private async postArtwork(artwork: string): Promise { this.cachedArtwork = artwork - await this.view?.webview.postMessage({ type: "animation-frame", artwork }) + await this.messengerSink?.postArtwork(artwork) } private syncAnimationPartner(model: ReturnType): void { @@ -213,26 +231,20 @@ export class VpetSidebarProvider implements vscode.WebviewViewProvider { } private startVisualInterval(): void { - if (this.visualInterval !== undefined) return - this.visualInterval = setInterval(() => { + if (this.stopVisualInterval !== undefined) return + this.stopVisualInterval = this.scheduler.start(() => { if (this.view === undefined || !this.view.visible || this.presentationInProgress) return const nextAnimation = this.animation.dispatch({ kind: "tick" }) void this.postAnimationFrame(nextAnimation) }, VISUAL_INTERVAL_MS) } - private stopVisualInterval(): void { - if (this.visualInterval === undefined) return - clearInterval(this.visualInterval) - delete this.visualInterval - } - private async postAnimationFrame(animation?: MonsterAnimationOutput): Promise { if (this.view === undefined || this.presentationInProgress) return const output = animation ?? this.animation.output() const artwork = renderPositionedArtwork(output, this.artworkWidth) if (artwork === this.cachedArtwork) return this.cachedArtwork = artwork - await this.view.webview.postMessage({ type: "animation-frame", artwork }) + await this.messengerSink?.postArtwork(artwork) } } diff --git a/packages/cursor-vpet/tests/webview-messages.test.ts b/packages/cursor-vpet/tests/webview-messages.test.ts new file mode 100644 index 0000000..c7cc7e4 --- /dev/null +++ b/packages/cursor-vpet/tests/webview-messages.test.ts @@ -0,0 +1,25 @@ +import { describe, expect, test } from "bun:test" + +import { parseWebviewInboundMessage } from "../src/webview/sidebar/webview-messages.ts" + +describe("webview messages", () => { + test("parses open-url messages", () => { + expect(parseWebviewInboundMessage({ type: "open-url", url: "https://example.com" })).toEqual({ + type: "open-url", + url: "https://example.com", + }) + }) + + test("parses artwork-width messages", () => { + expect(parseWebviewInboundMessage({ type: "artwork-width", width: 42 })).toEqual({ + type: "artwork-width", + width: 42, + }) + }) + + test("rejects invalid payloads", () => { + expect(parseWebviewInboundMessage(null)).toBeNull() + expect(parseWebviewInboundMessage({ type: "open-url", url: "" })).toBeNull() + expect(parseWebviewInboundMessage({ type: "artwork-width", width: Number.NaN })).toBeNull() + }) +}) From 40a4aa2e5bffbd5c58844e6796f4a4cb480098c8 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 19:43:13 +0900 Subject: [PATCH 18/41] refactor(cursor-vpet): decompose sidebar into presenter and orchestrator Split VpetSidebarProvider into pure presenter, animation host, and orchestrator modules under webview/sidebar for single-responsibility. Co-authored-by: Cursor --- .../src/webview/sidebar/provider.ts | 145 ++++++++++ .../webview/sidebar/sidebar-animation-host.ts | 92 +++++++ .../webview/sidebar/sidebar-orchestrator.ts | 141 ++++++++++ .../src/webview/sidebar/sidebar-presenter.ts | 22 ++ .../webview/{ => sidebar}/sidebar-render.ts | 4 +- .../src/webview/vpet-sidebar-provider.ts | 251 +----------------- .../tests/sidebar-presenter.test.ts | 11 + .../cursor-vpet/tests/sidebar-render.test.ts | 2 +- 8 files changed, 415 insertions(+), 253 deletions(-) create mode 100644 packages/cursor-vpet/src/webview/sidebar/provider.ts create mode 100644 packages/cursor-vpet/src/webview/sidebar/sidebar-animation-host.ts create mode 100644 packages/cursor-vpet/src/webview/sidebar/sidebar-orchestrator.ts create mode 100644 packages/cursor-vpet/src/webview/sidebar/sidebar-presenter.ts rename packages/cursor-vpet/src/webview/{ => sidebar}/sidebar-render.ts (99%) create mode 100644 packages/cursor-vpet/tests/sidebar-presenter.test.ts diff --git a/packages/cursor-vpet/src/webview/sidebar/provider.ts b/packages/cursor-vpet/src/webview/sidebar/provider.ts new file mode 100644 index 0000000..faf6181 --- /dev/null +++ b/packages/cursor-vpet/src/webview/sidebar/provider.ts @@ -0,0 +1,145 @@ +import * as vscode from "vscode" + +import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" +import type { EvolutionBattleRepository } from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { createAnimationSink, type AnimationSink } from "../../adapters/vscode/animation-sink.ts" +import { + createVsCodeNotificationPort, + type NotificationPort, +} from "../../adapters/vscode/notification-port.ts" +import { createIntervalScheduler, type IntervalScheduler } from "../../adapters/vscode/scheduler.ts" +import { createWebviewMessenger } from "../../adapters/vscode/webview-messenger.ts" +import { createSidebarAnimationHost, type SidebarAnimationHost } from "./sidebar-animation-host.ts" +import { createSidebarOrchestrator, type SidebarOrchestrator } from "./sidebar-orchestrator.ts" +import { buildSidebarWebviewHtml } from "./sidebar-render.ts" +import { parseWebviewInboundMessage } from "./webview-messages.ts" + +export type VpetSidebarProviderOptions = { + readonly notification?: NotificationPort + readonly scheduler?: IntervalScheduler + readonly random?: () => number + readonly nowMs?: () => number +} + +const createDeferredAnimationSink = (): { readonly sink: AnimationSink; setSink(next: AnimationSink): void } => { + let current: AnimationSink = { + postArtwork: async () => {}, + postModel: async () => {}, + } + return { + sink: { + postArtwork: async (artwork) => current.postArtwork(artwork), + postModel: async (payload) => current.postModel(payload), + }, + setSink(next: AnimationSink): void { + current = next + }, + } +} + +export class VpetSidebarProvider implements vscode.WebviewViewProvider { + public static readonly viewType = "cursorVpet.sidebar" + + private view?: vscode.WebviewView + private readonly notification: NotificationPort + private readonly scheduler: IntervalScheduler + private readonly animationHost: SidebarAnimationHost + private readonly orchestrator: SidebarOrchestrator + private readonly deferredSink: ReturnType + + constructor( + private readonly extensionUri: vscode.Uri, + snapshotReader: SidebarSnapshotReader, + battleRepository: EvolutionBattleRepository, + options: VpetSidebarProviderOptions = {}, + ) { + this.notification = options.notification ?? createVsCodeNotificationPort() + this.scheduler = options.scheduler ?? createIntervalScheduler() + const random = options.random ?? Math.random + const nowMs = options.nowMs ?? (() => performance.now()) + this.deferredSink = createDeferredAnimationSink() + + this.animationHost = createSidebarAnimationHost({ + frameCatalog: MONSTER_FRAME_CATALOG, + sink: this.deferredSink.sink, + scheduler: this.scheduler, + random, + nowMs, + isVisible: () => this.view?.visible === true, + }) + + this.orchestrator = createSidebarOrchestrator({ + snapshotReader, + battleRepository, + animationHost: this.animationHost, + notification: this.notification, + random, + onPresentationEnd: () => { + if (this.view?.visible === true) this.animationHost.start() + }, + }) + this.orchestrator.setSink(this.deferredSink.sink) + } + + isPresentationInProgress(): boolean { + return this.orchestrator.isPresentationInProgress() + } + + queueEvolutionReveal(evolution: Parameters[0]): void { + this.orchestrator.queueEvolutionReveal(evolution) + } + + async refresh(): Promise { + await this.orchestrator.refresh() + } + + resolveWebviewView(webviewView: vscode.WebviewView): void { + this.view = webviewView + const sink = createAnimationSink(createWebviewMessenger(webviewView.webview)) + this.deferredSink.setSink(sink) + this.orchestrator.setSink(sink) + + webviewView.webview.options = { + enableScripts: true, + localResourceRoots: [this.extensionUri], + } + + webviewView.webview.html = buildSidebarWebviewHtml(String(Date.now())) + + webviewView.webview.onDidReceiveMessage((message: unknown) => { + const inbound = parseWebviewInboundMessage(message) + if (inbound === null) return + if (inbound.type === "open-url") { + void vscode.env.openExternal(vscode.Uri.parse(inbound.url)) + return + } + this.animationHost.setArtworkWidth(inbound.width) + void this.animationHost.postCurrentFrame() + }) + + webviewView.onDidChangeVisibility(() => { + if (webviewView.visible) { + this.animationHost.start() + void this.refresh() + } else { + this.animationHost.stop() + } + }) + + const cachedPayload = this.orchestrator.getCachedPayload() + if (cachedPayload !== undefined) { + void sink.postModel(cachedPayload) + } + + if (webviewView.visible) { + this.animationHost.start() + void this.refresh() + } + } + + dispose(): void { + this.animationHost.stop() + delete this.view + } +} diff --git a/packages/cursor-vpet/src/webview/sidebar/sidebar-animation-host.ts b/packages/cursor-vpet/src/webview/sidebar/sidebar-animation-host.ts new file mode 100644 index 0000000..22e0631 --- /dev/null +++ b/packages/cursor-vpet/src/webview/sidebar/sidebar-animation-host.ts @@ -0,0 +1,92 @@ +import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import type { AnimationSink } from "../../adapters/vscode/animation-sink.ts" +import type { IntervalScheduler } from "../../adapters/vscode/scheduler.ts" +import { renderPositionedArtwork } from "../presentation/animated-artwork.ts" +import { + MonsterAnimationController, + type MonsterAnimationIdentity, + type MonsterAnimationOutput, +} from "../presentation/monster-animation.ts" +import { DEFAULT_ARTWORK_WIDTH, MIN_ARTWORK_WIDTH } from "./sidebar-render.ts" + +const VISUAL_INTERVAL_MS = 500 + +export type SidebarAnimationHost = { + setArtworkWidth(width: number): void + syncPartner(partner: MonsterAnimationIdentity | undefined): void + start(): void + stop(): void + clearArtwork(): void + postCurrentFrame(animation?: MonsterAnimationOutput): Promise + isPresentationBlocked(): boolean + setPresentationBlocked(blocked: boolean): void + getArtworkWidth(): number +} + +export type CreateSidebarAnimationHostOptions = { + readonly frameCatalog: MonsterFrameCatalog + readonly sink: AnimationSink + readonly scheduler: IntervalScheduler + readonly random?: () => number + readonly nowMs?: () => number + readonly isVisible?: () => boolean +} + +export const createSidebarAnimationHost = ({ + frameCatalog, + sink, + scheduler, + random = Math.random, + nowMs = () => performance.now(), + isVisible = () => true, +}: CreateSidebarAnimationHostOptions): SidebarAnimationHost => { + const animation = new MonsterAnimationController(frameCatalog, random, nowMs) + let artworkWidth = DEFAULT_ARTWORK_WIDTH + let cachedArtwork = "" + let presentationBlocked = false + let stopInterval: (() => void) | undefined + + const postCurrentFrame = async (nextAnimation?: MonsterAnimationOutput): Promise => { + if (presentationBlocked) return + const output = nextAnimation ?? animation.output() + const artwork = renderPositionedArtwork(output, artworkWidth) + if (artwork === cachedArtwork) return + cachedArtwork = artwork + await sink.postArtwork(artwork) + } + + return { + setArtworkWidth(width: number): void { + artworkWidth = Math.max(MIN_ARTWORK_WIDTH, Math.floor(width)) + animation.dispatch({ kind: "viewport_resized", width: artworkWidth }) + }, + syncPartner(partner: MonsterAnimationIdentity | undefined): void { + animation.dispatch({ kind: "partner_changed", partner }) + }, + start(): void { + if (stopInterval !== undefined) return + stopInterval = scheduler.start(() => { + if (!isVisible() || presentationBlocked) return + const nextAnimation = animation.dispatch({ kind: "tick" }) + void postCurrentFrame(nextAnimation) + }, VISUAL_INTERVAL_MS) + }, + stop(): void { + stopInterval?.() + stopInterval = undefined + }, + clearArtwork(): void { + cachedArtwork = "" + }, + postCurrentFrame, + isPresentationBlocked(): boolean { + return presentationBlocked + }, + setPresentationBlocked(blocked: boolean): void { + presentationBlocked = blocked + }, + getArtworkWidth(): number { + return artworkWidth + }, + } +} diff --git a/packages/cursor-vpet/src/webview/sidebar/sidebar-orchestrator.ts b/packages/cursor-vpet/src/webview/sidebar/sidebar-orchestrator.ts new file mode 100644 index 0000000..203c9a5 --- /dev/null +++ b/packages/cursor-vpet/src/webview/sidebar/sidebar-orchestrator.ts @@ -0,0 +1,141 @@ +import type { UsageEvolutionTransition } from "@sbugallo/vpet-core/application/models/usage.ts" +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" +import type { EvolutionBattleRepository } from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" +import type { AnimationSink } from "../../adapters/vscode/animation-sink.ts" +import type { NotificationPort } from "../../adapters/vscode/notification-port.ts" +import { createAsyncRefreshQueue } from "../../shared/async-refresh-queue.ts" +import { runEvolutionBattleSession } from "../presentation/evolution-battle-session.ts" +import { runEvolutionRevealSession } from "../presentation/evolution-reveal-session.ts" +import type { SidebarAnimationHost } from "./sidebar-animation-host.ts" +import { buildSidebarPresentation } from "./sidebar-presenter.ts" +import type { SidebarWebviewPayload } from "./webview-messages.ts" + +export type SidebarOrchestrator = { + refresh(): Promise + queueEvolutionReveal(evolution: UsageEvolutionTransition): void + isPresentationInProgress(): boolean + getCachedPayload(): SidebarWebviewPayload | undefined + setSink(sink: AnimationSink): void +} + +export type CreateSidebarOrchestratorOptions = { + readonly snapshotReader: SidebarSnapshotReader + readonly battleRepository: EvolutionBattleRepository + readonly animationHost: SidebarAnimationHost + readonly notification: NotificationPort + readonly random?: () => number + readonly onPresentationEnd?: () => void +} + +export const createSidebarOrchestrator = ({ + snapshotReader, + battleRepository, + animationHost, + notification, + random = Math.random, + onPresentationEnd, +}: CreateSidebarOrchestratorOptions): SidebarOrchestrator => { + const refreshQueue = createAsyncRefreshQueue() + let sink: AnimationSink | undefined + let cachedPayload: SidebarWebviewPayload | undefined + let pendingEvolutionReveal: UsageEvolutionTransition | undefined + let presentationInProgress = false + + const publishSidebarModel = async (): Promise => { + if (sink === undefined) return + const presentation = buildSidebarPresentation(snapshotReader.getSidebarSnapshot()) + cachedPayload = presentation.payload + await sink.postModel(presentation.payload) + if (presentationInProgress) return + animationHost.syncPartner(presentation.partner) + await animationHost.postCurrentFrame() + } + + const resolvePendingBattleIfNeeded = async (): Promise => { + if (presentationInProgress) return + const snapshot = snapshotReader.getSidebarSnapshot() + if (snapshot === null) return + if (snapshot.pendingEvolutionTargetId === null || snapshot.battleOpponentNodeId === null) return + + presentationInProgress = true + animationHost.setPresentationBlocked(true) + animationHost.stop() + animationHost.clearArtwork() + + try { + await runEvolutionBattleSession(snapshot, animationHost.getArtworkWidth(), { + frameCatalog: MONSTER_FRAME_CATALOG, + digimonCatalog: DIGIMON_CATALOG, + repository: battleRepository, + random, + onArtwork: async (artwork) => { + if (sink !== undefined) await sink.postArtwork(artwork) + }, + onResolved: async (result) => { + if (result.kind === "won") { + pendingEvolutionReveal = undefined + notification.showInformation("Victory! Your partner evolved!") + } else if (result.kind === "lost") { + notification.showInformation("Defeat! You lost all tokens for this stage.") + } + }, + }) + } finally { + presentationInProgress = false + animationHost.setPresentationBlocked(false) + onPresentationEnd?.() + } + } + + const playPendingEvolutionReveal = async (): Promise => { + const evolution = pendingEvolutionReveal + if (evolution === undefined || presentationInProgress) return + + pendingEvolutionReveal = undefined + presentationInProgress = true + animationHost.setPresentationBlocked(true) + animationHost.stop() + animationHost.clearArtwork() + + try { + const revealed = await runEvolutionRevealSession(evolution, animationHost.getArtworkWidth(), { + frameCatalog: MONSTER_FRAME_CATALOG, + digimonCatalog: DIGIMON_CATALOG, + onArtwork: async (artwork) => { + if (sink !== undefined) await sink.postArtwork(artwork) + }, + }) + if (revealed) { + notification.showInformation("Your partner evolved!") + } + } finally { + presentationInProgress = false + animationHost.setPresentationBlocked(false) + onPresentationEnd?.() + } + } + + return { + async refresh(): Promise { + await refreshQueue.run(async () => { + await resolvePendingBattleIfNeeded() + await playPendingEvolutionReveal() + await publishSidebarModel() + }) + }, + queueEvolutionReveal(evolution: UsageEvolutionTransition): void { + pendingEvolutionReveal = evolution + }, + isPresentationInProgress(): boolean { + return presentationInProgress + }, + getCachedPayload(): SidebarWebviewPayload | undefined { + return cachedPayload + }, + setSink(nextSink: AnimationSink): void { + sink = nextSink + }, + } +} diff --git a/packages/cursor-vpet/src/webview/sidebar/sidebar-presenter.ts b/packages/cursor-vpet/src/webview/sidebar/sidebar-presenter.ts new file mode 100644 index 0000000..3b6bda2 --- /dev/null +++ b/packages/cursor-vpet/src/webview/sidebar/sidebar-presenter.ts @@ -0,0 +1,22 @@ +import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/get-sidebar-card-inputs.ts" +import type { SidebarSnapshot } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" +import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" +import type { MonsterAnimationIdentity } from "../presentation/monster-animation.ts" +import { toSidebarWebviewPayload, type SidebarWebviewPayload } from "./sidebar-render.ts" + +export type SidebarPresentation = { + readonly payload: SidebarWebviewPayload + readonly partner: MonsterAnimationIdentity | undefined +} + +export const buildSidebarPresentation = (snapshot: SidebarSnapshot | null): SidebarPresentation => { + const reader = { getSidebarSnapshot: () => snapshot } + const inputs = getSidebarCardInputs(reader, DIGIMON_CATALOG) + const model = buildSidebarCardModel(inputs, DEFAULT_VPET_SETTINGS) + const payload = toSidebarWebviewPayload(model) + const partner = + model.kind === "partner" ? { sprite: model.sprite, isDigitama: model.stageNumber === 0 } : undefined + return { payload, partner } +} diff --git a/packages/cursor-vpet/src/webview/sidebar-render.ts b/packages/cursor-vpet/src/webview/sidebar/sidebar-render.ts similarity index 99% rename from packages/cursor-vpet/src/webview/sidebar-render.ts rename to packages/cursor-vpet/src/webview/sidebar/sidebar-render.ts index ea07402..50a762e 100644 --- a/packages/cursor-vpet/src/webview/sidebar-render.ts +++ b/packages/cursor-vpet/src/webview/sidebar/sidebar-render.ts @@ -1,7 +1,7 @@ import type { SidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" -import type { AnimationFramePayload, SidebarWebviewPayload } from "./sidebar/webview-messages.ts" +import type { AnimationFramePayload, SidebarWebviewPayload } from "./webview-messages.ts" -export type { AnimationFramePayload, SidebarWebviewPayload } from "./sidebar/webview-messages.ts" +export type { AnimationFramePayload, SidebarWebviewPayload } from "./webview-messages.ts" const NEXT_CHECK_PREFIX = "Next check: " const NEXT_CHECK_BAR_WIDTH = 20 diff --git a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts index aa23c85..7c5f8dd 100644 --- a/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts +++ b/packages/cursor-vpet/src/webview/vpet-sidebar-provider.ts @@ -1,250 +1 @@ -import * as vscode from "vscode" - -import type { UsageEvolutionTransition } from "@sbugallo/vpet-core/application/models/usage.ts" -import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" -import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" -import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" -import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/get-sidebar-card-inputs.ts" -import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" -import type { EvolutionBattleRepository } from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" -import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" -import { createAnimationSink, type AnimationSink } from "../adapters/vscode/animation-sink.ts" -import { - createVsCodeNotificationPort, - type NotificationPort, -} from "../adapters/vscode/notification-port.ts" -import { createIntervalScheduler, type IntervalScheduler } from "../adapters/vscode/scheduler.ts" -import { createWebviewMessenger } from "../adapters/vscode/webview-messenger.ts" -import { createAsyncRefreshQueue } from "../shared/async-refresh-queue.ts" -import { renderPositionedArtwork } from "./presentation/animated-artwork.ts" -import { runEvolutionBattleSession } from "./presentation/evolution-battle-session.ts" -import { runEvolutionRevealSession } from "./presentation/evolution-reveal-session.ts" -import { MonsterAnimationController, type MonsterAnimationOutput } from "./presentation/monster-animation.ts" -import { parseWebviewInboundMessage, type SidebarWebviewPayload } from "./sidebar/webview-messages.ts" -import { - buildSidebarWebviewHtml, - DEFAULT_ARTWORK_WIDTH, - MIN_ARTWORK_WIDTH, - toSidebarWebviewPayload, -} from "./sidebar-render.ts" - -const VISUAL_INTERVAL_MS = 500 - -export type VpetSidebarProviderOptions = { - readonly notification?: NotificationPort - readonly scheduler?: IntervalScheduler - readonly random?: () => number - readonly nowMs?: () => number -} - -export class VpetSidebarProvider implements vscode.WebviewViewProvider { - public static readonly viewType = "cursorVpet.sidebar" - - private view?: vscode.WebviewView - private messengerSink?: AnimationSink - private cachedPayload?: SidebarWebviewPayload - private cachedArtwork = "" - private artworkWidth = DEFAULT_ARTWORK_WIDTH - private stopVisualInterval?: () => void - private presentationInProgress = false - private pendingEvolutionReveal: UsageEvolutionTransition | undefined - private readonly refreshQueue = createAsyncRefreshQueue() - private readonly notification: NotificationPort - private readonly scheduler: IntervalScheduler - private readonly random: () => number - private readonly nowMs: () => number - private readonly animation: MonsterAnimationController - - constructor( - private readonly extensionUri: vscode.Uri, - private readonly snapshotReader: SidebarSnapshotReader, - private readonly battleRepository: EvolutionBattleRepository, - options: VpetSidebarProviderOptions = {}, - ) { - this.notification = options.notification ?? createVsCodeNotificationPort() - this.scheduler = options.scheduler ?? createIntervalScheduler() - this.random = options.random ?? Math.random - this.nowMs = options.nowMs ?? (() => performance.now()) - this.animation = new MonsterAnimationController(MONSTER_FRAME_CATALOG, this.random, this.nowMs) - } - - isPresentationInProgress(): boolean { - return this.presentationInProgress - } - - queueEvolutionReveal(evolution: UsageEvolutionTransition): void { - this.pendingEvolutionReveal = evolution - } - - resolveWebviewView(webviewView: vscode.WebviewView): void { - this.view = webviewView - this.messengerSink = createAnimationSink(createWebviewMessenger(webviewView.webview)) - webviewView.webview.options = { - enableScripts: true, - localResourceRoots: [this.extensionUri], - } - - webviewView.webview.html = buildSidebarWebviewHtml(String(Date.now())) - - webviewView.webview.onDidReceiveMessage((message: unknown) => { - const inbound = parseWebviewInboundMessage(message) - if (inbound === null) return - if (inbound.type === "open-url") { - void vscode.env.openExternal(vscode.Uri.parse(inbound.url)) - return - } - this.artworkWidth = Math.max(MIN_ARTWORK_WIDTH, Math.floor(inbound.width)) - this.syncAnimationViewport() - void this.postAnimationFrame() - }) - - webviewView.onDidChangeVisibility(() => { - if (webviewView.visible) { - this.startVisualInterval() - void this.refresh() - } else { - this.stopVisualInterval?.() - delete this.stopVisualInterval - } - }) - - if (this.cachedPayload !== undefined) { - void this.messengerSink?.postModel(this.cachedPayload) - } - if (this.cachedArtwork.length > 0) { - void this.messengerSink?.postArtwork(this.cachedArtwork) - } - - if (webviewView.visible) { - this.startVisualInterval() - void this.refresh() - } - } - - async refresh(): Promise { - if (this.view === undefined) return - await this.refreshQueue.run(async () => { - await this.resolvePendingBattleIfNeeded() - await this.playPendingEvolutionReveal() - if (this.view === undefined) return - await this.publishSidebarModel() - }) - } - - dispose(): void { - this.stopVisualInterval?.() - delete this.stopVisualInterval - delete this.view - delete this.messengerSink - } - - private async publishSidebarModel(): Promise { - if (this.view === undefined || this.messengerSink === undefined) return - - const snapshot = this.snapshotReader.getSidebarSnapshot() - const reader = { getSidebarSnapshot: () => snapshot } - const inputs = getSidebarCardInputs(reader, DIGIMON_CATALOG) - const model = buildSidebarCardModel(inputs, DEFAULT_VPET_SETTINGS) - const payload = toSidebarWebviewPayload(model) - this.cachedPayload = payload - await this.messengerSink.postModel(payload) - - if (this.presentationInProgress) return - - this.syncAnimationPartner(model) - await this.postAnimationFrame() - } - - private async resolvePendingBattleIfNeeded(): Promise { - if (this.presentationInProgress) return - - const snapshot = this.snapshotReader.getSidebarSnapshot() - if (snapshot === null) return - if (snapshot.pendingEvolutionTargetId === null || snapshot.battleOpponentNodeId === null) return - - this.presentationInProgress = true - this.stopVisualInterval?.() - delete this.stopVisualInterval - this.cachedArtwork = "" - - try { - await runEvolutionBattleSession(snapshot, this.artworkWidth, { - frameCatalog: MONSTER_FRAME_CATALOG, - digimonCatalog: DIGIMON_CATALOG, - repository: this.battleRepository, - random: this.random, - onArtwork: async (artwork) => this.postArtwork(artwork), - onResolved: async (result) => { - if (result.kind === "won") { - this.pendingEvolutionReveal = undefined - this.notification.showInformation("Victory! Your partner evolved!") - } else if (result.kind === "lost") { - this.notification.showInformation("Defeat! You lost all tokens for this stage.") - } - }, - }) - } finally { - this.presentationInProgress = false - if (this.view?.visible) this.startVisualInterval() - } - } - - private async playPendingEvolutionReveal(): Promise { - const evolution = this.pendingEvolutionReveal - if (evolution === undefined || this.presentationInProgress) return - - this.pendingEvolutionReveal = undefined - this.presentationInProgress = true - this.stopVisualInterval?.() - delete this.stopVisualInterval - this.cachedArtwork = "" - - try { - const revealed = await runEvolutionRevealSession(evolution, this.artworkWidth, { - frameCatalog: MONSTER_FRAME_CATALOG, - digimonCatalog: DIGIMON_CATALOG, - onArtwork: async (artwork) => this.postArtwork(artwork), - }) - if (revealed) { - this.notification.showInformation("Your partner evolved!") - } - } finally { - this.presentationInProgress = false - if (this.view?.visible) this.startVisualInterval() - } - } - - private async postArtwork(artwork: string): Promise { - this.cachedArtwork = artwork - await this.messengerSink?.postArtwork(artwork) - } - - private syncAnimationPartner(model: ReturnType): void { - this.animation.dispatch({ - kind: "partner_changed", - partner: model.kind === "partner" ? { sprite: model.sprite, isDigitama: model.stageNumber === 0 } : undefined, - }) - } - - private syncAnimationViewport(): void { - this.animation.dispatch({ kind: "viewport_resized", width: this.artworkWidth }) - } - - private startVisualInterval(): void { - if (this.stopVisualInterval !== undefined) return - this.stopVisualInterval = this.scheduler.start(() => { - if (this.view === undefined || !this.view.visible || this.presentationInProgress) return - const nextAnimation = this.animation.dispatch({ kind: "tick" }) - void this.postAnimationFrame(nextAnimation) - }, VISUAL_INTERVAL_MS) - } - - private async postAnimationFrame(animation?: MonsterAnimationOutput): Promise { - if (this.view === undefined || this.presentationInProgress) return - const output = animation ?? this.animation.output() - const artwork = renderPositionedArtwork(output, this.artworkWidth) - if (artwork === this.cachedArtwork) return - this.cachedArtwork = artwork - await this.messengerSink?.postArtwork(artwork) - } -} +export { VpetSidebarProvider, type VpetSidebarProviderOptions } from "./sidebar/provider.ts" diff --git a/packages/cursor-vpet/tests/sidebar-presenter.test.ts b/packages/cursor-vpet/tests/sidebar-presenter.test.ts new file mode 100644 index 0000000..83c6f5f --- /dev/null +++ b/packages/cursor-vpet/tests/sidebar-presenter.test.ts @@ -0,0 +1,11 @@ +import { describe, expect, test } from "bun:test" + +import { buildSidebarPresentation } from "../src/webview/sidebar/sidebar-presenter.ts" + +describe("sidebar presenter", () => { + test("builds no_partner payload when snapshot is null", () => { + const presentation = buildSidebarPresentation(null) + expect(presentation.payload.kind).toBe("no_partner") + expect(presentation.partner).toBeUndefined() + }) +}) diff --git a/packages/cursor-vpet/tests/sidebar-render.test.ts b/packages/cursor-vpet/tests/sidebar-render.test.ts index c304592..e524ce7 100644 --- a/packages/cursor-vpet/tests/sidebar-render.test.ts +++ b/packages/cursor-vpet/tests/sidebar-render.test.ts @@ -5,7 +5,7 @@ import { buildNextCheckLine, pixelWidthToArtworkColumns, toSidebarWebviewPayload, -} from "../src/webview/sidebar-render.ts" +} from "../src/webview/sidebar/sidebar-render.ts" describe("sidebar render", () => { test("converts pixel width to monospace artwork columns", () => { From 5f75bf65f8bcfa288fc41a1451dda87a7b463a84 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 19:43:49 +0900 Subject: [PATCH 19/41] refactor(cursor-vpet): modular bootstrap and thin extension entrypoint Extract container wiring, command registration, sidebar setup, and usage pipeline so extension.ts only orchestrates activation. Co-authored-by: Cursor --- .../src/application/usage-pipeline.ts | 14 ++ .../cursor-vpet/src/bootstrap/container.ts | 53 +++++++ .../cursor-vpet/src/bootstrap/ensure-hooks.ts | 21 +++ .../src/bootstrap/register-commands.ts | 55 ++++++++ .../src/bootstrap/register-sidebar.ts | 13 ++ packages/cursor-vpet/src/extension.ts | 133 +++--------------- 6 files changed, 175 insertions(+), 114 deletions(-) create mode 100644 packages/cursor-vpet/src/application/usage-pipeline.ts create mode 100644 packages/cursor-vpet/src/bootstrap/container.ts create mode 100644 packages/cursor-vpet/src/bootstrap/ensure-hooks.ts create mode 100644 packages/cursor-vpet/src/bootstrap/register-commands.ts create mode 100644 packages/cursor-vpet/src/bootstrap/register-sidebar.ts diff --git a/packages/cursor-vpet/src/application/usage-pipeline.ts b/packages/cursor-vpet/src/application/usage-pipeline.ts new file mode 100644 index 0000000..3b369f3 --- /dev/null +++ b/packages/cursor-vpet/src/application/usage-pipeline.ts @@ -0,0 +1,14 @@ +import type { UsageProcessingResult } from "@sbugallo/vpet-core/application/models/usage.ts" +import type { UsageLedger } from "@sbugallo/vpet-core/application/ports/usage-ledger.ts" +import { createCursorUsageEventSource, type CursorUsageEventSource } from "../adapters/cursor/cursor-usage-event-source.ts" + +export type UsagePipeline = CursorUsageEventSource + +export const createUsagePipeline = ( + ledger: UsageLedger, + onApplied: (result: UsageProcessingResult) => void, + options: { readonly settleDelayMs: number }, +): UsagePipeline => + createCursorUsageEventSource(ledger, onApplied, { + settleDelayMs: options.settleDelayMs, + }) diff --git a/packages/cursor-vpet/src/bootstrap/container.ts b/packages/cursor-vpet/src/bootstrap/container.ts new file mode 100644 index 0000000..6426f9b --- /dev/null +++ b/packages/cursor-vpet/src/bootstrap/container.ts @@ -0,0 +1,53 @@ +import { join } from "node:path" +import * as vscode from "vscode" + +import { configureSqlJsWasmPath } from "../adapters/sqlite/sqljs-config.ts" +import { createDatabaseChangeWatcher } from "../adapters/sqlite/database-change-watcher.ts" +import { + createSqliteVpetRepository, + type CursorSqliteVpetRepository, +} from "../adapters/sqlite/sqlite-vpet-write-store.ts" +import { getVpetExtensionSettings, toDatabaseOptions, type VpetExtensionSettings } from "../config/extension-settings.ts" +import { VpetSidebarProvider } from "../webview/vpet-sidebar-provider.ts" + +export type VpetContainer = { + readonly repository: CursorSqliteVpetRepository + readonly sidebarProvider: VpetSidebarProvider + readonly readSettings: () => VpetExtensionSettings + readonly databaseOptions: () => ReturnType + readonly refreshSidebar: () => void +} + +export const createVpetContainer = async (context: vscode.ExtensionContext): Promise => { + configureSqlJsWasmPath(join(context.extensionPath, "dist", "sql-wasm.wasm")) + + const readSettings = () => getVpetExtensionSettings() + const databaseOptions = () => toDatabaseOptions(readSettings()) + + const repository = await createSqliteVpetRepository(databaseOptions()) + context.subscriptions.push({ dispose: () => repository.close() }) + + const sidebarProvider = new VpetSidebarProvider(context.extensionUri, repository, repository) + const refreshSidebar = (): void => { + void sidebarProvider.refresh() + } + + const databaseWatcher = createDatabaseChangeWatcher({ + ...databaseOptions(), + onChange: () => { + repository.reloadFromDisk() + if (sidebarProvider.isPresentationInProgress() !== true) { + refreshSidebar() + } + }, + }) + context.subscriptions.push({ dispose: () => databaseWatcher.dispose() }) + + return { + repository, + sidebarProvider, + readSettings, + databaseOptions, + refreshSidebar, + } +} diff --git a/packages/cursor-vpet/src/bootstrap/ensure-hooks.ts b/packages/cursor-vpet/src/bootstrap/ensure-hooks.ts new file mode 100644 index 0000000..96d260a --- /dev/null +++ b/packages/cursor-vpet/src/bootstrap/ensure-hooks.ts @@ -0,0 +1,21 @@ +import { join } from "node:path" +import * as vscode from "vscode" + +import { installVpetHooks } from "../adapters/cursor/install-hooks.ts" + +export const ensureHooksInstalled = async (context: vscode.ExtensionContext): Promise => { + const key = "vpet.hooksInstalled" + if (context.globalState.get(key) === true) return + + const choice = await vscode.window.showInformationMessage( + "Cursor VPet needs to register hooks in ~/.cursor/hooks.json to track Agent usage.", + "Install hooks", + "Not now", + ) + if (choice !== "Install hooks") return + + const bridgePath = join(context.extensionPath, "hook-bridge.js") + const result = installVpetHooks(bridgePath) + await context.globalState.update(key, true) + vscode.window.showInformationMessage(`VPet hooks installed at ${result.hooksPath}`) +} diff --git a/packages/cursor-vpet/src/bootstrap/register-commands.ts b/packages/cursor-vpet/src/bootstrap/register-commands.ts new file mode 100644 index 0000000..86a559a --- /dev/null +++ b/packages/cursor-vpet/src/bootstrap/register-commands.ts @@ -0,0 +1,55 @@ +import { join } from "node:path" +import * as vscode from "vscode" + +import { spawnPartner } from "@sbugallo/vpet-core/application/use-cases/spawn-partner.ts" +import { freezeVpet } from "@sbugallo/vpet-core/application/use-cases/freeze-vpet.ts" +import { unfreezeVpet } from "@sbugallo/vpet-core/application/use-cases/unfreeze-vpet.ts" +import { setVpetCheatNode } from "@sbugallo/vpet-core/application/use-cases/set-vpet-cheat-node.ts" +import { installVpetHooks, uninstallVpetHooks } from "../adapters/cursor/install-hooks.ts" +import { openDexPanel } from "../webview/dex-panel.ts" +import { openHistoryPanel } from "../webview/history-panel.ts" +import type { VpetContainer } from "./container.ts" + +export const registerCommands = (context: vscode.ExtensionContext, container: VpetContainer): void => { + const { repository, databaseOptions, refreshSidebar } = container + + context.subscriptions.push( + vscode.workspace.onDidChangeConfiguration((event) => { + if (!event.affectsConfiguration("vpet")) return + vscode.window.showInformationMessage("VPet settings changed. Reload the window to apply database path changes.") + }), + vscode.commands.registerCommand("cursorVpet.spawn", async () => { + spawnPartner(repository, new Date().toISOString()) + vscode.window.showInformationMessage("VPet partner spawned.") + refreshSidebar() + }), + vscode.commands.registerCommand("cursorVpet.freeze", async () => { + const result = freezeVpet(repository) + vscode.window.showInformationMessage(result.kind === "frozen" ? "VPet frozen." : "VPet already frozen.") + refreshSidebar() + }), + vscode.commands.registerCommand("cursorVpet.unfreeze", async () => { + const result = unfreezeVpet(repository) + vscode.window.showInformationMessage(result.kind === "unfrozen" ? "VPet unfrozen." : "VPet already active.") + refreshSidebar() + }), + vscode.commands.registerCommand("cursorVpet.set", async () => { + const nodeId = await vscode.window.showInputBox({ prompt: "Digimon node ID (e.g. 0-001)" }) + if (nodeId === undefined || nodeId.length === 0) return + const result = setVpetCheatNode(repository, nodeId) + vscode.window.showInformationMessage(`Set result: ${result.kind}`) + refreshSidebar() + }), + vscode.commands.registerCommand("cursorVpet.dex", () => openDexPanel(context, databaseOptions())), + vscode.commands.registerCommand("cursorVpet.history", () => openHistoryPanel(context, databaseOptions())), + vscode.commands.registerCommand("cursorVpet.installHooks", async () => { + const bridgePath = join(context.extensionPath, "hook-bridge.js") + installVpetHooks(bridgePath) + await context.globalState.update("vpet.hooksInstalled", true) + }), + vscode.commands.registerCommand("cursorVpet.uninstallHooks", () => { + uninstallVpetHooks() + void context.globalState.update("vpet.hooksInstalled", false) + }), + ) +} diff --git a/packages/cursor-vpet/src/bootstrap/register-sidebar.ts b/packages/cursor-vpet/src/bootstrap/register-sidebar.ts new file mode 100644 index 0000000..a1b16c6 --- /dev/null +++ b/packages/cursor-vpet/src/bootstrap/register-sidebar.ts @@ -0,0 +1,13 @@ +import * as vscode from "vscode" + +import { VpetSidebarProvider } from "../webview/vpet-sidebar-provider.ts" +import type { VpetContainer } from "./container.ts" + +export const registerSidebar = (context: vscode.ExtensionContext, container: VpetContainer): void => { + context.subscriptions.push( + vscode.window.registerWebviewViewProvider(VpetSidebarProvider.viewType, container.sidebarProvider, { + webviewOptions: { retainContextWhenHidden: true }, + }), + { dispose: () => container.sidebarProvider.dispose() }, + ) +} diff --git a/packages/cursor-vpet/src/extension.ts b/packages/cursor-vpet/src/extension.ts index 806ea59..d053975 100644 --- a/packages/cursor-vpet/src/extension.ts +++ b/packages/cursor-vpet/src/extension.ts @@ -1,136 +1,41 @@ import { existsSync } from "node:fs" -import { join } from "node:path" import * as vscode from "vscode" -import { spawnPartner } from "@sbugallo/vpet-core/application/use-cases/spawn-partner.ts" -import { freezeVpet } from "@sbugallo/vpet-core/application/use-cases/freeze-vpet.ts" -import { unfreezeVpet } from "@sbugallo/vpet-core/application/use-cases/unfreeze-vpet.ts" -import { setVpetCheatNode } from "@sbugallo/vpet-core/application/use-cases/set-vpet-cheat-node.ts" -import { createCursorUsageEventSource } from "./adapters/cursor/cursor-usage-event-source.ts" -import { installVpetHooks, uninstallVpetHooks } from "./adapters/cursor/install-hooks.ts" import { resolveStateVscdbPath } from "./adapters/cursor/paths.ts" -import { configureSqlJsWasmPath } from "./adapters/sqlite/sqljs-config.ts" -import { createDatabaseChangeWatcher } from "./adapters/sqlite/database-change-watcher.ts" -import { createSqliteVpetRepository } from "./adapters/sqlite/sqlite-vpet-write-store.ts" -import { getVpetExtensionSettings, toDatabaseOptions } from "./config/extension-settings.ts" -import { openDexPanel } from "./webview/dex-panel.ts" -import { openHistoryPanel } from "./webview/history-panel.ts" -import { VpetSidebarProvider } from "./webview/vpet-sidebar-provider.ts" - -let sidebarProvider: VpetSidebarProvider | undefined +import { createUsagePipeline } from "./application/usage-pipeline.ts" +import { createVpetContainer } from "./bootstrap/container.ts" +import { ensureHooksInstalled } from "./bootstrap/ensure-hooks.ts" +import { registerCommands } from "./bootstrap/register-commands.ts" +import { registerSidebar } from "./bootstrap/register-sidebar.ts" const isCursorRuntime = (): boolean => existsSync(resolveStateVscdbPath()) -const ensureHooksInstalled = async (context: vscode.ExtensionContext): Promise => { - const key = "vpet.hooksInstalled" - if (context.globalState.get(key) === true) return - - const choice = await vscode.window.showInformationMessage( - "Cursor VPet needs to register hooks in ~/.cursor/hooks.json to track Agent usage.", - "Install hooks", - "Not now", - ) - if (choice !== "Install hooks") return - - const bridgePath = join(context.extensionPath, "hook-bridge.js") - const result = installVpetHooks(bridgePath) - await context.globalState.update(key, true) - vscode.window.showInformationMessage(`VPet hooks installed at ${result.hooksPath}`) -} - export async function activate(context: vscode.ExtensionContext): Promise { - configureSqlJsWasmPath(join(context.extensionPath, "dist", "sql-wasm.wasm")) - if (!isCursorRuntime()) { vscode.window.showWarningMessage("Cursor VPet: token tracking requires Cursor (state.vscdb not found).") } - const readSettings = () => getVpetExtensionSettings() - const databaseOptions = () => toDatabaseOptions(readSettings()) + const container = await createVpetContainer(context) + registerSidebar(context, container) + registerCommands(context, container) - const repository = await createSqliteVpetRepository(databaseOptions()) - context.subscriptions.push({ dispose: () => repository.close() }) - - sidebarProvider = new VpetSidebarProvider(context.extensionUri, repository, repository) - context.subscriptions.push( - vscode.window.registerWebviewViewProvider(VpetSidebarProvider.viewType, sidebarProvider, { - webviewOptions: { retainContextWhenHidden: true }, - }), - { dispose: () => sidebarProvider?.dispose() }, - ) - - const refreshSidebar = (): void => { - void sidebarProvider?.refresh() - } - - const usageSource = createCursorUsageEventSource(repository, (result) => { - if (result.kind === "applied" && result.evolution !== undefined) { - sidebarProvider?.queueEvolutionReveal(result.evolution) - } - refreshSidebar() - }, { - settleDelayMs: readSettings().settleDelayMs, - }) - context.subscriptions.push(usageSource) - - const databaseWatcher = createDatabaseChangeWatcher({ - ...databaseOptions(), - onChange: () => { - repository.reloadFromDisk() - if (sidebarProvider?.isPresentationInProgress() !== true) { - refreshSidebar() + const usageSource = createUsagePipeline( + container.repository, + (result) => { + if (result.kind === "applied" && result.evolution !== undefined) { + container.sidebarProvider.queueEvolutionReveal(result.evolution) } + container.refreshSidebar() }, - }) - context.subscriptions.push({ dispose: () => databaseWatcher.dispose() }) - - context.subscriptions.push( - vscode.workspace.onDidChangeConfiguration((event) => { - if (!event.affectsConfiguration("vpet")) return - vscode.window.showInformationMessage("VPet settings changed. Reload the window to apply database path changes.") - }), - vscode.commands.registerCommand("cursorVpet.spawn", async () => { - spawnPartner(repository, new Date().toISOString()) - vscode.window.showInformationMessage("VPet partner spawned.") - refreshSidebar() - }), - vscode.commands.registerCommand("cursorVpet.freeze", async () => { - const result = freezeVpet(repository) - vscode.window.showInformationMessage(result.kind === "frozen" ? "VPet frozen." : "VPet already frozen.") - refreshSidebar() - }), - vscode.commands.registerCommand("cursorVpet.unfreeze", async () => { - const result = unfreezeVpet(repository) - vscode.window.showInformationMessage(result.kind === "unfrozen" ? "VPet unfrozen." : "VPet already active.") - refreshSidebar() - }), - vscode.commands.registerCommand("cursorVpet.set", async () => { - const nodeId = await vscode.window.showInputBox({ prompt: "Digimon node ID (e.g. 0-001)" }) - if (nodeId === undefined || nodeId.length === 0) return - const result = setVpetCheatNode(repository, nodeId) - vscode.window.showInformationMessage(`Set result: ${result.kind}`) - refreshSidebar() - }), - vscode.commands.registerCommand("cursorVpet.dex", () => openDexPanel(context, databaseOptions())), - vscode.commands.registerCommand("cursorVpet.history", () => openHistoryPanel(context, databaseOptions())), - vscode.commands.registerCommand("cursorVpet.installHooks", async () => { - const bridgePath = join(context.extensionPath, "hook-bridge.js") - installVpetHooks(bridgePath) - await context.globalState.update("vpet.hooksInstalled", true) - }), - vscode.commands.registerCommand("cursorVpet.uninstallHooks", () => { - uninstallVpetHooks() - void context.globalState.update("vpet.hooksInstalled", false) - }), + { settleDelayMs: container.readSettings().settleDelayMs }, ) + context.subscriptions.push(usageSource) - const poll = setInterval(refreshSidebar, 30_000) + const poll = setInterval(container.refreshSidebar, 30_000) context.subscriptions.push({ dispose: () => clearInterval(poll) }) await ensureHooksInstalled(context) - refreshSidebar() + container.refreshSidebar() } -export function deactivate(): void { - sidebarProvider = undefined -} +export function deactivate(): void {} From 8bdf273596b0ab465cfe0d494837f84d06dc9474 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 19:44:13 +0900 Subject: [PATCH 20/41] refactor(cursor-vpet): secure panels and move under webview/panels Escape HTML in Dex and History panels and relocate panel modules to match the recommended folder structure. Co-authored-by: Cursor --- .../cursor-vpet/src/bootstrap/register-commands.ts | 4 ++-- packages/cursor-vpet/src/shared/escape-html.ts | 6 ++++++ .../src/webview/{ => panels}/dex-panel.ts | 13 +++++++++---- .../src/webview/{ => panels}/history-panel.ts | 10 ++++++---- packages/cursor-vpet/tests/escape-html.test.ts | 9 +++++++++ 5 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 packages/cursor-vpet/src/shared/escape-html.ts rename packages/cursor-vpet/src/webview/{ => panels}/dex-panel.ts (67%) rename packages/cursor-vpet/src/webview/{ => panels}/history-panel.ts (66%) create mode 100644 packages/cursor-vpet/tests/escape-html.test.ts diff --git a/packages/cursor-vpet/src/bootstrap/register-commands.ts b/packages/cursor-vpet/src/bootstrap/register-commands.ts index 86a559a..7fba23f 100644 --- a/packages/cursor-vpet/src/bootstrap/register-commands.ts +++ b/packages/cursor-vpet/src/bootstrap/register-commands.ts @@ -6,8 +6,8 @@ import { freezeVpet } from "@sbugallo/vpet-core/application/use-cases/freeze-vpe import { unfreezeVpet } from "@sbugallo/vpet-core/application/use-cases/unfreeze-vpet.ts" import { setVpetCheatNode } from "@sbugallo/vpet-core/application/use-cases/set-vpet-cheat-node.ts" import { installVpetHooks, uninstallVpetHooks } from "../adapters/cursor/install-hooks.ts" -import { openDexPanel } from "../webview/dex-panel.ts" -import { openHistoryPanel } from "../webview/history-panel.ts" +import { openDexPanel } from "../webview/panels/dex-panel.ts" +import { openHistoryPanel } from "../webview/panels/history-panel.ts" import type { VpetContainer } from "./container.ts" export const registerCommands = (context: vscode.ExtensionContext, container: VpetContainer): void => { diff --git a/packages/cursor-vpet/src/shared/escape-html.ts b/packages/cursor-vpet/src/shared/escape-html.ts new file mode 100644 index 0000000..3580bd4 --- /dev/null +++ b/packages/cursor-vpet/src/shared/escape-html.ts @@ -0,0 +1,6 @@ +export const escapeHtml = (value: string): string => + value + .replaceAll("&", "&") + .replaceAll("<", "<") + .replaceAll(">", ">") + .replaceAll('"', """) diff --git a/packages/cursor-vpet/src/webview/dex-panel.ts b/packages/cursor-vpet/src/webview/panels/dex-panel.ts similarity index 67% rename from packages/cursor-vpet/src/webview/dex-panel.ts rename to packages/cursor-vpet/src/webview/panels/dex-panel.ts index 2a00039..3acf0f2 100644 --- a/packages/cursor-vpet/src/webview/dex-panel.ts +++ b/packages/cursor-vpet/src/webview/panels/dex-panel.ts @@ -3,8 +3,9 @@ import * as vscode from "vscode" import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { buildDexViewModel } from "@sbugallo/vpet-core/view-models/dex-view-model.ts" -import type { CreateSqliteVpetArchiveReaderOptions } from "../adapters/sqlite/sqlite-vpet-archive-reader.ts" -import { readArchive } from "../adapters/sqlite/sqlite-vpet-archive-reader.ts" +import type { CreateSqliteVpetArchiveReaderOptions } from "../../adapters/sqlite/sqlite-vpet-archive-reader.ts" +import { readArchive } from "../../adapters/sqlite/sqlite-vpet-archive-reader.ts" +import { escapeHtml } from "../../shared/escape-html.ts" export const openDexPanel = async ( context: vscode.ExtensionContext, @@ -15,14 +16,18 @@ export const openDexPanel = async ( const panel = vscode.window.createWebviewPanel("cursorVpetDex", "VPet Dex", vscode.ViewColumn.One, {}) if (model.kind !== "available") { - panel.webview.html = `${model.kind === "empty" ? "No discoveries yet." : model.message}` + const message = model.kind === "empty" ? "No discoveries yet." : escapeHtml(model.message) + panel.webview.html = `${message}` context.subscriptions.push(panel) return } const discoveredCount = model.rows.filter((row) => row.discovered).length const rows = model.rows - .map((row) => `${row.name}${row.stage}${row.discovered ? "✓" : "—"}`) + .map( + (row) => + `${escapeHtml(row.name)}${escapeHtml(row.stage)}${row.discovered ? "✓" : "—"}`, + ) .join("") panel.webview.html = `

VPet Dex

diff --git a/packages/cursor-vpet/src/webview/history-panel.ts b/packages/cursor-vpet/src/webview/panels/history-panel.ts similarity index 66% rename from packages/cursor-vpet/src/webview/history-panel.ts rename to packages/cursor-vpet/src/webview/panels/history-panel.ts index 2d7f2df..e0d0cdf 100644 --- a/packages/cursor-vpet/src/webview/history-panel.ts +++ b/packages/cursor-vpet/src/webview/panels/history-panel.ts @@ -3,8 +3,9 @@ import * as vscode from "vscode" import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { buildHistoryViewModel } from "@sbugallo/vpet-core/view-models/history-view-model.ts" -import type { CreateSqliteVpetArchiveReaderOptions } from "../adapters/sqlite/sqlite-vpet-archive-reader.ts" -import { readArchive } from "../adapters/sqlite/sqlite-vpet-archive-reader.ts" +import type { CreateSqliteVpetArchiveReaderOptions } from "../../adapters/sqlite/sqlite-vpet-archive-reader.ts" +import { readArchive } from "../../adapters/sqlite/sqlite-vpet-archive-reader.ts" +import { escapeHtml } from "../../shared/escape-html.ts" export const openHistoryPanel = async ( context: vscode.ExtensionContext, @@ -15,7 +16,8 @@ export const openHistoryPanel = async ( const panel = vscode.window.createWebviewPanel("cursorVpetHistory", "VPet History", vscode.ViewColumn.One, {}) if (model.kind !== "available") { - panel.webview.html = `${model.kind === "empty" ? "No history yet." : model.message}` + const message = model.kind === "empty" ? "No history yet." : escapeHtml(model.message) + panel.webview.html = `${message}` context.subscriptions.push(panel) return } @@ -23,7 +25,7 @@ export const openHistoryPanel = async ( const rows = model.generations .map( (generation) => - `Gen ${generation.generation}${generation.path.join(" → ")}${generation.createdAt}`, + `Gen ${generation.generation}${escapeHtml(generation.path.join(" → "))}${escapeHtml(generation.createdAt)}`, ) .join("") panel.webview.html = ` diff --git a/packages/cursor-vpet/tests/escape-html.test.ts b/packages/cursor-vpet/tests/escape-html.test.ts new file mode 100644 index 0000000..cbfcd90 --- /dev/null +++ b/packages/cursor-vpet/tests/escape-html.test.ts @@ -0,0 +1,9 @@ +import { describe, expect, test } from "bun:test" + +import { escapeHtml } from "../src/shared/escape-html.ts" + +describe("escapeHtml", () => { + test("escapes HTML special characters", () => { + expect(escapeHtml(``)).toBe("<script>"&"</script>") + }) +}) From cd5895c61704d7fe4216422390a1ccf0a39be379 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 19:45:00 +0900 Subject: [PATCH 21/41] test(cursor-vpet): expand MonsterAnimationController coverage Add exhaustive state-machine cases for walking, digitama, sleep, viewport, and activity transitions per architecture analysis. Co-authored-by: Cursor --- .../tests/monster-animation.test.ts | 93 ++++++++++++++++++- 1 file changed, 91 insertions(+), 2 deletions(-) diff --git a/packages/cursor-vpet/tests/monster-animation.test.ts b/packages/cursor-vpet/tests/monster-animation.test.ts index a29c39c..b9a1662 100644 --- a/packages/cursor-vpet/tests/monster-animation.test.ts +++ b/packages/cursor-vpet/tests/monster-animation.test.ts @@ -3,14 +3,103 @@ import { describe, expect, test } from "bun:test" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { MonsterAnimationController } from "../src/webview/presentation/monster-animation.ts" +const SLEEP_AFTER_MS = 300_000 + describe("monster animation", () => { - test("dispatches partner_changed without performance.now binding errors", () => { + test("returns blank when partner is cleared", () => { + const controller = new MonsterAnimationController(MONSTER_FRAME_CATALOG) + controller.dispatch({ kind: "partner_changed", partner: { sprite: "agumon", isDigitama: false } }) + const output = controller.dispatch({ kind: "partner_changed", partner: undefined }) + expect(output.kind).toBe("blank") + expect(output.result.kind).toBe("blank") + }) + + test("dispatches partner_changed into a walking frame", () => { const controller = new MonsterAnimationController(MONSTER_FRAME_CATALOG) const output = controller.dispatch({ kind: "partner_changed", partner: { sprite: "agumon", isDigitama: false }, }) - + expect(output.kind).toBe("walking") expect(output.result.kind).toBe("frame") }) + + test("uses digitama state for stage zero partners", () => { + const controller = new MonsterAnimationController(MONSTER_FRAME_CATALOG) + const output = controller.dispatch({ + kind: "partner_changed", + partner: { sprite: "agumon", isDigitama: true }, + }) + expect(output.kind).toBe("digitama") + }) + + test("marks unknown sprites as unavailable", () => { + const controller = new MonsterAnimationController(MONSTER_FRAME_CATALOG) + const output = controller.dispatch({ + kind: "partner_changed", + partner: { sprite: "missing-sprite", isDigitama: false }, + }) + expect(output.kind).toBe("unavailable") + expect(output.result.kind).toBe("unavailable") + }) + + test("keeps state when the same partner is dispatched again", () => { + const controller = new MonsterAnimationController(MONSTER_FRAME_CATALOG) + const first = controller.dispatch({ + kind: "partner_changed", + partner: { sprite: "agumon", isDigitama: false }, + }) + const second = controller.dispatch({ + kind: "partner_changed", + partner: { sprite: "agumon", isDigitama: false }, + }) + expect(second).toEqual(first) + }) + + test("advances walking animation on tick", () => { + const controller = new MonsterAnimationController(MONSTER_FRAME_CATALOG, () => 0.5) + controller.dispatch({ kind: "partner_changed", partner: { sprite: "agumon", isDigitama: false } }) + const before = controller.output() + const after = controller.dispatch({ kind: "tick" }) + expect(after.kind).toBe("walking") + expect(after.result.kind).toBe("frame") + if (before.result.kind === "frame" && after.result.kind === "frame") { + expect(after !== before || after.offset !== before.offset || after.facing !== before.facing).toBe(true) + } + }) + + test("resizes walking policy on viewport changes", () => { + const controller = new MonsterAnimationController(MONSTER_FRAME_CATALOG, () => 0.5) + controller.dispatch({ kind: "partner_changed", partner: { sprite: "agumon", isDigitama: false } }) + const resized = controller.dispatch({ kind: "viewport_resized", width: 80 }) + expect(resized.kind).toBe("walking") + }) + + test("enters sleeping state after inactivity timeout", () => { + let now = 0 + const controller = new MonsterAnimationController(MONSTER_FRAME_CATALOG, () => 0.5, () => now) + controller.dispatch({ kind: "partner_changed", partner: { sprite: "agumon", isDigitama: false } }) + now = SLEEP_AFTER_MS + const output = controller.dispatch({ kind: "tick" }) + expect(output.kind).toBe("sleeping") + }) + + test("wakes from sleeping on activity", () => { + let now = 0 + const controller = new MonsterAnimationController(MONSTER_FRAME_CATALOG, () => 0.5, () => now) + controller.dispatch({ kind: "partner_changed", partner: { sprite: "agumon", isDigitama: false } }) + now = SLEEP_AFTER_MS + controller.dispatch({ kind: "tick" }) + now = SLEEP_AFTER_MS + 1 + const output = controller.dispatch({ kind: "activity" }) + expect(output.kind).toBe("walking") + }) + + test("setSprite helper maps to partner_changed", () => { + const controller = new MonsterAnimationController(MONSTER_FRAME_CATALOG) + controller.setSprite("agumon") + expect(controller.get().kind).toBe("frame") + controller.setSprite(undefined) + expect(controller.get().kind).toBe("blank") + }) }) From 6f910f9aef55ae49ea36d27004c65fa6ac1ee19d Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 19:53:11 +0900 Subject: [PATCH 22/41] style(cursor-vpet): standardize import grouping order Group imports as third-party, @sbugallo workspace packages, then relative paths across src and tests. Co-authored-by: Cursor --- .../src/adapters/cursor/cursor-api-watermark.ts | 3 ++- .../cursor-vpet/src/adapters/cursor/cursor-auth.ts | 1 + .../src/adapters/cursor/cursor-stop-mapper.ts | 1 + .../adapters/cursor/cursor-usage-event-source.ts | 3 ++- .../src/adapters/cursor/install-hooks.ts | 1 + .../src/adapters/sqlite/database-change-watcher.ts | 2 +- .../sqlite/sqlite-sidebar-snapshot-reader.ts | 11 ++++++----- .../adapters/sqlite/sqlite-vpet-archive-reader.ts | 13 +++++++------ .../src/adapters/sqlite/sqlite-vpet-write-store.ts | 3 ++- .../cursor-vpet/src/adapters/sqlite/sqljs-driver.ts | 1 + .../cursor-vpet/src/application/usage-pipeline.ts | 1 + packages/cursor-vpet/src/bootstrap/container.ts | 2 +- .../cursor-vpet/src/bootstrap/register-commands.ts | 5 +++-- .../cursor-vpet/src/webview/panels/dex-panel.ts | 3 ++- .../cursor-vpet/src/webview/panels/history-panel.ts | 3 ++- .../src/webview/presentation/animated-artwork.ts | 2 +- .../src/webview/presentation/defeat-artwork.ts | 1 + .../src/webview/presentation/evolution-artwork.ts | 3 ++- .../presentation/evolution-battle-artwork.ts | 1 + .../presentation/evolution-battle-session.ts | 2 +- .../webview/presentation/monster-action-policy.ts | 1 + .../src/webview/presentation/monster-animation.ts | 1 + .../webview/presentation/monster-walking-policy.ts | 1 + .../cursor-vpet/src/webview/sidebar/provider.ts | 1 + .../src/webview/sidebar/sidebar-animation-host.ts | 1 + .../src/webview/sidebar/sidebar-orchestrator.ts | 5 +++-- .../src/webview/sidebar/sidebar-presenter.ts | 5 +++-- .../src/webview/sidebar/sidebar-render.ts | 1 + .../cursor-vpet/tests/cursor-api-watermark.test.ts | 1 + .../cursor-vpet/tests/cursor-stop-mapper.test.ts | 1 + packages/cursor-vpet/tests/defeat-artwork.test.ts | 1 + .../cursor-vpet/tests/evolution-artwork.test.ts | 1 + .../tests/evolution-battle-artwork.test.ts | 1 + .../tests/evolution-battle-session.test.ts | 1 + .../tests/evolution-reveal-session.test.ts | 1 + .../cursor-vpet/tests/monster-animation.test.ts | 1 + .../sqljs-vpet-repository.persistence.test.ts | 1 + 37 files changed, 60 insertions(+), 27 deletions(-) diff --git a/packages/cursor-vpet/src/adapters/cursor/cursor-api-watermark.ts b/packages/cursor-vpet/src/adapters/cursor/cursor-api-watermark.ts index 6c9161e..1ce7cd6 100644 --- a/packages/cursor-vpet/src/adapters/cursor/cursor-api-watermark.ts +++ b/packages/cursor-vpet/src/adapters/cursor/cursor-api-watermark.ts @@ -1,7 +1,8 @@ import type { CompletedUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" + import { sleep } from "../../shared/sleep.ts" -import type { UsageApiEvent, UsageApiResponse, UsageWatermark } from "./types.ts" import { readCursorAccessToken } from "./cursor-auth.ts" +import type { UsageApiEvent, UsageApiResponse, UsageWatermark } from "./types.ts" const USAGE_EVENTS_URL = "https://cursor.com/api/dashboard/get-filtered-usage-events" diff --git a/packages/cursor-vpet/src/adapters/cursor/cursor-auth.ts b/packages/cursor-vpet/src/adapters/cursor/cursor-auth.ts index 30d5095..87672b7 100644 --- a/packages/cursor-vpet/src/adapters/cursor/cursor-auth.ts +++ b/packages/cursor-vpet/src/adapters/cursor/cursor-auth.ts @@ -1,5 +1,6 @@ import { readFileSync } from "node:fs" import type { Database } from "sql.js" + import { getSqlRuntime } from "../sqlite/sqljs-config.ts" import { resolveStateVscdbPath } from "./paths.ts" diff --git a/packages/cursor-vpet/src/adapters/cursor/cursor-stop-mapper.ts b/packages/cursor-vpet/src/adapters/cursor/cursor-stop-mapper.ts index 88d069e..005730e 100644 --- a/packages/cursor-vpet/src/adapters/cursor/cursor-stop-mapper.ts +++ b/packages/cursor-vpet/src/adapters/cursor/cursor-stop-mapper.ts @@ -1,4 +1,5 @@ import type { CompletedUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" + import type { CursorHookPayload } from "./types.ts" export const hasStopTokens = (payload: CursorHookPayload): boolean => { diff --git a/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts b/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts index 4f060c2..d861978 100644 --- a/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts +++ b/packages/cursor-vpet/src/adapters/cursor/cursor-usage-event-source.ts @@ -4,12 +4,13 @@ import { open, stat, writeFile } from "node:fs/promises" import type { UsageProcessingResult } from "@sbugallo/vpet-core/application/models/usage.ts" import type { UsageLedger } from "@sbugallo/vpet-core/application/ports/usage-ledger.ts" import { recordUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" +import type { CompletedUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { STAGE_GAUGE_THRESHOLDS } from "@sbugallo/vpet-core/domain/evolution.ts" + import { captureWatermark, settleTurnDelta } from "./cursor-api-watermark.ts" import { hasStopTokens, toCompletedUsageFromStop } from "./cursor-stop-mapper.ts" import { resolveHookEventsPath } from "./paths.ts" -import type { CompletedUsage } from "@sbugallo/vpet-core/application/use-cases/record-usage.ts" import type { HookEventRecord, UsageWatermark } from "./types.ts" type TurnState = { diff --git a/packages/cursor-vpet/src/adapters/cursor/install-hooks.ts b/packages/cursor-vpet/src/adapters/cursor/install-hooks.ts index 1fe9119..3676ac0 100644 --- a/packages/cursor-vpet/src/adapters/cursor/install-hooks.ts +++ b/packages/cursor-vpet/src/adapters/cursor/install-hooks.ts @@ -1,5 +1,6 @@ import { mkdirSync, readFileSync, writeFileSync } from "node:fs" import { dirname } from "node:path" + import { resolveHooksJsonPath } from "./paths.ts" const VPET_MARKER = "hook-bridge.js" diff --git a/packages/cursor-vpet/src/adapters/sqlite/database-change-watcher.ts b/packages/cursor-vpet/src/adapters/sqlite/database-change-watcher.ts index 4a8508b..e723930 100644 --- a/packages/cursor-vpet/src/adapters/sqlite/database-change-watcher.ts +++ b/packages/cursor-vpet/src/adapters/sqlite/database-change-watcher.ts @@ -1,5 +1,5 @@ -import { watch, type FSWatcher } from "node:fs" import { mkdirSync } from "node:fs" +import { watch, type FSWatcher } from "node:fs" import { basename, dirname } from "node:path" import { resolveHostDatabasePath, type HostPathOptions } from "@sbugallo/vpet-core/adapters/sqlite/app-data-path.ts" diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts b/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts index 4e251cc..1a4f496 100644 --- a/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts +++ b/packages/cursor-vpet/src/adapters/sqlite/sqlite-sidebar-snapshot-reader.ts @@ -1,17 +1,18 @@ import { existsSync, readFileSync } from "node:fs" import type { SqlJsStatic } from "sql.js" -import type { SidebarSnapshot, SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" -import type { SqliteExecutor } from "@sbugallo/vpet-core/ports/sqlite-executor.ts" -import { isRecoverableSqliteReadError } from "./errors.ts" -import { resolveDatabasePath, type SqliteDatabaseOptions } from "./options.ts" -import { getSqlRuntime } from "./sqljs-config.ts" import { ACTIVE_PARTNER_SELECT, toPartner, type PersistedPartnerRow, type TrainerStateRow, } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-schema.ts" +import type { SidebarSnapshot, SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" +import type { SqliteExecutor } from "@sbugallo/vpet-core/ports/sqlite-executor.ts" + +import { isRecoverableSqliteReadError } from "./errors.ts" +import { resolveDatabasePath, type SqliteDatabaseOptions } from "./options.ts" +import { getSqlRuntime } from "./sqljs-config.ts" export type CreateSqliteSidebarSnapshotReaderOptions = SqliteDatabaseOptions diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts index 5159fd7..a18c0cb 100644 --- a/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts +++ b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-archive-reader.ts @@ -1,5 +1,11 @@ import { existsSync } from "node:fs" +import { + ARCHIVE_PARTNER_EVENTS_SELECT, + ARCHIVE_PARTNERS_SELECT, + type PersistedPartnerEventRow, + type PersistedPartnerRow, +} from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-schema.ts" import type { VpetArchiveEvent, VpetArchivePartner, @@ -7,15 +13,10 @@ import type { } from "@sbugallo/vpet-core/application/models/vpet-archive.ts" import type { VpetArchiveReader } from "@sbugallo/vpet-core/application/ports/vpet-archive.ts" import type { SqliteExecutor } from "@sbugallo/vpet-core/ports/sqlite-executor.ts" + import { isRecoverableSqliteReadError } from "./errors.ts" import { resolveDatabasePath, type SqliteDatabaseOptions } from "./options.ts" import { openReadonlySqlJsDatabase } from "./sqljs-driver.ts" -import { - ARCHIVE_PARTNER_EVENTS_SELECT, - ARCHIVE_PARTNERS_SELECT, - type PersistedPartnerEventRow, - type PersistedPartnerRow, -} from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-schema.ts" export type CreateSqliteVpetArchiveReaderOptions = SqliteDatabaseOptions diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts index 4310766..a0d7b97 100644 --- a/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts +++ b/packages/cursor-vpet/src/adapters/sqlite/sqlite-vpet-write-store.ts @@ -1,6 +1,7 @@ -import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" import type { SqliteVpetWriteStore } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-types.ts" import { createSqliteVpetWriteStore } from "@sbugallo/vpet-core/adapters/sqlite/sqlite-vpet-write-store.ts" +import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" + import { resolveDatabasePath, type SqliteDatabaseOptions } from "./options.ts" import { readSidebarSnapshotFromExecutor } from "./sqlite-sidebar-snapshot-reader.ts" import { openWritableSqlJsDatabase } from "./sqljs-driver.ts" diff --git a/packages/cursor-vpet/src/adapters/sqlite/sqljs-driver.ts b/packages/cursor-vpet/src/adapters/sqlite/sqljs-driver.ts index ba7c5f2..b3883ac 100644 --- a/packages/cursor-vpet/src/adapters/sqlite/sqljs-driver.ts +++ b/packages/cursor-vpet/src/adapters/sqlite/sqljs-driver.ts @@ -3,6 +3,7 @@ import { dirname } from "node:path" import type { Database, SqlJsStatic } from "sql.js" import type { QueryValue, SqliteExecutor } from "@sbugallo/vpet-core/ports/sqlite-executor.ts" + import { getSqlRuntime } from "./sqljs-config.ts" export type SqlJsDatabase = { diff --git a/packages/cursor-vpet/src/application/usage-pipeline.ts b/packages/cursor-vpet/src/application/usage-pipeline.ts index 3b369f3..b75504b 100644 --- a/packages/cursor-vpet/src/application/usage-pipeline.ts +++ b/packages/cursor-vpet/src/application/usage-pipeline.ts @@ -1,5 +1,6 @@ import type { UsageProcessingResult } from "@sbugallo/vpet-core/application/models/usage.ts" import type { UsageLedger } from "@sbugallo/vpet-core/application/ports/usage-ledger.ts" + import { createCursorUsageEventSource, type CursorUsageEventSource } from "../adapters/cursor/cursor-usage-event-source.ts" export type UsagePipeline = CursorUsageEventSource diff --git a/packages/cursor-vpet/src/bootstrap/container.ts b/packages/cursor-vpet/src/bootstrap/container.ts index 6426f9b..5a81794 100644 --- a/packages/cursor-vpet/src/bootstrap/container.ts +++ b/packages/cursor-vpet/src/bootstrap/container.ts @@ -1,12 +1,12 @@ import { join } from "node:path" import * as vscode from "vscode" -import { configureSqlJsWasmPath } from "../adapters/sqlite/sqljs-config.ts" import { createDatabaseChangeWatcher } from "../adapters/sqlite/database-change-watcher.ts" import { createSqliteVpetRepository, type CursorSqliteVpetRepository, } from "../adapters/sqlite/sqlite-vpet-write-store.ts" +import { configureSqlJsWasmPath } from "../adapters/sqlite/sqljs-config.ts" import { getVpetExtensionSettings, toDatabaseOptions, type VpetExtensionSettings } from "../config/extension-settings.ts" import { VpetSidebarProvider } from "../webview/vpet-sidebar-provider.ts" diff --git a/packages/cursor-vpet/src/bootstrap/register-commands.ts b/packages/cursor-vpet/src/bootstrap/register-commands.ts index 7fba23f..2ca251a 100644 --- a/packages/cursor-vpet/src/bootstrap/register-commands.ts +++ b/packages/cursor-vpet/src/bootstrap/register-commands.ts @@ -1,10 +1,11 @@ import { join } from "node:path" import * as vscode from "vscode" -import { spawnPartner } from "@sbugallo/vpet-core/application/use-cases/spawn-partner.ts" import { freezeVpet } from "@sbugallo/vpet-core/application/use-cases/freeze-vpet.ts" -import { unfreezeVpet } from "@sbugallo/vpet-core/application/use-cases/unfreeze-vpet.ts" import { setVpetCheatNode } from "@sbugallo/vpet-core/application/use-cases/set-vpet-cheat-node.ts" +import { spawnPartner } from "@sbugallo/vpet-core/application/use-cases/spawn-partner.ts" +import { unfreezeVpet } from "@sbugallo/vpet-core/application/use-cases/unfreeze-vpet.ts" + import { installVpetHooks, uninstallVpetHooks } from "../adapters/cursor/install-hooks.ts" import { openDexPanel } from "../webview/panels/dex-panel.ts" import { openHistoryPanel } from "../webview/panels/history-panel.ts" diff --git a/packages/cursor-vpet/src/webview/panels/dex-panel.ts b/packages/cursor-vpet/src/webview/panels/dex-panel.ts index 3acf0f2..e017413 100644 --- a/packages/cursor-vpet/src/webview/panels/dex-panel.ts +++ b/packages/cursor-vpet/src/webview/panels/dex-panel.ts @@ -3,8 +3,9 @@ import * as vscode from "vscode" import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { buildDexViewModel } from "@sbugallo/vpet-core/view-models/dex-view-model.ts" -import type { CreateSqliteVpetArchiveReaderOptions } from "../../adapters/sqlite/sqlite-vpet-archive-reader.ts" + import { readArchive } from "../../adapters/sqlite/sqlite-vpet-archive-reader.ts" +import type { CreateSqliteVpetArchiveReaderOptions } from "../../adapters/sqlite/sqlite-vpet-archive-reader.ts" import { escapeHtml } from "../../shared/escape-html.ts" export const openDexPanel = async ( diff --git a/packages/cursor-vpet/src/webview/panels/history-panel.ts b/packages/cursor-vpet/src/webview/panels/history-panel.ts index e0d0cdf..b2e64b8 100644 --- a/packages/cursor-vpet/src/webview/panels/history-panel.ts +++ b/packages/cursor-vpet/src/webview/panels/history-panel.ts @@ -3,8 +3,9 @@ import * as vscode from "vscode" import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { buildHistoryViewModel } from "@sbugallo/vpet-core/view-models/history-view-model.ts" -import type { CreateSqliteVpetArchiveReaderOptions } from "../../adapters/sqlite/sqlite-vpet-archive-reader.ts" + import { readArchive } from "../../adapters/sqlite/sqlite-vpet-archive-reader.ts" +import type { CreateSqliteVpetArchiveReaderOptions } from "../../adapters/sqlite/sqlite-vpet-archive-reader.ts" import { escapeHtml } from "../../shared/escape-html.ts" export const openHistoryPanel = async ( diff --git a/packages/cursor-vpet/src/webview/presentation/animated-artwork.ts b/packages/cursor-vpet/src/webview/presentation/animated-artwork.ts index f60dbba..17541bd 100644 --- a/packages/cursor-vpet/src/webview/presentation/animated-artwork.ts +++ b/packages/cursor-vpet/src/webview/presentation/animated-artwork.ts @@ -1,5 +1,5 @@ -import { mirrorMonsterFrame } from "./monster-artwork-mirror.ts" import type { MonsterAnimationOutput, MonsterAnimationResult } from "./monster-animation.ts" +import { mirrorMonsterFrame } from "./monster-artwork-mirror.ts" const ARTWORK_ROWS = 8 const ARTWORK_COLUMNS = 16 diff --git a/packages/cursor-vpet/src/webview/presentation/defeat-artwork.ts b/packages/cursor-vpet/src/webview/presentation/defeat-artwork.ts index d1c0c02..d91a2e6 100644 --- a/packages/cursor-vpet/src/webview/presentation/defeat-artwork.ts +++ b/packages/cursor-vpet/src/webview/presentation/defeat-artwork.ts @@ -1,5 +1,6 @@ import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + import { sleep } from "../../shared/sleep.ts" const FRAME_ROWS = 8 diff --git a/packages/cursor-vpet/src/webview/presentation/evolution-artwork.ts b/packages/cursor-vpet/src/webview/presentation/evolution-artwork.ts index 03fd054..acb0617 100644 --- a/packages/cursor-vpet/src/webview/presentation/evolution-artwork.ts +++ b/packages/cursor-vpet/src/webview/presentation/evolution-artwork.ts @@ -1,7 +1,8 @@ import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" -import { sleep } from "../../shared/sleep.ts" import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" +import { sleep } from "../../shared/sleep.ts" + const FRAME_ROWS = 8 const FRAME_COLUMNS = 16 diff --git a/packages/cursor-vpet/src/webview/presentation/evolution-battle-artwork.ts b/packages/cursor-vpet/src/webview/presentation/evolution-battle-artwork.ts index 0c32e15..1a2ce96 100644 --- a/packages/cursor-vpet/src/webview/presentation/evolution-battle-artwork.ts +++ b/packages/cursor-vpet/src/webview/presentation/evolution-battle-artwork.ts @@ -1,5 +1,6 @@ import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import type { MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + import { sleep } from "../../shared/sleep.ts" import { mirrorMonsterFrame } from "./monster-artwork-mirror.ts" diff --git a/packages/cursor-vpet/src/webview/presentation/evolution-battle-session.ts b/packages/cursor-vpet/src/webview/presentation/evolution-battle-session.ts index f903ea3..8004721 100644 --- a/packages/cursor-vpet/src/webview/presentation/evolution-battle-session.ts +++ b/packages/cursor-vpet/src/webview/presentation/evolution-battle-session.ts @@ -1,5 +1,5 @@ -import type { SidebarSnapshot } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" import type { ResolveEvolutionBattleOutcome } from "@sbugallo/vpet-core/application/models/usage.ts" +import type { SidebarSnapshot } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" import { resolveEvolutionBattleForPartner, type EvolutionBattleRepository, diff --git a/packages/cursor-vpet/src/webview/presentation/monster-action-policy.ts b/packages/cursor-vpet/src/webview/presentation/monster-action-policy.ts index 2ff2f28..6f2ca4d 100644 --- a/packages/cursor-vpet/src/webview/presentation/monster-action-policy.ts +++ b/packages/cursor-vpet/src/webview/presentation/monster-action-policy.ts @@ -1,4 +1,5 @@ import type { MonsterFrameCatalog, MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + import { normalizedRandom } from "../../shared/random.ts" export type CosmeticActionClip = readonly [MonsterFrameName, MonsterFrameName] diff --git a/packages/cursor-vpet/src/webview/presentation/monster-animation.ts b/packages/cursor-vpet/src/webview/presentation/monster-animation.ts index 35d034c..efb09ac 100644 --- a/packages/cursor-vpet/src/webview/presentation/monster-animation.ts +++ b/packages/cursor-vpet/src/webview/presentation/monster-animation.ts @@ -3,6 +3,7 @@ import type { MonsterFrameCatalog, MonsterFrameName, } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + import { assertNever } from "../../shared/assert-never.ts" import { resolveCosmeticActions, diff --git a/packages/cursor-vpet/src/webview/presentation/monster-walking-policy.ts b/packages/cursor-vpet/src/webview/presentation/monster-walking-policy.ts index 81ce933..72d2810 100644 --- a/packages/cursor-vpet/src/webview/presentation/monster-walking-policy.ts +++ b/packages/cursor-vpet/src/webview/presentation/monster-walking-policy.ts @@ -1,4 +1,5 @@ import type { MonsterFrameCatalog, MonsterFrameName } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + import { assertNever } from "../../shared/assert-never.ts" import { normalizedRandom } from "../../shared/random.ts" diff --git a/packages/cursor-vpet/src/webview/sidebar/provider.ts b/packages/cursor-vpet/src/webview/sidebar/provider.ts index faf6181..6589fe1 100644 --- a/packages/cursor-vpet/src/webview/sidebar/provider.ts +++ b/packages/cursor-vpet/src/webview/sidebar/provider.ts @@ -3,6 +3,7 @@ import * as vscode from "vscode" import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" import type { EvolutionBattleRepository } from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + import { createAnimationSink, type AnimationSink } from "../../adapters/vscode/animation-sink.ts" import { createVsCodeNotificationPort, diff --git a/packages/cursor-vpet/src/webview/sidebar/sidebar-animation-host.ts b/packages/cursor-vpet/src/webview/sidebar/sidebar-animation-host.ts index 22e0631..874efa5 100644 --- a/packages/cursor-vpet/src/webview/sidebar/sidebar-animation-host.ts +++ b/packages/cursor-vpet/src/webview/sidebar/sidebar-animation-host.ts @@ -1,4 +1,5 @@ import type { MonsterFrameCatalog } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + import type { AnimationSink } from "../../adapters/vscode/animation-sink.ts" import type { IntervalScheduler } from "../../adapters/vscode/scheduler.ts" import { renderPositionedArtwork } from "../presentation/animated-artwork.ts" diff --git a/packages/cursor-vpet/src/webview/sidebar/sidebar-orchestrator.ts b/packages/cursor-vpet/src/webview/sidebar/sidebar-orchestrator.ts index 203c9a5..a92a147 100644 --- a/packages/cursor-vpet/src/webview/sidebar/sidebar-orchestrator.ts +++ b/packages/cursor-vpet/src/webview/sidebar/sidebar-orchestrator.ts @@ -1,8 +1,9 @@ import type { UsageEvolutionTransition } from "@sbugallo/vpet-core/application/models/usage.ts" -import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" -import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import type { SidebarSnapshotReader } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" import type { EvolutionBattleRepository } from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" +import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + import type { AnimationSink } from "../../adapters/vscode/animation-sink.ts" import type { NotificationPort } from "../../adapters/vscode/notification-port.ts" import { createAsyncRefreshQueue } from "../../shared/async-refresh-queue.ts" diff --git a/packages/cursor-vpet/src/webview/sidebar/sidebar-presenter.ts b/packages/cursor-vpet/src/webview/sidebar/sidebar-presenter.ts index 3b6bda2..c3fbfce 100644 --- a/packages/cursor-vpet/src/webview/sidebar/sidebar-presenter.ts +++ b/packages/cursor-vpet/src/webview/sidebar/sidebar-presenter.ts @@ -1,8 +1,9 @@ +import type { SidebarSnapshot } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" +import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/get-sidebar-card-inputs.ts" import { DEFAULT_VPET_SETTINGS } from "@sbugallo/vpet-core/config/defaults.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" -import { getSidebarCardInputs } from "@sbugallo/vpet-core/application/use-cases/get-sidebar-card-inputs.ts" -import type { SidebarSnapshot } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" import { buildSidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" + import type { MonsterAnimationIdentity } from "../presentation/monster-animation.ts" import { toSidebarWebviewPayload, type SidebarWebviewPayload } from "./sidebar-render.ts" diff --git a/packages/cursor-vpet/src/webview/sidebar/sidebar-render.ts b/packages/cursor-vpet/src/webview/sidebar/sidebar-render.ts index 50a762e..6d9473e 100644 --- a/packages/cursor-vpet/src/webview/sidebar/sidebar-render.ts +++ b/packages/cursor-vpet/src/webview/sidebar/sidebar-render.ts @@ -1,4 +1,5 @@ import type { SidebarCardModel } from "@sbugallo/vpet-core/view-models/sidebar-view-model.ts" + import type { AnimationFramePayload, SidebarWebviewPayload } from "./webview-messages.ts" export type { AnimationFramePayload, SidebarWebviewPayload } from "./webview-messages.ts" diff --git a/packages/cursor-vpet/tests/cursor-api-watermark.test.ts b/packages/cursor-vpet/tests/cursor-api-watermark.test.ts index fa7a49e..dc78dcf 100644 --- a/packages/cursor-vpet/tests/cursor-api-watermark.test.ts +++ b/packages/cursor-vpet/tests/cursor-api-watermark.test.ts @@ -1,4 +1,5 @@ import { describe, expect, test } from "bun:test" + import { fingerprintEvent, hasValidTokens, diff --git a/packages/cursor-vpet/tests/cursor-stop-mapper.test.ts b/packages/cursor-vpet/tests/cursor-stop-mapper.test.ts index f0d87e2..6366f58 100644 --- a/packages/cursor-vpet/tests/cursor-stop-mapper.test.ts +++ b/packages/cursor-vpet/tests/cursor-stop-mapper.test.ts @@ -1,4 +1,5 @@ import { describe, expect, test } from "bun:test" + import { hasStopTokens, toCompletedUsageFromStop } from "../src/adapters/cursor/cursor-stop-mapper.ts" describe("cursor-stop-mapper", () => { diff --git a/packages/cursor-vpet/tests/defeat-artwork.test.ts b/packages/cursor-vpet/tests/defeat-artwork.test.ts index 30ff072..9eff8b6 100644 --- a/packages/cursor-vpet/tests/defeat-artwork.test.ts +++ b/packages/cursor-vpet/tests/defeat-artwork.test.ts @@ -1,6 +1,7 @@ import { describe, expect, test } from "bun:test" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + import { renderDefeatArtwork } from "../src/webview/presentation/defeat-artwork.ts" describe("defeat artwork", () => { diff --git a/packages/cursor-vpet/tests/evolution-artwork.test.ts b/packages/cursor-vpet/tests/evolution-artwork.test.ts index f9560c3..657f646 100644 --- a/packages/cursor-vpet/tests/evolution-artwork.test.ts +++ b/packages/cursor-vpet/tests/evolution-artwork.test.ts @@ -1,6 +1,7 @@ import { describe, expect, test } from "bun:test" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + import { renderEvolutionArtwork } from "../src/webview/presentation/evolution-artwork.ts" describe("evolution artwork", () => { diff --git a/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts b/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts index b026c5d..16b0ca2 100644 --- a/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts +++ b/packages/cursor-vpet/tests/evolution-battle-artwork.test.ts @@ -1,6 +1,7 @@ import { describe, expect, test } from "bun:test" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + import { buildBattleIntroTextLines, buildBattleScorePips, diff --git a/packages/cursor-vpet/tests/evolution-battle-session.test.ts b/packages/cursor-vpet/tests/evolution-battle-session.test.ts index 08ba301..3712dfa 100644 --- a/packages/cursor-vpet/tests/evolution-battle-session.test.ts +++ b/packages/cursor-vpet/tests/evolution-battle-session.test.ts @@ -2,6 +2,7 @@ import { describe, expect, test } from "bun:test" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + import { runEvolutionBattleSession } from "../src/webview/presentation/evolution-battle-session.ts" describe("evolution battle session", () => { diff --git a/packages/cursor-vpet/tests/evolution-reveal-session.test.ts b/packages/cursor-vpet/tests/evolution-reveal-session.test.ts index e34c4d5..bf5d4e3 100644 --- a/packages/cursor-vpet/tests/evolution-reveal-session.test.ts +++ b/packages/cursor-vpet/tests/evolution-reveal-session.test.ts @@ -2,6 +2,7 @@ import { describe, expect, test } from "bun:test" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + import { runEvolutionRevealSession } from "../src/webview/presentation/evolution-reveal-session.ts" describe("evolution reveal session", () => { diff --git a/packages/cursor-vpet/tests/monster-animation.test.ts b/packages/cursor-vpet/tests/monster-animation.test.ts index b9a1662..e0beba6 100644 --- a/packages/cursor-vpet/tests/monster-animation.test.ts +++ b/packages/cursor-vpet/tests/monster-animation.test.ts @@ -1,6 +1,7 @@ import { describe, expect, test } from "bun:test" import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + import { MonsterAnimationController } from "../src/webview/presentation/monster-animation.ts" const SLEEP_AFTER_MS = 300_000 diff --git a/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts b/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts index a6b0cb0..7a630ec 100644 --- a/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts +++ b/packages/cursor-vpet/tests/persistence/sqljs-vpet-repository.persistence.test.ts @@ -7,6 +7,7 @@ import { resolveEvolutionBattleForPartner } from "@sbugallo/vpet-core/applicatio import { spawnPartner } from "@sbugallo/vpet-core/application/use-cases/spawn-partner.ts" import { DIGIMON_CATALOG } from "@sbugallo/vpet-core/data/catalog.ts" import { STAGE_GAUGE_THRESHOLDS } from "@sbugallo/vpet-core/domain/evolution.ts" + import { createSqliteSidebarSnapshotReader, readSidebarSnapshot, From 6e5e9ce727385caae2041818003bb6c8b8e6046c Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 21:23:14 +0900 Subject: [PATCH 23/41] test(cursor-vpet): add sidebar and architecture boundary tests Cover sidebar orchestrator, animation host, and provider behavior with fixtures and mocks so functional regressions are caught without changing production code. Co-authored-by: Cursor --- .../tests/architecture-boundary-helpers.ts | 80 +++++++++ .../tests/architecture-boundary.test.ts | 79 +++++++++ .../tests/hexagonal-boundary.test.ts | 52 ++++++ .../cursor-vpet/tests/sidebar-render.test.ts | 7 + .../sidebar/sidebar-animation-host.test.ts | 140 ++++++++++++++++ .../sidebar/sidebar-orchestrator.test.ts | 151 +++++++++++++++++ .../tests/sidebar/sidebar-provider.test.ts | 141 ++++++++++++++++ .../tests/sidebar/test-fixtures.ts | 156 ++++++++++++++++++ 8 files changed, 806 insertions(+) create mode 100644 packages/cursor-vpet/tests/architecture-boundary-helpers.ts create mode 100644 packages/cursor-vpet/tests/architecture-boundary.test.ts create mode 100644 packages/cursor-vpet/tests/hexagonal-boundary.test.ts create mode 100644 packages/cursor-vpet/tests/sidebar/sidebar-animation-host.test.ts create mode 100644 packages/cursor-vpet/tests/sidebar/sidebar-orchestrator.test.ts create mode 100644 packages/cursor-vpet/tests/sidebar/sidebar-provider.test.ts create mode 100644 packages/cursor-vpet/tests/sidebar/test-fixtures.ts diff --git a/packages/cursor-vpet/tests/architecture-boundary-helpers.ts b/packages/cursor-vpet/tests/architecture-boundary-helpers.ts new file mode 100644 index 0000000..fb96d21 --- /dev/null +++ b/packages/cursor-vpet/tests/architecture-boundary-helpers.ts @@ -0,0 +1,80 @@ +import { readdir, readFile } from "node:fs/promises" +import { dirname, join } from "node:path" +import { fileURLToPath } from "node:url" + +export const PROJECT_ROOT = join(dirname(fileURLToPath(import.meta.url)), "..") + +export const FORBIDDEN_PRESENTATION_IMPORTS = [ + "vscode", + "/adapters/", + "/bootstrap/", + "node:fs", + "node:path", + "sql.js", + "/webview/sidebar/", +] as const + +export const FORBIDDEN_SHARED_IMPORTS = ["vscode", "/adapters/", "/webview/", "/bootstrap/"] as const + +export const FORBIDDEN_SQLITE_ADAPTER_IMPORTS = ["vscode"] as const + +export const FORBIDDEN_VSCODE_ADAPTER_IMPORTS = [ + "/adapters/cursor/", + "/adapters/sqlite/", + "/bootstrap/", +] as const + +export const FORBIDDEN_CURSOR_ADAPTER_IMPORTS = ["vscode", "/webview/"] as const + +export const FORBIDDEN_SIDEBAR_IMPORTS = ["vscode"] as const + +export const SIDEBAR_VSCODE_EXCEPTION = "webview/sidebar/provider.ts" + +const matchesForbiddenImport = (specifier: string, forbidden: string): boolean => { + if (forbidden.startsWith("/")) return specifier.includes(forbidden) + return specifier === forbidden +} + +export const findForbiddenImports = ( + sourcePath: string, + source: string, + forbiddenImports: readonly string[], +): readonly string[] => { + const importSpecifiers = source.matchAll(/\bfrom\s+["']([^"']+)["']|\bimport\s+["']([^"']+)["']/g) + const violations: string[] = [] + for (const match of importSpecifiers) { + const specifier = match[1] ?? match[2] + if ( + specifier !== undefined && + forbiddenImports.some((forbidden) => matchesForbiddenImport(specifier, forbidden)) + ) + violations.push(`${sourcePath}: ${specifier}`) + } + return violations +} + +export const scanForbiddenImports = async ( + directory: string, + forbiddenImports: readonly string[], + ignorePaths: readonly string[] = [], +): Promise => { + const entries = await readdir(directory, { withFileTypes: true }) + const violations: string[] = [] + for (const entry of entries) { + const entryPath = join(directory, entry.name) + if (ignorePaths.some((ignored) => entryPath.endsWith(ignored))) continue + if (entry.isDirectory()) violations.push(...(await scanForbiddenImports(entryPath, forbiddenImports, ignorePaths))) + else if (entry.isFile() && entry.name.endsWith(".ts")) + violations.push(...findForbiddenImports(entryPath, await readFile(entryPath, "utf8"), forbiddenImports)) + } + return violations.sort() +} + +export const scanPresentationImports = (directory: string): Promise => + scanForbiddenImports(directory, FORBIDDEN_PRESENTATION_IMPORTS) + +export const scanSharedImports = (directory: string): Promise => + scanForbiddenImports(directory, FORBIDDEN_SHARED_IMPORTS) + +export const scanSidebarImports = (directory: string): Promise => + scanForbiddenImports(directory, FORBIDDEN_SIDEBAR_IMPORTS, [SIDEBAR_VSCODE_EXCEPTION]) diff --git a/packages/cursor-vpet/tests/architecture-boundary.test.ts b/packages/cursor-vpet/tests/architecture-boundary.test.ts new file mode 100644 index 0000000..cee8c72 --- /dev/null +++ b/packages/cursor-vpet/tests/architecture-boundary.test.ts @@ -0,0 +1,79 @@ +import { describe, expect, test } from "bun:test" +import { mkdtemp, rm, writeFile } from "node:fs/promises" +import { tmpdir } from "node:os" +import { join } from "node:path" + +import { + FORBIDDEN_PRESENTATION_IMPORTS, + FORBIDDEN_SHARED_IMPORTS, + findForbiddenImports, + scanForbiddenImports, + scanPresentationImports, + scanSharedImports, +} from "./architecture-boundary-helpers.ts" + +describe("cursor-vpet architecture boundary fixtures", () => { + test("Given presentation source importing vscode When scanned Then it is rejected", async () => { + const directory = await mkdtemp(join(tmpdir(), "cursor-vpet-presentation-")) + const path = join(directory, "forbidden.ts") + try { + await writeFile(path, 'import * as vscode from "vscode"\n') + expect(await scanPresentationImports(directory)).toEqual([`${path}: vscode`]) + } finally { + await rm(directory, { recursive: true, force: true }) + } + }) + + test("Given presentation source importing sqlite adapters When scanned Then it is rejected", async () => { + const directory = await mkdtemp(join(tmpdir(), "cursor-vpet-presentation-")) + const path = join(directory, "forbidden.ts") + try { + await writeFile(path, 'import { openReadonlySqlJsDatabase } from "../../adapters/sqlite/sqljs-driver.ts"\n') + expect(await scanPresentationImports(directory)).toEqual([ + `${path}: ../../adapters/sqlite/sqljs-driver.ts`, + ]) + } finally { + await rm(directory, { recursive: true, force: true }) + } + }) + + test("Given shared source importing vscode When scanned Then it is rejected", async () => { + const directory = await mkdtemp(join(tmpdir(), "cursor-vpet-shared-")) + const path = join(directory, "forbidden.ts") + try { + await writeFile(path, 'import * as vscode from "vscode"\n') + expect(await scanSharedImports(directory)).toEqual([`${path}: vscode`]) + } finally { + await rm(directory, { recursive: true, force: true }) + } + }) + + test("Given malformed source When scanned Then valid imports are still found", () => + expect( + findForbiddenImports("malformed.ts", 'import { broken\nimport "vscode"\n', FORBIDDEN_SHARED_IMPORTS), + ).toEqual(["malformed.ts: vscode"])) + + test("Given sqlite adapter fixtures importing vscode When scanned Then violations are reported", async () => { + const directory = await mkdtemp(join(tmpdir(), "cursor-vpet-sqlite-")) + const path = join(directory, "forbidden.ts") + try { + await writeFile(path, 'import * as vscode from "vscode"\n') + expect(await scanForbiddenImports(directory, ["vscode"])).toEqual([`${path}: vscode`]) + } finally { + await rm(directory, { recursive: true, force: true }) + } + }) + + test("Given presentation fixtures importing sidebar modules When scanned Then violations are reported", async () => { + const directory = await mkdtemp(join(tmpdir(), "cursor-vpet-presentation-sidebar-")) + const path = join(directory, "forbidden.ts") + try { + await writeFile(path, 'import { buildSidebarPresentation } from "../webview/sidebar/sidebar-presenter.ts"\n') + expect(await scanForbiddenImports(directory, FORBIDDEN_PRESENTATION_IMPORTS)).toEqual([ + `${path}: ../webview/sidebar/sidebar-presenter.ts`, + ]) + } finally { + await rm(directory, { recursive: true, force: true }) + } + }) +}) diff --git a/packages/cursor-vpet/tests/hexagonal-boundary.test.ts b/packages/cursor-vpet/tests/hexagonal-boundary.test.ts new file mode 100644 index 0000000..0faf3d6 --- /dev/null +++ b/packages/cursor-vpet/tests/hexagonal-boundary.test.ts @@ -0,0 +1,52 @@ +import { describe, expect, test } from "bun:test" +import { readFile } from "node:fs/promises" +import { join } from "node:path" + +import { + FORBIDDEN_CURSOR_ADAPTER_IMPORTS, + FORBIDDEN_SQLITE_ADAPTER_IMPORTS, + FORBIDDEN_VSCODE_ADAPTER_IMPORTS, + PROJECT_ROOT, + findForbiddenImports, + scanForbiddenImports, + scanPresentationImports, + scanSharedImports, + scanSidebarImports, +} from "./architecture-boundary-helpers.ts" + +describe("cursor-vpet hexagonal dependency direction", () => { + test("Given the presentation source tree When scanned Then it has no forbidden dependencies", async () => + expect(await scanPresentationImports(join(PROJECT_ROOT, "src", "webview", "presentation"))).toEqual([])) + + test("Given the shared source tree When scanned Then it has no forbidden dependencies", async () => + expect(await scanSharedImports(join(PROJECT_ROOT, "src", "shared"))).toEqual([])) + + test("Given the sqlite adapter tree When scanned Then it has no vscode dependency", async () => + expect( + await scanForbiddenImports(join(PROJECT_ROOT, "src", "adapters", "sqlite"), FORBIDDEN_SQLITE_ADAPTER_IMPORTS), + ).toEqual([])) + + test("Given the vscode adapter tree When scanned Then it points inward", async () => + expect( + await scanForbiddenImports(join(PROJECT_ROOT, "src", "adapters", "vscode"), FORBIDDEN_VSCODE_ADAPTER_IMPORTS), + ).toEqual([])) + + test("Given the cursor adapter tree When scanned Then it has no webview or vscode dependency", async () => + expect( + await scanForbiddenImports(join(PROJECT_ROOT, "src", "adapters", "cursor"), FORBIDDEN_CURSOR_ADAPTER_IMPORTS), + ).toEqual([])) + + test("Given the sidebar source tree When scanned Then only provider imports vscode", async () => + expect(await scanSidebarImports(join(PROJECT_ROOT, "src", "webview", "sidebar"))).toEqual([])) + + test("Given sidebar presenter When scanned Then it remains free of adapter imports", async () => { + const path = join(PROJECT_ROOT, "src", "webview", "sidebar", "sidebar-presenter.ts") + expect(findForbiddenImports(path, await readFile(path, "utf8"), ["/adapters/", "vscode"])).toEqual([]) + }) + + test("Given extension composition When scanned Then it wires the usage pipeline", async () => { + const path = join(PROJECT_ROOT, "src", "extension.ts") + const source = await readFile(path, "utf8") + expect(source.includes("application/usage-pipeline")).toBe(true) + }) +}) diff --git a/packages/cursor-vpet/tests/sidebar-render.test.ts b/packages/cursor-vpet/tests/sidebar-render.test.ts index e524ce7..7f78606 100644 --- a/packages/cursor-vpet/tests/sidebar-render.test.ts +++ b/packages/cursor-vpet/tests/sidebar-render.test.ts @@ -3,6 +3,7 @@ import { describe, expect, test } from "bun:test" import { buildGaugeLine, buildNextCheckLine, + buildSidebarWebviewHtml, pixelWidthToArtworkColumns, toSidebarWebviewPayload, } from "../src/webview/sidebar/sidebar-render.ts" @@ -32,6 +33,12 @@ describe("sidebar render", () => { expect(line).toBe("Next check: [██████████░░░░░░░░░░]") }) + test("embeds nonce in sidebar CSP and script tag", () => { + const html = buildSidebarWebviewHtml("test-nonce-123") + expect(html).toContain("script-src 'nonce-test-nonce-123'") + expect(html).toContain('nonce="test-nonce-123"') + }) + test("maps partner model to sidebar payload without artwork", () => { const payload = toSidebarWebviewPayload({ kind: "partner", diff --git a/packages/cursor-vpet/tests/sidebar/sidebar-animation-host.test.ts b/packages/cursor-vpet/tests/sidebar/sidebar-animation-host.test.ts new file mode 100644 index 0000000..fc7f5fa --- /dev/null +++ b/packages/cursor-vpet/tests/sidebar/sidebar-animation-host.test.ts @@ -0,0 +1,140 @@ +import { describe, expect, test } from "bun:test" + +import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" + +import { createSidebarAnimationHost } from "../../src/webview/sidebar/sidebar-animation-host.ts" +import { createCaptureSink, createManualScheduler, sequenceRandom } from "./test-fixtures.ts" + +describe("sidebar animation host", () => { + test("start and tick posts artwork when visible", async () => { + const { sink, artworks } = createCaptureSink() + const scheduler = createManualScheduler() + const host = createSidebarAnimationHost({ + frameCatalog: MONSTER_FRAME_CATALOG, + sink, + scheduler, + random: sequenceRandom([0.5]), + isVisible: () => true, + }) + host.syncPartner({ sprite: "agumon", isDigitama: false }) + host.start() + scheduler.tick() + await Promise.resolve() + expect(artworks.length).toBeGreaterThan(0) + host.stop() + }) + + test("stop prevents further tick posts", async () => { + const { sink, artworks } = createCaptureSink() + const scheduler = createManualScheduler() + const host = createSidebarAnimationHost({ + frameCatalog: MONSTER_FRAME_CATALOG, + sink, + scheduler, + random: sequenceRandom([0.5]), + }) + host.syncPartner({ sprite: "agumon", isDigitama: false }) + host.start() + scheduler.tick() + await Promise.resolve() + const countAfterFirst = artworks.length + host.stop() + scheduler.tick() + await Promise.resolve() + expect(artworks.length).toBe(countAfterFirst) + }) + + test("isVisible false suppresses tick posts", async () => { + const { sink, artworks } = createCaptureSink() + const scheduler = createManualScheduler() + const host = createSidebarAnimationHost({ + frameCatalog: MONSTER_FRAME_CATALOG, + sink, + scheduler, + random: sequenceRandom([0.5]), + isVisible: () => false, + }) + host.syncPartner({ sprite: "agumon", isDigitama: false }) + host.start() + scheduler.tick() + await Promise.resolve() + expect(artworks).toHaveLength(0) + }) + + test("presentation blocked suppresses tick posts", async () => { + const { sink, artworks } = createCaptureSink() + const scheduler = createManualScheduler() + const host = createSidebarAnimationHost({ + frameCatalog: MONSTER_FRAME_CATALOG, + sink, + scheduler, + random: sequenceRandom([0.5]), + }) + host.setPresentationBlocked(true) + host.syncPartner({ sprite: "agumon", isDigitama: false }) + host.start() + scheduler.tick() + await Promise.resolve() + expect(artworks).toHaveLength(0) + }) + + test("setArtworkWidth updates viewport width", async () => { + const { sink, artworks } = createCaptureSink() + const host = createSidebarAnimationHost({ + frameCatalog: MONSTER_FRAME_CATALOG, + sink, + scheduler: createManualScheduler(), + random: sequenceRandom([0.5]), + }) + host.setArtworkWidth(80) + host.syncPartner({ sprite: "agumon", isDigitama: false }) + await host.postCurrentFrame() + expect(artworks.length).toBe(1) + expect(host.getArtworkWidth()).toBe(80) + }) + + test("syncPartner change produces different artwork", async () => { + const { sink, artworks } = createCaptureSink() + const host = createSidebarAnimationHost({ + frameCatalog: MONSTER_FRAME_CATALOG, + sink, + scheduler: createManualScheduler(), + random: sequenceRandom([0.5]), + }) + host.syncPartner({ sprite: "agumon", isDigitama: false }) + await host.postCurrentFrame() + host.syncPartner({ sprite: "gabumon", isDigitama: false }) + await host.postCurrentFrame() + expect(artworks.length).toBe(2) + expect(artworks[0]).not.toBe(artworks[1]) + }) + + test("identical consecutive frames are deduplicated", async () => { + const { sink, artworks } = createCaptureSink() + const host = createSidebarAnimationHost({ + frameCatalog: MONSTER_FRAME_CATALOG, + sink, + scheduler: createManualScheduler(), + random: sequenceRandom([0.5]), + }) + host.syncPartner({ sprite: "agumon", isDigitama: false }) + await host.postCurrentFrame() + await host.postCurrentFrame() + expect(artworks).toHaveLength(1) + }) + + test("clearArtwork allows reposting the same frame", async () => { + const { sink, artworks } = createCaptureSink() + const host = createSidebarAnimationHost({ + frameCatalog: MONSTER_FRAME_CATALOG, + sink, + scheduler: createManualScheduler(), + random: sequenceRandom([0.5]), + }) + host.syncPartner({ sprite: "agumon", isDigitama: false }) + await host.postCurrentFrame() + host.clearArtwork() + await host.postCurrentFrame() + expect(artworks).toHaveLength(2) + }) +}) diff --git a/packages/cursor-vpet/tests/sidebar/sidebar-orchestrator.test.ts b/packages/cursor-vpet/tests/sidebar/sidebar-orchestrator.test.ts new file mode 100644 index 0000000..2d7bbab --- /dev/null +++ b/packages/cursor-vpet/tests/sidebar/sidebar-orchestrator.test.ts @@ -0,0 +1,151 @@ +import { describe, expect, mock, test } from "bun:test" + +import type { UsageEvolutionTransition } from "@sbugallo/vpet-core/application/models/usage.ts" + +mock.module("../../src/shared/sleep.ts", () => ({ + sleep: async () => {}, +})) + +import { createSidebarOrchestrator } from "../../src/webview/sidebar/sidebar-orchestrator.ts" +import { + battleSidebarSnapshot, + createBattleRepository, + createCaptureNotification, + createCaptureSink, + createSpyAnimationHost, + nullSidebarSnapshot, + partnerSidebarSnapshot, + sequenceRandom, +} from "./test-fixtures.ts" + +describe("sidebar orchestrator", () => { + test("refresh publishes no_partner when snapshot is null", async () => { + const { sink, models } = createCaptureSink() + const animationHost = createSpyAnimationHost() + const orchestrator = createSidebarOrchestrator({ + snapshotReader: { getSidebarSnapshot: nullSidebarSnapshot }, + battleRepository: createBattleRepository(), + animationHost, + notification: createCaptureNotification(), + }) + orchestrator.setSink(sink) + await orchestrator.refresh() + expect(models.at(-1)?.kind).toBe("no_partner") + expect(animationHost.syncCalls).toBe(1) + }) + + test("refresh publishes partner payload when snapshot has a partner", async () => { + const { sink, models } = createCaptureSink() + const animationHost = createSpyAnimationHost() + const orchestrator = createSidebarOrchestrator({ + snapshotReader: { getSidebarSnapshot: partnerSidebarSnapshot }, + battleRepository: createBattleRepository(), + animationHost, + notification: createCaptureNotification(), + }) + orchestrator.setSink(sink) + await orchestrator.refresh() + expect(models.at(-1)?.kind).toBe("partner") + expect(animationHost.syncCalls).toBe(1) + }) + + test("concurrent refresh calls coalesce instead of publishing once per call", async () => { + const { sink, models } = createCaptureSink() + const orchestrator = createSidebarOrchestrator({ + snapshotReader: { getSidebarSnapshot: partnerSidebarSnapshot }, + battleRepository: createBattleRepository(), + animationHost: createSpyAnimationHost(), + notification: createCaptureNotification(), + }) + orchestrator.setSink(sink) + await Promise.all([orchestrator.refresh(), orchestrator.refresh(), orchestrator.refresh()]) + expect(models.length).toBeGreaterThan(0) + expect(models.length).toBeLessThan(3) + }) + + test("pending battle resolves with victory notification", async () => { + const { sink } = createCaptureSink() + const notification = createCaptureNotification() + const orchestrator = createSidebarOrchestrator({ + snapshotReader: { getSidebarSnapshot: battleSidebarSnapshot }, + battleRepository: createBattleRepository("won"), + animationHost: createSpyAnimationHost(), + notification, + random: sequenceRandom([0]), + }) + orchestrator.setSink(sink) + await orchestrator.refresh() + expect(notification.messages.some((message) => message.includes("Victory"))).toBe(true) + }) + + test("queueEvolutionReveal plays reveal on next refresh", async () => { + const { sink, artworks } = createCaptureSink() + const evolution: UsageEvolutionTransition = { fromNodeId: "3-001", toNodeId: "4-017" } + const orchestrator = createSidebarOrchestrator({ + snapshotReader: { getSidebarSnapshot: partnerSidebarSnapshot }, + battleRepository: createBattleRepository(), + animationHost: createSpyAnimationHost(), + notification: createCaptureNotification(), + }) + orchestrator.setSink(sink) + orchestrator.queueEvolutionReveal(evolution) + await orchestrator.refresh() + expect(artworks.length).toBeGreaterThan(0) + }) + + test("onPresentationEnd callback runs after battle", async () => { + let ended = false + const orchestrator = createSidebarOrchestrator({ + snapshotReader: { getSidebarSnapshot: battleSidebarSnapshot }, + battleRepository: createBattleRepository("won"), + animationHost: createSpyAnimationHost(), + notification: createCaptureNotification(), + random: sequenceRandom([0]), + onPresentationEnd: () => { + ended = true + }, + }) + orchestrator.setSink(createCaptureSink().sink) + await orchestrator.refresh() + expect(ended).toBe(true) + }) + + test("setSink routes later refresh payloads to the new sink", async () => { + const first = createCaptureSink() + const second = createCaptureSink() + const orchestrator = createSidebarOrchestrator({ + snapshotReader: { getSidebarSnapshot: partnerSidebarSnapshot }, + battleRepository: createBattleRepository(), + animationHost: createSpyAnimationHost(), + notification: createCaptureNotification(), + }) + orchestrator.setSink(first.sink) + orchestrator.setSink(second.sink) + await orchestrator.refresh() + expect(first.models).toHaveLength(0) + expect(second.models).toHaveLength(1) + }) + + test("refresh without sink configured does not throw", async () => { + const orchestrator = createSidebarOrchestrator({ + snapshotReader: { getSidebarSnapshot: partnerSidebarSnapshot }, + battleRepository: createBattleRepository(), + animationHost: createSpyAnimationHost(), + notification: createCaptureNotification(), + }) + await expect(orchestrator.refresh()).resolves.toBeUndefined() + }) + + test("getCachedPayload returns the last published model", async () => { + const { sink } = createCaptureSink() + const orchestrator = createSidebarOrchestrator({ + snapshotReader: { getSidebarSnapshot: partnerSidebarSnapshot }, + battleRepository: createBattleRepository(), + animationHost: createSpyAnimationHost(), + notification: createCaptureNotification(), + }) + orchestrator.setSink(sink) + await orchestrator.refresh() + expect(orchestrator.getCachedPayload()?.kind).toBe("partner") + }) +}) diff --git a/packages/cursor-vpet/tests/sidebar/sidebar-provider.test.ts b/packages/cursor-vpet/tests/sidebar/sidebar-provider.test.ts new file mode 100644 index 0000000..f59e561 --- /dev/null +++ b/packages/cursor-vpet/tests/sidebar/sidebar-provider.test.ts @@ -0,0 +1,141 @@ +import { beforeAll, describe, expect, mock, test } from "bun:test" + +const openedUrls: string[] = [] + +beforeAll(() => { + mock.module("vscode", () => ({ + env: { + openExternal: async (uri: { toString: () => string }) => { + openedUrls.push(uri.toString()) + }, + }, + Uri: { + parse: (value: string) => ({ toString: () => value }), + }, + })) +}) + +const loadProvider = async () => { + const { VpetSidebarProvider } = await import("../../src/webview/sidebar/provider.ts") + return VpetSidebarProvider +} + +const extensionUri = { fsPath: "/extension", scheme: "file", path: "/extension" } + +const createStubWebviewView = (visible = true) => { + let messageHandler: ((message: unknown) => void) | undefined + const posted: unknown[] = [] + const webview = { + options: {}, + html: "", + postMessage: async (message: unknown) => { + posted.push(message) + }, + onDidReceiveMessage: (handler: (message: unknown) => void) => { + messageHandler = handler + return { dispose: () => undefined } + }, + } + const webviewView = { + visible, + webview, + onDidChangeVisibility: () => ({ dispose: () => undefined }), + } + return { + webviewView, + posted, + sendMessage: (message: unknown) => messageHandler?.(message), + } +} + +describe("sidebar provider", () => { + test("resolveWebviewView sets CSP html with a nonce", async () => { + const VpetSidebarProvider = await loadProvider() + const stub = createStubWebviewView() + const provider = new VpetSidebarProvider( + extensionUri as import("vscode").Uri, + { getSidebarSnapshot: () => null }, + { getActivePartner: () => null, resolveEvolutionBattle: () => ({ kind: "no_pending_battle" }) }, + { scheduler: { start: () => () => undefined } }, + ) + provider.resolveWebviewView(stub.webviewView as import("vscode").WebviewView) + expect(stub.webviewView.webview.html).toContain("Content-Security-Policy") + expect(stub.webviewView.webview.html).toMatch(/script nonce="[^"]+"/) + }) + + test("open-url message opens the link through vscode", async () => { + const VpetSidebarProvider = await loadProvider() + openedUrls.length = 0 + const stub = createStubWebviewView() + const provider = new VpetSidebarProvider( + extensionUri as import("vscode").Uri, + { getSidebarSnapshot: () => null }, + { getActivePartner: () => null, resolveEvolutionBattle: () => ({ kind: "no_pending_battle" }) }, + { scheduler: { start: () => () => undefined } }, + ) + provider.resolveWebviewView(stub.webviewView as import("vscode").WebviewView) + stub.sendMessage({ type: "open-url", url: "https://example.com/agumon" }) + await Promise.resolve() + expect(openedUrls).toEqual(["https://example.com/agumon"]) + }) + + test("invalid inbound messages are ignored", async () => { + const VpetSidebarProvider = await loadProvider() + const stub = createStubWebviewView() + const provider = new VpetSidebarProvider( + extensionUri as import("vscode").Uri, + { getSidebarSnapshot: () => null }, + { getActivePartner: () => null, resolveEvolutionBattle: () => ({ kind: "no_pending_battle" }) }, + { scheduler: { start: () => () => undefined } }, + ) + provider.resolveWebviewView(stub.webviewView as import("vscode").WebviewView) + stub.sendMessage({ type: "unknown" }) + expect(stub.posted).toHaveLength(0) + }) + + test("cached payload is posted when webview resolves", async () => { + const VpetSidebarProvider = await loadProvider() + const stub = createStubWebviewView() + const provider = new VpetSidebarProvider( + extensionUri as import("vscode").Uri, + { + getSidebarSnapshot: () => ({ + currentNodeId: "3-001", + gauge: 10, + isTerminal: false, + frozen: false, + isSetOverride: false, + trainerTotalTokens: 100, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, + }), + }, + { getActivePartner: () => null, resolveEvolutionBattle: () => ({ kind: "no_pending_battle" }) }, + { scheduler: { start: () => () => undefined } }, + ) + await provider.refresh() + provider.resolveWebviewView(stub.webviewView as import("vscode").WebviewView) + await Promise.resolve() + expect(stub.posted.some((message) => (message as { kind?: string }).kind === "partner")).toBe(true) + }) + + test("dispose stops the animation host scheduler", async () => { + const VpetSidebarProvider = await loadProvider() + const state = { stopped: false } + const scheduler = { + start: () => () => { + state.stopped = true + }, + } + const provider = new VpetSidebarProvider( + extensionUri as import("vscode").Uri, + { getSidebarSnapshot: () => null }, + { getActivePartner: () => null, resolveEvolutionBattle: () => ({ kind: "no_pending_battle" }) }, + { scheduler }, + ) + const stub = createStubWebviewView() + provider.resolveWebviewView(stub.webviewView as import("vscode").WebviewView) + provider.dispose() + expect(state.stopped).toBe(true) + }) +}) diff --git a/packages/cursor-vpet/tests/sidebar/test-fixtures.ts b/packages/cursor-vpet/tests/sidebar/test-fixtures.ts new file mode 100644 index 0000000..9c5ca66 --- /dev/null +++ b/packages/cursor-vpet/tests/sidebar/test-fixtures.ts @@ -0,0 +1,156 @@ +import type { SidebarSnapshot } from "@sbugallo/vpet-core/application/ports/sidebar-snapshot.ts" +import type { EvolutionBattleRepository } from "@sbugallo/vpet-core/application/use-cases/resolve-evolution-battle.ts" +import type { AnimationSink } from "../../src/adapters/vscode/animation-sink.ts" +import type { NotificationPort } from "../../src/adapters/vscode/notification-port.ts" +import type { IntervalScheduler } from "../../src/adapters/vscode/scheduler.ts" +import type { SidebarWebviewPayload } from "../../src/webview/sidebar/webview-messages.ts" +import type { SidebarAnimationHost } from "../../src/webview/sidebar/sidebar-animation-host.ts" +export const nullSidebarSnapshot = (): null => null + +export const partnerSidebarSnapshot = (): SidebarSnapshot => ({ + currentNodeId: "3-001", + gauge: 10, + isTerminal: false, + frozen: false, + isSetOverride: false, + trainerTotalTokens: 100, + pendingEvolutionTargetId: null, + battleOpponentNodeId: null, +}) + +export const battleSidebarSnapshot = (): SidebarSnapshot => ({ + currentNodeId: "3-001", + gauge: 50, + isTerminal: false, + frozen: false, + isSetOverride: false, + trainerTotalTokens: 500, + pendingEvolutionTargetId: "4-017", + battleOpponentNodeId: "3-051", +}) + +export const createCaptureSink = (): { + sink: AnimationSink + models: SidebarWebviewPayload[] + artworks: string[] +} => { + const models: SidebarWebviewPayload[] = [] + const artworks: string[] = [] + return { + models, + artworks, + sink: { + postModel: async (payload) => { + models.push(payload) + }, + postArtwork: async (artwork) => { + artworks.push(artwork) + }, + }, + } +} + +export const createCaptureNotification = (): NotificationPort & { messages: string[] } => { + const messages: string[] = [] + return { + messages, + showInformation(message: string): void { + messages.push(message) + }, + } +} + +export const createSpyAnimationHost = (): SidebarAnimationHost & { + syncCalls: number + blocked: boolean + artworkWidth: number + started: boolean +} => { + const state = { + syncCalls: 0, + blocked: false, + artworkWidth: 32, + started: false, + } + return { + setArtworkWidth(width: number): void { + state.artworkWidth = width + }, + syncPartner(): void { + state.syncCalls += 1 + }, + start(): void { + state.started = true + }, + stop(): void { + state.started = false + }, + clearArtwork(): void {}, + async postCurrentFrame(): Promise {}, + isPresentationBlocked(): boolean { + return state.blocked + }, + setPresentationBlocked(blocked: boolean): void { + state.blocked = blocked + }, + getArtworkWidth(): number { + return state.artworkWidth + }, + get syncCalls(): number { + return state.syncCalls + }, + get blocked(): boolean { + return state.blocked + }, + get started(): boolean { + return state.started + }, + } +} + +export const createBattleRepository = ( + outcome: "won" | "lost" = "won", +): EvolutionBattleRepository => ({ + getActivePartner: () => ({ + partnerId: "partner-1", + generation: 1, + currentNodeId: "3-001", + gauge: 50, + isTerminal: false, + createdAt: "2026-01-01T00:00:00.000Z", + retiredAt: null, + pendingEvolutionTargetId: "4-017", + battleOpponentNodeId: "3-051", + }), + resolveEvolutionBattle: () => + outcome === "won" + ? { kind: "won", evolution: { fromNodeId: "3-001", toNodeId: "4-017" } } + : { kind: "lost" }, +}) + +export const createManualScheduler = (): IntervalScheduler & { + tick: () => void + readonly state: { stopped: boolean } +} => { + let callback: (() => void) | undefined + const state = { stopped: false } + return { + state, + start(next: () => void): () => void { + callback = next + state.stopped = false + return () => { + callback = undefined + state.stopped = true + } + }, + tick(): void { + callback?.() + }, + } +} + +export const sequenceRandom = (values: readonly number[]): (() => number) => { + let index = 0 + return () => values[index++] ?? values[values.length - 1] ?? 0.5 +} From 326fcf12436ad3307e2c7eeab49afd7a043c57a7 Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 21:26:24 +0900 Subject: [PATCH 24/41] style(cursor-vpet): apply biome formatting Normalize formatting across source and test files so biome ci passes. Co-authored-by: Cursor --- .../src/application/usage-pipeline.ts | 5 ++- .../cursor-vpet/src/bootstrap/container.ts | 6 ++- .../cursor-vpet/src/shared/escape-html.ts | 6 +-- .../webview/presentation/evolution-artwork.ts | 9 +---- .../presentation/evolution-battle-artwork.ts | 38 +++---------------- .../presentation/evolution-reveal-session.ts | 8 +--- .../presentation/monster-action-policy.ts | 1 - .../src/webview/sidebar/provider.ts | 5 +-- .../src/webview/sidebar/sidebar-presenter.ts | 3 +- .../tests/architecture-boundary-helpers.ts | 11 +----- .../tests/architecture-boundary.test.ts | 4 +- .../cursor-vpet/tests/defeat-artwork.test.ts | 7 +--- .../tests/evolution-reveal-session.test.ts | 32 ++++++---------- .../tests/monster-animation.test.ts | 12 +++++- .../tests/sidebar/test-fixtures.ts | 8 +--- 15 files changed, 49 insertions(+), 106 deletions(-) diff --git a/packages/cursor-vpet/src/application/usage-pipeline.ts b/packages/cursor-vpet/src/application/usage-pipeline.ts index b75504b..761b09a 100644 --- a/packages/cursor-vpet/src/application/usage-pipeline.ts +++ b/packages/cursor-vpet/src/application/usage-pipeline.ts @@ -1,7 +1,10 @@ import type { UsageProcessingResult } from "@sbugallo/vpet-core/application/models/usage.ts" import type { UsageLedger } from "@sbugallo/vpet-core/application/ports/usage-ledger.ts" -import { createCursorUsageEventSource, type CursorUsageEventSource } from "../adapters/cursor/cursor-usage-event-source.ts" +import { + createCursorUsageEventSource, + type CursorUsageEventSource, +} from "../adapters/cursor/cursor-usage-event-source.ts" export type UsagePipeline = CursorUsageEventSource diff --git a/packages/cursor-vpet/src/bootstrap/container.ts b/packages/cursor-vpet/src/bootstrap/container.ts index 5a81794..a36edcf 100644 --- a/packages/cursor-vpet/src/bootstrap/container.ts +++ b/packages/cursor-vpet/src/bootstrap/container.ts @@ -7,7 +7,11 @@ import { type CursorSqliteVpetRepository, } from "../adapters/sqlite/sqlite-vpet-write-store.ts" import { configureSqlJsWasmPath } from "../adapters/sqlite/sqljs-config.ts" -import { getVpetExtensionSettings, toDatabaseOptions, type VpetExtensionSettings } from "../config/extension-settings.ts" +import { + getVpetExtensionSettings, + toDatabaseOptions, + type VpetExtensionSettings, +} from "../config/extension-settings.ts" import { VpetSidebarProvider } from "../webview/vpet-sidebar-provider.ts" export type VpetContainer = { diff --git a/packages/cursor-vpet/src/shared/escape-html.ts b/packages/cursor-vpet/src/shared/escape-html.ts index 3580bd4..9e65fb2 100644 --- a/packages/cursor-vpet/src/shared/escape-html.ts +++ b/packages/cursor-vpet/src/shared/escape-html.ts @@ -1,6 +1,2 @@ export const escapeHtml = (value: string): string => - value - .replaceAll("&", "&") - .replaceAll("<", "<") - .replaceAll(">", ">") - .replaceAll('"', """) + value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """) diff --git a/packages/cursor-vpet/src/webview/presentation/evolution-artwork.ts b/packages/cursor-vpet/src/webview/presentation/evolution-artwork.ts index acb0617..63afc9c 100644 --- a/packages/cursor-vpet/src/webview/presentation/evolution-artwork.ts +++ b/packages/cursor-vpet/src/webview/presentation/evolution-artwork.ts @@ -108,14 +108,7 @@ const animatePhase = async ( const steps = Math.max(1, Math.ceil(durationMs / EVOLUTION_TICK_MS)) for (let step = 0; step <= steps; step += 1) { const progress = step / steps - const artwork = renderEvolutionArtwork( - catalog, - fromSprite, - toSprite, - { phase, progress }, - viewportWidth, - step, - ) + const artwork = renderEvolutionArtwork(catalog, fromSprite, toSprite, { phase, progress }, viewportWidth, step) await onFrame(artwork) if (step < steps) await sleep(EVOLUTION_TICK_MS) } diff --git a/packages/cursor-vpet/src/webview/presentation/evolution-battle-artwork.ts b/packages/cursor-vpet/src/webview/presentation/evolution-battle-artwork.ts index 1a2ce96..c7080db 100644 --- a/packages/cursor-vpet/src/webview/presentation/evolution-battle-artwork.ts +++ b/packages/cursor-vpet/src/webview/presentation/evolution-battle-artwork.ts @@ -114,13 +114,8 @@ const centerText = (width: number, text: string): string => { export const BATTLE_SCORE_HIT_PIP = "█" export const BATTLE_SCORE_MISS_PIP = "░" -export const buildBattleScorePips = ( - hits: number, - total: number = EVOLUTION_BATTLE_HITS_TO_WIN, -): string => - Array.from({ length: total }, (_, index) => - index < hits ? BATTLE_SCORE_HIT_PIP : BATTLE_SCORE_MISS_PIP, - ).join("") +export const buildBattleScorePips = (hits: number, total: number = EVOLUTION_BATTLE_HITS_TO_WIN): string => + Array.from({ length: total }, (_, index) => (index < hits ? BATTLE_SCORE_HIT_PIP : BATTLE_SCORE_MISS_PIP)).join("") export const buildBattleScoreRow = ( playerHits: number, @@ -229,9 +224,7 @@ export const planEvolutionBattle = ( return shots } -export const defaultBattleScene = ( - overrides: Partial = {}, -): EvolutionBattleScene => ({ +export const defaultBattleScene = (overrides: Partial = {}): EvolutionBattleScene => ({ shooter: null, progress: 0, playerPose: "attack", @@ -473,19 +466,9 @@ export const runEvolutionBattleAnimation = async ( if (shot.shooter === "player") playerHits += 1 else opponentHits += 1 } - await animateImpact( - catalog, - playerSprite, - opponentSprite, - viewportWidth, - shot, - playerHits, - opponentHits, - onFrame, - ) + await animateImpact(catalog, playerSprite, opponentSprite, viewportWidth, shot, playerHits, opponentHits, onFrame) - const battleOver = - playerHits >= EVOLUTION_BATTLE_HITS_TO_WIN || opponentHits >= EVOLUTION_BATTLE_HITS_TO_WIN + const battleOver = playerHits >= EVOLUTION_BATTLE_HITS_TO_WIN || opponentHits >= EVOLUTION_BATTLE_HITS_TO_WIN const isLastShot = index === shots.length - 1 if (!battleOver && !isLastShot) { await animatePause(catalog, playerSprite, opponentSprite, viewportWidth, playerHits, opponentHits, onFrame) @@ -493,15 +476,6 @@ export const runEvolutionBattleAnimation = async ( if (battleOver) break } - await animateOutcome( - catalog, - playerSprite, - opponentSprite, - viewportWidth, - outcome, - playerHits, - opponentHits, - onFrame, - ) + await animateOutcome(catalog, playerSprite, opponentSprite, viewportWidth, outcome, playerHits, opponentHits, onFrame) return outcome } diff --git a/packages/cursor-vpet/src/webview/presentation/evolution-reveal-session.ts b/packages/cursor-vpet/src/webview/presentation/evolution-reveal-session.ts index 3632b90..d54dd05 100644 --- a/packages/cursor-vpet/src/webview/presentation/evolution-reveal-session.ts +++ b/packages/cursor-vpet/src/webview/presentation/evolution-reveal-session.ts @@ -19,12 +19,8 @@ export const runEvolutionRevealSession = async ( const to = dependencies.digimonCatalog.byId.get(evolution.toNodeId) if (from === undefined || to === undefined) return false - await runEvolutionAnimation( - dependencies.frameCatalog, - from.sprite, - to.sprite, - viewportWidth, - async (artwork) => dependencies.onArtwork(artwork), + await runEvolutionAnimation(dependencies.frameCatalog, from.sprite, to.sprite, viewportWidth, async (artwork) => + dependencies.onArtwork(artwork), ) return true } diff --git a/packages/cursor-vpet/src/webview/presentation/monster-action-policy.ts b/packages/cursor-vpet/src/webview/presentation/monster-action-policy.ts index 6f2ca4d..6d9af57 100644 --- a/packages/cursor-vpet/src/webview/presentation/monster-action-policy.ts +++ b/packages/cursor-vpet/src/webview/presentation/monster-action-policy.ts @@ -40,4 +40,3 @@ export const resolveSleepClip = ( if (second !== undefined) return [second, second] return [fallback, fallback] } - diff --git a/packages/cursor-vpet/src/webview/sidebar/provider.ts b/packages/cursor-vpet/src/webview/sidebar/provider.ts index 6589fe1..ae0d4f9 100644 --- a/packages/cursor-vpet/src/webview/sidebar/provider.ts +++ b/packages/cursor-vpet/src/webview/sidebar/provider.ts @@ -5,10 +5,7 @@ import type { EvolutionBattleRepository } from "@sbugallo/vpet-core/application/ import { MONSTER_FRAME_CATALOG } from "@sbugallo/vpet-core/data/monster-frame-catalog.ts" import { createAnimationSink, type AnimationSink } from "../../adapters/vscode/animation-sink.ts" -import { - createVsCodeNotificationPort, - type NotificationPort, -} from "../../adapters/vscode/notification-port.ts" +import { createVsCodeNotificationPort, type NotificationPort } from "../../adapters/vscode/notification-port.ts" import { createIntervalScheduler, type IntervalScheduler } from "../../adapters/vscode/scheduler.ts" import { createWebviewMessenger } from "../../adapters/vscode/webview-messenger.ts" import { createSidebarAnimationHost, type SidebarAnimationHost } from "./sidebar-animation-host.ts" diff --git a/packages/cursor-vpet/src/webview/sidebar/sidebar-presenter.ts b/packages/cursor-vpet/src/webview/sidebar/sidebar-presenter.ts index c3fbfce..a414ce4 100644 --- a/packages/cursor-vpet/src/webview/sidebar/sidebar-presenter.ts +++ b/packages/cursor-vpet/src/webview/sidebar/sidebar-presenter.ts @@ -17,7 +17,6 @@ export const buildSidebarPresentation = (snapshot: SidebarSnapshot | null): Side const inputs = getSidebarCardInputs(reader, DIGIMON_CATALOG) const model = buildSidebarCardModel(inputs, DEFAULT_VPET_SETTINGS) const payload = toSidebarWebviewPayload(model) - const partner = - model.kind === "partner" ? { sprite: model.sprite, isDigitama: model.stageNumber === 0 } : undefined + const partner = model.kind === "partner" ? { sprite: model.sprite, isDigitama: model.stageNumber === 0 } : undefined return { payload, partner } } diff --git a/packages/cursor-vpet/tests/architecture-boundary-helpers.ts b/packages/cursor-vpet/tests/architecture-boundary-helpers.ts index fb96d21..debebcb 100644 --- a/packages/cursor-vpet/tests/architecture-boundary-helpers.ts +++ b/packages/cursor-vpet/tests/architecture-boundary-helpers.ts @@ -18,11 +18,7 @@ export const FORBIDDEN_SHARED_IMPORTS = ["vscode", "/adapters/", "/webview/", "/ export const FORBIDDEN_SQLITE_ADAPTER_IMPORTS = ["vscode"] as const -export const FORBIDDEN_VSCODE_ADAPTER_IMPORTS = [ - "/adapters/cursor/", - "/adapters/sqlite/", - "/bootstrap/", -] as const +export const FORBIDDEN_VSCODE_ADAPTER_IMPORTS = ["/adapters/cursor/", "/adapters/sqlite/", "/bootstrap/"] as const export const FORBIDDEN_CURSOR_ADAPTER_IMPORTS = ["vscode", "/webview/"] as const @@ -44,10 +40,7 @@ export const findForbiddenImports = ( const violations: string[] = [] for (const match of importSpecifiers) { const specifier = match[1] ?? match[2] - if ( - specifier !== undefined && - forbiddenImports.some((forbidden) => matchesForbiddenImport(specifier, forbidden)) - ) + if (specifier !== undefined && forbiddenImports.some((forbidden) => matchesForbiddenImport(specifier, forbidden))) violations.push(`${sourcePath}: ${specifier}`) } return violations diff --git a/packages/cursor-vpet/tests/architecture-boundary.test.ts b/packages/cursor-vpet/tests/architecture-boundary.test.ts index cee8c72..c81698b 100644 --- a/packages/cursor-vpet/tests/architecture-boundary.test.ts +++ b/packages/cursor-vpet/tests/architecture-boundary.test.ts @@ -29,9 +29,7 @@ describe("cursor-vpet architecture boundary fixtures", () => { const path = join(directory, "forbidden.ts") try { await writeFile(path, 'import { openReadonlySqlJsDatabase } from "../../adapters/sqlite/sqljs-driver.ts"\n') - expect(await scanPresentationImports(directory)).toEqual([ - `${path}: ../../adapters/sqlite/sqljs-driver.ts`, - ]) + expect(await scanPresentationImports(directory)).toEqual([`${path}: ../../adapters/sqlite/sqljs-driver.ts`]) } finally { await rm(directory, { recursive: true, force: true }) } diff --git a/packages/cursor-vpet/tests/defeat-artwork.test.ts b/packages/cursor-vpet/tests/defeat-artwork.test.ts index 9eff8b6..73cbc06 100644 --- a/packages/cursor-vpet/tests/defeat-artwork.test.ts +++ b/packages/cursor-vpet/tests/defeat-artwork.test.ts @@ -13,12 +13,7 @@ describe("defeat artwork", () => { }) test("Given defeat artwork When rendering Then the sprite is centered in the viewport", () => { - const artwork = renderDefeatArtwork( - MONSTER_FRAME_CATALOG, - "agumon", - { sad: false, sadAlt: false }, - 48, - ) + const artwork = renderDefeatArtwork(MONSTER_FRAME_CATALOG, "agumon", { sad: false, sadAlt: false }, 48) const lines = artwork.split("\n").filter((line) => line.trim().length > 0) expect(lines.length).toBeGreaterThan(0) diff --git a/packages/cursor-vpet/tests/evolution-reveal-session.test.ts b/packages/cursor-vpet/tests/evolution-reveal-session.test.ts index bf5d4e3..690b95d 100644 --- a/packages/cursor-vpet/tests/evolution-reveal-session.test.ts +++ b/packages/cursor-vpet/tests/evolution-reveal-session.test.ts @@ -8,17 +8,13 @@ import { runEvolutionRevealSession } from "../src/webview/presentation/evolution describe("evolution reveal session", () => { test("Given a valid evolution transition When running the session Then it renders evolution artwork", async () => { const frames: string[] = [] - const revealed = await runEvolutionRevealSession( - { fromNodeId: "0-001", toNodeId: "1-001" }, - 80, - { - frameCatalog: MONSTER_FRAME_CATALOG, - digimonCatalog: DIGIMON_CATALOG, - onArtwork: async (artwork) => { - frames.push(artwork) - }, + const revealed = await runEvolutionRevealSession({ fromNodeId: "0-001", toNodeId: "1-001" }, 80, { + frameCatalog: MONSTER_FRAME_CATALOG, + digimonCatalog: DIGIMON_CATALOG, + onArtwork: async (artwork) => { + frames.push(artwork) }, - ) + }) expect(revealed).toBeTrue() expect(frames.length).toBeGreaterThan(0) @@ -26,17 +22,13 @@ describe("evolution reveal session", () => { test("Given an unknown node When running the session Then it is a no-op", async () => { const frames: string[] = [] - const revealed = await runEvolutionRevealSession( - { fromNodeId: "missing", toNodeId: "1-001" }, - 80, - { - frameCatalog: MONSTER_FRAME_CATALOG, - digimonCatalog: DIGIMON_CATALOG, - onArtwork: async (artwork) => { - frames.push(artwork) - }, + const revealed = await runEvolutionRevealSession({ fromNodeId: "missing", toNodeId: "1-001" }, 80, { + frameCatalog: MONSTER_FRAME_CATALOG, + digimonCatalog: DIGIMON_CATALOG, + onArtwork: async (artwork) => { + frames.push(artwork) }, - ) + }) expect(revealed).toBeFalse() expect(frames).toEqual([]) diff --git a/packages/cursor-vpet/tests/monster-animation.test.ts b/packages/cursor-vpet/tests/monster-animation.test.ts index e0beba6..f4b6ba0 100644 --- a/packages/cursor-vpet/tests/monster-animation.test.ts +++ b/packages/cursor-vpet/tests/monster-animation.test.ts @@ -78,7 +78,11 @@ describe("monster animation", () => { test("enters sleeping state after inactivity timeout", () => { let now = 0 - const controller = new MonsterAnimationController(MONSTER_FRAME_CATALOG, () => 0.5, () => now) + const controller = new MonsterAnimationController( + MONSTER_FRAME_CATALOG, + () => 0.5, + () => now, + ) controller.dispatch({ kind: "partner_changed", partner: { sprite: "agumon", isDigitama: false } }) now = SLEEP_AFTER_MS const output = controller.dispatch({ kind: "tick" }) @@ -87,7 +91,11 @@ describe("monster animation", () => { test("wakes from sleeping on activity", () => { let now = 0 - const controller = new MonsterAnimationController(MONSTER_FRAME_CATALOG, () => 0.5, () => now) + const controller = new MonsterAnimationController( + MONSTER_FRAME_CATALOG, + () => 0.5, + () => now, + ) controller.dispatch({ kind: "partner_changed", partner: { sprite: "agumon", isDigitama: false } }) now = SLEEP_AFTER_MS controller.dispatch({ kind: "tick" }) diff --git a/packages/cursor-vpet/tests/sidebar/test-fixtures.ts b/packages/cursor-vpet/tests/sidebar/test-fixtures.ts index 9c5ca66..9c91a08 100644 --- a/packages/cursor-vpet/tests/sidebar/test-fixtures.ts +++ b/packages/cursor-vpet/tests/sidebar/test-fixtures.ts @@ -108,9 +108,7 @@ export const createSpyAnimationHost = (): SidebarAnimationHost & { } } -export const createBattleRepository = ( - outcome: "won" | "lost" = "won", -): EvolutionBattleRepository => ({ +export const createBattleRepository = (outcome: "won" | "lost" = "won"): EvolutionBattleRepository => ({ getActivePartner: () => ({ partnerId: "partner-1", generation: 1, @@ -123,9 +121,7 @@ export const createBattleRepository = ( battleOpponentNodeId: "3-051", }), resolveEvolutionBattle: () => - outcome === "won" - ? { kind: "won", evolution: { fromNodeId: "3-001", toNodeId: "4-017" } } - : { kind: "lost" }, + outcome === "won" ? { kind: "won", evolution: { fromNodeId: "3-001", toNodeId: "4-017" } } : { kind: "lost" }, }) export const createManualScheduler = (): IntervalScheduler & { From 463244262a1fc918750f3e966b3dbce680afbcde Mon Sep 17 00:00:00 2001 From: Jorge Cendal Date: Fri, 11 Sep 2026 21:51:27 +0900 Subject: [PATCH 25/41] refactor(cursor-vpet): centralize constants and expand test coverage Move repeated literals into shared/constants, add tsconfig.test.json so Bun tests typecheck in the IDE, and cover game persistence, usage pipeline, and domain evolution rules. Co-authored-by: Cursor --- .../docs/REFACTORING-IMPLEMENTATION-SPEC.md | 1682 +++++++++++++++++ packages/cursor-vpet/package.json | 2 +- .../adapters/cursor/cursor-api-watermark.ts | 5 +- .../src/adapters/cursor/cursor-auth.ts | 5 +- .../src/adapters/cursor/install-hooks.ts | 5 +- .../sqlite/sqlite-sidebar-snapshot-reader.ts | 4 +- .../sqlite/sqlite-vpet-archive-reader.ts | 3 +- .../cursor-vpet/src/bootstrap/container.ts | 2 +- .../src/shared/constants/cursor.ts | 3 + .../src/shared/constants/evolution-battle.ts | 6 + .../src/shared/constants/monster-artwork.ts | 5 + .../shared/constants/presentation-timing.ts | 24 + .../src/shared/constants/sidebar-ui.ts | 6 + .../src/shared/constants/sqlite.ts | 3 + .../webview/presentation/animated-artwork.ts | 8 +- .../webview/presentation/defeat-artwork.ts | 13 +- .../webview/presentation/evolution-artwork.ts | 29 +- .../presentation/evolution-battle-artwork.ts | 52 +- .../webview/presentation/monster-animation.ts | 4 +- .../presentation/monster-artwork-mirror.ts | 9 +- .../webview/sidebar/sidebar-animation-host.ts | 7 +- .../src/webview/sidebar/sidebar-render.ts | 18 +- .../tests/catalog-evolution.test.ts | 102 + .../tests/cursor-usage-event-source.test.ts | 192 ++ .../tests/evolution-battle-artwork.test.ts | 2 +- .../tests/evolution-battle-session.test.ts | 92 +- .../tests/get-sidebar-card-inputs.test.ts | 99 + .../tests/monster-animation.test.ts | 8 +- .../tests/persistence/persistence-fixtures.ts | 51 + ...te-vpet-archive-reader.persistence.test.ts | 50 + .../persistence/vpet-game-persistence.test.ts | 175 ++ .../cursor-vpet/tests/record-usage.test.ts | 175 ++ .../tests/sidebar-presenter.test.ts | 64 + .../cursor-vpet/tests/sidebar-render.test.ts | 47 +- .../sidebar/sidebar-orchestrator.test.ts | 31 +- .../tests/sidebar/sidebar-provider.test.ts | 10 +- .../tests/sidebar/test-fixtures.ts | 3 + packages/cursor-vpet/tests/tsconfig.json | 5 + packages/cursor-vpet/tsconfig.test.json | 9 + 39 files changed, 2878 insertions(+), 132 deletions(-) create mode 100644 packages/cursor-vpet/docs/REFACTORING-IMPLEMENTATION-SPEC.md create mode 100644 packages/cursor-vpet/src/shared/constants/cursor.ts create mode 100644 packages/cursor-vpet/src/shared/constants/evolution-battle.ts create mode 100644 packages/cursor-vpet/src/shared/constants/monster-artwork.ts create mode 100644 packages/cursor-vpet/src/shared/constants/presentation-timing.ts create mode 100644 packages/cursor-vpet/src/shared/constants/sidebar-ui.ts create mode 100644 packages/cursor-vpet/src/shared/constants/sqlite.ts create mode 100644 packages/cursor-vpet/tests/catalog-evolution.test.ts create mode 100644 packages/cursor-vpet/tests/cursor-usage-event-source.test.ts create mode 100644 packages/cursor-vpet/tests/get-sidebar-card-inputs.test.ts create mode 100644 packages/cursor-vpet/tests/persistence/persistence-fixtures.ts create mode 100644 packages/cursor-vpet/tests/persistence/sqlite-vpet-archive-reader.persistence.test.ts create mode 100644 packages/cursor-vpet/tests/persistence/vpet-game-persistence.test.ts create mode 100644 packages/cursor-vpet/tests/record-usage.test.ts create mode 100644 packages/cursor-vpet/tests/tsconfig.json create mode 100644 packages/cursor-vpet/tsconfig.test.json diff --git a/packages/cursor-vpet/docs/REFACTORING-IMPLEMENTATION-SPEC.md b/packages/cursor-vpet/docs/REFACTORING-IMPLEMENTATION-SPEC.md new file mode 100644 index 0000000..1c2f92e --- /dev/null +++ b/packages/cursor-vpet/docs/REFACTORING-IMPLEMENTATION-SPEC.md @@ -0,0 +1,1682 @@ +# Especificación técnica de refactorización — `cursor-vpet` + +| Campo | Valor | +|-------|-------| +| **Paquete** | `packages/cursor-vpet` | +| **Versión del documento** | 1.1 | +| **Fecha** | 2026-09-11 | +| **Estado** | En progreso — ~15 % del plan de refactor completado; feature de batalla/evolución ya mergeada en ambos hosts | +| **Alcance** | Refactorización de `cursor-vpet`, cambios coordinados en `vpet-core`, `vpet-animation` (nuevo) y `opencode-vpet` | +| **Último commit relevante** | `3b91b30` — *feat: evolve Digitama directly and split battle from reveal animations* | + +--- + +## Tabla de contenidos + +1. [Resumen ejecutivo](#1-resumen-ejecutivo) + - [1.4 Estado de implementación (snapshot)](#14-estado-de-implementación-snapshot) +2. [Contexto y arquitectura actual](#2-contexto-y-arquitectura-actual) +3. [Diferencias entre hosts (OpenCode vs Cursor)](#3-diferencias-entre-hosts-opencode-vs-cursor) +4. [Inventario de problemas por subsistema](#4-inventario-de-problemas-por-subsistema) +5. [Decisiones de diseño](#5-decisiones-de-diseño) +6. [Arquitectura objetivo](#6-arquitectura-objetivo) +7. [Plan de implementación por PR](#7-plan-de-implementación-por-pr) +8. [Especificaciones de módulos nuevos](#8-especificaciones-de-módulos-nuevos) +9. [Estructura de carpetas objetivo](#9-estructura-de-carpetas-objetivo) +10. [Plan de pruebas](#10-plan-de-pruebas) +11. [Riesgos y mitigaciones](#11-riesgos-y-mitigaciones) +12. [Criterios de aceptación globales](#12-criterios-de-aceptación-globales) +13. [Apéndices](#13-apéndices) + +--- + +## 1. Resumen ejecutivo + +### 1.1 Objetivo + +Refactorizar `cursor-vpet` para: + +- Eliminar duplicación de código (interna y cross-package con `opencode-vpet`). +- Aplicar patrones modernos: responsabilidad única, inyección de dependencias, composición explícita. +- Mejorar rendimiento (lectura SQLite, coordinación de refrescos). +- Mantener paridad funcional y compatibilidad con `pet.db` compartida. + +### 1.2 Principio rector: separar lógica pura de presentación host-specific + +| Capa | Compartir entre hosts | Mantener host-specific | +|------|----------------------|------------------------| +| Dominio y use cases | ✅ `vpet-core` (ya existe) | — | +| Animación idle (state machine) | ✅ Nuevo `vpet-animation` | — | +| Render ASCII posicionado → `string` | ✅ `vpet-animation` | — | +| Queries SQLite de lectura | ✅ `vpet-core` | Drivers (`sql.js` / `bun:sqlite`) | +| Batalla/evolución/derrota visual (ASCII) | ✅ Ambos hosts (duplicado) | Entrega: OpenTUI vs Webview | +| Entrega al usuario | ❌ | OpenTUI vs Webview | +| HTML / componentes UI | ❌ | Por host | + +### 1.3 Estimación + +| Fase | PRs | Duración estimada | +|------|-----|-------------------| +| Fundamentos | PR-0, PR-1 | 5–6 días | +| Hooks y animación compartida | PR-2, PR-3 | 7–8 días | +| UI Cursor y artworks | PR-4, PR-5 | 8–10 días | +| Bootstrap y calidad | PR-6, PR-7 | 4–5 días | +| **Total** | **7 PRs** | **~4–6 semanas** | + +Cada PR debe ser mergeable de forma independiente, con tests pasando. + +### 1.4 Estado de implementación (snapshot) + +**Fecha del snapshot:** 2026-09-11 +**Progreso global del plan de refactor (PR-0 … PR-7):** ~15 % + +#### Matriz de PRs + +| PR | Título | Estado | Notas | +|----|--------|--------|-------| +| PR-0 | Fundamentos y utilidades (`shared/`, eliminar `sqljs-runtime`) | ❌ Pendiente | `sqljs-runtime.ts` sigue existiendo; `CompletedUsage` sigue duplicado en `types.ts` | +| PR-1 | Capa SQLite | 🟡 Parcial | **Hecho:** repository único expone `getSidebarSnapshot()` desde executor en memoria; `extension.ts` pasa `repository` como reader y battle repo. **Pendiente:** `sqljs-statement-executor`, queries en `vpet-core`, deprecar lectura por archivo en runtime | +| PR-2 | Capa Cursor — hooks y usage | ❌ Pendiente | Sin `hook-events-reader`, sin `onActivity`, sin caché de token | +| PR-3 | Paquete `vpet-animation` | ❌ Pendiente | Paquete no creado; duplicación monster-animation intacta en ambos hosts | +| PR-4 | Artworks Cursor-only (refactor interno) | ❌ Pendiente | Sin carpeta `webview/artwork/`; `evolution-battle-artwork.ts` sigue en 510 líneas | +| PR-5 | Webview y sidebar — descomposición | 🟡 Parcial | **Hecho:** `evolution-battle-session.ts`, `evolution-reveal-session.ts`, refresh con cola (`refreshInFlight` / `pendingRefresh`), sin recursión. **Pendiente:** presenter, animation-host, orchestrator, escape HTML, provider < 100 líneas | +| PR-6 | Extension bootstrap | ❌ Pendiente | `extension.ts` sigue en 136 líneas, monolítico | +| PR-7 | Calidad y architecture boundaries | ❌ Pendiente | Sin `architecture-boundary.test.ts` en cursor-vpet | + +#### Trabajo mergeado fuera del plan de refactor + +Desde el borrador inicial se incorporó la **feature de batalla de evolución** en ambos hosts (commits `093550d` … `3b91b30`): + +| Módulo | `cursor-vpet` | `opencode-vpet` | Duplicación | +|--------|---------------|-----------------|-------------| +| `evolution-battle-session.ts` | `webview/` | `tui/` | ~100 % | +| `evolution-reveal-session.ts` | `webview/` | `tui/` | ~100 % | +| `evolution-battle-artwork.ts` | `webview/` (510 líneas) | `tui/` (510 líneas) | ~100 % | +| `evolution-artwork.ts` | `webview/` | `tui/` | Alta | +| `defeat-artwork.ts` | `webview/` | `tui/` | Alta | + +OpenCode ya **no** resuelve batallas solo con toast: `tui.tsx` orquesta `runEvolutionBattleSession` con animación ASCII en sidebar, igual que Cursor con webview. + +#### Problemas del inventario §4 — resueltos o mitigados + +| ID | Estado | Evidencia | +|----|--------|-----------| +| EXT-03 | ✅ Mitigado | `extension.ts` usa un solo `repository` para escritura, snapshot y batalla | +| EXT-08 | 🟡 Parcial | "Not now" no marca hooks instalados; aún se marca `true` sin verificar éxito de `installVpetHooks` | +| SQL-04 | 🟡 Parcial | Runtime del sidebar lee del executor en memoria; `readSidebarSnapshot` / paneles siguen abriendo DB en disco | +| SQL-13 | 🟡 Parcial | Watcher llama `reloadFromDisk()`; snapshot coherente vía mismo executor tras reload | +| WV-02 | ✅ Mitigado | `refresh()` usa bucle `do…while` + cola en lugar de recursión | +| WV-01 | 🟡 Parcial | Lógica de batalla/reveal extraída a sessions; provider sigue con 238 líneas y 6+ responsabilidades | + +#### Tests actuales (`packages/cursor-vpet/tests/`) + +| Archivo | Cubre | +|---------|-------| +| `evolution-battle-session.test.ts` | Sesión de batalla (nuevo) | +| `evolution-reveal-session.test.ts` | Sesión de reveal (nuevo) | +| `evolution-battle-artwork.test.ts` | Snapshots ASCII batalla | +| `evolution-artwork.test.ts` | Snapshots ASCII evolución | +| `defeat-artwork.test.ts` | Snapshots ASCII derrota | +| `monster-animation.test.ts` | Animación idle (local, pendiente migrar a `vpet-animation`) | +| `persistence/sqljs-vpet-repository.persistence.test.ts` | Persistencia sql.js | +| `sidebar-render.test.ts`, `cursor-*`, `database-change-watcher.test.ts` | Render, hooks mapper, watcher | + +**Ausentes respecto al plan:** `architecture-boundary`, `sidebar-presenter`, `evolution-battle-orchestrator`, `escape-html`, `hook-events-reader`, tests de `VpetSidebarProvider`. + +--- + +## 2. Contexto y arquitectura actual + +### 2.1 Estructura del paquete (31 archivos `.ts` en `src/`) + +``` +packages/cursor-vpet/ +├── src/ +│ ├── extension.ts # Composition root (monolítico, 136 líneas) +│ ├── config/ +│ │ └── extension-settings.ts +│ ├── adapters/ +│ │ ├── cursor/ # Hooks, API watermark, auth (7 archivos) +│ │ └── sqlite/ # sql.js driver, readers, watcher (7 archivos) +│ └── webview/ # Sidebar, artworks, sessions, paneles (14 archivos) +│ ├── vpet-sidebar-provider.ts +│ ├── evolution-battle-session.ts # NUEVO — orquestación batalla + reveal/defeat +│ ├── evolution-reveal-session.ts # NUEVO — animación evolución reutilizable +│ ├── evolution-battle-artwork.ts +│ ├── evolution-artwork.ts +│ ├── defeat-artwork.ts +│ ├── monster-animation.ts # Pendiente mover a vpet-animation +│ └── … +├── tests/ # 11 archivos de test +├── hook-bridge.js +├── scripts/build.ts +└── package.json +``` + +### 2.2 Dependencias + +| Dependencia | Uso | +|-------------|-----| +| `@sbugallo/vpet-core` | Dominio, use cases, view models, catálogo | +| `sql.js` | SQLite en memoria (VS Code extension, sin native modules) | +| `vscode` | API de extensión (external en build) | + +### 2.3 Flujo de datos actual + +``` +Cursor Hooks (hook-bridge.js) + → vpet-hook-events.jsonl + → cursor-usage-event-source (file watcher) + → recordUsage (vpet-core) + → sqlite repository (sql.js, writable, única conexión) + → database-change-watcher (reloadFromDisk + refresh si no hay presentación) + → refresh sidebar + +Sidebar refresh (VpetSidebarProvider.refresh): + → repository.getSidebarSnapshot() # executor en memoria, sin readFileSync + → resolvePendingBattleIfNeeded + → runEvolutionBattleSession + → runEvolutionBattleAnimation + → runEvolutionRevealSession | runDefeatAnimation + → resolveEvolutionBattleForPartner + → playPendingEvolutionReveal # evolución directa (p. ej. Digitama) + → runEvolutionRevealSession + → publishSidebarModel + → postMessage → webview + +Usage con evolución directa (sin batalla): + → onApplied callback en extension.ts + → sidebarProvider.queueEvolutionReveal(evolution) + → refresh → playPendingEvolutionReveal + +Animación idle: + → MonsterAnimationController (tick 500ms, pausado durante presentación) + → renderPositionedArtwork + → postMessage { type: "animation-frame" } + +Lectura one-shot (paneles Dex/History, tests persistencia): + → readArchive / readSidebarSnapshot / createSqliteSidebarSnapshotReader + → abre sql.js desde disco en cada llamada # pendiente de eliminar en runtime +``` + +### 2.4 Lo que ya está bien + +- Dominio delegado correctamente a `vpet-core`. +- Puertos/adaptadores: `UsageLedger`, `SidebarSnapshotReader`, `EvolutionBattleRepository`. +- `MonsterAnimationController` como máquina de estados pura. +- Tests unitarios sólidos en artwork, animación, mappers y persistencia sql.js. +- Separación `adapters/` vs `webview/`. +- Repository único en `extension.ts` (escritura + snapshot + batalla). +- Sesiones de batalla/reveal extraídas (`evolution-battle-session`, `evolution-reveal-session`) con tests propios. +- Refresh del sidebar con cola y sin recursión; presentaciones bloquean watcher y tick idle. +- Sincronización multi-ventana de `pet.db` vía `database-change-watcher` + `reloadFromDisk`. + +--- + +## 3. Diferencias entre hosts (OpenCode vs Cursor) + +### 3.1 Tabla comparativa tecnológica + +| Aspecto | OpenCode (`opencode-vpet`) | Cursor (`cursor-vpet`) | +|---------|---------------------------|------------------------| +| **Runtime** | Bun + `bun:sqlite` | Node 24 + `sql.js` (WASM) | +| **UI** | SolidJS + OpenTUI (``, ``) | VS Code Webview (HTML/CSS/JS) | +| **Estado animación** | `createSignal` | Campos privados + `postMessage` | +| **Tick visual** | `setInterval` 500ms → `requestRender()` | `setInterval` 500ms → `postMessage` | +| **Ancho viewport** | `onSizeChange` en `BoxRenderable` | `ResizeObserver` + medición char width en cliente | +| **Actividad usuario** | Eventos `message.updated`, `session.status` → `dispatch(activity)` | ❌ No implementado | +| **Poll de datos** | `createSidebarPollLoop` (con `refreshPending`) | `setInterval` 30s bruto + eventos ad hoc | +| **Batalla evolución** | `runEvolutionBattleSession` en `tui.tsx` + toast | `runEvolutionBattleSession` en sidebar provider | +| **Evolución visual** | `runEvolutionRevealSession` tras victoria o evolución directa | Igual vía webview + `queueEvolutionReveal` | +| **Derrota visual** | `runDefeatAnimation` tras derrota en batalla | Igual vía webview | +| **Usage tracking** | OpenCode SDK events + `reconcileUsage` | Cursor hooks + API watermark fallback | +| **Dex / History** | Diálogos OpenTUI | Webview panels | + +### 3.2 Divergencia de producto: batalla de evolución (actualizada 2026-09) + +**Estado actual:** Ambos hosts reproducen batalla visual ASCII antes de persistir el resultado. La divergencia es de **entrega** (OpenTUI vs Webview), no de producto. + +**OpenCode** (`tui.tsx` + `tui/evolution-battle-session.ts`): + +```typescript +await runEvolutionBattleSession(snapshot, artworkWidth, { + frameCatalog, digimonCatalog, repository, + onArtwork: (artwork) => setCustomArtwork(artwork), +}) +// Toast de notificación vía server hooks; animación en sidebar TUI +``` + +**Cursor** (`vpet-sidebar-provider.ts` + `webview/evolution-battle-session.ts`): + +```typescript +await runEvolutionBattleSession(snapshot, this.artworkWidth, { + frameCatalog, digimonCatalog, repository, + onArtwork: async (artwork) => this.postArtwork(artwork), + onResolved: async (result) => { /* VS Code notifications */ }, +}) +``` + +**Server hooks OpenCode** (`create-server-hooks.ts`): solo emiten toast `evolution_battle` cuando `evolutionBattlePending`; la animación la ejecuta el TUI en el siguiente refresh. + +**Decisión vigente:** Mantener orquestación host-specific, pero **extraer `evolution-battle-session` y artworks duplicados** a un paquete compartido (candidato: ampliar `vpet-animation` o nuevo `vpet-presentation`). El borrador original que limitaba batalla visual a Cursor está **obsoleto**. + +### 3.3 Código duplicado entre hosts (candidatos a extracción) + +| Módulo cursor-vpet | Módulo opencode-vpet | Similitud | Paquete destino propuesto | +|--------------------|----------------------|-----------|---------------------------| +| `webview/monster-animation.ts` | `tui/monster-animation.ts` | ~95% | `vpet-animation` | +| `webview/monster-walking-policy.ts` | `tui/monster-walking-policy.ts` | ~100% | `vpet-animation` | +| `webview/monster-action-policy.ts` | `tui/monster-action-policy.ts` | 100% | `vpet-animation` | +| `webview/monster-artwork-mirror.ts` | `tui/monster-artwork-mirror.ts` | ~100% | `vpet-animation` | +| `webview/animated-artwork.ts` | `tui/sidebar-card.tsx` (`artworkRows`) | Lógica equivalente | `vpet-animation` | +| `webview/evolution-battle-session.ts` | `tui/evolution-battle-session.ts` | ~100% | `vpet-animation` o `vpet-presentation` | +| `webview/evolution-reveal-session.ts` | `tui/evolution-reveal-session.ts` | ~100% | Idem | +| `webview/evolution-battle-artwork.ts` | `tui/evolution-battle-artwork.ts` | ~100% (510 líneas c/u) | Idem | +| `webview/evolution-artwork.ts` | `tui/evolution-artwork.ts` | Alta | Idem | +| `webview/defeat-artwork.ts` | `tui/defeat-artwork.ts` | Alta | Idem | + +### 3.4 Código exclusivo por host (NO compartir tal cual) + +| Módulo | Host | Líneas aprox. | Razón | +|--------|------|---------------|-------| +| `sidebar-render.ts` | Cursor | 214 | HTML/CSS/JS webview | +| `vpet-sidebar-provider.ts` | Cursor | 238 | Orquestación VS Code WebviewView | +| `dex-panel.ts`, `history-panel.ts` | Cursor | ~35 c/u | Webview panels | +| `adapters/cursor/*` | Cursor | — | Integración Cursor-specific | +| `tui.tsx`, `sidebar-card.tsx` | OpenCode | — | Composición OpenTUI / SolidJS | +| `adapters/opencode/*` | OpenCode | — | Server hooks, toasts, SDK | + +--- + +## 4. Inventario de problemas por subsistema + +### 4.1 `extension.ts` — Composition root + +**Archivo:** `src/extension.ts` (136 líneas) + +| ID | Problema | Severidad | Impacto | Estado | +|----|----------|-----------|---------|--------| +| EXT-01 | Monolito de wiring; difícil de testear `activate` | Media | Mantenibilidad | ❌ Pendiente | +| EXT-02 | 8 comandos con patrón repetido: `run → showInformationMessage → refreshSidebar` | Baja | Duplicación | ❌ Pendiente | +| EXT-03 | Dos conexiones DB: `repository` + `snapshotReader` independientes | Alta | Rendimiento, consistencia | ✅ Resuelto — un solo `repository` | +| EXT-04 | Triple fuente de refresh sin coordinación: usage events + DB watcher + poll 30s | Media | Renders redundantes | 🟡 Parcial — watcher respeta `isPresentationInProgress()` | +| EXT-05 | `onDidChangeConfiguration` avisa "reload window" pero no recarga DB | Media | UX incorrecta | ❌ Pendiente | +| EXT-06 | `sidebarProvider` como variable module-level mutable | Baja | Testabilidad | ❌ Pendiente | +| EXT-07 | Instalación hooks duplicada: `ensureHooksInstalled` vs comando `installHooks` | Media | Duplicación | ❌ Pendiente | +| EXT-08 | **Bug:** `ensureHooksInstalled` marca `hooksInstalled=true` incorrectamente | Alta | Estado incorrecto | 🟡 Parcial — "Not now" OK; falta validar éxito del install | + +**Código problemático EXT-08:** + +```typescript +// extension.ts líneas 25-39 +const choice = await vscode.window.showInformationMessage(...) +if (choice !== "Install hooks") return +// ... +await context.globalState.update(key, true) // OK — solo tras install + +// Pero si el usuario elige "Install hooks", se marca true incluso si install falla silenciosamente +``` + +Corrección: marcar `true` solo tras `installVpetHooks` exitoso; nunca marcar en "Not now". + +--- + +### 4.2 Capa SQLite (`adapters/sqlite/`) + +#### 4.2.1 `sqljs-driver.ts` + +| ID | Problema | Severidad | +|----|----------|-----------| +| SQL-01 | `createWritableExecutor` y `createReadonlyExecutor` duplican ~40 líneas de `prepare/bind/step/getAsObject/free` | Media | +| SQL-02 | Writable hace `reloadIfStale` en cada operación; costoso pero necesario para multi-proceso | Info | +| SQL-03 | Sin `PRAGMA busy_timeout` ni WAL (diferente a bun driver) | Baja | + +#### 4.2.2 `sqlite-sidebar-snapshot-reader.ts` + +| ID | Problema | Severidad | Estado | +|----|----------|-----------|--------| +| SQL-04 | **Abre nueva conexión sql.js y lee archivo completo en cada lectura disco** | Alta | 🟡 Mitigado en runtime sidebar (repository); persiste en `readSidebarSnapshot` / paneles | +| SQL-05 | `readSidebarSnapshotFromExecutor` es correcta pero lógica duplicada inline en opencode-vpet | Alta | +| SQL-06 | `isRecoverableSqliteReadError` con string matching frágil en mensajes de error | Media | +| SQL-07 | `createSqliteSidebarSnapshotReader` y `readSidebarSnapshot` — dos APIs para lo mismo | Baja | + +**Código problemático SQL-04:** + +```typescript +const readSidebarSnapshotWithRuntime = (SQL, databasePath) => { + const database = new SQL.Database(readFileSync(databasePath)) // I/O + parse cada vez + try { ... } finally { database.close() } +} +``` + +#### 4.2.3 `sqlite-vpet-archive-reader.ts` + +| ID | Problema | Severidad | +|----|----------|-----------| +| SQL-08 | `toArchiveEvent`, `groupEventsByPartnerId`, `readSqliteVpetArchive` duplicados en opencode-vpet | Alta | +| SQL-09 | `dex-panel` / `history-panel` usan `readArchive` one-shot (abre DB cada vez) | Media | +| SQL-10 | `createSqliteVpetArchiveReader` vs `readArchive` — APIs redundantes | Baja | + +#### 4.2.4 `sqljs-runtime.ts` + +| ID | Problema | Severidad | +|----|----------|-----------| +| SQL-11 | **Código muerto:** `openDatabaseFromPath` no importado en ningún sitio | Baja | + +#### 4.2.5 `database-change-watcher.ts` + +| ID | Problema | Severidad | +|----|----------|-----------| +| SQL-12 | Bien diseñado (debounce 200ms, dispose) | — | +| SQL-13 | Al cambiar DB llama `repository.reloadFromDisk()` pero snapshotReader sigue leyendo disco aparte | Alta | + +#### 4.2.6 Tipos repetidos + +| ID | Problema | +|----|----------| +| SQL-14 | `CreateSqliteVpetRepositoryOptions`, `CreateSqliteSidebarSnapshotReaderOptions`, `CreateSqliteVpetArchiveReaderOptions`, `DatabaseChangeWatcherOptions` — todos alias de `HostPathOptions & { databasePath?: string }` | + +--- + +### 4.3 Capa Cursor (`adapters/cursor/`) + +#### 4.3.1 `cursor-usage-event-source.ts` + +| ID | Problema | Severidad | +|----|----------|-----------| +| CUR-01 | Acoplamiento directo a `DIGIMON_CATALOG`, `STAGE_GAUGE_THRESHOLDS` — debería inyectarse | Media | +| CUR-02 | File watcher por offset; corrupto si archivo se trunca/rota | Media | +| CUR-03 | `processedReceipts` Set sin límite — crece en sesiones largas | Media | +| CUR-04 | `console.log` en producción sin nivel configurable | Baja | +| CUR-05 | No dispara evento `activity` al animation controller | Alta | + +#### 4.3.2 `cursor-api-watermark.ts` + +| ID | Problema | Severidad | +|----|----------|-----------| +| CUR-06 | Bien estructurado; funciones puras testeables | — | +| CUR-07 | `sleep` duplicado (también en artwork files) | Baja | +| CUR-08 | `captureWatermark` fallback `Date.now()` puede dar watermarks inconsistentes sin token | Media | + +#### 4.3.3 `cursor-auth.ts` + +| ID | Problema | Severidad | +|----|----------|-----------| +| CUR-09 | Abre `state.vscdb` con sql.js en cada llamada API | Media | +| CUR-10 | Sin caché de access token | Media | +| CUR-11 | `queryItemTable` duplica patrón prepare/bind del driver | Baja | + +#### 4.3.4 `types.ts` + +| ID | Problema | Severidad | +|----|----------|-----------| +| CUR-12 | `CompletedUsage` duplica `vpet-core/application/use-cases/record-usage.ts` | Media | + +#### 4.3.5 `install-hooks.ts` + `hook-bridge.js` + +| ID | Problema | Severidad | +|----|----------|-----------| +| CUR-13 | Ruta eventos duplicada: `paths.ts` vs constante en `hook-bridge.js` | Media | +| CUR-14 | `hook-bridge.js` fuera del bundle; puede desincronizarse del paquete | Media | + +--- + +### 4.4 Webview — Sidebar (`webview/`) + +#### 4.4.1 `vpet-sidebar-provider.ts` — God class (238 líneas) + +| ID | Problema | Severidad | Estado | +|----|----------|-----------|--------| +| WV-01 | 8 responsabilidades mezcladas en una clase (ver §8.3) | Alta | 🟡 Parcial — batalla/reveal delegados a sessions | +| WV-02 | `refresh()` recursivo tras batalla — riesgo stack en edge cases | Media | ✅ Resuelto — bucle + `pendingRefresh` | +| WV-03 | Notificaciones VS Code mezcladas con lógica de animación | Baja | ❌ Pendiente | +| WV-04 | `Math.random()` inline para outcome de batalla — no inyectable | Baja | 🟡 Parcial — inyectable en session, default `Math.random` | + +**Responsabilidades actuales (deben separarse):** + +1. Ciclo de vida `WebviewView` (VS Code API) +2. Construcción modelo: `getSidebarCardInputs` + `buildSidebarCardModel` +3. Detección y orquestación batalla evolución +4. Tres animaciones especiales + animación idle +5. `setInterval` visual (500ms) +6. Cache `cachedPayload` / `cachedArtwork` +7. Handlers mensajes webview (`open-url`, `artwork-width`) +8. `vscode.window.showInformationMessage` + +#### 4.4.2 `sidebar-render.ts` + +| ID | Problema | Severidad | +|----|----------|-----------| +| WV-05 | ~140 líneas HTML/JS inline sin syntax highlighting | Media | +| WV-06 | CSP nonce = `String(Date.now())` — no es nonce criptográfico | Baja | +| WV-07 | `pixelWidthToArtworkColumns` duplicado en TS y en `