package com.lloydm.javakogengine;

class Trigger
{
	public static int number; 
	public static int MAXTRIGGER = 1000;
	public static int TYPE_VICTORY = 1;
	public static int TYPE_DEFEAT = 2;
	public static int TYPE_CHATTER = 3;
	public static int TYPE_INACTIVECHATTER = 4;
	public static int TYPE_ACTIVATECHATTER = 5;
	public static int TYPE_DEATHCOUNT = 6;
	public static int TYPE_RETREAT = 7;
	public static int TYPE_FIRE = 8;
	public static int TYPE_SPAWNER = 9;
	public static int DEFAULTSPAWNERCOUNT = 25;
	public static int TYPE_ACTIVATE = 10;
	public static int TYPE_HEALING = 11;
	public static int TYPE_MAKEFRIEND = 12;
	public static int TYPE_MAKEENEMY = 13;
	public static int TYPE_MAKENEUTRAL = 14;		
	public static int TYPE_MOVETO = 15;
	public static int TYPE_LOOP = 16;
	public static int TYPE_SETAI = 17;
	public static int TYPE_OR_DEFEAT = 18;
	public static int TYPE_SETCORNER = 19; //1mar2021
	//25mar2021 CREATION,REMOVAL and ANY FRIEND,ENEMY OR ALL Not Implemented Yet.
	public static int TYPE_CREATE = 20;//25mar2021
	public static int TYPE_REMOVE = 21;//25mar2021
	public static int TYPE_CHATTERBACKGROUNDIMAGE = 22;//10sep2021
	public static int TYPE_CHATTERAUDIO = 23;//10sep2021
	public static int TYPE_EXITTOMISSION = 24;//12sep2021
	
	public int img;//10sep2021
	public int audio;//10sep2021
	//
	public static String TYPE_FRIEND = "*FRIEND";//25mar2021
	public static String TYPE_ENEMY = "*ENEMY";//25mar2021
	public static String TYPE_ANY = "*ANY";//25mar2021
	
	public int type;
	public static int EQUAL = 0;
	public static int LESSTHAN = -1;
	public static int MORETHAN = 1;
	public int comparator;
	public int n;
	public String unitname;
	public int x;
	public int y;
	public int fx;
	public int fy;
	public int timelimit;
	public boolean completed;
	public int completetime;
	public boolean failed;
	public boolean repeat;

///////////////////Method Definition///////////////
	public Trigger()
	{
		completed = false;
		repeat = false;
		failed = false;
		completetime = 180;
	}

///////////////////Method Definition///////////////
	public static void cleartrigger(Game game,int i)
	{
		//initialise triggers
		Game.triggers[i].type = 0;
		Game.triggers[i].comparator = 0;
		Game.triggers[i].n = 0;
		Game.triggers[i].unitname = "";
		Game.triggers[i].x = 0;
		Game.triggers[i].y = 0;
		Game.triggers[i].fx = 0;
		Game.triggers[i].fy = 0;
		Game.triggers[i].img = -1;//10sep2021
		Game.triggers[i].audio = -1;//10sep2021
	}

///////////////////Method Definition///////////////
	public Trigger(Game game,int typ,int comp,int m,String name, int xx, int yy, int ww, int hh)
	{
		type = typ;
		if(type!=0)
		{
			number++;
		}
		n = m;
		comparator = comp;
		unitname = name;
		if(unitname!=null){unitname.replace("^",",");}
		x = xx;
		y = yy;
		if(ww==-1)
		{
			ww = Map.MAXX;
		}
		if(hh==-1)
		{
			hh = Map.MAXY;
		}
		fx = ww;
		fy = hh;
		completetime = 60 * 10;
		img = -1;//10sep2021
		audio = -1;//10sep2021
		//Game.triggers[nexttrigger].timelimit = time;
		//Game.triggers[nexttrigger].repeat = rpt;
	}

///////////////////Method Definition///////////////
	public static void updateall(Game game)
	{
		//update the triggers in the game
		//for defeat ALL defeat triggers must be completed
		int dcount = 0;
		int vcount = 0;
		//for victory ALL victory triggers must be completed
		Game.paused = false;
		for(int i=0;i<Trigger.number;i++)
		{
			if(Game.triggers[i].type==TYPE_CHATTER)
			{
				Game.playerready = true;
				if(Game.triggers[i].completed==false)
				{
					Game.playerready=false;
				}
			}
		}
		for(int i=0;i<Trigger.number;i++)
		{
			if(Game.triggers[i].type==0)
			{
				continue;
			}
			if(Game.triggers[i].type==TYPE_OR_DEFEAT || Game.triggers[i].type==TYPE_DEFEAT)
			{
				dcount++;
			}
			if(Game.triggers[i].type==TYPE_VICTORY)
			{
				vcount++;
			}
			if(Game.triggers[i].type==TYPE_DEATHCOUNT || Game.triggers[i].type==TYPE_ACTIVATE)
			{
				if(Game.triggers[i].y==0 && Game.triggers[i].fy==0)
				{
					if(Game.triggers[i].x==TYPE_DEFEAT || Game.triggers[i].x==TYPE_OR_DEFEAT)
					{
						dcount++;
					}
					if(Game.triggers[i].x==TYPE_VICTORY)
					{
						vcount++;
					}
				}
			}
			if(Game.triggers[i].type==TYPE_INACTIVECHATTER)
			{
				continue;
			}
			if(Game.triggers[i].completed==false)
			{
				if(Game.triggers[i].type==TYPE_CHATTER)
				{
					//stay on screen until a click is pressed......
					String[] message = Game.triggers[i].unitname.split("\\|");
					int factor = 0;
					if(Game.LETTERBOX)
					{
						factor = Game.fonts[Resources.FONT].ptsize;
					}
					if(message.length>0)
					{
						for(int j=0;j<message.length;j++)
						{
							RenderList.drawtext(game,Game.triggers[i].x,Game.triggers[i].y + j * (factor + 4+Game.fonts[Resources.FONT].ptsize),message[j],RenderList.getrgb(255,255,200),Game.fonts[Resources.FONT].font,false);
						}
					}
					//Game.triggers[i].completetime--;
					int triggerlink = Game.triggers[i].n;
					int index = Game.triggers[i].comparator;
					if(Game.mlclick==true || Game.mrclick==true)
					{
						Game.triggers[i].completed = true;
					}
					else
					{
						Game.paused = true;
					}
					if(triggerlink>0)
					{
						for(int j=0;j<Game.gui.length;j++)
						{
							if(Game.gui[j].triggerlink==triggerlink)
							{
								Game.gui[j].hidden = 0;
								Game.gui[j].index = index;
								if(Game.triggers[i].completed)
								{
									Game.gui[j].hidden = 1;
								}
							}
						}
						//start-----------------//10sep2021
						if(i<Game.triggers.length)
						{
							for(int aa=1;aa<=2;aa++)
							{
								if(i + aa >= Game.triggers.length)
								{
									continue;
								}
								if(Game.triggers[i + aa].type!=TYPE_CHATTERAUDIO && Game.triggers[i + aa].type!=TYPE_CHATTERBACKGROUNDIMAGE)
								{
									break;
								}
								if(Game.triggers[i + aa].type==TYPE_CHATTERAUDIO)
								{
									if(Game.triggers[i + aa].audio==-1)
									{
										Game.triggers[i + aa].audio = Resources.LoadAudio(game,Game.triggers[i + aa].unitname,false);//
										if(Game.triggers[i + aa].audio!=-1)
										{
											Game.triggers[i + aa].x = Audios.playsound(Game.audios[Game.triggers[i + aa].audio],Game.FXVOLUME);
										}
										else
										{
											Game.triggers[i + aa].x = -1;
										}
									}
									if(Game.triggers[i].completed)
									{
										Audios.stopchannel(Game.triggers[i + aa].x);
										Audios.freeaudio(Game.audios[Game.triggers[i+aa].audio]);
									}
								}
								if(Game.triggers[i + aa].type==TYPE_CHATTERBACKGROUNDIMAGE)
								{
									if(Game.triggers[i + aa].img==-1)
									{
										//(Game game,String file,IntPtr renderer,int w,int h) //note the slight change.....added w and h as can't work out how to do it otherwise....
										Game.triggers[i + aa].img = Resources.LoadImage(game,Game.triggers[i + aa].unitname,Game.renderer,Game.triggers[i + aa].fx,Game.triggers[i + aa].fy);
									}
									for(int j=0;j<Game.gui.length;j++)
									{
										if(Game.gui[j].triggerlink==Game.triggers[i + aa].n)
										{
											Game.gui[j].hidden = 0;
											Game.gui[j].index = 0;
											Game.gui[j].image = Game.triggers[i + aa].img;
											Game.gui[j].tmpimage = Game.triggers[i + aa].img;
											Game.gui[j].x = Game.triggers[i + aa].x;
											Game.gui[j].y = Game.triggers[i + aa].y;
											Game.gui[j].w = Game.triggers[i + aa].fx;
											Game.gui[j].h = Game.triggers[i + aa].fy;
											if(Game.triggers[i].completed)
											{
												Game.gui[j].hidden = 1;
											}
										}
									}
								}
							}
						}
						//end-------------------//10sep2021
					}
					return;
				}
				else
				{
					//check if this one is completed....
					if(Game.triggers[i].timelimit>0)
					{
						if(Game.frame % 60==0)
						{
							Game.triggers[i].timelimit--;
						}
					}
					if((Game.frame + i) % 20 != 0)//20sep2021 120 to 20	
					{
						continue;
					}
					int count = 0;
					if(Game.triggers[i].type==TYPE_DEATHCOUNT)
					{
						for(int d=0;d<Game.templates.length;d++)
						{
							//not implemented yet...23mar2021
							//if(Game.templates[d].name==Game.triggers[i].unitname)//25mar2021
							if(Game.templates[d].name.equals(Game.triggers[i].unitname) || (Game.triggers[i].unitname.equals(TYPE_ANY))|| (Game.triggers[i].unitname.equals(TYPE_FRIEND) && Game.templates[d].faction==Game.PLAYERFACTION) || (Game.triggers[i].unitname.equals(TYPE_ENEMY) && Game.templates[d].faction!=Game.PLAYERFACTION && Game.templates[d].faction!=Unit.NULLFACTION))//25mar2021
							{
								count+=Game.templates[d].deaths;
							}
						}						
					}
					else
					{
						for(int xx=Game.triggers[i].x;xx<=Game.triggers[i].fx;xx++)
						{
							for(int yy=Game.triggers[i].y;yy<=Game.triggers[i].fy;yy++)
							{
								int nid = Map.cellunit(xx * Map.GRIDW,yy * Map.GRIDH);
								if(nid!=-1)
								{
									//if(Game.units[nid].name==Game.triggers[i].unitname && Game.units[nid].hp>0)//25mar2021
									if((Game.units[nid].name.equals(Game.triggers[i].unitname) || (Game.triggers[i].unitname.equals(TYPE_ANY)) || (Game.triggers[i].unitname.equals(TYPE_FRIEND) && Game.units[nid].faction==Game.PLAYERFACTION) || (Game.triggers[i].unitname.equals(TYPE_ENEMY) && Game.units[nid].faction!=Unit.NULLFACTION && Game.units[nid].faction!=Game.PLAYERFACTION)) && Game.units[nid].hp>0)//25mar2021
									{
										count++;
									}
								}
							}
						}
					}
					switch(Game.triggers[i].comparator)
					{
						case 0:
						if(count==Game.triggers[i].n)
						{
							Game.triggers[i].completed = true;
						}
						break;
						case -1:
						if(count<Game.triggers[i].n)
						{
							Game.triggers[i].completed = true;
						}
						break;
						case 1:
						if(count>Game.triggers[i].n)
						{
							Game.triggers[i].completed = true;
						}
						break;
					}
					if(Game.triggers[i].completed==true && (Game.triggers[i].type==TYPE_ACTIVATE || Game.triggers[i].type==TYPE_DEATHCOUNT))
					{
						int j = i + 1;
						if(j<Game.triggers.length)
						{
							if(Game.triggers[j].type==TYPE_SETAI)
							{
								for(int xx=Game.triggers[j].x;xx<=Game.triggers[j].fx;xx++)
								{
									for(int yy=Game.triggers[j].y;yy<=Game.triggers[j].fy;yy++)
									{
										int nid = Map.cellunit(xx * Map.GRIDW,yy * Map.GRIDH);
										if(nid!=-1)
										{
											//if(Game.units[nid].name==Game.triggers[j].unitname && Game.units[nid].hp>0)//25mar2021
											if((Game.units[nid].name.equals(Game.triggers[j].unitname) || (Game.triggers[j].unitname.equals(TYPE_ANY)) || (Game.triggers[j].unitname.equals(TYPE_FRIEND) && Game.units[nid].faction==Game.PLAYERFACTION) || (Game.triggers[j].unitname.equals(TYPE_ENEMY) && Game.units[nid].faction!=Unit.NULLFACTION && Game.units[nid].faction!=Game.PLAYERFACTION)) && Game.units[nid].hp>0)//25mar2021
											{
												Game.units[nid].ai = Game.triggers[j].n; // ai
												Game.triggers[j].completed = true;		
											}
										}
									}
								}
							}
							if(Game.triggers[i].type==TYPE_ACTIVATE)
							{
								if(Game.triggers[j].type==TYPE_RETREAT)
								{
									for(int xx=Game.triggers[j].x;xx<=Game.triggers[j].fx;xx++)
									{
										for(int yy=Game.triggers[j].y;yy<=Game.triggers[j].fy;yy++)
										{
											int nid = Map.cellunit(xx * Map.GRIDW,yy * Map.GRIDH);
											if(nid!=-1)
											{
												//if(Game.units[nid].name==Game.triggers[j].unitname && Game.units[nid].hp>0)//25mar2021
												if((Game.units[nid].name.equals(Game.triggers[j].unitname) || (Game.triggers[j].unitname.equals(TYPE_ANY)) || (Game.triggers[j].unitname.equals(TYPE_FRIEND) && Game.units[nid].faction==Game.PLAYERFACTION) || (Game.triggers[j].unitname.equals(TYPE_ENEMY) && Game.units[nid].faction!=Unit.NULLFACTION && Game.units[nid].faction!=Game.PLAYERFACTION)) && Game.units[nid].hp>0)//25mar2021
												{
													Game.units[nid].retreat = true;
													if(Game.units[nid].retreatframe==0){Game.units[nid].retreatframe = Game.frame + Unit.RETREATDEATH;}
												}
											}
										}
									}
								}
							}
							if(Game.triggers[j].type==TYPE_MOVETO)
							{
								int countunits = 0;
								for(int xx=Game.triggers[j].x;xx<=Game.triggers[j].fx;xx++)
								{
									for(int yy=Game.triggers[j].y;yy<=Game.triggers[j].fy;yy++)
									{
										int nid = Map.cellunit(xx * Map.GRIDW,yy * Map.GRIDH);
										if(nid!=-1)
										{
											//if(Game.units[nid].name==Game.triggers[j].unitname && Game.units[nid].hp>0)//25mar2021
											if((Game.units[nid].name.equals(Game.triggers[j].unitname) || (Game.triggers[j].unitname==TYPE_ANY) || (Game.triggers[j].unitname.equals(TYPE_FRIEND) && Game.units[nid].faction==Game.PLAYERFACTION) || (Game.triggers[j].unitname.equals(TYPE_ENEMY) && Game.units[nid].faction!=Unit.NULLFACTION && Game.units[nid].faction!=Game.PLAYERFACTION)) && Game.units[nid].hp>0)//25mar2021
											{
												countunits++;
												int noffx = 0;
												int noffy = 0;
												if(countunits>1)
												{
													noffx = (int)Functions.rand(-Map.GRIDW*3,Map.GRIDW*3);
													noffy = (int)Functions.rand(-Map.GRIDH*3,Map.GRIDH*3);
												}
												Game.units[nid].tx = Game.triggers[j].n + noffx; //x
												Game.units[nid].ty = Game.triggers[j].comparator + noffy;
												Game.units[nid].tmptx = Game.units[nid].tx;
												Game.units[nid].tmpty = Game.units[nid].ty;
												Game.units[nid].tmptattempts = 0;
												Game.units[nid].firetargeti = -1;
												Game.units[nid].orderframe = Unit.ORDERTIME;
												Game.triggers[j].completed = true;		
											}
										}
									}
								}
							}
							//start---------------//12sep2021
							if(Game.triggers[j].type==TYPE_EXITTOMISSION)
							{
								//load a new map.....
								Game.triggers[j].completed = true;
								int missionindex = Mission.PickMission(game,Game.triggers[j].unitname,Game.triggers[j].n);
								if(missionindex!=-1)
								{
									Game.chosenmissionindex = missionindex;
									Program.resetgame(game);
									Game.gamestate = Game.CAT_GAMESTATE_GAME;
									Program.cleardeaths(game);
									Game.map = new Map();
									Program.setupmission(game,Game.chosenmissionindex,0);
									Map.adddecor();//2mar2021
									Map.marktreepos(game);
									Functions.seed = Map.levelseed2;
									return;
								}
							}
							//end-----------------//12sep2021
							//start---------------//25mar2021
							if(Game.triggers[j].type==TYPE_CREATE)
							{
								int countunits = 0;
								for(int xx=Game.triggers[j].x;xx<=Game.triggers[j].fx;xx++)
								{
									for(int yy=Game.triggers[j].y;yy<=Game.triggers[j].fy;yy++)
									{
										int nid = Map.cellunit(xx * Map.GRIDW,yy * Map.GRIDH);
										if(nid==-1 && xx>=0 && yy>=0 && xx<Map.MAXX && yy<Map.MAXY) //note the nid==-1
										{
											for(int tmp=0;tmp<Game.templates.length;tmp++)
											{
												if(Game.templates[tmp].name.equals(Game.triggers[j].unitname))
												{
													for(int u=0;u<Game.units.length;u++)
													{
														//check that we don't exist
														if(Game.units[u].hp<=0 && Game.units[u].timedead>Unit.MAXDEADTIME)
														{
															//create one here....
															if(Game.units[u].createunitatxy(game,u,Game.templates[tmp],xx * Map.GRIDW,yy * Map.GRIDH))
															{
																countunits++;
																Game.triggers[j].completed = true;		
															}
															break;
														}
													}
													break;														
												}
											}
										}
										if(countunits>=Game.triggers[j].n && Game.triggers[j].n>0)
										{
											break;
										}
									}
									if(countunits>=Game.triggers[j].n && Game.triggers[j].n>0)
									{
										break;
									}
								}
							}				
							if(Game.triggers[j].type==TYPE_REMOVE)
							{
								int countunits = 0;
								for(int xx=Game.triggers[j].x;xx<=Game.triggers[j].fx;xx++)
								{
									for(int yy=Game.triggers[j].y;yy<=Game.triggers[j].fy;yy++)
									{
										int nid = Map.cellunit(xx * Map.GRIDW,yy * Map.GRIDH);
										if(nid!=-1)
										{
											if(Game.triggers[j].unitname.equals(Game.units[nid].name) || (Game.triggers[j].unitname.equals(TYPE_ANY)) || (Game.triggers[j].unitname.equals(TYPE_FRIEND) && Game.units[nid].faction==Game.PLAYERFACTION) || (Game.triggers[j].unitname.equals(TYPE_ENEMY) && Game.units[nid].faction!=Unit.NULLFACTION && Game.units[nid].faction!=Game.PLAYERFACTION))
											{
												//upto	
												Game.units[nid].hp = 0;
												Map.removeunit(nid,Game.units[nid].x,Game.units[nid].y);
												Game.triggers[j].completed = true;		
												countunits++;
											}
										}
										if(countunits>=Game.triggers[j].n && Game.triggers[j].n>0)
										{
											break;
										}
									}
									if(countunits>=Game.triggers[j].n && Game.triggers[j].n>0)
									{
										break;
									}
								}
							}				
							//end-----------------//25mar2021
							if(Game.triggers[j].type==TYPE_MAKEENEMY || Game.triggers[j].type==TYPE_MAKEFRIEND || Game.triggers[j].type==TYPE_MAKENEUTRAL)
							{
								for(int xx=Game.triggers[j].x;xx<=Game.triggers[j].fx;xx++)
								{
									for(int yy=Game.triggers[j].y;yy<=Game.triggers[j].fy;yy++)
									{
										int nid = Map.cellunit(xx * Map.GRIDW,yy * Map.GRIDH);
										if(nid!=-1)
										{
											//if(Game.units[nid].name==Game.triggers[j].unitname && Game.units[nid].hp>0)//25mar2021
											if((Game.units[nid].name.equals(Game.triggers[j].unitname) || (Game.triggers[j].unitname.equals(TYPE_ANY)) || (Game.triggers[j].unitname.equals(TYPE_FRIEND) && Game.units[nid].faction==Game.PLAYERFACTION) || (Game.triggers[j].unitname.equals(TYPE_ENEMY) && Game.units[nid].faction!=Unit.NULLFACTION && Game.units[nid].faction!=Game.PLAYERFACTION)) && Game.units[nid].hp>0)//25mar2021
											{
												//temporarily halt hostilities between this and other
												//units
												Game.units[nid].firetargeti = -1;
												for(int k=0;k<Game.units.length;k++)
												{
													if(Game.units[k].firetargeti==nid)
													{
														Game.units[k].firetargeti = -1;
													}
												}
												switch(Game.triggers[j].type)
												{
													case 12: // friend
													Game.units[nid].faction = Game.PLAYERFACTION;
													break;
													case 13: //enemy
													Game.units[nid].faction = Game.SKIRMISHENEMYFACTION;//Unit.UNDEAD;
													//26oct2020
													//commented out until we have some other factions in the games
													//
													//if(Game.triggers[j].comparator==Game.triggers[j].n && Game.triggers[j].comparator>0)
													//{
													//	Game.units[nid].faction = Game.triggers[j].comparator;
													//}
													break;
													case 14: //neutral
													Game.units[nid].faction = Unit.NULLFACTION;
													break;
												}
												Game.triggers[j].completed = true;		
											}
										}
									}
								}
							}
							//start--------------//1mar2021
							if(Game.triggers[j].type==TYPE_SETCORNER)
							{
								if(Game.triggers[j].n<100 && Game.triggers[j].comparator<100)
								{
									float nnn = (float)Game.triggers[j].n;
									if(nnn<Game.triggers[j].comparator)
									{
										nnn = (float)Game.triggers[j].comparator;
									}
									if(nnn<0)
									{
										nnn = 0f;
									}
									if(nnn>100)
									{
										nnn = 100f;
									}
									nnn/=100.0f;
									if((Game.frame % 4)==0)
									{
										Game.triggers[j].n++;
										Game.triggers[j].comparator++;
									}
									Game.CORNERX = Game.triggers[j].x + (int)((Game.triggers[j].fx - Game.triggers[j].x) * nnn);
									Game.CORNERY = Game.triggers[j].y + (int)((Game.triggers[j].fy - Game.triggers[j].y) * nnn);
								}
								else
								{
									Game.triggers[j].completed = true;
								}
								//Game.triggers[j].completed = true;
							}
							//end----------------//1mar2021
							if(Game.triggers[j].type==TYPE_HEALING)
							{
								for(int xx=Game.triggers[j].x;xx<=Game.triggers[j].fx;xx++)
								{
									for(int yy=Game.triggers[j].y;yy<=Game.triggers[j].fy;yy++)
									{
										int nid = Map.cellunit(xx * Map.GRIDW,yy * Map.GRIDH);
										if(nid!=-1)
										{
											//if(Game.units[nid].name==Game.triggers[j].unitname && Game.units[nid].hp>0)//25mar2021
											if((Game.units[nid].name.equals(Game.triggers[j].unitname) || (Game.triggers[j].unitname.equals(TYPE_ANY)) || (Game.triggers[j].unitname.equals(TYPE_FRIEND) && Game.units[nid].faction==Game.PLAYERFACTION) || (Game.triggers[j].unitname.equals(TYPE_ENEMY) && Game.units[nid].faction!=Unit.NULLFACTION && Game.units[nid].faction!=Game.PLAYERFACTION)) && Game.units[nid].hp>0)//25mar2021
											{
												Game.units[nid].hp = Game.units[nid].basehp;
												Game.triggers[j].completed = true;
											}
										}
									}
								}
							}
							if(Game.triggers[j].type==TYPE_FIRE)
							{
								for(int xx=Game.triggers[j].x;xx<=Game.triggers[j].fx;xx++)
								{
									for(int yy=Game.triggers[j].y;yy<=Game.triggers[j].fy;yy++)
									{
										if(Functions.rand(0,100)<20)
										{
											Map.setonfire(xx*Map.GRIDW,yy*Map.GRIDH,true); //permanent fire
										}
										Game.triggers[j].completed = true;
									}
								}
							}
							if(Game.triggers[j].type==TYPE_SPAWNER)
							{
								//*ANY etc not implemented yet 25mar2021
								Game.triggers[j].completed = true;
								if(Game.triggers[j].comparator>0 || Game.triggers[j].n>0)
								{
									//turn on spawner
									for(int k=0;k<Game.units.length;k++)
									{
										if(Game.units[k].spawner.equals(Game.triggers[j].unitname) && Game.units[k].spawnertime>0 && Game.units[k].x>Game.triggers[j].x * Map.GRIDW && Game.units[k].y>Game.triggers[j].y * Map.GRIDH && Game.units[k].x<Game.triggers[j].fx * Map.GRIDW && Game.units[k].y<Game.triggers[j].fy * Map.GRIDH)
										{
											Game.units[k].spawnercount = Trigger.DEFAULTSPAWNERCOUNT;
											Game.units[k].spawnertime = 3;
										}
									}
								}
								if(Game.triggers[j].comparator<0 || Game.triggers[j].n<0)
								{
									//turn off spawner
									for(int k=0;k<Game.units.length;k++)
									{
										if(Game.units[k].spawner.equals(Game.triggers[j].unitname) && Game.units[k].spawnertime>0 && Game.units[k].x>Game.triggers[j].x * Map.GRIDW && Game.units[k].y>Game.triggers[j].y * Map.GRIDH && Game.units[k].x<Game.triggers[j].fx * Map.GRIDW && Game.units[k].y<Game.triggers[j].fy * Map.GRIDH)
										{
											Game.units[k].spawnercount = 0;
											Game.units[k].spawnertime = 3;
										}
									}
								}
							}
						}
					}
					if(Game.triggers[i].completed==true && Game.triggers[i].type==TYPE_DEATHCOUNT && Game.triggers[i].x==TYPE_RETREAT && Game.triggers[i].y==0 && Game.triggers[i].fy==0)
					{
						//make enemy soldiers flee away from their fire target instead......
						for(int j=0;j<Game.units.length;j++)
						{
							if(Game.units[j].faction!=Game.PLAYERFACTION && Game.units[j].hp>0)
							{
								Game.units[j].retreat = true;
								if(Game.units[j].retreatframe==0){Game.units[j].retreatframe = Game.frame + Unit.RETREATDEATH;}
							}
						}
					}
					if(Game.triggers[i].completed==true && Game.triggers[i].type==TYPE_ACTIVATECHATTER)
					{
						//find the next group of inactive chatters before the next activate chatter and activate them.....
						//and it has to be after this one...
						//so the sequence of triggers is important.....
						for(int j=0;j<Game.triggers.length;j++)
						{
							if(Game.triggers[j].type==TYPE_INACTIVECHATTER && j==i+1)
							{
								Game.triggers[j].type=TYPE_CHATTER;
							}
							if(Game.triggers[j].type==TYPE_ACTIVATECHATTER && j>i)
							{
								break;
							}
						}
					}
					if(Game.triggers[i].completed==true && Game.triggers[i].type==TYPE_DEATHCOUNT && Game.triggers[i].x==TYPE_ACTIVATECHATTER)
					{
						//find the next group of inactive chatters before the next activate chatter and activate them.....
						//and it has to be after this one...
						//so the sequence of triggers is important.....
						for(int j=0;j<Game.triggers.length;j++)
						{
							if(Game.triggers[j].type==TYPE_INACTIVECHATTER && j==i+1)
							{
								Game.triggers[j].type=TYPE_CHATTER;
							}
							if(Game.triggers[j].type==TYPE_ACTIVATECHATTER && j>i)
							{
								break;
							}
						}
					}
				}
			}
			else
			{
			}
			if(Game.triggers[i].type==TYPE_LOOP)
			{
				//check the previous two triggers...
				if(Game.triggers[i].n!=0) //-1 equals indefinite loops...otherwise n times.
				{
					if(i>=2)
					{
						if(Game.triggers[i-2].type==TYPE_ACTIVATE || Game.triggers[i-2].type==TYPE_DEATHCOUNT)
						{
							Game.triggers[i-2].completed = false;
							Game.triggers[i-1].completed = false;
							Game.triggers[i].completed = false;
							Game.triggers[i].n--;
						}
					}
				}
			}
		}
		boolean anychatter = false;
		for(int i=0;i<Game.triggers.length;i++)
		{
			if(Game.triggers[i].type==TYPE_CHATTER && Game.triggers[i].completed==false)
			{
				anychatter=true;
				break;
			}
		}
		if(!anychatter && !Game.paused)
		{
			if(vcount>0)
			{
				for(int i=0;i<Game.triggers.length;i++)
				{
					if(Game.triggers[i].type==TYPE_VICTORY && Game.triggers[i].completed==true)
					{
						vcount--;
					}
					if((Game.triggers[i].type==TYPE_DEATHCOUNT || Game.triggers[i].type==TYPE_ACTIVATE) && Game.triggers[i].completed==true && Game.triggers[i].x==TYPE_VICTORY && Game.triggers[i].y==0 && Game.triggers[i].fy==0)
					{
						vcount--;
					}
				}
				if(vcount<=0)
				{
					Game.GAMEENDSTATE = Game.GAMEENDSTATE_VICTORY;
					if(Game.gameovertime==0){Game.gameovertime = 60;}//20sep2021 changed from 180 to 60
				}
			}
			if(dcount>0)
			{
				for(int i=0;i<Game.triggers.length;i++)
				{
					if(Game.triggers[i].type==TYPE_OR_DEFEAT && Game.triggers[i].completed==true)
					{
						dcount--;
						//Game.GAMEENDSTATE = Game.GAMEENDSTATE_DEFEAT;
					}
					if((Game.triggers[i].type==TYPE_DEATHCOUNT || Game.triggers[i].type==TYPE_ACTIVATE) && Game.triggers[i].completed==true && Game.triggers[i].x==TYPE_OR_DEFEAT && Game.triggers[i].y==0 && Game.triggers[i].fy==0)
					{
						dcount--;
						//Game.GAMEENDSTATE = Game.GAMEENDSTATE_DEFEAT;
					}
					if(Game.triggers[i].type==TYPE_DEFEAT && Game.triggers[i].completed==true)
					{
						dcount=0;
						Game.GAMEENDSTATE = Game.GAMEENDSTATE_DEFEAT;
					}
					if((Game.triggers[i].type==TYPE_DEATHCOUNT || Game.triggers[i].type==TYPE_ACTIVATE) && Game.triggers[i].completed==true && Game.triggers[i].x==TYPE_DEFEAT && Game.triggers[i].y==0 && Game.triggers[i].fy==0)
					{
						dcount=0;
						Game.GAMEENDSTATE = Game.GAMEENDSTATE_DEFEAT;
					}
				}
				if(dcount<=0)
				{
					Game.GAMEENDSTATE = Game.GAMEENDSTATE_DEFEAT;
					if(Game.gameovertime==0){Game.gameovertime = 60;}//20sep2021 changed from 180 to 60
				}
			}
		}
	}		
}
