FFX 3.3.1.0 CHANGELOG
PYs
m25enc.py
- Fixed bug in Villain stops at X health actions (they weren't returning encounters properly)
- added EncCheckEndEvent() function to allow end checks from an in-game event
mlogreader.py
- MLOG_WatchDamage(): Replaced the try... except for invalid targets by Object_Exists()
INSTALLER
- new in FFX3.3, for XP and theorically Vista, the installer adds a shortcut to the "Custom" folder under the hidden user profile
FFX 3.3.0.3 CHANGELOG
PYs
datfiles.py
- Added verbose= parameter to Campaign_MakeHeroIndex()
MANUAL
- updated Shield Swap entry
FFX 3.3.0.2 CHANGELOG
PYs
ffx.py
- Changed the version number, which was incorrect in FFX 3.3.0.0 (said 3.3.0.1) and was left unchanged in 3.3.0.1 (which was theorically right by then but didn't differentiate for bug reports.)
MANUAL
- Corrected a minor error in attr_table.htm
- updated ffx3_3details.htm
OTHER ADDITIONS
- Updated this file for FFX 3.3 (ffx_install_readme.txt)
FFX 3.3.0.1 CHANGELOG
PYs
datfiles.py
- Removed datfiles. prefix in print "Defence '%s' duration: %s" % ( d[0], PT_RANGE_NAMES[d[1]] ) line in ShowAllActiveDefenceDurations().
ffx.py
- Updated Power Reserve Dummy Power to be triggered on the user and not the target
- Updated Free Spirit to work properly by the AI
- Fixed issued with Absorb Energy and Absorb Material Pass Thru Defence and updated how the FX is handled for these attributes
- Updated Private Army to initialize the army's AI and Team faster so the Leader doesn't attack them immediately after they are spawned.
m25ai.py
- Fixed FF Active Defense Remote AI Tactic
- Updated AIGenericPowerOnTarget() to check for overpower for characters with the 'energy reserve' section in their AI file.
- Added spirit_released subtype for Free Spirit Attribute
m25skirmish.py
- Updated so if a Hypnotized character was hypnotized via the Hypnosis Swap and is the last enemy, the mission will not end.
FFX 3.3 CHANGELOG
PYs
chardata.py
- Added check to Character_HasAttribute() so that it returns None on errors, instead of breaking. I made this change a while ago and forget the exact reason it was needed. I think the issue was crashes when called for odd objects like Black Jack's lure (but possibly some others, too).
cshelper.py
- Added line number to reports for errors in CS playback.
- Fixed bug in moveTo() and turnTo() handling of position tuples as spawn target points. Added error report printing.
- In normalize(), added the FFX lifedrain state to that cured by using a hero point. We really need to add all the FFX malevolent "states" to this (crystal cages, strength and speed reductions (via VULNERABILITY,etc.), and so on) so that it works like it does for the in-game state effects.
- Improved ShowXP()
- Added Object_ResetToTemplateMaterial(). I don't know if anyone else ever sees this, but I often get certain minions spawning with material 11 instead of their FFEdit materials, both in the rumble room and in campaigns. I have no idea why. Anyway, I wrote this to fix that from the console. As per the name, it resets an object (first argument) to its FFEdit template material, or resets all characters if no argument is given. It also works as a callback to regCharacterSpawn().
datfiles.py
- Added some comments
- Fixed a bug where Campaign_RewritePowers() couldn't be used outside the game.
- Fixed a bug where some oddball FX were being missed by Campaign_ReadFX().
- Fixed a namespace bug in Campaign_ChangeActiveDefenceDuration().
- Removed datfiles. prefix from powers = Campaign_ReadPowers(FileName) line in ShowAllActiveDefenceDurations(FileName='') function.
ffx.py
- Moved several Swaps and Functions to ffx2.py (was grapple.py) to make room in ffx.py for future updates.
Moved Life Drain with Mind Control, Possession with Powers, Increase Density, Hypnosis, Sleep, and LimeyLure to Transmute State Swaps;
Moved all functions for Adrenaline Surge, increaseStrength(), increaseStrengthAndInvulnerability(), resistanceThroughPain(), strengthandResistanceThroughPain(), decayInv(), zapStrengthAndtakeDamage(), blank25(), and isAlly() functions.
Also removed several obsolete lines
- Updated densityaltered() to check for the Speed Decreased state because densityaltered() checks for decrease in speed rather than the actual DensityMax state, so characters with both a Speed Decrease and Density Max swap would trigger both if the Speed Decrease swap was used.
- Updated Crystallise Swap to work better when being swapped for Stasis and also updated how the FX is handled.
NOTE: When Stasis is removed, it causes the target to fall down, which can be a nuisance if the target was flying and trying to apply a swap to them. Stasis is the only State that seems to do this and can cause some Swaps to not work as intended. Some Swaps may need to be tested with Stasis to find out which ones work and which ones don't and then update accordingly.
- Added Stasis to Mental Damage (well, it's in the manual!)
- Removed Speed Increase(irresistable!) to Mental Damage
- Updated Mental Damage Swap to only trigger damage once. It was noticed that with a melee Power, damage was triggered twice.
- Removed Speed Increase(irresistable!) to Gravity Increase
- Updated Gravity Increase to work like described in the manual. There was no decrease in speed proportional to the strength loss and the target got up frequently, when they're suppose to be pinned down. Also, made it work nice with Stasis.
- Updated Jinx so character's Bad Luck won't work while they're Exiled. Jinx should not work across Dimensions!;)
- Added checks to initquicklearner(), initslowlearner(), initpopular(), and initfamous() to prevent it being run for the same character more than once due to FFX respawns, etc.
- getByTemplate(): Added a break after finding a match to prevent looping needlessly through the rest of the lists. Note that if there is more than one entry for a character, the first entry will now be used instead of the last one. If the customization is different between the two, this would be perceived as a bug.
- A couple changes in updateFFX() to the clone commands code for a little finer control. I may update this again as I would really prefer that these commands be available to all minions (e.g. for SUMMONER etc.).
- Change to initCarriers() so that carriers are not initiated for powers the character hasn't bought yet.
- Made many changes to the shield swaps to allow more than one shield type per character.
- Made makegravityreverse() proportional to target mass to better simulate real gravity.
- In updatesuperhealer(), reset maxEP to the nominal 100 so that it doesn't get nerfed for character with ENERGY TANKS, etc. that raise the maxEP.
- Added mlogreader.MLOG_ResetKnockBack() to acroLandAmateur2().
- Added an Object_Exists() test to updateenergytanks() to avoid an occasional error.
- Changed gainAgility() to have the right upper limits for characters with the scripted NIMBLE attributes.
- Changed initnimble() again with a better approach for dealing with map switches in freeroam campaigns.
- Ditto for initslowmoving() and initffqresilient().
- Added Group Flight for TK, Earth Control, Magnetic, and Weather Control
- Added totalMass to TK, Earth Control, and Magnetic to prevent them from having to many objects lifted at once that exceeds the maxMass
- Updated MetaStrength and MetaSpeed to check for FF Active Defense
- Updated MetaSpeed to check for TK Group Flight
- Increased duration of FireWall
- Updated Ice Patch to not work against Phased characters (new Phasing Attribute)
- Added Summon Rain for Weather Control
- Updated GetWeatherPosition() to drastically improve targeting enemies with Hail and Lightning, ecspecially for the AI. Also, the lower the Weather Controller's EnergyPoints, the less accurate the Lightning and Hail will be.
- Updated independentCheck() for Summoner, so that when the Summoner is hypnotized, the summoned characters get placed on the correct team
- Updated Private Army to include six templates
- Updated Group Teleport tpTrack() to check if the Teleporter is Flailing or Flying
- Added a check Object_IsAlive to updateCoord()
- Added a check Object_isAlive on the existing target in IllusionA()
- Corrected mis-type for MP_DENSITYINCREASE=13
- Updated how commands are added with Absorb Materials, Absorb Energy and Absorb Powers. Also updated how the pass thru active defenses are used for some material/energy forms.
- Made significant updates to Absorb Powers including:
To not work against characters that are already phased (using the Phasing attribute).
To use the Phasing Attribute to Absorb Phasing Powers rather than the 'phaser' subtype.
To gain the ability to Summon Rain if absorbing powers from a Weather Controller.
Added 'flame_breath' and 'darkforce' subtypes to use for characters with theses Powers so Power Absorber can gain these kinds of Powers.
To revert back to the original Form (if they switched to an alternate form when initially stealing the powers) when stealing powers duration has ended.
- Updated Amplifier to use 'ranged' animation when triggering the Amplification (maybe future update will include customized Animation or Dummy Power)
slightly increased success rate of Amplify.
corrected code when Amplifying Material Absorbers.
- Updated how Volatile Storage FX is handled
- Updated twisterCheck() RegTimer line to run after the check for the character being Alive
- Made significant updates to Energy Redirector and Kinetic Absorber, mostly under the hood, increased accuracy of catching absorbed energy
- Made significant updates to FF Active Defense (see manual)
- Made significant updates to Battle Computer (see manual)
- Corrected Energy Cost of Boosting Endurance in Power Reserve
- Update Genetic Symbiote
- Added Phasing Attribute
- Attribute: Dizzy: You have a poor sense of balance. Whenever you take damage or use energy, you risk falling over.
- Attribute: Alternate Current
- Attribute: Jinx Enemies (not ffq, too much a ripoff): minor variant of existing attribute.
- Attribute: Gestalt/Amalgam
- Added SEAT FILLER attribute (per http://freedomreborn.net/simple/index.php?topic=45618)
- Added VELCRO FEET (per http://freedomreborn.net/simple/index.php?topic=45190)
ffx2.py (formerly grapple.py in FFX 3.2.2)
- Made significant updates to Grapple/Tangle Swaps, mostly under the hood.
- Updated grapple swaps to use recover_from_stun animations when target is recovering from a mental or mystical grapple swing_pole is still the default animation for recovering from physical grapples
- Slightly improved success rate of grapple swaps for characters with higher strength than their target.
- Improved unlocking of grappler and grappled to prevent them from staying locked in place after grapple is over.
- Added check to all energise to energysurge ranged grapple and tangle swaps to remove state from a character that was not the original target
- Updated LimeyluretoTransmute swap to not include teammates in the transmute
- Updated FX for DensityIncrease Swap
- Updated Hypnosis Swap for use as an "area" swap
- Added Ranged Grapple Custom Damage Swap
ffxdefault.py
- Added update to Private Army to have 6 templates
- Added functions for Kinetic Absorber to appear in FFXCC
generalutils.py
m25ai.py
- The AI now uses a paramenter in m25config (M25_AI_DELAY) to set the global AI delay. A delay value can be set for each ai individually inside of the AI definition with the 'delay' keyword.
- Added studying_target subtype for Battle Computer
- Added electronical subtype for Phasing
- Added phased subtype for Phasing
- Added tkflier subtype for TK Group Flight
- Updated AISupport_DoSelfPowerTimed() and AISupport_DoPower() to print the name of the power from the hero file
- Corrected desc in AISupport_DoSelfPowerTimed line in AIGenericActiveDefense()
- Corrected desc in AISupport_DoMove line in AIGenericFleeOpt()
- Updated FF Active Defense tactics
- Added TDeflectMissiles tactic for FF Active Defense
- Added TStudyTarget tactic for Battle Computer
- Added TMegaBlast tactic for MegaBlast Attribute
- Added TTKGroupFlight and TKGroupLand tactics for TK Group Flight
- Added TAddAllies and TAddFoes, and TRemoveAllies and TRemoveFoes tactics for Group Teleporter
- Added TPhaseIn, TPhaseOut, and PhaseDisrupt tactics for Phasing Attribute
- Updated desc= for several FFX tactics to show correct description when printing to the script.log
- Updated Target_Filter() to check if target has no ff active defense because the AI is temporarily disabled during some instances of it's use. Also added a check for Sleep and Knockout Gas Swaps.
- Updated Target_IsValid() to check if target has no ff active defense because the AI is temporarily disabled during some instances of it's use.
- Fixed ThrowCancel lines in ThrowMoveToTarget() to use target instead of obj
- Added delay to startup of AI to prevent tactics from being used before the Attributes were initialised when using a low Auto Timer Delay.
m25aiopt.py
- The AI optimizer has been corrected to prevent the overriding of subtype, pct and situation parameters in certain cases.
- Updated Opt_CalcAutoSubtype() to not add a blank subtype
- Removed 'lowerenergy 33' from datfiles.PT_SPECIAL_ENERGIZE : [], line in opt_targetsubtypespecial
m25custompowers.py
- added 'panic' to datfiles.PT_DAMAGE_PANIC : line in damagetypestring{} so panic swaps can be used by the AI.
- added 'energysurge' to datfiles.PT_SPECIAL_ENERGIZE_AREA : line in damagetypestring{} so energysurge swaps can be used by the AI.
m25distance.py
- Updated DISTANCE_AREA_OVERPOWER = 300
m25aigeneratedata.py and m25generateai.py
- Updated to add TAnimateDead tactic
missionobjvar.py
- Fixed a bug when non-existant objects are passed to Object_GetVar(). Thanks to Épiméthée for finding it.
mlogreader.py
- Some changes to the new dodge detection in mlogreader.py. I just looked at this today, so more testing may be needed.
- Added ai_dodging as a global object attrib so that MLOG_IsDodging() won't break if called on an unregistered character.
- Removed the duplicate Global_RegisterAttr()s (which may have been added in v. 1.0 alpha 9 m25 branch 1)
- Moved regDodgeStart() and regDodgeStop() below the KB reset function to keep the KB sink stuff together.
- Defined DODGE_START_EVENT and DODGE_STOP_EVENT in the event sink types.
- Changed regDodgeStart() and regDodgeStop() to refer to DODGE_START_EVENT and DODGE_STOP_EVENT, respectively, instead of to the IDLE analogs. Did this work before?
- Ditto for MLOG_WatchDodge().
- Fixed event damage registration handling; it should now work correctly for state changes.
progrutils.py
- normalized all line endings to CR/LF.
readsavedattribs.py
- Added some diagnostic tools for looking at the normal and FFX attributes as well as the long variables n a saved game. This can be useful for determining when some code is going berserk and creating gobs of attributes that can slow the game down.
readsavedevents.py
- Added the EVENT_AI_PATROL event to those read.
- Added a couple more display tools for examining read events.
- (BTW, I don't know if anyone else uses this module, but I find it very useful for determining when code is registering events unnecessarily.)
sk.py
- Added code to check if a SpawnEnemy()-spawned character has FFEdit mass (as a few don't) and add the default if they don't so that massless characters don't cause trouble elsewhere.
- Fixed load message in Setup().
- Added small delay to the win_cs so that bubbles don't disappear the instant the match ends, preventing the player from seeing what damage, effect, etc. ended the match.
- Side note: we need to add the DG_WON string to strings.txt, as I think it is currently missing.
- added actual mod path to initialization print message.
sysutils
- added readFileInZip() to read a file inside a .ff or .zip file.
EZ Script Updates
- Added support for story and exit encounter types. These are plug-ins that must be downloaded seperately. (the update modifies ezscript to allow them to work).
- Fixed invulnerability custom options.
- Fixed: switches not following the standard creation process.
- Could not fix: switches will not dissappear from the game. They can be destroyed, but their graphic will persist.
- Fixed win, lose, end conditions so that they can be in any case and can be used in condition Next: statements
- Fixed bug in EncCustom_allies_fight_villains (custom end function not submitted properly)
- Bug in PlayCutscene function causing infinite recursion (fixed)
- Corrected bug in cutscene player - new cutscenes were overriding the return function on just completed cutscenes
DAT Files
attributes.dat
powers.dat
- Updated duration for active defences for Absorb Materials, Absorb Energy, and FF Active Defense
- Added ffx_energy_block and ffx_physical_defense for use with remote active defense swaps.
res.dat
- Added effects for various Grapple/Tangle Swaps
Please refer to the ffx_install_readme.txt in your FFX3 folder for previous changes.