Copy to Clipboard Test

Better Cane of Byrna Code

// uncomment this line (remove the //) if you haven't already imported std.zh in your script file
//import "std.zh"

int BetterByrna[8];
const int BETTERBYRNA_COST = 0;
const int BETTERBYRNA_MP_TRACKER = 1;
const int BETTERBYRNA_INVINCIBLE = 2;
const int BETTERBYRNA_BLOCK_PROJECTILES = 3;

global script BetterByrnaSampleGlobal
{
	void run()
	{
		while (true)
		{
			BetterByrna();
			Waitdraw();
			Waitframe();
		}
	}
}

void BetterByrna()
{
	if (NumLWeaponsOf(LW_CANEOFBYRNA) > 0)
	{
		// make player invincible
		if (Link->CollDetection && BetterByrna[BETTERBYRNA_INVINCIBLE])
		{
			Link->CollDetection = false;
		}
		
		// deduct MP cost
		if (BetterByrna[BETTERBYRNA_MP_TRACKER] >= 1)
		{
			if (Link->MP - Floor(BetterByrna[BETTERBYRNA_MP_TRACKER]) >= 0)
			{
				Link->MP -= Floor(BetterByrna[BETTERBYRNA_MP_TRACKER]);
			}
			else
			{
				Link->MP = 0;
			}
			BetterByrna[BETTERBYRNA_MP_TRACKER] -= Floor(BetterByrna[BETTERBYRNA_MP_TRACKER]);
		}
		if (Link->MP == 0)
		{
			lweapon byrna = LoadLWeaponOf(LW_CANEOFBYRNA);
			Remove(byrna);
		}
		else
		{
			BetterByrna[BETTERBYRNA_MP_TRACKER] += BetterByrna[BETTERBYRNA_COST] * (Game->Generic[GEN_MAGICDRAINRATE] * 0.5);
		}
		
		// block projectiles
		if (BetterByrna[BETTERBYRNA_BLOCK_PROJECTILES])
		{
			for (int i = Screen->NumEWeapons(); i > 0; i--)
			{
				eweapon projectile = Screen->LoadEWeapon(i);
				if (projectile->ID != EW_BOMBBLAST && projectile->ID != EW_SBOMBBLAST)
				{
					for (int j = Screen->NumLWeapons(); j > 0; j--)
					{
						lweapon byrna = Screen->LoadLWeapon(j);
						if (byrna->ID == LW_CANEOFBYRNA && Collision(projectile, byrna))
						{
							Remove(projectile);
						}
					}
				}
			}
		}
	}
	// make player vulnerable again
	else if (!Link->CollDetection)
	{
		Link->CollDetection = true;
	}
	
	if (Link->MP == 0 && (Link->InputA || Link->InputB))
	{
		itemdata a_button = Game->LoadItemData(GetEquipmentA());
		itemdata b_button = Game->LoadItemData(GetEquipmentB());
		if (Link->InputA && a_button->Family == IC_CBYRNA)
		{
			Link->InputA = false;
			Link->PressA = false;
		}
		if (Link->InputB && b_button->Family == IC_CBYRNA)
		{
			Link->InputB = false;
			Link->PressB = false;
		}
	}
}

// D0: reserved for other things, like pickup message scripts
// D1: MP cost per frame
// D2: 1 for invincible while cane is in use
// D3: 1 to block enemy projectiles
item script BetterByrnaItem
{
	void run(int foo, int cost, int invincible, int block_projectiles)
	{
		BetterByrna[BETTERBYRNA_COST] = cost;
		BetterByrna[BETTERBYRNA_INVINCIBLE] = invincible;
		BetterByrna[BETTERBYRNA_BLOCK_PROJECTILES] = block_projectiles;
	}
}