Too lazy to comment
This commit is contained in:
166
mod_xj18/my_progs/ai_ammoresist.qc
Normal file
166
mod_xj18/my_progs/ai_ammoresist.qc
Normal file
@@ -0,0 +1,166 @@
|
||||
/*======================================================================
|
||||
MONSTER AMMO RESISTANCE SYSTEM
|
||||
|
||||
======================================================================*/
|
||||
|
||||
float(entity targ, float resist_type, float damage) Resist_Damage =
|
||||
{
|
||||
local float ret_damage;
|
||||
|
||||
if (resist_type == IT_SHELLS) ret_damage = damage * (1 - targ.resist_shells);
|
||||
else if (resist_type == IT_NAILS) ret_damage = damage * (1 - targ.resist_nails);
|
||||
else if (resist_type == IT_ROCKETS) ret_damage = damage * (1 - targ.resist_rockets);
|
||||
else if (resist_type == IT_CELLS) ret_damage = damage * (1 - targ.resist_cells);
|
||||
|
||||
return ret_damage;
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Double check that all ammo resistance are within range
|
||||
//----------------------------------------------------------------------
|
||||
void(entity targ) Resist_CheckRange =
|
||||
{
|
||||
// Check Ammo resistance is within range
|
||||
if (targ.resist_shells < 0) targ.resist_shells = 0;
|
||||
else if (targ.resist_shells > 1) targ.resist_shells = 1;
|
||||
if (targ.resist_nails < 0) targ.resist_nails = 0;
|
||||
else if (targ.resist_nails > 1) targ.resist_nails = 1;
|
||||
if (targ.resist_rockets < 0) targ.resist_rockets = 0;
|
||||
else if (targ.resist_rockets > 1) targ.resist_rockets = 1;
|
||||
if (targ.resist_cells < 0) targ.resist_cells = 0;
|
||||
else if (targ.resist_cells > 1) targ.resist_cells = 1;
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Save current ammo resistance to ammo variables
|
||||
// ** Ammo variables are used for backpack, use with caution
|
||||
//----------------------------------------------------------------------
|
||||
void(entity targ) Resist_Save =
|
||||
{
|
||||
// Store the ammo resistance for switching later
|
||||
targ.ammo_shells = targ.resist_shells;
|
||||
targ.ammo_nails = targ.resist_nails;
|
||||
targ.ammo_rockets = targ.resist_rockets;
|
||||
targ.ammo_cells = targ.resist_cells;
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Switch resistance from FULL to monster default
|
||||
// This works with Resist_Save system, use with caution
|
||||
// Designed for bosses which don't drop things on death
|
||||
//----------------------------------------------------------------------
|
||||
void(entity targ, float artype) Resist_ChangeType =
|
||||
{
|
||||
if (artype == TRUE) {
|
||||
// Complete resistance to everything
|
||||
targ.resist_shells = targ.resist_nails = 1;
|
||||
targ.resist_rockets = targ.resist_cells = 1;
|
||||
targ.pain_finished = LARGE_TIMER;
|
||||
}
|
||||
else {
|
||||
// Default ammo resist, rocket/cell immunnity
|
||||
targ.resist_shells = targ.ammo_shells;
|
||||
targ.resist_nails = targ.ammo_nails;
|
||||
targ.resist_rockets = targ.ammo_rockets;
|
||||
targ.resist_cells = targ.ammo_cells;
|
||||
targ.pain_finished = time + 1;
|
||||
}
|
||||
dprint("\b[AMMO RESIST]\b");
|
||||
dprint(" S="); dprint(ftos(targ.resist_shells));
|
||||
dprint(" N="); dprint(ftos(targ.resist_nails));
|
||||
dprint(" R="); dprint(ftos(targ.resist_rockets));
|
||||
dprint(" C="); dprint(ftos(targ.resist_cells));
|
||||
dprint("\n");
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void(entity targ, vector org, vector vel, float damage) Resist_Shells =
|
||||
{
|
||||
if (targ.health > 0 && targ.pain_finished < time) {
|
||||
targ.pain_finished = time + 0.3 + random();
|
||||
sound (targ, CHAN_VOICE, targ.pain_sound, 1, ATTN_NORM);
|
||||
}
|
||||
|
||||
// Drastically reduce blood particles
|
||||
if (targ.resist_shells < 1) {
|
||||
SpawnBlood (targ, org, vel*0.2, rint(DAMAGE_SHELL*targ.resist_shells));
|
||||
}
|
||||
if (random() < 0.3) {
|
||||
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
||||
if (random() < 0.5) WriteByte (MSG_BROADCAST, TE_SPIKE);
|
||||
else WriteByte (MSG_BROADCAST, TE_GUNSHOT);
|
||||
WriteCoord (MSG_BROADCAST, org_x);
|
||||
WriteCoord (MSG_BROADCAST, org_y);
|
||||
WriteCoord (MSG_BROADCAST, org_z);
|
||||
if (random() < 0.5) SpawnProjectileSmoke(org, 200, 50, 150);
|
||||
}
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void(entity targ, vector org) Resist_Nails =
|
||||
{
|
||||
if (targ.health > 0 && targ.pain_finished < time && targ.resist_nails < 1) {
|
||||
targ.pain_finished = time + 0.3 + random();
|
||||
sound (targ, CHAN_VOICE, targ.pain_sound, 1, ATTN_NORM);
|
||||
}
|
||||
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
||||
if (random() < 0.5) WriteByte (MSG_BROADCAST, TE_SPIKE);
|
||||
else WriteByte (MSG_BROADCAST, TE_GUNSHOT);
|
||||
WriteCoord (MSG_BROADCAST, org_x);
|
||||
WriteCoord (MSG_BROADCAST, org_y);
|
||||
WriteCoord (MSG_BROADCAST, org_z);
|
||||
if (random() < 0.5) SpawnProjectileSmoke(org, 200, 50, 150);
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void(entity targ, vector org) Resist_Rockets =
|
||||
{
|
||||
if (targ.health > 0 && targ.pain_finished < time && targ.resist_rockets < 1) {
|
||||
targ.pain_finished = time + 0.3 + random();
|
||||
sound (targ, CHAN_VOICE, targ.pain_sound, 1, ATTN_NORM);
|
||||
}
|
||||
SpawnExplosion(EXPLODE_BURST_SMOKE,org,SOUND_RESIST_ROCKET);
|
||||
SpawnProjectileSmoke(org, 200, 50, 150);
|
||||
SpawnProjectileSmoke(org, 200, 50, 250);
|
||||
SpawnProjectileSmoke(org, 300, 50, 150);
|
||||
// Can the target bleed?
|
||||
if (targ.resist_rockets < 1) {
|
||||
SpawnProjectileMeat(targ, org, 200, 50, 150);
|
||||
SpawnProjectileMeat(targ, org, 300, 50, 150);
|
||||
}
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void(entity targ, vector org) Resist_Lightning =
|
||||
{
|
||||
if (targ.health > 0 && targ.pain_finished < time && targ.resist_cells < 1) {
|
||||
targ.pain_finished = time + 0.3 + random();
|
||||
sound (targ, CHAN_VOICE, targ.pain_sound, 1, ATTN_NORM);
|
||||
}
|
||||
// Don't spawn smoke constantly (let the sprite finish)
|
||||
if (self.lightning_timer < time) {
|
||||
self.lightning_timer = time + 0.3;
|
||||
SpawnExplosion(EXPLODE_BURST_SMOKE, org, "");
|
||||
}
|
||||
// Spawn a random smoke particle and chance of blood
|
||||
SpawnProjectileSmoke(org, 200, 50, 150);
|
||||
if (targ.resist_cells < 1 && random() < 0.4)
|
||||
SpawnProjectileMeat(targ, org, 200, 50, 150);
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
void(entity targ, vector org) Resist_Plasma =
|
||||
{
|
||||
if (targ.health > 0 && targ.pain_finished < time && targ.resist_cells < 1) {
|
||||
targ.pain_finished = time + 0.3 + random();
|
||||
sound (targ, CHAN_VOICE, targ.pain_sound, 1, ATTN_NORM);
|
||||
}
|
||||
SpawnExplosion(EXPLODE_BURST_SMOKE, org, SOUND_PLASMA_HIT);
|
||||
SpawnProjectileSmoke(org, 200, 50, 150);
|
||||
SpawnProjectileSmoke(org, 200, 50, 250);
|
||||
SpawnProjectileSmoke(org, 300, 50, 150);
|
||||
// Can the target bleed?
|
||||
if (targ.resist_cells < 1 && random() < 0.3)
|
||||
SpawnProjectileMeat(targ,org, 200, 50, 150);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user