diff --git a/Themes/_themekit-piu/BGAnimations/ScreenCustomOptionsList overlay/default.lua b/Themes/_themekit-piu/BGAnimations/ScreenCustomOptionsList overlay/default.lua index ea0e850f1f..93d6f6bfb3 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenCustomOptionsList overlay/default.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenCustomOptionsList overlay/default.lua @@ -1,384 +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; +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; }; \ No newline at end of file diff --git a/Themes/_themekit-piu/BGAnimations/ScreenEvaluationNormal overlay/default.lua b/Themes/_themekit-piu/BGAnimations/ScreenEvaluationNormal overlay/default.lua index 6923846a64..af25c713f6 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenEvaluationNormal overlay/default.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenEvaluationNormal overlay/default.lua @@ -1,118 +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); - }; +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); + }; } \ No newline at end of file diff --git a/Themes/_themekit-piu/BGAnimations/ScreenGameOver underlay/default.lua b/Themes/_themekit-piu/BGAnimations/ScreenGameOver underlay/default.lua index 5809d099a1..f13882ac24 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenGameOver underlay/default.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenGameOver underlay/default.lua @@ -1,6 +1,6 @@ -return Def.ActorFrame { - LoadFont("_impact 50px")..{ - Text="THE GAME IS OVER"; - InitCommand=cmd(Center;diffuse,color("#000000");Stroke,color("#ffffff")); - }; +return Def.ActorFrame { + LoadFont("_impact 50px")..{ + Text="THE GAME IS OVER"; + InitCommand=cmd(Center;diffuse,color("#000000");Stroke,color("#ffffff")); + }; } \ No newline at end of file diff --git a/Themes/_themekit-piu/BGAnimations/ScreenGameplay overlay/default.lua b/Themes/_themekit-piu/BGAnimations/ScreenGameplay overlay/default.lua index 9894b80cb7..f0189f6f51 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenGameplay overlay/default.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenGameplay overlay/default.lua @@ -1,30 +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); }; +--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); }; } \ No newline at end of file diff --git a/Themes/_themekit-piu/BGAnimations/ScreenGameplay underlay.lua b/Themes/_themekit-piu/BGAnimations/ScreenGameplay underlay.lua index d5533e3a4e..b1bb3cd79b 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenGameplay underlay.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenGameplay underlay.lua @@ -1,115 +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); }; +-- 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); }; } \ No newline at end of file diff --git a/Themes/_themekit-piu/BGAnimations/ScreenNextStage underlay/default.lua b/Themes/_themekit-piu/BGAnimations/ScreenNextStage underlay/default.lua index 221d2bdc75..4a335d868d 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenNextStage underlay/default.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenNextStage underlay/default.lua @@ -1,6 +1,6 @@ -return Def.ActorFrame { - LoadFont("_impact 50px")..{ - Text="Try next stage"; - InitCommand=cmd(Center;diffuse,color("#000000");Stroke,color("#ffffff")); - }; +return Def.ActorFrame { + LoadFont("_impact 50px")..{ + Text="Try next stage"; + InitCommand=cmd(Center;diffuse,color("#000000");Stroke,color("#ffffff")); + }; } \ No newline at end of file diff --git a/Themes/_themekit-piu/BGAnimations/ScreenProfileLoad overlay.lua b/Themes/_themekit-piu/BGAnimations/ScreenProfileLoad overlay.lua index 7315ae6c1d..0ad1c12434 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenProfileLoad overlay.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenProfileLoad overlay.lua @@ -1,21 +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")); - }; +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")); + }; } \ No newline at end of file diff --git a/Themes/_themekit-piu/BGAnimations/ScreenProfileSave overlay.lua b/Themes/_themekit-piu/BGAnimations/ScreenProfileSave overlay.lua index f59fc1109b..0798fe9d22 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenProfileSave overlay.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenProfileSave overlay.lua @@ -1,21 +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")); - }; +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")); + }; } \ No newline at end of file diff --git a/Themes/_themekit-piu/BGAnimations/ScreenSelectMusic overlay/default.lua b/Themes/_themekit-piu/BGAnimations/ScreenSelectMusic overlay/default.lua index fbd5ebfc89..f37397ab33 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenSelectMusic overlay/default.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenSelectMusic overlay/default.lua @@ -1,224 +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"); - }; +--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"); + }; } \ No newline at end of file diff --git a/Themes/_themekit-piu/BGAnimations/ScreenSelectMusic underlay.lua b/Themes/_themekit-piu/BGAnimations/ScreenSelectMusic underlay.lua index d4cbce24e1..c0678bb310 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenSelectMusic underlay.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenSelectMusic underlay.lua @@ -1,66 +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); - }; -} +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); + }; +} diff --git a/Themes/_themekit-piu/BGAnimations/ScreenStageBreak underlay/default.lua b/Themes/_themekit-piu/BGAnimations/ScreenStageBreak underlay/default.lua index 134b9a6574..9b5240467b 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenStageBreak underlay/default.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenStageBreak underlay/default.lua @@ -1,6 +1,6 @@ -return Def.ActorFrame { - LoadFont("_impact 50px")..{ - Text="Epic fail..."; - InitCommand=cmd(Center;diffuse,color("#000000");Stroke,color("#ffffff")); - }; +return Def.ActorFrame { + LoadFont("_impact 50px")..{ + Text="Epic fail..."; + InitCommand=cmd(Center;diffuse,color("#000000");Stroke,color("#ffffff")); + }; } \ No newline at end of file diff --git a/Themes/_themekit-piu/BGAnimations/ScreenStageInformation underlay.lua b/Themes/_themekit-piu/BGAnimations/ScreenStageInformation underlay.lua index b68168c6ee..cff6516117 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenStageInformation underlay.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenStageInformation underlay.lua @@ -1,24 +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); +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); }; \ No newline at end of file diff --git a/Themes/_themekit-piu/BGAnimations/ScreenSystemLayer overlay.lua b/Themes/_themekit-piu/BGAnimations/ScreenSystemLayer overlay.lua index 5930974b1c..16f54e6cd0 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenSystemLayer overlay.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenSystemLayer overlay.lua @@ -1,79 +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); - }; -} +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); + }; +} diff --git a/Themes/_themekit-piu/BGAnimations/ScreenTitleMenu underlay/default.lua b/Themes/_themekit-piu/BGAnimations/ScreenTitleMenu underlay/default.lua index 644f3c5323..20508d98b1 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenTitleMenu underlay/default.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenTitleMenu underlay/default.lua @@ -1,6 +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")); - }; +return Def.ActorFrame { + LoadFont("_arial black 20px")..{ + Text="Background logo or video must go here..."; + InitCommand=cmd(CenterX;y,200;Stroke,color("#000000")); + }; } \ No newline at end of file diff --git a/Themes/_themekit-piu/BGAnimations/ScreenWithMenuElements background.lua b/Themes/_themekit-piu/BGAnimations/ScreenWithMenuElements background.lua index e472028917..2617497a9a 100644 --- a/Themes/_themekit-piu/BGAnimations/ScreenWithMenuElements background.lua +++ b/Themes/_themekit-piu/BGAnimations/ScreenWithMenuElements background.lua @@ -1,22 +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; +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; } \ No newline at end of file diff --git a/Themes/_themekit-piu/BGAnimations/_frame 3x1.lua b/Themes/_themekit-piu/BGAnimations/_frame 3x1.lua index aea442644b..b18753105a 100644 --- a/Themes/_themekit-piu/BGAnimations/_frame 3x1.lua +++ b/Themes/_themekit-piu/BGAnimations/_frame 3x1.lua @@ -1,13 +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) }; -}; +--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) }; +}; diff --git a/Themes/_themekit-piu/Fonts/_arial black 20px.ini b/Themes/_themekit-piu/Fonts/_arial black 20px.ini index a5e2ae116d..a2e96a6d3a 100644 --- a/Themes/_themekit-piu/Fonts/_arial black 20px.ini +++ b/Themes/_themekit-piu/Fonts/_arial black 20px.ini @@ -1,352 +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 +[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 diff --git a/Themes/_themekit-piu/Fonts/_fixedsys 8px.ini b/Themes/_themekit-piu/Fonts/_fixedsys 8px.ini index 4f66a87c4c..724c7f3888 100644 --- a/Themes/_themekit-piu/Fonts/_fixedsys 8px.ini +++ b/Themes/_themekit-piu/Fonts/_fixedsys 8px.ini @@ -1,352 +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 +[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 diff --git a/Themes/_themekit-piu/Fonts/_impact 50px.ini b/Themes/_themekit-piu/Fonts/_impact 50px.ini index a923f584c5..06977fae7d 100644 --- a/Themes/_themekit-piu/Fonts/_impact 50px.ini +++ b/Themes/_themekit-piu/Fonts/_impact 50px.ini @@ -1,352 +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 +[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 diff --git a/Themes/_themekit-piu/Fonts/combo.ini b/Themes/_themekit-piu/Fonts/combo.ini index c53b8a14b7..5354c7bb6e 100644 --- a/Themes/_themekit-piu/Fonts/combo.ini +++ b/Themes/_themekit-piu/Fonts/combo.ini @@ -1,3 +1,3 @@ -[main] -line 0=01234 +[main] +line 0=01234 line 1=56789 \ No newline at end of file diff --git a/Themes/_themekit-piu/Graphics/MusicWheelItem SectionExpanded NormalPart/default.lua b/Themes/_themekit-piu/Graphics/MusicWheelItem SectionExpanded NormalPart/default.lua index 92c1eaa8fc..f90b65c56a 100644 --- a/Themes/_themekit-piu/Graphics/MusicWheelItem SectionExpanded NormalPart/default.lua +++ b/Themes/_themekit-piu/Graphics/MusicWheelItem SectionExpanded NormalPart/default.lua @@ -1,30 +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; - }; -} +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; + }; +} diff --git a/Themes/_themekit-piu/Graphics/MusicWheelItem Song NormalPart/default.lua b/Themes/_themekit-piu/Graphics/MusicWheelItem Song NormalPart/default.lua index 328ebcec58..0ac252227b 100644 --- a/Themes/_themekit-piu/Graphics/MusicWheelItem Song NormalPart/default.lua +++ b/Themes/_themekit-piu/Graphics/MusicWheelItem Song NormalPart/default.lua @@ -1,32 +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; - }; -} +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; + }; +} diff --git a/Themes/_themekit-piu/Graphics/Player judgment/default.lua b/Themes/_themekit-piu/Graphics/Player judgment/default.lua index 5f408e976f..e6ac0e3a71 100644 --- a/Themes/_themekit-piu/Graphics/Player judgment/default.lua +++ b/Themes/_themekit-piu/Graphics/Player judgment/default.lua @@ -1,120 +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; +--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; } \ No newline at end of file diff --git a/Themes/_themekit-piu/Graphics/ScreenMapControllers exit.lua b/Themes/_themekit-piu/Graphics/ScreenMapControllers exit.lua index 2f5ca66ae4..caa908feda 100644 --- a/Themes/_themekit-piu/Graphics/ScreenMapControllers exit.lua +++ b/Themes/_themekit-piu/Graphics/ScreenMapControllers exit.lua @@ -1,6 +1,6 @@ -return LoadFont("Common", "Normal")..{ - Text="EXIT"; - InitCommand=cmd(CenterX); - GainFocusCommand=cmd(diffuse,color("#FF0000")); - LoseFocusCommand=cmd(diffuse,color("#FFFFFF")); +return LoadFont("Common", "Normal")..{ + Text="EXIT"; + InitCommand=cmd(CenterX); + GainFocusCommand=cmd(diffuse,color("#FF0000")); + LoseFocusCommand=cmd(diffuse,color("#FFFFFF")); } \ No newline at end of file diff --git a/Themes/_themekit-piu/Graphics/ScreenTitleMenu scroll.lua b/Themes/_themekit-piu/Graphics/ScreenTitleMenu scroll.lua index 3dffc70268..af292e0b9d 100644 --- a/Themes/_themekit-piu/Graphics/ScreenTitleMenu scroll.lua +++ b/Themes/_themekit-piu/Graphics/ScreenTitleMenu scroll.lua @@ -1,18 +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" }; +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" }; }; \ No newline at end of file diff --git a/Themes/_themekit-piu/Languages/en.ini b/Themes/_themekit-piu/Languages/en.ini index 584a601c75..01ba42e1b8 100644 --- a/Themes/_themekit-piu/Languages/en.ini +++ b/Themes/_themekit-piu/Languages/en.ini @@ -1,57 +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 +[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 \ No newline at end of file diff --git a/Themes/_themekit-piu/Scripts/01 system.lua b/Themes/_themekit-piu/Scripts/01 system.lua index 2b4ede28dc..dbe1340be8 100644 --- a/Themes/_themekit-piu/Scripts/01 system.lua +++ b/Themes/_themekit-piu/Scripts/01 system.lua @@ -1,18 +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 +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") \ No newline at end of file diff --git a/Themes/_themekit-piu/Scripts/02 CustomCodeDetector.lua b/Themes/_themekit-piu/Scripts/02 CustomCodeDetector.lua index cdf0cf4c71..23588ea62e 100644 --- a/Themes/_themekit-piu/Scripts/02 CustomCodeDetector.lua +++ b/Themes/_themekit-piu/Scripts/02 CustomCodeDetector.lua @@ -1,350 +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: - - -CodeMessageCommand=function(self) - CustomCodeDetector() -end; - - -You'll need codename and player to be passed as arguments, you can get those -somewhere: - - -CodeMessageCommand=function(self,params) - CustomCodeDetector(params.Name, params.PlayerNumber) -end; - - -If you like to be classy like me: - - -CodeMessageCommand=function(self,params) - local code = params.Name - local player = params.PlayerNumber - if not GAMESTATE:IsHumanPlayer(player) then return end; - - CustomCodeDetector(code, player) -end; - - -Niceties: - - -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; - -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 - - -[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" - - -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 +--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: + + +CodeMessageCommand=function(self) + CustomCodeDetector() +end; + + +You'll need codename and player to be passed as arguments, you can get those +somewhere: + + +CodeMessageCommand=function(self,params) + CustomCodeDetector(params.Name, params.PlayerNumber) +end; + + +If you like to be classy like me: + + +CodeMessageCommand=function(self,params) + local code = params.Name + local player = params.PlayerNumber + if not GAMESTATE:IsHumanPlayer(player) then return end; + + CustomCodeDetector(code, player) +end; + + +Niceties: + + +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; + +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 + + +[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" + + +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 \ No newline at end of file diff --git a/Themes/_themekit-piu/Scripts/02 Draw.lua b/Themes/_themekit-piu/Scripts/02 Draw.lua index 3e98a3971d..7890cba817 100644 --- a/Themes/_themekit-piu/Scripts/02 Draw.lua +++ b/Themes/_themekit-piu/Scripts/02 Draw.lua @@ -1,252 +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 - - -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); - }; -} - - -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 +--[[-------------------------------------------------------------------------- +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 + + +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); + }; +} + + +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 } \ No newline at end of file diff --git a/Themes/_themekit-piu/Scripts/02 splitmode.lua b/Themes/_themekit-piu/Scripts/02 splitmode.lua index 836170fa01..a79ba75017 100644 --- a/Themes/_themekit-piu/Scripts/02 splitmode.lua +++ b/Themes/_themekit-piu/Scripts/02 splitmode.lua @@ -1,102 +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= -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 +--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= +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 \ No newline at end of file diff --git a/Themes/_themekit-piu/Scripts/03 branches.lua b/Themes/_themekit-piu/Scripts/03 branches.lua index fa551ae645..712fe33d25 100644 --- a/Themes/_themekit-piu/Scripts/03 branches.lua +++ b/Themes/_themekit-piu/Scripts/03 branches.lua @@ -1,39 +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 +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 diff --git a/Themes/_themekit-piu/Scripts/03 optionrow.lua b/Themes/_themekit-piu/Scripts/03 optionrow.lua index 96ae18ca75..8cea2353bf 100644 --- a/Themes/_themekit-piu/Scripts/03 optionrow.lua +++ b/Themes/_themekit-piu/Scripts/03 optionrow.lua @@ -1,90 +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) +--[[-------------------------------------------------------------------------- +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 \ No newline at end of file diff --git a/Themes/_themekit-piu/Scripts/04 themelibs.lua b/Themes/_themekit-piu/Scripts/04 themelibs.lua index af8682ff06..ae57d46095 100644 --- a/Themes/_themekit-piu/Scripts/04 themelibs.lua +++ b/Themes/_themekit-piu/Scripts/04 themelibs.lua @@ -1,153 +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 +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 \ No newline at end of file diff --git a/Themes/_themekit-piu/ThemeInfo.ini b/Themes/_themekit-piu/ThemeInfo.ini index 9e5290bc2a..efeb97e846 100644 --- a/Themes/_themekit-piu/ThemeInfo.ini +++ b/Themes/_themekit-piu/ThemeInfo.ini @@ -1,3 +1,3 @@ -[ThemeInfo] -DisplayName=_Themekit_PIU +[ThemeInfo] +DisplayName=_Themekit_PIU Author=DaisuMaster \ No newline at end of file diff --git a/Themes/_themekit-piu/metrics.ini b/Themes/_themekit-piu/metrics.ini index 6dff88e5ef..10e3f17d4b 100644 --- a/Themes/_themekit-piu/metrics.ini +++ b/Themes/_themekit-piu/metrics.ini @@ -1,553 +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" +#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" \ No newline at end of file diff --git a/Themes/_themekit-piu/reads.txt b/Themes/_themekit-piu/reads.txt index a1a10a8b4a..674db02715 100644 --- a/Themes/_themekit-piu/reads.txt +++ b/Themes/_themekit-piu/reads.txt @@ -1,53 +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: - - -[Global] -FallbackTheme=_themekit_piu - - -º 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 +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: + + +[Global] +FallbackTheme=_themekit_piu + + +º 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 ^^ \ No newline at end of file diff --git a/Themes/themekit/Fonts/ScreenWithMenuElements TextHeader.redir b/Themes/themekit/Fonts/ScreenWithMenuElements TextHeader.redir index 7f2ac5af51..a290ae3b16 100644 --- a/Themes/themekit/Fonts/ScreenWithMenuElements TextHeader.redir +++ b/Themes/themekit/Fonts/ScreenWithMenuElements TextHeader.redir @@ -1,3 +1,3 @@ -Common Normal --- Fun Fact, Redirs only read the 1st line in any of the files, so you can +Common Normal +-- Fun Fact, Redirs only read the 1st line in any of the files, so you can -- comment them as much as you want! \ No newline at end of file