Copy to Clipboard Test

Gasha Trees Code

//	Oracle Style Gasha Trees (By Lunaria)
//
//	How To Install:
//	Place GB_Gasha_EnemyDying() in your global active loop
//	Place and config FFCs in your quest
//	???
//	Profit &&|| Gambling addiction

//  Config options:

//General
const int GASHA_Counter = 11;		//	Counter reference used for the amount of seeds you have! Default is (CR_SCRIPT5) Aka, Script 5.
const int GASHA_Ring_ID = 0;		//	Set to an item ID that when Link posses, trees will grow att double the rate. Leave 0 to not use.
const int GASHA_Tree_Cset = 2;		//	Cset the tree will use
const int GASHA_Nut_Cset = 8;		//	Cset the nut will use

//Change the number to match whatever item ID you want for each specific entry in the reward pools
//Trash items only spawn at low gasha progression levels
const int GASHA_R_Trash1 = 2;		//	2 = Recovery heart
const int GASHA_R_Trash2 = 69;		//	69 = Fairy (stationary)

//Rupees spawn in the various gasha progression levels, higher ones in higher progression
const int GASHA_R_Rupee1 = 86;		//	86 = 10 Rupee
const int GASHA_R_Rupee2 = 38;		//	38 = 20 Rupee
const int GASHA_R_Rupee3 = 39;		//	39 = 50 Rupee
const int GASHA_R_Rupee4 = 87;		//	87 = 100 Rupee

//rings only spawn in the highest their gasha progression and they are split up into pools of two.
const int GASHA_R_Ring1 = 101;		//	101 = Charge Ring
const int GASHA_R_Ring2 = 115;		//	115 = Magic Ring (L1)
const int GASHA_R_Ring3 = 121;		//	121 = Peril Ring
const int GASHA_R_Ring4 = 99;		//	99 = Whisp Ring
const int GASHA_R_Ring5 = 112;		//	112 = Heart Ring (L1)
const int GASHA_R_Ring6 = 122;		//	122 = Whimsical Ring


//Piece of heart is a unique drop that can only generate X amount of times:
const int GASHA_PoH_Amount = 1;
const int GASHA_R_PoH = 49;			//	49 = Piece of Heart


//interface drawing crap:
const int GASHA_String = 0;			//	String to play when you inspect a soft soil (leave at 0 if you don't want one).
const int GASAH_BOX = 0x0f;			//	BG colour for a bounding box asking you if you want to plant a seed
const int GASHA_FCset = 0x01;		//	Font colour
const int GASHA_FCsetB = 0x72;		//	Blinking colour for selected text option
const int GASHA_Font = 24;			//	Font used, see std_constants if you need help assiging. (24) Oracle Proportional is default
const int GASHA_BoxX = 32;			//	Where the box starts to draw in X, recommended to not mess with.
const int GASHA_BoxY = 96;			//	How far up or down on the screen the box draws.
const int GASHA_M_SFX = 5;			//	Making a selection SFX.


//Don't mess with these unless you know what you're doing....
const int GASHA_PoH_ID = 99;
float GB_GASHA[100];



//----------------------------------------------------------------------------------------------------------

ffc script GashaTree{
	void run(float ID, int RewardPool, int ScreenFFCIndex, int FreezeCombo, int FirstTreeCombo, int GrowDirection, int CustomLoot1, int CustomLoot2){
		
		
		ffc ThisFFC = Screen->LoadFFC(ScreenFFCIndex);
		int StringPlant[] = "Plant Gasha Seed?";
		int StringYes[] = "Plant";
		int StringNo[] = "Don't";
		
		int ComboOnFile = this->Data;
		
		int NutX = GASHA_NutX(this->X, this->Y, GrowDirection);
		int NutY = GASHA_NutY(this->X, this->Y, GrowDirection);
		
		//RNG of the seed is set when they are planted, no save scumming :^)
		int NutRNG = 0;
		if(GB_GASHA[ID] > -1){
			NutRNG = (GB_GASHA[ID] - Floor(GB_GASHA[ID])) * 100;
		}
		
		//Makes sure you can carry seeds.
		if(Game->MCounter[GASHA_Counter] < 99) Game->MCounter[GASHA_Counter] = 99;
		
		//initical array config
		if(GB_GASHA[98] == 0){
			
			for(int i = 0; i < 99; i++){
				
				GB_GASHA[i] = -1;
				
			}
			
		}
		

		if(GB_GASHA[ID] == -1){
			while(GB_GASHA[ID] == -1){
				
				if(LinkCollision(ThisFFC) && Link->PressA){
					
					Screen->Message(GASHA_String);
					Waitframes(1);
					Link->PressA = false;
					
					bool YesOrNo = true;
					bool ChoiceMade = false;
					int CSetFlash = 0;
					
					if(Game->Counter[GASHA_Counter] > 0){
						
						this->Data = FreezeCombo;
						
						while(!ChoiceMade){
							Screen->Rectangle(6, GASHA_BoxX, GASHA_BoxY, GASHA_BoxX + 16 * 12, GASHA_BoxY + 16 * 2, GASAH_BOX, 1, 0, 0, 0, true, OP_OPAQUE);
							//	Screen->Rectangle(6, GASHA_BoxX, GASHA_Boxy, GASHA_BoxX + 16 * 12, GASHA_BoxY + 16 * 3, GASAH_BOX, float scale, int rx, int ry, int rangle, true, OP_OPAQUE);
							
							Screen->DrawString(6, GASHA_BoxX + 16 * 6, GASHA_BoxY, GASHA_Font, GASHA_FCset, -1, TF_CENTERED, StringPlant, OP_OPAQUE);
							
							Screen->DrawString(6, GASHA_BoxX + 16 * 3, GASHA_BoxY + 16, GASHA_Font, GASHA_FCset, -1, TF_CENTERED, StringYes, OP_OPAQUE);
							Screen->DrawString(6, GASHA_BoxX + 16 * 9, GASHA_BoxY + 16, GASHA_Font, GASHA_FCset, -1, TF_CENTERED, StringNo, OP_OPAQUE);	
							
							if(CSetFlash <= 15){
								if(YesOrNo)Screen->DrawString(6, GASHA_BoxX + 16 * 3, GASHA_BoxY + 16, GASHA_Font, GASHA_FCsetB, -1, TF_CENTERED, StringYes, OP_OPAQUE);			
								else{
									Screen->DrawString(6, GASHA_BoxX + 16 * 9, GASHA_BoxY + 16, GASHA_Font, GASHA_FCsetB, -1, TF_CENTERED, StringNo, OP_OPAQUE);		
								}
							}
							
							if(Link->PressLeft || Link->PressRight){
								Game->PlaySound(GASHA_M_SFX);
								if(YesOrNo == true) YesOrNo = false;
								else{
									YesOrNo = true;
								}
							}
							else if(Link->PressA){
								ChoiceMade = true;
								Game->PlaySound(GASHA_M_SFX);
								Link->PressA = false;
							}
							
							
							CSetFlash ++;
							if(CSetFlash > 30) CSetFlash = 0;
							Waitframe();
						}
						
						this->Data = ComboOnFile;
						
						if(YesOrNo == true){
						
							Game->Counter[GASHA_Counter] --;
							GB_GASHA[ID] = 0 + (Rand(100) / 100);
							
							Screen->ComboD[ComboAt(this->X +4, this->Y +4)] = FirstTreeCombo + 2;
							Screen->ComboC[ComboAt(this->X +4, this->Y +4)] = GASHA_Tree_Cset;
							
						}
						
						
					}
					
					
					
					
					
					
					
					
					
				}
				
				
				Waitframe();
			}
		}
		else if(GB_GASHA[ID] < 40){
			//Sapling stage
			Screen->ComboD[ComboAt(this->X +4, this->Y +4)] = FirstTreeCombo + 2;
			Screen->ComboC[ComboAt(this->X +4, this->Y +4)] = GASHA_Tree_Cset;
			
		}
		else if(GB_GASHA[ID] < 60){
			//Grown stage
			GASHA_SpawnTree(this->X + 4, this->Y + 4, GrowDirection, FirstTreeCombo);
			
		}
		else if(GB_GASHA[ID] >= 60){
			//Nut reward stage 1 - 3
			GASHA_SpawnTree(this->X + 4, this->Y + 4, GrowDirection, FirstTreeCombo);
			
			int RewardGrowthCycle = 1;
			if(GB_GASHA[ID] < 90) RewardGrowthCycle = 1;
			else if(GB_GASHA[ID] < 120) RewardGrowthCycle = 2;
			else if(GB_GASHA[ID] >= 120) RewardGrowthCycle = 3;
			
			int RewardID = GASHA_NutContent(RewardGrowthCycle, NutRNG, RewardPool, CustomLoot1, CustomLoot2);
			
			item GashaReward = Screen->CreateItem(RewardID);
			GashaReward->X = NutX;
			GashaReward->Y = NutY;
			GashaReward->DrawXOffset = 16*16;
			GashaReward->Pickup = IP_HOLDUP;
			
			lweapon SwordDe;
			
			bool harvest = false;
			while(!harvest){
				
				for(int i = 0; i <= Screen->NumLWeapons(); i++){

					SwordDe = Screen->LoadLWeapon(i);
					
					if(SwordDe->ID == LW_SWORD && Collision(SwordDe, GashaReward) && Link->Z == 0){
						harvest = true;
						i = i + 999;
					} 
				}
				
				
				if(GashaReward->isValid()) Screen->FastCombo(6, GashaReward->X, GashaReward->Y, FirstTreeCombo + 3, GASHA_Nut_Cset, OP_OPAQUE);
				else{
					harvest = true;
				}
				
				Waitframe();
			}
			
			GashaReward->Z = 16;
			GashaReward->Y = GashaReward->Y + 16;
			
			int ReduceZ_Fcount = 0;
			
			this->Data = FreezeCombo;
			while(GashaReward->X != Link->X || GashaReward->Y != Link->Y){
				
				
				
				if(GashaReward->X < Link->X - 8) GashaReward->X = GashaReward->X + 2;
				else if(GashaReward->X < Link->X) GashaReward->X ++;
				else if(GashaReward->X > Link->X + 8) GashaReward->X = GashaReward->X - 2;
				else if(GashaReward->X > Link->X) GashaReward->X --;
				
				if(GashaReward->Y < Link->Y - 8) GashaReward->Y = GashaReward->Y + 2;
				else if(GashaReward->Y < Link->Y) GashaReward->Y ++;
				else if(GashaReward->Y > Link->Y + 8) GashaReward->Y = GashaReward->Y - 2;
				else if(GashaReward->Y > Link->Y) GashaReward->Y --;
				
				if(ReduceZ_Fcount < 4) GashaReward->Z = 16;
				else if(ReduceZ_Fcount < 8) GashaReward->Z = 15;
				else{
					GashaReward->Z = 14;
				} 
				
				Screen->FastCombo(6, GashaReward->X, GashaReward->Y - GashaReward->Z, FirstTreeCombo + 3, GASHA_Nut_Cset, OP_OPAQUE);
				ReduceZ_Fcount ++;
				Waitframe();
			}

			GashaReward->DrawXOffset = 0;
			GashaReward->Jump = -10;
			
			this->Data = ComboOnFile;
			GB_GASHA[ID] = -1;
			//if piece of heart, increase PoH count
			if(RewardID == GASHA_R_PoH) GB_GASHA[GASHA_PoH_ID] ++;
			
		}
		
		
		
	}
}



int GASHA_NutContent(int GrowthCycle, int NutRNG, int SoilTier, int C_Loot1, int C_Loot2){
	
	int NutContents = 0;
	int Ring1 = 0;
	int Ring2 = 0;
	int Ring3 = 0;
	
	bool CustomPool = false;
	if(C_Loot1 != 0 && C_Loot2 != 0){
		
		CustomPool = true;
		
	}
	else if(SoilTier <= 1){
		Ring1 = GASHA_R_Ring1;
		Ring2 = GASHA_R_Ring2;
	}
	else if(SoilTier == 2){
		Ring1 = GASHA_R_Ring3;
		Ring2 = GASHA_R_Ring4;
	}
	else if(SoilTier == 3){
		Ring1 = GASHA_R_Ring5;
		Ring2 = GASHA_R_Ring6;
	}
	else if(SoilTier >= 4){
		Ring1 = GASHA_R_Ring2;
		Ring2 = GASHA_R_Ring4;
		Ring3 = GASHA_R_Ring6;
	}
	
	//---------------
	
	if(GrowthCycle == 1){
		//mostly trash
		if(NutRNG < 10) NutContents = GASHA_R_Rupee2;
		else if(NutRNG < 50) NutContents = GASHA_R_Rupee1;
		else if(NutRNG < 65) NutContents = GASHA_R_Trash2;
		else{
			NutContents = GASHA_R_Trash1;
		}
		
	}
	else if(GrowthCycle == 2){
		
		if(NutRNG < 10) NutContents = GASHA_R_Rupee3;
		else if(NutRNG < 15) NutContents = GASHA_R_Trash2;
		else{
			NutContents = GASHA_R_Rupee2;
		}
		
	}
	else if(GrowthCycle == 3 && CustomPool == true){
		
		if(NutRNG < 20) NutContents = SoilTier;
		else if(NutRNG < 60) NutContents = C_Loot1;
		else{
			NutContents = C_Loot2;
		}
		
	}
	else if(GrowthCycle == 3 && SoilTier == 4){
		
		if(NutRNG < 25 && GB_GASHA[GASHA_PoH_ID] < GASHA_PoH_Amount) NutContents = GASHA_R_PoH;
		else if(NutRNG < 40) NutContents = Ring1;
		else if(NutRNG < 70) NutContents = Ring2;
		else{
			NutContents = Ring3;
		}
		
	}
	else if(GrowthCycle == 3){
		
		if(NutRNG < 10) NutContents = GASHA_R_Rupee4;
		else if(NutRNG < 55) NutContents = Ring1;
		else{
			NutContents = Ring2;
		}
		
	}
	
	return NutContents;
}


void GASHA_SpawnTree(int ffc_X, int ffc_Y, int GrowDirection, int FirstTreeCombo){
	
	if(GrowDirection == 0){
		Screen->ComboD[ComboAt(ffc_X - 16, ffc_Y - 16)] = FirstTreeCombo + 0;
		Screen->ComboD[ComboAt(ffc_X - 0, ffc_Y - 16)] = FirstTreeCombo + 1;
		Screen->ComboD[ComboAt(ffc_X - 16, ffc_Y - 0)] = FirstTreeCombo + 4;
		Screen->ComboD[ComboAt(ffc_X - 0, ffc_Y - 0)] = FirstTreeCombo + 5;
		
		Screen->ComboC[ComboAt(ffc_X - 16, ffc_Y - 16)] = GASHA_Tree_Cset;
		Screen->ComboC[ComboAt(ffc_X - 0, ffc_Y - 16)] = GASHA_Tree_Cset;
		Screen->ComboC[ComboAt(ffc_X - 16, ffc_Y - 0)] = GASHA_Tree_Cset;
		Screen->ComboC[ComboAt(ffc_X - 0, ffc_Y - 0)] = GASHA_Tree_Cset;
	}
	else if(GrowDirection == 1){
		Screen->ComboD[ComboAt(ffc_X - 0, ffc_Y - 16)] = FirstTreeCombo + 0;
		Screen->ComboD[ComboAt(ffc_X + 16, ffc_Y - 16)] = FirstTreeCombo + 1;
		Screen->ComboD[ComboAt(ffc_X - 0, ffc_Y - 0)] = FirstTreeCombo + 4;
		Screen->ComboD[ComboAt(ffc_X + 16, ffc_Y - 0)] = FirstTreeCombo + 5;
		
		Screen->ComboC[ComboAt(ffc_X - 0, ffc_Y - 16)] = GASHA_Tree_Cset;
		Screen->ComboC[ComboAt(ffc_X + 16, ffc_Y - 16)] = GASHA_Tree_Cset;
		Screen->ComboC[ComboAt(ffc_X - 0, ffc_Y - 0)] = GASHA_Tree_Cset;
		Screen->ComboC[ComboAt(ffc_X + 16, ffc_Y - 0)] = GASHA_Tree_Cset;
	}
	else if(GrowDirection == 2){
		Screen->ComboD[ComboAt(ffc_X - 16, ffc_Y - 0)] = FirstTreeCombo + 0;
		Screen->ComboD[ComboAt(ffc_X + 0, ffc_Y - 0)] = FirstTreeCombo + 1;
		Screen->ComboD[ComboAt(ffc_X - 16, ffc_Y + 16)] = FirstTreeCombo + 4;
		Screen->ComboD[ComboAt(ffc_X + 0, ffc_Y + 16)] = FirstTreeCombo + 5;
		
		Screen->ComboC[ComboAt(ffc_X - 16, ffc_Y - 0)] = GASHA_Tree_Cset;
		Screen->ComboC[ComboAt(ffc_X - 0, ffc_Y - 0)] = GASHA_Tree_Cset;
		Screen->ComboC[ComboAt(ffc_X - 16, ffc_Y + 16)] = GASHA_Tree_Cset;
		Screen->ComboC[ComboAt(ffc_X - 0, ffc_Y + 16)] = GASHA_Tree_Cset;
	}
	else if(GrowDirection == 3){
		Screen->ComboD[ComboAt(ffc_X - 0, ffc_Y - 0)] = FirstTreeCombo + 0;
		Screen->ComboD[ComboAt(ffc_X + 16, ffc_Y - 0)] = FirstTreeCombo + 1;
		Screen->ComboD[ComboAt(ffc_X - 0, ffc_Y + 16)] = FirstTreeCombo + 4;
		Screen->ComboD[ComboAt(ffc_X + 16, ffc_Y + 16)] = FirstTreeCombo + 5;
		
		Screen->ComboC[ComboAt(ffc_X - 0, ffc_Y - 0)] = GASHA_Tree_Cset;
		Screen->ComboC[ComboAt(ffc_X + 16, ffc_Y - 0)] = GASHA_Tree_Cset;
		Screen->ComboC[ComboAt(ffc_X - 0, ffc_Y + 16)] = GASHA_Tree_Cset;
		Screen->ComboC[ComboAt(ffc_X + 16, ffc_Y + 16)] = GASHA_Tree_Cset;
	}
	
	
}




int GASHA_NutX(int ffc_X, int ffc_Y, int GrowDirection){
	int NutX = ffc_X;
	if(GrowDirection == 0){
		NutX = ffc_X - 8;
	}
	else if(GrowDirection == 1){
		NutX = ffc_X + 8;
	}
	else if(GrowDirection == 2){
		NutX = ffc_X - 8;
	}
	else if(GrowDirection == 3){
		NutX = ffc_X + 8;
	}
	
	return NutX;
}
int GASHA_NutY(int ffc_X, int ffc_Y, int GrowDirection){
	int NutY = ffc_Y;
	if(GrowDirection == 0){
		NutY = ffc_Y - 8;
	}
	else if(GrowDirection == 1){
		NutY = ffc_Y - 8;
	}
	else if(GrowDirection == 2){
		NutY = ffc_Y + 8;
	}
	else if(GrowDirection == 3){
		NutY = ffc_Y + 8;
	}
	
	return NutY;
}







const int GASHA_DYINGTIMER = 5;

bool GB_Gasha_IsDying(npc nme){
	if(nme->isValid() && nme->HP <= 0){
		return true;
	}
	else{
		return false;
	}
}

void GB_Gasha_EnemyDying(){
	for(int i = 1; i <= Screen->NumNPCs(); i ++){
		
		npc nme = Screen->LoadNPC(i); //Loads the NPC
		if(GB_Gasha_IsDying(nme)){ //Check to see if the NPC is dying.
		
			if(nme->Misc[GASHA_DYINGTIMER] == 14){
				
				
				for(int i = 0; i < 98; i++){
				
					if(GB_GASHA[i] > -1) GB_GASHA[i] ++;
					if(Link->Item[GASHA_Ring_ID] && GASHA_Ring_ID != 0 && GB_GASHA[i] > -1) GB_GASHA[i] ++;

				}
				
				
			}
			nme->Misc[GASHA_DYINGTIMER] ++; //Increment the NPC's dying timer
		}
	}
}