
Conjure spells from an ever-growing repertoire of combinations in order to survive against the onslaught of enemies, save your friends, and ultimately devastate the great danger that opposes you. As you progress further, your spell collection grows, enabling even more chaotic and creative encounters.
Use the environment to your advantage!

Each level is procedurally generated, providing you with ample new means of cheating death just when it appeared that you had no escape. As you learn the many ways your spells interact with yourself, your enemies, your allies, and the environment you will become more resourceful and adept at handling the most difficult encounters.
Work Together!

Spellmasons supports online multiplayer so you can coordinate and strategize with your friends! Spellmasons uses innovative faction-based turns: You and your fellow mages can all move, cast and act simultaneously. Plan carefully, work together, execute your master plan, and overcome the challenges before you!
Grow into a formidable mage!

Unleash absurdly powerful endgame spell combinations where one small difference can mean the simultaneous death of every enemy on the map or the end of your run!
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/client@1.1.3
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
Minimum Setup
- OS: Ubuntu 14.04. Fedora 24. Debian 8
[ 6519 ]
[ 2504 ]
[ 4798 ]