diff --git a/.hgignore b/.hgignore
index 61c47b6743..2b9724952e 100644
--- a/.hgignore
+++ b/.hgignore
@@ -32,9 +32,11 @@ src/libtomcrypt/build-*
src/libtomcrypt/Release-*
src/libtommath/build-*
src/libtommath/Release-*
+src/*.old
ver.cpp
lib*_link.a
Data/UserPrefs
+Data/GamePrefs/*.cfg
PBProject/Hardware.plist
Themes/pump
Themes/optical-release
@@ -42,6 +44,8 @@ src/version.bin
src/verstub.cpp
nsis_strings_temp.inc
Data/SpeedMods.txt
+Program/StepMania*.lib
+crashinfo.txt
syntax: regexp
.*\#.*\#$
diff --git a/Announcers/instructions.txt b/Announcers/instructions.txt
index eb1029fc97..272930e3b0 100644
--- a/Announcers/instructions.txt
+++ b/Announcers/instructions.txt
@@ -1 +1,50 @@
-Place announcer folders in this directory.
\ No newline at end of file
+Place announcer folders in this directory.
+
+[Announcer format]
+sm-ssc's announcers look for certain names. These can either be a single sound,
+or a folder containing many sounds (of which one is picked at random).
+
+[Announcer calls]
+Grouped by Screen/Element that calls them, though only the sound/folder name for
+each item is important.
+
+ScreenWithMenuElements
+* (ScreenName) intro
+
+ScreenTitleMenu
+* title menu game name
+
+ScreenSelect
+* (ScreenName) IdleComment
+
+ScreenSelectMusic
+* select music intro
+* select music comment general
+* select music comment hard
+* select music comment new
+* select music comment repeat
+* select course comment general
+
+ScreenGameplay
+* gameplay intro
+* gameplay ready
+* gameplay here we go normal
+* gameplay here we go final
+* gameplay here we go extra
+* gameplay comment hot
+* gameplay comment danger
+* gameplay comment good
+* gameplay comment oni
+* gameplay (100-1000) combo
+* gameplay combo stopped
+* gameplay combo overflow
+* gameplay battle trick level(1-3)
+* gameplay battle damage level(1-3)
+* gameplay extra
+* gameplay cleared
+* gameplay failed
+* gameplay oni failed
+* gameplay oni failed halfway
+
+MenuTimer
+* hurry up
\ No newline at end of file
diff --git a/Docs/Changelog_SSCformat.txt b/Docs/Changelog_SSCformat.txt
new file mode 100644
index 0000000000..ae2eb57362
--- /dev/null
+++ b/Docs/Changelog_SSCformat.txt
@@ -0,0 +1,17 @@
+.ssc Format Changelog
+________________________________________________________________________________
+In case anyone else wishes to implement the .ssc format in their own simulator,
+a changelog is provided here between each version.
+
+Notice: .ssc is not a finalized format at the moment. There are plans for a
+change to JSON, but it is unsure if this will be done.
+
+Implement .ssc at your own risk.
+________________________________________________________________________________
+
+[v0.51] - AJ
+* Move VERSION tag to the first line.
+* Limit VERSION tag to two decimal places.
+
+[v0.5] - Wolfman2000
+* Initial MSD-based version.
\ No newline at end of file
diff --git a/Docs/Changelog_sm-ssc.txt b/Docs/Changelog_sm-ssc.txt
index 4c66657a84..12e18fbbe5 100644
--- a/Docs/Changelog_sm-ssc.txt
+++ b/Docs/Changelog_sm-ssc.txt
@@ -1,7 +1,7 @@
sm-ssc Changelog
________________________________________________________________________________
The sm-ssc changelog mostly deals with source code-related changes,
-as theme changes happen at a rapid pace.
+as theme changes happen at a faster pace.
Changes are grouped by date.
Not all changes are documented, for various reasons.
@@ -10,9 +10,232 @@ supported but exist anyways.)
_____________________________________________________________________________
================================================================================
-sm-ssc v1.2 | 201012xx
+sm-ssc v1.2.2 | 201102??
--------------------------------------------------------------------------------
+20110213
+--------
+* Life Difficulty 4 is now as difficult as Life 6 was. [AJ]
+ Change name of the life difficulty options:
+ Old: 1, 2, 3, 4, 5, 6, 7
+ New: 1.2, 1.0, 0.8, 0.6, 0.4, 0.33, 0.25
+
+20110212
+--------
+* [PlayerOptions] Added metrics to allow changing how often random modifiers
+ activate in the proper setting. At this time, the mods to be activated have
+ NOT been changed. [Wolfman2000]
+* [ArrowEffects] Allow the Boomerang, Expand, Tipsy, Drunk, Tornado, Beat, and
+ Mini modifiers to be customized by metrics. As usual, change at your own
+ risk here. [Wolfman2000]
+* Started the process of doxygen'ing the code. Goodness knows we need more
+ documentation on here. For the most part, don't expect comments on
+ particular files, though this may change. [Wolfman2000]
+* [TimingData] Fix getting a Stop or Delay at a row if one of each occupies
+ the same row. This may need some extra testing. [Wolfman2000]
+
+20110211
+--------
+* Introduced the .ssc file format for future features and expansion. All .sm
+ files will still work, and will still be generated when saved in the editor.
+ At this point, saving to the DWI format is being deprecated. [Wolfman2000]
+
+================================================================================
+sm-ssc v1.2.1 | 20110210
+--------------------------------------------------------------------------------
+
+20110210
+--------
+* Had to go back on the ScreenNetSelectMusic controls commit. My apologies. [AJ]
+
+20110209
+--------
+* [ScreenOptionsMemoryCard] Added three strings: "(no label)", "size ???", and
+ "%dMB". [AJ]
+* [ScreenSelectMusic] Added RouletteTimerSeconds metric. [AJ]
+* [ArrowEffects] Added QuantizeArrowYPosition metric. [AJ]
+
+20110208
+--------
+* [ScreenNetSelectMusic] Added MusicWheelType metric. [AJ]
+
+20110201
+--------
+* [Song] Added IsDisplayBpmRandom Lua binding. [AJ]
+
+20110130
+--------
+* [ScreenSelectMaster] Only run cursor commands on players if they exist. [AJ]
+
+20110118
+--------
+* [ScreenEdit] Move editing Timing Data to their own mini menu. [Wolfman2000]
+* Implement #TICKCOUNTS tag for better checkpoint behavior.
+ This officially deprecates the CheckpointsUseTimeSignatures metric for
+ the CheckpointsUseTickcounts metric. [Wolfman2000]
+* [NoteField] Add metrics for more flexible TimingData labels. [Wolfman2000]
+
+20110116
+--------
+* [ScreenEdit] Allow editing TimeSignatureSegments one fractional half at
+ a time. [Wolfman2000]
+
+20110115
+--------
+* [ArrowEffects] Allow modifying modifier characteristics in the metrics.
+ At present, Blink, Boost, Brake, and Wave can have modifications.
+ [Wolfman2000]
+* [Player] Allow Combo Stopped message to be flexible via metrics. The
+ default is 50, as it was before. [Wolfman2000]
+* [Player] Allow the default attack times for both random and mine attacks
+ to be changed. [Wolfman2000]
+* [NoteField] Allow for adjustable fade fail time (for AJ). [Wolfman2000]
+* [MenuTimer] Allow the hurry up transition to be adjusted. [Wolfman2000]
+* [MusicWheel] Added RouletteColor, RandomColor, and PortalColor metrics. [freem]
+* Fix a bug with VisualDelaySeconds where choosing -1 would lead to it being +1. [freem]
+
+20110112
+--------
+* [PlayerStageStats] Change score to an unsigned long from a signed int. [FSX]
+* Noteskin changes. [Daisuke Master]
+* [SpecialScoring] MIGS scoring, improved SN and SN2 scoring. [FSX]
+* [RageFile] Added ReadBytes() Lua binding. [FSX]
+* [NetworkSyncManager] Added CloseConnection() Lua binding. [freem]
+* [ScreenTextEntry] Added Load(TextEntrySettings) Lua binding. [freem]
+ TextEntrySettings is implemented similar to the Attributes in BitmapText.
+local teSettings = {
+ SendOnPop = "", -- ScreenMessage to send on pop (optional, "SM_None" if omitted)
+ Question = "", -- The question to display
+ InitialAnswer = "", -- Initial answer text
+ MaxInputLength = 0, -- Maximum amount of characters
+ Password = false, -- Mask character input (optional)
+ Validate = nil, -- Validation function; function(answer, errorOut), must return boolean, string.
+ OnOK = nil, -- On OK; function(answer)
+ OnCancel = nil, -- On Cancel; function()
+ ValidateAppend = nil, -- Validate appending a character; function(answer,append), must return boolean
+ FormatAnswerForDisplay = nil, -- Format answer for display; function(answer), must return string
+};
+
+20110111
+--------
+* [ScreenManager] Added ReloadOverlayScreens() Lua binding. [freem]
+
+20110110
+--------
+* [Character] Added GetDisplayName Lua binding. [freem]
+* Make sure that DELAYS come first if STOPS share the same beat. [Wolfman2000]
+
+20110109
+--------
+* Add the semicolon and apostrophe keys as alternatives to the Page Up and Page
+ Down keys in the editor, mainly for laptop users. [Wolfman2000]
+* Removed Song sample length limitations. [freem]
+* Removed hard-coded values from the Step Editor. Now TimeSignatures are used
+ in place of these former constants. [Wolfman2000]
+* [RoomWheel] Various metrics changes: [freem]
+ * Removed TextWidth/DescWidth metrics.
+ * "Desc" is now "Description". (DescX -> DescriptionX)
+ * Removed hardcoded commands (shadowlength,0;maxwidth,[max width metric];halign,0).
+
+================================================================================
+sm-ssc v1.2 | 20110107
+--------------------------------------------------------------------------------
+
+20110107
+--------
+* Fix PrefsManager init list not being in order [vyhd]
+* Add hack to ThemeManager to make GetThemeName() work intuitively for Scripts dirs [vyhd]
+* [SongManager] Check the root Songs/ folder for extra stage course files. [freem]
+* Make routine mode use ScreenGameplayShared instead of ScreenGameplay. [freem]
+* Make pump-routine spacing the same as pump-double spacing. [FSX]
+
+20110106
+--------
+* [SpecialScoring] Fix some minor issues [FSX]
+* New pump routine noteskins [cesarmades]
+
+20110102
+--------
+* Fix routine mode saving in the editor. [Wolfman2000]
+
+20110101
+--------
+* [Screen] Added HandleBackButton metric; useful for custom menus that need to
+ use the Back button for more user-friendly canceling. [freem]
+
+20101230
+--------
+* [StepsDisplay] Make the StepsType react to SetMessage as well. [freem]
+
+20101229
+--------
+* [ScreenHowToPlay] Replaced LOAD_ALL_COMMANDS_AND_SET_XY_AND_ON_COMMAND macro
+ calls with ActorUtil::LoadAllCommandsAndSetXY(). Fixes an odd bug I ran into
+ during the porting of DDR 5th Mix. [freem]
+* [ScreenInstallOverlay] Added bare DownloadFinished message. [freem]
+
+20101228
+--------
+* [ScreenHowToPlay] Have Character ignore the Miss steps instead of trying to
+ hit them. [freem]
+
+20101227
+--------
+* [ScreenHowToPlay] Added CharacterName metric, which will force the Character
+ that shows up. [freem]
+
+20101226
+--------
+* [ScreenEdit] Added GetEditState Lua binding. [freem]
+* [ScreenNetSelectMusic] StepsDisplay changed to load from StepsDisplayNet. [freem]
+* [RoomWheelItem] Added OverPart (just like in MusicWheelItem). [freem]
+* [SongManager] Added GetSongRank(Song) Lua binding. [freem]
+* Changed Steps picking logic in ScreenGameplaySyncMachine; now playable Steps
+ are chosen, instead of whatever NoteData happens to be first.
+ Also added pump-single data to ScreenGameplaySyncMachine music.sm. [freem]
+* [Banner, FadingBanner] Various changes: [freem]
+ * Removed (now unused) All Music banner.
+ * Fixed swapped ScrollRandom and ScrollRoulette metrics.
+* [Banner] Added GetScrolling(), GetPercentScrolling() and
+ SetScrolling(bool,float) Lua bindings.
+* [FadingBanner] Added GetLatestIndex() Lua binding. [freem]
+
+20101225
+--------
+* Fixed Life difficulty scale being 0. [Daisuke Master]
+
+20101223
+--------
+* Added Banners for most SortOrders. (Group is excluded (song group banners
+ still work), as is Recent (which has no sections).) [freem]
+
+20101222
+--------
+* Added Shift+Ctrl+F2 shortcut for reloading overlay screens (and metrics) [freem]
+
+20101221
+--------
+* SM5SVN r28586: Only unload fonts if not used by the next screen. [shakesoda]
+* [ScreenSelectMaster] Fix DoSwitchAnyways to actually work again.
+* [ScreenInstallOverlay] Installs won't jump to SelMusic on Gameplay or System
+ Menus (e.g. Edit Mode) anymore on download completion. [freem]
+
+20101220
+--------
+* [Actor] Add bezier. (_fallback/02 Actor.lua) [FSX]
+* [MessageManager] Added MenuStartP1 and MenuStartP2 messages. [freem]
+* [ScreenSelectMaster] Broadcast MenuStartP# messages; allow themers to handle
+ the MenuStartP# messageitems. [freem]
+
+20101219
+--------
+* [WheelNotifyIcon] add BlinkPlayersBest metric. [freem]
+* [GameCommand] Add GetScreen, GetSteps, GetCourse, GetTrail, and GetCharacter
+ Lua bindings. [freem]
+* [StreamDisplay] Remove UseThreePartMethod.
+* [Style] Add ColumnsPerPlayer and NeedsZoomOutWith2Players bindings. [freem]
+* [Profile] Add GetLastUsedHighScoreName Lua binding. [freem]
+
20101218
--------
* [MusicWheelItem] Add OverPart. [freem]
@@ -1753,4 +1976,4 @@ ActorScroller changes:
--------
* Project begins.
* Remove ScreenEz2SelectPlayer, which only the Xbox project still referenced.
-_____________________________________________________________________________
\ No newline at end of file
+_____________________________________________________________________________
diff --git a/Docs/Devdocs/SMO_protocol-aj.txt b/Docs/Devdocs/SMO_protocol-aj.txt
index 4874f6db68..b84a4669ad 100644
--- a/Docs/Devdocs/SMO_protocol-aj.txt
+++ b/Docs/Devdocs/SMO_protocol-aj.txt
@@ -118,7 +118,7 @@ ________________________________________________________________________________
0x05 (005) Game Status Update
The payload changes between protocols, and it will likely have to change again
-to acconut for some more StepIDs.
+to account for some more StepIDs.
Payload:
[Size] [Description]
@@ -155,7 +155,7 @@ Payload:
32767 would be DEAD on the note
If the user is hitting late, the # will be higher.
It if the user is exactly 0.25 seconds off, the number will be
- different by 500. With this pattern 0.5 gives a difference of 1000.
+ different by 500. With this pattern 0.5 seconds gives a difference of 1000.
Expected response: None
________________________________________________________________________________
diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml
index 4c5b58b1fd..85cd618dd9 100644
--- a/Docs/Luadoc/Lua.xml
+++ b/Docs/Luadoc/Lua.xml
@@ -10,6 +10,7 @@
+
@@ -38,11 +39,22 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -55,7 +67,9 @@
+
+
@@ -72,6 +86,7 @@
+
@@ -79,8 +94,10 @@
+
+
@@ -110,13 +127,17 @@
+
+
+
+
@@ -131,6 +152,8 @@
+
+
@@ -149,11 +172,13 @@
+
+
@@ -163,6 +188,7 @@
+
@@ -170,6 +196,7 @@
+
@@ -180,6 +207,7 @@
+
@@ -286,6 +314,7 @@
+
@@ -493,6 +522,8 @@
+
+
@@ -500,8 +531,10 @@
+
+
@@ -529,6 +562,7 @@
+
@@ -600,6 +634,7 @@
+
@@ -608,18 +643,20 @@
-
-
-
+
+
+
+
+
@@ -638,6 +675,7 @@
+
@@ -710,6 +748,7 @@
+
@@ -776,10 +815,8 @@
-
-
@@ -792,9 +829,6 @@
-
-
-
@@ -869,6 +903,7 @@
+
@@ -896,6 +931,7 @@
+
@@ -923,6 +959,7 @@
+
@@ -939,8 +976,6 @@
-
-
@@ -959,6 +994,7 @@
+
@@ -990,11 +1026,15 @@
+
+
+
+
@@ -1013,6 +1053,7 @@
+
@@ -1060,6 +1101,9 @@
+
+
+
@@ -1102,6 +1146,7 @@
+
@@ -1132,6 +1177,7 @@
+
@@ -1150,6 +1196,7 @@
+
@@ -1190,6 +1237,7 @@
+
@@ -1210,9 +1258,11 @@
+
+
@@ -1251,14 +1301,12 @@
-
-
+
-
@@ -1426,6 +1474,12 @@
+
+
+
+
+
+
@@ -1806,10 +1860,11 @@
-
-
-
-
+
+
+
+
+
@@ -1878,16 +1933,16 @@
-
+
-
+
-
+
-
+
@@ -1896,9 +1951,9 @@
-
+
- sm-ssc v1.0
- 2010-09-10
+ sm-ssc v1.2.1
+ 2011-02-10
diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml
index 4bc3a19a5f..173a5495d0 100644
--- a/Docs/Luadoc/LuaDocumentation.xml
+++ b/Docs/Luadoc/LuaDocumentation.xml
@@ -20,7 +20,6 @@
-> CoinMode
-->
-
@@ -48,6 +47,9 @@
CLAMP is an all-female Japanese mangaka group that formed in the mid 1980s. Erm, I mean... Clamps fValue between fLow and fHigh.
+
+ Closes any connection to an online server.
+
A generic interface to Lua's garbage collector. Performs different functions based on the value of opt.
@@ -510,12 +512,18 @@
Sets the Actor's base Z rotation to rot.
+
+ Sets the Actor's base zoom to zoom.
+
Sets the Actor's base X zoom to zoom.
Sets the Actor's base Y zoom to zoom.
+
+ Sets the Actor's base Z zoom to zoom.
+
Sets the Actor to use the specified blend mode.
@@ -657,7 +665,7 @@
Returns the Actor's current effect delta.
-
+
Returns the Actor's current effect magnitude as three floats (not one; I hate Lua.xsd).
@@ -711,6 +719,9 @@
Set the fractional horizontal alignment of the Actor according to fAlign which should be a float in the range 0..1. An alignment of 0 is left aligned while an alignment of 1 is right aligned. See for the common case.
+
+ Hides the Actor for the specified amount of time.
+
[Deprecated] Compatibility alias for the hidden command, which was removed in sm-ssc. Use instead.
@@ -732,6 +743,12 @@
Sets the Actor's name to sName.
+
+ Stops the Actor's movement. (Usually used for Sprites or Models.)
+
+
+ Starts the Actor's movement. (Usually used for Sprites or Models.)
+
Plays a command named sCommandName.
@@ -862,6 +879,9 @@
Zooms the Actor to zoom scale on the Z axis.
+
+ [02 Actor.lua]
+
[03 ProductivityHelpers.lua] Centers an Actor on the X axis. (equivalent to x,SCREEN_CENTER_X)
@@ -1101,6 +1121,12 @@
+
+ Returns true if the Banner is currently scrolling.
+
+
+
+
Loads the background from an UnlockEntry.
@@ -1122,6 +1148,9 @@
Loads a Banner from a specified Song Group.
+
+ Loads a Banner from a specified SortOrder.
+
Loads an icon from the specified Character.
@@ -1131,6 +1160,9 @@
See .
+
+
+
@@ -1223,6 +1255,9 @@
Returns the path of the dancing animation of this character.
+
+ Returns the character's display name.
+
Returns the path to the character's icon.
@@ -1413,6 +1448,12 @@
+
+ Returns any Character associated with this item (or nil if there isn't one).
+
+
+ Returns any Course that may have been set.
+
Returns the index of this item.
@@ -1425,18 +1466,27 @@
Returns any Profile ID that may have been set.
+
+ Returns any screen that may have been set as a string.
+
Returns any Song that may have been set.
Returns the name of any song group that may have been set.
+
+ Returns any Steps that may have been set.
+
Returns any Style that may have been set.
Returns the display text.
+
+ Returns any Trail that may have been set.
+
Returns any Url that may have been set.
@@ -1479,6 +1529,9 @@
Returns the environment table. See .
+
+ Returns the current for the specified .
+
Returns the current .
@@ -1710,6 +1763,9 @@
Saves the bookkeeping and machine profile data.
+
+ Sets the current for the specified .
+
Sets the current Course to course.
@@ -1860,6 +1916,9 @@
Returns the number of lives remaining.
+
+
+
@@ -2109,6 +2168,9 @@
Returns true if the player was disqualified from ranking.
+
+ Sets the Player's score to iScore.
+
@@ -2250,6 +2312,9 @@
Returns true if the specified code sUnlockEntryID is unlocked.
+
+ Sets the current for the Profile.
+
Sets the goal to iCals calories.
@@ -2353,6 +2418,9 @@
Returns a string containing the entire contents of the file.
+
+ Returns length bytes from the RageFile's current position.
+
Seeks to a position in the file and returns the new position.
@@ -2414,6 +2482,9 @@
+
+ Loads the metrics for this RollingNumbers from sGroupName.
+
Sets the target number to f.
@@ -2432,6 +2503,11 @@
Posts a message with the text sScreenMsg to the Screen.
+
+
+ Returns the current .
+
+
Returns the current StageStats.
@@ -2475,6 +2551,9 @@
Gets the screen at the top of the screen stack.
+
+ Reloads any loaded overlay screens.
+
Returns true if screen class s exists.
@@ -2581,6 +2660,14 @@
Sets the profile index of Player pn to iProfileIndex.
+
+
+ See the Changelog for details on TextEntrySetting's format.
+
+
+ Sets up a ScreenTextEntry's values.
+
+
Tells the screen to go to the previous screen.
@@ -2698,6 +2785,9 @@
Returns true if the song's DisplayBPM is constant.
+
+ Returns true if the song's DisplayBPM is random.
+
Returns true if the song's DisplayBPM is secret.
@@ -2737,7 +2827,7 @@
Returns an array of all the installed songs.
- Returns the course color of course c.
+ Returns the course color of Course c.
Returns the extra stage info (Song, Steps) for the specified Style s. (If bExtra2 is true, it will use the second Extra Stage data instead of the first. Again, Lua.xsd sucks)
@@ -2773,7 +2863,7 @@
Returns a random song.
- Returns the song color of song s.
+ Returns the song color of Song s.
Returns a Song given a set of Steps st.
@@ -2785,6 +2875,9 @@
Returns a table containing all of the song group names.
+
+ Returns the rank (popularity) of Song s.
+
Returns a table containing all of the songs in group sGroupName.
@@ -2872,6 +2965,9 @@
[01 alias.lua] Alias for CropTo.
+
+ Sets all the state delays to fRate. Useful for Sprites that need to change by BPM (e.g. Tran from DDR 5th Mix, the cube from DS EuroMix 2).
+
@@ -2937,6 +3033,9 @@
Returns the Steps description.
+
+ Returns the author that made that particular Steps pattern.
+
Returns the Steps difficulty.
@@ -2983,6 +3082,9 @@
+
+ Returns the number of total tracks this Style contains (e.g. 4 for dance-versus, but 8 for dance-double).
+
Returns the name of the Style.
@@ -2992,6 +3094,9 @@
Returns the StyleType for this Style.
+
+ Returns true if the Style needs to be zoomed out with two players.
+
@@ -3093,7 +3198,7 @@
Returns the Trail's difficulty.
-
+
Returns a table of TrailEntry items.
@@ -3120,7 +3225,7 @@
Returns the Steps used in this TrailEntry.
- (why'd I think this was a good idea when we have CourseEntry:IsSecret?)
+ (why'd I think this was a good idea when we have ?)
diff --git a/Docs/SMLanProtocol.txt b/Docs/SMLanProtocol.txt
deleted file mode 100644
index 6a206cbade..0000000000
--- a/Docs/SMLanProtocol.txt
+++ /dev/null
@@ -1,455 +0,0 @@
-
-PRELIMINARY - - - - - - - - 05/03/2004
-Protocol version 4
- But 0x04 will be its version for inter-protocol purposes.
-
-This protocol is only intended to replace current protocol. Because current protocol
-not expanable
-
-SMLAN PROTCOL TCP/8765
-
-Protcol is entirelly packaged in EzSockets Data Packets (use send and receive packet)
-
-This will prevent any out-of-sync errors with future or past versions.
-
-The protocol is impervious to fragmented, or bonded TCP packets.
-
-Basic Representation:
-
-Octet 0123 4 5
- +----+-+---//--+
- |ssss|C|Payload|
- +----+-+---//--+
-
-ssss - size of packet, handled by ezsockets (if you're using C++)
-C - Command.
-Payload - variable size based on command
-
-The payload may contain more data than expected, i.e. new protocol version.
-
-
-In the following protocol, the term size means the size of the chunk of data.
-If the "size" is "NT" then that means it's a null-terminating string.
- "MSN" most significant 4 bits (byte/16)
- "LSN" least significant 4 bits (byte%16)
-
-
-Note: Primary player is 0x0, secondary player is 0x1
-
-CLIENT to SERVER protocol:
-
-000: No Operation
- Desc: This command will cause server to respond with a no op response.
- Payload: None
- Response: Server 001
-
-001: No Operation Response
- Desc: This command is used to respond to a no operation.
- Payload: None
- Response: None
-
-002: Hello
- Desc: This is the first packet from a client to server, stating below
- information (NOTE: Names are no longer sent in this packet)
- Payload:
- Size Description:
- 1 Client protocol version
- NT Name of build of StepMania
- Response: Server 002
-
-
-
-003: Game Start Request
- Desc: This command is called once after most loading is done, and
- again immediately before the sound starts.
- Payload:
- Size Description
- MSN Primary player difficulty (feet) (0 for no player)
- LSN Secondary player difficulty (feet) (0 for no player)
- MSN Primary player difficulty (0=Beginner, 1=easy, etc.)
- LSN Second player difficulty (0=Beginner, 1=easy, etc.)
- MSN Start Position (0 is pre-sync, 1 is for sync)
- LSN Reserved
- NT Song Title
- NT Song Subtitle
- NT Song Artist
- NT Course Title (If none exists; make it just a null)
- NT Song Options (in string-format)
- NT Primary Player's options (Null if non-existant)
- NT Secondary Player's Options (Null if non-existant)
-
- Response: Server 003
-
-
-004: Game Over Notice
- Desc: This command is sent when end of game is encounterd
- Payload: None.
- Response: None.
-
-005: Game Status update
- Desc: Updates game info for each step
- Payload:
- Size Description
- MSN Player #
-Protocol <= 2
- LSN StepID
- 1: Miss
- 2: W5
- 3: W4
- 4: W3
- 5: W2
- 6: W1
- 7: LetGo
- 8: Held
-Protocol >= 3
- LSN StepID
- 1: HitMine
- 2: AvoidMine
- 3: Miss
- 4: W5
- 5: W4
- 6: W3
- 7: W2
- 8: W1
- 9: LetGo
- 10: Held
-
- MSN Projected Grade (StepMania enum int)
- LSN Reserved
- 4 Net-order long containing score.
- 2 Net-order int containing combo.
- 2 Net-order int containing health.
- 2 Net-order # containing offset
- 32767 would be DEAD on the note
- If the user is hitting late, the # will be higher
- It if the user is exactly 0.25 seconds off, the
- number will be different by 500, if 0.5, it will be
- different by 1000.
- Response: None.
-
-006: Style Update (PLEASE NOTE THIS HAS NOTHING TO DO WITH SERVER COMMAND 6)
- Desc: This is sent when a style is chosen.
- Size:
- 1 # of enabled players (1 means 1, 2 means 2)
- 1 Player # (0 means 1st, 1 means 2nd)
- NT Player Name for #
- (Additional player's and #'s) (enabled players ONLY)
-
- Response: None
-
-007: Chat message
- Desc: The user typed a message for general chat.
- Size:
- NT Message
-
-008: Request Start Game and Tell server existance/non existance of song.
- Desc: The user selected a song on a Net-enabled selection
- Size:
- 1 Usage of message
- 0: (in response to server 8) User has specified song
- 1: (in response to server 8) User does NOT have specified song
- 2: User requested a start game on given song
- NT Song Title (As gotten by GetTranslitMainTitle)
- NT Song Artist (As Gotten by GetTranslitArtist)
- NT Song Subtitle (As gotten by GetTranslitSubTitle)
-
-009: //Reserved
-
-010: User entered/exited Network Music Selection Screen
- Size:
- 1
- 0: exited ScreenNetSelectMusic
- 1: entered ScreenNetSelectMusic
- 2: **Not Sent**
- 3: entered options screen
- 4: exited the evaluation screen
- 5: entered evaluation screen
- 6: exited ScreenNetRoom
- 7: entered ScreenNetRoom
-
-011: User has changed player options
- Size:
- NT Player 0's options
- NT Player 1's options
-
-
-012: SMOnline Packet. //SPECIAL CASE!!!
- NOTE: The smonline packet is not defined here.
- The SMLan packet 12 is a wrapper for the SMOnline packet.
- This is so that we can have "protection" of sorts when
- it comes to the coding of SMOnline, so we don't have to
- use the lower level commands when dealing with SMOnline.
- Size:
- 1 SMOnline command //This used to say 2, but it looks like 1 in all cases
- SMOnline data
-
-
-013: Reserved
-
-SERVER to CLIENT protocol: (begins at 128)
-
-NOTE: Server responses always add 128, thus a server response for no operation
- is 128, not 000
-
-000(128):No Operation
- Desc: This command will cause server to respond with a no op response.
- Payload: None
- Response: Server 001
-
-001(129):No Operation Response
- Desc: This command is used to respond to a no operation.
- Payload: None
- Response: None
-
-002(130):Server Hello Response
- Desc: This introduces the server.
- Payload:
- Size Description
- 1 Server protocol version //NOTE: if protocol version is 128+, then this
- server is an SMOnline server
- NT Server Name
- 4 Random key ( at the moment only used for an alternate login method )
-
-003(131):Allow Start
- Desc: This will cause the client to start the game.
- Payload: None
- Response: None
-
-004(132):Game over stats
- Desc: this packet is send in response to the game over packet
- it contains information regarding how well each player did.
- Payload:
- 1 # of players sent in this packet (active players)
- The way this works is to send every player's info for a given
- field. Like every player's score will be sent first, then every
- player's grade.
- 1 First player's player ID
-
- 4 Score
-
- 1 Grade
-
- 1 Difficulty (0=beginner, 1=light, etc.)
-
-
- #this next chunk of step types is actually reversed
- 2 miss
-
- 2 boo
-
- 2 good (All players)
- 2 great (All players)
- 2 perfect (All players)
- 2 marvelous (All players)
-
- 2 ok (All players)
- 2 max_combo (All players)
- NT Player's options
-
-
-
-005:(133)Scoreboard update
- Desc: This will update the client's scoreboard.
- Payload:
- Size
- 1 Which section
- 0: Names
- 1: Combos
- 2: Projected Grades
- 1 # of players to display
-
- If Names, then:
- 1 Player in first place's index
- 1 Player in second place's index
- ...
- 1 Last player's index
- If Combos, then:
- 2 First player's combo
- 2 Second Player's combo
- ...
- 2 Last player's combo
- If Project grades
- 1 Player 1's grade (in the same format used when reporting projected grades)
- 1 Player 2's grade
- ...
- 1 Last player's projected grade
-
-
-006:(134)System Message (PLEASE NOTE THIS HAS NOTHING TO DO WITH CLIENT COMMAND 6)
- Desc: Send system message to user
- Payload:
- Size Description
- NT Message
-
-007:(135)Chat Message
- Desc: Add a chat message to the chat window on some StepMania screens.
- Payload:
- Size Description
- NT Message
-
-008:(136)Tell client to start song/ask if client has song
- Desc: The user selected a song on a Net-enabled selection
- Size:
- 1 Usage of message
- 0: See if client has song
- 1: See if client has song, if so, scroll to song
- 2: See if client has song, if so, scroll to song, and play that song
- 3: Blindly start song
- NT Song Title (As gotten by GetTranslitMainTitle)
- NT Song Artist (As Gotten by GetTranslitArtist)
- NT Song Subtitle (As gotten by GetTranslitSubTitle)
-
-009:(137)Update user list
- Desc: This sends all the users currently connected
- Size:
- 1 Max # of players
- 1 # of players in this packet
- 1 Player 0's status
- NT Player 0's name (if there is no player here... make it a null (""))
- 1 Player 1's status
- NT Player 1's name
- ...
- 1 Last player's status
- NT Last player's name
- Status:
- 0 Inative (no info on this user yet)
- 1 Active (you know who it is)
- 2 In Selection Screen
- 3 In Options
- 4 In Evaluation
-
-010:(138)Force change to Networking select music screen.
- Size:
- NT Set Specified gametype
- NT Set Specified style
-
-011:(139)Reserved
-
-
-012:(140)SMOnline Packet. //SPECIAL CASE!!!
- NOTE: The smonline packet is not defined here.
- The SMLan packet 12 is a wrapper for the SMOnline packet.
- This is so that we can have "protection" of sorts when
- it comes to the coding of SMOnline, so we don't have to
- use the lower level commands when dealing with SMOnline.
- Size:
- 1 SMOnline command
- SMOnline data
-
-
-013:(141)Formatted information packet
- Desc: Send formatted information regarding the server back to the player.
- NOTE: The purpose of this function is alternatively to be a broadcast
- packet. (You can expect it via UDP broadcast)
- Size:
- NT Server Name
- 2 Port the server is listening on
- 2 Number of players connected
-
-014:(142)Attack Client
- Size:
- 1 Player Number
- 4 Time to Last (in MS)
- NT Text describing modifiers.
-
-----------------------------------------------------------------
-Client SMOnline packets:
-000: Send Login Information
- Size:
- 1 Player Number
- 1 Encryption text
- 0: MD5 hash
- 1: MD5 ( MD5 hash + salt ) (salt is plain text, base 10 string )
- NT Username
- NT Password
-
- Note: The client is not permitted to use method (1) for authentication
- if the salt it received from the server is 0
-
-001: User asks to enter room
- Size:
- 1 Enter/Exit?
- 0: User wishes to exit room
- 1: User wishes to enter room
- NT Room Name (Used when entering rooms)
- NT Password (Empty if password not used)
-
-002: Create a new Room
- Size:
- 1 Room Type
- 0: Normal room (has sub rooms)
- 1: Game room (no sub rooms)
- NT Room Title
- NT Room Description
- NT Room Password (blank if no password)
-
-003: Requests Room Info
- Size:
- NT Room Name
-
-
-Server SMOnline packets:
-000: Login Response
- 1 Approval Status
- 0: Approved
- 1: Approval Failed
- NT Login response (plain text)
-
-001: Room Update (Changing rooms)
- Size:
- 1 Type of update
- 0: Change Room Title
- 1: Update List of other rooms (or games)
-
- If Room Title Update:
- NT Room Title
- NT Room Description
- 1 Type of room:
- 0: Chat room
- 1: Game room
- 1 Allows creation of sub room.
- 0: Does not allow creation of subrooms
- 1: Allows creation of subrooms
-
- If Room List Update:
- 1 Number of rooms
- NT Room1 Title
- NT Room1 Description
- NT Room2 Title
- NT Room2 Description
- ...
- NT RoomN Title
- NT RoomN Description
-
- Room Status appended for reverse compatibility
- 1 Room1 Status
- 0: Normal Room
- 1: Unused
- 2: Room in game
- 3: First stage of song selection has been done
- 4: Second stage of song selection has been done
- 1 Room2 Status
- ...
- 1 RoomN Status
-
- Room Flags appended for reverse compatibility
- 1 Room1 Flags
- bit 0: Passworded if true
- 1 Room2 Status
- ...
- 1 RoomN Status
-
-002: Request general information from server.
- 1 Format for stats
- 0: Normal unformatted stats
-
-003: Room Info
- Size:
- NT Last Song Title
- NT Last Song Subtitle
- NT Last Song Artist
- 1 Num Players
- 1 Max Players
- NT Player1 Name
- ...
- NT PlayerN Name
diff --git a/Docs/SimfileFormats/new format draft.txt b/Docs/SimfileFormats/new format draft.txt
new file mode 100644
index 0000000000..b19f658190
--- /dev/null
+++ b/Docs/SimfileFormats/new format draft.txt
@@ -0,0 +1,47 @@
+$INFORMATION:maintitle:subtitle:artist:genre:credit;
+$TRANSLITS:main:sub:artist;
+$GRAPHICS:banner:background:disc:cdtitle;
+$MUSIC:music-file:base-track:intro-file:lyrics;
+// should be used if a intro file is not defined
+$SAMPLEPREVIEW:start:length;
+$DISPLAYBPM:[from:to]|[one]|[show yes/no];
+$BGCHANGES:
+ beat=file:p,r,o,p,s
+;
+$FGCHANGES:;
+$KEYSOUNDS:;
+
+// cache tags here
+$CACHE:
+ firstbeat:
+ lastbeat:
+ songfilename:
+ hasmusic:
+ hasbanner
+;
+
+// note data
+#NOTEDATA#
+$META:
+ STEPSTYPE=stepstype:
+ DIFFICULTY=difficulty:
+ DESCRIPTION=description:
+ METER=meter:
+ RADARVALUES=r,a,d,a,r,v,a,l,u,e,s;
+$TIMINGDATA:
+ BPM=bpms:
+ SPEED=speed:
+ STOPS=stops:
+ DELAYS=delays:
+ TIMESIGNATURES=timesigs;
+$NOTES:
+00000
+00000
+00000
+00000
+,
+00000
+00000
+00000
+00000
+;
\ No newline at end of file
diff --git a/Docs/SimfileFormats/ssc_msd5.txt b/Docs/SimfileFormats/ssc_msd5.txt
new file mode 100644
index 0000000000..ddea11957e
--- /dev/null
+++ b/Docs/SimfileFormats/ssc_msd5.txt
@@ -0,0 +1,59 @@
+// sm-ssc step chart/msd5 hacky file format doc.
+// based off of .sm, which was based off of DWI's modified MSD format.
+#TITLE:;
+#SUBTITLE:;
+#ARTIST:;
+#TITLETRANSLIT:;
+#SUBTITLETRANSLIT:;
+#ARTISTTRANSLIT:;
+#GENRE:;
+#CREDIT:;
+#BANNER:;
+#BACKGROUND:;
+#LYRICSPATH:;
+#CDTITLE:;
+#MUSIC:;
+#INSTRUMENTTRACK:;
+#MUSICLENGTH:;
+#OFFSET:;
+#STOPS:;
+#DELAYS:;
+#BPMS:;
+#TIMESIGNATURES:;
+#LASTBEATHINT:;
+#SAMPLESTART:;
+#SAMPLELENGTH:;
+#DISPLAYBPM:[xxx][xxx:xxx]|[*];
+#SELECTABLE:;
+#BGCHANGES:;
+#FGCHANGES:;
+#KEYSOUNDS:;
+#ATTACKS:;
+
+// stored in cache
+#FIRSTBEAT:; // calculated
+#LASTBEAT:; // calculated
+#SONGFILENAME:;
+#MUSICBYTES:; // ignored by loader
+#HASMUSIC:;
+#HASBANNER:;
+
+// begin
+#NOTEDATA# // marks a new note data section
+// information from #NOTES moved here
+#STEPSTYPE:;
+#DESCRIPTION:;
+#DIFFICULTY:;
+#METER:;
+#RADARVALUES:;
+#CREDIT:;
+
+// steps-based timingdata
+#STOPS:;
+#DELAYS:;
+#BPMS:;
+#TIMESIGNATURES:;
+#LASTBEATHINT:;
+
+// actual step data
+#NOTES:;
\ No newline at end of file
diff --git a/Docs/TextEntry.txt b/Docs/TextEntry.txt
deleted file mode 100644
index c5e975d583..0000000000
--- a/Docs/TextEntry.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-Code that uses ScreenTextEntry::TextEntry()
--------------------------------------------
-RoomWheel.cpp
-ScreenEdit.cpp
-ScreenEditMenu.cpp
-ScreenNetRoom.cpp
-ScreenNetworkOptions.cpp
-ScreenOptionsCourseOverview.cpp
-ScreenOptionsManageCourses.cpp
-ScreenOptionsManageEditSteps.cpp
-ScreenOptionsManageProfiles.cpp
-ScreenOptionsReviewWorkout.cpp
-ScreenPackages.cpp
-ScreenTestFonts.cpp
\ No newline at end of file
diff --git a/Docs/Themerdocs/Noteskin elements Reference.txt b/Docs/Themerdocs/Noteskin elements Reference.txt
index c08563ba78..32fcde44f0 100644
--- a/Docs/Themerdocs/Noteskin elements Reference.txt
+++ b/Docs/Themerdocs/Noteskin elements Reference.txt
@@ -1,4 +1,4 @@
-Noteskin elements Reference:
+[Noteskin Elements Reference]
{ Taps }
button Tap Note
button Tap Mine
@@ -35,6 +35,8 @@ button Roll Body Inactive
button Roll Bottomcap Inactive
button Roll Tail Inactive
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
{ button }
--dance--
Left
@@ -51,6 +53,15 @@ Center
DownLeft
DownRight
+--kb7--
+Key1
+Key2
+Key3
+Key4
+Key5
+Key6
+Key7
+
--ez2--
FootUpLeft
FootUpRight
@@ -68,7 +79,14 @@ UpRight
Right
--ds3ddx--
-
+HandLeft
+FootDownLeft
+FootUpLeft
+HandUp
+HandDown
+FootUpRight
+FootDownRight
+HandRight
--beat--
Key1
@@ -82,11 +100,32 @@ Scratch up
Scratch down
--maniax--
-
+HandUpLeft
+HandUpRight
+HandLrLeft
+HandLrRight
--techno--
+Left
+Right
+Up
+Down
+UpLeft
+UpRight
+Center
+DownLeft
+DownRight
--popn--
+Left White
+Left Yellow
+Left Green
+Left Blue
+Red
+Right Blue
+Right Green
+Right Yellow
+Right White
--guitar-- (not enabled yet)
Fret1
@@ -95,4 +134,12 @@ Fret3
Fret4
Fret5
---lights-- (rofl)
\ No newline at end of file
+--lights-- (rofl)
+MarqueeUpLeft
+MarqueeUpRight
+MarqueeLrLeft
+MarqueeLrRight
+ButtonsLeft
+ButtonsRight
+BassLeft
+BassRight
\ No newline at end of file
diff --git a/Docs/Themerdocs/ScreenTextEntry.txt b/Docs/Themerdocs/ScreenTextEntry.txt
new file mode 100644
index 0000000000..4e3b4d2bf7
--- /dev/null
+++ b/Docs/Themerdocs/ScreenTextEntry.txt
@@ -0,0 +1,17 @@
+-- how to connect to a server with the new ScreenTextEntry Lua bindings
+-- (this is the base code; I'll come up with a full tutorial later.)
+SCREENMAN:AddNewScreenToTop("ScreenTextEntry");
+local serverSettings = {
+ Question = "Connect to server:",
+ MaxInputLength = 255,
+ OnOK = function(answer)
+ if IsNetConnected() then
+ -- close connection before connecting to new server
+ CloseConnection()
+ end
+
+ -- connect to server
+ ConnectToServer(answer)
+ end,
+};
+SCREENMAN:GetTopScreen():Load(serverSettings);
\ No newline at end of file
diff --git a/Docs/Themerdocs/ThemePrefs.txt b/Docs/Themerdocs/ThemePrefs.txt
new file mode 100644
index 0000000000..d0307503ba
--- /dev/null
+++ b/Docs/Themerdocs/ThemePrefs.txt
@@ -0,0 +1,88 @@
+ThemePrefs, v0.7
+----------------
+
+ThemePrefs is a system for handling theme-specific preferences in a standard,
+efficient, and predictable way. All you do, basically, is declare a table of
+preferences and options and use GetThemePref(name) to get your preference
+values as needed. This system will handle all disk I/O as well.
+
+Additionally, it can work in combination with ThemePrefsRows to generate
+OptionsRows for all preferences, saving you (most of) the trouble with
+integrating it into your theme. More on that later.
+
+The prefs are written, using IniFile, into Save/ThemePrefs.ini, written under
+the section corresponding to your theme name (if ThemeInfo exists, it will
+use the Name field listed there; otherwise, it will use the folder name).
+
+----------------------
+Section 1: Declaration
+----------------------
+
+To declare preferences for your theme to use, make a table with named
+tables in it; its name is used for the preference, and the tables hold
+the options for that preference. All you need to know for now is that
+Default is required; for more options, check ThemePrefsRows.
+
+After the table is declared, pass it to the function ThemePrefs.InitAll().
+(If you're planning not to use any OptionsRows at all, you can just use
+ThemePrefs.Init() to save some processing time, but seriously give the
+ThemePrefsRows system a look before you disregard it.)
+
+[code]
+local Prefs =
+{
+ BoolPref = { Default = false },
+ IntPref = { Default = 3 },
+}
+
+ThemePrefs.InitAll( Prefs )
+[/code]
+
+If your theme is "default", this will generate a ThemePrefs.ini like so:
+
+[default]
+BoolPref=false
+IntPref=3
+
+----------------
+Section 2: Usage
+----------------
+
+You can access the value with ThemePrefs.Get(name) or GetThemePref(name):
+both calls work identically. The return type will be based on whatever you set
+it to, but the subsystem will always try number, then bool, then string, in
+that order. Use true and false for bools, not 1 and 0.
+
+For example, if you wanted to branch something in the metrics based on
+the value of BoolPref (which is a boolean), you could use the following:
+
+NextScreen=GetThemePref('BoolPref') and "ScreenTrue" or "ScreenFalse"
+
+If you want to set a preference value for some reason, you can use either
+ThemePrefs.Set(name, value) or SetThemePref(name, value), but the point of
+this API is to simplify and standardize prefs handling, so you really should
+not need it. (Use ThemePrefsRows instead.)
+
+-----------------------
+Section 3: Localization
+-----------------------
+
+ThemePrefs has two strings that can be localized, to be placed under
+[ThemePrefs] in the appropriate language INI.
+
+IniFileMissing - displayed when IniFile.lua is not found, which means
+ ThemePrefs cannot be loaded from or written to disk
+
+UnknownPreference - displayed when an attempt is made to read or write
+ a preference that does not exist in the system. Uses %s for the
+ name of the unknown preference.
+
+---------------------
+Section 4: Disclaimer
+---------------------
+
+Though this is working fine so far, it is still experimental! If you run
+into problems, or have suggestions, comments, questions, etc., please talk
+to "vyhd" in #sm-ssc on irc.badnik.net, as it's his code to maintain; he
+hates subjecting other people to his code (and occasionally vice versa),
+but will gladly address concerns that come up.
diff --git a/Docs/Themerdocs/ThemePrefsRows.txt b/Docs/Themerdocs/ThemePrefsRows.txt
new file mode 100644
index 0000000000..42a9d6bf14
--- /dev/null
+++ b/Docs/Themerdocs/ThemePrefsRows.txt
@@ -0,0 +1,145 @@
+ThemePrefsRows, v0.5
+--------------------
+
+ThemePrefsRows is an optional system that works with ThemePrefs to generate
+Lua-based OptionsRows for every preference used in the system. All you do is
+declare a table of preferences and pass it to ThemePrefs.InitAll(), which will
+also initialize ThemePrefs. Note that you do need to add an entry for each
+preference in [OptionTitles] and [OptionExplanations] to give the row its name
+and describe what it does; I hope to find a (clean) way to do it from Lua.
+
+----------------------
+Section 1: Declaration
+----------------------
+
+Declaring preferences is the same basic concept as ThemePrefs; see that doc
+for the basics. So I'll go into the stuff that's important to this API.
+
+As mentioned in ThemePrefs, the table contains options. The possible options
+and their types are outlaid here. (The pref's type is defined by Default.)
+
+Default: whatever the value is set to by default. For sanity's sake, you
+ should have this in your Choices table.
+
+Choices (table): an indexed array containing all the possible OptionsRow
+ choices. If you're using a Values table, the array values should be
+ strings. If not, you can use any type that can cast to a string.
+
+Values (table): indexed array of the pref's type containing the value used when
+ the Choices entry with the same index is chosen in the row. If that
+ confused you, don't worry: it'll make more sense in the example.
+ This is optional, if your pref type can cast to strings.
+
+Params (table): optional modifications to the OptionsRow. I'll cover this in
+ more detail in a later section. You probably won't need it.
+
+To make this clearer, have an example of a valid prefs table:
+
+[code]
+local prefs =
+{
+ BoolPref =
+ {
+ Default = false,
+ Choices = { "On", "Off" },
+ Values = { true, false },
+ },
+
+ IntPref =
+ {
+ Default = 3,
+ Choices = { 1, 2, 3, 4, 5 },
+ Params = { SelectType = "ShowOneInRow" }
+ }
+}
+
+ThemePrefs.InitAll( prefs )
+[/code]
+
+So when "On" is selected, BoolPref will be set to true, and selecting "Off"
+will set it false. Simple enough, yeah? This will scale to any type you like.
+Enumerations, strings, whatever.
+
+-----------------
+Section 2: Params
+-----------------
+
+We did promise a more in-depth look at Params, so here it is.
+
+The following arguments and values are currently accepted for Params:
+
+LayoutType (string): "ShowAllInRow" (default), "ShowOneInRow".
+
+ExportOnChange (bool): currently disabled in the source, but available to
+ set in case it's enabled later. If true, the Save function (which
+ handles actually setting the preference) is called whenever a value
+ is changed rather than when the screen changes.
+
+EnabledForPlayers (function): has 'self' as an argument, returns a table of
+ PlayerNumbers who are allowed to select stuff. Not important yet.
+
+ReloadRowMessages (table): contains an indexed array of strings. Whenever
+ any of the messages in this table are broadcast, the Load function
+ (which loads the list of possible options and sets the selected
+ value/s) is called again.
+
+LoadSelections (function): takes self, list, pn, overrides the default
+ function. This is advanced usage, so you should probably know
+ what you're doing to use it. Probably unnecessary.
+
+SaveSelections (function): takes self, list, pn, and overrides the default
+ function. This is advanced as well, for the same reasons. Fortunately,
+ you probably won't need it.
+
+----------------
+Section 3: Usage
+----------------
+
+To get the OptionsRow for the preference you want, use ThemePrefRow(name)
+or ThemePrefsRows.GetRow(name); they're the same function. You'd use this
+as, for example in the metrics:
+
+Line1="lua,ThemePrefRow('BoolPref')"
+
+Unfortunately, you do need to do some more work with the Language INIs too.
+For each declared preference, you need an entry under [OptionTitles] for its
+title and an entry under [OptionExplanations] for its description. The key for
+both is the name of the preference. With the above example, that'd be e.g.
+
+[OptionTitles]
+(...)
+BoolPref=BoolPref
+IntPref=IntPref
+
+[OptionExplanations]
+(...)
+BoolPref=Toggles a simple boolean preference between true and false.
+IntPref=Sets an integer value between 1 and 5.
+
+-----------------------
+Section 4: Localization
+-----------------------
+
+ThemePrefsRows has three themable strings:
+
+NoDefaultInValues - if the default value isn't actually in choices or values,
+ this is displayed. Takes %s for the affected preference's name.
+
+TypeMismatch - if the default type and a value type mismatch, this is shown.
+ Takes %s, %d, and %s for the default's type, the index of the
+ mismatching value, and the value's type respectively.
+
+ChoicesSizeMismatch - if the Choices and Values arrays have different
+ lengths, this is displayed. Takes %d and %d for the size of
+ Choices and Values, respectively.
+
+---------------------
+Section 5: Disclaimer
+---------------------
+
+This isn't as tested as I'd like. For this version, it remains experimental.
+Quite experimental. If you run into problems, please let me know so I can
+fix them.
+
+Please direct all questions, comments, complaints, bug reports, etc. to "vyhd"
+in #sm-ssc on irc.badnik.net or whatever other form of communication you like.
diff --git a/Docs/Windows7.txt b/Docs/Windows7.txt
deleted file mode 100644
index eefe4e833d..0000000000
--- a/Docs/Windows7.txt
+++ /dev/null
@@ -1 +0,0 @@
-If you are using Windows Vista or Windows 7, please do not install StepMania SSC into the Program Files directory.
\ No newline at end of file
diff --git a/Docs/WindowsNotes.txt b/Docs/WindowsNotes.txt
new file mode 100644
index 0000000000..df305c466d
--- /dev/null
+++ b/Docs/WindowsNotes.txt
@@ -0,0 +1,17 @@
+[IMPORTANT INSTALL NOTE]
+If you are using Windows Vista or Windows 7, please do not install StepMania SSC into the Program Files directory.
+
+[Using Google Chrome?]
+If you are using Google Chrome as your primary web browser, you will have to perform some extra steps to get stepmania:// URI handling to work:
+
+Find yout user data
+Windows XP: C:\Documents and Settings\\Local Settings\Application Data\Google\Chrome\User Data
+Windows Vista/7: C:\Users\\AppData\Local\Google\Chrome\User Data
+
+Add your protocol to the 'Local State' file under the 'protocol_handler' section, as such:
+"protocol_handler": {
+ "excluded_schemes": {
+ ...
+ "stepmania": false,
+ ...
+ }
\ No newline at end of file
diff --git a/Docs/credits.txt b/Docs/credits.txt
index 34f00fff58..2daa02afa0 100644
--- a/Docs/credits.txt
+++ b/Docs/credits.txt
@@ -59,7 +59,7 @@ Kaox
* Pump/default noteskin
cesarmades
- * Pump/cmd noteskin
+ * Pump/cmd-* noteskins
David Santamaría Rogado (howl)
* Various patches (see Changelog_sm-ssc.txt for more details and links)
@@ -106,6 +106,9 @@ juanelote
* [SongManager] GetSongGroupByIndex function
* [MusicWheel] JumpToNextGroup/JumpToPrevGroup logic modifications
+NitroX72
+ * Pump/frame noteskin
+
==the beta testers==
[SSC Beta Testing Team]
KeithD
diff --git a/NoteSkins/pump/cmd-routine-p1/Center Hold Body active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p1/Center Hold Body active (doubleres) 6x1.png
new file mode 100644
index 0000000000..dfe7648d1e
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/Center Hold Body active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/Center Hold BottomCap active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p1/Center Hold BottomCap active (doubleres) 6x1.png
new file mode 100644
index 0000000000..a228086721
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/Center Hold BottomCap active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/Center Roll Head Active (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p1/Center Roll Head Active (doubleres) 3x2.png
new file mode 100644
index 0000000000..1ee360e9f5
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/Center Roll Head Active (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/Center Tap Note (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p1/Center Tap Note (doubleres) 3x2.png
new file mode 100644
index 0000000000..e11f43ef27
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/Center Tap Note (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/DownLeft Hold Body active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p1/DownLeft Hold Body active (doubleres) 6x1.png
new file mode 100644
index 0000000000..dec008a0ba
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/DownLeft Hold Body active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/DownLeft Hold BottomCap active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p1/DownLeft Hold BottomCap active (doubleres) 6x1.png
new file mode 100644
index 0000000000..c285faa23a
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/DownLeft Hold BottomCap active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/DownLeft Roll Head Active (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p1/DownLeft Roll Head Active (doubleres) 3x2.png
new file mode 100644
index 0000000000..4d21e18cd9
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/DownLeft Roll Head Active (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/DownLeft Tap Note (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p1/DownLeft Tap Note (doubleres) 3x2.png
new file mode 100644
index 0000000000..7e32671f0e
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/DownLeft Tap Note (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/DownRight Hold Body active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p1/DownRight Hold Body active (doubleres) 6x1.png
new file mode 100644
index 0000000000..37d6bb73f8
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/DownRight Hold Body active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/DownRight Hold BottomCap active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p1/DownRight Hold BottomCap active (doubleres) 6x1.png
new file mode 100644
index 0000000000..9b4f33fc8f
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/DownRight Hold BottomCap active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/DownRight Roll Head Active (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p1/DownRight Roll Head Active (doubleres) 3x2.png
new file mode 100644
index 0000000000..4dba753d2e
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/DownRight Roll Head Active (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/DownRight Tap Note (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p1/DownRight Tap Note (doubleres) 3x2.png
new file mode 100644
index 0000000000..622cdfc51c
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/DownRight Tap Note (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/UpLeft Hold Body active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p1/UpLeft Hold Body active (doubleres) 6x1.png
new file mode 100644
index 0000000000..6722c02ed8
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/UpLeft Hold Body active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/UpLeft Hold BottomCap active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p1/UpLeft Hold BottomCap active (doubleres) 6x1.png
new file mode 100644
index 0000000000..8df1561175
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/UpLeft Hold BottomCap active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/UpLeft Roll Head Active (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p1/UpLeft Roll Head Active (doubleres) 3x2.png
new file mode 100644
index 0000000000..5ce7ffd928
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/UpLeft Roll Head Active (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/UpLeft Tap Note (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p1/UpLeft Tap Note (doubleres) 3x2.png
new file mode 100644
index 0000000000..c4aaba680b
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/UpLeft Tap Note (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/UpRight Hold Body active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p1/UpRight Hold Body active (doubleres) 6x1.png
new file mode 100644
index 0000000000..651deb994e
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/UpRight Hold Body active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/UpRight Hold BottomCap active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p1/UpRight Hold BottomCap active (doubleres) 6x1.png
new file mode 100644
index 0000000000..20f1d4ba10
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/UpRight Hold BottomCap active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/UpRight Roll Head Active (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p1/UpRight Roll Head Active (doubleres) 3x2.png
new file mode 100644
index 0000000000..45b98f36b3
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/UpRight Roll Head Active (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p1/UpRight Tap Note (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p1/UpRight Tap Note (doubleres) 3x2.png
new file mode 100644
index 0000000000..4e95142637
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p1/UpRight Tap Note (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/Center Hold Body active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p2/Center Hold Body active (doubleres) 6x1.png
new file mode 100644
index 0000000000..29c39ffcc0
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/Center Hold Body active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/Center Hold BottomCap active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p2/Center Hold BottomCap active (doubleres) 6x1.png
new file mode 100644
index 0000000000..bd5245a932
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/Center Hold BottomCap active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/Center Roll Head Active (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p2/Center Roll Head Active (doubleres) 3x2.png
new file mode 100644
index 0000000000..8527a7a1d8
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/Center Roll Head Active (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/Center Tap Note (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p2/Center Tap Note (doubleres) 3x2.png
new file mode 100644
index 0000000000..3e38c9c708
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/Center Tap Note (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/DownLeft Hold Body active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p2/DownLeft Hold Body active (doubleres) 6x1.png
new file mode 100644
index 0000000000..aedf15180e
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/DownLeft Hold Body active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/DownLeft Hold BottomCap active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p2/DownLeft Hold BottomCap active (doubleres) 6x1.png
new file mode 100644
index 0000000000..9de812c29e
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/DownLeft Hold BottomCap active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/DownLeft Roll Head Active (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p2/DownLeft Roll Head Active (doubleres) 3x2.png
new file mode 100644
index 0000000000..9008fe19fc
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/DownLeft Roll Head Active (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/DownLeft Tap Note (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p2/DownLeft Tap Note (doubleres) 3x2.png
new file mode 100644
index 0000000000..f0a506b795
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/DownLeft Tap Note (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/DownRight Hold Body active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p2/DownRight Hold Body active (doubleres) 6x1.png
new file mode 100644
index 0000000000..f46d37be93
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/DownRight Hold Body active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/DownRight Hold BottomCap active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p2/DownRight Hold BottomCap active (doubleres) 6x1.png
new file mode 100644
index 0000000000..bcf475dc3a
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/DownRight Hold BottomCap active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/DownRight Roll Head Active (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p2/DownRight Roll Head Active (doubleres) 3x2.png
new file mode 100644
index 0000000000..6b2b525264
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/DownRight Roll Head Active (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/DownRight Tap Note (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p2/DownRight Tap Note (doubleres) 3x2.png
new file mode 100644
index 0000000000..51e2890ffd
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/DownRight Tap Note (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/NoteSkin.lua b/NoteSkins/pump/cmd-routine-p2/NoteSkin.lua
new file mode 100644
index 0000000000..1bbeae06d8
--- /dev/null
+++ b/NoteSkins/pump/cmd-routine-p2/NoteSkin.lua
@@ -0,0 +1,11 @@
+local Noteskin = ... or {}
+
+Noteskin.PartsToRotate = {
+ --["elemenu"] = true|false;
+ ["Roll Head Active"] = false;
+ ["Roll Head Inactive"] = false;
+ --
+ ["Tap Note"] = false;
+}
+
+return Noteskin
\ No newline at end of file
diff --git a/NoteSkins/pump/cmd-routine-p2/UpLeft Hold Body active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p2/UpLeft Hold Body active (doubleres) 6x1.png
new file mode 100644
index 0000000000..268e2a4f88
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/UpLeft Hold Body active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/UpLeft Hold BottomCap active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p2/UpLeft Hold BottomCap active (doubleres) 6x1.png
new file mode 100644
index 0000000000..d2dc4c2710
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/UpLeft Hold BottomCap active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/UpLeft Roll Head Active (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p2/UpLeft Roll Head Active (doubleres) 3x2.png
new file mode 100644
index 0000000000..0bf008cab0
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/UpLeft Roll Head Active (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/UpLeft Tap Note (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p2/UpLeft Tap Note (doubleres) 3x2.png
new file mode 100644
index 0000000000..3c7875dcfa
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/UpLeft Tap Note (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/UpRight Hold Body active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p2/UpRight Hold Body active (doubleres) 6x1.png
new file mode 100644
index 0000000000..d612eec8f8
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/UpRight Hold Body active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/UpRight Hold BottomCap active (doubleres) 6x1.png b/NoteSkins/pump/cmd-routine-p2/UpRight Hold BottomCap active (doubleres) 6x1.png
new file mode 100644
index 0000000000..71cb3a3606
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/UpRight Hold BottomCap active (doubleres) 6x1.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/UpRight Roll Head Active (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p2/UpRight Roll Head Active (doubleres) 3x2.png
new file mode 100644
index 0000000000..4202922718
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/UpRight Roll Head Active (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/UpRight Tap Note (doubleres) 3x2.png b/NoteSkins/pump/cmd-routine-p2/UpRight Tap Note (doubleres) 3x2.png
new file mode 100644
index 0000000000..1f367ca797
Binary files /dev/null and b/NoteSkins/pump/cmd-routine-p2/UpRight Tap Note (doubleres) 3x2.png differ
diff --git a/NoteSkins/pump/cmd-routine-p2/metrics.ini b/NoteSkins/pump/cmd-routine-p2/metrics.ini
new file mode 100644
index 0000000000..9450d5ed0c
--- /dev/null
+++ b/NoteSkins/pump/cmd-routine-p2/metrics.ini
@@ -0,0 +1,2 @@
+[Global]
+FallbackNoteSkin=cmd
\ No newline at end of file
diff --git a/NoteSkins/pump/default/DownLeft Outline Receptor.redir b/NoteSkins/pump/default/DownLeft Outline Receptor.redir
new file mode 100644
index 0000000000..04b2ead777
--- /dev/null
+++ b/NoteSkins/pump/default/DownLeft Outline Receptor.redir
@@ -0,0 +1 @@
+_blank
\ No newline at end of file
diff --git a/NoteSkins/pump/default/DownRight Ready Receptor.lua b/NoteSkins/pump/default/DownRight Ready Receptor.lua
index d61466c6b6..ca0aa5d395 100644
--- a/NoteSkins/pump/default/DownRight Ready Receptor.lua
+++ b/NoteSkins/pump/default/DownRight Ready Receptor.lua
@@ -4,5 +4,4 @@ return NOTESKIN:LoadActor("DownLeft", "Ready Receptor")..{
{ Frame = 1 };
{ Frame = 2 };
};
- --InitCommand=cmd(rotationy,180);
};
\ No newline at end of file
diff --git a/NoteSkins/pump/default/DownRight Tap Note.lua b/NoteSkins/pump/default/DownRight Tap Note.lua
index 9832f98f23..197b1b9d37 100644
--- a/NoteSkins/pump/default/DownRight Tap Note.lua
+++ b/NoteSkins/pump/default/DownRight Tap Note.lua
@@ -1,3 +1 @@
-return NOTESKIN:LoadActor("DownLeft","Tap Note")..{
- --InitCommand=cmd(rotationy,180);
-};
\ No newline at end of file
+return NOTESKIN:LoadActor("DownLeft","Tap Note")..{};
\ No newline at end of file
diff --git a/NoteSkins/pump/default/NoteSkin.lua b/NoteSkins/pump/default/NoteSkin.lua
index d084ed4c17..a7abc397ba 100644
--- a/NoteSkins/pump/default/NoteSkin.lua
+++ b/NoteSkins/pump/default/NoteSkin.lua
@@ -36,13 +36,14 @@ Noteskin.ElementRedirs = {
["Roll Bottomcap Inactive"] = "Hold Bottomcap Active";
["Roll Tail Inactive"] = "Hold Tail Active";
}
-Noteskin.ButtonRedirs = {
+-- explicit, n/w
+--[[Noteskin.ButtonRedirs = {
Center = "Center";
UpLeft = "UpLeft";
UpRight = "UpRight";
DownLeft = "DownLeft";
DownRight = "DownRight";
-}
+}]]
Noteskin.BaseRotX = {
Center = 0;
UpLeft = 0;
@@ -57,7 +58,23 @@ Noteskin.BaseRotY = {
DownLeft = 0;
DownRight = 180;
}
+Noteskin.BaseRotZ = {
+ Center = 0;
+ UpLeft = 0;
+ UpRight = 0;
+ DownLeft = 0;
+ DownRight = 0;
+}
+--[[--------------------------------------------------------------------------
+DONT EDIT THE FUNCTION, DON'T COPY AND PASTE THE WHOLE NOTESKIN.LUA
+JUST MAKE A NEW ONE AND GRAB WHATEVER IS USEFUL FOR YOUR NOTESKIN.
+phew~
+
+See cmd-routine-p* noteskin.lua for a simple and clear example on
+how to do this properly, notice how the rest of the noteskins just
+have graphics and at least a metrics.ini with few things
+--]]--------------------------------------------------------------------------
local function func()
local sButton = Var "Button"
local sElement = Var "Element"
@@ -76,7 +93,6 @@ local function func()
ElementToLoad = sElement
end
- --update: ahora receptor también
if sElement == "Explosion"
or sElement == "Tap Lift"
or sElement == "Tap Mine"
@@ -84,11 +100,10 @@ local function func()
then
sButton = "UpLeft"
end
- local path = NOTESKIN:GetPath(Noteskin.ButtonRedirs[sButton],ElementToLoad)
- --Graficos separados para holds y rolls
- --if string.find(sElement,"Hold") or string.find(sElement,"Roll") then
- if ( string.find(sElement,"Hold") or string.find(sElement,"Roll") ) and not ( string.find(sElement,"Head") or string.find(sElement,"Tail") ) then
- --if ( string.find(sElement,"Hold") or string.find(sElement,"Roll") ) and ( string.find(sElement,"Body") ) then
+ local path = NOTESKIN:GetPath(sButton,ElementToLoad)
+ if ( string.find(sElement,"Hold") or string.find(sElement,"Roll") )
+ and not ( string.find(sElement,"Head") or string.find(sElement,"Tail") )
+ then
path = NOTESKIN:GetPath(sButton,ElementToLoad)
end
@@ -100,6 +115,7 @@ local function func()
if bRotate then
t.BaseRotationX=Noteskin.BaseRotX[sButton]
t.BaseRotationY=Noteskin.BaseRotY[sButton]
+ t.BaseRotationZ=Noteskin.BaseRotZ[sButton]
end
return t
diff --git a/NoteSkins/pump/default/UpLeft Explosion.lua b/NoteSkins/pump/default/UpLeft Explosion.lua
index 13dda698b2..f3d6852e9d 100644
--- a/NoteSkins/pump/default/UpLeft Explosion.lua
+++ b/NoteSkins/pump/default/UpLeft Explosion.lua
@@ -38,23 +38,7 @@ return Def.ActorFrame {
};
--thing...
Def.Quad {
- InitCommand=cmd(zoomto,60,4800;diffusealpha,0);
+ InitCommand=cmd(zoomto,50,5000;diffusealpha,0);
HitMineCommand=cmd(finishtweening;diffusealpha,1;linear,0.3;diffusealpha,0);
};
- --[[Def.Quad {
- InitCommand=function(self)
- local style = GAMESTATE:GetCurrentStyle()GetStyleType()
- local maxzoom = SCREEN_WIDTH
- if style == 'StyleType_OnePlayerTwoSides' then
- maxzoom = 320
- end
-
- self:diffuse(1,1,1,0);
- self:zoomx(maxzoom);
- self:zoomy(SCREEN_HEIGHT*5)
- end;
- --cmd(diffuse,1,1,1,0;zoomy,SCREEN_HEIGHT*100);
- HitMineCommand=function(self) MESSAGEMAN:BroadCast("AMineWasHit"); end;
- --cmd(finishtweening;diffusealpha,1;linear,0.3;diffusealpha,0);
- };]]
}
\ No newline at end of file
diff --git a/NoteSkins/pump/default/UpLeft Receptor.lua b/NoteSkins/pump/default/UpLeft Receptor.lua
index a5d1e7e0f7..d6845a1d7d 100644
--- a/NoteSkins/pump/default/UpLeft Receptor.lua
+++ b/NoteSkins/pump/default/UpLeft Receptor.lua
@@ -19,20 +19,26 @@ return Def.ActorFrame {
-- LAYERS --
NOTESKIN:LoadActor("Center", "Outline Receptor")..{
- Name="Outline";
- Condition=Var "Button" == "Center";
+ Name="Outline Full";
+ Condition=Var "Button" == "Center" and GAMESTATE:GetCurrentStyle():GetStepsType() ~= 'StepsType_Pump_Halfdouble';
--InitCommand=cmd(x,96);
};
+ NOTESKIN:LoadActor("DownLeft", "Outline Receptor")..{
+ Name="Outline Half";
+ Condition=Var "Button" == "DownLeft" and GAMESTATE:GetCurrentStyle():GetStepsType() == 'StepsType_Pump_Halfdouble';
+ --InitCommand=cmd(x,96);
+ };
+
NOTESKIN:LoadActor(Var "Button", "Ready Receptor")..{
Name="Base";
Frames = { { Frame = 0 } };
- --PressCommand=cmd(finishtweening;glow,1,1,1,1;linear,0.1;glow,1,1,1,0);
+ PressCommand=cmd(finishtweening;linear,0.05;zoom,0.9;linear,0.1;zoom,1);
};
NOTESKIN:LoadActor(Var "Button", "Ready Receptor")..{
Name="Glow";
Frames = { { Frame = 1 } };
InitCommand=cmd(blend,'BlendMode_Add');
- --PressCommand=cmd(finishtweening;linear,0.05;zoom,0.9;linear,0.1;zoom,1);
+ PressCommand=cmd(finishtweening;linear,0.05;zoom,0.9;linear,0.1;zoom,1);
};
--[[
NOTESKIN:LoadActor(Var "Button", "Ready Receptor")..{
diff --git a/NoteSkins/pump/default/UpRight Ready Receptor.lua b/NoteSkins/pump/default/UpRight Ready Receptor.lua
index cae1506df9..367c0bada7 100644
--- a/NoteSkins/pump/default/UpRight Ready Receptor.lua
+++ b/NoteSkins/pump/default/UpRight Ready Receptor.lua
@@ -4,5 +4,4 @@ return NOTESKIN:LoadActor("UpLeft", "Ready Receptor")..{
{ Frame = 1 };
{ Frame = 2 };
};
- --InitCommand=cmd(rotationy,180);
};
\ No newline at end of file
diff --git a/NoteSkins/pump/default/UpRight Tap Note.lua b/NoteSkins/pump/default/UpRight Tap Note.lua
index 7b882b751d..d9129448d8 100644
--- a/NoteSkins/pump/default/UpRight Tap Note.lua
+++ b/NoteSkins/pump/default/UpRight Tap Note.lua
@@ -1,4 +1 @@
-return NOTESKIN:LoadActor("UpLeft","Tap Note")..{
- --InitCommand=cmd(rotationy,180);
- --BaseRotationY=180;
-};
\ No newline at end of file
+return NOTESKIN:LoadActor("UpLeft","Tap Note")..{};
\ No newline at end of file
diff --git a/NoteSkins/pump/frame5p/Center Hold Body active (doubleres).png b/NoteSkins/pump/frame5p/Center Hold Body active (doubleres).png
new file mode 100644
index 0000000000..049deee19d
Binary files /dev/null and b/NoteSkins/pump/frame5p/Center Hold Body active (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/Center Hold BottomCap active (doubleres).png b/NoteSkins/pump/frame5p/Center Hold BottomCap active (doubleres).png
new file mode 100644
index 0000000000..1bbca50d4e
Binary files /dev/null and b/NoteSkins/pump/frame5p/Center Hold BottomCap active (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/Center Outline Receptor.redir b/NoteSkins/pump/frame5p/Center Outline Receptor.redir
new file mode 100644
index 0000000000..04b2ead777
--- /dev/null
+++ b/NoteSkins/pump/frame5p/Center Outline Receptor.redir
@@ -0,0 +1 @@
+_blank
\ No newline at end of file
diff --git a/NoteSkins/pump/frame5p/Center Ready Receptor 3x1 (doubleres).png b/NoteSkins/pump/frame5p/Center Ready Receptor 3x1 (doubleres).png
new file mode 100644
index 0000000000..5dccc11527
Binary files /dev/null and b/NoteSkins/pump/frame5p/Center Ready Receptor 3x1 (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/Center Tap Note 8x1 (doubleres).png b/NoteSkins/pump/frame5p/Center Tap Note 8x1 (doubleres).png
new file mode 100644
index 0000000000..83dfd0f3dc
Binary files /dev/null and b/NoteSkins/pump/frame5p/Center Tap Note 8x1 (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/DownLeft Hold Body active (doubleres).png b/NoteSkins/pump/frame5p/DownLeft Hold Body active (doubleres).png
new file mode 100644
index 0000000000..447e0cadfe
Binary files /dev/null and b/NoteSkins/pump/frame5p/DownLeft Hold Body active (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/DownLeft Hold BottomCap active (doubleres).png b/NoteSkins/pump/frame5p/DownLeft Hold BottomCap active (doubleres).png
new file mode 100644
index 0000000000..d20477629c
Binary files /dev/null and b/NoteSkins/pump/frame5p/DownLeft Hold BottomCap active (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/DownLeft Hold TopCap Active (doubleres).png b/NoteSkins/pump/frame5p/DownLeft Hold TopCap Active (doubleres).png
new file mode 100644
index 0000000000..46249a36e0
Binary files /dev/null and b/NoteSkins/pump/frame5p/DownLeft Hold TopCap Active (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/DownLeft Ready Receptor 3x1 (doubleres).png b/NoteSkins/pump/frame5p/DownLeft Ready Receptor 3x1 (doubleres).png
new file mode 100644
index 0000000000..28aba4f386
Binary files /dev/null and b/NoteSkins/pump/frame5p/DownLeft Ready Receptor 3x1 (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/DownLeft Tap Note 8x1 (doubleres).png b/NoteSkins/pump/frame5p/DownLeft Tap Note 8x1 (doubleres).png
new file mode 100644
index 0000000000..7b7946bcc7
Binary files /dev/null and b/NoteSkins/pump/frame5p/DownLeft Tap Note 8x1 (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/DownRight Hold Body active (doubleres).png b/NoteSkins/pump/frame5p/DownRight Hold Body active (doubleres).png
new file mode 100644
index 0000000000..0308ffdba2
Binary files /dev/null and b/NoteSkins/pump/frame5p/DownRight Hold Body active (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/DownRight Hold BottomCap active (doubleres).png b/NoteSkins/pump/frame5p/DownRight Hold BottomCap active (doubleres).png
new file mode 100644
index 0000000000..49fa97be0b
Binary files /dev/null and b/NoteSkins/pump/frame5p/DownRight Hold BottomCap active (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/DownRight Hold TopCap Active(doubleres).png b/NoteSkins/pump/frame5p/DownRight Hold TopCap Active(doubleres).png
new file mode 100644
index 0000000000..20d5423ddb
Binary files /dev/null and b/NoteSkins/pump/frame5p/DownRight Hold TopCap Active(doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/UpLeft Hold Body active (doubleres).png b/NoteSkins/pump/frame5p/UpLeft Hold Body active (doubleres).png
new file mode 100644
index 0000000000..282db1ab02
Binary files /dev/null and b/NoteSkins/pump/frame5p/UpLeft Hold Body active (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/UpLeft Hold BottomCap active (doubleres).png b/NoteSkins/pump/frame5p/UpLeft Hold BottomCap active (doubleres).png
new file mode 100644
index 0000000000..9c0413bc7c
Binary files /dev/null and b/NoteSkins/pump/frame5p/UpLeft Hold BottomCap active (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/UpLeft Hold TopCap (doubleres).png b/NoteSkins/pump/frame5p/UpLeft Hold TopCap (doubleres).png
new file mode 100644
index 0000000000..ee95f2fa89
Binary files /dev/null and b/NoteSkins/pump/frame5p/UpLeft Hold TopCap (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/UpLeft Ready Receptor 3x1 (doubleres).png b/NoteSkins/pump/frame5p/UpLeft Ready Receptor 3x1 (doubleres).png
new file mode 100644
index 0000000000..75592a2c51
Binary files /dev/null and b/NoteSkins/pump/frame5p/UpLeft Ready Receptor 3x1 (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/UpLeft Tap Note 8x1 (doubleres).png b/NoteSkins/pump/frame5p/UpLeft Tap Note 8x1 (doubleres).png
new file mode 100644
index 0000000000..ddd5bce858
Binary files /dev/null and b/NoteSkins/pump/frame5p/UpLeft Tap Note 8x1 (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/UpRight Hold Body active (doubleres).png b/NoteSkins/pump/frame5p/UpRight Hold Body active (doubleres).png
new file mode 100644
index 0000000000..282db1ab02
Binary files /dev/null and b/NoteSkins/pump/frame5p/UpRight Hold Body active (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/UpRight Hold BottomCap active (doubleres).png b/NoteSkins/pump/frame5p/UpRight Hold BottomCap active (doubleres).png
new file mode 100644
index 0000000000..840a485ec1
Binary files /dev/null and b/NoteSkins/pump/frame5p/UpRight Hold BottomCap active (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/UpRight Hold TopCap (doubleres).png b/NoteSkins/pump/frame5p/UpRight Hold TopCap (doubleres).png
new file mode 100644
index 0000000000..2205e4b202
Binary files /dev/null and b/NoteSkins/pump/frame5p/UpRight Hold TopCap (doubleres).png differ
diff --git a/NoteSkins/pump/frame5p/metrics.ini b/NoteSkins/pump/frame5p/metrics.ini
new file mode 100644
index 0000000000..daf9021fa2
--- /dev/null
+++ b/NoteSkins/pump/frame5p/metrics.ini
@@ -0,0 +1,10 @@
+[NoteDisplay]
+TapNoteAnimationLength=0.333
+TapMineAnimationLength=0.333
+TapLiftAnimationLength=0.333
+TapFakeAnimationLength=0.333
+HoldHeadAnimationLength=0.333
+HoldTopCapAnimationLength=0.333
+HoldBottomCapAnimationLength=0.333
+HoldBodyAnimationLength=0.333
+HoldTailAnimationLength=0.333
diff --git a/NoteSkins/pump/newextra/Center Hold Body Active 6x1.png b/NoteSkins/pump/newextra/Center Hold Body Active 6x1.png
new file mode 100644
index 0000000000..6c2468f553
Binary files /dev/null and b/NoteSkins/pump/newextra/Center Hold Body Active 6x1.png differ
diff --git a/NoteSkins/pump/newextra/Center Hold BottomCap Active 6x1.png b/NoteSkins/pump/newextra/Center Hold BottomCap Active 6x1.png
new file mode 100644
index 0000000000..445f925bd9
Binary files /dev/null and b/NoteSkins/pump/newextra/Center Hold BottomCap Active 6x1.png differ
diff --git a/NoteSkins/pump/newextra/Center Outline Receptor.png b/NoteSkins/pump/newextra/Center Outline Receptor.png
new file mode 100644
index 0000000000..71470b7fef
Binary files /dev/null and b/NoteSkins/pump/newextra/Center Outline Receptor.png differ
diff --git a/NoteSkins/pump/newextra/Center Ready Receptor 1x3.png b/NoteSkins/pump/newextra/Center Ready Receptor 1x3.png
new file mode 100644
index 0000000000..3e91998f09
Binary files /dev/null and b/NoteSkins/pump/newextra/Center Ready Receptor 1x3.png differ
diff --git a/NoteSkins/pump/newextra/Center Tap Note 3x2.png b/NoteSkins/pump/newextra/Center Tap Note 3x2.png
new file mode 100644
index 0000000000..bbcacc5c7a
Binary files /dev/null and b/NoteSkins/pump/newextra/Center Tap Note 3x2.png differ
diff --git a/NoteSkins/pump/newextra/DownLeft Hold Body Active 6x1.png b/NoteSkins/pump/newextra/DownLeft Hold Body Active 6x1.png
new file mode 100644
index 0000000000..cc92bc75ea
Binary files /dev/null and b/NoteSkins/pump/newextra/DownLeft Hold Body Active 6x1.png differ
diff --git a/NoteSkins/pump/newextra/DownLeft Hold BottomCap Active 6x1.png b/NoteSkins/pump/newextra/DownLeft Hold BottomCap Active 6x1.png
new file mode 100644
index 0000000000..7e6f92964a
Binary files /dev/null and b/NoteSkins/pump/newextra/DownLeft Hold BottomCap Active 6x1.png differ
diff --git a/NoteSkins/pump/newextra/DownLeft Ready Receptor 1x3.png b/NoteSkins/pump/newextra/DownLeft Ready Receptor 1x3.png
new file mode 100644
index 0000000000..eba181ed4d
Binary files /dev/null and b/NoteSkins/pump/newextra/DownLeft Ready Receptor 1x3.png differ
diff --git a/NoteSkins/pump/newextra/DownLeft Tap Note 3x2.png b/NoteSkins/pump/newextra/DownLeft Tap Note 3x2.png
new file mode 100644
index 0000000000..7e2981d5b8
Binary files /dev/null and b/NoteSkins/pump/newextra/DownLeft Tap Note 3x2.png differ
diff --git a/NoteSkins/pump/newextra/DownRight Hold Body Active 6x1.png b/NoteSkins/pump/newextra/DownRight Hold Body Active 6x1.png
new file mode 100644
index 0000000000..e57c3e6f5a
Binary files /dev/null and b/NoteSkins/pump/newextra/DownRight Hold Body Active 6x1.png differ
diff --git a/NoteSkins/pump/newextra/DownRight Hold BottomCap Active 6x1.png b/NoteSkins/pump/newextra/DownRight Hold BottomCap Active 6x1.png
new file mode 100644
index 0000000000..534f6cc4e4
Binary files /dev/null and b/NoteSkins/pump/newextra/DownRight Hold BottomCap Active 6x1.png differ
diff --git a/NoteSkins/pump/newextra/UpLeft Hold Body Active 6x1.png b/NoteSkins/pump/newextra/UpLeft Hold Body Active 6x1.png
new file mode 100644
index 0000000000..42306997fc
Binary files /dev/null and b/NoteSkins/pump/newextra/UpLeft Hold Body Active 6x1.png differ
diff --git a/NoteSkins/pump/newextra/UpLeft Hold BottomCap Active 6x1.png b/NoteSkins/pump/newextra/UpLeft Hold BottomCap Active 6x1.png
new file mode 100644
index 0000000000..eb094a1fdb
Binary files /dev/null and b/NoteSkins/pump/newextra/UpLeft Hold BottomCap Active 6x1.png differ
diff --git a/NoteSkins/pump/newextra/UpLeft Ready Receptor 1x3.png b/NoteSkins/pump/newextra/UpLeft Ready Receptor 1x3.png
new file mode 100644
index 0000000000..530d05b313
Binary files /dev/null and b/NoteSkins/pump/newextra/UpLeft Ready Receptor 1x3.png differ
diff --git a/NoteSkins/pump/newextra/UpLeft Tap Note 3x2.png b/NoteSkins/pump/newextra/UpLeft Tap Note 3x2.png
new file mode 100644
index 0000000000..115bd460d3
Binary files /dev/null and b/NoteSkins/pump/newextra/UpLeft Tap Note 3x2.png differ
diff --git a/NoteSkins/pump/newextra/UpRight Hold Body Active 6x1.png b/NoteSkins/pump/newextra/UpRight Hold Body Active 6x1.png
new file mode 100644
index 0000000000..4e386ccbaf
Binary files /dev/null and b/NoteSkins/pump/newextra/UpRight Hold Body Active 6x1.png differ
diff --git a/NoteSkins/pump/newextra/UpRight Hold BottomCap Active 6x1.png b/NoteSkins/pump/newextra/UpRight Hold BottomCap Active 6x1.png
new file mode 100644
index 0000000000..dc0a392887
Binary files /dev/null and b/NoteSkins/pump/newextra/UpRight Hold BottomCap Active 6x1.png differ
diff --git a/NoteSkins/pump/rhythm/Center Hold Body Active 6x1.png b/NoteSkins/pump/rhythm/Center Hold Body Active 6x1.png
new file mode 100644
index 0000000000..9eb72a07bc
Binary files /dev/null and b/NoteSkins/pump/rhythm/Center Hold Body Active 6x1.png differ
diff --git a/NoteSkins/pump/rhythm/Center Hold BottomCap Active 6x1.png b/NoteSkins/pump/rhythm/Center Hold BottomCap Active 6x1.png
new file mode 100644
index 0000000000..020a6dba48
Binary files /dev/null and b/NoteSkins/pump/rhythm/Center Hold BottomCap Active 6x1.png differ
diff --git a/NoteSkins/pump/rhythm/Center Ready Receptor 1x3.png b/NoteSkins/pump/rhythm/Center Ready Receptor 1x3.png
new file mode 100644
index 0000000000..f315e99211
Binary files /dev/null and b/NoteSkins/pump/rhythm/Center Ready Receptor 1x3.png differ
diff --git a/NoteSkins/pump/rhythm/Center Tap Note.lua b/NoteSkins/pump/rhythm/Center Tap Note.lua
new file mode 100644
index 0000000000..5271c2ed97
--- /dev/null
+++ b/NoteSkins/pump/rhythm/Center Tap Note.lua
@@ -0,0 +1,4 @@
+return Def.Sprite {
+ Texture=NOTESKIN:GetPath( '_center', 'tap note' );
+ Frames = Sprite.LinearFrames( 6, 1 );
+};
\ No newline at end of file
diff --git a/NoteSkins/pump/rhythm/DownLeft Hold Body Active 6x1.png b/NoteSkins/pump/rhythm/DownLeft Hold Body Active 6x1.png
new file mode 100644
index 0000000000..ce982adada
Binary files /dev/null and b/NoteSkins/pump/rhythm/DownLeft Hold Body Active 6x1.png differ
diff --git a/NoteSkins/pump/rhythm/DownLeft Hold BottomCap Active 6x1.png b/NoteSkins/pump/rhythm/DownLeft Hold BottomCap Active 6x1.png
new file mode 100644
index 0000000000..f4342a536e
Binary files /dev/null and b/NoteSkins/pump/rhythm/DownLeft Hold BottomCap Active 6x1.png differ
diff --git a/NoteSkins/pump/rhythm/DownLeft Ready Receptor 1x3.png b/NoteSkins/pump/rhythm/DownLeft Ready Receptor 1x3.png
new file mode 100644
index 0000000000..100672ed69
Binary files /dev/null and b/NoteSkins/pump/rhythm/DownLeft Ready Receptor 1x3.png differ
diff --git a/NoteSkins/pump/rhythm/DownLeft Tap Note.lua b/NoteSkins/pump/rhythm/DownLeft Tap Note.lua
new file mode 100644
index 0000000000..4f830b9cc4
--- /dev/null
+++ b/NoteSkins/pump/rhythm/DownLeft Tap Note.lua
@@ -0,0 +1,4 @@
+return Def.Sprite {
+ Texture=NOTESKIN:GetPath( '_downleft', 'tap note' );
+ Frames = Sprite.LinearFrames( 6, 1 );
+};
\ No newline at end of file
diff --git a/NoteSkins/pump/rhythm/DownRight Hold Body Active 6x1.png b/NoteSkins/pump/rhythm/DownRight Hold Body Active 6x1.png
new file mode 100644
index 0000000000..7c7847e5fa
Binary files /dev/null and b/NoteSkins/pump/rhythm/DownRight Hold Body Active 6x1.png differ
diff --git a/NoteSkins/pump/rhythm/DownRight Hold BottomCap Active 6x1.png b/NoteSkins/pump/rhythm/DownRight Hold BottomCap Active 6x1.png
new file mode 100644
index 0000000000..b86bd760e1
Binary files /dev/null and b/NoteSkins/pump/rhythm/DownRight Hold BottomCap Active 6x1.png differ
diff --git a/NoteSkins/pump/rhythm/UpLeft Hold Body Active 6x1.png b/NoteSkins/pump/rhythm/UpLeft Hold Body Active 6x1.png
new file mode 100644
index 0000000000..92e648f947
Binary files /dev/null and b/NoteSkins/pump/rhythm/UpLeft Hold Body Active 6x1.png differ
diff --git a/NoteSkins/pump/rhythm/UpLeft Hold BottomCap Active 6x1.png b/NoteSkins/pump/rhythm/UpLeft Hold BottomCap Active 6x1.png
new file mode 100644
index 0000000000..e5a40f3123
Binary files /dev/null and b/NoteSkins/pump/rhythm/UpLeft Hold BottomCap Active 6x1.png differ
diff --git a/NoteSkins/pump/rhythm/UpLeft Ready Receptor 1x3.png b/NoteSkins/pump/rhythm/UpLeft Ready Receptor 1x3.png
new file mode 100644
index 0000000000..d16a140390
Binary files /dev/null and b/NoteSkins/pump/rhythm/UpLeft Ready Receptor 1x3.png differ
diff --git a/NoteSkins/pump/rhythm/UpLeft Tap Note.lua b/NoteSkins/pump/rhythm/UpLeft Tap Note.lua
new file mode 100644
index 0000000000..0e94651b2d
--- /dev/null
+++ b/NoteSkins/pump/rhythm/UpLeft Tap Note.lua
@@ -0,0 +1,4 @@
+return Def.Sprite {
+ Texture=NOTESKIN:GetPath( '_upleft', 'tap note' );
+ Frames = Sprite.LinearFrames( 6, 1 );
+};
\ No newline at end of file
diff --git a/NoteSkins/pump/rhythm/UpRight Hold Body Active 6x1.png b/NoteSkins/pump/rhythm/UpRight Hold Body Active 6x1.png
new file mode 100644
index 0000000000..4cad240121
Binary files /dev/null and b/NoteSkins/pump/rhythm/UpRight Hold Body Active 6x1.png differ
diff --git a/NoteSkins/pump/rhythm/UpRight Hold BottomCap Active 6x1.png b/NoteSkins/pump/rhythm/UpRight Hold BottomCap Active 6x1.png
new file mode 100644
index 0000000000..313f0e67cc
Binary files /dev/null and b/NoteSkins/pump/rhythm/UpRight Hold BottomCap Active 6x1.png differ
diff --git a/NoteSkins/pump/rhythm/_Center Tap Note 6x8.png b/NoteSkins/pump/rhythm/_Center Tap Note 6x8.png
new file mode 100644
index 0000000000..4ef2fd8eb1
Binary files /dev/null and b/NoteSkins/pump/rhythm/_Center Tap Note 6x8.png differ
diff --git a/NoteSkins/pump/rhythm/_DownLeft Tap Note 6x8.png b/NoteSkins/pump/rhythm/_DownLeft Tap Note 6x8.png
new file mode 100644
index 0000000000..f62421dc16
Binary files /dev/null and b/NoteSkins/pump/rhythm/_DownLeft Tap Note 6x8.png differ
diff --git a/NoteSkins/pump/rhythm/_UpLeft Tap Note 6x8.png b/NoteSkins/pump/rhythm/_UpLeft Tap Note 6x8.png
new file mode 100644
index 0000000000..2b343ac0a5
Binary files /dev/null and b/NoteSkins/pump/rhythm/_UpLeft Tap Note 6x8.png differ
diff --git a/NoteSkins/pump/rhythm/metrics.ini b/NoteSkins/pump/rhythm/metrics.ini
new file mode 100644
index 0000000000..faaa880191
--- /dev/null
+++ b/NoteSkins/pump/rhythm/metrics.ini
@@ -0,0 +1,5 @@
+[NoteDisplay]
+TapNoteNoteColorTextureCoordSpacingX=0
+TapNoteNoteColorTextureCoordSpacingY=0.125
+HoldHeadNoteColorTextureCoordSpacingX=0
+HoldHeadNoteColorTextureCoordSpacingY=0.125
\ No newline at end of file
diff --git a/Themes/_fallback/Fonts/_Thai 16px [PhayanChana-stroke] 16x4.png b/Themes/_fallback/Fonts/_Thai 16px [PhayanChana-stroke] 16x4.png
new file mode 100644
index 0000000000..28db2e9342
Binary files /dev/null and b/Themes/_fallback/Fonts/_Thai 16px [PhayanChana-stroke] 16x4.png differ
diff --git a/Themes/_fallback/Fonts/_Thai 16px [PhayanChana] 16x4.png b/Themes/_fallback/Fonts/_Thai 16px [PhayanChana] 16x4.png
index ce54c11145..c3f8d0bbbb 100644
Binary files a/Themes/_fallback/Fonts/_Thai 16px [PhayanChana] 16x4.png and b/Themes/_fallback/Fonts/_Thai 16px [PhayanChana] 16x4.png differ
diff --git a/Themes/_fallback/Fonts/_Thai 16px [Sara1-stroke] 8x2.png b/Themes/_fallback/Fonts/_Thai 16px [Sara1-stroke] 8x2.png
new file mode 100644
index 0000000000..95206cd3a6
Binary files /dev/null and b/Themes/_fallback/Fonts/_Thai 16px [Sara1-stroke] 8x2.png differ
diff --git a/Themes/_fallback/Fonts/_Thai 16px [Sara1] 8x2.png b/Themes/_fallback/Fonts/_Thai 16px [Sara1] 8x2.png
index 409ac902b2..d98c4de575 100644
Binary files a/Themes/_fallback/Fonts/_Thai 16px [Sara1] 8x2.png and b/Themes/_fallback/Fonts/_Thai 16px [Sara1] 8x2.png differ
diff --git a/Themes/_fallback/Fonts/_Thai 16px [Sara2-stroke] 8x2.png b/Themes/_fallback/Fonts/_Thai 16px [Sara2-stroke] 8x2.png
new file mode 100644
index 0000000000..36c7b1b64f
Binary files /dev/null and b/Themes/_fallback/Fonts/_Thai 16px [Sara2-stroke] 8x2.png differ
diff --git a/Themes/_fallback/Fonts/_Thai 16px [Sara2] 8x2.png b/Themes/_fallback/Fonts/_Thai 16px [Sara2] 8x2.png
index ae38cef82e..3569e7029c 100644
Binary files a/Themes/_fallback/Fonts/_Thai 16px [Sara2] 8x2.png and b/Themes/_fallback/Fonts/_Thai 16px [Sara2] 8x2.png differ
diff --git a/Themes/_fallback/Fonts/_japanese 24px [kanji 1-stroke] 8x8 (doubleres).png b/Themes/_fallback/Fonts/_japanese 24px [kanji 1-stroke] 8x8 (doubleres).png
new file mode 100644
index 0000000000..dc6fd4c950
Binary files /dev/null and b/Themes/_fallback/Fonts/_japanese 24px [kanji 1-stroke] 8x8 (doubleres).png differ
diff --git a/Themes/_fallback/Fonts/_japanese 24px [kanji 2-stroke] 8x8 (doubleres).png b/Themes/_fallback/Fonts/_japanese 24px [kanji 2-stroke] 8x8 (doubleres).png
new file mode 100644
index 0000000000..246065ac46
Binary files /dev/null and b/Themes/_fallback/Fonts/_japanese 24px [kanji 2-stroke] 8x8 (doubleres).png differ
diff --git a/Themes/_fallback/Fonts/_japanese 24px [kanji 3-stroke] 8x8 (doubleres).png b/Themes/_fallback/Fonts/_japanese 24px [kanji 3-stroke] 8x8 (doubleres).png
new file mode 100644
index 0000000000..d6a367d091
Binary files /dev/null and b/Themes/_fallback/Fonts/_japanese 24px [kanji 3-stroke] 8x8 (doubleres).png differ
diff --git a/Themes/_fallback/Fonts/_japanese 24px [kanji 4-stroke] 8x8 (doubleres).png b/Themes/_fallback/Fonts/_japanese 24px [kanji 4-stroke] 8x8 (doubleres).png
new file mode 100644
index 0000000000..d90985e7e6
Binary files /dev/null and b/Themes/_fallback/Fonts/_japanese 24px [kanji 4-stroke] 8x8 (doubleres).png differ
diff --git a/Themes/_fallback/Fonts/_japanese 24px [kanji 5-stroke] 8x8 (doubleres).png b/Themes/_fallback/Fonts/_japanese 24px [kanji 5-stroke] 8x8 (doubleres).png
new file mode 100644
index 0000000000..069eb81db2
Binary files /dev/null and b/Themes/_fallback/Fonts/_japanese 24px [kanji 5-stroke] 8x8 (doubleres).png differ
diff --git a/Themes/_fallback/Fonts/_japanese 24px [kanji 6-stroke] 8x8 (doubleres).png b/Themes/_fallback/Fonts/_japanese 24px [kanji 6-stroke] 8x8 (doubleres).png
new file mode 100644
index 0000000000..f3654b5a01
Binary files /dev/null and b/Themes/_fallback/Fonts/_japanese 24px [kanji 6-stroke] 8x8 (doubleres).png differ
diff --git a/Themes/_fallback/Fonts/_japanese 24px [kanji 7-stroke] 8x8 (doubleres).png b/Themes/_fallback/Fonts/_japanese 24px [kanji 7-stroke] 8x8 (doubleres).png
new file mode 100644
index 0000000000..7fb83c3bad
Binary files /dev/null and b/Themes/_fallback/Fonts/_japanese 24px [kanji 7-stroke] 8x8 (doubleres).png differ
diff --git a/Themes/_fallback/Fonts/_japanese 24px [kanji 8-stroke] 8x8 (doubleres).png b/Themes/_fallback/Fonts/_japanese 24px [kanji 8-stroke] 8x8 (doubleres).png
new file mode 100644
index 0000000000..0d03515d65
Binary files /dev/null and b/Themes/_fallback/Fonts/_japanese 24px [kanji 8-stroke] 8x8 (doubleres).png differ
diff --git a/Themes/_fallback/Fonts/_japanese 24px [kanji 9-stroke] 8x8 (doubleres).png b/Themes/_fallback/Fonts/_japanese 24px [kanji 9-stroke] 8x8 (doubleres).png
new file mode 100644
index 0000000000..9970f68791
Binary files /dev/null and b/Themes/_fallback/Fonts/_japanese 24px [kanji 9-stroke] 8x8 (doubleres).png differ
diff --git a/Themes/_fallback/Fonts/_japanese 24px [kanji-jis1-stroke] 32x32 (doubleres).png b/Themes/_fallback/Fonts/_japanese 24px [kanji-jis1-stroke] 32x32 (doubleres).png
new file mode 100644
index 0000000000..afe28378ba
Binary files /dev/null and b/Themes/_fallback/Fonts/_japanese 24px [kanji-jis1-stroke] 32x32 (doubleres).png differ
diff --git a/Themes/_fallback/Fonts/_japanese 24px [kanji-jis2-stroke] 32x106 (doubleres).png b/Themes/_fallback/Fonts/_japanese 24px [kanji-jis2-stroke] 32x106 (doubleres).png
new file mode 100644
index 0000000000..eb3266a6dd
Binary files /dev/null and b/Themes/_fallback/Fonts/_japanese 24px [kanji-jis2-stroke] 32x106 (doubleres).png differ
diff --git a/Themes/_fallback/Fonts/_japanese 24px [kanji-regular-stroke] 32x61 (doubleres).png b/Themes/_fallback/Fonts/_japanese 24px [kanji-regular-stroke] 32x61 (doubleres).png
new file mode 100644
index 0000000000..ec9e30f473
Binary files /dev/null and b/Themes/_fallback/Fonts/_japanese 24px [kanji-regular-stroke] 32x61 (doubleres).png differ
diff --git a/Themes/_fallback/Fonts/_japanese 24px [main-stroke] 16x16 (doubleres).png b/Themes/_fallback/Fonts/_japanese 24px [main-stroke] 16x16 (doubleres).png
new file mode 100644
index 0000000000..3ba67dd436
Binary files /dev/null and b/Themes/_fallback/Fonts/_japanese 24px [main-stroke] 16x16 (doubleres).png differ
diff --git a/Themes/_fallback/Fonts/_japanese 24px [symbol-stroke] 26x3 (doubleres).png b/Themes/_fallback/Fonts/_japanese 24px [symbol-stroke] 26x3 (doubleres).png
new file mode 100644
index 0000000000..7591eca1a3
Binary files /dev/null and b/Themes/_fallback/Fonts/_japanese 24px [symbol-stroke] 26x3 (doubleres).png differ
diff --git a/Themes/_fallback/Fonts/_korean 24px [jamo 1-stroke] 8x8.png b/Themes/_fallback/Fonts/_korean 24px [jamo 1-stroke] 8x8.png
new file mode 100644
index 0000000000..846d93cebd
Binary files /dev/null and b/Themes/_fallback/Fonts/_korean 24px [jamo 1-stroke] 8x8.png differ
diff --git a/Themes/_fallback/Fonts/_korean 24px [jamo 1] 8x8.png b/Themes/_fallback/Fonts/_korean 24px [jamo 1] 8x8.png
index 3d1b4c60aa..324e977e45 100644
Binary files a/Themes/_fallback/Fonts/_korean 24px [jamo 1] 8x8.png and b/Themes/_fallback/Fonts/_korean 24px [jamo 1] 8x8.png differ
diff --git a/Themes/_fallback/Fonts/_korean 24px [jamo 2-stroke] 8x8.png b/Themes/_fallback/Fonts/_korean 24px [jamo 2-stroke] 8x8.png
new file mode 100644
index 0000000000..0e2927eb32
Binary files /dev/null and b/Themes/_fallback/Fonts/_korean 24px [jamo 2-stroke] 8x8.png differ
diff --git a/Themes/_fallback/Fonts/_korean 24px [jamo 2] 8x8.png b/Themes/_fallback/Fonts/_korean 24px [jamo 2] 8x8.png
index e6db762fcd..681a12d9b6 100644
Binary files a/Themes/_fallback/Fonts/_korean 24px [jamo 2] 8x8.png and b/Themes/_fallback/Fonts/_korean 24px [jamo 2] 8x8.png differ
diff --git a/Themes/_fallback/Fonts/_korean 24px [jamo 3-stroke] 8x8.png b/Themes/_fallback/Fonts/_korean 24px [jamo 3-stroke] 8x8.png
new file mode 100644
index 0000000000..4ef50db1c5
Binary files /dev/null and b/Themes/_fallback/Fonts/_korean 24px [jamo 3-stroke] 8x8.png differ
diff --git a/Themes/_fallback/Fonts/_korean 24px [jamo 3] 8x8.png b/Themes/_fallback/Fonts/_korean 24px [jamo 3] 8x8.png
index 1184ace8d9..2aed57aec9 100644
Binary files a/Themes/_fallback/Fonts/_korean 24px [jamo 3] 8x8.png and b/Themes/_fallback/Fonts/_korean 24px [jamo 3] 8x8.png differ
diff --git a/Themes/_fallback/Fonts/_korean 24px [jamo 4-stroke] 8x8.png b/Themes/_fallback/Fonts/_korean 24px [jamo 4-stroke] 8x8.png
new file mode 100644
index 0000000000..529df808ef
Binary files /dev/null and b/Themes/_fallback/Fonts/_korean 24px [jamo 4-stroke] 8x8.png differ
diff --git a/Themes/_fallback/Fonts/_korean 24px [jamo 4] 8x8.png b/Themes/_fallback/Fonts/_korean 24px [jamo 4] 8x8.png
index 8e1536aa3d..d7c9138b63 100644
Binary files a/Themes/_fallback/Fonts/_korean 24px [jamo 4] 8x8.png and b/Themes/_fallback/Fonts/_korean 24px [jamo 4] 8x8.png differ
diff --git a/Themes/_fallback/Fonts/frutiger 24px [alt-stroke] 12x11.png b/Themes/_fallback/Fonts/frutiger 24px [alt-stroke] 12x11.png
new file mode 100644
index 0000000000..03124f7f1d
Binary files /dev/null and b/Themes/_fallback/Fonts/frutiger 24px [alt-stroke] 12x11.png differ
diff --git a/Themes/_fallback/Graphics/Banner Artist.redir b/Themes/_fallback/Graphics/Banner Artist.redir
new file mode 100644
index 0000000000..507050cda9
--- /dev/null
+++ b/Themes/_fallback/Graphics/Banner Artist.redir
@@ -0,0 +1 @@
+Common fallback banner
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/Banner BPM.redir b/Themes/_fallback/Graphics/Banner BPM.redir
new file mode 100644
index 0000000000..507050cda9
--- /dev/null
+++ b/Themes/_fallback/Graphics/Banner BPM.redir
@@ -0,0 +1 @@
+Common fallback banner
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/Banner ChallengeMeter.redir b/Themes/_fallback/Graphics/Banner ChallengeMeter.redir
new file mode 100644
index 0000000000..507050cda9
--- /dev/null
+++ b/Themes/_fallback/Graphics/Banner ChallengeMeter.redir
@@ -0,0 +1 @@
+Common fallback banner
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/Banner DoubleChallengeMeter.redir b/Themes/_fallback/Graphics/Banner DoubleChallengeMeter.redir
new file mode 100644
index 0000000000..507050cda9
--- /dev/null
+++ b/Themes/_fallback/Graphics/Banner DoubleChallengeMeter.redir
@@ -0,0 +1 @@
+Common fallback banner
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/Banner DoubleEasyMeter.redir b/Themes/_fallback/Graphics/Banner DoubleEasyMeter.redir
new file mode 100644
index 0000000000..507050cda9
--- /dev/null
+++ b/Themes/_fallback/Graphics/Banner DoubleEasyMeter.redir
@@ -0,0 +1 @@
+Common fallback banner
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/Banner DoubleHardMeter.redir b/Themes/_fallback/Graphics/Banner DoubleHardMeter.redir
new file mode 100644
index 0000000000..507050cda9
--- /dev/null
+++ b/Themes/_fallback/Graphics/Banner DoubleHardMeter.redir
@@ -0,0 +1 @@
+Common fallback banner
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/Banner DoubleMediumMeter.redir b/Themes/_fallback/Graphics/Banner DoubleMediumMeter.redir
new file mode 100644
index 0000000000..507050cda9
--- /dev/null
+++ b/Themes/_fallback/Graphics/Banner DoubleMediumMeter.redir
@@ -0,0 +1 @@
+Common fallback banner
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/Banner EasyMeter.redir b/Themes/_fallback/Graphics/Banner EasyMeter.redir
new file mode 100644
index 0000000000..507050cda9
--- /dev/null
+++ b/Themes/_fallback/Graphics/Banner EasyMeter.redir
@@ -0,0 +1 @@
+Common fallback banner
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/Banner Genre.redir b/Themes/_fallback/Graphics/Banner Genre.redir
new file mode 100644
index 0000000000..507050cda9
--- /dev/null
+++ b/Themes/_fallback/Graphics/Banner Genre.redir
@@ -0,0 +1 @@
+Common fallback banner
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/Banner HardMeter.redir b/Themes/_fallback/Graphics/Banner HardMeter.redir
new file mode 100644
index 0000000000..507050cda9
--- /dev/null
+++ b/Themes/_fallback/Graphics/Banner HardMeter.redir
@@ -0,0 +1 @@
+Common fallback banner
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/Banner Length.redir b/Themes/_fallback/Graphics/Banner Length.redir
new file mode 100644
index 0000000000..507050cda9
--- /dev/null
+++ b/Themes/_fallback/Graphics/Banner Length.redir
@@ -0,0 +1 @@
+Common fallback banner
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/Banner MediumMeter.redir b/Themes/_fallback/Graphics/Banner MediumMeter.redir
new file mode 100644
index 0000000000..507050cda9
--- /dev/null
+++ b/Themes/_fallback/Graphics/Banner MediumMeter.redir
@@ -0,0 +1 @@
+Common fallback banner
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/Banner Title.redir b/Themes/_fallback/Graphics/Banner Title.redir
new file mode 100644
index 0000000000..507050cda9
--- /dev/null
+++ b/Themes/_fallback/Graphics/Banner Title.redir
@@ -0,0 +1 @@
+Common fallback banner
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/Banner TopGrades.redir b/Themes/_fallback/Graphics/Banner TopGrades.redir
new file mode 100644
index 0000000000..507050cda9
--- /dev/null
+++ b/Themes/_fallback/Graphics/Banner TopGrades.redir
@@ -0,0 +1 @@
+Common fallback banner
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/RoomWheelItem OverPart.redir b/Themes/_fallback/Graphics/RoomWheelItem OverPart.redir
new file mode 100644
index 0000000000..d9001bdd6c
--- /dev/null
+++ b/Themes/_fallback/Graphics/RoomWheelItem OverPart.redir
@@ -0,0 +1 @@
+MusicWheelItem Song OverPart
\ No newline at end of file
diff --git a/Themes/_fallback/Graphics/ScreenMapControllers exit.lua b/Themes/_fallback/Graphics/ScreenMapControllers exit.lua
new file mode 100644
index 0000000000..30d51e6f23
--- /dev/null
+++ b/Themes/_fallback/Graphics/ScreenMapControllers exit.lua
@@ -0,0 +1,10 @@
+return LoadFont("Common Normal") .. {
+ Text="Exit";
+ InitCommand=cmd(x,SCREEN_CENTER_X;zoom,0.75;shadowlength,0;diffuse,color("#808080"));
+ OnCommand=cmd(diffusealpha,0;decelerate,0.5;diffusealpha,1);
+ OffCommand=cmd(stoptweening;accelerate,0.3;diffusealpha,0;queuecommand,"Hide");
+ HideCommand=cmd(hidden,true);
+
+ GainFocusCommand=cmd(diffuseshift;effectcolor2,color("#808080");effectcolor1,color("#FFFFFF"));
+ LoseFocusCommand=cmd(stopeffect);
+};
diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini
index b7ea3a02cc..032631c80e 100644
--- a/Themes/_fallback/Languages/en.ini
+++ b/Themes/_fallback/Languages/en.ini
@@ -497,8 +497,11 @@ Shuffle=Shuffle the songs around.
1.6x=1.6x
1.7x=1.7x
1.75x=1.75x
+x1.75=1.75x
1.8x=1.8x
1.9x=1.9x
+x2.25=2.25x
+x2.5=2.5x
10=10
11=11
12=12
@@ -819,6 +822,7 @@ DisplayResolution=Display Resolution
Duration seconds=Duration seconds
EasterEggs=Easter Eggs
Edit Songs/Steps=Edit Songs/Steps
+Genre=Genre
Practice Songs/Steps=Practice Songs/Steps
Edit Courses=Edit Courses
Edit BPM change=Edit BPM change
@@ -827,6 +831,11 @@ Edit steps information=Edit steps information
Exit Edit Mode=Exit Edit Mode
Edit stop=Edit stop
Edit delay=Edit delay
+Edit Timing Data=Edit Timing Data
+Edit time signature=Edit time signature (not working yet)
+Edit time signature (top)=Edit time signature (beats per measure)
+Edit time signature (bottom)=Edit time signature (single beat note value)
+Edit tickcount=Edit tickcount
Editor options=Options
EditorShowBGChangesPlay=Show Backgrounds
Effect=Effect
@@ -980,6 +989,7 @@ SoundResampleQuality=Resampling Quality
SoundVolume=Sound Volume
SoundVolumeAttract=Attract Volume
Speed=Speed
+Step Author=Step Author
Steps=Steps
Stream=Stream
Style=Style
@@ -1187,11 +1197,15 @@ Do you want to save changes before exiting?=Do you want to save changes before e
Enter a new BPM value.=Enter a new BPM value.
Enter a new Stop value.=Enter a new Stop value.
Enter a new Delay value.=Enter a new Delay value.
+Enter a new Time Signature numerator value.=Enter the number of beats per measure.
+Enter a new Time Signature denominator value.=Enter the note value that represents one beat.
+Enter a new Tickcount value.=Enter a new Tickcount value.
Enter a new artist transliteration.=Enter a new artist transliteration.
Enter a new artist.=Enter a new artist.
Enter a new genre.=Enter a new genre.
Enter a new credit.=Enter a new credit.
Enter a new description.=Enter a new description.
+Enter the author who made this step pattern.=Enter the author who made this step pattern.
Enter a new last beat hint.=Enter a new last beat hint.
Enter a new main title transliteration.=Enter a new main title transliteration.
Enter a new main title.=Enter a new main title.
@@ -1312,7 +1326,7 @@ HelpText=Ctrl+ENTER Selects &BACK; Exit &MENULEFT;&MENURIGHT; Move
[ScreenNetSelectMusic]
HeaderText=Select Music Online
HeaderSubText=Song Selection
-HelpText=Ctrl+ENTER Selects &BACK; Exit &MENULEFT;&MENURIGHT; Move::&MENUUP; Options &MENUDOWN; Change Difficulty
+HelpText=Ctrl+ENTER Selects &BACK; Exit &MENULEFT;&MENURIGHT; Move::&MENUUP; Player Options &MENUDOWN; Change Difficulty
[ScreenNetworkOptions]
Disconnected from server.=Disconnected from server.
@@ -1361,6 +1375,10 @@ Error deleting the file '%s'.=Error deleting the file "%s".
Error renaming file. Destination file '%s' already exists.=Error renaming file. Destination file '%s' already exists.
Error writing file '%s'.=Error writing file '%s'.
+[NotesWriterSSC]
+Error renaming file. Destination file '%s' already exists.=Error renaming file. Destination file '%s' already exists.
+Error writing file '%s'.=Error writing file '%s'.
+
[ScreenOptionsManageProfiles]
Are you sure you want to clear all data in the profile '%s'?=Are you sure you want to clear all data in the profile &oq;%s&cq;?
Are you sure you want to delete the profile '%s'?=Are you sure you want to delete the profile &oq;%s&cq;?
@@ -1375,6 +1393,9 @@ Off=Off
[ScreenOptionsMemoryCard]
Error mounting card: %s=Error mounting card: %s
+(no label)=(no label)
+size ???=size ???
+%dMB=%dMB
[ScreenOptionsService]
HeaderText=Options
@@ -1589,6 +1610,7 @@ The folder "%s" appears to be a song folder. All song folders must reside in a
You must supply a name for your new edit.=You must supply a name for your new edit.
The name you chose conflicts with another edit. Please use a different name.=The name you chose conflicts with another edit. Please use a different name.
The edit name cannot contain any of the following characters: %s=The edit name can not contain any of the following characters: %s
+The step author's name cannot contain any of the following characters: %s=The step author's name cannot contain any of the following characters: %s
[SongSort]
FewestPlays=Fewest Plays
@@ -1651,6 +1673,8 @@ texture=texture
dance-couple=couple
dance-double=double
dance-single=single
+dance-solo=solo
+dance-threepanel=3panel
dance-routine=routine
lights-cabinet=Lights
# SSC
@@ -1675,6 +1699,7 @@ W5=Boo
Reloaded metrics=Reloaded metrics
Reloaded metrics and textures=Reloaded metrics and textures
Reloaded scripts=Reloaded scripts
+Reloaded overlay screens=Reloaded overlay screens
[WorkoutManager]
You must supply a name for your workout.=You must supply a name for your workout.
@@ -1890,6 +1915,7 @@ Shift BPM changes and stops up one beat=Shift BPM changes and stops up one beat
Lay mine=Lay mine
Lay lift=Lay lift
Add to/remove from right half=Add to/remove from right half
+Switch player (Routine only)=Switch player (Routine only)
[Grade]
Tier01=AAAA
@@ -1944,6 +1970,7 @@ W5=Boo
Held=Held
MaxCombo=Max Combo
Miss=Miss
+
[NativeLanguageNames]
Afar=Afar
Abkhazian=аҧÑуа бызшәа
@@ -2271,4 +2298,13 @@ Karaoke=Karaoke
Lights_Cabinet=Lights
[ScreenHowToInstallSongs]
-HeaderText=Installing Songs
\ No newline at end of file
+HeaderText=Installing Songs
+
+[ThemePrefs]
+IniFileMissing=IniFile missing. Can't read or write from disk :(
+UnknownPreference=Unknown preference "%s"
+
+[ThemePrefsRows]
+ChoicesSizeMismatch=Choices and Values have different sizes (%d, %d)
+NoDefaultInValues=Preference "%s" has no values matching default
+TypeMismatch=Type mismatch between default (%s) and value %d (%s)
diff --git a/Themes/_fallback/Other/ScreenGameplaySyncMachine music.sm b/Themes/_fallback/Other/ScreenGameplaySyncMachine music.sm
deleted file mode 100644
index 04761e58f0..0000000000
--- a/Themes/_fallback/Other/ScreenGameplaySyncMachine music.sm
+++ /dev/null
@@ -1,98 +0,0 @@
-#TITLE:Sync;
-#SUBTITLE:;
-#ARTIST:Unknown artist;
-#TITLETRANSLIT:;
-#SUBTITLETRANSLIT:;
-#ARTISTTRANSLIT:;
-#GENRE:;
-#CREDIT:;
-#BANNER:;
-#BACKGROUND:;
-#LYRICSPATH:;
-#CDTITLE:;
-#MUSIC:ScreenGameplaySyncMachine music.ogg;
-#OFFSET:-0.012;
-#SAMPLESTART:0.000;
-#SAMPLELENGTH:12.000;
-#SELECTABLE:YES;
-#BPMS:0.000=132.000;
-#STOPS:;
-#BGCHANGES:;
-#KEYSOUNDS:;
-
-//---------------dance-single - blank----------------
-#NOTES:
- dance-single:
- blank:
- Beginner:
- 1:
- 0.302,0.205,0.000,0.000,0.000:
- // measure 1
-0000
-0000
-0000
-0000
-, // measure 2
-1000
-0001
-1000
-0001
-1000
-0001
-1000
-0001
-, // measure 3
-1000
-0001
-1000
-0001
-1000
-0001
-1000
-0001
-, // measure 4
-1000
-0001
-1000
-0001
-1000
-0001
-1000
-0001
-, // measure 5
-1000
-0001
-1000
-0001
-1000
-0001
-1000
-0001
-, // measure 6
-1000
-0001
-1000
-0001
-1000
-0001
-1000
-0001
-, // measure 7
-1000
-0001
-1000
-0001
-1000
-0001
-1000
-0001
-, // measure 8
-1000
-0001
-1000
-0001
-1000
-0001
-1000
-0001
-;
diff --git a/Themes/_fallback/Other/ScreenGameplaySyncMachine music.ssc b/Themes/_fallback/Other/ScreenGameplaySyncMachine music.ssc
new file mode 100644
index 0000000000..a190bf0d9d
--- /dev/null
+++ b/Themes/_fallback/Other/ScreenGameplaySyncMachine music.ssc
@@ -0,0 +1,169 @@
+#TITLE:Sync;
+#SUBTITLE:;
+#ARTIST:Unknown artist;
+#TITLETRANSLIT:;
+#SUBTITLETRANSLIT:;
+#ARTISTTRANSLIT:;
+#GENRE:;
+#CREDIT:;
+#BANNER:;
+#BACKGROUND:;
+#LYRICSPATH:;
+#CDTITLE:;
+#MUSIC:ScreenGameplaySyncMachine music.ogg;
+#OFFSET:-0.012;
+#SAMPLESTART:0.000;
+#SAMPLELENGTH:12.000;
+#SELECTABLE:YES;
+#BPMS:0.000=132.000;
+#STOPS:;
+#BGCHANGES:;
+#KEYSOUNDS:;
+
+#NOTEDATA:;
+#STEPSTYPE:dance-single:;
+#DESCRIPTION:blank;
+#DIFFICULTY:Beginner;
+#METER:1;
+#RADARVALUES:0.302,0.205,0.000,0.000,0.000;
+#NOTES:
+ // measure 1
+0000
+, // measure 2
+1000
+0001
+1000
+0001
+1000
+0001
+1000
+0001
+, // measure 3
+1000
+0001
+1000
+0001
+1000
+0001
+1000
+0001
+, // measure 4
+1000
+0001
+1000
+0001
+1000
+0001
+1000
+0001
+, // measure 5
+1000
+0001
+1000
+0001
+1000
+0001
+1000
+0001
+, // measure 6
+1000
+0001
+1000
+0001
+1000
+0001
+1000
+0001
+, // measure 7
+1000
+0001
+1000
+0001
+1000
+0001
+1000
+0001
+, // measure 8
+1000
+0001
+1000
+0001
+1000
+0001
+1000
+0001
+;
+
+#NOTEDATA:;
+#STEPSTYPE:pump-single;
+#DESCRIPTION:blank;
+#DIFFICULTY:Beginner;
+#METER:1;
+#RADARVALUES:0.302,0.205,0.000,0.000,0.000;
+#NOTES:
+ // measure 1
+00000
+, // measure 2
+10000
+00001
+10000
+00001
+10000
+00001
+10000
+00001
+, // measure 3
+10000
+00001
+10000
+00001
+10000
+00001
+10000
+00001
+, // measure 4
+10000
+00001
+10000
+00001
+10000
+00001
+10000
+00001
+, // measure 5
+10000
+00001
+10000
+00001
+10000
+00001
+10000
+00001
+, // measure 6
+10000
+00001
+10000
+00001
+10000
+00001
+10000
+00001
+, // measure 7
+10000
+00001
+10000
+00001
+10000
+00001
+10000
+00001
+, // measure 8
+10000
+00001
+10000
+00001
+10000
+00001
+10000
+00001
+;
diff --git a/Themes/_fallback/Other/ScreenHowToPlay steps.sm b/Themes/_fallback/Other/ScreenHowToPlay steps.ssc
similarity index 62%
rename from Themes/_fallback/Other/ScreenHowToPlay steps.sm
rename to Themes/_fallback/Other/ScreenHowToPlay steps.ssc
index 5cf0a1c9af..1b43422f65 100644
--- a/Themes/_fallback/Other/ScreenHowToPlay steps.sm
+++ b/Themes/_fallback/Other/ScreenHowToPlay steps.ssc
@@ -6,44 +6,28 @@
// a song file here.
#TITLE:ScreenHowToPlay steps;
#ARTIST:foo;
-#BPMS:0.000=100.000
+#BPMS:0.000=100.000;
#STOPS:16=2,18=2,20=2,22=2;
-
+#NOTEDATA:;
+#STEPSTYPE:dance-single;
+#DESCRIPTION:BASIC;
+#DIFFICULTY:easy;
+#METER:1;
+#RADARVALUES:0,0,0,0,0;
#NOTES:
- dance-single:
- BASIC:
- easy:
- 1:
- 0,0,0,0,0:
-0000
-0000
-0000
0000
,
0000
-0000
-0000
-0000
,
0000
-0000
-0000
-0000
,
0000
-0000
-0000
-0000
,
0100
-0000
0010
-0000
,
1000
-0000
1001
-0000
,
1000
0100
@@ -79,51 +63,30 @@
0000
,
0000
-0000
-0000
-0000
,
0000
-0000
-0000
-0000
,;
+#NOTEDATA:;
+#STEPSTYPE:pump-single;
+#DESCRIPTION:NORMAL;
+#DIFFICULTY:easy;
+#METER:1;
+#RADARVALUES:0,0,0,0,0;
#NOTES:
- pump-single:
- NORMAL:
- easy:
- 1:
- 0,0,0,0,0:
-00000
-00000
-00000
00000
,
00000
-00000
-00000
-00000
,
00000
-00000
-00000
-00000
,
00000
-00000
-00000
-00000
,
01000
-00000
00100
-00000
,
10000
-00000
10010
-00000
,
10000
01000
@@ -159,12 +122,6 @@
00000
,
00000
-00000
-00000
-00000
,
00000
-00000
-00000
-00000
,;
diff --git a/Themes/_fallback/Scripts/02 Actor.lua b/Themes/_fallback/Scripts/02 Actor.lua
index 5d0af89602..156a752ab2 100644
--- a/Themes/_fallback/Scripts/02 Actor.lua
+++ b/Themes/_fallback/Scripts/02 Actor.lua
@@ -133,6 +133,17 @@ function Actor:Center()
self:y(SCREEN_CENTER_Y)
end
+function Actor:bezier(...)
+ local a = {...}
+ local b = {}
+ local c = 0
+ assert((a == 9 or a == 5), "bad number of arguments for Actor:bezier()")
+ for i=3,c do
+ b[#b+1] = a[i]
+ end
+ self:tween(a[2], "TweenMode_Bezier", b)
+end
+
-- (c) 2006 Glenn Maynard
-- All rights reserved.
--
diff --git a/Themes/_fallback/Scripts/02 Branches.lua b/Themes/_fallback/Scripts/02 Branches.lua
index af4e7f1117..d485fbdcb6 100644
--- a/Themes/_fallback/Scripts/02 Branches.lua
+++ b/Themes/_fallback/Scripts/02 Branches.lua
@@ -26,6 +26,11 @@ function SelectMusicOrCourse()
end
end
+-- functions used for Routine mode
+function IsRoutine()
+ return GAMESTATE:GetCurrentStyle() and GAMESTATE:GetCurrentStyle():GetStyleType() == "StyleType_TwoPlayersSharedSides";
+end
+
Branch = {
Init = function()
if GAMESTATE:GetCoinMode() == 'CoinMode_Home' then
@@ -155,6 +160,12 @@ Branch = {
return "ScreenStageInformation"
end
end,
+ GameplayScreen = function()
+ if IsRoutine() then
+ return "ScreenGameplayShared"
+ end
+ return "ScreenGameplay"
+ end,
AfterGameplay = function()
-- pick an evaluation screen based on settings.
if IsNetSMOnline() then
@@ -181,4 +192,4 @@ Branch = {
QuickSetupC = "ScreenQuickSetupPhaseThree",
QuickSetupD = "ScreenQuickSetupPhaseFour",
QuickSetupFinished = "ScreenQuickSetupFinished"
-}
\ No newline at end of file
+}
diff --git a/Themes/_fallback/Scripts/03 Gameplay.lua b/Themes/_fallback/Scripts/03 Gameplay.lua
index 464320ad59..d2e3afd17b 100644
--- a/Themes/_fallback/Scripts/03 Gameplay.lua
+++ b/Themes/_fallback/Scripts/03 Gameplay.lua
@@ -147,6 +147,32 @@ function FailCombo()
return Combo[sGame]
end
+function RoutineSkinP1()
+ sGame = GAMESTATE:GetCurrentGame():GetName()
+ local Combo = {
+ dance = "midi-routine-p1",
+ pump = "cmd-routine-p1",
+ beat = "default",
+ kb7 = "default",
+ para = "default",
+ guitar = "default"
+ }
+ return Combo[sGame]
+end
+
+function RoutineSkinP2()
+ sGame = GAMESTATE:GetCurrentGame():GetName()
+ local Combo = {
+ dance = "midi-routine-p2",
+ pump = "cmd-routine-p2",
+ beat = "default",
+ kb7 = "retrobar",
+ para = "default",
+ guitar = "default"
+ }
+ return Combo[sGame]
+end
+
-- todo: use tables for some of these -aj
function HoldTiming()
if GAMESTATE:GetCurrentGame():GetName() == "pump" then
diff --git a/Themes/_fallback/Scripts/03 ThemePrefs.lua b/Themes/_fallback/Scripts/03 ThemePrefs.lua
index 0bf146e460..0a61da5741 100644
--- a/Themes/_fallback/Scripts/03 ThemePrefs.lua
+++ b/Themes/_fallback/Scripts/03 ThemePrefs.lua
@@ -3,12 +3,16 @@ ThemePrefs: handles the underlying structure for ThemePrefs, so any themes
built off of this can simply declare their prefs and default values, and
access them through this system.
-v0.7: Dec. 15, 2010. Initial version.
+v0.7.1: Dec. 28, 2010. Added language support.
+v0.7.0: Dec. 15, 2010. Initial version.
+
+vyhd wrote this for sm-ssc. <3 you guys
--]]
--- If we don't have IniFile, we can't read to or write from disk
-if not IniFile then
- Warn( "ThemePrefs: IniFile missing. Can't read/write from disk :(" )
+-- local function to handle themed error strings
+-- (and to ensure we're getting all of them from the same section)
+local function GetString( name )
+ return THEME:GetString( "ThemePrefs", name )
end
function PrintTable( tbl )
@@ -74,6 +78,9 @@ ThemePrefs =
-- Only read from disk once, when _fallback calls this; we just
-- need the base set once to add prefs onto.
Init = function( prefs, bLoadFromDisk )
+ -- If we don't have IniFile, we can't read/write from/to disk
+ if not IniFile then Warn( GetString("IniFileMissing") ) end
+
Trace( ("ThemePrefs.Init(prefs, %s)"):format(tostring(bLoadFromDisk)) )
if bLoadFromDisk then
Trace( "ThemePrefs.Init: loading from disk" )
@@ -83,20 +90,20 @@ ThemePrefs =
Trace( "ThemePrefs.Init: not loading from disk" )
-- create the section if it doesn't exist
- local name = GetThemeName()
- PrefsTable[name] = PrefsTable[name] and PrefsTable[name] or { }
+ local section = GetThemeName()
+ PrefsTable[section] = PrefsTable[section] and PrefsTable[section] or { }
- Trace( "Using section " .. name )
+ Trace( "Using section " .. section )
-- if the key doesn't exist, add it with our default value
for k, tbl in pairs(prefs) do
- if not PrefsTable[name][k] then
+ if not PrefsTable[section][k] then
Trace( k .. " doesn't exist, creating" )
- PrefsTable[name][k] = tbl.Default
+ PrefsTable[section][k] = tbl.Default
end
end
- PrintTable( PrefsTable[name] )
+ PrintTable( PrefsTable[section] )
end,
Load = function()
@@ -117,7 +124,7 @@ ThemePrefs =
Trace( ("ThemePrefs.Get(%s)"):format(name) )
local tbl = ResolveTable(name)
if tbl then return tbl[name] end
- Warn( ("GetThemePref: unknown preference \"%s\""):format(name) )
+ Warn( "Get: "..GetString("UnknownPreference"):format(name) )
return nil
end,
@@ -125,7 +132,7 @@ ThemePrefs =
Trace( ("ThemePrefs.Set(%s, %s)"):format(name, tostring(value)) )
local tbl = ResolveTable(name)
if tbl then tbl[name] = value; NeedsSaved = true; return end
- Warn( ("SetThemePref: unknown preference \"%s\""):format(name) )
+ Warn( "Set: "..GetString("UnknownPreference"):format(name) )
end,
};
diff --git a/Themes/_fallback/Scripts/03 ThemePrefsRows.lua b/Themes/_fallback/Scripts/03 ThemePrefsRows.lua
index 75abf05af8..21ad8973c2 100644
--- a/Themes/_fallback/Scripts/03 ThemePrefsRows.lua
+++ b/Themes/_fallback/Scripts/03 ThemePrefsRows.lua
@@ -3,7 +3,11 @@ ThemePrefsRows: you give it the choices, values, and params, and it'll
generate the rest; quirky behavior to be outlined below. Documentation
will be provided once this system is stabilized.
-v0.5: Dec. 15, 2010. Initial version. Not very well tested.
+v0.5.2: Dec. 28, 2010. Throw an error for default/value type mismatches.
+v0.5.1: Dec. 27, 2010. Fix Choices not necessarily being strings.
+v0.5.0: Dec. 15, 2010. Initial version. Not very well tested.
+
+vyhd wrote this for sm-ssc
--]]
-- unless overridden, these parameters will be used for the OptionsRow
@@ -22,7 +26,12 @@ local DefaultParams =
SaveSelections = nil,
}
-local function DefaultLoadSelections( pref, default, choices, values )
+-- local alias to simplify error reporting
+local function GetString( name )
+ return THEME:GetString( "ThemePrefsRows", name )
+end
+
+local function DefaultLoad( pref, default, choices, values )
return function(self, list, pn)
local val = ThemePrefs.Get( pref )
@@ -36,13 +45,13 @@ local function DefaultLoadSelections( pref, default, choices, values )
if values[i] == default then list[i] = true return end
end
- -- set to the first value and throw a warning
- Warn( ("LoadSelections: preference \"%s\"'s default not in Values"):format(pref) )
+ -- set to the first value and output a warning
+ Warn( GetString("NoDefaultInValues"):format(pref) )
list[1] = true
end
end
-local function DefaultSaveSelections( pref, choices, values )
+local function DefaultSave( pref, choices, values )
local msg = "ThemePrefChanged"
local params = { Name = pref }
@@ -54,17 +63,48 @@ local function DefaultSaveSelections( pref, choices, values )
end
end
+-- This function checks for mismatches between the default value and the
+-- values table passed to the ThemePrefRow, e.g. it will return false if
+-- you have a boolean default and an integer value. I'm somewhat stricter
+-- about types than Lua is because I don't like the unpredictability and
+-- complexity of coercing values transparently in a bunch of places.
+local function TypesMatch( Values, Default )
+ local DefaultType = type(Default)
+
+ for i, value in ipairs(Values) do
+ local ValueType = type(value)
+ if ValueType ~= DefaultType then
+ Warn( GetString("TypeMismatch"):format(DefaultType, i, ValueType) )
+ return false
+ end
+ end
+
+ return true
+end
local function CreateThemePrefRow( pref, tbl )
- Trace( "CreateThemePrefRow( " .. pref .. " )" )
-
-- can't make an option handler without options
if not tbl.Choices then return nil end
local Choices = tbl.Choices
+ local Default = tbl.Default
local Values = tbl.Values and tbl.Values or Choices
local Params = tbl.Params and tbl.Params or { }
+ -- if the choices aren't strings, make them strings now
+ for i, str in ipairs(Choices) do
+ Choices[i] = tostring( Choices[i] )
+ end
+
+ -- check to see that Values and Choices have the same length
+ if #Choices ~= #Values then
+ Warn( GetString("ChoicesSizeMismatch") )
+ return nil
+ end
+
+ -- check to see that everything in Values matches the type of Default
+ if not TypesMatch( Values, Default ) then return nil end
+
-- set the name and choices here; we'll do the rest below
local Handler = { Name = pref, Choices = Choices }
@@ -77,11 +117,11 @@ local function CreateThemePrefRow( pref, tbl )
-- if we don't have LoadSelections and SaveSelections, make them
if not Handler.LoadSelections then
- Handler.LoadSelections = DefaultLoadSelections( pref, tbl.Default, Choices, Values )
+ Handler.LoadSelections = DefaultLoad( pref, Default, Choices, Values )
end
if not Handler.SaveSelections then
- Handler.SaveSelections = DefaultSaveSelections( pref, Choices, Values )
+ Handler.SaveSelections = DefaultSave( pref, Choices, Values )
end
return Handler
@@ -119,7 +159,6 @@ ThemePrefRow = ThemePrefsRows.GetRow
ThemePrefs.InitAll = function( prefs )
Trace( "ThemePrefs.InitAll( prefs )" )
- -- HACK: for now, don't worry about extraneous file I/O
ThemePrefs.Init( prefs, true )
ThemePrefsRows.Init( prefs )
end
diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini
index 87ccb3e72c..c93357f68f 100644
--- a/Themes/_fallback/metrics.ini
+++ b/Themes/_fallback/metrics.ini
@@ -108,7 +108,6 @@ CourseGroupColor7=color("1,1,1,1") -- white
CourseGroupColor8=color("1,1,1,1") -- white
CourseGroupColor9=color("1,1,1,1") -- white
CourseGroupColor10=color("1,1,1,1") -- white
-# as they say.
UnlockColor=color("1,0.5,0,1")
ExtraColor=color("#ff0000") -- red
@@ -120,7 +119,7 @@ UnlockNames=""
# 03 #
[ArrowEffects]
-# Complicated stuff you probably shouldnt ever mess with or else you'll
+# Complicated stuff you probably shouldn't ever mess with or else you'll
# destroy mods completely!
FrameWidthEffectsPixelsPerSecond=400
FrameWidthEffectsMinMultiplier=0.5
@@ -129,6 +128,42 @@ FrameWidthLockEffectsToOverlapping=false
FrameWidthLockEffectsTweenPixels=25
ArrowSpacing=128
DrawHiddenNotesAfterReceptor=true
+BlinkModFrequency=0.3333
+BoostModMinClamp=-400
+BoostModMaxClamp=400
+BrakeModMinClamp=-400
+BrakeModMaxClamp=400
+WaveModMagnitude=20
+WaveModHeight=38
+BoomerangPeakPercentage=0.75
+ExpandMultiplierFrequency=3
+ExpandMultiplierScaleFromLow=-1
+ExpandMultiplierScaleFromHigh=1
+ExpandMultiplierScaleToLow=0.75
+ExpandMultiplierScaleToHigh=1.75
+ExpandSpeedScaleFromLow=0
+ExpandSpeedScaleFromHigh=1
+ExpandSpeedScaleToLow=1
+# No need for the high here: that is already calculated in code.
+TipsyTimerFrequency=1.2
+TipsyColumnFrequency=1.8
+TipsyArrowMagnitude=0.4
+TipsyOffsetTimerFrequency=1.2
+TipsyOffsetColumnFrequency=2
+TipsyOffsetArrowMagnitude=0.4
+TornadoPositionScaleToLow=-1
+TornadoPositionScaleToHigh=1
+TornadoOffsetFrequency=6
+TornadoOffsetScaleFromLow=-1
+TornadoOffsetScaleFromHigh=1
+DrunkColumnFrequency=0.2
+DrunkOffsetFrequency=10
+DrunkArrowMagnitude=0.5
+BeatOffsetHeight=15
+BeatPIHeight=2
+MiniPercentBase=0.5
+MiniPercentGate=1
+QuantizeArrowYPosition=false
[Background]
# Background stuff. again, its usually a better idea to leave this alone
@@ -179,6 +214,7 @@ RandomCycleSpeed=0.1
Separator="-"
# ??? when it cycles.
ShowQMarksInRandomCycle=true
+QuestionMarksText="???"
RandomText="!!!"
# xxx: localize me -aj
VariousText="000"
@@ -230,9 +266,31 @@ SaveScreenshot1="MenuLeft-MenuRight"
SaveScreenshot2=""
CancelAllPlayerOptions="Left,Right,Left,Right,Left,Right"
BackInEventMode=""
+[CodeDetectorOnline]
+Fallback="CodeDetector"
+PrevSteps1="MenuUp,MenuUp"
+PrevSteps2=""
+NextSteps1="MenuDown,MenuDown"
+NextSteps2=""
+NextSort3=""
+NextSort4=""
+ModeMenu1=""
+Mirror=""
+Left=""
+Right=""
+Shuffle=""
+SuperShuffle=""
+NextScrollSpeed=""
+PreviousScrollSpeed=""
+NextAccel=""
+NextEffect=""
+NextAppearance=""
+Reverse=""
+HoldNotes=""
+CancelAll=""
[CombinedLifeMeterTug]
-# We dont use it.
+# We don't use it.
MeterWidth=0.0
MeterHeight=0.0
@@ -302,7 +360,7 @@ SortLevel5Color=color("0,1,0,1")
# something else. Mostly for custom games and game emulation, PIU for example.
# The names of which
-Names="PumpHard,PumpFreestyle,PumpNightmare,PumpHalfDouble"
+Names="PumpHard,PumpFreestyle,PumpNightmare,PumpHalfDouble,PumpRoutine"
# Names="DanceCoupleBeginner,DanceCoupleEasy,DanceCoupleMedium,DanceCoupleHard,DanceCoupleExpert,PumpHard"
# That get remapped to
@@ -350,6 +408,11 @@ PumpHalfDoubleStepsType="StepsType_Pump_Halfdouble"
PumpHalfDoubleDifficulty="Difficulty_Medium"
PumpHalfDoubleCourseType=nil
PumpHalfDoubleString="HalfDouble"
+#--#
+PumpRoutineStepsType="StepsType_Pump_Routine"
+PumpRoutineDifficulty="Difficulty_Medium"
+PumpRoutineCourseType=nil
+PumpRoutineString="Routine"
#
# Difficulty_Beginner-StepsType_Pump_Single=Easy
# Difficulty_Easy-StepsType_Pump_Single=Normal
@@ -685,6 +748,7 @@ WarningBeepStart=10
# MaxStallSeconds=7.5
MaxStallSeconds=0
#
+HurryUpTransition=5.5
Text1OnCommand=stopeffect;stoptweening;shadowlength,0;
Text1FormatFunction=function(fSeconds) fSeconds=math.min( 99, math.ceil(fSeconds) ); local digit = math.floor(fSeconds); return ""..digit end
Text2OnCommand=stopeffect;stoptweening;shadowlength,0;visible,false
@@ -753,6 +817,10 @@ SectionColor1=color("1,1,1,1")
#
SongRealExtraColor=color("1,0,0,1")
SortMenuColor=color("1,1,1,1")
+#
+RouletteColor=color("1,0,0,1")
+RandomColor=color("1,0,0,1")
+PortalColor=color("1,0,0,1")
SortOrders={ "SortOrder_Preferred", "SortOrder_Group", "SortOrder_Title", "SortOrder_BPM", "SortOrder_Artist", "SortOrder_Genre" }
# SortOrders={ "SortOrder_Preferred", "SortOrder_Group", "SortOrder_Title", "SortOrder_BPM", "SortOrder_Popularity", "SortOrder_Artist", "SortOrder_Genre" }
@@ -862,14 +930,33 @@ ShowBoard=false
ShowBeatBars=false
#
FadeBeforeTargetsPercent=0
+FadeFailTime=1.5
#
BarMeasureAlpha=1
Bar4thAlpha=1
Bar8thAlpha=1
Bar16thAlpha=1
#
-RoutineNoteSkinP1="midi-routine-p1"
-RoutineNoteSkinP2="midi-routine-p2"
+RoutineNoteSkinP1=RoutineSkinP1()
+RoutineNoteSkinP2=RoutineSkinP2()
+#
+BPMColor=color("1,0,0,1")
+StopColor=color("0.8,0.8,0,1")
+DelayColor=color("0,0.8,0.8,1")
+TimeSignatureColor=color("1,0.55,0,1")
+TickcountColor=color("0,1,0,1")
+#
+BPMIsLeftSide=true
+StopIsLeftSide=true
+DelayIsLeftSide=true
+TimeSignatureIsLeftSide=true
+TickcountIsLeftSide=false
+#
+BPMOffsetX=60
+StopOffsetX=10
+DelayOffsetX=10
+TimeSignatureOffsetX=30
+TickcountOffsetX=10
[PlayerStageStats]
# Original CVS Grading
@@ -915,7 +1002,9 @@ ComboUnderField=ComboUnderField()
PenalizeTapScoreNone=false
JudgeHoldNotesOnSameRowTogether=(GAMESTATE:GetCurrentGame():GetName() == "pump")
HoldCheckpoints=(GAMESTATE:GetCurrentGame():GetName() == "pump")
-CheckpointsUseTimeSignatures=(GAMESTATE:GetCurrentGame():GetName() == "pump")
+CheckpointsUseTickcounts=(GAMESTATE:GetCurrentGame():GetName() == "pump")
+; deprecated?
+CheckpointsUseTimeSignatures=false
CheckpointsTapsSeparateJudgment=CheckpointsTapsSeparateJudgment()
CheckpointsFlashOnHold=false
ImmediateHoldLetGo=ImmediateHoldLetGo()
@@ -927,6 +1016,18 @@ MaxHoldLife=MaxHoldLife()
RollBodyIncrementsCombo=GetGamePrefB("UserPrefComboOnRolls")
ScoreMissedHoldsAndRolls=ScoreMissedHoldsAndRolls()
PercentUntilColorCombo=0.25
+ComboStoppedAt=50
+AttackRunTimeRandom=6
+AttackRunTimeMine=7
+
+[PlayerOptions]
+RandomSpeedChance=0.2
+RandomReverseChance=0.2
+RandomDarkChance=0.1
+RandomAccelChance=0.333
+RandomEffectChance=0.667
+RandomHiddenChance=0.05
+RandomSuddenChance=0.1
[PlayerShared]
Fallback="Player"
@@ -1187,12 +1288,17 @@ AfterSetCommand=%TextBannerAfterSet
[WheelNotifyIcon]
ShowTraining=false
+BlinkPlayersBest=true
# 04 #
[Screen]
ScreenInitCommand=
ScreenOnCommand=
AllowOperatorMenuButton=true
+# This metric is only for people who know what they are doing. If you set this
+# to false, you are expected to know how to cancel screens in Lua. (coincidentally,
+# that would be SCREENMAN:GetTopScreen():Cancel(), for people who aren't AJ ;) )
+HandleBackButton=true
RepeatRate=-1
RepeatDelay=-1
PrepareScreens=
@@ -1808,6 +1914,7 @@ Codes=""
#
TimerSeconds=60
DoRouletteOnMenuTimer=true
+RouletteTimerSeconds=15
#
DefaultSort=GAMESTATE:IsCourseMode() and "Group" or "AllCourses"
#
@@ -1948,7 +2055,7 @@ Fallback="StepsDisplay"
Class="ScreenSplash"
Fallback="ScreenSplash"
#
-NextScreen="ScreenGameplay"
+NextScreen=Branch.GameplayScreen()
PrevScreen=Branch.BackOutOfStageInformation()
PrepareScreen="ScreenGameplay"
#
@@ -2550,13 +2657,13 @@ ShowExitRow=true
[ScreenTestInput]
Class="ScreenTestInput"
Fallback="ScreenOptionsServiceChild"
-NextScreen="ScreenOptionsService"
-PrevScreen="ScreenOptionsService"
+NextScreen="ScreenOptionsExtended"
+PrevScreen="ScreenOptionsExtended"
[ScreenOptionsSystemDirection]
Fallback="ScreenOptionsServiceChild"
-PrevScreen=Branch.TitleMenu()
-NextScreen=Branch.TitleMenu()
+PrevScreen="ScreenOptionsService"
+NextScreen="ScreenOptionsService"
LineNames="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22"
Line1="conf,Windowed"
Line2="conf,DisplayResolution"
@@ -2583,6 +2690,8 @@ Line22="conf,EventMode"
[ScreenOptionsGraphicsSound]
Fallback="ScreenOptionsServiceChild"
+NextScreen="ScreenOptionsExtended"
+PrevScreen="ScreenOptionsExtended"
LineNames="1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,18,19,20"
Line1="conf,Windowed"
Line2="conf,DisplayResolution"
@@ -2607,6 +2716,8 @@ Line20="conf,VisualDelaySeconds"
[ScreenOptionsAdvanced]
Fallback="ScreenOptionsServiceChild"
+NextScreen="ScreenOptionsExtended"
+PrevScreen="ScreenOptionsExtended"
LineNames="2,3,4,8,11,13,14,15,16,28,29,30"
Line2="conf,ScoringType"
Line3="conf,TimingWindowScale"
@@ -2630,6 +2741,8 @@ Line30="conf,FastLoad"
[ScreenAppearanceOptions]
Fallback="ScreenOptionsServiceChild"
+NextScreen="ScreenOptionsExtended"
+PrevScreen="ScreenOptionsExtended"
LineNames="1,2,3,4,5,14,15,17,18,19"
Line1="conf,Language"
Line2="conf,Announcer"
@@ -2646,6 +2759,8 @@ Line19="conf,NumBackgrounds"
# user interface options that aren't related to themes, etc.
# (some don't get used/modified too often)
Fallback="ScreenOptionsServiceChild"
+NextScreen="ScreenOptionsExtended"
+PrevScreen="ScreenOptionsExtended"
LineNames="1,3,4,6,7,9,10,11,12,14"
Line1="conf,Center1Player"
Line3="conf,DancePointsForOni"
@@ -2665,7 +2780,8 @@ Line14="conf,ShowSongOptions"
[ScreenOptionsInput]
Fallback="ScreenOptionsServiceChild"
-# should we put map/test input in this section too?
+NextScreen="ScreenOptionsExtended"
+PrevScreen="ScreenOptionsExtended"
LineNames="1,2,3,4,5"
Line1="conf,AutoMapOnJoyChange"
Line2="conf,OnlyDedicatedMenuButtons"
@@ -2674,8 +2790,10 @@ Line4="conf,ArcadeOptionsNavigation"
Line5="conf,MusicWheelSwitchSpeed"
[ScreenOptionsArcade]
-# shit that's tied to arcade features
Fallback="ScreenOptionsServiceChild"
+NextScreen="ScreenOptionsExtended"
+PrevScreen="ScreenOptionsExtended"
+# stuff tied to arcade features
LineNames="1,2,3,4,5,6"
Line1="conf,GetRankingName"
Line2="conf,CoinMode"
@@ -3350,7 +3468,7 @@ Line4="gamecommand;screen,ScreenOptionsManageCourses;name,Edit Courses"
EditMode="EditMode_Full"
ShowGroups=true
-Arrows1X=SCREEN_CENTER_X-130
+Arrows1X=SCREEN_CENTER_X-176
Arrows2X=SCREEN_CENTER_X+270
ArrowsEnabledCommand=diffuse,color("1,1,1,1");shadowlengthy,1;shadowcolor,color("#002740");
ArrowsDisabledCommand=diffuse,color("0.45,0.45,0.45,1");shadowlengthy,1;shadowcolor,color("#002740");
@@ -3364,12 +3482,12 @@ SongBannerY=SCREEN_CENTER_Y-90
SongBannerOnCommand=scaletoclipped,128,40
TextBannerType="TextBannerEditMode"
-SongTextBannerX=SCREEN_CENTER_X-64
+SongTextBannerX=SCREEN_CENTER_X-128
SongTextBannerY=SCREEN_CENTER_Y-90
-StepsDisplayX=SCREEN_CENTER_X+170
+StepsDisplayX=SCREEN_CENTER_X+150
StepsDisplayY=SCREEN_CENTER_Y-0
-StepsDisplaySourceX=SCREEN_CENTER_X+170
+StepsDisplaySourceX=SCREEN_CENTER_X+150
StepsDisplaySourceY=SCREEN_CENTER_Y+80
Row1Y=SCREEN_CENTER_Y-140
@@ -3381,60 +3499,60 @@ Row6Y=SCREEN_CENTER_Y+80
Row7Y=SCREEN_CENTER_Y+120
Label1X=SCREEN_CENTER_X-250
-Label1Y=THEME:GetMetric("EditMode","Row1Y")
+Label1Y=THEME:GetMetric("EditMenu","Row1Y")
Label1OnCommand=shadowlength,1;zoom,0.75
Label1OffCommand=
Label2X=SCREEN_CENTER_X-250
-Label2Y=THEME:GetMetric("EditMode","Row2Y")
+Label2Y=THEME:GetMetric("EditMenu","Row2Y")
Label2OnCommand=shadowlength,1;zoom,0.75
Label2OffCommand=
Label3X=SCREEN_CENTER_X-250
-Label3Y=THEME:GetMetric("EditMode","Row3Y")
+Label3Y=THEME:GetMetric("EditMenu","Row3Y")
Label3OnCommand=shadowlength,1;zoom,0.75
Label3OffCommand=
Label4X=SCREEN_CENTER_X-250
-Label4Y=THEME:GetMetric("EditMode","Row4Y")
+Label4Y=THEME:GetMetric("EditMenu","Row4Y")
Label4OnCommand=shadowlength,1;zoom,0.75
Label4OffCommand=
Label5X=SCREEN_CENTER_X-250
-Label5Y=THEME:GetMetric("EditMode","Row5Y")
+Label5Y=THEME:GetMetric("EditMenu","Row5Y")
Label5OnCommand=shadowlength,1;zoom,0.75
Label5OffCommand=
Label6X=SCREEN_CENTER_X-250
-Label6Y=THEME:GetMetric("EditMode","Row6Y")
+Label6Y=THEME:GetMetric("EditMenu","Row6Y")
Label6OnCommand=shadowlength,1;zoom,0.75
Label6OffCommand=
Label7X=SCREEN_CENTER_X-250
-Label7Y=THEME:GetMetric("EditMode","Row7Y")
+Label7Y=THEME:GetMetric("EditMenu","Row7Y")
Label7OnCommand=shadowlength,1;zoom,0.75
Label7OffCommand=
-Value1X=SCREEN_CENTER_X
-Value1Y=THEME:GetMetric("EditMode","Row1Y")
+Value1X=SCREEN_CENTER_X-24
+Value1Y=THEME:GetMetric("EditMenu","Row1Y")
Value1OnCommand=shadowlength,1;zoom,0.75;maxwidth,SCREEN_CENTER_X*0.65
Value1OffCommand=
Value2X=SCREEN_CENTER_X+60
-Value2Y=THEME:GetMetric("EditMode","Row2Y")
+Value2Y=THEME:GetMetric("EditMenu","Row2Y")
Value2OnCommand=shadowlength,1;zoom,0.75;maxwidth,SCREEN_CENTER_X*0.65
Value2OffCommand=
Value3X=SCREEN_CENTER_X+60
-Value3Y=THEME:GetMetric("EditMode","Row3Y")
+Value3Y=THEME:GetMetric("EditMenu","Row3Y")
Value3OnCommand=shadowlength,1;zoom,0.75;maxwidth,SCREEN_CENTER_X*0.65
Value3OffCommand=
Value4X=SCREEN_CENTER_X
-Value4Y=THEME:GetMetric("EditMode","Row4Y")
+Value4Y=THEME:GetMetric("EditMenu","Row4Y")
Value4OnCommand=shadowlength,1;zoom,0.75;maxwidth,SCREEN_CENTER_X*0.65
Value4OffCommand=
Value5X=SCREEN_CENTER_X+60
-Value5Y=THEME:GetMetric("EditMode","Row5Y")
+Value5Y=THEME:GetMetric("EditMenu","Row5Y")
Value5OnCommand=shadowlength,1;zoom,0.75;maxwidth,SCREEN_CENTER_X*0.65
Value5OffCommand=
Value6X=SCREEN_CENTER_X
-Value6Y=THEME:GetMetric("EditMode","Row6Y")
+Value6Y=THEME:GetMetric("EditMenu","Row6Y")
Value6OnCommand=shadowlength,1;zoom,0.75;maxwidth,SCREEN_CENTER_X*0.65
Value6OffCommand=
Value7X=SCREEN_CENTER_X+60
-Value7Y=THEME:GetMetric("EditMode","Row7Y")
+Value7Y=THEME:GetMetric("EditMenu","Row7Y")
Value7OnCommand=shadowlength,1;zoom,0.75;maxwidth,SCREEN_CENTER_X*0.65
Value7OffCommand=
@@ -3445,7 +3563,7 @@ Fallback="TextBanner"
Fallback="ScreenWithMenuElements"
Class="ScreenEditMenu"
NextScreen="ScreenEdit"
-PrevScreen=Branch.TitleMenu()
+PrevScreen="ScreenOptionsEdit"
EditMenuType="EditMenu"
ExplanationX=SCREEN_CENTER_X
ExplanationY=SCREEN_BOTTOM-56
@@ -3489,6 +3607,7 @@ Fallback="ScreenEditMenu"
Class="ScreenEditMenu"
#
NextScreen="ScreenPractice"
+PrevScreen="ScreenOptionsEdit"
EditMenuType="PracticeMenu"
[PracticeMenu]
@@ -3539,6 +3658,26 @@ Fallback="StepsDisplay"
Fallback="ScreenMiniMenu"
ColorDisabled=color("1,1,1,1")
RowInitCommand=halign,0.5;valign,0.5;zoom,0.8;x,75;y,45;shadowlength,1
+OptionRowNormalMetricsGroup="OptionRowMiniMenuEditHelp"
+
+[OptionRowMiniMenuEditHelp]
+Fallback="OptionRowMiniMenu"
+
+TitleX=SCREEN_CENTER_X-312
+TitleOnCommand=halign,0;strokecolor,color("#222222CC");shadowlength,1;zoom,0.9
+
+RowPositionTransformFunction=function(self,offsetFromCenter,itemIndex,numItems) \
+ local indexOffset = itemIndex-(numItems-1)/2; \
+ self:y(SCREEN_CENTER_Y + indexOffset * 20); \
+end
+
+ItemsStartX=SCREEN_CENTER_X+260
+ItemsEndX=SCREEN_CENTER_X+260
+ItemsLongRowP1X=SCREEN_CENTER_X+260
+ItemsLongRowP2X=SCREEN_CENTER_X+260
+
+ItemOnCommand=x,SCREEN_CENTER_X+176;halign,0;strokecolor,color("#222222CC");shadowlength,1;zoom,0.9
+ColorDisabled=color("1,1,1,1")
[ScreenMiniMenuMainMenu]
Fallback="ScreenMiniMenu"
@@ -3553,6 +3692,9 @@ Fallback="ScreenMiniMenu"
[ScreenMiniMenuSongInformation]
Fallback="ScreenMiniMenu"
+[ScreenMiniMenuTimingDataInformation]
+Fallback="ScreenMiniMenu"
+
[ScreenMiniMenuBackgroundChange]
Fallback="ScreenMiniMenu"
@@ -3640,8 +3782,8 @@ OptionRowNormalMetricsGroup="OptionRowCourseOverview"
[ScreenGameplaySyncMachine]
Class="ScreenGameplaySyncMachine"
Fallback="ScreenGameplay"
-PrevScreen="ScreenOptionsService"
-NextScreen="ScreenOptionsService"
+PrevScreen="ScreenOptionsExtended"
+NextScreen="ScreenOptionsExtended"
PlayerType="PlayerSyncMachine"
AllowCenter1Player=false
@@ -3735,6 +3877,7 @@ PrevScreen="ScreenNetRoom"
NextScreen="ScreenStageInformation"
NoSongsScreen=Branch.TitleMenu()
RoomSelectScreen="ScreenNetRoom"
+Codes="CodeDetectorOnline"
ShowStyleIcon=false
TimerSeconds=
@@ -3742,21 +3885,19 @@ TimerStealth=true
SampleMusicPreviewMode='SampleMusicPreviewMode_Normal'
-# huh? (probably leftovers from the old NetSelectBase)
-NumStylesShow=1
-NumSongsShow=4
-NumGroupsShow=3
-
+MusicWheelType="OnlineMusicWheel"
MusicWheelX=SCREEN_CENTER_X+160
MusicWheelY=SCREEN_CENTER_Y
MusicWheelOnCommand=
MusicWheelOffCommand=
+# todo: move these to Lua bganim
BPMDisplayX=SCREEN_CENTER_X-160-90+2
BPMDisplayY=SCREEN_TOP+160+(36/2)+8
BPMDisplayOnCommand=
BPMDisplayOffCommand=
+# todo: move these to Lua bganim
ModIconsP1X=SCREEN_CENTER_X+144
ModIconsP1Y=SCREEN_CENTER_Y-165
ModIconsP1OnCommand=zoomy,0;linear,0.5;zoomy,1
@@ -3766,11 +3907,13 @@ ModIconsP2Y=SCREEN_CENTER_Y-164
ModIconsP2OnCommand=zoomy,0;linear,0.5;zoomy,1
ModIconsP2OffCommand=linear,0.5;zoomy,0
-optionsY=SCREEN_CENTER_Y-170
+# are these used?
optionsX=SCREEN_CENTER_X-240
+optionsY=SCREEN_CENTER_Y-170
optionsOnCommand=zoomx,0.0;zoomy,0.0;linear,0.5;zoomy,0.7;zoomx,0.7
optionsOffCommand=linear,0.5;zoomx,0.0;zoomy,0.0
+# uses StepsDisplayNet
StepsDisplayP1X=SCREEN_CENTER_X-223
StepsDisplayP1Y=SCREEN_CENTER_Y+150
StepsDisplayP1OnCommand=halign,1;zoomx,0.0;zoomy,0.0;linear,0.5;zoomy,1.0;zoomx,1.0
@@ -3781,24 +3924,8 @@ StepsDisplayP2Y=SCREEN_CENTER_Y+150
StepsDisplayP2OnCommand=halign,1;zoomx,0.0;zoomy,0.0;linear,0.5;zoomy,1.0;zoomx,1.0
StepsDisplayP2OffCommand=linear,0.5;zoomx,0.0;zoomy,0.0
-DiffBGX=SCREEN_CENTER_X-60
-DiffBGY=SCREEN_CENTER_Y+160
-DiffBGOnCommand=zoomz,0.0;zoomy,0.0;linear,0.5;zoomy,1.0;zoomx,1.0
-DiffBGOffCommand=linear,0.5;zoomx,0.0;zoomy,0.0
-DiffBGWidth=0
-DiffBGHeight=0
-DiffBGColor=color("0.7,0.7,0.7,0.7")
-
-DifficultyIconP1OnCommand=visible,false
-DifficultyIconP1OffCommand=
-DifficultyIconP2OnCommand=visible,false
-DifficultyIconP2OffCommand=
-DifficultyIconP1X=SCREEN_CENTER_X+50
-DifficultyIconP1Y=SCREEN_BOTTOM-54
-DifficultyIconP2X=SCREEN_CENTER_X+80
-DifficultyIconP2Y=SCREEN_BOTTOM-50
-
-HelpText=Screen.String("HelpTextNetSelectMusic");
+[StepsDisplayNet]
+Fallback="StepsDisplay"
[ScreenNetRoom]
Class="ScreenNetRoom"
@@ -3828,14 +3955,13 @@ CreateRoomColor=color("0.0,0.9,0.25,1.0")
ScrollBarOnCommand=visible,false
[RoomWheelItem]
-TextOnCommand=zoom,0.6;strokecolor,color("#000000FF")
TextX=-110
TextY=-8
-TextWidth=200
-DescX=-100
-DescY=6
-DescOnCommand=zoom,0.4;strokecolor,color("#000000FF")
-DescWidth=400
+TextOnCommand=halign,0;zoom,0.6;maxwidth,200;strokecolor,color("#000000FF");
+
+DescriptionX=-100
+DescriptionY=6
+DescriptionOnCommand=halign,0;zoom,0.4;maxwidth,400;strokecolor,color("#000000FF")
[RoomInfoDisplay]
RoomInfoDisplayOnCommand=diffuse,color("1.0,1.0,1.0,1");x,SCREEN_WIDTH+130;y,250;bounceend,0.5;x,SCREEN_WIDTH-160
@@ -3971,6 +4097,7 @@ LifeMeterBarY=SCREEN_TOP+40
LifeMeterBarOnCommand=addy,-60;sleep,2.4;linear,0.2;addy,60
#
UseCharacter=true
+CharacterName=""
CharacterX=SCREEN_CENTER_X-200
CharacterY=SCREEN_CENTER_Y+160
CharacterOnCommand=zoom,20;addy,-SCREEN_WIDTH;sleep,3.0;decelerate,0.4;addy,SCREEN_WIDTH
diff --git a/Themes/default/BGAnimations/ScreenEdit background.lua b/Themes/default/BGAnimations/ScreenEdit background.lua
index 3573893d03..c24f3b6ab5 100644
--- a/Themes/default/BGAnimations/ScreenEdit background.lua
+++ b/Themes/default/BGAnimations/ScreenEdit background.lua
@@ -10,6 +10,22 @@ t[#t+1] = Def.ActorFrame {
LoadActor( THEME:GetPathB("ScreenWithMenuElements","background/_bg top") ) .. {
InitCommand=cmd(scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT);
};
+ Def.Quad{
+ InitCommand=cmd(scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,color("0.2,0.2,0.2,0"));
+ OnCommand=function(self)
+ local topScreen = SCREENMAN:GetTopScreen()
+ if topScreen then
+ local screenName = topScreen:GetName()
+ if screenName == "ScreenEdit" or screenName == "ScreenPractice" then
+ self:diffusealpha(0.325)
+ else
+ self:diffusealpha(0)
+ end;
+ end;
+ end;
+ EditorShowMessageCommand=cmd(stoptweening;linear,0.5;diffusealpha,0.75);
+ EditorHideMessageCommand=cmd(stoptweening;linear,0.5;diffusealpha,0.325);
+ };
};
return t;
diff --git a/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua b/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua
index 1fd781998c..896a1e535c 100644
--- a/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua
+++ b/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua
@@ -165,4 +165,11 @@ t[#t+1] = Def.ActorFrame {
};
CreateStops();
};
-return t
\ No newline at end of file
+if PREFSMAN:GetPreference("ScoringType") == 'ScoringType_Custom' then
+ t[#t+1] = Def.Actor{
+ JudgmentMessageCommand = function(self, params)
+ SpecialScoring[GetUserPref("UserPrefSpecialScoringMode")](params, STATSMAN:GetCurStageStats():GetPlayerStageStats(params.Player))
+ end;
+ };
+end;
+return t
diff --git a/Themes/default/Graphics/ScreenEvaluation SongInformation.lua b/Themes/default/Graphics/ScreenEvaluation SongInformation.lua
new file mode 100644
index 0000000000..35a84238c7
--- /dev/null
+++ b/Themes/default/Graphics/ScreenEvaluation SongInformation.lua
@@ -0,0 +1,20 @@
+return Def.ActorFrame {
+ LoadFont("Common Normal") .. {
+ Name="TextTitle";
+ InitCommand=cmd(y,-16.5;zoom,0.875;maxwidth,256/0.875;);
+ OnCommand=cmd(shadowlength,1);
+-- TickCommand=cmd(finishtweening;diffusealpha,0;addx,-10;zoomx,1.25;zoomy,0;decelerate,0.25;diffusealpha,1;addx,10;zoom,1;sleep,0;glow,Color("White");decelerate,0.275;glow,Color("Invisible"));
+ };
+ LoadFont("Common Normal") .. {
+ Name="TextSubtitle";
+ InitCommand=cmd(zoom,0.5;maxwidth,256/0.5);
+ OnCommand=cmd(shadowlength,1);
+-- TickCommand=cmd(finishtweening;diffusealpha,0;addy,-10;addx,10;decelerate,0.25;diffusealpha,1;addy,10;addx,-10);
+ };
+ LoadFont("Common Normal") .. {
+ Name="TextArtist";
+ InitCommand=cmd(y,18;zoom,0.75;maxwidth,256/0.75);
+ OnCommand=cmd(shadowlength,1;skewx,-0.2);
+-- TickCommand=cmd(finishtweening;diffusealpha,0;addy,10;addx,10;decelerate,0.25;diffusealpha,1;addy,-10;addx,-10);
+ };
+};
\ No newline at end of file
diff --git a/Themes/default/Languages/en.ini b/Themes/default/Languages/en.ini
index 1ec0d82f11..1fc98403a2 100644
--- a/Themes/default/Languages/en.ini
+++ b/Themes/default/Languages/en.ini
@@ -60,6 +60,7 @@ LifeDifficulty=Life Difficulty: %s
TimingDifficulty=Timing Difficulty: %s
[OptionTitles]
GamePrefAutoSetStyle=Auto Set Style
+UserPrefSpecialScoringMode=Special Scoring Mode
GamePrefNotePosition=Note Positions
GamePrefComboOnRolls=Rolls Increment Combo
GamePrefComboUnderField=Combo Under Field
@@ -78,10 +79,33 @@ GamePrefComboUnderField=Determine if the combo should display under the notes or
GamePrefAdjustSpeed=Adjust the default scale for speed modifiers. Normal corresponds to the original StepMania 3.9 speed, Fast is twice that rate.
UserPrefGameplayShowScore=Show or Hide the score display in gameplay.
+UserPrefSpecialScoringMode=Select the scoring mode to be used if the Special scoring type is selected.
UserPrefGameplayShowStepsDisplay=Show or Hide the step information display in gameplay.
UserPrefShowLotsaOptions=Choose how many lines/rows of options to choose from. &oq;Few&cq; keeps the list to a minimum. &oq;Many&cq; adds various show-off mods.
UserPrefLongFail=Choose between the original sm-ssc fail (Long) or the new sm-ssc fail (Short).
UserPrefFlashyCombo=Determine if combo flashes should be shown or not.
+ScoringType=Defines which scoring method to use. If Special is selected, you can select a Special Scoring Mode in Theme Options.
+
+Speed=Adjust the speed at which arrows travel toward the targets.
+Accel=Change the way arrows approach the targets.
+Effect=Change the size or movement of the arrows and/or targets.
+Appearance=Control the visibilty of the arrows.
+Turn=Change the step choreography by adjusting the position of arrows.
+Insert=Add tap notes to the step choreography.
+Holds=Turn some tap notes into hold notes.
+Mines=Add or remove mine notes.
+PlayerAutoPlay=Have the notefield play by itself.
+ScoreDisplay=Change the way your score is shown.
+ProTiming=Change the way your judgments are shown.
+Scroll=Adjust the direction arrows flow to meet the targets.
+NoteSkins=Choose a different appearance for the arrows.
+Handicap=Removes notes. Using these will invalidate a high score.
+Hide=Adjust the visibility of the targets.
+Persp=Change the viewing angle of the arrow stream.
+Steps=Adjust the difficulty of the steps.
+Characters=Dancing buddies.
+SaveToProfileHelp=Requires profile or memory card.
+MusicRateHelp=Play the music at a faster rate.
[StepsListDisplayRow StepsType]
Dance_Single=4
Dance_Double=8
@@ -109,8 +133,8 @@ Maniax_Double=MD
Techno_Single4=4
Techno_Single5=5
Techno_Single8=8
-Techno_Double4=4
-Techno_Double5=5
+Techno_Double4=D4
+Techno_Double5=D5
Pnm_Five=5
Pnm_Nine=9
Guitar_Five=5
@@ -129,4 +153,7 @@ Explanation-WhereToFind=Launches a web page with information on finding songs fo
Explanation-HowToInstall=Launches a web page with song installation instructions.
Explanation-AdditionalFolders=If you have other installs of StepMania, you can use the AdditionalFolders preferences to load it into sm-ssc.
Explanation-ReloadSongs=Reload the songs. This is required if you've added/changed/deleted songs while sm-ssc is running.
-Explanation-Exit=Return to the title menu.
\ No newline at end of file
+Explanation-Exit=Return to the title menu.
+
+[OptionNames]
+Custom=Special
diff --git a/Themes/default/Other/ScreenGameplaySyncMachine music.sm b/Themes/default/Other/ScreenGameplaySyncMachine music.sm
index 04761e58f0..4e31da0de3 100644
--- a/Themes/default/Other/ScreenGameplaySyncMachine music.sm
+++ b/Themes/default/Other/ScreenGameplaySyncMachine music.sm
@@ -96,3 +96,80 @@
1000
0001
;
+
+//---------------dance-single - blank----------------
+#NOTES:
+ pump-single:
+ blank:
+ Beginner:
+ 1:
+ 0.302,0.205,0.000,0.000,0.000:
+ // measure 1
+00000
+00000
+00000
+00000
+, // measure 2
+10000
+00001
+10000
+00001
+10000
+00001
+10000
+00001
+, // measure 3
+10000
+00001
+10000
+00001
+10000
+00001
+10000
+00001
+, // measure 4
+10000
+00001
+10000
+00001
+10000
+00001
+10000
+00001
+, // measure 5
+10000
+00001
+10000
+00001
+10000
+00001
+10000
+00001
+, // measure 6
+10000
+00001
+10000
+00001
+10000
+00001
+10000
+00001
+, // measure 7
+10000
+00001
+10000
+00001
+10000
+00001
+10000
+00001
+, // measure 8
+10000
+00001
+10000
+00001
+10000
+00001
+10000
+00001
+;
diff --git a/Themes/default/Other/ScreenHowToPlay steps.sm b/Themes/default/Other/ScreenHowToPlay steps.sm
index 5cf0a1c9af..3758bfa8de 100644
--- a/Themes/default/Other/ScreenHowToPlay steps.sm
+++ b/Themes/default/Other/ScreenHowToPlay steps.sm
@@ -6,7 +6,7 @@
// a song file here.
#TITLE:ScreenHowToPlay steps;
#ARTIST:foo;
-#BPMS:0.000=100.000
+#BPMS:0.000=100.000;
#STOPS:16=2,18=2,20=2,22=2;
#NOTES:
diff --git a/Themes/default/Scripts/03 ThemePrefs.lua b/Themes/default/Scripts/03 ThemePrefs.lua
index a5889c1d24..526b6ca897 100644
--- a/Themes/default/Scripts/03 ThemePrefs.lua
+++ b/Themes/default/Scripts/03 ThemePrefs.lua
@@ -21,6 +21,9 @@ function InitUserPrefs()
if GetUserPref("UserPrefGameplayShowScore") == nil then
SetUserPref("UserPrefGameplayShowScore", false);
end;
+ if GetUserPref("UserPrefSpecialScoringMode") == nil then
+ SetUserPref("UserPrefSpecialScoringMode", 'DDR 1st Mix');
+ end;
if GetUserPrefB("UserPrefShowLotsaOptions") == nil then
SetUserPref("UserPrefShowLotsaOptions", true);
end;
@@ -230,6 +233,34 @@ function UserPrefShowLotsaOptions()
return t;
end
+function UserPrefSpecialScoringMode()
+ local baseChoices = { 'DDR 1stMIX', 'DDR 4thMIX', 'DDR SuperNOVA', 'DDR SuperNOVA 2', 'MIGS' }; --'[SSC] Radar Master'
+ local t = {
+ Name = "UserPrefSpecialScoringMode";
+ LayoutType = "ShowAllInRow";
+ SelectType = "SelectOne";
+ OneChoiceForAllPlayers = true;
+ ExportOnChange = false;
+ Choices = baseChoices;
+ LoadSelections = function(self, list, pn)
+ if ReadPrefFromFile("UserPrefSpecialScoringMode") ~= nil then
+ local theValue = ReadPrefFromFile("UserPrefSpecialScoringMode");
+ local success = false;
+ for k,v in ipairs(baseChoices) do if v == theValue then list[k] = true success = true break end end;
+ if success == false then list[1] = true end;
+ else
+ WritePrefToFile("UserPrefSpecialScoringMode", 'DDR 1stMIX');
+ list[1] = true;
+ end;
+ end;
+ SaveSelections = function(self, list, pn)
+ for k,v in ipairs(list) do if v then WritePrefToFile("UserPrefSpecialScoringMode", baseChoices[k]) break end end;
+ end;
+ };
+ setmetatable( t, t );
+ return t;
+end
+
function GetDefaultOptionLines()
local LineSets = {
"1,8,14,2,3,4,5,6,R,7,9,10,11,12,13,15,16,17,18", -- All
diff --git a/Themes/default/Scripts/04 SpecialScoring.lua b/Themes/default/Scripts/04 SpecialScoring.lua
new file mode 100644
index 0000000000..2f24ebff05
--- /dev/null
+++ b/Themes/default/Scripts/04 SpecialScoring.lua
@@ -0,0 +1,157 @@
+--Special Scoring types.
+local r = {};
+local DisabledScoringModes = { 'DDR Extreme', '[SSC] Radar Master' };
+--the following metatable makes any missing value in a table 0 instead of nil.
+local ZeroIfNotFound = { __index = function() return 0 end; };
+
+-- Retrieve the amount of taps/holds/rolls involved. Used for some formulas.
+function GetTotalItems(radars)
+ return radars:GetValue('RadarCategory_TapsAndHolds')
+ + radars:GetValue('RadarCategory_Holds')
+ + radars:GetValue('RadarCategory_Rolls');
+end;
+
+-- Determine whether marvelous timing is to be considered.
+function IsW1Allowed(tapScore)
+ return tapScore == 'TapNoteScore_W2'
+ and (PREFSMAN:GetPreference("AllowW1") ~= 'AllowW1_Never'
+ or not (GAMESTATE:IsCourseMode() and
+ PREFSMAN:GetPreference("AllowW1") == 'AllowW1_CoursesOnly'));
+end;
+
+-- Get the radar values directly. The individual steps aren't used much.
+function GetDirectRadar(player)
+ return GAMESTATE:GetCurrentSteps(player):GetRadarValues(player);
+end;
+
+-----------------------------------------------------------
+--DDR 1st Mix and 2nd Mix Scoring
+-----------------------------------------------------------
+r['DDR 1stMIX'] = function(params, pss)
+ local dCombo = math.floor((pss:GetCurrentCombo()+1)/4);
+ local bScore = (dCombo^2+1) * 100;
+ local multLookup = { ['TapNoteScore_W1']=3, ['TapNoteScore_W2']=3, ['TapNoteScore_W3']=1 };
+ setmetatable(multLookup, ZeroIfNotFound);
+ --if score increases above the boundaries of a 32-bit signed
+ --(about 2.15 billion), it stops increasing. Conveniently,
+ --1st Mix clamped score as well.
+ pss:SetScore(clamp(pss:GetScore()+(bScore*multLookup[params.TapNoteScore]),0,999999999));
+end;
+-----------------------------------------------------------
+--DDR 4th Mix/Extra Mix/Konamix/GB3/DDRPC Scoring
+-----------------------------------------------------------
+r['DDR 4thMIX'] = function(params, pss)
+ local scoreLookupTable = { ['TapNoteScore_W1']=777, ['TapNoteScore_W2']=777, ['TapNoteScore_W3']=555 };
+ setmetatable(scoreLookupTable, ZeroIfNotFound);
+ local comboBonusForThisStep = (pss:GetCurrentCombo()+1)*333;
+ pss:SetScore(clamp(pss:GetScore()+scoreLookupTable[params.TapNoteScore]+(scoreLookupTable[params.TapNoteScore] and comboBonusForThisStep or 0),0,999999999));
+end;
+-----------------------------------------------------------
+--DDR MAX2/Extreme Scoring
+--This scoring system doesn't work and is locked out.
+-----------------------------------------------------------
+r['DDR Extreme'] = function(params, pss)
+ local judgmentBase = {
+ ['TapNoteScore_W1'] = 10,
+ ['TapNoteScore_W2'] = 9,
+ ['TapNoteScore_W3'] = 5
+ };
+ setmetatable(judgmentBase, ZeroIfNotFound);
+ local steps = GAMESTATE:GetCurrentSteps(params.Player);
+ local radarValues = steps:GetRadarValues(params.Player);
+ local baseScore = (steps:IsAnEdit() and
+ 5 or steps:GetMeter()) * 10000000;
+ local currentStep = 0; -- TODO: Get current step/hold.
+ local totalItems = GetTotalItems(radarValues);
+ local singleStep = (1 + totalItems) * totalItems / 2;
+ local stepLast = math.floor(baseScore / singleStep) * currentStep;
+ local judgeScore = 0;
+ if (params.HoldNoteScore == 'HoldNoteScore_Held') then
+ judgeScore = judgmentBase['TapNoteScore_W1'];
+ else
+ judgeScore = judgmentBase[params.TapNoteScore];
+ if (IsW1Allowed(params.TapNoteScore)) then
+ judgeScore = judgmentBase['TapNoteScore_W1'];
+ end;
+ end;
+ local stepScore = judgeScore * stepLast;
+
+ pss:SetScore(pss:GetScore() + stepScore);
+end;
+-----------------------------------------------------------
+--DDR SuperNOVA(-esque) scoring
+-----------------------------------------------------------
+r['DDR SuperNOVA'] = function(params, pss)
+ local multLookup = { ['TapNoteScore_W1'] = 1, ['TapNoteScore_W2'] = 1, ['TapNoteScore_W3'] = 0.5 };
+ setmetatable(multLookup, ZeroIfNotFound);
+ local radarValues = GetDirectRadar(params.Player);
+ local totalItems = GetTotalItems(radarValues);
+ local buildScore = (10000000 / totalItems * multLookup[params.TapNoteScore]) + (10000000 / totalItems * (params.HoldNoteScore == 'HoldNoteScore_Held' and 1 or 0));
+ pss:SetScore(pss:GetScore() + math.round(buildScore));
+end;
+-----------------------------------------------------------
+--DDR SuperNOVA 2(-esque) scoring
+-----------------------------------------------------------
+r['DDR SuperNOVA 2'] = function(params, pss)
+ local multLookup = { ['TapNoteScore_W1'] = 1, ['TapNoteScore_W2'] = 1, ['TapNoteScore_W3'] = 0.5 };
+ setmetatable(multLookup, ZeroIfNotFound);
+ local radarValues = GetDirectRadar(params.Player);
+ local totalItems = GetTotalItems(radarValues);
+ local buildScore = (100000 / totalItems * multLookup[params.TapNoteScore] - (IsW1Allowed(params.TapNoteScore) and 10 or 0)) + (100000 / totalItems * (params.HoldNoteScore == 'HoldNoteScore_Held' and 1 or 0));
+ pss:SetScore(pss:GetScore() + (math.round(buildScore) * 10));
+end;
+-----------------------------------------------------------
+--Radar Master (doesn't work in 1.2.1, disabled)
+--don't try to "fix it up", either. you *cannot* make it work in 1.2.1.
+-----------------------------------------------------------
+r['[SSC] Radar Master'] = function(params, pss)
+ local masterTable = {
+ ['RadarCategory_Stream'] = 0,
+ ['RadarCategory_Voltage'] = 0,
+ ['RadarCategory_Air'] = 0,
+ ['RadarCategory_Freeze'] = 0,
+ ['RadarCategory_Chaos'] = 0
+ };
+ local totalRadar = 0;
+ local finalScore = 0;
+ for k,v in pairs(masterTable) do
+ local firstRadar = GetDirectRadar(params.Player):GetValue(k);
+ if firstRadar == 0 then
+ masterTable[k] = nil;
+ else
+ masterTable[k] = firstRadar;
+ totalRadar = totalRadar + firstRadar;
+ end;
+ end;
+ --two loops are needed because we need to calculate totalRadar
+ --to actually calculate any part of the score
+ for k,v in pairs(masterTable) do
+ local curPortion = pss:GetRadarActual():GetValue(k) / v;
+ finalScore = finalScore + curPortion*(500000000*(v/totalRadar));
+ end;
+ pss:SetScore(finalScore);
+end;
+------------------------------------------------------------
+--Marvelous Incorporated Grading System (or MIGS for short)
+--basically like DP scoring with locked DP values
+------------------------------------------------------------
+r['MIGS'] = function(params,pss)
+ local curScore = 0;
+ local tapScoreTable = { ['TapNoteScore_W1'] = 3, ['TapNoteScore_W2'] = 2, ['TapNoteScore_W3'] = 1, ['TapNoteScore_W5'] = -4, ['TapNoteScore_Miss'] = -8 };
+ for k,v in pairs(tapScoreTable) do
+ curScore = curScore + ( pss:GetTapNoteScores(k) * v );
+ end;
+ curScore = curScore + ( pss:GetHoldNoteScores('HoldNoteScore_Held') * 6 );
+ pss:SetScore(clamp(curScore,0,math.huge));
+end;
+SpecialScoring = {};
+setmetatable(SpecialScoring, {
+ __metatable = { "Letting you change the metatable sort of defeats the purpose." };
+ __index = function(tbl, key)
+ for v in ivalues(DisabledScoringModes) do
+ if key == v then return r['DDR 1stMIX']; end;
+ end;
+ return r[key];
+ end;
+ }
+);
diff --git a/Themes/default/metrics.ini b/Themes/default/metrics.ini
index 7b9a1b9238..a55b777546 100644
--- a/Themes/default/metrics.ini
+++ b/Themes/default/metrics.ini
@@ -827,10 +827,10 @@ ItemsLongRowSharedX=SCREEN_CENTER_X
[ScreenOptionsTheme]
Fallback="ScreenOptionsServiceChild"
-LineNames="gNotePos,gAuto,gScore,gSDisp,gOpts,gLongFail,gComboUnderField,FlashyCombo,AdjustSpeed"
-#,gAuto
+LineNames="gNotePos,gAuto,gScore,gSScore,gSDisp,gOpts,gLongFail,gComboUnderField,FlashyCombo,AdjustSpeed"
LinegNotePos="lua,GamePrefNotePosition()"
LinegScore="lua,UserPrefGameplayShowScore()"
+LinegSScore="lua,UserPrefSpecialScoringMode()"
LinegSDisp="lua,UserPrefGameplayShowStepsDisplay()"
LinegOpts="lua,UserPrefShowLotsaOptions()"
LinegAuto="lua,GamePrefAutoSetStyle()"
@@ -1755,7 +1755,7 @@ PercentP1Y=SCREEN_TOP+320
PercentP1OnCommand=visible,false
PercentP1OffCommand=
#
-PercentP2X=SCREEN_CENTER_X-160
+PercentP2X=SCREEN_CENTER_X+160
PercentP2Y=SCREEN_TOP+320
PercentP2OnCommand=visible,false
PercentP2OffCommand=
@@ -1831,6 +1831,7 @@ ComboGraphP2OffCommand=
#
MachineRecordP1X=SCREEN_CENTER_X-220
#MachineRecordP1Y=SCREEN_BOTTOM-156
+
MachineRecordP1Y=SCREEN_TOP+146
MachineRecordP1OnCommand=
MachineRecordP1OffCommand=
@@ -2056,4 +2057,25 @@ ChoiceExit="screen,"..Branch.TitleMenu()..";text,"..Screen.String("Exit")
DefaultChoice="WhereToFind"
OptionOrderUp="5:4,4:3,3:2,2:1,1:5"
-OptionOrderDown="1:2,2:3,3:4,4:5,5:1"
\ No newline at end of file
+OptionOrderDown="1:2,2:3,3:4,4:5,5:1"
+[CustomScoring]
+# So special scoring works properly, we zero this out
+ComboAboveThresholdAddsToScoreBonus=0
+ComboScoreBonusThreshold=0
+ComboScoreBonusValue=0
+ComboMultiplier=0
+DoubleNoteScoreMultiplier=0
+TripleNoteScoreMultiplier=0
+QuadOrHigherNoteScoreMultiplier=0
+PointsW1=0
+PointsW2=0
+PointsW3=0
+PointsW4=0
+PointsW5=0
+PointsMiss=0
+PointsHitMine=0
+PointsCheckpointHit=0
+PointsCheckpointMiss=0
+PointsNone=0
+PointsHoldHeld=0
+PointsHoldLetGo=0
diff --git a/Themes/rsr/BGAnimations/ScreenWithMenuElements background/VOL1-29-NTSC.mpg b/Themes/rsr/BGAnimations/ScreenWithMenuElements background/VOL1-29-NTSC.mpg
new file mode 100644
index 0000000000..6f579ea520
Binary files /dev/null and b/Themes/rsr/BGAnimations/ScreenWithMenuElements background/VOL1-29-NTSC.mpg differ
diff --git a/Themes/rsr/BGAnimations/ScreenWithMenuElements background/default.lua b/Themes/rsr/BGAnimations/ScreenWithMenuElements background/default.lua
new file mode 100644
index 0000000000..d3ebaea695
--- /dev/null
+++ b/Themes/rsr/BGAnimations/ScreenWithMenuElements background/default.lua
@@ -0,0 +1,62 @@
+local t = Def.ActorFrame {};
+--
+--[[ local tGridSizeMajor = { 32, 32 };
+local tGridSizeMinor = { 16, 16 };
+local function CreateDebugGrid()
+ local t = Def.ActorFrame {};
+ local numX = math.ceil(SCREEN_WIDTH/tGridSizeMajor[1])
+ local numY = math.ceil(SCREEN_HEIGHT/tGridSizeMajor[2])
+ local offset = ( math.ceil(SCREEN_WIDTH/tGridSizeMajor[1]) - SCREEN_WIDTH ) + SCREEN_WIDTH;
+ for a=1,numY do
+ for b=1,numX do
+ t[#t+1] = Def.Quad {
+ InitCommand=cmd(x,b*tGridSizeMajor[1]-(tGridSizeMajor[1]/2);y,a*tGridSizeMajor[2]-(tGridSizeMajor[2]/2));
+ OnCommand=cmd(zoomto,tGridSizeMajor[1]-2,tGridSizeMajor[2]-2;diffuse,color("1,1,1,0.25"));
+ };
+ end;
+ end;
+ return t
+end --]]
+
+--
+t[#t+1] = Def.ActorFrame {
+ InitCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y);
+ LoadActor("VOL1-29-NTSC") .. {
+ InitCommand=cmd(scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT);
+ OnCommand=cmd(diffusealpha,0.75);
+ };
+};
+--
+local bShow = 0;
+t[#t+1] = Def.ActorFrame {
+ InitCommand=cmd(visible,false);
+ ToggleConsoleDisplayMessageCommand=function(self)
+ bShow = 1 - bShow;
+ self:visible( bShow == 1 );
+ end;
+ -- Grid
+ LoadActor("_32") .. {
+ InitCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;zoomto,SCREEN_WIDTH,SCREEN_HEIGHT;customtexturerect,0,0,SCREEN_WIDTH/32,SCREEN_HEIGHT/32);
+ OnCommand=cmd(diffuse,color("0,0,0,0.5"));
+ };
+ LoadActor("_16") .. {
+ InitCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;zoomto,SCREEN_WIDTH,SCREEN_HEIGHT;customtexturerect,0,0,SCREEN_WIDTH/16,SCREEN_HEIGHT/16);
+ OnCommand=cmd(diffuse,color("1,1,1,0.125"));
+ };
+--[[ LoadActor("_8") .. {
+ InitCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;zoomto,SCREEN_WIDTH,SCREEN_HEIGHT;customtexturerect,0,0,SCREEN_WIDTH/8,SCREEN_HEIGHT/8);
+ OnCommand=cmd(diffuse,color("#00BFE833"));
+ }; --]]
+ -- Left
+ Def.Quad {
+ InitCommand=cmd(horizalign,left;x,SCREEN_LEFT;y,SCREEN_CENTER_Y;zoomto,16,SCREEN_HEIGHT);
+ OnCommand=cmd(diffuse,color("0,0,0,0.5"));
+ };
+ -- Right
+ Def.Quad {
+ InitCommand=cmd(horizalign,right;x,SCREEN_RIGHT;y,SCREEN_CENTER_Y;zoomto,16,SCREEN_HEIGHT);
+ OnCommand=cmd(diffuse,color("0,0,0,0.5"));
+ };
+};
+--
+return t
\ No newline at end of file
diff --git a/Themes/rsr/BGAnimations/ScreenWithMenuElements decorations/default.lua b/Themes/rsr/BGAnimations/ScreenWithMenuElements decorations/default.lua
new file mode 100644
index 0000000000..d69d08b791
--- /dev/null
+++ b/Themes/rsr/BGAnimations/ScreenWithMenuElements decorations/default.lua
@@ -0,0 +1,7 @@
+-- Loads up a slew of objects to load into the screen, like how 3.9 does.
+-- I prefer to keep these optional, incase another screen wants to hide
+-- these elements.
+local t = Def.ActorFrame {};
+t[#t+1] = StandardDecorationFromFileOptional("Header","Header");
+t[#t+1] = StandardDecorationFromFileOptional("Footer","Footer");
+return t
\ No newline at end of file
diff --git a/Themes/rsr/Graphics/MusicWheelItem Song ColorPart.lua b/Themes/rsr/Graphics/MusicWheelItem Song ColorPart.lua
new file mode 100644
index 0000000000..edfa6611f8
--- /dev/null
+++ b/Themes/rsr/Graphics/MusicWheelItem Song ColorPart.lua
@@ -0,0 +1,14 @@
+return Def.ActorFrame {
+ Def.Quad {
+ InitCommand=cmd(x,-128+4;zoomto,4,46);
+-- OnCommand=cmd(diffuse,color("0,0,0,0.5"));
+ };
+--[[ Def.Quad {
+ InitCommand=cmd(x,-128+16+6;zoomto,32,46);
+-- OnCommand=cmd(faderight,1;diffusealpha,0.5);
+ }; --]]
+--[[ Def.Quad {
+ InitCommand=cmd(x,2;y,23;zoomto,320,1);
+-- OnCommand=cmd(diffuse,color("0,0,0,0.5"));
+ }; --]]
+};
\ No newline at end of file
diff --git a/Themes/rsr/Graphics/MusicWheelItem Song NormalPart.lua b/Themes/rsr/Graphics/MusicWheelItem Song NormalPart.lua
new file mode 100644
index 0000000000..60de25400c
--- /dev/null
+++ b/Themes/rsr/Graphics/MusicWheelItem Song NormalPart.lua
@@ -0,0 +1,6 @@
+return Def.ActorFrame {
+ Def.Quad {
+ InitCommand=cmd(x,4;zoomto,256-4,46);
+ OnCommand=cmd(diffuse,color("0,0,0,0.5"));
+ };
+};
\ No newline at end of file
diff --git a/Themes/rsr/Graphics/ScreenTitleMenu scroll.lua b/Themes/rsr/Graphics/ScreenTitleMenu scroll.lua
new file mode 100644
index 0000000000..84e2da8460
--- /dev/null
+++ b/Themes/rsr/Graphics/ScreenTitleMenu scroll.lua
@@ -0,0 +1,11 @@
+local gc = Var("GameCommand");
+
+local t = Def.ActorFrame {};
+
+t[#t+1] = LoadFont("Common Normal") .. {
+ Text=gc:GetText();
+};
+
+t.GainFocusCommand=cmd(diffusealpha,1);
+t.LoseFocusCommand=cmd(diffusealpha,0.5);
+return t;
\ No newline at end of file
diff --git a/Themes/rsr/Graphics/ScreenWithMenuElements footer/default.lua b/Themes/rsr/Graphics/ScreenWithMenuElements footer/default.lua
new file mode 100644
index 0000000000..5dae6eeb87
--- /dev/null
+++ b/Themes/rsr/Graphics/ScreenWithMenuElements footer/default.lua
@@ -0,0 +1,9 @@
+local t = Def.ActorFrame {};
+t[#t+1] = Def.ActorFrame {
+ InitCommand=cmd(y,-64);
+ Def.Quad {
+ InitCommand=cmd(vertalign,top;zoomto,SCREEN_WIDTH-32,2);
+ OnCommand=cmd(diffusealpha,0.5);
+ };
+};
+return t
\ No newline at end of file
diff --git a/Themes/rsr/Graphics/ScreenWithMenuElements header/default.lua b/Themes/rsr/Graphics/ScreenWithMenuElements header/default.lua
new file mode 100644
index 0000000000..1795dc8c31
--- /dev/null
+++ b/Themes/rsr/Graphics/ScreenWithMenuElements header/default.lua
@@ -0,0 +1,35 @@
+local t = Def.ActorFrame {};
+t[#t+1] = Def.ActorFrame {
+ InitCommand=cmd(y,48);
+ Def.Quad {
+ InitCommand=cmd(vertalign,bottom;zoomto,SCREEN_WIDTH-32,2);
+ OnCommand=cmd(diffusealpha,0.5);
+ };
+};
+t[#t+1] = Def.ActorFrame { Name="MenuTimerDecoration";
+ InitCommand=cmd(y,48);
+ LoadFont("Common Normal") .. {
+ Text="TIME";
+ InitCommand=cmd(vertalign,bottom;horizalign,right;x,SCREEN_CENTER_X-16;y,-4.5);
+ OnCommand=cmd(zoom,0.5);
+ };
+--[[ LoadFont("Common Normal") .. {
+ Text="99";
+ InitCommand=cmd(vertalign,bottom;horizalign,right;x,SCREEN_CENTER_X-64;y,-4.5);
+ OnCommand=cmd();
+ }; --]]
+};
+t[#t+1] = Def.ActorFrame { Name="HeaderTextDecoration";
+ InitCommand=cmd(y,48);
+ LoadFont("Common Normal") .. {
+ Text="SELECT";
+ InitCommand=cmd(vertalign,bottom;horizalign,left;x,-SCREEN_CENTER_X+16;y,-4.5);
+ OnCommand=cmd(zoom,0.5);
+ };
+ LoadFont("Common Normal") .. {
+ Text="OPTIONS";
+ InitCommand=cmd(vertalign,bottom;horizalign,left;x,-SCREEN_CENTER_X+64;y,-4.5);
+ OnCommand=cmd();
+ };
+};
+return t
\ No newline at end of file
diff --git a/Themes/rsr/Sounds/_Music menu.redir b/Themes/rsr/Sounds/_Music menu.redir
new file mode 100644
index 0000000000..c29cb1da10
--- /dev/null
+++ b/Themes/rsr/Sounds/_Music menu.redir
@@ -0,0 +1 @@
+_Music title
\ No newline at end of file
diff --git a/Themes/rsr/Sounds/_Music title (loop).ogg b/Themes/rsr/Sounds/_Music title (loop).ogg
new file mode 100644
index 0000000000..d1ff738f07
Binary files /dev/null and b/Themes/rsr/Sounds/_Music title (loop).ogg differ
diff --git a/Themes/rsr/Sounds/_Music title (loop).sm b/Themes/rsr/Sounds/_Music title (loop).sm
new file mode 100644
index 0000000000..283865a6c9
--- /dev/null
+++ b/Themes/rsr/Sounds/_Music title (loop).sm
@@ -0,0 +1,5 @@
+#TITLE:Break The Sabbath;
+#OFFSET:0.000;
+#BPMS:0.000=140.000;
+#STOPS:;
+
diff --git a/Themes/rsr/ThemeInfo.ini b/Themes/rsr/ThemeInfo.ini
new file mode 100644
index 0000000000..9215ef43e2
--- /dev/null
+++ b/Themes/rsr/ThemeInfo.ini
@@ -0,0 +1,3 @@
+[ThemeInfo]
+DisplayName=Real Stepping Roots
+Author=Midiman
\ No newline at end of file
diff --git a/Themes/rsr/library.txt b/Themes/rsr/library.txt
new file mode 100644
index 0000000000..1b6b60c1e1
--- /dev/null
+++ b/Themes/rsr/library.txt
@@ -0,0 +1,11 @@
+===
+COLORS
+====
+ BACKGROUND
+====
+ Clear #000000 (Black)
+ Light #646464 (Grey)
+ Primary #007cd4 (Slate Blue)
+ Secondary #a4005d (Slate Purple)
+ the base is black (#000000)
+===
\ No newline at end of file
diff --git a/Themes/rsr/metrics.ini b/Themes/rsr/metrics.ini
new file mode 100644
index 0000000000..d46f998386
--- /dev/null
+++ b/Themes/rsr/metrics.ini
@@ -0,0 +1,39 @@
+[Global]
+FallbackTheme=_fallback
+[ScreenWithMenuElements]
+ShowHeader=true
+HeaderX=SCREEN_CENTER_X
+HeaderY=SCREEN_TOP
+HeaderOnCommand=
+HeaderOffCommand=
+#
+ShowFooter=true
+FooterX=SCREEN_CENTER_X
+FooterY=SCREEN_BOTTOM
+FooterOnCommand=
+FooterOffCommand=
+#
+TimerX=SCREEN_WIDTH-64
+TimerY=SCREEN_TOP+48-4.5
+TimerOnCommand=
+TimerOffCommand=
+[MenuTimer]
+Text1OnCommand=stopeffect;stoptweening;vertalign,bottom;horizalign,right
+Text1FormatFunction=function(fSeconds) \
+ return string.format("%0.1f", fSeconds); \
+end
+FrameOnCommand=
+Warning10Command=diffuseshift;effectperiod,1;effectcolor2,Color("Red");effectcolor1,color("0.5,0,0,1");
+#~ Warning10Command=%function(self) \
+ #~ MESSAGEMAN:Broadcast("TimerWarning"); \
+ #~ cmd(diffuseshift;effectperiod,1;effectcolor2,Color("Red");effectcolor1,color("0.5,0,0,1"))(self); \
+#~ end;
+[ScreenTitleMenu]
+ShowHeader=true
+ShowFooter=true
+[ScreenSelectMusic]
+MusicWheelX=SCREEN_RIGHT-128-18
+MusicWheelOnCommand=draworder,-1
+[MusicWheel]
+ItemTransformFunction=function(self,offsetFromCenter,itemIndex,numItems) self:x( (1-math.cos(offsetFromCenter/math.pi))*0 ); self:y( offsetFromCenter*48 ); end
+NumWheelItems=13
\ No newline at end of file
diff --git a/Themes/rsr/todo.txt b/Themes/rsr/todo.txt
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/Themes/themekit/Graphics/ScreenTitleMenu scroll.lua b/Themes/themekit/Graphics/ScreenTitleMenu scroll.lua
index 0e5fbb4711..13448248c9 100644
--- a/Themes/themekit/Graphics/ScreenTitleMenu scroll.lua
+++ b/Themes/themekit/Graphics/ScreenTitleMenu scroll.lua
@@ -4,8 +4,10 @@ local t = Def.ActorFrame {};
t[#t+1] = LoadFont("Common Normal") .. {
Text=gc:GetText();
+ InitCommand=THEME:GetMetric(Var "LoadingScreen","ScrollerItemInitCommand");
+ GainFocusCommand=THEME:GetMetric(Var "LoadingScreen","ScrollerItemGainFocusCommand");
+ LoseFocusCommand=THEME:GetMetric(Var "LoadingScreen","ScrollerItemGainFocusCommand");
};
-t.GainFocusCommand=cmd(visible,true);
-t.LoseFocusCommand=cmd(visible,false);
+
return t;
\ No newline at end of file
diff --git a/Themes/themekit/metrics.ini b/Themes/themekit/metrics.ini
index 2798416bf2..0606f0540b 100644
--- a/Themes/themekit/metrics.ini
+++ b/Themes/themekit/metrics.ini
@@ -42,9 +42,18 @@ FooterOffCommand=
[ScreenTitleMenu]
ScrollerY=SCREEN_CENTER_Y*1.5
ScrollerOnCommand=
+# New: Load ScrollerItem SpacingX/Y
ScrollerTransform=function(self,offset,itemIndex,numItems) \
- self:y((0)*(itemIndex-(numItems-1)/2)); \
+ local fSpaceX = THEME:GetMetric( Var "LoadingScreen","ScrollerItemSpacingX"); \
+ local fSpaceY = THEME:GetMetric( Var "LoadingScreen","ScrollerItemSpacingY"); \
+ self:x( (i-1) * fSpaceX ); \
+ self:y( (i-1) * fSpaceY ); \
end;
-
+# New: Adjust menu items
+ScrollerItemSpacingX=0
+ScrollerItemSpacingY=24
+ScrollerItemInitCommand=zoom,1;shadowlength,1
+ScrollerItemGainFocusCommand=finishtweening;linear,0.125;zoom,1.25
+ScrollerItemLoseFocusCommand=finishtweening;linear,0.125;zoom,1
[ScreenSelectMusic]
diff --git a/Utils/build.sh b/Utils/build.sh
index f896306a91..a670f1a799 100755
--- a/Utils/build.sh
+++ b/Utils/build.sh
@@ -2,6 +2,12 @@
verbose=0
msg=
+notify=0
+if which notify-send >/dev/null 2>&1; then
+ #Comment the following line out to disable notify.
+ notify=1
+fi
+
message () {
msg=$1
if [ $verbose -gt 0 ]; then
@@ -9,6 +15,9 @@ message () {
else
echo -n "$msg..."
fi
+ if [ $notify -gt 0 ]; then
+ notify-send "sm-ssc build script" "$msg..."
+ fi
}
success () {
@@ -17,6 +26,9 @@ success () {
else
echo okay.
fi
+ if [ $notify -gt 0 ]; then
+ notify send "sm-ssc build script" "$msg...okay."
+ fi
}
failure () {
@@ -30,6 +42,9 @@ failure () {
else
echo failed$error
fi
+ if [ $notify -gt 0 ]; then
+ notify-send "sm-ssc build script failed" "$msg...failed$error"
+ fi;
echo "Consider passing --verbose to $0. Pass --help for details."
exit 1
}
@@ -64,10 +79,10 @@ usage () {
}
version () {
- echo 'build.sh (StepMania) 2.61a'
+ echo 'build.sh (StepMania) 2.62'
echo 'Copyright (C) 2006-2009 Steve Checkoway'
echo 'StepMania is Copyright (C) 2001-2009 Chris Danford et al.'
- echo 'sm-ssc is Copyright (C) 2009-2010 the spinal shark collective'
+ echo 'sm-ssc is Copyright (C) 2009-2011 the spinal shark collective'
exit 0
}
@@ -103,7 +118,7 @@ while [ $# -gt 0 ]; do
*) usage 1 ;;
esac
done
-version=0.6
+version=0.6.1
ffmpeg=ffmpeg-$version
directory=http://ffmpeg.org/releases
if [ ! -d $ffmpeg ]; then
diff --git a/Xcode/stepmania.xcodeproj/project.pbxproj b/Xcode/stepmania.xcodeproj/project.pbxproj
index afcc62122b..178717c95a 100644
--- a/Xcode/stepmania.xcodeproj/project.pbxproj
+++ b/Xcode/stepmania.xcodeproj/project.pbxproj
@@ -23,6 +23,10 @@
/* Begin PBXBuildFile section */
1215D7A208C6559A00B87D8B /* ScreenGameplayNormal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1215D7A008C6559A00B87D8B /* ScreenGameplayNormal.cpp */; };
+ 2BA7925E1304F20D002BD8E1 /* NotesLoaderSSC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2BA7925A1304F20D002BD8E1 /* NotesLoaderSSC.cpp */; };
+ 2BA7925F1304F20D002BD8E1 /* NotesLoaderSSC.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BA7925B1304F20D002BD8E1 /* NotesLoaderSSC.h */; };
+ 2BA792601304F20D002BD8E1 /* NotesWriterSSC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2BA7925C1304F20D002BD8E1 /* NotesWriterSSC.cpp */; };
+ 2BA792611304F20D002BD8E1 /* NotesWriterSSC.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BA7925D1304F20D002BD8E1 /* NotesWriterSSC.h */; };
3659B56F0F902143002B6B68 /* CommandLineActions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3659B56D0F902143002B6B68 /* CommandLineActions.cpp */; };
3659B5700F902143002B6B68 /* CommandLineActions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3659B56E0F902143002B6B68 /* CommandLineActions.h */; };
367D575B0EDE56F200B46814 /* ScreenHighScores.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 367D57590EDE56F200B46814 /* ScreenHighScores.cpp */; };
@@ -157,11 +161,9 @@
AA29CD810558741A00961A51 /* FadingBanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFE8A04770E7C005F316C /* FadingBanner.cpp */; };
AA29CD820558741A00961A51 /* GradeDisplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFE8C04770E7C005F316C /* GradeDisplay.cpp */; };
AA29CD840558741A00961A51 /* GrooveRadar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFE9004770E7C005F316C /* GrooveRadar.cpp */; };
- AA29CD850558741A00961A51 /* GroupList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFE9204770E7C005F316C /* GroupList.cpp */; };
AA29CD860558741A00961A51 /* HelpDisplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFE9404770E7C005F316C /* HelpDisplay.cpp */; };
AA29CD890558741A00961A51 /* MenuTimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFE9A04770E7C005F316C /* MenuTimer.cpp */; };
AA29CD8A0558741A00961A51 /* MeterDisplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFE9C04770E7C005F316C /* MeterDisplay.cpp */; };
- AA29CD8C0558741A00961A51 /* MusicList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFEA004770E7C005F316C /* MusicList.cpp */; };
AA29CD8E0558741A00961A51 /* MusicWheel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFEA404770E7C005F316C /* MusicWheel.cpp */; };
AA29CD8F0558741A00961A51 /* MusicWheelItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFEA604770E7C005F316C /* MusicWheelItem.cpp */; };
AA29CD920558741A00961A51 /* OptionsCursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFEAC04770E7C005F316C /* OptionsCursor.cpp */; };
@@ -373,11 +375,9 @@
AA40D1F809A08D650068C0D5 /* FadingBanner.h in Headers */ = {isa = PBXBuildFile; fileRef = AA6EFE8B04770E7C005F316C /* FadingBanner.h */; };
AA40D1F909A08D650068C0D5 /* GradeDisplay.h in Headers */ = {isa = PBXBuildFile; fileRef = AA6EFE8D04770E7C005F316C /* GradeDisplay.h */; };
AA40D1FA09A08D650068C0D5 /* GrooveRadar.h in Headers */ = {isa = PBXBuildFile; fileRef = AA6EFE9104770E7C005F316C /* GrooveRadar.h */; };
- AA40D1FB09A08D650068C0D5 /* GroupList.h in Headers */ = {isa = PBXBuildFile; fileRef = AA6EFE9304770E7C005F316C /* GroupList.h */; };
AA40D1FC09A08D650068C0D5 /* HelpDisplay.h in Headers */ = {isa = PBXBuildFile; fileRef = AA6EFE9504770E7C005F316C /* HelpDisplay.h */; };
AA40D1FD09A08D650068C0D5 /* MenuTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = AA6EFE9B04770E7C005F316C /* MenuTimer.h */; };
AA40D1FE09A08D650068C0D5 /* MeterDisplay.h in Headers */ = {isa = PBXBuildFile; fileRef = AA6EFE9D04770E7C005F316C /* MeterDisplay.h */; };
- AA40D20009A08D650068C0D5 /* MusicList.h in Headers */ = {isa = PBXBuildFile; fileRef = AA6EFEA104770E7C005F316C /* MusicList.h */; };
AA40D20209A08D650068C0D5 /* MusicWheel.h in Headers */ = {isa = PBXBuildFile; fileRef = AA6EFEA504770E7C005F316C /* MusicWheel.h */; };
AA40D20309A08D650068C0D5 /* MusicWheelItem.h in Headers */ = {isa = PBXBuildFile; fileRef = AA6EFEA704770E7C005F316C /* MusicWheelItem.h */; };
AA40D20609A08D650068C0D5 /* OptionsCursor.h in Headers */ = {isa = PBXBuildFile; fileRef = AA6EFEAD04770E7C005F316C /* OptionsCursor.h */; };
@@ -711,11 +711,9 @@
AA40D3BA09A08D650068C0D5 /* FadingBanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFE8A04770E7C005F316C /* FadingBanner.cpp */; };
AA40D3BB09A08D650068C0D5 /* GradeDisplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFE8C04770E7C005F316C /* GradeDisplay.cpp */; };
AA40D3BC09A08D650068C0D5 /* GrooveRadar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFE9004770E7C005F316C /* GrooveRadar.cpp */; };
- AA40D3BD09A08D650068C0D5 /* GroupList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFE9204770E7C005F316C /* GroupList.cpp */; };
AA40D3BE09A08D650068C0D5 /* HelpDisplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFE9404770E7C005F316C /* HelpDisplay.cpp */; };
AA40D3BF09A08D650068C0D5 /* MenuTimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFE9A04770E7C005F316C /* MenuTimer.cpp */; };
AA40D3C009A08D650068C0D5 /* MeterDisplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFE9C04770E7C005F316C /* MeterDisplay.cpp */; };
- AA40D3C209A08D650068C0D5 /* MusicList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFEA004770E7C005F316C /* MusicList.cpp */; };
AA40D3C409A08D650068C0D5 /* MusicWheel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFEA404770E7C005F316C /* MusicWheel.cpp */; };
AA40D3C509A08D650068C0D5 /* MusicWheelItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFEA604770E7C005F316C /* MusicWheelItem.cpp */; };
AA40D3C809A08D650068C0D5 /* OptionsCursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA6EFEAC04770E7C005F316C /* OptionsCursor.cpp */; };
@@ -1633,6 +1631,19 @@
AAFF41A60F5BD4AD00FFDB67 /* ScreenOptionsExportPackage.h in Headers */ = {isa = PBXBuildFile; fileRef = AAFF41A20F5BD4AD00FFDB67 /* ScreenOptionsExportPackage.h */; };
EE2153A910A75BEE0074B01B /* NotesLoaderPMS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EE2153A710A75BEE0074B01B /* NotesLoaderPMS.cpp */; };
EE2153AA10A75BEE0074B01B /* NotesLoaderPMS.h in Headers */ = {isa = PBXBuildFile; fileRef = EE2153A810A75BEE0074B01B /* NotesLoaderPMS.h */; };
+ EE906F6612BF3A1B00146C96 /* ScreenInstallOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EE906F6412BF3A1B00146C96 /* ScreenInstallOverlay.cpp */; };
+ EE906F6712BF3A1B00146C96 /* ScreenInstallOverlay.h in Headers */ = {isa = PBXBuildFile; fileRef = EE906F6512BF3A1B00146C96 /* ScreenInstallOverlay.h */; };
+ EE906F7712BF3A6900146C96 /* json_batchallocator.h in Headers */ = {isa = PBXBuildFile; fileRef = EE906F7012BF3A6900146C96 /* json_batchallocator.h */; };
+ EE906F7812BF3A6900146C96 /* json_internalarray.inl in Resources */ = {isa = PBXBuildFile; fileRef = EE906F7112BF3A6900146C96 /* json_internalarray.inl */; };
+ EE906F7912BF3A6900146C96 /* json_internalmap.inl in Resources */ = {isa = PBXBuildFile; fileRef = EE906F7212BF3A6900146C96 /* json_internalmap.inl */; };
+ EE906F7A12BF3A6900146C96 /* json_reader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EE906F7312BF3A6900146C96 /* json_reader.cpp */; };
+ EE906F7B12BF3A6900146C96 /* json_value.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EE906F7412BF3A6900146C96 /* json_value.cpp */; };
+ EE906F7C12BF3A6900146C96 /* json_valueiterator.inl in Resources */ = {isa = PBXBuildFile; fileRef = EE906F7512BF3A6900146C96 /* json_valueiterator.inl */; };
+ EE906F7D12BF3A6900146C96 /* json_writer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EE906F7612BF3A6900146C96 /* json_writer.cpp */; };
+ EE906F8212BF3AF800146C96 /* JsonUtil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EE906F8012BF3AF800146C96 /* JsonUtil.cpp */; };
+ EE906F8312BF3AF800146C96 /* JsonUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = EE906F8112BF3AF800146C96 /* JsonUtil.h */; };
+ EE906F8A12BF3C7C00146C96 /* FileDownload.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EE906F8812BF3C7C00146C96 /* FileDownload.cpp */; };
+ EE906F8B12BF3C7C00146C96 /* FileDownload.h in Headers */ = {isa = PBXBuildFile; fileRef = EE906F8912BF3C7C00146C96 /* FileDownload.h */; };
EEA7C84310A805A300082E7B /* ScreenPackagesSSC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EEA7C84110A805A300082E7B /* ScreenPackagesSSC.cpp */; };
EEA7C84410A805A300082E7B /* ScreenPackagesSSC.h in Headers */ = {isa = PBXBuildFile; fileRef = EEA7C84210A805A300082E7B /* ScreenPackagesSSC.h */; };
EEC7863F0E58208B00F559BC /* StepsDisplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EEC7863D0E58208B00F559BC /* StepsDisplay.cpp */; };
@@ -1761,6 +1772,10 @@
1215D7A108C6559A00B87D8B /* ScreenGameplayNormal.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = ScreenGameplayNormal.h; path = ../src/ScreenGameplayNormal.h; sourceTree = ""; };
29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; };
29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; };
+ 2BA7925A1304F20D002BD8E1 /* NotesLoaderSSC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NotesLoaderSSC.cpp; path = ../src/NotesLoaderSSC.cpp; sourceTree = SOURCE_ROOT; };
+ 2BA7925B1304F20D002BD8E1 /* NotesLoaderSSC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NotesLoaderSSC.h; path = ../src/NotesLoaderSSC.h; sourceTree = SOURCE_ROOT; };
+ 2BA7925C1304F20D002BD8E1 /* NotesWriterSSC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NotesWriterSSC.cpp; path = ../src/NotesWriterSSC.cpp; sourceTree = SOURCE_ROOT; };
+ 2BA7925D1304F20D002BD8E1 /* NotesWriterSSC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NotesWriterSSC.h; path = ../src/NotesWriterSSC.h; sourceTree = SOURCE_ROOT; };
3659B56D0F902143002B6B68 /* CommandLineActions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CommandLineActions.cpp; sourceTree = ""; };
3659B56E0F902143002B6B68 /* CommandLineActions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommandLineActions.h; sourceTree = ""; };
367D57590EDE56F200B46814 /* ScreenHighScores.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ScreenHighScores.cpp; path = ../src/ScreenHighScores.cpp; sourceTree = SOURCE_ROOT; };
@@ -2152,16 +2167,12 @@
AA6EFE8D04770E7C005F316C /* GradeDisplay.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = GradeDisplay.h; path = ../src/GradeDisplay.h; sourceTree = ""; };
AA6EFE9004770E7C005F316C /* GrooveRadar.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; name = GrooveRadar.cpp; path = ../src/GrooveRadar.cpp; sourceTree = ""; };
AA6EFE9104770E7C005F316C /* GrooveRadar.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = GrooveRadar.h; path = ../src/GrooveRadar.h; sourceTree = ""; };
- AA6EFE9204770E7C005F316C /* GroupList.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; name = GroupList.cpp; path = ../src/GroupList.cpp; sourceTree = ""; };
- AA6EFE9304770E7C005F316C /* GroupList.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = GroupList.h; path = ../src/GroupList.h; sourceTree = ""; };
AA6EFE9404770E7C005F316C /* HelpDisplay.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; name = HelpDisplay.cpp; path = ../src/HelpDisplay.cpp; sourceTree = ""; };
AA6EFE9504770E7C005F316C /* HelpDisplay.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = HelpDisplay.h; path = ../src/HelpDisplay.h; sourceTree = ""; };
AA6EFE9A04770E7C005F316C /* MenuTimer.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; name = MenuTimer.cpp; path = ../src/MenuTimer.cpp; sourceTree = ""; };
AA6EFE9B04770E7C005F316C /* MenuTimer.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = MenuTimer.h; path = ../src/MenuTimer.h; sourceTree = ""; };
AA6EFE9C04770E7C005F316C /* MeterDisplay.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; name = MeterDisplay.cpp; path = ../src/MeterDisplay.cpp; sourceTree = ""; };
AA6EFE9D04770E7C005F316C /* MeterDisplay.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = MeterDisplay.h; path = ../src/MeterDisplay.h; sourceTree = ""; };
- AA6EFEA004770E7C005F316C /* MusicList.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; name = MusicList.cpp; path = ../src/MusicList.cpp; sourceTree = ""; };
- AA6EFEA104770E7C005F316C /* MusicList.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = MusicList.h; path = ../src/MusicList.h; sourceTree = ""; };
AA6EFEA404770E7C005F316C /* MusicWheel.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; name = MusicWheel.cpp; path = ../src/MusicWheel.cpp; sourceTree = ""; };
AA6EFEA504770E7C005F316C /* MusicWheel.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = MusicWheel.h; path = ../src/MusicWheel.h; sourceTree = ""; };
AA6EFEA604770E7C005F316C /* MusicWheelItem.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; name = MusicWheelItem.cpp; path = ../src/MusicWheelItem.cpp; sourceTree = ""; };
@@ -2959,6 +2970,19 @@
AAFF5542054E736D00D02EE9 /* Attack.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.h; name = Attack.h; path = ../src/Attack.h; sourceTree = ""; };
EE2153A710A75BEE0074B01B /* NotesLoaderPMS.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NotesLoaderPMS.cpp; path = ../src/NotesLoaderPMS.cpp; sourceTree = SOURCE_ROOT; };
EE2153A810A75BEE0074B01B /* NotesLoaderPMS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NotesLoaderPMS.h; path = ../src/NotesLoaderPMS.h; sourceTree = SOURCE_ROOT; };
+ EE906F6412BF3A1B00146C96 /* ScreenInstallOverlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ScreenInstallOverlay.cpp; path = ../src/ScreenInstallOverlay.cpp; sourceTree = SOURCE_ROOT; };
+ EE906F6512BF3A1B00146C96 /* ScreenInstallOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ScreenInstallOverlay.h; path = ../src/ScreenInstallOverlay.h; sourceTree = SOURCE_ROOT; };
+ EE906F7012BF3A6900146C96 /* json_batchallocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = json_batchallocator.h; path = ../src/jsoncpp/src/lib_json/json_batchallocator.h; sourceTree = SOURCE_ROOT; };
+ EE906F7112BF3A6900146C96 /* json_internalarray.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = json_internalarray.inl; path = ../src/jsoncpp/src/lib_json/json_internalarray.inl; sourceTree = SOURCE_ROOT; };
+ EE906F7212BF3A6900146C96 /* json_internalmap.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = json_internalmap.inl; path = ../src/jsoncpp/src/lib_json/json_internalmap.inl; sourceTree = SOURCE_ROOT; };
+ EE906F7312BF3A6900146C96 /* json_reader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = json_reader.cpp; path = ../src/jsoncpp/src/lib_json/json_reader.cpp; sourceTree = SOURCE_ROOT; };
+ EE906F7412BF3A6900146C96 /* json_value.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = json_value.cpp; path = ../src/jsoncpp/src/lib_json/json_value.cpp; sourceTree = SOURCE_ROOT; };
+ EE906F7512BF3A6900146C96 /* json_valueiterator.inl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = json_valueiterator.inl; path = ../src/jsoncpp/src/lib_json/json_valueiterator.inl; sourceTree = SOURCE_ROOT; };
+ EE906F7612BF3A6900146C96 /* json_writer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = json_writer.cpp; path = ../src/jsoncpp/src/lib_json/json_writer.cpp; sourceTree = SOURCE_ROOT; };
+ EE906F8012BF3AF800146C96 /* JsonUtil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JsonUtil.cpp; path = ../src/JsonUtil.cpp; sourceTree = SOURCE_ROOT; };
+ EE906F8112BF3AF800146C96 /* JsonUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JsonUtil.h; path = ../src/JsonUtil.h; sourceTree = SOURCE_ROOT; };
+ EE906F8812BF3C7C00146C96 /* FileDownload.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FileDownload.cpp; path = ../src/FileDownload.cpp; sourceTree = SOURCE_ROOT; };
+ EE906F8912BF3C7C00146C96 /* FileDownload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileDownload.h; path = ../src/FileDownload.h; sourceTree = SOURCE_ROOT; };
EEA7C84110A805A300082E7B /* ScreenPackagesSSC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ScreenPackagesSSC.cpp; path = ../src/ScreenPackagesSSC.cpp; sourceTree = SOURCE_ROOT; };
EEA7C84210A805A300082E7B /* ScreenPackagesSSC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ScreenPackagesSSC.h; path = ../src/ScreenPackagesSSC.h; sourceTree = SOURCE_ROOT; };
EEC7863D0E58208B00F559BC /* StepsDisplay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StepsDisplay.cpp; path = ../src/StepsDisplay.cpp; sourceTree = ""; };
@@ -3113,6 +3137,7 @@
29B97314FDCFA39411CA2CEA /* SDL App */ = {
isa = PBXGroup;
children = (
+ EE906F6F12BF3A5B00146C96 /* json */,
AAA070B20CE7B3AD005A3060 /* mad-0.15.1b */,
AA7C8B920B67467C00FD9940 /* libtomcrypt */,
AA7C8A7F0B6744F600FD9940 /* libtommath */,
@@ -3185,8 +3210,6 @@
AA6E00090477103E005F316C /* Screens */ = {
isa = PBXGroup;
children = (
- 36CA531E0F9156860063D59D /* ScreenOptionsEditCourse.cpp */,
- 36CA531F0F9156860063D59D /* ScreenOptionsEditCourse.h */,
AA6E000A047711F3005F316C /* Screen.cpp */,
AA6E000B047711F3005F316C /* Screen.h */,
AA6E0010047711F3005F316C /* ScreenAttract.cpp */,
@@ -3225,6 +3248,8 @@
367D575A0EDE56F200B46814 /* ScreenHighScores.h */,
AA6E002F047711F3005F316C /* ScreenHowToPlay.cpp */,
AA6E0030047711F3005F316C /* ScreenHowToPlay.h */,
+ EE906F6412BF3A1B00146C96 /* ScreenInstallOverlay.cpp */,
+ EE906F6512BF3A1B00146C96 /* ScreenInstallOverlay.h */,
AA6E0033047711F3005F316C /* ScreenInstructions.cpp */,
AA6E0034047711F3005F316C /* ScreenInstructions.h */,
AA6E0037047711F3005F316C /* ScreenJukebox.cpp */,
@@ -3251,6 +3276,10 @@
AA42F5E7067068D30013509E /* ScreenNetworkOptions.h */,
AA6E004B047711F3005F316C /* ScreenOptions.cpp */,
AA6E004C047711F3005F316C /* ScreenOptions.h */,
+ 36CA531A0F91564A0063D59D /* ScreenOptionsCourseOverview.cpp */,
+ 36CA531B0F91564A0063D59D /* ScreenOptionsCourseOverview.h */,
+ 36CA531E0F9156860063D59D /* ScreenOptionsEditCourse.cpp */,
+ 36CA531F0F9156860063D59D /* ScreenOptionsEditCourse.h */,
AAFAB5BB0889098600767BF7 /* ScreenOptionsEditProfile.cpp */,
AAFAB5BC0889098600767BF7 /* ScreenOptionsEditProfile.h */,
AAFF41A10F5BD4AD00FFDB67 /* ScreenOptionsExportPackage.cpp */,
@@ -3320,8 +3349,6 @@
AA6E0079047711F3005F316C /* ScreenTestFonts.cpp */,
AA6E007A047711F3005F316C /* ScreenTestFonts.h */,
AAC622FA05389A0500D02EE9 /* ScreenTestInput.cpp */,
- 36CA531A0F91564A0063D59D /* ScreenOptionsCourseOverview.cpp */,
- 36CA531B0F91564A0063D59D /* ScreenOptionsCourseOverview.h */,
AAC622FB05389A0500D02EE9 /* ScreenTestInput.h */,
AAF7435906110E8D00B19AD1 /* ScreenTestLights.cpp */,
AAF7435A06110E8D00B19AD1 /* ScreenTestLights.h */,
@@ -3702,6 +3729,8 @@
AA8F136F0624BAB200C6A467 /* EnumHelper.h */,
AAE7808506081A000034E65F /* ezsockets.cpp */,
AAE7808606081A000034E65F /* ezsockets.h */,
+ EE906F8812BF3C7C00146C96 /* FileDownload.cpp */,
+ EE906F8912BF3C7C00146C96 /* FileDownload.h */,
AA6EFDD104770C79005F316C /* Font.cpp */,
AA6EFDD204770C79005F316C /* Font.h */,
AA6EFDD304770C79005F316C /* FontCharAliases.cpp */,
@@ -3727,6 +3756,8 @@
AABBD80605D8E9FC00B44FC2 /* HighScore.cpp */,
AABBD80705D8E9FC00B44FC2 /* HighScore.h */,
AACFBE3908E7D832005087FC /* InputEventPlus.h */,
+ EE906F8012BF3AF800146C96 /* JsonUtil.cpp */,
+ EE906F8112BF3AF800146C96 /* JsonUtil.h */,
AA2FB638091212AF000FD574 /* LifeMeter.cpp */,
AADD1CC2095C233E0088C9DF /* LocalizedString.cpp */,
AADD1CC3095C233F0088C9DF /* LocalizedString.h */,
@@ -3756,10 +3787,14 @@
EE2153A810A75BEE0074B01B /* NotesLoaderPMS.h */,
AA6EFDF504770C79005F316C /* NotesLoaderSM.cpp */,
AA6EFDF604770C79005F316C /* NotesLoaderSM.h */,
+ 2BA7925A1304F20D002BD8E1 /* NotesLoaderSSC.cpp */,
+ 2BA7925B1304F20D002BD8E1 /* NotesLoaderSSC.h */,
AA6EFDF704770C79005F316C /* NotesWriterDWI.cpp */,
AA6EFDF804770C79005F316C /* NotesWriterDWI.h */,
AA6EFDF904770C79005F316C /* NotesWriterSM.cpp */,
AA6EFDFA04770C79005F316C /* NotesWriterSM.h */,
+ 2BA7925C1304F20D002BD8E1 /* NotesWriterSSC.cpp */,
+ 2BA7925D1304F20D002BD8E1 /* NotesWriterSSC.h */,
AA6EFDFB04770C79005F316C /* NoteTypes.cpp */,
AA6EFDFC04770C79005F316C /* NoteTypes.h */,
AA80C75707F20D6600C99272 /* OptionRowHandler.cpp */,
@@ -3887,8 +3922,6 @@
AAFF551E0549F39700D02EE9 /* GraphDisplay.h */,
AA6EFE9004770E7C005F316C /* GrooveRadar.cpp */,
AA6EFE9104770E7C005F316C /* GrooveRadar.h */,
- AA6EFE9204770E7C005F316C /* GroupList.cpp */,
- AA6EFE9304770E7C005F316C /* GroupList.h */,
AA6EFE9404770E7C005F316C /* HelpDisplay.cpp */,
AA6EFE9504770E7C005F316C /* HelpDisplay.h */,
AA729C460599B54D00779F33 /* MemoryCardDisplay.cpp */,
@@ -3901,8 +3934,6 @@
AA11A20C0DC5A1B0006BD8AC /* ModIcon.h */,
AA11A20D0DC5A1B0006BD8AC /* ModIconRow.cpp */,
AA11A20E0DC5A1B0006BD8AC /* ModIconRow.h */,
- AA6EFEA004770E7C005F316C /* MusicList.cpp */,
- AA6EFEA104770E7C005F316C /* MusicList.h */,
AA6EFEA404770E7C005F316C /* MusicWheel.cpp */,
AA6EFEA504770E7C005F316C /* MusicWheel.h */,
AA6EFEA604770E7C005F316C /* MusicWheelItem.cpp */,
@@ -4862,6 +4893,20 @@
path = "../src/lua-5.1";
sourceTree = "";
};
+ EE906F6F12BF3A5B00146C96 /* json */ = {
+ isa = PBXGroup;
+ children = (
+ EE906F7012BF3A6900146C96 /* json_batchallocator.h */,
+ EE906F7112BF3A6900146C96 /* json_internalarray.inl */,
+ EE906F7212BF3A6900146C96 /* json_internalmap.inl */,
+ EE906F7312BF3A6900146C96 /* json_reader.cpp */,
+ EE906F7412BF3A6900146C96 /* json_value.cpp */,
+ EE906F7512BF3A6900146C96 /* json_valueiterator.inl */,
+ EE906F7612BF3A6900146C96 /* json_writer.cpp */,
+ );
+ name = json;
+ sourceTree = "";
+ };
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
@@ -4877,6 +4922,12 @@
EEA7C84410A805A300082E7B /* ScreenPackagesSSC.h in Headers */,
36C6888411297FFE00453295 /* RageFileDriverReadAhead.h in Headers */,
36C6888611297FFE00453295 /* RageFileManager_ReadAhead.h in Headers */,
+ EE906F6712BF3A1B00146C96 /* ScreenInstallOverlay.h in Headers */,
+ EE906F7712BF3A6900146C96 /* json_batchallocator.h in Headers */,
+ EE906F8312BF3AF800146C96 /* JsonUtil.h in Headers */,
+ EE906F8B12BF3C7C00146C96 /* FileDownload.h in Headers */,
+ 2BA7925F1304F20D002BD8E1 /* NotesLoaderSSC.h in Headers */,
+ 2BA792611304F20D002BD8E1 /* NotesWriterSSC.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -4944,11 +4995,9 @@
AA40D1F809A08D650068C0D5 /* FadingBanner.h in Headers */,
AA40D1F909A08D650068C0D5 /* GradeDisplay.h in Headers */,
AA40D1FA09A08D650068C0D5 /* GrooveRadar.h in Headers */,
- AA40D1FB09A08D650068C0D5 /* GroupList.h in Headers */,
AA40D1FC09A08D650068C0D5 /* HelpDisplay.h in Headers */,
AA40D1FD09A08D650068C0D5 /* MenuTimer.h in Headers */,
AA40D1FE09A08D650068C0D5 /* MeterDisplay.h in Headers */,
- AA40D20009A08D650068C0D5 /* MusicList.h in Headers */,
AA40D20209A08D650068C0D5 /* MusicWheel.h in Headers */,
AA40D20309A08D650068C0D5 /* MusicWheelItem.h in Headers */,
AA40D20609A08D650068C0D5 /* OptionsCursor.h in Headers */,
@@ -5597,6 +5646,9 @@
AA29CD3E0558741A00961A51 /* smicon.icns in Resources */,
AAF6A2F909B695BA00D5C614 /* Localizable.strings in Resources */,
AA1DE9580C5468CE00D59F20 /* Hardware.plist in Resources */,
+ EE906F7812BF3A6900146C96 /* json_internalarray.inl in Resources */,
+ EE906F7912BF3A6900146C96 /* json_internalmap.inl in Resources */,
+ EE906F7C12BF3A6900146C96 /* json_valueiterator.inl in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -5770,11 +5822,9 @@
AA29CD810558741A00961A51 /* FadingBanner.cpp in Sources */,
AA29CD820558741A00961A51 /* GradeDisplay.cpp in Sources */,
AA29CD840558741A00961A51 /* GrooveRadar.cpp in Sources */,
- AA29CD850558741A00961A51 /* GroupList.cpp in Sources */,
AA29CD860558741A00961A51 /* HelpDisplay.cpp in Sources */,
AA29CD890558741A00961A51 /* MenuTimer.cpp in Sources */,
AA29CD8A0558741A00961A51 /* MeterDisplay.cpp in Sources */,
- AA29CD8C0558741A00961A51 /* MusicList.cpp in Sources */,
AA29CD8E0558741A00961A51 /* MusicWheel.cpp in Sources */,
AA29CD8F0558741A00961A51 /* MusicWheelItem.cpp in Sources */,
AA29CD920558741A00961A51 /* OptionsCursor.cpp in Sources */,
@@ -6113,6 +6163,14 @@
EEA7C84310A805A300082E7B /* ScreenPackagesSSC.cpp in Sources */,
36C6888311297FFE00453295 /* RageFileDriverReadAhead.cpp in Sources */,
36C6888511297FFE00453295 /* RageFileManager_ReadAhead.cpp in Sources */,
+ EE906F6612BF3A1B00146C96 /* ScreenInstallOverlay.cpp in Sources */,
+ EE906F7A12BF3A6900146C96 /* json_reader.cpp in Sources */,
+ EE906F7B12BF3A6900146C96 /* json_value.cpp in Sources */,
+ EE906F7D12BF3A6900146C96 /* json_writer.cpp in Sources */,
+ EE906F8212BF3AF800146C96 /* JsonUtil.cpp in Sources */,
+ EE906F8A12BF3C7C00146C96 /* FileDownload.cpp in Sources */,
+ 2BA7925E1304F20D002BD8E1 /* NotesLoaderSSC.cpp in Sources */,
+ 2BA792601304F20D002BD8E1 /* NotesWriterSSC.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -6175,11 +6233,9 @@
AA40D3BA09A08D650068C0D5 /* FadingBanner.cpp in Sources */,
AA40D3BB09A08D650068C0D5 /* GradeDisplay.cpp in Sources */,
AA40D3BC09A08D650068C0D5 /* GrooveRadar.cpp in Sources */,
- AA40D3BD09A08D650068C0D5 /* GroupList.cpp in Sources */,
AA40D3BE09A08D650068C0D5 /* HelpDisplay.cpp in Sources */,
AA40D3BF09A08D650068C0D5 /* MenuTimer.cpp in Sources */,
AA40D3C009A08D650068C0D5 /* MeterDisplay.cpp in Sources */,
- AA40D3C209A08D650068C0D5 /* MusicList.cpp in Sources */,
AA40D3C409A08D650068C0D5 /* MusicWheel.cpp in Sources */,
AA40D3C509A08D650068C0D5 /* MusicWheelItem.cpp in Sources */,
AA40D3C809A08D650068C0D5 /* OptionsCursor.cpp in Sources */,
@@ -7075,6 +7131,7 @@
SHARED_PRECOMPS_DIR = "/Library/Caches/com.apple.Xcode.$(UID)/SharedPrecompiledHeaders/$(PRODUCT_NAME)/$(CONFIGURATION)";
STRIP_INSTALLED_PRODUCT = NO;
STRIP_STYLE = "non-global";
+ USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/../src/jsoncpp/include";
};
name = Debug;
};
@@ -7606,6 +7663,7 @@
SHARED_PRECOMPS_DIR = "/Library/Caches/com.apple.Xcode.$(UID)/SharedPrecompiledHeaders/$(PRODUCT_NAME)/$(CONFIGURATION)";
STRIP_INSTALLED_PRODUCT = YES;
STRIP_STYLE = "non-global";
+ USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/../src/jsoncpp/include";
};
name = PerformanceDebug;
};
@@ -7936,6 +7994,7 @@
SHARED_PRECOMPS_DIR = "/Library/Caches/com.apple.Xcode.$(UID)/SharedPrecompiledHeaders/$(PRODUCT_NAME)/$(CONFIGURATION)";
STRIP_INSTALLED_PRODUCT = YES;
STRIP_STYLE = "non-global";
+ USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/../src/jsoncpp/include";
};
name = Native;
};
@@ -8061,6 +8120,7 @@
SHARED_PRECOMPS_DIR = "/Library/Caches/com.apple.Xcode.$(UID)/SharedPrecompiledHeaders/$(PRODUCT_NAME)/$(CONFIGURATION)";
STRIP_INSTALLED_PRODUCT = YES;
STRIP_STYLE = "non-global";
+ USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/../src/jsoncpp/include";
};
name = Universal;
};
diff --git a/sm-ssc.nsi b/sm-ssc.nsi
index fcf4aadd2a..d2f30820c2 100644
--- a/sm-ssc.nsi
+++ b/sm-ssc.nsi
@@ -78,9 +78,8 @@
!insertmacro MUI_PAGE_WELCOME
- ; we need to warn people on Windows Vista and 7 not to install in
- ; Program Files
- !insertmacro MUI_PAGE_LICENSE ".\Docs\Windows7.txt"
+ ; include various Windows-only notices
+ !insertmacro MUI_PAGE_LICENSE ".\Docs\WindowsNotes.txt"
;!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
@@ -294,7 +293,14 @@ Section "Main Section" SecMain
RMDir /r "$INSTDIR\NoteSkins\dance\retrobar"
RMDir /r "$INSTDIR\NoteSkins\dance\retrobar-splithand_whiteblue"
; pump
+ RMDir /r "$INSTDIR\NoteSkins\pump\cmd"
+ RMDir /r "$INSTDIR\NoteSkins\pump\cmd-routine-p1"
+ RMDir /r "$INSTDIR\NoteSkins\pump\cmd-routine-p2"
+ RMDir /r "$INSTDIR\NoteSkins\pump\complex"
RMDir /r "$INSTDIR\NoteSkins\pump\default"
+ RMDir /r "$INSTDIR\NoteSkins\pump\frame5p"
+ RMDir /r "$INSTDIR\NoteSkins\pump\newextra"
+ RMDir /r "$INSTDIR\NoteSkins\pump\rhythm"
RMDir /r "$INSTDIR\NoteSkins\pump\simple"
; kb7
RMDir /r "$INSTDIR\NoteSkins\kb7\default"
@@ -332,8 +338,13 @@ Section "Main Section" SecMain
; install pump noteskins
SetOutPath "$INSTDIR\NoteSkins\pump"
File /r /x CVS /x .svn "NoteSkins\pump\cmd"
+ File /r /x CVS /x .svn "NoteSkins\pump\cmd-routine-p1"
+ File /r /x CVS /x .svn "NoteSkins\pump\cmd-routine-p2"
File /r /x CVS /x .svn "NoteSkins\pump\complex"
File /r /x CVS /x .svn "NoteSkins\pump\default"
+ File /r /x CVS /x .svn "NoteSkins\pump\frame5p"
+ File /r /x CVS /x .svn "NoteSkins\pump\newextra"
+ File /r /x CVS /x .svn "NoteSkins\pump\rhythm"
File /r /x CVS /x .svn "NoteSkins\pump\simple"
SetOutPath "$INSTDIR"
diff --git a/src/ActorFrame.cpp b/src/ActorFrame.cpp
index b2b43ccc39..0f83865b3c 100644
--- a/src/ActorFrame.cpp
+++ b/src/ActorFrame.cpp
@@ -338,8 +338,6 @@ void ActorFrame::UpdateInternal( float fDeltaTime )
pActor->Update(fDeltaTime);
}
- // todo: update lighting? -aj
-
if( unlikely(!m_UpdateFunction.IsNil()) )
{
Lua *L = LUA->Get();
diff --git a/src/ArrowEffects.cpp b/src/ArrowEffects.cpp
index f01b8bd2d0..f19cf6f40f 100644
--- a/src/ArrowEffects.cpp
+++ b/src/ArrowEffects.cpp
@@ -16,6 +16,41 @@
static ThemeMetric ARROW_SPACING( "ArrowEffects", "ArrowSpacing" );
static ThemeMetric HIDDEN_SUDDEN_PAST_RECEPTOR( "ArrowEffects", "DrawHiddenNotesAfterReceptor");
+static ThemeMetric BLINK_MOD_FREQUENCY( "ArrowEffects", "BlinkModFrequency" );
+static ThemeMetric BOOST_MOD_MIN_CLAMP( "ArrowEffects", "BoostModMinClamp" );
+static ThemeMetric BOOST_MOD_MAX_CLAMP( "ArrowEffects", "BoostModMaxClamp" );
+static ThemeMetric BRAKE_MOD_MIN_CLAMP( "ArrowEffects", "BrakeModMinClamp" );
+static ThemeMetric BRAKE_MOD_MAX_CLAMP( "ArrowEffects", "BrakeModMaxClamp" );
+static ThemeMetric WAVE_MOD_MAGNITUDE( "ArrowEffects", "WaveModMagnitude" );
+static ThemeMetric WAVE_MOD_HEIGHT( "ArrowEffects", "WaveModHeight" );
+static ThemeMetric BOOMERANG_PEAK_PERCENTAGE( "ArrowEffects", "BoomerangPeakPercentage" );
+static ThemeMetric EXPAND_MULTIPLIER_FREQUENCY( "ArrowEffects", "ExpandMultiplierFrequency" );
+static ThemeMetric EXPAND_MULTIPLIER_SCALE_FROM_LOW( "ArrowEffects", "ExpandMultiplierScaleFromLow" );
+static ThemeMetric EXPAND_MULTIPLIER_SCALE_FROM_HIGH( "ArrowEffects", "ExpandMultiplierScaleFromHigh" );
+static ThemeMetric EXPAND_MULTIPLIER_SCALE_TO_LOW( "ArrowEffects", "ExpandMultiplierScaleToLow" );
+static ThemeMetric EXPAND_MULTIPLIER_SCALE_TO_HIGH( "ArrowEffects", "ExpandMultiplierScaleToHigh" );
+static ThemeMetric EXPAND_SPEED_SCALE_FROM_LOW( "ArrowEffects", "ExpandSpeedScaleFromLow" );
+static ThemeMetric EXPAND_SPEED_SCALE_FROM_HIGH( "ArrowEffects", "ExpandSpeedScaleFromHigh" );
+static ThemeMetric EXPAND_SPEED_SCALE_TO_LOW( "ArrowEffects", "ExpandSpeedScaleToLow" );
+static ThemeMetric TIPSY_TIMER_FREQUENCY( "ArrowEffects", "TipsyTimerFrequency" );
+static ThemeMetric TIPSY_COLUMN_FREQUENCY( "ArrowEffects", "TipsyColumnFrequency" );
+static ThemeMetric TIPSY_ARROW_MAGNITUDE( "ArrowEffects", "TipsyArrowMagnitude" );
+static ThemeMetric TIPSY_OFFSET_TIMER_FREQUENCY( "ArrowEffects", "TipsyOffsetTimerFrequency" );
+static ThemeMetric TIPSY_OFFSET_COLUMN_FREQUENCY( "ArrowEffects", "TipsyOffsetColumnFrequency" );
+static ThemeMetric TIPSY_OFFSET_ARROW_MAGNITUDE( "ArrowEffects", "TipsyOffsetArrowMagnitude" );
+static ThemeMetric TORNADO_POSITION_SCALE_TO_LOW( "ArrowEffects", "TornadoPositionScaleToLow" );
+static ThemeMetric TORNADO_POSITION_SCALE_TO_HIGH( "ArrowEffects", "TornadoPositionScaleToHigh" );
+static ThemeMetric TORNADO_OFFSET_FREQUENCY( "ArrowEffects", "TornadoOffsetFrequency" );
+static ThemeMetric TORNADO_OFFSET_SCALE_FROM_LOW( "ArrowEffects", "TornadoOffsetScaleFromLow" );
+static ThemeMetric TORNADO_OFFSET_SCALE_FROM_HIGH( "ArrowEffects", "TornadoOffsetScaleFromHigh" );
+static ThemeMetric DRUNK_COLUMN_FREQUENCY( "ArrowEffects", "DrunkColumnFrequency" );
+static ThemeMetric DRUNK_OFFSET_FREQUENCY( "ArrowEffects", "DrunkOffsetFrequency" );
+static ThemeMetric DRUNK_ARROW_MAGNITUDE( "ArrowEffects", "DrunkArrowMagnitude" );
+static ThemeMetric BEAT_OFFSET_HEIGHT( "ArrowEffects", "BeatOffsetHeight" );
+static ThemeMetric BEAT_PI_HEIGHT( "ArrowEffects", "BeatPIHeight" );
+static ThemeMetric MINI_PERCENT_BASE( "ArrowEffects", "MiniPercentBase" );
+static ThemeMetric MINI_PERCENT_GATE( "ArrowEffects", "MiniPercentGate" );
+static ThemeMetric QUANTIZE_ARROW_Y( "ArrowEffects", "QuantizeArrowYPosition");
static float GetNoteFieldHeight( const PlayerState* pPlayerState )
{
@@ -213,7 +248,7 @@ float ArrowEffects::GetYOffset( const PlayerState* pPlayerState, int iCol, float
float fNewYOffset = fYOffset * 1.5f / ((fYOffset+fEffectHeight/1.2f)/fEffectHeight);
float fAccelYAdjust = fAccels[PlayerOptions::ACCEL_BOOST] * (fNewYOffset - fYOffset);
// TRICKY: Clamp this value, or else BOOST+BOOMERANG will draw a ton of arrows on the screen.
- CLAMP( fAccelYAdjust, -400.f, 400.f );
+ CLAMP( fAccelYAdjust, BOOST_MOD_MIN_CLAMP, BOOST_MOD_MAX_CLAMP );
fYAdjust += fAccelYAdjust;
}
if( fAccels[PlayerOptions::ACCEL_BRAKE] != 0 )
@@ -223,18 +258,18 @@ float ArrowEffects::GetYOffset( const PlayerState* pPlayerState, int iCol, float
float fNewYOffset = fYOffset * fScale;
float fBrakeYAdjust = fAccels[PlayerOptions::ACCEL_BRAKE] * (fNewYOffset - fYOffset);
// TRICKY: Clamp this value the same way as BOOST so that in BOOST+BRAKE, BRAKE doesn't overpower BOOST
- CLAMP( fBrakeYAdjust, -400.f, 400.f );
+ CLAMP( fBrakeYAdjust, BRAKE_MOD_MIN_CLAMP, BRAKE_MOD_MAX_CLAMP );
fYAdjust += fBrakeYAdjust;
}
if( fAccels[PlayerOptions::ACCEL_WAVE] != 0 )
- fYAdjust += fAccels[PlayerOptions::ACCEL_WAVE] * 20.0f*RageFastSin( fYOffset/38.0f );
+ fYAdjust += fAccels[PlayerOptions::ACCEL_WAVE] * WAVE_MOD_MAGNITUDE *RageFastSin( fYOffset/WAVE_MOD_HEIGHT );
fYOffset += fYAdjust;
// Factor in boomerang
if( fAccels[PlayerOptions::ACCEL_BOOMERANG] != 0 )
{
- float fPeakAtYOffset = SCREEN_HEIGHT * 0.75f; // zero point of boomerang function
+ float fPeakAtYOffset = SCREEN_HEIGHT * BOOMERANG_PEAK_PERCENTAGE; // zero point of boomerang function
fPeakYOffsetOut = (-1*fPeakAtYOffset*fPeakAtYOffset/SCREEN_HEIGHT) + 1.5f*fPeakAtYOffset;
bIsPastPeakOut = fYOffset < fPeakAtYOffset;
@@ -262,8 +297,12 @@ float ArrowEffects::GetYOffset( const PlayerState* pPlayerState, int iCol, float
if( fAccels[PlayerOptions::ACCEL_EXPAND] != 0 )
{
- float fExpandMultiplier = SCALE( RageFastCos(g_fExpandSeconds*3), -1, 1, 0.75f, 1.75f );
- fScrollSpeed *= SCALE( fAccels[PlayerOptions::ACCEL_EXPAND], 0.f, 1.f, 1.f, fExpandMultiplier );
+ float fExpandMultiplier = SCALE( RageFastCos(g_fExpandSeconds*EXPAND_MULTIPLIER_FREQUENCY),
+ EXPAND_MULTIPLIER_SCALE_FROM_LOW, EXPAND_MULTIPLIER_SCALE_FROM_HIGH,
+ EXPAND_MULTIPLIER_SCALE_TO_LOW, EXPAND_MULTIPLIER_SCALE_TO_HIGH );
+ fScrollSpeed *= SCALE( fAccels[PlayerOptions::ACCEL_EXPAND],
+ EXPAND_SPEED_SCALE_FROM_LOW, EXPAND_SPEED_SCALE_FROM_HIGH,
+ EXPAND_SPEED_SCALE_TO_LOW, fExpandMultiplier );
}
fYOffset *= fScrollSpeed;
@@ -306,14 +345,15 @@ float ArrowEffects::GetYPos( const PlayerState* pPlayerState, int iCol, float fY
const float* fEffects = pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects;
if( fEffects[PlayerOptions::EFFECT_TIPSY] != 0 )
- f += fEffects[PlayerOptions::EFFECT_TIPSY] * ( RageFastCos( RageTimer::GetTimeSinceStartFast()*1.2f + iCol*1.8f) * ARROW_SIZE*0.4f );
+ f += fEffects[PlayerOptions::EFFECT_TIPSY]
+ * ( RageFastCos( RageTimer::GetTimeSinceStartFast()*TIPSY_TIMER_FREQUENCY
+ + iCol*TIPSY_COLUMN_FREQUENCY) * ARROW_SIZE*TIPSY_ARROW_MAGNITUDE );
// In beware's DDR Extreme-focused fork of StepMania 3.9, this value is
// floored, making arrows show on integer Y coordinates. Supposedly it makes
// the arrows look better, but testing needs to be done.
- // todo: make this a noteskin metric ("QuantizeArrowYPosition") -aj
- return f;
- //return floor(f);
+ // todo: make this a noteskin metric instead of a theme metric? -aj
+ return QUANTIZE_ARROW_Y ? floor(f) : f;
}
float ArrowEffects::GetYOffsetFromYPos( const PlayerState* pPlayerState, int iCol, float YPos, float fYReverseOffsetPixels )
@@ -322,7 +362,9 @@ float ArrowEffects::GetYOffsetFromYPos( const PlayerState* pPlayerState, int iCo
const float* fEffects = pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects;
if( fEffects[PlayerOptions::EFFECT_TIPSY] != 0 )
- f -= fEffects[PlayerOptions::EFFECT_TIPSY] * ( RageFastCos( RageTimer::GetTimeSinceStartFast()*1.2f + iCol*2.f) * ARROW_SIZE*0.4f );
+ f -= fEffects[PlayerOptions::EFFECT_TIPSY]
+ * ( RageFastCos( RageTimer::GetTimeSinceStartFast()*TIPSY_OFFSET_TIMER_FREQUENCY
+ + iCol*TIPSY_OFFSET_COLUMN_FREQUENCY) * ARROW_SIZE*TIPSY_OFFSET_ARROW_MAGNITUDE );
float fShift, fScale;
ArrowGetReverseShiftAndScale( pPlayerState, iCol, fYReverseOffsetPixels, fShift, fScale );
@@ -348,17 +390,21 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float
if( fEffects[PlayerOptions::EFFECT_TORNADO] != 0 )
{
const float fRealPixelOffset = pCols[iColNum].fXOffset;
- const float fPositionBetween = SCALE( fRealPixelOffset, data.m_fMinTornadoX[iColNum], data.m_fMaxTornadoX[iColNum], -1, 1 );
+ const float fPositionBetween = SCALE( fRealPixelOffset, data.m_fMinTornadoX[iColNum], data.m_fMaxTornadoX[iColNum],
+ TORNADO_POSITION_SCALE_TO_LOW, TORNADO_POSITION_SCALE_TO_HIGH );
float fRads = acosf( fPositionBetween );
- fRads += fYOffset * 6 / SCREEN_HEIGHT;
+ fRads += fYOffset * TORNADO_OFFSET_FREQUENCY / SCREEN_HEIGHT;
- const float fAdjustedPixelOffset = SCALE( RageFastCos(fRads), -1, 1, data.m_fMinTornadoX[iColNum], data.m_fMaxTornadoX[iColNum] );
+ const float fAdjustedPixelOffset = SCALE( RageFastCos(fRads), TORNADO_OFFSET_SCALE_FROM_LOW, TORNADO_OFFSET_SCALE_FROM_HIGH,
+ data.m_fMinTornadoX[iColNum], data.m_fMaxTornadoX[iColNum] );
fPixelOffsetFromCenter += (fAdjustedPixelOffset - fRealPixelOffset) * fEffects[PlayerOptions::EFFECT_TORNADO];
}
if( fEffects[PlayerOptions::EFFECT_DRUNK] != 0 )
- fPixelOffsetFromCenter += fEffects[PlayerOptions::EFFECT_DRUNK] * ( RageFastCos( RageTimer::GetTimeSinceStartFast() + iColNum*0.2f + fYOffset*10/SCREEN_HEIGHT) * ARROW_SIZE*0.5f );
+ fPixelOffsetFromCenter += fEffects[PlayerOptions::EFFECT_DRUNK] *
+ ( RageFastCos( RageTimer::GetTimeSinceStartFast() + iColNum*DRUNK_COLUMN_FREQUENCY
+ + fYOffset*DRUNK_OFFSET_FREQUENCY/SCREEN_HEIGHT) * ARROW_SIZE*DRUNK_ARROW_MAGNITUDE );
if( fEffects[PlayerOptions::EFFECT_FLIP] != 0 )
{
const int iFirstCol = 0;
@@ -374,7 +420,7 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float
if( fEffects[PlayerOptions::EFFECT_BEAT] != 0 )
{
- const float fShift = data.m_fBeatFactor*RageFastSin( fYOffset / 15.0f + PI/2.0f );
+ const float fShift = data.m_fBeatFactor*RageFastSin( fYOffset / BEAT_OFFSET_HEIGHT + PI/BEAT_PI_HEIGHT );
fPixelOffsetFromCenter += fEffects[PlayerOptions::EFFECT_BEAT] * fShift;
}
@@ -406,9 +452,7 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float
fPixelOffsetFromCenter += fEffects[PlayerOptions::EFFECT_XMODE]*fYOffset;
}
break;
- default:
- ASSERT("What the hell kind of styletype are you passing me anyways?");
- break;
+ DEFAULT_FAIL(pStyle->m_StyleType);
}
}
@@ -418,7 +462,7 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float
{
// Allow Mini to pull tracks together, but not to push them apart.
float fMiniPercent = fEffects[PlayerOptions::EFFECT_MINI];
- fMiniPercent = min( powf(0.5f, fMiniPercent), 1.0f );
+ fMiniPercent = min( powf(MINI_PERCENT_BASE, fMiniPercent), (float)MINI_PERCENT_GATE );
fPixelOffsetFromCenter *= fMiniPercent;
}
@@ -572,7 +616,7 @@ float ArrowGetPercentVisible( const PlayerState* pPlayerState, float fYPosWithou
if( fAppearances[PlayerOptions::APPEARANCE_BLINK] != 0 )
{
float f = RageFastSin(RageTimer::GetTimeSinceStartFast()*10);
- f = Quantize( f, 0.3333f );
+ f = Quantize( f, BLINK_MOD_FREQUENCY );
fVisibleAdjust += SCALE( f, 0, 1, -1, 0 );
}
if( fAppearances[PlayerOptions::APPEARANCE_RANDOMVANISH] != 0 )
diff --git a/src/BPMDisplay.cpp b/src/BPMDisplay.cpp
index 83d19aecd9..b079cf9f93 100644
--- a/src/BPMDisplay.cpp
+++ b/src/BPMDisplay.cpp
@@ -35,7 +35,7 @@ void BPMDisplay::Load()
SEPARATOR.Load( m_sName, "Separator" );
SHOW_QMARKS.Load( m_sName, "ShowQMarksInRandomCycle" );
NO_BPM_TEXT.Load( m_sName, "NoBpmText" );
- //QUESTIONMARKS_TEXT.Load( m_sName, "QuestionMarksText" );
+ QUESTIONMARKS_TEXT.Load( m_sName, "QuestionMarksText" );
RANDOM_TEXT.Load( m_sName, "RandomText" );
VARIOUS_TEXT.Load( m_sName, "VariousText" );
@@ -75,10 +75,8 @@ void BPMDisplay::Update( float fDeltaTime )
if(m_fBPMTo == -1)
{
m_fBPMFrom = -1;
-
- // todo: allow themer to customize "xxx" string -aj
if( (bool)SHOW_QMARKS )
- SetText( (RandomFloat(0,1)>0.90f) ? RString("xxx") : ssprintf("%03.0f",RandomFloat(0,999)) );
+ SetText( (RandomFloat(0,1)>0.90f) ? (RString)QUESTIONMARKS_TEXT : ssprintf("%03.0f",RandomFloat(0,999)) );
else
SetText( ssprintf("%03.0f",RandomFloat(0,999)) );
}
@@ -291,6 +289,7 @@ void SongBPMDisplay::Update( float fDeltaTime )
REGISTER_ACTOR_CLASS( SongBPMDisplay )
#include "LuaBinding.h"
+/** @brief Allow Lua to have access to the BPMDisplay. */
class LunaBPMDisplay: public Luna
{
public:
diff --git a/src/BPMDisplay.h b/src/BPMDisplay.h
index 726101430b..d6fb4f5e71 100644
--- a/src/BPMDisplay.h
+++ b/src/BPMDisplay.h
@@ -1,4 +1,4 @@
-/* BPMDisplay - displays a BPM or a range of BPMs. */
+/** @brief BPMDisplay - displays a BPM or a range of BPMs. */
#ifndef BPM_DISPLAY_H
#define BPM_DISPLAY_H
@@ -11,54 +11,109 @@ class Song;
class Course;
struct DisplayBpms;
+/** @brief Display the BPM/range of them as requested. */
class BPMDisplay : public BitmapText
{
public:
+ /** @brief Set up the BPM Display with default values. */
BPMDisplay();
+ /** @brief Copy the BPMDisplay to another. */
virtual BPMDisplay *Copy() const;
+ /** @brief Load the various metrics needed. */
void Load();
+ /**
+ * @brief Update the display as required.
+ * @param fDeltaTime the changed time.
+ */
virtual void Update( float fDeltaTime );
void LoadFromNode( const XNode *pNode );
-
+ /**
+ * @brief Use the BPM[s] from a song.
+ * @param pSong the song in question.
+ */
void SetBpmFromSong( const Song* pSong );
+ /**
+ * @brief Use the BPM[s] from a course.
+ * @param pCourse the course in question.
+ */
void SetBpmFromCourse( const Course* pCourse );
+ /**
+ * @brief Use a specified, constant BPM.
+ * @param fBPM the constant BPM.
+ */
void SetConstantBpm( float fBPM );
+ /**
+ * @brief Have the BPMDisplay cycle between various BPMs.
+ */
void CycleRandomly();
+ /** @brief Don't use a BPM at all. */
void NoBPM();
+ /** @brief Have the BPMDisplay use various BPMs. */
void SetVarious();
+ /** @brief Have the GameState determine which BPMs to display. */
void SetFromGameState();
// Lua
virtual void PushSelf( lua_State *L );
protected:
+ /**
+ * @brief Retrieve the active BPM on display.
+ * @return the active BPM on display.
+ */
float GetActiveBPM() const;
+ /**
+ * @brief Set the range to be used for the display.
+ * @param bpms the set of BPMs to be used.
+ */
void SetBPMRange( const DisplayBpms &bpms );
+ /** @brief The commands to use when there is no BPM. */
ThemeMetric SET_NO_BPM_COMMAND;
+ /** @brief The commands to use when there is a normal BPM. */
ThemeMetric SET_NORMAL_COMMAND;
+ /** @brief The commands to use when the BPM can change between 2 or more values. */
ThemeMetric SET_CHANGING_COMMAND;
+ /** @brief The commands to use when the BPM is random. */
ThemeMetric SET_RANDOM_COMMAND;
+ /** @brief The commands to use if it is an extra stage. */
ThemeMetric SET_EXTRA_COMMAND;
+ /** @brief A flag to determine if the BPMs cycle from low to high or just display both. */
ThemeMetric CYCLE;
+ /** @brief A flag to determine if QUESTIONMARKS_TEXT is shown. */
ThemeMetric SHOW_QMARKS;
+ /** @brief How often the random BPMs cycle themselves. */
ThemeMetric RANDOM_CYCLE_SPEED;
+ /** @brief The text used to separate the low and high BPMs. */
ThemeMetric SEPARATOR;
+ /** @brief The text used when there is no BPM. */
ThemeMetric NO_BPM_TEXT;
+ /** @brief The text used when there are various BPMs for the song. */
ThemeMetric VARIOUS_TEXT;
+ /** @brief The text used when it is a random BPM. */
ThemeMetric RANDOM_TEXT;
+ /** @brief The text used as one possible option for random BPM. */
+ ThemeMetric QUESTIONMARKS_TEXT;
- float m_fBPMFrom, m_fBPMTo;
+ /** @brief The lowest valued BPM. */
+ float m_fBPMFrom;
+ /** @brief The highest valued BPM. */
+ float m_fBPMTo;
+ /** @brief The current BPM index used. */
int m_iCurrentBPM;
+ /** @brief The list of BPMs. */
vector m_BPMS;
float m_fPercentInState;
+ /** @brief How long it takes to cycle the various BPMs. */
float m_fCycleTime;
};
#endif
-/*
- * (c) 2001-2002 Chris Danford
+/**
+ * @file
+ * @author Chris Danford (c) 2001-2002
+ * @section LICENSE
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
diff --git a/src/Banner.cpp b/src/Banner.cpp
index 5bf67f7d7b..c3ee65fab7 100644
--- a/src/Banner.cpp
+++ b/src/Banner.cpp
@@ -15,7 +15,7 @@
REGISTER_ACTOR_CLASS( Banner )
-ThemeMetric SCROLL_RANDOM ("Banner","ScrollRandom");
+ThemeMetric SCROLL_RANDOM ("Banner","ScrollRandom");
ThemeMetric SCROLL_ROULETTE ("Banner","ScrollRoulette");
Banner::Banner()
@@ -24,7 +24,7 @@ Banner::Banner()
m_fPercentScrolling = 0;
}
-/* Ugly: if sIsBanner is false, we're actually loading something other than a banner. */
+// Ugly: if sIsBanner is false, we're actually loading something other than a banner.
void Banner::Load( RageTextureID ID, bool bIsBanner )
{
if( ID.filename == "" )
@@ -86,10 +86,10 @@ void Banner::Update( float fDeltaTime )
float fTexCoords[8] =
{
- 0+m_fPercentScrolling, pTextureRect->top, // top left
+ 0+m_fPercentScrolling, pTextureRect->top, // top left
0+m_fPercentScrolling, pTextureRect->bottom, // bottom left
1+m_fPercentScrolling, pTextureRect->bottom, // bottom right
- 1+m_fPercentScrolling, pTextureRect->top, // top right
+ 1+m_fPercentScrolling, pTextureRect->top, // top right
};
Sprite::SetCustomTextureCoords( fTexCoords );
}
@@ -100,25 +100,19 @@ void Banner::SetScrolling( bool bScroll, float Percent)
m_bScrolling = bScroll;
m_fPercentScrolling = Percent;
- /* Set up the texture coord rects for the current state. */
+ // Set up the texture coord rects for the current state.
Update(0);
}
-void Banner::LoadFromSong( Song* pSong ) // NULL means no song
+void Banner::LoadFromSong( Song* pSong ) // NULL means no song
{
- if( pSong == NULL ) LoadFallback();
- else if( pSong->HasBanner() ) Load( pSong->GetBannerPath() );
- else LoadFallback();
+ if( pSong == NULL ) LoadFallback();
+ else if( pSong->HasBanner() ) Load( pSong->GetBannerPath() );
+ else LoadFallback();
m_bScrolling = false;
}
-void Banner::LoadAllMusic()
-{
- Load( THEME->GetPathG("Banner","All") );
- m_bScrolling = false;
-}
-
void Banner::LoadMode()
{
Load( THEME->GetPathG("Banner","Mode") );
@@ -211,13 +205,28 @@ void Banner::LoadFallbackCharacterIcon()
void Banner::LoadRoulette()
{
Load( THEME->GetPathG("Banner","roulette") );
- m_bScrolling = (bool)SCROLL_RANDOM;
+ m_bScrolling = (bool)SCROLL_ROULETTE;
}
void Banner::LoadRandom()
{
Load( THEME->GetPathG("Banner","random") );
- m_bScrolling = (bool)SCROLL_ROULETTE;
+ m_bScrolling = (bool)SCROLL_RANDOM;
+}
+
+void Banner::LoadFromSortOrder( SortOrder so )
+{
+ // TODO: See if the check for NULL/PREFERRED(?) is needed.
+ if( so == SortOrder_Invalid )
+ {
+ LoadFallback();
+ }
+ else
+ {
+ if( so != SORT_GROUP && so != SORT_RECENT )
+ Load( THEME->GetPathG("Banner",ssprintf("%s",SortOrderToString(so).c_str())) );
+ }
+ m_bScrolling = false;
}
// lua start
@@ -274,6 +283,19 @@ public:
p->LoadFromSongGroup( SArg(1) );
return 0;
}
+ static int LoadFromSortOrder( T* p, lua_State *L )
+ {
+ if( lua_isnil(L,1) ) { p->LoadFromSortOrder( SortOrder_Invalid ); }
+ else
+ {
+ SortOrder so = Enum::Check(L, 1);
+ p->LoadFromSortOrder( so );
+ }
+ return 0;
+ }
+ static int GetScrolling( T* p, lua_State *L ){ lua_pushboolean( L, p->GetScrolling() ); return 1; }
+ static int SetScrolling( T* p, lua_State *L ){ p->SetScrolling( BArg(1), FArg(2) ); return 0; }
+ static int GetPercentScrolling( T* p, lua_State *L ){ lua_pushnumber( L, p->ScrollingPercent() ); return 1; }
LunaBanner()
{
@@ -287,6 +309,10 @@ public:
ADD_METHOD( LoadBannerFromUnlockEntry );
ADD_METHOD( LoadBackgroundFromUnlockEntry );
ADD_METHOD( LoadFromSongGroup );
+ ADD_METHOD( LoadFromSortOrder );
+ ADD_METHOD( GetScrolling );
+ ADD_METHOD( SetScrolling );
+ ADD_METHOD( GetPercentScrolling );
}
};
diff --git a/src/Banner.h b/src/Banner.h
index 7fe790559c..a7c717bc76 100644
--- a/src/Banner.h
+++ b/src/Banner.h
@@ -1,15 +1,17 @@
-/* Banner - The song/course's banner displayed in SelectMusic/Course. */
+/** @brief Banner - The song/course's banner displayed in SelectMusic/Course. */
#ifndef BANNER_H
#define BANNER_H
#include "Sprite.h"
#include "RageTextureID.h"
+#include "GameConstantsAndTypes.h"
class Song;
class Course;
class Character;
class UnlockEntry;
+/** @brief The characteristics of a Banner */
class Banner : public Sprite
{
public:
@@ -23,8 +25,11 @@ public:
virtual void Update( float fDeltaTime );
- void LoadFromSong( Song* pSong ); // NULL means no song
- void LoadAllMusic();
+ /**
+ * @brief Attempt to load the banner from a song.
+ * @param pSong the song in question. If NULL, there is no song.
+ */
+ void LoadFromSong( Song* pSong );
void LoadMode();
void LoadFromSongGroup( RString sSongGroup );
void LoadFromCourse( const Course *pCourse );
@@ -34,12 +39,14 @@ public:
void LoadBackgroundFromUnlockEntry( const UnlockEntry* pUE );
void LoadRoulette();
void LoadRandom();
+ void LoadFromSortOrder( SortOrder so );
void LoadFallback();
void LoadFallbackBG();
void LoadCourseFallback();
void LoadFallbackCharacterIcon();
void SetScrolling( bool bScroll, float Percent = 0 );
+ bool GetScrolling() const { return m_bScrolling; }
float ScrollingPercent() const { return m_fPercentScrolling; }
// Lua
@@ -52,8 +59,10 @@ protected:
#endif
-/*
- * (c) 2001-2004 Chris Danford
+/**
+ * @file
+ * @author Chris Danford (c) 2001-2004
+ * @section LICENSE
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
diff --git a/src/BitmapText.cpp b/src/BitmapText.cpp
index 08b0fcb1bf..141a661c75 100644
--- a/src/BitmapText.cpp
+++ b/src/BitmapText.cpp
@@ -136,7 +136,6 @@ void BitmapText::LoadFromNode( const XNode* pNode )
Actor::LoadFromNode( pNode );
}
-
bool BitmapText::LoadFromFont( const RString& sFontFilePath )
{
CHECKPOINT_M( ssprintf("BitmapText::LoadFromFont(%s)", sFontFilePath.c_str()) );
@@ -156,7 +155,6 @@ bool BitmapText::LoadFromFont( const RString& sFontFilePath )
return true;
}
-
bool BitmapText::LoadFromTextureAndChars( const RString& sTexturePath, const RString& sChars )
{
CHECKPOINT_M( ssprintf("BitmapText::LoadFromTextureAndChars(\"%s\",\"%s\")", sTexturePath.c_str(), sChars.c_str()) );
@@ -345,7 +343,7 @@ void BitmapText::DrawChars( bool bUseStrokeTexture )
else
DISPLAY->SetTexture( TextureUnit_1, m_vpFontPageTextures[start]->m_pTextureMain->GetTexHandle() );
- /* Don't bother setting texture render states for text. We never go outside of 0..1. */
+ /* Don't bother setting texture render states for text. We never go outside of 0..1. */
/* We should call SetTextureRenderStates because it does more than just setting
* the texture wrapping state. If setting the wrapping state is found to be slow,
* there should probably be a "don't care" texture wrapping mode set in Actor. -Chris */
@@ -360,8 +358,8 @@ void BitmapText::DrawChars( bool bUseStrokeTexture )
}
}
-/* sText is UTF-8. If not all of the characters in sText are available in the
- * font, sAlternateText will be used instead. If there are unavailable characters
+/* sText is UTF-8. If not all of the characters in sText are available in the
+ * font, sAlternateText will be used instead. If there are unavailable characters
* in sAlternateText, too, just use sText. */
void BitmapText::SetText( const RString& _sText, const RString& _sAlternateText, int iWrapWidthPixels )
{
@@ -396,13 +394,13 @@ void BitmapText::SetTextInternal()
}
else
{
- // Break sText into lines that don't exceed iWrapWidthPixels
- // (if only one word fits on the line, it may be larger than iWrapWidthPixels).
+ // Break sText into lines that don't exceed iWrapWidthPixels. (if only
+ // one word fits on the line, it may be larger than iWrapWidthPixels).
// This does not work in all languages:
/* "...I can add Japanese wrapping, at least. We could handle hyphens
* and soft hyphens and pretty easily, too." -glenn */
- // TODO: Move this wrapping logic into Font
+ // TODO: Move this wrapping logic into Font.
vector asLines;
split( m_sText, "\n", asLines, false );
@@ -695,15 +693,9 @@ void BitmapText::DrawPrimitives()
/* Draw glow using the base texture and the glow texture. Otherwise,
* glow looks too tame on BitmapText that has a stroke. - Chris Danford */
/* This doesn't work well if the font is using an invisible stroke, as
- * the invisible stroke will glow as well. Time for TextGlowMode. -aj */
- if(m_TextGlowMode == TextGlowMode_Inner || m_TextGlowMode == TextGlowMode_Both)
- {
- DrawChars( false );
- }
- if(m_TextGlowMode == TextGlowMode_Stroke || m_TextGlowMode == TextGlowMode_Both)
- {
- DrawChars( true );
- }
+ * the invisible stroke will glow as well. Time for TextGlowMode.
+ * Only draw the strokes if the glow mode is not inner only. -aj */
+ DrawChars(m_TextGlowMode != TextGlowMode_Inner);
}
}
@@ -813,11 +805,11 @@ public:
{
RString s = SArg(1);
RString sAlt;
- // XXX: Lua strings should simply use "\n" natively. However, some
- // settext calls may be made from GetMetric() calls to other strings,
- // and it's confusing for :: to work in some strings and not others.
- // Eventually, all strings should be Lua expressions, but until then
- // continue to support this.
+ /* XXX: Lua strings should simply use "\n" natively. However, some
+ * settext calls may be made from GetMetric() calls to other strings, and
+ * it's confusing for :: to work in some strings and not others.
+ * Eventually, all strings should be Lua expressions, but until then,
+ * continue to support this. */
s.Replace("::","\n");
FontCharAliases::ReplaceMarkers( s );
@@ -863,6 +855,8 @@ public:
ADD_METHOD( strokecolor );
ADD_METHOD( uppercase );
ADD_METHOD( textglowmode );
+ //ADD_METHOD( LoadFromFont );
+ //ADD_METHOD( LoadFromTextureAndChars );
}
};
diff --git a/src/Character.cpp b/src/Character.cpp
index e158089ffc..ac8a8da14d 100644
--- a/src/Character.cpp
+++ b/src/Character.cpp
@@ -17,7 +17,6 @@ bool Character::Load( RString sCharDir )
sCharDir += "/";
m_sCharDir = sCharDir;
-
// save ID
{
vector as;
@@ -61,7 +60,7 @@ bool Character::Load( RString sCharDir )
// get optional display name
ini.GetValue( "Character", "DisplayName", m_sDisplayName );
-
+
// get optional InitCommand
RString s;
ini.GetValue( "Character", "InitCommand", s );
@@ -70,7 +69,6 @@ bool Character::Load( RString sCharDir )
return true;
}
-
RString GetRandomFileInDir( RString sDir )
{
vector asFiles;
@@ -81,7 +79,6 @@ RString GetRandomFileInDir( RString sDir )
return asFiles[RandomInt(asFiles.size())];
}
-
RString Character::GetModelPath() const
{
RString s = m_sCharDir + "model.txt";
@@ -214,6 +211,7 @@ public:
static int GetDanceAnimationPath( T* p, lua_State *L ) { lua_pushstring(L, p->GetDanceAnimationPath() ); return 1; }
static int GetCharacterDir( T* p, lua_State *L ) { lua_pushstring(L, p->m_sCharDir ); return 1; }
static int GetCharacterID( T* p, lua_State *L ) { lua_pushstring(L, p->m_sCharacterID ); return 1; }
+ static int GetDisplayName( T* p, lua_State *L ) { lua_pushstring(L, p->GetDisplayName() ); return 1; }
LunaCharacter()
{
@@ -228,6 +226,7 @@ public:
ADD_METHOD( GetDanceAnimationPath );
ADD_METHOD( GetCharacterDir );
ADD_METHOD( GetCharacterID );
+ ADD_METHOD( GetDisplayName );
}
};
diff --git a/src/Command.h b/src/Command.h
index cce86734a9..0a0b6b8da0 100644
--- a/src/Command.h
+++ b/src/Command.h
@@ -9,8 +9,7 @@ public:
void Load( const RString &sCommand );
RString GetOriginalCommandString() const; // used when reporting an error in number of args
-
- RString GetName() const; // the command name is the first argument in all-lowercase
+ RString GetName() const; // the command name is the first argument in all-lowercase
void Clear() { m_vsArgs.clear(); }
@@ -32,10 +31,9 @@ public:
};
// Take a command list string and return pointers to each of the tokens in the
-// string. sCommand list is a list of commands separated by ';'.
-// TODO: This is expensive to do during the game. Eventually,
-// move all calls to ParseCommands to happen during load, then execute
-// from the parsed Command structures.
+// string. sCommand list is a list of commands separated by ';'.
+// TODO: This is expensive to do during the game. Eventually, move all calls to
+// ParseCommands to happen during load, then execute from the parsed Command structures.
void ParseCommands( const RString &sCmds, Commands &vCmdsOut );
Commands ParseCommands( const RString &sCmds );
diff --git a/src/CommandLineActions.cpp b/src/CommandLineActions.cpp
index e073afb7df..7d852d1f76 100644
--- a/src/CommandLineActions.cpp
+++ b/src/CommandLineActions.cpp
@@ -24,6 +24,7 @@
#include
#endif
+/** @brief The directory where languages should be installed. */
const RString INSTALLER_LANGUAGES_DIR = "Themes/_Installer/Languages/";
vector CommandLineActions::ToProcess;
@@ -82,11 +83,14 @@ extern const char *const version_date;
extern const char *const version_time;
#endif
+/**
+ * @brief Print out version information.
+ *
+ * HACK: This function is primarily needed for Windows users.
+ * Mac OS X and Linux print out version information on the command line
+ * regardless of any preferences (tested by shakesoda on Mac). -aj */
static void Version()
{
- /* HACK: This is only needed on Windows.
- Mac and Linux print out version information on the command line regardless
- of any preferences (tested by shakesoda on Mac). -aj */
#if defined(WIN32)
RString sProductID = ssprintf("%s", PRODUCT_ID_VER);
RString sVersion = "(sm-ssc was built without HAVE_VERSION_INFO)";
diff --git a/src/CommandLineActions.h b/src/CommandLineActions.h
index 805508912e..fdbaef8919 100644
--- a/src/CommandLineActions.h
+++ b/src/CommandLineActions.h
@@ -3,25 +3,34 @@
class LoadingWindow;
+/** @brief The collection of command line actions. */
namespace CommandLineActions
{
- void Handle(LoadingWindow* pLW); // perform a utility action, then exit
+ /**
+ * @brief Perform a utility function, then exit.
+ * @param pLW the LoadingWindow that is presently not used? */
+ void Handle(LoadingWindow* pLW);
+ /** @brief The housing for the command line arguments. */
class CommandLineArgs
{
public:
+ /** @brief the arguments in question. */
vector argv;
};
- // a list of command line arguemnts to process while the game is running.
- // These args could have come from this process or passed to this process
- // from another process.
+ /**
+ * @brief A list of command line arguemnts to process while the game is running.
+ * These args could have come from this process or passed to this process
+ * from another process. */
extern vector ToProcess;
}
#endif
-/*
- * (c) 2006 Chris Danford, Steve Checkoway
+/**
+ * @file
+ * @author Chris Danford, Steve Checkoway (c) 2006
+ * @section LICENSE
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
diff --git a/src/CommonMetrics.h b/src/CommonMetrics.h
index 378257ab75..2c9db444bf 100644
--- a/src/CommonMetrics.h
+++ b/src/CommonMetrics.h
@@ -1,4 +1,4 @@
-/* CommonMetrics - Definitions of metrics that are in the "Common" group */
+/** @brief CommonMetrics - Definitions of metrics that are in the "Common" group */
#ifndef COMMON_METRICS_H
#define COMMON_METRICS_H
@@ -42,19 +42,25 @@ private:
};
-// Metrics
+/** @brief The common metrics that are used throughout. */
namespace CommonMetrics
{
extern ThemeMetric FIRST_ATTRACT_SCREEN;
extern ThemeMetric DEFAULT_MODIFIERS;
- extern LocalizedString WINDOW_TITLE;
+ /** @brief the phrase that appears on the title bar. */
+ extern LocalizedString WINDOW_TITLE;
extern ThemeMetric MAX_COURSE_ENTRIES_BEFORE_VARIOUS;
- extern ThemeMetric TICK_EARLY_SECONDS;
+ extern ThemeMetric TICK_EARLY_SECONDS;
+ /** @brief the name of the default noteskin. */
extern ThemeMetric DEFAULT_NOTESKIN_NAME;
- extern ThemeMetricDifficultiesToShow DIFFICULTIES_TO_SHOW;
+ /** @brief Which difficulties are to be shown? */
+ extern ThemeMetricDifficultiesToShow DIFFICULTIES_TO_SHOW;
+ /** @brief Which course difficulties are to be shown? */
extern ThemeMetricCourseDifficultiesToShow COURSE_DIFFICULTIES_TO_SHOW;
+ /** @brief Which step types are to be shown? */
extern ThemeMetricStepsTypesToShow STEPS_TYPES_TO_SHOW;
- extern ThemeMetric AUTO_SET_STYLE;
+ extern ThemeMetric AUTO_SET_STYLE;
+ /** @brief How many decimal places are used? */
extern ThemeMetric PERCENT_SCORE_DECIMAL_PLACES;
RString LocalizeOptionItem( const RString &s, bool bOptional );
@@ -62,8 +68,10 @@ namespace CommonMetrics
#endif
-/*
- * (c) 2003-2004 Chris Danford
+/**
+ * @file
+ * @author Chris Danford (c) 2003-2004
+ * @section LICENSE
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
diff --git a/src/CourseContentsList.cpp b/src/CourseContentsList.cpp
index 0c73ab5053..98dfa1d61f 100644
--- a/src/CourseContentsList.cpp
+++ b/src/CourseContentsList.cpp
@@ -42,10 +42,6 @@ void CourseContentsList::SetFromGameState()
{
RemoveAllChildren();
- // FIXME: Is there a better way to handle when players don't have
- // the same number of TrailEntries?
- // They have to have the same number, and of the same songs, or gameplay
- // isn't going to line up.
if( GAMESTATE->m_MasterPlayerNumber == PlayerNumber_Invalid )
return;
const Trail *pMasterTrail = GAMESTATE->m_pCurTrail[GAMESTATE->m_MasterPlayerNumber];
diff --git a/src/CourseLoaderCRS.cpp b/src/CourseLoaderCRS.cpp
index 7f380cbf80..e780b7b0d1 100644
--- a/src/CourseLoaderCRS.cpp
+++ b/src/CourseLoaderCRS.cpp
@@ -16,8 +16,10 @@
#include "CourseUtil.h"
#include
+/** @brief Edit courses can only be so big before they are rejected. */
const int MAX_EDIT_COURSE_SIZE_BYTES = 32*1024; // 32KB
+/** @brief The list of difficulty names for courses. */
const char *g_CRSDifficultyNames[] =
{
"Beginner",
@@ -28,6 +30,11 @@ const char *g_CRSDifficultyNames[] =
"Edit",
};
+/**
+ * @brief Retrieve the course difficulty based on the string name.
+ * @param s the name of the difficulty.
+ * @return the course difficulty.
+ */
static CourseDifficulty CRSStringToDifficulty( const RString& s )
{
FOREACH_ENUM( Difficulty,i)
@@ -99,6 +106,7 @@ bool CourseLoaderCRS::LoadFromMsd( const RString &sPath, const MsdFile &msd, Cou
out.m_iCustomMeter[cd] = max( atoi(sParams[2]), 0 );
}
}
+ // todo: add COMBO and COMBOMODE from DWI CRS files? -aj
else if( 0 == stricmp(sValueName, "MODS") )
{
diff --git a/src/CourseLoaderCRS.h b/src/CourseLoaderCRS.h
index 574a87bbf8..e03081a3f4 100644
--- a/src/CourseLoaderCRS.h
+++ b/src/CourseLoaderCRS.h
@@ -1,4 +1,4 @@
-/* CourseLoaderCRS - Reads a Course from an .CRS file. */
+/** @brief CourseLoaderCRS - Reads a Course from an .CRS file. */
#ifndef COURSE_LOADER_CRS_H
#define COURSE_LOADER_CRS_H
@@ -7,19 +7,56 @@
class Course;
class MsdFile;
+/** @brief The Course Loader handles parsing the .crs files. */
namespace CourseLoaderCRS
{
+ /**
+ * @brief Attempt to load a course file from a particular path.
+ * @param sPath the path to the file.
+ * @param out the course file.
+ * @return its success or failure.
+ */
bool LoadFromCRSFile( const RString &sPath, Course &out );
+ /**
+ * @brief Attempt to load the course information from the msd context.
+ * @param sPath the path to the file.
+ * @param msd the MSD context.
+ * @param out the course file.
+ * @param bFromCache true if loading from the cache area.
+ * @return its success or failure.
+ */
bool LoadFromMsd( const RString &sPath, const MsdFile &msd, Course &out, bool bFromCache );
+ /**
+ * @brief Attempt to load the course file from the buffer.
+ * @param sPath the path to the file.
+ * @param sBuffer the path to the buffer.
+ * @param out the course file.
+ * @return its success or failure.
+ */
bool LoadFromBuffer( const RString &sPath, const RString &sBuffer, Course &out );
+ /**
+ * @brief Attempt to load an edit course from the hard drive.
+ * @param sEditFilePath a path on the hard drive to check.
+ * @param slot the Profile of the user with the edit course.
+ * @return its success or failure.
+ */
bool LoadEditFromFile( const RString &sEditFilePath, ProfileSlot slot );
+ /**
+ * @brief Attempt to load an edit course from the buffer.
+ * @param sBuffer the path to the buffer.
+ * @param sPath the path to the file.
+ * @param slot the individual's profile.
+ * @return its success or failure.
+ */
bool LoadEditFromBuffer( const RString &sBuffer, const RString &sPath, ProfileSlot slot );
}
#endif
-/*
- * (c) 2001-2004 Chris Danford
+/**
+ * @file
+ * @author Chris Danford (c) 2001-2004
+ * @section LICENSE
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
diff --git a/src/CourseUtil.h b/src/CourseUtil.h
index 80bf355c6f..d0c4738cef 100644
--- a/src/CourseUtil.h
+++ b/src/CourseUtil.h
@@ -1,4 +1,4 @@
-/* CourseUtil - Utility functions that deal with Course. */
+/** @brief CourseUtil - Utility functions that deal with Course. */
#ifndef COURSEUTIL_H
#define COURSEUTIL_H
@@ -93,8 +93,10 @@ private:
#endif
-/*
- * (c) 2001-2004 Chris Danford
+/**
+ * @file
+ * @author Chris Danford (c) 2001-2004
+ * @section LICENSE
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
diff --git a/src/CourseWriterCRS.cpp b/src/CourseWriterCRS.cpp
index c69b405a7b..390fa45367 100644
--- a/src/CourseWriterCRS.cpp
+++ b/src/CourseWriterCRS.cpp
@@ -7,8 +7,14 @@
#include "Song.h"
#include "RageFileDriverMemory.h"
+/** @brief Load the difficulty names from CourseLoaderCRS. */
extern const char *g_CRSDifficultyNames[]; // in CourseLoaderCRS
+/**
+ * @brief Get the string of the course difficulty.
+ * @param iVal the course difficulty.
+ * @return the string.
+ */
static RString DifficultyToCRSString( CourseDifficulty iVal )
{
return g_CRSDifficultyNames[iVal];
diff --git a/src/CourseWriterCRS.h b/src/CourseWriterCRS.h
index 3896e4ce99..9b2887c809 100644
--- a/src/CourseWriterCRS.h
+++ b/src/CourseWriterCRS.h
@@ -1,4 +1,4 @@
-/* CourseWriterCRS - Writes a Course to an .CRS file. */
+/** @brief CourseWriterCRS - Writes a Course to an .CRS file. */
#ifndef COURSE_WRITER_CRS_H
#define COURSE_WRITER_CRS_H
@@ -6,18 +6,44 @@
class Course;
class RageFileBasic;
+/** @brief The Course Writer handles writing the .crs files. */
namespace CourseWriterCRS
{
+ /**
+ * @brief Write the course to a file.
+ * @param course the course contents.
+ * @param f the file being built.
+ * @param bSavingCache is true if cache information is being saved as well.
+ * @return its success or failure.
+ */
bool Write( const Course &course, RageFileBasic &f, bool bSavingCache );
+ /**
+ * @brief Write the course to a file.
+ * @param course the course contents.
+ * @param sPath the path to the file.
+ * @param bSavingCache is true if cache information is being saved as well.
+ * @return its success or failure.
+ */
bool Write( const Course &course, const RString &sPath, bool bSavingCache );
+ /**
+ * @brief Retrieve course information from a file for eventual writing.
+ * @param pCourse the course file.
+ * @param sOut the path to the file.
+ */
void GetEditFileContents( const Course *pCourse, RString &sOut );
+ /**
+ * @brief Write the custom course to the machine's hard drive.
+ * @param pCourse the course file.
+ */
void WriteEditFileToMachine( const Course *pCourse );
}
#endif
-/*
- * (c) 2001-2005 Chris Danford
+/**
+ * @file
+ * @author Chris Danford (c) 2001-2005
+ * @section LICENSE
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
diff --git a/src/DateTime.cpp b/src/DateTime.cpp
index 3ad458b1d3..ba69d02f03 100644
--- a/src/DateTime.cpp
+++ b/src/DateTime.cpp
@@ -42,6 +42,20 @@ bool DateTime::operator==( const DateTime& other ) const
return true;
}
+bool DateTime::operator>( const DateTime& other ) const
+{
+#define COMPARE( v ) if(v!=other.v) return v>other.v;
+ COMPARE( tm_year );
+ COMPARE( tm_mon );
+ COMPARE( tm_mday );
+ COMPARE( tm_hour );
+ COMPARE( tm_min );
+ COMPARE( tm_sec );
+#undef COMPARE
+ // they're equal
+ return false;
+}
+
DateTime DateTime::GetNowDateTime()
{
time_t now = time(NULL);
@@ -73,9 +87,7 @@ void DateTime::StripTime()
tm_sec = 0;
}
-//
// Common SQL/XML format: "YYYY-MM-DD HH:MM:SS"
-//
RString DateTime::GetString() const
{
RString s = ssprintf( "%d-%02d-%02d",
diff --git a/src/DateTime.h b/src/DateTime.h
index c0d0fac6d6..3fa1735bd0 100644
--- a/src/DateTime.h
+++ b/src/DateTime.h
@@ -45,6 +45,7 @@ struct DateTime
void Init();
bool operator<( const DateTime& other ) const;
+ bool operator>( const DateTime& other ) const;
bool operator==( const DateTime& other ) const;
bool operator!=( const DateTime& other ) const { return !operator==(other); }
diff --git a/src/Difficulty.cpp b/src/Difficulty.cpp
index 0a4cf2d244..1fc675b7db 100644
--- a/src/Difficulty.cpp
+++ b/src/Difficulty.cpp
@@ -21,37 +21,35 @@ XToString( Difficulty );
StringToX( Difficulty );
LuaXType( Difficulty );
-/* We prefer the above names; recognize a number of others, too. (They'll
- * get normalized when written to SMs, etc.) */
-/* TODO: Format specific hacks should be moved into the file loader for
- * that format. We don't want to carry these hacks forward to file
- * formats that don't need them. */
+/* We prefer the above names; recognize a number of others, too. (They'll get
+ * normalized when written to SMs, etc.) TODO: Format specific hacks should be
+ * moved into the file loader for that format. We don't want to carry these
+ * hacks forward to file formats that don't need them. */
Difficulty DwiCompatibleStringToDifficulty( const RString& sDC )
{
RString s2 = sDC;
s2.MakeLower();
- if( s2 == "beginner" ) return Difficulty_Beginner;
+ if( s2 == "beginner" ) return Difficulty_Beginner;
else if( s2 == "easy" ) return Difficulty_Easy;
- else if( s2 == "basic" ) return Difficulty_Easy;
- else if( s2 == "light" ) return Difficulty_Easy;
- else if( s2 == "medium" ) return Difficulty_Medium;
- else if( s2 == "another" ) return Difficulty_Medium;
- else if( s2 == "trick" ) return Difficulty_Medium;
+ else if( s2 == "basic" ) return Difficulty_Easy;
+ else if( s2 == "light" ) return Difficulty_Easy;
+ else if( s2 == "medium" ) return Difficulty_Medium;
+ else if( s2 == "another" ) return Difficulty_Medium;
+ else if( s2 == "trick" ) return Difficulty_Medium;
else if( s2 == "standard" ) return Difficulty_Medium;
else if( s2 == "difficult") return Difficulty_Medium;
else if( s2 == "hard" ) return Difficulty_Hard;
- else if( s2 == "ssr" ) return Difficulty_Hard;
- else if( s2 == "maniac" ) return Difficulty_Hard;
- else if( s2 == "heavy" ) return Difficulty_Hard;
- else if( s2 == "smaniac" ) return Difficulty_Challenge;
+ else if( s2 == "ssr" ) return Difficulty_Hard;
+ else if( s2 == "maniac" ) return Difficulty_Hard;
+ else if( s2 == "heavy" ) return Difficulty_Hard;
+ else if( s2 == "smaniac" ) return Difficulty_Challenge;
else if( s2 == "challenge" ) return Difficulty_Challenge;
- else if( s2 == "expert" ) return Difficulty_Challenge;
- else if( s2 == "oni" ) return Difficulty_Challenge;
+ else if( s2 == "expert" ) return Difficulty_Challenge;
+ else if( s2 == "oni" ) return Difficulty_Challenge;
else if( s2 == "edit" ) return Difficulty_Edit;
- else return Difficulty_Invalid;
+ else return Difficulty_Invalid;
}
-
const RString &CourseDifficultyToLocalizedString( CourseDifficulty x )
{
static auto_ptr g_CourseDifficultyName[NUM_Difficulty];
@@ -86,6 +84,8 @@ RString GetCustomDifficulty( StepsType st, Difficulty dc, CourseType ct )
* sure what the correct behavior in this case should be. Should we still
* allow custom difficulties? Why do we not allow custom difficulties for
* Couple, Routine, or Edit? - Steve */
+ // CustomDifficulty for Edit defeats the purpose of the edit's name.
+ // I don't know the other two. -aj
if( st == StepsType_Invalid )
{
/* This is not totally necessary since DifficultyToString() will
@@ -161,13 +161,11 @@ RString TrailToCustomDifficulty( const Trail *pTrail )
return GetCustomDifficulty( pTrail->m_StepsType, pTrail->m_CourseDifficulty, pTrail->m_CourseType );
}
-
#include "LuaBinding.h"
LuaFunction( StepsToCustomDifficulty, StepsToCustomDifficulty(Luna::check(L, 1)) );
LuaFunction( TrailToCustomDifficulty, TrailToCustomDifficulty(Luna::check(L, 1)) );
-
/*
* (c) 2001-2004 Chris Danford
* All rights reserved.
diff --git a/src/DifficultyList.cpp b/src/DifficultyList.cpp
index 87eb1a2268..668061d8c8 100644
--- a/src/DifficultyList.cpp
+++ b/src/DifficultyList.cpp
@@ -78,6 +78,7 @@ void StepsDisplayList::LoadFromNode( const XNode* pNode )
for( unsigned m = 0; m < m_Lines.size(); ++m )
{
+ // todo: Use Row1, Row2 for names? also m_sName+"Row" -aj
m_Lines[m].m_Meter.SetName( "Row" );
m_Lines[m].m_Meter.Load( "StepsDisplayListRow", NULL );
this->AddChild( &m_Lines[m].m_Meter );
diff --git a/src/FadingBanner.cpp b/src/FadingBanner.cpp
index c8609ab192..b3bbe3e81a 100644
--- a/src/FadingBanner.cpp
+++ b/src/FadingBanner.cpp
@@ -181,12 +181,6 @@ void FadingBanner::LoadFromSong( const Song* pSong )
LoadFromCachedBanner( sPath );
}
-void FadingBanner::LoadAllMusic()
-{
- BeforeChange();
- m_Banner[m_iIndexLatest].LoadAllMusic();
-}
-
void FadingBanner::LoadMode()
{
BeforeChange();
@@ -240,6 +234,12 @@ void FadingBanner::LoadRandom()
m_Banner[m_iIndexLatest].LoadRandom();
}
+void FadingBanner::LoadFromSortOrder( SortOrder so )
+{
+ BeforeChange();
+ m_Banner[m_iIndexLatest].LoadFromSortOrder(so);
+}
+
void FadingBanner::LoadFallback()
{
BeforeChange();
@@ -252,7 +252,6 @@ void FadingBanner::LoadCourseFallback()
m_Banner[m_iIndexLatest].LoadCourseFallback();
}
-
// lua start
#include "LuaBinding.h"
@@ -286,6 +285,7 @@ public:
return 0;
}
static int LoadFromSongGroup( T* p, lua_State *L ) { p->LoadFromSongGroup( SArg(1) ); return 0; }
+ static int GetLatestIndex( T* p, lua_State *L ){ lua_pushnumber( L, p->GetLatestIndex() ); return 1; }
LunaFadingBanner()
{
@@ -296,6 +296,7 @@ public:
ADD_METHOD( LoadFromCourse );
ADD_METHOD( LoadIconFromCharacter );
ADD_METHOD( LoadCardFromCharacter );
+ ADD_METHOD( GetLatestIndex );
}
};
diff --git a/src/FadingBanner.h b/src/FadingBanner.h
index f86198110f..8d46fcaf78 100644
--- a/src/FadingBanner.h
+++ b/src/FadingBanner.h
@@ -19,7 +19,6 @@ public:
* resolution banner, set bLowResToHighRes to true. */
void Load( RageTextureID ID, bool bLowResToHighRes=false );
void LoadFromSong( const Song* pSong ); // NULL means no song
- void LoadAllMusic();
void LoadMode();
void LoadFromSongGroup( RString sSongGroup );
void LoadFromCourse( const Course* pCourse );
@@ -27,6 +26,7 @@ public:
void LoadBannerFromUnlockEntry( const UnlockEntry* pUE );
void LoadRoulette();
void LoadRandom();
+ void LoadFromSortOrder( SortOrder so );
void LoadFallback();
void LoadCourseFallback();
@@ -37,6 +37,8 @@ public:
virtual void UpdateInternal( float fDeltaTime );
virtual void DrawPrimitives();
+ int GetLatestIndex(){ return m_iIndexLatest; }
+
// Lua
void PushSelf( lua_State *L );
@@ -44,11 +46,11 @@ protected:
void BeforeChange( bool bLowResToHighRes=false );
static const int NUM_BANNERS = 5;
- Banner m_Banner[NUM_BANNERS];
+ Banner m_Banner[NUM_BANNERS];
int m_iIndexLatest;
- bool m_bMovingFast;
- bool m_bSkipNextBannerUpdate;
+ bool m_bMovingFast;
+ bool m_bSkipNextBannerUpdate;
};
#endif
diff --git a/src/FileDownload.cpp b/src/FileDownload.cpp
index a9a9678f4a..9a643f2195 100644
--- a/src/FileDownload.cpp
+++ b/src/FileDownload.cpp
@@ -201,7 +201,7 @@ void FileTransfer::StartTransfer( TransferType type, const RString &sURL, const
}
*/
- vsHeaders.push_back( "Content-Length: " + ssprintf("%d",sRequestPayload.size()) );
+ vsHeaders.push_back( "Content-Length: " + ssprintf("%zd",sRequestPayload.size()) );
RString sHeader;
FOREACH_CONST( RString, vsHeaders, h )
diff --git a/src/Font.cpp b/src/Font.cpp
index e012dcb898..ec00195979 100644
--- a/src/Font.cpp
+++ b/src/Font.cpp
@@ -202,7 +202,7 @@ FontPage::~FontPage()
int Font::GetLineWidthInSourcePixels( const wstring &szLine ) const
{
int iLineWidth = 0;
-
+
for( unsigned i=0; iTrace( "Font::LoadFromFontName(%s)", sASCIITexturePath.c_str() );
-
m_iRefCount = 1;
m_pDefault = NULL;
m_bRightToLeft = false;
@@ -239,10 +237,11 @@ Font::~Font()
void Font::Unload()
{
+ LOG->Trace("Font:Unload '%s'",path.c_str());
for( unsigned i = 0; i < m_apPages.size(); ++i )
delete m_apPages[i];
m_apPages.clear();
-
+
m_iCharToGlyph.clear();
m_pDefault = NULL;
@@ -656,6 +655,8 @@ void Font::Load( const RString &sIniPath, RString sChars )
{
ASSERT_M( !GetExtension(sIniPath).CompareNoCase("ini"), sIniPath );
+ LOG->Trace( "Font: Loading new font '%s'",sIniPath.c_str());
+
// Check for recursion (recursive imports).
for( unsigned i = 0; i < LoadStack.size(); ++i )
{
@@ -725,9 +726,9 @@ void Font::Load( const RString &sIniPath, RString sChars )
continue;
}
- Font subfont;
- subfont.Load(path, "");
- MergeFont(subfont);
+ Font *subfont=FONT->LoadFont(path,"");
+ MergeFont(*subfont);
+ FONT->UnloadFont(subfont);
}
}
diff --git a/src/FontManager.cpp b/src/FontManager.cpp
index 7830f60675..837a5d5aa1 100644
--- a/src/FontManager.cpp
+++ b/src/FontManager.cpp
@@ -22,7 +22,9 @@ FontManager::~FontManager()
{
const FontName &fn = i->first;
Font* pFont = i->second;
- LOG->Trace( "FONT LEAK: '%s', RefCount = %d.", fn.first.c_str(), pFont->m_iRefCount );
+ if(pFont->m_iRefCount>0) {
+ LOG->Trace( "FONT LEAK: '%s', RefCount = %d.", fn.first.c_str(), pFont->m_iRefCount );
+ }
delete pFont;
}
}
@@ -38,6 +40,9 @@ void FontManager::ReloadFonts()
Font* FontManager::LoadFont( const RString &sFontOrTextureFilePath, RString sChars )
{
+ PruneFonts();
+
+ Font *pFont;
// Convert the path to lowercase so that we don't load duplicates.
// Really, this does not solve the duplicate problem. We could have two copies
// of the same bitmap if there are equivalent but different paths
@@ -48,15 +53,16 @@ Font* FontManager::LoadFont( const RString &sFontOrTextureFilePath, RString sCha
map::iterator p = g_mapPathToFont.find( NewName );
if( p != g_mapPathToFont.end() )
{
- Font *pFont=p->second;
- pFont->m_iRefCount++;
- return pFont;
+ pFont=p->second;
+ }
+ else {
+ pFont= new Font;
+ pFont->Load(sFontOrTextureFilePath, sChars);
+ g_mapPathToFont[NewName] = pFont;
}
- Font *f = new Font;
- f->Load(sFontOrTextureFilePath, sChars);
- g_mapPathToFont[NewName] = f;
- return f;
+ ++pFont->m_iRefCount;
+ return pFont;
}
Font *FontManager::CopyFont( Font *pFont )
@@ -75,19 +81,29 @@ void FontManager::UnloadFont( Font *fp )
if(i->second != fp)
continue;
+ ASSERT_M(fp->m_iRefCount>0,"Attempting to unload a font with zero ref count!");
+
i->second->m_iRefCount--;
- if( fp->m_iRefCount == 0 )
- {
- delete i->second; // free the texture
- g_mapPathToFont.erase( i ); // and remove the key in the map
- }
return;
}
-
+
FAIL_M( ssprintf("Unloaded an unknown font (%p)", fp) );
}
+void FontManager::PruneFonts() {
+ for( std::map::iterator i = g_mapPathToFont.begin();i != g_mapPathToFont.end();) {
+ Font *fp=i->second;
+ if(fp->m_iRefCount==0) {
+ delete fp;
+ g_mapPathToFont.erase(i);
+ i = g_mapPathToFont.end();
+ } else {
+ ++i;
+ }
+ }
+}
+
/*
* (c) 2001-2003 Chris Danford, Glenn Maynard
* All rights reserved.
diff --git a/src/FontManager.h b/src/FontManager.h
index 1aad869ce7..9124d694f9 100644
--- a/src/FontManager.h
+++ b/src/FontManager.h
@@ -15,6 +15,7 @@ public:
Font* LoadFont( const RString &sFontOrTextureFilePath, RString sChars = "" );
Font *CopyFont( Font *pFont );
void UnloadFont( Font *fp );
+ void PruneFonts();
/* Warning: This reloads fonts completely, so all BitmapTexts need to be
* reset, too. If this isn't done, best case they end up with old font
diff --git a/src/GameCommand.cpp b/src/GameCommand.cpp
index dc474abed7..b6717b8fb6 100644
--- a/src/GameCommand.cpp
+++ b/src/GameCommand.cpp
@@ -852,6 +852,8 @@ bool GameCommand::IsZero() const
// lua start
#include "LuaBinding.h"
#include "Game.h"
+#include "Steps.h"
+#include "Character.h"
class LunaGameCommand: public Luna
{
@@ -861,8 +863,13 @@ public:
static int GetIndex( T* p, lua_State *L ) { lua_pushnumber(L, p->m_iIndex ); return 1; }
static int GetMultiPlayer( T* p, lua_State *L ) { lua_pushnumber(L, p->m_MultiPlayer); return 1; }
static int GetStyle( T* p, lua_State *L ) { if(p->m_pStyle==NULL) lua_pushnil(L); else {Style *pStyle = (Style*)p->m_pStyle; pStyle->PushSelf(L);} return 1; }
+ static int GetScreen( T* p, lua_State *L ) { lua_pushstring(L, p->m_sScreen ); return 1; }
static int GetProfileID( T* p, lua_State *L ) { lua_pushstring(L, p->m_sProfileID ); return 1; }
static int GetSong( T* p, lua_State *L ) { if(p->m_pSong==NULL) lua_pushnil(L); else p->m_pSong->PushSelf(L); return 1; }
+ static int GetSteps( T* p, lua_State *L ) { if(p->m_pSteps==NULL) lua_pushnil(L); else p->m_pSteps->PushSelf(L); return 1; }
+ static int GetCourse( T* p, lua_State *L ) { if(p->m_pCourse==NULL) lua_pushnil(L); else p->m_pCourse->PushSelf(L); return 1; }
+ static int GetTrail( T* p, lua_State *L ) { if(p->m_pTrail==NULL) lua_pushnil(L); else p->m_pTrail->PushSelf(L); return 1; }
+ static int GetCharacter( T* p, lua_State *L ) { if(p->m_pCharacter==NULL) lua_pushnil(L); else p->m_pCharacter->PushSelf(L); return 1; }
static int GetSongGroup( T* p, lua_State *L ) { lua_pushstring(L, p->m_sSongGroup ); return 1; }
static int GetUrl( T* p, lua_State *L ) { lua_pushstring(L, p->m_sUrl ); return 1; }
@@ -873,9 +880,18 @@ public:
ADD_METHOD( GetIndex );
ADD_METHOD( GetMultiPlayer );
ADD_METHOD( GetStyle );
+ //ADD_METHOD( GetDifficulty );
+ //ADD_METHOD( GetCourseDifficulty );
+ ADD_METHOD( GetScreen );
+ //ADD_METHOD( GetPlayMode );
ADD_METHOD( GetProfileID );
ADD_METHOD( GetSong );
+ ADD_METHOD( GetSteps );
+ ADD_METHOD( GetCourse );
+ ADD_METHOD( GetTrail );
+ ADD_METHOD( GetCharacter );
ADD_METHOD( GetSongGroup );
+ //ADD_METHOD( GetSortOrder );
ADD_METHOD( GetUrl );
}
};
diff --git a/src/GameConstantsAndTypes.h b/src/GameConstantsAndTypes.h
index 8889bc0752..9bd115b913 100644
--- a/src/GameConstantsAndTypes.h
+++ b/src/GameConstantsAndTypes.h
@@ -6,49 +6,66 @@
#include "EnumHelper.h"
// Note definitions
-// Use 1-35 instead of 1-13. -aj
-/* 35 is used because we have to be mindful of Profile data.
- * See Profile::InitGeneralData() for how MAX_METER is used. -aj */
+/** @brief Define the mininum difficulty value allowed. */
const int MIN_METER = 1;
+/**
+ * @brief Define the maximum difficulty value allowed.
+ *
+ * 35 is used rather than 13 due to a variety of Profile data.
+ * For more examples, see Profile::InitGeneralData(). -aj
+ */
const int MAX_METER = 35;
-// Credits
+/** @brief The maximum number of credits for coin mode. */
const int MAX_NUM_CREDITS = 20;
-/* This is just cached song data. Not all of it may actually be displayed
+/**
+ * @brief The various radar categories available.
+ *
+ * This is just cached song data. Not all of it may actually be displayed
* in the radar. */
enum RadarCategory
{
- RadarCategory_Stream = 0,
- RadarCategory_Voltage,
- RadarCategory_Air,
- RadarCategory_Freeze,
- RadarCategory_Chaos,
- RadarCategory_TapsAndHolds,
- RadarCategory_Jumps,
- RadarCategory_Holds,
- RadarCategory_Mines,
- RadarCategory_Hands,
- RadarCategory_Rolls,
- RadarCategory_Lifts,
- NUM_RadarCategory, // leave this at the end
+ RadarCategory_Stream = 0, /**< How much stream is in the song? */
+ RadarCategory_Voltage, /**< How much voltage is in the song? */
+ RadarCategory_Air, /**< How much air is in the song? */
+ RadarCategory_Freeze, /**< How much freeze (holds) is in the song? */
+ RadarCategory_Chaos, /**< How much chaos is in the song? */
+ RadarCategory_TapsAndHolds, /**< How many taps and holds are in the song? */
+ RadarCategory_Jumps, /**< How many jumps are in the song? */
+ RadarCategory_Holds, /**< How many holds are in the song? */
+ RadarCategory_Mines, /**< How many mines are in the song? */
+ RadarCategory_Hands, /**< How many hands are in the song? */
+ RadarCategory_Rolls, /**< How many rolls are in the song? */
+ RadarCategory_Lifts, /**< How many lifts are in the song? */
+ NUM_RadarCategory, /**< The number of radar categories. */
RadarCategory_Invalid
};
+/**
+ * @brief Turn the radar category into a proper string.
+ * @param cat the radar category.
+ * @return the string version of the radar category.
+ */
const RString& RadarCategoryToString( RadarCategory cat );
+/**
+ * @brief Turn the radar category into a proper localized string.
+ * @param cat the radar category.
+ * @return the localized string version of the radar category.
+ */
const RString& RadarCategoryToLocalizedString( RadarCategory cat );
LuaDeclareType( RadarCategory );
-
+/** @brief The different game categories available to play. */
enum StepsTypeCategory
{
- StepsTypeCategory_Single,
- StepsTypeCategory_Double,
- StepsTypeCategory_Couple,
- StepsTypeCategory_Routine,
+ StepsTypeCategory_Single, /**< One person plays on one side. */
+ StepsTypeCategory_Double, /**< One person plays on both sides. */
+ StepsTypeCategory_Couple, /**< Two players play on their own side. */
+ StepsTypeCategory_Routine, /**< Two players share both sides together. */
};
-
+/** @brief The different steps types for playing. */
enum StepsType
{
StepsType_dance_single = 0,
@@ -79,6 +96,7 @@ enum StepsType
StepsType_techno_single8,
StepsType_techno_double4,
StepsType_techno_double5,
+ StepsType_techno_double8,
StepsType_popn_five,
StepsType_popn_nine,
StepsType_guitar_five,
@@ -88,24 +106,43 @@ enum StepsType
};
LuaDeclareType( StepsType );
-// Play mode stuff
+/** @brief The various play modes available. */
enum PlayMode
{
- PLAY_MODE_REGULAR,
- PLAY_MODE_NONSTOP,
- PLAY_MODE_ONI,
- PLAY_MODE_ENDLESS,
- PLAY_MODE_BATTLE, // manually launched attacks
- PLAY_MODE_RAVE, // automatically launched attacks
+ PLAY_MODE_REGULAR, /**< The normal game mode, often with a set number of stages. */
+ PLAY_MODE_NONSTOP, /**< Play a set of songs without stopping. */
+ PLAY_MODE_ONI, /**< Similar to Nonstop, only there is also the danger of lives or a clock. */
+ PLAY_MODE_ENDLESS, /**< Keep playing until you get a game over. */
+ PLAY_MODE_BATTLE, /**< Choose when to send attacks to your opponent. */
+ PLAY_MODE_RAVE, /**< Have attacks launched during play automatically. */
NUM_PlayMode,
PlayMode_Invalid
};
+/**
+ * @brief Turn the play mode into a proper string.
+ * @param pm the play mode.
+ * @return the string version of the play mode.
+ */
const RString& PlayModeToString( PlayMode pm );
+/**
+ * @brief Turn the play mode into a proper localized string.
+ * @param pm the play mode.
+ * @return the localized string version of the play mode.
+ */
const RString& PlayModeToLocalizedString( PlayMode pm );
+/**
+ * @brief Turn the string into the proper play mode.
+ * @param s the string.
+ * @return the play mode based on the string.
+ */
PlayMode StringToPlayMode( const RString& s );
LuaDeclareType( PlayMode );
-// ziup2 has SortOrder_PinnedMeter (¿qef?)
+/**
+ * @brief The list of ways to sort songs and courses.
+ *
+ * All song sorts should be listed before course sorts.
+ */
enum SortOrder
{
// song sorts
@@ -139,48 +176,100 @@ enum SortOrder
NUM_SortOrder,
SortOrder_Invalid
};
+/** @brief Only allow certain sort modes to be selectable. */
const SortOrder MAX_SELECTABLE_SORT = (SortOrder)(SORT_ROULETTE-1);
+/**
+ * @brief Turn the sort order into a proper string.
+ * @param so the sort order.
+ * @return the string version of the sort order.
+ */
const RString& SortOrderToString( SortOrder so );
+/**
+ * @brief Turn the sort order into a proper localized string.
+ * @param so the sort order.
+ * @return the localized string version of the sort order.
+ */
const RString& SortOrderToLocalizedString( SortOrder so );
+/**
+ * @brief Turn the string into the proper sort order.
+ * @param str the string.
+ * @return the sort order based on the string.
+ */
SortOrder StringToSortOrder( const RString& str );
LuaDeclareType( SortOrder );
-// IsSongSort is only used for saving sort order to the profile. -aj
+/**
+ * @brief Determine if the sort order in question is for songs or not.
+ *
+ * This function is mainly used for saving sort order to the profile. -aj
+ */
inline bool IsSongSort( SortOrder so ) { return so >= SORT_PREFERRED && so <= SORT_DOUBLE_CHALLENGE_METER; }
-// Scoring stuff
+/** @brief The list of tap note scores available during play. */
enum TapNoteScore {
- TNS_None,
- TNS_HitMine,
- TNS_AvoidMine,
- TNS_CheckpointMiss,
- TNS_Miss,
- TNS_W5,
- TNS_W4,
- TNS_W3,
- TNS_W2,
- TNS_W1,
- TNS_CheckpointHit,
- NUM_TapNoteScore,
+ TNS_None, /**< There is no score involved with this one. */
+ TNS_HitMine, /**< A mine was hit successfully. */
+ TNS_AvoidMine, /**< A mine was avoided successfully. */
+ TNS_CheckpointMiss, /**< A checkpoint was missed during a hold. */
+ TNS_Miss, /**< A note was missed entirely. */
+ TNS_W5, /**< A note was almost missed, but not quite. */
+ TNS_W4, /**< A note was hit either a bit early or a bit late. */
+ TNS_W3, /**< A note was hit with decent accuracy, but not the best. */
+ TNS_W2, /**< A note was hit off by just a miniscule amount. This used to be the best rating. */
+ TNS_W1, /**< A note was hit perfectly. */
+ TNS_CheckpointHit, /**< A checkpoint was held during a hold. */
+ NUM_TapNoteScore, /**< The number of Tap Note Scores available. */
TapNoteScore_Invalid,
};
+/**
+ * @brief Turn the tap note score into a proper string.
+ * @param tns the tap note score.
+ * @return the string version of the tap note score.
+ */
const RString& TapNoteScoreToString( TapNoteScore tns );
+/**
+ * @brief Turn the tap note score into a proper localized string.
+ * @param tns the tap note score.
+ * @return the localized string version of the tap note score.
+ */
const RString& TapNoteScoreToLocalizedString( TapNoteScore tns );
+/**
+ * @brief Turn the string into the proper tap note score.
+ * @param str the string.
+ * @return the tap note score based on the string.
+ */
TapNoteScore StringToTapNoteScore( const RString& str );
LuaDeclareType( TapNoteScore );
+/** @brief The list of hold note scores available during play. */
enum HoldNoteScore
{
- HNS_None, // HoldNote not scored yet
- HNS_LetGo, // HoldNote has passed, missed it
- HNS_Held, // HoldNote has passed, successfully held all the way
- NUM_HoldNoteScore,
+ HNS_None, /**< The HoldNote was not scored yet. */
+ HNS_LetGo, /**< The HoldNote has passed, but the player missed it. */
+ HNS_Held, /**< The HoldNote has passed, and was successfully held all the way. */
+ NUM_HoldNoteScore, /**< The number of hold note scores. */
HoldNoteScore_Invalid,
};
+/**
+ * @brief Turn the hold note score into a proper string.
+ * @param hns the hold note score.
+ * @return the string version of the hold note score.
+ */
const RString& HoldNoteScoreToString( HoldNoteScore hns );
+/**
+ * @brief Turn the hold note score into a proper localized string.
+ * @param hns the hold note score.
+ * @return the localized string version of the hold note score.
+ */
const RString& HoldNoteScoreToLocalizedString( HoldNoteScore hns );
+/**
+ * @brief Turn the string into the proper hold note score.
+ * @param str the string.
+ * @return the hold note score based on the string.
+ */
HoldNoteScore StringToHoldNoteScore( const RString& str );
LuaDeclareType( HoldNoteScore );
+/** @brief The list of timing windows to deal with when playing. */
enum TimingWindow
{
TW_W1,
@@ -196,6 +285,7 @@ enum TimingWindow
};
const RString& TimingWindowToString( TimingWindow tw );
+/** @brief The list of score events that can take place while playing. */
enum ScoreEvent
{
SE_CheckpointHit,
@@ -213,6 +303,7 @@ enum ScoreEvent
};
const RString& ScoreEventToString( ScoreEvent se );
+/** @brief The list of game button types available for all game modes. */
enum GameButtonType
{
GameButtonType_Step,
@@ -221,6 +312,7 @@ enum GameButtonType
GameButtonType_INVALID
};
+/** @brief The list of judge types for the tap note scores. */
enum TapNoteScoreJudgeType
{
TapNoteScoreJudgeType_MinimumScore,
@@ -232,7 +324,7 @@ const RString& TapNoteScoreJudgeTypeToString( TapNoteScoreJudgeType jt );
LuaDeclareType( TapNoteScoreJudgeType );
-// Profile and MemCard stuff
+/** @brief The profile slots available. This is mainly for Profiles and Memory Cards. */
enum ProfileSlot
{
ProfileSlot_Player1,
@@ -244,7 +336,7 @@ enum ProfileSlot
const RString& ProfileSlotToString( ProfileSlot ps );
LuaDeclareType( ProfileSlot );
-
+/** @brief The states of the memory card during play. */
enum MemoryCardState
{
MemoryCardState_Ready,
@@ -260,14 +352,14 @@ enum MemoryCardState
const RString& MemoryCardStateToString( MemoryCardState mcs );
LuaDeclareType( MemoryCardState );
-// Ranking stuff
+/** @brief The different ranking categories based on difficulty meter average. */
enum RankingCategory
{
- RANKING_A, // 1-3 meter per song avg.
- RANKING_B, // 4-6 meter per song avg.
- RANKING_C, // 7-9 meter per song avg.
- RANKING_D, // 10+ meter per song avg. // doesn't count extra stage!
- NUM_RankingCategory,
+ RANKING_A, /**< 1-3 meter per song avg. */
+ RANKING_B, /**< 4-6 meter per song avg. */
+ RANKING_C, /**< 7-9 meter per song avg. */
+ RANKING_D, /**< 10+ meter per song avg, not counting extra stages. */
+ NUM_RankingCategory, /**< The number of ranking categories. */
RankingCategory_Invalid
};
const RString& RankingCategoryToString( RankingCategory rc );
@@ -282,7 +374,7 @@ RankingCategory AverageMeterToRankingCategory( int iAverageMeter );
extern const RString GROUP_ALL;
-//
+/** @brief The different types of players in the game. */
enum PlayerController
{
PC_HUMAN,
@@ -295,22 +387,24 @@ enum PlayerController
const RString& PlayerControllerToString( PlayerController pc );
LuaDeclareType( PlayerController );
+/** @brief The different health bar states. */
enum HealthState
{
- HealthState_Hot,
- HealthState_Alive,
- HealthState_Danger,
- HealthState_Dead,
+ HealthState_Hot, /**< The health bar is very full. */
+ HealthState_Alive, /**< The health bar is at a decent size. */
+ HealthState_Danger, /**< The health bar is about to run out. */
+ HealthState_Dead, /**< The health bar is drained completely. */
NUM_HealthState,
HealthState_Invalid
};
LuaDeclareType( HealthState );
+/** @brief The different stage results during battle. */
enum StageResult
{
- RESULT_WIN,
- RESULT_LOSE,
- RESULT_DRAW
+ RESULT_WIN, /**< The player has won the battle. */
+ RESULT_LOSE, /**< The player has lost the battle. */
+ RESULT_DRAW /**< The player has tied with the competitor. */
};
@@ -328,11 +422,12 @@ const int ITEM_NONE = -1;
// Coin stuff
+/** @brief The different coin modes to determine how one can play. */
enum CoinMode
{
- CoinMode_Home,
- CoinMode_Pay,
- CoinMode_Free,
+ CoinMode_Home, /**< The full range of options are available. */
+ CoinMode_Pay, /**< Coins must be inserted before a game can begin. */
+ CoinMode_Free, /**< It costs no money to play, but otherwise is similar to Pay mode. */
NUM_CoinMode,
CoinMode_Invalid
};
@@ -340,12 +435,12 @@ const RString& CoinModeToString( CoinMode cm );
LuaDeclareType( CoinMode );
-// Premium
+/** @brief The different types of premiums available to take advantage of. */
enum Premium
{
- Premium_Off,
- Premium_DoubleFor1Credit,
- Premium_2PlayersFor1Credit,
+ Premium_Off, /**< It will cost one credit per side of the machine. */
+ Premium_DoubleFor1Credit, /**< It will cost one credit per player of the machine. */
+ Premium_2PlayersFor1Credit, /**< One credit gives one or both players full access. */
NUM_Premium,
Premium_Invalid
};
@@ -354,7 +449,7 @@ const RString& PremiumToLocalizedString( Premium p );
LuaDeclareType( Premium );
-// Award stuff
+/** @brief The various stage awards that can be given based on excellent play. */
enum StageAward
{
StageAward_FullComboW3,
@@ -375,7 +470,7 @@ const RString& StageAwardToLocalizedString( StageAward pma );
StageAward StringToStageAward( const RString& pma );
LuaDeclareType( StageAward );
-
+/** @brief The various peak combo awards should such a combo be attained during play. */
enum PeakComboAward
{
PeakComboAward_1000,
@@ -396,23 +491,47 @@ const RString& PeakComboAwardToLocalizedString( PeakComboAward pma );
PeakComboAward StringToPeakComboAward( const RString& pma );
LuaDeclareType( PeakComboAward );
-
+/** @brief The list of BPMs to display */
struct DisplayBpms
{
+ /**
+ * @brief Add a BPM to the list.
+ * @param f the BPM to add.
+ */
void Add( float f );
+ /**
+ * @brief Retrieve the minimum BPM of the set.
+ * @return the minimum BPM.
+ */
float GetMin() const;
+ /**
+ * @brief Retrieve the maximum BPM of the set.
+ * @return the maximum BPM.
+ */
float GetMax() const;
+ /**
+ * @brief Determine if the BPM is really constant.
+ * @return Whether the BPM is constant or not.
+ */
bool BpmIsConstant() const;
+ /**
+ * @brief Determine if the BPM is meant to be a secret.
+ * @return Whether the BPM is a secret or not.
+ */
bool IsSecret() const;
+ /**
+ * @brief The list of the BPMs for the song or course.
+ */
vector vfBpms;
};
+/** @brief The various style types available. */
enum StyleType
{
- StyleType_OnePlayerOneSide, // e.g. single
- StyleType_TwoPlayersTwoSides, // e.g. versus
- StyleType_OnePlayerTwoSides, // e.g. double
- StyleType_TwoPlayersSharedSides, // e.g. routine
+ StyleType_OnePlayerOneSide, /**< Single style */
+ StyleType_TwoPlayersTwoSides, /**< Versus style */
+ StyleType_OnePlayerTwoSides, /**< Double style */
+ StyleType_TwoPlayersSharedSides, /**< Routine style */
NUM_StyleType,
StyleType_Invalid
};
@@ -420,7 +539,7 @@ const RString& StyleTypeToString( StyleType s );
StyleType StringToStyleType( const RString& s );
LuaDeclareType( StyleType );
-
+/** @brief The different goal types, mainly meant for fitness modes. */
enum GoalType
{
GoalType_Calories,
@@ -433,7 +552,7 @@ const RString& GoalTypeToString( GoalType gt );
GoalType StringToGoalType( const RString& s );
LuaDeclareType( GoalType );
-
+/** @brief The different types of Edit modes available. */
enum EditMode
{
EditMode_Practice,
@@ -447,22 +566,24 @@ const RString& EditModeToString( EditMode em );
EditMode StringToEditMode( const RString& s );
LuaDeclareType( EditMode );
-/*
-original options from ScreenEz2SelectMusic:
-(if no confirm type is mentioned, there is none.)
-
-0 = play music as you select; SampleMusicPreviewMode_Normal
-1 = no music plays, select 1x to play preview music, select again to confirm
-2 = no music plays at all (SampleMusicPreviewMode_ScreenMusic + redir to silent)
-3 = play music as select, 2x to confirm (SampleMusicPreviewMode_Normal + [SSMusic] TwoPartConfirmsOnly)
-4 = screen music plays; SampleMusicPreviewMode_ScreenMusic
-*/
+/**
+ * @brief The different types of sample music previews available.
+ *
+ * These were originally from the deleted screen ScreenEz2SelectMusic.
+ * (if no confirm type is mentioned, there is none.)
+ *
+ * 0 = play music as you select; SampleMusicPreviewMode_Normal
+ * 1 = no music plays, select 1x to play preview music, select again to confirm
+ * 2 = no music plays at all (SampleMusicPreviewMode_ScreenMusic + redir to silent)
+ * 3 = play music as select, 2x to confirm (SampleMusicPreviewMode_Normal + [SSMusic] TwoPartConfirmsOnly)
+ * 4 = screen music plays; SampleMusicPreviewMode_ScreenMusic
+ */
enum SampleMusicPreviewMode
{
- SampleMusicPreviewMode_Normal,
- SampleMusicPreviewMode_StartToPreview,
- SampleMusicPreviewMode_ScreenMusic,
- SampleMusicPreviewMode_LastSong, // continue playing the last song
+ SampleMusicPreviewMode_Normal, /**< Music is played as the song is highlighted. */
+ SampleMusicPreviewMode_StartToPreview,
+ SampleMusicPreviewMode_ScreenMusic, /**< No music plays. Select it once to preview the music, then once more to select the song. */
+ SampleMusicPreviewMode_LastSong, /**< continue playing the last song */
NUM_SampleMusicPreviewMode,
SampleMusicPreviewMode_Invalid,
};
@@ -470,31 +591,36 @@ const RString& SampleMusicPreviewModeToString( SampleMusicPreviewMode );
SampleMusicPreviewMode StringToSampleMusicPreviewMode( const RString& s );
LuaDeclareType( SampleMusicPreviewMode );
-enum Stage // Shared stage values (not per-player) that are shown in StageDisplay
+/**
+ * @brief The different kinds of Stages available.
+ *
+ * These are shared stage values shown in StageDisplay. These are not per-player.
+ */
+enum Stage
{
- Stage_1st,
- Stage_2nd,
- Stage_3rd,
- Stage_4th,
- Stage_5th,
- Stage_6th,
- Stage_Next, // after Stage_6th but not Final. This won't normally happen because 7 stages is the max in the UI.
- Stage_Final,
- Stage_Extra1,
- Stage_Extra2,
- Stage_Nonstop,
- Stage_Oni,
- Stage_Endless,
- Stage_Event,
- Stage_Demo,
- NUM_Stage,
+ Stage_1st, /**< The first stage. */
+ Stage_2nd, /**< The second stage. */
+ Stage_3rd, /**< The third stage. */
+ Stage_4th, /**< The fourth stage. */
+ Stage_5th, /**< The fifth stage. */
+ Stage_6th, /**< The sixth stage. */
+ Stage_Next, /**< Somewhere between the sixth and final stage. This won't normally happen because 7 stages is the max in the UI. */
+ Stage_Final, /**< The last stage. */
+ Stage_Extra1, /**< The first bonus stage, AKA the extra stage. */
+ Stage_Extra2, /**< The last bonus stage, AKA the encore extra stage. */
+ Stage_Nonstop, /**< Playing a nonstop course. */
+ Stage_Oni, /**< Playing an oni or survival course. */
+ Stage_Endless, /**< Playing an endless course. */
+ Stage_Event, /**< Playing in event mode. */
+ Stage_Demo, /**< Playing the demonstration. */
+ NUM_Stage, /**< The number of stage types. */
Stage_Invalid,
};
const RString& StageToString( Stage s );
LuaDeclareType( Stage );
const RString& StageToLocalizedString( Stage i );
-
+/** @brief The different possibilities of earning an extra stage. */
enum EarnedExtraStage
{
EarnedExtraStage_No,
@@ -506,7 +632,7 @@ enum EarnedExtraStage
const RString& EarnedExtraStageToString( EarnedExtraStage s );
LuaDeclareType( EarnedExtraStage );
-
+/** @brief The different results of loading a profile. */
enum ProfileLoadResult
{
ProfileLoadResult_Success,
@@ -514,7 +640,7 @@ enum ProfileLoadResult
ProfileLoadResult_FailedTampered
};
-
+/** @brief The different statuses for multiplayer. */
enum MultiPlayerStatus
{
MultiPlayerStatus_Joined,
@@ -526,13 +652,13 @@ enum MultiPlayerStatus
};
const RString& MultiPlayerStatusToString( MultiPlayerStatus i );
-
+/** @brief The different course types. */
enum CourseType
{
- COURSE_TYPE_NONSTOP, // if life meter type is BAR
- COURSE_TYPE_ONI, // if life meter type is BATTERY
- COURSE_TYPE_ENDLESS, // if set to REPEAT
- COURSE_TYPE_SURVIVAL, // if life meter type is TIME
+ COURSE_TYPE_NONSTOP, /**< The life meter type is set to BAR. */
+ COURSE_TYPE_ONI, /**< The life meter type is set to BATTERY. */
+ COURSE_TYPE_ENDLESS, /**< The life meter type is set to REPEAT. */
+ COURSE_TYPE_SURVIVAL, /**< The life meter type is set to TIME. */
NUM_CourseType,
CourseType_Invalid
};
diff --git a/src/GameManager.cpp b/src/GameManager.cpp
index 29d229df79..c904915665 100644
--- a/src/GameManager.cpp
+++ b/src/GameManager.cpp
@@ -32,7 +32,7 @@ enum
TRACK_14,
TRACK_15,
TRACK_16,
- // BMS reader needs 16 tracks for beat-double7
+ // 16 tracks needed for beat-double7 and techno-double8
};
RString StepsTypeInfo::GetLocalizedString() const
@@ -81,6 +81,7 @@ static const StepsTypeInfo g_StepsTypeInfos[] = {
{ "techno-single8", 8, true, StepsTypeCategory_Single },
{ "techno-double4", 8, true, StepsTypeCategory_Double },
{ "techno-double5", 10, true, StepsTypeCategory_Double },
+ { "techno-double8", 16, true, StepsTypeCategory_Double },
// pop'n music
{ "pnm-five", 5, true, StepsTypeCategory_Single }, // called "pnm" for backward compat
{ "pnm-nine", 9, true, StepsTypeCategory_Single }, // called "pnm" for backward compat
@@ -814,28 +815,28 @@ static const Style g_Style_Pump_Routine =
10, // m_iColsPerPlayer
{ // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER];
{ // PLAYER_1
- { TRACK_1, -PUMP_COL_SPACING*4.6f-4, NULL },
- { TRACK_2, -PUMP_COL_SPACING*3.6f-4, NULL },
- { TRACK_3, -PUMP_COL_SPACING*2.6f-4, NULL },
- { TRACK_4, -PUMP_COL_SPACING*1.6f-4, NULL },
- { TRACK_5, -PUMP_COL_SPACING*0.6f-4, NULL },
- { TRACK_6, +PUMP_COL_SPACING*0.6f+4, NULL },
- { TRACK_7, +PUMP_COL_SPACING*1.6f+4, NULL },
- { TRACK_8, +PUMP_COL_SPACING*2.6f+4, NULL },
- { TRACK_9, +PUMP_COL_SPACING*3.6f+4, NULL },
- { TRACK_10, +PUMP_COL_SPACING*4.6f+4, NULL },
+ { TRACK_1, -PUMP_COL_SPACING*4.5f-4, NULL },
+ { TRACK_2, -PUMP_COL_SPACING*3.5f-4, NULL },
+ { TRACK_3, -PUMP_COL_SPACING*2.5f-4, NULL },
+ { TRACK_4, -PUMP_COL_SPACING*1.5f-4, NULL },
+ { TRACK_5, -PUMP_COL_SPACING*0.5f-4, NULL },
+ { TRACK_6, +PUMP_COL_SPACING*0.5f+4, NULL },
+ { TRACK_7, +PUMP_COL_SPACING*1.5f+4, NULL },
+ { TRACK_8, +PUMP_COL_SPACING*2.5f+4, NULL },
+ { TRACK_9, +PUMP_COL_SPACING*3.5f+4, NULL },
+ { TRACK_10, +PUMP_COL_SPACING*4.5f+4, NULL },
},
{ // PLAYER_2
- { TRACK_1, -PUMP_COL_SPACING*4.6f-4, NULL },
- { TRACK_2, -PUMP_COL_SPACING*3.6f-4, NULL },
- { TRACK_3, -PUMP_COL_SPACING*2.6f-4, NULL },
- { TRACK_4, -PUMP_COL_SPACING*1.6f-4, NULL },
- { TRACK_5, -PUMP_COL_SPACING*0.6f-4, NULL },
- { TRACK_6, +PUMP_COL_SPACING*0.6f+4, NULL },
- { TRACK_7, +PUMP_COL_SPACING*1.6f+4, NULL },
- { TRACK_8, +PUMP_COL_SPACING*2.6f+4, NULL },
- { TRACK_9, +PUMP_COL_SPACING*3.6f+4, NULL },
- { TRACK_10, +PUMP_COL_SPACING*4.6f+4, NULL },
+ { TRACK_1, -PUMP_COL_SPACING*4.5f-4, NULL },
+ { TRACK_2, -PUMP_COL_SPACING*3.5f-4, NULL },
+ { TRACK_3, -PUMP_COL_SPACING*2.5f-4, NULL },
+ { TRACK_4, -PUMP_COL_SPACING*1.5f-4, NULL },
+ { TRACK_5, -PUMP_COL_SPACING*0.5f-4, NULL },
+ { TRACK_6, +PUMP_COL_SPACING*0.5f+4, NULL },
+ { TRACK_7, +PUMP_COL_SPACING*1.5f+4, NULL },
+ { TRACK_8, +PUMP_COL_SPACING*2.5f+4, NULL },
+ { TRACK_9, +PUMP_COL_SPACING*3.5f+4, NULL },
+ { TRACK_10, +PUMP_COL_SPACING*4.5f+4, NULL },
},
},
{ // m_iInputColumn[NUM_GameController][NUM_GameButton]
@@ -2300,6 +2301,66 @@ static const Style g_Style_Techno_Double5 =
{ TRACK_10, +TECHNO_COL_SPACING*4.5f, NULL },
},
},
+ { // m_iInputColumn[NUM_GameController][NUM_GameButton]
+ { 1, 6, 4, 3, 2, 5, Style::NO_MAPPING, 0, 7, Style::END_MAPPING },
+ { 1, 6, 4, 3, 2, 5, Style::NO_MAPPING, 0, 7, Style::END_MAPPING },
+ },
+ { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER];
+ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
+ },
+ false, // m_bNeedsZoomOutWith2Players
+ false, // m_bCanUseBeginnerHelper
+ false, // m_bLockDifficulties
+};
+
+static const Style g_Style_Techno_Double8 =
+{ // STYLE_TECHNO_DOUBLE8
+ true, // m_bUsedForGameplay
+ true, // m_bUsedForEdit
+ false, // m_bUsedForDemonstration
+ false, // m_bUsedForHowToPlay
+ "double8", // m_szName
+ StepsType_techno_double8, // m_StepsType
+ StyleType_OnePlayerTwoSides, // m_StyleType
+ 16, // m_iColsPerPlayer
+ { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER];
+ { // PLAYER_1
+ { TRACK_1, -TECHNO_VERSUS_COL_SPACING*7.5f, NULL },
+ { TRACK_2, -TECHNO_VERSUS_COL_SPACING*6.5f, NULL },
+ { TRACK_3, -TECHNO_VERSUS_COL_SPACING*5.5f, NULL },
+ { TRACK_4, -TECHNO_VERSUS_COL_SPACING*4.5f, NULL },
+ { TRACK_5, -TECHNO_VERSUS_COL_SPACING*3.5f, NULL },
+ { TRACK_6, -TECHNO_VERSUS_COL_SPACING*2.5f, NULL },
+ { TRACK_7, -TECHNO_VERSUS_COL_SPACING*1.5f, NULL },
+ { TRACK_8, -TECHNO_VERSUS_COL_SPACING*0.5f, NULL },
+ { TRACK_9, +TECHNO_VERSUS_COL_SPACING*0.5f, NULL },
+ { TRACK_10, +TECHNO_VERSUS_COL_SPACING*1.5f, NULL },
+ { TRACK_11, +TECHNO_VERSUS_COL_SPACING*2.5f, NULL },
+ { TRACK_12, +TECHNO_VERSUS_COL_SPACING*3.5f, NULL },
+ { TRACK_13, +TECHNO_VERSUS_COL_SPACING*4.5f, NULL },
+ { TRACK_14, +TECHNO_VERSUS_COL_SPACING*5.5f, NULL },
+ { TRACK_15, +TECHNO_VERSUS_COL_SPACING*6.5f, NULL },
+ { TRACK_16, +TECHNO_VERSUS_COL_SPACING*7.5f, NULL },
+ },
+ { // PLAYER_2
+ { TRACK_1, -TECHNO_VERSUS_COL_SPACING*7.5f, NULL },
+ { TRACK_2, -TECHNO_VERSUS_COL_SPACING*6.5f, NULL },
+ { TRACK_3, -TECHNO_VERSUS_COL_SPACING*5.5f, NULL },
+ { TRACK_4, -TECHNO_VERSUS_COL_SPACING*4.5f, NULL },
+ { TRACK_5, -TECHNO_VERSUS_COL_SPACING*3.5f, NULL },
+ { TRACK_6, -TECHNO_VERSUS_COL_SPACING*2.5f, NULL },
+ { TRACK_7, -TECHNO_VERSUS_COL_SPACING*1.5f, NULL },
+ { TRACK_8, -TECHNO_VERSUS_COL_SPACING*0.5f, NULL },
+ { TRACK_9, +TECHNO_VERSUS_COL_SPACING*0.5f, NULL },
+ { TRACK_10, +TECHNO_VERSUS_COL_SPACING*1.5f, NULL },
+ { TRACK_11, +TECHNO_VERSUS_COL_SPACING*2.5f, NULL },
+ { TRACK_12, +TECHNO_VERSUS_COL_SPACING*3.5f, NULL },
+ { TRACK_13, +TECHNO_VERSUS_COL_SPACING*4.5f, NULL },
+ { TRACK_14, +TECHNO_VERSUS_COL_SPACING*5.5f, NULL },
+ { TRACK_15, +TECHNO_VERSUS_COL_SPACING*6.5f, NULL },
+ { TRACK_16, +TECHNO_VERSUS_COL_SPACING*7.5f, NULL },
+ },
+ },
{ // m_iInputColumn[NUM_GameController][NUM_GameButton]
{ Style::NO_MAPPING, Style::NO_MAPPING, Style::NO_MAPPING, Style::NO_MAPPING,
1, 3, 2, 0, 4, Style::END_MAPPING },
@@ -2324,6 +2385,7 @@ static const Style *g_apGame_Techno_Styles[] =
&g_Style_Techno_Versus8,
&g_Style_Techno_Double4,
&g_Style_Techno_Double5,
+ &g_Style_Techno_Double8,
NULL
};
@@ -2544,7 +2606,7 @@ static const Game g_Game_Popn =
/** Guitar5 ******************************************************************/
//ThemeMetric GUITAR5_COL_SPACING ("ColumnSpacing","Guitar5");
-static const int GUITAR5_COL_SPACING = 48; // todo: get a proper value? -aj
+static const int GUITAR5_COL_SPACING = 48;
static const Style g_Style_Guitar_Five =
{ // STYLE_GUITAR_FIVE
@@ -2989,7 +3051,7 @@ StepsType GameManager::StringToStepsType( RString sStepsType )
sStepsType.MakeLower();
// TODO: Format specific hacks should be moved into the file loader for that format.
- // If i'm assuming this correctly, these only apply to .sm files: -aj
+ // If i'm assuming this correctly, these two only apply to .sm files: -aj
// HACK: We eliminated "ez2-single-hard", but we should still handle it.
if( sStepsType == "ez2-single-hard" )
diff --git a/src/GameManager.h b/src/GameManager.h
index 9f6bf091e9..666700bb62 100644
--- a/src/GameManager.h
+++ b/src/GameManager.h
@@ -1,4 +1,4 @@
-/* GameManager - Manages Games and Styles. */
+/** @brief GameManager - Manages Games and Styles. */
#ifndef GAMEMANAGER_H
#define GAMEMANAGER_H
@@ -10,12 +10,16 @@ struct lua_State;
#include "GameConstantsAndTypes.h"
#include "GameInput.h"
+/** @brief The collective information about a Steps' Type. */
struct StepsTypeInfo
{
const char *szName;
+ /** @brief The number of tracks, or columns, of this type. */
int iNumTracks;
- bool bAllowAutogen; // allow this type to be autogen'd to other types
- StepsTypeCategory m_StepsTypeCategory; // what is the most basic StyleType this is used with?
+ /** @brief A flag to determine if we allow this type to be autogen'ed to other types. */
+ bool bAllowAutogen;
+ /** @brief The most basic StyleType that this StpesTypeInfo is used with. */
+ StepsTypeCategory m_StepsTypeCategory;
RString GetLocalizedString() const;
};
@@ -55,8 +59,10 @@ extern GameManager* GAMEMAN; // global and accessable from anywhere in our progr
#endif
-/*
- * (c) 2001-2004 Chris Danford, Glenn Maynard
+/**
+ * @file
+ * @author Chris Danford, Glenn Maynard (c) 2001-2004
+ * @section LICENSE
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
diff --git a/src/GameSoundManager.cpp b/src/GameSoundManager.cpp
index 0e36042116..9034b86a34 100644
--- a/src/GameSoundManager.cpp
+++ b/src/GameSoundManager.cpp
@@ -6,7 +6,7 @@
#include "RageUtil.h"
#include "GameState.h"
#include "TimingData.h"
-#include "NotesLoaderSM.h"
+#include "NotesLoaderSSC.h"
#include "PrefsManager.h"
#include "RageDisplay.h"
#include "AnnouncerManager.h"
@@ -141,7 +141,7 @@ static void StartMusic( MusicToPlay &ToPlay )
{
LOG->Trace( "Found '%s'", ToPlay.m_sTimingFile.c_str() );
Song song;
- if( SMLoader::LoadFromSMFile(ToPlay.m_sTimingFile, song) )
+ if( SSCLoader::LoadFromSSCFile(ToPlay.m_sTimingFile, song) )
{
ToPlay.HasTiming = true;
ToPlay.m_TimingData = song.m_Timing;
diff --git a/src/GameState.cpp b/src/GameState.cpp
index 8194bbbeed..0a190e750e 100644
--- a/src/GameState.cpp
+++ b/src/GameState.cpp
@@ -936,7 +936,7 @@ void GameState::ResetStageStatistics()
m_vLastPeakComboAwards[p].clear();
}
- // Reset the round seed. Do this here and not in FinishStage so that players
+ // Reset the round seed. Do this here and not in FinishStage so that players
// get new shuffle patterns if they Back out of gameplay and play again.
m_iStageSeed = rand();
}
@@ -961,23 +961,15 @@ void GameState::UpdateSongPosition( float fPositionSeconds, const TimingData &ti
ASSERT_M( m_fSongBeat > -2000, ssprintf("Song beat %f at %f seconds", m_fSongBeat, fPositionSeconds) );
//if( m_iWarpBeginRow != -1 || m_iWarpEndRow == -1 )
- if( m_iWarpBeginRow != -1 && m_fWarpLength > 0.f )
+ if( m_iWarpBeginRow != -1 && m_fWarpLength > 0.0f )
{
- // we got a warp in this section.
+ // There is a warp in this section.
LOG->Trace("warp at %i lasts for %f, jumps to %i",m_iWarpBeginRow,m_fWarpLength,m_iWarpBeginRow+BeatToNoteRow(m_fWarpLength));
//fPositionSeconds += (m_fWarpLength * m_fCurBPS);
}
- /*
- // xxx testing: only do this on monotune survivor
- if( m_pCurSong && m_pCurSong->GetDisplayFullTitle() == "monotune survivor" )
- LOG->Trace( ssprintf("[GameState::UpdateSongPosition] m_fMusicSeconds before = %f",m_fMusicSeconds) );
- */
+
m_fMusicSeconds = fPositionSeconds;
- /*
- // xxx testing: only do this on monotune survivor
- if( m_pCurSong && m_pCurSong->GetDisplayFullTitle() == "monotune survivor" )
- LOG->Trace( ssprintf("[GameState::UpdateSongPosition] m_fMusicSeconds after = %f",m_fMusicSeconds) );
- */
+
m_fLightSongBeat = timing.GetBeatFromElapsedTime( fPositionSeconds + g_fLightsAheadSeconds );
m_fSongBeatNoOffset = timing.GetBeatFromElapsedTimeNoOffset( fPositionSeconds );
@@ -1965,7 +1957,7 @@ bool GameState::ChangePreferredDifficulty( PlayerNumber pn, int dir )
}
/* The user may be set to prefer a difficulty that isn't always shown; typically,
- * Difficulty_Edit. Return the closest shown difficulty <= m_PreferredDifficulty. */
+ * Difficulty_Edit. Return the closest shown difficulty <= m_PreferredDifficulty. */
Difficulty GameState::GetClosestShownDifficulty( PlayerNumber pn ) const
{
const vector &v = CommonMetrics::DIFFICULTIES_TO_SHOW.GetValue();
diff --git a/src/GameState.h b/src/GameState.h
index bb1285f0cb..370f789a6c 100644
--- a/src/GameState.h
+++ b/src/GameState.h
@@ -1,4 +1,4 @@
-/* GameState - Holds game data that is not saved between sessions. */
+/** @brief GameState - Holds game data that is not saved between sessions. */
#ifndef GAMESTATE_H
#define GAMESTATE_H
@@ -36,8 +36,10 @@ class Trail;
class GameState
{
public:
+ /** @brief Set up the GameState with initial values. */
GameState();
~GameState();
+ /** @brief Reset the GameState back to initial values. */
void Reset();
void ResetPlayer( PlayerNumber pn );
void ApplyCmdline(); // called by Reset
@@ -63,11 +65,21 @@ public:
void SetCurGame( const Game *pGame ); // Call this instead of m_pCurGame.Set to make sure PREFSMAN->m_sCurrentGame stays in sync
BroadcastOnChangePtr m_pCurGame;
BroadcastOnChangePtr m_pCurStyle;
+ /** @brief Determine which side is joined.
+ *
+ * The left side is player 1, and the right side is player 2. */
bool m_bSideIsJoined[NUM_PLAYERS]; // left side, right side
MultiPlayerStatus m_MultiPlayerStatus[NUM_MultiPlayer];
BroadcastOnChange m_PlayMode; // many screens display different info depending on this value
- BroadcastOnChange m_iCoins; // not "credits"
- PlayerNumber m_MasterPlayerNumber; // used in Styles where one player controls both sides
+ /**
+ * @brief The number of coins presently in the machine.
+ *
+ * Note that coins are not "credits". One may have to put in two coins
+ * to get one credit, only to have to put in another four coins to get
+ * the three credits needed to begin the game. */
+ BroadcastOnChange m_iCoins;
+ /** @brief The player number used with Styles where one player controls both sides. */
+ PlayerNumber m_MasterPlayerNumber;
bool m_bMultiplayer;
int m_iNumMultiplayerNoteFields;
bool DifficultiesLocked() const;
@@ -86,7 +98,10 @@ public:
int m_iGameSeed, m_iStageSeed;
RString m_sStageGUID;
- bool PlayersCanJoin() const; // true if it's not too late for a player to join
+ /**
+ * @brief Determine if a second player can join in at this time.
+ * @return true if a player can still enter the game, false otherwise. */
+ bool PlayersCanJoin() const;
int GetCoinsNeededToJoin() const;
bool EnoughCreditsToJoin() const { return m_iCoins >= GetCoinsNeededToJoin(); }
int GetNumSidesJoined() const;
@@ -127,9 +142,15 @@ public:
bool m_bDemonstrationOrJukebox; // ScreenGameplay does special stuff when this is true
bool m_bJukeboxUsesModifiers;
int m_iNumStagesOfThisSong;
- // Increases every stage, doesn't reset when player continues. It's cosmetic and not used in Stage or Screen branching logic.
+ /**
+ * @brief Increase this every stage while not resetting on a continue.
+ *
+ * This is cosmetic: it's not use for Stage or Screen branching logic. */
int m_iCurrentStageIndex;
- // Num stages available for player. Resets when player joins/continues.
+ /**
+ * @brief The number of stages available for the players.
+ *
+ * This resets whenever a player joins or continues. */
int m_iPlayerStageTokens[NUM_PLAYERS];
static int GetNumStagesMultiplierForSong( const Song* pSong );
@@ -182,8 +203,10 @@ public:
float m_fCurBPS;
float m_fLightSongBeat; // g_fLightsFalloffSeconds ahead
//bool m_bStop; // in the middle of a stop (freeze or delay)
- bool m_bFreeze; // in the middle of a freeze
- bool m_bDelay; // in the middle of a delay
+ /** @brief A flag to determine if we're in the middle of a freeze/stop. */
+ bool m_bFreeze;
+ /** @brief A flag to determine if we're in the middle of a delay (Pump style stop). */
+ bool m_bDelay;
// used for warping:
int m_iWarpBeginRow;
float m_fWarpLength;
@@ -229,11 +252,13 @@ public:
bool m_bGoalComplete[NUM_PLAYERS];
bool m_bWorkoutGoalComplete;
- void RemoveAllActiveAttacks(); // called on end of song
+ /** @brief Primarily called at the end of a song to stop all attacks. */
+ void RemoveAllActiveAttacks();
PlayerNumber GetBestPlayer() const;
StageResult GetStageResult( PlayerNumber pn ) const;
- void ResetStageStatistics(); // Call this when it's time to play a new stage.
+ /** @brief Call this function when it's time to play a new stage. */
+ void ResetStageStatistics();
// Options stuff
ModsGroup m_SongOptions;
@@ -291,6 +316,7 @@ public:
void VisitAttractScreen( const RString sScreenName );
// PlayerState
+ /** @brief Allow access to each player's PlayerState. */
PlayerState* m_pPlayerState[NUM_PLAYERS];
PlayerState* m_pMultiPlayerState[NUM_MultiPlayer];
@@ -346,8 +372,10 @@ extern GameState* GAMESTATE; // global and accessable from anywhere in our progr
#endif
-/*
- * (c) 2001-2004 Chris Danford, Glenn Maynard, Chris Gomez
+/**
+ * @file
+ * @author Chris Danford, Glenn Maynard, Chris Gomez (c) 2001-2004
+ * @section LICENSE
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
diff --git a/src/GameplayAssist.h b/src/GameplayAssist.h
index a982e75edd..5f153c3dc4 100644
--- a/src/GameplayAssist.h
+++ b/src/GameplayAssist.h
@@ -1,4 +1,4 @@
-/* GameplayAssist - Encapsulate playing of handclap and metronome. */
+/** @brief GameplayAssist - Encapsulate playing of handclap and metronome. */
#ifndef GameplayAssist_H
#define GameplayAssist_H
@@ -6,24 +6,34 @@
#include "RageSound.h"
class NoteData;
-
+/** @brief The handclaps and metronomes ready to assist the player. */
class GameplayAssist
{
public:
+ /** @brief Load the sounds. */
void Init();
+ /**
+ * @brief Play the sounds in question for the particular chart.
+ * @param nd the note data used for playing the ticks. */
void PlayTicks( const NoteData &nd );
+ /** @brief Stop playing the sounds. */
void StopPlaying();
private:
+ /** @brief the sound made when a note is to be hit. */
RageSound m_soundAssistClap;
+ /** @brief the sound made when crossing a new measure. */
RageSound m_soundAssistMetronomeMeasure;
+ /** @brief the sound made when crossing a new beat. */
RageSound m_soundAssistMetronomeBeat;
};
#endif
-/*
- * (c) 2003-2006 Chris Danford
+/**
+ * @file
+ * @author Chris Danford (c) 2003-2006
+ * @section LICENSE
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
diff --git a/src/Grade.h b/src/Grade.h
index 34d6dc2286..c520f39c6c 100644
--- a/src/Grade.h
+++ b/src/Grade.h
@@ -1,4 +1,4 @@
-/* Grade - Mark the player receives after clearing a song. */
+/** @brief Grade - Mark the player receives after clearing a song. */
#ifndef GRADE_H
#define GRADE_H
@@ -7,16 +7,21 @@
#include "EnumHelper.h"
#include "ThemeMetric.h"
+/**
+ * @brief Have a specific number of passing grade tiers.
+ *
+ * TODO: Look into flexible grading tiers. */
#define NUM_Grade_TierS 20
+/** @brief The list of grading tiers available. */
enum Grade
{
- Grade_Tier01, // = AAAA
- Grade_Tier02, // = AAA
- Grade_Tier03, // = AA
- Grade_Tier04, // = A
- Grade_Tier05, // = B
- Grade_Tier06, // = C
- Grade_Tier07, // = D
+ Grade_Tier01, /**< Usually an AAAA */
+ Grade_Tier02, /**< Usually an AAA */
+ Grade_Tier03, /**< Usually an AA */
+ Grade_Tier04, /**< Usually an A */
+ Grade_Tier05, /**< Usually a B */
+ Grade_Tier06, /**< Usually a C */
+ Grade_Tier07, /**< Usually a D */
Grade_Tier08,
Grade_Tier09,
Grade_Tier10,
@@ -30,14 +35,20 @@ enum Grade
Grade_Tier18,
Grade_Tier19,
Grade_Tier20,
- Grade_Failed, // = E
+ Grade_Failed, /**< Usually an E */
NUM_Grade,
Grade_Invalid,
};
#define Grade_NoData Grade_Invalid
-/* This is in the header so the test sets don't require Grade.cpp (through PrefsManager),
- * since that pulls in ThemeManager. */
+/**
+ * @brief Convert the grade supplied to a string representation.
+ *
+ * This is in the header so the test sets don't require Grade.cpp (through PrefsManager),
+ * since that pulls in ThemeManager.
+ * @param g the grade to convert.
+ * @return the string reprsentation.
+ */
static inline RString GradeToString( Grade g )
{
ASSERT_M( (g >= 0 && g START_X ("GroupList","StartX");
-static const ThemeMetric START_Y ("GroupList","StartY");
-static const ThemeMetric SPACING_X ("GroupList","SpacingX");
-static const ThemeMetric SPACING_Y ("GroupList","SpacingY");
-
-const int MAX_GROUPS_ONSCREEN = 7;
-
-GroupList::GroupList()
-{
- m_iSelection = m_iTop = 0;
-}
-
-GroupList::~GroupList()
-{
- for( unsigned i = 0; i < m_sprButtons.size(); ++i )
- {
- delete m_sprButtons[i];
- delete m_textLabels[i];
- delete m_ButtonFrames[i];
- }
-}
-
-
-bool GroupList::ItemIsOnScreen( int n ) const
-{
- const int offset = n - m_iTop;
- return offset >= 0 && offset < MAX_GROUPS_ONSCREEN;
-}
-
-void GroupList::Load( const vector& asGroupNames )
-{
- m_asLabels = asGroupNames;
-
- m_Frame.SetName( "Frame" );
- this->AddChild( &m_Frame );
- ActorUtil::LoadAllCommands( m_Frame, "GroupList" );
-
- for( unsigned i=0; i < m_asLabels.size(); i++ )
- {
- Sprite *button = new Sprite;
- button->SetName( "Button" );
- ActorUtil::LoadAllCommands( *button, "GroupList" );
-
- BitmapText *label = new BitmapText;
- label->SetName( "Label" );
- ActorUtil::LoadAllCommands( *label, "GroupList" );
-
- ActorFrame *frame = new ActorFrame;
- frame->SetName( "ButtonFrame" );
- ActorUtil::LoadAllCommands( *frame, "GroupList" );
-
- m_sprButtons.push_back( button );
- m_textLabels.push_back( label );
- m_ButtonFrames.push_back( frame );
-
- button->Load( THEME->GetPathG("GroupList","bar") );
- label->LoadFromFont( THEME->GetPathF("GroupList","label") );
- label->SetShadowLength( 2 );
- label->SetText( SONGMAN->ShortenGroupName( asGroupNames[i] ) );
-
- frame->AddChild( button );
- frame->AddChild( label );
- m_Frame.AddChild( frame );
-
- button->SetXY( START_X + i*SPACING_X, START_Y + i*SPACING_Y );
- label->SetXY( START_X + i*SPACING_X, START_Y + i*SPACING_Y );
-
- if( i == 0 )
- {
- label->SetRainbowScroll( true );
- }
- else
- {
- label->SetRainbowScroll( false );
- label->SetDiffuse( SONGMAN->GetSongGroupColor(asGroupNames[i]) );
- }
-
- m_bHidden.push_back( ItemIsOnScreen(i) );
-
- ResetTextSize( i );
- }
-
- AfterChange();
-}
-
-void GroupList::ResetTextSize( int i )
-{
- BitmapText *label = m_textLabels[i];
- const float fTextWidth = (float)label->GetUnzoomedWidth();
- const float fButtonWidth = m_sprButtons[i]->GetZoomedWidth();
-
- float fZoom = fButtonWidth/fTextWidth;
- fZoom = min( fZoom, 0.8f );
-
- label->SetZoomX( fZoom );
- label->SetZoomY( 0.8f );
-}
-
-void GroupList::BeforeChange()
-{
- m_ButtonFrames[m_iSelection]->PlayCommand( "LoseFocus" );
-}
-
-
-void GroupList::AfterChange()
-{
- m_Frame.StopTweening();
- m_Frame.PlayCommand( "ScrollTween" );
- m_Frame.SetY( -m_iTop*SPACING_Y );
-
- for( int i=0; i < (int) m_asLabels.size(); i++ )
- {
- const bool IsHidden = !ItemIsOnScreen(i);
- const bool WasHidden = m_bHidden[i];
-
- if( IsHidden && !WasHidden )
- {
- m_ButtonFrames[i]->PlayCommand( "HideItem" );
- }
- else if( !IsHidden && WasHidden )
- {
- m_ButtonFrames[i]->PlayCommand( "ShowItem" );
- ResetTextSize( i );
- }
-
- m_bHidden[i] = IsHidden;
- }
-
- m_ButtonFrames[m_iSelection]->PlayCommand( "GainFocus" );
-}
-
-void GroupList::Up()
-{
- BeforeChange();
-
- if( m_iSelection == 0 )
- SetSelection(m_asLabels.size()-1);
- else
- SetSelection(m_iSelection-1);
-
- AfterChange();
-}
-
-void GroupList::Down()
-{
- BeforeChange();
-
- SetSelection((m_iSelection+1) % m_asLabels.size());
-
- AfterChange();
-}
-
-void GroupList::SetSelection( unsigned sel )
-{
- BeforeChange();
-
- m_iSelection=sel;
-
- if( (int)m_asLabels.size() <= MAX_GROUPS_ONSCREEN ||
- sel <= MAX_GROUPS_ONSCREEN/2 )
- m_iTop = 0;
- else if ( sel >= m_asLabels.size() - MAX_GROUPS_ONSCREEN/2 )
- m_iTop = m_asLabels.size() - MAX_GROUPS_ONSCREEN;
- else
- m_iTop = sel - MAX_GROUPS_ONSCREEN/2;
-
- /* The current selection must always be visible. */
- ASSERT( m_iTop <= m_iSelection );
- ASSERT( m_iTop+MAX_GROUPS_ONSCREEN > m_iSelection );
-
- AfterChange();
-}
-
-
-void GroupList::TweenOnScreen()
-{
- for( int i=0; i < (int) m_asLabels.size(); i++ )
- {
- const int offset = max(0, i-m_iTop);
-
- m_sprButtons[i]->SetX( 400 );
- m_textLabels[i]->SetX( 400 );
-
- m_sprButtons[i]->BeginTweening( 0.1f*offset, TWEEN_ACCELERATE );
- m_textLabels[i]->BeginTweening( 0.1f*offset, TWEEN_ACCELERATE );
-
- m_sprButtons[i]->BeginTweening( 0.2f, TWEEN_ACCELERATE );
- m_textLabels[i]->BeginTweening( 0.2f, TWEEN_ACCELERATE );
-
- m_sprButtons[i]->SetX( 0 );
- m_textLabels[i]->SetX( 0 );
-
- /* If this item isn't visible, hide it and skip tweens. */
- if( !ItemIsOnScreen(i) )
- {
- m_ButtonFrames[i]->PlayCommand( "HideItem" );
-
- m_sprButtons[i]->FinishTweening();
- m_textLabels[i]->FinishTweening();
- }
- }
-}
-
-void GroupList::TweenOffScreen()
-{
- for( int i=m_iTop; i < min(m_iTop+MAX_GROUPS_ONSCREEN, (int) m_asLabels.size()); i++ )
- {
- const int offset = max(0, i-m_iTop);
- if( i == m_iSelection )
- {
- m_sprButtons[i]->BeginTweening( 1.0f, TWEEN_DECELERATE );
- m_textLabels[i]->BeginTweening( 1.0f, TWEEN_DECELERATE );
- }
- else
- {
- m_sprButtons[i]->BeginTweening( 0.1f*offset, TWEEN_DECELERATE );
- m_textLabels[i]->BeginTweening( 0.1f*offset, TWEEN_DECELERATE );
- }
-
- m_sprButtons[i]->BeginTweening( 0.2f, TWEEN_DECELERATE );
- m_textLabels[i]->BeginTweening( 0.2f, TWEEN_DECELERATE );
-
- m_sprButtons[i]->SetX( 400 );
- m_textLabels[i]->SetX( 400 );
- }
-}
-
-/*
- * (c) 2001-2003 Chris Danford, Glenn Maynard
- * All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, and/or sell copies of the Software, and to permit persons to
- * whom the Software is furnished to do so, provided that the above
- * copyright notice(s) and this permission notice appear in all copies of
- * the Software and that both the above copyright notice(s) and this
- * permission notice appear in supporting documentation.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
- * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
- * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
- * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
diff --git a/src/GroupList.h b/src/GroupList.h
deleted file mode 100644
index 55121dc920..0000000000
--- a/src/GroupList.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* GroupList - Displays a list of groups for SelectGroup. (An old holdover.) */
-#ifndef GROUP_LIST_H
-#define GROUP_LIST_H
-
-#include "ActorFrame.h"
-#include "Sprite.h"
-#include "BitmapText.h"
-
-class GroupList: public ActorFrame
-{
- ActorFrame m_Frame;
- vector m_sprButtons;
- vector m_textLabels;
- vector m_ButtonFrames;
- vector m_asLabels;
-
- vector m_bHidden;
-
- /* Currently selected label. */
- int m_iSelection;
- /* Label that's currently at the top of the screen. */
- int m_iTop;
-
- void BeforeChange();
- void AfterChange();
- bool ItemIsOnScreen( int n ) const;
- void ResetTextSize( int item );
-
-public:
- GroupList();
- ~GroupList();
-
- void SetSelection(unsigned sel);
- int GetSelection() const { return m_iSelection; }
- RString GetSelectionName() const { return m_asLabels[m_iSelection]; }
- void Up();
- void Down();
- void Load( const vector& asGroupNames );
- void TweenOffScreen();
- void TweenOnScreen();
-};
-
-#endif
-
-/*
- * (c) 2001-2003 Chris Danford, Glenn Maynard
- * All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, and/or sell copies of the Software, and to permit persons to
- * whom the Software is furnished to do so, provided that the above
- * copyright notice(s) and this permission notice appear in all copies of
- * the Software and that both the above copyright notice(s) and this
- * permission notice appear in supporting documentation.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
- * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
- * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
- * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
diff --git a/src/HighScore.cpp b/src/HighScore.cpp
index 4d1e170bd8..420127f6bd 100644
--- a/src/HighScore.cpp
+++ b/src/HighScore.cpp
@@ -411,6 +411,7 @@ void Screenshot::LoadFromNode( const XNode* pNode )
// lua start
#include "LuaBinding.h"
+/** @brief Allow Lua to have access to the HighScore. */
class LunaHighScore: public Luna
{
public:
@@ -457,6 +458,7 @@ public:
LUA_REGISTER_CLASS( HighScore )
+/** @brief Allow Lua to have access to the HighScoreList. */
class LunaHighScoreList: public Luna
{
public:
diff --git a/src/HighScore.h b/src/HighScore.h
index 791fdf12a5..ba493e4d10 100644
--- a/src/HighScore.h
+++ b/src/HighScore.h
@@ -1,4 +1,4 @@
-/* HighScore - Player scoring data that persists between sessions. */
+/** @brief HighScore - Player scoring data that persists between sessions. */
#ifndef HIGH_SCORE_H
#define HIGH_SCORE_H
@@ -13,17 +13,37 @@ struct RadarValues;
struct lua_State;
struct HighScoreImpl;
+/** @brief The high score that is earned by a player. */
struct HighScore
{
HighScore();
+ /**
+ * @brief Retrieve the name of the player that set the high score.
+ * @return the name of the player. */
RString GetName() const;
+ /**
+ * @brief Retrieve the grade earned from this score.
+ * @return the grade.
+ */
Grade GetGrade() const;
+ /**
+ * @brief Retrieve the score earned.
+ * @return the score. */
int GetScore() const;
+ /**
+ * @brief Determine if any judgments were tallied during this run.
+ * @return true if no judgments were recorded, false otherwise. */
bool IsEmpty() const;
float GetPercentDP() const;
+ /**
+ * @brief Determine how many seconds the player had left in Survival mode.
+ * @return the number of seconds left. */
float GetSurviveSeconds() const;
float GetSurvivalSeconds() const;
+ /**
+ * @brief Get the modifiers used for this run.
+ * @return the modifiers. */
RString GetModifiers() const;
DateTime GetDateTime() const;
RString GetPlayerGuid() const;
@@ -33,6 +53,9 @@ struct HighScore
int GetHoldNoteScore( HoldNoteScore tns ) const;
const RadarValues &GetRadarValues() const;
float GetLifeRemainingSeconds() const;
+ /**
+ * @brief Determine if this score was from a situation that would cause disqualification.
+ * @return true if the score would be disqualified, false otherwise. */
bool GetDisqualified() const;
void SetName( const RString &sName );
@@ -70,6 +93,7 @@ private:
HiddenPtr m_Impl;
};
+/** @brief The list of high scores */
struct HighScoreList
{
public:
@@ -110,10 +134,14 @@ private:
};
+/** @brief the picture taken of the high score. */
struct Screenshot
{
- RString sFileName; // no directory part - just the file name
- RString sMD5; // MD5 hash of the screenshot file
+ /** @brief the filename of the screen shot. There is no directory part. */
+ RString sFileName;
+ /** @brief The MD5 hash of the screen shot file above. */
+ RString sMD5;
+ /** @brief The actual high score in question. */
HighScore highScore;
XNode* CreateNode() const;
@@ -122,8 +150,10 @@ struct Screenshot
#endif
-/*
- * (c) 2004 Chris Danford
+/**
+ * @file
+ * @author Chris Danford (c) 2004
+ * @section LICENSE
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
diff --git a/src/IniFile.h b/src/IniFile.h
index 7e45a9ec58..5a468c41d2 100644
--- a/src/IniFile.h
+++ b/src/IniFile.h
@@ -1,4 +1,4 @@
-/* IniFile - Reading and writing .INI files. */
+/** @brief IniFile - Reading and writing .INI files. */
#ifndef INIFILE_H
#define INIFILE_H
@@ -7,14 +7,20 @@
using namespace std;
class RageFileBasic;
-
+/** @brief The functions to read and write .INI files. */
class IniFile : public XNode
{
public:
+ /** @brief Set up an INI file with the defaults. */
IniFile();
- // Retrieve the filename of the last file loaded.
+ /**
+ * @brief Retrieve the filename of the last file loaded.
+ * @return the filename. */
RString GetPath() const { return m_sPath; }
+ /**
+ * @brief Retrieve any errors that have occurred.
+ * @return the latest error. */
const RString &GetError() const { return m_sError; }
bool ReadFile( const RString &sPath );
@@ -42,9 +48,15 @@ public:
bool DeleteKey( const RString &keyname );
bool DeleteValue( const RString &keyname, const RString &valuename );
- /* Rename a key. For example, call RenameKey("foo", "main") after
- * reading an INI where [foo] is an alias to [main]. If to already
- * exists, nothing happens. */
+ /**
+ * @brief Rename a key.
+ *
+ * For example, call RenameKey("foo", "main") after reading an INI
+ * where [foo] is an alias to [main]. If to already exists,
+ * nothing happens.
+ * @param from the key to rename.
+ * @param to the new key name.
+ * @return its success or failure. */
bool RenameKey( const RString &from, const RString &to );
private:
@@ -55,9 +67,10 @@ private:
#endif
-/*
- * (c) 2001-2004 Adam Clauss, Chris Danford
- *
+/**
+ * @file
+ * @author Adam Clauss, Chris Danford (c) 2001-2004
+ * @section LICENSE
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
diff --git a/src/InputMapper.cpp b/src/InputMapper.cpp
index d5d760a350..bc247c5552 100644
--- a/src/InputMapper.cpp
+++ b/src/InputMapper.cpp
@@ -122,7 +122,7 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ),
AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ),
AutoMappingEntry( 0, JOY_BUTTON_12, GAME_BUTTON_START, false )
- ),
+ ),
AutoMappings(
"dance",
"4 axis 16 button joystick",
@@ -156,8 +156,8 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_6, DANCE_BUTTON_UPRIGHT, false ),
AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ),
AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"dance",
"SideWinder Game Pad USB version 1.0",
"SideWinder Game Pad USB",
@@ -173,8 +173,8 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ),
AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ),
AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"dance",
"4 axis 12 button joystick with hat switch",
"Super Joy Box 5",
@@ -190,7 +190,7 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ),
AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false ),
AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_START, false )
- ),
+ ),
/* AutoMappings(
"dance",
@@ -211,9 +211,9 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 1, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ),
AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false ),
AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_START, false ),
- ),
+ ),
*/
- AutoMappings(
+ AutoMappings(
"dance",
"MP-8866 Dual USB Joypad",
"Super Dual Box (from DDRGame.com, Feb 2008)",
@@ -224,12 +224,12 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_4, DANCE_BUTTON_RIGHT, false ),
AutoMappingEntry( 0, JOY_BUTTON_7, DANCE_BUTTON_UPLEFT, false ),
AutoMappingEntry( 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ),
- //AutoMappingEntry{ 0, JOY_BUTTON_5, DANCE_BUTTON_DOWNLEFT, false ),
- //AutoMappingEntry{ 0, JOY_BUTTON_6, DANCE_BUTTON_DOWNRIGHT, false ),
+ //AutoMappingEntry{ 0, JOY_BUTTON_5, DANCE_BUTTON_DOWNLEFT, false ),
+ //AutoMappingEntry{ 0, JOY_BUTTON_6, DANCE_BUTTON_DOWNRIGHT, false ),
AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false ),
AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_START, false )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"dance",
"NTPAD",
"NTPAD",
@@ -247,8 +247,8 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 1, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ),
AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ),
AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"dance",
"Psx Gamepad",
"PSXPAD",
@@ -266,9 +266,9 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 1, JOY_BUTTON_6, DANCE_BUTTON_UPRIGHT, false ),
AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false ),
AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_START, false )
- ),
+ ),
// TODO: add black and white buttons, as well as other missing inputs -aj
- AutoMappings(
+ AutoMappings(
"dance",
"XBOX Gamepad Plugin V0.01",
"X-Box gamepad",
@@ -284,13 +284,13 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_8, DANCE_BUTTON_UPRIGHT, false ), // R shoulder
AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_START, false ),
AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_BACK, false )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"dance",
"0b43:0003", // The EMS USB2 doesn't provide a model string, so Linux
- // just gives us the VendorID and ModelID in hex.
+ // just gives us the VendorID and ModelID in hex.
"EMS USB2",
- // Player 1.
+ // Player 1.
AutoMappingEntry( 0, JOY_BUTTON_16, DANCE_BUTTON_LEFT, false ),
AutoMappingEntry( 0, JOY_BUTTON_14, DANCE_BUTTON_RIGHT, false ),
AutoMappingEntry( 0, JOY_BUTTON_13, DANCE_BUTTON_UP, false ),
@@ -305,7 +305,7 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false ),
AutoMappingEntry( 0, JOY_BUTTON_5, GAME_BUTTON_BACK, false ),
AutoMappingEntry( 0, JOY_BUTTON_6, GAME_BUTTON_COIN, false ),
- // Player 2.
+ // Player 2.
AutoMappingEntry( 0, JOY_BUTTON_32, DANCE_BUTTON_LEFT, true ),
AutoMappingEntry( 0, JOY_BUTTON_30, DANCE_BUTTON_RIGHT, true ),
AutoMappingEntry( 0, JOY_BUTTON_29, DANCE_BUTTON_UP, true ),
@@ -320,8 +320,8 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_26, GAME_BUTTON_START, true ),
AutoMappingEntry( 0, JOY_BUTTON_21, GAME_BUTTON_BACK, true ),
AutoMappingEntry( 0, JOY_BUTTON_22, GAME_BUTTON_COIN, true )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"dance",
"Dance ", //Notice extra space at end
"LevelSix USB Pad (DDR638)", // "DDR638" is the model number of the pad
@@ -333,8 +333,8 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_8, DANCE_BUTTON_UPLEFT, false ),
AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ),
AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"dance",
"SmartJoy PLUS Adapter",
"SmartJoy PLUS Adapter",
@@ -352,8 +352,8 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_9, /* Start */ GAME_BUTTON_START, false ),
AutoMappingEntry( 0, JOY_BUTTON_5, /* R1 */ GAME_BUTTON_SELECT, false ),
AutoMappingEntry( 0, JOY_BUTTON_6, /* R2 */ GAME_BUTTON_COIN, false )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"dance",
"RedOctane USB Pad|XBOX DDR", // "RedOctane USB Pad" is Ignition 3s and newer Afterburners. "XBOX DDR" is older Afterburners.
"RedOctane Ignition 3 or Afterburner",
@@ -367,8 +367,8 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_8, /* O */ GAME_BUTTON_START, false ),
AutoMappingEntry( 1, JOY_BUTTON_9, /* Start */ GAME_BUTTON_START, false ),
AutoMappingEntry( 0, JOY_BUTTON_10, /* Sel */ GAME_BUTTON_BACK, false )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"dance",
"Joypad to USB converter",
"EMS Trio Linker",
@@ -382,8 +382,8 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_2, /* O */ GAME_BUTTON_START, false ),
AutoMappingEntry( 1, JOY_BUTTON_10, /* Start */ GAME_BUTTON_START, false ),
AutoMappingEntry( 0, JOY_BUTTON_9, /* Sel */ GAME_BUTTON_BACK, false )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"dance",
"Positive Gaming Impact USB pad",
"Positive Gaming Impact USB pad",
@@ -397,8 +397,8 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_8, /* O */ DANCE_BUTTON_UPRIGHT, false ),
AutoMappingEntry( 1, JOY_BUTTON_9, /* Start */ GAME_BUTTON_START, false ),
AutoMappingEntry( 0, JOY_BUTTON_10, /* Sel */ GAME_BUTTON_BACK, false )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"dance",
"USB Dance Pad",
"DDRGame Energy Dance Pad",
@@ -412,8 +412,8 @@ static const AutoMappings g_AutoMappings[] =
//AutoMappingEntry{ 0, JOY_BUTTON_4, DANCE_BUTTON_DOWNRIGHT, false ),
AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ),
AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"dance",
"Dual USB Vibration Joystick",
"PC Multi Hub Double Power Box 4",
@@ -427,8 +427,8 @@ static const AutoMappings g_AutoMappings[] =
//AutoMappingEntry{ 0, JOY_BUTTON_4, DANCE_BUTTON_DOWNRIGHT, false ),
AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ),
AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"dance",
"Controller \\(Harmonix Drum Kit for Xbox 360\\)",
"Rock Band drum controller (Xbox 360, Windows driver)",
@@ -442,8 +442,8 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_HAT_DOWN, GAME_BUTTON_MENUDOWN, false ), // d-pad down
AutoMappingEntry( 0, JOY_BUTTON_8, GAME_BUTTON_START, false ), // start button
AutoMappingEntry( 0, JOY_BUTTON_7, GAME_BUTTON_BACK, false ) // back button
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"pump",
"Pump USB",
"Pump USB pad",
@@ -458,8 +458,8 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_9, PUMP_BUTTON_CENTER, true ),
AutoMappingEntry( 0, JOY_BUTTON_10, PUMP_BUTTON_DOWNLEFT, true ),
AutoMappingEntry( 0, JOY_BUTTON_11, PUMP_BUTTON_DOWNRIGHT, true )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"pump",
"GamePad Pro USB ", // yes, there is a space at the end
"GamePad Pro USB",
@@ -474,8 +474,8 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 1, JOY_BUTTON_1, PUMP_BUTTON_CENTER, false ),
AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_BACK, false ),
AutoMappingEntry( 0, JOY_BUTTON_10, GAME_BUTTON_START, false )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"pump",
"Controller \\(Harmonix Drum Kit for Xbox 360\\)",
"Rock Band drum controller (Xbox 360, Windows driver)",
@@ -490,8 +490,8 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_HAT_DOWN, GAME_BUTTON_MENUDOWN, false ), // d-pad down
AutoMappingEntry( 0, JOY_BUTTON_8, GAME_BUTTON_START, false ), // start button
AutoMappingEntry( 0, JOY_BUTTON_7, GAME_BUTTON_BACK, false ) // back button
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"para",
"ParaParaParadise Controller",
"ParaParaParadise Controller",
@@ -504,8 +504,8 @@ static const AutoMappings g_AutoMappings[] =
AutoMappingEntry( 0, JOY_BUTTON_11, GAME_BUTTON_BACK, false ),
AutoMappingEntry( 0, JOY_BUTTON_12, GAME_BUTTON_MENULEFT, false ),
AutoMappingEntry( 0, JOY_BUTTON_9, GAME_BUTTON_MENURIGHT, false )
- ),
- AutoMappings(
+ ),
+ AutoMappings(
"techno",
"Dance ", //Notice the extra space at end
"LevelSix USB Pad (DDR638)", // "DDR638" is the model number of the pad
@@ -1075,7 +1075,7 @@ void InputMappings::ReadMappings( const InputScheme *pInputScheme, RString sFile
if( !ini.GetValue( "AutoMapping", "DeviceRegex", m_sDeviceRegex ) )
Dialog::OK( "Missing AutoMapping::DeviceRegex in '%s'", sFilePath.c_str() );
- if( !ini.GetValue( "AutoMapping", "Description", m_sDescription ) )
+ if( !ini.GetValue( "AutoMapping", "Description", m_sDescription ) )
Dialog::OK( "Missing AutoMapping::Description in '%s'", sFilePath.c_str() );
}
diff --git a/src/LightsManager.cpp b/src/LightsManager.cpp
index facf0530e7..8e17f094b5 100644
--- a/src/LightsManager.cpp
+++ b/src/LightsManager.cpp
@@ -120,7 +120,7 @@ LightsManager::~LightsManager()
m_vpDrivers.clear();
}
-// XXX: make themable
+// XXX: Allow themer to change these. (rewritten; who wrote original? -aj)
static const float g_fLightEffectRiseSeconds = 0.075f;
static const float g_fLightEffectFalloffSeconds = 0.35f;
static const float g_fCoinPulseTime = 0.100f;
@@ -453,7 +453,7 @@ void LightsManager::ChangeTestCabinetLight( int iDir )
void LightsManager::ChangeTestGameButtonLight( int iDir )
{
m_clTestManualCycleCurrent = CabinetLight_Invalid;
-
+
vector vGI;
GetUsedGameInputs( vGI );
@@ -473,9 +473,9 @@ CabinetLight LightsManager::GetFirstLitCabinetLight()
GameInput LightsManager::GetFirstLitGameButtonLight()
{
- FOREACH_ENUM( GameController, gc )
+ FOREACH_ENUM( GameController, gc )
{
- FOREACH_ENUM( GameButton, gb )
+ FOREACH_ENUM( GameButton, gb )
{
if( m_LightsState.m_bGameButtonLights[gc][gb] )
return GameInput( gc, gb );
@@ -489,7 +489,6 @@ bool LightsManager::IsEnabled() const
return m_vpDrivers.size() >= 1 || PREFSMAN->m_bDebugLights;
}
-
/*
* (c) 2003-2004 Chris Danford
* All rights reserved.
diff --git a/src/LightsManager.h b/src/LightsManager.h
index 0a3b5fc132..0934744ba6 100644
--- a/src/LightsManager.h
+++ b/src/LightsManager.h
@@ -61,7 +61,7 @@ class LightsManager
public:
LightsManager();
~LightsManager();
-
+
void Update( float fDeltaTime );
bool IsEnabled() const;
@@ -105,7 +105,6 @@ private:
int m_iControllerTestManualCycleCurrent;
};
-
extern LightsManager* LIGHTSMAN; // global and accessable from anywhere in our program
#endif
diff --git a/src/LyricDisplay.cpp b/src/LyricDisplay.cpp
index 2d82037065..21e8b5dfd9 100644
--- a/src/LyricDisplay.cpp
+++ b/src/LyricDisplay.cpp
@@ -40,7 +40,7 @@ void LyricDisplay::Update( float fDeltaTime )
if( GAMESTATE->m_pCurSong == NULL )
return;
- /* If the song has changed (in a course), reset. */
+ // If the song has changed (in a course), reset.
if( GAMESTATE->m_fMusicSeconds < m_fLastSecond )
Init();
m_fLastSecond = GAMESTATE->m_fMusicSeconds;
@@ -54,7 +54,7 @@ void LyricDisplay::Update( float fDeltaTime )
if( GAMESTATE->m_fMusicSeconds < fStartTime )
return;
- /* Clamp this lyric to the beginning of the next or the end of the music. */
+ // Clamp this lyric to the beginning of the next or the end of the music.
float fEndTime;
if( m_iCurLyricNumber+1 < GAMESTATE->m_pCurSong->m_LyricSegments.size() )
fEndTime = pSong->m_LyricSegments[m_iCurLyricNumber+1].m_fStartTime;
@@ -65,7 +65,7 @@ void LyricDisplay::Update( float fDeltaTime )
const float fTweenBufferTime = IN_LENGTH.GetValue() + OUT_LENGTH.GetValue();
/* If it's negative, two lyrics are so close together that there's no time
- * to tween properly. Lyrics should never be this brief, anyway, so just
+ * to tween properly. Lyrics should never be this brief, anyway, so just
* skip it. */
float fShowLength = max( fDistance - fTweenBufferTime, 0.0f );
diff --git a/src/LyricDisplay.h b/src/LyricDisplay.h
index f4f1f3c359..a5d7baecf7 100644
--- a/src/LyricDisplay.h
+++ b/src/LyricDisplay.h
@@ -12,7 +12,7 @@ public:
LyricDisplay();
void Update( float fDeltaTime );
- /* Call when song changes: */
+ // Call when song changes:
void Init();
private:
diff --git a/src/LyricsLoader.cpp b/src/LyricsLoader.cpp
index 72f53de259..94c5e59d59 100644
--- a/src/LyricsLoader.cpp
+++ b/src/LyricsLoader.cpp
@@ -8,8 +8,9 @@
#include