Weekly Update – June 6, 2025

It was another productive week that included AI and interactivity improvements, UI refinements, and new content including the final list of non-magic weapons in the game.

  • Actor Memory. Actors now remember the Game Events they’ve observed. This is used to enable actors to determine if the Alarm Bell has been sounded in the past 20 turns. I will also use this to simplify a portion of the enemy action selection logic. Currently, enemies track actors they’re interested in (usually the player), where the tracked actors were last seen, and how long ago they were seen. Now enemies can simply search their memory for this information.
  • Ring Alarm Bell Action. Now that bandits only ring the alarm bell if it hasn’t been recently rung, this action is complete. I’ll make a video next week.
  • Game Event History. Game Events are now recorded. This was added to prevent Actor Memories from storing copies of the same Game Event. Actor Memories contain references to Game Events in this central store.
  • Game Event / Observation system simplification. Each Game Event is associated with one or more Observation Types based on the senses that can observe the Game Event. Actors perceive Game Events through Observations. Each Observation has an Observation Type that includes the sense used to observe the Game Event, the log message displayed, and some flags. This design evolved over time. Originally, only Observation Types existed. Game Events were added later on to represent an event regardless of the sense that perceived it. Over time, it became evident that Game Events were accessed much more frequently than Observation Types. Also, maintaining these objects, both of which are ScriptableObject, was tedious. When a new Game Event was added, I had to create the Observation Types first, then create the Game Event, then associate the Observation Types with the Game Event. However, this separation was unnecessary because, in practice, each Observation Type was only associated with one Game Event; they were never reused. I decided to remove Observation Types and move the information stored in Observation Types, namely the senses that can perceive the event and log messages, into the Game Event object. It’s now easier to maintain Game Events and the code is simpler.
  • UI Panel changes. A few weeks ago I split the Examine panel into two panels, Info and Examine. This was indeed confusing as u/aotdev pointed out. I fixed this simply by using more distinct and conventional terms – “Loot” instead of “Examine“ and “Examine” instead of “Info.” I also removed the Character panel, which displayed the player character’s stats, because the Examine panel does the same thing.
  • Effects triggered by Status Effects. Effects make things happen in the game, such as creating a new actor and converting an item. Each entity can be configured to cause specific Effects. Each Effect has a trigger, such as drinking a potion and colliding with another entity. Effects can now also be triggered by the addition of a Status Effect. This is used to enable interactions without defining the explicit entities involved (example in next bullet).
  • New interaction: Creating Poisonous Gas. Throwing a poison vial at a fire creates poisonous gas. This uses the new Status Effect Triggered Effects. The vial shatters when it hits the ground and creates a poison puddle. The fire causes a burning status effect on the puddle, which converts the puddle to gas.
  • New Status Effect: Wet. This is applied to entities that come in contact with a liquid. In the new poison puddle and fire interaction, the fire becomes wet when it comes in contact with the poison puddle, causing it to be extinguished.
  • Critical hits. Attacks now have a chance of critically hitting. The critical hit chance and damage multiplier are dependent on the weapon.
  • 50% smaller save files. While perusing the save files, I noticed multiple copies of entities were being serialized in some cases. A solution exists to prevent this (only storing a unique ID for entity references), but it wasn’t implemented in some of the objects that are saved.
  • Finalized standard weapon list. I finalized the list of standard (non-magic) weapons in the game. I used ChatGPT to write an importer to generate the ScriptableObjects from a CSV file. The stats are configured but images are still needed.
  • Bug fixes.

Next week, I’ll work on abilities, level advancement awards, level subthemes, enemies, and magic weapons and armor.


Posted

in

by