diff options
-rw-r--r-- | src/cgame/cg_ents.c | 12 | ||||
-rw-r--r-- | src/game/bg_misc.c | 43 | ||||
-rw-r--r-- | src/game/bg_public.h | 4 | ||||
-rw-r--r-- | src/game/g_weapon.c | 49 |
4 files changed, 44 insertions, 64 deletions
diff --git a/src/cgame/cg_ents.c b/src/cgame/cg_ents.c index f2c4d8a0..8f872f31 100644 --- a/src/cgame/cg_ents.c +++ b/src/cgame/cg_ents.c @@ -810,19 +810,19 @@ static void CG_Lev2ZapChain( centity_t *cent ) int i; entityState_t *es; centity_t *source = NULL, *target = NULL, *attacker = NULL; - int targets[ LEVEL2_AREAZAP_MAX_TARGETS + 1 ]; + int targets[ LEVEL2_AREAZAP_MAX_TARGETS ], creator; es = ¢->currentState; - BG_UnpackZapTargets( es, targets, LEVEL2_AREAZAP_MAX_TARGETS + 1 ); - attacker = &cg_entities[ targets[ 0 ] ]; + BG_UnpackZapTargets( es, &creator, targets, LEVEL2_AREAZAP_MAX_TARGETS + 1 ); + attacker = &cg_entities[ creator ]; - for( i = 1; i < LEVEL2_AREAZAP_MAX_TARGETS + 1; i++ ) + for( i = 0; i < LEVEL2_AREAZAP_MAX_TARGETS; i++ ) { - if( i == 1 ) + if( i == 0 ) source = attacker; else - source = &cg_entities[ targets[ 1 ] ]; + source = &cg_entities[ targets[ 0 ] ]; if( targets[ i ] == ENTITYNUM_NONE ) continue; diff --git a/src/game/bg_misc.c b/src/game/bg_misc.c index d969fea1..79bdb09f 100644 --- a/src/game/bg_misc.c +++ b/src/game/bg_misc.c @@ -3466,10 +3466,11 @@ int atoi_neg( char *token, qboolean allowNegative ) =============== BG_PackZapTargets -pack up to 12 entityNums into an entityState_t +pack up to 12 targets into an entityState_t =============== */ -void BG_PackZapTargets( entityState_t *es, int *entityNums, int count ) +//FIXME: magic - 1 and count makes no sense +void BG_PackZapTargets( entityState_t *es, int creator, const int *targets, int count ) { int i; es->misc = es->time = es->time2 = es->constantLight = 0; @@ -3477,13 +3478,20 @@ void BG_PackZapTargets( entityState_t *es, int *entityNums, int count ) { int entityNum = ENTITYNUM_NONE; if( i < count ) - entityNum = entityNums[i]; + { + if( i == 0 ) + entityNum = creator; + else + entityNum = targets[ i - 1 ]; + } + if( entityNum & ~(GENTITYNUM_MASK) ) { - Com_Printf("Warning: BG_PackZapTargets: entityNums[%d] (%d) doesn't fit in %d bits, using ENTITYNUM_NONE", - i, entityNums[i], GENTITYNUM_BITS); + Com_Printf("Warning: BG_PackZapTargets: targets[%d] (%d) doesn't fit in %d bits, using ENTITYNUM_NONE\n", + i, targets[i], GENTITYNUM_BITS); entityNum = ENTITYNUM_NONE; } + switch( i ) { case 0: @@ -3523,10 +3531,10 @@ void BG_PackZapTargets( entityState_t *es, int *entityNums, int count ) =============== BG_UnpackZapTargets -unpacks the 12 entityNums in an entityState_t +unpacks the 12 targets in an entityState_t =============== */ -void BG_UnpackZapTargets( entityState_t *es, int *entityNums, int count ) +void BG_UnpackZapTargets( entityState_t *es, int *creator, int *targets, int count ) { int i; for( i = 0; i < count; i++ ) @@ -3534,34 +3542,35 @@ void BG_UnpackZapTargets( entityState_t *es, int *entityNums, int count ) switch( i ) { case 0: - entityNums[i] = es->misc & GENTITYNUM_MASK; + if(creator) + *creator = es->misc & GENTITYNUM_MASK; break; case 1: - entityNums[i] = es->time & GENTITYNUM_MASK; + targets[ i - 1 ] = es->time & GENTITYNUM_MASK; break; case 2: - entityNums[i] = (es->time >> GENTITYNUM_BITS) & GENTITYNUM_MASK; + targets[ i - 1 ] = (es->time >> GENTITYNUM_BITS) & GENTITYNUM_MASK; break; case 3: - entityNums[i] = (es->time >> (GENTITYNUM_BITS * 2)) & GENTITYNUM_MASK; + targets[ i - 1 ] = (es->time >> (GENTITYNUM_BITS * 2)) & GENTITYNUM_MASK; break; case 4: - entityNums[i] = es->time2 & GENTITYNUM_MASK; + targets[ i - 1 ] = es->time2 & GENTITYNUM_MASK; break; case 5: - entityNums[i] = (es->time2 >> GENTITYNUM_BITS) & GENTITYNUM_MASK; + targets[ i - 1 ] = (es->time2 >> GENTITYNUM_BITS) & GENTITYNUM_MASK; break; case 6: - entityNums[i] = (es->time2 >> (GENTITYNUM_BITS * 2)) & GENTITYNUM_MASK; + targets[ i - 1 ] = (es->time2 >> (GENTITYNUM_BITS * 2)) & GENTITYNUM_MASK; break; case 7: - entityNums[i] = es->constantLight & GENTITYNUM_MASK; + targets[ i - 1 ] = es->constantLight & GENTITYNUM_MASK; break; case 8: - entityNums[i] = (es->constantLight >> GENTITYNUM_BITS) & GENTITYNUM_MASK; + targets[ i - 1 ] = (es->constantLight >> GENTITYNUM_BITS) & GENTITYNUM_MASK; break; case 9: - entityNums[i] = (es->constantLight >> (GENTITYNUM_BITS * 2)) & GENTITYNUM_MASK; + targets[ i - 1 ] = (es->constantLight >> (GENTITYNUM_BITS * 2)) & GENTITYNUM_MASK; break; } } diff --git a/src/game/bg_public.h b/src/game/bg_public.h index 2ec0435d..cfe456c5 100644 --- a/src/game/bg_public.h +++ b/src/game/bg_public.h @@ -1114,8 +1114,8 @@ int BG_PlayerPoisonCloudTime( playerState_t *ps ); weapon_t BG_GetPlayerWeapon( playerState_t *ps ); qboolean BG_HasEnergyWeapon( playerState_t *ps ); -void BG_PackZapTargets( entityState_t *es, int *entityNums, int count ); -void BG_UnpackZapTargets( entityState_t *es, int *entityNums, int count ); +void BG_PackZapTargets( entityState_t *es, int creator, const int *entityNums, int count ); +void BG_UnpackZapTargets( entityState_t *es, int *creator, int *entityNums, int count ); const buildableAttributes_t *BG_BuildableByName( const char *name ); const buildableAttributes_t *BG_BuildableByEntityName( const char *name ); diff --git a/src/game/g_weapon.c b/src/game/g_weapon.c index a9849572..b150d65f 100644 --- a/src/game/g_weapon.c +++ b/src/game/g_weapon.c @@ -1161,20 +1161,19 @@ static void G_UpdateZapEffect( zap_t *zap ) { int j; gentity_t *effect = zap->effectChannel; - int targets[MAX_ZAP_TARGETS + 1]; + int targets[MAX_ZAP_TARGETS]; effect->s.eType = ET_LEV2_ZAP_CHAIN; effect->classname = "lev2zapchain"; G_SetOrigin( effect, zap->creator->s.origin ); - targets[ 0 ] = zap->creator->s.number; for( j = 0; j < zap->numTargets; j++ ) { int number = zap->targets[ j ]->s.number; - targets[ j + 1 ] = number; + targets[ j ] = number; } - BG_PackZapTargets( &effect->s, targets, zap->numTargets ); + BG_PackZapTargets( &effect->s, zap->creator->s.number, targets, zap->numTargets); trap_LinkEntity( effect ); } @@ -1203,13 +1202,18 @@ static void G_CreateNewZap( gentity_t *creator, gentity_t *target ) zap->targets[ 0 ] = target; zap->numTargets = 1; - - for( j = 1; j < MAX_ZAP_TARGETS && zap->targets[ j - 1 ]; j++ ) + G_Damage( target, creator , zap->creator, forward, target->s.origin, + LEVEL2_AREAZAP_DMG, DAMAGE_NO_KNOCKBACK | DAMAGE_NO_LOCDAMAGE, MOD_LEVEL2_ZAP ); + for( j = 1; j < MAX_ZAP_TARGETS; j++ ) { zap->targets[ j ] = G_FindNewZapTarget( zap->targets[ 0 ] ); if( zap->targets[ j ] ) + { zap->numTargets++; + G_Damage( zap->targets[ j ], zap->targets[ 0 ] , zap->creator, forward, target->s.origin, + LEVEL2_AREAZAP_DMG, DAMAGE_NO_KNOCKBACK | DAMAGE_NO_LOCDAMAGE, MOD_LEVEL2_ZAP ); + } } zap->effectChannel = G_Spawn( ); @@ -1230,7 +1234,6 @@ void G_UpdateZaps( int msec ) { int i, j; zap_t *zap; - int damage; for( i = 0; i < MAX_ZAPS; i++ ) { @@ -1256,38 +1259,6 @@ void G_UpdateZaps( int msec ) } } - if( zap->numTargets ) - { - damage = ceil( ( (float)msec / LEVEL2_AREAZAP_TIME ) * - LEVEL2_AREAZAP_DMG ); - - // don't let a high msec value inflate the total damage - if( damage + zap->damageUsed > LEVEL2_AREAZAP_DMG ) - damage = LEVEL2_AREAZAP_DMG - zap->damageUsed; - - for( j = 0; j < zap->numTargets; j++ ) - { - gentity_t *source; - gentity_t *target = zap->targets[ j ]; - vec3_t forward; - - if( j == 0 ) - source = zap->creator; - else - source = zap->targets[ 0 ]; - - VectorSubtract( target->s.origin, source->s.origin, forward ); - VectorNormalize( forward ); - - //do the damage - if( damage ) - { - G_Damage( target, source, zap->creator, forward, target->s.origin, - damage, DAMAGE_NO_KNOCKBACK | DAMAGE_NO_LOCDAMAGE, MOD_LEVEL2_ZAP ); - } - } - } - G_UpdateZapEffect( zap ); zap->timeToLive -= msec; |