Moved LifeType, DrainType, and BatteryLives from Song Options to Player Options. Added ScreenGameplay:FailFadeRemovePlayer lua function.

This commit is contained in:
Kyzentun
2014-08-06 23:26:05 -06:00
parent 6aad3c8f75
commit 7e73892e6e
19 changed files with 445 additions and 397 deletions
+2
View File
@@ -14,6 +14,8 @@ StepMania current development
P2's lifemeter. Use LifeMeterChangedP2. "Life" and "StepsSecond" are passed P2's lifemeter. Use LifeMeterChangedP2. "Life" and "StepsSecond" are passed
in the params table for the message. in the params table for the message.
* [LifeMeterBattery] CourseSongRewardLives metric added. * [LifeMeterBattery] CourseSongRewardLives metric added.
* [LifeMeter] LifeType, DrainType, and BatteryLives moved to PlayerOptions so
the players can have different settings.
2013/10/09 2013/10/09
---------- ----------
+90 -89
View File
@@ -999,98 +999,101 @@
<Function name='GetStepsQueueWrapped'/> <Function name='GetStepsQueueWrapped'/>
</Class> </Class>
<Class name='PlayerOptions'> <Class name='PlayerOptions'>
<Function name='IsEasierForSongAndSteps'/>
<Function name='IsEasierForCourseAndTrail'/>
<Function name='TimeSpacing'/>
<Function name='MaxScrollBPM'/>
<Function name='ScrollSpeed'/>
<Function name='ScrollBPM'/>
<Function name='Boost'/>
<Function name='Brake'/>
<Function name='Wave'/>
<Function name='Expand'/>
<Function name='Boomerang'/>
<Function name='Drunk'/>
<Function name='Dizzy'/>
<Function name='Confusion'/>
<Function name='Mini'/>
<Function name='Tiny'/>
<Function name='Flip'/>
<Function name='Invert'/>
<Function name='Tornado'/>
<Function name='Tipsy'/>
<Function name='Bumpy'/>
<Function name='Beat'/>
<Function name='Xmode'/>
<Function name='Twirl'/>
<Function name='Roll'/>
<Function name='Hidden'/>
<Function name='HiddenOffset'/>
<Function name='Sudden'/>
<Function name='SuddenOffset'/>
<Function name='Stealth'/>
<Function name='Blink'/>
<Function name='RandomVanish'/>
<Function name='Reverse'/>
<Function name='Split'/>
<Function name='Alternate'/> <Function name='Alternate'/>
<Function name='Cross'/>
<Function name='Centered'/>
<Function name='Dark'/>
<Function name='Blind'/>
<Function name='Cover'/>
<Function name='RandAttack'/>
<Function name='NoAttack'/>
<Function name='PlayerAutoPlay'/>
<Function name='Tilt'/>
<Function name='Skew'/>
<Function name='Passmark'/>
<Function name='RandomSpeed'/>
<Function name='TurnNone'/>
<Function name='Mirror'/>
<Function name='Backwards'/>
<Function name='Left'/>
<Function name='Right'/>
<Function name='Shuffle'/>
<Function name='SoftShuffle'/>
<Function name='SuperShuffle'/>
<Function name='NoHolds'/>
<Function name='NoRolls'/>
<Function name='NoMines'/>
<Function name='Little'/>
<Function name='Wide'/>
<Function name='Big'/>
<Function name='Quick'/>
<Function name='BMRize'/>
<Function name='Skippy'/>
<Function name='Mines'/>
<Function name='AttackMines'/> <Function name='AttackMines'/>
<Function name='Echo'/> <Function name='Backwards'/>
<Function name='Stomp'/> <Function name='BatteryLives'/>
<Function name='Planted'/> <Function name='Beat'/>
<Function name='Floored'/> <Function name='Big'/>
<Function name='Twister'/> <Function name='Blind'/>
<Function name='HoldRolls'/> <Function name='Blink'/>
<Function name='NoJumps'/> <Function name='Boomerang'/>
<Function name='NoHands'/> <Function name='Boost'/>
<Function name='NoLifts'/> <Function name='BMRize'/>
<Function name='NoFakes'/> <Function name='Brake'/>
<Function name='NoQuads'/> <Function name='Bumpy'/>
<Function name='NoStretch'/> <Function name='Centered'/>
<Function name='MuteOnError'/>
<Function name='NoteSkin'/>
<Function name='FailSetting'/>
<Function name='CMod'/> <Function name='CMod'/>
<Function name='XMod'/> <Function name='Confusion'/>
<Function name='MMod'/> <Function name='Cover'/>
<Function name='Overhead'/> <Function name='Cross'/>
<Function name='Incoming'/> <Function name='Dark'/>
<Function name='Space'/> <Function name='Dizzy'/>
<Function name='Hallway'/>
<Function name='Distant'/> <Function name='Distant'/>
<Function name='UsingReverse'/> <Function name='DrainSetting'/>
<Function name='Drunk'/>
<Function name='Echo'/>
<Function name='Expand'/>
<Function name='FailSetting'/>
<Function name='Flip'/>
<Function name='Floored'/>
<Function name='GetReversePercentForColumn'/> <Function name='GetReversePercentForColumn'/>
<Function name='GetStepAttacks'/> <Function name='GetStepAttacks'/>
<Function name='IsEasierForSongAndSteps'/>
<Function name='IsEasierForCourseAndTrail'/>
<Function name='Incoming'/>
<Function name='Hallway'/>
<Function name='Hidden'/>
<Function name='HiddenOffset'/>
<Function name='HoldRolls'/>
<Function name='Invert'/>
<Function name='Left'/>
<Function name='LifeSetting'/>
<Function name='Little'/>
<Function name='MaxScrollBPM'/>
<Function name='Mines'/>
<Function name='Mini'/>
<Function name='Mirror'/>
<Function name='MMod'/>
<Function name='MuteOnError'/>
<Function name='NoAttack'/>
<Function name='NoFakes'/>
<Function name='NoHands'/>
<Function name='NoHolds'/>
<Function name='NoJumps'/>
<Function name='NoLifts'/>
<Function name='NoMines'/>
<Function name='NoQuads'/>
<Function name='NoRolls'/>
<Function name='NoStretch'/>
<Function name='NoteSkin'/>
<Function name='Overhead'/>
<Function name='Passmark'/>
<Function name='Planted'/>
<Function name='PlayerAutoPlay'/>
<Function name='Quick'/>
<Function name='RandAttack'/>
<Function name='RandomSpeed'/>
<Function name='RandomVanish'/>
<Function name='Reverse'/>
<Function name='Right'/>
<Function name='Roll'/>
<Function name='ScrollBPM'/>
<Function name='ScrollSpeed'/>
<Function name='Shuffle'/>
<Function name='Skew'/>
<Function name='Skippy'/>
<Function name='SoftShuffle'/>
<Function name='Space'/>
<Function name='Split'/>
<Function name='Stealth'/>
<Function name='Stomp'/>
<Function name='Sudden'/>
<Function name='SuddenOffset'/>
<Function name='SuperShuffle'/>
<Function name='TimeSpacing'/>
<Function name='Tilt'/>
<Function name='Tiny'/>
<Function name='Tipsy'/>
<Function name='Tornado'/>
<Function name='TurnNone'/>
<Function name='Twirl'/>
<Function name='Twister'/>
<Function name='UsingReverse'/>
<Function name='Wave'/>
<Function name='Wide'/>
<Function name='XMod'/>
<Function name='Xmode'/>
</Class> </Class>
<Class name='PlayerStageStats'> <Class name='PlayerStageStats'>
<Function name='FailPlayer'/> <Function name='FailPlayer'/>
@@ -1323,6 +1326,7 @@
</Class> </Class>
<Class base='ScreenWithMenuElements' name='ScreenGameplay'> <Class base='ScreenWithMenuElements' name='ScreenGameplay'>
<Function name='Center1Player'/> <Function name='Center1Player'/>
<Function name='FailFadeRemovePlayer'/>
<Function name='GetDummyPlayerInfo'/> <Function name='GetDummyPlayerInfo'/>
<Function name='GetHasteRate'/> <Function name='GetHasteRate'/>
<Function name='GetLifeMeter'/> <Function name='GetLifeMeter'/>
@@ -1513,10 +1517,7 @@
<Function name='AssistClap'/> <Function name='AssistClap'/>
<Function name='AssistMetronome'/> <Function name='AssistMetronome'/>
<Function name='AutosyncSetting'/> <Function name='AutosyncSetting'/>
<Function name='BatteryLives'/>
<Function name='DrainSetting'/>
<Function name='Haste'/> <Function name='Haste'/>
<Function name='LifeSetting'/>
<Function name='MusicRate'/> <Function name='MusicRate'/>
<Function name='RandomBGOnly'/> <Function name='RandomBGOnly'/>
<Function name='SaveReplay'/> <Function name='SaveReplay'/>
+149 -149
View File
@@ -2983,117 +2983,101 @@ save yourself some time, copy this for undocumented things:
Enum type options are almost identical to bool type. They take and return an enum value.<br /> Enum type options are almost identical to bool type. They take and return an enum value.<br />
For brevity, the functions are only given a description if the option requires careful handling or does not follow the float or bool interfaces.<br /> For brevity, the functions are only given a description if the option requires careful handling or does not follow the float or bool interfaces.<br />
</Description> </Description>
<Function name='Alternate' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='AttackMines' return='bool' arguments='bool value'> </Function>
<Function name='BatteryLives' return='int' arguments='int num'> </Function>
<Function name='Backwards' return='bool' arguments='bool value'> </Function>
<Function name='Beat' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Big' return='bool' arguments='bool value'> </Function>
<Function name='Blink' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Blind' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='BMRize' return='bool' arguments='bool value'> </Function>
<Function name='Boomerang' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Boost' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Brake' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Bumpy' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Centered' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='CMod' return='float, float' arguments='float value, float approach_speed'>
If the player has a CMod set, returns the value of that CMod and its associated approach speed. Returns nil otherwise.<br />
If the optional first argument is passed, sets the CMod to the value and disables any XMod or MMod that is set.<br />
If the optional second argument is passed, sets the speed at which the transition occurs.
</Function>
<Function name='Confusion' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Cover' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Cross' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Dark' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Dizzy' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Distant' return='float, float' arguments='float value, float approach_speed'>
If the player is using Distant (zero skew and positive tilt), returns the value of tilt and its approach_speed.<br />
Returns nil otherwise.<br />
If the optional first argument is passed, sets tilt to value and skew to zero.<br />
If the optional second argument is passed, sets the approach_speed for skew and tilt to it.
</Function>
<Function name='DrainSetting' return= 'DrainType' arguments='DrainType type'> </Function>
<Function name='Drunk' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Echo' return='bool' arguments='bool value'> </Function>
<Function name='Expand' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='FailSetting' return='FailType' arguments='FailType'>
Sets the <Link class='ENUM' function='FailType' /> for the player, if the optional argument is provided. Returns the <Link class='ENUM' function='FailType' /> that was previously set.
</Function>
<Function name='Flip' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Floored' return='bool' arguments='bool value'> </Function>
<Function name='GetStepAttacks' return='bool' argument=''>
Returns true if step attacks or random attacks are enabled.
</Function>
<Function name='IsEasierForCourseAndTrail' return='bool' arguments='Course c, Trail t'> <Function name='IsEasierForCourseAndTrail' return='bool' arguments='Course c, Trail t'>
Returns <code>true</code> if the current PlayerOptions makes the current Course/Trail easier. Returns <code>true</code> if the current PlayerOptions makes the current Course/Trail easier.
</Function> </Function>
<Function name='IsEasierForSongAndSteps' return='bool' arguments='Song so, Steps st'> <Function name='IsEasierForSongAndSteps' return='bool' arguments='Song so, Steps st'>
Returns <code>true</code> if the current PlayerOptions makes the current Song/Steps easier. Returns <code>true</code> if the current PlayerOptions makes the current Song/Steps easier.
</Function> </Function>
<Function name='TimeSpacing' return='float, float' arguments='float value, float approach_speed'> <Function name='Hallway' return='float, float' arguments='float value, float approach_speed'>
TimeSpacing is one of the variables for controlling the speed mod.<br /> If the player is using Hallway (zero skew and negative tilt), returns the value of tilt and its approach_speed.<br />
Use CMod, XMod, or MMod to set the speed mod unless you have a good reason not to.<br /> Returns nil otherwise.<br />
It controls whether the speed mod is in X mode or C mode. It should only be set to 0 or 1, and is only a float value to allow tweening between the two states. If the optional first argument is passed, sets tilt to negative value and skew to zero.<br />
Pass in a positive value for the familiar meaning of Hallway.<br />
If the optional second argument is passed, sets the approach_speed for skew and tilt to it.
</Function> </Function>
<Function name='Hidden' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='HiddenOffset' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='HoldRolls' return='bool' arguments='bool value'> </Function>
<Function name='Incoming' return='float, float' arguments='float value, float approach_speed'>
If the player is using Incoming ((positive skew and negative tilt) or (negative skew and positive tilt)), returns the value of skew and its approach_speed.<br />
Returns nil otherwise.<br />
If the optional first argument is passed, sets tilt to negative value and skew to value.<br />
Pass in a positive value for the familiar meaning of Incoming.<br />
If the optional second argument is passed, sets the approach_speed for skew and tilt to it.
</Function>
<Function name='Invert' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Left' return='bool' arguments='bool value'> </Function>
<Function name='LifeSetting' return='LifeType' arguments='LifeType type'> </Function>
<Function name='Little' return='bool' arguments='bool value'> </Function>
<Function name='MaxScrollBPM' return='float, float' arguments='float value, float approach_speed'> <Function name='MaxScrollBPM' return='float, float' arguments='float value, float approach_speed'>
MaxScrollBPM is one of the variables for controlling the speed mod.<br /> MaxScrollBPM is one of the variables for controlling the speed mod.<br />
Use CMod, XMod, or MMod to set the speed mod unless you have a good reason not to.<br /> Use CMod, XMod, or MMod to set the speed mod unless you have a good reason not to.<br />
It is the setting for the MMod.<br /> It is the setting for the MMod.<br />
MMods are not tweenable or settable on ScreenGameplay. Use XMods if you need such an effect. MMods are not tweenable or settable on ScreenGameplay. Use XMods if you need such an effect.
</Function> </Function>
<Function name='ScrollSpeed' return='float, float' arguments='float value, float approach_speed'>
ScrollSpeed is one of the variables for controlling the speed mod.<br />
Use CMod, XMod, or MMod to set the speed mod unless you have a good reason not to.<br />
It is the setting for the XMod.
</Function>
<Function name='ScrollBPM' return='float, float' arguments='float value, float approach_speed'>
ScrollBPM is one of the variables for controlling the speed mod.<br />
Use CMod, XMod, or MMod to set the speed mod unless you have a good reason not to.<br />
It is the setting for the CMod.
</Function>
<Function name='Boost' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Brake' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Wave' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Expand' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Boomerang' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Drunk' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Dizzy' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Confusion' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Mini' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Tiny' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Flip' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Invert' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Tornado' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Tipsy' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Bumpy' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Beat' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Xmode' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Twirl' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Roll' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Hidden' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='HiddenOffset' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Sudden' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='SuddenOffset' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Stealth' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Blink' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='RandomVanish' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Reverse' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Split' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Alternate' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Cross' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Centered' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Dark' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Blind' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Cover' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='RandAttack' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='NoAttack' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='PlayerAutoPlay' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Tilt' return='float, float' arguments='float value, float approach_speed'>
Tilt is one of the mods for controlling the perspective. Use Overhead, Distant, Incoming, Space, Distant, or Hallway for controlling the perspective in the old way.<br />
Tilt tilts the note field forward and back.
</Function>
<Function name='Skew' return='float, float' arguments='float value, float approach_speed'>
Skew is one of the mods for controlling the perspective. Use Overhead, Distant, Incoming, Space, Distant, or Hallway for controlling the perspective in the old way.<br />
Skew moves the vanishing point for the note field away from the center of the screen.<br />
Skew has no effect in single mode if Center1Player is true.<br />
Skew has no effect in double mode.<br />
</Function>
<Function name='Passmark' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='RandomSpeed' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='TurnNone' return='bool' arguments='bool value'> </Function>
<Function name='Mirror' return='bool' arguments='bool value'> </Function>
<Function name='Backwards' return='bool' arguments='bool value'> </Function>
<Function name='Left' return='bool' arguments='bool value'> </Function>
<Function name='Right' return='bool' arguments='bool value'> </Function>
<Function name='Shuffle' return='bool' arguments='bool value'> </Function>
<Function name='SoftShuffle' return='bool' arguments='bool value'> </Function>
<Function name='SuperShuffle' return='bool' arguments='bool value'> </Function>
<Function name='NoHolds' return='bool' arguments='bool value'> </Function>
<Function name='NoRolls' return='bool' arguments='bool value'> </Function>
<Function name='NoMines' return='bool' arguments='bool value'> </Function>
<Function name='Little' return='bool' arguments='bool value'> </Function>
<Function name='Wide' return='bool' arguments='bool value'> </Function>
<Function name='Big' return='bool' arguments='bool value'> </Function>
<Function name='Quick' return='bool' arguments='bool value'> </Function>
<Function name='BMRize' return='bool' arguments='bool value'> </Function>
<Function name='Skippy' return='bool' arguments='bool value'> </Function>
<Function name='Mines' return='bool' arguments='bool value'> </Function> <Function name='Mines' return='bool' arguments='bool value'> </Function>
<Function name='AttackMines' return='bool' arguments='bool value'> </Function> <Function name='Mini' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Echo' return='bool' arguments='bool value'> </Function> <Function name='Mirror' return='bool' arguments='bool value'> </Function>
<Function name='Stomp' return='bool' arguments='bool value'> </Function> <Function name='MMod' return='float, float' arguments='float value, float approach_speed'>
<Function name='Planted' return='bool' arguments='bool value'> </Function> If the player has a MMod set, returns the value of that MMod and its associated approach speed. Returns nil otherwise.<br />
<Function name='Floored' return='bool' arguments='bool value'> </Function> If the optional first argument is passed, sets the MMod to the value and disables any CMod or XMod that is set.<br />
<Function name='Twister' return='bool' arguments='bool value'> </Function> If the optional second argument is passed, sets the speed at which the transition occurs.<br />
<Function name='HoldRolls' return='bool' arguments='bool value'> </Function> MMods are not tweenable or settable on ScreenGameplay. Use XMods if you need such an effect.
</Function>
<Function name='MuteOnError' return='bool' arguments='bool value'> </Function>
<Function name='NoAttack' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='NoFakes' return='bool' arguments='bool value'> </Function>
<Function name='NoHolds' return='bool' arguments='bool value'> </Function>
<Function name='NoJumps' return='bool' arguments='bool value'> </Function> <Function name='NoJumps' return='bool' arguments='bool value'> </Function>
<Function name='NoHands' return='bool' arguments='bool value'> </Function> <Function name='NoHands' return='bool' arguments='bool value'> </Function>
<Function name='NoLifts' return='bool' arguments='bool value'> </Function> <Function name='NoLifts' return='bool' arguments='bool value'> </Function>
<Function name='NoFakes' return='bool' arguments='bool value'> </Function>
<Function name='NoQuads' return='bool' arguments='bool value'> </Function> <Function name='NoQuads' return='bool' arguments='bool value'> </Function>
<Function name='NoStretch' return='bool' arguments='bool value'> </Function> <Function name='NoStretch' return='bool' arguments='bool value'> </Function>
<Function name='MuteOnError' return='bool' arguments='bool value'> </Function> <Function name='NoMines' return='bool' arguments='bool value'> </Function>
<Function name='UsingReverse' return='bool' arguments=''> <Function name='NoRolls' return='bool' arguments='bool value'> </Function>
Returns <code>true</code> if the player is using reverse. (equivalent to <code>GetReverse() == 1.0</code>)
</Function>
<Function name='NoteSkin' return='string, bool' arguments='string name'> <Function name='NoteSkin' return='string, bool' arguments='string name'>
Sets the NoteSkin to the named noteskin, unless name is nil or the noteskin does not exist. Returns the name of the previous noteskin and whether the set attempt succeeded.<br /> Sets the NoteSkin to the named noteskin, unless name is nil or the noteskin does not exist. Returns the name of the previous noteskin and whether the set attempt succeeded.<br />
Changing the noteskin during a song is not supported.<br /> Changing the noteskin during a song is not supported.<br />
@@ -3101,58 +3085,77 @@ save yourself some time, copy this for undocumented things:
note_name= options:NoteSkin() -- Sets note_name to the player's current noteskin.<br /> note_name= options:NoteSkin() -- Sets note_name to the player's current noteskin.<br />
prev_note_name, succeeded= options:NoteSkin("cel") -- Sets prev_note_name to the noteskin the player had set, changes the current noteskin to "cel", sets succeeded to true if the the "cel" noteskin exists.<br /> prev_note_name, succeeded= options:NoteSkin("cel") -- Sets prev_note_name to the noteskin the player had set, changes the current noteskin to "cel", sets succeeded to true if the the "cel" noteskin exists.<br />
</Function> </Function>
<Function name='FailSetting' return='FailType' arguments='FailType'> <Function name='Overhead' return='bool' arguments='bool'>
Sets the <Link class='ENUM' function='FailType' /> for the player, if the optional argument is provided. Returns the <Link class='ENUM' function='FailType' /> that was previously set. If the player is using Overhead (0 tilt, 0 skew), returns true.<br />
If true is passed, sets the tilt and skew to 0.
</Function> </Function>
<Function name='CMod' return='float, float' arguments='float value, float approach_speed'> <Function name='Passmark' return='float, float' arguments='float value, float approach_speed'> </Function>
If the player has a CMod set, returns the value of that CMod and its associated approach speed. Returns nil otherwise.<br /> <Function name='Planted' return='bool' arguments='bool value'> </Function>
If the optional first argument is passed, sets the CMod to the value and disables any XMod or MMod that is set.<br /> <Function name='PlayerAutoPlay' return='float, float' arguments='float value, float approach_speed'> </Function>
If the optional second argument is passed, sets the speed at which the transition occurs. <Function name='Quick' return='bool' arguments='bool value'> </Function>
</Function> <Function name='RandAttack' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='XMod' return='float, float' arguments='float value, float approach_speed'> <Function name='RandomSpeed' return='float, float' arguments='float value, float approach_speed'> </Function>
If the player has a XMod set, returns the value of that XMod and its associated approach speed. Returns nil otherwise.<br /> <Function name='RandomVanish' return='float, float' arguments='float value, float approach_speed'> </Function>
If the optional first argument is passed, sets the XMod to the value and disables any CMod or MMod that is set.<br /> <Function name='Reverse' return='float, float' arguments='float value, float approach_speed'> </Function>
If the optional second argument is passed, sets the speed at which the transition occurs. <Function name='Right' return='bool' arguments='bool value'> </Function>
</Function> <Function name='Roll' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='MMod' return='float, float' arguments='float value, float approach_speed'> <Function name='ScrollBPM' return='float, float' arguments='float value, float approach_speed'>
If the player has a MMod set, returns the value of that MMod and its associated approach speed. Returns nil otherwise.<br /> ScrollBPM is one of the variables for controlling the speed mod.<br />
If the optional first argument is passed, sets the MMod to the value and disables any CMod or XMod that is set.<br /> Use CMod, XMod, or MMod to set the speed mod unless you have a good reason not to.<br />
If the optional second argument is passed, sets the speed at which the transition occurs.<br /> It is the setting for the CMod.
MMods are not tweenable or settable on ScreenGameplay. Use XMods if you need such an effect. </Function>
</Function> <Function name='ScrollSpeed' return='float, float' arguments='float value, float approach_speed'>
<Function name='Overhead' return='bool' arguments='bool'> ScrollSpeed is one of the variables for controlling the speed mod.<br />
If the player is using Overhead (0 tilt, 0 skew), returns true.<br /> Use CMod, XMod, or MMod to set the speed mod unless you have a good reason not to.<br />
If true is passed, sets the tilt and skew to 0. It is the setting for the XMod.
</Function> </Function>
<Function name='Incoming' return='float, float' arguments='float value, float approach_speed'> <Function name='Shuffle' return='bool' arguments='bool value'> </Function>
If the player is using Incoming ((positive skew and negative tilt) or (negative skew and positive tilt)), returns the value of skew and its approach_speed.<br /> <Function name='Skew' return='float, float' arguments='float value, float approach_speed'>
Returns nil otherwise.<br /> Skew is one of the mods for controlling the perspective. Use Overhead, Distant, Incoming, Space, Distant, or Hallway for controlling the perspective in the old way.<br />
If the optional first argument is passed, sets tilt to negative value and skew to value.<br /> Skew moves the vanishing point for the note field away from the center of the screen.<br />
Pass in a positive value for the familiar meaning of Incoming.<br /> Skew has no effect in single mode if Center1Player is true.<br />
If the optional second argument is passed, sets the approach_speed for skew and tilt to it. Skew has no effect in double mode.<br />
</Function> </Function>
<Function name='Space' return='float, float' arguments='float value, float approach_speed'> <Function name='Skippy' return='bool' arguments='bool value'> </Function>
If the player is using Space ((positive skew and positive tilt) or (negative skew and negative tilt)), returns the value of skew and its approach_speed.<br /> <Function name='SoftShuffle' return='bool' arguments='bool value'> </Function>
Returns nil otherwise.<br /> <Function name='Space' return='float, float' arguments='float value, float approach_speed'>
If the optional first argument is passed, sets tilt to value and skew to value.<br /> If the player is using Space ((positive skew and positive tilt) or (negative skew and negative tilt)), returns the value of skew and its approach_speed.<br />
If the optional second argument is passed, sets the approach_speed for skew and tilt to it. Returns nil otherwise.<br />
</Function> If the optional first argument is passed, sets tilt to value and skew to value.<br />
<Function name='Hallway' return='float, float' arguments='float value, float approach_speed'> If the optional second argument is passed, sets the approach_speed for skew and tilt to it.
If the player is using Hallway (zero skew and negative tilt), returns the value of tilt and its approach_speed.<br /> </Function>
Returns nil otherwise.<br /> <Function name='Split' return='float, float' arguments='float value, float approach_speed'> </Function>
If the optional first argument is passed, sets tilt to negative value and skew to zero.<br /> <Function name='Stealth' return='float, float' arguments='float value, float approach_speed'> </Function>
Pass in a positive value for the familiar meaning of Hallway.<br /> <Function name='Stomp' return='bool' arguments='bool value'> </Function>
If the optional second argument is passed, sets the approach_speed for skew and tilt to it. <Function name='Sudden' return='float, float' arguments='float value, float approach_speed'> </Function>
</Function> <Function name='SuddenOffset' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Distant' return='float, float' arguments='float value, float approach_speed'> <Function name='SuperShuffle' return='bool' arguments='bool value'> </Function>
If the player is using Distant (zero skew and positive tilt), returns the value of tilt and its approach_speed.<br /> <Function name='TimeSpacing' return='float, float' arguments='float value, float approach_speed'>
Returns nil otherwise.<br /> TimeSpacing is one of the variables for controlling the speed mod.<br />
If the optional first argument is passed, sets tilt to value and skew to zero.<br /> Use CMod, XMod, or MMod to set the speed mod unless you have a good reason not to.<br />
If the optional second argument is passed, sets the approach_speed for skew and tilt to it. It controls whether the speed mod is in X mode or C mode. It should only be set to 0 or 1, and is only a float value to allow tweening between the two states.
</Function> </Function>
<Function name='GetStepAttacks' return='bool' argument=''> <Function name='Tilt' return='float, float' arguments='float value, float approach_speed'>
Returns true if step attacks or random attacks are enabled. Tilt is one of the mods for controlling the perspective. Use Overhead, Distant, Incoming, Space, Distant, or Hallway for controlling the perspective in the old way.<br />
</Function> Tilt tilts the note field forward and back.
</Function>
<Function name='Tiny' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Tipsy' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Tornado' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='TurnNone' return='bool' arguments='bool value'> </Function>
<Function name='Twirl' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Twister' return='bool' arguments='bool value'> </Function>
<Function name='UsingReverse' return='bool' arguments=''>
Returns <code>true</code> if the player is using reverse. (equivalent to <code>GetReverse() == 1.0</code>)
</Function>
<Function name='Wave' return='float, float' arguments='float value, float approach_speed'> </Function>
<Function name='Wide' return='bool' arguments='bool value'> </Function>
<Function name='XMod' return='float, float' arguments='float value, float approach_speed'>
If the player has a XMod set, returns the value of that XMod and its associated approach speed. Returns nil otherwise.<br />
If the optional first argument is passed, sets the XMod to the value and disables any CMod or MMod that is set.<br />
If the optional second argument is passed, sets the speed at which the transition occurs.
</Function>
<Function name='Xmode' return='float, float' arguments='float value, float approach_speed'> </Function>
</Class> </Class>
<Class name='PlayerStageStats'> <Class name='PlayerStageStats'>
<Function name='FailPlayer' return='bool' arguments=''> <Function name='FailPlayer' return='bool' arguments=''>
@@ -3788,6 +3791,9 @@ save yourself some time, copy this for undocumented things:
<Function name='Center1Player' return='bool' arguments=''> <Function name='Center1Player' return='bool' arguments=''>
Returns <code>true</code> if a single <Link class='Player' /> has its NoteField centered. Returns <code>true</code> if a single <Link class='Player' /> has its NoteField centered.
</Function> </Function>
<Function name='FailFadeRemovePlayer' return='void' arguments='PlayerNumber pn'>
Removes the notes for the specified player.
</Function>
<Function name='GetDummyPlayerInfo' return='PlayerInfo' arguments='int index'> <Function name='GetDummyPlayerInfo' return='PlayerInfo' arguments='int index'>
Returns a dummy PlayerInfo for the specified index. Returns a dummy PlayerInfo for the specified index.
</Function> </Function>
@@ -4300,14 +4306,8 @@ save yourself some time, copy this for undocumented things:
<Description> <Description>
See the description for PlayerOptions. The functions follow the same design. See the description for PlayerOptions. The functions follow the same design.
</Description> </Description>
<Function name='LifeSetting' return='LifeType' arguments='LifeType type'>
</Function>
<Function name='DrainSetting' return= 'DrainType' arguments='DrainType type'>
</Function>
<Function name='AutosyncSetting' return='AutosyncType' arguments='AutosyncType type'> <Function name='AutosyncSetting' return='AutosyncType' arguments='AutosyncType type'>
</Function> </Function>
<Function name='BatteryLives' return='int' arguments='int num'>
</Function>
<Function name='AssistClap' return='bool' arguments='bool b'> <Function name='AssistClap' return='bool' arguments='bool b'>
</Function> </Function>
<Function name='AssistMetronome' return='bool' arguments='bool b'> <Function name='AssistMetronome' return='bool' arguments='bool b'>
+4 -4
View File
@@ -2539,20 +2539,20 @@ Persp,4="mod,hallway;name,Hallway"
Persp,5="mod,distant;name,Distant" Persp,5="mod,distant;name,Distant"
# Song options # Song options
# LifeType="3;together" # LifeType="3"
LifeType=(GAMESTATE:IsCourseMode() and 3 or 2)..";together" LifeType=(GAMESTATE:IsCourseMode() and 3 or 2)..""
LifeTypeDefault="" LifeTypeDefault=""
LifeType,1="mod,bar;name,Bar" LifeType,1="mod,bar;name,Bar"
LifeType,2="mod,battery;name,Battery" LifeType,2="mod,battery;name,Battery"
LifeType,3="mod,lifetime;name,LifeTime" LifeType,3="mod,lifetime;name,LifeTime"
# #
BarDrain="3;together" BarDrain="3"
BarDrainDefault="" BarDrainDefault=""
BarDrain,1="mod,normal-drain;name,Normal" BarDrain,1="mod,normal-drain;name,Normal"
BarDrain,2="mod,norecover;name,NoRecover" BarDrain,2="mod,norecover;name,NoRecover"
BarDrain,3="mod,suddendeath;name,SuddenDeath" BarDrain,3="mod,suddendeath;name,SuddenDeath"
# #
BatLives="10;together" BatLives="10"
BatLivesDefault="" BatLivesDefault=""
BatLives,1="mod,1 life;name,1" BatLives,1="mod,1 life;name,1"
BatLives,2="mod,2 lives;name,2" BatLives,2="mod,2 lives;name,2"
+7 -4
View File
@@ -868,11 +868,14 @@ void GameCommand::ApplySelf( const vector<PlayerNumber> &vpns ) const
} }
// HACK: Set life type to BATTERY just once here so it happens once and // HACK: Set life type to BATTERY just once here so it happens once and
// we don't override the user's changes if they back out. // we don't override the user's changes if they back out.
if( GAMESTATE->m_PlayMode == PLAY_MODE_ONI && FOREACH_PlayerNumber(pn)
GAMESTATE->m_PlayMode != OldPlayMode &&
GAMESTATE->m_SongOptions.GetStage().m_LifeType == LifeType_Bar )
{ {
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_LifeType, LifeType_Battery ); if(GAMESTATE->m_PlayMode == PLAY_MODE_ONI &&
GAMESTATE->m_PlayMode != OldPlayMode &&
GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions.GetStage().m_LifeType ==LifeType_Bar)
{
PO_GROUP_ASSIGN(GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions, ModsLevel_Stage, m_LifeType, LifeType_Battery);
}
} }
} }
+1 -1
View File
@@ -4,7 +4,7 @@
#include "PlayerNumber.h" #include "PlayerNumber.h"
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "ActorFrame.h" #include "ActorFrame.h"
#include "SongOptions.h" #include "PlayerOptions.h"
class PlayerState; class PlayerState;
class PlayerStageStats; class PlayerStageStats;
+18 -19
View File
@@ -31,21 +31,6 @@ LifeMeterBar::LifeMeterBar()
m_pPlayerState = NULL; m_pPlayerState = NULL;
DrainType dtype = GAMESTATE->m_SongOptions.GetStage().m_DrainType;
switch( dtype )
{
case DrainType_Normal:
m_fLifePercentage = INITIAL_VALUE;
break;
/* These types only go down, so they always start at full. */
case DrainType_NoRecover:
case DrainType_SuddenDeath:
m_fLifePercentage = 1.0f; break;
default:
FAIL_M(ssprintf("Invalid DrainType: %i", dtype));
}
const RString sType = "LifeMeterBar"; const RString sType = "LifeMeterBar";
m_fPassingAlpha = 0; m_fPassingAlpha = 0;
@@ -97,6 +82,20 @@ void LifeMeterBar::Load( const PlayerState *pPlayerState, PlayerStageStats *pPla
PlayerNumber pn = pPlayerState->m_PlayerNumber; PlayerNumber pn = pPlayerState->m_PlayerNumber;
DrainType dtype = pPlayerState->m_PlayerOptions.GetStage().m_DrainType;
switch( dtype )
{
case DrainType_Normal:
m_fLifePercentage = INITIAL_VALUE;
break;
/* These types only go down, so they always start at full. */
case DrainType_NoRecover:
case DrainType_SuddenDeath:
m_fLifePercentage = 1.0f; break;
default:
FAIL_M(ssprintf("Invalid DrainType: %i", dtype));
}
// Change life difficulty to really easy if merciful beginner on // Change life difficulty to really easy if merciful beginner on
m_bMercifulBeginnerInEffect = m_bMercifulBeginnerInEffect =
GAMESTATE->m_PlayMode == PLAY_MODE_REGULAR && GAMESTATE->m_PlayMode == PLAY_MODE_REGULAR &&
@@ -129,9 +128,9 @@ void LifeMeterBar::ChangeLife( TapNoteScore score )
if( IsHot() && fDeltaLife < 0 ) if( IsHot() && fDeltaLife < 0 )
fDeltaLife = min( fDeltaLife, -0.10f ); // make it take a while to get back to "hot" fDeltaLife = min( fDeltaLife, -0.10f ); // make it take a while to get back to "hot"
switch( GAMESTATE->m_SongOptions.GetSong().m_DrainType ) switch(m_pPlayerState->m_PlayerOptions.GetSong().m_DrainType)
{ {
DEFAULT_FAIL( GAMESTATE->m_SongOptions.GetSong().m_DrainType ); DEFAULT_FAIL(m_pPlayerState->m_PlayerOptions.GetSong().m_DrainType);
case DrainType_Normal: case DrainType_Normal:
break; break;
case DrainType_NoRecover: case DrainType_NoRecover:
@@ -151,7 +150,7 @@ void LifeMeterBar::ChangeLife( TapNoteScore score )
void LifeMeterBar::ChangeLife( HoldNoteScore score, TapNoteScore tscore ) void LifeMeterBar::ChangeLife( HoldNoteScore score, TapNoteScore tscore )
{ {
float fDeltaLife=0.f; float fDeltaLife=0.f;
DrainType dtype = GAMESTATE->m_SongOptions.GetSong().m_DrainType; DrainType dtype = m_pPlayerState->m_PlayerOptions.GetSong().m_DrainType;
switch( dtype ) switch( dtype )
{ {
case DrainType_Normal: case DrainType_Normal:
@@ -219,7 +218,7 @@ void LifeMeterBar::ChangeLife( float fDeltaLife )
if( m_pPlayerStageStats->m_bFailed ) if( m_pPlayerStageStats->m_bFailed )
return; return;
switch( GAMESTATE->m_SongOptions.GetSong().m_DrainType ) switch(m_pPlayerState->m_PlayerOptions.GetSong().m_DrainType)
{ {
case DrainType_Normal: case DrainType_Normal:
case DrainType_NoRecover: case DrainType_NoRecover:
+17 -9
View File
@@ -9,7 +9,7 @@
LifeMeterBattery::LifeMeterBattery() LifeMeterBattery::LifeMeterBattery()
{ {
m_iLivesLeft = GAMESTATE->m_SongOptions.GetStage().m_iBatteryLives; m_iLivesLeft= 4;
m_iTrailingLivesLeft = m_iLivesLeft; m_iTrailingLivesLeft = m_iLivesLeft;
m_soundGainLife.Load( THEME->GetPathS("LifeMeterBattery","gain") ); m_soundGainLife.Load( THEME->GetPathS("LifeMeterBattery","gain") );
@@ -20,6 +20,9 @@ void LifeMeterBattery::Load( const PlayerState *pPlayerState, PlayerStageStats *
{ {
LifeMeter::Load( pPlayerState, pPlayerStageStats ); LifeMeter::Load( pPlayerState, pPlayerStageStats );
m_iLivesLeft = m_pPlayerState->m_PlayerOptions.GetStage().m_BatteryLives;
m_iTrailingLivesLeft = m_iLivesLeft;
const RString sType = "LifeMeterBattery"; const RString sType = "LifeMeterBattery";
PlayerNumber pn = pPlayerState->m_PlayerNumber; PlayerNumber pn = pPlayerState->m_PlayerNumber;
@@ -81,7 +84,7 @@ void LifeMeterBattery::OnSongEnded()
if( m_pPlayerStageStats->m_bFailed || m_iLivesLeft == 0 ) if( m_pPlayerStageStats->m_bFailed || m_iLivesLeft == 0 )
return; return;
if( m_iLivesLeft < GAMESTATE->m_SongOptions.GetSong().m_iBatteryLives ) if( m_iLivesLeft < m_pPlayerState->m_PlayerOptions.GetSong().m_BatteryLives )
{ {
m_iTrailingLivesLeft = m_iLivesLeft; m_iTrailingLivesLeft = m_iLivesLeft;
PlayerNumber pn = m_pPlayerState->m_PlayerNumber; PlayerNumber pn = m_pPlayerState->m_PlayerNumber;
@@ -96,12 +99,12 @@ void LifeMeterBattery::OnSongEnded()
PushSelf(L); PushSelf(L);
LuaHelpers::Push(L, pn); LuaHelpers::Push(L, pn);
RString error= "Error running CourseSongRewardLives callback: "; RString error= "Error running CourseSongRewardLives callback: ";
LuaHelpers::RunScriptOnStack(L, error, 1, 1, true); LuaHelpers::RunScriptOnStack(L, error, 2, 1, true);
m_iLivesLeft += luaL_optnumber(L, -1, 0); m_iLivesLeft += luaL_optnumber(L, -1, 0);
lua_settop(L, 0); lua_settop(L, 0);
LUA->Release(L); LUA->Release(L);
} }
m_iLivesLeft = min( m_iLivesLeft, GAMESTATE->m_SongOptions.GetSong().m_iBatteryLives ); m_iLivesLeft = min( m_iLivesLeft, m_pPlayerState->m_PlayerOptions.GetSong().m_BatteryLives );
if( m_iTrailingLivesLeft < m_iLivesLeft ) if( m_iTrailingLivesLeft < m_iLivesLeft )
m_soundGainLife.Play(); m_soundGainLife.Play();
@@ -213,7 +216,7 @@ bool LifeMeterBattery::IsInDanger() const
bool LifeMeterBattery::IsHot() const bool LifeMeterBattery::IsHot() const
{ {
return m_iLivesLeft == GAMESTATE->m_SongOptions.GetSong().m_iBatteryLives; return m_iLivesLeft == m_pPlayerState->m_PlayerOptions.GetSong().m_BatteryLives;
} }
bool LifeMeterBattery::IsFailing() const bool LifeMeterBattery::IsFailing() const
@@ -223,14 +226,14 @@ bool LifeMeterBattery::IsFailing() const
float LifeMeterBattery::GetLife() const float LifeMeterBattery::GetLife() const
{ {
if( !GAMESTATE->m_SongOptions.GetSong().m_iBatteryLives ) if(!m_pPlayerState->m_PlayerOptions.GetSong().m_BatteryLives)
return 1; return 1;
return float(m_iLivesLeft) / GAMESTATE->m_SongOptions.GetSong().m_iBatteryLives; return float(m_iLivesLeft) / m_pPlayerState->m_PlayerOptions.GetSong().m_BatteryLives;
} }
int LifeMeterBattery::GetRemainingLives() const int LifeMeterBattery::GetRemainingLives() const
{ {
if( !GAMESTATE->m_SongOptions.GetSong().m_iBatteryLives ) if( !m_pPlayerState->m_PlayerOptions.GetSong().m_BatteryLives )
return 1; return 1;
return m_iLivesLeft; return m_iLivesLeft;
@@ -246,6 +249,11 @@ void LifeMeterBattery::Refresh()
//update m_sprBattery //update m_sprBattery
} }
int LifeMeterBattery::GetTotalLives()
{
return m_pPlayerState->m_PlayerOptions.GetSong().m_BatteryLives;
}
void LifeMeterBattery::Update( float fDeltaTime ) void LifeMeterBattery::Update( float fDeltaTime )
{ {
LifeMeter::Update( fDeltaTime ); LifeMeter::Update( fDeltaTime );
@@ -259,7 +267,7 @@ class LunaLifeMeterBattery: public Luna<LifeMeterBattery>
{ {
public: public:
static int GetLivesLeft( T* p, lua_State *L ) { lua_pushnumber( L, p->GetLivesLeft() ); return 1; } static int GetLivesLeft( T* p, lua_State *L ) { lua_pushnumber( L, p->GetLivesLeft() ); return 1; }
static int GetTotalLives( T* p, lua_State *L ) { lua_pushnumber( L, GAMESTATE->m_SongOptions.GetSong().m_iBatteryLives ); return 1; } static int GetTotalLives( T* p, lua_State *L ) { lua_pushnumber(L, p->GetTotalLives()); return 1; }
static int ChangeLives( T* p, lua_State *L ) { p->ChangeLives(IArg(1)); return 0; } static int ChangeLives( T* p, lua_State *L ) { p->ChangeLives(IArg(1)); return 0; }
LunaLifeMeterBattery() LunaLifeMeterBattery()
+1
View File
@@ -32,6 +32,7 @@ public:
void Refresh(); void Refresh();
int GetLivesLeft() { return m_iLivesLeft; } int GetLivesLeft() { return m_iLivesLeft; }
int GetTotalLives();
void ChangeLives(int iLifeDiff); void ChangeLives(int iLifeDiff);
// Lua // Lua
+2 -2
View File
@@ -53,10 +53,10 @@
static int func_name(T* p, lua_State* L) \ static int func_name(T* p, lua_State* L) \
{ \ { \
DefaultNilArgs(L, 1); \ DefaultNilArgs(L, 1); \
lua_pushnumber(L, p->m_i ## member); \ lua_pushnumber(L, p->m_ ## member); \
if(lua_isnumber(L, 1)) \ if(lua_isnumber(L, 1)) \
{ \ { \
p->m_i ## member = IArg(1); \ p->m_ ## member = IArg(1); \
} \ } \
return 1; \ return 1; \
} }
+2 -2
View File
@@ -626,7 +626,7 @@ void Player::Load()
// TODO: Remove use of PlayerNumber. // TODO: Remove use of PlayerNumber.
PlayerNumber pn = m_pPlayerState->m_PlayerNumber; PlayerNumber pn = m_pPlayerState->m_PlayerNumber;
bool bOniDead = GAMESTATE->m_SongOptions.GetStage().m_LifeType == LifeType_Battery && bool bOniDead = m_pPlayerState->m_PlayerOptions.GetStage().m_LifeType == LifeType_Battery &&
(m_pPlayerStageStats == NULL || m_pPlayerStageStats->m_bFailed); (m_pPlayerStageStats == NULL || m_pPlayerStageStats->m_bFailed);
/* The editor reuses Players ... so we really need to make sure everything /* The editor reuses Players ... so we really need to make sure everything
@@ -1776,7 +1776,7 @@ int Player::GetClosestNonEmptyRow( int iNoteRow, int iMaxRowsAhead, int iMaxRows
bool Player::IsOniDead() const bool Player::IsOniDead() const
{ {
// If we're playing on oni and we've died, do nothing. // If we're playing on oni and we've died, do nothing.
return GAMESTATE->m_SongOptions.GetCurrent().m_LifeType == LifeType_Battery && m_pPlayerStageStats && m_pPlayerStageStats->m_bFailed; return m_pPlayerState->m_PlayerOptions.GetStage().m_LifeType == LifeType_Battery && m_pPlayerStageStats && m_pPlayerStageStats->m_bFailed;
} }
void Player::Fret( int col, int row, const RageTimer &tm, bool bHeld, bool bRelease ) void Player::Fret( int col, int row, const RageTimer &tm, bool bHeld, bool bRelease )
+67
View File
@@ -12,6 +12,24 @@
#include "CommonMetrics.h" #include "CommonMetrics.h"
#include <float.h> #include <float.h>
static const char *LifeTypeNames[] = {
"Bar",
"Battery",
"Time",
};
XToString( LifeType );
XToLocalizedString( LifeType );
LuaXType( LifeType );
static const char *DrainTypeNames[] = {
"Normal",
"NoRecover",
"SuddenDeath",
};
XToString( DrainType );
XToLocalizedString( DrainType );
LuaXType( DrainType );
void NextFloat( float fValues[], int size ); void NextFloat( float fValues[], int size );
void NextBool( bool bValues[], int size ); void NextBool( bool bValues[], int size );
@@ -31,6 +49,9 @@ static const float CMOD_DEFAULT= 200.0f;
void PlayerOptions::Init() void PlayerOptions::Init()
{ {
m_LifeType = LifeType_Bar;
m_DrainType = DrainType_Normal;
m_BatteryLives = 4;
m_bSetScrollSpeed = false; m_bSetScrollSpeed = false;
m_fMaxScrollBPM = 0; m_SpeedfMaxScrollBPM = 1.0f; m_fMaxScrollBPM = 0; m_SpeedfMaxScrollBPM = 1.0f;
m_fTimeSpacing = 0; m_SpeedfTimeSpacing = 1.0f; m_fTimeSpacing = 0; m_SpeedfTimeSpacing = 1.0f;
@@ -64,6 +85,9 @@ void PlayerOptions::Approach( const PlayerOptions& other, float fDeltaSeconds )
#define DO_COPY( x ) \ #define DO_COPY( x ) \
x = other.x; x = other.x;
DO_COPY( m_LifeType );
DO_COPY( m_DrainType );
DO_COPY( m_BatteryLives );
APPROACH( fTimeSpacing ); APPROACH( fTimeSpacing );
APPROACH( fScrollSpeed ); APPROACH( fScrollSpeed );
APPROACH( fMaxScrollBPM ); APPROACH( fMaxScrollBPM );
@@ -120,6 +144,26 @@ void PlayerOptions::GetMods( vector<RString> &AddTo, bool bForceNoteSkin ) const
{ {
//RString sReturn; //RString sReturn;
switch(m_LifeType)
{
case LifeType_Bar:
switch(m_DrainType)
{
case DrainType_Normal: break;
case DrainType_NoRecover: AddTo.push_back("NoRecover"); break;
case DrainType_SuddenDeath: AddTo.push_back("SuddenDeath"); break;
}
break;
case LifeType_Battery:
AddTo.push_back(ssprintf("%dLives", m_BatteryLives));
break;
case LifeType_Time:
AddTo.push_back("LifeTime");
break;
default:
FAIL_M(ssprintf("Invalid LifeType: %i", m_LifeType));
}
if( !m_fTimeSpacing ) if( !m_fTimeSpacing )
{ {
if( m_fMaxScrollBPM ) if( m_fMaxScrollBPM )
@@ -390,6 +434,17 @@ bool PlayerOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut
level= CMOD_DEFAULT; level= CMOD_DEFAULT;
SET_FLOAT(fScrollBPM) SET_FLOAT(fScrollBPM)
} }
else if( sBit == "life" || sBit == "lives" )
{
// level is a percentage for every other option, so multiply by 100. -Kyz
m_BatteryLives= level * 100.0f;
}
else if( sBit == "bar" ) { m_LifeType= LifeType_Bar; }
else if( sBit == "battery" ) { m_LifeType= LifeType_Battery; }
else if( sBit == "lifetime" ) { m_LifeType= LifeType_Time; }
else if( sBit == "norecover" || sBit == "power-drop" ) { m_DrainType= DrainType_NoRecover; }
else if( sBit == "suddendeath" || sBit == "death" ) { m_DrainType= DrainType_SuddenDeath; }
else if( sBit == "normal-drain" ) { m_DrainType= DrainType_Normal; }
else if( sBit == "boost" ) SET_FLOAT( fAccels[ACCEL_BOOST] ) else if( sBit == "boost" ) SET_FLOAT( fAccels[ACCEL_BOOST] )
else if( sBit == "brake" || sBit == "land" ) SET_FLOAT( fAccels[ACCEL_BRAKE] ) else if( sBit == "brake" || sBit == "land" ) SET_FLOAT( fAccels[ACCEL_BRAKE] )
else if( sBit == "wave" ) SET_FLOAT( fAccels[ACCEL_WAVE] ) else if( sBit == "wave" ) SET_FLOAT( fAccels[ACCEL_WAVE] )
@@ -688,6 +743,9 @@ float PlayerOptions::GetReversePercentForColumn( int iCol ) const
bool PlayerOptions::operator==( const PlayerOptions &other ) const bool PlayerOptions::operator==( const PlayerOptions &other ) const
{ {
#define COMPARE(x) { if( x != other.x ) return false; } #define COMPARE(x) { if( x != other.x ) return false; }
COMPARE(m_LifeType);
COMPARE(m_DrainType);
COMPARE(m_BatteryLives);
COMPARE(m_fTimeSpacing); COMPARE(m_fTimeSpacing);
COMPARE(m_fScrollSpeed); COMPARE(m_fScrollSpeed);
COMPARE(m_fScrollBPM); COMPARE(m_fScrollBPM);
@@ -889,6 +947,9 @@ void PlayerOptions::ResetPrefs( ResetPrefsType type )
case saved_prefs_invalid_for_course: case saved_prefs_invalid_for_course:
break; break;
} }
CPY(m_LifeType);
CPY(m_DrainType);
CPY(m_BatteryLives);
CPY( m_fPerspectiveTilt ); CPY( m_fPerspectiveTilt );
CPY( m_bTransforms[TRANSFORM_NOHOLDS] ); CPY( m_bTransforms[TRANSFORM_NOHOLDS] );
@@ -932,6 +993,9 @@ public:
// Direct control functions, for themes that can handle it. // Direct control functions, for themes that can handle it.
ENUM_INTERFACE(LifeSetting, LifeType, LifeType);
ENUM_INTERFACE(DrainSetting, DrainType, DrainType);
INT_INTERFACE(BatteryLives, BatteryLives);
FLOAT_INTERFACE(TimeSpacing, TimeSpacing, true); FLOAT_INTERFACE(TimeSpacing, TimeSpacing, true);
FLOAT_INTERFACE(MaxScrollBPM, MaxScrollBPM, true); FLOAT_INTERFACE(MaxScrollBPM, MaxScrollBPM, true);
FLOAT_INTERFACE(ScrollSpeed, ScrollSpeed, true); FLOAT_INTERFACE(ScrollSpeed, ScrollSpeed, true);
@@ -1298,6 +1362,9 @@ public:
ADD_METHOD( IsEasierForSongAndSteps ); ADD_METHOD( IsEasierForSongAndSteps );
ADD_METHOD( IsEasierForCourseAndTrail ); ADD_METHOD( IsEasierForCourseAndTrail );
ADD_METHOD(LifeSetting);
ADD_METHOD(DrainSetting);
ADD_METHOD(BatteryLives);
ADD_METHOD(TimeSpacing); ADD_METHOD(TimeSpacing);
ADD_METHOD(MaxScrollBPM); ADD_METHOD(MaxScrollBPM);
ADD_METHOD(ScrollSpeed); ADD_METHOD(ScrollSpeed);
+31 -1
View File
@@ -11,6 +11,31 @@ struct lua_State;
#include "GameConstantsAndTypes.h" #include "GameConstantsAndTypes.h"
#include "PlayerNumber.h" #include "PlayerNumber.h"
enum LifeType
{
LifeType_Bar,
LifeType_Battery,
LifeType_Time,
NUM_LifeType,
LifeType_Invalid
};
const RString& LifeTypeToString( LifeType cat );
const RString& LifeTypeToLocalizedString( LifeType cat );
LuaDeclareType( LifeType );
enum DrainType
{
DrainType_Normal,
DrainType_NoRecover,
DrainType_SuddenDeath,
NUM_DrainType,
DrainType_Invalid
};
const RString& DrainTypeToString( DrainType cat );
const RString& DrainTypeToLocalizedString( DrainType cat );
LuaDeclareType( DrainType );
/** @brief Per-player options that are not saved between sessions. */ /** @brief Per-player options that are not saved between sessions. */
class PlayerOptions class PlayerOptions
{ {
@@ -19,7 +44,9 @@ public:
* @brief Set up the PlayerOptions with some reasonable defaults. * @brief Set up the PlayerOptions with some reasonable defaults.
* *
* This code was taken from Init() to use proper initialization. */ * This code was taken from Init() to use proper initialization. */
PlayerOptions(): m_bSetScrollSpeed(false), PlayerOptions(): m_LifeType(LifeType_Bar), m_DrainType(DrainType_Normal),
m_BatteryLives(4),
m_bSetScrollSpeed(false),
m_fTimeSpacing(0), m_SpeedfTimeSpacing(1.0f), m_fTimeSpacing(0), m_SpeedfTimeSpacing(1.0f),
m_fMaxScrollBPM(0), m_SpeedfMaxScrollBPM(1.0f), m_fMaxScrollBPM(0), m_SpeedfMaxScrollBPM(1.0f),
m_fScrollSpeed(1.0f), m_SpeedfScrollSpeed(1.0f), m_fScrollSpeed(1.0f), m_SpeedfScrollSpeed(1.0f),
@@ -154,6 +181,9 @@ public:
float GetReversePercentForColumn( int iCol ) const; // accounts for all Directions float GetReversePercentForColumn( int iCol ) const; // accounts for all Directions
LifeType m_LifeType;
DrainType m_DrainType; // only used with LifeBar
int m_BatteryLives;
/* All floats have a corresponding speed setting, which determines how fast /* All floats have a corresponding speed setting, which determines how fast
* PlayerOptions::Approach approaches. */ * PlayerOptions::Approach approaches. */
bool m_bSetScrollSpeed; // true if the scroll speed was set by FromString bool m_bSetScrollSpeed; // true if the scroll speed was set by FromString
+37 -15
View File
@@ -135,7 +135,7 @@ void PlayerInfo::Load( PlayerNumber pn, MultiPlayer mp, bool bShowNoteField, int
break; break;
case PLAY_MODE_ONI: case PLAY_MODE_ONI:
case PLAY_MODE_ENDLESS: case PLAY_MODE_ENDLESS:
if( GAMESTATE->m_SongOptions.GetStage().m_LifeType == LifeType_Time ) if( GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions.GetStage().m_LifeType == LifeType_Time )
m_pPrimaryScoreDisplay = new ScoreDisplayLifeTime; m_pPrimaryScoreDisplay = new ScoreDisplayLifeTime;
else else
m_pPrimaryScoreDisplay = new ScoreDisplayOni; m_pPrimaryScoreDisplay = new ScoreDisplayOni;
@@ -573,7 +573,7 @@ void ScreenGameplay::Init()
if( !GAMESTATE->IsPlayerEnabled(pi->m_pn) && !SHOW_LIFE_METER_FOR_DISABLED_PLAYERS ) if( !GAMESTATE->IsPlayerEnabled(pi->m_pn) && !SHOW_LIFE_METER_FOR_DISABLED_PLAYERS )
continue; // skip continue; // skip
pi->m_pLifeMeter = LifeMeter::MakeLifeMeter( GAMESTATE->m_SongOptions.GetStage().m_LifeType ); pi->m_pLifeMeter = LifeMeter::MakeLifeMeter( pi->GetPlayerState()->m_PlayerOptions.GetStage().m_LifeType );
pi->m_pLifeMeter->Load( pi->GetPlayerState(), pi->GetPlayerStageStats() ); pi->m_pLifeMeter->Load( pi->GetPlayerState(), pi->GetPlayerStageStats() );
pi->m_pLifeMeter->SetName( ssprintf("Life%s",pi->GetName().c_str()) ); pi->m_pLifeMeter->SetName( ssprintf("Life%s",pi->GetName().c_str()) );
LOAD_ALL_COMMANDS_AND_SET_XY( pi->m_pLifeMeter ); LOAD_ALL_COMMANDS_AND_SET_XY( pi->m_pLifeMeter );
@@ -585,7 +585,7 @@ void ScreenGameplay::Init()
// not 100% sure of that. -freem // not 100% sure of that. -freem
if( !GAMESTATE->IsPlayerEnabled(pi->m_pn) && SHOW_LIFE_METER_FOR_DISABLED_PLAYERS ) if( !GAMESTATE->IsPlayerEnabled(pi->m_pn) && SHOW_LIFE_METER_FOR_DISABLED_PLAYERS )
{ {
if(GAMESTATE->m_SongOptions.GetStage().m_LifeType == LifeType_Bar) if(pi->GetPlayerState()->m_PlayerOptions.GetStage().m_LifeType == LifeType_Bar)
static_cast<LifeMeterBar*>(pi->m_pLifeMeter)->ChangeLife(-1.0f); static_cast<LifeMeterBar*>(pi->m_pLifeMeter)->ChangeLife(-1.0f);
} }
} }
@@ -1097,10 +1097,12 @@ void ScreenGameplay::LoadNextSong()
/* If we're in battery mode, force FailImmediate. We assume in Player::Step /* If we're in battery mode, force FailImmediate. We assume in Player::Step
* that failed players can't step. */ * that failed players can't step. */
if( GAMESTATE->m_SongOptions.GetCurrent().m_LifeType == LifeType_Battery ) FOREACH_EnabledPlayerInfo( m_vPlayerInfo, pi )
{ {
FOREACH_EnabledPlayerInfo( m_vPlayerInfo, pi ) if(pi->GetPlayerState()->m_PlayerOptions.GetStage().m_LifeType == LifeType_Battery)
PO_GROUP_ASSIGN( pi->GetPlayerState()->m_PlayerOptions, ModsLevel_Song, m_FailType, FailType_Immediate ); {
PO_GROUP_ASSIGN(pi->GetPlayerState()->m_PlayerOptions, ModsLevel_Song, m_FailType, FailType_Immediate);
}
} }
m_textSongOptions.SetText( GAMESTATE->m_SongOptions.GetCurrent().GetString() ); m_textSongOptions.SetText( GAMESTATE->m_SongOptions.GetCurrent().GetString() );
@@ -1133,10 +1135,10 @@ void ScreenGameplay::LoadNextSong()
// reset oni game over graphic // reset oni game over graphic
SET_XY_AND_ON_COMMAND( pi->m_sprOniGameOver ); SET_XY_AND_ON_COMMAND( pi->m_sprOniGameOver );
if( GAMESTATE->m_SongOptions.GetCurrent().m_LifeType==LifeType_Battery && pi->GetPlayerStageStats()->m_bFailed ) // already failed if(pi->GetPlayerState()->m_PlayerOptions.GetStage().m_LifeType==LifeType_Battery && pi->GetPlayerStageStats()->m_bFailed) // already failed
pi->ShowOniGameOver(); pi->ShowOniGameOver();
if( GAMESTATE->m_SongOptions.GetCurrent().m_LifeType==LifeType_Bar && pi->m_pLifeMeter ) if(pi->GetPlayerState()->m_PlayerOptions.GetStage().m_LifeType==LifeType_Bar && pi->m_pLifeMeter )
pi->m_pLifeMeter->UpdateNonstopLifebar(); pi->m_pLifeMeter->UpdateNonstopLifebar();
if( pi->m_pStepsDisplay ) if( pi->m_pStepsDisplay )
@@ -1649,7 +1651,7 @@ void ScreenGameplay::Update( float fDeltaTime )
PlayerNumber pn = pi->GetStepsAndTrailIndex(); PlayerNumber pn = pi->GetStepsAndTrailIndex();
FailType ft = GAMESTATE->GetPlayerFailType( pi->GetPlayerState() ); FailType ft = GAMESTATE->GetPlayerFailType( pi->GetPlayerState() );
LifeType lt = GAMESTATE->m_SongOptions.GetCurrent().m_LifeType; LifeType lt = pi->GetPlayerState()->m_PlayerOptions.GetStage().m_LifeType;
if( ft == FailType_Off || ft == FailType_EndOfSong ) if( ft == FailType_Off || ft == FailType_EndOfSong )
continue; continue;
@@ -1683,12 +1685,7 @@ void ScreenGameplay::Update( float fDeltaTime )
if( !STATSMAN->m_CurStageStats.AllFailed() ) // if not the last one to fail if( !STATSMAN->m_CurStageStats.AllFailed() ) // if not the last one to fail
{ {
// kill them! // kill them!
SOUND->PlayOnceFromDir( THEME->GetPathS(m_sName,"oni die") ); FailFadeRemovePlayer(&*pi);
pi->ShowOniGameOver();
int tracks = pi->m_NoteData.GetNumTracks();
pi->m_NoteData.Init(); // remove all notes and scoring
pi->m_NoteData.SetNumTracks(tracks); // reset the number of tracks.
pi->m_pPlayer->FadeToFail(); // tell the NoteField to fade to white
} }
} }
} }
@@ -1919,6 +1916,24 @@ void ScreenGameplay::Update( float fDeltaTime )
} }
} }
void ScreenGameplay::FailFadeRemovePlayer(PlayerInfo* pi)
{
SOUND->PlayOnceFromDir( THEME->GetPathS(m_sName,"oni die") );
pi->ShowOniGameOver();
int tracks = pi->m_NoteData.GetNumTracks();
pi->m_NoteData.Init(); // remove all notes and scoring
pi->m_NoteData.SetNumTracks(tracks); // reset the number of tracks.
pi->m_pPlayer->FadeToFail(); // tell the NoteField to fade to white
}
void ScreenGameplay::FailFadeRemovePlayer(PlayerNumber pn)
{
if(pn < m_vPlayerInfo.size())
{
FailFadeRemovePlayer(&m_vPlayerInfo[pn]);
}
}
float ScreenGameplay::GetHasteRate() float ScreenGameplay::GetHasteRate()
{ {
return m_fCurrHasteRate; return m_fCurrHasteRate;
@@ -2989,6 +3004,12 @@ public:
lua_pushnumber(L, true_bps); lua_pushnumber(L, true_bps);
return 1; return 1;
} }
static int FailFadeRemovePlayer(T* p, lua_State* L)
{
PlayerNumber pn= Enum::Check<PlayerNumber>(L, 1);
p->FailFadeRemovePlayer(pn);
return 0;
}
LunaScreenGameplay() LunaScreenGameplay()
{ {
@@ -3006,6 +3027,7 @@ public:
ADD_METHOD( HasteTimeBetweenUpdates ); ADD_METHOD( HasteTimeBetweenUpdates );
ADD_METHOD( HasteLifeSwitchPoint ); ADD_METHOD( HasteLifeSwitchPoint );
ADD_METHOD( GetTrueBPS ); ADD_METHOD( GetTrueBPS );
ADD_METHOD( FailFadeRemovePlayer );
} }
}; };
+3
View File
@@ -172,6 +172,9 @@ public:
bool IsPaused() const { return m_bPaused; } bool IsPaused() const { return m_bPaused; }
float GetHasteRate(); float GetHasteRate();
void FailFadeRemovePlayer(PlayerInfo* pi);
void FailFadeRemovePlayer(PlayerNumber pn);
vector<float> m_HasteTurningPoints; // Values at which the meaning of GAMESTATE->m_fHasteRate changes. vector<float> m_HasteTurningPoints; // Values at which the meaning of GAMESTATE->m_fHasteRate changes.
vector<float> m_HasteAddAmounts; // Amounts that are added to speed depending on what turning point has been passed. vector<float> m_HasteAddAmounts; // Amounts that are added to speed depending on what turning point has been passed.
float m_fHasteTimeBetweenUpdates; // Seconds between haste updates. float m_fHasteTimeBetweenUpdates; // Seconds between haste updates.
+1 -1
View File
@@ -197,8 +197,8 @@ void ScreenJukebox::Init()
PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, .25f ); PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fScrollSpeed, .25f );
PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fPerspectiveTilt, -1.0f ); PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fPerspectiveTilt, -1.0f );
PO_GROUP_ASSIGN_N( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fEffects, PlayerOptions::EFFECT_TINY, 1.0f ); PO_GROUP_ASSIGN_N( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_fEffects, PlayerOptions::EFFECT_TINY, 1.0f );
PO_GROUP_ASSIGN( GAMESTATE->m_pPlayerState[p]->m_PlayerOptions, ModsLevel_Stage, m_LifeType, LifeType_Battery );
} }
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_LifeType, LifeType_Battery );
} }
FOREACH_EnabledPlayer( p ) FOREACH_EnabledPlayer( p )
+11 -3
View File
@@ -1254,11 +1254,19 @@ bool ScreenSelectMusic::MenuStart( const InputEventPlus &input )
// apply #LIVES // apply #LIVES
if( pCourse->m_iLives != -1 ) if( pCourse->m_iLives != -1 )
{ {
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_LifeType, LifeType_Battery ); FOREACH_EnabledPlayer(pn)
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_iBatteryLives, pCourse->m_iLives ); {
PO_GROUP_ASSIGN(GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions, ModsLevel_Stage, m_LifeType, LifeType_Battery);
PO_GROUP_ASSIGN(GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions, ModsLevel_Stage, m_BatteryLives, pCourse->m_iLives);
}
} }
if( pCourse->GetCourseType() == COURSE_TYPE_SURVIVAL) if( pCourse->GetCourseType() == COURSE_TYPE_SURVIVAL)
SO_GROUP_ASSIGN( GAMESTATE->m_SongOptions, ModsLevel_Stage, m_LifeType, LifeType_Time ); {
FOREACH_EnabledPlayer(pn)
{
PO_GROUP_ASSIGN(GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions, ModsLevel_Stage, m_LifeType, LifeType_Time);
}
}
} }
else else
{ {
+1 -69
View File
@@ -4,24 +4,6 @@
#include "GameState.h" #include "GameState.h"
#include "CommonMetrics.h" #include "CommonMetrics.h"
static const char *LifeTypeNames[] = {
"Bar",
"Battery",
"Time",
};
XToString( LifeType );
XToLocalizedString( LifeType );
LuaXType( LifeType );
static const char *DrainTypeNames[] = {
"Normal",
"NoRecover",
"SuddenDeath",
};
XToString( DrainType );
XToLocalizedString( DrainType );
LuaXType( DrainType );
static const char *AutosyncTypeNames[] = { static const char *AutosyncTypeNames[] = {
"Off", "Off",
"Song", "Song",
@@ -43,9 +25,6 @@ LuaXType( SoundEffectType );
void SongOptions::Init() void SongOptions::Init()
{ {
m_LifeType = LifeType_Bar;
m_DrainType = DrainType_Normal;
m_iBatteryLives = 4;
m_bAssistClap = false; m_bAssistClap = false;
m_bAssistMetronome = false; m_bAssistMetronome = false;
m_fMusicRate = 1.0f; m_fMusicRate = 1.0f;
@@ -67,9 +46,6 @@ void SongOptions::Approach( const SongOptions& other, float fDeltaSeconds )
#define DO_COPY( x ) \ #define DO_COPY( x ) \
x = other.x; x = other.x;
DO_COPY( m_LifeType );
DO_COPY( m_DrainType );
DO_COPY( m_iBatteryLives );
APPROACH( fMusicRate ); APPROACH( fMusicRate );
APPROACH( fHaste ); APPROACH( fHaste );
DO_COPY( m_bAssistClap ); DO_COPY( m_bAssistClap );
@@ -96,27 +72,6 @@ static void AddPart( vector<RString> &AddTo, float level, RString name )
void SongOptions::GetMods( vector<RString> &AddTo ) const void SongOptions::GetMods( vector<RString> &AddTo ) const
{ {
switch( m_LifeType )
{
case LifeType_Bar:
switch( m_DrainType )
{
case DrainType_Normal: break;
case DrainType_NoRecover: AddTo.push_back("NoRecover"); break;
case DrainType_SuddenDeath: AddTo.push_back("SuddenDeath"); break;
}
break;
case LifeType_Battery:
AddTo.push_back( ssprintf( "%dLives", m_iBatteryLives ) );
break;
case LifeType_Time:
AddTo.push_back( "LifeTime" );
break;
default:
FAIL_M(ssprintf("Invalid LifeType: %i", m_LifeType));
}
if( m_fMusicRate != 1 ) if( m_fMusicRate != 1 )
{ {
RString s = ssprintf( "%2.2f", m_fMusicRate ); RString s = ssprintf( "%2.2f", m_fMusicRate );
@@ -210,12 +165,6 @@ bool SongOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut )
} }
matches.clear(); matches.clear();
Regex lives("^([0-9]+) ?(lives|life)$");
if( lives.Compare(sBit, matches) )
{
m_iBatteryLives = StringToInt( matches[0] );
return true;
}
vector<RString> asParts; vector<RString> asParts;
split( sBit, " ", asParts, true ); split( sBit, " ", asParts, true );
@@ -227,12 +176,7 @@ bool SongOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut )
on = false; on = false;
} }
if( sBit == "norecover" ) m_DrainType = DrainType_NoRecover; if( sBit == "clap" ) m_bAssistClap = on;
else if( sBit == "suddendeath" || sBit == "death" ) m_DrainType = DrainType_SuddenDeath;
else if( sBit == "power-drop" ) m_DrainType = DrainType_NoRecover;
else if( sBit == "normal-drain" ) m_DrainType = DrainType_Normal;
else if( sBit == "clap" ) m_bAssistClap = on;
else if( sBit == "metronome" ) m_bAssistMetronome = on; else if( sBit == "metronome" ) m_bAssistMetronome = on;
else if( sBit == "autosync" || sBit == "autosyncsong" ) m_AutosyncType = on ? AutosyncType_Song : AutosyncType_Off; else if( sBit == "autosync" || sBit == "autosyncsong" ) m_AutosyncType = on ? AutosyncType_Song : AutosyncType_Off;
else if( sBit == "autosyncmachine" ) m_AutosyncType = on ? AutosyncType_Machine : AutosyncType_Off; else if( sBit == "autosyncmachine" ) m_AutosyncType = on ? AutosyncType_Machine : AutosyncType_Off;
@@ -244,9 +188,6 @@ bool SongOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut )
else if( sBit == "randombg" ) m_bRandomBGOnly = on; else if( sBit == "randombg" ) m_bRandomBGOnly = on;
else if( sBit == "savescore" ) m_bSaveScore = on; else if( sBit == "savescore" ) m_bSaveScore = on;
else if( sBit == "savereplay" ) m_bSaveReplay = on; else if( sBit == "savereplay" ) m_bSaveReplay = on;
else if( sBit == "bar" ) m_LifeType = LifeType_Bar;
else if( sBit == "battery" ) m_LifeType = LifeType_Battery;
else if( sBit == "lifetime" ) m_LifeType = LifeType_Time;
else if( sBit == "haste" ) m_fHaste = on? 1.0f:0.0f; else if( sBit == "haste" ) m_fHaste = on? 1.0f:0.0f;
else else
return false; return false;
@@ -257,9 +198,6 @@ bool SongOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut )
bool SongOptions::operator==( const SongOptions &other ) const bool SongOptions::operator==( const SongOptions &other ) const
{ {
#define COMPARE(x) { if( x != other.x ) return false; } #define COMPARE(x) { if( x != other.x ) return false; }
COMPARE( m_LifeType );
COMPARE( m_DrainType );
COMPARE( m_iBatteryLives );
COMPARE( m_fMusicRate ); COMPARE( m_fMusicRate );
COMPARE( m_fHaste ); COMPARE( m_fHaste );
COMPARE( m_bAssistClap ); COMPARE( m_bAssistClap );
@@ -283,12 +221,9 @@ class LunaSongOptions: public Luna<SongOptions>
{ {
public: public:
ENUM_INTERFACE(LifeSetting, LifeType, LifeType);
ENUM_INTERFACE(DrainSetting, DrainType, DrainType);
ENUM_INTERFACE(AutosyncSetting, AutosyncType, AutosyncType); ENUM_INTERFACE(AutosyncSetting, AutosyncType, AutosyncType);
//ENUM_INTERFACE(SoundEffectSetting, SoundEffectType, SoundEffectType); //ENUM_INTERFACE(SoundEffectSetting, SoundEffectType, SoundEffectType);
// Broken, SoundEffectType_Speed disables rate mod, other settings have no effect. -Kyz // Broken, SoundEffectType_Speed disables rate mod, other settings have no effect. -Kyz
INT_INTERFACE(BatteryLives, BatteryLives);
BOOL_INTERFACE(AssistClap, AssistClap); BOOL_INTERFACE(AssistClap, AssistClap);
BOOL_INTERFACE(AssistMetronome, AssistMetronome); BOOL_INTERFACE(AssistMetronome, AssistMetronome);
BOOL_INTERFACE(StaticBackground, StaticBackground); BOOL_INTERFACE(StaticBackground, StaticBackground);
@@ -300,11 +235,8 @@ public:
LunaSongOptions() LunaSongOptions()
{ {
ADD_METHOD(LifeSetting);
ADD_METHOD(DrainSetting);
ADD_METHOD(AutosyncSetting); ADD_METHOD(AutosyncSetting);
//ADD_METHOD(SoundEffectSetting); //ADD_METHOD(SoundEffectSetting);
ADD_METHOD(BatteryLives);
ADD_METHOD(AssistClap); ADD_METHOD(AssistClap);
ADD_METHOD(AssistMetronome); ADD_METHOD(AssistMetronome);
ADD_METHOD(StaticBackground); ADD_METHOD(StaticBackground);
+1 -29
View File
@@ -5,30 +5,6 @@
#include "EnumHelper.h" #include "EnumHelper.h"
enum LifeType
{
LifeType_Bar,
LifeType_Battery,
LifeType_Time,
NUM_LifeType,
LifeType_Invalid
};
const RString& LifeTypeToString( LifeType cat );
const RString& LifeTypeToLocalizedString( LifeType cat );
LuaDeclareType( LifeType );
enum DrainType
{
DrainType_Normal,
DrainType_NoRecover,
DrainType_SuddenDeath,
NUM_DrainType,
DrainType_Invalid
};
const RString& DrainTypeToString( DrainType cat );
const RString& DrainTypeToLocalizedString( DrainType cat );
LuaDeclareType( DrainType );
enum AutosyncType enum AutosyncType
{ {
AutosyncType_Off, AutosyncType_Off,
@@ -57,9 +33,6 @@ LuaDeclareType( SoundEffectType );
class SongOptions class SongOptions
{ {
public: public:
LifeType m_LifeType;
DrainType m_DrainType; // only used with LifeBar
int m_iBatteryLives;
bool m_bAssistClap; bool m_bAssistClap;
bool m_bAssistMetronome; bool m_bAssistMetronome;
float m_fMusicRate, m_SpeedfMusicRate; float m_fMusicRate, m_SpeedfMusicRate;
@@ -76,8 +49,7 @@ public:
* *
* This is taken from Init(), but uses the intended * This is taken from Init(), but uses the intended
* initialization lists. */ * initialization lists. */
SongOptions(): m_LifeType(LifeType_Bar), m_DrainType(DrainType_Normal), SongOptions(): m_bAssistClap(false),
m_iBatteryLives(4), m_bAssistClap(false),
m_bAssistMetronome(false), m_fMusicRate(1.0f), m_bAssistMetronome(false), m_fMusicRate(1.0f),
m_SpeedfMusicRate(1.0f), m_fHaste(0.0f), m_SpeedfMusicRate(1.0f), m_fHaste(0.0f),
m_SpeedfHaste(1.0f), m_AutosyncType(AutosyncType_Off), m_SpeedfHaste(1.0f), m_AutosyncType(AutosyncType_Off),