Compare commits
No commits in common. "main" and "master" have entirely different histories.
BIN
LogWindow.dat
|
@ -1 +0,0 @@
|
||||||
test manual
|
|
|
@ -1,2 +1,3 @@
|
||||||
# NarumiSTG
|
# NarumiSTG_HyperSnowDrifter
|
||||||
vidya games
|
|
||||||
|
Touhou Game Jam 10 project by Kevinmonitor and co. Early jam window (22-26 January).
|
|
@ -1,53 +0,0 @@
|
||||||
CONTROLS:
|
|
||||||
|
|
||||||
KEY (DEFAULT) ACTION
|
|
||||||
|
|
||||||
Arrow Keys Movement
|
|
||||||
Z/SHOT Select/Hold to Fire Blast (TYPE 1)
|
|
||||||
X/SPELL Cancel/Hold to use BULLET GOLEM (Limited Power, Refillable)
|
|
||||||
C/USER 1 Hold to use Fire Blast (TYPE 2)
|
|
||||||
Shift/SLOW Hold to slow player for precise movement
|
|
||||||
Esc Pause (in-game)
|
|
||||||
Esc+R Quick Retry (In-game)
|
|
||||||
Esc+Q Quick Exit to Title (In-game)
|
|
||||||
|
|
||||||
These controls can all be re-binded in config.exe.
|
|
||||||
You can also set the game window size and anti-aliasing level.
|
|
||||||
|
|
||||||
MANUAL:
|
|
||||||
|
|
||||||
READ THE IN-GAME MANUAL!!! PLEASE!!!!!!!!!!!
|
|
||||||
|
|
||||||
SCORE RANKINGS:
|
|
||||||
|
|
||||||
As the in-game manual mentions, your final score will get a letter ranking (from C to S).
|
|
||||||
The exact thresholds for each letter ranking are:
|
|
||||||
|
|
||||||
U-Rank (Unbeatable): 300,000,000
|
|
||||||
S-Rank: 240,000,000
|
|
||||||
A-Rank: 160,000,000
|
|
||||||
B-Rank: 100,000,000
|
|
||||||
C-Rank: Lower scores
|
|
||||||
|
|
||||||
CHANGELOG:
|
|
||||||
|
|
||||||
1.00b2 (QoL)
|
|
||||||
|
|
||||||
- No gameplay changes: old replays are flagged as compatible.
|
|
||||||
|
|
||||||
- Fixed the background opacity setting not working properly.
|
|
||||||
- Fixed misaccuracies in granting score rankings.
|
|
||||||
- Narumi character artwork revamped slightly.
|
|
||||||
- Added "Explosion Opacity" option to the Settings Menu. This option lets you set the opacity of enemy explosions.
|
|
||||||
- Added an additional ranking for obtaining 400 million points, because someone apparently got really close to that. seriously what the hell
|
|
||||||
|
|
||||||
1.00b
|
|
||||||
|
|
||||||
- Fixed a bug where you could continue to use BULLET GOLEM after running out of energy.
|
|
||||||
- Buffed Narumi's damage by 12.5%.
|
|
||||||
- Shrunk Narumi's hitbox size from 2px to 1px.
|
|
||||||
- Re-positioned some bullet hitboxes.
|
|
||||||
|
|
||||||
1.00a
|
|
||||||
|
|
||||||
- Initial release.
|
|
BIN
config.dat
BIN
config_ph3sx.exe
|
@ -1,550 +0,0 @@
|
||||||
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.
|
|
|
@ -1,5 +0,0 @@
|
||||||
[{000214A0-0000-0000-C000-000000000046}]
|
|
||||||
Prop3=19,11
|
|
||||||
[InternetShortcut]
|
|
||||||
IDList=
|
|
||||||
URL=https://github.com/Natashi/Touhou-Danmakufu-ph3sx-2
|
|
|
@ -1,605 +0,0 @@
|
||||||
Preamble:
|
|
||||||
|
|
||||||
The following keywords are used to clarify the importance of each convention: MUST, SHOULD, MAY, SHOULD NOT, MUST NOT.
|
|
||||||
|
|
||||||
In the code examples below, the sequence "// ..." (two slashes, one space, three full stops) denotes a line where, in most cases, more code should be written.
|
|
||||||
However, such code is unnecessary for the purposes of each example.
|
|
||||||
|
|
||||||
Comments from the writer that do not necessarily dictate style guidelines are preceded by the sequence "// NAZ: ".
|
|
||||||
|
|
||||||
1: Identifiers
|
|
||||||
|
|
||||||
1.1: Variables and Constants
|
|
||||||
|
|
||||||
Note:
|
|
||||||
|
|
||||||
Variables and constants SHOULD be declared with explicit type keywords (float, int, bool, char, string, etc.), unless the type is unknown,
|
|
||||||
in which case either "let" or "var" is used. These keywords are interchangeable, but the scripter MUST decide on one to use consistently.
|
|
||||||
|
|
||||||
Variables MUST be written using camelCase*, while constants MUST use SCREAMING_SNAKE_CASE.
|
|
||||||
Related identifiers SHOULD share the leading parts of their names for alphabetization purposes.
|
|
||||||
|
|
||||||
In cases where variables have short names or are uninitialized, multiple variables MAY be declared on the same line, separated by commas.
|
|
||||||
They SHOULD be of the same type, so fewer keywords are necessary.
|
|
||||||
|
|
||||||
*If necessary, a prefix or suffix MAY be added to a variable in the snake_case style.
|
|
||||||
|
|
||||||
DO:
|
|
||||||
|
|
||||||
float posX, posY;
|
|
||||||
const int BOSS_RUMIA = 0;
|
|
||||||
const int BOSS_CIRNO = 1;
|
|
||||||
|
|
||||||
DON'T:
|
|
||||||
|
|
||||||
let xPos;
|
|
||||||
let yPos;
|
|
||||||
const RUMIA_BOSS = 0, CIRNO_BOSS = 1;
|
|
||||||
|
|
||||||
|
|
||||||
1.1.1: Local Variables
|
|
||||||
|
|
||||||
Variables defined within a local scope, such as inside a function or task, MUST use camelCase without any underscores.
|
|
||||||
|
|
||||||
EXAMPLE:
|
|
||||||
|
|
||||||
function<void> DoSomething()
|
|
||||||
{
|
|
||||||
float posX, posY;
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
1.1.2: Global Variables
|
|
||||||
|
|
||||||
Variables defined globally in any script SHOULD be denoted with a leading underscore.
|
|
||||||
This is similar to the notation used for tasks, but with camelCase instead of PascalCase.
|
|
||||||
|
|
||||||
EXAMPLE:
|
|
||||||
|
|
||||||
int _objEnemy;
|
|
||||||
int _objPlayer;
|
|
||||||
|
|
||||||
@Initialize
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
1.1.3: Parameters
|
|
||||||
|
|
||||||
Function and task parameters SHOULD be denoted with a trailing underscore.
|
|
||||||
|
|
||||||
Parameters SHOULD be declared with type keywords, or either "let" or "var" if unknown.
|
|
||||||
|
|
||||||
EXAMPLE:
|
|
||||||
|
|
||||||
function<void> DoSomethingElse(int foo_, float bar_)
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
1.1.4: Iterators
|
|
||||||
|
|
||||||
Iterator variables declared in for-loops, ascent-loops, and descent-loops SHOULD be named lowercase letters of the alphabet starting with "i",
|
|
||||||
progressing to the next letter for each nested loop. This convention MAY be bypassed if more semantic information is necessary.
|
|
||||||
|
|
||||||
Iterator variables declared in for-each-loops SHOULD have single-word names prefixed with "i".
|
|
||||||
|
|
||||||
Fun fact: It is possible to add a second iterator to a for-each-loop, which is listed before the first and iterates through the array's indices (starting from 0) instead of its elements.
|
|
||||||
This variable SHOULD follow the same rules as those declared in for-loops.
|
|
||||||
|
|
||||||
EXAMPLE:
|
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
|
||||||
ascent (j in 0 .. 3) {
|
|
||||||
descent (k in 0 .. 4) {
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for each (iObj in arrObj) {
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
for each ((i, iObj) in arrObj) {
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
1.1.5: Constants
|
|
||||||
|
|
||||||
As mentioned previously, constants MUST use SCREAMING_SNAKE_CASE. All constants SHOULD be defined in a dedicated constant library.
|
|
||||||
Numeric constants SHOULD be integers instead of float numbers (denoted in decimal literals by appending the character "i" at the end,
|
|
||||||
but this is not necessary if the constant type is explicitly defined).
|
|
||||||
|
|
||||||
|
|
||||||
EXAMPLE:
|
|
||||||
|
|
||||||
const int PLAYER_REIMU = 0;
|
|
||||||
const int PLAYER_MARISA = 1;
|
|
||||||
const int PLAYER_SAKUYA = 2;
|
|
||||||
const int PLAYER_SANAE = 3;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1.2: Functions, Tasks, and Subroutines
|
|
||||||
|
|
||||||
Note:
|
|
||||||
|
|
||||||
|
|
||||||
Function, task, and subroutine names all MUST use PascalCase to differentiate them from other identifiers.
|
|
||||||
The root of the identifier name SHOULD begin with a verb.
|
|
||||||
|
|
||||||
// NAZ: The "Is...Exists" structure is Engrish through and through, but I use it for consistency with built-in function names.
|
|
||||||
|
|
||||||
EXAMPLE:
|
|
||||||
|
|
||||||
function<void> DoSomething()
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
function<int> GetSomething(int foo_)
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
function<void> SetSomething(int foo_, float bar_)
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
function<bool> IsSomethingExists(int foo_)
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
1.2.1: Functions
|
|
||||||
|
|
||||||
Functions SHOULD be declared with explicit type keywords in angle brackets, unless the type is unknown or variant.
|
|
||||||
|
|
||||||
Function names MUST use PascalCase with no underscores.*
|
|
||||||
Function calls require trailing parentheses, even when there are no arguments.
|
|
||||||
|
|
||||||
*Excluding cases where there is a necessary prefix or suffix denoting important information, such as object type.
|
|
||||||
|
|
||||||
EXAMPLE:
|
|
||||||
|
|
||||||
function<void> DoSomething()
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
function<void> DoSomethingElse(bool foo_, float bar_)
|
|
||||||
{
|
|
||||||
DoSomething();
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
function<void> Obj_DoSomething(int obj_)
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
function<void> DoSomething_Obj_Obj(int obj1_, int obj2_)
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
1.2.2: Tasks
|
|
||||||
|
|
||||||
Task names SHOULD use one of the following styles (and consistently): PascalCase with a leading underscore, OR PascalCase with a leading uppercase T.
|
|
||||||
The same rules about affixes and parentheses that apply to functions apply here.
|
|
||||||
|
|
||||||
// NAZ: I like to treat my tasks as private routines, so often times you'll see me create a "public" function that calls task nested inside.
|
|
||||||
|
|
||||||
EXAMPLE:
|
|
||||||
|
|
||||||
task _RenderPlayer(int id_)
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
task _RenderPlayer_Reimu()
|
|
||||||
{
|
|
||||||
_RenderPlayer(PLAYER_REIMU);
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
1.2.3: Subroutines
|
|
||||||
|
|
||||||
Subroutines MUST use PascalCase, and SHOULD include a trailing underscore. Parentheses MAY be used.
|
|
||||||
|
|
||||||
It is possible to use the at sign (@) in place of the "sub" keyword, but scripters SHOULD NOT do so, to prevent confusion with built-in routines (@Initialize, @MainLoop, @Finalize, etc.).
|
|
||||||
|
|
||||||
// NAZ: I don't think I've ever used one of these, lol. I came up with the underscore rule on the fly.
|
|
||||||
|
|
||||||
EXAMPLE:
|
|
||||||
|
|
||||||
sub DoSomethingDifferent_
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
2: Whitespace
|
|
||||||
|
|
||||||
Note:
|
|
||||||
|
|
||||||
For the sake of consistency, spaces SHOULD be used instead of tabs in ALL cases.
|
|
||||||
The default tab is equivalent to 4 spaces; any decent editor should have an option to insert spaces upon pressing the tab key.
|
|
||||||
|
|
||||||
2.1: Operators
|
|
||||||
|
|
||||||
Expressions and statements consisting of one or more literals and/or identifiers MUST employ one space on both sides of all binary and ternary operators
|
|
||||||
(= +, -, *, /, ~/, %, ^, ~, +=, -=, *=, /=, ~/=, %=, ^=, ~=, ==, !=, >, <, >=, <=, &&, ||, &, |, ^^, .., ?, :).
|
|
||||||
|
|
||||||
Expressions and statements consisting of an identifier and a unary operator (!, ++, --) MUST NOT employ a space between the operator and operand.
|
|
||||||
|
|
||||||
DO:
|
|
||||||
|
|
||||||
float someNum = 6 * 9 + 4 / 20 - 6 % 66;
|
|
||||||
someNum++;
|
|
||||||
|
|
||||||
DON'T:
|
|
||||||
|
|
||||||
float someNum = 6*9+4/20-6%66;
|
|
||||||
someNum ++;
|
|
||||||
|
|
||||||
// NAZ: I will send you to the Shadow Realm if you don't put spaces in between your operators like in the "DON'T" example. It's entirely unreadable for me.
|
|
||||||
|
|
||||||
2.2: Variables and Constants
|
|
||||||
|
|
||||||
Variable and constant declaration and assignment statements MUST employ one space between the keyword (let, var, const) and the identifier,
|
|
||||||
and on both sides of the assignment operator (=) if applicable.*
|
|
||||||
|
|
||||||
As stated previously, if identifiers have short names or are uninitialized, their declarations MAY go on the same line, separated by commas and followed by spaces.
|
|
||||||
|
|
||||||
*Additional spaces MAY be used to vertically align the operator and right-hand side of each statement in a group of statements. See the example.
|
|
||||||
|
|
||||||
EXAMPLE:
|
|
||||||
|
|
||||||
const int BGM_TITLE = 0;
|
|
||||||
const int BGM_1_ROAD = 1;
|
|
||||||
const int BGM_1_BOSS = 2;
|
|
||||||
const int BGM_GAMEOVER = 3;
|
|
||||||
|
|
||||||
|
|
||||||
2.3: Functions, Tasks, and Subroutines
|
|
||||||
|
|
||||||
Function, task, and subroutine definitions MUST employ one space between the keyword (function, task, or sub) and the identifier,
|
|
||||||
and NO space between the identifier and the parentheses, differently from flow control statements.
|
|
||||||
Parameters contained inside the parentheses MUST employ one space between each identifier, i.e. after each comma.
|
|
||||||
|
|
||||||
The opening and closing braces of a function, task, or subroutine block MUST go on their own lines, and all lines in between them MUST be indented.
|
|
||||||
There MUST also be an empty line following each closing brace.
|
|
||||||
The same rules also apply to @Initialize, @MainLoop, @Event, @Finalize, and @Loading.
|
|
||||||
|
|
||||||
// Natashi: I don't like placing opening curly braces on newlines. *turns half of your body into pizza dough*
|
|
||||||
|
|
||||||
Function, task, and subroutine invocations MUST NOT include a space between the identifier and parentheses, if applicable.
|
|
||||||
Like parameters, arguments MUST be separated by whitespace, i.e. after each comma.
|
|
||||||
|
|
||||||
Function and task arguments MAY span several indented lines for readability purposes.
|
|
||||||
There SHOULD be an empty space following each multi-line function call, unless it precedes a closing brace or parenthesis.
|
|
||||||
|
|
||||||
// NAZ: This is only really applicable if the arguments get unbearably long, though. The example just demonstrates it just because.
|
|
||||||
|
|
||||||
EXAMPLE:
|
|
||||||
|
|
||||||
@Initialize
|
|
||||||
{
|
|
||||||
DoSomething(
|
|
||||||
true,
|
|
||||||
1,
|
|
||||||
1.1,
|
|
||||||
'e',
|
|
||||||
"abc"
|
|
||||||
);
|
|
||||||
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
function<void> DoSomething(bool foo_, int bar_, float baz_, char qux_, string quux_)
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
2.4: Flow Control Statements
|
|
||||||
|
|
||||||
Flow control statements MUST employ whitespace on both sides of each keyword
|
|
||||||
(if, else, loop, while, ascent, descent, in, for, each, alternative, case, others, switch, default, local, yield, break, continue),
|
|
||||||
unless said keyword by itself is a statement (yield, break, continue), in which case it is simply terminated with a semicolon.
|
|
||||||
|
|
||||||
For conditionals and loops, the opening curly brace SHOULD go on the same line as the preceding keyword or closing parenthesis, following a space.*
|
|
||||||
The closing curly brace SHOULD go on its own line, except in the case of "else" and "else if" which SHOULD be written after a space following the closing brace.
|
|
||||||
Loops and conditional structures SHOULD be followed by an empty line.
|
|
||||||
|
|
||||||
For for-loops, each statement ending in a semicolon MUST be followed by a space, i.e. the first and second.
|
|
||||||
The second and third statements may be omitted, in which case a space SHOULD be used instead.
|
|
||||||
When statements are combined with commas, there MUST be a space after each of them.
|
|
||||||
|
|
||||||
*Conditionals and loops containing a single statement terminated with a semicolon MAY be written without curly braces,
|
|
||||||
in which case they SHOULD be written on the same line as the rest of the statement, following a space.
|
|
||||||
Nested conditionals and loops may also be written without curly braces, provided that there is only one semicolon-terminated statement within it.
|
|
||||||
Alternative cases written this way MAY use additional spaces to align their contents.
|
|
||||||
|
|
||||||
EXAMPLE 1 (VERBOSE):
|
|
||||||
|
|
||||||
for (int i = 1, j = 2; i <= 10; i++, j--) {
|
|
||||||
alternative (i)
|
|
||||||
case (1) {
|
|
||||||
WriteLog("i is 1!", "j is 2!");
|
|
||||||
}
|
|
||||||
case (2) {
|
|
||||||
WriteLog("i is 2!", "j is 1!");
|
|
||||||
}
|
|
||||||
others {
|
|
||||||
WriteLog("I can't count that high!");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i >= 3) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
loop (5) {
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
EXAMPLE 2 (CONCISE):
|
|
||||||
|
|
||||||
for (int i = 1, j = 2; i <= 10; i++, j--) {
|
|
||||||
alternative (i)
|
|
||||||
case (1) WriteLog("i is 1!", "j is 2!");
|
|
||||||
case (2) WriteLog("i is 2!", "j is 1!");
|
|
||||||
others WriteLog("I can't count that high!");
|
|
||||||
|
|
||||||
if (i >= 3) break;
|
|
||||||
else loop (5) yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NAZ: With "wait" being built-in there's no use case for "loop (n) yield;".
|
|
||||||
// NAZ: I simply wanted to demonstrate nested structures and how they can be shortened.
|
|
||||||
|
|
||||||
2.5: Arrays
|
|
||||||
|
|
||||||
Arrays elements MUST be separated by whitespace, i.e. after each comma.
|
|
||||||
|
|
||||||
Multidimensional or otherwise verbose arrays MAY be written across several indented lines.
|
|
||||||
The initial opening square brace MUST go on the same line as the operator that precedes it.
|
|
||||||
The new lines and indenting SHOULD be consistent throughout each dimension of the array.
|
|
||||||
There SHOULD be an empty space following each multi-line array, unless it precedes a closing brace or parenthesis.
|
|
||||||
|
|
||||||
For performance reasons, arrays SHOULD be indexed as infrequently as possible.
|
|
||||||
If only one element is needed, storing it in a variable is recommended.
|
|
||||||
|
|
||||||
EXAMPLE:
|
|
||||||
|
|
||||||
int[] arrSmall = [1, 2, 3];
|
|
||||||
int[][] arrBig = [
|
|
||||||
[1, 2, 3],
|
|
||||||
[4, 5, 6, 7],
|
|
||||||
[8, 9, 10, 11, 12]
|
|
||||||
];
|
|
||||||
|
|
||||||
int[][][] arrBigger = [
|
|
||||||
[
|
|
||||||
[1, 2, 3],
|
|
||||||
[4, 5, 6, 7],
|
|
||||||
], [
|
|
||||||
[8, 9, 10, 11, 12],
|
|
||||||
[13, 14, 15, 16, 17, 18],
|
|
||||||
[19, 20, 21, 22, 23, 24, 25],
|
|
||||||
]
|
|
||||||
];
|
|
||||||
|
|
||||||
int numSmall = arrSmall[2];
|
|
||||||
int numBig = arrBig[2][4];
|
|
||||||
int numBigger = arrBigger[1][2][6];
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3: Organization
|
|
||||||
|
|
||||||
3.1: Script Structure
|
|
||||||
|
|
||||||
All scripts SHOULD have their sections organized in the following order:
|
|
||||||
|
|
||||||
1. Headers (#TouhouDanmakufu, #ScriptVersion*, #Title, #Text, #System, #Background, #BGM)
|
|
||||||
2. #include directives
|
|
||||||
3. Global variables
|
|
||||||
4. Predefined routines (@Initialize, @Event, @MainLoop, @Finalize, @Loading)
|
|
||||||
5. Script-specific routines
|
|
||||||
|
|
||||||
*The #ScriptVersion header can only take one possible argument (3), and SHOULD be omitted altogether.
|
|
||||||
|
|
||||||
EXAMPLE:
|
|
||||||
|
|
||||||
#TouhouDanmakufu[Stage]
|
|
||||||
#Title["Example Stage"]
|
|
||||||
#Text["An example of a stage script."]
|
|
||||||
#System["script/script_system.dnh"]
|
|
||||||
|
|
||||||
#include "script/include_stg.dnh"
|
|
||||||
|
|
||||||
int _idScript;
|
|
||||||
|
|
||||||
@Initialize
|
|
||||||
{
|
|
||||||
_idScript = GetOwnScriptID();
|
|
||||||
_Main();
|
|
||||||
}
|
|
||||||
|
|
||||||
@MainLoop
|
|
||||||
{
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Finalize
|
|
||||||
{
|
|
||||||
WriteLog("Game over!");
|
|
||||||
}
|
|
||||||
|
|
||||||
task _Main()
|
|
||||||
{
|
|
||||||
while (GetPlayerState() != STATE_END) yield;
|
|
||||||
CloseScript(_idScript);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
3.2: Included Files
|
|
||||||
|
|
||||||
As a preface, what the #include directive does is tell the engine to copy the contents of a given text file and paste them into the script, replacing the #include directive.
|
|
||||||
If a file has already been included in the script, it will be skipped.
|
|
||||||
|
|
||||||
To reduce the amount of boilerplate in each script file, the scripter SHOULD create files with the express purpose of including several other files, ideally in a hierarchical manner.
|
|
||||||
|
|
||||||
DO:
|
|
||||||
// In include_main.dnh
|
|
||||||
|
|
||||||
#include "./lib_main.dnh"
|
|
||||||
#include "./lib_const.dnh"
|
|
||||||
#include "./lib_math.dnh"
|
|
||||||
#include "./lib_render.dnh"
|
|
||||||
#include "./lib_event.dnh"
|
|
||||||
|
|
||||||
// In include_stg.dnh
|
|
||||||
|
|
||||||
#include "./include_main.dnh"
|
|
||||||
#include "./lib_stg.dnh"
|
|
||||||
#include "./lib_move.dnh"
|
|
||||||
#include "./lib_shot.dnh"
|
|
||||||
#include "./lib_enemy.dnh"
|
|
||||||
|
|
||||||
// In include_boss.dnh
|
|
||||||
|
|
||||||
#include "./include_stg.dnh"
|
|
||||||
#include "./lib_boss.dnh"
|
|
||||||
#include "./lib_anim.dnh"
|
|
||||||
#include "./lib_spell.dnh"
|
|
||||||
|
|
||||||
// In the main script
|
|
||||||
|
|
||||||
#TouhouDanmakufu[Single]
|
|
||||||
// ...
|
|
||||||
|
|
||||||
#include "script/include_boss.dnh"
|
|
||||||
|
|
||||||
@Initialize
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
DON'T:
|
|
||||||
|
|
||||||
// In the main script
|
|
||||||
|
|
||||||
#TouhouDanmakufu[Single]
|
|
||||||
// ...
|
|
||||||
|
|
||||||
#include "./lib_main.dnh"
|
|
||||||
#include "./lib_const.dnh"
|
|
||||||
#include "./lib_math.dnh"
|
|
||||||
#include "./lib_render.dnh"
|
|
||||||
#include "./lib_event.dnh"
|
|
||||||
#include "./lib_stg.dnh"
|
|
||||||
#include "./lib_move.dnh"
|
|
||||||
#include "./lib_shot.dnh"
|
|
||||||
#include "./lib_enemy.dnh"
|
|
||||||
#include "./lib_boss.dnh"
|
|
||||||
#include "./lib_anim.dnh"
|
|
||||||
#include "./lib_spell.dnh"
|
|
||||||
|
|
||||||
@Initialize
|
|
||||||
{
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// NAZ: These file paths assume that the script as well as all of the library files are located in the base script directory.
|
|
||||||
// NAZ: Ideally, you should have a dedicated lib folder, possibly with subfolders corresponding to the libraries contained in each "include" file.
|
|
||||||
|
|
||||||
3.3: Script Routines
|
|
||||||
|
|
||||||
Scripts (particularly those in which danmaku is created) SHOULD call a task named _Main (or TMain, depending on your chosen style) from @Initialize.
|
|
||||||
This task SHOULD be the ultimate source of all other script-specific routine invocations.
|
|
||||||
|
|
||||||
The scripter SHOULD make use of nesting for a few reasons:
|
|
||||||
|
|
||||||
1. To ensure that variables are limited to their intended scopes.
|
|
||||||
2. To prevent the need to pass variables around unnecessarily via arguments.
|
|
||||||
|
|
||||||
EXAMPLE 1 (NON-NESTED):
|
|
||||||
|
|
||||||
task _Main()
|
|
||||||
{
|
|
||||||
float dir;
|
|
||||||
|
|
||||||
loop {
|
|
||||||
dir = rand(0, 360);
|
|
||||||
_Fire(dir);
|
|
||||||
wait(60);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task _Fire(float dir_)
|
|
||||||
{
|
|
||||||
float speed = 1;
|
|
||||||
|
|
||||||
loop (5) {
|
|
||||||
Shoot(speed, dir_);
|
|
||||||
speed++;
|
|
||||||
wait(2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function<void> Shoot(float speed_, float dir_)
|
|
||||||
{
|
|
||||||
int obj = CreateShotA1(someX, someY, speed_, dir_, someID, 15);
|
|
||||||
ObjShot_SetDeleteFrame(obj, 180);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXAMPLE 2 (NESTED):
|
|
||||||
|
|
||||||
task _Main()
|
|
||||||
{
|
|
||||||
float dir;
|
|
||||||
|
|
||||||
loop {
|
|
||||||
dir = rand(0, 360);
|
|
||||||
_Fire();
|
|
||||||
wait(60);
|
|
||||||
}
|
|
||||||
|
|
||||||
task _Fire()
|
|
||||||
{
|
|
||||||
float speed = 1;
|
|
||||||
|
|
||||||
loop (5) {
|
|
||||||
Shoot_;
|
|
||||||
speed++;
|
|
||||||
wait(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub Shoot_
|
|
||||||
{
|
|
||||||
int obj = CreateShotA1(someX, someY, speed, dir, someID, 15);
|
|
||||||
ObjShot_SetDeleteFrame(obj, 180);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NAZ: These examples are intentionally bare-bones and only exist for the purposes of demonstrating how nesting can simplify task and function signatures and establish a sense of hierarchy.
|
|
||||||
|
|
|
@ -1,716 +0,0 @@
|
||||||
- Re: Syntax Tutorial
|
|
||||||
|
|
||||||
- Number literals
|
|
||||||
|
|
||||||
- Base literals
|
|
||||||
|
|
||||||
WriteLog(0b1011); //Binary literal, outputs 11
|
|
||||||
WriteLog(0o503); //Octal literal, outputs 323
|
|
||||||
WriteLog(0x8f62); //Hexadecimal literal, outputs 36706
|
|
||||||
|
|
||||||
Base literals default to integer type unless suffixed otherwise.
|
|
||||||
|
|
||||||
- Suffix
|
|
||||||
|
|
||||||
- "f" / "F"
|
|
||||||
Forces a number literal to a float type.
|
|
||||||
- "i" / "I"
|
|
||||||
Forces a number literal to an integer type.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
WriteLog(5); //5.000000
|
|
||||||
WriteLog(5f); //5.000000
|
|
||||||
WriteLog(5i); //5
|
|
||||||
WriteLog(0x5f); //95
|
|
||||||
WriteLog(0x5fi); //95
|
|
||||||
WriteLog(7.76); //7.760000
|
|
||||||
WriteLog(7.76f); //7.760000
|
|
||||||
WriteLog(7.76i); //7
|
|
||||||
|
|
||||||
- Digit separator
|
|
||||||
|
|
||||||
The "_" character can be used in number literals to aid in visibility.
|
|
||||||
Has no effect on the resultant value.
|
|
||||||
|
|
||||||
WriteLog(5000000000i); //5000000000
|
|
||||||
WriteLog(5_000_000_000i); //still 5000000000
|
|
||||||
WriteLog(0x7f23a7e2); //2133043170
|
|
||||||
WriteLog(0x7f23_a7e2); //still 2133043170
|
|
||||||
|
|
||||||
- Variables
|
|
||||||
|
|
||||||
- Explicit types
|
|
||||||
|
|
||||||
Originally, you'd declare a variable with one of these three keywords:
|
|
||||||
- let
|
|
||||||
- var
|
|
||||||
- real
|
|
||||||
All three keywords had the same effect on the declaration.
|
|
||||||
|
|
||||||
However, with version 1.30a, the scripting language has gone through a considerable amount of changes as follows:
|
|
||||||
- "real" has been renamed to "float". (1.32a)
|
|
||||||
|
|
||||||
- You may now explicitly state the type of the variable you are declaring.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
int a = 700; //typeof(a) == VAR_INT
|
|
||||||
float b = 56.243; //typeof(b) == VAR_FLOAT
|
|
||||||
char c = '0'; //typeof(c) == VAR_CHAR
|
|
||||||
bool d = false; //typeof(d) == VAR_BOOL
|
|
||||||
string e = "aubergine"; //typeof(e) == VAR_STRING
|
|
||||||
int[] f = [4i, 8]; //typeof(f) == VAR_ARRAY, ftypeof(f) == VAR_INT
|
|
||||||
|
|
||||||
- This does not change "let" and "var", they will still behave similarly to "auto" in C++.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
let a = 700i; //typeof(a) == VAR_INT
|
|
||||||
let b = 56.243; //typeof(b) == VAR_FLOAT
|
|
||||||
let c = '0'; //typeof(c) == VAR_CHAR
|
|
||||||
let d = false; //typeof(d) == VAR_BOOL
|
|
||||||
let e = "aubergine"; //typeof(e) == VAR_STRING
|
|
||||||
let f = [4i, 8]; //typeof(f) == VAR_ARRAY, ftypeof(f) == VAR_INT
|
|
||||||
|
|
||||||
- You may not use "let[]" or "const[]".
|
|
||||||
|
|
||||||
An array type declaration may only be used with a non-auto type.
|
|
||||||
|
|
||||||
- Multiple variables declaration.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
int a, b = 7, c = 100, d; //All will be of type "int"
|
|
||||||
const bool e = true, f = true; //All will be of type "const bool"
|
|
||||||
let g = 56, h = true, i = 6i; //g will be "float", h will be "bool", and i will be "int"
|
|
||||||
bool[][][] j, k; //All will be of type "bool[][][]" (3D bool array)
|
|
||||||
|
|
||||||
- Using "const"
|
|
||||||
|
|
||||||
"const" is used to declare constant variables.
|
|
||||||
|
|
||||||
A standalone "const" will behave like a "let".
|
|
||||||
"const" can be prefixed or suffixed by another type.
|
|
||||||
|
|
||||||
Constant variables cannot be modified.
|
|
||||||
Attempting to do so will throw a compile-time error.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
const a = 1;
|
|
||||||
const let b = true;
|
|
||||||
const string c = "xolotl";
|
|
||||||
const int d;
|
|
||||||
|
|
||||||
a = 6; //ERROR
|
|
||||||
d = 10; //ERROR
|
|
||||||
|
|
||||||
- Supplement for smart people
|
|
||||||
|
|
||||||
ph3sx script type | internal C type | size in bytes |
|
|
||||||
----------------------------------------------------------
|
|
||||||
int | int64_t | 8 |
|
|
||||||
float | double | 8 |
|
|
||||||
bool | bool | 1 |
|
|
||||||
char | wchar_t | 2 |
|
|
||||||
|
|
||||||
- Scoping
|
|
||||||
|
|
||||||
- "local" has been deprecated. While they have not yet been completely removed, it is advisable to stop using it.
|
|
||||||
|
|
||||||
- But what can I use in its place?
|
|
||||||
|
|
||||||
Nothing.
|
|
||||||
Literally.
|
|
||||||
|
|
||||||
What used to be:
|
|
||||||
|
|
||||||
local {
|
|
||||||
//...
|
|
||||||
}
|
|
||||||
|
|
||||||
can now be reduced to just:
|
|
||||||
|
|
||||||
{
|
|
||||||
//...
|
|
||||||
}
|
|
||||||
|
|
||||||
Scoping rules will still apply normally, like so:
|
|
||||||
|
|
||||||
let a;
|
|
||||||
|
|
||||||
//Only a is accessible here
|
|
||||||
|
|
||||||
{
|
|
||||||
let b;
|
|
||||||
|
|
||||||
//a and b are both accessible here
|
|
||||||
|
|
||||||
{
|
|
||||||
let c;
|
|
||||||
|
|
||||||
//a, b, and c are all accessible here
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- Operators
|
|
||||||
|
|
||||||
All available script operators are listed as follows.
|
|
||||||
They are arranged in order of precedence, highest-to-lowest.
|
|
||||||
|
|
||||||
1. ()
|
|
||||||
Function call
|
|
||||||
let c = SomeFunc(a, b);
|
|
||||||
1. as_x()
|
|
||||||
Type cast
|
|
||||||
let a = as_int(x);
|
|
||||||
let b = as_bool(56);
|
|
||||||
1. length()
|
|
||||||
Array length
|
|
||||||
let a = length(x);
|
|
||||||
let b = length([1, 2, 3]);
|
|
||||||
1. []
|
|
||||||
Array indexing
|
|
||||||
let a = arr[3];
|
|
||||||
let b = [10, 100, 1000][x];
|
|
||||||
1. (| |)
|
|
||||||
Absolute
|
|
||||||
let a = (|-4|); //a == 4
|
|
||||||
let b = (|a|); //b == 4
|
|
||||||
1. ()
|
|
||||||
Parentheses
|
|
||||||
2. ^
|
|
||||||
Power (Right-associative)
|
|
||||||
let a = 2 ^ 4; //a == 16
|
|
||||||
let b = 2 ^ 2 ^ 3; //b == 256
|
|
||||||
2. [..]
|
|
||||||
Array slice
|
|
||||||
let x = [9, 10, 11, 12, 13];
|
|
||||||
let a = x[0..2]; //a == [9, 10]
|
|
||||||
let b = x[2..999]; //b == [11, 12, 13]
|
|
||||||
let c = x[3..0]; //c == [11, 10, 9]
|
|
||||||
3. +
|
|
||||||
Unary plus
|
|
||||||
let a = +6;
|
|
||||||
3. -
|
|
||||||
Unary minus
|
|
||||||
let a = -10;
|
|
||||||
3. !
|
|
||||||
Unary logical not
|
|
||||||
let a = !b;
|
|
||||||
3. ~
|
|
||||||
Unary bitwise not
|
|
||||||
let a = ~312; //a == -313
|
|
||||||
let b = ~(0b1011001); //b == -90
|
|
||||||
4. *
|
|
||||||
Multiply
|
|
||||||
let a = 4 * 10; //a == 40
|
|
||||||
4. /
|
|
||||||
Divide
|
|
||||||
let a = 10 / 3; //a == 3.333333
|
|
||||||
4. ~/
|
|
||||||
Floored divide
|
|
||||||
let a = 10 ~/ 3; //a == 3
|
|
||||||
4. %
|
|
||||||
Remainder (Modulo)
|
|
||||||
let a = 7 % 4; //a == 3
|
|
||||||
5. +
|
|
||||||
Add
|
|
||||||
let a = 3 + 32; //a == 35
|
|
||||||
5. -
|
|
||||||
Subtract
|
|
||||||
let a = 9 - 12; //a == -3
|
|
||||||
5. ~
|
|
||||||
Array concatenate
|
|
||||||
let a = [8, 3] ~ [10]; //a == [8, 3, 10]
|
|
||||||
6. <<
|
|
||||||
Bitwise shift left
|
|
||||||
let a = 7 << 3; //a == 56
|
|
||||||
6. >>
|
|
||||||
Bitwise shift right
|
|
||||||
let a = 198 >> 2; //a == 49
|
|
||||||
7. ==
|
|
||||||
!=
|
|
||||||
<
|
|
||||||
<=
|
|
||||||
>
|
|
||||||
>=
|
|
||||||
Comparison
|
|
||||||
let a = 5 < 6;
|
|
||||||
let b = a != false;
|
|
||||||
let c = 10 >= 10;
|
|
||||||
8. ^^
|
|
||||||
Bitwise XOR
|
|
||||||
let a = 63 ^^ 234; //a == 213
|
|
||||||
9. |
|
|
||||||
Bitwise OR
|
|
||||||
let a = 63 | 234; //a == 255
|
|
||||||
10. &
|
|
||||||
Bitwise AND
|
|
||||||
let a = 63 & 234; //a == 42
|
|
||||||
11. ||
|
|
||||||
Logical OR
|
|
||||||
let a = true || false; //a == true
|
|
||||||
11. &&
|
|
||||||
Logical AND
|
|
||||||
let a = true || false; //a == false
|
|
||||||
12. ?:
|
|
||||||
Ternary expression
|
|
||||||
let a = x > y ? 10 : 20;
|
|
||||||
let b = z == 0 ? x * 10 : y + 4;
|
|
||||||
let c = k ? (y ? 8 : 0) : p ? 5 : 2 + x;
|
|
||||||
|
|
||||||
- Boolean expressions
|
|
||||||
|
|
||||||
- Short-circuiting
|
|
||||||
|
|
||||||
This feature was present in vanilla ph3 as well, but I have yet to see a tutorial mention it, so here it is.
|
|
||||||
|
|
||||||
Short-circuiting (short-circuit evaluation) is an optimization for boolean expressions.
|
|
||||||
|
|
||||||
Take these statements, for example:
|
|
||||||
bool c = a && b;
|
|
||||||
bool z = x || y;
|
|
||||||
|
|
||||||
This !RUN-TIME! optimization will occur when expression (a) evaluates to false,
|
|
||||||
where the evaluation of expression (b) will be completely skipped over.
|
|
||||||
Conversely, in the second statement, the evaluation of expression (y) will also be skipped over if
|
|
||||||
expression (x) evaluates to true.
|
|
||||||
|
|
||||||
Short-circuiting will take place left-to-right, so it is beneficial to format your logical expressions
|
|
||||||
in a way that more lightweight expressions get evaluated sooner rather than later.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
if (bCheckHit && GetShotIdInCircleA2(...)) { /*...*/ }
|
|
||||||
|
|
||||||
would benefit more from short-circuit evaluation than
|
|
||||||
|
|
||||||
if (GetShotIdInCircleA2(...) && bCheckHit) { /*...*/ }
|
|
||||||
|
|
||||||
Short-circuiting only applies to logical expressions, not bitwise expressions.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
bool c = a & b;
|
|
||||||
bool d = a | b;
|
|
||||||
|
|
||||||
Here, both expressions (a) and (b) will be evaluated regardless of the result of expression (a).
|
|
||||||
|
|
||||||
- Loops
|
|
||||||
|
|
||||||
- Ascent/Descent
|
|
||||||
|
|
||||||
Ascent and descent loops remain unchanged, but you may now assign an explicit type to the counter variable.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
ascent (i in 0..3)
|
|
||||||
WriteLog(i);
|
|
||||||
|
|
||||||
Will result in the following output:
|
|
||||||
0.000000
|
|
||||||
1.000000
|
|
||||||
2.000000
|
|
||||||
|
|
||||||
//-----------------------------------------------
|
|
||||||
|
|
||||||
ascent (i in 0i..3)
|
|
||||||
WriteLog(i);
|
|
||||||
|
|
||||||
Will result in the following output:
|
|
||||||
0
|
|
||||||
1
|
|
||||||
2
|
|
||||||
|
|
||||||
//-----------------------------------------------
|
|
||||||
|
|
||||||
ascent (int i in 0..3)
|
|
||||||
WriteLog(i);
|
|
||||||
|
|
||||||
Will result in the following output:
|
|
||||||
0
|
|
||||||
1
|
|
||||||
2
|
|
||||||
|
|
||||||
- In ph3sx, two new loops are available for use.
|
|
||||||
|
|
||||||
- For loop
|
|
||||||
|
|
||||||
The for loop is the more generalized version of ascent/descent loops.
|
|
||||||
|
|
||||||
It's also the standard loop format in most programming languages,
|
|
||||||
which means I don't have to explain its usage here.
|
|
||||||
|
|
||||||
- For-each loop
|
|
||||||
|
|
||||||
The for-each loop is a quick and efficient method to iterate through arrays.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
int[] arr = [10, 9, 8, 7];
|
|
||||||
for each (int i in arr)
|
|
||||||
WriteLog(i);
|
|
||||||
|
|
||||||
Will result in the following output:
|
|
||||||
10
|
|
||||||
9
|
|
||||||
8
|
|
||||||
7
|
|
||||||
|
|
||||||
//-----------------------------------------------
|
|
||||||
|
|
||||||
for each (float i in arr)
|
|
||||||
WriteLog(i);
|
|
||||||
|
|
||||||
Will result in the following output:
|
|
||||||
10.000000
|
|
||||||
9.000000
|
|
||||||
8.000000
|
|
||||||
7.000000
|
|
||||||
|
|
||||||
- The "ref" keyword
|
|
||||||
|
|
||||||
Normally, the array fed into a for-each loop will be a copy of the original array.
|
|
||||||
However, you can force the loop to directly read from the original array with the "ref" keyword.
|
|
||||||
|
|
||||||
As the array won't be copied, there would also be some performance benefits to be had,
|
|
||||||
and the loop will respond to any modifications to the array rather than being unaffected.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
int[] arr = [1, 2, 3, 4];
|
|
||||||
|
|
||||||
for each (i in arr) {
|
|
||||||
if (i % 2 == 0)
|
|
||||||
arr ~= [5];
|
|
||||||
WriteLog(i);
|
|
||||||
}
|
|
||||||
WriteLog(arr);
|
|
||||||
|
|
||||||
Will result in the following output:
|
|
||||||
1
|
|
||||||
2
|
|
||||||
3
|
|
||||||
4
|
|
||||||
[1, 2, 3, 4, 5, 5]
|
|
||||||
|
|
||||||
//-----------------------------------------------
|
|
||||||
|
|
||||||
for each (i in ref arr) {
|
|
||||||
if (i % 2 == 0)
|
|
||||||
arr ~= [5];
|
|
||||||
WriteLog(i);
|
|
||||||
}
|
|
||||||
WriteLog(arr);
|
|
||||||
|
|
||||||
Will result in the following output:
|
|
||||||
1
|
|
||||||
2
|
|
||||||
3
|
|
||||||
4
|
|
||||||
5
|
|
||||||
5
|
|
||||||
[1, 2, 3, 4, 5, 5]
|
|
||||||
|
|
||||||
- Special syntaxes
|
|
||||||
|
|
||||||
- There is also another declaration syntax for the for-each loop:
|
|
||||||
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
for each (itr in array) {
|
|
||||||
//...
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//is equivalent to:
|
|
||||||
|
|
||||||
for each (i, itr in array) {
|
|
||||||
//...
|
|
||||||
}
|
|
||||||
|
|
||||||
- These formats are also allowed:
|
|
||||||
|
|
||||||
for each ((i, itr) in array) { /*...*/ }
|
|
||||||
for each ((int i, itr) in array) { /*...*/ }
|
|
||||||
for each (i, float itr in array) { /*...*/ }
|
|
||||||
for each ((float i, string itr) in array) { /*...*/ }
|
|
||||||
|
|
||||||
- You may use a colon(:) in place of the keyword "in"
|
|
||||||
|
|
||||||
for each (itr : array) { /*...*/ }
|
|
||||||
for each ((i, itr) : array) { /*...*/ }
|
|
||||||
|
|
||||||
- In addition, there is a new flow control statement "continue".
|
|
||||||
|
|
||||||
"continue" is used in the same manner as "break", but rather than simply ending the loop,
|
|
||||||
it will merely skip the current iteration of the loop.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
ascent (int i in 0..8) {
|
|
||||||
if (i % 2 == 0) continue;
|
|
||||||
WriteLog(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
Will result in the following output:
|
|
||||||
1
|
|
||||||
3
|
|
||||||
5
|
|
||||||
7
|
|
||||||
|
|
||||||
- Unlike in vanilla ph3, "break" can no longer be used outside a loop.
|
|
||||||
- Attempting to do so will throw a compile-time error.
|
|
||||||
- The same applies to "continue".
|
|
||||||
|
|
||||||
- Functions, Tasks, Subs ("Callables")
|
|
||||||
|
|
||||||
- Parameters
|
|
||||||
|
|
||||||
Parameters, like variables, can have explicit types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
function Func(int a, float b, const string[] c) {}
|
|
||||||
|
|
||||||
- Function return type
|
|
||||||
|
|
||||||
- You may explicitly specify a function's return type.
|
|
||||||
|
|
||||||
function<int> Func1(a, b) {
|
|
||||||
return a + b;
|
|
||||||
}
|
|
||||||
|
|
||||||
WriteLog(Func1(10, 4.2)); //Output: 14
|
|
||||||
WriteLog(Func1(10, "sdfs")); //ERROR: Invalid implicit casting
|
|
||||||
|
|
||||||
- Marking a function with type "void" will forbid it from returning a value.
|
|
||||||
|
|
||||||
function<void> Func1(a, b) {
|
|
||||||
return; //OK: no return value
|
|
||||||
}
|
|
||||||
|
|
||||||
function<void> Func2(a, b) {
|
|
||||||
return a + b; //ERROR: void function can't return a value
|
|
||||||
}
|
|
||||||
|
|
||||||
- Overloading
|
|
||||||
|
|
||||||
Two callables with the same name, but different argument counts, will be treated as two different, unique callables.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
function<int> Func() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
function<int> Func(a) {
|
|
||||||
return 100;
|
|
||||||
}
|
|
||||||
function<int> Func(a, b, c) {
|
|
||||||
return a + b + c;
|
|
||||||
}
|
|
||||||
|
|
||||||
DoStuff(); //Returns 0
|
|
||||||
DoStuff("asdf"); //Returns 100
|
|
||||||
DoStuff(1, 2, 3); //Returns 6
|
|
||||||
|
|
||||||
- Variadic argument count (varargs)
|
|
||||||
|
|
||||||
- Some default functions now allow for varargs.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
NotifyEventAll(EV_USER, 0);
|
|
||||||
NotifyEventAll(EV_USER, 0, 1, 2, 3);
|
|
||||||
NotifyEventAll(EV_USER, 0, 1, 2, 3, 4, 5, 6, 7, 8);
|
|
||||||
|
|
||||||
//All of the above are valid calls to NotifyEventAll.
|
|
||||||
|
|
||||||
- You can pass a maximum of around 357900000 arguments, but please please don't actually do that.
|
|
||||||
|
|
||||||
- Scripters currently cannot define their own callables with varargs.
|
|
||||||
|
|
||||||
- Async
|
|
||||||
|
|
||||||
Async blocks can be placed anywhere in the code, they behave like inlined tasks.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
function Func() {
|
|
||||||
WriteLog(0);
|
|
||||||
|
|
||||||
async {
|
|
||||||
WriteLog(1);
|
|
||||||
wait(10);
|
|
||||||
WriteLog(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//is equivalent to:
|
|
||||||
|
|
||||||
function Func() {
|
|
||||||
WriteLog(0);
|
|
||||||
|
|
||||||
task AsyncTask() {
|
|
||||||
WriteLog(1);
|
|
||||||
wait(10);
|
|
||||||
WriteLog(2);
|
|
||||||
}
|
|
||||||
AsyncTask();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
- Script
|
|
||||||
|
|
||||||
- Char
|
|
||||||
|
|
||||||
- Backslash escapes (\\) is properly recognized in char/string literals.
|
|
||||||
- Hexadecimal char literals (\x[hex]) can be used in char/string literals.
|
|
||||||
Example:
|
|
||||||
"\x74" -> "t"
|
|
||||||
'\x3042' -> 'あ'
|
|
||||||
"\x042\x5f" -> "B_"
|
|
||||||
|
|
||||||
- One-lined statements
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
ascent (i in 0..10) WriteLog(i);
|
|
||||||
|
|
||||||
if (true) a += 10;
|
|
||||||
else a -= 4;
|
|
||||||
|
|
||||||
Can be used everywhere except in function/task/sub declarations, async blocks, @-blocks, and local{} blocks.
|
|
||||||
|
|
||||||
- Optimizations
|
|
||||||
|
|
||||||
- The script compiler will try to perform basic optimizations on maths expressions.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
a = 5 + 5 - 1; -> optimize -> a = 9;
|
|
||||||
a = 5 * 8 / 7; -> optimize -> a = 5.714286;
|
|
||||||
a = func(b) + 5 % 10; -> optimize -> a = func(b) + 5;
|
|
||||||
|
|
||||||
- Empty loops and blocks will be optimized away during script compiling.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
while (true) {}
|
|
||||||
|
|
||||||
for (let i = 0; i < 10; i++) {}
|
|
||||||
|
|
||||||
ascent (i in 0..100000000) {}
|
|
||||||
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
loop (1000) {
|
|
||||||
}
|
|
||||||
|
|
||||||
for each (i in "aaaaaaaaaa") {}
|
|
||||||
|
|
||||||
async {}
|
|
||||||
|
|
||||||
//All of the above examples will be optimized away
|
|
||||||
|
|
||||||
- Loops containing a single yield will be automatically transformed into a wait.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
loop (60) yield; -> optimize -> wait(60);
|
|
||||||
|
|
||||||
loop (a * 2 + 60 - 20) { -> optimize -> wait(a * 2 + 60 - 20);
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
- Text Object Tags
|
|
||||||
|
|
||||||
Text object tags are special formatting patterns that can be used to dynamically alter rendering of text objects.
|
|
||||||
|
|
||||||
Available tags:
|
|
||||||
|
|
||||||
- r
|
|
||||||
|
|
||||||
Inserts a new line. Also resets formatting from other tags.
|
|
||||||
|
|
||||||
- font / f
|
|
||||||
|
|
||||||
Modifies the font.
|
|
||||||
|
|
||||||
Available tag properties:
|
|
||||||
|
|
||||||
- reset / rs / r / clear / clr / c
|
|
||||||
|
|
||||||
Resets the text to its original settings. Present in vanilla ph3 as "clear".
|
|
||||||
|
|
||||||
- size / sz
|
|
||||||
|
|
||||||
Changes the font size. Unchanged from vanilla ph3.
|
|
||||||
|
|
||||||
- ox / oy
|
|
||||||
|
|
||||||
Changes the position offset.
|
|
||||||
|
|
||||||
- it
|
|
||||||
|
|
||||||
Toggles italic. (true/false or 1/0)
|
|
||||||
|
|
||||||
- wg
|
|
||||||
|
|
||||||
Changes the font's weight.
|
|
||||||
|
|
||||||
- br / bg / bb
|
|
||||||
|
|
||||||
Changes the font's bottom color.
|
|
||||||
|
|
||||||
- tr / tg / tb
|
|
||||||
|
|
||||||
Changes the font's top color.
|
|
||||||
|
|
||||||
- or / og / ob
|
|
||||||
|
|
||||||
Changes the font's border color.
|
|
||||||
|
|
||||||
- bc
|
|
||||||
|
|
||||||
Changes the font's bottom color as a (r, g, b) list.
|
|
||||||
|
|
||||||
- tc
|
|
||||||
|
|
||||||
Changes the font's top color as a (r, g, b) list.
|
|
||||||
|
|
||||||
- oc
|
|
||||||
|
|
||||||
Changes the font's border color as a (r, g, b) list.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
ObjText_SetText(obj, "Lorem ipsum [font size=48 it=1 bc=(255, 0, 0)]dolor sit[font clr] amet");
|
|
||||||
|
|
||||||
- ruby
|
|
||||||
|
|
||||||
Creates a ruby(furigana) text.
|
|
||||||
|
|
||||||
Available tag properties:
|
|
||||||
|
|
||||||
- rb
|
|
||||||
|
|
||||||
Sets the main(bottom) text. Unchanged from vanilla ph3.
|
|
||||||
- rt
|
|
||||||
|
|
||||||
Sets the furigana(top) text. Unchanged from vanilla ph3.
|
|
||||||
- sz
|
|
||||||
|
|
||||||
Changes the furigana text's font size.
|
|
||||||
|
|
||||||
- wg
|
|
||||||
|
|
||||||
Changes the furigana text's font weight.
|
|
||||||
|
|
||||||
- ox
|
|
||||||
|
|
||||||
Changes the furigana text's left margin.
|
|
||||||
|
|
||||||
- op
|
|
||||||
|
|
||||||
Changes the furigana text's side pitch.
|
|
BIN
license.txt
52
readme.txt
|
@ -1,52 +0,0 @@
|
||||||
● Before We Get Started
|
|
||||||
This software is a freeware.
|
|
||||||
The creators are not liable for any mental, physical, or emotional damages caused by using the application.
|
|
||||||
|
|
||||||
● Installation
|
|
||||||
1. Use a software that is able to extract .zip files.
|
|
||||||
If you're seeing this you've probably already done this step. Good job.
|
|
||||||
2. Select the path to which to extract the files.
|
|
||||||
3. Yeah.
|
|
||||||
4. Suffer or enjoy, I don't know.
|
|
||||||
|
|
||||||
● Notes
|
|
||||||
■ Running on Wine
|
|
||||||
If the engine shows an error regarding shader compilation on startup, it's likely because of Wine failing to load required dlls.
|
|
||||||
|
|
||||||
Steps:
|
|
||||||
1a) Install winetricks if you haven't yet.
|
|
||||||
2a) Run 'winetricks d3dx9 d3dcompiler_43' at the console.
|
|
||||||
|
|
||||||
1b) If you've performed the above steps, and the engine still does not work, continue below.
|
|
||||||
2b) Run winetricks -> "Select the default wineprefix" -> "Run winecfg"
|
|
||||||
3b) Select either "Default Settings", or "Add application..." and select the ph3sx binary.
|
|
||||||
- For "Windows Version", select at least Windows 7.
|
|
||||||
4b) Go to the "Libraries" tab, and add overrides for the following dlls:
|
|
||||||
- d3dx9_43
|
|
||||||
- d3dcompiler_43
|
|
||||||
5b) Apply the settings, and everything should now work.
|
|
||||||
|
|
||||||
● Uninstallation
|
|
||||||
Simple delete all the related files.
|
|
||||||
This application does not utilize registry keys nor AppData storage.
|
|
||||||
|
|
||||||
● Key Controls (default)
|
|
||||||
Arrow Keys: Move
|
|
||||||
Z: Shoot, Select
|
|
||||||
X: Bomb, Cancel
|
|
||||||
Left Shift: Hold for Focused Movement
|
|
||||||
Left Ctrl: Hold for Fast Mode
|
|
||||||
R: Return to Script Select Screen (Unavailable by default in package scripts)
|
|
||||||
Backspace: Restart Script (Unavailable by default in package scripts)
|
|
||||||
|
|
||||||
** Default key controls are purely engine-default, and may be overridden and changed from script to script.
|
|
||||||
|
|
||||||
Check out the sample scripts for demonstrations of new functions and features.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
REPORT BUGS AND/OR GIVE FEATURE REQUESTS TO:
|
|
||||||
|
|
||||||
● https://github.com/Natashi/Touhou-Danmakufu-ph3sx-2/issues on GitHub
|
|
||||||
|
|
||||||
● https://discord.gg/f9KFujKGEx on the ph3sx development Discord server
|
|
Before Width: | Height: | Size: 401 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 449 KiB |
|
@ -1,33 +0,0 @@
|
||||||
//書き換えないでください。
|
|
||||||
|
|
||||||
@Initialize
|
|
||||||
{
|
|
||||||
TEnemy();
|
|
||||||
}
|
|
||||||
|
|
||||||
@MainLoop
|
|
||||||
{
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Finalize
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
task TEnemy
|
|
||||||
{
|
|
||||||
let path = GetMainStgScriptPath();
|
|
||||||
let idScript = LoadScript(path);
|
|
||||||
StartScript(idScript);
|
|
||||||
|
|
||||||
while(!IsCloseScript(idScript) && GetPlayerState() != STATE_END)
|
|
||||||
{
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
loop(300){yield;}
|
|
||||||
|
|
||||||
CloseStgScene();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
//書き換えないでください。
|
|
||||||
|
|
||||||
@Initialize
|
|
||||||
{
|
|
||||||
TEnemy();
|
|
||||||
}
|
|
||||||
|
|
||||||
@MainLoop
|
|
||||||
{
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Finalize
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
task TEnemy
|
|
||||||
{
|
|
||||||
let path = GetMainStgScriptPath();
|
|
||||||
let obj = ObjEnemyBossScene_Create();
|
|
||||||
ObjEnemyBossScene_Add(obj, 0, path);
|
|
||||||
ObjEnemyBossScene_LoadInThread(obj);
|
|
||||||
ObjEnemyBossScene_Regist(obj);
|
|
||||||
|
|
||||||
while(!Obj_IsDeleted(obj) && GetPlayerState() != STATE_END)
|
|
||||||
{
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
loop(300){yield;}
|
|
||||||
|
|
||||||
CloseStgScene();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,245 +0,0 @@
|
||||||
#TouhouDanmakufu[Single]
|
|
||||||
#ScriptVersion[3]
|
|
||||||
#Title["DPS Test"]
|
|
||||||
#Text["thank you Daniel WishMakers"]
|
|
||||||
#System["script/KevinSystem/Kevin_System.txt"]
|
|
||||||
|
|
||||||
//let shotSheet = GetCurrentScriptDirectory() ~ "./../shot/shot.txt";
|
|
||||||
|
|
||||||
int bossObj; // This is enemy 1
|
|
||||||
|
|
||||||
int enm2, enm3; // This is enemy 2 and 3
|
|
||||||
|
|
||||||
let timer = 0;
|
|
||||||
let timer2 = 0;
|
|
||||||
let timer3 = 0;
|
|
||||||
let timer4 = 0;
|
|
||||||
|
|
||||||
//let phase = 0;
|
|
||||||
let angle = 0;
|
|
||||||
let angle2 = 0;
|
|
||||||
let angle3 = 0;
|
|
||||||
let angle4 = 0;
|
|
||||||
|
|
||||||
let x = 0;
|
|
||||||
let y = 0;
|
|
||||||
|
|
||||||
let image_angle = 0;
|
|
||||||
let HP = 10000000; //- (100 * difficulty);
|
|
||||||
|
|
||||||
// This is for the damage showing
|
|
||||||
let gl_curDPS = 0;
|
|
||||||
let gl_curDPS2 = 0;
|
|
||||||
let gl_curDPS3 = 0;
|
|
||||||
|
|
||||||
let gl_TimeSpent = 0;
|
|
||||||
let gl_TutorialStr = "";
|
|
||||||
const let STR_START = "Release SHOT before testing DPS.";
|
|
||||||
const let STR_GO = "Press and hold SHOT to start testing DPS.";
|
|
||||||
const let STR_FINISH = "Release SHOT when you are finished testing DPS.";
|
|
||||||
|
|
||||||
//#include "script/BHA5/script/Lib/BHA5_Lib.txt"
|
|
||||||
|
|
||||||
#include "script/KevinSystem/Universal_Lib.txt" // The library to include all libraries :sans: :nail_care:
|
|
||||||
|
|
||||||
@Event{
|
|
||||||
alternative(GetEventType())
|
|
||||||
case(EV_REQUEST_LIFE){
|
|
||||||
SetScriptResult(HP);
|
|
||||||
}
|
|
||||||
case(EV_REQUEST_TIMER){
|
|
||||||
SetScriptResult(9999);
|
|
||||||
}
|
|
||||||
case(EV_REQUEST_SPELL_SCORE){
|
|
||||||
SetScriptResult(1000000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Initialize{
|
|
||||||
//Shot sheet
|
|
||||||
//LoadTexture(shotSheet);
|
|
||||||
//LoadEnemyShotData(shotSheet);
|
|
||||||
|
|
||||||
SetPlayerLife(20);
|
|
||||||
|
|
||||||
//Boss registration
|
|
||||||
bossObj = ObjEnemy_Create(OBJ_ENEMY_BOSS);
|
|
||||||
ObjEnemy_Regist(bossObj);
|
|
||||||
//SetIntersectionVisualization(true);
|
|
||||||
|
|
||||||
let imgExRumia = GetModuleDirectory() ~ "script/ExRumia/ExRumia.png";
|
|
||||||
ObjPrim_SetTexture(bossObj, imgExRumia);
|
|
||||||
ObjSprite2D_SetSourceRect(bossObj, 64, 1, 127, 64);
|
|
||||||
ObjSprite2D_SetDestCenter(bossObj);
|
|
||||||
ObjRender_SetScaleXYZ(bossObj, 1.5, 1.5, 1);
|
|
||||||
ObjRender_SetColor(bossObj, 0xB93C3C);
|
|
||||||
ObjMove_SetDestAtFrame(bossObj, STG_WIDTH/2, 550, 1);
|
|
||||||
|
|
||||||
enm2 = ObjEnemy_Create(OBJ_ENEMY);
|
|
||||||
ObjEnemy_Regist(enm2);
|
|
||||||
//SetIntersectionVisualization(true);
|
|
||||||
|
|
||||||
//let imgExRumia = GetModuleDirectory() ~ "script/ExRumia/ExRumia.png";
|
|
||||||
ObjPrim_SetTexture(enm2, imgExRumia);
|
|
||||||
ObjSprite2D_SetSourceRect(enm2, 64, 1, 127, 64);
|
|
||||||
ObjSprite2D_SetDestCenter(enm2);
|
|
||||||
ObjRender_SetScaleXYZ(enm2, 1.5, 1.5, 1);
|
|
||||||
ObjRender_SetColor(enm2, 0xDC5959);
|
|
||||||
ObjMove_SetDestAtFrame(enm2, STG_WIDTH/2, 300, 1);
|
|
||||||
|
|
||||||
ObjEnemy_SetMaximumDamage(enm2, 2000);
|
|
||||||
|
|
||||||
enm3 = ObjEnemy_Create(OBJ_ENEMY);
|
|
||||||
ObjEnemy_Regist(enm3);
|
|
||||||
//SetIntersectionVisualization(true);
|
|
||||||
|
|
||||||
//let imgExRumia = GetModuleDirectory() ~ "script/ExRumia/ExRumia.png";
|
|
||||||
ObjPrim_SetTexture(enm3, imgExRumia);
|
|
||||||
ObjSprite2D_SetSourceRect(enm3, 64, 1, 127, 64);
|
|
||||||
ObjSprite2D_SetDestCenter(enm3);
|
|
||||||
ObjRender_SetScaleXYZ(enm3, 1.5, 1.5, 1);
|
|
||||||
ObjRender_SetColor(enm3, 0xFF8383);
|
|
||||||
ObjMove_SetDestAtFrame(enm3, STG_WIDTH/2, 50, 1);
|
|
||||||
|
|
||||||
ObjEnemy_SetMaximumDamage(enm3, 2000);
|
|
||||||
|
|
||||||
ObjEnemy_SetMaximumDamage(bossObj, 2000);
|
|
||||||
|
|
||||||
main;
|
|
||||||
display;
|
|
||||||
TFinalize;
|
|
||||||
}
|
|
||||||
|
|
||||||
@MainLoop{
|
|
||||||
|
|
||||||
ObjEnemy_SetIntersectionCircleToShot(bossObj,ObjMove_GetX(bossObj),ObjMove_GetY(bossObj),128);
|
|
||||||
ObjEnemy_SetIntersectionCircleToShot(enm2,ObjMove_GetX(enm2),ObjMove_GetY(enm2),128);
|
|
||||||
ObjEnemy_SetIntersectionCircleToShot(enm3,ObjMove_GetX(enm3),ObjMove_GetY(enm3),128);
|
|
||||||
|
|
||||||
//ObjEnemy_SetIntersectionCircleToPlayer(bossObj,ObjMove_GetX(bossObj),ObjMove_GetY(bossObj),32);
|
|
||||||
|
|
||||||
timer++;
|
|
||||||
timer2++;
|
|
||||||
x = ObjMove_GetX(bossObj);
|
|
||||||
y = ObjMove_GetY(bossObj);
|
|
||||||
ObjRender_SetAngleZ(bossObj,image_angle);
|
|
||||||
|
|
||||||
//main;
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
task TFinalize {
|
|
||||||
while(ObjEnemy_GetInfo(bossObj, INFO_LIFE) > 0){yield;}
|
|
||||||
Obj_Delete(bossObj);
|
|
||||||
DeleteShotAll(TYPE_ALL, TYPE_IMMEDIATE);
|
|
||||||
SetAutoDeleteObject(true);
|
|
||||||
CloseScript(GetOwnScriptID());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
task display {
|
|
||||||
let objText = CreateTextObject(100,300, 24, "Release SHOT to start testing DPS.");
|
|
||||||
let objMain = CreateTextObject(100,400, 24, "Avg DPS (Front): [r]Frames: ");
|
|
||||||
let objMain2 = CreateTextObject(100,500, 24, "Avg DPS (Middle): ");
|
|
||||||
let objMain3 = CreateTextObject(100,600, 24, "Avg DPS (Back): ");
|
|
||||||
|
|
||||||
loop {
|
|
||||||
ObjText_SetText(objText, gl_TutorialStr);
|
|
||||||
ObjText_SetText(objMain, StringFormat("Avg DPS (Front): %f[r]Frames: %d", "fd", gl_curDPS, gl_TimeSpent));
|
|
||||||
ObjText_SetText(objMain2, StringFormat("Avg DPS (Middle): %f", "f", gl_curDPS2));
|
|
||||||
ObjText_SetText(objMain3, StringFormat("Avg DPS (Back): %f", "f", gl_curDPS3));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// thanks wish
|
|
||||||
|
|
||||||
task main {
|
|
||||||
let count = 0;
|
|
||||||
let damage = 0;
|
|
||||||
let damage2 = 0;
|
|
||||||
let damage3 = 0;
|
|
||||||
|
|
||||||
loop {
|
|
||||||
//Reinitialize
|
|
||||||
count = 0;
|
|
||||||
damage = 0;
|
|
||||||
damage2 = 0;
|
|
||||||
damage3 = 0;
|
|
||||||
ObjEnemy_SetLife(bossObj, HP);
|
|
||||||
ObjEnemy_SetLife(enm2, HP);
|
|
||||||
ObjEnemy_SetLife(enm3, HP);
|
|
||||||
gl_TutorialStr = STR_START;
|
|
||||||
|
|
||||||
//Wait for shot to not be held.
|
|
||||||
while(count < 60) {
|
|
||||||
if (CheckShotRelease) {
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
count = 0;
|
|
||||||
}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Wait until player starts pressing SHOT.
|
|
||||||
count = 0;
|
|
||||||
gl_TutorialStr = STR_GO;
|
|
||||||
|
|
||||||
while(!CheckShotHeld) {
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
while(CheckShotHeld) {
|
|
||||||
count++;
|
|
||||||
damage += (HP - ObjEnemy_GetInfo(bossObj, INFO_LIFE));
|
|
||||||
damage2 += (HP - ObjEnemy_GetInfo(enm2, INFO_LIFE));
|
|
||||||
damage3 += (HP - ObjEnemy_GetInfo(enm3, INFO_LIFE));
|
|
||||||
ObjEnemy_SetLife(bossObj, HP);
|
|
||||||
ObjEnemy_SetLife(enm2, HP);
|
|
||||||
ObjEnemy_SetLife(enm3, HP);
|
|
||||||
gl_TimeSpent = count;
|
|
||||||
if (count % 60 == 0) {
|
|
||||||
gl_curDPS = damage;
|
|
||||||
gl_curDPS2 = damage2;
|
|
||||||
gl_curDPS3 = damage3;
|
|
||||||
gl_TutorialStr = STR_FINISH;
|
|
||||||
damage = 0;
|
|
||||||
damage2 = 0;
|
|
||||||
damage3 = 0;
|
|
||||||
}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function CheckShotRelease {
|
|
||||||
return ((GetVirtualKeyState(VK_SHOT) == KEY_PULL) || (GetVirtualKeyState(VK_SHOT) == KEY_FREE));
|
|
||||||
}
|
|
||||||
|
|
||||||
function CheckShotHeld {
|
|
||||||
return ((GetVirtualKeyState(VK_SHOT) == KEY_PUSH) || (GetVirtualKeyState(VK_SHOT) == KEY_HOLD));
|
|
||||||
}
|
|
||||||
|
|
||||||
//mkm fxn
|
|
||||||
function CreateTextObject(let mx, let my, let size, let text)
|
|
||||||
{
|
|
||||||
let obj = ObjText_Create();
|
|
||||||
ObjText_SetText(obj, text);
|
|
||||||
ObjText_SetFontSize(obj, size);
|
|
||||||
ObjText_SetFontBold(obj, true);
|
|
||||||
ObjText_SetFontColorTop(obj, 128, 128, 255);
|
|
||||||
ObjText_SetFontColorBottom(obj, 64, 64, 255);
|
|
||||||
ObjText_SetFontBorderType(obj, BORDER_FULL);
|
|
||||||
ObjText_SetFontBorderColor(obj,255, 255, 255);
|
|
||||||
ObjText_SetFontBorderWidth(obj, 2);
|
|
||||||
Obj_SetRenderPriorityI(obj, 10);
|
|
||||||
ObjRender_SetX(obj, mx);
|
|
||||||
ObjRender_SetY(obj, my);
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 83 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 324 KiB |
|
@ -1,208 +0,0 @@
|
||||||
#TouhouDanmakufu[Plural]
|
|
||||||
#ScriptVersion[3]
|
|
||||||
#Title["Game Plural"]
|
|
||||||
#Text["pilk"]
|
|
||||||
#System["script/KevinSystem/Kevin_System.txt"]
|
|
||||||
//#Player["script/KevinPackage/KevinScript_Players/PankevKouda/KevKou_Main.dnh", "script/KevinPackage/KevinScript_Players/MariHousui/MariHousui_Main.dnh"]
|
|
||||||
|
|
||||||
let csd = GetCurrentScriptDirectory();
|
|
||||||
|
|
||||||
let obj = ObjEnemyBossScene_Create();
|
|
||||||
int objBGM = ObjSound_Create();
|
|
||||||
int objBGMBoss = ObjSound_Create();
|
|
||||||
|
|
||||||
#include "script/KevinSystem/Universal_Lib.txt"
|
|
||||||
#include "script/KevinSystem/kevin_system/Lib_Const.dnh"
|
|
||||||
#include "script/Jam10/Stage_Background.dnh"
|
|
||||||
|
|
||||||
int LifeStart = GetCommonData("Starting Lives", 3);
|
|
||||||
|
|
||||||
bool stageStart = false;
|
|
||||||
bool bossStart = false;
|
|
||||||
float BGMRate = GetAreaCommonData("Config", "BGMVol", 100) * 0.01;
|
|
||||||
|
|
||||||
let POINTER_CHAIN = LoadAreaCommonDataValuePointer("PIV", "ChainAmount", 1);
|
|
||||||
let POINTER_CHAINGAUGE = LoadAreaCommonDataValuePointer("PIV", "ChainGauge", 0);
|
|
||||||
let POINTER_SPECIALAMMO = LoadAreaCommonDataValuePointer("PIV", "SpecialAmmo", 100);
|
|
||||||
let POINTER_SPECIALCHECK = LoadAreaCommonDataValuePointer("PIV", "IsUsingSpecial", false);
|
|
||||||
let POINTER_CHAINCHECK = LoadAreaCommonDataValuePointer("PIV", "IsChaining", false);
|
|
||||||
|
|
||||||
string DATA_PLAYER = "";
|
|
||||||
string DATA_DIFFICULTY = "";
|
|
||||||
|
|
||||||
@Event{
|
|
||||||
|
|
||||||
alternative (GetEventType())
|
|
||||||
|
|
||||||
case(EV_START_MUSIC){
|
|
||||||
stageStart = true;
|
|
||||||
ObjSound_Play(objBGM);
|
|
||||||
}
|
|
||||||
|
|
||||||
case(EV_BOSS_MUSIC){
|
|
||||||
bossStart = true;
|
|
||||||
ObjSound_Stop(objBGM);
|
|
||||||
ObjSound_Play(objBGMBoss);
|
|
||||||
}
|
|
||||||
|
|
||||||
case(EV_PAUSE_ENTER){
|
|
||||||
|
|
||||||
if (stageStart) {
|
|
||||||
if(bossStart){
|
|
||||||
ObjSound_Stop(objBGMBoss);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
ObjSound_Stop(objBGM);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
case(EV_PAUSE_LEAVE){
|
|
||||||
|
|
||||||
if (stageStart) {
|
|
||||||
if(bossStart){
|
|
||||||
ObjSound_Play(objBGMBoss);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
ObjSound_Play(objBGM);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Initialize{
|
|
||||||
|
|
||||||
SetCommonDataPtr(POINTER_CHAIN, 1);
|
|
||||||
SetCommonDataPtr(POINTER_CHAINGAUGE, 0);
|
|
||||||
SetCommonDataPtr(POINTER_SPECIALAMMO, 100);
|
|
||||||
SetCommonDataPtr(POINTER_SPECIALCHECK, false);
|
|
||||||
SetCommonDataPtr(POINTER_CHAINCHECK, false);
|
|
||||||
|
|
||||||
SetCommonData("Flying Defeated", 0);
|
|
||||||
SetCommonData("Ground Defeated", 0);
|
|
||||||
//SetCommonData("IsBomb", false);
|
|
||||||
SetCommonData("Rank", 1);
|
|
||||||
|
|
||||||
if(!IsCommonDataAreaExists("PIV")){
|
|
||||||
CreateCommonDataArea("PIV");
|
|
||||||
SetAreaCommonData("PIV", "currentvalue", 1000);
|
|
||||||
SetAreaCommonData("PIV", "ChainAmount", 1);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
SetAreaCommonData("PIV", "ChainAmount", 1);
|
|
||||||
SetAreaCommonData("PIV", "currentvalue", 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
SetPlayerLife(GetAreaCommonData("Config", "StartingLife", 3));
|
|
||||||
|
|
||||||
SetAutoDeleteObject(true);
|
|
||||||
|
|
||||||
// 0: Yal, 1: Wareya
|
|
||||||
//SetAreaCommonData("Config", "BGMSelect", "Wareya");
|
|
||||||
|
|
||||||
/*
|
|
||||||
if(GetAreaCommonData("Config", "BGMSelect", 0) == 1){
|
|
||||||
ObjSound_Load(objBGM, "script/game/resourceLib/BossTheme_Wareya1.ogg");
|
|
||||||
ObjSound_SetLoopTime(objBGM, 1.644, 51.110);
|
|
||||||
}
|
|
||||||
|
|
||||||
else{
|
|
||||||
ObjSound_Load(objBGM, "script/game/resourceLib/BossTheme_Yal.ogg");
|
|
||||||
ObjSound_SetLoopTime(objBGM, 0.001, 92.81);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
InitiateData();
|
|
||||||
|
|
||||||
ObjSound_Load(objBGM, "script/Jam10/resourceLib/StageTheme.ogg");
|
|
||||||
ObjSound_SetSoundDivision(objBGM, SOUND_BGM);
|
|
||||||
ObjSound_SetResumeEnable(objBGM, true);
|
|
||||||
ObjSound_SetLoopEnable(objBGM, true);
|
|
||||||
ObjSound_SetLoopTime(objBGM, 22.72, 79.52);
|
|
||||||
|
|
||||||
ObjSound_Load(objBGMBoss, "script/Jam10/resourceLib/BossTheme.ogg");
|
|
||||||
ObjSound_SetSoundDivision(objBGMBoss, SOUND_BGM);
|
|
||||||
ObjSound_SetResumeEnable(objBGMBoss, true);
|
|
||||||
ObjSound_SetLoopEnable(objBGMBoss, false);
|
|
||||||
|
|
||||||
ObjSound_SetVolumeRate(objBGMBoss, 100*BGMRate);
|
|
||||||
ObjSound_SetVolumeRate(objBGM, 100*BGMRate);
|
|
||||||
|
|
||||||
PluralTask();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@MainLoop{
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Finalize
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
task InitiateData(){
|
|
||||||
|
|
||||||
DATA_PLAYER = GetPlayerReplayName();
|
|
||||||
DATA_DIFFICULTY = GetCommonData("Difficulty", "Standard");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TO DO:
|
|
||||||
|
|
||||||
+ Single *syncing* - ensure that the boss stays at the same position
|
|
||||||
*/
|
|
||||||
// Task to handle the plural's boss scene
|
|
||||||
|
|
||||||
task PluralTask(){
|
|
||||||
// Registering individual singles
|
|
||||||
|
|
||||||
ObjEnemyBossScene_Add(obj, 0, csd ~ "NarumiSTG.dnh");
|
|
||||||
ObjEnemyBossScene_LoadInThread(obj);
|
|
||||||
|
|
||||||
_ScrollBackground();
|
|
||||||
|
|
||||||
// Loading and registering the boss scene
|
|
||||||
ObjEnemyBossScene_Regist(obj);
|
|
||||||
|
|
||||||
async{
|
|
||||||
while(GetPlayerState() != STATE_END){yield;}
|
|
||||||
ObjSound_Stop(objBGM);
|
|
||||||
ObjSound_Stop(objBGMBoss);
|
|
||||||
}
|
|
||||||
|
|
||||||
while(!Obj_IsDeleted(obj)){
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
ObjSound_Stop(objBGM);
|
|
||||||
ObjSound_Stop(objBGMBoss);
|
|
||||||
stageStart = false;
|
|
||||||
bossStart = false;
|
|
||||||
|
|
||||||
//_ExplosionEffect(GetCommonData("Boss Position X", STG_WIDTH/2), GetCommonData("Boss Position Y", STG_WIDTH/2), PetalEffect);
|
|
||||||
|
|
||||||
if(!IsReplay() & LifeStart <= 3){
|
|
||||||
|
|
||||||
int highScore = GetAreaCommonData("Data_" ~ DATA_PLAYER, "HighScore_" ~ DATA_DIFFICULTY, 0);
|
|
||||||
int curScore = trunc(GetCommonData("Run Score", 0)/10)*10;
|
|
||||||
|
|
||||||
if(curScore > highScore){SetAreaCommonData("Data_" ~ DATA_PLAYER, "HighScore_" ~ DATA_DIFFICULTY, curScore);}
|
|
||||||
else{}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
string savefile = "";
|
|
||||||
|
|
||||||
if (DATA_PLAYER == "Narumi") {savefile = "data_Pl0.dat";}
|
|
||||||
else if (DATA_PLAYER == "Kouryuu") {savefile = "data_Pl1.dat";}
|
|
||||||
else {savefile = "data_ERROR.dat";}
|
|
||||||
|
|
||||||
SaveCommonDataAreaA2("Data_" ~ DATA_PLAYER, "script/Jam10/" ~ savefile);
|
|
||||||
|
|
||||||
SetAutoDeleteObject(true);
|
|
||||||
CloseScript(GetOwnScriptID());
|
|
||||||
}
|
|
|
@ -1,449 +0,0 @@
|
||||||
// Constants
|
|
||||||
|
|
||||||
int difficulty = 0;
|
|
||||||
|
|
||||||
int STAGE_LENGTH = 120;
|
|
||||||
int MIDBOSS_LENGTH = 75;
|
|
||||||
int BOSS_LENGTH = 30;
|
|
||||||
|
|
||||||
int HP_MAX = 4500;
|
|
||||||
int PHASE1_LIMIT = 2250;
|
|
||||||
int PHASE2_LIMIT = 0;
|
|
||||||
int PHASE3_LIMIT = 0;
|
|
||||||
|
|
||||||
int MIDBOSS_HP = 1800;
|
|
||||||
|
|
||||||
// Rank min/max
|
|
||||||
|
|
||||||
local{
|
|
||||||
|
|
||||||
alternative(GetCommonData("Difficulty", "Standard"))
|
|
||||||
|
|
||||||
case("Novice"){difficulty = 0;}
|
|
||||||
case("Standard"){difficulty = 1;}
|
|
||||||
case("Extra"){difficulty = 2;}
|
|
||||||
others{difficulty = 0;}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
float RANK_MIN = [1, 1, 12][difficulty];
|
|
||||||
float RANK_MAX = 12; // Since Novice locks Rank to a lower level, this distinction is necessary
|
|
||||||
float RANK_MAX_TRUE = [6, 12, 12][difficulty]; // Can be changed
|
|
||||||
|
|
||||||
SetCommonData("MinRank", RANK_MIN);
|
|
||||||
SetCommonData("MaxRank", RANK_MAX_TRUE);
|
|
||||||
|
|
||||||
// Enemy parameters
|
|
||||||
|
|
||||||
int smallEnemyHitbox = 32;
|
|
||||||
int medEnemyHitbox = 64;
|
|
||||||
int largeEnemyHitbox = 100;
|
|
||||||
int spiritHitbox = 48;
|
|
||||||
|
|
||||||
float smallEnemyHP = 40;
|
|
||||||
float mediumEnemyHP = 90;
|
|
||||||
float largeEnemyHP = 150;
|
|
||||||
float largeEnemyAltHP = 150;
|
|
||||||
float popcornHP = 30;
|
|
||||||
|
|
||||||
float smallEnemyScale = 1;
|
|
||||||
float largeEnemyScale = 1;
|
|
||||||
float popcornScale = 1;
|
|
||||||
|
|
||||||
// Enemy rects
|
|
||||||
|
|
||||||
int[] smallfairyRect = [0, 128, 128, 256];
|
|
||||||
int[] spiritRect = [0, 0, 128, 128];
|
|
||||||
int[] mushroomfairyRect = [0, 256, 192, 448];
|
|
||||||
int[] yukionnaRect = [0, 448, 192, 640];
|
|
||||||
int[] bossRect = [192, 448, 384, 704];
|
|
||||||
|
|
||||||
// Universal
|
|
||||||
|
|
||||||
// MOVEMENT SPEED RELATED
|
|
||||||
|
|
||||||
// Very low speed (ground, large enemies)
|
|
||||||
float baseMoveSpeedVL = 5.5;
|
|
||||||
|
|
||||||
// Low speed (ground, large enemies)
|
|
||||||
float baseMoveSpeed1L= 7;
|
|
||||||
|
|
||||||
// Medium speed
|
|
||||||
float baseMoveSpeedM = 8;
|
|
||||||
|
|
||||||
// High speed
|
|
||||||
float baseMoveSpeedH = 9;
|
|
||||||
|
|
||||||
// Very high speed
|
|
||||||
float baseMoveSpeedVH = 10.5;
|
|
||||||
|
|
||||||
float MoveSpeedRankMultiplierVL = 0.01;
|
|
||||||
float MoveSpeedRankMultiplierL = 0.015;
|
|
||||||
float MoveSpeedRankMultiplierH = 0.02;
|
|
||||||
float MoveSpeedRankMultiplierVH = 0.03;
|
|
||||||
|
|
||||||
// ITEM RELATED
|
|
||||||
|
|
||||||
float smallFlyingEnm_itemPointMin = 8;
|
|
||||||
float smallFlyingEnm_itemPointMax = 12;
|
|
||||||
|
|
||||||
float medFlyingEnm_itemPointMin = 14;
|
|
||||||
float medFlyingEnm_itemPointMax = 21;
|
|
||||||
|
|
||||||
float largeFlyingEnm_itemPointMin = 20;
|
|
||||||
float largeFlyingEnm_itemPointMax = 30;
|
|
||||||
|
|
||||||
float verylargeFlyingEnm_itemPointMin = 35;
|
|
||||||
float verylargeFlyingEnm_itemPointMax = 45;
|
|
||||||
|
|
||||||
// 1 ammo item = 2 ammo
|
|
||||||
|
|
||||||
float smallGroundEnm_itemAmmoMin = 2;
|
|
||||||
float smallGroundEnm_itemAmmoMax = 4;
|
|
||||||
|
|
||||||
float medGroundEnm_itemAmmoMin = 4;
|
|
||||||
float medGroundEnm_itemAmmoMax = 6;
|
|
||||||
|
|
||||||
float largeGroundEnm_itemAmmoMin = 12;
|
|
||||||
float largeGroundEnm_itemAmmoMax = 18;
|
|
||||||
|
|
||||||
float verylargeGroundEnm_itemAmmoMin = 40;
|
|
||||||
float verylargeGroundEnm_itemAmmoMax = 60;
|
|
||||||
|
|
||||||
float smallEnm_itemChainMin = 6;
|
|
||||||
float smallEnm_itemChainMax = 12;
|
|
||||||
|
|
||||||
float mediumEnm_itemChainMin = 9;
|
|
||||||
float mediumEnm_itemChainMax = 16;
|
|
||||||
|
|
||||||
float largeEnm_itemChainMin = 12;
|
|
||||||
float largeEnm_itemChainMax = 20;
|
|
||||||
|
|
||||||
float itemMultiplier = 0.03; // For point items only
|
|
||||||
|
|
||||||
// INVINCIBILITY TIME
|
|
||||||
|
|
||||||
// Short, medium, long
|
|
||||||
int[] invinTimeArr = [20, 40, 60];
|
|
||||||
int[] invinTimeDecrease = [1, 2, 3]; // Per rank increase
|
|
||||||
|
|
||||||
// Wave 1
|
|
||||||
|
|
||||||
// Graphic: fairy
|
|
||||||
|
|
||||||
// Uses high speed, fires aimed bullets
|
|
||||||
|
|
||||||
int W1_spawnDelayMin = 4;
|
|
||||||
int W1_spawnDelayMax = 8;
|
|
||||||
|
|
||||||
int W1_fairyNumMin = 5;
|
|
||||||
int W1_fairyNumMax = 8;
|
|
||||||
|
|
||||||
int W1_decelTimeMin = 20;
|
|
||||||
int W1_decelTimeMax = 30;
|
|
||||||
|
|
||||||
int W1_bulletDelayMin = 40;
|
|
||||||
int W1_bulletDelayMax = 50;
|
|
||||||
|
|
||||||
float W1_bulletSpdMin = 9;
|
|
||||||
float W1_bulletSpdMax = 12;
|
|
||||||
|
|
||||||
// Wave 2
|
|
||||||
|
|
||||||
// Graphic: spirit
|
|
||||||
|
|
||||||
// Sin-wave movement, fires aimed small-fire fans
|
|
||||||
|
|
||||||
int W2_fairyNumMin = 3;
|
|
||||||
int W2_fairyNumMax = 5;
|
|
||||||
|
|
||||||
int W2_bulletDelayMin = 65;
|
|
||||||
int W2_bulletDelayMax = 90;
|
|
||||||
|
|
||||||
float W2_bulletSpdMin = 10;
|
|
||||||
float W2_bulletSpdMax = 13;
|
|
||||||
|
|
||||||
float W2_rangeMin = 2;
|
|
||||||
float W2_rangeMax = 3.25;
|
|
||||||
|
|
||||||
int W2_bulletfanNumMin = 3;
|
|
||||||
int W2_bulletfanNumMax = 5;
|
|
||||||
|
|
||||||
int W2_spawnDelayMin = 10;
|
|
||||||
int W2_spawnDelayMax = 15;
|
|
||||||
|
|
||||||
// Wave 3: Mushroom fairy, fires large fireballs
|
|
||||||
|
|
||||||
int W3_spawnDelayMin = 15;
|
|
||||||
int W3_spawnDelayMax = 30;
|
|
||||||
|
|
||||||
int W3_fairyNumMin = 2;
|
|
||||||
int W3_fairyNumMax = 6;
|
|
||||||
|
|
||||||
float W3_rangeMin = 1;
|
|
||||||
float W3_rangeMax = 2.5;
|
|
||||||
|
|
||||||
int W3_bulletfanNumMin = 1;
|
|
||||||
int W3_bulletfanNumMax = 1;
|
|
||||||
|
|
||||||
int W3_bulletDelayMin = 15;
|
|
||||||
int W3_bulletDelayMax = 20;
|
|
||||||
|
|
||||||
float W3_bulletSpdMin = 11;
|
|
||||||
float W3_bulletSpdMax = 13;
|
|
||||||
|
|
||||||
// Wave 4: Mushroom fairy, fires small fireball lines
|
|
||||||
|
|
||||||
int W4_spawnDelayMin = 15;
|
|
||||||
int W4_spawnDelayMax = 30;
|
|
||||||
|
|
||||||
int W4_fairyNumMin = 2;
|
|
||||||
int W4_fairyNumMax = 5;
|
|
||||||
|
|
||||||
int W4_bulletNumMin = 3;
|
|
||||||
int W4_bulletNumMax = 5;
|
|
||||||
|
|
||||||
int W4_bulletDelayMin = 2;
|
|
||||||
int W4_bulletDelayMax = 4;
|
|
||||||
|
|
||||||
int W4_stopTimeMin = 20;
|
|
||||||
int W4_stopTimeMax = 30;
|
|
||||||
|
|
||||||
float W4_bulletSpdMin = 8;
|
|
||||||
float W4_bulletSpdMax = 10;
|
|
||||||
|
|
||||||
// Wave 5: Clumped small fairy lines come from both sides to attack you.
|
|
||||||
|
|
||||||
int W5_spawnDelayMin = 25;
|
|
||||||
int W5_spawnDelayMax = 45;
|
|
||||||
|
|
||||||
int W5_fairyNumMin = 3;
|
|
||||||
int W5_fairyNumMax = 6;
|
|
||||||
|
|
||||||
// Angles
|
|
||||||
|
|
||||||
int W5_moveTimeMin = 55;
|
|
||||||
int W5_moveTimeMax = 70;
|
|
||||||
|
|
||||||
float W5_bulletSpdMin = 11;
|
|
||||||
float W5_bulletSpdMax = 13;
|
|
||||||
|
|
||||||
// Wave 6: Alt mushroom fairies (2 OR 3) spawns sparse rings (NOT GROUND)
|
|
||||||
|
|
||||||
int WG1_ringDenseMin = 10;
|
|
||||||
int WG1_ringDenseMax = 14;
|
|
||||||
|
|
||||||
float WG1_bulletSpdMin = 8;
|
|
||||||
float WG1_bulletSpdMax = 10;
|
|
||||||
|
|
||||||
int WG1_bulletDelayMin = 35;
|
|
||||||
int WG1_bulletDelayMax = 50;
|
|
||||||
|
|
||||||
// Wave 7 (S2): Yukionna with spiral (counts as ground)
|
|
||||||
|
|
||||||
int WG2_spiralDenseMin = 6;
|
|
||||||
int WG2_spiralDenseMax = 9;
|
|
||||||
|
|
||||||
int WG2_spiralNumMin = 3;
|
|
||||||
int WG2_spiralNumMax = 5;
|
|
||||||
|
|
||||||
float WG2_spiralSpdMin = 7.5;
|
|
||||||
float WG2_spiralSpdMax = 9.5;
|
|
||||||
|
|
||||||
int WG2_spiralDelayMax = 40;
|
|
||||||
int WG2_spiralDelayMin = 25;
|
|
||||||
|
|
||||||
// Wave 8 (S2): Medium fairies with W3 movements leave large fireball walls. Uses W4 parameters
|
|
||||||
// Wave 9 (S2): Large number of small fairies come in from both sides (with W3 movements) firing aimed bullets.
|
|
||||||
|
|
||||||
int W9_spawnDelayMin = 5;
|
|
||||||
int W9_spawnDelayMax = 10;
|
|
||||||
|
|
||||||
int W9_fairyNumMin = 8;
|
|
||||||
int W9_fairyNumMax = 12;
|
|
||||||
|
|
||||||
int W9_bulletDelayMin = 30;
|
|
||||||
int W9_bulletDelayMax = 50;
|
|
||||||
|
|
||||||
float W9_bulletSpdMin = 7.5;
|
|
||||||
float W9_bulletSpdMax = 9.5;
|
|
||||||
|
|
||||||
// Wave 10 (S2): Clumped medium fairy (3 per line) come in from the right to fire large fireball lines.
|
|
||||||
|
|
||||||
int W10_spawnDelayMin = 35;
|
|
||||||
int W10_spawnDelayMax = 50;
|
|
||||||
|
|
||||||
int W10_fairyNumMin = 2;
|
|
||||||
int W10_fairyNumMax = 4;
|
|
||||||
|
|
||||||
int W10_bulletLineNumMin = 3;
|
|
||||||
int W10_bulletLineNumMax = 5;
|
|
||||||
|
|
||||||
// Angles
|
|
||||||
|
|
||||||
int W10_moveTimeMin = 55;
|
|
||||||
int W10_moveTimeMax = 70;
|
|
||||||
|
|
||||||
float W10_bulletSpdMin = 8;
|
|
||||||
float W10_bulletSpdMax = 9.5;
|
|
||||||
|
|
||||||
/*
|
|
||||||
// Wave Ground 1
|
|
||||||
|
|
||||||
int[] sign1Rect = [1024, 512, 1280, 768];
|
|
||||||
int[] platformRect = [1536, 256, 2304, 768];
|
|
||||||
|
|
||||||
int WG1_invinTimeMin = 15;
|
|
||||||
int WG1_invinTimeMax = 25;
|
|
||||||
|
|
||||||
// Wave Ground 2
|
|
||||||
|
|
||||||
int[] cannonRect = [2048, 768, 2304, 1024];
|
|
||||||
int[] bushRect = [512, 1024, 1280, 1536];
|
|
||||||
|
|
||||||
int WG2_bulletNumMin = 3;
|
|
||||||
int WG2_bulletNumMax = 5;
|
|
||||||
|
|
||||||
float WG2_angRangeMin = 1.4;
|
|
||||||
float WG2_angRangeMax = 2;
|
|
||||||
|
|
||||||
float WG2_bulletSpdMin = 9;
|
|
||||||
float WG2_bulletSpdMax = 11;
|
|
||||||
|
|
||||||
int WG2_bulletDelayMin = 30;
|
|
||||||
int WG2_bulletDelayMax = 40;
|
|
||||||
|
|
||||||
int WG2_invinTimeMin = 45;
|
|
||||||
int WG2_invinTimeMax = 60;
|
|
||||||
|
|
||||||
// Wave Ground 1A
|
|
||||||
|
|
||||||
// Graphic: fairy
|
|
||||||
|
|
||||||
// Uses high speed
|
|
||||||
|
|
||||||
int WG1A_bulletNumMin = 1;
|
|
||||||
int WG1A_bulletNumMax = 3;
|
|
||||||
|
|
||||||
int WG1A_bulletDelayMin = 45;
|
|
||||||
int WG1A_bulletDelayMax = 60;
|
|
||||||
|
|
||||||
float WG1A_bulletSpdMin = 12;
|
|
||||||
float WG1A_bulletSpdMax = 15;
|
|
||||||
|
|
||||||
int[] sign2Rect = [1280, 512, 1536, 768];
|
|
||||||
|
|
||||||
int WG1A_invinTimeMin = 25;
|
|
||||||
int WG1A_invinTimeMax = 40;
|
|
||||||
|
|
||||||
// Wave Ground 3 (Rybb) -> orange line spirals
|
|
||||||
|
|
||||||
int WG3_spiralDenseMin = 5;
|
|
||||||
int WG3_spiralDenseMax = 8;
|
|
||||||
|
|
||||||
int WG3_spiralNumMin = 3;
|
|
||||||
int WG3_spiralNumMax = 6;
|
|
||||||
|
|
||||||
float WG3_spiralSpdMin = 7.5;
|
|
||||||
float WG3_spiralSpdMax = 9.5;
|
|
||||||
|
|
||||||
int WG3_spiralDelayMax = 40;
|
|
||||||
int WG3_spiralDelayMin = 30;
|
|
||||||
|
|
||||||
int[] rybbRect = [1280, 1024, 1792, 1536];
|
|
||||||
|
|
||||||
// Wave Ground 4 (ITS THE FUCKING BUSSY FAIRIES)
|
|
||||||
// Number of fairies affected by RANK and KILL SPEED
|
|
||||||
|
|
||||||
int[] bush2Rect = [512, 1536, 1280, 2048];
|
|
||||||
int[] bush2ARect = [256, 1536, 512, 1792];
|
|
||||||
|
|
||||||
int WG4_enmNumMin = 4;
|
|
||||||
int WG4_enmNumMax = 6;
|
|
||||||
|
|
||||||
int WG4_bulletDelayMin = 45;
|
|
||||||
int WG4_bulletDelayMax = 60;
|
|
||||||
|
|
||||||
float WG4_bulletSpdMin = 11;
|
|
||||||
float WG4_bulletSpdMax = 14;
|
|
||||||
|
|
||||||
int WG4_invinTimeMin = 100;
|
|
||||||
int WG4_invinTimeMax = 120;
|
|
||||||
|
|
||||||
// Wave Ground 5 (Decker) -> Line bullets.
|
|
||||||
|
|
||||||
int WG5_bulletNumMin = 4;
|
|
||||||
int WG5_bulletNumMax = 6;
|
|
||||||
|
|
||||||
int WG5_bulletDelayMin = 12;
|
|
||||||
int WG5_bulletDelayMax = 15;
|
|
||||||
|
|
||||||
float WG5_bulletSpdMin = 7;
|
|
||||||
float WG5_bulletSpdMax = 9;
|
|
||||||
|
|
||||||
int[] deckerRect = [1792, 1024, 1792+512, 1536];
|
|
||||||
|
|
||||||
// Wave Ground 6 -> Your ass is our base
|
|
||||||
*/
|
|
||||||
|
|
||||||
task UpdateDrops(){
|
|
||||||
|
|
||||||
// According to rank
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
|
|
||||||
smallFlyingEnm_itemPointMax = FUNC_LERP_LINEAR(12, 18, rank/RANK_MAX);
|
|
||||||
medFlyingEnm_itemPointMax = FUNC_LERP_LINEAR(21, 28, rank/RANK_MAX);
|
|
||||||
largeFlyingEnm_itemPointMax = FUNC_LERP_LINEAR(30, 40, rank/RANK_MAX);
|
|
||||||
verylargeFlyingEnm_itemPointMax = FUNC_LERP_LINEAR(45, 60, rank/RANK_MAX);
|
|
||||||
|
|
||||||
smallGroundEnm_itemAmmoMax = FUNC_LERP_LINEAR(4, 6, rank/RANK_MAX);
|
|
||||||
medGroundEnm_itemAmmoMax = FUNC_LERP_LINEAR(6, 8, rank/RANK_MAX);
|
|
||||||
largeGroundEnm_itemAmmoMax = FUNC_LERP_LINEAR(18, 25, rank/RANK_MAX);
|
|
||||||
verylargeGroundEnm_itemAmmoMax = FUNC_LERP_LINEAR(60, 75, rank/RANK_MAX);
|
|
||||||
|
|
||||||
smallEnm_itemChainMax = FUNC_LERP_LINEAR(12, 16, rank/RANK_MAX);
|
|
||||||
mediumEnm_itemChainMax = FUNC_LERP_LINEAR(16, 20, rank/RANK_MAX);
|
|
||||||
largeEnm_itemChainMax = FUNC_LERP_LINEAR(20, 24, rank/RANK_MAX);
|
|
||||||
|
|
||||||
wait(5);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
Reference:
|
|
||||||
|
|
||||||
task SpawnSpiral(float angStart, int spinDir){
|
|
||||||
|
|
||||||
async{
|
|
||||||
ascent(i in -1..linespiralNum[diff]){
|
|
||||||
|
|
||||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){break;}
|
|
||||||
|
|
||||||
int shot = CreateFan(bossObj, 1, KEV_LEAF_ORANGE, linespiralLineCount[diff],
|
|
||||||
angStart+i*spinDir*linespiralAngOffset[diff], 0, linespiralSpd2[diff], linespiralSpd1[diff],
|
|
||||||
0.6,
|
|
||||||
0, 0,
|
|
||||||
PATTERN_FAN, false
|
|
||||||
);
|
|
||||||
int shot2 = CreateFan(bossObj, 1, KEV_LEAF_ORANGE, linespiralLineCount[diff],
|
|
||||||
angStart+(180+angStart)-i*spinDir*linespiralAngOffset[diff], 0, linespiralSpd2[diff], linespiralSpd1[diff], 0.6,
|
|
||||||
0, 0,
|
|
||||||
PATTERN_FAN, false
|
|
||||||
);
|
|
||||||
|
|
||||||
if(ObjEnemy_GetInfo(bossObj, INFO_LIFE) <= 0){Obj_Delete(shot); Obj_Delete(shot2);}
|
|
||||||
|
|
||||||
else{Shoot1;}
|
|
||||||
|
|
||||||
wait([4, 4, 3, 3][diff]);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
Before Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 468 KiB |
Before Width: | Height: | Size: 330 KiB |
Before Width: | Height: | Size: 6.9 MiB |
Before Width: | Height: | Size: 393 KiB |
Before Width: | Height: | Size: 99 KiB |
|
@ -1,121 +0,0 @@
|
||||||
let bossBG = "script/Jam10/resourceLib/Jam10_BG.png";
|
|
||||||
let overlayBG = "script/Jam10/resourceLib/Overlay.png";
|
|
||||||
let soundWarn = ObjSound_Create();
|
|
||||||
let alphaMax = 255*((GetAreaCommonData("Config", "BGOpacity", 100))/100);
|
|
||||||
let exVol = GetAreaCommonData("Config", "SEVol", 100) * 0.01;
|
|
||||||
|
|
||||||
//ObjSound_Load(sound, "script/game/resourceLib/dialogueblip.wav");
|
|
||||||
ObjSound_Load(soundWarn, "script/game/resourceLib/warnSound.wav");
|
|
||||||
//ObjSound_SetVolumeRate(sound, 100 * blipVol);
|
|
||||||
ObjSound_SetVolumeRate(soundWarn, 100 * blipVol);
|
|
||||||
//ObjSound_SetSoundDivision(sound, SOUND_SE);
|
|
||||||
ObjSound_SetSoundDivision(soundWarn, SOUND_SE);
|
|
||||||
|
|
||||||
//LoadSound("script/game/StageLib/dialogueblip.wav");
|
|
||||||
|
|
||||||
LoadTextureEx(bossBG, true, true);
|
|
||||||
|
|
||||||
function <void> _ScrollBackground(){
|
|
||||||
|
|
||||||
int BossImg = _Create2DImage(bossBG, [0, 0, 640*4, 720]);
|
|
||||||
ObjRender_SetScaleXYZ(BossImg, 1);
|
|
||||||
ObjRender_SetPosition(BossImg, STG_WIDTH/2, STG_HEIGHT/2, 1);
|
|
||||||
Obj_SetRenderPriorityI(BossImg, 24);
|
|
||||||
|
|
||||||
int OverlayImg = _Create2DImage(overlayBG, [0, 0, 640*4, 720]);
|
|
||||||
ObjRender_SetScaleXYZ(OverlayImg, 1);
|
|
||||||
ObjRender_SetPosition(OverlayImg, STG_WIDTH/2, STG_HEIGHT/2, 1);
|
|
||||||
Obj_SetRenderPriorityI(OverlayImg, 23);
|
|
||||||
|
|
||||||
ObjRender_SetAlpha(OverlayImg, 255);
|
|
||||||
|
|
||||||
float scrollSpeed = 0;
|
|
||||||
float maxscrollSpeed = 14;
|
|
||||||
int curScroll = 0;
|
|
||||||
|
|
||||||
async{
|
|
||||||
loop{
|
|
||||||
maxscrollSpeed = 9+GetCommonData("Rank", 1)*1.25;
|
|
||||||
wait(60);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async{
|
|
||||||
|
|
||||||
loop{
|
|
||||||
|
|
||||||
//ObjSprite2D_SetDestRect(BossImg, 0, 0, STG_WIDTH/2, STG_HEIGHT/2);
|
|
||||||
ObjSprite2D_SetSourceRect(BossImg, curScroll, 0, curScroll+640*4, 720);
|
|
||||||
curScroll += scrollSpeed;
|
|
||||||
|
|
||||||
scrollSpeed = min(maxscrollSpeed, scrollSpeed+0.05);
|
|
||||||
yield;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
ascent(i in 0..90){
|
|
||||||
ObjRender_SetAlpha(BossImg, Interpolate_Decelerate(0, alphaMax, i/90));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
NotifyEventAll(EV_START_MUSIC, 0);
|
|
||||||
|
|
||||||
//Dialogue();
|
|
||||||
//ObjRender_SetAlpha(BossImg, 255*((GetAreaCommonData("Config", "BGOpacity", 100))/100));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function <void> Dialogue(){
|
|
||||||
|
|
||||||
//ObjSound_Play(soundWarn);
|
|
||||||
|
|
||||||
wait(30);
|
|
||||||
|
|
||||||
int objText3 = CreateTextObject(
|
|
||||||
|
|
||||||
STG_WIDTH/2, STG_HEIGHT/3-60, 80,
|
|
||||||
" ", "Origami Mommy",
|
|
||||||
0x72CBFF, 0x72CBFF,
|
|
||||||
0x08007C, 10,
|
|
||||||
71
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
int objText = CreateTextObject(
|
|
||||||
|
|
||||||
STG_WIDTH/2, STG_HEIGHT/2-60, 36,
|
|
||||||
" ", "Origami Mommy",
|
|
||||||
0x72CBFF, 0x72CBFF,
|
|
||||||
0x08007C, 6,
|
|
||||||
71
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
int objText2 = CreateTextObject(
|
|
||||||
|
|
||||||
STG_WIDTH/2, STG_HEIGHT/2, 36,
|
|
||||||
" ", "Origami Mommy",
|
|
||||||
0x72CBFF, 0x72CBFF,
|
|
||||||
0x08007C, 6,
|
|
||||||
71
|
|
||||||
|
|
||||||
);
|
|
||||||
|
|
||||||
ObjText_SetHorizontalAlignment(objText, ALIGNMENT_CENTER);
|
|
||||||
ObjText_SetHorizontalAlignment(objText2, ALIGNMENT_CENTER);
|
|
||||||
ObjText_SetHorizontalAlignment(objText3, ALIGNMENT_CENTER);
|
|
||||||
|
|
||||||
TTextScroll(objText3, "GET READY!");
|
|
||||||
TTextScroll(objText, "IN 99 SECONDS");
|
|
||||||
//wait(60);
|
|
||||||
TTextScroll(objText2, "BECOME THE STRONGEST!");
|
|
||||||
|
|
||||||
wait(60);
|
|
||||||
|
|
||||||
Obj_Delete(objText);
|
|
||||||
Obj_Delete(objText2);
|
|
||||||
Obj_Delete(objText3);
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,84 +0,0 @@
|
||||||
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
|
|
||||||
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 7.1-c000 79.b0f8be9, 2021/12/08-19:11:22 ">
|
|
||||||
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
|
||||||
<rdf:Description rdf:about=""
|
|
||||||
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
|
|
||||||
xmlns:xmpDM="http://ns.adobe.com/xmp/1.0/DynamicMedia/"
|
|
||||||
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
|
|
||||||
xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
|
|
||||||
xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
|
||||||
<xmp:CreateDate>2023</xmp:CreateDate>
|
|
||||||
<xmp:MetadataDate>2023-01-30T18:08:26+07:00</xmp:MetadataDate>
|
|
||||||
<xmp:ModifyDate>2023-01-30T18:08:26+07:00</xmp:ModifyDate>
|
|
||||||
<xmpDM:Tracks>
|
|
||||||
<rdf:Bag>
|
|
||||||
<rdf:li rdf:parseType="Resource">
|
|
||||||
<xmpDM:trackName>CuePoint Markers</xmpDM:trackName>
|
|
||||||
<xmpDM:trackType>Cue</xmpDM:trackType>
|
|
||||||
<xmpDM:frameRate>f48000</xmpDM:frameRate>
|
|
||||||
</rdf:li>
|
|
||||||
<rdf:li rdf:parseType="Resource">
|
|
||||||
<xmpDM:trackName>CD Track Markers</xmpDM:trackName>
|
|
||||||
<xmpDM:trackType>Track</xmpDM:trackType>
|
|
||||||
<xmpDM:frameRate>f48000</xmpDM:frameRate>
|
|
||||||
</rdf:li>
|
|
||||||
<rdf:li rdf:parseType="Resource">
|
|
||||||
<xmpDM:trackName>Subclip Markers</xmpDM:trackName>
|
|
||||||
<xmpDM:trackType>InOut</xmpDM:trackType>
|
|
||||||
<xmpDM:frameRate>f48000</xmpDM:frameRate>
|
|
||||||
</rdf:li>
|
|
||||||
</rdf:Bag>
|
|
||||||
</xmpDM:Tracks>
|
|
||||||
<xmpMM:InstanceID>xmp.iid:ee759497-91c4-e549-9cd3-eb5dc35ca7c0</xmpMM:InstanceID>
|
|
||||||
<xmpMM:DocumentID>xmp.did:ee759497-91c4-e549-9cd3-eb5dc35ca7c0</xmpMM:DocumentID>
|
|
||||||
<xmpMM:OriginalDocumentID>xmp.did:ec36adcb-d4b8-a648-9da4-f79adf813889</xmpMM:OriginalDocumentID>
|
|
||||||
<xmpMM:History>
|
|
||||||
<rdf:Seq>
|
|
||||||
<rdf:li rdf:parseType="Resource">
|
|
||||||
<stEvt:action>saved</stEvt:action>
|
|
||||||
<stEvt:instanceID>xmp.iid:ec36adcb-d4b8-a648-9da4-f79adf813889</stEvt:instanceID>
|
|
||||||
<stEvt:when>2023-01-30T18:08:26+07:00</stEvt:when>
|
|
||||||
<stEvt:softwareAgent>Adobe Audition 23.0 (Windows)</stEvt:softwareAgent>
|
|
||||||
<stEvt:changed>/metadata</stEvt:changed>
|
|
||||||
</rdf:li>
|
|
||||||
<rdf:li rdf:parseType="Resource">
|
|
||||||
<stEvt:action>saved</stEvt:action>
|
|
||||||
<stEvt:instanceID>xmp.iid:ee759497-91c4-e549-9cd3-eb5dc35ca7c0</stEvt:instanceID>
|
|
||||||
<stEvt:when>2023-01-30T18:08:26+07:00</stEvt:when>
|
|
||||||
<stEvt:softwareAgent>Adobe Audition 23.0 (Windows)</stEvt:softwareAgent>
|
|
||||||
<stEvt:changed>/</stEvt:changed>
|
|
||||||
</rdf:li>
|
|
||||||
</rdf:Seq>
|
|
||||||
</xmpMM:History>
|
|
||||||
<xmpMM:DerivedFrom rdf:parseType="Resource">
|
|
||||||
<stRef:instanceID>xmp.iid:ec36adcb-d4b8-a648-9da4-f79adf813889</stRef:instanceID>
|
|
||||||
<stRef:documentID>xmp.did:ec36adcb-d4b8-a648-9da4-f79adf813889</stRef:documentID>
|
|
||||||
<stRef:originalDocumentID>xmp.did:ec36adcb-d4b8-a648-9da4-f79adf813889</stRef:originalDocumentID>
|
|
||||||
</xmpMM:DerivedFrom>
|
|
||||||
<dc:format>audio/ogg; codec="vorbis"</dc:format>
|
|
||||||
</rdf:Description>
|
|
||||||
</rdf:RDF>
|
|
||||||
</x:xmpmeta>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<?xpacket end="w"?>
|
|
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 71 KiB |
Before Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 444 KiB |
|
@ -1,84 +0,0 @@
|
||||||
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
|
|
||||||
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 7.1-c000 79.b0f8be9, 2021/12/08-19:11:22 ">
|
|
||||||
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
|
|
||||||
<rdf:Description rdf:about=""
|
|
||||||
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
|
|
||||||
xmlns:xmpDM="http://ns.adobe.com/xmp/1.0/DynamicMedia/"
|
|
||||||
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
|
|
||||||
xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
|
|
||||||
xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
|
||||||
<xmp:CreateDate>2023</xmp:CreateDate>
|
|
||||||
<xmp:MetadataDate>2023-01-30T18:08:06+07:00</xmp:MetadataDate>
|
|
||||||
<xmp:ModifyDate>2023-01-30T18:08:06+07:00</xmp:ModifyDate>
|
|
||||||
<xmpDM:Tracks>
|
|
||||||
<rdf:Bag>
|
|
||||||
<rdf:li rdf:parseType="Resource">
|
|
||||||
<xmpDM:trackName>CuePoint Markers</xmpDM:trackName>
|
|
||||||
<xmpDM:trackType>Cue</xmpDM:trackType>
|
|
||||||
<xmpDM:frameRate>f44100</xmpDM:frameRate>
|
|
||||||
</rdf:li>
|
|
||||||
<rdf:li rdf:parseType="Resource">
|
|
||||||
<xmpDM:trackName>CD Track Markers</xmpDM:trackName>
|
|
||||||
<xmpDM:trackType>Track</xmpDM:trackType>
|
|
||||||
<xmpDM:frameRate>f44100</xmpDM:frameRate>
|
|
||||||
</rdf:li>
|
|
||||||
<rdf:li rdf:parseType="Resource">
|
|
||||||
<xmpDM:trackName>Subclip Markers</xmpDM:trackName>
|
|
||||||
<xmpDM:trackType>InOut</xmpDM:trackType>
|
|
||||||
<xmpDM:frameRate>f44100</xmpDM:frameRate>
|
|
||||||
</rdf:li>
|
|
||||||
</rdf:Bag>
|
|
||||||
</xmpDM:Tracks>
|
|
||||||
<xmpMM:InstanceID>xmp.iid:a92e0057-5a6e-4d4d-be15-5837f8b9ea9d</xmpMM:InstanceID>
|
|
||||||
<xmpMM:DocumentID>xmp.did:a92e0057-5a6e-4d4d-be15-5837f8b9ea9d</xmpMM:DocumentID>
|
|
||||||
<xmpMM:OriginalDocumentID>xmp.did:bc8b308b-79c6-374a-a9d0-2248d15c4871</xmpMM:OriginalDocumentID>
|
|
||||||
<xmpMM:History>
|
|
||||||
<rdf:Seq>
|
|
||||||
<rdf:li rdf:parseType="Resource">
|
|
||||||
<stEvt:action>saved</stEvt:action>
|
|
||||||
<stEvt:instanceID>xmp.iid:bc8b308b-79c6-374a-a9d0-2248d15c4871</stEvt:instanceID>
|
|
||||||
<stEvt:when>2023-01-30T18:08:06+07:00</stEvt:when>
|
|
||||||
<stEvt:softwareAgent>Adobe Audition 23.0 (Windows)</stEvt:softwareAgent>
|
|
||||||
<stEvt:changed>/metadata</stEvt:changed>
|
|
||||||
</rdf:li>
|
|
||||||
<rdf:li rdf:parseType="Resource">
|
|
||||||
<stEvt:action>saved</stEvt:action>
|
|
||||||
<stEvt:instanceID>xmp.iid:a92e0057-5a6e-4d4d-be15-5837f8b9ea9d</stEvt:instanceID>
|
|
||||||
<stEvt:when>2023-01-30T18:08:06+07:00</stEvt:when>
|
|
||||||
<stEvt:softwareAgent>Adobe Audition 23.0 (Windows)</stEvt:softwareAgent>
|
|
||||||
<stEvt:changed>/</stEvt:changed>
|
|
||||||
</rdf:li>
|
|
||||||
</rdf:Seq>
|
|
||||||
</xmpMM:History>
|
|
||||||
<xmpMM:DerivedFrom rdf:parseType="Resource">
|
|
||||||
<stRef:instanceID>xmp.iid:bc8b308b-79c6-374a-a9d0-2248d15c4871</stRef:instanceID>
|
|
||||||
<stRef:documentID>xmp.did:bc8b308b-79c6-374a-a9d0-2248d15c4871</stRef:documentID>
|
|
||||||
<stRef:originalDocumentID>xmp.did:bc8b308b-79c6-374a-a9d0-2248d15c4871</stRef:originalDocumentID>
|
|
||||||
</xmpMM:DerivedFrom>
|
|
||||||
<dc:format>audio/ogg; codec="vorbis"</dc:format>
|
|
||||||
</rdf:Description>
|
|
||||||
</rdf:RDF>
|
|
||||||
</x:xmpmeta>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<?xpacket end="w"?>
|
|
|
@ -1,120 +0,0 @@
|
||||||
// Sound effects for boss go here.
|
|
||||||
|
|
||||||
let lib = GetModuleDirectory() ~ "./script/KevinSystem/RyannSFX/ryannlib/";
|
|
||||||
let libKev = "script/KevinSound/";
|
|
||||||
|
|
||||||
let SFXVol = GetAreaCommonData("Config", "SEVol", 100) * 0.01;
|
|
||||||
|
|
||||||
// Sound paths
|
|
||||||
|
|
||||||
let defeatsnd = lib ~ "../bossdie.wav";
|
|
||||||
let lw = lib ~ "sp_lastword.wav";
|
|
||||||
|
|
||||||
let bullet1 = libKev ~ "bfxr_Shoot1.wav"; // Regular bullet sound
|
|
||||||
let bullet2 = libKev ~ "bfxr_Shoot2.wav"; // Shiny bullet sound
|
|
||||||
|
|
||||||
let bullet3 = lib ~ "se_explode.wav";
|
|
||||||
let lightning1 = lib ~ "se_don00.wav"; // Lightning sound 1/Explosion sound
|
|
||||||
let lightning2 = lib ~ "se_kira02.wav"; // Lightning sound 2
|
|
||||||
let laze = lib ~ "se_lazer01.wav"; // Laser sound
|
|
||||||
let lazeB = lib ~ "se_lazer00.wav";
|
|
||||||
let slash = lib ~ "se_slash.ogg";
|
|
||||||
|
|
||||||
let pause = libKev ~ "bfxr_Pause.wav";
|
|
||||||
let chargeA = libKev ~ "bfxr_Charge.wav";
|
|
||||||
|
|
||||||
let selection = libKev ~ "se_select00.wav";
|
|
||||||
let thunder = lib ~ "se_boon00.wav"; // Thunder/delay laser sound
|
|
||||||
let bomb = lib ~ "se_nep00.wav";
|
|
||||||
|
|
||||||
let extend = libKev ~ "bfxr_ExtendLegacy.wav"; // Clear game!
|
|
||||||
|
|
||||||
let lenenwarn = lib ~ "../lenenwarning.wav";
|
|
||||||
let chargeB = lib ~ "se_ch01.wav";
|
|
||||||
|
|
||||||
// Sound objects declarations
|
|
||||||
|
|
||||||
let warnsfx = ObjSound_Create();
|
|
||||||
let lwmusic = ObjSound_Create();
|
|
||||||
let fire1 = ObjSound_Create();
|
|
||||||
let fire2 = ObjSound_Create();
|
|
||||||
let fire3 = ObjSound_Create();
|
|
||||||
let light1 = ObjSound_Create();
|
|
||||||
let light2 = ObjSound_Create();
|
|
||||||
let laser = ObjSound_Create();
|
|
||||||
let laserB = ObjSound_Create();
|
|
||||||
let charge = ObjSound_Create();
|
|
||||||
let phase = ObjSound_Create();
|
|
||||||
let grz = ObjSound_Create();
|
|
||||||
let swing = ObjSound_Create();
|
|
||||||
let pausesfx = ObjSound_Create();
|
|
||||||
let choose = ObjSound_Create();
|
|
||||||
let thundersfx = ObjSound_Create();
|
|
||||||
let bombsfx = ObjSound_Create();
|
|
||||||
let extendsfx = ObjSound_Create();
|
|
||||||
let icebreak = ObjSound_Create();
|
|
||||||
let entrance = ObjSound_Create();
|
|
||||||
|
|
||||||
int sfxBoom = ObjSound_Create();
|
|
||||||
int bossBoom = ObjSound_Create();
|
|
||||||
int bossLaugh = ObjSound_Create();
|
|
||||||
|
|
||||||
// Merge function that loads sounds and significantly decreases volume
|
|
||||||
// so the ears do not die from SFX overload.
|
|
||||||
|
|
||||||
function LoadEx(targetobj, targetpath, targetvol){
|
|
||||||
|
|
||||||
ObjSound_Load(targetobj, targetpath);
|
|
||||||
ObjSound_SetVolumeRate(targetobj, targetvol * SFXVol);
|
|
||||||
ObjSound_SetSoundDivision(targetobj, SOUND_SE);
|
|
||||||
}
|
|
||||||
|
|
||||||
task _SoundTask{
|
|
||||||
|
|
||||||
//LoadEx(lwmusic, lw, 80);
|
|
||||||
LoadEx(fire1, bullet1, 65);
|
|
||||||
LoadEx(fire2, bullet2, 65);
|
|
||||||
LoadEx(pausesfx, pause, 40);
|
|
||||||
LoadEx(extendsfx, extend, 60);
|
|
||||||
|
|
||||||
LoadEx(light1, lightning1, 20);
|
|
||||||
LoadEx(light2, lightning2, 20);
|
|
||||||
LoadEx(laser, laze, 20);
|
|
||||||
LoadEx(laserB, lazeB, 20);
|
|
||||||
//LoadEx(grz, graze, 20);
|
|
||||||
LoadEx(swing, slash, 20);
|
|
||||||
|
|
||||||
LoadEx(choose, selection, 30);
|
|
||||||
LoadEx(thundersfx, thunder, 25);
|
|
||||||
LoadEx(charge, chargeA, 75);
|
|
||||||
LoadEx(phase, chargeB, 75);
|
|
||||||
LoadEx(fire3, bullet3, 35);
|
|
||||||
LoadEx(bombsfx, bomb, 50);
|
|
||||||
|
|
||||||
LoadEx(warnsfx, lenenwarn, 30);
|
|
||||||
LoadEx(icebreak, lib ~ "se_don00.wav", 60);
|
|
||||||
LoadEx(entrance, lib ~ "se_gun00.wav", 60);
|
|
||||||
|
|
||||||
LoadEx(sfxBoom, libKev ~ "bfxr_EnemyBoom.wav", 60);
|
|
||||||
LoadEx(bossBoom, libKev ~ "bossBoom.wav", 60);
|
|
||||||
LoadEx(bossLaugh, libKev ~ "RaspberryTickle_Giggle.wav", 60);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Functions to load sounds in scripts
|
|
||||||
|
|
||||||
task Shoot1{ObjSound_Play(fire1); return;}
|
|
||||||
task Shoot2{ObjSound_Play(fire2); return;}
|
|
||||||
task Shoot3{ObjSound_Play(fire3); return;}
|
|
||||||
task Lit1{ObjSound_Play(light1); return;}
|
|
||||||
task Lit2{ObjSound_Play(light2); return;}
|
|
||||||
task GrazeSFX{ObjSound_Play(grz); return;}
|
|
||||||
task SwordSlashSFX{ObjSound_Play(swing); return;}
|
|
||||||
task PauseGameSFX{ObjSound_Play(pausesfx); return;}
|
|
||||||
task SelectOptionSFX{ObjSound_Play(choose); return;}
|
|
||||||
task LaserSFX{ObjSound_Play(laser); return;}
|
|
||||||
task LaserBSFX{ObjSound_Play(laserB); return;}
|
|
||||||
task ThunderSFX{ObjSound_Play(thundersfx); return;}
|
|
||||||
task ChargeSFX{ObjSound_Play(charge); return;}
|
|
||||||
task ChargeBreakSFX{ObjSound_Play(phase); return;}
|
|
||||||
task BombSFX{ObjSound_Play(bombsfx); return;}
|
|
||||||
task ExtendSFX{ObjSound_Play(extendsfx); return;}
|
|
|
@ -1,22 +0,0 @@
|
||||||
|
|
||||||
if(IsCommonDataAreaExists("PIV") == false){
|
|
||||||
CreateCommonDataArea("PIV");
|
|
||||||
SetAreaCommonData("PIV", "currentvalue", 10000);
|
|
||||||
SetAreaCommonData("PIV", "ChainAmount", 1);
|
|
||||||
}
|
|
||||||
else{}
|
|
||||||
|
|
||||||
if(IsCommonDataAreaExists("ScriptID") == false){
|
|
||||||
CreateCommonDataArea("ScriptID");
|
|
||||||
SetAreaCommonData("ScriptID", "SystemID", 0);
|
|
||||||
SetAreaCommonData("ScriptID", "ItemID", 0);
|
|
||||||
}
|
|
||||||
else{}
|
|
||||||
|
|
||||||
if(IsCommonDataAreaExists("ChainChecks") == false){
|
|
||||||
CreateCommonDataArea("ChainChecks");
|
|
||||||
SetAreaCommonData("ChainChecks", "IsChaining", false);
|
|
||||||
}
|
|
||||||
else{}
|
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 997 KiB |
Before Width: | Height: | Size: 1.0 MiB |
Before Width: | Height: | Size: 810 KiB |
Before Width: | Height: | Size: 630 KiB |
Before Width: | Height: | Size: 1.1 MiB |
Before Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 871 KiB |
Before Width: | Height: | Size: 242 KiB |
Before Width: | Height: | Size: 255 KiB |
|
@ -1,33 +0,0 @@
|
||||||
/*
|
|
||||||
For Danmakufu users.
|
|
||||||
|
|
||||||
These functions are meant to be used alongside my pastel shotsheet due to the very high native resolution.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Bullet rescaling task, also has functionality for setting a new hitbox size relative to the new bullet graphic size. I highly recommend leaving hitboxscale to true.
|
|
||||||
|
|
||||||
task _BulletRescale(target, float scale, bool hitboxscale, hitboxlevel){
|
|
||||||
|
|
||||||
ObjRender_SetScaleXYZ(target, scale, scale, 1);
|
|
||||||
|
|
||||||
if (hitboxscale){
|
|
||||||
ObjShot_SetIntersectionScaleXY(target, scale*hitboxlevel, scale*hitboxlevel); // Note the formula. The hitbox will have been scaled accordingly along with the bullet graphic, but you can use hitboxlevel to adjust the scale further.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
else{return;}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delay task, provided by Naudiz (@Naudogs). For best effects, ensure destscale is equal to the resized scale of the bullet graphic, and orgscale be larger than it.
|
|
||||||
|
|
||||||
task _Delay(target, del, orgscale, destscale, orgalpha, destalpha){
|
|
||||||
|
|
||||||
ObjShot_SetDelay(target, del);
|
|
||||||
ObjShot_SetDelayGraphic(target, ObjShot_GetImageID(target)); // unless you already have the ID in the function somewhere, in which case you can just use that, or use any other graphic
|
|
||||||
ObjShot_SetDelayMode(target, DELAY_LERP, LERP_ACCELERATE, LERP_DECELERATE); // delay mode, scale lerp, alpha lerp. Check ph3sx's New Functions Documentation.txt for more details.
|
|
||||||
ObjShot_SetDelayScaleParameter(target, destscale, orgscale, del); // lerps from orgscale to destscale scale in del frames (use the value from ObjShot_SetDelay for del)
|
|
||||||
ObjShot_SetDelayAlphaParameter(target, destalpha, orgalpha, del); // lerps from orgalpha to destalpha scale in del frames (use the value from ObjShot_SetDelay for del)
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
Kevin's Ultra HD/4K Pastel Shotsheet
|
|
||||||
|
|
||||||
0.10a
|
|
||||||
|
|
||||||
--------
|
|
||||||
|
|
||||||
Thank you for downloading and using my pastel shotsheet!
|
|
||||||
|
|
||||||
This shotsheet features various common bullet types in a variety of "pastel" colors - colors lighter than your usual bullet graphics, but they should hopefully still be just as visible nonetheless. It has a *very* big native resolution (the first sheet is 4096x4096, with each bullet graphic being 256x256), and therefore is meant to be used with a similarly large game resolution and/or bullet rescaling functions. (See misc.txt for information regarding the latter in Danmakufu). It comes pre-packed with shot data and shot constant sheets meant for instant use in Danmakufu.
|
|
||||||
|
|
||||||
The shotsheet is still heavily incomplete. In the works is a second sheet (4096x2048) featuring more bullet types (fireballs, lasers, bubbles), some changes to existing bullet graphics to improve aesthetic and visibility, and half-size versions for regular HD reoslutions.
|
|
||||||
|
|
||||||
How to use:
|
|
||||||
|
|
||||||
Extract the directory to an appropriate location in your project and to load them, just include the shot constant text file in your script file (shotconst_4K.txt).
|
|
||||||
--------
|
|
||||||
The shot sheet images can be used in other engines as well. However it is the responsibility of the user to port the shot sheet data themselves.
|
|
||||||
|
|
||||||
The shot sheet images are free to use NON-COMMERCIALLY. Please credit me (Kevinmonitor/Kevin Mink) fully!
|
|
||||||
|
|
||||||
You are free to modify the shot sheets. Please state so if you do so however (for example, in the credits for your project you put a "modified by the author with permission" next to my attribution).
|
|
||||||
|
|
||||||
Please do not redistribute these shotsheets on your own.
|
|
||||||
--------
|
|
||||||
CONTACT:
|
|
||||||
|
|
||||||
Discord: Kevinmonitor#6745
|
|
||||||
Twitter: @kevinminh_alt
|
|
|
@ -1,142 +0,0 @@
|
||||||
|
|
||||||
local
|
|
||||||
{
|
|
||||||
LoadTextureEx(GetCurrentScriptDirectory ~ "./KevinShot_Alt_HD.png", true, true);
|
|
||||||
LoadTextureEx(GetCurrentScriptDirectory ~ "./KevinShot_Alt_HD_Fireball.png", true, true);
|
|
||||||
LoadTextureEx(GetCurrentScriptDirectory ~ "./KevinShot_Alt_HD_Inv.png", true, true);
|
|
||||||
LoadTextureEx(GetCurrentScriptDirectory ~ "./KevinShot_Alt_HD_Fireball_Inv.png", true, true);
|
|
||||||
LoadEnemyShotData(GetCurrentScriptDirectory ~ "shotdata_HD.txt");
|
|
||||||
LoadEnemyShotData(GetCurrentScriptDirectory ~ "shotdata_HD_2.txt");
|
|
||||||
LoadEnemyShotData(GetCurrentScriptDirectory ~ "shotdata_HD_3.txt");
|
|
||||||
LoadEnemyShotData(GetCurrentScriptDirectory ~ "shotdata_HD_4.txt");
|
|
||||||
}
|
|
||||||
|
|
||||||
const KEV_BALL_RED = 2000;
|
|
||||||
const KEV_BALL_ORANGE = 2001;
|
|
||||||
const KEV_BALL_YELLOW = 2002;
|
|
||||||
const KEV_BALL_GREEN = 2003;
|
|
||||||
const KEV_BALL_AQUA = 2004;
|
|
||||||
const KEV_BALL_LAVENDER = 2005;
|
|
||||||
const KEV_BALL_PURPLE = 2006;
|
|
||||||
const KEV_BALL_PINK = 2007;
|
|
||||||
const KEV_BALL_WHITE = 2008;
|
|
||||||
|
|
||||||
const KEV_FIRESMALL_RED = 2011;
|
|
||||||
const KEV_FIRESMALL_ORANGE = 2012;
|
|
||||||
const KEV_FIRESMALL_YELLOW = 2013;
|
|
||||||
const KEV_FIRESMALL_GREEN = 2014;
|
|
||||||
const KEV_FIRESMALL_AQUA = 2015;
|
|
||||||
const KEV_FIRESMALL_LAVENDER = 2016;
|
|
||||||
const KEV_FIRESMALL_PURPLE = 2017;
|
|
||||||
const KEV_FIRESMALL_PINK = 2018;
|
|
||||||
const KEV_FIRESMALL_WHITE = 2019;
|
|
||||||
|
|
||||||
const KEV_LEAF_RED = 2022;
|
|
||||||
const KEV_LEAF_ORANGE = 2023;
|
|
||||||
const KEV_LEAF_YELLOW = 2024;
|
|
||||||
const KEV_LEAF_GREEN = 2025;
|
|
||||||
const KEV_LEAF_AQUA = 2026;
|
|
||||||
const KEV_LEAF_LAVENDER = 2027;
|
|
||||||
const KEV_LEAF_PURPLE = 2028;
|
|
||||||
const KEV_LEAF_PINK = 2029;
|
|
||||||
const KEV_LEAF_WHITE = 2030;
|
|
||||||
|
|
||||||
const KEV_FIRELARGE_RED = 2033;
|
|
||||||
const KEV_FIRELARGE_ORANGE = 2034;
|
|
||||||
const KEV_FIRELARGE_YELLOW = 2035;
|
|
||||||
const KEV_FIRELARGE_GREEN = 2036;
|
|
||||||
const KEV_FIRELARGE_AQUA = 2037;
|
|
||||||
const KEV_FIRELARGE_LAVENDER = 2038;
|
|
||||||
const KEV_FIRELARGE_PURPLE = 2039;
|
|
||||||
const KEV_FIRELARGE_PINK = 2040;
|
|
||||||
const KEV_FIRELARGE_WHITE = 2041;
|
|
||||||
|
|
||||||
const KEV_ARROW_RED = 2044;
|
|
||||||
const KEV_ARROW_ORANGE = 2045;
|
|
||||||
const KEV_ARROW_YELLOW = 2046;
|
|
||||||
const KEV_ARROW_GREEN = 2047;
|
|
||||||
const KEV_ARROW_AQUA = 2048;
|
|
||||||
const KEV_ARROW_LAVENDER = 2049;
|
|
||||||
const KEV_ARROW_PURPLE = 2050;
|
|
||||||
const KEV_ARROW_PINK = 2051;
|
|
||||||
const KEV_ARROW_WHITE = 2052;
|
|
||||||
|
|
||||||
const KEV_BUTTERFLY_RED = 2055;
|
|
||||||
const KEV_BUTTERFLY_ORANGE = 2056;
|
|
||||||
const KEV_BUTTERFLY_YELLOW = 2057;
|
|
||||||
const KEV_BUTTERFLY_GREEN = 2058;
|
|
||||||
const KEV_BUTTERFLY_AQUA = 2059;
|
|
||||||
const KEV_BUTTERFLY_LAVENDER = 2060;
|
|
||||||
const KEV_BUTTERFLY_PURPLE = 2061;
|
|
||||||
const KEV_BUTTERFLY_PINK = 2062;
|
|
||||||
const KEV_BUTTERFLY_WHITE = 2063;
|
|
||||||
|
|
||||||
const KEV_AURABALL_RED = 2066;
|
|
||||||
const KEV_AURABALL_ORANGE = 2067;
|
|
||||||
const KEV_AURABALL_YELLOW = 2068;
|
|
||||||
const KEV_AURABALL_GREEN = 2069;
|
|
||||||
const KEV_AURABALL_AQUA = 2070;
|
|
||||||
const KEV_AURABALL_LAVENDER = 2071;
|
|
||||||
const KEV_AURABALL_PURPLE = 2072;
|
|
||||||
const KEV_AURABALL_PINK = 2073;
|
|
||||||
const KEV_AURABALL_WHITE = 2074;
|
|
||||||
|
|
||||||
const KEV_FIRE_RED = 2075;
|
|
||||||
const KEV_FIRE_ORANGE = 2076;
|
|
||||||
const KEV_FIRE_YELLOW = 2077;
|
|
||||||
const KEV_FIRE_GREEN = 2078;
|
|
||||||
const KEV_FIRE_AQUA = 2079;
|
|
||||||
const KEV_FIRE_LAVENDER = 2080;
|
|
||||||
const KEV_FIRE_PURPLE = 2081;
|
|
||||||
const KEV_FIRE_PINK = 2082;
|
|
||||||
const KEV_FIRE_WHITE = 2083;
|
|
||||||
|
|
||||||
const KEV_BUBBLE_RED = 2086;
|
|
||||||
const KEV_BUBBLE_ORANGE = 2087;
|
|
||||||
const KEV_BUBBLE_YELLOW = 2088;
|
|
||||||
const KEV_BUBBLE_GREEN = 2089;
|
|
||||||
const KEV_BUBBLE_AQUA = 2090;
|
|
||||||
const KEV_BUBBLE_LAVENDER = 2091;
|
|
||||||
const KEV_BUBBLE_PURPLE = 2092;
|
|
||||||
const KEV_BUBBLE_PINK = 2093;
|
|
||||||
|
|
||||||
const KEV_KNIFE_RED = 2096;
|
|
||||||
const KEV_KNIFE_ORANGE = 2097;
|
|
||||||
const KEV_KNIFE_YELLOW = 2098;
|
|
||||||
const KEV_KNIFE_GREEN = 2099;
|
|
||||||
const KEV_KNIFE_AQUA = 2100;
|
|
||||||
const KEV_KNIFE_LAVENDER = 2101;
|
|
||||||
const KEV_KNIFE_PURPLE = 2102;
|
|
||||||
const KEV_KNIFE_PINK = 2103;
|
|
||||||
|
|
||||||
const KEV_BITCHKILLER_ARROW = 3000;
|
|
||||||
|
|
||||||
// Inverted colours
|
|
||||||
|
|
||||||
const KEV_BALL_RED_INV = 2200; const KEV_PEOPLE_RED_INV = 2211; const KEV_LEAF_RED_INV = 2222; const KEV_AMULET_RED_INV = 2233; const KEV_ARROW_RED_INV = 2244; const KEV_BUTTERFLY_RED_INV = 2255; const KEV_AURABALL_RED_INV = 2266; const KEV_BUBBLE_RED_INV = 2286; const KEV_KNIFE_RED_INV = 2296;
|
|
||||||
|
|
||||||
const KEV_BALL_ORANGE_INV = 2201; const KEV_PEOPLE_ORANGE_INV = 2212; const KEV_LEAF_ORANGE_INV = 2223; const KEV_AMULET_ORANGE_INV = 2234; const KEV_ARROW_ORANGE_INV = 2245; const KEV_BUTTERFLY_ORANGE_INV = 2256; const KEV_AURABALL_ORANGE_INV = 2267; const KEV_BUBBLE_ORANGE_INV = 2287; const KEV_KNIFE_ORANGE_INV = 2297;
|
|
||||||
|
|
||||||
const KEV_BALL_YELLOW_INV = 2202; const KEV_PEOPLE_YELLOW_INV = 2213; const KEV_LEAF_YELLOW_INV = 2224; const KEV_AMULET_YELLOW_INV = 2235; const KEV_ARROW_YELLOW_INV = 2246; const KEV_BUTTERFLY_YELLOW_INV = 2257; const KEV_AURABALL_YELLOW_INV = 2268; const KEV_BUBBLE_YELLOW_INV = 2288; const KEV_KNIFE_YELLOW_INV = 2298;
|
|
||||||
|
|
||||||
const KEV_BALL_GREEN_INV = 2203; const KEV_PEOPLE_GREEN_INV = 2214; const KEV_LEAF_GREEN_INV = 2225; const KEV_AMULET_GREEN_INV = 2236; const KEV_ARROW_GREEN_INV = 2247; const KEV_BUTTERFLY_GREEN_INV = 2258; const KEV_AURABALL_GREEN_INV = 2269; const KEV_BUBBLE_GREEN_INV = 2289; const KEV_KNIFE_GREEN_INV = 2299;
|
|
||||||
|
|
||||||
const KEV_BALL_AQUA_INV = 2204; const KEV_PEOPLE_AQUA_INV = 2215; const KEV_LEAF_AQUA_INV = 2226; const KEV_AMULET_AQUA_INV = 2237; const KEV_ARROW_AQUA_INV = 2248; const KEV_BUTTERFLY_AQUA_INV = 2259; const KEV_AURABALL_AQUA_INV = 2270; const KEV_BUBBLE_AQUA_INV = 2290; const KEV_KNIFE_AQUA_INV = 2300;
|
|
||||||
|
|
||||||
const KEV_BALL_LAVENDER_INV = 2205; const KEV_PEOPLE_LAVENDER_INV = 2216; const KEV_LEAF_LAVENDER_INV = 2227; const KEV_AMULET_LAVENDER_INV = 2238; const KEV_ARROW_LAVENDER_INV = 2249; const KEV_BUTTERFLY_LAVENDER_INV = 2260; const KEV_AURABALL_LAVENDER_INV = 2271; const KEV_BUBBLE_LAVENDER_INV = 2291; const KEV_KNIFE_LAVENDER_INV = 2301;
|
|
||||||
|
|
||||||
const KEV_BALL_PURPLE_INV = 2206; const KEV_PEOPLE_PURPLE_INV = 2217; const KEV_LEAF_PURPLE_INV = 2228; const KEV_AMULET_PURPLE_INV = 2239; const KEV_ARROW_PURPLE_INV = 2250; const KEV_BUTTERFLY_PURPLE_INV = 2261; const KEV_AURABALL_PURPLE_INV = 2272; const KEV_BUBBLE_PURPLE_INV = 2292; const KEV_KNIFE_PURPLE_INV = 2302;
|
|
||||||
|
|
||||||
const KEV_BALL_PINK_INV = 2207; const KEV_PEOPLE_PINK_INV = 2218; const KEV_LEAF_PINK_INV = 2229; const KEV_AMULET_PINK_INV = 2240; const KEV_ARROW_PINK_INV = 2251; const KEV_BUTTERFLY_PINK_INV = 2262; const KEV_AURABALL_PINK_INV = 2273; const KEV_BUBBLE_PINK_INV = 2293; const KEV_KNIFE_PINK_INV = 2303;
|
|
||||||
|
|
||||||
const KEV_BALL_WHITE_INV = 2208; const KEV_PEOPLE_WHITE_INV = 2219; const KEV_LEAF_WHITE_INV = 2230; const KEV_AMULET_WHITE_INV = 2241; const KEV_ARROW_WHITE_INV = 2252; const KEV_BUTTERFLY_WHITE_INV = 2263; const KEV_AURABALL_WHITE_INV = 2274; const KEV_BUBBLE_WHITE_INV = 2294; const KEV_KNIFE_WHITE_INV = 2304;
|
|
||||||
|
|
||||||
const KEV_FIRE_RED_INV = 2275;
|
|
||||||
const KEV_FIRE_ORANGE_INV = 2276;
|
|
||||||
const KEV_FIRE_YELLOW_INV = 2277;
|
|
||||||
const KEV_FIRE_GREEN_INV = 2278;
|
|
||||||
const KEV_FIRE_AQUA_INV = 2279;
|
|
||||||
const KEV_FIRE_LAVENDER_INV = 2280;
|
|
||||||
const KEV_FIRE_PURPLE_INV = 2281;
|
|
||||||
const KEV_FIRE_PINK_INV = 2282;
|
|
||||||
const KEV_FIRE_WHITE_INV = 2283;
|
|
|
@ -1,108 +0,0 @@
|
||||||
#UserShotData
|
|
||||||
|
|
||||||
shot_image = "./KevinShot_PxEdit_A.png"
|
|
||||||
|
|
||||||
// BALL
|
|
||||||
|
|
||||||
ShotData { id = 2000 rect = (0,0,128,128) collision = 12 delay_color = (255,255,255) angular_velocity = 5} //RED
|
|
||||||
ShotData { id = 2001 rect = (128,0,256,128) collision = 12 delay_color = (255,255,255) angular_velocity = 5} //ORANGE
|
|
||||||
ShotData { id = 2002 rect = (256,0,384,128) collision = 12 delay_color = (255,255,255) angular_velocity = 5} //YELLOW
|
|
||||||
ShotData { id = 2003 rect = (384,0,512,128) collision = 12 delay_color = (255,255,255) angular_velocity = 5} //GREEN
|
|
||||||
ShotData { id = 2004 rect = (512,0,640,128) collision = 12 delay_color = (255,255,255) angular_velocity = 5} //AQUA
|
|
||||||
ShotData { id = 2005 rect = (640,0,768,128) collision = 12 delay_color = (255,255,255) angular_velocity = 5} //LAVENDER
|
|
||||||
ShotData { id = 2006 rect = (768,0,896,128) collision = 12 delay_color = (255,255,255) angular_velocity = 5} //PURPLE
|
|
||||||
ShotData { id = 2007 rect = (896,0,1024,128) collision = 12 delay_color = (255,255,255) angular_velocity = 5} //PINK
|
|
||||||
ShotData { id = 2008 rect = (1024,0,1152,128) collision = 12 delay_color = (255,255,255) angular_velocity = 5} //WHITE
|
|
||||||
|
|
||||||
// FIRE SMALL
|
|
||||||
|
|
||||||
ShotData { id = 2011 rect = (0,128,128,256) collision = (12,0,8) delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2012 rect = (128,128,256,256) collision = (12,0,8) delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2013 rect = (256,128,384,256) collision = (12,0,8) delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2014 rect = (384,128,512,256) collision = (12,0,8) delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2015 rect = (512,128,640,256) collision = (12,0,8) delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2016 rect = (640,128,768,256) collision = (12,0,8) delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2017 rect = (768,128,896,256) collision = (12,0,8) delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2018 rect = (896,128,1024,256) collision = (12,0,8) delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2019 rect = (1024,128,1152,256) collision = (12,0,8) delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
// LEAF
|
|
||||||
|
|
||||||
ShotData { id = 2022 rect = (0,256,128,384) collision = 8 delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2023 rect = (128,256,256,384) collision = 8 delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2024 rect = (256,256,384,384) collision = 8 delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2025 rect = (384,256,512,384) collision = 8 delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2026 rect = (512,256,640,384) collision = 8 delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2027 rect = (640,256,768,384) collision = 8 delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2028 rect = (768,256,896,384) collision = 8 delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2029 rect = (896,256,1024,384) collision = 8 delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2030 rect = (1024,256,1152,384) collision = 8 delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
// FIRE BIG
|
|
||||||
|
|
||||||
ShotData { id = 2033 rect = (0,384,128,512) collision = (20,0,12) delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2034 rect = (128,384,256,512) collision = (20,0,12) delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2035 rect = (256,384,384,512) collision = (20,0,12) delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2036 rect = (384,384,512,512) collision = (20,0,12) delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2037 rect = (512,384,640,512) collision = (20,0,12) delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2038 rect = (640,384,768,512) collision = (20,0,12) delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2039 rect = (768,384,896,512) collision = (20,0,12) delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2040 rect = (896,384,1024,512) collision = (20,0,12) delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2041 rect = (1024,384,1152,512) collision = (20,0,12) delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
ShotData { id = 2044 rect = (0,512,128,640) collision = (6,0,20) delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2045 rect = (128,512,256,640) collision = (6,0,20) delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2046 rect = (256,512,384,640) collision = (6,0,20) delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2047 rect = (384,512,512,640) collision = (6,0,20) delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2048 rect = (512,512,640,640) collision = (6,0,20) delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2049 rect = (640,512,768,640) collision = (6,0,20) delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2050 rect = (768,512,896,640) collision = (6,0,20) delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2051 rect = (896,512,1024,640) collision = (6,0,20) delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2052 rect = (1024,512,1152,640) collision = (6,0,20) delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
ShotData { id = 2055 rect = (0,640,128,768) collision = 12 delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2056 rect = (128,640,256,768) collision = 12 delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2057 rect = (256,640,384,768) collision = 12 delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2058 rect = (384,640,512,768) collision = 12 delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2059 rect = (512,640,640,768) collision = 12 delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2060 rect = (640,640,768,768) collision = 12 delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2061 rect = (768,640,896,768) collision = 12 delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2062 rect = (896,640,1024,768) collision = 12 delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2063 rect = (1024,640,1152,768) collision = 12 delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
ShotData { id = 2066 rect = (0,768,128,896) collision = 18 delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2067 rect = (128,768,256,896) collision = 18 delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2068 rect = (256,768,384,896) collision = 18 delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2069 rect = (384,768,512,896) collision = 18 delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2070 rect = (512,768,640,896) collision = 18 delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2071 rect = (640,768,768,896) collision = 18 delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2072 rect = (768,768,896,896) collision = 18 delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2073 rect = (896,768,1024,896) collision = 18 delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2074 rect = (1024,768,1152,896) collision = 18 delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
75 -> 83: fireballs
|
|
||||||
|
|
||||||
ShotData { id = 2086 rect = (0,896,256,1152) collision = 48 delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2087 rect = (256,896,512,1152) collision = 48 delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2088 rect = (512,896,768,1152) collision = 48 delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2089 rect = (768,896,1024,1152) collision = 48 delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2090 rect = (1024,896,1280,1152) collision = 48 delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2091 rect = (1280,896,1536,1152) collision = 48 delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2092 rect = (1536,896,1792,1152) collision = 48 delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2093 rect = (1792,896,2048,1152) collision = 48 delay_color = (255,255,255) } //PINK
|
|
||||||
|
|
||||||
ShotData { id = 2096 rect = (0,1152,128,1280) collision = (8.5,0,-9.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (6.5,0,32.5) delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2097 rect = (128,1152,256,1280) collision = (8.5,0,-9.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (6.5,0,32.5) delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2098 rect = (256,1152,384,1280) collision = (8.5,0,-9.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (6.5,0,32.5) delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2099 rect = (384,1152,512,1280) collision = (8.5,0,-9.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (6.5,0,32.5) delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2100 rect = (512,1152,640,1280) collision = (8.5,0,-9.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (6.5,0,32.5) delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2101 rect = (640,1152,768,1280) collision = (8.5,0,-9.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (6.5,0,32.5) delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2102 rect = (768,1152,896,1280) collision = (8.5,0,-9.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (6.5,0,32.5) delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2103 rect = (896,1152,1024,1280) collision = (8.5,0,-9.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (6.5,0,32.5) delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2104 rect = (1024,1152,1152,1280) collision = (8.5,0,-9.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (6.5,0,32.5) delay_color = (255,255,255) } //WHITE
|
|
||||||
ShotData { id = 2105 rect = (1152,1152,1280,1280) collision = (8.5,0,-9.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (6.5,0,32.5) delay_color = (255,255,255) } //
|
|
||||||
ShotData { id = 2106 rect = (1280,1152,1408,1280) collision = (8.5,0,-9.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (6.5,0,32.5) delay_color = (255,255,255) } //
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
#UserShotData
|
|
||||||
|
|
||||||
shot_image = "./KevinShot_PxEdit_C.png"
|
|
||||||
|
|
||||||
ShotData { id = 2075 AnimationData { animation_data = ( 6, 0, 0, 128, 128); animation_data = ( 6, 128, 0, 256, 128); animation_data = ( 6, 256, 0, 384, 128); animation_data = ( 6, 384, 0, 512, 128); } render = ALPHA collision = (13, 0, 24) delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2076 AnimationData { animation_data = ( 6, 0, 128, 128, 256); animation_data = ( 6, 128, 128, 256, 256); animation_data = ( 6, 256, 128, 384, 256); animation_data = ( 6, 384, 128, 512, 256); } render = ALPHA collision = (13, 0, 24) delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2077 AnimationData { animation_data = ( 6, 0, 256, 128, 384); animation_data = ( 6, 128, 256, 256, 384); animation_data = ( 6, 256, 256, 384, 384); animation_data = ( 6, 384, 256, 512, 384); } render = ALPHA collision = (13, 0, 24) delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2078 AnimationData { animation_data = ( 6, 0, 384, 128, 512); animation_data = ( 6, 128, 384, 256, 512); animation_data = ( 6, 256, 384, 384, 512); animation_data = ( 6, 384, 384, 512, 512); } render = ALPHA collision = (13, 0, 24) delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2079 AnimationData { animation_data = ( 6, 0, 512, 128, 640); animation_data = ( 6, 128, 512, 256, 640); animation_data = ( 6, 256, 512, 384, 640); animation_data = ( 6, 384, 512, 512, 640); } render = ALPHA collision = (13, 0, 24) delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2080 AnimationData { animation_data = ( 6, 0, 640, 128, 768); animation_data = ( 6, 128, 640, 256, 768); animation_data = ( 6, 256, 640, 384, 768); animation_data = ( 6, 384, 640, 512, 768); } render = ALPHA collision = (13, 0, 24) delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2081 AnimationData { animation_data = ( 6, 0, 768, 128, 896); animation_data = ( 6, 128, 768, 256, 896); animation_data = ( 6, 256, 768, 384, 896); animation_data = ( 6, 384, 768, 512, 896); } render = ALPHA collision = (13, 0, 24) delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2082 AnimationData { animation_data = ( 6, 0, 896, 128, 1024); animation_data = ( 6, 128, 896, 256, 1024); animation_data = ( 6, 256, 896, 384, 1024); animation_data = ( 6, 384, 896, 512, 1024); } render = ALPHA collision = (13, 0, 24) delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2083 AnimationData { animation_data = ( 6, 0, 1024, 128, 1152); animation_data = ( 6, 128, 1024, 256, 1152); animation_data = ( 6, 256, 1024, 384, 1152); animation_data = ( 6, 384, 1024, 512, 1152); } render = ALPHA collision = (13, 0, 24) delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
// Bitchkiller Arrow
|
|
||||||
|
|
||||||
ShotData {
|
|
||||||
id = 3000
|
|
||||||
rect = (1024, 0, 1536, 1280)
|
|
||||||
collision = (102, 0, 256)
|
|
||||||
collision = (50, 0, 352)
|
|
||||||
delay_color = (255, 255, 255)
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,103 +0,0 @@
|
||||||
#UserShotData
|
|
||||||
|
|
||||||
// Inverted colors
|
|
||||||
|
|
||||||
shot_image = "./KevinShot_PxEdit_B.png"
|
|
||||||
|
|
||||||
ShotData { id = 2200 rect = (0,0,128,128) collision = 26 delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2201 rect = (128,0,256,128) collision = 26 delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2202 rect = (256,0,384,128) collision = 26 delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2203 rect = (384,0,512,128) collision = 26 delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2204 rect = (512,0,640,128) collision = 26 delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2205 rect = (640,0,768,128) collision = 26 delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2206 rect = (768,0,896,128) collision = 26 delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2207 rect = (896,0,1024,128) collision = 26 delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2208 rect = (1024,0,1152,128) collision = 26 delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
ShotData { id = 2211 rect = (0,128,128,256) collision = (17,0,7) delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2212 rect = (128,128,256,256) collision = (17,0,7) delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2213 rect = (256,128,384,256) collision = (17,0,7) delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2214 rect = (384,128,512,256) collision = (17,0,7) delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2215 rect = (512,128,640,256) collision = (17,0,7) delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2216 rect = (640,128,768,256) collision = (17,0,7) delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2217 rect = (768,128,896,256) collision = (17,0,7) delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2218 rect = (896,128,1024,256) collision = (17,0,7) delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2219 rect = (1024,128,1152,256) collision = (17,0,7) delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
ShotData { id = 2222 rect = (0,256,128,384) collision = (8,0,6) collision = (8,0,-6) delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2223 rect = (128,256,256,384) collision = (8,0,6) collision = (8,0,-6) delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2224 rect = (256,256,384,384) collision = (8,0,6) collision = (8,0,-6) delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2225 rect = (384,256,512,384) collision = (8,0,6) collision = (8,0,-6) delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2226 rect = (512,256,640,384) collision = (8,0,6) collision = (8,0,-6) delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2227 rect = (640,256,768,384) collision = (8,0,6) collision = (8,0,-6) delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2228 rect = (768,256,896,384) collision = (8,0,6) collision = (8,0,-6) delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2229 rect = (896,256,1024,384) collision = (8,0,6) collision = (8,0,-6) delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2230 rect = (1024,256,1152,384) collision = (8,0,6) collision = (8,0,-6) delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
ShotData { id = 2233 rect = (0,384,256,512) collision = (28,0,0) delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2234 rect = (128,384,256,512) collision = (28,0,0) delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2235 rect = (256,384,384,512) collision = (28,0,0) delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2236 rect = (384,384,512,512) collision = (28,0,0) delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2237 rect = (512,384,640,512) collision = (28,0,0) delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2238 rect = (640,384,768,512) collision = (28,0,0) delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2239 rect = (768,384,896,512) collision = (28,0,0) delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2240 rect = (896,384,1024,512) collision = (28,0,0) delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2241 rect = (1024,384,1152,512) collision = (28,0,0) delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
ShotData { id = 2244 rect = (0,512,128,640) collision = (8,0,20) delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2245 rect = (128,512,256,640) collision = (8,0,20) delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2246 rect = (256,512,384,640) collision = (8,0,20) delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2247 rect = (384,512,512,640) collision = (8,0,20) delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2248 rect = (512,512,640,640) collision = (8,0,20) delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2249 rect = (640,512,768,640) collision = (8,0,20) delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2250 rect = (768,512,896,640) collision = (8,0,20) delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2251 rect = (896,512,1024,640) collision = (8,0,20) delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2252 rect = (1024,512,1152,640) collision = (8,0,20) delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
ShotData { id = 2255 rect = (0,640,128,768) collision = 12 delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2256 rect = (128,640,256,768) collision = 12 delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2257 rect = (256,640,384,768) collision = 12 delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2258 rect = (384,640,512,768) collision = 12 delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2259 rect = (512,640,640,768) collision = 12 delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2260 rect = (640,640,768,768) collision = 12 delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2261 rect = (768,640,896,768) collision = 12 delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2262 rect = (896,640,1024,768) collision = 12 delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2263 rect = (1024,640,1152,768) collision = 12 delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
ShotData { id = 2266 rect = (0,768,128,896) collision = 18 delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2267 rect = (128,768,256,896) collision = 18 delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2268 rect = (256,768,384,896) collision = 18 delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2269 rect = (384,768,512,896) collision = 18 delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2270 rect = (512,768,640,896) collision = 18 delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2271 rect = (640,768,768,896) collision = 18 delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2272 rect = (768,768,896,896) collision = 18 delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2273 rect = (896,768,1024,896) collision = 18 delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2274 rect = (1024,768,1152,896) collision = 18 delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
/*
|
|
||||||
75 -> 83: fireballs
|
|
||||||
|
|
||||||
ShotData { id = 2086 rect = (0,896,256,1152) collision = 48 delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2087 rect = (256,896,512,1152) collision = 48 delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2088 rect = (512,896,768,1152) collision = 48 delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2089 rect = (768,896,1024,1152) collision = 48 delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2090 rect = (1024,896,1280,1152) collision = 48 delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2091 rect = (1280,896,1536,1152) collision = 48 delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2092 rect = (1536,896,1792,1152) collision = 48 delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2093 rect = (1792,896,2048,1152) collision = 48 delay_color = (255,255,255) } //PINK
|
|
||||||
*/
|
|
||||||
|
|
||||||
ShotData { id = 2296 rect = (0,1152,128,1280) collision = (8.5,0,-5.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (7.5,0,32.5) delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2097 rect = (128,1152,256,1280) collision = (8.5,0,-5.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (7.5,0,32.5) delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2098 rect = (256,1152,384,1280) collision = (8.5,0,-5.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (7.5,0,32.5) delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2099 rect = (384,1152,512,1280) collision = (8.5,0,-5.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (7.5,0,32.5) delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2100 rect = (512,1152,640,1280) collision = (8.5,0,-5.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (7.5,0,32.5) delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2101 rect = (640,1152,768,1280) collision = (8.5,0,-5.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (7.5,0,32.5) delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2102 rect = (768,1152,896,1280) collision = (8.5,0,-5.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (7.5,0,32.5) delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2103 rect = (896,1152,1024,1280) collision = (8.5,0,-5.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (7.5,0,32.5) delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2104 rect = (1024,1152,1152,1280) collision = (8.5,0,-5.5) collision = (8.5,0,6.5) collision = (8.5,0,19.5) collision = (7.5,0,32.5) delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
#UserShotData
|
|
||||||
|
|
||||||
shot_image = "./KevinShot_Alt_HD_Fireball_Inv.png"
|
|
||||||
|
|
||||||
ShotData { id = 2275 AnimationData { animation_data = ( 4, 0, 0, 128, 128); animation_data = ( 4, 128, 0, 256, 128); animation_data = ( 4, 256, 0, 384, 128); animation_data = ( 4, 384, 0, 512, 128); animation_data = ( 4, 512, 0, 640, 128); } render = ALPHA collision = 13 delay_color = (255,255,255) } //RED
|
|
||||||
ShotData { id = 2276 AnimationData { animation_data = ( 4, 0, 128, 128, 256); animation_data = ( 4, 128, 128, 256, 256); animation_data = ( 4, 256, 128, 384, 256); animation_data = ( 4, 384, 128, 512, 256); animation_data = ( 4, 512, 128, 640, 256); } render = ALPHA collision = 13 delay_color = (255,255,255) } //ORANGE
|
|
||||||
ShotData { id = 2277 AnimationData { animation_data = ( 4, 0, 256, 128, 384); animation_data = ( 4, 128, 256, 256, 384); animation_data = ( 4, 256, 256, 384, 384); animation_data = ( 4, 384, 256, 512, 384); animation_data = ( 4, 512, 256, 640, 384); } render = ALPHA collision = 13 delay_color = (255,255,255) } //YELLOW
|
|
||||||
ShotData { id = 2278 AnimationData { animation_data = ( 4, 0, 384, 128, 512); animation_data = ( 4, 128, 384, 256, 512); animation_data = ( 4, 256, 384, 384, 512); animation_data = ( 4, 384, 384, 512, 512); animation_data = ( 4, 512, 384, 640, 512); } render = ALPHA collision = 13 delay_color = (255,255,255) } //GREEN
|
|
||||||
ShotData { id = 2279 AnimationData { animation_data = ( 4, 0, 512, 128, 640); animation_data = ( 4, 128, 512, 256, 640); animation_data = ( 4, 256, 512, 384, 640); animation_data = ( 4, 384, 512, 512, 640); animation_data = ( 4, 512, 512, 640, 640); } render = ALPHA collision = 13 delay_color = (255,255,255) } //AQUA
|
|
||||||
ShotData { id = 2280 AnimationData { animation_data = ( 4, 0, 640, 128, 768); animation_data = ( 4, 128, 640, 256, 768); animation_data = ( 4, 256, 640, 384, 768); animation_data = ( 4, 384, 640, 512, 768); animation_data = ( 4, 512, 640, 640, 768); } render = ALPHA collision = 13 delay_color = (255,255,255) } //LAVENDER
|
|
||||||
ShotData { id = 2281 AnimationData { animation_data = ( 4, 0, 768, 128, 896); animation_data = ( 4, 128, 768, 256, 896); animation_data = ( 4, 256, 768, 384, 896); animation_data = ( 4, 384, 768, 512, 896); animation_data = ( 4, 512, 768, 640, 896); } render = ALPHA collision = 13 delay_color = (255,255,255) } //PURPLE
|
|
||||||
ShotData { id = 2282 AnimationData { animation_data = ( 4, 0, 896, 128, 1024); animation_data = ( 4, 128, 896, 256, 1024); animation_data = ( 4, 256, 896, 384, 1024); animation_data = ( 4, 384, 896, 512, 1024); animation_data = ( 4, 512, 896, 640, 1024); } render = ALPHA collision = 13 delay_color = (255,255,255) } //PINK
|
|
||||||
ShotData { id = 2283 AnimationData { animation_data = ( 4, 0, 1024, 128, 1152); animation_data = ( 4, 128, 1024, 256, 1152); animation_data = ( 4, 256, 1024, 384, 1152); animation_data = ( 4, 384, 1024, 512, 1152); animation_data = ( 4, 512, 1024, 640, 1152); } render = ALPHA collision = 13 delay_color = (255,255,255) } //WHITE
|
|
||||||
ShotData { id = 2283 AnimationData { animation_data = ( 4, 0, 1024, 128, 1152); animation_data = ( 4, 128, 1024, 256, 1152); animation_data = ( 4, 256, 1024, 384, 1152); animation_data = ( 4, 384, 1024, 512, 1152); animation_data = ( 4, 512, 1024, 640, 1152); } render = ALPHA collision = 13 delay_color = (255,255,255) } //WHITE
|
|
||||||
|
|
|
@ -1,829 +0,0 @@
|
||||||
/* --------------------------------------------------------------------
|
|
||||||
|
|
||||||
UNIVERSAL/GENERAL FUNCTIONS USED FOR PLAYERS
|
|
||||||
|
|
||||||
These functions may/will be reused for future scripts as well.
|
|
||||||
|
|
||||||
--------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "script/KevinSystem/kevin_system/Kevin_ItemConst.txt"
|
|
||||||
#include "script/KevinSystem/kevin_system/Kevin_ItemLib.txt"
|
|
||||||
#include "script/KevinSystem/kevin_system/Lib_Const.dnh"
|
|
||||||
#include "script/KevinSystem/Kevin_PlayerLib_HUD.dnh"
|
|
||||||
//#include "script/KevinSystem/Universal_Lib.txt"
|
|
||||||
|
|
||||||
float universalAlpha = GetAreaCommonData("Config", "PlayerShotOpacity", 60);
|
|
||||||
|
|
||||||
let POINTER_PIV = LoadAreaCommonDataValuePointer("PIV", "currentvalue", 1000);
|
|
||||||
let POINTER_CHAIN = LoadAreaCommonDataValuePointer("PIV", "ChainAmount", 1);
|
|
||||||
let POINTER_CHAINGAUGE = LoadAreaCommonDataValuePointer("PIV", "ChainGauge", 0);
|
|
||||||
let POINTER_SPECIALAMMO = LoadAreaCommonDataValuePointer("PIV", "SpecialAmmo", 100);
|
|
||||||
let POINTER_SPECIALCHECK = LoadAreaCommonDataValuePointer("PIV", "IsUsingSpecial", false);
|
|
||||||
let POINTER_CHAINCHECK = LoadAreaCommonDataValuePointer("PIV", "IsChaining", false);
|
|
||||||
|
|
||||||
//universalAlpha = 255; // Debug
|
|
||||||
|
|
||||||
function CreateTextObject(
|
|
||||||
float mx, my, size,
|
|
||||||
string text, font,
|
|
||||||
int colorTop, colorBottom,
|
|
||||||
int borderColor, borderWidth,
|
|
||||||
int renderPriority
|
|
||||||
){
|
|
||||||
|
|
||||||
let obj = ObjText_Create();
|
|
||||||
ObjText_SetText(obj, text);
|
|
||||||
ObjText_SetFontSize(obj, size);
|
|
||||||
ObjText_SetFontType(obj, font);
|
|
||||||
ObjText_SetFontColorTop(obj, colorTop);
|
|
||||||
ObjText_SetFontColorBottom(obj, colorBottom);
|
|
||||||
ObjText_SetFontBorderType(obj, BORDER_FULL);
|
|
||||||
ObjText_SetFontBorderColor(obj, borderColor);
|
|
||||||
ObjText_SetFontBorderWidth(obj, borderWidth);
|
|
||||||
Obj_SetRenderPriorityI(obj, renderPriority);
|
|
||||||
ObjRender_SetX(obj, mx);
|
|
||||||
ObjRender_SetY(obj, my);
|
|
||||||
return obj;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function <int> _Create2DImage(imgpath, int[] rectarray){
|
|
||||||
|
|
||||||
int imgname = ObjPrim_Create(OBJ_SPRITE_2D);
|
|
||||||
ObjPrim_SetTexture(imgname, imgpath);
|
|
||||||
ObjSprite2D_SetSourceRect(imgname, rectarray);
|
|
||||||
ObjSprite2D_SetDestCenter(imgname);
|
|
||||||
//ObjRender_SetPosition(imgname, positionstart)
|
|
||||||
|
|
||||||
return imgname;
|
|
||||||
}
|
|
||||||
|
|
||||||
// thanks ttbd owo
|
|
||||||
|
|
||||||
function CreateEffectObject(px, py, img, blendtype, left, top, right, bottom)
|
|
||||||
{
|
|
||||||
let obj = ObjPrim_Create(OBJ_SPRITE_2D);
|
|
||||||
ObjPrim_SetTexture(obj, img);
|
|
||||||
ObjSprite2D_SetSourceRect(obj, left, top, right, bottom);
|
|
||||||
ObjSprite2D_SetDestCenter(obj);
|
|
||||||
|
|
||||||
if(blendtype=="ALPHA"){ObjRender_SetBlendType(obj, BLEND_ALPHA);}
|
|
||||||
else if(blendtype=="MULTIPLY"){ObjRender_SetBlendType(obj, BLEND_MULTIPLY);}
|
|
||||||
else if(blendtype=="SUBTRACT"){ObjRender_SetBlendType(obj, BLEND_SUBTRACT);}
|
|
||||||
else if(blendtype=="SHADOW"){ObjRender_SetBlendType(obj, BLEND_SHADOW);}
|
|
||||||
else if(blendtype=="RGB"){ObjRender_SetBlendType(obj, BLEND_ADD_RGB);}
|
|
||||||
else if(blendtype=="ARGB"){ObjRender_SetBlendType(obj, BLEND_ADD_ARGB);}
|
|
||||||
else if(blendtype=="INVERT"){ObjRender_SetBlendType(obj, BLEND_INV_DESTRGB);}
|
|
||||||
|
|
||||||
ObjRender_SetPosition(obj, px, py, 0);
|
|
||||||
ObjRender_SetTextureFilter(obj, FILTER_POINT, FILTER_POINT, FILTER_POINT);
|
|
||||||
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
CHAIN SYSTEM: Crystals fill up your chain amount and refill your chain gauge, up to a max of 64x
|
|
||||||
Gauge starts to go down when you don't collect crystals: it resets the entire chain after 3 seconds
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
task _HandleChainGauge(){
|
|
||||||
|
|
||||||
// Gauge maxes at 100.
|
|
||||||
// If gauge reaches 0, reset the chain
|
|
||||||
float rateReduceNormal = 100/120;
|
|
||||||
|
|
||||||
float rateReduceCashin = 100/180; // x48-64
|
|
||||||
|
|
||||||
float rateReduceCashin_MED = 100/90; // x32-48
|
|
||||||
float rateReduceCashin_LOW = 100/60; // x16-32
|
|
||||||
float rateReduceCashin_PLACEBO = 100/30; // under x16
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
|
|
||||||
if(GetCommonDataPtr(POINTER_SPECIALCHECK, false) == false && GetCommonDataPtr(POINTER_CHAIN, 1) >= 64 && !isChain){NotifyEventAll(EV_CHAIN_MAX, 1);}
|
|
||||||
|
|
||||||
else{}
|
|
||||||
|
|
||||||
if(GetCommonDataPtr(POINTER_SPECIALCHECK, false) == true){
|
|
||||||
|
|
||||||
if(GetCommonDataPtr(POINTER_CHAINGAUGE, 0) <= 1){NotifyEventAll(EV_CHAIN_END, 1);}
|
|
||||||
|
|
||||||
if(GetCommonDataPtr(POINTER_CHAIN, 1) >= 48)
|
|
||||||
{SetCommonDataPtr(POINTER_CHAINGAUGE, max(0, GetCommonDataPtr(POINTER_CHAINGAUGE, 0)-rateReduceCashin));}
|
|
||||||
|
|
||||||
else if(GetCommonDataPtr(POINTER_CHAIN, 1) >= 32 && GetCommonDataPtr(POINTER_CHAIN, 1) < 48)
|
|
||||||
{SetCommonDataPtr(POINTER_CHAINGAUGE, max(0, GetCommonDataPtr(POINTER_CHAINGAUGE, 0)-rateReduceCashin_MED));}
|
|
||||||
|
|
||||||
else if(GetCommonDataPtr(POINTER_CHAIN, 1) >= 16 && GetCommonDataPtr(POINTER_CHAIN, 1) < 32)
|
|
||||||
{SetCommonDataPtr(POINTER_CHAINGAUGE, max(0, GetCommonDataPtr(POINTER_CHAINGAUGE, 0)-rateReduceCashin_LOW));}
|
|
||||||
|
|
||||||
else
|
|
||||||
{SetCommonDataPtr(POINTER_CHAINGAUGE, max(0, GetCommonDataPtr(POINTER_CHAINGAUGE, 0)-rateReduceCashin_PLACEBO));}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
else{
|
|
||||||
SetCommonDataPtr(POINTER_CHAINGAUGE, max(0, GetCommonDataPtr(POINTER_CHAINGAUGE, 0)-rateReduceNormal));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(
|
|
||||||
GetCommonDataPtr(POINTER_CHAINGAUGE, 0) <= 0
|
|
||||||
&& GetCommonDataPtr(POINTER_CHAIN, 1) > 1
|
|
||||||
)
|
|
||||||
{
|
|
||||||
SetCommonDataPtr(POINTER_CHAIN, 1);
|
|
||||||
SetCommonDataPtr(POINTER_SPECIALCHECK, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
yield;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
task _ShowChain(){
|
|
||||||
|
|
||||||
// HUD
|
|
||||||
|
|
||||||
//_ShowChainHUD();
|
|
||||||
|
|
||||||
// Playfield
|
|
||||||
|
|
||||||
let objPIVNum = ObjText_Create();
|
|
||||||
|
|
||||||
ObjText_SetFontSize(objPIVNum, 40);
|
|
||||||
ObjText_SetFontBold(objPIVNum, true);
|
|
||||||
ObjText_SetFontType(objPIVNum, "GravityRegular5");
|
|
||||||
ObjText_SetFontColorTop(objPIVNum, 0xFFFFFF);
|
|
||||||
ObjText_SetFontColorBottom(objPIVNum, 0xFFFFFF);
|
|
||||||
ObjText_SetFontBorderType(objPIVNum, BORDER_FULL);
|
|
||||||
ObjText_SetFontBorderColor(objPIVNum, 0xFF9A4F);
|
|
||||||
ObjText_SetFontBorderWidth(objPIVNum, 4);
|
|
||||||
ObjText_SetHorizontalAlignment(objPIVNum, ALIGNMENT_LEFT);
|
|
||||||
//ObjText_SetFontWeight(objPIVNum, 1000);
|
|
||||||
Obj_SetRenderPriorityI(objPIVNum, 60);
|
|
||||||
ObjText_SetSidePitch(objPIVNum, -3);
|
|
||||||
ObjRender_SetPosition(objPIVNum, STG_WIDTH * 1/2 + 96, STG_HEIGHT * 10/11, 0);
|
|
||||||
// DEBUG
|
|
||||||
//Obj_SetVisible(objPIV, false);
|
|
||||||
|
|
||||||
float value = 0;
|
|
||||||
|
|
||||||
//todo: change params
|
|
||||||
let objI = CreateEffectObject(STG_WIDTH/60, STG_HEIGHT/7, "script/KevinSystem/img/lol.png", "ALPHA", 0, 0, 244, 12);
|
|
||||||
ObjSprite2D_SetDestRect(objI, 0, 0, 122, 6);
|
|
||||||
Obj_SetRenderPriorityI(objI, 60);
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
value = min(GetCommonDataPtr(POINTER_SPECIALAMMO, 1), 100);
|
|
||||||
ObjText_SetText(objPIVNum, IntToString(GetCommonDataPtr(POINTER_PIV, 1000)));
|
|
||||||
|
|
||||||
//PIVMultiplierValue = value/1000;
|
|
||||||
let yass = rtos("00.00", value);
|
|
||||||
|
|
||||||
let mx = 60*5;
|
|
||||||
ObjSprite2D_SetDestRect(objI, 0, 0, (GetCommonDataPtr(POINTER_SPECIALAMMO, 100)/100)*mx, 32);
|
|
||||||
|
|
||||||
ObjRender_SetPosition(objI, STG_WIDTH/60+160, STG_HEIGHT * 11/12, 1);
|
|
||||||
|
|
||||||
if (GetPlayerY() >= STG_HEIGHT * 7/8){
|
|
||||||
ObjRender_SetAlpha(objI, 125);
|
|
||||||
ObjRender_SetAlpha(objPIVNum, 125);
|
|
||||||
}
|
|
||||||
|
|
||||||
else{
|
|
||||||
ObjRender_SetAlpha(objI, 255);
|
|
||||||
ObjRender_SetAlpha(objPIVNum, 255);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GetCommonDataPtr(POINTER_CHAINCHECK, false) == true) {
|
|
||||||
ObjRender_SetColor(objI, 0xFFAF1E);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(value >= 100){
|
|
||||||
ObjRender_SetColor(objI, 255, 90, 46);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
ObjRender_SetColor(objI, 255, 145, 115);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
if(GetCommonDataPtr(POINTER_SPECIALCHECK, false) == false){
|
|
||||||
|
|
||||||
ObjText_SetFontBorderWidth(objPIVNum, 3);
|
|
||||||
|
|
||||||
if(value < CHAIN_MAX){
|
|
||||||
|
|
||||||
ObjText_SetFontColorTop(objPIVNum, 0x9DEFFF);
|
|
||||||
ObjText_SetFontBorderColor(objPIVNum, 42, 0, 237);
|
|
||||||
ObjText_SetText(objPIVNum,
|
|
||||||
"[font size=23 oy=-8]FUN MODE CHARGING[r]" ~ yass ~ "[font size=25 oy=32]x[r]"
|
|
||||||
~ "[r][font size=21 oc=(172, 50, 50) oy=32]AMMO: " ~ rtos("00.00", GetCommonDataPtr(POINTER_SPECIALAMMO, 100))
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
else{
|
|
||||||
|
|
||||||
ObjText_SetFontColorTop(objPIVNum, 0x9DFFBC);
|
|
||||||
ObjText_SetFontBorderColor(objPIVNum, 0x39C832);
|
|
||||||
ObjText_SetText(objPIVNum,
|
|
||||||
"[font size=23 oy=-8]FUN MODE READY![r]" ~ yass ~ "[font size=25 oy=32]x[r]"
|
|
||||||
~ "[r][font size=21 oc=(172, 50, 50) oy=32]AMMO: " ~ rtos("00.00", GetCommonDataPtr(POINTER_SPECIALAMMO, 100))
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
else{
|
|
||||||
|
|
||||||
ObjText_SetFontColorTop(objPIVNum, 0xFFED9D);
|
|
||||||
ObjText_SetFontBorderColor(objPIVNum, 0xFF9A00);
|
|
||||||
ObjText_SetFontBorderWidth(objPIVNum, 4);
|
|
||||||
NotifyEvent(GetPlayerScriptID(), EV_CHAIN_MAX, 0);
|
|
||||||
ObjText_SetText(objPIVNum,
|
|
||||||
"[font size=23 oc=(241, 180, 0) oy=-8]CASH-IN[r]" ~ yass ~ "[font size=25 oy=32]x[r]"
|
|
||||||
~ "[r][font size=21 oc=(172, 50, 50) oy=32]AMMO: " ~ rtos("00.00", GetCommonDataPtr(POINTER_SPECIALAMMO, 100))
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Self-explanatory
|
|
||||||
|
|
||||||
task _DeleteEffect(obj, scale){
|
|
||||||
ObjRender_SetBlendType(obj, BLEND_ADD_ARGB);
|
|
||||||
Obj_SetRenderPriorityI(obj, 49);
|
|
||||||
ascent(i in 0..30){
|
|
||||||
ObjRender_SetAlpha(obj, Interpolate_Decelerate(100*(universalAlpha/100), 0, i/30));
|
|
||||||
ObjRender_SetScaleXYZ(obj, Interpolate_Decelerate(scale, scale*1.5, i/20));
|
|
||||||
ObjMove_SetSpeed(obj, 12);
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
Obj_Delete(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Renders player movement. Assumes that all sprites are ORGANIZED HORIZONTALLY IN THE SHEET.
|
|
||||||
// flipscale can only be 1 or -1.
|
|
||||||
|
|
||||||
task _RenderPlayerMovement(int obj, int frame, int offsetleft, int offsettop, int width, int height, float flipscale, int frameno, int speed){
|
|
||||||
|
|
||||||
ObjSprite2D_SetSourceRect(obj, offsetleft+width*floor(frame/speed), offsettop, width+width*floor(frame/speed), offsettop+height);
|
|
||||||
ObjRender_SetScaleX(objPlayer, flipscale);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bullet rescaling... for player shots.
|
|
||||||
task _BulletRescalePlayer(int target, float scale, bool hitboxscale, float hitboxlevel){
|
|
||||||
ObjRender_SetScaleXYZ(target, scale, scale, 1);
|
|
||||||
if (hitboxscale){
|
|
||||||
ObjShot_SetIntersectionScaleXY(target, scale*hitboxlevel, scale*hitboxlevel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handles death/respawn sigil. Assumes sigils are 512x512 in size.
|
|
||||||
// If death is true (the player dies), the circle expands outwards. Otherwise (the player bombs/respawns), it shrinks inwards.
|
|
||||||
|
|
||||||
task _SigilCall(bool death, texture, int rectleft, int recttop, int rectright, int rectbottom, int objPlayer, int time){
|
|
||||||
|
|
||||||
let DeathCircle = ObjPrim_Create(OBJ_SPRITE_2D);
|
|
||||||
|
|
||||||
ObjPrim_SetTexture(DeathCircle,teamimg);
|
|
||||||
ObjSprite2D_SetSourceRect(DeathCircle, rectleft, recttop, rectright, rectbottom);
|
|
||||||
ObjSprite2D_SetDestCenter(DeathCircle);
|
|
||||||
ObjRender_SetBlendType(DeathCircle,BLEND_ALPHA);
|
|
||||||
ObjRender_SetAlpha(DeathCircle,255);
|
|
||||||
|
|
||||||
ObjRender_SetPosition(DeathCircle,GetPlayerX(),GetPlayerY(),1);
|
|
||||||
Obj_SetRenderPriorityI(DeathCircle,Obj_GetRenderPriorityI(objPlayer)-10);
|
|
||||||
|
|
||||||
alternative(death)
|
|
||||||
case(true){
|
|
||||||
ascent(i in 0..time){
|
|
||||||
float scaliealpha = Interpolate_Decelerate(255, 0, i/time);
|
|
||||||
float scaliesize = Interpolate_Decelerate(0.1, 3, i/time);
|
|
||||||
ObjRender_SetAlpha(DeathCircle, scaliealpha);
|
|
||||||
ObjRender_SetPosition(DeathCircle,GetPlayerX(),GetPlayerY(),1);
|
|
||||||
ObjRender_SetScaleXYZ(DeathCircle, scaliesize, scaliesize, 1);
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case(false){
|
|
||||||
ascent(i in 0..time){
|
|
||||||
float scaliealpha = Interpolate_Accelerate(255, 0, i/time);
|
|
||||||
float scaliesize = Interpolate_Accelerate(3, 0.1, i/time);
|
|
||||||
ObjRender_SetAlpha(DeathCircle, scaliealpha);
|
|
||||||
ObjRender_SetPosition(DeathCircle,GetPlayerX(),GetPlayerY(),1);
|
|
||||||
ObjRender_SetScaleXYZ(DeathCircle, scaliesize, scaliesize, 1);
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
while(ObjRender_GetAlpha(DeathCircle) > 0){yield;}
|
|
||||||
Obj_Delete(DeathCircle);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handles the hitbox and its aura. What the fuck.
|
|
||||||
|
|
||||||
task _HitboxRender(
|
|
||||||
bool playerdeathbool, int objPlayer, texture_hbox, texture_aura,
|
|
||||||
int rectleft_hbox, int recttop_hbox, int rectright_hbox, int rectbottom_hbox,
|
|
||||||
int rectleft_aura, int recttop_aura, int rectright_aura, int rectbottom_aura,
|
|
||||||
float scale_hbox, float scale_aura){
|
|
||||||
|
|
||||||
// Handle hitbox
|
|
||||||
bool visible = false;
|
|
||||||
int hitbox = ObjPrim_Create(OBJ_SPRITE_2D);
|
|
||||||
|
|
||||||
ObjPrim_SetTexture(hitbox, texture_hbox);
|
|
||||||
ObjSprite2D_SetSourceRect(hitbox, rectleft_hbox, recttop_hbox, rectright_hbox, rectbottom_hbox);
|
|
||||||
ObjSprite2D_SetDestCenter(hitbox);
|
|
||||||
ObjRender_SetScaleXYZ(hitbox, scale_hbox, scale_hbox, 1);
|
|
||||||
ObjRender_SetBlendType(hitbox, BLEND_ALPHA);
|
|
||||||
Obj_SetRenderPriorityI(hitbox, 79);
|
|
||||||
|
|
||||||
Obj_SetVisible(hitbox, false);
|
|
||||||
|
|
||||||
// Handle hitbox's aura
|
|
||||||
|
|
||||||
int aura = ObjPrim_Create(OBJ_SPRITE_2D);
|
|
||||||
|
|
||||||
ObjPrim_SetTexture(aura, texture_aura);
|
|
||||||
ObjSprite2D_SetSourceRect(aura, rectleft_aura, recttop_aura, rectright_aura, rectbottom_aura);
|
|
||||||
ObjSprite2D_SetDestCenter(aura);
|
|
||||||
ObjRender_SetScaleXYZ(aura, scale_aura, scale_aura, 1);
|
|
||||||
ObjRender_SetAlpha(aura, 70);
|
|
||||||
//ObjRender_SetBlendType(aura, BLEND_ADD_ARGB);
|
|
||||||
Obj_SetRenderPriorityI(aura, Obj_GetRenderPriorityI(objPlayer)+3);
|
|
||||||
|
|
||||||
Obj_SetVisible(aura, false);
|
|
||||||
|
|
||||||
loop{
|
|
||||||
if (visible && (!Obj_IsVisible(objPlayer) || GetVirtualKeyState(VK_SLOWMOVE) != KEY_HOLD)){
|
|
||||||
visible = false;
|
|
||||||
Obj_SetVisible(hitbox, false);
|
|
||||||
Obj_SetVisible(aura, false);
|
|
||||||
}
|
|
||||||
else if (!visible && (Obj_IsVisible(objPlayer) && (GetVirtualKeyState(VK_SLOWMOVE) == KEY_HOLD || GetVirtualKeyState(VK_SLOWMOVE) == KEY_PUSH))){
|
|
||||||
visible = true;
|
|
||||||
Obj_SetVisible(aura, true);
|
|
||||||
Obj_SetVisible(hitbox, true);
|
|
||||||
async{
|
|
||||||
while(Obj_IsVisible(aura)){
|
|
||||||
float[] curang = [ObjRender_GetAngleZ(hitbox), ObjRender_GetAngleZ(aura)];
|
|
||||||
ObjRender_SetAngleZ(hitbox, curang[0]+1.5);
|
|
||||||
ObjRender_SetAngleZ(aura, curang[1]+1.5);
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
async{
|
|
||||||
ascent(i in 0..20){
|
|
||||||
float scalie = Interpolate_Decelerate(scale_aura*1.5, scale_aura, i/20);
|
|
||||||
ObjRender_SetScaleXYZ(aura, scalie, scalie, 1);
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async{
|
|
||||||
ascent(i in 0..20){
|
|
||||||
float scalie = Interpolate_Decelerate(0, 80, i/20);
|
|
||||||
ObjRender_SetAlpha(aura, scalie);
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ObjRender_SetPosition(hitbox, ObjMove_GetX(objPlayer), ObjMove_GetY(objPlayer), 1);
|
|
||||||
ObjRender_SetPosition(aura, ObjMove_GetX(objPlayer), ObjMove_GetY(objPlayer), 1);
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Simple function that handles player options. These options simply follow the player at an offset - they do not have any trajectories of their own like spinning around the player, etc.
|
|
||||||
If the options have animations, set triggeranimation to true and adjust the number of frames + speed using delay and frameno.
|
|
||||||
If the options rotate (in place), set triggerspin to true and adjust spinning speed using spinspeed.
|
|
||||||
If the options only appear unfocused or focused, set either onlyFocus or onlyUnfocus to true. Setting both to true or false makes the options always visible.
|
|
||||||
*/
|
|
||||||
|
|
||||||
function PlayerOption(
|
|
||||||
float offsetx, float offsety,
|
|
||||||
texture,
|
|
||||||
int left, int top, int right, int bottom, float scale,
|
|
||||||
int width, int animdelay, int frameno, bool triggeranimation,
|
|
||||||
bool triggerspin, float spinspeed,
|
|
||||||
bool onlyFocus, bool onlyUnfocus
|
|
||||||
){
|
|
||||||
|
|
||||||
let option = ObjPrim_Create(OBJ_SPRITE_2D);
|
|
||||||
bool visible;
|
|
||||||
int animate = 0;
|
|
||||||
float optx;
|
|
||||||
float opty;
|
|
||||||
|
|
||||||
ObjPrim_SetTexture(option, texture);
|
|
||||||
ObjSprite2D_SetSourceRect(option, left, top, right-1, bottom-1); // Allows the options to spin smoothly should the user choose to do so.
|
|
||||||
ObjSprite2D_SetDestCenter(option);
|
|
||||||
ObjRender_SetScaleXYZ(option, scale);
|
|
||||||
ObjRender_SetBlendType(option, BLEND_ALPHA);
|
|
||||||
ObjRender_SetAlpha(option, 255);
|
|
||||||
Obj_SetRenderPriorityI(option, 41);
|
|
||||||
ObjRender_SetPosition(option, offsetx, offsety, 1);
|
|
||||||
|
|
||||||
// Animation
|
|
||||||
async{
|
|
||||||
while(triggeranimation){
|
|
||||||
ObjSprite2D_SetSourceRect(option, left+width*floor(animate/animdelay), top, right+width*floor(animate/animdelay)-1, bottom-1);
|
|
||||||
animate++;
|
|
||||||
if (animate >= animdelay*frameno){animate = 0;}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rotation
|
|
||||||
async{
|
|
||||||
float i = 0;
|
|
||||||
while(triggerspin){
|
|
||||||
//ObjRender_SetPosition(option, GetPlayerX()+offsetx, GetPlayerY()+offsety, 1);
|
|
||||||
ObjRender_SetAngleZ(option, i);
|
|
||||||
i += spinspeed;
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Follow
|
|
||||||
async{
|
|
||||||
while(true){
|
|
||||||
ObjRender_SetPosition(option, GetPlayerX()+offsetx, GetPlayerY()+offsety, 1);
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Visibility
|
|
||||||
async{
|
|
||||||
// Always visible
|
|
||||||
if((onlyFocus && onlyUnfocus) || (!onlyFocus && !onlyUnfocus)) {
|
|
||||||
loop
|
|
||||||
{
|
|
||||||
if(GetPlayerState != STATE_NORMAL && GetPlayerState != STATE_HIT){ObjRender_SetAlpha(option, max(0, ObjRender_GetAlpha(option)-15)); visible = false;}
|
|
||||||
else {ObjRender_SetAlpha(option, min(225, ObjRender_GetAlpha(option)+15)); visible = true;}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Visible when focused only
|
|
||||||
else if(onlyFocus && !onlyUnfocus){
|
|
||||||
loop
|
|
||||||
{
|
|
||||||
if((GetPlayerState != STATE_NORMAL && GetPlayerState != STATE_HIT) || GetVirtualKeyState(VK_SLOWMOVE) == KEY_FREE){ObjRender_SetAlpha(option, max(0, ObjRender_GetAlpha(option)-15)); visible = false;}
|
|
||||||
else {ObjRender_SetAlpha(option, min(225, ObjRender_GetAlpha(option)+15)); visible = true;}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Visible when unfocused only
|
|
||||||
else if(!onlyFocus && onlyUnfocus){
|
|
||||||
loop
|
|
||||||
{
|
|
||||||
if((GetPlayerState != STATE_NORMAL && GetPlayerState != STATE_HIT) || GetVirtualKeyState(VK_SLOWMOVE) != KEY_FREE){ObjRender_SetAlpha(option, max(0, ObjRender_GetAlpha(option)-15)); visible = false;}
|
|
||||||
else {ObjRender_SetAlpha(option, min(225, ObjRender_GetAlpha(option)+15)); visible = true;}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _FadeIn(){
|
|
||||||
ascent(i in 0..15){
|
|
||||||
ObjRender_SetAlpha(option, Interpolate_Decelerate(0, 225, i/15));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _FadeOut(){
|
|
||||||
ascent(i in 0..15){
|
|
||||||
ObjRender_SetAlpha(option, Interpolate_Decelerate(225, 0, i/15));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return option;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
A form of PlayerOption that handles basic movement towards different positionings based on whether the player is focusing or unfocusing.
|
|
||||||
If the options have animations, set triggeranimation to true and adjust the number of frames + speed using delay and frameno.
|
|
||||||
If the options rotate (in place), set triggerspin to true and adjust spinning speed using spinspeed.
|
|
||||||
If the options only appear unfocused or focused, set either onlyFocus or onlyUnfocus to true. Setting both to true or false makes the options always visible.
|
|
||||||
*/
|
|
||||||
|
|
||||||
function PlayerOption_LinearMove(
|
|
||||||
float offsetX_uf, offsetY_uf, offsetX_f, offsetY_f,
|
|
||||||
bool angchange, float ang_uf, ang_f,
|
|
||||||
texture,
|
|
||||||
int graphic, float texScale, int priorityRender,
|
|
||||||
int texWidth, int animDelay, int animFrameNo, bool animMode,
|
|
||||||
bool spinMode, float spinSpeed,
|
|
||||||
bool onlyFocus, bool onlyUnfocus
|
|
||||||
){
|
|
||||||
|
|
||||||
int option = CreatePlayerShotA1(0, 0, 0, 0, 0, 9999999, graphic);
|
|
||||||
bool visible;
|
|
||||||
int animate = 0;
|
|
||||||
float optx;
|
|
||||||
float opty;
|
|
||||||
|
|
||||||
float playerX = 0, playerY = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
ObjPrim_SetTexture(option, texture);
|
|
||||||
ObjSprite2D_SetSourceRect(option, texRect[0], texRect[1], texRect[2]-1, texRect[3]-1); // Allows the options to spin smoothly should the user choose to do so.
|
|
||||||
ObjSprite2D_SetDestCenter(option);
|
|
||||||
*/
|
|
||||||
|
|
||||||
ObjShot_SetAutoDelete(option, false);
|
|
||||||
ObjRender_SetScaleXYZ(option, texScale);
|
|
||||||
ObjRender_SetBlendType(option, BLEND_ALPHA);
|
|
||||||
//ObjRender_SetAlpha(option, 255);
|
|
||||||
Obj_SetRenderPriorityI(option, priorityRender);
|
|
||||||
ObjRender_SetPosition(option, playerX+offsetX_uf, playerY+offsetY_uf, 1);
|
|
||||||
|
|
||||||
///// MISC /////
|
|
||||||
async{
|
|
||||||
while(true){
|
|
||||||
playerX = ObjRender_GetX(GetPlayerObjectID());
|
|
||||||
playerY = ObjRender_GetY(GetPlayerObjectID());
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
///// ANIMATION /////
|
|
||||||
|
|
||||||
/*
|
|
||||||
async{
|
|
||||||
while(animMode){
|
|
||||||
ObjSprite2D_SetSourceRect(option, texRect[0]+texWidth*floor(animate/animDelay), texRect[1], texRect[2]+texWidth*floor(animate/animDelay)-1, texRect[3]-1);
|
|
||||||
animate++;
|
|
||||||
if (animate >= animDelay*animFrameNo){animate = 0;}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
///// ROTATION /////
|
|
||||||
async{
|
|
||||||
float i = 0;
|
|
||||||
while(spinMode){
|
|
||||||
//ObjRender_SetPosition(option, GetPlayerX()+offsetx, GetPlayerY()+offsety, 1);
|
|
||||||
ObjRender_SetAngleZ(option, i);
|
|
||||||
i += spinSpeed;
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
///// VISIBILITY /////
|
|
||||||
async{
|
|
||||||
// Always visible
|
|
||||||
if((onlyFocus && onlyUnfocus) || (!onlyFocus && !onlyUnfocus)) {
|
|
||||||
loop
|
|
||||||
{
|
|
||||||
if(GetPlayerState != STATE_NORMAL && GetPlayerState != STATE_HIT){ObjRender_SetAlpha(option, max(0, ObjRender_GetAlpha(option)-15)); visible = false;}
|
|
||||||
else {ObjRender_SetAlpha(option, min(255, ObjRender_GetAlpha(option)+15)); visible = true;}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Visible when focused only
|
|
||||||
else if(onlyFocus && !onlyUnfocus){
|
|
||||||
loop
|
|
||||||
{
|
|
||||||
if((GetPlayerState != STATE_NORMAL && GetPlayerState != STATE_HIT) || GetVirtualKeyState(VK_SLOWMOVE) == KEY_FREE){ObjRender_SetAlpha(option, max(0, ObjRender_GetAlpha(option)-15)); visible = false;}
|
|
||||||
else {ObjRender_SetAlpha(option, min(255, ObjRender_GetAlpha(option)+15)); visible = true;}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Visible when unfocused only
|
|
||||||
else if(!onlyFocus && onlyUnfocus){
|
|
||||||
loop
|
|
||||||
{
|
|
||||||
if((GetPlayerState != STATE_NORMAL && GetPlayerState != STATE_HIT) || GetVirtualKeyState(VK_SLOWMOVE) != KEY_FREE){ObjRender_SetAlpha(option, max(0, ObjRender_GetAlpha(option)-15)); visible = false;}
|
|
||||||
else {ObjRender_SetAlpha(option, min(255, ObjRender_GetAlpha(option)+15)); visible = true;}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
///// MOVEMENT /////
|
|
||||||
async{
|
|
||||||
|
|
||||||
loop{
|
|
||||||
|
|
||||||
if(GetVirtualKeyState(VK_SLOWMOVE) != KEY_FREE){
|
|
||||||
|
|
||||||
async{
|
|
||||||
|
|
||||||
ascent(i in 0..15){
|
|
||||||
if(angchange){ObjRender_SetAngleZ(option, Interpolate_Decelerate(ObjRender_GetAngleZ(option), ang_f, i/15));}
|
|
||||||
ObjRender_SetX(option, Interpolate_Decelerate(ObjRender_GetX(option), playerX+offsetX_f, i/15));
|
|
||||||
ObjRender_SetY(option, Interpolate_Decelerate(ObjRender_GetY(option), playerY+offsetY_f, i/15));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
else{
|
|
||||||
|
|
||||||
async{
|
|
||||||
|
|
||||||
ascent(i in 0..15){
|
|
||||||
if(angchange){ObjRender_SetAngleZ(option, Interpolate_Decelerate(ObjRender_GetAngleZ(option), ang_uf, i/15));}
|
|
||||||
ObjRender_SetX(option, Interpolate_Decelerate(ObjRender_GetX(option), playerX+offsetX_uf, i/15));
|
|
||||||
ObjRender_SetY(option, Interpolate_Decelerate(ObjRender_GetY(option), playerY+offsetY_uf, i/15));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function _FadeIn(){
|
|
||||||
ascent(i in 0..15){
|
|
||||||
ObjRender_SetAlpha(option, Interpolate_Decelerate(0, 225, i/15));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _FadeOut(){
|
|
||||||
ascent(i in 0..15){
|
|
||||||
ObjRender_SetAlpha(option, Interpolate_Decelerate(225, 0, i/15));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return option;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
------------------------------------------------------
|
|
||||||
|
|
||||||
POINTBLANK-PIV MECHANIC FUNCTIONS
|
|
||||||
Will be optimized somewhere down the line.
|
|
||||||
|
|
||||||
------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Selects an enemy in the @MainLoop-updated _enemyArray, executes _PetalDrop, and adds it to _existArray so the task isn't called again for the same enemy. maxX and maxY are the bounds of the playing field.
|
|
||||||
|
|
||||||
task _Mechanic(bool playerdeathbool, int[] _enemyArray, int [] _existArray, float maxX, float maxY, int objPlayer, int bossScene, int maxrate, int addrate, float adddist){
|
|
||||||
while(!playerdeathbool){
|
|
||||||
_enemyArray = GetIntersectionRegistedEnemyID();
|
|
||||||
bossScene = GetEnemyBossSceneObjectID();
|
|
||||||
for each (int enemy in ref _enemyArray){
|
|
||||||
float enemyX = ObjMove_GetX(enemy);
|
|
||||||
float enemyY = ObjMove_GetY(enemy);
|
|
||||||
if (0 < enemyX && enemyX < maxX && 0 < enemyY && enemyY < maxY && !contains(_existArray, enemy)){
|
|
||||||
_PetalDrop(enemy, playerdeathbool, objPlayer, bossScene, maxrate, addrate, adddist);
|
|
||||||
_existArray = _existArray ~ [enemy];
|
|
||||||
}
|
|
||||||
else{continue;}
|
|
||||||
}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Checks the boss scene type (nonspell/spell/last spell/invalid), the ID of the player object, and the target enemy. Drops petals with a type and drop rate that depends on the boss scene type and how close the player is to the target enemy.
|
|
||||||
|
|
||||||
task _PetalDrop(int target, bool playerdeathbool, int objPlayer, int bossScene, int maxrate, int addrate, float adddist){
|
|
||||||
|
|
||||||
while(!Obj_IsDeleted(target) && !playerdeathbool){
|
|
||||||
float dist = hypot(ObjMove_GetX(target)-ObjMove_GetX(objPlayer), ObjMove_GetY(target)-ObjMove_GetY(objPlayer));
|
|
||||||
let atktype = GetEnemyBossSceneObjectID();
|
|
||||||
if(dist <= (GetStgFrameHeight()-100) && atktype != ID_INVALID && ObjEnemy_GetInfo(target, INFO_SHOT_HIT_COUNT) >= 1 && ObjEnemy_GetInfo(target, INFO_DAMAGE_PREVIOUS_FRAME) > 0){
|
|
||||||
|
|
||||||
wait(maxrate + addrate*floor(dist/adddist));
|
|
||||||
|
|
||||||
}
|
|
||||||
else{yield;}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
task _DeathbombWarning(imgpath, int[] imgrectarray, int deathbombframes, float basescale){
|
|
||||||
|
|
||||||
int circle = _Create2DImage(imgpath, imgrectarray);
|
|
||||||
Obj_SetRenderPriorityI(circle, 75);
|
|
||||||
ObjRender_SetAlpha(circle, 255);
|
|
||||||
ObjRender_SetPosition(circle, ObjRender_GetX(GetPlayerObjectID()), ObjRender_GetY(GetPlayerObjectID()), 1);
|
|
||||||
ObjRender_SetBlendType(circle, BLEND_INV_DESTRGB);
|
|
||||||
|
|
||||||
ascent(i in 0..deathbombframes-1){
|
|
||||||
ObjRender_SetScaleXYZ(circle, Interpolate_Accelerate(basescale, 0, i/(deathbombframes-1)));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
Obj_Delete(circle);
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
task _BombShake(shaketime, intensity){
|
|
||||||
|
|
||||||
float baseintensity = intensity;
|
|
||||||
float shakeno = shaketime;
|
|
||||||
|
|
||||||
ascent(i in 0..shakeno){
|
|
||||||
Set2DCameraFocusX(GetStgFrameWidth/2 + rand(-intensity, intensity));
|
|
||||||
Set2DCameraFocusY(GetStgFrameHeight/2 + rand(-intensity, intensity));
|
|
||||||
intensity = Interpolate_Decelerate(0, baseintensity, 1-i/shakeno);
|
|
||||||
shaketime--;
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
while(shaketime > 0){yield;}
|
|
||||||
|
|
||||||
Set2DCameraFocusX(GetStgFrameWidth/2);
|
|
||||||
Set2DCameraFocusY(GetStgFrameHeight/2);
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
task _Countdown(){
|
|
||||||
|
|
||||||
//_FunIndicator;
|
|
||||||
|
|
||||||
//int timer = time;
|
|
||||||
int counter = CreateTextObject(
|
|
||||||
playerX, playerY, 45,
|
|
||||||
"", "GravityRegular5",
|
|
||||||
0xFFFFFF, 0xFFFFFF,
|
|
||||||
0x1AEC8C, 8,
|
|
||||||
51
|
|
||||||
);
|
|
||||||
|
|
||||||
int counter2 = CreateTextObject(
|
|
||||||
1720, 870, 40,
|
|
||||||
"", "Unispace",
|
|
||||||
0xFFFFFF, 0xFFFFFF,
|
|
||||||
0x1AEC8C, 2,
|
|
||||||
19
|
|
||||||
);
|
|
||||||
|
|
||||||
ObjText_SetHorizontalAlignment(counter, ALIGNMENT_CENTER);
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
|
|
||||||
if(GetPlayerInvincibilityFrame() <= 0){Obj_SetVisible(counter, false);}
|
|
||||||
else{Obj_SetVisible(counter, true);}
|
|
||||||
ObjRender_SetPosition(counter, playerX, playerY - 96, 1);
|
|
||||||
ObjText_SetText(counter, IntToString(GetPlayerInvincibilityFrame()));
|
|
||||||
ObjText_SetText(counter2, IntToString(GetPlayerInvincibilityFrame()));
|
|
||||||
yield;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//Obj_Delete(counter);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
task _FunIndicator(){
|
|
||||||
|
|
||||||
int counter = CreateTextObject(
|
|
||||||
1720, 910, 41,
|
|
||||||
"FUN IS PREPARED", "Origami Mommy",
|
|
||||||
0xFFD9B8, 0xFFFFFF,
|
|
||||||
0xD96600, 4,
|
|
||||||
39
|
|
||||||
);
|
|
||||||
|
|
||||||
ObjText_SetHorizontalAlignment(counter, ALIGNMENT_CENTER);
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
|
|
||||||
if(GetCommonDataPtr(POINTER_CHAIN, 1) >= 64 && GetCommonDataPtr(POINTER_SPECIALCHECK, false) == false)
|
|
||||||
|
|
||||||
{Obj_SetVisible(counter, true);}
|
|
||||||
|
|
||||||
else{Obj_SetVisible(counter, false);}
|
|
||||||
|
|
||||||
ObjRender_SetPosition(counter, playerX, playerY + 128, 1);
|
|
||||||
|
|
||||||
yield;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//Obj_Delete(counter);
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,133 +0,0 @@
|
||||||
task _ShowChainHUD(){
|
|
||||||
|
|
||||||
// Playfield
|
|
||||||
|
|
||||||
// Multiplier
|
|
||||||
|
|
||||||
async{
|
|
||||||
|
|
||||||
let objPIVNum = ObjText_Create();
|
|
||||||
|
|
||||||
// AAAAAAA WHYYYYYYY
|
|
||||||
|
|
||||||
ObjText_SetFontSize(objPIVNum, 60);
|
|
||||||
ObjText_SetFontBold(objPIVNum, true);
|
|
||||||
ObjText_SetFontType(objPIVNum, "Origami Mommy");
|
|
||||||
ObjText_SetFontColorTop(objPIVNum, 0xFFFFFF);
|
|
||||||
ObjText_SetFontColorBottom(objPIVNum, 0xFFFFFF);
|
|
||||||
ObjText_SetFontBorderType(objPIVNum, BORDER_FULL);
|
|
||||||
ObjText_SetFontBorderColor(objPIVNum, 95, 209, 255);
|
|
||||||
ObjText_SetFontBorderWidth(objPIVNum, 4);
|
|
||||||
ObjText_SetHorizontalAlignment(objPIVNum, ALIGNMENT_LEFT);
|
|
||||||
Obj_SetRenderPriorityI(objPIVNum, 19);
|
|
||||||
ObjText_SetSidePitch(objPIVNum, -3);
|
|
||||||
ObjRender_SetPosition(objPIVNum, 32, 128, 0);
|
|
||||||
// DEBUG
|
|
||||||
//Obj_SetVisible(objPIV, false);
|
|
||||||
|
|
||||||
float value = 0;
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
value = min(GetCommonDataPtr(POINTER_CHAIN, 1), CHAIN_MAX);
|
|
||||||
//PIVMultiplierValue = value/1000;
|
|
||||||
let yass = rtos("00.00", value);
|
|
||||||
|
|
||||||
if(GetCommonDataPtr(POINTER_SPECIALCHECK, false) == false){
|
|
||||||
|
|
||||||
ObjText_SetFontBorderWidth(objPIVNum, 3);
|
|
||||||
|
|
||||||
if(value < CHAIN_MAX){
|
|
||||||
|
|
||||||
ObjText_SetFontBorderColor(objPIVNum, 42, 0, 237);
|
|
||||||
ObjText_SetText(objPIVNum,
|
|
||||||
yass ~ "[font size=25 oy=32]x"
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
else{
|
|
||||||
|
|
||||||
ObjText_SetFontBorderColor(objPIVNum, 0, 240, 117);
|
|
||||||
ObjText_SetText(objPIVNum,
|
|
||||||
yass ~ "[font size=25 oy=32]x"
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
else{
|
|
||||||
|
|
||||||
ObjText_SetFontBorderColor(objPIVNum, 0xFF9A00);
|
|
||||||
ObjText_SetText(objPIVNum,
|
|
||||||
yass ~ "[font size=25 oy=32]x"
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Chain Timer
|
|
||||||
|
|
||||||
async{
|
|
||||||
|
|
||||||
let timerText = CreateTextObject(
|
|
||||||
275, 210, 32,
|
|
||||||
"", "Unispace",
|
|
||||||
0xB5FFEE, 0xFFFFFF,
|
|
||||||
0x397D88, 2,
|
|
||||||
19
|
|
||||||
);
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
ObjText_SetText(timerText, IntToString(GetCommonDataPtr(POINTER_CHAINGAUGE, 100)));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Chain Status
|
|
||||||
|
|
||||||
async{
|
|
||||||
|
|
||||||
let timerText = CreateTextObject(
|
|
||||||
275, 255, 32,
|
|
||||||
"", "Unispace",
|
|
||||||
0xFFE0A2, 0xFFFFFF,
|
|
||||||
0xCB6D00, 2,
|
|
||||||
19
|
|
||||||
);
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
ObjText_SetText(timerText, GetCommonDataPtr(POINTER_SPECIALCHECK, false) ? "ACTIVE" : "INACTIVE");
|
|
||||||
ObjText_SetFontBorderColor(timerText, GetCommonDataPtr(POINTER_SPECIALCHECK, false) ? 0xCB6D00 : 0x67A41E);
|
|
||||||
ObjText_SetFontColorTop(timerText, GetCommonDataPtr(POINTER_SPECIALCHECK, false) ? 0xFFE0A2 : 0xD8FFA8);
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ammo Status
|
|
||||||
|
|
||||||
async{
|
|
||||||
|
|
||||||
let ammoText = CreateTextObject(
|
|
||||||
1585, 445, 48,
|
|
||||||
"", "Unispace",
|
|
||||||
0xFFB8A0, 0xFFFFFF,
|
|
||||||
0xC53000, 2,
|
|
||||||
19
|
|
||||||
);
|
|
||||||
|
|
||||||
ObjText_SetFontBold(ammoText, true);
|
|
||||||
while(true){
|
|
||||||
ObjText_SetText(ammoText, rtos("000.00", GetCommonDataPtr(POINTER_SPECIALAMMO, 100)) ~ "[font sz=24 oy=20]/100.00");
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,926 +0,0 @@
|
||||||
|
|
||||||
// SYSTEM FOR STATION GAME
|
|
||||||
|
|
||||||
let dirCurrent = GetCurrentScriptDirectory();
|
|
||||||
|
|
||||||
// Change accordingly!
|
|
||||||
|
|
||||||
int offsetX = 1551;
|
|
||||||
int baseY = 155;
|
|
||||||
int spaceY = 135;
|
|
||||||
float scale = 1.15*1.6;
|
|
||||||
|
|
||||||
int sel = 0;
|
|
||||||
|
|
||||||
// Item, life, spell graphics
|
|
||||||
|
|
||||||
let graphicimg = dirCurrent ~ "./img/yo.png";
|
|
||||||
let lifebarimg = dirCurrent ~ "./img/lifebar.png";
|
|
||||||
LoadTextureEx(graphicimg, true, true);
|
|
||||||
|
|
||||||
let pointerPIV;
|
|
||||||
|
|
||||||
//#include "./../script/soundtask.txt"
|
|
||||||
|
|
||||||
#include "script/KevinSystem/Init.dnh"
|
|
||||||
#include "script/KevinSystem/kevin_system/Lib_Const.dnh"
|
|
||||||
#include "script/KevinSystem/GeneralSoundLib.txt"
|
|
||||||
#include "script/default_system/Default_Effect.txt"
|
|
||||||
#include "script/KevinSystem/kevin_system/Kevin_EffectLib.dnh"
|
|
||||||
|
|
||||||
@Initialize
|
|
||||||
{
|
|
||||||
|
|
||||||
if(!IsCommonDataAreaExists("PIV")){
|
|
||||||
CreateCommonDataArea("PIV");
|
|
||||||
SetAreaCommonData("PIV", "currentvalue", 10000);
|
|
||||||
}
|
|
||||||
else{}
|
|
||||||
|
|
||||||
pointerPIV = LoadAreaCommonDataValuePointer("PIV", "currentvalue", 10000);
|
|
||||||
|
|
||||||
_SoundTask();
|
|
||||||
|
|
||||||
SetAreaCommonData("ScriptID", "SystemID", GetOwnScriptID());
|
|
||||||
|
|
||||||
//SetCommonDataPtr("SystemIDPtr", GetOwnScriptID());
|
|
||||||
|
|
||||||
SetStgFrame(0, 0, 1280, 720, 20, 80);
|
|
||||||
|
|
||||||
sel = prand_int(0, 99);
|
|
||||||
|
|
||||||
// Pixel art
|
|
||||||
|
|
||||||
SetShotTextureFilter(FILTER_NONE, FILTER_NONE);
|
|
||||||
SetItemTextureFilter(FILTER_NONE, FILTER_NONE);
|
|
||||||
|
|
||||||
SetPauseScriptPath(GetCurrentScriptDirectory() ~ "kevin_system/Kevin_Pause.txt");
|
|
||||||
SetEndSceneScriptPath(GetCurrentScriptDirectory() ~ "kevin_system/Kevin_EndScene.txt");
|
|
||||||
SetReplaySaveSceneScriptPath(GetCurrentScriptDirectory() ~ "kevin_system/Kevin_ReplaySave.txt");
|
|
||||||
|
|
||||||
InitEffect();
|
|
||||||
InitFrame();
|
|
||||||
|
|
||||||
//TInstallFont(); Moved to package.
|
|
||||||
|
|
||||||
TScore();
|
|
||||||
LifeDisplay();
|
|
||||||
|
|
||||||
//TGraze();
|
|
||||||
//SetPlayerLife(9);
|
|
||||||
//SpellDisplay();
|
|
||||||
THighScore();
|
|
||||||
//TValueDisplay();
|
|
||||||
|
|
||||||
StartItemScript(dirCurrent ~ "./kevin_system/KevinSystem_Item.txt");
|
|
||||||
|
|
||||||
TExtendSystem();
|
|
||||||
//TBossLife();
|
|
||||||
TBossTimer();
|
|
||||||
|
|
||||||
TCurrentFps();
|
|
||||||
TReplayFps();
|
|
||||||
//_SoundTask;
|
|
||||||
}
|
|
||||||
|
|
||||||
@MainLoop
|
|
||||||
{
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Event
|
|
||||||
{
|
|
||||||
alternative(GetEventType())
|
|
||||||
|
|
||||||
case(EV_START_BOSS_SPELL)
|
|
||||||
{
|
|
||||||
let path = dirCurrent ~ "Default_System_MagicCircle.txt";
|
|
||||||
let id = LoadScript(path);
|
|
||||||
StartScript(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
case(EV_GAIN_SPELL)
|
|
||||||
{
|
|
||||||
let objScene = GetEnemyBossSceneObjectID();
|
|
||||||
let spellbonus = ObjEnemyBossScene_GetInfo(objScene, INFO_SPELL_SCORE);
|
|
||||||
TScoreAward(spellbonus);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Arguments: [enemy x, y], particle list to use
|
|
||||||
|
|
||||||
case(EV_EXPLODE)
|
|
||||||
{
|
|
||||||
float[] pos = GetEventArgument(0);
|
|
||||||
//int listTarget = GetEventArgument(1);
|
|
||||||
|
|
||||||
if(GetCommonDataPtr(EFFECTCUT_PTR, 0) >= 2){ObjSound_Play(sfxBoom);}
|
|
||||||
//_EffectListPreRender(PetalEffect, imgEffect, [0, 0, 256, 256]);
|
|
||||||
else{_ExplosionEffect(pos[0], pos[1], PetalEffect);}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function CreateTextObject(
|
|
||||||
float mx, my, size,
|
|
||||||
string text, font,
|
|
||||||
int colorTop, colorBottom,
|
|
||||||
int borderColor, borderWidth,
|
|
||||||
int renderPriority
|
|
||||||
){
|
|
||||||
|
|
||||||
let obj = ObjText_Create();
|
|
||||||
ObjText_SetText(obj, text);
|
|
||||||
ObjText_SetFontSize(obj, size);
|
|
||||||
ObjText_SetFontType(obj, font);
|
|
||||||
ObjText_SetFontColorTop(obj, colorTop);
|
|
||||||
ObjText_SetFontColorBottom(obj, colorBottom);
|
|
||||||
ObjText_SetFontBorderType(obj, BORDER_FULL);
|
|
||||||
ObjText_SetFontBorderColor(obj, borderColor);
|
|
||||||
ObjText_SetFontBorderWidth(obj, borderWidth);
|
|
||||||
Obj_SetRenderPriorityI(obj, renderPriority);
|
|
||||||
ObjRender_SetX(obj, mx);
|
|
||||||
ObjRender_SetY(obj, my);
|
|
||||||
return obj;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Grants extends based on score
|
|
||||||
|
|
||||||
task TExtendSystem(){
|
|
||||||
|
|
||||||
// NEXT: Text (y around 650?) (x around 2250?)
|
|
||||||
|
|
||||||
/*let NextText =
|
|
||||||
|
|
||||||
CreateTextObject(
|
|
||||||
1625, 465, 30,
|
|
||||||
"NEXT:", "Connecting Chain Handserif",
|
|
||||||
0xA70053, 0xA70053,
|
|
||||||
0xFFFFFF, 2,
|
|
||||||
1
|
|
||||||
);*/
|
|
||||||
|
|
||||||
//ObjText_SetFontBold(NextText, true);
|
|
||||||
// Indicates the score threshold needed for the next extend
|
|
||||||
|
|
||||||
let ExtendThresholdText =
|
|
||||||
|
|
||||||
CreateTextObject(
|
|
||||||
1450, 160, 28,
|
|
||||||
"", "Unispace",
|
|
||||||
0xFF98A9, 0xFFFFFF,
|
|
||||||
0x000000, 4,
|
|
||||||
2
|
|
||||||
);
|
|
||||||
|
|
||||||
ObjText_SetFontBold(ExtendThresholdText, true);
|
|
||||||
ObjText_SetHorizontalAlignment(ExtendThresholdText, ALIGNMENT_LEFT);
|
|
||||||
|
|
||||||
int len = 0;
|
|
||||||
int count = 0;
|
|
||||||
// Millions
|
|
||||||
let req = [
|
|
||||||
|
|
||||||
];
|
|
||||||
|
|
||||||
alternative(GetCommonData("Difficulty", "Standard"))
|
|
||||||
|
|
||||||
case("Novice"){
|
|
||||||
req = [250, 500, 1000, 1800];
|
|
||||||
len = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
case("Standard"){
|
|
||||||
req = [400, 800, 1500, 2500];
|
|
||||||
len = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
others{
|
|
||||||
req = [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000, 12000, 13000, 14000, 15000, 16000, 17000, 18000, 19000, 20000];
|
|
||||||
len = 19;
|
|
||||||
}
|
|
||||||
|
|
||||||
let next = 0;
|
|
||||||
|
|
||||||
// NARUMISTG
|
|
||||||
|
|
||||||
req = [
|
|
||||||
10, 30, 60, 120, 250
|
|
||||||
];
|
|
||||||
|
|
||||||
loop{
|
|
||||||
count = (trunc(GetScore())/10)*10;
|
|
||||||
if(next <= length(req)-1){
|
|
||||||
if(count >= req[next]*1000000){
|
|
||||||
next++;
|
|
||||||
SetPlayerLife(GetPlayerLife+1);
|
|
||||||
ExtendSFX;
|
|
||||||
ExtendEffect;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(next <= len){ObjText_SetText(ExtendThresholdText, "[font tc=(255, 43, 78) bc=(255, 128, 149)]NEXT: [font clr]" ~ DigitToCommaArray(req[next]*1000000));}
|
|
||||||
|
|
||||||
else{ObjText_SetText(ExtendThresholdText, "MAXIMUM");}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task ExtendEffect(){
|
|
||||||
|
|
||||||
int time = 30;
|
|
||||||
int timeDisappear = 30;
|
|
||||||
|
|
||||||
float x = GetPlayerX();
|
|
||||||
float y = GetPlayerY()-90;
|
|
||||||
|
|
||||||
int extendText = CreateTextObject(
|
|
||||||
x, y, 75,
|
|
||||||
"Life[r]Extend!", "Exotc350 DmBd BT",
|
|
||||||
0xFF61AE, 0xFFFFFF,
|
|
||||||
0x5E0064, 6,
|
|
||||||
42
|
|
||||||
);
|
|
||||||
|
|
||||||
ObjText_SetLinePitch(extendText, -2);
|
|
||||||
ObjText_SetFontBold(extendText, true);
|
|
||||||
ObjText_SetHorizontalAlignment(extendText, ALIGNMENT_CENTER);
|
|
||||||
|
|
||||||
ascent(i in 0..time){
|
|
||||||
ObjRender_SetY(extendText, Interpolate_Decelerate(y, y-120, i/time));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
wait(15);
|
|
||||||
|
|
||||||
ascent(i in 0..timeDisappear){
|
|
||||||
ObjRender_SetAlpha(extendText, Interpolate_Decelerate(255, 0, i/timeDisappear));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
Obj_Delete(extendText);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------
|
|
||||||
//枠外の背景表示
|
|
||||||
//----------------------------------------------------
|
|
||||||
task InitFrame()
|
|
||||||
{
|
|
||||||
let path1 = GetCurrentScriptDirectory() ~ "img/HUD1.png";
|
|
||||||
let path2 = GetCurrentScriptDirectory() ~ "img/HUD2.png";
|
|
||||||
|
|
||||||
let obj1 = ObjPrim_Create(OBJ_SPRITE_2D);
|
|
||||||
let obj2 = ObjPrim_Create(OBJ_SPRITE_2D);
|
|
||||||
|
|
||||||
LoadTextureEx(path1, true, true);
|
|
||||||
LoadTextureEx(path2, true, true);
|
|
||||||
|
|
||||||
ObjPrim_SetTexture(obj1, path1);
|
|
||||||
ObjPrim_SetTexture(obj2, path2);
|
|
||||||
|
|
||||||
int[] arr = [obj1, obj2];
|
|
||||||
|
|
||||||
for each(int obj in ref arr){
|
|
||||||
|
|
||||||
ObjRender_SetTextureFilterMag(obj, FILTER_NONE);
|
|
||||||
ObjRender_SetTextureFilterMin(obj, FILTER_NONE);
|
|
||||||
ObjRender_SetTextureFilterMip(obj, FILTER_NONE);
|
|
||||||
Obj_SetRenderPriority(obj, 79);
|
|
||||||
ObjSprite2D_SetSourceRect(obj, 0, 0, GetScreenWidth(), GetScreenHeight());
|
|
||||||
ObjSprite2D_SetDestRect(obj, 0, 0, GetScreenWidth(), GetScreenHeight());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// If player moves to vertical bounds, lower opacity
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
|
|
||||||
if(GetPlayerY() > GetStgFrameHeight() * 7/8){
|
|
||||||
ObjRender_SetAlpha(obj2, 125);
|
|
||||||
}
|
|
||||||
else{ObjRender_SetAlpha(obj2, 255);}
|
|
||||||
|
|
||||||
if(GetPlayerY() < GetStgFrameHeight() * 1/8){
|
|
||||||
ObjRender_SetAlpha(obj1, 125);
|
|
||||||
}
|
|
||||||
else{ObjRender_SetAlpha(obj1, 255);}
|
|
||||||
|
|
||||||
yield;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------
|
|
||||||
//スコア表示
|
|
||||||
//----------------------------------------------------
|
|
||||||
|
|
||||||
task THighScore(){
|
|
||||||
|
|
||||||
let DATA_PLAYER = GetPlayerReplayName();
|
|
||||||
let DATA_DIFFICULTY = GetCommonData("Difficulty", "Standard");
|
|
||||||
|
|
||||||
let objScoreNo = ObjText_Create();
|
|
||||||
ObjText_SetFontSize(objScoreNo, 32);
|
|
||||||
ObjText_SetFontBold(objScoreNo, true);
|
|
||||||
ObjText_SetFontType(objScoreNo, "GravityBold8");
|
|
||||||
ObjText_SetFontColorTop(objScoreNo, 0xFFFFFF);
|
|
||||||
ObjText_SetFontColorBottom(objScoreNo, 0xFFB061);
|
|
||||||
ObjText_SetFontBorderType(objScoreNo, BORDER_FULL);
|
|
||||||
ObjText_SetFontBorderColor(objScoreNo, 0xAB3D00);
|
|
||||||
ObjText_SetFontBorderWidth(objScoreNo, 4);
|
|
||||||
//ObjText_SetFontWeight(objScoreNo, 1000);
|
|
||||||
Obj_SetRenderPriorityI(objScoreNo, 79);
|
|
||||||
ObjText_SetSidePitch(objScoreNo, -2);
|
|
||||||
ObjRender_SetPosition(objScoreNo, 192, 12, 0);
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
let score = GetAreaCommonData("Data_" ~ DATA_PLAYER, "HighScore_" ~ DATA_DIFFICULTY, 0);
|
|
||||||
score = min(score,999999999990);
|
|
||||||
let yass = DigitToCommaArray(score);
|
|
||||||
ObjText_SetText(objScoreNo, yass);
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task TScore(){
|
|
||||||
// New score system using rtos
|
|
||||||
|
|
||||||
// For score with zeroes at the end: Truncate score/10, and then multiply it by 10
|
|
||||||
|
|
||||||
let objScoreNo = ObjText_Create();
|
|
||||||
ObjText_SetFontSize(objScoreNo, 32);
|
|
||||||
ObjText_SetFontBold(objScoreNo, true);
|
|
||||||
ObjText_SetFontType(objScoreNo, "GravityBold8");
|
|
||||||
ObjText_SetFontColorTop(objScoreNo, 0xFFFFFF);
|
|
||||||
ObjText_SetFontColorBottom(objScoreNo, 0x8944CE);
|
|
||||||
ObjText_SetFontBorderType(objScoreNo, BORDER_FULL);
|
|
||||||
ObjText_SetFontBorderColor(objScoreNo, 0x391339);
|
|
||||||
ObjText_SetFontBorderWidth(objScoreNo, 4);
|
|
||||||
//ObjText_SetFontWeight(objScoreNo, 1000);
|
|
||||||
Obj_SetRenderPriorityI(objScoreNo, 79);
|
|
||||||
ObjText_SetSidePitch(objScoreNo, -2);
|
|
||||||
ObjRender_SetPosition(objScoreNo, 192, 56, 0);
|
|
||||||
while(true){
|
|
||||||
|
|
||||||
if(GetPlayerY() < GetStgFrameHeight() * 1/8){
|
|
||||||
ObjRender_SetAlpha(objScoreNo, 125);
|
|
||||||
}
|
|
||||||
else{ObjRender_SetAlpha(objScoreNo, 255);}
|
|
||||||
|
|
||||||
let score = trunc(GetScore()/10) * 10;
|
|
||||||
score = min(score,999999999990);
|
|
||||||
let yass = DigitToCommaArray(score);
|
|
||||||
ObjText_SetText(objScoreNo, yass);
|
|
||||||
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function DigitToCommaArray(num){ //Natashinitai
|
|
||||||
|
|
||||||
let srcStr = IntToString(num);
|
|
||||||
let res = [];
|
|
||||||
let nChar = 0;
|
|
||||||
for(let i = length(srcStr) - 1; i >= 0; i--){
|
|
||||||
res = [srcStr[i]] ~ res;
|
|
||||||
nChar++;
|
|
||||||
if(nChar % 3 == 0 && i > 0) res = "," ~ res;
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------
|
|
||||||
//Graze表示
|
|
||||||
//----------------------------------------------------
|
|
||||||
task TGraze()
|
|
||||||
{
|
|
||||||
let grazenum = ObjText_Create();
|
|
||||||
ObjText_SetFontSize(grazenum, 58);
|
|
||||||
ObjText_SetFontBold(grazenum, true);
|
|
||||||
ObjText_SetFontType(grazenum, "Anke Calligraph");
|
|
||||||
ObjText_SetFontColorTop(grazenum, 0x8898A3);
|
|
||||||
ObjText_SetFontColorBottom(grazenum, 0xD2E0FF);
|
|
||||||
ObjText_SetFontBorderType(grazenum, BORDER_FULL);
|
|
||||||
ObjText_SetFontBorderColor(grazenum, 0xFFFFFF);
|
|
||||||
ObjText_SetFontBorderWidth(grazenum, 3);
|
|
||||||
Obj_SetRenderPriorityI(grazenum, 1);
|
|
||||||
ObjRender_SetX(grazenum, offsetX-10);
|
|
||||||
ObjRender_SetY(grazenum, baseY*0.8+spaceY*5);
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
let graze = GetGraze();
|
|
||||||
|
|
||||||
ObjText_SetText(grazenum, rtos("00000", graze));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task TValueDisplay(){
|
|
||||||
|
|
||||||
let objPIVNum = ObjText_Create();
|
|
||||||
ObjText_SetFontSize(objPIVNum, 45);
|
|
||||||
ObjText_SetFontBold(objPIVNum, true);
|
|
||||||
ObjText_SetFontType(objPIVNum, "Origami Mommy");
|
|
||||||
ObjText_SetFontColorTop(objPIVNum,0xFFFFFF);
|
|
||||||
ObjText_SetFontColorBottom(objPIVNum,0xFFFFFF);
|
|
||||||
ObjText_SetFontBorderType(objPIVNum, BORDER_FULL);
|
|
||||||
ObjText_SetFontBorderColor(objPIVNum, 0xDC47C8);
|
|
||||||
ObjText_SetFontBorderWidth(objPIVNum, 4);
|
|
||||||
ObjText_SetHorizontalAlignment(objPIVNum, ALIGNMENT_LEFT);
|
|
||||||
//ObjText_SetFontWeight(objPIVNum, 1000);
|
|
||||||
Obj_SetRenderPriorityI(objPIVNum, 2);
|
|
||||||
//ObjText_SetSidePitch(objPIVNum, -3);
|
|
||||||
ObjRender_SetPosition(objPIVNum, 1440, 275, 0);
|
|
||||||
// DEBUG
|
|
||||||
//Obj_SetVisible(objPIV, false);
|
|
||||||
|
|
||||||
int value = 0;
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
value = min(GetCommonDataPtr(pointerPIV, 10000), 9999999990);
|
|
||||||
//PIVMultiplierValue = value/1000;
|
|
||||||
let yass = vtos("-5.2f", value/10000);
|
|
||||||
if(value < 100000){ObjText_SetText(objPIVNum, yass ~ "[font size=25 ox=-24 oy=18]x");}
|
|
||||||
else{ObjText_SetText(objPIVNum, yass ~ "[font size=25 oy=18]x");}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------
|
|
||||||
//残機表示
|
|
||||||
//----------------------------------------------------
|
|
||||||
/*task TPlayerLife
|
|
||||||
{
|
|
||||||
let lifenum = ObjText_Create();
|
|
||||||
ObjText_SetFontSize(lifenum, 22);
|
|
||||||
ObjText_SetFontBold(lifenum, false);
|
|
||||||
ObjText_SetFontType(lifenum, "Unispace");
|
|
||||||
ObjText_SetFontColorTop(lifenum,255,255,255);
|
|
||||||
ObjText_SetFontColorBottom(lifenum,255,255,255);
|
|
||||||
Obj_SetRenderPriorityI(lifenum, 1);
|
|
||||||
ObjRender_SetX(lifenum,507);
|
|
||||||
ObjRender_SetY(lifenum,101);
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
let liferemain = GetPlayerLife();
|
|
||||||
|
|
||||||
ObjText_SetText(lifenum, rtos("00", liferemain));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
//----------------------------------------------------
|
|
||||||
//残スペル表示
|
|
||||||
//----------------------------------------------------
|
|
||||||
task TPlayerSpell
|
|
||||||
{
|
|
||||||
let spellnum = ObjText_Create();
|
|
||||||
ObjText_SetFontSize(spellnum, 22);
|
|
||||||
ObjText_SetFontBold(spellnum, false);
|
|
||||||
ObjText_SetFontType(spellnum, "Unispace");
|
|
||||||
ObjText_SetFontColorTop(spellnum,255,255,255);
|
|
||||||
ObjText_SetFontColorBottom(spellnum,255,255,255);
|
|
||||||
Obj_SetRenderPriorityI(spellnum, 1);
|
|
||||||
ObjRender_SetX(spellnum,offsetX);
|
|
||||||
ObjRender_SetY(spellnum,baseY+spaceY*3);
|
|
||||||
|
|
||||||
while(true){
|
|
||||||
let spellremain = GetPlayerSpell();
|
|
||||||
|
|
||||||
ObjText_SetText(spellnum, rtos("00", spellremain));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// New life task
|
|
||||||
task LifeDisplay(){
|
|
||||||
|
|
||||||
// oh god oh no
|
|
||||||
let liferemain;
|
|
||||||
let lifecounter = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
|
|
||||||
let lifeshow = graphicimg;
|
|
||||||
Obj_SetRenderPriorityI(lifecounter, 79);
|
|
||||||
ObjPrim_SetTexture(lifecounter, lifeshow);
|
|
||||||
//ObjSpriteList2D_SetSourceRect(lifecounter, 256, 0, 384, 128);
|
|
||||||
//ObjRender_SetScaleXYZ(lifecounter, 0.5, 0.5, 1);
|
|
||||||
//ObjSpriteList2D_SetDestCenter(lifecounter);
|
|
||||||
|
|
||||||
int maxText = CreateTextObject(
|
|
||||||
1440, 390, 45,
|
|
||||||
"ASCENSION", "Origami Mommy",
|
|
||||||
0x280644, 0x701582,
|
|
||||||
0xD1B4FF, 3.5,
|
|
||||||
2
|
|
||||||
);
|
|
||||||
|
|
||||||
ObjText_SetFontWeight(maxText, 1000);
|
|
||||||
|
|
||||||
int MaxLife = GetCommonData("Life Limit", 99999);
|
|
||||||
|
|
||||||
loop{
|
|
||||||
SetPlayerLife(min(MaxLife, GetPlayerLife()));
|
|
||||||
|
|
||||||
if(GetPlayerY() < GetStgFrameHeight() * 1/8){
|
|
||||||
ObjRender_SetAlpha(lifecounter, 125);
|
|
||||||
}
|
|
||||||
else{ObjRender_SetAlpha(lifecounter, 255);}
|
|
||||||
|
|
||||||
ObjSpriteList2D_ClearVertexCount(lifecounter);
|
|
||||||
ObjSpriteList2D_SetSourceRect(lifecounter, 608, 288, 640, 288+32);
|
|
||||||
ObjRender_SetTextureFilterMag(lifecounter, FILTER_NONE);
|
|
||||||
ObjSpriteList2D_SetDestCenter(lifecounter);
|
|
||||||
ObjRender_SetScaleXYZ(lifecounter, 2, 2, 1);
|
|
||||||
liferemain = GetPlayerLife();
|
|
||||||
ascent(i in 0..liferemain){
|
|
||||||
ObjRender_SetPosition(lifecounter, 710+i*24, 30, 0);
|
|
||||||
ObjSpriteList2D_AddVertex(lifecounter);
|
|
||||||
}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
// New spell task
|
|
||||||
task SpellDisplay{
|
|
||||||
|
|
||||||
int text = CreateTextObject(
|
|
||||||
1820, 380, 32,
|
|
||||||
"MAX", "Origami Mommy",
|
|
||||||
0xFFB4F7, 0xFFFFFF,
|
|
||||||
0x6600BE, 4,
|
|
||||||
2
|
|
||||||
);
|
|
||||||
|
|
||||||
Obj_SetVisible(text, false);
|
|
||||||
ObjText_SetSidePitch(text, -4);
|
|
||||||
ObjText_SetHorizontalAlignment(text, ALIGNMENT_CENTER);
|
|
||||||
|
|
||||||
let spellremain;
|
|
||||||
let spellcounter = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
|
|
||||||
let spellshow = graphicimg;
|
|
||||||
Obj_SetRenderPriorityI(spellcounter, 1);
|
|
||||||
ObjPrim_SetTexture(spellcounter, spellshow);
|
|
||||||
|
|
||||||
loop{
|
|
||||||
if(GetPlayerSpell() > 5){SetPlayerSpell(5);}
|
|
||||||
if(GetPlayerSpell() == 5){Obj_SetVisible(text, true);}
|
|
||||||
else{Obj_SetVisible(text, false);}
|
|
||||||
ObjSpriteList2D_ClearVertexCount(spellcounter);
|
|
||||||
ObjSpriteList2D_SetSourceRect(spellcounter, 640, 128, 768, 256);
|
|
||||||
ObjSpriteList2D_SetDestCenter(spellcounter);
|
|
||||||
ObjRender_SetScaleXYZ(spellcounter, 0.3*scale, 0.3*scale, 1);
|
|
||||||
spellremain = GetPlayerSpell();
|
|
||||||
ascent(i in 0..spellremain){
|
|
||||||
ObjRender_SetPosition(spellcounter, 1604+i*32, 392, 0);
|
|
||||||
ObjSpriteList2D_AddVertex(spellcounter);
|
|
||||||
}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//----------------------------------------------------
|
|
||||||
// Edited ExRumia system
|
|
||||||
//----------------------------------------------------
|
|
||||||
task TBossLife
|
|
||||||
|
|
||||||
// Lifebar starts at x = 352, ends at x = 925
|
|
||||||
{
|
|
||||||
let path = lifebarimg;
|
|
||||||
let obj = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
|
|
||||||
let objStar = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
|
|
||||||
let objDivision = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
|
|
||||||
let objLifebar = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
|
|
||||||
//bool BossExist = false;
|
|
||||||
|
|
||||||
ObjPrim_SetTexture(obj, path);
|
|
||||||
Obj_SetRenderPriorityI(obj, 72);
|
|
||||||
ObjRender_SetAlpha(obj, 255);
|
|
||||||
|
|
||||||
ObjPrim_SetTexture(objStar, path);
|
|
||||||
Obj_SetRenderPriorityI(objStar, 70);
|
|
||||||
|
|
||||||
ObjPrim_SetTexture(objDivision, path);
|
|
||||||
Obj_SetRenderPriorityI(objDivision, 72);
|
|
||||||
|
|
||||||
ObjPrim_SetTexture(objLifebar, path);
|
|
||||||
Obj_SetRenderPriorityI(objLifebar, 70);
|
|
||||||
ObjRender_SetAlpha(objLifebar, 140);
|
|
||||||
//Obj_SetVisible(objLifebar, false);
|
|
||||||
|
|
||||||
let lastRemStep = -1;
|
|
||||||
let lifeRateRender = 0;
|
|
||||||
|
|
||||||
let objScene = ID_INVALID;
|
|
||||||
loop
|
|
||||||
{
|
|
||||||
objScene = GetEnemyBossSceneObjectID();
|
|
||||||
ObjSpriteList2D_ClearVertexCount(obj);
|
|
||||||
ObjSpriteList2D_ClearVertexCount(objLifebar);
|
|
||||||
ObjSpriteList2D_ClearVertexCount(objStar);
|
|
||||||
ObjSpriteList2D_ClearVertexCount(objDivision);
|
|
||||||
if(objScene != ID_INVALID)
|
|
||||||
{
|
|
||||||
//BossExist = true;
|
|
||||||
ObjSpriteList2D_SetSourceRect(objLifebar, 8, 6, 801, 50);
|
|
||||||
ObjSpriteList2D_SetDestCenter(objLifebar);
|
|
||||||
ObjRender_SetScaleXYZ(objLifebar, 1.12, 1.25, 1);
|
|
||||||
ascent (i in 0..1){
|
|
||||||
ObjRender_SetPosition(objLifebar, 455, 40, 1);
|
|
||||||
ObjSpriteList2D_AddVertex(objLifebar);
|
|
||||||
}
|
|
||||||
RenderActiveLife();
|
|
||||||
|
|
||||||
}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*task RenderLifebar(){
|
|
||||||
ObjSprite2D_SetSourceRect(objLifebar, 5, 5, 534, 34);
|
|
||||||
ObjSprite2D_SetDestCenter(objLifebar);
|
|
||||||
ObjRender_SetPosition(objLifebar, 352, 20, 1);
|
|
||||||
while(BossExist){
|
|
||||||
Obj_SetVisible(objLifebar, true);
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
function RenderActiveLife()
|
|
||||||
{
|
|
||||||
//残りステップ
|
|
||||||
let countRemStep = ObjEnemyBossScene_GetInfo(objScene, INFO_REMAIN_STEP_COUNT);
|
|
||||||
if(lastRemStep != countRemStep)
|
|
||||||
{
|
|
||||||
//ステップが変化
|
|
||||||
lifeRateRender = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Overall active life
|
|
||||||
let lifeTotalMax = ObjEnemyBossScene_GetInfo(objScene, INFO_ACTIVE_STEP_TOTAL_MAX_LIFE);
|
|
||||||
let lifeTotal = ObjEnemyBossScene_GetInfo(objScene, INFO_ACTIVE_STEP_TOTAL_LIFE);
|
|
||||||
let lifeRate = min(lifeTotal / lifeTotalMax, lifeRateRender);
|
|
||||||
ObjSpriteList2D_SetSourceRect(obj, 7, 119, 800, 159);
|
|
||||||
ObjSpriteList2D_SetDestRect(obj, 11, 20, 12 + (890-2) * lifeRate, 60);
|
|
||||||
ObjRender_SetColorHSV(obj, -60, 384, 384);
|
|
||||||
ObjSpriteList2D_AddVertex(obj);
|
|
||||||
ObjRender_SetBlendType(obj, BLEND_ALPHA);
|
|
||||||
|
|
||||||
//Life "division" bar
|
|
||||||
ObjSpriteList2D_SetSourceRect(objDivision, 8, 56, 27, 111);
|
|
||||||
//ObjRender_SetColorHSV(objDivision, 32, 255, 255);
|
|
||||||
let listLifeDiv = [0] ~ ObjEnemyBossScene_GetInfo(objScene, INFO_ACTIVE_STEP_LIFE_RATE_LIST);
|
|
||||||
ascent(iDiv in 1 .. length(listLifeDiv)-1)
|
|
||||||
{
|
|
||||||
let rate = listLifeDiv[iDiv];
|
|
||||||
let x = (GetStgFrameWidth()) * 0.98 * (1-rate);
|
|
||||||
ObjSpriteList2D_SetDestRect(objDivision, x-4, 62, x+24, 118);
|
|
||||||
ObjSpriteList2D_AddVertex(objDivision);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Boss star rendering
|
|
||||||
ObjRender_SetScaleXYZ(objStar, 0.6, 0.6, 1);
|
|
||||||
ObjSpriteList2D_SetSourceRect(objStar, 0, 169, 268, 430);
|
|
||||||
Obj_SetRenderPriority(objStar, 1);
|
|
||||||
ascent(iStep in 0 .. countRemStep)
|
|
||||||
{
|
|
||||||
ObjRender_SetPosition(objStar, GetStgFrameWidth()*1.6, 35+45*iStep, 1);
|
|
||||||
ObjSpriteList2D_SetDestCenter(objStar);
|
|
||||||
ObjSpriteList2D_AddVertex(objStar);
|
|
||||||
}
|
|
||||||
|
|
||||||
lifeRateRender += 0.01;
|
|
||||||
lifeRateRender = min(lifeRateRender, 1);
|
|
||||||
lastRemStep = countRemStep;
|
|
||||||
|
|
||||||
if(GetCommonData("IsFightingBoss", false) == true){
|
|
||||||
if(ObjMove_GetY(GetPlayerObjectID()) < GetStgFrameHeight()/6){
|
|
||||||
ObjRender_SetAlpha(obj, 60);
|
|
||||||
ObjRender_SetAlpha(objLifebar, 30);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
ObjRender_SetAlpha(obj, 255);
|
|
||||||
ObjRender_SetAlpha(objLifebar, 140);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else{
|
|
||||||
ObjRender_SetAlpha(obj, 0);
|
|
||||||
ObjRender_SetAlpha(objLifebar, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------
|
|
||||||
//タイマー表示
|
|
||||||
//----------------------------------------------------
|
|
||||||
task TBossTimer
|
|
||||||
{
|
|
||||||
let textTimer = ObjText_Create();
|
|
||||||
ObjText_SetFontSize(textTimer, 20);
|
|
||||||
ObjText_SetFontType(textTimer, "GravityRegular5");
|
|
||||||
|
|
||||||
//ObjText_SetMaxWidth(textTimer, GetStgFrameWidth()/6);
|
|
||||||
ObjText_SetHorizontalAlignment(textTimer, ALIGNMENT_LEFT);
|
|
||||||
|
|
||||||
ObjText_SetFontBold(textTimer, true);
|
|
||||||
ObjText_SetFontColorTop(textTimer, 0xFFFFFF);
|
|
||||||
ObjText_SetFontColorBottom(textTimer, 0xFFFFFF);
|
|
||||||
ObjText_SetFontBorderType(textTimer, BORDER_FULL);
|
|
||||||
ObjText_SetFontBorderColor(textTimer, 0x45A6FF);
|
|
||||||
ObjText_SetFontBorderWidth(textTimer, 5);
|
|
||||||
Obj_SetRenderPriorityI(textTimer, 73);
|
|
||||||
//ObjRender_SetX(textTimer, GetStgFrameWidth()/2);
|
|
||||||
ObjRender_SetX(textTimer, 710);
|
|
||||||
ObjRender_SetY(textTimer, 125);
|
|
||||||
Obj_SetVisible(textTimer, true);
|
|
||||||
|
|
||||||
let pathDigit = GetCurrentScriptDirectory() ~ "img/Default_SystemDigit.png";
|
|
||||||
|
|
||||||
let obj = ObjPrim_Create(OBJ_SPRITE_LIST_2D);
|
|
||||||
ObjPrim_SetTexture(obj, lifebarimg);
|
|
||||||
ObjRender_SetBlendType(obj, BLEND_ADD_RGB);
|
|
||||||
Obj_SetRenderPriority(obj, 0.75);
|
|
||||||
//ObjRender_SetY(obj, 38);
|
|
||||||
let count = 2;
|
|
||||||
|
|
||||||
let objScene = ID_INVALID;
|
|
||||||
loop
|
|
||||||
{
|
|
||||||
objScene = GetEnemyBossSceneObjectID();
|
|
||||||
ObjSpriteList2D_ClearVertexCount(obj);
|
|
||||||
if(objScene != ID_INVALID)
|
|
||||||
{
|
|
||||||
Obj_SetVisible(textTimer, true);
|
|
||||||
RenderTimer();
|
|
||||||
}
|
|
||||||
else{Obj_SetVisible(textTimer, false);
|
|
||||||
}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
task RenderTimer()
|
|
||||||
{
|
|
||||||
let timer = ObjEnemyBossScene_GetInfo(objScene, INFO_TIMERF)/60;
|
|
||||||
timer = min(timer, 999.99);
|
|
||||||
ObjText_SetText(textTimer, rtos("000.00", timer) ~ "[font sz=15 oy=18]s LEFT");
|
|
||||||
ObjSpriteList2D_SetSourceRect(obj, 404, 225, 537, 374);
|
|
||||||
ObjRender_SetScaleXYZ(obj, 1, 1, 1);
|
|
||||||
ObjSpriteList2D_SetDestCenter(obj);
|
|
||||||
ObjRender_SetPosition(textTimer, 590, 55, 1);
|
|
||||||
//ObjSpriteList2D_AddVertex(obj);
|
|
||||||
if(ObjEnemyBossScene_GetInfo(objScene, INFO_TIMER) <= 10 && ObjEnemyBossScene_GetInfo(objScene, INFO_TIMER) > 0){
|
|
||||||
if(ObjEnemyBossScene_GetInfo(objScene, INFO_TIMERF) % 60 == 0 || ObjEnemyBossScene_GetInfo(objScene, INFO_TIMER) < 1){_Timeout();}
|
|
||||||
ObjText_SetFontBorderColor(textTimer, 0xF0396C);
|
|
||||||
}
|
|
||||||
else{ObjText_SetFontBorderColor(textTimer, 0x45A6FF); ObjText_SetFontSize(textTimer, 35);}
|
|
||||||
if(ObjMove_GetY(GetPlayerObjectID()) < GetStgFrameHeight()/8){
|
|
||||||
ObjRender_SetAlpha(textTimer, 60);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
ObjRender_SetAlpha(textTimer, 255);
|
|
||||||
}
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
task _Timeout(){ // HOLY FUCK THE TIMER IS RUNNING OUT BITCH
|
|
||||||
|
|
||||||
ascent(i in 0..30){
|
|
||||||
ObjText_SetFontSize(textTimer, Interpolate_Decelerate(50, 25, i/30));
|
|
||||||
//ObjRender_SetScaleXYZ(obj, Interpolate_Decelerate(0.6, 0.38, i/30));
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task TScoreAward(dascore){
|
|
||||||
|
|
||||||
let objText = ObjText_Create();
|
|
||||||
int x = rand_int(0, 99);
|
|
||||||
|
|
||||||
RegularAward;
|
|
||||||
|
|
||||||
task RegularAward{
|
|
||||||
|
|
||||||
let fontsizearray = [70, 70, 70, 65, 60, 65, 70, 70, 70, 40, 40];
|
|
||||||
let textarray = ["So Cool Bestie!", "Bimbo Eliminated!", "Wig Snatched!", "Neutralized Boss Sexiness!", "Gay Rights Confirmed!", "Himbo Kisses!", "Slay Button Hit!", "Yass!!!!", "Gatekept, Gaslit, Girlbossed!", "Spell Card Capture!"];
|
|
||||||
|
|
||||||
int y = rand_int(0, length(textarray)-2);
|
|
||||||
|
|
||||||
ObjText_SetText(objText, textarray[y]); // Selects a random capture text from the array
|
|
||||||
ObjText_SetFontSize(objText, fontsizearray[y]*1.5);
|
|
||||||
ObjText_SetFontType(objText, "Exotc350 DmBd BT");
|
|
||||||
|
|
||||||
//ObjText_SetMaxWidth(objText, GetStgFrameWidth());
|
|
||||||
ObjText_SetHorizontalAlignment(objText, ALIGNMENT_CENTER);
|
|
||||||
|
|
||||||
ObjText_SetFontBold(objText, true);
|
|
||||||
ObjText_SetFontColorTop(objText, 0xFFD34D);
|
|
||||||
ObjText_SetFontColorBottom(objText, 0xFFF2CA);
|
|
||||||
ObjText_SetFontBorderType(objText, BORDER_FULL);
|
|
||||||
ObjText_SetFontBorderColor(objText,0, 0, 0);
|
|
||||||
ObjText_SetFontBorderWidth(objText, 3);
|
|
||||||
Obj_SetRenderPriority(objText, 0.6);
|
|
||||||
ObjRender_SetX(objText, GetStgFrameWidth()/2);
|
|
||||||
ObjRender_SetY(objText, GetStgFrameHeight()/5);
|
|
||||||
}
|
|
||||||
|
|
||||||
let scorefinal = trunc(dascore/10) * 10;
|
|
||||||
let scorescene = GetEnemyBossSceneObjectID();
|
|
||||||
|
|
||||||
if (ObjEnemyBossScene_GetInfo(scorescene, INFO_PLAYER_SHOOTDOWN_COUNT) == 0 &&
|
|
||||||
ObjEnemyBossScene_GetInfo(scorescene, INFO_PLAYER_SPELL_COUNT) == 0){
|
|
||||||
AddScore(scorefinal);
|
|
||||||
}
|
|
||||||
|
|
||||||
let strScore = "Capture Bonus +" ~ DigitToCommaArray(scorefinal);
|
|
||||||
let objScore = ObjText_Create();
|
|
||||||
ObjText_SetText(objScore, strScore);
|
|
||||||
ObjText_SetFontSize(objScore, 85);
|
|
||||||
ObjText_SetFontType(objScore, "Anke Calligraph");
|
|
||||||
|
|
||||||
ObjText_SetMaxWidth(objScore, GetStgFrameWidth());
|
|
||||||
ObjText_SetHorizontalAlignment(objScore, ALIGNMENT_CENTER);
|
|
||||||
|
|
||||||
ObjText_SetFontBold(objScore, true);
|
|
||||||
ObjText_SetFontColorTop(objScore, 0x9C2400);
|
|
||||||
ObjText_SetFontColorBottom(objScore, 0xFF982A);
|
|
||||||
ObjText_SetFontBorderType(objScore, BORDER_FULL);
|
|
||||||
ObjText_SetFontBorderColor(objScore, 255, 255, 255);
|
|
||||||
ObjText_SetFontBorderWidth(objScore, 3);
|
|
||||||
Obj_SetRenderPriority(objScore, 0.6);
|
|
||||||
ObjRender_SetX(objScore, GetStgFrameWidth()/2 - (GetStgFrameWidth()/2-5));
|
|
||||||
ObjRender_SetY(objScore, GetStgFrameHeight()/3.2-15);
|
|
||||||
|
|
||||||
wait(120);
|
|
||||||
|
|
||||||
Obj_Delete(objText);
|
|
||||||
Obj_Delete(objScore);
|
|
||||||
|
|
||||||
}
|
|
||||||
//----------------------------------------------------
|
|
||||||
//FPS表示
|
|
||||||
//----------------------------------------------------
|
|
||||||
task TCurrentFps()
|
|
||||||
{
|
|
||||||
|
|
||||||
if(IsReplay()){return;}
|
|
||||||
|
|
||||||
let objText = ObjText_Create();
|
|
||||||
ObjText_SetFontSize(objText, 36);
|
|
||||||
ObjText_SetFontBold(objText, true);
|
|
||||||
ObjText_SetFontType(objText, "Unispace");
|
|
||||||
ObjText_SetFontColorTop(objText, 0x6747FF);
|
|
||||||
ObjText_SetFontColorBottom(objText, 0xAEC4FF);
|
|
||||||
ObjText_SetFontBorderType(objText, BORDER_FULL);
|
|
||||||
ObjText_SetFontBorderColor(objText, 38, 3, 93);
|
|
||||||
ObjText_SetFontBorderWidth(objText, 1.5);
|
|
||||||
ObjText_SetHorizontalAlignment(objText, ALIGNMENT_RIGHT);
|
|
||||||
ObjText_SetMaxWidth(objText, GetScreenWidth() - 8);
|
|
||||||
Obj_SetRenderPriority(objText, 1.0);
|
|
||||||
ObjRender_SetX(objText, 0);
|
|
||||||
ObjRender_SetY(objText, GetScreenHeight() - 48);
|
|
||||||
|
|
||||||
loop
|
|
||||||
{
|
|
||||||
let fps = GetCurrentFps();
|
|
||||||
let text = vtos("1.2f", fps) ~ "fps";
|
|
||||||
ObjText_SetText(objText, text);
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task TReplayFps()
|
|
||||||
{
|
|
||||||
if(!IsReplay()){return;}
|
|
||||||
|
|
||||||
let objText = ObjText_Create();
|
|
||||||
ObjText_SetFontSize(objText, 36);
|
|
||||||
ObjText_SetFontType(objText, "Unispace");
|
|
||||||
ObjText_SetFontBold(objText, true);
|
|
||||||
ObjText_SetFontColorTop(objText, 128, 128, 255);
|
|
||||||
ObjText_SetFontColorBottom(objText, 255, 255, 255);
|
|
||||||
ObjText_SetFontBorderType(objText, BORDER_FULL);
|
|
||||||
ObjText_SetHorizontalAlignment(objText, ALIGNMENT_RIGHT);
|
|
||||||
ObjText_SetFontBorderColor(objText,38, 3, 93);
|
|
||||||
ObjText_SetFontBorderWidth(objText, 1);
|
|
||||||
Obj_SetRenderPriorityI(objText, 79);
|
|
||||||
|
|
||||||
let px = GetStgFrameWidth() - 10;
|
|
||||||
let py = GetStgFrameHeight() - 42;
|
|
||||||
ObjRender_SetX(objText, px);
|
|
||||||
ObjRender_SetY(objText, py);
|
|
||||||
|
|
||||||
loop
|
|
||||||
{
|
|
||||||
let fps = GetReplayFps();
|
|
||||||
let text = vtos("1.2f", fps);
|
|
||||||
ObjText_SetText(objText, "REPLAY MODE: " ~ text ~ "fps");
|
|
||||||
yield;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------
|
|
||||||
//ユーティリティ
|
|
||||||
//----------------------------------------------------
|
|