diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index ef104763b8..3da66d0f3f 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -4,6 +4,32 @@ The StepMania 5 Changelog covers all post-sm-ssc changes. For a list of changes from StepMania 4 alpha 5 to sm-ssc v1.2.5, see Changelog_sm-ssc.txt. ________________________________________________________________________________ +2015/01/20 +---------- +* [ScreenSelect] ChoiceNames can be a lua command that is evaluated to get a + list of the gamecommands. The main use of this is to get rid of the huge + list of metrics that ScreenSelectStyle requires. A single lua function + instead of a metric for every style for every game type. [kyzentun] +* [ScreenSelectMaster] IconChoicePosFunction metric added. This metric is + optional, if it's set, it must be set to a function that returns a table + of positions. Each position is a table of the form "{x, y, z}", where x, + y, and z are numbers and any that is not a number defaults to 0. + The function is passed the number of choices for the screen. + IconChoiceOnCommand and IconChoiceOffCommand metrics added so each choice + doesn't require its own On/OffCommand pair. These are also optional, but + if they are set, they will override the individual commands if they exist. + (If "IconChoiceCactusOnCommand" and "IconChoiceOnCommand" both exist, + "IconChoiceOnCommand" will be used.) [kyzentun] + Example: + # in metrics.ini + IconChoicePosFunction=choice_positions + -- In a file in Scripts/ + function choice_positions(count) + local ret= {} + for i= 1, ret do ret[i]= {i*24, i*48} end + return ret + end + 2015/01/16 ---------- * [ScreenSelectMusic] HardCommentMeter metric added. Sets the meter that @@ -59,6 +85,34 @@ ________________________________________________________________________________ * [Player] "ComboBreakOnImmediateHoldLetGo" theme metric added. [sillybear] * [PlayerState] ApplyPreferredOptionsToOtherLevels function added. [kyzentun] +2014/12/07 +---------- +* [Game] GetSeparateStyles function added. Use this to detect whether a game + allows the players to play different styles. [kyzentun] (used by kickbox) +* [GameManager] Lua Scripts/ folders are now reloaded when the Game mode is + changed. [kyzentun] +* [GameState] CanSafelyEnterGameplay function added. [kyzentun] + In kickbox game mode, players can have different styles set, pass a + PlayerNumber when using SetCurrentStyle or GetCurrentStyle. +* [kickbox] New game mode with 4 styles. [kyzentun] +* [ScreenGameplay] Notefield positioning is handled a bit differently now. + See comments in _fallback/metrics.ini above the [ScreenGameplay] + MarginFunction metric. Basically, you can define a lua function that + returns the space you want at the edges and in the center instead of + setting position metrics. Do NOT use Style:GetWidth to calculate the + margins your function returns. + ScreenGameplay now handles zooming the notefield to fit in the space + instead of using the NeedsZoomOutWith2Players flag in the style. + If the notefield doesn't fit in the space between the margins, and there is + only one player, the player will be centered even if the Center1Player pref + is false. [kyzentun] +* [Style] NeedsZoomOutWith2Players decapitated. Always returns false now. + GetWidth added. [kyzentun] +* [techno] Techno game mode no longer has special column width for versus. + Techno was the only game mode that used the NeedsZoomOutWith2Players flag, + and the zoom factor it applied was 0.6, and the special versus column width + was 0.6*normal, so this should make no difference. [kyzentun] + 2014/12/03 ---------- * [command line arg] --game command line arg added for setting the game type @@ -112,6 +166,10 @@ ________________________________________________________________________________ ---------- * [RollingNumbers] Cropping and color during tweens fixed. [kyzentun] +2014/10/27 +---------- +* [Changelog] Vospi read the release notes. + 2014/10/23 ---------- * [Global] approach, multiapproach, lerp, and lerp_color lua functions added. [kyzentun] diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index cef9509db7..beeca21152 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -731,6 +731,7 @@ + @@ -779,6 +780,7 @@ + @@ -1708,6 +1710,7 @@ + diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index 1bbfa2c490..23eaa72ec0 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -2242,6 +2242,9 @@ save yourself some time, copy this for undocumented things: Returns the name of the game such as "dance" or "pump". + + Returns whether this game allows the players to have separate styles. + @@ -2381,6 +2384,16 @@ save yourself some time, copy this for undocumented things: The second argument is optional. Apply the GameCommand represented by sCommand for pn, if given. See . + + Checks various things to determine whether the game will crash when gameplay starts. Returns false and a string if gameplay cannot be entered safely.
+ Might not work in all cases, but will catch things like a player not having + steps set or no current song or style. Mainly exists for people with a custom ScreenSelectMusic replacement.
+ Example:
+ local can, reason= GAMESTATE:CanSafelyEnterGameplay()
+ if not can then
+ lua.ReportScriptError("Cannot safely enter gameplay: " .. tostring(reason))
+ end
+
Removes any stage modifiers that are illegal for course play. @@ -4909,11 +4922,14 @@ save yourself some time, copy this for undocumented things: Returns the draw order of the column. + + Returns the width of the notefield for the given player with this style. + Returns true if this style locks the difficulty for both players. - Returns true if the Style needs to be zoomed out with two players. + Deprecated. Always returns false.
diff --git a/NoteSkins/kickbox/default/AnyLeftFist Explosion.lua b/NoteSkins/kickbox/default/AnyLeftFist Explosion.lua new file mode 100644 index 0000000000..091a5748b8 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFist Explosion.lua @@ -0,0 +1,5 @@ +local t = LoadActor("AnyRightFist Explosion") .. { + InitCommand=cmd(basezoomx,-1); +} + +return t; diff --git a/NoteSkins/kickbox/default/AnyLeftFist Hold Body Active (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFist Hold Body Active (doubleres).png new file mode 100644 index 0000000000..f8d38093cc Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFist Hold Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFist Hold Body Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFist Hold Body Inactive (doubleres).png new file mode 100644 index 0000000000..27a16473b5 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFist Hold Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFist Hold BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFist Hold BottomCap Active (doubleres).png new file mode 100644 index 0000000000..ee11ba1f7e Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFist Hold BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFist Hold BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFist Hold BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..6c13aab879 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFist Hold BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFist Hold Head Active.lua b/NoteSkins/kickbox/default/AnyLeftFist Hold Head Active.lua new file mode 100644 index 0000000000..6860d80e16 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFist Hold Head Active.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('AnyRightFist','Hold Head Active'); + InitCommand=cmd(basezoomx,-1); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyLeftFist Hold Head Inactive.lua b/NoteSkins/kickbox/default/AnyLeftFist Hold Head Inactive.lua new file mode 100644 index 0000000000..1f7b9e7ae8 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFist Hold Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('AnyRightFist','Hold Head Active'); + InitCommand=cmd(basezoomx,-1;diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyLeftFist Receptor.lua b/NoteSkins/kickbox/default/AnyLeftFist Receptor.lua new file mode 100644 index 0000000000..02c21a986a --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFist Receptor.lua @@ -0,0 +1,5 @@ +local t = LoadActor("AnyRightFist Receptor") .. { + InitCommand=cmd(zoomx,-1); +} + +return t; diff --git a/NoteSkins/kickbox/default/AnyLeftFist Roll Body Active (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFist Roll Body Active (doubleres).png new file mode 100644 index 0000000000..a72adc84c0 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFist Roll Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFist Roll Body Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFist Roll Body Inactive (doubleres).png new file mode 100644 index 0000000000..1c1c24ac56 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFist Roll Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFist Roll BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFist Roll BottomCap Active (doubleres).png new file mode 100644 index 0000000000..d37a6f7922 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFist Roll BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFist Roll BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFist Roll BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..97a53f1339 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFist Roll BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFist Roll Head Active.lua b/NoteSkins/kickbox/default/AnyLeftFist Roll Head Active.lua new file mode 100644 index 0000000000..3c7a58b5c4 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFist Roll Head Active.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('AnyRightFist','Roll Head Active'); + InitCommand=cmd(basezoomx,-1;); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyLeftFist Roll Head Inactive.lua b/NoteSkins/kickbox/default/AnyLeftFist Roll Head Inactive.lua new file mode 100644 index 0000000000..f78715a86b --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFist Roll Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('AnyRightFist','Roll Head Active'); + InitCommand=cmd(basezoomx,-1;diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyLeftFist Tap Lift.lua b/NoteSkins/kickbox/default/AnyLeftFist Tap Lift.lua new file mode 100644 index 0000000000..69436f46e1 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFist Tap Lift.lua @@ -0,0 +1,5 @@ +local t = LoadActor("AnyRightFist Tap Lift") .. { + InitCommand=cmd(basezoomx,-1); +} + +return t; diff --git a/NoteSkins/kickbox/default/AnyLeftFist tap note.lua b/NoteSkins/kickbox/default/AnyLeftFist tap note.lua new file mode 100644 index 0000000000..2b684618ac --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFist tap note.lua @@ -0,0 +1,5 @@ +local t = LoadActor("AnyRightFist tap Note") .. { + InitCommand=cmd(basezoomx,-1); +} + +return t; diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Explosion.lua b/NoteSkins/kickbox/default/AnyLeftFoot Explosion.lua new file mode 100644 index 0000000000..d5a4101423 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFoot Explosion.lua @@ -0,0 +1,5 @@ +local t = LoadActor("AnyRightFoot Explosion") .. { + InitCommand=cmd(basezoomx,-1); +} + +return t; diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Hold Body Active (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFoot Hold Body Active (doubleres).png new file mode 100644 index 0000000000..c6d425f298 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFoot Hold Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Hold Body Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFoot Hold Body Inactive (doubleres).png new file mode 100644 index 0000000000..14494e82c4 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFoot Hold Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Hold BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFoot Hold BottomCap Active (doubleres).png new file mode 100644 index 0000000000..66949fc088 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFoot Hold BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Hold BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFoot Hold BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..f88bc86cfa Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFoot Hold BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Hold Head Active.lua b/NoteSkins/kickbox/default/AnyLeftFoot Hold Head Active.lua new file mode 100644 index 0000000000..c1d9bb879a --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFoot Hold Head Active.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('AnyRightFoot','Hold Head Active'); + InitCommand=cmd(basezoomx,-1;); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Hold Head Inactive.lua b/NoteSkins/kickbox/default/AnyLeftFoot Hold Head Inactive.lua new file mode 100644 index 0000000000..6e40567184 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFoot Hold Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('AnyRightFoot','Hold Head Active'); + InitCommand=cmd(basezoomx,-1;diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Receptor.lua b/NoteSkins/kickbox/default/AnyLeftFoot Receptor.lua new file mode 100644 index 0000000000..9ea311f4bb --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFoot Receptor.lua @@ -0,0 +1,5 @@ +local t = LoadActor("AnyRightFoot Receptor") .. { + InitCommand=cmd(zoomx,-1); +} + +return t; diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Roll Body Active (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFoot Roll Body Active (doubleres).png new file mode 100644 index 0000000000..b001771a70 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFoot Roll Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Roll Body Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFoot Roll Body Inactive (doubleres).png new file mode 100644 index 0000000000..c6fb7b60f7 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFoot Roll Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Roll BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFoot Roll BottomCap Active (doubleres).png new file mode 100644 index 0000000000..268a56e789 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFoot Roll BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Roll BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyLeftFoot Roll BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..b361a4a42d Binary files /dev/null and b/NoteSkins/kickbox/default/AnyLeftFoot Roll BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Roll Head Active.lua b/NoteSkins/kickbox/default/AnyLeftFoot Roll Head Active.lua new file mode 100644 index 0000000000..f5254f25ce --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFoot Roll Head Active.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('AnyRightFoot','Roll Head Active'); + InitCommand=cmd(basezoomx,-1;); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Roll Head Inactive.lua b/NoteSkins/kickbox/default/AnyLeftFoot Roll Head Inactive.lua new file mode 100644 index 0000000000..048ce0d90b --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFoot Roll Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('AnyRightFoot','Roll Head Active'); + InitCommand=cmd(basezoomx,-1;diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyLeftFoot Tap Lift.lua b/NoteSkins/kickbox/default/AnyLeftFoot Tap Lift.lua new file mode 100644 index 0000000000..2adf78c28b --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFoot Tap Lift.lua @@ -0,0 +1,5 @@ +local t = LoadActor("AnyRightFoot Tap Lift") .. { + InitCommand=cmd(basezoomx,-1); +} + +return t; diff --git a/NoteSkins/kickbox/default/AnyLeftFoot tap note.lua b/NoteSkins/kickbox/default/AnyLeftFoot tap note.lua new file mode 100644 index 0000000000..c3cb6b2b34 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyLeftFoot tap note.lua @@ -0,0 +1,5 @@ +local t = LoadActor("AnyRightFoot tap Note") .. { + InitCommand=cmd(basezoomx,-1); +} + +return t; diff --git a/NoteSkins/kickbox/default/AnyRightFist Explosion.lua b/NoteSkins/kickbox/default/AnyRightFist Explosion.lua new file mode 100644 index 0000000000..1c4a2c1c90 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFist Explosion.lua @@ -0,0 +1,29 @@ +local t = Def.ActorFrame { + LoadActor( "_AnyRightFist Hold Explosion" ) .. { + HoldingOnCommand=NOTESKIN:GetMetricA("HoldGhostArrow", "HoldingOnCommand"); + HoldingOffCommand=NOTESKIN:GetMetricA("HoldGhostArrow", "HoldingOffCommand"); + InitCommand=cmd(playcommand,"HoldingOff";finishtweening); + }; + LoadActor( "_AnyRightFist Roll Explosion" ) .. { + RollOnCommand=NOTESKIN:GetMetricA("HoldGhostArrow", "RollOnCommand"); + RollOffCommand=NOTESKIN:GetMetricA("HoldGhostArrow", "RollOffCommand"); + InitCommand=cmd(playcommand,"RollOff";finishtweening); + }; + LoadActor( "_AnyRightFist Tap Explosion Dim" ) .. { + InitCommand=cmd(diffusealpha,0); + W5Command=NOTESKIN:GetMetricA("GhostArrowDim", "W5Command"); + W4Command=NOTESKIN:GetMetricA("GhostArrowDim", "W4Command"); + W3Command=NOTESKIN:GetMetricA("GhostArrowDim", "W3Command"); + W2Command=NOTESKIN:GetMetricA("GhostArrowDim", "W2Command"); + W1Command=NOTESKIN:GetMetricA("GhostArrowDim", "W1Command"); + HeldCommand=NOTESKIN:GetMetricA("GhostArrowDim", "HeldCommand"); + JudgmentCommand=cmd(finishtweening); + BrightCommand=cmd(visible,false); + DimCommand=cmd(visible,true); + }; + LoadActor( "AnyRightFist HitMine Explosion" ) .. { + InitCommand=cmd(blend,"BlendMode_Add";diffusealpha,0); + HitMineCommand=NOTESKIN:GetMetricA("GhostArrowBright", "HitMineCommand"); + }; +} +return t; diff --git a/NoteSkins/kickbox/default/AnyRightFist HitMine Explosion.redir b/NoteSkins/kickbox/default/AnyRightFist HitMine Explosion.redir new file mode 100644 index 0000000000..42966e5ea3 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFist HitMine Explosion.redir @@ -0,0 +1 @@ +Fallback HitMine Explosion \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyRightFist Hold Body Active (doubleres).png b/NoteSkins/kickbox/default/AnyRightFist Hold Body Active (doubleres).png new file mode 100644 index 0000000000..f8d38093cc Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFist Hold Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFist Hold Body Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyRightFist Hold Body Inactive (doubleres).png new file mode 100644 index 0000000000..27a16473b5 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFist Hold Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFist Hold BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/AnyRightFist Hold BottomCap Active (doubleres).png new file mode 100644 index 0000000000..9f7bef91a6 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFist Hold BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFist Hold BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyRightFist Hold BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..48b7f39d65 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFist Hold BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFist Hold Head Active.redir b/NoteSkins/kickbox/default/AnyRightFist Hold Head Active.redir new file mode 100644 index 0000000000..4b94e621e2 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFist Hold Head Active.redir @@ -0,0 +1 @@ +AnyRightFist tap note \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyRightFist Hold Head Inactive.lua b/NoteSkins/kickbox/default/AnyRightFist Hold Head Inactive.lua new file mode 100644 index 0000000000..1da889831b --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFist Hold Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('AnyRightFist','Roll Head Active'); + InitCommand=cmd(diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyRightFist Receptor.lua b/NoteSkins/kickbox/default/AnyRightFist Receptor.lua new file mode 100644 index 0000000000..b02bcff4bf --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFist Receptor.lua @@ -0,0 +1,19 @@ +local t = Def.ActorFrame { + Def.Sprite { + Texture="_AnyRightFist receptor underlay"; + Frame0000=0; + Delay0000=1; + InitCommand=NOTESKIN:GetMetricA('ReceptorArrow', 'InitCommand'); + NoneCommand=NOTESKIN:GetMetricA('ReceptorArrow', 'NoneCommand'); + }; + Def.Sprite { + Texture="_AnyRightFist receptor frame"; + Frame0000=0; + Delay0000=1; + InitCommand=NOTESKIN:GetMetricA('ReceptorOverlay', 'InitCommand'); + PressCommand=NOTESKIN:GetMetricA('ReceptorOverlay', 'PressCommand'); + LiftCommand=NOTESKIN:GetMetricA('ReceptorOverlay', 'LiftCommand'); + NoneCommand=NOTESKIN:GetMetricA('ReceptorArrow', 'NoneCommand'); + }; +}; +return t; diff --git a/NoteSkins/kickbox/default/AnyRightFist Roll Body Active (doubleres).png b/NoteSkins/kickbox/default/AnyRightFist Roll Body Active (doubleres).png new file mode 100644 index 0000000000..6357ddf13e Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFist Roll Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFist Roll Body Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyRightFist Roll Body Inactive (doubleres).png new file mode 100644 index 0000000000..7018cca581 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFist Roll Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFist Roll BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/AnyRightFist Roll BottomCap Active (doubleres).png new file mode 100644 index 0000000000..0fc3e30726 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFist Roll BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFist Roll BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyRightFist Roll BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..7e2ba13d7a Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFist Roll BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFist Roll Head Active.redir b/NoteSkins/kickbox/default/AnyRightFist Roll Head Active.redir new file mode 100644 index 0000000000..4b94e621e2 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFist Roll Head Active.redir @@ -0,0 +1 @@ +AnyRightFist tap note \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyRightFist Roll Head Inactive.lua b/NoteSkins/kickbox/default/AnyRightFist Roll Head Inactive.lua new file mode 100644 index 0000000000..1da889831b --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFist Roll Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('AnyRightFist','Roll Head Active'); + InitCommand=cmd(diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyRightFist Tap Lift.lua b/NoteSkins/kickbox/default/AnyRightFist Tap Lift.lua new file mode 100644 index 0000000000..df2bf160a9 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFist Tap Lift.lua @@ -0,0 +1,10 @@ +local t = Def.ActorFrame { + InitCommand=cmd(pulse;effectclock,'beat';effectmagnitude,1,1.2,1); + Def.Sprite { + Texture=NOTESKIN:GetPath( '_AnyRightFist', 'tap lift' ); + Frame0000=0; + Delay0000=1; + InitCommand=cmd(diffuseramp;effectclock,'beat';effectcolor1,color("1,1,1,1");effectcolor2,color("1,1,1,0.5")); + }; +}; +return t; diff --git a/NoteSkins/kickbox/default/AnyRightFist tap Note (doubleres).png b/NoteSkins/kickbox/default/AnyRightFist tap Note (doubleres).png new file mode 100644 index 0000000000..c973d2d61a Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFist tap Note (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFoot Explosion.lua b/NoteSkins/kickbox/default/AnyRightFoot Explosion.lua new file mode 100644 index 0000000000..d6626a9543 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFoot Explosion.lua @@ -0,0 +1,29 @@ +local t = Def.ActorFrame { + LoadActor( "_AnyRightFoot Hold Explosion" ) .. { + HoldingOnCommand=NOTESKIN:GetMetricA("HoldGhostArrow", "HoldingOnCommand"); + HoldingOffCommand=NOTESKIN:GetMetricA("HoldGhostArrow", "HoldingOffCommand"); + InitCommand=cmd(playcommand,"HoldingOff";finishtweening); + }; + LoadActor( "_AnyRightFoot Roll Explosion" ) .. { + RollOnCommand=NOTESKIN:GetMetricA("HoldGhostArrow", "RollOnCommand"); + RollOffCommand=NOTESKIN:GetMetricA("HoldGhostArrow", "RollOffCommand"); + InitCommand=cmd(playcommand,"RollOff";finishtweening); + }; + LoadActor( "_AnyRightFoot Tap Explosion Dim" ) .. { + InitCommand=cmd(diffusealpha,0); + W5Command=NOTESKIN:GetMetricA("GhostArrowDim", "W5Command"); + W4Command=NOTESKIN:GetMetricA("GhostArrowDim", "W4Command"); + W3Command=NOTESKIN:GetMetricA("GhostArrowDim", "W3Command"); + W2Command=NOTESKIN:GetMetricA("GhostArrowDim", "W2Command"); + W1Command=NOTESKIN:GetMetricA("GhostArrowDim", "W1Command"); + HeldCommand=NOTESKIN:GetMetricA("GhostArrowDim", "HeldCommand"); + JudgmentCommand=cmd(finishtweening); + BrightCommand=cmd(visible,false); + DimCommand=cmd(visible,true); + }; + LoadActor( "AnyRightFoot HitMine Explosion" ) .. { + InitCommand=cmd(blend,"BlendMode_Add";diffusealpha,0); + HitMineCommand=NOTESKIN:GetMetricA("GhostArrowBright", "HitMineCommand"); + }; +} +return t; diff --git a/NoteSkins/kickbox/default/AnyRightFoot HitMine Explosion.redir b/NoteSkins/kickbox/default/AnyRightFoot HitMine Explosion.redir new file mode 100644 index 0000000000..42966e5ea3 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFoot HitMine Explosion.redir @@ -0,0 +1 @@ +Fallback HitMine Explosion \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyRightFoot Hold Body Active (doubleres).png b/NoteSkins/kickbox/default/AnyRightFoot Hold Body Active (doubleres).png new file mode 100644 index 0000000000..2edfc9edcc Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFoot Hold Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFoot Hold Body Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyRightFoot Hold Body Inactive (doubleres).png new file mode 100644 index 0000000000..e0ce58df3f Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFoot Hold Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFoot Hold BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/AnyRightFoot Hold BottomCap Active (doubleres).png new file mode 100644 index 0000000000..ff1c84141d Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFoot Hold BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFoot Hold BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyRightFoot Hold BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..59a3396f10 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFoot Hold BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFoot Hold Head Active.redir b/NoteSkins/kickbox/default/AnyRightFoot Hold Head Active.redir new file mode 100644 index 0000000000..7b3cc70420 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFoot Hold Head Active.redir @@ -0,0 +1 @@ +AnyRightFoot tap note \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyRightFoot Hold Head Inactive.redir b/NoteSkins/kickbox/default/AnyRightFoot Hold Head Inactive.redir new file mode 100644 index 0000000000..7b3cc70420 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFoot Hold Head Inactive.redir @@ -0,0 +1 @@ +AnyRightFoot tap note \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyRightFoot Receptor.lua b/NoteSkins/kickbox/default/AnyRightFoot Receptor.lua new file mode 100644 index 0000000000..e22d359884 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFoot Receptor.lua @@ -0,0 +1,19 @@ +local t = Def.ActorFrame { + Def.Sprite { + Texture="_AnyRightFoot receptor underlay"; + Frame0000=0; + Delay0000=1; + InitCommand=NOTESKIN:GetMetricA('ReceptorArrow', 'InitCommand'); + NoneCommand=NOTESKIN:GetMetricA('ReceptorArrow', 'NoneCommand'); + }; + Def.Sprite { + Texture="_AnyRightFoot receptor frame"; + Frame0000=0; + Delay0000=1; + InitCommand=NOTESKIN:GetMetricA('ReceptorOverlay', 'InitCommand'); + PressCommand=NOTESKIN:GetMetricA('ReceptorOverlay', 'PressCommand'); + LiftCommand=NOTESKIN:GetMetricA('ReceptorOverlay', 'LiftCommand'); + NoneCommand=NOTESKIN:GetMetricA('ReceptorArrow', 'NoneCommand'); + }; +}; +return t; diff --git a/NoteSkins/kickbox/default/AnyRightFoot Roll Body Active (doubleres).png b/NoteSkins/kickbox/default/AnyRightFoot Roll Body Active (doubleres).png new file mode 100644 index 0000000000..442a9af6d5 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFoot Roll Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFoot Roll Body Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyRightFoot Roll Body Inactive (doubleres).png new file mode 100644 index 0000000000..62d6829cd3 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFoot Roll Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFoot Roll BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/AnyRightFoot Roll BottomCap Active (doubleres).png new file mode 100644 index 0000000000..1f9213caca Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFoot Roll BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFoot Roll BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/AnyRightFoot Roll BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..4c215082a6 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFoot Roll BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/AnyRightFoot Roll Head Active.redir b/NoteSkins/kickbox/default/AnyRightFoot Roll Head Active.redir new file mode 100644 index 0000000000..7b3cc70420 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFoot Roll Head Active.redir @@ -0,0 +1 @@ +AnyRightFoot tap note \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyRightFoot Roll Head Inactive.lua b/NoteSkins/kickbox/default/AnyRightFoot Roll Head Inactive.lua new file mode 100644 index 0000000000..ef274ab9f3 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFoot Roll Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('AnyRightFoot','Roll Head Active'); + InitCommand=cmd(diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/AnyRightFoot Tap Lift.lua b/NoteSkins/kickbox/default/AnyRightFoot Tap Lift.lua new file mode 100644 index 0000000000..af6974d334 --- /dev/null +++ b/NoteSkins/kickbox/default/AnyRightFoot Tap Lift.lua @@ -0,0 +1,10 @@ +local t = Def.ActorFrame { + InitCommand=cmd(pulse;effectclock,'beat';effectmagnitude,1,1.2,1); + Def.Sprite { + Texture=NOTESKIN:GetPath( '_AnyRightFoot', 'tap lift' ); + Frame0000=0; + Delay0000=1; + InitCommand=cmd(diffuseramp;effectclock,'beat';effectcolor1,color("1,1,1,1");effectcolor2,color("1,1,1,0.5")); + }; +}; +return t; diff --git a/NoteSkins/kickbox/default/AnyRightFoot tap note (doubleres).png b/NoteSkins/kickbox/default/AnyRightFoot tap note (doubleres).png new file mode 100644 index 0000000000..6cc60d40d3 Binary files /dev/null and b/NoteSkins/kickbox/default/AnyRightFoot tap note (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFist Hold Body Active (doubleres).png b/NoteSkins/kickbox/default/DownLeftFist Hold Body Active (doubleres).png new file mode 100644 index 0000000000..db01049885 Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFist Hold Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFist Hold Body Inactive (doubleres).png b/NoteSkins/kickbox/default/DownLeftFist Hold Body Inactive (doubleres).png new file mode 100644 index 0000000000..27a16473b5 Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFist Hold Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFist Hold BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/DownLeftFist Hold BottomCap Active (doubleres).png new file mode 100644 index 0000000000..3972aee3e0 Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFist Hold BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFist Hold BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/DownLeftFist Hold BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..6c13aab879 Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFist Hold BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFist Hold Head Active.lua b/NoteSkins/kickbox/default/DownLeftFist Hold Head Active.lua new file mode 100644 index 0000000000..546daeca87 --- /dev/null +++ b/NoteSkins/kickbox/default/DownLeftFist Hold Head Active.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('DownRightFist','Hold Head Active'); + InitCommand=cmd(basezoomx,-1;); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownLeftFist Hold Head Inactive.lua b/NoteSkins/kickbox/default/DownLeftFist Hold Head Inactive.lua new file mode 100644 index 0000000000..58b947ade3 --- /dev/null +++ b/NoteSkins/kickbox/default/DownLeftFist Hold Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('DownRightFist','Hold Head Active'); + InitCommand=cmd(basezoomx,-1;diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownLeftFist Roll Body Active (doubleres).png b/NoteSkins/kickbox/default/DownLeftFist Roll Body Active (doubleres).png new file mode 100644 index 0000000000..80a697aaa0 Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFist Roll Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFist Roll Body Inactive (doubleres).png b/NoteSkins/kickbox/default/DownLeftFist Roll Body Inactive (doubleres).png new file mode 100644 index 0000000000..1c1c24ac56 Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFist Roll Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFist Roll BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/DownLeftFist Roll BottomCap Active (doubleres).png new file mode 100644 index 0000000000..5fbd74b81e Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFist Roll BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFist Roll BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/DownLeftFist Roll BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..97a53f1339 Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFist Roll BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFist Roll Head Active.lua b/NoteSkins/kickbox/default/DownLeftFist Roll Head Active.lua new file mode 100644 index 0000000000..ffc18da6b2 --- /dev/null +++ b/NoteSkins/kickbox/default/DownLeftFist Roll Head Active.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('DownRightFist','Roll Head Active'); + InitCommand=cmd(basezoomx,-1;); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownLeftFist Roll Head Inactive.lua b/NoteSkins/kickbox/default/DownLeftFist Roll Head Inactive.lua new file mode 100644 index 0000000000..dd9179c9d5 --- /dev/null +++ b/NoteSkins/kickbox/default/DownLeftFist Roll Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('DownRightFist','Roll Head Active'); + InitCommand=cmd(basezoomx,-1;diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownLeftFist tap note.lua b/NoteSkins/kickbox/default/DownLeftFist tap note.lua new file mode 100644 index 0000000000..0da60031f1 --- /dev/null +++ b/NoteSkins/kickbox/default/DownLeftFist tap note.lua @@ -0,0 +1,5 @@ +local t = LoadActor("DownRightFist tap Note") .. { + InitCommand=cmd(basezoomx,-1); +} + +return t; diff --git a/NoteSkins/kickbox/default/DownLeftFoot Hold Body Active (doubleres).png b/NoteSkins/kickbox/default/DownLeftFoot Hold Body Active (doubleres).png new file mode 100644 index 0000000000..df3691df3e Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFoot Hold Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFoot Hold Body Inactive (doubleres).png b/NoteSkins/kickbox/default/DownLeftFoot Hold Body Inactive (doubleres).png new file mode 100644 index 0000000000..14494e82c4 Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFoot Hold Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFoot Hold BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/DownLeftFoot Hold BottomCap Active (doubleres).png new file mode 100644 index 0000000000..46e135de94 Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFoot Hold BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFoot Hold BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/DownLeftFoot Hold BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..f88bc86cfa Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFoot Hold BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFoot Hold Head Active.lua b/NoteSkins/kickbox/default/DownLeftFoot Hold Head Active.lua new file mode 100644 index 0000000000..c54e0cb61e --- /dev/null +++ b/NoteSkins/kickbox/default/DownLeftFoot Hold Head Active.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('DownRightFoot','Hold Head Active'); + InitCommand=cmd(basezoomx,-1;); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownLeftFoot Hold Head Inactive.lua b/NoteSkins/kickbox/default/DownLeftFoot Hold Head Inactive.lua new file mode 100644 index 0000000000..fc85fe577e --- /dev/null +++ b/NoteSkins/kickbox/default/DownLeftFoot Hold Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('DownRightFoot','Hold Head Active'); + InitCommand=cmd(basezoomx,-1;;diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownLeftFoot Roll Body Active (doubleres).png b/NoteSkins/kickbox/default/DownLeftFoot Roll Body Active (doubleres).png new file mode 100644 index 0000000000..0ab2d0ae31 Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFoot Roll Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFoot Roll Body Inactive (doubleres).png b/NoteSkins/kickbox/default/DownLeftFoot Roll Body Inactive (doubleres).png new file mode 100644 index 0000000000..c6fb7b60f7 Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFoot Roll Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFoot Roll BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/DownLeftFoot Roll BottomCap Active (doubleres).png new file mode 100644 index 0000000000..0360109f8a Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFoot Roll BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFoot Roll BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/DownLeftFoot Roll BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..b361a4a42d Binary files /dev/null and b/NoteSkins/kickbox/default/DownLeftFoot Roll BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownLeftFoot Roll Head Active.lua b/NoteSkins/kickbox/default/DownLeftFoot Roll Head Active.lua new file mode 100644 index 0000000000..9ced3372f7 --- /dev/null +++ b/NoteSkins/kickbox/default/DownLeftFoot Roll Head Active.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('DownRightFoot','Roll Head Active'); + InitCommand=cmd(basezoomx,-1;); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownLeftFoot Roll Head Inactive.lua b/NoteSkins/kickbox/default/DownLeftFoot Roll Head Inactive.lua new file mode 100644 index 0000000000..baab4167b6 --- /dev/null +++ b/NoteSkins/kickbox/default/DownLeftFoot Roll Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('DownRightFoot','Roll Head Active'); + InitCommand=cmd(basezoomx,-1;diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownLeftFoot tap note.lua b/NoteSkins/kickbox/default/DownLeftFoot tap note.lua new file mode 100644 index 0000000000..7befd52196 --- /dev/null +++ b/NoteSkins/kickbox/default/DownLeftFoot tap note.lua @@ -0,0 +1,5 @@ +local t = LoadActor("DownRightfoot tap Note") .. { + InitCommand=cmd(basezoomx,-1); +} + +return t; diff --git a/NoteSkins/kickbox/default/DownRightFist Hold Body Active (doubleres).png b/NoteSkins/kickbox/default/DownRightFist Hold Body Active (doubleres).png new file mode 100644 index 0000000000..db01049885 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFist Hold Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFist Hold Body Inactive (doubleres).png b/NoteSkins/kickbox/default/DownRightFist Hold Body Inactive (doubleres).png new file mode 100644 index 0000000000..27a16473b5 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFist Hold Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFist Hold BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/DownRightFist Hold BottomCap Active (doubleres).png new file mode 100644 index 0000000000..7ce3ea8918 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFist Hold BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFist Hold BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/DownRightFist Hold BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..48b7f39d65 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFist Hold BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFist Hold Head Active.redir b/NoteSkins/kickbox/default/DownRightFist Hold Head Active.redir new file mode 100644 index 0000000000..f75ddace0e --- /dev/null +++ b/NoteSkins/kickbox/default/DownRightFist Hold Head Active.redir @@ -0,0 +1 @@ +DownRightFist Tap Note \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownRightFist Hold Head Inactive.lua b/NoteSkins/kickbox/default/DownRightFist Hold Head Inactive.lua new file mode 100644 index 0000000000..9421a85389 --- /dev/null +++ b/NoteSkins/kickbox/default/DownRightFist Hold Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('DownRightFist','Hold Head Active'); + InitCommand=cmd(diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownRightFist Roll Body Active (doubleres).png b/NoteSkins/kickbox/default/DownRightFist Roll Body Active (doubleres).png new file mode 100644 index 0000000000..7d8e6e4eb0 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFist Roll Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFist Roll Body Inactive (doubleres).png b/NoteSkins/kickbox/default/DownRightFist Roll Body Inactive (doubleres).png new file mode 100644 index 0000000000..7018cca581 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFist Roll Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFist Roll BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/DownRightFist Roll BottomCap Active (doubleres).png new file mode 100644 index 0000000000..b49d74be20 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFist Roll BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFist Roll BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/DownRightFist Roll BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..7e2ba13d7a Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFist Roll BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFist Roll Head Active.redir b/NoteSkins/kickbox/default/DownRightFist Roll Head Active.redir new file mode 100644 index 0000000000..f75ddace0e --- /dev/null +++ b/NoteSkins/kickbox/default/DownRightFist Roll Head Active.redir @@ -0,0 +1 @@ +DownRightFist Tap Note \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownRightFist Roll Head Inactive.lua b/NoteSkins/kickbox/default/DownRightFist Roll Head Inactive.lua new file mode 100644 index 0000000000..e932453fbf --- /dev/null +++ b/NoteSkins/kickbox/default/DownRightFist Roll Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('DownRightFist','Roll Head Active'); + InitCommand=cmd(diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownRightFist Tap Note (doubleres).png b/NoteSkins/kickbox/default/DownRightFist Tap Note (doubleres).png new file mode 100644 index 0000000000..4910ff6934 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFist Tap Note (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFoot Hold Body Active (doubleres).png b/NoteSkins/kickbox/default/DownRightFoot Hold Body Active (doubleres).png new file mode 100644 index 0000000000..e33823e061 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFoot Hold Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFoot Hold Body Inactive (doubleres).png b/NoteSkins/kickbox/default/DownRightFoot Hold Body Inactive (doubleres).png new file mode 100644 index 0000000000..e0ce58df3f Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFoot Hold Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFoot Hold BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/DownRightFoot Hold BottomCap Active (doubleres).png new file mode 100644 index 0000000000..0ea451be10 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFoot Hold BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFoot Hold BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/DownRightFoot Hold BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..59a3396f10 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFoot Hold BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFoot Hold Head Active.redir b/NoteSkins/kickbox/default/DownRightFoot Hold Head Active.redir new file mode 100644 index 0000000000..cfce5762a3 --- /dev/null +++ b/NoteSkins/kickbox/default/DownRightFoot Hold Head Active.redir @@ -0,0 +1 @@ +DownRightFoot Tap Note \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownRightFoot Hold Head Inactive.lua b/NoteSkins/kickbox/default/DownRightFoot Hold Head Inactive.lua new file mode 100644 index 0000000000..3da4bc208f --- /dev/null +++ b/NoteSkins/kickbox/default/DownRightFoot Hold Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('DownRightFoot','Hold Head Active'); + InitCommand=cmd(diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownRightFoot Roll Body Active (doubleres).png b/NoteSkins/kickbox/default/DownRightFoot Roll Body Active (doubleres).png new file mode 100644 index 0000000000..4a5053ae40 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFoot Roll Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFoot Roll Body Inactive (doubleres).png b/NoteSkins/kickbox/default/DownRightFoot Roll Body Inactive (doubleres).png new file mode 100644 index 0000000000..62d6829cd3 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFoot Roll Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFoot Roll BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/DownRightFoot Roll BottomCap Active (doubleres).png new file mode 100644 index 0000000000..452664de64 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFoot Roll BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFoot Roll BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/DownRightFoot Roll BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..4c215082a6 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFoot Roll BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/DownRightFoot Roll Head Active.redir b/NoteSkins/kickbox/default/DownRightFoot Roll Head Active.redir new file mode 100644 index 0000000000..cfce5762a3 --- /dev/null +++ b/NoteSkins/kickbox/default/DownRightFoot Roll Head Active.redir @@ -0,0 +1 @@ +DownRightFoot Tap Note \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownRightFoot Roll Head Inactive.lua b/NoteSkins/kickbox/default/DownRightFoot Roll Head Inactive.lua new file mode 100644 index 0000000000..1a8e3831e1 --- /dev/null +++ b/NoteSkins/kickbox/default/DownRightFoot Roll Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('DownRightFoot','Roll Head Active'); + InitCommand=cmd(diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/DownRightFoot tap note (doubleres).png b/NoteSkins/kickbox/default/DownRightFoot tap note (doubleres).png new file mode 100644 index 0000000000..03175feae6 Binary files /dev/null and b/NoteSkins/kickbox/default/DownRightFoot tap note (doubleres).png differ diff --git a/NoteSkins/kickbox/default/Fallback HitMine Explosion.png b/NoteSkins/kickbox/default/Fallback HitMine Explosion.png new file mode 100644 index 0000000000..34c26623b2 Binary files /dev/null and b/NoteSkins/kickbox/default/Fallback HitMine Explosion.png differ diff --git a/NoteSkins/kickbox/default/NoteSkin.lua b/NoteSkins/kickbox/default/NoteSkin.lua new file mode 100644 index 0000000000..36d13e337a --- /dev/null +++ b/NoteSkins/kickbox/default/NoteSkin.lua @@ -0,0 +1,77 @@ +local ret = ... or {}; + +local pn = Var "Player" + +local OldRedir = ret.Redir; +ret.Redir = function(sButton, sElement) + -- Replace all receptors with genericized ones + if string.find(sButton,"RightFoot") and string.find(sElement, "Receptor") then + return "AnyRightFoot", "Receptor" + end + if string.find(sButton,"LeftFoot") and string.find(sElement, "Receptor") then + return "AnyLeftFoot", "Receptor" + end + if string.find(sButton,"RightFist") and string.find(sElement, "Receptor") then + return "AnyRightFist", "Receptor" + end + if string.find(sButton,"LeftFist") and string.find(sElement, "Receptor") then + return "AnyLeftFist", "Receptor" + end + + -- Replace all Lifts with genericized ones + if string.find(sButton,"RightFoot") and string.find(sElement, "Tap Lift") then + return "AnyRightFoot", "Tap Lift" + end + if string.find(sButton,"LeftFoot") and string.find(sElement, "Tap Lift") then + return "AnyLeftFoot", "Tap Lift" + end + if string.find(sButton,"RightFist") and string.find(sElement, "Tap Lift") then + return "AnyRightFist", "Tap Lift" + end + if string.find(sButton,"LeftFist") and string.find(sElement, "Tap Lift") then + return "AnyLeftFist", "Tap Lift" + end + + -- Replace all explosions with AnyRight* or AnyLeft*. Is there a better way to do this? + if string.find(sButton,"RightFoot") and string.find(sElement, "Explosion") then + return "AnyRightFoot", "Explosion" + end + if string.find(sButton,"LeftFoot") and string.find(sElement, "Explosion") then + return "AnyLeftFoot", "Explosion" + end + if string.find(sButton,"RightFist") and string.find(sElement, "Explosion") then + return "AnyRightFist", "Explosion" + end + if string.find(sButton,"LeftFist") and string.find(sElement, "Explosion") then + return "AnyLeftFist", "Explosion" + end + + if (GAMESTATE:GetCurrentStyle(pn):GetStepsType() == "StepsType_Kickbox_Human") then + if string.find(sButton, "LeftFoot") then + sButton = "AnyLeftFoot" + end + if string.find(sButton, "RightFoot") then + sButton = "AnyRightFoot" + end + -- + if string.find(sButton, "LeftFist") then + sButton = "AnyLeftFist" + end + if string.find(sButton, "RightFist") then + sButton = "AnyRightFist" + end + end + + if (GAMESTATE:GetCurrentStyle(pn):GetStepsType() == "StepsType_Kickbox_Insect") then + if string.find(sButton, "LeftFoot") then + sButton = "AnyLeftFoot" + end + if string.find(sButton, "RightFoot") then + sButton = "AnyRightFoot" + end + end + -- return OldRedir(sButton, sElement); + return sButton, sElement +end + +return ret \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpLeftFist Hold Body Active (doubleres).png b/NoteSkins/kickbox/default/UpLeftFist Hold Body Active (doubleres).png new file mode 100644 index 0000000000..45cc937c45 Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFist Hold Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFist Hold Body Inactive (doubleres).png b/NoteSkins/kickbox/default/UpLeftFist Hold Body Inactive (doubleres).png new file mode 100644 index 0000000000..27a16473b5 Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFist Hold Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFist Hold BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/UpLeftFist Hold BottomCap Active (doubleres).png new file mode 100644 index 0000000000..cedaa8d60c Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFist Hold BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFist Hold BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/UpLeftFist Hold BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..6c13aab879 Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFist Hold BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFist Hold Head Active.lua b/NoteSkins/kickbox/default/UpLeftFist Hold Head Active.lua new file mode 100644 index 0000000000..fc9b4d75fb --- /dev/null +++ b/NoteSkins/kickbox/default/UpLeftFist Hold Head Active.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('UpRightFist','Hold Head Active'); + InitCommand=cmd(basezoomx,-1); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpLeftFist Hold Head Inactive.lua b/NoteSkins/kickbox/default/UpLeftFist Hold Head Inactive.lua new file mode 100644 index 0000000000..843b85ee6f --- /dev/null +++ b/NoteSkins/kickbox/default/UpLeftFist Hold Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('UpRightFist','Hold Head Active'); + InitCommand=cmd(basezoomx,-1;diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpLeftFist Roll Body Active (doubleres).png b/NoteSkins/kickbox/default/UpLeftFist Roll Body Active (doubleres).png new file mode 100644 index 0000000000..2b1ba16fdc Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFist Roll Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFist Roll Body Inactive (doubleres).png b/NoteSkins/kickbox/default/UpLeftFist Roll Body Inactive (doubleres).png new file mode 100644 index 0000000000..1c1c24ac56 Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFist Roll Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFist Roll BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/UpLeftFist Roll BottomCap Active (doubleres).png new file mode 100644 index 0000000000..29c99b9ceb Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFist Roll BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFist Roll BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/UpLeftFist Roll BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..97a53f1339 Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFist Roll BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFist Roll Head Active.lua b/NoteSkins/kickbox/default/UpLeftFist Roll Head Active.lua new file mode 100644 index 0000000000..130785536e --- /dev/null +++ b/NoteSkins/kickbox/default/UpLeftFist Roll Head Active.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('UpRightFist','Roll Head Active'); + InitCommand=cmd(basezoomx,-1); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpLeftFist Roll Head Inactive.lua b/NoteSkins/kickbox/default/UpLeftFist Roll Head Inactive.lua new file mode 100644 index 0000000000..5a4f6740e1 --- /dev/null +++ b/NoteSkins/kickbox/default/UpLeftFist Roll Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('UpRightFist','Roll Head Active'); + InitCommand=cmd(basezoomx,-1;diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpLeftFist tap note.lua b/NoteSkins/kickbox/default/UpLeftFist tap note.lua new file mode 100644 index 0000000000..19354e02ef --- /dev/null +++ b/NoteSkins/kickbox/default/UpLeftFist tap note.lua @@ -0,0 +1,5 @@ +local t = LoadActor("UpRightFist tap Note") .. { + InitCommand=cmd(basezoomx,-1); +} + +return t; diff --git a/NoteSkins/kickbox/default/UpLeftFoot Hold Body Active (doubleres).png b/NoteSkins/kickbox/default/UpLeftFoot Hold Body Active (doubleres).png new file mode 100644 index 0000000000..04df3ae21f Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFoot Hold Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFoot Hold Body Inactive (doubleres).png b/NoteSkins/kickbox/default/UpLeftFoot Hold Body Inactive (doubleres).png new file mode 100644 index 0000000000..14494e82c4 Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFoot Hold Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFoot Hold BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/UpLeftFoot Hold BottomCap Active (doubleres).png new file mode 100644 index 0000000000..ad57537f3b Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFoot Hold BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFoot Hold BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/UpLeftFoot Hold BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..f88bc86cfa Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFoot Hold BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFoot Hold Head Active.lua b/NoteSkins/kickbox/default/UpLeftFoot Hold Head Active.lua new file mode 100644 index 0000000000..61146282f1 --- /dev/null +++ b/NoteSkins/kickbox/default/UpLeftFoot Hold Head Active.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('UpRightFoot','Hold Head Active'); + InitCommand=cmd(basezoomx,-1); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpLeftFoot Hold Head Inactive.lua b/NoteSkins/kickbox/default/UpLeftFoot Hold Head Inactive.lua new file mode 100644 index 0000000000..c5a6822b3a --- /dev/null +++ b/NoteSkins/kickbox/default/UpLeftFoot Hold Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('UpRightFoot','Hold Head Active'); + InitCommand=cmd(basezoomx,-1;diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpLeftFoot Roll Body Active (doubleres).png b/NoteSkins/kickbox/default/UpLeftFoot Roll Body Active (doubleres).png new file mode 100644 index 0000000000..73aa60a8bb Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFoot Roll Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFoot Roll Body Inactive (doubleres).png b/NoteSkins/kickbox/default/UpLeftFoot Roll Body Inactive (doubleres).png new file mode 100644 index 0000000000..c6fb7b60f7 Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFoot Roll Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFoot Roll BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/UpLeftFoot Roll BottomCap Active (doubleres).png new file mode 100644 index 0000000000..34196a23cc Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFoot Roll BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFoot Roll BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/UpLeftFoot Roll BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..b361a4a42d Binary files /dev/null and b/NoteSkins/kickbox/default/UpLeftFoot Roll BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpLeftFoot Roll Head Active.lua b/NoteSkins/kickbox/default/UpLeftFoot Roll Head Active.lua new file mode 100644 index 0000000000..dde3793531 --- /dev/null +++ b/NoteSkins/kickbox/default/UpLeftFoot Roll Head Active.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('UpRightFoot','Roll Head Active'); + InitCommand=cmd(basezoomx,-1); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpLeftFoot Roll Head Inactive.lua b/NoteSkins/kickbox/default/UpLeftFoot Roll Head Inactive.lua new file mode 100644 index 0000000000..e6cf005901 --- /dev/null +++ b/NoteSkins/kickbox/default/UpLeftFoot Roll Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('UpRightFoot','Roll Head Active'); + InitCommand=cmd(basezoomx,-1;diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpLeftFoot tap note.lua b/NoteSkins/kickbox/default/UpLeftFoot tap note.lua new file mode 100644 index 0000000000..b5a0ee700a --- /dev/null +++ b/NoteSkins/kickbox/default/UpLeftFoot tap note.lua @@ -0,0 +1,5 @@ +local t = LoadActor("UpRightFoot tap Note") .. { + InitCommand=cmd(basezoomx,-1); +} + +return t; diff --git a/NoteSkins/kickbox/default/UpRightFist Hold Body Active (doubleres).png b/NoteSkins/kickbox/default/UpRightFist Hold Body Active (doubleres).png new file mode 100644 index 0000000000..45cc937c45 Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFist Hold Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFist Hold Body Inactive (doubleres).png b/NoteSkins/kickbox/default/UpRightFist Hold Body Inactive (doubleres).png new file mode 100644 index 0000000000..27a16473b5 Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFist Hold Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFist Hold BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/UpRightFist Hold BottomCap Active (doubleres).png new file mode 100644 index 0000000000..ca71791d1f Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFist Hold BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFist Hold BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/UpRightFist Hold BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..48b7f39d65 Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFist Hold BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFist Hold Head Active.redir b/NoteSkins/kickbox/default/UpRightFist Hold Head Active.redir new file mode 100644 index 0000000000..dd2524567c --- /dev/null +++ b/NoteSkins/kickbox/default/UpRightFist Hold Head Active.redir @@ -0,0 +1 @@ +UpRightFist tap note \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpRightFist Hold Head Inactive.lua b/NoteSkins/kickbox/default/UpRightFist Hold Head Inactive.lua new file mode 100644 index 0000000000..6ee636e5ae --- /dev/null +++ b/NoteSkins/kickbox/default/UpRightFist Hold Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('UpRightFist','Hold Head Active'); + InitCommand=cmd(diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpRightFist Roll Body Active (doubleres).png b/NoteSkins/kickbox/default/UpRightFist Roll Body Active (doubleres).png new file mode 100644 index 0000000000..6340cd7e48 Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFist Roll Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFist Roll Body Inactive (doubleres).png b/NoteSkins/kickbox/default/UpRightFist Roll Body Inactive (doubleres).png new file mode 100644 index 0000000000..7018cca581 Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFist Roll Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFist Roll BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/UpRightFist Roll BottomCap Active (doubleres).png new file mode 100644 index 0000000000..b4347051f9 Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFist Roll BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFist Roll BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/UpRightFist Roll BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..7e2ba13d7a Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFist Roll BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFist Roll Head Active.redir b/NoteSkins/kickbox/default/UpRightFist Roll Head Active.redir new file mode 100644 index 0000000000..dd2524567c --- /dev/null +++ b/NoteSkins/kickbox/default/UpRightFist Roll Head Active.redir @@ -0,0 +1 @@ +UpRightFist tap note \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpRightFist Roll Head Inactive.lua b/NoteSkins/kickbox/default/UpRightFist Roll Head Inactive.lua new file mode 100644 index 0000000000..8224fb70dc --- /dev/null +++ b/NoteSkins/kickbox/default/UpRightFist Roll Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('UpRightFist','Roll Head Active'); + InitCommand=cmd(diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpRightFist Tap Note (doubleres).png b/NoteSkins/kickbox/default/UpRightFist Tap Note (doubleres).png new file mode 100644 index 0000000000..691ed89bd8 Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFist Tap Note (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFoot Hold Body Active (doubleres).png b/NoteSkins/kickbox/default/UpRightFoot Hold Body Active (doubleres).png new file mode 100644 index 0000000000..2d23d94c70 Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFoot Hold Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFoot Hold Body Inactive (doubleres).png b/NoteSkins/kickbox/default/UpRightFoot Hold Body Inactive (doubleres).png new file mode 100644 index 0000000000..e0ce58df3f Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFoot Hold Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFoot Hold BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/UpRightFoot Hold BottomCap Active (doubleres).png new file mode 100644 index 0000000000..5dc1b546fa Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFoot Hold BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFoot Hold BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/UpRightFoot Hold BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..59a3396f10 Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFoot Hold BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFoot Hold Head Active.redir b/NoteSkins/kickbox/default/UpRightFoot Hold Head Active.redir new file mode 100644 index 0000000000..173d519124 --- /dev/null +++ b/NoteSkins/kickbox/default/UpRightFoot Hold Head Active.redir @@ -0,0 +1 @@ +UpRightFoot tap note \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpRightFoot Hold Head Inactive.lua b/NoteSkins/kickbox/default/UpRightFoot Hold Head Inactive.lua new file mode 100644 index 0000000000..f6ece95dcf --- /dev/null +++ b/NoteSkins/kickbox/default/UpRightFoot Hold Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('UpRightFoot','Hold Head Active'); + InitCommand=cmd(diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpRightFoot Roll Body Active (doubleres).png b/NoteSkins/kickbox/default/UpRightFoot Roll Body Active (doubleres).png new file mode 100644 index 0000000000..11558f0025 Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFoot Roll Body Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFoot Roll Body Inactive (doubleres).png b/NoteSkins/kickbox/default/UpRightFoot Roll Body Inactive (doubleres).png new file mode 100644 index 0000000000..62d6829cd3 Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFoot Roll Body Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFoot Roll BottomCap Active (doubleres).png b/NoteSkins/kickbox/default/UpRightFoot Roll BottomCap Active (doubleres).png new file mode 100644 index 0000000000..dd7770fd1b Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFoot Roll BottomCap Active (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFoot Roll BottomCap Inactive (doubleres).png b/NoteSkins/kickbox/default/UpRightFoot Roll BottomCap Inactive (doubleres).png new file mode 100644 index 0000000000..4c215082a6 Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFoot Roll BottomCap Inactive (doubleres).png differ diff --git a/NoteSkins/kickbox/default/UpRightFoot Roll Head Active.redir b/NoteSkins/kickbox/default/UpRightFoot Roll Head Active.redir new file mode 100644 index 0000000000..173d519124 --- /dev/null +++ b/NoteSkins/kickbox/default/UpRightFoot Roll Head Active.redir @@ -0,0 +1 @@ +UpRightFoot tap note \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpRightFoot Roll Head Inactive.lua b/NoteSkins/kickbox/default/UpRightFoot Roll Head Inactive.lua new file mode 100644 index 0000000000..8c1e64442a --- /dev/null +++ b/NoteSkins/kickbox/default/UpRightFoot Roll Head Inactive.lua @@ -0,0 +1,4 @@ +return Def.Sprite { + Texture=NOTESKIN:GetPath('UpRightFoot','Roll Head Active'); + InitCommand=cmd(diffuse,color("0.5,0.5,0.5,1")); +}; \ No newline at end of file diff --git a/NoteSkins/kickbox/default/UpRightFoot tap note (doubleres).png b/NoteSkins/kickbox/default/UpRightFoot tap note (doubleres).png new file mode 100644 index 0000000000..3b7b2103c6 Binary files /dev/null and b/NoteSkins/kickbox/default/UpRightFoot tap note (doubleres).png differ diff --git a/NoteSkins/kickbox/default/_AnyRightFist Hold Explosion.redir b/NoteSkins/kickbox/default/_AnyRightFist Hold Explosion.redir new file mode 100644 index 0000000000..da0637f259 --- /dev/null +++ b/NoteSkins/kickbox/default/_AnyRightFist Hold Explosion.redir @@ -0,0 +1 @@ +_AnyRightFist Tap explosion dim \ No newline at end of file diff --git a/NoteSkins/kickbox/default/_AnyRightFist Roll Explosion.redir b/NoteSkins/kickbox/default/_AnyRightFist Roll Explosion.redir new file mode 100644 index 0000000000..da0637f259 --- /dev/null +++ b/NoteSkins/kickbox/default/_AnyRightFist Roll Explosion.redir @@ -0,0 +1 @@ +_AnyRightFist Tap explosion dim \ No newline at end of file diff --git a/NoteSkins/kickbox/default/_AnyRightFist Tap Explosion Dim (doubleres).png b/NoteSkins/kickbox/default/_AnyRightFist Tap Explosion Dim (doubleres).png new file mode 100644 index 0000000000..7072601112 Binary files /dev/null and b/NoteSkins/kickbox/default/_AnyRightFist Tap Explosion Dim (doubleres).png differ diff --git a/NoteSkins/kickbox/default/_AnyRightFist Tap Lift (doubleres).png b/NoteSkins/kickbox/default/_AnyRightFist Tap Lift (doubleres).png new file mode 100644 index 0000000000..8bf71144a5 Binary files /dev/null and b/NoteSkins/kickbox/default/_AnyRightFist Tap Lift (doubleres).png differ diff --git a/NoteSkins/kickbox/default/_AnyRightFist receptor frame (doubleres).png b/NoteSkins/kickbox/default/_AnyRightFist receptor frame (doubleres).png new file mode 100644 index 0000000000..8e5c28506e Binary files /dev/null and b/NoteSkins/kickbox/default/_AnyRightFist receptor frame (doubleres).png differ diff --git a/NoteSkins/kickbox/default/_AnyRightFist receptor underlay (doubleres).png b/NoteSkins/kickbox/default/_AnyRightFist receptor underlay (doubleres).png new file mode 100644 index 0000000000..067dbeebff Binary files /dev/null and b/NoteSkins/kickbox/default/_AnyRightFist receptor underlay (doubleres).png differ diff --git a/NoteSkins/kickbox/default/_AnyRightFoot Hold Explosion.redir b/NoteSkins/kickbox/default/_AnyRightFoot Hold Explosion.redir new file mode 100644 index 0000000000..92395ce391 --- /dev/null +++ b/NoteSkins/kickbox/default/_AnyRightFoot Hold Explosion.redir @@ -0,0 +1 @@ +_AnyRightFoot Tap explosion dim \ No newline at end of file diff --git a/NoteSkins/kickbox/default/_AnyRightFoot Roll Explosion.redir b/NoteSkins/kickbox/default/_AnyRightFoot Roll Explosion.redir new file mode 100644 index 0000000000..92395ce391 --- /dev/null +++ b/NoteSkins/kickbox/default/_AnyRightFoot Roll Explosion.redir @@ -0,0 +1 @@ +_AnyRightFoot Tap explosion dim \ No newline at end of file diff --git a/NoteSkins/kickbox/default/_AnyRightFoot Tap Explosion Dim (doubleres).png b/NoteSkins/kickbox/default/_AnyRightFoot Tap Explosion Dim (doubleres).png new file mode 100644 index 0000000000..ac8b969e48 Binary files /dev/null and b/NoteSkins/kickbox/default/_AnyRightFoot Tap Explosion Dim (doubleres).png differ diff --git a/NoteSkins/kickbox/default/_AnyRightFoot Tap Lift (doubleres).png b/NoteSkins/kickbox/default/_AnyRightFoot Tap Lift (doubleres).png new file mode 100644 index 0000000000..25f1ef1f6b Binary files /dev/null and b/NoteSkins/kickbox/default/_AnyRightFoot Tap Lift (doubleres).png differ diff --git a/NoteSkins/kickbox/default/_AnyRightFoot receptor frame (doubleres).png b/NoteSkins/kickbox/default/_AnyRightFoot receptor frame (doubleres).png new file mode 100644 index 0000000000..8c930452e1 Binary files /dev/null and b/NoteSkins/kickbox/default/_AnyRightFoot receptor frame (doubleres).png differ diff --git a/NoteSkins/kickbox/default/_AnyRightFoot receptor underlay (doubleres).png b/NoteSkins/kickbox/default/_AnyRightFoot receptor underlay (doubleres).png new file mode 100644 index 0000000000..539556d338 Binary files /dev/null and b/NoteSkins/kickbox/default/_AnyRightFoot receptor underlay (doubleres).png differ diff --git a/NoteSkins/kickbox/default/metrics.ini b/NoteSkins/kickbox/default/metrics.ini new file mode 100644 index 0000000000..a9376cb03c --- /dev/null +++ b/NoteSkins/kickbox/default/metrics.ini @@ -0,0 +1,57 @@ +[Global] +FallbackNoteSkin=common + +[NoteDisplay] +StartDrawingHoldBodyOffsetFromHead=-12 +StopDrawingHoldBodyOffsetFromTail=-32 // top of tail + +FlipHeadAndTailWhenReverse=0 +FlipHoldBodyWhenReverse=0 + +[GhostArrowDim] +HitMineCommand=blend,"BlendMode_Add";diffuse,1,1,1,1;zoom,1;rotationz,0;linear,0.3;rotationz,90;linear,0.3;rotationz,180;diffusealpha,0 +W5Command=diffuse,0.8,0.0,0.6,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0 +W4Command=diffuse,0.3,0.8,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0 +W3Command=diffuse,0.0,1.0,0.4,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0 +W2Command=diffuse,1.0,1.0,0.3,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0 +W1Command=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0 +HeldCommand=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0 + +[GhostArrowBright] +NoneCommand= +HitMineCommand=blend,"BlendMode_Add";diffuse,1,1,1,1;zoom,1;rotationz,0;linear,0.3;rotationz,90;linear,0.3;rotationz,180;diffusealpha,0 +AvoidMineCommand= +MissCommand= +W5Command=diffuse,0.8,0.0,0.6,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0 +W4Command=diffuse,0.3,0.8,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0 +W3Command=diffuse,0.0,1.0,0.4,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0 +W2Command=diffuse,1.0,1.0,0.3,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0 +W1Command=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0 +HeldCommand=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0 + +[HoldGhostArrow] +HoldingOnCommand=visible,true;pulse;effectmagnitude,1,1.1,1;effectclock,'beat';effectperiod,0.125 +HoldingOffCommand=visible,false;stopeffect; +RollOnCommand=visible,true;pulse;effectmagnitude,1,1.1,1;effectclock,'beat';effectperiod,0.125 +RollOffCommand=visible,false;stopeffect; + +[ReceptorArrow] +InitCommand=effectclock,'beat';glowramp;effectcolor1,color("1,1,1,0");effectcolor2,color("1,1,1,0.5"); +# By default, always step. Individual game skins can override this. +NoneCommand= +HitMineCommand= +AvoidMineCommand= +MissCommand= +W5Command= +W4Command= +W3Command= +W2Command= +W1Command= +PressCommand=stoptweening;bounceend,0.05;zoom,0.75 +LiftCommand=stoptweening;decelerate,0.1;zoom,1 + +[ReceptorOverlay] +InitCommand= +PressCommand=stoptweening;bounceend,0.05;zoom,0.75 +LiftCommand=stoptweening;decelerate,0.1;zoom,1 +NoneCommand= \ No newline at end of file diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini index 6f8d088ddc..10505b2a40 100644 --- a/Themes/_fallback/Languages/en.ini +++ b/Themes/_fallback/Languages/en.ini @@ -174,6 +174,14 @@ Right Blue=Right Blue Right Green=Right Green Right Yellow=Right Yellow Right White=Right White +DownLeftFoot=Down Left Foot +UpLeftFoot=Up Left Foot +UpLeftFist=Up Left Fist +DownLeftFist=Down Left Fist +DownRightFoot=Down Right Foot +UpRightFoot=Up Right Foot +UpRightFist=Up Right Fist +DownRightFist=Down Right Fist [GameCommand] Could not launch web browser.=Could not launch web browser. @@ -2055,6 +2063,10 @@ Pnm_Nine=9 Button Guitar_Five=5 Frets Karaoke=Karaoke Lights_Cabinet=Lights +Kickbox_Human=Human +Kickbox_Quadarm=Quadarm +Kickbox_Insect=Insect +Kickbox_Arachnid=Arachnid [StyleType] StyleType_OnePlayerOneSide=1 Player @@ -2628,6 +2640,10 @@ Pump_Halfdouble=Half-Double Pump_Couple=Couple Pump_Routine=Routine Kb7_Single=KB7 +Kickbox_Human=Human +Kickbox_Quadarm=Quadarm +Kickbox_Insect=Insect +Kickbox_Arachnid=Arachnid Ez2_Single=Single Ez2_Double=Double Ez2_Real=Real @@ -2663,6 +2679,10 @@ Pump_Halfdouble=Half-Double Pump_Couple=Couple Pump_Routine=Routine Kb7_Single=KB7 +Kickbox_Human=Human +Kickbox_Quadarm=Quadarm +Kickbox_Insect=Insect +Kickbox_Arachnid=Arachnid Ez2_Single=Single Ez2_Double=Double Ez2_Real=Real diff --git a/Themes/_fallback/Other/ScreenGameplaySyncMachine music.ssc b/Themes/_fallback/Other/ScreenGameplaySyncMachine music.ssc index 0a5b0994d9..ac2e351e4a 100644 --- a/Themes/_fallback/Other/ScreenGameplaySyncMachine music.ssc +++ b/Themes/_fallback/Other/ScreenGameplaySyncMachine music.ssc @@ -1305,4 +1305,85 @@ 000000001 100000000 000000001 -; \ No newline at end of file +; + +//---------------kickbox-quadarm - blank---------------- +#NOTEDATA:; +#CHARTNAME:Syncer; +#STEPSTYPE:kickbox-quadarm; +#DESCRIPTION:Sync the Game; +#CHARTSTYLE:; +#DIFFICULTY:Beginner; +#METER:1; +#RADARVALUES:0.414,0.379,0.000,0.000,0.000,49.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.414,0.379,0.000,0.000,0.000,49.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000; +#CREDIT:blank; +#NOTES: +0000 +0000 +0000 +0000 +, +0000 +0000 +0000 +0000 +, +1000 +0001 +1000 +0001 +1000 +0001 +1000 +0001 +, +1000 +0001 +1000 +0001 +1000 +0001 +1000 +0001 +, +1000 +0001 +1000 +0001 +1000 +0001 +1000 +0001 +, +1000 +0001 +1000 +0001 +1000 +0001 +1000 +0001 +, +1000 +0001 +1000 +0001 +1000 +0001 +1000 +0001 +, +1000 +0001 +1000 +0001 +1000 +0001 +1000 +0001 +, +1000 +0000 +0000 +0000 +; diff --git a/Themes/_fallback/Scripts/03 Gameplay.lua b/Themes/_fallback/Scripts/03 Gameplay.lua index 4d893f91c4..4c5fcaacb1 100644 --- a/Themes/_fallback/Scripts/03 Gameplay.lua +++ b/Themes/_fallback/Scripts/03 Gameplay.lua @@ -22,10 +22,60 @@ function GetExtraColorThreshold() para = 10, techno = 10, lights = 10, -- lights shouldn't be playable + kickbox= 100, -- extra color is lame } return Modes[CurGameName()] or 10 end +-- GameplayMargins exists to provide a layer of backwards compatibility for +-- people using the X position metrics to set where the notefields are. +-- This makes it somewhat complex. +-- Rather than trying to understand how it works, you can simply do this: +-- (example values in parentheses) +-- 1. Decide how much space you want in the center between notefields. (80) +-- 2. Decide how much space you want on each side. (40) +-- 3. Write a simple function that just returns those numbers: +-- function GameplayMargins() return 40, 80, 40 end +-- Then the engine does the work of figuring out where each notefield should +-- be centered. +function GameplayMargins(enabled_players, styletype) + local other= {[PLAYER_1]= PLAYER_2, [PLAYER_2]= PLAYER_1} + local margins= {[PLAYER_1]= {40, 40}, [PLAYER_2]= {40, 40}} + -- Use a fake style width because calculating the real style width throws off + -- the code in the engine. + local fake_style_width= 272 + -- Handle the case of a single player that is centered first because it's + -- simpler. + if Center1Player() then + local pn= enabled_players[1] + fake_style_width= 544 + local center= _screen.cx + local left= center - (fake_style_width / 2) + local right= _screen.w - center - (fake_style_width / 2) + -- center margin width will be ignored. + return left, 80, right + end + local half_screen= _screen.w / 2 + local left= {[PLAYER_1]= 0, [PLAYER_2]= half_screen} + for i, pn in ipairs(enabled_players) do + local edge= left[pn] + local center= THEME:GetMetric("ScreenGameplay", + "Player"..ToEnumShortString(pn)..ToEnumShortString(styletype).."X") + -- Adjust for the p2 center being on the right side. + center= center - edge + margins[pn][1]= center - (fake_style_width / 2) + margins[pn][2]= half_screen - center - (fake_style_width / 2) + if #enabled_players == 1 then + margins[other[pn]][1]= margins[pn][2] + margins[other[pn]][2]= margins[pn][1] + end + end + local left= margins[PLAYER_1][1] + local center= margins[PLAYER_1][2] + margins[PLAYER_2][1] + local right= margins[PLAYER_2][2] + return left, center, right +end + -- AllowOptionsMenu() -- [en] returns if you are able to select options -- on ScreenSelectMusic. @@ -51,11 +101,68 @@ function GameCompatibleModes() maniax = "Single,Double,Versus", -- todo: add versus modes for technomotion techno = "Single4,Single5,Single8,Double4,Double5,Double8", - lights = "Single" -- lights shouldn't be playable + lights = "Single", -- lights shouldn't be playable } return Modes[CurGameName()] end +local function upper_first_letter(s) + local first_letter= s:match("([a-zA-Z])") + return s:gsub(first_letter, first_letter:upper(), 1) +end + +-- No more having a metric for every style for every game mode. -Kyz +function ScreenSelectStyleChoices() + local styles= GAMEMAN:GetStylesForGame(GAMESTATE:GetCurrentGame():GetName()) + local choices= {} + for i, style in ipairs(styles) do + local name= style:GetName() + local cap_name= upper_first_letter(name) + -- couple-edit and threepanel don't seem like they should actually be + -- selectable. -Kyz + if name ~= "couple-edit" and name ~= "threepanel" then + choices[#choices+1]= "name," .. cap_name .. ";style," .. name .. + ";text," .. cap_name .. ";screen," .. Branch.AfterSelectStyle() + end + end + return choices +end + +-- No more having an xy for every style for every game mode. -Kyz +function ScreenSelectStylePositions(count) + local poses= {} + local columns= 1 + local choice_height= 96 + local column_x= {_screen.cx, _screen.cx + 160} + if count > 4 then + column_x[1]= _screen.cx - 160 + columns= 2 + end + if count > 8 then + column_x[1]= _screen.cx - 240 + column_x[2]= _screen.cx + column_x[3]= _screen.cx + 240 + columns= 3 + end + local num_per_column= {math.ceil(count/columns), math.floor(count/columns)} + if count > 8 then + if count % 3 == 0 then + num_per_column[3]= count/columns + elseif count % 3 == 1 then + num_per_column[3]= num_per_column[2] + else + num_per_column[3]= num_per_column[1] + end + end + for c= 1, columns do + local start_y= _screen.cy - (choice_height * ((num_per_column[c] / 2)+.5)) + for i= 1, num_per_column[c] do + poses[#poses+1]= {column_x[c], start_y + (choice_height * i)} + end + end + return poses +end + function SelectProfileKeys() local sGame = CurGameName() if sGame == "pump" then diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index 907d6687c3..a5686ff6c9 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -1130,7 +1130,7 @@ AttackDisplayXOffsetOneSideP2=0 AttackDisplayXOffsetBothSides=0 AttackDisplayY=-70 AttackDisplayYReverse=70 -; HACK: These shouldn't go to the render pipe at all if IsGame("pump") +# HACK: These shouldn't go to the render pipe at all if IsGame("pump") HoldJudgmentYStandard=IsGame("pump") and -99999 or -90 HoldJudgmentYReverse=IsGame("pump") and -99999 or 90 BrightGhostComboThreshold=100 @@ -1944,6 +1944,12 @@ PrevScreen=Branch.TitleMenu() TimerSeconds=30 # DefaultChoice="Single" +# Giant metric list left in for backwards compatibility. +# A much better way to handle this is: +# ChoiceNames="lua,ScreenSelectStyleChoices()" +# That will list all the styles for the current game without needing a huge +# list of metrics. _fallback still uses the old method to avoid the +# possibility of breaking themes. -Kyz ChoiceNames=GameCompatibleModes() # OptionOrderAuto="1:2,2:1" @@ -3418,7 +3424,25 @@ MusicFadeOutSeconds=0.5 OutTransitionLength=5 CourseTransitionLength=0.5 BeginFailedDelay=1.0 -# +# New way to control where the notefields are on gameplay. +# The MarginFunction will be passed GAMESTATE:EnabledPlayers() and the +# current styletype. The function must return three values: +# Left margin width, center margin width, right margin width. +# The engine will then position the notefields and adjust their size to fit +# in the space not occupied by the margins. If there is only one player and +# that player would normally be centered (OnePlayerTwoSides or +# TwoPlayersSharedSides, or the Center1Player preference), then the center +# margin value will be ignored. +# Mods applied to the player may still move the notefield into the margin, +# this is just for controlling its initial position and size. +# The purpose of this is to allow the engine more flexibility in styles, +# for example, one player playing dance-solo while the other plays +# dance-single. +MarginFunction=GameplayMargins +# These X values for each player and styletype are deprecated in favor of +# writing a MarginFunction that returns the margin sizes you prefer. +# The MarginFunction supplied by _fallback will use these metrics for +# backwards compatibility. PlayerP1OnePlayerOneSideX=math.floor(scale((0.85/3),0,1,SCREEN_LEFT,SCREEN_RIGHT)) PlayerP2OnePlayerOneSideX=math.floor(scale((2.15/3),0,1,SCREEN_LEFT,SCREEN_RIGHT)) PlayerP1TwoPlayersTwoSidesX=math.floor(scale((0.85/3),0,1,SCREEN_LEFT,SCREEN_RIGHT)) diff --git a/Themes/default/metrics.ini b/Themes/default/metrics.ini index ce5e22ca04..f1a18125ff 100644 --- a/Themes/default/metrics.ini +++ b/Themes/default/metrics.ini @@ -771,10 +771,8 @@ FOV=90 PerChoiceScrollElement=false PerChoiceIconElement=false # -Choice7Keys="name,7Keys;style,single7;screen,"..Branch.AfterSelectStyle() -Choice10Keys="name,10Keys;style,double5;screen,"..Branch.AfterSelectStyle() -Choice14Keys="name,14Keys;style,double7;screen,"..Branch.AfterSelectStyle() -ChoiceKB7="name,kb7;style,single;screen,"..Branch.AfterSelectStyle() +# Having one lua function is so much better than dozens of metrics. -Kyz +ChoiceNames="lua,ScreenSelectStyleChoices()" # ShowScroller=false ShowIcon=true @@ -784,65 +782,10 @@ UseIconMetrics=true IconGainFocusCommand=stoptweening;bounceend,0.05;zoom,1; IconLoseFocusCommand=stoptweening;decelerate,0.1;zoom,0.8; # -IconChoiceSingleX=SCREEN_CENTER_X-160 -IconChoiceSingleY=SCREEN_CENTER_Y-96 -IconChoiceSingleOnCommand=zoom,0;bounceend,0.35;zoom,1 -IconChoiceSingleOffCommand=linear,0.05;zoomx,0 +IconChoicePosFunction=ScreenSelectStylePositions +IconChoiceOnCommand=zoom,0;bounceend,0.35;zoom,1 +IconChoiceOffCommand=linear,0.05;zoomx,0 # -IconChoiceDoubleX=SCREEN_CENTER_X-160 -IconChoiceDoubleY=SCREEN_CENTER_Y -IconChoiceDoubleOnCommand=zoom,0;bounceend,0.35;zoom,1 -IconChoiceDoubleOffCommand=linear,0.05;zoomx,0 -#### -IconChoiceSoloX=SCREEN_CENTER_X-160 -IconChoiceSoloY=SCREEN_CENTER_Y+96 -IconChoiceSoloOnCommand=zoom,0;bounceend,0.35;zoom,1 -IconChoiceSoloOffCommand=linear,0.05;zoomx,0 -# -IconChoiceHalfDoubleX=SCREEN_CENTER_X-160 -IconChoiceHalfDoubleY=SCREEN_CENTER_Y+96 -IconChoiceHalfDoubleOnCommand=zoom,0;bounceend,0.35;zoom,1 -IconChoiceHalfDoubleOffCommand=linear,0.05;zoomx,0 -#### -IconChoiceVersusX=SCREEN_CENTER_X+160 -IconChoiceVersusY=string.find(THEME:GetMetric("ScreenSelectStyle","ChoiceNames"),"Routine") and SCREEN_CENTER_Y-96 or SCREEN_CENTER_Y-48 -IconChoiceVersusOnCommand=zoom,0;bounceend,0.35;zoom,1 -IconChoiceVersusOffCommand=linear,0.05;zoomx,0 -# -IconChoiceCoupleX=SCREEN_CENTER_X+160 -IconChoiceCoupleY=string.find(THEME:GetMetric("ScreenSelectStyle","ChoiceNames"),"Routine") and SCREEN_CENTER_Y or SCREEN_CENTER_Y+48 -IconChoiceCoupleOnCommand=zoom,0;bounceend,0.35;zoom,1 -IconChoiceCoupleOffCommand=linear,0.05;zoomx,0 -# -IconChoiceRoutineX=SCREEN_CENTER_X+160 -IconChoiceRoutineY=SCREEN_CENTER_Y+96 -IconChoiceRoutineOnCommand=zoom,0;bounceend,0.35;zoom,1 -IconChoiceRoutineOffCommand=linear,0.05;zoomx,0 -# -IconChoicekb7X=SCREEN_CENTER_X -IconChoicekb7Y=SCREEN_CENTER_Y -IconChoicekb7OnCommand=zoom,0;bounceend,0.35;zoom,1 -IconChoicekb7OffCommand=linear,0.05;zoomx,0 -# -IconChoice5KeysX=SCREEN_CENTER_X-160 -IconChoice5KeysY=SCREEN_CENTER_Y-48 -IconChoice5KeysOnCommand=zoom,0;bounceend,0.35;zoom,1 -IconChoice5KeysOffCommand=linear,0.05;zoomx,0 -# -IconChoice7KeysX=SCREEN_CENTER_X-160 -IconChoice7KeysY=SCREEN_CENTER_Y+48 -IconChoice7KeysOnCommand=zoom,0;bounceend,0.35;zoom,1 -IconChoice7KeysOffCommand=linear,0.05;zoomx,0 -# -IconChoice10KeysX=SCREEN_CENTER_X+160 -IconChoice10KeysY=SCREEN_CENTER_Y-48 -IconChoice10KeysOnCommand=zoom,0;bounceend,0.35;zoom,1 -IconChoice10KeysOffCommand=linear,0.05;zoomx,0 -# -IconChoice14KeysX=SCREEN_CENTER_X+160 -IconChoice14KeysY=SCREEN_CENTER_Y+48 -IconChoice14KeysOnCommand=zoom,0;bounceend,0.35;zoom,1 -IconChoice14KeysOffCommand=linear,0.05;zoomx,0 [ScreenSelectPlayMode] PersistScreens="ScreenSelectPlayMode,ScreenSelectMusic" diff --git a/src/Actor.cpp b/src/Actor.cpp index d2ab5487a9..9dac9f0454 100644 --- a/src/Actor.cpp +++ b/src/Actor.cpp @@ -1334,9 +1334,9 @@ void Actor::QueueMessage( const RString& sMessageName ) TI.m_sCommandName = "!" + sMessageName; } -void Actor::AddCommand( const RString &sCmdName, apActorCommands apac ) +void Actor::AddCommand( const RString &sCmdName, apActorCommands apac, bool warn ) { - if( HasCommand(sCmdName) ) + if( HasCommand(sCmdName) && warn) { RString sWarning = GetLineage()+"'s command '"+sCmdName+"' defined twice"; LuaHelpers::ReportScriptError(sWarning, "COMMAND_DEFINED_TWICE"); diff --git a/src/Actor.h b/src/Actor.h index 781533987d..7957306409 100644 --- a/src/Actor.h +++ b/src/Actor.h @@ -582,7 +582,7 @@ public: virtual void PushContext( lua_State *L ); // Named commands - void AddCommand( const RString &sCmdName, apActorCommands apac ); + void AddCommand( const RString &sCmdName, apActorCommands apac, bool warn= true ); bool HasCommand( const RString &sCmdName ) const; const apActorCommands *GetCommand( const RString &sCommandName ) const; void PlayCommand( const RString &sCommandName ) { HandleMessage( Message(sCommandName) ); } // convenience diff --git a/src/ArrowEffects.cpp b/src/ArrowEffects.cpp index 76f2a17d94..ae0ee06754 100644 --- a/src/ArrowEffects.cpp +++ b/src/ArrowEffects.cpp @@ -82,16 +82,16 @@ namespace void ArrowEffects::Update() { - const Style* pStyle = GAMESTATE->GetCurrentStyle(); - static float fLastTime = 0; float fTime = RageTimer::GetTimeSinceStartFast(); FOREACH_EnabledPlayer( pn ) { + const Style* pStyle = GAMESTATE->GetCurrentStyle(pn); const Style::ColumnInfo* pCols = pStyle->m_ColumnInfo[pn]; const SongPosition &position = GAMESTATE->m_bIsUsingStepTiming ? GAMESTATE->m_pPlayerState[pn]->m_Position : GAMESTATE->m_Position; + const float field_zoom= GAMESTATE->m_pPlayerState[pn]->m_NotefieldZoom; PerPlayerData &data = g_EffectData[pn]; @@ -127,8 +127,8 @@ void ArrowEffects::Update() for( int i=iStartCol; i<=iEndCol; i++ ) { - data.m_fMinTornadoX[iColNum] = min( data.m_fMinTornadoX[iColNum], pCols[i].fXOffset ); - data.m_fMaxTornadoX[iColNum] = max( data.m_fMaxTornadoX[iColNum], pCols[i].fXOffset ); + data.m_fMinTornadoX[iColNum] = min( data.m_fMinTornadoX[iColNum], pCols[i].fXOffset * field_zoom ); + data.m_fMaxTornadoX[iColNum] = max( data.m_fMaxTornadoX[iColNum], pCols[i].fXOffset * field_zoom); } } @@ -439,7 +439,7 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float { float fPixelOffsetFromCenter = 0; // fill this in below - const Style* pStyle = GAMESTATE->GetCurrentStyle(); + const Style* pStyle = GAMESTATE->GetCurrentStyle(pPlayerState->m_PlayerNumber); const float* fEffects = pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects; // TODO: Don't index by PlayerNumber. @@ -448,7 +448,7 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float if( fEffects[PlayerOptions::EFFECT_TORNADO] != 0 ) { - const float fRealPixelOffset = pCols[iColNum].fXOffset; + const float fRealPixelOffset = pCols[iColNum].fXOffset * pPlayerState->m_NotefieldZoom; const float fPositionBetween = SCALE( fRealPixelOffset, data.m_fMinTornadoX[iColNum], data.m_fMaxTornadoX[iColNum], TORNADO_POSITION_SCALE_TO_LOW, TORNADO_POSITION_SCALE_TO_HIGH ); float fRads = acosf( fPositionBetween ); @@ -469,8 +469,8 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float const int iFirstCol = 0; const int iLastCol = pStyle->m_iColsPerPlayer-1; const int iNewCol = SCALE( iColNum, iFirstCol, iLastCol, iLastCol, iFirstCol ); - const float fOldPixelOffset = pCols[iColNum].fXOffset; - const float fNewPixelOffset = pCols[iNewCol].fXOffset; + const float fOldPixelOffset = pCols[iColNum].fXOffset * pPlayerState->m_NotefieldZoom; + const float fNewPixelOffset = pCols[iNewCol].fXOffset * pPlayerState->m_NotefieldZoom; const float fDistance = fNewPixelOffset - fOldPixelOffset; fPixelOffsetFromCenter += fDistance * fEffects[PlayerOptions::EFFECT_FLIP]; } @@ -515,7 +515,7 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float } } - fPixelOffsetFromCenter += pCols[iColNum].fXOffset; + fPixelOffsetFromCenter += pCols[iColNum].fXOffset * pPlayerState->m_NotefieldZoom; if( fEffects[PlayerOptions::EFFECT_TINY] != 0 ) { @@ -764,10 +764,11 @@ bool ArrowEffects::NeedZBuffer( const PlayerState* pPlayerState ) float ArrowEffects::GetZoom( const PlayerState* pPlayerState ) { float fZoom = 1.0f; - // FIXME: Move the zoom values into Style - if( GAMESTATE->GetCurrentStyle()->m_bNeedsZoomOutWith2Players && - (GAMESTATE->GetNumSidesJoined()==2 || GAMESTATE->AnyPlayersAreCpu()) ) - fZoom *= 0.6f; + // Design change: Instead of having a flag in the style that toggles a + // fixed zoom (0.6) that is only applied to the columns, ScreenGameplay now + // calculates a zoom factor to apply to the notefield and puts it in the + // PlayerState. -Kyz + fZoom*= pPlayerState->m_NotefieldZoom; float fTinyPercent = pPlayerState->m_PlayerOptions.GetCurrent().m_fEffects[PlayerOptions::EFFECT_TINY]; if( fTinyPercent != 0 ) diff --git a/src/BPMDisplay.cpp b/src/BPMDisplay.cpp index 3e138d9155..1f10ccbadc 100644 --- a/src/BPMDisplay.cpp +++ b/src/BPMDisplay.cpp @@ -213,9 +213,9 @@ void BPMDisplay::SetBpmFromSteps( const Steps* pSteps ) void BPMDisplay::SetBpmFromCourse( const Course* pCourse ) { ASSERT( pCourse != NULL ); - ASSERT( GAMESTATE->GetCurrentStyle() != NULL ); + ASSERT( GAMESTATE->GetCurrentStyle(PLAYER_INVALID) != NULL ); - StepsType st = GAMESTATE->GetCurrentStyle()->m_StepsType; + StepsType st = GAMESTATE->GetCurrentStyle(PLAYER_INVALID)->m_StepsType; Trail *pTrail = pCourse->GetTrail( st ); // GetTranslitFullTitle because "Crashinfo.txt is garbled because of the ANSI output as usual." -f ASSERT_M( pTrail != NULL, ssprintf("Course '%s' has no trail for StepsType '%s'", pCourse->GetTranslitFullTitle().c_str(), StringConversion::ToString(st).c_str() ) ); @@ -259,7 +259,7 @@ void BPMDisplay::SetFromGameState() } if( GAMESTATE->m_pCurCourse.Get() ) { - if( GAMESTATE->GetCurrentStyle() == NULL ) + if( GAMESTATE->GetCurrentStyle(PLAYER_INVALID) == NULL ) ; // This is true when backing out from ScreenSelectCourse to ScreenTitleMenu. So, don't call SetBpmFromCourse where an assert will fire. else SetBpmFromCourse( GAMESTATE->m_pCurCourse ); diff --git a/src/Background.cpp b/src/Background.cpp index d607a20122..e70e86e6e9 100644 --- a/src/Background.cpp +++ b/src/Background.cpp @@ -205,7 +205,7 @@ void BackgroundImpl::Init() { bOneOrMoreChars = true; // Disable dancing characters if Beginner Helper will be showing. - if( PREFSMAN->m_bShowBeginnerHelper && BeginnerHelper::CanUse() && + if( PREFSMAN->m_bShowBeginnerHelper && BeginnerHelper::CanUse(p) && GAMESTATE->m_pCurSteps[p] && GAMESTATE->m_pCurSteps[p]->GetDifficulty() == Difficulty_Beginner ) bShowingBeginnerHelper = true; } diff --git a/src/BeginnerHelper.cpp b/src/BeginnerHelper.cpp index 5c6f2968ee..f43bf118c1 100644 --- a/src/BeginnerHelper.cpp +++ b/src/BeginnerHelper.cpp @@ -78,7 +78,7 @@ BeginnerHelper::~BeginnerHelper() bool BeginnerHelper::Init( int iDancePadType ) { ASSERT( !m_bInitialized ); - if( !CanUse() ) + if( !CanUse(PLAYER_INVALID) ) return false; // If no players were successfully added, bail. @@ -200,7 +200,7 @@ void BeginnerHelper::AddPlayer( PlayerNumber pn, const NoteData &ns ) ASSERT( pn >= 0 && pn < NUM_PLAYERS ); ASSERT( GAMESTATE->IsHumanPlayer(pn) ); - if( !CanUse() ) + if( !CanUse(pn) ) return; const Character *Character = GAMESTATE->m_pCurCharacters[pn]; @@ -212,13 +212,20 @@ void BeginnerHelper::AddPlayer( PlayerNumber pn, const NoteData &ns ) m_bPlayerEnabled[pn] = true; } -bool BeginnerHelper::CanUse() +bool BeginnerHelper::CanUse(PlayerNumber pn) { for (int i=0; iGetCurrentStyle()->m_bCanUseBeginnerHelper; + // This does not pass PLAYER_INVALID to GetCurrentStyle because that would + // only check the first non-NULL style. Both styles need to be checked. -Kyz + if(pn == PLAYER_INVALID) + { + return GAMESTATE->GetCurrentStyle(PLAYER_1)->m_bCanUseBeginnerHelper || + GAMESTATE->GetCurrentStyle(PLAYER_2)->m_bCanUseBeginnerHelper; + } + return GAMESTATE->GetCurrentStyle(pn)->m_bCanUseBeginnerHelper; } void BeginnerHelper::DrawPrimitives() diff --git a/src/BeginnerHelper.h b/src/BeginnerHelper.h index a5941e7e85..38bb8b144a 100644 --- a/src/BeginnerHelper.h +++ b/src/BeginnerHelper.h @@ -18,7 +18,7 @@ public: bool Init( int iDancePadType ); bool IsInitialized() { return m_bInitialized; } - static bool CanUse(); + static bool CanUse(PlayerNumber pn); void AddPlayer( PlayerNumber pn, const NoteData &nd ); void ShowStepCircle( PlayerNumber pn, int CSTEP ); bool m_bShowBackground; diff --git a/src/CourseUtil.cpp b/src/CourseUtil.cpp index 44ed9212c4..5c67882ed6 100644 --- a/src/CourseUtil.cpp +++ b/src/CourseUtil.cpp @@ -95,14 +95,14 @@ void CourseUtil::SortCoursePointerArrayByDifficulty( vector &vpCoursesI void CourseUtil::SortCoursePointerArrayByRanking( vector &vpCoursesInOut ) { for( unsigned i=0; iUpdateCourseStats( GAMESTATE->GetCurrentStyle()->m_StepsType ); + vpCoursesInOut[i]->UpdateCourseStats( GAMESTATE->GetCurrentStyle(PLAYER_INVALID)->m_StepsType ); sort( vpCoursesInOut.begin(), vpCoursesInOut.end(), CompareCoursePointersByRanking ); } void CourseUtil::SortCoursePointerArrayByTotalDifficulty( vector &vpCoursesInOut ) { for( unsigned i=0; iUpdateCourseStats( GAMESTATE->GetCurrentStyle()->m_StepsType ); + vpCoursesInOut[i]->UpdateCourseStats( GAMESTATE->GetCurrentStyle(PLAYER_INVALID)->m_StepsType ); sort( vpCoursesInOut.begin(), vpCoursesInOut.end(), CompareCoursePointersByTotalDifficulty ); } @@ -176,7 +176,7 @@ void CourseUtil::SortCoursePointerArrayByAvgDifficulty( vector &vpCours course_sort_val.clear(); for( unsigned i = 0; i < vpCoursesInOut.size(); ++i ) { - int iMeter = vpCoursesInOut[i]->GetMeter( GAMESTATE->GetCurrentStyle()->m_StepsType, Difficulty_Medium ); + int iMeter = vpCoursesInOut[i]->GetMeter( GAMESTATE->GetCurrentStyle(PLAYER_INVALID)->m_StepsType, Difficulty_Medium ); course_sort_val[vpCoursesInOut[i]] = ssprintf( "%06i", iMeter ); } sort( vpCoursesInOut.begin(), vpCoursesInOut.end(), CompareCoursePointersByTitle ); @@ -448,8 +448,8 @@ bool EditCourseUtil::ValidateEditCourseName( const RString &sAnswer, RString &sE void EditCourseUtil::UpdateAndSetTrail() { - ASSERT( GAMESTATE->m_pCurStyle != NULL ); - StepsType st = GAMESTATE->m_pCurStyle->m_StepsType; + ASSERT( GAMESTATE->GetCurrentStyle(PLAYER_INVALID) != NULL ); + StepsType st = GAMESTATE->GetCurrentStyle(PLAYER_INVALID)->m_StepsType; Trail *pTrail = NULL; if( GAMESTATE->m_pCurCourse ) pTrail = GAMESTATE->m_pCurCourse->GetTrailForceRegenCache( st ); diff --git a/src/DifficultyList.cpp b/src/DifficultyList.cpp index a3ce25a8a9..192931c37e 100644 --- a/src/DifficultyList.cpp +++ b/src/DifficultyList.cpp @@ -277,7 +277,7 @@ void StepsDisplayList::SetFromGameState() FOREACH_CONST( Difficulty, difficulties, d ) { m_Rows[i].m_dc = *d; - m_Lines[i].m_Meter.SetFromStepsTypeAndMeterAndDifficultyAndCourseType( GAMESTATE->m_pCurStyle->m_StepsType, 0, *d, CourseType_Invalid ); + m_Lines[i].m_Meter.SetFromStepsTypeAndMeterAndDifficultyAndCourseType( GAMESTATE->GetCurrentStyle(PLAYER_INVALID)->m_StepsType, 0, *d, CourseType_Invalid ); ++i; } } diff --git a/src/Game.cpp b/src/Game.cpp index 07aac354c4..12763ed4ff 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -62,12 +62,14 @@ public: static int GetName( T* p, lua_State *L ) { lua_pushstring( L, p->m_szName ); return 1; } static int CountNotesSeparately( T* p, lua_State *L ) { lua_pushboolean( L, p->m_bCountNotesSeparately ); return 1; } DEFINE_METHOD( GetMapJudgmentTo, GetMapJudgmentTo(Enum::Check(L, 1)) ) + DEFINE_METHOD(GetSeparateStyles, m_PlayersHaveSeparateStyles); LunaGame() { ADD_METHOD( GetName ); ADD_METHOD( CountNotesSeparately ); ADD_METHOD( GetMapJudgmentTo ); + ADD_METHOD( GetSeparateStyles ); } }; diff --git a/src/Game.h b/src/Game.h index e3d1eb3e39..2f06b933a7 100644 --- a/src/Game.h +++ b/src/Game.h @@ -34,6 +34,7 @@ struct Game /** @brief Do we count multiple notes in a row as separate notes, or as one note? */ bool m_bCountNotesSeparately; bool m_bTickHolds; + bool m_PlayersHaveSeparateStyles; InputScheme m_InputScheme; diff --git a/src/GameCommand.cpp b/src/GameCommand.cpp index 60d788df96..83da0bb0a5 100644 --- a/src/GameCommand.cpp +++ b/src/GameCommand.cpp @@ -84,7 +84,7 @@ bool GameCommand::DescribesCurrentMode( PlayerNumber pn ) const { if( m_pm != PlayMode_Invalid && GAMESTATE->m_PlayMode != m_pm ) return false; - if( m_pStyle && GAMESTATE->GetCurrentStyle() != m_pStyle ) + if( m_pStyle && GAMESTATE->GetCurrentStyle(pn) != m_pStyle ) return false; // HACK: don't compare m_dc if m_pSteps is set. This causes problems // in ScreenSelectOptionsMaster::ImportOptions if m_PreferredDifficulty @@ -289,7 +289,7 @@ void GameCommand::LoadOne( const Command& cmd ) if( !m_bInvalid ) { Song *pSong = (m_pSong != NULL)? m_pSong:GAMESTATE->m_pCurSong; - const Style *pStyle = m_pStyle ? m_pStyle : GAMESTATE->GetCurrentStyle(); + const Style *pStyle = m_pStyle ? m_pStyle : GAMESTATE->GetCurrentStyle(GAMESTATE->GetMasterPlayerNumber()); if( pSong == NULL || pStyle == NULL ) { MAKE_INVALID("Must set Song and Style to set Steps."); @@ -327,7 +327,7 @@ void GameCommand::LoadOne( const Command& cmd ) if( !m_bInvalid ) { Course *pCourse = (m_pCourse != NULL)? m_pCourse:GAMESTATE->m_pCurCourse; - const Style *pStyle = m_pStyle ? m_pStyle : GAMESTATE->GetCurrentStyle(); + const Style *pStyle = m_pStyle ? m_pStyle : GAMESTATE->GetCurrentStyle(GAMESTATE->GetMasterPlayerNumber()); if( pCourse == NULL || pStyle == NULL ) { MAKE_INVALID("Must set Course and Style to set Trail."); @@ -598,7 +598,7 @@ bool GameCommand::IsPlayable( RString *why ) const if( m_pm != PlayMode_Invalid || m_pStyle != NULL ) { const PlayMode pm = (m_pm != PlayMode_Invalid) ? m_pm : GAMESTATE->m_PlayMode; - const Style *style = (m_pStyle != NULL)? m_pStyle: GAMESTATE->GetCurrentStyle(); + const Style *style = (m_pStyle != NULL)? m_pStyle: GAMESTATE->GetCurrentStyle(GAMESTATE->GetMasterPlayerNumber()); if( !AreStyleAndPlayModeCompatible( style, pm ) ) { if( why ) @@ -705,7 +705,7 @@ void GameCommand::ApplySelf( const vector &vpns ) const if( m_pStyle != NULL ) { - GAMESTATE->SetCurrentStyle( m_pStyle ); + GAMESTATE->SetCurrentStyle( m_pStyle, GAMESTATE->GetMasterPlayerNumber() ); // It's possible to choose a style that didn't have enough players joined. // If enough players aren't joined, then we need to subtract credits diff --git a/src/GameConstantsAndTypes.h b/src/GameConstantsAndTypes.h index 6180b547cd..900359148a 100644 --- a/src/GameConstantsAndTypes.h +++ b/src/GameConstantsAndTypes.h @@ -104,6 +104,10 @@ enum StepsType StepsType_popn_five, StepsType_popn_nine, StepsType_lights_cabinet, + StepsType_kickbox_human, + StepsType_kickbox_quadarm, + StepsType_kickbox_insect, + StepsType_kickbox_arachnid, NUM_StepsType, // leave this at the end StepsType_Invalid, }; diff --git a/src/GameInput.h b/src/GameInput.h index 5a474f0e71..c3ed05ea06 100644 --- a/src/GameInput.h +++ b/src/GameInput.h @@ -174,6 +174,16 @@ GameButton StringToGameButton( const InputScheme* pInputs, const RString& s ); #define LIGHTS_BUTTON_BASS_RIGHT GAME_BUTTON_CUSTOM_08 #define NUM_LIGHTS_BUTTONS GAME_BUTTON_CUSTOM_09 +#define KICKBOX_BUTTON_DOWN_LEFT_FOOT GAME_BUTTON_CUSTOM_01 +#define KICKBOX_BUTTON_UP_LEFT_FOOT GAME_BUTTON_CUSTOM_02 +#define KICKBOX_BUTTON_UP_LEFT_FIST GAME_BUTTON_CUSTOM_03 +#define KICKBOX_BUTTON_DOWN_LEFT_FIST GAME_BUTTON_CUSTOM_04 +#define KICKBOX_BUTTON_DOWN_RIGHT_FIST GAME_BUTTON_CUSTOM_05 +#define KICKBOX_BUTTON_UP_RIGHT_FIST GAME_BUTTON_CUSTOM_06 +#define KICKBOX_BUTTON_UP_RIGHT_FOOT GAME_BUTTON_CUSTOM_07 +#define KICKBOX_BUTTON_DOWN_RIGHT_FOOT GAME_BUTTON_CUSTOM_08 +#define NUM_KICKBOX_BUTTONS GAME_BUTTON_CUSTOM_09 + #define GAME_BUTTON_LEFT GAME_BUTTON_MENULEFT #define GAME_BUTTON_RIGHT GAME_BUTTON_MENURIGHT #define GAME_BUTTON_UP GAME_BUTTON_MENUUP diff --git a/src/GameManager.cpp b/src/GameManager.cpp index 7d7a77f12a..95692c90e4 100644 --- a/src/GameManager.cpp +++ b/src/GameManager.cpp @@ -93,6 +93,11 @@ static const StepsTypeInfo g_StepsTypeInfos[] = { { "pnm-nine", 9, true, StepsTypeCategory_Single }, // called "pnm" for backward compat // cabinet lights and other fine StepsTypes that don't exist lol { "lights-cabinet", NUM_CabinetLight, false, StepsTypeCategory_Single }, // XXX disable lights autogen for now + // kickbox mania + { "kickbox-human", 4, true, StepsTypeCategory_Single }, + { "kickbox-quadarm", 4, true, StepsTypeCategory_Single }, + { "kickbox-insect", 6, true, StepsTypeCategory_Single }, + { "kickbox-arachnid", 8, true, StepsTypeCategory_Single }, }; @@ -165,7 +170,6 @@ static const Style g_Style_Dance_Single = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0, 1, 2, 3 }, - false, // m_bNeedsZoomOutWith2Players true, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -201,7 +205,6 @@ static const Style g_Style_Dance_Versus = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0, 1, 2, 3 }, - false, // m_bNeedsZoomOutWith2Players true, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -245,7 +248,6 @@ static const Style g_Style_Dance_Double = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -281,7 +283,6 @@ static const Style g_Style_Dance_Couple = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3 }, - false, // m_bNeedsZoomOutWith2Players true, // m_bCanUseBeginnerHelper true, // m_bLockDifficulties }; @@ -321,7 +322,6 @@ static const Style g_Style_Dance_Solo = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -365,7 +365,6 @@ static const Style g_Style_Dance_Couple_Edit = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -400,7 +399,6 @@ static const Style g_Style_Dance_ThreePanel = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -438,7 +436,6 @@ static const Style g_Style_Dance_Solo_Versus = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,5,1,4,2,3 // outside in }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; */ @@ -482,10 +479,8 @@ static const Style g_Style_Dance_Routine = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper true, // m_bLockDifficulties - }; static const Style *g_apGame_Dance_Styles[] = @@ -507,6 +502,7 @@ static const Game g_Game_Dance = g_apGame_Dance_Styles, // m_apStyles false, // m_bCountNotesSeparately false, // m_bTickHolds + false, // m_PlayersHaveSeparateStyles { // m_InputScheme "dance", // m_szName NUM_DANCE_BUTTONS, // m_iButtonsPerController @@ -595,7 +591,6 @@ static const Style g_Style_Pump_Single = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 2,1,3,0,4 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -633,7 +628,6 @@ static const Style g_Style_Pump_Versus = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 2,1,3,0,4 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -673,7 +667,6 @@ static const Style g_Style_Pump_HalfDouble = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 2,3,1,4,0,5 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -721,7 +714,6 @@ static const Style g_Style_Pump_Double = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 2,1,3,0,4, 2+5,1+5,3+5,0+5,4+5 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -759,7 +751,6 @@ static const Style g_Style_Pump_Couple = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 2,1,3,0,4 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper true, // m_bLockDifficulties }; @@ -807,7 +798,6 @@ static const Style g_Style_Pump_Couple_Edit = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 2,1,3,0,4, 2+5,1+5,3+5,0+5,4+5 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -855,7 +845,6 @@ static const Style g_Style_Pump_Routine = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 2,1,3,0,4,7,6,8,5,9 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper true, // m_bLockDifficulties }; @@ -878,6 +867,7 @@ static const Game g_Game_Pump = g_apGame_Pump_Styles, // m_apStyles false, // m_bCountNotesSeparately true, // m_bTickHolds + false, // m_PlayersHaveSeparateStyles { // m_InputScheme "pump", // m_szName NUM_PUMP_BUTTONS, // m_iButtonsPerController @@ -956,7 +946,6 @@ static const Style g_Style_KB7_Single = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6 // doesn't work? }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1000,7 +989,6 @@ static const Style g_Style_KB7_Small = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6 // doesn't work? }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; */ @@ -1042,7 +1030,6 @@ static const Style g_Style_KB7_Versus = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6 }, - true, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1061,6 +1048,7 @@ static const Game g_Game_KB7 = g_apGame_KB7_Styles, // m_apStyles true, // m_bCountNotesSeparately false, // m_bTickHolds + false, // m_PlayersHaveSeparateStyles { // m_InputScheme "kb7", // m_szName NUM_KB7_BUTTONS, // m_iButtonsPerController @@ -1129,7 +1117,6 @@ static const Style g_Style_Ez2_Single = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 2,0,4,1,3 // This should be from back to front: Down, UpLeft, UpRight, Upper Left Hand, Upper Right Hand }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1171,7 +1158,6 @@ static const Style g_Style_Ez2_Real = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 3,0,6,1,5,2,4 // This should be from back to front: Down, UpLeft, UpRight, Lower Left Hand, Lower Right Hand, Upper Left Hand, Upper Right Hand }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1209,7 +1195,6 @@ static const Style g_Style_Ez2_Single_Versus = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 2,0,4,1,3 // This should be from back to front: Down, UpLeft, UpRight, Upper Left Hand, Upper Right Hand }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1251,7 +1236,6 @@ static const Style g_Style_Ez2_Real_Versus = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 3,0,6,2,4,1,5 // This should be from back to front: Down, UpLeft, UpRight, Lower Left Hand, Lower Right Hand, Upper Left Hand, Upper Right Hand }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1299,7 +1283,6 @@ static const Style g_Style_Ez2_Double = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 2,0,4,1,3,7,5,9,6,8 // This should be from back to front: Down, UpLeft, UpRight, Upper Left Hand, Upper Right Hand }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1333,6 +1316,7 @@ static const Game g_Game_Ez2 = g_apGame_Ez2_Styles, // m_apStyles true, // m_bCountNotesSeparately false, // m_bTickHolds + false, // m_PlayersHaveSeparateStyles { // m_InputScheme "ez2", // m_szName NUM_EZ2_BUTTONS, // m_iButtonsPerController @@ -1399,7 +1383,6 @@ static const Style g_Style_Para_Single = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 2,0,4,1,3 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1437,7 +1420,6 @@ static const Style g_Style_Para_Versus = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 2,0,4,1,3 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1466,6 +1448,7 @@ static const Game g_Game_Para = g_apGame_Para_Styles, // m_apStyles false, // m_bCountNotesSeparately false, // m_bTickHolds + false, // m_PlayersHaveSeparateStyles { // m_InputScheme "para", // m_szName NUM_PARA_BUTTONS, // m_iButtonsPerController @@ -1533,7 +1516,6 @@ static const Style g_Style_DS3DDX_Single = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1564,6 +1546,7 @@ static const Game g_Game_DS3DDX = g_apGame_DS3DDX_Styles, // m_apStyles false, // m_bCountNotesSeparately false, // m_bTickHolds + false, // m_PlayersHaveSeparateStyles { // m_InputScheme "ds3ddx", // m_szName NUM_DS3DDX_BUTTONS, // m_iButtonsPerController @@ -1633,7 +1616,6 @@ static const Style g_Style_Beat_Single5 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1673,7 +1655,6 @@ static const Style g_Style_Beat_Versus5 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1725,7 +1706,6 @@ static const Style g_Style_Beat_Double5 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7,8,9,10,11 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1769,7 +1749,6 @@ static const Style g_Style_Beat_Single7 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1813,7 +1792,6 @@ static const Style g_Style_Beat_Versus7 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1874,7 +1852,6 @@ static const Style g_Style_Beat_Double7 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -1910,6 +1887,7 @@ static const Game g_Game_Beat = g_apGame_Beat_Styles, // m_apStyles true, // m_bCountNotesSeparately false, // m_bTickHolds + false, // m_PlayersHaveSeparateStyles { // m_InputScheme "beat", // m_szName NUM_BEAT_BUTTONS, // m_iButtonsPerController @@ -1977,7 +1955,6 @@ static const Style g_Style_Maniax_Single = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0, 1, 2, 3 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2013,7 +1990,6 @@ static const Style g_Style_Maniax_Versus = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0, 1, 2, 3 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2057,7 +2033,6 @@ static const Style g_Style_Maniax_Double = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2090,6 +2065,7 @@ static const Game g_Game_Maniax = g_apGame_Maniax_Styles, // m_apStyles false, // m_bCountNotesSeparately false, // m_bTickHolds + false, // m_PlayersHaveSeparateStyles { // m_InputScheme "maniax", // m_szName NUM_MANIAX_BUTTONS, // m_iButtonsPerController @@ -2119,7 +2095,6 @@ static const Game g_Game_Maniax = //ThemeMetric TECHNO_COL_SPACING ("ColumnSpacing","Techno"); static const int TECHNO_COL_SPACING = 56; //ThemeMetric TECHNO_VERSUS_COL_SPACING ("ColumnSpacing","TechnoVersus"); -static const int TECHNO_VERSUS_COL_SPACING = 33; static const Style g_Style_Techno_Single4 = { // STYLE_TECHNO_SINGLE4 true, // m_bUsedForGameplay @@ -2151,7 +2126,6 @@ static const Style g_Style_Techno_Single4 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2191,7 +2165,6 @@ static const Style g_Style_Techno_Single5 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2235,7 +2208,6 @@ static const Style g_Style_Techno_Single8 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7 }, - true, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2271,7 +2243,6 @@ static const Style g_Style_Techno_Versus4 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2311,7 +2282,6 @@ static const Style g_Style_Techno_Versus5 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2328,24 +2298,24 @@ static const Style g_Style_Techno_Versus8 = 8, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; { // PLAYER_1 - { TRACK_1, -TECHNO_VERSUS_COL_SPACING*3.5f, NULL }, - { TRACK_2, -TECHNO_VERSUS_COL_SPACING*2.5f, NULL }, - { TRACK_3, -TECHNO_VERSUS_COL_SPACING*1.5f, NULL }, - { TRACK_4, -TECHNO_VERSUS_COL_SPACING*0.5f, NULL }, - { TRACK_5, +TECHNO_VERSUS_COL_SPACING*0.5f, NULL }, - { TRACK_6, +TECHNO_VERSUS_COL_SPACING*1.5f, NULL }, - { TRACK_7, +TECHNO_VERSUS_COL_SPACING*2.5f, NULL }, - { TRACK_8, +TECHNO_VERSUS_COL_SPACING*3.5f, NULL }, + { TRACK_1, -TECHNO_COL_SPACING*3.5f, NULL }, + { TRACK_2, -TECHNO_COL_SPACING*2.5f, NULL }, + { TRACK_3, -TECHNO_COL_SPACING*1.5f, NULL }, + { TRACK_4, -TECHNO_COL_SPACING*0.5f, NULL }, + { TRACK_5, +TECHNO_COL_SPACING*0.5f, NULL }, + { TRACK_6, +TECHNO_COL_SPACING*1.5f, NULL }, + { TRACK_7, +TECHNO_COL_SPACING*2.5f, NULL }, + { TRACK_8, +TECHNO_COL_SPACING*3.5f, NULL }, }, { // PLAYER_2 - { TRACK_1, -TECHNO_VERSUS_COL_SPACING*3.5f, NULL }, - { TRACK_2, -TECHNO_VERSUS_COL_SPACING*2.5f, NULL }, - { TRACK_3, -TECHNO_VERSUS_COL_SPACING*1.5f, NULL }, - { TRACK_4, -TECHNO_VERSUS_COL_SPACING*0.5f, NULL }, - { TRACK_5, +TECHNO_VERSUS_COL_SPACING*0.5f, NULL }, - { TRACK_6, +TECHNO_VERSUS_COL_SPACING*1.5f, NULL }, - { TRACK_7, +TECHNO_VERSUS_COL_SPACING*2.5f, NULL }, - { TRACK_8, +TECHNO_VERSUS_COL_SPACING*3.5f, NULL }, + { TRACK_1, -TECHNO_COL_SPACING*3.5f, NULL }, + { TRACK_2, -TECHNO_COL_SPACING*2.5f, NULL }, + { TRACK_3, -TECHNO_COL_SPACING*1.5f, NULL }, + { TRACK_4, -TECHNO_COL_SPACING*0.5f, NULL }, + { TRACK_5, +TECHNO_COL_SPACING*0.5f, NULL }, + { TRACK_6, +TECHNO_COL_SPACING*1.5f, NULL }, + { TRACK_7, +TECHNO_COL_SPACING*2.5f, NULL }, + { TRACK_8, +TECHNO_COL_SPACING*3.5f, NULL }, }, }, { // m_iInputColumn[NUM_GameController][NUM_GameButton] @@ -2357,7 +2327,6 @@ static const Style g_Style_Techno_Versus8 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7 }, - true, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2401,7 +2370,6 @@ static const Style g_Style_Techno_Double4 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2461,7 +2429,6 @@ static const Style g_Style_Techno_Double5 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7,8,9 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2478,40 +2445,40 @@ static const Style g_Style_Techno_Double8 = 16, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; { // PLAYER_1 - { TRACK_1, -TECHNO_VERSUS_COL_SPACING*7.5f, NULL }, - { TRACK_2, -TECHNO_VERSUS_COL_SPACING*6.5f, NULL }, - { TRACK_3, -TECHNO_VERSUS_COL_SPACING*5.5f, NULL }, - { TRACK_4, -TECHNO_VERSUS_COL_SPACING*4.5f, NULL }, - { TRACK_5, -TECHNO_VERSUS_COL_SPACING*3.5f, NULL }, - { TRACK_6, -TECHNO_VERSUS_COL_SPACING*2.5f, NULL }, - { TRACK_7, -TECHNO_VERSUS_COL_SPACING*1.5f, NULL }, - { TRACK_8, -TECHNO_VERSUS_COL_SPACING*0.5f, NULL }, - { TRACK_9, +TECHNO_VERSUS_COL_SPACING*0.5f, NULL }, - { TRACK_10, +TECHNO_VERSUS_COL_SPACING*1.5f, NULL }, - { TRACK_11, +TECHNO_VERSUS_COL_SPACING*2.5f, NULL }, - { TRACK_12, +TECHNO_VERSUS_COL_SPACING*3.5f, NULL }, - { TRACK_13, +TECHNO_VERSUS_COL_SPACING*4.5f, NULL }, - { TRACK_14, +TECHNO_VERSUS_COL_SPACING*5.5f, NULL }, - { TRACK_15, +TECHNO_VERSUS_COL_SPACING*6.5f, NULL }, - { TRACK_16, +TECHNO_VERSUS_COL_SPACING*7.5f, NULL }, + { TRACK_1, -TECHNO_COL_SPACING*7.5f, NULL }, + { TRACK_2, -TECHNO_COL_SPACING*6.5f, NULL }, + { TRACK_3, -TECHNO_COL_SPACING*5.5f, NULL }, + { TRACK_4, -TECHNO_COL_SPACING*4.5f, NULL }, + { TRACK_5, -TECHNO_COL_SPACING*3.5f, NULL }, + { TRACK_6, -TECHNO_COL_SPACING*2.5f, NULL }, + { TRACK_7, -TECHNO_COL_SPACING*1.5f, NULL }, + { TRACK_8, -TECHNO_COL_SPACING*0.5f, NULL }, + { TRACK_9, +TECHNO_COL_SPACING*0.5f, NULL }, + { TRACK_10, +TECHNO_COL_SPACING*1.5f, NULL }, + { TRACK_11, +TECHNO_COL_SPACING*2.5f, NULL }, + { TRACK_12, +TECHNO_COL_SPACING*3.5f, NULL }, + { TRACK_13, +TECHNO_COL_SPACING*4.5f, NULL }, + { TRACK_14, +TECHNO_COL_SPACING*5.5f, NULL }, + { TRACK_15, +TECHNO_COL_SPACING*6.5f, NULL }, + { TRACK_16, +TECHNO_COL_SPACING*7.5f, NULL }, }, { // PLAYER_2 - { TRACK_1, -TECHNO_VERSUS_COL_SPACING*7.5f, NULL }, - { TRACK_2, -TECHNO_VERSUS_COL_SPACING*6.5f, NULL }, - { TRACK_3, -TECHNO_VERSUS_COL_SPACING*5.5f, NULL }, - { TRACK_4, -TECHNO_VERSUS_COL_SPACING*4.5f, NULL }, - { TRACK_5, -TECHNO_VERSUS_COL_SPACING*3.5f, NULL }, - { TRACK_6, -TECHNO_VERSUS_COL_SPACING*2.5f, NULL }, - { TRACK_7, -TECHNO_VERSUS_COL_SPACING*1.5f, NULL }, - { TRACK_8, -TECHNO_VERSUS_COL_SPACING*0.5f, NULL }, - { TRACK_9, +TECHNO_VERSUS_COL_SPACING*0.5f, NULL }, - { TRACK_10, +TECHNO_VERSUS_COL_SPACING*1.5f, NULL }, - { TRACK_11, +TECHNO_VERSUS_COL_SPACING*2.5f, NULL }, - { TRACK_12, +TECHNO_VERSUS_COL_SPACING*3.5f, NULL }, - { TRACK_13, +TECHNO_VERSUS_COL_SPACING*4.5f, NULL }, - { TRACK_14, +TECHNO_VERSUS_COL_SPACING*5.5f, NULL }, - { TRACK_15, +TECHNO_VERSUS_COL_SPACING*6.5f, NULL }, - { TRACK_16, +TECHNO_VERSUS_COL_SPACING*7.5f, NULL }, + { TRACK_1, -TECHNO_COL_SPACING*7.5f, NULL }, + { TRACK_2, -TECHNO_COL_SPACING*6.5f, NULL }, + { TRACK_3, -TECHNO_COL_SPACING*5.5f, NULL }, + { TRACK_4, -TECHNO_COL_SPACING*4.5f, NULL }, + { TRACK_5, -TECHNO_COL_SPACING*3.5f, NULL }, + { TRACK_6, -TECHNO_COL_SPACING*2.5f, NULL }, + { TRACK_7, -TECHNO_COL_SPACING*1.5f, NULL }, + { TRACK_8, -TECHNO_COL_SPACING*0.5f, NULL }, + { TRACK_9, +TECHNO_COL_SPACING*0.5f, NULL }, + { TRACK_10, +TECHNO_COL_SPACING*1.5f, NULL }, + { TRACK_11, +TECHNO_COL_SPACING*2.5f, NULL }, + { TRACK_12, +TECHNO_COL_SPACING*3.5f, NULL }, + { TRACK_13, +TECHNO_COL_SPACING*4.5f, NULL }, + { TRACK_14, +TECHNO_COL_SPACING*5.5f, NULL }, + { TRACK_15, +TECHNO_COL_SPACING*6.5f, NULL }, + { TRACK_16, +TECHNO_COL_SPACING*7.5f, NULL }, }, }, { // m_iInputColumn[NUM_GameController][NUM_GameButton] @@ -2521,7 +2488,6 @@ static const Style g_Style_Techno_Double8 = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2570,6 +2536,7 @@ static const Game g_Game_Techno = g_apGame_Techno_Styles, // m_apStyles false, // m_bCountNotesSeparately false, // m_bTickHolds + false, // m_PlayersHaveSeparateStyles { // m_InputScheme "techno", // m_szName NUM_TECHNO_BUTTONS, // m_iButtonsPerController @@ -2642,7 +2609,6 @@ static const Style g_Style_Popn_Five = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2688,7 +2654,6 @@ static const Style g_Style_Popn_Nine = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7,8 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2721,6 +2686,7 @@ static const Game g_Game_Popn = g_apGame_Popn_Styles, // m_apStyles true, // m_bCountNotesSeparately false, // m_bTickHolds + false, // m_PlayersHaveSeparateStyles { // m_InputScheme "popn", // m_szName NUM_POPN_BUTTONS, // m_iButtonsPerController @@ -2810,7 +2776,6 @@ static const Style g_Style_Lights_Cabinet = { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; 0,1,2,3,4,5,6,7 }, - false, // m_bNeedsZoomOutWith2Players false, // m_bCanUseBeginnerHelper false, // m_bLockDifficulties }; @@ -2827,6 +2792,7 @@ static const Game g_Game_Lights = g_apGame_Lights_Styles, // m_apStyles false, // m_bCountNotesSeparately false, // m_bTickHolds + false, // m_PlayersHaveSeparateStyles { // m_InputScheme "lights", // m_szName NUM_LIGHTS_BUTTONS, // m_iButtonsPerController @@ -2859,6 +2825,393 @@ static const Game g_Game_Lights = TNS_W5, // m_mapW5To }; +/** Kickbox mania **********************************************************/ +static const AutoMappings g_AutoKeyMappings_Kickbox = AutoMappings ( + "", "", "", + AutoMappingEntry(0, KEY_Cq, GAME_BUTTON_MENULEFT, false), + AutoMappingEntry(0, KEY_Cr, GAME_BUTTON_MENURIGHT, false), + AutoMappingEntry(0, KEY_Ce, GAME_BUTTON_MENUUP, false), + AutoMappingEntry(0, KEY_Cw, GAME_BUTTON_MENUDOWN, false), + AutoMappingEntry(0, KEY_Cz, KICKBOX_BUTTON_DOWN_LEFT_FOOT, false), + AutoMappingEntry(0, KEY_Ca, KICKBOX_BUTTON_UP_LEFT_FOOT, false), + AutoMappingEntry(0, KEY_Cs, KICKBOX_BUTTON_UP_LEFT_FIST, false), + AutoMappingEntry(0, KEY_Cx, KICKBOX_BUTTON_DOWN_LEFT_FIST, false), + AutoMappingEntry(0, KEY_Cc, KICKBOX_BUTTON_DOWN_RIGHT_FIST, false), + AutoMappingEntry(0, KEY_Cd, KICKBOX_BUTTON_UP_RIGHT_FIST, false), + AutoMappingEntry(0, KEY_Cf, KICKBOX_BUTTON_UP_RIGHT_FOOT, false), + AutoMappingEntry(0, KEY_Cv, KICKBOX_BUTTON_DOWN_RIGHT_FOOT, false), + AutoMappingEntry(0, KEY_Cu, GAME_BUTTON_MENULEFT, true), + AutoMappingEntry(0, KEY_Cp, GAME_BUTTON_MENURIGHT, true), + AutoMappingEntry(0, KEY_Ci, GAME_BUTTON_MENUUP, true), + AutoMappingEntry(0, KEY_Co, GAME_BUTTON_MENUDOWN, true), + AutoMappingEntry(0, KEY_Cm, KICKBOX_BUTTON_DOWN_LEFT_FOOT, true), + AutoMappingEntry(0, KEY_Cj, KICKBOX_BUTTON_UP_LEFT_FOOT, true), + AutoMappingEntry(0, KEY_Ck, KICKBOX_BUTTON_UP_LEFT_FIST, true), + AutoMappingEntry(0, KEY_COMMA, KICKBOX_BUTTON_DOWN_LEFT_FIST, true), + AutoMappingEntry(0, KEY_PERIOD, KICKBOX_BUTTON_DOWN_RIGHT_FIST, true), + AutoMappingEntry(0, KEY_Cl, KICKBOX_BUTTON_UP_RIGHT_FIST, true), + AutoMappingEntry(0, KEY_SEMICOLON, KICKBOX_BUTTON_UP_RIGHT_FOOT, true), + AutoMappingEntry(0, KEY_SLASH, KICKBOX_BUTTON_DOWN_RIGHT_FOOT, true) +); + +static const int KICKBOX_COL_SPACING= 64; + +static const Style g_Style_Kickbox_Human= +{ + true, // m_bUsedForGameplay + true, // m_bUsedForEdit + true, // m_bUsedForDemonstration + true, // m_bUsedForHowToPlay + "human", // m_szName + StepsType_kickbox_human, // m_StepsType + StyleType_OnePlayerOneSide, // m_StyleType + 4, // m_iColsPerPlayer + { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; + { // PLAYER_1 + { TRACK_1, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_3, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_4, +KICKBOX_COL_SPACING*1.5f, NULL }, + }, + { // PLAYER_2 + { TRACK_1, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_3, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_4, +KICKBOX_COL_SPACING*1.5f, NULL }, + }, + }, + { // m_iInputColumn[NUM_GameController][NUM_GameButton] + { 0, 0, 1, 1, 2, 2, 3, 3, Style::END_MAPPING }, + { 0, 0, 1, 1, 2, 2, 3, 3, Style::END_MAPPING } + }, + { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; + 0, 1, 2, 3 + }, + false, // m_bCanUseBeginnerHelper + false, // m_bLockDifficulties +}; + +static const Style g_Style_Kickbox_Human_Versus= +{ + true, // m_bUsedForGameplay + false, // m_bUsedForEdit + true, // m_bUsedForDemonstration + false, // m_bUsedForHowToPlay + "hversus", // m_szName + StepsType_kickbox_human, // m_StepsType + StyleType_TwoPlayersTwoSides, // m_StyleType + 4, // m_iColsPerPlayer + { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; + { // PLAYER_1 + { TRACK_1, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_3, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_4, +KICKBOX_COL_SPACING*1.5f, NULL }, + }, + { // PLAYER_2 + { TRACK_1, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_3, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_4, +KICKBOX_COL_SPACING*1.5f, NULL }, + }, + }, + { // m_iInputColumn[NUM_GameController][NUM_GameButton] + { 0, 0, 1, 1, 2, 2, 3, 3, Style::END_MAPPING }, + { 0, 0, 1, 1, 2, 2, 3, 3, Style::END_MAPPING } + }, + { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; + 0, 1, 2, 3 + }, + false, // m_bCanUseBeginnerHelper + false, // m_bLockDifficulties +}; + +static const Style g_Style_Kickbox_Quadarm= +{ + true, // m_bUsedForGameplay + true, // m_bUsedForEdit + true, // m_bUsedForDemonstration + true, // m_bUsedForHowToPlay + "quadarm", // m_szName + StepsType_kickbox_quadarm, // m_StepsType + StyleType_OnePlayerOneSide, // m_StyleType + 4, // m_iColsPerPlayer + { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; + { // PLAYER_1 + { TRACK_1, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_3, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_4, +KICKBOX_COL_SPACING*1.5f, NULL }, + }, + { // PLAYER_2 + { TRACK_1, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_3, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_4, +KICKBOX_COL_SPACING*1.5f, NULL }, + }, + }, + { // m_iInputColumn[NUM_GameController][NUM_GameButton] + { Style::NO_MAPPING, Style::NO_MAPPING, 0, 1, 2, 3, Style::NO_MAPPING, Style::NO_MAPPING, Style::END_MAPPING }, + { Style::NO_MAPPING, Style::NO_MAPPING, 0, 1, 2, 3, Style::NO_MAPPING, Style::NO_MAPPING, Style::END_MAPPING } + }, + { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; + 0, 1, 2, 3 + }, + false, // m_bCanUseBeginnerHelper + false, // m_bLockDifficulties +}; + +static const Style g_Style_Kickbox_Quadarm_Versus= +{ + true, // m_bUsedForGameplay + false, // m_bUsedForEdit + true, // m_bUsedForDemonstration + false, // m_bUsedForHowToPlay + "qversus", // m_szName + StepsType_kickbox_quadarm, // m_StepsType + StyleType_TwoPlayersTwoSides, // m_StyleType + 4, // m_iColsPerPlayer + { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; + { // PLAYER_1 + { TRACK_1, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_3, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_4, +KICKBOX_COL_SPACING*1.5f, NULL }, + }, + { // PLAYER_2 + { TRACK_1, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_3, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_4, +KICKBOX_COL_SPACING*1.5f, NULL }, + }, + }, + { // m_iInputColumn[NUM_GameController][NUM_GameButton] + { Style::NO_MAPPING, Style::NO_MAPPING, 0, 1, 2, 3, Style::NO_MAPPING, Style::NO_MAPPING, Style::END_MAPPING }, + { Style::NO_MAPPING, Style::NO_MAPPING, 0, 1, 2, 3, Style::NO_MAPPING, Style::NO_MAPPING, Style::END_MAPPING } + }, + { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; + 0, 1, 2, 3 + }, + false, // m_bCanUseBeginnerHelper + false, // m_bLockDifficulties +}; + +static const Style g_Style_Kickbox_Insect= +{ + true, // m_bUsedForGameplay + true, // m_bUsedForEdit + true, // m_bUsedForDemonstration + true, // m_bUsedForHowToPlay + "insect", // m_szName + StepsType_kickbox_insect, // m_StepsType + StyleType_OnePlayerOneSide, // m_StyleType + 6, // m_iColsPerPlayer + { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; + { // PLAYER_1 + { TRACK_1, -KICKBOX_COL_SPACING*2.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_3, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_4, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_5, +KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_6, +KICKBOX_COL_SPACING*2.5f, NULL }, + }, + { // PLAYER_2 + { TRACK_1, -KICKBOX_COL_SPACING*2.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_3, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_4, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_5, +KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_6, +KICKBOX_COL_SPACING*2.5f, NULL }, + }, + }, + { // m_iInputColumn[NUM_GameController][NUM_GameButton] + { 0, 0, 1, 2, 3, 4, 5, 5, Style::END_MAPPING }, + { 0, 0, 1, 2, 3, 4, 5, 5, Style::END_MAPPING } + }, + { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; + 0, 1, 2, 3, 4, 5 + }, + false, // m_bCanUseBeginnerHelper + false, // m_bLockDifficulties +}; + +static const Style g_Style_Kickbox_Insect_Versus= +{ + true, // m_bUsedForGameplay + false, // m_bUsedForEdit + true, // m_bUsedForDemonstration + false, // m_bUsedForHowToPlay + "iversus", // m_szName + StepsType_kickbox_insect, // m_StepsType + StyleType_TwoPlayersTwoSides, // m_StyleType + 6, // m_iColsPerPlayer + { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; + { // PLAYER_1 + { TRACK_1, -KICKBOX_COL_SPACING*2.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_3, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_4, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_5, +KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_6, +KICKBOX_COL_SPACING*2.5f, NULL }, + }, + { // PLAYER_2 + { TRACK_1, -KICKBOX_COL_SPACING*2.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_3, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_4, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_5, +KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_6, +KICKBOX_COL_SPACING*2.5f, NULL }, + }, + }, + { // m_iInputColumn[NUM_GameController][NUM_GameButton] + { 0, 0, 1, 2, 3, 4, 5, 5, Style::END_MAPPING }, + { 0, 0, 1, 2, 3, 4, 5, 5, Style::END_MAPPING } + }, + { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; + 0, 1, 2, 3, 4, 5 + }, + false, // m_bCanUseBeginnerHelper + false, // m_bLockDifficulties +}; + +static const Style g_Style_Kickbox_Arachnid= +{ + true, // m_bUsedForGameplay + true, // m_bUsedForEdit + true, // m_bUsedForDemonstration + true, // m_bUsedForHowToPlay + "arachnid", // m_szName + StepsType_kickbox_arachnid, // m_StepsType + StyleType_OnePlayerOneSide, // m_StyleType + 8, // m_iColsPerPlayer + { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; + { // PLAYER_1 + { TRACK_1, -KICKBOX_COL_SPACING*3.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*2.5f, NULL }, + { TRACK_3, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_4, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_5, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_6, +KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_7, +KICKBOX_COL_SPACING*2.5f, NULL }, + { TRACK_8, +KICKBOX_COL_SPACING*3.5f, NULL }, + }, + { // PLAYER_2 + { TRACK_1, -KICKBOX_COL_SPACING*3.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*2.5f, NULL }, + { TRACK_3, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_4, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_5, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_6, +KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_7, +KICKBOX_COL_SPACING*2.5f, NULL }, + { TRACK_8, +KICKBOX_COL_SPACING*3.5f, NULL }, + }, + }, + { // m_iInputColumn[NUM_GameController][NUM_GameButton] + { 0, 1, 2, 3, 4, 5, 6, 7, Style::END_MAPPING }, + { 0, 1, 2, 3, 4, 5, 6, 7, Style::END_MAPPING } + }, + { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; + 0, 1, 2, 3, 4, 5, 6, 7 + }, + false, // m_bCanUseBeginnerHelper + false, // m_bLockDifficulties +}; + +static const Style g_Style_Kickbox_Arachnid_Versus= +{ + true, // m_bUsedForGameplay + false, // m_bUsedForEdit + true, // m_bUsedForDemonstration + false, // m_bUsedForHowToPlay + "aversus", // m_szName + StepsType_kickbox_arachnid, // m_StepsType + StyleType_TwoPlayersTwoSides, // m_StyleType + 8, // m_iColsPerPlayer + { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; + { // PLAYER_1 + { TRACK_1, -KICKBOX_COL_SPACING*3.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*2.5f, NULL }, + { TRACK_3, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_4, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_5, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_6, +KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_7, +KICKBOX_COL_SPACING*2.5f, NULL }, + { TRACK_8, +KICKBOX_COL_SPACING*3.5f, NULL }, + }, + { // PLAYER_2 + { TRACK_1, -KICKBOX_COL_SPACING*3.5f, NULL }, + { TRACK_2, -KICKBOX_COL_SPACING*2.5f, NULL }, + { TRACK_3, -KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_4, -KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_5, +KICKBOX_COL_SPACING*0.5f, NULL }, + { TRACK_6, +KICKBOX_COL_SPACING*1.5f, NULL }, + { TRACK_7, +KICKBOX_COL_SPACING*2.5f, NULL }, + { TRACK_8, +KICKBOX_COL_SPACING*3.5f, NULL }, + }, + }, + { // m_iInputColumn[NUM_GameController][NUM_GameButton] + { 0, 1, 2, 3, 4, 5, 6, 7, Style::END_MAPPING }, + { 0, 1, 2, 3, 4, 5, 6, 7, Style::END_MAPPING } + }, + { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; + 0, 1, 2, 3, 4, 5, 6, 7 + }, + false, // m_bCanUseBeginnerHelper + false, // m_bLockDifficulties +}; + +static const Style* g_apGame_Kickbox_Styles[] = +{ + &g_Style_Kickbox_Human, + &g_Style_Kickbox_Quadarm, + &g_Style_Kickbox_Insect, + &g_Style_Kickbox_Arachnid, + &g_Style_Kickbox_Human_Versus, + &g_Style_Kickbox_Quadarm_Versus, + &g_Style_Kickbox_Insect_Versus, + &g_Style_Kickbox_Arachnid_Versus, + NULL +}; + +static const Game g_Game_Kickbox = +{ + "kickbox", // m_szName + g_apGame_Kickbox_Styles, // m_apStyles + true, // m_bCountNotesSeparately + false, // m_bTickHolds + true, // m_PlayersHaveSeparateStyles + { // m_InputScheme + "kickbox", // m_szName + NUM_KICKBOX_BUTTONS, // m_iButtonsPerController + { // m_szButtonNames + { "DownLeftFoot", GameButton_Invalid }, + { "UpLeftFoot", GameButton_Invalid }, + { "UpLeftFist", GAME_BUTTON_LEFT }, + { "DownLeftFist", GAME_BUTTON_UP }, + { "DownRightFist", GAME_BUTTON_DOWN }, + { "UpRightFist", GAME_BUTTON_RIGHT }, + { "UpRightFoot", GameButton_Invalid }, + { "DownRightFoot", GameButton_Invalid }, + }, + &g_AutoKeyMappings_Kickbox + }, + { + { GameButtonType_Step }, + { GameButtonType_Step }, + { GameButtonType_Step }, + { GameButtonType_Step }, + { GameButtonType_Step }, + { GameButtonType_Step }, + { GameButtonType_Step }, + { GameButtonType_Step }, + }, + TNS_W1, // m_mapW1To + TNS_W2, // m_mapW2To + TNS_W3, // m_mapW3To + TNS_W4, // m_mapW4To + TNS_W5, // m_mapW5To +}; + static const Game *g_Games[] = { &g_Game_Dance, @@ -2872,6 +3225,7 @@ static const Game *g_Games[] = &g_Game_Techno, &g_Game_Popn, &g_Game_Lights, + &g_Game_Kickbox, }; GameManager::GameManager() diff --git a/src/GameState.cpp b/src/GameState.cpp index 8444616d4a..0253d9dd92 100644 --- a/src/GameState.cpp +++ b/src/GameState.cpp @@ -20,6 +20,7 @@ #include "LuaReference.h" #include "MessageManager.h" #include "MemoryCardManager.h" +#include "NoteData.h" #include "NoteSkinManager.h" #include "PlayerState.h" #include "PrefsManager.h" @@ -136,7 +137,11 @@ GameState::GameState() : { g_pImpl = new GameStateImpl; - SetCurrentStyle( NULL ); + m_pCurStyle.Set(NULL); + FOREACH_PlayerNumber(rpn) + { + m_SeparatedStyles[rpn]= NULL; + } m_pCurGame.Set( NULL ); m_iCoins.Set( 0 ); @@ -153,12 +158,12 @@ GameState::GameState() : FOREACH_PlayerNumber( p ) { m_pPlayerState[p] = new PlayerState; - m_pPlayerState[p]->m_PlayerNumber = p; + m_pPlayerState[p]->SetPlayerNumber(p); } FOREACH_MultiPlayer( p ) { m_pMultiPlayerState[p] = new PlayerState; - m_pMultiPlayerState[p]->m_PlayerNumber = PLAYER_1; + m_pMultiPlayerState[p]->SetPlayerNumber(PLAYER_1); m_pMultiPlayerState[p]->m_mp = p; } @@ -285,7 +290,7 @@ void GameState::Reset() ASSERT( THEME != NULL ); m_timeGameStarted.SetZero(); - SetCurrentStyle( NULL ); + SetCurrentStyle( NULL, PLAYER_INVALID ); FOREACH_MultiPlayer( p ) m_MultiPlayerStatus[p] = MultiPlayerStatus_NotJoined; FOREACH_PlayerNumber( pn ) @@ -391,23 +396,32 @@ void GameState::JoinPlayer( PlayerNumber pn ) } // Set the current style to something appropriate for the new number of joined players. - if( ALLOW_LATE_JOIN && m_pCurStyle != NULL ) + // beat gametype's versus styles use a different stepstype from its single + // styles, so when GameCommand tries to join both players for a versus + // style, it hits the assert when joining the first player. So if the first + // player is being joined and the current styletype is for two players, + // assume that the second player will be joined immediately afterwards and + // don't try to change the style. -Kyz + const Style* cur_style= GetCurrentStyle(PLAYER_INVALID); + if( ALLOW_LATE_JOIN && cur_style != NULL && !(pn == PLAYER_1 && + (cur_style->m_StyleType == StyleType_TwoPlayersTwoSides || + cur_style->m_StyleType == StyleType_TwoPlayersSharedSides))) { const Style *pStyle; // Only use one player for StyleType_OnePlayerTwoSides and StepsTypes // that can only be played by one player (e.g. dance-solo, // dance-threepanel, popn-nine). -aj // XXX?: still shows joined player as "Insert Card". May not be an issue? -aj - if( m_pCurStyle->m_StyleType == StyleType_OnePlayerTwoSides || - m_pCurStyle->m_StepsType == StepsType_dance_solo || - m_pCurStyle->m_StepsType == StepsType_dance_threepanel || - m_pCurStyle->m_StepsType == StepsType_popn_nine ) - pStyle = GAMEMAN->GetFirstCompatibleStyle( m_pCurGame, 1, m_pCurStyle->m_StepsType ); + if( cur_style->m_StyleType == StyleType_OnePlayerTwoSides || + cur_style->m_StepsType == StepsType_dance_solo || + cur_style->m_StepsType == StepsType_dance_threepanel || + cur_style->m_StepsType == StepsType_popn_nine ) + pStyle = GAMEMAN->GetFirstCompatibleStyle( m_pCurGame, 1, cur_style->m_StepsType ); else - pStyle = GAMEMAN->GetFirstCompatibleStyle( m_pCurGame, GetNumSidesJoined(), m_pCurStyle->m_StepsType ); + pStyle = GAMEMAN->GetFirstCompatibleStyle( m_pCurGame, GetNumSidesJoined(), cur_style->m_StepsType ); // use SetCurrentStyle in case of StyleType_OnePlayerTwoSides - SetCurrentStyle( pStyle ); + SetCurrentStyle( pStyle, pn ); } Message msg( MessageIDToString(Message_PlayerJoined) ); @@ -657,7 +671,7 @@ int GameState::GetNumStagesForCurrentSongAndStepsOrCourse() const int iNumStagesOfThisSong = 1; if( m_pCurSong ) { - const Style *pStyle = m_pCurStyle; + const Style *pStyle = GetCurrentStyle(PLAYER_INVALID); int numSidesJoined = GetNumSidesJoined(); if( pStyle == NULL ) { @@ -734,7 +748,12 @@ void GameState::BeginStage() // only do this check with human players, assume CPU players (Rave) // always have tokens. -aj (this could probably be moved below, even.) if( !IsEventMode() && !IsCpuPlayer(p) ) - ASSERT( m_iPlayerStageTokens[p] >= m_iNumStagesOfThisSong ); + { + if(m_iPlayerStageTokens[p] < m_iNumStagesOfThisSong) + { + LuaHelpers::ReportScriptErrorFmt("Player %d only has %d stage tokens, but needs %d.", p, m_iPlayerStageTokens[p], m_iNumStagesOfThisSong); + } + } m_iPlayerStageTokens[p] -= m_iNumStagesOfThisSong; } FOREACH_HumanPlayer( pn ) @@ -894,6 +913,170 @@ void GameState::SaveCurrentSettingsToProfile( PlayerNumber pn ) pProfile->m_lastCourse.FromCourse( m_pPreferredCourse ); } +bool GameState::CanSafelyEnterGameplay(RString& reason) +{ + if(!IsCourseMode()) + { + Song const* song= m_pCurSong; + if(song == NULL) + { + reason= "Current song is NULL."; + return false; + } + } + else + { + Course const* song= m_pCurCourse; + if(song == NULL) + { + reason= "Current course is NULL."; + return false; + } + } + FOREACH_EnabledPlayer(pn) + { + Style const* style= GetCurrentStyle(pn); + if(style == NULL) + { + reason= ssprintf("Style for player %d is NULL.", pn+1); + return false; + } + if(!IsCourseMode()) + { + Steps const* steps= m_pCurSteps[pn]; + if(steps == NULL) + { + reason= ssprintf("Steps for player %d is NULL.", pn+1); + return false; + } + if(steps->m_StepsType != style->m_StepsType) + { + reason= ssprintf("Player %d StepsType %s for steps does not equal " + "StepsType %s for style.", pn+1, + GAMEMAN->GetStepsTypeInfo(steps->m_StepsType).szName, + GAMEMAN->GetStepsTypeInfo(style->m_StepsType).szName); + return false; + } + if(steps->m_pSong != m_pCurSong) + { + reason= ssprintf("Steps for player %d are not for the current song.", + pn+1); + return false; + } + NoteData ndtemp; + steps->GetNoteData(ndtemp); + if(ndtemp.GetNumTracks() != style->m_iColsPerPlayer) + { + reason= ssprintf("Steps for player %d have %d columns, style has %d " + "columns.", pn+1, ndtemp.GetNumTracks(), style->m_iColsPerPlayer); + return false; + } + } + else + { + Trail const* steps= m_pCurTrail[pn]; + if(steps == NULL) + { + reason= ssprintf("Steps for player %d is NULL.", pn+1); + return false; + } + if(steps->m_StepsType != style->m_StepsType) + { + reason= ssprintf("Player %d StepsType %s for steps does not equal " + "StepsType %s for style.", pn+1, + GAMEMAN->GetStepsTypeInfo(steps->m_StepsType).szName, + GAMEMAN->GetStepsTypeInfo(style->m_StepsType).szName); + return false; + } + } + } + return true; +} + +void GameState::SetCompatibleStylesForPlayers() +{ + bool style_set= false; + if(IsCourseMode()) + { + if(m_pCurCourse != NULL) + { + const Style* style= m_pCurCourse->GetCourseStyle(m_pCurGame, GetNumSidesJoined()); + if(style != NULL) + { + style_set= true; + SetCurrentStyle(style, PLAYER_INVALID); + } + } + else if(GetCurrentStyle(PLAYER_INVALID) == NULL) + { + vector vst; + GAMEMAN->GetStepsTypesForGame(m_pCurGame, vst); + const Style *style = GAMEMAN->GetFirstCompatibleStyle( + m_pCurGame, GetNumSidesJoined(), vst[0]); + SetCurrentStyle(style, PLAYER_INVALID); + } + } + if(!style_set) + { + FOREACH_EnabledPlayer(pn) + { + StepsType st= StepsType_Invalid; + if(m_pCurSteps[pn] != NULL) + { + st= m_pCurSteps[pn]->m_StepsType; + } + else if(m_pCurTrail[pn] != NULL) + { + st= m_pCurTrail[pn]->m_StepsType; + } + else + { + vector vst; + GAMEMAN->GetStepsTypesForGame(m_pCurGame, vst); + st= vst[0]; + } + const Style *style = GAMEMAN->GetFirstCompatibleStyle( + m_pCurGame, GetNumSidesJoined(), st); + SetCurrentStyle(style, pn); + } + } +} + +void GameState::ForceSharedSidesMatch() +{ + PlayerNumber pn_with_shared= PLAYER_INVALID; + const Style* shared_style= NULL; + FOREACH_EnabledPlayer(pn) + { + const Style* style= GetCurrentStyle(pn); + ASSERT_M(style != NULL, "Style being null should not be possible."); + if(style->m_StyleType == StyleType_TwoPlayersSharedSides) + { + pn_with_shared= pn; + shared_style= style; + } + } + if(pn_with_shared != PLAYER_INVALID) + { + ASSERT_M(GetNumPlayersEnabled() == 2, "2 players must be enabled for shared sides."); + PlayerNumber other_pn= OPPOSITE_PLAYER[pn_with_shared]; + const Style* other_style= GetCurrentStyle(other_pn); + ASSERT_M(other_style != NULL, "Other player's style being null should not be possible."); + if(other_style->m_StyleType != StyleType_TwoPlayersSharedSides) + { + SetCurrentStyle(shared_style, other_pn); + if(IsCourseMode()) + { + m_pCurTrail[other_pn].Set(m_pCurTrail[pn_with_shared]); + } + else + { + m_pCurSteps[other_pn].Set(m_pCurSteps[pn_with_shared]); + } + } + } +} + void GameState::Update( float fDelta ) { m_SongOptions.Update( fDelta ); @@ -1197,7 +1380,7 @@ RString GameState::GetPlayerDisplayName( PlayerNumber pn ) const bool GameState::PlayersCanJoin() const { - bool b = GetNumSidesJoined() == 0 || GetCurrentStyle() == NULL; // selecting a style finalizes the players + bool b = GetNumSidesJoined() == 0 || GetCurrentStyle(PLAYER_INVALID) == NULL; // selecting a style finalizes the players if( ALLOW_LATE_JOIN.IsLoaded() && ALLOW_LATE_JOIN ) { Screen *pScreen = SCREENMAN->GetTopScreen(); @@ -1216,39 +1399,69 @@ int GameState::GetNumSidesJoined() const return iNumSidesJoined; } -const Game* GameState::GetCurrentGame() +const Game* GameState::GetCurrentGame() const { ASSERT( m_pCurGame != NULL ); // the game must be set before calling this return m_pCurGame; } -const Style* GameState::GetCurrentStyle() const +const Style* GameState::GetCurrentStyle(PlayerNumber pn) const { - return m_pCurStyle; -} - -void GameState::SetCurrentStyle( const Style *pStyle ) -{ - m_pCurStyle.Set( pStyle ); - if( INPUTMAPPER ) + if(GetCurrentGame() == NULL) { return NULL; } + if(!GetCurrentGame()->m_PlayersHaveSeparateStyles) { - if( GetCurrentStyle() && GetCurrentStyle()->m_StyleType == StyleType_OnePlayerTwoSides ) - INPUTMAPPER->SetJoinControllers( this->GetMasterPlayerNumber() ); - else - INPUTMAPPER->SetJoinControllers( PLAYER_INVALID ); + return m_pCurStyle; + } + else + { + if(pn >= NUM_PLAYERS) + { + return m_SeparatedStyles[PLAYER_1] == NULL ? m_SeparatedStyles[PLAYER_2] + : m_SeparatedStyles[PLAYER_1]; + } + return m_SeparatedStyles[pn]; } } -bool GameState::SetCompatibleStyle(StepsType stype) +void GameState::SetCurrentStyle(const Style *style, PlayerNumber pn) +{ + if(!GetCurrentGame()->m_PlayersHaveSeparateStyles) + { + m_pCurStyle.Set(style); + } + else + { + if(pn == PLAYER_INVALID) + { + FOREACH_PlayerNumber(rpn) + { + m_SeparatedStyles[rpn]= style; + } + } + else + { + m_SeparatedStyles[pn]= style; + } + } + if(INPUTMAPPER) + { + if(GetCurrentStyle(pn) && GetCurrentStyle(pn)->m_StyleType == StyleType_OnePlayerTwoSides) + INPUTMAPPER->SetJoinControllers(this->GetMasterPlayerNumber()); + else + INPUTMAPPER->SetJoinControllers(PLAYER_INVALID); + } +} + +bool GameState::SetCompatibleStyle(StepsType stype, PlayerNumber pn) { bool style_incompatible= false; - if(!m_pCurStyle) + if(!GetCurrentStyle(pn)) { style_incompatible= true; } else { - style_incompatible= stype != m_pCurStyle->m_StepsType; + style_incompatible= stype != GetCurrentStyle(pn)->m_StepsType; } if(CommonMetrics::AUTO_SET_STYLE && style_incompatible) { @@ -1258,9 +1471,9 @@ bool GameState::SetCompatibleStyle(StepsType stype) { return false; } - SetCurrentStyle(compatible_style); + SetCurrentStyle(compatible_style, pn); } - return stype == m_pCurStyle->m_StepsType; + return stype == GetCurrentStyle(pn)->m_StepsType; } bool GameState::IsPlayerEnabled( PlayerNumber pn ) const @@ -1303,7 +1516,29 @@ bool GameState::IsHumanPlayer( PlayerNumber pn ) const if( pn == PLAYER_INVALID ) return false; - if( GetCurrentStyle() == NULL ) // no style chosen + if(GetCurrentGame()->m_PlayersHaveSeparateStyles) + { + if( GetCurrentStyle(pn) == NULL ) // no style chosen + { + return m_bSideIsJoined[pn]; + } + else + { + StyleType type = GetCurrentStyle(pn)->m_StyleType; + switch( type ) + { + case StyleType_TwoPlayersTwoSides: + case StyleType_TwoPlayersSharedSides: + return true; + case StyleType_OnePlayerOneSide: + case StyleType_OnePlayerTwoSides: + return pn == this->GetMasterPlayerNumber(); + default: + FAIL_M(ssprintf("Invalid style type: %i", type)); + } + } + } + if( GetCurrentStyle(pn) == NULL ) // no style chosen { if( PlayersCanJoin() ) return m_bSideIsJoined[pn]; // only allow input from sides that have already joined @@ -1311,7 +1546,7 @@ bool GameState::IsHumanPlayer( PlayerNumber pn ) const return true; // if we can't join, then we're on a screen like MusicScroll or GameOver } - StyleType type = GetCurrentStyle()->m_StyleType; + StyleType type = GetCurrentStyle(pn)->m_StyleType; switch( type ) { case StyleType_TwoPlayersTwoSides: @@ -1669,7 +1904,7 @@ void GameState::GetRankingFeats( PlayerNumber pn, vector &asFeatsOu { CHECKPOINT; - StepsType st = GetCurrentStyle()->m_StepsType; + StepsType st = GetCurrentStyle(pn)->m_StepsType; // Find unique Song and Steps combinations that were played. // We must keep only the unique combination or else we'll double-count @@ -2012,7 +2247,7 @@ bool GameState::DifficultiesLocked() const return true; if( IsCourseMode() ) return PREFSMAN->m_bLockCourseDifficulties; - if( GetCurrentStyle()->m_bLockDifficulties ) + if( GetCurrentStyle(PLAYER_INVALID)->m_bLockDifficulties ) return true; return false; } @@ -2099,7 +2334,7 @@ bool GameState::ChangePreferredCourseDifficulty( PlayerNumber pn, int dir ) return false; if( find(v.begin(),v.end(),cd) == v.end() ) continue; /* not available */ - if( !pCourse || pCourse->GetTrail( GetCurrentStyle()->m_StepsType, cd ) ) + if( !pCourse || pCourse->GetTrail( GetCurrentStyle(pn)->m_StepsType, cd ) ) break; } @@ -2319,13 +2554,21 @@ public: else { Song *pS = Luna::check( L, 1, true ); p->m_pCurSong.Set( pS ); } COMMON_RETURN_SELF; } - static void SetCompatibleStyleOrError(T* p, lua_State* L, StepsType stype) + static int CanSafelyEnterGameplay(T* p, lua_State* L) { - if(!p->SetCompatibleStyle(stype)) + RString reason; + bool can= p->CanSafelyEnterGameplay(reason); + lua_pushboolean(L, can); + LuaHelpers::Push(L, reason); + return 2; + } + static void SetCompatibleStyleOrError(T* p, lua_State* L, StepsType stype, PlayerNumber pn) + { + if(!p->SetCompatibleStyle(stype, pn)) { luaL_error(L, "No compatible style for steps/trail."); } - if(!p->m_pCurStyle) + if(!p->GetCurrentStyle(pn)) { luaL_error(L, "No style set and AutoSetStyle is false, cannot set steps/trail."); } @@ -2348,7 +2591,7 @@ public: else { Steps *pS = Luna::check(L,2); - SetCompatibleStyleOrError(p, L, pS->m_StepsType); + SetCompatibleStyleOrError(p, L, pS->m_StepsType, pn); p->m_pCurSteps[pn].Set(pS); } COMMON_RETURN_SELF; @@ -2378,7 +2621,7 @@ public: else { Trail *pS = Luna::check(L,2); - SetCompatibleStyleOrError(p, L, pS->m_StepsType); + SetCompatibleStyleOrError(p, L, pS->m_StepsType, pn); p->m_pCurTrail[pn].Set(pS); } COMMON_RETURN_SELF; @@ -2579,7 +2822,8 @@ public: } static int GetCurrentStyle( T* p, lua_State *L ) { - Style *pStyle = const_cast