import "std.zh" import "ffcscript.zh" bool RULE_FLIPRIGHTSLASH = false; //Set to true if you use "Flip right-facing slash" and false if you don't. const int FLIP_NO = 0; //No flip const int FLIP_H = 1; //Horizontal flip const int FLIP_V = 2; //Vertical flip const int FLIP_B = 3; //Both (180 degree rotation) //D0: Damage of the second sword (0 = stun) //D1: Sprite of the second sword //D2: SFX of main sword //D3: SFX of second sword bool swordState; //State of the dual swords: true = second sword item script dualSwords{ void run( int damage, int sprite, int sfx1, int sfx2 ){ swordState = !swordState; //Switch between swords if ( swordState ){ int args[2] = { damage, sprite }; Game->PlaySound(sfx2); RunFFCScript(swordSwitchFFC, args); } else Game->PlaySound(sfx1); } } const int swordSwitchFFC = 1; //Set to the slot of the swordSwitch FFC ffc script swordSwitch{ void run( int damage, int sprite ){ //Position/sprite arrays set for facing up int Xpos[3] = {-13, -13, 0}; int Ypos[3] = {0, -13, -13}; int Sprites[3] = {5, 0, 4}; //0-3: Slash UDLR; 4-5: Stab UR int flips[3] = {1, 0, 0}; //Only stabs need flipping Link->Action = LA_NONE; //Cancel default sword lweapon sword = LoadLWeaponOf(LW_SWORD); //Find default sword Remove(sword); //Remove it sword = Screen->CreateLWeapon(LW_SCRIPT1); //Make a new sword sword->UseSprite(sprite); int baseTile = sword->Tile; //Save the base tile sword->Damage = damage; //Prepare Link's sprite for horizontal flip (DISABLED UNTIL LINK->TILE IS USABLE) //if ( Link->Dir == DIR_LEFT ) Link->Dir = DIR_RIGHT; //else if ( Link->Dir == DIR_RIGHT ) Link->Dir = DIR_LEFT; //Link->Invisible = true; //Set positions and sprites for each direction //Up is set by default Sprites[1] = Link->Dir; //Middle sprite always equals Link's direction if ( Link->Dir == DIR_DOWN || Link->Dir == DIR_LEFTDOWN || Link->Dir == DIR_RIGHTDOWN ){ Xpos[0] = 13; Xpos[1] = 13; //X position 2 is correct //Y position 0 is correct Ypos[1] = 13; Ypos[2] = 13; Sprites[0] = 5; //Right, no flip Sprites[2] = 4; //Down = up + both flip flips[0] = FLIP_NO; flips[2] = FLIP_B; } else if ( Link->Dir == DIR_LEFT ){ Xpos[0] = 0; //Xpos[1] = -16; //Already correct Xpos[2] = -13; Ypos[0] = 13; Ypos[1] = 13; Ypos[2] = 0; Sprites[0] = 4; //Down = up + both flip Sprites[2] = 5; //Left = right + horizontal flip flips[0] = FLIP_B; flips[2] = FLIP_B; } else if ( Link->Dir == DIR_RIGHT ){ //NOTE: These expect "flip right-facing sword" to be enabled. If you don't use it, change the Y values below: Xpos[0] = 0; Xpos[1] = 13; Xpos[2] = 13; if ( RULE_FLIPRIGHTSLASH ){ //If "flip right-facing slash" is enabled Ypos[0] = -13; Ypos[1] = -13; } else{ Ypos[0] = 13; Ypos[1] = 13; } Ypos[2] = 0; Sprites[0] = 4; //Up, no flip Sprites[2] = 5; //Right, no flip flips[0] = FLIP_NO; } Link->Action = LA_ATTACKING; for ( int i = 0; i < 3; i++ ){ //For each of 3 frames if ( !sword->isValid() ) return; //Quit if sword vanishes //Screen->DrawTile(2, Link->X, Link->Y, Link->Tile, -1, -1, 6, -1, -1, 0, 0, 0, FLIP_H, true, 128); //Draw Link's flipped tile sword->X = Link->X + Xpos[i]; //Set position sword->Y = Link->Y + Ypos[i]; sword->Tile = baseTile + Sprites[i]; //And sprite sword->Flip = flips[i]; sword->DeadState = WDS_ALIVE; for ( int f = 0; f < 3; f++ ){ //Wait 3 frames per position, preventing movement and preserving sword sword->DeadState = WDS_ALIVE; NoMovement(); Waitframe(); } } sword->DeadState = WDS_DEAD; //Remove it afterwards //Link->Invisible = false; //Restore Link's sprite } } void NoMovement(){ //Prevents moving in any direction Link->InputUp = false; Link->PressUp = false; Link->InputDown = false; Link->PressDown = false; Link->InputLeft = false; Link->PressLeft = false; Link->InputRight = false; Link->PressRight = false; }