1. Spellmasons
  2. News

Spellmasons News

Stabililty Update

There's a big content update coming on April 27th, and this update contains all the fixes and improvements that SoulMuncher and I have been working on over the past few months while developing the new content.

Please let me know in Discord if you encounter any issues and thank you for your continued support!

Change log:

- art: Add particles to skyBeam
and reposition it slightly to better cover the player's feet
- art: Default to 1px unit outline
Unit outline can be modified or turned off in Accessibility settings.
I initially added the outline to help colorblind users distinguish between
enemies and allies (you can change the color and thickness), but I found it to be
very useful for me too as it helps distinguish units from the background so I've turned
it on to a default.
- art: Add shadows below walls
so they feel more connected to the environment.
- art: Update animated tombstone
Tombstone appears instead of a dead body when gore is turned off in settings
- art: Spellmasons play the bookIdle animation
when viewing their inventory.
Fixes bookOpen from playing every time a spell is cast in multiplayer
even if no other player is casting
- fix: poison bug
- fix: clone
Too many stacks would break the game due to the
absurd number (limit to 10 - which is still enough to practically cover the whole map).
Fix clone prediction badges, it now shows the actual number of
cloned units because they no longer overlap
- fix (IMPORANT): Synchronization bug
This one, I believe, is rather significant. It should dramatically reduce desync issues after casting where you would cast a spell and it would suddenly be "undone" as if it never happened
- fix: forceMove timeouts when multiple (#575)
force moves were added to a unit or pickup
- fix: flamestrike bug
- fix: contaminate extras
* fix: radiusBoost refactor for mods
* fix: Contaminate not spreading modifier "extras"
- fix: Targeting Unspawned Players
Fixes a bug that allowed unspawned players to be targeted, which could cause a desync in the game over state, and adds further support for additional universal targeting catches by passing underworld through as a parameter to the add target function
* Fix Target Similar Targeting Unspawned Units
* Added warning for future bug catching
* Fixed prediction discrepancy
- fix: "Good Looks" upgrade filters out Doodads now
So that choosing good looks doesn't explode urns
- fix: Units being removed for being "out of bounds"
when they were just close up against an upper wall.
Unit's center point is the center of their image, and since this game is 2D but
allow's "tile overlap" because it is appearing as isometric, the pathing bounds
are pulled up by 10 (-10) and so when checking if a units' center point is
inside a wall, we need to + 10 (down) to account for the fact that they can overlap
by 10 with a wall that is above them.
- fix: Squiggly force move lines
when multiple forces were applied to the same object.
Now forces get summed.
Also fix prediction and headless fully processing
forcemoves between units dying instead of letting all units die and then
processing all the force moves (like the regular game client always has)
- fix: await endPlayerTurn
This is not in response to a bug, but I noticed that endPlayerTurn
is async and not being awaited.
Based on a visual inspection this only effects hotseat
- fix: contaminate now spreads extra properties of modifiers (curses) such as expanded range
- Thanks to @theytookmysoul aka Wisky
- fix: Good Looks no longer explodes urns
- Thanks @Elvarien
- fix: Game soft locks if whole party is froze
- Thanks @Waterbending Squirrel for reporting
- menu: Add "recent custom server urls"
So that it is easy to rejoin a server with a custom url
- menu: Support quicksave at beginning of level
- menu: Add bookmarks to menu
to help find spells quickly by category
- menu: Style Accessibility menu so it's more organized
Add gore options to a11y menu in addition to
graphics menu
menu: Make actively selected buttons more obvious
- Optimization: makeManaTrail to lower particles
if number of trails gets large
- Optimization: Only run prediction calculations
if the player is hovering over the game space.
If they are hovering over the spellbook or toolbar,
it will not run predictions and thus not bog down
the experience of picking new spells when
the prediction calculation is hefty.
Thank you @Whisky for this idea!
- Localization: Polish
Update Polish translations with Whisky's translation
- Localization: Poison "start" -> "end"

Optional "No Gore" Mode

When I was a kid there were lots of games that I wasn't allowed to play and so I empathize with young gamers who face restrictions. Thanks to the request of MrMarblz from the community I was reminded of this and so have added a "No Gore" mode accessible in Options > Video > Blood and Gore.

No Gore Mode
- Removes Blood
- Removes Death animations
- Replaces corpses with Tombstones
- Removes gory sound effects
- Removes gore-containing tutorial and tooltip gifs.

Also in this update:
- Feature: Purify now works on Cursed Mana Potions
- Thanks @Koliostro for this AMAZING idea

- Fix: prevent network messages from old levels from executing
on a new level.
- Thanks @ReddPine, @Raven, @MrMarblz and others for reporting

- Fix: player stamina unexpectedly getting set to 100
- Thanks @Innonminate for reporting

- Fix: Potions spawned from Urns with Last Will from appearing at 0,0
- Thanks @Innonminate

- Fix double decoy scaling

Small Hotfix / Bug Fixes

Hello all!

Update 1.28.2 was a pretty huge refactor to stabilize some of the more important systems of the game and there were a few small issues that came with that update. Thankfully they are now fixed!

- UI: Add hotkey numbers to side card holders
Update hotkey numbers of spellbar if they change in controls
Thanks MrMarblz!

- fix: Server Crash due to broken kill switch (#490)

- fix: Ally deathmason not summoning
ally units on levels with Natural blue portal pickups.
Thanks Raven and Isneverthere!


- Deathmason On Death Event Fix (#467)
- Killing the original deathmason will now slay all enemies on the map like it used to
- Killing the original deathmason will now spawn his 3 brothers like it used to

- fix: Waves
- In plus levels, players get full mana before additional waves spawn

- fix: Players suddenly at -1000,-1000

Thanks as always to all the amazing players for your support. Checkout our discord community to be a part of the happenings! https://discord.com/invite/q6sUCreHeJ

Update 28: Dramatic Entrance

Version v1.28.1 lays the ground work for a large upcoming content update with some important stability improvements. Additionally, a new spell has been added along with some balancing and a dramatic boss intro. Stay tuned for our largest content update to date, coming soon!

- Added Spell: Potion Shatter
- Shatters a potion to apply its effect to all nearby units
- The area of effect increases with each stack of the spell
- Mana Vampire Changes
- No longer reduces maximum mana
- Steals up to 40 mana from its target with each attack
- Can spend up to 40 mana each turn to heal itself
- Deathmason
- Spawns after the players have taken their first turn, as to not reveal his location early
- Has a sick intro animation
- Steam Overlay
- Pressing [Shift+Tab] in the Steam verison of the game will open the steam overlay
- Tutorial Improvements
- Players start the tutorial with Target Cone, Slash, and Push
- Stat points earned in the early stages of the tutorial are auto-allocated to Max Health instead of being removed entirely, as to not make players' first sessions more difficult
- Many other Tutorial fixes: Most listed at the bottom of the changelog
- Huge Game State Refactor: This refactor encompases many different game systems and fixes. It should make the game much more stable and prevent softlocks
- The end turn logic accounts for unspawned players, players that can't act (due to being frozen, dead, etc.), and should handle other edge cases more consistently
- Players can end turn without needing to enter the portal and should never have to end their turn multiple times to progress the level
- Fixes an issue that sometimes caused players to choose their classes at different times - Thank you @Moonlighter
- Ally units have their end turn effects applied at the end of their turn, instead of at the end of the enemy turn
- Improved unit turn order. Ex. Ranged units will always complete their action before Priests take their turn
- Smart targeting factors in unit turn order, making it much more predicatble
- Units are much less likely to make targeting mistakes, such as targeting an enemy unit that's already been killed by another unit
- Planning view attention markers consider smart targeting, fixing an issue that rarely caused false prediction markers, especially with decoys around
- Additional waves spawn the turn after all enemies are killed, instead of spawning immediately - Thank you @BrewBreuw
- High scores are reliably tracked in online multiplayer, and for all hotseat players
- Completing a level and dying within the same series of events should favor the player and progress the level, instead of ending the game immediately
- Rework for client ID's, which should
- Improve lobby handling for online lobbies to prevent issues such as duplicated players
- Allow saved hotseat games to be loaded in an online multiplayer lobby
- Ensure spells and network messages always target the correct player in hotseat (I.E. Freeze and admin commands)
- General stability improvements

Other Fixes
- Fixed an issue that allowed players to skip the Deathmason's second phase. Deathmason now enters the second phase via the OnDeath event - Thank you @tennun.
- Fixed an await issue that prevented "Slash" from resolving correctly, which could sometimes lead to desync
- Fixed an await issue that prevented "Arrows" from resolving correctly, which could sometimes lead to desync
- Fixed a pathing issue that caused desync in online multiplayer games where gripthulus or resurrections were involved
- Modifier keys are ignored if there isn’t a bound action. I.E. [Shift+A] will move the camera to the left, unless you have [Shift+A] specifically bound to something else - Thank you @innonminate
- Fixed a bug that caused the some tutorials to not be completed when they should
- Fixed multiple tutorial display issues, such as explain prompts not showing up, completed tasks not appearing, and the tutorial not appearing correctly in multiplayer
- Fixed an issue that caused urn explosions to disappear too quickly - Thank you @blue1760
- Improved debug and logging
- Temporarily removed LoS targeting lines in preparation for an AI Refactor

Update 27: Tons of fixes and improvements

Hello everyone,

There's a lot of good stability fixes and refactoring in this update. (And a new Spell!)
One notable change is that there is now a one-time privacy policy popup; this is because I'm collecting detailed logs for multiplayer games so that I will better be able to debug issues that are reported.

Some game engine systems went through whole rewrites to be more stable and to improve predictions.
A few important desync issues were resolved too.

Complete notes below:

feature: Add spell: Bone Shrapnel
- Destroy corpses to damage nearby enemies
- Thanks Ry for inspiration
feature: Clones added to target list (#298)
So now when you clone a unit or pickup it is automatically
a target for subsequent spells in the same spell group
balance: Reduce with of collision radius for
ghost arrow
It was far too wide

admin: Add arrow keys to navigate power bar
admin: Add "Give Card", "Level up"
and new level skip admin commands
admin: Add powerbar
Accessible via Ctrl + Space
admin: Add admin tools for testing desync
Closes #315
admin: Warn about needing a selectedUnit
for admin functions that require one.



menu: Add Privacy Policy and EULA popup

a11y: Add font selector for accessibility
#365
@Tatapstar

fix: Jan 10 Fixes (#370)

* Burst VFX Fix

* Some distance optimization

* Targeting spells sort added units by distance

* Swap targets last unit instead of initial

* Distances and Optimization

* Distances and Optimization 2

* Target Similar and Kind consistency

- Target Similar ignores factions when targeting dead units
- Target Kind uses the same logic target similar does, and removed multiple filter overlap to make it more readable

* sortClosestTo Function

* Removed Sqr Calcs for code clarity

- SqrDist and SqrMagnitude have been removed. Turns out they provide negligible levels of optimization, and is not worth the maintenance/readability of the codebase

keybind: Add Reset button to return
to defaults.
Allow 'Esc' to clear current key
Thanks @BigRedCat

i18n: Fix missing localization

Note: the " spellmasons " class upgrade has spaces so as to not conflict
with the summon spellmason upgrade so I had to add
an extra line of localization

fix: Impact Damage Fix (#353)
* Arrow speed fix and slight optimization

fix: Health potion capping blood curse health overflow
Note: Regular healing over max is still denied in the takeDamage function.
Tested with health potions and the healing spell
Fixes #346

Further QA and Quick Fixes (#351)
* Fixed Ice/Poison urns pushing units
* Re-enable gripthulhu
* Fixed blue circle issue
* Gripthulhu uses LOS and correct movement/mana
* Fixed poisoner using incorrect mana
- Temp fix, used same workaround as the priest
- Needs better fix in the future
* Orient to match other LOS enemy behavior

fix player teleporting back to cast location when moving

during long-lived cast in multiplayer. This ocurred because MOVE_PLAYER is handled syncronously (in queue) on all clients and the server except the client of the player whose moving and by the time they are triggered the SYNC_SOME_STATE occurs and resets the player position.

Now MOVE_PLAYER is handled immediately so players can move while casting on all screens (but still handled without the MOVE_PLAYER message on the current client for their own player to prevent stuttering while moving themselves).
Fixes #329

fix: awaitForceMoves timing out for long arrow spells

Now that projectiles work with the forceMove system, and because stacked arrow spells can continue to add force move projectils over time, the awaitForceMove timeout must be reset
everytime a new forceMove is added since its completion can last an arbitrary amount of time, but it still needs proecting against an erronous forcemove that never ends.

Fixes #352


UI: Fix missing spellIcons
Closes #320

fix: Prevent tooltip stutter when scrollbar appears
Fixes #211

src: Allow backups of the same day and name
to overwrite each other.
Tested in multiplayer.

Closes #345

clean: Prevent meaningless error on client
`process is undefined`

content: Add spell icon recall

fix: runTurnStartEvents should complete for all units
before moving on.
This was not previously a problem because there weren't any onTurnStart events that were using async code, but
to support that potential, all onTrunStart events should be
awaited and completed before moving on in code execution.
Thanks MattTheWaz
Closes #326

a11y: Choosing default outlines saves your setting
Closes #338



fix: Force Move Improvements (#341)

fix: Quick Fixes (#342)
* Max mana no longer scales with strength
* Resurrect sets endedTurn to false
api: Add `pull` and `makeForcePush` to the api
Thanks MattTheWaz
Closes #326

fix: Refactor Force move projectile (#303)
* src: Add Event.onProjectileCollision

* src: Projectile:
- Support pierce
- Clean up image when done
- Fix firing multiple arrows in sequence
- Clean up projectile on collision

* ref: Rework arrow spells to use forceMoveProjectile

* src: Add gameloop delta time to forceMoves

* log: Report loop count limit

* fix: Headless not having element.querySelector

* fix: Pull typing after refactor

* clean: Remove unused import

* wip: Build system for using setTimeout in headless and prediction

* fix: pull distance due to forceMove refactor

* balance: ForceMove impact damage scales a lot
stronger than it used to

* log: Remove dev logs

* fix: Restore timeoutToNextArrow

which was changed for testing purposes

* fix: ArrowEffect takes the card id

so it triggers the right projectile collision function

* fix: pierce hitting the same unit multiple times

* fix: arrow not being awaited

* fix: shove magnitude after forceMove refactor

* fix: velocity falloff should take deltaTime into account

so that regardless of the deltaTime passed into
runForceMove and the number of times it's called, it will
have consistent results between clients

fix: Significant movement desync

Where if units started their turn already with a path, on headless,
as soon as they got stamina they'd start and complete their movement,
all before unit.action was invoked. This is different than on
client because the server executes the gameLoop all at once.
The solution is to always clear the unit's path at the start
of their turn so that they don't start moving unless unit.moveTowards
is invoked inside their .action function.

log: reduce logging noise for server

Related #291

fix: Dark priest and ghost archer action desync

Closes #291

menu: fix codex UI issues

Closes #311

menu: Disable multiplayer game name
and password fields
once the client has joined the room
since changing them won't have any effect

Closes #297

fix: Clear inventory
in new underworld without calling syncInventory which requries a globalThis.player
Fixes #305

npm: @websocketpie/[email protected]
Fix clientId being set to '' on roomLeave
Fixes #292

Colorblind support (#314)
Ref: #293
* src: Customizable color and thickness outlines
* menu: Add outline accessibility controls
* src: Persist accessibility outline to disk

Fixed Target Similar (#307)
* Fixed Target Similar
* Removed workaround and prediction copy
* Updated pickups to match unit behavior
* Initial Targets [] for multi-initial targets
Fixed target similar adding the same target multiple times
Fixed clone not adding pickups to target list
* fix: Restore use of lastPredictionUnitId
predictionUnitIds should be incremented differently from
unit ids.
This is because prediction loops can run different amounts on
different clients, but all clients should call create for real units
the same number of times, keeping the unit ids in parity.

fix: planningView graphics shouldn't use the prediction unit id to
find the corresponding real unit id, so I added `real` as a reference
to the original just like pickups.


End Turn Sfx plays when an ally ends their turn as well (#309)

Resurrect requires a valid corpse (#308)
Res requires a valid corpse
Fixed an issue where you could resurrect a unit after using bone shrapnel on them, which could lock the game in the case of a player character

fix: Reset out of bounds players
This should never happen but to prevent
the game from getting stuck,
if a player gets out of bounds, reset them.
Closes #277

fix: Multiple priests targetting the same corpse
Fixes #247

fix: Prevent target similar from
mutating targets array while iterating targets array which resulted
in undesired extra targeting because the targets array is refreshed inside of
every loop.

Fixed #299

fix: Timemason on Hotseat
loses mana when other player is active

Fixes #302

Contaminate Exclude Corpse Decay (#287)
* Contaminate exclude corpse decay
* Corpse Decay can't affect players/living