Kit Themes!
@@ -8,7 +8,7 @@ TapNoteAnimationLength=4
|
||||
TapAdditionAnimationLength=4
|
||||
TapMineAnimationLength=1
|
||||
TapLiftAnimationLength=4
|
||||
HoldHeadAnimationLength=4 // doesn't matter. Only 1 frame anyway.
|
||||
HoldHeadAnimationLength=1 // doesn't matter. Only 1 frame anyway.
|
||||
HoldTopCapAnimationLength=4 // doesn't matter. Only 1 frame anyway.
|
||||
HoldBottomCapAnimationLength=4 // doesn't matter. Only 1 frame anyway.
|
||||
HoldBodyAnimationLength=4 // doesn't matter. Only 1 frame anyway.
|
||||
@@ -35,7 +35,7 @@ TapFakeNoteColorTextureCoordSpacingX=0
|
||||
TapFakeNoteColorTextureCoordSpacingY=0.125
|
||||
|
||||
HoldHeadNoteColorTextureCoordSpacingX=0
|
||||
HoldHeadNoteColorTextureCoordSpacingY=0.125
|
||||
HoldHeadNoteColorTextureCoordSpacingY=0
|
||||
|
||||
[GhostArrowDim]
|
||||
NoneCommand=
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
return Def.Actor { OnCommand=cmd(sleep,0.3); }
|
||||
@@ -0,0 +1 @@
|
||||
return Def.Actor { OnCommand=cmd(sleep,0.3); }
|
||||
@@ -0,0 +1,384 @@
|
||||
local PlayerIndexes = { PlayerNumber_P1 = 1, PlayerNumber_P2 = 1 }
|
||||
-- Reads mods from a file
|
||||
-- keywords: Speed, Noteskins, None, Clear
|
||||
local function ReadMods()
|
||||
local file = THEME:GetCurrentThemeDirectory() .. "mods.txt"
|
||||
local mods = File.Read( file )
|
||||
if not mods
|
||||
or mods == ""
|
||||
then
|
||||
local buff = ";Set mods here, one per line or various in one separated with commas\r\n;Keywords: 'Speed', 'Noteskins', 'None', 'Clear'\r\nSpeeds\r\nNoteskins"
|
||||
File.Write(file,buff)
|
||||
return {
|
||||
ReadSpeedMods();
|
||||
NOTESKIN:GetNoteSkinNames();
|
||||
"Clear";
|
||||
}
|
||||
end
|
||||
|
||||
mods = string.gsub(mods,"\r","")
|
||||
mods = split("\n",mods)
|
||||
|
||||
local ret = {}
|
||||
local clear = false
|
||||
|
||||
for k,v in ipairs(mods) do
|
||||
if string.sub(v,1,1) == ";"
|
||||
or v == ""
|
||||
then
|
||||
--skip
|
||||
elseif v == "Speeds" then
|
||||
table.insert(ret, ReadSpeedMods())
|
||||
elseif v == "Noteskins" then
|
||||
table.insert(ret, NOTESKIN:GetNoteSkinNames())
|
||||
else
|
||||
local ModToAdd = string.gsub(v,"%s","")
|
||||
if string.find(ModToAdd, ",") ~= nil then
|
||||
ModToAdd = split(",", ModToAdd)
|
||||
if ModToAdd[1] ~= "None" then
|
||||
table.insert(ModToAdd,1,"None")
|
||||
end
|
||||
table.insert(ret,ModToAdd)
|
||||
else
|
||||
if ModToAdd == "Clear" then
|
||||
if not clear then table.insert(ret,ModToAdd) end
|
||||
clear = true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
-- This will happen...
|
||||
if not clear then table.insert(ret,"Clear") end
|
||||
|
||||
return ret
|
||||
end
|
||||
|
||||
local modslist = ReadMods()
|
||||
|
||||
-- Displays the mods with actorscrollers
|
||||
local function OptionsListDisplay(player)
|
||||
local function GetPlayerMods()
|
||||
local playerstate = GAMESTATE:GetPlayerState(player)
|
||||
local playermods = playerstate:GetPlayerOptionsArray('ModsLevel_Preferred')
|
||||
return playermods
|
||||
end
|
||||
|
||||
local make = {}
|
||||
-- iterate modslist entries
|
||||
for k,v in ipairs(modslist) do
|
||||
-- not kinopio
|
||||
local RowToAdd
|
||||
if type(v) == "table" then
|
||||
-- it's a table, make it a scroller
|
||||
local choices = {}
|
||||
-- build the choices
|
||||
for i,j in ipairs(v) do
|
||||
choices[i] = LoadFont()..{ Text=j };
|
||||
end
|
||||
RowToAdd = Def.ActorScroller {
|
||||
NumItemsToDraw=3;
|
||||
SecondsPerItem=0.075;
|
||||
-- init indexes here
|
||||
-- I like how InitCommand is not allowed to be played or queued
|
||||
-- (HURR TOO MUCH COMMANDS ARG!)
|
||||
SetChoicesCommand=function(self)
|
||||
local found = false
|
||||
--SCREENMAN:SystemMessage(join(",", defmods))
|
||||
for idx,Mod in ipairs(GetPlayerMods()) do
|
||||
-- In before I forgot what's this: those are the nod entries
|
||||
for jdx,Nod in ipairs(v) do
|
||||
if Mod == Nod then
|
||||
found = true
|
||||
self:SetCurrentAndDestinationItem(jdx-1);
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
-- oops, no defaults, set them
|
||||
if not found then
|
||||
for idx,Mod in ipairs(v) do
|
||||
if Mod == "1x"
|
||||
or Mod == "default"
|
||||
or Mod == "None"
|
||||
then
|
||||
self:SetCurrentAndDestinationItem(idx-1);
|
||||
break
|
||||
else
|
||||
self:SetCurrentAndDestinationItem(0);
|
||||
end
|
||||
end
|
||||
end
|
||||
end;
|
||||
CleanModsMessageCommand=function(self,params)
|
||||
if player ~= params.PlayerNumber then return end
|
||||
self:playcommand("SetChoices");
|
||||
end;
|
||||
InitCommand=function(self)
|
||||
self:SetLoop(true);
|
||||
self:playcommand("SetChoices");
|
||||
end;
|
||||
TransformFunction=function(self, offset, itemIndex, numItems)
|
||||
self:x(offset * 100);
|
||||
local focus = math.abs(offset)
|
||||
focus = scale(focus,0,1,1,0.75)
|
||||
|
||||
self:zoom(focus)
|
||||
end;
|
||||
ChoiceSwapMessageCommand=function(self,params)
|
||||
if params.PlayerNumber ~= player then return end
|
||||
if params.Row ~= k then return end
|
||||
|
||||
local index = params.Index
|
||||
--SCREENMAN:SystemMessage(ToEnumShortString(player).." row mods index: "..index);
|
||||
if params.bHasLooped then
|
||||
self:SetCurrentAndDestinationItem(-1)
|
||||
end
|
||||
|
||||
self:SetDestinationItem(index-1)
|
||||
end;
|
||||
-- actors are wrapped here:
|
||||
children = choices;
|
||||
};
|
||||
elseif type(v) == "string" then
|
||||
-- it's not, make single switchable choice
|
||||
RowToAdd = Def.ActorFrame {
|
||||
LoadFont()..{
|
||||
Text=v;
|
||||
-- init highlights here
|
||||
SetChoicesCommand=function(self)
|
||||
local cc = color("#000000")
|
||||
for idx,Mod in ipairs(GetPlayerMods()) do
|
||||
if Mod == v then
|
||||
cc = color("#ffffff")
|
||||
break
|
||||
end
|
||||
end
|
||||
if v == "Clear" then
|
||||
cc = color("#0000ff")
|
||||
end
|
||||
self:diffuse(cc);
|
||||
end;
|
||||
InitCommand=function(self)
|
||||
self:playcommand("SetChoices");
|
||||
end;
|
||||
-- Following commands you'll understand (I've heard that somewhere...)
|
||||
CleanModsMessageCommand=function(self,params)
|
||||
--if v == "Clear" then return end
|
||||
if player ~= params.PlayerNumber then return end
|
||||
self:playcommand("SetChoices");
|
||||
--self:diffuse(color("#000000"));
|
||||
end;
|
||||
-- cmd(diffuse,color("#000000"));
|
||||
ChoiceToggleMessageCommand=function(self,params)
|
||||
if params.PlayerNumber ~= player then return end
|
||||
if params.Row ~= k then return end
|
||||
|
||||
local cc = color("#ffffff")
|
||||
if not params.Activated then
|
||||
cc = color("#000000")
|
||||
end
|
||||
|
||||
--self:visible(params.Activated)
|
||||
-- why the fuck is not coloring itself? oh I think I got it... duh!
|
||||
self:diffuse(cc)
|
||||
end;
|
||||
}
|
||||
}
|
||||
else
|
||||
--table.remove(modslist,k)
|
||||
--Def.Actor { };
|
||||
end
|
||||
make[k] = RowToAdd
|
||||
end
|
||||
|
||||
return Def.ActorFrame {
|
||||
Draw.RoundBox(300,320,50,50,color("1,0,1,0.5"));
|
||||
Draw.RoundBox(300,50,25,25,color("1,0,0,0.5"));
|
||||
Def.ActorScroller {
|
||||
Name="OptionsListScroller";
|
||||
NumItemsToDraw=5;
|
||||
SecondsPerItem=0.075;
|
||||
InitCommand=function(self)
|
||||
self:SetLoop(true);
|
||||
end;
|
||||
TransformFunction=function(self, offset, itemIndex, numItems)
|
||||
self:y(offset * 50);
|
||||
end;
|
||||
children = make;
|
||||
};
|
||||
}
|
||||
end
|
||||
|
||||
-- Internals
|
||||
return Def.ActorFrame {
|
||||
OptionsListDisplay(PLAYER_1)..{
|
||||
Name="OptionsListDisplay"..PLAYER_1;
|
||||
Condition=GAMESTATE:IsHumanPlayer(PLAYER_1);
|
||||
InitCommand=function(self)
|
||||
if #GAMESTATE:GetHumanPlayers() == 1
|
||||
and PREFSMAN:GetPreference("Center1Player")
|
||||
then
|
||||
self:CenterX()
|
||||
else
|
||||
self:FromLeft(160)
|
||||
end
|
||||
self:CenterY();
|
||||
end;
|
||||
};
|
||||
OptionsListDisplay(PLAYER_2)..{
|
||||
Name="OptionsListDisplay"..PLAYER_2;
|
||||
Condition=GAMESTATE:IsHumanPlayer(PLAYER_2);
|
||||
InitCommand=function(self)
|
||||
if #GAMESTATE:GetHumanPlayers() == 1
|
||||
and PREFSMAN:GetPreference("Center1Player")
|
||||
then
|
||||
self:CenterX()
|
||||
else
|
||||
self:FromRight(-160)
|
||||
end
|
||||
self:CenterY();
|
||||
end;
|
||||
};
|
||||
-- Everything here and beyond is pure magic
|
||||
CodeMessageCommand=function(self,params)
|
||||
-- I'm reusing code from CustomCodeDetector
|
||||
local code = params.Name
|
||||
local player = params.PlayerNumber
|
||||
local movement = "none"
|
||||
local modscleared = false
|
||||
|
||||
if not GAMESTATE:IsHumanPlayer(player) then return end;
|
||||
|
||||
if code == "Back" then
|
||||
--SCREENMAN:SystemMessage(ToEnumShortString(player).." closed the oplist")
|
||||
SCREENMAN:GetTopScreen():Cancel();
|
||||
elseif code == "Prev" then
|
||||
PlayerIndexes[player] = PlayerIndexes[player]-1
|
||||
if PlayerIndexes[player] < 1 then
|
||||
PlayerIndexes[player] = #modslist
|
||||
movement = "first"
|
||||
end
|
||||
--SCREENMAN:SystemMessage(ToEnumShortString(player).." index: "..PlayerIndexes[player]);
|
||||
elseif code == "Next" then
|
||||
PlayerIndexes[player] = PlayerIndexes[player]+1
|
||||
if PlayerIndexes[player] > #modslist then
|
||||
PlayerIndexes[player] = 1
|
||||
movement = "last"
|
||||
end
|
||||
--SCREENMAN:SystemMessage(ToEnumShortString(player).." index: "..PlayerIndexes[player]);
|
||||
elseif code == "Toggle" then
|
||||
-- changes will be done here
|
||||
-- get playerstate and playermods
|
||||
local playerstate = GAMESTATE:GetPlayerState(player)
|
||||
local playermods = playerstate:GetPlayerOptionsArray('ModsLevel_Preferred')
|
||||
|
||||
-- let's check in what index we are
|
||||
local ModToAdd = modslist[PlayerIndexes[player]]
|
||||
--the mod is a table, scroll those
|
||||
if type(ModToAdd) == "table" then
|
||||
-- iteration, once again, like in the custom code detector I made :x
|
||||
local index = 1
|
||||
local found = false
|
||||
local looped = false
|
||||
for i,j in ipairs(playermods) do
|
||||
for k,l in ipairs(ModToAdd) do
|
||||
if j == l then
|
||||
found = true
|
||||
index = k+1
|
||||
if index > #ModToAdd then
|
||||
index = 1
|
||||
looped = true
|
||||
end
|
||||
--replace
|
||||
playermods[i] = ModToAdd[index]
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
-- looks like nothing was found, we can assume those are the default mods
|
||||
-- (1x and default noteskin) they are not listed for some reason...
|
||||
if not found then
|
||||
-- set the first on the list (nono, better list 1x and default)
|
||||
for k,v in ipairs(ModToAdd) do
|
||||
if v == "1x"
|
||||
or v == "default"
|
||||
then
|
||||
index = k+1
|
||||
if index > #ModToAdd then
|
||||
index = 1
|
||||
looped = true
|
||||
end
|
||||
table.insert(playermods, ModToAdd[index])
|
||||
break
|
||||
elseif v == "None" then
|
||||
table.insert(playermods, ModToAdd[2])
|
||||
index = 2
|
||||
end
|
||||
end
|
||||
end
|
||||
-- send message broadcasts to be able to move things on the oplist displays
|
||||
MESSAGEMAN:Broadcast("ChoiceSwap",{ Row = PlayerIndexes[player]; Index = index; PlayerNumber = player; bHasLooped = looped })
|
||||
elseif ModToAdd == "Clear" then
|
||||
local defaultmods = PREFSMAN:GetPreference("DefaultModifiers")
|
||||
playermods = split(",", defaultmods)
|
||||
modscleared = true
|
||||
--MESSAGEMAN:Broadcast("CleanMods",{ PlayerNumber = player });
|
||||
else
|
||||
-- if type(ModToAdd) == "string" then end
|
||||
-- we know it's a string...
|
||||
local found = false
|
||||
for i,j in ipairs(playermods) do
|
||||
if j == ModToAdd then
|
||||
-- remove it
|
||||
found = true
|
||||
table.remove(playermods, i)
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if not found then
|
||||
table.insert(playermods, ModToAdd)
|
||||
end
|
||||
MESSAGEMAN:Broadcast("ChoiceToggle",{ Row = PlayerIndexes[player]; Activated = not found; PlayerNumber = player })
|
||||
end
|
||||
-- let's check if noteskins aren't missing (we're avoiding crashes here...)
|
||||
local found = false
|
||||
-- iterate again uh
|
||||
for i,j in ipairs(playermods) do
|
||||
-- yes because noteskins are stored in the second slot...
|
||||
for k,l in ipairs(modslist[2]) do
|
||||
if j == l then
|
||||
found = true
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
-- apparently there aren't any noteskins...
|
||||
if not found then
|
||||
table.insert(playermods, "default")
|
||||
end
|
||||
|
||||
-- everything is ready to be set
|
||||
playermods = join(", ",playermods)
|
||||
playerstate:SetPlayerOptions('ModsLevel_Preferred',playermods)
|
||||
-- and thats pretty much it :D
|
||||
end
|
||||
|
||||
if modscleared then
|
||||
MESSAGEMAN:Broadcast("CleanMods",{ PlayerNumber = player });
|
||||
end
|
||||
|
||||
--this moves the scroller...
|
||||
local scroller = self:GetChild("OptionsListDisplay"..player):GetChild("OptionsListScroller")
|
||||
if movement ~= "none" then
|
||||
local tomove
|
||||
if movement == "first" then
|
||||
tomove = PlayerIndexes[player]
|
||||
elseif movement == "last" then
|
||||
tomove = PlayerIndexes[player]-2
|
||||
end
|
||||
scroller:SetCurrentAndDestinationItem(tomove);
|
||||
end
|
||||
scroller:SetDestinationItem(PlayerIndexes[player]-1);
|
||||
end;
|
||||
};
|
||||
@@ -0,0 +1,118 @@
|
||||
local function Labels()
|
||||
local captions = {
|
||||
"Perfect",
|
||||
"Great",
|
||||
"Good",
|
||||
"Bad",
|
||||
"Miss",
|
||||
"Combo",
|
||||
"Score",
|
||||
};
|
||||
|
||||
local t = Def.ActorFrame {}
|
||||
|
||||
for idx,k in ipairs(captions) do
|
||||
local _ = idx-1
|
||||
t[#t+1] = LoadFont("_arial black 20px")..{
|
||||
Text=k;
|
||||
InitCommand=cmd(y,_*40;diffuse,color("#000000");Stroke,color("#ffffff"));
|
||||
};
|
||||
end
|
||||
|
||||
return t
|
||||
end
|
||||
|
||||
local function Scores(player)
|
||||
if not player or not GAMESTATE:IsPlayerEnabled(player) then return Def.Actor {} end
|
||||
|
||||
local curstats = STATSMAN:GetCurStageStats():GetPlayerStageStats(player)
|
||||
|
||||
local timmings = {
|
||||
{
|
||||
curstats:GetTapNoteScores('TapNoteScore_CheckpointHit'),
|
||||
curstats:GetTapNoteScores('TapNoteScore_W1'),
|
||||
curstats:GetTapNoteScores('TapNoteScore_W2'),
|
||||
},
|
||||
{
|
||||
curstats:GetTapNoteScores('TapNoteScore_W3')
|
||||
},
|
||||
{
|
||||
curstats:GetTapNoteScores('TapNoteScore_W4')
|
||||
},
|
||||
{
|
||||
curstats:GetTapNoteScores('TapNoteScore_W5')
|
||||
},
|
||||
{
|
||||
curstats:GetTapNoteScores('TapNoteScore_CheckpointMiss'),
|
||||
curstats:GetTapNoteScores('TapNoteScore_Miss'),
|
||||
},
|
||||
{
|
||||
curstats:MaxCombo()
|
||||
},
|
||||
{
|
||||
curstats:GetScore()
|
||||
}
|
||||
}
|
||||
|
||||
local t = Def.ActorFrame {}
|
||||
|
||||
for idx,k in ipairs(timmings) do
|
||||
local _ = idx-1
|
||||
local curstats = STATSMAN:GetCurStageStats():GetPlayerStageStats(player)
|
||||
local number = 0
|
||||
|
||||
for i,v in ipairs(k) do
|
||||
number = number + v-- curstats:GetTapNoteScores(v);
|
||||
end
|
||||
|
||||
t[#t+1] = LoadFont("_arial black 20px")..{
|
||||
Text=string.format("%03d", number); --curstats:GetTapNoteScores(k)
|
||||
InitCommand=cmd(y,_*40;diffuse,color("#000000");Stroke,color("#ffffff"));
|
||||
};
|
||||
end
|
||||
|
||||
return t
|
||||
end
|
||||
|
||||
local function Grade(player)
|
||||
if not player or not GAMESTATE:IsPlayerEnabled(player) then return Def.Actor {} end
|
||||
|
||||
local captions = {
|
||||
Grade_Tier01 = "S";
|
||||
Grade_Tier02 = "S";
|
||||
Grade_Tier03 = "A";
|
||||
Grade_Tier04 = "B";
|
||||
Grade_Tier05 = "C";
|
||||
Grade_Tier06 = "D";
|
||||
Grade_Tier07 = "F";
|
||||
Grade_Failed = "S";
|
||||
}
|
||||
local grade = STATSMAN:GetCurStageStats():GetPlayerStageStats(player):GetGrade()
|
||||
|
||||
return LoadFont("_impact 50px")..{
|
||||
Text=captions[grade];
|
||||
--OnCommand=cmd(zoom,2;diffuse,color("#000000");Stroke,color("#ffffff");diffusealpha,0;sleep,1;linear,1;zoom,1;diffuse,color("#000000");Stroke,color("#ffffff");;diffusealpha,1);
|
||||
}
|
||||
end
|
||||
|
||||
return Def.ActorFrame {
|
||||
LoadFont("_impact 50px")..{
|
||||
Text="Evaluation";
|
||||
InitCommand=cmd(CenterX;y,50;diffuse,color("#000000");Stroke,color("#ffffff"));
|
||||
};
|
||||
Labels()..{
|
||||
InitCommand=cmd(CenterX;FromTop,130);
|
||||
};
|
||||
Scores(PLAYER_1)..{
|
||||
InitCommand=cmd(FromCenterX,-160;FromTop,130);
|
||||
};
|
||||
Scores(PLAYER_2)..{
|
||||
InitCommand=cmd(FromCenterX,160;FromTop,130);
|
||||
};
|
||||
Grade(PLAYER_1)..{
|
||||
InitCommand=cmd(FromLeft,50;FromTop,240);
|
||||
};
|
||||
Grade(PLAYER_2)..{
|
||||
InitCommand=cmd(FromRight,-50;FromTop,240);
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
return Def.ActorFrame {
|
||||
LoadFont("_impact 50px")..{
|
||||
Text="THE GAME IS OVER";
|
||||
InitCommand=cmd(Center;diffuse,color("#000000");Stroke,color("#ffffff"));
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
return Def.Actor { OnCommand=cmd(sleep,1); }
|
||||
@@ -0,0 +1,30 @@
|
||||
--a simple life display...
|
||||
local function LifeDisplay(pn)
|
||||
local function update(self)
|
||||
--local this = self:GetChildren()
|
||||
local lifemeter = SCREENMAN:GetTopScreen():GetLifeMeter(pn)
|
||||
--ºvº
|
||||
local life = lifemeter:GetLife()
|
||||
life = clamp(life,0,1)
|
||||
|
||||
self:GetChild("LifeText"):settextf("Life: %.2f%%", life*100)
|
||||
end
|
||||
|
||||
return Def.ActorFrame {
|
||||
InitCommand=cmd(player,pn;SetUpdateFunction,update);
|
||||
|
||||
LoadFont("_arial black 20px")..{
|
||||
--Text="100%";
|
||||
Name="LifeText";
|
||||
};
|
||||
};
|
||||
end
|
||||
|
||||
return Def.ActorFrame {
|
||||
LoadFont("_impact 50px")..{
|
||||
InitCommand=cmd(CenterX;FromTop,30);
|
||||
Text=string.format("%02i", STATSMAN:GetStagesPlayed()+1);
|
||||
};
|
||||
LifeDisplay(PLAYER_1)..{ InitCommand=cmd(FromCenterX,-160;FromTop,20); };
|
||||
LifeDisplay(PLAYER_2)..{ InitCommand=cmd(FromCenterX,160;FromTop,20); };
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
-- CH32 asked me if this was possible, and as you can see, it is!!
|
||||
local function GetSpeedChanges()
|
||||
local smfile = GAMESTATE:GetCurrentSong():GetSongFilePath()
|
||||
local file = File.Read( smfile )
|
||||
if not file then return end
|
||||
-- search the tag
|
||||
local find = string.find(file , "#SPEED:")
|
||||
if not find then return end
|
||||
-- search the next semicolon
|
||||
local last = string.find(file , ";" , find)
|
||||
local found = string.sub(file,find,last)
|
||||
-- cleans
|
||||
found = string.gsub(found, "\r", "")
|
||||
found = string.gsub(found, "\n", "")
|
||||
found = string.gsub(found, "#SPEED:", "")
|
||||
found = string.gsub(found, ";", "")
|
||||
-- make it a table
|
||||
found = split(",", found)
|
||||
-- return it
|
||||
return found
|
||||
end
|
||||
|
||||
local speeds = GetSpeedChanges()
|
||||
|
||||
-- what are those things made of?
|
||||
local function update(self)
|
||||
if speeds ~= nil then
|
||||
for idx,Spd in ipairs(speeds) do
|
||||
local part = split("=", Spd)
|
||||
local ebeat = tonumber(part[1]) --WHERE
|
||||
assert(ebeat)
|
||||
local songbeat = GAMESTATE:GetSongBeat()
|
||||
|
||||
if songbeat >= ebeat
|
||||
-- 1/20 beat
|
||||
and songbeat <= ebeat + (1/20)
|
||||
--and not GAMESTATE:GetSongFreeze()
|
||||
--and not GAMESTATE:GetSongDelay()
|
||||
then
|
||||
local bps = 60 / GAMESTATE:GetCurrentSong():GetTimingData():GetBPMAtBeat( ebeat )
|
||||
--local bps = GAMESTATE:GetSongBPS()
|
||||
local value = tonumber(part[2]) --SPEED
|
||||
local approach = part[3] --APPLY TIME
|
||||
-- Odd, it needs to be a string to be evaluated o_o;
|
||||
if not approach then approach = tostring(4*bps) end
|
||||
|
||||
if string.sub(approach,approach:len()) == "s" then
|
||||
approach = string.sub(approach,1,approach:len()-1)
|
||||
approach = tonumber(approach)
|
||||
approach = 1/approach
|
||||
else
|
||||
approach = 1/(approach*bps)
|
||||
end
|
||||
|
||||
local pastspeed = 1
|
||||
if idx > 1 then
|
||||
pastspeed = split("=", speeds[idx-1])
|
||||
pastspeed = tonumber(pastspeed[2])
|
||||
end
|
||||
|
||||
approach = approach * math.abs(value-pastspeed)
|
||||
|
||||
approach = approach + 0.05
|
||||
|
||||
--if value ~= 0 then
|
||||
--approach = value/approach
|
||||
--approach = scale(value,0,approach,0,1)
|
||||
--end
|
||||
|
||||
MESSAGEMAN:Broadcast("SpeedModLaunched",{ Value = value ; Approach = approach });
|
||||
--SCREENMAN:SystemMessage("APP: " .. approach .. " SPD: " .. value);
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return Def.ActorFrame {
|
||||
InitCommand=cmd(SetUpdateFunction,update);
|
||||
SpeedModLaunchedMessageCommand=function(self,params)
|
||||
local approach = params.Approach
|
||||
local value = params.Value
|
||||
|
||||
local playerstate = GAMESTATE:GetPlayerState(PLAYER_1)
|
||||
local playermods = playerstate:GetPlayerOptionsArray('ModsLevel_Preferred')
|
||||
|
||||
local found = false
|
||||
for idx,Mod in ipairs(playermods) do
|
||||
if string.find(Mod,"%dx") ~= nil
|
||||
--or string.find(Mod,"%d.%dx") ~= nil
|
||||
then
|
||||
found = true
|
||||
local xmod = playermods[idx]
|
||||
xmod = string.gsub(xmod,"x","")
|
||||
xmod = tonumber(xmod)
|
||||
xmod = xmod * value
|
||||
--duh, floats
|
||||
xmod = string.format("*%.2f %.2fx",approach,xmod)
|
||||
playermods[idx] = xmod
|
||||
--SCREENMAN:SystemMessage(xmod)
|
||||
end
|
||||
end
|
||||
if not found then
|
||||
local xmod = string.format("*%.2f %.2fx",approach,value)
|
||||
table.insert( playermods, xmod)
|
||||
end
|
||||
|
||||
playermods = join(",",playermods)
|
||||
playerstate:SetPlayerOptions('ModsLevel_Song', playermods)
|
||||
--self:GetChild("_debug"):settext(playermods)
|
||||
--SCREENMAN:SystemMessage(playerstate:GetPlayerOptions('ModsLevel_Preferred'));
|
||||
--SCREENMAN:SystemMessage(value)
|
||||
end;
|
||||
--LoadFont()..{ Name="_debug"; InitCommand=cmd(x,50;CenterY;rotationz,90); };
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
return Def.ActorFrame {
|
||||
LoadFont("_impact 50px")..{
|
||||
Text="Try next stage";
|
||||
InitCommand=cmd(Center;diffuse,color("#000000");Stroke,color("#ffffff"));
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
return Def.ActorFrame {
|
||||
BeginCommand=function(self)
|
||||
self:visible(false);
|
||||
if SCREENMAN:GetTopScreen():HaveProfileToLoad() then
|
||||
self:visible(true);
|
||||
self:sleep(1);
|
||||
end;
|
||||
self:queuecommand("Load");
|
||||
end;
|
||||
LoadCommand=function(self)
|
||||
SCREENMAN:GetTopScreen():Continue();
|
||||
end;
|
||||
--
|
||||
Draw.Box(SCREEN_WIDTH,50)..{
|
||||
InitCommand=cmd(Center);
|
||||
};
|
||||
LoadFont("_arial black 20px")..{
|
||||
Text="Loading Profiles...";
|
||||
InitCommand=cmd(Center;skewx,-0.1;diffuse,color("#000000");Stroke,color("#ffffff"));
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
return Def.ActorFrame {
|
||||
BeginCommand=function(self)
|
||||
self:visible(false);
|
||||
if SCREENMAN:GetTopScreen():HaveProfileToSave() then
|
||||
self:visible(true);
|
||||
self:sleep(1);
|
||||
end;
|
||||
self:queuecommand("Save");
|
||||
end;
|
||||
SaveCommand=function(self)
|
||||
SCREENMAN:GetTopScreen():Continue();
|
||||
end;
|
||||
--
|
||||
Draw.Box(SCREEN_WIDTH,50)..{
|
||||
InitCommand=cmd(Center);
|
||||
};
|
||||
LoadFont("_arial black 20px")..{
|
||||
Text="Saving Profiles...";
|
||||
InitCommand=cmd(Center;skewx,-0.1;diffuse,color("#000000");Stroke,color("#ffffff"));
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,224 @@
|
||||
--Whew... this one took some time...
|
||||
local function ModIcons(p)
|
||||
local oldmods
|
||||
|
||||
--todo: add more
|
||||
local noteskinbuttons = {
|
||||
pump = "UpLeft";
|
||||
dance ="Down";
|
||||
};
|
||||
local function ModiconRow(caption)
|
||||
return Def.ActorFrame {
|
||||
Draw.RoundBox(35,35,6,6,color("#32ff00"));
|
||||
Draw.RoundBox(25,25,3,3,color("#32c800"));
|
||||
LoadFont("_arial black")..{
|
||||
Name="caption";
|
||||
Text=caption or "";
|
||||
};
|
||||
LoadActor("i can flash")..{
|
||||
Name="sfx";
|
||||
InitCommand=cmd(blend,Blend.Add;zoom,0.125);
|
||||
SFXCommand=cmd(stoptweening;diffusealpha,1;zoom,0.5;linear,0.2;zoom,1;diffusealpha,0);
|
||||
};
|
||||
}
|
||||
end
|
||||
--ActorScrollers <3
|
||||
return Def.ActorScroller {
|
||||
--TransformFunctions are both love and hate...
|
||||
TransformFunction=function(self, offset, itemIndex, numItems)
|
||||
self:y(offset * 40);
|
||||
end;
|
||||
InitCommand=function(self)
|
||||
local items = self:GetNumChildren()
|
||||
self:SetCurrentAndDestinationItem(items/2);
|
||||
if SSC then
|
||||
self:SetNumItemsToDraw(items);
|
||||
end
|
||||
self:SetLoop(true);
|
||||
self:playcommand("Set");
|
||||
end;
|
||||
PlayerOptionsChangedMessageCommand=cmd(playcommand,"Set");
|
||||
PlayerJoinedMessageCommand=cmd(playcommand,"Set");
|
||||
--Here's where the magic happens
|
||||
SetCommand=function(self)
|
||||
local playermods = GAMESTATE:GetPlayerState(p):GetPlayerOptionsArray('ModsLevel_Preferred')
|
||||
--clean (invisible everything)
|
||||
for k,v in pairs(self:GetChildren()) do
|
||||
self:GetChild(k):visible(false);
|
||||
end
|
||||
--stop early
|
||||
if not GAMESTATE:IsHumanPlayer(p) then return end;
|
||||
--this thing is based on iteration... ugh
|
||||
for k,v in ipairs(playermods) do
|
||||
--check if it's speed
|
||||
if string.find(v,"%dx") ~= nil then
|
||||
local c = self:GetChild("%dx")
|
||||
c:visible(true);
|
||||
c:GetChild("caption"):settext(v);
|
||||
c:GetChild("sfx"):playcommand("SFX");
|
||||
else
|
||||
--check if it's noteskin
|
||||
local noteskins = NOTESKIN:GetNoteSkinNames()
|
||||
for i,n in ipairs(noteskins) do
|
||||
if n == v then
|
||||
local c = self:GetChild("Noteskin")
|
||||
local button = noteskinbuttons[sGame] or "fallback"
|
||||
local toload = NOTESKIN:GetPathForNoteSkin(button, "Tap Note", v)
|
||||
--make it visible
|
||||
c:visible(true);
|
||||
--adjust sizes here
|
||||
c:GetChild("skingraphic"):Load(toload);
|
||||
c:GetChild("skingraphic"):zoom(0.45);
|
||||
--effects
|
||||
c:GetChild("skinframe"):GetChild("sfx"):playcommand("SFX");
|
||||
else
|
||||
--it's anything else then
|
||||
local c = self:GetChild(v)
|
||||
if c then
|
||||
c:visible(true);
|
||||
c:GetChild("sfx"):playcommand("SFX");
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
--yeah whatever...
|
||||
self:GetChild("revg"):visible(getenv("GradeReverse"..p));
|
||||
self:GetChild("revg"):GetChild("sfx"):playcommand("SFX");
|
||||
end
|
||||
|
||||
oldmods = playermods
|
||||
end;
|
||||
--speed
|
||||
ModiconRow("1x")..{ Name="%dx" };
|
||||
--reserved for noteskins
|
||||
Def.ActorFrame {
|
||||
Name="Noteskin";
|
||||
ModiconRow("")..{ Name="skinframe"; };
|
||||
Def.Sprite { Name="skingraphic"; };
|
||||
};
|
||||
--the rest
|
||||
ModiconRow("RS")..{ Name="SuperShuffle" };
|
||||
ModiconRow("MR")..{ Name="Left" };
|
||||
ModiconRow("VN")..{ Name="Hidden" };
|
||||
ModiconRow("FD")..{ Name="Dark" };
|
||||
ModiconRow("XM")..{ Name="XMode" };
|
||||
ModiconRow("RG")..{ Name="revg" };
|
||||
}
|
||||
end
|
||||
|
||||
local function DifficultyMeter(p)
|
||||
return LoadFont("_impact 50px")..{
|
||||
Text="";
|
||||
SetCommand=function(self)
|
||||
if not GAMESTATE:IsHumanPlayer(p) then return end;
|
||||
|
||||
local steps = GAMESTATE:GetCurrentSteps(p)
|
||||
local diff = steps:GetDifficulty()
|
||||
local stype = steps:GetStepsType()
|
||||
local desc = steps:GetDescription()
|
||||
local meter = steps:GetMeter()
|
||||
--local autogen = steps:IsAutogen() and "AUTO " or ""
|
||||
|
||||
--compatible
|
||||
local text = DifficultyAndStepstypeToString(diff,stype,desc)
|
||||
text = string.upper(text);
|
||||
|
||||
self:settextf("%s [%d]",text,meter);
|
||||
end;
|
||||
CurrentSongChangedMessageCommand=function(self)
|
||||
local song = GAMESTATE:GetCurrentSong()
|
||||
if not song then self:visible(false); return end
|
||||
self:visible(true);
|
||||
end;
|
||||
};
|
||||
end
|
||||
|
||||
local function SongInformationDisplay()
|
||||
local index = 1
|
||||
return LoadFont("_arial black 20px")..{
|
||||
--Text="asd";
|
||||
SetCommand=function(self)
|
||||
local song = GAMESTATE:GetCurrentSong()
|
||||
if not song then self:diffusealpha(0); return end
|
||||
|
||||
local title = song:GetDisplayFullTitle();
|
||||
local artist = song:GetDisplayArtist();
|
||||
local bpm = song:GetDisplayBpms() --GetTimmingData():GetActualBPM()
|
||||
local group = song:GetGroupName();
|
||||
local length = song:MusicLengthSeconds();
|
||||
if length == 150 then
|
||||
length = "Lengthless"
|
||||
else
|
||||
local longmara
|
||||
if song:IsLong() then
|
||||
longmara = " Long song"
|
||||
elseif song:IsMarathon() then
|
||||
longmara = " Marathon song"
|
||||
else
|
||||
longmara = ""
|
||||
end
|
||||
length = string.format("%02d:%02d%s",length/60,length%60,longmara)
|
||||
end
|
||||
|
||||
if bpm[1] == bpm[2] then
|
||||
bpm = string.format("BPM %d", bpm[1])
|
||||
else
|
||||
bpm = string.format("BPM %d - %d",bpm[1],bpm[2])
|
||||
end
|
||||
|
||||
local metadata = {title,artist,bpm,group,length}
|
||||
|
||||
local toset = metadata[index]
|
||||
|
||||
index = index+1
|
||||
if index > #metadata then index = 1 end
|
||||
|
||||
--self:finishtweening();
|
||||
self:settext(toset);
|
||||
self:linear(0.2);
|
||||
self:diffusealpha(1);
|
||||
self:sleep(1);
|
||||
self:linear(0.2)
|
||||
self:diffusealpha(0);
|
||||
self:queuecommand("Set");
|
||||
end;
|
||||
CurrentSongChangedMessageCommand=function(self)
|
||||
--reset index
|
||||
index = 1
|
||||
--start looping
|
||||
self:stoptweening();
|
||||
self:linear(0.2)
|
||||
self:diffusealpha(0);
|
||||
self:queuecommand("Set")
|
||||
end;
|
||||
OffCommand=cmd(finishtweening);
|
||||
};
|
||||
end
|
||||
|
||||
return Def.ActorFrame {
|
||||
DifficultyMeter(PLAYER_1)..{
|
||||
InitCommand=cmd(FromCenterX,-120;FromTop,100;zoom,0.75;diffuse,color("#646464");Stroke,color("#ffffff"));
|
||||
CurrentStepsP1ChangedMessageCommand=cmd(playcommand,"Set");
|
||||
};
|
||||
DifficultyMeter(PLAYER_2)..{
|
||||
InitCommand=cmd(FromCenterX,120;FromTop,100;zoom,0.75;diffuse,color("#646464");Stroke,color("#ffffff"));
|
||||
CurrentStepsP2ChangedMessageCommand=cmd(playcommand,"Set");
|
||||
};
|
||||
Draw.RoundBox(SCREEN_WIDTH*0.75+10,50,color("#ffffff"))..{
|
||||
InitCommand=cmd(CenterX;FromBottom,-75);
|
||||
};
|
||||
Draw.RoundBox(SCREEN_WIDTH*0.75,40,5,5,color("#0000c8"))..{
|
||||
InitCommand=cmd(CenterX;FromBottom,-75);
|
||||
};
|
||||
SongInformationDisplay()..{
|
||||
InitCommand=cmd(CenterX;FromBottom,-75;diffuse,color("#009600");Stroke,color("#000000"));
|
||||
};
|
||||
ModIcons(PLAYER_1)..{
|
||||
InitCommand=cmd(FromLeft,30;FromTop,240);
|
||||
Condition=not GetUserPrefB("OptionsMode");
|
||||
};
|
||||
ModIcons(PLAYER_2)..{
|
||||
InitCommand=cmd(FromRight,-30;FromTop,240);
|
||||
Condition=not GetUserPrefB("OptionsMode");
|
||||
};
|
||||
}
|
||||
|
After Width: | Height: | Size: 14 KiB |
@@ -0,0 +1,66 @@
|
||||
return Def.ActorFrame {
|
||||
InitCommand=function(self)
|
||||
setenv("GradeReverse" .. PLAYER_1, false)
|
||||
setenv("GradeReverse" .. PLAYER_2, false)
|
||||
--setenv("UnderAttack", false)
|
||||
--setenv("Drop", false)
|
||||
end;
|
||||
CodeMessageCommand=function(self,params)
|
||||
local code = params.Name
|
||||
local player = params.PlayerNumber
|
||||
if not GAMESTATE:IsHumanPlayer(player) then return end;
|
||||
|
||||
if not GetUserPrefB("OptionsMode") then
|
||||
--Yeah
|
||||
if not CustomCodeDetector(code,player,true) then
|
||||
--handling envutils here
|
||||
if code == "GradeReverse"
|
||||
--or code == "any envutil wich requires to be per player"
|
||||
then
|
||||
if not getenv( code..player ) then
|
||||
setenv( code..player, true)
|
||||
else
|
||||
setenv( code..player, false)
|
||||
end
|
||||
else --general envutils (not per player)
|
||||
if not getenv( code ) then
|
||||
setenv( code, true)
|
||||
else
|
||||
setenv( code, false)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if code == "Cancel" then
|
||||
setenv("GradeReverse"..player,false)
|
||||
end
|
||||
|
||||
MESSAGEMAN:Broadcast("PlayerOptionsChanged", { PlayerNumber = player })
|
||||
--SOUND:PlayOnce(THEME:GetPathS("ScreenSelectMusic","Options"))
|
||||
else
|
||||
if code == "Summon" then
|
||||
--this lua binding is awesome
|
||||
--SCREENMAN:SystemMessage(ToEnumShortString(player).." opened the oplist")
|
||||
self:sleep(0.5);
|
||||
self:queuecommand("OpenCustomOpList");
|
||||
end
|
||||
end
|
||||
end;
|
||||
OpenCustomOpListCommand=function(self) SCREENMAN:AddNewScreenToTop("ScreenCustomOptionsList") end;
|
||||
PlayerOptionsChangedMessageCommand=function(self,params)
|
||||
local player = params.PlayerNumber
|
||||
local playermods = GAMESTATE:GetPlayerState(player):GetPlayerOptions('ModsLevel_Preferred')
|
||||
--SCREENMAN:SystemMessage(ToEnumShortString(player).." mods: "..playermods);
|
||||
end;
|
||||
LoadSound("START")..{
|
||||
OffCommand=cmd(play);
|
||||
};
|
||||
LoadSound("ScreenSelectMusic","Options")..{
|
||||
PlayerOptionsChangedMessageCommand=cmd(stop;play);
|
||||
};
|
||||
LoadSound("3-2")..{
|
||||
--TwoPartConfirmCanceledMessageCommand=cmd(play);
|
||||
SongChosenMessageCommand=cmd(stop;play);
|
||||
OffCommand=cmd(play);
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
return Def.ActorFrame {
|
||||
LoadFont("_impact 50px")..{
|
||||
Text="Epic fail...";
|
||||
InitCommand=cmd(Center;diffuse,color("#000000");Stroke,color("#ffffff"));
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
local song = GAMESTATE:GetCurrentSong()
|
||||
--assert(song,"WHY THIS HAPPENS LOL")
|
||||
if not song then
|
||||
song = SONGMAN:GetRandomSong()
|
||||
GAMESTATE:SetCurrentSong( song )
|
||||
|
||||
for k,v in ipairs(PlayerNumber) do
|
||||
local stepsplayer = GAMESTATE:GetCurrentSteps(v)
|
||||
steps = song:GetOneSteps( stepsplayer:GetStepsType() , stepsplayer:GetDifficulty() )
|
||||
GAMESTATE:SetCurrentSteps( steps )
|
||||
end
|
||||
end
|
||||
|
||||
local path = song:GetBackgroundPath()
|
||||
|
||||
SplitMode();
|
||||
|
||||
if not path then
|
||||
path = THEME:GetPathG("Common", "fallback background")
|
||||
end
|
||||
|
||||
return LoadActor(path)..{
|
||||
InitCommand=cmd(scaletocover,0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
|
||||
};
|
||||
@@ -0,0 +1,79 @@
|
||||
local function PlayerName(player)
|
||||
local puns = {
|
||||
--TODO: add moar...
|
||||
["asd"] = "qwe";
|
||||
["qwe"] = "asd";
|
||||
};
|
||||
|
||||
return LoadFont("_arial black 20px")..{
|
||||
--Text="PlaceHolder";
|
||||
InitCommand=cmd(zoomx,1);
|
||||
SetCommand=function(self)
|
||||
self:settext("");
|
||||
if PROFILEMAN:IsPersistentProfile(player) then
|
||||
local profile = PROFILEMAN:GetProfile(player)
|
||||
local name = profile:GetDisplayName()
|
||||
|
||||
if name == "" then
|
||||
name = string.gsub(player,"Number_P"," ")
|
||||
end
|
||||
--max 20 chars ºvº
|
||||
name = string.sub(name,1,20)
|
||||
--name = puns[name] or name
|
||||
|
||||
self:settext(name)
|
||||
end
|
||||
end;
|
||||
PlayerJoinedMessageCommand=cmd(playcommand,"Set");
|
||||
CoinInsertedMessageCommand=cmd(playcommand,"Set");
|
||||
CoinModeChangedMessageCommand=cmd(playcommand,"Set");
|
||||
ScreenChangedMessageCommand=cmd(playcommand,"Set");
|
||||
StorageDevicesChangedMessageCommand=cmd(playcommand,"Set");
|
||||
};
|
||||
end
|
||||
|
||||
return Def.ActorFrame {
|
||||
LoadFont("_fixedsys")..{
|
||||
InitCommand=cmd(blend,'BlendMode_Add'xy,10,5;shadowlength,0;Stroke,{0,0,0,1};wrapwidthpixels,SCREEN_WIDTH*0.45;maxwidth,SCREEN_WIDTH*0.45;horizalign,left;SetTextureFiltering,false;vertalign,top;zoom,1.5);
|
||||
SystemMessageMessageCommand=function(self,params)
|
||||
self:settext(params.Message);
|
||||
self:finishtweening();
|
||||
self:diffusealpha(1);
|
||||
self:sleep(3);
|
||||
self:diffusealpha(0);
|
||||
end;
|
||||
HideSystemMessageMessageCommand=cmd(finishtweening);
|
||||
};
|
||||
|
||||
LoadFont("_arial black 20px")..{
|
||||
InitCommand=cmd(xy,SCREEN_CENTER_X,SCREEN_HEIGHT-20;zoom,1;shadowlength,0;playcommand,"Text");
|
||||
TextCommand=function(self)
|
||||
if GAMESTATE:GetCoinMode() == 'CoinMode_Pay' then
|
||||
local Coins = GAMESTATE:GetCoins()
|
||||
local CoinForCredit = GAMESTATE:GetCoinsNeededToJoin()
|
||||
local Credits = math.floor(Coins/CoinForCredit)
|
||||
local Remain = Coins % CoinForCredit
|
||||
self:settext(string.format("CREDIT(S) %i[%i/%i]", Credits, Remain, CoinForCredit))
|
||||
elseif GAMESTATE:GetCoinMode() == 'CoinMode_Free' then
|
||||
self:settext("Free Play")
|
||||
else --homemode
|
||||
self:settext("Home Mode");
|
||||
end
|
||||
end;
|
||||
PlayerJoinedMessageCommand=cmd(playcommand,"Text");
|
||||
CoinInsertedMessageCommand=cmd(playcommand,"Text");
|
||||
CoinModeChangedMessageCommand=cmd(playcommand,"Text");
|
||||
ScreenChangedMessageCommand=cmd(playcommand,"Text");
|
||||
};
|
||||
|
||||
ScreenChangedMessageCommand=function(self)
|
||||
self:visible(THEME:GetMetric(SCREENMAN:GetTopScreen():GetName(),"ShowCreditDisplay"));
|
||||
end;
|
||||
|
||||
PlayerName(PLAYER_1)..{
|
||||
InitCommand=cmd(xy,20,SCREEN_HEIGHT-20;horizalign,left);
|
||||
};
|
||||
PlayerName(PLAYER_2)..{
|
||||
InitCommand=cmd(xy,SCREEN_WIDTH-20,SCREEN_HEIGHT-20;horizalign,right);
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
return Def.ActorFrame {
|
||||
LoadFont("_arial black 20px")..{
|
||||
Text="Background logo or video must go here...";
|
||||
InitCommand=cmd(CenterX;y,200;Stroke,color("#000000"));
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
local particles = {
|
||||
Def.Quad { InitCommand=cmd(FullScreen;diffuse,color("#003200");diffusetopedge,color("#000000")); }
|
||||
}
|
||||
|
||||
for i=1,30 do
|
||||
particles[#particles+1] = Draw.Oval(math.random(20,80))..{
|
||||
InitCommand=function(self)
|
||||
self:finishtweening();
|
||||
self:decelerate(0.25);
|
||||
|
||||
self:x(math.random(20,SCREEN_WIDTH-20));
|
||||
self:y(math.random(20,SCREEN_HEIGHT-20));
|
||||
|
||||
self:diffuse(math.random(0.2,1),math.random(0.2,1),math.random(0.2,1),math.random(0.75,0.95))
|
||||
end;
|
||||
ScreenChangedMessageCommand=cmd(playcommand,"Init");
|
||||
}
|
||||
end
|
||||
|
||||
return Def.ActorFrame {
|
||||
children = particles;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
--stolen from default theme
|
||||
local File, Width = ...
|
||||
assert( File );
|
||||
assert( Width );
|
||||
|
||||
local FullFile = THEME:GetPathB('','_frame files 3x1/'..File )
|
||||
local Frame = LoadActor( FullFile )
|
||||
|
||||
return Def.ActorFrame {
|
||||
Frame .. { InitCommand=cmd(setstate,0;pause;horizalign,right;x,-Width/2) };
|
||||
Frame .. { InitCommand=cmd(setstate,1;pause;zoomtowidth,Width) };
|
||||
Frame .. { InitCommand=cmd(setstate,2;pause;horizalign,left;x,Width/2) };
|
||||
};
|
||||
@@ -0,0 +1 @@
|
||||
_arial black 20px
|
||||
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 74 KiB |
@@ -0,0 +1,352 @@
|
||||
[common]
|
||||
Baseline=25
|
||||
Top=11
|
||||
LineSpacing=28
|
||||
DrawExtraPixelsLeft=1
|
||||
DrawExtraPixelsRight=0
|
||||
AdvanceExtraPixels=0
|
||||
|
||||
[main]
|
||||
Line 0= !"#$%&'()*+,-.
|
||||
Line 1=/0123456789:;<=
|
||||
Line 2=>?@ABCDEFGHIJKL
|
||||
Line 3=MNOPQRSTUVWXYZ[
|
||||
Line 4=\]^_`abcdefghij
|
||||
Line 5=klmnopqrstuvwxy
|
||||
Line 6=z{|}~€‚ƒ„…†‡ˆ‰Š
|
||||
Line 7=‹ŒŽ‘’“”•–—˜™š›œ
|
||||
Line 8=žŸ ¡¢£¤¥¦§¨©ª«¬
|
||||
Line 9=®¯°±²³´µ¶·¸¹º»
|
||||
Line 10=¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊ
|
||||
Line 11=ËÌÍÎÏÐÑÒÓÔÕÖרÙ
|
||||
Line 12=ÚÛÜÝÞßàáâãäåæçè
|
||||
Line 13=éêëìíîïðñòóôõö÷
|
||||
Line 14=øùúûüýþÿ
|
||||
|
||||
0=7
|
||||
1=7
|
||||
2=10
|
||||
3=13
|
||||
4=13
|
||||
5=20
|
||||
6=18
|
||||
7=6
|
||||
8=8
|
||||
9=8
|
||||
10=11
|
||||
11=13
|
||||
12=7
|
||||
13=7
|
||||
14=7
|
||||
15=6
|
||||
16=13
|
||||
17=13
|
||||
18=13
|
||||
19=13
|
||||
20=13
|
||||
21=13
|
||||
22=13
|
||||
23=13
|
||||
24=13
|
||||
25=13
|
||||
26=7
|
||||
27=7
|
||||
28=13
|
||||
29=13
|
||||
30=13
|
||||
31=12
|
||||
32=15
|
||||
33=16
|
||||
34=16
|
||||
35=16
|
||||
36=16
|
||||
37=14
|
||||
38=13
|
||||
39=17
|
||||
40=17
|
||||
41=8
|
||||
42=13
|
||||
43=17
|
||||
44=13
|
||||
45=19
|
||||
46=17
|
||||
47=17
|
||||
48=14
|
||||
49=17
|
||||
50=16
|
||||
51=14
|
||||
52=14
|
||||
53=17
|
||||
54=16
|
||||
55=20
|
||||
56=16
|
||||
57=16
|
||||
58=14
|
||||
59=8
|
||||
60=6
|
||||
61=8
|
||||
62=13
|
||||
63=10
|
||||
64=7
|
||||
65=13
|
||||
66=13
|
||||
67=13
|
||||
68=13
|
||||
69=13
|
||||
70=8
|
||||
71=13
|
||||
72=13
|
||||
73=7
|
||||
74=7
|
||||
75=13
|
||||
76=7
|
||||
77=20
|
||||
78=13
|
||||
79=13
|
||||
80=13
|
||||
81=13
|
||||
82=9
|
||||
83=12
|
||||
84=9
|
||||
85=13
|
||||
86=12
|
||||
87=19
|
||||
88=13
|
||||
89=12
|
||||
90=11
|
||||
91=8
|
||||
92=6
|
||||
93=8
|
||||
94=13
|
||||
95=13
|
||||
96=6
|
||||
97=13
|
||||
98=10
|
||||
99=20
|
||||
100=13
|
||||
101=13
|
||||
102=7
|
||||
103=20
|
||||
104=14
|
||||
105=7
|
||||
106=20
|
||||
107=14
|
||||
108=6
|
||||
109=6
|
||||
110=10
|
||||
111=10
|
||||
112=10
|
||||
113=10
|
||||
114=20
|
||||
115=7
|
||||
116=19
|
||||
117=12
|
||||
118=7
|
||||
119=20
|
||||
120=11
|
||||
121=16
|
||||
122=7
|
||||
123=7
|
||||
124=13
|
||||
125=13
|
||||
126=13
|
||||
127=13
|
||||
128=6
|
||||
129=13
|
||||
130=7
|
||||
131=16
|
||||
132=8
|
||||
133=13
|
||||
134=13
|
||||
135=7
|
||||
136=16
|
||||
137=10
|
||||
138=8
|
||||
139=13
|
||||
140=8
|
||||
141=8
|
||||
142=7
|
||||
143=13
|
||||
144=17
|
||||
145=7
|
||||
146=7
|
||||
147=8
|
||||
148=8
|
||||
149=13
|
||||
150=20
|
||||
151=20
|
||||
152=20
|
||||
153=12
|
||||
154=16
|
||||
155=16
|
||||
156=16
|
||||
157=16
|
||||
158=16
|
||||
159=16
|
||||
160=20
|
||||
161=16
|
||||
162=14
|
||||
163=14
|
||||
164=14
|
||||
165=14
|
||||
166=8
|
||||
167=8
|
||||
168=8
|
||||
169=8
|
||||
170=16
|
||||
171=17
|
||||
172=17
|
||||
173=17
|
||||
174=17
|
||||
175=17
|
||||
176=17
|
||||
177=13
|
||||
178=17
|
||||
179=17
|
||||
180=17
|
||||
181=17
|
||||
182=17
|
||||
183=16
|
||||
184=14
|
||||
185=13
|
||||
186=13
|
||||
187=13
|
||||
188=13
|
||||
189=13
|
||||
190=13
|
||||
191=13
|
||||
192=20
|
||||
193=13
|
||||
194=13
|
||||
195=13
|
||||
196=13
|
||||
197=13
|
||||
198=7
|
||||
199=7
|
||||
200=7
|
||||
201=7
|
||||
202=13
|
||||
203=13
|
||||
204=13
|
||||
205=13
|
||||
206=13
|
||||
207=13
|
||||
208=13
|
||||
209=13
|
||||
210=13
|
||||
211=13
|
||||
212=13
|
||||
213=13
|
||||
214=13
|
||||
215=12
|
||||
216=13
|
||||
217=12
|
||||
|
||||
[alt]
|
||||
Line 0= Ą˘Ł¤ĽŚ§¨Š
|
||||
Line 1=ŞŤŹŽŻ°ą˛ł
|
||||
Line 2=´ľśˇ¸šşťź˝
|
||||
Line 3=žżŔÁÂĂÄĹĆÇ
|
||||
Line 4=ČÉĘËĚÍÎĎĐŃ
|
||||
Line 5=ŇÓÔŐÖ×ŘŮÚŰ
|
||||
Line 6=ÜÝŢßŕáâăäĺ
|
||||
Line 7=ćçčéęëěíîď
|
||||
Line 8=đńňóôőö÷řů
|
||||
Line 9=úűüýţ˙
|
||||
|
||||
0=7
|
||||
1=16
|
||||
2=7
|
||||
3=13
|
||||
4=13
|
||||
5=13
|
||||
6=14
|
||||
7=13
|
||||
8=7
|
||||
9=14
|
||||
10=14
|
||||
11=14
|
||||
12=14
|
||||
13=7
|
||||
14=14
|
||||
15=14
|
||||
16=8
|
||||
17=13
|
||||
18=7
|
||||
19=7
|
||||
20=7
|
||||
21=10
|
||||
22=12
|
||||
23=7
|
||||
24=7
|
||||
25=12
|
||||
26=12
|
||||
27=13
|
||||
28=11
|
||||
29=7
|
||||
30=11
|
||||
31=11
|
||||
32=16
|
||||
33=16
|
||||
34=16
|
||||
35=16
|
||||
36=16
|
||||
37=13
|
||||
38=16
|
||||
39=16
|
||||
40=16
|
||||
41=14
|
||||
42=14
|
||||
43=14
|
||||
44=14
|
||||
45=8
|
||||
46=8
|
||||
47=16
|
||||
48=16
|
||||
49=17
|
||||
50=17
|
||||
51=17
|
||||
52=17
|
||||
53=17
|
||||
54=17
|
||||
55=13
|
||||
56=16
|
||||
57=17
|
||||
58=17
|
||||
59=17
|
||||
60=17
|
||||
61=16
|
||||
62=14
|
||||
63=13
|
||||
64=9
|
||||
65=13
|
||||
66=13
|
||||
67=13
|
||||
68=13
|
||||
69=7
|
||||
70=13
|
||||
71=13
|
||||
72=13
|
||||
73=13
|
||||
74=13
|
||||
75=13
|
||||
76=13
|
||||
77=7
|
||||
78=7
|
||||
79=17
|
||||
80=13
|
||||
81=13
|
||||
82=13
|
||||
83=13
|
||||
84=13
|
||||
85=13
|
||||
86=13
|
||||
87=13
|
||||
88=9
|
||||
89=13
|
||||
90=13
|
||||
91=13
|
||||
92=13
|
||||
93=12
|
||||
94=9
|
||||
95=7
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 7.0 KiB |
@@ -0,0 +1,352 @@
|
||||
[common]
|
||||
Baseline=13
|
||||
Top=4
|
||||
LineSpacing=15
|
||||
DrawExtraPixelsLeft=0
|
||||
DrawExtraPixelsRight=0
|
||||
AdvanceExtraPixels=0
|
||||
|
||||
[main]
|
||||
Line 0= !"#$%&'()*+,-.
|
||||
Line 1=/0123456789:;<=
|
||||
Line 2=>?@ABCDEFGHIJKL
|
||||
Line 3=MNOPQRSTUVWXYZ[
|
||||
Line 4=\]^_`abcdefghij
|
||||
Line 5=klmnopqrstuvwxy
|
||||
Line 6=z{|}~€‚ƒ„…†‡ˆ‰Š
|
||||
Line 7=‹ŒŽ‘’“”•–—˜™š›œ
|
||||
Line 8=žŸ ¡¢£¤¥¦§¨©ª«¬
|
||||
Line 9=®¯°±²³´µ¶·¸¹º»
|
||||
Line 10=¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊ
|
||||
Line 11=ËÌÍÎÏÐÑÒÓÔÕÖרÙ
|
||||
Line 12=ÚÛÜÝÞßàáâãäåæçè
|
||||
Line 13=éêëìíîïðñòóôõö÷
|
||||
Line 14=øùúûüýþÿ
|
||||
|
||||
0=8
|
||||
1=8
|
||||
2=8
|
||||
3=8
|
||||
4=8
|
||||
5=8
|
||||
6=8
|
||||
7=8
|
||||
8=8
|
||||
9=8
|
||||
10=8
|
||||
11=8
|
||||
12=8
|
||||
13=8
|
||||
14=8
|
||||
15=8
|
||||
16=8
|
||||
17=8
|
||||
18=8
|
||||
19=8
|
||||
20=8
|
||||
21=8
|
||||
22=8
|
||||
23=8
|
||||
24=8
|
||||
25=8
|
||||
26=8
|
||||
27=8
|
||||
28=8
|
||||
29=8
|
||||
30=8
|
||||
31=8
|
||||
32=8
|
||||
33=8
|
||||
34=8
|
||||
35=8
|
||||
36=8
|
||||
37=8
|
||||
38=8
|
||||
39=8
|
||||
40=8
|
||||
41=8
|
||||
42=8
|
||||
43=8
|
||||
44=8
|
||||
45=8
|
||||
46=8
|
||||
47=8
|
||||
48=8
|
||||
49=8
|
||||
50=8
|
||||
51=8
|
||||
52=8
|
||||
53=8
|
||||
54=8
|
||||
55=8
|
||||
56=8
|
||||
57=8
|
||||
58=8
|
||||
59=8
|
||||
60=8
|
||||
61=8
|
||||
62=8
|
||||
63=8
|
||||
64=8
|
||||
65=8
|
||||
66=8
|
||||
67=8
|
||||
68=8
|
||||
69=8
|
||||
70=8
|
||||
71=8
|
||||
72=8
|
||||
73=8
|
||||
74=8
|
||||
75=8
|
||||
76=8
|
||||
77=8
|
||||
78=8
|
||||
79=8
|
||||
80=8
|
||||
81=8
|
||||
82=8
|
||||
83=8
|
||||
84=8
|
||||
85=8
|
||||
86=8
|
||||
87=8
|
||||
88=8
|
||||
89=8
|
||||
90=8
|
||||
91=8
|
||||
92=8
|
||||
93=8
|
||||
94=8
|
||||
95=8
|
||||
96=8
|
||||
97=8
|
||||
98=8
|
||||
99=8
|
||||
100=8
|
||||
101=8
|
||||
102=8
|
||||
103=8
|
||||
104=8
|
||||
105=8
|
||||
106=8
|
||||
107=8
|
||||
108=8
|
||||
109=8
|
||||
110=8
|
||||
111=8
|
||||
112=8
|
||||
113=8
|
||||
114=8
|
||||
115=8
|
||||
116=8
|
||||
117=8
|
||||
118=8
|
||||
119=8
|
||||
120=8
|
||||
121=8
|
||||
122=8
|
||||
123=8
|
||||
124=8
|
||||
125=8
|
||||
126=8
|
||||
127=8
|
||||
128=8
|
||||
129=8
|
||||
130=8
|
||||
131=8
|
||||
132=8
|
||||
133=8
|
||||
134=8
|
||||
135=8
|
||||
136=8
|
||||
137=8
|
||||
138=8
|
||||
139=8
|
||||
140=8
|
||||
141=8
|
||||
142=8
|
||||
143=8
|
||||
144=8
|
||||
145=8
|
||||
146=8
|
||||
147=8
|
||||
148=8
|
||||
149=8
|
||||
150=8
|
||||
151=8
|
||||
152=8
|
||||
153=8
|
||||
154=8
|
||||
155=8
|
||||
156=8
|
||||
157=8
|
||||
158=8
|
||||
159=8
|
||||
160=8
|
||||
161=8
|
||||
162=8
|
||||
163=8
|
||||
164=8
|
||||
165=8
|
||||
166=8
|
||||
167=8
|
||||
168=8
|
||||
169=8
|
||||
170=8
|
||||
171=8
|
||||
172=8
|
||||
173=8
|
||||
174=8
|
||||
175=8
|
||||
176=8
|
||||
177=8
|
||||
178=8
|
||||
179=8
|
||||
180=8
|
||||
181=8
|
||||
182=8
|
||||
183=8
|
||||
184=8
|
||||
185=8
|
||||
186=8
|
||||
187=8
|
||||
188=8
|
||||
189=8
|
||||
190=8
|
||||
191=8
|
||||
192=8
|
||||
193=8
|
||||
194=8
|
||||
195=8
|
||||
196=8
|
||||
197=8
|
||||
198=8
|
||||
199=8
|
||||
200=8
|
||||
201=8
|
||||
202=8
|
||||
203=8
|
||||
204=8
|
||||
205=8
|
||||
206=8
|
||||
207=8
|
||||
208=8
|
||||
209=8
|
||||
210=8
|
||||
211=8
|
||||
212=8
|
||||
213=8
|
||||
214=8
|
||||
215=8
|
||||
216=8
|
||||
217=8
|
||||
|
||||
[alt]
|
||||
Line 0= Ą˘Ł¤ĽŚ§¨Š
|
||||
Line 1=ŞŤŹŽŻ°ą˛ł
|
||||
Line 2=´ľśˇ¸šşťź˝
|
||||
Line 3=žżŔÁÂĂÄĹĆÇ
|
||||
Line 4=ČÉĘËĚÍÎĎĐŃ
|
||||
Line 5=ŇÓÔŐÖ×ŘŮÚŰ
|
||||
Line 6=ÜÝŢßŕáâăäĺ
|
||||
Line 7=ćçčéęëěíîď
|
||||
Line 8=đńňóôőö÷řů
|
||||
Line 9=úűüýţ˙
|
||||
|
||||
0=8
|
||||
1=8
|
||||
2=8
|
||||
3=8
|
||||
4=8
|
||||
5=8
|
||||
6=8
|
||||
7=8
|
||||
8=8
|
||||
9=8
|
||||
10=8
|
||||
11=8
|
||||
12=8
|
||||
13=8
|
||||
14=8
|
||||
15=8
|
||||
16=8
|
||||
17=8
|
||||
18=8
|
||||
19=8
|
||||
20=8
|
||||
21=8
|
||||
22=8
|
||||
23=8
|
||||
24=8
|
||||
25=8
|
||||
26=8
|
||||
27=8
|
||||
28=8
|
||||
29=8
|
||||
30=8
|
||||
31=8
|
||||
32=8
|
||||
33=8
|
||||
34=8
|
||||
35=8
|
||||
36=8
|
||||
37=8
|
||||
38=8
|
||||
39=8
|
||||
40=8
|
||||
41=8
|
||||
42=8
|
||||
43=8
|
||||
44=8
|
||||
45=8
|
||||
46=8
|
||||
47=8
|
||||
48=8
|
||||
49=8
|
||||
50=8
|
||||
51=8
|
||||
52=8
|
||||
53=8
|
||||
54=8
|
||||
55=8
|
||||
56=8
|
||||
57=8
|
||||
58=8
|
||||
59=8
|
||||
60=8
|
||||
61=8
|
||||
62=8
|
||||
63=8
|
||||
64=8
|
||||
65=8
|
||||
66=8
|
||||
67=8
|
||||
68=8
|
||||
69=8
|
||||
70=8
|
||||
71=8
|
||||
72=8
|
||||
73=8
|
||||
74=8
|
||||
75=8
|
||||
76=8
|
||||
77=8
|
||||
78=8
|
||||
79=8
|
||||
80=8
|
||||
81=8
|
||||
82=8
|
||||
83=8
|
||||
84=8
|
||||
85=8
|
||||
86=8
|
||||
87=8
|
||||
88=8
|
||||
89=8
|
||||
90=8
|
||||
91=8
|
||||
92=8
|
||||
93=8
|
||||
94=8
|
||||
95=8
|
||||
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 197 KiB |
@@ -0,0 +1,352 @@
|
||||
[common]
|
||||
Baseline=57
|
||||
Top=18
|
||||
LineSpacing=50
|
||||
DrawExtraPixelsLeft=4
|
||||
DrawExtraPixelsRight=4
|
||||
AdvanceExtraPixels=0
|
||||
|
||||
[main]
|
||||
Line 0= !"#$%&'()*+,-.
|
||||
Line 1=/0123456789:;<=
|
||||
Line 2=>?@ABCDEFGHIJKL
|
||||
Line 3=MNOPQRSTUVWXYZ[
|
||||
Line 4=\]^_`abcdefghij
|
||||
Line 5=klmnopqrstuvwxy
|
||||
Line 6=z{|}~€‚ƒ„…†‡ˆ‰Š
|
||||
Line 7=‹ŒŽ‘’“”•–—˜™š›œ
|
||||
Line 8=žŸ ¡¢£¤¥¦§¨©ª«¬
|
||||
Line 9=®¯°±²³´µ¶·¸¹º»
|
||||
Line 10=¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊ
|
||||
Line 11=ËÌÍÎÏÐÑÒÓÔÕÖרÙ
|
||||
Line 12=ÚÛÜÝÞßàáâãäåæçè
|
||||
Line 13=éêëìíîïðñòóôõö÷
|
||||
Line 14=øùúûüýþÿ
|
||||
|
||||
0=9
|
||||
1=14
|
||||
2=18
|
||||
3=31
|
||||
4=27
|
||||
5=35
|
||||
6=29
|
||||
7=9
|
||||
8=16
|
||||
9=16
|
||||
10=14
|
||||
11=27
|
||||
12=8
|
||||
13=15
|
||||
14=9
|
||||
15=20
|
||||
16=27
|
||||
17=19
|
||||
18=25
|
||||
19=27
|
||||
20=25
|
||||
21=27
|
||||
22=27
|
||||
23=20
|
||||
24=27
|
||||
25=27
|
||||
26=10
|
||||
27=10
|
||||
28=27
|
||||
29=27
|
||||
30=27
|
||||
31=26
|
||||
32=39
|
||||
33=25
|
||||
34=28
|
||||
35=28
|
||||
36=28
|
||||
37=21
|
||||
38=20
|
||||
39=28
|
||||
40=28
|
||||
41=14
|
||||
42=17
|
||||
43=27
|
||||
44=19
|
||||
45=36
|
||||
46=27
|
||||
47=27
|
||||
48=25
|
||||
49=27
|
||||
50=27
|
||||
51=26
|
||||
52=23
|
||||
53=27
|
||||
54=25
|
||||
55=41
|
||||
56=23
|
||||
57=24
|
||||
58=20
|
||||
59=14
|
||||
60=20
|
||||
61=14
|
||||
62=24
|
||||
63=28
|
||||
64=17
|
||||
65=25
|
||||
66=26
|
||||
67=25
|
||||
68=26
|
||||
69=26
|
||||
70=14
|
||||
71=26
|
||||
72=26
|
||||
73=13
|
||||
74=13
|
||||
75=24
|
||||
76=13
|
||||
77=39
|
||||
78=26
|
||||
79=26
|
||||
80=26
|
||||
81=26
|
||||
82=18
|
||||
83=24
|
||||
84=15
|
||||
85=26
|
||||
86=22
|
||||
87=32
|
||||
88=22
|
||||
89=22
|
||||
90=18
|
||||
91=18
|
||||
92=14
|
||||
93=18
|
||||
94=26
|
||||
95=27
|
||||
96=8
|
||||
97=22
|
||||
98=17
|
||||
99=28
|
||||
100=27
|
||||
101=27
|
||||
102=17
|
||||
103=51
|
||||
104=26
|
||||
105=10
|
||||
106=34
|
||||
107=20
|
||||
108=8
|
||||
109=8
|
||||
110=17
|
||||
111=17
|
||||
112=17
|
||||
113=25
|
||||
114=50
|
||||
115=17
|
||||
116=39
|
||||
117=24
|
||||
118=10
|
||||
119=38
|
||||
120=18
|
||||
121=24
|
||||
122=9
|
||||
123=14
|
||||
124=26
|
||||
125=27
|
||||
126=27
|
||||
127=24
|
||||
128=14
|
||||
129=24
|
||||
130=17
|
||||
131=39
|
||||
132=16
|
||||
133=19
|
||||
134=27
|
||||
135=15
|
||||
136=39
|
||||
137=28
|
||||
138=17
|
||||
139=27
|
||||
140=16
|
||||
141=16
|
||||
142=17
|
||||
143=24
|
||||
144=29
|
||||
145=17
|
||||
146=17
|
||||
147=12
|
||||
148=16
|
||||
149=19
|
||||
150=31
|
||||
151=32
|
||||
152=35
|
||||
153=26
|
||||
154=25
|
||||
155=25
|
||||
156=25
|
||||
157=25
|
||||
158=25
|
||||
159=25
|
||||
160=36
|
||||
161=28
|
||||
162=21
|
||||
163=21
|
||||
164=21
|
||||
165=21
|
||||
166=14
|
||||
167=14
|
||||
168=14
|
||||
169=14
|
||||
170=28
|
||||
171=27
|
||||
172=27
|
||||
173=27
|
||||
174=27
|
||||
175=27
|
||||
176=27
|
||||
177=27
|
||||
178=27
|
||||
179=27
|
||||
180=27
|
||||
181=27
|
||||
182=27
|
||||
183=24
|
||||
184=25
|
||||
185=28
|
||||
186=25
|
||||
187=25
|
||||
188=25
|
||||
189=25
|
||||
190=25
|
||||
191=25
|
||||
192=38
|
||||
193=25
|
||||
194=26
|
||||
195=26
|
||||
196=26
|
||||
197=26
|
||||
198=13
|
||||
199=13
|
||||
200=13
|
||||
201=13
|
||||
202=26
|
||||
203=26
|
||||
204=26
|
||||
205=26
|
||||
206=26
|
||||
207=26
|
||||
208=26
|
||||
209=27
|
||||
210=26
|
||||
211=26
|
||||
212=26
|
||||
213=26
|
||||
214=26
|
||||
215=22
|
||||
216=26
|
||||
217=22
|
||||
|
||||
[alt]
|
||||
Line 0= Ą˘Ł¤ĽŚ§¨Š
|
||||
Line 1=ŞŤŹŽŻ°ą˛ł
|
||||
Line 2=´ľśˇ¸šşťź˝
|
||||
Line 3=žżŔÁÂĂÄĹĆÇ
|
||||
Line 4=ČÉĘËĚÍÎĎĐŃ
|
||||
Line 5=ŇÓÔŐÖ×ŘŮÚŰ
|
||||
Line 6=ÜÝŢßŕáâăäĺ
|
||||
Line 7=ćçčéęëěíîď
|
||||
Line 8=đńňóôőö÷řů
|
||||
Line 9=úűüýţ˙
|
||||
|
||||
0=9
|
||||
1=25
|
||||
2=17
|
||||
3=19
|
||||
4=27
|
||||
5=22
|
||||
6=26
|
||||
7=24
|
||||
8=17
|
||||
9=26
|
||||
10=26
|
||||
11=23
|
||||
12=20
|
||||
13=15
|
||||
14=20
|
||||
15=20
|
||||
16=17
|
||||
17=25
|
||||
18=17
|
||||
19=13
|
||||
20=17
|
||||
21=21
|
||||
22=24
|
||||
23=17
|
||||
24=17
|
||||
25=24
|
||||
26=24
|
||||
27=23
|
||||
28=18
|
||||
29=17
|
||||
30=18
|
||||
31=18
|
||||
32=27
|
||||
33=25
|
||||
34=25
|
||||
35=25
|
||||
36=25
|
||||
37=19
|
||||
38=28
|
||||
39=28
|
||||
40=28
|
||||
41=21
|
||||
42=21
|
||||
43=21
|
||||
44=21
|
||||
45=14
|
||||
46=14
|
||||
47=28
|
||||
48=28
|
||||
49=27
|
||||
50=27
|
||||
51=27
|
||||
52=27
|
||||
53=27
|
||||
54=27
|
||||
55=27
|
||||
56=27
|
||||
57=27
|
||||
58=27
|
||||
59=27
|
||||
60=27
|
||||
61=24
|
||||
62=23
|
||||
63=28
|
||||
64=18
|
||||
65=25
|
||||
66=25
|
||||
67=25
|
||||
68=25
|
||||
69=13
|
||||
70=25
|
||||
71=25
|
||||
72=25
|
||||
73=26
|
||||
74=26
|
||||
75=26
|
||||
76=26
|
||||
77=13
|
||||
78=13
|
||||
79=33
|
||||
80=26
|
||||
81=26
|
||||
82=26
|
||||
83=26
|
||||
84=26
|
||||
85=26
|
||||
86=26
|
||||
87=27
|
||||
88=18
|
||||
89=26
|
||||
90=26
|
||||
91=26
|
||||
92=26
|
||||
93=22
|
||||
94=15
|
||||
95=17
|
||||
|
After Width: | Height: | Size: 6.7 KiB |
@@ -0,0 +1,3 @@
|
||||
[main]
|
||||
line 0=01234
|
||||
line 1=56789
|
||||
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 9.2 KiB |
|
After Width: | Height: | Size: 433 B |
@@ -0,0 +1 @@
|
||||
MusicWheelItem SectionExpanded NormalPart
|
||||
@@ -0,0 +1,30 @@
|
||||
return Def.ActorFrame {
|
||||
Draw.RoundBox(276,212,20,20,color("#323232"));
|
||||
Draw.RoundBox(256,192,10,10)..{
|
||||
Name="ColorFill";
|
||||
--InitCommand=cmd(zoomto,256,192);
|
||||
SetMessageCommand=function(self,params)
|
||||
local color = {1,1,1,1}
|
||||
if PREFSMAN:GetPreference("MusicWheelUsesSections") ~= 'MusicWheelUsesSections_Never'
|
||||
and GAMESTATE:GetSortOrder() == 'SortOrder_Group'
|
||||
then
|
||||
local goupcolor = SONGMAN:GetSongGroupColor(params.SongGroup)
|
||||
|
||||
if goupcolor ~= nil then
|
||||
color = SONGMAN:GetSongGroupColor(params.SongGroup)
|
||||
end
|
||||
end
|
||||
|
||||
self:diffuse(color);
|
||||
end;
|
||||
};
|
||||
|
||||
LoadFont("_impact 50px")..{
|
||||
Name="GroupName";
|
||||
InitCommand=cmd(shadowlength,0;Stroke,color("#000000");maxwidth,210);
|
||||
SetMessageCommand=function(self,params)
|
||||
text = params.SongGroup
|
||||
self:settext(text);
|
||||
end;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
return Def.ActorFrame {
|
||||
Draw.RoundBox(276,212,20,20,color("#323232"));
|
||||
Def.Banner {
|
||||
Name="SongBanner";
|
||||
InitCommand=cmd(scaletoclipped,256,192);
|
||||
SetMessageCommand=function(self,params)
|
||||
local path = params.Song:GetBannerPath()
|
||||
if not path then path = THEME:GetPathG("Common","fallback banner") end
|
||||
|
||||
local bHighResTextures = PREFSMAN:GetPreference("HighResolutionTextures")
|
||||
|
||||
--banner loading stuff...
|
||||
--is on
|
||||
if bHighResTextures == 'HighResolutionTextures_ForceOn' or GetUserPrefB("goodbanners") then
|
||||
self:LoadFromSong(params.Song);
|
||||
--is off
|
||||
elseif bHighResTextures == 'HighResolutionTextures_ForceOff' then
|
||||
self:LoadFromCachedBanner(path);
|
||||
--is auto
|
||||
elseif bHighResTextures == 'HighResolutionTextures_Auto' then
|
||||
local iWidth = DISPLAY:GetDisplayHeight()
|
||||
--display is over ninethousand eh... 480
|
||||
if iWidth > 480 then
|
||||
self:LoadFromSong(params.Song);
|
||||
--display is 480 or less
|
||||
else
|
||||
self:LoadFromCachedBanner(path);
|
||||
end
|
||||
end
|
||||
end;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
_blank
|
||||
@@ -0,0 +1,120 @@
|
||||
--Sí, ando usando judge premiere para el themekit ¿Y qué?
|
||||
local player = Var "Player"
|
||||
-- blah
|
||||
--if not getenv then getenv = function() return false end end
|
||||
|
||||
--frame correspondiente de cada judgment
|
||||
local TNSframe = {
|
||||
TapNoteScore_CheckpointHit = 0;
|
||||
TapNoteScore_W1 = 0;
|
||||
TapNoteScore_W2 = 0;
|
||||
TapNoteScore_W3 = 1;
|
||||
TapNoteScore_W4 = 2;
|
||||
TapNoteScore_W5 = 3;
|
||||
TapNoteScore_Miss = 4;
|
||||
TapNoteScore_CheckpointMiss = 4;
|
||||
}
|
||||
|
||||
--frames para RG
|
||||
local TNSframeReversed = {
|
||||
TapNoteScore_CheckpointHit = 4;
|
||||
TapNoteScore_W1 = 4;
|
||||
TapNoteScore_W2 = 4;
|
||||
TapNoteScore_W3 = 3;
|
||||
TapNoteScore_W4 = 2;
|
||||
TapNoteScore_W5 = 1;
|
||||
TapNoteScore_Miss = 0;
|
||||
TapNoteScore_CheckpointMiss = 0;
|
||||
}
|
||||
|
||||
return Def.ActorFrame {
|
||||
--init
|
||||
InitCommand=function(self)
|
||||
local this = self:GetChildren()
|
||||
this.judgm:pause();
|
||||
|
||||
--this.judgm:y(-35);
|
||||
--this.combo:y(42);
|
||||
|
||||
this.combo:vertalign(top);
|
||||
this.label:vertalign(top);
|
||||
|
||||
this.judgm:visible(false);
|
||||
this.combo:visible(false);
|
||||
this.label:visible(false);
|
||||
|
||||
--self:runcommandsonleaves(cmd( SetTextureFiltering,false ))
|
||||
end;
|
||||
|
||||
--judges
|
||||
LoadActor("judge")..{
|
||||
Name="judgm";
|
||||
NormalCommand=cmd(shadowlength,0;diffusealpha,1;zoomx,0.913;zoomy,1.175;decelerate,0.175;zoomx,0.62;zoomy,0.78;accelerate,0.06;zoomx,0.63;zoomy,0.82;sleep,0.04;diffusealpha,0.5;zoomx,0.97;zoomy,0.82;sleep,0.04;zoomx,0.63;zoomy,0.82;decelerate,0.175;zoomx,0.82;zoomy,0.82;diffusealpha,0)
|
||||
};
|
||||
--label
|
||||
LoadActor("label")..{
|
||||
Name="label";
|
||||
NormalCommand=cmd(shadowlength,0;diffusealpha,1;zoomx,1.58;zoomy,1.6;y,100;decelerate,0.175;zoomx,1.09;zoomy,1.1;y,70;accelerate,0.06;zoomx,1.14;zoomy,1.1;y,71;sleep,0.04;diffusealpha,0.5;zoomx,1.66;zoomy,1.1;sleep,0.04;zoomx,1.14;zoomy,1.1;decelerate,0.175;zoomx,1.34;zoomy,1.1;diffusealpha,0)
|
||||
};
|
||||
--combo
|
||||
LoadFont("combo")..{
|
||||
Name="combo";
|
||||
NormalCommand=cmd(shadowlength,0;diffusealpha,1;zoomx,1.58;zoomy,1.6;y,30;decelerate,0.175;zoomx,1.09;zoomy,1.1;y,21;accelerate,0.06;zoomx,1.14;zoomy,1.1;y,22;sleep,0.04;diffusealpha,0.5;zoomx,1.66;zoomy,1.1;sleep,0.04;zoomx,1.14;zoomy,1.1;decelerate,0.175;zoomx,1.34;zoomy,1.1;diffusealpha,0)
|
||||
};
|
||||
|
||||
--"PERFECT"!
|
||||
JudgmentMessageCommand=function(self,param)
|
||||
local this = self:GetChildren()
|
||||
local iTns = TNSframe[param.TapNoteScore]
|
||||
|
||||
if getenv("ReverseGrade"..player) then
|
||||
iTns = TNSframeReversed[param.TapNoteScore]
|
||||
end
|
||||
|
||||
--no player, no job
|
||||
if param.Player ~= player then return end
|
||||
if param.HoldNoteScore then return end
|
||||
|
||||
this.judgm:visible(true);
|
||||
this.judgm:setstate(iTns);
|
||||
--this.combo:visible(true);
|
||||
--this.label:visible(true);
|
||||
|
||||
this.judgm:stoptweening();
|
||||
this.judgm:queuecommand("Normal");
|
||||
end;
|
||||
|
||||
ComboCommand=function(self,param)
|
||||
local this = self:GetChildren()
|
||||
local combo = param.Misses or param.Combo;
|
||||
|
||||
--color misses o RG
|
||||
local ccolor
|
||||
if param.Misses then
|
||||
ccolor = color("1,0,0,1");
|
||||
--GradeReverse, combo misses no rojo
|
||||
--puedes cambiar userprefs por getenv
|
||||
if getenv("ReverseGrade"..player) then
|
||||
ccolor = color("1,1,1,1");
|
||||
end
|
||||
else
|
||||
ccolor = color("1,1,1,1");
|
||||
--GradeReverse, combo rojo
|
||||
if getenv("ReverseGrade"..player) then
|
||||
ccolor = color("1,0,0,1");
|
||||
end
|
||||
end;
|
||||
|
||||
--visibilidad
|
||||
this.combo:visible(combo >= 4);
|
||||
this.combo:stoptweening();
|
||||
this.combo:settextf("%03i",combo);
|
||||
this.combo:diffuse(ccolor);
|
||||
this.combo:queuecommand("Normal");
|
||||
|
||||
this.label:visible(combo >= 4);
|
||||
this.label:stoptweening();
|
||||
this.label:diffuse(ccolor);
|
||||
this.label:queuecommand("Normal");
|
||||
end;
|
||||
}
|
||||
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 914 B |
@@ -0,0 +1,6 @@
|
||||
return LoadFont("Common", "Normal")..{
|
||||
Text="EXIT";
|
||||
InitCommand=cmd(CenterX);
|
||||
GainFocusCommand=cmd(diffuse,color("#FF0000"));
|
||||
LoseFocusCommand=cmd(diffuse,color("#FFFFFF"));
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
local gc = Var("GameCommand");
|
||||
|
||||
return Def.ActorFrame {
|
||||
InitCommand=function(self)
|
||||
local this = self:GetChildren()
|
||||
this.ttf:settext(gc:GetText());
|
||||
this.ttf:Stroke(color("#000000"));
|
||||
this.ttf:diffuse(color("#ffffff"));
|
||||
--this.bkg:zoomto(150,40);
|
||||
--this.bkg:diffuse(color("#c0c0c0"));
|
||||
--this.bkg:fadeleft(0.2);
|
||||
--this.bkg:faderight(0.2);
|
||||
end;
|
||||
--GainFocusCommand=cmd(stoptweening;zoom,1.2);
|
||||
--LoseFocusCommand=cmd(stoptweening;zoom,1.0);
|
||||
--Def.Quad { Name="bkg" };
|
||||
LoadFont("_arial", "black 20px")..{ Name="ttf" };
|
||||
};
|
||||
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 19 KiB |
@@ -0,0 +1,57 @@
|
||||
[Common]
|
||||
WindowTitle=THEMEKIT PIU
|
||||
|
||||
[Judgment]
|
||||
W1=TERRIFIC
|
||||
W2=PERFECT
|
||||
W3=GREAT
|
||||
W4=GOOD
|
||||
W5=BAD
|
||||
Miss=MISS
|
||||
|
||||
[OptionTitles]
|
||||
OptionsMode=Options Type
|
||||
|
||||
[OptionExplanations]
|
||||
OptionsMode=magic
|
||||
|
||||
[OptionNames]
|
||||
0.5x=0.5x
|
||||
1.5x=1.5x
|
||||
1x=1x
|
||||
2x=2x
|
||||
3x=3x
|
||||
4x=4x
|
||||
5x=5x
|
||||
6x=6x
|
||||
7x=7x
|
||||
8x=8x
|
||||
|
||||
Speed=Speed
|
||||
Noteskins=Noteskins
|
||||
FadeNotes=Fade Notes
|
||||
Scroll=Scroll
|
||||
Effect=Effect
|
||||
Receptor=Receptor
|
||||
ResetOptions=Reset Options
|
||||
|
||||
Vanish=Vanish
|
||||
RndVanish=Random Vanish
|
||||
Appear=Appear
|
||||
Nonstep=Nonstep
|
||||
|
||||
Accel=Acceleration
|
||||
Decel=Deceleration
|
||||
Worm=EarthWorm
|
||||
|
||||
Spin=Spin
|
||||
Snake=Snake
|
||||
Drift=Drift
|
||||
Shrink=Shrink
|
||||
Jumps=Jumps
|
||||
|
||||
Freedom=Freedom
|
||||
Center=Center
|
||||
|
||||
Codes=Custom Code Detector
|
||||
OptionsList=Custom Options List
|
||||
@@ -0,0 +1,18 @@
|
||||
ThemeInfo = {
|
||||
Name="_Themekit_PIU";
|
||||
Version="pretty much final";
|
||||
Code="DSMT-PIUKIT";
|
||||
Date = {31,7,2010};
|
||||
};
|
||||
|
||||
WORKING_VERSION = (ProductVersion() == "v1.0 rc2")
|
||||
|
||||
if GetUserPrefB("OptionsMode") == nil then
|
||||
SetUserPref("OptionsMode", false)
|
||||
end
|
||||
|
||||
--no anda así, mejor uso pantallas
|
||||
--assert(SSC and WORKING_VERSION, "El Themekit PIU es compatible sólo con SM-SSC")
|
||||
|
||||
--not working like this, better use screens
|
||||
--assert(SSC and WORKING_VERSION, "Themekit PIU is compatible only with SM-SSC RC1.5")
|
||||
@@ -0,0 +1,350 @@
|
||||
--moved here for portability sake
|
||||
--[[--------------------------------------------------------------------------
|
||||
Custom Code Detector by Daisuke Master
|
||||
------------------------------------------------------------------------------
|
||||
-= Whats this? =-
|
||||
Just that, a custom codedetector, you can add the codenames as exact mods
|
||||
and this thingy will do whatever you wanted to do with the oh-so-known
|
||||
harcoded codedetector.
|
||||
I kind of don't like the codedetector for various reasons, that's why I made
|
||||
this (also the remaining stuff happened by accident lol), anyway, if you feel
|
||||
like wanting this in your theme, go ahead! no problem, just let me know that
|
||||
you're using it and that this was useful for you ^^
|
||||
|
||||
-= How to use =-
|
||||
First of all, put this lua module under the Scripts folder of your theme.
|
||||
Using codeset, put this in a CodeMessageCommand, inside a function command,
|
||||
under ScreenSelectMusic, like this:
|
||||
|
||||
<code>
|
||||
CodeMessageCommand=function(self)
|
||||
CustomCodeDetector()
|
||||
end;
|
||||
</code>
|
||||
|
||||
You'll need codename and player to be passed as arguments, you can get those
|
||||
somewhere:
|
||||
|
||||
<code>
|
||||
CodeMessageCommand=function(self,params)
|
||||
CustomCodeDetector(params.Name, params.PlayerNumber)
|
||||
end;
|
||||
</code>
|
||||
|
||||
If you like to be classy like me:
|
||||
|
||||
<code>
|
||||
CodeMessageCommand=function(self,params)
|
||||
local code = params.Name
|
||||
local player = params.PlayerNumber
|
||||
if not GAMESTATE:IsHumanPlayer(player) then return end;
|
||||
|
||||
CustomCodeDetector(code, player)
|
||||
end;
|
||||
</code>
|
||||
|
||||
Niceties:
|
||||
|
||||
<code>
|
||||
CodeMessageCommand=function(self,params)
|
||||
local code = params.Name
|
||||
local player = params.PlayerNumber
|
||||
if not GAMESTATE:IsHumanPlayer(player) then return end;
|
||||
|
||||
if CustomCodeDetector(code, player, true) then
|
||||
--idk what to put here so eh...
|
||||
else
|
||||
--handle here other codes for misc purposes
|
||||
end
|
||||
|
||||
SOUND:PlayOnce(THEME:GetPathS("ScreenSelectMusic","Options"))
|
||||
end;
|
||||
</code>
|
||||
Extras: you can set a third param as true to deactivate sound and
|
||||
the message broadcast to handle those outside (example above)
|
||||
|
||||
What more? Oh yes, you'll need a CodeNames line under ScreenSelectMusic
|
||||
|
||||
<code>
|
||||
[ScreenSelectMusic]
|
||||
CodeNames="Noteskin,Speed,Cancel,Dark,Mirror"
|
||||
;main codes
|
||||
CodeNoteskin="Up,Up,Down,Down,Left,Right,Left,Right"
|
||||
CodeSpeed="Left,Right,Left,Right,Down"
|
||||
CodeCancel="Select,Select"
|
||||
;secondary codes
|
||||
CodeDark="Down,Down,Left,Right,Down"
|
||||
CodeMirror="Down,Left,Up,Down,Right,Up"
|
||||
</code>
|
||||
|
||||
The first three (speed, noteskin and cancle er... cancel) are mandatory, the
|
||||
rest are optional (dark and mirror as examples)
|
||||
|
||||
-= Caveats =-
|
||||
*I don't know what will happen if illegal modifiers are set into the CodeNames
|
||||
line under ScreenSelectMusic, so try at your own risk (not that anything bad
|
||||
but a crash may happen, I don't know so I'm just warning you).
|
||||
*I don't know what will happen if you add percentages and/or approach into the
|
||||
modifiers (for example >Code50% tornado="@Right-Up")
|
||||
*Ignore the previous two points, I just added a mod validator function, if your
|
||||
mod does not exists there just add it.
|
||||
*You just can't set multiple modifiers in one code because of how codes are
|
||||
separated (by commas)
|
||||
*FOR PUMP-SM USERS: Watch out when using center as part of your code, it's
|
||||
treated as start button and you know what happens when you press start,
|
||||
solution: you can use two part selection in metrics along with twopart
|
||||
confirms only so you can doublepress center with no problems, remember that
|
||||
only sm-ssc can do that (goes the same to ez2/popn users with footdown/red
|
||||
buttons).
|
||||
*Don't try weird things with this.
|
||||
|
||||
-= TODO list =-
|
||||
*Previous speed and noteskins
|
||||
*Go lazy and lowercase GetPlayerOptions
|
||||
*Be able to put multiple mods in one code
|
||||
|
||||
-= Licensing =-
|
||||
IMO it's important, I don't like to see my work being hijacked by someone else
|
||||
and claiming as it's own (others don't like that either) so here we go:
|
||||
|
||||
I'm licensing this under Creative Commons by-sa 3.0
|
||||
http://creativecommons.org/licenses/by-sa/3.0/
|
||||
|
||||
This means that:
|
||||
|
||||
You can share and adapt this code as you like/need/want withouth worry, but
|
||||
you must attribute me, and if you release your modified work you must license
|
||||
it with the same license as this.
|
||||
|
||||
-= Credits =-
|
||||
ºDaisuMaster
|
||||
|
||||
-= Thanks =-
|
||||
ºmain stepmania devteam (they created SM)
|
||||
ºsm-ssc devteam (they forked sm4 and tweaked it in an astounding way)
|
||||
ºcesarmades (this guy inspired me somehow)
|
||||
|
||||
-= Final notes =-
|
||||
That's all you should need to know for now, and as I said, feel free to use
|
||||
this and let me know if this was useful for you ^^
|
||||
--]]--------------------------------------------------------------------------
|
||||
function ReadSpeedMods()
|
||||
--this reads speeds from a file (Cmods are not allowed, I don't like to
|
||||
--deal with these)
|
||||
local dir = THEME:GetCurrentThemeDirectory() .. "speeds.txt"
|
||||
local speeds = File.Read( dir )
|
||||
if not speeds then
|
||||
speeds = {"1x","2x","3x","4x","5x","8x"}
|
||||
speeds = join("\r\n",speeds)
|
||||
File.Write( dir , speeds)
|
||||
return speeds
|
||||
end
|
||||
|
||||
speeds = string.gsub(speeds,"\r","")
|
||||
speeds = split("\n", speeds)
|
||||
|
||||
--[[local rebuild = false
|
||||
for k,v in ipairs(speeds) do
|
||||
if not string.find(v,"%dx") or not string.find(v,"%%d.dx") then
|
||||
rebuild = true
|
||||
table.remove(speed,k)
|
||||
end
|
||||
end
|
||||
if rebuild then
|
||||
--cleanup
|
||||
File.Write( dir , join("\r\n",speeds))
|
||||
end]]
|
||||
|
||||
return speeds
|
||||
end
|
||||
|
||||
local function IsValidMod(m)
|
||||
--check mods here, see PlayerOptions.cpp if you want/need more
|
||||
--throwing the most common/used here
|
||||
--todo: regex formats and bind the mods into a table so setups like 50% dark would work
|
||||
if m == "Boost"
|
||||
or m == "Brake"
|
||||
or m == "Wave"
|
||||
or m == "Expand"
|
||||
or m == "Boomerang"
|
||||
or m == "Drunk"
|
||||
or m == "Dizzy"
|
||||
or m == "Confusion"
|
||||
or m == "Mini"
|
||||
or m == "Tiny"
|
||||
or m == "Flip"
|
||||
or m == "Invert"
|
||||
or m == "Tornado"
|
||||
or m == "Tipsy"
|
||||
or m == "Bumpy"
|
||||
or m == "Beat"
|
||||
or m == "XMode"
|
||||
or m == "Hidden"
|
||||
or m == "Sudden"
|
||||
or m == "Stealth"
|
||||
or m == "Blink"
|
||||
or m == "RandomVanish"
|
||||
or m == "Reverse"
|
||||
or m == "Split"
|
||||
or m == "Alternate"
|
||||
or m == "Cross"
|
||||
or m == "Centered"
|
||||
or m == "Dark"
|
||||
or m == "RandomAttacks"
|
||||
or m == "SongAttacks"
|
||||
or m == "PlayerAutoPlay"
|
||||
or m == "Mirror"
|
||||
or m == "Left"
|
||||
or m == "Right"
|
||||
or m == "Shuffle"
|
||||
or m == "SoftShuffle"
|
||||
or m == "SuperShuffle"
|
||||
then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
--local function Tracef(...) Trace(string.format(...)) end
|
||||
|
||||
function CustomCodeDetector(code,player,sound_and_broadcast)
|
||||
assert(code,"[CUSTOMCODEDETECTOR]: an input code must be given.")
|
||||
assert(player, "[CUSTOMCODEDETECTOR]: a player number must be given.")
|
||||
if sound_and_broadcast then
|
||||
Trace("[CUSTOMCODEDETECTOR]: playeroptions message broadcast and sound playback are deactivated")
|
||||
end
|
||||
--playerstates lets you get and set modifiers per player via lua
|
||||
local playerstate = GAMESTATE:GetPlayerState(player)
|
||||
--nice, I didn't knew that playermods could be get as an array.
|
||||
local playermods = playerstate:GetPlayerOptionsArray('ModsLevel_Preferred')
|
||||
--local playermods = playerstate:GetPlayerOptions('ModsLevel_Preferred')
|
||||
--playermods = split(", ",playermods)
|
||||
|
||||
local noteskins = NOTESKIN:GetNoteSkinNames()
|
||||
if not noteskins then noteskins = {"default"} end
|
||||
--woot! noteskins via codes!! and not hardcoded!!! :awesome:
|
||||
--dang, I forgot that GetNoteSkinNames works only in sm-ssc
|
||||
if code == "Noteskin" and SSC then
|
||||
|
||||
--do changes here
|
||||
local found = false
|
||||
--iterate every noteskin in every playermod
|
||||
for i,j in ipairs(playermods) do
|
||||
for k,l in ipairs(noteskins) do
|
||||
--we got a match
|
||||
if j == l then
|
||||
found = true
|
||||
local index = k+1
|
||||
--avoiding overflow
|
||||
if index > #noteskins then index = 1 end
|
||||
--replacing
|
||||
Tracef("[CUSTOMCODEDETECTOR]: Setting noteskin '%s' in place of '%s'", noteskins[index], playermods[i])
|
||||
playermods[i] = noteskins[index]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--no matches
|
||||
if not found then
|
||||
for k,v in ipairs(noteskins) do
|
||||
if string.lower(v) == "default" then
|
||||
--set the one next to default or the first if it's the last
|
||||
local idx = k+1
|
||||
if idx > #noteskins then idx = 1 end
|
||||
Tracef("[CUSTOMCODEDETECTOR]: Setting noteskin '%s'", noteskins[idx])
|
||||
table.insert(playermods, noteskins[idx])
|
||||
end
|
||||
end
|
||||
end
|
||||
--like notekins but with speeds
|
||||
elseif code == "Speed" then
|
||||
--read your speeds from a file (by theme)
|
||||
--local speeds = { "1x","2x","3x","4x","5x" }
|
||||
local speeds = ReadSpeedMods()
|
||||
local found = false
|
||||
|
||||
for i,j in ipairs(playermods) do
|
||||
for k,l in ipairs(speeds) do
|
||||
if j == l then
|
||||
found = true
|
||||
local index = k+1
|
||||
if index > #speeds then index = 1 end
|
||||
Tracef("[CUSTOMCODEDETECTOR]: Setting speedmod '%s' in place of '%s'", speeds[index], playermods[i])
|
||||
playermods[i] = speeds[index]
|
||||
end
|
||||
end
|
||||
end
|
||||
if not found then
|
||||
--most likely is a 1x, set the next
|
||||
for k,v in ipairs(speeds) do
|
||||
if v == "1x" then
|
||||
local idx = k+1
|
||||
if idx > #speeds then idx = 1 end
|
||||
Tracef("[CUSTOMCODEDETECTOR]: Setting speedmod '%s'", speeds[idx])
|
||||
table.insert(playermods, speeds[idx])
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif code == "Cancel" then
|
||||
local defaultmods = PREFSMAN:GetPreference("DefaultModifiers")
|
||||
defaultmods = split(",", defaultmods)
|
||||
--set 1x and clear other mods, also default noteskin (along with the default mods)
|
||||
playermods = { "1x","default" }
|
||||
for k,v in ipairs(defaultmods) do
|
||||
table.insert(playermods, v)
|
||||
end
|
||||
else
|
||||
if IsValidMod(code) then
|
||||
--other mod codes, code name must be the exact mod
|
||||
local found = false
|
||||
for i,j in ipairs(playermods) do
|
||||
if j == code then
|
||||
--remove it
|
||||
found = true
|
||||
Tracef("[CUSTOMCODEDETECTOR]: Setting modifier '%s'", code)
|
||||
table.remove(playermods, i)
|
||||
end
|
||||
end
|
||||
|
||||
if not found then
|
||||
Tracef("[CUSTOMCODEDETECTOR]: Unsetting modifier '%s'", code)
|
||||
table.insert(playermods, code)
|
||||
end
|
||||
else
|
||||
--SOUND:PlayOnce(THEME:GetPathS("MusicWheel","locked"))
|
||||
Tracef("[CUSTOMCODEDETECTOR]: The mod '%s' could not be set", code)
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
--let's check if noteskins aren't missing (we're avoiding crashes here...)
|
||||
local found = false
|
||||
--iterate again uh
|
||||
for i,j in ipairs(playermods) do
|
||||
for k,l in ipairs(noteskins) do
|
||||
if j == l then
|
||||
found = true
|
||||
end
|
||||
end
|
||||
end
|
||||
--apparently there aren't any noteskins...
|
||||
if not found then
|
||||
table.insert(playermods, "default")
|
||||
end
|
||||
|
||||
--join
|
||||
playermods = join(", ",playermods)
|
||||
|
||||
--set the mods
|
||||
playerstate:SetPlayerOptions('ModsLevel_Preferred',playermods)
|
||||
--optional stuff
|
||||
if not sound_and_broadcast then
|
||||
--play some sound
|
||||
SOUND:PlayOnce(THEME:GetPathS("ScreenSelectMusic","Options"))
|
||||
--send some message
|
||||
MESSAGEMAN:Broadcast("PlayerOptionsChanged", { PlayerNumber = player })
|
||||
end
|
||||
--if we get here then everything went just fine
|
||||
return true
|
||||
end
|
||||
@@ -0,0 +1,252 @@
|
||||
--[[--------------------------------------------------------------------------
|
||||
Shape Drawing module by Daisuke Master
|
||||
------------------------------------------------------------------------------
|
||||
-= What's this? =-
|
||||
Those are functions that can draw some basic shapes
|
||||
|
||||
-= How to use =-
|
||||
Add them as layers
|
||||
|
||||
<code>
|
||||
Def.ActorFrame {
|
||||
Draw.RoundBox(410,310,20,20,color(#000000));
|
||||
Draw.RoundBox(400,300,10,10);
|
||||
Draw.Box(256,64,color("#ffcc66"))..{
|
||||
InitCommand=cmd(y,-300);
|
||||
};
|
||||
}
|
||||
</code>
|
||||
|
||||
You'll need graphics included under Graphics/_shapes for the roundboxes and
|
||||
ovals (a 1000x1000 circle, 500x500 quarter circle and 1000x850 triangle)
|
||||
|
||||
The neatest thing about those things is that those are overloaded:
|
||||
|
||||
ºBoxesº (pretty much same as quads but without the need of using initcommand
|
||||
every fucking time to resize them, color them and agh!...)
|
||||
Draw.Box(width) <-- this will make a blank square (it says blank not black)
|
||||
Draw.Box(width,color) <-- this will make a colored square
|
||||
Draw.Box(width,height) <------------ Rectangles!
|
||||
Draw.Box(width,height,color) <--/
|
||||
|
||||
ºTrianglesº (BROKEN)
|
||||
Draw.Triangle(base) <-- this will make an equilateral blank trine
|
||||
Draw.Triangle(base,color) <-- colored equilateral trine
|
||||
Draw.Triangle(base,height)
|
||||
Draw.Triangle(base,height,color)
|
||||
Draw.Triangle(base,height,point)
|
||||
Draw.Triangle(base,height,point,color)
|
||||
--planned/impossible
|
||||
Draw.Triangle(base,point,color) <-- sorry, I can't figure how to do this
|
||||
(maybe if I use negative values...)
|
||||
Draw.Triangle(base,skew) <-- rect/irregular trines
|
||||
Draw.Triangle(base,skew,color)
|
||||
--the point should be in 0..1 range
|
||||
|
||||
ºRoundBoxesº (cute rounded boxes, better than sharp edged boxes)
|
||||
Draw.RoundBox(width,height)
|
||||
Draw.RoundBox(width,height,color)
|
||||
Draw.RoundBox(width,height,radius)
|
||||
Draw.RoundBox(width,height,radius,color)
|
||||
Draw.RoundBox(width,height,horiz_radius,vert_radius,color)
|
||||
|
||||
ºOvals/Circlesº (yes, figures)
|
||||
Draw.Oval(radius)
|
||||
Draw.Oval(radius,color)
|
||||
Draw.Oval(radius1,radius2)
|
||||
Draw.Oval(radius1,radius2,color)
|
||||
|
||||
ºLinesº (not yet)
|
||||
how it's (supposed to be) drawn:
|
||||
S = start
|
||||
E = end
|
||||
dash,slash,backslash,bar = line body
|
||||
|
||||
Draw.Line(4,0,0,4)
|
||||
E
|
||||
/
|
||||
/
|
||||
/
|
||||
S
|
||||
|
||||
Draw.Line(0,0,4,0)
|
||||
S---E
|
||||
|
||||
Draw.Line(0,0,4,4)
|
||||
S
|
||||
\
|
||||
\
|
||||
\
|
||||
E
|
||||
|
||||
Draw.Line(0,0,0,4)
|
||||
S
|
||||
|
|
||||
|
|
||||
|
|
||||
E
|
||||
|
||||
lines are pending...
|
||||
--]]--------------------------------------------------------------------------
|
||||
|
||||
Draw = {
|
||||
Box = function(w,...)
|
||||
assert(w)
|
||||
local h,c = ...
|
||||
if not h and not c then
|
||||
h = w
|
||||
c = color("#ffffff")
|
||||
elseif not c then
|
||||
if type(h) == "number" then
|
||||
c = color("#ffffff")
|
||||
else
|
||||
c = h
|
||||
h = w
|
||||
end
|
||||
end
|
||||
--option
|
||||
--if not h then h = w end
|
||||
--if not c then c = color("#ffffff") end
|
||||
return Def.Quad {
|
||||
InitCommand=function(self)
|
||||
self:basezoomx(w);
|
||||
self:basezoomy(h);
|
||||
self:diffuse(c);
|
||||
end;
|
||||
};
|
||||
end;
|
||||
Triangle = function(b,h,p,c)
|
||||
--I'M BROKEN
|
||||
assert(b)
|
||||
assert(h)
|
||||
assert(p)
|
||||
assert(c)
|
||||
--local h,p,c = ...
|
||||
|
||||
return LoadActor(THEME:GetPathG("","_Figures/triangle.png"))..{
|
||||
InitCommand=function(self)
|
||||
local base = self:GetWidth()
|
||||
local height = self:GetHeight()
|
||||
local xzoom = scale(b,0,base,0,1)
|
||||
local yzoom = scale(h,0,height,0,1)
|
||||
local rot = scale(p,0,1,0,360)
|
||||
self:basezoomx(xzoom);
|
||||
self:basezoomx(yzoom);
|
||||
self:baserotationz(rot);
|
||||
self:diffuse(c);
|
||||
end;
|
||||
};
|
||||
end;
|
||||
--I had to take a small glance into optical's roundbox code to do this...
|
||||
RoundBox = function(w,h,...)
|
||||
assert(w)
|
||||
assert(h)
|
||||
--grab color and radii from arguments
|
||||
local hr,vr,c = ...
|
||||
if not hr and not vr and not c then
|
||||
hr = 10
|
||||
vr = 10
|
||||
c = color("#ffffff")
|
||||
elseif not vr and not c then
|
||||
if type(hr) == "number" then
|
||||
vr = hr
|
||||
c = color("#ffffff")
|
||||
else
|
||||
c = hr
|
||||
hr = 10
|
||||
vr = 10
|
||||
end
|
||||
elseif not c then
|
||||
if type(vr) == "number" then
|
||||
c = color("#ffffff")
|
||||
else
|
||||
c = vr
|
||||
vr = hr
|
||||
end
|
||||
end
|
||||
--horizontal radius can't overflow the half of the width and can't be
|
||||
--below zero, same with vertical radius
|
||||
hr = clamp(hr,0,w/2)
|
||||
vr = clamp(vr,0,h/2)
|
||||
|
||||
local corner = LoadActor(THEME:GetPathG("","_Figures/corner.png"))..{
|
||||
InitCommand=function(self)
|
||||
local width = self:GetWidth()
|
||||
local height = self:GetHeight()
|
||||
local xpixels = scale(hr,0,width,0,1)
|
||||
local ypixels = scale(vr,0,height,0,1)
|
||||
self:basezoomx(xpixels)
|
||||
self:basezoomy(ypixels)
|
||||
end;
|
||||
};
|
||||
|
||||
return Def.ActorFrame {
|
||||
InitCommand=function(self)
|
||||
--this's pretty a shitload of operations...
|
||||
self:GetChild("Top"):y(-h/2+vr/2);
|
||||
self:GetChild("Bottom"):y(h/2-vr/2);
|
||||
--also here
|
||||
self:GetChild("TopLeft"):xy(-w/2+hr/2,-h/2+vr/2);
|
||||
self:GetChild("TopRight"):xy(w/2-hr/2,-h/2+vr/2);
|
||||
self:GetChild("BottomLeft"):xy(-w/2+hr/2,h/2-vr/2);
|
||||
self:GetChild("BottomRight"):xy(w/2-hr/2,h/2-vr/2);
|
||||
--coloree :3
|
||||
self:runcommandsonleaves(cmd(diffuse,c))
|
||||
end;
|
||||
--lol sound effects
|
||||
--wrrr whrr wrrr
|
||||
Draw.Box(w-hr-hr,vr,c)..{Name="Top"};
|
||||
Draw.Box(w,h-vr-vr,c)..{Name="Middle"};
|
||||
Draw.Box(w-hr-hr,vr,c)..{Name="Bottom"};
|
||||
--corners
|
||||
corner..{ Name="TopLeft"; };
|
||||
corner..{ Name="TopRight"; BaseRotationY=180; };
|
||||
corner..{ Name="BottomLeft"; BaseRotationX=180; };
|
||||
corner..{ Name="BottomRight"; BaseRotationX=180; BaseRotationY=180; };
|
||||
}
|
||||
end;
|
||||
Oval = function(w,...)
|
||||
assert(w)
|
||||
local h,c = ...
|
||||
if not h and not c then
|
||||
h = w
|
||||
c = color("#ffffff")
|
||||
elseif not c then
|
||||
color("#ffffff")
|
||||
if type(h) == "number" then
|
||||
c = color("#ffffff")
|
||||
else
|
||||
c = h
|
||||
h = w
|
||||
end
|
||||
end
|
||||
return LoadActor(THEME:GetPathG("","_Figures/circle.png"))..{
|
||||
InitCommand=function(self)
|
||||
--self:SetTextureFiltering(false);
|
||||
local width = self:GetWidth()
|
||||
local height = self:GetHeight()
|
||||
local xzoom = scale(w,0,width,0,1)
|
||||
local yzoom = scale(h,0,height,0,1)
|
||||
self:diffuse(c);
|
||||
self:basezoomx(xzoom);
|
||||
self:basezoomy(yzoom);
|
||||
end;
|
||||
};
|
||||
end;
|
||||
Line = function(x1,x2,y1,y2,c)
|
||||
assert(x1)
|
||||
assert(x2)
|
||||
assert(y1)
|
||||
assert(y2)
|
||||
|
||||
return Def.Quad {
|
||||
InitCommand=function(self)
|
||||
self:horizalign(left);
|
||||
self:xy(x1,y1);
|
||||
self:zoomto(1,1);
|
||||
self:rotationz(0);
|
||||
self:diffuse(c);
|
||||
end;
|
||||
};
|
||||
end
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
--iniread
|
||||
--references: http://lua.pastebin.com/fef286
|
||||
|
||||
--[[function FirstCharMatch(text,pattern)
|
||||
local count = 1
|
||||
while true do
|
||||
if string.sub(text,count,count) == pattern then
|
||||
return count
|
||||
end
|
||||
count = count+1
|
||||
end
|
||||
end]]
|
||||
|
||||
function ReadIniFile( file )
|
||||
local path = ResolveRelativePath( file, 2 )
|
||||
assert(path, file .. " was not found")
|
||||
|
||||
local inifile = File.Read( path )
|
||||
local lines = {}
|
||||
|
||||
--identify mac, unix or dos
|
||||
--mac "\r" - cr
|
||||
if string.find(inifile, "\r") ~= nil
|
||||
and string.find(inifile, "\n") == nil
|
||||
then
|
||||
lines = split("\r", inifile)
|
||||
--unix "\n" - lf
|
||||
elseif string.find(inifile, "\r") == nil
|
||||
and string.find(inifile, "\n") ~= nil
|
||||
then
|
||||
lines = split("\n", inifile)
|
||||
--dos/win "\r\n" -crlf
|
||||
elseif string.find(inifile, "\r") ~= nil
|
||||
and string.find(inifile, "\n") ~= nil
|
||||
then
|
||||
lines = split("\r\n", inifile)
|
||||
end
|
||||
|
||||
local ret = {}
|
||||
for k,v in ipairs(lines) do
|
||||
if string.sub(v,1,1) == '[' then
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
return {}
|
||||
end
|
||||
--[[--------------------
|
||||
[Section1]
|
||||
Key1=value1
|
||||
Key2=value2
|
||||
Key3=value3
|
||||
|
||||
[Section2]
|
||||
Key1=value1
|
||||
Key2=value2
|
||||
Key3=value3
|
||||
|
||||
ini = {
|
||||
Section1 = {
|
||||
Key1 = "Value1";
|
||||
Key2 = "Value2";
|
||||
Key3 = "Value3";
|
||||
};
|
||||
Section2 = {
|
||||
Key1 = "Value1";
|
||||
Key2 = "Value2";
|
||||
Key3 = "Value3";
|
||||
};
|
||||
}
|
||||
--]]--------------------
|
||||
@@ -0,0 +1,102 @@
|
||||
--SplitMode (no version)
|
||||
--[[--------------------------------------------------------------------------
|
||||
Inspired by FSX's SplitLoader (ExSongs)
|
||||
A Note: No code was stolen from FSX's script, this was completely made from
|
||||
scratch (the only stolen thing was the idea of using the description as helper
|
||||
lol) This is a minimized version, without accurate searching modes, prefs and
|
||||
stuff. This only searches for a song specified in the description and sets
|
||||
it along with the same kind of source difficulty and stepstype.
|
||||
|
||||
~{ How to use? }~
|
||||
Write into steps description:
|
||||
!SONG=<songname>
|
||||
This script will do the rest...
|
||||
|
||||
~{ Where to use? }~
|
||||
Anywhere before gameplay starts
|
||||
(Recommended: ScreenStage or ScreenStageInformation)
|
||||
|
||||
~{ TODO list }~
|
||||
>none...
|
||||
|
||||
~{ Credits }~
|
||||
FSX: he had the initial ex-songs idea, I arranged that idea to make it
|
||||
simplier and somewhat flexible
|
||||
|
||||
~{ License }~
|
||||
cc-by
|
||||
http://creativecommons.org/licenses/by/3.0/
|
||||
In a nutshell: You are free to use this freely without worry, just atribute me
|
||||
--]]--------------------------------------------------------------------------
|
||||
function SplitMode()
|
||||
local bImWorking = false
|
||||
|
||||
--local function Tracef(...) Trace(string.format(...)) end
|
||||
|
||||
--I'll work with the master player
|
||||
local masterplayer = GAMESTATE:GetMasterPlayerNumber()
|
||||
local song = GAMESTATE:GetCurrentSong()
|
||||
local step = GAMESTATE:GetCurrentSteps(masterplayer)
|
||||
local description = step:GetDescription()
|
||||
--Working for 1 player atm...
|
||||
|
||||
--if string.lower( step:GetDifficulty() ) ~= 'difficulty_edit' then
|
||||
if not step:IsAPlayerEdit() then
|
||||
if description ~= "" then
|
||||
--the description it's multipurpose
|
||||
local parts = split("|", description);
|
||||
local working = {}
|
||||
|
||||
for i=1,#parts do
|
||||
if string.find(parts[i], "!SONG") then
|
||||
--use equals as separator
|
||||
working = split("=", parts[i])
|
||||
end
|
||||
end
|
||||
|
||||
if #working == 2 then
|
||||
--two parts
|
||||
if working[1] == "!SONG" and working[2] ~= "" then
|
||||
local songtoset = SONGMAN:FindSong(working[2])
|
||||
--Lets check if there is a song...
|
||||
if songtoset ~= nil then
|
||||
local steptoset = songtoset:GetOneSteps(step:GetStepsType(), step:GetDifficulty())
|
||||
if steptoset ~= nil then
|
||||
--Yay!
|
||||
GAMESTATE:SetCurrentSong(songtoset)
|
||||
--Set MasterPlayer's steps to both players.
|
||||
for idx, player in ipairs(PlayerNumber) do
|
||||
GAMESTATE:SetCurrentSteps(player, steptoset)
|
||||
end
|
||||
bImWorking = true
|
||||
Trace("[SPLITMODE]: Split System Is Working...")
|
||||
Tracef("--> NewSong: '%s - %s'", songtoset:GetDisplayFullTitle(), songtoset:GetDisplayArtist())
|
||||
--Tracef("--> NewDifficulty: '%s'",steptoset:GetStepsType())
|
||||
--Tracef("--> NewStepType: '%s'",steptoset:GetDifficulty())
|
||||
Trace("--> Difficulty and StepsType should be the same as the source song")
|
||||
else
|
||||
Tracef("[SPLITMODE]: Steps with StepsType '%s' and Difficulty '%s' not found for the song '%s'...", step:GetStepsType(), step:GetDifficulty(), parts[2])
|
||||
--Tracef("[SPLITMODE]: No StepsType and Difficulty Match for song '%s'...", parts[2]);
|
||||
end
|
||||
else
|
||||
Tracef("[SPLITMODE]: Song '%s' not found...", working[2]);
|
||||
end
|
||||
else
|
||||
Trace("[SPLITMODE]: Do nothing: Malformed Working Part Format")
|
||||
end
|
||||
else
|
||||
Trace("[SPLITMODE]: Do nothing: Regular or Reserved Description")
|
||||
end
|
||||
else
|
||||
Trace("[SPLITMODE]: Do nothing: Empty Description")
|
||||
end
|
||||
else
|
||||
Trace("[SPLITMODE]: Do nothing: Secure Exception -> This is either an edit or a player edit")
|
||||
end
|
||||
|
||||
-- if not bImWorking then
|
||||
-- Trace("[SPLITMODE]: Not working for an unknown reason...")
|
||||
-- end
|
||||
|
||||
return bImWorking
|
||||
end
|
||||
@@ -0,0 +1,39 @@
|
||||
function GameplayNext()
|
||||
--Cuando pierdas
|
||||
if STATSMAN:GetCurStageStats():AllFailed() then
|
||||
--Pierdes, fuera
|
||||
return "ScreenStageBreak"
|
||||
--¡Pasaste!
|
||||
else
|
||||
return "ScreenEvaluationNormal"
|
||||
end
|
||||
end
|
||||
|
||||
function EvaluationNext()
|
||||
local stagesleft = GAMESTATE:GetSmallestNumStagesLeftForAnyHumanPlayer()
|
||||
if (stagesleft <= 0 or STATSMAN:GetBestGrade() >= 6) and not GAMESTATE:IsEventMode() then
|
||||
--return "ScreenGameOver"
|
||||
return "ScreenProfileSave"
|
||||
else
|
||||
return "ScreenNextStage"
|
||||
end
|
||||
end
|
||||
|
||||
function GameOverNext()
|
||||
if (GAMESTATE:GetCoinMode() == 'CoinMode_Pay' and GAMESTATE:GetCoins() > 0)
|
||||
or GAMESTATE:GetCoinMode() == 'CoinMode_Free'
|
||||
then
|
||||
return "ScreenTitleMenu"
|
||||
else
|
||||
return "ScreenInit"
|
||||
end
|
||||
end
|
||||
|
||||
function StageBreakNext()
|
||||
if GAMESTATE:IsEventMode() then
|
||||
return "ScreenSelectMusic"
|
||||
else
|
||||
--return "ScreenGameOver"
|
||||
return "ScreenProfileSave"
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,90 @@
|
||||
--[[--------------------------------------------------------------------------
|
||||
A fresh and simple way to set up OptionRows -DaisuMaster
|
||||
--]]--------------------------------------------------------------------------
|
||||
|
||||
--[[ CORE FUNCTIONS ]]--
|
||||
--{ Those must be internal only }--
|
||||
|
||||
-- Main template
|
||||
local function OptionRowTemplate(name,layout,select,onechoice,export,choices,loadfunc,savefunc)
|
||||
local t = {
|
||||
Name = name;
|
||||
LayoutType = layout;
|
||||
SelectType = select;
|
||||
OneChoiceForAllPlayers = onechoice;
|
||||
ExportOnChange = export;
|
||||
Choices = choices;
|
||||
LoadSelections = loadfunc;
|
||||
SaveSelections = savefunc;
|
||||
}
|
||||
setmetatable( t, t )
|
||||
return t
|
||||
end
|
||||
|
||||
-- Create templates for UserPreferences
|
||||
local function OptionRowUserPrefTemplate(name,choices)
|
||||
local function load(self, list, pn)
|
||||
if GetUserPrefB(name) then
|
||||
list[1] = true
|
||||
else
|
||||
list[2] = true
|
||||
end
|
||||
end
|
||||
local function save(self, list, pn)
|
||||
local bool
|
||||
if list[1] then
|
||||
bool = true
|
||||
else
|
||||
bool = false
|
||||
end
|
||||
SetUserPref(name,bool)
|
||||
end
|
||||
return OptionRowTemplate(name,"ShowAllInRow","SelectOne",true,false,choices,load,save)
|
||||
end
|
||||
|
||||
-- Same as above but for EnvUtils
|
||||
local function OptionRowEnvutilsTemplate(name,onechoice,choices)
|
||||
local function load(self, list, pn)
|
||||
if onechoice then
|
||||
setenv(name,false)
|
||||
else
|
||||
setenv(name..pn,false)
|
||||
end
|
||||
list[1] = true
|
||||
end
|
||||
local function save(self, list, pn)
|
||||
local bool
|
||||
if list[1] then
|
||||
bool = false
|
||||
else
|
||||
bool = true
|
||||
end
|
||||
if onechoice then
|
||||
setenv(name,bool)
|
||||
else
|
||||
setenv(name..pn,bool)
|
||||
end
|
||||
end
|
||||
if not choices then
|
||||
choices = {
|
||||
THEME:GetString("OptionNames","Off"),
|
||||
THEME:GetString("OptionNames","On"),
|
||||
}
|
||||
end
|
||||
return OptionRowTemplate(name,"ShowAllInRow","SelectOne",onechoice,false,choices,load,save)
|
||||
end
|
||||
|
||||
--[[ whatever else you want/like put it there (keep it clean please) ]]--
|
||||
--{ Those should be used externally }--
|
||||
|
||||
function OptionReverseGrade()
|
||||
return OptionRowEnvutilsTemplate("GradeReverse",false)
|
||||
end
|
||||
|
||||
function UserPrefOptionsMode()
|
||||
local choices = {
|
||||
THEME:GetString("OptionNames","OptionsList"),
|
||||
THEME:GetString("OptionNames","Codes"),
|
||||
}
|
||||
return OptionRowUserPrefTemplate("OptionsMode", choices)
|
||||
end
|
||||
@@ -0,0 +1,153 @@
|
||||
function StageBreak()
|
||||
if GAMESTATE:IsEventMode()
|
||||
or GAMESTATE:GetEasiestStepsDifficulty() == 'Difficulty_Beginner'
|
||||
or GAMESTATE:GetEasiestStepsDifficulty() == 'Difficulty_Easy'
|
||||
then
|
||||
return -1
|
||||
end
|
||||
|
||||
return 51
|
||||
end
|
||||
|
||||
function JudgmentTransformCommand( self, params )
|
||||
local y = 0
|
||||
|
||||
if params.bCentered then
|
||||
if params.bReverse then
|
||||
y = 100
|
||||
else
|
||||
y = -170
|
||||
end
|
||||
end
|
||||
|
||||
self:y(y)
|
||||
end
|
||||
|
||||
function Tracef(...)
|
||||
Trace(string.format(...))
|
||||
end
|
||||
|
||||
function DifficultyAndStepstypeToString( difficulty, stepstype, description )
|
||||
--safe
|
||||
difficulty = string.lower(difficulty)
|
||||
stepstype = string.lower(stepstype)
|
||||
--
|
||||
description = description == "" and "Edit" or description
|
||||
if string.find(stepstype,"double") then
|
||||
description = description.." - Double"
|
||||
else
|
||||
description = description.." - Single"
|
||||
end
|
||||
|
||||
--return {difficulty, stepstype, description}
|
||||
|
||||
local strings = {
|
||||
stepstype_pump_single = {
|
||||
difficulty_beginner = "Easy";
|
||||
difficulty_easy = "Normal";
|
||||
difficulty_medium = "Hard";
|
||||
difficulty_hard = "Crazy";
|
||||
difficulty_challenge = "Wild";
|
||||
difficulty_edit = description;
|
||||
};
|
||||
stepstype_pump_double = {
|
||||
difficulty_beginner = "Double";
|
||||
difficulty_easy = "Performance";
|
||||
difficulty_medium = "Freestyle";
|
||||
difficulty_hard = "Nightmare";
|
||||
difficulty_challenge = "Hardcore";
|
||||
difficulty_edit = description;
|
||||
};
|
||||
stepstype_pump_halfdouble = {
|
||||
--figure out more names to identify
|
||||
difficulty_beginner = "Halfdouble";
|
||||
difficulty_easy = "Halfdouble";
|
||||
difficulty_medium = "Halfdouble";
|
||||
difficulty_hard = "Halfdouble";
|
||||
difficulty_challenge = "Halfdouble";
|
||||
difficulty_edit = description;
|
||||
};
|
||||
other = {
|
||||
--touhou, sorry
|
||||
difficulty_beginner = "Easy";
|
||||
difficulty_easy = "Normal";
|
||||
difficulty_medium = "Hard";
|
||||
difficulty_hard = "Lunatic";
|
||||
difficulty_challenge = "Extra";
|
||||
difficulty_edit = description;
|
||||
};
|
||||
}
|
||||
|
||||
local game = GAMESTATE:GetCurrentGame():GetName()
|
||||
local mode = string.gsub(stepstype,game.."_","")
|
||||
mode = string.gsub(mode,"stepstype_","")
|
||||
|
||||
--if game == mode then mode = "" else mode = "-"..mode end
|
||||
|
||||
local FallbackString = string.format("%s-%s %s", game, mode, strings.other[difficulty])
|
||||
|
||||
local ret = strings[stepstype]
|
||||
if not ret then return FallbackString end
|
||||
|
||||
return ret[difficulty] or FallbackString
|
||||
end
|
||||
-->> media loaders
|
||||
function LoadSound( a, b ) return LoadActor( THEME:GetPathS(b and a or "", b or a) ) end;
|
||||
--<< end media loaders
|
||||
-->> positioning helpers (handy!)
|
||||
function Actor:FromCenterX(i)
|
||||
self:x(SCREEN_CENTER_X + i)
|
||||
end
|
||||
|
||||
function Actor:FromCenterY(i)
|
||||
self:y(SCREEN_CENTER_Y + i)
|
||||
end
|
||||
|
||||
function Actor:FromLeft(i)
|
||||
self:x(SCREEN_LEFT + i)
|
||||
end
|
||||
|
||||
function Actor:FromRight(i)
|
||||
self:x(SCREEN_RIGHT + i)
|
||||
end
|
||||
|
||||
function Actor:FromTop(i)
|
||||
self:y(SCREEN_TOP + i)
|
||||
end
|
||||
|
||||
function Actor:FromBottom(i)
|
||||
self:y(SCREEN_BOTTOM + i)
|
||||
end
|
||||
--<< end positioning helpers
|
||||
-->> scale helpers
|
||||
--like stretchto, but the values are relative to the edges
|
||||
function Actor:Rect(left, top, right, bottom)
|
||||
self:stretchto(left, top, SCREEN_RIGHT - right, SCREEN_BOTTOM - bottom);
|
||||
end
|
||||
|
||||
function Actor:Skew(x,y)
|
||||
self:skewx(x);
|
||||
self:skewy(x);
|
||||
end
|
||||
|
||||
--I wonder if it's like that...
|
||||
function Actor:SkewPixels(x,y)
|
||||
self:skewx(scale(x,0,self:GetWidth(),0,1));
|
||||
self:skewy(scale(y,0,self:GetHeight(),0,1));
|
||||
end
|
||||
--<< end scale helpers
|
||||
-->> frame set helpers
|
||||
function Sprite.FrameRange(s,f,d)
|
||||
local frames = {}
|
||||
for i=s,f do
|
||||
frames[#frames+1] = {
|
||||
Frame = i;
|
||||
Delay = d;
|
||||
};
|
||||
end
|
||||
return frames
|
||||
end
|
||||
--<< end frame set helpers
|
||||
|
||||
--Alberto Ramos
|
||||
--MIT License
|
||||
@@ -0,0 +1 @@
|
||||
_silent
|
||||
@@ -0,0 +1 @@
|
||||
2-1.ogg
|
||||
@@ -0,0 +1 @@
|
||||
_silent
|
||||
@@ -0,0 +1 @@
|
||||
3-2.ogg
|
||||
@@ -0,0 +1 @@
|
||||
3-2.ogg
|
||||
@@ -0,0 +1 @@
|
||||
3-2.ogg
|
||||
@@ -0,0 +1 @@
|
||||
B09.ogg
|
||||
@@ -0,0 +1 @@
|
||||
_silent
|
||||
@@ -0,0 +1 @@
|
||||
2-1.ogg
|
||||
@@ -0,0 +1 @@
|
||||
_silent
|
||||
@@ -0,0 +1 @@
|
||||
3-2.ogg
|
||||
@@ -0,0 +1 @@
|
||||
3-2.ogg
|
||||
@@ -0,0 +1 @@
|
||||
_silent
|
||||
@@ -0,0 +1 @@
|
||||
_silent
|
||||
@@ -0,0 +1 @@
|
||||
_silent
|
||||
@@ -0,0 +1 @@
|
||||
_silent
|
||||
@@ -0,0 +1 @@
|
||||
_silent
|
||||
@@ -0,0 +1 @@
|
||||
_silent
|
||||
@@ -0,0 +1 @@
|
||||
_silent
|
||||
@@ -0,0 +1,3 @@
|
||||
[ThemeInfo]
|
||||
DisplayName=_Themekit_PIU
|
||||
Author=DaisuMaster
|
||||
@@ -0,0 +1,553 @@
|
||||
#Themekit PIU
|
||||
#Base para hacer Themes PIU
|
||||
#Indice
|
||||
|
||||
#01# - System
|
||||
#02# - Pantallas
|
||||
#03# - Attract loop
|
||||
#04# - Gameplay loop
|
||||
#05# - Otras pantallas/debug
|
||||
|
||||
;Nota: las anotaciones en los luas están en inglés porque se me dió la gana
|
||||
|
||||
#00# - Antes de todo
|
||||
;[Global]
|
||||
;FallbackTheme=_themekit_piu
|
||||
|
||||
#01# - System
|
||||
[ArrowEffects]
|
||||
;En PIU las flechas están separadas 60 pixeles
|
||||
ArrowSpacing=60
|
||||
|
||||
[Background]
|
||||
;em, no
|
||||
ShowDancingCharacters=false
|
||||
;ala prex3 pc?
|
||||
UseStaticBackground=false
|
||||
|
||||
[Common]
|
||||
;InitialScreen="ScreenInit"
|
||||
AutoSetStyle=true
|
||||
DefaultModifiers="1x"
|
||||
StepsTypesToHide="pump-couple,dance-double,dance-couple,dance-solo,dance-routine,lights-cabinet"
|
||||
;Si no se usa, no sé siquiera por qué los pongo así
|
||||
ColorP1Command=diffuse,color("#FFFFFF")
|
||||
ColorP2Command=diffuse,color("#FFFFFF")
|
||||
|
||||
;ya no lo necesito
|
||||
[CodeDetector]
|
||||
PrevSteps1=""
|
||||
PrevSteps2=""
|
||||
NextSteps1=""
|
||||
NextSteps2=""
|
||||
|
||||
;groups
|
||||
NextGroup=""
|
||||
PrevGroup=""
|
||||
|
||||
;Sorting
|
||||
NextSort1=""
|
||||
NextSort2=""
|
||||
NextSort3=""
|
||||
NextSort4=""
|
||||
|
||||
;Demases
|
||||
ModeMenu1=""
|
||||
ModeMenu2=""
|
||||
Mirror=""
|
||||
Left=""
|
||||
Right=""
|
||||
Shuffle=""
|
||||
SuperShuffle=""
|
||||
NextTransform=""
|
||||
NextScrollSpeed=""
|
||||
PreviousScrollSpeed=""
|
||||
NextAccel=""
|
||||
NextEffect=""
|
||||
NextAppearance=""
|
||||
NextTurn=""
|
||||
Reverse=""
|
||||
HoldNotes=""
|
||||
Mines=""
|
||||
Dark=""
|
||||
CancelAll=""
|
||||
NextTheme=""
|
||||
NextTheme2=""
|
||||
NextAnnouncer=""
|
||||
NextAnnouncer2=""
|
||||
NextBannerGroup=""
|
||||
NextBannerGroup2=""
|
||||
Hidden=""
|
||||
RandomVanish=""
|
||||
SaveScreenshot1=""
|
||||
SaveScreenshot2=""
|
||||
CancelAllPlayerOptions=""
|
||||
BackInEventMode=""
|
||||
|
||||
[CustomDifficulty]
|
||||
;Screwy
|
||||
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]
|
||||
ComboIsPerRow=true
|
||||
MinScoreToContinueCombo="TapNoteScore_W3"
|
||||
MinScoreToMaintainCombo="TapNoteScore_W4"
|
||||
|
||||
[GameState]
|
||||
GradeTierForExtra1="Grade_Tier03"
|
||||
GradeTierForExtra2="Grade_Tier03"
|
||||
MinDifficultyForExtra="Difficulty_Beginner"
|
||||
|
||||
AreStagePlayerModsForced=false
|
||||
AreStageSongModsForced=false
|
||||
|
||||
AllowExtra2=false
|
||||
LockExtraStageSelection=false
|
||||
|
||||
[HoldJudgment]
|
||||
# no
|
||||
HoldJudgmentLetGoCommand=visible,false
|
||||
HoldJudgmentHeldCommand=visible,false
|
||||
|
||||
[LifeMeterBar]
|
||||
;note scores
|
||||
;ADD
|
||||
LifePercentChangeCheckpointHit=0.008
|
||||
LifePercentChangeHeld=0.000
|
||||
LifePercentChangeW1=0.008
|
||||
LifePercentChangeW2=0.008
|
||||
LifePercentChangeW3=0.004
|
||||
;STAY
|
||||
LifePercentChangeW4=0.000
|
||||
LifePercentChangeLetGo=0.000
|
||||
;SUBSTRACT
|
||||
LifePercentChangeW5=-0.040
|
||||
LifePercentChangeMiss=-0.080
|
||||
LifePercentChangeCheckpointMiss=-0.080
|
||||
;mines
|
||||
LifePercentChangeHitMine=-0.160
|
||||
|
||||
;no pierdes vida si presionas bads
|
||||
MinStayAlive="TapNoteScore_W5"
|
||||
;como no funciona de ese modo...
|
||||
LifeMultiplier=1.2
|
||||
|
||||
;la mitad desde el inicio...
|
||||
InitialValue=0.5
|
||||
|
||||
[MenuTimer]
|
||||
WarningStart=0
|
||||
WarningBeepStart=11
|
||||
|
||||
Text1OnCommand=stopeffect;stoptweening;shadowlength,0;
|
||||
Text1FormatFunction=function(fSeconds) return string.format("%02i",fSeconds) end;
|
||||
Text2OnCommand=visible,false
|
||||
|
||||
Warning0Command=
|
||||
|
||||
[MusicWheel]
|
||||
SwitchSeconds=0.1
|
||||
ShowRoulette=false
|
||||
;probando cosas...
|
||||
;coverflowish
|
||||
ItemTransformFunction=function(self,offsetFromCenter,itemIndex,numItems) \
|
||||
local x = offsetFromCenter * 250 \
|
||||
if offsetFromCenter >= 1 then \
|
||||
x = scale(offsetFromCenter+1,-1,1,-0.5,0.5) * 250 \
|
||||
elseif offsetFromCenter <= -1 then \
|
||||
x = scale(offsetFromCenter-1,-1,1,-0.5,0.5) * 250 \
|
||||
end \
|
||||
self:x( x ) \
|
||||
self:z((-clamp(math.abs(offsetFromCenter),0,1)*250)-math.abs(offsetFromCenter)) \
|
||||
self:rotationy( clamp( offsetFromCenter, -1, 1) * 90) \
|
||||
end;
|
||||
;7 items
|
||||
NumWheelItems=7
|
||||
;sólo dos por el momento, si ocupas más solo acomódalo en tu theme...
|
||||
SortOrders={ "SortOrder_Group", "SortOrder_Genre" }
|
||||
|
||||
;limpio de toda impureza... quiero discs en mi musicwheel :3
|
||||
[MusicWheelItem]
|
||||
SongNameOnCommand=zoom,0
|
||||
CourseOnCommand=zoom,0
|
||||
SectionExpandedOnCommand=zoom,0
|
||||
SectionCollapsedOnCommand=zoom,0
|
||||
SectionCountOnCommand=zoom,0
|
||||
RouletteOnCommand=zoom,0
|
||||
SortOnCommand=zoom,0
|
||||
ModeOnCommand=zoom,0
|
||||
GradesShowMachine=false
|
||||
|
||||
[Player]
|
||||
ReceptorArrowsYStandard=-173
|
||||
ReceptorArrowsYReverse=173
|
||||
DrawDistanceBeforeTargetsPixels=SCREEN_HEIGHT
|
||||
DrawDistanceAfterTargetsPixels=-100
|
||||
|
||||
JudgeHoldNotesOnSameRowTogether=false
|
||||
HoldCheckpoints=true
|
||||
CheckpointsUseTimeSignatures=true
|
||||
CheckpointsTapsSeparateJudgment=false
|
||||
CheckpointsFlashOnHold=true
|
||||
ImmediateHoldLetGo=false
|
||||
RequireStepOnHoldHeads=false
|
||||
InitialHoldLife=1
|
||||
MaxHoldLife=1
|
||||
RollBodyIncrementsCombo=false
|
||||
ScoreMissedHoldsAndRolls=false
|
||||
|
||||
;Grades
|
||||
[PlayerStageStats]
|
||||
NumGradeTiersUsed=7
|
||||
;S
|
||||
GradePercentTier01=1
|
||||
;S
|
||||
GradePercentTier02=1
|
||||
;A
|
||||
GradePercentTier03=0.8
|
||||
;B
|
||||
GradePercentTier04=0.6
|
||||
;C
|
||||
GradePercentTier05=0.4
|
||||
;D
|
||||
GradePercentTier06=0.2
|
||||
;F
|
||||
GradePercentTier07=-999999
|
||||
;FPC = SS
|
||||
GradeTier01IsAllW2s=true
|
||||
GradeTier02IsAllW2s=false
|
||||
;FC = S
|
||||
GradeTier02IsFullCombo=true
|
||||
|
||||
[SongManager]
|
||||
ExtraColorMeter=17
|
||||
ExtraStage2DifficultyMax=999
|
||||
NumSongGroupColors=1
|
||||
SongGroupColor1=color("#ffffff")
|
||||
|
||||
#02# - Pantallas
|
||||
[Screen]
|
||||
ShowCreditDisplay=true
|
||||
|
||||
[ScreenOptionsMaster]
|
||||
SongMenu="7"
|
||||
SongMenuDefault=""
|
||||
SongMenu,1="name,Speed;screen,Speed"
|
||||
SongMenu,2="name,Noteskins;screen,Noteskins"
|
||||
SongMenu,3="name,FadeNotes;screen,FadeNotes"
|
||||
SongMenu,4="name,Scroll;screen,Scroll"
|
||||
SongMenu,5="name,Effect;screen,Effect"
|
||||
SongMenu,6="name,Receptor;screen,Receptor"
|
||||
SongMenu,7="name,ResetOptions"
|
||||
|
||||
Speed="10"
|
||||
SpeedDefault="mod,1x,no randomspeed"
|
||||
Speed,1="mod,0.5x;name,0.5x"
|
||||
Speed,2="mod,1x;name,1x"
|
||||
Speed,3="mod,1.5x;name,1.5x"
|
||||
Speed,4="mod,2x;name,2x"
|
||||
Speed,5="mod,3x;name,3x"
|
||||
Speed,6="mod,4x;name,4x"
|
||||
Speed,7="mod,5x;name,5x"
|
||||
Speed,8="mod,6x;name,6x"
|
||||
Speed,9="mod,7x;name,7x"
|
||||
Speed,10="mod,8x;name,8x"
|
||||
|
||||
FadeNotes="5;selectmultiple"
|
||||
FadeNotesDefault="mod,no hidden,no sudden,no stealth,no blink"
|
||||
FadeNotes,1="name,Vanish;mod,hidden"
|
||||
FadeNotes,2="name,RndVanish;mod,randomvanish"
|
||||
FadeNotes,3="name,Appear;mod,sudden"
|
||||
FadeNotes,4="name,Nonstep;mod,stealth"
|
||||
FadeNotes,5="name,Flash;mod,blink"
|
||||
|
||||
Scroll="5;selectmultiple"
|
||||
ScrollDefault="mod,no boost,no brake,no wave,no expand,no xmode"
|
||||
Scroll,1="name,Accel;mod,boost"
|
||||
Scroll,2="name,Decel;mod,brake"
|
||||
Scroll,3="name,Worm;mod,expand"
|
||||
Scroll,4="name,Wave;mod,wave"
|
||||
Scroll,5="name,XMode;mod,xmode"
|
||||
|
||||
Effect="6;selectmultiple"
|
||||
EffectDefault="mod,no dizzy,no tornado,no drunk,no beat,no tiny,no bumpy"
|
||||
Effect,1="name,Spin;mod,628% dizzy"
|
||||
Effect,2="name,Snake;mod,25% tornado"
|
||||
Effect,3="name,Drift;mod,drunk"
|
||||
Effect,4="name,Beat;mod,beat"
|
||||
Effect,5="name,Shrink;mod,tiny"
|
||||
Effect,6="name,Jumps;mod,bumpy"
|
||||
|
||||
Receptor="5;selectmultiple"
|
||||
ReceptorDefault="mod,no dark,no reverse,no centered"
|
||||
Receptor,1="name,Freedom;mod,dark"
|
||||
Receptor,2="name,Reverse;mod,reverse"
|
||||
Receptor,3="name,Center;mod,centered"
|
||||
Receptor,4="name,Flip;mod flip"
|
||||
Receptor,5="name,Invert,mod, invert"
|
||||
|
||||
[ScreenPlayerOptions]
|
||||
;LineNames="1,2,3,4,5,6,7,8,14"
|
||||
LineNames="1,8"
|
||||
;Line1="lua,SpeedMods()"
|
||||
Line1="list,Speed"
|
||||
|
||||
[ScreenWithMenuElements]
|
||||
TimerX=SCREEN_CENTER_X
|
||||
TimerY=10
|
||||
TimerOnCommand=
|
||||
TimerOffCommand=
|
||||
|
||||
#03# - Attract loop
|
||||
[ScreenInit]
|
||||
PlayMusic=true
|
||||
|
||||
#04# - Gameplay loop
|
||||
|
||||
;82w
|
||||
[ScreenTitleMenu]
|
||||
;Next, Prev y CoinChange Screen
|
||||
PrevScreen="ScreenInit"
|
||||
NextScreen="ScreenTitleMenu"
|
||||
CoinModeChangeScreen="ScreenTitleMenu"
|
||||
|
||||
;choices
|
||||
ChoiceNames="1,2,3,5"
|
||||
Choice1="text,Play;applydefaultoptions;difficulty,beginner;screen,ScreenProfileLoad"
|
||||
;ScreenProfileLoad"
|
||||
Choice2="text,Options;screen,ScreenOptionsService"
|
||||
Choice3="text,Editor;screen,ScreenOptionsEdit"
|
||||
Choice4="text,Test;screen,ScreenTest"
|
||||
Choice5="text,Exit;screen,ScreenExit"
|
||||
|
||||
;el scroller
|
||||
LoopScroller=true
|
||||
WrapScroller=true
|
||||
ScrollerSecondsPerItem=0.1
|
||||
ScrollerNumItemsToDraw=5
|
||||
|
||||
ScrollerX=SCREEN_CENTER_X
|
||||
ScrollerY=SCREEN_CENTER_Y
|
||||
ScrollerTransform=function(self,offset,itemIndex,numItems) self:x(offset * 200); end
|
||||
|
||||
[ScreenProfileLoad]
|
||||
NextScreen="ScreenSelectMusic"
|
||||
PrevScreen="ScreenTitleMenu"
|
||||
|
||||
;099
|
||||
[ScreenSelectMusic]
|
||||
;settings
|
||||
NextScreen="ScreenStageInformation"
|
||||
PrevScreen="ScreenProfileSave"
|
||||
;"ScreenTitleMenu"
|
||||
;mucho tiempo, aprovéchalo
|
||||
TimerSeconds=100
|
||||
;no
|
||||
ShowOptionsMessageSeconds=0
|
||||
;em
|
||||
ScreenModsCommand=
|
||||
;si, eso
|
||||
DefaultSort="Group"
|
||||
;¡No!
|
||||
DoRouletteOnMenuTimer=false
|
||||
|
||||
;plz
|
||||
SampleMusicLoops=false
|
||||
SampleMusicDelay=0.5
|
||||
SampleMusicDelayInit=1.5
|
||||
;1: oye, esto para qué es?
|
||||
;2: ez - no - hd - cz - fs - nm - ez - no - hd - cz - fs - nm - ez
|
||||
;1: ok ok, ya entendí...
|
||||
WrapChangeSteps=true
|
||||
;un pequeño agregado mío...
|
||||
ChangeStepsWithGameButtons=true
|
||||
PreviousDifficultyButton="MenuUp"
|
||||
NextDifficultyButton="MenuDown"
|
||||
########################
|
||||
# Custom code detector #
|
||||
########################
|
||||
CodeNames=GetUserPrefB("OptionsMode") and "Summon" or "Noteskin,Speed,Cancel,Hidden,SuperShuffle,XMode,Left,Dark,GradeReverse"
|
||||
;main codes
|
||||
CodeNoteskin="UpLeft,Center,UpRight,Center"
|
||||
CodeSpeed="UpLeft,UpRight,UpLeft,UpRight,Center"
|
||||
CodeCancel="DownLeft,DownRight,DownLeft,DownRight,DownLeft,DownRight"
|
||||
;secondary codes
|
||||
CodeHidden="UpLeft,UpRight,DownLeft,DownRight,Center"
|
||||
CodeSuperShuffle="UpLeft,UpRight,UpLeft,UpRight,DownLeft,DownRight,DownLeft,DownRight,Center"
|
||||
CodeXMode="DownLeft,UpRight,DownLeft,UpRight,DownRight,UpLeft,DownRight,UpLeft,Center"
|
||||
CodeLeft="DownRight,DownLeft,UpRight,UpLeft,DownRight,DownLeft,UpRight,UpLeft,Center"
|
||||
CodeDark="UpLeft,DownLeft,UpRight,DownRight,DownRight,UpLeft,UpRight,DownLeft,Center"
|
||||
;tertiary codes
|
||||
CodeGradeReverse="UpLeft,UpRight,Center,DownLeft,DownRight,DownRight,DownLeft,Center,UpRight,UpLeft,Center"
|
||||
CodeSomething="Select,Select,Select,Select,Center"
|
||||
|
||||
;special cases or whatever...
|
||||
CodeSummon="DownLeft,DownRight,DownLeft,DownRight,DownLeft,DownRight"
|
||||
|
||||
;confirm
|
||||
TwoPartSelection=true
|
||||
TwoPartConfirmsOnly=true
|
||||
|
||||
;oplist
|
||||
;UseOptionsList=true
|
||||
|
||||
;otros elementos
|
||||
TimerOnCommand=visible,false
|
||||
BannerOnCommand=visible,false
|
||||
MusicWheelX=SCREEN_CENTER_X
|
||||
MusicWheelY=SCREEN_CENTER_Y
|
||||
MusicWheelOnCommand=SetDrawByZPosition,true;fov,90
|
||||
|
||||
CDTitleOnCommand=visible,false;pause;
|
||||
|
||||
[ScreenCustomOptionsList]
|
||||
;with this selectmusic preview still plays when stacking this screen
|
||||
PlayMusic=false
|
||||
|
||||
Class="ScreenSplash"
|
||||
Fallback="ScreenSplash"
|
||||
NextScreen="ScreenSelectMusic"
|
||||
PrevScreen="ScreenSelectMusic"
|
||||
|
||||
CodeNames="Prev,Next,Toggle,Back1=Back,Back2=Back"
|
||||
CodePrev="+DownLeft"
|
||||
CodeNext="+DownRight"
|
||||
CodeToggle="Center"
|
||||
CodeBack1="UpLeft"
|
||||
CodeBack2="UpRight"
|
||||
|
||||
;pnz showoff
|
||||
[ScreenStageInformation]
|
||||
TimerSeconds=1
|
||||
TimerOnCommand=visible,false
|
||||
NextScreen="ScreenGameplay"
|
||||
PrevScreen="ScreenSelectMusic"
|
||||
PrepareScreen="ScreenGameplay"
|
||||
ShowCreditDisplay=false
|
||||
|
||||
;00
|
||||
;in before iguana play...
|
||||
[ScreenGameplay]
|
||||
NextScreen=GameplayNext()
|
||||
PrevScreen="ScreenSelectMusic"
|
||||
|
||||
FailOnMissCombo=StageBreak()
|
||||
|
||||
MinSecondsToStep=0.5
|
||||
MinSecondsToMusic=0
|
||||
MusicFadeOutSeconds=1
|
||||
|
||||
;con toda confianza puedo decir: la (barra de) vida es una mierda XD
|
||||
LifeP1OnCommand=visible,false
|
||||
LifeP2OnCommand=visible,false
|
||||
ScoreP1OnCommand=visible,false
|
||||
ScoreP2OnCommand=visible,false
|
||||
|
||||
PlayerInitCommand=y,240;zoom,(THEME:GetMetric("Common","ScreenHeight")/480)
|
||||
StartGivesUp=false
|
||||
BackGivesUp=false
|
||||
|
||||
;uh...
|
||||
PlayerP1OnePlayerOneSideX=SCREEN_CENTER_X-160
|
||||
PlayerP2OnePlayerOneSideX=SCREEN_CENTER_X+160
|
||||
PlayerP1TwoPlayersTwoSidesX=SCREEN_CENTER_X-160
|
||||
PlayerP2TwoPlayersTwoSidesX=SCREEN_CENTER_X+160
|
||||
PlayerP1OnePlayerTwoSidesX=SCREEN_CENTER_X
|
||||
PlayerP2OnePlayerTwoSidesX=SCREEN_CENTER_X
|
||||
PlayerP1TwoPlayersSharedSidesX=SCREEN_CENTER_X
|
||||
PlayerP2TwoPlayersSharedSidesX=SCREEN_CENTER_X
|
||||
|
||||
;Si no pones estos, el extra stage te crashea si le das back...
|
||||
SurviveTimeX=0
|
||||
SurviveTimeY=0
|
||||
SurviveTimeOnCommand=visible,false
|
||||
SurviveTimeOffCommand=
|
||||
|
||||
;83
|
||||
[ScreenEvaluationNormal]
|
||||
ForceTimer=true
|
||||
TimerSeconds=10
|
||||
TimerMetricsGroup="MenuTimerNoSound"
|
||||
;TimerOnCommand=visible,false
|
||||
NextScreen=EvaluationNext()
|
||||
|
||||
;LT%02d
|
||||
[ScreenNextStage]
|
||||
Class="ScreenSplash"
|
||||
Fallback="ScreenSplash"
|
||||
PrevScreen="ScreenSelectMusic"
|
||||
NextScreen="ScreenSelectMusic"
|
||||
|
||||
ForceTimer=true
|
||||
TimerSeconds=3
|
||||
TimerMetricsGroup="MenuTimerNoSound"
|
||||
TimerOnCommand=visible,false
|
||||
|
||||
;083
|
||||
[ScreenStageBreak]
|
||||
Class="ScreenSplash"
|
||||
Fallback="ScreenSplash"
|
||||
PrevScreen=StageBreakNext()
|
||||
NextScreen=StageBreakNext()
|
||||
ForceTimer=true
|
||||
TimerSeconds=5
|
||||
TimerMetricsGroup="MenuTimerNoSound"
|
||||
TimerOnCommand=visible,false
|
||||
|
||||
;guardar perfiles
|
||||
[ScreenProfileSave]
|
||||
NextScreen="ScreenGameOver"
|
||||
PrevScreen="ScreenGameOver"
|
||||
|
||||
;84
|
||||
[ScreenGameOver]
|
||||
Class="ScreenSplash"
|
||||
Fallback="ScreenSplash"
|
||||
PrevScreen=GameOverNext()
|
||||
NextScreen=GameOverNext()
|
||||
|
||||
PlayMusic=true
|
||||
ForceTimer=true
|
||||
TimerSeconds=5
|
||||
TimerMetricsGroup="MenuTimerNoSound"
|
||||
TimerOnCommand=visible,false
|
||||
|
||||
#05# - Otras pantallas/debug
|
||||
[ScreenOptionsTheme]
|
||||
Fallback="ScreenOptionsServiceChild"
|
||||
LineNames="1"
|
||||
Line1="lua,UserPrefOptionsMode()"
|
||||
|
||||
;derivadas de screenoptions
|
||||
;Sí porque faltan lineas en varias y otras te llevan a pantallas que no quiero...
|
||||
[ScreenOptionsService]
|
||||
PrevScreen="ScreenTitleMenu"
|
||||
;LineNames="SD,1,2,13,3,10,11,4,12,6,5,8,9"
|
||||
|
||||
[ScreenOptionsSystemDirection]
|
||||
Fallback="ScreenOptionsServiceChild"
|
||||
PrevScreen="ScreenOptionsService"
|
||||
NextScreen="ScreenOptionsService"
|
||||
@@ -0,0 +1,53 @@
|
||||
Congrats, you're reading the readme
|
||||
|
||||
-= Themekit piu: a base for piu themes =-
|
||||
Use this theme as fallback for your own themes so you don't need to deal with
|
||||
piu related metric setups like lifebars, tiers, effects and such; also some
|
||||
screens are already linked (no attract screens tough)
|
||||
|
||||
-= Why you do this? =-
|
||||
Well, I'm a PIU player, and as one, I like to have PIU setups in my Stepmania themes
|
||||
|
||||
-= Basics and how to =-
|
||||
Easy!
|
||||
º Put this under /Themes
|
||||
º Make a blank folder under /Themes with whatever name you want for your theme
|
||||
º Create a blank Metrics.ini file inside
|
||||
º Open it
|
||||
º Write in:
|
||||
|
||||
<code>
|
||||
[Global]
|
||||
FallbackTheme=_themekit_piu
|
||||
</code>
|
||||
|
||||
º And there you go! just mount the screens that you want to work with or
|
||||
add/replace metrics/elements
|
||||
|
||||
-= FAQ and details =-
|
||||
Q: Can't select themekit
|
||||
A: Themekits aren't supposed to be selectable, but if you want to use this as a
|
||||
theme (wich actually works like one) remove the first underscore in the theme
|
||||
folder name; alternately you can make a blank theme and fallback it with this
|
||||
(explained up there^) and it should work as is.
|
||||
|
||||
Q: Theme doesn't work.
|
||||
A: Maybe you're using stepmania 4 alpha or some old cvs build, use sm-ssc
|
||||
|
||||
Q: I want to use (partial or entirely) the lua modules outside
|
||||
A: Go ahead, just please read the notes if there are any.
|
||||
|
||||
Q: Help me with X
|
||||
A: Sorry, I don't feel like doing so...
|
||||
|
||||
Q: I want to contact you
|
||||
A: I don't like to have my email address floating around, visit sm-ssc irc channel
|
||||
at irc.badnik.net/sm-ssc, I'll be usually there
|
||||
|
||||
Q: Er... Your real name?
|
||||
A: yeah, Alberto Ramos
|
||||
|
||||
-= Least but not least: Final notes =-
|
||||
Well, I think that's pretty much it and what you need to know about this themekit,
|
||||
I hope that you enjoy it, whenever you are or not a themer, and if you are one I
|
||||
just hope that I didn't wasted time doing this... er... you found this useful ^^
|
||||
@@ -0,0 +1,7 @@
|
||||
-- This adds the logo man~
|
||||
InitUserPrefs();
|
||||
local t = Def.ActorFrame {};
|
||||
|
||||
t[#t+1] = StandardDecorationFromFileOptional("Logo","Logo");
|
||||
|
||||
return t
|
||||
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
@@ -0,0 +1,14 @@
|
||||
return Def.ActorFrame {
|
||||
Def.Quad {
|
||||
InitCommand=cmd(x,-128+4;zoomto,4,46);
|
||||
-- OnCommand=cmd(diffuse,color("0,0,0,0.5"));
|
||||
};
|
||||
--[[ Def.Quad {
|
||||
InitCommand=cmd(x,-128+16+6;zoomto,32,46);
|
||||
-- OnCommand=cmd(faderight,1;diffusealpha,0.5);
|
||||
}; --]]
|
||||
--[[ Def.Quad {
|
||||
InitCommand=cmd(x,2;y,23;zoomto,320,1);
|
||||
-- OnCommand=cmd(diffuse,color("0,0,0,0.5"));
|
||||
}; --]]
|
||||
};
|
||||
@@ -0,0 +1,6 @@
|
||||
return Def.ActorFrame {
|
||||
Def.Quad {
|
||||
InitCommand=cmd(x,4;zoomto,256-4,46);
|
||||
OnCommand=cmd(diffuse,color("0,0,0,0.5"));
|
||||
};
|
||||
};
|
||||
|
After Width: | Height: | Size: 28 KiB |
@@ -3,9 +3,13 @@ local gc = Var("GameCommand");
|
||||
local t = Def.ActorFrame {};
|
||||
|
||||
t[#t+1] = LoadFont("Common Normal") .. {
|
||||
Name="Text";
|
||||
Text=gc:GetText();
|
||||
};
|
||||
|
||||
t.GainFocusCommand=cmd(diffusealpha,1);
|
||||
t.LoseFocusCommand=cmd(diffusealpha,0.5);
|
||||
t[1].OnCommand=Screen.Metric("ScrollerItemOnCommand");
|
||||
t[1].GainFocusCommand=Screen.Metric("ScrollerItemGainFocusCommand");
|
||||
t[1].LoseFocusCommand=Screen.Metric("ScrollerItemLoseFocusCommand");
|
||||
t[1].OffFocusedCommand=Screen.Metric("ScrollerItemOffFocusedCommand");
|
||||
t[1].OffUnfocusedCommand=Screen.Metric("ScrollerItemOffUnfocusedCommand");
|
||||
return t;
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
@@ -0,0 +1 @@
|
||||
_Music title
|
||||