M2 Work Update

  • Pack as a native app via Electron


  • FOV
    • Add mask as a non-camera fixed group, to make it move smoothly with camera
    • Update mask when opening and closing doors
  • Keyboard commands
    • Use: Open and close doors
    • Look
    • Inventory: For the different party members, using number keys
  • Read books


Line of Sight

Was considering what would be the best way to do this. LOS in Ultima 6 is weird since it seems to be location-based (once you open a door you can see the room inside), but you can see through walls (some times?).

I thought just replicating it for the sake of it didn’t make sense and would bring more complexity for map handling and editing. So instead I went for a full system with opaque tiles, so you just have to define the tile as opaque and the engine takes care of the rest.

The current implementation is a pretty simple raycasting, and a mask drawn over the map. It works almost great except the tweening of the mask moving is not in sync with the camera tweening, which causes some small artifacts in the mask border.


Saving and Loading Games

Finally managed to make saving and loading work, which involved doing a big refactor on the data that was being kept on each entity. I’m using my own circular-functions library and even had to push a small bugfix after about 4 years. See it working in the video below.

This will require some more testing, some bugs likely managed to slip in since it’s a big change.

Also, since the last update, the changes done by Jucarave for door handling were merged in, as well as the popups with item descriptions.

Next up to finish milestone is:

  • Line of Sight, still thinking of how to do it, considering the following options:
    • True LOS using raycasting or shadowcasting like a traditional roguelike, might be a bit heavy in the processing and might look a bit weird with the scrolling, but would be more accurate and apply to a lot of different situations without special casing. Just need to define whether a particular cell type is opaque or not.
    • Ultima 7-like, using different “zones of sight”, so if you are inside a building you can only see inside the building (but you can also see other nearby building through the walls!), and if you are outside the buildings you can only see the wilderness (but you can see through buildings!).
    • Ultima 6-like, with more elaborate areas of sight, so once you open a door you “unveil” the room, but then would have to keep track of these areas, and model them as part of the maps. Also you can see other unveiled rooms thru the walls.
  • Reading Books, which should be simple enough.



But sadly busy with too many client projects and getting my game pitch ready for GDC 2019.

It still hurts me every day that I am unable to progress in this project, and I keep it on top of my list, it’s just a list with lots of things on top of it.

I got some work in the save/loading routines that I haven’t posted about, I’ll hopefully have some news about that next week.

Milestone 1 achieved (v0.3)

Version 0.3

Many things were done in order to reach M1, besides some tweaks on the maps and the scenario data itself (NPCs stats, dialogs), here’s a list of changes on the engine.

  • Add trigger to set enemies hostile, make waitCommand intent work
  • Make “bye” be the default keyword
  • Scale viewport to fit available space and center horizontally
  • Only show messages in combat mode
  • Remove party member when dead
  • Fix issue with Cancelled flows
  • Prevent party members from initiating attacks
  • Prevent far away mobs from acting, except if they have been hit
  • Start combat mode whenever a mob attack happens, regardless if its a party member
  • Activate mobs in batch after the player has been added
  • Block action while targetting for Attack command
  • Handle “targetting” state transition to prevent UI conflicts
  • Update interaction type label when combat ends
  • Reset state correctly after getting an item
  • Make friendly mobs (not party members) attack enemies in combat
  • Don’t consider neutral mobs as a treat
  • Add “wander” intent by default
  • Transport party members to new map
  • Chain trigger actions using promises

I tried to get the packaging system to work for this version (in order to create native executables), but sadly NW.js doesn’t seem to be on a usable state now (at least not for Mac). So this will be delayed to M2 where I’m most likely to look into ElectronJS for this.

You can check a working scenario using version 0.3 of the engine here! All bug reports are welcome, initially via comments on this post (until we have a working web forum)

Of course, the gitlab repository has been updated for backers to play around with this, ask in the Discord channel for guidance if you want to use it to start creating your games.

Work on 0.3 (m1)


  • Execute mob triggers in sequence
  • Load items from tiled map
  • Add cutscene type trigger
  • Add load map type trigger
  • Fix ‘combatTurn’ trigger type to only work while in combat

This completes the planned scope for M1, however, there are still some things I want to do before releasing it:

  • Enhance cutscene for the transition to Iolo’s
  • Add portrait for Shamino

I’ll also clean up the bugs backlog (7 items there now).

0.2 released

V0.2 is now available privately for backers with access to the gitlab repo.

Screen Shot 2018-11-12 at 8.08.19 AM


  • Combat mode
    • Only include mobs nearby to the party on the active queue
    • Prevent starting conversations while in combat mode
    • Add triggers by “combat turn #”
  • Party Status
    • Add support for party member portraits
    • Add health bars
  • Add look command for mobs (Click on them to display info)
  • Fix: Ignore neutral mobs on friendly mobs pathfinding
  • Fix: Crash when mob interacts with the player and he hasn’t moved.
  • Game Over
    • Freeze mob actions
    • Show Game Over popup