Merge with default
@@ -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
|
||||
@@ -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.
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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=''UnlockRewardType_Song'' value='0'/>
|
||||
<EnumValue name=''UnlockRewardType_Steps'' value='1'/>
|
||||
<EnumValue name=''UnlockRewardType_Course'' value='2'/>
|
||||
<EnumValue name=''UnlockRewardType_Modifier'' value='3'/>
|
||||
<EnumValue name=''UnlockRewardType_StepsType'' value='2'/>
|
||||
<EnumValue name=''UnlockRewardType_Course'' value='3'/>
|
||||
<EnumValue name=''UnlockRewardType_Modifier'' value='4'/>
|
||||
</Enum>
|
||||
<Enum name='VertAlign'>
|
||||
<EnumValue name=''VertAlign_Top'' value='0'/>
|
||||
@@ -2118,9 +2128,9 @@
|
||||
<Constant name='left' value=''HorizAlign_Left''/>
|
||||
<Constant name='middle' value=''VertAlign_Middle''/>
|
||||
<Constant name='right' value=''HorizAlign_Right''/>
|
||||
<Constant name='sGame' value=''dance''/>
|
||||
<Constant name='sGame' value=''pump''/>
|
||||
<Constant name='top' value=''VertAlign_Top''/>
|
||||
</Constants>
|
||||
<Version>StepMania 5 v5.0 Preview 1a</Version>
|
||||
<Date>2011-06-11</Date>
|
||||
<Date>2011-06-24</Date>
|
||||
</Lua>
|
||||
|
||||
@@ -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=''>
|
||||
|
||||
@@ -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:;
|
||||
|
||||
@@ -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=
|
||||
|
||||
@@ -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
|
||||
|
After Width: | Height: | Size: 747 B |
|
After Width: | Height: | Size: 9.9 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 9.3 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 477 B |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 509 B |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 420 B |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 455 B |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 457 KiB |
|
After Width: | Height: | Size: 114 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 621 KiB |
|
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"));
|
||||
|
||||
@@ -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 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 Mount Player1
|
||||
OsMountPlayer2=OS 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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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" )
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
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
|
||||
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
|
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;
|
||||
@@ -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 {};
|
||||
@@ -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");
|
||||
|
||||
|
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)
|
||||
@@ -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")
|
||||
|
||||
@@ -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"'
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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" )
|
||||
|
||||
@@ -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 );
|
||||
|
||||
/**
|
||||
|
||||
@@ -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" )
|
||||
|
||||
@@ -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" )
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 );
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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[] =
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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 );
|
||||
|
||||