February 2016 Update

Greetings Wizards,

If you haven’t already, you can follow Rogue Wizards on Steam and add the game to your wishlist.

February has been all about magic, and now all 6 elemental magic schools each have 3 spells for a total of 18 complete and working spells that can be learned by the player. We’ll certainly still tweak these spells here and there, but having all 18 of them implemented is a huge milestone in terms of content.


New Freeze Spell Visuals

Town continues to get a facelift with new artwork pieces and arrangemnts. However, the most signifigant change includes a set of 6 pedastools which light up once the player has liberated the elemental realm from the wizard that was controlling it. Having these markers in town clues players into exactly what the scope of the campaign is from the start and visually shows progress as the player moves through the game.

Town progress gems

Town progress gems

Finally, we’ve done huge pass on all the story dialog along with NPC cast member changes that allow for a more natural flow through the entire game. Characters now have more interactions and give the player a lot more information about the world, the wizard guild, and the fight against Hosperak.

Story dialog

Story dialog

Major Changes:

– All 18 spells across 6 schools of magic are now implemented
– There is now a set of gems in town that fill up over time, when each elemental dungeon is available a gem lights up, and once the boss is defeated his sigil wraps the gem.
– New Spell: Force of Nature, Launch a directed ball of energy that strikes enemies within X tiles dealing Y as it travels a maximum distance of Z tiles.
– New Spell: Shield, creates a damage absorbing barrier around the caster and blocks some special attacks
– New Spell: Ignite, Creates a circle of expanding flame from the caster
– New spell: Anomaly, Summons a cosmic anomaly that follows you and transmutes enemies into various objects
– New spell: Boulder, Throw a massive boulder dealing earth damage with a high chance to knock the target back one tile
– Freeze now summons a small group of clouds that rise up from the ground, snow down, and attempt to freeze any targets below them.
– Second pass at all dialog is now integrated across all mainline quests
– The cast of characters for town structures and all quests have been updated to the new story dialog

Minor Changes:

– Fireball no longer has a chance to burn the target if the completely blocked the fireball attack
– Fixed Albatross doing double damage with its electric field skill (disabled “combat at target” flag in the skill like the players is)
– Shield now takes 15 elements to cast
– Stalagmites, Electric Fields, and Sentinels are now saved and therefore exist between save games and level transitions
– Stalagmites now last for more turns as the spell levels up
– Steal can now only be executed against players and no longer against followers or summoned sentinel actors
– Sentinel now tries to summon itself near to the enemy that is furthest away from you
– Sentinel is now limited to 5 total, when summoning the 6th sentinel, the oldest one will be destroyed
– Pallom is now found in the first dungeon and returns to Antarit with you
– Pallom now inhabits the vault in town
– Alnar now inhabits the supply depot in town
– The first spell now drops on the last level of the first intro dungeon
– The player is now automatically transported to the first dungeon after reading the scroll in the Wayside Inn, a portal no longer appears that the player has to walk through


– Exported Town_Intro dialog to pick up the new quest title and description text objects generated for the quest UI
– Removed old town intro quest ui text objects
– Separated the Wayside Inn logic into a new quest called DungeonInn
– Added logic to play a teleport effect after reading the first scroll and auto transition to the first dungeon
– Moved exposition dialog from DungeonIntro to DungeonInn
– DungeonIntro now automatically closes the DungeonInn quest upon entering the level
– Input is now disabled when a level transition is queued, not fixing anything in particular just seemed like a good idea
– Removed blocking quest marker from the inn marker sets that was used to have a place to spawn the portal
– Weapons and shields are no longer considered part of Actor bounds … we might parameterize this later if needed
– Fixed items being picked up to a wonky location if the bounds of the actor were too tall due to weapons (lance)
– Added support to DialogImporter for DungeonInn
– Exported DungeonInn from Google docs to new XML
– Added a new quest event for “begin play” that happens for every begin play and not just the first one which sends the event “begin play first time”
– Prevent crash when trying to retrieve a property and a prefab param was expected
– Quests are now allocated using virtual factory methods defined in their quest prototype classes, removed all quest prefab files that are no longer necessary
– Added support for quests to dictate that an entrance gateway is never active (dungeon intro uses this)
– Removed dialog when trying to use the entrance gateway in the first dungeon, since it’s visually inactive now it just does nothing
– Removed old quest classes for dungeon alpha, beta, armory, and town artifacts
– Added tutorial dialog bubble for the travel gate
– Fixed spellbook tab tutorial not checking the right flag in order to trigger
– Cleaned up the DualWindowUI.Close( … ) to use a set of bitflags, the flags are stored during the close process and cleared only at the end when complete
– Integrated new dialog for Cosmic Rift quest
– Integrated all new dialog for Nature rift quest
– Integrated all new dialog for the sky rift quest
– Changed all map markers for rift quests to use swirl vortex art colored for each element
– Fixed resistances and weakness for all guild wizards
– Set all guild wizards to summon enemies from only their own element
– LevelPrototype now has some checkbox options to enable/disable each of the level rewards
– Boss levels no longer give you an award for killing all enemies, unlocking all chests, or removing all traps … you get enough booty from the boss itself etc.
– Fixed AIs targeting bosses before they play their “find ceremony”, actors that have the ceremony enabled bit are now no longer targetable by any skills
– Dialog bubbles now take into account the speaker name label when positioning themselves on screen so the name is no longer cut off
– Fixed the height bounds calculation of a dialog bubble speaker name
– Integrated new earth rift dialog
– Spells are now sorted in the spellbook by family and then the order in which they appear in the spell tree
– Added SpellFamily.GetIndexInSpellTree( … )
– Integrated new dialog for Dungeon Fire
– Re-linked all area key unlocks for all quests to fit with the new town inhabitant matrix
– Added debug menu to give the player all the spells
– Cleaned up the spell acquisition API with a set of bit flags for show spellbook, ignore requirements, and ignore spellpoints
– Reordered the scrolls for all guild wizards in their new positions
– Integrated new dialog text for ice rift
– Removed hard coded journal prefab entries in quest boss prototypes
– Added QuestBoss.isThisBossScroll( … )
– Added LootTable.ContainsExplicitActorPrefab( … )
– Added new actor class “Story Scroll” and assigned to all scroll actor prefabs as well as a class reference in actor manager
– Created a uniform “Scroll Read Complete” dialog entry in all quest boss prototypes
– ScrollUI now requires the actor prefab as a param instead of the journal entry so it can be saved and passed through in a quest event when the UI closes
– Integrated new text for Dungeon Blacksmith
– Added quest title lines to all quests that needed them in the storyline google doc, the name of the row must be quest_title
– Changed storyline google doc quest_log line to be quest_description
– Added support for parsing quest_title and quest_description spreadsheet lines to DialogImporter
– DialogImporter existing and processed prefab lists are no longer templated and instead just collect all prefabs found in the output folder
– Moved all generated town dialog prefabs into a /_Generated folder like the other generated items
– Exported all quest XML with new titles, description, and typo fixes
– Fixed possible blocking logic bug if the player elected to not ever pickup the first spell from the intro dungeon
– Force player to have fireball when entering town
– Force player to be level 2 when entering town (development necessity only)
– Added tutorial for spellbook tab interface
– Added GetCountOfClass( … ) to both Inventory and InventoryCollection
– Added link to weapon spell actor class in the actor manager
– Removed the forced loot drop logic and instead put the first loot and first magic logic in QuestDungeonIntro
– Integrated all new town dialog
– Integrated all new dungeon intro dialog
– Changed the names of the story state prefabs to be prefixed with a number so they sort in order via the Unity inspector
– Added StoryState.GetPlainName( … ) which returns the name of the state without the number prefix, this plain name is used as part of the name for dialog prefabs that are generated by the dialog importer
– Removed old quests and states for Dungeon Armory, Dungeon Alpha, Dungeon Beta, and Town Artifacts since they are no longer relevant
– Moved first loot and first spell loot tables into dungeon intro quest folder
– Removed unused force loot drop tables
– Switched all quest cast members to their new positions and inhabited town structures
– Enabled interact indicators on the town structures that now need them for their new inhabitants
– Boulder moved to center of earth spell tree
– Implemented knockback for boulder spell
– Added tooltip and description for boulder
– Fixed boulder damage type and amount
– Added boulder spell classes, audio, prefabs, missiles, lights (not yet totally functional)
– PositionTween can now interpolate between two positions in an arc
– Missiles can now fly in an arc (boulder)
– Placeholder for last earth spell (Abyss)
– New portal swirl art for travel gate and dungeon entrance/exit gateways that is now multi-layered
– Rebuild effect and town sprite atlas
– Reorganized a couple spells in the spell tree
– Fixed spell upgrade UI displaying ranks and values for the spell with any current bonus values applied from other gear, now that current and next rank for the spell use the base spell level only for all values
– Added support for ActorTooltip to ignore bonus ranks in the tooltip
– Shortened the Anomaly spell description to fit in the spell upgrade UI completely
– Lighting and Cosmic ray now use the mobile particle additive shader (Adjusted colors to compensate for slight visual differences)
– Added Anomaly skill classes, audio, effects, and prefabs
– Moved lightning anchors into shared location and shared namespace
– Added Transmute skill classes, prefabs, effects, and audio
– Added Transmute spell to the list of spells that specials are immune to
– Changed a couple of particle textures from .psd to .png
– “Boss Chest Initial Properties.prefab” is now “Spawned Chest Initial Properties” and is used for spawning boss chests as well as transmuting actors into chests.
– ToDisplayString( … ) methods now take an optional bitset of option flags
– Added display string conversion option “Percentage” which will add the percent sign as part of the value converted from number to string
– NumericOneProperty tooltips now have a checkbox to display the value as a percentage
– Remove the hard coded % sign from all property tooltips in favor of the new display string conversion options
– All places where a % was used following colored variables (turns, damage, etc), the % sign is now colored with the variable value
– Added Property TransmutedTurn, this is the turn an actor was transmuted on which is set on some transmutation results (monsters)
– Removed redundant versions of Map.FindOpenCellAround( … )
– Map.FindOpenCellAround( … ) is now Map.FindCellAround( … ) and takes a complete set of bitflags to truly govern the cell filtering
– Unified all cell searching and iteration to use the new Map.FindCellAround( … ) methods
– SkillImmune and DamageTypeImmune are now results that come come back from DoCombat( … )
– Modifiers will now only bail out of DoCombat( … ) logic early if there was damage before the modifier did it’s effects, and after there is no damage. This allows us to pump through damage payloads of zero, but properly check for a skill immunity and get feedback on the target before totally bailing out of combat (such as casting transmute on an immune target with a shield)
– Removed RandomUtils file
– Added List<T>.Random( … ) extension method to select a random element from standard list
– Added some convenience List<T>.Random( … ) accessors on data structures build on them like color sets, actor sets, prefab sets etc.
– Added duration to Sentinel tooltip
– Added generic tooltip helpers to Skill … addDurationTooltip() and addChanceTooltip()
– Added dice icon art and created “Chance Property Icon”
– Added support to create skill effects at the target actor missile point
– FlockAnimator boids are now children of the attractor if present
– Flock boids are now initialized to visible on returning to pool
– Added option for flock boids to initialize their velocity always in a negative Z direction (towards the camera), this was helpful for the Anomaly boids so that always appear on top of the cosmic portal and move away from it initially so they don’t cut through the geometry before it closes
– Fixed shields showing their effect vs a damage payload of zero
– Added support to clamp the final values of NumericOneValuePropertyTooltip
– Fixed shield tooltip reading 0% when at internal values less than 1.0%, the display value is now clamped between 1 and 100%
– Added Anomaly rune and artwork
– Added Anomaly skill classes and prefabs
– Created Anomaly actor using the flocking animator
– Anomaly now summons a particle thing that attacks with the cosmic ray spell for now
– Added AI.ActiveInHierarchyIsFullyVisible, this is set to true for Swarm and the Anomaly actors since they have no other visuals to calculate visibility on
– Added FlockAnimator.Attractor, this optional transform reference will serve as the center of the flock if it exists and the boids are not parented to another another actor.
– Added Anomaly to the cosmic spell tree
– SummonSkill classes now have a summoned turns min and max
– Summoned skills can now optionally flip any items at the summon location away (Sentinel uses this)
– Summoned skill now has the option to destroy the oldest when at the concurrent max
– Summon skills now optionally can set a “destroy on die” property for the summoned actors (Sentinel uses this to not fade out)
– Added property “Summon Turn”
– Added property “Destroy on Die”, which is also data driven via summon skill prototype and is set for the Sentinel skill
– Skills now optionally require a player target
– Added Cell.FlipItemsToAdjacent( … )
– Added Map.FindActorsInRadius( … )
– Added Map.FindCellFlags set of bits to centralize iteration of cells for los, revealed, floors, etc
– Added Map.FilterCellCell( … )
– Added MapBase.FilterFindActor( … )
– Added audio and effects for sentinel summon and die
– Actors now save the last map id and mapcoord that they were located at
– Added Actor.OnAwayForTurns( … ), through which we pass time when returning to a map where an actor should have died while away
– Added ModifierCollection.OnAwayForTurns( … ) to pass time when re-loading a map containing an actor with a turn limited modifier on it
– Refactored Modifier so that all modifier OnNewTurn() effects happen, then passTime() happens for all modifiers at once
– Reworked modifier passTime( … ) so that it can handle any number of turns to pass at once
– Removed InventoryPrototype.SaveContentsMapCoord
– Added InventoryPrototype.EnterMapWithContainer, this checked via Inventory.EnterInWorldContents() when an actor enters the map … such is the case for all summoned actors residing in the summoned inventory … when the player enters the map, any summoned actors sitting around in that inventory whose last map id match the map being entered are placed into the map at their last known map coord
– Added InventoryPrototype.FollowContainer … this is set currently for the “Effect” inventory of the player for swarms and shield orb effects, and by doing so was able to remove the hard coding to only work on the effect inventory
– Actor.IsHostileTo() destructible is hostile param now works again
– Added description text for Sentinel spell
– Added SummonSkill.getAnchorCoord( … ) as a virtual that subclasses can override
– Added logic to SummonSkill.doSummon( … ) that can now keep track of the turns that the actors were summoned on and destroy the oldest when needed during the summon
– Slightly cleaned up the API for Level and LevelChain destroy calls
– Upon returning to town, we now destroy any actors found in inventory that are not “on person”, this covers effects, followers, and any summoned actors
– Added Cell.IsOnScreen( … )
– Maps now save the turn a Transfer( … ) was last executed on, we use this to simulate the passage of time when returning to a previous map so that any actors that are loaded on that map will expire if they had a lifetime, or if they had a modifier on them the modifier may expire as well. Note we do not simulate modifier damage while away at present.
– Added a flag to InventoryPrototype for “Pass Away Time”, which is enabled on summoned inventories to do the away turn logic upon map load
– Added extension method Enum.BitTest( … )
– Wiped save games
– Interim checking for the new Sentinel spell, it’s functional but needs some cleanup, balance, polish, and tooltip/text work
– Agents can now specify a missile point via a Transform
– Summon skills now data drive how to search for a location summon using the find cell bias settings of closest, close, far, and furthest
– Fix force of nature being present in the sky spell tree and not in the nature spell tree
– Fix spell tree ui nodes not properly hiding for a null spell in the family tree
– Sprites that auto play and loop infinitely now start on a random frame
– Added IgniteSkill classes with complete logic, flame missiles, prefabs, audio, etc
– Spells that do not require a target are now listed as “Instant” in their tooltip and spellbook description page
– Missiles can now specify their projectile flight settings using a speed or a time to travel
– Missiles now automatically snap their Z so the Z of their logical coordinate as they move through the air
– Added MissileSkill.OnMissileNewLogicalCoord( … )
– Missiles now has a data driven ease for their flight movement
– Inserted a new cell z layer called “Effect” between the “Front” and “Character” layers … all previous actors using “Front” now use “Effect” for their Z layer with the exception of two open door states that now use the new topmost actual “Front” layer. This fixes effects sorting on top of an open door hinge at two of the door orientations
– Added Skill.addRangedTooltip( … ) as a method where any skill can display a range in the tooltip where such ranges are not really stored as a property because they increase will skill level over time
– Added property icon for “Range” even though it’s not tied to an actual property, it can be found in the tooltip manager
– The SpellTreeUI now populates the nodes via the data in the SpellFamily tree instead of hard coding the rune positions and images.
– The SpellTreeUINode rune images are now done with instanced rune actors that live in the node and are placed at the node button location, while at the same time the renderer of the node buttons are now disabled so they are see through
– Moved a call in Parchment.updateClipping() to occur after the virtual to allow for subclasses to create new content that gets clipped when a parchment is opened (spell tree creates runes this way)
– Moving experimental fire elemental effect into cosmic magic under the name “Anomaly”
– Combat.Result now has a “Shielded” result bit
– Combat.Result wraps up Died|Shielded|Blocked into a set of bit flags that can easily be checked by callers as “HaltSpecialEffectCombat” when deciding whether to proceed or not
– Modifiers now have an official base rank saved in their property collection. The value comes from the source actor that puts the modifiers on the target and includes any rank bonuses on the source at the time the modifier is created which is forever preserved in the modifier rank value regardless of what happens to the source actor.
– Added ShieldSkill and ShieldSkillPrototype classes, derived from ModifierSkill and ModifierSkillPrototype classes
– Added working tooltips for the shield spell in the book, on the rune tooltip, and on the modifier hud tooltip
– Modifier initial properties are now linked in the inspector rather than using GetComponent<>()
– Filled out shield logic in ShieldModifier
– Added different shield orb effects for enable, on hit, and collapse … each of these 3 effects have different sounds, colors, light colors, and the collapse one scrolls the texture on the orb slower cause it’s cool
– Added 4 new properties to implement the magic shield
1) ShieldPointsMax
2) ShieldPointsMultiplier
3) ShieldPointsPercentRemaining
4) ShieldPointsRemaining
– Added property icon for shield
– Added PropertyInitialValue.RemoveFrom( PropertyCollection props )
– Added PropertyCollection.RemovePRototypeValues( … )
– Added new property formula classes ShieldMaxFormula and ShieldPointsRemainingFormula
– NumericOnePropertyTooltip can now optionally use the damage multiplier in a team prefab for the property value multiplier (used for shield)
– Added NumericOnePropertyTooltip.GetValueAsString( … )
– Modifier tooltips no longer show turn information if the modifier is infinite (shield)
– Fixed Shield material requirements and ice spell pre-requisites
– Added List<T>.RemoveAtSwapLast( … )
– Added DamagePayload.RemoveDamageEqually( … )
– Added effect texture and component logic for shield orb
– Added ModifierSkill as a generic skill that can put a modifier on the owner
– Added shield modifier
– Modifier now has an .OnCombat() method and is part of the combat logic
– Added audio effects and prefabs for shield on enable and on hit
– “SummonFollow” inventory is now called the “Effect” inventory and is intended for actors that are attached to and follower their owner coordinate, but the effects are in the world … this allows us to attach swarm and shield effects while at the same time the actors of those effects can have independent dynamic colored lights that move with the owner
– New item and artwork for shield rune (ice spell)
– Removed the silence lead time in the golem attack sound
– Removed AI.MirrorContainerCoord, this is now implied by the actor being inside the effect inventory
– Cleaned up API for Modifier.enableOwnerEffects() so that no override of Enable() is necessary
– Cleaned up TextureShine.shader Color property to be properly named
– Adding missing files from the last shiny title logo checkin
– Logo Shader is now called Logo Material since it’s a material 🙂
– Added TextureShine.shader
– Rogue Wizards title now shines
– Adding logo shine shader from unity asset store (with modifications to make it render transparent properly)
– Tweak art for stalagmite and force of nature rune
– Ball Lightning is now a green nature spell and is called Force of Nature
– Minor cleanup of boid null checking and activation state when returning to pool
– Experimental boid effect for fire elemental … or maybe cosmic spell or something.
– Added generic flocking components FlockAnimator and FlockBoid
– Refactored Swarm to use the new generic Flock components
– Swarm now uses a plain missile and attaches a boid from the flock to it when firing a pixel across the map
– Added a green/yellow light and intrinsic reveal to the boid on hit effect
– Added List<T>.RemoveLast() extension method
– Safeguard that cells do not become hidden with dead actors in them, when that happens those actors are now explicitly destroyed.
– Fixed ball lightning so it can fly through the cosmic rift short walls
– Missile lights will now work across a chasm of null cells like when shooting ball lighting across a gap of cells in the cosmic environment
– Formalized the “LogicalCoord” member of a missile and update it during all missile movements
– Fixed a crash in Skill.CanTarget() that was possible when no cell existed at the target coord
– Added options to skill prototype RequiresTargetCell and RequiresTargetFloor, both are false for ball lightning
– Added a light to the icicle missile travel and ending explosion
– Safeguard against creating on hit effects at missile destination target coords when such as location has cell (not perfect, but ok for now)
– Line.EnumeratePoints() is now capable of enumerating points on an infinite line, the caller is expected to stop enumeration of course
– Ropes can now optionally be parented to the source anchor, which allows the rope to move on the source end over time
– Fixed rope Z sorting so the most camera forward Z between the start and anchor end positions is used for all rope particles
– Refactored the API for Skill.CanTarget() to use a reference input/output structure param Skill.TargetQuery
– Missiles now have the following new features
1) LogicalCoord property field
2) GroundPositionWorld property filed
3) GroundTrajectory unit vector property field
4) Calls into m_sourceSkill.OnMissileFired( this )
– Added SkillPrototype.RequiresRevealedLocation (false for Ball Lightning)
– Skills can now be instanced, the targeting skill for ball lightning doesn’t do anything but service CanTarget(), so a bare bones skill base class is fine for this purpose
– Filled out logic for Ball Lightning and created all skill, audio, and effect prefabs
– Freeze spell polish, clouds now animate away when complete, fade out, and scale to zero
– Updating spine project with the events now visible in the editor again (the file was fixed and sent back from Esoteric Software)
– New snowflake art for Freeze
– Freeze is now a summon skill
– New effects for freeze with clouds, snow particles, lightning zaps