Chainforcer Release
Posted on 2024-10-20 in projects
"Again with this model..."
Release File
monster_chainforcer.zip - Includes mdl, sounds and code
Licenses
- The quakec code is GPLv2 derived and therefore falls under the same license.
- All other included media assets are marked with CC0 1.0 and can be used freely (see https://creativecommons.org/publicdomain/zero/1.0/)
Ingame footage
Description
I finished this model once before (see Chainforcer (Baseogre) Release)
Why do it again? Basically I just had no current project but more importantly over the past year I have learned more about making game art for quake that I wasn't even aware of before.
Polycount
The main issue being polycount or amount of triangles. See this before and after.
As you can see thats quite a difference. I was aware of course that I cannot have infinite polys for an oldschool game but honestly after the modeling of the first version I didn't even pay any more attention to that.
The first version was 1384 triangles (with weapon) and the new version reduced that to 736 which is still a lot for quake (The ogre is at 326 for example). Though honestly the polycounts for original quake were so low its not even possible to get there without losing a lot of character and I don't think it should be a goal for 2024 quake modding.
It is however important to be mindful of that to make sure custom models don't weirdly stand out from the rest of the models for no reason.
Texel density
The second thing I didn't think about was texel density or how big pixel are on the model.
I just tried to optimize space usage. Mirror as much as possible. Make sure as much detail as possible can go onto the model. This is of course generally what you should do but again doesn't match the rest of the models. The model looks weirdly high-res even though thats usually a good thing.
Here is the new texture
It is not necessary to use those weird front/back projections like original quake (although that actually looks cool as well) but at least scale the UV on the texture in a way that pixel size matches the overall art style. This enables us to be loose with the used space because 256x256 for example is quite a lot with modern tools.
Another thing I started to do is to align UV edges with the pixels when that makes sense. Accepting the UVs generated by blender is cool but there is much room for improvement when it comes to ease of painting or even achieving a look.
It does make sense to consider how many rows of pixel a certain detail on the model should get and then adjust the UV exactly to that.
The main thing for me though is when I try to place a line on the texture and the UV bends weirdly over the texure map producing diagonal of differently sized pixels. It just makes the painting harder and you can eliminate that by optimizing for it in the UV.
Behaviour
While I'm at it I wanted to do more with the coding instead of just replacing an existing model. Replacing original models has been done many times. Digging deeper into quakec has been quite fun because you get to play against the bugs you produce. I didn't go overboard here though.
I based off of the enforcer code and then changed the attack patterns. The guy has an 8 shot chaingun fire attack mowing form side to side. (I got help from the quake mapping discord for that, thanks Sparky)
Also he fires ogre grenades and does a headbutt. All in all pretty simple stuff except of course the vector math that I had to learn for the projectile placements.
Sounds
I recorded custom sounds. I used a cheap mic, reaper and mainly pitch shifting and EQ. They sound okay but I have to admit I am a newbie here. I watched some tutorial on youtube and just tried my best. The bad audio quality of quake helps hide the bad artistic quality.
Integration
To integrate the monster into your mod you need to
- Place
chainforcer.qc
into your quakec source directory - Add
chainforcer.qc
to the end ofprogs.src
- Extend the
ClientObituary
function inclient.qc
to have a "killed by" text - Extend the
SightSound
function inai.qc
to have the sight sound play (seevoid() chnfcr_sight_sound
inchainforcer.qc
) - Extend your map editor entity definition like with the following FGD format line
@PointClass base(Monster) size(-16 -16 -24, 16 16 40) model({ "path": ":progs/chainforcer.mdl" }) = monster_chainforcer : "Chainforcer" []
There is a progs.dat
included for testing. Here all soldier enemies are replaced. Start the game with quake -game monster_chainforcer
to test.
Numbers
- 736 triangles
- 256x256px texture
- 105 animation frames
- stand (7)
- walk (16)
- run (8)
- gunfire (17)
- death_a (14)
- death_b (11)
- pain_a (4)
- pain_b (5)
- pain_c (8)
- grenade (6)
- headbutt (8)