Not In The Groove Version 4

NotITG changelog - version 4 (12/01/2020)

🚨 BREAKING CHANGES

  • YOU NEED A NEW SET OF .DLLs TO RUN NotITG v4, - previous Program/ folder no longer works as a result of the new .dlls
    • We're distributing a full installation of the Program/ directory this time, so what you'll need to do is download the entire folder and put it in your NotITG install.
      • It'll have the .exe, .vdi and the new .dlls bundled inside. You can safely merge them into the old Program/ folder.
    • This also includes a Noteskins folder to merge with your current one, as some have been updated! You can just merge these with your current iterations, if applicable.
      • Provided - combination, cyber, default, divinentity, de-default, dunno, dunno2, proxynotes, randomhex, scalable, scalable2, sm3.9, Toshisan, vintage You will very likely have file conflicts with existing noteskins - it's safe to just replace the conflicts, as they need to be overwritten.
  • squareoffset and bounceoffset revised, now you don't have to multiply its value by 100
  • Player:GetNoteData() now returns the correct format for mines
    • Formerly 100, now "M"
      • (This wasn't actually documented beforehand so no one knew about this)
  • Mods like drunkoffset and tipsyoffset, including axis and tan variants, have new behaviors
    • Previous behavior can be found under the mod drunkspacing

💡 New Features!

Editing

  • F3 + 9 in anywhere: Edit Last Edited Song
    • We now properly select the last edited chart (if it was an edit difficulty) by saving the description to the stepmania.ini file instead of the difficulty.
  • F3 + 0 in ScreenSelectMusic or ScreenGameplay: Edit Currently Playing Song
  • Ctrl + [ in edit: Music preview starts from here (start marker)
  • Ctrl + ] in edit: Music preview ends at here (end marker)
    • It'll set the length of the preview automatically with this.
  • Ctrl + O in edit: Open song folder from edit mode
    • This opens the song folder in a new Explorer window.
  • Alt + Scroll in editor now repositions the receptors on screen
  • Autoadvance mode selectable from editor preferences ( ESC -> Preference ) which moves the receptors down after placing down an arrow
    • This is turned off by default.
  • ScreenEdit now shows current BPM along with Beat and Time
    • Toggle by Esc -> Preferences -> Show Beat, Time and Attack List during play
  • #NOSHUFFLE: zone in .sm, allows user to determine segments of the chart that cannot be affected by shuffles such as Mirror and SmartBlender
    • #NOSHUFFLE:<StartBeat>=<EndBeat>,<StartBeat>=<EndBeat>,<StartBeat>=<EndBeat>
  • Transform option "Swap note players" allows you to switch which players are to hit which notes within a region, while in couples editing mode.

Modding / Lua

  • Actor Lua errors will no longer crash as often!!! (Thanks, NAYOTO!)

    • Feature of the decade,.,.,.,.,.
  • Fonts can be loaded relative to XML file now

  • skewy tween as a mod

  • New mod: orient

    • Additionally rotates arrows in the direction of travel relative to "upwards".
    • It can also be used in percentages, to increase or decrease or even invert the effect.
    • For downwards scroll (e.g. with Reverse or splines), combine this mod with 314% ConfusionOffset
  • noteskewx - Identical to noteskew

  • noteskewy - skewy for notes. noteskewx and y can also be column specific, e.g. noteskewy2

  • waveoffset - Affects the waveform of wave

  • Column specific wave and waveperiod -wave2, waveperiod3, etc.

  • Updated Lua from 5.0.2 to 5.0.3 (with some modifications)

    • Enabled debug library.
    • Some Lua 5.1 features have been added as well;
      • Long strings and comments (Thanks, XeroOl!)
        • You can use an arbitrary amount of = signs in the delimiters
        • [=[hello]=]
        • --[==[Im a comment]==]
      • Added modulo operator %
        • 5 % 3 is the same as math.mod(5,3)
      • Added length operator #
        • works on both strings and tables
        • example: #myTable is the same as table.getn(myTable)
      • Added hex number support: 0xA573
    • Fixed various other logic errors listed on the Lua bugs list.
  • Updated FFmpeg from 0.4.9-pre1 to 4.1.4

    • Added .mp4, .webm, .mkv, .flv video file support
    • Added .apng, .webp image/anim file support
    • .gifs are now animated! Baby
  • Actor:skewy( skew: number )

  • Actor:addaux( deltaaux: number )

  • Actor:GetParent(): Actor

  • Actor:GetTweenTimeLeft(): number

    • The name explains itself - the number won't go negative.
  • Actor:SetRotationOrder(): string / Actor:GetRotationOrder( order: string )

    • We're now able to change its order of euler rotation
    • e.g. SetRotationOrder( "xyz" )
    • "zyx" by default
  • ActorFrame:GetChildren(): table

  • ActorFrame:GetSharedBGA(): ActorFrame

  • ActorFrame:GetOverlayScreens(): table

  • SCREENMAN and ActorFrame have metamethods now

    local af = SCREENMAN() -- GetTopScreen()
    #SCREENMAN() -- GetTopScreen():GetNumChildren(), we get an ActorFrame first here
    SCREENMAN(5) -- GetTopScreen():GetChildAt(4) <- notice the index
    SCREENMAN("Overlay") -- GetTopScreen():GetChild("Overlay")
    
    af("PlayerP1") -- same as above, but on the ActorFrame directly
    af("PlayerP1")(2) -- chaining example, gets the second child on PlayerP1
    #af -- GetNumChildren()
  • Added input modes for screens

    • Can be used to control which screens receives game input.
    • ScreenManager:SetInputMode( INPUT_ALL = 0 | INPUT_OVERLAY = 1 | INPUT_NONE = 2)
  • Song:GetNoteData( steps, [bool beatBased = true,] number startBeat = 0, number endBeat = -1 )

    • Player:GetNoteData already exists
  • sprite:getstate()

    • Returns the current state of sprite
  • sprite:looppoint( point: int )

    • This can be used to make multiple-state animations using a single spritesheet - such as having a run cycle set the loop point when starting/stopping a run.
  • player:Reset<type>Splines( column: int )

    • Column specific reset splines
  • player:SetArrowPathShader() works now

  • Added Song methods:

    • GetDisplaySubTitle()
    • GetTranslitSubTitle()
    • GetBackgroundPath()
    • GetMusicPath()
    • GetSampleStartSeconds()
    • GetSampleLengthSeconds()
  • GAMESTATE:GetCurrentNoteSkins()

    • returns a table of noteskin names that is currently in use
  • GAMESTATE:GetRealPath( string )

    • It works pretty well with AdditionalSongFolders lua -- Assuming AdditionalSongFolders is `D:/AdditionalSongFolder` local songDir = GAMESTATE:GetCurrentSong():GetSongDir() GAMESTATE:GetRealPath(songDir .. "./fg/default.xml") -- Returns `D:/AdditionalSongFolder/Group/Song/fg/default.xml`
  • Added Shader Methods:

    • Uniform Arrays
      • uniform1iv( string name, table )
      • uniform1fv( string name, table )
      • uniform2fv( string name, table )
      • uniform3fv( string name, table )
      • uniform4fv( string name, table )
        • e.g. shader:uniform4fv( 'v4Array', { 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 } ) sends a vec4 array where its length is 2
    • Uniform Matrices
      • uniformMatrix2fv( string name, table )
      • uniformMatrix3fv( string name, table )
      • uniformMatrix4fv( string name, table )
        • e.g. shader:uniformMatrix2fv( 'mat2Rotate', { 0.0, -1.0, 1.0, 0.0 } ) sends a 2x2 matrix
    • Defines
      • define( string name, string/bool/number/nil )
      • clearDefine( string name )
        • Basically you can inject #define HOGE 4 on top of the shader code
    • Compile Immediately
      • compileImmediate()
        • calling define() or clearDefine() does not automatically compile the shader. Call this function to compile it immediately (or to make it automatically compile when it uses the shader for the first time)
  • New MessageCommands:

    • WindowFocusMessageCommand
    • WindowFocusLostMessageCommand
  • Profile:ClearHighScoresForSongAndSteps( song: string )

  • Profile:ClearHighScoresForSong( song: string )

  • Simfiles can now temporarily override user's SmoothLines preference for one song with GAMESTATE:ForceSmoothLines( 0 or 1 )

    • (used for the Groove Coaster lines in Line Delta and Got More Raves)
    • Reset smoothlines back to user's setting with GAMESTATE:ForceSmoothLines( -1 )
  • basezoomz can finally be set actor:basezoomz(float) or basezoomz,float

  • actor:GetBaseZoomY() and actor:GetBaseZoomZ() added

  • New actor state getting methods, including the ability to get the current state of previously unknowable values, such as zoom and rotation

    • actor:GetRotationX()
  • actor:GetRotationY()

  • actor:GetRotationZ()

  • actor:GetCurrentRotationX()

  • actor:GetCurrentRotationY()

  • actor:GetCurrentRotationZ()

  • actor:GetCurrentZoomX()

  • actor:GetCurrentZoomY()

  • actor:GetCurrentZoomZ()

  • actor:GetSkewX()

  • actor:GetSkewY()

  • Also available, current state of actors when taking into account active effects e.g. bob, wag and so on (Thanks, Melody!)

  • actor:GetEffectX()

  • actor:GetEffectY()

  • actor:GetEffectZ()

  • actor:GetEffectRotationX()

  • actor:GetEffectRotationY()

  • actor:GetEffectRotationZ()

  • An additional layer for actor position/rotation/scaling is now available

    • actor:x2(), y2, z2, zoomx2, zoomy2, zoomz2, rotationx2, rotationy2, rotationz2, skewx2, skewy2 (these cannot be tweened, and must be set via an update loop)
  • Player:SetHiddenRegions( {{startBeat,endBeat,column},...} ) hides notes within the specified beat ranges. Omit the "column" parameter to hide all columns.

  • Player:SetNoteTypeMults( {{startBeat,multiplier},...}) multiplies the note type (timing color) of every note beyond startBeat.

  • Player:ClearHiddenRegions() and Player:ClearNoteTypeMults() removes all sections of the specified type.

Themes

  • 192nd quants for noteskins enabled, falls back to old behaviour if 192nd is missing

Misc.

  • UNLOCK: A system is now in place for locking songs or certain charts behind conditions, that can be defined via lua.

    • Conditions can be based on things like arbitrary globals, or high scores on certain songs using PROFILEMAN.
    • Song unlock conditions are set via #UNLOCK:someunlock.lua; in the .sm file
    • Chart unlock conditions are set via #UNLOCKSTEPS:
    • Each chart can have a seperate unlock condition using #UNLOCKSTEPS0:, #UNLOCKSTEPS2: etc.,
    • but note that #UNLOCKSTEPS2:easy.lua; #UNLOCKSTEPS4:challenge.lua; will be minified to #UNLOCKSTEPS::easy.lua::challenge.lua::;
    • Example: https://www.dropbox.com/s/sn8nn2tll8k5cjj/unlocktest.lua?dl=0 Any lua can be used here. If the lua fails to compile, the song will be considered NOT locked and will show on the songwheel.
    • Lua unlocks: Unlock command now accepts:
      • THIS_SONG to refer to the song itself
      • THIS_GROUP the group the song belongs to
      • THIS_PACK Identical to THIS_GROUP
    • song:GetUnlockMethod( difficulty ) can be used to get the path directly to the lua file.
  • Added NotITGKeymaps.ini, which has the same format as SM5 Keymaps
  • Data/NotITGPrefs.ini:
    • OnlySongFolders
      • You can now choose to ONLY load specific song folders. Seperate with a comma.
    • FFmpegNumThreads
      • The amount of decode threads FFmpeg will use, defaults to 6,
  • GameState:Get/SetExternal address is printed into the log at startup.

💪 Behavior Changes

Gameplay

  • A performance improvement on BitmapText (Thanks, Squirrel!)
  • Playing on Rate mods no longer un-syncs (Game now accounts for .009 ITG sync)
    • See NotITGPrefs.ini, RateMods9msOffsetFix
  • Notefields are reset between marathon songs
  • Player 2 score saving is disabled when BothAtOnce is activated
  • Rate mods no longer sound terrible! (Thanks, Fraxtil!)
  • Fixed a bug where charts in the Edit difficulty slot sometimes fail to load correctly.
  • Autoplay being on at any point during an arrow being hit will now disqualify you, and this will be reflected on the results screen.
    • This basically means that you won't get auto-disqualified if you have Autoplay on at the very start of the file - you'll have a window of opportunity to turn it off before the chart actually starts.
  • Finishing a course no longer lets you select another course after - your 'credit' will end
  • USB songs now preloads entire song directory
    • Playing sound no longer crashes
    • Custom courses now loads custom songs properly
  • Song background now always loads, even if BGBrightness preference is set to 0
  • PlayerStageStats:GetCurrentLife() now returns 0.001 (instead of 0) if no notes or mines have been hit yet.

Editing

  • BetterBackgrounds loads before Foreground in the editor now
  • FOV and vanishpoint resets when stopping in edit mode

Modding / Lua

  • SCREEN_WIDTH and friends are more accurate, this affects widescreen play too
    • It fixes a bug where some AFT trails slightly drift on widescreen only - e.g., in widescreen (16:9 ratio) on SL-based themes, SCREEN_WIDTH is changed from 853 to 853.333… (or near enough)
    • Simply Love is used as the example here because it defines width as 640 - this isn't necessarily the case for other themes!
  • Player:GetNoteData() now clamps to the last beat of the song
  • Proxied actors on ActorProxy can be disconnected
    • Just pass nothing to it, example: proxy:SetTarget()
  • More XML attributes are scriptable
    • Attribute Type set through Lua
    • Attribute Font/File of BitmapText can be set through Lua
    • Attribute Frag and Vert can be set through Lua
      • They work similar to how you use Condition, but you have to start the line with @.
      • Example: <Layer Type="@spriteOrModel() or 'Sprite'" />

Misc.

  • "Report crash" button now goes to the UKSRT Discord
  • log.txt and info.txt are now written to the Data/ folder
  • crashinfo-*.txt is now written to the Data/Crash/ folder
  • Key oem102 is treated as a seperate key and not as a second backslash
  • MonkeyInput displays a system message every time it presses a key.
  • Serial now starts with NITG-

🐛 Bugfixes

Gameplay

  • Marathon mode no longer crashes if you fail with only one player enabled
  • Battle mode no longer crashes
  • Fixed ApproachType on music rates != 1.0x
  • Highscore of USB songs no longer disappears
  • Reset notefield between songs in marathon mode
  • Autosync now works properly with BothAtOnce
  • Miss Combo color now works properly.

Editing

  • Pressing F3 + 0 while it's greyed out/not selectable no longer crashes the game
  • Couples editor crash when using 192nd notes has been fixed
  • No longer crashes if moving to next note while in couples mode
  • ScreenEdit shouldn't crash anymore with DelayedScreenLoad enabled (theme dependent)
  • Fixed hands count in Couples Mode

Modding / Lua

  • Fixed DISPLAY:ShaderFuck()
  • Fixed GAMESTATE:GetFileStructure
  • Fixed Ctrl + R crashes
    • Crash had been seen in 10-1 and gat
  • Fixed crash caused by Var="" on xml actor loading
  • Drunkoffset now affects the left arrow :takimeme2:
  • Recreate() method fixes AFT texture clearing on nvidia
    • NULCTRL (by Kaypooma) now works properly on nvidia
  • ActorFrame:SetDrawFunction( function ) now works
  • Fixed edge case filename behavior
    • BitmapText: Foo [Bar]/Font [Page].png now works properly, treated as Font [Page].
    • Texture: Foo Bar 16x8/Texture sphere.png now works properly, treated as Texture sphere

Misc.

  • Fixed random AV on quit
  • CustomsLoadTimeout now works properly

👾 Known Issues

  • We've found that digital and digitalz are slightly offsync with each other

    • We've prioritized its compatibility for now, and will review in a future update
  • Ctrl + O (Reveal Song Folder) currently does not work with AdditionalSongFolders

    • *

❤️ Simply Love (v4 compat. theme) changes

  • Window Title is now NotITG <build number> - Simply Love
  • New options in the main menu
    • UKSRT Discord: This closes the game and opens a link to the UKSRT Discord
    • Exit Game: Closes the game
  • New selection screen has been added after color selection
    • Selecting Quick Play takes you straight to the song select screen with two players and BothAtOnce enabled
  • Survival has been added to the play mode selection screen
  • Default Fail Type is now available in the Arcade Options menu
  • Added M-mod to the player options
    • M for Maximum; if you set the speed to M300, your scroll speed will be Max 300 if the chart has several BPM changes.
  • OffsetPlot can now view detailed spellcard information data
  • OffsetPlot now has MineRow data
    • shows the exact noterow (beat * 48) of every mine hit by player
  • Added Themes/SimplyLove/config.lua, some newer theme properties are set in that
    • config.lua can be copied to the Data/ folder, any options set there will take priority over the ones in the Simply Love folder
  • Stitch.lua has been added to the Themes/SimplyLove/Scripts/ folder
    • Globals stitch and stx has been added
    • Its purpose is to run and cache Lua files using the Themes/SimplyLove/ folder as its base folder.
    • Basic usage: local hello = stitch('screen.hello') will load SimplyLove/Screen/hello.lua, cache and return its value.
  • ArcticFqx's console has been added to the theme
    • The console runs Lua directly and can be used to do quick maths, execute mods mid-file, receive prints from Traces or SystemMessages or just break the game completely.
    • QwertyUS layout default keybind to open the console: ctrl+9
    • Keyboard layout and console key can be changed in config.lua
  • Lua heap viewer, enable with ViewGC in config.lua
  • (OpenITG only) If DefaultModifiers has the Scalable NoteSkin set, it switches over to Cel as you enter edit mode or song select for the first time.
  • (OpenITG only) EditorShowSongTitle is available in config.lua, works exactly the same as the one in NotITGPrefs.ini

Misc.

  • Deobfuscated various files
  • Function Player defined by Simply Love has been localized to Mods.lua