/**************************************************************************************************
 * Program:		New Miracles for Black & White 2
 * Purpose:		Lava.txt contains all the scripts needed for a miracle which creates puddles of lava
 * Author:		Bill
 * Version: 	0
 * Date: 		Feb 2 2020
**************************************************************************************************/
//-------------------------------------------Scripts-----------------------------------------------
define script NMsLava_createSymbolicBubble(idx, xPos, yPos, zPos, t_idx)
define script NMsLava_createMiracleInHand
define script NMsLava_hideSymbolicBubble(m_idx)
define script NMsLava_CastPour(pwr,idx)
define script NMsLava_CastThrown(pwr,idx)
define script NMsLava_deleteMiracleInHand(idx)
define script NMsLava_calculateMana(m_idx,pwr)
//------------------------------------------Constants----------------------------------------------
define NMsLava_MAXACTIVE			= 20
//-------------------------------------------Globals-----------------------------------------------
global NMsLava_Count 				= 0

global NMsLava_Hand[NMsLava_MAXACTIVE]
global NMsLava_HandV1[NMsLava_MAXACTIVE]
global NMsLava_HandV2[NMsLava_MAXACTIVE]
global NMsLava_HandActive[NMsLava_MAXACTIVE]

global NMsLava_HandLock				= NMs_FALSE		//Lock variable for NMsLava_createMiracleInHand
global NMsLava_HandResult			= 0				//Result variable for NMsLava_createMiracleInHand

global NMsLava_Casting 				= NMs_FALSE
global NMsLava_Pile 				= 0

//--------------------------------------------Code-------------------------------------------------
begin script NMsLava_createSymbolicBubble(idx, xPos, yPos, zPos, t_idx)
	calIdx = idx * NMs_MIR2D
	visHeight = 0
start
	visHeight = yPos + land height at {xPos,zPos}
	NMs_Miracles[calIdx + NMs_MIRTOTEM] = t_idx
	//Symbol Creation
	NMs_Miracles[calIdx + NMs_MIRSYMBOL] = create with angle 0 and scale 0.8 SCRIPT_OBJECT_TYPE_FEATURE FEATURE_INFO_AZTC_SUNTEMPLE at {xPos,yPos,zPos}+{0,1,0}
	override mesh for NMs_Miracles[calIdx + NMs_MIRSYMBOL] with "..\models\m_lavaball" //m_greek_tf_urnshrapnel
	SCRIPT_OBJECT_PROPERTY_TYPE_YPOS of NMs_Miracles[calIdx + NMs_MIRSYMBOL] = yPos + 1
	
	//Bubble Creation
	NMs_Miracles[calIdx + NMs_MIROBJ1] = create visual effect VISUAL_MIRACLE_FIRE_SEED at {xPos,visHeight,zPos}+{0,1,0} time -1	
	NMs_Miracles[calIdx + NMs_MIROBJ2] = create visual effect VISUAL_EFFECT_HAND at {xPos,visHeight,zPos}+{0,1,0} time -1	
	//Scaling and Colouring
	SCRIPT_OBJECT_PROPERTY_TYPE_SCALE of NMs_Miracles[calIdx + NMs_MIROBJ2] = 0.6
	//SCRIPT_OBJECT_PROPERTY_TYPE_SPEED of NMs_Miracles[calIdx + NMs_MIROBJ2] = 0.6
	set NMs_Miracles[calIdx + NMs_MIROBJ1] colour red 173 green 52 blue 0
	//set NMs_Miracles[calIdx + NMs_MIROBJ2] colour red 164 green 7 blue 255
	
	//Interaction commands
	disable NMs_Miracles[calIdx + NMs_MIRSYMBOL] pickup
	disable NMs_Miracles[calIdx + NMs_MIRSYMBOL] set on fire
	disable NMs_Miracles[calIdx + NMs_MIRSYMBOL] moveable
	
	enable NMs_Miracles[calIdx + NMs_MIRSYMBOL] interactable
	enable NMs_Miracles[calIdx + NMs_MIRSYMBOL] cylindar override
	
	//Other initialization
	NMs_Miracles[calIdx + NMs_VISIBLE] = NMs_TRUE
	NMs_Miracles[calIdx + NMs_MIRTYPE] = NMs_LAVA
	
end script NMsLava_createSymbolicBubble

//Create the miracle in the player's hand
begin script NMsLava_createMiracleInHand
	idx = -1
	cnt = 0
start
	while((cnt < NMsLava_MAXACTIVE) and (idx == -1))
		if(NMsLava_HandActive[cnt] == NMs_FALSE)
			idx = cnt
		end if
		cnt++
	end while
	
	NMsLava_HandResult = idx
	NMsLava_HandActive[idx] = NMs_TRUE
	
	//Symbol Creation
	NMsLava_Hand[idx] = create with angle 0 and scale 0.8 SCRIPT_OBJECT_TYPE_MOBILE_STATIC MOBILE_STATC_HAY_BALE at hand position
	override mesh for NMsLava_Hand[idx] with "..\models\m_lavaball"
	//set NMsLava_Hand[idx] colour red 100 green 100 blue 10
	//Bubble Creation
	NMsLava_HandV1[idx] = create visual effect VISUAL_MIRACLE_FIRE_IN_HAND on NMsLava_Hand[idx] time -1	
	NMsLava_HandV2[idx] = create visual effect VISUAL_EFFECT_HAND on NMsLava_Hand[idx] time -1	
	set NMsLava_Hand[idx] in player 0 hand
	//Scaling and Colouring
	SCRIPT_OBJECT_PROPERTY_TYPE_SCALE of NMsLava_HandV2[idx] = 0.6
	//SCRIPT_OBJECT_PROPERTY_TYPE_SPEED of NMsLava_HandV2[idx] = 0.5
	set NMsLava_HandV1[idx] colour red 173 green 52 blue 0
	
end script NMsLava_createMiracleInHand

//Deletes the miracle in the player's hand
begin script NMsLava_deleteMiracleInHand(idx)

start
	NMsLava_HandActive[idx] = NMs_FALSE
	delete NMsLava_Hand[idx]
	stop visual effect NMsLava_HandV1[idx]
	stop visual effect NMsLava_HandV2[idx]
end script NMsLava_deleteMiracleInHand

//Hides the symbolic representation from the totem
begin script NMsLava_hideSymbolicBubble(m_idx)
	m_ele = m_idx
	vis1 = 0
start
	delete NMs_Miracles[m_ele + NMs_MIRSYMBOL] with fade
	stop visual effect NMs_Miracles[m_ele + NMs_MIROBJ1]
	stop visual effect NMs_Miracles[m_ele + NMs_MIROBJ2]
end script NMsLava_hideSymbolicBubble

//Calculates the mana required for this miracle, depending on the power passed in
begin script NMsLava_calculateMana(m_idx,pwr)
	m_ele = m_idx * NMs_MIR2D
	m_mana = 0
start
	m_mana = 1500 * pwr
	if(m_mana < 1500) //Minimum
		m_mana = 1500
	end if
	NMs_Miracles[m_ele + NMs_MANA] = m_mana
end script NMsLava_calculateMana

//Script for pouring the miracle, NMsLava_Casting is set false upon completion of the cast
//	Either by the amount of wheat is reached or the cancel is hit
begin script NMsLava_CastPour(pwr, idx)
	amt = 0
	v_Pour = 0
	t_Amount = 0
	currentAmt = 0
	t_PerTick = 0
	
	pos = 0
	typ = 0
	
	v_dr = 0
	v_f = 0
	s_r = 0
	vis = 0
	vis2 = 0
	ti_Tmr = create timer for 0 seconds
start
	NMsLava_Casting = NMs_TRUE
	if(NMsLava_HandActive[idx] == NMs_TRUE)
		set NMsLava_Hand[idx] in player 0 hand
		
		//Calculate
		t_Amount = pwr - 2
		if(t_Amount < 1)
			t_Amount = 1
		end if
		s_r = 3
		
		pos = marker at {NMsLava_Hand[idx]}
		
		v_Pour = create visual effect VISUAL_MIRACLE_LAVA_POURING on NMsLava_Hand[idx] time -1
		
		set ti_Tmr time to 0.3 seconds
		
		begin loop		
			set NMsLava_Hand[idx] in player 0 hand
			if((get ti_Tmr time remaining == 0) and (bindable action BINDABLE_ACTION_TYPE_ACTION performed) and (get player 0 influence at hand position > 0.1))				
				amt++
				
				pos = marker at {NMsLava_Hand[idx]}
				
				vis = create visual effect VISUAL_EFFECT_EPIC_VOLCANO_LAVA_EXPLOSION at {pos} time 5
				vis2 = create visual effect VISUAL_EFFECT_CREATURE_IMPACT at {pos} time 5
				SCRIPT_OBJECT_PROPERTY_TYPE_SCALE of vis = 0.15
				play string sound "SCRIPT29_SIEGEWEAPONHITOBJECT"
				set lava puddle at {pos} radius s_r temperature 1
				set lava running at {pos} heading {0,0,0}
				add effect EFFECT_TYPE_HIT at {pos} strength 3.0 radius 5
				add effect EFFECT_TYPE_BURN at {pos} strength 3.0 radius 5
				add effect EFFECT_TYPE_APPLY_FORCE at {pos} strength 3.0 radius 5
				set ti_Tmr time to 0.3 seconds
			end if
			until ((amt >= t_Amount) or (bindable action BINDABLE_ACTION_TYPE_CANCEL_CURRENT_ACTION performed))
		end loop
		
		stop visual effect v_Pour
		run script NMsLava_deleteMiracleInHand(idx)
	end if
	
	NMsLava_Casting = NMs_FALSE
end script NMsLava_CastPour

//Script for throwing the miracle, NMsLava_Casting is set false upon completion of the cast
begin script NMsLava_CastThrown(pwr, idx)
	t_Amount = 0
	currentAmt = 0
	ti_Tmr = create timer for 60 seconds
	effect_go = NMs_TRUE
	pos = 0	//Position of the miracle when it hits something
	posX = 0
	posZ = 0
	rad = 0
	ang = 0
	cnt = 0
	s_c = 0
	s_r = 0
	vis = 0
	vis2 = 0
	mk = 0
	rd = 0
start
	NMsLava_Casting = NMs_TRUE
	if(NMsLava_HandActive[idx] == NMs_TRUE)
		//Calculate
		t_Amount = pwr - 2
		if(t_Amount < 1)
			t_Amount = 1
		end if
		rad = (1.1 * t_Amount) + 10
		if(rad > 20)
			rad = 20
		end if
		rd = 1
		ang = 0
		
		s_r = 3
		s_c = 5
		//Enable physics tracking
		enable NMsLava_Hand[idx] physics tracking
		
		//Wait until something happens, or the time limit is hit
		wait until ((NMsLava_Hand[idx] hit) or (NMsLava_Hand[idx] hit land) or (get ti_Tmr time remaining == 0) or (not NMsLava_Hand[idx] is moving))
		
		//If the time limit is reached, then something has gone terribly wrong! Exit at once!
		if(get ti_Tmr time remaining == 0)
			effect_go = NMs_FALSE
		end if
		
		pos = marker at {NMsLava_Hand[idx]}
		
		//Remove the miracle in hand representation
		run script NMsLava_deleteMiracleInHand(idx)
		
		if(effect_go == NMs_TRUE)
			//Create puddle at different positions around where the hit location is
			//	As the power level increases the puddle size increases and get spread out more
			//	t_Amount = the number of puddles
			
			vis = create visual effect VISUAL_EFFECT_EPIC_VOLCANO_LAVA_EXPLOSION at {pos} time 5
			vis2 = create visual effect VISUAL_EFFECT_CREATURE_IMPACT at {pos} time 5
			SCRIPT_OBJECT_PROPERTY_TYPE_SCALE of vis = 0.2
			play string sound "SCRIPT29_SIEGEWEAPONHITOBJECT"
			set lava puddle at {pos} radius s_c temperature 1
			set lava running at {pos} heading {0,0,0}
			add effect EFFECT_TYPE_HIT at {pos} strength 3.0 radius 7
			add effect EFFECT_TYPE_BURN at {pos} strength 3.0 radius 7
			add effect EFFECT_TYPE_APPLY_FORCE at {pos} strength 3.0 radius 7
			cnt++
			
			//Calculate positions	
			while(cnt < t_Amount)
				posX = SCRIPT_OBJECT_PROPERTY_TYPE_XPOS of pos + ((rad) / NMs_MATHTHING) * cos(ang)
				posZ = SCRIPT_OBJECT_PROPERTY_TYPE_ZPOS of pos + ((rad) / NMs_MATHTHING) * sin(ang)
				ang += (36 / rd)
				if(ang > 360)
					ang = 0
					rd++
					rad += 10
				end if
				mk = marker at {posX, land height at {posX,posZ},posZ}
				
				vis2 = create visual effect VISUAL_EFFECT_EPIC_VOLCANO_LAVA_EXPLOSION at {mk} time 5
				vis = create visual effect VISUAL_EFFECT_CREATURE_IMPACT at {mk} time 5
				SCRIPT_OBJECT_PROPERTY_TYPE_SCALE of vis2 = 0.15
				play string sound "SCRIPT29_SIEGEWEAPONHITOBJECT"
				set lava puddle at {posX, posZ} radius s_r temperature 0.8
				set lava running at {posX, posZ} heading {0,0,0}
				add effect EFFECT_TYPE_HIT at {posX, posZ} strength 3.0 radius 5
				add effect EFFECT_TYPE_BURN at {posX, posZ} strength 3.0 radius 5
				add effect EFFECT_TYPE_APPLY_FORCE at {posX, posZ} strength 3.0 radius 5
				cnt++
			end while
		end if
	end if
	NMsLava_Casting = NMs_FALSE
end script NMsLava_CastThrown
