The Pro-Rocket Manifesto by Cardiac, April 1998

The Pro-Rocket Manifesto

pr0000

or..”give me back my rocket launcher.. PLEASE !” in pre-defense of the PRO-ROCKET MOD-STANDARD, authored by Cardiac, April 1998

Screen shot 2018-01-11 at 4.27.37 PMScreen shot 2018-01-11 at 4.28.01 PMScreen shot 2018-01-11 at 4.28.24 PMScreen shot 2018-01-11 at 4.28.40 PMScreen shot 2018-01-11 at 4.28.52 PMScreen shot 2018-01-11 at 4.29.06 PMScreen shot 2018-01-11 at 4.29.25 PM

SO WHY DOESN’T QUAKE2 DEATHMATCH DO IT FOR ME ?

Big can of worms here. I’ve got to start off by saying that I think id did a phenomenal job on Quake2. Besides the stunning content and technology, the decisions and changes made to the gameplay and weapons gave Quake a much more well rounded experience for most players. I’ve also found quite a few people who tried Q1 and didn’t really like it, and now swear by Quake2.

But not for me. I tried. I REALLY tried. I played nothing but Quake2 deathmatch for about three months after its release. Things were going fine until one day I decided to fire up QuakeWorld for old times sake.

The sheer excitement I felt really made the Q2 deathmatch experience pale in comparison, although I didn’t realize it right away. I realized it after going back to a Q2 game, because that’s when this thought popped into my head :

“I just DONT GET SCARED here.”

Now that doesn’t really explain anything. In fact its just the kind of vague comment that probably bugs the shit out of developers, so I’ll try to examine and quantify my reactions.

Q1 to Q2 CONTINUITY
With regards to sequels, continuity and change have to be VERY carefully balanced in order to give an enjoyable and exciting experience. When making a sequel, certain key features and defining factors of the original are carried on and updated. HOW much change is the tricky part. You want it different enough to be interesting, and samey enough to preserve continuity.

CHANGES TO DEATHMATCHING FROM Q1 to Q2
I’ve managed to boil down my dissatisfaction with Q2 deathmatching to the same things that made Quake for me :

The rocket launcher, and the physics.

Like it or not, the players of Quake grew into and around these core features.

In Quake2 the rocket launcher was slowed down to almost HALF it’s previous speed. In addition, the “bounce” of a rocket’s impact was all but negated. Now it feels like a steaming empty beer can lofting through the air. In Q2, even under the best circumstances you’ll be lucky to budge your opponent by a hundred units.

Now that the bounce is gone, the gameplay feels bland. I’ve heard a number of other players describing what I think is the same thing, using terms like “plastic”, “fake”, “boring”, and “muted”. With this article I hope to have gone a little deeper than that in providing some possible explanations.

As a side note, the weapons in Quake2 are really balanced. REALLY BALANCED. So balanced in fact, that now I’m pretty much happy with any weapon except the blaster. I know that if I use the weapons to their advantages, I can hold my own against another player. Sure the higher weapons do more damage, but there are so many balance tweaks that in the end, the curve isn’t very steep. Is this a good thing ? Many people seem to think so. But for me it’s devaluated the tactical element of deathmatching with regards to the level, with regards to the environment itself.

WRAP-UP

Quake2 is a stunning piece of work, advanced far beyond Quake1. The majority of newcomers I’ve seen respond far more favorably to Q2 than they did Q1. However I’ve found many “old school” quakers are sticking with their QuakeWorld clients, turning their back on Q2.

Here is an excerpt from a .plan update from id software designer Paul Jaquays, shortly after the release of Quake2 and in response to criticism from fans who complained that Quake2 “just wasn’t Quake”.

Screen shot 2018-01-11 at 4.29.44 PM

So where does this leave us ?

Who cares ? We’re the one in ten! If the majority likes it (and they DO), then Q2’s goal was achieved.

– id has produced yet another phenomenal game that almost everyone loves playing, except for a few die-hard purists who are sticking to QW.

– the reasons for the “one in ten” not enjoying Q2 deathmatching may be due to changes to some of the defining factors of Q1, resulting in Q2 feeling less like a sequel, and more like a new game.

Was Thresh involved in tweaking Q2 Deathmatching ? I’m not sure… I’d be curious to know how all the PGL Quakers feel about the new Q2 deathmatching nuances.

Screen shot 2018-01-11 at 4.32.51 PM

SOLUTIONS

The proliferation of quake was propelled in no small part by it’s extensibility. A righteous move pioneered by id software, it put the power of changing game elements into the hands of grass-roots enthusiasts and developers.

After my Q2 tour of duty (but before writing this article) I decided to have a go at tweaking Q2…

The result is a “Mod-Standard” (NOT a MOD) that I hope for my own selfish reasons will find a niche of acceptance.

If you resonate with any of the statements in this article, *please* don’t give up on Q2 Deathmatching yet… Check out this page for your fix.

Cardiac

https://web.archive.org/web/20010124072400/http://www.planetquake.com:80/pro-rocket/

Specifications

Screen shot 2018-01-11 at 4.48.50 PM

Screen shot 2018-01-11 at 4.50.10 PM

Implementation

Screen shot 2018-01-11 at 4.56.43 PM

g_combat.c

Around line 400 : if (!(dflags & DAMAGE_NO_KNOCKBACK)) { if ((knockback) && (targ->movetype != MOVETYPE_NONE) && (targ->movetype != MOVETYPE_BOUNCE) && (targ->movetype != MOVETYPE_PUSH) && (targ->movetype != MOVETYPE_STOP)) { vec3_t kvel; float mass; if (targ->mass < 50) mass = 50; else mass = targ->mass; //******************************* MODIFIED for Pro-Rocket – BOUNCE TWEAK //if (targ->client && attacker == targ) // VectorScale (dir, 1600.0 * (float)knockback / mass, kvel); // the rocket jump hack… //else //VectorScale (dir, 500.0 * (float)knockback / mass, kvel); if (targ->client && attacker == targ) VectorScale (dir, 1870.0 * (float)knockback / mass, kvel); else VectorScale (dir, 1760.0 * (float)knockback / mass, kvel); //******************************* MODIFIED for Pro-Rocket – BOUNCE TWEAK VectorAdd (targ->velocity, kvel, targ->velocity);

g_local.h

Around line 12 : #define GAME_INCLUDE #include “game.h” //******************************* ADDED for Pro-Rocket – FAST WEAPON SWITCHING – from CRT #define fastswitch 1 //******************************* ADDED for Pro-Rocket – FAST WEAPON SWITCHING – from CRT // the “gameversion” client command will print this plus compile date #define GAMEVERSION “baseq2”

g_weapon.c

Around line 566 : void rocket_touch (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf) { vec3_t origin; int n; if (other == ent->owner) return; if (surf && (surf->flags & SURF_SKY)) { G_FreeEdict (ent); return; } if (ent->owner->client) PlayerNoise(ent->owner, ent->s.origin, PNOISE_IMPACT); // calculate position for the explosion entity VectorMA (ent->s.origin, -0.02, ent->velocity, origin); if (other->takedamage) { //******************************* MODIFIED for Pro-Rocket – ROCKET DIRECT HIT KICK //T_Damage (other, ent, ent->owner, ent->velocity, ent->s.origin, plane->normal, ent->dmg, 0, 0, MOD_ROCKET); T_Damage (other, ent, ent->owner, ent->velocity, ent->s.origin, plane->normal, ent->dmg, ent->dmg, 0, MOD_ROCKET); //******************************* MODIFIED for Pro-Rocket – ROCKET DIRECT HIT KICK } else

p_client.c

Around line 566 : void rocket_touch (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf) { vec3_t origin; int n; if (other == ent->owner) return; if (surf && (surf->flags & SURF_SKY)) { G_FreeEdict (ent); return; } if (ent->owner->client) PlayerNoise(ent->owner, ent->s.origin, PNOISE_IMPACT); // calculate position for the explosion entity VectorMA (ent->s.origin, -0.02, ent->velocity, origin); if (other->takedamage) { //******************************* MODIFIED for Pro-Rocket – ROCKET DIRECT HIT KICK //T_Damage (other, ent, ent->owner, ent->velocity, ent->s.origin, plane->normal, ent->dmg, 0, 0, MOD_ROCKET); T_Damage (other, ent, ent->owner, ent->velocity, ent->s.origin, plane->normal, ent->dmg, ent->dmg, 0, MOD_ROCKET); //******************************* MODIFIED for Pro-Rocket – ROCKET DIRECT HIT KICK } else

p_weapon.c

Around line 355 : if (ent->client->weaponstate == WEAPON_ACTIVATING) { //******************************* MODIFIED for Pro-Rocket – FAST WEAPON SWITCHING – from CRT //if (ent->client->ps.gunframe == FRAME_ACTIVATE_LAST) if (ent->client->ps.gunframe == FRAME_ACTIVATE_LAST || fastswitch) //******************************* MODIFIED for Pro-Rocket – FAST WEAPON SWITCHING – from CRT { ent->client->weaponstate = WEAPON_READY; ent->client->ps.gunframe = FRAME_IDLE_FIRST; return; }

Around line 371 : if ((ent->client->newweapon) && (ent->client->weaponstate != WEAPON_FIRING)) { ent->client->weaponstate = WEAPON_DROPPING; //******************************* MODIFIED for Pro-Rocket – FAST WEAPON SWITCHING – from CRT //ent->client->ps.gunframe = FRAME_DEACTIVATE_FIRST; if (fastswitch) ent->client->ps.gunframe = FRAME_DEACTIVATE_LAST; else ent->client->ps.gunframe = FRAME_DEACTIVATE_FIRST; //******************************* MODIFIED for Pro-Rocket – FAST WEAPON SWITCHING – from CRT return; }

Around line 680 : void Weapon_RocketLauncher_Fire (edict_t *ent) { vec3_t offset, start; vec3_t forward, right; int damage; float damage_radius; int radius_damage;

//******************************* MODIFIED for Pro-Rocket – ROCKET DAMAGE AND RADIUS TWEAKS //damage = 100 + (int)(random() * 20.0); //radius_damage = 120; //damage_radius = 120; damage = 90 + (int)(random() * 20.0); radius_damage = 110; damage_radius = 160; //******************************* MODIFIED for Pro-Rocket – ROCKET DAMAGE AND RADIUS TW

if (is_quad) { damage *= 4; radius_damage *= 4; }

Around line 700 : VectorSet(offset, 8, 8, ent->viewheight-8); P_ProjectSource (ent->client, ent->s.origin, offset, forward, right, start); //******************************* MODIFIED for Pro-Rocket – ROCKET SPEED INCREASE //fire_rocket (ent, start, forward, damage, 650, damage_radius, radius_damage); fire_rocket (ent, start, forward, damage, 1000, damage_radius, radius_damage); //******************************* MODIFIED for Pro-Rocket – ROCKET SPEED INCREASE // send muzzle flash gi.WriteByte (svc_muzzleflash);

Please incorporate these changes verbatim, otherwise it won’t be a standard. From now on, all suggestions/tweaks/changes to the Pro-Rocket specs will be decided by the people who use and play it.

https://web.archive.org/web/20010509144045/http://www.planetquake.com:80/pro-rocket/main_prorocket_implementation.htm

Credits

Site hosting :
the indomitable Planet Quake

Initial ugggly code and site design :
Cardiac

Playtesters :
Tenacity, Phrenic, Erode, Guardian, Crizzard, XC, HOE, Vlad, and Rimmer

of course :
id software…

https://web.archive.org/web/*/http://www.planetquake.com:80/pro-rocket/*

Rocket Candy: Retro-Rocket

retro_rocket_heaadrretro_rocket_medium_nographic

  • While I personally think Mr Steed’s new RL is way sexier, there is something to be said for “a classic”. Since pro-rocket DOES emulate the old RL, I figured I’d hang my ass out to get flamed and post these .md2’s.

  • Retro-rocket is a client side weapon replacement that is enabled when you connect to pro-rocket enabled servers. It won’t mess with your normal RL.

  • Be sure to check out the readme file in the .zip for installation instructions.

20/6/98 – Retro-Rocket unleashed.
By far, one of the most requested features was the replacement rocket launcher. KazaaM sent over a replacement, but in the end I converted the originals using QME and the Quake2Modeller. If you’re interested in full conversions, you have to check out Skid’s Generations Quake2 Mod.

warning !!! funky behavior at >400 pings, due to the idle animation popping I think. If anyone finds a fix, (in code or script) pls let me know !

thanks to alex@ms.com for coining the phrase “Retro-Rocket”

https://web.archive.org/web/20010509152132/http://www.planetquake.com:80/pro-rocket/candy/retro-rocket.htm

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.