Copy to Clipboard Test

GB Shovel Code

//	Set-up instructions:
//	First configures all options at the start of the script in regards to what combo IDs to use and combo types, etc.
//	Import scripts and be sure to slot in both the item script and the FFC scripts in appropriate spots (important!)
//	Next, set up an item in Zelda Quest that has the item script Shovel configured to it.
//	Configure combos to be diggable in your quest based on the pre-sets you configured.
//	Dig away!
//
//	For Special Items you can dig up or Dig Secrets use the specialized FFC for that:
//		A good rule of thumb is to either have the combo of the FFC itself be nothing but transparent or have it only show up with lens of truth.
//		The FFC needs to be placed *ON* the combo you want the desired effect on.
//			(For you coders out there thats the ComboAt the FFC's X+4, Y+4 position, to give slight leeway).
//		If you give the FFC no data it will spawn the screens Secret Item (assuming it has not been gotten) when you dig there.
//		The other use for it (which does *not* spawn items) is to dig up a secret combo of your desire when you dig there.
//		If so you need to give the FFC the following info:
//		D0: Combo ID of the combo you wish to be there after you have dug.
//		D1: Set this to "1" if you want the Screen Secret to be triggered when you dig there. (Handy if you want it to be a thing you dig up once)
//
//Special items that are dug up uses the RoomData, set room type to special item to use.



//The combo type for diggable ground.
const int Shovel_ComboType = 143;	//Script 2 (143) is default for this. (Same as in the VD Tileset).

//Digging on proper combos will change the combo to this one:
const int Shovel_DugCombo = 10;		//Change to 0 to use the screens undercombo instead (Not really recommended).

//Digging up a pre-defined item (or secret temporarily) using the FFC will change the combo to this one:
const int Shovel_ItemCombo = 38;		//Note: It needs to be a *DIFFERENT* combo ID than the regular dug up terrain.

//Defined items that the shovel can dig up on generic diggable ground.
const int Shovel_ItemDrop1 = 0;			// 10% Chance.	(Default item is 1 Rupee)
const int Shovel_ItemDrop2 = 2;			// 10% Chance.	(Default item is a Recovery Heart)
const int Shovel_ItemDrop3 = 34;		// 3% Chance.	(Default item is a Fairy)
const int Shovel_ItemDrop4 = 1;			// 4% Chance.	(Default item is 5 Rupee)
const int Shovel_ItemDrop5 = 87;		// 1% Chance.	(Default item is 100 Rupee)

//Start of 8 combos in a row for the dig animation. (Up 1, Down 1, Left 1, Right 1, Up 2, Down 2, Left 2, Right 2)
const int Shovel_Anima_Start = 64;
//Start of 4 combos for the dirt clut that the shovel flings. (Up, Down, Left, Right)
const int Shovel_FlyingDirt = 72;

//The FFC slot where you put the main shovel script.
const int Shovel_FFC_Script = 14;

//Sound Effects that play:
const int Shovel_Sound = 100;		// successfully dig.
const int Shovel_Fail = 101;			//A error sound that plays when you dig undiggable combos.
const int Shovel_SecretSFX = 27;	//Places when you dig up a secret.
const int Shovel_SPItemSFX = 27;	//Secret SFX that plays when you dig up the special item.






//The flag to dig on to trigger secrets. (Does not need to be on a digable combo type!)
const int Shovel_SecretFlag = 99;	//General Purpose 2	 (99) is default for this.













item script Shovel{
	void run(){
		
		if(Link->Z > 0) return;
		int args[] = {103,0,0,0,0,0,0,0};
		RunFFCScript(Shovel_FFC_Script, args);
		
	}
}




ffc script Shovel_Diggy{
  void run(){
    int chance;
    int itemdrop;
    int itemlocx;
    int itemlocy;
	bool SpecialItem = false;
    // Link->Action=LA_ATTACKING;
	
	item ShovelLoot;
	
	bool DigSuccess = false;
	
	int DigComboX;
	int DigComboY;
	int DigComboLocation;
	if(Link->Dir == 0){
		DigComboX = Link->X + 8;
		DigComboY = Link->Y - 2;
	}
	else if(Link->Dir == 1){
		DigComboX = Link->X + 8;
		DigComboY = Link->Y + 18;
	}
	else if(Link->Dir == 2){
		DigComboX = Link->X - 2;
		DigComboY = Link->Y + 8;
	}
	else if(Link->Dir == 3){
		DigComboX = Link->X + 18;
		DigComboY = Link->Y + 8;
	}
	
	DigComboLocation = ComboAt(DigComboX,DigComboY);
	
	int DigComboX2 = ComboAt(DigComboX,DigComboY) % 16;
	DigComboX2 = DigComboX2 * 16;
	int DigComboY2 = ComboAt(DigComboX,DigComboY) / 16;
	DigComboY2 = Floor(DigComboY2);
	DigComboY2 = DigComboY2 * 16;
	
	
	for(int i; i != 10; i ++){
		Link->Invisible = true;
		
		Screen->FastCombo(2, Link->X, Link->Y, Shovel_Anima_Start + Link->Dir, 6, OP_OPAQUE);
		NoAction();
		
		Waitframe();
		Link->Invisible = false;
	}

	
    if(Screen->ComboT[ComboAt(DigComboX,DigComboY)] != Shovel_ComboType){
       Game->PlaySound(Shovel_Fail);
    }
    else{
		
       Game->PlaySound(Shovel_Sound);
	   DigSuccess = true;
	   
       chance=Rand(100)+1;
	   
//	   if(Screen->ComboT[ComboAt(DigComboX,DigComboY)] == Shovel_ComboType && Screen->ComboI[ComboAt(DigComboX,DigComboY)] == Shovel_SecretFlag){
//		   
//		   Screen->ComboD[ComboAt(DigComboX,DigComboY)] = Screen->UnderCombo;
//		   chance = 101;
//		   
//	   }
//	   else if(Screen->ComboF[ComboAt(DigComboX,DigComboY)] == Shovel_SecretFlag || Screen->ComboI[ComboAt(DigComboX,DigComboY)] == Shovel_SecretFlag){
//		   Game->PlaySound(Shovel_SecretSFX);
//		   Screen->TriggerSecrets();
//		   Screen->State[ST_SECRET] = true;
//		   chance = 101;
//	   }

	   Screen->ComboD[ComboAt(DigComboX,DigComboY)] = Screen->UnderCombo;
	   
	   if(Shovel_DugCombo > 0){
		   Screen->ComboD[ComboAt(DigComboX,DigComboY)] = Shovel_DugCombo;
		}

	   

		//Waiting to perfrom check for Secret Combo
		Waitframe();
		if(Screen->ComboD[DigComboLocation] == Shovel_DugCombo){
			
		
		   if(chance<=10){		//10%
			   itemdrop = Shovel_ItemDrop1;	//1 rupee
		   }
		   else if(chance<=20){	//10%
			   itemdrop = Shovel_ItemDrop2;	//Recovery heart
		   }
		   else if(chance<=23){	//3%
			   itemdrop = Shovel_ItemDrop3;	//Fairy
		   }
		   else if(chance<=27){	//4%
			   itemdrop = Shovel_ItemDrop4;	//5 Rupee
		   }
		   else if(chance<=28){	//1%
			   itemdrop = Shovel_ItemDrop5;	//100 Rupee
		   }
		   else{
			   itemdrop = - 999;	//No item drop
		   }
			
		}
	   else if(Screen->ComboD[DigComboLocation] == Shovel_ItemCombo){
		   
		   
		   
		   if(Screen->State[ST_SPECIALITEM] == true){
			   itemdrop = - 999;
		   }
		   else{
			   SpecialItem = true;
			   itemdrop = Screen->RoomData;
			   Game->PlaySound(Shovel_SPItemSFX);
		   }
		   
		   
	   }
	   
	   
	    if(Link->Dir==0){	//Spawn location
		   itemlocx=Link->X;
		   itemlocy=Link->Y-16;
	   }
	   if(Link->Dir==1){
		   itemlocx=Link->X;
		   itemlocy=Link->Y+16;
	   }
	   if(Link->Dir==2){
		   itemlocx=Link->X-16;
		   itemlocy=Link->Y;
	   }
	   if(Link->Dir==3){
		   itemlocx=Link->X+16;
		   itemlocy=Link->Y;
	   }
	   

       if(itemdrop != -999){
           ShovelLoot=Screen->CreateItem(itemdrop);
           ShovelLoot->X=itemlocx;
           ShovelLoot->Y=itemlocy;
           ShovelLoot->Z=2;
		   ShovelLoot->Jump = 2;
		   if(SpecialItem){
				ShovelLoot->Pickup=IP_ST_SPECIALITEM + IP_HOLDUP;
				//	ShovelLoot->Pickup=IP_ST_SPECIALITEM;
		   }
		   else{
				ShovelLoot->Pickup=IP_TIMEOUT;
		   }
       }
    }
	
	int shovel_item_dir = Link->Dir;
	int DirtClutX = DigComboX2;
	int DirtClutY = DigComboY2;
	
	
	for(int i; i != 10; i ++){
		Link->Invisible = true;
		
		Screen->FastCombo(2, Link->X, Link->Y, Shovel_Anima_Start + 4 + Link->Dir, 6, OP_OPAQUE);
		NoAction();
		
		if(i < 5){
			
			if(shovel_item_dir == 0)DirtClutY --;
			if(shovel_item_dir == 1 && i % 2 == 0)DirtClutY ++;
			
			//sideways
			if(shovel_item_dir > 1)DirtClutY --;
			if(shovel_item_dir == 3)DirtClutX = DigComboX + (i / 2); 
			if(shovel_item_dir == 2)DirtClutX = DigComboX - (i / 2);
			
		}
		else{
			
			if(shovel_item_dir == 0 && i % 2 == 0)DirtClutY --;
			if(shovel_item_dir == 1)DirtClutY ++;
			
			//sideways
			if(shovel_item_dir > 1)DirtClutY ++;
			if(shovel_item_dir == 3)DirtClutX = DigComboX + (i / 2); 
			if(shovel_item_dir == 2)DirtClutX = DigComboX - (i / 2);
			
		}
		if(DigSuccess)Screen->FastCombo(2, DirtClutX, DirtClutY, Shovel_FlyingDirt + shovel_item_dir, 6, OP_OPAQUE);
		
		
		if(Screen->ComboS[ComboAt(ShovelLoot->X + 8, ShovelLoot->Y + 8)] == 0){
			
			if(shovel_item_dir == 0)ShovelLoot->Y --;
			else if(shovel_item_dir == 1)ShovelLoot->Y ++;
			else if(shovel_item_dir == 2)ShovelLoot->X --;
			else if(shovel_item_dir == 3)ShovelLoot->X ++;
			
		}
		
		
		Waitframe();
		Link->Invisible = false;
	}
	
	while(ShovelLoot->Z > 0){
		
		if(Screen->ComboS[ComboAt(ShovelLoot->X + 8, ShovelLoot->Y + 8)] == 0){
			
			if(shovel_item_dir == 0)ShovelLoot->Y --;
			else if(shovel_item_dir == 1)ShovelLoot->Y ++;
			else if(shovel_item_dir == 2)ShovelLoot->X --;
			else if(shovel_item_dir == 3)ShovelLoot->X ++;
			
		}
		
		Waitframe();
		
	}
	
  }
}


ffc script Shovel_SP_DigPoint{
	void run(int Secret_Combo, int Secret_State){
		
		int ComboLoc = ComboAt(this->X + 4, this->Y + 4);
		//	just script a FFC as "dig point" that changes it's combo to something specific when dug
		//	probably the best solution
		//	since you could define on the fly what you'd want it to be
		
		bool CheckForIt = true;
		
		while(CheckForIt){
		
			if(Screen->ComboD[ComboLoc] == Shovel_DugCombo){
				
				if(Secret_Combo <= 0){
					
					Screen->ComboD[ComboLoc] = Shovel_ItemCombo;
					
				}
				else{
					
					Screen->ComboD[ComboLoc] = Secret_Combo;
					Game->PlaySound(Shovel_SecretSFX);
					
					
					if(Secret_State == 1){
						
						Screen->TriggerSecrets();
						Screen->State[ST_SECRET] = true;
						
					}
					
				}
				
				CheckForIt = false;
				
			}
		
			Waitframe();
		
		}
		
		
	}
}