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