game: Add support health_multiplier from ReRelaes

Based on:
 * https://github.com/id-Software/quake2-rerelease-dll.git
This commit is contained in:
Denis Pauk 2024-12-03 00:10:49 +02:00
parent 5518640473
commit 0c6c51f903
49 changed files with 72 additions and 60 deletions

View file

@ -158,6 +158,7 @@ Goals:
* [ ] Support textures/*/*_glow.png load from ReRelease,
* [ ] Support tactile/*/*.bnvib/.wav feedback load from ReRelease,
* [ ] Fix physics with incorrect floor height in psx/base0.bsp,
* [ ] Fix statusbar for DoD `roarke`,
* [x] Fix strange white flying boxes in psx/base0.bsp,
* [x] RGB particles support instead palette based one,
* [x] Get rid of VID_PaletteColor client internal api use,

View file

@ -303,6 +303,11 @@ ED_CallSpawn(edict_t *ent)
ent->gravityVector[1] = 0.0;
ent->gravityVector[2] = -1.0;
if (st.health_multiplier <= 0)
{
st.health_multiplier = 1.0;
}
if (!strcmp(ent->classname, "weapon_nailgun"))
{
ent->classname = (FindItem("ETF Rifle"))->classname;

View file

@ -421,6 +421,7 @@ typedef struct
/* Addional fields for models */
vec3_t scale;
float health_multiplier;
} spawn_temp_t;
typedef struct

View file

@ -478,10 +478,11 @@ void actor_use (edict_t *self, edict_t *other, edict_t *activator)
}
/*QUAKED misc_actor (1 .5 0) (-16 -16 -24) (16 16 32)
*/
void SP_misc_actor (edict_t *self)
/*
* QUAKED misc_actor (1 .5 0) (-16 -16 -24) (16 16 32)
*/
void
SP_misc_actor(edict_t *self)
{
if (deathmatch->value)
{
@ -510,7 +511,10 @@ void SP_misc_actor (edict_t *self)
VectorSet(self->maxs, 16, 16, 32);
if (!self->health)
self->health = 100;
{
self->health = 100 * st.health_multiplier;
}
self->mass = 200;
self->pain = actor_pain;

View file

@ -554,7 +554,7 @@ SP_monster_arachnid(edict_t *self)
sound_die = gi.soundindex("arachnid/death.wav");
sound_sight = gi.soundindex("arachnid/sight.wav");
self->health = 1000;
self->health = 1000 * st.health_multiplier;
self->gib_health = -200;
self->mass = 450;

View file

@ -364,7 +364,7 @@ SP_monster_army(edict_t *self)
self->s.modelindex = gi.modelindex("models/monsters/army/tris.md2");
VectorSet(self->mins, -16, -16, -24);
VectorSet(self->maxs, 16, 16, 40);
self->health = 30;
self->health = 30 * st.health_multiplier;
sound_death = gi.soundindex("army/death1.wav");
sound_search = gi.soundindex("army/idle.wav");

View file

@ -819,7 +819,7 @@ SP_monster_berserk(edict_t *self)
self->movetype = MOVETYPE_STEP;
self->solid = SOLID_BBOX;
self->health = 240;
self->health = 240 * st.health_multiplier;
self->gib_health = -60;
self->mass = 250;

View file

@ -889,7 +889,7 @@ SP_monster_boss2(edict_t *self)
VectorSet(self->mins, -56, -56, 0);
VectorSet(self->maxs, 56, 56, 80);
self->health = 2000;
self->health = 2000 * st.health_multiplier;
self->gib_health = -200;
self->mass = 1000;

View file

@ -919,7 +919,7 @@ SP_monster_jorg(edict_t *self)
VectorSet(self->mins, -80, -80, 0);
VectorSet(self->maxs, 80, 80, 140);
self->health = 3000;
self->health = 3000 * st.health_multiplier;
self->gib_health = -2000;
self->mass = 1000;

View file

@ -1170,7 +1170,7 @@ SP_monster_makron(edict_t *self)
VectorSet(self->mins, -30, -30, 0);
VectorSet(self->maxs, 30, 30, 90);
self->health = 3000;
self->health = 3000 * st.health_multiplier;
self->gib_health = -2000;
self->mass = 500;

View file

@ -878,7 +878,7 @@ SP_monster_boss5(edict_t *self)
VectorSet(self->mins, -64, -64, 0);
VectorSet(self->maxs, 64, 64, 112);
self->health = 1500;
self->health = 1500 * st.health_multiplier;
self->gib_health = -500;
self->mass = 800;

View file

@ -1187,7 +1187,7 @@ SP_monster_brain(edict_t *self)
VectorSet(self->mins, -16, -16, -24);
VectorSet(self->maxs, 16, 16, 32);
self->health = 300;
self->health = 300 * st.health_multiplier;
self->gib_health = -150;
self->mass = 400;

View file

@ -1534,7 +1534,7 @@ SP_monster_carrier(edict_t *self)
VectorSet(self->maxs, 56, 56, 44);
/* 2000 - 4000 health */
self->health = Q_max(2000, 2000 + 1000 * ((skill->value) - 1));
self->health = Q_max(2000, 2000 + 1000 * ((skill->value) - 1)) * st.health_multiplier;
/* add health in coop (500 * skill) */
if (coop->value)

View file

@ -1208,7 +1208,7 @@ SP_monster_chick(edict_t *self)
VectorSet(self->mins, -16, -16, 0);
VectorSet(self->maxs, 16, 16, 56);
self->health = 175;
self->health = 175 * st.health_multiplier;
self->gib_health = -70;
self->mass = 200;

View file

@ -376,7 +376,7 @@ SP_monster_demon(edict_t *self)
self->s.modelindex = gi.modelindex("models/monsters/demon/tris.md2");
VectorSet(self->mins, -32, -32, -24);
VectorSet(self->maxs, 32, 32, 64);
self->health = 300;
self->health = 300 * st.health_multiplier;
sound_death = gi.soundindex("demon/ddeath.wav");
sound_hit = gi.soundindex("demon/dhit2.wav");

View file

@ -381,7 +381,7 @@ SP_monster_dog(edict_t *self)
self->s.modelindex = gi.modelindex("models/monsters/dog/tris.md2");
VectorSet(self->mins, -32, -32, -24);
VectorSet(self->maxs, 32, 32, 40);
self->health = 25;
self->health = 25 * st.health_multiplier;
sound_melee = gi.soundindex("dog/dattack1.wav");
sound_death = gi.soundindex("dog/ddeath.wav");

View file

@ -528,7 +528,7 @@ SP_monster_enforcer(edict_t *self)
self->s.modelindex = gi.modelindex("models/monsters/enforcer/tris.md2");
VectorSet(self->mins, -16, -16, -24);
VectorSet(self->maxs, 16, 16, 40);
self->health = 80;
self->health = 80 * st.health_multiplier;
sound_death = gi.soundindex("enforcer/death1.wav");
sound_hit = gi.soundindex("enforcer/enfstop.wav");

View file

@ -1662,7 +1662,7 @@ SP_monster_fixbot(edict_t *self)
self->movetype = MOVETYPE_STEP;
self->solid = SOLID_BBOX;
self->health = 150;
self->health = 150 * st.health_multiplier;
self->mass = 150;
self->viewheight = 16;

View file

@ -544,7 +544,7 @@ SP_monster_flipper(edict_t *self)
VectorSet(self->mins, -16, -16, 0);
VectorSet(self->maxs, 16, 16, 32);
self->health = 50;
self->health = 50 * st.health_multiplier;
self->gib_health = -30;
self->mass = 100;

View file

@ -878,7 +878,7 @@ SP_monster_floater(edict_t *self)
VectorSet(self->mins, -24, -24, -24);
VectorSet(self->maxs, 24, 24, 32);
self->health = 200;
self->health = 200 * st.health_multiplier;
self->gib_health = -80;
self->mass = 300;

View file

@ -1082,7 +1082,7 @@ SP_monster_flyer(edict_t *self)
self->s.sound = gi.soundindex("flyer/flyidle1.wav");
self->health = 50;
self->health = 50 * st.health_multiplier;
self->mass = 50;
self->pain = flyer_pain;
@ -1140,7 +1140,7 @@ SP_monster_kamikaze(edict_t *self)
self->s.effects |= EF_ROCKET;
self->health = 50;
self->health = 50 * st.health_multiplier;
self->mass = 100;
self->pain = flyer_pain;

View file

@ -1968,7 +1968,7 @@ SP_monster_gekk(edict_t *self)
gi.modelindex("models/objects/gekkgib/leg/tris.md2");
gi.modelindex("models/objects/gekkgib/head/tris.md2");
self->health = 125;
self->health = 125 * st.health_multiplier;
self->gib_health = -30;
self->mass = 300;

View file

@ -532,7 +532,7 @@ SP_monster_gladb(edict_t *self)
VectorSet(self->mins, -32, -32, -24);
VectorSet(self->maxs, 32, 32, 64);
self->health = 800;
self->health = 800 * st.health_multiplier;
self->gib_health = -175;
self->mass = 350;

View file

@ -588,7 +588,7 @@ SP_monster_gladiator(edict_t *self)
VectorSet(self->mins, -32, -32, -24);
VectorSet(self->maxs, 32, 32, 64);
self->health = 400;
self->health = 400 * st.health_multiplier;
self->gib_health = -175;
self->mass = 400;

View file

@ -764,7 +764,7 @@ SP_monster_guardian(edict_t *self)
self->movetype = MOVETYPE_STEP;
self->solid = SOLID_BBOX;
self->health = 2500;
self->health = 2500 * st.health_multiplier;
self->gib_health = -200;
self->monsterinfo.scale = MODEL_SCALE;

View file

@ -1381,7 +1381,7 @@ SP_monster_gunner(edict_t *self)
VectorSet(self->mins, -16, -16, -24);
VectorSet(self->maxs, 16, 16, 32);
self->health = 175;
self->health = 175 * st.health_multiplier;
self->gib_health = -70;
self->mass = 200;
@ -1449,7 +1449,7 @@ SP_monster_guncmdr(edict_t *self)
VectorSet(self->mins, -16, -16, -24);
VectorSet(self->maxs, 16, 16, 32);
self->health = 175;
self->health = 175 * st.health_multiplier;
self->gib_health = -70;
self->mass = 200;

View file

@ -528,7 +528,7 @@ SP_monster_hknight(edict_t *self)
self->s.modelindex = gi.modelindex("models/monsters/hknight/tris.md2");
VectorSet(self->mins, -16, -16, -24);
VectorSet(self->maxs, 16, 16, 40);
self->health = 250;
self->health = 250 * st.health_multiplier;
sound_attack = gi.soundindex("hknight/attack1.wav");
sound_melee = gi.soundindex("hknight/slash1.wav");

View file

@ -1016,7 +1016,7 @@ SP_monster_hover(edict_t *self)
VectorSet(self->mins, -24, -24, -24);
VectorSet(self->maxs, 24, 24, 32);
self->health = 240;
self->health = 240 * st.health_multiplier;
self->gib_health = -100;
self->mass = 150;
@ -1033,7 +1033,7 @@ SP_monster_hover(edict_t *self)
if (strcmp(self->classname, "monster_daedalus") == 0)
{
self->health = 450;
self->health = 450 * st.health_multiplier;
self->mass = 225;
self->yaw_speed = 25;
self->monsterinfo.power_armor_type = POWER_ARMOR_SCREEN;

View file

@ -1108,7 +1108,7 @@ SP_monster_infantry(edict_t *self)
VectorSet(self->mins, -16, -16, -24);
VectorSet(self->maxs, 16, 16, 32);
self->health = 100;
self->health = 100 * st.health_multiplier;
self->gib_health = -40;
self->mass = 200;

View file

@ -985,7 +985,7 @@ SP_misc_insane(edict_t *self)
VectorSet(self->mins, -16, -16, -24);
VectorSet(self->maxs, 16, 16, 32);
self->health = 100;
self->health = 100 * st.health_multiplier;
self->gib_health = -50;
self->mass = 300;

View file

@ -368,7 +368,7 @@ SP_monster_knight(edict_t *self)
self->s.modelindex = gi.modelindex("models/monsters/knight/tris.md2");
VectorSet(self->mins, -16, -16, -24);
VectorSet(self->maxs, 16, 16, 40);
self->health = 75;
self->health = 75 * st.health_multiplier;
sound_melee1 = gi.soundindex("knight/sword1.wav");
sound_melee2 = gi.soundindex("knight/sword2.wav");

View file

@ -2045,7 +2045,7 @@ SP_monster_medic(edict_t *self)
if (strcmp(self->classname, "monster_medic_commander") == 0)
{
self->health = 600;
self->health = 600 * st.health_multiplier;
self->gib_health = -130;
self->mass = 600;
self->yaw_speed = 40;
@ -2053,7 +2053,7 @@ SP_monster_medic(edict_t *self)
}
else
{
self->health = 300;
self->health = 300 * st.health_multiplier;
self->gib_health = -130;
self->mass = 400;
}

View file

@ -990,7 +990,7 @@ SP_monster_mutant(edict_t *self)
VectorSet(self->mins, -32, -32, -24);
VectorSet(self->maxs, 32, 32, 48);
self->health = 300;
self->health = 300 * st.health_multiplier;
self->gib_health = -120;
self->mass = 300;

View file

@ -492,7 +492,7 @@ SP_monster_ogre(edict_t *self)
self->s.modelindex = gi.modelindex("models/monsters/ogre/tris.md2");
VectorSet(self->mins, -32, -32, -24);
VectorSet(self->maxs, 32, 32, 64);
self->health = 200;
self->health = 200 * st.health_multiplier;
sound_death = gi.soundindex("ogre/ogdth.wav");
sound_attack = gi.soundindex("ogre/grenade.wav");

View file

@ -1020,7 +1020,7 @@ SP_monster_parasite(edict_t *self)
self->movetype = MOVETYPE_STEP;
self->solid = SOLID_BBOX;
self->health = 175;
self->health = 175 * st.health_multiplier;
self->gib_health = -50;
self->mass = 250;
self->viewheight = 16;

View file

@ -304,7 +304,7 @@ SP_monster_rotfish(edict_t *self)
self->s.modelindex = gi.modelindex("models/monsters/rotfish/tris.md2");
VectorSet(self->mins, -16, -16, -24);
VectorSet(self->maxs, 16, 16, 24);
self->health = 25;
self->health = 25 * st.health_multiplier;
sound_search = gi.soundindex("fish/idle.wav");
sound_death = gi.soundindex("fish/death.wav");

View file

@ -346,7 +346,7 @@ SP_monster_shalrath(edict_t *self)
self->s.modelindex = gi.modelindex("models/monsters/shalrath/tris.md2");
VectorSet(self->mins, -32, -32, -24);
VectorSet(self->maxs, 32, 32, 48);
self->health = 400;
self->health = 400 * st.health_multiplier;
sound_death = gi.soundindex("shalrath/death.wav");
sound_search = gi.soundindex("shalrath/idle.wav");

View file

@ -726,7 +726,7 @@ SP_monster_shambler(edict_t* self)
sound_smack = gi.soundindex("shambler/smack.wav");
sound_boom = gi.soundindex("shambler/sboom.wav");
self->health = 600;
self->health = 600 * st.health_multiplier;
self->gib_health = -60;
self->mass = 500;

View file

@ -2055,7 +2055,7 @@ SP_monster_soldier_light(edict_t *self)
return;
}
self->health = 20;
self->health = 20 * st.health_multiplier;
self->gib_health = -30;
SP_monster_soldier_x(self);
@ -2093,7 +2093,7 @@ SP_monster_soldier(edict_t *self)
return;
}
self->health = 30;
self->health = 30 * st.health_multiplier;
self->gib_health = -30;
SP_monster_soldier_x(self);
@ -2128,7 +2128,7 @@ SP_monster_soldier_ss(edict_t *self)
return;
}
self->health = 40;
self->health = 40 * st.health_multiplier;
self->gib_health = -30;
SP_monster_soldier_x(self);
@ -3808,7 +3808,7 @@ SP_monster_soldier_ripper(edict_t *self)
return;
}
self->health = 50;
self->health = 50 * st.health_multiplier;
self->gib_health = -30;
SP_monster_soldier_h(self);
@ -3840,7 +3840,7 @@ SP_monster_soldier_hypergun(edict_t *self)
return;
}
self->health = 60;
self->health = 60 * st.health_multiplier;
self->gib_health = -30;
SP_monster_soldier_h(self);
@ -3874,7 +3874,7 @@ SP_monster_soldier_lasergun(edict_t *self)
return;
}
self->health = 70;
self->health = 70 * st.health_multiplier;
self->gib_health = -30;
SP_monster_soldier_h(self);

View file

@ -1479,7 +1479,7 @@ SP_monster_stalker(edict_t *self)
self->movetype = MOVETYPE_STEP;
self->solid = SOLID_BBOX;
self->health = 250;
self->health = 250 * st.health_multiplier;
self->gib_health = -50;
self->mass = 250;
self->viewheight = 15;

View file

@ -918,7 +918,7 @@ SP_monster_supertank(edict_t *self)
VectorSet(self->mins, -64, -64, 0);
VectorSet(self->maxs, 64, 64, 112);
self->health = 1500;
self->health = 1500 * st.health_multiplier;
self->gib_health = -500;
self->mass = 800;

View file

@ -1279,12 +1279,12 @@ SP_monster_tank(edict_t *self)
if (strcmp(self->classname, "monster_tank_commander") == 0)
{
self->health = 1000;
self->health = 1000 * st.health_multiplier;
self->gib_health = -225;
}
else
{
self->health = 750;
self->health = 750 * st.health_multiplier;
self->gib_health = -200;
}

View file

@ -256,7 +256,7 @@ SP_monster_tarbaby(edict_t *self)
self->s.modelindex = gi.modelindex("models/monsters/tarbaby/tris.md2");
VectorSet(self->mins, -16, -16, -24);
VectorSet(self->maxs, 16, 16, 40);
self->health = 80;
self->health = 80 * st.health_multiplier;
sound_death = gi.soundindex("tarbaby/death1.wav");
sound_hit = gi.soundindex("tarbaby/hit1.wav");

View file

@ -1153,7 +1153,7 @@ SP_monster_turret(edict_t *self)
self->movetype = MOVETYPE_NONE;
self->solid = SOLID_BBOX;
self->health = 240;
self->health = 240 * st.health_multiplier;
self->gib_health = -100;
self->mass = 250;
self->yaw_speed = 45;

View file

@ -1869,7 +1869,7 @@ SP_monster_widow(edict_t *self)
VectorSet(self->mins, -40, -40, 0);
VectorSet(self->maxs, 40, 40, 144);
self->health = 2000 + 1000 * (skill->value);
self->health = 2000 + 1000 * (skill->value) * st.health_multiplier;
if (coop->value)
{

View file

@ -1496,7 +1496,7 @@ SP_monster_widow2(edict_t *self)
VectorSet(self->mins, -70, -70, 0);
VectorSet(self->maxs, 70, 70, 144);
self->health = 2000 + 800 + 1000 * (skill->value);
self->health = 2000 + 800 + 1000 * (skill->value) * st.health_multiplier;
if (coop->value)
{

View file

@ -389,7 +389,7 @@ SP_monster_wizard(edict_t *self)
self->s.modelindex = gi.modelindex("models/monsters/wizard/tris.md2");
VectorSet(self->mins, -16, -16, -24);
VectorSet(self->maxs, 16, 16, 40);
self->health = 80;
self->health = 80 * st.health_multiplier;
sound_proj_hit = gi.soundindex("wizard/hit.wav");
sound_attack = gi.soundindex("wizard/wattack.wav");

View file

@ -215,7 +215,7 @@ fire_zombie_gib(edict_t *self, vec3_t start, vec3_t aimdir, int damage, int spee
gib->s.effects |= EF_GIB;
VectorClear(gib->mins);
VectorClear(gib->maxs);
gib->s.modelindex = gi.modelindex("models/monsters/objects/gibs/sm_meat/tris.md2");
gib->s.modelindex = gi.modelindex("models/objects/gibs/sm_meat/tris.md2");
gib->owner = self;
gib->touch = zombie_gib_touch;
gib->nextthink = level.time + 2.5;
@ -731,7 +731,7 @@ SP_monster_zombie(edict_t *self)
self->s.modelindex = gi.modelindex("models/monsters/zombie/tris.md2");
VectorSet(self->mins, -16, -16, -24);
VectorSet(self->maxs, 16, 16, 40);
self->health = 60;
self->health = 60 * st.health_multiplier;
sound_sight = gi.soundindex("zombie/z_idle.wav");
sound_search = gi.soundindex("zombie/z_idle.wav");

View file

@ -58,6 +58,7 @@
{"origin", FOFS(s.origin), F_VECTOR},
{"angles", FOFS(s.angles), F_VECTOR},
{"angle", FOFS(s.angles), F_ANGLEHACK},
{"health_multiplier", STOFS(health_multiplier), F_FLOAT, FFL_SPAWNTEMP},
{"rgb", STOFS(rgba), F_RGBA, FFL_SPAWNTEMP},
{"rgba", STOFS(rgba), F_RGBA, FFL_SPAWNTEMP},
{"scale", STOFS(scale), F_VECTOR, FFL_SPAWNTEMP},