@@ -1231,7 +1231,7 @@ edict_t *CreateObstacle (edict_t *ent, int skill_level)
1231
1231
e -> max_health = OBSTACLE_INITIAL_HEALTH + OBSTACLE_ADDON_HEALTH * skill_level ;
1232
1232
e -> health = 0.5 * e -> max_health ;
1233
1233
e -> dmg = OBSTACLE_INITIAL_DAMAGE + OBSTACLE_ADDON_DAMAGE * skill_level ;
1234
- e -> monsterinfo .nextattack = 100 - 9 * vrx_get_talent_level (ent , TALENT_PHANTOM_OBSTACLE );
1234
+ e -> monsterinfo .nextattack = 100 ; // - 9 * vrx_get_talent_level(ent, TALENT_PHANTOM_OBSTACLE);
1235
1235
e -> monsterinfo .level = skill_level ;
1236
1236
e -> gib_health = -2 * BASE_GIB_HEALTH ;
1237
1237
e -> die = obstacle_die ;
@@ -1510,21 +1510,23 @@ void fire_acid (edict_t *self, vec3_t start, vec3_t aimdir, int projectile_damag
1510
1510
void gasser_acidattack (edict_t * self )
1511
1511
{
1512
1512
float dist ;
1513
- float range = 384 ;
1514
- int speed = 600 ;
1513
+ float range = self -> monsterinfo . sight_range ;
1514
+ int speed = ACID_INITIAL_SPEED ;
1515
1515
vec3_t forward , start , end ;
1516
1516
edict_t * e = NULL ;
1517
1517
1518
1518
if (self -> monsterinfo .attack_finished > level .time )
1519
1519
return ;
1520
1520
1521
1521
VectorCopy (self -> s .origin , start );
1522
- start [2 ] = self -> absmax [2 ] - 16 ;
1522
+ start [2 ] = self -> absmax [2 ] + 1 ; // - 16;
1523
1523
1524
- while ((e = findradius (e , self -> s .origin , range )) != NULL )
1525
- {
1526
- if (!G_ValidTarget (self , e , true, true))
1527
- continue ;
1524
+ e = self -> enemy ;
1525
+ //while ((e = findradius(e, self->s.origin, range)) != NULL)
1526
+ //{
1527
+ if (!G_ValidTarget (self , e , true, true))
1528
+ return ;
1529
+ // continue;
1528
1530
1529
1531
// copy target location
1530
1532
G_EntMidPoint (e , end );
@@ -1539,13 +1541,13 @@ void gasser_acidattack (edict_t *self)
1539
1541
VectorSubtract (end , start , forward );
1540
1542
VectorNormalize (forward );
1541
1543
1542
- fire_acid (self , self -> s . origin , forward , 200 , 64 , speed , 20 , 10.0 );
1544
+ fire_acid (self , start , forward , self -> radius_dmg , ACID_INITIAL_RADIUS , speed , ( 0.1 * self -> radius_dmg ), ACID_DURATION );
1543
1545
1544
1546
//FIXME: only need to do this once
1545
- self -> monsterinfo .attack_finished = level .time + 2.0 ;
1547
+ self -> monsterinfo .attack_finished = level .time + ( 3.0 - ( 0.4 * self -> light_level )); // talent level reduces attack delay
1546
1548
self -> s .frame = GASSER_FRAMES_ATTACK_END - 2 ;
1547
1549
//gi.sound (self, CHAN_VOICE, gi.soundindex ("weapons/twang.wav"), 1, ATTN_NORM, 0);
1548
- }
1550
+ // }
1549
1551
}
1550
1552
1551
1553
void gasser_attack (edict_t * self )
@@ -1558,6 +1560,8 @@ void gasser_attack (edict_t *self)
1558
1560
VectorCopy (self -> s .origin , start );
1559
1561
start [2 ] = self -> absmax [2 ] + 8 ;
1560
1562
SpawnGasCloud (self , start , self -> dmg , self -> dmg_radius , 4.0 );
1563
+ //gi.sound(self, CHAN_VOICE, gi.soundindex("weapons/poisonloopmedium2.wav"), 1, ATTN_NORM, 0);
1564
+ gi .sound (self , CHAN_VOICE , gi .soundindex ("weapons/gas1.wav" ), 1 , ATTN_NORM , 0 );
1561
1565
1562
1566
self -> s .frame = GASSER_FRAMES_ATTACK_START + 2 ;
1563
1567
self -> monsterinfo .attack_finished = level .time + GASSER_REFIRE ;
@@ -1567,7 +1571,7 @@ qboolean gasser_findtarget (edict_t *self)
1567
1571
{
1568
1572
edict_t * e = NULL ;
1569
1573
1570
- while ((e = findclosestradius_targets (e , self , GASSER_RANGE )) != NULL )
1574
+ while ((e = findclosestradius_targets (e , self , self -> monsterinfo . sight_range )) != NULL )
1571
1575
{
1572
1576
if (!G_ValidTarget_Lite (self , e , true))
1573
1577
continue ;
@@ -1592,8 +1596,12 @@ void gasser_think (edict_t *self)
1592
1596
V_HealthCache (self , (int )(0.2 * self -> max_health ), 1 );
1593
1597
1594
1598
if (gasser_findtarget (self ))
1595
- gasser_attack (self );
1596
- //gasser_acidattack(self);
1599
+ {
1600
+ if (entdist (self , self -> enemy ) < self -> dmg_radius )
1601
+ gasser_attack (self );
1602
+ else if (self -> light_level )
1603
+ gasser_acidattack (self );
1604
+ }
1597
1605
1598
1606
if (self -> s .frame < GASSER_FRAMES_ATTACK_END )
1599
1607
G_RunFrames (self , GASSER_FRAMES_ATTACK_START , GASSER_FRAMES_ATTACK_END , false);
@@ -1730,7 +1738,7 @@ void gasser_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damag
1730
1738
gi .linkentity (self );
1731
1739
}
1732
1740
1733
- edict_t * CreateGasser (edict_t * ent , int skill_level )
1741
+ edict_t * CreateGasser (edict_t * ent , int skill_level , int talent_level )
1734
1742
{
1735
1743
edict_t * e ;
1736
1744
@@ -1752,8 +1760,20 @@ edict_t *CreateGasser (edict_t *ent, int skill_level)
1752
1760
e -> health = 0.5 * e -> max_health ;
1753
1761
e -> dmg = GASSER_INITIAL_DAMAGE + GASSER_ADDON_DAMAGE * skill_level ;
1754
1762
e -> dmg_radius = GASSER_INITIAL_ATTACK_RANGE + GASSER_ADDON_ATTACK_RANGE * skill_level ;
1755
-
1756
1763
e -> monsterinfo .level = skill_level ;
1764
+
1765
+ e -> light_level = talent_level ; // Talent: Spitting Gasser
1766
+ if (talent_level )
1767
+ {
1768
+ int acid_level = ent -> myskills .abilities [ACID ].current_level ;
1769
+ if (acid_level < 1 )
1770
+ acid_level = 1 ;
1771
+ e -> radius_dmg = ACID_INITIAL_DAMAGE + ACID_ADDON_DAMAGE * acid_level ;
1772
+ e -> monsterinfo .sight_range = 384 ;
1773
+ }
1774
+ else
1775
+ e -> monsterinfo .sight_range = GASSER_RANGE ;
1776
+
1757
1777
e -> gib_health = -1.25 * BASE_GIB_HEALTH ;
1758
1778
e -> s .frame = GASSER_FRAMES_IDLE_START ;
1759
1779
e -> die = gasser_die ;
@@ -1801,7 +1821,7 @@ void Cmd_Gasser_f (edict_t *ent)
1801
1821
return ;
1802
1822
}
1803
1823
1804
- gasser = CreateGasser (ent , ent -> myskills .abilities [GASSER ].current_level );
1824
+ gasser = CreateGasser (ent , ent -> myskills .abilities [GASSER ].current_level , vrx_get_talent_level ( ent , TALENT_SPITTING_GASSER )); // Talent: Spitting Gasser
1805
1825
if (!G_GetSpawnLocation (ent , 100 , gasser -> mins , gasser -> maxs , start , NULL , PROJECT_HITBOX_FAR , false))
1806
1826
{
1807
1827
ent -> num_gasser -- ;
@@ -2742,6 +2762,9 @@ void acid_touch (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf
2742
2762
return ;
2743
2763
}
2744
2764
2765
+ if (other == ent -> owner )
2766
+ return ;
2767
+
2745
2768
acid_explode (ent );
2746
2769
}
2747
2770
@@ -2786,15 +2809,15 @@ void fire_acid (edict_t *self, vec3_t start, vec3_t aimdir, int projectile_damag
2786
2809
VectorSet (grenade -> avelocity , 300 , 300 , 300 );
2787
2810
}
2788
2811
2789
- #define ACID_INITIAL_DAMAGE 50
2790
- #define ACID_ADDON_DAMAGE 15
2791
- #define ACID_INITIAL_SPEED 600
2792
- #define ACID_ADDON_SPEED 0
2793
- #define ACID_INITIAL_RADIUS 64
2794
- #define ACID_ADDON_RADIUS 0
2795
- #define ACID_DURATION 10.0
2796
- #define ACID_DELAY 0.2
2797
- #define ACID_COST 20
2812
+ // #define ACID_INITIAL_DAMAGE 50
2813
+ // #define ACID_ADDON_DAMAGE 15
2814
+ // #define ACID_INITIAL_SPEED 600
2815
+ // #define ACID_ADDON_SPEED 0
2816
+ // #define ACID_INITIAL_RADIUS 64
2817
+ // #define ACID_ADDON_RADIUS 0
2818
+ // #define ACID_DURATION 10.0
2819
+ // #define ACID_DELAY 0.2
2820
+ // #define ACID_COST 20
2798
2821
2799
2822
void Cmd_FireAcid_f (edict_t * ent )
2800
2823
{
0 commit comments