Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified assets/third_party/baseq3a/pak8a.pk3
Binary file not shown.
Binary file modified assets/third_party/missionpackplus/pak3a.pk3
Binary file not shown.
70 changes: 36 additions & 34 deletions code/cgame/cg_localents.c
Original file line number Diff line number Diff line change
Expand Up @@ -858,76 +858,78 @@ CG_AddDamagePlum
void CG_AddDamagePlum( localEntity_t *le ) {
refEntity_t *re;
vec3_t origin, delta, dir, vec, up = {0, 0, 1};
float c, len;
float progress, fade, spread_x, spread_y, vertical_offset, peak_height, rise_progress, fall_progress;
float c, len, distance;
int i, damage, digits[10], numdigits, negative;
float progress, fade, spread_x, spread_y, vertical_offset, peak_height;

re = &le->refEntity;

c = ( le->endTime - cg.time ) * le->lifeRate;

damage = le->radius;

// Color based on damage amount - gradient from white to red
if (damage >= 50) {
// Color based on damage amount - gradient from blue to red
if (damage > 75) {
// Red
re->shaderRGBA[0] = 0xff;
re->shaderRGBA[1] = 0x00;
re->shaderRGBA[2] = 0x00;
} else if (damage >= 25) {
} else if (damage > 50) {
// Orange
re->shaderRGBA[0] = 0xff;
re->shaderRGBA[1] = 0x80;
re->shaderRGBA[2] = 0x00;
} else if (damage >= 10) {
} else if (damage > 25) {
// Yellow
re->shaderRGBA[0] = 0xff;
re->shaderRGBA[1] = 0xff;
re->shaderRGBA[2] = 0x00;
} else {
re->shaderRGBA[0] = 0xff;
re->shaderRGBA[1] = 0xff;
// Blue
re->shaderRGBA[0] = 0x00;
re->shaderRGBA[1] = 0x80;
re->shaderRGBA[2] = 0xff;
}

// Fade out after 250ms (after peak at 25% progress)
// Fade out after 75% of arc (750ms)
progress = 1.0 - c; // 0.0 at start, 1.0 at end
if (progress < 0.25) {
fade = 1.0; // Full opacity for first 250ms
if (progress < 0.75f) {
fade = 1.0f; // Full opacity for first 750ms
} else {
fade = 1.0 - ((progress - 0.25) / 0.75); // Fade out over remaining 750ms
fade = 1.0f - ((progress - 0.75f) / 0.25f); // Fade out over remaining 250ms
}
re->shaderRGBA[3] = 0xff * fade;

re->radius = NUMBER_SIZE / 2;

VectorCopy(le->pos.trBase, origin);

spread_x = le->pos.trDelta[0] * 70.0 * progress;
spread_y = le->pos.trDelta[1] * 70.0 * progress;
// Calculate distance to base origin for scaling sprite and arc
VectorSubtract( origin, cg.refdef.vieworg, delta );
len = VectorLengthSquared( delta );
if ( len < 20*20 ) {
// if the view would be "inside" the sprite, kill the sprite
CG_FreeLocalEntity( le );
return;
}

distance = sqrt(len);
re->radius = (NUMBER_SIZE / 1280.0f) * distance * tan(cg.refdef.fov_x * M_PI / 360.0f);

// Horizontal spread
spread_x = le->pos.trDelta[0] * 20.0 * re->radius * progress;
spread_y = le->pos.trDelta[1] * 20.0 * re->radius * progress;
origin[0] += spread_x;
origin[1] += spread_y;

peak_height = 30.0 * le->pos.trDelta[2];

if (progress < 0.25) {
rise_progress = progress / 0.25;
vertical_offset = peak_height * (1.0 - (1.0 - rise_progress) * (1.0 - rise_progress));
} else {
fall_progress = (progress - 0.25) / 0.75;
vertical_offset = peak_height - (peak_height + 48.0) * fall_progress * fall_progress;
}
// Vertical arc - symmetric rise and fall over the full duration
// Uses sine wave for smooth, even arc that peaks at 50% progress
peak_height = 15.0 * le->pos.trDelta[2] * re->radius;
vertical_offset = peak_height * sin(progress * M_PI);
origin[2] += vertical_offset;

VectorSubtract(cg.refdef.vieworg, origin, dir);
CrossProduct(dir, up, vec);
VectorNormalize(vec);

// if the view would be "inside" the sprite, kill the sprite
VectorSubtract( origin, cg.refdef.vieworg, delta );
len = VectorLength( delta );
if ( len < 20 ) {
CG_FreeLocalEntity( le );
return;
}

negative = qfalse;
if (damage < 0) {
negative = qtrue;
Expand All @@ -945,7 +947,7 @@ void CG_AddDamagePlum( localEntity_t *le ) {
}

for (i = 0; i < numdigits; i++) {
VectorMA(origin, (float) (((float) numdigits / 2) - i) * NUMBER_SIZE, vec, re->origin);
VectorMA(origin, (float) (((float) numdigits / 2) - i) * (re->radius * 2), vec, re->origin);
re->customShader = cgs.media.numberShaders[digits[numdigits-1-i]];
trap_R_AddRefEntityToScene( re );
}
Expand Down
2 changes: 1 addition & 1 deletion code/game/g_combat.c
Original file line number Diff line number Diff line change
Expand Up @@ -1053,7 +1053,7 @@ void G_Damage( gentity_t *targ, gentity_t *inflictor, gentity_t *attacker,
attacker->client->damagePlums[attacker->client->damagePlumCount].clientNum = targ->s.number;
attacker->client->damagePlums[attacker->client->damagePlumCount].damage = take + asave;
VectorCopy( targ->r.currentOrigin, attacker->client->damagePlums[attacker->client->damagePlumCount].origin );
attacker->client->damagePlums[attacker->client->damagePlumCount].origin[2] += 48;
attacker->client->damagePlums[attacker->client->damagePlumCount].origin[2] += 24;
attacker->client->damagePlumCount++;
}
}
Expand Down