Wing Commander II
Reconstructed Win32 source (1996)
Loading...
Searching...
No Matches
orders.c
Go to the documentation of this file.
1/*
2 * Wingman orders and landing requests.
3 *
4 * Retail object 0x421910-0x42259F (link order; see docs/ORDER.md).
5 */
6#include "game.h"
7
8short g_bEjectionSequencePending = 0; /* 0x00493058 */
9
10/* Function start: 0x421910 */
12{
13 short proximityRadius;
14 short type;
15 short missionIndex;
16 short shipObj;
17 short home;
18 short navObjective;
19
20 navObjective = 0;
22 proximityRadius = g_aMissionNavPoints[
24 while ((type =
25 g_aMissionObjectives[navObjective].type) != -1 &&
26 navObjective < 8) {
27 if (achieved(navObjective) == 0) {
28 missionIndex = g_aMissionObjectives[navObjective].index;
29 switch (type) {
30 case 0:
31 case 1:
32 case 3:
33 if (visited(navObjective) != 0)
34 flag_objective(navObjective, 2);
35 break;
36 case 2:
37 switch (g_aMissionShips[missionIndex].missionType) {
40 shipObj = find_ship_index(missionIndex);
41 if (shipObj != -1 && home != -1 &&
42 distance_from_object(shipObj, home) < proximityRadius)
43 g_aMissionShips[missionIndex].state = 1;
44 if (g_aMissionShips[missionIndex].state == 1 &&
45 sighted(navObjective) != 0) {
46 flag_objective(navObjective, 2);
47 affect_mission_score(0, 8, -1);
48 }
49 break;
51 if (g_aMissionShips[missionIndex].state == 2) {
52 flag_objective(navObjective, 2);
53 affect_mission_score(0, 8, -1);
54 }
55 break;
56 default:
57 if (g_aMissionShips[missionIndex].state == 0 &&
58 sighted(navObjective) != 0) {
59 flag_objective(navObjective, 2);
60 affect_mission_score(0, 8, -1);
61 }
62 }
63 break;
64 case 4:
65 if (g_aMissionShips[missionIndex].state == 3)
66 flag_objective(navObjective, 2);
67 break;
68 }
69 }
70 navObjective++;
71 }
72}
73
74/* Function start: 0x421BC6 */
75short IsShipRouting(short ship)
76{
78 return 1;
79 else
80 return 0;
81}
82
83/* Function start: 0x421BFC */
84void SendWingmanCommandAcknowledgement(short ship, short accepted)
85{
86 if (accepted == 1) {
87 send_message(ship, 0);
88 return;
89 }
90 send_message(ship, 1);
91}
92
93short report_kilrathi_rout(int mode);
94short detect_enemy_tail(short obj);
95short any_enemy(short obj, short range);
96void engage(short obj, short target, short objective);
97unsigned int reset_objective(short ship, short objective);
98unsigned int alter_objective(short ship, short objective);
99short IsShipRouting(short ship);
100
101/* Function start: 0x421C35 */
102short disobey_formation(short ship)
103{
104 if (ship != g_nYourWingman)
105 return 0;
107 case 1:
108 return report_kilrathi_rout(0);
109 case 2:
110 return detect_enemy_tail(0) != -1;
111 case 3:
112 return 1;
113 case 4:
114 return any_enemy(ship, 5000);
115 default:
116 return 0;
117 }
118}
119
120/* Function start: 0x421CF6 */
121short IsEngagementTargetDisallowed(short ship, short target)
122{
123 return target == ship ||
124 g_asShipSide[target] == g_asShipSide[ship] ||
125 IsShipRouting(ship) != 0;
126}
127
128/* Function start: 0x421D59 */
129short CanPlayerLand(void)
130{
131 short index;
132 short ok;
133
134 ok = 0;
135 for (index = 0; index < 10; index++) {
136 if (g_aeObjectClass[index] >= OBJECT_CLASS_SHIP &&
137 g_asShipSide[index] == SIDE_KILRATHI)
138 return 0;
139 }
141 ok = 1;
142 for (index = 0; index < g_cMissionObjectiveCount; index++) {
143 if (g_aMissionObjectives[index].type != 1 &&
144 (achieved(index) != 0 ||
145 (visited(index) != 0 &&
146 g_aMissionObjectives[index].type != 2)))
147 ok = 1;
148 }
149 return ok;
150}
151
152short any_enemy(short obj, short range);
153short triumph(short obj);
154void request(short requester, short ship, short command);
155
156/* Function start: 0x421E6D */
157short ShouldWingmanAcceptRoutCommand(short ship, short pilot)
158{
159 if (pilot <= 4 || ship != g_nYourWingman)
160 return 1;
161 else
163 case 1:
164 return 0;
165 case 2:
166 return any_enemy(0, 10000) == 0;
167 case 3:
168 return any_enemy(ship, 5000) == 0;
169 case 4:
170 return triumph(0);
171 case 5:
172 return g_asShipMissionType[ship] ==
174 default:
175 return 1;
176 }
177}
178
179void SendWingmanCommandAcknowledgement(short ship, short accepted);
180
181/* Function start: 0x421F86 */
182void request(short requester, short ship, short command)
183{
184 short target;
185 short object;
186
187 target = g_acShipTarget[requester];
188 switch (command) {
189 case 0:
190 break;
191 case 3:
193 g_asPilotLevel[ship]) != 0 &&
194 try2rout(ship) != 0) {
197 } else {
199 }
200 break;
201 case 1:
202 allow_engage();
203 if (IsEngagementTargetDisallowed(ship, target) != 0 ||
204 (ShipHasTorpedo(ship) == 0 &&
205 CanShipWeaponDamageTarget(ship, target) == 0)) {
207 } else {
208 engage(ship, target, OBJECTIVE_ENGAGE_ENEMY);
210 }
211 break;
212 case 2:
213 allow_engage();
214 target = -1;
215 for (object = 0; object < 10; object++) {
216 if (g_aeObjectClass[object] >= OBJECT_CLASS_SHIP &&
217 g_aeSpecialManeuver[object] !=
219 g_asShipSide[ship] !=
220 g_asShipSide[object] &&
221 g_acShipTarget[object] == requester) {
222 target = object;
223 break;
224 }
225 }
226 if (target == -1) {
227 request(requester, ship, 6);
228 } else {
229 engage(ship, target, OBJECTIVE_ENGAGE_ENEMY);
231 }
232 break;
233 case 4:
234 allow_engage();
238 } else {
240 }
241 break;
242 case 6:
244 if (disobey_formation(ship) == 0) {
246 } else {
248 g_nAutoEngageTimer = -150;
250 }
251 break;
252 case 5:
254 if (disobey_formation(ship) == 0) {
257 } else {
258 g_nAutoEngageTimer = -150;
260 }
261 break;
262 case 7:
263 case 8:
264 g_bRadioSilence = 0;
266 if (command == 7)
267 g_bRadioSilence = 1;
268 else
269 g_bRadioSilence = 0;
270 break;
271 case 11:
273 if (CanPlayerLand() != 0) {
275 send_message(ship, 0x12);
276 } else {
277 send_message(ship, 0x13);
278 }
279 break;
280 case 12:
282 if (CanPlayerLand() != 0) {
284 send_message(ship, 0x14);
286 } else {
287 send_message(ship, 0x15);
288 }
289 break;
290 case 9:
291 if (g_ucPendingEjectionTransition != 0xff &&
296 } else if (g_asShipMissionIndex[ship] !=
298 send_message(ship, 0x11);
299 } else {
301 if (CanPlayerLand() != 0) {
303 send_message(ship, 0x10);
304 } else {
305 send_message(ship, 0x11);
306 }
307 }
308 break;
309 case 20:
310 case 21:
311 case 22:
312 case 23:
313 case 24:
314 case 25:
315 case 26:
316 case 27:
317 case 28:
318 case 29:
319 case 30:
320 case 31:
321 if (RandomBelow(100) < 70 ||
322 (g_asPilotLevel[ship] == 5 &&
323 g_asShipSide[ship] == SIDE_KILRATHI)) {
324 send_message(ship,
325 (signed char)(command + 0x19 -
328 (short)(g_nEnemyTauntCommandBase | 1);
329 }
330 if (g_acShipTarget[ship] != requester &&
331 IsShipRouting(ship) == 0)
332 engage(ship, requester, OBJECTIVE_ENGAGE_ENEMY);
333 break;
334 case 10:
335 if (g_asShipSide[target] != SIDE_KILRATHI) {
336 send_message(ship, 0xf);
337 g_asShipIdentified[ship] = 1;
338 }
339 break;
340 case 13:
341 if (g_nYourWingman != -1) {
342 send_message(ship, 0xf);
344 }
345 break;
346 }
347}
short disobey_formation(short ship)
Definition orders.c:102
void disallow_engage(void)
Definition brains.c:199
void ejection_sequence(short outcome, signed char restoreCockpit)
Definition midscene.c:63
unsigned int alter_objective(short ship, short objective)
Definition logic.c:453
void affect_mission_score(short pilot, int event, short amount)
Definition ship.c:1621
short sighted(short objective)
Definition cockpt.c:1134
short IsEngagementTargetDisallowed(short ship, short target)
Definition orders.c:121
short any_enemy(short obj, short range)
Definition logic.c:610
short CanShipWeaponDamageTarget(short ship, short target)
Definition ship.c:87
short distance_from_object(short obj, short other)
Definition geom.c:547
void SendWingmanCommandAcknowledgement(short ship, short accepted)
Definition orders.c:84
short visited(short objective)
Definition cockpt.c:1140
short achieved(short objective)
Definition cockpt.c:1146
void cleanup_objectives(void)
Definition orders.c:11
short triumph(short obj)
Definition logic.c:983
unsigned int reset_objective(short ship, short objective)
Definition logic.c:445
short RandomBelow(short n)
Definition eventmgr.c:12
void engage(short obj, short target, short objective)
Definition logic.c:952
short try2rout(short obj)
Definition logic.c:272
short report_kilrathi_rout(int mode)
Definition logic.c:214
short detect_enemy_tail(short obj)
Definition logic.c:330
short CanPlayerLand(void)
Definition orders.c:129
void send_message(short obj, signed char message)
Definition cockpt.c:3116
void flag_objective(short objective, unsigned char flags)
Definition cockpt.c:1153
short IsShipRouting(short ship)
Definition orders.c:75
void allow_engage(void)
Definition brains.c:205
short ShipHasTorpedo(short ship)
Definition ship.c:122
void request(short requester, short ship, short command)
Definition orders.c:182
short find_ship_index(short missionShip)
Definition logic.c:251
short ShouldWingmanAcceptRoutCommand(short ship, short pilot)
Definition orders.c:157
Shared Win32 declarations, types and library interfaces.
@ MISSION_TYPE_WARP_ARRIVE
Definition game_data.h:129
@ MISSION_TYPE_CANNED_SEQUENCE
Definition game_data.h:132
@ MISSION_TYPE_GOTO_WARP
Definition game_data.h:128
@ MISSION_TYPE_ROUT
Definition game_data.h:127
@ MISSION_TYPE_COME_HOME
Definition game_data.h:131
@ SIDE_KILRATHI
Definition game_data.h:176
@ OBJECTIVE_ENGAGE_ENEMY
Definition game_data.h:145
@ OBJECTIVE_HOLD_FORMATION
Definition game_data.h:147
@ OBJECTIVE_BREAK_FORMATION
Definition game_data.h:148
@ SPECIAL_MANEUVER_UNKNOWN_9
Definition game_data.h:269
@ OBJECT_CLASS_SHIP
Definition game_data.h:49
short g_nEnemyTauntCommandBase
Definition comm.c:9
short g_nYourWingman
Definition viewrect.c:75
short g_asPilotLevel[12]
Definition viewrect.c:157
short g_aeObjectClass[SPACE_OBJECT_COUNT]
Definition viewrect.c:125
short g_asShipIdentified[12]
Definition viewrect.c:182
signed char g_acShipTarget[16]
Definition viewrect.c:167
MissionNavPoint g_aMissionNavPoints[MISSION_NAV_POINT_COUNT]
Definition hotspot.c:237
signed char g_bRadioSilence
Definition comm.c:14
signed char g_cMissionObjectiveCount
Definition viewrect.c:66
short g_aeSpecialManeuver[12]
Definition viewrect.c:141
short g_bEjectionAwaitingCommCommand
Definition mission.c:13
unsigned char g_ucPendingEjectionTransition
Definition mission.c:11
short g_6_nHomeOperationShipIndexValue
Definition cockpt.c:3806
signed char g_bLandingCommRequestPending
Definition spc.c:9
short g_bDisplayWingmanTargetData
Definition viewrect.c:77
ShipIntelligenceMetadata g_stWingmanIntelligence
Definition viewrect.c:193
short g_nAutoEngageTimer
Definition viewrect.c:191
signed char g_36_cPilotKillCountValue
Definition gameflow.c:3811
short g_bEngageAllowed
Definition viewrect.c:190
short g_asShipMissionIndex[12]
Definition viewrect.c:153
short g_aeShipObjective[12]
Definition viewrect.c:166
MissionObjective g_aMissionObjectives[MISSION_OBJECTIVE_COUNT]
Definition viewrect.c:69
MissionShipRecord g_aMissionShips[MISSION_SHIP_COUNT]
Definition hotspot.c:240
short g_asShipMissionType[12]
Definition viewrect.c:163
short g_asShipSide[12]
Definition viewrect.c:139
short g_bEjectionSequencePending
Definition orders.c:8
MissionHeader g_13_stMissionHeaderBlock
Definition hotspot.c:253
short wingmanMissionShip
Definition game_data.h:1344
short entryNavPoint
Definition game_data.h:1343
short proximityRadius
Definition game_data.h:1328
signed char index
Definition game_data.h:1417
signed char state
Definition game_data.h:1380