1Allows running the original Hexen2 game with a single 2progs.dat file instead of progs.dat + progs2.dat files. 3Not tested much. 4 5In addition, place a file named maplist.txt with only a 0 in 6it in your data1 directory (a sample file is provided here), 7so that the game wouldn't look for a progs2.dat 8 9diff -urNp gamecode-1.27/hc/h2/ai.hc gamecode/hc/h2/ai.hc 10--- gamecode-1.27/hc/h2/ai.hc 2012-09-11 17:02:32.000000000 +0300 11+++ gamecode/hc/h2/ai.hc 2012-09-11 17:10:21.000000000 +0300 12@@ -35,7 +35,13 @@ void()SpiderMeleeBegin; 13 void()spider_onwall_wait; 14 float(entity targ , entity from)infront_of_ent; 15 void(entity proj)mezzo_choose_roll; 16+void()multiplayer_health; 17+void()riderpath_init; 18+void(float move_speed)riderpath_move; 19+float(float move_speed)eidolon_riderpath_move; 20+void() eidolon_guarding; 21 void()hive_die; 22+float()eidolon_check_attack; 23 24 //void()check_climb; 25 26@@ -382,7 +388,18 @@ float r; 27 if (!infront (client)) 28 return FALSE; 29 } 30- 31+ 32+ if (r == RANGE_NEAR) 33+ { 34+ if (client.show_hostile < time && !infront (client)) 35+ return FALSE; 36+ } 37+ else if (r == RANGE_MID) 38+ { 39+ if (!infront (client)) 40+ return FALSE; 41+ } 42+ 43 if (!visible (client)) 44 return FALSE; 45 46@@ -487,7 +504,20 @@ void(float dist) ai_walk = 47 if (FindTarget (FALSE)) 48 return; 49 50- movetogoal (dist); 51+ if(self.classname=="monster_eidolon") 52+ { 53+ if (!self.path_current) 54+ riderpath_init(); 55+ if(!eidolon_riderpath_move(dist)) 56+ { 57+ if(self.think==self.th_walk) 58+ self.think=eidolon_guarding; 59+ } 60+ else if(self.think==eidolon_guarding) 61+ self.think=self.th_walk; 62+ } 63+ else 64+ movetogoal (dist); 65 }; 66 67 68@@ -597,6 +627,11 @@ float() CheckAnyAttack = 69 70 if(self.goalentity==self.controller) 71 return FALSE; 72+ if(self.classname=="monster_eidolon") 73+ if(self.goalentity==self.controller) 74+ return FALSE; 75+ else 76+ return eidolon_check_attack(); 77 78 return CheckAttack (); 79 }; 80@@ -743,11 +778,13 @@ void(float dist) ai_run = 81 82 enemy_infront = infront(self.enemy); 83 enemy_range = range(self.enemy); 84- enemy_yaw = vectoyaw(self.goalentity.origin - self.origin); 85+ if(self.classname!="monster_eidolon") 86+ enemy_yaw = vectoyaw(self.goalentity.origin - self.origin); 87 88 if ((self.attack_state == AS_MISSILE) || (self.attack_state == AS_MELEE)) // turning to attack 89 { 90- ai_attack_face (); 91+ if(self.classname!="monster_eidolon") 92+ ai_attack_face (); 93 return; 94 } 95 96@@ -763,7 +800,20 @@ void(float dist) ai_run = 97 // head straight in 98 // if(self.netname=="spider") 99 // check_climb(); 100- movetogoal (dist); // done in C code... 101+ if(self.classname=="monster_eidolon") 102+ { 103+ if(!self.path_current) 104+ riderpath_init(); 105+ if(!eidolon_riderpath_move(dist)) 106+ { 107+ if(self.think==self.th_run) 108+ eidolon_guarding(); 109+ } 110+ else if(self.think==eidolon_guarding) 111+ self.th_run(); 112+ } 113+ else 114+ movetogoal (dist); // done in C code... 115 }; 116 117 118@@ -1128,6 +1178,6 @@ void func_monsterspawn_spot (void) 119 self.use=spawnspot_activate; 120 } 121 122-void hive_die(){} 123-void spawn_ghost (entity attacker){} 124+//void hive_die(){} 125+//void spawn_ghost (entity attacker){} 126 127diff -urNp gamecode-1.27/hc/h2/progs.src gamecode/hc/h2/progs.src 128--- gamecode-1.27/hc/h2/progs.src 2004-11-29 13:39:59.000000000 +0200 129+++ gamecode/hc/h2/progs.src 2008-04-01 11:36:25.000000000 +0300 130@@ -125,11 +125,11 @@ fangel.hc 131 132 eric.hc 133 134-//rider.hc 135-//pstboar.hc 136-//famhorse.hc 137-//warhorse.hc 138-//dthhorse.hc 139-//eidolon.hc 140+rider.hc 141+pstboar.hc 142+famhorse.hc 143+warhorse.hc 144+dthhorse.hc 145+eidolon.hc 146 147 stats.hc 148 149