282 Commits
Author SHA1 Message Date
11430be186 Filter destroyed battalion IDs from aftermath claimants and update doc (#6437)
Captured units' battalions are destroyed during BattleEnded processing,
but the multi-victor branch was storing those destroyed IDs in
AftermathClaimantUnit. This caused invalid battalion references when
claimants withdrew. Filter them out when building claimants and
notFledDefenders, and exclude them from armySize calculation.

Also update ALLIED_VICTORY_BATTLE_RESOLUTION.md to reflect PR 6429
changes (LastAllianceStanding for attackers, allied co-attacker added
to winners for solo castle holder) and document the dead-ally
GameOverResponsePopulator bug fixed in PR 6435.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:15:35 -07:00
528335c8d9 Remove AllyVictory from Eagle battle resolution (#6431)
Shardok now emits Victory for all winners instead of distinguishing
AllyVictory. Remove the AllyVictory case from EndGameCondition, simplify
all isWinOrAllyVictory checks to isVictory, reserve the ally_victory
proto field, and update the allied victory documentation.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 12:26:26 -07:00
0f96a7bfdf Add distinct success/failure animations for Repair (#6410)
* Add distinct success/failure animations for Repair

Repair previously used the same hammer-strike animation for both attempt
and result. Now it follows the StartFire/Fear two-stage pattern: attempt
shows hammer strikes, success shows a golden shimmer beam rising, and
failure shows debris collapsing with a dust puff.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Increase two-stage animation delay to let attempt animations finish

The delay cap between attempt and result phases was 0.5s (or 0.3s with
no sound), but the hammer animation runs ~0.6s and fire runs ~0.8s.
Raised the cap to 0.8s and the no-sound fallback to 0.6s so result
animations don't overlap with attempt animations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add distinct repair success sound and make debris explosive

Sound: Wire up a "repair_success" clip for the result sound so it
doesn't repeat the hammer attempt sound. Falls back to the hammer
clip until the audio asset is added to sfx-combat.

Debris: Replace gentle falling animation with a violent explosion —
pieces burst outward from center with physics-driven trajectories
(initial velocity + gravity), fast spin, an initial flash burst,
and a drifting dust cloud.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Use "Positive Effect 6" as repair success sound

Add the clip to the sfx-combat addressable group and load it as the
repair success result sound so it plays a distinct chime instead of
repeating the hammer attempt sound.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 15:33:10 -08:00
5a4f65b416 Add distinct success/failure animations for StartFire (#6408)
* Add distinct success/failure animations for StartFire

Split StartFire into three-stage visuals following the Fear pattern:
attempt shows ignition, success shows fire blazing up (taller/brighter
flames, hotter colors, outward burst), failure shows fire dying out
(shrinking flames, cooler colors, smoke puff).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Move StartFire doc to repo-root docs/TWO_STAGE_ANIMATIONS.md

Update the existing doc instead of creating a duplicate in the Unity
client directory.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 14:26:13 -08:00
4717423f8b Add Flee as two-stage animation with captured-while-fleeing variant (#6337)
* Add Flee as two-stage animation with captured-while-fleeing variant

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Move TWO_STAGE_ANIMATIONS.md to docs/

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Move TWO_STAGE_ANIMATIONS.md to repo root docs/

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Wire up flee attempt and run away sound effects in Unity scene

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add Flee Captured test button to AnimationTestController

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Split Flee into three distinct animations: attempt, success, captured

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix test buttons to play full two-stage sequence for result animations

Result variant test buttons (Fear Success/Resisted, Flee Success/Captured,
Duel/Declined) now play the complete attempt→result sequence instead of
only the attempt sound.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Make flee attempt animation more visible and cap two-stage delay at 0.5s

Flee attempt now uses full dust burst and multiple blur trail afterimages
instead of minimal dust and single blur. Two-stage delay between attempt
and result capped at 0.5s in both PlayTwoStageSequence and
PlayTwoStageSoundSequence (affects other players' actions and test buttons).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Tune flee animation parameters in Unity scene

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:16:34 -08:00
8cb75d48e2 Add giant beast type using 3x-scaled peasant (#6308)
* Add giant beast type using 3x-scaled peasant model

Reuse Polytope peasant prefabs at 3x scale (animalScale 45) with a single
wandering giant per province. Uses HumanMapAnims controller for idle/walk/
attack animations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix giant test method to use correct province name (Elekes)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Wire up GiantEffect prefab in Gameplay scene

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 13:05:59 -08:00
38c3fbd6bd Add psychopath to beast effects coverage doc (#6310)
It uses the Butcher 2D sprite via ButcherBeastNames HashSet,
but was missing from the documentation table.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 09:49:46 -08:00
85a3f4bc39 Upgrade dragon beast to 3D model with full animation suite (#6306)
Replace the 2D PSD-based DragonRed sprite with a 3D FBX model from 3dFoin
Dragon. The dragon now alternates between flying (circling at altitude with
fly/flyAttack/flyBreathFire/flyFast/flyHit actions) and grounded (wandering
with walk/run/attack/breathFire/whipTail/hit/stand/idle actions) modes.

- Add DragonMapAnims.controller with 15 animation states
- Configure dragon_skin.FBX for Generic animation with avatar
- Rewrite DragonEffect.cs with 4-mode state machine
- Delete old 2D DungeonMonsters2D dragon assets
- Add Dragon/ to LFS rules and clang-format excludes

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 09:25:37 -08:00
ce49304406 Add Polytope 3D character archetypes for human beast animations (#6304)
* Add 5 Polytope character archetypes for human beast animations

Replace the single Butcher sprite for all 34 human-type beasts with
5 thematic 3D archetypes using Polytope Studio Lowpoly Medieval
Characters: Knight (6 beasts), Soldier (8), Archer (3), Militia (8),
and Peasant (9). All share a HumanMapAnims controller that retargets
Clown animation clips via Unity's Humanoid system.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Rename humanEffectPrefab to butcherEffectPrefab; route psychopath to it

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Move butcherEffectPrefab under Human Effect Prefabs header

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Wire up Polytope prefabs in scene; rename HumanEffect to ButcherEffect

Wire all 6 human effect prefabs (butcher, knight, soldier, archer,
militia, peasant) in Gameplay.unity scene. Rename HumanEffect.prefab
to ButcherEffect.prefab to match the field rename.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Exclude third-party asset packs from clang-format hook

Skip DungeonMonsters2D, Polytope Studio, RRFreelance-Characters,
and Raccoon directories — these are vendor code that should not
be reformatted.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 07:36:59 -08:00
e289913e18 Add raccoon beast animation (Sketchfab 3D model) (#6298)
* Add raccoon beast animation using Sketchfab 3D model

Adds Raccoon.fbx (WildMesh 3D, CC BY 4.0) with textures, wires up
raccoonEffectPrefab in ProvinceBeastsController, and updates both
attributions.json files and BEAST_EFFECTS.md.

Editor steps still needed: create RaccoonMapAnims controller, create
RaccoonEffect prefab (duplicate HoneyBadgerEffect), wire in Gameplay.unity.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Wire up raccoon animation with Blender-converted FBX

Convert GLB to FBX via Blender (original FBX had no animation data).
Add RaccoonMapAnims controller, RaccoonEffect prefab, materials with
textures, scene wiring, and fix province name (Hella, ID 19).

Known issue: gray sphere artifact under each raccoon.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Remove Icosphere/hair artifacts from raccoon FBX and update scene

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Smooth 3D animal turning with Quaternion.Slerp

Animals now rotate smoothly toward their target instead of snapping.
UpdateFacing is called every frame during walking, and uses Slerp
with a configurable turnSpeed (default 5) for gradual rotation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 20:58:19 -08:00
25d1d2b268 Note controller override in honey badger doc entry (#6296)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 14:14:11 -08:00
cd7e21cfa4 Add honey badger beast animation (3D model) (#6293)
* Add honey badger 3D model and wire up AnimalEffect

Import HoneyBadger FBX (63 animations) and texture from Sketchfab.
Add honeyBadgerEffectPrefab field and switch case in
ProvinceBeastsController. Still needs Unity Editor setup: Animator
Controller, effect prefab, and scene wiring.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix honey badger test province name (ID 1 is Shumal, not Onmaa)

Onmaa is province ID 14, already used by TestWildPig.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Wire up HoneyBadgerEffect prefab and animator controller

- HoneyBadgerMapAnims controller with idle/walk/eat/attack states
  mapped to HoneyBadger FBX clips
- HoneyBadgerEffect prefab with AnimalEffect referencing the model
- Wired into Gameplay.unity ProvinceBeastsController
- Includes Unity-generated .meta files for imported assets

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix HoneyBadger FBX avatar setup to enable animations

avatarSetup: 0 (No Avatar) prevented the Animator from driving the
skeleton. Changed to avatarSetup: 1 (Create From This Model) to match
how the Animal Pack Deluxe models are configured.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 14:01:27 -08:00
5bb6b4ca9d Add attribution for new beast animation asset packs (#6294)
* Add attribution for recently added Unity asset packs

Add Animal pack deluxe (janpec), 2D Monster Pack Basic Bundle/PSB
(SP1/DungeonMonsters2D), and Honey Badger 3D model (WildMesh 3D) to
ASSET_AUDIT.md. Update 3D model count in summary table.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add 3D model attributions to in-app/website credits

Add Animal pack deluxe, 2D Monster Pack, and Honey Badger
to both server and Unity client attributions.json files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 13:33:55 -08:00
49c14be159 Add clown beast animation with both Clown Pack models (#6292)
* Add clown beast animation using both Clown Pack models

- Add per-prefab animator controller overrides to AnimalEffect
  (animatorControllers[] array, indexed to match animalPrefabs[])
- Create ClownMapAnims and FatClownMapAnims controllers mapping
  idle/walk/eat/attack states to each model's animation clips
- Create ClownEffect prefab using both Clown and Fat Clown models
- Add clown case to ProvinceBeastsController, remove from HumanBeastNames
- Wire up in Gameplay.unity scene
- Update BEAST_EFFECTS.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix ClownEffect prefab (recreated via Unity editor)

The hand-written prefab YAML was rejected by Unity's PrefabImporter.
Recreated by duplicating the working OgreEffect prefab in the editor
and configuring the AnimalEffect fields there.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 10:08:18 -08:00
e63735f428 Update beast effects doc for ogre/troll coverage (#6291)
* Update BEAST_EFFECTS.md: ogre/troll now have custom animation

Reflects the addition of the Orc-Ogre pack AnimalEffect for ogre and
troll beast types (PR #6287). Removes them from the "no custom
animation" list and adds them to the custom animations table.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add complete beast coverage details to BEAST_EFFECTS.md

- Add missing animal effect entries (crab, frog, rabbit, salamander,
  scorpion, stag, wild goat, wild pig) to custom animations table
- Add human-type beast breakdown by likelihood with thematic clusters
  for potential visual differentiation beyond the generic Butcher prefab

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 08:48:57 -08:00
f44b7351b4 Add spawn likelihood to uncovered beast types in docs (#6284)
Order beasts without custom animations by how commonly they appear,
making it easier to prioritize which to add next.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 07:01:52 -08:00
03e82ae635 Update beast effects docs with full animation coverage (#6283)
Document all three effect types (MonsterEffect, AnimalEffect,
DragonEffect), list all beasts with custom animations vs vulture
fallbacks, and add 3D rendering tips.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 21:25:18 -08:00
d940393f3f Refactor beast effect selection for extensibility (#6269)
* Refactor beast prefab selection to switch and add extensibility doc

Replace IsDragon boolean check with GetEffectPrefab switch on beast
name string, providing a clear extension point for adding new
beast-type-specific effects. Add docs/BEAST_EFFECTS.md explaining
the architecture and step-by-step process for adding new beast types.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Use exact beast name matching from beasts.tsv

Switch from case-insensitive substring matching to exact string
matching on the canonical singularName from beasts.tsv. Update doc
with beasts.tsv reference and candidates for custom effects.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 15:42:08 -08:00
47ab61d0ab Add post-battle tutorial dialogues (#6227)
* Plan post-battle tutorial dialogue in docs

Document two narrative dialogues for after the first tutorial battle:
1. Battle Aftermath - Marek on the close call, Tarn's disappearance,
   and recruiting captured lieutenants
2. Rebuild Support - Marek explains Improve and Give Alms to raise
   province support before January taxes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Implement post-battle tutorial dialogues and triggers

Add two narrative dialogues after the tutorial battle:
- Battle aftermath: Marek on Tarn's disappearance and captured lieutenants
- Rebuild support: Marek guides player to use Improve and Give Alms

Trigger detection uses lifecycle flags to ensure correct ordering:
tutorial_battle_ended fires when battle is removed and commands arrive,
tutorial_rebuild_support fires after captured heroes phase completes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Fix rebuild dialogue: any hero can improve/alms, need 40 for taxes

Engineers and paladins are more effective, not the only ones who can
do it. Support threshold of 40 is required to collect taxes at all,
not just for higher revenue.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Highlight SupportField and refine tax instruction text

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add loyalty warning and support deadline tutorial triggers

- November loyalty warning: Marek warns about heroes with <70 loyalty,
  highlights the loyalty label, instructs to use Give Gold or Feast
- December support deadline: Marek urges the player to have Elena give
  alms immediately if support is still below 40
- Register first vassal's loyalty label as LoyaltyLabel highlight target

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Drop 'closer than I'd like to admit' from post-battle dialogue

Marek wouldn't admit it was close — he thought it was hopeless.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Use default panel position for strategic dialogues, top for combat

Hard-code panel position based on context: if a Shardok model is active,
use "top" (combat); otherwise use default position (strategic map).
Remove panelPosition overrides from strategic dialogue JSON.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 17:00:11 -08:00
613cf529bc Rename Fluria to East Faluria and Faluria to West Faluria (#6201)
* Add documentation for renaming a province

Documents the files that need to be modified when renaming a province
and explains how province names flow from the server to the client.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Rename Fluria to East Faluria and Faluria to West Faluria

Updated all province name references:
- province_map.tsv: Both province rows and all neighbor references
- MapDescription.scala: LLM prompt geography description
- centroids.json: Client map rendering metadata
- RuntimeValidatorTest.scala: Test strings
- Renamed hex map files: Fluria.e0mj -> East_Faluria.e0mj,
  Faluria.e0mj -> West_Faluria.e0mj

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-22 11:23:54 -08:00
3a897b6241 Add Windows code signing to small eagle TODO nice-to-haves (#6109)
Azure Artifact Signing at ~$10/mo eliminates the SmartScreen
"unknown publisher" warning on Windows builds.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 13:25:19 -08:00
94b5d95dd3 Stage 1: Stop displaying battalion backstories in client (#6001)
Disable the battalion backstory popup that appears on hover in the
Heroes & Battalions panel. This is the first stage of eliminating
battalion backstory LLM updates to reduce request volume.

The popup panel is now always hidden when hovering over battalions.
Hero backstories are unaffected.

See docs/eliminate-battalion-backstory-updates.md for the full plan.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-12 21:40:20 -08:00
521e87cb91 Add 3D particle effect controllers for province events (#5992)
* Add 3D particle effect controllers for province events

Add controllers for blizzard, drought, flood, and beasts events:
- ProvinceBlizzardController: falling snow particles
- ProvinceDroughtController: rising dust/heat particles
- ProvinceFloodController: rain/water splash particles
- ProvinceBeastsController: circling vultures/crows particles

These follow the same pattern as Festival and Epidemic controllers.
Prefabs need to be created in Unity and wired up in the scene.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Update 3D effects doc with implementation status and prefab requirements

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add particle effect components for province events

Add MonoBehaviour scripts that programmatically create particle systems
for each province event type:

- BlizzardEffect.cs: Falling snowflakes with wind drift
- DroughtEffect.cs: Rising dust and heat shimmer particles
- FloodEffect.cs: Falling rain streaks with ground splashes
- BeastsEffect.cs: Circling birds (vultures/crows) with orbital motion

Each effect is configurable via Inspector fields (emit rate, colors,
sizes, speeds, etc.) similar to the existing EpidemicEffect.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Wire up province event effect controllers in Unity scene

- Add effect components to prefabs (Blizzard, Drought, Flood, Beasts)
- Add controllers to Map GameObject in Gameplay.unity
- Wire up mapContainer, centroidsJson, and prefab references
- Wire controller references in MapController

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add test controller for province event effects

- Add ProvinceEffectTestController with test methods for each effect type
- Add TestSpawnEffect() and ClearAllEffects() methods to all controllers
- Supports testing effects without game model data

Usage: Add ProvinceEffectTestController to scene, set province IDs,
then use context menu "Test All Effects" or enable "Spawn On Start".

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Revert "Add test controller for province event effects"

This reverts commit d13ae05b5661c7b29adb424d8249cec39110efdc.

* Add vulture icon for beasts province effect

- Add griffon-vulture.png icon (Flaticon, requires attribution)
- Fix velocity curve mode error in BeastsEffect.cs
- Wire up vulture texture to BeastsEffect prefab

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Rework province event effects with sun/shimmer drought and masking infrastructure

- DroughtEffect: Replace particle-based effect with pulsing sun icon and
  heat shimmer overlay using custom GrabPass shader
- BlizzardEffect/FloodEffect: Add shader fallback chain for province masking
- Controllers: Add rawGray texture loading and province masking data passing
- Add HeatShimmerShader.shader for drought distortion effect
- Add ProvinceParticleShader.shader for province boundary clipping
- Scale particle emission areas based on province perpendicular_width

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix province masking with screen-space coordinate calculation

- Update shaders to use screen position instead of world position for
  accurate UV calculation in Canvas UI context
- Controllers now properly convert world corners to screen coordinates
- Handle both Screen Space Overlay and other canvas render modes
- Fix map bounds calculation for province ID texture sampling

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Enlarge weather effects to fill provinces with shader masking

- DroughtEffect: Fix shimmer by using RawImage with white texture,
  increase shimmer size to 2x province width for full coverage
- BlizzardEffect: Increase emission area, particle count (300),
  emit rate (40/s), and lifetime (4s) for dense snowfall
- FloodEffect: Increase rain emission area, particle count (400),
  emit rate (80/s), and splash coverage
- Controllers now use full province width for emission sizing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Double height of blizzard and rain emission areas

- Blizzard: Y scale 20→40, spawn height 60→120
- Rain: Y scale 20→40, spawn height 70→140

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix particle coverage and disable broken drought shimmer

- Blizzard/Flood: Change emission box to 150x150 with lower spawn point
  so particles spawn at varying heights across the province
- Drought: Disable shimmer effect - GrabPass doesn't work with UI Canvas
  (sun icon still shows)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add gentle waving animation to drought sun

- Sun now waves slowly in X and Y using different sine frequencies
  for an organic floating feel
- Reduce default sun size from 60 to 40
- Wave amounts: X=8, Y=5 at speeds 0.4 and 0.6

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Remove test effects from province event controllers

Remove hardcoded test province spawning and keep-alive logic from all
six province event controllers (blizzard, flood, drought, festival,
epidemic, beasts). Effects will now only appear for provinces that
actually have the corresponding events.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 22:23:27 -08:00
9a6521b4d4 Add tooltip providers to province event icons and 3D effects doc (#5991)
- Add HoveringTooltipTextProvider to all 6 province event images
  (Festival, Blizzard, Epidemic, Flood, Drought, Beasts)
- Add docs/province-event-3d-effects.md with ideas for replacing
  2D shader effects with 3D particle systems

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-11 14:31:45 -08:00
64c86ebd2b Add Rust map generator, equalized province maps, and dynamic province labels (#5957)
* Add design doc for programmatic map image generation

Documents the plan to:
- Create a Python tool for regenerating map images with more equalized province sizes
- Implement dynamic province name rendering that scales with zoom
- Preserve topology and neighbor relationships while enlarging small provinces

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add Python map generator tool for province size equalization

Implements Part 1 of the programmatic map generation plan:
- Python script using weighted dilation to grow small provinces
- Preserves jagged/natural edges using noise fields
- Allows small provinces to claim limited ocean pixels (20% max)
- Maintains neighbor relationships and realistic coastlines

Results:
- Province size ratio reduced from 110x to 22x
- Smallest province (Kojaria) grew 5x (3,262 → 16,590 pixels)
- All 43 province masks and centroids.json generated

Usage:
  cd tools/map_generator
  python -m venv venv && source venv/bin/activate
  pip install -r requirements.txt
  python generate_map.py --generate

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add ProvinceLabelsController for dynamic map labels

Part 2 of programmatic map generation - dynamic province name rendering:
- Creates TextMeshPro labels at province centroids
- Labels scale inversely with zoom level for readability
- Only visible when zoom >= 1.5x (configurable)
- Font size scales with province area for visual hierarchy
- Includes centroids.json with province positions

To use:
1. Add ProvinceLabelsController component to a GameObject in the scene
2. Assign zoomHandler, mapContent (RectTransform), and centroidsJson TextAsset
3. Optionally configure font, colors, and zoom threshold

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add topology documentation and tendril removal to map generator

- Document new province adjacencies caused by equalization
- Add priority_provinces parameter for boosting specific province growth
- Add remove_tendrils() post-processing to eliminate thin extensions
- Note: Will be restructured to use Bazel in next commit

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add Bazel Python support and parallelized map generator

- Add rules_python to MODULE.bazel with Python 3.13
- Move map generator to src/main/python/net/eagle0/eagle/
- Add parallel processing using ProcessPoolExecutor
- Provinces are now grown in parallel across multiple CPU cores

Usage:
  bazel run //src/main/python/net/eagle0/eagle:map_generator -- --generate
  bazel run //src/main/python/net/eagle0/eagle:map_generator -- --workers 8

The old tools/map_generator/ script remains for reference but the Bazel
version is now the primary implementation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add Rust map generator and equalized province maps

- Add Rust map generator (src/main/rust/net/eagle0/eagle/map_generator/)
  - Uses parallel graph coloring for non-adjacent province processing
  - Generates equalized province sizes (smallest ~7x larger than before)
  - Outputs: rawGray.gz.bytes, map_bw.png, province masks, centroids.json
  - Run with: bazel run //src/main/rust/net/eagle0/eagle/map_generator -- --generate

- Update province_map.tsv with neighbor changes from equalization:
  - Usvol gains: Laufarvia, Hella, Grytrand
  - Chapellia loses Nikemi, gains Kojaria
  - Kojaria gains Motcia, Chapellia
  - Motcia gains Kojaria

- Update Unity assets with equalized map:
  - New rawGray.gz.bytes with equalized province boundaries
  - New map_bw.png with textured water, transparent land, dark borders
  - Updated province mask images (1-43.png)
  - Updated centroids.json with orientation data for label rotation

- Update ProvinceLabelsController.cs to support label rotation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix coordinate system for rawGray and province labels

- Fix save_raw_gray to not flip Y coordinates (was causing click detection
  to be inverted)
- Fix ProvinceLabelsController to not flip Y coordinates (was causing
  labels to appear in wrong positions)
- Update rawGray.gz.bytes with correct orientation
- Update Gameplay.unity with ProvinceLabelsController setup

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Improve province label rendering

- Reduce max font size scale from 2.0 to 1.3
- Disable word wrapping, allow text overflow
- Fix orientation sign (remove negation)
- Allow near-vertical labels by expanding angle range to [-90, 90]
- Recalculate province orientations with new range

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Scale province label font size based on province dimensions

- Add principal_length and perpendicular_width to centroids.json
- Update ProvinceLabelsController to scale font based on principal_length
- Update Rust map generator to calculate province dimensions via PCA
  eigenvalues (4 * sqrt(eigenvalue) for ±2 std dev coverage)
- Disable text wrapping on labels to prevent unwanted line breaks

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Reduce province label base font size to 11

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Update neighbor positions and hex map starting positions for new borders

TSV changes (neighborPositions for new neighbors):
- Laufarvia: Usvol attacks from dir 4 (E)
- Hella: Usvol attacks from dir 2 (NE)
- Chapellia: Kojaria attacks from dir 4 (E)
- Usvol: Laufarvia=3(W), Hella=5(SW), Grytrand=4(E)
- Kojaria: Chapellia=1(N), Motcia=3(W)
- Grytrand: Usvol attacks from dir 3 (W)

Hex map changes (new attackerStartingPositions):
- Motcia.e0mj: Added direction 0 (NW) for Kojaria
- Chapellia.e0mj: Added direction 4 (SE) for Kojaria
- Kojaria.e0mj: Added directions 1 (N) and 3 (E) for Chapellia/Motcia

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Revert outline width change (made text smaller)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add TMP underlay effect for better label visibility on dark backgrounds

The underlay expands outward (unlike outline which shrinks text inward),
providing a white glow around labels without reducing text size.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-10 14:30:58 -08:00
d041c68b99 Add tutorial battle system C++ implementation and docs (#5948)
* Add tutorial battle system C++ implementation and docs

Brings in the C++ tutorial battle controller and documentation from the
tutorial-scenario-system branch:
- TutorialBattleController for managing scripted battle scenarios
- Documentation describing the tutorial battle system design

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add proto definitions and ShardokEngine integration for tutorial battles

Proto changes:
- Add TUTORIAL_ENEMY_FLED and TUTORIAL_REINFORCEMENTS_ARRIVED action types
- Add TutorialBattleConfig message to player_info.proto
- Add tutorial_battle_config field to NewGameRequest

C++ changes:
- Remove unused defenderCanFlee field from TutorialBattleController
- Integrate TutorialBattleController into ShardokEngine
- Add SetTutorialBattleConfig method to configure tutorial mode
- Check for scripted flee at end of each round in HandlePlayerTurnEnd

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix visibility for player_info_proto

Allow game_setup_info_proto in //src/main/protobuf/net/eagle0/common
to depend on player_info_proto from shardok/common.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Fix fire_test by moving early return inside tutorial flee block

The if (GameIsOver()) { return; } check was placed before NewRoundAction,
which caused STRUCTURES_BURNED to be skipped even for normal games. The
early return should only happen when the tutorial flee actually triggers
and ends the game.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Revert "Fix fire_test by moving early return inside tutorial flee block"

This reverts commit b0b08020873cefeaf411c07d6223ade5baad3c4e.

* Reapply "Fix fire_test by moving early return inside tutorial flee block"

This reverts commit 8038d73b57b1cf4e29c4e79e91dcb9e11b49e44d.

* Redesign tutorial system to be event-driven with configurable triggers

Replace hardcoded flee triggers with a flexible event system that supports:
- Trigger types: RoundTrigger, UnitsLostTrigger, DamageTakenTrigger, UnitKilledTrigger
- Action types: FleeAction, ReinforcementsAction
- Events fire in config order and at most once (tracked by event_id)

Key changes:
- Proto: Replace TutorialBattleConfig fields with repeated TutorialEvent
- Controller: Replace ShouldTriggerScriptedFlee/ExecuteScriptedFlee with CheckAndExecuteEvents
- Engine: Update HandlePlayerTurnEnd to use new CheckAndExecuteEvents API

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Update tutorial battle doc: vassals, 600 cavalry, new event API

- Change defender heroes from "sworn brothers" to "vassals"
- Update attacker heavy cavalry from 400 to 600 troops
- Update proto reference to show new event-driven TutorialBattleConfig
- Update C++ API docs to show CheckAndExecuteEvents method
- Remove completed ShardokEngine integration from "Remaining" section

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Move tutorial config to separate proto file

Extract TutorialBattleConfig and related messages from player_info.proto
into tutorial_battle_config.proto to avoid the code smell of having
game_setup_info.proto depend on two different player_info.proto files.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Move tutorial_battle_config.proto to common/ package

Since the proto is used by both Eagle (game_setup_info.proto) and
Shardok (TutorialBattleController), it belongs in common/, not
shardok/common/.

Updated package from net.eagle0.shardok.common to net.eagle0.common
and updated all C++ references accordingly.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Change ReinforcementsAction to use CommonUnit instead of hero names

This allows the reinforcement units to be fully specified with all
their attributes (hero stats, battalion type/size, etc.) rather than
just referencing heroes by name.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add tutorial_battle_config.proto to Unity C# project

The new proto was missing from protos.csproj, causing Unity builds to fail.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add go_package option and include proto in Go build

- Add go_package option to tutorial_battle_config.proto for Go code gen
- Add tutorial_battle_config_proto to common_go_proto target

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-09 19:08:32 -08:00
e02afd112e Add documentation for AI quest completion behavior (#5928)
Documents which quests the AI proactively attempts to complete via
FulfillQuestsCommandSelector and which quests are not handled.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 22:49:23 -08:00
7aee0ee789 Add documentation for rules_apple workspace separation (#5905)
Documents why SparklePlugin is built in a separate workspace due to
rules_swift version conflicts, and provides a checklist for when/how
to reintegrate it into the main workspace.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 11:09:36 -08:00
df916f9c29 Enable battalion diversity quest generation (PR 3/3) (#5838)
* Enable battalion diversity quest generation (PR 3/3)

Adds quest creation logic for BattalionDiversityQuest to QuestCreationUtils.

Quest availability:
- Only if province currently has 1-2 battalion types
- This encourages players to diversify their army composition

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Clarify PR dependency structure in quest docs

PR 2 (client) and PR 3 (generation) both depend on PR 1 (types),
but are independent of each other. They can be developed in parallel
and merged in either order after PR 1.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 09:11:03 -08:00
f2e08cdb5d Replace duel_challenged sound with licensed asset (#5825)
* Replace duel_challenged sound with licensed asset

Replace duel_challenged.mp3 (unknown license) with Weapon Draw Metal 1.wav
from the purchased Medieval Combat Sounds Unity Asset Store pack.

The dramatic sword unsheathing sound fits well for a duel challenge.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Wire up Weapon Draw Metal 5 as duel_challenged sound

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 07:50:49 -08:00
801ce59e29 Add client handling for province order quests (PR 2/3) (#5830)
- Add ADDING_NEW_QUESTS.md documentation explaining the three-PR
  strategy and listing all files that need modification for new quests
- Add DevelopProvincesQuest and MobilizeProvincesQuest cases to
  DisplayNames.QuestTypeString()
- Add quest description strings to UnaffiliatedHeroRowController
  showing progress (e.g., "3/5 months")

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 06:59:28 -08:00
2562e99e3c Update TODO: mark shardok cancellation and what's new as done (#5807)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 18:11:23 -08:00
207f5e07ca Update alpha TODO: mark completed items, add end game ideas (#5801)
Completed:
- Bug report form in Unity client
- Feedback channel (Discord server)
- Support plan (Discord + bug reporting + email)
- Art/music licenses and open source disclosures (attributions panel)

Added end game ideas:
- Win condition: all other factions defeated
- Mid-game progression: King recognition events

Moved "What's new" changelog to nice-to-have.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 10:01:29 -08:00
a098bf2f56 Add bug report form to Unity client (#5784)
* Add bug report form to Unity client

Adds a Report Bug button to the Settings panel that opens a bug report
form. Reports include:
- User description
- Game state (game ID, faction, date, active battles)
- System info (OS, CPU, GPU, resolution)
- Recent connection logs

Reports are sent via webhook (supports Discord and Slack).
Configure webhook URL with BugReportPanelController.SetWebhookUrl().

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Configure Discord webhook URL for bug reports

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add escape key handling for bug report and attributions panels

- Bug report panel closes on Escape
- Attributions panel closes on Escape
- Settings panel only toggles if other panels aren't open
- Wire up bug report panel UI in Gameplay scene

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 09:10:44 -08:00
5e7d833738 Add alpha test notice to invitation landing page and email (#5780)
For the closed alpha, we're using a simple notice instead of a full
privacy policy. The notice explains:
- This is a private alpha test
- We collect OAuth email and gameplay data
- Users can delete their account via accounts.eagle0.net
- Contact email for questions

Added to:
- Invitation landing page (/invite/{code})
- Invitation email (HTML and plaintext)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 20:47:53 -08:00
a3d64a17a2 Update SMALL_EAGLE_TODO with completed items (#5731)
* Update SMALL_EAGLE_TODO with completed items

Mark as done:
- Fix the Mac installer
- Generatedtext healing
- Audit assets for anything we don't have rights to and replace it
- Replace heroes that are based on real 20th or 21st century people or IP
- Running low on food tutorial

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Mark warlord profession tutorial as complete

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:18:26 -08:00
49ac693501 Remove obsolete documentation (#5730)
Delete outdated docs for completed work:
- OAuth implementation plans (OAuth is implemented)
- Scala 3 migration docs (migration is complete)
- Admin server enhancements (implemented)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:15:02 -08:00
adminandGitHub 7bef82a419 Add new profession proposals document (#4900) 2026-01-28 17:19:05 -08:00
17441c4cdb Add design doc for notification diff batching optimization (#5674)
Documents analysis of why client notification generators currently
require per-action-result game state diffs, and proposes a solution
to enable diff batching by moving display data to server-side.

Deferred for now as current performance is acceptable.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-28 12:20:47 -08:00
6b90112568 Replace failure_horn.mp3 with licensed Negative Effect 04.wav (#5649)
Replace the last unlicensed sound effect with Negative Effect 04.wav
from the purchased Magic Spells Sound Effects LITE pack.

This completes the asset audit - all required items are now resolved.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 20:09:11 -08:00
291026e044 Add ambient volume setting and improved thunder sounds (#5646)
* Add ambient volume setting for weather sounds

- Add ambientSlider to SettingsPanelController with static AmbientVolume property
- Weather effects (rain, thunderstorm, blizzard) respect ambient volume
- Volume updates in real-time when slider is adjusted during playback

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add distant thunder sound effect

Source: Freesound #351526 by LittleRainySeasons (CC BY 4.0)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add more thunder sound effects

- thunder_loud.mp3 - mokasza (CC BY 4.0, Freesound #810746)
- thunder_crack.wav - OneSoundToRuleThemAll (CC BY 4.0, Freesound #238796)
- thunder_clap.wav - FreqMan (CC BY 4.0, Freesound #32544)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Wire up thunder sounds and ambient volume slider in Unity

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 19:34:45 -08:00
481f42d01c Add sound effect hooks to weather effects (#5641)
* Add sound effect hooks to WeatherEffectAnimator

Audio clips for weather sounds (assign in Inspector):
- rainLoopSound: gentle pitter-patter for normal rain
- thunderstormLoopSound: more intense rain for thunderstorm
- thunderSound: one-shot thunder clap (plays on lightning flash)
- blizzardLoopSound: intense wind sound

Volume controls:
- loopVolume: volume for looping sounds (default 0.5)
- thunderVolume: volume for thunder (default 0.8)

Sound behavior:
- Rain: plays rainLoopSound continuously
- Thunderstorm: plays thunderstormLoopSound + thunderSound on each flash
- Snow: no sound
- Blizzard: plays blizzardLoopSound continuously
- Sun/Clouds: no sound

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Support multiple thunder sounds with random selection

- Change thunderSound field to thunderSounds array
- Each lightning flash picks a random sound from the array
- Allows assigning Lightning Spelll 01-08 for variety

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Add rain loop sound effect from Freesound

- rain_loop.ogg by aesqe (CC BY 4.0)
- Source: https://freesound.org/people/aesqe/sounds/37618/
- Rain falling on clay roof tiles, loopable
- Added attribution to docs/ASSET_AUDIT.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Document CC BY 4.0 sound effects for weather and runaway

Added to ASSET_AUDIT.md:
- rain_loop.ogg by aesqe (Freesound #37618) - for rain effect
- blizzard_wind_loop.wav by nsstudios (Freesound #651540) - for blizzard
- runaway.mp3 by Yap_Audio_Production (Freesound #218997) - replaces unlicensed file

Note: Files must be downloaded manually from Freesound (requires login).
Only 1 unlicensed sound effect remaining: failure_horn.mp3

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Remove stray download file

* Add rain and blizzard wind sound effects

- rain_loop.ogg by aesqe (CC BY 4.0, Freesound #37618)
- blizzard_wind_loop.wav by nsstudios (CC BY 4.0, Freesound #651540)

Location: Assets/Shardok/Sounds/

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Replace runaway.mp3 with licensed version

MedievalArmyRunningLoop by Yap_Audio_Production (CC BY 4.0)
Source: https://freesound.org/people/Yap_Audio_Production/sounds/218997/

This resolves the licensing issue for runaway.mp3.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Wire up weather sound effects in scene

- Assign rain_loop.ogg to rainLoopSound
- Assign blizzard_wind_loop.wav to blizzardLoopSound
- Configure thunder sounds array

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 17:31:22 -08:00
3eda670759 Replace free_icons with licensed Asset Store equivalents (#5639)
Replace all icons in Assets/free_icons/ (unknown license) with
equivalents from purchased Asset Store packs and delete the folder:

- blizzard.png → 16_blizzard_nobg.png (4000_Fantasy_Icons)
- rain.png → 12_Magic_rain_nobg.png (4000_Fantasy_Icons)
- thunderstorm.png → 27_Storm_nobg.png (4000_Fantasy_Icons)
- wind.png → 23_Light_blow_nobg.png (4000_Fantasy_Icons)
- thermometer.png → startFire.png (existing licensed asset)

These icons were only used in Map Editor (dev tool).

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 12:50:02 -08:00
ea79b80d7b Replace snow.png with 16_blizzard_nobg.png from Asset Store (#5636)
Replace the free_icons/snow.png (unknown license) with
16_blizzard_nobg.png from 4000_Fantasy_Icons (purchased Asset Store
pack) in all locations:
- Gameplay.unity (Province Info blizzard indicator)
- Dominion Wide.prefab
- Dominion Two Rows.prefab
- Map Editor.unity

Delete the now-unused snow.png file.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 12:22:31 -08:00
bb52212f9f Update asset audit to reflect current state (#5634)
* Update asset audit to reflect current state

- 2 sound effects remaining to replace (failure_horn.mp3, runaway.mp3)
- List the 8 weather icons in free_icons folder
- Reorganize action items into Must Replace / Low Priority / Resolved
- Update recommendation section

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Delete unused weather icons (cloud.png, sun.png)

These icons were not referenced anywhere in the codebase.
Update asset audit to reflect 6 remaining weather icons.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 11:34:04 -08:00
14308026ea Update ASSET_AUDIT.md: mark Terrain Hexes and Discord logo as verified (#5580)
* Update ASSET_AUDIT.md: mark Terrain Hexes and Discord logo as verified

- Terrain Hexes: confirmed Unity Asset Store purchase
- Discord logo: complies with Discord brand guidelines
- Updated action items and recommendations to reflect remaining work

Remaining items:
- 6 music tracks (1 unknown source, 5 Audius non-CC license)
- 56 Shardok sound effects (unknown origin)
- 138 StrategyGameIcons (unknown source)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Update ASSET_AUDIT.md: Medieval Victory Theme is CC0 Public Domain

Found source: RandomMind on Chosic, CC0 Public Domain license.
No attribution required, free for commercial use.

Remaining items:
- 5 Dima Koltsov/Audius tracks (non-CC license)
- 56 Shardok sound effects (unknown origin)
- 138 StrategyGameIcons (unknown source)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Update ASSET_AUDIT.md: Dima Koltsov tracks mostly verified as CC BY 4.0

- No Time for Greatness: CC BY 4.0 (YouTube)
- Warriors of Demacia: CC BY 4.0 (YouTube)
- Valor: CC BY 4.0 (YouTube)
- Forest Queen Tale: Presumed CC BY 4.0 (not found on YouTube)
- Clouds: Presumed CC BY 4.0 (not found on YouTube)

Remaining items:
- 56 Shardok sound effects (unknown origin)
- 138 StrategyGameIcons (unknown source)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Update ASSET_AUDIT.md: StrategyGameIcons verified as Asset Store purchase

Confirmed as "Strategy Game Icons" by REXARD from Unity Asset Store.

Remaining items:
- 56 Shardok sound effects (unknown origin)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Update ASSET_AUDIT.md: identify 3 sounds from Zombie Monster Undead Collection

Verified from Unity Asset Store purchase:
- raise_undead.mp3
- undead_break_control.mp3
- undead_grew.wav

Also corrected count: 37 audio files (not 56 - was counting .meta files)

34 sound effects still unverified.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Update ASSET_AUDIT.md: flag anybody.mp3 and runaway.mp3 for replacement

These two sound effects have licensing issues and must be replaced.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Update ASSET_AUDIT.md: also flag burnination.mp3 for replacement

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Update ASSET_AUDIT.md: mark remaining sound effects as presumed Asset Store

Owner believes 31 remaining sounds are from purchased Asset Store packs:
- Fantasy Interface Sounds
- Medieval Combat Sounds
- Magic Spells Sound Effects LITE
- Medieval Battle Sound Pack

Only 3 files need replacement: anybody.mp3, burnination.mp3, runaway.mp3

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Replace anybody.mp3 and burnination.mp3 with licensed alternatives

- anybody.mp3: replaced with Positive Effect 6.wav (Magic Spells Sound Effects LITE)
- burnination.mp3: replaced with Magic Element Fire 04.wav (Medieval Combat Sounds)

Still need replacements for:
- failure_horn.mp3
- runaway.mp3

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 15:44:53 -08:00
dc1c9e8284 Update ASSET_AUDIT.md with new AI-generated bridge icon (#5578)
Document that bridge.png was replaced with AI-generated wooden rope
bridge icon created with ChatGPT/DALL-E 3.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:17:23 -08:00
4338600896 Replace fire icon with UXWing flame and consolidate duplicates (#5570)
* Replace fire icon with UXWing flame and consolidate duplicates

Replaced the startFire.png icon with a clean flat-style flame from UXWing
(free for commercial use, no attribution required). Consolidated from two
duplicate copies to a single canonical copy in Assets/Images/, updating all
Unity scene references.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* Update ASSET_AUDIT.md with UXWing flame icon source

Document that startFire.png was replaced with the flame icon from UXWing
(https://uxwing.com/flame-icon/) which is free for commercial use with no
attribution required. Also note the consolidation from two duplicate copies
to one canonical copy.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 10:59:51 -08:00
89ad8371b5 Add Gemini LLM support with model comparison documentation (#5561)
This adds Google Gemini as a third LLM provider option alongside OpenAI
and Anthropic (Claude). Based on streaming latency tests, Gemini 2.5
Flash-Lite shows the fastest time-to-first-token (~0.6s) at the lowest
cost ($0.10/$0.40 per 1M tokens).

Changes:
- Add GeminiServiceImpl.scala following OpenAI/Claude pattern
- Add GeminiModelName setting (default: gemini-2.5-flash-lite)
- Update LlmResolver to support "gemini" provider
- Update admin console dropdowns with Gemini options
- Reorder dropdown options to show recommended models first:
  - OpenAI: gpt-4.1-mini (was gpt-5-mini)
  - Claude: claude-3-5-haiku (already first)
  - Gemini: gemini-2.5-flash-lite
- Add GEMINI_API_KEY to docker-compose and deployment workflow
- Add docs/LLM_MODEL_COMPARISON.md with latency/pricing comparison

Streaming TTFT results from testing:
- Gemini 2.5 Flash-Lite: ~0.6s (fastest, cheapest)
- gpt-4.1-mini: ~1.7s
- claude-3-5-haiku: ~1.9s
- Gemini 2.5 Flash: ~6.8s (surprisingly slow)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 08:23:38 -08:00
473f83e5f6 Complete deproto migration: delete plan and update linter (#5529)
The library/ code is now fully protoless (zero Scala proto dependencies).
Transitive deps through C++/Go build tools (map generation) are expected.

Changes:
- Delete docs/DEPROTO_PLAN.md - migration complete
- Delete scripts/build_deps_baseline.txt - no longer needed
- Update check_build_deps.sh to enforce zero Scala proto deps in library/
  (C++/Go proto deps are allowed as they're build-time tools)

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 16:26:57 -08:00