Copy to Clipboard Test

Old Windrobe Teleport Emulation Code

const int NPCM_WINDROBETRACKER = 0;

ffc script windWizzEmulation{
	void run(int isOW){
		int i;
		npc windrobes[256];
		int wrLastX[256];
		int wrLastY[256];
		int numWindrobes;
		
		while(true){
			//Find all windrobes on the screen. If they haven't been flagged, put them in the array
			for(i=Screen->NumNPCs(); i>0; --i){
				npc n = Screen->LoadNPC(i);
				if(n->ID==NPC_WIZZROBEWIND){
					if(!n->Misc[NPCM_WINDROBETRACKER]){
						windrobes[numWindrobes] = n;
						n->Misc[NPCM_WINDROBETRACKER] = 1;
						wrLastX[numWindrobes] = n->X;
						wrLastY[numWindrobes] = n->Y;
						++numWindrobes;
					}
				}
			}
			
			//Iterate through the array of windrobes to override their teleports
			for(i=0; i<numWindrobes; ++i){
				//Check if the enemy exists first
				if(windrobes[i]->isValid()){
					//If its X or Y has changed, we know it's teleported
					if(windrobes[i]->X!=wrLastX[i]||windrobes[i]->Y!=wrLastY[i]){
						FindWizzrobeTeleportSpot(windrobes[i], isOW);
					}
					wrLastX[i] = windrobes[i]->X;
					wrLastY[i] = windrobes[i]->Y;
				}
				//If it's invalid, replace it with the last one in the array
				else{
					windrobes[i] = windrobes[numWindrobes-1];
					wrLastX[i] = wrLastX[numWindrobes-1];
					wrLastY[i] = wrLastY[numWindrobes-1];
					--i;
					--numWindrobes;
				}
			}
			
			Waitframe();
		}
	}
	//Wizzrobe teleport logic, based on the 2.10 source
	void FindWizzrobeTeleportSpot(npc windrobe, bool isOW){
		int t;
		bool placed;
		int x; int y;
		//Roll placements until it finds one a certain distance from Link
		while(!placed&&t<160){
			if(!isOW){
				x = (Rand(12)+2)*16;
				y = (Rand(7)+2)*16;
			}
			else{
				x = (Rand(14)+1)*16;
				y = (Rand(9)+1)*16;
			}
			if(Abs(x-Link->X)>=32||Abs(y-Link->Y)>=32){
				placed = true;
			}
			++t;
		}
		windrobe->X = x;
		windrobe->Y = y;
		//Make the enemy face Link
		if(Abs(x-Link->X)<Abs(y-Link->Y)){
			if(y<Link->Y)
				windrobe->Dir = DIR_DOWN;
			else
				windrobe->Dir = DIR_UP;
		}
		else{
			if(x<Link->X)
				windrobe->Dir = DIR_RIGHT;
			else
				windrobe->Dir = DIR_LEFT;
		}
	}
}

ffc script windWizzEmulationAUTOGHOST{
	void run(int enemyID){
		int i; 
		
		npc ghost = Ghost_InitAutoGhost(this, enemyID);
		
		//Find if this FFC is the first instance on the screen.
		//If it isn't, quit out
		for(i=1; i<=32; ++i){
			ffc f = Screen->LoadFFC(i);
			if(f->Script==this->Script){
				if(f!=this)
					Quit();
				else
					break;
			}
		}
		
		bool isOW = true;
		if(Game->GetCurLevel()>0)
			isOW = false;
		
		npc windrobes[256];
		int wrLastX[256];
		int wrLastY[256];
		int numWindrobes;
		
		while(true){
			//Find all windrobes on the screen. If they haven't been flagged, put them in the array
			for(i=Screen->NumNPCs(); i>0; --i){
				npc n = Screen->LoadNPC(i);
				if(n->ID==NPC_WIZZROBEWIND){
					if(!n->Misc[NPCM_WINDROBETRACKER]){
						windrobes[numWindrobes] = n;
						n->Misc[NPCM_WINDROBETRACKER] = 1;
						wrLastX[numWindrobes] = n->X;
						wrLastY[numWindrobes] = n->Y;
						++numWindrobes;
					}
				}
			}
			
			//Iterate through the array of windrobes to override their teleports
			for(i=0; i<numWindrobes; ++i){
				//Check if the enemy exists first
				if(windrobes[i]->isValid()){
					//If its X or Y has changed, we know it's teleported
					if(windrobes[i]->X!=wrLastX[i]||windrobes[i]->Y!=wrLastY[i]){
						FindWizzrobeTeleportSpot(windrobes[i], isOW);
					}
					wrLastX[i] = windrobes[i]->X;
					wrLastY[i] = windrobes[i]->Y;
				}
				//If it's invalid, replace it with the last one in the array
				else{
					windrobes[i] = windrobes[numWindrobes-1];
					wrLastX[i] = wrLastX[numWindrobes-1];
					wrLastY[i] = wrLastY[numWindrobes-1];
					--i;
					--numWindrobes;
				}
			}
			
			if(ghost->isValid())
				Ghost_Waitframe2(this, ghost, false, false);
			else
				Waitframe();
		}
	}
	//Wizzrobe teleport logic, based on the 2.10 source
	void FindWizzrobeTeleportSpot(npc windrobe, bool isOW){
		int t;
		bool placed;
		int x; int y;
		//Roll placements until it finds one a certain distance from Link
		while(!placed&&t<160){
			if(!isOW){
				x = (Rand(12)+2)*16;
				y = (Rand(7)+2)*16;
			}
			else{
				x = (Rand(14)+1)*16;
				y = (Rand(9)+1)*16;
			}
			if(Abs(x-Link->X)>=32||Abs(y-Link->Y)>=32){
				placed = true;
			}
			++t;
		}
		windrobe->X = x;
		windrobe->Y = y;
		//Make the enemy face Link
		if(Abs(x-Link->X)<Abs(y-Link->Y)){
			if(y<Link->Y)
				windrobe->Dir = DIR_DOWN;
			else
				windrobe->Dir = DIR_UP;
		}
		else{
			if(x<Link->X)
				windrobe->Dir = DIR_RIGHT;
			else
				windrobe->Dir = DIR_LEFT;
		}
	}
}