Copy to Clipboard Test

Mirror Darknut (Autoghost) Code

import "std.zh"
import "string.zh"
import "ghost.zh"

ffc script MirrorDarknut
{
	void run(int enemyID)
	{
		npc ghost = Ghost_InitAutoGhost(this,enemyID);
		Ghost_SetFlag(GHF_NORMAL);
		int defenses[18];
		Ghost_StoreDefenses(ghost, defenses);
		ReflectWeapons(ghost);
		lweapon refweapon;

		while(Ghost_Waitframe2(this,ghost, true, true))
		{
			Ghost_SetDefenses(ghost,defenses);
			if(!GetNPCMiscFlag(ghost, 1<<9)) continue; //It's just a normal enemy without it's shield.
			ReflectWeapons(ghost);
			for(int i = Screen->NumLWeapons(); i > 0; i--)
			{
				lweapon wpn = Screen->LoadLWeapon(i);
				if(!Collision(ghost,wpn)) continue;
				if(!ghost->CollDetection) continue;
				if(!wpn->CollDetection) continue;
				if(wpn==refweapon) continue;
				if(wpn->ID != LW_MAGIC
				&& wpn->ID != LW_BEAM
				&& wpn->ID != LW_REFMAGIC
				&& wpn->ID != LW_REFBEAM) continue; 
				if(wpn->Dir != OppositeDir(ghost->Dir))
				{
					//Ghost_SetDefenses(ghost,defenses);
				}
				else
				{
					Game->PlaySound(SFX_CLINK);
					refweapon = ReflectLWeapon(wpn);
					wpn->DeadState = WDS_DEAD;
					wpn->X = -1000;
					break;
				}
			}
			for(int i = Screen->NumEWeapons(); i > 0; i--)
			{
				eweapon wpn = Screen->LoadEWeapon(i);
				if(!Collision(ghost,wpn)) continue;
				if(!ghost->CollDetection) continue;
				if(!wpn->CollDetection) continue;
				if(wpn->ID != EW_MAGIC
				&& wpn->ID != EW_BEAM) continue;
				if(wpn->Dir != OppositeDir(ghost->Dir))
				{
					//Ghost_SetDefenses(ghost,defenses);
				}
				else
				{
					Game->PlaySound(SFX_CLINK);
					refweapon = ReflectEWeapon(wpn);
					wpn->DeadState = WDS_DEAD;
					wpn->X = -1000;
					break;
				}
			}
		}
	}
	void ReflectWeapons(npc ghost)
	{
		ghost->Defense[NPCD_MAGIC] = NPCDT_IGNORE;
		ghost->Defense[NPCD_BEAM] = NPCDT_IGNORE;
		ghost->Defense[NPCD_REFMAGIC] = NPCDT_IGNORE;
		ghost->Defense[NPCD_REFBEAM] = NPCDT_IGNORE;
	}
	lweapon ReflectLWeapon(lweapon a)
	{
		int typeID;
		if(a->ID == LW_MAGIC||a->ID == LW_REFMAGIC) typeID = LW_REFMAGIC;
		else typeID = LW_REFBEAM;
		lweapon b = Screen->CreateLWeapon(typeID);
		b->X = a->X;
		b->Y = a->Y;
		b->Z = a->Z;
		b->Jump = a->Jump;
		b->Extend = a->Extend;
		b->TileWidth = a->TileWidth;
		b->TileHeight = a->TileHeight;
		b->HitWidth = a->HitWidth;
		b->HitHeight = a->HitHeight;
		b->HitZHeight = a->HitZHeight;
		b->HitXOffset = a->HitXOffset;
		b->HitYOffset = a->HitYOffset;
		b->DrawXOffset = a->DrawXOffset;
		b->DrawYOffset = a->DrawYOffset;
		b->DrawZOffset = a->DrawZOffset;
		b->Tile = a->Tile;
		b->CSet = a->CSet;
		b->DrawStyle = a->DrawStyle;
		b->Dir = OppositeDir(a->Dir);
		b->OriginalTile = a->OriginalTile;
		b->OriginalCSet = a->OriginalCSet;
		b->FlashCSet = a->FlashCSet;
		b->NumFrames = a->NumFrames;
		b->Frame = a->Frame;
		b->ASpeed = a->ASpeed;
		b->Damage = a->Damage;
		b->Step = a->Step;
		if(a->Angular)
		{
			int vecx = VectorX(a->Step, RadtoDeg(a->Angle));
			int vecy = VectorY(a->Step, RadtoDeg(a->Angle));
			if(Abs(vecx) >= Abs(vecy))
				vecx *= -1;
			if(Abs(vecx) <= Abs(vecy))
				vecy *= -1;
			b->Angle = ArcTan(vecx, vecy);
			b->Angular = true;
		}
		b->CollDetection = a->CollDetection;
 		b->DeadState = a->DeadState;
		b->Flash = a->Flash;
		b->Flip ^= 3;
		for (int i = 0; i < 16; i++)
			b->Misc[i] = a->Misc[i];
		return b;
	}
	lweapon ReflectEWeapon(eweapon a)
	{
		int typeID;
		if(a->ID == EW_MAGIC) typeID = LW_REFMAGIC;
		else typeID = LW_REFBEAM;
		lweapon b = Screen->CreateLWeapon(typeID);
		b->X = a->X;
		b->Y = a->Y;
		b->Z = a->Z;
		b->Jump = a->Jump;
		b->Extend = a->Extend;
		b->TileWidth = a->TileWidth;
		b->TileHeight = a->TileHeight;
		b->HitWidth = a->HitWidth;
		b->HitHeight = a->HitHeight;
		b->HitZHeight = a->HitZHeight;
		b->HitXOffset = a->HitXOffset;
		b->HitYOffset = a->HitYOffset;
		b->DrawXOffset = a->DrawXOffset;
		b->DrawYOffset = a->DrawYOffset;
		b->DrawZOffset = a->DrawZOffset;
		b->Tile = a->Tile;
		b->CSet = a->CSet;
		b->DrawStyle = a->DrawStyle;
		b->Dir = OppositeDir(a->Dir);
		b->OriginalTile = a->OriginalTile;
		b->OriginalCSet = a->OriginalCSet;
		b->FlashCSet = a->FlashCSet;
		b->NumFrames = a->NumFrames;
		b->Frame = a->Frame;
		b->ASpeed = a->ASpeed;
		b->Damage = a->Damage;
		b->Step = a->Step;
		if(a->Angular)
		{
			int vecx = VectorX(a->Step, RadtoDeg(a->Angle));
			int vecy = VectorY(a->Step, RadtoDeg(a->Angle));
			if(Abs(vecx) >= Abs(vecy))
				vecx *= -1;
			if(Abs(vecx) <= Abs(vecy))
				vecy *= -1;
			b->Angle = ArcTan(vecx, vecy);
			b->Angular = true;
		}
		b->CollDetection = a->CollDetection;
 		b->DeadState = a->DeadState;
		b->Flash = a->Flash;
		b->Flip ^= 3;
		for (int i = 0; i < 16; i++)
			b->Misc[i] = a->Misc[i];
		return b;
	}
}