From 07b1738dea29c1f9303c5d79e8deb2f2e3b06a1d Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Tue, 17 Sep 2024 02:03:27 -0700 Subject: [PATCH 01/22] Merged qw progs --- .gitignore | 1 + build.py | 6 + qcsrc/ai.qc | 18 - qcsrc/client.qc | 743 +++++++++++++++++++---------------- qcsrc/combat.qc | 54 ++- qcsrc/deathmatch_modes.qc | 34 ++ qcsrc/defs.qc | 123 +++++- qcsrc/doors.qc | 11 +- qcsrc/items.qc | 374 +++++++++++++++--- qcsrc/localized_text.qc | 175 +++++---- qcsrc/lq1/cutscene_camera.qc | 36 +- qcsrc/lq1/progs.dat | Bin 0 -> 324810 bytes qcsrc/lq1/qwprogs.dat | Bin 0 -> 144870 bytes qcsrc/misc.qc | 87 +++- qcsrc/monsters/enforcer.qc | 62 --- qcsrc/monsters/grunt.qc | 2 +- qcsrc/monsters/ogre.qc | 2 +- qcsrc/monsters/spawn.qc | 2 +- qcsrc/monsters/vore.qc | 2 +- qcsrc/plats.qc | 7 +- qcsrc/player.qc | 102 ++++- qcsrc/progs.src | 1 + qcsrc/qw.qc | 2 + qcsrc/qwprogs.src | 21 + qcsrc/server.qc | 125 ++++++ qcsrc/spectate.qc | 111 ++++++ qcsrc/subs.qc | 20 + qcsrc/triggers.qc | 34 +- qcsrc/weapons.qc | 395 +++++++++++++++---- qcsrc/world.qc | 11 + 30 files changed, 1859 insertions(+), 702 deletions(-) create mode 100644 qcsrc/deathmatch_modes.qc create mode 100644 qcsrc/lq1/progs.dat create mode 100644 qcsrc/lq1/qwprogs.dat create mode 100644 qcsrc/qw.qc create mode 100644 qcsrc/qwprogs.src create mode 100644 qcsrc/server.qc create mode 100644 qcsrc/spectate.qc diff --git a/.gitignore b/.gitignore index a78f0f84b..7314b01c7 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ docs/lqlogos/logomockup-wip2.xcf lq1/maps/.bmodelbspbak.7z lq1/config.cfg lq1/progs.dat +lq1/qwprogs.dat lq1/gfx/pop.png lq-pl.png lq-pl.xcf diff --git a/build.py b/build.py index 0bd8c55b1..d2debacb2 100644 --- a/build.py +++ b/build.py @@ -177,6 +177,12 @@ def compile_progs(): stderr=subprocess.STDOUT, check=True, # Fail on non-zero exit code ) + subprocess.run( + ["fteqcc", "qcsrc/qwprogs.src", "-D__LIBREQUAKE__", "-O3"], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + check=True, # Fail on non-zero exit code + ) except subprocess.CalledProcessError as e: print(f"!!! Command failed:\n{e.stdout.decode('utf-8')}") raise e diff --git a/qcsrc/ai.qc b/qcsrc/ai.qc index df942ee63..617b226ee 100644 --- a/qcsrc/ai.qc +++ b/qcsrc/ai.qc @@ -61,24 +61,6 @@ walkmove(angle, speed) primitive is all or nothing entity sight_entity; float sight_entity_time; -//pitch (angles_x) is inverted in quake due to a bug - //use makevectors2 for monsters with nonzero pitch -//anyone encountering this comment with a better understanding should update the comment to be more informative and useful to modders --gnounc -void makevectors2(vector ang) = -{ - ang_x *= -1; - makevectors(ang); -}; - -float(float v) anglemod = -{ - while (v >= 360) - v = v - 360; - while (v < 0) - v = v + 360; - return v; -}; - /* ============================================================================== diff --git a/qcsrc/client.qc b/qcsrc/client.qc index b1ab6af52..ff35c270b 100644 --- a/qcsrc/client.qc +++ b/qcsrc/client.qc @@ -33,6 +33,8 @@ float modelindex_eyes, modelindex_player; =============================================================================*/ +string nextmap; + float intermission_running; float intermission_exittime; @@ -161,14 +163,26 @@ entity() FindIntermission = }; -string nextmap; void() GotoNextMap = { + local string newmap; + if (cvar("samelevel")) // if samelevel is set, stay on same level + { changelevel (mapname); - + } else - changelevel (nextmap); + { +#ifdef __QW__ + newmap = infokey(world, mapname); + if (newmap != "") + changelevel (newmap); + else + changelevel (nextmap); +#else + changelevel (nextmap); +#endif + } }; // cypress (09 mar 2024) -- use struct for epilogue levels. @@ -289,10 +303,6 @@ void() execute_changelevel = else intermission_exittime = time + 2; - WriteByte (MSG_ALL, SVC_CDTRACK); - WriteByte (MSG_ALL, 3); - WriteByte (MSG_ALL, 3); - pos = FindIntermission (); other = find (world, classname, "player"); @@ -311,7 +321,23 @@ void() execute_changelevel = other = find (other, classname, "player"); } +#ifdef __QW__ + WriteByte (MSG_ALL, SVC_CDTRACK); + WriteByte (MSG_ALL, 3); + + WriteByte (MSG_ALL, SVC_INTERMISSION); + WriteCoord (MSG_ALL, pos.origin_x); + WriteCoord (MSG_ALL, pos.origin_y); + WriteCoord (MSG_ALL, pos.origin_z); + WriteAngle (MSG_ALL, pos.mangle_x); + WriteAngle (MSG_ALL, pos.mangle_y); + WriteAngle (MSG_ALL, pos.mangle_z); +#else + WriteByte (MSG_ALL, SVC_CDTRACK); + WriteByte (MSG_ALL, 3); + WriteByte (MSG_ALL, 3); WriteByte (MSG_ALL, SVC_INTERMISSION); +#endif }; @@ -320,15 +346,23 @@ void() changelevel_touch = if (other.classname != "player") return; +#ifdef __QW__ + if ((cvar("samelevel") == 2) || ((cvar("samelevel") == 3) && (mapname != "start"))) + { + T_Damage (other, self, self, 50000); + return; + } +#else if ((cvar("noexit") == 1) || ((cvar("noexit") == 2) && (mapname != "start"))) { T_Damage (other, self, self, 50000); return; } +#endif - bprint (other.netname); - bprint (LOC_CLIENT_DISCON); - bprint ("\n"); + bprint (PRINT_HIGH, other.netname); + bprint (PRINT_HIGH, LOC_CLIENT_DISCON); + bprint (PRINT_HIGH, "\n"); nextmap = self.map; @@ -415,11 +449,12 @@ Player entered the suicide command */ void() ClientKill = { - bprint (self.netname); - bprint (LOC_DEATH_SUICIDE); - bprint ("\n"); + bprint (PRINT_MEDIUM, self.netname); + bprint (PRINT_MEDIUM, LOC_DEATH_SUICIDE); + bprint (PRINT_MEDIUM, "\n"); set_suicide_frame (); self.modelindex = modelindex_player; + logfrag (self, self); self.frags = self.frags - 2; // extra penalty respawn (); }; @@ -549,6 +584,7 @@ void() PlayerDie; void() PutClientInServer = { local entity spot; + local float axes_only; self.classname = "player"; self.health = 100; @@ -576,7 +612,7 @@ void() PutClientInServer = self.th_die = PlayerDie; self.deadflag = DEAD_NO; - // paustime is set by teleporters to keep the player from moving a while + // pausetime is set by teleporters to keep the player from moving a while self.pausetime = 0; spot = SelectSpawnPoint (); @@ -596,6 +632,8 @@ void() PutClientInServer = self.view_ofs = '0 0 22'; + self.velocity = '0 0 0'; + player_stand1 (); if (deathmatch || coop) @@ -608,9 +646,62 @@ void() PutClientInServer = stuffcmd(self, "-attack\n"); // Supa, prevent shooting after respawning in MP -// centerprint(self, getMapname(mapname)); //gnounc --thought it would be fun. I was at odds about adding an unexpected feature. I may remove it later - //BAM removed it later. --gnounc +#ifdef __QW__ + // Set Rocket Jump Modifiers + if (stof(infokey(world, "rj")) != 0) + { + rj = stof(infokey(world, "rj")); + } + axes_only = stof(infokey(world, "axe")); +#endif + + // Deathmatch 4 starting items + if (deathmatch_supermode()) + { + self.ammo_shells = 0; + if (axes_only == 0) + { + self.ammo_nails = 255; + self.ammo_shells = 255; + self.ammo_rockets = 255; + self.ammo_cells = 255; + self.items = self.items | IT_NAILGUN; + self.items = self.items | IT_SUPER_NAILGUN; + self.items = self.items | IT_SUPER_SHOTGUN; + self.items = self.items | IT_ROCKET_LAUNCHER; + // self.items = self.items | IT_GRENADE_LAUNCHER; + self.items = self.items | IT_LIGHTNING; + } + self.items = self.items - (self.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + IT_ARMOR3; + self.armorvalue = 200; + self.armortype = 0.8; + self.health = 250; + self.items = self.items | IT_INVULNERABILITY; + self.invincible_time = 1; + self.invincible_finished = time + 3; + } + // Deathmatch 5 starting items + if (deathmatch_supermode2()) + { + self.ammo_nails = 80; + self.ammo_shells = 30; + self.ammo_rockets = 10; + self.ammo_cells = 30; + self.items = self.items | IT_NAILGUN; + self.items = self.items | IT_SUPER_NAILGUN; + self.items = self.items | IT_SUPER_SHOTGUN; + self.items = self.items | IT_ROCKET_LAUNCHER; + self.items = self.items | IT_GRENADE_LAUNCHER; + self.items = self.items | IT_LIGHTNING; + self.items = self.items - (self.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + IT_ARMOR3; + self.armorvalue = 200; + self.armortype = 0.8; + self.health = 200; + self.items = self.items | IT_INVULNERABILITY; + self.invincible_time = 1; + self.invincible_finished = time + 3; + } }; @@ -753,15 +844,9 @@ Exit deathmatch games upon conditions ============*/ void() CheckRules = { - local float timelimit; - local float fraglimit; - if (gameover) // someone else quit the game already return; - timelimit = cvar("timelimit") * 60; - fraglimit = cvar("fraglimit"); - if (timelimit && time >= timelimit) { NextLevel (); @@ -828,6 +913,8 @@ void() PlayerJump = if (self.waterlevel >= 2) { + +#ifndef __QW__ if (self.watertype == CONTENT_WATER) self.velocity_z = 100; @@ -836,6 +923,7 @@ void() PlayerJump = else self.velocity_z = 50; +#endif // play swimming sound if (self.swim_flag < time) @@ -860,12 +948,17 @@ void() PlayerJump = self.flags = self.flags - (self.flags & FL_JUMPRELEASED); - self.flags = self.flags - FL_ONGROUND; // don't stairwalk + self.button2 = 0; // player jumping sound sound (self, CHAN_AUTO, "player/plyrjmp8.wav", 1, ATTN_NORM); + +#ifndef __QW__ + self.flags = self.flags - FL_ONGROUND; // don't stairwalk self.velocity_z = self.velocity_z + 270; +#endif + }; @@ -963,8 +1056,10 @@ void() WaterMove = self.dmgtime = 0; } +#ifndef __QW__ if (! (self.flags & FL_WATERJUMP) ) self.velocity = self.velocity - 0.8*self.waterlevel*frametime*self.velocity; +#endif }; void() CheckWaterJump = @@ -1079,8 +1174,8 @@ void() CheckPowerups = { if (self.invisible_time == 1) { - sprint (self, LOC_ITEM_FADE_SHADRING); - sprint (self, "\n"); + sprint (self, PRINT_HIGH, LOC_ITEM_FADE_SHADRING); + sprint (self, PRINT_HIGH, "\n"); stuffcmd (self, "bf\n"); sound (self, CHAN_AUTO, "items/inv2.wav", 1, ATTN_NORM); self.invisible_time = time + 1; @@ -1116,8 +1211,8 @@ void() CheckPowerups = { if (self.invincible_time == 1) { - sprint (self, LOC_ITEM_FADE_PENTPROT); - sprint (self, "\n"); + sprint (self, PRINT_HIGH, LOC_ITEM_FADE_PENTPROT); + sprint (self, PRINT_HIGH, "\n"); stuffcmd (self, "bf\n"); sound (self, CHAN_AUTO, "items/protect2.wav", 1, ATTN_NORM); self.invincible_time = time + 1; @@ -1137,10 +1232,19 @@ void() CheckPowerups = self.invincible_finished = 0; } if (self.invincible_finished > time) + { self.effects = self.effects | EF_DIMLIGHT; - +#ifdef __QW__ + self.effects = self.effects | EF_RED; +#endif + } else + { self.effects = self.effects - (self.effects & EF_DIMLIGHT); +#ifdef __QW__ + self.effects = self.effects - (self.effects & EF_RED); +#endif + } } // super damage @@ -1152,8 +1256,11 @@ void() CheckPowerups = { if (self.super_time == 1) { - sprint (self, LOC_ITEM_FADE_QUADDMG); - sprint (self, "\n"); + if (deathmatch_supermode()) + sprint (self, PRINT_HIGH, LOC_ITEM_FADE_QUADDMG); + else + sprint (self, PRINT_HIGH, LOC_ITEM_FADE_OCTDMG); + sprint (self, PRINT_HIGH, "\n"); stuffcmd (self, "bf\n"); sound (self, CHAN_AUTO, "items/damage2.wav", 1, ATTN_NORM); self.super_time = time + 1; @@ -1169,14 +1276,31 @@ void() CheckPowerups = if (self.super_damage_finished < time) { // just stopped self.items = self.items - IT_QUAD; + if (deathmatch_supermode()) + { + self.ammo_cells = 255; + self.armorvalue = 1; + self.armortype = 0.8; + self.health = 100; + } self.super_damage_finished = 0; self.super_time = 0; } if (self.super_damage_finished > time) + { self.effects = self.effects | EF_DIMLIGHT; +#ifdef __QW__ + self.effects = self.effects | EF_BLUE; +#endif + } else + { self.effects = self.effects - (self.effects & EF_DIMLIGHT); +#ifdef __QW__ + self.effects = self.effects - (self.effects & EF_BLUE); +#endif + } } // suit @@ -1189,8 +1313,8 @@ void() CheckPowerups = { if (self.rad_time == 1) { - sprint (self, LOC_ITEM_FADE_BIOSUIT); - sprint (self, "\n"); + sprint (self, PRINT_HIGH, LOC_ITEM_FADE_BIOSUIT); + sprint (self, PRINT_HIGH, "\n"); stuffcmd (self, "bf\n"); sound (self, CHAN_AUTO, "items/suit2.wav", 1, ATTN_NORM); self.rad_time = time + 1; @@ -1227,8 +1351,6 @@ void() PlayerPostThink = if (self.deadflag) return; - W_WeaponFrame (); // do weapon stuff - // check to see if player landed and play landing sound if ((self.jump_flag < -300) && (self.flags & FL_ONGROUND) && (self.health > 0)) { @@ -1248,10 +1370,16 @@ void() PlayerPostThink = self.jump_flag = 0; } +#ifdef __QW__ + self.jump_flag = self.velocity_z; +#else if (!(self.flags & FL_ONGROUND)) self.jump_flag = self.velocity_z; +#endif CheckPowerups (); + + W_WeaponFrame (); // do weapon stuff }; @@ -1262,9 +1390,9 @@ called when a player connects to a server ============*/ void() ClientConnect = { - bprint (self.netname); - bprint (LOC_CLIENT_JOIN); - bprint ("\n"); + bprint (PRINT_HIGH, self.netname); + bprint (PRINT_HIGH, LOC_CLIENT_JOIN); + bprint (PRINT_HIGH, "\n"); // a client connecting during an intermission can cause problems if (intermission_running) @@ -1286,11 +1414,11 @@ void() ClientDisconnect = // since they aren't *really* leaving // let everyone else know - bprint (self.netname); - bprint (LOC_CLIENT_DISCON_DM_A); - bprint (ftos(self.frags)); - bprint (LOC_CLIENT_DISCON_DM_B); - bprint ("\n"); + bprint (PRINT_HIGH, self.netname); + bprint (PRINT_HIGH, LOC_CLIENT_DISCON_DM_A); + bprint (PRINT_HIGH, ftos(self.frags)); + bprint (PRINT_HIGH, LOC_CLIENT_DISCON_DM_B); + bprint (PRINT_HIGH, "\n"); sound (self, CHAN_BODY, "player/tornoff2.wav", 1, ATTN_NONE); set_suicide_frame (); }; @@ -1302,48 +1430,68 @@ called when a player dies ============*/ void(entity targ, entity attacker) ClientObituary = { - local float rnum; + local float rnum; + local float attacker_weapon; -#ifdef __LIBREQUAKE__ - - local float rnum2; + local string deathstring, deathstring2; -#endif // __LIBREQUAKE__ + local float on_team; - local string deathstring, deathstring2; - deathstring = deathstring2 = string_null; - // From GPL QW source - local float attackerteam, targteam; // gb +#ifdef __QW__ + local string attackerteam, targteam; +#else + local float attackerteam, targteam; +#endif +#ifdef __QW__ + attackerteam = infokey(attacker, "team"); + targteam = infokey(targ, "team"); + on_team = attackerteam != ""; +#else // gb attackerteam = attacker.team; targteam = targ.team; + on_team = attackerteam != 0; +#endif + + deathstring = deathstring2 = string_null; rnum = random(); + if (targ.deathtype == "selfwater") + { + bprint (PRINT_MEDIUM, targ.netname); + bprint (PRINT_MEDIUM, LOC_DEATH_DISCHARGE_SELF); + bprint (PRINT_MEDIUM, "\n"); + targ.frags = targ.frags - 1; + return; + } + if (targ.classname == "player") { - if (attacker.classname == "teledeath") + if (attacker.classname == "teledeath" || attacker.classname == "teledeath3") { - bprint (targ.netname); - bprint (LOC_DEATH_TELEFRAG); - bprint (attacker.owner.netname); - bprint ("\n"); + bprint (PRINT_MEDIUM, targ.netname); + bprint (PRINT_MEDIUM, LOC_DEATH_TELEFRAG); + bprint (PRINT_MEDIUM, attacker.owner.netname); + bprint (PRINT_MEDIUM, "\n"); attacker.owner.frags = attacker.owner.frags + 1; + logfrag (attacker.owner, targ); return; } if (attacker.classname == "teledeath2") { - bprint (LOC_DEATH_DEFLECT_A); - bprint (targ.netname); - bprint (LOC_DEATH_DEFLECT_B); - bprint (attacker.enemy.netname); - bprint ("\n"); + bprint (PRINT_MEDIUM, LOC_DEATH_DEFLECT_A); + bprint (PRINT_MEDIUM, targ.netname); + bprint (PRINT_MEDIUM, LOC_DEATH_DEFLECT_B); + bprint (PRINT_MEDIUM, attacker.enemy.netname); + bprint (PRINT_MEDIUM, "\n"); - targ.frags = targ.frags - 1; + attacker.owner.frags = attacker.owner.frags + 1; + logfrag (attacker.owner, targ); return; } @@ -1352,53 +1500,95 @@ void(entity targ, entity attacker) ClientObituary = { // Custom death messages for trigger_hurt if (attacker.dmg == 666000) { - bprint(targ.netname); + bprint(PRINT_MEDIUM, targ.netname); #ifdef __LIBREQUAKE__ if (random() < 0.01) - bprint(LOC_DEATH_FALL_2); + bprint(PRINT_MEDIUM, LOC_DEATH_FALL2); else - bprint(LOC_DEATH_FALL_1); + bprint(PRINT_MEDIUM, LOC_DEATH_FALL1); #else - bprint(LOC_DEATH_FALL); + bprint(PRINT_MEDIUM, LOC_DEATH_FALL); #endif // __LIBREQUAKE__ - bprint("\n"); + bprint(PRINT_MEDIUM, "\n"); return; } -#ifdef __LIBREQUAKE__ - if (attacker.dmg == 666001) { - bprint(targ.netname); + bprint(PRINT_MEDIUM, targ.netname); + +#ifdef __LIBREQUAKE__ if (random() < 0.01) - bprint(LOC_DEATH_SPACE_2); + bprint(PRINT_MEDIUM, LOC_DEATH_SPACE2); else - bprint(LOC_DEATH_SPACE_1); + bprint(PRINT_MEDIUM, LOC_DEATH_SPACE1); + +#else + + bprint(PRINT_MEDIUM, LOC_DEATH_FALL); + +#endif // __LIBREQUAKE__ - bprint("\n"); + bprint(PRINT_MEDIUM, "\n"); return; } if (attacker.dmg == 666002) { - bprint(targ.netname); + bprint(PRINT_MEDIUM, targ.netname); + +#ifdef __LIBREQUAKE__ if (random() < 0.01) - bprint(LOC_DEATH_VOID_2); + bprint(PRINT_MEDIUM, LOC_DEATH_VOID2); else - bprint(LOC_DEATH_VOID_1); + bprint(PRINT_MEDIUM, LOC_DEATH_VOID1); - bprint("\n"); - return; - } +#else + + bprint(PRINT_MEDIUM, LOC_DEATH_FALL); #endif // __LIBREQUAKE__ + bprint(PRINT_MEDIUM, "\n"); + return; + } + } + + if (targ.deathtype == "squish") + { + if (teamplay && targteam == attackerteam && on_team && targ != attacker) + { + logfrag (attacker, attacker); + attacker.frags = attacker.frags - 1; + bprint (PRINT_MEDIUM, attacker.netname); + bprint (PRINT_MEDIUM, LOC_TEAMKILL_SQUISH); + bprint (PRINT_MEDIUM, "\n"); + return; + } + else if (attacker.classname == "player" && attacker != targ) + { + bprint (PRINT_MEDIUM, targ.netname); + bprint (PRINT_MEDIUM, LOC_DEATH_SQUISH2); + bprint (PRINT_MEDIUM, attacker.netname); + bprint (PRINT_MEDIUM, "\n"); + logfrag (attacker, targ); + attacker.frags = attacker.frags + 1; + return; + } + else + { + logfrag (targ, targ); + targ.frags = targ.frags - 1; // killed self + bprint (PRINT_MEDIUM, targ.netname); + bprint (PRINT_MEDIUM, " was squished\n"); + return; + } } if (attacker.classname == "player") @@ -1406,64 +1596,41 @@ void(entity targ, entity attacker) ClientObituary = if (targ == attacker) { // killed self + logfrag (attacker, attacker); attacker.frags = attacker.frags - 1; - bprint (targ.netname); - - if (targ.weapon == 64 && targ.waterlevel > 1) + bprint (PRINT_MEDIUM, targ.netname); + + if (targ.deathtype == "grenade") + { + bprint (PRINT_MEDIUM, LOC_DEATH_SELF_GRENADE); + bprint (PRINT_MEDIUM, "\n"); + } + else if (targ.deathtype == "rocket") + { + bprint (PRINT_MEDIUM, LOC_DEATH_SELF_ROCKET); + bprint (PRINT_MEDIUM, "\n"); + } + else if (targ.deathtype == "discharge") { - -#ifdef __LIBREQUAKE__ - if (targ.watertype == CONTENT_SLIME) - bprint (LOC_DEATH_DISCHARGE_SLIME); + bprint (PRINT_MEDIUM, LOC_DEATH_DISCHARGE_SLIME); else if (targ.watertype == CONTENT_LAVA) - bprint (LOC_DEATH_DISCHARGE_LAVA); + bprint (PRINT_MEDIUM, LOC_DEATH_DISCHARGE_LAVA); else + bprint (PRINT_MEDIUM, LOC_DEATH_DISCHARGE_WATER); -#endif // __LIBREQUAKE__ - - bprint (LOC_DEATH_DISCHARGE_WATER); - - bprint ("\n"); + bprint (PRINT_MEDIUM, "\n"); return; } - if (targ.weapon == 16) { - bprint (LOC_DEATH_SELF_GRENADE); - bprint ("\n"); - } - -#ifdef __LIBREQUAKE__ - - else if (targ.weapon == 32) { - bprint (LOC_DEATH_SELF_ROCKET); - bprint ("\n"); - } else { - bprint (LOC_DEATH_SELF_OTHER); - bprint ("\n"); + bprint (PRINT_MEDIUM, LOC_DEATH_SELF_OTHER); + bprint (PRINT_MEDIUM, "\n"); } - -#else - - else if (rnum) { - bprint(LOC_DEATH_SUICIDE_WEAPON_1); - bprint ("\n"); - } - else { - bprint(LOC_DEATH_SUICIDE_WEAPON_2); - bprint ("\n"); - } - -#endif // __LIBREQUAKE__ - return; } -#ifdef __LIBREQUAKE__ - - else if ( (teamplay == 2) && (targteam == attackerteam) && - (attackerteam != 0) ) // gb + else if ( (teamplay) && (targteam == attackerteam) && on_team ) // gb { if (rnum < 0.25) deathstring = LOC_TEAMKILL_1; @@ -1477,26 +1644,29 @@ void(entity targ, entity attacker) ClientObituary = else deathstring = LOC_TEAMKILL_4; - bprint (attacker.netname); - bprint (deathstring); - bprint ("\n"); + bprint (PRINT_MEDIUM, attacker.netname); + bprint (PRINT_MEDIUM, deathstring); + bprint (PRINT_MEDIUM, "\n"); attacker.frags = attacker.frags - 1; + //ZOID 12-13-96: killing a teammate logs as suicide + logfrag (attacker, attacker); return; } -#endif // __LIBREQUAKE__ - else { + logfrag (attacker, targ); attacker.frags = attacker.frags + 1; - rnum = attacker.weapon; + attacker_weapon = attacker.weapon; - if (rnum == IT_AXE) + // Axe + if (targ.deathtype == "axe") { + deathstring = LOC_DEATH_AXE_1A; + deathstring2 = LOC_DEATH_AXE_1B; #ifdef __LIBREQUAKE__ - if (attacker.super_damage_finished > 0) { deathstring = LOC_DEATH_AXE_QA; deathstring2 = LOC_DEATH_AXE_QB; @@ -1505,25 +1675,16 @@ void(entity targ, entity attacker) ClientObituary = deathstring = LOC_DEATH_AXE_2A; deathstring2 = LOC_DEATH_AXE_2B; } - else { - deathstring = LOC_DEATH_AXE_1A; - deathstring2 = LOC_DEATH_AXE_1B; - } - -#else - - deathstring = LOC_DEATH_AXE_A; - deathstring2 = LOC_DEATH_AXE_B; - -#endif // __LIBREQUAKE__ - +#endif } - if (rnum == IT_SHOTGUN) + // Shotgun + else if (targ.deathtype == "shotgun") { + deathstring = LOC_DEATH_SHOTGUN_1A; + deathstring2 = LOC_DEATH_SHOTGUN_1B; #ifdef __LIBREQUAKE__ - if (attacker.super_damage_finished > 0) { deathstring = LOC_DEATH_SHOTGUN_QA; deathstring2 = LOC_DEATH_SHOTGUN_QB; @@ -1532,25 +1693,16 @@ void(entity targ, entity attacker) ClientObituary = deathstring = LOC_DEATH_SHOTGUN_2A; deathstring2 = LOC_DEATH_SHOTGUN_2B; } - else { - deathstring = LOC_DEATH_SHOTGUN_1A; - deathstring2 = LOC_DEATH_SHOTGUN_1B; - } - -#else - - deathstring = LOC_DEATH_SHOTGUN_A; - deathstring2 = LOC_DEATH_SHOTGUN_B; - -#endif // __LIBREQUAKE__ - +#endif } - if (rnum == IT_SUPER_SHOTGUN) + // Super Shotgun + else if (targ.deathtype == "supershotgun") { + deathstring = LOC_DEATH_SUPER_SHOTGUN_1A; + deathstring2 = LOC_DEATH_SUPER_SHOTGUN_1B; #ifdef __LIBREQUAKE__ - if (attacker.super_damage_finished > 0) { deathstring = LOC_DEATH_SUPER_SHOTGUN_QA; deathstring2 = LOC_DEATH_SUPER_SHOTGUN_QB; @@ -1559,25 +1711,16 @@ void(entity targ, entity attacker) ClientObituary = deathstring = LOC_DEATH_SUPER_SHOTGUN_2A; deathstring2 = LOC_DEATH_SUPER_SHOTGUN_2B; } - else { - deathstring = LOC_DEATH_SUPER_SHOTGUN_1A; - deathstring2 = LOC_DEATH_SUPER_SHOTGUN_1B; - } - -#else - - deathstring = LOC_DEATH_SUPER_SHOTGUN_A; - deathstring2 = LOC_DEATH_SUPER_SHOTGUN_B; - -#endif // __LIBREQUAKE__ - +#endif } - if (rnum == IT_NAILGUN) + // Nailgun + else if (targ.deathtype == "nail") { + deathstring = LOC_DEATH_NAILGUN_1A; + deathstring2 = LOC_DEATH_NAILGUN_1B; #ifdef __LIBREQUAKE__ - if (attacker.super_damage_finished > 0) { deathstring = LOC_DEATH_NAILGUN_QA; deathstring2 = LOC_DEATH_NAILGUN_QB; @@ -1586,25 +1729,16 @@ void(entity targ, entity attacker) ClientObituary = deathstring = LOC_DEATH_NAILGUN_2A; deathstring2 = LOC_DEATH_NAILGUN_2B; } - else { - deathstring = LOC_DEATH_NAILGUN_1A; - deathstring2 = LOC_DEATH_NAILGUN_1B; - } - -#else - - deathstring = LOC_DEATH_NAILGUN_A; - deathstring2 = LOC_DEATH_NAILGUN_B; - -#endif // __LIBREQUAKE__ - +#endif } - if (rnum == IT_SUPER_NAILGUN) + // Super Nailgun + else if (targ.deathtype == "supernail") { + deathstring = LOC_DEATH_SUPER_NAILGUN_1A; + deathstring2 = LOC_DEATH_SUPER_NAILGUN_1B; #ifdef __LIBREQUAKE__ - if (attacker.super_damage_finished > 0) { deathstring = LOC_DEATH_SUPER_NAILGUN_QA; deathstring2 = LOC_DEATH_SUPER_NAILGUN_QB; @@ -1613,31 +1747,21 @@ void(entity targ, entity attacker) ClientObituary = deathstring = LOC_DEATH_SUPER_NAILGUN_2A; deathstring2 = LOC_DEATH_SUPER_NAILGUN_2B; } - else { - deathstring = LOC_DEATH_SUPER_NAILGUN_1A; - deathstring2 = LOC_DEATH_SUPER_NAILGUN_1B; - } - -#else - - deathstring = LOC_DEATH_SUPER_NAILGUN_A; - deathstring2 = LOC_DEATH_SUPER_NAILGUN_B; - -#endif // __LIBREQUAKE__ - +#endif } - if (rnum == IT_GRENADE_LAUNCHER) + // Grenade Launcher + else if (targ.deathtype == "grenade") { + deathstring = LOC_DEATH_GRENADE_LAUNCHER_1A; + deathstring2 = LOC_DEATH_GRENADE_LAUNCHER_1B; #ifdef __LIBREQUAKE__ - if (attacker.super_damage_finished > 0) { deathstring = LOC_DEATH_GRENADE_LAUNCHER_QA; deathstring2 = LOC_DEATH_GRENADE_LAUNCHER_QB; } - else if (targ.health < -40) - { + else if (targ.health < 40) { deathstring = LOC_DEATH_GRENADE_LAUNCHER_GA; deathstring2 = LOC_DEATH_GRENADE_LAUNCHER_GB; } @@ -1645,91 +1769,71 @@ void(entity targ, entity attacker) ClientObituary = deathstring = LOC_DEATH_GRENADE_LAUNCHER_2A; deathstring2 = LOC_DEATH_GRENADE_LAUNCHER_2B; } - else { - deathstring = LOC_DEATH_GRENADE_LAUNCHER_1A; - deathstring2 = LOC_DEATH_GRENADE_LAUNCHER_1B; - } - #else - - if (targ.health < -40) { - deathstring = LOC_DEATH_GRENADE_LAUNCHER_2A; - deathstring2 = LOC_DEATH_GRENADE_LAUNCHER_2B; - } - else { - deathstring = LOC_DEATH_GRENADE_LAUNCHER_1A; - deathstring2 = LOC_DEATH_GRENADE_LAUNCHER_1B; + if (targ.health < 40) { + deathstring = LOC_DEATH_GRENADE_LAUNCHER_GA; + deathstring2 = LOC_DEATH_GRENADE_LAUNCHER_GB; } - -#endif // __LIBREQUAKE__ - +#endif } - if (rnum == IT_ROCKET_LAUNCHER) + // Rocket Launcher + else if (targ.deathtype == "rocket") { + deathstring = LOC_DEATH_ROCKET_LAUNCHER_1A; + deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_1B; #ifdef __LIBREQUAKE__ - if (attacker.super_damage_finished > 0) { - rnum2 = random(); - if (rnum2 < 0.33) { - deathstring = LOC_DEATH_ROCKET_LAUNCHER_Q1A; - deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_Q1B; - } - else if (rnum2 < 0.66) { - deathstring = LOC_DEATH_ROCKET_LAUNCHER_Q2A; - deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_Q2B; - } - else { - deathstring = LOC_DEATH_ROCKET_LAUNCHER_Q3A; - deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_Q3B; - } + deathstring = LOC_DEATH_ROCKET_LAUNCHER_Q1A; + deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_Q1B; } - else if (targ.health < -40) - { + else if (targ.health < 40) { deathstring = LOC_DEATH_ROCKET_LAUNCHER_GA; - deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_GA; + deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_GB; } else if (random() < 0.01) { deathstring = LOC_DEATH_ROCKET_LAUNCHER_2A; deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_2B; } - else { - deathstring = LOC_DEATH_ROCKET_LAUNCHER_1A; - deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_1B; - } - #else - - if (targ.health < -40) { - deathstring = LOC_DEATH_ROCKET_LAUNCHER_2A; - deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_2B; - } - else { - deathstring = LOC_DEATH_ROCKET_LAUNCHER_1A; - deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_1B; + if (targ.health < 40) { + if (attacker.super_damage_finished > 0) { + rnum = random(); + if (rnum < 0.3) { + deathstring = LOC_DEATH_ROCKET_LAUNCHER_Q1A; + deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_Q1B; + } + else if (rnum < 0.6) { + deathstring = LOC_DEATH_ROCKET_LAUNCHER_Q2A; + deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_Q2B; + } + else { + // This one flips the order of attacker and target + bprint (PRINT_MEDIUM, attacker.netname); + bprint (PRINT_MEDIUM, LOC_DEATH_ROCKET_LAUNCHER_Q3A); + bprint (PRINT_MEDIUM, targ.netname); + bprint (PRINT_MEDIUM, LOC_DEATH_ROCKET_LAUNCHER_Q3B); + bprint (PRINT_MEDIUM, "\n"); + return; + } + } + else + { + deathstring = LOC_DEATH_ROCKET_LAUNCHER_GA; + deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_GB; + } } - -#endif // __LIBREQUAKE__ - +#endif } - if (rnum == IT_LIGHTNING) - { + // Lightning Gun + else if (targ.deathtype == "lightning") { + deathstring = LOC_DEATH_LIGHTNING_1A; + deathstring2 = LOC_DEATH_LIGHTNING_1B; #ifdef __LIBREQUAKE__ - - if (attacker.waterlevel > 1) { - if (random() < 0.5) { - deathstring = LOC_DEATH_LIGHTNING_D1A; - deathstring2 = LOC_DEATH_LIGHTNING_D1B; - } - else { - deathstring = LOC_DEATH_LIGHTNING_D2A; - deathstring2 = LOC_DEATH_LIGHTNING_D2B; - } - } - else if (attacker.super_damage_finished > 0) { + if (attacker.super_damage_finished > 0) { deathstring = LOC_DEATH_LIGHTNING_QA; deathstring2 = LOC_DEATH_LIGHTNING_QB; } @@ -1737,41 +1841,39 @@ void(entity targ, entity attacker) ClientObituary = deathstring = LOC_DEATH_LIGHTNING_2A; deathstring2 = LOC_DEATH_LIGHTNING_2B; } - else { - deathstring = LOC_DEATH_LIGHTNING_1A; - deathstring2 = LOC_DEATH_LIGHTNING_1B; - } - -#else - - deathstring = LOC_DEATH_LIGHTNING_A; - - if (attacker.waterlevel > 1) - deathstring2 = LOC_DEATH_LIGHTNING_UNDERWATER; - else - deathstring2 = LOC_DEATH_LIGHTNING_ONGROUND; +#endif + } -#endif // __LIBREQUAKE__ + // Lightning Gun Discharge + else if (targ.deathtype == "discharge") { + deathstring = LOC_DEATH_LIGHTNING_DA; + deathstring2 = LOC_DEATH_LIGHTNING_DB; + } + // Unknown Cause + else { + deathstring = LOC_DEATH_KILL; + deathstring2 = LOC_DEATH_KILL; } - bprint (targ.netname); - bprint (deathstring); - bprint (attacker.netname); - bprint (deathstring2); - bprint ("\n"); + bprint (PRINT_MEDIUM, targ.netname); + bprint (PRINT_MEDIUM, deathstring); + bprint (PRINT_MEDIUM, attacker.netname); + bprint (PRINT_MEDIUM, deathstring2); + bprint (PRINT_MEDIUM, "\n"); } return; } else { + logfrag (targ, targ); targ.frags = targ.frags - 1; // killed self - bprint (targ.netname); + bprint (PRINT_MEDIUM, targ.netname); if (attacker.solid == SOLID_BSP && attacker != world) { - bprint (LOC_DEATH_SQUISH); - bprint ("\n"); + bprint (PRINT_MEDIUM, LOC_DEATH_SQUISH); + bprint (PRINT_MEDIUM, "\n"); return; } @@ -1782,17 +1884,17 @@ void(entity targ, entity attacker) ClientObituary = #ifdef __LIBREQUAKE__ if (random() < 0.01) - bprint(LOC_DEATH_FALL_2); + bprint(PRINT_MEDIUM, LOC_DEATH_FALL2); else - bprint(LOC_DEATH_FALL_1); + bprint(PRINT_MEDIUM, LOC_DEATH_FALL1); #else - bprint(LOC_DEATH_FALL); + bprint(PRINT_MEDIUM, LOC_DEATH_FALL); #endif // __LIBREQUAKE__ - bprint("\n"); + bprint(PRINT_MEDIUM, "\n"); return; } @@ -1800,45 +1902,26 @@ void(entity targ, entity attacker) ClientObituary = { rnum = random(); -#ifdef __LIBREQUAKE__ - - if (rnum < 0.33) { - bprint (LOC_DEATH_DROWN1); - bprint ("\n"); - } - else if (rnum < 0.66) { - bprint (LOC_DEATH_DROWN2); - bprint ("\n"); - } - else { - bprint (LOC_DEATH_DROWN3); - bprint ("\n"); - } - -#else - if (rnum < 0.5) { - bprint (LOC_DEATH_DROWN1); - bprint ("\n"); + bprint (PRINT_MEDIUM, LOC_DEATH_DROWN1); + bprint (PRINT_MEDIUM, "\n"); } else { - bprint (LOC_DEATH_DROWN2); - bprint ("\n"); + bprint (PRINT_MEDIUM, LOC_DEATH_DROWN2); + bprint (PRINT_MEDIUM, "\n"); } -#endif // __LIBREQUAKE__ - return; } if (targ.deathtype == "slime") { if (random() < 0.5) { - bprint (LOC_DEATH_SLIME1); - bprint ("\n"); + bprint (PRINT_MEDIUM, LOC_DEATH_SLIME1); + bprint (PRINT_MEDIUM, "\n"); } else { - bprint (LOC_DEATH_SLIME2); - bprint ("\n"); + bprint (PRINT_MEDIUM, LOC_DEATH_SLIME2); + bprint (PRINT_MEDIUM, "\n"); } return; } @@ -1847,18 +1930,18 @@ void(entity targ, entity attacker) ClientObituary = { if (targ.health < -15) { - bprint (LOC_DEATH_LAVA3); - bprint ("\n"); + bprint (PRINT_MEDIUM, LOC_DEATH_LAVA3); + bprint (PRINT_MEDIUM, "\n"); return; } if (random() < 0.5) { - bprint (LOC_DEATH_LAVA1); - bprint ("\n"); + bprint (PRINT_MEDIUM, LOC_DEATH_LAVA1); + bprint (PRINT_MEDIUM, "\n"); } else { - bprint (LOC_DEATH_LAVA2); - bprint ("\n"); + bprint (PRINT_MEDIUM, LOC_DEATH_LAVA2); + bprint (PRINT_MEDIUM, "\n"); } return; } @@ -1867,13 +1950,13 @@ void(entity targ, entity attacker) ClientObituary = // yes, a null-check makes sense here //SavageX if(attacker.killstring != string_null) {//gnounc - bprint (attacker.killstring); - bprint ("\n"); // Added since killstrings in LOC don't have \n // ZungryWare + bprint (PRINT_MEDIUM, attacker.killstring); + bprint (PRINT_MEDIUM, "\n"); // Added since killstrings in LOC don't have \n // ZungryWare return; } - bprint (LOC_DEATH_OTHER); - bprint ("\n"); + bprint (PRINT_MEDIUM, LOC_DEATH_OTHER); + bprint (PRINT_MEDIUM, "\n"); } } }; diff --git a/qcsrc/combat.qc b/qcsrc/combat.qc index 28ddead20..430ef64b8 100644 --- a/qcsrc/combat.qc +++ b/qcsrc/combat.qc @@ -110,6 +110,7 @@ void(entity targ, entity attacker) Killed = self.takedamage = DAMAGE_NO; self.touch = __NULL__; + self.effects = 0; monster_death_use(); self.th_die (); @@ -130,7 +131,17 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage= local entity oldself; local float save; local float take; - local string temp_deathtype; + local string temp_deathtype; + local string s; + local float on_team; + +#ifdef __QW__ + local string attackerteam; + local string targteam; +#else + local float attackerteam; + local float targteam; +#endif if (!targ.takedamage) return; @@ -146,8 +157,11 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage= damage_attacker = attacker; // check for quad damage powerup on the attacker - if (attacker.super_damage_finished > time) - damage = damage * 4; + if (attacker.super_damage_finished > time && inflictor.classname != "door") + if (deathmatch_supermode() == 4) + damage = damage * 8; + else + damage = damage * 4; // save damage based on the target's armor level save = ceil(targ.armortype*damage); @@ -172,12 +186,17 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage= targ.dmg_inflictor = inflictor; } + damage_inflictor = inflictor; + // figure momentum add if ( (inflictor != world) && (targ.movetype == MOVETYPE_WALK) ) { dir = targ.origin - (inflictor.absmin + inflictor.absmax) * 0.5; dir = normalize(dir); targ.velocity = targ.velocity + dir*damage*8; + + if ( (rj > 1) & ((attacker.classname == "player") & (targ.classname == "player")) & ( attacker.netname == targ.netname)) + targ.velocity = targ.velocity + dir * damage * rj; } // check for godmode or invincibility @@ -196,9 +215,28 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage= } // team play damage avoidance - if ( (teamplay == 1) && (targ.team > 0)&&(targ.team == attacker.team) ) +#ifdef __QW__ + // ZOID 12-13-96: self.team doesn't work in QW. Use keys + attackerteam = infokey(attacker, "team"); + targteam = infokey(targ, "team"); + on_team = attackerteam != ""; +#else + attackerteam = attacker.team; + targteam = targ.team; + on_team = attackerteam != 0; +#endif + + if ((teamplay == 1) && (targteam == attackerteam) && + (attacker.classname == "player") && on_team && + inflictor.classname !="door") + return; + + if ((teamplay == 3) && (targteam == attackerteam) && + (attacker.classname == "player") && on_team && + (targ != attacker) && inflictor.classname !="door") return; + // do the damage targ.health = targ.health - take; @@ -243,7 +281,7 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage= /*============ T_RadiusDamage ============*/ -void(entity inflictor, entity attacker, float damage, entity ignore) T_RadiusDamage = +void(entity inflictor, entity attacker, float damage, entity ignore, string dtype) T_RadiusDamage = { local float points; local entity head; @@ -271,11 +309,11 @@ void(entity inflictor, entity attacker, float damage, entity ignore) T_RadiusDam if (points > 0) { if (CanDamage (head, inflictor)) - { // shambler takes half damage from all explosions - + { + head.deathtype = dtype; + // shambler takes half damage from all explosions if (head.classname == "monster_shambler") T_Damage (head, inflictor, attacker, points*0.5); - else T_Damage (head, inflictor, attacker, points); } diff --git a/qcsrc/deathmatch_modes.qc b/qcsrc/deathmatch_modes.qc new file mode 100644 index 000000000..2a1cb31d4 --- /dev/null +++ b/qcsrc/deathmatch_modes.qc @@ -0,0 +1,34 @@ +// +// deathmatch_modes.qc -- Centralized location for defining which deathmatch +// modes have which settings +// + +float() deathmatch_weapon_stay = +{ + return deathmatch >= 2; +} + +float() deathmatch_item_respawn = +{ + return deathmatch && (deathmatch != 2); +} + +float() deathmatch_classic = +{ + return deathmatch == 1; +} + +float() deathmatch_supermode = +{ + return deathmatch == 4; +} + +float() deathmatch_supermode2 = +{ + return deathmatch == 5; +} + +float() deathmatch_no_powerups = +{ + return deathmatch == 6; +} diff --git a/qcsrc/defs.qc b/qcsrc/defs.qc index 3275afbaf..0713c18fc 100644 --- a/qcsrc/defs.qc +++ b/qcsrc/defs.qc @@ -32,6 +32,12 @@ entity world; float time; float frametime; +#ifdef __QW__ +entity newmis; // if this is set, the entity that just + // run created a new missile that should + // be simulated immediately +#endif + float force_retouch; // force all entities to touch triggers // next frame. this is needed because // non-moving things don't normally scan @@ -42,9 +48,11 @@ float force_retouch; // force all entities to touch triggers // to guarantee everything is touched string mapname; +#ifndef __QW__ float deathmatch; float coop; float teamplay; +#endif float serverflags; // propagated from level to level, used to // keep track of completed episodes @@ -120,6 +128,11 @@ void end_sys_globals; // flag for structure dumping .vector absmin, absmax; // *** origin + mins / maxs .float ltime; // local time for entity + +#ifdef __QW__ +.float lastruntime; +#endif + .float movetype; .float solid; @@ -129,7 +142,9 @@ void end_sys_globals; // flag for structure dumping .vector angles; .vector avelocity; +#ifndef __QW__ .vector punchangle; // temp angle adjust from damage or recoil +#endif .string classname; // spawn function .string model; @@ -174,8 +189,10 @@ void end_sys_globals; // flag for structure dumping .float fixangle; .vector v_angle; // view / targeting angle for players -.float idealpitch; // calculated pitch angle for lookup up slopes +#ifndef __QW__ +.float idealpitch; // calculated pitch angle for lookup up slopes +#endif .string netname; @@ -355,7 +372,13 @@ float SVC_INTERMISSION = 30; float SVC_FINALE = 31; float SVC_CDTRACK = 32; float SVC_SELLSCREEN = 33; +#ifdef __QW__ +float SVC_SMALLKICK = 34; +float SVC_BIGKICK = 35; +float SVC_MUZZLEFLASH = 39; +#else float SVC_CUTSCENE = 34; +#endif float TE_SPIKE = 0; @@ -370,6 +393,10 @@ float TE_KNIGHTSPIKE = 8; float TE_LIGHTNING3 = 9; float TE_LAVASPLASH = 10; float TE_TELEPORT = 11; +#ifdef __QW__ +float TE_BLOOD = 12; +float TE_LIGHTNINGBLOOD = 13; +#endif // sound channels // channel 0 never willingly overrides @@ -379,6 +406,11 @@ float CHAN_WEAPON = 1; float CHAN_VOICE = 2; float CHAN_ITEM = 3; float CHAN_BODY = 4; +#ifdef __QW__ +float CHAN_NO_PHS_ADD = 8; +#else +float CHAN_NO_PHS_ADD = 0; // NetQuake doesn't support this mode, so set it to 0 +#endif float ATTN_NONE = 0; float ATTN_NORM = 1; @@ -394,11 +426,19 @@ float UPDATE_TEMP = 3; // entity effects +#ifdef __QW__ +float EF_BRIGHTLIGHT = 4; +float EF_DIMLIGHT = 8; +float EF_FLAG1 = 16; +float EF_FLAG2 = 32; +float EF_BLUE = 64; // Blue Globe effect for Quad +float EF_RED = 128; +#else float EF_BRIGHTFIELD = 1; float EF_MUZZLEFLASH = 2; float EF_BRIGHTLIGHT = 4; float EF_DIMLIGHT = 8; - +#endif // messages float MSG_BROADCAST = 0; // unreliable to all @@ -406,24 +446,62 @@ float MSG_ONE = 1; // reliable to one (msg_entity) float MSG_ALL = 2; // reliable to all float MSG_INIT = 3; // write to the init string +#ifdef __QW__ +float MSG_MULTICAST = 4; // for multicast() call +#endif + + +// message levels +float PRINT_LOW = 0; // pickup messages +float PRINT_MEDIUM = 1; // death messages +float PRINT_HIGH = 2; // critical messages +float PRINT_CHAT = 3; // also goes to chat console + +#ifdef __QW__ +// multicast sets +float MULTICAST_ALL = 0; // every client +float MULTICAST_PHS = 1; // within hearing +float MULTICAST_PVS = 2; // within sight +float MULTICAST_ALL_R = 3; // every client, reliable +float MULTICAST_PHS_R = 4; // within hearing, reliable +float MULTICAST_PVS_R = 5; // within sight, reliable +#endif + //================================================ // // globals // +#ifndef __QW__ float movedist; +#endif float gameover; // set when a rule exits string string_null; // null string, nothing should be held here +#ifndef __QW__ entity newmis; // launch_spike sets this after spawning it +#endif entity activator; // the entity that activated a trigger or brush entity damage_attacker; // set by T_Damage +entity damage_inflictor; float framecount; +// +// cvars checked each frame +// float skill; +float timelimit; +float fraglimit; +#ifdef __QW__ +float deathmatch; +float coop; +float teamplay; +#endif + +float rj; //================================================ @@ -473,8 +551,13 @@ float AS_MISSILE = 4; // // player only fields // +.float voided; .float walkframe; +// Zoid Additions +.float maxspeed; // Used to set Maxspeed on a player +.float gravity; // Gravity Multiplier (0 to 1.0) + .float attack_finished; .float pain_finished; @@ -572,7 +655,7 @@ float AS_MISSILE = 4; //pitch (angles_x) is inverted in quake due to a bug //use makevectors2 for monsters with nonzero pitch //anyone encountering this comment with a better understanding should update the comment to be more informative and useful to modders --gnounc -void makevectors2(vector ang); +void(vector ang) makevectors2; //=========================================================================== @@ -610,8 +693,17 @@ string(string s) precache_sound = #19; string(string s) precache_model = #20; void(entity client, string s)stuffcmd = #21; entity(vector org, float rad) findradius = #22; -void(string s) bprint = #23; -void(entity client, string s) sprint = #24; + +#ifdef __QW__ +void(float level, string s) bprint = #23; +void(entity client, float level, string s) sprint = #24; +#else +void(string s) bprint_e = #23; +void(entity client, string s) sprint_e = #24; +void(float level, string s) bprint = { bprint_e(s); }; +void(entity client, float level, string s) sprint = { sprint_e(client, s); }; +#endif + void(string s) dprint = #25; string(float f) ftos = #26; string(vector v) vtos = #27; @@ -635,7 +727,11 @@ vector(entity e, float speed) aim = #44; // returns the shooting vector float(string s) cvar = #45; // return cvar.value void(string s) localcmd = #46; // put string into local que entity(entity e) nextent = #47; // for looping through all ents + +#ifndef __QW__ void(vector o, vector d, float color, float count) particle = #48;// start a particle effect +#endif + void() ChangeYaw = #49; // turn towards self.ideal_yaw // at self.yaw_speed // #50 was removed @@ -690,6 +786,19 @@ void(entity e) setspawnparms = #78; // set parm1... to the // values at level start // for coop respawn +#ifdef __QW__ +void(entity killer, entity killee) logfrag = #79; // add to stats +#else +void(entity killer, entity killee) logfrag = {}; // add to stats +#endif + +#ifdef __QW__ +string(entity e, string key) infokey = #80; // get a key value (world = serverinfo) +float(string s) stof = #81; // convert string to float +void(vector where, float set) multicast = #82; // sends the temp message to a set + // of clients, possibly in PVS or PHS +#endif + //============================================================================ // @@ -698,9 +807,11 @@ void(entity e) setspawnparms = #78; // set parm1... to the void(vector tdest, float tspeed, void() func) SUB_CalcMove; void(entity ent, vector tdest, float tspeed, void() func) SUB_CalcMoveEnt; void(vector destangle, float tspeed, void() func) SUB_CalcAngleMove; -void() SUB_CalcMoveDone; +void() SUB_CalcMoveDone; void() SUB_CalcAngleMoveDone; +void() SUB_Null; void() SUB_UseTargets; +void() SUB_Remove; // // combat.qc diff --git a/qcsrc/doors.qc b/qcsrc/doors.qc index cc64d7832..24e6f555f 100644 --- a/qcsrc/doors.qc +++ b/qcsrc/doors.qc @@ -45,7 +45,8 @@ void() door_go_up; void() door_blocked = { - T_Damage (other, self, self, self.dmg); + other.deathtype = "squish"; + T_Damage (other, self, self.goalentity, self.dmg); // if a door has a negative wait, it would never come back if blocked, // so let it just squash the object to death real fast @@ -62,7 +63,7 @@ void() door_blocked = void() door_hit_top = { - sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); + sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise1, 1, ATTN_NORM); self.state = STATE_TOP; if (self.spawnflags & DOOR_TOGGLE) @@ -74,7 +75,7 @@ void() door_hit_top = void() door_hit_bottom = { - sound (self, CHAN_VOICE, self.noise1, 1, ATTN_NORM); + sound (self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise1, 1, ATTN_NORM); self.state = STATE_BOTTOM; }; @@ -154,6 +155,7 @@ void() door_fire = starte = self; do { + self.goalentity = activator; // Who fired us door_go_up (); self = self.enemy; } while ( (self != starte) && (self != world) ); @@ -718,7 +720,7 @@ void () fd_secret_done = self.th_pain = (void(entity attacker, float damage)) fd_secret_use; self.th_die = fd_secret_use;//copypasta'd directly from gpl'd qw source on github. -- secret door kill crash fix } - sound(self, CHAN_VOICE, self.noise3, 1, ATTN_NORM); + sound(self, CHAN_NO_PHS_ADD+CHAN_VOICE, self.noise3, 1, ATTN_NORM); }; void () secret_blocked = @@ -727,6 +729,7 @@ void () secret_blocked = return; self.attack_finished = time + 0.5; + other.deathtype = "squish"; T_Damage (other, self, self, self.dmg); }; diff --git a/qcsrc/items.qc b/qcsrc/items.qc index 634c62d57..f4cdd43b2 100644 --- a/qcsrc/items.qc +++ b/qcsrc/items.qc @@ -43,6 +43,136 @@ void() noclass = }; +// ================ +// Dropped powerups +// ================ + +void() q_touch = +{ +local entity stemp; +local float best; +local string s; + + if (other.classname != "player") + return; + if (other.health <= 0) + return; + + self.mdl = self.model; + + sound (other, CHAN_VOICE, self.noise, 1, ATTN_NORM); + stuffcmd (other, "bf\n"); + self.solid = SOLID_NOT; + other.items = other.items | IT_QUAD; + self.model = string_null; + if (deathmatch == 4) + { + other.armortype = 0; + other.armorvalue = 0 * 0.01; + other.ammo_cells = 0; + } + +// do the apropriate action + other.super_time = 1; + other.super_damage_finished = self.cnt; + + s=ftos(rint(other.super_damage_finished - time)); + + bprint (PRINT_LOW, other.netname); + if (deathmatch == 4) + bprint (PRINT_LOW, " recovered an OctaPower with "); + else + bprint (PRINT_LOW, " recovered a Quad with "); + bprint (PRINT_LOW, s); + bprint (PRINT_LOW, " seconds remaining!\n"); + + activator = other; + SUB_UseTargets(); // fire all targets / killtargets +}; + + +void(float timeleft) DropQuad = +{ + local entity item; + + item = spawn(); + item.origin = self.origin; + + item.velocity_z = 300; + item.velocity_x = -100 + (random() * 200); + item.velocity_y = -100 + (random() * 200); + + item.flags = FL_ITEM; + item.solid = SOLID_TRIGGER; + item.movetype = MOVETYPE_TOSS; + item.noise = "items/damage.wav"; + setmodel (item, "progs/quaddama.mdl"); + setsize (item, '-16 -16 -24', '16 16 32'); + item.cnt = time + timeleft; + item.touch = q_touch; + item.nextthink = time + timeleft; // remove it with the time left on it + item.think = SUB_Remove; +}; + + +void() r_touch; + +void() r_touch = +{ +local entity stemp; +local float best; +local string s; + + if (other.classname != "player") + return; + if (other.health <= 0) + return; + + self.mdl = self.model; + + sound (other, CHAN_VOICE, self.noise, 1, ATTN_NORM); + stuffcmd (other, "bf\n"); + self.solid = SOLID_NOT; + other.items = other.items | IT_INVISIBILITY; + self.model = string_null; + +// do the apropriate action + other.invisible_time = 1; + other.invisible_finished = self.cnt; + s=ftos(rint(other.invisible_finished - time)); + bprint (PRINT_LOW, other.netname); + bprint (PRINT_LOW, " recovered a Ring with "); + bprint (PRINT_LOW, s); + bprint (PRINT_LOW, " seconds remaining!\n"); + + + activator = other; + SUB_UseTargets(); // fire all targets / killtargets +}; + + +void(float timeleft) DropRing = +{ + local entity item; + + item = spawn(); + item.origin = self.origin; + + item.velocity_z = 300; + item.velocity_x = -100 + (random() * 200); + item.velocity_y = -100 + (random() * 200); + + item.flags = FL_ITEM; + item.solid = SOLID_TRIGGER; + item.movetype = MOVETYPE_TOSS; + item.noise = "items/inv1.wav"; + setmodel (item, "progs/invisibl.mdl"); + setsize (item, '-16 -16 -24', '16 16 32'); + item.cnt = time + timeleft; + item.touch = r_touch; + item.nextthink = time + timeleft; // remove after 30 seconds + item.think = SUB_Remove; +}; /*============ PlaceItem @@ -173,6 +303,10 @@ void() health_touch = { local string s; + if (deathmatch_supermode()) + if (other.invincible_time > 0) + return; + if (other.classname != "player") return; @@ -190,11 +324,11 @@ void() health_touch = return; } - sprint(other, LOC_ITEM_PICKUP_HEALTH); + sprint(other, PRINT_LOW, LOC_ITEM_PICKUP_HEALTH); s = ftos(self.healamount); - sprint(other, s); - sprint(other, LOC_ITEM_TYPE_HEALTH); - sprint(other, "\n"); + sprint(other, PRINT_LOW, s); + sprint(other, PRINT_LOW, LOC_ITEM_TYPE_HEALTH); + sprint(other, PRINT_LOW, "\n"); // health touch sound sound(other, CHAN_ITEM, self.noise, 1, ATTN_NORM); @@ -208,14 +342,16 @@ void() health_touch = if (self.healtype == 2) { other.items = other.items | IT_SUPERHEALTH; - self.nextthink = time + 5; - self.think = item_megahealth_rot; self.owner = other; + if (!deathmatch_supermode()) { + self.nextthink = time + 5; + self.think = item_megahealth_rot; + } } else { - if (deathmatch && deathmatch != 2) // deathmatch 2 is the silly old rules + if (deathmatch_item_respawn()) // deathmatch 2 is the silly old rules { self.nextthink = time + 20; self.think = SUB_regen; @@ -242,7 +378,7 @@ void() item_megahealth_rot = // just blindly subtract the flag off other.items = other.items - (other.items & IT_SUPERHEALTH); - if (deathmatch && deathmatch != 2) // deathmatch 2 is silly old rules + if (deathmatch_item_respawn()) // deathmatch 2 is silly old rules { self.nextthink = time + 20; self.think = SUB_regen; @@ -268,6 +404,10 @@ void() armor_touch = if (other.classname != "player") return; + + if (deathmatch_supermode) + if (other.invincible_time > 0) + return; // cypress (07 feb 2024) -- adopted switch switch(self.classname) { @@ -300,15 +440,15 @@ void() armor_touch = self.solid = SOLID_NOT; self.model = string_null; - if (deathmatch && deathmatch != 2) + if (deathmatch_item_respawn()) self.nextthink = time + 20; self.think = SUB_regen; - sprint(other, LOC_ITEM_PICKUP_NORMAL); - sprint(other, ftos(value)); - sprint(other, LOC_ITEM_TYPE_ARMOR); - sprint(other, "\n"); + sprint(other, PRINT_LOW, LOC_ITEM_PICKUP_NORMAL); + sprint(other, PRINT_LOW, ftos(value)); + sprint(other, PRINT_LOW, LOC_ITEM_TYPE_ARMOR); + sprint(other, PRINT_LOW, "\n"); // armor touch sound sound(other, CHAN_ITEM, "items/armor1.wav", 1, ATTN_NORM); @@ -478,9 +618,8 @@ void() weapon_touch = best = W_BestWeapon(); self = stemp; - if (deathmatch > 1 || coop) + if (deathmatch_weapon_stay() || coop) leave = 1; - else leave = 0; @@ -547,10 +686,10 @@ void() weapon_touch = else objerror ("weapon_touch: unknown classname"); - sprint (other, LOC_ITEM_PICKUP_NORMAL); - sprint (other, "the "); - sprint (other, self.netname); - sprint (other, "\n"); + sprint (other, PRINT_LOW, LOC_ITEM_PICKUP_NORMAL); + sprint (other, PRINT_LOW, "the "); + sprint (other, PRINT_LOW, self.netname); + sprint (other, PRINT_LOW, "\n"); // weapon touch sound sound (other, CHAN_ITEM, "weapons/pkup.wav", 1, ATTN_NORM); stuffcmd (other, "bf\n"); @@ -581,7 +720,7 @@ void() weapon_touch = self.model = string_null; self.solid = SOLID_NOT; - if (deathmatch == 1) + if (deathmatch && !deathmatch_weapon_stay()) self.nextthink = time + 30; self.think = SUB_regen; @@ -599,6 +738,9 @@ void() weapon_touch = void() weapon_supershotgun = { + if (deathmatch_supermode() || deathmatch_supermode2()) + return; + precache_model ("progs/g_shot.mdl"); setmodel (self, "progs/g_shot.mdl"); self.weapon = IT_SUPER_SHOTGUN; @@ -616,6 +758,9 @@ void() weapon_supershotgun = void() weapon_nailgun = { + if (deathmatch_supermode() || deathmatch_supermode2()) + return; + precache_model ("progs/g_nail.mdl"); setmodel (self, "progs/g_nail.mdl"); self.weapon = IT_NAILGUN; @@ -633,6 +778,9 @@ void() weapon_nailgun = void() weapon_supernailgun = { + if (deathmatch_supermode() || deathmatch_supermode2()) + return; + precache_model ("progs/g_nail2.mdl"); setmodel (self, "progs/g_nail2.mdl"); self.weapon = IT_SUPER_NAILGUN; @@ -650,6 +798,9 @@ void() weapon_supernailgun = void() weapon_grenadelauncher = { + if (deathmatch_supermode() || deathmatch_supermode2()) + return; + precache_model ("progs/g_rock.mdl"); setmodel (self, "progs/g_rock.mdl"); self.weapon = IT_GRENADE_LAUNCHER; @@ -667,6 +818,9 @@ void() weapon_grenadelauncher = void() weapon_rocketlauncher = { + if (deathmatch_supermode() || deathmatch_supermode2()) + return; + precache_model ("progs/g_rock2.mdl"); setmodel (self, "progs/g_rock2.mdl"); self.weapon = IT_ROCKET_LAUNCHER; @@ -685,6 +839,9 @@ void() weapon_rocketlauncher = void() weapon_lightning = { + if (deathmatch_supermode() || deathmatch_supermode2()) + return; + precache_model ("progs/g_light.mdl"); setmodel (self, "progs/g_light.mdl"); self.weapon = IT_LIGHTNING; @@ -759,11 +916,11 @@ void() ammo_touch = bound_other_ammo (); // Print message - sprint (other, LOC_ITEM_PICKUP_NORMAL); - sprint (other, ftos(self.aflag)); - sprint (other, " "); - sprint (other, self.netname); - sprint (other, "\n"); + sprint (other, PRINT_LOW, LOC_ITEM_PICKUP_NORMAL); + sprint (other, PRINT_LOW, ftos(self.aflag)); + sprint (other, PRINT_LOW, " "); + sprint (other, PRINT_LOW, self.netname); + sprint (other, PRINT_LOW, "\n"); // ammo touch sound sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM); @@ -789,7 +946,7 @@ void() ammo_touch = self.model = string_null; self.solid = SOLID_NOT; - if (deathmatch && deathmatch != 2) + if (deathmatch_item_respawn()) self.nextthink = time + 30; self.think = SUB_regen; @@ -811,6 +968,9 @@ float WEAPON_BIG2 = 1; void() item_shells = { + if (deathmatch_supermode()) + return; + self.touch = ammo_touch; if (self.spawnflags & WEAPON_BIG2) @@ -841,6 +1001,9 @@ void() item_shells = void() item_spikes = { + if (deathmatch_supermode()) + return; + self.touch = ammo_touch; if (self.spawnflags & WEAPON_BIG2) @@ -871,6 +1034,9 @@ void() item_spikes = void() item_rockets = { + if (deathmatch_supermode()) + return; + self.touch = ammo_touch; if (self.spawnflags & WEAPON_BIG2) @@ -902,6 +1068,9 @@ void() item_rockets = void() item_cells = { + if (deathmatch_supermode()) + return; + self.touch = ammo_touch; if (self.spawnflags & WEAPON_BIG2) @@ -1018,9 +1187,9 @@ void() key_touch = if (other.items & self.items) return; - sprint (other, LOC_ITEM_PICKUP_NORMAL); - sprint (other, self.netname); - sprint (other,"\n"); + sprint (other, PRINT_LOW, LOC_ITEM_PICKUP_NORMAL); + sprint (other, PRINT_LOW, self.netname); + sprint (other, PRINT_LOW, "\n"); sound (other, CHAN_ITEM, self.noise, 1, ATTN_NORM); stuffcmd (other, "bf\n"); @@ -1181,9 +1350,9 @@ void() sigil_touch = msg = string_null; if (msg != string_null) { - bprint (other.netname); - bprint (msg); - bprint ("\n"); + bprint (PRINT_HIGH, other.netname); + bprint (PRINT_HIGH, msg); + bprint (PRINT_HIGH, "\n"); centerprint2 (other, LOC_RUNE_LQ_YOU, msg); } @@ -1266,9 +1435,9 @@ void() powerup_touch = if (other.health <= 0) return; - sprint (other, LOC_ITEM_PICKUP_NORMAL); - sprint (other, self.netname); - sprint (other,"\n"); + sprint (other, PRINT_LOW, LOC_ITEM_PICKUP_NORMAL); + sprint (other, PRINT_LOW, self.netname); + sprint (other, PRINT_LOW, "\n"); if (deathmatch) { @@ -1309,6 +1478,12 @@ void() powerup_touch = if (self.classname == "item_artifact_super_damage") { + if (deathmatch_supermode()) + { + other.armortype = 0; + other.armorvalue = 0; + other.ammo_cells = 0; + } other.super_time = 1; other.super_damage_finished = time + 30; } @@ -1327,7 +1502,7 @@ Player is invulnerable for 30 seconds */ void() item_artifact_invulnerability = { - if (deathmatch == 4) { + if (deathmatch_no_powerups()) { return; } @@ -1340,6 +1515,11 @@ void() item_artifact_invulnerability = self.noise = "items/protect.wav"; setmodel (self, "progs/invulner.mdl"); self.netname = LOC_ITEM_NAME_PENTPROT; + +#ifdef __QW__ + self.effects = self.effects | EF_RED; +#endif + self.items = IT_INVULNERABILITY; setsize (self, '-16 -16 -24', '16 16 32'); StartItem (); @@ -1375,7 +1555,7 @@ Player is invisible for 30 seconds */ void() item_artifact_invisibility = { - if (deathmatch == 4) { + if (deathmatch_no_powerups()) { return; } @@ -1402,7 +1582,7 @@ The next attack from the player will do 4x damage */ void() item_artifact_super_damage = { - if (deathmatch == 4) { + if (deathmatch_no_powerups()) { return; } @@ -1412,7 +1592,16 @@ void() item_artifact_super_damage = precache_sound ("items/damage.wav"); self.noise = "items/damage.wav"; setmodel (self, "progs/quaddama.mdl"); - self.netname = LOC_ITEM_NAME_QUADDMG; + + if (deathmatch_supermode()) + self.netname = LOC_ITEM_NAME_OCTDMG; + else + self.netname = LOC_ITEM_NAME_QUADDMG; + +#ifdef __QW__ + self.effects = self.effects | EF_BLUE; +#endif + self.items = IT_QUAD; setsize (self, '-16 -16 -24', '16 16 32'); StartItem (); @@ -1437,6 +1626,10 @@ void() BackpackTouch = local entity stemp; local float acount; + if (deathmatch_supermode()) + if (other.invincible_time > 0) + return; + if (other.classname != "player") return; @@ -1444,14 +1637,53 @@ void() BackpackTouch = return; acount = 0; - sprint (other, LOC_ITEM_PICKUP_NORMAL);//Netquake does not support print_low + sprint (other, PRINT_LOW, LOC_ITEM_PICKUP_NORMAL); + + // Deathmatch 4 functionality + if (deathmatch_supermode()) + { + other.health = other.health + 10; + sprint (other, PRINT_LOW, "10"); + sprint (other, PRINT_LOW, LOC_ITEM_PICKUP_ADD_HEALTH); + sprint (other, PRINT_LOW, "\n"); + if ((other.health > 250) && (other.health < 300)) + sound (other, CHAN_ITEM, "items/protect3.wav", 1, ATTN_NORM); + else + sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM); + stuffcmd (other, "bf\n"); + remove(self); + + if (other.health > 299) + { + if (other.invincible_time != 1) + { + other.invincible_time = 1; + other.invincible_finished = time + 30; + other.items = other.items | IT_INVULNERABILITY; + + other.super_time = 1; + other.super_damage_finished = time + 30; + other.items = other.items | IT_QUAD; + + other.ammo_cells = 0; + + sound (other, CHAN_VOICE, "boss1/sight1.wav", 1, ATTN_NORM); + stuffcmd (other, "bf\n"); + bprint (PRINT_HIGH, other.netname); + bprint (PRINT_HIGH, LOC_BONUS_POWERS); + bprint (PRINT_HIGH, "\n"); + } + } + self = other; + return; + } if (self.items) { if ((other.items & self.items) == 0) { acount = 1; - sprint (other, self.netname); + sprint (other, PRINT_LOW, self.netname); } } @@ -1479,52 +1711,56 @@ void() BackpackTouch = if (self.ammo_shells) { if (acount) - sprint(other, ", "); + sprint(other, PRINT_LOW, ", "); acount = 1; s = ftos(self.ammo_shells); - sprint (other, s); - sprint (other, " "); - sprint (other, LOC_WEAPON_AMMO_SHELLS); + sprint (other, PRINT_LOW, s); + sprint (other, PRINT_LOW, " "); + sprint (other, PRINT_LOW, LOC_WEAPON_AMMO_SHELLS); } if (self.ammo_nails) { if (acount) - sprint(other, ", "); + sprint(other, PRINT_LOW, ", "); acount = 1; s = ftos(self.ammo_nails); - sprint (other, s); - sprint (other, " "); - sprint (other, LOC_WEAPON_AMMO_NAILS); + sprint (other, PRINT_LOW, s); + sprint (other, PRINT_LOW, " "); + sprint (other, PRINT_LOW, LOC_WEAPON_AMMO_NAILS); } if (self.ammo_rockets) { if (acount) - sprint(other, ", "); + sprint(other, PRINT_LOW, ", "); acount = 1; s = ftos(self.ammo_rockets); - sprint (other, s); - sprint (other, " "); - sprint (other, LOC_WEAPON_AMMO_ROCKETS); + sprint (other, PRINT_LOW, s); + sprint (other, PRINT_LOW, " "); + sprint (other, PRINT_LOW, LOC_WEAPON_AMMO_ROCKETS); } if (self.ammo_cells) { if (acount) - sprint(other, ", "); + sprint(other, PRINT_LOW, ", "); acount = 1; s = ftos(self.ammo_cells); - sprint (other, s); - sprint (other, " "); - sprint (other, LOC_WEAPON_AMMO_CELLS); + sprint (other, PRINT_LOW, s); + sprint (other, PRINT_LOW, " "); + sprint (other, PRINT_LOW, LOC_WEAPON_AMMO_CELLS); } - // sprint (other, LOC_ITEM_FROM_BACKPACK); - sprint (other, "\n"); + // sprint (other, PRINT_LOW, LOC_ITEM_FROM_BACKPACK); + sprint (other, PRINT_LOW, "\n"); + + // If backpack has a grenade or rocket launcher in it, fill it with at least five rockets + if ( (deathmatch && !deathmatch_classic()) && ( (WeaponCode(new)==6) || (WeaponCode(new)==7) ) && (other.ammo_rockets < 5) ) + other.ammo_rockets = 5; // backpack touch sound sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM); @@ -1568,8 +1804,24 @@ void() DropBackpack = item.items = self.weapon; - //gnounc - item.netname = LOC_ITEM_NAME_BACKPACK; + if (item.items == IT_AXE) + item.netname = LOC_WEAPON_NAME_AXE; + else if (item.items == IT_SHOTGUN) + item.netname = LOC_WEAPON_NAME_SHOTGUN; + else if (item.items == IT_SUPER_SHOTGUN) + item.netname = LOC_WEAPON_NAME_SUPER_SHOTGUN; + else if (item.items == IT_NAILGUN) + item.netname = LOC_WEAPON_NAME_NAILGUN; + else if (item.items == IT_SUPER_NAILGUN) + item.netname = LOC_WEAPON_NAME_SUPER_NAILGUN; + else if (item.items == IT_GRENADE_LAUNCHER) + item.netname = LOC_WEAPON_NAME_GRENADE_LAUNCH; + else if (item.items == IT_ROCKET_LAUNCHER) + item.netname = LOC_WEAPON_NAME_ROCKET_LAUNCH; + else if (item.items == IT_LIGHTNING) + item.netname = LOC_WEAPON_NAME_THUNDERBOLT; + else + item.netname = LOC_ITEM_NAME_BACKPACK; item.ammo_shells = self.ammo_shells; item.ammo_nails = self.ammo_nails; diff --git a/qcsrc/localized_text.qc b/qcsrc/localized_text.qc index ca59e30c1..5bc47aac8 100644 --- a/qcsrc/localized_text.qc +++ b/qcsrc/localized_text.qc @@ -1,23 +1,23 @@ /* - Copyright (C) 1996-1997 Id Software, Inc. - Copyright (C) 2023 ZungryWare - Copyright (C) 2024 Ivy Bowling + Copyright (C) 1996-1997 Id Software, Inc. + Copyright (C) 2023 ZungryWare + Copyright (C) 2024 Ivy Bowling - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - See file, 'COPYING', for details. + See file, 'COPYING', for details. */ // @@ -29,8 +29,8 @@ EPISODE EPILOGUE STRINGS - These strings in-engine have a 40 character limit before - truncation. + These strings in-engine have a 40 character limit before + truncation. ==============================================================================*/ @@ -105,6 +105,7 @@ #define LOC_ITEM_PICKUP_NORMAL "You got " #define LOC_ITEM_PICKUP_HEALTH "You receieve " +#define LOC_ITEM_PICKUP_ADD_HEALTH " additional health" #define LOC_ITEM_FROM_BACKPACK " from a backpack" // Unused.. @@ -114,29 +115,45 @@ #ifdef __LIBREQUAKE__ #define LOC_ITEM_NAME_QUADDMG "the Crusher Sigil" +#define LOC_ITEM_NAME_OCTDMG "the Demolisher Sigil" #define LOC_ITEM_NAME_PENTPROT "Lucifier's Protection" #define LOC_ITEM_NAME_SHADRING "the Eye of Enigma" #define LOC_ITEM_NAME_BIOSUIT "the Diving Suit" #define LOC_ITEM_NAME_BACKPACK "Backpack" #define LOC_ITEM_FADE_QUADDMG "Your Crusher Sigil is fading..." +#define LOC_ITEM_FADE_OCTDMG "Your Demolisher Sigil is fading..." #define LOC_ITEM_FADE_PENTPROT "Lucifier's Protection is fading..." #define LOC_ITEM_FADE_SHADRING "The Eye of Enigma is fading..." #define LOC_ITEM_FADE_BIOSUIT "Air in Diving Suit is running out..." +#define LOC_BONUS_POWERS " is coming for you all!!!" + +#define LOC_ITEM_LOST_A " lost " +#define LOC_ITEM_LOST_B " with " +#define LOC_ITEM_LOST_C " seconds left" + #else #define LOC_ITEM_NAME_QUADDMG "Quad Damage" +#define LOC_ITEM_NAME_OCTDMG "OctaPower" #define LOC_ITEM_NAME_PENTPROT "Pentagram of Protection" #define LOC_ITEM_NAME_SHADRING "Ring of Shadows" #define LOC_ITEM_NAME_BIOSUIT "Biosuit" #define LOC_ITEM_NAME_BACKPACK "Backpack" #define LOC_ITEM_FADE_QUADDMG "Quad Damage is wearing off" +#define LOC_ITEM_FADE_OCTDMG "OctaPower is wearing off" #define LOC_ITEM_FADE_PENTPROT "Protection is almost burned out" #define LOC_ITEM_FADE_SHADRING "Ring of Shadows magic is fading" #define LOC_ITEM_FADE_BIOSUIT "Air supply in Biosuit expiring" +#define LOC_BONUS_POWERS " attains bonus powers!!!" + +#define LOC_ITEM_LOST_A " lost a " +#define LOC_ITEM_LOST_B " with " +#define LOC_ITEM_LOST_C " seconds remaining" + #endif // __LIBREQUAKE__ /*============================================================================== @@ -254,7 +271,7 @@ #define LOC_DEATH_DOG " was gored by a Gore Hound" #define LOC_DEATH_OGRE " was demolished by a Deep One" #define LOC_DEATH_DEMON1 " was disemboweled by a Moon Rat" -#define LOC_DEATH_WIZARD " was poisoned by a Messenger" +#define LOC_DEATH_WIZARD " was shot by a Messenger" #define LOC_DEATH_ZOMBIE " was pelted by a Deathless Cultist" #define LOC_DEATH_KNIGHT " was stabbed by a Carcosan Knight" #define LOC_DEATH_HELL_KNIGHT " was gutted by a Biohell Warrior" @@ -262,7 +279,7 @@ #define LOC_DEATH_SHAMBLER " was shredded by a Hollow" #define LOC_DEATH_SHALRATH " was blasted by a Servant of Nyarlathotep" #define LOC_DEATH_TARBABY " was swarmed by a Bog Face" -#define LOC_DEATH_BOSS " was blasted by Cthulhi" +#define LOC_DEATH_BOSS " was obliterated by Cthulhi" #define LOC_DEATH_OLDONE " became one with Shoggoth" #else @@ -301,25 +318,25 @@ #define LOC_DEATH_FIREBALL " was hit by a lavaball" #define LOC_DEATH_LEAVE " tried to escape" #define LOC_DEATH_DROWN1 " forgot how to swim" -#define LOC_DEATH_DROWN2 " drowned" -#define LOC_DEATH_DROWN3 " ran out of air" +#define LOC_DEATH_DROWN2 " ran out of air" #define LOC_DEATH_SLIME1 " dissolved in acid" #define LOC_DEATH_SLIME2 " was disincorporated" #define LOC_DEATH_LAVA1 " fell into lava" #define LOC_DEATH_LAVA2 " combusted" #define LOC_DEATH_LAVA3 " dove headfirst into hot lava" -#define LOC_DEATH_FALL_1 " fell off a cliff" -#define LOC_DEATH_FALL_2 " took a long walk off a short pier" -#define LOC_DEATH_SPACE_1 " fell into space" -#define LOC_DEATH_SPACE_2 "'s screams went unheard" -#define LOC_DEATH_VOID_1 " fell into the void" -#define LOC_DEATH_VOID_2 " fell out of existence" +#define LOC_DEATH_FALL1 " fell off a cliff" +#define LOC_DEATH_FALL2 " took a long walk off a short pier" +#define LOC_DEATH_SPACE1 " fell into space" +#define LOC_DEATH_SPACE2 "'s screams went unheard" +#define LOC_DEATH_VOID1 " fell into the void" +#define LOC_DEATH_VOID2 " fell out of existence" #define LOC_DEATH_DISCHARGE_WATER " took a toaster bath" #define LOC_DEATH_DISCHARGE_SLIME " took a toaster bath" #define LOC_DEATH_DISCHARGE_LAVA " took a toaster bath" +#define LOC_DEATH_DISCHARGE_SELF "'s Lightning Gun Malfunctioned" #define LOC_DEATH_SELF_GRENADE " didn't launch the grenade far enough" #define LOC_DEATH_SELF_ROCKET " played with explosives" -#define LOC_DEATH_SELF_OTHER " died" +#define LOC_DEATH_SELF_OTHER " misfired" #define LOC_DEATH_SUICIDE " committed suicide" #define LOC_DEATH_OTHER " died" @@ -340,10 +357,13 @@ #define LOC_DEATH_LAVA2 " visits the Volcano God" #define LOC_DEATH_LAVA3 " burst into flames" #define LOC_DEATH_FALL " fell to his death" -#define LOC_DEATH_DISCHARGE_WATER " discharges into the water." -#define LOC_DEATH_SUICIDE_WEAPON_1 " becomes bored with life" -#define LOC_DEATH_SUICIDE_WEAPON_2 " checks if his weapon is loaded" +#define LOC_DEATH_DISCHARGE_WATER " discharges into the water" +#define LOC_DEATH_DISCHARGE_SLIME " discharges into the slime" +#define LOC_DEATH_DISCHARGE_LAVA " discharges into the lava" +#define LOC_DEATH_DISCHARGE_SELF " electrocutes himself" #define LOC_DEATH_SELF_GRENADE " tries to put the pin back in" +#define LOC_DEATH_SELF_ROCKET " becomes bored with life" +#define LOC_DEATH_SELF_OTHER " checks if his weapon is loaded" #define LOC_DEATH_SUICIDE " suicides" #define LOC_DEATH_OTHER " died" @@ -365,15 +385,15 @@ #ifdef __LIBREQUAKE__ -#define LOC_DEATH_AXE_1A " was hacked to death by " -#define LOC_DEATH_AXE_1B "" +#define LOC_DEATH_AXE_1A " was hacked to death by " +#define LOC_DEATH_AXE_1B "" #define LOC_DEATH_AXE_2A " was chopped to bits by " #define LOC_DEATH_AXE_2B "" #define LOC_DEATH_AXE_QA "'s bucket was kicked by " #define LOC_DEATH_AXE_QB "" -#define LOC_DEATH_SHOTGUN_1A " sucked on " -#define LOC_DEATH_SHOTGUN_1B "'s muffler" +#define LOC_DEATH_SHOTGUN_1A " sucked on " +#define LOC_DEATH_SHOTGUN_1B "'s muffler" #define LOC_DEATH_SHOTGUN_2A " nibbled on " #define LOC_DEATH_SHOTGUN_2B "'s muffler" #define LOC_DEATH_SHOTGUN_QA " was put six feet under by " @@ -386,8 +406,8 @@ #define LOC_DEATH_SUPER_SHOTGUN_QA " was sent home in a box by " #define LOC_DEATH_SUPER_SHOTGUN_QB "" -#define LOC_DEATH_NAILGUN_1A " was pierced by " -#define LOC_DEATH_NAILGUN_1B "" +#define LOC_DEATH_NAILGUN_1A " was pierced by " +#define LOC_DEATH_NAILGUN_1B "" #define LOC_DEATH_NAILGUN_2A " was filled with holes by " #define LOC_DEATH_NAILGUN_2B "" #define LOC_DEATH_NAILGUN_QA "'s mortal coil was shuffled off by " @@ -417,21 +437,15 @@ #define LOC_DEATH_ROCKET_LAUNCHER_GB "'s rocket" #define LOC_DEATH_ROCKET_LAUNCHER_Q1A " was sent beyond the veil by " #define LOC_DEATH_ROCKET_LAUNCHER_Q1B "" -#define LOC_DEATH_ROCKET_LAUNCHER_Q2A " was sent beyond the veil by " -#define LOC_DEATH_ROCKET_LAUNCHER_Q2B "" -#define LOC_DEATH_ROCKET_LAUNCHER_Q3A " was sent beyond the veil by " -#define LOC_DEATH_ROCKET_LAUNCHER_Q3B "" #define LOC_DEATH_LIGHTNING_1A " was electrocuted by " #define LOC_DEATH_LIGHTNING_1B "" -#define LOC_DEATH_LIGHTNING_2A " was given electroshock therapy by " +#define LOC_DEATH_LIGHTNING_2A " was given shock treatment by " #define LOC_DEATH_LIGHTNING_2B "" #define LOC_DEATH_LIGHTNING_QA " rode " -#define LOC_DEATH_LIGHTNING_QB "'s white horse" -#define LOC_DEATH_LIGHTNING_D1A " was given a toaster bath by " -#define LOC_DEATH_LIGHTNING_D1B "" -#define LOC_DEATH_LIGHTNING_D2A " was given a toaster bath by " -#define LOC_DEATH_LIGHTNING_D2B "" +#define LOC_DEATH_LIGHTNING_QB "'s pale horse" +#define LOC_DEATH_LIGHTNING_DA " was given a toaster bath by " +#define LOC_DEATH_LIGHTNING_DB "" #define LOC_DEATH_TELEFRAG " was telefragged by " @@ -442,49 +456,62 @@ #define LOC_TEAMKILL_2 " friendly-fired" #define LOC_TEAMKILL_3 " needs an eye exam" #define LOC_TEAMKILL_4 " betrayed their friend" -#define LOC_TEAMKILL_5 " crushed a teammate" +#define LOC_TEAMKILL_SQUISH " crushed a teammate" + +#define LOC_DEATH_KILL " killed " #else -#define LOC_DEATH_AXE_A " was ax-murdered by " -#define LOC_DEATH_AXE_B "" +#define LOC_DEATH_AXE_1A " was ax-murdered by " +#define LOC_DEATH_AXE_1B "" -#define LOC_DEATH_SHOTGUN_A " chewed on " -#define LOC_DEATH_SHOTGUN_B "'s boomstick" +#define LOC_DEATH_SHOTGUN_1A " chewed on " +#define LOC_DEATH_SHOTGUN_1B "'s boomstick" -#define LOC_DEATH_SUPER_SHOTGUN_A " ate 2 loads of " -#define LOC_DEATH_SUPER_SHOTGUN_B "'s buckshot" +#define LOC_DEATH_SUPER_SHOTGUN_1A " ate 2 loads of " +#define LOC_DEATH_SUPER_SHOTGUN_1B "'s buckshot" +#define LOC_DEATH_SUPER_SHOTGUN_QA " ate 8 loads of " +#define LOC_DEATH_SUPER_SHOTGUN_QB "'s buckshot" -#define LOC_DEATH_NAILGUN_A " was nailed by " -#define LOC_DEATH_NAILGUN_B "" +#define LOC_DEATH_NAILGUN_1A " was nailed by " +#define LOC_DEATH_NAILGUN_1B "" -#define LOC_DEATH_SUPER_NAILGUN_A " was punctured by " -#define LOC_DEATH_SUPER_NAILGUN_B "" +#define LOC_DEATH_SUPER_NAILGUN_1A " was punctured by " +#define LOC_DEATH_SUPER_NAILGUN_1B "" #define LOC_DEATH_GRENADE_LAUNCHER_1A " eats " #define LOC_DEATH_GRENADE_LAUNCHER_1B "'s pineapple" -#define LOC_DEATH_GRENADE_LAUNCHER_2A " was gibbed by " -#define LOC_DEATH_GRENADE_LAUNCHER_2B "'s grenade" - -#define LOC_DEATH_ROCKET_LAUNCHER_1A " rides " -#define LOC_DEATH_ROCKET_LAUNCHER_1B "'s rocket" -#define LOC_DEATH_ROCKET_LAUNCHER_2A " was gibbed by " -#define LOC_DEATH_ROCKET_LAUNCHER_2B "'s rocket" - -#define LOC_DEATH_LIGHTNING_A " accepts " -#define LOC_DEATH_LIGHTNING_UNDERWATER "'s discharge" -#define LOC_DEATH_LIGHTNING_ONGROUND "'s shaft" +#define LOC_DEATH_GRENADE_LAUNCHER_GA " was gibbed by " +#define LOC_DEATH_GRENADE_LAUNCHER_GB "'s grenade" + +#define LOC_DEATH_ROCKET_LAUNCHER_1A " rides " +#define LOC_DEATH_ROCKET_LAUNCHER_1B "'s rocket" +#define LOC_DEATH_ROCKET_LAUNCHER_GA " was gibbed by " +#define LOC_DEATH_ROCKET_LAUNCHER_GB "'s rocket" +#define LOC_DEATH_ROCKET_LAUNCHER_Q1A " was brutalized by " +#define LOC_DEATH_ROCKET_LAUNCHER_Q1B "'s quad rocket" +#define LOC_DEATH_ROCKET_LAUNCHER_Q2A " was smeared by " +#define LOC_DEATH_ROCKET_LAUNCHER_Q2B "'s quad rocket" +#define LOC_DEATH_ROCKET_LAUNCHER_Q3A " rips " +#define LOC_DEATH_ROCKET_LAUNCHER_Q3B " a new one" + +#define LOC_DEATH_LIGHTNING_1A " accepts " +#define LOC_DEATH_LIGHTNING_1B "'s shaft" +#define LOC_DEATH_LIGHTNING_DA " accepts " +#define LOC_DEATH_LIGHTNING_DB "'s discharge" #define LOC_DEATH_TELEFRAG " was telefragged by " #define LOC_DEATH_DEFLECT_A "Satan's power deflects " #define LOC_DEATH_DEFLECT_B "'s telefrag on " -// #define LOC_TEAMKILL_1 " killed a teammate" -// #define LOC_TEAMKILL_2 " friendly-fired" -// #define LOC_TEAMKILL_3 " needs an eye exam" -// #define LOC_TEAMKILL_4 " betrayed their friend" -// #define LOC_TEAMKILL_5 " crushed a teammate" +#define LOC_TEAMKILL_1 " mows down a teammate" +#define LOC_TEAMKILL_2 " checks his glasses" +#define LOC_TEAMKILL_3 " gets a frag for the other team" +#define LOC_TEAMKILL_4 " loses another friend" +#define LOC_TEAMKILL_SQUISH " squished a teammate" + +#define LOC_DEATH_KILL " killed " #endif // __LIBREQUAKE__ diff --git a/qcsrc/lq1/cutscene_camera.qc b/qcsrc/lq1/cutscene_camera.qc index ce75789ce..39b1b66bc 100644 --- a/qcsrc/lq1/cutscene_camera.qc +++ b/qcsrc/lq1/cutscene_camera.qc @@ -34,14 +34,14 @@ LQ_SpawnCamera void() LQ_SpawnCamera = { if (!cvar("developer")) { - bprint(LOC_LQ_ISDEVELOPER); - bprint("\n"); + bprint(PRINT_HIGH, LOC_LQ_ISDEVELOPER); + bprint(PRINT_HIGH, "\n"); return; } if (cameras_in_world >= LQ_MAXCAMERAS) { - bprint(LOC_LQ_CAMERAS_MAX); - bprint("\n"); + bprint(PRINT_HIGH, LOC_LQ_CAMERAS_MAX); + bprint(PRINT_HIGH, "\n"); return; } @@ -62,10 +62,10 @@ void() LQ_SpawnCamera = cameras_in_world++; - bprint(LOC_LQ_CAMERA_SPAWN_A); - bprint(ftos(LQ_MAXCAMERAS - cameras_in_world)); - bprint(LOC_LQ_CAMERA_SPAWN_B); - bprint("\n"); + bprint(PRINT_HIGH, LOC_LQ_CAMERA_SPAWN_A); + bprint(PRINT_HIGH, ftos(LQ_MAXCAMERAS - cameras_in_world)); + bprint(PRINT_HIGH, LOC_LQ_CAMERA_SPAWN_B); + bprint(PRINT_HIGH, "\n"); }; /* @@ -77,8 +77,8 @@ LQ_AppendCameraTime void(float time_addition) LQ_AppendCameraTime = { if (!cvar("developer")) { - bprint(LOC_LQ_ISDEVELOPER); - bprint("\n"); + bprint(PRINT_HIGH, LOC_LQ_ISDEVELOPER); + bprint(PRINT_HIGH, "\n"); return; } @@ -87,10 +87,10 @@ void(float time_addition) LQ_AppendCameraTime = if (time_between_cameras <= 0) time_between_cameras = 1; - bprint(LOC_LQ_CAMERA_TIME_A); - bprint(ftos(time_between_cameras)); - bprint(LOC_LQ_CAMERA_TIME_B); - bprint("\n"); + bprint(PRINT_HIGH, LOC_LQ_CAMERA_TIME_A); + bprint(PRINT_HIGH, ftos(time_between_cameras)); + bprint(PRINT_HIGH, LOC_LQ_CAMERA_TIME_B); + bprint(PRINT_HIGH, "\n"); }; /* @@ -153,16 +153,16 @@ LQ_PlayCameras void() LQ_PlayCameras = { if (!cvar("developer")) { - bprint(LOC_LQ_ISDEVELOPER); - bprint("\n"); + bprint(PRINT_HIGH, LOC_LQ_ISDEVELOPER); + bprint(PRINT_HIGH, "\n"); return; } entity camera = find(world, targetname, "lq_camera_1"); if (camera == world) { - bprint(LOC_LQ_CAMERA_NONE); - bprint("\n"); + bprint(PRINT_HIGH, LOC_LQ_CAMERA_NONE); + bprint(PRINT_HIGH, "\n"); return; } diff --git a/qcsrc/lq1/progs.dat b/qcsrc/lq1/progs.dat new file mode 100644 index 0000000000000000000000000000000000000000..9aee471787045ca6770d5f06236a992aa3760883 GIT binary patch literal 324810 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 literal 0 HcmV?d00001 diff --git a/qcsrc/lq1/qwprogs.dat b/qcsrc/lq1/qwprogs.dat new file mode 100644 index 0000000000000000000000000000000000000000..3a534cd6822c5ba05d604f50dfcbecff4ee48d64 GIT binary patch literal 144870 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 + { + v = 0.5 * damage_inflictor.velocity; + v = v + (25 * normalize(self.origin-damage_inflictor.origin)); + v_z = 100 + 240 * random(); + v_x = v_x + (200 * crandom()); + v_y = v_y + (200 * crandom()); + } + else + { + v_x = 100 * crandom(); + v_y = 100 * crandom(); + v_z = 200 + 100 * random(); + } if (dm > -50) { @@ -600,6 +615,51 @@ void() GibPlayer = void() PlayerDie = { local float i; + local string s; + local float drop_quad; + local float drop_ring; + + drop_quad = TRUE; + drop_ring = TRUE; +#ifdef __QW__ + if ((stof(infokey(world,"dq"))) == 0) + drop_quad = FALSE; + if ((stof(infokey(world,"dr"))) == 0) + drop_ring = FALSE; +#endif + + if (deathmatch && drop_quad) { + if (self.super_damage_finished > 0) + { + DropQuad (self.super_damage_finished - time); + bprint (PRINT_LOW, self.netname); + bprint (PRINT_LOW, LOC_ITEM_LOST_A); + if (deathmatch_supermode()) + bprint (PRINT_LOW, LOC_ITEM_NAME_OCTDMG); + else + bprint (PRINT_LOW, LOC_ITEM_NAME_QUADDMG); + bprint (PRINT_LOW, LOC_ITEM_LOST_B); + s = ftos(rint(self.super_damage_finished - time)); + bprint (PRINT_LOW, s); + bprint (PRINT_LOW, LOC_ITEM_LOST_C); + bprint (PRINT_LOW, "\n"); + } + } + + if (deathmatch && drop_ring) { + if (self.invisible_finished > 0) + { + DropRing (self.invisible_finished - time); + bprint (PRINT_LOW, self.netname); + bprint (PRINT_LOW, LOC_ITEM_LOST_A); + bprint (PRINT_LOW, LOC_ITEM_NAME_SHADRING); + bprint (PRINT_LOW, LOC_ITEM_LOST_B); + s = ftos(rint(self.invisible_finished - time)); + bprint (PRINT_LOW, s); + bprint (PRINT_LOW, LOC_ITEM_LOST_C); + bprint (PRINT_LOW, "\n"); + } + } self.items = self.items - (self.items & IT_INVISIBILITY); self.invisible_finished = 0; // don't die as eyes diff --git a/qcsrc/progs.src b/qcsrc/progs.src index d663e0856..3f28ca0ac 100644 --- a/qcsrc/progs.src +++ b/qcsrc/progs.src @@ -2,6 +2,7 @@ defs.qc localized_text.qc // LQ: Localized strings, also applies to Quake +deathmatch_modes.qc subs.qc fight.qc ai.qc diff --git a/qcsrc/qw.qc b/qcsrc/qw.qc new file mode 100644 index 000000000..01c473904 --- /dev/null +++ b/qcsrc/qw.qc @@ -0,0 +1,2 @@ +// Preprocessor directive used to delineate NetQuake functionality from QuakeWorld functionality +#define __QW__ diff --git a/qcsrc/qwprogs.src b/qcsrc/qwprogs.src new file mode 100644 index 000000000..8b15df01f --- /dev/null +++ b/qcsrc/qwprogs.src @@ -0,0 +1,21 @@ +../lq1/qwprogs.dat + +qw.qc // QW only +defs.qc +localized_text.qc // LQ: Localized strings, also applies to Quake +deathmatch_modes.qc +server.qc // QW only +subs.qc +combat.qc + +items.qc +weapons.qc +world.qc +client.qc +spectate.qc // QW only +player.qc +doors.qc +buttons.qc +triggers.qc +plats.qc +misc.qc diff --git a/qcsrc/server.qc b/qcsrc/server.qc new file mode 100644 index 000000000..7e2a65cc9 --- /dev/null +++ b/qcsrc/server.qc @@ -0,0 +1,125 @@ +/* + server.qc + + server functions (movetarget code) + + Copyright (C) 1996-1997 Id Software, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to: + + Free Software Foundation, Inc. + 59 Temple Place - Suite 330 + Boston, MA 02111-1307, USA + +*/ + +void() monster_ogre = {remove(self);}; +void() monster_demon1 = {remove(self);}; +void() monster_shambler = {remove(self);}; +void() monster_knight = {remove(self);}; +void() monster_army = {remove(self);}; +void() monster_wizard = {remove(self);}; +void() monster_dog = {remove(self);}; +void() monster_zombie = {remove(self);}; +void() monster_boss = {remove(self);}; +void() monster_tarbaby = {remove(self);}; +void() monster_hell_knight = {remove(self);}; +void() monster_fish = {remove(self);}; +void() monster_shalrath = {remove(self);}; +void() monster_enforcer = {remove(self);}; +void() monster_oldone = {remove(self);}; +void() event_lightning = {remove(self);}; + +/* +============================================================================== + +MOVETARGET CODE + +The angle of the movetarget effects standing and bowing direction, but has no effect on movement, which allways heads to the next target. + +targetname +must be present. The name of this movetarget. + +target +the next spot to move to. If not present, stop here for good. + +pausetime +The number of seconds to spend standing or bowing for path_stand or path_bow + +============================================================================== +*/ + +/* +============= +t_movetarget + +Something has bumped into a movetarget. If it is a monster +moving towards it, change the next destination and continue. +============== +*/ +void() t_movetarget = +{ +local entity temp; + + if (other.movetarget != self) + return; + + if (other.enemy) + return; // fighting, not following a path + + temp = self; + self = other; + other = temp; + +//dprint ("t_movetarget\n"); + self.goalentity = self.movetarget = find (world, targetname, other.target); + self.ideal_yaw = vectoyaw(self.goalentity.origin - self.origin); + if (!self.movetarget) + { + self.pausetime = time + 999999; + self.th_stand (); + return; + } +}; + + + +void() movetarget_f = +{ + if (!self.targetname) + objerror ("monster_movetarget: no targetname"); + + self.solid = SOLID_TRIGGER; + self.touch = t_movetarget; + setsize (self, '-8 -8 -8', '8 8 8'); + +}; + +/*QUAKED path_corner (0.5 0.3 0) (-8 -8 -8) (8 8 8) +Monsters will continue walking towards the next target corner. +*/ +void() path_corner = +{ + movetarget_f (); +}; + + + +//============================================================================ + +// Empty versions of functions that are referenced but not needed +void() monster_death_use = {}; +void() FoundTarget = {}; +float(entity targ) visible = { return FALSE; }; diff --git a/qcsrc/spectate.qc b/qcsrc/spectate.qc new file mode 100644 index 000000000..aebc9ecc9 --- /dev/null +++ b/qcsrc/spectate.qc @@ -0,0 +1,111 @@ +/* + spectate.qc + + spectator functions + + PURPOSE + + Copyright (C) 1996-1997 Id Software, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to: + + Free Software Foundation, Inc. + 59 Temple Place - Suite 330 + Boston, MA 02111-1307, USA + +*/ +// Added Aug11'97 by Zoid +// +// These functions are called from the server if they exist. +// Note that Spectators only have one think since they movement code doesn't +// track them much. Impulse commands work as usual, but don't call +// the regular ImpulseCommand handler in weapons.qc since Spectators don't +// have any weapons and things can explode. +// +// --- Zoid. + +/* +=========== +SpectatorConnect + +called when a spectator connects to a server +============ +*/ +void() SpectatorConnect = +{ + bprint (PRINT_MEDIUM, "Spectator "); + bprint (PRINT_MEDIUM, self.netname); + bprint (PRINT_MEDIUM, " entered the game\n"); + + self.goalentity = world; // used for impulse 1 below +}; + +/* +=========== +SpectatorDisconnect + +called when a spectator disconnects from a server +============ +*/ +void() SpectatorDisconnect = +{ + bprint (PRINT_MEDIUM, "Spectator "); + bprint (PRINT_MEDIUM, self.netname); + bprint (PRINT_MEDIUM, " left the game\n"); +}; + +/* +================ +SpectatorImpulseCommand + +Called by SpectatorThink if the spectator entered an impulse +================ +*/ +void() SpectatorImpulseCommand = +{ + if (self.impulse == 1) { + // teleport the spectator to the next spawn point + // note that if the spectator is tracking, this doesn't do + // much + self.goalentity = find(self.goalentity, classname, "info_player_deathmatch"); + if (self.goalentity == world) + self.goalentity = find(self.goalentity, classname, "info_player_deathmatch"); + if (self.goalentity != world) { + setorigin(self, self.goalentity.origin); + self.angles = self.goalentity.angles; + self.fixangle = TRUE; // turn this way immediately + } + } + + self.impulse = 0; +}; + +/* +================ +SpectatorThink + +Called every frame after physics are run +================ +*/ +void() SpectatorThink = +{ + // self.origin, etc contains spectator position, so you could + // do some neat stuff here + + if (self.impulse) + SpectatorImpulseCommand(); +}; + + diff --git a/qcsrc/subs.qc b/qcsrc/subs.qc index 420dfae59..841b82456 100644 --- a/qcsrc/subs.qc +++ b/qcsrc/subs.qc @@ -20,6 +20,24 @@ void() SUB_Remove = {remove(self);}; void() SUB_Null = {}; +//pitch (angles_x) is inverted in quake due to a bug + //use makevectors2 for monsters with nonzero pitch +//anyone encountering this comment with a better understanding should update the comment to be more informative and useful to modders --gnounc +void(vector ang) makevectors2 = +{ + ang_x = ang_x * -1; + makevectors(ang); +}; + +float(float v) anglemod = +{ + while (v >= 360) + v = v - 360; + while (v < 0) + v = v + 360; + return v; +}; + /*QuakeEd only writes a single float for angles (bad idea), so up and down are just constant angles.*/ @@ -310,6 +328,7 @@ void() SUB_UseTargets = }; + /*in nightmare mode, all attack_finished times become 0 some monsters refire twice automatically*/ @@ -321,6 +340,7 @@ void(float normal) SUB_AttackFinished = self.attack_finished = time + normal; }; + float (entity targ) visible; void (void() thinkst) SUB_CheckRefire = diff --git a/qcsrc/triggers.qc b/qcsrc/triggers.qc index f857103e1..c3bb34e7c 100644 --- a/qcsrc/triggers.qc +++ b/qcsrc/triggers.qc @@ -340,25 +340,47 @@ void(vector org) spawn_tfog = s.nextthink = time + 0.2; s.think = play_teleport; +#ifdef __QW__ + WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); + WriteByte (MSG_MULTICAST, TE_TELEPORT); + WriteCoord (MSG_MULTICAST, org_x); + WriteCoord (MSG_MULTICAST, org_y); + WriteCoord (MSG_MULTICAST, org_z); + multicast (org, MULTICAST_PHS); +#else WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); WriteByte (MSG_BROADCAST, TE_TELEPORT); WriteCoord (MSG_BROADCAST, org_x); WriteCoord (MSG_BROADCAST, org_y); WriteCoord (MSG_BROADCAST, org_z); +#endif }; void() tdeath_touch = { + local entity other2; + if (other == self.owner) return; +// frag anyone who teleports in on top of an invincible player if (other.classname == "player") { - if (other.invincible_finished > time) { - // frag anyone who teleports in on top of an invincible player + if (other.invincible_finished > time && + self.owner.invincible_finished > time) { + self.classname = "teledeath3"; + other.invincible_finished = 0; + self.owner.invincible_finished = 0; + T_Damage (other, self, self, 50000); + other2 = self.owner; + self.owner = other; + T_Damage (other2, self, self, 50000); + } + + if (other.invincible_finished > time) + { self.classname = "teledeath2"; - self.enemy = other; T_Damage (self.owner, self, self, 50000); return; } @@ -368,7 +390,6 @@ void() tdeath_touch = T_Damage (self.owner, self, self, 50000); return; } - } if (other.health) @@ -531,6 +552,11 @@ Only used on start map. */ void() trigger_setskill = { + if (deathmatch) { + remove (self); + return; + } + InitTrigger (); self.touch = trigger_skill_touch; }; diff --git a/qcsrc/weapons.qc b/qcsrc/weapons.qc index 490e9a545..82e335159 100644 --- a/qcsrc/weapons.qc +++ b/qcsrc/weapons.qc @@ -19,7 +19,7 @@ void (entity targ, entity inflictor, entity attacker, float damage) T_Damage; void () player_run; -void(entity bomb, entity attacker, float rad, entity ignore) T_RadiusDamage; +void(entity bomb, entity attacker, float rad, entity ignore, string dtype) T_RadiusDamage; void(vector org, vector vel, float damage) SpawnBlood; void() SuperDamageSound; @@ -68,17 +68,32 @@ void() W_FireAxe = { trace_ent.axhitme = 1; SpawnBlood (org, '0 0 0', 20); - T_Damage (trace_ent, self, self, 20); + trace_ent.deathtype = "axe"; + if (deathmatch_supermode() || deathmatch_supermode2()) + T_Damage (trace_ent, self, self, 75); + else + T_Damage (trace_ent, self, self, 20); } else { // hit wall sound (self, CHAN_WEAPON, "player/axhit2.wav", 1, ATTN_NORM); + +#ifdef __QW__ + WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); + WriteByte (MSG_MULTICAST, TE_GUNSHOT); + WriteByte (MSG_MULTICAST, 3); + WriteCoord (MSG_MULTICAST, org_x); + WriteCoord (MSG_MULTICAST, org_y); + WriteCoord (MSG_MULTICAST, org_z); + multicast (org, MULTICAST_PVS); +#else WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); WriteByte (MSG_BROADCAST, TE_GUNSHOT); WriteCoord (MSG_BROADCAST, org_x); WriteCoord (MSG_BROADCAST, org_y); WriteCoord (MSG_BROADCAST, org_z); +#endif } }; @@ -136,7 +151,17 @@ SpawnBlood */ void(vector org, vector vel, float damage) SpawnBlood = { +#ifdef __QW__ + WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); + WriteByte (MSG_MULTICAST, TE_BLOOD); + WriteByte (MSG_MULTICAST, 1); + WriteCoord (MSG_MULTICAST, org_x); + WriteCoord (MSG_MULTICAST, org_y); + WriteCoord (MSG_MULTICAST, org_z); + multicast (org, MULTICAST_PVS); +#else particle (org, vel*0.1, 73, damage*2); +#endif }; /* @@ -160,7 +185,29 @@ SpawnChunk */ void(vector org, vector vel) SpawnChunk = { +#ifdef __QW__ + SpawnBlood(org, vel, 10); +#else particle (org, vel*0.02, 0, 10); +#endif +}; + +void() SmallKick = { +#ifdef __QW__ + msg_entity = self; + WriteByte (MSG_ONE, SVC_SMALLKICK); +#else + self.punchangle_x = -2; +#endif +}; + +void() BigKick = { +#ifdef __QW__ + msg_entity = self; + WriteByte (MSG_ONE, SVC_BIGKICK); +#else + self.punchangle_x = -4; +#endif }; /* @@ -176,10 +223,22 @@ Collects multiple small damages into a single damage entity multi_ent; float multi_damage; +#ifdef __QW__ +vector blood_org; +float blood_count; +vector puff_org; +float puff_count; +#endif + void() ClearMultiDamage = { multi_ent = world; multi_damage = 0; + +#ifdef __QW__ + blood_count = 0; + puff_count = 0; +#endif }; void() ApplyMultiDamage = @@ -205,6 +264,35 @@ void(entity hit, float damage) AddMultiDamage = multi_damage = multi_damage + damage; }; + +void() Multi_Finish = +{ +#ifdef __QW__ + if (puff_count) + { + WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); + WriteByte (MSG_MULTICAST, TE_GUNSHOT); + WriteByte (MSG_MULTICAST, puff_count); + WriteCoord (MSG_MULTICAST, puff_org_x); + WriteCoord (MSG_MULTICAST, puff_org_y); + WriteCoord (MSG_MULTICAST, puff_org_z); + multicast (puff_org, MULTICAST_PVS); + } + + if (blood_count) + { + WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); + WriteByte (MSG_MULTICAST, TE_BLOOD); + WriteByte (MSG_MULTICAST, blood_count); + WriteCoord (MSG_MULTICAST, blood_org_x); + WriteCoord (MSG_MULTICAST, blood_org_y); + WriteCoord (MSG_MULTICAST, blood_org_z); + multicast (puff_org, MULTICAST_PVS); + } +#endif +}; + + /* ============================================================================== @@ -218,7 +306,7 @@ BULLETS TraceAttack ================ */ -void(float damage, vector dir) TraceAttack = +void(float damage, vector dir, string dtype) TraceAttack = { local vector vel, org; @@ -229,18 +317,29 @@ void(float damage, vector dir) TraceAttack = org = trace_endpos - dir*4; if (trace_ent.takedamage) - { + { +#ifdef __QW__ + blood_count = blood_count + 1; + blood_org = org; +#else SpawnBlood (org, vel*0.2, damage); +#endif + + trace_ent.deathtype = dtype; AddMultiDamage (trace_ent, damage); } else { +#ifdef __QW__ + puff_count = puff_count + 1; +#else WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); WriteByte (MSG_BROADCAST, TE_GUNSHOT); WriteCoord (MSG_BROADCAST, org_x); WriteCoord (MSG_BROADCAST, org_y); WriteCoord (MSG_BROADCAST, org_z); +#endif } }; @@ -252,7 +351,7 @@ Used by shotgun, super shotgun, and enemy soldier firing Go to the trouble of combining multiple pellets into a single damage call. ================ */ -void(float shotcount, vector dir, vector spread) FireBullets = +void(float shotcount, vector dir, vector spread, string dtype) FireBullets = { local vector direction; local vector src; @@ -262,17 +361,25 @@ void(float shotcount, vector dir, vector spread) FireBullets = src = self.origin + v_forward*10 + '0 0 22'; ClearMultiDamage (); + +#ifdef __QW__ + traceline (src, src + dir*2048, FALSE, self); + puff_org = trace_endpos - dir*4; +#endif + while (shotcount > 0) { direction = dir + crandom()*spread_x*v_right + crandom()*spread_y*v_up; traceline (src, src + direction*2048, FALSE, self); if (trace_fraction != 1.0) - TraceAttack (4, direction); + TraceAttack (4, direction, dtype); shotcount = shotcount - 1; } ApplyMultiDamage (); + + Multi_Finish (); }; /* @@ -286,11 +393,13 @@ void() W_FireShotgun = sound (self, CHAN_WEAPON, "weapons/guncock.wav", 1, ATTN_NORM); - self.punchangle_x = -2; - - self.currentammo = self.ammo_shells = self.ammo_shells - 1; + SmallKick(); + + if (!deathmatch_supermode()) + self.currentammo = self.ammo_shells = self.ammo_shells - 1; + dir = aim (self, 100000); - FireBullets (6, dir, '0.04 0.04 0'); + FireBullets (6, dir, '0.04 0.04 0', "shotgun"); }; @@ -311,11 +420,13 @@ void() W_FireSuperShotgun = sound (self ,CHAN_WEAPON, "weapons/shotgn2.wav", 1, ATTN_NORM); - self.punchangle_x = -4; + BigKick(); + + if (!deathmatch_supermode()) + self.currentammo = self.ammo_shells = self.ammo_shells - 2; - self.currentammo = self.ammo_shells = self.ammo_shells - 2; dir = aim (self, 100000); - FireBullets (14, dir, '0.14 0.08 0'); + FireBullets (14, dir, '0.14 0.08 0', "supershotgun"); }; @@ -327,6 +438,7 @@ ROCKETS ============================================================================== */ +#ifndef __QW__ void() s_explode1 = [0, s_explode2] {}; void() s_explode2 = [1, s_explode3] {}; void() s_explode3 = [2, s_explode4] {}; @@ -343,6 +455,7 @@ void() BecomeExplosion = self.solid = SOLID_NOT; s_explode1 (); }; +#endif void() T_MissileTouch = { @@ -350,6 +463,11 @@ void() T_MissileTouch = if (other == self.owner) return; // don't explode on owner + + if (self.voided) { + return; + } + self.voided = 1; if (pointcontents(self.origin) == CONTENT_SKY) { @@ -361,17 +479,28 @@ void() T_MissileTouch = if (other.health) { + other.deathtype = "rocket"; if (other.classname == "monster_shambler") damg = damg * 0.5; // mostly immune - T_Damage (other, self, self.owner, damg ); + T_Damage (other, self, self.owner, damg); } // don't do radius damage to the other, because all the damage // was done in the impact - T_RadiusDamage (self, self.owner, 120, other); + T_RadiusDamage (self, self.owner, 120, other, "rocket"); self.origin = self.origin - 8*normalize(self.velocity); +#ifdef __QW__ + WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); + WriteByte (MSG_MULTICAST, TE_EXPLOSION); + WriteCoord (MSG_MULTICAST, self.origin_x); + WriteCoord (MSG_MULTICAST, self.origin_y); + WriteCoord (MSG_MULTICAST, self.origin_z); + multicast (self.origin, MULTICAST_PHS); + + remove(self); +#else WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); WriteByte (MSG_BROADCAST, TE_EXPLOSION); WriteCoord (MSG_BROADCAST, self.origin_x); @@ -379,6 +508,7 @@ void() T_MissileTouch = WriteCoord (MSG_BROADCAST, self.origin_z); BecomeExplosion (); +#endif }; @@ -390,35 +520,35 @@ W_FireRocket */ void() W_FireRocket = { - local entity missile; - - self.currentammo = self.ammo_rockets = self.ammo_rockets - 1; + if (!deathmatch_supermode()) + self.currentammo = self.ammo_rockets = self.ammo_rockets - 1; sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM); - self.punchangle_x = -2; + SmallKick(); - missile = spawn (); - missile.owner = self; - missile.movetype = MOVETYPE_FLYMISSILE; - missile.solid = SOLID_BBOX; - missile.classname = "missile"; + newmis = spawn (); + newmis.owner = self; + newmis.movetype = MOVETYPE_FLYMISSILE; + newmis.solid = SOLID_BBOX; // set missile speed makevectors (self.v_angle); - missile.velocity = aim(self, 1000); - missile.velocity = missile.velocity * 1000; - missile.angles = vectoangles(missile.velocity); + newmis.velocity = aim(self, 1000); + newmis.velocity = newmis.velocity * 1000; + newmis.angles = vectoangles(newmis.velocity); - missile.touch = T_MissileTouch; + newmis.touch = T_MissileTouch; + newmis.voided = 0; // set missile duration - missile.nextthink = time + 5; - missile.think = SUB_Remove; + newmis.nextthink = time + 5; + newmis.think = SUB_Remove; + newmis.classname = "rocket"; - setmodel (missile, "progs/missile.mdl"); - setsize (missile, '0 0 0', '0 0 0'); - setorigin (missile, self.origin + v_forward*8 + '0 0 16'); + setmodel (newmis, "progs/missile.mdl"); + setsize (newmis, '0 0 0', '0 0 0'); + setorigin (newmis, self.origin + v_forward*8 + '0 0 16'); }; /* @@ -429,6 +559,23 @@ LIGHTNING =============================================================================== */ +void(entity from, float damage) LightningHit = +{ +#ifdef __QW__ + WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); + WriteByte (MSG_MULTICAST, TE_LIGHTNINGBLOOD); + WriteCoord (MSG_MULTICAST, trace_endpos_x); + WriteCoord (MSG_MULTICAST, trace_endpos_y); + WriteCoord (MSG_MULTICAST, trace_endpos_z); + multicast (trace_endpos, MULTICAST_PVS); +#else + particle (trace_endpos, '0 0 100', 15, damage*4); +#endif + + trace_ent.deathtype = "lightning"; + T_Damage (trace_ent, from, from, damage); +}; + /* ================= LightningDamage @@ -439,7 +586,6 @@ void(vector p1, vector p2, entity from, float damage) LightningDamage = local entity e1, e2; local vector f; -#define LIGHTNINGFIX #ifdef LIGHTNINGFIX local float tmp; f = p2 - p1; @@ -463,8 +609,7 @@ void(vector p1, vector p2, entity from, float damage) LightningDamage = traceline (p1, p2, FALSE, self); if (trace_ent.takedamage) { - particle (trace_endpos, '0 0 100', 15, damage*4); - T_Damage (trace_ent, from, from, damage); + LightningHit (from, damage); if (self.classname == "player") { if (other.classname == "player") @@ -477,8 +622,7 @@ void(vector p1, vector p2, entity from, float damage) LightningDamage = traceline (p1 + f, p2 + f, FALSE, self); if (trace_ent != e1 && trace_ent.takedamage) { - particle (trace_endpos, '0 0 100', 15, damage*4); - T_Damage (trace_ent, from, from, damage); + LightningHit (from, damage); } e2 = trace_ent; @@ -486,8 +630,7 @@ void(vector p1, vector p2, entity from, float damage) LightningDamage = traceline (p1 - f, p2 - f, FALSE, self); if (trace_ent != e1 && trace_ent != e2 && trace_ent.takedamage) { - particle (trace_endpos, '0 0 100', 15, damage*4); - T_Damage (trace_ent, from, from, damage); + LightningHit (from, damage); } }; @@ -495,7 +638,7 @@ void(vector p1, vector p2, entity from, float damage) LightningDamage = void() W_FireLightning = { local vector org; - local float cells; + local float cells; if (self.ammo_cells < 1) { @@ -507,11 +650,19 @@ void() W_FireLightning = // explode if under water if (self.waterlevel > 1) { - cells = self.ammo_cells; - self.ammo_cells = 0; - W_SetCurrentAmmo (); - T_RadiusDamage (self, self, 35*cells, world); - return; + if (deathmatch_supermode() || deathmatch_supermode2()) + { + self.deathtype = "selfwater"; + T_Damage (self, self, self.owner, 4000); + } + else + { + cells = self.ammo_cells; + self.ammo_cells = 0; + W_SetCurrentAmmo (); + T_RadiusDamage (self, self, 35*cells, world, "discharge"); + return; + } } if (self.t_width < time) @@ -520,12 +671,27 @@ void() W_FireLightning = self.t_width = time + 0.6; } - self.punchangle_x = -2; - self.currentammo = self.ammo_cells = self.ammo_cells - 1; + SmallKick(); + + if (!deathmatch_supermode()) + self.currentammo = self.ammo_cells = self.ammo_cells - 1; + org = self.origin + '0 0 16'; traceline (org, org + v_forward*600, TRUE, self); +#ifdef __QW__ + WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); + WriteByte (MSG_MULTICAST, TE_LIGHTNING2); + WriteEntity (MSG_MULTICAST, self); + WriteCoord (MSG_MULTICAST, org_x); + WriteCoord (MSG_MULTICAST, org_y); + WriteCoord (MSG_MULTICAST, org_z); + WriteCoord (MSG_MULTICAST, trace_endpos_x); + WriteCoord (MSG_MULTICAST, trace_endpos_y); + WriteCoord (MSG_MULTICAST, trace_endpos_z); + multicast (org, MULTICAST_PHS); +#else WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); WriteByte (MSG_BROADCAST, TE_LIGHTNING2); WriteEntity (MSG_BROADCAST, self); @@ -535,6 +701,7 @@ void() W_FireLightning = WriteCoord (MSG_BROADCAST, trace_endpos_x); WriteCoord (MSG_BROADCAST, trace_endpos_y); WriteCoord (MSG_BROADCAST, trace_endpos_z); +#endif LightningDamage (self.origin, trace_endpos + v_forward*4, self, 30); }; @@ -545,8 +712,23 @@ void() W_FireLightning = void() GrenadeExplode = { - T_RadiusDamage (self, self.owner, 120, world); + if (self.voided) { + return; + } + self.voided = 1; + + T_RadiusDamage (self, self.owner, 120, world, "grenade"); + +#ifdef __QW__ + WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); + WriteByte (MSG_MULTICAST, TE_EXPLOSION); + WriteCoord (MSG_MULTICAST, self.origin_x); + WriteCoord (MSG_MULTICAST, self.origin_y); + WriteCoord (MSG_MULTICAST, self.origin_z); + multicast (self.origin, MULTICAST_PHS); + remove (self); +#else WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); WriteByte (MSG_BROADCAST, TE_EXPLOSION); WriteCoord (MSG_BROADCAST, self.origin_x); @@ -554,6 +736,7 @@ void() GrenadeExplode = WriteCoord (MSG_BROADCAST, self.origin_z); BecomeExplosion (); +#endif }; void() GrenadeTouch = @@ -583,48 +766,47 @@ W_FireGrenade */ void() W_FireGrenade = { - local entity missile; - - self.currentammo = self.ammo_rockets = self.ammo_rockets - 1; + if (!deathmatch_supermode()) + self.currentammo = self.ammo_rockets = self.ammo_rockets - 1; sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM); - self.punchangle_x = -2; + SmallKick(); - missile = spawn (); - missile.owner = self; - missile.movetype = MOVETYPE_BOUNCE; - missile.solid = SOLID_BBOX; - missile.classname = "grenade"; + newmis = spawn (); + newmis.owner = self; + newmis.movetype = MOVETYPE_BOUNCE; + newmis.solid = SOLID_BBOX; + newmis.classname = "grenade"; // set missile speed makevectors (self.v_angle); if (self.v_angle_x) - missile.velocity = v_forward*600 + v_up * 200 + crandom()*v_right*10 + crandom()*v_up*10; + newmis.velocity = v_forward*600 + v_up * 200 + crandom()*v_right*10 + crandom()*v_up*10; else { - missile.velocity = aim(self, 10000); - missile.velocity = missile.velocity * 600; - missile.velocity_z = 200; + newmis.velocity = aim(self, 10000); + newmis.velocity = newmis.velocity * 600; + newmis.velocity_z = 200; } - missile.avelocity = '300 300 300'; + newmis.avelocity = '300 300 300'; - missile.angles = vectoangles(missile.velocity); + newmis.angles = vectoangles(newmis.velocity); - missile.touch = GrenadeTouch; + newmis.touch = GrenadeTouch; // set missile duration - missile.nextthink = time + 2.5; - missile.think = GrenadeExplode; + newmis.nextthink = time + 2.5; + newmis.think = GrenadeExplode; - setmodel (missile, "progs/grenade.mdl"); - setsize (missile, '0 0 0', '0 0 0'); - setorigin (missile, self.origin); + setmodel (newmis, "progs/grenade.mdl"); + setsize (newmis, '0 0 0', '0 0 0'); + setorigin (newmis, self.origin); }; @@ -666,14 +848,18 @@ void() W_FireSuperSpikes = sound (self, CHAN_WEAPON, "weapons/spike2.wav", 1, ATTN_NORM); self.attack_finished = time + 0.2; - self.currentammo = self.ammo_nails = self.ammo_nails - 2; + + if (!deathmatch_supermode()) + self.currentammo = self.ammo_nails = self.ammo_nails - 2; + dir = aim (self, 1000); launch_spike (self.origin + '0 0 16', dir); newmis.classname = "super_spike"; //so we know the difference --gnounc newmis.touch = superspike_touch; setmodel (newmis, "progs/s_spike.mdl"); setsize (newmis, VEC_ORIGIN, VEC_ORIGIN); - self.punchangle_x = -2; + + SmallKick(); }; void(float ox) W_FireSpikes = @@ -697,20 +883,30 @@ void(float ox) W_FireSpikes = sound (self, CHAN_WEAPON, "weapons/rocket1i.wav", 1, ATTN_NORM); self.attack_finished = time + 0.2; - self.currentammo = self.ammo_nails = self.ammo_nails - 1; + + if (!deathmatch_supermode()) + self.currentammo = self.ammo_nails = self.ammo_nails - 1; + dir = aim (self, 1000); launch_spike (self.origin + '0 0 16' + v_right*ox, dir); - self.punchangle_x = -2; + SmallKick(); }; void() spike_touch = { + local float te_type; + if (other == self.owner) return; if (other.solid == SOLID_TRIGGER) return; // trigger field, do nothing + + if (self.voided) { + return; + } + self.voided = 1; if (pointcontents(self.origin) == CONTENT_SKY) { @@ -722,25 +918,33 @@ void() spike_touch = if (other.takedamage) { spawn_touchblood (9); + other.deathtype = "nail"; T_Damage (other, self, self.owner, 9); } else { - WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); - if (self.classname == "wizard_spike") - WriteByte (MSG_BROADCAST, TE_WIZSPIKE); - + te_type = TE_WIZSPIKE; else if (self.classname == "knight_spike") - WriteByte (MSG_BROADCAST, TE_KNIGHTSPIKE); - + te_type = TE_KNIGHTSPIKE; else - WriteByte (MSG_BROADCAST, TE_SPIKE); - + te_type = TE_SPIKE; + +#ifdef __QW__ + WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); + WriteByte (MSG_MULTICAST, te_type); + WriteCoord (MSG_MULTICAST, self.origin_x); + WriteCoord (MSG_MULTICAST, self.origin_y); + WriteCoord (MSG_MULTICAST, self.origin_z); + multicast (self.origin, MULTICAST_PHS); +#else + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, te_type); WriteCoord (MSG_BROADCAST, self.origin_x); WriteCoord (MSG_BROADCAST, self.origin_y); WriteCoord (MSG_BROADCAST, self.origin_z); +#endif } remove(self); @@ -754,6 +958,11 @@ void() superspike_touch = if (other.solid == SOLID_TRIGGER) return; // trigger field, do nothing + + if (self.voided) { + return; + } + self.voided = 1; if (pointcontents(self.origin) == CONTENT_SKY) { @@ -765,15 +974,25 @@ void() superspike_touch = if (other.takedamage) { spawn_touchblood (18); + other.deathtype = "supernail"; T_Damage (other, self, self.owner, 18); } else { +#ifdef __QW___ + WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); + WriteByte (MSG_MULTICAST, TE_SUPERSPIKE); + WriteCoord (MSG_MULTICAST, self.origin_x); + WriteCoord (MSG_MULTICAST, self.origin_y); + WriteCoord (MSG_MULTICAST, self.origin_z); + multicast (self.origin, MULTICAST_PHS); +#else WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); WriteByte (MSG_BROADCAST, TE_SUPERSPIKE); WriteCoord (MSG_BROADCAST, self.origin_x); WriteCoord (MSG_BROADCAST, self.origin_y); WriteCoord (MSG_BROADCAST, self.origin_z); +#endif } remove(self); @@ -1046,15 +1265,15 @@ void(float wep) W_ChangeWeapon = if (!(self.items & fl)) { // don't have the weapon or the ammo - sprint (self, LOC_WEAPON_INVALID); - sprint (self, "\n"); + sprint (self, PRINT_HIGH, LOC_WEAPON_INVALID); + sprint (self, PRINT_HIGH, "\n"); return; } if (am) { // don't have the ammo - sprint (self, LOC_WEAPON_NOAMMO); - sprint (self, "\n"); + sprint (self, PRINT_HIGH, LOC_WEAPON_NOAMMO); + sprint (self, PRINT_HIGH, "\n"); return; } @@ -1305,12 +1524,14 @@ void() QuadCheat = #define ID_IMPULSE_QUADCHEAT 255 #ifdef __LIBREQUAKE__ +#ifndef __QW__ #define LQ_IMPULSE_SPAWNCAM 200 #define LQ_IMPULSE_CAMTIMEINC 201 #define LQ_IMPULSE_CAMTIMEDEC 202 #define LQ_IMPULSE_PLAYCAMERAS 203 +#endif // __QW__ #endif // __LIBREQUAKE__ void() ImpulseCommands = @@ -1329,12 +1550,14 @@ void() ImpulseCommands = case ID_IMPULSE_QUADCHEAT: QuadCheat(); break; #ifdef __LIBREQUAKE__ +#ifndef __QW__ case LQ_IMPULSE_SPAWNCAM: LQ_SpawnCamera(); break; case LQ_IMPULSE_CAMTIMEDEC: LQ_AppendCameraTime(5); break; case LQ_IMPULSE_CAMTIMEDEC: LQ_AppendCameraTime(-5); break; case LQ_IMPULSE_PLAYCAMERAS: LQ_PlayCameras(); break; +#endif // __QW__ #endif // __LIBREQUAKE__ default: break; diff --git a/qcsrc/world.qc b/qcsrc/world.qc index 78bae14cd..72b3cfe00 100644 --- a/qcsrc/world.qc +++ b/qcsrc/world.qc @@ -233,6 +233,7 @@ void() worldspawn = precache_sound ("items/damage2.wav"); precache_sound ("items/damage3.wav"); + precache_sound ("misc/power.wav"); //lightning for boss // player gib sounds @@ -256,6 +257,8 @@ void() worldspawn = precache_sound ("player/death4.wav"); precache_sound ("player/death5.wav"); + precache_sound ("boss1/sight1.wav"); + // ax sounds precache_sound ("weapons/ax1.wav"); // ax swoosh precache_sound ("player/axhit1.wav"); // ax hit meat @@ -267,6 +270,11 @@ void() worldspawn = precache_sound ("player/inlava.wav"); // player enter lava precache_sound ("misc/outwater.wav"); // leaving water sound +// Invulnerability sounds + precache_sound ("items/protect.wav"); + precache_sound ("items/protect2.wav"); + precache_sound ("items/protect3.wav"); + precache_sound ("player/lburn1.wav"); // lava burn precache_sound ("player/lburn2.wav"); // lava burn @@ -356,6 +364,9 @@ void() worldspawn = void() StartFrame = { + timelimit = cvar("timelimit") * 60; + fraglimit = cvar("fraglimit"); + deathmatch = cvar("deathmatch"); teamplay = cvar("teamplay"); skill = cvar("skill"); framecount = framecount + 1; From 865d0659e8738bcaa91bfca19c67df698fc122e5 Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Tue, 17 Sep 2024 02:07:23 -0700 Subject: [PATCH 02/22] Removed .dat files --- qcsrc/lq1/progs.dat | Bin 324810 -> 0 bytes qcsrc/lq1/qwprogs.dat | Bin 144870 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 qcsrc/lq1/progs.dat delete mode 100644 qcsrc/lq1/qwprogs.dat diff --git a/qcsrc/lq1/progs.dat b/qcsrc/lq1/progs.dat deleted file mode 100644 index 9aee471787045ca6770d5f06236a992aa3760883..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324810 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 diff --git a/qcsrc/lq1/qwprogs.dat b/qcsrc/lq1/qwprogs.dat deleted file mode 100644 index 3a534cd6822c5ba05d604f50dfcbecff4ee48d64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144870 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 Date: Tue, 17 Sep 2024 02:07:48 -0700 Subject: [PATCH 03/22] Updated gitignore --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 7314b01c7..1def19ca8 100644 --- a/.gitignore +++ b/.gitignore @@ -13,8 +13,8 @@ docs/lqlogos/logomockup-wip2.ora docs/lqlogos/logomockup-wip2.xcf lq1/maps/.bmodelbspbak.7z lq1/config.cfg -lq1/progs.dat -lq1/qwprogs.dat +*/progs.dat +*/qwprogs.dat lq1/gfx/pop.png lq-pl.png lq-pl.xcf From 9e3aa4ee7604f4306ff96292588a499b754f8361 Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Tue, 17 Sep 2024 02:13:49 -0700 Subject: [PATCH 04/22] Added qwprogs.dat to build components --- build_components.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/build_components.json b/build_components.json index fc56dc13e..a2fa144c5 100644 --- a/build_components.json +++ b/build_components.json @@ -25,12 +25,13 @@ "gfx.wad", "demo1.dem", "demo2.dem", - "demo3.dem" - ], - "files_pak1": [ + "demo3.dem", "progs.dat" ], - "files_unpacked": [] + "files_pak1": [], + "files_unpacked": [ + "qwprogs.dat" + ] }, "config": { "base_dir": "lq1", From f440ab5f7b3b615fa6156e4db7d83f1dd90d2a10 Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Tue, 17 Sep 2024 18:23:17 -0700 Subject: [PATCH 05/22] Fixed carrying over items on map change in deathmatch --- qcsrc/client.qc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/qcsrc/client.qc b/qcsrc/client.qc index ff35c270b..89d7f8c8f 100644 --- a/qcsrc/client.qc +++ b/qcsrc/client.qc @@ -101,11 +101,12 @@ void() SetNewParms = void() DecodeLevelParms = { - if (serverflags) + if (serverflags && world.model == "maps/start.bsp") { - if (world.model == "maps/start.bsp") - SetNewParms (); // take away all stuff on starting new episode + SetNewParms (); // take away all stuff on starting new episode } + else if (deathmatch) + SetNewParms (); self.items = parm1; self.health = parm2; @@ -427,8 +428,6 @@ void() respawn = { // make a copy of the dead body for appearances sake CopyToBodyQueue (self); - // set default spawn parms - SetNewParms (); // respawn PutClientInServer (); } From bec99ef9cd0fc3504f6c5af56c3c0cb5a0588cbb Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Tue, 17 Sep 2024 19:13:27 -0700 Subject: [PATCH 06/22] Fixed some death message bugs --- qcsrc/client.qc | 12 ++++++------ qcsrc/combat.qc | 2 +- qcsrc/localized_text.qc | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/qcsrc/client.qc b/qcsrc/client.qc index 89d7f8c8f..159e934f9 100644 --- a/qcsrc/client.qc +++ b/qcsrc/client.qc @@ -1256,9 +1256,9 @@ void() CheckPowerups = if (self.super_time == 1) { if (deathmatch_supermode()) - sprint (self, PRINT_HIGH, LOC_ITEM_FADE_QUADDMG); - else sprint (self, PRINT_HIGH, LOC_ITEM_FADE_OCTDMG); + else + sprint (self, PRINT_HIGH, LOC_ITEM_FADE_QUADDMG); sprint (self, PRINT_HIGH, "\n"); stuffcmd (self, "bf\n"); sound (self, CHAN_AUTO, "items/damage2.wav", 1, ATTN_NORM); @@ -1760,7 +1760,7 @@ void(entity targ, entity attacker) ClientObituary = deathstring = LOC_DEATH_GRENADE_LAUNCHER_QA; deathstring2 = LOC_DEATH_GRENADE_LAUNCHER_QB; } - else if (targ.health < 40) { + else if (targ.health < -40) { deathstring = LOC_DEATH_GRENADE_LAUNCHER_GA; deathstring2 = LOC_DEATH_GRENADE_LAUNCHER_GB; } @@ -1769,7 +1769,7 @@ void(entity targ, entity attacker) ClientObituary = deathstring2 = LOC_DEATH_GRENADE_LAUNCHER_2B; } #else - if (targ.health < 40) { + if (targ.health < -40) { deathstring = LOC_DEATH_GRENADE_LAUNCHER_GA; deathstring2 = LOC_DEATH_GRENADE_LAUNCHER_GB; } @@ -1787,7 +1787,7 @@ void(entity targ, entity attacker) ClientObituary = deathstring = LOC_DEATH_ROCKET_LAUNCHER_Q1A; deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_Q1B; } - else if (targ.health < 40) { + else if (targ.health < -40) { deathstring = LOC_DEATH_ROCKET_LAUNCHER_GA; deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_GB; } @@ -1796,7 +1796,7 @@ void(entity targ, entity attacker) ClientObituary = deathstring2 = LOC_DEATH_ROCKET_LAUNCHER_2B; } #else - if (targ.health < 40) { + if (targ.health < -40) { if (attacker.super_damage_finished > 0) { rnum = random(); if (rnum < 0.3) { diff --git a/qcsrc/combat.qc b/qcsrc/combat.qc index 430ef64b8..8b86b5060 100644 --- a/qcsrc/combat.qc +++ b/qcsrc/combat.qc @@ -158,7 +158,7 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage= // check for quad damage powerup on the attacker if (attacker.super_damage_finished > time && inflictor.classname != "door") - if (deathmatch_supermode() == 4) + if (deathmatch_supermode()) damage = damage * 8; else damage = damage * 4; diff --git a/qcsrc/localized_text.qc b/qcsrc/localized_text.qc index 5bc47aac8..d4c2b4dda 100644 --- a/qcsrc/localized_text.qc +++ b/qcsrc/localized_text.qc @@ -431,25 +431,25 @@ #define LOC_DEATH_ROCKET_LAUNCHER_1A " was blasted by " #define LOC_DEATH_ROCKET_LAUNCHER_1B "'s rocket" -#define LOC_DEATH_ROCKET_LAUNCHER_2A " was shredded by " +#define LOC_DEATH_ROCKET_LAUNCHER_2A " was fulminated by " #define LOC_DEATH_ROCKET_LAUNCHER_2B "'s rocket" #define LOC_DEATH_ROCKET_LAUNCHER_GA " was gibbed by " #define LOC_DEATH_ROCKET_LAUNCHER_GB "'s rocket" -#define LOC_DEATH_ROCKET_LAUNCHER_Q1A " was sent beyond the veil by " -#define LOC_DEATH_ROCKET_LAUNCHER_Q1B "" +#define LOC_DEATH_ROCKET_LAUNCHER_Q1A " rode " +#define LOC_DEATH_ROCKET_LAUNCHER_Q1B "'s pale horse" #define LOC_DEATH_LIGHTNING_1A " was electrocuted by " #define LOC_DEATH_LIGHTNING_1B "" #define LOC_DEATH_LIGHTNING_2A " was given shock treatment by " #define LOC_DEATH_LIGHTNING_2B "" -#define LOC_DEATH_LIGHTNING_QA " rode " -#define LOC_DEATH_LIGHTNING_QB "'s pale horse" +#define LOC_DEATH_LIGHTNING_QA " was sent beyond the veil by " +#define LOC_DEATH_LIGHTNING_QB "" #define LOC_DEATH_LIGHTNING_DA " was given a toaster bath by " #define LOC_DEATH_LIGHTNING_DB "" #define LOC_DEATH_TELEFRAG " was telefragged by " -#define LOC_DEATH_DEFLECT_A "Lucifer's Protection deflects " +#define LOC_DEATH_DEFLECT_A "Lucifer's Protection deflected " #define LOC_DEATH_DEFLECT_B "'s telefrag on " #define LOC_TEAMKILL_1 " killed a teammate" From 298af6bd9b16fc1efe35921595d0d368756b0fc5 Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Tue, 17 Sep 2024 19:43:04 -0700 Subject: [PATCH 07/22] Removed QW's buggy shotgun particle batching --- build_components.json | 1 - qcsrc/weapons.qc | 83 +++++++++++-------------------------------- 2 files changed, 21 insertions(+), 63 deletions(-) diff --git a/build_components.json b/build_components.json index a2fa144c5..d70db9763 100644 --- a/build_components.json +++ b/build_components.json @@ -15,7 +15,6 @@ "docs/misc-docs/COPYING", "docs/misc-docs/LibreProgsDeluxe.md", "docs/misc-docs/pop.lmp.md" - ] }, "root": { diff --git a/qcsrc/weapons.qc b/qcsrc/weapons.qc index 82e335159..60bd8f341 100644 --- a/qcsrc/weapons.qc +++ b/qcsrc/weapons.qc @@ -164,6 +164,25 @@ void(vector org, vector vel, float damage) SpawnBlood = #endif }; +void(vector org) SpawnPuff = +{ +#ifdef __QW__ + WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); + WriteByte (MSG_MULTICAST, TE_GUNSHOT); + WriteByte (MSG_MULTICAST, 1); + WriteCoord (MSG_MULTICAST, org_x); + WriteCoord (MSG_MULTICAST, org_y); + WriteCoord (MSG_MULTICAST, org_z); + multicast (org, MULTICAST_PVS); +#else + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_GUNSHOT); + WriteCoord (MSG_BROADCAST, org_x); + WriteCoord (MSG_BROADCAST, org_y); + WriteCoord (MSG_BROADCAST, org_z); +#endif +} + /* ================ spawn_touchblood @@ -223,22 +242,10 @@ Collects multiple small damages into a single damage entity multi_ent; float multi_damage; -#ifdef __QW__ -vector blood_org; -float blood_count; -vector puff_org; -float puff_count; -#endif - void() ClearMultiDamage = { multi_ent = world; multi_damage = 0; - -#ifdef __QW__ - blood_count = 0; - puff_count = 0; -#endif }; void() ApplyMultiDamage = @@ -264,35 +271,6 @@ void(entity hit, float damage) AddMultiDamage = multi_damage = multi_damage + damage; }; - -void() Multi_Finish = -{ -#ifdef __QW__ - if (puff_count) - { - WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); - WriteByte (MSG_MULTICAST, TE_GUNSHOT); - WriteByte (MSG_MULTICAST, puff_count); - WriteCoord (MSG_MULTICAST, puff_org_x); - WriteCoord (MSG_MULTICAST, puff_org_y); - WriteCoord (MSG_MULTICAST, puff_org_z); - multicast (puff_org, MULTICAST_PVS); - } - - if (blood_count) - { - WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); - WriteByte (MSG_MULTICAST, TE_BLOOD); - WriteByte (MSG_MULTICAST, blood_count); - WriteCoord (MSG_MULTICAST, blood_org_x); - WriteCoord (MSG_MULTICAST, blood_org_y); - WriteCoord (MSG_MULTICAST, blood_org_z); - multicast (puff_org, MULTICAST_PVS); - } -#endif -}; - - /* ============================================================================== @@ -318,12 +296,8 @@ void(float damage, vector dir, string dtype) TraceAttack = if (trace_ent.takedamage) { -#ifdef __QW__ - blood_count = blood_count + 1; - blood_org = org; -#else + SpawnBlood (org, vel*0.2, damage); -#endif trace_ent.deathtype = dtype; AddMultiDamage (trace_ent, damage); @@ -331,15 +305,7 @@ void(float damage, vector dir, string dtype) TraceAttack = else { -#ifdef __QW__ - puff_count = puff_count + 1; -#else - WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); - WriteByte (MSG_BROADCAST, TE_GUNSHOT); - WriteCoord (MSG_BROADCAST, org_x); - WriteCoord (MSG_BROADCAST, org_y); - WriteCoord (MSG_BROADCAST, org_z); -#endif + SpawnPuff(org); } }; @@ -362,11 +328,6 @@ void(float shotcount, vector dir, vector spread, string dtype) FireBullets = ClearMultiDamage (); -#ifdef __QW__ - traceline (src, src + dir*2048, FALSE, self); - puff_org = trace_endpos - dir*4; -#endif - while (shotcount > 0) { direction = dir + crandom()*spread_x*v_right + crandom()*spread_y*v_up; @@ -378,8 +339,6 @@ void(float shotcount, vector dir, vector spread, string dtype) FireBullets = shotcount = shotcount - 1; } ApplyMultiDamage (); - - Multi_Finish (); }; /* From 8d08a4e2beea49aef2b37a4a4147bca2ad11679f Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Tue, 17 Sep 2024 19:59:56 -0700 Subject: [PATCH 08/22] Made dropped quad have EF_BLUE effect --- qcsrc/items.qc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/qcsrc/items.qc b/qcsrc/items.qc index f4cdd43b2..88656dc60 100644 --- a/qcsrc/items.qc +++ b/qcsrc/items.qc @@ -112,6 +112,10 @@ void(float timeleft) DropQuad = item.touch = q_touch; item.nextthink = time + timeleft; // remove it with the time left on it item.think = SUB_Remove; + +#ifdef __QW__ + item.effects = EF_BLUE; +#endif }; From b296cc32f08c05109ca7a1df37a9f89078ab067f Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Tue, 17 Sep 2024 21:14:37 -0700 Subject: [PATCH 09/22] Merged progs.src with qwprogs.src --- qcsrc/progs.src | 32 +++++++++++++++++++++++++++++--- qcsrc/qw.qc | 2 -- qcsrc/qwprogs.src | 21 --------------------- 3 files changed, 29 insertions(+), 26 deletions(-) delete mode 100644 qcsrc/qw.qc delete mode 100644 qcsrc/qwprogs.src diff --git a/qcsrc/progs.src b/qcsrc/progs.src index 3f28ca0ac..88c12777c 100644 --- a/qcsrc/progs.src +++ b/qcsrc/progs.src @@ -1,27 +1,50 @@ -../lq1/progs.dat +#ifdef __QW__ +#pragma progs_dat "../lq1/qwprogs.dat" +#else +#pragma progs_dat "../lq1/progs.dat" +#endif + +#includelist defs.qc localized_text.qc // LQ: Localized strings, also applies to Quake deathmatch_modes.qc subs.qc + +#ifdef __QW__ +server.qc +#endif + +#ifndef __QW__ fight.qc ai.qc -combat.qc - lq1/cutscene_camera.qc // LQ: svc_cutscene firing camera +#endif + +combat.qc items.qc weapons.qc world.qc client.qc + +#ifdef __QW__ +spectate.qc +#endif + player.qc + +#ifndef __QW__ monsters.qc +#endif + doors.qc buttons.qc triggers.qc plats.qc misc.qc +#ifndef __QW__ monsters/ogre.qc monsters/fiend.qc monsters/shambler.qc @@ -38,3 +61,6 @@ monsters/rotfish.qc // registered monsters/vore.qc // registered monsters/enforcer.qc // registered monsters/shub.qc // registered +#endif + +#endlist \ No newline at end of file diff --git a/qcsrc/qw.qc b/qcsrc/qw.qc deleted file mode 100644 index 01c473904..000000000 --- a/qcsrc/qw.qc +++ /dev/null @@ -1,2 +0,0 @@ -// Preprocessor directive used to delineate NetQuake functionality from QuakeWorld functionality -#define __QW__ diff --git a/qcsrc/qwprogs.src b/qcsrc/qwprogs.src deleted file mode 100644 index 8b15df01f..000000000 --- a/qcsrc/qwprogs.src +++ /dev/null @@ -1,21 +0,0 @@ -../lq1/qwprogs.dat - -qw.qc // QW only -defs.qc -localized_text.qc // LQ: Localized strings, also applies to Quake -deathmatch_modes.qc -server.qc // QW only -subs.qc -combat.qc - -items.qc -weapons.qc -world.qc -client.qc -spectate.qc // QW only -player.qc -doors.qc -buttons.qc -triggers.qc -plats.qc -misc.qc From 83fd1f4242a4891fd59ac41113decdb9bac547ea Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Tue, 17 Sep 2024 21:15:43 -0700 Subject: [PATCH 10/22] Edited build script for new __QW__ compile --- build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.py b/build.py index d2debacb2..83a1b8be9 100644 --- a/build.py +++ b/build.py @@ -178,7 +178,7 @@ def compile_progs(): check=True, # Fail on non-zero exit code ) subprocess.run( - ["fteqcc", "qcsrc/qwprogs.src", "-D__LIBREQUAKE__", "-O3"], + ["fteqcc", "qcsrc/progs.src", "-D__LIBREQUAKE__", "-D__QW__", "-O3"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, check=True, # Fail on non-zero exit code From fddd31a14c32f870e79b773d97baff76d3570e62 Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Tue, 17 Sep 2024 21:57:23 -0700 Subject: [PATCH 11/22] Added comments to all __QW__ preprocessor directives --- qcsrc/client.qc | 29 +++---- qcsrc/combat.qc | 5 +- qcsrc/defs.qc | 66 ++++++++-------- qcsrc/items.qc | 6 +- qcsrc/misc.qc | 4 +- qcsrc/player.qc | 4 +- qcsrc/triggers.qc | 2 +- qcsrc/weapons.qc | 198 ++++++++++++++++++---------------------------- 8 files changed, 136 insertions(+), 178 deletions(-) diff --git a/qcsrc/client.qc b/qcsrc/client.qc index 159e934f9..b6d883dae 100644 --- a/qcsrc/client.qc +++ b/qcsrc/client.qc @@ -174,7 +174,8 @@ void() GotoNextMap = } else { -#ifdef __QW__ + +#ifdef __QW__ // NQ does not support infokeys newmap = infokey(world, mapname); if (newmap != "") changelevel (newmap); @@ -322,7 +323,7 @@ void() execute_changelevel = other = find (other, classname, "player"); } -#ifdef __QW__ +#ifdef __QW__ // Differences in engine protocols WriteByte (MSG_ALL, SVC_CDTRACK); WriteByte (MSG_ALL, 3); @@ -347,7 +348,7 @@ void() changelevel_touch = if (other.classname != "player") return; -#ifdef __QW__ +#ifdef __QW__ // noexit cvar is not supported in QW if ((cvar("samelevel") == 2) || ((cvar("samelevel") == 3) && (mapname != "start"))) { T_Damage (other, self, self, 50000); @@ -645,7 +646,7 @@ void() PutClientInServer = stuffcmd(self, "-attack\n"); // Supa, prevent shooting after respawning in MP -#ifdef __QW__ +#ifdef __QW__ // NQ does not support infokeys // Set Rocket Jump Modifiers if (stof(infokey(world, "rj")) != 0) { @@ -913,7 +914,7 @@ void() PlayerJump = if (self.waterlevel >= 2) { -#ifndef __QW__ +#ifndef __QW__ // QW handles this movement code in the engine for client-side prediction if (self.watertype == CONTENT_WATER) self.velocity_z = 100; @@ -953,7 +954,7 @@ void() PlayerJump = // player jumping sound sound (self, CHAN_AUTO, "player/plyrjmp8.wav", 1, ATTN_NORM); -#ifndef __QW__ +#ifndef __QW__ // QW handles this movement code in the engine for client-side prediction self.flags = self.flags - FL_ONGROUND; // don't stairwalk self.velocity_z = self.velocity_z + 270; #endif @@ -1055,7 +1056,7 @@ void() WaterMove = self.dmgtime = 0; } -#ifndef __QW__ +#ifndef __QW__ // QW handles this movement code in the engine for client-side prediction if (! (self.flags & FL_WATERJUMP) ) self.velocity = self.velocity - 0.8*self.waterlevel*frametime*self.velocity; #endif @@ -1233,14 +1234,14 @@ void() CheckPowerups = if (self.invincible_finished > time) { self.effects = self.effects | EF_DIMLIGHT; -#ifdef __QW__ +#ifdef __QW__ // EF_RED is not supported in NQ self.effects = self.effects | EF_RED; #endif } else { self.effects = self.effects - (self.effects & EF_DIMLIGHT); -#ifdef __QW__ +#ifdef __QW__ // EF_RED is not supported in NQ self.effects = self.effects - (self.effects & EF_RED); #endif } @@ -1288,7 +1289,7 @@ void() CheckPowerups = if (self.super_damage_finished > time) { self.effects = self.effects | EF_DIMLIGHT; -#ifdef __QW__ +#ifdef __QW__ // EF_BLUE is not supported in NQ self.effects = self.effects | EF_BLUE; #endif } @@ -1296,7 +1297,7 @@ void() CheckPowerups = else { self.effects = self.effects - (self.effects & EF_DIMLIGHT); -#ifdef __QW__ +#ifdef __QW__ // EF_BLUE is not supported in NQ self.effects = self.effects - (self.effects & EF_BLUE); #endif } @@ -1369,7 +1370,7 @@ void() PlayerPostThink = self.jump_flag = 0; } -#ifdef __QW__ +#ifdef __QW__ // Honestly not sure why this branch is necessary. Possibly related to movement physics differences. self.jump_flag = self.velocity_z; #else if (!(self.flags & FL_ONGROUND)) @@ -1436,13 +1437,13 @@ void(entity targ, entity attacker) ClientObituary = local float on_team; -#ifdef __QW__ +#ifdef __QW__ // QW handles teams differently local string attackerteam, targteam; #else local float attackerteam, targteam; #endif -#ifdef __QW__ +#ifdef __QW__ // QW handles teams differently attackerteam = infokey(attacker, "team"); targteam = infokey(targ, "team"); on_team = attackerteam != ""; diff --git a/qcsrc/combat.qc b/qcsrc/combat.qc index 8b86b5060..89e2a451e 100644 --- a/qcsrc/combat.qc +++ b/qcsrc/combat.qc @@ -135,7 +135,7 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage= local string s; local float on_team; -#ifdef __QW__ +#ifdef __QW__ // QW handles teams differently local string attackerteam; local string targteam; #else @@ -215,8 +215,7 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage= } // team play damage avoidance -#ifdef __QW__ - // ZOID 12-13-96: self.team doesn't work in QW. Use keys +#ifdef __QW__ // QW handles teams differently attackerteam = infokey(attacker, "team"); targteam = infokey(targ, "team"); on_team = attackerteam != ""; diff --git a/qcsrc/defs.qc b/qcsrc/defs.qc index 0713c18fc..51f5e9723 100644 --- a/qcsrc/defs.qc +++ b/qcsrc/defs.qc @@ -32,7 +32,7 @@ entity world; float time; float frametime; -#ifdef __QW__ +#ifdef __QW__ // NQ defines this outside of C-referenced vars entity newmis; // if this is set, the entity that just // run created a new missile that should // be simulated immediately @@ -48,7 +48,7 @@ float force_retouch; // force all entities to touch triggers // to guarantee everything is touched string mapname; -#ifndef __QW__ +#ifndef __QW__ // QW defines these outside of C-referenced vars float deathmatch; float coop; float teamplay; @@ -129,7 +129,7 @@ void end_sys_globals; // flag for structure dumping .float ltime; // local time for entity -#ifdef __QW__ +#ifdef __QW__ // Unused, as far as I can tell, but needed to keep the C struct intact .float lastruntime; #endif @@ -142,7 +142,7 @@ void end_sys_globals; // flag for structure dumping .vector angles; .vector avelocity; -#ifndef __QW__ +#ifndef __QW__ // Differences in engine protocols .vector punchangle; // temp angle adjust from damage or recoil #endif @@ -190,7 +190,7 @@ void end_sys_globals; // flag for structure dumping .float fixangle; .vector v_angle; // view / targeting angle for players -#ifndef __QW__ +#ifndef __QW__ // Unused, as far as I can tell, but needed to keep the C struct intact .float idealpitch; // calculated pitch angle for lookup up slopes #endif @@ -372,7 +372,7 @@ float SVC_INTERMISSION = 30; float SVC_FINALE = 31; float SVC_CDTRACK = 32; float SVC_SELLSCREEN = 33; -#ifdef __QW__ +#ifdef __QW__ // Differences in engine protocols float SVC_SMALLKICK = 34; float SVC_BIGKICK = 35; float SVC_MUZZLEFLASH = 39; @@ -381,21 +381,21 @@ float SVC_CUTSCENE = 34; #endif -float TE_SPIKE = 0; -float TE_SUPERSPIKE = 1; -float TE_GUNSHOT = 2; -float TE_EXPLOSION = 3; -float TE_TAREXPLOSION = 4; -float TE_LIGHTNING1 = 5; -float TE_LIGHTNING2 = 6; -float TE_WIZSPIKE = 7; -float TE_KNIGHTSPIKE = 8; -float TE_LIGHTNING3 = 9; -float TE_LAVASPLASH = 10; -float TE_TELEPORT = 11; -#ifdef __QW__ -float TE_BLOOD = 12; -float TE_LIGHTNINGBLOOD = 13; +float TE_SPIKE = 0; +float TE_SUPERSPIKE = 1; +float TE_GUNSHOT = 2; +float TE_EXPLOSION = 3; +float TE_TAREXPLOSION = 4; +float TE_LIGHTNING1 = 5; +float TE_LIGHTNING2 = 6; +float TE_WIZSPIKE = 7; +float TE_KNIGHTSPIKE = 8; +float TE_LIGHTNING3 = 9; +float TE_LAVASPLASH = 10; +float TE_TELEPORT = 11; +#ifdef __QW__ // Differences in engine protocols +float TE_BLOOD = 12; +float TE_LIGHTNINGBLOOD = 13; #endif // sound channels @@ -406,10 +406,10 @@ float CHAN_WEAPON = 1; float CHAN_VOICE = 2; float CHAN_ITEM = 3; float CHAN_BODY = 4; -#ifdef __QW__ +#ifdef __QW__ // NetQuake doesn't support CHAN_NO_PHS_ADD. Set it to 0 so it will have no effect. float CHAN_NO_PHS_ADD = 8; #else -float CHAN_NO_PHS_ADD = 0; // NetQuake doesn't support this mode, so set it to 0 +float CHAN_NO_PHS_ADD = 0; #endif float ATTN_NONE = 0; @@ -426,7 +426,7 @@ float UPDATE_TEMP = 3; // entity effects -#ifdef __QW__ +#ifdef __QW__ // Engines support different entity effects float EF_BRIGHTLIGHT = 4; float EF_DIMLIGHT = 8; float EF_FLAG1 = 16; @@ -446,7 +446,7 @@ float MSG_ONE = 1; // reliable to one (msg_entity) float MSG_ALL = 2; // reliable to all float MSG_INIT = 3; // write to the init string -#ifdef __QW__ +#ifdef __QW__ // Multicast is QW only float MSG_MULTICAST = 4; // for multicast() call #endif @@ -457,7 +457,7 @@ float PRINT_MEDIUM = 1; // death messages float PRINT_HIGH = 2; // critical messages float PRINT_CHAT = 3; // also goes to chat console -#ifdef __QW__ +#ifdef __QW__ // Multicast is QW only // multicast sets float MULTICAST_ALL = 0; // every client float MULTICAST_PHS = 1; // within hearing @@ -472,14 +472,14 @@ float MULTICAST_PVS_R = 5; // within sight, reliable // // globals // -#ifndef __QW__ +#ifndef __QW__ // Used for monster code; not needed in QW float movedist; #endif float gameover; // set when a rule exits string string_null; // null string, nothing should be held here -#ifndef __QW__ +#ifndef __QW__ // QW defines this inside of C-referenced vars entity newmis; // launch_spike sets this after spawning it #endif @@ -495,7 +495,7 @@ float framecount; float skill; float timelimit; float fraglimit; -#ifdef __QW__ +#ifdef __QW__ // NQ defines this inside of C-referenced vars float deathmatch; float coop; float teamplay; @@ -694,7 +694,7 @@ string(string s) precache_model = #20; void(entity client, string s)stuffcmd = #21; entity(vector org, float rad) findradius = #22; -#ifdef __QW__ +#ifdef __QW__ // QW supports print levels for console prints. NQ doesn't, so we just have it ignore the print level. void(float level, string s) bprint = #23; void(entity client, float level, string s) sprint = #24; #else @@ -728,7 +728,7 @@ float(string s) cvar = #45; // return cvar.value void(string s) localcmd = #46; // put string into local que entity(entity e) nextent = #47; // for looping through all ents -#ifndef __QW__ +#ifndef __QW__ // Differences in engine protocols void(vector o, vector d, float color, float count) particle = #48;// start a particle effect #endif @@ -786,13 +786,13 @@ void(entity e) setspawnparms = #78; // set parm1... to the // values at level start // for coop respawn -#ifdef __QW__ +#ifdef __QW__ // logfrag is supported in QW, but not NQ. We just have NQ define it as an empty function. void(entity killer, entity killee) logfrag = #79; // add to stats #else void(entity killer, entity killee) logfrag = {}; // add to stats #endif -#ifdef __QW__ +#ifdef __QW__ // NQ does not support infokeys string(entity e, string key) infokey = #80; // get a key value (world = serverinfo) float(string s) stof = #81; // convert string to float void(vector where, float set) multicast = #82; // sends the temp message to a set diff --git a/qcsrc/items.qc b/qcsrc/items.qc index 88656dc60..d2f20bee0 100644 --- a/qcsrc/items.qc +++ b/qcsrc/items.qc @@ -113,7 +113,7 @@ void(float timeleft) DropQuad = item.nextthink = time + timeleft; // remove it with the time left on it item.think = SUB_Remove; -#ifdef __QW__ +#ifdef __QW__ // EF_BLUE is not supported in NQ item.effects = EF_BLUE; #endif }; @@ -1520,7 +1520,7 @@ void() item_artifact_invulnerability = setmodel (self, "progs/invulner.mdl"); self.netname = LOC_ITEM_NAME_PENTPROT; -#ifdef __QW__ +#ifdef __QW__ // EF_RED is not supported in NQ self.effects = self.effects | EF_RED; #endif @@ -1602,7 +1602,7 @@ void() item_artifact_super_damage = else self.netname = LOC_ITEM_NAME_QUADDMG; -#ifdef __QW__ +#ifdef __QW__ // EF_BLUE is not supported in NQ self.effects = self.effects | EF_BLUE; #endif diff --git a/qcsrc/misc.qc b/qcsrc/misc.qc index ba33ff82c..1d24b9ec4 100644 --- a/qcsrc/misc.qc +++ b/qcsrc/misc.qc @@ -256,7 +256,7 @@ void() barrel_explode = self.takedamage = DAMAGE_NO; self.classname = "explo_box"; T_RadiusDamage (self, self, 160, world, ""); -#ifdef __QW__ +#ifdef __QW__ // Differences in engine protocols WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, TE_EXPLOSION); WriteCoord (MSG_MULTICAST, self.origin_x); @@ -375,7 +375,7 @@ void() Laser_Touch = } else { -#ifdef __QW__ +#ifdef __QW__ // Differences in engine protocols WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, TE_GUNSHOT); WriteByte (MSG_MULTICAST, 5); diff --git a/qcsrc/player.qc b/qcsrc/player.qc index 77c4fc4c1..4ccfb0c4f 100644 --- a/qcsrc/player.qc +++ b/qcsrc/player.qc @@ -168,7 +168,7 @@ void() player_run =[ $rockrun1, player_run ] void() muzzleflash = { -#ifdef __QW__ +#ifdef __QW__ // Differences in engine protocols WriteByte (MSG_MULTICAST, SVC_MUZZLEFLASH); WriteEntity (MSG_MULTICAST, self); multicast (self.origin, MULTICAST_PVS); @@ -621,7 +621,7 @@ void() PlayerDie = drop_quad = TRUE; drop_ring = TRUE; -#ifdef __QW__ +#ifdef __QW__ // NQ does not support infokeys if ((stof(infokey(world,"dq"))) == 0) drop_quad = FALSE; if ((stof(infokey(world,"dr"))) == 0) diff --git a/qcsrc/triggers.qc b/qcsrc/triggers.qc index c3bb34e7c..b57c05d0f 100644 --- a/qcsrc/triggers.qc +++ b/qcsrc/triggers.qc @@ -340,7 +340,7 @@ void(vector org) spawn_tfog = s.nextthink = time + 0.2; s.think = play_teleport; -#ifdef __QW__ +#ifdef __QW__ // Differences in engine protocols WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, TE_TELEPORT); WriteCoord (MSG_MULTICAST, org_x); diff --git a/qcsrc/weapons.qc b/qcsrc/weapons.qc index 60bd8f341..25aefea91 100644 --- a/qcsrc/weapons.qc +++ b/qcsrc/weapons.qc @@ -46,61 +46,6 @@ float() crandom = return 2*(random() - 0.5); }; -/* -================ -W_FireAxe -================ -*/ -void() W_FireAxe = -{ - local vector source; - local vector org; - - makevectors (self.v_angle); - source = self.origin + '0 0 22'; - traceline (source, source + v_forward*64, FALSE, self); - if (trace_fraction == 1.0) - return; - - org = trace_endpos - v_forward*4; - - if (trace_ent.takedamage) - { - trace_ent.axhitme = 1; - SpawnBlood (org, '0 0 0', 20); - trace_ent.deathtype = "axe"; - if (deathmatch_supermode() || deathmatch_supermode2()) - T_Damage (trace_ent, self, self, 75); - else - T_Damage (trace_ent, self, self, 20); - } - - else - { // hit wall - sound (self, CHAN_WEAPON, "player/axhit2.wav", 1, ATTN_NORM); - -#ifdef __QW__ - WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); - WriteByte (MSG_MULTICAST, TE_GUNSHOT); - WriteByte (MSG_MULTICAST, 3); - WriteCoord (MSG_MULTICAST, org_x); - WriteCoord (MSG_MULTICAST, org_y); - WriteCoord (MSG_MULTICAST, org_z); - multicast (org, MULTICAST_PVS); -#else - WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); - WriteByte (MSG_BROADCAST, TE_GUNSHOT); - WriteCoord (MSG_BROADCAST, org_x); - WriteCoord (MSG_BROADCAST, org_y); - WriteCoord (MSG_BROADCAST, org_z); -#endif - } -}; - - -//============================================================================ - - vector() wall_velocity = { local vector vel; @@ -113,7 +58,6 @@ vector() wall_velocity = return vel; }; - /* ================ SpawnMeatSpray @@ -151,7 +95,7 @@ SpawnBlood */ void(vector org, vector vel, float damage) SpawnBlood = { -#ifdef __QW__ +#ifdef __QW__ // Differences in engine protocols WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, TE_BLOOD); WriteByte (MSG_MULTICAST, 1); @@ -164,12 +108,17 @@ void(vector org, vector vel, float damage) SpawnBlood = #endif }; -void(vector org) SpawnPuff = +/* +================ +SpawnPuff +================ +*/ +void(vector org, float count) SpawnPuff = { -#ifdef __QW__ +#ifdef __QW__ // Differences in engine protocols WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, TE_GUNSHOT); - WriteByte (MSG_MULTICAST, 1); + WriteByte (MSG_MULTICAST, count); WriteCoord (MSG_MULTICAST, org_x); WriteCoord (MSG_MULTICAST, org_y); WriteCoord (MSG_MULTICAST, org_z); @@ -196,23 +145,8 @@ void(float damage) spawn_touchblood = SpawnBlood (self.origin + vel*0.01, vel, damage); }; - -/* -================ -SpawnChunk -================ -*/ -void(vector org, vector vel) SpawnChunk = -{ -#ifdef __QW__ - SpawnBlood(org, vel, 10); -#else - particle (org, vel*0.02, 0, 10); -#endif -}; - void() SmallKick = { -#ifdef __QW__ +#ifdef __QW__ // Differences in engine protocols msg_entity = self; WriteByte (MSG_ONE, SVC_SMALLKICK); #else @@ -221,7 +155,7 @@ void() SmallKick = { }; void() BigKick = { -#ifdef __QW__ +#ifdef __QW__ // Differences in engine protocols msg_entity = self; WriteByte (MSG_ONE, SVC_BIGKICK); #else @@ -229,6 +163,42 @@ void() BigKick = { #endif }; +/* +================ +W_FireAxe +================ +*/ +void() W_FireAxe = +{ + local vector source; + local vector org; + + makevectors (self.v_angle); + source = self.origin + '0 0 22'; + traceline (source, source + v_forward*64, FALSE, self); + if (trace_fraction == 1.0) + return; + + org = trace_endpos - v_forward*4; + + if (trace_ent.takedamage) + { + trace_ent.axhitme = 1; + SpawnBlood (org, '0 0 0', 20); + trace_ent.deathtype = "axe"; + if (deathmatch_supermode() || deathmatch_supermode2()) + T_Damage (trace_ent, self, self, 75); + else + T_Damage (trace_ent, self, self, 20); + } + + else + { // hit wall + sound (self, CHAN_WEAPON, "player/axhit2.wav", 1, ATTN_NORM); + SpawnPuff(org, 3); + } +}; + /* ============================================================================== @@ -305,7 +275,7 @@ void(float damage, vector dir, string dtype) TraceAttack = else { - SpawnPuff(org); + SpawnPuff(org, 1); } }; @@ -397,7 +367,7 @@ ROCKETS ============================================================================== */ -#ifndef __QW__ +#ifndef __QW__ // Unused by QW code void() s_explode1 = [0, s_explode2] {}; void() s_explode2 = [1, s_explode3] {}; void() s_explode3 = [2, s_explode4] {}; @@ -416,6 +386,28 @@ void() BecomeExplosion = }; #endif +void() MissileExplode = +{ +#ifdef __QW__ // Differences in engine protocols + WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); + WriteByte (MSG_MULTICAST, TE_EXPLOSION); + WriteCoord (MSG_MULTICAST, self.origin_x); + WriteCoord (MSG_MULTICAST, self.origin_y); + WriteCoord (MSG_MULTICAST, self.origin_z); + multicast (self.origin, MULTICAST_PHS); + + remove(self); +#else + WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); + WriteByte (MSG_BROADCAST, TE_EXPLOSION); + WriteCoord (MSG_BROADCAST, self.origin_x); + WriteCoord (MSG_BROADCAST, self.origin_y); + WriteCoord (MSG_BROADCAST, self.origin_z); + + BecomeExplosion (); +#endif +}; + void() T_MissileTouch = { local float damg; @@ -450,24 +442,7 @@ void() T_MissileTouch = self.origin = self.origin - 8*normalize(self.velocity); -#ifdef __QW__ - WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); - WriteByte (MSG_MULTICAST, TE_EXPLOSION); - WriteCoord (MSG_MULTICAST, self.origin_x); - WriteCoord (MSG_MULTICAST, self.origin_y); - WriteCoord (MSG_MULTICAST, self.origin_z); - multicast (self.origin, MULTICAST_PHS); - - remove(self); -#else - WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); - WriteByte (MSG_BROADCAST, TE_EXPLOSION); - WriteCoord (MSG_BROADCAST, self.origin_x); - WriteCoord (MSG_BROADCAST, self.origin_y); - WriteCoord (MSG_BROADCAST, self.origin_z); - - BecomeExplosion (); -#endif + MissileExplode(); }; @@ -520,7 +495,7 @@ LIGHTNING void(entity from, float damage) LightningHit = { -#ifdef __QW__ +#ifdef __QW__ // Differences in engine protocols WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, TE_LIGHTNINGBLOOD); WriteCoord (MSG_MULTICAST, trace_endpos_x); @@ -639,7 +614,7 @@ void() W_FireLightning = traceline (org, org + v_forward*600, TRUE, self); -#ifdef __QW__ +#ifdef __QW__ // Differences in engine protocols WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, TE_LIGHTNING2); WriteEntity (MSG_MULTICAST, self); @@ -678,24 +653,7 @@ void() GrenadeExplode = T_RadiusDamage (self, self.owner, 120, world, "grenade"); -#ifdef __QW__ - WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); - WriteByte (MSG_MULTICAST, TE_EXPLOSION); - WriteCoord (MSG_MULTICAST, self.origin_x); - WriteCoord (MSG_MULTICAST, self.origin_y); - WriteCoord (MSG_MULTICAST, self.origin_z); - multicast (self.origin, MULTICAST_PHS); - - remove (self); -#else - WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); - WriteByte (MSG_BROADCAST, TE_EXPLOSION); - WriteCoord (MSG_BROADCAST, self.origin_x); - WriteCoord (MSG_BROADCAST, self.origin_y); - WriteCoord (MSG_BROADCAST, self.origin_z); - - BecomeExplosion (); -#endif + MissileExplode(); }; void() GrenadeTouch = @@ -890,7 +848,7 @@ void() spike_touch = else te_type = TE_SPIKE; -#ifdef __QW__ +#ifdef __QW__ // Differences in engine protocols WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, te_type); WriteCoord (MSG_MULTICAST, self.origin_x); @@ -1483,7 +1441,7 @@ void() QuadCheat = #define ID_IMPULSE_QUADCHEAT 255 #ifdef __LIBREQUAKE__ -#ifndef __QW__ +#ifndef __QW__ // Cutscene camera is not used in QW #define LQ_IMPULSE_SPAWNCAM 200 #define LQ_IMPULSE_CAMTIMEINC 201 @@ -1509,7 +1467,7 @@ void() ImpulseCommands = case ID_IMPULSE_QUADCHEAT: QuadCheat(); break; #ifdef __LIBREQUAKE__ -#ifndef __QW__ +#ifndef __QW__ // Cutscene camera is not used in QW case LQ_IMPULSE_SPAWNCAM: LQ_SpawnCamera(); break; case LQ_IMPULSE_CAMTIMEDEC: LQ_AppendCameraTime(5); break; From af7f9b377369226d1d0929b9e2ff3559de515abe Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Tue, 17 Sep 2024 21:58:59 -0700 Subject: [PATCH 12/22] Fixed typo in ppd --- qcsrc/weapons.qc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qcsrc/weapons.qc b/qcsrc/weapons.qc index 25aefea91..d33ac7303 100644 --- a/qcsrc/weapons.qc +++ b/qcsrc/weapons.qc @@ -896,7 +896,7 @@ void() superspike_touch = } else { -#ifdef __QW___ +#ifdef __QW__ // Differences in engine protocols WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, TE_SUPERSPIKE); WriteCoord (MSG_MULTICAST, self.origin_x); From 01a2ef13394127313c2b3412a96ae0808e4a05b0 Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Tue, 17 Sep 2024 23:04:14 -0700 Subject: [PATCH 13/22] Localization changes --- qcsrc/client.qc | 13 ++++++++----- qcsrc/localized_text.qc | 16 ++++++++-------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/qcsrc/client.qc b/qcsrc/client.qc index b6d883dae..d79650510 100644 --- a/qcsrc/client.qc +++ b/qcsrc/client.qc @@ -362,9 +362,12 @@ void() changelevel_touch = } #endif - bprint (PRINT_HIGH, other.netname); - bprint (PRINT_HIGH, LOC_CLIENT_DISCON); - bprint (PRINT_HIGH, "\n"); + if (deathmatch || coop) + { + bprint (PRINT_HIGH, other.netname); + bprint (PRINT_HIGH, LOC_CLIENT_EXIT_LEVEL); + bprint (PRINT_HIGH, "\n"); + } nextmap = self.map; @@ -1415,9 +1418,9 @@ void() ClientDisconnect = // let everyone else know bprint (PRINT_HIGH, self.netname); - bprint (PRINT_HIGH, LOC_CLIENT_DISCON_DM_A); + bprint (PRINT_HIGH, LOC_CLIENT_DISCON_A); bprint (PRINT_HIGH, ftos(self.frags)); - bprint (PRINT_HIGH, LOC_CLIENT_DISCON_DM_B); + bprint (PRINT_HIGH, LOC_CLIENT_DISCON_B); bprint (PRINT_HIGH, "\n"); sound (self, CHAN_BODY, "player/tornoff2.wav", 1, ATTN_NONE); set_suicide_frame (); diff --git a/qcsrc/localized_text.qc b/qcsrc/localized_text.qc index d4c2b4dda..2fb9b93e0 100644 --- a/qcsrc/localized_text.qc +++ b/qcsrc/localized_text.qc @@ -65,17 +65,17 @@ #ifdef __LIBREQUAKE__ -#define LOC_CLIENT_JOIN " joined the game" -#define LOC_CLIENT_DISCON " exited the level" -#define LOC_CLIENT_DISCON_DM_A " left the game with " -#define LOC_CLIENT_DISCON_DM_B " frags" +#define LOC_CLIENT_JOIN " joined the server" +#define LOC_CLIENT_EXIT_LEVEL " exited the level" +#define LOC_CLIENT_DISCON_A " left the server the game with " +#define LOC_CLIENT_DISCON_B " frags" #else -#define LOC_CLIENT_JOIN " entered the game" -#define LOC_CLIENT_DISCON " exited the level" -#define LOC_CLIENT_DISCON_DM_A " left the game with " -#define LOC_CLIENT_DISCON_DM_B " frags" +#define LOC_CLIENT_JOIN " entered the game" +#define LOC_CLIENT_EXIT_LEVEL " exited the level" +#define LOC_CLIENT_DISCON_A " left the game with " +#define LOC_CLIENT_DISCON_B " frags" #endif // __LIBREQUAKE__ From 5215ed14ab8d04b34ad10e91917bb1db57101950 Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Wed, 18 Sep 2024 18:53:24 -0700 Subject: [PATCH 14/22] Refactored deathmatch settings --- qcsrc/client.qc | 68 ++++++++---- qcsrc/combat.qc | 2 + qcsrc/deathmatch_modes.qc | 34 ------ qcsrc/deathmatch_settings.qc | 208 +++++++++++++++++++++++++++++++++++ qcsrc/defs.qc | 2 - qcsrc/items.qc | 91 +++++++++------ qcsrc/player.qc | 15 +-- qcsrc/progs.src | 2 +- qcsrc/weapons.qc | 16 +-- 9 files changed, 323 insertions(+), 115 deletions(-) delete mode 100644 qcsrc/deathmatch_modes.qc create mode 100644 qcsrc/deathmatch_settings.qc diff --git a/qcsrc/client.qc b/qcsrc/client.qc index d79650510..760322cce 100644 --- a/qcsrc/client.qc +++ b/qcsrc/client.qc @@ -650,31 +650,19 @@ void() PutClientInServer = stuffcmd(self, "-attack\n"); // Supa, prevent shooting after respawning in MP #ifdef __QW__ // NQ does not support infokeys - // Set Rocket Jump Modifiers - if (stof(infokey(world, "rj")) != 0) - { - rj = stof(infokey(world, "rj")); - } axes_only = stof(infokey(world, "axe")); #endif // Deathmatch 4 starting items if (deathmatch_supermode()) { - self.ammo_shells = 0; - if (axes_only == 0) - { - self.ammo_nails = 255; - self.ammo_shells = 255; - self.ammo_rockets = 255; - self.ammo_cells = 255; - self.items = self.items | IT_NAILGUN; - self.items = self.items | IT_SUPER_NAILGUN; - self.items = self.items | IT_SUPER_SHOTGUN; - self.items = self.items | IT_ROCKET_LAUNCHER; - // self.items = self.items | IT_GRENADE_LAUNCHER; - self.items = self.items | IT_LIGHTNING; - } + self.items = self.items | IT_NAILGUN; + self.items = self.items | IT_SUPER_NAILGUN; + self.items = self.items | IT_SUPER_SHOTGUN; + self.items = self.items | IT_ROCKET_LAUNCHER; + // self.items = self.items | IT_GRENADE_LAUNCHER; + self.items = self.items | IT_LIGHTNING; + self.weapon = IT_ROCKET_LAUNCHER; self.items = self.items - (self.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + IT_ARMOR3; self.armorvalue = 200; self.armortype = 0.8; @@ -687,16 +675,13 @@ void() PutClientInServer = // Deathmatch 5 starting items if (deathmatch_supermode2()) { - self.ammo_nails = 80; - self.ammo_shells = 30; - self.ammo_rockets = 10; - self.ammo_cells = 30; self.items = self.items | IT_NAILGUN; self.items = self.items | IT_SUPER_NAILGUN; self.items = self.items | IT_SUPER_SHOTGUN; self.items = self.items | IT_ROCKET_LAUNCHER; self.items = self.items | IT_GRENADE_LAUNCHER; self.items = self.items | IT_LIGHTNING; + self.weapon = IT_ROCKET_LAUNCHER; self.items = self.items - (self.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + IT_ARMOR3; self.armorvalue = 200; self.armortype = 0.8; @@ -706,6 +691,43 @@ void() PutClientInServer = self.invincible_finished = time + 3; } + if (deathmatch_starting_ammo()) + { + self.ammo_nails = 80; + self.ammo_shells = 30; + self.ammo_rockets = 10; + self.ammo_cells = 30; + } + + if (deathmatch_unlimited_ammo()) + { + self.ammo_nails = 255; + self.ammo_shells = 255; + self.ammo_rockets = 255; + self.ammo_cells = 255; + } + + // Axes only + if (deathmatch_axe_only()) + { + self.ammo_nails = 0; + self.ammo_shells = 0; + self.ammo_rockets = 0; + self.ammo_cells = 0; + self.items = self.items - (self.items & ( + IT_SHOTGUN | + IT_SUPER_SHOTGUN | + IT_NAILGUN | + IT_SUPER_NAILGUN | + IT_GRENADE_LAUNCHER | + IT_ROCKET_LAUNCHER | + IT_LIGHTNING + )); + self.weapon = IT_AXE; + } + + + W_SetCurrentAmmo (); }; diff --git a/qcsrc/combat.qc b/qcsrc/combat.qc index 89e2a451e..9fc3d2f98 100644 --- a/qcsrc/combat.qc +++ b/qcsrc/combat.qc @@ -134,6 +134,7 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage= local string temp_deathtype; local string s; local float on_team; + local float rj; #ifdef __QW__ // QW handles teams differently local string attackerteam; @@ -195,6 +196,7 @@ void(entity targ, entity inflictor, entity attacker, float damage) T_Damage= dir = normalize(dir); targ.velocity = targ.velocity + dir*damage*8; + rj = deathmatch_rocket_jump_multiplier(); if ( (rj > 1) & ((attacker.classname == "player") & (targ.classname == "player")) & ( attacker.netname == targ.netname)) targ.velocity = targ.velocity + dir * damage * rj; } diff --git a/qcsrc/deathmatch_modes.qc b/qcsrc/deathmatch_modes.qc deleted file mode 100644 index 2a1cb31d4..000000000 --- a/qcsrc/deathmatch_modes.qc +++ /dev/null @@ -1,34 +0,0 @@ -// -// deathmatch_modes.qc -- Centralized location for defining which deathmatch -// modes have which settings -// - -float() deathmatch_weapon_stay = -{ - return deathmatch >= 2; -} - -float() deathmatch_item_respawn = -{ - return deathmatch && (deathmatch != 2); -} - -float() deathmatch_classic = -{ - return deathmatch == 1; -} - -float() deathmatch_supermode = -{ - return deathmatch == 4; -} - -float() deathmatch_supermode2 = -{ - return deathmatch == 5; -} - -float() deathmatch_no_powerups = -{ - return deathmatch == 6; -} diff --git a/qcsrc/deathmatch_settings.qc b/qcsrc/deathmatch_settings.qc new file mode 100644 index 000000000..e4a239ad8 --- /dev/null +++ b/qcsrc/deathmatch_settings.qc @@ -0,0 +1,208 @@ +// +// deathmatch_settings.qc -- Centralized location for defining which deathmatch +// settings are in which modes +// + +// Weapons stay when picked up +float() deathmatch_weapon_stay = +{ + return deathmatch >= 2; +}; + +// Items respawn after a timer +float() deathmatch_item_respawn = +{ + return deathmatch && (deathmatch != 2); +}; + +// Ammo pickups take twice as long to respawn +float() deathmatch_slow_ammo = +{ + return deathmatch == 1; +}; + +// When picking up a backpack that contains a Rocket or Grenade Launcher, set the +// player's rocket count to 5 if they have less than 5 +float() deathmatch_backpack_min_rockets +{ + return deathmatch >= 3; +}; + +// All of the special rules that apply in deathmatch 4 +float() deathmatch_supermode = +{ + return deathmatch == 4; +}; + +// All of the special rules that apply in deathmatch 5 +float() deathmatch_supermode2 = +{ + return deathmatch == 5; +}; + +// Increases the axe's damage from 20 to 75 +float() deathmatch_buffed_axe = +{ + if (deathmatch_supermode() || deathmatch_supermode2()) + return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "ba")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Restricts players to axes only +float() deathmatch_axe_only = +{ +#ifdef __QW__ // NQ does not support infokeys + // Legacy support for "axe" infokey that only works on deathmatch 4 + if (deathmatch_supermode() && stof(infokey(world, "axe")) != 0) + return TRUE; + + if (deathmatch && stof(infokey(world, "ao")) != 0) + return TRUE; +#endif + return FALSE; +} + +// Players have unlimited ammo +float() deathmatch_unlimited_ammo = +{ + if (deathmatch_supermode()) + return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "ua")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Players start with some ammo +float() deathmatch_starting_ammo = +{ + if (deathmatch_supermode2()) + return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "sa")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Weapons are removed on map load +float() deathmatch_no_weapons = +{ + if (deathmatch_supermode() || deathmatch_supermode2() || deathmatch_axe_only()) + return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "nw")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Ammo pickups are removed on map load +float() deathmatch_no_ammo_pickups = +{ + if (deathmatch_unlimited_ammo() || deathmatch_axe_only()) + return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "na")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Powerups are removed on map load +float() deathmatch_no_powerups = +{ +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "np")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Armor pickups are removed on map load +float() deathmatch_no_armor = +{ +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "nr")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Health pickups are removed on map load +float() deathmatch_no_health = +{ +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "nh")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Mega-health pickups are removed on map load +float() deathmatch_no_mega_health = +{ +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "nmh")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Quad is dropped on death +float() deathmatch_drop_quad = +{ + if (!deathmatch) + return FALSE; + +#ifdef __QW__ // NQ does not support infokeys + return stof(infokey(world,"dq")) != 0; +#else + return TRUE; +#endif +}; + +// Ring is dropped on death +float() deathmatch_drop_ring = +{ + if (!deathmatch) + return FALSE; + +#ifdef __QW__ // NQ does not support infokeys + return stof(infokey(world,"dr")) != 0; +#else + return TRUE; +#endif +}; + +// Multiplier for explosion force from rocket and grenade jumps +float() deathmatch_rocket_jump_multiplier = +{ + if (!deathmatch) + return 0; + +#ifdef __QW__ // NQ does not support infokeys + return stof(infokey(world,"rj")); +#else + return 0; +#endif +}; \ No newline at end of file diff --git a/qcsrc/defs.qc b/qcsrc/defs.qc index 51f5e9723..1d96f885f 100644 --- a/qcsrc/defs.qc +++ b/qcsrc/defs.qc @@ -501,8 +501,6 @@ float coop; float teamplay; #endif -float rj; - //================================================ // diff --git a/qcsrc/items.qc b/qcsrc/items.qc index d2f20bee0..8b208ee4d 100644 --- a/qcsrc/items.qc +++ b/qcsrc/items.qc @@ -266,7 +266,8 @@ void() item_megahealth_rot; void() item_health = { - self.touch = health_touch; + if (deathmatch_no_health()) + return; if (self.spawnflags & H_ROTTEN) { @@ -281,6 +282,9 @@ void() item_health = else if (self.spawnflags & H_MEGA) { + if (deathmatch_no_mega_health()) + return; + precache_model("maps/b_bh100.bsp"); precache_sound("items/r_item2.wav"); setmodel(self, "maps/b_bh100.bsp"); @@ -299,6 +303,7 @@ void() item_health = self.healtype = 1; } + self.touch = health_touch; setsize (self, '0 0 0', '32 32 56'); StartItem (); }; @@ -343,14 +348,12 @@ void() health_touch = self.solid = SOLID_NOT; // Megahealth = rot down the player's super health - if (self.healtype == 2) + if (self.healtype == 2 && !deathmatch_supermode()) { other.items = other.items | IT_SUPERHEALTH; self.owner = other; - if (!deathmatch_supermode()) { - self.nextthink = time + 5; - self.think = item_megahealth_rot; - } + self.nextthink = time + 5; + self.think = item_megahealth_rot; } else @@ -471,6 +474,9 @@ void() armor_touch = void() item_armor1 = { + if (deathmatch_no_armor()) + return; + self.touch = armor_touch; precache_model ("progs/armor.mdl"); setmodel (self, "progs/armor.mdl"); @@ -487,6 +493,9 @@ void() item_armor1 = void() item_armor2 = { + if (deathmatch_no_armor()) + return; + self.touch = armor_touch; precache_model ("progs/armor.mdl"); setmodel (self, "progs/armor.mdl"); @@ -503,6 +512,9 @@ void() item_armor2 = void() item_armorInv = { + if (deathmatch_no_armor()) + return; + self.touch = armor_touch; precache_model ("progs/armor.mdl"); setmodel (self, "progs/armor.mdl"); @@ -521,17 +533,27 @@ WEAPONS void() bound_other_ammo = { - if (other.ammo_shells > 100) - other.ammo_shells = 100; + if (deathmatch_unlimited_ammo()) + { + other.ammo_shells = 255; + other.ammo_nails = 255; + other.ammo_rockets = 255; + other.ammo_cells = 255; + } + else + { + if (other.ammo_shells > 100) + other.ammo_shells = 100; - if (other.ammo_nails > 200) - other.ammo_nails = 200; + if (other.ammo_nails > 200) + other.ammo_nails = 200; - if (other.ammo_rockets > 100) - other.ammo_rockets = 100; + if (other.ammo_rockets > 100) + other.ammo_rockets = 100; - if (other.ammo_cells > 100) - other.ammo_cells = 100; + if (other.ammo_cells > 100) + other.ammo_cells = 100; + } }; @@ -742,7 +764,7 @@ void() weapon_touch = void() weapon_supershotgun = { - if (deathmatch_supermode() || deathmatch_supermode2()) + if (deathmatch_no_weapons()) return; precache_model ("progs/g_shot.mdl"); @@ -762,7 +784,7 @@ void() weapon_supershotgun = void() weapon_nailgun = { - if (deathmatch_supermode() || deathmatch_supermode2()) + if (deathmatch_no_weapons()) return; precache_model ("progs/g_nail.mdl"); @@ -782,7 +804,7 @@ void() weapon_nailgun = void() weapon_supernailgun = { - if (deathmatch_supermode() || deathmatch_supermode2()) + if (deathmatch_no_weapons()) return; precache_model ("progs/g_nail2.mdl"); @@ -802,7 +824,7 @@ void() weapon_supernailgun = void() weapon_grenadelauncher = { - if (deathmatch_supermode() || deathmatch_supermode2()) + if (deathmatch_no_weapons()) return; precache_model ("progs/g_rock.mdl"); @@ -822,7 +844,7 @@ void() weapon_grenadelauncher = void() weapon_rocketlauncher = { - if (deathmatch_supermode() || deathmatch_supermode2()) + if (deathmatch_no_weapons()) return; precache_model ("progs/g_rock2.mdl"); @@ -843,7 +865,7 @@ void() weapon_rocketlauncher = void() weapon_lightning = { - if (deathmatch_supermode() || deathmatch_supermode2()) + if (deathmatch_no_weapons()) return; precache_model ("progs/g_light.mdl"); @@ -951,9 +973,13 @@ void() ammo_touch = self.solid = SOLID_NOT; if (deathmatch_item_respawn()) - self.nextthink = time + 30; - - self.think = SUB_regen; + { + self.think = SUB_regen; + if (deathmatch_slow_ammo()) + self.nextthink = time + 30; + else + self.nextthink = time + 15; + } activator = other; SUB_UseTargets(); // fire all targets / killtargets @@ -972,7 +998,7 @@ float WEAPON_BIG2 = 1; void() item_shells = { - if (deathmatch_supermode()) + if (deathmatch_no_ammo_pickups()) return; self.touch = ammo_touch; @@ -1005,7 +1031,7 @@ void() item_shells = void() item_spikes = { - if (deathmatch_supermode()) + if (deathmatch_no_ammo_pickups()) return; self.touch = ammo_touch; @@ -1038,7 +1064,7 @@ void() item_spikes = void() item_rockets = { - if (deathmatch_supermode()) + if (deathmatch_no_ammo_pickups()) return; self.touch = ammo_touch; @@ -1072,7 +1098,7 @@ void() item_rockets = void() item_cells = { - if (deathmatch_supermode()) + if (deathmatch_no_ammo_pickups()) return; self.touch = ammo_touch; @@ -1506,9 +1532,8 @@ Player is invulnerable for 30 seconds */ void() item_artifact_invulnerability = { - if (deathmatch_no_powerups()) { + if (deathmatch_no_powerups()) return; - } self.touch = powerup_touch; @@ -1559,9 +1584,8 @@ Player is invisible for 30 seconds */ void() item_artifact_invisibility = { - if (deathmatch_no_powerups()) { + if (deathmatch_no_powerups()) return; - } self.touch = powerup_touch; @@ -1586,9 +1610,8 @@ The next attack from the player will do 4x damage */ void() item_artifact_super_damage = { - if (deathmatch_no_powerups()) { + if (deathmatch_no_powerups()) return; - } self.touch = powerup_touch; @@ -1763,7 +1786,7 @@ void() BackpackTouch = sprint (other, PRINT_LOW, "\n"); // If backpack has a grenade or rocket launcher in it, fill it with at least five rockets - if ( (deathmatch && !deathmatch_classic()) && ( (WeaponCode(new)==6) || (WeaponCode(new)==7) ) && (other.ammo_rockets < 5) ) + if ( deathmatch_backpack_min_rockets() && ( (WeaponCode(new)==6) || (WeaponCode(new)==7) ) && (other.ammo_rockets < 5) ) other.ammo_rockets = 5; // backpack touch sound diff --git a/qcsrc/player.qc b/qcsrc/player.qc index 4ccfb0c4f..9baa99f3a 100644 --- a/qcsrc/player.qc +++ b/qcsrc/player.qc @@ -616,19 +616,8 @@ void() PlayerDie = { local float i; local string s; - local float drop_quad; - local float drop_ring; - - drop_quad = TRUE; - drop_ring = TRUE; -#ifdef __QW__ // NQ does not support infokeys - if ((stof(infokey(world,"dq"))) == 0) - drop_quad = FALSE; - if ((stof(infokey(world,"dr"))) == 0) - drop_ring = FALSE; -#endif - if (deathmatch && drop_quad) { + if (deathmatch_drop_quad()) { if (self.super_damage_finished > 0) { DropQuad (self.super_damage_finished - time); @@ -646,7 +635,7 @@ void() PlayerDie = } } - if (deathmatch && drop_ring) { + if (deathmatch_drop_ring()) { if (self.invisible_finished > 0) { DropRing (self.invisible_finished - time); diff --git a/qcsrc/progs.src b/qcsrc/progs.src index 88c12777c..e41108f5b 100644 --- a/qcsrc/progs.src +++ b/qcsrc/progs.src @@ -8,7 +8,7 @@ defs.qc localized_text.qc // LQ: Localized strings, also applies to Quake -deathmatch_modes.qc +deathmatch_settings.qc subs.qc #ifdef __QW__ diff --git a/qcsrc/weapons.qc b/qcsrc/weapons.qc index d33ac7303..24754264b 100644 --- a/qcsrc/weapons.qc +++ b/qcsrc/weapons.qc @@ -186,7 +186,7 @@ void() W_FireAxe = trace_ent.axhitme = 1; SpawnBlood (org, '0 0 0', 20); trace_ent.deathtype = "axe"; - if (deathmatch_supermode() || deathmatch_supermode2()) + if (deathmatch_buffed_axe()) T_Damage (trace_ent, self, self, 75); else T_Damage (trace_ent, self, self, 20); @@ -324,7 +324,7 @@ void() W_FireShotgun = SmallKick(); - if (!deathmatch_supermode()) + if (!deathmatch_unlimited_ammo()) self.currentammo = self.ammo_shells = self.ammo_shells - 1; dir = aim (self, 100000); @@ -351,7 +351,7 @@ void() W_FireSuperShotgun = BigKick(); - if (!deathmatch_supermode()) + if (!deathmatch_unlimited_ammo()) self.currentammo = self.ammo_shells = self.ammo_shells - 2; dir = aim (self, 100000); @@ -454,7 +454,7 @@ W_FireRocket */ void() W_FireRocket = { - if (!deathmatch_supermode()) + if (!deathmatch_unlimited_ammo()) self.currentammo = self.ammo_rockets = self.ammo_rockets - 1; sound (self, CHAN_WEAPON, "weapons/sgun1.wav", 1, ATTN_NORM); @@ -607,7 +607,7 @@ void() W_FireLightning = SmallKick(); - if (!deathmatch_supermode()) + if (!deathmatch_unlimited_ammo()) self.currentammo = self.ammo_cells = self.ammo_cells - 1; org = self.origin + '0 0 16'; @@ -683,7 +683,7 @@ W_FireGrenade */ void() W_FireGrenade = { - if (!deathmatch_supermode()) + if (!deathmatch_unlimited_ammo()) self.currentammo = self.ammo_rockets = self.ammo_rockets - 1; sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM); @@ -766,7 +766,7 @@ void() W_FireSuperSpikes = sound (self, CHAN_WEAPON, "weapons/spike2.wav", 1, ATTN_NORM); self.attack_finished = time + 0.2; - if (!deathmatch_supermode()) + if (!deathmatch_unlimited_ammo()) self.currentammo = self.ammo_nails = self.ammo_nails - 2; dir = aim (self, 1000); @@ -801,7 +801,7 @@ void(float ox) W_FireSpikes = sound (self, CHAN_WEAPON, "weapons/rocket1i.wav", 1, ATTN_NORM); self.attack_finished = time + 0.2; - if (!deathmatch_supermode()) + if (!deathmatch_unlimited_ammo()) self.currentammo = self.ammo_nails = self.ammo_nails - 1; dir = aim (self, 1000); From 7683d88950aa8aee407f14b5bdec0c3c637e5d86 Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Wed, 18 Sep 2024 19:08:33 -0700 Subject: [PATCH 15/22] Fixed being unable to pick up armor while invulnerable --- qcsrc/deathmatch_settings.qc | 2 +- qcsrc/items.qc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qcsrc/deathmatch_settings.qc b/qcsrc/deathmatch_settings.qc index e4a239ad8..77ec72908 100644 --- a/qcsrc/deathmatch_settings.qc +++ b/qcsrc/deathmatch_settings.qc @@ -205,4 +205,4 @@ float() deathmatch_rocket_jump_multiplier = #else return 0; #endif -}; \ No newline at end of file +}; diff --git a/qcsrc/items.qc b/qcsrc/items.qc index 8b208ee4d..5b397ead5 100644 --- a/qcsrc/items.qc +++ b/qcsrc/items.qc @@ -412,7 +412,7 @@ void() armor_touch = if (other.classname != "player") return; - if (deathmatch_supermode) + if (deathmatch_supermode()) if (other.invincible_time > 0) return; From bf3f6b3cbfcc9a3ce2a55142b86b9b8cc5bb0186 Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Thu, 19 Sep 2024 23:08:32 -0700 Subject: [PATCH 16/22] Fixed indentation in localization file; updated CHAN_NO_PHS_ADD comment --- qcsrc/defs.qc | 2 +- qcsrc/localized_text.qc | 540 ++++++++++++++++++++-------------------- 2 files changed, 271 insertions(+), 271 deletions(-) diff --git a/qcsrc/defs.qc b/qcsrc/defs.qc index 1d96f885f..0535b4723 100644 --- a/qcsrc/defs.qc +++ b/qcsrc/defs.qc @@ -406,7 +406,7 @@ float CHAN_WEAPON = 1; float CHAN_VOICE = 2; float CHAN_ITEM = 3; float CHAN_BODY = 4; -#ifdef __QW__ // NetQuake doesn't support CHAN_NO_PHS_ADD. Set it to 0 so it will have no effect. +#ifdef __QW__ // NetQuake doesn't support CHAN_NO_PHS_ADD. Set it to 0 so it will have no effect when combined with another channel. float CHAN_NO_PHS_ADD = 8; #else float CHAN_NO_PHS_ADD = 0; diff --git a/qcsrc/localized_text.qc b/qcsrc/localized_text.qc index 2fb9b93e0..25bfd1334 100644 --- a/qcsrc/localized_text.qc +++ b/qcsrc/localized_text.qc @@ -36,24 +36,24 @@ #ifdef __LIBREQUAKE__ -#define LOC_EPILOGUE_0 "\nAs the ethereal essence of your very\nbeing drifts through time and space,\nyou experience relentless calm and\nserene determination. You embrace the\nliminal, formless nature of your\nexistence within the amorphous expanse\nbetween realities.\n\nSuspended between the veils of life\nand death, among the realm of celestial\ndissolution, you wait to be called upon\nagain. To regain your corporeal form\nand step into the crucible of fate.\nTo finish your task and keep at bay the\nonslaught of cosmic horrors.\n" -#define LOC_EPILOGUE_1 "EPISODE 1 COMPLETION TEXT GOES HERE" -#define LOC_EPILOGUE_1_FREEWARE "EPISODE 1 COMPLETION TEXT GOES HERE" -#define LOC_EPILOGUE_2 "EPISODE 2 COMPLETION TEXT GOES HERE" -#define LOC_EPILOGUE_3 "EPISODE 3 COMPLETION TEXT GOES HERE" -#define LOC_EPILOGUE_4 "EPISODE 4 COMPLETION TEXT GOES HERE" -#define LOC_EPILOGUE_RUNES "ALL RUNES TEXT GOES HERE" -#define LOC_EPILOGUE_FINALE "GAME COMPLETION TEXT GOES HERE" +#define LOC_EPILOGUE_0 "\nAs the ethereal essence of your very\nbeing drifts through time and space,\nyou experience relentless calm and\nserene determination. You embrace the\nliminal, formless nature of your\nexistence within the amorphous expanse\nbetween realities.\n\nSuspended between the veils of life\nand death, among the realm of celestial\ndissolution, you wait to be called upon\nagain. To regain your corporeal form\nand step into the crucible of fate.\nTo finish your task and keep at bay the\nonslaught of cosmic horrors.\n" +#define LOC_EPILOGUE_1 "EPISODE 1 COMPLETION TEXT GOES HERE" +#define LOC_EPILOGUE_1_FREEWARE "EPISODE 1 COMPLETION TEXT GOES HERE" +#define LOC_EPILOGUE_2 "EPISODE 2 COMPLETION TEXT GOES HERE" +#define LOC_EPILOGUE_3 "EPISODE 3 COMPLETION TEXT GOES HERE" +#define LOC_EPILOGUE_4 "EPISODE 4 COMPLETION TEXT GOES HERE" +#define LOC_EPILOGUE_RUNES "ALL RUNES TEXT GOES HERE" +#define LOC_EPILOGUE_FINALE "GAME COMPLETION TEXT GOES HERE" #else -#define LOC_EPILOGUE_1 "As the corpse of the monstrous entity\nChthon sinks back into the lava whence\nit rose, you grip the Rune of Earth\nMagic tightly. Now that you have\nconquered the Dimension of the Doomed,\nrealm of Earth Magic, you are ready to\ncomplete your task. A Rune of magic\npower lies at the end of each haunted\nland of Quake. Go forth, seek the\ntotality of the four Runes!" -#define LOC_EPILOGUE_1_FREEWARE "As the corpse of the monstrous entity\nChthon sinks back into the lava whence\nit rose, you grip the Rune of Earth\nMagic tightly. Now that you have\nconquered the Dimension of the Doomed,\nrealm of Earth Magic, you are ready to\ncomplete your task in the other three\nhaunted lands of Quake. Or are you? If\nyou don't register Quake, you'll never\nknow what awaits you in the Realm of\nBlack Magic, the Netherworld, and the\nElder World!" -#define LOC_EPILOGUE_2 "The Rune of Black Magic throbs evilly in\nyour hand and whispers dark thoughts\ninto your brain. You learn the inmost\nlore of the Hell-Mother; Shub-Niggurath!\nYou now know that she is behind all the\nterrible plotting which has led to so\nmuch death and horror. But she is not\ninviolate! Armed with this Rune, you\nrealize that once all four Runes are\ncombined, the gate to Shub-Niggurath's\nPit will open, and you can face the\nWitch-Goddess herself in her frightful\notherworld cathedral." -#define LOC_EPILOGUE_3 "The charred viscera of diabolic horrors\nbubble viscously as you seize the Rune\nof Hell Magic. Its heat scorches your\nhand, and its terrible secrets blight\nyour mind. Gathering the shreds of your\ncourage, you shake the devil's shackles\nfrom your soul, and become ever more\nhard and determined to destroy the\nhideous creatures whose mere existence\nthreatens the souls and psyches of all\nthe population of Earth." -#define LOC_EPILOGUE_4 "Despite the awful might of the Elder\nWorld, you have achieved the Rune of\nElder Magic, capstone of all types of\narcane wisdom. Beyond good and evil,\nbeyond life and death, the Rune\npulsates, heavy with import. Patient and\npotent, the Elder Being Shub-Niggurath\nweaves her dire plans to clear off all\nlife from the Earth, and bring her own\nfoul offspring to our world! For all the\ndwellers in these nightmare dimensions\nare her descendants! Once all Runes of\nmagic power are united, the energy\nbehind them will blast open the Gateway\nto Shub-Niggurath, and you can travel\nthere to foil the Hell-Mother's plots\nin person." -#define LOC_EPILOGUE_RUNES "Now, you have all four Runes. You sense\ntremendous invisible forces moving to\nunseal ancient barriers. Shub-Niggurath\nhad hoped to use the Runes Herself to\nclear off the Earth, but now instead,\nyou will use them to enter her home and\nconfront her as an avatar of avenging\nEarth-life. If you defeat her, you will\nbe remembered forever as the savior of\nthe planet. If she conquers, it will be\nas if you had never been born." -#define LOC_EPILOGUE_FINALE "Congratulations and well done! You have\nbeaten the hideous Shub-Niggurath, and\nher hundreds of ugly changelings and\nmonsters. You have proven that your\nskill and your cunning are greater than\nall the powers of Quake. You are the\nmaster now. Id Software salutes you." +#define LOC_EPILOGUE_1 "As the corpse of the monstrous entity\nChthon sinks back into the lava whence\nit rose, you grip the Rune of Earth\nMagic tightly. Now that you have\nconquered the Dimension of the Doomed,\nrealm of Earth Magic, you are ready to\ncomplete your task. A Rune of magic\npower lies at the end of each haunted\nland of Quake. Go forth, seek the\ntotality of the four Runes!" +#define LOC_EPILOGUE_1_FREEWARE "As the corpse of the monstrous entity\nChthon sinks back into the lava whence\nit rose, you grip the Rune of Earth\nMagic tightly. Now that you have\nconquered the Dimension of the Doomed,\nrealm of Earth Magic, you are ready to\ncomplete your task in the other three\nhaunted lands of Quake. Or are you? If\nyou don't register Quake, you'll never\nknow what awaits you in the Realm of\nBlack Magic, the Netherworld, and the\nElder World!" +#define LOC_EPILOGUE_2 "The Rune of Black Magic throbs evilly in\nyour hand and whispers dark thoughts\ninto your brain. You learn the inmost\nlore of the Hell-Mother; Shub-Niggurath!\nYou now know that she is behind all the\nterrible plotting which has led to so\nmuch death and horror. But she is not\ninviolate! Armed with this Rune, you\nrealize that once all four Runes are\ncombined, the gate to Shub-Niggurath's\nPit will open, and you can face the\nWitch-Goddess herself in her frightful\notherworld cathedral." +#define LOC_EPILOGUE_3 "The charred viscera of diabolic horrors\nbubble viscously as you seize the Rune\nof Hell Magic. Its heat scorches your\nhand, and its terrible secrets blight\nyour mind. Gathering the shreds of your\ncourage, you shake the devil's shackles\nfrom your soul, and become ever more\nhard and determined to destroy the\nhideous creatures whose mere existence\nthreatens the souls and psyches of all\nthe population of Earth." +#define LOC_EPILOGUE_4 "Despite the awful might of the Elder\nWorld, you have achieved the Rune of\nElder Magic, capstone of all types of\narcane wisdom. Beyond good and evil,\nbeyond life and death, the Rune\npulsates, heavy with import. Patient and\npotent, the Elder Being Shub-Niggurath\nweaves her dire plans to clear off all\nlife from the Earth, and bring her own\nfoul offspring to our world! For all the\ndwellers in these nightmare dimensions\nare her descendants! Once all Runes of\nmagic power are united, the energy\nbehind them will blast open the Gateway\nto Shub-Niggurath, and you can travel\nthere to foil the Hell-Mother's plots\nin person." +#define LOC_EPILOGUE_RUNES "Now, you have all four Runes. You sense\ntremendous invisible forces moving to\nunseal ancient barriers. Shub-Niggurath\nhad hoped to use the Runes Herself to\nclear off the Earth, but now instead,\nyou will use them to enter her home and\nconfront her as an avatar of avenging\nEarth-life. If you defeat her, you will\nbe remembered forever as the savior of\nthe planet. If she conquers, it will be\nas if you had never been born." +#define LOC_EPILOGUE_FINALE "Congratulations and well done! You have\nbeaten the hideous Shub-Niggurath, and\nher hundreds of ugly changelings and\nmonsters. You have proven that your\nskill and your cunning are greater than\nall the powers of Quake. You are the\nmaster now. Id Software salutes you." #endif // __LIBREQUAKE__ @@ -87,13 +87,13 @@ #ifdef __LIBREQUAKE__ -#define LOC_WEAPON_INVALID "Invalid weapon" -#define LOC_WEAPON_NOAMMO "Out of ammo" +#define LOC_WEAPON_INVALID "Invalid weapon" +#define LOC_WEAPON_NOAMMO "Out of ammo" #else -#define LOC_WEAPON_INVALID "no weapon." -#define LOC_WEAPON_NOAMMO "not enough ammo." +#define LOC_WEAPON_INVALID "no weapon." +#define LOC_WEAPON_NOAMMO "not enough ammo." #endif // __LIBREQUAKE__ @@ -103,56 +103,56 @@ ==============================================================================*/ -#define LOC_ITEM_PICKUP_NORMAL "You got " -#define LOC_ITEM_PICKUP_HEALTH "You receieve " -#define LOC_ITEM_PICKUP_ADD_HEALTH " additional health" +#define LOC_ITEM_PICKUP_NORMAL "You got " +#define LOC_ITEM_PICKUP_HEALTH "You receieve " +#define LOC_ITEM_PICKUP_ADD_HEALTH " additional health" -#define LOC_ITEM_FROM_BACKPACK " from a backpack" // Unused.. +#define LOC_ITEM_FROM_BACKPACK " from a backpack" // Unused.. -#define LOC_ITEM_TYPE_HEALTH " health" -#define LOC_ITEM_TYPE_ARMOR " armor" +#define LOC_ITEM_TYPE_HEALTH " health" +#define LOC_ITEM_TYPE_ARMOR " armor" #ifdef __LIBREQUAKE__ -#define LOC_ITEM_NAME_QUADDMG "the Crusher Sigil" -#define LOC_ITEM_NAME_OCTDMG "the Demolisher Sigil" -#define LOC_ITEM_NAME_PENTPROT "Lucifier's Protection" -#define LOC_ITEM_NAME_SHADRING "the Eye of Enigma" -#define LOC_ITEM_NAME_BIOSUIT "the Diving Suit" -#define LOC_ITEM_NAME_BACKPACK "Backpack" +#define LOC_ITEM_NAME_QUADDMG "the Crusher Sigil" +#define LOC_ITEM_NAME_OCTDMG "the Demolisher Sigil" +#define LOC_ITEM_NAME_PENTPROT "Lucifier's Protection" +#define LOC_ITEM_NAME_SHADRING "the Eye of Enigma" +#define LOC_ITEM_NAME_BIOSUIT "the Diving Suit" +#define LOC_ITEM_NAME_BACKPACK "Backpack" -#define LOC_ITEM_FADE_QUADDMG "Your Crusher Sigil is fading..." -#define LOC_ITEM_FADE_OCTDMG "Your Demolisher Sigil is fading..." -#define LOC_ITEM_FADE_PENTPROT "Lucifier's Protection is fading..." -#define LOC_ITEM_FADE_SHADRING "The Eye of Enigma is fading..." -#define LOC_ITEM_FADE_BIOSUIT "Air in Diving Suit is running out..." +#define LOC_ITEM_FADE_QUADDMG "Your Crusher Sigil is fading..." +#define LOC_ITEM_FADE_OCTDMG "Your Demolisher Sigil is fading..." +#define LOC_ITEM_FADE_PENTPROT "Lucifier's Protection is fading..." +#define LOC_ITEM_FADE_SHADRING "The Eye of Enigma is fading..." +#define LOC_ITEM_FADE_BIOSUIT "Air in Diving Suit is running out..." -#define LOC_BONUS_POWERS " is coming for you all!!!" +#define LOC_BONUS_POWERS " is coming for you all!!!" -#define LOC_ITEM_LOST_A " lost " -#define LOC_ITEM_LOST_B " with " -#define LOC_ITEM_LOST_C " seconds left" +#define LOC_ITEM_LOST_A " lost " +#define LOC_ITEM_LOST_B " with " +#define LOC_ITEM_LOST_C " seconds left" #else -#define LOC_ITEM_NAME_QUADDMG "Quad Damage" -#define LOC_ITEM_NAME_OCTDMG "OctaPower" -#define LOC_ITEM_NAME_PENTPROT "Pentagram of Protection" -#define LOC_ITEM_NAME_SHADRING "Ring of Shadows" -#define LOC_ITEM_NAME_BIOSUIT "Biosuit" -#define LOC_ITEM_NAME_BACKPACK "Backpack" +#define LOC_ITEM_NAME_QUADDMG "Quad Damage" +#define LOC_ITEM_NAME_OCTDMG "OctaPower" +#define LOC_ITEM_NAME_PENTPROT "Pentagram of Protection" +#define LOC_ITEM_NAME_SHADRING "Ring of Shadows" +#define LOC_ITEM_NAME_BIOSUIT "Biosuit" +#define LOC_ITEM_NAME_BACKPACK "Backpack" -#define LOC_ITEM_FADE_QUADDMG "Quad Damage is wearing off" -#define LOC_ITEM_FADE_OCTDMG "OctaPower is wearing off" -#define LOC_ITEM_FADE_PENTPROT "Protection is almost burned out" -#define LOC_ITEM_FADE_SHADRING "Ring of Shadows magic is fading" -#define LOC_ITEM_FADE_BIOSUIT "Air supply in Biosuit expiring" +#define LOC_ITEM_FADE_QUADDMG "Quad Damage is wearing off" +#define LOC_ITEM_FADE_OCTDMG "OctaPower is wearing off" +#define LOC_ITEM_FADE_PENTPROT "Protection is almost burned out" +#define LOC_ITEM_FADE_SHADRING "Ring of Shadows magic is fading" +#define LOC_ITEM_FADE_BIOSUIT "Air supply in Biosuit expiring" -#define LOC_BONUS_POWERS " attains bonus powers!!!" +#define LOC_BONUS_POWERS " attains bonus powers!!!" -#define LOC_ITEM_LOST_A " lost a " -#define LOC_ITEM_LOST_B " with " -#define LOC_ITEM_LOST_C " seconds remaining" +#define LOC_ITEM_LOST_A " lost a " +#define LOC_ITEM_LOST_B " with " +#define LOC_ITEM_LOST_C " seconds remaining" #endif // __LIBREQUAKE__ @@ -164,32 +164,32 @@ #ifdef __LIBREQUAKE__ -#define LOC_WEAPON_NAME_AXE "Axe" // Unused.. -#define LOC_WEAPON_NAME_SHOTGUN "Shotgun" // Unused.. +#define LOC_WEAPON_NAME_AXE "Axe" // Unused.. +#define LOC_WEAPON_NAME_SHOTGUN "Shotgun" // Unused.. #define LOC_WEAPON_NAME_SUPER_SHOTGUN "Double-Barreled Shotgun" -#define LOC_WEAPON_NAME_NAILGUN "Nailgun" +#define LOC_WEAPON_NAME_NAILGUN "Nailgun" #define LOC_WEAPON_NAME_SUPER_NAILGUN "Super Nailgun" #define LOC_WEAPON_NAME_GRENADE_LAUNCH "Grenade Launcher" #define LOC_WEAPON_NAME_ROCKET_LAUNCH "Rocket Launcher" -#define LOC_WEAPON_NAME_THUNDERBOLT "Lightning Gun" +#define LOC_WEAPON_NAME_THUNDERBOLT "Lightning Gun" #else -#define LOC_WEAPON_NAME_AXE "Axe" // Unused.. -#define LOC_WEAPON_NAME_SHOTGUN "Shotgun" // Unused.. +#define LOC_WEAPON_NAME_AXE "Axe" // Unused.. +#define LOC_WEAPON_NAME_SHOTGUN "Shotgun" // Unused.. #define LOC_WEAPON_NAME_SUPER_SHOTGUN "Double-barrelled Shotgun" -#define LOC_WEAPON_NAME_NAILGUN "nailgun" +#define LOC_WEAPON_NAME_NAILGUN "nailgun" #define LOC_WEAPON_NAME_SUPER_NAILGUN "Super Nailgun" #define LOC_WEAPON_NAME_GRENADE_LAUNCH "Grenade Launcher" #define LOC_WEAPON_NAME_ROCKET_LAUNCH "Rocket Launcher" -#define LOC_WEAPON_NAME_THUNDERBOLT "Thunderbolt" +#define LOC_WEAPON_NAME_THUNDERBOLT "Thunderbolt" #endif // __LIBREQUAKE__ -#define LOC_WEAPON_AMMO_SHELLS "shells" -#define LOC_WEAPON_AMMO_NAILS "nails" -#define LOC_WEAPON_AMMO_ROCKETS "rockets" -#define LOC_WEAPON_AMMO_CELLS "cells" +#define LOC_WEAPON_AMMO_SHELLS "shells" +#define LOC_WEAPON_AMMO_NAILS "nails" +#define LOC_WEAPON_AMMO_ROCKETS "rockets" +#define LOC_WEAPON_AMMO_CELLS "cells" /*============================================================================== @@ -199,23 +199,23 @@ #ifdef __LIBREQUAKE__ -#define LOC_KEY_NAME_SILVER "Silver Key" -#define LOC_KEY_NAME_SILVER_RUNE "Silver Key" -#define LOC_KEY_NAME_SILVER_CARD "Silver Keycard" -#define LOC_KEY_NAME_GOLD "Gold Key" -#define LOC_KEY_NAME_GOLD_RUNE "Gold Key" -#define LOC_KEY_NAME_GOLD_CARD "Gold Keycard" -#define LOC_KEY_NEED "You need " +#define LOC_KEY_NAME_SILVER "Silver Key" +#define LOC_KEY_NAME_SILVER_RUNE "Silver Key" +#define LOC_KEY_NAME_SILVER_CARD "Silver Keycard" +#define LOC_KEY_NAME_GOLD "Gold Key" +#define LOC_KEY_NAME_GOLD_RUNE "Gold Key" +#define LOC_KEY_NAME_GOLD_CARD "Gold Keycard" +#define LOC_KEY_NEED "You need " #else -#define LOC_KEY_NAME_SILVER "silver key" -#define LOC_KEY_NAME_SILVER_RUNE "silver runekey" -#define LOC_KEY_NAME_SILVER_CARD "silver keycard" -#define LOC_KEY_NAME_GOLD "gold key" -#define LOC_KEY_NAME_GOLD_RUNE "gold runekey" -#define LOC_KEY_NAME_GOLD_CARD "gold keycard" -#define LOC_KEY_NEED "You need " +#define LOC_KEY_NAME_SILVER "silver key" +#define LOC_KEY_NAME_SILVER_RUNE "silver runekey" +#define LOC_KEY_NAME_SILVER_CARD "silver keycard" +#define LOC_KEY_NAME_GOLD "gold key" +#define LOC_KEY_NAME_GOLD_RUNE "gold runekey" +#define LOC_KEY_NAME_GOLD_CARD "gold keycard" +#define LOC_KEY_NEED "You need " #endif // __LIBREQUAKE__ @@ -225,18 +225,18 @@ ==============================================================================*/ -#define LOC_COUNTER_COUNT_1A "Only " -#define LOC_COUNTER_COUNT_1B " more to go..." -#define LOC_COUNTER_COUNT_2 "There are more to go..." -#define LOC_COUNTER_COMPLETE "Sequence completed!" +#define LOC_COUNTER_COUNT_1A "Only " +#define LOC_COUNTER_COUNT_1B " more to go..." +#define LOC_COUNTER_COUNT_2 "There are more to go..." +#define LOC_COUNTER_COMPLETE "Sequence completed!" #ifdef __LIBREQUAKE__ -#define LOC_SECRET "You found a secret!" +#define LOC_SECRET "You found a secret!" #else -#define LOC_SECRET "You found a secret area!" +#define LOC_SECRET "You found a secret area!" #endif // __LIBREQUAKE__ @@ -246,15 +246,15 @@ ==============================================================================*/ -#define LOC_RUNE_GET "You got the rune!" +#define LOC_RUNE_GET "You got the rune!" #ifdef __LIBREQUAKE__ -#define LOC_RUNE_LQ_YOU "You" -#define LOC_RUNE_LQ_BLOOD " got the Rune of Blood!" -#define LOC_RUNE_LQ_BONE " got the Rune of Bone!" -#define LOC_RUNE_LQ_MIND " got the Rune of Mind!" -#define LOC_RUNE_LQ_SOUL " got the Rune of Soul!" +#define LOC_RUNE_LQ_YOU "You" +#define LOC_RUNE_LQ_BLOOD " got the Rune of Blood!" +#define LOC_RUNE_LQ_BONE " got the Rune of Bone!" +#define LOC_RUNE_LQ_MIND " got the Rune of Mind!" +#define LOC_RUNE_LQ_SOUL " got the Rune of Soul!" #endif // __LIBREQUAKE__ @@ -266,39 +266,39 @@ #ifdef __LIBREQUAKE__ -#define LOC_DEATH_ARMY " was shot by a Chosen" -#define LOC_DEATH_ENFORCER " was mowed down by a Cyberhunter" -#define LOC_DEATH_DOG " was gored by a Gore Hound" -#define LOC_DEATH_OGRE " was demolished by a Deep One" -#define LOC_DEATH_DEMON1 " was disemboweled by a Moon Rat" -#define LOC_DEATH_WIZARD " was shot by a Messenger" -#define LOC_DEATH_ZOMBIE " was pelted by a Deathless Cultist" -#define LOC_DEATH_KNIGHT " was stabbed by a Carcosan Knight" -#define LOC_DEATH_HELL_KNIGHT " was gutted by a Biohell Warrior" -#define LOC_DEATH_FISH " was nibbled by a Spine Eel" -#define LOC_DEATH_SHAMBLER " was shredded by a Hollow" -#define LOC_DEATH_SHALRATH " was blasted by a Servant of Nyarlathotep" -#define LOC_DEATH_TARBABY " was swarmed by a Bog Face" -#define LOC_DEATH_BOSS " was obliterated by Cthulhi" -#define LOC_DEATH_OLDONE " became one with Shoggoth" +#define LOC_DEATH_ARMY " was shot by a Chosen" +#define LOC_DEATH_ENFORCER " was mowed down by a Cyberhunter" +#define LOC_DEATH_DOG " was gored by a Gore Hound" +#define LOC_DEATH_OGRE " was demolished by a Deep One" +#define LOC_DEATH_DEMON1 " was disemboweled by a Moon Rat" +#define LOC_DEATH_WIZARD " was shot by a Messenger" +#define LOC_DEATH_ZOMBIE " was pelted by a Deathless Cultist" +#define LOC_DEATH_KNIGHT " was stabbed by a Carcosan Knight" +#define LOC_DEATH_HELL_KNIGHT " was gutted by a Biohell Warrior" +#define LOC_DEATH_FISH " was nibbled by a Spine Eel" +#define LOC_DEATH_SHAMBLER " was shredded by a Hollow" +#define LOC_DEATH_SHALRATH " was blasted by a Servant of Nyarlathotep" +#define LOC_DEATH_TARBABY " was swarmed by a Bog Face" +#define LOC_DEATH_BOSS " was obliterated by Cthulhi" +#define LOC_DEATH_OLDONE " became one with Shoggoth" #else -#define LOC_DEATH_ARMY " was shot by a Grunt" -#define LOC_DEATH_ENFORCER " was blasted by an Enforcer" -#define LOC_DEATH_DOG " was mauled by a Rottweiler" -#define LOC_DEATH_OGRE " was destroyed by an Ogre" -#define LOC_DEATH_DEMON1 " was eviscerated by a Fiend" -#define LOC_DEATH_WIZARD " was scragged by a Scrag" -#define LOC_DEATH_ZOMBIE " joins the Zombies" -#define LOC_DEATH_KNIGHT " was slashed by a Knight" -#define LOC_DEATH_HELL_KNIGHT " was slain by a Death Knight" -#define LOC_DEATH_FISH " was fed to the Rotfish" -#define LOC_DEATH_SHAMBLER " was smashed by a Shambler" -#define LOC_DEATH_SHALRATH " was exploded by a Vore" -#define LOC_DEATH_TARBABY " was slimed by a Spawn" -#define LOC_DEATH_BOSS " was blasted by Cthulhi" -#define LOC_DEATH_OLDONE " became one with Shub-Niggurath" +#define LOC_DEATH_ARMY " was shot by a Grunt" +#define LOC_DEATH_ENFORCER " was blasted by an Enforcer" +#define LOC_DEATH_DOG " was mauled by a Rottweiler" +#define LOC_DEATH_OGRE " was destroyed by an Ogre" +#define LOC_DEATH_DEMON1 " was eviscerated by a Fiend" +#define LOC_DEATH_WIZARD " was scragged by a Scrag" +#define LOC_DEATH_ZOMBIE " joins the Zombies" +#define LOC_DEATH_KNIGHT " was slashed by a Knight" +#define LOC_DEATH_HELL_KNIGHT " was slain by a Death Knight" +#define LOC_DEATH_FISH " was fed to the Rotfish" +#define LOC_DEATH_SHAMBLER " was smashed by a Shambler" +#define LOC_DEATH_SHALRATH " was exploded by a Vore" +#define LOC_DEATH_TARBABY " was slimed by a Spawn" +#define LOC_DEATH_BOSS " was blasted by Cthulhi" +#define LOC_DEATH_OLDONE " became one with Shub-Niggurath" #endif // __LIBREQUAKE__ @@ -310,62 +310,62 @@ #ifdef __LIBREQUAKE__ -#define LOC_DEATH_EXPLO_BOX " was sent sky high" -#define LOC_DEATH_SQUISH " was crushed" -#define LOC_DEATH_SQUISH2 " was crushed by " -#define LOC_DEATH_TRAP_SPIKE " was perforated" -#define LOC_DEATH_TRAP_LASER " was lasered" -#define LOC_DEATH_FIREBALL " was hit by a lavaball" -#define LOC_DEATH_LEAVE " tried to escape" -#define LOC_DEATH_DROWN1 " forgot how to swim" -#define LOC_DEATH_DROWN2 " ran out of air" -#define LOC_DEATH_SLIME1 " dissolved in acid" -#define LOC_DEATH_SLIME2 " was disincorporated" -#define LOC_DEATH_LAVA1 " fell into lava" -#define LOC_DEATH_LAVA2 " combusted" -#define LOC_DEATH_LAVA3 " dove headfirst into hot lava" -#define LOC_DEATH_FALL1 " fell off a cliff" -#define LOC_DEATH_FALL2 " took a long walk off a short pier" -#define LOC_DEATH_SPACE1 " fell into space" -#define LOC_DEATH_SPACE2 "'s screams went unheard" -#define LOC_DEATH_VOID1 " fell into the void" -#define LOC_DEATH_VOID2 " fell out of existence" -#define LOC_DEATH_DISCHARGE_WATER " took a toaster bath" -#define LOC_DEATH_DISCHARGE_SLIME " took a toaster bath" -#define LOC_DEATH_DISCHARGE_LAVA " took a toaster bath" -#define LOC_DEATH_DISCHARGE_SELF "'s Lightning Gun Malfunctioned" -#define LOC_DEATH_SELF_GRENADE " didn't launch the grenade far enough" -#define LOC_DEATH_SELF_ROCKET " played with explosives" -#define LOC_DEATH_SELF_OTHER " misfired" -#define LOC_DEATH_SUICIDE " committed suicide" -#define LOC_DEATH_OTHER " died" +#define LOC_DEATH_EXPLO_BOX " was sent sky high" +#define LOC_DEATH_SQUISH " was crushed" +#define LOC_DEATH_SQUISH2 " was crushed by " +#define LOC_DEATH_TRAP_SPIKE " was perforated" +#define LOC_DEATH_TRAP_LASER " was lasered" +#define LOC_DEATH_FIREBALL " was hit by a lavaball" +#define LOC_DEATH_LEAVE " tried to escape" +#define LOC_DEATH_DROWN1 " forgot how to swim" +#define LOC_DEATH_DROWN2 " ran out of air" +#define LOC_DEATH_SLIME1 " dissolved in acid" +#define LOC_DEATH_SLIME2 " was disincorporated" +#define LOC_DEATH_LAVA1 " fell into lava" +#define LOC_DEATH_LAVA2 " combusted" +#define LOC_DEATH_LAVA3 " dove headfirst into hot lava" +#define LOC_DEATH_FALL1 " fell off a cliff" +#define LOC_DEATH_FALL2 " took a long walk off a short pier" +#define LOC_DEATH_SPACE1 " fell into space" +#define LOC_DEATH_SPACE2 "'s screams went unheard" +#define LOC_DEATH_VOID1 " fell into the void" +#define LOC_DEATH_VOID2 " fell out of existence" +#define LOC_DEATH_DISCHARGE_WATER " took a toaster bath" +#define LOC_DEATH_DISCHARGE_SLIME " took a toaster bath" +#define LOC_DEATH_DISCHARGE_LAVA " took a toaster bath" +#define LOC_DEATH_DISCHARGE_SELF "'s Lightning Gun Malfunctioned" +#define LOC_DEATH_SELF_GRENADE " didn't launch the grenade far enough" +#define LOC_DEATH_SELF_ROCKET " played with explosives" +#define LOC_DEATH_SELF_OTHER " misfired" +#define LOC_DEATH_SUICIDE " committed suicide" +#define LOC_DEATH_OTHER " died" #else -#define LOC_DEATH_EXPLO_BOX " blew up" -#define LOC_DEATH_SQUISH " was squished" -#define LOC_DEATH_SQUISH2 " was squished by " -#define LOC_DEATH_TRAP_SPIKE " was spiked" -#define LOC_DEATH_TRAP_LASER " was spiked" -#define LOC_DEATH_FIREBALL " ate a lavaball" -#define LOC_DEATH_LEAVE " tried to leave" -#define LOC_DEATH_DROWN1 " sleeps with the fishes" -#define LOC_DEATH_DROWN2 " sucks it down" -#define LOC_DEATH_SLIME1 " gulped a load of slime" -#define LOC_DEATH_SLIME2 " can't exist on slime alone" -#define LOC_DEATH_LAVA1 " turned into hot slag" -#define LOC_DEATH_LAVA2 " visits the Volcano God" -#define LOC_DEATH_LAVA3 " burst into flames" -#define LOC_DEATH_FALL " fell to his death" -#define LOC_DEATH_DISCHARGE_WATER " discharges into the water" -#define LOC_DEATH_DISCHARGE_SLIME " discharges into the slime" -#define LOC_DEATH_DISCHARGE_LAVA " discharges into the lava" -#define LOC_DEATH_DISCHARGE_SELF " electrocutes himself" -#define LOC_DEATH_SELF_GRENADE " tries to put the pin back in" -#define LOC_DEATH_SELF_ROCKET " becomes bored with life" +#define LOC_DEATH_EXPLO_BOX " blew up" +#define LOC_DEATH_SQUISH " was squished" +#define LOC_DEATH_SQUISH2 " was squished by " +#define LOC_DEATH_TRAP_SPIKE " was spiked" +#define LOC_DEATH_TRAP_LASER " was spiked" +#define LOC_DEATH_FIREBALL " ate a lavaball" +#define LOC_DEATH_LEAVE " tried to leave" +#define LOC_DEATH_DROWN1 " sleeps with the fishes" +#define LOC_DEATH_DROWN2 " sucks it down" +#define LOC_DEATH_SLIME1 " gulped a load of slime" +#define LOC_DEATH_SLIME2 " can't exist on slime alone" +#define LOC_DEATH_LAVA1 " turned into hot slag" +#define LOC_DEATH_LAVA2 " visits the Volcano God" +#define LOC_DEATH_LAVA3 " burst into flames" +#define LOC_DEATH_FALL " fell to his death" +#define LOC_DEATH_DISCHARGE_WATER " discharges into the water" +#define LOC_DEATH_DISCHARGE_SLIME " discharges into the slime" +#define LOC_DEATH_DISCHARGE_LAVA " discharges into the lava" +#define LOC_DEATH_DISCHARGE_SELF " electrocutes himself" +#define LOC_DEATH_SELF_GRENADE " tries to put the pin back in" +#define LOC_DEATH_SELF_ROCKET " becomes bored with life" #define LOC_DEATH_SELF_OTHER " checks if his weapon is loaded" -#define LOC_DEATH_SUICIDE " suicides" -#define LOC_DEATH_OTHER " died" +#define LOC_DEATH_SUICIDE " suicides" +#define LOC_DEATH_OTHER " died" #endif // __LIBREQUAKE__ @@ -385,40 +385,40 @@ #ifdef __LIBREQUAKE__ -#define LOC_DEATH_AXE_1A " was hacked to death by " -#define LOC_DEATH_AXE_1B "" -#define LOC_DEATH_AXE_2A " was chopped to bits by " -#define LOC_DEATH_AXE_2B "" -#define LOC_DEATH_AXE_QA "'s bucket was kicked by " -#define LOC_DEATH_AXE_QB "" - -#define LOC_DEATH_SHOTGUN_1A " sucked on " -#define LOC_DEATH_SHOTGUN_1B "'s muffler" -#define LOC_DEATH_SHOTGUN_2A " nibbled on " -#define LOC_DEATH_SHOTGUN_2B "'s muffler" -#define LOC_DEATH_SHOTGUN_QA " was put six feet under by " -#define LOC_DEATH_SHOTGUN_QB "" - -#define LOC_DEATH_SUPER_SHOTGUN_1A " was blasted by " -#define LOC_DEATH_SUPER_SHOTGUN_1B "" -#define LOC_DEATH_SUPER_SHOTGUN_2A " was shredded by " -#define LOC_DEATH_SUPER_SHOTGUN_2B "" -#define LOC_DEATH_SUPER_SHOTGUN_QA " was sent home in a box by " -#define LOC_DEATH_SUPER_SHOTGUN_QB "" - -#define LOC_DEATH_NAILGUN_1A " was pierced by " -#define LOC_DEATH_NAILGUN_1B "" -#define LOC_DEATH_NAILGUN_2A " was filled with holes by " -#define LOC_DEATH_NAILGUN_2B "" -#define LOC_DEATH_NAILGUN_QA "'s mortal coil was shuffled off by " -#define LOC_DEATH_NAILGUN_QB "" - -#define LOC_DEATH_SUPER_NAILGUN_1A " was perforated by " -#define LOC_DEATH_SUPER_NAILGUN_1B "" -#define LOC_DEATH_SUPER_NAILGUN_2A " was given speed holes by " -#define LOC_DEATH_SUPER_NAILGUN_2B "" -#define LOC_DEATH_SUPER_NAILGUN_QA "'s chips were cashed by " -#define LOC_DEATH_SUPER_NAILGUN_QB "" +#define LOC_DEATH_AXE_1A " was hacked to death by " +#define LOC_DEATH_AXE_1B "" +#define LOC_DEATH_AXE_2A " was chopped to bits by " +#define LOC_DEATH_AXE_2B "" +#define LOC_DEATH_AXE_QA "'s bucket was kicked by " +#define LOC_DEATH_AXE_QB "" + +#define LOC_DEATH_SHOTGUN_1A " sucked on " +#define LOC_DEATH_SHOTGUN_1B "'s muffler" +#define LOC_DEATH_SHOTGUN_2A " nibbled on " +#define LOC_DEATH_SHOTGUN_2B "'s muffler" +#define LOC_DEATH_SHOTGUN_QA " was put six feet under by " +#define LOC_DEATH_SHOTGUN_QB "" + +#define LOC_DEATH_SUPER_SHOTGUN_1A " was blasted by " +#define LOC_DEATH_SUPER_SHOTGUN_1B "" +#define LOC_DEATH_SUPER_SHOTGUN_2A " was shredded by " +#define LOC_DEATH_SUPER_SHOTGUN_2B "" +#define LOC_DEATH_SUPER_SHOTGUN_QA " was sent home in a box by " +#define LOC_DEATH_SUPER_SHOTGUN_QB "" + +#define LOC_DEATH_NAILGUN_1A " was pierced by " +#define LOC_DEATH_NAILGUN_1B "" +#define LOC_DEATH_NAILGUN_2A " was filled with holes by " +#define LOC_DEATH_NAILGUN_2B "" +#define LOC_DEATH_NAILGUN_QA "'s mortal coil was shuffled off by " +#define LOC_DEATH_NAILGUN_QB "" + +#define LOC_DEATH_SUPER_NAILGUN_1A " was perforated by " +#define LOC_DEATH_SUPER_NAILGUN_1B "" +#define LOC_DEATH_SUPER_NAILGUN_2A " was given speed holes by " +#define LOC_DEATH_SUPER_NAILGUN_2B "" +#define LOC_DEATH_SUPER_NAILGUN_QA "'s chips were cashed by " +#define LOC_DEATH_SUPER_NAILGUN_QB "" #define LOC_DEATH_GRENADE_LAUNCHER_1A " tripped over " #define LOC_DEATH_GRENADE_LAUNCHER_1B "'s grenade" @@ -438,78 +438,78 @@ #define LOC_DEATH_ROCKET_LAUNCHER_Q1A " rode " #define LOC_DEATH_ROCKET_LAUNCHER_Q1B "'s pale horse" -#define LOC_DEATH_LIGHTNING_1A " was electrocuted by " -#define LOC_DEATH_LIGHTNING_1B "" -#define LOC_DEATH_LIGHTNING_2A " was given shock treatment by " -#define LOC_DEATH_LIGHTNING_2B "" -#define LOC_DEATH_LIGHTNING_QA " was sent beyond the veil by " -#define LOC_DEATH_LIGHTNING_QB "" -#define LOC_DEATH_LIGHTNING_DA " was given a toaster bath by " -#define LOC_DEATH_LIGHTNING_DB "" +#define LOC_DEATH_LIGHTNING_1A " was electrocuted by " +#define LOC_DEATH_LIGHTNING_1B "" +#define LOC_DEATH_LIGHTNING_2A " was given shock treatment by " +#define LOC_DEATH_LIGHTNING_2B "" +#define LOC_DEATH_LIGHTNING_QA " was sent beyond the veil by " +#define LOC_DEATH_LIGHTNING_QB "" +#define LOC_DEATH_LIGHTNING_DA " was given a toaster bath by " +#define LOC_DEATH_LIGHTNING_DB "" -#define LOC_DEATH_TELEFRAG " was telefragged by " +#define LOC_DEATH_TELEFRAG " was telefragged by " -#define LOC_DEATH_DEFLECT_A "Lucifer's Protection deflected " -#define LOC_DEATH_DEFLECT_B "'s telefrag on " +#define LOC_DEATH_DEFLECT_A "Lucifer's Protection deflected " +#define LOC_DEATH_DEFLECT_B "'s telefrag on " -#define LOC_TEAMKILL_1 " killed a teammate" -#define LOC_TEAMKILL_2 " friendly-fired" -#define LOC_TEAMKILL_3 " needs an eye exam" -#define LOC_TEAMKILL_4 " betrayed their friend" -#define LOC_TEAMKILL_SQUISH " crushed a teammate" +#define LOC_TEAMKILL_1 " killed a teammate" +#define LOC_TEAMKILL_2 " friendly-fired" +#define LOC_TEAMKILL_3 " needs an eye exam" +#define LOC_TEAMKILL_4 " betrayed their friend" +#define LOC_TEAMKILL_SQUISH " crushed a teammate" #define LOC_DEATH_KILL " killed " #else -#define LOC_DEATH_AXE_1A " was ax-murdered by " -#define LOC_DEATH_AXE_1B "" +#define LOC_DEATH_AXE_1A " was ax-murdered by " +#define LOC_DEATH_AXE_1B "" -#define LOC_DEATH_SHOTGUN_1A " chewed on " -#define LOC_DEATH_SHOTGUN_1B "'s boomstick" +#define LOC_DEATH_SHOTGUN_1A " chewed on " +#define LOC_DEATH_SHOTGUN_1B "'s boomstick" -#define LOC_DEATH_SUPER_SHOTGUN_1A " ate 2 loads of " -#define LOC_DEATH_SUPER_SHOTGUN_1B "'s buckshot" -#define LOC_DEATH_SUPER_SHOTGUN_QA " ate 8 loads of " -#define LOC_DEATH_SUPER_SHOTGUN_QB "'s buckshot" +#define LOC_DEATH_SUPER_SHOTGUN_1A " ate 2 loads of " +#define LOC_DEATH_SUPER_SHOTGUN_1B "'s buckshot" +#define LOC_DEATH_SUPER_SHOTGUN_QA " ate 8 loads of " +#define LOC_DEATH_SUPER_SHOTGUN_QB "'s buckshot" -#define LOC_DEATH_NAILGUN_1A " was nailed by " -#define LOC_DEATH_NAILGUN_1B "" +#define LOC_DEATH_NAILGUN_1A " was nailed by " +#define LOC_DEATH_NAILGUN_1B "" -#define LOC_DEATH_SUPER_NAILGUN_1A " was punctured by " -#define LOC_DEATH_SUPER_NAILGUN_1B "" +#define LOC_DEATH_SUPER_NAILGUN_1A " was punctured by " +#define LOC_DEATH_SUPER_NAILGUN_1B "" #define LOC_DEATH_GRENADE_LAUNCHER_1A " eats " #define LOC_DEATH_GRENADE_LAUNCHER_1B "'s pineapple" #define LOC_DEATH_GRENADE_LAUNCHER_GA " was gibbed by " #define LOC_DEATH_GRENADE_LAUNCHER_GB "'s grenade" -#define LOC_DEATH_ROCKET_LAUNCHER_1A " rides " -#define LOC_DEATH_ROCKET_LAUNCHER_1B "'s rocket" -#define LOC_DEATH_ROCKET_LAUNCHER_GA " was gibbed by " -#define LOC_DEATH_ROCKET_LAUNCHER_GB "'s rocket" -#define LOC_DEATH_ROCKET_LAUNCHER_Q1A " was brutalized by " -#define LOC_DEATH_ROCKET_LAUNCHER_Q1B "'s quad rocket" -#define LOC_DEATH_ROCKET_LAUNCHER_Q2A " was smeared by " -#define LOC_DEATH_ROCKET_LAUNCHER_Q2B "'s quad rocket" -#define LOC_DEATH_ROCKET_LAUNCHER_Q3A " rips " -#define LOC_DEATH_ROCKET_LAUNCHER_Q3B " a new one" - -#define LOC_DEATH_LIGHTNING_1A " accepts " -#define LOC_DEATH_LIGHTNING_1B "'s shaft" -#define LOC_DEATH_LIGHTNING_DA " accepts " -#define LOC_DEATH_LIGHTNING_DB "'s discharge" - -#define LOC_DEATH_TELEFRAG " was telefragged by " - -#define LOC_DEATH_DEFLECT_A "Satan's power deflects " -#define LOC_DEATH_DEFLECT_B "'s telefrag on " - -#define LOC_TEAMKILL_1 " mows down a teammate" -#define LOC_TEAMKILL_2 " checks his glasses" -#define LOC_TEAMKILL_3 " gets a frag for the other team" -#define LOC_TEAMKILL_4 " loses another friend" -#define LOC_TEAMKILL_SQUISH " squished a teammate" +#define LOC_DEATH_ROCKET_LAUNCHER_1A " rides " +#define LOC_DEATH_ROCKET_LAUNCHER_1B "'s rocket" +#define LOC_DEATH_ROCKET_LAUNCHER_GA " was gibbed by " +#define LOC_DEATH_ROCKET_LAUNCHER_GB "'s rocket" +#define LOC_DEATH_ROCKET_LAUNCHER_Q1A " was brutalized by " +#define LOC_DEATH_ROCKET_LAUNCHER_Q1B "'s quad rocket" +#define LOC_DEATH_ROCKET_LAUNCHER_Q2A " was smeared by " +#define LOC_DEATH_ROCKET_LAUNCHER_Q2B "'s quad rocket" +#define LOC_DEATH_ROCKET_LAUNCHER_Q3A " rips " +#define LOC_DEATH_ROCKET_LAUNCHER_Q3B " a new one" + +#define LOC_DEATH_LIGHTNING_1A " accepts " +#define LOC_DEATH_LIGHTNING_1B "'s shaft" +#define LOC_DEATH_LIGHTNING_DA " accepts " +#define LOC_DEATH_LIGHTNING_DB "'s discharge" + +#define LOC_DEATH_TELEFRAG " was telefragged by " + +#define LOC_DEATH_DEFLECT_A "Satan's power deflects " +#define LOC_DEATH_DEFLECT_B "'s telefrag on " + +#define LOC_TEAMKILL_1 " mows down a teammate" +#define LOC_TEAMKILL_2 " checks his glasses" +#define LOC_TEAMKILL_3 " gets a frag for the other team" +#define LOC_TEAMKILL_4 " loses another friend" +#define LOC_TEAMKILL_SQUISH " squished a teammate" #define LOC_DEATH_KILL " killed " @@ -523,7 +523,7 @@ ==============================================================================*/ -#define LOC_LQ_ISDEVELOPER "You must be a developer!" +#define LOC_LQ_ISDEVELOPER "You must be a developer!" /*============================================================================== @@ -531,11 +531,11 @@ ==============================================================================*/ -#define LOC_LQ_CAMERAS_MAX "You have too many cameras!" -#define LOC_LQ_CAMERA_SPAWN_A "Camera placed successfully, " -#define LOC_LQ_CAMERA_SPAWN_B " remaining" -#define LOC_LQ_CAMERA_TIME_A "Time between cameras changed to " -#define LOC_LQ_CAMERA_TIME_B " seconds" -#define LOC_LQ_CAMERA_NONE "Oh noes! No camera found! :(" +#define LOC_LQ_CAMERAS_MAX "You have too many cameras!" +#define LOC_LQ_CAMERA_SPAWN_A "Camera placed successfully, " +#define LOC_LQ_CAMERA_SPAWN_B " remaining" +#define LOC_LQ_CAMERA_TIME_A "Time between cameras changed to " +#define LOC_LQ_CAMERA_TIME_B " seconds" +#define LOC_LQ_CAMERA_NONE "Oh noes! No camera found! :(" #endif // __LIBREQUAKE__ \ No newline at end of file From 838f546fd970dcdf134c81dece3b2a33ef15789d Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Thu, 19 Sep 2024 23:42:37 -0700 Subject: [PATCH 17/22] Changed some deathmatch mode definitions to preprocessor macros --- qcsrc/deathmatch_settings.qc | 36 ++++++++++++------------------------ qcsrc/server.qc | 7 +------ qcsrc/spectate.qc | 9 +-------- 3 files changed, 14 insertions(+), 38 deletions(-) diff --git a/qcsrc/deathmatch_settings.qc b/qcsrc/deathmatch_settings.qc index 77ec72908..ab7fd2e37 100644 --- a/qcsrc/deathmatch_settings.qc +++ b/qcsrc/deathmatch_settings.qc @@ -4,41 +4,29 @@ // // Weapons stay when picked up -float() deathmatch_weapon_stay = -{ - return deathmatch >= 2; -}; +#define deathmatch_weapon_stay() \ + (deathmatch >= 2) // Items respawn after a timer -float() deathmatch_item_respawn = -{ - return deathmatch && (deathmatch != 2); -}; +#define deathmatch_item_respawn() \ + (deathmatch && (deathmatch != 2)) // Ammo pickups take twice as long to respawn -float() deathmatch_slow_ammo = -{ - return deathmatch == 1; -}; +#define deathmatch_slow_ammo() \ + (deathmatch == 1) // When picking up a backpack that contains a Rocket or Grenade Launcher, set the // player's rocket count to 5 if they have less than 5 -float() deathmatch_backpack_min_rockets -{ - return deathmatch >= 3; -}; +#define deathmatch_backpack_min_rockets() \ + (deathmatch >= 3) // All of the special rules that apply in deathmatch 4 -float() deathmatch_supermode = -{ - return deathmatch == 4; -}; +#define deathmatch_supermode() \ + (deathmatch == 4) // All of the special rules that apply in deathmatch 5 -float() deathmatch_supermode2 = -{ - return deathmatch == 5; -}; +#define deathmatch_supermode2() \ + (deathmatch == 5) // Increases the axe's damage from 20 to 75 float() deathmatch_buffed_axe = diff --git a/qcsrc/server.qc b/qcsrc/server.qc index 7e2a65cc9..d549f3933 100644 --- a/qcsrc/server.qc +++ b/qcsrc/server.qc @@ -1,9 +1,4 @@ -/* - server.qc - - server functions (movetarget code) - - Copyright (C) 1996-1997 Id Software, Inc. +/* Copyright (C) 1996-1997 Id Software, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License diff --git a/qcsrc/spectate.qc b/qcsrc/spectate.qc index aebc9ecc9..e40b61151 100644 --- a/qcsrc/spectate.qc +++ b/qcsrc/spectate.qc @@ -1,11 +1,4 @@ -/* - spectate.qc - - spectator functions - - PURPOSE - - Copyright (C) 1996-1997 Id Software, Inc. +/* Copyright (C) 1996-1997 Id Software, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License From 2ed82a2f483ac9a7827dc7660f35780288e54910 Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Fri, 20 Sep 2024 00:09:15 -0700 Subject: [PATCH 18/22] Changed global constants to define statements --- qcsrc/defs.qc | 313 +++++++++++++++++++++++++------------------------- 1 file changed, 158 insertions(+), 155 deletions(-) diff --git a/qcsrc/defs.qc b/qcsrc/defs.qc index 0535b4723..7dd514faf 100644 --- a/qcsrc/defs.qc +++ b/qcsrc/defs.qc @@ -257,216 +257,221 @@ void end_sys_fields; // flag for structure dumping // constants // -float FALSE = 0; -float TRUE = 1; +#define FALSE 0 +#define TRUE 1 // edict.flags -float FL_FLY = 1; -float FL_SWIM = 2; -float FL_CLIENT = 8; // set for all client edicts -float FL_INWATER = 16; // for enter / leave water splash -float FL_MONSTER = 32; -float FL_GODMODE = 64; // player cheat -float FL_NOTARGET = 128; // player cheat -float FL_ITEM = 256; // extra wide size for bonus items -float FL_ONGROUND = 512; // standing on something -float FL_PARTIALGROUND = 1024; // not all corners are valid -float FL_WATERJUMP = 2048; // player jumping out of water -float FL_JUMPRELEASED = 4096; // for jump debouncing +#define FL_FLY 1 +#define FL_SWIM 2 +#define FL_CLIENT 8 // set for all client edicts +#define FL_INWATER 16 // for enter / leave water splash +#define FL_MONSTER 32 +#define FL_GODMODE 64 // player cheat +#define FL_NOTARGET 128 // player cheat +#define FL_ITEM 256 // extra wide size for bonus items +#define FL_ONGROUND 512 // standing on something +#define FL_PARTIALGROUND 1024 // not all corners are valid +#define FL_WATERJUMP 2048 // player jumping out of water +#define FL_JUMPRELEASED 4096 // for jump debouncing // edict.movetype values -float MOVETYPE_NONE = 0; // never moves -//float MOVETYPE_ANGLENOCLIP = 1; -//float MOVETYPE_ANGLECLIP = 2; -float MOVETYPE_WALK = 3; // players only -float MOVETYPE_STEP = 4; // discrete, not real time unless fall -float MOVETYPE_FLY = 5; -float MOVETYPE_TOSS = 6; // gravity -float MOVETYPE_PUSH = 7; // no clip to world, push and crush -float MOVETYPE_NOCLIP = 8; -float MOVETYPE_FLYMISSILE = 9; // fly with extra size against monsters -float MOVETYPE_BOUNCE = 10; -float MOVETYPE_BOUNCEMISSILE = 11; // bounce with extra size +#define MOVETYPE_NONE 0 // never moves +//#define MOVETYPE_ANGLENOCLIP 1 +//#define MOVETYPE_ANGLECLIP 2 +#define MOVETYPE_WALK 3 // players only +#define MOVETYPE_STEP 4 // discrete, not real time unless fall +#define MOVETYPE_FLY 5 +#define MOVETYPE_TOSS 6 // gravity +#define MOVETYPE_PUSH 7 // no clip to world, push and crush +#define MOVETYPE_NOCLIP 8 +#define MOVETYPE_FLYMISSILE 9 // fly with extra size against monsters +#define MOVETYPE_BOUNCE 10 +#define MOVETYPE_BOUNCEMISSILE 11 // bounce with extra size // edict.solid values -float SOLID_NOT = 0; // no interaction with other objects -float SOLID_TRIGGER = 1; // touch on edge, but not blocking -float SOLID_BBOX = 2; // touch on edge, block -float SOLID_SLIDEBOX = 3; // touch on edge, but not an onground -float SOLID_BSP = 4; // bsp clip, touch on edge, block +#define SOLID_NOT 0 // no interaction with other objects +#define SOLID_TRIGGER 1 // touch on edge, but not blocking +#define SOLID_BBOX 2 // touch on edge, block +#define SOLID_SLIDEBOX 3 // touch on edge, but not an onground +#define SOLID_BSP 4 // bsp clip, touch on edge, block // range values -float RANGE_MELEE = 0; -float RANGE_NEAR = 1; -float RANGE_MID = 2; -float RANGE_FAR = 3; +#define RANGE_MELEE 0 +#define RANGE_NEAR 1 +#define RANGE_MID 2 +#define RANGE_FAR 3 // deadflag values -float DEAD_NO = 0; -float DEAD_DYING = 1; -float DEAD_DEAD = 2; -float DEAD_RESPAWNABLE = 3; +#define DEAD_NO 0 +#define DEAD_DYING 1 +#define DEAD_DEAD 2 +#define DEAD_RESPAWNABLE 3 // takedamage values -float DAMAGE_NO = 0; -float DAMAGE_YES = 1; -float DAMAGE_AIM = 2; +#define DAMAGE_NO 0 +#define DAMAGE_YES 1 +#define DAMAGE_AIM 2 // items -float IT_AXE = 4096; -float IT_SHOTGUN = 1; -float IT_SUPER_SHOTGUN = 2; -float IT_NAILGUN = 4; -float IT_SUPER_NAILGUN = 8; -float IT_GRENADE_LAUNCHER = 16; -float IT_ROCKET_LAUNCHER = 32; -float IT_LIGHTNING = 64; -float IT_EXTRA_WEAPON = 128; - -float IT_SHELLS = 256; -float IT_NAILS = 512; -float IT_ROCKETS = 1024; -float IT_CELLS = 2048; - -float IT_ARMOR1 = 8192; -float IT_ARMOR2 = 16384; -float IT_ARMOR3 = 32768; -float IT_SUPERHEALTH = 65536; - -float IT_KEY1 = 131072; -float IT_KEY2 = 262144; - -float IT_INVISIBILITY = 524288; -float IT_INVULNERABILITY = 1048576; -float IT_SUIT = 2097152; -float IT_QUAD = 4194304; +#define IT_AXE 4096 +#define IT_SHOTGUN 1 +#define IT_SUPER_SHOTGUN 2 +#define IT_NAILGUN 4 +#define IT_SUPER_NAILGUN 8 +#define IT_GRENADE_LAUNCHER 16 +#define IT_ROCKET_LAUNCHER 32 +#define IT_LIGHTNING 64 +#define IT_EXTRA_WEAPON 128 + +#define IT_SHELLS 256 +#define IT_NAILS 512 +#define IT_ROCKETS 1024 +#define IT_CELLS 2048 + +#define IT_ARMOR1 8192 +#define IT_ARMOR2 16384 +#define IT_ARMOR3 32768 +#define IT_SUPERHEALTH 65536 + +#define IT_KEY1 131072 +#define IT_KEY2 262144 + +#define IT_INVISIBILITY 524288 +#define IT_INVULNERABILITY 1048576 +#define IT_SUIT 2097152 +#define IT_QUAD 4194304 // point content values -float CONTENT_EMPTY = -1; -float CONTENT_SOLID = -2; -float CONTENT_WATER = -3; -float CONTENT_SLIME = -4; -float CONTENT_LAVA = -5; -float CONTENT_SKY = -6; +#define CONTENT_EMPTY -1 +#define CONTENT_SOLID -2 +#define CONTENT_WATER -3 +#define CONTENT_SLIME -4 +#define CONTENT_LAVA -5 +#define CONTENT_SKY -6 -float STATE_TOP = 0; -float STATE_BOTTOM = 1; -float STATE_UP = 2; -float STATE_DOWN = 3; +#define STATE_TOP 0 +#define STATE_BOTTOM 1 +#define STATE_UP 2 +#define STATE_DOWN 3 -vector VEC_ORIGIN = '0 0 0'; -vector VEC_HULL_MIN = '-16 -16 -24'; -vector VEC_HULL_MAX = '16 16 32'; +#define VEC_ORIGIN '0 0 0' +#define VEC_HULL_MIN '-16 -16 -24' +#define VEC_HULL_MAX '16 16 32' -vector VEC_HULL2_MIN = '-32 -32 -24'; -vector VEC_HULL2_MAX = '32 32 64'; +#define VEC_HULL2_MIN '-32 -32 -24' +#define VEC_HULL2_MAX '32 32 64' // protocol bytes -float SVC_TEMPENTITY = 23; -float SVC_KILLEDMONSTER = 27; -float SVC_FOUNDSECRET = 28; -float SVC_INTERMISSION = 30; -float SVC_FINALE = 31; -float SVC_CDTRACK = 32; -float SVC_SELLSCREEN = 33; +#define SVC_TEMPENTITY 23 +#define SVC_KILLEDMONSTER 27 +#define SVC_FOUNDSECRET 28 +#define SVC_INTERMISSION 30 +#define SVC_FINALE 31 +#define SVC_CDTRACK 32 +#define SVC_SELLSCREEN 33 #ifdef __QW__ // Differences in engine protocols -float SVC_SMALLKICK = 34; -float SVC_BIGKICK = 35; -float SVC_MUZZLEFLASH = 39; +#define SVC_SMALLKICK 34 +#define SVC_BIGKICK 35 +#define SVC_MUZZLEFLASH 39 #else -float SVC_CUTSCENE = 34; +#define SVC_CUTSCENE 34 #endif -float TE_SPIKE = 0; -float TE_SUPERSPIKE = 1; -float TE_GUNSHOT = 2; -float TE_EXPLOSION = 3; -float TE_TAREXPLOSION = 4; -float TE_LIGHTNING1 = 5; -float TE_LIGHTNING2 = 6; -float TE_WIZSPIKE = 7; -float TE_KNIGHTSPIKE = 8; -float TE_LIGHTNING3 = 9; -float TE_LAVASPLASH = 10; -float TE_TELEPORT = 11; +#define TE_SPIKE 0 +#define TE_SUPERSPIKE 1 +#define TE_GUNSHOT 2 +#define TE_EXPLOSION 3 +#define TE_TAREXPLOSION 4 +#define TE_LIGHTNING1 5 +#define TE_LIGHTNING2 6 +#define TE_WIZSPIKE 7 +#define TE_KNIGHTSPIKE 8 +#define TE_LIGHTNING3 9 +#define TE_LAVASPLASH 10 +#define TE_TELEPORT 11 #ifdef __QW__ // Differences in engine protocols -float TE_BLOOD = 12; -float TE_LIGHTNINGBLOOD = 13; +#define TE_BLOOD 12 +#define TE_LIGHTNINGBLOOD 13 #endif // sound channels // channel 0 never willingly overrides // other channels (1-7) allways override a playing sound on that channel -float CHAN_AUTO = 0; -float CHAN_WEAPON = 1; -float CHAN_VOICE = 2; -float CHAN_ITEM = 3; -float CHAN_BODY = 4; +#define CHAN_AUTO 0 +#define CHAN_WEAPON 1 +#define CHAN_VOICE 2 +#define CHAN_ITEM 3 +#define CHAN_BODY 4 #ifdef __QW__ // NetQuake doesn't support CHAN_NO_PHS_ADD. Set it to 0 so it will have no effect when combined with another channel. -float CHAN_NO_PHS_ADD = 8; +#define CHAN_NO_PHS_ADD 8 #else -float CHAN_NO_PHS_ADD = 0; +#define CHAN_NO_PHS_ADD 0 #endif -float ATTN_NONE = 0; -float ATTN_NORM = 1; -float ATTN_IDLE = 2; -float ATTN_STATIC = 3; +#define ATTN_NONE 0 +#define ATTN_NORM 1 +#define ATTN_IDLE 2 +#define ATTN_STATIC 3 // update types -float UPDATE_GENERAL = 0; -float UPDATE_STATIC = 1; -float UPDATE_BINARY = 2; -float UPDATE_TEMP = 3; +#define UPDATE_GENERAL 0 +#define UPDATE_STATIC 1 +#define UPDATE_BINARY 2 +#define UPDATE_TEMP 3 // entity effects #ifdef __QW__ // Engines support different entity effects -float EF_BRIGHTLIGHT = 4; -float EF_DIMLIGHT = 8; -float EF_FLAG1 = 16; -float EF_FLAG2 = 32; -float EF_BLUE = 64; // Blue Globe effect for Quad -float EF_RED = 128; +#define EF_BRIGHTLIGHT 4 +#define EF_DIMLIGHT 8 +#define EF_FLAG1 16 +#define EF_FLAG2 32 +#define EF_BLUE 64 // Blue Globe effect for Quad +#define EF_RED 128 #else -float EF_BRIGHTFIELD = 1; -float EF_MUZZLEFLASH = 2; -float EF_BRIGHTLIGHT = 4; -float EF_DIMLIGHT = 8; +#define EF_BRIGHTFIELD 1 +#define EF_MUZZLEFLASH 2 +#define EF_BRIGHTLIGHT 4 +#define EF_DIMLIGHT 8 #endif // messages -float MSG_BROADCAST = 0; // unreliable to all -float MSG_ONE = 1; // reliable to one (msg_entity) -float MSG_ALL = 2; // reliable to all -float MSG_INIT = 3; // write to the init string +#define MSG_BROADCAST 0 // unreliable to all +#define MSG_ONE 1 // reliable to one (msg_entity) +#define MSG_ALL 2 // reliable to all +#define MSG_INIT 3 // write to the init string #ifdef __QW__ // Multicast is QW only -float MSG_MULTICAST = 4; // for multicast() call +#define MSG_MULTICAST 4 // for multicast() call #endif // message levels -float PRINT_LOW = 0; // pickup messages -float PRINT_MEDIUM = 1; // death messages -float PRINT_HIGH = 2; // critical messages -float PRINT_CHAT = 3; // also goes to chat console +#define PRINT_LOW 0 // pickup messages +#define PRINT_MEDIUM 1 // death messages +#define PRINT_HIGH 2 // critical messages +#define PRINT_CHAT 3 // also goes to chat console #ifdef __QW__ // Multicast is QW only // multicast sets -float MULTICAST_ALL = 0; // every client -float MULTICAST_PHS = 1; // within hearing -float MULTICAST_PVS = 2; // within sight -float MULTICAST_ALL_R = 3; // every client, reliable -float MULTICAST_PHS_R = 4; // within hearing, reliable -float MULTICAST_PVS_R = 5; // within sight, reliable +#define MULTICAST_ALL 0 // every client +#define MULTICAST_PHS 1 // within hearing +#define MULTICAST_PVS 2 // within sight +#define MULTICAST_ALL_R 3 // every client, reliable +#define MULTICAST_PHS_R 4 // within hearing, reliable +#define MULTICAST_PVS_R 5 // within sight, reliable #endif +#define AS_STRAIGHT 1 +#define AS_SLIDING 2 +#define AS_MELEE 3 +#define AS_MISSILE 4 + //================================================ // @@ -541,11 +546,6 @@ float teamplay; .float search_time; .float attack_state; -float AS_STRAIGHT = 1; -float AS_SLIDING = 2; -float AS_MELEE = 3; -float AS_MISSILE = 4; - // // player only fields // @@ -790,9 +790,12 @@ void(entity killer, entity killee) logfrag = #79; // add to stats void(entity killer, entity killee) logfrag = {}; // add to stats #endif -#ifdef __QW__ // NQ does not support infokeys +#ifdef __QW__ // NQ does not support infokeys or stof string(entity e, string key) infokey = #80; // get a key value (world = serverinfo) float(string s) stof = #81; // convert string to float +#endif + +#ifdef __QW__ // NQ does not support multicast void(vector where, float set) multicast = #82; // sends the temp message to a set // of clients, possibly in PVS or PHS #endif From daa99637d6307a0e7d555a9b471faa9de295fe89 Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Sun, 29 Sep 2024 11:37:22 -0700 Subject: [PATCH 19/22] Moved qwprogs.dat to pak0 --- build_components.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/build_components.json b/build_components.json index d70db9763..76c390419 100644 --- a/build_components.json +++ b/build_components.json @@ -25,12 +25,11 @@ "demo1.dem", "demo2.dem", "demo3.dem", - "progs.dat" + "progs.dat", + "qwprogs.dat" ], "files_pak1": [], - "files_unpacked": [ - "qwprogs.dat" - ] + "files_unpacked": [] }, "config": { "base_dir": "lq1", From 505e11405e6f1d5fbfb5112f579c2ea2edc83835 Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Sun, 29 Sep 2024 11:40:35 -0700 Subject: [PATCH 20/22] Fixed invulnerable telefrag awarding kill to the wrong player --- qcsrc/client.qc | 2 +- qcsrc/triggers.qc | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/qcsrc/client.qc b/qcsrc/client.qc index 760322cce..af6e1e9ef 100644 --- a/qcsrc/client.qc +++ b/qcsrc/client.qc @@ -1512,7 +1512,7 @@ void(entity targ, entity attacker) ClientObituary = bprint (PRINT_MEDIUM, LOC_DEATH_DEFLECT_A); bprint (PRINT_MEDIUM, targ.netname); bprint (PRINT_MEDIUM, LOC_DEATH_DEFLECT_B); - bprint (PRINT_MEDIUM, attacker.enemy.netname); + bprint (PRINT_MEDIUM, attacker.owner.netname); bprint (PRINT_MEDIUM, "\n"); attacker.owner.frags = attacker.owner.frags + 1; diff --git a/qcsrc/triggers.qc b/qcsrc/triggers.qc index b57c05d0f..894a76d72 100644 --- a/qcsrc/triggers.qc +++ b/qcsrc/triggers.qc @@ -377,15 +377,15 @@ void() tdeath_touch = self.owner = other; T_Damage (other2, self, self, 50000); } - - if (other.invincible_finished > time) + else if (other.invincible_finished > time) { self.classname = "teledeath2"; - T_Damage (self.owner, self, self, 50000); + other2 = self.owner; + self.owner = other; + T_Damage (other2, self, self, 50000); return; } - - if (self.owner.classname != "player") + else if (self.owner.classname != "player") { // monsters explode themselves T_Damage (self.owner, self, self, 50000); return; From f4628071e87f6f55e6911aed954846e1fe5d4ad3 Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Sun, 29 Sep 2024 13:35:50 -0700 Subject: [PATCH 21/22] Changed deathmatch settings some more --- qcsrc/client.qc | 52 ++++-- qcsrc/deathmatch_settings.qc | 340 +++++++++++++++++++++++++++++++++-- qcsrc/items.qc | 20 +-- 3 files changed, 371 insertions(+), 41 deletions(-) diff --git a/qcsrc/client.qc b/qcsrc/client.qc index af6e1e9ef..851deb45f 100644 --- a/qcsrc/client.qc +++ b/qcsrc/client.qc @@ -656,13 +656,6 @@ void() PutClientInServer = // Deathmatch 4 starting items if (deathmatch_supermode()) { - self.items = self.items | IT_NAILGUN; - self.items = self.items | IT_SUPER_NAILGUN; - self.items = self.items | IT_SUPER_SHOTGUN; - self.items = self.items | IT_ROCKET_LAUNCHER; - // self.items = self.items | IT_GRENADE_LAUNCHER; - self.items = self.items | IT_LIGHTNING; - self.weapon = IT_ROCKET_LAUNCHER; self.items = self.items - (self.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + IT_ARMOR3; self.armorvalue = 200; self.armortype = 0.8; @@ -675,13 +668,6 @@ void() PutClientInServer = // Deathmatch 5 starting items if (deathmatch_supermode2()) { - self.items = self.items | IT_NAILGUN; - self.items = self.items | IT_SUPER_NAILGUN; - self.items = self.items | IT_SUPER_SHOTGUN; - self.items = self.items | IT_ROCKET_LAUNCHER; - self.items = self.items | IT_GRENADE_LAUNCHER; - self.items = self.items | IT_LIGHTNING; - self.weapon = IT_ROCKET_LAUNCHER; self.items = self.items - (self.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + IT_ARMOR3; self.armorvalue = 200; self.armortype = 0.8; @@ -691,12 +677,47 @@ void() PutClientInServer = self.invincible_finished = time + 3; } - if (deathmatch_starting_ammo()) + if (deathmatch_no_shotgun()) { + self.items = self.items - (self.items & IT_SHOTGUN); + self.ammo_shells = 0; + } + + if (deathmatch_starting_nailgun()) + { + self.items = self.items | IT_NAILGUN; self.ammo_nails = 80; + self.weapon = IT_NAILGUN; + } + if (deathmatch_starting_super_shotgun()) + { + self.items = self.items | IT_SUPER_SHOTGUN; self.ammo_shells = 30; + self.weapon = IT_SUPER_SHOTGUN; + } + if (deathmatch_starting_super_nailgun()) + { + self.items = self.items | IT_SUPER_NAILGUN; + self.ammo_nails = 80; + self.weapon = IT_SUPER_NAILGUN; + } + if (deathmatch_starting_grenade_launcher()) + { + self.items = self.items | IT_GRENADE_LAUNCHER; self.ammo_rockets = 10; + self.weapon = IT_GRENADE_LAUNCHER; + } + if (deathmatch_starting_lightning_gun()) + { + self.items = self.items | IT_LIGHTNING; self.ammo_cells = 30; + self.weapon = IT_LIGHTNING; + } + if (deathmatch_starting_rocket_launcher()) + { + self.items = self.items | IT_ROCKET_LAUNCHER; + self.ammo_rockets = 10; + self.weapon = IT_ROCKET_LAUNCHER; } if (deathmatch_unlimited_ammo()) @@ -725,7 +746,6 @@ void() PutClientInServer = )); self.weapon = IT_AXE; } - W_SetCurrentAmmo (); }; diff --git a/qcsrc/deathmatch_settings.qc b/qcsrc/deathmatch_settings.qc index ab7fd2e37..afd5de0e5 100644 --- a/qcsrc/deathmatch_settings.qc +++ b/qcsrc/deathmatch_settings.qc @@ -50,48 +50,278 @@ float() deathmatch_axe_only = if (deathmatch_supermode() && stof(infokey(world, "axe")) != 0) return TRUE; - if (deathmatch && stof(infokey(world, "ao")) != 0) + if (deathmatch && stof(infokey(world, "have_axe_only")) != 0) return TRUE; #endif return FALSE; } -// Players have unlimited ammo -float() deathmatch_unlimited_ammo = +// Shotgun is removed from players' starting items +float() deathmatch_no_shotgun = { - if (deathmatch_supermode()) +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "disable_shotgun")) != 0) return TRUE; +#endif + return FALSE; +} +// Super Shotgun is removed from players' starting items +float() deathmatch_no_super_shotgun = +{ #ifdef __QW__ // NQ does not support infokeys - if (deathmatch && stof(infokey(world, "ua")) != 0) + if (deathmatch && stof(infokey(world, "disable_super_shotgun")) != 0) return TRUE; #endif return FALSE; }; -// Players start with some ammo -float() deathmatch_starting_ammo = +// Nailgun is removed from players' starting items +float() deathmatch_no_nailgun = { +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "disable_nailgun")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Super Nailgun is removed from players' starting items +float() deathmatch_no_super_nailgun = +{ +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "disable_super_nailgun")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Grenade Launcher is removed from players' starting items +float() deathmatch_no_grenade_launcher = +{ +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "disable_grenade_launcher")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Rocket Launcher is removed from players' starting items +float() deathmatch_no_rocket_launcher = +{ +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "disable_rocket_launcher")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Lightning Gun is removed from players' starting items +float() deathmatch_no_lightning_gun = +{ +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "disable_lightning_gun")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Players start with the Super Shotgun +float() deathmatch_starting_super_shotgun = +{ + if (deathmatch_no_super_shotgun()) + return FALSE; + + if (deathmatch_supermode() || deathmatch_supermode2()) + return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "have_super_shotgun")) != 0) + return TRUE; +#endif + return FALSE; +} + +// Players start with the Super Nailgun +float() deathmatch_starting_nailgun = +{ + if (deathmatch_no_nailgun()) + return FALSE; + + if (deathmatch_supermode() || deathmatch_supermode2()) + return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "have_nailgun")) != 0) + return TRUE; +#endif + return FALSE; +} + +// Players start with the Super Nailgun +float() deathmatch_starting_super_nailgun = +{ + if (deathmatch_no_super_nailgun()) + return FALSE; + + if (deathmatch_supermode() || deathmatch_supermode2()) + return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "have_super_nailgun")) != 0) + return TRUE; +#endif + return FALSE; +} + +// Players start with the Grenade Launcher +float() deathmatch_starting_grenade_launcher = +{ + if (deathmatch_no_grenade_launcher()) + return FALSE; + if (deathmatch_supermode2()) return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "have_grenade_launcher")) != 0) + return TRUE; +#endif + return FALSE; +} + +// Players start with the Rocket Launcher +float() deathmatch_starting_rocket_launcher = +{ + if (deathmatch_no_rocket_launcher()) + return FALSE; + + if (deathmatch_supermode() || deathmatch_supermode2()) + return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "have_rocket_launcher")) != 0) + return TRUE; +#endif + return FALSE; +} + +// Players start with the Lightning Gun +float() deathmatch_starting_lightning_gun = +{ + if (deathmatch_no_lightning_gun()) + return FALSE; + + if (deathmatch_supermode() || deathmatch_supermode2()) + return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "have_lightning_gun")) != 0) + return TRUE; +#endif + return FALSE; +} + +// Players have unlimited ammo +float() deathmatch_unlimited_ammo = +{ + if (deathmatch_supermode()) + return TRUE; #ifdef __QW__ // NQ does not support infokeys - if (deathmatch && stof(infokey(world, "sa")) != 0) + if (deathmatch && stof(infokey(world, "have_unlimited_ammo")) != 0) return TRUE; #endif return FALSE; }; +// Super Shotgun is removed on map load +float() deathmatch_no_super_shotgun_on_map = +{ + if (deathmatch_no_super_shotgun()) + return TRUE; + + if (deathmatch_starting_super_shotgun()) + return TRUE; + + return FALSE; +}; + +// Nailgun is removed from players' starting items +float() deathmatch_no_nailgun_on_map = +{ + if (deathmatch_no_nailgun()) + return TRUE; + + if (deathmatch_starting_nailgun()) + return TRUE; + + return FALSE; +}; + +// Super Nailgun is removed from players' starting items +float() deathmatch_no_super_nailgun_on_map = +{ + if (deathmatch_no_super_nailgun()) + return TRUE; + + if (deathmatch_starting_super_nailgun()) + return TRUE; + + return FALSE; +}; + +// Grenade Launcher is removed from players' starting items +float() deathmatch_no_grenade_launcher_on_map = +{ + if (deathmatch_no_grenade_launcher()) + return TRUE; + + if (deathmatch_starting_grenade_launcher()) + return TRUE; + + return FALSE; +}; + +// Rocket Launcher is removed from players' starting items +float() deathmatch_no_rocket_launcher_on_map = +{ + if (deathmatch_no_rocket_launcher()) + return TRUE; + + if (deathmatch_starting_rocket_launcher()) + return TRUE; + + return FALSE; +}; + +// Lightning Gun is removed from players' starting items +float() deathmatch_no_lightning_gun_on_map = +{ + if (deathmatch_no_lightning_gun()) + return TRUE; + + if (deathmatch_starting_lightning_gun()) + return TRUE; + + return FALSE; +}; + // Weapons are removed on map load -float() deathmatch_no_weapons = +float() deathmatch_no_weapons_on_map = { if (deathmatch_supermode() || deathmatch_supermode2() || deathmatch_axe_only()) return TRUE; #ifdef __QW__ // NQ does not support infokeys - if (deathmatch && stof(infokey(world, "nw")) != 0) + if (deathmatch && stof(infokey(world, "disable_weapons")) != 0) return TRUE; #endif @@ -105,7 +335,87 @@ float() deathmatch_no_ammo_pickups = return TRUE; #ifdef __QW__ // NQ does not support infokeys - if (deathmatch && stof(infokey(world, "na")) != 0) + if (deathmatch && stof(infokey(world, "disable_ammo")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Shell pickups are removed on map load +float() deathmatch_no_shell_pickups = +{ + if (deathmatch_no_ammo_pickups()) + return TRUE; + + if (deathmatch_no_shotgun() && deathmatch_no_super_shotgun()) + return TRUE; + + if (deathmatch_no_weapons_on_map() && (!deathmatch_starting_super_shotgun())) + return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "disable_ammo_shells")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Nail pickups are removed on map load +float() deathmatch_no_nail_pickups = +{ + if (deathmatch_no_ammo_pickups()) + return TRUE; + + if (deathmatch_no_nailgun() && deathmatch_no_super_nailgun()) + return TRUE; + + if (deathmatch_no_weapons_on_map() && (!deathmatch_starting_nailgun()) && (!deathmatch_starting_super_nailgun())) + return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "disable_ammo_nails")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Rocket pickups are removed on map load +float() deathmatch_no_rocket_pickups = +{ + if (deathmatch_no_ammo_pickups()) + return TRUE; + + if (deathmatch_no_grenade_launcher() && deathmatch_no_rocket_launcher()) + return TRUE; + + if (deathmatch_no_weapons_on_map() && (!deathmatch_starting_grenade_launcher()) && (!deathmatch_starting_rocket_launcher())) + return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "disable_ammo_rockets")) != 0) + return TRUE; +#endif + + return FALSE; +}; + +// Cell pickups are removed on map load +float() deathmatch_no_cell_pickups = +{ + if (deathmatch_no_ammo_pickups()) + return TRUE; + + if (deathmatch_no_lightning_gun()) + return TRUE; + + if (deathmatch_no_weapons_on_map() && (!deathmatch_starting_lightning_gun())) + return TRUE; + +#ifdef __QW__ // NQ does not support infokeys + if (deathmatch && stof(infokey(world, "disable_ammo_cells")) != 0) return TRUE; #endif @@ -116,7 +426,7 @@ float() deathmatch_no_ammo_pickups = float() deathmatch_no_powerups = { #ifdef __QW__ // NQ does not support infokeys - if (deathmatch && stof(infokey(world, "np")) != 0) + if (deathmatch && stof(infokey(world, "disable_powerups")) != 0) return TRUE; #endif @@ -127,7 +437,7 @@ float() deathmatch_no_powerups = float() deathmatch_no_armor = { #ifdef __QW__ // NQ does not support infokeys - if (deathmatch && stof(infokey(world, "nr")) != 0) + if (deathmatch && stof(infokey(world, "disable_armor")) != 0) return TRUE; #endif @@ -138,7 +448,7 @@ float() deathmatch_no_armor = float() deathmatch_no_health = { #ifdef __QW__ // NQ does not support infokeys - if (deathmatch && stof(infokey(world, "nh")) != 0) + if (deathmatch && stof(infokey(world, "disable_health")) != 0) return TRUE; #endif @@ -149,7 +459,7 @@ float() deathmatch_no_health = float() deathmatch_no_mega_health = { #ifdef __QW__ // NQ does not support infokeys - if (deathmatch && stof(infokey(world, "nmh")) != 0) + if (deathmatch && stof(infokey(world, "disable_mega_health")) != 0) return TRUE; #endif diff --git a/qcsrc/items.qc b/qcsrc/items.qc index 5b397ead5..15ab1ac40 100644 --- a/qcsrc/items.qc +++ b/qcsrc/items.qc @@ -764,7 +764,7 @@ void() weapon_touch = void() weapon_supershotgun = { - if (deathmatch_no_weapons()) + if (deathmatch_no_weapons_on_map() || deathmatch_no_super_shotgun_on_map()) return; precache_model ("progs/g_shot.mdl"); @@ -784,7 +784,7 @@ void() weapon_supershotgun = void() weapon_nailgun = { - if (deathmatch_no_weapons()) + if (deathmatch_no_weapons_on_map() || deathmatch_no_nailgun_on_map()) return; precache_model ("progs/g_nail.mdl"); @@ -804,7 +804,7 @@ void() weapon_nailgun = void() weapon_supernailgun = { - if (deathmatch_no_weapons()) + if (deathmatch_no_weapons_on_map() || deathmatch_no_super_nailgun_on_map()) return; precache_model ("progs/g_nail2.mdl"); @@ -824,7 +824,7 @@ void() weapon_supernailgun = void() weapon_grenadelauncher = { - if (deathmatch_no_weapons()) + if (deathmatch_no_weapons_on_map() || deathmatch_no_grenade_launcher_on_map()) return; precache_model ("progs/g_rock.mdl"); @@ -844,7 +844,7 @@ void() weapon_grenadelauncher = void() weapon_rocketlauncher = { - if (deathmatch_no_weapons()) + if (deathmatch_no_weapons_on_map() || deathmatch_no_rocket_launcher_on_map()) return; precache_model ("progs/g_rock2.mdl"); @@ -865,7 +865,7 @@ void() weapon_rocketlauncher = void() weapon_lightning = { - if (deathmatch_no_weapons()) + if (deathmatch_no_weapons_on_map() || deathmatch_no_lightning_gun_on_map()) return; precache_model ("progs/g_light.mdl"); @@ -998,7 +998,7 @@ float WEAPON_BIG2 = 1; void() item_shells = { - if (deathmatch_no_ammo_pickups()) + if (deathmatch_no_shell_pickups()) return; self.touch = ammo_touch; @@ -1031,7 +1031,7 @@ void() item_shells = void() item_spikes = { - if (deathmatch_no_ammo_pickups()) + if (deathmatch_no_nail_pickups()) return; self.touch = ammo_touch; @@ -1064,7 +1064,7 @@ void() item_spikes = void() item_rockets = { - if (deathmatch_no_ammo_pickups()) + if (deathmatch_no_rocket_pickups()) return; self.touch = ammo_touch; @@ -1098,7 +1098,7 @@ void() item_rockets = void() item_cells = { - if (deathmatch_no_ammo_pickups()) + if (deathmatch_no_cell_pickups()) return; self.touch = ammo_touch; From baf6ee68a30b2478487e0507e8334f8e78fbe524 Mon Sep 17 00:00:00 2001 From: ZungrySoft Date: Sun, 29 Sep 2024 14:30:04 -0700 Subject: [PATCH 22/22] Changed buff axe infokey --- qcsrc/deathmatch_settings.qc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qcsrc/deathmatch_settings.qc b/qcsrc/deathmatch_settings.qc index afd5de0e5..8a792f654 100644 --- a/qcsrc/deathmatch_settings.qc +++ b/qcsrc/deathmatch_settings.qc @@ -35,7 +35,7 @@ float() deathmatch_buffed_axe = return TRUE; #ifdef __QW__ // NQ does not support infokeys - if (deathmatch && stof(infokey(world, "ba")) != 0) + if (deathmatch && stof(infokey(world, "buffed_axe")) != 0) return TRUE; #endif