Companion web app for Hollywood Animal — plan movie tags, check synergies and conflicts, calculate Art & Commercial scores, build release plans, generate scripts, and analyze advertisers. Load a save file to use your in-game tag pool, view raid/trial intel, and link in-game movies to pinned scripts.
This is a rewritten and extended version of CallOn84/Hollywood-Animal-Calculator.
Try it: https://userbig.github.io/hollywood-animal-planner/
| Section | Description |
|---|---|
| Board | Pin scripts (from Generator or import), filter by source/status, sort by date/score/compatibility. Mark scripts as “released”, link them to in-game movies from a loaded save, archive/restore backlog. Quick actions: open Synergy, Advertisers, or Plan. |
| Release Plan | 9-slot plan (e.g. 2 films/year × 2.5 years). Fill slots from Board or generate on the fly. Uniqueness: allow tag repetition or enforce low/medium/high across slots. Plan history (snapshots). |
| Script Generator | Batch generation with target compatibility and target movie score. Locked/excluded tags, profiles: custom, starting tags, save-based, or preset. Optional “skip low quality” and “fully diverse tags”. Backlog of generated scripts, pin to Board. |
| SE Compatibility | Pick tags and see synergy result: average compatibility, Art/Commercial bonuses, effective scores, tag cap, conflict detection. Links to Best Advertisers. |
| Best Advertisers | Pick tags and see which advertisers (NBG, Spark, Velvet Gloss, etc.) fit best by demographic and type (Universal/Art/Commercial). Pre-release / release / post-release phases, owned theatres. |
| Save file | Load a Hollywood Animal .json save. Use tag pool/codex from save in Generator and filters. Optional “secrets” parsing: police raid dates, surveillance, trials, secrets history. “Our movies” list and link to pinned scripts. |
| Localization | UI in English, Ukrainian, Russian, German, French, Spanish, Portuguese, Japanese, Chinese, Belarusian. |
| Themes | Default, Warm, Valve (clear). Persisted in localStorage. |
hollywood-animal-planner/
├── index.html
├── package.json
├── vite.config.ts
├── tailwind.config.js
├── assembly/
│ └── index.ts # AssemblyScript: compatibility matrix, tag bonuses, matrix score, script generator candidate swap (WASM)
├── public/
│ ├── fonts/
│ ├── wasm/
│ │ └── release.wasm # Built from assembly/ (npm run wasm:build)
│ ├── data/ # Game data (loaded at runtime)
│ │ ├── TagData.json
│ │ ├── TagsAudienceWeights.json
│ │ ├── TagCompatibilityData.json
│ │ └── GenrePairs.json
│ └── localization/ # English.json, Ukrainian.json, etc.
├── src/
│ ├── main.ts # Vue app, Pinia + persisted statet
│ ├── App.vue # Tab routing (#board, #plan, #generator, #synergy, #advertisers), gameData + WASM init
│ ├── style.css # Tailwind + global CSS variables (themes)
│ ├── types/
│ │ └── game.ts # Tag, Demographic, TagInput, SavedScript, PlanSlotEntry, ParsedSaveData, SaveSecretsInfo, etc.
│ ├── stores/
│ │ ├── calculator.ts # Tags (synergy/advertisers/generator/excluded), scores, generator state, pinned scripts, plan slots, save data, game-movie links
│ │ ├── gameData.ts # Tags, compatibility, genre pairs, demographics, ad agents, holidays, localization, loadData/loadLocalization
│ │ └── theme.ts # Theme id (default/warm/valve), persist + apply to document
│ ├── utils/
│ │ ├── wasmCalculator.ts # Load WASM, init matrix from gameData, calculateMatrixScoreWasm, trySwapCandidatesWasm
│ │ ├── calculator.ts # Matrix score (WASM or JS fallback), bonuses, audience affinity, formatScore
│ │ ├── saveFileParser.ts # Parse .json save → ParsedSaveData, optional secrets (raid, trials, our movies)
│ │ ├── scriptGenerator.ts # runGenerationAttempts, runGenerationAlgorithm (locked/excluded/avoid tags, WASM swap)
│ │ ├── tagCategoryColors.ts # Category → color for UI
│ │ └── resetAll.ts # Reset calculator state (for dev/debug)
│ └── components/
│ ├── Navbar.vue # Save upload, language, theme, modals (Save data, Debug), multi-tab warning
│ ├── TabNavigation.vue # Tabs: Board, Release Plan | Script Generator, SE Compatibility, Best Advertisers
│ ├── tabs/
│ │ ├── BoardTab.vue # Pinned scripts list, filters, link to movies, archive, open Plan/Generator/Synergy/Advertisers
│ │ ├── PlanTab.vue # 9 slots, uniqueness settings, fill from Board or generate, history
│ │ ├── GeneratorTab.vue # Locked/excluded tags, batch size, targets, generate → backlog, pin
│ │ ├── SynergyTab.vue # Tag selector → compatibility result, Art/Com scores
│ │ └── AdvertisersTab.vue # Tag selector → best advertisers by phase
│ ├── TagSelector.vue # Category panels, tag list, percent sliders (Genre), codex highlight
│ ├── GeneratorPanel.vue # Reusable panel for generator (Board + Plan)
│ ├── SaveFileUpload.vue # File input + parse + load into store
│ ├── SaveDataModal.vue # Save info (tags, codex, game date, secrets summary)
│ ├── OurMoviesModal.vue # Movies from save, link to pinned script
│ ├── AdvertiserAnalysisModal.vue
│ ├── SaveSecretsModal.vue
│ ├── DebugModal.vue
│ ├── QuickSearch.vue
│ ├── LanguageSelector.vue
│ ├── AppHeader.vue
│ ├── ScriptCard.vue
│ └── ui/
│ ├── Card.vue
│ ├── CardHeader.vue
│ ├── Modal.vue
│ └── Button.vue
├── tests/
│ ├── calculator.test.ts # Matrix score, bonuses
│ └── wasm.test.ts # WASM init + score (when built)
└── build/ # AssemblyScript output (release.js, release.wasm, release.d.ts) — WASM copied to public/wasm by script
- Vue 3 (Composition API,
<script setup>) - Pinia + pinia-plugin-persistedstate (persist calculator state, theme)
- Vite (build, dev server, base path for GitHub Pages)
- TypeScript
- Tailwind CSS (theme via CSS variables)
- Vue Router (hash routes for tabs only)
- AssemblyScript → WebAssembly for heavy matrix/synergy and generator candidate swap (with JS fallback if WASM fails)
- Vitest for unit tests
- Game data in
public/data/: tags (TagData, TagsAudienceWeights), compatibility matrix (TagCompatibilityData), genre pairs (GenrePairs). Loaded once ingameData.loadData(). - Localization in
public/localization/*.json: key → translated string. Loaded bygameData.loadLocalization(lang); tag names fall back tobeautifyTagNamefrom ID.
Requirements: Node.js ≥ 24 (see .nvmrc).
# Install
npm install
# Build WASM (required before full build)
npm run wasm:build
# Dev server
npm run dev
# Type-check + production build
npm run build
# Preview production build
npm run preview
# Tests
npm run test
# Watch: npm run test:watch- Build runs
wasm:buildthenvue-tsc -bandvite build. For GitHub Pages,vite.config.tsusesbase: '/hollywood-animal-planner/'whenGITHUB_ACTIONSis set. - WASM is loaded from
public/wasm/release.wasmat runtime; if it fails, matrix score falls back to JS incalculator.ts.
- Hollywood Animal is a game by its authors; this project is an unofficial fan tool.
- Rewritten and extended from CallOn84/Hollywood-Animal-Calculator.