Copy to Clipboard Test

Scripted secret triggers Code

//D0: The LW_ weapon type to check for (std_constants.zh)
//D1: The screen flag to check for on layer 0. If 0, the FFC itself is the trigger.
//D2: The type of secret it's using:
//		-0: Self only
//		-1: Trigger Secrets (Temp)
//		-2: Trigger Secrets (Perm)
//		-3: Hit All (Temp)
//		-4: Hit All (Perm)
//D3: The combo to set the trigger combo to. If 0, will increase the combo by 1
//D4: The CSet for the trigger combo
//D5: The sound to play when the secret is triggered

ffc script ScriptWeaponTrigger{
	void run(int weapon_type, int marker_flag, int secret_type, int secret_combo, int secret_cset, int sfx){
		int i; int j; int k;
		if(secret_type==4){ //If a permanent trigger is set
			if(Screen->State[ST_SECRET]){
				if(marker_flag==0){ //If the FFC is the trigger
					if(secret_combo>0){
						this->Data = secret_combo;
						this->CSet = secret_cset;
					}
					else{
						this->Data++;
					}
				}
				else{ //If a combo is the trigger
					for(j=0; j<176; j++){
						if(ComboFI(j, marker_flag)){
							if(secret_combo>0){
								Screen->ComboD[j] = secret_combo;
								Screen->ComboC[j] = secret_cset;
								Screen->ComboF[j] = 0;
							}
							else{
								Screen->ComboD[j]++;
								Screen->ComboF[j] = 0;
							}
						}
					}
				}
			}
		}
		bool trigger;
		while(!trigger){
			//Cycle through weapons backwards to save the frames
			for(i=Screen->NumLWeapons(); i>=1; i--){
				lweapon l = Screen->LoadLWeapon(i);
				if(l->ID==weapon_type){ //First check if the weapon is the right type
					if(l->CollDetection&&l->DeadState<0){ //Then check if it has collision
						if(marker_flag==0){ //If the FFC is the trigger
							if(Collision(this, l)){
								Game->PlaySound(sfx);
								SWT_BounceWeapon(l);
								if(secret_combo>0){ //If a secret combo is specified, change to that
									this->Data = secret_combo;
									this->CSet = secret_cset;
								}
								else{ //Else increase by 1
									this->Data++;
								}
								if(secret_type==0){ //A self only secret quits out here
									Quit();
								}
								else if(secret_type==1||secret_type==2){ //A screen secret trigger breaks the loop
									trigger = true;
								}
								else if(secret_type==3||secret_type==4){ //A hit all trigger breaks the loop
									if(CountFFCsRunning(this->Script)==1){ //Only if it's the last one
										trigger = true;
									}
									else //Otherwise it quits
										Quit();
								}
							}
						}
						else{ //If a combo is the trigger
							int flagCount;
							for(j=0; j<176; j++){
								if(ComboFI(j, marker_flag)){
									flagCount++;
									int x = l->X+l->HitXOffset;
									int y = l->Y+l->HitYOffset;
									if(RectCollision(ComboX(j), ComboY(j), ComboX(j)+15, ComboY(j)+15, x, y, x+l->HitWidth-1, y+l->HitHeight-1)){
										Game->PlaySound(sfx);
										SWT_BounceWeapon(l);
										if(secret_combo>0){ //If a secret combo is specified, change to that
											Screen->ComboD[j] = secret_combo;
											Screen->ComboC[j] = secret_cset;
											Screen->ComboF[j] = 0;
										}
										else{ //Else increase by 1
											Screen->ComboD[j]++;
											Screen->ComboF[j] = 0;
										}
										if(secret_type==1||secret_type==2){ //A screen secret triggers secrets
											Screen->TriggerSecrets();
											if(secret_type==2)
												Screen->State[ST_SECRET] = true;
										}
									}
								}
							}
							if(flagCount==0){ //If all triggers are hit and type is 3 or 4, break out of the loop
								if(secret_type==3||secret_type==4){
									trigger = true;
								}
							}
						}
					}
				}
				if(trigger)
					break;
			}
			Waitframe();
		}
		Screen->TriggerSecrets();
		if(secret_type==2||secret_type==4)
			Screen->State[ST_SECRET] = true;
	}
	void SWT_BounceWeapon(lweapon l){
		if(l->ID==LW_BRANG||l->ID==LW_HOOKSHOT)
			l->DeadState = WDS_BOUNCE;
		else if(l->ID==LW_ARROW)
			l->DeadState = WDS_ARROW;
		else if(l->ID==LW_BEAM)
			l->DeadState = WDS_BEAMSHARDS;
	}
}