A mostly-complete history log of engine updates can be found here.

1.30a:
	Changes:
		- Greatly improved the speed of the script code interpreter.
		- Made the maximum sizes of render targets respect the Direct3D device capabilities.
		- EV_REQUEST_LIFE now accepts all types of values (will be converted to reals).
			- In case that an array was passed (multiple bosses), each elements will also be converted to reals.
		- Direct3D device capabilities will now be checked at the start, and the user will be notified if they are insufficient to run the engine.
		- Changed the default render priority of items to 40. (Previously 60, what the fuck mkm)
		- Changed the behaviour of resource pre-loading. (LoadTexture, LoadMesh, etc.)
			- Loaded resources are no longer script-dependent, they will remain loaded even if the script that loaded them has been closed.
		- Changed the arguments of ObjPatternShot_AddTransform/ObjPatternShot_SetTransform.
		- Improved GetObjectDistance.
		- Introduced the ability to use StartScript a second time without having to use LoadScript again.
		- Renamed ObjSound_SetRestartEnable to ObjSound_SetResumeEnable.
			- Usage unchanged.
		- Rearranged the arguments of ObjPatternShot_Add/SetTransform.
		- ObjFile_Store now use the source file's original line endings.
		- Binary, octal, and hexadecimal number literals now default to int.
		- Changed the usage of the function "resize".
		- Improved the speed of boss scene scripts loading.
	Additions:
		- Many new additions to the scripting language.
			- See "New Scripting Features".
		- Added GetObjectDistanceSq and GetObjectDeltaAngle.
		- Added an overload each for GetCommonData and GetAreaCommonData.
		- Added GetSystemTimeMilliS and GetSystemTimeNanoS.
		- Added SetInvalidPositionReturn, a function for changing the "invalid position" from (0, 0).
		- Added functions for pointer-based common data access:
			- LoadCommonDataValuePointer
			- LoadAreaCommonDataValuePointer
			- IsValidCommonDataValuePointer
			- SetCommonDataPtr
			- GetCommonDataPtr
		- Added IsVertexShaderSupported.
		- Added the ability to set the read offset of .dat archives.
		- Added new ObjPatternShot transforms:
			- TRANSFORM_ADDPATTERN_B1
			- TRANSFORM_ADDPATTERN_B2
			- Renamed TRANSFORM_ADDPATTERNA1 to TRANSFORM_ADDPATTERN_A1
			- Renamed TRANSFORM_ADDPATTERNA2 to TRANSFORM_ADDPATTERN_A2
		- Added new ObjPatternShot patterns: (thanks to Naudiz)
			- PATTERN_LINE
			- PATTERN_ROSE
		- Added back in script source caching, plus the ability to remove a script from the cache.
			- Added ObjEnemyBossScene_SetUnloadCache.
		- Added a "Cached Scripts" panel to the Script tab of the LogWindow.
		- Added a "CPU Time" column to the Script tab of the LogWindow.
		- Added a "Shader" tab to the LogWindow.
		- Added an overload for ColorARGBToHex.
		- Added ObjItem_SetPositionRounding.
		- Added new maths functions:
			- log2
			- logn
			- erf
			- gamma
			- distance
			- distancesq
			- dottheta
			- rdottheta
			- cbrt
			- AngularDistance
			- AngularDistanceR
			- Rotate2D
			- Rotate3D
		- Added count_rand, count_prand, reset_count_rand, and reset_count_prand.
		- Added Interpolate_X and Interpolate_X_PackedInt.
		- Added GetScriptStatus.
			- STATUS_LOADING
			- STATUS_LOADED	
			- STATUS_RUNNING
			- STATUS_PAUSED	
			- STATUS_CLOSING
			- STATUS_INVALID
		- Added implicit array casting for initialization, assignment, and concatenation.
			- Only applicable for int[] <-> real[] <-> null
		- Added array casting functions:
			- as_int_array
			- as_real_array
			- as_bool_array
			- as_char_array
			- as_x_array
		- Added StringFormat, a string formatting function in the style of C's sprintf.
		- Added IsIntersected_Circle_RegularPolygon and IsIntersected_Circle_Ellipse.
		- Added a new array function: contains.
		- Added ObjRender_SetEnableDefaultTransformMatrix.
		- Added ObjPrim_GetTexture.
	Bug fixes:
		- Fixed LoadMesh crashing the engine.
		- Fixed ObjCol_GetListOfIntersectedShotID incorrectly expecting only 1 argument.
		- Fixed a bug where whitespaces in parameter lists in text object tags are incorrectly parsed.
		- Fixed a bug where the "Show LogWindow" option would disappear if the game was set to start in (borderless) fullscreen mode.
		- Fixed the sound streamer behaving incorrectly when playing a .wav file larger than 1MB a second time.
		- Fixed a bug where ObjSound_Seek would be ineffectual if used when the sound isn't playing or within 2 frames after being played.
		- Fixed the Y hitbox scale not affecting the hitboxes of laser objects.
		- Fixed the LogWindow not able to output logs to file.
		- Fixed a bug where penetrating player shots may randomly not correctly collide with enemy hitboxes and mess up replays.
		- Fixed the engine crashing if the stage scene is quit and there is an ObjPatternShot, whose parent is a dead boss object, that wasn't manually deleted.
		- Fixed the LogWindow's Log tab not horizontally scrolling the newest line into view.
		- Fixed a bug with the remainder operation where using (kn % -n) or (-kn % n) where (k) is an integer results in (-n).
		- Fixed crash bugs with ternary statements in the following cases:
			- let a = [condition ? 0 : 1];
			- a[condition ? 0 : 1] = 100;
		- Fixed a package crash that happens when LoadScriptInLoadThread loads a stage script that contains a parser error.
		- Fixed a bug that made variable-overshadowing a function throw a parser error.
			- let power = 100;		//This is possible again.
		- Fixed a bug where an ObjMove would lag for one frame after applying its last AddPattern transform.
		- Fixed a "feature" where a multidimensional array can host values of different types.
		- Fixed a bug where Windows' list-searching feature was interfering with key remapping in the config.
		- Fixed a bug where empty lines in text file object are skipped over in some devices.
		- Fixed ObjFileT_SplitLineText having an incorrect return value if the object is invalid.
		- Fixed an issue where the engine's default 3D render shader and 3D particle list shader don't work on AMD graphics cards.
		- Fixed a null pointer read crash bug during engine initialization.
		- Fixed a bug where short-circuited logical expressions would not convert to boolean.

1.21a:
	- Fixed MatrixMultiply and MatrixDivide functioning incorrectly.
	- Added MatrixTransformVector for transforming a Vector3 by a transformation matrix.
	- Added a hex overload for SetFogParam.
	- Added a floored division operation. ("~/" and "~/=")
	- Added "resize", a function for resizing arrays.
	- Modified the functionality of the array slice operation and operator.
		- Upper slice bound is automatically capped at the array's size.
	- More options for text object tags.
	- Increased the smoothness of rendered fonts.
	- Fixed SetShotIntersectionCircle and SetShotIntersectionLine not working.
	- Fixed a memory leak issue that was causing the "too many open files" error message.
	- Using ObjRender_SetAlpha on a 2D sprite list object whose vertices were closed will now have an alpha-multiply effect.
	- Optimizations.

1.20b:
	- Fixed a bug that caused for loops using new variables to not function correctly.
	- Fixed a bug that caused all GetColor functions to return incorrect values. (Including GetShotDataInfoA1)
	- Fixed a bug where off-centered player hitboxes would behave strangely.
	- Fixed the game crashing on script end/retry. (How the fuck did I not notice this before 1.20a release bloody hell)
	- Added ObjShot_SetSpinAngularVelocity.

1.20a:
	- Reworked some math calculations. SIMD instructions are utilized.
		- A legacy version will also be provided in case your CPU do not support vectorization.
			- The vectorized version requires the following instruction sets:
				- SSE
				- SSE2
				- SSE3
				- SSE4.1
			- Generally, you should be able to run it unless your PC is from 30000BC or you're using a literal potato.
	- Added a native hitbox visualization mode.
	- Improved the line-circle intersection algorithm. New algorithm behaves like a circle-polygon intersection.
	- Overloaded ObjMove_SetDestAtFrame, where movement interpolation mode can be specified.
	- Fixed a bug where the graze count obtained via GetGraze() may desync with the one obtained via EV_GRAZE's event argument.
	- Fixed a bug where ObjText_GetTotalWidth/Height may break the font tag.
	- Fixed a bug where font text tag properties do not get reset after using ObjText_SetText.
	- Obj_GetValue will now ACTUALLY NOT crash the game if the requested value does not exist.
	- Renamed the "Obj_[..]ValueR" function series to "Obj_[..]ValueI".
	- Removed the constant 'pi'. Please use 'M_PI' instead.
	- Changed error messages of some default functions to be more descriptive to aid debugging.
	- Greatly improved script variable allocation.
	- Added a concatenate-assign operator. (~=)
	- Added bitwise operators. (~, &, |, ^^)
	- Int values can now be declared with a suffix 'i' or 'I'.
		- Static type declaration is planned.
	- Added implicit type casting in default script operations, including comparison and assignment.
	- Optimized the process of calling default constants.
	- The default constants SCREEN_WIDTH and SCREEN_HEIGHT will now change to reflect the settings in th_dnh.def.
	- Some functions will now return int values rather than real values.
	- Fixed a bug where itoa, atoi, and IntToString would underflow if the input is larger than 2^31-1. (New limit is 2^63-1)
	- Fixed a bug where the 3D viewport would get stretched out based on the size of the STG frame.
	- Made the game no longer freeze and crash after Alt-Tab'ing out of true fullscreen mode or after waking the desktop from sleep.
	- Pseudo-fullscreen mode now stops Windows from drifting off to Dreamland.
	- Fixed a mistake involving matrix multiplication order in the internal shader for particle list objects.
	- Removed CollectItemsByType and SetItemIntersectionRadius.
	- Added new event, EV_COLLECT_ITEM, which triggers when the item starts to move towards the player.
	- Fixed a bug where ObjShot_SetIntersectionScale[XY] does not scale the position offset.
	- If ObjFile_Open/ObjFile_OpenNW fails, the reason for failure will now be written to the LogWindow.
	- The ObjFileB_Read[...] functions no longer throw an error when attempting to read past EOF.
		- ObjFileB_GetLastRead can be used to obtain the amount of bytes read in the last read operation.
	- Various optimizations.
	- Un-Utilized UPX Executable Packer to not-reduce file size.

1.10c:
	- Fixed a bug in the UserShotData where rect can override animation_data.
	- Fixed a bug in the UserShotData where collision did not work at all.
	- Added functionality to change the color of the delay cloud per-shot.
	- Fixed a parser bug with nested single-lined statements.
	- Fixed a rare bug where object IDs may get duplicated when objects are created in rapid succession.
	- Fixed a bug where the default charset for some fonts are incorrectly determined.
	- Utilized UPX Executable Packer to reduce file size.

1.10b:
	- Fixed bugs with logical and ternary statements.
	- Improved data packing of common data files. (Files saved with 1.10a are now incompatible.)
	- Bug fixes and optimizations.

1.10a:
	- Fixed some random and function-related crashes.
	- RenderToTextureXX alpha fix ported+modified from th_dnh_woo.
	- Replaced ObjLaser_SetGrazeInvalidFrame with ObjShot_SetGrazeInvalidFrame.
	- Alpha channel blending now exists in all blend modes except BLEND_NONE and BLEND_ADD_RGB.
	- Fixed a bug where NotifyEvent and SetScriptArgument could not reach package-level scripts when called from a stage-level script.
	- Event arguments will no longer be overwritten when notifying nested events inside @Event.
	- Utilized variadic argument counts for the functions in the NotifyEvent series.
	- Utilized variadic argument counts for the WriteLog function.
	- Added transform functions for ObjPatternShot and relevant sample scripts, for former and current ECL modders.
		- Please note that they may not be able to fully emulate ECL's behaviours.
	- Added functionality to customize delay clouds.
	- Added an option to use true fullscreen mode in the config.
	- "Operation-assign" operators (+=, -=, ++, etc.) now work on indexed arrays.
		- Given: a = [1, 2, 3]
			- a[0]++		= [2, 2, 3]
			- a[2] *= 3		= [1, 2, 9]
			- a += [5, 6]	= [6, 8, 3]
		- Given: b = [[1, 2], [3, 4], [5, 6]]
			- b[0] += 3 	= [[4, 5], [3, 4], [5, 6]]
			- b[2]-- 		= [[1, 2], [3, 4], [4, 5]]
	- Array indexing/slicing operations now automatically truncate indices.
	- Array slicing operation can now reverse an array.
		- Given: a = [10, 12, 14, 16, 18, 20]
			- a[0..3]		= [10, 12, 14]
			- a[3..0]		= [14, 12, 10]
			- a[1..0]		= [10]
			- a[6..2]		= [20, 18, 16, 14]
			- a[2..2]		= []
	- Added ternary statements.
	- NO_CHANGE can now be used in the ObjMove_AddPatternBX functions.
	- ObjMove_SetAngle and ObjMove_SetSpeed can now be used on B-pattern objects.
	- Line-line intersection is now properly implemented.
	- IsIntersected_Line_Circle can now be used in package-level scripts.
	- Added a particle renderer object (ObjParticleList) and new relevant sample scripts.
	- Added support for vertex indexing.
	- Added support for basic directional lighting.
	- Improved vertex shader support, and added sample scripts for demonstration.
	- Fixed underflowing and overflowing issues with SetColor/SetAlpha functions.
	- Fixed a bug where ObjText_SetFontCharacterSet doesn't work at all.
	- Added more options to the [font] text tag.
		- Available tag options:
			- reset
				- Resets the text to its original settings.  Present in vanilla ph3 as "clear".
			- size
				- Adjusts font size. Unchanged from vanilla ph3.
			- ox/oy
				- Adjusts position offset.
			- it
				- Toggles italic. (true/false or 1/0)
			- wg
				- Adjusts font weight.
			- br/bg/bb
				- Adjusts font bottom color.
			- tr/tg/tb
				- Adjusts font top color.
			- or/og/ob
				- Adjusts font border color.
			- bc
				- Adjusts font bottom color as an (r, g, b) list.
			- tc
				- Adjusts font top color as an (r, g, b) list.
			- oc
				- Adjusts font border color as an (r, g, b) list.
	- Added more options to the [ruby] text tag.
		- Available tag options:
			- rb
				- Sets text. Unchanged from vanilla ph3.
			- rt
				- Sets ruby(furigana) text. Unchanged from vanilla ph3.
			- sz
				- Adjusts the ruby text's font size.
			- wg
				- Adjusts the ruby text's font weight.
			- ox
				- Adjusts the ruby text's left margin.
			- op
				- Adjusts the ruby text's side pitch.
	- Improved spacing of ruby text.
	- ObjFileT now properly reads from and writes to UTF-8 text files.
	- ObjFile_OpenNW now allows both reading and writing, unless the file was stored in a .dat archive, in which case all write functions will fail.
	- Pulled the plug on Shift-JIS support in favour of proper Unicode (UTF-8 and UTF-8-BOM) handling.
	- Better Metasequoia mesh support, and temporarily(?) suspended Elfreina mesh support. Blender .obj mesh support is planned.
	- The player object will now set its own movement speed and angle according to user key input.
	- Collecting user-defined items now notify EV_GET_ITEM to the player script.
	- Minimum custom window size is reduced to 320*240.
	- GetShotDataInfoA1 no longer throws an error upon receiving an invalid graphic ID, and will instead return default values.
	- Fixed a bug where the right and bottom source rect set with ObjSprite3D_SetSourceDestRect are 1 greater than expected.
	- Improved loading of .wav files.
	- Attempted to fix a bug where multiple sound objects simultaneously playing the same sound file (>1MB .wav, .ogg, or .mp3) would display strange behaviours.
	- Improved the precision of ObjSound_GetWavePosition, and fixed an issue where ObjSound_GetTotalLength would work incorrectly with .ogg files.
	- Added bitwise operators.
	- Greatly improved the LogWindow's Script panel.
	- Added a text showing the available video memory in the LogWindow's Texture panel.
	- Added a text showing the used RAM and CPU in the LogWindow's Info panel.
	- Enforced semicolons before closing braces.
	- Removed ObjShot_AddShotA1/2.
	- Various optimizations.

1.00a:
	- Multidimensional array assignments are now possible.
	- Arithmetic operations on array(s) are possible. (Left-right order is important)
		- [1, 2, 3] + 5 		= [6, 7, 8]
		- [5, 5, 1] * 2 		= [10, 10, 2]
		- [2, 3, 4] - [7, 0, 2] = [-5, 3, 1]
		- [10, 10, 10] / [5, 2] = [2, 5, 10]
		- [2, 3] % [4, 2, 1, 6] = [2, 1]
		- 4 + [2, 3, 6, 2]		= 8
	- Added support for multiple-pass shaders.
	- Shot and item objects no longer respond to changes in X and Y angles.
	- Bullet limit of 8192 for performance reasons.
	- Multiple hitbox support for shot objects has been removed.
	- Vertex shader support.
	- Much smaller replay files.
	- Added an option to specify the skip mode speed in th_dnh.def.
	- Obj_GetValue will not crash the game if the requested value does not exist.