A mostly-complete history log of engine updates can be found here. 1.32b Changes: - All functions and actions that change a shot's graphic ID has an additional feature: - The actual graphic ID will be the absolute value of the value received. - If the value received was negative, the graphic change operation will preserve the shot's previous spin angular velocity and Z-angle. - Affected functions and actions: - ObjShot_SetGraphic - ObjMove_AddPatternA3 - ObjMove_AddPatternA4 - ObjMove_AddPatternB3 - ObjMove_AddPatternC3 - ObjMove_AddPatternC4 - TRANSFORM_GRAPHIC_CHANGE Additions: - Added an instruction on how to get ph3sx to work with Wine. (Check readme.txt) - Added SetIntersectionVisualizationRenderPriority. Bug fixes: - Fixed incorrect documentation for some functions. - Fixed AddPoint not working correctly. - Fixed some issues with acceleration and max speed when converting from B-movement to A-movement or C-movement with AddPattern. 1.32a Changes: - Renamed "real" to "float". - r (number suffix) -> f (number suffix) - 45.22r -> 45.22f - real -> float - as_real -> as_float - as_real_array -> as_float_array - VAR_REAL -> VAR_FLOAT - Changed how setting curvy laser node widths work. Instead of directly setting the width, the functions will set the nodes' width scales. - Renamed ObjCrLaser_SetNodeWidth to ObjCrLaser_SetNodeWidthScale. - Renamed ObjCrLaser_GetNodeWidth to ObjCrLaser_GetNodeWidthScale. - Improved cross-compatibility between different movement types of the following functions: - ObjMove_SetSpeed - ObjMove_SetAngle - ObjMove_SetAcceleration - ObjMove_SetMaxSpeed - ObjMove_SetAngularVelocity - Swapped the "shot graphic ID" and "target ID" arguments in ObjMove_AddPatternA4. - Swapped the "max speed" and "angular velocity" arguments of the following functions: - ObjMove_AddPatternA2 - ObjMove_AddPatternA3 - ObjMove_AddPatternA4 - TRANSFORM_ADDPATTERN_A2 in ObjPatternShot transforms - Completely removed shot scripts. - Moved SetShotDeleteEventEnable to the stage script. - Default values for all three delete events are true. - Furthermore, fixed EV_DELETE_SHOT_IMMEDIATE and EV_DELETE_SHOT_FADE not being notified properly. - Restructed event arguments of EV_DELETE_SHOT_TO_ITEM. - The third event argument; "player collision", has been removed. - Collision with the player will now trigger EV_DELETE_SHOT_IMMEDIATE instead of EV_DELETE_SHOT_TO_ITEM. - Increased the minimum width for straight and curve lasers, primarily for delay visibility purposes. (Thanks to Naudiz) - Allowed lasers to lose penetration (life) points. (Thanks to Naudiz) - Like with any shot object, this will only occur when a laser lacks spell resistance (which it has by default). - Removed #BGM. - Made it so that the window sizes list will be autogenerated instead of defaulting to [640x480, 800x600, 960x720, 1280x960] when window.size.list in th_dnh.def doesn't exist. - Size multipliers are [x1, x1.25, x1.5, x2], with screen.width and screen.height being the base resolution. - Made it so that the engine will check for the required .dll modules during initialization. - d3d9.dll - d3dx9_43.dll - d3dcompiler_43.dll - dinput8.dll - dsound.dll - In the event where the Direct3D device enters a lost state, the engine will now attempt to restore up to 60 times before throwing an error, rather than only once. - Removed ObjItem_SetAutoCollectEnable, and replaced it with ObjItem_SetAutoCollectEnableFlags. Additions: - Added Interpolate_X_Array, Interpolate_X_Angle, and Interpolate_X_AngleR. (Thanks to Naudiz) - Added ObjShot_SetEnemyIntersectionInvalidFrame and ObjShot_SetPenetrateShotEnable. (Thanks to Naudiz) - Added SetShotTextureFilter, SetItemTextureFilter, ObjRender_SetTextureFilter, and ObjShot_SetAngleRounding. (Thanks to Naudiz) - Added SetEnemyAutoDeleteClip, ObjEnemy_SetAutoDelete, and ObjEnemy_SetDeleteFrame. (Thanks to NicholasLogan) - Added ObjMove_SetAngularAcceleration, ObjMove_SetAngularMaxVelocity, and ObjMove_AddPatternA5. (Thanks to NicholasLogan) - Added an overload to CreateShotA2, adding an angular velocity argument in between the acceleration and max speed ones. (Thanks to Naudiz) - Added ObjMove_GetMovementType. (Thanks to Naudiz) - Added constants: - MOVE_NONE - MOVE_ANGLE - MOVE_XY - MOVE_XY_ANGLE - MOVE_LINE - Added the C-movement type for ObjMove. (Thanks to Naudiz) - CreateShotC1 - CreateShotC2 - CreateShotOC1 - ObjMove_AddPatternC1 - ObjMove_AddPatternC2 - ObjMove_AddPatternC3 - Added AddPattern functions for line-movement. (Thanks to Naudiz) - ObjMove_AddPatternD1 (AddPattern version of ObjMove_SetDestAtSpeed) - ObjMove_AddPatternD2 (AddPattern version of ObjMove_SetDestAtFrame) - ObjMove_AddPatternD3 (AddPattern version of ObjMove_SetDestAtWeight) - Added ObjMove_CancelMovement. - Added new transformations to pattern shot objects. (Thanks to Naudiz) - TRANSFORM_ADDPATTERN_C1 - TRANSFORM_ADDPATTERN_C2 - Added psrand. - Added array overloads to the following functions: - ObjSprite2D_SetSourceRect - ObjSprite2D_SetDestRect - ObjSpriteList2D_SetSourceRect - ObjSpriteList2D_SetDestRect - ObjSprite3D_SetSourceRect - ObjSprite3D_SetDestRect - ObjSprite3D_SetSourceDestRect - Added support for hexadecimal numbers in text color tags. - "[f tc=0xffffff]" is equivalent to "[f tc=(255,255,255)]". - Added GetWorkingDirectory. - Added an option to allow the engine to keep running while the window is unfocused. (Thanks to Naudiz) - Added SetEnableUnfocusedProcessing and IsWindowFocused. - Added the property "unfocused.processing" to th_dnh.def. - Added EV_APP_LOSE_FOCUS and EV_APP_RESTORE_FOCUS. - Added exponent format for numbers. - "5.462e3" or "-231.9e-2" are now valid numbers. - Added ObjItem_SetAutoCollectEnableFlags. - ITEM_AUTOCOLLECT_PLAYER_SCOPE - ITEM_AUTOCOLLECT_COLLECT_ALL - ITEM_AUTOCOLLECT_POC_LINE - ITEM_AUTOCOLLECT_COLLECT_CIRCLE - ITEM_AUTOCOLLECT_ALL - Added an overload to atoi. - Added SetScore, SetGraze, and SetPoint. Bug fixes: - Fixed .dat archives not working. - Fixed incorrect null checks, resulting in the game crashing when trying to operate on a null value. - For example, using Obj_GetValue on a non-existent key will yield a null value. - Fixed a crash bug which may sometimes happen when trying to parse a script file that ends with a line comment. - Fixed ObjMove_AddPatternXX's shot graphic change not working with loose and curvy lasers. - Fixed SetShotIntersectionCircle/Line not registering intersection, despite showing up in intersection visualization. 1.31b Bug fixes: - Fixed a bug where the game would freeze when compiling a script with a syntax error. - Fixed a minor visual bug where the LogWindow's sub-info fields would all try to display over each other on initialization. 1.31a Changes: - This version breaks replay, common data, and .dat archive backwards compatibility. - Replaced the default script select backgrounds with a radder version. (Thanks to Naudiz) - Renamed GetShotIdAll to GetAllShotID. - Changed the text representation of script value types in error messages. - "real-array-array" -> "real[][]" - Script matrix functions can now take in a 4x4 array instead of only a 1x16 array previously. - The element type is also no longer limited to real. - Made setting ObjRender_SetEnableDefaultTransformMatrix to false still load the camera matrix. - Allowed multiple ObjSounds to independently stream the same sound file. - Shortened the module directory in Log messages of the LogWindow to "../". - Removed the behaviour where the 2D and 3D camera resets upon transitioning from the package scene to the stage scene. - Fog data is no longer split between package-level and stage-level scripts. - The default FPS counter no longer briefly appears when starting with package.script.main. - Maximizing the window now triggers fullscreen mode. - Objects now have separate tables each for string-indexed and int-indexed. - Improved support for particle list objects for older PCs. - Made it so that curvy lasers can be shortened. (Thanks to Naudiz) - ObjFileT_SplitLineText now splits from pattern rather than from a list of delimiters. - Reduced the float truncation epsilon. (0.01 -> 0.000001) - #include in shader source files now behaves like regular script includes. - Normal shot objects can now have multiple hitboxes again. - Change loose and curvy lasers behaviour when delay motion is enabled. (Thanks to Naudiz) - Text objects can now be centered around their object positions. No need to use ObjText_SetMaxWidth for that anymore. (Thanks to Naudiz) Additions: - Added missing function documentation for GetAllEnemyID. - Added an overload each for Rotate2D and Rotate3D, taking in the rotation origin point. - Expanded the variety of intersection-checking functions: - IsIntersected_Point_Polygon - IsIntersected_Point_Circle - IsIntersected_Point_Ellipse - IsIntersected_Point_Line - IsIntersected_Point_RegularPolygon - IsIntersected_Circle_Polygon - IsIntersected_Circle_Circle - IsIntersected_Circle_Ellipse - IsIntersected_Circle_RegularPolygon - IsIntersected_Line_Polygon - IsIntersected_Line_Circle - IsIntersected_Line_Ellipse - IsIntersected_Line_Line - IsIntersected_Line_RegularPolygon - IsIntersected_Polygon_Polygon - IsIntersected_Polygon_Ellipse - IsIntersected_Polygon_RegularPolygon - Added ReflectAngle and ReflectAngleR. (Thanks to Naudiz) - Added Python-style reverse indexing of arrays. (Thanks to Naudiz) - See "New Scripting Features". - arr[-n] is equivalent to arr[length(arr) - n] - Also works in erase and insert. - Added replace and remove. (Thanks to Naudiz) - #ifdef, #ifndef, #else, and #endif preprocessor directives for scripts. - Several script macros were added: - _DNH_PH3SX_ - SCRIPT_PACKAGE (defined in package-level scripts) - SCRIPT_STAGE (defined in stage-level scripts) - #define is not yet supported. - Added ObjItem_GetIntersectionEnable. (Thanks to Naudiz) - Added ObjRender_GetColorHex, ObjPrim_GetVertexColorHex, and ObjCrLaser_GetNodeColorHex. (Thanks to Naudiz) - Added ColorHexRGBtoHSV. - Added another event argument to EV_DELETE_SHOT_PLAYER. - Added a "Sound Memory" display to the Sound tab of the LogWindow. - Added INFO_IS_REQUIRE_ALL_DOWN to ObjEnemyBossScene_GetInfo. (Thanks to Naudiz) - Added ObjEnemy_SetMaximumDamage and ObjEnemy_AddLifeEx. - Added INFO_DAMAGE_PREVIOUS_FRAME to ObjEnemy_GetInfo. - Added ObjText_SetFixedWidth. - Added ObjText_GetText. (Thanks to Naudiz) - Added ObjText_SetVerticalAlignment. (Thanks to Naudiz) - Added ObjCrLaser_SetTipCapping, ObjCrLaser_GetNodeRenderWidth, and ObjCrLaser_SetNodeRenderWidth. (Thanks to Naudiz) - Added overloads to ObjCrLaser_SetNode and ObjCrLaser_AddNode. (Thanks to Naudiz) - Added ObjShot_SetFixedAngle and ObjShot_SetDelayAngularVelocity. (Thanks to Naudiz) - Added SplitString2. - Added Obj_GetValueCount and Obj_GetValueCountI. - Added a progress bar to the FileArchiver. - Added an overload to SetStgFrame. (Thanks to Naudiz) - Added GetConfigVirtualKeyMapping and GetVirtualKeyMapping. (Thanks to Naudiz) Bug fixes: - Fixed incorrect documentation of IsIntersected_Circle_RegularPolygon. - Fixed the Y shot intersection scale not functioning properly on loose lasers. - Fixed the engine crashing upon trying to parse an excess comma in function parameter lists. - Fixed type-checking bugs with array-index-assignment operations. - Fixed an issue where the parser would indefinitely hang upon trying to parse an ill-formed for-loop. - Fixed a bug where .wav files over 1MB large would get cut off at the end. - Fixed a bug where multiple streaming ObjSounds playing the same file would not function correctly. - Fixed ObjSound_IsPlaying returning false if called in the same frame of ObjSound_Play. - Fixed a bug where shot objects colliding with the player gets deleted before EV_HIT is notified. - Fixed GetShotIdInCircleA1 incorrectly returning player shot IDs instead of enemy shot IDs. - Fixed ObjShot_Regist in a player script returning null if IsPermitPlayerShot is true. - Fixed a bug where the shot object colliding with the player is deleted before the notification of EV_HIT. - Fixed off-centered shot and item graphics. - Fixed the game crashing upon trying to parse an ill-formed argument list in user shot/item data files. - Fixed a bug where 3D render objects drawn below the min STG frame render priority would get abnormally stretched out. - Fixed ObjMove_GetSpeedX/Y returning incorrect values for ObjMove_SetDestAtXXX functions. - Fixed the game crashing when setting ObjRender_SetEnableDefaultTransformMatrix to false for 3D objects. - Fixed incorrect conversion of A-movement to B-movement for ObjMove. - Fixed CreateItemU1/2 causing the created item to render at (0, 0) for a single frame. (Thanks to Naudiz) - Fixed ObjMove_AddPatternXX not working on move objects that do not have an existing movement pattern. (Thanks to Naudiz) - Fixed a rare bug with array initialization. - Fixed a bug where ObjShot_SetPenetration(obj, 0) would not notify EV_DELETE_SHOT_PLAYER. - Fixed a rare crash during enemy boss scene loading. - Fixed a bug where the game would freeze when trying to restart the stage scene in a package script while an enemy boss scene hasn't finished loading. - Fixed a rare crash with script object deletion. 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. - Additionally, the above two functions now take in varargs. - 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 new array functions: contains, insert. - 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. - Also updated the shader source files in the sample scripts with this fix. - 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.