Script cleanup, add aliases for SCREEN_* (_screen.w, etc, check alias.lua). [shakesoda]

This commit is contained in:
AJ Kelly
2010-06-07 23:24:19 -05:00
parent 6cf2eeba47
commit 7b3f8b2090
25 changed files with 787 additions and 686 deletions
+6 -4
View File
@@ -17,11 +17,13 @@ PLAYER_2 = "PlayerNumber_P2"
NUM_PLAYERS = #PlayerNumber
function string:find_last( text )
local LastPos = 0;
local LastPos = 0
while true do
local p = string.find( self, text, LastPos+1, true );
if not p then return LastPos end
LastPos = p;
local p = string.find( self, text, LastPos+1, true )
if not p then
return LastPos
end
LastPos = p
end
end
+13 -4
View File
@@ -6,9 +6,18 @@ wouldn't otherwise belong somewhere else.
-- in fact, this probably belongs in Sprite.lua...
function Sprite:cropto(w,h)
self:CropTo(w,h);
end;
self:CropTo(w,h)
end
function Actor:SetSize(w,h)
self:setsize(w,h);
end;
self:setsize(w,h)
end
-- shorthand! this is tedious to type and makes things ugly so let's make it shorter.
-- screen.w, screen.h, etc.
local _screen = {
w = SCREEN_WIDTH,
h = SCREEN_HEIGHT,
cx = SCREEN_CENTER_X,
cy = SCREEN_CENTER_Y
}
+43 -38
View File
@@ -5,77 +5,82 @@ Also, certain things are deprecated/removed from sm-ssc (and sometimes SM4 too).
--[[ Actor ]]
function Actor:hidden(bHide)
Warn("hidden is deprecated, use visible instead. (used on ".. self:GetName() ..")");
self:visible(not bHide);
end;
Warn("hidden is deprecated, use visible instead. (used on ".. self:GetName() ..")")
self:visible(not bHide)
end
-- for when horizalign and vertalign get killed:
-- for when horizalign and vertalign get killed by glenn:
--[[
function Actor:horizalign(v)
local values = {
left = 0;
center = 0.5;
right = 1;
};
self:halign(values[v]);
end;
left = 0,
center = 0.5,
right = 1
}
self:halign(values[v])
end
function Actor:vertalign(v)
local values = {
top = 0;
middle = 0.5;
bottom = 1;
};
self:valign(values[v]);
end;
top = 0,
middle = 0.5,
bottom = 1
}
self:valign(values[v])
end
--]]
--[[ ActorScroller: all of these got renamed, so alias the lowercase ones if
things are going to look for them. ]]
function ActorScroller:getsecondtodestination()
self:GetSecondsToDestination();
end;
self:GetSecondsToDestination()
end
function ActorScroller:setsecondsperitem(secs)
self:SetSecondsPerItem(secs);
end;
self:SetSecondsPerItem(secs)
end
function ActorScroller:setnumsubdivisions(subs)
self:SetNumSubdivisions(subs);
end;
self:SetNumSubdivisions(subs)
end
function ActorScroller:scrollthroughallitems()
self:ScrollThroughAllItems();
end;
self:ScrollThroughAllItems()
end
function ActorScroller:scrollwithpadding(fPadStart,fPadEnd)
self:ScrollWithPadding(fPadStart,fPadEnd);
end;
self:ScrollWithPadding(fPadStart,fPadEnd)
end
function ActorScroller:setfastcatchup(bFastCatchup)
self:SetFastCatchup(bFastCatchup);
end;
self:SetFastCatchup(bFastCatchup)
end
-- renaming various StepMania functions to sm-ssc ones:
if ScreenString then ScreenString = Screen.String; end;
if ScreenMetric then ScreenMetric = Screen.Metric; end;
if ScreenString then
ScreenString = Screen.String
end
if ScreenMetric then
ScreenMetric = Screen.Metric
end
-- SM4SVN r28330: "add IsFullCombo bindings" - Chris Danford
-- Unfortunately we already bound FullComboOfScore(tns), meaning we're not
-- going to go back and redefine bindings that match it. Alias them instead
-- for any themes expecting to use them:
function PlayerStageStats:IsFullComboW1()
return self:FullComboOfScore('TapNoteScore_W1');
end;
return self:FullComboOfScore('TapNoteScore_W1')
end
function PlayerStageStats:IsFullComboW2()
return self:FullComboOfScore('TapNoteScore_W2');
end;
return self:FullComboOfScore('TapNoteScore_W2')
end
function PlayerStageStats:IsFullComboW3()
return self:FullComboOfScore('TapNoteScore_W3');
end;
return self:FullComboOfScore('TapNoteScore_W3')
end
function PlayerStageStats:IsFullComboW4()
return self:FullComboOfScore('TapNoteScore_W4');
end;
return self:FullComboOfScore('TapNoteScore_W4')
end
+8 -8
View File
@@ -123,27 +123,27 @@ This function will stretch any background up to 640x480]]
function Actor:scale_or_crop_background()
--local bgAspectRatio = self:GetWidth() / self:GetHeight();
if self:GetWidth() <= 640 and self:GetHeight() <= 480 then
self:stretchto( 0,0,SCREEN_WIDTH,SCREEN_HEIGHT );
self:stretchto( 0,0,SCREEN_WIDTH,SCREEN_HEIGHT )
else
self:scaletocover( 0,0,SCREEN_WIDTH,SCREEN_HEIGHT );
self:scaletocover( 0,0,SCREEN_WIDTH,SCREEN_HEIGHT )
end
end
-- Testing
function Actor:scale_or_crop_alternative()
if self:GetWidth() and self:GetHeight() then
local fRatio = self:GetWidth() / self:GetHeight();
local fRatio = self:GetWidth() / self:GetHeight()
if fRatio == 4/3 then
self:stretchto( 0,0,SCREEN_WIDTH,SCREEN_HEIGHT );
self:stretchto( 0,0,SCREEN_WIDTH,SCREEN_HEIGHT )
else
self:scaletocover( 0,0,SCREEN_WIDTH,SCREEN_HEIGHT );
self:scaletocover( 0,0,SCREEN_WIDTH,SCREEN_HEIGHT )
end
end
end
function Actor:Center()
self:x(SCREEN_CENTER_X);
self:y(SCREEN_CENTER_Y);
end;
self:x(SCREEN_CENTER_X)
self:y(SCREEN_CENTER_Y)
end
-- (c) 2006 Glenn Maynard
-- All rights reserved.
+57 -51
View File
@@ -1,42 +1,45 @@
-- Convert "@/path/file" to "/path/".
local function DebugPathToRealPath( p )
if not p or p:sub( 1, 1 ) ~= "@" then
return nil;
return nil
end
local Path = p:sub( 2 );
local pos = Path:find_last( '/' );
return string.sub( Path, 1, pos );
local Path = p:sub( 2 )
local pos = Path:find_last( '/' )
return string.sub( Path, 1, pos )
end
local function MergeTables( left, right )
local ret = { }
for key, val in pairs(left) do
ret[key] = val;
ret[key] = val
end
for key, val in pairs(right) do
if ret[key] then
if type(val) == "function" and
type(ret[key]) == "function" then
local f1 = ret[key];
local f1 = ret[key]
local f2 = val
val = function(...) f1(...); return f2(...) end
val = function(...)
f1(...)
return f2(...)
end
else
Warn( string.format( "%s\n\nOverriding \"%s\": %s with %s",
debug.traceback(), key, type(ret[key]), type(val)) );
debug.traceback(), key, type(ret[key]), type(val)) )
end
end
ret[key] = val;
ret[key] = val
end
setmetatable( ret, getmetatable(left) );
setmetatable( ret, getmetatable(left) )
return ret
end
DefMetatable = {
__concat = function(left, right)
return MergeTables( left, right );
return MergeTables( left, right )
end
}
@@ -50,11 +53,11 @@ setmetatable( Def, {
-- given to Def. Fill in standard fields.
return function(t)
if not ActorUtil.IsRegisteredClass(Class) then
error( Class .. " is not a registered actor class", 2 );
error( Class .. " is not a registered actor class", 2 )
end
t.Class = Class;
t.Class = Class
local level = 2
if t._Level then
level = t._Level + 1
@@ -62,30 +65,30 @@ setmetatable( Def, {
local info = debug.getinfo(level,"Sl");
-- Source file of caller:
local Source = info.source;
t._Source = Source;
local Source = info.source
t._Source = Source
t._Dir = DebugPathToRealPath( Source )
-- Line number of caller:
t._Line = info.currentline;
t._Line = info.currentline
setmetatable( t, DefMetatable );
return t;
setmetatable( t, DefMetatable )
return t
end
end,
});
})
function ResolveRelativePath( path, level )
if path:sub(1,1) ~= "/" then
-- "Working directory":
local sDir = DebugPathToRealPath( debug.getinfo(level+1,"S").source )
assert( sDir );
assert( sDir )
path = sDir .. path
end
path = ActorUtil.ResolvePath( path, level+1 );
path = ActorUtil.ResolvePath( path, level+1 )
return path
end
@@ -94,21 +97,21 @@ function LoadActorFunc( path, level )
level = level or 1
if path == "" then
error( "Passing in a blank filename is a great way to eat up RAM. Good thing we warn you about this." );
end;
error( "Passing in a blank filename is a great way to eat up RAM. Good thing we warn you about this." )
end
local ResolvedPath = ResolveRelativePath( path, level+1 );
local ResolvedPath = ResolveRelativePath( path, level+1 )
if not ResolvedPath then
error( path .. ": not found", level+1 );
error( path .. ": not found", level+1 )
end
path = ResolvedPath
local Type = ActorUtil.GetFileType( path );
Trace( "Loading " .. path .. ", type " .. tostring(Type) );
local Type = ActorUtil.GetFileType( path )
Trace( "Loading " .. path .. ", type " .. tostring(Type) )
if Type == "FileType_Lua" then
-- Load the file.
local chunk, errmsg = loadfile( path );
local chunk, errmsg = loadfile( path )
if not chunk then error(errmsg) end
return chunk
end
@@ -140,38 +143,38 @@ function LoadActorFunc( path, level )
return function()
return Def.BGAnimation {
_Level = level+1,
AniDir = path,
AniDir = path
}
end
end
error( path .. ": unknown file type (" .. tostring(Type) .. ")", level+1 );
error( path .. ": unknown file type (" .. tostring(Type) .. ")", level+1 )
end
-- Load and create an actor template.
function LoadActor( path, ... )
local t = LoadActorFunc( path, 2 );
assert(t);
return t(...);
local t = LoadActorFunc( path, 2 )
assert(t)
return t(...)
end
function LoadActorWithParams( path, params, ... )
local t = LoadActorFunc( path, 2 );
assert(t);
return lua.RunWithThreadVariables( function(...) return t(...) end, params, ... );
local t = LoadActorFunc( path, 2 )
assert(t)
return lua.RunWithThreadVariables( function(...) return t(...) end, params, ... )
end
function LoadFont(a, b)
local sSection = b and a or "";
local sFile = b or a;
local sSection = b and a or ""
local sFile = b or a
if (sFile == "" and sSection == "") or (sFile == nil and sSection == nil) then
sSection = "Common";
sFile = "normal";
end;
local sPath = THEME:GetPathF(sSection, sFile);
sSection = "Common"
sFile = "normal"
end
local sPath = THEME:GetPathF(sSection, sFile)
return Def.BitmapText {
_Level = 2;
File = sPath;
_Level = 2,
File = sPath
}
end
@@ -182,20 +185,23 @@ end
function StandardDecorationFromTable( MetricsName, t )
if type(t) == "table" then
t = t .. {
InitCommand=function(self) self:name(MetricsName); ActorUtil.LoadAllCommandsAndSetXY(self,Var "LoadingScreen"); end;
};
InitCommand=function(self)
self:name(MetricsName)
ActorUtil.LoadAllCommandsAndSetXY(self,Var "LoadingScreen")
end
}
end
return t;
return t
end
function StandardDecorationFromFile( MetricsName, FileName )
local t = LoadActor( THEME:GetPathG(Var "LoadingScreen",FileName) );
return StandardDecorationFromTable( MetricsName, t );
local t = LoadActor( THEME:GetPathG(Var "LoadingScreen",FileName) )
return StandardDecorationFromTable( MetricsName, t )
end
function StandardDecorationFromFileOptional( MetricsName, FileName )
if ShowStandardDecoration(MetricsName) then
return StandardDecorationFromFile( MetricsName, FileName );
return StandardDecorationFromFile( MetricsName, FileName )
end
end
+24 -16
View File
@@ -9,34 +9,38 @@ If the line is a function, you'll have to use Branch.keyname() instead.
-- used for various SMOnline-enabled screens:
function SMOnlineScreen()
for pn in ivalues(GAMESTATE:GetHumanPlayers()) do
if not IsSMOnlineLoggedIn(pn) then return "ScreenSMOnlineLogin" end;
end;
if not IsSMOnlineLoggedIn(pn) then
return "ScreenSMOnlineLogin"
end
end
return "ScreenNetRoom"
end;
end
function SelectMusicOrCourse()
if IsNetSMOnline() then
return "ScreenNetSelectMusic";
elseif GAMESTATE:IsCourseMode() then
return "ScreenSelectCourse";
return "ScreenSelectCourse"
else
return "ScreenSelectMusic";
end;
end;
return "ScreenSelectMusic"
end
end
Branch = {
TitleMenu = function()
-- home mode is the most assumed use of sm-ssc.
if GAMESTATE:GetCoinMode() == "CoinMode_Home" then return "ScreenTitleMenu" end;
if GAMESTATE:GetCoinMode() == "CoinMode_Home" then
return "ScreenTitleMenu"
end
-- arcade junk:
if GAMESTATE:GetCoinsNeededToJoin() > GAMESTATE:GetCoins() then
-- if no credits are inserted, don't show the Join screen. SM4 has
-- this as the initial screen, but that means we'd be stuck in a
-- loop with ScreenInit. No good.
return "ScreenDemonstration";
return "ScreenDemonstration"
else
return "ScreenTitleJoin"
end;
end
end,
AfterProfileLoad = function()
return "ScreenSelectProfile"
@@ -58,8 +62,12 @@ Branch = {
ReportStyle()
GAMESTATE:ApplyGameCommand("playmode,regular")
end
if IsNetSMOnline() then return SMOnlineScreen() end
if IsNetConnected() then return "ScreenNetRoom" end
if IsNetSMOnline() then
return SMOnlineScreen()
end
if IsNetConnected() then
return "ScreenNetRoom"
end
return "ScreenSelectPlayMode"
end,
AfterSelectStyle = function()
@@ -82,8 +90,8 @@ Branch = {
end
end,
GetGameInformationScreen = function()
bTrue = PREFSMAN:GetPreference("ShowInstructions");
return (bTrue and GoToMusic() or "ScreenGameInformation");
bTrue = PREFSMAN:GetPreference("ShowInstructions")
return (bTrue and GoToMusic() or "ScreenGameInformation")
end,
AfterSMOLogin = SMOnlineScreen(),
BackOutOfPlayerOptions = function()
@@ -138,5 +146,5 @@ Branch = {
QuickSetupB = "ScreenQuickSetupPhaseTwo",
QuickSetupC = "ScreenQuickSetupPhaseThree",
QuickSetupD = "ScreenQuickSetupPhaseFour",
QuickSetupFinished = "ScreenQuickSetupFinished",
};
QuickSetupFinished = "ScreenQuickSetupFinished"
}
+68 -52
View File
@@ -1,5 +1,5 @@
-- SSC Color Module and Library
local nilColor = color("0,0,0,0");
local nilColor = color("0,0,0,0")
-- Original Color Module.
Color = {
-- UI Colors
@@ -19,7 +19,7 @@ Color = {
-- ( Do note that I want to remove '*Color' entirely, it'll look neater )
Player = {
P1 = color("#ef403d"),
P2 = color("#0089cf"),
P2 = color("#0089cf")
},
Difficulty = {
--[[ These are for 'Custom' Difficulty Ranks. It can be very useful
@@ -42,7 +42,7 @@ Color = {
Difficulty_Challenge = color("0.2,0.6,1.0,1"), -- light blue
Difficulty_Edit = color("0.8,0.8,0.8,1"), -- gray
Difficulty_Couple = color("#ed0972"), -- hot pink
Difficulty_Routine = color("#ff9a00"), -- orange
Difficulty_Routine = color("#ff9a00") -- orange
},
Course = {
Beginner = color("0.0,0.9,1.0,1"), -- purple
@@ -60,7 +60,7 @@ Color = {
Difficulty_Easy = color("0.9,0.9,0.0,1"), -- green
Difficulty_Medium = color("1.0,0.1,0.1,1"), -- yellow
Difficulty_Hard = color("0.2,1.0,0.2,1"), -- red
Difficulty_Challenge = color("0.2,0.6,1.0,1"), -- light blue
Difficulty_Challenge = color("0.2,0.6,1.0,1") -- light blue
},
CourseDifficultyColors = {
Beginner = color("0.0,0.9,1.0,1"), -- purple
@@ -78,7 +78,7 @@ Color = {
Difficulty_Easy = color("0.9,0.9,0.0,1"), -- green
Difficulty_Medium = color("1.0,0.1,0.1,1"), -- yellow
Difficulty_Hard = color("0.2,1.0,0.2,1"), -- red
Difficulty_Challenge = color("0.2,0.6,1.0,1"), -- light blue
Difficulty_Challenge = color("0.2,0.6,1.0,1") -- light blue
},
Stage = {
Stage_1st = color("#00ffc7"),
@@ -95,7 +95,7 @@ Color = {
Stage_Oni = color("#FFFFFF"),
Stage_Endless = color("#FFFFFF"),
Stage_Event = color("#FFFFFF"),
Stage_Demo = color("#FFFFFF"),
Stage_Demo = color("#FFFFFF")
},
Judgment = {
JudgmentLine_W1 = color("#00ffc7"),
@@ -105,7 +105,7 @@ Color = {
JudgmentLine_W5 = color("#e44dff"),
JudgmentLine_Held = color("#FFFFFF"),
JudgmentLine_Miss = color("#ff3c3c"),
JudgmentLine_MaxCombo = color("#ffc600"),
JudgmentLine_MaxCombo = color("#ffc600")
},
JudgmentLine = {
JudgmentLine_W1 = color("#00ffc7"),
@@ -115,7 +115,7 @@ Color = {
JudgmentLine_W5 = color("#e44dff"),
JudgmentLine_Held = color("#FFFFFF"),
JudgmentLine_Miss = color("#ff3c3c"),
JudgmentLine_MaxCombo = color("#ffc600"),
JudgmentLine_MaxCombo = color("#ffc600")
},
Grade = {},
Menu = {},
@@ -125,11 +125,11 @@ Color = {
StreakW1 = nilColor,
StreakW2 = nilColor,
StreakW3 = nilColor,
Misses = nilColor,
Misses = nilColor
},
Song = {
Extra = nilColor,
Unlock = nilColor,
Unlock = nilColor
},
-- Color Library
-- These colors are pure swatch colors and are here purely to be used
@@ -157,15 +157,16 @@ Color = {
Alpha = function(cColor,fAlpha)
local c = cColor;
return { c[1],c[2],c[3],fAlpha };
end,
};
end
}
-- Remapped Color Module, since some themes are crazy
Colors = Color;
Colors = Color
local PlayerColors = {
PLAYER_1 = color("#ef403d"),
PLAYER_2 = color("#0089cf"),
};
PLAYER_2 = color("#0089cf")
}
local DifficultyColors = {
--[[ These are for 'Custom' Difficulty Ranks. It can be very useful
@@ -188,8 +189,9 @@ local DifficultyColors = {
Difficulty_Challenge = color("#1cd8ff"), -- light blue
Difficulty_Edit = color("0.8,0.8,0.8,1"), -- gray
Difficulty_Couple = color("#ed0972"), -- hot pink
Difficulty_Routine = color("#ff9a00"), -- orange
};
Difficulty_Routine = color("#ff9a00") -- orange
}
local StageColors = {
Stage_1st = color("#00ffc7"),
Stage_2nd = color("#58ff00"),
@@ -205,8 +207,9 @@ local StageColors = {
Stage_Oni = color("#FFFFFF"),
Stage_Endless = color("#FFFFFF"),
Stage_Event = color("#FFFFFF"),
Stage_Demo = color("#FFFFFF"),
};
Stage_Demo = color("#FFFFFF")
}
local JudgmentColors = {
JudgmentLine_W1 = color("#00ffc7"),
JudgmentLine_W2 = color("#f6ff00"),
@@ -215,77 +218,90 @@ local JudgmentColors = {
JudgmentLine_W5 = color("#e44dff"),
JudgmentLine_Held = color("#FFFFFF"),
JudgmentLine_Miss = color("#ff3c3c"),
JudgmentLine_MaxCombo = color("#ffc600"),
};
JudgmentLine_MaxCombo = color("#ffc600")
}
--[[ Fallbacks ]]
function Color(c)
return Colors[c];
end;
return Colors[c]
end
function BoostColor( cColor, fBoost )
local c = cColor;
return { c[1]*fBoost, c[2]*fBoost, c[3]*fBoost, c[4] };
end;
local c = cColor
return { c[1]*fBoost, c[2]*fBoost, c[3]*fBoost, c[4] }
end
function ColorLightTone(c)
return { c[1]+(c[1]/2), c[2]+(c[2]/2), c[3]+(c[3]/2), c[4] };
end;
return { c[1]+(c[1]/2), c[2]+(c[2]/2), c[3]+(c[3]/2), c[4] }
end
function ColorMidTone(c)
return { c[1]/1.5, c[2]/1.5, c[3]/1.5, c[4] };
end;
return { c[1]/1.5, c[2]/1.5, c[3]/1.5, c[4] }
end
function ColorDarkTone(c)
return { c[1]/2, c[2]/2, c[3]/2, c[4] };
end;
return { c[1]/2, c[2]/2, c[3]/2, c[4] }
end
function PlayerColor( pn )
if pn == PLAYER_1 then return color("#ef403d") end -- pink-red
if pn == PLAYER_2 then return color("#0089cf") end -- sea-blue
if pn == PLAYER_1 then
return color("#ef403d") -- pink-red
end
if pn == PLAYER_2 then
return color("#0089cf") -- sea-blue
end
return color("1,1,1,1")
end
function PlayerScoreColor( pn )
if pn == PLAYER_1 then return color("#ef403d") end -- pink-red
if pn == PLAYER_2 then return color("#0089cf") end -- sea-blue
if pn == PLAYER_1 then
return color("#ef403d") -- pink-red
end
if pn == PLAYER_2 then
return color("#0089cf") -- sea-blue
end
return color("1,1,1,1")
end
function CustomDifficultyToColor( sCustomDifficulty )
return DifficultyColors[sCustomDifficulty];
return DifficultyColors[sCustomDifficulty]
end
function CustomDifficultyToDarkColor( sCustomDifficulty )
local c = DifficultyColors[sCustomDifficulty];
return { c[1]/2, c[2]/2, c[3]/2, c[4] };
local c = DifficultyColors[sCustomDifficulty]
return { c[1]/2, c[2]/2, c[3]/2, c[4] }
end
function CustomDifficultyToLightColor( sCustomDifficulty )
local c = DifficultyColors[sCustomDifficulty];
return { scale(c[1],0,1,0.5,1), scale(c[2],0,1,0.5,1), scale(c[3],0,1,0.5,1), c[4] };
local c = DifficultyColors[sCustomDifficulty]
return { scale(c[1],0,1,0.5,1), scale(c[2],0,1,0.5,1), scale(c[3],0,1,0.5,1), c[4] }
end
function StepsOrTrailToColor(StepsOrTrail)
return CustomDifficultyToColor( StepsOrTrailToCustomDifficulty(stepsOrTrail) );
return CustomDifficultyToColor( StepsOrTrailToCustomDifficulty(stepsOrTrail) )
end
function StageToColor( stage )
local c = Colors.Stage[stage];
if c then return c end
return color("#000000");
local c = Colors.Stage[stage]
if c then
return c
end
return color("#000000")
end
function StageToStrokeColor( stage )
local c = StageColors[stage];
return { c[1]/2, c[2]/2, c[3]/2, c[4] };
local c = StageColors[stage]
return { c[1]/2, c[2]/2, c[3]/2, c[4] }
end
function JudgmentLineToColor( i )
local c = JudgmentColors[i];
if c then return c end
return color("#000000");
local c = JudgmentColors[i]
if c then
return c
end
return color("#000000")
end
function JudgmentLineToStrokeColor( i )
local c = JudgmentColors[i];
return { c[1]/2, c[2]/2, c[3]/2, c[4] };
local c = JudgmentColors[i]
return { c[1]/2, c[2]/2, c[3]/2, c[4] }
end
+20 -11
View File
@@ -10,11 +10,20 @@ function debug.traceback(...)
local thread = coroutine.running()
local msg = ""
local level = 1
local args = {...};
local args = {...}
if type(args[1]) == "thread" then thread = args[1]; table.remove(args) end
if type(args[1]) == "string" then msg = args[1]; table.remove(args) end
if type(args[1]) == "number" then level = args[1]; table.remove(args) end
if type(args[1]) == "thread" then
thread = args[1]
table.remove(args)
end
if type(args[1]) == "string" then
msg = args[1]
table.remove(args)
end
if type(args[1]) == "number" then
level = args[1]
table.remove(args)
end
if thread == coroutine.running() then
level = level + 1 -- skip this function
@@ -22,22 +31,22 @@ function debug.traceback(...)
local stack = {}
repeat
local info = debug.getinfo(level, "Sln");
table.insert( stack, info );
local info = debug.getinfo(level, "Sln")
table.insert( stack, info )
level = level + 1
until not info
if #stack == 0 then
return "";
return ""
end
-- The original caller is usually C; remove it.
if( stack[#stack].what == "C" ) then
table.remove( stack );
table.remove( stack )
end
local function FormatFrame(level, frame)
local sFrameInfo = ""
sFrameInfo = sFrameInfo .. "#" .. level .. " ";
sFrameInfo = sFrameInfo .. "#" .. level .. " "
if( frame.what == "tail" ) then
-- sFrameInfo = sFrameInfo .. "(tail call)"
-- return sFrameInfo
@@ -46,7 +55,7 @@ function debug.traceback(...)
elseif frame.name then
sFrameInfo = sFrameInfo .. frame.name .. "() in "
else
sFrameInfo = sFrameInfo .. "... in ";
sFrameInfo = sFrameInfo .. "... in "
end
sFrameInfo = sFrameInfo .. frame.short_src
@@ -61,7 +70,7 @@ function debug.traceback(...)
for level, frame in ipairs(stack) do
FrameInfo[level] = FormatFrame(level, frame)
end
return table.concat( FrameInfo, "\n" );
return table.concat( FrameInfo, "\n" )
end
-- (c) 2006 Glenn Maynard
+16 -10
View File
@@ -1,23 +1,29 @@
function Enum:Compare( e1, e2 )
local Reverse = self:Reverse();
local Value1 = Reverse[e1];
local Value2 = Reverse[e2];
local Reverse = self:Reverse()
local Value1 = Reverse[e1]
local Value2 = Reverse[e2]
assert( Value1, tostring(e1) .. " is not an enum of type " .. self:GetName() );
assert( Value2, tostring(e2) .. " is not an enum of type " .. self:GetName() );
assert( Value1, tostring(e1) .. " is not an enum of type " .. self:GetName() )
assert( Value2, tostring(e2) .. " is not an enum of type " .. self:GetName() )
-- Nil enums correspond to "invalid". These compare greater
-- than any valid enum value, to line up with the equivalent
-- C++ code.
if not e1 then Value1 = 99999999 end;
if not e2 then Value2 = 99999999 end;
return Value1 - Value2;
-- should this be changed to math.huge()? -shake
if not e1 then
Value1 = 99999999
end
if not e2 then
Value2 = 99999999
end
return Value1 - Value2
end
function ToEnumShortString( e )
local pos = string.find( e, '_' )
assert( pos, "'" .. e .. "' is not an enum value" );
return string.sub( e, pos+1 );
assert( pos, "'" .. e .. "' is not an enum value" )
return string.sub( e, pos+1 )
end
-- (c) 2006 Glenn Maynard
+6 -6
View File
@@ -2,16 +2,16 @@ function HelpDisplay:setfromsongorcourse()
local Artists = {}
local AltArtists = {}
local Song = GAMESTATE:GetCurrentSong();
local Trail = GAMESTATE:GetCurrentTrail( GAMESTATE:GetMasterPlayerNumber() );
local Song = GAMESTATE:GetCurrentSong()
local Trail = GAMESTATE:GetCurrentTrail( GAMESTATE:GetMasterPlayerNumber() )
if Song then
table.insert( Artists, Song:GetDisplayArtist() );
table.insert( AltArtists, Song:GetTranslitArtist() );
table.insert( Artists, Song:GetDisplayArtist() )
table.insert( AltArtists, Song:GetTranslitArtist() )
elseif Trail then
Artists, AltArtists = Trail:GetArtists();
Artists, AltArtists = Trail:GetArtists()
end
self:settips( Artists, AltArtists );
self:settips( Artists, AltArtists )
end
-- (c) 2006 Glenn Maynard
+22 -20
View File
@@ -1,16 +1,18 @@
function Actor:LyricCommand(side)
self:settext( Var "LyricText" );
self:settext( Var "LyricText" )
self:stoptweening();
self:shadowlengthx(0);
self:shadowlengthy(5);
self:strokecolor(color("#000000"));
self:stoptweening()
self:shadowlengthx(0)
self:shadowlengthy(5)
self:strokecolor(color("#000000"))
local Zoom = SCREEN_WIDTH/(self:GetZoomedWidth()+1);
if( Zoom > 1 ) then Zoom = 1 end
self:zoomx( Zoom );
local Zoom = SCREEN_WIDTH / (self:GetZoomedWidth()+1)
if( Zoom > 1 ) then
Zoom = 1
end
self:zoomx( Zoom )
local lyricColor = Var "LyricColor";
local lyricColor = Var "LyricColor"
local Factor = 1
if side == "Back" then
Factor = 0.5
@@ -24,23 +26,23 @@ function Actor:LyricCommand(side)
lyricColor[4] * Factor } )
if side == "Front" then
self:cropright(1);
self:cropright(1)
else
self:cropleft(0);
self:cropleft(0)
end
self:diffusealpha(0);
self:linear(0.2);
self:diffusealpha(0.75);
self:linear( Var "LyricDuration" * 0.75);
self:diffusealpha(0)
self:linear(0.2)
self:diffusealpha(0.75)
self:linear( Var "LyricDuration" * 0.75)
if side == "Front" then
self:cropright(0);
self:cropright(0)
else
self:cropleft(1);
self:cropleft(1)
end
self:sleep( Var "LyricDuration" * 0.25 );
self:linear(0.2);
self:diffusealpha(0);
self:sleep( Var "LyricDuration" * 0.25 )
self:linear(0.2)
self:diffusealpha(0)
end
-- (c) 2006 Glenn Maynard
+21 -21
View File
@@ -31,8 +31,10 @@ function OptionsRowTest()
-- Set list[1] to true if Option1 should be selected, and
-- list[2] if Option2 should be selected. This will be
-- called once per enabled player.
LoadSelections = (function(self,list,pn) list[1] = true; end),
SaveSelections = Set,
LoadSelections = function(self,list,pn)
list[1] = true
end,
SaveSelections = Set
}
end
@@ -62,37 +64,35 @@ OptionRowTable =
function OptionsRandomJukebox()
local function AllChoices()
Trace('all choices');
local ret = { }
ret[1] = 'Off';
ret[2] = 'Random';
Trace('all choices')
local ret = { 'Off', 'Random' }
return ret
end
local t =
{
-- Name is used to retrieve the header and explanation text.
Name = "OptionsRandomJukebox";
LayoutType = "ShowAllInRow";
SelectType = "SelectOne";
OneChoiceForAllPlayers = true;
ExportOnChange = false;
Choices = AllChoices();
Name = "OptionsRandomJukebox",
LayoutType = "ShowAllInRow",
SelectType = "SelectOne",
OneChoiceForAllPlayers = true,
ExportOnChange = false,
Choices = AllChoices(),
LoadSelections = function(self, list, pn)
list[1] = true
end;
end,
SaveSelections = function(self, list, pn)
local val;
local val
if list[1] then
val = false;
val = false
else
val = true;
val = true
end
GAMESTATE:SetJukeboxUsesModifiers(val);
end;
};
setmetatable( t, t );
return t;
GAMESTATE:SetJukeboxUsesModifiers(val)
end
}
setmetatable( t, t )
return t
end
-- (c) 2005 Glenn Maynard
+4 -3
View File
@@ -1,9 +1,10 @@
-- Can this be moved into some other file? Feels like clutter. -shake
-- Play the sound on the given player's side. Must set SupportPan = true
-- on load.
function ActorSound:playforplayer(pn)
local fBalance = SOUND:GetPlayerBalance(pn);
self:get():SetProperty("Pan", fBalance);
self:play();
local fBalance = SOUND:GetPlayerBalance(pn)
self:get():SetProperty("Pan", fBalance)
self:play()
end
-- (c) 2007 Glenn Maynard
+12 -13
View File
@@ -8,7 +8,7 @@ function Sprite:LoadFromSongBanner(song)
self:LoadBanner( Path )
else
self:LoadBanner( THEME:GetPathG("Common","fallback banner") )
end;
end
end
function Sprite:LoadFromSongBackground(song)
@@ -22,34 +22,33 @@ end
function LoadSongBackground()
return Def.Sprite {
InitCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y);
BeginCommand=cmd(LoadFromSongBackground,GAMESTATE:GetCurrentSong();scale_or_crop_background);
};
InitCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y),
BeginCommand=cmd(LoadFromSongBackground,GAMESTATE:GetCurrentSong();scale_or_crop_background)
}
end
function Sprite:position( f )
self:GetTexture():position( f );
self:GetTexture():position( f )
end
function Sprite:loop( f )
self:GetTexture():loop( f );
self:GetTexture():loop( f )
end
function Sprite:rate( f )
self:GetTexture():rate( f );
self:GetTexture():rate( f )
end
function Sprite.LinearFrames(NumFrames, Seconds)
local Frames = {};
local Frames = {}
for i = 0,NumFrames-1 do
Frames[#Frames+1] = {
Frame = i;
Delay = (1/NumFrames)*Seconds;
};
Frame = i,
Delay = (1/NumFrames)*Seconds
}
end
return Frames;
return Frames
end
-- (c) 2005 Glenn Maynard
+4 -4
View File
@@ -32,11 +32,11 @@ function ScreenSelectMusic:setupmusicstagemods()
local song, steps = SONGMAN:GetExtraStageInfo( bExtra2, style )
local po, so
if bExtra2 then
po = "default,1.5x,reverse";
so = "suddendeath";
po = "default,1.5x,reverse"
so = "suddendeath"
else
po = "default,1.5x,reverse";
so = "norecover";
po = "default,1.5x,reverse"
so = "norecover"
end
local difficulty = steps:GetDifficulty()
local Reverse = PlayerNumber:Reverse()
+23 -14
View File
@@ -58,7 +58,7 @@ function wrap(val,n)
local x = val
Trace( "wrap "..x.." "..n )
if x<0 then
x = x + (math.ceil(-x/n)+1)*n;
x = x + (math.ceil(-x/n)+1)*n
end
Trace( "adjusted "..x )
local ret = math.mod(x,n)
@@ -67,21 +67,26 @@ function wrap(val,n)
end
function fapproach( val, other_val, to_move )
if val == other_val then return val end
local fDelta = other_val - val
local fSign = fDelta / math.abs( fDelta )
local fToMove = fSign*to_move
if math.abs(fToMove) > math.abs(fDelta) then
fToMove = fDelta -- snap
if val == other_val then
return val -- already done!
end
val = val + fToMove
local delta = other_val - val
local sign = delta / math.abs(delta)
local toMove = sign*to_move
if math.abs(toMove) > math.abs(delta) then
toMove = delta -- snap
end
val = val + toMove
return val
end
function tableshuffle( t )
local ret = { }
for i=1,table.getn(t) do
table.insert( ret, math.random(i), t[i] );
table.insert( ret, math.random(i), t[i] )
end
return ret
end
@@ -89,7 +94,7 @@ end
function tableslice( t, num )
local ret = { }
for i=1,table.getn(t) do
table.insert( ret, i, t[i] );
table.insert( ret, i, t[i] )
end
return ret
end
@@ -100,7 +105,9 @@ function GetRandomSongBackground()
local song = SONGMAN:GetRandomSong()
if song then
local path = song:GetBackgroundPath()
if path then return path end
if path then
return path
end
end
end
return THEME:GetPathG("", "_blank")
@@ -110,17 +117,19 @@ function GetSongBackground()
local song = GAMESTATE:GetCurrentSong()
if song then
local path = song:GetBackgroundPath()
if path then return path end
if path then
return path
end
end
return THEME:GetPathG("Common","fallback background")
end
function StepsOrTrailToCustomDifficulty( stepsOrTrail )
if lua.CheckType("Steps", stepsOrTrail) then
return StepsToCustomDifficulty( stepsOrTrail );
return StepsToCustomDifficulty( stepsOrTrail )
end
if lua.CheckType("Trail", stepsOrTrail) then
return TrailToCustomDifficulty( stepsOrTrail );
return TrailToCustomDifficulty( stepsOrTrail )
end
end
+116 -110
View File
@@ -46,36 +46,36 @@ anticipated future changes:
-- ProfileDir(slot): gets the profile dir for slot,
-- where slot is a 'ProfileSlot_*' enum value.
local function ProfileDir(slot)
local profileDir = PROFILEMAN:GetProfileDir(slot);
return profileDir or nil;
end;
local profileDir = PROFILEMAN:GetProfileDir(slot)
return profileDir or nil
end
-- Tries to parse the file at path. If successful, returns a table of mods.
-- If it can't open the file, it will write a fallback set of mods.
local function ParseSpeedModFile(path)
local file = RageFileUtil.CreateRageFile();
local file = RageFileUtil.CreateRageFile()
if file:Open(path, 1) then
-- success
local contents = file:Read();
mods = split(',',contents);
local contents = file:Read()
mods = split(',',contents)
-- strip any whitespace
for i=1,#mods do
string.gsub(mods[i], "%s", "");
string.gsub(mods[i], "%s", "")
end
file:destroy();
return mods;
file:destroy()
return mods
else
-- error; write a fallback mod file and return it
local fallbackString = "0.5x,1x,1.5x,2x,3x,4x,8x,C200,C400";
Trace("[CustomSpeedMods]: Could not read SpeedMods; writing fallback to "..path);
file:Open(path, 2);
file:Write(fallbackString);
file:destroy();
return split(',',fallbackString);
end;
end;
local fallbackString = "0.5x,1x,1.5x,2x,3x,4x,8x,C200,C400"
Trace("[CustomSpeedMods]: Could not read SpeedMods; writing fallback to "..path)
file:Open(path, 2)
file:Write(fallbackString)
file:destroy()
return split(',',fallbackString)
end
end
-- MarkDupes(src,parent)
-- Marks duplicates in src from any matches in parent.
@@ -84,32 +84,34 @@ local function MarkDupes(src,parent)
for iPar=1,#parent do
for iSrc=1,#src do
if parent[iPar] == src[iSrc] then
src[iSrc] = "XXX";
end;
end;
end;
return src;
end;
src[iSrc] = "XXX"
end
end
end
return src
end
-- RemoveMarked(src)
-- Removes any values marked for deletion.
local function RemoveMarked(src)
for iSrc=1,#src do
if src[iSrc] == "XXX" then
table.remove(src,iSrc);
end;
end;
return src;
end;
table.remove(src,iSrc)
end
end
return src
end
-- MergeTables(parent,child)
-- Adds the child's contents to the parent.
-- the overall mods are usually used as the parent.
local function MergeTables(parent,child)
child = RemoveMarked(child);
if #child == 0 then return parent; end;
child = RemoveMarked(child)
if #child == 0 then
return parent
end
local addMe = true;
local addMe = true
for iC=1,#child do
--[[
for iP=1,#parent do
@@ -118,133 +120,137 @@ local function MergeTables(parent,child)
-- why am I doing this anyways?
-- by the time these tables are passed in,
-- dupes should be gone.
end;
end;
end
end
]]
if addMe then
table.insert(parent,child[iC]);
end;
end;
return parent;
end;
table.insert(parent,child[iC])
end
end
return parent
end
-- code in this function is based off of code in
-- http://astrofra.com/weblog/files/sort.lua
local function AnonSort(t)
local index_min;
local index_min
for i=1,#t,1 do
index_min = i;
index_min = i
for j=i+1,#t,1 do
if (t[j] < t[index_min]) then
index_min = j;
end;
end;
t[i], t[index_min] = t[index_min], t[i];
end;
return t;
end;
index_min = j
end
end
t[i], t[index_min] = t[index_min], t[i]
end
return t
end
local function SpeedModSort(tab)
local xMods = {};
local cMods = {};
--local mMods = {};
local xMods = {}
local cMods = {}
--local mMods = {}
-- convert to numbers so sorting works:
for i=1,#tab do
local typ,val;
local typ,val
-- xxx: If people use a floating point CMod (e.g. C420.50),
-- it will get rounded. C420.50 gets rounded to 421, btw. -aj
if string.find(tab[i],"C%d") then
typ = cMods;
val = string.gsub(tab[i], "C", "");
typ = cMods
val = string.gsub(tab[i], "C", "")
elseif string.find(tab[i],"M%d") then
Trace("[CustomSpeedMods] OpenITG's M-Mods are not supported yet in sm-ssc.");
--typ = mMods;
--val = string.gsub(tab[i], "M", "");
Trace("[CustomSpeedMods] OpenITG's M-Mods are not supported yet in sm-ssc.")
--typ = mMods
--val = string.gsub(tab[i], "M", "")
else
typ = xMods;
val = string.gsub(tab[i], "x", "");
end;
table.insert(typ,tonumber(val));
end;
typ = xMods
val = string.gsub(tab[i], "x", "")
end
table.insert(typ,tonumber(val))
end
-- sort xMods
xMods = AnonSort(xMods);
xMods = AnonSort(xMods)
-- sort cMods
cMods = AnonSort(cMods);
cMods = AnonSort(cMods)
-- sort mMods
--mMods = AnonSort(mMods)
local fin = {};
local fin = {}
-- convert it back to a string since that's what it expects
for i=1,#xMods do table.insert(fin, xMods[i].."x"); end;
for i=1,#cMods do table.insert(fin, "C"..cMods[i]); end;
for i=1,#xMods do
table.insert(fin, xMods[i].."x")
end
for i=1,#cMods do
table.insert(fin, "C"..cMods[i])
end
--for i=1,#mMods do table.insert(fin, "M"..mMods[i]); end;
return fin;
end;
return fin
end
-- parse everything
local function GetSpeedMods()
local finalMods = {};
local finalMods = {}
local baseFilename = "SpeedMods.txt"
local profileDirs = {
Fallback = "Data/",
Machine = ProfileDir('ProfileSlot_Machine'),
PlayerNumber_P1 = ProfileDir('ProfileSlot_Player1'),
PlayerNumber_P2 = ProfileDir('ProfileSlot_Player2'),
};
PlayerNumber_P2 = ProfileDir('ProfileSlot_Player2')
}
-- figure out how many players we have to deal with.
local numPlayers = GAMESTATE:GetNumPlayersEnabled();
local numPlayers = GAMESTATE:GetNumPlayersEnabled()
-- load fallback
local fallbackMods = ParseSpeedModFile(profileDirs.Fallback..baseFilename);
local fallbackMods = ParseSpeedModFile(profileDirs.Fallback..baseFilename)
-- load machine
local machineMods = ParseSpeedModFile(profileDirs.Machine..baseFilename);
local machineMods = ParseSpeedModFile(profileDirs.Machine..baseFilename)
local playerMods = {};
local playerMods = {}
for pn in ivalues(GAMESTATE:GetHumanPlayers()) do
-- file loading logic per player;
-- only bother if it's not the machine profile though.
if PROFILEMAN:IsPersistentProfile(pn) or
MEMCARDMAN:GetCardState(pn) == 'MemoryCardState_ready' then
playerMods[#playerMods+1] = ParseSpeedModFile(profileDirs[pn]..baseFilename);
end;
end;
playerMods[#playerMods+1] = ParseSpeedModFile(profileDirs[pn]..baseFilename)
end
end
-- with all loaded... the merging BEGINS!!
finalMods = fallbackMods;
finalMods = fallbackMods
-- mine for duplicates, first pass (fallback <-> machine)
machineMods = MarkDupes(machineMods,finalMods);
machineMods = MarkDupes(machineMods,finalMods)
for ply=1,#playerMods do
playerMods[ply] = MarkDupes(playerMods[ply],finalMods);
end;
playerMods[ply] = MarkDupes(playerMods[ply],finalMods)
end
-- remove XXX, first pass
machineMods = RemoveMarked(machineMods);
for ply=1,#playerMods do
playerMods[ply] = RemoveMarked(playerMods[ply]);
end;
playerMods[ply] = RemoveMarked(playerMods[ply])
end
-- mine for duplicates, second pass (machine <-> player)
for ply=1,#playerMods do
playerMods[ply] = MarkDupes(playerMods[ply],machineMods);
end;
playerMods[ply] = MarkDupes(playerMods[ply],machineMods)
end
-- remove XXX, second pass
machineMods = RemoveMarked(machineMods);
machineMods = RemoveMarked(machineMods)
for ply=1,#playerMods do
playerMods[ply] = RemoveMarked(playerMods[ply]);
end;
playerMods[ply] = RemoveMarked(playerMods[ply])
end
-- merge zone
finalMods = MergeTables(finalMods,machineMods);
finalMods = MergeTables(finalMods,machineMods)
for ply=1,#playerMods do
finalMods = MergeTables(finalMods,playerMods[ply]);
end;
finalMods = MergeTables(finalMods,playerMods[ply])
end
-- final removal of XXX before sorting
finalMods = RemoveMarked(finalMods);
finalMods = RemoveMarked(finalMods)
-- sort the mods before returning them
return SpeedModSort(finalMods);
end;
return SpeedModSort(finalMods)
end
function SpeedMods()
-- here we see the option menu itself.
@@ -257,36 +263,36 @@ function SpeedMods()
Choices = GetSpeedMods(),
LoadSelections = function(self, list, pn)
local pMods = GAMESTATE:GetPlayerState(pn):GetPlayerOptions("ModsLevel_Preferred");
local pMods = GAMESTATE:GetPlayerState(pn):GetPlayerOptions("ModsLevel_Preferred")
for i = 1,table.getn(self.Choices) do
if string.find(pMods, self.Choices[i]) then
list[i] = true;
return;
end;
end;
list[i] = true
return
end
end
-- if we've reached this point, try to find 1x or 1.0x instead,
-- in case the player has defined a speed mod under 1.0x
for i = 1,table.getn(self.Choices) do
if self.Choices[i] == "1x" or self.Choices[i] == "1.0x" then
list[i] = true;
return;
end;
end;
list[i] = true
return
end
end
end,
SaveSelections = function(self, list, pn)
for i = 1,table.getn(self.Choices) do
if list[i] then
local PlayerState = GAMESTATE:GetPlayerState(pn);
PlayerState:SetPlayerOptions("ModsLevel_Preferred",self.Choices[i]);
local PlayerState = GAMESTATE:GetPlayerState(pn)
PlayerState:SetPlayerOptions("ModsLevel_Preferred",self.Choices[i])
return
end
end
end
};
setmetatable( t, t );
return t;
end;
}
setmetatable( t, t )
return t
end
--[[
Copyright © 2008-2009 AJ Kelly/KKI Labs.
+11 -12
View File
@@ -46,26 +46,25 @@ local dateChars = {
--[[ full datetime ]]
'c', -- ISO 8601 date
'r', -- RFC 2822 formatted date
'U', -- Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
};
'U' -- Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
}
function date(format,...)
if ... then
-- convert value
else
-- convert current time
end;
end;
-- convert current time
end
end
Date = {
Today = function()
return string.format("%i%02i%02i", Year(), (MonthOfYear()+1), DayOfMonth());
end;
};
return string.format("%i%02i%02i", Year(), (MonthOfYear()+1), DayOfMonth())
end
}
Time = {
Now = function()
return string.format( "%02i:%02i:%02i", Hour(), Minute(), Second() );
end;
};
return string.format( "%02i:%02i:%02i", Hour(), Minute(), Second() )
end
}
+5 -5
View File
@@ -10,7 +10,7 @@ This new version should also work better and be less confusing.
--]]
-- Env table global
envTable = GAMESTATE:Env();
envTable = GAMESTATE:Env()
-- setenv(name,value)
-- Sets aside an entry for /name/ and puts /value/ into it.
@@ -18,14 +18,14 @@ envTable = GAMESTATE:Env();
-- If you need to store more than one value, you're welcome to use a
-- table as /value/, it should work just fine.
function setenv(name,value)
envTable[name] = value;
end;
envTable[name] = value
end
-- getenv(name)
-- This will return whatever value is at envTable[name].
function getenv(name)
return envTable[name];
end;
return envTable[name]
end
--[[
Copyright © 2008 AJ Kelly/KKI Labs
+88 -75
View File
@@ -2,10 +2,12 @@
-- [en] This file is used to store settings that should be different in each
-- game mode.
-- shakesoda calls this pump.lua
-- GameCompatibleModes:
-- [en] returns possible modes for ScreenSelectPlayMode
function GameCompatibleModes()
sGame = GAMESTATE:GetCurrentGame():GetName();
sGame = GAMESTATE:GetCurrentGame():GetName()
local Modes = {
dance = "Single,Double,Solo,Versus,Couple",
pump = "Single,Double,HalfDouble,Versus,Couple",
@@ -13,20 +15,20 @@ function GameCompatibleModes()
kb7 = "KB7",
para = "Single",
techno = "Single4,Single5,Single8,Double4,Double8",
lights = "Single", -- lights shouldn't be playable
};
return Modes[sGame];
lights = "Single" -- lights shouldn't be playable
}
return Modes[sGame]
end
function SelectProfileKeys()
local game = GAMESTATE:GetCurrentGame():GetName();
return game == "dance" and "Up,Down,Start,Back,Up2,Down2" or "Up,Down,Start,Back";
end;
local game = GAMESTATE:GetCurrentGame():GetName()
return game == "dance" and "Up,Down,Start,Back,Up2,Down2" or "Up,Down,Start,Back"
end
-- ScoreKeeperClass:
-- [en] Determines the correct ScoreKeeper class to use.
function ScoreKeeperClass()
sGame = GAMESTATE:GetCurrentGame():GetName();
sGame = GAMESTATE:GetCurrentGame():GetName()
local ScoreKeepers = {
-- xxx: allow for ScoreKeeperShared when needed
dance = "ScoreKeeperNormal",
@@ -38,149 +40,159 @@ function ScoreKeeperClass()
ez2 = "ScoreKeeperNormal",
ds3ddx = "ScoreKeeperNormal",
maniax = "ScoreKeeperNormal",
guitar = "ScoreKeeperGuitar",
};
guitar = "ScoreKeeperGuitar"
}
return ScoreKeepers[sGame]
end;
end
-- ComboContinue:
-- [en]
function ComboContinue()
sGame = GAMESTATE:GetCurrentGame():GetName();
sGame = GAMESTATE:GetCurrentGame():GetName()
local Continue = {
dance = GAMESTATE:GetPlayMode() == "PlayMode_Oni" and "TapNoteScore_W2" or "TapNoteScore_W3",
pump = "TapNoteScore_W4",
beat = "TapNoteScore_W3",
kb7 = "TapNoteScore_W3",
para = "TapNoteScore_W4",
};
para = "TapNoteScore_W4"
}
return Continue[sGame]
end;
end
function ComboMaintain()
sGame = GAMESTATE:GetCurrentGame():GetName();
sGame = GAMESTATE:GetCurrentGame():GetName()
local Maintain = {
dance = "TapNoteScore_W3",
pump = "TapNoteScore_W4",
beat = "TapNoteScore_W3",
kb7 = "TapNoteScore_W3",
para = "TapNoteScore_W4",
};
para = "TapNoteScore_W4"
}
return Maintain[sGame]
end;
end
function ComboPerRow()
sGame = GAMESTATE:GetCurrentGame():GetName();
sGame = GAMESTATE:GetCurrentGame():GetName()
if sGame == "pump" then
return true;
return true
elseif GAMESTATE:GetPlayMode() == "PlayMode_Oni" then
return true;
else return false;
end;
end;
return true
else
return false
end
end
-- these need cleanup really.
function HitCombo()
sGame = GAMESTATE:GetCurrentGame():GetName();
sGame = GAMESTATE:GetCurrentGame():GetName()
local Combo = {
dance = 2,
pump = 4,
beat = 2,
kb7 = 2,
para = 2,
guitar = 2,
};
guitar = 2
}
return Combo[sGame]
end;
end
function MissCombo()
sGame = GAMESTATE:GetCurrentGame():GetName();
sGame = GAMESTATE:GetCurrentGame():GetName()
local Combo = {
dance = 2,
pump = 4,
beat = 0,
kb7 = 0,
para = 0,
guitar = 0,
};
guitar = 0
}
return Combo[sGame]
end;
end
-- FailCombo:
-- [en] The combo that causes game failure.
function FailCombo()
sGame = GAMESTATE:GetCurrentGame():GetName();
sGame = GAMESTATE:GetCurrentGame():GetName()
local Combo = {
dance = -1, -- ITG uses 30
pump = 51, -- Pump Pro uses 30, real Pump uses 51
beat = -1,
kb7 = -1,
para = -1,
guitar = -1,
};
guitar = -1
}
return Combo[sGame]
end;
end
-- todo: use tables for some of these -aj
function HoldTiming()
if GAMESTATE:GetCurrentGame():GetName() == "pump" then
return 0;
else return PREFSMAN:GetPreference("TimingWindowSecondsHold");
end;
end;
return 0
else
return PREFSMAN:GetPreference("TimingWindowSecondsHold")
end
end
function ShowHoldJudgments()
return not GAMESTATE:GetCurrentGame():GetName() == "pump";
end;
return not GAMESTATE:GetCurrentGame():GetName() == "pump"
end
function HoldHeadStep()
if GAMESTATE:GetCurrentGame():GetName() == "pump" then
return false;
else return true;
end;
end;
return false
else
return true
end
end
function InitialHoldLife()
if GAMESTATE:GetCurrentGame():GetName() == "pump" then
return 0.05;
else return 1;
end;
end;
return 0.05
else
return 1
end
end
function MaxHoldLife()
if GAMESTATE:GetCurrentGame():GetName() == "pump" then
return 0.05;
else return 1;
end;
end;
return 0.05
else
return 1
end
end
function ImmediateHoldLetGo()
if GAMESTATE:GetCurrentGame():GetName() == "pump" then
return false;
else return true;
end;
end;
return false
else
return true
end
end
function RollBodyIncrementsCombo()
return false
--[[ if GAMESTATE:GetCurrentGame():GetName() == "pump" then
return false;
else return true;
end; --]]
end;
return false
else
return true
end --]]
end
function CheckpointsTapsSeparateJudgment()
if GAMESTATE:GetCurrentGame():GetName() == "pump" then
return false;
else return true;
end;
end;
return false
else
return true
end
end
function ScoreMissedHoldsAndRolls()
if GAMESTATE:GetCurrentGame():GetName() == "pump" then
return false;
else return true;
end;
end;
return false
else
return true
end
end
local tNotePositions = {
-- StepMania 3.9/4.0
@@ -192,13 +204,14 @@ local tNotePositions = {
Lower = {
-125,
145,
},
}
}
function GetTapPosition( sType )
bCategory = (sType == 'Standard') and 1 or 2;
bCategory = (sType == 'Standard') and 1 or 2
-- true: Normal
-- false: Lower
bPreference = GetUserPrefB("UserPrefNotePosition") and "Normal" or "Lower";
tNotePos = tNotePositions[bPreference];
bPreference = GetUserPrefB("UserPrefNotePosition") and "Normal" or "Lower"
tNotePos = tNotePositions[bPreference]
return tNotePos[bCategory]
end
+115 -110
View File
@@ -19,25 +19,30 @@ Saturation is different too.
-- ColorToHSV(c)
-- Takes in a normal color("") and returns a table with the HSV values.
function HasAlpha(c)
if c[4] then
return c[4]
else
return 1
end
end
function ColorToHSV(c)
local r = c[1];
local g = c[2];
local b = c[3];
local r = c[1]
local g = c[2]
local b = c[3]
-- alpha requires error checking sometimes.
local a;
if c[4] then a = c[4];
else a = 1;
end;
local a = HasAlpha(c)
local h = 0;
local s = 0;
local v = 0;
local h = 0
local s = 0
local v = 0
local min = math.min( r, g, b );
local max = math.max( r, g, b );
v = max;
local min = math.min( r, g, b )
local max = math.max( r, g, b )
v = max
local delta = max - min;
local delta = max - min
-- xxx: how do we deal with complete black?
if min == 0 and max == 0 then
@@ -47,137 +52,137 @@ function ColorToHSV(c)
Sat = 0,
Value = 0,
Alpha = a
};
end;
}
end
if max ~= 0 then
s = delta / max; -- rofl deltamax :|
s = delta / max -- rofl deltamax :|
else
-- r = g = b = 0; s = 0, v is undefined
s = 0;
h = -1;
s = 0
h = -1
return {
Hue = h,
Sat = s,
Value = v,
Alpha = 1
};
end;
}
end
if r == max then
h = ( g - b ) / delta; -- yellow/magenta
h = ( g - b ) / delta -- yellow/magenta
elseif g == max then
h = 2 + ( b - r ) / delta; -- cyan/yellow
h = 2 + ( b - r ) / delta -- cyan/yellow
else
h = 4 + ( r - g ) / delta; -- magenta/cyan
end;
h = 4 + ( r - g ) / delta -- magenta/cyan
end
h = h * 60; -- degrees
h = h * 60 -- degrees
if h < 0 then
h = h + 360;
end;
h = h + 360
end
return {
Hue = h,
Sat = s,
Value = v,
Alpha = a
};
end;
}
end
-- HSVToColor(hsv)
-- Converts a set of HSV values to a color. hsv is a table.
-- See also: HSV(h, s, v)
function HSVToColor(hsv)
local i;
local f, q, p, t;
local r, g, b;
local h, s, v;
local i
local f, q, p, t
local r, g, b
local h, s, v
local a;
local a
s = hsv.Sat;
v = hsv.Value;
s = hsv.Sat
v = hsv.Value
if hsv.Alpha then a = hsv.Alpha;
else a = 0;
end;
if hsv.Alpha then
a = hsv.Alpha
else
a = 0
end
if s == 0 then
return { v, v, v, a };
end;
return { v, v, v, a }
end
h = hsv.Hue / 60;
h = hsv.Hue / 60
i = math.floor(h);
f = h - i;
p = v * (1-s);
q = v * (1-s*f);
t = v * (1-s*(1-f));
i = math.floor(h)
f = h - i
p = v * (1-s)
q = v * (1-s*f)
t = v * (1-s*(1-f))
if i == 0 then
return { v, t, p, a };
return { v, t, p, a }
elseif i == 1 then
return { q, v, p, a };
return { q, v, p, a }
elseif i == 2 then
return { p, v, t, a };
return { p, v, t, a }
elseif i == 3 then
return { p, q, v, a };
return { p, q, v, a }
elseif i == 4 then
return { t, p, v, a };
return { t, p, v, a }
else
return { v, p, q, a };
end;
end;
return { v, p, q, a }
end
end
-- ColorToHex(c)
-- Takes in a normal color("") and returns the hex representation.
-- Adapted from code in LuaBit (http://luaforge.net/projects/bit/),
-- which is MIT licensed and copyright (C) 2006~2007 hanzhao.
function ColorToHex(c)
local r = c[1];
local g = c[2];
local b = c[3];
local a;
if c[4] then a = c[4];
else a = 1;
end;
local r = c[1]
local g = c[2]
local b = c[3]
local a = HasAlpha(c)
local function hex(value)
value = math.ceil(value);
value = math.ceil(value)
local hexVals = {'A', 'B', 'C', 'D', 'E', 'F'}
local out = "";
local last = 0;
local hexVals = { 'A', 'B', 'C', 'D', 'E', 'F' }
local out = ""
local last = 0
while(value ~= 0) do
last = math.mod(value, 16);
last = math.mod(value, 16)
if(last < 10) then
out = tostring(last) .. out;
out = tostring(last) .. out
else
out = hexVals[(last-10)+1] .. out;
end;
value = math.floor(value/16);
end;
out = hexVals[(last-10)+1] .. out
end
value = math.floor(value/16)
end
if(out == "") then
return "00";
return "00"
end
return string.format( "%02X", tonumber(out,16) );
end;
return string.format( "%02X", tonumber(out,16) )
end
local rX = hex( scale(r, 0, 1, 0, 255) );
local gX = hex( scale(g, 0, 1, 0, 255) );
local bX = hex( scale(b, 0, 1, 0, 255) );
local aX = hex( scale(a, 0, 1, 0, 255) );
local rX = hex( scale(r, 0, 1, 0, 255) )
local gX = hex( scale(g, 0, 1, 0, 255) )
local bX = hex( scale(b, 0, 1, 0, 255) )
local aX = hex( scale(a, 0, 1, 0, 255) )
return rX .. gX .. bX .. aX;
end;
return rX .. gX .. bX .. aX
end
function HSVToHex(hsv)
return ColorToHex( HSVToColor(hsv) );
end;
return ColorToHex( HSVToColor(hsv) )
end
--[[ you should mainly use these functions ]]
@@ -188,9 +193,9 @@ function HSV(h, s, v)
Sat = s,
Value = v,
Alpha = 1
};
return HSVToColor(t);
end;
}
return HSVToColor(t)
end
-- here's the proper one
function HSVA(h, s, v, a)
@@ -199,43 +204,43 @@ function HSVA(h, s, v, a)
Sat = s,
Value = v,
Alpha = a
};
return HSVToColor(t);
end;
}
return HSVToColor(t)
end
function Saturation(color,percent)
local c = ColorToHSV(color);
local c = ColorToHSV(color)
-- error checking
if percent < 0 then
percent = 0.0;
percent = 0.0
elseif percent > 1 then
percent = 1.0;
end;
c.Sat = percent;
return HSVToColor(c);
end;
percent = 1.0
end
c.Sat = percent
return HSVToColor(c)
end
function Brightness(color,percent)
local c = ColorToHSV(color);
local c = ColorToHSV(color)
-- error checking
if percent < 0 then
percent = 0.0;
percent = 0.0
elseif percent > 1 then
percent = 1.0;
end;
c.Value = percent;
return HSVToColor(c);
end;
percent = 1.0
end
c.Value = percent
return HSVToColor(c)
end
function Hue(color,newHue)
local c = ColorToHSV(color);
local c = ColorToHSV(color)
-- handle wrapping
if newHue < 0 then
newHue = 360 + newHue;
newHue = 360 + newHue
elseif newHue > 360 then
--newHue = math.mod(newHue, 360); -- ?? untested
newHue = newHue - 360;
end;
c.Hue = newHue;
return HSVToColor(c);
newHue = newHue - 360
end
c.Hue = newHue
return HSVToColor(c)
end;
@@ -12,7 +12,7 @@ Blend = {
Multiply = 'BlendMode_WeightedMultiply',
Invert = 'BlendMode_InvertDest',
NoEffect = 'BlendMode_NoEffect'
};
}
-- Health Declarations
-- Used primarily for lifebars.
@@ -21,37 +21,37 @@ Health = {
Alive = 'HealthState_Alive',
Danger = 'HealthState_Danger',
Dead = 'HealthState_Dead'
};
}
--[[ Actor commands ]]
function Actor:CenterX()
self:x(SCREEN_CENTER_X);
end;
self:x(SCREEN_CENTER_X)
end
function Actor:CenterY()
self:y(SCREEN_CENTER_Y);
end;
self:y(SCREEN_CENTER_Y)
end
-- xy(actorX,actorY)
-- Sets the x and y of an actor in one command.
function Actor:xy(actorX,actorY)
self:x(actorX);
self:y(actorY);
end;
self:x(actorX)
self:y(actorY)
end
-- MaskSource([clearzbuffer])
-- Sets an actor up as the source for a mask. Clears zBuffer by default.
function Actor:MaskSource(_)
self:clearzbuffer(_ or true);
self:zwrite(true);
self:blend('BlendMode_NoEffect');
end;
function Actor:MaskSource(noclear)
self:clearzbuffer(noclear or true)
self:zwrite(true)
self:blend('BlendMode_NoEffect')
end
-- MaskDest()
-- Sets an actor up to be masked by anything with MaskSource().
function Actor:MaskDest()
self:ztest(true);
end;
self:ztest(true)
end
-- Thump()
-- A customized version of pulse that is more appealing for on-beat
@@ -59,13 +59,13 @@ end;
function Actor:thump(fEffectPeriod)
self:pulse()
if fEffectPeriod ~= nil then
self:effecttiming(0,0,0.75*fEffectPeriod,0.25*fEffectPeriod);
self:effecttiming(0,0,0.75*fEffectPeriod,0.25*fEffectPeriod)
else
self:effecttiming(0,0,0.75,0.25);
self:effecttiming(0,0,0.75,0.25)
end
-- The default effectmagnitude will make this effect look very bad.
self:effectmagnitude(1,1.125,1);
end;
self:effectmagnitude(1,1.125,1)
end
--[[ BitmapText commands ]]
@@ -73,22 +73,23 @@ end;
-- An alias that turns off texture filtering.
-- Named because it works best with pixel fonts.
function BitmapText:PixelFont()
self:SetTextureFiltering(false);
end;
self:SetTextureFiltering(false)
end
-- Stroke(color)
-- Sets the text's stroke color.
function BitmapText:Stroke(c)
self:strokecolor( c );
end;
self:strokecolor( c )
end
-- NoStroke()
-- Removes any stroke.
function BitmapText:NoStroke()
self:strokecolor( color("0,0,0,0") );
end;
self:strokecolor( color("0,0,0,0") )
end
-- Set Text With Format (contributed by Daisuke Master)
-- this function is my hero - shake
function BitmapText:settextf(...)
self:settext(string.format(...))
end
@@ -96,8 +97,8 @@ end
-- DiffuseAndStroke(diffuse,stroke)
-- Set diffuse and stroke at the same time.
function BitmapText:DiffuseAndStroke(diffuseC,strokeC)
self:diffuse(diffuseC);
self:strokecolor(strokeC);
self:diffuse(diffuseC)
self:strokecolor(strokeC)
end;
--[[ end BitmapText commands ]]
@@ -106,20 +107,24 @@ end;
--[[ helper functions ]]
function tobool(v)
if type(v) == "string" then
local cmp = string.lower(v);
local cmp = string.lower(v)
if cmp == "true" or cmp == "t" then
return true;
return true
elseif cmp == "false" or cmp == "f" then
return false;
end;
return false
end
elseif type(v) == "number" then
if v == 0 then return false;
else return true;
end;
end;
end;
if v == 0 then
return false
else
return true
end
end
end
function pname(pn) return ToEnumShortString(pn); end;
function pname(pn)
return ToEnumShortString(pn)
end
-- from http://ardoris.wordpress.com/2008/11/07/rounding-to-a-certain-number-of-decimal-places-in-lua/
function round(what, precision)
@@ -31,62 +31,62 @@ ThemeInfo is documented at http://kki.ajworld.net/wiki/ThemeInfo.lua
After that's set up, read the docs.
]]
local PrefPath = "Data/UserPrefs/".. THEME:GetThemeDisplayName() .."/";
local PrefPath = "Data/UserPrefs/".. THEME:GetThemeDisplayName() .."/"
--[[ begin internal stuff; no need to edit below this line. ]]
-- Local internal function to write envs. ___Not for themer use.___
local function WriteEnv(envName,envValue)
return setenv(envName,envValue);
end;
return setenv(envName,envValue)
end
function ReadPrefFromFile(name)
local f = RageFileUtil.CreateRageFile();
local fullFilename = PrefPath..name..".cfg";
local option;
local f = RageFileUtil.CreateRageFile()
local fullFilename = PrefPath..name..".cfg"
local option
if f:Open(fullFilename,1) then
option = tostring( f:Read() );
WriteEnv(name,option);
f:destroy();
return option;
option = tostring( f:Read() )
WriteEnv(name,option)
f:destroy()
return option
else
local fError = f:GetError();
Trace( "[FileUtils] Error reading ".. fullFilename ..": ".. fError );
f:ClearError();
f:destroy();
return nil;
end;
end;
local fError = f:GetError()
Trace( "[FileUtils] Error reading ".. fullFilename ..": ".. fError )
f:ClearError()
f:destroy()
return nil
end
end
function WritePrefToFile(name,value)
local f = RageFileUtil.CreateRageFile();
local fullFilename = PrefPath..name..".cfg";
local f = RageFileUtil.CreateRageFile()
local fullFilename = PrefPath..name..".cfg"
if f:Open(fullFilename, 2) then
f:Write( tostring(value) );
WriteEnv(name,value);
f:Write( tostring(value) )
WriteEnv(name,value)
else
local fError = f:GetError();
Trace( "[FileUtils] Error writing to ".. fullFilename ..": ".. fError );
f:ClearError();
f:destroy();
return false;
end;
local fError = f:GetError()
Trace( "[FileUtils] Error writing to ".. fullFilename ..": ".. fError )
f:ClearError()
f:destroy()
return false
end
f:destroy();
return true;
end;
f:destroy()
return true
end
--[[ end internal functions; still don't edit below this line ]]
function GetUserPref(name)
return ReadPrefFromFile(name);
end;
return ReadPrefFromFile(name)
end
function SetUserPref(name,value)
return WritePrefToFile(name,value);
end;
return WritePrefToFile(name,value)
end
--[[ type specific, for when you want to be lazy ]]
-- XXX: make set funcs, since I hate dealing with colors and I know
@@ -95,41 +95,40 @@ end;
-- GetUserPrefB: boolean
function GetUserPrefB(name)
-- this one is a bit trickier.
local pref = ReadPrefFromFile(name);
local pref = ReadPrefFromFile(name)
if type(pref) == "string" then
pref = string.lower(pref);
pref = string.lower(pref)
if pref == "true" or cmp == "t" then
return true;
return true
elseif pref == "false" or cmp == "f" then
return false;
return false
else
Trace("Error in GetUserPrefB(".. name ..") converting from string" );
return false;
end;
Trace("Error in GetUserPrefB(".. name ..") converting from string" )
return false
end
elseif type(pref) == "number" then
-- both 0 and -1 are false; if you want to change this,
-- feel free to remove "or pref == -1".
if pref == 0 or pref == -1 then
return false;
else
return true;
end;
end;
end;
return true
end
end
end
-- GetUserPrefC: color
function GetUserPrefC(name)
-- XXX: make sure it's grabbing a string that can be turned into a color
-- and also possibly handle HSV values too.
return color( ReadPrefFromFile(name) );
end;
return color( ReadPrefFromFile(name) )
end
-- GetUserPrefN: numbers (integers, floats)
function GetUserPrefN(name)
return tonumber( ReadPrefFromFile(name) );
end;
return tonumber( ReadPrefFromFile(name) )
end
--[[
Copyright © 2008-2009 AJ Kelly/KKI Labs
+5 -5
View File
@@ -7,8 +7,8 @@ File = {
f:destroy()
return true
else
Trace( "[FileUtils] Error writing to ".. path ..": ".. f:GetError() );
f:ClearError();
Trace( "[FileUtils] Error writing to ".. path ..": ".. f:GetError() )
f:ClearError()
f:destroy()
return false
end
@@ -21,12 +21,12 @@ File = {
f:destroy()
return ret
else
Trace( "[FileUtils] Error reading from ".. path ..": ".. f:GetError() );
f:ClearError();
Trace( "[FileUtils] Error reading from ".. path ..": ".. f:GetError() )
f:ClearError()
f:destroy()
return nil
end
end
};
}
-- this code if public domain and/or has no copyright, depending on your
-- country's laws. I wish for you to use this code freely, without restriction.
@@ -9,16 +9,18 @@ AspectRatios = {
FourThree = 1.33333, --* 640x480
SixteenTen = 1.6, --* 720x480
SixteenNine = 1.77778, --* 853x480
EightThree = 2.66666, -- 1280x480
};
EightThree = 2.66666 -- 1280x480
}
function IsUsingWideScreen()
return GetScreenAspectRatio() >= 1.6;
end;
return GetScreenAspectRatio() >= 1.6
end
-- take and use it as you like, I don't care -aj
-- (although I should mention this file was specific to moonlight and was pretty
-- bad before some editing. -aj)
-- this one is good though:
function WideScale(AR4_3, AR16_9) return scale( SCREEN_WIDTH, 640, 854, AR4_3, AR16_9 ); end
function WideScale(AR4_3, AR16_9)
return scale( SCREEN_WIDTH, 640, 854, AR4_3, AR16_9 )
end