Merge with default

This commit is contained in:
Henrik Andersson
2011-06-29 21:27:37 +02:00
108 changed files with 11677 additions and 1109 deletions
+4 -4
View File
@@ -47,9 +47,9 @@ WeightW2=30
WeightW1=55
[Skill6]
WeightMiss=
WeightW5=
WeightW4=
WeightMiss=0
WeightW5=0
WeightW4=0
WeightW3=5
WeightW2=30
WeightW1=70
WeightW1=70
+6
View File
@@ -9,6 +9,12 @@ change to JSON, but it is unsure if this will be done.
Implement .ssc at your own risk.
________________________________________________________________________________
[v0.72] - Wolfman2000
* Have #OFFSET come before #ATTACKS in the Step data.
[v0.71] - Wolfman2000
* Have #ATTACKS work per step as well.
[v0.7] - theDtTvB, Wolfman2000
* Split Timing officially implemented.
* #SPEEDS tag for modified scroll speeds.
+46
View File
@@ -8,7 +8,53 @@ ________________________________________________________________________________
StepMania 5.0 Preview 2 | 201106??
--------------------------------------------------------------------------------
2011/06/28
----------
* [ScreenEdit] Add a function to copy/paste the TimingData of a player's
choice. Remember to be in the appropriate mode when copying and pasting.
By default, the song timing is already located in the clipboard, ready for
use. [Wolfman2000]
2011/06/27
----------
* [Steps] Make sure #ATTACKS are copied when requested. [Wolfman2000]
* [ScreenEdit] Have Step Author up front instead of Chart Style. This is
probably going to be better overall. [Wolfman2000]
* [TimingData] Preserve the length of time for Speed Segment scaling when using
beats. [Wolfman2000]
* [NotesLoader/WriterSSC] #OFFSET is to be before #ATTACKS. This is required if
we pursue beat based attacks and not just second based. [Wolfman2000]
2011/06/26
----------
* [UnlockManager] New metric: AutoLockEditSteps. Use this to hide bonus charts
until the Expert steps are beaten. No guarantee that this works with no
challenge steps in the song. This defaults to false. [Wolfman2000]
* [UnlockManager] New metric: SongsNotAdditional. Set to true to keep the
default behavior, false to have the AdditionalSongs folder contain
unlockable material. This is set to true to start. [Wolfman2000]
* [ScreenEdit] Allow jumping between all segments, not just Label segments.
You still use Ctrl + ,/. to jump, but now you use Ctrl + N/M to cycle the
segments. By default, it starts with Label. [Wolfman2000]
* [PlayerOptions] No longer display StepAttacks in the player's list.
Instead, show NoAttacks if attacks are disabled. [Wolfman2000]
2011/06/24
----------
* [Actor] Implement compound(length,tweens) in _fallback/02 Actor.lua. [AJ]
* [UnlockManager] Add a new unlock reward: StepsType. This is similar to
unlocking Steps, but it is targeted for one step in one stepstype rather
than one step in all stepstypes. This needs testing. [Wolfman2000]
* [ScreenEdit] Add the option to convert delays to beats. Just find a better
song to use this on besides Uprock. [Wolfman2000]
* [ScreenEdit] Fix a crash if you don't save any steps on a new song.
[Wolfman2000]
* [NotesLoader/WriterSSC] Add support for Step #ATTACKS. Furthermore, Song
Attacks (or rather, Step Attacks as it should be called now) are turned on
by default instead of off. [Wolfman2000]
2011/06/19
----------
* [EditMenu] Allow all songs to work in Practice Mode, regardless of folder
location. This fixes a crash if everyone had songs in AdditionalSongs.
[Wolfman2000]
+16 -6
View File
@@ -3,6 +3,7 @@
<Lua xmlns='http://www.stepmania.com' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://www.stepmania.com Lua.xsd'>
<GlobalFunctions>
<Function name='Alpha'/>
<Function name='AreStagePlayerModsForced'/>
<Function name='AreStageSongModsForced'/>
<Function name='Basename'/>
@@ -321,6 +322,7 @@
<Function name='bouncebegin'/>
<Function name='bounceend'/>
<Function name='clearzbuffer'/>
<Function name='compound'/>
<Function name='cropbottom'/>
<Function name='cropleft'/>
<Function name='cropright'/>
@@ -822,6 +824,7 @@
<Function name='IsInDanger'/>
</Class>
<Class base='LifeMeter' name='LifeMeterBattery'>
<Function name='ChangeLives'/>
<Function name='GetLivesLeft'/>
<Function name='GetTotalLives'/>
</Class>
@@ -888,9 +891,9 @@
<Function name='LoadFromStats'/>
</Class>
<Class base='ActorFrame' name='Player'>
<Function name='GetPlayerTimingData'/>
<Function name='SetActorWithComboPosition'/>
<Function name='SetActorWithJudgmentPosition'/>
<Function name='GetPlayerTimingData'/>
</Class>
<Class name='PlayerInfo'>
<Function name='GetLifeMeter'/>
@@ -956,6 +959,7 @@
<Function name='GetSongAttacks'/>
<Function name='GetSplit'/>
<Function name='GetStealth'/>
<Function name='GetStepAttacks'/>
<Function name='GetStomp'/>
<Function name='GetSudden'/>
<Function name='GetSuddenOffset'/>
@@ -1143,7 +1147,9 @@
<Function name='GetNextScreenName'/>
<Function name='GetPrevScreenName'/>
<Function name='GetScreenType'/>
<Function name='Metric'/>
<Function name='PostScreenMessage'/>
<Function name='String'/>
<Function name='lockinput'/>
</Class>
<Class base='ScreenWithMenuElements' name='ScreenAttract'/>
@@ -1380,6 +1386,7 @@
<Function name='GetRadarValues'/>
<Function name='GetStepsType'/>
<Function name='GetTimingData'/>
<Function name='HasAttacks'/>
<Function name='HasSignificantTimingChanges'/>
<Function name='IsAPlayerEdit'/>
<Function name='IsAnEdit'/>
@@ -1469,6 +1476,7 @@
<Function name='GetCourse'/>
<Function name='GetDescription'/>
<Function name='GetRequirePassHardSteps'/>
<Function name='GetRequirePassChallengeSteps'/>
<Function name='GetRequirement'/>
<Function name='GetSong'/>
<Function name='GetUnlockRewardType'/>
@@ -1481,6 +1489,7 @@
<Function name='roulette'/>
<Function name='song'/>
<Function name='steps'/>
<Function name='steps_type'/>
</Class>
<Class name='UnlockManager'>
<Function name='AnyUnlocksToCelebrate'/>
@@ -1530,7 +1539,7 @@
<Function name='GetCreditsMessage'/>
</Namespace>
<Namespace name='SongUtil'>
<Function name='GetStepsPlayable'/>
<Function name='GetPlayableSteps'/>
<Function name='IsStepsPlayable'/>
<Function name='IsStepsTypePlayable'/>
</Namespace>
@@ -2085,8 +2094,9 @@
<Enum name='UnlockRewardType'>
<EnumValue name='&apos;UnlockRewardType_Song&apos;' value='0'/>
<EnumValue name='&apos;UnlockRewardType_Steps&apos;' value='1'/>
<EnumValue name='&apos;UnlockRewardType_Course&apos;' value='2'/>
<EnumValue name='&apos;UnlockRewardType_Modifier&apos;' value='3'/>
<EnumValue name='&apos;UnlockRewardType_StepsType&apos;' value='2'/>
<EnumValue name='&apos;UnlockRewardType_Course&apos;' value='3'/>
<EnumValue name='&apos;UnlockRewardType_Modifier&apos;' value='4'/>
</Enum>
<Enum name='VertAlign'>
<EnumValue name='&apos;VertAlign_Top&apos;' value='0'/>
@@ -2118,9 +2128,9 @@
<Constant name='left' value='&apos;HorizAlign_Left&apos;'/>
<Constant name='middle' value='&apos;VertAlign_Middle&apos;'/>
<Constant name='right' value='&apos;HorizAlign_Right&apos;'/>
<Constant name='sGame' value='&apos;dance&apos;'/>
<Constant name='sGame' value='&apos;pump&apos;'/>
<Constant name='top' value='&apos;VertAlign_Top&apos;'/>
</Constants>
<Version>StepMania 5 v5.0 Preview 1a</Version>
<Date>2011-06-11</Date>
<Date>2011-06-24</Date>
</Lua>
+13 -1
View File
@@ -2350,6 +2350,9 @@
</Function>
<Function name='GetSongAttacks' return='float' arguments=''>
This function is deprecated. Please use GetStepAttacks() instead.
</Function>
<Function name='GetStepAttacks' return='float' arguments=''>
</Function>
<Function name='GetSplit' return='float' arguments=''>
@@ -3466,8 +3469,11 @@
<Function name='GetMeter' return='int' arguments=''>
Returns the numerical difficulty of the Steps.
</Function>
<Function name='HasAttacks' return='bool' arguments=''>
Returns <code>true</code> if the Steps has any attacks.
</Function>
<Function name='HasSignificantTimingChanges' return='bool' arguments=''>
returns <code>true</code> if the song has significant timing changes.
Returns <code>true</code> if the Steps pattern has significant timing changes.
</Function>
<Function name='GetRadarValues' return='RadarValues' arguments='PlayerNumber pn'>
Returns the complete list of RadarValues for player <code>pn</code>. Use <Link class='RadarValues' function='GetValue' /> to grab a specific value.
@@ -3714,6 +3720,9 @@
<Function name='GetRequirePassHardSteps' return='bool' arguments=''>
Returns <code>true</code> if the UnlockEntry requires you to pass Hard steps.
</Function>
<Function name='GetRequirePassChallengeSteps' return='bool' arguments=''>
Returns <code>true</code> if the UnlockEntry requires you to pass Challenge steps.
</Function>
<Function name='GetSong' return='Song' arguments=''>
Returns the Song related to the UnlockEntry.
</Function>
@@ -3744,6 +3753,9 @@
Sets the UnlockEntry to unlock a specified song's steps.<br />
Example: <code>steps,"In The Groove/Pandemonium","expert"</code>
</Function>
<Function name='steps_type' return='void' arguments='string sSong, string sSteps, string sStepsType'>
Sets the UnlockEntry to unlock a specified song's stepstype.
</Function>
</Class>
<Class name='UnlockManager'>
<Function name='AnyUnlocksToCelebrate' return='bool' arguments=''>
+2 -2
View File
@@ -51,6 +51,7 @@
#CREDIT:;
// steps-based timingdata
#OFFSET:;
#BPMS:;
#STOPS:;
#DELAYS:;
@@ -61,8 +62,7 @@
#SCROLLS:;
#FAKES:;
#LABELS:;
#ATTACKS:; // Not yet in use.
#OFFSET:;
#ATTACKS:;
// actual step data
#NOTES:;
+8 -1
View File
@@ -3,7 +3,8 @@ FallbackNoteSkin=default
[NoteDisplay]
TapNoteAnimationIsVivid=0
DrawHoldHeadForTapsOnSameRow=1
HoldHeadAnimationIsVivid=0
DrawHoldHeadForTapsOnSameRow=0
TapNoteAnimationLength=4
TapAdditionAnimationLength=4
TapMineAnimationLength=1
@@ -34,8 +35,14 @@ TapNoteNoteColorTextureCoordSpacingY=0.125
TapFakeNoteColorTextureCoordSpacingX=0
TapFakeNoteColorTextureCoordSpacingY=0.125
HoldHeadAdditionTextureCoordOffsetX=0
HoldHeadAdditionTextureCoordOffsetY=0
HoldHeadNoteColorTextureCoordSpacingX=0
HoldHeadNoteColorTextureCoordSpacingY=0
HoldTopCapAdditionTextureCoordOffsetX=0
HoldTopCapAdditionTextureCoordOffsetY=0
HoldTopCapNoteColorTextureCoordSpacingX=0
HoldTopCapNoteColorTextureCoordSpacingY=0
[GhostArrowDim]
NoneCommand=
+3 -3
View File
@@ -1,9 +1,9 @@
[Global]
FallbackNoteSkin=default
FallbackNoteSkin=midi-note
[NoteDisplay]
TapNoteAnimationIsVivid=0
DrawHoldHeadForTapsOnSameRow=1
DrawHoldHeadForTapsOnSameRow=0
TapNoteAnimationLength=4
TapAdditionAnimationLength=4
TapMineAnimationLength=1
@@ -35,7 +35,7 @@ TapFakeNoteColorTextureCoordSpacingX=0
TapFakeNoteColorTextureCoordSpacingY=0.125
HoldHeadNoteColorTextureCoordSpacingX=0
HoldHeadNoteColorTextureCoordSpacingY=0.125
HoldHeadNoteColorTextureCoordSpacingY=0
[GhostArrowDim]
NoneCommand=
@@ -1 +0,0 @@
Down Tap Explosion Bright
Binary file not shown.

After

Width:  |  Height:  |  Size: 747 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 457 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 621 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

@@ -51,6 +51,7 @@ local contrib = {
"sy567", -- beginner helper fix
"Thai Pangsakulyanont (theDtTvB)",
"v1toko", -- x-mode from StepNXA
"Christophe Goulet-LeBlanc (Kommisar)",
}
local thanks = {
@@ -74,6 +75,7 @@ local shoutout = {
"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
"#KBO",
"You showed us... your ultimate dance",
-- "Can't stop crying... buckets of tears!"
}
@@ -1,49 +1,2 @@
local function CreditsText( pn )
function update(self)
local str = ScreenSystemLayerHelpers.GetCreditsMessage(pn);
self:settext(str);
end
function UpdateVisible(self)
local screen = SCREENMAN:GetTopScreen();
local bShow = true;
if screen then
local sClass = screen:GetName();
bShow = THEME:GetMetric( sClass, "ShowCreditDisplay" );
end
self:visible( bShow );
end
local text = LoadFont(Var "LoadingScreen","credits") .. {
InitCommand=function(self)
self:name("Credits" .. PlayerNumberToString(pn))
ActorUtil.LoadAllCommandsAndSetXY(self,Var "LoadingScreen");
end;
UpdateTextCommand=function(self)
local str = ScreenSystemLayerHelpers.GetCreditsMessage(pn);
self:settext(str);
end;
UpdateVisibleCommand=function(self)
local screen = SCREENMAN:GetTopScreen();
local bShow = true;
if screen then
local sClass = screen:GetName();
bShow = THEME:GetMetric( sClass, "ShowCreditDisplay" );
end
self:visible( bShow );
end;
--[[ RefreshCreditTextMessageCommand=update;
CoinInsertedMessageCommand=update;
PlayerJoinedMessageCommand=update;
ScreenChangedMessageCommand=UpdateVisible; --]]
};
return text;
end
local t = Def.ActorFrame {
CreditsText( PLAYER_1 );
CreditsText( PLAYER_2 );
};
local t = Def.ActorFrame {};
return t;
@@ -1,4 +1,50 @@
local function CreditsText( pn )
function update(self)
local str = ScreenSystemLayerHelpers.GetCreditsMessage(pn);
self:settext(str);
end
function UpdateVisible(self)
local screen = SCREENMAN:GetTopScreen();
local bShow = true;
if screen then
local sClass = screen:GetName();
bShow = THEME:GetMetric( sClass, "ShowCreditDisplay" );
end
self:visible( bShow );
end
local text = LoadFont(Var "LoadingScreen","credits") .. {
InitCommand=function(self)
self:name("Credits" .. PlayerNumberToString(pn))
ActorUtil.LoadAllCommandsAndSetXY(self,Var "LoadingScreen");
end;
UpdateTextCommand=function(self)
local str = ScreenSystemLayerHelpers.GetCreditsMessage(pn);
self:settext(str);
end;
UpdateVisibleCommand=function(self)
local screen = SCREENMAN:GetTopScreen();
local bShow = true;
if screen then
local sClass = screen:GetName();
bShow = THEME:GetMetric( sClass, "ShowCreditDisplay" );
end
self:visible( bShow );
end;
--[[ RefreshCreditTextMessageCommand=update;
CoinInsertedMessageCommand=update;
PlayerJoinedMessageCommand=update;
ScreenChangedMessageCommand=UpdateVisible; --]]
};
return text;
end;
--
local t = Def.ActorFrame {
CreditsText( PLAYER_1 );
CreditsText( PLAYER_2 );
Def.ActorFrame {
Def.Quad {
InitCommand=cmd(zoomtowidth,SCREEN_WIDTH;zoomtoheight,30;horizalign,left;vertalign,top;y,SCREEN_TOP;diffuse,color("0,0,0,0"));
+12 -4
View File
@@ -656,6 +656,7 @@ Never=Never
New=New
NewEdit=-New Edit-
No=No
NoAttacks=No Attacks
NoHands=No Hands
NoHolds=No Holds
NoJumps=No Jumps
@@ -707,7 +708,8 @@ Skip=Skip
Skippy=Skippy
Slow=Slow
SN2=Supernova 2
SongAttacks=Song Attacks
SongAttacks=Step Attacks
StepAttacks=Step Attacks
Song BGAnimation=Song BGAnimation
Song Bitmap=Song Bitmap
Song Movie=Song Movie
@@ -812,12 +814,14 @@ CoinMode=Coin Mode
CoinModeNoHome=Coin Mode
CoinsPerCredit=Coins&nbsp;Per Credit
Connection=Connection
Convert pause to beats=Convert pause to beats
Convert pause to beats=Convert stop to beats
Convert delay to beats=Convert delay to beats
Convert selection to pause=Convert selection to pause
Convert selection to delay=Convert selection to delay
Convert selection to warp=Convert selection to Warp Segment
Convert selection to fake=Convert selection to Fake Segment
Copy=Copy
Copy timing data=Copy timing data
CourseSortOrder=Course Sort
Create New=Create New
Create New Course=Create New
@@ -941,6 +945,7 @@ OsMountPlayer1=OS&nbsp;Mount Player1
OsMountPlayer2=OS&nbsp;Mount Player2
Paste at begin marker=Paste at begin marker
Paste at current beat=Paste at current beat
Paste timing data=Paste timing data
Persp=Persp
Play current beat to end=Play current beat to end
Play preview music=Play preview music
@@ -976,7 +981,7 @@ Remove Change=Remove Change
Rename=Rename
Reset To Defaults=Reset Options To Default Values
Revert from disk=Revert from disk
Revert to last save=Revert to last save
Revert to last save=Revert from cache
Save=Save
SaveScores=Save Scores
SaveReplays=Save Replays
@@ -1262,7 +1267,7 @@ Enter a new min BPM.=Enter the minimum displayed BPM.
Enter a new max BPM.=Enter the maximum displayed BPM.
More than %d notes per measure is not allowed. This change has been reverted.=More than %d notes per measure is not allowed. This change has been reverted.
No backgrounds available=No backgrounds available
EditHelpText=Up/Down:\n change beat\nLeft/Right:\n change snap\nNumber keys:\n add/remove\n tap note\nN and M keys:\n swap tap notes\nCreate hold note:\n Hold a number\n while moving\n Up or Down\nCreate roll note:\n Hold Shift,\n then create a\n hold note.\nSpace bar:\n Set area\n marker\nT key:\n Switch Timing\nEnter:\n Area Menu\nA Key: Alter Menu\nEscape:\n Main Menu\nF4:\n Timing Menu\nF1:\n Show help\n
EditHelpText=Up/Down:\n change beat\nLeft/Right:\n change snap\nNumber keys:\n add/remove\n tap note\nN and M keys:\n swap tap notes\nCtrl + N/M:\n swap cycled segment\nCtrl + ,/.:\n cycle segments\nCreate hold note:\n Hold a number\n while moving\n Up or Down\nCreate roll note:\n Hold Shift,\n then create a\n hold note.\nSpace bar: Set area\n marker\nT key: Switch Timing\nEnter: Area Menu\nA Key: Alter Menu\nEscape: Main Menu\nF4: Timing Menu\nF1: Show help\n
PlayRecordHelpText=Press START to end
Save successful.=Save successful.
Saved as SM and DWI.=Saved as SM and DWI.
@@ -1283,9 +1288,11 @@ Selection beat=Selection beat
Difficulty=Difficulty
Description=Description
Chart Style=Chart Style
Step Author=Step Author
Main title=Main title
Subtitle=Subtitle
Tap Note=Tap Note
Segment=Segment
Tap Steps=Tap Steps
Jumps=Jumps
Hands=Hands
@@ -1905,6 +1912,7 @@ P2=P2
[UnlockRewardType]
Song=Song
Steps=Steps
StepsType=StepsType
Course=Course
Modifier=Modifier
+38
View File
@@ -83,6 +83,44 @@ local DropBezier =
function Actor:drop(t)
self:tween( t, "TweenType_Bezier", DropBezier );
end
-- compound tweens "combine multiple interpolators to allow generating more
-- complex tweens." length is how long to span the animation for, while
-- ... is either a string (e.g. "linear,0.25,accelerate,0.75") or a table
-- with the tween information.
function Actor:compound(length,...)
local tweens = ...
if type(tweens) == "string" then
local parsed = split(";",tweens)
tweens = {} -- convert to table
for i,s in pairs(parsed) do
local res = split(",",s)
tweens[i] = {
Type = res[1],
Percent = res[2],
Bezier = res[3] or nil
}
end
end
for i,t in pairs(tweens) do
if t.Type == "linear" then self:linear(t.Percent*length)
elseif t.Type == "accelerate" then self:accelerate(t.Percent*length)
elseif t.Type == "decelerate" then self:decelerate(t.Percent*length)
elseif t.Type == "spring" then self:spring(t.Percent*length)
elseif t.Type == "bouncebegin" then self:bouncebegin(t.Percent*length)
elseif t.Type == "bounceend" then self:bounceend(t.Percent*length)
elseif t.Type == "smooth" then self:smooth(t.Percent*length)
elseif t.Type == "drop" then self:smooth(t.Percent*length)
--elseif t.Type == "ease" then self:ease(t.Percent*length)
elseif t.Type == "bezier" then
-- todo: handle using tween and 'TweenType_Bezier'
end
end
end
-- Hide if b is true, but don't unhide if b is false.
function Actor:hide_if(b)
if b then
+5 -1
View File
@@ -65,7 +65,11 @@ Branch = {
if SONGMAN:GetNumSongs() == 0 and SONGMAN:GetNumAdditionalSongs() == 0 then
return "ScreenHowToInstallSongs";
end;
return "ScreenSelectProfile";
if PROFILEMAN:GetNumLocalProfiles() >= 2 then
return "ScreenSelectProfile";
else
return Branch.AfterSelectProfile();
end
end,
OptionsEdit = function()
-- Similar to above, don't let anyone in here with 0 songs.
+21 -12
View File
@@ -13,23 +13,31 @@ function AreStageSongModsForced()
return bExtraStage or bOni or bBattle or bRave
end
function SetFail()
local sFail = "";
if GetGamePref("DefaultFail") then
sFail = string.format("fail%s", string.lower( GetGamePref("DefaultFail") ));
else
sFail = "failoff";
end
sFail = sFail .. ",failimmediate,suddendeath";
SCREENMAN:SystemMessage( 'NEW FAIL IS: ' .. tostring(sFail) );
GAMESTATE:SetSongOptions( "ModsLevel_Song", sFail );
MESSAGEMAN:Broadcast( "SongOptionsChanged" );
end
function ScreenSelectMusic:setupmusicstagemods()
Trace( "setupmusicstagemods" )
local pm = GAMESTATE:GetPlayMode()
if pm == "PlayMode_Battle" or pm == "PlayMode_Rave" then
-- FIX DAT BUG;
local sFail = "";
if GetGamePref("DefaultFail") then
sFail = string.format("Fail%s", GetGamePref("DefaultFail") );
else
sFail = "Failoff";
end;
--
local so = GAMESTATE:GetDefaultSongOptions() .. "," .. sFail;
local so = GAMESTATE:GetDefaultSongOptions();
GAMESTATE:SetSongOptions( "ModsLevel_Stage", so );
MESSAGEMAN:Broadcast( "SongOptionsChanged" );
elseif GAMESTATE:IsAnExtraStage() then
elseif GAMESTATE:IsAnExtraStage() then
if GAMESTATE:GetPreferredSongGroup() == "---Group All---" then
local song = GAMESTATE:GetCurrentSong()
GAMESTATE:SetPreferredSongGroup( song:GetGroupName() )
@@ -46,6 +54,9 @@ function ScreenSelectMusic:setupmusicstagemods()
po = THEME:GetMetric("SongManager","ExtraStagePlayerModifiers");
so = THEME:GetMetric("SongManager","ExtraStageStageModifiers");
end
so = so .. "," .. sFail;
local difficulty = steps:GetDifficulty()
local Reverse = PlayerNumber:Reverse()
@@ -58,8 +69,6 @@ function ScreenSelectMusic:setupmusicstagemods()
GAMESTATE:SetPreferredDifficulty( pn, difficulty )
MESSAGEMAN:Broadcast( "PlayerOptionsChanged", {PlayerNumber = pn} )
end
GAMESTATE:SetSongOptions( "ModsLevel_Stage", so )
MESSAGEMAN:Broadcast( "SongOptionsChanged" )
+11 -13
View File
@@ -124,6 +124,8 @@ ExtraColor=color("#ff0000") -- red
[UnlockManager]
# Unlock specific things.
AutoLockChallengeSteps=false
AutoLockEditSteps=false
SongsNotAdditional=true
UnlockNames=""
# useful commands:
@@ -2081,7 +2083,8 @@ ForceTimer=true
TimerMetricsGroup="MenuTimerNoSound"
TimerSeconds=5
#
# ScreenOnCommand=%SetFail()
#
[ScreenOptions]
Fallback="ScreenWithMenuElements"
NavigationMode="normal"
@@ -2352,18 +2355,11 @@ Mines,2="name,On"
Mines,3="mod,mines;name,Add"
Mines,4="mod,attackmines;name,AttackMines"
# Mines="4"
# MinesDefault="mod,no nomines,no mines, no attackmines"
# Mines,1="mod,nomines;name,Off"
# Mines,2="name,On"
# Mines,3="mod,mines;name,Add"
# Mines,4="mod,attackmines;name,AttackMines"
Attacks="3"
AttacksDefault="mod,songattacks"
Attacks,3="mod,no randomattacks,no songattacks;name,Off"
AttacksDefault="mod,no randomattacks, no noattacks"
Attacks,1="name,On"
Attacks,2="mod,randomattacks;name,RandomAttacks"
Attacks,1="name,SongAttacks"
Attacks,3="mod,noattacks;name,Off"
PlayerAutoPlay="2"
PlayerAutoPlayDefault="mod,no playerautoplay"
@@ -2374,7 +2370,7 @@ Hide="3;selectmultiple"
HideDefault="mod,no dark,no blind,no cover"
Hide,1="mod,dark;name,Dark"
Hide,2="mod,blind;name,Blind"
Hide,3="mod,60% cover;name,Cover"
Hide,3="mod,80% cover;name,Cover"
# Hide="3"
# HideDefault="mod,no dark,no blind"
@@ -3656,17 +3652,19 @@ LoopOnChartEnd=true
CurrentBeatFormat="%s:\n %.5f\n"
CurrentSecondFormat="%s:\n %.5f\n"
SnapToFormat="%s:\n %s\n"
SnapToFormat="%s: %s\n"
SelectionBeatBeginFormat="%s:\n %.5f"
SelectionBeatUnfinishedFormat=" ...\n"
SelectionBeatEndFormat="-%.5f\n"
DifficultyFormat="%s:\n %s\n"
RoutinePlayerFormat="%s:\n %d\n"
DescriptionFormat="%s:\n %s\n"
StepAuthorFormat="%s:\n %s\n"
ChartStyleFormat="%s:\n %s\n"
MainTitleFormat="%s:\n %s\n"
SubtitleFormat="%s:\n %s\n"
TapNoteTypeFormat="%s: %s\n"
SegmentTypeFormat="%s: %s\n"
NumStepsFormat="%s: %d\n"
NumJumpsFormat="%s: %d\n"
NumHoldsFormat="%s: %d\n"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

@@ -1,512 +0,0 @@
local t = Def.ActorFrame{}
local newBPS;
local oldBPS;
-- DECORATIONS ////////////////////////
-- Left Hex Corner Decoration
t[#t+1] = LoadActor("decoration_corner") .. {
InitCommand=cmd(visible,GAMESTATE:IsHumanPlayer(PLAYER_1));
OnCommand=cmd(horizalign,left;x,SCREEN_LEFT;vertalign,top;y,SCREEN_TOP;zoomy,0.4;zoomx,0.6;diffusealpha,0.3;blend,Blend.Add);
};
-- Right Hex Corner Decoration
t[#t+1] = LoadActor("decoration_corner") .. {
InitCommand=cmd(visible,GAMESTATE:IsHumanPlayer(PLAYER_2));
OnCommand=cmd(horizalign,left;x,SCREEN_RIGHT;vertalign,top;y,SCREEN_TOP;zoomy,0.4;;zoomx,-0.6;diffusealpha,0.3;blend,Blend.Add);
};
-- WAVY LINE (thanks AJ) ////////////////////////
--P1
t[#t+1] = LoadActor("hot_lores") .. {
OnCommand=cmd(diffusealpha,0;visible,GAMESTATE:IsHumanPlayer(PLAYER_1);horizalign,left;x,SCREEN_LEFT+18;vertalign,top;y,SCREEN_TOP+16;zoomtowidth,SCREEN_WIDTH/2-26;texcoordvelocity,0.1,0;queuecommand,"Begin");
BeginCommand=function(self)
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:visible(false);
else
local move = GAMESTATE:GetSongBPS()/2
if GAMESTATE:GetSongFreeze() then
move = 0;
end
self:texcoordvelocity(move,0);
self:sleep(0.001);
self:queuecommand("Begin");
end;
end;
LifeChangedMessageCommand=function(self,params)
if params.Player == PLAYER_1 then
local lifeP1=params.LifeMeter:GetLife();
if lifeP1>=THEME:GetMetric("LifeMeterBar", "HotValue") then
self:diffusealpha(0.5);
else
self:diffusealpha(0);
end;
end;
end;
};
--P2
t[#t+1] = LoadActor("hot_lores") .. {
OnCommand=cmd(diffusealpha,0;visible,GAMESTATE:IsHumanPlayer(PLAYER_2);horizalign,left;x,SCREEN_RIGHT-18;vertalign,top;y,SCREEN_TOP+16;zoomtowidth,(SCREEN_WIDTH/2-26)*-1;texcoordvelocity,0.1,0;queuecommand,"Begin");
BeginCommand=function(self)
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:visible(false);
else
local move = GAMESTATE:GetSongBPS()/2
if GAMESTATE:GetSongFreeze() then
move = 0;
end
self:texcoordvelocity(move,0);
self:sleep(0.001);
self:queuecommand("Begin");
end;
end;
LifeChangedMessageCommand=function(self,params)
if params.Player == PLAYER_2 then
local lifeP2=params.LifeMeter:GetLife();
if lifeP2>=THEME:GetMetric("LifeMeterBar", "HotValue") then
self:diffusealpha(0.5);
else
self:diffusealpha(0);
end;
end;
end;
};
--Double
--customtexturerect,0,0,[PixelsToCoverWidth]/[ImageWidth],[PixelsToCoverHeight]/[ImageHeight]
--I said that I was gonna write it down. thx midi
t[#t+1] = LoadActor("hot_lores") .. {
OnCommand=cmd(diffusealpha,0;horizalign,left;x,SCREEN_LEFT+18;vertalign,top;y,SCREEN_TOP+16;zoomtowidth,SCREEN_WIDTH-36;texcoordvelocity,0.1,0;customtexturerect,0,0,600/(SCREEN_WIDTH-36),1;queuecommand,"Begin");
BeginCommand=function(self)
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
local move = GAMESTATE:GetSongBPS()/2
if GAMESTATE:GetSongFreeze() then
move = 0;
end
self:texcoordvelocity(move,0);
self:sleep(0.001);
self:queuecommand("Begin");
else
self:visible(false);
end;
end;
LifeChangedMessageCommand=function(self,params)
local life=params.LifeMeter:GetLife();
if life>=THEME:GetMetric("LifeMeterBar", "HotValue") then
self:diffusealpha(0.5);
else
self:diffusealpha(0);
end;
end;
};
-- DANGER ////////////////////////
--DANGER P1 single
t[#t+1] = LoadActor("danger") .. {
InitCommand=cmd(visible,GAMESTATE:IsHumanPlayer(PLAYER_1);horizalign,left;x,SCREEN_LEFT+18;vertalign,top;y,SCREEN_TOP+16;zoomtowidth,SCREEN_WIDTH/2-26;zoomy,0.5);
OnCommand=cmd(effectclock,"bgm";diffusealpha,1;linear,0.2;diffusealpha,0.25;linear,0.2;diffusealpha,1;queuecommand,"On");
LifeChangedMessageCommand=function(self,params)
if params.Player == PLAYER_1 then
local lifeP1 = params.LifeMeter:GetLife();
if lifeP1 <= THEME:GetMetric("LifeMeterBar", "DangerThreshold") then
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:visible(false);
else
self:visible(true);
end;
else
self:visible(false);
end;
end;
end;
};
--DANGER P2 single
t[#t+1] = LoadActor("danger") .. {
InitCommand=cmd(visible,GAMESTATE:IsHumanPlayer(PLAYER_2);horizalign,right;x,SCREEN_RIGHT-18;vertalign,top;y,SCREEN_TOP+16;zoomtowidth,SCREEN_WIDTH/2-26;zoomy,0.5);
OnCommand=cmd(effectclock,"bgm";diffusealpha,1;linear,0.2;diffusealpha,0.25;linear,0.2;diffusealpha,1;queuecommand,"On");
LifeChangedMessageCommand=function(self,params)
if params.Player == PLAYER_2 then
local lifeP2 = params.LifeMeter:GetLife();
if lifeP2 <= THEME:GetMetric("LifeMeterBar", "DangerThreshold") then
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:visible(false);
else
self:visible(true);
end;
else
self:visible(false);
end;
end;
end;
};
--DANGER double
t[#t+1] = LoadActor("danger") .. {
InitCommand=cmd(visible,false;horizalign,center;x,SCREEN_CENTER_X;vertalign,top;y,SCREEN_TOP+16;zoomtowidth,SCREEN_WIDTH-36;zoomy,0.5);
OnCommand=cmd(effectclock,"bgm";diffusealpha,1;linear,0.2;diffusealpha,0.25;linear,0.2;diffusealpha,1;queuecommand,"On");
LifeChangedMessageCommand=function(self,params)
local life = params.LifeMeter:GetLife();
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
if life <= THEME:GetMetric("LifeMeterBar", "DangerThreshold") then
self:visible(true);
else
self:visible(false);
end;
end;
end;
};
-- METERS ////////////////////////
---basemeter masked P1
t[#t+1] = LoadActor("basemeter") .. {
InitCommand=cmd(visible,GAMESTATE:IsHumanPlayer(PLAYER_1);horizalign,left;x,SCREEN_LEFT+18;valign,0.5;y,SCREEN_TOP+41;zoomy,0.5;blend,Blend.Add);
OnCommand=cmd(bounce;effectmagnitude,-40,0,0;effectclock,"bgm";effecttiming,2,0,0,0;);
LifeChangedMessageCommand=function(self,params)
if params.Player == PLAYER_1 then
local style = GAMESTATE:GetCurrentStyle();
local lifeP1 = params.LifeMeter:GetLife();
if GAMESTATE:IsHumanPlayer(PLAYER_1)==true then
if lifeP1==0 then
self:visible(false);
else
if lifeP1==1 then
self:effectmagnitude(0,0,0);
else
self:effectmagnitude(-40,0,0);
end;
self:visible(true);
end
end
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:zoomtowidth((SCREEN_WIDTH-40)*lifeP1+5);
else
self:zoomtowidth((SCREEN_WIDTH/2-26)*lifeP1);
end;
end;
end;
};
---basemeter masked P2
t[#t+1] = LoadActor("basemeter") .. {
InitCommand=cmd(visible,GAMESTATE:IsHumanPlayer(PLAYER_2);horizalign,right;x,SCREEN_RIGHT+18;valign,0.5;y,SCREEN_TOP+41;zoomy,0.5;blend,Blend.Add;queuecommand,"Set");
OnCommand=cmd(bob;effectmagnitude,40,0,0;effectclock,"bgm";effecttiming,1,0,0,0;);
SetCommand=function(self,params)
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:effectmagnitude(-40,0,0);
self:horizalign(left);
self:x(SCREEN_LEFT+18);
end;
end;
LifeChangedMessageCommand=function(self,params)
if params.Player == PLAYER_2 then
local style = GAMESTATE:GetCurrentStyle();
local lifeP2 = params.LifeMeter:GetLife();
if GAMESTATE:IsHumanPlayer(PLAYER_2)==true then
if lifeP2==0 then
self:visible(false);
else
if lifeP2==1 then
self:effectmagnitude(0,0,0);
else
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:effectmagnitude(-40,0,0);
else
self:effectmagnitude(40,0,0);
end
end;
self:visible(true);
end
end
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:zoomtowidth((SCREEN_WIDTH-40)*lifeP2);
else
self:zoomtowidth(((SCREEN_WIDTH/2-26)*lifeP2)+40);
end;
end;
end;
};
-- FRAMES & TIPS ////////////////////////
-- Left Corner
t[#t+1] = LoadActor("mask") .. {
OnCommand=cmd(horizalign,right;x,SCREEN_LEFT+130;vertalign,top;y,SCREEN_TOP+12;zoom,0.45;queuecommand,"Set");
SetCommand = function(self)
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:visible(true);
else
if GAMESTATE:IsHumanPlayer(PLAYER_1) == true then
self:visible(true);
else
self:visible(false);
end;
end;
end;
};
-- Right Corner
t[#t+1] = LoadActor("mask") .. {
OnCommand=cmd(horizalign,right;x,SCREEN_RIGHT-130;vertalign,top;y,SCREEN_TOP+12;zoomx,-0.45;zoomy,0.45;queuecommand,"Set");
SetCommand = function(self)
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:visible(true);
else
if GAMESTATE:IsHumanPlayer(PLAYER_2) == true then
self:visible(true);
else
self:visible(false);
end;
end;
end;
};
-- Left Corner
t[#t+1] = LoadActor("corner") .. {
OnCommand=cmd(horizalign,left;x,SCREEN_LEFT+15;vertalign,top;y,SCREEN_TOP+16;zoom,0.75;queuecommand,"Set");
SetCommand = function(self)
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:visible(true);
else
if GAMESTATE:IsHumanPlayer(PLAYER_1) == true then
self:visible(true);
else
self:visible(false);
end;
end;
end;
};
-- Right Corner
t[#t+1] = LoadActor("corner") .. {
OnCommand=cmd(horizalign,left;x,SCREEN_RIGHT-15;vertalign,top;y,SCREEN_TOP+16;zoomx,-0.75;zoomy,0.75;queuecommand,"Set");
SetCommand = function(self)
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:visible(true);
else
if GAMESTATE:IsHumanPlayer(PLAYER_2) == true then
self:visible(true);
else
self:visible(false);
end;
end;
end;
};
-- Center Corner Left
t[#t+1] = LoadActor("center") .. {
OnCommand=cmd(horizalign,left;x,SCREEN_CENTER_X+5;vertalign,top;y,SCREEN_TOP+16;zoomx,-0.75;zoomy,0.75;queuecommand,"Set");
SetCommand = function(self)
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:visible(false);
else
if GAMESTATE:IsHumanPlayer(PLAYER_1) == true then
self:visible(true);
else
self:visible(false);
end;
end;
end;
};
-- Center Corner Right
t[#t+1] = LoadActor("center") .. {
OnCommand=cmd(horizalign,left;x,SCREEN_CENTER_X-5;vertalign,top;y,SCREEN_TOP+16;zoom,0.75;queuecommand,"Set");
SetCommand = function(self)
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:visible(false);
else
if GAMESTATE:IsHumanPlayer(PLAYER_2) == true then
self:visible(true);
else
self:visible(false);
end;
end;
end;
};
-- Center part 1
t[#t+1] = LoadActor("frame") .. {
OnCommand=cmd(visible,GAMESTATE:IsHumanPlayer(PLAYER_1);horizalign,left;x,SCREEN_LEFT+52.5;vertalign,top;y,SCREEN_TOP+16;zoomtowidth,SCREEN_WIDTH/2-85;zoomy,0.75;queuecommand,"Set";);
SetCommand = function(self)
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:zoomtowidth(SCREEN_WIDTH-105);
self:visible(true)
else
if GAMESTATE:IsHumanPlayer(PLAYER_1) == false then
self:visible(false)
else
self:visible(true)
end
end;
end;
};
-- Center part 2
t[#t+1] = LoadActor("frame") .. {
OnCommand=cmd(horizalign,right;x,SCREEN_RIGHT-52.5;vertalign,top;y,SCREEN_TOP+16;zoomtowidth,SCREEN_WIDTH/2-85;zoomy,0.75;queuecommand,"Set";);
SetCommand = function(self)
local style = GAMESTATE:GetCurrentStyle();
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:visible(false)
else
if GAMESTATE:IsHumanPlayer(PLAYER_2) == true then
self:visible(true)
else
self:visible(false)
end;
end;
end;
};
---tip P1
t[#t+1] = LoadActor("tip") .. {
InitCommand=cmd(visible,GAMESTATE:IsHumanPlayer(PLAYER_1);valign,0.5;y,SCREEN_TOP+41;zoom,0.5;blend,Blend.Add;queuecommand,"Set");
--OnCommand=cmd(bob;effectmagnitude,-40,0,0;effectclock,"bgm";effecttiming,1,0,0,0;);
LifeChangedMessageCommand=function(self,params)
if params.Player == PLAYER_1 then
local style = GAMESTATE:GetCurrentStyle();
local lifeP1 = params.LifeMeter:GetLife();
if GAMESTATE:IsHumanPlayer(PLAYER_1)==true then
if lifeP1==0 then
self:visible(false);
else
self:visible(true);
end
end
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:x((SCREEN_WIDTH-40)*lifeP1+20);
else
self:x((SCREEN_WIDTH/2-26)*lifeP1+20);
end;
end;
end;
};
---tip P2
t[#t+1] = LoadActor("tip") .. {
InitCommand=cmd(visible,GAMESTATE:IsHumanPlayer(PLAYER_2);valign,0.5;y,SCREEN_TOP+41;zoom,0.5;blend,Blend.Add;);
--OnCommand=cmd(bob;effectmagnitude,40,0,0;effectclock,"bgm";effecttiming,1,0,0,0;);
LifeChangedMessageCommand=function(self,params)
if params.Player == PLAYER_2 then
local style = GAMESTATE:GetCurrentStyle();
local lifeP2 = params.LifeMeter:GetLife();
local fullstate;
if GAMESTATE:IsHumanPlayer(PLAYER_2)==true then
if lifeP2==0 then
self:visible(false);
else
self:visible(true);
end
end
if style:GetStyleType() == "StyleType_OnePlayerTwoSides" then
self:x((SCREEN_WIDTH-40)*lifeP2+20);
else
self:x(SCREEN_RIGHT-((SCREEN_WIDTH/2-26)*lifeP2)-20);
end;
end;
end;
};
-- NAMES ////////////////////////
--P1 NAME
t[#t+1] = LoadFont("Common Normal") .. {
InitCommand=cmd(horizalign,left;x,SCREEN_LEFT+30;y,SCREEN_TOP+15;zoom,0.4;shadowlength,1;uppercase,true);
BeginCommand=function(self)
local profile = PROFILEMAN:GetProfile(PLAYER_1);
local name = profile:GetDisplayName();
if GAMESTATE:IsHumanPlayer(PLAYER_1) == true then
if name=="" then
self:settext("Player 1");
else
self:settext( name );
end
end
end;
};
--P2 NAME
t[#t+1] = LoadFont("Common Normal") .. {
InitCommand=cmd(horizalign,right;x,SCREEN_RIGHT-30;y,SCREEN_TOP+15;zoom,0.4;shadowlength,1;uppercase,true);
BeginCommand=function(self)
local profile = PROFILEMAN:GetProfile(PLAYER_2);
local name = profile:GetDisplayName();
if GAMESTATE:IsHumanPlayer(PLAYER_2) == true then
if name=="" then
self:settext("Player 2");
else
self:settext( name );
end
end
end;
};
return t
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

@@ -1,250 +0,0 @@
local c;
local player = Var "Player";
local bShowProtiming = GetUserPrefB("UserPrefProtiming" .. ToEnumShortString(player) );
local function MakeAverage( t )
local sum = 0;
for i=1,#t do
sum = sum + t[i];
end
return sum / #t
end
-- New
local function PosCount( t )
local Count = 0;
for i=1,#t do
if t[i] > 0 then Count = Count + 1 end
end
return Count
end
local function NegCount( t )
local Count = 0;
for i=1,#t do
if t[i] < 0 then Count = Count + 1 end
end
return Count
end
local function StdDev( t )
local avg = MakeAverage( t );
local sum = 0;
for i=1,#t do
sum = sum + math.pow(t[i] - avg, 2);
end
return math.sqrt(sum / (#t - 1))
end
--
local tTotalJudgments = {};
-- Global?
--[[ tPlayerData = {};
for pn in ivalues(GAMESTATE:GetHumanPlayers())
tPlayerData[pn].SignedJudgments = {};
tPlayerData[pn].AverageDifference = 0;
tPlayerData[pn].AbsoluteDifference = 0;
tPlayerData[pn].StandardDeviation = 0;
tPlayerData[pn].StandardDeviation = 0;
tPlayerData[pn].Early = 0;
tPlayerData[pn].Late = 0;
end ]]
--
local JudgeCmds = {
TapNoteScore_W1 = THEME:GetMetric( "Judgment", "JudgmentW1Command" );
TapNoteScore_W2 = THEME:GetMetric( "Judgment", "JudgmentW2Command" );
TapNoteScore_W3 = THEME:GetMetric( "Judgment", "JudgmentW3Command" );
TapNoteScore_W4 = THEME:GetMetric( "Judgment", "JudgmentW4Command" );
TapNoteScore_W5 = THEME:GetMetric( "Judgment", "JudgmentW5Command" );
TapNoteScore_Miss = THEME:GetMetric( "Judgment", "JudgmentMissCommand" );
};
local ProtimingCmds = {
TapNoteScore_W1 = THEME:GetMetric( "Protiming", "ProtimingW1Command" );
TapNoteScore_W2 = THEME:GetMetric( "Protiming", "ProtimingW2Command" );
TapNoteScore_W3 = THEME:GetMetric( "Protiming", "ProtimingW3Command" );
TapNoteScore_W4 = THEME:GetMetric( "Protiming", "ProtimingW4Command" );
TapNoteScore_W5 = THEME:GetMetric( "Protiming", "ProtimingW5Command" );
TapNoteScore_Miss = THEME:GetMetric( "Protiming", "ProtimingMissCommand" );
};
local AverageCmds = {
Pulse = THEME:GetMetric( "Protiming", "AveragePulseCommand" );
};
local TNSFrames = {
TapNoteScore_W1 = 0;
TapNoteScore_W2 = 1;
TapNoteScore_W3 = 2;
TapNoteScore_W4 = 3;
TapNoteScore_W5 = 4;
TapNoteScore_Miss = 5;
};
local t = Def.ActorFrame {};
t[#t+1] = Def.ActorFrame {
LoadActor(THEME:GetPathG("Judgment","Normal")) .. {
Name="Judgment";
InitCommand=cmd(pause;visible,false);
OnCommand=THEME:GetMetric("Judgment","JudgmentOnCommand");
ResetCommand=cmd(finishtweening;stopeffect;visible,false);
};
LoadFont("Combo Numbers") .. {
Name="ProtimingDisplay";
Text="";
InitCommand=cmd(visible,false);
OnCommand=THEME:GetMetric("Protiming","ProtimingOnCommand");
ResetCommand=cmd(finishtweening;stopeffect;visible,false);
};
LoadFont("Common Normal") .. {
Name="ProtimingAverage";
Text="";
InitCommand=cmd(visible,false);
OnCommand=THEME:GetMetric("Protiming","AverageOnCommand");
ResetCommand=cmd(finishtweening;stopeffect;visible,false);
};
Def.Quad {
Name="ProtimingGraphBG";
InitCommand=cmd(visible,false;y,32;zoomto,192,16);
ResetCommand=cmd(finishtweening;diffusealpha,0.8;visible,false);
OnCommand=cmd(diffuse,Color("Black");diffusetopedge,color("0.1,0.1,0.1,1");diffusealpha,0.8;shadowlength,2;);
};
Def.Quad {
Name="ProtimingGraphWindowW3";
InitCommand=cmd(visible,false;y,32;zoomto,192-4,16-4);
ResetCommand=cmd(finishtweening;diffusealpha,1;visible,false);
OnCommand=cmd(diffuse,GameColor.Judgment["JudgmentLine_W3"];);
};
Def.Quad {
Name="ProtimingGraphWindowW2";
InitCommand=cmd(visible,false;y,32;zoomto,scale(PREFSMAN:GetPreference("TimingWindowSecondsW2"),0,PREFSMAN:GetPreference("TimingWindowSecondsW3"),0,192-4),16-4);
ResetCommand=cmd(finishtweening;diffusealpha,1;visible,false);
OnCommand=cmd(diffuse,GameColor.Judgment["JudgmentLine_W2"];);
};
Def.Quad {
Name="ProtimingGraphWindowW1";
InitCommand=cmd(visible,false;y,32;zoomto,scale(PREFSMAN:GetPreference("TimingWindowSecondsW1"),0,PREFSMAN:GetPreference("TimingWindowSecondsW3"),0,192-4),16-4);
ResetCommand=cmd(finishtweening;diffusealpha,1;visible,false);
OnCommand=cmd(diffuse,GameColor.Judgment["JudgmentLine_W1"];);
};
Def.Quad {
Name="ProtimingGraphUnderlay";
InitCommand=cmd(visible,false;y,32;zoomto,192-4,16-4);
ResetCommand=cmd(finishtweening;diffusealpha,0.25;visible,false);
OnCommand=cmd(diffuse,Color("Black");diffusealpha,0.25);
};
Def.Quad {
Name="ProtimingGraphFill";
InitCommand=cmd(visible,false;y,32;zoomto,0,16-4;horizalign,left;);
ResetCommand=cmd(finishtweening;diffusealpha,1;visible,false);
OnCommand=cmd(diffuse,Color("Red"););
};
Def.Quad {
Name="ProtimingGraphAverage";
InitCommand=cmd(visible,false;y,32;zoomto,2,7;);
ResetCommand=cmd(finishtweening;diffusealpha,0.85;visible,false);
OnCommand=cmd(diffuse,Color("Orange");diffusealpha,0.85);
};
Def.Quad {
Name="ProtimingGraphCenter";
InitCommand=cmd(visible,false;y,32;zoomto,2,16-4;);
ResetCommand=cmd(finishtweening;diffusealpha,1;visible,false);
OnCommand=cmd(diffuse,Color("White");diffusealpha,1);
};
InitCommand = function(self)
c = self:GetChildren();
end;
JudgmentMessageCommand=function(self, param)
if param.Player ~= player then return end;
if param.HoldNoteScore then return end;
local iNumStates = c.Judgment:GetNumStates();
local iFrame = TNSFrames[param.TapNoteScore];
if not iFrame then return end
if iNumStates == 12 then
iFrame = iFrame * 2;
if not param.Early then
iFrame = iFrame + 1;
end
end
local fTapNoteOffset = param.TapNoteOffset;
if param.HoldNoteScore then
fTapNoteOffset = 1;
else
fTapNoteOffset = param.TapNoteOffset;
end
if param.TapNoteScore == 'TapNoteScore_Miss' then
fTapNoteOffset = 1;
bUseNegative = true;
else
-- fTapNoteOffset = fTapNoteOffset;
bUseNegative = false;
end;
if fTapNoteOffset ~= 1 then
-- we're safe, you can push the values
tTotalJudgments[#tTotalJudgments+1] = bUseNegative and fTapNoteOffset or math.abs( fTapNoteOffset );
-- New
-- tPlayerData[player].SignedJudgments[#(tPlayerData[player].SignedJudgments)+1] = fTapNoteOffset;
-- table.getn(tPlayerData[player].SignedJudgments = bUseNegative and fTapNoteOffset or fTapNoteOffset;
end
self:playcommand("Reset");
c.Judgment:visible( not bShowProtiming );
c.Judgment:setstate( iFrame );
JudgeCmds[param.TapNoteScore](c.Judgment);
c.ProtimingDisplay:visible( bShowProtiming );
c.ProtimingDisplay:settextf("%i",math.abs(fTapNoteOffset * 1000));
ProtimingCmds[param.TapNoteScore](c.ProtimingDisplay);
c.ProtimingAverage:visible( bShowProtiming );
c.ProtimingAverage:settextf("%.2f%%",clamp(100 - MakeAverage( tTotalJudgments ) * 1000 ,0,100));
AverageCmds['Pulse'](c.ProtimingAverage);
c.ProtimingGraphBG:visible( bShowProtiming );
c.ProtimingGraphUnderlay:visible( bShowProtiming );
c.ProtimingGraphWindowW3:visible( bShowProtiming );
c.ProtimingGraphWindowW2:visible( bShowProtiming );
c.ProtimingGraphWindowW1:visible( bShowProtiming );
c.ProtimingGraphFill:visible( bShowProtiming );
c.ProtimingGraphFill:finishtweening();
c.ProtimingGraphFill:decelerate(1/60);
-- c.ProtimingGraphFill:zoomtowidth( clamp(fTapNoteOffset * 188,-188/2,188/2) );
c.ProtimingGraphFill:zoomtowidth( clamp(
scale(
fTapNoteOffset,
0,PREFSMAN:GetPreference("TimingWindowSecondsW3"),
0,188/2),
-188/2,188/2)
);
c.ProtimingGraphAverage:visible( bShowProtiming );
c.ProtimingGraphAverage:zoomtowidth( clamp(
scale(
MakeAverage( tTotalJudgments ),
0,PREFSMAN:GetPreference("TimingWindowSecondsW3"),
0,188),
0,188)
);
-- c.ProtimingGraphAverage:zoomtowidth( clamp(MakeAverage( tTotalJudgments ) * 1880,0,188) );
c.ProtimingGraphCenter:visible( bShowProtiming );
(cmd(sleep,2;linear,0.5;diffusealpha,0))(c.ProtimingGraphBG);
(cmd(sleep,2;linear,0.5;diffusealpha,0))(c.ProtimingGraphUnderlay);
(cmd(sleep,2;linear,0.5;diffusealpha,0))(c.ProtimingGraphWindowW3);
(cmd(sleep,2;linear,0.5;diffusealpha,0))(c.ProtimingGraphWindowW2);
(cmd(sleep,2;linear,0.5;diffusealpha,0))(c.ProtimingGraphWindowW1);
(cmd(sleep,2;linear,0.5;diffusealpha,0))(c.ProtimingGraphFill);
(cmd(sleep,2;linear,0.5;diffusealpha,0))(c.ProtimingGraphAverage);
(cmd(sleep,2;linear,0.5;diffusealpha,0))(c.ProtimingGraphCenter);
end;
};
return t;
+2 -2
View File
@@ -1,5 +1,5 @@
[Global]
FallbackTheme=default
[ScreenGameplay]
LifeP1OnCommand=visible,false
LifeP2OnCommand=visible,false
# LifeP1OnCommand=visible,false
# LifeP2OnCommand=visible,false
@@ -50,7 +50,9 @@ 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 = {
@@ -76,6 +78,7 @@ local shoutout = {
"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
-- "Can't stop crying... buckets of tears!"
"#KBO",
"AJ Kelly, without which this game would have never been.",
"You showed us... your ultimate dance",
}
@@ -58,11 +58,11 @@ end;
-- xxx: this only currently works for player 1. -aj
local t = Def.ActorFrame {};
t[#t+1] = Def.ActorFrame {
InitCommand=cmd(x,WideScale(math.floor(SCREEN_CENTER_X*0.3)-8,math.floor(SCREEN_CENTER_X*0.5)-8);y,SCREEN_CENTER_Y);
InitCommand=cmd(x,WideScale(math.floor(SCREEN_CENTER_X*0.3)-8,math.floor(SCREEN_CENTER_X*0.5)-8);y,SCREEN_CENTER_Y-34);
CreateStats( PLAYER_1 );
};
t[#t+1] = Def.ActorFrame {
InitCommand=cmd(x,WideScale(math.floor(SCREEN_CENTER_X*1.7)+8,math.floor(SCREEN_CENTER_X*1.5)+8);y,SCREEN_CENTER_Y);
InitCommand=cmd(x,WideScale(math.floor(SCREEN_CENTER_X*1.7)+8,math.floor(SCREEN_CENTER_X*1.5)+8);y,SCREEN_CENTER_Y-34);
CreateStats( PLAYER_2 );
};
return t
@@ -1,4 +1,4 @@
local function CreateStops()
local function CreateStops(Player)
local t = Def.ActorFrame { };
local bars = Def.ActorFrame{ };
local bpmFrame = Def.ActorFrame{ Name="BPMFrame"; };
@@ -7,10 +7,13 @@ local function CreateStops()
local fFrameWidth = 380;
local fFrameHeight = 8;
-- XXX: doesn't work in course mode -aj
if not GAMESTATE:IsCourseMode() then
if not GAMESTATE:IsSideJoined( Player ) then
return t
elseif not GAMESTATE:IsCourseMode() then
-- Straight rip off NCRX
local song = GAMESTATE:GetCurrentSong();
local timingData = song:GetTimingData();
local steps = GAMESTATE:GetCurrentSteps( Player );
local timingData = steps:GetTimingData();
-- if we're using SSC, might as well use the StepsSeconds, which will
-- almost always be more proper than a r21'd file.
if song then
@@ -84,9 +87,10 @@ local function CreateStops()
return t
end
local t = LoadFallbackB()
t[#t+1] = StandardDecorationFromFileOptional("ScoreFrame","ScoreFrame");
for pn in ivalues(PlayerNumber) do
-- local MetricsName = "SongMeterDisplay" .. PlayerNumberToString(pn);
--[[ t[#t+1] = Def.ActorFrame {
local MetricsName = "SongMeterDisplay" .. PlayerNumberToString(pn);
t[#t+1] = Def.ActorFrame {
InitCommand=function(self)
self:player(pn);
self:name(MetricsName);
@@ -117,8 +121,10 @@ for pn in ivalues(PlayerNumber) do
};
Tip=LoadActor( THEME:GetPathG( 'SongMeterDisplay', 'tip ' .. PlayerNumberToString(pn) ) ) .. { InitCommand=cmd(visible,false); };
};
CreateStops();
}; --]]
CreateStops(pn) .. {
-- InitCommand=cmd(draworder,10);
};
};
end;
for pn in ivalues(PlayerNumber) do
local MetricsName = "ToastyDisplay" .. PlayerNumberToString(pn);
@@ -131,12 +137,12 @@ for pn in ivalues(PlayerNumber) do
};
end;
t[#t+1] = StandardDecorationFromFileOptional("ScoreFrame","ScoreFrame");
t[#t+1] = StandardDecorationFromFileOptional("BPMDisplay","BPMDisplay");
t[#t+1] = StandardDecorationFromFileOptional("StageDisplay","StageDisplay");
t[#t+1] = StandardDecorationFromFileOptional("SongTitle","SongTitle");
t[#t+1] = Def.ActorFrame {
--[[ t[#t+1] = Def.ActorFrame {
InitCommand=function(self)
self:name("SongMeterDisplay");
ActorUtil.LoadAllCommandsAndSetXY(self,Var "LoadingScreen");
@@ -167,7 +173,7 @@ t[#t+1] = Def.ActorFrame {
Tip=LoadActor( THEME:GetPathG( 'SongMeterDisplay', 'tip ' .. PlayerNumberToString(PLAYER_1) ) ) .. { InitCommand=cmd(visible,false); };
};
CreateStops();
};
}; --]]
if( not GAMESTATE:IsCourseMode() ) then
t[#t+1] = Def.Actor{
JudgmentMessageCommand = function(self, params)
@@ -8,5 +8,25 @@ t[#t+1] = StandardDecorationFromFileOptional("LifeDifficulty","LifeDifficulty");
t[#t+1] = StandardDecorationFromFileOptional("TimingDifficulty","TimingDifficulty");
t[#t+1] = StandardDecorationFromFileOptional("NetworkStatus","NetworkStatus");
t[#t+1] = StandardDecorationFromFileOptional("SystemDirection","SystemDirection");
--
t[#t+1] = StandardDecorationFromFileOptional("NumSongs","NumSongs") .. {
SetCommand=function(self)
local InstalledSongs, AdditionalSongs, InstalledCourses, AdditionalCourses, Groups, Unlocked = 0;
if SONGMAN:GetRandomSong() then
InstalledSongs, AdditionalSongs, InstalledCourses, AdditionalCourses, Groups, Unlocked =
SONGMAN:GetNumSongs(),
SONGMAN:GetNumAdditionalSongs(),
SONGMAN:GetNumCourses(),
SONGMAN:GetNumAdditionalCourses(),
SONGMAN:GetNumSongGroups(),
SONGMAN:GetNumUnlockedSongs();
else
return
end
self:settextf("%i Songs (%i Groups), %i Courses", InstalledSongs, Groups, InstalledCourses);
-- self:settextf("%i (+%i) Songs (%i Groups), %i (+%i) Courses", InstalledSongs, AdditionalSongs, Groups, InstalledCourses, AdditionalCourses);
end;
};
return t
@@ -0,0 +1,80 @@
local function Clock()
function UpdateVisible(self)
local screen = SCREENMAN:GetTopScreen()
local bShow = true
if screen then
local sClass = screen:GetName()
bShow = THEME:GetMetric(sClass, "ShowClock")
end
if bShow then
self:smooth(0.25)
self:y(12)
else
self:smooth(0.25)
self:y(-56)
end
end
-- clock
clock = Def.ActorFrame {
Name="Clock",
InitCommand=cmd(x,50;y,12;playcommand,"Update"),
ScreenChangedMessageCommand=UpdateVisible,
UpdateCommand=cmd(runcommandsonleaves,cmd(queuecommand,"Update")),
Def.RoundedBox(90,26)..{ InitCommand=cmd(x,-22;y,-4) },
Def.ActorFrame {
Name="ClockText",
InitCommand=cmd(y,-2),
LoadFont("Common", "normal")..{
Text="00:00:",
InitCommand=cmd(horizalign,right;shadowlength,0;diffusebottomedge,color("0.9,0.9,0.9")),
UpdateCommand=function(self)
local hour, min = Hour(), Minute()
if hour > 12 and GetUserPrefB("Use12HourClock") then
hour = hour - 12
elseif hour == 0 and GetUserPrefB("Use12HourClock") then
hour = 12
end
self:settext(string.format('%02i:%02i:', hour, min))
self:sleep(1)
self:queuecommand("Update")
end
},
LoadFont("Common", "normal")..{
Text="00",
InitCommand=cmd(horizalign,left;shadowlength,0;diffusebottomedge,color("0.9,0.9,0.9")),
UpdateCommand=function(self)
local sec = Second()
self:settext(string.format('%02i', sec))
self:sleep(1)
self:queuecommand("Update")
end,
},
LoadFont("Common", "normal")..{
Text="",
InitCommand=cmd(x,28;y,-3;horizalign,left;shadowlength,0;diffusebottomedge,color("0.9,0.9,0.9");visible,false;zoom,0.75),
UpdateCommand=function(self)
if not GetUserPrefB("Use12HourClock") then
self:visible(false)
return
end
local hour = Hour()
if hour < 12 then
self:settext("AM")
self:diffuse(color("1,0.85,0,1"))
self:diffusebottomedge(color("0.75,0.55,0,1"))
else
self:settext("PM")
self:diffuse(color("0,0.85,1,1"))
self:diffusebottomedge(color("0,0.55,1,1"))
end
self:visible(true)
self:sleep(1)
self:queuecommand("Update")
end
}
}
}
return clock;
end
local t = Def.ActorFrame {};
return t;
@@ -1 +0,0 @@
local t = Def.ActorFrame {};
+2 -2
View File
@@ -83,8 +83,8 @@ local function CreatePaneDisplayGraph( _pnPlayer, _sLabel, _rcRadarCategory )
end;
};
LoadFont("Common Normal") .. {
InitCommand=cmd(x,40;zoom,0.5;);
OnCommand=cmd(shadowlength,1;);
InitCommand=cmd(x,14;zoom,0.45;halign,0;);
OnCommand=cmd(shadowlength,1;strokecolor,color("0.15,0.15,0.15,0.625"));
CurrentSongChangedMessageCommand=cmd(playcommand,"Set");
CurrentStepsP1ChangedMessageCommand=cmd(playcommand,"Set");
CurrentStepsP2ChangedMessageCommand=cmd(playcommand,"Set");
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

@@ -70,7 +70,7 @@ for idx,diff in pairs(Difficulty) do
Text=(sDifficulty == "Edit") and "0 Edits" or "0";
ShowCommand=cmd(stoptweening;linear,0.1;diffuse,CustomDifficultyToColor( sDifficulty ));
HideCommand=cmd(stoptweening;decelerate,0.2;diffuse,CustomDifficultyToDarkColor( sDifficulty ));
InitCommand=cmd(x,-64-8+tLocation[sDifficulty];shadowlength,1;zoom,0.5;diffuse,CustomDifficultyToColor( sDifficulty ));
InitCommand=cmd(x,-64-8+tLocation[sDifficulty];shadowlength,1;zoom,0.75;diffuse,CustomDifficultyToColor( sDifficulty ));
};
};
end
@@ -0,0 +1,2 @@
return LoadFont("Common Normal") .. {
};
@@ -0,0 +1,2 @@
return LoadFont("Common Normal") .. {
};
@@ -3,8 +3,8 @@ return Def.ActorFrame {
OnCommand=cmd(diffuse,color("#f7941d");diffusetopedge,color("#fff200");diffusealpha,0.25);
};
LoadFont("Common Normal") .. {
Text=ProductID();
AltText="";
Text="StepMania";
AltText="StepMania";
InitCommand=cmd(y,-5;zoom,0.6);
OnCommand=cmd(shadowlength,1);
};
@@ -0,0 +1 @@
_Music credits (loop)
Binary file not shown.
+14 -5
View File
@@ -507,6 +507,7 @@ ArtistPrependString=""
[ScreenDebugOverlay]
[ScreenSystemLayer]
ShowClock=true
CreditsP1OnCommand=horizalign,left;vertalign,bottom;zoom,0.675;shadowlength,1;diffusebottomedge,PlayerColor(PLAYER_1);
#
CreditsP2OnCommand=horizalign,right;vertalign,bottom;zoom,0.675;shadowlength,1;diffusebottomedge,PlayerColor(PLAYER_2);
@@ -612,6 +613,13 @@ CurrentGametypeY=SCREEN_HEIGHT*0.1575
CurrentGametypeOnCommand=vertalign,bottom;
CurrentGametypeOffCommand=linear,0.5;cropleft,1
#
ShowNumSongs=true
NumSongsX=SCREEN_WIDTH*0.99
NumSongsY=SCREEN_HEIGHT*0.1575+5
NumSongsOnCommand=vertalign,bottom;horizalign,right;zoom,0.5;playcommand,"Set"
NumSongsOffCommand=
#
#
ShowTimingDifficulty=true
TimingDifficultyX=SCREEN_LEFT+84
TimingDifficultyY=SCREEN_TOP+22
@@ -827,6 +835,7 @@ IconChoiceEndlessOffCommand=linear,0.1175;zoomx,0
[ScreenGameInformation]
[ScreenSelectMusic]
SampleMusicPreviewMode='SampleMusicPreviewMode_LastSong'
UsePlayerSelectMenu=false
# OptionsMenuAvailable=(getenv(sMode) ~= Oni)
SelectMenuAvailable=true
@@ -1306,18 +1315,18 @@ SongMeterDisplayOffCommand=
#
ShowSongTitle=true
SongTitleX=SCREEN_CENTER_X
SongTitleY=SCREEN_TOP+50+12
SongTitleOnCommand=draworder,55;shadowlength,1;basezoom,0.5;zoomy,0;sleep,1.5+0.5;smooth,0.5;zoom,1;y,SCREEN_TOP+50+12
SongTitleY=SCREEN_TOP+50
SongTitleOnCommand=draworder,55;shadowlength,1;basezoom,0.5;zoomy,0;sleep,1.5+0.5;smooth,0.5;zoom,1;y,SCREEN_TOP+50
SongTitleOffCommand=
#
SongMeterDisplayP1X=SCREEN_LEFT+16
SongMeterDisplayP1Y=SCREEN_CENTER_Y
SongMeterDisplayP1OnCommand=rotationz,-90;zoom,0;addx,-24;sleep,1.5;decelerate,0.5;zoom,1;addx,24
SongMeterDisplayP1OnCommand=draworder,5;rotationz,-90;zoom,0;addx,-24;sleep,1.5;decelerate,0.5;zoom,1;addx,24
SongMeterDisplayP1OffCommand=
#
SongMeterDisplayP2X=SCREEN_RIGHT-16
SongMeterDisplayP2Y=SCREEN_CENTER_Y
SongMeterDisplayP2OnCommand=rotationz,-90;zoom,0;addx,24;sleep,1.5;decelerate,0.5;zoom,1;addx,-24
SongMeterDisplayP2OnCommand=draworder,5;rotationz,-90;zoom,0;addx,24;sleep,1.5;decelerate,0.5;zoom,1;addx,-24
SongMeterDisplayP2OffCommand=
#
ShowBPMDisplay=true
@@ -1336,7 +1345,7 @@ StageDisplayOffCommand=bounceend,0.25;zoom,0
ShowScoreFrame=GetUserPrefB("GameplayFooter");
ScoreFrameX=SCREEN_CENTER_X
ScoreFrameY=SCREEN_BOTTOM+4
ScoreFrameOnCommand=draworder,100;vertalign,bottom;zoomtowidth,SCREEN_WIDTH+4;diffuse,color("#ffd400");addy,80;sleep,2;decelerate,0.5;addy,-80;
ScoreFrameOnCommand=draworder,4;vertalign,bottom;zoomtowidth,SCREEN_WIDTH+4;diffuse,color("#ffd400");addy,80;sleep,2;decelerate,0.5;addy,-80;
ScoreFrameOffCommand=
#
LifeP1X=Center1Player() and SCREEN_CENTER_X or THEME:GetMetric(Var "LoadingScreen","PlayerP1OnePlayerOneSideX")
Binary file not shown.
BIN
View File
Binary file not shown.
+2 -2
View File
@@ -211,8 +211,8 @@ Section "Main Section" SecMain
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\${PRODUCT_ID}" "" "$INSTDIR"
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_ID}" "DisplayName" "$(TEXT_IO_REMOVE_ONLY)"
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_ID}" "DisplayVersion" "$(PRODUCT_VER)"
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_ID}" "Comments" "sm-ssc is a rhythm game simulator (forked from StepMania)."
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_ID}" "Publisher" "the spinal shark collective"
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_ID}" "Comments" "StepMania 5 is a rhythm game simulator."
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_ID}" "Publisher" "StepMania Team"
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_ID}" "URLInfoAbout" "http://code.google.com/p/sm-ssc/"
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_ID}" "URLUpdateInfo" "http://code.google.com/p/sm-ssc/"
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_ID}" "UninstallString" '"$INSTDIR\uninstall.exe"'
+13
View File
@@ -91,6 +91,19 @@ bool AttackArray::ContainsTransformOrTurn() const
return false;
}
vector<RString> AttackArray::ToVectorString() const
{
vector<RString> ret;
FOREACH_CONST( Attack, *this, a )
{
ret.push_back(ssprintf("TIME=%f:LEN=%f:MODS=%s",
a->fStartSecond,
a->fSecsRemaining,
a->sModifiers.c_str()));
}
return ret;
}
/*
* (c) 2003-2004 Chris Danford
* All rights reserved.
+5
View File
@@ -71,6 +71,11 @@ struct AttackArray : public vector<Attack>
* @brief Determine if the list of attacks contains a transform or turn mod.
* @return true if it does, or false otherwise. */
bool ContainsTransformOrTurn() const;
/**
* @brief Return a string representation used for simfiles.
* @return the string representation. */
vector<RString> ToVectorString() const;
};
#endif
+16
View File
@@ -1045,6 +1045,22 @@ void NoteField::DrawPrimitives()
}
}
}
else
{
AttackArray &attacks = GAMESTATE->m_bIsUsingStepTiming ?
GAMESTATE->m_pCurSteps[PLAYER_1]->m_Attacks :
GAMESTATE->m_pCurSong->m_Attacks;
FOREACH_CONST(Attack, attacks, a)
{
float fBeat = timing.GetBeatFromElapsedTime(a->fStartSecond);
if (BeatToNoteRow(fBeat) >= iFirstRowToDraw &&
BeatToNoteRow(fBeat) <= iLastRowToDraw &&
IS_ON_SCREEN(fBeat))
{
this->DrawAttackText(fBeat, *a);
}
}
}
if( !GAMESTATE->m_bIsUsingStepTiming )
{
+17 -1
View File
@@ -334,7 +334,23 @@ static inline float ToBeat(int row) { return NoteRowToBeat(row); }
*/
static inline float ToBeat(float beat) { return beat; }
/**
* @brief Scales the position.
* @param T start - the starting row of the scaling region
* @param T length - the length of the scaling region
* @param T newLength - the new length of the scaling region
* @param T position - the position to scale
* @return T the scaled position
*/
template<typename T>
inline T ScalePosition( T start, T length, T newLength, T position )
{
if( position < start )
return position;
if( position >= start + length )
return position - length + newLength;
return start + (position - start) * newLength / length;
}
#endif
+18 -12
View File
@@ -10,7 +10,6 @@
#include "Song.h"
#include "SongManager.h"
#include "Steps.h"
#include "Attack.h"
#include "PrefsManager.h"
void SMLoader::SetSongTitle(const RString & title)
@@ -143,26 +142,31 @@ void SMLoader::ProcessBGChanges( Song &out, const RString &sValueName, const RSt
}
}
void SMLoader::ProcessAttacks( Song &out, MsdFile::value_t sParams )
void SMLoader::ProcessAttackString( vector<RString> & attacks, MsdFile::value_t params )
{
for( unsigned s=1; s < params.params.size(); ++s )
{
RString tmp = params[s];
Trim(tmp);
attacks.push_back( tmp );
}
}
void SMLoader::ProcessAttacks( AttackArray &attacks, MsdFile::value_t params )
{
// Build the RString vector here so we can write it to file again later
for( unsigned s=1; s < sParams.params.size(); ++s )
out.m_sAttackString.push_back( sParams[s] );
Attack attack;
float end = -9999;
for( unsigned j=1; j < sParams.params.size(); ++j )
for( unsigned j=1; j < params.params.size(); ++j )
{
vector<RString> sBits;
split( sParams[j], "=", sBits, false );
split( params[j], "=", sBits, false );
// Need an identifer and a value for this to work
if( sBits.size() < 2 )
continue;
TrimLeft( sBits[0] );
TrimRight( sBits[0] );
Trim( sBits[0] );
if( !sBits[0].CompareNoCase("TIME") )
attack.fStartSecond = strtof( sBits[1], NULL );
@@ -172,6 +176,7 @@ void SMLoader::ProcessAttacks( Song &out, MsdFile::value_t sParams )
end = strtof( sBits[1], NULL );
else if( !sBits[0].CompareNoCase("MODS") )
{
Trim(sBits[1]);
attack.sModifiers = sBits[1];
if( end != -9999 )
@@ -183,7 +188,7 @@ void SMLoader::ProcessAttacks( Song &out, MsdFile::value_t sParams )
if( attack.fSecsRemaining < 0.0f )
attack.fSecsRemaining = 0.0f;
out.m_Attacks.push_back( attack );
attacks.push_back( attack );
}
}
}
@@ -913,7 +918,8 @@ bool SMLoader::LoadFromSimfile( const RString &sPath, Song &out, bool bFromCache
// Attacks loaded from file
else if( sValueName=="ATTACKS" )
{
ProcessAttacks( out, sParams );
ProcessAttackString(out.m_sAttackString, sParams);
ProcessAttacks(out.m_Attacks, sParams);
}
else if( sValueName=="NOTES" || sValueName=="NOTES2" )
+13 -1
View File
@@ -3,6 +3,7 @@
#include "GameConstantsAndTypes.h"
#include "BackgroundUtil.h"
#include "Attack.h"
#include "MsdFile.h" // we require the struct from here.
class Song;
@@ -133,7 +134,18 @@ struct SMLoader
virtual void ProcessBGChanges( Song &out, const RString &sValueName,
const RString &sPath, const RString &sParam );
void ProcessAttacks( Song &out, MsdFile::value_t sParams );
/**
* @brief Put the attacks in the attacks string.
* @param attacks the attack string.
* @param params the params from the simfile. */
virtual void ProcessAttackString(vector<RString> &attacks, MsdFile::value_t params);
/**
* @brief Put the attacks in the attacks array.
* @param attacks the attacks array.
* @param params the params from the simfile. */
void ProcessAttacks( AttackArray &attacks, MsdFile::value_t params );
void ProcessInstrumentTracks( Song &out, const RString &sParam );
/**
+2 -1
View File
@@ -432,7 +432,8 @@ bool SMALoader::LoadFromSimfile( const RString &sPath, Song &out, bool bFromCach
// Attacks loaded from file
else if( sValueName=="ATTACKS" )
{
SMLoader::ProcessAttacks( out, sParams );
ProcessAttackString(out.m_sAttackString, sParams);
ProcessAttacks(out.m_Attacks, sParams);
}
else if( sValueName=="NOTES" || sValueName=="NOTES2" )
+4 -2
View File
@@ -344,7 +344,8 @@ bool SSCLoader::LoadFromSimfile( const RString &sPath, Song &out, bool bFromCach
// Attacks loaded from file
else if( sValueName=="ATTACKS" )
{
SMLoader::ProcessAttacks( out, sParams );
ProcessAttackString(out.m_sAttackString, sParams);
ProcessAttacks(out.m_Attacks, sParams);
}
else if( sValueName=="OFFSET" )
@@ -559,7 +560,8 @@ bool SSCLoader::LoadFromSimfile( const RString &sPath, Song &out, bool bFromCach
else if( sValueName=="ATTACKS" )
{
// Step Attacks aren't in yet.
ProcessAttackString(pNewNotes->m_sAttackString, sParams);
ProcessAttacks(pNewNotes->m_Attacks, sParams);
}
else if( sValueName=="OFFSET" )
+2
View File
@@ -26,6 +26,8 @@ const float VERSION_RADAR_FAKE = 0.53f;
const float VERSION_WARP_SEGMENT = 0.56f;
/** @brief The version that formally introduced Split Timing. */
const float VERSION_SPLIT_TIMING = 0.7f;
/** @brief The version that moved the step's Offset higher up. */
const float VERSION_OFFSET_BEFORE_ATTACK = 0.72f;
/**
* @brief The SSCLoader handles all of the parsing needed for .ssc files.
+13 -4
View File
@@ -317,12 +317,21 @@ static RString GetSSCNoteData( const Song &song, const Steps &in, bool bSavingCa
lines.push_back( ssprintf( "#RADARVALUES:%s;", join(",",asRadarValues).c_str() ) );
lines.push_back( ssprintf( "#CREDIT:%s;", SmEscape(in.GetCredit()).c_str() ) );
lines.push_back( ssprintf( "#OFFSET:%.6f;", in.m_Timing.m_fBeat0OffsetInSeconds ) );
GetTimingTags( lines, in.m_Timing );
// For now, attacks are NOT in use for the step.
lines.push_back( "#ATTACKS:;" );
lines.push_back( ssprintf( "#OFFSET:%.6f;", in.m_Timing.m_fBeat0OffsetInSeconds ) );
RString attacks = "";
for( unsigned a=0; a < in.m_sAttackString.size(); a++ )
{
RString sData = in.m_sAttackString[a];
attacks += sData;
if( a != (in.m_sAttackString.size() - 1) )
attacks += ":\r\n"; // Not the end, so write a divider ':'
}
Trim(attacks, ":"); // just in case something screwy happens.
lines.push_back( ssprintf( "#ATTACKS:%s;", attacks.c_str()));
RString sNoteData;
in.GetSMNoteData( sNoteData );
+4 -6
View File
@@ -960,8 +960,10 @@ void Player::Update( float fDeltaTime )
UpdateJudgedRows();
// Check for TapNote misses
UpdateTapNotesMissedOlderThan( GetMaxStepDistanceSeconds() );
if (!GAMESTATE->m_bInStepEditor)
{
UpdateTapNotesMissedOlderThan( GetMaxStepDistanceSeconds() );
}
// process transforms that are waiting to be applied
ApplyWaitingTransforms();
}
@@ -2973,10 +2975,6 @@ void Player::RandomizeNotes( int iNoteRow )
const int iSwapWith = RandomInt( iNumOfTracks );
// Make sure we're not swapping with ourselves.
if( t == iSwapWith )
continue;
// Make sure this is empty.
if( m_NoteData.FindTapNote(iSwapWith, iNewNoteRow) != m_NoteData.end(iSwapWith) )
continue;
+25 -6
View File
@@ -37,7 +37,7 @@ void PlayerOptions::Init()
m_fBlind = 0; m_SpeedfBlind = 1.0f;
m_fCover = 0; m_SpeedfCover = 1.0f;
m_fRandAttack = 0; m_SpeedfRandAttack = 1.0f;
m_fSongAttack = 0; m_SpeedfSongAttack = 1.0f;
m_fNoAttack = 0; m_SpeedfNoAttack = 1.0f;
m_fPlayerAutoPlay = 0; m_SpeedfPlayerAutoPlay = 1.0f;
m_bSetTiltOrSkew = false;
m_fPerspectiveTilt = 0; m_SpeedfPerspectiveTilt = 1.0f;
@@ -73,7 +73,7 @@ void PlayerOptions::Approach( const PlayerOptions& other, float fDeltaSeconds )
APPROACH( fBlind );
APPROACH( fCover );
APPROACH( fRandAttack );
APPROACH( fSongAttack );
APPROACH( fNoAttack );
APPROACH( fPlayerAutoPlay );
APPROACH( fPerspectiveTilt );
APPROACH( fSkew );
@@ -180,7 +180,7 @@ void PlayerOptions::GetMods( vector<RString> &AddTo, bool bForceNoteSkin ) const
AddPart( AddTo, m_fCover, "Cover" );
AddPart( AddTo, m_fRandAttack, "RandomAttacks" );
AddPart( AddTo, m_fSongAttack, "SongAttacks" );
AddPart( AddTo, m_fNoAttack, "NoAttacks" );
AddPart( AddTo, m_fPlayerAutoPlay, "PlayerAutoPlay" );
AddPart( AddTo, m_fPassmark, "Passmark" );
@@ -417,7 +417,7 @@ bool PlayerOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut
else if( sBit == "blind" ) SET_FLOAT( fBlind )
else if( sBit == "cover" ) SET_FLOAT( fCover )
else if( sBit == "randomattacks" ) SET_FLOAT( fRandAttack )
else if( sBit == "songattacks" ) SET_FLOAT( fSongAttack )
else if( sBit == "noattacks" ) SET_FLOAT( fNoAttack )
else if( sBit == "playerautoplay" ) SET_FLOAT( fPlayerAutoPlay )
else if( sBit == "passmark" ) SET_FLOAT( fPassmark )
else if( sBit == "overhead" ) { m_bSetTiltOrSkew = true; m_fSkew = 0; m_fPerspectiveTilt = 0; m_SpeedfSkew = m_SpeedfPerspectiveTilt = speed; }
@@ -657,7 +657,7 @@ bool PlayerOptions::operator==( const PlayerOptions &other ) const
COMPARE(m_fBlind);
COMPARE(m_fCover);
COMPARE(m_fRandAttack);
COMPARE(m_fSongAttack);
COMPARE(m_fNoAttack);
COMPARE(m_fPlayerAutoPlay);
COMPARE(m_fPerspectiveTilt);
COMPARE(m_fSkew);
@@ -712,6 +712,10 @@ bool PlayerOptions::IsEasierForSongAndSteps( Song* pSong, Steps* pSteps, PlayerN
// This makes songs with sparse notes easier.
if( m_bTransforms[TRANSFORM_ECHO] ) return true;
// Removing attacks is easier in general.
if (m_fNoAttack || (!m_fRandAttack && pSteps->HasAttacks()))
return true;
if( m_fCover ) return true;
if( m_fPlayerAutoPlay ) return true;
return false;
@@ -957,7 +961,20 @@ public:
DEFINE_METHOD( GetBlind, m_fBlind )
DEFINE_METHOD( GetCover, m_fCover )
DEFINE_METHOD( GetRandomAttacks, m_fRandAttack )
DEFINE_METHOD( GetSongAttacks, m_fSongAttack )
static int GetStepAttacks( T *p, lua_State *L )
{
lua_pushnumber(L,
(p->m_fNoAttack > 0 || p->m_fRandAttack > 0 ? 0 : 1 ));
return 1;
}
// This one is deprecated.
static int GetSongAttacks( T *p, lua_State *L )
{
return GetStepAttacks(p, L);
}
DEFINE_METHOD( GetNoAttacks, m_fNoAttack )
DEFINE_METHOD( GetSkew, m_fSkew )
DEFINE_METHOD( GetPassmark, m_fPassmark )
DEFINE_METHOD( GetRandomSpeed, m_fRandomSpeed )
@@ -984,6 +1001,8 @@ public:
// SetSkew
ADD_METHOD( GetSongAttacks );
// SetSongAttacks
ADD_METHOD( GetStepAttacks );
ADD_METHOD( GetNoAttacks );
ADD_METHOD( GetCMod );
ADD_METHOD( GetXMod );
+2 -2
View File
@@ -27,7 +27,7 @@ public:
m_fBlind(0), m_SpeedfBlind(1.0f),
m_fCover(0), m_SpeedfCover(1.0f),
m_fRandAttack(0), m_SpeedfRandAttack(1.0f),
m_fSongAttack(0), m_SpeedfSongAttack(1.0f),
m_fNoAttack(0), m_SpeedfNoAttack(1.0f),
m_fPlayerAutoPlay(0), m_SpeedfPlayerAutoPlay(1.0f),
m_bSetTiltOrSkew(false),
m_fPerspectiveTilt(0), m_SpeedfPerspectiveTilt(1.0f),
@@ -167,7 +167,7 @@ public:
float m_fBlind, m_SpeedfBlind;
float m_fCover, m_SpeedfCover; // hide the background per-player--can't think of a good name
float m_fRandAttack, m_SpeedfRandAttack;
float m_fSongAttack, m_SpeedfSongAttack;
float m_fNoAttack, m_SpeedfNoAttack;
float m_fPlayerAutoPlay, m_SpeedfPlayerAutoPlay;
bool m_bSetTiltOrSkew; // true if the tilt or skew was set by FromString
float m_fPerspectiveTilt, m_SpeedfPerspectiveTilt; // -1 = near, 0 = overhead, +1 = space
+1 -1
View File
@@ -434,7 +434,7 @@ RString ConvertI64FormatString( const RString &sStr )
RString ConvertI64FormatString( const RString &sStr ) { return sStr; }
#endif
/* ISO-639-1 codes: http://www.loc.gov/standards/iso639-2/langcodes.html
/* ISO-639-1 codes: http://www.loc.gov/standards/iso639-2/php/code_list.php
* native forms: http://people.w3.org/rishida/names/languages.html
* We don't use 3-letter codes, so we don't bother supporting them. */
static const LanguageInfo g_langs[] =
+326 -29
View File
@@ -68,6 +68,8 @@ AutoScreenMessage( SM_BackFromSongInformation );
AutoScreenMessage( SM_BackFromBGChange );
AutoScreenMessage( SM_BackFromInsertTapAttack );
AutoScreenMessage( SM_BackFromInsertTapAttackPlayerOptions );
AutoScreenMessage( SM_BackFromInsertStepAttack );
AutoScreenMessage( SM_BackFromInsertStepAttackPlayerOptions );
AutoScreenMessage( SM_BackFromInsertCourseAttack );
AutoScreenMessage( SM_BackFromInsertCourseAttackPlayerOptions );
AutoScreenMessage( SM_BackFromCourseModeMenu );
@@ -144,13 +146,13 @@ void ScreenEdit::InitEditMappings()
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SCROLL_NEXT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_PERIOD);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SCROLL_PREV][0] = DeviceInput(DEVICE_KEYBOARD, KEY_COMMA);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_LABEL_NEXT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_PERIOD);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_LABEL_NEXT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_LABEL_NEXT][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RCTRL);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SEGMENT_NEXT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_PERIOD);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_SEGMENT_NEXT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_SEGMENT_NEXT][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RCTRL);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_LABEL_PREV][0] = DeviceInput(DEVICE_KEYBOARD, KEY_COMMA);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_LABEL_PREV][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_LABEL_PREV][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RCTRL);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SEGMENT_PREV][0] = DeviceInput(DEVICE_KEYBOARD, KEY_COMMA);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_SEGMENT_PREV][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_SEGMENT_PREV][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RCTRL);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SCROLL_SELECT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LSHIFT);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_SCROLL_SELECT][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RSHIFT);
@@ -244,8 +246,8 @@ void ScreenEdit::InitEditMappings()
m_EditMappingsDeviceInput.button[EDIT_BUTTON_OPEN_BGCHANGE_LAYER2_MENU][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cb);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_OPEN_BGCHANGE_LAYER2_MENU][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LSHIFT);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_OPEN_BGCHANGE_LAYER2_MENU][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RSHIFT);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_OPEN_COURSE_MENU][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cc);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_OPEN_COURSE_ATTACK_MENU][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cv);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_ADD_STEP_MODS][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cc);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_OPEN_STEP_ATTACK_MENU][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cv);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_INSERT_SHIFT_PAUSES][0] = DeviceInput(DEVICE_KEYBOARD, KEY_INSERT);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_INSERT_SHIFT_PAUSES][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL);
@@ -275,6 +277,14 @@ void ScreenEdit::InitEditMappings()
m_EditMappingsDeviceInput.button[EDIT_BUTTON_CYCLE_TAP_LEFT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cn);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_CYCLE_TAP_RIGHT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cm);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_CYCLE_SEGMENT_LEFT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cn);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_CYCLE_SEGMENT_LEFT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_CYCLE_SEGMENT_LEFT][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RCTRL);
m_EditMappingsDeviceInput.button[EDIT_BUTTON_CYCLE_SEGMENT_RIGHT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_Cm);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_CYCLE_SEGMENT_RIGHT][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_CYCLE_SEGMENT_RIGHT][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RCTRL);
m_EditMappingsDeviceInput.button [EDIT_BUTTON_SCROLL_SPEED_UP][0] = DeviceInput(DEVICE_KEYBOARD, KEY_UP);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_SCROLL_SPEED_UP][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL);
m_EditMappingsDeviceInput.hold[EDIT_BUTTON_SCROLL_SPEED_UP][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RCTRL);
@@ -569,6 +579,8 @@ static MenuDef g_AreaMenu(
MenuRowDef( ScreenEdit::shift_pauses_backward, "Shift all timing changes up", true, EditMode_Full, true, true, 0, NULL ),
MenuRowDef(ScreenEdit::convert_pause_to_beat, "Convert pause to beats", true,
EditMode_Full, true, true, 0, NULL ),
MenuRowDef(ScreenEdit::convert_delay_to_beat, "Convert delay to beats", true,
EditMode_Full, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::undo, "Undo", true, EditMode_Practice, true, true, 0, NULL ),
MenuRowDef(ScreenEdit::clear_clipboard, "Clear clipboard", true,
EditMode_Practice, true, true, 0, NULL )
@@ -631,6 +643,8 @@ static MenuDef g_TimingDataInformation(
MenuRowDef( ScreenEdit::speed_mode, "Edit speed (mode)", true, EditMode_Full, true, true, 0, "Beats", "Seconds" ),
MenuRowDef( ScreenEdit::scroll, "Edit scrolling factor", true, EditMode_Full, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::fake, "Edit fake", true, EditMode_Full, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::copy_timing, "Copy timing data", true, EditMode_Full, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::paste_timing, "Paste timing data", true, EditMode_Full, true, true, 0, NULL ),
MenuRowDef( ScreenEdit::erase_step_timing, "Erase step timing", true, EditMode_Full, true, true, 0, NULL )
);
@@ -768,6 +782,8 @@ void ScreenEdit::Init()
ScreenWithMenuElements::Init();
InitEditMappings();
currentCycleSegment = "label";
// save the originals for reverting later
CopyToLastSave();
@@ -859,6 +875,8 @@ void ScreenEdit::Init()
m_bRemoveNoteButtonDown = false;
m_Clipboard.SetNumTracks( m_NoteDataEdit.GetNumTracks() );
clipboardTiming = GAMESTATE->m_pCurSong->m_SongTiming; // always have a backup.
m_bHasUndo = false;
m_Undo.SetNumTracks( m_NoteDataEdit.GetNumTracks() );
@@ -1096,9 +1114,11 @@ static LocalizedString DIFFICULTY("ScreenEdit", "Difficulty");
static LocalizedString ROUTINE_PLAYER("ScreenEdit", "Routine Player");
static LocalizedString DESCRIPTION("ScreenEdit", "Description");
static LocalizedString CHART_STYLE("ScreenEdit", "Chart Style");
static LocalizedString STEP_AUTHOR("ScreenEdit", "Step Author");
static LocalizedString MAIN_TITLE("ScreenEdit", "Main title");
static LocalizedString SUBTITLE("ScreenEdit", "Subtitle");
static LocalizedString TAP_NOTE_TYPE("ScreenEdit", "Tap Note");
static LocalizedString SEGMENT_TYPE("ScreenEdit", "Segment");
static LocalizedString TAP_STEPS("ScreenEdit", "Tap Steps");
static LocalizedString JUMPS("ScreenEdit", "Jumps");
static LocalizedString HANDS("ScreenEdit", "Hands");
@@ -1124,9 +1144,11 @@ static ThemeMetric<RString> DIFFICULTY_FORMAT("ScreenEdit", "DifficultyFormat");
static ThemeMetric<RString> ROUTINE_PLAYER_FORMAT("ScreenEdit", "RoutinePlayerFormat");
static ThemeMetric<RString> DESCRIPTION_FORMAT("ScreenEdit", "DescriptionFormat");
static ThemeMetric<RString> CHART_STYLE_FORMAT("ScreenEdit", "ChartStyleFormat");
static ThemeMetric<RString> STEP_AUTHOR_FORMAT("ScreenEdit", "StepAuthorFormat");
static ThemeMetric<RString> MAIN_TITLE_FORMAT("ScreenEdit", "MainTitleFormat");
static ThemeMetric<RString> SUBTITLE_FORMAT("ScreenEdit", "SubtitleFormat");
static ThemeMetric<RString> TAP_NOTE_TYPE_FORMAT("ScreenEdit", "TapNoteTypeFormat");
static ThemeMetric<RString> SEGMENT_TYPE_FORMAT("ScreenEdit", "SegmentTypeFormat");
static ThemeMetric<RString> NUM_STEPS_FORMAT("ScreenEdit", "NumStepsFormat");
static ThemeMetric<RString> NUM_JUMPS_FORMAT("ScreenEdit", "NumJumpsFormat");
static ThemeMetric<RString> NUM_HOLDS_FORMAT("ScreenEdit", "NumHoldsFormat");
@@ -1192,12 +1214,14 @@ void ScreenEdit::UpdateTextInfo()
if ( m_InputPlayerNumber != PLAYER_INVALID )
sText += ssprintf( ROUTINE_PLAYER_FORMAT.GetValue(), ROUTINE_PLAYER.GetValue().c_str(), m_InputPlayerNumber + 1 );
sText += ssprintf( DESCRIPTION_FORMAT.GetValue(), DESCRIPTION.GetValue().c_str(), m_pSteps->GetDescription().c_str() );
sText += ssprintf( CHART_STYLE_FORMAT.GetValue(), CHART_STYLE.GetValue().c_str(), m_pSteps->GetChartStyle().c_str() );
sText += ssprintf( STEP_AUTHOR_FORMAT.GetValue(), STEP_AUTHOR.GetValue().c_str(), m_pSteps->GetCredit().c_str() );
//sText += ssprintf( CHART_STYLE_FORMAT.GetValue(), CHART_STYLE.GetValue().c_str(), m_pSteps->GetChartStyle().c_str() );
sText += ssprintf( MAIN_TITLE_FORMAT.GetValue(), MAIN_TITLE.GetValue().c_str(), m_pSong->m_sMainTitle.c_str() );
if( m_pSong->m_sSubTitle.size() )
sText += ssprintf( SUBTITLE_FORMAT.GetValue(), SUBTITLE.GetValue().c_str(), m_pSong->m_sSubTitle.c_str() );
sText += ssprintf( SEGMENT_TYPE_FORMAT.GetValue(), SEGMENT_TYPE.GetValue().c_str(), currentCycleSegment.c_str() );
sText += ssprintf( TAP_NOTE_TYPE_FORMAT.GetValue(), TAP_NOTE_TYPE.GetValue().c_str(), TapNoteTypeToString( m_selectedTap.type ).c_str() );
break;
break;
}
GAMESTATE->SetProcessedTimingData(&m_pSteps->m_Timing);
@@ -1453,6 +1477,62 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
}
break;
}
case EDIT_BUTTON_CYCLE_SEGMENT_LEFT:
{
if (this->currentCycleSegment == "label")
this->currentCycleSegment = "fake";
else if (this->currentCycleSegment == "fake")
this->currentCycleSegment = "scroll";
else if (this->currentCycleSegment == "scroll")
this->currentCycleSegment = "speed";
else if (this->currentCycleSegment == "speed")
this->currentCycleSegment = "combo";
else if (this->currentCycleSegment == "combo")
this->currentCycleSegment = "tickcount";
else if (this->currentCycleSegment == "tickcount")
this->currentCycleSegment = "timeSig";
else if (this->currentCycleSegment == "timeSig")
this->currentCycleSegment = "warp";
else if (this->currentCycleSegment == "warp")
this->currentCycleSegment = "delay";
else if (this->currentCycleSegment == "delay")
this->currentCycleSegment = "stop";
else if (this->currentCycleSegment == "stop")
this->currentCycleSegment = "bpm";
else if (this->currentCycleSegment == "bpm")
this->currentCycleSegment = "label";
// fallback gracefully instead of assert.
else this->currentCycleSegment = "label";
break;
}
case EDIT_BUTTON_CYCLE_SEGMENT_RIGHT:
{
if (this->currentCycleSegment == "label")
this->currentCycleSegment = "bpm";
else if (this->currentCycleSegment == "bpm")
this->currentCycleSegment = "stop";
else if (this->currentCycleSegment == "stop")
this->currentCycleSegment = "delay";
else if (this->currentCycleSegment == "delay")
this->currentCycleSegment = "warp";
else if (this->currentCycleSegment == "warp")
this->currentCycleSegment = "timeSig";
else if (this->currentCycleSegment == "timeSig")
this->currentCycleSegment = "tickcount";
else if (this->currentCycleSegment == "tickcount")
this->currentCycleSegment = "combo";
else if (this->currentCycleSegment == "combo")
this->currentCycleSegment = "speed";
else if (this->currentCycleSegment == "speed")
this->currentCycleSegment = "scroll";
else if (this->currentCycleSegment == "scroll")
this->currentCycleSegment = "fake";
else if (this->currentCycleSegment == "fake")
this->currentCycleSegment = "label";
// fallback gracefully instead of assert.
else this->currentCycleSegment = "label";
break;
}
case EDIT_BUTTON_SCROLL_SPEED_UP:
case EDIT_BUTTON_SCROLL_SPEED_DOWN:
{
@@ -1567,16 +1647,60 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
ScrollTo( NoteRowToBeat(iRow) );
}
break;
case EDIT_BUTTON_LABEL_NEXT:
{
ScrollTo( GetAppropriateTiming().GetNextLabelSegmentBeatAtBeat( GetBeat() ) );
}
break;
case EDIT_BUTTON_LABEL_PREV:
{
ScrollTo( GetAppropriateTiming().GetPreviousLabelSegmentBeatAtBeat( GetBeat() ) );
}
break;
case EDIT_BUTTON_SEGMENT_NEXT:
{
TimingData &timing = GetAppropriateTiming();
if (this->currentCycleSegment == "label")
ScrollTo(timing.GetNextLabelSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "bpm")
ScrollTo(timing.GetNextBPMSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "stop")
ScrollTo(timing.GetNextStopSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "delay")
ScrollTo(timing.GetNextDelaySegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "warp")
ScrollTo(timing.GetNextWarpSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "timeSig")
ScrollTo(timing.GetNextTimeSignatureSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "tickcount")
ScrollTo(timing.GetNextTickcountSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "combo")
ScrollTo(timing.GetNextComboSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "speed")
ScrollTo(timing.GetNextSpeedSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "scroll")
ScrollTo(timing.GetNextScrollSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "fake")
ScrollTo(timing.GetNextFakeSegmentBeatAtBeat(GetBeat()));
}
break;
case EDIT_BUTTON_SEGMENT_PREV:
{
TimingData &timing = GetAppropriateTiming();
if (this->currentCycleSegment == "label")
ScrollTo(timing.GetPreviousLabelSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "bpm")
ScrollTo(timing.GetPreviousBPMSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "stop")
ScrollTo(timing.GetPreviousStopSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "delay")
ScrollTo(timing.GetPreviousDelaySegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "warp")
ScrollTo(timing.GetPreviousWarpSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "timeSig")
ScrollTo(timing.GetPreviousTimeSignatureSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "tickcount")
ScrollTo(timing.GetPreviousTickcountSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "combo")
ScrollTo(timing.GetPreviousComboSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "speed")
ScrollTo(timing.GetPreviousSpeedSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "scroll")
ScrollTo(timing.GetPreviousScrollSegmentBeatAtBeat(GetBeat()));
else if (this->currentCycleSegment == "fake")
ScrollTo(timing.GetPreviousFakeSegmentBeatAtBeat(GetBeat()));
}
break;
case EDIT_BUTTON_SNAP_NEXT:
if( m_SnapDisplay.PrevSnapMode() )
OnSnapModeChange();
@@ -1654,6 +1778,9 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
// don't keep undo when changing Steps
ClearUndo();
// get the second of the current step.
float curSecond = GetAppropriateTiming().GetElapsedTimeFromBeat(GetBeat());
// save current steps
Steps* pSteps = GAMESTATE->m_pCurSteps[PLAYER_1];
ASSERT( pSteps );
@@ -1706,6 +1833,8 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
int(vSteps.size()) );
SCREENMAN->SystemMessage( s );
m_soundSwitchSteps.Play();
ScrollTo( GetAppropriateTiming().GetBeatFromElapsedTime(curSecond) );
}
break;
case EDIT_BUTTON_BPM_UP:
@@ -1988,6 +2117,35 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
EditMiniMenu( &g_CourseMode, SM_BackFromCourseModeMenu );
}
break;
case EDIT_BUTTON_OPEN_STEP_ATTACK_MENU:
{
TimingData &timing = GetAppropriateTiming();
float startTime = timing.GetElapsedTimeFromBeat(GetBeat());
AttackArray &attacks =
(GAMESTATE->m_bIsUsingStepTiming ? m_pSteps->m_Attacks : m_pSong->m_Attacks);
int index = FindAttackAtTime(attacks, startTime);
if (index >= 0)
{
const RString sDuration = ssprintf( "%.5f", attacks[index].fSecsRemaining );
g_InsertCourseAttack.rows[remove].bEnabled = true;
if( g_InsertCourseAttack.rows[duration].choices.size() == 9 )
g_InsertCourseAttack.rows[duration].choices.push_back( sDuration );
else
g_InsertCourseAttack.rows[duration].choices.back() = sDuration;
g_InsertCourseAttack.rows[duration].iDefaultChoice = 9;
}
else
{
if( g_InsertCourseAttack.rows[duration].choices.size() == 10 )
g_InsertCourseAttack.rows[duration].choices.pop_back();
g_InsertCourseAttack.rows[duration].iDefaultChoice = 3;
}
EditMiniMenu( &g_InsertCourseAttack, SM_BackFromInsertStepAttack );
break;
}
case EDIT_BUTTON_OPEN_COURSE_ATTACK_MENU:
{
// TODO: Give Song/Step Timing switches/functions here?
@@ -2019,6 +2177,44 @@ void ScreenEdit::InputEdit( const InputEventPlus &input, EditButton EditB )
EditMiniMenu( &g_InsertCourseAttack, SM_BackFromInsertCourseAttack );
}
break;
case EDIT_BUTTON_ADD_STEP_MODS:
{
float start = -1;
float end = -1;
PlayerOptions po;
if (m_NoteFieldEdit.m_iBeginMarker == -1) // not highlighted
{
po.FromString("");
}
else
{
TimingData &timing = GetAppropriateTiming();
start = timing.GetElapsedTimeFromBeat(NoteRowToBeat(m_NoteFieldEdit.m_iBeginMarker));
AttackArray &attacks =
(GAMESTATE->m_bIsUsingStepTiming ? m_pSteps->m_Attacks : m_pSong->m_Attacks);
int index = FindAttackAtTime(attacks, start);
if (index >= 0)
{
po.FromString("");
}
if (m_NoteFieldEdit.m_iEndMarker == -1)
{
end = m_pSong->m_fMusicLengthSeconds;
}
else
{
end = timing.GetElapsedTimeFromBeat(NoteRowToBeat(m_NoteFieldEdit.m_iEndMarker));
}
}
g_fLastInsertAttackPositionSeconds = start;
g_fLastInsertAttackDurationSeconds = end - start;
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.Assign( ModsLevel_Stage, po );
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromInsertStepAttackPlayerOptions );
break;
}
case EDIT_BUTTON_ADD_COURSE_MODS:
{
float fStart, fEnd;
@@ -2910,6 +3106,30 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
m_NoteDataEdit.SetTapNote( g_iLastInsertTapAttackTrack, row, tn );
CheckNumberOfNotesAndUndo();
}
else if (SM == SM_BackFromInsertStepAttack)
{
int iDurationChoice = ScreenMiniMenu::s_viLastAnswers[0];
TimingData &timing = GetAppropriateTiming();
g_fLastInsertAttackPositionSeconds = timing.GetElapsedTimeFromBeat( GetBeat() );
g_fLastInsertAttackDurationSeconds = StringToFloat( g_InsertCourseAttack.rows[0].choices[iDurationChoice] );
AttackArray &attacks = GAMESTATE->m_bIsUsingStepTiming ? m_pSteps->m_Attacks : m_pSong->m_Attacks;
int iAttack = FindAttackAtTime(attacks, g_fLastInsertAttackPositionSeconds);
if (ScreenMiniMenu::s_iLastRowCode == ScreenEdit::remove )
{
ASSERT(iAttack >= 0);
attacks.erase(attacks.begin() + iAttack);
}
else
{
PlayerOptions po;
if (iAttack >= 0)
po.FromString(attacks[iAttack].sModifiers);
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.Assign( ModsLevel_Preferred, po );
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromInsertStepAttackPlayerOptions );
}
}
else if( SM == SM_BackFromInsertCourseAttack )
{
int iDurationChoice = ScreenMiniMenu::s_viLastAnswers[0];
@@ -2939,6 +3159,27 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
SCREENMAN->AddNewScreenToTop( "ScreenPlayerOptions", SM_BackFromInsertCourseAttackPlayerOptions );
}
}
else if (SM == SM_BackFromInsertStepAttackPlayerOptions)
{
PlayerOptions poChosen = GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetPreferred();
RString mods = poChosen.GetString();
if (g_fLastInsertAttackPositionSeconds >= 0)
{
Attack a(ATTACK_LEVEL_1,
g_fLastInsertAttackPositionSeconds,
g_fLastInsertAttackDurationSeconds,
mods,
false,
false);
AttackArray &attacks = GAMESTATE->m_bIsUsingStepTiming ? m_pSteps->m_Attacks : m_pSong->m_Attacks;
int index = FindAttackAtTime(attacks, g_fLastInsertAttackPositionSeconds);
if (index >= 0)
attacks[index] = a;
else
attacks.push_back(a);
}
}
else if( SM == SM_BackFromInsertCourseAttackPlayerOptions )
{
PlayerOptions poChosen = GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetPreferred();
@@ -3409,6 +3650,12 @@ void ScreenEdit::HandleMainMenuChoice( MainMenuChoice c, const vector<int> &iAns
// copy edit into current Steps
m_pSteps->SetNoteData( m_NoteDataEdit );
// don't forget the attacks.
m_pSong->m_Attacks = GAMESTATE->m_pCurSong->m_Attacks;
m_pSong->m_sAttackString = GAMESTATE->m_pCurSong->m_Attacks.ToVectorString();
m_pSteps->m_Attacks = GAMESTATE->m_pCurSteps[PLAYER_1]->m_Attacks;
m_pSteps->m_sAttackString = GAMESTATE->m_pCurSteps[PLAYER_1]->m_Attacks.ToVectorString();
switch( EDIT_MODE.GetValue() )
{
@@ -3856,18 +4103,29 @@ void ScreenEdit::HandleAreaMenuChoice( AreaMenuChoice c, const vector<int> &iAns
break;
case convert_pause_to_beat:
{
// TODO: Convert both Delays and Stops at once.
float fStopSeconds = GetAppropriateTiming().GetStopAtRow( BeatToNoteRow( GetBeat() ) );
GetAppropriateTiming().SetStopAtBeat( GetBeat() , 0 );
{
float fStopSeconds = GetAppropriateTiming().GetStopAtRow(GetRow());
GetAppropriateTiming().SetStopAtBeat( GetBeat() , 0 );
float fStopBeats = fStopSeconds * GetAppropriateTiming().GetBPMAtBeat( GetBeat() ) / 60;
float fStopBeats = fStopSeconds * GetAppropriateTiming().GetBPMAtBeat( GetBeat() ) / 60;
// don't move the step from where it is, just move everything later
NoteDataUtil::InsertRows( m_NoteDataEdit, BeatToNoteRow( GetBeat() ) + 1, BeatToNoteRow(fStopBeats) );
GetAppropriateTiming().InsertRows( BeatToNoteRow( GetBeat() ) + 1, BeatToNoteRow(fStopBeats) );
}
// don't move the step from where it is, just move everything later
NoteDataUtil::InsertRows( m_NoteDataEdit, GetRow() + 1, BeatToNoteRow(fStopBeats) );
GetAppropriateTiming().InsertRows( GetRow() + 1, BeatToNoteRow(fStopBeats) );
}
break;
case convert_delay_to_beat:
{
TimingData &timing = GetAppropriateTiming();
float pause = timing.GetDelayAtRow(GetRow());
timing.SetDelayAtRow(GetRow(), 0);
float pauseBeats = pause * timing.GetBPMAtBeat(GetBeat()) / 60;
NoteDataUtil::InsertRows(m_NoteDataEdit, GetRow(), BeatToNoteRow(pauseBeats));
timing.InsertRows(GetRow(), BeatToNoteRow(pauseBeats));
break;
}
case undo:
Undo();
break;
@@ -4150,6 +4408,24 @@ void ScreenEdit::HandleTimingDataInformationChoice( TimingDataInformationChoice
);
break;
}
case copy_timing:
{
clipboardTiming = GetAppropriateTiming();
break;
}
case paste_timing:
{
if (GAMESTATE->m_bIsUsingStepTiming)
{
GAMESTATE->m_pCurSteps[PLAYER_1]->m_Timing = clipboardTiming;
}
else
{
GAMESTATE->m_pCurSong->m_SongTiming = clipboardTiming;
}
SetDirty(true);
break;
}
case erase_step_timing:
ScreenPrompt::Prompt( SM_DoEraseStepTiming, CONFIRM_TIMING_ERASE , PROMPT_YES_NO, ANSWER_NO );
break;
@@ -4265,6 +4541,27 @@ void ScreenEdit::SetupCourseAttacks()
FOREACH( Attack, Attacks, attack )
GAMESTATE->m_pPlayerState[PLAYER_1]->LaunchAttack( *attack );
}
else
{
const PlayerOptions &p = GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.GetCurrent();
if (GAMESTATE->m_pCurSong && p.m_fNoAttack == 0 && p.m_fRandAttack == 0 )
{
AttackArray &attacks = GAMESTATE->m_bIsUsingStepTiming ?
GAMESTATE->m_pCurSteps[PLAYER_1]->m_Attacks :
GAMESTATE->m_pCurSong->m_Attacks;
if (attacks.size() > 0)
{
FOREACH(Attack, attacks, attack)
{
float fBeat = GetAppropriateTiming().GetBeatFromElapsedTime(attack->fStartSecond);
if (fBeat >= GetBeat())
GAMESTATE->m_pPlayerState[PLAYER_1]->LaunchAttack( *attack );
}
}
}
}
GAMESTATE->m_pPlayerState[PLAYER_1]->RebuildPlayerOptionsFromActiveAttacks();
}
+22 -3
View File
@@ -60,6 +60,9 @@ enum EditButton
EDIT_BUTTON_CYCLE_TAP_LEFT, /**< Rotate the available tap notes once to the "left". */
EDIT_BUTTON_CYCLE_TAP_RIGHT, /**< Rotate the available tap notes once to the "right". */
EDIT_BUTTON_CYCLE_SEGMENT_LEFT, /**< Select one segment to the left for jumping. */
EDIT_BUTTON_CYCLE_SEGMENT_RIGHT, /**< Select one segment to the right for jumping. */
EDIT_BUTTON_SCROLL_UP_LINE,
EDIT_BUTTON_SCROLL_UP_PAGE,
EDIT_BUTTON_SCROLL_UP_TS,
@@ -73,8 +76,8 @@ enum EditButton
EDIT_BUTTON_SCROLL_NEXT,
EDIT_BUTTON_SCROLL_PREV,
EDIT_BUTTON_LABEL_NEXT, /**< Jump to the start of the next label downward. */
EDIT_BUTTON_LABEL_PREV, /**< Jump to the start of the previous label upward. */
EDIT_BUTTON_SEGMENT_NEXT, /**< Jump to the start of the next segment downward. */
EDIT_BUTTON_SEGMENT_PREV, /**< Jump to the start of the previous segment upward. */
// These are modifiers to EDIT_BUTTON_SCROLL_*.
EDIT_BUTTON_SCROLL_SELECT,
@@ -95,8 +98,12 @@ enum EditButton
EDIT_BUTTON_OPEN_BGCHANGE_LAYER2_MENU,
EDIT_BUTTON_OPEN_COURSE_MENU,
EDIT_BUTTON_OPEN_COURSE_ATTACK_MENU,
EDIT_BUTTON_OPEN_STEP_ATTACK_MENU, /**< Open up the Step Attacks menu. */
EDIT_BUTTON_ADD_STEP_MODS, /**< Add a mod attack to the row. */
EDIT_BUTTON_OPEN_INPUT_HELP,
EDIT_BUTTON_BAKE_RANDOM_FROM_SONG_GROUP,
EDIT_BUTTON_BAKE_RANDOM_FROM_SONG_GROUP_AND_GENRE,
@@ -266,9 +273,18 @@ protected:
* This is mainly to allow playing a chart with Song Timing. */
TimingData backupStepTiming;
/**
* @brief Have a backup of the TimingData of the player's choice.
*
* This will be used for copying and pasting as required. */
TimingData clipboardTiming;
/** @brief The current TapNote that would be inserted. */
TapNote m_selectedTap;
/** @brief The type of segment users will jump back and forth between. */
RString currentCycleSegment;
void UpdateTextInfo();
BitmapText m_textInfo; // status information that changes
bool m_bTextInfoNeedsUpdate;
@@ -404,6 +420,7 @@ public:
shift_pauses_forward,
shift_pauses_backward,
convert_pause_to_beat,
convert_delay_to_beat,
undo,
clear_clipboard,
NUM_AREA_MENU_CHOICES
@@ -539,6 +556,8 @@ public:
speed_mode,
scroll,
fake,
copy_timing,
paste_timing,
erase_step_timing,
NUM_TIMING_DATA_INFORMATION_CHOICES
};
+5 -4
View File
@@ -820,11 +820,12 @@ void ScreenGameplay::InitSongQueues()
{
Steps *pSteps = GAMESTATE->m_pCurSteps[ pi->GetStepsAndTrailIndex() ];
pi->m_vpStepsQueue.push_back( pSteps );
if( pi->GetPlayerState()->m_PlayerOptions.GetCurrent().m_fSongAttack != 0 &&
GAMESTATE->m_pCurSong->m_Attacks.size() > 0 )
const PlayerOptions &p = pi->GetPlayerState()->m_PlayerOptions.GetCurrent();
if (p.m_fNoAttack == 0 && p.m_fRandAttack == 0 &&
pSteps->m_Attacks.size() > 0 )
{
pi->m_asModifiersQueue.push_back( GAMESTATE->m_pCurSong->m_Attacks );
pi->m_asModifiersQueue.push_back( pSteps->m_Attacks );
}
else
{
-2
View File
@@ -53,7 +53,6 @@ protected:
Page GetPage( int iChoiceIndex ) const;
Page GetCurrentPage() const;
ThemeMetric<bool> USE_TWO_SCROLLERS;
ThemeMetric<bool> DO_SWITCH_ANYWAYS;
ThemeMetric<bool> DOUBLE_PRESS_TO_SELECT;
ThemeMetric<bool> SHOW_ICON;
@@ -68,7 +67,6 @@ protected:
ThemeMetric<float> PRE_SWITCH_PAGE_SECONDS;
ThemeMetric<float> POST_SWITCH_PAGE_SECONDS;
ThemeMetric1D<RString> OPTION_ORDER;
ThemeMetric1D<RString> OPTION_ORDER2;
ThemeMetric<bool> WRAP_CURSOR;
ThemeMetric<bool> WRAP_SCROLLER;
ThemeMetric<bool> LOOP_SCROLLER;
+4 -2
View File
@@ -41,7 +41,7 @@
* @brief The internal version of the cache for StepMania.
*
* Increment this value to invalidate the current cache. */
const int FILE_CACHE_VERSION = 182;
const int FILE_CACHE_VERSION = 185;
/** @brief How long does a song sample last by default? */
const float DEFAULT_MUSIC_SAMPLE_LENGTH = 12.f;
@@ -154,7 +154,9 @@ Steps *Song::CreateSteps()
void Song::InitSteps(Steps *pSteps)
{
pSteps->m_Timing = m_SongTiming;
pSteps->m_Timing = this->m_SongTiming;
pSteps->m_sAttackString = this->m_sAttackString;
pSteps->m_Attacks = this->m_Attacks;
}
void Song::GetDisplayBpms( DisplayBpms &AddTo ) const
+1 -1
View File
@@ -20,7 +20,7 @@ void FixupPath( RString &path, const RString &sSongPath );
RString GetSongAssetPath( RString sPath, const RString &sSongPath );
/** @brief The version of the .ssc file format. */
const static float STEPFILE_VERSION_NUMBER = 0.7f;
const static float STEPFILE_VERSION_NUMBER = 0.72f;
/** @brief How many edits for this song can each profile have? */
const int MAX_EDITS_PER_SONG_PER_PROFILE = 15;
+20 -1
View File
@@ -40,6 +40,11 @@ Steps::~Steps()
{
}
bool Steps::HasAttacks() const
{
return !this->m_Attacks.empty();
}
unsigned Steps::GetHash() const
{
if( parent )
@@ -364,6 +369,8 @@ void Steps::CopyFrom( Steps* pSource, StepsType ntTo, float fMusicLengthSeconds
noteData.SetNumTracks( GAMEMAN->GetStepsTypeInfo(ntTo).iNumTracks );
parent = NULL;
m_Timing = pSource->m_Timing;
this->m_Attacks = pSource->m_Attacks;
this->m_sAttackString = pSource->m_sAttackString;
this->SetNoteData( noteData );
this->SetDescription( pSource->GetDescription() );
this->SetDifficulty( pSource->GetDifficulty() );
@@ -463,7 +470,18 @@ public:
DEFINE_METHOD( IsAPlayerEdit, IsAPlayerEdit() )
DEFINE_METHOD( UsesSplitTiming, UsesSplitTiming() )
static int HasSignificantTimingChanges( T* p, lua_State *L ) { lua_pushboolean(L, p->HasSignificantTimingChanges()); return 1; }
static int HasSignificantTimingChanges( T* p, lua_State *L )
{
lua_pushboolean(L, p->HasSignificantTimingChanges());
return 1;
}
static int HasAttacks( T* p, lua_State *L )
{
lua_pushboolean(L, p->HasAttacks());
return 1;
}
static int GetRadarValues( T* p, lua_State *L )
{
@@ -500,6 +518,7 @@ public:
ADD_METHOD( GetHash );
ADD_METHOD( GetMeter );
ADD_METHOD( HasSignificantTimingChanges );
ADD_METHOD( HasAttacks );
ADD_METHOD( GetRadarValues );
ADD_METHOD( GetTimingData );
//ADD_METHOD( GetSMNoteData );
+11
View File
@@ -1,6 +1,7 @@
#ifndef STEPS_H
#define STEPS_H
#include "Attack.h"
#include "GameConstantsAndTypes.h"
#include "PlayerNumber.h"
#include "Grade.h"
@@ -92,6 +93,11 @@ public:
*/
RString GetCredit() const { return Real()->m_sCredit; }
/** @brief The list of attacks. */
AttackArray m_Attacks;
/** @brief The stringified list of attacks. */
vector<RString> m_sAttackString;
void SetFilename( RString fn ) { m_sFilename = fn; }
RString GetFilename() const { return m_sFilename; }
void SetSavedToDisk( bool b ) { DeAutogen(); m_bSavedToDisk = b; }
@@ -128,6 +134,11 @@ public:
* @brief Determine if the Steps have any major timing changes during gameplay.
* @return true if it does, or false otherwise. */
bool HasSignificantTimingChanges() const;
/**
* @brief Determine if the Steps have any attacks.
* @return true if it does, or false otherwise. */
bool HasAttacks() const;
// Lua
void PushSelf( lua_State *L );

Some files were not shown because too many files have changed in this diff Show More