From ffb6144456f39507c6f06fa6765d194b64e0ba23 Mon Sep 17 00:00:00 2001 From: AJ Kelly Date: Sun, 3 Jul 2011 16:38:24 -0500 Subject: [PATCH 01/39] slightly edit assert msg --- src/RageUtil.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/RageUtil.cpp b/src/RageUtil.cpp index b7eff99a24..d72a4780dd 100644 --- a/src/RageUtil.cpp +++ b/src/RageUtil.cpp @@ -92,7 +92,7 @@ int MersenneTwister::operator()() void fapproach( float& val, float other_val, float to_move ) { - ASSERT_M( to_move >= 0, ssprintf("to_move: %f", to_move) ); + ASSERT_M( to_move >= 0, ssprintf("to_move: %f < 0", to_move) ); if( val == other_val ) return; float fDelta = other_val - val; From 0ce0cdfefdf2aec2a70c1ccba430314a5d7d3b0f Mon Sep 17 00:00:00 2001 From: AJ Kelly Date: Sun, 3 Jul 2011 16:42:35 -0500 Subject: [PATCH 02/39] kill bad redirect and be crazy because I can --- Themes/default/Graphics/ScreenMapControllers exit.lua | 10 ++++++++++ .../default/Graphics/ScreenMapControllers exit.redir | 1 - 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 Themes/default/Graphics/ScreenMapControllers exit.lua delete mode 100644 Themes/default/Graphics/ScreenMapControllers exit.redir diff --git a/Themes/default/Graphics/ScreenMapControllers exit.lua b/Themes/default/Graphics/ScreenMapControllers exit.lua new file mode 100644 index 0000000000..dda8c0fd5c --- /dev/null +++ b/Themes/default/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("#880000");NoStroke); + 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;effectcolor1,color("#FF2222");effectcolor2,color("#880000");); + LoseFocusCommand=cmd(stopeffect); +}; diff --git a/Themes/default/Graphics/ScreenMapControllers exit.redir b/Themes/default/Graphics/ScreenMapControllers exit.redir deleted file mode 100644 index 04b2ead777..0000000000 --- a/Themes/default/Graphics/ScreenMapControllers exit.redir +++ /dev/null @@ -1 +0,0 @@ -_blank \ No newline at end of file From 69f236c9aa3ecb04ccf323bcdc4c30a627c5b218 Mon Sep 17 00:00:00 2001 From: AJ Kelly Date: Sun, 3 Jul 2011 16:48:14 -0500 Subject: [PATCH 03/39] fix up credits in default --- Themes/default/BGAnimations/ScreenCredits overlay.lua | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Themes/default/BGAnimations/ScreenCredits overlay.lua b/Themes/default/BGAnimations/ScreenCredits overlay.lua index d9addb448a..c7f073fe2a 100644 --- a/Themes/default/BGAnimations/ScreenCredits overlay.lua +++ b/Themes/default/BGAnimations/ScreenCredits overlay.lua @@ -35,14 +35,15 @@ local stepmania = { "Chris Danford", "Glenn Maynard", "Steve Checkoway", - -- and various other contributors + -- and various other contributors whom I don't remember at the moment. -aj } local contrib = { "Aldo Fregoso (Aldo_MX)", -- delays - "Chris Eldridge (kurisu)", -- dance-threepanel "cerbo", "cesarmades", -- pump/cmd* noteskins + "Chris Eldridge (kurisu)", -- dance-threepanel + "Christophe Goulet-LeBlanc (Kommisar)", "corec", -- various fixes "galopin", -- piu PlayStation2 usb mat support "gholms", -- automake 1.11 support @@ -50,9 +51,7 @@ local contrib = { "Kaox", -- pump/default noteskin "NitroX72", -- pump/frame noteskin "sy567", -- beginner helper fix - "Thai Pangsakulyanont (theDtTvB)", "v1toko", -- x-mode from StepNXA - "Christophe Goulet-LeBlanc (Kommisar)", } local thanks = { @@ -72,7 +71,7 @@ local thanks = { local shoutout = { "The Lua team", -- lua project lead or some shit. super nerdy but oh hell. - "Mojang", -- minecraft forever -freem + "Mojang AB", -- minecraft forever -freem "Wolfire Games", -- piles of inspiration "NAKET Coder", "Ciera Boyd", -- you bet your ass I'm putting my girlfriend in the credits From be7de664817f62323362eb3f5ca5c3195b5a7625 Mon Sep 17 00:00:00 2001 From: AJ Kelly Date: Sun, 3 Jul 2011 16:49:21 -0500 Subject: [PATCH 04/39] once more with feeling --- .../_fallback/BGAnimations/ScreenCredits overlay.lua | 10 +++++----- Themes/default/BGAnimations/ScreenCredits overlay.lua | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Themes/_fallback/BGAnimations/ScreenCredits overlay.lua b/Themes/_fallback/BGAnimations/ScreenCredits overlay.lua index 57eea2c09a..68af12b7f2 100644 --- a/Themes/_fallback/BGAnimations/ScreenCredits overlay.lua +++ b/Themes/_fallback/BGAnimations/ScreenCredits overlay.lua @@ -25,7 +25,8 @@ local ssc = { } local sm_ssc = { - "Jason Felds (wolfman2000)", + "Jason Felds (wolfman2000)", -- Timing Segments, Split Timing, optimization + "Thai Pangsakulyanont (theDtTvB)", -- BMS, Split Timing, optimization "Alberto Ramos (Daisuke Master)", "Jack Walstrom (FSX)", } @@ -39,9 +40,10 @@ local stepmania = { local contrib = { "Aldo Fregoso (Aldo_MX)", -- delays - "Chris Eldridge (kurisu)", -- dance-threepanel "cerbo", "cesarmades", -- pump/cmd* noteskins + "Chris Eldridge (kurisu)", -- dance-threepanel + "Christophe Goulet-LeBlanc (Kommisar)", "corec", -- various fixes "galopin", -- piu PlayStation2 usb mat support "gholms", -- automake 1.11 support @@ -49,9 +51,7 @@ local contrib = { "Kaox", -- pump/default noteskin "NitroX72", -- pump/frame noteskin "sy567", -- beginner helper fix - "Thai Pangsakulyanont (theDtTvB)", "v1toko", -- x-mode from StepNXA - "Christophe Goulet-LeBlanc (Kommisar)", } local thanks = { @@ -71,7 +71,7 @@ local thanks = { local shoutout = { "The Lua team", -- lua project lead or some shit. super nerdy but oh hell. - "Mojang", -- minecraft forever -freem + "Mojang AB", -- minecraft forever -freem "NAKET Coder", "Ciera Boyd", -- you bet your ass I'm putting my girlfriend in the credits --Image(), -- we should have some logos probably to look super pro diff --git a/Themes/default/BGAnimations/ScreenCredits overlay.lua b/Themes/default/BGAnimations/ScreenCredits overlay.lua index c7f073fe2a..3e80341b98 100644 --- a/Themes/default/BGAnimations/ScreenCredits overlay.lua +++ b/Themes/default/BGAnimations/ScreenCredits overlay.lua @@ -35,7 +35,7 @@ local stepmania = { "Chris Danford", "Glenn Maynard", "Steve Checkoway", - -- and various other contributors whom I don't remember at the moment. -aj + -- and various other contributors } local contrib = { From 16fa62327aae3b9e2e0dffe7cef2526d1f6021d8 Mon Sep 17 00:00:00 2001 From: AJ Kelly Date: Sun, 3 Jul 2011 16:52:59 -0500 Subject: [PATCH 05/39] add waiei to credits --- Themes/_fallback/BGAnimations/ScreenCredits overlay.lua | 1 + Themes/default/BGAnimations/ScreenCredits overlay.lua | 1 + 2 files changed, 2 insertions(+) diff --git a/Themes/_fallback/BGAnimations/ScreenCredits overlay.lua b/Themes/_fallback/BGAnimations/ScreenCredits overlay.lua index 68af12b7f2..e1a275011b 100644 --- a/Themes/_fallback/BGAnimations/ScreenCredits overlay.lua +++ b/Themes/_fallback/BGAnimations/ScreenCredits overlay.lua @@ -52,6 +52,7 @@ local contrib = { "NitroX72", -- pump/frame noteskin "sy567", -- beginner helper fix "v1toko", -- x-mode from StepNXA + "waiei", -- custom scoring fixes + Hybrid scoring } local thanks = { diff --git a/Themes/default/BGAnimations/ScreenCredits overlay.lua b/Themes/default/BGAnimations/ScreenCredits overlay.lua index 3e80341b98..6d9b73f724 100644 --- a/Themes/default/BGAnimations/ScreenCredits overlay.lua +++ b/Themes/default/BGAnimations/ScreenCredits overlay.lua @@ -52,6 +52,7 @@ local contrib = { "NitroX72", -- pump/frame noteskin "sy567", -- beginner helper fix "v1toko", -- x-mode from StepNXA + "waiei", -- custom scoring fixes + Hybrid scoring } local thanks = { From 9241a4b1cb4a8605353779142a2d588ee33e8725 Mon Sep 17 00:00:00 2001 From: AJ Kelly Date: Sun, 3 Jul 2011 17:42:14 -0500 Subject: [PATCH 06/39] go away semicolons --- src/StepMania-net2008.vcproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/StepMania-net2008.vcproj b/src/StepMania-net2008.vcproj index 8c558ff4f2..315331951d 100644 --- a/src/StepMania-net2008.vcproj +++ b/src/StepMania-net2008.vcproj @@ -372,7 +372,7 @@ EnableIntrinsicFunctions="true" FavorSizeOrSpeed="1" AdditionalIncludeDirectories=".;"..\extern\lua-5.1\src";ffmpeg\modern_working\include;BaseClasses;..\extern\jsoncpp\include;"..\extern\glew-1.5.8\include";..\extern\pcre;"..\extern\mad-0.15.1b";..\extern\libpng\include;..\extern\libjpeg;..\extern\zlib;..\extern\vorbis" - PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;WINDOWS;RELEASE;GLEW_STATIC" + PreprocessorDefinitions="WIN32,NDEBUG,_WINDOWS,WINDOWS,RELEASE,GLEW_STATIC" StringPooling="true" MinimalRebuild="false" ExceptionHandling="0" From 6a1695216137e7393f92c59fb13b31de2c45727f Mon Sep 17 00:00:00 2001 From: AJ Kelly Date: Sun, 3 Jul 2011 17:52:03 -0500 Subject: [PATCH 07/39] FUCK THIS PIECE OF BULLSHIT --- src/PlayerOptions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PlayerOptions.cpp b/src/PlayerOptions.cpp index 3f577a17d3..a6f279a107 100644 --- a/src/PlayerOptions.cpp +++ b/src/PlayerOptions.cpp @@ -61,7 +61,7 @@ void PlayerOptions::Approach( const PlayerOptions& other, float fDeltaSeconds ) APPROACH( fTimeSpacing ); APPROACH( fScrollSpeed ); - APPROACH( fMaxScrollBPM ); + //APPROACH( fMaxScrollBPM ); fapproach( m_fScrollBPM, other.m_fScrollBPM, fDeltaSeconds * other.m_SpeedfScrollBPM*150 ); for( int i=0; i Date: Sun, 3 Jul 2011 18:30:25 -0500 Subject: [PATCH 08/39] use sm5 not ssc --- src/ProductInfo.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProductInfo.inc b/src/ProductInfo.inc index 3d2899459d..cef8375b3e 100644 --- a/src/ProductInfo.inc +++ b/src/ProductInfo.inc @@ -7,7 +7,7 @@ !define PRODUCT_ID "StepMania" !define PRODUCT_VER "v5.0 Preview 2" !define PRODUCT_DISPLAY "${PRODUCT_ID} ${PRODUCT_VER}" -!define PRODUCT_BITMAP "ssc" +!define PRODUCT_BITMAP "sm5" !define PRODUCT_URL "http://www.stepmania.com/" !define UPDATES_URL "http://www.stepmania.com/" From 238424ec8ac47d183addb77f39a5727d0d13e657 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Sun, 3 Jul 2011 19:37:28 -0400 Subject: [PATCH 09/39] Add new noteskin. --- Utils/CreatePackage.pl | 1 + 1 file changed, 1 insertion(+) diff --git a/Utils/CreatePackage.pl b/Utils/CreatePackage.pl index 81457e0f87..37881fd1e7 100755 --- a/Utils/CreatePackage.pl +++ b/Utils/CreatePackage.pl @@ -173,6 +173,7 @@ my @files = ( "NoteSkins/pump/default", "NoteSkins/pump/frame5p", "NoteSkins/pump/newextra", + "NoteSkins/pump/pad", "NoteSkins/pump/rhythm", "NoteSkins/pump/simple", # kb7 noteskins From 99ca0781044c49cc6107469d81bc943ab78683c8 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Sun, 3 Jul 2011 20:44:48 -0400 Subject: [PATCH 10/39] Already prepare for future commits. --- Docs/Changelog_sm5.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index c853815376..a10066edfd 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -5,7 +5,11 @@ from StepMania 4 alpha 5 to sm-ssc v1.2.5, see Changelog_sm-ssc.txt. ________________________________________________________________________________ ================================================================================ -StepMania 5.0 Preview 2 | 201107?? +StepMania 5.0 ????????? | 20110??? +-------------------------------------------------------------------------------- + +================================================================================ +StepMania 5.0 Preview 2 | 20110703 -------------------------------------------------------------------------------- 2011/07/03 From 9a50418ed4760bb8cf49c3457ea1e0ad288f6221 Mon Sep 17 00:00:00 2001 From: AJ Kelly Date: Sun, 3 Jul 2011 20:42:49 -0500 Subject: [PATCH 11/39] fix a problem with lowercase 'w' looking off (the stroke on the lowercase 'g' is the problem) --- .../frutiger 24px [main-stroke] 16x16.png | Bin 40036 -> 39764 bytes .../Fonts/frutiger 24px [main] 16x16.png | Bin 34432 -> 22133 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Themes/_fallback/Fonts/frutiger 24px [main-stroke] 16x16.png b/Themes/_fallback/Fonts/frutiger 24px [main-stroke] 16x16.png index 66f6fd79b39dd036cf669e16c0a7da39a94aacc3..cc9d1d62af4564cfdda19589a6962079e3a9caf5 100644 GIT binary patch literal 39764 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 z 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 diff --git a/Themes/_fallback/Fonts/frutiger 24px [main] 16x16.png b/Themes/_fallback/Fonts/frutiger 24px [main] 16x16.png index 1963076070e2573d9129c101fcc402ef27a7290f..bf737d6d3e8f8f2bc5143a55c7fe973dadde9045 100644 GIT binary patch literal 22133 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 R^l^Vr-8O_6RNr)t{x8T6DcS%4 literal 34432 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 D(d{p6 From 626a8a890f30062fafb73114282e22504d01d733 Mon Sep 17 00:00:00 2001 From: AJ Kelly Date: Sun, 3 Jul 2011 20:53:02 -0500 Subject: [PATCH 12/39] point UPDATES_URL to the download page. --- src/ProductInfo.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProductInfo.inc b/src/ProductInfo.inc index cef8375b3e..f34a704abf 100644 --- a/src/ProductInfo.inc +++ b/src/ProductInfo.inc @@ -10,7 +10,7 @@ !define PRODUCT_BITMAP "sm5" !define PRODUCT_URL "http://www.stepmania.com/" -!define UPDATES_URL "http://www.stepmania.com/" +!define UPDATES_URL "http://code.google.com/p/sm-ssc/downloads/list" ;!define INSTALL_EXTERNAL_PCKS ;!define INSTALL_INTERNAL_PCKS From ac3b0f9f496b0b54ea4ada2e40df5dcb6006ced5 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Sun, 3 Jul 2011 22:31:47 -0400 Subject: [PATCH 13/39] Fix attack removing crash if no attacks. --- Docs/Changelog_sm5.txt | 5 +++++ src/ScreenEdit.cpp | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index a10066edfd..a9d42a6c3b 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -8,6 +8,11 @@ ________________________________________________________________________________ StepMania 5.0 ????????? | 20110??? -------------------------------------------------------------------------------- +2011/07/03 +---------- +* [ScreenEdit] Fix a crash if one tries to remove an attack that doesn't + exist at that time. [Wolfman2000] + ================================================================================ StepMania 5.0 Preview 2 | 20110703 -------------------------------------------------------------------------------- diff --git a/src/ScreenEdit.cpp b/src/ScreenEdit.cpp index ed8bebe2d4..a1af3713a6 100644 --- a/src/ScreenEdit.cpp +++ b/src/ScreenEdit.cpp @@ -3126,8 +3126,8 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) if (ScreenMiniMenu::s_iLastRowCode == ScreenEdit::remove ) { - ASSERT(iAttack >= 0); - attacks.erase(attacks.begin() + iAttack); + if (iAttack > 0) + attacks.erase(attacks.begin() + iAttack); } else { From e1c16d36f2467dfcef9543842cbc65ebe04acbd9 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Mon, 4 Jul 2011 02:24:34 -0400 Subject: [PATCH 14/39] Remove lua warning. Based on playing, this was making no difference. --- NoteSkins/pump/default/UpLeft Explosion.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/NoteSkins/pump/default/UpLeft Explosion.lua b/NoteSkins/pump/default/UpLeft Explosion.lua index 9127b0764b..9ac5e41a70 100644 --- a/NoteSkins/pump/default/UpLeft Explosion.lua +++ b/NoteSkins/pump/default/UpLeft Explosion.lua @@ -15,9 +15,7 @@ return Def.ActorFrame { --tap NOTESKIN:LoadActor(Var "Button", "Ready Receptor")..{ Name="Tap"; - Frames = { { Frame = 2 } }; TapCommand=cmd(finishtweening;diffusealpha,1;zoom,1;linear,0.2;diffusealpha,0;zoom,1.2); - InitCommand=cmd(playcommand,"Tap"); HeldCommand=cmd(playcommand,"Tap"); ColumnJudgmentMessageCommand=cmd(playcommand,"Tap"); From 72b468b22becfdf2bbed6abe923ffe4e319c7bbf Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Mon, 4 Jul 2011 11:23:49 -0400 Subject: [PATCH 15/39] This doesn't require two lines. --- Themes/_fallback/metrics.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index f7dea506c8..03e7f4adbb 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -3659,7 +3659,7 @@ SelectionBeatBeginFormat="%s:\n %.6f" SelectionBeatUnfinishedFormat=" ...\n" SelectionBeatEndFormat="-%.6f\n" DifficultyFormat="%s:\n %s\n" -RoutinePlayerFormat="%s:\n %d\n" +RoutinePlayerFormat="%s: %d\n" DescriptionFormat="%s:\n %s\n" StepAuthorFormat="%s:\n %s\n" ChartStyleFormat="%s:\n %s\n" From f5a9b52a6d60ce6c8d3a72aa33c1d29873e131f0 Mon Sep 17 00:00:00 2001 From: Alberto Ramos Date: Mon, 4 Jul 2011 11:20:04 -0600 Subject: [PATCH 16/39] behave properly --- NoteSkins/pump/default/UpLeft Explosion.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NoteSkins/pump/default/UpLeft Explosion.lua b/NoteSkins/pump/default/UpLeft Explosion.lua index 9ac5e41a70..a6e9d779ee 100644 --- a/NoteSkins/pump/default/UpLeft Explosion.lua +++ b/NoteSkins/pump/default/UpLeft Explosion.lua @@ -15,8 +15,9 @@ return Def.ActorFrame { --tap NOTESKIN:LoadActor(Var "Button", "Ready Receptor")..{ Name="Tap"; + --Frames = { { Frame = 2 ; Delay = 1 } }; TapCommand=cmd(finishtweening;diffusealpha,1;zoom,1;linear,0.2;diffusealpha,0;zoom,1.2); - InitCommand=cmd(playcommand,"Tap"); + InitCommand=cmd(pause;setstate,2;playcommand,"Tap"); HeldCommand=cmd(playcommand,"Tap"); ColumnJudgmentMessageCommand=cmd(playcommand,"Tap"); --TapNoneCommand=cmd(playcommand,"Tap"); From 3d6828eb67d9baf99e54a1f4b7d6786f6e4f0c50 Mon Sep 17 00:00:00 2001 From: AJ Kelly Date: Mon, 4 Jul 2011 14:41:16 -0500 Subject: [PATCH 17/39] add unsigned to the types --- Docs/Luadoc/Lua.xsl | 1 + 1 file changed, 1 insertion(+) diff --git a/Docs/Luadoc/Lua.xsl b/Docs/Luadoc/Lua.xsl index 01f3657220..72271aec39 100644 --- a/Docs/Luadoc/Lua.xsl +++ b/Docs/Luadoc/Lua.xsl @@ -400,6 +400,7 @@ $type='LuaOptionRow' or $type='ActorDef' or $type='chunk' or + $type='unsigned' or $type='various'"> From d5e19e42ce5d391a2fd0e8ea816a82b58cf9a183 Mon Sep 17 00:00:00 2001 From: AJ Kelly Date: Mon, 4 Jul 2011 15:56:22 -0500 Subject: [PATCH 18/39] luadocs checkpoint --- Docs/Luadoc/Lua.xml | 10 +- Docs/Luadoc/LuaDocumentation.xml | 213 ++++++++++++++++++++++++++++--- 2 files changed, 198 insertions(+), 25 deletions(-) diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index ed192118a5..4f56b8b1a2 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -153,6 +153,7 @@ + @@ -932,6 +933,7 @@ + @@ -1477,8 +1479,8 @@ - + @@ -2130,9 +2132,9 @@ - + - StepMania 5 v5.0 Preview 1a - 2011-06-24 + StepMania 5 v5.0 Preview 2 + 2011-07-04 diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index 40d229921d..edad01dcee 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -23,6 +23,9 @@ + + [03 HSV.lua] Returns a color with the specified alpha. + [02 StageMods.lua] @@ -36,10 +39,10 @@ Returns the base name of file path. - [02 Colors.lua] + [02 Colors.lua] Boosts the specified color by multiplying its values by fBoost. - [03 HSV.lua] + [03 HSV.lua] Modifies the brightness of the specified color. [03 ProductivityHelpers.lua] Returns true if Center 1P is being used. @@ -48,7 +51,8 @@ [03 Gameplay.lua] - CLAMP is an all-female Japanese mangaka group that formed in the mid 1980s. Erm, I mean... Clamps fValue between fLow and fHigh. + 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. @@ -59,6 +63,21 @@ Returns a color from a string. color can be in hex ("#FFFFFFFF") or 0..1 values ("1.0,1.0,1.0,1.0"), in RGBA order. + + [02 Colors.lua] Returns a darker tone of the color. (Specifically c[1]/2, c[2]/2, c[3]/2, c[4]) + + + [02 Colors.lua] Returns a lighter tone of the color. (Specifically c[1]+(c[1]/2), c[2]+(c[2]/2), c[3]+(c[3]/2), c[4]) + + + [02 Colors.lua] Returns a midtone of the color. (Specifically c[1]/1.5, c[2]/1.5, c[3]/1.5, c[4]) + + + [03 HSV.lua] Returns a hex representation for the specified color. + + + [03 HSV.lua] Takes in a color and returns a table with the HSV values. + [03 Gameplay.lua] Determines what TapNoteScore allows for continuing the combo. @@ -68,6 +87,12 @@ [03 Gameplay.lua] Determines if combo should be per row (Jump = 1) or per column (Jump = 2). + + [02 Other.lua] The combo trasform command. + + + [03 Gameplay.lua] Returns the UserPrefComboUnderField user preference value. + Tries to connect to the server at sAddress. @@ -77,14 +102,23 @@ Returns the current day of the year. + + [02 Serialize] Recursively deep-copy a table. + [01 base.lua] "Override Lua's dofile to use our loadfile." + + [02 Utilities.lua] + + + [02 Utilities.lua] Return the index of a true value in list. + [02 Utilities.lua] Find a key in tab with the given value. - - [02 Utilities.lua] Return the index of a true value in list. + + func takes a key and a value. Returns the number passed to the function followed by its suffix ("th", "nd", and so on). @@ -98,6 +132,12 @@ Returns the corresponding CustomDifficulty string for a StepsType/Difficulty (/optional CourseType) combination. + + [04 Scoring.lua] "Get the radar values directly. The individual steps aren't used much." + + + [02 Other.lua] Returns a string with the Edit Mode SubScreens. + [03 EnvUtils2.lua] Returns the value of name from the Env table. @@ -113,21 +153,45 @@ Returns a string representing the name of the operating system being used. (e.g. "Windows", "Linux", "Mac, "Unknown") + + [03 ProductivityHelpers.lua] "This returns a profile, preferably a player one. If there isn't one, [it falls] back on the machine profile." + [03 ThemePrefs.lua] Returns true if player pn is using ProTiming. [02 Utilities.lua] Returns a path to a random song background. + + [03 ProductivityHelpers.lua] + + + [03 ProductivityHelpers.lua] + + + Returns the display aspect ratio. + Returns the name of the currently connected server. [02 Utilities.lua] Returns a path to the current songs background. + + [03 Gameplay.lua] + Returns the theme's aspect ratio. + + [03 ThemePrefs.lua] (Alias for .) + + + Returns the current Timing difficulty. + + + [04 Scoring.lua] "Retrieve the amount of taps/holds/rolls involved." Used in some scoring formulas. + [03 UserPreferences2.lua] Themer-facing function for getting a user preference. @@ -140,9 +204,38 @@ [03 UserPreferences2.lua] Themer-facing function for getting a user preference as a number. + + [03 HSV.lua] Returns the color's alpha if it has any, otherwise returns 1. + + + [03 Gameplay.lua] Returns the value to start showing the combo at. + + + [03 Gameplay.lua] Returns true if you need to step on hold heads to activate them. + + + [03 Gameplay.lua] Returns 0 in pump mode, TimingWindowSecondsHold preference value in any other game mode. + Returns the current hour. + + [03 HSV.lua] Converts a color from HSV values to something StepMania can understand. + hue is from 0-360, saturation and value are 0..1 + + + [03 HSV.lua] Converts a color from HSV values with alpha to something StepMania can understand. + hue is from 0-360, saturation, value, and alpha are 0..1 + + + [03 HSV.lua] "Converts a set of HSV values to a color." + + + [03 HSV.lua] "Takes in a normal color and returns the hex representation. (Adapted from code in LuaBit)" + + + [03 HSV.lua] Changes the hue of the input color. + [03 ThemePrefs.lua] Initializes various user preferences. @@ -206,6 +299,9 @@ Returns the current Minute. + + [03 Gameplay.lua] Returns the value to start showing the miss combo at. + Returns the current month of the year. @@ -245,6 +341,9 @@ [02 Utilities.lua] Round a number. + + [03 HSV.lua] Modifies the saturation of the specified color + [03 Gameplay.lua] Returns the primary ScoreKeeper class to use. @@ -275,6 +374,9 @@ [03 Gameplay.lua] (soon to be deprecated) Returns a list of codes to use on ScreenSelectProfile. + + [02 Serialize.lua] Serialize the table t. + [03 EnvUtils2.lua] Sets the value of name to value in the Env table. @@ -367,9 +469,16 @@ + + Returns the for the file at sPath. + Returns true if sClassName is a registered Class. + + Loads all commands and sets X and Y for the specified Actor. + + @@ -414,6 +523,20 @@ + + Returns true if the type of v is sType. + + + Flushes log files to disk. + + + + Tries to read the file at sPath. If successful, it returns the file's contents. + If unsuccessful, it returns two values: nil and "error". + + + Calls func(...) with two LuaThreadVariables set, and returns the return values of func(). + Writes sString to log.txt. Aliased by . @@ -422,9 +545,6 @@ Writes sString to info.txt and log.txt as a warning. Aliased by . - - Flushes log files to disk. - @@ -563,7 +683,21 @@ [02 Actor.lua] - [02 Actor.lua] Centers an Actor. + [02 Actor.lua] Centers an Actor on the screen. (equivalent to x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y) + + + [03 ProductivityHelpers.lua] Centers an Actor on the X axis. (equivalent to x,SCREEN_CENTER_X) + + + [03 ProductivityHelpers.lua] Centers an Actor on the y axis. (equivalent to y,SCREEN_CENTER_Y) + + + Determines if the z-buffer should be cleared or not. + + + [02 Actor.lua] Combines multiple interpolators for complex tweens. tweens + can either be a string like "linear,0.25,accelerate,0.75" or + a table with tween information { {Type="linear", Percent=0.25, Bezier=nil}, {Type="accelerate", Percent=0.75, Bezier=nil} } Crops percent of the Actor from the bottom, where percent is in the range 0..1. @@ -856,6 +990,9 @@ Stops any effect the Actor has. + + Stops any tweening. + Stretches the Actor to a rectangle of a specific size. @@ -880,6 +1017,12 @@ Set the z position of the Actor to zPos. + + Sets the z bias to fBias. + + + Enables/disables z-buffer depending on bUse. + Zooms the Actor to zoom scale. @@ -901,19 +1044,19 @@ Zooms the Actor to zoom scale on the Z axis. + + Sets the z testing mode to write on pass if true, turns it off if false + + + Sets the z testing mode to testMode. + + + Sets z writing to true or false based on bWrite. + [02 Actor.lua] - - [02 Actor.lua] Centers an Actor on the screen. (equivalent to x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y) - - - [03 ProductivityHelpers.lua] Centers an Actor on the X axis. (equivalent to x,SCREEN_CENTER_X) - - - [03 ProductivityHelpers.lua] Centers an Actor on the y axis. (equivalent to y,SCREEN_CENTER_Y) - [02 Actor.lua] Stretches an Actor to cover the screen. (equivalent to stretchto,0,0,SCREEN_WIDTH,SCREEN_HEIGHT) @@ -1166,7 +1309,7 @@ Loads the card image from the specified Character. - + Loads the banner from the cache based on sPath (typically or ). Loads a Banner from a specified Course. @@ -1455,6 +1598,9 @@ Returns the MD5 hash for s. + + Returns the SHA-1 hash for the file at sPath. + Returns the SHA-1 hash for s. @@ -2007,6 +2153,9 @@ + + Changes the player's life by iNumLives. (Negative values subtract lives.) + Returns the number of lives remaining. @@ -2707,7 +2856,9 @@ - + + Returns the Profile for the specified profile ID. + @@ -2729,6 +2880,9 @@ Returns true if Song s has never been played before (according to the machine profile). + + Returns true if pn's Profile was loaded from a memory card. + Returns true if the last load of player pn's profile was a LastGood copy of the profile. @@ -2864,12 +3018,21 @@ Returns the name of the previous Screen. + + Returns the ScreenType for this Screen. + Locks input for f seconds. + + [02 Other.lua] Gets a metric from the current Screen. + Posts a message with the text sScreenMsg to the Screen. + + [02 Other.lua] Gets a string from the current Screen in the current language. + @@ -3340,6 +3503,9 @@ Load the song banner texture at sPath. + + [02 Sprite.lua] Loads the background from the current Song or the first Trail entry. + [02 Sprite.lua] Load the texture for song's background. @@ -3352,6 +3518,9 @@ Set the to mode. + + Sets the number of seconds into the animation to fSeconds. + Set the texture to texture. @@ -3797,7 +3966,9 @@ Returns the UnlockEntry index to celebrate. - + + Sets the preferred Song/Course to the specified sUnlockEntryID + Unlocks an entry by ID. From 3deecadc845af41ebe372fa20ee291bf5bc2199e Mon Sep 17 00:00:00 2001 From: AJ Kelly Date: Mon, 4 Jul 2011 16:01:52 -0500 Subject: [PATCH 19/39] more luadocs --- Docs/Luadoc/LuaDocumentation.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index edad01dcee..c2b6635ac0 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -338,6 +338,9 @@ [03 UserPreferences2.lua] (internal) Reads the specified user preference from its config file. + + Sends the current style to the server. + [02 Utilities.lua] Round a number. @@ -347,6 +350,12 @@ [03 Gameplay.lua] Returns the primary ScoreKeeper class to use. + + [00 alias.lua, 02 Other.lua] alias for . + + + [00 alias.lua, 02 Other.lua] alias for . + Returns the current second. @@ -422,6 +431,12 @@ [01 base.lua] Alias for lua.GetThreadVariable. + + Returns the current version's build date. + + + Returns the current version's build time. + [00 init.lua] Alias for . From 5ea7adad665c4a2e4622f949f193fd5e8dec4c5d Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Mon, 4 Jul 2011 17:30:36 -0400 Subject: [PATCH 20/39] Add routine helper: switch notes' player. --- Docs/Changelog_sm5.txt | 6 ++++++ Themes/_fallback/Languages/en.ini | 1 + src/ScreenEdit.cpp | 25 +++++++++++++++++++++++++ src/ScreenEdit.h | 1 + 4 files changed, 33 insertions(+) diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index a9d42a6c3b..a09899a588 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -8,6 +8,12 @@ ________________________________________________________________________________ StepMania 5.0 ????????? | 20110??? -------------------------------------------------------------------------------- +2011/07/04 +---------- +* [ScreenEdit] Add a function to switch the notes the routine players have to + hit. In simple terms, Player 1's notes are now Player 2's and vice~versa. + Check it out in the Alter Menu. [Wolfman2000] + 2011/07/03 ---------- * [ScreenEdit] Fix a crash if one tries to remove an attack that doesn't diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini index adbb6deadc..7a46bb0da3 100644 --- a/Themes/_fallback/Languages/en.ini +++ b/Themes/_fallback/Languages/en.ini @@ -914,6 +914,7 @@ Insert=Insert Insert Credit=Insert Credit Insert beat and shift down=Insert beat and shift down Insert Entry=Insert Entry +Invert notes' player=Invert player notes (routine only) Jumps=Jumps Key Joy Mappings=Config Key/Joy Mappings Language=Language diff --git a/src/ScreenEdit.cpp b/src/ScreenEdit.cpp index a1af3713a6..e5d049f605 100644 --- a/src/ScreenEdit.cpp +++ b/src/ScreenEdit.cpp @@ -566,6 +566,8 @@ static MenuDef g_AlterMenu( MenuRowDef(ScreenEdit::convert_to_warp, "Convert selection to warp", true, EditMode_Full, true, true, 0, NULL ), MenuRowDef(ScreenEdit::convert_to_fake, "Convert selection to fake", true, + EditMode_Full, true, true, 0, NULL ), + MenuRowDef(ScreenEdit::routine_invert_notes, "Invert notes' player", true, EditMode_Full, true, true, 0, NULL ) ); @@ -1757,6 +1759,7 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB ) } else { + g_AlterMenu.rows[routine_invert_notes].bEnabled = (m_InputPlayerNumber != PLAYER_INVALID); EditMiniMenu(&g_AlterMenu, SM_BackFromAlterMenu); } break; @@ -4057,6 +4060,28 @@ void ScreenEdit::HandleAlterMenuChoice(AlterMenuChoice c, const vector &iAn SetDirty(true); break; } + case routine_invert_notes: + { + NoteData &nd = this->m_NoteDataEdit; + NoteField &nf = this->m_NoteFieldEdit; + FOREACH_NONEMPTY_ROW_ALL_TRACKS_RANGE(nd, r, + nf.m_iBeginMarker, + nf.m_iEndMarker) + { + for (int t = 0; t < nd.GetNumTracks(); t++) + { + const TapNote &tn = nd.GetTapNote(t, r); + if (tn.type != TapNote::empty) + { + TapNote nTap = tn; + nTap.pn = (tn.pn == PLAYER_1 ? + PLAYER_2 : PLAYER_1); + m_NoteDataEdit.SetTapNote(t, r, nTap); + } + } + } + break; + } } diff --git a/src/ScreenEdit.h b/src/ScreenEdit.h index a2392a83e6..283a19e631 100644 --- a/src/ScreenEdit.h +++ b/src/ScreenEdit.h @@ -407,6 +407,7 @@ public: convert_to_delay, convert_to_warp, convert_to_fake, + routine_invert_notes, NUM_ALTER_MENU_CHOICES }; From bcb8e38b53c584d3aae63bf9c47d422369257e4c Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Mon, 4 Jul 2011 17:47:57 -0400 Subject: [PATCH 21/39] doxygen --- src/ScreenEdit.h | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/ScreenEdit.h b/src/ScreenEdit.h index 283a19e631..7b5b7b2aeb 100644 --- a/src/ScreenEdit.h +++ b/src/ScreenEdit.h @@ -390,24 +390,25 @@ public: void HandleMainMenuChoice( MainMenuChoice c ) { const vector v; HandleMainMenuChoice( c, v ); } MainMenuChoice m_CurrentAction; + /** @brief How does one alter a selection of NoteData? */ enum AlterMenuChoice { - cut, - copy, - clear, - quantize, - turn, - transform, - alter, - tempo, - play, - record, - preview_designation, - convert_to_pause, - convert_to_delay, - convert_to_warp, - convert_to_fake, - routine_invert_notes, + cut, /**< Cut the notes. */ + copy, /**< Copy the notes. */ + clear, /**< Erase the notes, without putting them in the clipboard. */ + quantize, /**< Sync the notes to an exact level. */ + turn, /**< Rotate the notes. */ + transform, /**< Activate a specific mod. */ + alter, /**< Perform other transformations. */ + tempo, /**< Modify the tempo of the notes. */ + play, /**< Play the notes in the range. */ + record, /**< Record new notes in the range. */ + preview_designation, /**< Set the area as the music preview. */ + convert_to_pause, /**< Convert the range into a StopSegment. */ + convert_to_delay, /**< Convert the range into a DelaySegment. */ + convert_to_warp, /**< Convert the range into a WarpSegment. */ + convert_to_fake, /**< Convert the range into a FakeSegment. */ + routine_invert_notes, /**< Switch which player hits the note. */ NUM_ALTER_MENU_CHOICES }; From 0455ffaa360472f8cad7fcd42e9b7e45b52f3cd6 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Mon, 4 Jul 2011 18:15:21 -0400 Subject: [PATCH 22/39] Add two routine mirroring functions. I think the Alter Menu is getting a bit big. Maybe I should borrow from the help menus...they scroll nicely. --- Docs/Changelog_sm5.txt | 5 +++ Themes/_fallback/Languages/en.ini | 2 ++ src/ScreenEdit.cpp | 60 +++++++++++++++++++++++++++++-- src/ScreenEdit.h | 2 ++ 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index a09899a588..f7fc0cb694 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -13,6 +13,11 @@ StepMania 5.0 ????????? | 20110??? * [ScreenEdit] Add a function to switch the notes the routine players have to hit. In simple terms, Player 1's notes are now Player 2's and vice~versa. Check it out in the Alter Menu. [Wolfman2000] +* [ScreenEdit] Add two routine mirroring functions. Now you can build sections + of a chart for one player, and mirror the effect for the other player when + finished. For Pump players, it is not a straight mirror, but is more akin + to what is found via normal routine charts. In other words, you'll be happy. + Check it out in the Alter Menu. [Wolfman2000] 2011/07/03 ---------- diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini index 7a46bb0da3..3029e65fda 100644 --- a/Themes/_fallback/Languages/en.ini +++ b/Themes/_fallback/Languages/en.ini @@ -932,6 +932,8 @@ MenuTimer=Menu Timer Meter=Meter Min BPM=Min Specified BPM Mines=Mines +Mirror Player 1 to 2=Mirror P1's notes to P2 (routine only) +Mirror Player 2 to 1=Mirror P2's notes to P1 (routine only) MoveRandomToEnd=Random At End More Options=More Options MovieColorDepth=Movie Color diff --git a/src/ScreenEdit.cpp b/src/ScreenEdit.cpp index e5d049f605..ecf52032b2 100644 --- a/src/ScreenEdit.cpp +++ b/src/ScreenEdit.cpp @@ -568,6 +568,10 @@ static MenuDef g_AlterMenu( MenuRowDef(ScreenEdit::convert_to_fake, "Convert selection to fake", true, EditMode_Full, true, true, 0, NULL ), MenuRowDef(ScreenEdit::routine_invert_notes, "Invert notes' player", true, + EditMode_Full, true, true, 0, NULL ), + MenuRowDef(ScreenEdit::routine_mirror_1_to_2, "Mirror Player 1 to 2", true, + EditMode_Full, true, true, 0, NULL ), + MenuRowDef(ScreenEdit::routine_mirror_2_to_1, "Mirror Player 2 to 1", true, EditMode_Full, true, true, 0, NULL ) ); @@ -1759,7 +1763,10 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB ) } else { - g_AlterMenu.rows[routine_invert_notes].bEnabled = (m_InputPlayerNumber != PLAYER_INVALID); + bool isRoutine = (m_InputPlayerNumber != PLAYER_INVALID); + g_AlterMenu.rows[routine_invert_notes].bEnabled = isRoutine; + g_AlterMenu.rows[routine_mirror_1_to_2].bEnabled = isRoutine; + g_AlterMenu.rows[routine_mirror_2_to_1].bEnabled = isRoutine; EditMiniMenu(&g_AlterMenu, SM_BackFromAlterMenu); } break; @@ -4082,7 +4089,56 @@ void ScreenEdit::HandleAlterMenuChoice(AlterMenuChoice c, const vector &iAn } break; } - + case routine_mirror_1_to_2: + case routine_mirror_2_to_1: + { + PlayerNumber oPN = (c == routine_mirror_1_to_2 ? + PLAYER_1 : PLAYER_2); + PlayerNumber nPN = (c == routine_mirror_1_to_2 ? + PLAYER_2 : PLAYER_1); + int nTrack = -1; + NoteData &nd = this->m_NoteDataEdit; + NoteField &nf = this->m_NoteFieldEdit; + int tracks = nd.GetNumTracks(); + FOREACH_NONEMPTY_ROW_ALL_TRACKS_RANGE(nd, r, + nf.m_iBeginMarker, + nf.m_iEndMarker) + { + for (int t = 0; t < tracks; t++) + { + const TapNote &tn = nd.GetTapNote(t, r); + if (tn.type != TapNote::empty && tn.pn == oPN) + { + TapNote nTap = tn; + nTap.pn = nPN; + StepsType curType = GAMESTATE->m_pCurSteps[PLAYER_1]->m_StepsType; + if (curType == StepsType_dance_routine) + { + nTrack = tracks - t - 1; + } + else if (curType == StepsType_pump_routine) + { + switch (t) + { + case 0: nTrack = 8; break; + case 1: nTrack = 9; break; + case 2: nTrack = 7; break; + case 3: nTrack = 5; break; + case 4: nTrack = 6; break; + case 5: nTrack = 3; break; + case 6: nTrack = 4; break; + case 7: nTrack = 2; break; + case 8: nTrack = 0; break; + case 9: nTrack = 1; break; + default: FAIL_M(ssprintf("Invalid column %d for pump-routine", t)); break; + } + } + m_NoteDataEdit.SetTapNote(nTrack, r, nTap); + } + } + } + break; + } } } diff --git a/src/ScreenEdit.h b/src/ScreenEdit.h index 7b5b7b2aeb..38f0a4bbad 100644 --- a/src/ScreenEdit.h +++ b/src/ScreenEdit.h @@ -409,6 +409,8 @@ public: convert_to_warp, /**< Convert the range into a WarpSegment. */ convert_to_fake, /**< Convert the range into a FakeSegment. */ routine_invert_notes, /**< Switch which player hits the note. */ + routine_mirror_1_to_2, /**< Mirror Player 1's notes for Player 2. */ + routine_mirror_2_to_1, /**< Mirror Player 2's notes for Player 1. */ NUM_ALTER_MENU_CHOICES }; From e19a2109268016073d7b93effff06ab28ec61838 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Mon, 4 Jul 2011 21:22:05 -0400 Subject: [PATCH 23/39] I don't like shadowed variables. --- src/TimingSegments.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/TimingSegments.cpp b/src/TimingSegments.cpp index 0d241da25d..304623c285 100644 --- a/src/TimingSegments.cpp +++ b/src/TimingSegments.cpp @@ -250,18 +250,24 @@ void SpeedSegment::SetUnit(const int i) this->unit = static_cast(i); } -void SpeedSegment::Scale( int start, int length, int newLength ) +void SpeedSegment::Scale( int start, int oldLength, int newLength ) { if( GetUnit() == 0 ) { // XXX: this function is duplicated, there should be a better way float startBeat = GetBeat(); float endBeat = startBeat + GetLength(); - float newStartBeat = ScalePosition( NoteRowToBeat(start), NoteRowToBeat(length), NoteRowToBeat(newLength), startBeat ); - float newEndBeat = ScalePosition( NoteRowToBeat(start), NoteRowToBeat(length), NoteRowToBeat(newLength), endBeat ); + float newStartBeat = ScalePosition(NoteRowToBeat(start), + NoteRowToBeat(oldLength), + NoteRowToBeat(newLength), + startBeat); + float newEndBeat = ScalePosition(NoteRowToBeat(start), + NoteRowToBeat(oldLength), + NoteRowToBeat(newLength), + endBeat); SetLength( newEndBeat - newStartBeat ); } - TimingSegment::Scale( start, length, newLength ); + TimingSegment::Scale( start, oldLength, newLength ); } bool SpeedSegment::operator<( const SpeedSegment &other ) const From 82aa997719cbb2fce8dc7761e60d43d48da5a9b0 Mon Sep 17 00:00:00 2001 From: AJ Kelly Date: Mon, 4 Jul 2011 22:30:17 -0500 Subject: [PATCH 24/39] more lua docs update --- Docs/Luadoc/LuaDocumentation.xml | 67 +++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index c2b6635ac0..d1d6f53eda 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -302,6 +302,9 @@ [03 Gameplay.lua] Returns the value to start showing the miss combo at. + + Creates a module. See the Lua manual for more details. + Returns the current month of the year. @@ -311,6 +314,20 @@ Returns Month m as a string. + + "Allows a program to traverse all fields of a table. Its first argument is a + table and its second argument is an index in this table. + next returns the next index of the table and its associated value." + See the Lua manual for more details. + + + [03 ThemePrefs.lua] Returns a Lua option row for ProTiming. + + + "Returns three values: the function, the table t, and nil, + so that the construction for k,v in pairs(t) do body end + will iterate over all key–value pairs of table t." + [03 ProductivityHelpers.lua] Converts a PlayerNumber into a short string (e.g. "P1", "P2"). @@ -329,6 +346,16 @@ Returns the product version. + + "Checks whether v1 is equal to v2, without invoking any metamethod." + + + "Gets the real value of t[index], without invoking any metamethod." + + + "Sets the real value of t[index] to value, without invoking any metamethod." + The modified t is then returned. + [02 ActorDef.lua] @@ -341,6 +368,9 @@ Sends the current style to the server. + + Loads the specified module. See the Lua manual for more information. + [02 Utilities.lua] Round a number. @@ -377,6 +407,11 @@ Converts fSecs to Minutes:Seconds.Milliseconds format using two digits for each section except Milliseconds (uses 3). + + "If index is a number, returns all arguments after argument + number index. Otherwise, index must be the string + "#", and [it] returns the total number of extra arguments it received." + [02 Branches.lua] Determines the correct music/course selection screen to use and returns it. @@ -410,6 +445,12 @@ [02 ActorDef.lua] + + [02 Utilities.lua] Returns a shuffled version of t. + + + [02 Utilities.lua] Returns a slice of the specified table of size num. + [02 Utilities.lua] Look up each value in a table, returning a table with the resulting strings. @@ -419,12 +460,27 @@ [03 ProductivityHelpers.lua] Converts a string or number to a bool. + + Tries to convert e to a number. Returns nil if + it can't convert the input to a number. (base is optional.) + + + Converts e to a string. + [02 Enum.lua] Returns a string representing an enum starting from '_'. For example, passing PlayerNumber_P1 to this function will return P1. [00 init.lua] Alias for . + + Returns the type of the object as a string. See the Lua manual for valid return values. + + + "Returns the elements from the given table. + This function is equivalent to return list[i], list[i+1], ···, list[j]" + (i and j are optional; "by default, i is 1 and j is the length of the list.") + Returns a string with characters escaped for URLs. (e.g. a space becomes '%20') @@ -443,24 +499,25 @@ [04 WidescreenHelpers.lua] Depending on the screen width, scales between ar43 (4:3; 640px) and ar169 (16:9; 854px). + + [02 Utilities.lua] + [02 ActorDef.lua] Wraps the children in an ActorFrame. [04 FileUtils.lua] Writes buf to the file at path. + + [03 GamePreferences.lua] + [03 UserPreferences2.lua] (internal) Writes user preference prefName to its config file with value being tostring'd. Returns the current year. - - - - [03 ThemePrefs.lua] Returns a Lua option row for ProTiming. - [03 ThemePrefs.lua] Returns a Lua option row for toggling AutoSetStyle. From 7f41c184bf31ad412118af44e9882ff92d417bd1 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Mon, 4 Jul 2011 23:57:55 -0400 Subject: [PATCH 25/39] Restored dance-couple and pump-couple editing. --- Docs/Changelog_sm5.txt | 5 +++++ src/GameManager.cpp | 29 +++++++++++++++++------------ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index f7fc0cb694..a57cfbb072 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -8,6 +8,11 @@ ________________________________________________________________________________ StepMania 5.0 ????????? | 20110??? -------------------------------------------------------------------------------- +2011/07/05 +---------- +* [ScreenEdit] Restore dance-couple and pump-couple for editing purposes. + Saving should still work, but this was never tested yet. [Wolfman2000] + 2011/07/04 ---------- * [ScreenEdit] Add a function to switch the notes the routine players have to diff --git a/src/GameManager.cpp b/src/GameManager.cpp index c974491c31..a9178b5433 100644 --- a/src/GameManager.cpp +++ b/src/GameManager.cpp @@ -332,7 +332,7 @@ static const Style g_Style_Dance_Couple_Edit = false, // m_bUsedForHowToPlay "couple-edit", // m_szName StepsType_dance_couple, // m_StepsType - StyleType_OnePlayerOneSide, // m_StyleType + StyleType_OnePlayerTwoSides, // m_StyleType 8, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; { // PLAYER_1 @@ -357,8 +357,8 @@ static const Style g_Style_Dance_Couple_Edit = }, }, { // m_iInputColumn[NUM_GameController][NUM_GameButton] - { 0, 1, 2, 3, 4, 5, 6, 7, Style::END_MAPPING }, - { 0, 1, 2, 3, 4, 5, 6, 7, Style::END_MAPPING }, + { 0, 3, 2, 1, Style::END_MAPPING }, + { 4, 7, 6, 5, Style::END_MAPPING }, }, { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7 @@ -770,7 +770,7 @@ static const Style g_Style_Pump_Couple_Edit = false, // m_bUsedForHowToPlay "couple-edit", // m_szName StepsType_pump_couple, // m_StepsType - StyleType_OnePlayerOneSide, // m_StyleType + StyleType_OnePlayerTwoSides, // m_StyleType 10, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; { // PLAYER_1 @@ -786,19 +786,24 @@ static const Style g_Style_Pump_Couple_Edit = { TRACK_10, +PUMP_COL_SPACING*5.0f+4, NULL }, }, { // PLAYER_2 - { TRACK_1, -PUMP_COL_SPACING*2.0f, NULL }, - { TRACK_2, -PUMP_COL_SPACING*1.0f, NULL }, - { TRACK_3, +PUMP_COL_SPACING*0.0f, NULL }, - { TRACK_4, +PUMP_COL_SPACING*1.0f, NULL }, - { TRACK_5, +PUMP_COL_SPACING*2.0f, NULL }, + { TRACK_1, -PUMP_COL_SPACING*5.0f-4, NULL }, + { TRACK_2, -PUMP_COL_SPACING*4.0f-4, NULL }, + { TRACK_3, -PUMP_COL_SPACING*3.0f-4, NULL }, + { TRACK_4, -PUMP_COL_SPACING*2.0f-4, NULL }, + { TRACK_5, -PUMP_COL_SPACING*1.0f-4, NULL }, + { TRACK_6, +PUMP_COL_SPACING*1.0f+4, NULL }, + { TRACK_7, +PUMP_COL_SPACING*2.0f+4, NULL }, + { TRACK_8, +PUMP_COL_SPACING*3.0f+4, NULL }, + { TRACK_9, +PUMP_COL_SPACING*4.0f+4, NULL }, + { TRACK_10, +PUMP_COL_SPACING*5.0f+4, NULL }, }, }, { // m_iInputColumn[NUM_GameController][NUM_GameButton] - { 1, 3, 2, 0, 4, 6, 8, 7, 5, 9, Style::END_MAPPING }, - { 1, 3, 2, 0, 4, 6, 8, 7, 5, 9, Style::END_MAPPING }, + { 1, 3, 2, 0, 4, Style::END_MAPPING }, + { 6, 8, 7, 5, 9, Style::END_MAPPING }, }, { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; - 2,1,3,0,4 + 2,1,3,0,4, 2+5,1+5,3+5,0+5,4+5 }, false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper From 4b092229de14610e675bb7700b95bd15108bc75d Mon Sep 17 00:00:00 2001 From: Colby Klein Date: Tue, 5 Jul 2011 10:52:39 -0700 Subject: [PATCH 26/39] Attempt to switch tiny and mini back to their original state (why was it changed?). This should fix mod scripts. --- src/Player.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Player.cpp b/src/Player.cpp index fd3a2202e0..aa883c59c1 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -1488,7 +1488,7 @@ void Player::DrawPrimitives() float fTiltDegrees = SCALE(fTilt,-1.f,+1.f,+30,-30) * (bReverse?-1:1); - float fZoom = SCALE( m_pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects[PlayerOptions::EFFECT_TINY], 0.f, 1.f, 1.f, 0.5f ); + float fZoom = SCALE( m_pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects[PlayerOptions::EFFECT_MINI], 0.f, 1.f, 1.f, 0.5f ); if( fTilt > 0 ) fZoom *= SCALE( fTilt, 0.f, 1.f, 1.f, 0.9f ); else From ae8d923bec7094864fdd4afd2b9b4cfd70b3ba30 Mon Sep 17 00:00:00 2001 From: Colby Klein Date: Tue, 5 Jul 2011 11:17:12 -0700 Subject: [PATCH 27/39] Another attempt at Mini <-> Tiny. This one should be much closer or working. --- Themes/_fallback/metrics.ini | 4 ++-- .../Graphics/CombinedLifeMeterTug separator.redir | 2 +- src/ArrowEffects.cpp | 12 ++++++------ src/Player.cpp | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index 03e7f4adbb..bf87efc659 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -200,8 +200,8 @@ DrunkOffsetFrequency=10 DrunkArrowMagnitude=0.5 BeatOffsetHeight=15 BeatPIHeight=2 -MiniPercentBase=0.5 -MiniPercentGate=1 +TinyPercentBase=0.5 +TinyPercentGate=1 DizzyHoldHeads=false QuantizeArrowYPosition=false diff --git a/Themes/default/Graphics/CombinedLifeMeterTug separator.redir b/Themes/default/Graphics/CombinedLifeMeterTug separator.redir index 04b2ead777..65de2f434b 100644 --- a/Themes/default/Graphics/CombinedLifeMeterTug separator.redir +++ b/Themes/default/Graphics/CombinedLifeMeterTug separator.redir @@ -1 +1 @@ -_blank \ No newline at end of file +_CombinedLifeMeterTug separator \ No newline at end of file diff --git a/src/ArrowEffects.cpp b/src/ArrowEffects.cpp index 5b6dd64b08..93b4f9f178 100644 --- a/src/ArrowEffects.cpp +++ b/src/ArrowEffects.cpp @@ -56,8 +56,8 @@ static ThemeMetric DRUNK_OFFSET_FREQUENCY( "ArrowEffects", "DrunkOffsetFr 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 TINY_PERCENT_BASE( "ArrowEffects", "TinyPercentBase" ); +static ThemeMetric TINY_PERCENT_GATE( "ArrowEffects", "TinyPercentGate" ); static ThemeMetric DIZZY_HOLD_HEADS( "ArrowEffects", "DizzyHoldHeads" ); float ArrowGetPercentVisible( const PlayerState* pPlayerState, float fYPosWithoutReverse ); @@ -489,12 +489,12 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float fPixelOffsetFromCenter += pCols[iColNum].fXOffset; - if( fEffects[PlayerOptions::EFFECT_MINI] != 0 ) + if( fEffects[PlayerOptions::EFFECT_TINY] != 0 ) { // Allow Mini to pull tracks together, but not to push them apart. - float fMiniPercent = fEffects[PlayerOptions::EFFECT_MINI]; - fMiniPercent = min( powf(MINI_PERCENT_BASE, fMiniPercent), (float)MINI_PERCENT_GATE ); - fPixelOffsetFromCenter *= fMiniPercent; + float fTinyPercent = fEffects[PlayerOptions::EFFECT_TINY]; + fTinyPercent = min( powf(TINY_PERCENT_BASE, fTinyPercent), (float)TINY_PERCENT_GATE ); + fPixelOffsetFromCenter *= fTinyPercent; } return fPixelOffsetFromCenter; diff --git a/src/Player.cpp b/src/Player.cpp index aa883c59c1..5dfed3e310 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -867,7 +867,7 @@ void Player::Update( float fDeltaTime ) Actor::TweenState::MakeWeightedAverage( m_pActorWithComboPosition->DestTweenState(), ts1, ts2, fPercentCentered ); } - float fNoteFieldZoom = 1 - fTinyPercent*0.5f; + float fNoteFieldZoom = 1 - fMiniPercent*0.5f; if( m_pNoteField ) m_pNoteField->SetZoom( fNoteFieldZoom ); if( m_pActorWithJudgmentPosition != NULL ) From d45eb348237afde1afc001caaa18bc4cd573fc8e Mon Sep 17 00:00:00 2001 From: Colby Klein Date: Tue, 5 Jul 2011 11:27:43 -0700 Subject: [PATCH 28/39] Missed one. --- src/NoteField.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NoteField.cpp b/src/NoteField.cpp index e97ca24225..3acfb3ea5e 100644 --- a/src/NoteField.cpp +++ b/src/NoteField.cpp @@ -817,7 +817,7 @@ void NoteField::DrawPrimitives() float fDrawScale = 1; fDrawScale *= 1 + 0.5f * fabsf( current_po.m_fPerspectiveTilt ); - fDrawScale *= 1 + fabsf( current_po.m_fEffects[PlayerOptions::EFFECT_TINY] ); + fDrawScale *= 1 + fabsf( current_po.m_fEffects[PlayerOptions::EFFECT_MINI] ); iDrawDistanceAfterTargetsPixels = (int)(iDrawDistanceAfterTargetsPixels * fDrawScale); iDrawDistanceBeforeTargetsPixels = (int)(iDrawDistanceBeforeTargetsPixels * fDrawScale); From ba945ce313b9611541db16795d28e0275ad67ca1 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Tue, 5 Jul 2011 14:28:35 -0400 Subject: [PATCH 29/39] Well, may as well offer both mini and tiny. --- Themes/_fallback/metrics.ini | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index bf87efc659..bc6dac90c9 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -2199,22 +2199,23 @@ Accel,5="mod,boomerang;name,Boomerang" # Accel,5="mod,expand;name,Expand" # Accel,6="mod,boomerang;name,Boomerang" -Effect="14;selectmultiple" +Effect="15;selectmultiple" EffectDefault="mod,no drunk,no dizzy,,no twirl,no roll,no confusion,no mini,no tiny,no flip,no invert,no tornado,no tipsy,no bumpy,no beat,no xmode" Effect,1="mod,drunk;name,Drunk" Effect,2="mod,dizzy;name,Dizzy" Effect,3="mod,twirl;name,Twirl" Effect,4="mod,roll;name,Roll" Effect,5="mod,confusion;name,Confusion" -Effect,6="mod,tiny;name,Tiny" -Effect,7="mod,-100% mini;name,Big" -Effect,8="mod,flip;name,Flip" -Effect,9="mod,invert;name,Invert" -Effect,10="mod,tornado;name,Tornado" -Effect,11="mod,tipsy;name,Tipsy" -Effect,12="mod,bumpy;name,Bumpy" -Effect,13="mod,beat;name,Beat" -Effect,14="mod,45% xmode;name,XMode" +Effect,6="mod,mini;name,Mini" +Effect,7="mod,tiny;name,Tiny" +Effect,8="mod,-100% mini;name,Big" +Effect,9="mod,flip;name,Flip" +Effect,10="mod,invert;name,Invert" +Effect,11="mod,tornado;name,Tornado" +Effect,12="mod,tipsy;name,Tipsy" +Effect,13="mod,bumpy;name,Bumpy" +Effect,14="mod,beat;name,Beat" +Effect,15="mod,45% xmode;name,XMode" EffectsReceptor="selectmultiple" EffectsReceptorDefault="" From 9ffc253441db707aafd11069e5742aa73456ece5 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Tue, 5 Jul 2011 14:44:22 -0400 Subject: [PATCH 30/39] Make GetBannerPath consistent with Background. --- src/Song.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Song.cpp b/src/Song.cpp index 87eaf91058..637790165f 100644 --- a/src/Song.cpp +++ b/src/Song.cpp @@ -1551,7 +1551,15 @@ public: } static int GetSongDir( T* p, lua_State *L ) { lua_pushstring(L, p->GetSongDir() ); return 1; } static int GetMusicPath( T* p, lua_State *L ) { RString s = p->GetMusicPath(); if( s.empty() ) return 0; lua_pushstring(L, s); return 1; } - static int GetBannerPath( T* p, lua_State *L ) { RString s = p->GetBannerPath(); if( s.empty() ) return 0; LuaHelpers::Push(L, s); return 1; } + static int GetBannerPath( T* p, lua_State *L ) + { + RString s = p->GetBannerPath(); + if( !s.empty() ) + lua_pushstring(L, s); + else + lua_pushnil(L); + return 1; + } static int GetBackgroundPath( T* p, lua_State *L ) { RString s = p->GetBackgroundPath(); From f4c2c7f0bea89368fb394c58b32d6f8ed8a30863 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Tue, 5 Jul 2011 14:54:01 -0400 Subject: [PATCH 31/39] Reduce horizontal scrolling. Other small fixes. --- src/Song.cpp | 191 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 159 insertions(+), 32 deletions(-) diff --git a/src/Song.cpp b/src/Song.cpp index 637790165f..8e751f3b62 100644 --- a/src/Song.cpp +++ b/src/Song.cpp @@ -1526,16 +1526,46 @@ bool Song::IsMarathon() const class LunaSong: public Luna { public: - static int GetDisplayFullTitle( T* p, lua_State *L ) { lua_pushstring(L, p->GetDisplayFullTitle() ); return 1; } - static int GetTranslitFullTitle( T* p, lua_State *L ) { lua_pushstring(L, p->GetTranslitFullTitle() ); return 1; } - static int GetDisplayMainTitle( T* p, lua_State *L ) { lua_pushstring(L, p->GetDisplayMainTitle() ); return 1; } - static int GetTranslitMainTitle( T* p, lua_State *L ) { lua_pushstring(L, p->GetTranslitMainTitle() ); return 1; } - static int GetDisplaySubTitle( T* p, lua_State *L ) { lua_pushstring(L, p->GetDisplaySubTitle() ); return 1; } - static int GetTranslitSubTitle( T* p, lua_State *L ) { lua_pushstring(L, p->GetTranslitSubTitle() ); return 1; } - static int GetDisplayArtist( T* p, lua_State *L ) { lua_pushstring(L, p->GetDisplayArtist() ); return 1; } - static int GetTranslitArtist( T* p, lua_State *L ) { lua_pushstring(L, p->GetTranslitArtist() ); return 1; } - static int GetGenre( T* p, lua_State *L ) { lua_pushstring(L, p->m_sGenre ); return 1; } - static int GetOrigin( T* p, lua_State *L ) { lua_pushstring(L, p->m_sOrigin ); return 1; } + static int GetDisplayFullTitle( T* p, lua_State *L ) + { + lua_pushstring(L, p->GetDisplayFullTitle() ); return 1; + } + static int GetTranslitFullTitle( T* p, lua_State *L ) + { + lua_pushstring(L, p->GetTranslitFullTitle() ); return 1; + } + static int GetDisplayMainTitle( T* p, lua_State *L ) + { + lua_pushstring(L, p->GetDisplayMainTitle() ); return 1; + } + static int GetTranslitMainTitle( T* p, lua_State *L ) + { + lua_pushstring(L, p->GetTranslitMainTitle() ); return 1; + } + static int GetDisplaySubTitle( T* p, lua_State *L ) + { + lua_pushstring(L, p->GetDisplaySubTitle() ); return 1; + } + static int GetTranslitSubTitle( T* p, lua_State *L ) + { + lua_pushstring(L, p->GetTranslitSubTitle() ); return 1; + } + static int GetDisplayArtist( T* p, lua_State *L ) + { + lua_pushstring(L, p->GetDisplayArtist() ); return 1; + } + static int GetTranslitArtist( T* p, lua_State *L ) + { + lua_pushstring(L, p->GetTranslitArtist() ); return 1; + } + static int GetGenre( T* p, lua_State *L ) + { + lua_pushstring(L, p->m_sGenre ); return 1; + } + static int GetOrigin( T* p, lua_State *L ) + { + lua_pushstring(L, p->m_sOrigin ); return 1; + } static int GetAllSteps( T* p, lua_State *L ) { const vector &v = p->GetAllSteps(); @@ -1549,8 +1579,20 @@ public: LuaHelpers::CreateTableFromArray( v, L ); return 1; } - static int GetSongDir( T* p, lua_State *L ) { lua_pushstring(L, p->GetSongDir() ); return 1; } - static int GetMusicPath( T* p, lua_State *L ) { RString s = p->GetMusicPath(); if( s.empty() ) return 0; lua_pushstring(L, s); return 1; } + static int GetSongDir( T* p, lua_State *L ) + { + lua_pushstring(L, p->GetSongDir() ); + return 1; + } + static int GetMusicPath( T* p, lua_State *L ) + { + RString s = p->GetMusicPath(); + if( !s.empty() ) + lua_pushstring(L, s); + else + lua_pushnil(L); + return 1; + } static int GetBannerPath( T* p, lua_State *L ) { RString s = p->GetBannerPath(); @@ -1569,15 +1611,59 @@ public: lua_pushnil(L); return 1; } - static int GetCDTitlePath( T* p, lua_State *L ) { RString s = p->GetCDTitlePath(); if( s.empty() ) return 0; LuaHelpers::Push(L, s); return 1; } - static int GetLyricsPath( T* p, lua_State *L ) { RString s = p->GetLyricsPath(); if( s.empty() ) return 0; lua_pushstring(L, s); return 1; } - static int GetSongFilePath( T* p, lua_State *L ) { lua_pushstring(L, p->GetSongFilePath() ); return 1; } - static int IsTutorial( T* p, lua_State *L ) { lua_pushboolean(L, p->IsTutorial()); return 1; } - static int IsEnabled( T* p, lua_State *L ) { lua_pushboolean(L, p->GetEnabled()); return 1; } - static int GetGroupName( T* p, lua_State *L ) { lua_pushstring(L, p->m_sGroupName); return 1; } - static int MusicLengthSeconds( T* p, lua_State *L ) { lua_pushnumber(L, p->m_fMusicLengthSeconds); return 1; } - static int IsLong( T* p, lua_State *L ) { lua_pushboolean(L, p->IsLong()); return 1; } - static int IsMarathon( T* p, lua_State *L ) { lua_pushboolean(L, p->IsMarathon()); return 1; } + static int GetCDTitlePath( T* p, lua_State *L ) + { + RString s = p->GetCDTitlePath(); + if( !s.empty() ) + lua_pushstring(L, s); + else + lua_pushnil(L); + return 1; + } + static int GetLyricsPath( T* p, lua_State *L ) + { + RString s = p->GetLyricsPath(); + if( !s.empty() ) + lua_pushstring(L, s); + else + lua_pushnil(L); + return 1; + } + static int GetSongFilePath( T* p, lua_State *L ) + { + lua_pushstring(L, p->GetSongFilePath() ); + return 1; + } + static int IsTutorial( T* p, lua_State *L ) + { + lua_pushboolean(L, p->IsTutorial()); + return 1; + } + static int IsEnabled( T* p, lua_State *L ) + { + lua_pushboolean(L, p->GetEnabled()); + return 1; + } + static int GetGroupName( T* p, lua_State *L ) + { + lua_pushstring(L, p->m_sGroupName); + return 1; + } + static int MusicLengthSeconds( T* p, lua_State *L ) + { + lua_pushnumber(L, p->m_fMusicLengthSeconds); + return 1; + } + static int IsLong( T* p, lua_State *L ) + { + lua_pushboolean(L, p->IsLong()); + return 1; + } + static int IsMarathon( T* p, lua_State *L ) + { + lua_pushboolean(L, p->IsMarathon()); + return 1; + } static int HasStepsType( T* p, lua_State *L ) { StepsType st = Enum::Check(L, 1); @@ -1591,7 +1677,8 @@ public: lua_pushboolean( L, p->HasStepsTypeAndDifficulty(st, dc) ); return 1; } - // TODO: HasStepsTypeAndDifficulty and GetOneSteps should be in a SongUtil Lua table and a method of Steps. + /* TODO: HasStepsTypeAndDifficulty and GetOneSteps should be in + * a SongUtil Lua table and a method of Steps. */ static int GetOneSteps( T* p, lua_State *L ) { StepsType st = Enum::Check(L, 1); @@ -1609,14 +1696,42 @@ public: return 1; } // has functions - static int HasMusic( T* p, lua_State *L ) { lua_pushboolean(L, p->HasMusic()); return 1; } - static int HasBanner( T* p, lua_State *L ) { lua_pushboolean(L, p->HasBanner()); return 1; } - static int HasBackground( T* p, lua_State *L ) { lua_pushboolean(L, p->HasBackground()); return 1; } - static int HasCDTitle( T* p, lua_State *L ) { lua_pushboolean(L, p->HasCDTitle()); return 1; } - static int HasBGChanges( T* p, lua_State *L ) { lua_pushboolean(L, p->HasBGChanges()); return 1; } - static int HasLyrics( T* p, lua_State *L ) { lua_pushboolean(L, p->HasLyrics()); return 1; } + static int HasMusic( T* p, lua_State *L ) + { + lua_pushboolean(L, p->HasMusic()); + return 1; + } + static int HasBanner( T* p, lua_State *L ) + { + lua_pushboolean(L, p->HasBanner()); + return 1; + } + static int HasBackground( T* p, lua_State *L ) + { + lua_pushboolean(L, p->HasBackground()); + return 1; + } + static int HasCDTitle( T* p, lua_State *L ) + { + lua_pushboolean(L, p->HasCDTitle()); + return 1; + } + static int HasBGChanges( T* p, lua_State *L ) + { + lua_pushboolean(L, p->HasBGChanges()); + return 1; + } + static int HasLyrics( T* p, lua_State *L ) + { + lua_pushboolean(L, p->HasLyrics()); + return 1; + } // functions that AJ loves - static int HasSignificantBPMChangesOrStops( T* p, lua_State *L ) { lua_pushboolean(L, p->HasSignificantBpmChangesOrStops()); return 1; } + static int HasSignificantBPMChangesOrStops( T* p, lua_State *L ) + { + lua_pushboolean(L, p->HasSignificantBpmChangesOrStops()); + return 1; + } static int HasEdits( T* p, lua_State *L ) { StepsType st = Enum::Check(L, 1); @@ -1629,8 +1744,16 @@ public: lua_pushboolean(L, p->IsEasy( st )); return 1; } - static int GetStepsSeconds( T* p, lua_State *L ) { lua_pushnumber(L, p->GetStepsSeconds()); return 1; } - static int NormallyDisplayed( T* p, lua_State *L ){ lua_pushboolean(L, p->NormallyDisplayed()); return 1; } + static int GetStepsSeconds( T* p, lua_State *L ) + { + lua_pushnumber(L, p->GetStepsSeconds()); + return 1; + } + static int NormallyDisplayed( T* p, lua_State *L ) + { + lua_pushboolean(L, p->NormallyDisplayed()); + return 1; + } static int GetFirstSecond(T* p, lua_State *L) { lua_pushnumber(L, p->GetFirstSecond()); @@ -1651,7 +1774,11 @@ public: lua_pushnumber(L, p->GetLastBeat()); return 1; } - static int HasAttacks( T* p, lua_State *L ) { lua_pushboolean(L, p->HasAttacks()); return 1; } + static int HasAttacks( T* p, lua_State *L ) + { + lua_pushboolean(L, p->HasAttacks()); + return 1; + } static int GetDisplayBpms( T* p, lua_State *L ) { DisplayBpms temp; From 0a791850d6176eee20e2f1f99c53d9d831e138b3 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Tue, 5 Jul 2011 15:01:30 -0400 Subject: [PATCH 32/39] More horizontal scrolling reduction. --- src/Song.cpp | 74 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 21 deletions(-) diff --git a/src/Song.cpp b/src/Song.cpp index 8e751f3b62..277ac16a0f 100644 --- a/src/Song.cpp +++ b/src/Song.cpp @@ -283,7 +283,11 @@ bool Song::LoadFromSongDir( RString sDir ) if( bUseCache ) { -// LOG->Trace( "Loading '%s' from cache file '%s'.", m_sSongDir.c_str(), GetCacheFilePath().c_str() ); + /* + LOG->Trace("Loading '%s' from cache file '%s'.", + m_sSongDir.c_str(), + GetCacheFilePath().c_str()); + */ SSCLoader loaderSSC; bool bLoadedFromSSC = loaderSSC.LoadFromSimfile( sCacheFilePath, *this, true ); if( !bLoadedFromSSC ) @@ -379,13 +383,13 @@ bool Song::ReloadFromSongDir( RString sDir ) FOREACH_ENUM( StepsType, i ) m_vpStepsByType[i].clear(); - // Then we copy as many Steps as possible on top of the old pointers. - // The only pointers that change are pointers to Steps that are not in the - // reverted file, which we delete, and pointers to Steps that are in the - // reverted file but not the original *this, which we create new copies of. - // We have to go through these hoops because many places assume the Steps - // pointers don't change - even though there are other ways they can change, - // such as deleting a Steps via the editor. + /* Then we copy as many Steps as possible on top of the old pointers. + * The only pointers that change are pointers to Steps that are not in the + * reverted file, which we delete, and pointers to Steps that are in the + * reverted file but not the original *this, which we create new copies of. + * We have to go through these hoops because many places assume the Steps + * pointers don't change - even though there are other ways they can change, + * such as deleting a Steps via the editor. */ for( vector::const_iterator itOld = vOldSteps.begin(); itOld != vOldSteps.end(); ++itOld ) { StepsID id; @@ -512,12 +516,18 @@ void Song::TidyUpData( bool bFromCache ) else // ! HasMusic() { m_fMusicLengthSeconds = 100; // guess - LOG->UserLog( "Song", GetSongDir(), "has no music file; guessing at %f seconds", m_fMusicLengthSeconds ); + LOG->UserLog("Song", + GetSongDir(), + "has no music file; guessing at %f seconds", + m_fMusicLengthSeconds); } if( m_fMusicLengthSeconds < 0 ) { - LOG->UserLog( "Sound file", GetMusicPath(), "has a negative length %f.", m_fMusicLengthSeconds ); + LOG->UserLog("Sound file", + GetMusicPath(), + "has a negative length %f.", + m_fMusicLengthSeconds); m_fMusicLengthSeconds = 0; } @@ -538,7 +548,8 @@ void Song::TidyUpData( bool bFromCache ) // Fall back on the song directory name. if( m_sMainTitle == "" ) - NotesLoader::GetMainAndSubTitlesFromFullTitle( Basename(this->GetSongDir()), m_sMainTitle, m_sSubTitle ); + NotesLoader::GetMainAndSubTitlesFromFullTitle(Basename(this->GetSongDir()), + m_sMainTitle, m_sSubTitle ); if( m_sArtist == "" ) m_sArtist = "Unknown artist"; @@ -652,7 +663,8 @@ void Song::TidyUpData( bool bFromCache ) m_sLyricsFile = arrayLyricFiles[0]; } - // Now, For the images we still haven't found, look at the image dimensions of the remaining unclassified images. + /* Now, For the images we still haven't found, + * look at the image dimensions of the remaining unclassified images. */ vector arrayImages; GetImageDirListing( m_sSongDir + "*", arrayImages ); @@ -763,7 +775,12 @@ void Song::TidyUpData( bool bFromCache ) /* Use this->GetBeatFromElapsedTime(0) instead of 0 to start when the * music starts. */ if( arrayPossibleMovies.size() == 1 ) - this->AddBackgroundChange( BACKGROUND_LAYER_1, BackgroundChange(0,arrayPossibleMovies[0],"",1.f,SBE_StretchNoLoop) ); + this->AddBackgroundChange(BACKGROUND_LAYER_1, + BackgroundChange(0, + arrayPossibleMovies[0], + "", + 1.f, + SBE_StretchNoLoop)); } @@ -836,9 +853,11 @@ void Song::TranslateTitles() static TitleSubst tsub("Songs"); TitleFields title; - title.LoadFromStrings( m_sMainTitle, m_sSubTitle, m_sArtist, m_sMainTitleTranslit, m_sSubTitleTranslit, m_sArtistTranslit ); + title.LoadFromStrings(m_sMainTitle, m_sSubTitle, m_sArtist, + m_sMainTitleTranslit, m_sSubTitleTranslit, m_sArtistTranslit ); tsub.Subst( title ); - title.SaveToStrings( m_sMainTitle, m_sSubTitle, m_sArtist, m_sMainTitleTranslit, m_sSubTitleTranslit, m_sArtistTranslit ); + title.SaveToStrings(m_sMainTitle, m_sSubTitle, m_sArtist, + m_sMainTitleTranslit, m_sSubTitleTranslit, m_sArtistTranslit ); } void Song::ReCalculateRadarValuesAndLastBeat( bool bFromCache ) @@ -852,7 +871,8 @@ void Song::ReCalculateRadarValuesAndLastBeat( bool bFromCache ) } float localFirst = FLT_MAX; // inf - float localLast = this->specifiedLastSecond; // Make sure we're at least as long as the specified amount. + // Make sure we're at least as long as the specified amount below. + float localLast = this->specifiedLastSecond; for( unsigned i=0; i Date: Tue, 5 Jul 2011 15:04:24 -0400 Subject: [PATCH 33/39] Today, on "choose your commit message": Wolfman wanted a better name for the function thanks to its new purpose. Wolfman wanted everyone to suffer by forcing recompilation of 88 files. Wolfman wanted a sandwich. --- src/ScreenEdit.cpp | 2 +- src/Song.cpp | 6 +++--- src/Song.h | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ScreenEdit.cpp b/src/ScreenEdit.cpp index ecf52032b2..0745bfafcf 100644 --- a/src/ScreenEdit.cpp +++ b/src/ScreenEdit.cpp @@ -2731,7 +2731,7 @@ void ScreenEdit::TransitionEditState( EditState em ) Steps* pSteps = GAMESTATE->m_pCurSteps[PLAYER_1]; ASSERT( pSteps ); pSteps->SetNoteData( m_NoteDataEdit ); - m_pSong->ReCalculateRadarValuesAndLastBeat(); + m_pSong->ReCalculateRadarValuesAndLastSecond(); m_Background.Unload(); m_Background.LoadFromSong( m_pSong ); diff --git a/src/Song.cpp b/src/Song.cpp index 277ac16a0f..97d62a728b 100644 --- a/src/Song.cpp +++ b/src/Song.cpp @@ -540,7 +540,7 @@ void Song::TidyUpData( bool bFromCache ) /* Generate these before we autogen notes, so the new notes can inherit * their source's values. */ - ReCalculateRadarValuesAndLastBeat( bFromCache ); + ReCalculateRadarValuesAndLastSecond( bFromCache ); Trim( m_sMainTitle ); Trim( m_sSubTitle ); @@ -860,7 +860,7 @@ void Song::TranslateTitles() m_sMainTitleTranslit, m_sSubTitleTranslit, m_sArtistTranslit ); } -void Song::ReCalculateRadarValuesAndLastBeat( bool bFromCache ) +void Song::ReCalculateRadarValuesAndLastSecond( bool bFromCache ) { if( bFromCache && this->GetFirstSecond() >= 0 && this->GetLastSecond() > 0 ) { @@ -935,7 +935,7 @@ void Song::Save() { LOG->Trace( "Song::SaveToSongFile()" ); - ReCalculateRadarValuesAndLastBeat(); + ReCalculateRadarValuesAndLastSecond(); TranslateTitles(); // TODO: Figure out a better way to save to Song's timing data. diff --git a/src/Song.h b/src/Song.h index 279cb8e5b9..1858a136a0 100644 --- a/src/Song.h +++ b/src/Song.h @@ -103,10 +103,10 @@ public: void TidyUpData( bool bFromCache = false ); /** - * @brief Get the new radar values, and determine the last beat at the same time. + * @brief Get the new radar values, and determine the last second at the same time. * * This is called by TidyUpData, after saving the Song. */ - void ReCalculateRadarValuesAndLastBeat( bool bFromCache = false ); + void ReCalculateRadarValuesAndLastSecond( bool bFromCache = false ); /** * @brief Translate any titles that aren't in english. * From e9c23c0b8392abbb0f37cb5388f1514d0502f266 Mon Sep 17 00:00:00 2001 From: Colby Klein Date: Tue, 5 Jul 2011 12:22:23 -0700 Subject: [PATCH 34/39] revert changes, swap mini<->tiny when loading as a temp solution. --- src/ArrowEffects.cpp | 13 +++++++------ src/NoteField.cpp | 2 +- src/Player.cpp | 4 ++-- src/PlayerOptions.cpp | 4 ++-- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/ArrowEffects.cpp b/src/ArrowEffects.cpp index 93b4f9f178..8a2a48e9d6 100644 --- a/src/ArrowEffects.cpp +++ b/src/ArrowEffects.cpp @@ -56,8 +56,8 @@ static ThemeMetric DRUNK_OFFSET_FREQUENCY( "ArrowEffects", "DrunkOffsetFr static ThemeMetric DRUNK_ARROW_MAGNITUDE( "ArrowEffects", "DrunkArrowMagnitude" ); static ThemeMetric BEAT_OFFSET_HEIGHT( "ArrowEffects", "BeatOffsetHeight" ); static ThemeMetric BEAT_PI_HEIGHT( "ArrowEffects", "BeatPIHeight" ); -static ThemeMetric TINY_PERCENT_BASE( "ArrowEffects", "TinyPercentBase" ); -static ThemeMetric TINY_PERCENT_GATE( "ArrowEffects", "TinyPercentGate" ); +static ThemeMetric TINY_PERCENT_BASE( "ArrowEffects", "MiniPercentBase" ); +static ThemeMetric TINY_PERCENT_GATE( "ArrowEffects", "MiniPercentGate" ); static ThemeMetric DIZZY_HOLD_HEADS( "ArrowEffects", "DizzyHoldHeads" ); float ArrowGetPercentVisible( const PlayerState* pPlayerState, float fYPosWithoutReverse ); @@ -489,12 +489,13 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float fPixelOffsetFromCenter += pCols[iColNum].fXOffset; - if( fEffects[PlayerOptions::EFFECT_TINY] != 0 ) + // XXX: Mini and tiny have names swapped! Fix this. -shakesoda + if( fEffects[PlayerOptions::EFFECT_MINI] != 0 ) { // Allow Mini to pull tracks together, but not to push them apart. - float fTinyPercent = fEffects[PlayerOptions::EFFECT_TINY]; - fTinyPercent = min( powf(TINY_PERCENT_BASE, fTinyPercent), (float)TINY_PERCENT_GATE ); - fPixelOffsetFromCenter *= fTinyPercent; + float fMiniPercent = fEffects[PlayerOptions::EFFECT_MINI]; + fMiniPercent = min( powf(TINY_PERCENT_BASE, fMiniPercent), (float)TINY_PERCENT_GATE ); + fPixelOffsetFromCenter *= fMiniPercent; } return fPixelOffsetFromCenter; diff --git a/src/NoteField.cpp b/src/NoteField.cpp index 3acfb3ea5e..e97ca24225 100644 --- a/src/NoteField.cpp +++ b/src/NoteField.cpp @@ -817,7 +817,7 @@ void NoteField::DrawPrimitives() float fDrawScale = 1; fDrawScale *= 1 + 0.5f * fabsf( current_po.m_fPerspectiveTilt ); - fDrawScale *= 1 + fabsf( current_po.m_fEffects[PlayerOptions::EFFECT_MINI] ); + fDrawScale *= 1 + fabsf( current_po.m_fEffects[PlayerOptions::EFFECT_TINY] ); iDrawDistanceAfterTargetsPixels = (int)(iDrawDistanceAfterTargetsPixels * fDrawScale); iDrawDistanceBeforeTargetsPixels = (int)(iDrawDistanceBeforeTargetsPixels * fDrawScale); diff --git a/src/Player.cpp b/src/Player.cpp index 5dfed3e310..fd3a2202e0 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -867,7 +867,7 @@ void Player::Update( float fDeltaTime ) Actor::TweenState::MakeWeightedAverage( m_pActorWithComboPosition->DestTweenState(), ts1, ts2, fPercentCentered ); } - float fNoteFieldZoom = 1 - fMiniPercent*0.5f; + float fNoteFieldZoom = 1 - fTinyPercent*0.5f; if( m_pNoteField ) m_pNoteField->SetZoom( fNoteFieldZoom ); if( m_pActorWithJudgmentPosition != NULL ) @@ -1488,7 +1488,7 @@ void Player::DrawPrimitives() float fTiltDegrees = SCALE(fTilt,-1.f,+1.f,+30,-30) * (bReverse?-1:1); - float fZoom = SCALE( m_pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects[PlayerOptions::EFFECT_MINI], 0.f, 1.f, 1.f, 0.5f ); + float fZoom = SCALE( m_pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects[PlayerOptions::EFFECT_TINY], 0.f, 1.f, 1.f, 0.5f ); if( fTilt > 0 ) fZoom *= SCALE( fTilt, 0.f, 1.f, 1.f, 0.9f ); else diff --git a/src/PlayerOptions.cpp b/src/PlayerOptions.cpp index a6f279a107..e151e15f4d 100644 --- a/src/PlayerOptions.cpp +++ b/src/PlayerOptions.cpp @@ -155,8 +155,8 @@ void PlayerOptions::GetMods( vector &AddTo, bool bForceNoteSkin ) const AddPart( AddTo, m_fEffects[EFFECT_DRUNK], "Drunk" ); AddPart( AddTo, m_fEffects[EFFECT_DIZZY], "Dizzy" ); AddPart( AddTo, m_fEffects[EFFECT_CONFUSION], "Confusion" ); - AddPart( AddTo, m_fEffects[EFFECT_MINI], "Mini" ); - AddPart( AddTo, m_fEffects[EFFECT_TINY], "Tiny" ); + AddPart( AddTo, m_fEffects[EFFECT_MINI], "Tiny" ); + AddPart( AddTo, m_fEffects[EFFECT_TINY], "Mini" ); AddPart( AddTo, m_fEffects[EFFECT_FLIP], "Flip" ); AddPart( AddTo, m_fEffects[EFFECT_INVERT], "Invert" ); AddPart( AddTo, m_fEffects[EFFECT_TORNADO], "Tornado" ); From df4bde756340f3c704972a8519c13032f1cbacf7 Mon Sep 17 00:00:00 2001 From: Colby Klein Date: Tue, 5 Jul 2011 12:50:01 -0700 Subject: [PATCH 35/39] Fix metric naming --- src/ArrowEffects.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ArrowEffects.cpp b/src/ArrowEffects.cpp index 8a2a48e9d6..809648f2e2 100644 --- a/src/ArrowEffects.cpp +++ b/src/ArrowEffects.cpp @@ -56,8 +56,8 @@ static ThemeMetric DRUNK_OFFSET_FREQUENCY( "ArrowEffects", "DrunkOffsetFr static ThemeMetric DRUNK_ARROW_MAGNITUDE( "ArrowEffects", "DrunkArrowMagnitude" ); static ThemeMetric BEAT_OFFSET_HEIGHT( "ArrowEffects", "BeatOffsetHeight" ); static ThemeMetric BEAT_PI_HEIGHT( "ArrowEffects", "BeatPIHeight" ); -static ThemeMetric TINY_PERCENT_BASE( "ArrowEffects", "MiniPercentBase" ); -static ThemeMetric TINY_PERCENT_GATE( "ArrowEffects", "MiniPercentGate" ); +static ThemeMetric TINY_PERCENT_BASE( "ArrowEffects", "TinyPercentBase" ); +static ThemeMetric TINY_PERCENT_GATE( "ArrowEffects", "TinyPercentGate" ); static ThemeMetric DIZZY_HOLD_HEADS( "ArrowEffects", "DizzyHoldHeads" ); float ArrowGetPercentVisible( const PlayerState* pPlayerState, float fYPosWithoutReverse ); From 2726f6df82661b25511e9634a57e6b8a1fc04648 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Tue, 5 Jul 2011 16:50:06 -0400 Subject: [PATCH 36/39] NOW Mini and Tiny are swapped properly. --- Docs/Changelog_sm5.txt | 2 ++ Themes/_fallback/metrics.ini | 25 +++++++++++++------------ src/ArrowEffects.cpp | 26 +++++++++++++------------- src/NoteField.cpp | 2 +- src/Player.cpp | 4 ++-- src/ScreenJukebox.cpp | 2 +- 6 files changed, 32 insertions(+), 29 deletions(-) diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index a57cfbb072..5c8753740a 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -12,6 +12,8 @@ StepMania 5.0 ????????? | 20110??? ---------- * [ScreenEdit] Restore dance-couple and pump-couple for editing purposes. Saving should still work, but this was never tested yet. [Wolfman2000] +* [ScreenOptions] Mini is now ITG Mini, and Tiny is now Pump Pro Mini. + This will prevent many prior courses from breaking. [sharksoda, Wolfman2000] 2011/07/04 ---------- diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index 03e7f4adbb..bc6dac90c9 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -200,8 +200,8 @@ DrunkOffsetFrequency=10 DrunkArrowMagnitude=0.5 BeatOffsetHeight=15 BeatPIHeight=2 -MiniPercentBase=0.5 -MiniPercentGate=1 +TinyPercentBase=0.5 +TinyPercentGate=1 DizzyHoldHeads=false QuantizeArrowYPosition=false @@ -2199,22 +2199,23 @@ Accel,5="mod,boomerang;name,Boomerang" # Accel,5="mod,expand;name,Expand" # Accel,6="mod,boomerang;name,Boomerang" -Effect="14;selectmultiple" +Effect="15;selectmultiple" EffectDefault="mod,no drunk,no dizzy,,no twirl,no roll,no confusion,no mini,no tiny,no flip,no invert,no tornado,no tipsy,no bumpy,no beat,no xmode" Effect,1="mod,drunk;name,Drunk" Effect,2="mod,dizzy;name,Dizzy" Effect,3="mod,twirl;name,Twirl" Effect,4="mod,roll;name,Roll" Effect,5="mod,confusion;name,Confusion" -Effect,6="mod,tiny;name,Tiny" -Effect,7="mod,-100% mini;name,Big" -Effect,8="mod,flip;name,Flip" -Effect,9="mod,invert;name,Invert" -Effect,10="mod,tornado;name,Tornado" -Effect,11="mod,tipsy;name,Tipsy" -Effect,12="mod,bumpy;name,Bumpy" -Effect,13="mod,beat;name,Beat" -Effect,14="mod,45% xmode;name,XMode" +Effect,6="mod,mini;name,Mini" +Effect,7="mod,tiny;name,Tiny" +Effect,8="mod,-100% mini;name,Big" +Effect,9="mod,flip;name,Flip" +Effect,10="mod,invert;name,Invert" +Effect,11="mod,tornado;name,Tornado" +Effect,12="mod,tipsy;name,Tipsy" +Effect,13="mod,bumpy;name,Bumpy" +Effect,14="mod,beat;name,Beat" +Effect,15="mod,45% xmode;name,XMode" EffectsReceptor="selectmultiple" EffectsReceptorDefault="" diff --git a/src/ArrowEffects.cpp b/src/ArrowEffects.cpp index 5b6dd64b08..489c7c1b62 100644 --- a/src/ArrowEffects.cpp +++ b/src/ArrowEffects.cpp @@ -56,8 +56,8 @@ static ThemeMetric DRUNK_OFFSET_FREQUENCY( "ArrowEffects", "DrunkOffsetFr 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 TINY_PERCENT_BASE( "ArrowEffects", "TinyPercentBase" ); +static ThemeMetric TINY_PERCENT_GATE( "ArrowEffects", "TinyPercentGate" ); static ThemeMetric DIZZY_HOLD_HEADS( "ArrowEffects", "DizzyHoldHeads" ); float ArrowGetPercentVisible( const PlayerState* pPlayerState, float fYPosWithoutReverse ); @@ -345,8 +345,8 @@ float ArrowEffects::GetYOffset( const PlayerState* pPlayerState, int iCol, float static void ArrowGetReverseShiftAndScale( const PlayerState* pPlayerState, int iCol, float fYReverseOffsetPixels, float &fShiftOut, float &fScaleOut ) { // XXX: Hack: we need to scale the reverse shift by the zoom. - float fTinyPercent = pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects[PlayerOptions::EFFECT_TINY]; - float fZoom = 1 - fTinyPercent*0.5f; + float fMiniPercent = pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects[PlayerOptions::EFFECT_MINI]; + float fZoom = 1 - fMiniPercent*0.5f; // don't divide by 0 if( fabsf(fZoom) < 0.01 ) @@ -489,12 +489,12 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float fPixelOffsetFromCenter += pCols[iColNum].fXOffset; - if( fEffects[PlayerOptions::EFFECT_MINI] != 0 ) + if( fEffects[PlayerOptions::EFFECT_TINY] != 0 ) { // Allow Mini to pull tracks together, but not to push them apart. - float fMiniPercent = fEffects[PlayerOptions::EFFECT_MINI]; - fMiniPercent = min( powf(MINI_PERCENT_BASE, fMiniPercent), (float)MINI_PERCENT_GATE ); - fPixelOffsetFromCenter *= fMiniPercent; + float fTinyPercent = fEffects[PlayerOptions::EFFECT_TINY]; + fTinyPercent = min( powf(TINY_PERCENT_BASE, fTinyPercent), (float)TINY_PERCENT_GATE ); + fPixelOffsetFromCenter *= fTinyPercent; } return fPixelOffsetFromCenter; @@ -565,7 +565,7 @@ static float GetCenterLine( const PlayerState* pPlayerState ) { /* Another mini hack: if EFFECT_MINI is on, then our center line is at * eg. 320, not 160. */ - const float fMiniPercent = pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects[PlayerOptions::EFFECT_TINY]; + const float fMiniPercent = pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects[PlayerOptions::EFFECT_MINI]; const float fZoom = 1 - fMiniPercent*0.5f; return CENTER_LINE_Y / fZoom; } @@ -741,11 +741,11 @@ float ArrowEffects::GetZoom( const PlayerState* pPlayerState ) (GAMESTATE->GetNumSidesJoined()==2 || GAMESTATE->AnyPlayersAreCpu()) ) fZoom *= 0.6f; - float fMiniPercent = pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects[PlayerOptions::EFFECT_MINI]; - if( fMiniPercent != 0 ) + float fTinyPercent = pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects[PlayerOptions::EFFECT_TINY]; + if( fTinyPercent != 0 ) { - fMiniPercent = powf( 0.5f, fMiniPercent ); - fZoom *= fMiniPercent; + fTinyPercent = powf( 0.5f, fTinyPercent ); + fZoom *= fTinyPercent; } return fZoom; } diff --git a/src/NoteField.cpp b/src/NoteField.cpp index e97ca24225..3acfb3ea5e 100644 --- a/src/NoteField.cpp +++ b/src/NoteField.cpp @@ -817,7 +817,7 @@ void NoteField::DrawPrimitives() float fDrawScale = 1; fDrawScale *= 1 + 0.5f * fabsf( current_po.m_fPerspectiveTilt ); - fDrawScale *= 1 + fabsf( current_po.m_fEffects[PlayerOptions::EFFECT_TINY] ); + fDrawScale *= 1 + fabsf( current_po.m_fEffects[PlayerOptions::EFFECT_MINI] ); iDrawDistanceAfterTargetsPixels = (int)(iDrawDistanceAfterTargetsPixels * fDrawScale); iDrawDistanceBeforeTargetsPixels = (int)(iDrawDistanceBeforeTargetsPixels * fDrawScale); diff --git a/src/Player.cpp b/src/Player.cpp index fd3a2202e0..5dfed3e310 100644 --- a/src/Player.cpp +++ b/src/Player.cpp @@ -867,7 +867,7 @@ void Player::Update( float fDeltaTime ) Actor::TweenState::MakeWeightedAverage( m_pActorWithComboPosition->DestTweenState(), ts1, ts2, fPercentCentered ); } - float fNoteFieldZoom = 1 - fTinyPercent*0.5f; + float fNoteFieldZoom = 1 - fMiniPercent*0.5f; if( m_pNoteField ) m_pNoteField->SetZoom( fNoteFieldZoom ); if( m_pActorWithJudgmentPosition != NULL ) @@ -1488,7 +1488,7 @@ void Player::DrawPrimitives() float fTiltDegrees = SCALE(fTilt,-1.f,+1.f,+30,-30) * (bReverse?-1:1); - float fZoom = SCALE( m_pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects[PlayerOptions::EFFECT_TINY], 0.f, 1.f, 1.f, 0.5f ); + float fZoom = SCALE( m_pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects[PlayerOptions::EFFECT_MINI], 0.f, 1.f, 1.f, 0.5f ); if( fTilt > 0 ) fZoom *= SCALE( fTilt, 0.f, 1.f, 1.f, 0.9f ); else diff --git a/src/ScreenJukebox.cpp b/src/ScreenJukebox.cpp index eb1769c040..5059d2ecf1 100644 --- a/src/ScreenJukebox.cpp +++ b/src/ScreenJukebox.cpp @@ -194,7 +194,7 @@ void ScreenJukebox::Init() PO_GROUP_CALL( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, Init ); PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, .25f ); PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fPerspectiveTilt, -1.0f ); - PO_GROUP_ASSIGN_N( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fEffects, PlayerOptions::EFFECT_MINI, 1.0f ); + PO_GROUP_ASSIGN_N( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fEffects, PlayerOptions::EFFECT_TINY, 1.0f ); } SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_LifeType, SongOptions::LIFE_BATTERY ); } From d3c8abed4a5745c88c0460b0fafc02a940c97698 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Tue, 5 Jul 2011 18:45:31 -0400 Subject: [PATCH 37/39] Remove outdated metrics. --- Themes/_fallback/metrics.ini | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index bc6dac90c9..af2595f13a 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -2389,12 +2389,6 @@ Persp,3="mod,space;name,Space" Persp,4="mod,hallway;name,Hallway" Persp,5="mod,distant;name,Distant" -ScoreDisplay="3" -ScoreDisplayDefault="mod,addscore" -ScoreDisplay,1="mod,addscore;name,Add" -ScoreDisplay,2="mod,subtractscore;name,Subtract" -ScoreDisplay,3="mod,averagescore;name,Average" - # Song options # LifeType="3;together" LifeType=(GAMESTATE:IsCourseMode() and 3 or 2)..";together" From e281ca418b99f54746fd1705e1143e05ecdbbd57 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Tue, 5 Jul 2011 19:10:07 -0400 Subject: [PATCH 38/39] New lua function CHARMAN:GetCharacterCount. How the Characters mod won't display by default if there are no characters to play with at all. --- Docs/Changelog_sm5.txt | 3 +++ Docs/Luadoc/Lua.xml | 1 + Docs/Luadoc/LuaDocumentation.xml | 3 +++ Themes/default/Scripts/03 ThemePrefs.lua | 27 +++++++++++++++--------- src/CharacterManager.cpp | 8 +++++++ 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index 5c8753740a..e4c5a6d79e 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -14,6 +14,9 @@ StepMania 5.0 ????????? | 20110??? Saving should still work, but this was never tested yet. [Wolfman2000] * [ScreenOptions] Mini is now ITG Mini, and Tiny is now Pump Pro Mini. This will prevent many prior courses from breaking. [sharksoda, Wolfman2000] +* [CharacterManager] Add a lua function to check how many characters you have. + For an example of how this is used, check the default theme's scripts + folder, specifically 03 ThemePrefs.lua. [Wolfman2000] 2011/07/04 ---------- diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index 4f56b8b1a2..a3bf6efb82 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -580,6 +580,7 @@ + diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index d1d6f53eda..3163e5b0da 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -1540,6 +1540,9 @@ Returns a random character. + + Returns the number of characters available. + diff --git a/Themes/default/Scripts/03 ThemePrefs.lua b/Themes/default/Scripts/03 ThemePrefs.lua index d7c1555728..221ced5288 100644 --- a/Themes/default/Scripts/03 ThemePrefs.lua +++ b/Themes/default/Scripts/03 ThemePrefs.lua @@ -231,9 +231,9 @@ function UserPrefShowLotsaOptions() end function GetDefaultOptionLines() - local LineSets = { - "1,8,14,2,3,4,5,6,R,7,9,10,11,12,13,16,17,18", -- All - "1,8,14,2,7,13,16,17,18", -- DDR Essentials ( no turns, fx ) + local LineSets = { -- none of these include characters yet. + "1,8,14,2,3,4,5,6,R,7,9,10,11,12,13,16,17", -- All + "1,8,14,2,7,13,16,17", -- DDR Essentials ( no turns, fx ) }; local function IsExtra() if GAMESTATE:IsExtraStage() or GAMESTATE:IsExtraStage2() then @@ -242,15 +242,22 @@ function GetDefaultOptionLines() return false end end - if not IsExtra() then - if GetUserPrefB("UserPrefShowLotsaOptions") then - return GetUserPrefB("UserPrefShowLotsaOptions") and LineSets[1] or LineSets[2]; - else - return LineSets[2]; -- Just make sure! + + local function CheckCharacters(mods) + if CHARMAN:GetCharacterCount() > 0 then + return mods .. ",18"; --TODO: Better line name. end - else - return "1,8,14,2,7,13,16,17,18" -- "failsafe" list + return mods; end + + modLines = LineSets[2]; + + if not IsExtra() then + modLines = GetUserPrefB("UserPrefShowLotsaOptions") + and LineSets[1] or LineSets[2]; + end + + return CheckCharacters(modLines); end; function UserPrefAutoSetStyle() diff --git a/src/CharacterManager.cpp b/src/CharacterManager.cpp index 10cf6a26d6..30fc1ab6ac 100644 --- a/src/CharacterManager.cpp +++ b/src/CharacterManager.cpp @@ -152,6 +152,13 @@ public: LuaHelpers::CreateTableFromArray(vChars, L); return 1; } + static int GetCharacterCount(T* p, lua_State *L) + { + vector chars; + p->GetCharacters(chars); + lua_pushnumber(L, chars.size()); + return 1; + } LunaCharacterManager() { @@ -159,6 +166,7 @@ public: // sm-ssc adds: ADD_METHOD( GetRandomCharacter ); ADD_METHOD( GetAllCharacters ); + ADD_METHOD( GetCharacterCount ); } }; From ef31eca4c14bce7c6e4e0c7d83046dc9ca8d6db4 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Tue, 5 Jul 2011 22:57:01 -0400 Subject: [PATCH 39/39] doxygen and better fail message. Hmm..why does GetCharacters not return the DefaultCharacter? Is this function perhaps misnamed? --- src/CharacterManager.cpp | 2 +- src/CharacterManager.h | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/CharacterManager.cpp b/src/CharacterManager.cpp index 30fc1ab6ac..8b70d9139f 100644 --- a/src/CharacterManager.cpp +++ b/src/CharacterManager.cpp @@ -89,7 +89,7 @@ Character* CharacterManager::GetDefaultCharacter() } /* We always have the default character. */ - ASSERT(0); + FAIL_M("There must be a default character available!"); return NULL; } diff --git a/src/CharacterManager.h b/src/CharacterManager.h index bd49c20c5e..4a687ee9d3 100644 --- a/src/CharacterManager.h +++ b/src/CharacterManager.h @@ -1,19 +1,24 @@ -/* CharacterManager - Manage characters. */ - #ifndef CHARACTER_MANAGER_H #define CHARACTER_MANAGER_H class Character; struct lua_State; +/** @brief Manage all of the Characters. */ class CharacterManager { public: + /** @brief Set up the character manager. */ CharacterManager(); + /** @brief Destroy the character manager. */ ~CharacterManager(); void GetCharacters( vector &vpCharactersOut ); + /** @brief Get one installed character at random. + * @return The random character. */ Character* GetRandomCharacter(); + /** @brief Get the character assigned as the default. + * @return The default character. */ Character* GetDefaultCharacter(); Character* GetCharacterFromID( RString sCharacterID );