This is divided into four sections: 1. Player visible changes: New configuration options players should try out, 2. Themer visible changes: New (optional) screens that themes can support, new metrics or lua functions, or fixes for existing functions. 3. Prominent bug fixes: Bugs that seem prominent and aren't solely relevant to themers. Listing every tiny little bug would make these notes far longer than they already are, so most bugs are left out. 4. Preemptive problem solving: Problems that might commonly occur and have a known good solution. Each section will first list each of the items in it, then after the full list, each item will be discussed in detail. Items are roughly grouped into the general part of Stepmania they fit into. Player visible changes: Edit Mode: Play song ends when the song ends, or when the notes end, whichever is later. Key configuration. Kickbox: A new game mode Preferences: DefaultFailType EditRecordModeLeadIn MinTNSToHideNotes Previously hidden preferences: AllowMultipleHighScoreWithSameName ComboContinuesBetweenSongs Disqualification FailOffForFirstStageEasy FailOffInBeginner LockCourseDifficulties InputDebounceTime MaxHighScoresPerListForMachine MaxHighScoresPerListForPlayer Profile: Profile merging Profile types ScreenMapControllers ScreenSelectStyle ScreenOptions: Player nameplates added with bpm info. Videos: webm and wmv added to list of supported video formats. Polish translation updated by Jarosław Pietras. Details: DefaultFailType: Internal mechanism changed again, set the preference to what you want again and report if it doesn't stick. (side note: It's stored in the DefaultModifiers preference, which is different for every game mode, so you'll have to set it for every game mode you play) Edit Mode Key Configuration: See Docs/Mapping_keys_for_edit_mode.txt EditRecordModeLeadIn: Preference for setting the number of seconds before the selected section comes up in record mode. Should be settable on the options screen in edit mode in default theme. MinTNSToHideNotes: This preference controls the tap note score you must get on a note for it to disappear. Normally, any note that you score great or better on disappears, and the rest stay visible. Change this preference to miss, and even notes you miss will disappear. Change it to checkpoint, and not even fantastic will make a note disappear. There is also a modifier for this, to allow players to have different settings if the theme provides a way to set the modifier. Previously hidden preferences: A bunch of useful preferences weren't settable through the service menu. InputDebounceTime was added to the Input Options section. The rest in the list were added to the Arcade Options section. They might not show up in custom themes that change the service menu. Profile: Profile merging: Profiles can be merged together now, to import scores from an old profile into a new one. Merging does not delete the old profile, you must do that step separately. When merging a local profile into the machine profile, you can choose to skip merging the totals (step count, songs played, and similar) Profile types: Guest and Test profile types added. All existing and new profiles are Normal. If a profile is changed to Guest through the profile management screen, it will always show at the top of the list. A profile set to Test will always be at the bottom of the list. Profiles can be moved around in the list. ScreenMapControllers: Forced sanity checking. Start, MenuLeft, MenuRight, and Operator keys must be mapped. Reset key mappings option added to debug menu for recovering from an unusuble keymap without needing to find and delete KeyMaps.ini. (really hope this fixes the problem new OS X users occasionally have where no keys are mapped at all, not even the defaults. The problem doesn't occur for dbk2, so it's hard to track down.) ScreenSelectStyle: The Select Style screen changed a bit internally to simplify adding new choices and make sure all game modes had the correct style choices available. This is only visible in default theme because the _fallback theme still uses the old system for backwards compatibility. Themer visible changes: Functions are not listed here for new actor classes, it is assumed that you will look at Lua.xml to see what is in them. Metrics are marked with [M]. Functions are marked with [F]. Attributes (things you set inside the lua file when creating the actor with Def.whatever) are marked with [A]. Bug fixes are marked with [B]. If a function is explained sufficiently by its entry in Docs/Luadoc/Lua.xml, it won't have a detailed entry. Function Chaining: All lua functions that didn't return something before now return the object they were called on. Example: self:zoom(.5):xy(_screen.cx, _screen.h-60):diffuse(color("#dc322f")) (yes I saw function chaining used in a certain gimmick noteskin) Function Naming: CubicSplineN, NoteColumnRenderer, NoteField, and NCSplineHandler list their functions with underscore style names. Camelcase style aliases exist for all their functions, use whichever naming style you prefer. Actor Classes: NoteColumnRenderer NoteField NCSplineHandler CubicSplineN (not actually an actor, but there aren't any other new non-actors to put it with) Actor: [F] Add/RemoveWrapperState [F] bezier [F] effectclock("timer") no longer crashes [F] Get/SetFakeParent [F] GetNumWrapperStates [F] GetWrapperState ActorFrame: [F] GetUpdateRate ActorMultiVertex: [F] Add/RemoveState [F] Add/RemoveQuadState [F] ForceStateUpdate [F] Get/SetDecodeMovie [F] GetNumStates [F] GetNumQuadStates [F] GetSpline [F] Get/SetQuadState [F] Get/SetState [F] Get/SetStateData [F] Get/SetUseAnimationState [F] SetAllStateDelays [F] SetSecondsIntoAnimation [F] SetStateProperties [F] SetVertsFromSplines Announcer: [S] "evaluation full combo W3" [S] "evaluation full combo W4" BitmapText: strokecolor is in the tween state now, so it can be tweened. Game: [F] GetSeparateStyles GameState: [F] ApplyPreferredSongOptionsToOtherLevels [F] CanSafelyEnterGameplay [F] Get/SetCurrentStyle changed Global: [F] approach [F] lerp [F] lerp_color [F] multiapproach MusicWheel: [M] OnlyShowActiveSection Noteskins: [V] Controller [M] NoteColorCount [M] NoteColorType [V] Player Player: [M] ComboBreakOnImmediateHoldLetGo PlayerOptions: [F] MinTNSToHideNotes PlayerState: [F] ApplyPreferredOptionsToOtherLevels Profile: [F] GetPriority [F] GetTotalDancePoints [F] GetType RageTexture: [F] GetImageWidth/Height [F] GetTextureWidth/Height [F] GetSourceWidth/Height RollingNumbers: Coloring and cropping during tweens works. Corner diffuse colors work now. ScreenEdit: [M] OptionsScreen [M] SetModsScreen ScreenGameplay: [M] MarginFunction ScreenOptions: [F] GetNumRows ScreenOptionsManageProfiles: Mini menu centered on screen instead of centered on the row because more options were added. ScreenPrompt: [M] AnswerOnCommand (did nothing before, actually work now) ScreenSelect: [M] ChoiceNames ScreenSelectMaster: [M] IconChoicePosFunction ScreenSelectMusic: [M] HardCommentMeter Scripts: [F] find_missing_strings_in_theme_translations Song: [F] GetBGChanges Sprite: [F] Get/SetDecodeMovie [F] SetStateProperties StageStats: [F] GetStepsSeconds Style: [F] NeedsZoomOutWith2Players always returns false now. TimingData: Pass true as the last arg if you want the data in tables instead of strings. Details: CubicSplineN: This class provides an implementation of cubic splines. It's used by ActorMultiVertex and NoteColumnRenderer to control shape and note movement, but is also available in a standalone form for the rare case where you need a spline for something else. NoteColumnRenderer: Each column in the NoteField is an actor that can be fetched and manipulated. NoteField: The NoteField was just a normal(ish) ActorFrame before. Now it has all these functions and it's starting to get uppity. What is a callback anyway? It thinks we want it to call us back later when something happens? NCSplineHandler: Each property of the note column has its own spline handler, which allows the splines to behave differently and be controlled independently. Position, rotation, and zoom are the three things that can be controlled by splines. Actor: [F] bezier The bezier tween tended to get caught in an infinite loop before, which made it very unsafe to use. Now it won't loop forever when you set a bezier tween with random values. GameState: [F] Get/SetCurrentStyle changed In kickbox game mode, players can have different styles set, pass a PlayerNumber when using SetCurrentStyle or GetCurrentStyle. This does not break old code, if you don't care about whether your theme works in kickbox mode, you can ignore this. MusicWheel: [M] OnlyShowActiveSection: Defaults to true in _fallback. A bit unfortunate, but keeps backward compatibility with the existing behavior of OnlyShowActiveSection. If neither metric is true, wheel displays all titles plus the contents of the active section (if any). If OSAS is true but HAST is false, wheel displays the active section title plus its contents, or all titles if no section is active. If both are true, wheel displays only the active section's contents, or all titles if no section is active. Noteskins: The Controller and Player variables now work for non-receptor arrows. {PartName}NoteColorType will take Denominator or Progress. Denominator is classic style, colored by NoteType. Progress simulates DDR's Rainbow noteskin. {PartName}NoteColorCount is Number of Note Color You can reduce image size by reducing this value. ScreenEdit: [M] OptionsScreen [M] SetModsScreen The screens used to set options and mods in edit mode are no longer hardcoded, you can use these metrics to control what screens are used. ScreenGameplay: [M] MarginFunction: Notefield positioning is handled a bit differently now. See comments in _fallback/metrics.ini above the [ScreenGameplay] MarginFunction metric. Basically, you can define a lua function that returns the space you want at the edges and in the center instead of setting position metrics. Do NOT use Style:GetWidth to calculate the margins your function returns. ScreenGameplay now handles zooming the notefield to fit in the space instead of using the NeedsZoomOutWith2Players flag in the style. If the notefield doesn't fit in the space between the margins, and there is only one player, the player will be centered even if the Center1Player pref is false. ScreenSelect: [M] ChoiceNames: This metric can be a lua command like this now: ChoiceNames="lua,ScreenSelectStyleChoices()" The lua command can then return a table of GameCommands which are used to create the choices. ScreenSelectMaster: [M] IconChoicePosFunction: This metric is optional, if it's set, it must be set to a function that returns a table of positions. Each position is a table of the form "{x, y, z}", where x, y, and z are numbers and any that is not a number defaults to 0. The function is passed the number of choices for the screen. IconChoiceOnCommand and IconChoiceOffCommand metrics added so each choice doesn't require its own On/OffCommand pair. These are also optional, but if they are set, they will override the individual commands if they exist. (If "IconChoiceCactusOnCommand" and "IconChoiceOnCommand" both exist, "IconChoiceOnCommand" will be used.) Example: # in metrics.ini IconChoicePosFunction=choice_positions -- In a file in Scripts/ function choice_positions(count) local ret= {} for i= 1, ret do ret[i]= {i*24, i*48} end return ret end ScreenSelectMusic: [M] HardCommentMeter: Metric for the meter that triggers the "select music comment hard" announcer. Scripts: [F] find_missing_strings_in_theme_translations This function was added as a way to aid translators. It finds strings that have no translation at all. Bug fixes: Background: Using the wrong transition name no longer crashes. Playback rate is applied to videos. Checkerboard and other effects that use the same file twice no longer play videos back at multiplied speed. BMS: A couple of the crashes that occurred on some BMS files have been fixed. Basic branching support implemented in loader. #RANDOM, #IF, #ELSE, #ELSEIF, #END should work. Endless Mode: Holding start takes you to the evaluation screen instead of the next song. Otherwise, you would not be able to reach evaluation when playing Endless Mode with Fail Off. GameManager: Lua Scripts/ folders are now reloaded when the Game mode is changed. LifeGraph: Fixed the rare bug where the life graph shows a gradual decline when it was actually full. This seemed to occur when the player had full life for a long time, then suddenly lost a chunk. The graph would show a gradual decline from the point where they reached full to the point where they lost a chunk, when in reality their life bar was full for practically all that time. The cause seems to have been getting judged for a hold and a tap on the exact same frame, and dropping the hold. It's rare and hard to reproduce on demand, but it is believed to be fixed. Odd screen width: Short: 1920x1080 would come up as 1921x1080 before. Now it's 1920x1080. Long: The DisplayWidth preference and the ScreenWidth theme metric aren't actually used, the widths are calculated from the height and the aspect ratio. The old rounding code was written with 4:3 in mind, so an extra step was added to force the width to be even after the rounding. Miscellaneous crashes: Trying to practice doubles-only groups doesn't crash (still can't play, but doesn't crash). ScreenHowToPlay doesn't crash when it can't find steps. Profile: Renaming a profile dir to a non-number no longer causes a crash the next time a profile is created. Scoring: Combo and point score changed to unsigned. A simfile with a huge tapcount no longer causes a crash. Simfiles: If a chart for an unrecognized style is in the simfile, it is preserved instead of deleted. Previously, charts for unrecognized styles would end up on dance-single, where they don't belong. Now a warning is printed to the log file and the charts are completely inaccessible in the game. This probably only occurs for people using simfiles made by 3.9+ Redux, which would autogen a chart for every difficulty for every style, and had a few styles that don't exist anymore. Sextet stream: Input and lights data can be handled through a sextet stream system instead of writing drivers directly in StepMania's code. See https://github.com/stepmania/stepmania/pull/343 for details. Preemptive problem solving: "Tried to switch to a background that was never loaded: " This occurs with some simfiles that have a malformed BGCHANGES line. Either the file doesn't exist in Stepmania/BGAnimations, or the person who created the simfile put the wrong thing in the BGCHANGES line. There are three possible solutions: 1. Create a folder named BGAnimations inside your SM5 user data folder (%APPDATA%/StepMania 5.0/ on Windows, ~/.stepmania-5.0/ on Linux, ~/Library/Application Support/StepMania 5/ on OS X) 1a. Create a folder with the name given in the error message inside that BGAnimations folder (the name is the part in quotes after File1). 1b. Create default.lua inside that folder with this inside it: return Def.Actor{} 2. Delete the BGCHANGES line from the simfile. You will also need to delete the cache entry for the simfile (Cache/Songs inside the user data folder has all the cache entries). 3. Edit the simfile to correct the mistake in the BGCHANGES line. In the example, "1.000" is a nonsensical bg name, so the fields in the line are probably out of order. Docs/Userdocs/bgchanges_format.txt explains the format of the BGCHANGES line. Some files in the Rebirth pack have the color value in the wrong place. CyberiaStyle8: Their function for figuring out what stepmania version is being used assumes that the version string can be split up by spaces, so now it emits an error. If you notice that your BackgroundFitMode preference that you set in the default theme is ignored in CyberiaStyle, it's because they implement their own bg fitting system that replaces the engine's.