[sm130score -> sm130futures] Complete for now.
This commit is contained in:
@@ -13,6 +13,11 @@ _____________________________________________________________________________
|
|||||||
sm-ssc $SM5VERSION | 2011????
|
sm-ssc $SM5VERSION | 2011????
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
20110417
|
||||||
|
--------
|
||||||
|
* Use lua for all primary score keeping. Course modes right now still use the
|
||||||
|
old fashioned system. [TeruFSX, Wolfman2000]
|
||||||
|
|
||||||
20110409
|
20110409
|
||||||
--------
|
--------
|
||||||
* [Player] Force hold judgments to take place before setting the score.
|
* [Player] Force hold judgments to take place before setting the score.
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
local t = Def.ActorFrame {};
|
||||||
|
|
||||||
|
if( not GAMESTATE:IsCourseMode() ) then
|
||||||
|
t[#t+1] = Def.Actor{
|
||||||
|
JudgmentMessageCommand = function(self, params)
|
||||||
|
Scoring[GetUserPref("UserPrefScoringMode")](params,
|
||||||
|
STATSMAN:GetCurStageStats():GetPlayerStageStats(params.Player))
|
||||||
|
end;
|
||||||
|
};
|
||||||
|
end;
|
||||||
|
return t;
|
||||||
@@ -478,6 +478,9 @@ Edit Course=Edit Course contents.
|
|||||||
Shuffle=Shuffle the songs around.
|
Shuffle=Shuffle the songs around.
|
||||||
#
|
#
|
||||||
GamePrefDefaultFail=Immediate fail causes a player to die when their life bar reaches 0. ImmediateContinue allows you to continue playing afterwards.
|
GamePrefDefaultFail=Immediate fail causes a player to die when their life bar reaches 0. ImmediateContinue allows you to continue playing afterwards.
|
||||||
|
#
|
||||||
|
UserPrefScoringMode=Select the scoring mode to be used when not in a course.
|
||||||
|
|
||||||
[OptionNames]
|
[OptionNames]
|
||||||
0=0
|
0=0
|
||||||
0.25x=0.25x
|
0.25x=0.25x
|
||||||
@@ -1049,6 +1052,8 @@ Edit Course=Edit Course
|
|||||||
Shuffle=Shuffle
|
Shuffle=Shuffle
|
||||||
#
|
#
|
||||||
GamePrefDefaultFail=Default Fail Type
|
GamePrefDefaultFail=Default Fail Type
|
||||||
|
#
|
||||||
|
UserPrefScoringMode=Scoring Mode
|
||||||
[PaneDisplay]
|
[PaneDisplay]
|
||||||
Steps=Steps
|
Steps=Steps
|
||||||
Holds=Holds
|
Holds=Holds
|
||||||
|
|||||||
@@ -139,3 +139,40 @@ ThemePrefs =
|
|||||||
-- global aliases
|
-- global aliases
|
||||||
GetThemePref = ThemePrefs.Get
|
GetThemePref = ThemePrefs.Get
|
||||||
SetThemePref = ThemePrefs.Set
|
SetThemePref = ThemePrefs.Set
|
||||||
|
|
||||||
|
|
||||||
|
-- bring in SpecialScoring from default.
|
||||||
|
|
||||||
|
function InitUserPrefs()
|
||||||
|
if GetUserPref("UserPrefScoringMode") == nil then
|
||||||
|
SetUserPref("UserPrefScoringMode", 'DDR Extreme');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function UserPrefScoringMode()
|
||||||
|
local baseChoices = { 'DDR 1stMIX', 'DDR 4thMIX', 'DDR Extreme', 'DDR SuperNOVA', 'DDR SuperNOVA 2', 'MIGS' }; --'[SSC] Radar Master'
|
||||||
|
local t = {
|
||||||
|
Name = "UserPrefScoringMode";
|
||||||
|
LayoutType = "ShowAllInRow";
|
||||||
|
SelectType = "SelectOne";
|
||||||
|
OneChoiceForAllPlayers = true;
|
||||||
|
ExportOnChange = false;
|
||||||
|
Choices = baseChoices;
|
||||||
|
LoadSelections = function(self, list, pn)
|
||||||
|
if ReadPrefFromFile("UserPrefScoringMode") ~= nil then
|
||||||
|
local theValue = ReadPrefFromFile("UserPrefScoringMode");
|
||||||
|
local success = false;
|
||||||
|
for k,v in ipairs(baseChoices) do if v == theValue then list[k] = true success = true break end end;
|
||||||
|
if success == false then list[1] = true end;
|
||||||
|
else
|
||||||
|
WritePrefToFile("UserPrefScoringMode", 'DDR Extreme');
|
||||||
|
list[1] = true;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
SaveSelections = function(self, list, pn)
|
||||||
|
for k,v in ipairs(list) do if v then WritePrefToFile("UserPrefScoringMode", baseChoices[k]) break end end;
|
||||||
|
end;
|
||||||
|
};
|
||||||
|
setmetatable( t, t );
|
||||||
|
return t;
|
||||||
|
end
|
||||||
+69
-16
@@ -10,8 +10,7 @@ local ZeroIfNotFound = { __index = function() return 0 end; };
|
|||||||
function GetTotalItems(radars)
|
function GetTotalItems(radars)
|
||||||
return radars:GetValue('RadarCategory_TapsAndHolds')
|
return radars:GetValue('RadarCategory_TapsAndHolds')
|
||||||
+ radars:GetValue('RadarCategory_Holds')
|
+ radars:GetValue('RadarCategory_Holds')
|
||||||
+ radars:GetValue('RadarCategory_Rolls')
|
+ radars:GetValue('RadarCategory_Rolls');
|
||||||
+ radars:GetValue('RadarCategory_Lifts');
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
-- Determine whether marvelous timing is to be considered.
|
-- Determine whether marvelous timing is to be considered.
|
||||||
@@ -33,21 +32,43 @@ end;
|
|||||||
r['DDR 1stMIX'] = function(params, pss)
|
r['DDR 1stMIX'] = function(params, pss)
|
||||||
local dCombo = math.floor((pss:GetCurrentCombo()+1)/4);
|
local dCombo = math.floor((pss:GetCurrentCombo()+1)/4);
|
||||||
local bScore = (dCombo^2+1) * 100;
|
local bScore = (dCombo^2+1) * 100;
|
||||||
local multLookup = { ['TapNoteScore_W1']=3, ['TapNoteScore_W2']=3, ['TapNoteScore_W3']=1 };
|
local multLookup =
|
||||||
|
{
|
||||||
|
['TapNoteScore_W1']=3,
|
||||||
|
['TapNoteScore_W2']=3,
|
||||||
|
['TapNoteScore_W3']=1
|
||||||
|
};
|
||||||
setmetatable(multLookup, ZeroIfNotFound);
|
setmetatable(multLookup, ZeroIfNotFound);
|
||||||
--if score increases above the boundaries of a 32-bit signed
|
--if score increases above the boundaries of a 32-bit signed
|
||||||
--(about 2.15 billion), it stops increasing. Conveniently,
|
--(about 2.15 billion), it stops increasing. Conveniently,
|
||||||
--1st Mix clamped score as well.
|
--1st Mix clamped score as well.
|
||||||
pss:SetScore(clamp(pss:GetScore()+(bScore*multLookup[params.TapNoteScore]),0,999999999));
|
local capScore = 999999999;
|
||||||
|
local bestScore = bScore * multLookup['TapNoteScore_W1'];
|
||||||
|
local localScore = bScore * multLookup[params.TapNoteScore];
|
||||||
|
pss:SetCurMaxScore(clamp(pss:GetCurMaxScore()+(bestScore),0,capScore));
|
||||||
|
pss:SetScore(clamp(pss:GetScore()+(localScore),0,capScore));
|
||||||
|
|
||||||
end;
|
end;
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
--DDR 4th Mix/Extra Mix/Konamix/GB3/DDRPC Scoring
|
--DDR 4th Mix/Extra Mix/Konamix/GB3/DDRPC Scoring
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
r['DDR 4thMIX'] = function(params, pss)
|
r['DDR 4thMIX'] = function(params, pss)
|
||||||
local scoreLookupTable = { ['TapNoteScore_W1']=777, ['TapNoteScore_W2']=777, ['TapNoteScore_W3']=555 };
|
local scoreLookupTable =
|
||||||
|
{
|
||||||
|
['TapNoteScore_W1']=777,
|
||||||
|
['TapNoteScore_W2']=777,
|
||||||
|
['TapNoteScore_W3']=555
|
||||||
|
};
|
||||||
setmetatable(scoreLookupTable, ZeroIfNotFound);
|
setmetatable(scoreLookupTable, ZeroIfNotFound);
|
||||||
|
-- TODO: Modify this so that current max assumes full combo?
|
||||||
local comboBonusForThisStep = (pss:GetCurrentCombo()+1)*333;
|
local comboBonusForThisStep = (pss:GetCurrentCombo()+1)*333;
|
||||||
pss:SetScore(clamp(pss:GetScore()+scoreLookupTable[params.TapNoteScore]+(scoreLookupTable[params.TapNoteScore] and comboBonusForThisStep or 0),0,999999999));
|
local capScore = 999999999;
|
||||||
|
local bestPoints = scoreLookupTable['TapNoteScore_W1'];
|
||||||
|
local bestCombo = bestPoints and comboBonusForThisStep or 0;
|
||||||
|
pss:SeCurMaxScore(clamp(pss:GeCurMaxScore()+bestPoints+bestCombo,0,capScore));
|
||||||
|
local localPoints = scoreLookupTable[params.TapNoteScore];
|
||||||
|
local localCombo = localPoints and comboBonusForThisStep or 0;
|
||||||
|
pss:SetScore(clamp(pss:GetScore()+localPoints+localCombo,0,capScore));
|
||||||
end;
|
end;
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
--DDR MAX2/Extreme Scoring
|
--DDR MAX2/Extreme Scoring
|
||||||
@@ -69,7 +90,10 @@ r['DDR Extreme'] = function(params, pss)
|
|||||||
Shared.CurrentStep = 0
|
Shared.CurrentStep = 0
|
||||||
end;
|
end;
|
||||||
Shared.CurrentStep = Shared.CurrentStep + 1;
|
Shared.CurrentStep = Shared.CurrentStep + 1;
|
||||||
local stepLast = math.floor(baseScore / singleStep) * (Shared.CurrentStep);
|
local stepValue = math.floor(baseScore /singleStep);
|
||||||
|
local stepLast = stepValue * Shared.CurrentStep;
|
||||||
|
pss:SetCurMaxScore(pss:GetCurMaxScore() +
|
||||||
|
(stepLast * judgmentBase['TapNoteScore_W1']));
|
||||||
local judgeScore = 0;
|
local judgeScore = 0;
|
||||||
if (params.HoldNoteScore == 'HoldNoteScore_Held') then
|
if (params.HoldNoteScore == 'HoldNoteScore_Held') then
|
||||||
judgeScore = judgmentBase['TapNoteScore_W1'];
|
judgeScore = judgmentBase['TapNoteScore_W1'];
|
||||||
@@ -80,31 +104,51 @@ r['DDR Extreme'] = function(params, pss)
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
local stepScore = judgeScore * stepLast;
|
local stepScore = judgeScore * stepLast;
|
||||||
|
pss:SetScore(pss:GetScore() + stepScore);
|
||||||
if (Shared.CurrentStep >= totalItems) then -- Just in case.
|
if (Shared.CurrentStep >= totalItems) then -- Just in case.
|
||||||
|
-- TODO: Implement the bonus for the last step?
|
||||||
Shared.CurrentStep = 0; -- Reset for the next song.
|
Shared.CurrentStep = 0; -- Reset for the next song.
|
||||||
end;
|
end;
|
||||||
pss:SetScore(pss:GetScore() + stepScore);
|
|
||||||
end;
|
end;
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
--DDR SuperNOVA(-esque) scoring
|
--DDR SuperNOVA(-esque) scoring
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
r['DDR SuperNOVA'] = function(params, pss)
|
r['DDR SuperNOVA'] = function(params, pss)
|
||||||
local multLookup = { ['TapNoteScore_W1'] = 1, ['TapNoteScore_W2'] = 1, ['TapNoteScore_W3'] = 0.5 };
|
local multLookup =
|
||||||
|
{
|
||||||
|
['TapNoteScore_W1'] = 1,
|
||||||
|
['TapNoteScore_W2'] = 1,
|
||||||
|
['TapNoteScore_W3'] = 0.5
|
||||||
|
};
|
||||||
setmetatable(multLookup, ZeroIfNotFound);
|
setmetatable(multLookup, ZeroIfNotFound);
|
||||||
local radarValues = GetDirectRadar(params.Player);
|
local radarValues = GetDirectRadar(params.Player);
|
||||||
local totalItems = GetTotalItems(radarValues);
|
local totalItems = GetTotalItems(radarValues);
|
||||||
local buildScore = (10000000 / totalItems * multLookup[params.TapNoteScore]) + (10000000 / totalItems * (params.HoldNoteScore == 'HoldNoteScore_Held' and 1 or 0));
|
local base = 10000000 / totalItems;
|
||||||
|
local hold = base * (params.HoldNoteScore == 'HoldNoteScore_Held' and 1 or 0);
|
||||||
|
local maxScore = (base * multLookup['TapNoteScore_W1']) + hold;
|
||||||
|
pss:SetCurMaxScore(pss:GetCurMaxScore() + math.round(maxScore));
|
||||||
|
local buildScore = (base * multLookup[params.TapNoteScore]) + hold;
|
||||||
pss:SetScore(pss:GetScore() + math.round(buildScore));
|
pss:SetScore(pss:GetScore() + math.round(buildScore));
|
||||||
end;
|
end;
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
--DDR SuperNOVA 2(-esque) scoring
|
--DDR SuperNOVA 2(-esque) scoring
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
r['DDR SuperNOVA 2'] = function(params, pss)
|
r['DDR SuperNOVA 2'] = function(params, pss)
|
||||||
local multLookup = { ['TapNoteScore_W1'] = 1, ['TapNoteScore_W2'] = 1, ['TapNoteScore_W3'] = 0.5 };
|
local multLookup =
|
||||||
|
{
|
||||||
|
['TapNoteScore_W1'] = 1,
|
||||||
|
['TapNoteScore_W2'] = 1,
|
||||||
|
['TapNoteScore_W3'] = 0.5
|
||||||
|
};
|
||||||
setmetatable(multLookup, ZeroIfNotFound);
|
setmetatable(multLookup, ZeroIfNotFound);
|
||||||
local radarValues = GetDirectRadar(params.Player);
|
local radarValues = GetDirectRadar(params.Player);
|
||||||
local totalItems = GetTotalItems(radarValues);
|
local totalItems = GetTotalItems(radarValues);
|
||||||
local buildScore = (100000 / totalItems * multLookup[params.TapNoteScore] - (IsW1Allowed(params.TapNoteScore) and 10 or 0)) + (100000 / totalItems * (params.HoldNoteScore == 'HoldNoteScore_Held' and 1 or 0));
|
local base = 100000 / totalItems;
|
||||||
|
local hold = base * (params.HoldNoteScore == 'HoldNoteScore_Held' and 1 or 0);
|
||||||
|
local maxScore = (base * multLookup['TapNoteScore_W1']) + hold;
|
||||||
|
pss:SetCurMaxScore(pss:GetCurMaxScore() + (math.round(maxScore) * 10));
|
||||||
|
local preW1 = base * multLookup[params.TapNoteScore];
|
||||||
|
local buildScore = (preW1 - (IsW1Allowed(params.TapNoteScore) and 10 or 0)) + hold;
|
||||||
pss:SetScore(pss:GetScore() + (math.round(buildScore) * 10));
|
pss:SetScore(pss:GetScore() + (math.round(buildScore) * 10));
|
||||||
end;
|
end;
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
@@ -144,19 +188,28 @@ end;
|
|||||||
------------------------------------------------------------
|
------------------------------------------------------------
|
||||||
r['MIGS'] = function(params,pss)
|
r['MIGS'] = function(params,pss)
|
||||||
local curScore = 0;
|
local curScore = 0;
|
||||||
local tapScoreTable = { ['TapNoteScore_W1'] = 3, ['TapNoteScore_W2'] = 2, ['TapNoteScore_W3'] = 1, ['TapNoteScore_W5'] = -4, ['TapNoteScore_Miss'] = -8 };
|
local tapScoreTable =
|
||||||
|
{
|
||||||
|
['TapNoteScore_W1'] = 3,
|
||||||
|
['TapNoteScore_W2'] = 2,
|
||||||
|
['TapNoteScore_W3'] = 1,
|
||||||
|
['TapNoteScore_W5'] = -4,
|
||||||
|
['TapNoteScore_Miss'] = -8
|
||||||
|
};
|
||||||
for k,v in pairs(tapScoreTable) do
|
for k,v in pairs(tapScoreTable) do
|
||||||
curScore = curScore + ( pss:GetTapNoteScores(k) * v );
|
curScore = curScore + ( pss:GetTapNoteScores(k) * v );
|
||||||
end;
|
end;
|
||||||
curScore = curScore + ( pss:GetHoldNoteScores('HoldNoteScore_Held') * 6 );
|
curScore = curScore + ( pss:GetHoldNoteScores('HoldNoteScore_Held') * 6 );
|
||||||
pss:SetScore(clamp(curScore,0,math.huge));
|
pss:SetScore(clamp(curScore,0,math.huge));
|
||||||
end;
|
end;
|
||||||
SpecialScoring = {};
|
|
||||||
setmetatable(SpecialScoring, {
|
-- Formulas end here.
|
||||||
|
Scoring = {};
|
||||||
|
setmetatable(Scoring, {
|
||||||
__metatable = { "Letting you change the metatable sort of defeats the purpose." };
|
__metatable = { "Letting you change the metatable sort of defeats the purpose." };
|
||||||
__index = function(tbl, key)
|
__index = function(tbl, key)
|
||||||
for v in ivalues(DisabledScoringModes) do
|
for v in ivalues(DisabledScoringModes) do
|
||||||
if key == v then return r['DDR 1stMIX']; end;
|
if key == v then return r['DDR Extreme']; end;
|
||||||
end;
|
end;
|
||||||
return r[key];
|
return r[key];
|
||||||
end;
|
end;
|
||||||
@@ -448,33 +448,6 @@ PumpRoutineString="Routine"
|
|||||||
# Difficulty_Edit-StepsType_Pump_Double=Edit
|
# Difficulty_Edit-StepsType_Pump_Double=Edit
|
||||||
# Course=Progressive
|
# Course=Progressive
|
||||||
|
|
||||||
[CustomScoring]
|
|
||||||
# Custom scoring, usually good for custom games.
|
|
||||||
|
|
||||||
# Various tweakers
|
|
||||||
ComboAboveThresholdAddsToScoreBonus=0
|
|
||||||
ComboScoreBonusThreshold=50
|
|
||||||
ComboScoreBonusValue=+1000
|
|
||||||
|
|
||||||
ComboMultiplier=0.0
|
|
||||||
|
|
||||||
DoubleNoteScoreMultiplier=2.0
|
|
||||||
TripleNoteScoreMultiplier=3.0
|
|
||||||
QuadOrHigherNoteScoreMultiplier=4.0
|
|
||||||
# And what they award you
|
|
||||||
PointsW1=+50
|
|
||||||
PointsW2=+20
|
|
||||||
PointsW3=+10
|
|
||||||
PointsW4=+5
|
|
||||||
PointsW5=0
|
|
||||||
PointsMiss=-5
|
|
||||||
PointsHitMine=-5
|
|
||||||
PointsCheckpointHit=+5
|
|
||||||
PointsCheckpointMiss=-5
|
|
||||||
PointsNone=0
|
|
||||||
PointsHoldHeld=+5
|
|
||||||
PointsHoldLetGo=-5
|
|
||||||
|
|
||||||
[DifficultyList]
|
[DifficultyList]
|
||||||
# A list that shows difficulties in a song.
|
# A list that shows difficulties in a song.
|
||||||
CapitalizeDifficultyNames=false
|
CapitalizeDifficultyNames=false
|
||||||
@@ -2698,8 +2671,9 @@ Line20="conf,VisualDelaySeconds"
|
|||||||
Fallback="ScreenOptionsServiceChild"
|
Fallback="ScreenOptionsServiceChild"
|
||||||
NextScreen="ScreenOptionsExtended"
|
NextScreen="ScreenOptionsExtended"
|
||||||
PrevScreen="ScreenOptionsExtended"
|
PrevScreen="ScreenOptionsExtended"
|
||||||
LineNames="2,3,4,8,11,13,14,15,16,28,29,30"
|
LineNames="Score,3,4,8,11,13,14,15,16,28,29,30"
|
||||||
Line2="conf,ScoringType"
|
#Line2="conf,ScoringType"
|
||||||
|
LineScore="lua,UserPrefScoringMode()"
|
||||||
Line3="conf,TimingWindowScale"
|
Line3="conf,TimingWindowScale"
|
||||||
Line4="conf,LifeDifficulty"
|
Line4="conf,LifeDifficulty"
|
||||||
Line8="lua,GamePrefDefaultFail()"
|
Line8="lua,GamePrefDefaultFail()"
|
||||||
|
|||||||
@@ -4406,30 +4406,6 @@ BodyHeight=38
|
|||||||
[ComboGraph]
|
[ComboGraph]
|
||||||
BodyWidth=140
|
BodyWidth=140
|
||||||
|
|
||||||
[CustomScoring]
|
|
||||||
ComboAboveThresholdAddsToScoreBonus=0
|
|
||||||
ComboScoreBonusThreshold=50
|
|
||||||
ComboScoreBonusValue=1000
|
|
||||||
# this was removed in SM4
|
|
||||||
ComboMultiplier=0.0
|
|
||||||
|
|
||||||
DoubleNoteScoreMultiplier=1.0
|
|
||||||
TripleNoteScoreMultiplier=1.0
|
|
||||||
QuadOrHigherNoteScoreMultiplier=1.0
|
|
||||||
|
|
||||||
PointsW1=1000
|
|
||||||
PointsW2=1000
|
|
||||||
PointsW3=500
|
|
||||||
PointsW4=100
|
|
||||||
PointsW5=-200
|
|
||||||
PointsMiss=-500
|
|
||||||
PointsHitMine=-500
|
|
||||||
PointsCheckpointHit=1000
|
|
||||||
PointsCheckpointMiss=-200
|
|
||||||
PointsNone=0
|
|
||||||
PointsHoldHeld=1000
|
|
||||||
PointsHoldLetGo=-500
|
|
||||||
|
|
||||||
[CustomDifficulty]
|
[CustomDifficulty]
|
||||||
#See pump theme for an example
|
#See pump theme for an example
|
||||||
Names=""
|
Names=""
|
||||||
|
|||||||
@@ -88,29 +88,6 @@ BackInEventMode=""
|
|||||||
;Screwy
|
;Screwy
|
||||||
Names=""
|
Names=""
|
||||||
|
|
||||||
[CustomScoring]
|
|
||||||
ComboAboveThresholdAddsToScoreBonus=0
|
|
||||||
ComboMultiplier=0.0
|
|
||||||
ComboScoreBonusThreshold=50
|
|
||||||
ComboScoreBonusValue=+1000
|
|
||||||
|
|
||||||
DoubleNoteScoreMultiplier=1.0
|
|
||||||
TripleNoteScoreMultiplier=1.5
|
|
||||||
QuadOrHigherNoteScoreMultiplier=2
|
|
||||||
|
|
||||||
PointsW1=+1000
|
|
||||||
PointsW2=+1000
|
|
||||||
PointsW3=+500
|
|
||||||
PointsW4=+100
|
|
||||||
PointsW5=-200
|
|
||||||
PointsMiss=-500
|
|
||||||
PointsHitMine=-1000
|
|
||||||
PointsCheckpointHit=+1000
|
|
||||||
PointsCheckpointMiss=-200
|
|
||||||
PointsNone=0
|
|
||||||
PointsHoldHeld=+1000
|
|
||||||
PointsHoldLetGo=-500
|
|
||||||
|
|
||||||
[Gameplay]
|
[Gameplay]
|
||||||
ComboIsPerRow=true
|
ComboIsPerRow=true
|
||||||
MinScoreToContinueCombo="TapNoteScore_W3"
|
MinScoreToContinueCombo="TapNoteScore_W3"
|
||||||
|
|||||||
@@ -168,11 +168,13 @@ t[#t+1] = Def.ActorFrame {
|
|||||||
};
|
};
|
||||||
CreateStops();
|
CreateStops();
|
||||||
};
|
};
|
||||||
if PREFSMAN:GetPreference("ScoringType") == 'ScoringType_Custom' then
|
if( not GAMESTATE:IsCourseMode() ) then
|
||||||
t[#t+1] = Def.Actor{
|
t[#t+1] = Def.Actor{
|
||||||
JudgmentMessageCommand = function(self, params)
|
JudgmentMessageCommand = function(self, params)
|
||||||
SpecialScoring[GetUserPref("UserPrefSpecialScoringMode")](params, STATSMAN:GetCurStageStats():GetPlayerStageStats(params.Player))
|
Scoring[GetUserPref("UserPrefScoringMode")](params,
|
||||||
end;
|
STATSMAN:GetCurStageStats():GetPlayerStageStats(params.Player))
|
||||||
};
|
end;
|
||||||
|
};
|
||||||
end;
|
end;
|
||||||
|
|
||||||
return t
|
return t
|
||||||
|
|||||||
@@ -78,7 +78,6 @@ TimingDifficulty=Timing Difficulty: %s
|
|||||||
|
|
||||||
[OptionTitles]
|
[OptionTitles]
|
||||||
UserPrefAutoSetStyle=Auto Set Style
|
UserPrefAutoSetStyle=Auto Set Style
|
||||||
UserPrefSpecialScoringMode=Special Scoring Mode
|
|
||||||
UserPrefNotePosition=Note Positions
|
UserPrefNotePosition=Note Positions
|
||||||
UserPrefComboOnRolls=Rolls Increment Combo
|
UserPrefComboOnRolls=Rolls Increment Combo
|
||||||
UserPrefComboUnderField=Combo Under Field
|
UserPrefComboUnderField=Combo Under Field
|
||||||
@@ -97,7 +96,6 @@ UserPrefComboOnRolls=Choose if rolls should increment the combo or not.
|
|||||||
UserPrefComboUnderField=Determine if the combo should display under the notes or not.
|
UserPrefComboUnderField=Determine if the combo should display under the notes or not.
|
||||||
|
|
||||||
UserPrefGameplayShowScore=Show or Hide the score display in gameplay.
|
UserPrefGameplayShowScore=Show or Hide the score display in gameplay.
|
||||||
UserPrefSpecialScoringMode=Select the scoring mode to be used if the Special scoring type is selected.
|
|
||||||
UserPrefGameplayShowStepsDisplay=Show or Hide the step information display in gameplay.
|
UserPrefGameplayShowStepsDisplay=Show or Hide the step information display in gameplay.
|
||||||
UserPrefShowLotsaOptions=Choose how many lines/rows of options to choose from. &oq;Few&cq; keeps the list to a minimum. &oq;Many&cq; adds various show-off mods.
|
UserPrefShowLotsaOptions=Choose how many lines/rows of options to choose from. &oq;Few&cq; keeps the list to a minimum. &oq;Many&cq; adds various show-off mods.
|
||||||
UserPrefLongFail=Choose between the original sm-ssc fail (Long) or the new sm-ssc fail (Short).
|
UserPrefLongFail=Choose between the original sm-ssc fail (Long) or the new sm-ssc fail (Short).
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ function InitUserPrefs()
|
|||||||
if GetUserPref("UserPrefGameplayShowScore") == nil then
|
if GetUserPref("UserPrefGameplayShowScore") == nil then
|
||||||
SetUserPref("UserPrefGameplayShowScore", false);
|
SetUserPref("UserPrefGameplayShowScore", false);
|
||||||
end;
|
end;
|
||||||
if GetUserPref("UserPrefSpecialScoringMode") == nil then
|
if GetUserPref("UserPrefScoringMode") == nil then
|
||||||
SetUserPref("UserPrefSpecialScoringMode", 'DDR 1st Mix');
|
SetUserPref("UserPrefScoringMode", 'DDR Extreme');
|
||||||
end;
|
end;
|
||||||
if GetUserPrefB("UserPrefShowLotsaOptions") == nil then
|
if GetUserPrefB("UserPrefShowLotsaOptions") == nil then
|
||||||
SetUserPref("UserPrefShowLotsaOptions", true);
|
SetUserPref("UserPrefShowLotsaOptions", true);
|
||||||
@@ -230,34 +230,6 @@ function UserPrefShowLotsaOptions()
|
|||||||
return t;
|
return t;
|
||||||
end
|
end
|
||||||
|
|
||||||
function UserPrefSpecialScoringMode()
|
|
||||||
local baseChoices = { 'DDR 1stMIX', 'DDR 4thMIX', 'DDR Extreme', 'DDR SuperNOVA', 'DDR SuperNOVA 2', 'MIGS' }; --'[SSC] Radar Master'
|
|
||||||
local t = {
|
|
||||||
Name = "UserPrefSpecialScoringMode";
|
|
||||||
LayoutType = "ShowAllInRow";
|
|
||||||
SelectType = "SelectOne";
|
|
||||||
OneChoiceForAllPlayers = true;
|
|
||||||
ExportOnChange = false;
|
|
||||||
Choices = baseChoices;
|
|
||||||
LoadSelections = function(self, list, pn)
|
|
||||||
if ReadPrefFromFile("UserPrefSpecialScoringMode") ~= nil then
|
|
||||||
local theValue = ReadPrefFromFile("UserPrefSpecialScoringMode");
|
|
||||||
local success = false;
|
|
||||||
for k,v in ipairs(baseChoices) do if v == theValue then list[k] = true success = true break end end;
|
|
||||||
if success == false then list[1] = true end;
|
|
||||||
else
|
|
||||||
WritePrefToFile("UserPrefSpecialScoringMode", 'DDR 1stMIX');
|
|
||||||
list[1] = true;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
SaveSelections = function(self, list, pn)
|
|
||||||
for k,v in ipairs(list) do if v then WritePrefToFile("UserPrefSpecialScoringMode", baseChoices[k]) break end end;
|
|
||||||
end;
|
|
||||||
};
|
|
||||||
setmetatable( t, t );
|
|
||||||
return t;
|
|
||||||
end
|
|
||||||
|
|
||||||
function GetDefaultOptionLines()
|
function GetDefaultOptionLines()
|
||||||
local LineSets = {
|
local LineSets = {
|
||||||
"1,8,14,2,3,4,5,6,R,7,9,10,11,12,13,15,16,17,18", -- All
|
"1,8,14,2,3,4,5,6,R,7,9,10,11,12,13,15,16,17,18", -- All
|
||||||
|
|||||||
@@ -107,28 +107,6 @@ TextPulseCommand=finishtweening;diffusealpha,1;zoom,0.5*1.025;decelerate,0.05;zo
|
|||||||
|
|
||||||
[CustomDifficulty]
|
[CustomDifficulty]
|
||||||
|
|
||||||
[CustomScoring]
|
|
||||||
# So special scoring works properly, we zero this out
|
|
||||||
ComboAboveThresholdAddsToScoreBonus=0
|
|
||||||
ComboScoreBonusThreshold=0
|
|
||||||
ComboScoreBonusValue=0
|
|
||||||
ComboMultiplier=0
|
|
||||||
DoubleNoteScoreMultiplier=0
|
|
||||||
TripleNoteScoreMultiplier=0
|
|
||||||
QuadOrHigherNoteScoreMultiplier=0
|
|
||||||
PointsW1=0
|
|
||||||
PointsW2=0
|
|
||||||
PointsW3=0
|
|
||||||
PointsW4=0
|
|
||||||
PointsW5=0
|
|
||||||
PointsMiss=0
|
|
||||||
PointsHitMine=0
|
|
||||||
PointsCheckpointHit=0
|
|
||||||
PointsCheckpointMiss=0
|
|
||||||
PointsNone=0
|
|
||||||
PointsHoldHeld=0
|
|
||||||
PointsHoldLetGo=0
|
|
||||||
|
|
||||||
[DifficultyList]
|
[DifficultyList]
|
||||||
ItemsSpacingY=24
|
ItemsSpacingY=24
|
||||||
NumShownItems=8
|
NumShownItems=8
|
||||||
@@ -1252,7 +1230,7 @@ LineFlashyCombo="lua,UserPrefFlashyCombo()"
|
|||||||
[ScreenOptionsGraphicsSound]
|
[ScreenOptionsGraphicsSound]
|
||||||
|
|
||||||
[ScreenOptionsAdvanced]
|
[ScreenOptionsAdvanced]
|
||||||
LineNames="2,3,4,8,11,13,14,15,16,28,29,30,RollCombo"
|
LineNames="Score,3,4,8,11,13,14,15,16,28,29,30,RollCombo"
|
||||||
LineRollCombo="lua,UserPrefComboOnRolls()"
|
LineRollCombo="lua,UserPrefComboOnRolls()"
|
||||||
|
|
||||||
[ScreenAppearanceOptions]
|
[ScreenAppearanceOptions]
|
||||||
@@ -1267,10 +1245,9 @@ LineRollCombo="lua,UserPrefComboOnRolls()"
|
|||||||
Fallback="ScreenOptionsServiceChild"
|
Fallback="ScreenOptionsServiceChild"
|
||||||
NextScreen="ScreenOptionsExtended"
|
NextScreen="ScreenOptionsExtended"
|
||||||
PrevScreen="ScreenOptionsExtended"
|
PrevScreen="ScreenOptionsExtended"
|
||||||
LineNames="gNotePos,gAuto,gScore,gSScore,gSDisp,gOpts,gLongFail,gComboUnderField,FlashyCombo,GameplayFooter"
|
LineNames="gNotePos,gAuto,gScore,gSDisp,gOpts,gLongFail,gComboUnderField,FlashyCombo,GameplayFooter"
|
||||||
LinegNotePos="lua,UserPrefNotePosition()"
|
LinegNotePos="lua,UserPrefNotePosition()"
|
||||||
LinegScore="lua,UserPrefGameplayShowScore()"
|
LinegScore="lua,UserPrefGameplayShowScore()"
|
||||||
LinegSScore="lua,UserPrefSpecialScoringMode()"
|
|
||||||
LinegSDisp="lua,UserPrefGameplayShowStepsDisplay()"
|
LinegSDisp="lua,UserPrefGameplayShowStepsDisplay()"
|
||||||
LinegOpts="lua,UserPrefShowLotsaOptions()"
|
LinegOpts="lua,UserPrefShowLotsaOptions()"
|
||||||
LinegAuto="lua,UserPrefAutoSetStyle()"
|
LinegAuto="lua,UserPrefAutoSetStyle()"
|
||||||
|
|||||||
+11
-1
@@ -127,8 +127,13 @@ static Preference<bool> g_bEnableMineSoundPlayback ( "EnableMineHitSound", true
|
|||||||
|
|
||||||
Preference<float> g_fTimingWindowHopo ( "TimingWindowHopo", 0.25 ); // max time between notes in a hopo chain
|
Preference<float> g_fTimingWindowHopo ( "TimingWindowHopo", 0.25 ); // max time between notes in a hopo chain
|
||||||
Preference<float> g_fTimingWindowStrum ( "TimingWindowStrum", 0.1f ); // max time between strum and when the frets must match
|
Preference<float> g_fTimingWindowStrum ( "TimingWindowStrum", 0.1f ); // max time between strum and when the frets must match
|
||||||
|
/** @brief How much life is in a hold note when you start on it? */
|
||||||
ThemeMetric<float> INITIAL_HOLD_LIFE ( "Player", "InitialHoldLife" );
|
ThemeMetric<float> INITIAL_HOLD_LIFE ( "Player", "InitialHoldLife" );
|
||||||
ThemeMetric<float> MAX_HOLD_LIFE ( "Player", "MaxHoldLife" ); // sm-ssc addition
|
/**
|
||||||
|
* @brief How much hold life is possible to have when holding a hold note?
|
||||||
|
*
|
||||||
|
* This was an sm-ssc addition. */
|
||||||
|
ThemeMetric<float> MAX_HOLD_LIFE ( "Player", "MaxHoldLife" );
|
||||||
ThemeMetric<bool> PENALIZE_TAP_SCORE_NONE ( "Player", "PenalizeTapScoreNone" );
|
ThemeMetric<bool> PENALIZE_TAP_SCORE_NONE ( "Player", "PenalizeTapScoreNone" );
|
||||||
ThemeMetric<bool> JUDGE_HOLD_NOTES_ON_SAME_ROW_TOGETHER ( "Player", "JudgeHoldNotesOnSameRowTogether" );
|
ThemeMetric<bool> JUDGE_HOLD_NOTES_ON_SAME_ROW_TOGETHER ( "Player", "JudgeHoldNotesOnSameRowTogether" );
|
||||||
/**
|
/**
|
||||||
@@ -174,6 +179,11 @@ ThemeMetric<bool> REQUIRE_STEP_ON_MINES ( "Player", "RequireStepOnMines" );
|
|||||||
*
|
*
|
||||||
* For those wishing to make a theme very accurate to In The Groove 2, set this to false. */
|
* For those wishing to make a theme very accurate to In The Groove 2, set this to false. */
|
||||||
ThemeMetric<bool> ROLL_BODY_INCREMENTS_COMBO ( "Player", "RollBodyIncrementsCombo" );
|
ThemeMetric<bool> ROLL_BODY_INCREMENTS_COMBO ( "Player", "RollBodyIncrementsCombo" );
|
||||||
|
/**
|
||||||
|
* @brief Are checkpoints and taps considered separate judgments?
|
||||||
|
*
|
||||||
|
* If set to true, they are considered separate.
|
||||||
|
* If set to false, they are considered the same. */
|
||||||
ThemeMetric<bool> CHECKPOINTS_TAPS_SEPARATE_JUDGMENT ( "Player", "CheckpointsTapsSeparateJudgment" );
|
ThemeMetric<bool> CHECKPOINTS_TAPS_SEPARATE_JUDGMENT ( "Player", "CheckpointsTapsSeparateJudgment" );
|
||||||
/**
|
/**
|
||||||
* @brief Do we score missed holds and rolls with HoldNoteScores?
|
* @brief Do we score missed holds and rolls with HoldNoteScores?
|
||||||
|
|||||||
@@ -234,7 +234,7 @@ float PlayerStageStats::MakePercentScore( int iActual, int iPossible )
|
|||||||
|
|
||||||
int iPercentTotalDigits = 3 + CommonMetrics::PERCENT_SCORE_DECIMAL_PLACES; // "100" + "." + "00"
|
int iPercentTotalDigits = 3 + CommonMetrics::PERCENT_SCORE_DECIMAL_PLACES; // "100" + "." + "00"
|
||||||
|
|
||||||
// TRICKY: printf will round, but we want to truncate. therwise, we may display
|
// TRICKY: printf will round, but we want to truncate. Otherwise, we may display
|
||||||
// a percent score that's too high and doesn't match up with the calculated grade.
|
// a percent score that's too high and doesn't match up with the calculated grade.
|
||||||
float fTruncInterval = powf( 0.1f, (float)iPercentTotalDigits-1 );
|
float fTruncInterval = powf( 0.1f, (float)iPercentTotalDigits-1 );
|
||||||
|
|
||||||
@@ -250,7 +250,9 @@ RString PlayerStageStats::FormatPercentScore( float fPercentDancePoints )
|
|||||||
{
|
{
|
||||||
int iPercentTotalDigits = 3 + CommonMetrics::PERCENT_SCORE_DECIMAL_PLACES; // "100" + "." + "00"
|
int iPercentTotalDigits = 3 + CommonMetrics::PERCENT_SCORE_DECIMAL_PLACES; // "100" + "." + "00"
|
||||||
|
|
||||||
RString s = ssprintf( "%*.*f%%", iPercentTotalDigits, (int)CommonMetrics::PERCENT_SCORE_DECIMAL_PLACES, fPercentDancePoints*100 );
|
RString s = ssprintf( "%*.*f%%", iPercentTotalDigits,
|
||||||
|
(int)CommonMetrics::PERCENT_SCORE_DECIMAL_PLACES,
|
||||||
|
fPercentDancePoints*100 );
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -725,7 +727,24 @@ public:
|
|||||||
|
|
||||||
static int GetRadarPossible( T* p, lua_State *L ) { p->m_radarPossible.PushSelf(L); return 1; }
|
static int GetRadarPossible( T* p, lua_State *L ) { p->m_radarPossible.PushSelf(L); return 1; }
|
||||||
static int GetRadarActual( T* p, lua_State *L ) { p->m_radarActual.PushSelf(L); return 1; }
|
static int GetRadarActual( T* p, lua_State *L ) { p->m_radarActual.PushSelf(L); return 1; }
|
||||||
static int SetScore( T* p, lua_State *L ) { if( IArg(1) >= 0 ){ p->m_iScore = IArg(1); return 1; } return 0; }
|
static int SetScore( T* p, lua_State *L )
|
||||||
|
{
|
||||||
|
if( IArg(1) >= 0 )
|
||||||
|
{
|
||||||
|
p->m_iScore = IArg(1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static int SetCurMaxScore( T* p, lua_State *L )
|
||||||
|
{
|
||||||
|
if( IArg(1) >= 0 )
|
||||||
|
{
|
||||||
|
p->m_iCurMaxScore = IArg(1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
LunaPlayerStageStats()
|
LunaPlayerStageStats()
|
||||||
{
|
{
|
||||||
@@ -763,6 +782,7 @@ public:
|
|||||||
ADD_METHOD( GetRadarPossible );
|
ADD_METHOD( GetRadarPossible );
|
||||||
ADD_METHOD( GetBestFullComboTapNoteScore );
|
ADD_METHOD( GetBestFullComboTapNoteScore );
|
||||||
ADD_METHOD( SetScore );
|
ADD_METHOD( SetScore );
|
||||||
|
ADD_METHOD( SetCurMaxScore );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -125,15 +125,6 @@ XToString( CourseSortOrders );
|
|||||||
StringToX( CourseSortOrders );
|
StringToX( CourseSortOrders );
|
||||||
LuaXType( CourseSortOrders );
|
LuaXType( CourseSortOrders );
|
||||||
|
|
||||||
static const char *ScoringTypeNames[] = {
|
|
||||||
"New",
|
|
||||||
"Old",
|
|
||||||
"Custom",
|
|
||||||
};
|
|
||||||
XToString( ScoringType );
|
|
||||||
StringToX( ScoringType );
|
|
||||||
LuaXType( ScoringType );
|
|
||||||
|
|
||||||
// XXX: Fix fail bug?
|
// XXX: Fix fail bug?
|
||||||
/* static const char *DefaultFailTypeNames[] = {
|
/* static const char *DefaultFailTypeNames[] = {
|
||||||
"Immediate",
|
"Immediate",
|
||||||
@@ -263,7 +254,6 @@ PrefsManager::PrefsManager() :
|
|||||||
m_CourseSortOrder ( "CourseSortOrder", COURSE_SORT_SONGS ),
|
m_CourseSortOrder ( "CourseSortOrder", COURSE_SORT_SONGS ),
|
||||||
m_bSubSortByNumSteps ( "SubSortByNumSteps", false ),
|
m_bSubSortByNumSteps ( "SubSortByNumSteps", false ),
|
||||||
m_GetRankingName ( "GetRankingName", RANKING_ON ),
|
m_GetRankingName ( "GetRankingName", RANKING_ON ),
|
||||||
m_ScoringType ( "ScoringType", SCORING_NEW ),
|
|
||||||
m_sAdditionalSongFolders ( "AdditionalSongFolders", "" ),
|
m_sAdditionalSongFolders ( "AdditionalSongFolders", "" ),
|
||||||
m_sAdditionalCourseFolders ( "AdditionalCourseFolders", "" ),
|
m_sAdditionalCourseFolders ( "AdditionalCourseFolders", "" ),
|
||||||
m_sAdditionalFolders ( "AdditionalFolders", "" ),
|
m_sAdditionalFolders ( "AdditionalFolders", "" ),
|
||||||
|
|||||||
@@ -108,14 +108,6 @@ enum CourseSortOrders
|
|||||||
NUM_CourseSortOrders,
|
NUM_CourseSortOrders,
|
||||||
CourseSortOrders_Invalid
|
CourseSortOrders_Invalid
|
||||||
};
|
};
|
||||||
enum ScoringType
|
|
||||||
{
|
|
||||||
SCORING_NEW,
|
|
||||||
SCORING_OLD,
|
|
||||||
SCORING_CUSTOM,
|
|
||||||
NUM_ScoringType,
|
|
||||||
ScoringType_Invalid
|
|
||||||
};
|
|
||||||
|
|
||||||
enum DefaultFailType
|
enum DefaultFailType
|
||||||
{
|
{
|
||||||
@@ -266,8 +258,6 @@ public:
|
|||||||
Preference<bool> m_bSubSortByNumSteps;
|
Preference<bool> m_bSubSortByNumSteps;
|
||||||
Preference<GetRankingName> m_GetRankingName;
|
Preference<GetRankingName> m_GetRankingName;
|
||||||
|
|
||||||
Preference<ScoringType> m_ScoringType;
|
|
||||||
|
|
||||||
Preference<RString> m_sAdditionalSongFolders;
|
Preference<RString> m_sAdditionalSongFolders;
|
||||||
Preference<RString> m_sAdditionalCourseFolders;
|
Preference<RString> m_sAdditionalCourseFolders;
|
||||||
Preference<RString> m_sAdditionalFolders;
|
Preference<RString> m_sAdditionalFolders;
|
||||||
|
|||||||
+9
-177
@@ -94,30 +94,6 @@ void ScoreKeeperNormal::Load(
|
|||||||
//m_vToastyTriggers.Load( "Gameplay", "ToastyTriggersAt" );
|
//m_vToastyTriggers.Load( "Gameplay", "ToastyTriggersAt" );
|
||||||
m_ToastyTrigger.Load( "Gameplay", "ToastyTriggersAt" );
|
m_ToastyTrigger.Load( "Gameplay", "ToastyTriggersAt" );
|
||||||
|
|
||||||
// Custom Scoring
|
|
||||||
m_CustomComboMultiplier.Load( "CustomScoring", "ComboMultiplier" );
|
|
||||||
m_CustomTNS_W1.Load( "CustomScoring", "PointsW1" );
|
|
||||||
m_CustomTNS_W2.Load( "CustomScoring", "PointsW2" );
|
|
||||||
m_CustomTNS_W3.Load( "CustomScoring", "PointsW3" );
|
|
||||||
m_CustomTNS_W4.Load( "CustomScoring", "PointsW4" );
|
|
||||||
m_CustomTNS_W5.Load( "CustomScoring", "PointsW5" );
|
|
||||||
m_CustomTNS_Miss.Load( "CustomScoring", "PointsMiss" );
|
|
||||||
m_CustomTNS_HitMine.Load( "CustomScoring", "PointsHitMine" );
|
|
||||||
m_CustomTNS_CheckpointHit.Load( "CustomScoring", "PointsCheckpointHit" );
|
|
||||||
m_CustomTNS_CheckpointMiss.Load( "CustomScoring", "PointsCheckpointMiss" );
|
|
||||||
m_CustomTNS_None.Load( "CustomScoring", "PointsNone" );
|
|
||||||
|
|
||||||
m_CustomHNS_Held.Load( "CustomScoring", "PointsHoldHeld" );
|
|
||||||
m_CustomHNS_LetGo.Load( "CustomScoring", "PointsHoldLetGo" );
|
|
||||||
|
|
||||||
m_CustomComboBonus.Load( "CustomScoring", "ComboAboveThresholdAddsToScoreBonus" );
|
|
||||||
m_CustomComboBonusThreshold.Load( "CustomScoring", "ComboScoreBonusThreshold" );
|
|
||||||
m_CustomComboBonusValue.Load( "CustomScoring", "ComboScoreBonusValue" );
|
|
||||||
|
|
||||||
m_DoubleNoteMultiplier.Load( "CustomScoring", "DoubleNoteScoreMultiplier" );
|
|
||||||
m_TripleNoteMultiplier.Load( "CustomScoring", "TripleNoteScoreMultiplier" );
|
|
||||||
m_QuadPlusNoteMultiplier.Load( "CustomScoring", "QuadOrHigherNoteScoreMultiplier" );
|
|
||||||
|
|
||||||
// Fill in STATSMAN->m_CurStageStats, calculate multiplier
|
// Fill in STATSMAN->m_CurStageStats, calculate multiplier
|
||||||
int iTotalPossibleDancePoints = 0;
|
int iTotalPossibleDancePoints = 0;
|
||||||
int iTotalPossibleGradePoints = 0;
|
int iTotalPossibleGradePoints = 0;
|
||||||
@@ -179,24 +155,7 @@ void ScoreKeeperNormal::Load(
|
|||||||
MESSAGEMAN->Broadcast( msg );
|
MESSAGEMAN->Broadcast( msg );
|
||||||
|
|
||||||
memset( m_ComboBonusFactor, 0, sizeof(m_ComboBonusFactor) );
|
memset( m_ComboBonusFactor, 0, sizeof(m_ComboBonusFactor) );
|
||||||
switch( PREFSMAN->m_ScoringType )
|
m_iRoundTo = 1;
|
||||||
{
|
|
||||||
case SCORING_NEW:
|
|
||||||
case SCORING_CUSTOM:
|
|
||||||
m_iRoundTo = 1;
|
|
||||||
break;
|
|
||||||
case SCORING_OLD:
|
|
||||||
m_iRoundTo = 5;
|
|
||||||
if (!GAMESTATE->IsCourseMode())
|
|
||||||
{
|
|
||||||
m_ComboBonusFactor[TNS_W1] = 55;
|
|
||||||
m_ComboBonusFactor[TNS_W2] = 55;
|
|
||||||
m_ComboBonusFactor[TNS_W3] = 33;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
DEFAULT_FAIL( int(PREFSMAN->m_ScoringType) );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScoreKeeperNormal::OnNextSong( int iSongInCourseIndex, const Steps* pSteps, const NoteData* pNoteData )
|
void ScoreKeeperNormal::OnNextSong( int iSongInCourseIndex, const Steps* pSteps, const NoteData* pNoteData )
|
||||||
@@ -247,25 +206,12 @@ void ScoreKeeperNormal::OnNextSong( int iSongInCourseIndex, const Steps* pSteps,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const int iMeter = clamp( pSteps->GetMeter(), 1, 10 );
|
|
||||||
|
|
||||||
// long ver and marathon ver songs have higher max possible scores
|
// long ver and marathon ver songs have higher max possible scores
|
||||||
int iLengthMultiplier = GameState::GetNumStagesMultiplierForSong( GAMESTATE->m_pCurSong );
|
int iLengthMultiplier = GameState::GetNumStagesMultiplierForSong( GAMESTATE->m_pCurSong );
|
||||||
switch( PREFSMAN->m_ScoringType )
|
|
||||||
{
|
/* This is no longer just simple additive/subtractive scoring,
|
||||||
case SCORING_NEW:
|
* but start with capping the score at the size of the score counter. */
|
||||||
m_iMaxPossiblePoints = iMeter * 10000000 * iLengthMultiplier;
|
m_iMaxPossiblePoints = 10 * 10000000 * iLengthMultiplier;
|
||||||
break;
|
|
||||||
case SCORING_OLD:
|
|
||||||
m_iMaxPossiblePoints = (iMeter * iLengthMultiplier + 1) * 5000000;
|
|
||||||
break;
|
|
||||||
case SCORING_CUSTOM:
|
|
||||||
/* This is just simple additive/subtractive scoring, but cap the
|
|
||||||
* score at the size of the score counter */
|
|
||||||
m_iMaxPossiblePoints = 10 * 10000000 * iLengthMultiplier;
|
|
||||||
break;
|
|
||||||
DEFAULT_FAIL( int(PREFSMAN->m_ScoringType) );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ASSERT( m_iMaxPossiblePoints >= 0 );
|
ASSERT( m_iMaxPossiblePoints >= 0 );
|
||||||
m_iMaxScoreSoFar += m_iMaxPossiblePoints;
|
m_iMaxScoreSoFar += m_iMaxPossiblePoints;
|
||||||
@@ -317,24 +263,12 @@ void ScoreKeeperNormal::AddTapScore( TapNoteScore tns )
|
|||||||
|
|
||||||
void ScoreKeeperNormal::AddHoldScore( HoldNoteScore hns )
|
void ScoreKeeperNormal::AddHoldScore( HoldNoteScore hns )
|
||||||
{
|
{
|
||||||
if( PREFSMAN->m_ScoringType == SCORING_CUSTOM )
|
if( GAMESTATE->IsCourseMode() )
|
||||||
{
|
|
||||||
int &iScore = m_pPlayerStageStats->m_iScore;
|
|
||||||
int &iCurMaxScore = m_pPlayerStageStats->m_iCurMaxScore;
|
|
||||||
|
|
||||||
iCurMaxScore += m_CustomHNS_Held;
|
|
||||||
|
|
||||||
if( hns == HNS_Held )
|
|
||||||
iScore += m_CustomHNS_Held;
|
|
||||||
else if ( hns == HNS_LetGo )
|
|
||||||
iScore += m_CustomHNS_LetGo;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if( hns == HNS_Held )
|
if( hns == HNS_Held )
|
||||||
AddScoreInternal( TNS_W1 );
|
AddScoreInternal( TNS_W1 );
|
||||||
else if ( hns == HNS_LetGo )
|
else if ( hns == HNS_LetGo )
|
||||||
AddScoreInternal( TNS_W4 ); // required for subtractive score display to work properly
|
AddScoreInternal( TNS_W4 ); // required for subtractive score display to work properly.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -352,14 +286,6 @@ void ScoreKeeperNormal::HandleTapScoreNone()
|
|||||||
|
|
||||||
if( m_pPlayerState->m_PlayerNumber != PLAYER_INVALID )
|
if( m_pPlayerState->m_PlayerNumber != PLAYER_INVALID )
|
||||||
MESSAGEMAN->Broadcast( enum_add2(Message_CurrentComboChangedP1,m_pPlayerState->m_PlayerNumber) );
|
MESSAGEMAN->Broadcast( enum_add2(Message_CurrentComboChangedP1,m_pPlayerState->m_PlayerNumber) );
|
||||||
|
|
||||||
if( PREFSMAN->m_ScoringType == SCORING_CUSTOM )
|
|
||||||
{
|
|
||||||
int &iScore = m_pPlayerStageStats->m_iScore;
|
|
||||||
iScore += m_CustomTNS_None;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
AddScoreInternal( TNS_Miss );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: networking code
|
// TODO: networking code
|
||||||
@@ -369,47 +295,9 @@ void ScoreKeeperNormal::AddScoreInternal( TapNoteScore score )
|
|||||||
{
|
{
|
||||||
int &iScore = m_pPlayerStageStats->m_iScore;
|
int &iScore = m_pPlayerStageStats->m_iScore;
|
||||||
int &iCurMaxScore = m_pPlayerStageStats->m_iCurMaxScore;
|
int &iCurMaxScore = m_pPlayerStageStats->m_iCurMaxScore;
|
||||||
/*
|
|
||||||
Regular scoring:
|
|
||||||
|
|
||||||
Let p = score multiplier (W1 = W2 = 10, W3 = 5, other = 0)
|
// See Aaron In Japan for more details about the scoring formulas.
|
||||||
|
if( GAMESTATE->IsCourseMode() )
|
||||||
Note on NONSTOP Mode scoring
|
|
||||||
|
|
||||||
Let p = score multiplier (W1 = 10, W2 = 9, W3 = 5, other = 0)
|
|
||||||
|
|
||||||
N = total number of steps and freeze steps
|
|
||||||
S = The sum of all integers from 1 to N (the total number of steps/freeze steps)
|
|
||||||
n = number of the current step or freeze step (varies from 1 to N)
|
|
||||||
Z = Base value of the song (1,000,000 X the number of feet difficulty) - All edit data is rated as 5 feet
|
|
||||||
So, the score for one step is:
|
|
||||||
one_step_score = p * (Z/S) * n
|
|
||||||
|
|
||||||
*IMPORTANT* : Double steps (U+L, D+R, etc.) count as two steps instead of one *for your combo count only*,
|
|
||||||
so if you get a double L+R on the 112th step of a song, you score is calculated for only one step, not two,
|
|
||||||
as the combo counter might otherwise imply.
|
|
||||||
|
|
||||||
Now, through simple algebraic manipulation:
|
|
||||||
S = 1+...+N = (1+N)*N/2 (1 through N added together)
|
|
||||||
|
|
||||||
Okay, time for an example. Suppose we wanted to calculate the step score of a W3 on the 57th step of
|
|
||||||
a 441 step, 8-foot difficulty song (I'm just making this one up):
|
|
||||||
|
|
||||||
S = (1 + 441)*441 / 2
|
|
||||||
= 194,222 / 2
|
|
||||||
= 97,461
|
|
||||||
StepScore = p * (Z/S) * n
|
|
||||||
= 5 * (8,000,000 / 97,461) * 57
|
|
||||||
= 5 * (82) * 57 (The 82 is rounded down from 82.08411...)
|
|
||||||
= 23,370
|
|
||||||
|
|
||||||
Remember this is just the score for the step, not the cumulative score up to the 57th step. Also, please note that
|
|
||||||
I am currently checking into rounding errors with the system and if there are any, how they are resolved in the system.
|
|
||||||
|
|
||||||
Note: if you got all W2s on this song, you would get (p=10)*Z, which is 80,000,000. In fact, the maximum possible
|
|
||||||
score for any song is the number of feet difficulty X 10,000,000.
|
|
||||||
*/
|
|
||||||
if( PREFSMAN->m_ScoringType != SCORING_CUSTOM || GAMESTATE->IsCourseMode() )
|
|
||||||
{
|
{
|
||||||
int p = 0; // score multiplier
|
int p = 0; // score multiplier
|
||||||
|
|
||||||
@@ -469,45 +357,7 @@ void ScoreKeeperNormal::AddScoreInternal( TapNoteScore score )
|
|||||||
// Custom Scoring
|
// Custom Scoring
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int p = 0; // score value
|
|
||||||
|
|
||||||
switch( score )
|
|
||||||
{
|
|
||||||
case TNS_W1: p = m_CustomTNS_W1; break;
|
|
||||||
case TNS_W2: p = m_CustomTNS_W2; break;
|
|
||||||
case TNS_W3: p = m_CustomTNS_W3; break;
|
|
||||||
case TNS_W4: p = m_CustomTNS_W4; break;
|
|
||||||
case TNS_W5: p = m_CustomTNS_W5; break;
|
|
||||||
case TNS_Miss: p = m_CustomTNS_Miss; break;
|
|
||||||
default: p = 0; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( m_CustomComboBonus )
|
|
||||||
{
|
|
||||||
if( m_pPlayerStageStats->m_iCurCombo > m_CustomComboBonusThreshold )
|
|
||||||
p += m_CustomComboBonusValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
p += static_cast<int>(m_pPlayerStageStats->m_iCurCombo * m_CustomComboMultiplier);
|
|
||||||
|
|
||||||
if( m_iNumNotesHitThisRow == 2 )
|
|
||||||
p = (int)(p * m_DoubleNoteMultiplier);
|
|
||||||
else if( m_iNumNotesHitThisRow == 3 )
|
|
||||||
p = (int)(p * m_TripleNoteMultiplier);
|
|
||||||
else if( m_iNumNotesHitThisRow >= 4 )
|
|
||||||
p = (int)(p * m_QuadPlusNoteMultiplier);
|
|
||||||
|
|
||||||
if( !m_pPlayerStageStats->m_bFailed )
|
|
||||||
{
|
|
||||||
m_iTapNotesHit++;
|
|
||||||
|
|
||||||
iScore += p;
|
|
||||||
iCurMaxScore += m_CustomTNS_W1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Because the score can drop below 0 if you miss a bunch of notes, cap it off at zero
|
|
||||||
if( iScore <= 0 )
|
|
||||||
iScore = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT( iScore >= 0 );
|
ASSERT( iScore >= 0 );
|
||||||
@@ -536,11 +386,6 @@ void ScoreKeeperNormal::HandleTapScore( const TapNote &tn )
|
|||||||
if( m_MineHitIncrementsMissCombo )
|
if( m_MineHitIncrementsMissCombo )
|
||||||
HandleComboInternal( 0, 0, 1 );
|
HandleComboInternal( 0, 0, 1 );
|
||||||
|
|
||||||
if( PREFSMAN->m_ScoringType == SCORING_CUSTOM )
|
|
||||||
{
|
|
||||||
int &iScore = m_pPlayerStageStats->m_iScore;
|
|
||||||
iScore += m_CustomTNS_HitMine;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( tns == TNS_AvoidMine && m_AvoidMineIncrementsCombo )
|
if( tns == TNS_AvoidMine && m_AvoidMineIncrementsCombo )
|
||||||
@@ -564,19 +409,6 @@ void ScoreKeeperNormal::HandleTapScore( const TapNote &tn )
|
|||||||
|
|
||||||
void ScoreKeeperNormal::HandleHoldCheckpointScore( const NoteData &nd, int iRow, int iNumHoldsHeldThisRow, int iNumHoldsMissedThisRow )
|
void ScoreKeeperNormal::HandleHoldCheckpointScore( const NoteData &nd, int iRow, int iNumHoldsHeldThisRow, int iNumHoldsMissedThisRow )
|
||||||
{
|
{
|
||||||
if( PREFSMAN->m_ScoringType == SCORING_CUSTOM )
|
|
||||||
{
|
|
||||||
int &iScore = m_pPlayerStageStats->m_iScore;
|
|
||||||
int &iCurMaxScore = m_pPlayerStageStats->m_iCurMaxScore;
|
|
||||||
|
|
||||||
iCurMaxScore += m_CustomTNS_CheckpointHit;
|
|
||||||
|
|
||||||
if( iNumHoldsMissedThisRow == 0 )
|
|
||||||
iScore += m_CustomTNS_CheckpointHit;
|
|
||||||
else
|
|
||||||
iScore += m_CustomTNS_CheckpointMiss;
|
|
||||||
}
|
|
||||||
|
|
||||||
HandleTapNoteScoreInternal( iNumHoldsMissedThisRow == 0? TNS_CheckpointHit:TNS_CheckpointMiss, TNS_CheckpointHit );
|
HandleTapNoteScoreInternal( iNumHoldsMissedThisRow == 0? TNS_CheckpointHit:TNS_CheckpointMiss, TNS_CheckpointHit );
|
||||||
HandleComboInternal( iNumHoldsHeldThisRow, 0, iNumHoldsMissedThisRow, iRow );
|
HandleComboInternal( iNumHoldsHeldThisRow, 0, iNumHoldsMissedThisRow, iRow );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,30 +40,6 @@ class ScoreKeeperNormal: public ScoreKeeper
|
|||||||
ThemeMetric<bool> m_MineHitIncrementsMissCombo;
|
ThemeMetric<bool> m_MineHitIncrementsMissCombo;
|
||||||
ThemeMetric<bool> m_AvoidMineIncrementsCombo;
|
ThemeMetric<bool> m_AvoidMineIncrementsCombo;
|
||||||
|
|
||||||
// Custom Scoring Theme Metrics
|
|
||||||
ThemeMetric<int> m_CustomTNS_W1;
|
|
||||||
ThemeMetric<int> m_CustomTNS_W2;
|
|
||||||
ThemeMetric<int> m_CustomTNS_W3;
|
|
||||||
ThemeMetric<int> m_CustomTNS_W4;
|
|
||||||
ThemeMetric<int> m_CustomTNS_W5;
|
|
||||||
ThemeMetric<int> m_CustomTNS_Miss;
|
|
||||||
ThemeMetric<int> m_CustomTNS_HitMine;
|
|
||||||
ThemeMetric<int> m_CustomTNS_CheckpointHit;
|
|
||||||
ThemeMetric<int> m_CustomTNS_CheckpointMiss;
|
|
||||||
ThemeMetric<int> m_CustomTNS_None;
|
|
||||||
|
|
||||||
ThemeMetric<int> m_CustomHNS_Held;
|
|
||||||
ThemeMetric<int> m_CustomHNS_LetGo;
|
|
||||||
|
|
||||||
ThemeMetric<bool> m_CustomComboBonus;
|
|
||||||
ThemeMetric<int> m_CustomComboBonusThreshold;
|
|
||||||
ThemeMetric<int> m_CustomComboBonusValue;
|
|
||||||
|
|
||||||
ThemeMetric<float> m_DoubleNoteMultiplier;
|
|
||||||
ThemeMetric<float> m_TripleNoteMultiplier;
|
|
||||||
ThemeMetric<float> m_QuadPlusNoteMultiplier;
|
|
||||||
ThemeMetric<float> m_CustomComboMultiplier;
|
|
||||||
|
|
||||||
//ThemeMetric<LuaReference> m_vToastyTriggers;
|
//ThemeMetric<LuaReference> m_vToastyTriggers;
|
||||||
ThemeMetric<int> m_ToastyTrigger;
|
ThemeMetric<int> m_ToastyTrigger;
|
||||||
|
|
||||||
|
|||||||
@@ -718,7 +718,6 @@ static void InitializeConfOptions()
|
|||||||
g_ConfOptions.back().m_sPrefName = "SongsPerPlay";
|
g_ConfOptions.back().m_sPrefName = "SongsPerPlay";
|
||||||
|
|
||||||
ADD( ConfOption( "EventMode", MovePref<bool>, "Off","On (recommended)" ) );
|
ADD( ConfOption( "EventMode", MovePref<bool>, "Off","On (recommended)" ) );
|
||||||
ADD( ConfOption( "ScoringType", MovePref<ScoringType>, "New","Old","Custom" ) );
|
|
||||||
ADD( ConfOption( "TimingWindowScale", TimingWindowScale, "|1","|2","|3","|4","|5","|6","|7","|8","Justice" ) );
|
ADD( ConfOption( "TimingWindowScale", TimingWindowScale, "|1","|2","|3","|4","|5","|6","|7","|8","Justice" ) );
|
||||||
ADD( ConfOption( "LifeDifficulty", LifeDifficulty, "|1.2","|1.0","|0.8","|0.6","|0.4","|0.33","|0.25" ) );
|
ADD( ConfOption( "LifeDifficulty", LifeDifficulty, "|1.2","|1.0","|0.8","|0.6","|0.4","|0.33","|0.25" ) );
|
||||||
g_ConfOptions.back().m_sPrefName = "LifeDifficultyScale";
|
g_ConfOptions.back().m_sPrefName = "LifeDifficultyScale";
|
||||||
|
|||||||
Reference in New Issue
Block a user