Superfighters Deluxe 1.3.7c is out!

Added 1 Jan 2021
Happy New Year!
* Fixed some rare crashes.
* Map editor: When adding a player via Test Options (F6) the game now simulates a drop-in, meaning you can access the resulting GameUser via scripts.
* Map editor: Player interface/HUD is now only shown for user 1, user 2 and the user you are currently controlling, reducing clutter while testing map/script with many test users.

Superfighters Deluxe 1.3.7 is out!

Added 6 Sep 2020
* Tweaked the block animations so it's more obvious that the wind-up frames are not actual block frames.
* Bots now aim towards the head if the head is the only exposed part behind a cover.
* The tutorial now uses texts from the language XML file so it can be translated using the language tool.
* Fixed a crash related to Streetsweepers.
* Fixed a crash related bots taking cover while being shot at.
* Added Game.ForceStartSuddenDeath(..) to be able to start sudden death based on custom conditions from scripts.
* Added IObject.GetTargetAIEnabled(), IObject.SetTargetAIEnabled(..), IObject.GetTargetAIData(), IObject.SetTargetAIData(..), Game.GetTargetAIEnabledObjects() to be able to set up additional targets for bots other than players and Streetsweepers. Use the TargetAIData to define a max distance, team, priority and attack mode for the bots towards the additional target. Players and Streetsweepers are enabled by default.
* Added IPlayer.SetForcedBotTarget(..), IPlayer.GetForcedBotTarget(), IPlayer.GetBotTarget() to be able to read or override a bot's current target.
* Updated some documentation related to scripting.


Superfighters Deluxe 1.3.6b is out!

Added 6 Jul 2020
* Streetsweepers have been tuned down to feel like a less impossible threat to deal with:
- Life reduced from 60 to 45.
- Time between bursts increased from 3.0 to 3.5 seconds.
- Each projectile that hits a Streetsweeper now does a minimum of 6 damage, making guns like uzi and shotgun more useful.
- Magnum and Sniper bullets can now one-shot Streetsweepers.
- With a Strength Boost active, your melee damage towards Streetsweepers is doubled (except for the Chainsaw).
- Heavy metal melee weapons (Fire Axe, Hammer, Pipe Wrench and Lead Pipe) now deal bonus damage towards Streetsweepers.
- The disable time from electrocuting a Streetsweeper using the Shock Batons increased from 2.5 to 4.0 seconds. This now also resets the target the Streetsweeper is chasing, making for a better escape tool.
- The time you need to stay out-of-sight before Streetsweepers can target other opponents reduced from 2.0 to 1.7 seconds.
* Removed the magnum from the "Streetsweeper Sweep-up" challenge.
* Pressing the "sheathe weapon" button will now cancel queued weapon equipping (noticeable for throwables and automatic weapons in some situations).
* Fixed a bug where rolling could get unintentionally delayed if you kept alternating between standing/crouching after a melee weapon breaks during a melee attack.
* Fixed a bug where you would be unable to perform certain melee actions immediately after dropping a weapon in some situations.
* Fixed a bug where you couldn't kick immediately after sheathing a gun in some situations.
* ScriptAPI: Fixed a bug where IPlayer.SetUser() would not properly update the player's team in the scoreboard and HUD.

Superfighters Deluxe 1.3.6 is out!

Added 26 Apr 2020
* Fixed a bug preventing the player from attacking, blocking or grabbing after blocking and catching an unequippable item (pills, slo-mo, strength boost, etc.)
* Added IPlayer.IsHoldingActiveThrowable, IPlayer.GetActiveThrowableWeaponItem(), IPlayer.SetActiveThrowableTimer(..), IPlayer.DisarmActiveThrowable(..) to be able to read and disarm current active throwables on a player.
* Updated IPlayer.Disarm(..). It will now disarm any active throwables first. Also included an optional parameter 'out IObject disarmedActiveThrowable' to be able to read the disarmed active throwable (if any). This returns the same object as calling IPlayer.DisarmActiveThrowable() first. This is done to keep backwards compatibility with existing code.
* Added IObjectGrenadeThrown.GetExplosionTimer(), IObjectGrenadeThrown.SetExplosionTimer() to be able to change the explosion timer on thrown grenades (and "reactivate" duds by calling SetExplosionTimer after the first timer runs out).
* Added IPlayer.GetCorpseHealth(), SetCorpseHealth(float value), GetCorpseMaxHealth() to be able to update the durability of a dead player's corpse.
* Added IObjectWeaponItem.GetCurrentAmmo(), IObjectWeaponItem.GetMaxAmmo() to be able to read ammo from current item.
* Added IObjectWeaponItem.RifleWeapon|HandgunWeapon|RangedWeapon|ThrownWeapon|PowerupItem|InstantPickupWeaponItem which returns the item information struct about the specified item.
* Added MeleeWeaponItem.CurrentValue, CurrentValue.MaxValue to read durability (0-100).
* Updated ProjectileHitCallback to handle deflections by:
- Adding ProjectileHitArgs.IsDeflection, ProjectileHitArgs.DeflectionNormal to be able to read if a projectile hit is a deflection.
- Updating ProjectileHitArgs.RemoveFlag so it's now false during deflections.
- Updating ProjectileHitCallback so it's now fired when projectiles are blocked or deflected by players and deflected on ProjectileDeflectZone.
* Added IProjectile.PowerupTotalBounces to read projectile's maximum total bounces that can be performed. IProjectile.BounceCount can now be written to to change current amount of bounces.
* Players deflecting a bullet now counts towards the bullet's total bounce count as if it bounced on a wall.
* Moved IPlayer.DealDamage() to base IObject.DealDamage() and added bool IObject.Destructable readonly property to be able to deal damage to objects in a more convenient way.
* Added IPlayer.CurrentPrimaryRangedWeapon and IPlayer.CurrentSecondaryRangedWeapon. Both return a RangedWeaponItem struct containing the same properties as RifleWeaponItem and HandgunWeaponItem.
* Added LazerEquipped property to RangedWeaponItem, RifleWeaponItem and HandgunWeaponItem to be able to read if a ranged weapon has a lazer upgrade attached.
* Removed IGame.WriteToConsole(string text) in favor of the new IGame.WriteToConsole(object param[] args) to avoid ambiguous calls between the two.
* IGame.WriteToConsole now prints <null> for null values.
* IGame.WriteToConsoleF no longer crashes if you input an invalid format, instead a default format will be generated and used.
* Fixed a bug where SupplyCrates created in the editor or ScriptAPI would show the wrong category icon for lazer, bouncing fire and explosive fire powerups.
* Fixed Events.PlayerWeaponRemovedActionCallback not running correctly when a player gets gibbed or removed in certain situations.
* Fixed a bug where projectiles created inside ProjectileCreatedCallbackEvent wouldn't work properly.
* Fixed a bug causing IGame.GetColorPackage() to always return null.
* Fixed a bug that showed the wrong exception when a stacktrace from map scripts couldn't be parsed correctly.
* Fixed a bug with IObjectPlayerSpawnTrigger.SetSpawnWeaponItem*(..) causing exceptions when calling Trigger().

Superfighters Deluxe 1.3.5 is out!

Added 23 Mar 2020
* Updated Game.GetObjectsByArea(...) to include a second parameter (PhysicsLayer.Active | PhysicsLayer.Background | PhysicsLayer.All) to be able to get objects from the background Box2D world (where FarBg objects and PathNode objects are).
* Added IObject.GetPhysicsLayer() to be able to read if an object is in the Background or Active Physics layer.
* Added CollisionFilter.AbsorbProjectile and RayCastInput.AbsorbProjectile to be able to filter if projectiles are absorbed on hit or not.
* Added float IObjectWeaponItem.DespawnTime, void IObjectWeaponItem.SetDespawnTime(int despawnTimeMs), bool IObjectWeaponItem.Despawning, IObjectWeaponItem.BreakOnDrop, IObjectWeaponItem.SetBreakOnDrop(bool value) to be able to control how items are despawned (with a few exceptions, see the ScriptAPI documentation for details).
* Added IPlayer.InThrowingMode to be able to see if the player has toggled to throwing mode.
* Added IObjectTimerTrigger.ResetTrigger(), IObjectTimerTrigger.StopTimer(), IObjectTimerTrigger.StartTimer(), IObjectTimerTrigger.IsTimerRunning to be able to stop/start/reset timers through code.
* Added IObjectAlternatingTrigger.ResetTrigger() which restarts the trigger at the first item.
* Added IObjectWeaponItem IPlayer.Disarm(WeaponItemType weaponType, Vector2 velocity) to be able to make players drop any weapon at any time.
* Added IPlayer.DealDamage(float damage) to be able to deal "misc/other" damage according to the built in rules for players in the game.
* Added Events.PlayerWeaponAddedActionCallback, Events.PlayerWeaponRemovedActionCallback to be able to listen when items are added or removed from player equipment (for example when a player grabs items, drops items, or throws items, or when a script removes/adds items etc.). See documentation for more details.
* Added IPlayer.GetWeaponMuzzleInfo(..), IPlayer.GetWeaponLazerInfo(..) to get world position and direction from an equipped weapon to be able to read where projectiles should be spawned if you're creating custom projectiles.
* Added Game.WriteToConsole(param object[] message) and Game.WriteToConsoleF(string format, param object[] args) for some quicker formatting.
* Fixed a NullReferenceException when using Game.CreateObject() in ObjectDamageCallback.
* Fixed a bug where LocalStorage and GlobalStorage wouldn't properly save empty arrays, causing them to be read as an array of length 1.
* Fixed a bug where damage from SawBlades and StreetsweeperBlades would count towards TotalMeleeDamageTaken instead of TotalOtherDamageTaken in the IPlayer.Statistics.
* Fixed the default "My Project" label in the documentation to "Superfighters Deluxe".