Allows running the original Hexen2 game with a single progs.dat file instead of progs.dat + progs2.dat files. Not tested much. If you use this patch, you need to use the new version of hcc in order to compile the gamecode, because the old version of hcc (found in "hcc_old" in the utils directory) will segfault. In addition, place a file named maplist.txt with only a 0 in it in your data1 directory (a sample file is provided here), so that the game wouldn't look for a progs2.dat diff -urN gamecode-1.16/hc/h2/ai.hc gamecode/hc/h2/ai.hc --- gamecode-1.16/hc/h2/ai.hc 2005-01-05 01:48:12.000000000 +0200 +++ gamecode/hc/h2/ai.hc 2005-08-31 01:28:10.000000000 +0300 @@ -35,7 +35,13 @@ void()spider_onwall_wait; float(entity targ , entity from)infront_of_ent; void(entity proj)mezzo_choose_roll; +void()multiplayer_health; +void()riderpath_init; +void(float move_speed)riderpath_move; +float(float move_speed)eidolon_riderpath_move; +void() eidolon_guarding; void()hive_die; +float()eidolon_check_attack; //void()check_climb; @@ -382,7 +388,18 @@ if (!infront (client)) return FALSE; } - + + if (r == RANGE_NEAR) + { + if (client.show_hostile < time && !infront (client)) + return FALSE; + } + else if (r == RANGE_MID) + { + if (!infront (client)) + return FALSE; + } + if (!visible (client)) return FALSE; @@ -488,7 +505,20 @@ if (FindTarget (FALSE)) return; - movetogoal (dist); + if(self.classname=="monster_eidolon") + { + if (!self.path_current) + riderpath_init(); + if(!eidolon_riderpath_move(dist)) + { + if(self.think==self.th_walk) + self.think=eidolon_guarding; + } + else if(self.think==eidolon_guarding) + self.think=self.th_walk; + } + else + movetogoal (dist); }; @@ -598,6 +628,11 @@ if(self.goalentity==self.controller) return FALSE; + if(self.classname=="monster_eidolon") + if(self.goalentity==self.controller) + return FALSE; + else + return eidolon_check_attack(); return CheckAttack (); }; @@ -744,11 +779,13 @@ enemy_infront = infront(self.enemy); enemy_range = range(self.enemy); - enemy_yaw = vectoyaw(self.goalentity.origin - self.origin); + if(self.classname!="monster_eidolon") + enemy_yaw = vectoyaw(self.goalentity.origin - self.origin); if ((self.attack_state == AS_MISSILE) || (self.attack_state == AS_MELEE)) // turning to attack { - ai_attack_face (); + if(self.classname!="monster_eidolon") + ai_attack_face (); return; } @@ -764,7 +801,20 @@ // head straight in // if(self.netname=="spider") // check_climb(); - movetogoal (dist); // done in C code... + if(self.classname=="monster_eidolon") + { + if(!self.path_current) + riderpath_init(); + if(!eidolon_riderpath_move(dist)) + { + if(self.think==self.th_run) + eidolon_guarding(); + } + else if(self.think==eidolon_guarding) + self.th_run(); + } + else + movetogoal (dist); // done in C code... }; @@ -1129,6 +1179,6 @@ self.use=spawnspot_activate; } -void hive_die(){} -void spawn_ghost (entity attacker){} +//void hive_die(){} +//void spawn_ghost (entity attacker){} diff -urN gamecode-1.16/hc/h2/progs.src gamecode/hc/h2/progs.src --- gamecode-1.16/hc/h2/progs.src 2004-11-29 13:39:59.000000000 +0200 +++ gamecode/hc/h2/progs.src 2005-08-31 01:28:10.000000000 +0300 @@ -125,11 +125,11 @@ eric.hc -//rider.hc -//pstboar.hc -//famhorse.hc -//warhorse.hc -//dthhorse.hc -//eidolon.hc +rider.hc +pstboar.hc +famhorse.hc +warhorse.hc +dthhorse.hc +eidolon.hc stats.hc