@@ -35,24 +35,35 @@ qboolean p_medic_healframe (edict_t *ent)
3535}
3636
3737edict_t * CreateSpiker (edict_t * ent , int skill_level );
38- edict_t * CreateObstacle (edict_t * ent , int skill_level );
38+ edict_t * CreateObstacle (edict_t * ent , int skill_level , int talent_level );
3939edict_t * CreateGasser (edict_t * ent , int skill_level , int talent_level );
4040edict_t * CreateCocoon (edict_t * ent , int skill_level );
4141edict_t * CreateHealer (edict_t * ent , int skill_level );
4242
4343void p_medic_reanimate (edict_t * ent , edict_t * target )
4444{
45+ int res_level ;
4546 int skill_level ;
47+ float skill_bonus ;
4648 vec3_t bmin , bmax ;
4749 edict_t * e ;
4850
49- skill_level = floattoint ((1.0 + MEDIC_RESURRECT_BONUS )* ent -> myskills .abilities [MEDIC ].current_level );
51+ // calculate skill bonus from medic
52+ skill_bonus = MEDIC_RESURRECT_BASE + MEDIC_RESURRECT_BONUS * ent -> myskills .abilities [MEDIC ].current_level ;
53+ // save the original monster's level so we don't apply the bonus more than once
54+ if (!target -> monsterinfo .resurrected_level )
55+ res_level = target -> monsterinfo .resurrected_level = target -> monsterinfo .level ;
56+ else
57+ res_level = target -> monsterinfo .resurrected_level ;
58+ // calculate skill level of resurrected monster with bonus applied
59+ skill_level = floattoint (target -> monsterinfo .resurrected_level * skill_bonus );
60+ //target->monsterinfo.level = skill_level; // set level with resurrect bonus
5061
5162 if (!strcmp (target -> classname , "drone" )
5263 && (ent -> num_monsters + target -> monsterinfo .control_cost <= MAX_MONSTERS )
5364 && !(target -> flags & FL_UNDEAD ) && target -> mtype != M_DECOY && target -> mtype != M_GOLEM ) // don't revive decoys, golem, and undead (skeletons)
5465 {
55- target -> monsterinfo .level = skill_level ;
66+ target -> monsterinfo .level = skill_level ; // set level with resurrect bonus
5667 M_SetBoundingBox (target -> mtype , bmin , bmax );
5768
5869 if (G_IsValidLocation (target , target -> s .origin , bmin , bmax ) && M_Initialize (ent , target , 0.0f ))
@@ -65,6 +76,7 @@ void p_medic_reanimate (edict_t *ent, edict_t *target)
6576 target -> monsterinfo .resurrected_time = level .time + 2.0 ;
6677 target -> activator = ent ; // transfer ownership!
6778 target -> nextthink = level .time + MEDIC_RESURRECT_DELAY ;
79+ target -> monsterinfo .resurrected_timeout = target -> nextthink + MEDIC_RESURRECT_TIMEOUT ; // resurrected monster dies when this timer is exceeded
6880 gi .linkentity (target );
6981 target -> monsterinfo .stand (target );
7082
@@ -111,6 +123,7 @@ void p_medic_reanimate (edict_t *ent, edict_t *target)
111123
112124 e -> activator = ent ;
113125 e -> monsterinfo .level = skill_level ;
126+ e -> monsterinfo .resurrected_level = res_level ;
114127 M_Initialize (ent , e , 0.0f );
115128 e -> health = 0.2f * e -> max_health ;
116129 e -> monsterinfo .power_armor_power = 0.2f * e -> monsterinfo .max_armor ;
@@ -134,7 +147,7 @@ void p_medic_reanimate (edict_t *ent, edict_t *target)
134147 VectorCopy (start , e -> s .origin );
135148 gi .linkentity (e );
136149 e -> nextthink = level .time + MEDIC_RESURRECT_DELAY ;
137-
150+ e -> monsterinfo . resurrected_timeout = e -> nextthink + MEDIC_RESURRECT_TIMEOUT ; // resurrected monster dies when this timer is exceeded
138151 ent -> num_monsters += e -> monsterinfo .control_cost ;
139152 ent -> num_monsters_real ++ ;
140153 // gi.bprintf(PRINT_HIGH, "adding %p (%d) \n", target, ent->num_monsters_real);
@@ -154,6 +167,8 @@ void p_medic_reanimate (edict_t *ent, edict_t *target)
154167 return ;
155168 }
156169
170+ e -> monsterinfo .resurrected_level = res_level ;
171+ e -> monsterinfo .resurrected_timeout = e -> nextthink + MEDIC_RESURRECT_TIMEOUT ; // resurrected spiker dies when this timer is exceeded
157172 VectorCopy (target -> s .angles , e -> s .angles );
158173 e -> s .angles [PITCH ] = 0 ;
159174 e -> monsterinfo .cost = target -> monsterinfo .cost ;
@@ -168,7 +183,7 @@ void p_medic_reanimate (edict_t *ent, edict_t *target)
168183 }
169184 else if (!strcmp (target -> classname , "obstacle" ) && ent -> num_obstacle + 1 <= OBSTACLE_MAX_COUNT )
170185 {
171- e = CreateObstacle (ent , skill_level );
186+ e = CreateObstacle (ent , skill_level , vrx_get_talent_level ( ent , TALENT_MAGNETISM ) );
172187 // target obstacle is flipped
173188 if (target -> s .angles [PITCH ] == 180 )
174189 {
@@ -191,7 +206,8 @@ void p_medic_reanimate (edict_t *ent, edict_t *target)
191206 return ;
192207 }
193208 //gi.dprintf("obstacle will fit\n");
194-
209+ e -> monsterinfo .resurrected_level = res_level ;
210+ e -> monsterinfo .resurrected_timeout = e -> nextthink + MEDIC_RESURRECT_TIMEOUT ; // resurrected obstacle dies when this timer is exceeded
195211 e -> monsterinfo .cost = target -> monsterinfo .cost ;
196212 e -> health = 0.33 * e -> max_health ;
197213 e -> s .frame = 6 ;
@@ -213,7 +229,8 @@ void p_medic_reanimate (edict_t *ent, edict_t *target)
213229 G_FreeEdict (e );
214230 return ;
215231 }
216-
232+ e -> monsterinfo .resurrected_level = res_level ;
233+ e -> monsterinfo .resurrected_timeout = e -> nextthink + MEDIC_RESURRECT_TIMEOUT ; // resurrected gasser dies when this timer is exceeded
217234 VectorCopy (target -> s .angles , e -> s .angles );
218235 e -> s .angles [PITCH ] = 0 ;
219236 e -> monsterinfo .cost = target -> monsterinfo .cost ;
@@ -238,6 +255,8 @@ void p_medic_reanimate (edict_t *ent, edict_t *target)
238255 return ;
239256 }
240257
258+ e -> monsterinfo .resurrected_level = res_level ;
259+ e -> monsterinfo .resurrected_timeout = e -> nextthink + MEDIC_RESURRECT_TIMEOUT ; // resurrected spiker dies when this timer is exceeded
241260 VectorCopy (target -> s .angles , e -> s .angles );
242261 e -> s .angles [PITCH ] = 0 ;
243262 e -> monsterinfo .cost = target -> monsterinfo .cost ;
@@ -261,6 +280,8 @@ void p_medic_reanimate (edict_t *ent, edict_t *target)
261280 return ;
262281 }
263282
283+ e -> monsterinfo .resurrected_level = res_level ;
284+ e -> monsterinfo .resurrected_timeout = e -> nextthink + MEDIC_RESURRECT_TIMEOUT ; // resurrected healer dies when this timer is exceeded
264285 VectorCopy (target -> s .angles , e -> s .angles );
265286 e -> s .angles [PITCH ] = 0 ;
266287 //e->monsterinfo.cost = target->monsterinfo.cost;
0 commit comments