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