Page MenuHomePhabricator (Chris)

No OneTemporary

Size
326 KB
Referenced Files
None
Subscribers
None
This file is larger than 256 KB, so syntax highlighting was skipped.
diff --git a/ChangeLog b/ChangeLog
index e69de29..f2a17b5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -0,0 +1,148 @@
+2003-09-12 11:49 upi
+
+ * src/: Backend.h, Game.cpp, PlayerSelect.cpp, PlayerSelect.h:
+ Fighter names are displayed in the PlayerSelect and Game screens.
+
+2003-09-12 11:48 upi
+
+ * src/menu.cpp: "Hit Points" changed to "Stamina" in the menu.
+
+2003-09-12 11:47 upi
+
+ * data/script/: Backend.pl, Fighter.pl: Fighters can no longer be
+ "cornered". If a fighter is hit at the edge of the arena, the other
+ fighter is pushed back.
+
+2003-09-12 11:45 upi
+
+ * data/script/Descant.pl: Descant now cannot be leg swept too many
+ times.
+
+2003-09-11 21:54 upi
+
+ * data/script/: Backend.pl, DataHelper.pl, Fighter.pl, Grizli.pl:
+ Added "Earthquake" effect.
+
+2003-09-11 17:42 upi
+
+ * src/: Demo.cpp, State.h: Cleanup: Removed needless variables from
+ SState.
+
+2003-09-11 17:40 upi
+
+ * src/RlePack.cpp: Bugfix: Flipped characters no longer roll over
+ to the left of the screen by one pixel
+
+2003-09-07 16:08 upi
+
+ * data/script/: Backend.pl, Fighter.pl: Bugfix: Blocking with your
+ back turned no longer works.
+
+2003-09-07 16:03 upi
+
+ * src/: Game.cpp, GameOver.cpp, Makefile.in: Fixed several issues
+ related to menu invocation, game starting, game surrender in
+ various screens. They now all work alike.
+
+2003-09-06 22:21 upi
+
+ * data/script/Ulmar.pl: Ulmar: Fixed the "double lowpunch" bug.
+
+2003-09-06 21:50 upi
+
+ * src/: Backend.cpp, Backend.h, FighterEnum.h, FighterStats.cpp,
+ Game.cpp, GameOver.cpp, Makefile.am, PlayerSelect.cpp,
+ PlayerSelect.h, RlePack.cpp, RlePack.h, State.cpp, common.h,
+ main.cpp, menu.cpp: RlePack: Responsibilities cleaned up, updated
+ to new coding conventions. PlayerSelect: Now an object. Backend:
+ perl is no longer included in the main header. Eliminated the
+ direct use of perl in some files.
+
+2003-09-05 12:37 upi
+
+ * src/State.cpp: Fixed windows and linux ini file location bug.
+
+2003-09-01 22:40 upi
+
+ * mkinstalldirs, data/characters/Makefile.in, src/Audio.cpp,
+ src/FlyingChars.cpp, src/Game.cpp, src/PlayerSelect.cpp,
+ src/RlePack.cpp, src/State.h, src/gfx.cpp, src/main.cpp,
+ src/menu.cpp, src/sge_bm_text.cpp, src/sge_bm_text.h,
+ src/sge_primitives.cpp, src/sge_primitives.h, src/sge_surface.cpp,
+ src/sge_surface.h, src/sge_tt_text.cpp, src/sge_tt_text.h: Cleanup:
+ removed gcc-specific code, cleaned up includes, minor bugfixes
+
+2003-09-01 21:30 upi
+
+ * TODO, openmortal.lsm, README, aclocal.m4, configure,
+ configure.in, config.guess, install-sh, Makefile.am, config.sub,
+ missing, mkinstalldirs, AUTHORS, ChangeLog, INSTALL, Makefile.in,
+ acinclude.m4, config.h.in, stamp-h.in, COPYING,
+ src/sge_primitives.h, src/sge_tt_text.h, src/menu.cpp, src/Audio.h,
+ src/Demo.h, src/Game.h, src/RlePack.h, src/gfx.h,
+ src/sge_primitives.cpp, src/FlyingChars.h, src/sge_tt_text.cpp,
+ src/Backend.cpp, src/Demo.cpp, src/GameOver.cpp,
+ src/sge_bm_text.cpp, src/Backend.h, src/FighterStats.cpp,
+ src/main.cpp, src/sge_bm_text.h, src/State.cpp,
+ src/sge_surface.cpp, src/FlyingChars.cpp, src/Game.cpp,
+ src/Makefile.am, src/common.h, src/gfx.cpp, src/sge_internal.h,
+ src/Makefile.in, src/menu.h, src/sge_surface.h,
+ src/PlayerSelect.cpp, src/State.h, src/common.cpp,
+ src/sge_config.h, data/Makefile.am, data/Makefile.in,
+ data/fonts/Makefile.am, data/gfx/Makefile.am, data/gfx/Makefile.in,
+ src/Audio.cpp, src/RlePack.cpp, data/fonts/Makefile.in,
+ data/sound/Makefile.am, data/sound/Makefile.in,
+ data/characters/MACIDATA.DAT.pl, data/characters/BENCEDATA.DAT.pl,
+ data/characters/DESCANTDATA.DAT.pl, data/characters/Makefile.am,
+ data/characters/Makefile.in, data/characters/SIRPIDATA.DAT.pl,
+ data/characters/UPIDATA.DAT.pl, data/characters/ZOLIDATA.DAT.pl,
+ data/characters/GRIZLIDATA.DAT.pl, data/characters/CUMIDATA.DAT.pl,
+ data/characters/ULMARDATA.DAT.pl, data/script/Backend.pl,
+ data/script/Bence.pl, data/script/PlayerInput.pl,
+ data/script/QuickSave.pl, data/script/Sirpi.pl, data/script/UPi.pl,
+ data/script/Collision.pl, data/script/FighterStats.pl,
+ data/script/State.pl, data/script/Keys.pl, data/script/Cumi.pl,
+ data/script/Descant.pl, data/script/Doodad.pl,
+ data/script/Grizli.pl, data/script/Makefile.am,
+ data/script/Makefile.in, data/script/Ulmar.pl,
+ data/script/Damage.pl, data/script/Fighter.pl, data/script/Maci.pl,
+ data/script/Zoli.pl, data/script/DataHelper.pl,
+ data/script/Kolos.pl: release version 0.3, initial CVS version
+
+2003-09-01 21:30 upi
+
+ * TODO, openmortal.lsm, README, aclocal.m4, configure,
+ configure.in, config.guess, install-sh, Makefile.am, config.sub,
+ missing, mkinstalldirs, AUTHORS, ChangeLog, INSTALL, Makefile.in,
+ acinclude.m4, config.h.in, stamp-h.in, COPYING,
+ src/sge_primitives.h, src/sge_tt_text.h, src/menu.cpp, src/Audio.h,
+ src/Demo.h, src/Game.h, src/RlePack.h, src/gfx.h,
+ src/sge_primitives.cpp, src/FlyingChars.h, src/sge_tt_text.cpp,
+ src/Backend.cpp, src/Demo.cpp, src/GameOver.cpp,
+ src/sge_bm_text.cpp, src/Backend.h, src/FighterStats.cpp,
+ src/main.cpp, src/sge_bm_text.h, src/State.cpp,
+ src/sge_surface.cpp, src/FlyingChars.cpp, src/Game.cpp,
+ src/Makefile.am, src/common.h, src/gfx.cpp, src/sge_internal.h,
+ src/Makefile.in, src/menu.h, src/sge_surface.h,
+ src/PlayerSelect.cpp, src/State.h, src/common.cpp,
+ src/sge_config.h, data/Makefile.am, data/Makefile.in,
+ data/fonts/Makefile.am, data/gfx/Makefile.am, data/gfx/Makefile.in,
+ src/Audio.cpp, src/RlePack.cpp, data/fonts/Makefile.in,
+ data/sound/Makefile.am, data/sound/Makefile.in,
+ data/characters/MACIDATA.DAT.pl, data/characters/BENCEDATA.DAT.pl,
+ data/characters/DESCANTDATA.DAT.pl, data/characters/Makefile.am,
+ data/characters/Makefile.in, data/characters/SIRPIDATA.DAT.pl,
+ data/characters/UPIDATA.DAT.pl, data/characters/ZOLIDATA.DAT.pl,
+ data/characters/GRIZLIDATA.DAT.pl, data/characters/CUMIDATA.DAT.pl,
+ data/characters/ULMARDATA.DAT.pl, data/script/Backend.pl,
+ data/script/Bence.pl, data/script/PlayerInput.pl,
+ data/script/QuickSave.pl, data/script/Sirpi.pl, data/script/UPi.pl,
+ data/script/Collision.pl, data/script/FighterStats.pl,
+ data/script/State.pl, data/script/Keys.pl, data/script/Cumi.pl,
+ data/script/Descant.pl, data/script/Doodad.pl,
+ data/script/Grizli.pl, data/script/Makefile.am,
+ data/script/Makefile.in, data/script/Ulmar.pl,
+ data/script/Damage.pl, data/script/Fighter.pl, data/script/Maci.pl,
+ data/script/Zoli.pl, data/script/DataHelper.pl,
+ data/script/Kolos.pl: Initial revision
+
diff --git a/data/characters/UPIDATA.DAT.pl b/data/characters/UPIDATA.DAT.pl
index b4c0ce6..881d42f 100644
--- a/data/characters/UPIDATA.DAT.pl
+++ b/data/characters/UPIDATA.DAT.pl
@@ -1,340 +1,363 @@
-{ 'x'=>225, 'y'=> 53, 'w'=> 91, 'h'=>311, 'head'=>[250, 53,274, 53,274,103,250,103,], 'body'=>[236, 98,291, 98,291,236,236,236,], 'legs'=>[236,226,241,226,286,226,291,226,315,364,233,364,], 'ex'=>1 },
-{ 'x'=>220, 'y'=> 54, 'w'=>110, 'h'=>311, 'head'=>[255, 54,279, 54,279,104,255,104,], 'body'=>[236, 99,291, 99,291,237,236,237,], 'legs'=>[236,227,241,227,286,227,291,227,316,365,233,365,], 'ex'=>1 },
-{ 'x'=>214, 'y'=> 54, 'w'=>121, 'h'=>311, 'head'=>[255, 54,280, 54,280,104,255,104,], 'body'=>[233, 99,288, 99,288,237,233,237,], 'legs'=>[233,227,238,227,283,227,288,227,317,365,230,365,], 'ex'=>1 },
-{ 'x'=>180, 'y'=> 54, 'w'=>181, 'h'=>313, 'head'=>[253, 54,278, 54,278,104,253,104,], 'body'=>[232, 99,287, 99,287,238,232,238,], 'legs'=>[232,228,237,228,282,228,287,228,315,367,230,367,], 'ex'=>1 },
-{ 'x'=>171, 'y'=> 53, 'w'=>198, 'h'=>314, 'head'=>[256, 53,280, 53,280,103,256,103,], 'body'=>[232, 98,287, 98,287,237,232,237,], 'legs'=>[232,227,237,227,282,227,287,227,313,367,228,367,], 'ex'=>1 },
-{ 'x'=>167, 'y'=> 51, 'w'=>207, 'h'=>315, 'head'=>[249, 51,274, 51,274,101,249,101,], 'body'=>[236, 96,291, 96,291,236,236,236,], 'legs'=>[236,226,241,226,286,226,291,226,314,366,229,366,], 'ex'=>1 },
-{ 'x'=>164, 'y'=> 51, 'w'=>216, 'h'=>316, 'head'=>[257, 51,282, 51,282,101,257,101,], 'body'=>[234, 96,289, 96,289,236,234,236,], 'legs'=>[234,226,239,226,284,226,289,226,315,367,229,367,], 'ex'=>1 },
-{ 'x'=>167, 'y'=> 51, 'w'=>212, 'h'=>317, 'head'=>[250, 51,275, 51,275,101,250,101,], 'body'=>[224, 96,279, 96,279,237,224,237,], 'legs'=>[224,227,229,227,274,227,279,227,312,368,230,368,], 'ex'=>1 },
-{ 'x'=>227, 'y'=> 64, 'w'=> 86, 'h'=>312, 'head'=>[247, 64,273, 64,273,114,247,114,], 'body'=>[235,109,290,109,290,247,235,247,], 'legs'=>[235,237,240,237,285,237,290,237,312,376,229,376,], 'ex'=>1 },
-{ 'x'=>224, 'y'=> 64, 'w'=> 93, 'h'=>313, 'head'=>[244, 64,272, 64,272,114,244,114,], 'body'=>[232,109,287,109,287,248,232,248,], 'legs'=>[232,238,237,238,282,238,287,238,315,377,228,377,], 'ex'=>1 },
-{ 'x'=>221, 'y'=> 64, 'w'=> 94, 'h'=>313, 'head'=>[240, 64,269, 64,269,114,240,114,], 'body'=>[228,109,283,109,283,248,228,248,], 'legs'=>[228,238,233,238,278,238,283,238,314,377,228,377,], 'ex'=>1 },
-{ 'x'=>219, 'y'=> 66, 'w'=> 96, 'h'=>312, 'head'=>[238, 66,269, 66,269,116,238,116,], 'body'=>[226,111,281,111,281,249,226,249,], 'legs'=>[226,239,231,239,276,239,281,239,313,378,227,378,], 'ex'=>1 },
-{ 'x'=>219, 'y'=> 67, 'w'=>100, 'h'=>311, 'head'=>[239, 67,271, 67,271,117,239,117,], 'body'=>[226,112,281,112,281,250,226,250,], 'legs'=>[226,240,231,240,276,240,281,240,316,378,227,378,], 'ex'=>1 },
-{ 'x'=>221, 'y'=> 68, 'w'=>106, 'h'=>311, 'head'=>[240, 68,272, 68,272,118,240,118,], 'body'=>[227,113,282,113,282,251,227,251,], 'legs'=>[227,241,232,241,277,241,282,241,323,379,228,379,], 'ex'=>1 },
-{ 'x'=>223, 'y'=> 69, 'w'=>121, 'h'=>310, 'head'=>[243, 69,274, 69,274,119,243,119,], 'body'=>[229,114,284,114,284,251,229,251,], 'legs'=>[229,241,234,241,279,241,284,241,326,379,227,379,], 'ex'=>1 },
-{ 'x'=>228, 'y'=> 69, 'w'=>155, 'h'=>311, 'head'=>[247, 69,278, 69,278,119,247,119,], 'body'=>[233,114,288,114,288,252,233,252,], 'legs'=>[233,242,238,242,283,242,288,242,327,380,230,380,], 'ex'=>1 },
-{ 'x'=>229, 'y'=> 74, 'w'=>174, 'h'=>304, 'head'=>[260, 74,292, 74,292,124,260,124,], 'body'=>[244,119,299,119,299,253,244,253,], 'legs'=>[244,243,249,243,294,243,299,243,326,378,229,378,], 'ex'=>1 },
-{ 'x'=>206, 'y'=> 78, 'w'=>202, 'h'=>304, 'head'=>[264, 78,298, 78,298,128,264,128,], 'body'=>[238,123,293,123,293,257,238,257,], 'legs'=>[238,247,243,247,288,247,293,247,328,382,206,382,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 78, 'w'=>185, 'h'=>304, 'head'=>[244, 78,281, 78,281,128,244,128,], 'body'=>[222,123,277,123,277,257,222,257,], 'legs'=>[222,247,227,247,272,247,277,247,326,382,207,382,], 'ex'=>1 },
-{ 'x'=>207, 'y'=> 79, 'w'=>172, 'h'=>305, 'head'=>[246, 79,282, 79,282,129,246,129,], 'body'=>[225,124,280,124,280,259,225,259,], 'legs'=>[225,249,230,249,275,249,280,249,326,384,208,384,], 'ex'=>1 },
-{ 'x'=>207, 'y'=> 79, 'w'=>183, 'h'=>305, 'head'=>[260, 79,294, 79,294,129,260,129,], 'body'=>[235,124,290,124,290,259,235,259,], 'legs'=>[235,249,240,249,285,249,290,249,327,384,208,384,], 'ex'=>1 },
-{ 'x'=>208, 'y'=> 80, 'w'=>198, 'h'=>304, 'head'=>[266, 80,300, 80,300,130,266,130,], 'body'=>[243,125,298,125,298,259,243,259,], 'legs'=>[243,249,248,249,293,249,298,249,327,384,209,384,], 'ex'=>1 },
-{ 'x'=>208, 'y'=> 83, 'w'=>210, 'h'=>302, 'head'=>[268, 83,302, 83,302,133,268,133,], 'body'=>[244,128,299,128,299,261,244,261,], 'legs'=>[244,251,249,251,294,251,299,251,329,385,209,385,], 'ex'=>1 },
-{ 'x'=>216, 'y'=> 74, 'w'=>172, 'h'=>308, 'head'=>[243, 74,278, 74,278,124,243,124,], 'body'=>[222,119,277,119,277,255,222,255,], 'legs'=>[222,245,227,245,272,245,277,245,320,382,216,382,], 'ex'=>1 },
-{ 'x'=>216, 'y'=> 75, 'w'=>175, 'h'=>309, 'head'=>[244, 75,278, 75,278,125,244,125,], 'body'=>[223,120,278,120,278,257,223,257,], 'legs'=>[223,247,228,247,273,247,278,247,322,384,216,384,], 'ex'=>1 },
-{ 'x'=>214, 'y'=> 75, 'w'=>177, 'h'=>308, 'head'=>[253, 75,288, 75,288,125,253,125,], 'body'=>[232,120,287,120,287,256,232,256,], 'legs'=>[232,246,237,246,282,246,287,246,346,383,214,383,], 'ex'=>1 },
-{ 'x'=>214, 'y'=> 77, 'w'=>192, 'h'=>306, 'head'=>[273, 77,308, 77,308,127,273,127,], 'body'=>[253,122,308,122,308,257,253,257,], 'legs'=>[253,247,258,247,303,247,308,247,348,383,214,383,], 'ex'=>1 },
-{ 'x'=>228, 'y'=> 80, 'w'=>196, 'h'=>298, 'head'=>[295, 80,332, 80,332,130,295,130,], 'body'=>[275,125,330,125,330,256,275,256,], 'legs'=>[275,246,280,246,325,246,330,246,347,378,229,378,], 'ex'=>1 },
-{ 'x'=>252, 'y'=> 80, 'w'=>191, 'h'=>289, 'head'=>[304, 80,341, 80,341,130,304,130,], 'body'=>[283,125,338,125,338,252,283,252,], 'legs'=>[283,242,288,242,333,242,338,242,351,369,253,369,], 'ex'=>1 },
-{ 'x'=>280, 'y'=> 80, 'w'=>164, 'h'=>294, 'head'=>[311, 80,348, 80,348,130,311,130,], 'body'=>[291,125,346,125,346,254,291,254,], 'legs'=>[291,244,296,244,341,244,346,244,352,374,280,374,], 'ex'=>1 },
-{ 'x'=>303, 'y'=> 79, 'w'=>150, 'h'=>293, 'head'=>[326, 79,360, 79,360,129,326,129,], 'body'=>[305,124,360,124,360,253,305,253,], 'legs'=>[305,243,310,243,355,243,360,243,372,372,312,372,], 'ex'=>1 },
-{ 'x'=>312, 'y'=> 79, 'w'=>155, 'h'=>306, 'head'=>[337, 79,371, 79,371,129,337,129,], 'body'=>[319,124,374,124,374,259,319,259,], 'legs'=>[319,249,324,249,369,249,374,249,385,385,313,385,], 'ex'=>1 },
-{ 'x'=>322, 'y'=> 79, 'w'=>141, 'h'=>301, 'head'=>[345, 79,379, 79,379,129,345,129,], 'body'=>[326,124,381,124,381,257,326,257,], 'legs'=>[326,247,331,247,376,247,381,247,387,380,323,380,], 'ex'=>1 },
-{ 'x'=>335, 'y'=> 82, 'w'=>138, 'h'=>298, 'head'=>[358, 82,396, 82,396,132,358,132,], 'body'=>[338,127,393,127,393,258,338,258,], 'legs'=>[338,248,343,248,388,248,393,248,409,380,357,380,], 'ex'=>1 },
-{ 'x'=>342, 'y'=> 79, 'w'=>147, 'h'=>308, 'head'=>[367, 79,403, 79,403,129,367,129,], 'body'=>[345,124,400,124,400,260,345,260,], 'legs'=>[345,250,350,250,395,250,400,250,434,387,360,387,], 'ex'=>1 },
-{ 'x'=>357, 'y'=> 80, 'w'=>142, 'h'=>299, 'head'=>[382, 80,420, 80,420,130,382,130,], 'body'=>[360,125,415,125,415,257,360,257,], 'legs'=>[360,247,365,247,410,247,415,247,455,379,362,379,], 'ex'=>1 },
-{ 'x'=>356, 'y'=> 84, 'w'=>161, 'h'=>295, 'head'=>[395, 84,434, 84,434,134,395,134,], 'body'=>[374,129,429,129,429,259,374,259,], 'legs'=>[374,249,379,249,424,249,429,249,455,379,360,379,], 'ex'=>1 },
-{ 'x'=>206, 'y'=> 83, 'w'=>164, 'h'=>298, 'head'=>[238, 83,273, 83,273,133,238,133,], 'body'=>[218,128,273,128,273,259,218,259,], 'legs'=>[218,249,223,249,268,249,273,249,323,381,207,381,], 'ex'=>1 },
-{ 'x'=>204, 'y'=> 79, 'w'=>150, 'h'=>301, 'head'=>[236, 79,267, 79,267,129,236,129,], 'body'=>[217,124,272,124,272,257,217,257,], 'legs'=>[217,247,222,247,267,247,272,247,331,380,206,380,], 'ex'=>1 },
-{ 'x'=>200, 'y'=> 80, 'w'=>144, 'h'=>296, 'head'=>[237, 80,266, 80,266,130,237,130,], 'body'=>[218,125,273,125,273,255,218,255,], 'legs'=>[218,245,223,245,268,245,273,245,331,376,207,376,], 'ex'=>1 },
-{ 'x'=>202, 'y'=> 82, 'w'=>129, 'h'=>298, 'head'=>[243, 82,271, 82,271,132,243,132,], 'body'=>[225,127,280,127,280,258,225,258,], 'legs'=>[225,248,230,248,275,248,280,248,330,380,205,380,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 84, 'w'=>128, 'h'=>292, 'head'=>[250, 84,281, 84,281,134,250,134,], 'body'=>[231,129,286,129,286,257,231,257,], 'legs'=>[231,247,236,247,281,247,286,247,332,376,210,376,], 'ex'=>1 },
-{ 'x'=>199, 'y'=> 87, 'w'=>133, 'h'=>294, 'head'=>[255, 87,288, 87,288,137,255,137,], 'body'=>[238,132,293,132,293,261,238,261,], 'legs'=>[238,251,243,251,288,251,293,251,331,381,205,381,], 'ex'=>1 },
-{ 'x'=>176, 'y'=> 92, 'w'=>155, 'h'=>277, 'head'=>[254, 92,293, 92,293,142,254,142,], 'body'=>[241,137,296,137,296,258,241,258,], 'legs'=>[241,248,246,248,291,248,296,248,330,369,210,369,], 'ex'=>1 },
-{ 'x'=>164, 'y'=> 91, 'w'=>166, 'h'=>280, 'head'=>[245, 91,285, 91,285,141,245,141,], 'body'=>[234,136,289,136,289,258,234,258,], 'legs'=>[234,248,239,248,284,248,289,248,329,371,208,371,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 70, 'w'=>138, 'h'=>312, 'head'=>[235, 70,268, 70,268,120,235,120,], 'body'=>[219,115,274,115,274,253,219,253,], 'legs'=>[219,243,224,243,269,243,274,243,292,382,205,382,], 'ex'=>1 },
-{ 'x'=>199, 'y'=> 79, 'w'=>129, 'h'=>303, 'head'=>[220, 79,253, 79,253,129,220,129,], 'body'=>[210,124,265,124,265,258,210,258,], 'legs'=>[210,248,215,248,260,248,265,248,292,382,212,382,], 'ex'=>1 },
-{ 'x'=>183, 'y'=>101, 'w'=>129, 'h'=>277, 'head'=>[204,101,237,101,237,151,204,151,], 'body'=>[192,146,247,146,247,267,192,267,], 'legs'=>[192,257,197,257,242,257,247,257,293,378,249,378,], 'ex'=>1 },
-{ 'x'=>175, 'y'=>122, 'w'=>131, 'h'=>259, 'head'=>[195,122,227,122,227,172,195,172,], 'body'=>[183,167,238,167,238,279,183,279,], 'legs'=>[183,269,188,269,233,269,238,269,294,381,250,381,], 'ex'=>1 },
-{ 'x'=>163, 'y'=>147, 'w'=>132, 'h'=>233, 'head'=>[182,147,213,147,213,197,182,197,], 'body'=>[167,192,222,192,222,291,167,291,], 'legs'=>[167,281,172,281,217,281,222,281,293,380,245,380,], 'ex'=>1 },
-{ 'x'=>145, 'y'=>174, 'w'=>149, 'h'=>204, 'head'=>[157,174,190,174,190,224,157,224,], 'body'=>[151,219,206,219,206,303,151,303,], 'legs'=>[151,293,156,293,201,293,206,293,293,378,172,378,], 'ex'=>1 },
-{ 'x'=>116, 'y'=>211, 'w'=>177, 'h'=>171, 'head'=>[130,211,167,211,167,261,130,261,], 'body'=>[123,256,178,256,178,324,123,324,], 'legs'=>[123,314,128,314,173,314,178,314,291,382,146,382,], 'ex'=>1 },
-{ 'x'=> 89, 'y'=>243, 'w'=>207, 'h'=>137, 'head'=>[ 93,243,125,243,125,293, 93,293,], 'body'=>[ 93,288,148,288,148,339, 93,339,], 'legs'=>[ 93,329, 98,329,143,329,148,329,291,380,119,380,], 'ex'=>1 },
-{ 'x'=> 50, 'y'=>263, 'w'=>240, 'h'=>129, 'head'=>[ 69,263,106,263,106,313, 69,313,], 'body'=>[100,308,155,308,155,355,100,355,], 'legs'=>[100,345,105,345,150,345,155,345,182,392, 81,392,], 'ex'=>1 },
-{ 'x'=> 21, 'y'=>281, 'w'=>253, 'h'=>112, 'head'=>[153,281,245,281,245,331,153,331,], 'body'=>[ 46,326,101,326,101,364, 46,364,], 'legs'=>[ 46,354, 51,354, 96,354,101,354,176,393, 57,393,], 'ex'=>1 },
-{ 'x'=> 9, 'y'=>238, 'w'=>230, 'h'=>150, 'head'=>[173,238,226,238,226,288,173,288,], 'body'=>[115,283,170,283,170,340,115,340,], 'legs'=>[115,330,120,330,165,330,170,330,173,388, 44,388,], 'ex'=>1 },
-{ 'x'=> 5, 'y'=>190, 'w'=>164, 'h'=>195, 'head'=>[ 46,190, 84,190, 84,240, 46,240,], 'body'=>[ 66,235,121,235,121,315, 66,315,], 'legs'=>[ 66,305, 71,305,116,305,121,305,167,385, 5,385,], 'ex'=>1 },
-{ 'x'=> 5, 'y'=>182, 'w'=>165, 'h'=>202, 'head'=>[ 62,182, 95,182, 95,232, 62,232,], 'body'=>[ 72,227,127,227,127,310, 72,310,], 'legs'=>[ 72,300, 77,300,122,300,127,300,167,384, 5,384,], 'ex'=>1 },
-{ 'x'=> 6, 'y'=>173, 'w'=>166, 'h'=>212, 'head'=>[121,173,149,173,149,223,121,223,], 'body'=>[108,218,163,218,163,306,108,306,], 'legs'=>[108,296,113,296,158,296,163,296,169,385, 6,385,], 'ex'=>1 },
-{ 'x'=> 7, 'y'=>183, 'w'=>194, 'h'=>201, 'head'=>[155,183,184,183,184,233,155,233,], 'body'=>[129,228,184,228,184,311,129,311,], 'legs'=>[129,301,134,301,179,301,184,301,170,384, 7,384,], 'ex'=>1 },
-{ 'x'=> 10, 'y'=>225, 'w'=>254, 'h'=>160, 'head'=>[218,225,248,225,248,275,218,275,], 'body'=>[144,270,199,270,199,332,144,332,], 'legs'=>[144,322,149,322,194,322,199,322,180,385, 12,385,], 'ex'=>1 },
-{ 'x'=> 12, 'y'=>261, 'w'=>276, 'h'=>124, 'head'=>[227,261,276,261,276,311,227,311,], 'body'=>[ 78,306,133,306,133,350, 78,350,], 'legs'=>[ 78,340, 83,340,128,340,133,340,172,385, 26,385,], 'ex'=>1 },
-{ 'x'=> 15, 'y'=>306, 'w'=>287, 'h'=> 79, 'head'=>[ 52,306,215,306,215,356, 52,356,], 'body'=>[ 30,351, 85,351, 85,373, 30,373,], 'legs'=>[ 30,363, 35,363, 80,363, 85,363,172,385, 85,385,], 'ex'=>1 },
-{ 'x'=> 20, 'y'=>298, 'w'=>282, 'h'=> 90, 'head'=>[ 26,298,148,298,148,348, 26,348,], 'body'=>[ 52,343,107,343,107,370, 52,370,], 'legs'=>[ 52,360, 57,360,102,360,107,360,169,388, 72,388,], 'ex'=>1 },
-{ 'x'=> 27, 'y'=>284, 'w'=>274, 'h'=>105, 'head'=>[ 32,284, 93,284, 93,334, 32,334,], 'body'=>[ 55,329,110,329,110,364, 55,364,], 'legs'=>[ 55,354, 60,354,105,354,110,354,167,389, 72,389,], 'ex'=>1 },
-{ 'x'=> 52, 'y'=>251, 'w'=>248, 'h'=>137, 'head'=>[ 55,251, 91,251, 91,301, 55,301,], 'body'=>[ 74,296,129,296,129,347, 74,347,], 'legs'=>[ 74,337, 79,337,124,337,129,337,266,388, 83,388,], 'ex'=>1 },
-{ 'x'=> 80, 'y'=>237, 'w'=>208, 'h'=>152, 'head'=>[ 91,237,127,237,127,287, 91,287,], 'body'=>[ 95,282,150,282,150,340, 95,340,], 'legs'=>[ 95,330,100,330,145,330,150,330,188,389, 96,389,], 'ex'=>1 },
-{ 'x'=> 88, 'y'=>231, 'w'=>187, 'h'=>154, 'head'=>[111,231,149,231,149,281,111,281,], 'body'=>[113,276,168,276,168,335,113,335,], 'legs'=>[113,325,118,325,163,325,168,325,194,385,100,385,], 'ex'=>1 },
-{ 'x'=>107, 'y'=>225, 'w'=>141, 'h'=>161, 'head'=>[130,225,169,225,169,275,130,275,], 'body'=>[109,270,164,270,164,333,109,333,], 'legs'=>[109,323,114,323,159,323,164,323,183,386,113,386,], 'ex'=>1 },
-{ 'x'=>118, 'y'=>224, 'w'=>113, 'h'=>162, 'head'=>[149,224,189,224,189,274,149,274,], 'body'=>[121,269,176,269,176,332,121,332,], 'legs'=>[121,322,126,322,171,322,176,322,229,386,120,386,], 'ex'=>1 },
-{ 'x'=>125, 'y'=>230, 'w'=>107, 'h'=>156, 'head'=>[176,230,223,230,223,280,176,280,], 'body'=>[133,275,188,275,188,335,133,335,], 'legs'=>[133,325,138,325,183,325,188,325,228,386,125,386,], 'ex'=>1 },
-{ 'x'=>136, 'y'=>226, 'w'=>124, 'h'=>156, 'head'=>[192,226,248,226,248,276,192,276,], 'body'=>[142,271,197,271,197,331,142,331,], 'legs'=>[142,321,147,321,192,321,197,321,231,382,137,382,], 'ex'=>1 },
-{ 'x'=>137, 'y'=>196, 'w'=>129, 'h'=>177, 'head'=>[201,196,252,196,252,246,201,246,], 'body'=>[144,241,199,241,199,312,144,312,], 'legs'=>[144,302,149,302,194,302,199,302,239,373,191,373,], 'ex'=>1 },
-{ 'x'=>136, 'y'=>178, 'w'=>142, 'h'=>195, 'head'=>[205,178,254,178,254,228,205,228,], 'body'=>[144,223,199,223,199,303,144,303,], 'legs'=>[144,293,149,293,194,293,199,293,276,373,193,373,], 'ex'=>1 },
-{ 'x'=>131, 'y'=>135, 'w'=>171, 'h'=>240, 'head'=>[208,135,248,135,248,185,208,185,], 'body'=>[163,180,218,180,218,282,163,282,], 'legs'=>[163,272,168,272,213,272,218,272,230,375,157,375,], 'ex'=>1 },
-{ 'x'=>129, 'y'=>116, 'w'=>175, 'h'=>258, 'head'=>[203,116,240,116,240,166,203,166,], 'body'=>[155,161,210,161,210,272,155,272,], 'legs'=>[155,262,160,262,205,262,210,262,231,374,129,374,], 'ex'=>1 },
-{ 'x'=>107, 'y'=> 92, 'w'=>193, 'h'=>297, 'head'=>[188, 92,224, 92,224,142,188,142,], 'body'=>[146,137,201,137,201,268,146,268,], 'legs'=>[146,258,151,258,196,258,201,258,231,389,107,389,], 'ex'=>1 },
-{ 'x'=>105, 'y'=> 84, 'w'=>172, 'h'=>308, 'head'=>[166, 84,202, 84,202,134,166,134,], 'body'=>[134,129,189,129,189,265,134,265,], 'legs'=>[134,255,139,255,184,255,189,255,231,392,106,392,], 'ex'=>1 },
-{ 'x'=>104, 'y'=> 78, 'w'=>159, 'h'=>306, 'head'=>[148, 78,183, 78,183,128,148,128,], 'body'=>[124,123,179,123,179,258,124,258,], 'legs'=>[124,248,129,248,174,248,179,248,229,384,105,384,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 71, 'w'=>142, 'h'=>311, 'head'=>[244, 71,276, 71,276,121,244,121,], 'body'=>[230,116,285,116,285,254,230,254,], 'legs'=>[230,244,235,244,280,244,285,244,316,382,205,382,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 72, 'w'=>126, 'h'=>305, 'head'=>[252, 72,292, 72,292,122,252,122,], 'body'=>[234,117,289,117,289,252,234,252,], 'legs'=>[234,242,239,242,284,242,289,242,314,377,206,377,], 'ex'=>1 },
-{ 'x'=>208, 'y'=> 74, 'w'=>109, 'h'=>304, 'head'=>[266, 74,296, 74,296,124,266,124,], 'body'=>[239,119,294,119,294,253,239,253,], 'legs'=>[239,243,244,243,289,243,294,243,313,378,209,378,], 'ex'=>1 },
-{ 'x'=>210, 'y'=> 79, 'w'=>105, 'h'=>290, 'head'=>[268, 79,298, 79,298,129,268,129,], 'body'=>[236,124,291,124,291,251,236,251,], 'legs'=>[236,241,241,241,286,241,291,241,312,369,210,369,], 'ex'=>1 },
-{ 'x'=>207, 'y'=> 84, 'w'=>108, 'h'=>285, 'head'=>[264, 84,299, 84,299,134,264,134,], 'body'=>[233,129,288,129,288,254,233,254,], 'legs'=>[233,244,238,244,283,244,288,244,312,369,208,369,], 'ex'=>1 },
-{ 'x'=>206, 'y'=> 84, 'w'=>105, 'h'=>282, 'head'=>[251, 84,285, 84,285,134,251,134,], 'body'=>[222,129,277,129,277,252,222,252,], 'legs'=>[222,242,227,242,272,242,277,242,309,366,207,366,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 78, 'w'=>100, 'h'=>288, 'head'=>[233, 78,262, 78,262,128,233,128,], 'body'=>[213,123,268,123,268,249,213,249,], 'legs'=>[213,239,218,239,263,239,268,239,304,366,207,366,], 'ex'=>1 },
-{ 'x'=>200, 'y'=> 79, 'w'=>113, 'h'=>290, 'head'=>[222, 79,252, 79,252,129,222,129,], 'body'=>[209,124,264,124,264,251,209,251,], 'legs'=>[209,241,214,241,259,241,264,241,311,369,203,369,], 'ex'=>1 },
-{ 'x'=>197, 'y'=> 79, 'w'=>113, 'h'=>289, 'head'=>[207, 79,238, 79,238,129,207,129,], 'body'=>[206,124,261,124,261,251,206,251,], 'legs'=>[206,241,211,241,256,241,261,241,308,368,204,368,], 'ex'=>1 },
-{ 'x'=>197, 'y'=> 80, 'w'=>113, 'h'=>285, 'head'=>[207, 80,238, 80,238,130,207,130,], 'body'=>[205,125,260,125,260,250,205,250,], 'legs'=>[205,240,210,240,255,240,260,240,308,365,203,365,], 'ex'=>1 },
-{ 'x'=>200, 'y'=> 81, 'w'=>109, 'h'=>289, 'head'=>[209, 81,240, 81,240,131,209,131,], 'body'=>[208,126,263,126,263,253,208,253,], 'legs'=>[208,243,213,243,258,243,263,243,306,370,203,370,], 'ex'=>1 },
-{ 'x'=>188, 'y'=> 71, 'w'=>178, 'h'=>307, 'head'=>[222, 71,255, 71,255,121,222,121,], 'body'=>[208,116,263,116,263,252,208,252,], 'legs'=>[208,242,213,242,258,242,263,242,293,378,188,378,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 79, 'w'=>186, 'h'=>302, 'head'=>[234, 79,268, 79,268,129,234,129,], 'body'=>[220,124,275,124,275,257,220,257,], 'legs'=>[220,247,225,247,270,247,275,247,316,381,205,381,], 'ex'=>1 },
-{ 'x'=>195, 'y'=> 88, 'w'=>179, 'h'=>297, 'head'=>[225, 88,258, 88,258,138,225,138,], 'body'=>[214,133,269,133,269,264,214,264,], 'legs'=>[214,254,219,254,264,254,269,254,315,385,195,385,], 'ex'=>1 },
-{ 'x'=>187, 'y'=>106, 'w'=>166, 'h'=>283, 'head'=>[214,106,247,106,247,156,214,156,], 'body'=>[205,151,260,151,260,275,205,275,], 'legs'=>[205,265,210,265,255,265,260,265,318,389,193,389,], 'ex'=>1 },
-{ 'x'=>178, 'y'=>127, 'w'=>144, 'h'=>262, 'head'=>[204,127,238,127,238,177,204,177,], 'body'=>[207,172,262,172,262,285,207,285,], 'legs'=>[207,275,212,275,257,275,262,275,319,389,187,389,], 'ex'=>1 },
-{ 'x'=>165, 'y'=>145, 'w'=>156, 'h'=>243, 'head'=>[195,145,228,145,228,195,195,195,], 'body'=>[200,190,255,190,255,294,200,294,], 'legs'=>[200,284,205,284,250,284,255,284,320,388,186,388,], 'ex'=>1 },
-{ 'x'=>167, 'y'=>162, 'w'=>154, 'h'=>226, 'head'=>[185,162,228,162,228,212,185,212,], 'body'=>[201,207,256,207,256,302,201,302,], 'legs'=>[201,292,206,292,251,292,256,292,319,388,184,388,], 'ex'=>1 },
-{ 'x'=>210, 'y'=> 71, 'w'=>156, 'h'=>311, 'head'=>[245, 71,277, 71,277,121,245,121,], 'body'=>[231,116,286,116,286,254,231,254,], 'legs'=>[231,244,236,244,281,244,286,244,312,382,210,382,], 'ex'=>1 },
-{ 'x'=>210, 'y'=> 69, 'w'=>127, 'h'=>312, 'head'=>[242, 69,272, 69,272,119,242,119,], 'body'=>[231,114,286,114,286,252,231,252,], 'legs'=>[231,242,236,242,281,242,286,242,315,381,211,381,], 'ex'=>1 },
-{ 'x'=>212, 'y'=> 68, 'w'=>105, 'h'=>311, 'head'=>[240, 68,269, 68,269,118,240,118,], 'body'=>[226,113,281,113,281,251,226,251,], 'legs'=>[226,241,231,241,276,241,281,241,315,379,215,379,], 'ex'=>1 },
-{ 'x'=>206, 'y'=> 68, 'w'=>109, 'h'=>316, 'head'=>[231, 68,257, 68,257,118,231,118,], 'body'=>[214,113,269,113,269,253,214,253,], 'legs'=>[214,243,219,243,264,243,269,243,312,384,211,384,], 'ex'=>1 },
-{ 'x'=>197, 'y'=> 64, 'w'=>111, 'h'=>315, 'head'=>[222, 64,249, 64,249,114,222,114,], 'body'=>[207,109,262,109,262,249,207,249,], 'legs'=>[207,239,212,239,257,239,262,239,306,379,204,379,], 'ex'=>1 },
-{ 'x'=>191, 'y'=> 65, 'w'=> 91, 'h'=>313, 'head'=>[218, 65,246, 65,246,115,218,115,], 'body'=>[204,110,259,110,259,249,204,249,], 'legs'=>[204,239,209,239,254,239,259,239,274,378,205,378,], 'ex'=>1 },
-{ 'x'=>180, 'y'=> 67, 'w'=>113, 'h'=>310, 'head'=>[218, 67,246, 67,246,117,218,117,], 'body'=>[199,112,254,112,254,249,199,249,], 'legs'=>[199,239,204,239,249,239,254,239,271,377,204,377,], 'ex'=>1 },
-{ 'x'=>177, 'y'=> 72, 'w'=>121, 'h'=>309, 'head'=>[218, 72,244, 72,244,122,218,122,], 'body'=>[195,117,250,117,250,254,195,254,], 'legs'=>[195,244,200,244,245,244,250,244,273,381,203,381,], 'ex'=>1 },
-{ 'x'=>187, 'y'=> 71, 'w'=>110, 'h'=>303, 'head'=>[212, 71,237, 71,237,121,212,121,], 'body'=>[198,116,253,116,253,250,198,250,], 'legs'=>[198,240,203,240,248,240,253,240,272,374,193,374,], 'ex'=>1 },
-{ 'x'=>159, 'y'=> 69, 'w'=>123, 'h'=>304, 'head'=>[202, 69,227, 69,227,119,202,119,], 'body'=>[196,114,251,114,251,248,196,248,], 'legs'=>[196,238,201,238,246,238,251,238,269,373,160,373,], 'ex'=>1 },
-{ 'x'=>133, 'y'=> 68, 'w'=>138, 'h'=>304, 'head'=>[192, 68,218, 68,218,118,192,118,], 'body'=>[189,113,244,113,244,247,189,247,], 'legs'=>[189,237,194,237,239,237,244,237,268,372,134,372,], 'ex'=>1 },
-{ 'x'=>119, 'y'=> 73, 'w'=>151, 'h'=>302, 'head'=>[183, 73,209, 73,209,123,183,123,], 'body'=>[178,118,233,118,233,251,178,251,], 'legs'=>[178,241,183,241,228,241,233,241,268,375,120,375,], 'ex'=>1 },
-{ 'x'=>116, 'y'=> 74, 'w'=>153, 'h'=>306, 'head'=>[166, 74,192, 74,192,124,166,124,], 'body'=>[167,119,222,119,222,254,167,254,], 'legs'=>[167,244,172,244,217,244,222,244,266,380,117,380,], 'ex'=>1 },
-{ 'x'=>116, 'y'=> 72, 'w'=>156, 'h'=>307, 'head'=>[156, 72,183, 72,183,122,156,122,], 'body'=>[152,117,207,117,207,253,152,253,], 'legs'=>[152,243,157,243,202,243,207,243,270,379,117,379,], 'ex'=>1 },
-{ 'x'=>116, 'y'=> 69, 'w'=>152, 'h'=>310, 'head'=>[144, 69,171, 69,171,119,144,119,], 'body'=>[137,114,192,114,192,251,137,251,], 'legs'=>[137,241,142,241,187,241,192,241,267,379,118,379,], 'ex'=>1 },
-{ 'x'=>116, 'y'=> 65, 'w'=>131, 'h'=>314, 'head'=>[138, 65,166, 65,166,115,138,115,], 'body'=>[130,110,185,110,185,249,130,249,], 'legs'=>[130,239,135,239,180,239,185,239,245,379,117,379,], 'ex'=>1 },
-{ 'x'=>113, 'y'=> 58, 'w'=> 94, 'h'=>312, 'head'=>[135, 58,162, 58,162,108,135,108,], 'body'=>[123,103,178,103,178,241,123,241,], 'legs'=>[123,231,128,231,173,231,178,231,192,370,122,370,], 'ex'=>1 },
-{ 'x'=>114, 'y'=> 62, 'w'=>123, 'h'=>317, 'head'=>[139, 62,167, 62,167,112,139,112,], 'body'=>[123,107,178,107,178,248,123,248,], 'legs'=>[123,238,128,238,173,238,178,238,182,379,117,379,], 'ex'=>1 },
-{ 'x'=>106, 'y'=> 56, 'w'=>117, 'h'=>319, 'head'=>[136, 56,163, 56,163,106,136,106,], 'body'=>[116,101,171,101,171,243,116,243,], 'legs'=>[116,233,121,233,166,233,171,233,183,375,110,375,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 67, 'w'=>155, 'h'=>315, 'head'=>[258, 67,286, 67,286,117,258,117,], 'body'=>[241,112,296,112,296,252,241,252,], 'legs'=>[241,242,246,242,291,242,296,242,312,382,206,382,], 'ex'=>1 },
-{ 'x'=>198, 'y'=> 78, 'w'=>134, 'h'=>298, 'head'=>[255, 78,296, 78,296,128,255,128,], 'body'=>[238,123,293,123,293,254,238,254,], 'legs'=>[238,244,243,244,288,244,293,244,319,376,199,376,], 'ex'=>1 },
-{ 'x'=>190, 'y'=> 98, 'w'=>134, 'h'=>284, 'head'=>[224, 98,272, 98,272,148,224,148,], 'body'=>[226,143,281,143,281,267,226,267,], 'legs'=>[226,257,231,257,276,257,281,257,321,382,191,382,], 'ex'=>1 },
-{ 'x'=>186, 'y'=>111, 'w'=>133, 'h'=>271, 'head'=>[193,111,256,111,256,161,193,161,], 'body'=>[214,156,269,156,269,274,214,274,], 'legs'=>[214,264,219,264,264,264,269,264,317,382,191,382,], 'ex'=>1 },
-{ 'x'=>176, 'y'=>122, 'w'=>138, 'h'=>259, 'head'=>[181,122,252,122,252,172,181,172,], 'body'=>[211,167,266,167,266,279,211,279,], 'legs'=>[211,269,216,269,261,269,266,269,312,381,190,381,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 75, 'w'=>185, 'h'=>307, 'head'=>[245, 75,278, 75,278,125,245,125,], 'body'=>[224,120,279,120,279,256,224,256,], 'legs'=>[224,246,229,246,274,246,279,246,305,382,205,382,], 'ex'=>1 },
-{ 'x'=>208, 'y'=>109, 'w'=>178, 'h'=>271, 'head'=>[248,109,283,109,283,159,248,159,], 'body'=>[223,154,278,154,278,272,223,272,], 'legs'=>[223,262,228,262,273,262,278,262,310,380,208,380,], 'ex'=>1 },
-{ 'x'=>201, 'y'=>139, 'w'=>184, 'h'=>248, 'head'=>[246,139,284,139,284,189,246,189,], 'body'=>[219,184,274,184,274,290,219,290,], 'legs'=>[219,280,224,280,269,280,274,280,307,387,203,387,], 'ex'=>1 },
-{ 'x'=>198, 'y'=>185, 'w'=>181, 'h'=>204, 'head'=>[238,185,276,185,276,235,238,235,], 'body'=>[218,230,273,230,273,314,218,314,], 'legs'=>[218,304,223,304,268,304,273,304,303,389,199,389,], 'ex'=>1 },
-{ 'x'=>193, 'y'=>211, 'w'=>181, 'h'=>178, 'head'=>[233,211,270,211,270,261,233,261,], 'body'=>[212,256,267,256,267,327,212,327,], 'legs'=>[212,317,217,317,262,317,267,317,298,389,194,389,], 'ex'=>1 },
-{ 'x'=>192, 'y'=>206, 'w'=>183, 'h'=>184, 'head'=>[232,206,266,206,266,256,232,256,], 'body'=>[208,251,263,251,263,325,208,325,], 'legs'=>[208,315,213,315,258,315,263,315,295,390,193,390,], 'ex'=>1 },
-{ 'x'=>192, 'y'=>206, 'w'=>181, 'h'=>186, 'head'=>[232,206,267,206,267,256,232,256,], 'body'=>[206,251,261,251,261,326,206,326,], 'legs'=>[206,316,211,316,256,316,261,316,296,392,192,392,], 'ex'=>1 },
-{ 'x'=>191, 'y'=>209, 'w'=>186, 'h'=>186, 'head'=>[231,209,267,209,267,259,231,259,], 'body'=>[205,254,260,254,260,329,205,329,], 'legs'=>[205,319,210,319,255,319,260,319,297,395,192,395,], 'ex'=>1 },
-{ 'x'=>192, 'y'=>214, 'w'=>155, 'h'=>173, 'head'=>[223,214,259,214,259,264,223,264,], 'body'=>[199,259,254,259,254,328,199,328,], 'legs'=>[199,318,204,318,249,318,254,318,294,387,196,387,], 'ex'=>1 },
-{ 'x'=>177, 'y'=>216, 'w'=>189, 'h'=>171, 'head'=>[221,216,263,216,263,266,221,266,], 'body'=>[195,261,250,261,250,329,195,329,], 'legs'=>[195,319,200,319,245,319,250,319,294,387,196,387,], 'ex'=>1 },
-{ 'x'=>168, 'y'=>222, 'w'=>213, 'h'=>165, 'head'=>[203,222,270,222,270,272,203,272,], 'body'=>[206,267,261,267,261,332,206,332,], 'legs'=>[206,322,211,322,256,322,261,322,294,387,196,387,], 'ex'=>1 },
-{ 'x'=>184, 'y'=>221, 'w'=>205, 'h'=>166, 'head'=>[192,221,241,221,241,271,192,271,], 'body'=>[209,266,264,266,264,331,209,331,], 'legs'=>[209,321,214,321,259,321,264,321,293,387,195,387,], 'ex'=>1 },
-{ 'x'=>188, 'y'=>224, 'w'=>200, 'h'=>163, 'head'=>[195,224,244,224,244,274,195,274,], 'body'=>[211,269,266,269,266,333,211,333,], 'legs'=>[211,323,216,323,261,323,266,323,294,387,196,387,], 'ex'=>0, 'hit'=>[287,279,390,313,380,334,273,312,] },
-{ 'x'=>179, 'y'=>222, 'w'=>168, 'h'=>166, 'head'=>[218,222,254,222,254,272,218,272,], 'body'=>[186,267,241,267,241,332,186,332,], 'legs'=>[186,322,191,322,236,322,241,322,298,388,198,388,], 'ex'=>1 },
-{ 'x'=>153, 'y'=>217, 'w'=>191, 'h'=>171, 'head'=>[199,217,235,217,235,267,199,267,], 'body'=>[164,262,219,262,219,330,164,330,], 'legs'=>[164,320,169,320,214,320,219,320,297,388,197,388,], 'ex'=>1 },
-{ 'x'=>133, 'y'=>222, 'w'=>203, 'h'=>166, 'head'=>[182,222,227,222,227,272,182,272,], 'body'=>[142,267,197,267,197,332,142,332,], 'legs'=>[142,322,147,322,192,322,197,322,316,388,195,388,], 'ex'=>1 },
-{ 'x'=>133, 'y'=>225, 'w'=>223, 'h'=>163, 'head'=>[179,225,228,225,228,275,179,275,], 'body'=>[147,270,202,270,202,334,147,334,], 'legs'=>[147,324,152,324,197,324,202,324,308,388,196,388,], 'ex'=>1 },
-{ 'x'=>115, 'y'=>236, 'w'=>258, 'h'=>152, 'head'=>[186,235,232,236,232,286,192,279,], 'body'=>[180,280,235,280,268,339,183,364,], 'legs'=>[174,323,184,321,260,310,355,353,372,394,196,389,], 'ex'=>0, 'hit'=>[240,310,370,369,359,390,198,382,] },
-{ 'x'=>205, 'y'=> 75, 'w'=>160, 'h'=>300, 'head'=>[245, 75,277, 75,277,125,245,125,], 'body'=>[225,120,280,120,280,252,225,252,], 'legs'=>[225,242,230,242,275,242,280,242,315,375,205,375,], 'ex'=>1 },
-{ 'x'=>204, 'y'=> 73, 'w'=>130, 'h'=>305, 'head'=>[247, 73,277, 73,277,123,247,123,], 'body'=>[226,118,281,118,281,253,226,253,], 'legs'=>[226,243,231,243,276,243,281,243,315,378,206,378,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 72, 'w'=>115, 'h'=>302, 'head'=>[247, 72,281, 72,281,122,247,122,], 'body'=>[224,117,279,117,279,250,224,250,], 'legs'=>[224,240,229,240,274,240,279,240,317,374,205,374,], 'ex'=>1 },
-{ 'x'=>193, 'y'=> 72, 'w'=>126, 'h'=>302, 'head'=>[233, 72,275, 72,275,122,233,122,], 'body'=>[221,117,276,117,276,250,221,250,], 'legs'=>[221,240,226,240,271,240,276,240,316,374,205,374,], 'ex'=>1 },
-{ 'x'=>193, 'y'=> 74, 'w'=>128, 'h'=>304, 'head'=>[221, 74,274, 74,274,124,221,124,], 'body'=>[220,119,275,119,275,253,220,253,], 'legs'=>[220,243,225,243,270,243,275,243,318,378,204,378,], 'ex'=>1 },
-{ 'x'=>210, 'y'=> 75, 'w'=>175, 'h'=>306, 'head'=>[241, 75,272, 75,272,125,241,125,], 'body'=>[229,120,284,120,284,255,229,255,], 'legs'=>[229,245,234,245,279,245,284,245,320,381,212,381,], 'ex'=>1 },
-{ 'x'=>211, 'y'=> 75, 'w'=>176, 'h'=>304, 'head'=>[239, 75,268, 75,268,125,239,125,], 'body'=>[229,120,284,120,284,254,229,254,], 'legs'=>[229,244,234,244,279,244,284,244,317,379,211,379,], 'ex'=>1 },
-{ 'x'=>207, 'y'=> 75, 'w'=>174, 'h'=>306, 'head'=>[239, 75,268, 75,268,125,239,125,], 'body'=>[230,120,285,120,285,255,230,255,], 'legs'=>[230,245,235,245,280,245,285,245,319,381,209,381,], 'ex'=>1 },
-{ 'x'=>201, 'y'=> 77, 'w'=>169, 'h'=>305, 'head'=>[242, 77,275, 77,275,127,242,127,], 'body'=>[227,122,282,122,282,257,227,257,], 'legs'=>[227,247,232,247,277,247,282,247,316,382,202,382,], 'ex'=>1 },
-{ 'x'=>202, 'y'=> 71, 'w'=>147, 'h'=>311, 'head'=>[249, 71,284, 71,284,121,249,121,], 'body'=>[228,116,283,116,283,254,228,254,], 'legs'=>[228,244,233,244,278,244,283,244,315,382,203,382,], 'ex'=>1 },
-{ 'x'=>202, 'y'=> 70, 'w'=>130, 'h'=>314, 'head'=>[255, 70,291, 70,291,120,255,120,], 'body'=>[230,115,285,115,285,254,230,254,], 'legs'=>[230,244,235,244,280,244,285,244,315,384,202,384,], 'ex'=>1 },
-{ 'x'=>201, 'y'=> 71, 'w'=>121, 'h'=>312, 'head'=>[260, 71,296, 71,296,121,260,121,], 'body'=>[231,116,286,116,286,254,231,254,], 'legs'=>[231,244,236,244,281,244,286,244,315,383,203,383,], 'ex'=>1 },
-{ 'x'=>202, 'y'=> 73, 'w'=>121, 'h'=>310, 'head'=>[268, 73,305, 73,305,123,268,123,], 'body'=>[231,118,286,118,286,255,231,255,], 'legs'=>[231,245,236,245,281,245,286,245,317,383,203,383,], 'ex'=>1 },
-{ 'x'=>202, 'y'=> 77, 'w'=>125, 'h'=>306, 'head'=>[277, 77,314, 77,314,127,277,127,], 'body'=>[232,122,287,122,287,257,232,257,], 'legs'=>[232,247,237,247,282,247,287,247,317,383,203,383,], 'ex'=>1 },
-{ 'x'=>199, 'y'=> 75, 'w'=>155, 'h'=>306, 'head'=>[247, 75,279, 75,279,125,247,125,], 'body'=>[227,120,282,120,282,255,227,255,], 'legs'=>[227,245,232,245,277,245,282,245,338,381,199,381,], 'ex'=>1 },
-{ 'x'=>199, 'y'=> 75, 'w'=>189, 'h'=>307, 'head'=>[260, 75,291, 75,291,125,260,125,], 'body'=>[234,120,289,120,289,256,234,256,], 'legs'=>[234,246,239,246,284,246,289,246,336,382,200,382,], 'ex'=>1 },
-{ 'x'=>199, 'y'=> 79, 'w'=>216, 'h'=>303, 'head'=>[278, 79,322, 79,322,129,278,129,], 'body'=>[242,124,297,124,297,258,242,258,], 'legs'=>[242,248,247,248,292,248,297,248,333,382,200,382,], 'ex'=>1 },
-{ 'x'=>199, 'y'=> 86, 'w'=>230, 'h'=>295, 'head'=>[302, 86,356, 86,356,136,302,136,], 'body'=>[254,131,309,131,309,261,254,261,], 'legs'=>[254,251,259,251,304,251,309,251,338,381,200,381,], 'ex'=>0, 'hit'=>[392,109,436, 97,424,119,398,131,] },
-{ 'x'=>205, 'y'=> 78, 'w'=>160, 'h'=>300, 'head'=>[238, 78,271, 78,271,128,238,128,], 'body'=>[220,123,275,123,275,255,220,255,], 'legs'=>[220,245,225,245,270,245,275,245,315,378,205,378,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 77, 'w'=>138, 'h'=>303, 'head'=>[254, 77,287, 77,287,127,254,127,], 'body'=>[229,122,284,122,284,256,229,256,], 'legs'=>[229,246,234,246,279,246,284,246,330,380,207,380,], 'ex'=>1 },
-{ 'x'=>206, 'y'=> 83, 'w'=>163, 'h'=>298, 'head'=>[280, 83,312, 83,312,133,280,133,], 'body'=>[254,128,309,128,309,259,254,259,], 'legs'=>[254,249,259,249,304,249,309,249,336,381,206,381,], 'ex'=>1 },
-{ 'x'=>208, 'y'=> 96, 'w'=>189, 'h'=>285, 'head'=>[290, 96,325, 96,325,146,290,146,], 'body'=>[258,141,313,141,313,266,258,266,], 'legs'=>[258,256,263,256,308,256,313,256,336,381,208,381,], 'ex'=>1 },
-{ 'x'=>207, 'y'=>108, 'w'=>232, 'h'=>272, 'head'=>[292,108,334,108,334,158,292,158,], 'body'=>[259,153,314,153,314,271,259,271,], 'legs'=>[259,261,264,261,309,261,314,261,336,380,208,380,], 'ex'=>1 },
-{ 'x'=>208, 'y'=>123, 'w'=>239, 'h'=>255, 'head'=>[302,123,361,123,361,173,302,173,], 'body'=>[264,168,319,168,319,278,264,278,], 'legs'=>[264,268,269,268,314,268,319,268,335,378,209,378,], 'ex'=>0, 'hit'=>[408,161,449,161,447,175,410,180,] },
-{ 'x'=>200, 'y'=> 80, 'w'=>136, 'h'=>297, 'head'=>[235, 80,268, 80,268,130,235,130,], 'body'=>[219,125,274,125,274,256,219,256,], 'legs'=>[219,246,224,246,269,246,274,246,315,377,219,377,], 'ex'=>1 },
-{ 'x'=>174, 'y'=> 88, 'w'=>148, 'h'=>293, 'head'=>[210, 88,242, 88,242,138,210,138,], 'body'=>[208,133,263,133,263,262,208,262,], 'legs'=>[208,252,213,252,258,252,263,252,320,381,228,381,], 'ex'=>1 },
-{ 'x'=>160, 'y'=> 98, 'w'=>186, 'h'=>285, 'head'=>[197, 98,232, 98,232,148,197,148,], 'body'=>[200,143,255,143,255,268,200,268,], 'legs'=>[200,258,205,258,250,258,255,258,344,383,227,383,], 'ex'=>1 },
-{ 'x'=>149, 'y'=>105, 'w'=>268, 'h'=>293, 'head'=>[188,105,226,105,226,155,188,155,], 'body'=>[199,150,254,150,254,279,199,279,], 'legs'=>[199,269,204,269,249,269,254,269,272,398,237,398,], 'ex'=>1 },
-{ 'x'=>140, 'y'=>114, 'w'=>292, 'h'=>263, 'head'=>[179,114,227,114,227,164,179,164,], 'body'=>[191,159,246,159,246,273,191,273,], 'legs'=>[191,263,196,263,241,263,246,263,275,377,239,377,], 'ex'=>1 },
-{ 'x'=>140, 'y'=>122, 'w'=>290, 'h'=>263, 'head'=>[176,122,232,122,232,172,176,172,], 'body'=>[195,167,250,167,250,281,195,281,], 'legs'=>[195,271,200,271,245,271,250,271,281,385,237,385,], 'ex'=>0, 'hit'=>[382,170,428,140,433,165,393,185,] },
-{ 'x'=>205, 'y'=> 79, 'w'=>138, 'h'=>298, 'head'=>[248, 79,277, 79,277,129,248,129,], 'body'=>[226,124,281,124,281,255,226,255,], 'legs'=>[226,245,231,245,276,245,281,245,333,377,207,377,], 'ex'=>1 },
-{ 'x'=>185, 'y'=> 82, 'w'=>146, 'h'=>302, 'head'=>[226, 82,254, 82,254,132,226,132,], 'body'=>[216,127,271,127,271,260,216,260,], 'legs'=>[216,250,221,250,266,250,271,250,330,384,226,384,], 'ex'=>1 },
-{ 'x'=>158, 'y'=> 96, 'w'=>204, 'h'=>287, 'head'=>[195, 96,226, 96,226,146,195,146,], 'body'=>[200,141,255,141,255,267,200,267,], 'legs'=>[200,257,205,257,250,257,255,257,361,383,221,383,], 'ex'=>1 },
-{ 'x'=>150, 'y'=>106, 'w'=>259, 'h'=>277, 'head'=>[184,106,217,106,217,156,184,156,], 'body'=>[193,151,248,151,248,272,193,272,], 'legs'=>[193,262,198,262,243,262,248,262,257,383,220,383,], 'ex'=>1 },
-{ 'x'=>146, 'y'=>114, 'w'=>280, 'h'=>269, 'head'=>[175,114,210,114,210,164,175,164,], 'body'=>[188,159,243,159,243,276,188,276,], 'legs'=>[188,266,193,266,238,266,243,266,259,383,223,383,], 'ex'=>0, 'hit'=>[391,237,429,253,417,288,385,267,] },
-{ 'x'=>192, 'y'=> 80, 'w'=>165, 'h'=>302, 'head'=>[251, 80,284, 80,284,130,251,130,], 'body'=>[224,125,279,125,279,258,224,258,], 'legs'=>[224,248,229,248,274,248,279,248,329,382,193,382,], 'ex'=>1 },
-{ 'x'=>193, 'y'=> 96, 'w'=>138, 'h'=>286, 'head'=>[273, 96,306, 96,306,146,273,146,], 'body'=>[238,141,293,141,293,266,238,266,], 'legs'=>[238,256,243,256,288,256,293,256,330,382,194,382,], 'ex'=>1 },
-{ 'x'=>193, 'y'=>126, 'w'=>165, 'h'=>263, 'head'=>[298,126,329,126,329,176,298,176,], 'body'=>[258,171,313,171,313,285,258,285,], 'legs'=>[258,275,263,275,308,275,313,275,336,389,193,389,], 'ex'=>1 },
-{ 'x'=>253, 'y'=>161, 'w'=>117, 'h'=>226, 'head'=>[294,161,328,161,328,211,294,211,], 'body'=>[265,206,320,206,320,301,265,301,], 'legs'=>[265,291,270,291,315,291,320,291,342,387,255,387,], 'ex'=>1 },
-{ 'x'=>253, 'y'=>174, 'w'=>130, 'h'=>225, 'head'=>[288,174,320,174,320,224,288,224,], 'body'=>[269,219,324,219,324,314,269,314,], 'legs'=>[269,304,274,304,319,304,324,304,349,399,307,399,], 'ex'=>1 },
-{ 'x'=>253, 'y'=>186, 'w'=>219, 'h'=>195, 'head'=>[284,186,318,186,318,236,284,236,], 'body'=>[281,231,336,231,336,311,281,311,], 'legs'=>[281,301,286,301,331,301,336,301,470,381,258,381,], 'ex'=>1 },
-{ 'x'=>256, 'y'=>205, 'w'=>275, 'h'=>174, 'head'=>[285,205,321,205,321,255,285,255,], 'body'=>[282,250,337,250,337,319,282,319,], 'legs'=>[282,309,287,309,332,309,337,309,358,379,256,379,], 'ex'=>0, 'hit'=>[469,306,533,309,533,338,465,324,] },
-{ 'x'=>197, 'y'=> 79, 'w'=>157, 'h'=>302, 'head'=>[245, 79,277, 79,277,129,245,129,], 'body'=>[223,124,278,124,278,257,223,257,], 'legs'=>[223,247,228,247,273,247,278,247,317,381,198,381,], 'ex'=>1 },
-{ 'x'=>203, 'y'=> 80, 'w'=>128, 'h'=>296, 'head'=>[265, 80,298, 80,298,130,265,130,], 'body'=>[245,125,300,125,300,255,245,255,], 'legs'=>[245,245,250,245,295,245,300,245,329,376,204,376,], 'ex'=>1 },
-{ 'x'=>229, 'y'=> 80, 'w'=>108, 'h'=>285, 'head'=>[276, 80,307, 80,307,130,276,130,], 'body'=>[261,125,316,125,316,250,261,250,], 'legs'=>[261,240,266,240,311,240,316,240,334,365,231,365,], 'ex'=>1 },
-{ 'x'=>255, 'y'=> 82, 'w'=>108, 'h'=>285, 'head'=>[280, 82,311, 82,311,132,280,132,], 'body'=>[264,127,319,127,319,252,264,252,], 'legs'=>[264,242,269,242,314,242,319,242,338,367,287,367,], 'ex'=>1 },
-{ 'x'=>252, 'y'=> 88, 'w'=>147, 'h'=>275, 'head'=>[284, 88,316, 88,316,138,284,138,], 'body'=>[258,133,313,133,313,253,258,253,], 'legs'=>[258,243,263,243,308,243,313,243,397,363,304,363,], 'ex'=>1 },
-{ 'x'=>242, 'y'=> 93, 'w'=>216, 'h'=>268, 'head'=>[288, 93,321, 93,321,143,288,143,], 'body'=>[258,138,313,138,313,254,258,254,], 'legs'=>[258,244,263,244,308,244,313,244,344,361,308,361,], 'ex'=>0, 'hit'=>[414,205,467,191,467,222,415,234,] },
-{ 'x'=>210, 'y'=> 78, 'w'=>167, 'h'=>304, 'head'=>[242, 78,274, 78,274,128,242,128,], 'body'=>[225,123,280,123,280,257,225,257,], 'legs'=>[225,247,230,247,275,247,280,247,331,382,211,382,], 'ex'=>1 },
-{ 'x'=>209, 'y'=> 84, 'w'=>174, 'h'=>298, 'head'=>[265, 84,298, 84,298,134,265,134,], 'body'=>[246,129,301,129,301,260,246,260,], 'legs'=>[246,250,251,250,296,250,301,250,371,382,210,382,], 'ex'=>1 },
-{ 'x'=>217, 'y'=> 79, 'w'=>161, 'h'=>298, 'head'=>[291, 79,322, 79,322,129,291,129,], 'body'=>[278,124,333,124,333,255,278,255,], 'legs'=>[278,245,283,245,328,245,333,245,375,377,217,377,], 'ex'=>1 },
-{ 'x'=>247, 'y'=> 76, 'w'=>131, 'h'=>279, 'head'=>[303, 76,334, 76,334,126,303,126,], 'body'=>[291,121,346,121,346,243,291,243,], 'legs'=>[291,233,296,233,341,233,346,233,376,355,247,355,], 'ex'=>1 },
-{ 'x'=>290, 'y'=> 74, 'w'=>103, 'h'=>281, 'head'=>[312, 74,343, 74,343,124,312,124,], 'body'=>[299,119,354,119,354,242,299,242,], 'legs'=>[299,232,304,232,349,232,354,232,376,355,305,355,], 'ex'=>1 },
-{ 'x'=>294, 'y'=> 75, 'w'=>118, 'h'=>278, 'head'=>[318, 75,349, 75,349,125,318,125,], 'body'=>[302,120,357,120,357,241,302,241,], 'legs'=>[302,231,307,231,352,231,357,231,381,353,342,353,], 'ex'=>0, 'hit'=>[381,196,420,194,407,244,381,236,] },
-{ 'x'=>284, 'y'=> 88, 'w'=>159, 'h'=>267, 'head'=>[325, 88,358, 88,358,138,325,138,], 'body'=>[310,133,365,133,365,249,310,249,], 'legs'=>[310,239,315,239,360,239,365,239,381,355,350,355,], 'ex'=>0, 'hit'=>[375,150,396,139,455,207,433,234,] },
-{ 'x'=>205, 'y'=> 84, 'w'=>148, 'h'=>298, 'head'=>[241, 84,274, 84,274,134,241,134,], 'body'=>[221,129,276,129,276,260,221,260,], 'legs'=>[221,250,226,250,271,250,276,250,328,382,206,382,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 90, 'w'=>171, 'h'=>293, 'head'=>[259, 90,291, 90,291,140,259,140,], 'body'=>[235,135,290,135,290,264,235,264,], 'legs'=>[235,254,240,254,285,254,290,254,374,383,205,383,], 'ex'=>1 },
-{ 'x'=>203, 'y'=> 80, 'w'=>185, 'h'=>303, 'head'=>[271, 80,310, 80,310,130,271,130,], 'body'=>[273,125,328,125,328,259,273,259,], 'legs'=>[273,249,278,249,323,249,328,249,385,383,204,383,], 'ex'=>1 },
-{ 'x'=>218, 'y'=> 79, 'w'=>169, 'h'=>298, 'head'=>[290, 79,327, 79,327,129,290,129,], 'body'=>[290,124,345,124,345,255,290,255,], 'legs'=>[290,245,295,245,340,245,345,245,381,377,219,377,], 'ex'=>1 },
-{ 'x'=>244, 'y'=> 73, 'w'=>130, 'h'=>281, 'head'=>[325, 73,359, 73,359,123,325,123,], 'body'=>[302,118,357,118,357,241,302,241,], 'legs'=>[302,231,307,231,352,231,357,231,372,354,244,354,], 'ex'=>1 },
-{ 'x'=>271, 'y'=> 93, 'w'=>140, 'h'=>261, 'head'=>[356, 93,400, 93,400,143,356,143,], 'body'=>[302,138,357,138,357,251,302,251,], 'legs'=>[302,241,307,241,352,241,357,241,376,354,272,354,], 'ex'=>0, 'hit'=>[380,100,413, 97,413,145,382,150,] },
-{ 'x'=>300, 'y'=>131, 'w'=>130, 'h'=>228, 'head'=>[316,131,405,131,405,181,316,181,], 'body'=>[306,176,361,176,361,272,306,272,], 'legs'=>[306,262,311,262,356,262,361,262,384,359,311,359,], 'ex'=>0, 'hit'=>[407,146,432,147,431,181,406,186,] },
-{ 'x'=>205, 'y'=> 79, 'w'=>152, 'h'=>302, 'head'=>[243, 79,276, 79,276,129,243,129,], 'body'=>[227,124,282,124,282,257,227,257,], 'legs'=>[227,247,232,247,277,247,282,247,316,381,205,381,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 84, 'w'=>146, 'h'=>298, 'head'=>[270, 84,301, 84,301,134,270,134,], 'body'=>[253,129,308,129,308,260,253,260,], 'legs'=>[253,250,258,250,303,250,308,250,314,382,206,382,], 'ex'=>1 },
-{ 'x'=>267, 'y'=> 92, 'w'=> 89, 'h'=>283, 'head'=>[292, 92,317, 92,317,142,292,142,], 'body'=>[270,137,325,137,325,261,270,261,], 'legs'=>[270,251,275,251,320,251,325,251,325,375,279,375,], 'ex'=>1 },
-{ 'x'=>261, 'y'=> 96, 'w'=>104, 'h'=>280, 'head'=>[293, 96,321, 96,321,146,293,146,], 'body'=>[275,141,330,141,330,263,275,263,], 'legs'=>[275,253,280,253,325,253,330,253,353,376,285,376,], 'ex'=>1 },
-{ 'x'=>268, 'y'=> 98, 'w'=>117, 'h'=>275, 'head'=>[293, 98,327, 98,327,148,293,148,], 'body'=>[287,143,342,143,342,263,287,263,], 'legs'=>[287,253,292,253,337,253,342,253,383,373,288,373,], 'ex'=>1 },
-{ 'x'=>284, 'y'=>108, 'w'=>103, 'h'=>257, 'head'=>[291,108,328,108,328,158,291,158,], 'body'=>[303,153,358,153,358,264,303,264,], 'legs'=>[303,254,308,254,353,254,358,254,385,365,299,365,], 'ex'=>1 },
-{ 'x'=>284, 'y'=>118, 'w'=>119, 'h'=>248, 'head'=>[290,118,329,118,329,168,290,168,], 'body'=>[313,163,368,163,368,269,313,269,], 'legs'=>[313,259,318,259,363,259,368,259,391,366,357,366,], 'ex'=>1 },
-{ 'x'=>286, 'y'=>121, 'w'=>164, 'h'=>242, 'head'=>[291,121,329,121,329,171,291,171,], 'body'=>[325,166,380,166,380,269,325,269,], 'legs'=>[325,259,330,259,375,259,380,259,395,363,362,363,], 'ex'=>1 },
-{ 'x'=>282, 'y'=>116, 'w'=>234, 'h'=>254, 'head'=>[290,116,321,116,321,166,290,166,], 'body'=>[330,161,385,161,385,270,330,270,], 'legs'=>[330,260,335,260,380,260,385,260,396,370,363,370,], 'ex'=>0, 'hit'=>[483,198,518,196,513,227,483,223,] },
-{ 'x'=>278, 'y'=>109, 'w'=>265, 'h'=>255, 'head'=>[289,109,324,109,324,159,289,159,], 'body'=>[337,154,392,154,392,264,337,264,], 'legs'=>[337,254,342,254,387,254,392,254,406,364,370,364,], 'ex'=>0, 'hit'=>[503,183,542,182,542,212,500,212,] },
-{ 'x'=>210, 'y'=> 84, 'w'=>164, 'h'=>298, 'head'=>[244, 84,276, 84,276,134,244,134,], 'body'=>[235,129,290,129,290,260,235,260,], 'legs'=>[235,250,240,250,285,250,290,250,335,382,211,382,], 'ex'=>1 },
-{ 'x'=>211, 'y'=> 85, 'w'=>130, 'h'=>288, 'head'=>[242, 85,272, 85,272,135,242,135,], 'body'=>[231,130,286,130,286,256,231,256,], 'legs'=>[231,246,236,246,281,246,286,246,333,373,211,373,], 'ex'=>1 },
-{ 'x'=>210, 'y'=> 87, 'w'=>127, 'h'=>287, 'head'=>[237, 87,266, 87,266,137,237,137,], 'body'=>[226,132,281,132,281,258,226,258,], 'legs'=>[226,248,231,248,276,248,281,248,335,374,211,374,], 'ex'=>1 },
-{ 'x'=>200, 'y'=> 90, 'w'=>135, 'h'=>292, 'head'=>[234, 90,262, 90,262,140,234,140,], 'body'=>[216,135,271,135,271,263,216,263,], 'legs'=>[216,253,221,253,266,253,271,253,333,382,209,382,], 'ex'=>1 },
-{ 'x'=>193, 'y'=> 94, 'w'=>143, 'h'=>282, 'head'=>[228, 94,257, 94,257,144,228,144,], 'body'=>[208,139,263,139,263,262,208,262,], 'legs'=>[208,252,213,252,258,252,263,252,334,376,208,376,], 'ex'=>1 },
-{ 'x'=>188, 'y'=>100, 'w'=>148, 'h'=>277, 'head'=>[226,100,256,100,256,150,226,150,], 'body'=>[208,145,263,145,263,266,208,266,], 'legs'=>[208,256,213,256,258,256,263,256,333,377,206,377,], 'ex'=>1 },
-{ 'x'=>201, 'y'=>101, 'w'=>161, 'h'=>281, 'head'=>[244,101,278,101,278,151,244,151,], 'body'=>[222,146,277,146,277,269,222,269,], 'legs'=>[222,259,227,259,272,259,277,259,359,382,208,382,], 'ex'=>1 },
-{ 'x'=>210, 'y'=>101, 'w'=>157, 'h'=>275, 'head'=>[261,101,296,101,296,151,261,151,], 'body'=>[235,146,290,146,290,266,235,266,], 'legs'=>[235,256,240,256,285,256,290,256,364,376,212,376,], 'ex'=>1 },
-{ 'x'=>209, 'y'=>105, 'w'=>158, 'h'=>278, 'head'=>[281,105,318,105,318,155,281,155,], 'body'=>[249,150,304,150,304,271,249,271,], 'legs'=>[249,261,254,261,299,261,304,261,364,383,210,383,], 'ex'=>1 },
-{ 'x'=>210, 'y'=>108, 'w'=>155, 'h'=>274, 'head'=>[300,108,335,108,335,158,300,158,], 'body'=>[270,153,325,153,325,272,270,272,], 'legs'=>[270,262,275,262,320,262,325,262,362,382,212,382,], 'ex'=>1 },
-{ 'x'=>214, 'y'=>114, 'w'=>198, 'h'=>268, 'head'=>[316,114,354,114,354,164,316,164,], 'body'=>[281,159,336,159,336,275,281,275,], 'legs'=>[281,265,286,265,331,265,336,265,364,382,214,382,], 'ex'=>1 },
-{ 'x'=>216, 'y'=>129, 'w'=>236, 'h'=>254, 'head'=>[328,129,401,129,401,179,328,179,], 'body'=>[287,174,342,174,342,283,287,283,], 'legs'=>[287,273,292,273,337,273,342,273,366,383,216,383,], 'ex'=>0, 'hit'=>[442,158,452,158,452,168,442,168,] },
-{ 'x'=>223, 'y'=>108, 'w'=>215, 'h'=>272, 'head'=>[312,108,370,108,370,158,312,158,], 'body'=>[281,153,336,153,336,271,281,271,], 'legs'=>[281,261,286,261,331,261,336,261,373,380,223,380,], 'ex'=>1 },
-{ 'x'=>223, 'y'=>101, 'w'=>190, 'h'=>279, 'head'=>[301,101,341,101,341,151,301,151,], 'body'=>[275,146,330,146,330,268,275,268,], 'legs'=>[275,258,280,258,325,258,330,258,372,380,224,380,], 'ex'=>1 },
-{ 'x'=>222, 'y'=> 97, 'w'=>164, 'h'=>285, 'head'=>[284, 97,319, 97,319,147,284,147,], 'body'=>[265,142,320,142,320,267,265,267,], 'legs'=>[265,257,270,257,315,257,320,257,373,382,223,382,], 'ex'=>1 },
-{ 'x'=>227, 'y'=> 92, 'w'=>151, 'h'=>286, 'head'=>[274, 92,308, 92,308,142,274,142,], 'body'=>[255,137,310,137,310,262,255,262,], 'legs'=>[255,252,260,252,305,252,310,252,370,378,227,378,], 'ex'=>1 },
-{ 'x'=>222, 'y'=> 90, 'w'=>147, 'h'=>293, 'head'=>[264, 90,297, 90,297,140,264,140,], 'body'=>[247,135,302,135,302,264,247,264,], 'legs'=>[247,254,252,254,297,254,302,254,366,383,223,383,], 'ex'=>1 },
-{ 'x'=>227, 'y'=> 88, 'w'=>155, 'h'=>288, 'head'=>[257, 88,290, 88,290,138,257,138,], 'body'=>[240,133,295,133,295,259,240,259,], 'legs'=>[240,249,245,249,290,249,295,249,357,376,227,376,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 85, 'w'=>165, 'h'=>297, 'head'=>[246, 85,279, 85,279,135,246,135,], 'body'=>[222,130,277,130,277,261,222,261,], 'legs'=>[222,251,227,251,272,251,277,251,317,382,206,382,], 'ex'=>1 },
-{ 'x'=>207, 'y'=> 87, 'w'=>159, 'h'=>289, 'head'=>[253, 87,290, 87,290,137,253,137,], 'body'=>[226,132,281,132,281,259,226,259,], 'legs'=>[226,249,231,249,276,249,281,249,320,376,207,376,], 'ex'=>1 },
-{ 'x'=>207, 'y'=> 87, 'w'=>138, 'h'=>291, 'head'=>[253, 87,288, 87,288,137,253,137,], 'body'=>[230,132,285,132,285,260,230,260,], 'legs'=>[230,250,235,250,280,250,285,250,332,378,208,378,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 90, 'w'=>133, 'h'=>293, 'head'=>[267, 90,309, 90,309,140,267,140,], 'body'=>[243,135,298,135,298,264,243,264,], 'legs'=>[243,254,248,254,293,254,298,254,335,383,205,383,], 'ex'=>1 },
-{ 'x'=>210, 'y'=> 94, 'w'=>126, 'h'=>285, 'head'=>[277, 94,309, 94,309,144,277,144,], 'body'=>[258,139,313,139,313,264,258,264,], 'legs'=>[258,254,263,254,308,254,313,254,333,379,210,379,], 'ex'=>1 },
-{ 'x'=>207, 'y'=>100, 'w'=>155, 'h'=>282, 'head'=>[285,100,316,100,316,150,285,150,], 'body'=>[263,145,318,145,318,268,263,268,], 'legs'=>[263,258,268,258,313,258,318,258,334,382,207,382,], 'ex'=>1 },
-{ 'x'=>208, 'y'=>105, 'w'=>199, 'h'=>276, 'head'=>[293,105,324,105,324,155,293,155,], 'body'=>[266,150,321,150,321,270,266,270,], 'legs'=>[266,260,271,260,316,260,321,260,334,381,208,381,], 'ex'=>0, 'hit'=>[389,144,424,145,414,172,385,174,] },
-{ 'x'=>209, 'y'=> 90, 'w'=>168, 'h'=>293, 'head'=>[338, 90,365, 90,365,140,338,140,], 'body'=>[276,135,331,135,331,264,276,264,], 'legs'=>[276,254,281,254,326,254,331,254,336,383,209,383,], 'ex'=>0, 'hit'=>[361, 80,381, 74,404,150,356,164,] },
-{ 'x'=>205, 'y'=> 88, 'w'=>164, 'h'=>294, 'head'=>[238, 88,270, 88,270,138,238,138,], 'body'=>[222,133,277,133,277,262,222,262,], 'legs'=>[222,252,227,252,272,252,277,252,321,382,205,382,], 'ex'=>1 },
-{ 'x'=>200, 'y'=> 90, 'w'=>176, 'h'=>298, 'head'=>[254, 90,287, 90,287,140,254,140,], 'body'=>[235,135,290,135,290,266,235,266,], 'legs'=>[235,256,240,256,285,256,290,256,339,388,201,388,], 'ex'=>1 },
-{ 'x'=>201, 'y'=> 90, 'w'=>186, 'h'=>298, 'head'=>[264, 90,297, 90,297,140,264,140,], 'body'=>[242,135,297,135,297,266,242,266,], 'legs'=>[242,256,247,256,292,256,297,256,337,388,201,388,], 'ex'=>0, 'hit'=>[370,198,380,198,381,210,370,208,] },
-{ 'x'=>209, 'y'=> 88, 'w'=>192, 'h'=>289, 'head'=>[272, 88,304, 88,304,138,272,138,], 'body'=>[251,133,306,133,306,260,251,260,], 'legs'=>[251,250,256,250,301,250,306,250,335,377,209,377,], 'ex'=>1 },
-{ 'x'=>210, 'y'=> 87, 'w'=>192, 'h'=>292, 'head'=>[278, 87,310, 87,310,137,278,137,], 'body'=>[255,132,310,132,310,260,255,260,], 'legs'=>[255,250,260,250,305,250,310,250,338,379,212,379,], 'ex'=>1 },
-{ 'x'=>226, 'y'=> 75, 'w'=>168, 'h'=>298, 'head'=>[298, 75,325, 75,325,125,298,125,], 'body'=>[264,120,319,120,319,251,264,251,], 'legs'=>[264,241,269,241,314,241,319,241,338,373,228,373,], 'ex'=>1 },
-{ 'x'=>237, 'y'=> 57, 'w'=>130, 'h'=>315, 'head'=>[317, 57,336, 57,336,107,317,107,], 'body'=>[270,102,325,102,325,242,270,242,], 'legs'=>[270,232,275,232,320,232,325,232,335,372,238,372,], 'ex'=>1 },
-{ 'x'=>238, 'y'=> 68, 'w'=>110, 'h'=>307, 'head'=>[286, 68,321, 68,321,118,286,118,], 'body'=>[269,113,324,113,324,249,269,249,], 'legs'=>[269,239,274,239,319,239,324,239,336,375,239,375,], 'ex'=>1 },
-{ 'x'=>237, 'y'=> 86, 'w'=>104, 'h'=>288, 'head'=>[285, 86,315, 86,315,136,285,136,], 'body'=>[265,131,320,131,320,257,265,257,], 'legs'=>[265,247,270,247,315,247,320,247,338,374,239,374,], 'ex'=>1 },
-{ 'x'=>222, 'y'=> 87, 'w'=>115, 'h'=>287, 'head'=>[286, 87,314, 87,314,137,286,137,], 'body'=>[259,132,314,132,314,258,259,258,], 'legs'=>[259,248,264,248,309,248,314,248,334,374,238,374,], 'ex'=>1 },
-{ 'x'=>237, 'y'=> 84, 'w'=>101, 'h'=>292, 'head'=>[285, 84,311, 84,311,134,285,134,], 'body'=>[267,129,322,129,322,257,267,257,], 'legs'=>[267,247,272,247,317,247,322,247,335,376,238,376,], 'ex'=>1 },
-{ 'x'=>251, 'y'=> 85, 'w'=>119, 'h'=>290, 'head'=>[288, 85,315, 85,315,135,288,135,], 'body'=>[264,130,319,130,319,257,264,257,], 'legs'=>[264,247,269,247,314,247,319,247,367,375,267,375,], 'ex'=>1 },
-{ 'x'=>224, 'y'=> 87, 'w'=>158, 'h'=>287, 'head'=>[289, 87,318, 87,318,137,289,137,], 'body'=>[266,132,321,132,321,258,266,258,], 'legs'=>[266,248,271,248,316,248,321,248,381,374,273,374,], 'ex'=>1 },
-{ 'x'=>216, 'y'=> 92, 'w'=>177, 'h'=>290, 'head'=>[298, 92,330, 92,330,142,298,142,], 'body'=>[274,137,329,137,329,264,274,264,], 'legs'=>[274,254,279,254,324,254,329,254,391,382,268,382,], 'ex'=>1 },
-{ 'x'=>227, 'y'=> 92, 'w'=>160, 'h'=>285, 'head'=>[314, 92,346, 92,346,142,314,142,], 'body'=>[293,137,348,137,348,262,293,262,], 'legs'=>[293,252,298,252,343,252,348,252,386,377,261,377,], 'ex'=>1 },
-{ 'x'=>205, 'y'=>101, 'w'=>166, 'h'=>281, 'head'=>[259,101,292,101,292,151,259,151,], 'body'=>[233,146,288,146,288,269,233,269,], 'legs'=>[233,259,238,259,283,259,288,259,324,382,205,382,], 'ex'=>1 },
-{ 'x'=>205, 'y'=>105, 'w'=>155, 'h'=>278, 'head'=>[257,105,289,105,289,155,257,155,], 'body'=>[231,150,286,150,286,271,231,271,], 'legs'=>[231,261,236,261,281,261,286,261,323,383,205,383,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 93, 'w'=>152, 'h'=>289, 'head'=>[250, 93,275, 93,275,143,250,143,], 'body'=>[229,138,284,138,284,265,229,265,], 'legs'=>[229,255,234,255,279,255,284,255,323,382,205,382,], 'ex'=>1 },
-{ 'x'=>202, 'y'=>101, 'w'=>151, 'h'=>281, 'head'=>[209,101,245,101,245,151,209,151,], 'body'=>[229,146,284,146,284,269,229,269,], 'legs'=>[229,259,234,259,279,259,284,259,321,382,205,382,], 'ex'=>1 },
-{ 'x'=>181, 'y'=>124, 'w'=>165, 'h'=>260, 'head'=>[195,124,276,124,276,174,195,174,], 'body'=>[224,169,279,169,279,281,224,281,], 'legs'=>[224,271,229,271,274,271,279,271,324,384,201,384,], 'ex'=>1 },
-{ 'x'=>174, 'y'=>137, 'w'=>177, 'h'=>246, 'head'=>[191,137,289,137,289,187,191,187,], 'body'=>[218,182,273,182,273,287,218,287,], 'legs'=>[218,277,223,277,268,277,273,277,321,383,202,383,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 97, 'w'=>172, 'h'=>285, 'head'=>[260, 97,292, 97,292,147,260,147,], 'body'=>[240,142,295,142,295,267,240,267,], 'legs'=>[240,257,245,257,290,257,295,257,322,382,205,382,], 'ex'=>1 },
-{ 'x'=>200, 'y'=>109, 'w'=>140, 'h'=>279, 'head'=>[260,109,294,109,294,159,260,159,], 'body'=>[238,154,293,154,293,276,238,276,], 'legs'=>[238,266,243,266,288,266,293,266,320,388,201,388,], 'ex'=>1 },
-{ 'x'=>199, 'y'=>129, 'w'=>121, 'h'=>259, 'head'=>[256,129,295,129,295,179,256,179,], 'body'=>[231,174,286,174,286,286,231,286,], 'legs'=>[231,276,236,276,281,276,286,276,318,388,200,388,], 'ex'=>1 },
-{ 'x'=>201, 'y'=>116, 'w'=>124, 'h'=>268, 'head'=>[242,116,278,116,278,166,242,166,], 'body'=>[215,161,270,161,270,277,215,277,], 'legs'=>[215,267,220,267,265,267,270,267,322,384,202,384,], 'ex'=>1 },
-{ 'x'=>199, 'y'=>131, 'w'=>127, 'h'=>258, 'head'=>[238,131,277,131,277,181,238,181,], 'body'=>[216,176,271,176,271,287,216,287,], 'legs'=>[216,277,221,277,266,277,271,277,323,389,201,389,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 86, 'w'=>155, 'h'=>296, 'head'=>[252, 86,283, 86,283,136,252,136,], 'body'=>[237,131,292,131,292,261,237,261,], 'legs'=>[237,251,242,251,287,251,292,251,326,382,207,382,], 'ex'=>1 },
-{ 'x'=>206, 'y'=> 88, 'w'=>121, 'h'=>293, 'head'=>[254, 88,284, 88,284,138,254,138,], 'body'=>[237,133,292,133,292,262,237,262,], 'legs'=>[237,252,242,252,287,252,292,252,325,381,208,381,], 'ex'=>1 },
-{ 'x'=>206, 'y'=> 95, 'w'=>122, 'h'=>288, 'head'=>[256, 95,283, 95,283,145,256,145,], 'body'=>[239,140,294,140,294,266,239,266,], 'legs'=>[239,256,244,256,289,256,294,256,326,383,207,383,], 'ex'=>1 },
-{ 'x'=>206, 'y'=> 98, 'w'=>120, 'h'=>284, 'head'=>[259, 98,285, 98,285,148,259,148,], 'body'=>[236,143,291,143,291,267,236,267,], 'legs'=>[236,257,241,257,286,257,291,257,324,382,207,382,], 'ex'=>1 },
-{ 'x'=>206, 'y'=> 98, 'w'=>120, 'h'=>285, 'head'=>[256, 98,283, 98,283,148,256,148,], 'body'=>[234,143,289,143,289,268,234,268,], 'legs'=>[234,258,239,258,284,258,289,258,325,383,206,383,], 'ex'=>1 },
-{ 'x'=>206, 'y'=>105, 'w'=>121, 'h'=>279, 'head'=>[256,105,283,105,283,155,256,155,], 'body'=>[235,150,290,150,290,272,235,272,], 'legs'=>[235,262,240,262,285,262,290,262,325,384,206,384,], 'ex'=>1 },
-{ 'x'=>207, 'y'=>113, 'w'=>121, 'h'=>268, 'head'=>[259,113,286,113,286,163,259,163,], 'body'=>[237,158,292,158,292,274,237,274,], 'legs'=>[237,264,242,264,287,264,292,264,325,381,207,381,], 'ex'=>1 },
-{ 'x'=>206, 'y'=>125, 'w'=>121, 'h'=>255, 'head'=>[261,125,288,125,288,175,261,175,], 'body'=>[237,170,292,170,292,280,237,280,], 'legs'=>[237,270,242,270,287,270,292,270,325,380,206,380,], 'ex'=>1 },
-{ 'x'=>205, 'y'=>136, 'w'=>123, 'h'=>243, 'head'=>[261,136,287,136,287,186,261,186,], 'body'=>[238,181,293,181,293,285,238,285,], 'legs'=>[238,275,243,275,288,275,293,275,326,379,206,379,], 'ex'=>1 },
-{ 'x'=>205, 'y'=>150, 'w'=>122, 'h'=>235, 'head'=>[259,150,285,150,285,200,259,200,], 'body'=>[238,195,293,195,293,295,238,295,], 'legs'=>[238,285,243,285,288,285,293,285,325,385,206,385,], 'ex'=>1 },
-{ 'x'=>210, 'y'=>169, 'w'=>115, 'h'=>230, 'head'=>[256,169,283,169,283,219,256,219,], 'body'=>[240,214,295,214,295,311,240,311,], 'legs'=>[240,301,245,301,290,301,295,301,324,399,211,399,], 'ex'=>1 },
-{ 'x'=>210, 'y'=>165, 'w'=>115, 'h'=>232, 'head'=>[258,165,285,165,285,215,258,215,], 'body'=>[241,210,296,210,296,308,241,308,], 'legs'=>[241,298,246,298,291,298,296,298,324,397,211,397,], 'ex'=>1 },
-{ 'x'=>212, 'y'=>167, 'w'=>122, 'h'=>229, 'head'=>[271,167,305,167,305,217,271,217,], 'body'=>[240,212,295,212,295,309,240,309,], 'legs'=>[240,299,245,299,290,299,295,299,326,396,213,396,], 'ex'=>1 },
-{ 'x'=>210, 'y'=>161, 'w'=>140, 'h'=>225, 'head'=>[274,161,318,161,318,211,274,211,], 'body'=>[240,206,295,206,295,301,240,301,], 'legs'=>[240,291,245,291,290,291,295,291,331,386,211,386,], 'ex'=>1 },
-{ 'x'=>209, 'y'=>153, 'w'=>148, 'h'=>225, 'head'=>[288,153,328,153,328,203,288,203,], 'body'=>[246,198,301,198,301,293,246,293,], 'legs'=>[246,283,251,283,296,283,301,283,326,378,210,378,], 'ex'=>1 },
-{ 'x'=>208, 'y'=>128, 'w'=>159, 'h'=>251, 'head'=>[294,128,331,128,331,178,294,178,], 'body'=>[246,173,301,173,301,281,246,281,], 'legs'=>[246,271,251,271,296,271,301,271,322,379,209,379,], 'ex'=>1 },
-{ 'x'=>208, 'y'=>109, 'w'=>155, 'h'=>269, 'head'=>[291,109,328,109,328,159,291,159,], 'body'=>[247,154,302,154,302,271,247,271,], 'legs'=>[247,261,252,261,297,261,302,261,321,378,209,378,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 87, 'w'=>176, 'h'=>293, 'head'=>[283, 87,316, 87,316,137,283,137,], 'body'=>[247,132,302,132,302,261,247,261,], 'legs'=>[247,251,252,251,297,251,302,251,318,380,205,380,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 90, 'w'=>182, 'h'=>289, 'head'=>[265, 90,296, 90,296,140,265,140,], 'body'=>[242,135,297,135,297,262,242,262,], 'legs'=>[242,252,247,252,292,252,297,252,318,379,206,379,], 'ex'=>1 },
-{ 'x'=>193, 'y'=>219, 'w'=>174, 'h'=>163, 'head'=>[229,219,260,219,260,269,229,269,], 'body'=>[215,264,270,264,270,328,215,328,], 'legs'=>[215,318,220,318,265,318,270,318,300,382,195,382,], 'ex'=>1 },
-{ 'x'=>193, 'y'=>219, 'w'=>172, 'h'=>163, 'head'=>[213,219,245,219,245,269,213,269,], 'body'=>[212,264,267,264,267,328,212,328,], 'legs'=>[212,318,217,318,262,318,267,318,299,382,195,382,], 'ex'=>1 },
-{ 'x'=>184, 'y'=>225, 'w'=>164, 'h'=>156, 'head'=>[193,225,242,225,242,275,193,275,], 'body'=>[202,270,257,270,257,330,202,330,], 'legs'=>[202,320,207,320,252,320,257,320,299,381,196,381,], 'ex'=>1 },
-{ 'x'=>173, 'y'=>232, 'w'=>163, 'h'=>150, 'head'=>[182,232,239,232,239,282,182,282,], 'body'=>[197,277,252,277,252,334,197,334,], 'legs'=>[197,324,202,324,247,324,252,324,299,382,196,382,], 'ex'=>1 },
-{ 'x'=>193, 'y'=>226, 'w'=>166, 'h'=>158, 'head'=>[225,226,259,226,259,276,225,276,], 'body'=>[208,271,263,271,263,332,208,332,], 'legs'=>[208,322,213,322,258,322,263,322,298,384,195,384,], 'ex'=>1 },
-{ 'x'=>194, 'y'=>227, 'w'=>163, 'h'=>157, 'head'=>[224,227,258,227,258,277,224,277,], 'body'=>[207,272,262,272,262,333,207,333,], 'legs'=>[207,323,212,323,257,323,262,323,298,384,195,384,], 'ex'=>1 },
-{ 'x'=>194, 'y'=>229, 'w'=>160, 'h'=>155, 'head'=>[224,229,259,229,259,279,224,279,], 'body'=>[206,274,261,274,261,334,206,334,], 'legs'=>[206,324,211,324,256,324,261,324,297,384,195,384,], 'ex'=>1 },
-{ 'x'=>195, 'y'=>225, 'w'=>143, 'h'=>152, 'head'=>[223,225,259,225,259,275,223,275,], 'body'=>[205,270,260,270,260,328,205,328,], 'legs'=>[205,318,210,318,255,318,260,318,299,377,196,377,], 'ex'=>1 },
-{ 'x'=>195, 'y'=>241, 'w'=>114, 'h'=>137, 'head'=>[211,241,271,241,271,291,211,291,], 'body'=>[204,286,259,286,259,337,204,337,], 'legs'=>[204,327,209,327,254,327,259,327,297,378,196,378,], 'ex'=>1 },
-{ 'x'=>181, 'y'=>242, 'w'=>135, 'h'=>139, 'head'=>[199,242,246,242,246,292,199,292,], 'body'=>[203,287,258,287,258,339,203,339,], 'legs'=>[203,329,208,329,253,329,258,329,297,381,196,381,], 'ex'=>1 },
-{ 'x'=>166, 'y'=>246, 'w'=>150, 'h'=>136, 'head'=>[181,246,240,246,240,296,181,296,], 'body'=>[195,291,250,291,250,341,195,341,], 'legs'=>[195,331,200,331,245,331,250,331,300,382,194,382,], 'ex'=>1 },
-{ 'x'=>155, 'y'=> 88, 'w'=>173, 'h'=>309, 'head'=>[184, 88,217, 88,217,138,184,138,], 'body'=>[163,133,218,133,218,270,163,270,], 'legs'=>[163,260,168,260,213,260,218,260,268,397,164,397,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 79, 'w'=>130, 'h'=>303, 'head'=>[255, 79,288, 79,288,129,255,129,], 'body'=>[215,124,270,124,270,258,215,258,], 'legs'=>[215,248,220,248,265,248,270,248,308,382,205,382,], 'ex'=>1 },
-{ 'x'=>198, 'y'=> 90, 'w'=>125, 'h'=>293, 'head'=>[269, 90,314, 90,314,140,269,140,], 'body'=>[214,135,269,135,269,264,214,264,], 'legs'=>[214,254,219,254,264,254,269,254,310,383,206,383,], 'ex'=>1 },
-{ 'x'=>200, 'y'=>102, 'w'=>143, 'h'=>281, 'head'=>[243,102,315,102,315,152,243,152,], 'body'=>[232,147,287,147,287,270,232,270,], 'legs'=>[232,260,237,260,282,260,287,260,309,383,206,383,], 'ex'=>1 },
-{ 'x'=>204, 'y'=> 65, 'w'=>148, 'h'=>317, 'head'=>[260, 65,292, 65,292,115,260,115,], 'body'=>[246,110,301,110,301,251,246,251,], 'legs'=>[246,241,251,241,296,241,301,241,307,382,204,382,], 'ex'=>1 },
-{ 'x'=>192, 'y'=>106, 'w'=>198, 'h'=>266, 'head'=>[283,106,349,106,349,156,283,156,], 'body'=>[245,151,300,151,300,266,245,266,], 'legs'=>[245,256,250,256,295,256,300,256,307,372,192,372,], 'ex'=>1 },
-{ 'x'=>179, 'y'=>131, 'w'=>245, 'h'=>239, 'head'=>[300,131,373,131,373,181,300,181,], 'body'=>[243,176,298,176,298,278,243,278,], 'legs'=>[243,268,248,268,293,268,298,268,306,370,179,370,], 'ex'=>1 },
-{ 'x'=>168, 'y'=>141, 'w'=>260, 'h'=>228, 'head'=>[297,141,385,141,385,191,297,191,], 'body'=>[239,186,294,186,294,282,239,282,], 'legs'=>[239,272,244,272,289,272,294,272,306,369,271,369,], 'ex'=>1 },
-{ 'x'=>174, 'y'=>135, 'w'=>244, 'h'=>233, 'head'=>[291,135,361,135,361,185,291,185,], 'body'=>[251,180,306,180,306,279,251,279,], 'legs'=>[251,269,256,269,301,269,306,269,312,368,272,368,], 'ex'=>1 },
-{ 'x'=>186, 'y'=> 99, 'w'=>245, 'h'=>267, 'head'=>[336, 99,367, 99,367,149,336,149,], 'body'=>[292,144,347,144,347,260,292,260,], 'legs'=>[292,250,297,250,342,250,347,250,321,366,272,366,], 'ex'=>1 },
-{ 'x'=>195, 'y'=>137, 'w'=>266, 'h'=>229, 'head'=>[379,137,414,137,414,187,379,187,], 'body'=>[272,182,327,182,327,279,272,279,], 'legs'=>[272,269,277,269,322,269,327,269,320,366,273,366,], 'ex'=>1 },
-{ 'x'=>202, 'y'=>180, 'w'=>274, 'h'=>186, 'head'=>[288,180,386,180,386,230,288,230,], 'body'=>[264,225,319,225,319,300,264,300,], 'legs'=>[264,290,269,290,314,290,319,290,317,366,272,366,], 'ex'=>1 },
-{ 'x'=>208, 'y'=>186, 'w'=>274, 'h'=>179, 'head'=>[257,186,313,186,313,236,257,236,], 'body'=>[308,231,363,231,363,303,308,303,], 'legs'=>[308,293,313,293,358,293,363,293,467,365,274,365,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 88, 'w'=>146, 'h'=>294, 'head'=>[230, 88,261, 88,261,138,230,138,], 'body'=>[215,133,270,133,270,262,215,262,], 'legs'=>[215,252,220,252,265,252,270,252,302,382,206,382,], 'ex'=>1 },
-{ 'x'=>203, 'y'=> 94, 'w'=>137, 'h'=>298, 'head'=>[235, 94,268, 94,268,144,235,144,], 'body'=>[213,139,268,139,268,270,213,270,], 'legs'=>[213,260,218,260,263,260,268,260,303,392,214,392,], 'ex'=>1 },
-{ 'x'=>205, 'y'=>109, 'w'=>126, 'h'=>284, 'head'=>[236,109,270,109,270,159,236,159,], 'body'=>[212,154,267,154,267,278,212,278,], 'legs'=>[212,268,217,268,262,268,267,268,298,393,215,393,], 'ex'=>1 },
-{ 'x'=>216, 'y'=> 94, 'w'=>107, 'h'=>298, 'head'=>[235, 94,267, 94,267,144,235,144,], 'body'=>[221,139,276,139,276,270,221,270,], 'legs'=>[221,260,226,260,271,260,276,260,285,392,220,392,], 'ex'=>1 },
-{ 'x'=>218, 'y'=> 73, 'w'=> 93, 'h'=>323, 'head'=>[233, 73,263, 73,263,123,233,123,], 'body'=>[220,118,275,118,275,262,220,262,], 'legs'=>[220,252,225,252,270,252,275,252,262,396,218,396,], 'ex'=>1 },
-{ 'x'=>218, 'y'=> 60, 'w'=> 98, 'h'=>293, 'head'=>[237, 60,269, 60,269,110,237,110,], 'body'=>[222,105,277,105,277,234,222,234,], 'legs'=>[222,224,227,224,272,224,277,224,281,353,219,353,], 'ex'=>1 },
-{ 'x'=>222, 'y'=> 61, 'w'=>100, 'h'=>251, 'head'=>[251, 61,281, 61,281,111,251,111,], 'body'=>[224,106,279,106,279,214,224,214,], 'legs'=>[224,204,229,204,274,204,279,204,305,312,254,312,], 'ex'=>1 },
-{ 'x'=>219, 'y'=> 77, 'w'=>139, 'h'=>273, 'head'=>[254, 77,291, 77,291,127,254,127,], 'body'=>[225,122,280,122,280,241,225,241,], 'legs'=>[225,231,230,231,275,231,280,231,303,350,266,350,], 'ex'=>0, 'hit'=>[350,184,380,189,381,218,337,227,] },
-{ 'x'=>228, 'y'=> 71, 'w'=>170, 'h'=>278, 'head'=>[257, 71,297, 71,297,121,257,121,], 'body'=>[234,116,289,116,289,237,234,237,], 'legs'=>[234,227,239,227,284,227,289,227,295,349,267,349,], 'ex'=>0, 'hit'=>[370, 89,387, 88,405,134,354,160,] },
-{ 'x'=>205, 'y'=> 70, 'w'=>148, 'h'=>312, 'head'=>[234, 70,265, 70,265,120,234,120,], 'body'=>[226,115,281,115,281,253,226,253,], 'legs'=>[226,243,231,243,276,243,281,243,324,382,206,382,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 73, 'w'=>129, 'h'=>310, 'head'=>[230, 73,260, 73,260,123,230,123,], 'body'=>[226,118,281,118,281,255,226,255,], 'legs'=>[226,245,231,245,276,245,281,245,325,383,206,383,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 76, 'w'=>123, 'h'=>306, 'head'=>[225, 76,254, 76,254,126,225,126,], 'body'=>[223,121,278,121,278,256,223,256,], 'legs'=>[223,246,228,246,273,246,278,246,325,382,206,382,], 'ex'=>1 },
-{ 'x'=>203, 'y'=> 79, 'w'=>124, 'h'=>303, 'head'=>[223, 79,252, 79,252,129,223,129,], 'body'=>[216,124,271,124,271,258,216,258,], 'legs'=>[216,248,221,248,266,248,271,248,325,382,205,382,], 'ex'=>1 },
-{ 'x'=>195, 'y'=> 79, 'w'=>134, 'h'=>303, 'head'=>[221, 79,250, 79,250,129,221,129,], 'body'=>[214,124,269,124,269,258,214,258,], 'legs'=>[214,248,219,248,264,248,269,248,327,382,206,382,], 'ex'=>1 },
-{ 'x'=>188, 'y'=> 79, 'w'=>138, 'h'=>303, 'head'=>[224, 79,251, 79,251,129,224,129,], 'body'=>[216,124,271,124,271,258,216,258,], 'legs'=>[216,248,221,248,266,248,271,248,323,382,206,382,], 'ex'=>1 },
-{ 'x'=>183, 'y'=> 76, 'w'=>144, 'h'=>306, 'head'=>[232, 76,260, 76,260,126,232,126,], 'body'=>[217,121,272,121,272,256,217,256,], 'legs'=>[217,246,222,246,267,246,272,246,324,382,205,382,], 'ex'=>1 },
-{ 'x'=>197, 'y'=> 71, 'w'=>130, 'h'=>311, 'head'=>[240, 71,280, 71,280,121,240,121,], 'body'=>[225,116,280,116,280,254,225,254,], 'legs'=>[225,244,230,244,275,244,280,244,324,382,206,382,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 71, 'w'=>122, 'h'=>311, 'head'=>[259, 71,296, 71,296,121,259,121,], 'body'=>[241,116,296,116,296,254,241,254,], 'legs'=>[241,244,246,244,291,244,296,244,324,382,206,382,], 'ex'=>1 },
-{ 'x'=>205, 'y'=> 73, 'w'=>135, 'h'=>309, 'head'=>[271, 73,307, 73,307,123,271,123,], 'body'=>[248,118,303,118,303,255,248,255,], 'legs'=>[248,245,253,245,298,245,303,245,322,382,206,382,], 'ex'=>1 },
-{ 'x'=>206, 'y'=> 76, 'w'=>187, 'h'=>306, 'head'=>[274, 76,307, 76,307,126,274,126,], 'body'=>[249,121,304,121,304,256,249,256,], 'legs'=>[249,246,254,246,299,246,304,246,325,382,207,382,], 'ex'=>0, 'hit'=>[370,136,396,131,398,152,370,146,] },
-{ 'x'=>206, 'y'=> 76, 'w'=>178, 'h'=>306, 'head'=>[269, 76,300, 76,300,126,269,126,], 'body'=>[246,121,301,121,301,256,246,256,], 'legs'=>[246,246,251,246,296,246,301,246,325,382,206,382,], 'ex'=>1 },
-{ 'x'=>204, 'y'=> 73, 'w'=>179, 'h'=>310, 'head'=>[256, 73,286, 73,286,123,256,123,], 'body'=>[239,118,294,118,294,255,239,255,], 'legs'=>[239,245,244,245,289,245,294,245,323,383,205,383,], 'ex'=>1 },
-{ 'x'=>205, 'y'=>206, 'w'=>159, 'h'=>176, 'head'=>[225,206,286,206,286,256,225,256,], 'body'=>[210,251,265,251,265,321,210,321,], 'legs'=>[210,311,215,311,260,311,265,311,299,382,210,382,], 'ex'=>1 },
-{ 'x'=>205, 'y'=>205, 'w'=>156, 'h'=>178, 'head'=>[223,205,268,205,268,255,223,255,], 'body'=>[208,250,263,250,263,321,208,321,], 'legs'=>[208,311,213,311,258,311,263,311,300,383,211,383,], 'ex'=>1 },
-{ 'x'=>204, 'y'=>204, 'w'=>125, 'h'=>181, 'head'=>[224,204,261,204,261,254,224,254,], 'body'=>[208,249,263,249,263,322,208,322,], 'legs'=>[208,312,213,312,258,312,263,312,301,385,211,385,], 'ex'=>1 },
-{ 'x'=>192, 'y'=>202, 'w'=>114, 'h'=>181, 'head'=>[229,202,263,202,263,252,229,252,], 'body'=>[201,247,256,247,256,320,201,320,], 'legs'=>[201,310,206,310,251,310,256,310,301,383,212,383,], 'ex'=>1 },
-{ 'x'=>184, 'y'=>204, 'w'=>131, 'h'=>181, 'head'=>[232,204,269,204,269,254,232,254,], 'body'=>[191,249,246,249,246,322,191,322,], 'legs'=>[191,312,196,312,241,312,246,312,300,385,211,385,], 'ex'=>1 },
-{ 'x'=>180, 'y'=>206, 'w'=>133, 'h'=>178, 'head'=>[226,206,272,206,272,256,226,256,], 'body'=>[200,251,255,251,255,322,200,322,], 'legs'=>[200,312,205,312,250,312,255,312,301,384,210,384,], 'ex'=>1 },
-{ 'x'=>185, 'y'=>200, 'w'=>121, 'h'=>184, 'head'=>[234,200,275,200,275,250,234,250,], 'body'=>[201,245,256,245,256,319,201,319,], 'legs'=>[201,309,206,309,251,309,256,309,301,384,208,384,], 'ex'=>1 },
-{ 'x'=>199, 'y'=>200, 'w'=>120, 'h'=>184, 'head'=>[241,200,279,200,279,250,241,250,], 'body'=>[205,245,260,245,260,319,205,319,], 'legs'=>[205,309,210,309,255,309,260,309,301,384,210,384,], 'ex'=>1 },
-{ 'x'=>205, 'y'=>203, 'w'=>126, 'h'=>182, 'head'=>[243,203,286,203,286,253,243,253,], 'body'=>[216,248,271,248,271,321,216,321,], 'legs'=>[216,311,221,311,266,311,271,311,302,385,210,385,], 'ex'=>1 },
-{ 'x'=>201, 'y'=>208, 'w'=>169, 'h'=>176, 'head'=>[242,208,302,208,302,258,242,258,], 'body'=>[218,253,273,253,273,323,218,323,], 'legs'=>[218,313,223,313,268,313,273,313,303,384,211,384,], 'ex'=>0, 'hit'=>[357,250,367,250,368,258,357,260,] },
-{ 'x'=>201, 'y'=>209, 'w'=>179, 'h'=>174, 'head'=>[242,209,282,209,282,259,242,259,], 'body'=>[216,254,271,254,271,323,216,323,], 'legs'=>[216,313,221,313,266,313,271,313,300,383,211,383,], 'ex'=>1 },
-{ 'x'=>203, 'y'=>207, 'w'=>142, 'h'=>176, 'head'=>[241,207,278,207,278,257,241,257,], 'body'=>[216,252,271,252,271,322,216,322,], 'legs'=>[216,312,221,312,266,312,271,312,302,383,211,383,], 'ex'=>1 },
+{ 'x'=>224, 'y'=> 53, 'w'=> 92, 'h'=>311, 'head'=>[249, 53,274, 53,274,103,249,103,], 'body'=>[236, 98,291, 98,291,236,236,236,], 'legs'=>[236,226,241,226,286,226,291,226,315,364,232,364,], 'ex'=>1 },
+{ 'x'=>219, 'y'=> 54, 'w'=>111, 'h'=>311, 'head'=>[255, 54,280, 54,280,104,255,104,], 'body'=>[235, 99,290, 99,290,237,235,237,], 'legs'=>[235,227,240,227,285,227,290,227,316,365,232,365,], 'ex'=>1 },
+{ 'x'=>213, 'y'=> 54, 'w'=>121, 'h'=>311, 'head'=>[254, 54,279, 54,279,104,254,104,], 'body'=>[232, 99,287, 99,287,237,232,237,], 'legs'=>[232,227,237,227,282,227,287,227,316,365,229,365,], 'ex'=>1 },
+{ 'x'=>179, 'y'=> 55, 'w'=>181, 'h'=>314, 'head'=>[252, 55,277, 55,277,105,252,105,], 'body'=>[234,100,289,100,289,239,234,239,], 'legs'=>[234,229,239,229,284,229,289,229,314,369,229,369,], 'ex'=>1 },
+{ 'x'=>162, 'y'=> 53, 'w'=>215, 'h'=>314, 'head'=>[224, 53,252, 53,252,103,224,103,], 'body'=>[228, 98,283, 98,283,237,228,237,], 'legs'=>[228,227,233,227,278,227,283,227,313,367,228,367,], 'ex'=>1 },
+{ 'x'=>157, 'y'=> 43, 'w'=>224, 'h'=>324, 'head'=>[209, 43,240, 43,240, 93,209, 93,], 'body'=>[236, 88,291, 88,291,232,236,232,], 'legs'=>[236,222,241,222,286,222,291,222,313,367,228,367,], 'ex'=>1 },
+{ 'x'=>163, 'y'=> 51, 'w'=>217, 'h'=>317, 'head'=>[254, 51,279, 51,279,101,254,101,], 'body'=>[233, 96,288, 96,288,237,233,237,], 'legs'=>[233,227,238,227,283,227,288,227,314,368,228,368,], 'ex'=>1 },
+{ 'x'=>165, 'y'=> 51, 'w'=>213, 'h'=>318, 'head'=>[249, 51,274, 51,274,101,249,101,], 'body'=>[223, 96,278, 96,278,237,223,237,], 'legs'=>[223,227,228,227,273,227,278,227,311,369,228,369,], 'ex'=>1 },
+{ 'x'=>226, 'y'=> 64, 'w'=> 86, 'h'=>313, 'head'=>[246, 64,272, 64,272,114,246,114,], 'body'=>[234,109,289,109,289,248,234,248,], 'legs'=>[234,238,239,238,284,238,289,238,311,377,228,377,], 'ex'=>1 },
+{ 'x'=>223, 'y'=> 64, 'w'=> 93, 'h'=>314, 'head'=>[243, 64,271, 64,271,114,243,114,], 'body'=>[231,109,286,109,286,248,231,248,], 'legs'=>[231,238,236,238,281,238,286,238,314,378,227,378,], 'ex'=>1 },
+{ 'x'=>219, 'y'=> 64, 'w'=> 94, 'h'=>314, 'head'=>[238, 64,267, 64,267,114,238,114,], 'body'=>[226,109,281,109,281,248,226,248,], 'legs'=>[226,238,231,238,276,238,281,238,312,378,226,378,], 'ex'=>1 },
+{ 'x'=>218, 'y'=> 66, 'w'=> 97, 'h'=>313, 'head'=>[238, 66,269, 66,269,116,238,116,], 'body'=>[225,111,280,111,280,250,225,250,], 'legs'=>[225,240,230,240,275,240,280,240,313,379,226,379,], 'ex'=>1 },
+{ 'x'=>218, 'y'=> 67, 'w'=>100, 'h'=>311, 'head'=>[238, 67,270, 67,270,117,238,117,], 'body'=>[225,112,280,112,280,250,225,250,], 'legs'=>[225,240,230,240,275,240,280,240,315,378,226,378,], 'ex'=>1 },
+{ 'x'=>219, 'y'=> 68, 'w'=>106, 'h'=>311, 'head'=>[238, 68,270, 68,270,118,238,118,], 'body'=>[225,113,280,113,280,251,225,251,], 'legs'=>[225,241,230,241,275,241,280,241,321,379,226,379,], 'ex'=>1 },
+{ 'x'=>222, 'y'=> 69, 'w'=>122, 'h'=>310, 'head'=>[242, 69,274, 69,274,119,242,119,], 'body'=>[228,114,283,114,283,251,228,251,], 'legs'=>[228,241,233,241,278,241,283,241,326,379,226,379,], 'ex'=>1 },
+{ 'x'=>227, 'y'=> 69, 'w'=>155, 'h'=>311, 'head'=>[246, 69,277, 69,277,119,246,119,], 'body'=>[232,114,287,114,287,252,232,252,], 'legs'=>[232,242,237,242,282,242,287,242,326,380,229,380,], 'ex'=>1 },
+{ 'x'=>228, 'y'=> 74, 'w'=>175, 'h'=>305, 'head'=>[259, 74,291, 74,291,124,259,124,], 'body'=>[243,119,298,119,298,254,243,254,], 'legs'=>[243,244,248,244,293,244,298,244,325,379,228,379,], 'ex'=>1 },
+{ 'x'=>205, 'y'=> 78, 'w'=>203, 'h'=>305, 'head'=>[266, 78,300, 78,300,128,266,128,], 'body'=>[237,123,292,123,292,258,237,258,], 'legs'=>[237,248,242,248,287,248,292,248,327,383,205,383,], 'ex'=>1 },
+{ 'x'=>204, 'y'=> 78, 'w'=>186, 'h'=>305, 'head'=>[243, 78,280, 78,280,128,243,128,], 'body'=>[222,123,277,123,277,258,222,258,], 'legs'=>[222,248,227,248,272,248,277,248,326,383,206,383,], 'ex'=>1 },
+{ 'x'=>206, 'y'=> 79, 'w'=>172, 'h'=>306, 'head'=>[245, 79,281, 79,281,129,245,129,], 'body'=>[224,124,279,124,279,259,224,259,], 'legs'=>[224,249,229,249,274,249,279,249,325,385,207,385,], 'ex'=>1 },
+{ 'x'=>206, 'y'=> 79, 'w'=>184, 'h'=>306, 'head'=>[258, 79,292, 79,292,129,258,129,], 'body'=>[234,124,289,124,289,259,234,259,], 'legs'=>[234,249,239,249,284,249,289,249,327,385,207,385,], 'ex'=>1 },
+{ 'x'=>206, 'y'=> 80, 'w'=>199, 'h'=>305, 'head'=>[265, 80,299, 80,299,130,265,130,], 'body'=>[241,125,296,125,296,260,241,260,], 'legs'=>[241,250,246,250,291,250,296,250,326,385,207,385,], 'ex'=>1 },
+{ 'x'=>206, 'y'=> 83, 'w'=>210, 'h'=>302, 'head'=>[266, 83,300, 83,300,133,266,133,], 'body'=>[242,128,297,128,297,261,242,261,], 'legs'=>[242,251,247,251,292,251,297,251,327,385,207,385,], 'ex'=>1 },
+{ 'x'=>215, 'y'=> 74, 'w'=>172, 'h'=>309, 'head'=>[242, 74,277, 74,277,124,242,124,], 'body'=>[221,119,276,119,276,256,221,256,], 'legs'=>[221,246,226,246,271,246,276,246,319,383,215,383,], 'ex'=>1 },
+{ 'x'=>215, 'y'=> 75, 'w'=>176, 'h'=>310, 'head'=>[243, 75,277, 75,277,125,243,125,], 'body'=>[222,120,277,120,277,257,222,257,], 'legs'=>[222,247,227,247,272,247,305,248,322,385,215,385,], 'ex'=>0 },
+{ 'x'=>213, 'y'=> 76, 'w'=>177, 'h'=>309, 'head'=>[252, 76,287, 76,287,126,252,126,], 'body'=>[231,121,286,121,286,258,231,258,], 'legs'=>[231,248,236,248,281,248,308,248,345,385,213,385,], 'ex'=>0 },
+{ 'x'=>213, 'y'=> 77, 'w'=>193, 'h'=>307, 'head'=>[273, 77,308, 77,308,127,273,127,], 'body'=>[252,122,307,122,307,258,252,258,], 'legs'=>[252,248,257,248,302,248,320,248,348,384,213,384,], 'ex'=>0 },
+{ 'x'=>227, 'y'=> 80, 'w'=>197, 'h'=>298, 'head'=>[302, 82,339, 82,339,132,302,132,], 'body'=>[274,125,329,125,329,256,274,256,], 'legs'=>[274,246,279,246,324,246,344,246,347,378,228,378,], 'ex'=>0 },
+{ 'x'=>251, 'y'=> 80, 'w'=>192, 'h'=>290, 'head'=>[304, 80,341, 80,341,130,304,130,], 'body'=>[282,125,337,125,337,252,282,252,], 'legs'=>[282,242,287,242,332,242,337,242,350,370,252,370,], 'ex'=>1 },
+{ 'x'=>279, 'y'=> 80, 'w'=>165, 'h'=>295, 'head'=>[310, 80,347, 80,347,130,310,130,], 'body'=>[290,125,345,125,345,255,290,255,], 'legs'=>[290,245,295,245,340,245,345,245,351,375,279,375,], 'ex'=>1 },
+{ 'x'=>302, 'y'=> 79, 'w'=>150, 'h'=>294, 'head'=>[325, 79,359, 79,359,129,325,129,], 'body'=>[304,124,359,124,359,253,304,253,], 'legs'=>[304,243,309,243,354,243,359,243,371,373,311,373,], 'ex'=>1 },
+{ 'x'=>311, 'y'=> 79, 'w'=>156, 'h'=>306, 'head'=>[337, 79,372, 79,372,129,337,129,], 'body'=>[318,124,373,124,373,259,318,259,], 'legs'=>[318,249,323,249,368,249,373,249,385,385,312,385,], 'ex'=>1 },
+{ 'x'=>321, 'y'=> 79, 'w'=>141, 'h'=>301, 'head'=>[344, 79,378, 79,378,129,344,129,], 'body'=>[325,124,380,124,380,257,325,257,], 'legs'=>[325,247,330,247,375,247,380,247,386,380,322,380,], 'ex'=>1 },
+{ 'x'=>334, 'y'=> 82, 'w'=>139, 'h'=>298, 'head'=>[357, 82,395, 82,395,132,357,132,], 'body'=>[337,127,392,127,392,258,337,258,], 'legs'=>[337,248,342,248,387,248,392,248,409,380,356,380,], 'ex'=>1 },
+{ 'x'=>341, 'y'=> 79, 'w'=>148, 'h'=>309, 'head'=>[366, 79,402, 79,402,129,366,129,], 'body'=>[344,124,399,124,399,261,344,261,], 'legs'=>[344,251,349,251,394,251,419,251,433,388,359,388,], 'ex'=>0 },
+{ 'x'=>356, 'y'=> 80, 'w'=>142, 'h'=>300, 'head'=>[381, 80,419, 80,419,130,381,130,], 'body'=>[359,125,414,125,414,257,359,257,], 'legs'=>[359,247,364,247,409,247,422,246,454,380,361,380,], 'ex'=>0 },
+{ 'x'=>355, 'y'=> 84, 'w'=>162, 'h'=>296, 'head'=>[394, 84,433, 84,433,134,394,134,], 'body'=>[374,129,429,129,429,259,374,259,], 'legs'=>[374,249,379,249,424,249,438,249,454,380,359,380,], 'ex'=>0 },
+{ 'x'=>205, 'y'=> 83, 'w'=>165, 'h'=>299, 'head'=>[237, 83,272, 83,272,133,237,133,], 'body'=>[217,128,272,128,282,255,217,260,], 'legs'=>[217,250,222,250,267,250,295,247,323,382,206,382,], 'ex'=>0 },
+{ 'x'=>202, 'y'=> 80, 'w'=>150, 'h'=>301, 'head'=>[234, 80,265, 80,265,130,234,130,], 'body'=>[215,125,270,125,270,258,215,258,], 'legs'=>[215,248,220,248,265,248,290,244,329,381,204,381,], 'ex'=>0 },
+{ 'x'=>198, 'y'=> 80, 'w'=>145, 'h'=>297, 'head'=>[236, 80,265, 80,265,130,236,130,], 'body'=>[216,125,271,125,271,256,216,256,], 'legs'=>[216,246,221,246,266,246,296,243,330,377,205,377,], 'ex'=>0 },
+{ 'x'=>201, 'y'=> 82, 'w'=>129, 'h'=>299, 'head'=>[242, 82,270, 82,270,132,242,132,], 'body'=>[232,126,287,126,287,258,232,258,], 'legs'=>[224,249,229,249,274,249,297,248,329,381,204,381,], 'ex'=>0 },
+{ 'x'=>203, 'y'=> 85, 'w'=>128, 'h'=>293, 'head'=>[248, 85,278, 85,278,135,248,135,], 'body'=>[239,129,294,129,294,258,239,258,], 'legs'=>[229,249,234,249,279,249,305,248,330,378,208,378,], 'ex'=>0 },
+{ 'x'=>198, 'y'=> 87, 'w'=>133, 'h'=>295, 'head'=>[254, 87,286, 87,286,137,254,137,], 'body'=>[251,132,306,132,306,262,251,262,], 'legs'=>[236,252,241,252,286,252,310,251,330,382,204,382,], 'ex'=>0 },
+{ 'x'=>174, 'y'=> 92, 'w'=>156, 'h'=>278, 'head'=>[253, 92,292, 92,292,142,253,142,], 'body'=>[257,139,312,139,312,260,257,260,], 'legs'=>[239,248,244,248,289,248,314,247,329,370,208,370,], 'ex'=>0 },
+{ 'x'=>163, 'y'=> 91, 'w'=>167, 'h'=>280, 'head'=>[245, 91,286, 91,286,141,245,141,], 'body'=>[249,134,304,134,304,256,249,256,], 'legs'=>[233,248,238,248,283,248,309,249,329,371,207,371,], 'ex'=>0 },
+{ 'x'=>204, 'y'=> 70, 'w'=>138, 'h'=>313, 'head'=>[234, 70,267, 70,267,120,234,120,], 'body'=>[218,115,273,115,273,254,218,254,], 'legs'=>[218,244,223,244,268,244,273,244,291,383,204,383,], 'ex'=>1 },
+{ 'x'=>198, 'y'=> 79, 'w'=>129, 'h'=>304, 'head'=>[219, 79,252, 79,252,129,219,129,], 'body'=>[209,124,264,124,264,258,209,258,], 'legs'=>[209,248,214,248,259,248,264,248,291,383,211,383,], 'ex'=>1 },
+{ 'x'=>181, 'y'=>102, 'w'=>129, 'h'=>278, 'head'=>[202,102,235,102,235,152,202,152,], 'body'=>[190,147,245,147,245,268,190,268,], 'legs'=>[190,258,195,258,240,258,245,258,291,380,247,380,], 'ex'=>1 },
+{ 'x'=>173, 'y'=>122, 'w'=>132, 'h'=>259, 'head'=>[193,122,225,122,225,172,193,172,], 'body'=>[181,167,236,167,236,279,181,279,], 'legs'=>[181,269,186,269,231,269,276,275,293,381,249,381,], 'ex'=>0 },
+{ 'x'=>161, 'y'=>147, 'w'=>132, 'h'=>233, 'head'=>[180,147,211,147,211,197,180,197,], 'body'=>[165,192,220,192,220,291,165,291,], 'legs'=>[165,281,170,281,215,281,260,281,291,380,243,380,], 'ex'=>0 },
+{ 'x'=>143, 'y'=>175, 'w'=>150, 'h'=>205, 'head'=>[155,175,188,175,188,225,155,225,], 'body'=>[149,220,204,220,204,305,149,305,], 'legs'=>[149,295,154,295,199,295,244,286,292,380,170,380,], 'ex'=>0 },
+{ 'x'=>115, 'y'=>211, 'w'=>178, 'h'=>171, 'head'=>[130,211,168,211,168,261,130,261,], 'body'=>[122,256,177,256,177,324,122,324,], 'legs'=>[122,314,127,314,172,314,229,289,291,382,146,382,], 'ex'=>0 },
+{ 'x'=> 87, 'y'=>244, 'w'=>208, 'h'=>137, 'head'=>[ 91,244,123,244,123,294, 91,294,], 'body'=>[ 91,289,146,289,201,363,123,375,], 'legs'=>[170,335,171,311,193,314,219,306,290,381,181,379,], 'ex'=>0 },
+{ 'x'=> 48, 'y'=>263, 'w'=>241, 'h'=>129, 'head'=>[ 45,274, 90,274, 90,308, 45,308,], 'body'=>[ 73,321,176,321,176,376, 73,376,], 'legs'=>[186,295,186,290,285,318,287,357,210,356,179,370,], 'ex'=>0 },
+{ 'x'=> 19, 'y'=>281, 'w'=>254, 'h'=>112, 'head'=>[ 22,307, 67,307, 67,335, 22,335,], 'body'=>[ 64,324,173,324,173,379, 64,379,], 'legs'=>[154,309,184,285,273,281,254,324,163,393,163,388,], 'ex'=>0 },
+{ 'x'=> 7, 'y'=>239, 'w'=>231, 'h'=>150, 'head'=>[ 4,315, 57,315, 57,365, 4,365,], 'body'=>[ 55,323,178,334,164,391, 55,380,], 'legs'=>[148,264,224,239,236,282,181,303,180,338,124,323,], 'ex'=>0 },
+{ 'x'=> 3, 'y'=>190, 'w'=>165, 'h'=>195, 'head'=>[ 5,314, 43,314, 43,364, 5,364,], 'body'=>[ 45,325,151,306,143,386, 42,370,], 'legs'=>[ 28,198, 33,198, 78,198, 83,198,139,300, 84,314,], 'ex'=>0 },
+{ 'x'=> 3, 'y'=>182, 'w'=>166, 'h'=>202, 'head'=>[ 9,316, 42,316, 42,366, 9,366,], 'body'=>[ 46,323,143,307,159,372, 44,374,], 'legs'=>[ 53,193, 58,193,103,193,108,193,158,312, 71,320,], 'ex'=>0 },
+{ 'x'=> 4, 'y'=>173, 'w'=>167, 'h'=>213, 'head'=>[ 11,316, 39,316, 39,366, 11,366,], 'body'=>[ 51,323,162,317,156,380, 48,372,], 'legs'=>[108,187,113,187,158,187,163,187,162,311,101,308,], 'ex'=>0 },
+{ 'x'=> 5, 'y'=>184, 'w'=>195, 'h'=>202, 'head'=>[ 12,315, 41,315, 41,365, 12,365,], 'body'=>[ 46,328,161,320,156,380, 45,368,], 'legs'=>[136,255,158,186,189,202,181,236,167,320,115,319,], 'ex'=>0 },
+{ 'x'=> 8, 'y'=>226, 'w'=>255, 'h'=>160, 'head'=>[ 17,313, 48,313, 48,363, 17,363,], 'body'=>[ 57,325,166,325,154,382, 53,372,], 'legs'=>[212,239,217,239,262,239,267,239,178,361,135,320,], 'ex'=>0 },
+{ 'x'=> 10, 'y'=>262, 'w'=>277, 'h'=>124, 'head'=>[ 11,333, 56,333, 56,358, 11,358,], 'body'=>[ 54,319,175,319,175,374, 54,374,], 'legs'=>[162,311,160,305,287,262,280,302,166,386,166,381,], 'ex'=>0 },
+{ 'x'=> 13, 'y'=>307, 'w'=>288, 'h'=> 79, 'head'=>[ 13,329, 58,329, 58,365, 13,365,], 'body'=>[ 58,315,184,315,184,370, 58,370,], 'legs'=>[174,315,174,310,301,318,301,371,174,386,174,381,], 'ex'=>1 },
+{ 'x'=> 18, 'y'=>299, 'w'=>283, 'h'=> 90, 'head'=>[ 20,306, 65,306, 65,340, 20,340,], 'body'=>[ 56,321,180,321,180,376, 56,376,], 'legs'=>[177,321,178,316,297,320,298,369,188,373,177,367,], 'ex'=>0 },
+{ 'x'=> 25, 'y'=>284, 'w'=>275, 'h'=>105, 'head'=>[ 25,291, 70,291, 70,326, 25,326,], 'body'=>[ 61,323,181,323,181,378, 61,378,], 'legs'=>[175,323,182,318,297,327,300,389,180,389,180,384,], 'ex'=>0 },
+{ 'x'=> 50, 'y'=>252, 'w'=>249, 'h'=>137, 'head'=>[ 53,262, 98,262, 98,294, 53,294,], 'body'=>[ 64,315,171,315,171,370, 64,370,], 'legs'=>[177,315,218,314,291,326,287,370,204,369,175,370,], 'ex'=>0 },
+{ 'x'=> 78, 'y'=>237, 'w'=>209, 'h'=>152, 'head'=>[ 89,237,125,237,125,287, 89,287,], 'body'=>[ 85,282,140,282,140,340, 85,340,], 'legs'=>[ 93,330, 98,330,143,330,197,292,214,346,118,394,], 'ex'=>0 },
+{ 'x'=> 86, 'y'=>232, 'w'=>188, 'h'=>154, 'head'=>[109,232,147,232,147,282,109,282,], 'body'=>[ 96,278,151,278,151,337, 96,337,], 'legs'=>[ 86,335,116,326,162,308,186,280,200,337,141,387,], 'ex'=>0 },
+{ 'x'=>105, 'y'=>226, 'w'=>141, 'h'=>161, 'head'=>[128,226,167,226,167,276,128,276,], 'body'=>[107,271,162,271,162,334,107,334,], 'legs'=>[107,324,112,324,166,275,175,273,183,373,111,387,], 'ex'=>0 },
+{ 'x'=>116, 'y'=>224, 'w'=>114, 'h'=>163, 'head'=>[147,224,187,224,187,274,147,274,], 'body'=>[127,268,182,268,182,332,127,332,], 'legs'=>[119,323,124,323,169,323,193,279,227,363,118,387,], 'ex'=>0 },
+{ 'x'=>124, 'y'=>231, 'w'=>107, 'h'=>156, 'head'=>[175,231,222,231,222,281,175,281,], 'body'=>[146,266,201,266,201,326,146,326,], 'legs'=>[132,326,137,326,182,326,206,303,227,365,124,387,], 'ex'=>0 },
+{ 'x'=>134, 'y'=>227, 'w'=>124, 'h'=>157, 'head'=>[190,227,246,227,246,277,190,277,], 'body'=>[160,258,215,258,215,319,160,319,], 'legs'=>[140,323,148,304,187,310,223,303,229,384,135,384,], 'ex'=>0 },
+{ 'x'=>136, 'y'=>197, 'w'=>129, 'h'=>177, 'head'=>[200,197,251,197,251,247,200,247,], 'body'=>[167,227,222,227,222,298,144,290,], 'legs'=>[193,319,139,315,143,282,228,294,238,374,190,374,], 'ex'=>0 },
+{ 'x'=>134, 'y'=>178, 'w'=>142, 'h'=>195, 'head'=>[203,178,252,178,252,228,203,228,], 'body'=>[164,214,219,214,219,294,164,294,], 'legs'=>[192,307,147,293,214,268,227,289,229,374,191,373,], 'ex'=>0 },
+{ 'x'=>129, 'y'=>136, 'w'=>171, 'h'=>241, 'head'=>[206,136,246,136,246,186,206,186,], 'body'=>[189,171,231,194,186,257,131,251,], 'legs'=>[177,297,134,256,191,246,216,274,228,377,155,377,], 'ex'=>0 },
+{ 'x'=>128, 'y'=>116, 'w'=>176, 'h'=>258, 'head'=>[208,122,245,122,245,172,208,172,], 'body'=>[181,154,226,170,193,254,131,261,], 'legs'=>[154,262,159,262,194,240,209,262,231,374,128,374,], 'ex'=>0 },
+{ 'x'=>105, 'y'=> 92, 'w'=>193, 'h'=>297, 'head'=>[186, 92,222, 92,222,142,186,142,], 'body'=>[144,137,199,137,199,268,144,268,], 'legs'=>[144,258,149,258,194,258,199,258,229,389,105,389,], 'ex'=>1 },
+{ 'x'=>103, 'y'=> 84, 'w'=>172, 'h'=>309, 'head'=>[164, 84,200, 84,200,134,164,134,], 'body'=>[132,129,187,129,187,266,132,266,], 'legs'=>[132,256,137,256,182,256,187,256,229,393,104,393,], 'ex'=>1 },
+{ 'x'=>102, 'y'=> 78, 'w'=>159, 'h'=>306, 'head'=>[146, 78,181, 78,181,128,146,128,], 'body'=>[122,123,177,123,177,258,122,258,], 'legs'=>[122,248,127,248,172,248,177,248,227,384,103,384,], 'ex'=>1 },
+{ 'x'=>204, 'y'=> 72, 'w'=>142, 'h'=>311, 'head'=>[243, 72,275, 72,275,122,243,122,], 'body'=>[229,117,284,117,284,255,229,255,], 'legs'=>[229,245,234,245,279,245,284,245,315,383,204,383,], 'ex'=>1 },
+{ 'x'=>204, 'y'=> 72, 'w'=>126, 'h'=>306, 'head'=>[251, 72,291, 72,291,122,251,122,], 'body'=>[233,117,288,117,288,252,233,252,], 'legs'=>[233,242,238,242,283,242,288,242,313,378,205,378,], 'ex'=>1 },
+{ 'x'=>206, 'y'=> 74, 'w'=>110, 'h'=>305, 'head'=>[264, 74,294, 74,294,124,264,124,], 'body'=>[237,119,292,119,292,254,237,254,], 'legs'=>[237,244,242,244,287,244,292,244,312,379,207,379,], 'ex'=>1 },
+{ 'x'=>208, 'y'=> 80, 'w'=>106, 'h'=>291, 'head'=>[267, 80,297, 80,297,130,267,130,], 'body'=>[234,125,289,125,289,253,234,253,], 'legs'=>[234,243,239,243,284,243,289,243,311,371,208,371,], 'ex'=>1 },
+{ 'x'=>206, 'y'=> 84, 'w'=>108, 'h'=>286, 'head'=>[263, 84,298, 84,298,134,263,134,], 'body'=>[232,129,287,129,287,254,232,254,], 'legs'=>[232,244,237,244,282,244,287,244,311,370,207,370,], 'ex'=>1 },
+{ 'x'=>205, 'y'=> 84, 'w'=>106, 'h'=>283, 'head'=>[250, 84,284, 84,284,134,250,134,], 'body'=>[221,129,276,129,276,253,221,253,], 'legs'=>[221,243,226,243,271,243,276,243,309,367,206,367,], 'ex'=>1 },
+{ 'x'=>203, 'y'=> 78, 'w'=>101, 'h'=>288, 'head'=>[231, 78,260, 78,260,128,231,128,], 'body'=>[211,123,266,123,266,249,211,249,], 'legs'=>[211,239,216,239,261,239,266,239,303,366,205,366,], 'ex'=>1 },
+{ 'x'=>198, 'y'=> 79, 'w'=>113, 'h'=>291, 'head'=>[220, 79,250, 79,250,129,220,129,], 'body'=>[207,124,262,124,262,252,207,252,], 'legs'=>[207,242,212,242,257,242,262,242,309,370,201,370,], 'ex'=>1 },
+{ 'x'=>195, 'y'=> 80, 'w'=>113, 'h'=>290, 'head'=>[205, 80,236, 80,236,130,205,130,], 'body'=>[204,125,259,125,259,252,204,252,], 'legs'=>[204,242,209,242,254,242,259,242,306,370,202,370,], 'ex'=>1 },
+{ 'x'=>196, 'y'=> 80, 'w'=>114, 'h'=>285, 'head'=>[206, 80,237, 80,237,130,206,130,], 'body'=>[204,125,259,125,259,250,204,250,], 'legs'=>[204,240,209,240,254,240,259,240,308,365,203,365,], 'ex'=>1 },
+{ 'x'=>198, 'y'=> 81, 'w'=>110, 'h'=>289, 'head'=>[207, 81,238, 81,238,131,207,131,], 'body'=>[206,126,261,126,261,253,206,253,], 'legs'=>[206,243,211,243,256,243,261,243,305,370,201,370,], 'ex'=>1 },
+{ 'x'=>186, 'y'=> 72, 'w'=>179, 'h'=>308, 'head'=>[221, 72,254, 72,254,122,221,122,], 'body'=>[206,117,261,117,261,253,206,253,], 'legs'=>[206,243,211,243,256,243,261,243,292,380,186,380,], 'ex'=>1 },
+{ 'x'=>204, 'y'=> 80, 'w'=>187, 'h'=>303, 'head'=>[233, 80,267, 80,267,130,233,130,], 'body'=>[219,125,274,125,274,259,219,259,], 'legs'=>[219,249,224,249,269,249,274,249,316,383,204,383,], 'ex'=>1 },
+{ 'x'=>193, 'y'=> 89, 'w'=>180, 'h'=>297, 'head'=>[224, 89,258, 89,258,139,224,139,], 'body'=>[212,134,267,134,267,265,212,265,], 'legs'=>[212,255,217,255,262,255,267,255,314,386,193,386,], 'ex'=>1 },
+{ 'x'=>185, 'y'=>106, 'w'=>167, 'h'=>284, 'head'=>[212,106,245,106,245,156,212,156,], 'body'=>[203,151,258,151,258,275,203,275,], 'legs'=>[203,265,208,265,253,265,258,265,317,390,191,390,], 'ex'=>1 },
+{ 'x'=>176, 'y'=>128, 'w'=>145, 'h'=>262, 'head'=>[202,128,236,128,236,178,202,178,], 'body'=>[205,173,260,173,260,286,205,286,], 'legs'=>[205,276,210,276,255,276,260,276,318,390,185,390,], 'ex'=>1 },
+{ 'x'=>163, 'y'=>145, 'w'=>157, 'h'=>244, 'head'=>[193,145,227,145,227,195,193,195,], 'body'=>[214,187,269,187,269,291,214,291,], 'legs'=>[198,284,203,284,248,284,253,284,319,389,184,389,], 'ex'=>0 },
+{ 'x'=>165, 'y'=>163, 'w'=>154, 'h'=>227, 'head'=>[183,163,226,163,226,213,183,213,], 'body'=>[199,208,254,208,254,304,199,304,], 'legs'=>[199,294,204,294,249,294,254,294,317,390,182,390,], 'ex'=>1 },
+{ 'x'=>208, 'y'=> 72, 'w'=>157, 'h'=>311, 'head'=>[243, 72,275, 72,275,122,243,122,], 'body'=>[229,117,284,117,284,255,229,255,], 'legs'=>[229,245,234,245,279,245,284,245,310,383,208,383,], 'ex'=>1 },
+{ 'x'=>209, 'y'=> 69, 'w'=>128, 'h'=>313, 'head'=>[241, 69,271, 69,271,119,241,119,], 'body'=>[230,114,285,114,285,253,230,253,], 'legs'=>[230,243,235,243,280,243,285,243,314,382,210,382,], 'ex'=>1 },
+{ 'x'=>211, 'y'=> 68, 'w'=>106, 'h'=>312, 'head'=>[239, 68,268, 68,268,118,239,118,], 'body'=>[225,113,280,113,280,251,225,251,], 'legs'=>[225,241,230,241,275,241,280,241,315,380,214,380,], 'ex'=>1 },
+{ 'x'=>205, 'y'=> 68, 'w'=>109, 'h'=>317, 'head'=>[230, 68,256, 68,256,118,230,118,], 'body'=>[213,113,268,113,268,254,213,254,], 'legs'=>[213,244,218,244,263,244,268,244,311,385,210,385,], 'ex'=>1 },
+{ 'x'=>196, 'y'=> 64, 'w'=>111, 'h'=>316, 'head'=>[221, 64,248, 64,248,114,221,114,], 'body'=>[206,109,261,109,261,249,206,249,], 'legs'=>[206,239,211,239,256,239,261,239,305,380,203,380,], 'ex'=>1 },
+{ 'x'=>189, 'y'=> 65, 'w'=> 91, 'h'=>314, 'head'=>[216, 65,244, 65,244,115,216,115,], 'body'=>[202,110,257,110,257,249,202,249,], 'legs'=>[202,239,207,239,252,239,257,239,272,379,203,379,], 'ex'=>1 },
+{ 'x'=>179, 'y'=> 67, 'w'=>113, 'h'=>310, 'head'=>[217, 67,246, 67,246,117,217,117,], 'body'=>[198,112,253,112,253,249,198,249,], 'legs'=>[198,239,203,239,248,239,253,239,270,377,203,377,], 'ex'=>1 },
+{ 'x'=>176, 'y'=> 72, 'w'=>121, 'h'=>310, 'head'=>[217, 72,243, 72,243,122,217,122,], 'body'=>[194,117,249,117,249,254,194,254,], 'legs'=>[194,244,199,244,244,244,249,244,272,382,202,382,], 'ex'=>1 },
+{ 'x'=>185, 'y'=> 72, 'w'=>111, 'h'=>304, 'head'=>[210, 72,236, 72,236,122,210,122,], 'body'=>[196,117,251,117,251,251,196,251,], 'legs'=>[196,241,201,241,246,241,251,241,271,376,191,376,], 'ex'=>1 },
+{ 'x'=>158, 'y'=> 69, 'w'=>124, 'h'=>305, 'head'=>[201, 69,227, 69,227,119,201,119,], 'body'=>[195,114,250,114,250,249,195,249,], 'legs'=>[195,239,200,239,245,239,250,239,269,374,159,374,], 'ex'=>1 },
+{ 'x'=>131, 'y'=> 68, 'w'=>138, 'h'=>305, 'head'=>[190, 68,216, 68,216,118,190,118,], 'body'=>[187,113,242,113,242,248,187,248,], 'legs'=>[187,238,192,238,237,238,242,238,266,373,132,373,], 'ex'=>1 },
+{ 'x'=>117, 'y'=> 73, 'w'=>152, 'h'=>302, 'head'=>[182, 73,209, 73,209,123,182,123,], 'body'=>[176,118,231,118,231,251,176,251,], 'legs'=>[176,241,181,241,226,241,231,241,267,375,118,375,], 'ex'=>1 },
+{ 'x'=>115, 'y'=> 74, 'w'=>154, 'h'=>306, 'head'=>[166, 74,192, 74,192,124,166,124,], 'body'=>[166,119,221,119,221,254,166,254,], 'legs'=>[166,244,171,244,216,244,221,244,266,380,116,380,], 'ex'=>1 },
+{ 'x'=>114, 'y'=> 72, 'w'=>157, 'h'=>308, 'head'=>[154, 72,181, 72,181,122,154,122,], 'body'=>[150,117,205,117,205,253,150,253,], 'legs'=>[150,243,155,243,200,243,205,243,269,380,115,380,], 'ex'=>1 },
+{ 'x'=>114, 'y'=> 69, 'w'=>153, 'h'=>310, 'head'=>[142, 69,169, 69,169,119,142,119,], 'body'=>[135,114,190,114,190,251,135,251,], 'legs'=>[135,241,140,241,185,241,190,241,266,379,116,379,], 'ex'=>1 },
+{ 'x'=>114, 'y'=> 65, 'w'=>132, 'h'=>314, 'head'=>[136, 65,164, 65,164,115,136,115,], 'body'=>[128,110,183,110,183,249,128,249,], 'legs'=>[128,239,133,239,178,239,183,239,244,379,115,379,], 'ex'=>1 },
+{ 'x'=>111, 'y'=> 58, 'w'=> 94, 'h'=>313, 'head'=>[133, 58,160, 58,160,108,133,108,], 'body'=>[121,103,176,103,176,242,121,242,], 'legs'=>[121,232,126,232,171,232,176,232,190,371,120,371,], 'ex'=>1 },
+{ 'x'=>112, 'y'=> 62, 'w'=>124, 'h'=>318, 'head'=>[137, 62,166, 62,166,112,137,112,], 'body'=>[121,107,176,107,176,248,121,248,], 'legs'=>[121,238,126,238,171,238,176,238,180,380,115,380,], 'ex'=>1 },
+{ 'x'=>104, 'y'=> 56, 'w'=>117, 'h'=>320, 'head'=>[134, 56,161, 56,161,106,134,106,], 'body'=>[114,101,169,101,169,243,114,243,], 'legs'=>[114,233,119,233,164,233,169,233,181,376,108,376,], 'ex'=>1 },
+{ 'x'=>204, 'y'=> 67, 'w'=>155, 'h'=>315, 'head'=>[257, 67,285, 67,285,117,257,117,], 'body'=>[240,112,295,112,295,252,240,252,], 'legs'=>[240,242,245,242,290,242,295,242,311,382,205,382,], 'ex'=>1 },
+{ 'x'=>197, 'y'=> 78, 'w'=>135, 'h'=>298, 'head'=>[255, 78,296, 78,296,128,255,128,], 'body'=>[237,123,292,123,292,254,237,254,], 'legs'=>[237,244,242,244,287,244,292,244,319,376,198,376,], 'ex'=>1 },
+{ 'x'=>189, 'y'=> 98, 'w'=>135, 'h'=>284, 'head'=>[223, 98,272, 98,272,148,223,148,], 'body'=>[225,143,280,143,280,267,225,267,], 'legs'=>[225,257,230,257,275,257,280,257,321,382,190,382,], 'ex'=>1 },
+{ 'x'=>185, 'y'=>111, 'w'=>133, 'h'=>271, 'head'=>[192,111,235,111,240,161,192,161,], 'body'=>[216,129,271,129,271,247,216,247,], 'legs'=>[213,264,222,245,279,233,297,247,316,382,190,382,], 'ex'=>0 },
+{ 'x'=>174, 'y'=>123, 'w'=>139, 'h'=>260, 'head'=>[179,123,214,124,214,172,179,173,], 'body'=>[210,130,265,130,290,239,220,260,], 'legs'=>[210,270,215,270,262,244,290,247,311,383,188,383,], 'ex'=>0 },
+{ 'x'=>204, 'y'=> 75, 'w'=>185, 'h'=>308, 'head'=>[244, 75,277, 75,277,125,244,125,], 'body'=>[229,119,284,119,284,255,229,255,], 'legs'=>[223,246,228,246,273,246,296,243,304,383,204,383,], 'ex'=>0 },
+{ 'x'=>206, 'y'=>109, 'w'=>179, 'h'=>271, 'head'=>[246,109,282,109,282,159,246,159,], 'body'=>[227,154,282,154,282,272,227,272,], 'legs'=>[220,262,225,262,270,262,275,262,308,380,206,380,], 'ex'=>0 },
+{ 'x'=>200, 'y'=>139, 'w'=>184, 'h'=>249, 'head'=>[245,139,283,139,283,189,245,189,], 'body'=>[217,184,272,184,272,291,217,291,], 'legs'=>[217,281,222,281,267,281,312,292,306,388,202,388,], 'ex'=>0 },
+{ 'x'=>197, 'y'=>185, 'w'=>182, 'h'=>204, 'head'=>[238,185,276,185,276,235,238,235,], 'body'=>[217,230,272,230,272,314,217,314,], 'legs'=>[217,304,222,304,267,304,311,302,302,389,198,389,], 'ex'=>0 },
+{ 'x'=>191, 'y'=>211, 'w'=>182, 'h'=>179, 'head'=>[231,211,268,211,268,261,231,261,], 'body'=>[209,256,264,256,264,328,209,328,], 'legs'=>[209,318,214,318,259,318,294,307,296,390,192,390,], 'ex'=>0 },
+{ 'x'=>190, 'y'=>206, 'w'=>184, 'h'=>184, 'head'=>[230,206,264,206,264,256,230,256,], 'body'=>[206,251,261,251,261,325,206,325,], 'legs'=>[206,315,211,315,256,315,293,306,294,390,191,390,], 'ex'=>0 },
+{ 'x'=>190, 'y'=>206, 'w'=>181, 'h'=>187, 'head'=>[230,206,265,206,265,256,230,256,], 'body'=>[204,251,259,251,259,327,204,327,], 'legs'=>[204,317,209,317,254,317,298,306,294,393,190,393,], 'ex'=>0 },
+{ 'x'=>189, 'y'=>210, 'w'=>187, 'h'=>186, 'head'=>[229,210,265,210,265,260,229,260,], 'body'=>[203,255,258,255,258,330,203,330,], 'legs'=>[203,320,208,320,253,320,298,305,295,396,190,396,], 'ex'=>0 },
+{ 'x'=>190, 'y'=>215, 'w'=>156, 'h'=>173, 'head'=>[221,215,257,215,257,265,221,265,], 'body'=>[197,260,252,260,252,329,197,329,], 'legs'=>[197,319,202,319,247,319,292,310,292,388,194,388,], 'ex'=>0 },
+{ 'x'=>176, 'y'=>216, 'w'=>189, 'h'=>171, 'head'=>[220,216,262,216,262,266,220,266,], 'body'=>[194,261,249,261,249,329,194,329,], 'legs'=>[194,319,199,319,244,319,291,304,293,387,195,387,], 'ex'=>0 },
+{ 'x'=>167, 'y'=>223, 'w'=>214, 'h'=>165, 'head'=>[243,221,269,223,269,273,235,275,], 'body'=>[218,265,273,265,273,330,218,330,], 'legs'=>[205,323,210,323,255,323,297,310,294,388,195,388,], 'ex'=>0 },
+{ 'x'=>183, 'y'=>222, 'w'=>206, 'h'=>167, 'head'=>[230,238,279,238,279,288,230,288,], 'body'=>[225,265,280,265,280,331,225,331,], 'legs'=>[208,323,213,323,258,323,301,315,293,389,194,389,], 'ex'=>0 },
+{ 'x'=>186, 'y'=>224, 'w'=>201, 'h'=>163, 'head'=>[235,245,284,245,284,295,235,295,], 'body'=>[231,271,286,271,286,335,231,335,], 'legs'=>[209,323,214,323,259,323,299,321,297,376,194,387,], 'ex'=>0, 'hit'=>[288,281,386,313,370,334,285,309,] },
+{ 'x'=>177, 'y'=>223, 'w'=>168, 'h'=>167, 'head'=>[221,231,257,231,257,281,221,281,], 'body'=>[210,264,265,264,265,330,210,330,], 'legs'=>[184,324,189,324,234,324,288,316,296,390,196,390,], 'ex'=>0 },
+{ 'x'=>151, 'y'=>218, 'w'=>192, 'h'=>171, 'head'=>[197,218,233,218,233,268,197,268,], 'body'=>[191,258,246,258,246,326,191,326,], 'legs'=>[162,321,167,321,212,321,281,304,295,389,195,389,], 'ex'=>0 },
+{ 'x'=>132, 'y'=>223, 'w'=>204, 'h'=>167, 'head'=>[181,223,226,223,226,273,181,273,], 'body'=>[182,258,237,258,237,324,182,324,], 'legs'=>[141,324,146,324,191,324,275,295,318,364,195,390,], 'ex'=>0 },
+{ 'x'=>131, 'y'=>226, 'w'=>224, 'h'=>163, 'head'=>[177,226,226,226,226,276,177,276,], 'body'=>[195,261,250,261,250,325,195,325,], 'legs'=>[145,325,150,325,280,297,345,333,326,363,194,389,], 'ex'=>0 },
+{ 'x'=>113, 'y'=>236, 'w'=>259, 'h'=>152, 'head'=>[183,237,227,237,227,287,188,287,], 'body'=>[179,278,234,278,234,336,179,336,], 'legs'=>[152,329,157,329,202,329,249,319,370,388,182,388,], 'ex'=>0, 'hit'=>[249,311,370,369,355,395,232,354,] },
+{ 'x'=>204, 'y'=> 75, 'w'=>160, 'h'=>301, 'head'=>[244, 75,276, 75,276,125,244,125,], 'body'=>[224,120,279,120,279,253,224,253,], 'legs'=>[224,243,229,243,274,243,279,243,314,376,204,376,], 'ex'=>1 },
+{ 'x'=>202, 'y'=> 73, 'w'=>130, 'h'=>306, 'head'=>[245, 73,275, 73,275,123,245,123,], 'body'=>[224,118,279,118,279,253,224,253,], 'legs'=>[224,243,229,243,274,243,279,243,313,379,204,379,], 'ex'=>1 },
+{ 'x'=>203, 'y'=> 72, 'w'=>115, 'h'=>303, 'head'=>[245, 72,279, 72,279,122,245,122,], 'body'=>[222,117,277,117,277,251,222,251,], 'legs'=>[222,241,227,241,272,241,277,241,315,375,203,375,], 'ex'=>1 },
+{ 'x'=>191, 'y'=> 72, 'w'=>127, 'h'=>303, 'head'=>[232, 72,274, 72,274,122,232,122,], 'body'=>[220,117,275,117,275,251,220,251,], 'legs'=>[220,241,225,241,270,241,275,241,315,375,203,375,], 'ex'=>1 },
+{ 'x'=>191, 'y'=> 74, 'w'=>128, 'h'=>305, 'head'=>[260, 80,292, 79,285,125,262,123,], 'body'=>[229,118,284,118,284,253,229,253,], 'legs'=>[218,244,223,244,268,244,287,242,316,379,202,379,], 'ex'=>0 },
+{ 'x'=>208, 'y'=> 76, 'w'=>176, 'h'=>307, 'head'=>[240, 76,271, 76,271,126,240,126,], 'body'=>[235,122,290,122,290,258,235,258,], 'legs'=>[227,247,232,247,277,247,303,247,319,383,210,383,], 'ex'=>0 },
+{ 'x'=>210, 'y'=> 75, 'w'=>176, 'h'=>305, 'head'=>[238, 75,267, 75,267,125,238,125,], 'body'=>[228,120,283,120,283,255,228,255,], 'legs'=>[228,245,233,245,278,245,300,245,316,380,210,380,], 'ex'=>0 },
+{ 'x'=>206, 'y'=> 75, 'w'=>175, 'h'=>307, 'head'=>[238, 75,268, 75,268,125,238,125,], 'body'=>[229,120,284,120,284,256,229,256,], 'legs'=>[229,246,234,246,279,246,300,244,319,382,208,382,], 'ex'=>0 },
+{ 'x'=>199, 'y'=> 77, 'w'=>170, 'h'=>306, 'head'=>[241, 77,275, 77,275,127,241,127,], 'body'=>[225,122,280,122,280,257,225,257,], 'legs'=>[225,247,230,247,275,247,280,247,314,383,200,383,], 'ex'=>1 },
+{ 'x'=>201, 'y'=> 72, 'w'=>148, 'h'=>312, 'head'=>[248, 72,283, 72,283,122,248,122,], 'body'=>[228,117,283,117,283,255,228,255,], 'legs'=>[228,245,233,245,278,245,283,245,315,384,202,384,], 'ex'=>1 },
+{ 'x'=>201, 'y'=> 70, 'w'=>131, 'h'=>314, 'head'=>[254, 70,290, 70,290,120,254,120,], 'body'=>[229,115,284,115,284,254,229,254,], 'legs'=>[229,244,234,244,279,244,284,244,315,384,201,384,], 'ex'=>1 },
+{ 'x'=>200, 'y'=> 71, 'w'=>122, 'h'=>313, 'head'=>[260, 71,296, 71,296,121,260,121,], 'body'=>[231,116,286,116,286,255,231,255,], 'legs'=>[231,245,236,245,281,245,286,245,315,384,202,384,], 'ex'=>1 },
+{ 'x'=>201, 'y'=> 73, 'w'=>121, 'h'=>310, 'head'=>[267, 73,304, 73,304,123,267,123,], 'body'=>[230,118,285,118,285,255,230,255,], 'legs'=>[230,245,235,245,280,245,285,245,316,383,202,383,], 'ex'=>1 },
+{ 'x'=>201, 'y'=> 77, 'w'=>125, 'h'=>306, 'head'=>[276, 77,313, 77,313,127,276,127,], 'body'=>[231,122,286,122,286,257,231,257,], 'legs'=>[231,247,236,247,281,247,286,247,316,383,202,383,], 'ex'=>1 },
+{ 'x'=>198, 'y'=> 76, 'w'=>155, 'h'=>307, 'head'=>[246, 76,278, 76,278,126,246,126,], 'body'=>[226,121,281,121,281,257,226,257,], 'legs'=>[226,247,231,247,276,247,281,247,337,383,198,383,], 'ex'=>1 },
+{ 'x'=>198, 'y'=> 75, 'w'=>190, 'h'=>308, 'head'=>[260, 75,291, 75,291,125,260,125,], 'body'=>[233,120,288,120,288,256,233,256,], 'legs'=>[233,246,238,246,283,246,288,246,336,383,199,383,], 'ex'=>1 },
+{ 'x'=>198, 'y'=> 79, 'w'=>217, 'h'=>304, 'head'=>[277, 79,321, 79,321,129,277,129,], 'body'=>[242,124,297,124,297,258,242,258,], 'legs'=>[242,248,247,248,292,248,297,248,333,383,199,383,], 'ex'=>1 },
+{ 'x'=>198, 'y'=> 86, 'w'=>231, 'h'=>296, 'head'=>[284, 87,338, 87,338,137,284,137,], 'body'=>[269,129,324,129,324,259,269,259,], 'legs'=>[254,251,259,251,304,251,330,251,338,382,199,382,], 'ex'=>0, 'hit'=>[331,124,435, 95,431,129,327,162,] },
+{ 'x'=>204, 'y'=> 78, 'w'=>160, 'h'=>301, 'head'=>[237, 78,270, 78,270,128,237,128,], 'body'=>[219,123,274,123,274,256,219,256,], 'legs'=>[219,246,224,246,269,246,274,246,314,379,204,379,], 'ex'=>1 },
+{ 'x'=>203, 'y'=> 77, 'w'=>139, 'h'=>304, 'head'=>[252, 77,285, 77,285,127,252,127,], 'body'=>[227,122,282,122,282,256,227,256,], 'legs'=>[227,246,232,246,277,246,282,246,329,381,205,381,], 'ex'=>1 },
+{ 'x'=>205, 'y'=> 83, 'w'=>163, 'h'=>298, 'head'=>[279, 83,311, 83,311,133,279,133,], 'body'=>[253,128,308,128,308,259,253,259,], 'legs'=>[253,249,258,249,303,249,308,249,335,381,205,381,], 'ex'=>1 },
+{ 'x'=>206, 'y'=> 96, 'w'=>189, 'h'=>286, 'head'=>[288, 96,323, 96,323,146,288,146,], 'body'=>[256,141,311,141,311,266,256,266,], 'legs'=>[256,256,261,256,306,256,311,256,334,382,206,382,], 'ex'=>1 },
+{ 'x'=>206, 'y'=>108, 'w'=>232, 'h'=>273, 'head'=>[291,108,333,108,333,158,291,158,], 'body'=>[258,153,313,153,313,272,258,272,], 'legs'=>[258,262,263,262,308,262,313,262,335,381,207,381,], 'ex'=>1 },
+{ 'x'=>206, 'y'=>124, 'w'=>240, 'h'=>256, 'head'=>[320,124,352,126,352,176,306,166,], 'body'=>[290,158,337,165,317,279,262,279,], 'legs'=>[262,269,267,269,312,269,327,267,334,380,207,380,], 'ex'=>0, 'hit'=>[357,162,452,158,434,188,344,185,] },
+{ 'x'=>198, 'y'=> 80, 'w'=>137, 'h'=>297, 'head'=>[233, 80,266, 80,266,130,233,130,], 'body'=>[229,125,284,125,284,256,229,256,], 'legs'=>[217,246,222,246,267,246,299,242,314,377,218,377,], 'ex'=>0 },
+{ 'x'=>172, 'y'=> 89, 'w'=>149, 'h'=>294, 'head'=>[212, 94,244, 94,244,144,212,144,], 'body'=>[225,136,280,136,297,256,225,265,], 'legs'=>[206,253,211,253,256,253,302,250,319,383,227,383,], 'ex'=>0 },
+{ 'x'=>159, 'y'=> 98, 'w'=>187, 'h'=>286, 'head'=>[196, 98,231, 98,231,148,196,148,], 'body'=>[199,143,254,143,298,237,236,266,], 'legs'=>[199,258,204,258,249,258,308,242,339,334,226,384,], 'ex'=>0 },
+{ 'x'=>147, 'y'=>106, 'w'=>269, 'h'=>293, 'head'=>[186,106,224,106,224,156,186,156,], 'body'=>[197,151,252,151,305,231,241,274,], 'legs'=>[235,272,247,260,261,260,271,265,270,399,236,399,], 'ex'=>0 },
+{ 'x'=>138, 'y'=>115, 'w'=>293, 'h'=>263, 'head'=>[178,115,226,115,226,165,178,165,], 'body'=>[189,160,244,160,244,274,189,274,], 'legs'=>[189,264,194,264,239,264,244,264,273,378,237,378,], 'ex'=>1 },
+{ 'x'=>138, 'y'=>123, 'w'=>291, 'h'=>263, 'head'=>[175,123,202,128,211,174,175,173,], 'body'=>[173,184,223,152,306,230,256,262,], 'legs'=>[243,281,257,256,281,239,295,258,279,386,236,386,], 'ex'=>0, 'hit'=>[292,202,428,141,434,167,314,239,] },
+{ 'x'=>204, 'y'=> 79, 'w'=>138, 'h'=>299, 'head'=>[247, 79,276, 79,276,129,247,129,], 'body'=>[225,124,280,124,280,256,225,256,], 'legs'=>[225,246,230,246,275,246,280,246,332,378,206,378,], 'ex'=>1 },
+{ 'x'=>184, 'y'=> 82, 'w'=>146, 'h'=>302, 'head'=>[225, 82,253, 82,253,132,225,132,], 'body'=>[215,127,270,127,270,260,215,260,], 'legs'=>[215,250,220,250,265,250,270,250,329,384,225,384,], 'ex'=>1 },
+{ 'x'=>156, 'y'=> 97, 'w'=>205, 'h'=>288, 'head'=>[193, 97,224, 97,224,147,193,147,], 'body'=>[198,142,253,142,253,268,198,268,], 'legs'=>[198,258,203,258,248,258,253,258,360,385,219,385,], 'ex'=>1 },
+{ 'x'=>149, 'y'=>106, 'w'=>260, 'h'=>278, 'head'=>[183,106,217,106,217,156,183,156,], 'body'=>[192,151,247,151,247,272,192,272,], 'legs'=>[192,262,197,262,242,262,247,262,257,384,219,384,], 'ex'=>1 },
+{ 'x'=>145, 'y'=>115, 'w'=>281, 'h'=>270, 'head'=>[174,115,209,115,209,165,174,165,], 'body'=>[175,183,227,154,304,229,236,280,], 'legs'=>[215,265,241,257,252,261,265,267,259,385,222,385,], 'ex'=>0, 'hit'=>[288,213,428,242,432,276,280,263,] },
+{ 'x'=>190, 'y'=> 80, 'w'=>166, 'h'=>302, 'head'=>[249, 80,282, 80,282,130,249,130,], 'body'=>[223,125,278,125,278,258,223,258,], 'legs'=>[223,248,228,248,273,248,278,248,327,382,191,382,], 'ex'=>1 },
+{ 'x'=>191, 'y'=> 96, 'w'=>138, 'h'=>287, 'head'=>[271, 96,304, 96,304,146,271,146,], 'body'=>[236,141,291,141,291,267,236,267,], 'legs'=>[236,257,241,257,286,257,291,257,328,383,192,383,], 'ex'=>1 },
+{ 'x'=>191, 'y'=>126, 'w'=>166, 'h'=>263, 'head'=>[296,126,328,126,328,176,296,176,], 'body'=>[257,171,312,171,312,285,257,285,], 'legs'=>[257,275,262,275,307,275,312,275,335,389,191,389,], 'ex'=>1 },
+{ 'x'=>252, 'y'=>162, 'w'=>117, 'h'=>227, 'head'=>[293,162,326,162,326,212,293,212,], 'body'=>[264,207,319,207,319,303,264,303,], 'legs'=>[264,293,269,293,314,293,319,293,341,389,254,389,], 'ex'=>1 },
+{ 'x'=>252, 'y'=>174, 'w'=>131, 'h'=>226, 'head'=>[288,174,320,174,320,224,288,224,], 'body'=>[289,210,344,210,344,305,289,305,], 'legs'=>[296,305,315,293,343,296,349,300,349,400,307,400,], 'ex'=>0 },
+{ 'x'=>252, 'y'=>187, 'w'=>220, 'h'=>196, 'head'=>[284,187,318,187,318,237,284,237,], 'body'=>[290,227,345,227,345,307,290,307,], 'legs'=>[280,302,285,302,330,302,388,286,357,381,320,382,], 'ex'=>0 },
+{ 'x'=>255, 'y'=>206, 'w'=>276, 'h'=>174, 'head'=>[285,206,320,206,320,256,285,256,], 'body'=>[289,244,344,244,344,313,289,313,], 'legs'=>[276,310,281,310,326,310,331,310,357,380,255,380,], 'ex'=>0, 'hit'=>[365,265,532,309,527,341,358,306,] },
+{ 'x'=>196, 'y'=> 80, 'w'=>158, 'h'=>303, 'head'=>[244, 80,276, 80,276,130,244,130,], 'body'=>[222,125,277,125,277,259,222,259,], 'legs'=>[222,249,227,249,272,249,290,244,317,383,197,383,], 'ex'=>0 },
+{ 'x'=>202, 'y'=> 80, 'w'=>128, 'h'=>297, 'head'=>[264, 80,297, 80,297,130,264,130,], 'body'=>[244,125,299,125,299,256,244,256,], 'legs'=>[244,246,249,246,294,246,299,246,328,377,203,377,], 'ex'=>1 },
+{ 'x'=>228, 'y'=> 80, 'w'=>108, 'h'=>286, 'head'=>[275, 80,306, 80,306,130,275,130,], 'body'=>[260,125,315,125,315,250,260,250,], 'legs'=>[260,240,265,240,310,240,315,240,333,366,230,366,], 'ex'=>1 },
+{ 'x'=>254, 'y'=> 82, 'w'=>108, 'h'=>285, 'head'=>[279, 82,310, 82,310,132,279,132,], 'body'=>[263,127,318,127,318,252,263,252,], 'legs'=>[263,242,268,242,313,242,318,242,337,367,286,367,], 'ex'=>1 },
+{ 'x'=>251, 'y'=> 88, 'w'=>148, 'h'=>275, 'head'=>[283, 88,315, 88,315,138,283,138,], 'body'=>[257,133,312,133,312,253,257,253,], 'legs'=>[257,243,262,243,307,243,312,243,397,363,304,363,], 'ex'=>1 },
+{ 'x'=>241, 'y'=> 93, 'w'=>217, 'h'=>269, 'head'=>[288, 93,321, 93,321,143,288,143,], 'body'=>[257,138,312,138,346,239,299,259,], 'legs'=>[297,255,306,236,324,241,340,244,343,362,308,362,], 'ex'=>0, 'hit'=>[346,206,463,189,453,224,345,252,] },
+{ 'x'=>209, 'y'=> 78, 'w'=>167, 'h'=>305, 'head'=>[241, 78,273, 78,273,128,241,128,], 'body'=>[227,123,282,123,282,258,227,258,], 'legs'=>[224,248,229,248,274,248,296,239,330,383,210,383,], 'ex'=>0 },
+{ 'x'=>207, 'y'=> 84, 'w'=>175, 'h'=>299, 'head'=>[263, 84,296, 84,296,134,263,134,], 'body'=>[244,129,299,129,299,261,244,261,], 'legs'=>[244,251,249,251,294,251,299,251,370,383,208,383,], 'ex'=>1 },
+{ 'x'=>215, 'y'=> 80, 'w'=>162, 'h'=>299, 'head'=>[289, 80,320, 80,320,130,289,130,], 'body'=>[276,125,331,125,331,257,276,257,], 'legs'=>[276,247,281,247,326,247,331,247,374,379,215,379,], 'ex'=>1 },
+{ 'x'=>245, 'y'=> 76, 'w'=>132, 'h'=>280, 'head'=>[301, 76,332, 76,332,126,301,126,], 'body'=>[289,121,344,121,344,243,289,243,], 'legs'=>[289,233,294,233,339,233,344,233,375,356,245,356,], 'ex'=>1 },
+{ 'x'=>289, 'y'=> 74, 'w'=>103, 'h'=>282, 'head'=>[311, 74,342, 74,342,124,311,124,], 'body'=>[298,119,353,119,353,242,298,242,], 'legs'=>[298,232,303,232,348,232,353,232,375,356,304,356,], 'ex'=>1 },
+{ 'x'=>293, 'y'=> 76, 'w'=>119, 'h'=>279, 'head'=>[317, 76,349, 76,349,126,317,126,], 'body'=>[301,121,356,121,356,243,301,243,], 'legs'=>[301,233,306,233,351,233,356,233,381,355,342,355,], 'ex'=>1 },
+{ 'x'=>283, 'y'=> 89, 'w'=>159, 'h'=>267, 'head'=>[324, 89,357, 89,357,139,324,139,], 'body'=>[309,134,364,134,364,250,309,250,], 'legs'=>[309,240,314,240,359,240,364,240,380,356,349,356,], 'ex'=>0, 'hit'=>[374,152,392,143,460,226,419,237,] },
+{ 'x'=>204, 'y'=> 84, 'w'=>149, 'h'=>299, 'head'=>[240, 84,273, 84,273,134,240,134,], 'body'=>[221,129,276,129,276,261,221,261,], 'legs'=>[221,251,226,251,271,251,276,251,327,383,205,383,], 'ex'=>1 },
+{ 'x'=>203, 'y'=> 90, 'w'=>171, 'h'=>294, 'head'=>[257, 90,289, 90,289,140,257,140,], 'body'=>[233,135,288,135,288,264,233,264,], 'legs'=>[233,254,238,254,283,254,288,254,372,384,203,384,], 'ex'=>1 },
+{ 'x'=>202, 'y'=> 80, 'w'=>185, 'h'=>304, 'head'=>[270, 80,309, 80,309,130,270,130,], 'body'=>[272,125,327,125,327,259,272,259,], 'legs'=>[272,249,277,249,322,249,327,249,384,384,203,384,], 'ex'=>1 },
+{ 'x'=>216, 'y'=> 79, 'w'=>170, 'h'=>299, 'head'=>[288, 79,325, 79,325,129,288,129,], 'body'=>[288,124,343,124,343,256,288,256,], 'legs'=>[288,246,293,246,338,246,343,246,380,378,217,378,], 'ex'=>1 },
+{ 'x'=>243, 'y'=> 73, 'w'=>131, 'h'=>282, 'head'=>[324, 73,359, 73,359,123,324,123,], 'body'=>[301,118,356,118,356,241,301,241,], 'legs'=>[301,231,306,231,351,231,356,231,372,355,243,355,], 'ex'=>1 },
+{ 'x'=>270, 'y'=> 93, 'w'=>141, 'h'=>262, 'head'=>[356, 93,400, 93,400,143,356,143,], 'body'=>[302,138,357,138,357,251,302,251,], 'legs'=>[302,241,307,241,352,241,357,241,376,355,271,355,], 'ex'=>0, 'hit'=>[377,103,411,104,407,152,374,145,] },
+{ 'x'=>299, 'y'=>131, 'w'=>131, 'h'=>228, 'head'=>[380,140,424,138,424,188,382,194,], 'body'=>[310,144,380,135,365,240,310,240,], 'legs'=>[323,272,313,235,347,230,361,234,383,359,310,359,], 'ex'=>0, 'hit'=>[385,147,430,143,430,194,388,199,] },
+{ 'x'=>204, 'y'=> 80, 'w'=>153, 'h'=>303, 'head'=>[242, 80,275, 80,275,130,242,130,], 'body'=>[226,125,281,125,281,259,226,259,], 'legs'=>[226,249,231,249,276,249,281,249,316,383,204,383,], 'ex'=>1 },
+{ 'x'=>204, 'y'=> 84, 'w'=>146, 'h'=>298, 'head'=>[269, 84,300, 84,300,134,269,134,], 'body'=>[252,129,307,129,307,260,252,260,], 'legs'=>[252,250,257,250,302,250,307,250,313,382,205,382,], 'ex'=>1 },
+{ 'x'=>266, 'y'=> 92, 'w'=> 89, 'h'=>284, 'head'=>[291, 92,316, 92,316,142,291,142,], 'body'=>[269,137,324,137,324,261,269,261,], 'legs'=>[269,251,274,251,319,251,324,251,325,376,278,376,], 'ex'=>1 },
+{ 'x'=>260, 'y'=> 96, 'w'=>105, 'h'=>280, 'head'=>[292, 96,320, 96,320,146,292,146,], 'body'=>[274,141,329,141,329,263,274,263,], 'legs'=>[274,253,279,253,324,253,329,253,353,376,284,376,], 'ex'=>1 },
+{ 'x'=>267, 'y'=> 98, 'w'=>117, 'h'=>275, 'head'=>[292, 98,326, 98,326,148,292,148,], 'body'=>[286,143,341,143,341,263,286,263,], 'legs'=>[286,253,291,253,336,253,341,253,382,373,287,373,], 'ex'=>1 },
+{ 'x'=>283, 'y'=>108, 'w'=>103, 'h'=>258, 'head'=>[290,108,327,108,327,158,290,158,], 'body'=>[302,153,357,153,357,264,302,264,], 'legs'=>[302,254,307,254,352,254,357,254,384,366,298,366,], 'ex'=>1 },
+{ 'x'=>283, 'y'=>118, 'w'=>119, 'h'=>249, 'head'=>[289,118,328,118,328,168,289,168,], 'body'=>[312,163,367,163,367,270,312,270,], 'legs'=>[312,260,317,260,362,260,367,260,390,367,356,367,], 'ex'=>1 },
+{ 'x'=>284, 'y'=>121, 'w'=>165, 'h'=>242, 'head'=>[289,121,327,121,327,171,289,171,], 'body'=>[323,166,378,166,378,269,323,269,], 'legs'=>[323,259,328,259,373,259,378,259,394,363,360,363,], 'ex'=>1 },
+{ 'x'=>280, 'y'=>116, 'w'=>235, 'h'=>254, 'head'=>[288,116,319,116,319,166,288,166,], 'body'=>[329,161,384,161,384,270,329,270,], 'legs'=>[329,260,334,260,379,260,384,260,394,370,362,370,], 'ex'=>1 },
+{ 'x'=>278, 'y'=>111, 'w'=>266, 'h'=>256, 'head'=>[290,113,325,113,325,163,290,163,], 'body'=>[307,168,376,144,429,206,381,257,], 'legs'=>[364,263,374,231,386,255,407,237,405,366,369,366,], 'ex'=>0, 'hit'=>[431,190,531,183,535,217,426,225,] },
+{ 'x'=>209, 'y'=> 84, 'w'=>164, 'h'=>299, 'head'=>[243, 84,276, 84,276,134,243,134,], 'body'=>[234,129,289,129,289,261,234,261,], 'legs'=>[234,251,239,251,284,251,289,251,334,383,210,383,], 'ex'=>1 },
+{ 'x'=>210, 'y'=> 85, 'w'=>130, 'h'=>288, 'head'=>[241, 85,271, 85,271,135,241,135,], 'body'=>[230,130,285,130,285,256,230,256,], 'legs'=>[230,246,235,246,280,246,285,246,332,373,210,373,], 'ex'=>1 },
+{ 'x'=>209, 'y'=> 87, 'w'=>128, 'h'=>288, 'head'=>[237, 87,266, 87,266,137,237,137,], 'body'=>[225,132,280,132,280,258,225,258,], 'legs'=>[225,248,230,248,275,248,280,248,335,375,210,375,], 'ex'=>1 },
+{ 'x'=>198, 'y'=> 90, 'w'=>136, 'h'=>293, 'head'=>[232, 90,260, 90,260,140,232,140,], 'body'=>[214,135,269,135,269,264,214,264,], 'legs'=>[214,254,219,254,264,254,269,254,332,383,207,383,], 'ex'=>1 },
+{ 'x'=>191, 'y'=> 94, 'w'=>143, 'h'=>283, 'head'=>[226, 94,255, 94,255,144,226,144,], 'body'=>[206,139,261,139,261,263,206,263,], 'legs'=>[206,253,211,253,256,253,261,253,332,377,206,377,], 'ex'=>1 },
+{ 'x'=>186, 'y'=>100, 'w'=>149, 'h'=>278, 'head'=>[224,100,254,100,254,150,224,150,], 'body'=>[206,145,261,145,261,266,206,266,], 'legs'=>[206,256,211,256,256,256,261,256,332,378,204,378,], 'ex'=>1 },
+{ 'x'=>199, 'y'=>102, 'w'=>162, 'h'=>282, 'head'=>[242,102,276,102,276,152,242,152,], 'body'=>[220,147,275,147,275,270,220,270,], 'legs'=>[220,260,225,260,270,260,275,260,358,384,206,384,], 'ex'=>1 },
+{ 'x'=>208, 'y'=>102, 'w'=>158, 'h'=>275, 'head'=>[259,102,295,102,295,152,259,152,], 'body'=>[233,147,288,147,288,267,233,267,], 'legs'=>[233,257,238,257,283,257,288,257,363,377,210,377,], 'ex'=>1 },
+{ 'x'=>207, 'y'=>105, 'w'=>158, 'h'=>279, 'head'=>[279,105,318,105,318,155,279,155,], 'body'=>[247,150,302,150,302,272,247,272,], 'legs'=>[247,262,252,262,297,262,302,262,361,384,208,384,], 'ex'=>1 },
+{ 'x'=>209, 'y'=>108, 'w'=>155, 'h'=>275, 'head'=>[299,108,337,108,337,158,299,158,], 'body'=>[269,153,324,153,324,273,269,273,], 'legs'=>[269,263,274,263,319,263,324,263,361,383,211,383,], 'ex'=>1 },
+{ 'x'=>213, 'y'=>115, 'w'=>211, 'h'=>268, 'head'=>[323,115,367,115,367,165,323,165,], 'body'=>[280,160,335,160,335,276,280,276,], 'legs'=>[280,266,285,266,330,266,335,266,363,383,213,383,], 'ex'=>1 },
+{ 'x'=>215, 'y'=>129, 'w'=>262, 'h'=>254, 'head'=>[328,129,415,129,415,179,328,179,], 'body'=>[287,174,342,174,342,283,287,283,], 'legs'=>[287,273,292,273,337,273,342,273,366,383,215,383,], 'ex'=>0, 'hit'=>[448,158,458,158,464,172,448,168,] },
+{ 'x'=>222, 'y'=>108, 'w'=>216, 'h'=>272, 'head'=>[310,108,369,108,369,158,310,158,], 'body'=>[280,153,335,153,335,271,280,271,], 'legs'=>[280,261,285,261,330,261,335,261,372,380,222,380,], 'ex'=>1 },
+{ 'x'=>222, 'y'=>102, 'w'=>191, 'h'=>280, 'head'=>[298,102,340,102,340,152,298,152,], 'body'=>[272,147,327,147,327,269,272,269,], 'legs'=>[272,259,277,259,322,259,327,259,381,382,223,382,], 'ex'=>1 },
+{ 'x'=>220, 'y'=> 98, 'w'=>164, 'h'=>285, 'head'=>[281, 98,317, 98,317,148,281,148,], 'body'=>[261,143,316,143,316,268,261,268,], 'legs'=>[261,258,266,258,311,258,316,258,371,383,221,383,], 'ex'=>1 },
+{ 'x'=>225, 'y'=> 93, 'w'=>151, 'h'=>287, 'head'=>[271, 93,305, 93,305,143,271,143,], 'body'=>[253,138,308,138,308,264,253,264,], 'legs'=>[253,254,258,254,303,254,308,254,368,380,225,380,], 'ex'=>1 },
+{ 'x'=>220, 'y'=> 90, 'w'=>148, 'h'=>293, 'head'=>[261, 90,295, 90,295,140,261,140,], 'body'=>[245,135,300,135,300,264,245,264,], 'legs'=>[245,254,250,254,295,254,300,254,365,383,221,383,], 'ex'=>1 },
+{ 'x'=>225, 'y'=> 88, 'w'=>155, 'h'=>288, 'head'=>[255, 88,288, 88,288,138,255,138,], 'body'=>[238,133,293,133,293,259,238,259,], 'legs'=>[238,249,243,249,288,249,293,249,355,376,225,376,], 'ex'=>1 },
+{ 'x'=>204, 'y'=> 85, 'w'=>166, 'h'=>297, 'head'=>[246, 85,279, 85,279,135,246,135,], 'body'=>[221,130,276,130,276,261,221,261,], 'legs'=>[221,251,226,251,271,251,276,251,317,382,205,382,], 'ex'=>1 },
+{ 'x'=>206, 'y'=> 87, 'w'=>159, 'h'=>290, 'head'=>[252, 87,289, 87,289,137,252,137,], 'body'=>[225,132,280,132,280,259,225,259,], 'legs'=>[225,249,230,249,275,249,280,249,319,377,206,377,], 'ex'=>1 },
+{ 'x'=>206, 'y'=> 87, 'w'=>139, 'h'=>292, 'head'=>[253, 87,288, 87,288,137,253,137,], 'body'=>[229,132,284,132,284,260,229,260,], 'legs'=>[229,250,234,250,279,250,284,250,332,379,207,379,], 'ex'=>1 },
+{ 'x'=>203, 'y'=> 90, 'w'=>133, 'h'=>294, 'head'=>[265, 90,307, 90,307,140,265,140,], 'body'=>[241,135,296,135,296,264,241,264,], 'legs'=>[241,254,246,254,291,254,296,254,333,384,203,384,], 'ex'=>1 },
+{ 'x'=>208, 'y'=> 94, 'w'=>127, 'h'=>285, 'head'=>[276, 94,308, 94,308,144,276,144,], 'body'=>[256,139,311,139,311,264,256,264,], 'legs'=>[256,254,261,254,306,254,311,254,332,379,208,379,], 'ex'=>1 },
+{ 'x'=>206, 'y'=>100, 'w'=>155, 'h'=>283, 'head'=>[284,100,315,100,315,150,284,150,], 'body'=>[262,145,317,145,317,269,262,269,], 'legs'=>[262,259,267,259,312,259,317,259,333,383,206,383,], 'ex'=>1 },
+{ 'x'=>206, 'y'=>106, 'w'=>200, 'h'=>277, 'head'=>[292,106,323,106,323,156,292,156,], 'body'=>[264,151,319,151,319,272,264,272,], 'legs'=>[264,262,269,262,314,262,319,262,333,383,206,383,], 'ex'=>0, 'hit'=>[365,164,408,148,412,178,361,185,] },
+{ 'x'=>207, 'y'=> 90, 'w'=>168, 'h'=>293, 'head'=>[313,116,340,116,340,166,313,166,], 'body'=>[274,135,329,135,329,264,274,264,], 'legs'=>[274,254,279,254,324,254,329,254,334,383,207,383,], 'ex'=>0, 'hit'=>[348, 65,411,131,360,171,343,161,] },
+{ 'x'=>204, 'y'=> 88, 'w'=>165, 'h'=>295, 'head'=>[238, 88,270, 88,270,138,238,138,], 'body'=>[221,133,276,133,276,263,221,263,], 'legs'=>[221,253,226,253,271,253,276,253,321,383,204,383,], 'ex'=>1 },
+{ 'x'=>198, 'y'=> 90, 'w'=>176, 'h'=>299, 'head'=>[252, 90,285, 90,285,140,252,140,], 'body'=>[232,135,287,135,287,267,232,267,], 'legs'=>[232,257,237,257,282,257,287,257,337,389,199,389,], 'ex'=>1 },
+{ 'x'=>200, 'y'=> 90, 'w'=>187, 'h'=>299, 'head'=>[263, 90,296, 90,296,140,263,140,], 'body'=>[241,135,296,135,296,267,241,267,], 'legs'=>[241,257,246,257,291,257,296,257,336,389,200,389,], 'ex'=>1 },
+{ 'x'=>207, 'y'=> 89, 'w'=>193, 'h'=>290, 'head'=>[270, 89,302, 89,302,139,270,139,], 'body'=>[250,134,305,134,305,261,250,261,], 'legs'=>[250,251,255,251,300,251,305,251,334,379,207,379,], 'ex'=>0, 'hit'=>[415,171,425,171,428,184,415,181,] },
+{ 'x'=>209, 'y'=> 87, 'w'=>193, 'h'=>293, 'head'=>[277, 87,310, 87,310,137,277,137,], 'body'=>[254,132,309,132,309,261,254,261,], 'legs'=>[254,251,259,251,304,251,309,251,337,380,211,380,], 'ex'=>0, 'hit'=>[421,101,431,101,437,114,421,111,] },
+{ 'x'=>224, 'y'=> 76, 'w'=>168, 'h'=>299, 'head'=>[296, 76,322, 76,322,126,296,126,], 'body'=>[262,121,317,121,317,253,262,253,], 'legs'=>[262,243,267,243,312,243,317,243,336,375,226,375,], 'ex'=>0, 'hit'=>[371, 44,381, 44,383, 54,371, 54,] },
+{ 'x'=>236, 'y'=> 57, 'w'=>131, 'h'=>316, 'head'=>[290, 83,309, 83,309,133,290,133,], 'body'=>[269,102,324,102,324,242,269,242,], 'legs'=>[269,232,274,232,319,232,324,232,334,373,237,373,], 'ex'=>0, 'hit'=>[312, 16,322, 16,328, 29,312, 26,] },
+{ 'x'=>237, 'y'=> 68, 'w'=>111, 'h'=>308, 'head'=>[281, 88,316, 88,316,138,281,138,], 'body'=>[268,113,323,113,323,249,268,249,], 'legs'=>[268,239,273,239,318,239,323,239,336,376,238,376,], 'ex'=>0, 'hit'=>[259, 37,269, 37,273, 52,259, 47,] },
+{ 'x'=>236, 'y'=> 86, 'w'=>105, 'h'=>288, 'head'=>[285, 86,315, 86,315,136,285,136,], 'body'=>[265,131,320,131,320,257,265,257,], 'legs'=>[265,247,270,247,315,247,320,247,338,374,238,374,], 'ex'=>0, 'hit'=>[178,103,188,103,196,116,178,113,] },
+{ 'x'=>221, 'y'=> 87, 'w'=>115, 'h'=>288, 'head'=>[285, 87,313, 87,313,137,285,137,], 'body'=>[258,132,313,132,313,258,258,258,], 'legs'=>[258,248,263,248,308,248,313,248,333,375,237,375,], 'ex'=>0, 'hit'=>[167,149,177,149,182,163,167,159,] },
+{ 'x'=>236, 'y'=> 84, 'w'=>102, 'h'=>293, 'head'=>[284, 84,310, 84,310,134,284,134,], 'body'=>[266,129,321,129,321,258,266,258,], 'legs'=>[266,248,271,248,316,248,321,248,335,377,237,377,], 'ex'=>1 },
+{ 'x'=>250, 'y'=> 85, 'w'=>119, 'h'=>291, 'head'=>[287, 85,314, 85,314,135,287,135,], 'body'=>[263,130,318,130,318,258,263,258,], 'legs'=>[263,248,268,248,313,248,318,248,366,376,266,376,], 'ex'=>1 },
+{ 'x'=>223, 'y'=> 87, 'w'=>158, 'h'=>288, 'head'=>[288, 87,318, 87,318,137,288,137,], 'body'=>[265,132,320,132,320,258,265,258,], 'legs'=>[265,248,270,248,315,248,320,248,380,375,272,375,], 'ex'=>1 },
+{ 'x'=>215, 'y'=> 92, 'w'=>178, 'h'=>291, 'head'=>[297, 92,329, 92,329,142,297,142,], 'body'=>[274,137,329,137,329,265,274,265,], 'legs'=>[274,255,279,255,324,255,329,255,391,383,267,383,], 'ex'=>1 },
+{ 'x'=>226, 'y'=> 93, 'w'=>160, 'h'=>285, 'head'=>[313, 93,345, 93,345,143,313,143,], 'body'=>[292,138,347,138,347,263,292,263,], 'legs'=>[292,253,297,253,342,253,347,253,385,378,260,378,], 'ex'=>1 },
+{ 'x'=>204, 'y'=>101, 'w'=>167, 'h'=>282, 'head'=>[259,101,292,101,292,151,259,151,], 'body'=>[232,146,287,146,287,269,232,269,], 'legs'=>[232,259,237,259,282,259,287,259,324,383,204,383,], 'ex'=>1 },
+{ 'x'=>204, 'y'=>105, 'w'=>156, 'h'=>279, 'head'=>[256,105,288,105,288,155,256,155,], 'body'=>[230,150,285,150,285,272,230,272,], 'legs'=>[230,262,235,262,280,262,285,262,322,384,204,384,], 'ex'=>1 },
+{ 'x'=>204, 'y'=> 93, 'w'=>153, 'h'=>290, 'head'=>[250, 93,275, 93,275,143,250,143,], 'body'=>[228,138,283,138,283,265,228,265,], 'legs'=>[228,255,233,255,278,255,283,255,323,383,204,383,], 'ex'=>1 },
+{ 'x'=>201, 'y'=>102, 'w'=>152, 'h'=>281, 'head'=>[209,102,245,102,245,152,209,152,], 'body'=>[228,147,283,147,283,270,228,270,], 'legs'=>[228,260,233,260,278,260,283,260,321,383,204,383,], 'ex'=>1 },
+{ 'x'=>180, 'y'=>124, 'w'=>166, 'h'=>261, 'head'=>[194,124,275,124,275,174,194,174,], 'body'=>[223,169,278,169,278,282,223,282,], 'legs'=>[223,272,228,272,273,272,278,272,324,385,200,385,], 'ex'=>1 },
+{ 'x'=>172, 'y'=>137, 'w'=>177, 'h'=>246, 'head'=>[184,137,204,137,217,183,184,187,], 'body'=>[216,147,271,147,287,245,231,252,], 'legs'=>[228,281,236,255,285,224,298,240,319,383,200,383,], 'ex'=>0 },
+{ 'x'=>204, 'y'=> 98, 'w'=>173, 'h'=>285, 'head'=>[259, 98,291, 98,291,148,259,148,], 'body'=>[239,143,294,143,294,268,239,268,], 'legs'=>[239,258,244,258,289,258,294,258,322,383,204,383,], 'ex'=>1 },
+{ 'x'=>198, 'y'=>110, 'w'=>141, 'h'=>280, 'head'=>[259,110,293,110,293,160,259,160,], 'body'=>[236,155,291,155,291,277,236,277,], 'legs'=>[236,267,241,267,286,267,291,267,318,390,199,390,], 'ex'=>1 },
+{ 'x'=>198, 'y'=>129, 'w'=>121, 'h'=>260, 'head'=>[255,129,295,129,295,179,255,179,], 'body'=>[230,174,285,174,285,286,230,286,], 'legs'=>[230,276,235,276,280,276,285,276,317,389,199,389,], 'ex'=>1 },
+{ 'x'=>200, 'y'=>116, 'w'=>124, 'h'=>268, 'head'=>[241,116,277,116,277,166,241,166,], 'body'=>[214,161,269,161,269,277,214,277,], 'legs'=>[214,267,219,267,264,267,269,267,321,384,201,384,], 'ex'=>1 },
+{ 'x'=>198, 'y'=>132, 'w'=>128, 'h'=>258, 'head'=>[237,132,277,132,277,182,237,182,], 'body'=>[215,177,270,177,270,288,215,288,], 'legs'=>[215,278,220,278,265,278,270,278,323,390,200,390,], 'ex'=>1 },
+{ 'x'=>204, 'y'=> 86, 'w'=>156, 'h'=>297, 'head'=>[251, 86,282, 86,282,136,251,136,], 'body'=>[236,131,291,131,291,262,236,262,], 'legs'=>[236,252,241,252,286,252,291,252,325,383,206,383,], 'ex'=>1 },
+{ 'x'=>205, 'y'=> 89, 'w'=>122, 'h'=>294, 'head'=>[254, 89,285, 89,285,139,254,139,], 'body'=>[237,134,292,134,292,263,237,263,], 'legs'=>[237,253,242,253,287,253,292,253,325,383,207,383,], 'ex'=>1 },
+{ 'x'=>205, 'y'=> 95, 'w'=>123, 'h'=>288, 'head'=>[255, 95,282, 95,282,145,255,145,], 'body'=>[238,140,293,140,293,266,238,266,], 'legs'=>[238,256,243,256,288,256,293,256,326,383,206,383,], 'ex'=>1 },
+{ 'x'=>205, 'y'=> 98, 'w'=>120, 'h'=>284, 'head'=>[258, 98,284, 98,284,148,258,148,], 'body'=>[235,143,290,143,290,267,235,267,], 'legs'=>[235,257,240,257,285,257,290,257,323,382,206,382,], 'ex'=>1 },
+{ 'x'=>205, 'y'=> 98, 'w'=>120, 'h'=>285, 'head'=>[255, 98,282, 98,282,148,255,148,], 'body'=>[233,143,288,143,288,268,233,268,], 'legs'=>[233,258,238,258,283,258,288,258,324,383,205,383,], 'ex'=>1 },
+{ 'x'=>205, 'y'=>105, 'w'=>121, 'h'=>280, 'head'=>[255,105,282,105,282,155,255,155,], 'body'=>[234,150,289,150,289,272,234,272,], 'legs'=>[234,262,239,262,284,262,289,262,324,385,205,385,], 'ex'=>1 },
+{ 'x'=>206, 'y'=>113, 'w'=>121, 'h'=>269, 'head'=>[258,113,285,113,285,163,258,163,], 'body'=>[236,158,291,158,291,275,236,275,], 'legs'=>[236,265,241,265,286,265,291,265,324,382,206,382,], 'ex'=>1 },
+{ 'x'=>205, 'y'=>125, 'w'=>122, 'h'=>255, 'head'=>[260,125,287,125,287,175,260,175,], 'body'=>[237,170,292,170,292,280,237,280,], 'legs'=>[237,270,242,270,287,270,292,270,325,380,205,380,], 'ex'=>1 },
+{ 'x'=>203, 'y'=>137, 'w'=>124, 'h'=>244, 'head'=>[260,137,286,137,286,187,260,187,], 'body'=>[236,182,291,182,291,286,236,286,], 'legs'=>[236,276,241,276,286,276,291,276,325,381,204,381,], 'ex'=>1 },
+{ 'x'=>204, 'y'=>150, 'w'=>123, 'h'=>236, 'head'=>[259,150,286,150,286,200,259,200,], 'body'=>[237,195,292,195,292,295,237,295,], 'legs'=>[237,285,242,285,287,285,292,285,325,386,205,386,], 'ex'=>1 },
+{ 'x'=>209, 'y'=>170, 'w'=>115, 'h'=>231, 'head'=>[255,170,282,170,282,220,255,220,], 'body'=>[239,215,294,215,294,313,239,313,], 'legs'=>[239,303,244,303,289,303,294,303,323,401,210,401,], 'ex'=>1 },
+{ 'x'=>209, 'y'=>165, 'w'=>115, 'h'=>232, 'head'=>[257,165,284,165,284,215,257,215,], 'body'=>[240,210,295,210,295,308,240,308,], 'legs'=>[240,298,245,298,290,298,295,298,323,397,210,397,], 'ex'=>1 },
+{ 'x'=>211, 'y'=>167, 'w'=>123, 'h'=>230, 'head'=>[270,167,305,167,305,217,270,217,], 'body'=>[239,212,294,212,294,309,239,309,], 'legs'=>[239,299,244,299,289,299,294,299,326,397,212,397,], 'ex'=>1 },
+{ 'x'=>209, 'y'=>162, 'w'=>141, 'h'=>226, 'head'=>[274,162,318,162,318,212,274,212,], 'body'=>[239,207,294,207,294,302,239,302,], 'legs'=>[239,292,244,292,289,292,294,292,331,388,210,388,], 'ex'=>1 },
+{ 'x'=>207, 'y'=>154, 'w'=>149, 'h'=>226, 'head'=>[287,154,327,154,327,204,287,204,], 'body'=>[244,199,299,199,299,294,244,294,], 'legs'=>[244,284,249,284,294,284,299,284,325,380,208,380,], 'ex'=>1 },
+{ 'x'=>206, 'y'=>128, 'w'=>159, 'h'=>251, 'head'=>[292,128,329,128,329,178,292,178,], 'body'=>[244,173,299,173,299,281,244,281,], 'legs'=>[244,271,249,271,294,271,299,271,320,379,207,379,], 'ex'=>1 },
+{ 'x'=>206, 'y'=>109, 'w'=>156, 'h'=>270, 'head'=>[289,109,326,109,326,159,289,159,], 'body'=>[245,154,300,154,300,271,245,271,], 'legs'=>[245,261,250,261,295,261,300,261,320,379,207,379,], 'ex'=>1 },
+{ 'x'=>204, 'y'=> 87, 'w'=>176, 'h'=>293, 'head'=>[282, 87,315, 87,315,137,282,137,], 'body'=>[246,132,301,132,301,261,246,261,], 'legs'=>[246,251,251,251,296,251,301,251,317,380,204,380,], 'ex'=>1 },
+{ 'x'=>203, 'y'=> 90, 'w'=>183, 'h'=>289, 'head'=>[264, 90,296, 90,296,140,264,140,], 'body'=>[241,135,296,135,296,262,241,262,], 'legs'=>[241,252,246,252,291,252,296,252,316,379,204,379,], 'ex'=>1 },
+{ 'x'=>191, 'y'=>219, 'w'=>175, 'h'=>163, 'head'=>[227,219,258,219,258,269,227,269,], 'body'=>[213,264,268,264,268,328,213,328,], 'legs'=>[213,318,218,318,263,318,268,318,298,382,193,382,], 'ex'=>1 },
+{ 'x'=>192, 'y'=>219, 'w'=>173, 'h'=>163, 'head'=>[212,219,245,219,245,269,212,269,], 'body'=>[212,264,267,264,267,328,212,328,], 'legs'=>[212,318,217,318,262,318,267,318,298,382,194,382,], 'ex'=>1 },
+{ 'x'=>182, 'y'=>226, 'w'=>165, 'h'=>157, 'head'=>[191,226,240,226,240,276,191,276,], 'body'=>[201,271,256,271,256,332,201,332,], 'legs'=>[201,322,206,322,251,322,256,322,298,383,194,383,], 'ex'=>1 },
+{ 'x'=>172, 'y'=>232, 'w'=>163, 'h'=>150, 'head'=>[181,232,238,232,238,282,181,282,], 'body'=>[196,277,251,277,251,334,196,334,], 'legs'=>[196,324,201,324,246,324,251,324,298,382,195,382,], 'ex'=>1 },
+{ 'x'=>191, 'y'=>227, 'w'=>167, 'h'=>158, 'head'=>[223,227,258,227,258,277,223,277,], 'body'=>[206,272,261,272,261,333,206,333,], 'legs'=>[206,323,211,323,256,323,261,323,297,385,193,385,], 'ex'=>1 },
+{ 'x'=>193, 'y'=>228, 'w'=>163, 'h'=>158, 'head'=>[224,228,258,228,258,278,224,278,], 'body'=>[206,273,261,273,261,334,206,334,], 'legs'=>[206,324,211,324,256,324,261,324,297,386,194,386,], 'ex'=>1 },
+{ 'x'=>193, 'y'=>229, 'w'=>161, 'h'=>155, 'head'=>[223,229,258,229,258,279,223,279,], 'body'=>[205,274,260,274,260,334,205,334,], 'legs'=>[205,324,210,324,255,324,260,324,297,384,194,384,], 'ex'=>1 },
+{ 'x'=>193, 'y'=>225, 'w'=>143, 'h'=>153, 'head'=>[221,225,257,225,257,275,221,275,], 'body'=>[203,270,258,270,258,329,203,329,], 'legs'=>[203,319,208,319,253,319,258,319,297,378,194,378,], 'ex'=>1 },
+{ 'x'=>193, 'y'=>241, 'w'=>115, 'h'=>137, 'head'=>[210,241,271,241,271,291,210,291,], 'body'=>[202,286,257,286,257,337,202,337,], 'legs'=>[202,327,207,327,252,327,257,327,296,378,194,378,], 'ex'=>1 },
+{ 'x'=>180, 'y'=>243, 'w'=>136, 'h'=>140, 'head'=>[198,243,245,243,245,293,198,293,], 'body'=>[202,288,257,288,257,340,202,340,], 'legs'=>[202,330,207,330,252,330,257,330,297,383,195,383,], 'ex'=>1 },
+{ 'x'=>164, 'y'=>247, 'w'=>150, 'h'=>137, 'head'=>[179,247,238,247,238,297,179,297,], 'body'=>[193,292,248,292,248,343,193,343,], 'legs'=>[193,333,198,333,243,333,248,333,298,384,192,384,], 'ex'=>1 },
+{ 'x'=>154, 'y'=> 89, 'w'=>174, 'h'=>310, 'head'=>[183, 89,216, 89,216,139,183,139,], 'body'=>[162,134,217,134,217,271,162,271,], 'legs'=>[162,261,167,261,212,261,217,261,268,399,163,399,], 'ex'=>1 },
+{ 'x'=>204, 'y'=> 79, 'w'=>131, 'h'=>304, 'head'=>[254, 79,287, 79,287,129,254,129,], 'body'=>[214,124,269,124,269,258,214,258,], 'legs'=>[214,248,219,248,264,248,269,248,308,383,204,383,], 'ex'=>1 },
+{ 'x'=>197, 'y'=> 90, 'w'=>125, 'h'=>293, 'head'=>[268, 90,313, 90,313,140,268,140,], 'body'=>[234,128,289,128,289,257,234,257,], 'legs'=>[213,254,218,254,263,254,268,254,309,383,205,383,], 'ex'=>0 },
+{ 'x'=>198, 'y'=>102, 'w'=>143, 'h'=>282, 'head'=>[303,107,345,105,345,155,291,155,], 'body'=>[244,126,299,126,299,249,244,249,], 'legs'=>[230,260,235,260,280,260,285,260,307,384,204,384,], 'ex'=>0 },
+{ 'x'=>202, 'y'=> 65, 'w'=>149, 'h'=>318, 'head'=>[314,111,346,111,346,161,314,161,], 'body'=>[262,131,318,139,300,249,245,249,], 'legs'=>[244,241,249,241,294,241,299,241,305,383,202,383,], 'ex'=>0 },
+{ 'x'=>190, 'y'=>106, 'w'=>199, 'h'=>267, 'head'=>[324,114,362,115,362,165,318,165,], 'body'=>[258,141,313,141,313,257,258,257,], 'legs'=>[226,239,248,257,293,257,298,257,305,373,190,373,], 'ex'=>0 },
+{ 'x'=>177, 'y'=>131, 'w'=>246, 'h'=>240, 'head'=>[348,130,382,131,382,181,339,180,], 'body'=>[306,143,359,169,305,249,239,239,], 'legs'=>[235,252,250,248,299,245,306,259,304,371,183,337,], 'ex'=>0 },
+{ 'x'=>167, 'y'=>141, 'w'=>261, 'h'=>228, 'head'=>[361,140,405,140,405,190,359,189,], 'body'=>[338,146,365,205,307,245,246,215,], 'legs'=>[269,270,279,238,309,246,311,263,309,366,274,366,], 'ex'=>0 },
+{ 'x'=>172, 'y'=>136, 'w'=>245, 'h'=>233, 'head'=>[369,145,412,144,412,194,374,193,], 'body'=>[342,148,383,196,295,260,261,220,], 'legs'=>[271,271,259,238,317,245,318,268,311,369,270,369,], 'ex'=>0 },
+{ 'x'=>185, 'y'=> 99, 'w'=>246, 'h'=>267, 'head'=>[394,163,425,163,425,213,394,213,], 'body'=>[376,161,396,214,315,257,269,212,], 'legs'=>[291,250,296,250,341,250,346,250,321,366,271,366,], 'ex'=>0 },
+{ 'x'=>193, 'y'=>137, 'w'=>267, 'h'=>229, 'head'=>[402,178,437,178,437,228,402,228,], 'body'=>[286,204,396,182,401,248,295,258,], 'legs'=>[270,269,275,269,320,269,325,269,319,366,271,366,], 'ex'=>0 },
+{ 'x'=>201, 'y'=>180, 'w'=>275, 'h'=>186, 'head'=>[412,198,447,198,447,248,416,247,], 'body'=>[307,209,413,191,418,256,315,255,], 'legs'=>[292,295,296,256,343,244,339,284,316,366,271,366,], 'ex'=>0 },
+{ 'x'=>206, 'y'=>187, 'w'=>275, 'h'=>180, 'head'=>[413,215,468,215,468,265,413,265,], 'body'=>[332,205,415,225,411,277,322,262,], 'legs'=>[307,294,305,266,355,264,362,294,312,361,273,367,], 'ex'=>0 },
+{ 'x'=>204, 'y'=> 88, 'w'=>146, 'h'=>295, 'head'=>[229, 88,260, 88,260,138,229,138,], 'body'=>[214,133,269,133,269,263,214,263,], 'legs'=>[214,253,219,253,264,253,269,253,301,383,205,383,], 'ex'=>1 },
+{ 'x'=>202, 'y'=> 94, 'w'=>137, 'h'=>298, 'head'=>[234, 94,267, 94,267,144,234,144,], 'body'=>[212,139,267,139,267,270,212,270,], 'legs'=>[212,260,217,260,262,260,267,260,302,392,213,392,], 'ex'=>1 },
+{ 'x'=>204, 'y'=>109, 'w'=>126, 'h'=>284, 'head'=>[235,109,269,109,269,159,235,159,], 'body'=>[211,154,266,154,266,278,211,278,], 'legs'=>[211,268,216,268,261,268,266,268,297,393,214,393,], 'ex'=>1 },
+{ 'x'=>215, 'y'=> 94, 'w'=>107, 'h'=>298, 'head'=>[234, 94,266, 94,266,144,234,144,], 'body'=>[220,139,275,139,275,270,220,270,], 'legs'=>[220,260,225,260,270,260,275,260,284,392,219,392,], 'ex'=>1 },
+{ 'x'=>217, 'y'=> 73, 'w'=> 93, 'h'=>324, 'head'=>[232, 73,262, 73,262,123,232,123,], 'body'=>[219,118,274,118,274,262,219,262,], 'legs'=>[219,252,224,252,269,252,274,252,261,397,217,397,], 'ex'=>1 },
+{ 'x'=>217, 'y'=> 60, 'w'=> 98, 'h'=>294, 'head'=>[236, 60,268, 60,268,110,236,110,], 'body'=>[221,105,276,105,276,234,221,234,], 'legs'=>[221,224,226,224,271,224,276,224,279,354,218,354,], 'ex'=>1 },
+{ 'x'=>220, 'y'=> 61, 'w'=>100, 'h'=>251, 'head'=>[249, 61,279, 61,279,111,249,111,], 'body'=>[222,106,277,106,277,214,222,214,], 'legs'=>[222,204,227,204,272,204,277,204,303,312,252,312,], 'ex'=>1 },
+{ 'x'=>218, 'y'=> 77, 'w'=>163, 'h'=>274, 'head'=>[253, 77,290, 77,290,127,253,127,], 'body'=>[224,122,279,122,279,241,224,241,], 'legs'=>[224,231,229,231,274,231,279,231,303,351,265,351,], 'ex'=>0, 'hit'=>[307,167,387,185,359,240,300,205,] },
+{ 'x'=>227, 'y'=> 71, 'w'=>171, 'h'=>279, 'head'=>[256, 71,297, 71,297,121,256,121,], 'body'=>[233,116,288,116,288,238,233,238,], 'legs'=>[233,228,238,228,283,228,288,228,294,350,267,350,], 'ex'=>0, 'hit'=>[281,167,387, 86,395,167,292,202,] },
+{ 'x'=>204, 'y'=> 70, 'w'=>149, 'h'=>313, 'head'=>[233, 70,263, 70,263,120,233,120,], 'body'=>[225,115,280,115,280,254,225,254,], 'legs'=>[225,244,230,244,275,244,280,244,324,383,205,383,], 'ex'=>1 },
+{ 'x'=>203, 'y'=> 73, 'w'=>129, 'h'=>310, 'head'=>[228, 73,258, 73,258,123,228,123,], 'body'=>[224,118,279,118,279,255,224,255,], 'legs'=>[224,245,229,245,274,245,279,245,323,383,204,383,], 'ex'=>1 },
+{ 'x'=>204, 'y'=> 76, 'w'=>124, 'h'=>307, 'head'=>[225, 76,254, 76,254,126,225,126,], 'body'=>[222,121,277,121,277,257,222,257,], 'legs'=>[222,247,227,247,272,247,277,247,325,383,205,383,], 'ex'=>1 },
+{ 'x'=>202, 'y'=> 80, 'w'=>124, 'h'=>304, 'head'=>[222, 80,251, 80,251,130,222,130,], 'body'=>[215,125,270,125,270,259,215,259,], 'legs'=>[215,249,220,249,265,249,270,249,324,384,204,384,], 'ex'=>1 },
+{ 'x'=>193, 'y'=> 80, 'w'=>134, 'h'=>304, 'head'=>[219, 80,248, 80,248,130,219,130,], 'body'=>[212,125,267,125,267,259,212,259,], 'legs'=>[212,249,217,249,262,249,267,249,325,384,204,384,], 'ex'=>1 },
+{ 'x'=>186, 'y'=> 79, 'w'=>139, 'h'=>304, 'head'=>[222, 79,250, 79,250,129,222,129,], 'body'=>[214,124,269,124,269,258,214,258,], 'legs'=>[214,248,219,248,264,248,269,248,322,383,204,383,], 'ex'=>1 },
+{ 'x'=>181, 'y'=> 76, 'w'=>145, 'h'=>306, 'head'=>[230, 76,258, 76,258,126,230,126,], 'body'=>[215,121,270,121,270,256,215,256,], 'legs'=>[215,246,220,246,265,246,270,246,323,382,203,382,], 'ex'=>1 },
+{ 'x'=>195, 'y'=> 72, 'w'=>131, 'h'=>311, 'head'=>[230, 72,281, 72,281,122,230,122,], 'body'=>[223,117,278,117,278,255,223,255,], 'legs'=>[223,245,228,245,273,245,278,245,323,383,204,383,], 'ex'=>1 },
+{ 'x'=>203, 'y'=> 72, 'w'=>123, 'h'=>311, 'head'=>[257, 72,301, 72,301,122,257,122,], 'body'=>[239,117,294,117,294,255,239,255,], 'legs'=>[239,245,244,245,289,245,294,245,323,383,204,383,], 'ex'=>1 },
+{ 'x'=>203, 'y'=> 73, 'w'=>136, 'h'=>310, 'head'=>[270, 73,314, 73,314,123,270,123,], 'body'=>[246,118,301,118,301,255,246,255,], 'legs'=>[246,245,251,245,296,245,301,245,321,383,204,383,], 'ex'=>1 },
+{ 'x'=>205, 'y'=> 76, 'w'=>188, 'h'=>306, 'head'=>[273, 76,306, 76,306,126,273,126,], 'body'=>[248,121,303,121,303,256,248,256,], 'legs'=>[248,246,253,246,298,246,303,246,324,382,206,382,], 'ex'=>1 },
+{ 'x'=>205, 'y'=> 76, 'w'=>191, 'h'=>307, 'head'=>[269, 76,299, 76,299,126,269,126,], 'body'=>[247,121,302,121,302,257,247,257,], 'legs'=>[247,247,252,247,297,247,302,247,324,383,205,383,], 'ex'=>0, 'hit'=>[380,122,390,122,397,138,380,132,] },
+{ 'x'=>202, 'y'=> 73, 'w'=>180, 'h'=>310, 'head'=>[255, 73,285, 73,285,123,255,123,], 'body'=>[237,118,292,118,292,255,237,255,], 'legs'=>[237,245,242,245,287,245,292,245,321,383,203,383,], 'ex'=>1 },
+{ 'x'=>204, 'y'=>206, 'w'=>159, 'h'=>176, 'head'=>[224,206,285,206,285,256,224,256,], 'body'=>[209,251,264,251,264,321,209,321,], 'legs'=>[209,311,214,311,259,311,264,311,298,382,209,382,], 'ex'=>1 },
+{ 'x'=>204, 'y'=>206, 'w'=>157, 'h'=>179, 'head'=>[223,206,268,206,268,256,223,256,], 'body'=>[208,251,263,251,263,323,208,323,], 'legs'=>[208,313,213,313,258,313,263,313,300,385,210,385,], 'ex'=>1 },
+{ 'x'=>202, 'y'=>204, 'w'=>125, 'h'=>181, 'head'=>[222,204,259,204,259,254,222,254,], 'body'=>[206,249,261,249,261,322,206,322,], 'legs'=>[206,312,211,312,256,312,261,312,299,385,209,385,], 'ex'=>1 },
+{ 'x'=>190, 'y'=>202, 'w'=>115, 'h'=>181, 'head'=>[227,202,261,202,261,252,227,252,], 'body'=>[197,247,252,247,252,320,197,320,], 'legs'=>[197,310,202,310,247,310,252,310,300,383,210,383,], 'ex'=>1 },
+{ 'x'=>182, 'y'=>204, 'w'=>132, 'h'=>181, 'head'=>[230,204,267,204,267,254,230,254,], 'body'=>[216,248,271,248,271,321,216,321,], 'legs'=>[189,312,194,312,239,312,301,305,299,385,210,385,], 'ex'=>0 },
+{ 'x'=>179, 'y'=>206, 'w'=>133, 'h'=>179, 'head'=>[226,206,272,206,272,256,226,256,], 'body'=>[222,250,277,250,277,322,222,322,], 'legs'=>[199,313,204,313,249,313,296,301,300,385,209,385,], 'ex'=>0 },
+{ 'x'=>184, 'y'=>201, 'w'=>121, 'h'=>184, 'head'=>[233,201,274,201,274,251,233,251,], 'body'=>[224,242,279,242,279,316,224,316,], 'legs'=>[200,310,205,310,250,310,295,306,300,385,207,385,], 'ex'=>0 },
+{ 'x'=>198, 'y'=>201, 'w'=>120, 'h'=>184, 'head'=>[240,201,278,201,278,251,240,251,], 'body'=>[232,242,287,242,287,316,232,316,], 'legs'=>[204,310,209,310,254,310,299,306,300,385,209,385,], 'ex'=>0 },
+{ 'x'=>203, 'y'=>203, 'w'=>138, 'h'=>182, 'head'=>[241,203,284,203,284,253,241,253,], 'body'=>[227,245,282,245,282,318,227,318,], 'legs'=>[214,311,219,311,264,311,297,305,299,385,208,385,], 'ex'=>0 },
+{ 'x'=>199, 'y'=>209, 'w'=>202, 'h'=>176, 'head'=>[241,209,281,213,284,260,241,259,], 'body'=>[225,248,280,248,280,318,225,318,], 'legs'=>[216,314,221,314,266,314,295,303,302,385,209,385,], 'ex'=>0, 'hit'=>[368,253,378,253,384,268,368,263,] },
+{ 'x'=>200, 'y'=>210, 'w'=>180, 'h'=>175, 'head'=>[241,210,282,210,282,260,241,260,], 'body'=>[215,255,270,255,283,306,215,325,], 'legs'=>[215,315,220,315,265,315,298,307,300,385,210,385,], 'ex'=>0 },
+{ 'x'=>202, 'y'=>207, 'w'=>142, 'h'=>176, 'head'=>[240,207,277,207,277,257,240,257,], 'body'=>[215,252,270,252,294,312,215,322,], 'legs'=>[215,312,220,312,265,312,301,313,301,383,210,383,], 'ex'=>0 },
+{ 'x'=>200, 'y'=> 88, 'w'=>115, 'h'=> 15, 'head'=>[200, 88,315, 88,315,103,200,103,], 'body'=>[200, 88,315, 88,315,103,200,103,], 'legs'=>[200, 88,257, 88,315, 88,315,103,257,103,200,103,], 'ex'=>1 },
+{ 'x'=>181, 'y'=> 88, 'w'=>136, 'h'=> 15, 'head'=>[181, 88,317, 88,317,103,181,103,], 'body'=>[181, 88,317, 88,317,103,181,103,], 'legs'=>[181, 88,249, 88,317, 88,317,103,249,103,181,103,], 'ex'=>1 },
+{ 'x'=>199, 'y'=> 88, 'w'=>115, 'h'=> 15, 'head'=>[199, 88,314, 88,314,103,199,103,], 'body'=>[199, 88,314, 88,314,103,199,103,], 'legs'=>[199, 88,256, 88,314, 88,314,103,256,103,199,103,], 'ex'=>1 },
+{ 'x'=>209, 'y'=> 88, 'w'=>105, 'h'=> 15, 'head'=>[209, 88,314, 88,314,103,209,103,], 'body'=>[209, 88,314, 88,314,103,209,103,], 'legs'=>[209, 88,261, 88,314, 88,314,103,261,103,209,103,], 'ex'=>1 },
+{ 'x'=>211, 'y'=> 88, 'w'=>102, 'h'=> 15, 'head'=>[211, 88,313, 88,313,103,211,103,], 'body'=>[211, 88,313, 88,313,103,211,103,], 'legs'=>[211, 88,262, 88,313, 88,313,103,262,103,211,103,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[245, 54,245, 54,245,104,245,104,], 'body'=>[253, 99,308, 99,308,114,253,114,], 'legs'=>[253,104,258,104,303,104,308,104,243,119,243,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[247, 54,253, 54,253,104,247,104,], 'body'=>[254, 99,309, 99,309,114,254,114,], 'legs'=>[254,104,259,104,304,104,309,104,243,119,243,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[251, 54,264, 54,264,104,251,104,], 'body'=>[248, 99,303, 99,303,114,248,114,], 'legs'=>[248,104,253,104,298,104,303,104,243,119,243,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[254, 54,272, 54,272,104,254,104,], 'body'=>[247, 99,302, 99,302,114,247,114,], 'legs'=>[247,104,252,104,297,104,302,104,280,119,262,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[254, 54,274, 54,274,104,254,104,], 'body'=>[247, 99,302, 99,302,114,247,114,], 'legs'=>[247,104,252,104,297,104,302,104,281,119,263,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[254, 54,275, 54,275,104,254,104,], 'body'=>[248, 99,303, 99,303,114,248,114,], 'legs'=>[248,104,253,104,298,104,303,104,281,119,263,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[257, 54,279, 54,279,104,257,104,], 'body'=>[249, 99,304, 99,304,114,249,114,], 'legs'=>[249,104,254,104,299,104,304,104,280,119,265,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[256, 54,280, 54,280,104,256,104,], 'body'=>[251, 99,306, 99,306,114,251,114,], 'legs'=>[251,104,256,104,301,104,306,104,286,119,266,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[254, 54,280, 54,280,104,254,104,], 'body'=>[252, 99,307, 99,307,114,252,114,], 'legs'=>[252,104,257,104,302,104,307,104,271,119,267,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[253, 54,280, 54,280,104,253,104,], 'body'=>[255, 99,310, 99,310,114,255,114,], 'legs'=>[255,104,260,104,305,104,310,104,269,119,269,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[251, 54,278, 54,278,104,251,104,], 'body'=>[257, 99,312, 99,312,114,257,114,], 'legs'=>[257,104,262,104,307,104,312,104,282,119,282,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[251, 54,276, 54,276,104,251,104,], 'body'=>[252, 99,307, 99,307,114,252,114,], 'legs'=>[252,104,257,104,302,104,307,104,243,119,243,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[251, 54,274, 54,274,104,251,104,], 'body'=>[247, 99,302, 99,302,114,247,114,], 'legs'=>[247,104,252,104,297,104,302,104,243,119,243,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[252, 54,268, 54,268,104,252,104,], 'body'=>[244, 99,299, 99,299,114,244,114,], 'legs'=>[244,104,249,104,294,104,299,104,243,119,243,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[252, 54,255, 54,255,104,252,104,], 'body'=>[244, 99,299, 99,299,114,244,114,], 'legs'=>[244,104,249,104,294,104,299,104,243,119,243,119,], 'ex'=>1 },
+{ 'x'=>244, 'y'=> 54, 'w'=> 47, 'h'=> 65, 'head'=>[247, 54,253, 54,253,104,247,104,], 'body'=>[254, 99,309, 99,309,114,254,114,], 'legs'=>[254,104,259,104,304,104,309,104,243,119,243,119,], 'ex'=>1 },
+{ 'x'=>248, 'y'=> 66, 'w'=> 36, 'h'=> 49, 'head'=>[248, 66,284, 66,284,115,248,115,], 'body'=>[248, 66,284, 66,284,115,248,115,], 'legs'=>[248, 66,266, 66,284, 66,284,115,266,115,248,115,], 'ex'=>1 },
+{ 'x'=>249, 'y'=> 75, 'w'=> 30, 'h'=> 37, 'head'=>[249, 75,279, 75,279,112,249,112,], 'body'=>[249, 75,279, 75,279,112,249,112,], 'legs'=>[249, 75,264, 75,279, 75,279,112,264,112,249,112,], 'ex'=>1 },
diff --git a/data/script/Backend.pl b/data/script/Backend.pl
index 7a357da..58832a3 100644
--- a/data/script/Backend.pl
+++ b/data/script/Backend.pl
@@ -1,594 +1,610 @@
#!/usr/bin/perl -w
# PERL backend for the game
=comment
This is the main perl backend for Mortal Szombat. It loads the other files,
compiles characters, creates shared variables.
1. FIGHTER ACTIONS
1.1. BASIC MOVEMENT 1.2. OFFENSIVE MOVES 1.3. HURT MOVES
Start KneelingPunch Falling
Stand KneelingKick Laying
Walk KneelingUppercut Getup
Back HighPunch HighPunched
Turn LowPunch LowPunched
Hurt HighKick GroinKicked
Block LowKick KneelingPunched
Kneeling Sweep KneelingKicked
Onknees GroinKick Thrown
Jump KneeKick Dead
JumpFW Elbow
JumpBW Grenade
Fun Uppercut
Threat Throw
[fighter-specific stuff]
=cut
=comment
MAIN CONSTANTS
=cut
$GAMEBITS = 3; # Number of oversampling bits in coordinates
$GAMEBITS2 = 1 << $GAMEBITS; # 2^(oversampling)
$SCRWIDTH = 640; # The physical horizontal screen resolution
$SCRHEIGHT = 480; # The physical vertical screen resolution
$SCRWIDTH2 = ($SCRWIDTH << $GAMEBITS); # The logical horizontal screen resolution
$SCRHEIGHT2 = ($SCRHEIGHT << $GAMEBITS); # The logical vertical screen resolution
$MOVEMARGIN2= 50 << $GAMEBITS; # The logical border for figthers.
$BGWIDTH2 = 1920 << $GAMEBITS; # The logical background width
$BGHEIGHT2 = 480 << $GAMEBITS; # The logical background height
$GROUND2 = 160 << $GAMEBITS; # The logical ground level.
$DELMULTIPLIER = 1; # DEL values in states are multiplied by this.
$MAXCOMBO = 5; # Maximum combo count.
$BgMax = $BGWIDTH2 - $SCRWIDTH2; # The logical maximum camera position
$BgSpeed = 0; # The current speed of the background movement
$BgPosition = $BgMax >> 1; # The logical camera position
$BgScrollEnabled = 1; # Can the background scroll?
$HitPointScale = 10; # Scale the hit points by this.
$NextDoodad = 0; # The next doodad to process
$Debug = 0;
require 'PlayerInput.pl';
require 'Fighter.pl';
require 'FighterStats.pl';
require 'Doodad.pl';
require 'Keys.pl';
require 'State.pl';
-=comment
-#require 'Kolos.pl';
-require 'Zoli.pl';
-require 'UPi.pl';
-#require 'Ulmar.pl';
-#require 'Cumi.pl';
-
-print "Kolos frames :", scalar @KolosFrames,"\n";
-print "Kolos states :", scalar keys %KolosStates,"\n";
-print "Zoli frames :", scalar @ZoliFrames,"\n";
-print "Zoli states :", scalar keys %ZoliStates,"\n";
-print "UPi frames :", scalar @UPiFrames,"\n";
-print "UPi states :", scalar keys %UPiStates,"\n";
-print "Ulmar frames :", scalar @UlmarFrames,"\n";
-print "Ulmar states :", scalar keys %UlmarStates,"\n";
-print "Cumi frames :", scalar @CumiFrames,"\n";
-print "Cumi states :", scalar keys %CumiStates,"\n";
-=cut
-
=comment
MAIN OBJECTS
=cut
$Fighter1 = Fighter->new();
$Fighter2 = Fighter->new();
$Fighter1->{NUMBER} = 0;
$Fighter1->{OTHER} = $Fighter2;
$Fighter2->{NUMBER} = 1;
$Fighter2->{OTHER} = $Fighter1;
@Fighters = ( $Fighter1, $Fighter2 );
=comment
VARIABLES FOR DRAWING THE SCENE
=cut
$p1x = 10; # Player 1 X position
$p1y = 100; # Player 1 Y position
$p1f = 10; # Player 1 frame
$p1h = 100; # Player 1 HP
$p2x = 400; # Player 2 X position
$p2y = 100; # Player 2 Y position
$p2f = -40; # Player 2 frame. Negative means flipped.
$p2h = 100; # Player 2 HP
$bgx = 0; # Background X position
$bgy = 0; # Background Y position
$time = 0; # Current game time
$over = 0; # Is the game over?
$ko = 0; # Is one fighter knocked down?
-$dx = 0; # Doodad X position
-$dy = 0; # Doodad Y position
-$dt = 0; # Doodad type
-$df = 0; # Doodad frame number
-
+$doodad_x = -1; # Doodad X position
+$doodad_y = -1; # Doodad Y position
+$doodad_t = -1; # Doodad type
+$doodad_f = -1; # Doodad frame number
+$doodad_dir = 0; # The direction of the doodad; 1: normal; -1: flipped
+$doodad_gfxowner = -1; # 0: first player; 1: second player; 2: Global doodad
+$doodad_text = ''; # The text of type 0 doodads.
=comment
JUDGEMENT METHODS
=cut
sub JudgementStart
{
$bgx = 0;
$bgy = ( $SCRHEIGHT2 - $BGHEIGHT2 ) >> 1;
$BgSpeed = 0;
$BgPosition = 0;
$BgScrollEnabled = 0;
$OverTimer = 0;
$JudgementMode = 1;
$Debug = 0;
($JudgementWinner) = @_;
ResetEarthquake();
$time = 0;
$over = 0;
$Fighter1->Reset();
$Fighter1->{X} = ($JudgementWinner ? 150 : 520 ) * $GAMEBITS2;
$Fighter1->{DIR} = ($JudgementWinner ? 1 : -1 );
$Fighter1->{NEXTST} = 'Stand';
$Fighter1->Update();
$Fighter2->Reset();
$Fighter2->{X} = ($JudgementWinner ? 520 : 150 ) * $GAMEBITS2;
$Fighter2->{DIR} = ($JudgementWinner ? -1 : 1 );
$Fighter2->{NEXTST} = 'Stand';
$Fighter2->Update();
$Input1->Reset();
$Input2->Reset();
}
=comment
PLAYER SELECTION METHODS
=cut
sub SelectStart
{
$bgx = 0;
$bgy = ( $SCRHEIGHT2 - $BGHEIGHT2 ) >> 1;
$BgSpeed = 0;
$BgPosition = 0;
$BgScrollEnabled = 0;
$OverTimer = 0;
$JudgementMode = 0;
$Debug = 0;
ResetEarthquake();
$time = 0;
$over = 0;
- $Fighter1->Reset(); #\@ZoliFrames,\%ZoliStates);
+ $Fighter1->Reset();
$Fighter1->{X} = 80 * $GAMEBITS2;
$Fighter1->{NEXTST} = 'Stand';
$Fighter1->Update();
- $Fighter2->Reset(); #\@ZoliFrames,\%ZoliStates);
+ $Fighter2->Reset();
$Fighter2->{X} = 560 * $GAMEBITS2;
$Fighter2->{NEXTST} = 'Stand';
$Fighter2->Update();
$Input1->Reset();
$Input2->Reset();
}
sub SetPlayerNumber
{
- my ($player, $number) = @_;
+ my ($player, $fighterenum) = @_;
my ($f);
+ DeleteDoodadsOf( $player );
+
$f = $player ? $Fighter2 : $Fighter1;
-
- if ( $number eq 1 ) { $f->Reset('Ulmar', \@UlmarFrames,\%UlmarStates); }
- elsif ( $number eq 2 ) { $f->Reset('UPi', \@UPiFrames,\%UPiStates); }
- elsif ( $number eq 3 ) { $f->Reset('Zoli', \@ZoliFrames,\%ZoliStates); }
- elsif ( $number eq 4 ) { $f->Reset('Cumi', \@CumiFrames,\%CumiStates); }
- elsif ( $number eq 5 ) { $f->Reset('Sirpi', \@SirpiFrames,\%SirpiStates); }
- elsif ( $number eq 6 ) { $f->Reset('Maci', \@MaciFrames,\%MaciStates); }
- elsif ( $number eq 7 ) { $f->Reset('Bence', \@BenceFrames,\%BenceStates); }
- elsif ( $number eq 9 ) { $f->Reset('Descant', \@DescantFrames,\%DescantStates); }
- elsif ( $number eq 8 ) { $f->Reset('Grizli', \@GrizliFrames,\%GrizliStates); }
+
+=comment
+ if ( $fighterenum eq 1 ) { $f->Reset('Ulmar', \@UlmarFrames,\%UlmarStates); }
+ elsif ( $fighterenum eq 2 ) { $f->Reset('UPi', \@UPiFrames,\%UPiStates); }
+ elsif ( $fighterenum eq 3 ) { $f->Reset('Zoli', \@ZoliFrames,\%ZoliStates); }
+ elsif ( $fighterenum eq 4 ) { $f->Reset('Cumi', \@CumiFrames,\%CumiStates); }
+ elsif ( $fighterenum eq 5 ) { $f->Reset('Sirpi', \@SirpiFrames,\%SirpiStates); }
+ elsif ( $fighterenum eq 6 ) { $f->Reset('Maci', \@MaciFrames,\%MaciStates); }
+ elsif ( $fighterenum eq 7 ) { $f->Reset('Bence', \@BenceFrames,\%BenceStates); }
+ elsif ( $fighterenum eq 9 ) { $f->Reset('Descant', \@DescantFrames,\%DescantStates); }
+ elsif ( $fighterenum eq 8 ) { $f->Reset('Grizli', \@GrizliFrames,\%GrizliStates); }
else {
# Fallback
$f->Reset('Zoli', \@ZoliFrames,\%ZoliStates);
}
+=cut
+ $f->Reset($fighterenum);
$f->{NEXTST} = 'Stand';
$f->Update();
- $::PlayerName = $::FighterStats[$number]->{NAME};
+ $::PlayerName = $::FighterStats[$fighterenum]->{NAME};
}
sub PlayerSelected
{
my ($number) = @_;
my ($f) = $number ? $Fighter2 : $Fighter1;
$f->Event( 'Won' );
$f->Update();
}
=comment
EARTHQUAKE RELATED METHODS
=cut
@QUAKEOFFSET = ( 0, 6, 11, 15,
16, 15, 11, 6,
0, -6,-11,-15,
-16,-15,-11, -6, 0, 6 );
sub ResetEarthquake
{
$QuakeAmplitude = 0;
$QuakeOffset = 0;
$QuakeX = 0;
$QuakeY = 0;
}
sub AddEarthquake
{
my ($amplitude) = @_;
$QuakeAmplitude += $amplitude;
$QuakeAmplitude = 20 if ( $QuakeAmplitude > 20 );
}
sub AdvanceEarthquake
{
if ( $QuakeAmplitude <= 0.2 )
{
$QuakeAmplitude = $QuakeX = $QuakeY = 0;
return;
}
$QuakeAmplitude -= $QuakeAmplitude / 30 + 0.1;
$QuakeOffset = ( $QuakeOffset + 1 ) % 16;
$QuakeX = $QUAKEOFFSET[$QuakeOffset] * $QuakeAmplitude / 16;
$QuakeY = $QUAKEOFFSET[$QuakeOffset + 1] * $QuakeAmplitude / 16;
$bgx -= $QuakeX;
$bgy -= $QuakeY;
$p1x += $QuakeX;
$p1y += $QuakeY;
$p2x += $QuakeX;
$p2y += $QuakeY;
# Do not quake doodads for now.
}
=comment
GAME BACKEND METHODS
=cut
sub GameStart
{
my ( $MaxHP, $debug ) = @_;
+ @Doodads = ();
+ @Sounds = ();
$bgx = ( $SCRWIDTH2 - $BGWIDTH2) >> 1;
$bgy = ( $SCRHEIGHT2 - $BGHEIGHT2 ) >> 1;
$BgSpeed = 0;
$BgPosition = $BgMax >> 1;
$BgScrollEnabled = 1;
$HitPointScale = 1000 / $MaxHP;
$Debug = $debug;
ResetEarthquake();
$time = 0;
$Fighter1->Reset();
$Fighter1->{HP} = $MaxHP;
$Input1->Reset();
$Fighter2->Reset();
$Fighter2->{HP} = $MaxHP;
$Input2->Reset();
$over = 0;
$ko = 0;
$OverTimer = 0;
$JudgementMode = 0;
- @Doodads = ();
- @Sounds = ();
-
$p1h = $p2h = 0;
}
sub GetFighterData
{
my ($fighter) = @_;
my ($x, $y, $fnum, $f, $hp);
$fnum = $fighter->{FR};
$f = $fighter->{FRAMES}->[$fnum];
$x = $fighter->{X} / $GAMEBITS2 + $f->{'x'};
$y = $fighter->{Y} / $GAMEBITS2 + $f->{'y'};
if ($fighter->{DIR}<0)
{
$fnum = -$fnum;
$x -= $f->{x}*2 + $f->{w};
}
return ($x, $y, $fnum);
}
sub GetNextDoodadData
{
if ( $NextDoodad >= scalar @Doodads )
{
- $doodad_x = $doodad_y = $doodad_t = $doodad_f = -1;
+ $doodad_x = $doodad_y = $doodad_t = $doodad_f = $doodad_dir = $doodad_gfxowner = -1;
+ $doodad_text = '';
return;
}
my ($doodad) = $Doodads[$NextDoodad];
- $doodad_x = $doodad->{X} / $GAMEBITS2 - $bgx;
- $doodad_y = $doodad->{Y} / $GAMEBITS2 - $bgy;
+ $doodad_x = $doodad->{POS}->[0] / $GAMEBITS2 - $bgx;
+ $doodad_y = $doodad->{POS}->[1] / $GAMEBITS2 - $bgy;
$doodad_t = $doodad->{T};
$doodad_f = $doodad->{F};
+ $doodad_dir = $doodad->{DIR};
+ $doodad_gfxowner = $doodad->{GFXOWNER};
$doodad_text = $doodad->{TEXT};
+
+
+ if ($doodad_gfxowner < 2 )
+ {
+ $doodad_x += $Fighters[$doodad_gfxowner]->{FRAMES}->[$doodad_f]->{'x'} * $doodad_dir;
+ $doodad_y += $Fighters[$doodad_gfxowner]->{FRAMES}->[$doodad_f]->{'y'};
+ }
+
++$NextDoodad;
}
sub UpdateDoodads
{
my ($i, $j, $doodad);
for ($i=0; $i<scalar @Doodads; ++$i)
{
$doodad = $Doodads[$i];
- $j = UpdateDoodad( $doodad );
+ $j = Doodad::UpdateDoodad( $doodad );
if ( $j )
{
# Remove this Doodad
splice @Doodads, $i, 1;
--$i;
}
}
}
+sub DeleteDoodadsOf($)
+{
+ my ($owner) = @_;
+ my ($i, $doodad);
+ for ($i=0; $i<scalar @Doodads; ++$i)
+ {
+ $doodad = $Doodads[$i];
+ if ( $doodad->{OWNER} == $owner )
+ {
+ # Remove this Doodad
+ splice @Doodads, $i, 1;
+ --$i;
+ }
+ }
+}
+
+
+
sub GetNextSoundData()
{
# print "GetSoundData: ", scalar @Sounds, join ' ,', @Sounds, "\n";
$sound = pop @Sounds;
$sound = '' unless defined $sound;
}
sub DoFighterEvents
{
my ($fighter, $hit) = @_;
if ( $JudgementMode )
{
if ( $fighter->{NUMBER} == $JudgementWinner )
{
$fighter->Event("Won");
}
else
{
$fighter->Event("Hurt");
}
return;
}
if ( $hit )
{
$fighter->HitEvent( $fighter->{OTHER}->GetCurrentState()->{HIT}, $hit );
return;
}
#if ( ($fighter->{X} - $fighter->{OTHER}->{X}) * ($fighter->{DIR}) > 0 )
if ( $fighter->IsBackTurned )
{
$fighter->Event("Turn");
}
if ( $fighter->{OTHER}->{ST} eq 'Dead' )
{
$fighter->Event("Won");
}
if ( ($fighter->{IDLE} > 150) and (rand(350) < 1) )
{
$fighter->Event("Fun");
}
if ( ($fighter->{IDLE} > 150) and (rand(350) < 1) )
{
$fighter->Event("Threat");
}
}
sub GameAdvance
{
# $::adv += 1;
# return if ( $::adv % 3 );
my ($hit1, $hit2);
$time += 4/1000;
$NextDoodad = 0;
$NextSound = 0;
# 1. ADVANCE THE PLAYERS
$Input1->Advance();
$Input2->Advance();
$Fighter1->Advance( $Input1 );
$Fighter2->Advance( $Input2 );
$hit2 = $Fighter1->CheckHit();
$hit1 = $Fighter2->CheckHit();
# 2. Events come here
DoFighterEvents( $Fighter1, $hit1 );
DoFighterEvents( $Fighter2, $hit2 );
UpdateDoodads();
$Fighter1->Update();
$Fighter2->Update();
if ( $OverTimer == 0 and
($Fighter1->{ST} eq 'Dead' or $Fighter1->{ST} eq 'Won2') and
($Fighter2->{ST} eq 'Dead' or $Fighter2->{ST} eq 'Won2') )
{
$OverTimer = 1;
}
elsif ( $OverTimer > 0 )
{
$OverTimer++;
$over = 1 if ( $OverTimer > 200 )
}
# 3. DO THE BACKGROUND SCROLLING THING
if ( $BgScrollEnabled )
{
$BgOpt = ($Fighter1->{X} + $Fighter2->{X}) / 2; # 1/1 Stupid kdevelop syntax hightlight.
if ( ($BgOpt - $BgSpeed*50 - $BgPosition) > (320 << $GAMEBITS)) { $BgSpeed++; }
if ( ($BgOpt - $BgSpeed*50 - $BgPosition) < (320 << $GAMEBITS)) { $BgSpeed--; }
$BgPosition+=$BgSpeed;
if ($BgPosition<0) { $BgPosition = $BgSpeed = 0; }
if ($BgPosition>$BgMax) { $BgPosition = $BgMax; $BgSpeed = 0; }
# print "Pos:$BgPosition\tOpt:$BgOpt\tSpd:$BgSpeed\t";
}
# 4. SET GLOBAL VARIABLES FOR THE C++ DRAWING TO READ
($p1x, $p1y, $p1f) = GetFighterData( $Fighter1 );
($p2x, $p2y, $p2f) = GetFighterData( $Fighter2 );
$phTarget = $Fighter1->{HP}*$HitPointScale;
if ( $p1h < $phTarget ) { $p1h += 5; }
if ( $p1h > $phTarget ) { $p1h -= 3; }
$p1h = $phTarget if abs($p1h - $phTarget) < 3;
$p1h = 0 if $p1h < 0;
$phTarget = $Fighter2->{HP}*$HitPointScale;
if ( $p2h < $phTarget ) { $p2h += 5; }
if ( $p2h > $phTarget ) { $p2h -= 3; }
$p2h = $phTarget if abs($p2h - $phTarget) < 3;
$p2h = 0 if $p2h < 0;
$bgx = $BgPosition >> $GAMEBITS;
$p1x -= $bgx;
$p2x -= $bgx;
$bgy = 0;
AdvanceEarthquake();
# 5. DEBUG POLYGONS
return unless $Debug;
$fr1 = $Fighter1->{FRAMES}->[ $Fighter1->{FR} ];
@p1head = @{ $fr1->{head} };
MirrorPolygon( \@p1head ) if $Fighter1->{DIR} < 0;
OffsetPolygon( \@p1head, $Fighter1->{X} / $GAMEBITS2 - $bgx, $Fighter1->{Y} / $GAMEBITS2 - $bgy );
@p1body = @{ $fr1->{body} };
MirrorPolygon( \@p1body ) if $Fighter1->{DIR} < 0;
OffsetPolygon( \@p1body, $Fighter1->{X} / $GAMEBITS2 - $bgx, $Fighter1->{Y} / $GAMEBITS2 - $bgy );
@p1legs = @{ $fr1->{legs} };
MirrorPolygon( \@p1legs) if $Fighter1->{DIR} < 0;
OffsetPolygon( \@p1legs, $Fighter1->{X} / $GAMEBITS2 - $bgx, $Fighter1->{Y} / $GAMEBITS2 - $bgy );
if ( defined $fr1->{hit} )
{
@p1hit = @{ $fr1->{hit} };
MirrorPolygon( \@p1hit ) if $Fighter1->{DIR} < 0;
OffsetPolygon( \@p1hit, $Fighter1->{X} / $GAMEBITS2 - $bgx, $Fighter1->{Y} / $GAMEBITS2 - $bgy );
}
else
{
undef @p1hit;
}
$fr2 = $Fighter2->{FRAMES}->[ $Fighter2->{FR} ];
@p2head = @{ $fr2->{head} };
MirrorPolygon( \@p2head ) if $Fighter2->{DIR} < 0;
OffsetPolygon( \@p2head, $Fighter2->{X} / $GAMEBITS2 - $bgx, $Fighter2->{Y} / $GAMEBITS2 - $bgy );
@p2body = @{ $fr2->{body} };
MirrorPolygon( \@p2body ) if $Fighter2->{DIR} < 0;
OffsetPolygon( \@p2body, $Fighter2->{X} / $GAMEBITS2 - $bgx, $Fighter2->{Y} / $GAMEBITS2 - $bgy );
@p2legs = @{ $fr2->{legs} };
MirrorPolygon( \@p2legs) if $Fighter2->{DIR} < 0;
OffsetPolygon( \@p2legs, $Fighter2->{X} / $GAMEBITS2 - $bgx, $Fighter2->{Y} / $GAMEBITS2 - $bgy );
if ( defined $fr2->{hit} )
{
@p2hit = @{ $fr2->{hit} };
MirrorPolygon( \@p2hit ) if $Fighter2->{DIR} < 0;
OffsetPolygon( \@p2hit, $Fighter2->{X} / $GAMEBITS2 - $bgx, $Fighter2->{Y} / $GAMEBITS2 - $bgy );
}
else
{
undef @p2hit;
}
}
diff --git a/data/script/Bence.pl b/data/script/Bence.pl
index b02b89b..d095797 100644
--- a/data/script/Bence.pl
+++ b/data/script/Bence.pl
@@ -1,198 +1,210 @@
# package Bence;
# Bence's images are scaled by a factor of ?
require 'DataHelper.pl';
require 'QuickSave.pl';
use strict;
sub LoadBence
{
my ( @Frames, %FrameLookup, %Frames, %States, %Shorthands,
$Doodad, $Con, $Con2,
@States1,
$framedesc, $key, $value, $framename, $nextst, $st, $lastchar, $nextchar );
@Frames = LoadFrames( "BENCEDATA.DAT.pl", 420, 310 );
%FrameLookup = CreateFrameLookup( scalar @Frames -1,
"start", 23, "stand", 4, "walk", 12,
"turn", 8, "falling", 18, "laying", 1,
"getup", 12, "hurt", 8, "swept", 8,
"won", 8, "block", 5, "kneeling", 4,
"onknees", 4, "kneelingpunch",5,
"fun", 5, "threat", 6,
"highpunch", 6, "lowpunch", 5, "highkick", 7,
"lowkick", 6, "sweep", 7, "groinkick", 6,
"kneekick", 6, "elbow", 7, "spin", 10,
"grenade", 11, "uppercut", 7, "throw", 22,
"specpunch", 14, "pierce", 8,
"highpunched", 5, "lowpunched", 6, "groinkicked", 8,
"kneelingpunched",4, "kneelingkicked", 5, "thrown", 8,
);
# Bence has no kneelingkick... substitute kneelingpunch. This is for Jumping..
for ( $st = 1; $st <= 5; ++$st ) { $FrameLookup{"kneelingkick$st"} = $FrameLookup{"kneelingpunch$st"}; }
$Doodad =
{ 'T' => 1,
'W' => 64,
'H' => 64,
'SX' => 15,
'SY' => 0,
'FRAMES'=> 6,
'SA' => 1/25,
};
$Con = {
'forw'=>'Walk',
'back'=>'Back',
'jump'=>'Jump',
'jumpfw'=>'JumpFW',
'jumpbw'=>'JumpBW',
'block'=>'Block',
'down'=>'Kneeling',
'hpunch'=>'HighPunch',
'lpunch'=>'LowPunch',
'hkick'=>'HighKick',
'lkick'=>'LowKick',
'lkickBF'=>'GroinKick',
'lkickF'=>'KneeKick',
'hpunchD'=>'Uppercut',
'hpunchF'=>'Elbow',
'hkickB'=>'Spin',
'lkickB'=>'Sweep',
'lpunchBD'=>'Grenade',
'lpunchFBFB'=>'SpecPunch',
'hpunchFB'=>'Pierce',
};
$Con2 = {
'lkick'=>'KneelingPunch',
'hkick'=>'KneelingPunch',
'hpunch'=>'KneelingUppercut',
'lpunch'=>'KneelingPunch',
};
@States1 = (
# 1. BASIC MOVES
{ 'N'=>'Start', 'DEL'=>7, 'S'=>'+start 1-8',
'DEL7'=>15, 'DEL14'=>15, },
{ 'N'=>'Stand', 'DEL'=>7, 'S'=>'+stand,-stand', 'CON'=>$Con, 'SITU'=>'Ready' },
{ 'N'=>'Turn', 'DEL'=>5, 'S'=>'+turn', 'TURNN'=>1, 'DELTAXN'=>80 },
{ 'N'=>'Hurt', 'DEL'=>8, 'S'=>'+hurt,-hurt' },
{ 'N'=>'Won', 'DEL'=>8, 'S'=>'+won, won 7-5, won 6-8, won 7-5', 'NEXTSTN'=> 'Won2' },
{ 'N'=>'Won2', 'DEL'=>1000,'S'=>'won 5', 'NEXTST'=>'Won2', },
{ 'N'=>'Fun', 'DEL'=>8, 'S'=>'+fun,-fun', 'CON'=>$Con },
{ 'N'=>'Threat', 'DEL'=>5, 'S'=>'+threat,-threat', 'CON'=>$Con },
WalkingFrames( \%FrameLookup, \@Frames, 1, 130, $Con ),
BlockStates( FindLastFrame( \%FrameLookup, 'block' ), 5 ),
KneelingStates( FindLastFrame( \%FrameLookup, 'kneeling' ),
FindLastFrame( \%FrameLookup, 'onknees' ), 7, $Con2 ),
JumpStates( \%FrameLookup,
{'lkick'=>'JumpKick', 'hkick'=>'JumpKick',
'lpunch'=>'JumpPunch', 'hpunch'=>'JumpPunch',
'hpunchFF'=>'JumpFire'} ),
# 2. OFFENSIVE MOVES
{ 'N'=>'KneelingPunch', 'DEL'=>5, 'S'=>'+kneelingpunch,-kneelingpunch', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingUppercut','DEL'=>5, 'S'=>'kneeling 4-3,uppercut 6-n,-uppercut',
'HIT'=>'Uppercut' },
{ 'N'=>'HighPunch', 'DEL'=>5, 'S'=>'+highpunch,-highpunch',
'HIT'=>'Highhit' },
{ 'N'=>'LowPunch', 'DEL'=>5, 'S'=>'+lowpunch,-lowpunch',
'HIT'=>'Hit' },
{ 'N'=>'HighKick', 'DEL'=>5, 'S'=>'+highkick,-highkick',
'HIT'=>'Hit' },
{ 'N'=>'LowKick', 'DEL'=>5, 'S'=>'+lowkick,-lowkick',
'HIT'=>'Leghit' },
{ 'N'=>'GroinKick', 'DEL'=>5, 'S'=>'+groinkick,-groinkick',
'HIT'=>'Groinhit' },
{ 'N'=>'KneeKick', 'DEL'=>5, 'S'=>'+kneekick,-kneekick',
'HIT'=>'Hit' },
{ 'N'=>'Elbow', 'DEL'=>5, 'S'=>'+elbow,-elbow',
'HIT5'=>'Highhit', 'HIT6'=>'Highhit' },
{ 'N'=>'Spin', 'DEL'=>5, 'S'=>'+spin,-spin',
'HIT'=>'Hit' },
{ 'N'=>'Sweep', 'DEL'=>7, 'S'=>'+sweep,-sweep',
'HIT'=>'Hit' },
{ 'N'=>'Grenade', 'DEL'=>5, 'S'=>'+grenade, grenade n-8, grenade 5-1',
'DEL11'=>15, 'DOODAD11'=>$Doodad },
{ 'N'=>'Uppercut', 'DEL'=>5, 'S'=>'+uppercut,-uppercut',
'HIT5'=>'Uppercut', 'HIT6'=>'Uppercut' },
{ 'N'=>'Throw', 'DEL'=>8, 'S'=>'+throw' },
{ 'N'=>'SpecPunch', 'DEL'=>5, 'S'=>'+specpunch, specpunch 4-13, specpunch 4-1',
'HIT'=>'Hit' },
{ 'N'=>'Pierce', 'DEL'=>5, 'S'=>'+pierce,-pierce',
'HIT'=>'Highhit' },
# 3. HURT MOVES
{ 'N'=>'Falling', 'DEL'=>5, 'S'=>'falling 1-11, falling 15-12, falling 12-n, laying 1',
'MOVE'=>1,
'DELN'=>500, 'NEXTN'=>'Laying', 'SITU'=>'Falling', },
{ 'N'=>'Laying', 'DEL'=>1000,'S'=>'+laying',
'SITU'=>'Falling' },
{ 'N'=>'Getup', 'DEL'=>5, 'S'=>'+getup',
'SITU'=>'Falling',
'CON8'=>{'down'=>'Onknees'},
'CON8'=>{'down'=>'Onknees'},
},
{ 'N'=>'Dead', 'DEL'=>10000, 'S'=>'laying 1',
'SITU'=>'Falling', 'NEXTST'=>'Dead' },
{ 'N'=>'Swept', 'DEL'=>5, 'S'=>'+swept,-swept' },
{ 'N'=>'KneelingPunched', 'DEL'=>5, 'S'=>'+kneelingpunched,-kneelingpunched',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKicked', 'DEL'=>5, 'S'=>'+kneelingkicked, -kneelingkicked',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'HighPunched', 'DEL'=>8, 'S'=>'+highpunched, -highpunched' },
{ 'N'=>'LowPunched', 'DEL'=>5, 'S'=>'+lowpunched, -lowpunched' },
{ 'N'=>'GroinKicked', 'DEL'=>7, 'S'=>'+groinkicked, -groinkicked' },
{ 'N'=>'Thrown', 'DEL'=>5, 'S'=>'+thrown' },
);
# 2. CREATE STATES
foreach $framedesc (@States1)
{
AddStates( \%States, \%FrameLookup, $framedesc );
}
# Automatically add NEXTST for states which don't have one.
FixStates( \%FrameLookup, \%States );
TravelingStates( \%FrameLookup, \@Frames, \%States, "falling", 1, 19 );
TravelingStates( \%FrameLookup, \@Frames, \%States, "getup", 0, 0 );
#TravelingStates( \%FrameLookup, \@Frames, \%States, "won", 0, 0 );
%States = ( FindShorthands( \%States ), %States );
-%::BenceStates = %States;
-@::BenceFrames = @Frames;
+# %::BenceStates = %States;
+# @::BenceFrames = @Frames;
+
+::RegisterFighter( {
+ 'ID' => 7,
+ 'GENDER' => 1,
+ 'DATAVERSION' => 1,
+ 'STARTCODE' => sub {},
+ 'FRAMES' => \@Frames,
+ 'STATES' => \%States,
+ 'DATAFILE' => 'BENCEDATA.DAT',
+ 'DATASIZE' => 6750636,
+} );
+
}
LoadBence();
# QuickSave('Bence', \@::BenceFrames, \%::BenceStates);
return 1;
diff --git a/data/script/Cumi.pl b/data/script/Cumi.pl
index 49824ee..f6eba0f 100644
--- a/data/script/Cumi.pl
+++ b/data/script/Cumi.pl
@@ -1,189 +1,201 @@
# package Cumi;
# Cumi's images are scaled:
require 'DataHelper.pl';
use strict;
sub LoadCumi
{
my ( @Frames, %FrameLookup, %Frames, %States, %Shorthands,
$Doodad, $Con, $Con2,
@States1,
$framedesc, $key, $value, $framename, $nextst, $st, $lastchar, $nextchar );
@Frames = LoadFrames( "CUMIDATA.DAT.pl", 320, 50 );
%FrameLookup = CreateFrameLookup( scalar @Frames -1,
"start", 18, "stand", 4, "walk", 14,
"turn", 8, "falling", 12, "laying", 1,
"getup", 19, "hurt", 9, "swept", 6,
"won", 26, "block", 4, "kneeling", 4,
"onknees", 1, "kneelingpunch",4, "kneelingkick", 5,
"fun", 7, "threat", 6, "highpunch", 4,
"lowpunch", 5, "highkick", 6, "lowkick", 6, "sweep", 14,
"groinkick", 6, "kneekick", 6, "elbow", 5,
"grenade", 7, "uppercut", 8,
"throw", 24, "spit", 5, "highpunched", 5, "lowpunched", 5,
"groinkicked", 17, "kneelingpunched",4, "kneelingkicked", 5,
"thrown", 7, "baseball", 27,
);
$Doodad =
{ 'T' => 1,
'W' => 64,
'H' => 64,
'SX' => 15,
'SY' => 0,
'FRAMES'=> 6,
'SA' => 1/25,
};
$Con = {
'forw'=>'Walk',
'back'=>'Back',
'jump'=>'Jump',
'jumpfw'=>'JumpFW',
'jumpbw'=>'JumpBW',
'block'=>'Block',
'down'=>'Kneeling',
'hpunch'=>'HighPunch',
'lpunch'=>'LowPunch',
'hkick'=>'HighKick',
'lkick'=>'LowKick',
'lkickBF'=>'GroinKick',
'lkickF'=>'KneeKick',
'hpunchD'=>'Uppercut',
'hpunchF'=>'Elbow',
'hkickB'=>'Spin',
'lkickB'=>'Sweep',
'lpunchBD'=>'Grenade',
'hpunchFF'=>'Spit',
'lkickFDB'=>'Baseball',
};
$Con2 = {
'lkick'=>'KneelingKick',
'hkick'=>'KneelingKick',
'hpunch'=>'KneelingUppercut',
'lpunch'=>'KneelingPunch',
};
@States1 = (
# 1. BASIC MOVES
{ 'N'=>'Start', 'DEL'=>5, 'S'=>'start 1-8, start 8-1, start 9-n' },
{ 'N'=>'Stand', 'DEL'=>7, 'S'=>'+stand,_stand', 'CON'=>$Con, 'SITU'=>'Ready' },
{ 'N'=>'Turn', 'DEL'=>5, 'S'=>'+turn', 'TURNN'=>1, },
{ 'N'=>'Hurt', 'DEL'=>8, 'S'=>'+hurt,-hurt' },
{ 'N'=>'Won', 'DEL'=>8, 'S'=>'+won', 'NEXTSTN'=> 'Won2' },
{ 'N'=>'Won2', 'DEL'=>1000,'S'=>'won n', 'NEXTST'=>'Won2', },
{ 'N'=>'Fun', 'DEL'=>8, 'S'=>'+fun,-fun', 'CON'=>$Con },
{ 'N'=>'Threat', 'DEL'=>5, 'S'=>'+threat,-threat', 'CON'=>$Con },
WalkingFrames( \%FrameLookup, \@Frames, 4, 110, $Con ),
BlockStates( FindLastFrame( \%FrameLookup, 'block' ), 5 ),
KneelingStates( FindLastFrame( \%FrameLookup, 'kneeling' ),
FindLastFrame( \%FrameLookup, 'onknees' ), 7, $Con2 ),
JumpStates( \%FrameLookup,
{'lkick'=>'JumpKick', 'hkick'=>'JumpKick',
'lpunch'=>'JumpPunch', 'hpunch'=>'JumpPunch'} ),
# 2. OFFENSIVE MOVES
{ 'N'=>'KneelingPunch', 'DEL'=>5, 'S'=>'+kneelingpunch,-kneelingpunch', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKick', 'DEL'=>5, 'S'=>'+kneelingkick,-kneelingkick', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingUppercut','DEL'=>5, 'S'=>'kneeling 4-3,uppercut 6-n,-uppercut',
'HIT'=>'Uppercut' },
{ 'N'=>'HighPunch', 'DEL'=>5, 'S'=>'+highpunch,-highpunch',
'HIT'=>'Highhit' },
{ 'N'=>'LowPunch', 'DEL'=>5, 'S'=>'+lowpunch,-lowpunch',
'HIT'=>'Hit' },
{ 'N'=>'HighKick', 'DEL'=>5, 'S'=>'+highkick,-highkick',
'HIT'=>'Hit' },
{ 'N'=>'LowKick', 'DEL'=>5, 'S'=>'+lowkick,-lowkick',
'HIT'=>'Leghit' },
{ 'N'=>'GroinKick', 'DEL'=>5, 'S'=>'+groinkick,-groinkick',
'HIT'=>'Groinhit' },
{ 'N'=>'KneeKick', 'DEL'=>5, 'S'=>'+kneekick,-kneekick',
'HIT'=>'Hit' },
{ 'N'=>'Elbow', 'DEL'=>5, 'S'=>'+elbow,-elbow',
'HIT'=>'Highhit' },
{ 'N'=>'Sweep', 'DEL'=>7, 'S'=>'+sweep',
'HIT'=>'Hit' },
{ 'N'=>'Grenade', 'DEL'=>5, 'S'=>'+grenade,-grenade',
'DEL12'=>15, 'DOODAD'=>$Doodad },
{ 'N'=>'Uppercut', 'DEL'=>5, 'S'=>'+uppercut,-uppercut',
'HIT'=>'Uppercut' },
{ 'N'=>'Throw', 'DEL'=>8, 'S'=>'+throw' },
{ 'N'=>'Spit', 'DEL'=>7, 'S'=>'+spit,-spit' },
{ 'N'=>'Baseball', 'DEL'=>6, 'S'=>'+baseball,baseball 5-1',
'HIT'=>'Fall' },
# 3. HURT MOVES
{ 'N'=>'Falling', 'DEL'=>5, 'S'=>'+falling, laying 1',
'DELN'=>500, 'NEXTN'=>'Laying', 'SITU'=>'Falling', },
{ 'N'=>'Laying', 'DEL'=>1000,'S'=>'+laying',
'SITU'=>'Falling' },
{ 'N'=>'Getup', 'DEL'=>5, 'S'=>'+getup',
'SITU'=>'Falling',
'CON8'=>{'down'=>'Onknees'},
'CON8'=>{'down'=>'Onknees'},
},
{ 'N'=>'Dead', 'DEL'=>10000, 'S'=>'laying 1',
'SITU'=>'Falling', 'NEXTST'=>'Dead' },
{ 'N'=>'Swept', 'DEL'=>5, 'S'=>'+swept,-swept' },
{ 'N'=>'KneelingPunched', 'DEL'=>5, 'S'=>'+kneelingpunched,-kneelingpunched',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKicked', 'DEL'=>5, 'S'=>'kneelingkicked 3-n, kneelingkicked n-3',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKicked','DEL'=>5, 'S'=>'+kneelingkicked,-kneelingkicked' },
{ 'N'=>'HighPunched', 'DEL'=>8, 'S'=>'highpunched 2-n, -highpunched' },
{ 'N'=>'LowPunched', 'DEL'=>5, 'S'=>'+lowpunched,-lowpunched' },
{ 'N'=>'GroinKicked', 'DEL'=>7, 'S'=>'+groinkicked' },
{ 'N'=>'Thrown', 'DEL'=>5, 'S'=>'+thrown' },
);
# 2. CREATE STATES: %CumiStates
foreach $framedesc (@States1)
{
AddStates( \%States, \%FrameLookup, $framedesc );
}
# Automatically add NEXTST for states which don't have one.
FixStates( \%FrameLookup, \%States );
TravelingStates( \%FrameLookup, \@Frames, \%States, "falling", 1, 13 );
TravelingStates( \%FrameLookup, \@Frames, \%States, "getup", 1, 19 );
-
-%::CumiStates = ( FindShorthands( \%States ), %States );
-@::CumiFrames = @Frames;
+%States = ( FindShorthands( \%States ), %States );
+
+# %::CumiStates = %States;
+# @::CumiFrames = @Frames;
+
+::RegisterFighter( {
+ 'ID' => 4,
+ 'GENDER' => 1,
+ 'DATAVERSION' => 1,
+ 'STARTCODE' => sub {},
+ 'FRAMES' => \@Frames,
+ 'STATES' => \%States,
+ 'DATAFILE' => 'CUMIDATA.DAT',
+ 'DATASIZE' => 5365949,
+} );
}
LoadCumi();
return 1;
diff --git a/data/script/DataHelper.pl b/data/script/DataHelper.pl
index 8772de4..d70e46e 100644
--- a/data/script/DataHelper.pl
+++ b/data/script/DataHelper.pl
@@ -1,622 +1,625 @@
# DataHelper contains subroutines useful for loading a character's
# frames, and creating his states.
use strict;
+require 'FighterStats.pl';
+
+
=comment
SITUATIONS ARE:
Ready, Stand, Crouch, (Midair = any + character is flying), Falling
SITUATION DEPENDENT EVENTS ARE:
Highhit, Uppercut, Hit, Groinhit, Leghit, Fall
STANDBY EVENTS ARE:
Won, Hurt, Threat, Fun, Turn
________|___Ready___________Block___Stand___________Crouch______________Midair______Falling
Highhit | HighPunched - HighPunched KneelingPunched (...) (...)
Uppercut| Falling - Falling KneelingPunched (...) (...)
Hit | LowPunched - LowPunched KneelingKicked
Groinhit| GroinKicked - GroinKicked KneelingKicked
Leghit | Swept - Swept KneelingKicked
Fall | Falling - Falling KneelingPunched
FRAME MEMBER DESCRIPTION IS:
x int X coordinate offset of the image relative to the character's anchor.
y int Y coordinate offset of the image relative to the character's anchor.
w int The width of the image.
h int The height of the image.
head array The coordinates of a polygon marking the head within the image, relative to the anchor.
body array The coordinates of a polygon marking the body within the image, relative to the anchor.
legs array The coordinates of a polygon marking the legs within the image, relative to the anchor.
hit array The coordinates of a polygon marking the hit within the image, relative to the anchor.
STATE MEMBER DESCRIPTION IS:
F int The number of the visible frame.
SITU string The situation associated with this state (Ready, Stand, Crouch, Falling)
DEL int The delay before moving to the next state.
NEXTST string The name of the state which follows this state, if none of the CONs is used.
CON hash Connections from this state. The keys are either events or keyboard input.
HIT ? The hit delivered at the beginning of this state.
BLOCK int If true, the character is blocking in his current state.
MOVE int The character's anchor should continously move this much during this state.
DELTAX int The character's anchor should immediately change by this much after this state.
PUSHX int The character is pushed, with this much momentum upon entering this state.
TURN int If true, the character's facing direction changes after this state.
JUMP int The character leaps into the air, with this much initial momentum upon entering this state.
DOODAD string A doodad is created at the beginning of this state. The string contains the doodad's type and speed.
SOUND string The sound effect associated with this state (if any);
HITSND string The sound effect if the HIT is successful.
MISSSND string The sound effect if the HIT fails.
CODE string This code will be evaled at the beginning of this state.
=cut
# Loads the frame data (x, y, w, h) from the given datafile.
# The path to the datafile is inserted automatically. The frame data will
# be shifted by (-PivotX,-PivotY).
#
# Returns an array of frame data. The first element in the array is
# a dummy entry, the second is the first real entry. This is because
# the first thing in the datafile is a PAL entry.
#
# Example: LoadFrames( "ZOLIDATA.DAT.txt" );
sub LoadFrames ($$$)
{
my ($DataName, $PivotX, $PivotY) = @_;
my (@Frames, $data, $frame);
open DATAFILE, "../characters/$DataName" || die ("Couldn't open ../characters/$DataName");
$data = '';
while ( read DATAFILE, $data, 16384, length($data) )
{
}
close DATAFILE;
print "$DataName file is ", length($data), " bytes long.\n";
# Insert a dummy first row for the palette entry
eval ("\@Frames = ( {}, $data);");
die $@ if $@;
foreach $frame (@Frames)
{
OffsetFrame( $frame, -$PivotX, -$PivotY );
}
print "$DataName loaded, ", scalar @Frames, " frames.\n";
return @Frames;
}
# Creates a frame lookup from a descriptor array.
# The first parameter is the expected number of frames.
# The descriptor array should have frame base names in even positions,
# and lengths at odd. positions. For example:
# ("start", 6, "stand", 4, ... )
#
# The routine will return a lookup which will contain the frame's logical
# name as a key, and its physical index as a value. The logical names are
# simply the basename plus a number. The example above would return:
# ("start1"=>1, "start2"=>2, ..., "start6"=>6, "stand1"=>6, "stand2"=>7, ...)
sub CreateFrameLookup
{
my ($ExpectedCount, @FrameDesc) = @_;
my ($FrameName, $NumFrames);
my ($i, $j);
my (%FrameLookup);
for ( $i=0; $i<scalar @FrameDesc; $i +=2 )
{
$FrameName = $FrameDesc[$i];
$NumFrames = $FrameDesc[$i+1];
for ( $j = 1; $j<=$NumFrames; ++$j )
{
# print "Frame ", (scalar keys %FrameLookup) + 1, " is now called $FrameName$j\n";
$FrameLookup{ "$FrameName$j" } = (scalar keys %FrameLookup) + 1;
}
}
if ( $ExpectedCount != scalar keys( %FrameLookup ) )
{
die( "Expected number of frames ($ExpectedCount) doesn't equal the actual number of frames: ".
scalar keys(%FrameLookup) );
}
return %FrameLookup;
}
# Helper function. Finds the last frame with a given name in a frame
# lookup structure. Return the index of the last frame (1-based), or
# 0 if none with the given name were found.
#
# Example: If there are 6 "highpunch" frames (highpunch1 to highpunch6),
# FindLastFrame(\%FrameLookup, "highpunch") returns 6.
sub FindLastFrame($$) {
my ($FrameLookup, $FrameName) = @_;
my ($i) = (1);
while ( exists ${$FrameLookup}{"$FrameName$i"} ) { $i++; }
return $i-1;
}
sub OffsetPolygon($$$)
{
my ($poly, $dx, $dy) = @_;
my ($i, $n);
$n = scalar @{$poly};
for ( $i=0; $i < $n; $i+=2 )
{
$poly->[$i] += $dx;
$poly->[$i+1] += $dy;
}
}
sub MirrorPolygon($)
{
my ($poly) = @_;
my ($i, $n);
$n = scalar @{$poly};
for ( $i=0; $i < $n; $i+=2 )
{
$poly->[$i] = - $poly->[$i];
}
}
sub OffsetFrame($$$) {
my ($frame, $dx, $dy) = @_;
$frame->{'x'} += $dx;
$frame->{'y'} += $dy;
OffsetPolygon( $frame->{head}, $dx, $dy ) if defined ($frame->{head});
OffsetPolygon( $frame->{body}, $dx, $dy ) if defined ($frame->{body});
OffsetPolygon( $frame->{legs}, $dx, $dy ) if defined ($frame->{legs});
OffsetPolygon( $frame->{hit}, $dx, $dy ) if defined ($frame->{hit});
}
# FindLastState returns the last index of a given state.
# For example, if Punch4 is the last in Punch, FindLastState("Punch") is 4.
sub FindLastState($$) {
my ( $States, $StateName ) = @_;
my ( $i ) = ( 1 );
while ( exists ${$States}{ "$StateName $i" } ) { $i++; }
return $i-1;
}
# Translates an abbreviated sequence to a full sequence.
# "-punch" is every punch frame backwards.
# "_punch" is every punch frame except the last one backwards.
# "+punch" is every punch frame forwards.
sub TranslateSequence($$) {
my ($FrameLookup, $Sequence) = @_;
my ($pre, $frame) = $Sequence =~ /^([+-_]{0,1})(\w+)/;
my ($LastFrame) = (FindLastFrame( $FrameLookup, $frame ) );
#$LastFrame = (FindLastFrame( $FrameLookup, "$pre$frame" ) ) if $LastFrame == 0;
#print "Last frame of $frame is $LastFrame.\n";
return "$frame 1-$LastFrame" if ( $pre eq '+' );
return "$frame $LastFrame-1" if ( $pre eq '-' );
return "$frame " . ($LastFrame-1) . "-1" if ( $pre eq '_' );
$Sequence =~ s/\sn(-{0,1})/ $LastFrame$1/; # Replace n- with last frame
$Sequence =~ s/-n/-$LastFrame/; # Replace -n with last frame
return $Sequence;
}
sub SetStateData($$$)
{
my ($state, $FrameDesc, $suffix) = @_;
$state->{DEL} = $FrameDesc->{"DEL$suffix"} if defined $FrameDesc->{"DEL$suffix"};
$state->{HIT} = $FrameDesc->{"HIT$suffix"} if defined $FrameDesc->{"HIT$suffix"};
$state->{CON} = $FrameDesc->{"CON$suffix"} if defined $FrameDesc->{"CON$suffix"};
$state->{BLOCK} = $FrameDesc->{"BLOCK$suffix"} if defined $FrameDesc->{"BLOCK$suffix"};
$state->{NEXTST} = $FrameDesc->{"NEXTST$suffix"} if defined $FrameDesc->{"NEXTST$suffix"};
$state->{MOVE} = $FrameDesc->{"MOVE$suffix"} if defined $FrameDesc->{"MOVE$suffix"};
$state->{DELTAX} = $FrameDesc->{"DELTAX$suffix"} if defined $FrameDesc->{"DELTAX$suffix"};
$state->{PUSHX} = $FrameDesc->{"PUSHX$suffix"} if defined $FrameDesc->{"PUSHX$suffix"};
$state->{TURN} = $FrameDesc->{"TURN$suffix"} if defined $FrameDesc->{"TURN$suffix"};
$state->{JUMP} = $FrameDesc->{"JUMP$suffix"} if defined $FrameDesc->{"JUMP$suffix"};
$state->{SITU} = $FrameDesc->{"SITU$suffix"} if defined $FrameDesc->{"SITU$suffix"};
$state->{DOODAD} = $FrameDesc->{"DOODAD$suffix"} if defined $FrameDesc->{"DOODAD$suffix"};
$state->{SOUND} = $FrameDesc->{"SOUND$suffix"} if defined $FrameDesc->{"SOUND$suffix"};
$state->{CODE} = $FrameDesc->{"CODE$suffix"} if defined $FrameDesc->{"CODE$suffix"};
}
# Adds a sequence to the end of a state
# Sequences are: e.g. "throw 10-14, throw 16, throw 14-10"
# Each piece of the sequence will have $Delay delay.
sub AddStates($$$) {
my ( $States, $Frames, $FrameDesc ) = @_;
my ( $StateName, $SequenceString, $LastState, $i, $sloop, $s, @Sequences );
my ( $from, $to, $frame, $state );
$StateName = $FrameDesc->{'N'};
$SequenceString = $FrameDesc->{'S'};
$FrameDesc->{SITU} = 'Stand' unless defined $FrameDesc->{SITU};
$LastState = FindLastState($States,$StateName)+1;
@Sequences = split ( /\s*,\s*/, $SequenceString );
for ( $sloop = 0; $sloop < scalar @Sequences; ++$sloop )
{
$s = TranslateSequence( $Frames, $Sequences[$sloop] );
#print "Sequence is $s\n";
if ( $s =~ /^\s*(\w+)\s+(\d+)-(\d+)\s*$/ )
{
# Sequence is '<frame> <from>-<to>'
$frame = $1;
$from = $2;
$to = $3;
}
elsif ( $s =~ /^\s*(\w+)\s+(\d+)\s*$/ )
{
# Sequence is '<frame> <number>'
$frame = $1;
$from = $to = $2;
}
else
{
die "Sequence '$s' incorrect.\n";
}
$i = $from;
while (1)
{
die "Error: Frame $frame$i doesn't exist.\n"
unless defined ${$Frames}{"$frame$i"};
$state = { 'F'=>"$frame$i" };
SetStateData( $state, $FrameDesc, '' );
SetStateData( $state, $FrameDesc, $LastState );
if ( ( $sloop == scalar @Sequences -1 ) and ( $i == $to ) )
{
SetStateData( $state, $FrameDesc, 'N' );
}
$States->{"$StateName $LastState"} = $state;
# print "Added state '$StateName $LastState' as frame '$frame$i', delay $Delay\n";
$LastState++;
if ( $from < $to )
{
$i++;
last if $i > $to;
}
else
{
$i--;
last if $i < $to;
}
}
}
}
sub BlockStates($$)
{
my ( $frames, $del) = @_;
my ( $retval, $i );
$retval = { 'N'=>'Block', 'DEL'=>$del, 'S'=>'+block', "BLOCK$frames"=>1 };
for ($i = 1; $i <= $frames; ++$i )
{
$retval->{"NEXTST$i"} = "Block " . ($i-1);
$retval->{"CON$i"} = { 'block'=> "Block " . ($i+1) };
}
$retval->{'NEXTST1'} = 'Stand';
$retval->{"CON$frames"} = { 'block'=> "Block " . $frames };
return $retval;
}
sub KneelingStates($$$$)
{
my ( $frames, $frames2, $del, $con ) = @_;
my ( $retval, $retval2, $i, $j );
$retval = { 'N'=>'Kneeling', 'DEL'=> $del, 'S' => '+kneeling', 'SITU'=>'Crouch' };
for ( $i = 1; $i <= $frames; ++$i )
{
$retval->{"NEXTST$i"} = "Kneeling " . ($i-1);
$retval->{"CON$i"} = { 'down' => "Kneeling " . ($i+1) };
}
$retval->{'NEXTST1'} = 'Stand';
$retval->{"CON$frames"} = { 'down' => "Onknees" };
$retval2 = { 'N'=>'Onknees', 'DEL'=>$del, 'S' => '+onknees,-onknees', 'SITU'=>'Crouch',
'NEXTST' => "Kneeling $frames" };
$frames2 *= 2;
for ( $i = 1; $i <= $frames2; ++$i )
{
$j = ($i % $frames2) + 1;
$retval2->{"CON$i"} = { %{$con}, 'down'=>"Onknees $j", 'forw'=>"Onknees $j", 'back'=>"Onknees $j" };
}
return ($retval, $retval2);
}
sub JumpStates($$)
{
my ( $frames, $con ) = @_;
my ( $kneelingframes, $onkneesframes,
$kickframes, $punchframes ) = (
FindLastFrame( $frames, 'kneeling' ),
FindLastFrame( $frames, 'onknees' ),
FindLastFrame( $frames, 'kneelingkick' ),
FindLastFrame( $frames, 'kneelingpunch' ) );
my ( $jump ) = 120;
my ( $i, $j, $statestotal, $statesdown, $statesknees, $deldown,
$jumpfw, $jumpbw, $flying, $flyingsequence, $jumpkick, $jumppunch );
# The jump's first part is going down on knees, second part is
# on knees, third part is getting up.
if ( $::DELMULTIPLIER )
{
$statestotal = $jump * 2 / 3 / $::DELMULTIPLIER; # 1/1
}
else
{
$statestotal = $jump * 2 / 3;
}
$statesdown = $statestotal / 4;
$deldown = int($statesdown / $kneelingframes + 0.1); # 1/1
$statesdown = $deldown * $kneelingframes;
$statesknees = $statestotal - $statesdown * 2;
$jump = { 'N'=>'Jump', 'DEL'=> $deldown, 'S'=>'kneeling 1-2, kneeling 1',
'JUMPN'=>$jump, NEXTSTN=>'JumpFly', 'SOUND1'=>'slip4.voc', };
$jumpfw = { %{$jump}, 'N'=>'JumpFW', 'PUSHX3'=>18*16 };
$jumpbw = { %{$jump}, 'N'=>'JumpBW', 'PUSHX3'=>-9*16 };
$flyingsequence = '';
$flying = {};
for ( $i = 0; $i < $statesknees / $deldown; ++$i ) #1/1
{
$j = $i + $statesdown / $deldown; #1/1
$flyingsequence .= 'onknees 1,';
$flying->{"CON$j"} = $con;
# $flying->{"DEL$j"} = 1;
}
$flyingsequence = "+kneeling, $flyingsequence -kneeling";
$flying = { %{$flying}, 'N'=>'JumpFly', 'DEL'=> $deldown, 'S'=>$flyingsequence,
'DELN'=>100 };
print join( ',', %{$flying}), "\n";
$jumpkick = { 'N'=>'JumpKick', 'HIT'=>'Fall',
'DEL'=> int( $statestotal * 2 / 3 / ( $kickframes + $kneelingframes*2 + 3 ) ), # 1/1
'S'=> '+kneelingkick,kneelingkick n, kneelingkick n, kneelingkick n,-kneelingkick,-kneeling',
'HIT'=>'Fall', 'DELN'=>100 };
$jumppunch = { 'N'=>'JumpPunch', 'HIT'=>'Highhit',
'DEL'=> int( $statestotal * 2 / 3 / ( $punchframes + $kneelingframes*2 + 3 ) ), # 1/1
'S'=> '+kneelingpunch,kneelingpunch n, kneelingpunch n, kneelingpunch n,-kneelingpunch,-kneeling',
'HIT'=>'Fall', 'DELN'=>100 };
return ($jump, $jumpfw, $jumpbw, $flying, $jumpkick, $jumppunch);
}
sub WalkingFrames($$$$$)
{
my ( $frameLookup, $frameArray, $preFrames, $distance, $con ) = @_;
my ( $walkFrames, $totalFrames, $seq, $seq2, $distPerFrame,
$walk, $back, $walkNextst, $backNextst,
$i, $j, );
$totalFrames = FindLastFrame( $frameLookup, 'walk' );
$walkFrames = $totalFrames - $preFrames;
if ( $preFrames > 0 ) {
$seq = "+walk, walk $preFrames-1";
$seq2 = "walk 1-$preFrames, -walk";
} else {
$seq = "+walk";
$seq2 = "-walk";
}
$walk = { 'N'=>'Walk', 'S'=>$seq, 'DEL'=>5, 'CON'=>$con };
$back = { 'N'=>'Back', 'S'=>$seq2, 'DEL'=>5, };
# Add attributes for the 'pre' states.
for ( $i=1; $i <= $preFrames; ++$i )
{
$j = $i + 1;
$walk->{"CON$i"} = { %{$con}, 'forw' => "Walk $j" };
$walk->{"NEXTST$i"} = 'Stand';
$back->{"CON$i"} = { %{$con}, 'back' => "Back $j" };
$back->{"NEXTST$i"} = 'Stand';
}
# Add attributes for the 'walk' states.
$walkNextst = $preFrames ? 'Walk ' . ($totalFrames+1) : 'Stand';
$backNextst = $preFrames ? 'Back ' . ($totalFrames+1) : 'Stand';
$distPerFrame = $distance / $walkFrames; # 1/1
print "*** $preFrames $walkFrames $totalFrames $walkNextst $backNextst\n";
for ( $i=$preFrames+1; $i <= $totalFrames; ++$i )
{
$j = ($i == $totalFrames) ? $preFrames+1 : $i+1;
$walk->{"MOVE$i"} = 4;
$walk->{"NEXTST$i"} = $walkNextst;
$walk->{"CON$i"} = { %{$con}, 'forw' => "Walk $j" };
$back->{"MOVE$i"} = -4;
$back->{"NEXTST$i"} = $backNextst;
$back->{"CON$i"} = { %{$con}, 'back' => "Back $j" };
OffsetFrame( $frameArray->[$frameLookup->{"walk$i"}],
- ($i-$preFrames-1) * $distPerFrame, 0 );
}
return ( $walk, $back );
}
sub TravelingStates( $$$$$$ )
{
my ( $frameLookup, $frameArray, $states, $frameName, $from, $to ) = @_;
$from = 1 unless $from;
$to = FindLastFrame( $frameLookup, $frameName ) unless $to;
my ( $fromIndex, $toIndex, $fromFrame, $toFrame, $fromOffset, $toOffset,
$deltax, $i, $state, $nextst );
# 1. Calculate the 'deltax' and 'fromOffset'.
$fromIndex = $frameLookup->{"$frameName$from"};
die "couldn't find frame $frameName$from" unless defined $fromIndex;
$toIndex = $fromIndex - $from + $to;
$fromFrame = $frameArray-> [ $fromIndex ];
$toFrame = $frameArray-> [ $toIndex ];
$fromOffset = $fromFrame->{x} + ($fromFrame->{w} >> 1);
$toOffset = $toFrame->{x} + ($toFrame->{w} >> 1);
$deltax = ( $toOffset - $fromOffset ) / ( $to - $from ); #1/1
# print "Offsets: $fromOffset $toOffset $deltax\n";
# 2. Offset every relevant frame.
for ( $i=$fromIndex; $i<=$toIndex; ++$i )
{
# print "Offsetting frame $i by ", - $fromOffset - $deltax * ($i-$fromIndex), "\n";
OffsetFrame( $frameArray->[$i],
- $fromOffset - $deltax * ($i-$fromIndex), 0 );
}
# 3. Apply deltax to every relevant state.
while ( ($i, $state) = each %{$states} )
{
if ( $state->{F} >= $fromIndex and $state->{F} <= $toIndex )
{
$nextst = $states->{$state->{NEXTST}};
if ( $nextst->{F} >= $fromIndex and $nextst->{F} <= $toIndex )
{
$state->{DELTAX} = $deltax * ($nextst->{F} - $state->{F});
# print "Fixing state $i : deltax = ", $state->{DELTAX}, "\n";
}
}
}
}
sub FixStates($$)
{
my ( $frameLookup, $states ) = @_;
my ( $framename, $st, $lastchar, $key, $value, $nextchar, $nextst );
while (($key, $value) = each %{$states})
{
$framename = $value->{'F'};
unless ( $framename =~/^\d+$/ )
{
# Convert non-numeric frames to their numeric counterparts.
die "Can't find image $framename in frame $key" unless defined $frameLookup->{ $framename };
$value->{'F'} = $frameLookup->{ $framename };
}
($st,$lastchar) = $key =~ /(\w+)\s+(\d+)/;
unless ( defined $value->{'NEXTST'} )
{
$nextchar = $lastchar + 1;
$nextst = "$st $nextchar";
unless ( defined $states->{$nextst} ) {
# print "Go to Standby after $key\n";
$nextst = 'Stand';
}
$value->{'NEXTST'} = $nextst;
}
}
}
sub FindShorthands($)
{
my ( $states ) = @_;
my ( $key, $value, $st, $lastchar, %Shorthands );
while (($key, $value) = each %{$states})
{
($st,$lastchar) = $key =~ /(\w+)\s+(\d+)/;
print "$key has no lastchar" unless defined $lastchar;
if ( $lastchar == 1 )
{
$Shorthands{$st} = $states->{$key};
}
}
return %Shorthands;
}
return 1;
diff --git a/data/script/Descant.pl b/data/script/Descant.pl
index d4acc1e..13d0555 100644
--- a/data/script/Descant.pl
+++ b/data/script/Descant.pl
@@ -1,194 +1,205 @@
# package Descant;
require 'DataHelper.pl';
use strict;
sub LoadDescant
{
my ( @Frames, %FrameLookup, %Frames, %States, %Shorthands,
$Doodad, $Con, $Con2,
@States1,
$framedesc, $key, $value, $framename, $nextst, $st, $lastchar, $nextchar );
@Frames = LoadFrames( "DESCANTDATA.DAT.pl", 280, 200 );
%FrameLookup = CreateFrameLookup( scalar @Frames -1,
"start", 13, "stand", 4, "walk", 10,
"turn", 9, "falling", 16, "laying", 1,
"getup", 15, "hurt", 7, "swept", 10,
"won", 20, "block", 5, "kneeling", 4,
"onknees", 4, "kneelingpunch",5, "kneelingkick", 5,
"fun", 13, "threat", 7,
"highpunch", 5, "lowpunch", 6, "highkick", 7,
"lowkick", 6, "sweep", 11, "groinkick", 6,
"kneekick", 6, "elbow", 5,
"grenade", 10, "uppercut", 7, "throw", 23,
"highpunched", 5, "lowpunched", 6, "groinkicked", 9,
"kneelingpunched",5, "kneelingkicked", 5, "thrown", 8,
"knife", 17, "specpunch", 19, "hipshot", 9,
"funb", 11,
);
$Doodad =
{ 'T' => 1,
'W' => 64,
'H' => 64,
'SX' => 15,
'SY' => 0,
'FRAMES'=> 6,
'SA' => 1/25,
};
$Con = {
'forw'=>'Walk',
'back'=>'Back',
'jump'=>'Jump',
'jumpfw'=>'JumpFW',
'jumpbw'=>'JumpBW',
'block'=>'Block',
'down'=>'Kneeling',
'hpunch'=>'HighPunch',
'lpunch'=>'LowPunch',
'hkick'=>'HighKick',
'lkick'=>'LowKick',
'lkickBF'=>'GroinKick',
'lkickF'=>'KneeKick',
'hpunchD'=>'Uppercut',
'hpunchF'=>'Elbow',
'lkickB'=>'Sweep',
'lpunchBD'=>'Grenade',
'hpunchDF'=>'Knife',
'hpunchFF'=>'SpecPunch',
'lpunchBB'=>'HipShot',
};
$Con2 = {
'lkick'=>'KneelingKick',
'hkick'=>'KneelingKick',
'hpunch'=>'KneelingUppercut',
'lpunch'=>'KneelingPunch',
};
@States1 = (
# 1. BASIC MOVES
{ 'N'=>'Start', 'DEL'=>7, 'S'=>'+start' },
{ 'N'=>'Stand', 'DEL'=>10, 'S'=>'+stand,_stand', 'CON'=>$Con, 'SITU'=>'Ready' },
{ 'N'=>'Turn', 'DEL'=>5, 'S'=>'+turn', 'TURNN'=>1, },
{ 'N'=>'Hurt', 'DEL'=>8, 'S'=>'+hurt, -hurt' },
{ 'N'=>'Won', 'DEL'=>8, 'S'=>'+won', 'NEXTSTN'=> 'Won2' },
{ 'N'=>'Won2', 'DEL'=>1000,'S'=>'won n', 'NEXTST'=>'Won2', },
{ 'N'=>'Fun', 'DEL'=>10, 'S'=>'+fun', 'CON'=>$Con },
{ 'N'=>'Funb', 'DEL'=>8, 'S'=>'+funb,-funb', 'CON'=>$Con },
{ 'N'=>'Threat', 'DEL'=>7, 'S'=>'+threat,-threat', 'CON'=>$Con },
WalkingFrames( \%FrameLookup, \@Frames, 1, 100, $Con ),
BlockStates( FindLastFrame( \%FrameLookup, 'block' ), 5 ),
KneelingStates( FindLastFrame( \%FrameLookup, 'kneeling' ),
FindLastFrame( \%FrameLookup, 'onknees' ), 7, $Con2 ),
JumpStates( \%FrameLookup,
{'lkick'=>'JumpKick', 'hkick'=>'JumpKick',
'lpunch'=>'JumpPunch', 'hpunch'=>'JumpPunch',
'hpunchFF'=>'JumpFire'} ),
# 2. OFFENSIVE MOVES
{ 'N'=>'KneelingPunch', 'DEL'=>7, 'S'=>'+kneelingpunch,-kneelingpunch', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKick', 'DEL'=>7, 'S'=>'+kneelingkick,-kneelingkick', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingUppercut','DEL'=>5, 'S'=>'kneeling 4-3,uppercut 6-n,-uppercut',
'HIT'=>'Uppercut' },
{ 'N'=>'HighPunch', 'DEL'=>5, 'S'=>'+highpunch,-highpunch',
'HIT'=>'Highhit' },
{ 'N'=>'LowPunch', 'DEL'=>5, 'S'=>'+lowpunch,-lowpunch',
'HIT'=>'Hit' },
{ 'N'=>'HighKick', 'DEL'=>5, 'S'=>'+highkick,-highkick',
'HIT'=>'Hit' },
{ 'N'=>'LowKick', 'DEL'=>5, 'S'=>'+lowkick,-lowkick',
'HIT'=>'Leghit' },
{ 'N'=>'GroinKick', 'DEL'=>5, 'S'=>'+groinkick,-groinkick',
'HIT'=>'Groinhit' },
{ 'N'=>'KneeKick', 'DEL'=>5, 'S'=>'+kneekick,-kneekick',
'HIT'=>'Hit' },
{ 'N'=>'Elbow', 'DEL'=>5, 'S'=>'+elbow,-elbow',
'HIT'=>'Highhit' },
{ 'N'=>'Sweep', 'DEL'=>8, 'S'=>'+sweep',
'HIT'=>'Hit' },
{ 'N'=>'Grenade', 'DEL'=>5, 'S'=>'+grenade,_grenade',
'DEL12'=>15, 'DOODAD'=>$Doodad },
{ 'N'=>'Uppercut', 'DEL'=>5, 'S'=>'+uppercut,-uppercut',
'HIT'=>'Uppercut' },
{ 'N'=>'Throw', 'DEL'=>8, 'S'=>'+throw' },
{ 'N'=>'Knife', 'DEL'=>7, 'S'=>'+knife' },
{ 'N'=>'SpecPunch', 'DEL'=>7, 'S'=>'+specpunch',
'HIT'=>'Highhit' },
{ 'N'=>'HipShot', 'DEL'=>7, 'S'=>'+hipshot, -hipshot',
'DOODAD9'=>$Doodad },
# 3. HURT MOVES
{ 'N'=>'Falling', 'DEL'=>5, 'S'=>'+falling, laying 1',
'DELN'=>500, 'NEXTN'=>'Laying', 'SITU'=>'Falling', },
{ 'N'=>'Laying', 'DEL'=>1000,'S'=>'+laying',
'SITU'=>'Falling' },
{ 'N'=>'Getup', 'DEL'=>5, 'S'=>'+getup',
'SITU'=>'Falling',
'CON8'=>{'down'=>'Onknees'},
'CON9'=>{'down'=>'Onknees'},
},
{ 'N'=>'Dead', 'DEL'=>10000, 'S'=>'laying 1',
'SITU'=>'Falling', 'NEXTST'=>'Dead' },
{ 'N'=>'Swept', 'DEL'=>7, 'S'=>'+swept',
'MOVE'=>-1 },
{ 'N'=>'KneelingPunched', 'DEL'=>5, 'S'=>'+kneelingpunched,-kneelingpunched',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKicked', 'DEL'=>5, 'S'=>'+kneelingkicked, -kneelingkicked',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'HighPunched', 'DEL'=>8, 'S'=>'+highpunched, -highpunched' },
{ 'N'=>'LowPunched', 'DEL'=>5, 'S'=>'+lowpunched, -lowpunched' },
{ 'N'=>'GroinKicked', 'DEL'=>7, 'S'=>'+groinkicked, -groinkicked' },
{ 'N'=>'Thrown', 'DEL'=>5, 'S'=>'+thrown' },
);
# 2. CREATE STATES
foreach $framedesc (@States1)
{
AddStates( \%States, \%FrameLookup, $framedesc );
}
# Automatically add NEXTST for states which don't have one.
FixStates( \%FrameLookup, \%States );
TravelingStates( \%FrameLookup, \@Frames, \%States, "falling", 1, 17 );
TravelingStates( \%FrameLookup, \@Frames, \%States, "getup", 0, 0 );
TravelingStates( \%FrameLookup, \@Frames, \%States, "swept", 0, 0 );
%States = ( FindShorthands( \%States ), %States );
-%::DescantStates = %States;
-@::DescantFrames = @Frames;
+#%::DescantStates = %States;
+#@::DescantFrames = @Frames;
+
+::RegisterFighter( {
+ 'ID' => 9,
+ 'GENDER' => 1,
+ 'DATAVERSION' => 1,
+ 'STARTCODE' => sub {},
+ 'FRAMES' => \@Frames,
+ 'STATES' => \%States,
+ 'DATAFILE' => 'DESCANTDATA.DAT',
+ 'DATASIZE' => 5877193,
+} );
}
LoadDescant();
return 1;
diff --git a/data/script/Doodad.pl b/data/script/Doodad.pl
index 4703c75..12ff8c2 100644
--- a/data/script/Doodad.pl
+++ b/data/script/Doodad.pl
@@ -1,204 +1,309 @@
=comment
Doodad members are:
+T int The Doodad's type. 0 means text.
+OWNER int The Doodad's owner (0 for player 1, 1 for player 2, other means no owner)
+HOSTILE int 1 if the doodad can collision with players and damage them.
+LIFETIME int The amount of time before this doodad dies. -1 means infinite.
+
POS (int,int) The Doodad's logical position.
SIZE (int,int) The Doodad's physical size.
SPEED (int,int) The Doodad's logical speed.
ACCEL (int,int) The Doodad's logical acceleration.
-T int The Doodad's type. 0 means text.
-F int The Doodad's frame.
-OWNER int The Doodad's owner (0 for player 1, 1 for player 2, other means no owner)
+DIR int 1: heading right; -1: heading left (implies flipped state)
+
GFXOWNER int The Doodad's graphics owner (0 for player 1, 1 for player 2, other means global)
-SA int Animation speed
+FIRSTFRAME int The first frame of the doodad (only meaningful if GFXOWNER is a player).
FRAMES int The number of frames.
-LIFETIME int The amount of time before this doodad dies. -1 means infinite.
+SA int Animation speed
+F int The Doodad's frame.
TEXT string The text displayed in a text doodad.
-HOSTILE int 1 if the doodad can collision with players and damage them.
+
+UPDATECODE sub This will be ran instead of MoveDoodad if defined.
Doodad types are:
0 Text
1 Zoli's shot
-
+2 UPi's shot
+3 UPi's explosion
+4 UPi's familiar
=cut
use strict;
require 'Collision.pl';
-%::DoodadDefinitions = (
+package Doodad;
+
+
+%Doodad::DoodadDefinitions = (
'ZoliShot' => {
- 'W' => 64, 'H' => 64, 'T' => 1,
- 'SX' => 48, 'SY' => -5, 'AX' => 0, 'AY' => 1,
- 'SA' => 1/25, 'FRAMES'=>6, 'HOSTILE'=> 1, },
+ 'T' => 1, 'HOSTILE' => 1, 'LIFETIME' => -1,
+ 'SIZE' => [ 64, 64 ], 'SPEED' => [ 48, -25 ], 'ACCEL' => [ 0, 2 ],
+
+ 'GFXOWNER' => 2, 'FIRSTFRAME' => 0, 'FRAMES' => 6,
+ 'SA' => 1/25
+},
'UPiShot' => {
- 'W' =>170, 'H' => 22, 'T' => 2,
- 'SX' => 48, 'SY' => 0, 'AX' => 0, 'AY' => 0,
- 'SA' => 1/10, 'FRAMES'=>5, 'HOSTILE'=> 1, },
-
-'Explosion' => {
- 'W' => 58, 'H' => 80, 'T' => 3,
- 'SX' => 0, 'SY' => 0, 'AX' => 0, 'AY' => 0,
- 'SA' => 1/10, 'FRAMES'=>15, 'HOSTILE'=> 0, },
+ 'T' => 2, 'HOSTILE' => 1, 'LIFETIME' => -1,
+ 'SIZE' => [170, 22], 'SPEED' => [ 48, 0 ], 'ACCEL' => [ 0, 0 ],
+
+ 'GFXOWNER' => 0, 'FIRSTFRAME' => 340, 'FRAMES' => 5,
+ 'SA' => 1/5,
+},
+
+'UPiExplosion' => {
+ 'T' => 3, 'HOSTILE' => 0, 'LIFETIME' => 30,
+ 'SIZE' => [ 58, 80], 'SPEED' => [ 0, 0 ], 'ACCEL' => [ 0, 0 ],
+
+ 'GFXOWNER' => 0, 'FIRSTFRAME' => 345, 'FRAMES' => 15,
+ 'SA' => 1/2,
+},
+
+'UPiFamiliar' => {
+ 'T' => 3, 'HOSTILE' => 0, 'LIFETIME' => -1,
+ 'SIZE' => [ 20, 20], 'SPEED' => [ 0, 0 ], 'ACCEL' => [ 0, 0 ],
+
+ 'GFXOWNER' => 0, 'FIRSTFRAME' => 360, 'FRAMES' => 3,
+ 'SA' => 1/10,
+
+ 'ANGLE' => 0,
+ 'UPDATECODE' => sub {
+ my ($self) = @_;
+ my ($fighter, $frame, $head, $targetposx, $targetposy);
+
+ $fighter = $self->{OWNER} ? $::Fighter2 : $::Fighter1;
+ $frame = $fighter->{FRAMES}->[$fighter->{FR}];
+ $head = $frame->{head};
+
+ $self->{ANGLE} += 0.05 * $self->{DIR};
+ $targetposx = $fighter->{X} + $head->[0] * $::GAMEBITS2 * $fighter->{DIR} + sin( $self->{ANGLE} ) * 300;
+ $targetposy = $fighter->{Y} + $head->[1] * $::GAMEBITS2 + cos( $self->{ANGLE} ) * 300;
+
+ if ( $fighter->{HP} > 0 )
+ {
+ $self->{ACCEL}->[0] = ($targetposx - $self->{POS}->[0] ) / 200;
+ $self->{ACCEL}->[1] = ($targetposy - $self->{POS}->[1] ) / 200;
+ $self->{SPEED}->[0] += $self->{ACCEL}->[0];
+ $self->{SPEED}->[1] += $self->{ACCEL}->[1];
+ $self->{SPEED}->[0] *= 0.95;
+ $self->{SPEED}->[1] *= 0.95;
+ }
+
+ #$self->{SPEED}->[0] = ($targetposx - $self->{POS}->[0]) / 30;
+ #$self->{SPEED}->[1] = ($targetposy - $self->{POS}->[1]) / 30;
+ $self->{POS}->[0] += $self->{SPEED}->[0];
+ $self->{POS}->[1] += $self->{SPEED}->[1];
+
+ $self->{F} += $self->{SA};
+ $self->{F} -= $self->{FRAMES} if $self->{F} > ($self->{FRAMES} + $self->{FIRSTFRAME});
+
+ return 0;
+ },
+},
+
);
=comment
CreateDoodad creates a new doodad, and appends it to the global doodad list,
@Doodads. The parameters are:
x int The logical horizontal position of the center of the doodad
y int The logical vertical position of the center of the doodad
t string The type of the doodad (doodad types are described above)
+ dir int 1 or -1
owner int The number of the player who 'owns' the doodad (0 or 1, anything else means no owner)
=cut
-sub CreateDoodad($$$$)
+sub CreateDoodad
{
- my ($x, $y, $t, $owner) = @_;
+ my ($x, $y, $t, $dir, $owner) = @_;
my ($doodad, $doodaddef, $w, $h);
-
- $doodaddef = $::DoodadDefinitions{$t};
+
+ $doodaddef = $Doodad::DoodadDefinitions{$t};
+
+ if ( ( not defined $doodaddef ) and $t != 0 )
+ {
+ print "CreateDoodad: Doodad $doodaddef doesn't exist!\n";
+ return
+ }
+
if ( defined $doodaddef )
{
- $w = $doodaddef->{W};
- $h = $doodaddef->{H};
+ $w = $doodaddef->{SIZE}->[0];
+ $h = $doodaddef->{SIZE}->[1];
$t = $doodaddef->{T};
}
else
{
$w = $h = $t = 0;
$doodaddef = {};
}
$doodad = {
- 'X' => $x - $w * $::GAMEBITS2 / 2, #1/1
- 'Y' => $y - $h * $::GAMEBITS2 / 2, #1/1
- 'W' => $w,
- 'H' => $h,
- 'T' => $t,
- 'F' => 0,
- 'OWNER' => $owner,
- 'SX' => 0,
- 'SY' => 0,
- 'SA' => 0,
- 'FRAMES'=> 0,
- 'LIFETIME'=> -1,
- 'HOSTILE'=> 1,
- %{$doodaddef}
+ 'T' => $t,
+ 'OWNER' => $owner,
+ 'HOSTILE' => 0,
+ 'LIFETIME' => -1,
+
+ 'POS' => [ $x - $w * $::GAMEBITS2 / 2, $y - $h * $::GAMEBITS2 / 2 ],
+ 'SIZE' => [ $w, $h ],
+ 'SPEED' => [ 0, 0 ],
+ 'ACCEL' => [ 0, 0 ],
+ 'DIR' => $dir,
+
+ 'GFXOWNER' => $owner,
+ 'FIRSTFRAME'=> 0,
+ 'FRAMES' => 1,
+ 'SA' => 0,
+ 'F' => 0,
+ 'TEXT' => '',
+ %{$doodaddef},
};
+ $doodad->{SIZE} = [@{$doodaddef->{SIZE}} ] if defined $doodaddef->{SIZE};
+ $doodad->{SPEED} = [@{$doodaddef->{SPEED}}] if defined $doodaddef->{SPEED};
+ $doodad->{ACCEL} = [@{$doodaddef->{ACCEL}}] if defined $doodaddef->{ACCEL};
+ $doodad->{F} = $doodad->{FIRSTFRAME};
+
+ $doodad->{SPEED}->[0] *= $doodad->{DIR};
+ $doodad->{ACCEL}->[0] *= $doodad->{DIR};
+ $doodad->{GFXOWNER} = $owner if $doodad->{GFXOWNER} < 2;
+
push @::Doodads, ($doodad);
return $doodad;
}
+
sub CreateTextDoodad
{
my ($x, $y, $owner, $text) = @_;
my ($self);
- $self = CreateDoodad($x, $y, 0, $owner);
+ $self = CreateDoodad($x, $y, 0, 0, $owner);
$self->{'TEXT'} = $text;
+ $self->{'GFXOWNER'} = 2;
return $self;
}
=comment
UpdateDoodad is called once every game tick.
It should return 0 if the doodad is still active.
If UpdateDoodad returns nonzero, it will be removed in this tick and
deleted.
=cut
sub UpdateDoodad
{
my ($doodad) = @_;
+
+ if ( exists $doodad->{UPDATECODE} )
+ {
+ # Call the updatecode.
+ return &{$doodad->{UPDATECODE}}( $doodad );
+ }
+ else
+ {
+ return MoveDoodad( $doodad );
+ }
+}
+
+sub MoveDoodad
+{
+ my ($doodad) = @_;
+
if ( $doodad->{LIFETIME} >= 0 )
{
$doodad->{LIFETIME} -= 1;
if ( $doodad->{LIFETIME} < 0 )
{
# Doodad dies.
return 1;
}
}
- $doodad->{X} += $doodad->{SX};
- $doodad->{Y} += $doodad->{SY};
+ $doodad->{SPEED}->[0] += $doodad->{ACCEL}->[0];
+ $doodad->{SPEED}->[1] += $doodad->{ACCEL}->[1];
+ $doodad->{POS} ->[0] += $doodad->{SPEED}->[0];
+ $doodad->{POS} ->[1] += $doodad->{SPEED}->[1];
+
$doodad->{F} += $doodad->{SA};
+ $doodad->{F} -= $doodad->{FRAMES} if $doodad->{F} > ($doodad->{FRAMES} + $doodad->{FIRSTFRAME});
- while ( $doodad->{F} > $doodad->{FRAMES} )
- {
- $doodad->{F} -= $doodad->{FRAMES};
- }
-
- if ( $doodad->{X} > $::BGWIDTH2 ) { return 1; }
- if ( $doodad->{X} < $doodad->{W} * $::GAMEBITS2 ) { return 1; }
- if ( $doodad->{Y} > $::SCRHEIGHT2 ) { return 1; }
- if ( $doodad->{Y} < $doodad->{H} * $::GAMEBITS2 ) { return 1; }
+ if ( $doodad->{POS}->[0] > $::BGWIDTH2 ) { return 1; }
+ if ( $doodad->{POS}->[0] < $doodad->{SIZE}->[0] * $::GAMEBITS2 ) { return 1; }
+ if ( $doodad->{POS}->[1] > $::SCRHEIGHT2 ) { return 1; }
+ if ( $doodad->{POS}->[1] < $doodad->{SIZE}->[1] * $::GAMEBITS2 ) { return 1; }
if ( $doodad->{HOSTILE} )
{
- # CheckHit($doodad);
+ CheckDoodadHit($doodad);
}
+ print "Doodad: POS=", join(',', @{$doodad->{POS}}),
+ "; SPEED=", join(',', @{$doodad->{SPEED}}),
+ "; ACCEL=", join(',', @{$doodad->{ACCEL}}), "\n";
+
return 0;
}
-=comment
-sub CheckHit($)
+sub CheckDoodadHit($)
{
my ( $self ) = @_;
my ( @poly, $x, $y, $w, $h );
- $x = $self->{X} / $::GAMEBITS2;
- $y = $self->{Y} / $::GAMEBITS2;
- $w = $self->{W};
- $h = $self->{H};
+ $x = $self->{POS}->[0] / $::GAMEBITS2;
+ $y = $self->{POS}->[1] / $::GAMEBITS2;
+ $w = $self->{SIZE}->[0];
+ $h = $self->{SIZE}->[1];
@poly = (
$x, $y,
$x+$w, $y,
$x+$w, $y+$h,
$x, $y+$h );
if ( $self->{OWNER} != 0 )
{
if ( $::Fighter1->IsHitAt( \@poly ) )
{
DoHitPlayer($self, $::Fighter1);
}
}
if ( $self->{OWNER} != 1 )
{
if ( $::Fighter2->IsHitAt( \@poly ) )
{
DoHitPlayer($self, $::Fighter2);
}
}
}
sub DoHitPlayer($$)
{
my ($self,$player) = @_;
- $player->
+ $self->{HOSTILE} = 0;
+ $player->HitEvent( 'Hit', $self->{T} );
}
=cut
return 1;
diff --git a/data/script/Fighter.pl b/data/script/Fighter.pl
index 8246a1d..8c0fe0b 100644
--- a/data/script/Fighter.pl
+++ b/data/script/Fighter.pl
@@ -1,792 +1,797 @@
require 'Collision.pl';
require 'DataHelper.pl';
require 'Damage.pl';
package Fighter;
use strict;
=comment
Fighter's members are:
+ID int The ID of the fighter
+STATS hash Reference to the fighter's stats (includes GENDER)
NAME string The name of the character, e.g. "Ulmar".
FRAMES array The character's frame description.
STATES hash The character's state description.
+
NUMBER int Player number (either 0 or 1)
X int The fighter's current anchor, horizontal coordinate.
Y int The fighter's current anchor, vertical coordinate.
ST string The name of the fighter's current state.
FR int The number of the fighter's current frame (same as STATES->{ST}->{F}).
DEL int The amount of time before the character moves to the next state.
NEXTST string The name of the next state after this one (calculated by Advance and Event, user by Update).
DIR int -1: the character is facing left; 1: if the character is facing right.
PUSHY int The character's vertical momentum, from jumping/hits.
PUSHX int The character's horizontal momentum, from hits.
HP int Hit points, from 100 down to 0.
IDLE int The amount of game time since the player is ready.
CHECKEHIT int 1 if the hit needs to be checked soon.
DELIVERED int 1 if a hit was delivered in this state.
COMBO int The number of consecutive hits delivered to this fighter.
COMBOHP int The amount of HP delivered in the last combo.
OTHER hash A reference to the other Fighter
new
Reset
Advance
CheckHit
IsHitAt
Event
Update
Needs to be subclassed: Reset, NextState
=cut
sub new {
my ($class) = @_;
my $self = {
'NUMBER'=> 0,
'ST' => 'Start',
'FR' => 0,
'DEL' => 0,
'DIR' => 1,
'PUSHY' => 0,
'PUSHX' => 0,
};
bless $self, $class;
return $self;
}
sub Reset {
- my ($self, $name, $frames, $states) = @_;
+ my ($self, $fighterenum) = @_;
die "Insufficient parameters." unless defined $self;# and defined $frames and defined $states;
+ $fighterenum = $self->{ID} unless defined $fighterenum;
- my ($number);
+ my ($number, $stats);
$number = $self->{NUMBER};
-
- print STDERR "Resetting fighter $number\n";
-
- $self->{NAME} = $name if defined $name;
- $self->{FRAMES} = $frames if defined $frames;
- $self->{STATES} = $states if defined $states;
+ $stats = ::GetFighterStats($fighterenum);
+
+ die "Couldn't load stats of fighter $fighterenum\n" unless defined $stats;
+ die "The fighter $fighterenum is not yet usable.\n" unless defined $stats->{STATES};
+
+ print STDERR "Resetting fighter $number to character $fighterenum\n";
+
+ $self->{ID} = $fighterenum;
+ $self->{STATS} = $stats;
+ $self->{NAME} = $stats->{NAME};
+ $self->{FRAMES} = $stats->{FRAMES};
+ $self->{STATES} = $stats->{STATES};
$self->{X} = (( $number ? 540 : 100 ) << $::GAMEBITS) + $::BgPosition;
$self->{Y} = $::GROUND2;
$self->{ST} = 'Start';
$self->{FR} = $self->GetCurrentState()->{F};
$self->{DEL} = 0;
$self->{DIR} = ($number ? -1 : 1);
$self->{PUSHY} = 0;
$self->{PUSHX} = 0;
$self->{HP} = 100;
$self->{IDLE} = 0;
$self->{CHECKHIT} = 0;
$self->{DELIVERED} = 0;
$self->{COMBO} = 0;
$self->{COMBOHP}= 0;
+
+ &{$self->{STATS}->{STARTCODE}}($self);
}
=comment
Advance should be called once every game tick. It advances the fighter,
preparing his variables for drawing him in the next tick. Advance also
processes the input if it is appropriate to do so in the current state.
Advance prepares the NEXTST attribute of the player. It does not modify
the current ST yet, because that may depend on hits, event, etc. Advance
should be followed by CheckHit and Event calls, and finally Update.
=cut
sub Advance {
my ($self, $in) = @_;
my ($stname, # The name of the current state.
$st, # The descriptor of the current state.
$move, # The move associated with the current state.
$i, $j, # temp var.
@body ); # collision detection
$self->{NEXTST} = '';
$stname = $self->{ST};
$st = $self->{'STATES'}->{$stname};
# 1. DECREMENT 'DEL' PROPERTY
$self->{'DEL'}--;
if ( $st->{SITU} eq 'Ready' )
{
$self->{IDLE} = $self->{IDLE} + 1;
}
else
{
$self->{IDLE} = 0;
}
# 2. UPDATE THE HORIZONTAL POSITION
# 2.1. 'MOVE' PLAYER IF NECESSARY
if ( defined $st->{'MOVE'} )
{
$move = $st->{'MOVE'}*$self->{'DIR'} * 6;
$self->{'X'} += $move;
}
# 2.2. 'PUSH' PLAYER IF NECESSARY
if ( $self->{PUSHX} )
{
$i = ($self->{PUSHX}+7) / 8; # 1/1; syntax highlight..
$self->{X} += $i;
$self->{PUSHX} -= $i if $self->{PUSHY} == 0;
}
# 2.3. MAKE SURE THE TWO FIGHTERS DON'T "WALK" INTO EACH OTHER
if ( $self->{Y} >= $::GROUND2 and
$self->{OTHER}->{Y} >= $::GROUND2 )
{
my ( $centerX, $centerOtherX, $pushDir );
$centerX = $self->GetCenterX;
$centerOtherX = $self->{OTHER}->GetCenterX;
if ( abs($centerX - $centerOtherX) < 60 )
{
$pushDir = ($centerX > $centerOtherX) ? 1 : -1;
$self->{X} += 10 * $pushDir;
$self->{OTHER}->{X} -= 10 * $pushDir;
}
}
# 2.4. HORIZONTAL BOUNDS CHECKING
$self->{X} = $::BgPosition + $::MOVEMARGIN2
if $self->{X} < $::BgPosition + $::MOVEMARGIN2;
$self->{X} = $::BgPosition + $::SCRWIDTH2 - $::MOVEMARGIN2
if $self->{X} > $::BgPosition + $::SCRWIDTH2 - $::MOVEMARGIN2;
# 3. FLYING OR FALLING
if ( $self->{Y} < $::GROUND2 )
{
$self->{PUSHY} += 3;
$self->{Y} += $self->{PUSHY};
if ($self->{Y} >= $::GROUND2)
{
# LANDING
if ( $st->{SITU} eq 'Falling')
{
::AddEarthquake( $self->{PUSHY} / 20 );
push @::Sounds, ('splat.wav') if $self->{PUSHY} > 40;
# print "PUSHY = ", $self->{PUSHY}, "; ";
if ( $self->{PUSHY} > 30 )
{
# Bouncing after a fall
$self->{PUSHY} = - $self->{PUSHY} / 2; # 1/1
$self->{Y} = $::GROUND2 - 1;
}
else
{
# Getting up after a fall.
$self->{PUSHY} = 0;
$self->{Y} = $::GROUND2;
$self->{DEL} = 0;
$self->{NEXTST} = 'Getup';
$self->{NEXTST} = 'Dead' if $self->{HP} <= 0;
}
return;
}
else
{
push @::Sounds, ('thump.wav');
$self->{PUSHY} = 0;
$self->{Y} = $::GROUND2;
if ( substr($self->{ST},0,4) eq 'Jump' )
{
# Landing after a jump
$self->{DEL} = 0;
$self->{NEXTST} = 'Stand';
}
else
{
print "Landed; state: ", $self->{ST}, "\n";
}
return;
}
}
}
return if $self->{'DEL'} > 0;
# 4. DELAYING OVER. MAKE END-OF-STATE CHANGES.
# 4.1. 'DELTAX' displacement if so specified
if ($st->{DELTAX})
{
$self->{X} += $st->{DELTAX} * $self->{DIR} * $::GAMEBITS2;
}
# 4.2. 'TURN' if so specified
if ($st->{TURN})
{
$self->{DIR} = - $self->{DIR};
# Swap input keys..
$i = $in->{Keys}->[2];
$in->{Keys}->[2] = $in->{Keys}->[3];
$in->{Keys}->[3] = $i;
}
# 5. CALCULATE THE NEXT STATE
my ($nextst, $con, $input, $mod, $action, $dist);
$nextst = $st->{NEXTST};
$con = $st->{CON};
$dist = ($self->{OTHER}->{X} - $self->{X}) * $self->{DIR};
undef $con if $::ko;
if ( defined $con )
{
$self->ComboEnds();
# 5.1. The current state has connections!
($input,$mod) = $in->GetAction();
$mod = '' unless defined $mod;
$action = $input;
# Try to find the best matching connection.
for ( $i = length($mod); $i>=0; --$i )
{
$action = $input . substr( $mod, 0, $i );
last if defined $con->{$action};
}
if ( defined $con->{$action} )
{
# print "dist = $dist. ";
if ( ($action eq 'hpunch' or $action eq 'lpunch') and ($dist>=0) and ($dist<800) )
{
$action = 'hpunchF' if defined $con->{'hpunchF'};
}
elsif ( ($action eq 'hkick' or $action eq 'lkick') and ($dist>=0) and ($dist<900) )
{
$action = 'lkickF' if defined $con->{'lkickF'};
}
$nextst = $con->{$action};
$in->ActionAccepted;
}
}
$self->{'NEXTST'} = $nextst;
}
sub CheckHit
{
my ($self) = @_;
return 0 unless $self->{CHECKHIT};
$self->{CHECKHIT} = 0;
my ($st, # A reference to the next state.
$nextst, # The name of the next state.
@hit, # The hit array
$i,
);
$st = $self->{STATES}->{$self->{ST}};
return 0 unless $st->{HIT};
return 0 unless defined $self->{FRAMES}->[$st->{F}]->{hit};
@hit = @{$self->{FRAMES}->[$st->{F}]->{hit}};
if ( $self->{DIR}<0 )
{
::MirrorPolygon( \@hit );
}
::OffsetPolygon( \@hit,
$self->{X} / $::GAMEBITS2,
$self->{Y} / $::GAMEBITS2 );
$i = $self->{OTHER}->IsHitAt( \@hit );
$self->{DELIVERED} = 1 if $i;
print "Collision = $i; ";
if ( $i == 0 )
{
# Make the 'Woosh' sound - maybe.
$nextst = $st->{NEXTST};
print "NEXTST = $nextst";
$nextst = $self->{STATES}->{$nextst};
print "NEXTST->HIT = ", $nextst->{HIT}, "\n";
push @::Sounds, ('woosh.wav') unless $nextst->{HIT} and defined $self->{FRAMES}->[$nextst->{F}]->{hit};
}
return $i;
}
sub IsHitAt
{
my ($self, $poly) = @_;
my ($frame, @a);
$frame = $self->{FRAMES}->[$self->{FR}];
::OffsetPolygon( $poly, -$self->{X} / $::GAMEBITS2, -$self->{Y} / $::GAMEBITS2 );
if ( $self->{DIR}<0 )
{
::MirrorPolygon( $poly );
}
# print "IsHitAt (", join(',',@{$poly}),")\n (",
# join(',',@{$frame->{head}}),")\n (",
# join(',',@{$frame->{body}}),")\n (",
# join(',',@{$frame->{legs}}),")\n";
return 1 if ::Collisions( $poly, $frame->{head} );
return 2 if ::Collisions( $poly, $frame->{body} );
return 3 if ::Collisions( $poly, $frame->{legs} );
return 0;
}
=comment
Event($self, $event, $eventpar): Handles the following events:
'Won', 'Hurt', 'Thread', 'Fun', 'Turn'
=cut
sub Event($$$)
{
my ($self, $event, $eventpar) = @_;
my ($st);
$st = $self->GetCurrentState();
if ( ($st->{SITU} eq 'Ready' or $st->{SITU} eq 'Stand') and $event eq 'Won' )
{
$self->{NEXTST} = 'Won' unless substr($self->{ST}, 0, 3) eq 'Won' ;
return;
}
if ( $st->{SITU} eq 'Ready' and $self->{NEXTST} eq '' )
{
if ( $event =~ /Hurt|Threat|Fun|Turn/ )
{
if ( $event eq 'Fun' and defined $self->{STATES}->{'Funb'} and rand() < 0.5 )
{
$event = 'Funb';
}
$self->{NEXTST} = $event;
}
}
}
=comment
Event($self, $event, $eventpar): Handles the following events:
'Highhit', 'Uppercut', 'Hit', 'Groinhit', 'Leghit', 'Fall'
=cut
sub HitEvent($$$)
{
my ($self, $event, $eventpar) = @_;
my ($st, $blocked, $damage);
$st = $self->GetCurrentState();
# Do events: Highhit, Uppercut, Hit, Groinhit, Leghit, Fall
$eventpar = '' unless defined $eventpar; # Supress useless warning
if ( $eventpar eq 'Maxcombo' ) { $damage = 0; }
else { $damage = ::GetDamage( $self->{OTHER}->{NAME}, $self->{OTHER}->{ST} ); }
$blocked = $st->{BLOCK};
$blocked = 0 if ( $self->IsBackTurned() );
print "Event '$event', '$eventpar'\n";
print "Blocked.\n" if ( $blocked );
# Hit point adjustment here.
$self->{HP} -= $blocked ? $damage >> 3 : $damage;
# Turn if we must.
$self->{DIR} = ( $self->{X} > $self->{OTHER}->{X} ) ? -1 : 1;
# Handle the unfortunate event of the player "dying".
if ( $self->{HP} <= 0 )
{
push @::Sounds, ('bowling.voc');
$self->{NEXTST} = 'Falling';
$self->{PUSHX} = -20 * 3 * $self->{DIR};
$self->{PUSHY} = -80;
$self->{Y} -= 10;
$self->{COMBO} += 1;
$self->{COMBOHP} += $damage;
$self->ComboEnds();
$::ko = 1;
return;
}
# Handle blocked attacks.
if ( $blocked )
{
push @::Sounds, ('thump.wav');
$self->HitPush( - $damage * 20 * $self->{DIR} );
# $self->{PUSHX} = - $damage * 5 * $self->{DIR};
return;
}
# Handle the rest of the events.
if ( $event eq 'Uppercut' )
{
push @::Sounds, ('evil_laughter.voc');
::AddEarthquake( 20 );
}
elsif ($event eq 'Groinhit') { push @::Sounds, ('woman_screams.voc'); }
{ push @::Sounds, ('thump3.voc'); }
$self->{COMBO} += 1;
$self->{COMBOHP} += $damage;
$damage *= $self->{COMBO}; # Only for the purpose of pushing
if ( $self->{COMBO} >= $::MAXCOMBO )
{
$self->ComboEnds();
$event = 'Uppercut';
$self->{OTHER}->HitEvent( 'Fall', 'Maxcombo' );
}
if ( $st->{SITU} eq 'Crouch' )
{
if ( $event eq 'Uppercut' or $event eq 'Fall' )
{
$self->{NEXTST} = 'Falling';
$self->{PUSHX} = -48 * 3 * $self->{DIR};
$self->{PUSHY} = -100;
$self->{Y} -= 10;
}
else
{
if ($eventpar == 1) {
$self->{NEXTST} = 'KneelingPunched';
} else {
$self->{NEXTST} = 'KneelingKicked';
}
$self->HitPush( - $damage * 20 * $self->{DIR} );
# $self->{PUSHX} = - $damage * 20 * $self->{DIR};
}
return;
}
if ( $st->{SITU} eq 'Falling' )
{
$self->{PUSHY} -= 50;
$self->{PUSHY} = -80 if $self->{PUSHY} > -80;
$self->{Y} -= 10;
return;
}
if ( $self->{Y} < $::GROUND2 )
{
$self->{NEXTST} = 'Falling';
$self->{PUSHY} -= 50;
$self->{PUSHX} = -48 * 3 * $self->{DIR};
return;
}
if ( $event eq 'Highhit' )
{
$self->{NEXTST} = 'HighPunched';
$self->HitPush( - $damage * 20 * $self->{DIR} );
# $self->{PUSHX} = - $damage * 20 * $self->{DIR};
}
elsif ( $event eq 'Hit' )
{
if ($eventpar == 1) {
$self->{NEXTST} = 'HighPunched';
} elsif ($eventpar == 2) {
$self->{NEXTST} = 'LowPunched';
} else {
$self->{NEXTST} = 'Swept';
}
$self->HitPush( - $damage * 20 * $self->{DIR} );
# $self->{PUSHX} = - $damage * 20 * $self->{DIR};
}
elsif ( $event eq 'Groinhit' )
{
$self->{NEXTST} = 'GroinKicked';
$self->HitPush( - $damage * 20 * $self->{DIR} );
# $self->{PUSHX} = - $damage * 20 * $self->{DIR};
}
elsif ( $event eq 'Leghit' )
{
$self->{NEXTST} = 'Swept';
$self->HitPush( - $damage * 20 * $self->{DIR} );
# $self->{PUSHX} = - $damage * 20 * $self->{DIR};
}
elsif ( $event eq 'Uppercut' or $event eq 'Fall' )
{
$self->{NEXTST} = 'Falling';
$self->{PUSHX} = -48 * 3 * $self->{DIR};
$self->{PUSHY} = -100;
$self->{Y} -= 10;
}
else
{
die "Unknown event: $event, $eventpar";
}
}
sub GetCurrentState
{
my ($self, $statename) = @_;
my ($stateref);
die unless defined $self;
$statename = $self->{ST} unless defined $statename;
$stateref = $self->{STATES}->{$statename};
return $stateref;
}
sub ComboEnds
{
my ($self) = @_;
my ($combo, $ismaxcombo);
$combo = $self->{COMBO};
$ismaxcombo = $combo >= $::MAXCOMBO;
return unless $combo;
if ( $self->{COMBO} > 1 )
{
my ( $head, $doodad, $x, $y, $combotext );
$combotext = $ismaxcombo ? "MAX COMBO!!!" : ($self->{COMBO} . "-hit combo!");
$head = $self->{FRAMES}->[$self->{FR}]->{head};
$x = $self->{X} + $head->[0] * $::GAMEBITS2 * $self->{DIR};
$y = $self->{Y} + $head->[1] * $::GAMEBITS2;
- $doodad = ::CreateTextDoodad( $x, $y - 30 * $::GAMEBITS2,
+ $doodad = Doodad::CreateTextDoodad( $x, $y - 30 * $::GAMEBITS2,
$self->{NUMBER},
$combotext );
$doodad->{LIFETIME} = $ismaxcombo ? 120 : 80;
- $doodad->{SY} = -3;
- $doodad->{SX} = -3;
+ $doodad->{SPEED} = [-3,-3];
- $doodad = ::CreateTextDoodad( $x, $y - 10 * $::GAMEBITS2,
+ $doodad = Doodad::CreateTextDoodad( $x, $y - 10 * $::GAMEBITS2,
$self->{NUMBER},
int($self->{COMBOHP}*$::HitPointScale/10) . "% damage" );
$doodad->{LIFETIME} = 80;
- $doodad->{SY} = -3;
- $doodad->{SX} = +3;
+ $doodad->{SPEED} = [+3,-3];
print $self->{COMBO}, "-hit combo for ", $self->{COMBOHP}, " damage.\n";
push @::Sounds, ( $ismaxcombo ? 'crashhh.voc' : 'ba_gooock.voc');
}
$self->{COMBO} = 0;
$self->{COMBOHP} = 0;
}
=comment
Update moves the fighter to his next state, if there is a NEXTST set.
NEXTST should be calculated before calling this method. No further
branching or CON checking is done.
If the next state has JUMP, the character is set aflying.
=cut
sub Update
{
my ($self) = @_;
my ($nextst, # The name of the next state
$st); # The descriptor of the next state.
# Is there a next state defined?
$nextst = $self->{'NEXTST'};
# If there isn't, no updating is necessary.
return unless $nextst;
# ADMINISTER THE MOVING TO THE NEXT STATE
$st = $self->GetCurrentState( $nextst );
$self->{'ST'} = $nextst;
$self->{'FR'} = $st->{'F'};
die "ERROR IN STATE $nextst" unless defined $st->{DEL};
$self->{'DEL'} = $st->{'DEL'} * $::DELMULTIPLIER;
# HANDLE THE JUMP and PUSH ATTRIBUTE
if ( defined ($st->{'JUMP'}) )
{
$self->{'PUSHY'} = -($st->{'JUMP'});
$self->{'Y'} += $self->{'PUSHY'};
}
if ( defined ($st->{'PUSHX'}) )
{
$self->{'PUSHX'} += $st->{'PUSHX'} * $self->{DIR};
}
# HANDLE THE HIT ATTRIBUTE
if ( defined ($st->{HIT}) )
{
$self->{CHECKHIT} = 1 unless $self->{DELIVERED};
}
else
{
$self->{DELIVERED} = 0;
}
# HANDLE THE SOUND ATTRIBUTE
if ( defined $st->{SOUND} )
{
push @::Sounds, ($st->{SOUND});
}
# HANDLE THE CODE ATTRIBUTE
if ( defined ($st->{CODE}) )
{
eval ($st->{CODE}); print $@ if $@;
}
# HANDLE DOODADS
if ( defined ($st->{DOODAD}) )
{
# Create a doodad (probably a shot)
- my ($frame, $hit, $doodad, $ddata);
+ my ($frame, $hit, $doodad, $doodadname);
$frame = $self->{FRAMES}->[$self->{FR}];
$hit = $frame->{hit};
if ( defined $hit )
{
- $ddata = $st->{DOODAD};
-
- $doodad = ::CreateDoodad(
+ $doodadname = $st->{DOODAD};
+
+ $doodad = Doodad::CreateDoodad(
$self->{X} + $hit->[0] * $::GAMEBITS2 * $self->{DIR},
$self->{Y} + $hit->[1] * $::GAMEBITS2,
- $ddata->{W},
- $ddata->{H},
- $ddata->{T},
+ $doodadname,
+ $self->{DIR},
$self->{NUMBER} );
- $doodad->{SX} = $ddata->{SX} * $self->{DIR};
- $doodad->{SY} = $ddata->{SY} * $self->{DIR};
- $doodad->{FRAMES} = $ddata->{FRAMES};
- $doodad->{SA} = $ddata->{SA};
}
}
}
=comment
Pushes the fighter back due to being hit. If the fighter is cornered,
the other fighter will be pushed back instead.
=cut
sub HitPush
{
my ($self, $pushforce) = @_;
if ( $self->IsCornered )
{
$self->{OTHER}->{PUSHX} -= $pushforce;
}
else
{
$self->{PUSHX} += $pushforce;
}
}
=comment
Returns the characters 'centerline' in physical coordinates.
=cut
sub GetCenterX
{
my ($self) = @_;
my ($body, $x);
$body = $self->{FRAMES}->[$self->{FR}]->{body};
$x = $body->[0] + $body->[2] + $body->[4] + $body->[6];
return $self->{X} / $::GAMEBITS2 + $x / 4 * $self->{DIR};
}
=comment
Is my back turned to my opponent? Returns true if it is.
=cut
sub IsBackTurned
{
my ($self) = @_;
return ( ($self->{X} - $self->{OTHER}->{X}) * ($self->{DIR}) > 0 );
}
=comment
Returns true if the character is at either end of the arena.
=cut
sub IsCornered
{
my ($self) = @_;
return (($self->{X} <= $::MOVEMARGIN2 + 16)
or ($self->{X} >= $::BGWIDTH2 - $::MOVEMARGIN2 - 16));
}
return 1;
diff --git a/data/script/FighterStats.pl b/data/script/FighterStats.pl
index b5d84af..7cab8b1 100644
--- a/data/script/FighterStats.pl
+++ b/data/script/FighterStats.pl
@@ -1,303 +1,360 @@
use strict;
=comment
FIGHTER STATS ARE:
-NAME string
-TEAM string
-STYLE string
-AGE string
-WEIGHT string
-HEIGHT string
-SHOE string
-STORY string
+ID int All fighters have an integer ID...
+NAME string Name of the fighter displayed to the user
+GENDER int 1=male 2=female
+VERSION int Version of the fighter's code
+DATAVERSION int Version of the data file
+DATAFILE string Filename of the .DAT file.
+STARTCODE sub Executed when Reset() is called on the fighter
+
+TEAM string
+STYLE string
+AGE string
+WEIGHT string
+HEIGHT string
+SHOE string
+STORY string
=cut
+
+=comment
+We store "official" characters in the @FighterStats array. Non-syndicated
+characters will have a unique ID and stored in a has.
+=cut
+
@::FighterStats = (
{}, # Dummy UNKNOWN fighter entry..
-{ 'NAME' =>'Watasiwa baka janajo',
+{ 'ID' => 1,
+ 'NAME' =>'Watasiwa baka janajo',
'TEAM' =>'Evil',
'STYLE' =>'Clown-fu',
'AGE' =>'15',
'WEIGHT'=>'50kg',
'HEIGHT'=>'168cm',
'SHOE' =>'51',
'STORY' =>
'After Wastasiwa baka janajo took possession of his time\'s most advanced
technogadget (read: by accident he was punched so hard that he flew fight into
a high-tech lab, and got tangled with the WrISt(tm)),
he used all his knowledge to travel to the past (read: he started mashing the buttons, and
this is how it ended).
Then he knew immediately that he had to destroy
Saturday! (Read: He has absolutely no idea where he is, or what he is doing...)',
'KEYS' =>
'Back HPunch - Spinning headbutt
Down Back LPunch - WrISt shot
Forward Back Forward LPunch - WrISt mash',
},
-{ 'NAME' =>'Dark Black Evil Mage',
+{ 'ID' => 2,
+ 'NAME' =>'Dark Black Evil Mage',
'TEAM' =>'Evil leader',
'STYLE' =>'Piro-fu',
'AGE' =>'30',
'WEIGHT'=>'70kg',
'HEIGHT'=>'180cm',
'SHOE' =>'42',
'STORY' =>
'Member of the Evil Killer Black Antipathic Dim (witted) Fire Mages Leage.
He was sent to destroy Saturday now and forever! Or maybe he has a secret
agenda that noone knows about..? Nah...',
'KEYS' =>
'Back HKick - Spinkick
Forward Forward HKick - Crane kick
Down Back LPunch - Fireball
(also works while crouching)
Back Up HPunch - Burning Hands',
},
-{ 'NAME' =>'Boxer',
+{ 'ID' => 3,
+ 'NAME' =>'Boxer',
'TEAM' =>'Evil',
'STYLE' =>'Kickbox-fu',
'AGE' =>'16',
'WEIGHT'=>'80kg',
'HEIGHT'=>'180cm',
'SHOE' =>'43',
'STORY' =>
'Boxer joined the Mortal Szombat team for the sole purpose to punch as
many people as hard as he possibly can. He has no other purpose
whatsoever, but at least this keeps him entertained for the time being.',
'KEYS' =>
'Back HPunch - Spinning punch
Down Back LPunch - Weight toss
Forward Forward HPunch - Leaping punch',
},
-{ 'NAME' =>'Cumi',
+{ 'ID' => 4,
+ 'NAME' =>'Cumi',
'TEAM' =>'Good Leader',
'STYLE' =>'N/A',
'AGE' =>'15',
'WEIGHT'=>'55kg',
'HEIGHT'=>'170cm',
'SHOE' =>'41.5',
'STORY' =>
'His life ambition was to drive a car. Now that this was accomplished,
he has turned to his second greatest ambition: to be a great martial
artist superhero. As a start, he has watched the TV series "Kung fu"
from beginning to end, in one session. His current training consists
of but this.',
'KEYS' =>
'Down Back LPunch - Finger Shot
Forward Forward HPunch - Spit
Back Down Forward - Baseball',
},
-{ 'NAME' =>'Sirpi',
+{ 'ID' => 5,
+ 'NAME' =>'Sirpi',
'TEAM' =>'Good',
'STYLE' =>'Don\'tHurtMe-FU',
'AGE' =>'24',
'WEIGHT'=>'76kg',
'HEIGHT'=>'170cm',
'SHOE' =>'41',
'STORY' =>
'After being a "hardcore" gamer for several years and consuming a
great amount of food, his electricity was turned off. This has caused
him to make a very stupid face which lasts till this day, and will
last until he has defeated his archenemy. This is why he resolved to
join the good team... also he is frightened alone.',
'KEYS' =>
'Down Forward LPunch - Surprise
Forward Forward HPunch - Applause',
},
-{ 'NAME' =>'Macy',
+{ 'ID' => 6,
+ 'NAME' =>'Macy',
'TEAM' =>'Good',
'STYLE' =>'Macy-fu',
'AGE' =>'17',
'WEIGHT'=>'41kg',
'HEIGHT'=>'175cm',
'SHOE' =>'37',
'STORY' =>
'A few years ago (perhaps a little earlier, or maybe later) she was
found among the clouds in a cradle (falling, of course). She learned
martial art from brave Son Goku, so she landed on her feet and didn\'t
die. She\'s been immortal ever since. Who knows for how long? Maybe
it won\'t be until the next fight agains Evil...',
'KEYS' =>
'Down Back LPunch - Toss
Forward Forward HKick - Scissor Kick',
},
-{ 'NAME' =>'Jan Ito',
+{ 'ID' => 7,
+ 'NAME' =>'Jan Ito',
'TEAM' =>'Evil',
'STYLE' =>'Kururin-do',
'AGE' =>'20',
'WEIGHT'=>'85kg',
'HEIGHT'=>'172cm',
'SHOE' =>'39',
'STORY' =>
'The "Japanese giant" is a sworn enemy of Descant... after he left
muddy boot marks all over the freshly mopped porch of the pub, er,
dojo which has belonged to his ancestors for 16 generations. Since
he has turned to the dark side of the janitor. His knowledge of
the "way of the concierge" matches his deep hatred towards army
boots.',
'KEYS' =>
'Down Back LPunch - Soap Throw
Back Fw Back Fw LPunch - Stick Spin
Back Forward HPunc - Pierce',
},
-{ 'NAME' =>'Grizzly',
+{ 'ID' => 8,
+ 'NAME' =>'Grizzly',
'TEAM' =>'Good',
'STYLE' =>'Bear dance',
'AGE' =>'21',
'WEIGHT'=>'Several tons',
'HEIGHT'=>'170cm',
'SHOE' =>'49',
'STORY' =>
'Grizzly has been long famous for his laziness. He has made laziness a
form of art. In the past 5 years he has been to lazy to watch TV. Every
Saturday he trains in his own special fighting style, one not unlike
that of Bud Spencer, whom he holds as his honorary master. Though,
since he found out that Bud WORKS on Saturdays, he has revoked his
title, and keeps it for himself. He has joined the Good team to fight
to protect the Saturday.',
'KEYS' =>
'Down Back LPunch - Bear Shot
Forward Forward HPunch - Poke
Down Down LKick - Earthquake
Back Forward Back HPunch - Nunchaku',
},
-{ 'NAME' =>'Descant',
+{ 'ID' => 9,
+ 'NAME' =>'Descant',
'TEAM' =>'Good',
'STYLE' =>'Murderization',
'AGE' =>'58',
'WEIGHT'=>'89kg',
'HEIGHT'=>'180cm',
'SHOE' =>'44',
'STORY' =>
'He was trained in \'Nam in every known weapon and martial art form.
He fought there on the side of the Americans and the Russians...
whoever paid more at the moment. Then he used the money to hybernate
himself until the next great war.. or until the Saturday is in
trouble. He joined the side with the more CASH...',
'KEYS' =>
'Down Back LPunch - Aimed Shot
Back Back LPunch - Hip Shot
Forward Down HPunch - Knife Throw
Forward Forward HPunch - Gun Hit',
},
-{ 'NAME' =>'Rising-san',
+{ 'ID' => 10,
+ 'NAME' =>'Rising-san',
'TEAM' =>'Evil',
'STYLE' =>'Flick-fu',
'AGE' =>'500',
'WEIGHT'=>'N/A',
'HEIGHT'=>'50',
'SHOE' =>'N/A',
'STORY' =>
'Mistically disappeared Aeons ago.. on a Saturday! Now he is back, and
brought back his destructive techique, unmatched on Earth. Noone knows
why he joined the Dark Evil Mage...',
},
-{ 'NAME' =>'Mad Sawman',
+{ 'ID' => 11,
+ 'NAME' =>'Mad Sawman',
'TEAM' =>'Evil',
'STYLE' =>'Sawing',
'AGE' =>'35',
'WEIGHT'=>'110',
'HEIGHT'=>'120',
'SHOE' =>'49',
'STORY' =>
'His cradle was found on a tree. Later he chopped up the family that
took him and fed them to the bears. He has been roaming the Canadian
forests, chopping trees and heads alike. On hot summer nights his
maniac laughter echoes far.',
},
-{ 'NAME' =>'Imperfect Soldier',
+{ 'ID' => 12,
+ 'NAME' =>'Imperfect Soldier',
'TEAM' =>'Good',
'STYLE' =>'Pub Fight',
'AGE' =>'50',
'WEIGHT'=>'100',
'HEIGHT'=>'180',
'SHOE' =>'44',
'STORY' =>
'His childhood was determined by Drezda\'s bombing. This trauma has
caused him to join the army. For the last 30 years he is corporal
without the slightest hope for advancement. He annoys his
subordinates with a constant flow of stories of pub fights, until
they ask for relocation.',
},
-{ 'NAME' =>'Aisha',
+{ 'ID' => 13,
+ 'NAME' =>'Aisha',
'TEAM' =>'Good',
'STYLE' =>'Death Dance',
'AGE' =>'21',
'WEIGHT'=>'43.5',
'HEIGHT'=>'155',
'SHOE' =>'35',
'STORY' =>
'Her trials started right in the womb.. her life hung on a single
umbilical cord! But she was finally born, and got the name
Aisha ("survives everything"). Since her childhood she survived
natural disasters and terrorist attacks, and got frankly fed up.
So one time she said:
"If I survive this, I swear, I\'ll join those stupid Mortal guys!"',
'STORYHU'=>
'A megprobaltatasok akkor kezdodtek, amikor anyukaja a szive alatt hordta.
Egyetlen koldokzsinoron fuggott az elete! De megszuletett vegul, ezert
kapta az Aisha ("mindent tulelo") nevet. Aztan gyermekkoratol fogva sok
termeszeti katasztrofat, terrortamadast atveszelt, es mar kezdett elege
le\
nni az egeszbol, igy hat az egyik alkalommal kijelentette, hogy ha ezt
tulelem, csatlakozom azokhoz a hulye Mortalosokhoz!',
},
-{ 'NAME' =>'Misi (?)',
+{ 'ID' => 14,
+ 'NAME' =>'Misi (?)',
'TEAM' =>'Evil',
'STYLE' =>'',
'AGE' =>'',
'WEIGHT'=>'',
'HEIGHT'=>'',
'SHOE' =>'',
'STORY' =>'...',
},
);
+
+sub RegisterFighter($)
+{
+ my ($reginfo) = @_;
+
+ # reginfo must contain: ID, GENDER, DATAVERSION, DATASIZE, STARTCODE, FRAMES, STATES, DATAFILE
+ foreach my $attr (qw(ID GENDER DATAVERSION DATASIZE STARTCODE FRAMES STATES DATAFILE))
+ {
+ die "RegisterFighter: Attribute $attr not found" unless defined $reginfo->{$attr};
+ }
+
+ my ($fighterenum, $fighterstats);
+ $fighterenum = $reginfo->{ID};
+ $fighterstats = GetFighterStats($fighterenum);
+ die "RegisterFighter: Unable to locate fighter $fighterenum\n" unless defined $fighterstats;
+
+ # Add the reginfo to the fighter stats:
+ %{$fighterstats} = ( %{$fighterstats}, %{$reginfo} );
+
+# $::FighterStat
+}
+
+
+
sub GetFighterStats($)
{
- my ($fighter) = @_;
- $::Name = $::FighterStats[$fighter]->{NAME};
- $::Team = $::FighterStats[$fighter]->{TEAM};
- $::Style = $::FighterStats[$fighter]->{STYLE};
- $::Age = $::FighterStats[$fighter]->{AGE};
- $::Weight = $::FighterStats[$fighter]->{WEIGHT};
- $::Height = $::FighterStats[$fighter]->{HEIGHT};
- $::Shoe = $::FighterStats[$fighter]->{SHOE};
- $::Story = $::FighterStats[$fighter]->{STORY};
- $::Keys = $::FighterStats[$fighter]->{KEYS};
+ my ($fighterenum) = @_;
+
+ my ($source) = $::FighterStats[$fighterenum];
+
+ $::Name = $source->{NAME};
+ $::Team = $source->{TEAM};
+ $::Style = $source->{STYLE};
+ $::Age = $source->{AGE};
+ $::Weight = $source->{WEIGHT};
+ $::Height = $source->{HEIGHT};
+ $::Shoe = $source->{SHOE};
+ $::Story = $source->{STORY};
+ $::Keys = $source->{KEYS};
+ $::Datafile = $source->{DATAFILE};
$::Story =~ s/([^\n])\n([^\n])/$1 $2/gms;
-
- @::StatTags = ( "Name: ", "Team: ", "Style: ", 'Age: ', 'Weight: ', 'Height: ', 'Shoe size: ' );
+
+ @::StatTags = ( 'Name: ', 'Team: ', 'Style: ', 'Age: ', 'Weight: ', 'Height: ', 'Shoe size: ' );
#@::StatTags = ( "Név: ", "Csapat: ", "Stílus: ", "Kor: ", "Súly: ", "Magasság: ", "Cipõméret: " );
+
+ return $source;
}
#GetFighterStats(1);
#print "$::Name $::Team $::Style $::Age $::Weight $::Height $::Shoe\n$::Story\n";
return 1;
diff --git a/data/script/Grizli.pl b/data/script/Grizli.pl
index 257490c..d826747 100644
--- a/data/script/Grizli.pl
+++ b/data/script/Grizli.pl
@@ -1,196 +1,208 @@
# package Grizli;
# Grizli's images are scaled by a factor of 0.763
require 'DataHelper.pl';
use strict;
sub LoadGrizli
{
my ( @Frames, %FrameLookup, %Frames, %States, %Shorthands,
$Doodad, $Con, $Con2,
@States1,
$framedesc, $key, $value, $framename, $nextst, $st, $lastchar, $nextchar );
@Frames = LoadFrames( "GRIZLIDATA.DAT.pl", 250, 100 );
%FrameLookup = CreateFrameLookup( scalar @Frames -1,
"start", 14, "stand", 6, "walk", 15,
"turn", 9, "falling", 15, "laying", 1,
"getup", 16, "hurt", 9, "kneeling", 4,
"onknees", 5, "kneelingpunch",5, "kneelingkick", 5,
"fun", 9,
"highpunch", 9, "lowpunch", 6, "highkick", 6,
"lowkick", 6, "sweep", 15, "groinkick", 7,
"kneekick", 8, "elbow", 12, "spin", 17,
"grenade", 10, "uppercut", 17, "throw", 19,
"highpunched", 11, "lowpunched", 6, "groinkicked", 8,
"kneelingpunched",5, "kneelingkicked", 4, "thrown", 14,
"specpunch", 6, "nunchaku", 15,
"swept", 16, "won", 20, "threat", 12,
"block", 6, "stomp", 11,
);
$Doodad =
{ 'T' => 1,
'W' => 64,
'H' => 64,
'SX' => 15,
'SY' => 0,
'FRAMES'=> 6,
'SA' => 1/25,
};
$Con = {
'forw'=>'Walk',
'back'=>'Back',
'jump'=>'Jump',
'jumpfw'=>'JumpFW',
'jumpbw'=>'JumpBW',
'block'=>'Block',
'down'=>'Kneeling',
'hpunch'=>'HighPunch',
'lpunch'=>'LowPunch',
'hkick'=>'HighKick',
'lkick'=>'LowKick',
'lkickBF'=>'GroinKick',
'lkickF'=>'KneeKick',
'hpunchD'=>'Uppercut',
'hpunchF'=>'Elbow',
'hkickB'=>'Spin',
'lkickB'=>'Sweep',
'lpunchBD'=>'Grenade',
'hpunchFF'=>'Poke',
'lkickDD'=>'Stomp',
'hpunchBFB'=>'Nunchaku',
};
$Con2 = {
'lkick'=>'KneelingKick',
'hkick'=>'KneelingKick',
'hpunch'=>'KneelingUppercut',
'lpunch'=>'KneelingPunch',
};
@States1 = (
# 1. BASIC MOVES
{ 'N'=>'Start', 'DEL'=>5, 'S'=>'+start' },
{ 'N'=>'Stand', 'DEL'=>10, 'S'=>'+stand', 'CON'=>$Con, 'SITU'=>'Ready' },
{ 'N'=>'Turn', 'DEL'=>5, 'S'=>'+turn', 'DELTAXN'=>-10, 'TURNN'=>1, },
{ 'N'=>'Hurt', 'DEL'=>8, 'S'=>'+hurt,-hurt' },
{ 'N'=>'Won', 'DEL'=>8, 'S'=>'+won', 'NEXTSTN'=> 'Won2' },
{ 'N'=>'Won2', 'DEL'=>1000,'S'=>'won n', 'NEXTST'=>'Won2', },
{ 'N'=>'Fun', 'DEL'=>8, 'S'=>'+fun,-fun', 'CON'=>$Con },
{ 'N'=>'Threat', 'DEL'=>5, 'S'=>'+threat', 'CON'=>$Con },
WalkingFrames( \%FrameLookup, \@Frames, 0, 75, $Con ),
BlockStates( FindLastFrame( \%FrameLookup, 'block' ), 5 ),
KneelingStates( FindLastFrame( \%FrameLookup, 'kneeling' ),
FindLastFrame( \%FrameLookup, 'onknees' ), 7, $Con2 ),
JumpStates( \%FrameLookup,
{'lkick'=>'JumpKick', 'hkick'=>'JumpKick',
'lpunch'=>'JumpPunch', 'hpunch'=>'JumpPunch'} ),
# 2. OFFENSIVE MOVES
{ 'N'=>'KneelingPunch', 'DEL'=>5, 'S'=>'+kneelingpunch,-kneelingpunch', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKick', 'DEL'=>5, 'S'=>'+kneelingkick,-kneelingkick', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingUppercut','DEL'=>5, 'S'=>'kneeling 4-3,uppercut 6-n',
'HIT'=>'Uppercut' },
{ 'N'=>'HighPunch', 'DEL'=>5, 'S'=>'+highpunch',
'HIT'=>'Highhit' },
{ 'N'=>'LowPunch', 'DEL'=>5, 'S'=>'+lowpunch,-lowpunch',
'HIT'=>'Hit' },
{ 'N'=>'HighKick', 'DEL'=>5, 'S'=>'+highkick,-highkick',
'HIT'=>'Hit' },
{ 'N'=>'LowKick', 'DEL'=>5, 'S'=>'+lowkick,-lowkick',
'HIT'=>'Leghit' },
{ 'N'=>'GroinKick', 'DEL'=>5, 'S'=>'+groinkick,-groinkick',
'HIT'=>'Groinhit' },
{ 'N'=>'KneeKick', 'DEL'=>5, 'S'=>'+kneekick,-kneekick',
'HIT'=>'Hit' },
{ 'N'=>'Elbow', 'DEL'=>5, 'S'=>'+elbow',
'HIT'=>'Highhit' },
{ 'N'=>'Spin', 'DEL'=>5, 'S'=>'+spin',
'HIT'=>'Hit' },
{ 'N'=>'Sweep', 'DEL'=>7, 'S'=>'+sweep',
'HIT'=>'Hit' },
{ 'N'=>'Grenade', 'DEL'=>5, 'S'=>'+grenade',
'DEL12'=>15, 'DOODAD'=>$Doodad },
{ 'N'=>'Uppercut', 'DEL'=>5, 'S'=>'+uppercut',
'HIT'=>'Uppercut' },
{ 'N'=>'Throw', 'DEL'=>8, 'S'=>'+throw' },
{ 'N'=>'Poke', 'DEL'=>5, 'S'=>'+specpunch,_specpunch',
'HIT'=>'Highhit' },
{ 'N'=>'Stomp', 'DEL'=>7, 'S'=>'+stomp',
'HIT'=>'Fall', 'CODE6'=>'::AddEarthquake(25);', 'SOUND6'=>'crashhh.voc' },
{ 'N'=>'Nunchaku', 'DEL'=>7, 'S'=>'+nunchaku',
'HIT'=>'Hit' },
# 3. HURT MOVES
{ 'N'=>'Falling', 'DEL'=>5, 'S'=>'falling 1-11, falling 15-12, falling 12-n, laying 1',
'DEL16'=>7, 'DEL17'=>7, 'DEL18'=>7, 'DEL19'=>7, 'DEL20'=>7, 'DEL21'=>7,
'DELN'=>500, 'NEXTN'=>'Laying', 'SITU'=>'Falling', },
{ 'N'=>'Laying', 'DEL'=>1000,'S'=>'+laying',
'SITU'=>'Falling' },
{ 'N'=>'Getup', 'DEL'=>5, 'S'=>'+getup',
'SITU'=>'Falling',
'CON8'=>{'down'=>'Onknees'},
'CON8'=>{'down'=>'Onknees'},
},
{ 'N'=>'Dead', 'DEL'=>10000, 'S'=>'laying 1',
'SITU'=>'Falling', 'NEXTST'=>'Dead' },
{ 'N'=>'Swept', 'DEL'=>5, 'S'=>'+swept' },
{ 'N'=>'KneelingPunched', 'DEL'=>5, 'S'=>'+kneelingpunched,-kneelingpunched',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKicked', 'DEL'=>5, 'S'=>'kneelingkicked 3-n, kneelingkicked n-3',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'HighPunched', 'DEL'=>8, 'S'=>'+highpunched' },
{ 'N'=>'LowPunched', 'DEL'=>5, 'S'=>'+lowpunched,-lowpunched' },
{ 'N'=>'GroinKicked', 'DEL'=>7, 'S'=>'+groinkicked,-groinkicked' },
{ 'N'=>'Thrown', 'DEL'=>5, 'S'=>'+thrown' },
);
# 2. CREATE STATES
foreach $framedesc (@States1)
{
AddStates( \%States, \%FrameLookup, $framedesc );
}
# Automatically add NEXTST for states which don't have one.
FixStates( \%FrameLookup, \%States );
TravelingStates( \%FrameLookup, \@Frames, \%States, "falling", 1, 18 );
TravelingStates( \%FrameLookup, \@Frames, \%States, "getup", 1, 16 );
#TravelingStates( \%FrameLookup, \@Frames, \%States, "won", 0, 0 );
%States = ( FindShorthands( \%States ), %States );
-%::GrizliStates = %States;
-@::GrizliFrames = @Frames;
+# %::GrizliStates = %States;
+# @::GrizliFrames = @Frames;
+
+::RegisterFighter( {
+ 'ID' => 8,
+ 'GENDER' => 1,
+ 'DATAVERSION' => 1,
+ 'STARTCODE' => sub {},
+ 'FRAMES' => \@Frames,
+ 'STATES' => \%States,
+ 'DATAFILE' => 'GRIZLIDATA.DAT',
+ 'DATASIZE' => 7138871,
+} );
+
}
LoadGrizli();
return 1;
diff --git a/data/script/Maci.pl b/data/script/Maci.pl
index 829c582..c66d6a7 100644
--- a/data/script/Maci.pl
+++ b/data/script/Maci.pl
@@ -1,190 +1,202 @@
# package Maci;
# UPi's images are scaled by a factor of 0.8
require 'DataHelper.pl';
use strict;
sub LoadMaci
{
my ( @Frames, %FrameLookup, %Frames, %States, %Shorthands,
$Doodad, $Con, $Con2,
@States1,
$framedesc, $key, $value, $framename, $nextst, $st, $lastchar, $nextchar );
@Frames = LoadFrames( "MACIDATA.DAT.pl", 316, 90 );
%FrameLookup = CreateFrameLookup( scalar @Frames -1,
"start", 23, "stand", 5, "walk", 14,
"turn", 9, "falling", 12, "laying", 1,
"getup", 18, "hurt", 13, "swept", 8,
"won", 17, "block", 5, "kneeling", 4,
"onknees", 4, "kneelingpunch",5, "kneelingkick", 6,
"fun", 9, "threat", 8,
"highpunch", 5, "lowpunch", 6, "highkick", 7,
"lowkick", 6, "sweep", 8, "groinkick", 10,
"kneekick", 7, "elbow", 6, "spin", 11,
"grenade", 10, "uppercut", 8, "throw", 15,
"highpunched", 8, "lowpunched", 6, "groinkicked", 14,
"kneelingpunched",8, "kneelingkicked", 6, "thrown", 12,
"scissorkick", 15
);
$Doodad =
{ 'T' => 1,
'W' => 64,
'H' => 64,
'SX' => 15,
'SY' => 0,
'FRAMES'=> 6,
'SA' => 1/25,
};
$Con = {
'forw'=>'Walk',
'back'=>'Back',
'jump'=>'Jump',
'jumpfw'=>'JumpFW',
'jumpbw'=>'JumpBW',
'block'=>'Block',
'down'=>'Kneeling',
'hpunch'=>'HighPunch',
'lpunch'=>'LowPunch',
'hkick'=>'HighKick',
'lkick'=>'LowKick',
'lkickBF'=>'GroinKick',
'lkickF'=>'KneeKick',
'hpunchD'=>'Uppercut',
'hpunchF'=>'Elbow',
'hkickB'=>'Spin',
'lkickB'=>'Sweep',
'hkickFF'=>'ScissorKick',
'lpunchBD'=>'Grenade',
};
$Con2 = {
'lkick'=>'KneelingKick',
'hkick'=>'KneelingKick',
'hpunch'=>'KneelingUppercut',
'lpunch'=>'KneelingPunch',
};
@States1 = (
# 1. BASIC MOVES
{ 'N'=>'Start', 'DEL'=>5, 'S'=>'+start' },
{ 'N'=>'Stand', 'DEL'=>7, 'S'=>'+stand,_stand', 'CON'=>$Con, 'SITU'=>'Ready' },
{ 'N'=>'Turn', 'DEL'=>5, 'S'=>'+turn', 'TURNN'=>1, },
{ 'N'=>'Hurt', 'DEL'=>8, 'S'=>'+hurt, hurt 2-1' },
{ 'N'=>'Won', 'DEL'=>8, 'S'=>'+won', 'NEXTSTN'=> 'Won2' },
{ 'N'=>'Won2', 'DEL'=>1000,'S'=>'won n', 'NEXTST'=>'Won2', },
{ 'N'=>'Fun', 'DEL'=>7, 'S'=>'+fun,-fun', 'CON'=>$Con },
{ 'N'=>'Threat', 'DEL'=>7, 'S'=>'threat 2-n, threat n-2', 'CON'=>$Con },
WalkingFrames( \%FrameLookup, \@Frames, 1, 106, $Con ),
BlockStates( FindLastFrame( \%FrameLookup, 'block' ), 5 ),
KneelingStates( FindLastFrame( \%FrameLookup, 'kneeling' ),
FindLastFrame( \%FrameLookup, 'onknees' ), 7, $Con2 ),
JumpStates( \%FrameLookup,
{'lkick'=>'JumpKick', 'hkick'=>'JumpKick',
'lpunch'=>'JumpPunch', 'hpunch'=>'JumpPunch'} ),
# 2. OFFENSIVE MOVES
{ 'N'=>'KneelingPunch', 'DEL'=>5, 'S'=>'+kneelingpunch,-kneelingpunch', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKick', 'DEL'=>5, 'S'=>'+kneelingkick,-kneelingkick', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingUppercut','DEL'=>5, 'S'=>'kneeling 4-3,uppercut 6-n,-uppercut',
'HIT'=>'Uppercut' },
{ 'N'=>'HighPunch', 'DEL'=>5, 'S'=>'+highpunch,-highpunch',
'HIT'=>'Highhit' },
{ 'N'=>'LowPunch', 'DEL'=>5, 'S'=>'+lowpunch,-lowpunch',
'HIT'=>'Hit' },
{ 'N'=>'HighKick', 'DEL'=>5, 'S'=>'+highkick,-highkick',
'HIT'=>'Hit' },
{ 'N'=>'LowKick', 'DEL'=>5, 'S'=>'+lowkick,-lowkick',
'HIT'=>'Leghit' },
{ 'N'=>'GroinKick', 'DEL'=>5, 'S'=>'groinkick 1-7,groinkick 7-1, groinkick 8-10, groinkick 10-8',
'HIT'=>'Groinhit', 'DEL15'=>8, 'DEL16'=>8, 'DEL17'=>8, 'DEL18'=>8, 'DEL19'=>8, 'DEL20'=>8, },
{ 'N'=>'KneeKick', 'DEL'=>5, 'S'=>'+kneekick,-kneekick',
'HIT'=>'Hit' },
{ 'N'=>'Elbow', 'DEL'=>5, 'S'=>'+elbow,-elbow',
'HIT'=>'Highhit' },
{ 'N'=>'Spin', 'DEL'=>7, 'S'=>'+spin',
'HIT'=>'Hit' },
{ 'N'=>'Sweep', 'DEL'=>7, 'S'=>'+sweep,-sweep',
'HIT'=>'Hit' },
{ 'N'=>'Grenade', 'DEL'=>5, 'S'=>'+grenade, grenade 1',
'DEL7'=>15, 'DOODAD'=>$Doodad },
{ 'N'=>'Uppercut', 'DEL'=>5, 'S'=>'+uppercut,-uppercut',
'HIT'=>'Uppercut' },
{ 'N'=>'Throw', 'DEL'=>8, 'S'=>'+throw' },
{ 'N'=>'ScissorKick', 'DEL'=>5, 'S'=>'+scissorkick',
'HIT'=>'Uppercut',
'MOVE5'=>3, 'MOVE6'=>4, 'MOVE7'=>4, 'MOVE8'=>4, 'MOVE9'=>4, 'MOVE10'=>4, 'MOVE11'=>3},
# 3. HURT MOVES
{ 'N'=>'Falling', 'DEL'=>5, 'S'=>'+falling, laying 1',
'DELN'=>500, 'NEXTN'=>'Laying', 'SITU'=>'Falling', },
{ 'N'=>'Laying', 'DEL'=>1000,'S'=>'+laying',
'SITU'=>'Falling' },
{ 'N'=>'Getup', 'DEL'=>5, 'S'=>'+getup',
'SITU'=>'Falling',
'CON9'=>{'down'=>'Onknees'},
'CON10'=>{'down'=>'Onknees'},
},
{ 'N'=>'Dead', 'DEL'=>10000, 'S'=>'laying 1',
'SITU'=>'Falling', 'NEXTST'=>'Dead' },
{ 'N'=>'Swept', 'DEL'=>5, 'S'=>'+swept,-swept' },
{ 'N'=>'KneelingPunched', 'DEL'=>5, 'S'=>'+kneelingpunched',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKicked', 'DEL'=>5, 'S'=>'+kneelingkicked, -kneelingkicked',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'HighPunched', 'DEL'=>8, 'S'=>'+highpunched' },
{ 'N'=>'LowPunched', 'DEL'=>5, 'S'=>'+lowpunched,-lowpunched' },
{ 'N'=>'GroinKicked', 'DEL'=>7, 'S'=>'+groinkicked' },
{ 'N'=>'Thrown', 'DEL'=>5, 'S'=>'+thrown' },
);
# 2. CREATE STATES
foreach $framedesc (@States1)
{
AddStates( \%States, \%FrameLookup, $framedesc );
}
# Automatically add NEXTST for states which don't have one.
FixStates( \%FrameLookup, \%States );
TravelingStates( \%FrameLookup, \@Frames, \%States, "falling", 1, 13 );
TravelingStates( \%FrameLookup, \@Frames, \%States, "getup", 0, 0 );
TravelingStates( \%FrameLookup, \@Frames, \%States, "spin", 0, 0 );
%States = ( FindShorthands( \%States ), %States );
-%::MaciStates = %States;
-@::MaciFrames = @Frames;
+# %::MaciStates = %States;
+# @::MaciFrames = @Frames;
+
+::RegisterFighter( {
+ 'ID' => 6,
+ 'GENDER' => 2,
+ 'DATAVERSION' => 1,
+ 'STARTCODE' => sub {},
+ 'FRAMES' => \@Frames,
+ 'STATES' => \%States,
+ 'DATAFILE' => 'MACIDATA.DAT',
+ 'DATASIZE' => 5151824,
+} );
+
}
LoadMaci();
return 1;
diff --git a/data/script/Sirpi.pl b/data/script/Sirpi.pl
index 035de5a..c56c84d 100644
--- a/data/script/Sirpi.pl
+++ b/data/script/Sirpi.pl
@@ -1,194 +1,206 @@
# package Sirpi;
# Sirpi's images are scaled by a factor of 0.76
require 'DataHelper.pl';
use strict;
sub LoadSirpi
{
my ( @Frames, %FrameLookup, %Frames, %States, %Shorthands,
$Doodad, $Con, $Con2,
@States1,
$framedesc, $key, $value, $framename, $nextst, $st, $lastchar, $nextchar );
@Frames = LoadFrames( "SIRPIDATA.DAT.pl", 250, 110 );
%FrameLookup = CreateFrameLookup( scalar @Frames -1,
"start", 20, "stand", 7, "walk", 13,
"turn", 9, "falling", 14, "laying", 1,
"getup", 16, "hurt", 13, "swept", 13,
"won", 10, "block", 5,
"fun", 8, "threat", 9,
"kneeling", 4, "onknees", 4,
"highpunch", 5, "lowpunch", 6, "highkick", 7,
"lowkick", 6, "groinkick", 7, "sweep", 9,
"kneekick", 7, "elbow", 6, "spin", 14,
"kneelingpunch",5, "kneelingkick", 6,
"grenade", 9, "uppercut", 8, "throw", 22,
"highpunched", 5, "lowpunched", 5, "groinkicked", 9,
"kneelingpunched",4, "kneelingkicked", 6, "thrown", 14,
"specpunch", 13, "funb", 12,
);
$Doodad =
{ 'T' => 1,
'W' => 64,
'H' => 64,
'SX' => 15,
'SY' => 0,
'FRAMES'=> 6,
'SA' => 1/25,
};
$Con = {
'forw'=>'Walk',
'back'=>'Back',
'jump'=>'Jump',
'jumpfw'=>'JumpFW',
'jumpbw'=>'JumpBW',
'block'=>'Block',
'down'=>'Kneeling',
'hpunch'=>'HighPunch',
'lpunch'=>'LowPunch',
'hkick'=>'HighKick',
'lkick'=>'LowKick',
'lkickBF'=>'GroinKick',
'lkickF'=>'KneeKick',
'hpunchD'=>'Uppercut',
'hpunchF'=>'Elbow',
'hkickB'=>'Spin',
'lkickB'=>'Sweep',
'lpunchFD'=>'Grenade',
'hpunchFF'=>'SpecPunch',
};
$Con2 = {
'lkick'=>'KneelingKick',
'hkick'=>'KneelingKick',
'hpunch'=>'KneelingUppercut',
'lpunch'=>'KneelingPunch',
};
@States1 = (
# 1. BASIC MOVES
{ 'N'=>'Start', 'DEL'=>7, 'S'=>'+start' },
{ 'N'=>'Stand', 'DEL'=>7, 'S'=>'+stand', 'CON'=>$Con, 'SITU'=>'Ready' },
{ 'N'=>'Turn', 'DEL'=>5, 'S'=>'+turn', 'TURNN'=>1, },
{ 'N'=>'Hurt', 'DEL'=>8, 'S'=>'+hurt,_hurt' },
{ 'N'=>'Won', 'DEL'=>8, 'S'=>'+won, won n-6, won 7-n, won n-6, won 7-n', 'NEXTSTN'=> 'Won2' },
{ 'N'=>'Won2', 'DEL'=>1000,'S'=>'won n', 'NEXTST'=>'Won2', },
{ 'N'=>'Fun', 'DEL'=>8, 'S'=>'fun 1-6, fun 6-4, fun 7-8, fun 8-7, fun 4-6, fun 6-1', 'CON'=>$Con },
{ 'N'=>'Funb', 'DEL'=>8, 'S'=>'+funb, -funb', 'CON'=>$Con },
{ 'N'=>'Threat', 'DEL'=>8, 'S'=>'+threat, threat 3-1', 'CON'=>$Con },
WalkingFrames( \%FrameLookup, \@Frames, 2, 80, $Con ),
BlockStates( FindLastFrame( \%FrameLookup, 'block' ), 5 ),
KneelingStates( FindLastFrame( \%FrameLookup, 'kneeling' ),
FindLastFrame( \%FrameLookup, 'onknees' ), 7, $Con2 ),
JumpStates( \%FrameLookup,
{'lkick'=>'JumpKick', 'hkick'=>'JumpKick',
'lpunch'=>'JumpPunch', 'hpunch'=>'JumpPunch',
'hpunchFF'=>'JumpFire'} ),
# 2. OFFENSIVE MOVES
{ 'N'=>'KneelingPunch', 'DEL'=>5, 'S'=>'+kneelingpunch,-kneelingpunch', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKick', 'DEL'=>5, 'S'=>'+kneelingkick,-kneelingkick', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingUppercut','DEL'=>5, 'S'=>'kneeling 4-3,uppercut 5-n,-uppercut',
'HIT'=>'Uppercut' },
{ 'N'=>'HighPunch', 'DEL'=>5, 'S'=>'+highpunch,-highpunch',
'HIT'=>'Highhit' },
{ 'N'=>'LowPunch', 'DEL'=>5, 'S'=>'+lowpunch,-lowpunch',
'HIT'=>'Hit' },
{ 'N'=>'HighKick', 'DEL'=>5, 'S'=>'+highkick,-highkick',
'HIT'=>'Hit' },
{ 'N'=>'LowKick', 'DEL'=>5, 'S'=>'+lowkick,-lowkick',
'HIT'=>'Leghit' },
{ 'N'=>'GroinKick', 'DEL'=>5, 'S'=>'+groinkick,-groinkick',
'HIT'=>'Groinhit' },
{ 'N'=>'KneeKick', 'DEL'=>5, 'S'=>'+kneekick,-kneekick',
'HIT'=>'Hit' },
{ 'N'=>'Elbow', 'DEL'=>5, 'S'=>'+elbow,-elbow',
'HIT'=>'Highhit' },
{ 'N'=>'Spin', 'DEL'=>5, 'S'=>'+spin',
'HIT'=>'Hit' },
{ 'N'=>'Sweep', 'DEL'=>7, 'S'=>'+sweep,-sweep',
'HIT'=>'Hit' },
{ 'N'=>'Grenade', 'DEL'=>5, 'S'=>'+grenade,-grenade',
'DEL12'=>15, 'DOODAD'=>$Doodad },
{ 'N'=>'Uppercut', 'DEL'=>5, 'S'=>'+uppercut,-uppercut',
'HIT'=>'Uppercut' },
{ 'N'=>'Throw', 'DEL'=>8, 'S'=>'+throw' },
{ 'N'=>'SpecPunch', 'DEL'=>5, 'S'=>'+specpunch',
'HIT'=>'Highhit' },
# 3. HURT MOVES
{ 'N'=>'Falling', 'DEL'=>5, 'S'=>'falling 1-12, falling 12-10, falling 13-n, laying 1',
'DEL10'=>7, 'DEL11'=>7, 'DEL12'=>7, 'DEL13'=>7, 'DEL14'=>7, 'DEL15'=>7,
'DELN'=>500, 'NEXTN'=>'Laying', 'SITU'=>'Falling', },
{ 'N'=>'Laying', 'DEL'=>1000,'S'=>'+laying',
'SITU'=>'Falling' },
{ 'N'=>'Getup', 'DEL'=>5, 'S'=>'+getup',
'SITU'=>'Falling',
'CON9'=>{'down'=>'Onknees'},
'CON10'=>{'down'=>'Onknees'},
},
{ 'N'=>'Dead', 'DEL'=>10000, 'S'=>'laying 1',
'SITU'=>'Falling', 'NEXTST'=>'Dead' },
{ 'N'=>'Swept', 'DEL'=>5, 'S'=>'+swept' },
{ 'N'=>'KneelingPunched', 'DEL'=>5, 'S'=>'+kneelingpunched,-kneelingpunched',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKicked', 'DEL'=>5, 'S'=>'+kneelingkicked, -kneelingkicked',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'HighPunched', 'DEL'=>8, 'S'=>'+highpunched, -highpunched' },
{ 'N'=>'LowPunched', 'DEL'=>5, 'S'=>'+lowpunched,-lowpunched' },
{ 'N'=>'GroinKicked', 'DEL'=>7, 'S'=>'+groinkicked,-groinkicked' },
{ 'N'=>'Thrown', 'DEL'=>5, 'S'=>'+thrown' },
);
# 2. CREATE STATES
foreach $framedesc (@States1)
{
AddStates( \%States, \%FrameLookup, $framedesc );
}
# Automatically add NEXTST for states which don't have one.
FixStates( \%FrameLookup, \%States );
TravelingStates( \%FrameLookup, \@Frames, \%States, "falling", 1, 15 );
TravelingStates( \%FrameLookup, \@Frames, \%States, "getup", 0, 0 );
TravelingStates( \%FrameLookup, \@Frames, \%States, "swept", 0, 0 ); #?
TravelingStates( \%FrameLookup, \@Frames, \%States, "spin", 0, 0 );
TravelingStates( \%FrameLookup, \@Frames, \%States, "specpunch", 0, 0 );
%States = ( FindShorthands( \%States ), %States );
-%::SirpiStates = %States;
-@::SirpiFrames = @Frames;
+# %::SirpiStates = %States;
+# @::SirpiFrames = @Frames;
+
+::RegisterFighter( {
+ 'ID' => 5,
+ 'GENDER' => 1,
+ 'DATAVERSION' => 1,
+ 'STARTCODE' => sub {},
+ 'FRAMES' => \@Frames,
+ 'STATES' => \%States,
+ 'DATAFILE' => 'SIRPIDATA.DAT',
+ 'DATASIZE' => 5587262,
+} );
+
}
LoadSirpi();
return 1;
diff --git a/data/script/UPi.pl b/data/script/UPi.pl
index 85f699d..655241c 100644
--- a/data/script/UPi.pl
+++ b/data/script/UPi.pl
@@ -1,198 +1,219 @@
# package UPi;
# UPi's images are scaled by a factor of 0.8
require 'DataHelper.pl';
use strict;
sub LoadUPi
{
my ( @Frames, %FrameLookup, %Frames, %States, %Shorthands,
$Doodad, $Con, $Con2,
@States1,
$framedesc, $key, $value, $framename, $nextst, $st, $lastchar, $nextchar );
@Frames = LoadFrames( "UPIDATA.DAT.pl", 275, 90 );
%FrameLookup = CreateFrameLookup( scalar @Frames -1,
"start", 18, "stand", 5, "walk", 14,
"turn", 8, "falling", 17, "laying", 1,
"getup", 16, "hurt", 12, "swept", 6,
"won", 19, "block", 5, "kneeling", 4,
"onknees", 4, "kneelingpunch",5, "kneelingkick", 5,
"fun", 5, "funb", 3, "threat", 6,
"highpunch", 4, "lowpunch", 6, "highkick", 6,
"lowkick", 5, "sweep", 7, "groinkick", 6,
"kneekick", 7, "elbow", 7, "spin", 10,
"grenade", 18, "uppercut", 8, "throw", 15,
"highpunched", 6, "lowpunched", 5, "groinkicked", 19,
"kneelingpunched",4, "kneelingkicked", 7, "thrown", 13,
"cranekick", 9, "burninghands", 13, "kneelingfire", 12,
+"shotdoodad", 5, "explodedoodad",15, "familiardoodad",3,
);
$Doodad =
{ 'T' => 1,
'W' => 64,
'H' => 64,
'SX' => 15,
'SY' => 0,
'FRAMES'=> 6,
'SA' => 1/25,
};
$Con = {
'forw'=>'Walk',
'back'=>'Back',
'jump'=>'Jump',
'jumpfw'=>'JumpFW',
'jumpbw'=>'JumpBW',
'block'=>'Block',
'down'=>'Kneeling',
'hpunch'=>'HighPunch',
'lpunch'=>'LowPunch',
'hkick'=>'HighKick',
'lkick'=>'LowKick',
'lkickBF'=>'GroinKick',
'lkickF'=>'KneeKick',
'hpunchD'=>'Uppercut',
'hpunchF'=>'Elbow',
'hkickB'=>'Spin',
'lkickB'=>'Sweep',
'lpunchBD'=>'Grenade',
'hkickFF'=>'CraneKick',
'hpunchUB'=>'BurningHands',
};
$Con2 = {
'lkick'=>'KneelingKick',
'hkick'=>'KneelingKick',
'hpunch'=>'KneelingUppercut',
'lpunch'=>'KneelingPunch',
'hpunchFF'=>'KneelingFire',
};
@States1 = (
# 1. BASIC MOVES
{ 'N'=>'Start', 'DEL'=>5, 'S'=>'start 1-8, start 8-1, start 9-n' },
{ 'N'=>'Stand', 'DEL'=>7, 'S'=>'+stand,_stand', 'CON'=>$Con, 'SITU'=>'Ready' },
{ 'N'=>'Turn', 'DEL'=>5, 'S'=>'+turn', 'TURNN'=>1, },
{ 'N'=>'Hurt', 'DEL'=>8, 'S'=>'+hurt,-hurt' },
{ 'N'=>'Won', 'DEL'=>8, 'S'=>'+won', 'NEXTSTN'=> 'Won2' },
{ 'N'=>'Won2', 'DEL'=>1000,'S'=>'won n', 'NEXTST'=>'Won2', },
{ 'N'=>'Fun', 'DEL'=>8, 'S'=>'+fun,-fun', 'CON'=>$Con },
{ 'N'=>'Funb', 'DEL'=>8, 'S'=>'+funb,-funb', 'CON'=>$Con },
{ 'N'=>'Threat', 'DEL'=>5, 'S'=>'+threat,-threat', 'CON'=>$Con },
WalkingFrames( \%FrameLookup, \@Frames, 4, 110, $Con ),
BlockStates( FindLastFrame( \%FrameLookup, 'block' ), 5 ),
KneelingStates( FindLastFrame( \%FrameLookup, 'kneeling' ),
FindLastFrame( \%FrameLookup, 'onknees' ), 7, $Con2 ),
JumpStates( \%FrameLookup,
{'lkick'=>'JumpKick', 'hkick'=>'JumpKick',
'lpunch'=>'JumpPunch', 'hpunch'=>'JumpPunch',
'hpunchFF'=>'JumpFire'} ),
# 2. OFFENSIVE MOVES
{ 'N'=>'KneelingPunch', 'DEL'=>5, 'S'=>'+kneelingpunch,-kneelingpunch', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKick', 'DEL'=>5, 'S'=>'+kneelingkick,-kneelingkick', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingUppercut','DEL'=>5, 'S'=>'kneeling 4-3,uppercut 6-n,-uppercut',
'HIT'=>'Uppercut' },
{ 'N'=>'HighPunch', 'DEL'=>5, 'S'=>'+highpunch,-highpunch',
'HIT'=>'Highhit' },
{ 'N'=>'LowPunch', 'DEL'=>5, 'S'=>'+lowpunch,-lowpunch',
'HIT'=>'Hit' },
{ 'N'=>'HighKick', 'DEL'=>5, 'S'=>'+highkick,-highkick',
'HIT'=>'Hit' },
{ 'N'=>'LowKick', 'DEL'=>5, 'S'=>'+lowkick,-lowkick',
'HIT'=>'Leghit' },
{ 'N'=>'GroinKick', 'DEL'=>5, 'S'=>'+groinkick,-groinkick',
'HIT'=>'Groinhit' },
{ 'N'=>'KneeKick', 'DEL'=>5, 'S'=>'+kneekick,-kneekick',
'HIT'=>'Hit' },
{ 'N'=>'Elbow', 'DEL'=>5, 'S'=>'+elbow,-elbow',
'HIT'=>'Highhit' },
{ 'N'=>'Spin', 'DEL'=>5, 'S'=>'+spin,-spin',
'HIT'=>'Hit' },
{ 'N'=>'Sweep', 'DEL'=>7, 'S'=>'+sweep,-sweep',
'HIT'=>'Hit' },
{ 'N'=>'Grenade', 'DEL'=>5, 'S'=>'+grenade',
- 'DEL12'=>15, 'DOODAD'=>$Doodad },
+ 'DEL12'=>15, 'DOODAD'=>'UPiShot' },
{ 'N'=>'Uppercut', 'DEL'=>5, 'S'=>'+uppercut,-uppercut',
'HIT'=>'Uppercut' },
{ 'N'=>'Throw', 'DEL'=>8, 'S'=>'+throw' },
-{ 'N'=>'CraneKick', 'DEL'=>5, 'S'=>'+cranekick, _cranekick',
+{ 'N'=>'CraneKick', 'DEL'=>5, 'S'=>'+cranekick, -cranekick',
'HIT'=>'Uppercut', 'JUMP4'=>60, 'PUSHX4'=>12*16 },
{ 'N'=>'BurningHands', 'DEL'=>5, 'S'=>'+burninghands', },
{ 'N'=>'KneelingFire', 'DEL'=>5, 'S'=>'+kneelingfire', 'SITU'=>'Crouch',
'DOODAD'=>$Doodad, 'NEXTSTN'=>'Onknees' },
{ 'N'=>'JumpFire', 'DEL'=>3, 'S'=> '+kneelingfire, -kneeling',
'DOODAD'=>$Doodad, 'DELN'=>100 },
# 3. HURT MOVES
{ 'N'=>'Falling', 'DEL'=>5, 'S'=>'falling 1-11, falling 15-12, falling 12-n, laying 1',
'DEL16'=>7, 'DEL17'=>7, 'DEL18'=>7, 'DEL19'=>7, 'DEL20'=>7, 'DEL21'=>7,
'DELN'=>500, 'NEXTN'=>'Laying', 'SITU'=>'Falling', },
{ 'N'=>'Laying', 'DEL'=>1000,'S'=>'+laying',
'SITU'=>'Falling' },
{ 'N'=>'Getup', 'DEL'=>5, 'S'=>'+getup',
'SITU'=>'Falling',
'CON8'=>{'down'=>'Onknees'},
'CON8'=>{'down'=>'Onknees'},
},
{ 'N'=>'Dead', 'DEL'=>10000, 'S'=>'laying 1',
'SITU'=>'Falling', 'NEXTST'=>'Dead' },
{ 'N'=>'Swept', 'DEL'=>5, 'S'=>'+swept,-swept' },
{ 'N'=>'KneelingPunched', 'DEL'=>5, 'S'=>'+kneelingpunched,-kneelingpunched',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKicked', 'DEL'=>5, 'S'=>'kneelingkicked 3-n, kneelingkicked n-3',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'HighPunched', 'DEL'=>8, 'S'=>'highpunched 2-n, -highpunched' },
{ 'N'=>'LowPunched', 'DEL'=>5, 'S'=>'+lowpunched,-lowpunched' },
{ 'N'=>'GroinKicked', 'DEL'=>7, 'S'=>'+groinkicked' },
{ 'N'=>'Thrown', 'DEL'=>5, 'S'=>'+thrown' },
);
# 2. CREATE STATES
foreach $framedesc (@States1)
{
AddStates( \%States, \%FrameLookup, $framedesc );
}
# Automatically add NEXTST for states which don't have one.
FixStates( \%FrameLookup, \%States );
TravelingStates( \%FrameLookup, \@Frames, \%States, "falling", 1, 18 );
TravelingStates( \%FrameLookup, \@Frames, \%States, "getup", 1, 16 );
TravelingStates( \%FrameLookup, \@Frames, \%States, "won", 0, 0 );
%States = ( FindShorthands( \%States ), %States );
-%::UPiStates = %States;
-@::UPiFrames = @Frames;
+# %::UPiStates = %States;
+# @::UPiFrames = @Frames;
+
+::RegisterFighter( {
+ 'ID' => 2,
+ 'GENDER' => 1,
+ 'DATAVERSION' => 1,
+ 'STARTCODE' => sub
+ {
+ my ($self,$doodad) = @_;
+ $doodad = Doodad::CreateDoodad( $self->{X}, $self->{Y}, 'UPiFamiliar', $self->{DIR}, $self->{NUMBER} );
+ $doodad = Doodad::CreateDoodad( $self->{X}, $self->{Y}, 'UPiFamiliar', $self->{DIR}, $self->{NUMBER} );
+ $doodad->{ANGLE} = 2;
+ $doodad = Doodad::CreateDoodad( $self->{X}, $self->{Y}, 'UPiFamiliar', $self->{DIR}, $self->{NUMBER} );
+ $doodad->{ANGLE} = -2;
+ },
+ 'FRAMES' => \@Frames,
+ 'STATES' => \%States,
+ 'DATAFILE' => 'UPIDATA.DAT',
+ 'DATASIZE' => 6462957,
+} );
+
}
LoadUPi();
return 1;
diff --git a/data/script/Ulmar.pl b/data/script/Ulmar.pl
index f89fb8a..9908759 100644
--- a/data/script/Ulmar.pl
+++ b/data/script/Ulmar.pl
@@ -1,187 +1,199 @@
# package Ulmar;
# Ulmar's images are scaled: 0.75
require 'DataHelper.pl';
use strict;
sub LoadUlmar
{
my ( @Frames, %FrameLookup, %Frames, %States, %Shorthands,
$Doodad, $Con, $Con2,
@States1,
$framedesc, $key, $value, $framename, $nextst, $st, $lastchar, $nextchar );
@Frames = LoadFrames( "ULMARDATA.DAT.pl", 270, 75 );
%FrameLookup = CreateFrameLookup( scalar @Frames - 1,
"start", 30, "stand", 6, "walk", 12, "junk",1,
"turn", 8, "falling", 14, "laying", 1,
"getup", 20, "hurt", 13, "swept", 9,
"won", 14, "block", 6, "kneeling", 4,
"onknees", 4, "kneelingpunch",6, "kneelingkick", 5,
"fun", 7, "threat", 5, "highpunch", 11,
"lowpunch", 10, "highkick", 6, "junkb",1,
"lowkick", 6, "sweep", 10,
"groinkick", 7, "kneekick", 7, "elbow", 7,
"spin", 11, "grenade", 10, "uppercut", 9,
"throw", 34, "highpunched", 6, "lowpunched", 7,
"groinkicked", 8, "kneelingpunched",5, "kneelingkicked", 6,
"thrown", 10, "specsomething",9,
);
$Doodad =
{ 'T' => 1,
'W' => 64,
'H' => 64,
'SX' => 15,
'SY' => 0,
'FRAMES'=> 6,
'SA' => 1/25,
};
$Con = {
'forw'=>'Walk',
'back'=>'Back',
'jump'=>'Jump',
'jumpfw'=>'JumpFW',
'jumpbw'=>'JumpBW',
'block'=>'Block',
'down'=>'Kneeling',
'hpunch'=>'HighPunch',
'lpunch'=>'LowPunch',
'hkick'=>'HighKick',
'lkick'=>'LowKick',
'lkickBF'=>'GroinKick',
'lkickF'=>'KneeKick',
'hpunchD'=>'Uppercut',
'hpunchF'=>'Elbow',
'hpunchB'=>'Spin',
'lkickB'=>'Sweep',
'lpunchBD'=>'Grenade',
'lpunchFBF'=>'SpecSomething',
};
$Con2 = {
'lkick'=>'KneelingKick',
'hkick'=>'KneelingKick',
'hpunch'=>'KneelingUppercut',
'lpunch'=>'KneelingPunch',
};
@States1 = (
# 1. BASIC MOVES
{ 'N'=>'Start', 'DEL'=>5, 'S'=>'+start 1-8' },
{ 'N'=>'Stand', 'DEL'=>7, 'S'=>'+stand,_stand', 'CON'=>$Con, 'SITU'=>'Ready' },
{ 'N'=>'Turn', 'DEL'=>5, 'S'=>'+turn', 'TURNN'=>1, },
{ 'N'=>'Hurt', 'DEL'=>8, 'S'=>'+hurt,-hurt' },
{ 'N'=>'Won', 'DEL'=>8, 'S'=>'+won', 'NEXTSTN'=> 'Won2' },
{ 'N'=>'Won2', 'DEL'=>1000,'S'=>'won n', 'NEXTST'=>'Won2', },
{ 'N'=>'Fun', 'DEL'=>8, 'S'=>'+fun,-fun', 'CON'=>$Con },
{ 'N'=>'Threat', 'DEL'=>5, 'S'=>'+threat,-threat', 'CON'=>$Con },
WalkingFrames( \%FrameLookup, \@Frames, 0, 111, $Con ),
BlockStates( FindLastFrame( \%FrameLookup, 'block' ), 5 ),
KneelingStates( FindLastFrame( \%FrameLookup, 'kneeling' ),
FindLastFrame( \%FrameLookup, 'onknees' ), 7, $Con2 ),
JumpStates( \%FrameLookup,
{'lkick'=>'JumpKick', 'hkick'=>'JumpKick',
'lpunch'=>'JumpPunch', 'hpunch'=>'JumpPunch',} ),
# 2. OFFENSIVE MOVES
{ 'N'=>'KneelingPunch', 'DEL'=>5, 'S'=>'+kneelingpunch,-kneelingpunch', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKick', 'DEL'=>5, 'S'=>'+kneelingkick,-kneelingkick', 'SITU'=>'Crouch',
'HIT'=>'Hit', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingUppercut','DEL'=>5, 'S'=>'kneeling 4-3,uppercut 6-n,-uppercut',
'HIT'=>'Uppercut' },
{ 'N'=>'HighPunch', 'DEL'=>5, 'S'=>'+highpunch',
'HIT'=>'Highhit' },
{ 'N'=>'LowPunch', 'DEL'=>5, 'S'=>'+lowpunch',
'HIT'=>'Hit' },
{ 'N'=>'HighKick', 'DEL'=>5, 'S'=>'+highkick,-highkick',
'HIT'=>'Hit' },
{ 'N'=>'LowKick', 'DEL'=>5, 'S'=>'+lowkick,-lowkick',
'HIT'=>'Leghit' },
{ 'N'=>'GroinKick', 'DEL'=>5, 'S'=>'+groinkick,-groinkick',
'HIT'=>'Groinhit' },
{ 'N'=>'KneeKick', 'DEL'=>5, 'S'=>'+kneekick,-kneekick',
'HIT'=>'Hit' },
{ 'N'=>'Elbow', 'DEL'=>5, 'S'=>'+elbow,-elbow',
'HIT'=>'Highhit' },
{ 'N'=>'Spin', 'DEL'=>5, 'S'=>'+spin,-spin',
'HIT'=>'Hit' },
{ 'N'=>'Sweep', 'DEL'=>7, 'S'=>'+sweep,-sweep',
'HIT'=>'Hit' },
{ 'N'=>'Grenade', 'DEL'=>5, 'S'=>'+grenade,-grenade',
'DEL12'=>15, 'DOODAD10'=>$Doodad },
{ 'N'=>'Uppercut', 'DEL'=>5, 'S'=>'+uppercut,-uppercut',
'HIT'=>'Uppercut' },
{ 'N'=>'Throw', 'DEL'=>8, 'S'=>'+throw' },
{ 'N'=>'SpecSomething', 'DEL'=>5, 'S'=>'+specsomething', },
# 3. HURT MOVES
{ 'N'=>'Falling', 'DEL'=>5, 'S'=>'+falling, laying 1',
'DELN'=>500, 'NEXTN'=>'Laying', 'SITU'=>'Falling', },
{ 'N'=>'Laying', 'DEL'=>1000,'S'=>'+laying',
'SITU'=>'Falling' },
{ 'N'=>'Getup', 'DEL'=>5, 'S'=>'+getup',
'SITU'=>'Falling',
'CON8'=>{'down'=>'Onknees'},
'CON8'=>{'down'=>'Onknees'},
},
{ 'N'=>'Dead', 'DEL'=>10000, 'S'=>'laying 1',
'SITU'=>'Falling', 'NEXTST'=>'Dead' },
{ 'N'=>'Swept', 'DEL'=>5, 'S'=>'+swept,-swept' },
{ 'N'=>'KneelingPunched', 'DEL'=>5, 'S'=>'+kneelingpunched,-kneelingpunched',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'KneelingKicked', 'DEL'=>5, 'S'=>'+kneelingkicked, -kneelingkicked',
'SITU'=>'Crouch', 'NEXTSTN'=>'Onknees' },
{ 'N'=>'HighPunched', 'DEL'=>8, 'S'=>'+highpunched, -highpunched' },
{ 'N'=>'LowPunched', 'DEL'=>5, 'S'=>'+lowpunched,-lowpunched' },
{ 'N'=>'GroinKicked', 'DEL'=>7, 'S'=>'+groinkicked, -groinkicked' },
{ 'N'=>'Thrown', 'DEL'=>5, 'S'=>'+thrown' },
);
# 2. CREATE STATES
foreach $framedesc (@States1)
{
AddStates( \%States, \%FrameLookup, $framedesc );
}
# Automatically add NEXTST for states which don't have one.
FixStates( \%FrameLookup, \%States );
TravelingStates( \%FrameLookup, \@Frames, \%States, "falling", 1, 15 );
TravelingStates( \%FrameLookup, \@Frames, \%States, "getup", 0, 0 );
%States = ( FindShorthands( \%States ), %States );
-%::UlmarStates = %States;
-@::UlmarFrames = @Frames;
+# %::UlmarStates = %States;
+# @::UlmarFrames = @Frames;
+
+::RegisterFighter( {
+ 'ID' => 1,
+ 'GENDER' => 1,
+ 'DATAVERSION' => 1,
+ 'STARTCODE' => sub {},
+ 'FRAMES' => \@Frames,
+ 'STATES' => \%States,
+ 'DATAFILE' => 'ULMARDATA.DAT',
+ 'DATASIZE' => 6316271,
+} );
+
}
LoadUlmar();
return 1;
diff --git a/data/script/Zoli.pl b/data/script/Zoli.pl
index 2f6d716..3cd42bc 100644
--- a/data/script/Zoli.pl
+++ b/data/script/Zoli.pl
@@ -1,261 +1,273 @@
# package Zoli;
# Zoli's images are scaled:
# First 47 images: 0.75
# Rest of the images: 0.78 (strange zoomout effect)
require 'DataHelper.pl';
# @ISA = qw(Fighter);
@ZoliFrames = LoadFrames( "ZOLIDATA.DAT.pl", 340, 200 );
%ZoliFrame = CreateFrameLookup( scalar @ZoliFrames - 1,
"start", 21, "stand", 4, "walk", 13,
"turn", 9, "falling", 11, "laying", 1,
"getup", 14, "hurt", 16, "swept", 6,
"won", 11, "block", 5, "kneeling", 4,
"onknees", 1, "kneelingpunch",7, "kneelingkick", 4,
"fun", 7, "threat", 9, "highpunch", 5,
"lowpunch", 6, "highkick", 8, "lowkick", 6,
"groinkick", 6, "kneekick", 6, "elbow", 5,
"spin", 11, "grenade", 15, "uppercut", 9,
"throw", 16, "highpunched", 9, "lowpunched", 4,
"groinkicked", 13, "kneelingpunched",4, "kneelingkicked", 3,
"thrown", 4, "specpunch", 13,
);
-
+=comment
$ZoliDoodad =
{ 'T' => 1,
'W' => 64,
'H' => 64,
'SX' => 15,
'SY' => 0,
'FRAMES'=> 6,
'SA' => 1/25,
};
-
+=cut
$ZCon = {
'forw'=>'Walk',
'back'=>'Back',
'jump'=>'Jump',
'jumpfw'=>'JumpFW',
'jumpbw'=>'JumpBW',
'block'=>'Block',
'down'=>'Kneeling',
'hpunch'=>'HighPunch',
'lpunch'=>'LowPunch',
'hkick'=>'HighKick',
'lkick'=>'LowKick',
'lkickFB'=>'GroinKick',
'lkickF'=>'KneeKick',
'hpunchF'=>'Elbow',
'hpunchB'=>'SpinPunch',
'lpunchBD'=>'Grenade',
'hpunchD'=>'Uppercut',
'hpunchFF'=>'SpecPunch',
};
@ZoliStates1 = (
{ 'N'=>'Start', 'DEL'=>5, 'S'=>'+start' },
{ 'N'=>'Stand', 'DEL'=>10, 'S'=>'+stand', 'CON'=>$ZCon, 'SITU'=>'Ready' },
{ 'N'=>'Walk', 'DEL'=>5, 'S'=>'+walk, walk 3-1', 'CON'=>$ZCon },
{ 'N'=>'Back', 'DEL'=>5, 'S'=>'walk 1-3,walk 13-1', 'CON'=>$ZCon },
{ 'N'=>'Turn', 'DEL'=>5, 'S'=>'+turn',
'TURNN'=>1, },
{ 'N'=>'Falling', 'DEL'=>5, 'S'=>'+falling',
'DEL11'=>500, 'NEXT11'=>'Laying', 'SITU'=>'Falling' }, #, 'DELTAX'=>-20, },
{ 'N'=>'Laying', 'DEL'=>1000,'S'=>'+laying',
'SITU'=>'Falling' },
{ 'N'=>'Getup', 'DEL'=>5, 'S'=>'+getup',
'SITU'=>'Falling', # 'DELTAX'=>11,
'CON8'=>{'down'=>'Kneeling 5'},
'CON8'=>{'down'=>'Kneeling 5'},
},
{ 'N'=>'Dead', 'DEL'=>10000, 'S'=>'laying 1',
'SITU'=>'Falling' },
{ 'N'=>'Hurt', 'DEL'=>8, 'S'=>'+hurt' },
{ 'N'=>'Swept', 'DEL'=>5, 'S'=>'+swept,-swept' },
{ 'N'=>'Won', 'DEL'=>8, 'S'=>'+won',
'NEXTST11'=> 'Won2' },
{ 'N'=>'Won2', 'DEL'=>1000,'S'=>'won 11',
'NEXTST'=>'Won2',
},
{ 'N'=>'Block', 'DEL'=>3, 'S'=>'+block,_block', 'BLOCK5'=>1,
'NEXTST1'=>'Stand', 'CON1'=>{'block'=>'Block 2'},
'NEXTST2'=>'Block 1', 'CON2'=>{'block'=>'Block 3'},
'NEXTST3'=>'Block 2', 'CON3'=>{'block'=>'Block 4'},
'NEXTST4'=>'Block 3', 'CON4'=>{'block'=>'Block 5'},
'NEXTST5'=>'Block 6', 'CON5'=>{'block'=>'Block 5'},
'CON6'=>{'block'=>'Block 5'},
'CON7'=>{'block'=>'Block 6'},
'CON8'=>{'block'=>'Block 7'},
'CON9'=>{'block'=>'Block 8'},
},
{ 'N'=>'Kneeling', 'DEL'=>5, 'S'=>'+kneeling,+onknees,-kneeling',
'SITU'=>'Crouch',
'NEXTST1'=>'Stand', 'CON1'=>{"down"=>"Kneeling 2"},
'NEXTST2'=>'Kneeling 1', 'CON2'=>{"down"=>"Kneeling 3"},
'NEXTST3'=>'Kneeling 2', 'CON3'=>{"down"=>"Kneeling 4"},
'NEXTST4'=>'Kneeling 3', 'CON4'=>{"down"=>"Kneeling 5"},
'NEXTST5'=>'Kneeling 4', 'CON5'=>{"down"=>"Kneeling 5",
'lkick'=>'KneelingKick', 'hkick'=>'KneelingKick', 'hpunch'=>'Uppercut 6', 'lpunch'=>'KneelingPunch' },
'CON6'=>{"down"=>"Kneeling 5"},
'CON7'=>{"down"=>"Kneeling 6"},
'CON8'=>{"down"=>"Kneeling 7"},
'CON9'=>{"down"=>"Kneeling 8"},
}, # Should be much lighter
{ 'N'=>'KneelingPunch', 'DEL'=>5, 'S'=>'+kneelingpunch,-kneelingpunch',
'SITU'=>'Crouch',
'HIT7'=>'Hit', 'NEXTST14'=>'Kneeling 5' },
{ 'N'=>'KneelingKick', 'DEL'=>8, 'S'=>'+kneelingkick,-kneelingkick',
'SITU'=>'Crouch',
'HIT4'=>'Hit', 'NEXTST8'=>'Kneeling 5' },
{ 'N'=>'KneelingPunched', 'DEL'=>5, 'S'=>'+kneelingpunched,-kneelingpunched',
'SITU'=>'Crouch', 'NEXTST8'=>'Kneeling 5' },
{ 'N'=>'KneelingKicked', 'DEL'=>5, 'S'=>'+kneelingkicked,-kneelingkicked',
'SITU'=>'Crouch', 'NEXTST6'=>'Kneeling 5' },
{ 'N'=>'KneelingKicked','DEL'=>5, 'S'=>'+kneelingkicked,-kneelingkicked' },
JumpStates( \%ZoliFrame,
{'lkick'=>'JumpKick', 'hkick'=>'JumpKick',
'lpunch'=>'JumpPunch', 'hpunch'=>'JumpPunch'} ),
{ 'N'=>'Fun', 'DEL'=>8, 'S'=>'fun 7-6,+fun', 'CON'=>$ZCon },
{ 'N'=>'Threat', 'DEL'=>8, 'S'=>'threat 1-7', 'CON'=>$ZCon }, # Threat 8-9 are bad.
{ 'N'=>'HighPunch', 'DEL'=>5, 'S'=>'+highpunch,-highpunch',
'HIT5'=>'Highhit' },
{ 'N'=>'LowPunch', 'DEL'=>5, 'S'=>'+lowpunch,-lowpunch',
'HIT6'=>'Hit' },
{ 'N'=>'HighKick', 'DEL'=>5, 'S'=>'+highkick,-highkick',
'HIT8'=>'Hit' },
{ 'N'=>'LowKick', 'DEL'=>5, 'S'=>'+lowkick,-lowkick',
'HIT6'=>'Leghit' },
{ 'N'=>'GroinKick', 'DEL'=>5, 'S'=>'+groinkick,-groinkick',
'HIT6'=>'Groinhit' },
{ 'N'=>'KneeKick', 'DEL'=>5, 'S'=>'+kneekick,-kneekick',
'HIT6'=>'Hit' },
{ 'N'=>'Elbow', 'DEL'=>5, 'S'=>'+elbow,-elbow',
'HIT5'=>'Highhit' },
{ 'N'=>'SpinPunch', 'DEL'=>4, 'S'=>'+spin,-spin',
'HIT11'=>'Highhit' },
{ 'N'=>'Grenade', 'DEL'=>5, 'S'=>'+grenade',
- 'DEL12'=>15, 'DOODAD12'=>$ZoliDoodad },
+ 'DEL12'=>15, 'DOODAD12'=>'ZoliShot' },
{ 'N'=>'Uppercut', 'DEL'=>5, 'S'=>'+uppercut,-uppercut',
'HIT9'=>'Uppercut' },
{ 'N'=>'Throw', 'DEL'=>8, 'S'=>'+throw' },
{ 'N'=>'HighPunched', 'DEL'=>8, 'S'=>'+highpunched' },
{ 'N'=>'LowPunched', 'DEL'=>5, 'S'=>'+lowpunched,-lowpunched' },
{ 'N'=>'GroinKicked', 'DEL'=>7, 'S'=>'+groinkicked' },
{ 'N'=>'Thrown', 'DEL'=>5, 'S'=>'+thrown' },
{ 'N'=>'SpecPunch', 'DEL'=>5, 'S'=>'+specpunch', 'DEL8'=>15, 'DELTAX13'=>74,
'HIT8'=>'Uppercut' },
);
# 2. CREATE STATES: %ZoliStates
foreach $framedesc (@ZoliStates1)
{
AddStates( \%ZoliStates, \%ZoliFrame, $framedesc );
}
#$ZoliStates{'Standby'} =
#{ 'F'=>'stand1', 'DEL'=> 25, 'CON'=> $KCon, 'NEXTST'=>'JumpFW 1' };
# Automatically add STUFF to Walk and Back
for ( $i=4; $i<=13; ++$i )
{
$j = $ZoliFrame{"walk$i"};
OffsetFrame( $ZoliFrames[$j], -($i-4)*16, 0 );
}
#for ( $i=1; $i<=11; ++$i )
#{
# $j = $ZoliFrame{"falling$i"};
# OffsetFrame( $ZoliFrames[$j], $i*18, 0 );
#}
#for ( $i=1; $i<=14; ++$i )
#{
# $j = $ZoliFrame{"getup$i"};
# OffsetFrame( $ZoliFrames[$j], 198 - $i*11, 0 );
#}
#$j = $ZoliFrame{"laying1"};
#OffsetFrame( $ZoliFrames[$j], 198, 0 );
for ( $i=1; $i<=3; ++$i )
{
$j = $i+1;
$ZoliStates{"Walk $i"}->{NEXTST} = "Stand";
$ZoliStates{"Walk $i"}->{CON} = { %{$ZCon}, 'forw'=>"Walk $j" };
$ZoliStates{"Back $i"}->{NEXTST} = "Stand";
$ZoliStates{"Back $i"}->{CON} = { %{$ZCon}, 'back'=>"Back $j" };
}
for ( $i=4; $i<=13; ++$i )
{
$j = $i+1;
$j = 4 if $j == 14;
$ZoliStates{"Walk $i"}->{MOVE} = 4;
$ZoliStates{"Walk $i"}->{NEXTST} = "Walk 14";
$ZoliStates{"Walk $i"}->{CON} = { %{$ZCon}, 'forw'=>"Walk $j" };
$ZoliStates{"Back $i"}->{MOVE} = -4;
$ZoliStates{"Back $i"}->{NEXTST} = "Back 14";
$ZoliStates{"Back $i"}->{CON} = { %{$ZCon}, 'back'=>"Back $j" };
}
# Automatically add NEXTST for states which don't have one.
while (($key, $value) = each %ZoliStates) {
$framename = $value->{'F'};
unless ( $framename =~/^\d+$/ )
{
# Convert non-numeric frames to their numeric counterparts.
die "Can't find image $framename in frame $key" unless defined $ZoliFrame{ $framename };
$value->{'F'} = $ZoliFrame{ $value->{'F'} };
}
($st,$lastchar) = $key =~ /(\w+)\s+(\d+)/;
unless ( defined $value->{'NEXTST'} )
{
$nextchar = $lastchar + 1;
$nextst = "$st $nextchar";
unless ( defined $ZoliStates{$nextst} ) {
# print "Go to Standby after $key\n";
$nextst = 'Stand';
}
$value->{'NEXTST'} = $nextst;
}
print "$key has no lastchar" unless defined $lastchar;
if ( $lastchar == 1 )
{
$ZoliShorthands{$st} = $ZoliStates{$key};
}
}
TravelingStates( \%ZoliFrame, \@ZoliFrames, \%ZoliStates, "falling", 1, 12 );
TravelingStates( \%ZoliFrame, \@ZoliFrames, \%ZoliStates, "getup", 1, 14 );
TravelingStates( \%ZoliFrame, \@ZoliFrames, \%ZoliStates, "specpunch", 0, 0 );
#$frameLookup, $frameArray, $states, $frameName, $from, $to
%ZoliStates = ( %ZoliShorthands, %ZoliStates );
+::RegisterFighter( {
+ 'ID' => 3,
+ 'GENDER' => 1,
+ 'DATAVERSION' => 1,
+ 'STARTCODE' => sub {},
+ 'FRAMES' => \@ZoliFrames,
+ 'STATES' => \%ZoliStates,
+ 'DATAFILE' => 'ZOLIDATA.DAT',
+ 'DATASIZE' => 4486206,
+} );
+
+
return 1;
diff --git a/src/Backend.cpp b/src/Backend.cpp
index a06b7d0..7738a33 100644
--- a/src/Backend.cpp
+++ b/src/Backend.cpp
@@ -1,382 +1,389 @@
/***************************************************************************
Backend.cpp - description
-------------------
begin : Mon Dec 9 2002
copyright : (C) 2002 by upi
email : upi@apocalypse.rulez.org
***************************************************************************/
#include "common.h"
#include "Backend.h"
#include "Audio.h"
#include <string>
#include <stdarg.h>
#include <EXTERN.h>
#include <perl.h>
/***************************************************************************
PUBLIC EXPORTED VARIABLES
***************************************************************************/
PerlInterpreter* my_perl;
Backend g_oBackend;
/***************************************************************************
PRIVATE VARIABLES (perl variable space)
***************************************************************************/
SV
*perl_bgx, *perl_bgy,
*perl_p1x, *perl_p1y, *perl_p1f, *perl_p1h,
*perl_p2x, *perl_p2y, *perl_p2f, *perl_p2h,
*perl_time, *perl_over, *perl_ko;
SV
*perl_doodad_x, *perl_doodad_y,
*perl_doodad_t, *perl_doodad_f,
+ *perl_doodad_dir, *perl_doodad_gfxowner,
*perl_doodad_text;
SV
*perl_sound;
/***************************************************************************
BACKEND CLASS IMPLEMENTATION
***************************************************************************/
#define PERLEVAL(A) eval_pv(A, TRUE);
#define PERLCALL(PROC,A,B) { \
dSP; \
ENTER; \
SAVETMPS; \
PUSHMARK(SP); \
XPUSHs(sv_2mortal(newSViv(A))); \
XPUSHs(sv_2mortal(newSViv(B))); \
PUTBACK ; \
\
call_pv( (PROC), G_DISCARD ); \
\
FREETMPS; \
LEAVE; \
}
Backend::Backend()
{
m_iBgX = m_iBgY = 0;
m_iNumDoodads = m_iNumSounds = 0;
for ( int i=0; i<2; ++i )
{
m_aoPlayers[i].m_iX = m_aoPlayers[i].m_iY = 0;
m_aoPlayers[i].m_iFrame = 0;
m_aoPlayers[i].m_iHitPoints = 0;
}
}
Backend::~Backend()
{
if ( NULL != my_perl )
{
perl_destruct( my_perl );
perl_free( my_perl );
my_perl = NULL;
}
}
bool Backend::Construct()
{
if ( my_perl != NULL )
{
// Already inited
return false;
}
perl_bgx = NULL;
perl_doodad_x = NULL;
std::string sFileName = DATADIR;
sFileName += "/script";
chdir( sFileName.c_str() );
char *perl_argv[] = {"", "Backend.pl"};
my_perl = perl_alloc();
if ( my_perl == NULL )
{
return false;
}
perl_construct( my_perl );
if ( perl_parse( my_perl, NULL, 2, perl_argv, (char**)NULL ) )
{
char *error = SvPV_nolen(get_sv("@", FALSE));
fprintf( stderr, "%s", error );
return false;
}
if ( perl_run( my_perl ) )
{
char *error = SvPV_nolen(get_sv("@", FALSE));
fprintf( stderr, "%s", error );
return false;
}
return true;
}
const char* Backend::PerlEvalF( const char* a_pcFormat, ... )
{
va_list ap;
va_start( ap, a_pcFormat );
char acBuffer[1024];
vsnprintf( acBuffer, 1023, a_pcFormat, ap );
acBuffer[1023] = 0;
PERLEVAL(acBuffer);
const char *pcError = SvPV_nolen(get_sv("@", FALSE));
if ( pcError )
{
fprintf( stderr, "%s", pcError );
}
va_end( ap );
return pcError;
}
const char* Backend::GetPerlString( const char* acScalarName )
{
SV* poScalar = get_sv( acScalarName, FALSE );
if ( NULL == poScalar )
{
return "";
}
return SvPV_nolen( poScalar );
}
int Backend::GetPerlInt( const char* acScalarName )
{
SV* poScalar = get_sv( acScalarName, FALSE );
if ( NULL == poScalar )
{
return 0;
}
return SvIV( poScalar );
}
void Backend::AdvancePerl()
{
PERLEVAL("GameAdvance();");
}
void Backend::ReadFromPerl()
{
if ( perl_bgx == NULL )
{
perl_bgx = get_sv("bgx", TRUE);
perl_bgy = get_sv("bgy", TRUE);
perl_p1x = get_sv("p1x", TRUE);
perl_p1y = get_sv("p1y", TRUE);
perl_p1f = get_sv("p1f", TRUE);
perl_p1h = get_sv("p1h", TRUE);
perl_p2x = get_sv("p2x", TRUE);
perl_p2y = get_sv("p2y", TRUE);
perl_p2f = get_sv("p2f", TRUE);
perl_p2h = get_sv("p2h", TRUE);
perl_time= get_sv("time", TRUE);
perl_over= get_sv("over", TRUE);
perl_ko = get_sv("ko", TRUE);
}
m_iBgX = SvIV( perl_bgx );
m_iBgY = SvIV( perl_bgy );
m_aoPlayers[0].m_iX = SvIV( perl_p1x );
m_aoPlayers[0].m_iY = SvIV( perl_p1y );
m_aoPlayers[0].m_iFrame = SvIV( perl_p1f );
m_aoPlayers[0].m_iHitPoints = SvIV( perl_p1h ) / 10;
m_aoPlayers[1].m_iX = SvIV( perl_p2x );
m_aoPlayers[1].m_iY = SvIV( perl_p2y );
m_aoPlayers[1].m_iFrame = SvIV( perl_p2f );
m_aoPlayers[1].m_iHitPoints = SvIV( perl_p2h ) / 10;
m_iGameTime = SvIV( perl_time );
m_iGameOver = SvIV( perl_over );
m_bKO = SvIV( perl_ko );
// READ DOODAD DATA
if ( perl_doodad_x == NULL )
{
perl_doodad_x = get_sv("doodad_x", TRUE);
perl_doodad_y = get_sv("doodad_y", TRUE);
perl_doodad_t = get_sv("doodad_t", TRUE);
perl_doodad_f = get_sv("doodad_f", TRUE);
+ perl_doodad_dir = get_sv("doodad_dir", TRUE);
+ perl_doodad_gfxowner = get_sv("doodad_gfxowner", TRUE);
perl_doodad_text = get_sv("doodad_text", TRUE);
}
for ( m_iNumDoodads=0; m_iNumDoodads<MAXDOODADS; ++m_iNumDoodads )
{
PERLEVAL("GetNextDoodadData();");
SDoodad& oDoodad = m_aoDoodads[m_iNumDoodads];
oDoodad.m_iType = SvIV(perl_doodad_t);
if ( oDoodad.m_iType < 0 )
{
break;
}
oDoodad.m_iX = SvIV(perl_doodad_x);
oDoodad.m_iY = SvIV(perl_doodad_y);
oDoodad.m_iFrame = SvIV(perl_doodad_f);
+ oDoodad.m_iDir = SvIV(perl_doodad_dir);
+ oDoodad.m_iGfxOwner = SvIV(perl_doodad_gfxowner);
if ( oDoodad.m_iType == 0 )
{
oDoodad.m_sText = SvPV_nolen(perl_doodad_text);
}
else
{
oDoodad.m_sText.clear();
}
}
// READ SOUND DATA
if ( perl_sound == NULL )
{
perl_sound = get_sv("sound", TRUE);
}
for ( m_iNumSounds=0; m_iNumSounds<MAXSOUNDS; ++m_iNumSounds )
{
PERLEVAL("GetNextSoundData();");
const char* pcSound = SvPV_nolen(perl_sound);
if ( NULL == pcSound
|| 0 == *pcSound )
{
break;
}
m_asSounds[ m_iNumSounds ] = pcSound;
//Audio->PlaySample( pcSound );
}
}
void Backend::PlaySounds()
{
for ( int i=0; i<m_iNumSounds; ++i )
{
Audio->PlaySample( m_asSounds[i].c_str() );
}
}
/***************************************************************************
PLAYBACK STRING CONVERSION ROUTINES
***************************************************************************/
void Backend::WriteToString( std::string& a_rsOutString )
{
char acBuffer[2048];
int iNumChars = sprintf( acBuffer, "%d %d %d %d %d %d %d %d %d %d %d ",
m_iBgX, m_iBgY,
m_aoPlayers[0].m_iX, m_aoPlayers[0].m_iY, m_aoPlayers[0].m_iFrame, m_aoPlayers[0].m_iHitPoints,
m_aoPlayers[1].m_iX, m_aoPlayers[1].m_iY, m_aoPlayers[1].m_iFrame, m_aoPlayers[1].m_iHitPoints,
m_iNumDoodads );
int i;
for ( i = 0; i<m_iNumDoodads; ++i )
{
SDoodad& roDoodad = m_aoDoodads[i];
- iNumChars += sprintf( acBuffer+iNumChars, "%d %d %d %d %d %s ",
+ iNumChars += sprintf( acBuffer+iNumChars, "%d %d %d %d %d %d %d %s ",
roDoodad.m_iX, roDoodad.m_iY, roDoodad.m_iType, roDoodad.m_iFrame,
+ roDoodad.m_iDir, roDoodad.m_iGfxOwner,
roDoodad.m_sText.size(), roDoodad.m_sText.c_str() );
}
iNumChars += sprintf( acBuffer+iNumChars, "%d ", m_iNumSounds );
for ( i = 0; i<m_iNumSounds; ++i )
{
iNumChars += sprintf( acBuffer+iNumChars, " %d %s",
m_asSounds[i].size(), m_asSounds[i].c_str() );
}
// debug( "Frame: '%s'\n", acBuffer );
a_rsOutString = acBuffer;
}
void Backend::ReadFromString( const std::string& a_rsString )
{
const char* pcBuffer = a_rsString.c_str();
int iNumMatches;
int iOffset, iTotal;
iNumMatches = sscanf( pcBuffer, "%d %d %d %d %d %d %d %d %d %d %d%n",
&m_iBgX, &m_iBgY,
&m_aoPlayers[0].m_iX, &m_aoPlayers[0].m_iY, &m_aoPlayers[0].m_iFrame, &m_aoPlayers[0].m_iHitPoints,
&m_aoPlayers[1].m_iX, &m_aoPlayers[1].m_iY, &m_aoPlayers[1].m_iFrame, &m_aoPlayers[1].m_iHitPoints,
&m_iNumDoodads, &iTotal );
if ( m_iNumDoodads > MAXDOODADS )
{
m_iNumDoodads = m_iNumSounds = 0;
return;
}
int i, j;
for ( i=0; i<m_iNumDoodads; ++i )
{
SDoodad& roDoodad = m_aoDoodads[i];
- iNumMatches += sscanf( pcBuffer+iTotal, "%d %d %d %d %d %n",
+ iNumMatches += sscanf( pcBuffer+iTotal, "%d %d %d %d %d %d %d %n",
&roDoodad.m_iX, &roDoodad.m_iY, &roDoodad.m_iType, &roDoodad.m_iFrame,
+ &roDoodad.m_iDir, &roDoodad.m_iGfxOwner,
&j, &iOffset );
iTotal += iOffset;
roDoodad.m_sText.assign( pcBuffer + iTotal, j );
iTotal += j;
}
iNumMatches += sscanf( pcBuffer + iTotal, "%d%n",
&m_iNumSounds, &iOffset );
if ( m_iNumSounds > MAXSOUNDS )
{
m_iNumSounds = 0;
return;
}
iTotal += iOffset;
for ( i=0; i<m_iNumSounds; ++i )
{
iNumMatches += sscanf( pcBuffer+iTotal, "%d %n",
&j, &iOffset );
iTotal += iOffset;
m_asSounds[i].assign( pcBuffer + iTotal, j );
iTotal += j;
}
}
diff --git a/src/Backend.h b/src/Backend.h
index 3950841..5497e5b 100644
--- a/src/Backend.h
+++ b/src/Backend.h
@@ -1,77 +1,78 @@
/***************************************************************************
Backend.h - description
-------------------
begin : Sun Dec 8 2002
copyright : (C) 2002 by upi
email : upi@apocalypse.rulez.org
***************************************************************************/
#ifndef BACKEND_H
#define BACKEND_H
#include <string>
#include "FighterEnum.h"
class RlePack;
#define MAXDOODADS 20
#define MAXSOUNDS 20
class Backend
{
public:
// Lifecycle
Backend();
~Backend();
bool Construct();
// Miscellaneous
const char* PerlEvalF( const char* a_pcFormat, ... );
const char* GetPerlString( const char* a_pcScalarName );
int GetPerlInt( const char* a_pcScalarName );
// Game data
void AdvancePerl();
void ReadFromPerl();
void PlaySounds();
void WriteToString( std::string& a_rsOutString );
void ReadFromString( const std::string& a_rsString );
public:
int m_iGameTime;
int m_iGameOver;
bool m_bKO;
int m_iBgX, m_iBgY;
int m_iNumDoodads;
int m_iNumSounds;
struct SPlayer
{
int m_iX, m_iY, m_iFrame, m_iHitPoints;
} m_aoPlayers[2];
struct SDoodad
{
int m_iX, m_iY, m_iType, m_iFrame;
+ int m_iDir, m_iGfxOwner;
std::string m_sText;
} m_aoDoodads[ MAXDOODADS ];
std::string m_asSounds[ MAXSOUNDS ];
};
extern Backend g_oBackend;
int DoGame( char* replay, bool isReplay, bool bDebug );
#endif
diff --git a/src/Demo.cpp b/src/Demo.cpp
index 97e7d7e..465fa99 100644
--- a/src/Demo.cpp
+++ b/src/Demo.cpp
@@ -1,358 +1,358 @@
/***************************************************************************
Demo.cpp - description
-------------------
begin : Wed Aug 16 22:18:47 CEST 2003
copyright : (C) 2003 by upi
email : upi@apocalypse.rulez.org
***************************************************************************/
#include "FlyingChars.h"
#include "SDL.h"
#include "State.h"
#include "gfx.h"
#include "common.h"
#include "Backend.h"
#include "Demo.h"
Demo::Demo()
{
m_poFlyingChars = NULL;
m_bAdvanceGame = false;
}
Demo::~Demo()
{
delete m_poFlyingChars;
m_poFlyingChars = NULL;
}
int Demo::Advance( int a_iNumFrames, bool a_bFlip )
{
int iRetVal = 1;
if ( a_iNumFrames > 5 )
a_iNumFrames = 5;
if ( m_poBackground )
{
SDL_BlitSurface( m_poBackground, NULL, gamescreen, NULL );
}
if ( m_poFlyingChars )
{
iRetVal &= AdvanceFlyingChars( a_iNumFrames );
m_poFlyingChars->Draw();
}
if ( m_bAdvanceGame )
{
iRetVal &= AdvanceGame( a_iNumFrames );
//@ DRAW GAME?
}
if ( a_bFlip )
{
SDL_Flip( gamescreen );
}
return iRetVal;
}
int Demo::AdvanceFlyingChars( int a_iNumFrames )
{
m_poFlyingChars->Advance( a_iNumFrames );
return ( m_poFlyingChars->IsDone() ? 1 : 0 );
}
int Demo::AdvanceGame( int a_iNumFrames )
{
for ( int i=0; i<a_iNumFrames; ++i )
{
g_oBackend.AdvancePerl();
}
return 0;
}
int Demo::Run()
{
int thisTick, lastTick, firstTick, gameSpeed;
SDL_Event event;
gameSpeed = 12;
thisTick = SDL_GetTicks() / gameSpeed;
lastTick = thisTick - 1;
firstTick = SDL_GetTicks() / gameSpeed;
while ( 1 )
{
// 1. Wait for the next tick (on extremely fast machines..)
while (1)
{
thisTick = SDL_GetTicks() / gameSpeed;
if ( thisTick==lastTick )
{
SDL_Delay(1);
}
else
{
break;
}
}
// 2. Call ADVANCE.
int iRetVal = Advance(thisTick-lastTick, true);
lastTick = thisTick;
if ( iRetVal )
{
return 0;
}
// 3. Handle events.
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
g_oState.m_bQuitFlag = true;
break;
case SDL_KEYDOWN:
if ( event.key.keysym.sym == SDLK_ESCAPE )
{
OnMenu();
break;
}
for ( int i=0; i<2; ++i )
{
for ( int j=0; j<9; ++j )
{
if ( g_oState.m_aiPlayerKeys[i][j] == event.key.keysym.sym)
{
g_oState.m_enGameMode = SState::IN_MULTI;
}
}
}
break;
} // switch
} // while SDL_PollEvent
if ( g_oState.m_enGameMode != SState::IN_DEMO
|| g_oState.m_bQuitFlag )
{
return 1;
}
} // while 1;
}
void DoMenu( bool a_bDrawBackground );
void Demo::OnMenu()
{
::DoMenu( true );
}
class CreditsDemo: public Demo
{
public:
CreditsDemo()
{
m_poBackground = LoadBackground( "Credits.png", 240 );
SDL_UnlockSurface( m_poBackground );
DrawGradientText( "Credits", titleFont, 20, m_poBackground );
SDL_Flip( m_poBackground );
SDL_Rect oRect;
oRect.x = 110; oRect.w = gamescreen->w - 220;
oRect.y = 100; oRect.h = 350;
m_poFlyingChars = new FlyingChars( creditsFont, oRect );
m_poFlyingChars->AddText( "OPENMORTAL CREDITS\n\n\n"
"-- THE OPENMORTAL TEAM ARE --\n\n"
"CODING - UPi\n"
"MUSIC - Oedipus\n"
"GRAPHICS - UPi\n"
"\n-- CAST --\n\n"
"Boxer - Zoli\n"
"Cumi - As himself\n"
"Descant - As himself\n"
"Fureszes Orult - Ambrus\n"
"Grizli - As himself\n"
"Kinga - As herself\n"
"Macy - As herself\n"
"Misi - As himself\n"
"Rising-san - Surba\n"
"Sirpi - As himself\n"
"Taka Ito - Bence\n"
"Tokeletlen Katona - Dani\n"
"Watasiwa Baka Janajo - Ulmar\n"
"Black Dark Evil Mage - UPi\n"
"\n-- HOSTING --\n\n"
"sourceforge.net\n"
"apocalypse.rulez.org\n"
"freshmeat.net\n"
"\nOpenMortal is Copyright 2003 of the OpenMortal Team\n"
"Distributed under the GNU General Public Licence Version 2\n\n",
FlyingChars::FC_AlignCenter, true );
m_poFlyingChars->AddText( "Thanks to Midway for not harrassing us with legal stuff so far, "
"even though we must surely violate at least 50 of their patents, international "
"copyrights and registered trademarks.\n\n"
"OpenMortal needs your help! If you can contribute music, graphics, improved code, "
"additional characters, cash, beer, pizza or any other consumable, please mail us "
"at upi@apocalypse.rulez.org! The same address is currently accepting comments and "
"fanmail too (hint, hint!).\n\n",
FlyingChars::FC_AlignJustify, true );
m_poFlyingChars->AddText( "Be sure to check out other stuff from\n"
"Apocalypse Production\n"
"and\n"
"Degec Entertainment\n\n",
FlyingChars::FC_AlignCenter, true );
m_poFlyingChars->AddText( "\n\n\n\n\n\n:)", FlyingChars::FC_AlignRight, true );
}
};
class Story1Demo: public Demo
{
public:
Story1Demo()
{
m_poBackground = LoadBackground( "Story1.png", 240 );
SDL_UnlockSurface( m_poBackground );
SDL_Rect oRect;
oRect.x = 50; oRect.w = gamescreen->w - 100;
oRect.y = 50; oRect.h = gamescreen->h - 100;
m_poFlyingChars = new FlyingChars( storyFont, oRect, -1 );
m_poFlyingChars->AddText(
"We, the Gods of the Evil Killer Black Antipathic Dim (witted) Fire Mages "
"no longer tolerate the lack of evildoing.\n\n"
"We send them out on a "
"mission so diabolical, so evil that the world will never be the same "
"again!\n\n"
"We order our unworthy followers to "
"\nDESTROY THE SATURDAY\n"
"and plunge humanity into a dark age of 5 working days and 1 holiday "
"per week... FOREVER!\n\n\n\n\n\n\n\n\n",
FlyingChars::FC_AlignJustify, true );
}
};
class MainScreenDemo: public Demo
{
public:
MainScreenDemo()
{
m_iTimeLeft = 100;
m_poBackground = LoadBackground( "Mortal.png", 240 );
}
int Advance( int a_iNumFrames, bool a_bFlip )
{
m_iTimeLeft -= a_iNumFrames;
Demo::Advance( a_iNumFrames, true );
return ( m_iTimeLeft <= 0 ) ? 1 : 0;
}
protected:
int m_iTimeLeft;
};
void DoReplayDemo()
{
static int aiOrder[6] = {-1, -1, -1, -1, -1, -1};
static int iNext = 0;
if ( aiOrder[0]<0 )
{
// shuffle
int i, j, k;
for ( i=0; i<6; ++i ) aiOrder[i]=i;
for ( i=0; i<6; ++i )
{
j = rand() % 6;
k = aiOrder[i];
aiOrder[i] = aiOrder[j];
aiOrder[j] = k;
}
iNext = 0;
}
char acFilename[1024];
sprintf( acFilename, DATADIR "/demo%d.om", aiOrder[iNext] );
- DoGame( acFilename, true, false );
+// DoGame( acFilename, true, false );
iNext = ( iNext + 1 ) % 6;
}
void DoDemos()
{
#define DoDemos_BREAKONEND \
if ( g_oState.m_enGameMode != SState::IN_DEMO \
|| g_oState.m_bQuitFlag ) \
return;
while (1)
{
DoDemos_BREAKONEND;
{
MainScreenDemo oDemo;
oDemo.Run();
}
DoDemos_BREAKONEND;
DoReplayDemo();
DoDemos_BREAKONEND;
{
Story1Demo oDemo;
oDemo.Run();
}
DoDemos_BREAKONEND;
DoReplayDemo();
DoDemos_BREAKONEND;
{
FighterStatsDemo oDemo;
oDemo.Run();
}
DoDemos_BREAKONEND;
DoReplayDemo();
DoDemos_BREAKONEND;
{
CreditsDemo oDemo;
oDemo.Run();
}
DoDemos_BREAKONEND;
}
}
diff --git a/src/Game.cpp b/src/Game.cpp
index 8426cd0..4a932c3 100644
--- a/src/Game.cpp
+++ b/src/Game.cpp
@@ -1,766 +1,775 @@
/***************************************************************************
Game.cpp - description
-------------------
begin : Mon Sep 24 2001
copyright : (C) 2001 by upi
email : upi@apocalypse.rulez.org
***************************************************************************/
#include <string.h>
#include <stdio.h>
#include "SDL_image.h"
#include "sge_surface.h"
#include "sge_primitives.h"
#include "sge_bm_text.h"
#include "SDL_events.h"
#include "SDL_keysym.h"
#include <fstream>
#include "PlayerSelect.h"
#include "common.h"
#include "gfx.h"
#include "Backend.h"
#include "RlePack.h"
#include "State.h"
#include "Game.h"
#include "Audio.h"
#include <EXTERN.h>
#include <perl.h>
extern PerlInterpreter* my_perl;
/*
GAME PALETTE
From To Num Desc
---------------------------------------
0 .. 63 64 Background
64 .. 111 48 Doodads
112 .. 175 64 1st Fighter
176 .. 239 64 2nd Fighter
240 .. 255 16 basic colors
*/
#define MAXFRAMESKIP 5
struct SFpsCounter
{
int m_iLastCheck; // Last second then Tick() was called
int m_iFrames; // The number of frames in this second so far
int m_iFps; // The number of frames in the last second
void Reset()
{
m_iLastCheck = m_iFrames = m_iFps = 0;
}
void Tick()
{
int iSecond = SDL_GetTicks() / 1000;
if ( iSecond > m_iLastCheck )
{
m_iLastCheck = iSecond;
m_iFps = m_iFrames;
m_iFrames = 0;
fprintf( stderr, "%d ", m_iFps);
}
++m_iFrames;
}
} oFpsCounter;
/***************************************************************************
GAME PUBLIC METHODS
***************************************************************************/
Game::Game( bool a_bIsReplay, bool a_bDebug)
{
m_bIsReplay = a_bIsReplay;
m_bDebug = a_bDebug;
m_poBackground = LoadBackground( "level1.png", 64 );
m_poDoodads = LoadBackground( "Doodads.png", 48, 64 );
m_aiRoundsWonByPlayer[0] = m_aiRoundsWonByPlayer[1] = 0;
m_iNumberOfRounds = 0;
}
Game::~Game()
{
SDL_FreeSurface( m_poBackground );
m_poBackground = NULL;
SDL_FreeSurface( m_poDoodads );
m_poDoodads = NULL;
}
int Game::Run()
{
do
{
m_sReplayString.clear();
m_aReplayOffsets.clear();
DoOneRound();
if ( g_oState.m_bQuitFlag
|| SState::IN_DEMO == g_oState.m_enGameMode )
{
return -1;
}
} while ( m_aiRoundsWonByPlayer[0] < 2
&& m_aiRoundsWonByPlayer[1] < 2
&& m_iNumberOfRounds < 3 );
if ( m_aiRoundsWonByPlayer[1] > m_aiRoundsWonByPlayer[0] ) return 1;
if ( m_aiRoundsWonByPlayer[1] < m_aiRoundsWonByPlayer[0] ) return 0;
return -1;
}
std::string& Game::GetReplay()
{
return m_sReplayString;
}
/***************************************************************************
GAME DRAWING METHODS
***************************************************************************/
void Game::DrawHitPointDisplay()
{
int hp1 = g_oBackend.m_aoPlayers[0].m_iHitPoints;// * 100 / g_oState.m_iHitPoints;
int hp2 = g_oBackend.m_aoPlayers[1].m_iHitPoints;// * 100 / g_oState.m_iHitPoints;
SDL_Rect src, dst;
src.y = 154;
src.h = 20;
dst.y = 15;
// Player 1, green part.
dst.x = 40;
src.x = 0;
src.w = hp1*2;
SDL_BlitSurface( m_poDoodads, &src, gamescreen, &dst );
// Player 1, red part.
dst.x += hp1*2;
src.x = (100 + hp1)*2;
src.w = (100-hp1)*2;
SDL_BlitSurface( m_poDoodads, &src, gamescreen, &dst );
// Player 2, red part.
dst.x = 400;
src.x = 200;
src.w = (100-hp2)*2;
SDL_BlitSurface( m_poDoodads, &src, gamescreen, &dst );
// Player 2, green part.
dst.x = 400 + (100-hp2)*2;
src.x = (100-hp2)*2;
src.w = hp2*2;
SDL_BlitSurface( m_poDoodads, &src, gamescreen, &dst );
// "Won" icon for Player 1
src.x = 0; src.y = 276; src.w = 32; src.h = 32;
if ( m_aiRoundsWonByPlayer[0] > 0 )
{
dst.x = 4; dst.y = 11;
SDL_BlitSurface( m_poDoodads, &src, gamescreen, &dst );
}
if ( m_aiRoundsWonByPlayer[1] > 0 )
{
dst.x = 604; dst.y = 11;
SDL_BlitSurface( m_poDoodads, &src, gamescreen, &dst );
}
sge_BF_textout( gamescreen, fastFont, g_oPlayerSelect.GetFighterName(0),
230 - g_oPlayerSelect.GetFighterNameWidth(0), 38 );
sge_BF_textout( gamescreen, fastFont, g_oPlayerSelect.GetFighterName(1),
410, 38 );
}
void Game::DrawBackground()
{
sge_Blit( m_poBackground, gamescreen,
g_oBackend.m_iBgX, g_oBackend.m_iBgY,
0, 0, SCREENWIDTH, SCREENHEIGHT );
}
void Game::DrawPoly( const char* sName, int color )
{
AV *iList;
int n;
iList = get_av( sName, FALSE );
if ( iList == NULL )
{
return;
}
n = av_len( iList ) + 1;
if ( n< 2 )
{
return;
}
for ( int i=0; i<n; i += 2 )
{
int j = (i+2) % n;
int x1 = SvIV( *av_fetch( iList, i, false) );
int y1 = SvIV( *av_fetch( iList, i+1, false) );
int x2 = SvIV( *av_fetch( iList, j, false) );
int y2 = SvIV( *av_fetch( iList, j+1, false) );
sge_Line( gamescreen, x1, y1, x2, y2, color ) ;
}
}
void Game::DrawDoodads()
{
for ( int i=0; i<g_oBackend.m_iNumDoodads; ++i )
{
Backend::SDoodad& roDoodad = g_oBackend.m_aoDoodads[i];
if ( 0 == roDoodad.m_iType )
{
// Handle text doodads
const char *s = roDoodad.m_sText.c_str();
int iWidth = sge_BF_TextSize(fastFont, s).w;
int iDoodadX = roDoodad.m_iX - iWidth/2;
if ( iDoodadX + iWidth > 640 ) iDoodadX = 640 - iWidth;
if ( iDoodadX < 0 ) iDoodadX = 0;
int iDoodadY = roDoodad.m_iY;
sge_BF_textout( gamescreen, fastFont, s, iDoodadX, iDoodadY );
continue;
}
+
+ if ( roDoodad.m_iGfxOwner < 2 )
+ {
+ g_oPlayerSelect.GetPlayerInfo(roDoodad.m_iGfxOwner).m_poPack->Draw(
+ roDoodad.m_iFrame, roDoodad.m_iX, roDoodad.m_iY, roDoodad.m_iDir < 1 );
+ continue;
+ }
SDL_Rect rsrc, rdst;
rdst.x = roDoodad.m_iX;
rdst.y = roDoodad.m_iY;
rsrc.x = 64 * roDoodad.m_iFrame;
rsrc.y = 0;
rsrc.w = 64;
rsrc.h = 64;
SDL_BlitSurface( m_poDoodads, &rsrc, gamescreen, &rdst );
//debug( "Doodad x: %d, y: %d, t: %d, f: %d\n", dx, dy, dt, df );
}
}
void Game::Draw()
{
DrawBackground();
for ( int i=0; i<2; ++i )
{
int iFrame = g_oBackend.m_aoPlayers[i].m_iFrame;
if ( 0 != iFrame )
{
g_oPlayerSelect.GetPlayerInfo(i).m_poPack->Draw(
ABS(iFrame)-1,
g_oBackend.m_aoPlayers[i].m_iX,
g_oBackend.m_aoPlayers[i].m_iY,
iFrame<0 );
}
}
if ( m_bDebug )
{
DrawPoly( "p1head", C_LIGHTRED );
DrawPoly( "p1body", C_LIGHTGREEN );
DrawPoly( "p1legs", C_LIGHTBLUE );
DrawPoly( "p1hit", C_YELLOW );
DrawPoly( "p2head", C_LIGHTRED );
DrawPoly( "p2body", C_LIGHTGREEN );
DrawPoly( "p2legs", C_LIGHTBLUE );
DrawPoly( "p2hit", C_YELLOW );
}
DrawDoodads();
DrawHitPointDisplay();
if ( Ph_NORMAL == m_enGamePhase )
{
char s[100];
sprintf( s, "%d", g_oBackend.m_iGameTime );
DrawTextMSZ( s, inkFont, 320, 10, AlignHCenter, C_LIGHTCYAN, gamescreen );
}
else if ( Ph_START == m_enGamePhase )
{
char s[100];
sprintf( s, "Round %d", m_iNumberOfRounds+1 );
DrawTextMSZ( s, inkFont, 320, 200, AlignHCenter, C_WHITE, gamescreen );
}
else if ( Ph_REWIND == m_enGamePhase )
{
DrawTextMSZ( "REW", inkFont, 320, 10, AlignHCenter, C_WHITE, gamescreen );
+ sge_BF_textout( gamescreen, fastFont, "Press F1 to skip...", 230, 450 );
}
else if ( Ph_SLOWFORWARD == m_enGamePhase )
{
DrawTextMSZ( "REPLAY", inkFont, 320, 10, AlignHCenter, C_WHITE, gamescreen );
+ sge_BF_textout( gamescreen, fastFont, "Press F1 to skip...", 230, 450 );
}
else if ( Ph_REPLAY == m_enGamePhase )
{
DrawTextMSZ( "DEMO", inkFont, 320, 10, AlignHCenter, C_WHITE, gamescreen );
}
if ( oFpsCounter.m_iFps > 0 )
{
sge_BF_textoutf( gamescreen, fastFont, 2, 2, "%d fps", oFpsCounter.m_iFps );
}
SDL_Flip( gamescreen );
}
/***************************************************************************
GAME PROTECTED METHODS
***************************************************************************/
/**
This method reads and updates the game's variables. In replay mode,
this is done by parsing the replay string. Otherwise the perl
backend is advanced the given number of steps.
Whichever the case, the variables will be available in g_oBackend.
*/
void Game::Advance( int a_iNumFrames )
{
if ( m_bIsReplay )
{
// Replay mode...
m_iFrame += a_iNumFrames;
if ( m_iFrame >= ((int)m_aReplayOffsets.size())-1 ) m_iFrame = m_aReplayOffsets.size() - 2;
if ( m_iFrame <= 0 ) m_iFrame = 0;
std::string sFrameDesc = m_sReplayString.substr(
m_aReplayOffsets[m_iFrame],
m_aReplayOffsets[m_iFrame+1] - m_aReplayOffsets[m_iFrame] );
g_oBackend.ReadFromString( sFrameDesc );
return;
}
while ( a_iNumFrames > 0 )
{
-- a_iNumFrames;
std::string sFrameDesc;
g_oBackend.AdvancePerl();
g_oBackend.ReadFromPerl();
g_oBackend.PlaySounds();
g_oBackend.WriteToString( sFrameDesc );
m_sReplayString += sFrameDesc;
m_sReplayString += '\n';
m_aReplayOffsets.push_back( m_sReplayString.size() );
}
}
/** ProcessEvents reads events from the SDL event system.
Relevant key events are fed to the backend.
Esc brings up the menu.
Returns 1 on quit event (e.g. if the current game or replay should be aborted), 0 otherwise.
*/
int Game::ProcessEvents()
{
SDL_Event event;
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
g_oState.m_bQuitFlag = true;
return 1;
case SDL_KEYDOWN:
{
if ( event.key.keysym.sym == SDLK_ESCAPE )
{
SState::TGameMode enMode = g_oState.m_enGameMode;
::DoMenu( true );
return g_oState.m_enGameMode == enMode ? 0 : 1;
}
if ( event.key.keysym.sym == SDLK_F1 )
{
// shortcut: abort the current round. This shall is here
// to ease testing, and will be removed from the final
// version.
return 1;
}
if ( Ph_NORMAL != m_enGamePhase &&
Ph_REPLAY != m_enGamePhase )
break;
for (int i=0; i<2; i++)
{
for (int j=0; j<9; j++ )
{
if (g_oState.m_aiPlayerKeys[i][j] == event.key.keysym.sym)
{
if (g_oState.m_enGameMode == SState::IN_DEMO)
{
g_oState.m_enGameMode = SState::IN_MULTI;
return 1;
}
g_oBackend.PerlEvalF( "KeyDown(%d,%d);", i, j );
return 0;
}
}
}
break;
}
case SDL_KEYUP:
{
if ( Ph_NORMAL != m_enGamePhase )
break;
for (int i=0; i<2; i++)
{
for (int j=0; j<9; j++ )
{
if (g_oState.m_aiPlayerKeys[i][j] == event.key.keysym.sym)
{
g_oBackend.PerlEvalF( "KeyUp(%d,%d);", i, j );
return 0;
}
}
}
break;
}
} // End of switch
} // End of while SDL_PollEvent;
return 0;
}
void Game::HurryUp()
{
Audio->PlaySample( "aroooga.voc" );
DrawGradientText( "HURRY UP!", titleFont, 200, gamescreen );
SDL_Delay( 1000 );
Audio->PlaySample( "machine_start.voc" );
}
void Game::TimeUp()
{
DrawGradientText( "TIME IS UP!", titleFont, 200, gamescreen );
SDL_Delay( 1000 );
}
void Game::InstantReplay( int a_iKoAt )
{
int iCurrentFrame = m_aReplayOffsets.size() - 200;
int iThisTick, iLastTick, iGameSpeed;
m_enGamePhase = Ph_REWIND;
iGameSpeed = 8;
iThisTick = SDL_GetTicks() / iGameSpeed;
iLastTick = iThisTick - 1;
while ( iCurrentFrame < (int)m_aReplayOffsets.size() - 150 )
{
// 1. Wait for the next tick (on extremely fast machines..)
while (iThisTick == iLastTick)
{
iThisTick = SDL_GetTicks() / iGameSpeed;
if ( iThisTick==iLastTick ) SDL_Delay(1);
}
// 2. Advance as many ticks as necessary..
int iNumTicks = iThisTick - iLastTick;
if ( iNumTicks > 10 ) iNumTicks = 10;
if ( iNumTicks < 0 ) iNumTicks = 0;
iCurrentFrame += ( Ph_REWIND == m_enGamePhase ) ? -iNumTicks : +iNumTicks ;
if ( Ph_REWIND == m_enGamePhase
&& ( iCurrentFrame < a_iKoAt - 200 || iCurrentFrame <= 0 )
)
{
m_enGamePhase = Ph_SLOWFORWARD;
iGameSpeed = 16;
SDL_Delay(500);
}
iLastTick = iThisTick;
if ( iCurrentFrame < 0 ) iCurrentFrame = 0;
m_iFrame = iCurrentFrame;
if ( m_iFrame >= ((int)m_aReplayOffsets.size())-1 ) m_iFrame = m_aReplayOffsets.size() - 2;
if ( m_iFrame <= 0 ) m_iFrame = 0;
std::string sFrameDesc = m_sReplayString.substr(
m_aReplayOffsets[m_iFrame],
m_aReplayOffsets[m_iFrame+1] - m_aReplayOffsets[m_iFrame] );
//debug( "PB: Frame %d ofs %d-%d; data: '%s'\n", m_iFrame,
// m_aReplayOffsets[m_iFrame], m_aReplayOffsets[m_iFrame+1], sFrameDesc.c_str() );
g_oBackend.ReadFromString( sFrameDesc );
if ( ProcessEvents() )
{
break;
}
oFpsCounter.Tick();
// 3. Draw the next game screen..
Draw();
if ( g_oState.m_bQuitFlag
|| SState::IN_DEMO == g_oState.m_enGameMode )
{
break;
}
}
}
void Game::DoOneRound()
{
m_enGamePhase = Ph_START;
g_oBackend.PerlEvalF( "GameStart(%d,%d);", g_oState.m_iHitPoints, m_bDebug );
int iKoFrame = -1;
double dGameTime = 2 * 1000;
int iThisTick, iLastTick, iGameSpeed;
bool bHurryUp = false;
bool bReplayAfter = true;
iGameSpeed = 12;
iThisTick = SDL_GetTicks() / iGameSpeed;
iLastTick = iThisTick - 1;
oFpsCounter.Reset();
// 1. DO THE NORMAL GAME ROUND and HURRYUP
while ( dGameTime > 0 )
{
// 1. Wait for the next tick (on extremely fast machines..)
while (iThisTick == iLastTick)
{
iThisTick = SDL_GetTicks() / iGameSpeed;
if ( iThisTick==iLastTick ) SDL_Delay(1);
}
// 2. Advance as many ticks as necessary..
int iNumTicks = iThisTick - iLastTick;
if ( iNumTicks > MAXFRAMESKIP ) iNumTicks = MAXFRAMESKIP;
Advance( iNumTicks );
dGameTime -= iNumTicks * iGameSpeed;
if ( Ph_START == m_enGamePhase )
{
if ( dGameTime < 0 )
{
m_enGamePhase = Ph_NORMAL;
dGameTime = g_oState.m_iGameTime * 1000;
}
}
else if ( Ph_NORMAL == m_enGamePhase )
{
if ( dGameTime < 10 * 1000
&& !bHurryUp )
{
bHurryUp = true;
HurryUp();
iGameSpeed = iGameSpeed * 3 / 4;
}
if ( g_oBackend.m_bKO )
{
m_enGamePhase = Ph_KO;
dGameTime = 10 * 1000;
iKoFrame = m_aReplayOffsets.size();
}
else if ( dGameTime < 0 )
{
m_enGamePhase = Ph_TIMEUP;
TimeUp();
break;
}
}
g_oBackend.m_iGameTime = (int) ((dGameTime + 500.0) / 1000.0);
iLastTick = iThisTick;
if ( ProcessEvents() || g_oState.m_bQuitFlag )
{
bReplayAfter = false;
break;
}
oFpsCounter.Tick();
// 3. Draw the next game screen..
Draw();
if ( g_oBackend.m_iGameOver )
{
break;
}
}
// 3. DO THE REPLAY (IF THERE WAS A KO)
if ( iKoFrame>0 && bReplayAfter )
{
InstantReplay( iKoFrame );
}
// 4. END OF ROUND
int p1h = g_oBackend.m_aoPlayers[0].m_iHitPoints;
int p2h = g_oBackend.m_aoPlayers[1].m_iHitPoints;
debug( "Game over; p1h = %d; p2h = %d\n", p1h, p2h );
if ( p1h > p2h ) ++m_aiRoundsWonByPlayer[0];
if ( p2h > p1h ) ++m_aiRoundsWonByPlayer[1];
++m_iNumberOfRounds;
}
void Game::DoReplay( const char* a_pcReplayFile )
{
std::ifstream oInput( a_pcReplayFile );
int iPlayer1, iPlayer2;
oInput >> iPlayer1 >> iPlayer2;
std::string sLine;
std::getline( oInput, sLine );
g_oPlayerSelect.SetPlayer( 0, (FighterEnum) iPlayer1 );
g_oPlayerSelect.SetPlayer( 1, (FighterEnum) iPlayer2 );
int iThisTick, iLastTick, iGameSpeed;
m_enGamePhase = Ph_REPLAY;
iGameSpeed = 12;
iThisTick = SDL_GetTicks() / iGameSpeed;
iLastTick = iThisTick - 1;
while ( !oInput.eof() )
{
// 1. Wait for the next tick (on extremely fast machines..)
while (iThisTick == iLastTick)
{
iThisTick = SDL_GetTicks() / iGameSpeed;
if ( iThisTick==iLastTick ) SDL_Delay(1);
}
// 2. Advance as many ticks as necessary..
int iNumTicks = iThisTick - iLastTick;
if ( iNumTicks > 5 ) iNumTicks = 5;
for ( int i=0; i< iNumTicks; ++i )
{
std::getline( oInput, sLine );
}
if ( 0 == sLine.size() )
{
break;
}
iLastTick = iThisTick;
g_oBackend.ReadFromString( sLine );
if ( ProcessEvents() )
{
break;
}
oFpsCounter.Tick();
// 3. Draw the next game screen..
Draw();
if ( g_oState.m_bQuitFlag )
{
break;
}
}
}
int DoGame( char* a_pcReplayFile, bool a_bIsReplay, bool a_bDebug )
{
Game oGame( a_bIsReplay, a_bDebug );
if ( a_bIsReplay )
{
if ( NULL == a_pcReplayFile )
{
return 0;
}
oGame.DoReplay( a_pcReplayFile );
return 0;
}
else
{
int iRetval = oGame.Run();
if ( NULL != a_pcReplayFile )
{
std::ofstream oOutput( a_pcReplayFile );
oOutput <<
g_oPlayerSelect.GetPlayerInfo(0).m_enFighter << ' ' <<
g_oPlayerSelect.GetPlayerInfo(1).m_enFighter << '\n' << oGame.GetReplay();
}
return iRetval;
}
}
diff --git a/src/PlayerSelect.cpp b/src/PlayerSelect.cpp
index a613d58..9457067 100644
--- a/src/PlayerSelect.cpp
+++ b/src/PlayerSelect.cpp
@@ -1,494 +1,502 @@
/***************************************************************************
PlayerSelect.cpp - description
-------------------
begin : Sun Dec 8 2002
copyright : (C) 2002 by upi
email : upi@apocalypse.rulez.org
***************************************************************************/
#include <stdio.h>
#include "PlayerSelect.h"
#include "SDL.h"
#include "SDL_video.h"
#include "SDL_image.h"
#include "sge_primitives.h"
#include "common.h"
#include "Audio.h"
#include "sge_bm_text.h"
#include "gfx.h"
#include "RlePack.h"
#include "Backend.h"
#include "State.h"
#define CHOOSERLEFT 158
#define CHOOSERTOP 98
#define CHOOSERHEIGHT 80
#define CHOOSERWIDTH 80
#define CHOOSERROWS 4
#define CHOOSERCOLS 4
#ifndef NULL
#define NULL 0
#endif
/***************************************************************************
PUBLIC EXPORTED VARIABLES
***************************************************************************/
PlayerSelect g_oPlayerSelect;
/***************************************************************************
PRIVATE VARIABLES (perl variable space)
***************************************************************************/
/*
int p1 = 0;
int p2 = 3;
bool done1 = false;
bool done2 = false;
*/
FighterEnum ChooserCells[CHOOSERROWS][CHOOSERCOLS] = {
{ ZOLI, UPI, CUMI, SIRPI },
{ ULMAR, MACI, BENCE, GRIZLI },
{ AMBRUS, DESCANT, SURBA, DANI },
{ UNKNOWN, KINGA, MISI, UNKNOWN },
};
PlayerSelect::PlayerSelect()
{
for ( int i=0; i<2; ++i )
{
m_aoPlayers[i].m_enFighter = UNKNOWN;
m_aoPlayers[i].m_enTint = NO_TINT;
m_aoPlayers[i].m_poPack = NULL;
}
m_iP1 = 0;
m_iP2 = CHOOSERCOLS-1;
}
const PlayerInfo& PlayerSelect::GetPlayerInfo( int a_iPlayer )
{
return m_aoPlayers[ a_iPlayer ? 1 : 0 ];
}
const char* PlayerSelect::GetFighterName( int a_iPlayer )
{
return m_aoPlayers[ a_iPlayer ? 1 : 0 ].m_sFighterName.c_str();
}
int PlayerSelect::GetFighterNameWidth( int a_iPlayer )
{
return m_aiFighterNameWidth[ a_iPlayer ? 1 : 0 ];
}
bool PlayerSelect::IsFighterAvailable( FighterEnum a_enFighter )
{
+ /*
static bool g_abFighterAvailable[ LASTFIGHTER ] =
{
false,
true, true, true, true,
true, true, true, true,
true, false, false, false,
false, false
};
+ */
if ( a_enFighter < UNKNOWN
|| a_enFighter >= LASTFIGHTER )
{
return false;
}
- return g_abFighterAvailable[ a_enFighter ];
+ g_oBackend.PerlEvalF("GetFighterStats(%d);", a_enFighter);
+ const char* pcDatafile = g_oBackend.GetPerlString("Datafile");
+ return ( pcDatafile && *pcDatafile );
}
/** LoadFighter simply looks up the filename associated with the given
fighter, loads it, and returns the RlePack.
\return The freshly loaded RlePack, or NULL if it could not be loaded.
*/
RlePack* PlayerSelect::LoadFighter( FighterEnum m_enFighter ) // static
{
char a_pcFilename[FILENAME_MAX+1];
const char* s;
+ /*
switch (m_enFighter)
{
case ZOLI: s = "ZOLIDATA.DAT"; break;
case UPI: s = "UPIDATA.DAT"; break;
case ULMAR: s = "ULMARDATA.DAT"; break;
case CUMI: s = "CUMIDATA.DAT"; break;
case SIRPI: s = "SIRPIDATA.DAT"; break;
case MACI: s = "MACIDATA.DAT"; break;
case BENCE: s = "BENCEDATA.DAT"; break;
case DESCANT: s = "DESCANTDATA.DAT"; break;
case GRIZLI: s = "GRIZLIDATA.DAT"; break;
default: return NULL; break;
}
+ */
+ g_oBackend.PerlEvalF( "GetFighterStats(%d);", m_enFighter );
+ s = g_oBackend.GetPerlString( "Datafile" );
strcpy( a_pcFilename, DATADIR );
strcat( a_pcFilename, "/characters/" );
strcat( a_pcFilename, s );
RlePack* pack = new RlePack( a_pcFilename, COLORSPERPLAYER );
if ( pack->Count() <= 0 )
{
debug( "Couldn't load RlePack: '%s'\n", a_pcFilename );
delete pack;
return NULL;
}
return pack;
}
/** SetPlayer loads the given fighter for the given player.
The RlePack is loaded first. If that succeeds, then the perl backend is
set too. The tint and palette of both players are set. */
void PlayerSelect::SetPlayer( int a_iPlayer, FighterEnum a_enFighter )
{
if ( a_iPlayer ) a_iPlayer = 1; // It's 0 or 1.
if ( m_aoPlayers[a_iPlayer].m_enFighter == a_enFighter )
{
return;
}
int iOffset = a_iPlayer ? COLOROFFSETPLAYER2 : COLOROFFSETPLAYER1;
RlePack* poPack = LoadFighter( a_enFighter );
poPack->OffsetSprites( iOffset );
if ( NULL == poPack )
{
debug( "SetPlayer(%d,%d): Couldn't load RlePack\n", a_iPlayer, a_enFighter );
return;
}
delete m_aoPlayers[a_iPlayer].m_poPack;
m_aoPlayers[a_iPlayer].m_poPack = poPack;
m_aoPlayers[a_iPlayer].m_enFighter = a_enFighter;
g_oBackend.PerlEvalF( "SetPlayerNumber(%d,%d);", a_iPlayer, a_enFighter );
m_aoPlayers[a_iPlayer].m_sFighterName = g_oBackend.GetPerlString( "PlayerName" );
m_aiFighterNameWidth[a_iPlayer] = sge_BF_TextSize( fastFont, GetFighterName(a_iPlayer) ).w;
TintEnum enTint = NO_TINT;
if ( m_aoPlayers[0].m_enFighter == m_aoPlayers[1].m_enFighter )
{
enTint = TintEnum( (rand() % 4) + 1 );
}
SetTint( 1, enTint );
m_aoPlayers[a_iPlayer].m_poPack->ApplyPalette();
}
void PlayerSelect::SetTint( int a_iPlayer, TintEnum a_enTint )
{
m_aoPlayers[a_iPlayer].m_enTint = a_enTint;
if ( m_aoPlayers[a_iPlayer].m_poPack )
{
m_aoPlayers[a_iPlayer].m_poPack->SetTint( a_enTint );
m_aoPlayers[a_iPlayer].m_poPack->ApplyPalette();
}
}
void PlayerSelect::HandleKey( int a_iPlayer, int a_iKey )
{
int& riP = a_iPlayer ? m_iP2 : m_iP1;
int iOldP = riP;
bool& rbDone = a_iPlayer ? m_bDone2 : m_bDone1;
if ( rbDone )
{
return;
}
switch ( a_iKey )
{
case 0: // up
if ( riP >= CHOOSERCOLS ) riP -= CHOOSERCOLS;
break;
case 1: // down
if ( (riP/CHOOSERCOLS) < (CHOOSERROWS-1) ) riP += CHOOSERCOLS;
break;
case 2: // left
if ( (riP % CHOOSERCOLS) > 0 ) riP--;
break;
case 3: // right
if ( (riP % CHOOSERCOLS) < (CHOOSERCOLS-1) ) riP++;
break;
default:
if ( ChooserCells[riP/4][riP%4] )
{
rbDone = true;
g_oBackend.PerlEvalF( "PlayerSelected(%d);", a_iPlayer );
Audio->PlaySample("magic.voc");
return;
}
}
if ( !IsFighterAvailable( ChooserCells[riP/CHOOSERCOLS][riP%CHOOSERCOLS] ) )
{
riP = iOldP;
}
if ( iOldP != riP )
{
Audio->PlaySample("strange_quack.voc");
SetPlayer( a_iPlayer, ChooserCells[riP/CHOOSERCOLS][riP%CHOOSERCOLS] );
}
}
void PlayerSelect::DrawRect( int a_iPos, int a_iColor )
{
int iRow = a_iPos / CHOOSERCOLS;
int iCol = a_iPos % CHOOSERCOLS;
SDL_Rect r, r1;
r.x = CHOOSERLEFT + iCol * CHOOSERWIDTH;
r.y = CHOOSERTOP + iRow * CHOOSERHEIGHT;
r.w = CHOOSERWIDTH + 5;
r.h = 5;
r1 = r;
SDL_FillRect( gamescreen, &r1, a_iColor );
r.y += CHOOSERHEIGHT;
r1 = r;
SDL_FillRect( gamescreen, &r1, a_iColor );
r.y -= CHOOSERHEIGHT;
r.w = 5;
r.h = CHOOSERHEIGHT + 5;
r1 = r;
SDL_FillRect( gamescreen, &r1, a_iColor );
r.x += CHOOSERWIDTH;
r1 = r;
SDL_FillRect( gamescreen, &r1, a_iColor );
}
void PlayerSelect::CheckPlayer( SDL_Surface* a_poBackground, int a_iRow, int a_iCol )
{
int x1, y1;
x1 = CHOOSERLEFT + a_iCol * CHOOSERWIDTH +5;
y1 = CHOOSERTOP + a_iRow * CHOOSERHEIGHT +5;
sge_Line(a_poBackground, x1+5, y1+5, x1 + CHOOSERWIDTH-10, y1 + CHOOSERHEIGHT-10, 252);
sge_Line(a_poBackground, x1 + CHOOSERWIDTH-10, y1+5, x1+5, y1 + CHOOSERHEIGHT-10, 252);
x1++;
sge_Line(a_poBackground, x1+5, y1+5, x1 + CHOOSERWIDTH-10, y1 + CHOOSERHEIGHT-10, 252);
sge_Line(a_poBackground, x1 + CHOOSERWIDTH-10, y1+5, x1+5, y1 + CHOOSERHEIGHT-10, 252);
y1++;
sge_Line(a_poBackground, x1+5, y1+5, x1 + CHOOSERWIDTH-10, y1 + CHOOSERHEIGHT-10, 252);
sge_Line(a_poBackground, x1 + CHOOSERWIDTH-10, y1+5, x1+5, y1 + CHOOSERHEIGHT-10, 252);
x1--;
sge_Line(a_poBackground, x1+5, y1+5, x1 + CHOOSERWIDTH-10, y1 + CHOOSERHEIGHT-10, 252);
sge_Line(a_poBackground, x1 + CHOOSERWIDTH-10, y1+5, x1+5, y1 + CHOOSERHEIGHT-10, 252);
}
void PlayerSelect::DoPlayerSelect()
{
// 1. Set up: Load background, mark unavailable fighters
SDL_FillRect( gamescreen, NULL, C_BLACK );
SDL_Flip( gamescreen );
SDL_Surface* poBackground = LoadBackground( "PlayerSelect.png", 111 );
DrawGradientText( "Choose A Fighter Dammit", titleFont, 10, poBackground );
int i, j;
for ( i=0; i<CHOOSERROWS; ++i )
{
for ( int j=0; j<CHOOSERCOLS; ++j )
{
if ( !IsFighterAvailable(ChooserCells[i][j]) &&
UNKNOWN != ChooserCells[i][j] )
{
CheckPlayer( poBackground, i, j );
}
}
}
for ( i=0; i<2; ++i )
{
if ( m_aoPlayers[i].m_poPack ) m_aoPlayers[i].m_poPack->ApplyPalette();
}
SetPlayer( 0, ChooserCells[m_iP1/CHOOSERCOLS][m_iP1%CHOOSERCOLS] );
SetPlayer( 1, ChooserCells[m_iP2/CHOOSERCOLS][m_iP2%CHOOSERCOLS] );
// 2. Run selection screen
g_oBackend.PerlEvalF( "SelectStart();" );
m_bDone1 = m_bDone2 = false;
int thisTick, lastTick, gameSpeed;
gameSpeed = 12 ;
thisTick = SDL_GetTicks() / gameSpeed;
lastTick = thisTick - 1;
i = 0;
int over = 0;
int iCourtain = 0;
int iCourtainSpeed = 0;
int iCourtainTime = 80;
SDL_Event event;
while (1)
{
// 1. Wait for the next tick (on extremely fast machines..)
while (1)
{
thisTick = SDL_GetTicks() / gameSpeed;
if ( thisTick==lastTick )
{
SDL_Delay(1);
}
else
{
break;
}
}
// 2. Advance as many ticks as necessary..
if ( iCourtainTime > 0 )
{
int iAdvance = thisTick - lastTick;
if ( iAdvance > 5 ) iAdvance = 5;
if ( iCourtain + iCourtainSpeed * iCourtainTime /2 < 320 * 4 )
iCourtainSpeed += iAdvance;
else
iCourtainSpeed -= iAdvance;
iCourtain += iCourtainSpeed * iAdvance;
iCourtainTime -= iAdvance;
if ( iCourtainTime > 0 )
{
SDL_Rect oRect;
oRect.x = 320 - iCourtain/4; oRect.y = 0;
oRect.w = iCourtain / 2; oRect.h = gamescreen->h;
if ( oRect.x < 0 ) oRect.x = 0;
if ( oRect.w > gamescreen->w ) oRect.w = gamescreen->w;
SDL_SetClipRect( gamescreen, &oRect );
}
else
{
SDL_SetClipRect( gamescreen, NULL );
}
}
int iNumFrames = thisTick - lastTick;
if ( iNumFrames>5 ) iNumFrames = 5;
for ( i=0; i<iNumFrames; ++i )
{
g_oBackend.AdvancePerl();
}
lastTick = thisTick;
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
g_oState.m_bQuitFlag = true;
break;
case SDL_KEYDOWN:
{
if ( event.key.keysym.sym == SDLK_ESCAPE )
{
DoMenu( false );
break;
}
for ( i=0; i<2; i++ )
{
for ( j=0; j<9; j++ )
{
if (g_oState.m_aiPlayerKeys[i][j] == event.key.keysym.sym)
{
DrawRect( m_iP1, 240 );
DrawRect( m_iP2, 240 );
HandleKey( i, j );
}
}
}
}
break;
} // switch statement
} // Polling events
g_oBackend.ReadFromPerl();
over = g_oBackend.m_iGameOver;
SDL_BlitSurface( poBackground, NULL, gamescreen, NULL );
for ( i=0; i<2; ++i )
{
if ( g_oBackend.m_aoPlayers[i].m_iFrame )
{
m_aoPlayers[i].m_poPack->Draw(
ABS(g_oBackend.m_aoPlayers[i].m_iFrame)-1,
g_oBackend.m_aoPlayers[i].m_iX, g_oBackend.m_aoPlayers[i].m_iY,
g_oBackend.m_aoPlayers[i].m_iFrame < 0 );
}
int x = ( CHOOSERLEFT - m_aiFighterNameWidth[i] ) / 2;
if ( x<10 ) x = 10;
if ( i ) x = gamescreen->w - x - m_aiFighterNameWidth[i];
sge_BF_textout( gamescreen, fastFont, GetFighterName(i),
x, gamescreen->h - 30 );
}
if ( !m_bDone1) DrawRect( m_iP1, 250 );
if ( !m_bDone2) DrawRect( m_iP2, 253 );
SDL_Flip( gamescreen );
if (over || g_oState.m_bQuitFlag || SState::IN_DEMO == g_oState.m_enGameMode) break;
}
SDL_FreeSurface( poBackground );
SDL_SetClipRect( gamescreen, NULL );
return;
}

File Metadata

Mime Type
text/x-diff
Expires
Wed, Feb 4, 2:14 PM (2 h, 26 s ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
55645
Default Alt Text
(326 KB)

Event Timeline