Copy to Clipboard Test

Simple GB Shutter Code

ffc script GB_Shutter{
	void run(int type, int perm){
		int thisData = this->Data;
		int thisCSet = this->CSet;
		this->Data = FFCS_INVISIBLE_COMBO;
		int cp = ComboAt(this->X+8, this->Y+8);
		int underCombo = Screen->ComboD[cp];
		int underCSet = Screen->ComboC[cp];
		int LinkX = Link->X;
		if(perm&&Screen->State[ST_SECRET])
			Quit();
		if(LinkX<=0)
			LinkX = 240;
		else if(LinkX>=240)
			LinkX = 0;
		int LinkY = Link->Y;
		if(LinkY<=0)
			LinkY = 160;
		else if(LinkY>=160)
			LinkY = 0;
		int moveDir = Link->Dir;
		if(GB_Shutter_InShutter(this, LinkX, LinkY, 0)){
			if(LinkY==0)
				moveDir = DIR_DOWN;
			else if(LinkY==160)
				moveDir = DIR_UP;
			else if(LinkX==0)
				moveDir = DIR_RIGHT;
			else if(LinkX==240)
				moveDir = DIR_LEFT;
			Waitframe();
			while(GB_Shutter_InShutter(this, Link->X, Link->Y, 0)&&CanWalk(Link->X, Link->Y, moveDir, 1, false)){
				NoAction();
				if(moveDir==DIR_UP)
					Link->InputUp = true;
				else if(moveDir==DIR_DOWN)
					Link->InputDown = true;
				else if(moveDir==DIR_LEFT)
					Link->InputLeft = true;
				else if(moveDir==DIR_RIGHT)
					Link->InputRight = true;
				Waitframe();
			}
			//MooshPit_ResetEntry();
			Game->PlaySound(SFX_SHUTTER);
			Screen->ComboD[cp] = underCombo;
			Screen->ComboC[cp] = underCSet;
			this->Data = thisData+1;
			this->CSet = thisCSet;
			for(int i=0; i<4; i++){
				if(moveDir==DIR_UP)
					Link->Y = Min(Link->Y, 144);
				else if(moveDir==DIR_DOWN)
					Link->Y = Max(Link->Y, 8);
				else if(moveDir==DIR_LEFT)
					Link->X = Min(Link->X, 224);
				else if(moveDir==DIR_RIGHT)
					Link->X = Max(Link->X, 16);
				Waitframe();
			}
			this->Data = FFCS_INVISIBLE_COMBO;
			Screen->ComboD[cp] = thisData;
			Screen->ComboC[cp] = thisCSet;
			if(type==1)
				Waitframes(8);
		}
		else{
			Screen->ComboD[cp] = thisData;
			Screen->ComboC[cp] = thisCSet;
			if(type==1)
				Waitframes(8);
			else
				Waitframe();
		}
		while(true){
			if(GB_Shutter_InShutter(this, Link->X, Link->Y, 3)){
				Screen->ComboD[cp] = underCombo;
				Screen->ComboC[cp] = underCSet;
				if(Link->Y==0)
					moveDir = DIR_DOWN;
				else if(Link->Y==160)
					moveDir = DIR_UP;
				else if(Link->X==0)
					moveDir = DIR_RIGHT;
				else if(Link->X==240)
					moveDir = DIR_LEFT;
				while(GB_Shutter_InShutter(this, Link->X, Link->Y, 0)&&CanWalk(Link->X, Link->Y, moveDir, 1, false)){
					NoAction();
					if(moveDir==DIR_UP)
						Link->InputUp = true;
					else if(moveDir==DIR_DOWN)
						Link->InputDown = true;
					else if(moveDir==DIR_LEFT)
						Link->InputLeft = true;
					else if(moveDir==DIR_RIGHT)
						Link->InputRight = true;
					Waitframe();
				}
				Game->PlaySound(SFX_SHUTTER);
				Screen->ComboD[cp] = underCombo;
				Screen->ComboC[cp] = underCSet;
				this->Data = thisData+1;
				this->CSet = thisCSet;
				for(int i=0; i<4; i++){
					if(moveDir==DIR_UP)
						Link->Y = Min(Link->Y, 144);
					else if(moveDir==DIR_DOWN)
						Link->Y = Max(Link->Y, 8);
					else if(moveDir==DIR_LEFT)
						Link->X = Min(Link->X, 224);
					else if(moveDir==DIR_RIGHT)
						Link->X = Max(Link->X, 16);
					Waitframe();
				}
				this->Data = FFCS_INVISIBLE_COMBO;
				Screen->ComboD[cp] = thisData;
				Screen->ComboC[cp] = thisCSet;
				if(moveDir==DIR_UP)
					Link->Y = Min(Link->Y, 144);
				else if(moveDir==DIR_DOWN)
					Link->Y = Max(Link->Y, 8);
				else if(moveDir==DIR_LEFT)
					Link->X = Min(Link->X, 224);
				else if(moveDir==DIR_RIGHT)
					Link->X = Max(Link->X, 16);
				Waitframes(8);
			}
			if(type==0&&(Screen->ComboD[cp]!=thisData||Screen->ComboC[cp]!=thisCSet)){
				break;
			}
			if(type==1){
				if(!GB_Shutter_CheckEnemies()){
					break;
				}
			}
			Waitframe();
		}
		Game->PlaySound(SFX_SHUTTER);
		Screen->ComboD[cp] = underCombo;
		Screen->ComboC[cp] = underCSet;
		this->Data = thisData+1;
		this->CSet = thisCSet;
		Waitframes(4);
		this->Data = FFCS_INVISIBLE_COMBO;
		if(perm)
			Screen->State[ST_SECRET] = true;
	}
	bool GB_Shutter_InShutter(ffc this, int LinkX, int LinkY, int leeway){
		if(Abs(LinkX-this->X)<16-leeway&&LinkY>this->Y-16+leeway&&LinkY<this->Y+8-leeway)
			return true;
		return false;
	}
	bool GB_Shutter_CheckEnemies(){
		for(int i=Screen->NumNPCs(); i>=1; i--){
			npc n = Screen->LoadNPC(i);
			if(n->Type!=NPCT_PROJECTILE&&n->Type!=NPCT_FAIRY&&n->Type!=NPCT_TRAP&&n->Type!=NPCT_GUY){
				if(!(n->MiscFlags&(1<<3)))
					return true;
			}
		}
		return false;
	}
}