diff --git a/source/core/states.h b/source/core/states.h index f7bb4ba925..e848b393e2 100644 --- a/source/core/states.h +++ b/source/core/states.h @@ -58,12 +58,21 @@ struct FSpriteDef uint8_t numframes; uint16_t spriteframes; - FTextureID GetSpriteFrame(int frame, int rot, DAngle ang, bool* mirror, bool flipagain = false); + //FTextureID GetSpriteFrame(int frame, int rot, DAngle ang, bool* mirror, bool flipagain = false); + FTextureID GetSpriteFrame(unsigned frame); }; extern TArray SpriteFrames; extern TArray SpriteDefs; +inline FTextureID FSpriteDef::GetSpriteFrame(unsigned frame) +{ + if (frame >= numframes) return FNullTextureID(); + auto f = &SpriteFrames[spriteframes + frame]; + return f->Texture[0]; +} + + enum EStateDefineFlags { SDF_NEXT = 0, diff --git a/source/games/sw/src/conpic.h b/source/games/sw/src/conpic.h index 6d67a0c6e2..43967eace0 100644 --- a/source/games/sw/src/conpic.h +++ b/source/games/sw/src/conpic.h @@ -57,20 +57,14 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms #define FIST_SWING2 4073 -#define BLOODYFIST_REST 4074 -#define BLOODYFIST_SWING0 4075 -#define BLOODYFIST_SWING1 4076 -#define BLOODYFIST_SWING2 4077 +#define BLOODYFIST_REST 4077 +#define BLOODYFIST_SWING0 4074 +#define BLOODYFIST_SWING1 4075 +#define BLOODYFIST_SWING2 4076 #define FIST2_REST 4050 -#define FIST2_SWING0 4051 -#define FIST2_SWING1 4052 -#define FIST2_SWING2 4053 - -#define BLOODYFIST2_REST 4054 -#define BLOODYFIST2_SWING0 4055 -#define BLOODYFIST2_SWING1 4056 -#define BLOODYFIST2_SWING2 4057 +#define BLOODYFIST2_REST 4051 + #define FIST2_SWING_ALT 4058 #define FIST3_REST 4060 @@ -155,6 +149,11 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms #define SHOTGUN_RELOAD1 2211 #define SHOTGUN_RELOAD2 2212 +#define SHOTGUN2_REST 2227 +#define SHOTGUN2_RELOAD0 2227 +#define SHOTGUN2_RELOAD1 2226 +#define SHOTGUN2_RELOAD2 2225 + #define SHOTGUN_SHELL0 2180 #define SHOTGUN_SHELL1 2181 #define SHOTGUN_SHELL2 2182 @@ -286,3 +285,4 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms + diff --git a/source/games/sw/src/namelist.h b/source/games/sw/src/namelist.h index 69ea3a7dbb..efbd55bb3b 100644 --- a/source/games/sw/src/namelist.h +++ b/source/games/sw/src/namelist.h @@ -735,3 +735,21 @@ x(NINJA_DEAD, 4226) x(NINJA_HARAKIRI_DEAD, 4218) x(NINJA_DEAD1, 4226) x(PLAYER_NINJA_DEAD, 1160) + +x(UZI_COPEN, 2040) +x(UZI_CCLOSED, 2041) +x(UZI_CLIT, 2042) +x(UZI_CRELOAD, 2043) +x(SHOTGUN_AUTO, 2078) +x(HEAD_MODE1, 2055) +x(HEAD_MODE2, 2056) +x(HEAD_MODE3, 2057) +x(MICRO_SIGHT, 2075) +x(MICRO_SHOT_20, 2076) +x(MICRO_SHOT_1, 2077) +x(MICRO_HEAT0, 2084) +x(MICRO_HEAT1, 2085) +x(MICRO_HEAT2, 2086) +x(MICRO_HEAT3, 2087) +x(MICRO_HEAT4, 2088) +x(MICRO_HEAT5, 2089) diff --git a/source/games/sw/src/panel.cpp b/source/games/sw/src/panel.cpp index cf7c3a93f2..1c0b4b7337 100644 --- a/source/games/sw/src/panel.cpp +++ b/source/games/sw/src/panel.cpp @@ -99,9 +99,15 @@ int NullAnimator(DSWActor*) return 0; } +inline FGameTexture* GetSpriteTexture(int spr, int frame = 0) +{ + auto texid = SpriteDefs[spr].GetSpriteFrame(0); + return TexMan.GetGameTexture(texid); +} + inline int pspheight(PANEL_SPRITE* psp) { - auto tex = tileGetTexture(psp->picndx); + auto tex = GetSpriteTexture(psp->spritendx); return (int)tex->GetDisplayHeight(); } @@ -876,8 +882,8 @@ void SpawnSwordBlur(PANEL_SPRITE* psp) nsp->kill_tics = 9; nsp->shade = psp->shade + 10; - nsp->picndx = -1; - nsp->picnum = psp->picndx; + nsp->spritendx = SPR_NULL; + nsp->spritenum = psp->spritendx; if ((psp->State->flags & psf_Xflip)) nsp->flags |= (PANF_XFLIP); @@ -979,7 +985,7 @@ void SpecialUziRetractFunc(PANEL_SPRITE* psp) psp->backupy(); psp->pos.Y += 4 * synctics; - auto tex = tileGetTexture(psp->picnum); + auto tex = tileGetTexture(psp->spritenum); if (psp->pos.Y >= 200 + (int)tex->GetDisplayHeight()) { pKillSprite(psp); @@ -1019,7 +1025,7 @@ void RetractCurWpn(PLAYER* pp) if (cur->sibling && cur->sibling == pp->CurWpn) { // special case for uzi reload pieces - cur->picnum = cur->picndx; + cur->spritenum = cur->spritendx; cur->State = nullptr; cur->PanelSpriteFunc = SpecialUziRetractFunc; cur->sibling = nullptr; @@ -1881,13 +1887,13 @@ void pUziOverlays(PANEL_SPRITE* psp, short mode) switch (mode) { case 0: // At rest - psp->over[0].pic = UZI_COPEN; + psp->over[0].pic = TexMan.CheckForTexture("UZI_COPEN", ETextureType::Any); break; case 1: // Firing - psp->over[0].pic = UZI_CLIT; + psp->over[0].pic = TexMan.CheckForTexture("UZI_CLIT", ETextureType::Any); break; case 2: // Reloading - psp->over[0].pic = UZI_CRELOAD; + psp->over[0].pic = TexMan.CheckForTexture("UZI_CRELOAD", ETextureType::Any); psp->over[0].xoff = UZI_CHAMBERRELOAD_XOFF; psp->over[0].yoff = UZI_CHAMBERRELOAD_YOFF; break; @@ -3144,11 +3150,11 @@ bool pShotgunOverlays(PANEL_SPRITE* psp) switch (psp->PlayerP->WpnShotgunType) { case 0: - psp->over[SHOTGUN_AUTO_NUM].pic = -1; + psp->over[SHOTGUN_AUTO_NUM].pic = FNullTextureID(); psp->over[SHOTGUN_AUTO_NUM].flags |= (psf_ShadeNone); return false; case 1: - psp->over[SHOTGUN_AUTO_NUM].pic = SPR_SHOTGUN_AUTO; + psp->over[SHOTGUN_AUTO_NUM].pic = TexMan.CheckForTexture("SHOTGUN_AUTO", ETextureType::Any); psp->over[SHOTGUN_AUTO_NUM].flags |= (psf_ShadeNone); return false; } @@ -3951,13 +3957,13 @@ void pHotHeadOverlays(PANEL_SPRITE* psp, short mode) switch (mode) { case 0: // Great balls o' fire - psp->over[0].pic = HEAD_MODE1; + psp->over[0].pic = TexMan.CheckForTexture("HEAD_MODE1", ETextureType::Any); break; case 1: // Ring of fire - psp->over[0].pic = HEAD_MODE2; + psp->over[0].pic = TexMan.CheckForTexture("HEAD_MODE2", ETextureType::Any); break; case 2: // I love the smell of napalm in the morning - psp->over[0].pic = HEAD_MODE3; + psp->over[0].pic = TexMan.CheckForTexture("HEAD_MODE3", ETextureType::Any); break; } } @@ -4109,7 +4115,7 @@ void pHotheadBobSetup(PANEL_SPRITE* psp) void pHotheadHide(PANEL_SPRITE* psp) { - auto tex = tileGetTexture(psp->picndx); + auto tex = GetSpriteTexture(psp->spritendx, 0); psp->backupx(); psp->pos.X += 3 * synctics; @@ -4283,7 +4289,7 @@ void SpawnOnFire(PLAYER* pp) { fire = pSpawnSprite(pp, &ps_OnFire[RANDOM_P2(8<<8)>>8], PRI_FRONT, x, ON_FIRE_Y_BOT); fire->flags |= PANF_WEAPON_SPRITE; - auto tex = tileGetTexture(fire->picndx); + auto tex = GetSpriteTexture(fire->spritendx, 0); x += (int)tex->GetDisplayWidth(); } } @@ -4666,36 +4672,38 @@ bool pMicroOverlays(PANEL_SPRITE* psp) switch (psp->PlayerP->WpnRocketType) { case 0: - psp->over[MICRO_SIGHT_NUM].pic = MICRO_SIGHT; - psp->over[MICRO_SHOT_NUM].pic = MICRO_SHOT_1; + psp->over[MICRO_SIGHT_NUM].pic = TexMan.CheckForTexture("MICRO_SIGHT", ETextureType::Any); + psp->over[MICRO_SHOT_NUM].pic = TexMan.CheckForTexture("MICRO_SHOT_1", ETextureType::Any); psp->over[MICRO_SHOT_NUM].flags |= (psf_ShadeNone); - psp->over[MICRO_HEAT_NUM].pic = -1; + psp->over[MICRO_HEAT_NUM].pic = FNullTextureID(); return false; case 1: if (psp->PlayerP->WpnRocketHeat) { - psp->over[MICRO_SIGHT_NUM].pic = MICRO_SIGHT; - psp->over[MICRO_SHOT_NUM].pic = MICRO_SHOT_1; + psp->over[MICRO_SIGHT_NUM].pic = TexMan.CheckForTexture("MICRO_SIGHT", ETextureType::Any); + psp->over[MICRO_SHOT_NUM].pic = TexMan.CheckForTexture("MICRO_SHOT_1", ETextureType::Any); psp->over[MICRO_SHOT_NUM].flags |= (psf_ShadeNone); - ASSERT(psp->PlayerP->WpnRocketHeat < 6); - - psp->over[MICRO_HEAT_NUM].pic = MICRO_HEAT + (5 - psp->PlayerP->WpnRocketHeat); + if (psp->PlayerP->WpnRocketHeat < 6) + { + static const char* heats[] = { "MICRO_HEAT0", "MICRO_HEAT1", "MICRO_HEAT2", "MICRO_HEAT3", "MICRO_HEAT4", "MICRO_HEAT5" }; + psp->over[MICRO_HEAT_NUM].pic = TexMan.CheckForTexture(heats[5 - psp->PlayerP->WpnRocketHeat], ETextureType::Any); + } } else { - psp->over[MICRO_SIGHT_NUM].pic = MICRO_SIGHT; - psp->over[MICRO_SHOT_NUM].pic = MICRO_SHOT_1; + psp->over[MICRO_SIGHT_NUM].pic = TexMan.CheckForTexture("MICRO_SIGHT", ETextureType::Any); + psp->over[MICRO_SHOT_NUM].pic = TexMan.CheckForTexture("MICRO_SHOT_1", ETextureType::Any); psp->over[MICRO_SHOT_NUM].flags |= (psf_ShadeNone); - psp->over[MICRO_HEAT_NUM].pic = -1; + psp->over[MICRO_HEAT_NUM].pic = FNullTextureID(); } return false; case 2: - psp->over[MICRO_SIGHT_NUM].pic = -1; - psp->over[MICRO_HEAT_NUM].pic = -1; + psp->over[MICRO_SIGHT_NUM].pic = FNullTextureID(); + psp->over[MICRO_HEAT_NUM].pic = FNullTextureID(); - psp->over[MICRO_SHOT_NUM].pic = MICRO_SHOT_20; + psp->over[MICRO_SHOT_NUM].pic = TexMan.CheckForTexture("MICRO_SHOT_20", ETextureType::Any); psp->over[MICRO_SHOT_NUM].flags |= (psf_ShadeNone); psp->over[MICRO_HEAT_NUM].flags |= (psf_ShadeNone); return true; @@ -6453,8 +6461,8 @@ void SpawnFistBlur(PANEL_SPRITE* psp) nsp->kill_tics = 9; nsp->shade = psp->shade + 10; - nsp->picndx = -1; - nsp->picnum = psp->picndx; + nsp->spritendx = SPR_NULL; + nsp->spritenum = psp->spritendx; if ((psp->State->flags & psf_Xflip)) nsp->flags |= (PANF_XFLIP); @@ -7240,9 +7248,9 @@ PANEL_SPRITE* pSpawnSprite(PLAYER* pp, PANEL_STATE* state, uint8_t priority, dou psp->opos.Y = psp->pos.Y = y; pSetState(psp, state); if (state == nullptr) - psp->picndx = -1; + psp->spritendx = SPR_NULL; else - psp->picndx = state->picndx; + psp->spritendx = state->Sprite; psp->ang = 0; psp->vel = 0; psp->rotate_ang = 0; @@ -7252,7 +7260,7 @@ PANEL_SPRITE* pSpawnSprite(PLAYER* pp, PANEL_STATE* state, uint8_t priority, dou for (i = 0; i < SIZ(psp->over); i++) { psp->over[i].State = nullptr; - psp->over[i].pic = -1; + psp->over[i].pic = FNullTextureID(); psp->over[i].xoff = -1; psp->over[i].yoff = -1; } @@ -7366,7 +7374,8 @@ void pDisplaySprites(PLAYER* pp, double interpfrac) { DSWActor* plActor = pp->actor; PANEL_SPRITE* next=nullptr; - short shade, picnum, overlay_shade = 0; + short shade, overlay_shade = 0; + int spritenum; double x, y; unsigned i; @@ -7411,73 +7420,75 @@ void pDisplaySprites(PLAYER* pp, double interpfrac) } // if the state is null get the texture for other than picndx - if (psp->picndx == -1 || !psp->State) - picnum = psp->picnum; + if (psp->spritendx == SPR_NULL || !psp->State) + spritenum = psp->spritenum; else - picnum = psp->picndx; + spritenum = psp->spritendx; // UK panzies have to have darts instead of shurikens. if (sw_darts) { - if (picnum >= STAR_REST && picnum <= STAR_THROW3) picnum += DART_REST - STAR_REST; + if (spritenum >= SPR_STAR_REST && spritenum <= SPR_STAR_THROW3) spritenum = (spritenum + SPR_DART_REST - SPR_STAR_REST); } if (pp->Bloody) { - switch (picnum) + switch (spritenum) { - case SWORD_REST: - picnum = BLOODYSWORD_REST; + case SPR_SWORD_REST: + spritenum = SPR_BLOODYSWORD_REST; break; - case SWORD_SWING0: - picnum = BLOODYSWORD_SWING0; + case SPR_SWORD_SWING0: + spritenum = SPR_BLOODYSWORD_SWING0; break; - case SWORD_SWING1: - picnum = BLOODYSWORD_SWING1; + case SPR_SWORD_SWING1: + spritenum = SPR_BLOODYSWORD_SWING1; break; - case SWORD_SWING2: - picnum = BLOODYSWORD_SWING2; + case SPR_SWORD_SWING2: + spritenum = SPR_BLOODYSWORD_SWING2; break; - case FIST_REST: - picnum = 4077; + case SPR_FIST_REST: + spritenum = SPR_BLOODYFIST_REST; break; - case FIST2_REST: - picnum = 4051; + case SPR_FIST2_REST: + spritenum = SPR_BLOODYFIST2_REST; break; - case FIST_SWING0: - picnum = 4074; + case SPR_FIST_SWING0: + spritenum = SPR_BLOODYFIST_SWING0; break; - case FIST_SWING1: - picnum = 4075; + case SPR_FIST_SWING1: + spritenum = SPR_BLOODYFIST_SWING1; break; - case FIST_SWING2: - picnum = 4076; + case SPR_FIST_SWING2: + spritenum = SPR_BLOODYFIST_SWING2; break; - case STAR_REST: - case DART_REST: + case SPR_STAR_REST: + case SPR_DART_REST: if (!sw_darts) - picnum = STAR_THROW4; + spritenum = SPR_STAR_THROW4; else - picnum = DART_THROW4; // Bloody Dart Hand + spritenum = SPR_DART_THROW4; // Bloody Dart Hand break; } } if (pp->WpnShotgunType == 1) { - switch (picnum) + switch (spritenum) { - case SHOTGUN_REST: - case SHOTGUN_RELOAD0: - picnum = 2227; + case SPR_SHOTGUN_REST: + spritenum = SPR_SHOTGUN2_REST; + break; + case SPR_SHOTGUN_RELOAD0: + spritenum = SPR_SHOTGUN_RELOAD0; break; - case SHOTGUN_RELOAD1: - picnum = 2226; + case SPR_SHOTGUN_RELOAD1: + spritenum = SPR_SHOTGUN_RELOAD1; break; - case SHOTGUN_RELOAD2: - picnum = 2225; + case SPR_SHOTGUN_RELOAD2: + spritenum = SPR_SHOTGUN_RELOAD2; break; } } @@ -7558,38 +7569,32 @@ void pDisplaySprites(PLAYER* pp, double interpfrac) if (pal == PALETTE_DEFAULT) { - switch (picnum) + switch (spritenum) { - case KICK0: - case KICK1: - case MINE_REST0: - case MINE_REST1: + case SPR_KICK0: + case SPR_KICK1: + case SPR_MINE_REST0: + case SPR_MINE_REST1: pal = plActor->user.spal; break; } } // temporary hack to fix fist artifacts until a solution is found in the panel system itself - switch (picnum) + switch (spritenum) { - case FIST_SWING0: - case FIST_SWING1: - case FIST_SWING2: - case FIST2_SWING0: - case FIST2_SWING1: - case FIST2_SWING2: - case FIST3_SWING0: - case FIST3_SWING1: - case FIST3_SWING2: - case BLOODYFIST_SWING0: - case BLOODYFIST_SWING1: - case BLOODYFIST_SWING2: - case BLOODYFIST2_SWING0: - case BLOODYFIST2_SWING1: - case BLOODYFIST2_SWING2: - case BLOODYFIST3_SWING0: - case BLOODYFIST3_SWING1: - case BLOODYFIST3_SWING2: + case SPR_FIST_SWING0: + case SPR_FIST_SWING1: + case SPR_FIST_SWING2: + case SPR_FIST3_SWING0: + case SPR_FIST3_SWING1: + case SPR_FIST3_SWING2: + case SPR_BLOODYFIST_SWING0: + case SPR_BLOODYFIST_SWING1: + case SPR_BLOODYFIST_SWING2: + case SPR_BLOODYFIST3_SWING0: + case SPR_BLOODYFIST3_SWING1: + case SPR_BLOODYFIST3_SWING2: if ((flags & RS_XFLIPHUD) && x > 160) x = 65; else if (!(flags & RS_XFLIPHUD) && x < 160) @@ -7599,27 +7604,28 @@ void pDisplaySprites(PLAYER* pp, double interpfrac) break; } - hud_drawsprite(x, y, psp->scale, ang, picnum, shade, pal, flags); + hud_drawsprite(x, y, psp->scale / 65536., ang, SpriteDefs[spritenum].GetSpriteFrame(0), shade, pal, flags); // do overlays (if any) for (i = 0; i < SIZ(psp->over); i++) { + FTextureID tex; // get pic from state if (psp->over[i].State) - picnum = psp->over[i].State->picndx; + tex = SpriteDefs[psp->over[i].State->Sprite].GetSpriteFrame(0); else // get pic from over variable - if (psp->over[i].pic >= 0) - picnum = psp->over[i].pic; + if (psp->over[i].pic.isValid()) + tex = psp->over[i].pic; else continue; if ((psp->over[i].flags & psf_ShadeNone)) overlay_shade = 0; - if (picnum) + if (spritenum) { - hud_drawsprite((x + psp->over[i].xoff), (y + psp->over[i].yoff), psp->scale, ang, picnum, overlay_shade, pal, flags); + hud_drawsprite((x + psp->over[i].xoff), (y + psp->over[i].yoff), psp->scale / 65536., ang, tex, overlay_shade, pal, flags); } } } @@ -7666,7 +7672,7 @@ void pSetState(PANEL_SPRITE* psp, PANEL_STATE* panel_state) PRODUCTION_ASSERT(psp); psp->tics = 0; psp->State = panel_state; - psp->picndx = panel_state ? panel_state->picndx : 0; + psp->spritendx = panel_state ? panel_state->Sprite : SPR_NULL; } void pCallAnimator(PANEL_SPRITE* psp) @@ -7723,7 +7729,7 @@ void pStateControl(PANEL_SPRITE* psp) } // Set spritenum to the correct pic - psp->picndx = psp->State->picndx; + psp->spritendx = psp->State->Sprite; // do overlay states for (i = 0; i < SIZ(psp->over); i++) diff --git a/source/games/sw/src/panel.h b/source/games/sw/src/panel.h index 3e72f39d1b..07603f34b3 100644 --- a/source/games/sw/src/panel.h +++ b/source/games/sw/src/panel.h @@ -99,8 +99,8 @@ struct PANEL_SPRITE_OVERLAY { PANEL_STATE* State; int flags; + FTextureID pic; short tics; - short pic; short xoff; // from panel sprite center x short yoff; // from panel sprite center y }; @@ -116,8 +116,9 @@ struct PANEL_SPRITE PANEL_SPRITE_OVERLAY over[8]; PANEL_SPRITE_FUNCp PanelSpriteFunc; short ID; // id for finding sprite types on the list - short picndx; // for pip stuff in conpic.h - short picnum; // bypass pip stuff in conpic.h + + short spritendx; // for pip stuff in conpic.h + short spritenum; // bypass pip stuff in conpic.h short vel, vel_adj; int flags, priority; int scale; @@ -168,26 +169,9 @@ enum BorderTypes enum { MICRO_SIGHT_NUM = 0, - MICRO_SIGHT = 2075, - MICRO_SHOT_NUM = 2, - MICRO_SHOT_20 = 2076, - MICRO_SHOT_1 = 2077, - MICRO_HEAT_NUM = 1, - MICRO_HEAT = 2084, - - UZI_COPEN = 2040, - UZI_CCLOSED = 2041, - UZI_CLIT = 2042, - UZI_CRELOAD = 2043, - - HEAD_MODE1 = 2055, - HEAD_MODE2 = 2056, - HEAD_MODE3 = 2057, - SHOTGUN_AUTO_NUM = 0, - SHOTGUN_AUTO = 2078, }; diff --git a/source/games/sw/src/save.cpp b/source/games/sw/src/save.cpp index d1c24aedbd..5f3b974ffd 100644 --- a/source/games/sw/src/save.cpp +++ b/source/games/sw/src/save.cpp @@ -336,8 +336,8 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, PANEL_SPRITE& w, P ("y", w.pos.Y) .Array("over", w.over, countof(w.over)) ("id", w.ID) - ("picndx", w.picndx) - ("picnum", w.picnum) + ("picndx", w.spritendx) + ("picnum", w.spritenum) ("vel", w.vel) ("vel_adj", w.vel_adj) ("xorig", w.bobpos.X) diff --git a/source/games/sw/src/spritenames.h b/source/games/sw/src/spritenames.h index f1c0b78548..2201a7510d 100644 --- a/source/games/sw/src/spritenames.h +++ b/source/games/sw/src/spritenames.h @@ -349,6 +349,10 @@ x(SHOTGUN_FIRE1) x(SHOTGUN_RELOAD0) x(SHOTGUN_RELOAD1) x(SHOTGUN_RELOAD2) +x(SHOTGUN2_REST) +x(SHOTGUN2_RELOAD0) +x(SHOTGUN2_RELOAD1) +x(SHOTGUN2_RELOAD2) x(SHOTGUN_SHELL0) x(SHOTGUN_SHELL1) x(SHOTGUN_SHELL2) @@ -437,14 +441,8 @@ x(BLOODYFIST_SWING0) x(BLOODYFIST_SWING1) x(BLOODYFIST_SWING2) x(FIST2_REST) -x(FIST2_SWING0) -x(FIST2_SWING1) -x(FIST2_SWING2) x(FIST2_SWING_ALT) x(BLOODYFIST2_REST) -x(BLOODYFIST2_SWING0) -x(BLOODYFIST2_SWING1) -x(BLOODYFIST2_SWING2) x(FIST3_REST) x(FIST3_SWING0) x(FIST3_SWING1)