Quests, Android, and the Road to Google Play
The quest begins. Twelve encounters span three acts of escalating darkness; chickens scatter in the village square, bandits spring their ambush in the Whispering Wood, and something far worse grins back at you from the blight. Every encounter is scripted, every wave has a name, and every villain has something rude to say before you cut them down.
A new bow joins the armoury, and the bandits who carry them come in four nasty flavours: swordsmen, brutes with axes, archers, and knife-happy rogues lurking behind the campfire smoke.
Blight now runs on Android. Same world, same music, same chaos; tap the ground to move, tap an enemy to introduce them to your fist. Your phone is now a portal to Mudbury, and the Google Play Store is the door.
- Switched to using a VERSION file to track versions instead of differential commits
- Added
--no-musicCLI flag to disable music while keeping sound effects active - Added Lua quest system proposal (
docs/lua_quests.md); API design, full Act 1 example, implementation plan - Expanded quest proposal: quest/act/encounter hierarchy, wave spawning, building templates, roads, atmosphere, callbacks, experience system
- Added Lua quest scripts for all 12 encounters across 3 acts (
scripts/quests/); rewrotelua_quests.mdas live system docs - Implemented Lua quest engine:
QuestRegistry,QuestLuaApi, and refactoredQuestModeHandlerto load encounters from Lua scripts with wave-based spawning, act transitions, callbacks, and atmosphere - Added 14 missing entity definitions for Acts 2 and 3: blighted enemies (villager, merchant, soldier, guard), bosses (The Smile, The Thing), Act 3 enemies (mushroom, tendril), and new NPCs (merchant, soldier, king, child, skeleton_friendly, mushroom_person)
- Added mace weapon (enum, spec, procedural sprite)
- Procedural sprites for all new entities:
BlightedSprites.cs(sickly corrupted humans with blight eyes),SmileSprites.cs(96x96 grinning face boss),ThingSprites.cs(96x96 cosmic horror),Act3Sprites.cs(mushroom with spore particles, tendril with eye and suckers) - Extended
NpcSprites.cswith palettes for 6 new NPC types; updatedSpriteManager,ClientCreaturelabels, draw sizes, and spawn tints - Added
encounter(n)Lua console command to skip directly to any quest encounter; triggers full spawn (NPCs, weapons, enemies, dialogue) and teleports the player - Added
scripts/encounter_tour.luafor automated screenshot capture of all 12 encounters - Added bow weapon: reusable ranged two-handed weapon with arrow projectile, procedural icon, and twangy bowstring sound
- Added 4 bandit entity types with distinct clothing colors: bandit (green, sword), bandit_brute (brown, axe), bandit_archer (black, bow), bandit_knife (olive, dual daggers)
- Rewrote encounter 3 (Whispering Wood) with 3 waves of named bandits replacing orcs/skeletons; bow pickup available; NPC renamed to Red Martha
- Added bandit camp scenery to encounter 3: 2 campfires, 4 torches on stakes, barrels, crates, log piles, stumps, rocks, and 16 trees ringing the clearing
- Restructured Client into Client.Core (shared project), Client.Desktop, and Client.Android; game now builds and runs on Android
- Added LuaCATS definition file (
scripts/defs/blight.lua) and.luarc.jsonfor sumneko lua-language-server; provides hover docs, autocomplete, and static analysis for all Lua API globals - Extended pitch constants to cover octaves 1 and 6 (previously only 2-5 plus partial 6); fixes songs referencing undefined notes (A1, Gs1, As1, Cs6, F6, Fs6, A6)
- Added flat aliases for all pitch constants (Df, Ef, Gf, Af, Bf per octave); write in whatever key feels natural
- Added
CRASH_CYMBAL_1andMID_TOMpercussion aliases; fixes songs referencing non-existent drum names - Fixed
on_victory/on_startcallback signatures in quest encounter definitions to accept a context parameter - Moved test scripts from
scripts/toscripts/tests/subdirectory - Fixed fist hit detection to delay collision check until punch extends past body (sweepT >= 0.15)
- Added weapon range check to client-side hit test to match server-side validation
- Added server-side attack debug logging for miss diagnostics
- Added cross-platform asset loading (
AssetHelper.cs) for Lua scripts, SoundFont, and directory enumeration on Android - Quest scripts and song scripts now load on Android via build-time
_manifest.txtfiles (Android cannot enumerate bundled assets) - MidiPlayer uses stream-based SoundFont loading instead of file paths
- Fixed ANR on Android during game creation by running the game loop with
GameRunBehavior.Asynchronous - Added A* pathfinder (
Shared/Pathfinder.cs) with local grid generation, 8-directional movement, octile heuristic, and path smoothing - Added tap-to-move and tap-to-attack input for Android: tap ground to pathfind, tap enemy to approach and strike
ClientCreaturemovement now supports external direction input for touch controls alongside WASDCombatManager.TriggerAttack()allows programmatic attack triggering from touch input- Embedded assemblies in Android APK (
EmbedAssembliesIntoApk) to prevent deployment failures after clean builds - Added Google Play release pipeline: signed AAB build, version code derived from VERSION file, keystore signing in Release config, itch.io android channel, S3 APK upload
- Set Android target SDK to API 35 via AndroidManifest.xml for Google Play compliance
- Generated 512x512 app icon PNG from desktop icon for Play Store listing
- Added Blight landing page at bob.sh/blight
- Rewrote privacy policy for Australian Privacy Act 1988 compliance