//Zelda 1 Style Random drops
//v0.1
//For 2.55
//By: ZoriaRPG
//17th February, 2019
script typedef ffc class;
class script Z1enemydrop
{
void run(){}
int killcount;
const int DROPSET_A = 0;
const int DROPSET_B = 1;
const int DROPSET_C = 2;
const int DROPSET_D = 3;
const int DROPSET_X = 4;
const int DROPSET_M = 5; MAGIC, 100%
const int DROP_X_OFS = 0;
const int DROP_Y_OFS = 0;
int chances[] = {31,41,59,41, 0, 100};
int lists[4*10]=
{
I_RUPEE, I_HEART, I_RUPEE, I_FAIRY, I_RUPEE, I_HEART, I_HEART, I_RUPEE, I_HEART, I_HEART,
I_BOMB, I_RUPEE, I_CLOCK, I_RUPEE, I_HEART, I_BOMB, I_RUPEE, I_BOMB, I_HEART, I_HEART,
I_RUPEE, I_HEART, I_RUPEE, I_RUPEE5, I_HEART, I_CLOCK, I_RUPEE, I_RUPEE, I_RUPEE, I_RUPEE5,
I_HEART, I_FAIRY. I_RUPEE, I_HEART, I_FAIRY, I_HEART, I_HEART, I_HEART, I_RUPEE, I_HEART
};
//The dropset that a given enemy uses; SPLITTERS NEED SPECIAL HANDLING?
int enemydropsets[]=
{
//guys
DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X,
DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X,
DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X,
DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X,
//enemies start here
DROPSET_A, DROPSET_B, DROPSET_A, DROPSET_B, DROPSET_A,
DROPSET_C, DROPSET_C, DROPSET_A, DROPSET_A, DROPSET_B,
DROPSET_D, DROPSET_C, DROPSET_D, DROPSET_D, DROPSET_X,
//GHINI2 ?PHANTOM
DROPSET_C, DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X,
DROPSET_X, DROPSET_C, DROPSET_X, DROPSET_C, DROPSET_C,
DROPSET_B, DROPSET_D, DROPSET_X, DROPSET_C, DROPSET_B,
DROPSET_D, DROPSET_X, DROPSET_B, DROPSET_X, DROPSET_B,
DROPSET_C, DROPSET_B, DROPSET_A, DROPSET_D, DROPSET_D,MOLDORM
DROPSET_D, DROPSET_D, DROPSET_D, DROPSET_D, DROPSET_D,
DROPSET_D, DROPSET_X, DROPSET_X, DROPSET_D, DROPSET_D,
DROPSET_D, DROPSET_D, DROPSET_D, DROPSET_D, DROPSET_D, //LANMOLA
DROPSET_C, DROPSET_D, DROPSET_D, DROPSET_X, DROPSET_C,
DROPSET_C, DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X,
DROPSET_X, DROPSET_B, DROPSET_D, DROPSET_X, DROPSET_X,
DROPSET_X, DROPSET_B, DROPSET_D, DROPSET_D, DROPSET_D,
DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_B,
DROPSET_A, DROPSET_C, DROPSET_C, DROPSET_D, DROPSET_D,
DROPSET_D, DROPSET_M, DROPSET_A, DROPSET_A, DROPSET_D,
DROPSET_D, DROPSET_D, DROPSET_D, DROPSET_A, DROPSET_D,
DROPSET_D, DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X,
DROPSET_C, DROPSET_D, DROPSET_D, DROPSET_X, DROPSET_X,
DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X,
DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X,
DROPSET_X, DROPSET_D, DROPSET_A, DROPSET_B, DROPSET_B,
DROPSET_B, DROPSET_B, DROPSET_X, DROPSET_X, DROPSET_X,
DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X,
DROPSET_X, DROPSET_X, DROPSET_B, DROPSET_A, DROPSET_X,
DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X, DROPSET_X,
DROPSET_X, DROPSET_X, DROPSET_C, DROPSET_X, DROPSET_C,
DROPSET_A, DROPSET_X, DROPSET_X, DROPSET_D, DROPSET_D,
DROPSET_M, DROPSET_C, DROPSET_D, DROPSET_D, DROPSET_M,
DROPSET_X, DROPSET_X, DROPSET_X
};
int getChance(int enemyid)
{
return chances[enemydropsets[enemyid]];
}
bool canDrop(int enemy_id)
{
return ( Rand(1,100) <= getChance(enemy_id) );
}
void doDrop(npc n)
{
if ( n->HP > 0 ) return; //wait until dead
bool ignore = false;
switch(n->Family)
{
case NPCT_MOLDORM:
case NPCT_MANHANDLA:
case NPCT_GLEEOK:
case NPCT_LANMOLA:
case NPCT_PATRA:
{
if ( !n->isCore ) ignore = true; break;
}
case NPCT_DODONGO: ignore = true; break; //These never drop items, AFAIK.
default: break;
}
if ( !ignore )
{
if ( canDrop(n->ID) )
{
item drp = Screen->CreateItem(lists[enemydropsets[n->ID]+killcount]);
drp->X = n->X + DROP_X_OFS; drp->Y = n->Y + DROP_Y_OFS;
drp->Pickup = IP_TIMEOUT;
( killcount < 9 ) ? ++killcount : killcount = 0;
}
}
}
void resetKillcount()
{
if ( Link->InvFrames ) killcount = 0;
}
}
link script LinkZ1
{
void run()
{
while(1)
{
Z1enemydrop.resetKillcount();
for ( int q = Screen->NumNPCs(); q > 0; --q )
{
npc n = Screen->LoadNPC(q);
Z1enemydrop.doDrop(n);
}
}
}
Comments