--[[ USW Noteskin.lua Version V2 Made for Version Stepmania 5 Preview 4 I am the bone of my noteskin Arrows are my body, and explosions are my blood I have created over a thousand noteskins Unknown to death Nor known to life Have withstood pain to create many noteskins Yet these hands will never hold anything So as I pray, Unlimited Stepman Works If you want to know the list of lua commands you can use here is the main page for help http://kki.ajworld.net/lua/sm5/Lua.xml --]] local ret = ... or {}; --I always had the problem were I wrote var instead of Var, which really iritated me wondering why a code wouldnt work --You can edit it out if you want, But I'm just gonna leave it here so incase a person wants to make a noteskin --And gets the same problem as me were you use var instead of Var, atleast this should make it still work --But its best to use Var, And make sure to check all your code for little mistakes while you write ;) local var = Var; --[[ This is the general redirect table, Not the general redirect code, We use this if we are lazy ;) Or if we cant a directon of a noteskin use the exact same files as another direction The most re used direction in this case is "Down" You can add and remove values if you want, It works for every game type, If you want an easy way to know how all directions are called go in to stepmaniaoptions and change gametype Then if you go to key configure look at the names for the keys, They are the same names that are used in the noteskin.lua --]] ret.RedirTable = { Up = "Down", Down = "Down", Left = "Down", Right = "Down", Center = "Down", DownLeft = "Down", DownRight = "Down", UpLeft = "Down", UpRight = "Down", }; --[[ This is the general redirect code, We use this if we want to redirect parts of noteskins to other parts Because unlike the ret.RedirTable which redirects everything to the defined direction. Here we can add redirects for seperate elements which means we can use separate images if we want --]] local OldRedir = ret.Redir; ret.Redir = function(sButton, sElement) sButton, sElement = OldRedir(sButton, sElement); --This is were we call the ret.RedirTable and define it as sButton --So it get called when we return sButton including the code under here sButton = ret.RedirTable[sButton]; --We want to use custom hold/roll per direction, But keep global hold/roll heads and explosions. if string.find(sElement, "Hold") or string.find(sElement, "Roll") then if not string.find(sElement, "Head") and not string.find(sElement, "Explosion") then if Var "Button" == "Left" then sButton = "Left"; end if Var "Button" == "Right" then sButton = "Right"; end if Var "Button" == "Down" then sButton = "Down"; end if Var "Button" == "Up" then sButton = "Up"; end if GAMESTATE:GetCurrentGame():GetName() == "dance" then if Var "Button" == "UpLeft" then sButton = "UpLeft"; end if Var "Button" == "UpRight" then sButton = "UpRight"; end end end end --Making Roll Head/Explosion fallback on Hold if sElement == "Roll Head Inactive" then sElement = "Hold Head Inactive"; end if sElement == "Roll Head Active" then sElement = "Hold Head Active"; end if sElement == "Roll Explosion" then sElement = "Hold Explosion"; end --Adding stuff for more directions for diffrent gametypes if GAMESTATE:GetCurrentGame():GetName() == "dance" then --Making the Upleft and Upright Hold/Roll body/BottomCap/TopCap but not Explosions use SoloUpLeft and SoloUpRight instead --When the gametype is dance this way we can define diffrent images for diffrent gametypes if string.find(sElement, "Hold") or string.find(sElement, "Roll") then if Var "Button" == "UpLeft" and not string.find(sElement, "Explosion") then sButton = "SoloUpLeft"; end if Var "Button" == "UpRight" and not string.find(sElement, "Explosion") then sButton = "SoloUpRight"; end end elseif GAMESTATE:GetCurrentGame():GetName() == "techno" then -- See below for why two options. if GAMESTATE:GetMasterPlayerNumber() == "PlayerNumber_P1" then if Var "Button" == "Center" then sButton = "Centerp1"; end elseif GAMESTATE:GetMasterPlayerNumber() == "PlayerNumber_P2" then if Var "Button" == "Center" then sButton = "Centerp2"; end end if string.find(sButton, "Center") then if string.find(sElement, "Bottomcap") then sButton = "Center"; end if string.find(sElement, "Topcap") then sButton = "Center"; end if string.find(sElement, "Body") then sButton = "Center"; end end if string.find(sElement, "Explosion") then sButton = "Center"; end if sElement == "Tap Explosion Dim" then sElement = "Tap Explosion Bright"; end --]] elseif GAMESTATE:GetCurrentGame():GetName() == "pump" then --Making Pump it up be rythm color based, Only problem is that in sm player 1 and player 2 noteskins are both defined as player 1 --Need a way to get the parent but atm it ends up as nil because of no parent --So Player 1 and 2 both use Player 1 images for now --We also let every direction aside from Center use DownLeftp1 if GAMESTATE:GetMasterPlayerNumber() == "PlayerNumber_P1" then if Var "Button" == "UpLeft" then sButton = "DownLeftp1"; end if Var "Button" == "UpRight" then sButton = "DownLeftp1"; end if Var "Button" == "DownLeft" then sButton = "DownLeftp1"; end if Var "Button" == "DownRight" then sButton = "DownLeftp1"; end if Var "Button" == "Center" then sButton = "Centerp1"; end elseif GAMESTATE:GetMasterPlayerNumber() == "PlayerNumber_P2" then if Var "Button" == "UpLeft" then sButton = "Downleftp2"; end if Var "Button" == "UpRight" then sButton = "Downleftp2"; end if Var "Button" == "DownLeft" then sButton = "DownLeftp2"; end if Var "Button" == "DownRight" then sButton = "DownLeftp2"; end if Var "Button" == "Center" then sButton = "Centerp2"; end end --We already defined everything for diffrent players above --But we want to use the same Center hold images for every direction and player if string.find(sElement, "Bottomcap") then sButton = "Center"; end if string.find(sElement, "Topcap") then sButton = "Center"; end if string.find(sElement, "Body") then sButton = "Center"; end --Lets also add explosion as Center if string.find(sElement, "Explosion") then sButton = "Center"; end if sElement == "Tap Explosion Dim" then sElement = "Tap Explosion Bright"; end end --Define that every direction uses Tap Mine from Down if Var "Element" == "Tap Mine" then sButton = "Down"; end return sButton, sElement; end --[[ This is the general function code In here we can define how we want the stuff to act Which basicly means instead of using a load of lua files for just some effect We can just use code in here so we need to use less files Which is nice if you want to save up space ;) Only problem is that the Hold/Roll parts are written down in the code as sprite files Which is the original old 3.9 code, Which basicly means that their code doesnt work in here Also unlike the general redirect code which has sElement and sButton defined in the common noteskin They need to be defined here manualy which can be done with local sElement = Var "Element"; local sButton = Var "Button"; To make it easier for everyone I already added them The reason we use local to define the stuff is for when a code doesnt accept the full code Like for example if we did string.find(Var "Element", "Down") it wouldnt work --]] local OldFunc = ret.Load; function ret.Load() local t = OldFunc(); local sElement = Var "Element"; local sButton = Var "Button"; --Explosion should not be rotated; it calls other actors. if Var "Element" == "Explosion" then t.BaseRotationZ = nil; end if GAMESTATE:GetCurrentGame():GetName() == "dance" then --We define that we dont want the hold heads for UpLeft and UpRight to be rotated because we rotate them in a lua file if Var "Button" == "UpLeft" and string.find(sElement, "Head") then t.BaseRotationZ = nil; end if Var "Button" == "UpRight" and string.find(sElement, "Head") then t.BaseRotationZ = nil; end elseif GAMESTATE:GetCurrentGame():GetName() == "techno" then if Var "Element" == "Tap Mine" then t.InitCommand=cmd(zoom,-0.8); end elseif GAMESTATE:GetCurrentGame():GetName() == "pump" then --Because the images for Pump it up are using the DownLeft for every direction aside from center, We let it be rotated here --Because the rotate table is set up for dance and these are for PIU if Var "Button" == "UpLeft" then t.BaseRotationZ = 90; end if Var "Button" == "UpRight" then t.BaseRotationZ = 180; end if Var "Button" == "DownLeft" then t.BaseRotationZ = nil; end if Var "Button" == "DownRight" then t.BaseRotationZ = -90; end if Var "Element" == "Tap Mine" then t.InitCommand=cmd(zoom,-0.8); end end return t; end -- > --Define which parts of noteskins which we want to rotate ret.PartsToRotate = { ["Receptor"] = true, ["Tap Explosion Bright"] = true, ["Tap Explosion Dim"] = true, ["Tap Note"] = true, ["Tap Fake"] = true, ["Tap Lift"] = true, ["Tap Addition"] = true, ["Hold Explosion"] = true, ["Hold Head Active"] = true, ["Hold Head Inactive"] = true, ["Roll Explosion"] = true, ["Roll Head Active"] = true, ["Roll Head Inactive"] = true, }; --Defined the parts to be rotated at which degree ret.Rotate = { Up = 180, Down = 0, Left = 90, Right = -90, UpLeft = 135, UpRight = -135, Center = 0, DownLeft = 45, DownRight = -45, }; --Parts that should be Redirected to _Blank.png --you can add/remove stuff if you want ret.Blank = { ["Hold Tail Active"] = true, ["Hold Tail Inactive"] = true, ["Roll Tail Active"] = true, ["Roll Tail Inactive"] = true, }; --dont forget to close the ret cuz else it wont work ;> return ret;