Legend:
- Base-game versions are structured like 99r#(b#)
- NTT versions are structured like 100.###
Additions:
- IceFlower now has
feed_cost
andfeed_target
variables. - Added
object_has_event
for checking what objects have which events.
Fixes:
- Fixed "self is not an instance" popping up when calling specific functions.
- With execution order hopefully back to original, more mods should function normally.
Changes:
- To make the game work closer to how it did before,
I changed all of the step events to be user events that the game runs from a script.
Functionally everything should be the same as before, but let me know. - Mouse lock now only applies mid-game, not in menus.
- I tried to make the audio work like it did before, but it's still kind of weird,
so you can now add the following section to NuclearThrone.ini
and play around with values.
[snd_play_hit_big] min=320 max=64000 cap=320
Fixes:
- NTT-specific documentation no longer ends up in NT builds.
- Clicking during heavy lag should now be buffered.
- "Fish digging" should now be harder to pull off (but the logic stays in case you really get stuck in a wall)
Fixes:
- Custom localizations no longer show "ALWAYS BELIEVE IN YOUR SOUL" in place of many strings
- Fixed weapons playing various ambient sounds instead of their swap sounds
- Fixed a handful of ultra mutations not working correctly
- Fixed character select using the in-game fire/confirm button instead of the fixed one from the menus
Changes:
- With 2024.11, GM now assigns resource indexes alphabetically, which means that hard-coded resource indexes might no longer behave like they did before.
- As one exception, I gave
Player
a__PlayerParent
parent object so that you can still do/gml =0.x
and alike for quick tests. - If you replace the spiral sprites, the HD spirals (that are used when pixel scale is over 2) are now correctly colored
- Added
key0
input for sake of completeness
Changes:
- Updated to GM IDE v2024.11.0.179 / Runtime v2024.11.0.226!
- New GM version changed how 3d audio works but I think I got it to act the same as before.
- There could be other differences in behaviours, but hopefully not.
General:
- Snowtank laser sights are now also lighter on performance
- Fixed corpses not dealing more damage based on velocity (mostly seen with Impact Wrists), fixed Impact Wrists hits not playing their sound effect
Menus/UI:
- Fixed missing Back button on Coop menu
- Fixed the game taskbar caption flipping between "Nuclear Throne" and "0" if you launch it unfocused
- Incorrect stream key response (TB error?) no longer crashes the game
Controls:
- Fixed the game reverting to keyboard controls when returning to main menu
- Fixed "Press A" on start screen not assigning the gamepad correctly
- Fixed scroll wheel not switching weapons when bound
- Fixed inability to use mouse wheel on char select
- Fixed wrong right/down input on gamepads
- You can now have >100% completion by doing crowns on frog/skeleton
- Fixed native cursor sometimes being a black square on launch
- Added a set of controller button sprites for SteamDeck (only shown on SteamDeck)
- Game now auto-switches input method depending on whether you've clicked the logo or pressed a gamepad button
- Fixed Mansion chest only containing golden screwdrivers
- Rebel B now only puts up the hood in Frozen City (intended behaviour according to JW)
- Probably fixed fish digging
- Sniper laser sights are now lighter on performance
General:
- Fixed (?) a mystery crash when unlocking crowns
This is the same kind of thing that was previously causing a crash with ultra mutations and I do not like the implication that it's now unsafe to work with 2d arrays. - Updated lang-example.ini
- Fixed unlock popups not appearing
- You can now add more tips to categories in the language file and they will be picked up.
- Fixed mismatched tips for two secret areas.
General:
- Fixed a crash when unlocking B-skins
- The player can no longer get stuck while auto-walking during victory sequence
- Fixed the
KeyboardDirect
flag not working - [Semi-]secret characters are now consistently shown on Stats screen and can be selected with non-mouse
- Fixed some keys having incorrect display icons
- Fixed the mystery square cursor when playing with gamepad and native cursors enabled
- The game now uses XB1 (instead of XB360) style icons when XBOX style is selected
- Thrown gold weapons now sparkle correctly when localized (and make the gold pickup sound)
Controls:
- The controls menu has received a big overhaul in general
- You can now re-bind most of the alternative controls, and bind two inputs per control in general
(pause controls are partially locked to prevent unfortunate situations) - You can now bind mouse buttons
- The most important keybind is now re-bindable, including on gamepad
- You can now bind movement keys on a gamepad
- Keyboard can now be used in menus even when gamepad is enabled
- Gamepad deadzones are now adjustable
- Gamepad rumble is now adjustable
- There is now an option for 360-degree movement on a gamepad
- There is now an option for aiming with a mouse while using a gamepad
- There is now an option to assign gamepad settings individually for players
- The game is now more consistent about gamepad-specific behaviour when only some players use a gamepad
- Possibly more things I forgot about
General:
- You can no longer change aspect ratio mid-daily/weekly
- You can now enter daily/weekly without changing your aspect ratio to 4:3 by hand
- Necromancers will no longer try to revive things that they cannot revive
- "Hide HUD" no longer disables low health/low ammo cues
- Cars, flowers, and rad canisters no longer spawn on top of other things
- Pizza entrances are now guaranteed to spawn.
- Frog can now start Throne/Captain fights with gas, complete with a little visual effect
NTT:
- Fixed there being an extra GameCont in NTT character select
General:
- It is now cheaper to destroy walls, both for the game and for the mods.
On the technical side, FloorExplos now avoid creating walls on top of other walls (which are immediately destroyed), and explosions/portal objects queue walls for destruction by UberCont in end step (which further avoids creating instances that would be destroyed right away).
Modding:
- Fixed wrong sound names being reported for external audio files
(forsound_get_name
andasset_get_index
) - Laser/lightning sprites now have "rotated rectangle" bounding box type in case you want that instead of the default bounding box
- Fixed an error when using
instance_create
without a struct argument - Tips are now stored in UberCont.tips, and you can add your own in there.
General:
- Fixed the Super Blast Armor mystery crash
Modding:
- Sound functions no longer error when provided a nonexistent sound ID (for consistency with old behaviour)
- Replacing a sprite subimage no longer crashes the game
General:
- Updated to GameMaker 2023.8
- Fixed some speed checks not respecting time scale
- Fixed titles drawing twice for a few menus
- Blast Armor no longer blows up IDPD nades and yourself
- Pausing the game now pauses the looping sounds (and resumes them afterwards)
- Becoming Skeleton now gives you an extra mutation after Back in Flesh for consistency with old behaviour
- Halloween/xmas now last a little longer
- Halloween/xmas now work in NTT
Modding:
- Fixed a crash when the game duplicates custom enemies on loops
- Fixed instance_nearest_bbox not working
- Fixed replaced music/ambient sounds not taking effect
General:
- Fixed a crash in
scrJoyAim
Multiplayer:
- Replaced the Steamworks GM extension DLL with a copy that doesn't leak memory every time the game sends a packet
Scripting:
- GMLv1 macros now really work like they did in past
- Added
instances_matching_range
lq_size
now works with arrays for backwards compatibility- Setting
maxhealth
onCustomEnemy
now setsmy_health
again on_hurt
andon_grenade
callback conversions were being checked for incorrectly.- Added
CustomObject.sprite_visible
to allow skipping default drawing easier - Added GC functions (
gc_enable
, etc. - check/gmlapi
) - Fixed
CustomSlash
not auto-converting some callbacks like it should variable_*
functions now respect field getters/settersObjectName.varName
now works like it did before (most notably for settingGameCont
variables ingame_start
)- Multi-line race names are now vertically aligned correctly
General:
- Fixed some pop-in issues with textures
Multiplayer:
- Steamworks multiplayer now seems to work again
- Fixed rad attraction not being synced
- Fixed mouse positions inside some menus not being synced
Modding:
- Fixed GMLv1 macros not working like they did before
General:
- Fixed the key name <-> key code related crashes
- Steam multiplayer might work now (but I don't have a setup to test it)
There are also changes to how files are sent, which might improve loading times for big packs - OGG audio files now sit in amb/snd/mus subfolders
- Textures now sit in tex folder instead of being embedded in the executable, making them easier to mod
This is also currently causing placeholder textures to be briefly visible as the PNG file loads, but I'll figure it out later
Modding:
- Fixed
[@]
accessor [$]
accessor is now disabled for GMLv1 mods
General:
- Hopefully fixed the issue with the game randomly not starting (by updating both GM and Steamworks extension)
- Replaced the borderless fullscreen implementation by now-built-in functions
Netcode:
- Online multiplayer works again, for now in UDP mode only (Steam's in the next release)
- Replaced now-incompatible FaucetNetworking DLL with a very tiny UDP wrapper (IPv4 only, no hostname resolution)
- Probably fixed the crash on desync, which means that you can hunt the elusive scrapyard desync with
/tracksync
again
Modding:
- Scripting language is now mostly-on-par with GM2023.4 syntax features
- Shuffled some things around to hopefully cause less stress on the garbage collector when working with huge mods
- Added some string and array functions from GM2023.4
- Added zip_unzip (unzips for the player calling the function, both zip and destination are relative to the mod's data folder)
Modding:
- Fixed
surface_save[_ext]
/buffer_save[_ext]
/buffer_load
not using data/ directory - Fixed
div
performing floating-point division under certain circumstances - Fixed a softlock when doing
X in in Y
- Fixed Last teleporting all instances of itself instead of just self
- Fixed a crash when minimizing the game window with natie cursor enabled
- Re-added shader loading support (very WIP)
General:
- Fixed detection logic for cursor / mouselock DLLs.
Modding:
instance_create
now returns numeric IDs in GMLv1 mods.- Fixed callback conversions not working right after 100.007 changes
- Functions with optional
self
/other
context now allow these to be invalid for compatibility with old mods.
General:
- Fixed Rogue pickups not doing some of the pickup things due to copy-pasted code.
- Fixed rads being attracted by Eyes' active faster than they should be after 100.x changes.
- Fixed golden nukes not following the cursor after 100.x changes.
Modding:
- The scripting language is now updated with most of the recent GML additions such as
static
or100_000
- Added
array_filter
,array_map
,array_reverse
,variable_struct_filter
,variable_struct_map
- Removed the recently introduced
object_*
manipulator functions due to excessive volatility - Added
event_perform_object
- File-related functions are now aware of mod file's relative path
- Added
mod_current_path
,mod_current_dir
; file init order is now predictable - Added
Player.calc_pickup_attract_distance()
andPlayer.calc_rad_attract_distance()
(which you can override with your own functions) - Added
CustomPickup
self
/other
now return an ID in GMLv1 mods.- Since the game now runs on GM2022.11, IDs are now a
ref
type, but we'll pretend that they aren't for GMLv1 mods. - Projectiles now have a
creator_projectile
variable for tracking submunitions - Race mods can now define a
race_gets_chilly
script. - Fixed
instances_in_rectangle
/instances_in_circle
not working with array arguments - Fixed
on_
script ID->script binding conversions being too generous (and applying when writing variables to objects that didn't use to do conversions) - New-format menus now create a single dummy button so that mods making use of instance_exists still work
- GMLv1 mods are now allowed a bug where you can do [1 2 3] instead of [1,2,3]
- Added
projectile.portal_immunity
- Mod errors no longer show the ultra-verbose call stack by default; original behaviour can be enabled using
/debugstack
- I updated most of the game's extensions, but that doesn't necessarily mean that multiplayer works now
- Mods can now have a
.ntgml
extension to default to v2 syntax (so that you don't have to put#pragma gml 2
in each file) - Included code files now run their init too, although not in a fancy order (for now)
surface_free
used in v1 mods can now take -1 or non-surface args again- Fixed initial Vlambeer logo being off-center if you specified non-4:3 aspect ratio
- Fixed weapon scripts not getting self/other when called through
weapon_*
by another mod - Fixed
alarm#
not working for structs - Fixed
sprite_skin()
not gettingself
- Fixed mod-loaded sprites defaulting to 30fps instead of frame-per-frame speed
General:
- Fixed a crash in
scrTarget
- There's now a "mechanics" menu in the "game" menu where you can change rad attraction mode, framerate, and aspect ratio
Modding:
- Framerate/aspect ratio settings now auto-load in NTT
- Fixed
try
/catch
not being available in non-gml2 mods
Modding:
- PhantomBolt now has
fadespeed
and also doesn't move - Fixed
instance_in_rectangle
/instances_in_circle
returningundefined
s - Game no longer crashes if a mutation/ultra button sprite is unloaded
race
is now consistently a string andrace_id
is consistently a number (I'll see what to do withRevive
that had them swapped later on).is_object
now returnsfalse
for ds/etc., addedis_builtin
for those.- Added
#pragma fast
- can be included in a script to compile it in alternate mode. Generally ≥2x faster, supports ~2/3 of GML syntax, may struggle with specific features.
Modding:
real(v)
now behaves like the GMS1 function (doesn't throw errors), GMS2.3 real isdouble(v)
- Fixed some resource-related functions throwing a cryptic error when ran on an nonexistent file
- Fixed the game crashing if unloading/reloading a character mid-level-gen
- Making a mod unload itself no longer crashes the game (nor will unloading some other mod and then managing to run a function from it)
- PopupText now accepts both
mytext
(actual variable) andtext
(legacy alias) - Fixed
++alarm0
/alarm0++
ignoring variable rules - Fixed
race
/race_id
variables not working right - Fixed
background_color
setter not doing anything
Modding:
- Fixed Quick Restart switching players to Random
- Fixed
is_real
, for real this time - Fixed non-GMLv2 mod functions sometimes returning
undefined
instead of0
by default - Calling built-in functions should now be a tiny bit faster
- Array literals (
[...]
) now use argument list optimisations from function calls - Fixed
#macro name { "key":
/#macro name { key:
being mistaken for a malformed code block projectile_hit_raw
is now marked as an instance-specific function since it accessesother
forlasthit
- Mod dumps (from
/debugbc
) now include slightly more info (local variable IDs, local variable names in corresponding instructions) - I tried making use of the 2.3
delete
keyword to help GM garbage collector free mod function invocation leftovers sooner, which will either slightly help performance or cause the game to mysteriously crash
Modding:
- Fixed broken signatures for
method
andlq_get
; added checks to make sure that I don't do this again - NTT is now back to using LCG RNG since people relied on rewinding RNG seeds
- Fixed
ds_list_shuffle
- Added more special cases for function argument chain optimisations (now supports constants, local vars, and self/current instance vars)
- Added
#pragma using modname.type
(e.g.#pragma using sprites.mod
) that automatically makes top-level functions andglobalvar
s from the said mod available in the current mod similarly to (but more optimised)mod_*
functions. The mod in question should be loaded before the modusing
it - references are collected compile-time. - You can now do
globalvar name = value
- Added
/gml2
command for doing new-syntax snippets - You can now add an empty
no_intro
file to game or save directory to auto-skip intros - Fixed a crash when exiting a session after using
object_add
- Player now sets
aimDirection
on fire/step so that a few mods using that variable are less likely to break - Melee projectiles now have a shared
meleeprojectile
parent. - Swapped
race
/race_id
back forPlayer
,CharSelect
, andEGSkillIcon
- You can now reference "built-in" functions again (
var t = trace; t("hi!")
)
Modding:
- Rewrote some of the checks that would be causing issues when used together with
object_add
- Player now has
swap_weps()
andcalc_reload_speed()
that you can call or replace - Fixed
current_time_scale
being non-writable - Framerate option won't show up in NTT for now
lq_get
/lq_defget
will now returnundefined
for non-structs like it did before (variable_struct_*
is unaffected)- Added
current_time_scale_squared
that should be faster than squaring it yourself (game code also uses it) - Added missing accessors for some timescale-based variables
- Fixed
area_can_spawn_portal
,weapon_get_list
method(newSelf, func)
is now available- Fixed
instances_matching_ne
putting instance-structs into array - Seeding-related variables can now be found in GameCont again
/gml
errors no longer show\n
s- Fixed
new
/function
not working with#pragma gml 2
- Instance variable errors are now more descriptive
crown_get_pick
/crown_set_pick
now use 0 as "default" instead of -1collision_line_point
/collision_line_width_first
now return a struct and take an optional struct argument to populate- Fixed some API functions working strangely due to using a wrong
self
ultra_count
now returns a dynamic value for Skeleton- Fixed some instance functions not working due to legacy NTT implementation overwriting the new one
- Booleans should now be booleany (as far as type/print go) more often
instance_is
should no longer throw an error for destroyed instance IDs- Fixed chat_comp_add adding first argument to rest-arguments
- Projectiles now have sprite variables (
spr_dead
,spr_disappear
,spr_impact
- depending on the thing) - Fixed modded loadout weapons showing
sprite#0
for struct-weps
- The game has been migrated to a current GameMaker version (first GM2022, then GM2023).
- The scripting language was more or less rewritten from scratch to be more performant and have more features.
- Hopefully we're back to having functioning online multiplayer in NTT?