Releases: tweenko/tldr-engine
v1.13.1+1
Ripple (v1.13.1)
by @tweenko
ripple effects library:
- library by techncolour with some polish by me
- added Clean Shapes by Juju Adams and others as an external library
- new function
lb_ripple_createthat creates a ripple wherever you'd like with lots of customization - new functions
lb_ripple_vision_onandlb_ripple_vision_offthat enable/disable ripple vision - new object
o_lb_ripple - new object
o_lb_ripple_visionfor making dark rooms - when under ripple vision, leader actor now emits ripples every other footstep
lighting system modifications:
o_eff_lighting_controllerhas three new variables:shadows,darkenandhighlightsthat determine whether actors have these drawn when under lighting globally
bugfixes:
- soul sprite was changed to be accurate with DR
Climbing Adjustments (v1.13.1+1)
by @Notrealb
Tweaks to climbing:
- Climb camera moves faster.
- Multi-Key direction behavior: Holding multiple keys in a general direction will alternate between the two directions, allowing diagonal-like movement. You'll also no longer constantly bump while holding multiple keys against the climbable boundaries.
- Charge animation sync.
- Allowed some support for jump_reach_max values above 50 by clamping it where needed.
v1.13.0
Climbing and More (v1.13.0)
IDE Version: v2024.14.4.222
Runtime Version: v2024.14.4.268
climbing system:
- added a climbing system. you can add tiles on a layer with a name that starts with
climb, and the system will register them. aside from tiles, you can simply addo_dev_climb_tileobjects as well - you can see an example of its usage in
room_test_climbing - camera switches into a smoother following mode when climbing to look like deltarune
actor changes:
- a slight touch-up of the actor mover system (it still sucks though)
- new
actor_movement_jump_intothat is just a jump movement without the landing animation - added an optional argument to
actor_movementandactor_movement_jumpcalled_play_sfxthat determines whether corresponding sfx should be played (if applicable) - added an optional argument to
actor_movement_jumpcalled_timethat determines the time the jump animation will take - new
o_actorvariableoverride_blendthat, if not set to undefined, will override the actor blending. for internal usage - new
o_actorvariablealpha_modthat can modify the actor alpha
test zone changes:
- connected
room_test_climbingandroom_test_loopback - added some more decor to
room_test_loopback
misc changes:
marker_find_closestwas moved to deprecated and renamed tomarker_find_closest_idmarker_find_closest_instwas renamed tomarker_find_closestandmarker_find_closest_instis now deprecatedo_eff_genericnow hasstart_alphaandend_alphao_eff_generic'sstart_scalewas changed to 1o_afterimagenow has ascale_modvariableo_cameranow resets most variables when changing rooms- extended game over screen light transition by 10 frames
- game overs now can happen outside dodge events
- added support for
o_text_typermini text not having any faces associated with it via using not a valid face (e.g. -1 or nil) - removed
o_ui_fuse - added a new argument to
audio_playandcutscene_audio_playcalledoffsetthat offsets the sound by an x amount of frames cutscene_audio_playnow has a new argument calledsound_typethat determines the target emitter of the sound you want to play- added JSDoc for
cutscene_audio_play - new function
audio_get_target_emitterthat returns an audio emitter based on the sound type provided - added a new argument to
item_containscalleditem_type - implemented magical glass from deltarune as
o_ow_magicalglass
bugfixes:
party_contains's usage was adjusted in the party selector to account for passive party members (above limit)enc_set'swin_conditionnow actually works and the behavior linked too_enc'swin_conditionwas changed to now be linked toenc_set's method- fixed the
item_containsfunction to work correctly (it didn’t work before)
v1.12.2+1
v1.12.2+1 (Dev Tools, QOL & Bugfixes)
IDE Version: v2024.14.4.222
Runtime Version: v2024.14.4.268
dev tool changes:
- revamped dev tool UI
- removed save deletion logic from
o_worldand simply made it spawno_dev_savewipe_promptinstead - added support for dev tools to react to different game widths and heights
turn changes:
o_turn's user event 0 is now called once all the turns were spawned in, not 1 frame after its creation- fixed logic for
__support_init_defaultand__support_destroy_checkthat now ignores the support turns
save changes:
- added a new macro called
SAVE_ENCODEin thesavescript that controls whether to encode a player's save data when saving. set tofalseby default, but encouraged to be set to true when finishing the game - two new functions:
save_to_stringandsave_from_stringthat convert save data to/from strings - added JSDoc for
save_reload - saves are no longer saved as .json files, instead saved with no format at all
misc changes:
- the game's width and height is now controlled by four new macros:
GAME_W,GAME_HandGAME_W_GUIandGAME_H_GUI(the normal draw scale and the gui draw scale respectively) - added a new function called
draw_text_highlightedthat's used in most dev tools now - all main party member collision boxes are identical to kris' one for consistent gameplay among the main party members
- text typers now have a new
fonthash that determines the font that their text will use. can be a loc ID for a font or a reference to an asset (undefined will just not change the font) o_ex_turn_complex_boxwas extended from 120 frames to 300o_ex_turn_dentosis now a support turno_ex_turn_dentosnow appropriately usescutscene_stopinstead ofinstance_destroyo_ex_turn_dentosturn's logic was changed so that it works if its index is higher than 1- made spawn bullets animated
- updated
cutscene_lb_music_pitchto work the new cutscene system - added enum for
SOUL_COLORinstead of real numbers - added the documeation link in the setup note
- removed unused variables in
o_world
bugfixes:
- fixed a bug where previously, i accidentally made local
cutscene_player_canmovealways set the player instance'smoveablevariable tofalseinstead of the desired choice enc_enemy_isfightingnow correctly checks for whether an enemy is still fighting and can be hurt- fixed a bug where shadow guys shoot act would crash the game if any of the enemies was not fighting anymore
v1.12.1+1
v1.12.1+1 (Cutscene Updates, Bugfixes)
IDE Version: v2024.14.4.222
Runtime Version: v2024.14.4.268
- added a new function called
cutscene_stop - added a new property for cutscenes called
localthat determines whether to destroy the cutscene when leaving the room cutscene_player_canmovenow has a new argument called_globalthat determines whether to make the movement rule global (persists through rooms) or local (only for this room)falseby default- fixed errors when equipping/unequipping items
- removed cutscene logic for unique_ids
v1.12.1
v1.12.1 (More Localized Sprites)
by @Leftory and @tweenko
update tutorial
IDE Version: v2024.14.4.222
Runtime Version: v2024.14.4.268
localization changes:
- localized Damage text in battle (and added Japanese variant of RECRUIT text)
- localized TP caption in battle and overworld power menu
- localized "PRESS" hint when fighting in battle
- localized "HP" text in battle and overworld menu
- localized "GAMEOVER" text
Target box in battle - added a new loc file called "damage.json" that contains all damage localization IDs
- changed logic for localizing damage sprites
- applied the
TEXT_HPCHANGE_MODEenumerator in source code when possible - added support for light world menu localization
misc changes:
- added the "bandage" armor
- the default weapon & armor are now the bandage and pencil instead of being undefined
v1.12.0
v1.12.0 (Saves, Memories and Localization Overhaul)
IDE Version: v2024.14.4.222
Runtime Version: v2024.14.4.268
be careful when updating your project! this update changes a lot of things!
save system changes:
- the whole save system was rewritten from the ground up
- the new save system is a lot more reliable and fixes lots of issues and bugs related to saving/loading that the engine had before
- settings now support
save_entries - all save_entry related things were moved to their own script called
save_entries savesscript renamed to simplysave- all functions in the save system now follow a more concrete naming pattern, thus lots of functions were renamed
- renamed
global.savestoglobal.save_filesto reduce confusion between it andglobal.save - empty save files are now marked by being empty structs (
{}) instead of-1 - new function
save_entry_reset_defaultthat resets the default value of a save entry to its original definition. could be useful in certain scenarios
memory changes:
- if you remember anything about states, please feel free to forget about everything you've known. now they're called memories and they're completely different
- the memory' predecessor, states, is now considered deprecated and is simply imitating a behavior simillar to the one achieved by the new memories. their use of id is also a bit broken due to some things not having an id. if you want to keep using states, which i don't recommend you do, you must add an identificator to all of them!
memory_get(_category, _identificator)returns a certain memory identifier in a certain memory categorymemory_set(_category, _identificator, _value, _locked = false)sets a certain memory identificator to a value. returns whether the target memory was changed or notmemory_flick(_category, _identificator, _locked = false)flicks a memory. if the memory doesn't exist, it will be flicked to true. returns the new value of the memorymemory_remove(_category, _identificator)flicks a memory. if the memory doesn't exist, it will be flicked to true. returns the new value of the memory- example of how you'd use memories:
var evil = memory_get("choices", "test_evil"); // first, we get a memory from an arbitrary category. if the memory doesn't exist, undefined will be returned
if !evil && choose("A", "B") == "A" // if we aren't evil yet, we choose between "A" and "B" in a 50% chance to become evil
memory_flick("choices", "test_evil", true); // if fate so decides, the "test_evil" memory is flicked true. the last argument here locks the memory from changing back to false if it's true already.localization changes:
- new function
loc_stringthat does the same thing aslocdoes with the functionality of replacing bracketed numbers (e.g. {0}), just like base GML’sstringcommand - all uses of
locandstringtogether were adjusted to useloc_stringinstead - new function
input_verb_get_namethat returns the name of an input verb and localizes it. applied it where it’s applicable - fixed fallback languages to actually work by checking whether a localization entry exists with that name before adding it to the localization data
- added new localization IDs in the form of localized bind names (e.g. “menu_bind_down”). you may add your own bind names you’d like to localize if you want to! just make sure they fit the
menu_bind_{x}naming scheme (where the {x} is your bind name) - added a new function
loc_existsthat returns whether a localization entry exists or not
text_typer changes:
- first of all, don’t get too attached. i’ll probably rewrite it sometime later in 2026 in my unrelated project
- the effect command, while still accepting real numbers, now counts this behavior as deprecated and should instead use strings to refer to their target effect
- the effect command now has bonus arguments called
effect_argumentsthat will change the effects’ behavior - the command recognition system should recognize boolean statements more reliably now because all
bool(x)calls were replaced with the newstring_to_bool(x) - added a new “wave” effect
- added support for all
string_to_colorcolors to also understand colors without the “c_” prefix
misc changes:
emitter_musicwas renamed toemitter_bgmbus_musicwas renamed tobus_bgm- added a new function
struct_emptythat checks whether a given struct is empty - chapter select now uses the new
save_entry_set_defaultinstead of simply changing the empty save that the engine was using - rewrote diagonal collision logic that better accounts for possible interferences once landing into the target zone
- added a new command called
string_to_boolthat reliably converts strings into boolean, while also accounting for the possibility that the string may simply equal to “true” or “false”
bugfixes:
- collision bugs are a lot less likely to occur due to a few rewrites
- the save system is a lot more consistent thanks to the rewrite and eliminates most of the bugs that can be found in versions before v1.12.0
- fixed an issue where the
input_binding_intextfunction would add one too many slashes (“/”) - fixed an issue where the current save's room name wouldn't be localized when overwriting a save
v1.11.2
v1.11.2
by @tweenko with contributions from @Leftory
update tutorial
IDE Version: v2024.14.4.222
Runtime Version: v2024.14.4.268
localization system changes:
- added a feature of a fallback language for localization that you can configure by changing the
global.loc_fallback_langvariable. - if
loccannot find the localized asset in the language requested, it will return the fallback asset as a failsafe - changed
loc_switch_langto roll you back to your last save by default - improved JSDoc for
loc_switch_lang - renamed last
loc_switch_langargument toload_save(whether to load the last available save, true by default) - changed the console's language_switch command accordingly
- added a failsafe for when a charset doesn't exist for the partyname font
chapter select changes:
- chapter names are now localized in the draw event in real time instead of being localized when the object is created
- added an option to not restart the chapter select screen when switching languages that's set to true by default. that's not how it is in deltarune, so you can set it to false in
o_chapter_select's create event - changed certain code formatting choices to look more alike to the rest of the engine's code
- the "Quit" option is now localized based on
chapter_select_quit - "Chapter X" labels are now localized based on
chapter_select_chapter - stars' x position was changed to account for the chapter label width (written by @Leftory) (feature request)
misc changes:
- revivemint is no longer a default item
engine_inforenamed togame_info- game over screen was fixed to actually spawn in dialogue and skip waiting altogether if there is no dialogue to show
- all macros and functions with
enginein them were changed togame:ENGINE_VERSION->GAME_VERSIONENGINE_NAME->GAME_NAMEENGINE_LAST_COMPATIBLE_VERSION->GAME_LAST_COMPATIBLE_VERSION__engine_version_to_real->__game_version_to_real__engine_versions_compare->__game_versions_compare
known issues:
- if you switch the language in the save_select menu, when loading a save the items will be localized incorrectly. will be solved after the save system rewrite
v1.11.1+1
v1.11.1+1
made by @tweenko
IDE Version: v2024.14.4.222
Runtime Version: v2024.14.4.268
party changes:
party_ismemberwas renamed toparty_contains- fixed potential bugs related to checking whether a party member is in the partyrelated to the party_limit. for example, in battles, even if the party member was out of the limit, if there were acts that used them, they would still be available to use
party_containsreceived a new argument called_full_partythat is boolean for whether to check for the full party (above the party limit)- all mentions of
array_contains(global.party_names, ...)were replaced with the newparty_containsfunction
deprecated function changes:
- all deprecated functions now have more detailed descriptions describing why they're deprecated and what to replace them with
save_set(deprecated) now simply hyperlinks tosave_set_slot
v1.11.1
made by @tweenko
IDE Version: v2024.14.4.222
Runtime Version: v2024.14.4.268
item changes:
- added a new hash for
item_weaponconstructor and its children calledweapon_element. it must always be a struct containing two variables calledelementandmultiplier. if the enemy'selementmatches with theweapon_elementthe multiplier will be applied to the damage dealt - moved
weapon_fatalandweapon_whitelistfrom theitemconstructor to its childitem_weaponconstructor - moved
armor_blacklistfrom theitemconstructor to its childitem_armorconstructor - moved
is_mercyspellfrom theitemconstructor to its childitem_spellconstructor - moved
is_party_actfrom theitemconstructor to its childitem_s_defaultactionconstructor and also made it optional to be set
encounter changes:
- the
enemyconstructor and its children now have a new hash calledelementthat's equal to undefined by default. if the enemy's element matches the weapon element, a multiplier based on the weapon will be applied to the dealt damage. please note that this element hash does not influence the element of the bullets in the encounter. that's configured in the bullets' objects.
misc changes:
- added a failsafe for when an
item_localizefunction can't find the correct localization struct - made the
charcommand ofo_text_typerperform an effect akin to theface_excommand when the character is the same as the current one. this is ill-advised, but this was added just because people kept facing this issue and it's seemingly a bit unintuitive cutscene_wait_until'sargumentsargument is back after being accidentally removed in v1.11.0- changed slide speed to 5 to make it how it is in DELTARUNE
v1.11.0
v1.11.0 (Cutscene Overhaul)
made by @tweenko
IDE Version: v2024.14.4.221
Runtime Version: v2024.14.4.265
cutscenes:
- the cutscene system was fully overhauled with better performance and improved customization!
- added two new constructors:
cutsceneandcutscene_event, which are the cutscene instance and a cutscene event inside the instance queue respectively cutscene_getandcutscene_setwere renamed tocutscene_get_currentandcutscene_set_current. the old names were moved to deprecated functionscutscene_dialogue,cutscene_actor_dialogueandcutscene_actor_movenow track the instance they create specifically when waiting in queue.o_cutscene_instis now redundant and deleted- added a new cutscene event:
cutscene_actor_overridethat turns on/off an actor’ss_overridevariable
actor movement:
global.charmove_instsis now redundant and was removed from the engine entirely.cutscene_actor_move'sposargument is now redundant and removed from all function usesactor_move'sposargument is now redundant and removed from all function uses
misc changes:
- the
sprcommand foro_text_typer's arguments now are properly set as sprite_index, image_speed, image_index in this order. previously, the image_speed and image_index arguments were mismatched, leading to confusion - added a new function called
party_leader_warpwhich warps the leader and their party members. created to avoid re-writing code - slide dust now appears only when the player is 30 pixels or lower below the starting point of the slide trigger
- renamed
room_ex_shopzonetoroom_test_shopsfor better consistency - moved
room_test_shopsto the test zone category in room warp - the soul now more consistently follows the party leader during overworld dodge sequences
- the overworld slide speed is now controlled by
global.slide_speed, and changed from 4 to 6!
dark lighting library changes:
- fixed the issue when the falling light would stick to the screen position
- added optional parallax effects for falling light (variable definitions
parallax_xandparallax_y - made the example room 540x240 instead of 320x240
migration guide:
- global search
cutscene_actor_moveand replace all of YOUR custom calls withcutscene_actor_move_old
v1.10.2+3
v1.10.2+3 (Bugfixes)
made by @tweenko
- fixed a bug where instant item usage would target the next party member instead of the current one (bug report)
- moved the checker for whether an enemy is still fighting or not in the all instances of spell code (bug report)
- fixed a bug where items in encounters would use spell selection instead of item selection
v1.10.2+2 (Beat Pulser)
made by @tweenko
engine changes:
- added a new library called Beat Pulser. it emits signals in sync to background music
- added
beat_pulserconstructor and its JSDoc
v1.10.2+1 (PR #26 - "Add a party_length function that returns the number of party members")
made by @Vinchethescript and reviewed by @tweenko
party changes:
- implemented a new function called
party_lengththat returns the current number of party members. - replaced all instances of
array_length(global.party_names)withparty_length - added a new variable
global.party_limitthat determines the maximum amount of working party members. set to 3 by default. set to undefined for no limit (no limit is how it was in the engine previously)