Greetings Wizards,
A lot of time in July was spent putting in some new monsters that completed all their art and animations, adding new behaviors for some monsters that already had art, and adding some game engine features to support the new behaviors and skills.
First off is the Fire Giant, we’ve had his artwork and animation in for a while now, but he didn’t do anything but a basic melee swing with his axe. Now the Fire Giant has a magic spell that shoots rays from his axe to several locations around him. At every location a burning fire hotspot is created which remains for a few turns. Additionally, any items at the location of a fire ray hit will be permanently destroyed and can’t be picked up.
Alex and Aden finished the artwork and animation for the Disturbling, a super crazy cosmic creature. He’s got a bite melee attack, but has this really twisted looking magic attack where a hand comes out of a portal that opens in front of his mouth. Not sure what that’s gonna do yet.
The Thiefling is a new creature that can steal items from the player. He’ll prefer to steal items that are currently equipped or on the shortcut bar of your player, but sometimes also dips deep into your backpack and can steal any item. Watch out if he steals a stack of magic materials, you might quickly find you can no longer cast that fireball spell you had readied.
Here’s the development highlights and details from the past month. Want to talk about these changes or other aspects of the game, then visit us in the online forums.
Major Features & Changes:
– New Creature: Thiefling … these rat like hunchbacks can whip you with their tail or steal an item from your inventory and quickly flee with it.
– New Creature: Mimic, these look like chests but will attack you when you disturb them, if you find them via “detect hidden”, you will see the true Mimic form but they remain dormant until you interact/hurt them
– Champion monsters now summon 1-2 minions when they cross below 80%, 50%, and 20% health
– Blob enemy now has a 75% chance to replicate when damaged or killed, each successive generation of replciated blob has -20% health per generation
– Fire Giant now has a ranged magic attack in which he raises his weapon and fires 3-6 bolts at surrounding cells causing a fire hazard to appear at the target and permanently destroying any items on the ground there.
– Banish is now 10% more likely to work on the same target for each previously failed banish attempt on that target
– When you destroy an item for the first time, you now get a confirmation dialog to make it clear that the item is being destroyed and not un-equipped or dropped or something.
– The minimap is now visible during the intro “Wayside Inn” intro map
– Sundries now always has at least 2 health potions to sell
– Chests now always drop better loot, they can no longer be empty or spawn materials
– Keys can no longer break when opening chests until you are level 5+
– Removed demolish from all town ring interact menus
– Disabled the physical damage combat immunity, it’s super harsh
– Totally removed all weapon +3 rank affixes by setting their weight within their affix group to zero (the affix still exists in data if we want it back)
– Rebalanced the weights of affix weapon +1 and +2 ranks so that +1 ranks appear 90% of the time and +2 appear 10% of the time
Art:
– Dragon Whelp is now ready to be animated
– Owl is now ready to be animated
– The 18 Kickstarter Backers are 99% ready to be animated, these will be both playable characters and NPCs
– 10 Villager homes art is completed
– Thiefling animations complete
– Mimic animations complete
– Disturbling animations complete
Code & Framework:
– Wardrobe effects can now be optionally pooled (Disturbling attack and die vortex is setup this way)
– Wardrobe.HideEffect() can now match based on prefab as well as source actor id
– Removed portal from Disturbling .spine file and added a few portal guide images to assist in animation
– Disturbling die and attack portal is now done by an engine wardrobe effect
– Agents now support generic wardrobe effects for animation events
– Split Human Source.psd into 3 .psd files: Attachment.psd, Female.psd, and Male.psd
– Cleaned up, renamed, touched up all male and female NPC art layers
– Re-organized all attachment, body, and head layers for male and female
– Touched all attachment nodes in Spine for Male and Female character to point all attachments and body parts to the new exported images in their new location
– Set the bone ids for Head 01 to be Head_Ersh, Head_Morley for clarity and having a name to use instead of talking about a number
– Massive refactor of the Trigger and Trap family of classes to further unify how the logic is triggered and run
– Updated Electric Field, Spike Trap, Teleport Trap, Teleport Pad prefabs to the new trigger system
– Added generic “Open flame” environmental hazard that deals fire damage to any occupant of the cell its located in
– Triggers now have an Attack multiplier so they can participate as sources of skills that do damage without a combat module
– Manually revealing a trap will now play the reveal sound and visual effects
– New art for the spike and teleport trap pressure plates that just looks like a rock … in the detected state it is colored using the map compliment color
– ActorSpec now has a SourceSkill field, this is used by the RemoteSkillTrigger class on actor create
– Removed the now un-necessary “OnConstructedBySkill” message broadcast
– Hotspot class is now called RemoteSkillTrigger
– Added Trigger.InterruptExecuteTrigger() which generates an scripted action and starts it for the trigger, this is used when the object is triggered by movement via locomotor or when the object is created in a cell with an existing valid target using the INotifyChangeLocation system of the triggers actor
– Moved a bunch of trigger and trap C# files into a subfolder for organization, will be re-factoring these more later
– Removed Trigger.OnEndOfTurn()
– Added Trigger.OnTriggerActionStarted() which is called from TurnAction.Start() for any action that is started which was generated by the trigger, the logic for “last triggered turn” has been set into here as the most reliable method of recording it
– Added FireRaySkill and FireRaySkillPrototype
– Reworked the Skill.CanTargetResult so that success occurs when *no* flags are set, this allows for derived skill classes to easily tack on more failure conditions without having to clear a success bit … if no code complains and sets bits, then the result is a success
– Refactored rope chain skills so that base classes of DoSkill() are always called where important things like storing the turn action id happen etc.
– RopeSkill and RopeSkillPrototype are now abstract classes from which to build more complex skills like RopeChainSkill, FireRaySkill etc.
– Removed unused Summonable class
– All summon skills now have field flags that support automatically doing combat at the target location of the summonable as well as auto adding the summoned actor to the action manager to do actions on the same turned it is summoned
– Fixed mouse over actor information display, this broken with the last InputManager refactor that changed where to properly look for the “top” input controller in the stack to see if we were doing “game world input” or where controlling some modal UI
– Refactored how the AI selects a ranged or melee attack … now out of range skills are properly considered so that we can choose to move closer in order to execute a skill because our stance prefers it, even if we can do another less preferred skill at our current location
– SkillDecisions now tracks 4 groups of skill 1) Melee in range, 2) Ranged in range, 3) Melee out of range, 4) Ranged out of range
– PackedSpriteEx class will now no longer drop lopping animation play requests on the floor if the game object is not active in the scene, now the requeseted animation is held on to, and when the object becomes enabled again the animation is started
– SpriteClipAnimator now behaves nicely when used in a game object pool
– Game.Instance now has a distinction between “Running” (any scene with game logic) and “Playing” (player has actual control)
– Broke out “color via map” into a function on Actor
– Fixed newly created actors not being lit correctly in their new cell, now their cell lighting is synced upon creation
– Removed TriggerProxy prefab, class, and all ugly code littered throughout the trigger classes that were supporting it … ther eare no objects that are multi-size triggers at present and if we need this agian we’ll do it way better next time
– Fixed attribute names overlapping the attribute icons on the scroll attribute UI
– Loot tables can now specific “All” instead of a random number of picks … in this evaluation order, every entry is evaluated once in the order that they appear in the table.
– Moved vendor treasure tables into a folder
– Added tutorial message and id for “InventoryTrash” (wiped save games as a result)
– Added custom inspector for LocalizedText, the text field is now displayed with a larger font
– InventorySlot now uses cached delegates for drag and drop operations to prevent constant memory allocation
– The InputManager is now capable of pushing and popping listener/controller pairs without having to have the code itself be bookend structured with push1->push2->pop2->pop1 … we can now support push1->push2->pop1->pop2 to allow for a more natural flow to writing the code in some situations.
– Fixed spike trap creating spikes in the wrong location
– Fixed avatars not playing animations on the character select screen
– Addded create frame to actor
– Fixed Actor.CalculateVisibility() from bailing out early on the first frame an actor is created since the component visibility hasn’t had a chance to be considered yet
– Fixed pooled actors having an invalid modifier collection when they were returned to the pool
– ModifierCollection is now cleared from actor upon destroy
– ModifierCollection is now allocated from a heap object pool in the CombatManager and re-used for all actors
– Fixed pooled actors immediatly destroying themselves upon re-use if the last animation they played was a “die” animation, which is actually pretty common. Actors are no longer destroyed when a “Die” aniamtion is ended, only when it is completed. A pooled actor that last played die, and then plays idle, “ends” the die animation … which shouldn’t be a trigger to fade out and destroy.
– Centralized the logic of an actor being revealed into Actor.RevealHidden( revealer )
– Exposed ActionManager.TryAddActor() so that external systems can add new actors into the current turn of actors executing actions, the mimic makes use of this when it is spawned
– Detect hidden now occurs after the actor action has been started, now movement and detection in the same frame occurs with the new location instead of the old, which is a more expected result from a player standpoint
– Fixed the stolen loot dropped by a Thiefling having a scale of zero (and therefore being invisible) if you killed the Thiefling via the Banish spell, the banish logic now restores the actor scale to 1.0 before killing/destroying them which also restores scale on any contained child game objects / items.
– Added support to ignore low health animations via the SpineController
– Added 3 new AudioSpecialX animation events
– Fixed a bug when dropping stolen loot that could make the loot not drop … now Inventory.DropAround() requires a center cell, and if no suitable locations around it are found the center cell itself is used as the drop location
– Removed ActorSetPlan and MarkerSetPlan, all logic is just now in the base class of ArchitectPlan and their identifier enum has been combined all into one
– AI components now save data to archives
– AI now has a set of status bits, the first one allow for suspension of action generation until the AI is damaged (used for detected mimics currently)
– Thiefling now gets a free automatic flee action just after stealing an item so they can start their escape
– Added StealSkill and StealSkillPrototype
– Added more unique sound effects for the steal skill
– Added actor class “Steal Restricted”, currently set on spell runes and quest objects
– Tower Theme now has a reference to “Shared Enemies” since it’s necessary to load the EnemiesKilledCount property due to the Enemy param
– You can now bash enemies again if you have no weapon equipped
– Bash now does only 10% of the damage it used to
– Added “Stolen Goods” inventory
– Actor.InventoryCollection is no longer set via the inspector and is taken care of by code
– Added actor status for “PickupAnimating”, you can’t pickup an item that is being picked up
– Refactored the UsePickup component to eliminate the use of m_pickedUp, the double pickup restrictions are now done using the fact that the item cannot be in an inventory (unless InventoryPrototype flag says that’s ok) and the new Actor status “Pickup Animating”, this allows items that have been previously picked up return to the world where they can be picked up again, as is the case with the Thiefling stealing of items
– Refactored the API for allowing actors to do actions even when they’re inactive
– Added convenience functions to Actor to get an inventory (and sometimes add it if not found)
– When you do any damage to something wtih “OneHealth” set in the combat module, the game now makes sure that you do at least one point of damage since that flag is intended to make things like destructibles super brittle so they can be broken with any attack, no matter how weak it was
– Added AI support to “flee with stolen goods”
– Exposed a few functions in item to size and scale the actor for world/inventory/generic
– Cleaned up the ThoughtBubble creation API using a settings structure
– New art for the thought bubble canvas
– Thought bubbles are now positioned better over the thinkers heads
– Thought bubble contents are now presented using the item inventory rotation settings cause it looks cooler on a diagonal, they are also sized to make sure they fit in the thought bubble which is important for large weapons like the lance
– Sprite offset is now stored on awake and can be altered during the runtime, the original offset is restored when the sprite returns to any pool
– Added support for more audio event types and instances in Spine animations
– Added support for actors to drop any stolen goods on the ground around them when they die
– New Creature: Thiefling … these rat like hunchbacks can whip you with their tail or steal an item from your inventory and quickly flee with it.
– Added set of scurry sounding footsteps
– Added Theifling actor, audio, and spine assets
– Added Wardrobe support for “Hand Left” and “Hand Right” missile points
– Banish is now 10% more likely to work on the same target for each previously failed banish attempt on that target
– Added audio for blob including attack, death, footstep, and head pop during on hit
– All enemies and human avatars now trigger footsteps via events setup in the animation so the audio tightly matches the visuals
– New golem footstep sound, the audio has been time stretched to half as long
– Turned up the volume on default stone footsteps used by the player
– Dryad now uses dirt footstep sounds
– Blobs now replciate using pooled actor objects
– TileBounds is now an ArchiveComponent
– TileBounds.Flags is now BoundsFlags to avoid collision between new base class ArchiveComponent.Flags member, manually cleaned all .prefab files of the Flags filed for TileBounds before this change was made
– Simplified Actor wardrobe api
– The following clasess now implment OnReturnedToPool(): Locomotor, TileBounds, Combat, CombatFollower, Agent, AI, SpineController
– TileBounds now implements dynamic changes in blocking via m_status flags
– Combat now implments dynamic invulnerability changes via m_status flags
– Removed un-necessary CombatCPU class
– Fixed the one frame of wrong animation for real by clearing _animationName before base class kicks in and tries to Reset using the animation name stored inside it
– Replciated blobs are now 15% smaller in size than the blob that they spawned from
– Added support for scaling per generation for the replicate skill using the Generation and SourceSkill property which are examined via OnReady()
– Broke out scaling from Agent when updating the combat quality into a separate function applyRuntimeScale() the is used by OnReady() as well as any changes in agent quality (champions)
– Fixed spine objects having one frame of wrong animation upon instantiation if later in that same frame they were directed to play a different animation … there is an old field _animationName that is serializable and casuing the issue, so I’ve nulled it for the player and Esoteric is going to refactor their code sometime in the future.
– Added parameter to factory function for creating an animation track entry for ease of debug troubleshooting
– Unified the conditional skill system used by champions with any special chance skill/powers previously set in the combat module
– Moved all conditinal skill logic from the Combat to AI classes
– Moved all code in BasicAI to base class AI
– AI now merges all conditinal skill prefabs into a private list on startup, conditional skills are gathered from the AI class data itself as well as any conditinal skills specified via a CombatQuality on the owning actor (champions)
– Added property “generation” used when replicating
– Renamed SummSourceSkill property to be just SourceSkill
– ActorSpec now has a couple of new fields to set generation and source skill early in the actor creation code path
– Unified a bunch of code during a summon to create actor specs with proper settings for all summon style skills
– Added Replicate skill and prototype
– Added property for previous health value and an accessor for previous health ratio in Actor
– ConditionalSkill now has 4 triggers, above/below health ratio, on attack, and on damaged
– Cleaned up Combat.ChangeHealth() to use a set of bit flags which is more useful than requiring a DamagePayload parameter in some instances
– Added support for all summon style skills to set quality, rank, initial properties, source skill, and generation
– Added audio for blob including attack, death, footstep, and head pop during on hit
– New golem footstep sound, the audio has been time stretched to half as long
– All enemies and human avatars now trigger footsteps via events setup in the animation so the audio tightly matches the visuals
– Turned up the volume on default stone footsteps used by the player
– Dryad now uses dirt footstep sounds
– Added “Footstep” event to all .spine files and triggered the event during walk animations
– SpineController now has a list of audio events to trigger via aniamtion events
– Added animation event support for footstep, and aux sounds during Attack and Hit animations
– Fixed destructibles defending against damage
– Fixed chakram not targeting destructibles when used by NPC AI’s
– Summon skills now validate that no summon limits have been reached during a CanTarget() query, this way the player or AI will not waste a turn trying to do a summon that it could not really do
– Fixed human female item right animation pop after playing attack_02, for some reason there were two “Item Right” bones in the dopesheet … will send the messed up file to Esoteric Software for fixing.
– Unified the animation names across all enemies for Magic_01, and Magic_Loop_01_* within all the .spine animation files
– Exported all enemies that had changes to their atlas or json
– Added time scales to the magic animations for a few enemies as well as a couple missing contact frame markers
– Added “Summon Champion Minion Skill” with audio and cast/summon effects
– Added property “Orphan On Container Destroy”, which is set for summoned actors that can exist even when the actor that summoned them is killed or destroyed
– Added property “Summoned By Source Skill” which is set to the skill prototype that summons any actor
– Combat qualities 4+ now have three conditional skills to summon minions at certain health thresholds
– BasicAI is now capable of instancing conditional skills whenever the appropriate triggering conditions arise
– BasicAI can now queue an “important” skill … when an important skill is queued, it takes priority over any other melee, ranged, or out of range skills. An important skill that is “out of range” also takes precedence over any normal priority skills that are in range and the actor will attempt to move into range if there is a suitable target
– Added simple conditional skill component and created 3 prefabs to summon champion minions at 80, 50, and 20% health triggers
– Summoned actors that can no longer exist when their parent is killed/destroyed are killed/destroyed at the same time their parent is
– Added a form of Actor.GetHealthRatio() that uses a health value passed in
– ActionSkill now notificies the BasicAI when the skill is started, the AI uses this opportunity to remove any queued important skill since that skill is now executing
– Summoned actors no longer grant experience when they are killed
– Cleaned up the API for getting what to summon via SummonSkill.getToSummonPrefab()
– Summon prototype now have the ability to summon the prefab of the user of the skill (champion enemies summoning minions of themselves)
– Added support to have a concurrent limit of summoned actors from a single skill
– Added support for summon skills to summon more than one actor
– Modified SkillDecisions to support multiple priority skills, comparing skills also now takes into the overall priority to figure out whether a skill option is the same, better, or worse option to choose
– Fixed a bug where in world actors would be parented to the scene root when they were removed from an inventory, the unparenting is now only done for actors that are contained within inventories that are “on person”
– CombatQuality now has a list of conditional skills that can be implemented