News:

Welcome to the new Sinister Design forums!

Main Menu

A new engine!

Started by CraigStern, June 05, 2016, 05:39:11 PM

Previous topic - Next topic

CraigStern

-- the sound manager now has 12 distinct one-shot sound effect channels.

-- added 4 looping sound effect channels to the sound manager.

-- the sound manager now auto-assigns each one-shot sound effect and loop to the first unused channel of its type, allowing different sound effects and loops to overlap each other.

-- new script action: PlayLoop. Plays a sound effect on a loop. One parameter: the name of the sound effect to loop.

-- the sound manager now tracks which sounds are being played in which channels, allowing them to be looked up by name and affected during playback.

-- new script actions: StopMusic, StopLoop, and StopSound.

StopMusic simply stops the current music; no parameters needed.

StopLoop and StopSound each take one parameter: the name of the sound effect to stop. (If left blank, all looping/one-shot sound effects will stop playing when the respective action is called.)

-- added a tutorial about ranged attacks to the Overgrown Garden battle.

-- added a bowman to the Overgrown Garden battle, demonstrating how ranged attacks work to reinforce the tutorial (and also making the fight a little more interesting in the process).

-- moved the "scouting out enemies" tutorial to the Grabber's Grove fight, where it's more relevant.

-- changed the sorting of battle UI elements so that text overlays no longer cover over dialogue, character, reserve supplies, or level-up screens.

-- made further progress on the proper positioning of skill visual effects.

CraigStern

#556
-- the game's sound manager now supports distinct global volume settings for music, sound effects, and dialogue.

-- new script action: PlayDialogue. This is exactly the same as PlaySound, except that it marks the sound effect as voice-over dialogue. The game will use the global volume setting for dialogue instead of the global volume setting for sound effects.

-- it is now possible to alter the volume of individual music and sound effects in the game programmatically; these volume changes occur relative to the associated global volume level.

-- three new script actions: SetMusicVolume, SetLoopVolume, and SetSoundVolume.

SetMusicVolume has one parameter: a float value (i.e. a decimal) between 0 and 1. Setting it to one 1 makes the current music track play at 100% of the global music volume level; setting it to 0 makes it play at 0% of the global music volume level; setting it to 0.5 makes the music play at 50% of the global level; and so on.

SetLoopVolume and SetSoundVolume behave the same way, but have two parameters: (1) the name of the sound effect to alter the volume of (as in the "Stop" actions) and (2) the volume level (as above).

-- the sound manager now supports tracks fading between volume levels over time.

-- three new script actions: FadeMusic, FadeLoop, and FadeSound.

FadeMusic has two parameters: (1) a float value (i.e. a decimal) between 0 and 1 representing the target volume to fade to, and (2) a float value representing the rate at which the music fades toward the target volume. (A rate of 1.0 is fairly slow.)

FadeLoop and FadeSound are the same, but start with an optional sound name parameter. As with the other actions, if this parameter is left blank, the game will fade all currently playing loops / one-shots toward the target volume at the specified rate.

-- the main campaign now fades out the music from camp as the calendar scene plays leading into the next day.

-- added a second music channel as a necessary precondition to support cross-fading music tracks in the future.

-- added a new "biographical details" reference to characters. Once fully implemented, this will allow me to have the game generate dialogue for them exploring various aspects of their past on the fly.

-- fixed: generated characters newly recruited via the Recruitment interface wouldn't appear in the Army Overview (or become usable in general) until after you switched scenes.

CraigStern

-- created a handful of new passive abilities; added a new "category" attribute to passive abilities to determine how the engine behaves with them.

CraigStern

-- created a handful of new passive abilities; the list of (not actually implemented yet) passive abilities now tops 40.

-- added a new "reqStats" attribute to passive abilities to permit passives that only take effect when the character is at a certain stat threshold (e.g. when below 50% health).

-- new script action: CompatibleUnitsToList. This creates a list containing the names of all characters who are romantically compatible with a specified character. Parameters: (1) list name, (2) character name, (3) army number/roster number (optional), and (4) ignore genes (optional).

If parameter 3 is -1, the game will check all rosters (if in a cut scene) or armies (if in battle); if not, it'll check the specified roster or army. Parameter 4 is false by default, imposing a roughly 50% chance that two characters won't find each other attractive even if they are the same species and meet one another's gender preferences--if set to true, the character will be listed as romantically compatible with every character that matches species and gender preferences.

-- fixed: the delay between queued pop-up messages on the same space would increase with each subsequent message.

-- fixed: the "Grabbed Sack!" pop-up message would appear simultaneously with pop-up messages associated with automatic-type items from within the grabbed sack.

-- fixed: the game was still displaying pop-up messages for status effects that the target was immune to (and therefore did not actually receive).

CraigStern

-- new script action: RecruitByName. Two parameters: (1) Character name or ID[] tag and (2) Roster number. This allows dynamic recruitment of a particular character who does not possess a distinct Load ID (or indeed, possess a Load ID at all) outside the context of the recruitment menu.

Unlike its sibling action Recruit, RecruitByName will not work on characters who are not saved from a prior battle (if used in a cut scene), and it will not work on characters who are neither saved from a prior battle nor present in the current battle (if used in a battle). 99 times out of 100, you're going to want to use this action for in-battle recruitment of generic or procedurally generated units, as Load ID does not serve as a marker of individual identity for such units.

A couple of new script actions to make scripting using lists easier and more robust:

-- new script action: CombineLists. Sets a list to contain copies of all the entries from List 1 and all the entries from List 2, in that order. Three parameters: (1) List 1 name, (2) List 2 name, and (3) destination list name (optional). If the third parameter is blank, List 2's entries will simply be added onto the end of List 1.

-- new script action: CullListByList. Compares two lists: all entries in List 1 that are also found in List 2 will be removed from List 1. Three parameters: (1) List 1 name, (2) List 2 name, and (3) check for absence. The third parameter is a boolean and optional; if set to true, List 1 entries will be removed only if not found in List 2.

-- new supported comparison method for actions (and other things in the game engine) that compare integer values: !=  As you might expect, this stands for "not equal to." As long as the values being compared aren't equal, this comparison method will return true.

-- created documentation for all of the comparison methods supported in the engine.

CraigStern

-- the shop now reds out each item with a price greater than you can currently afford, and grays out each item that you can afford but which no character in your roster has the correct masteries to actually equip. This makes it much easier to narrow down relevant equipment at a glance!


The game is now up to 12 orbs:

-- added the Black Orb and the White Orb to the game, granting +50% shadow resistance and +50% light resistance respectively.

-- added the Azure Orb to the game; it grants a character the Levitate skill, as well as causing Levitate to cost 0 energy for that character.

-- added the Rejuvenation Orb (i.e. the Yellow Orb) to the game; it grants a character +2 to energy regeneration each turn in battle.

-- on a related note, the game supports a new tag: ModFocus. This lets you alter the amount of energy a character regenerates each turn in combat. Takes one parameter: an operation (e.g. +:2).

-- elemental resistance orbs remain equippable on the Off Hand, but all other orbs are now equipped on the Weapon Hand, allowing a psy user character with Orb Mastery to equip two orbs at the same time (but only one elemental resistance orb, per series tradition).

-- added all new orbs to the shop in the main campaign, where they may occasionally appear for sale!


And two more script actions to further increase the ease of using lists:

-- new script action: CullDuplicatesFromList. Removes all entries in the specified list which duplicate an earlier entry in the list. One parameter: list name.

-- new script action: CloneList. Creates an exact copy of an existing list. Two parameters: (1) name of the list to clone, and (2) name of the new list.

CraigStern

-- when clicking on a character's space (but not directly on the character itself) in combat, the game now behaves as if you'd clicked the character.

-- fixed: a graphical glitch in which attack tiles would sometimes overlay the space selector.

-- fixed: certain script actions would produce null errors when run in the editor due to the nonexistence of saved characters in that context.

-- fixed: the undo stack was not getting cleared between player turns, or following Create skills that placed holds onto the battlefield.

-- fixed: a bunch of the input text fields in the character creator were inappropriately set to "Single Line" mode.

-- fixed: if multiple copies of a saved unit were placed onto the battlefield, the game would treat them all as if they were the same unit--even if they belonged to different armies! The game will now only load the saved version of a character for the first copy of such a character that it places onto the battlefield, and rely upon new copies loaded from XML for the rest.

CraigStern

-- created a game settings window with separate selectors to change global music, sound effect, and voice-over dialogue volume.

-- the new game settings window is now directly accessible from the title screen, and via the options window in both cut scenes and battles.

-- the game now saves all global volume settings to a file whenever they are changed, and successfully loads global volume settings whenever the game loads.

-- new script action: GetDistBetweenUnits. Battle only. Set an integer variable equal to the distance (in spaces) between two units, ignoring terrain and obstacles. Parameters: (1) character 1 name or ID[], (2) character 2 name or ID[], and (3) variable name. Parameter 3 is optional; if not used, the variable set will be _Dist.

-- new script action: GetDistToSpace. Battle only. Set an integer variable equal to the distance (in spaces) between a unit and a space, ignoring terrain and obstacles. Parameters: (1) character name or ID[], (2) Y coordinate, (3) X coordinate, and (4) variable name. Parameter 4 is optional; if not used, the variable set will be _Dist.

-- improved the game's behavior concerning multiple load IDs that match a saved character. Unless the spawning unit is spawning for an army matching the last army the saved character appeared in, the game simply will not use the saved version of the character; it'll convert from XML instead, and assign the new copy of that character a new unique ID in the process. (All units assigned to a roster in a cut scene that have not yet appeared in battle have a default "last army" of 0.)

Independent of the above, if the game ever creates a character and it detects another unit with the same unique ID already on the battlefield, it now assigns the new character a different unique ID. (Note: while this will allow the battle to proceed as normal, if the game saves a copy of a character that has been assigned a new unique ID, this will cause other characters to regard them as a stranger going forward. For this reason, it is generally a bad idea to spawn multiple copies of a character that is on a roster, or is otherwise saved as part of the player's army!)

CraigStern

-- created a neat little "expanding ring of sparkles" visual effect for when a character levels up!

-- there is now an animation showing you which character is currently selected during your turn: a little spark running around the circumference of the character's "ring."

-- in the shop interface, when you click on equipment that no one in your roster can use, the game now pops up a warning about it and provides you a chance to cancel the purchase.

-- the shop in the main campaign now prompts you to distribute items and equip equipment before you leave, with an option to immediately open the reserve supplies screen for that purpose.

-- the camp scene in the main campaign now displays the Hold Gathering button grayed-out after an event; if clicked, it explains that there is no longer time to hold one.

-- removed some incorrect information in the documentation for the ShowReserveSupplies action.

-- fixed: the game would remember which units had ended their turn when the previous battle concluded, and in subsequent cut scenes, the reserve supplies screen would prevent those units from interacting with their items (because their "turn ended" marker was still set to true).

-- fixed an off-by-1 math error that was causing the game to incorrectly position the reticles for certain AOE skills (and in the process, made the AI occasionally attack spaces that made no sense).

-- fixed: AOE reticle patterns that extended in whole or in part off the edge of the map were being pushed backward onto the map (and thus, appearing on the wrong spaces) instead of simply truncating the bits extending off the map. This, too, was causing the AI to sometimes target the wrong spaces with attacks.

CraigStern

#564
-- the map editor now supports procedurally generated unique characters, not just generics.

-- the space selector has been added to the map editor, making it way easier to tell what space you're painting or mousing over.

-- began designing the first boss battle of the game.

-- the game engine now supports movement sounds for characters (something I never got around to adding in on Telepath Tactics!)

-- created several movement sounds.

-- generated characters now receive move sounds appropriate to their species and class.

-- went through all premade characters and assigned them appropriate moveSound attributes.

-- two new string stats supported: Load ID and Move Sound. (When setting a new Load ID with SetStat, use a colon in place of a forward slash.)

-- when saving a scene to a file, the game now strips all forbidden characters out of the filename and replaces them with underscores.

-- fixed: after editing the properties of an object, the map editor would always set its army to 2.

CraigStern

Spent some time updating the web site and preparing an ad campaign to try to sell off the remaining stock of True Messiah. With my remaining time available today:

-- implemented two new tags: BackstabFactorPlus and SidestabFactorPlus. These take two parameters (1) the name of the skill that gets this bonus, and (2) a decimal float value. The float value gets added to the backstab/sidestab multiplier attributes for attacks with the specified skill (or, if parameter 1 is left blank, for attacks with every skill).

(Procedurally generated "Gap-seeking" weapons give the character these.)

-- implemented a new tag: DmgIgnoreRes. This takes two parameters (1) the name of the skill that gets this bonus, and (2) a decimal float value. The float value gets multiplied by the target's relevant resistance--this portion of the target's resistance is ignored for attacks with the specified skill (or, if parameter 1 is left blank, for attacks with every skill).

(Procedurally generated "Armor-piercing" weapons give the character this.)

-- implemented a new tag: ModSkillPower, which replaces the old ModDmgForAttack tag. ModSkillPower affects a skill's base damage for the character with the tag. (The tag's effects are calculated after all other base damage factors, but before anything relating to the skill's target--distance, elevation, the relevant resistance, etc.) Like ModSkillCost and ModSkillRange, ModSkillPower takes the skill name and the operation to perform on its base damage (e.g. +:1) as parameters.

-- implemented new tags: ModDmgVsClass, ModDmgVsMoveType, ModDmgVsSpecies, ModDmgVsTag, and ModPowerVsWeapon. Unlike the old ModDmgFor tags that they replace, these can operate on particular skills used by the character with the tag. Parameters are: (1) skill name (leaving this blank will apply the effect on all unit skills), (2) the particular class/gender/move type/species/tag/weapon type that triggers the operation, and (3) the operation. And unlike the ModSkillPower tag type, these affect final damage, after all other factors have been accounted for (including resistances).

For instance--for whatever character has this tag, no matter what skill they use, the game doubles the damage it does to units who are equipped with a weapon with a name containing the substring "Axe":

ModPowerVsWeapon,,Axe,*:2

For the character with this tag, the game adds 99 to the damage done by the skill Death Gaze to units with the tag Vulnerable to Gaze:

ModPowerVsTag,Death Gaze,Vulnerable to Gaze,+:99

And so on.

-- added two new weapon modifiers to the item generator: "Anti-mount" (deals +6 damage to cavaliers) and "Flashy" (increases AI target value by 15%).

CraigStern

-- created new attributes for procedurally generated armor: Padded (+20 Crush Res.), (Insulated +15 Heat and Cold Res.), Lead-lined (+15 Shadow and Light Res.), Gleaming (+7 Dodge), and Gaudy (wearer is 20% more heavily weighted as a target by the AI).

-- when dealing with generic units who don't have weapons equipped, the game now checks for the corresponding weapon skill for purposes of ModPowerVsWeapon. (For instance: Bloodbeard's Bandits don't generally have axes equipped, but they do know the Axe skill naturally. This change means that ModPowerVsWeapon,,Axe,+:5 will still result in +5 damage to them.)

-- fixed: the game wasn't assigning a base class to procedurally generated characters.

-- fixed: the game was calculating distance past minimum for player-initiated ranged attacks incorrectly.

-- fixed: the game wasn't turning off the "selected" animation for characters who were simply deselected.

CraigStern

-- created a new battle immediately preceding the league 1 qualifier, "Battle on Sandy Isles," introducing flying enemies and golems.

-- new script action: SetNextScene. Changes the scene's nextbattle attribute to a different scene, but does not immediately transition to that scene. One parameter: scene name.

-- created a scene in the main campaign that schedules league qualifier matches for particular days.

CraigStern

-- wrote dialogue for the League 1 Qualifier battle, including an optional recruitment conversation.

-- new special characters: -TIC2- and -LAUGH2-. These get replaced with the tic and laugh lines for the second character in the conversation.

-- the second parameter of SetString now supports the use of ID[] characters.

-- the "generate unit inventory" field in the map editor's generate unit window has been changed to a check box (which is decidedly easier to interact with than typing out "true" or "false" every time).

-- fixed: the game would fail to add custom tags and triggers to unique procedurally generated characters.

-- fixed: you could force the game to use an unsupported species for procedurally generated instances of the spirit, spriggat, and golem classes, which would ultimately produce a null error.

-- fixed: the dialogue menu would only successfully reference saved characters when processing text in battle (as opposed to any unit on the battlefield).

-- fixed: the game would throw a null error if you tried to use AddStatus on a character that didn't exist, or SetStat in a cut scene before any characters existed among the saved units yet.

CraigStern

-- the game now plays the Telepath victory fanfare when the victory box appears at the end of a successful battle.

-- the parameters for Generate: and Unique: spawns in battle now support special characters (most significantly, the PICK{}, -STR:-, -VAL:-, and LIST{} special characters).

-- tuned the game's default AI to make enemies less likely to retreat in lieu of making a sub-optimal short-term move.

-- fixed: a custom variable in the main campaign wasn't being set properly.

-- fixed: AI-controlled units that were Stunned or Frozen were being removed from the AI's internal list of its own army entirely.

-- fixed: the level-up handler class was inappropriately saving stat increases from prior character level-ups and applying them again with subsequent level-ups.

-- fixed a typo in certain camp activity narrations.

-- fixed: the recruitment interface was producing large relative level variations for recruits at low levels. It now permits a variation of 1 level per 4 base levels it generates with, but no variation for units generated at level 3 or less.

-- fixed: the game was not properly saving the Death Rules condition during mid-battle saves.