Copy to Clipboard Test

Trampoline Code

const int TRAMPOLINE_ANIMATION_FRAMES = 10; //The number of frames the trampoline animates after being jumped on

//Combo Setup:
//Combo 1: Trampoline - Still
//Combo 2: Trampoline - Bouncing
//D0: How high the trampoline launches Link
//D1: The number of the flag marking combos Link can jump over.

ffc script Trampoline{
	bool CanWalkFlag(int flag, int x, int y, int dir, int step, bool full_tile) {
		int c=8;
		int xx = x+15;
		int yy = y+15;
		if(full_tile) c=0;
		if(dir==0) return y-step>0&&(ComboFI(x,y+c-step, flag)||ComboFI(x+8,y+c-step, flag)||ComboFI(xx,y+c-step, flag));
		else if(dir==1) return yy+step<176&&(ComboFI(x,yy+step, flag)||ComboFI(x+8,yy+step, flag)||ComboFI(xx,yy+step, flag));
		else if(dir==2) return x-step>0&&(ComboFI(x-step,y+c, flag)||ComboFI(x-step,y+c+7, flag)||ComboFI(x-step,yy, flag));
		else if(dir==3) return xx+step<256&&(ComboFI(xx+step,y+c, flag)||ComboFI(xx+step,y+c+7, flag)||ComboFI(xx+step,yy, flag));
		return false; //invalid direction
	}
	void run(int JumpHeight, int Flag){
		int Combo = this->Data;
		int OldX;
		int OldY;
		int AnimCounter = 0;
		while(true){
			if(this->Data!=Combo)
				this->Data = Combo;
			if(SquareCollision(Link->X+4, Link->Y+4, 8, this->X+4, this->Y+4, 8)&&Link->Z==0){
				Game->PlaySound(SFX_JUMP);
				Link->Jump = JumpHeight;
				OldX = Link->X;
				OldY = Link->Y;
				this->Data = Combo+1;
				AnimCounter = TRAMPOLINE_ANIMATION_FRAMES;
				do{
					if(AnimCounter>0)	
						AnimCounter--;
					else
						this->Data = Combo;
					bool Moving = false;
					if(Link->InputUp&&(CanWalk(Link->X, Link->Y, DIR_UP, 1.5, false)||CanWalkFlag(Flag, Link->X, Link->Y, DIR_UP, 1.5, false))){
						OldY -= 1.5;
						Moving = true;
					}
					else if(Link->InputDown&&(CanWalk(Link->X, Link->Y, DIR_DOWN, 1.5, false)||CanWalkFlag(Flag, Link->X, Link->Y, DIR_DOWN, 1.5, false))){
						OldY += 1.5;
						Moving = true;
					}
					if(Link->InputLeft&&(CanWalk(Link->X, Link->Y, DIR_LEFT, 1.5, false)||CanWalkFlag(Flag, Link->X, Link->Y, DIR_LEFT, 1.5, false))){
						OldX -= 1.5;
						Moving = true;
					}
					else if(Link->InputRight&&(CanWalk(Link->X, Link->Y, DIR_RIGHT, 1.5, false)||CanWalkFlag(Flag, Link->X, Link->Y, DIR_RIGHT, 1.5, false))){
						OldX += 1.5;
						Moving = true;
					}
					if(Moving){
						Link->X = OldX;
						Link->Y = OldY;
					}
					else{
						OldX = Link->X;
						OldY = Link->Y;
					}
					Waitframe();
				}while(Link->Z>0);
			}
			Waitframe();
		}
	}
}