1 /* ResidualVM - A 3D game interpreter
2  *
3  * ResidualVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the AUTHORS
5  * file distributed with this source distribution.
6  *
7  * Additional copyright for this file:
8  * Copyright (C) 1999-2000 Revolution Software Ltd.
9  * This code is based on source code created by Revolution Software,
10  * used with permission.
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License
14  * as published by the Free Software Foundation; either version 2
15  * of the License, or (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
25  *
26  */
27 
28 #ifndef ICB_SESSION_H
29 #define ICB_SESSION_H
30 
31 #include "engines/icb/p4_generic.h"
32 #include "engines/icb/object_structs.h"
33 #include "engines/icb/common/px_linkeddatafile.h"
34 #include "engines/icb/common/px_game_object.h"
35 #include "engines/icb/common/px_walkarea_integer.h"
36 #include "engines/icb/barriers.h"
37 #include "engines/icb/player.h"
38 #include "engines/icb/map_marker.h"
39 #include "engines/icb/prim_route_builder.h"
40 #include "engines/icb/speech.h"
41 #include "engines/icb/text_sprites.h"
42 #include "engines/icb/string_vest.h"
43 #include "engines/icb/set.h"
44 
45 namespace ICB {
46 
47 enum __chi_think_mode { __FOLLOWING = 1, __LOST = 2, __NOTHING = 3 };
48 
49 enum __chi_do_mode {
50 	__ROUTING,
51 	__INTERACT_FOLLOW,
52 	__PAUSING,
53 	__ANIMATE_TO_THINK,
54 	__ANIMATE_TO_FIGHT_HELP,
55 	__TURN_RND,
56 	__GET_WEAPON_OUT,
57 	__THINKING,
58 	__BUMBLING,
59 	__CHASING,
60 	__GO_CORD_GO,
61 	__FIGHT_HELP,
62 	__DISARM_TO_THINK,
63 	__TURN_TO_FACE_OBJECT
64 };
65 
66 enum __barrier_result {
67 	__BLOCKED, // ran into a wall
68 	__OK, // moved forward
69 	__NUDGED,
70 	__DODGED, // player hit mega
71 	__CORRECTED // ran into wall but was at a shallow enough angle to be corrected
72 };
73 
74 enum __alert { __ASTOOD, __ARUNNING, __AWALKING, __APUNCHING };
75 
76 enum __rtype {
77 	__FULL, // normal route - start and end boxes
78 	__ENDB, // just end box
79 	__STARTB, // just our box
80 	__LASER // straight there - no barriers
81 };
82 
83 #define MAX_extra_floors 12
84 
85 class _floor_cam_list {
86 public:
87 	uint32 num_extra_floors;
88 	uint32 extra_floors[MAX_extra_floors];
89 };
90 
91 #define MAX_player_history 10
92 
93 typedef struct {
94 	uint32 id; // of floor or object
95 	PXreal first_x; // coords recorded as player walks onto floor - chi will route here first
96 	PXreal first_z;
97 	bool8 interaction; // is this item an interaction id or a floor number
98 	uint8 padding1;
99 	uint8 padding2;
100 	uint8 padding3;
101 } _history;
102 
103 #define HISTORY_RUBBER (30 * REAL_ONE)
104 #define MAX_local_history 3
105 #define TIME_to_next_local_history (1 * 12)
106 typedef struct {
107 	PXreal x; // coords recorded as player walks around the floor
108 	PXreal z;
109 } _local_history;
110 
111 #define NO_CAMERA_CHOSEN 0xfffffffe
112 
113 #define MAX_session_objects MAX_props // number of game objects allowed per session (and their structs)
114 // THIS MUST BE A MULTIPLE OF 4
115 // SEE BARRIERS.H FOR MASTER DEFINITION
116 
117 // test lower figure
118 #define MAX_voxel_list 24
119 
120 // how many individual walkareas
121 #define MAX_was 32
122 
123 #define MAX_missing_objects 16
124 #define MAX_missing_object_name_length 32
125 
126 #define MAX_auto_interact 20
127 
128 // fn-new-apply-bullet
129 #define ALWAYS_HIT_DIST (300 * REAL_ONE)
130 
131 #define MAX_conveyors 10
132 
133 #define MAX_footstepFloors 32
134 
135 typedef struct {
136 	bool8 moving;
137 	PXreal x, y, z;
138 	PXreal x1, z1;
139 	PXreal xm, zm;
140 	uint8 pad1;
141 	uint8 pad2;
142 
143 } _conveyor;
144 
145 #define MAX_lift_platforms 10
146 typedef struct {
147 	uint32 id;
148 	PXreal x, y, z;
149 	PXreal x1, z1;
150 
151 } _lift_platform;
152 
153 #define MAX_stairs 32
154 
155 typedef struct {
156 	_route_barrier bar;
157 	PXfloat pan, pan_ref, x, z;
158 
159 	uint8 units;
160 	bool8 up;
161 	uint8 stair_id;
162 	bool8 is_stair;
163 
164 	bool8 live;
165 	uint8 opposite_number; // as in stair id not object id
166 	uint8 pad2;
167 	uint8 pad3;
168 
169 } _stair;
170 
171 class _floor_world;
172 class _game_session {
173 public:
_game_session()174 	_game_session(){};
175 
176 	void ___init(const char *mission, const char *new_session_name);
177 	void ___destruct();
178 
179 	void Pre_initialise_objects();
180 	void Init_objects();
181 
182 	void One_logic_cycle();
183 	void Script_cycle();
184 	void Pre_logic_event_check();
185 	const char *Fetch_session_name();
186 	const char *Fetch_h_session_name(); // file name of #mission//#session
187 	const char *Fetch_session_h_name(); // file name of hash name of this session
188 	const char *Fetch_session_cluster();
189 	uint32 Fetch_session_cluster_hash();
190 	void Initialise_set(const char *name, const char *cluster_name);
191 
192 	// Compute if mega's are on or off current camera and send events to them to say "ON_CAMERA" / "OFF_CAMERA"
193 	void UpdateOnOffCamera();
194 
195 	inline PXcamera &GetCamera();
196 	inline int32 SetOK();
197 	inline void SetReset();
198 
199 	void Stage_draw();
200 	void Stage_draw_poly();
201 	void Display_mega_times();
202 
203 	void UpdateMegaFX();
204 
205 	void Rebuild_working_buffers();
206 	void Render_3d_nicos();
207 	void Show_lit_unlit_diagnostics();
208 
209 	int32 GetSelectedPropId();
210 	void GetSelectedPropRGB(uint8 &r, uint8 &g, uint8 &b);
211 	bool8 IsPropSelected(const char *propName);
212 
213 	int32 GetSelectedMegaId();
214 	void GetSelectedMegaRGB(uint8 &r, uint8 &g, uint8 &b);
215 
216 	uint32 Fetch_number_of_props();
217 	uint32 Fetch_number_of_objects();
218 	_logic *Fetch_object_struct(uint32 id);
219 	uint32 Fetch_cur_id();
220 	uint32 Fetch_script_var();
221 	_object_status Fetch_object_status(uint32 id);
222 	void Set_object_status(uint32 id, _object_status val);
223 	const char *Fetch_object_name(uint32 id);
224 	void Force_context_check(uint32 id);
225 	uint32 Fetch_named_objects_id(const char *name) const;
226 	inline uint32 Fetch_object_integer_variable(const char *pcName, const char *pcVar) const;
227 
228 	uint32 Validate_prop_anim(const char *anim_name);
229 
230 	uint32 Fetch_prop_state(char *prop_name);
231 	void Set_prop_state(char *name, uint32 value);
232 
233 	void Script_version_check();
234 
235 	bool8 Rig_test_mode();
236 
237 	void Custom_simple_animator();
238 	void Custom_button_operated_door();
239 	void Custom_auto_door();
240 
241 	void Reset_all_objects();
242 
243 	void Process_player_floor_status();
244 
245 	void Restart_player();
246 
247 	bool8 Engine_start_interaction(const char *script, uint32 id);
248 
249 	void Setup_prop_sleep_states();
250 	void Awaken_doors();
251 
252 	// speech on psx
253 
254 	bool8 can_save, prev_save_state;
Set_can_save(bool8 stat)255 	void Set_can_save(bool8 stat) {
256 		can_save = stat;
257 	}
Can_save()258 	bool8 Can_save() {
259 		return can_save;
260 	}
261 
262 	mcodeFunctionReturnCodes fn_test(int32 &, int32 *);
263 	mcodeFunctionReturnCodes fn_create_mega(int32 &, int32 *);
264 	mcodeFunctionReturnCodes fn_prop_animate(int32 &, int32 *);
265 	mcodeFunctionReturnCodes fn_set_voxel_image_path(int32 &, int32 *);
266 	mcodeFunctionReturnCodes fn_set_xyz(int32 &, int32 *);
267 	mcodeFunctionReturnCodes fn_set_pan(int32 &, int32 *);
268 	mcodeFunctionReturnCodes fn_set_to_floor(int32 &, int32 *);
269 	mcodeFunctionReturnCodes fn_init_from_nico_file(int32 &, int32 *);
270 	mcodeFunctionReturnCodes fn_init_from_marker_file(int32 &, int32 *);
271 	mcodeFunctionReturnCodes fn_shut_down_object(int32 &, int32 *);
272 	mcodeFunctionReturnCodes fn_context_chosen_logic(int32 &, int32 *);
273 	mcodeFunctionReturnCodes fn_pause(int32 &, int32 *);
274 	mcodeFunctionReturnCodes fn_face_coord(int32 &, int32 *);
275 	mcodeFunctionReturnCodes fn_face_object(int32 &, int32 *);
276 	mcodeFunctionReturnCodes fn_play_generic_anim(int32 &, int32 *);
277 	mcodeFunctionReturnCodes fn_play_custom_anim(int32 &, int32 *);
278 	mcodeFunctionReturnCodes fn_start_player_interaction(int32 &, int32 *);
279 	mcodeFunctionReturnCodes fn_custom_prop_interact(int32 &, int32 *);
280 	mcodeFunctionReturnCodes fn_generic_prop_interact(int32 &, int32 *);
281 	mcodeFunctionReturnCodes fn_set_player_can_interact(int32 &, int32 *);
282 	mcodeFunctionReturnCodes fn_set_player_cannot_interact(int32 &, int32 *);
283 	mcodeFunctionReturnCodes fn_register_for_event(int32 &, int32 *);
284 	mcodeFunctionReturnCodes fn_unregister_for_event(int32 &, int32 *);
285 	mcodeFunctionReturnCodes fn_post_event(int32 &, int32 *);
286 	mcodeFunctionReturnCodes fn_call_socket(int32 &, int32 *);
287 	mcodeFunctionReturnCodes fn_register_object_for_event(int32 &, int32 *);
288 	mcodeFunctionReturnCodes fn_unregister_object_for_event(int32 &, int32 *);
289 	mcodeFunctionReturnCodes fn_register_for_line_of_sight(int32 &, int32 *);
290 	mcodeFunctionReturnCodes fn_unregister_for_line_of_sight(int32 &, int32 *);
291 	mcodeFunctionReturnCodes fn_register_object_for_line_of_sight(int32 &, int32 *);
292 	mcodeFunctionReturnCodes fn_unregister_object_for_line_of_sight(int32 &, int32 *);
293 	mcodeFunctionReturnCodes fn_post_future_event(int32 &, int32 *);
294 	mcodeFunctionReturnCodes fn_post_repeating_event(int32 &, int32 *);
295 	mcodeFunctionReturnCodes fn_prop_set_to_first_frame(int32 &, int32 *);
296 	mcodeFunctionReturnCodes fn_prop_set_to_last_frame(int32 &, int32 *);
297 	mcodeFunctionReturnCodes fn_can_see(int32 &, int32 *);
298 	mcodeFunctionReturnCodes fn_can_object_see(int32 &, int32 *);
299 	mcodeFunctionReturnCodes fn_prop_near_a_mega(int32 &, int32 *);
300 	mcodeFunctionReturnCodes socket_force_new_logic(int32 &, int32 *);
301 	mcodeFunctionReturnCodes fn_set_weapon(int32 &, int32 *);
302 	mcodeFunctionReturnCodes fn_request_speech(int32 &, int32 *);
303 	mcodeFunctionReturnCodes fn_add_talker(int32 &, int32 *);
304 	mcodeFunctionReturnCodes fn_issue_speech_request(int32 &, int32 *);
305 	mcodeFunctionReturnCodes fn_confirm_requests(int32 &, int32 *);
306 	mcodeFunctionReturnCodes fn_converse(int32 &, int32 *);
307 	mcodeFunctionReturnCodes fn_anon_speech_invite(int32 &, int32 *);
308 	mcodeFunctionReturnCodes fn_set_mega_field_of_view(int32 &, int32 *);
309 	mcodeFunctionReturnCodes fn_apply_bullet(int32 &, int32 *);
310 	mcodeFunctionReturnCodes fn_add_inventory_item(int32 &, int32 *);
311 	mcodeFunctionReturnCodes fn_remove_inventory_item(int32 &, int32 *);
312 	mcodeFunctionReturnCodes fn_initialise_inventory(int32 &, int32 *);
313 	mcodeFunctionReturnCodes fn_is_carrying(int32 &, int32 *);
314 	mcodeFunctionReturnCodes fn_reset_player(int32 &, int32 *);
315 	mcodeFunctionReturnCodes fn_speak(int32 &, int32 *);
316 	mcodeFunctionReturnCodes speak_object_face_object(int32 &, int32 *);
317 	mcodeFunctionReturnCodes speak_play_generic_anim(int32 &, int32 *);
318 	mcodeFunctionReturnCodes speak_wait_for_everyone(int32 &, int32 *);
319 	mcodeFunctionReturnCodes fn_get_weapon(int32 &, int32 *);
320 	mcodeFunctionReturnCodes fn_rig_test(int32 &, int32 *);
321 	mcodeFunctionReturnCodes fn_item_held(int32 &, int32 *);
322 	mcodeFunctionReturnCodes fn_is_holding(int32 &, int32 *);
323 	mcodeFunctionReturnCodes fn_drop(int32 &, int32 *);
324 	mcodeFunctionReturnCodes fn_set_to_last_frame_generic_anim(int32 &, int32 *);
325 	mcodeFunctionReturnCodes fn_play_common_xa_music(int32 &, int32 *);
326 	mcodeFunctionReturnCodes fn_pass_flag_to_engine(int32 &, int32 *);
327 	mcodeFunctionReturnCodes fn_init_mega_from_nico(int32 &, int32 *);
328 	mcodeFunctionReturnCodes fn_remora_is_active(int32 &, int32 *);
329 	mcodeFunctionReturnCodes fn_easy_play_generic_anim(int32 &, int32 *);
330 	mcodeFunctionReturnCodes fn_teleport(int32 &, int32 *);
331 	mcodeFunctionReturnCodes fn_get_pan_from_nico(int32 &, int32 *);
332 	mcodeFunctionReturnCodes fn_teleport_to_nico(int32 &, int32 *);
333 	mcodeFunctionReturnCodes fn_are_we_on_this_floor(int32 &, int32 *);
334 	mcodeFunctionReturnCodes fn_is_object_on_our_floor(int32 &, int32 *);
335 	mcodeFunctionReturnCodes fn_is_object_on_screen(int32 &, int32 *);
336 	mcodeFunctionReturnCodes fn_is_object_dead(int32 &, int32 *);
337 	mcodeFunctionReturnCodes fn_set_custom(int32 &, int32 *);
338 	mcodeFunctionReturnCodes fn_message(int32 &, int32 *);
339 	mcodeFunctionReturnCodes fn_message_var(int32 &, int32 *);
340 	mcodeFunctionReturnCodes fn_get_state_flag(int32 &, int32 *);
341 	mcodeFunctionReturnCodes fn_clear_all_events(int32 &, int32 *);
342 	mcodeFunctionReturnCodes fn_check_event_waiting(int32 &, int32 *);
343 	mcodeFunctionReturnCodes fn_get_last_event_sender_id(int32 &, int32 *);
344 	mcodeFunctionReturnCodes fn_near(int32 &, int32 *);
345 	mcodeFunctionReturnCodes fn_easy_play_custom_anim(int32 &, int32 *);
346 	mcodeFunctionReturnCodes fn_snap_face_object(int32 &, int32 *);
347 	mcodeFunctionReturnCodes fn_teleport_z(int32 &, int32 *);
348 	mcodeFunctionReturnCodes fn_on_screen(int32 &, int32 *);
349 	mcodeFunctionReturnCodes fn_hold_if_off_screen(int32 &, int32 *);
350 	mcodeFunctionReturnCodes fn_mega_interacts(int32 &, int32 *);
351 	mcodeFunctionReturnCodes fn_restart_object(int32 &, int32 *);
352 	mcodeFunctionReturnCodes fn_object_near_nico(int32 &, int32 *);
353 	mcodeFunctionReturnCodes fn_remora_get_mode(int32 &, int32 *);
354 	mcodeFunctionReturnCodes fn_remora_set_mode(int32 &, int32 *);
355 	mcodeFunctionReturnCodes fn_teleport_y_to_id(int32 &, int32 *);
356 	mcodeFunctionReturnCodes fn_call_socket_id(int32 &, int32 *);
357 	mcodeFunctionReturnCodes fn_lift_process_list(int32 &, int32 *);
358 	mcodeFunctionReturnCodes fn_add_object_name_to_list(int32 &, int32 *);
359 	mcodeFunctionReturnCodes fn_add_object_id_to_list(int32 &, int32 *);
360 	mcodeFunctionReturnCodes fn_post_named_event_to_object(int32 &, int32 *);
361 	mcodeFunctionReturnCodes fn_route_to_nico(int32 &, int32 *);
362 	mcodeFunctionReturnCodes fn_hold_while_list_near_nico(int32 &, int32 *);
363 	mcodeFunctionReturnCodes fn_set_watch(int32 &, int32 *);
364 	mcodeFunctionReturnCodes fn_get_persons_weapon(int32 &, int32 *);
365 	mcodeFunctionReturnCodes fn_kill_me(int32 &, int32 *);
366 	mcodeFunctionReturnCodes fn_kill_object(int32 &, int32 *);
367 	mcodeFunctionReturnCodes fn_set_to_first_frame_custom_anim(int32 &, int32 *);
368 	mcodeFunctionReturnCodes fn_set_to_last_frame_custom_anim(int32 &, int32 *);
369 	mcodeFunctionReturnCodes fn_shut_down_event_processing(int32 &, int32 *);
370 	mcodeFunctionReturnCodes fn_player(int32 &, int32 *);
371 	mcodeFunctionReturnCodes fn_three_sixty_interact(int32 &, int32 *);
372 	mcodeFunctionReturnCodes fn_route_to_marker(int32 &, int32 *);
373 	mcodeFunctionReturnCodes fn_play_mission_xa_music(int32 &, int32 *);
374 	mcodeFunctionReturnCodes fn_play_common_vag_music(int32 &, int32 *);
375 	mcodeFunctionReturnCodes fn_play_mission_vag_music(int32 &, int32 *);
376 	mcodeFunctionReturnCodes fn_near_list(int32 &, int32 *);
377 	mcodeFunctionReturnCodes fn_get_list_result(int32 &, int32 *);
378 	mcodeFunctionReturnCodes fn_event_check_last_sender(int32 &, int32 *);
379 	mcodeFunctionReturnCodes fn_add_icon_to_icon_list(int32 &, int32 *);
380 	mcodeFunctionReturnCodes fn_remove_icon_from_icon_list(int32 &, int32 *);
381 	mcodeFunctionReturnCodes fn_remora_is_email_waiting(int32 &, int32 *);
382 	mcodeFunctionReturnCodes fn_destroy_icon_list(int32 &, int32 *);
383 	mcodeFunctionReturnCodes fn_remora_send_email(int32 &, int32 *);
384 	mcodeFunctionReturnCodes fn_remora_menu_return(int32 &, int32 *);
385 	mcodeFunctionReturnCodes fn_remora_picture(int32 &, int32 *);
386 	mcodeFunctionReturnCodes fn_remora_clear_screen(int32 &, int32 *);
387 	mcodeFunctionReturnCodes fn_new_apply_bullet(int32 &, int32 *);
388 	mcodeFunctionReturnCodes fn_new_script(int32 &, int32 *);
389 	mcodeFunctionReturnCodes fn_random(int32 &, int32 *);
390 	mcodeFunctionReturnCodes fn_change_session(int32 &, int32 *);
391 	mcodeFunctionReturnCodes fn_changed_sessions(int32 &, int32 *);
392 	mcodeFunctionReturnCodes fn_remora_set_current_zoom(int32 &, int32 *);
393 	mcodeFunctionReturnCodes speak_add_chooser_icon(int32 &, int32 *);
394 	mcodeFunctionReturnCodes speak_user_chooser(int32 &, int32 *);
395 	mcodeFunctionReturnCodes fn_is_there_interact_object(int32 &, int32 *);
396 	mcodeFunctionReturnCodes fn_get_interact_object_id(int32 &, int32 *);
397 	mcodeFunctionReturnCodes fn_is_object_interact_object(int32 &, int32 *);
398 	mcodeFunctionReturnCodes speak_chosen(int32 &, int32 *);
399 	mcodeFunctionReturnCodes fn_remora_add_icon(int32 &, int32 *);
400 	mcodeFunctionReturnCodes fn_remora_remove_icon(int32 &, int32 *);
401 	mcodeFunctionReturnCodes fn_remora_reset_icon_list(int32 &, int32 *);
402 	mcodeFunctionReturnCodes fn_remora_choose(int32 &, int32 *);
403 	mcodeFunctionReturnCodes fn_simple_chi(int32 &, int32 *);
404 	mcodeFunctionReturnCodes fn_chi(int32 &, int32 *);
405 	mcodeFunctionReturnCodes speak_menu_still_active(int32 &, int32 *);
406 	mcodeFunctionReturnCodes speak_menu_choices_remain(int32 &, int32 *);
407 	mcodeFunctionReturnCodes speak_close_menu(int32 &, int32 *);
408 	mcodeFunctionReturnCodes speak_new_menu(int32 &, int32 *);
409 	mcodeFunctionReturnCodes speak_end_conversation(int32 &, int32 *);
410 	mcodeFunctionReturnCodes speak_end_menu(int32 &, int32 *);
411 	mcodeFunctionReturnCodes speak_add_special_chooser_icon(int32 &, int32 *);
412 	mcodeFunctionReturnCodes fn_floor_and_floor_camera_linked(int32 &, int32 *);
413 	mcodeFunctionReturnCodes fn_is_object_adjacent(int32 &, int32 *);
414 	mcodeFunctionReturnCodes fn_is_object_on_this_floor(int32 &, int32 *);
415 	mcodeFunctionReturnCodes fn_get_objects_lvar_value(int32 &, int32 *);
416 	mcodeFunctionReturnCodes fn_mega_generic_interact(int32 &, int32 *);
417 	mcodeFunctionReturnCodes fn_set_objects_lvar_value(int32 &, int32 *);
418 	mcodeFunctionReturnCodes fn_is_registered_for_event(int32 &, int32 *);
419 	mcodeFunctionReturnCodes fn_is_object_registered_for_event(int32 &, int32 *);
420 	mcodeFunctionReturnCodes fn_set_object_sight_range(int32 &, int32 *);
421 	mcodeFunctionReturnCodes fn_set_object_sight_height(int32 &, int32 *);
422 	mcodeFunctionReturnCodes fn_switch_on_the_really_neat_and_special_script_debugging_facility(int32 &, int32 *);
423 	mcodeFunctionReturnCodes fn_switch_off_the_really_neat_and_special_script_debugging_facility(int32 &, int32 *);
424 	mcodeFunctionReturnCodes fn_sound_heard_this(int32 &, int32 *);
425 	mcodeFunctionReturnCodes fn_can_see_in_dark(int32 &, int32 *);
426 	mcodeFunctionReturnCodes fn_mega_never_in_shadow(int32 &, int32 *);
427 	mcodeFunctionReturnCodes fn_remora_new_menu_on_icon(int32 &, int32 *);
428 	mcodeFunctionReturnCodes fn_remora_new_menu(int32 &, int32 *);
429 	mcodeFunctionReturnCodes fn_no_logic(int32 &, int32 *);
430 	mcodeFunctionReturnCodes fn_gosub(int32 &, int32 *);
431 	mcodeFunctionReturnCodes fn_set_custom_simple_animator(int32 &, int32 *);
432 	mcodeFunctionReturnCodes fn_tiny_route(int32 &, int32 *);
433 	mcodeFunctionReturnCodes fn_sharp_route(int32 &, int32 *);
434 	mcodeFunctionReturnCodes fn_set_custom_button_operated_door(int32 &, int32 *);
435 	mcodeFunctionReturnCodes fn_test_prop_anim(int32 &, int32 *);
436 	mcodeFunctionReturnCodes fn_lift2_process(int32 &, int32 *);
437 	mcodeFunctionReturnCodes fn_post_named_event_to_object_id(int32 &, int32 *);
438 	mcodeFunctionReturnCodes fn_set_custom_auto_door(int32 &, int32 *);
439 	mcodeFunctionReturnCodes fn_switch_to_manual_camera(int32 &, int32 *);
440 	mcodeFunctionReturnCodes fn_cancel_manual_camera(int32 &, int32 *);
441 	mcodeFunctionReturnCodes fn_carrying_how_many(int32 &, int32 *);
442 	mcodeFunctionReturnCodes fn_preload_custom_mega_anim(int32 &, int32 *);
443 	mcodeFunctionReturnCodes fn_remora_wait_on_icon(int32 &, int32 *);
444 	mcodeFunctionReturnCodes fn_reverse_generic_anim(int32 &, int32 *);
445 	mcodeFunctionReturnCodes fn_register_for_auto_interaction(int32 &, int32 *);
446 	mcodeFunctionReturnCodes fn_sound_set_hearing_sensitivity(int32 &, int32 *);
447 	mcodeFunctionReturnCodes fn_suspend_events(int32 &, int32 *);
448 	mcodeFunctionReturnCodes fn_unsuspend_events(int32 &, int32 *);
449 	mcodeFunctionReturnCodes fn_sound_heard_something(int32 &, int32 *);
450 	mcodeFunctionReturnCodes fn_prime_player_history(int32 &, int32 *);
451 	mcodeFunctionReturnCodes fn_start_chi_following(int32 &, int32 *);
452 	mcodeFunctionReturnCodes fn_inherit_prop_anim_height(int32 &, int32 *);
453 	mcodeFunctionReturnCodes fn_record_player_interaction(int32 &, int32 *);
454 	mcodeFunctionReturnCodes fn_mega_use_lift(int32 &, int32 *);
455 	mcodeFunctionReturnCodes fn_snap_to_nico_y(int32 &, int32 *);
456 	mcodeFunctionReturnCodes fn_inherit_prop_anim_height_id(int32 &, int32 *);
457 	mcodeFunctionReturnCodes fn_route_to_custom_prop_interact(int32 &, int32 *);
458 	mcodeFunctionReturnCodes fn_route_to_generic_prop_interact(int32 &, int32 *);
459 	mcodeFunctionReturnCodes fn_fetch_chi_mode(int32 &, int32 *);
460 	mcodeFunctionReturnCodes fn_lib_lift_chord_and_chi(int32 &, int32 *);
461 	mcodeFunctionReturnCodes fn_set_interacting(int32 &, int32 *);
462 	mcodeFunctionReturnCodes fn_clear_interacting(int32 &, int32 *);
463 	mcodeFunctionReturnCodes fn_remora_emp_flash(int32 &, int32 *);
464 	mcodeFunctionReturnCodes fn_remora_mark_email_read(int32 &, int32 *);
465 	mcodeFunctionReturnCodes fn_do_not_disturb(int32 &, int32 *);
466 	mcodeFunctionReturnCodes fn_remora_check_email_id(int32 &, int32 *);
467 	mcodeFunctionReturnCodes fn_remora_set_map_knowledge_level(int32 &, int32 *);
468 	mcodeFunctionReturnCodes fn_remora_fix_motion_scan_xz(int32 &, int32 *);
469 	mcodeFunctionReturnCodes fn_remora_update_player(int32 &, int32 *);
470 	mcodeFunctionReturnCodes fn_remora_script_activate(int32 &, int32 *);
471 	mcodeFunctionReturnCodes fn_remora_script_deactivate(int32 &, int32 *);
472 	mcodeFunctionReturnCodes fn_line_of_sight_suspend(int32 &, int32 *);
473 	mcodeFunctionReturnCodes fn_line_of_sight_unsuspend(int32 &, int32 *);
474 	mcodeFunctionReturnCodes fn_check_for_nico(int32 &, int32 *);
475 	mcodeFunctionReturnCodes fn_sony_door_interact(int32 &, int32 *);
476 	mcodeFunctionReturnCodes fn_apply_anim_y(int32 &, int32 *);
477 	mcodeFunctionReturnCodes fn_remora_default_logic(int32 &, int32 *);
478 	mcodeFunctionReturnCodes fn_line_of_sight_now(int32 &, int32 *);
479 	mcodeFunctionReturnCodes fn_play_sfx(int32 &, int32 *);
480 	mcodeFunctionReturnCodes fn_stop_sfx(int32 &, int32 *);
481 	mcodeFunctionReturnCodes fn_set_to_first_frame_generic_anim(int32 &, int32 *);
482 	mcodeFunctionReturnCodes fn_easy_play_generic_anim_with_pan(int32 &, int32 *);
483 	mcodeFunctionReturnCodes speak_play_custom_anim(int32 &, int32 *);
484 	mcodeFunctionReturnCodes speak_set_custom(int32 &, int32 *);
485 	mcodeFunctionReturnCodes fn_check_for_chi(int32 &, int32 *);
486 	mcodeFunctionReturnCodes fn_wait_for_chi(int32 &, int32 *);
487 	mcodeFunctionReturnCodes fn_send_chi_to_this_object(int32 &, int32 *);
488 	mcodeFunctionReturnCodes fn_set_ids_lvar_value(int32 &, int32 *);
489 	mcodeFunctionReturnCodes fn_teleport_to_nico_y(int32 &, int32 *);
490 	mcodeFunctionReturnCodes fn_is_id_the_player(int32 &, int32 *);
491 	mcodeFunctionReturnCodes fn_set_to_exlusive_coords(int32 &, int32 *);
492 	mcodeFunctionReturnCodes fn_chi_wait_for_player_to_move(int32 &, int32 *);
493 	mcodeFunctionReturnCodes fn_set_evil(int32 &, int32 *);
494 	mcodeFunctionReturnCodes fn_remora_menu_return_on_icon(int32 &, int32 *);
495 	mcodeFunctionReturnCodes fn_remora_mega_says(int32 &, int32 *);
496 	mcodeFunctionReturnCodes fn_changed_via_this_shaft(int32 &, int32 *);
497 	mcodeFunctionReturnCodes fn_get_objects_x(int32 &, int32 *);
498 	mcodeFunctionReturnCodes fn_get_objects_y(int32 &, int32 *);
499 	mcodeFunctionReturnCodes fn_get_objects_z(int32 &, int32 *);
500 	mcodeFunctionReturnCodes fn_set_cad_lock_status(int32 &, int32 *);
501 	mcodeFunctionReturnCodes fn_are_we_on_screen(int32 &, int32 *);
502 	mcodeFunctionReturnCodes fn_reset_icon_list(int32 &, int32 *);
503 	mcodeFunctionReturnCodes fn_get_speech_status(int32 &, int32 *);
504 	mcodeFunctionReturnCodes fn_interact_choose(int32 &, int32 *);
505 	mcodeFunctionReturnCodes fn_is_mega_within_area(int32 &, int32 *);
506 	mcodeFunctionReturnCodes fn_get_cad_state_flag(int32 &, int32 *);
507 	mcodeFunctionReturnCodes fn_end_mission(int32 &, int32 *);
508 	mcodeFunctionReturnCodes fn_remora_set_max_zoom(int32 &, int32 *);
509 	mcodeFunctionReturnCodes fn_remora_set_min_zoom(int32 &, int32 *);
510 	mcodeFunctionReturnCodes fn_route_to_near_mega(int32 &, int32 *);
511 	mcodeFunctionReturnCodes fn_stop_chi_following(int32 &, int32 *);
512 	mcodeFunctionReturnCodes fn_set_pose(int32 &, int32 *);
513 	mcodeFunctionReturnCodes fn_is_crouching(int32 &, int32 *);
514 	mcodeFunctionReturnCodes fn_is_armed(int32 &, int32 *);
515 	mcodeFunctionReturnCodes fn_push_player_status(int32 &, int32 *);
516 	mcodeFunctionReturnCodes fn_pop_player_status(int32 &, int32 *);
517 	mcodeFunctionReturnCodes fn_post_third_party_speech(int32 &, int32 *);
518 	mcodeFunctionReturnCodes fn_fast_face_object(int32 &, int32 *);
519 	mcodeFunctionReturnCodes fn_remora_paragraph_text(int32 &, int32 *);
520 	mcodeFunctionReturnCodes fn_remora_main_heading(int32 &, int32 *);
521 	mcodeFunctionReturnCodes fn_remora_sub_heading(int32 &, int32 *);
522 	mcodeFunctionReturnCodes fn_remora_option_text(int32 &, int32 *);
523 	mcodeFunctionReturnCodes fn_remora_warning_text(int32 &, int32 *);
524 	mcodeFunctionReturnCodes fn_object_rerun_logic_context(int32 &, int32 *);
525 	mcodeFunctionReturnCodes fn_interact_near_mega(int32 &, int32 *);
526 	mcodeFunctionReturnCodes fn_am_i_player(int32 &, int32 *);
527 	mcodeFunctionReturnCodes fn_set_shoot_overide(int32 &, int32 *);
528 	mcodeFunctionReturnCodes fn_set_strike_overide(int32 &, int32 *);
529 	mcodeFunctionReturnCodes fn_start_conveyor(int32 &, int32 *);
530 	mcodeFunctionReturnCodes fn_stop_conveyor(int32 &, int32 *);
531 	mcodeFunctionReturnCodes fn_interact_with_id(int32 &, int32 *);
532 	mcodeFunctionReturnCodes fn_face_nicos_pan(int32 &, int32 *);
533 	mcodeFunctionReturnCodes fn_unregister_for_auto_interaction(int32 &, int32 *);
534 	mcodeFunctionReturnCodes fn_register_chi(int32 &, int32 *);
535 	mcodeFunctionReturnCodes fn_add_y(int32 &, int32 *);
536 	mcodeFunctionReturnCodes fn_register_stairway(int32 &, int32 *);
537 	mcodeFunctionReturnCodes fn_play_sfx_xyz(int32 &, int32 *);
538 	mcodeFunctionReturnCodes fn_reverse_custom_anim(int32 &, int32 *);
539 	mcodeFunctionReturnCodes fn_trace(int32 &, int32 *);
540 	mcodeFunctionReturnCodes fn_PLEASE_REUSE_THIS_SLOT_2(int32 &, int32 *);
541 	mcodeFunctionReturnCodes fn_PLEASE_REUSE_THIS_SLOT_3(int32 &, int32 *);
542 	mcodeFunctionReturnCodes fn_set_player_has_weapon(int32 &, int32 *);
543 	mcodeFunctionReturnCodes fn_align_with_floor(int32 &, int32 *);
544 	mcodeFunctionReturnCodes fn_sound_new_entry(int32 &, int32 *);
545 	mcodeFunctionReturnCodes fn_sound_remove_entry(int32 &, int32 *);
546 	mcodeFunctionReturnCodes fn_sound_simulate(int32 &, int32 *);
547 	mcodeFunctionReturnCodes fn_set_object_type(int32 &, int32 *);
548 	mcodeFunctionReturnCodes fn_register_ladder(int32 &, int32 *);
549 	mcodeFunctionReturnCodes fn_play_movie(int32 &, int32 *);
550 	mcodeFunctionReturnCodes fn_is_an_object_crouching(int32 &, int32 *);
551 	mcodeFunctionReturnCodes fn_play_sfx_offset(int32 &, int32 *);
552 	mcodeFunctionReturnCodes fn_play_sfx_time(int32 &, int32 *);
553 	mcodeFunctionReturnCodes fn_add_medipacks(int32 &, int32 *);
554 	mcodeFunctionReturnCodes fn_use_medipacks(int32 &, int32 *);
555 	mcodeFunctionReturnCodes fn_add_ammo_clips(int32 &, int32 *);
556 	mcodeFunctionReturnCodes fn_use_ammo_clips(int32 &, int32 *);
557 	mcodeFunctionReturnCodes fn_load_players_gun(int32 &, int32 *);
558 	mcodeFunctionReturnCodes fn_flash_health(int32 &, int32 *);
559 	mcodeFunctionReturnCodes fn_sound_get_x(int32 &, int32 *);
560 	mcodeFunctionReturnCodes fn_sound_get_z(int32 &, int32 *);
561 	mcodeFunctionReturnCodes fn_set_player_pose(int32 &, int32 *);
562 	mcodeFunctionReturnCodes fn_kill_conversations(int32 &, int32 *);
563 	mcodeFunctionReturnCodes fn_is_player_running(int32 &, int32 *);
564 	mcodeFunctionReturnCodes fn_is_player_walking(int32 &, int32 *);
565 	mcodeFunctionReturnCodes fn_set_anim_speed(int32 &, int32 *);
566 	mcodeFunctionReturnCodes fn_push_coords(int32 &, int32 *);
567 	mcodeFunctionReturnCodes fn_pop_coords(int32 &, int32 *);
568 	mcodeFunctionReturnCodes fn_fast_face_coord(int32 &, int32 *);
569 	mcodeFunctionReturnCodes fn_sound_fast_face(int32 &, int32 *);
570 	mcodeFunctionReturnCodes fn_remora_add_floor_range(int32 &, int32 *);
571 	mcodeFunctionReturnCodes fn_remora_reset_floor_ranges(int32 &, int32 *);
572 	mcodeFunctionReturnCodes fn_send_chi_to_named_object(int32 &, int32 *);
573 	mcodeFunctionReturnCodes fx_narrow_screen(int32 &, int32 *);
574 	mcodeFunctionReturnCodes fn_sound_route_to_near(int32 &, int32 *);
575 	mcodeFunctionReturnCodes fn_sound_suspend(int32 &, int32 *);
576 	mcodeFunctionReturnCodes fn_sound_unsuspend(int32 &, int32 *);
577 	mcodeFunctionReturnCodes fn_wandering_custom_prop_interact(int32 &, int32 *);
578 	mcodeFunctionReturnCodes fn_wandering_generic_prop_interact(int32 &, int32 *);
579 	mcodeFunctionReturnCodes fn_set_texture(int32 &, int32 *);
580 	mcodeFunctionReturnCodes fn_set_palette(int32 &, int32 *);
581 	mcodeFunctionReturnCodes fn_restart_gamescript(int32 &, int32 *);
582 	mcodeFunctionReturnCodes fn_quick_restart(int32 &, int32 *);
583 	mcodeFunctionReturnCodes fx_generic_fade(int32 &, int32 *);
584 	mcodeFunctionReturnCodes fn_speech_colour(int32 &, int32 *);
585 	mcodeFunctionReturnCodes fn_is_current_camera(int32 &, int32 *);
586 	mcodeFunctionReturnCodes fn_is_mega_near_mega(int32 &, int32 *);
587 	mcodeFunctionReturnCodes fn_easy_play_custom_anim_with_pan(int32 &, int32 *);
588 	mcodeFunctionReturnCodes fn_make_remora_beep(int32 &, int32 *);
589 	mcodeFunctionReturnCodes fn_shadows_on(int32 &, int32 *);
590 	mcodeFunctionReturnCodes fn_shadows_off(int32 &, int32 *);
591 	mcodeFunctionReturnCodes fn_set_neck_bone(int32 &, int32 *);
592 	mcodeFunctionReturnCodes fn_set_neck_vector(int32 &, int32 *);
593 	mcodeFunctionReturnCodes speak_set_neck_vector(int32 &, int32 *);
594 	mcodeFunctionReturnCodes fn_simple_look(int32 &, int32 *);
595 	mcodeFunctionReturnCodes speak_simple_look(int32 &, int32 *);
596 	mcodeFunctionReturnCodes fn_panless_teleport_to_nico(int32 &, int32 *);
597 	mcodeFunctionReturnCodes fn_can_mega_see_dead_megas(int32 &, int32 *);
598 	mcodeFunctionReturnCodes fn_breath(int32 &, int32 *);
599 	mcodeFunctionReturnCodes fn_set_dynamic_light(int32 &, int32 *);
600 	mcodeFunctionReturnCodes speak_set_dynamic_light(int32 &, int32 *);
601 	mcodeFunctionReturnCodes fn_sharp_route_to_near_mega(int32 &, int32 *);
602 	mcodeFunctionReturnCodes fn_spectre_route_to_mega(int32 &, int32 *);
603 	mcodeFunctionReturnCodes fn_set_shade_percentage(int32 &, int32 *);
604 	mcodeFunctionReturnCodes fn_can_hear_players_feet(int32 &, int32 *);
605 	mcodeFunctionReturnCodes fn_is_player_striking(int32 &, int32 *);
606 	mcodeFunctionReturnCodes fn_has_mega_our_height(int32 &, int32 *);
607 	mcodeFunctionReturnCodes fn_chi_heard_gunshot(int32 &, int32 *);
608 	mcodeFunctionReturnCodes fn_prime_custom_anim(int32 &, int32 *);
609 	mcodeFunctionReturnCodes fn_preload_basics(int32 &, int32 *);
610 	mcodeFunctionReturnCodes fn_play_sfx_special(int32 &, int32 *);
611 	mcodeFunctionReturnCodes fn_set_default_footstep_sfx(int32 &, int32 *);
612 	mcodeFunctionReturnCodes fn_set_floor_footstep_sfx(int32 &, int32 *);
613 	mcodeFunctionReturnCodes fn_set_footstep_weight(int32 &, int32 *);
614 	mcodeFunctionReturnCodes fn_set_special_footstep(int32 &, int32 *);
615 	mcodeFunctionReturnCodes speak_reverse_custom_anim(int32 &, int32 *);
616 	mcodeFunctionReturnCodes speak_preload_custom_anim(int32 &, int32 *);
617 	mcodeFunctionReturnCodes fn_register_platform_coords(int32 &, int32 *);
618 	mcodeFunctionReturnCodes fn_remora_progress_bar(int32 &, int32 *);
619 	mcodeFunctionReturnCodes fn_play_sfx_offset_time(int32 &, int32 *);
620 	mcodeFunctionReturnCodes fn_activate_stair_or_ladder(int32 &, int32 *);
621 	mcodeFunctionReturnCodes fn_deactivate_stair_or_ladder(int32 &, int32 *);
622 	mcodeFunctionReturnCodes fn_set_half_character_width(int32 &, int32 *);
623 	mcodeFunctionReturnCodes fn_set_interact_look_height(int32 &, int32 *);
624 	mcodeFunctionReturnCodes fn_swordfight(int32 &, int32 *);
625 	mcodeFunctionReturnCodes fn_set_visible(int32 &, int32 *);
626 	mcodeFunctionReturnCodes fn_set_object_visible(int32 &, int32 *);
627 	mcodeFunctionReturnCodes fn_calibrate_chi(int32 &, int32 *);
628 	mcodeFunctionReturnCodes fn_set_to_dead(int32 &, int32 *);
629 	mcodeFunctionReturnCodes fn_sound_link_floors(int32 &, int32 *);
630 	mcodeFunctionReturnCodes fn_remora_blank_line(int32 &, int32 *);
631 	mcodeFunctionReturnCodes fn_set_voice_over_colour(int32 &, int32 *);
632 	mcodeFunctionReturnCodes fn_default_voice_over_colour(int32 &, int32 *);
633 	mcodeFunctionReturnCodes fn_set_camera_hold(int32 &, int32 *);
634 	mcodeFunctionReturnCodes fn_set_mega_wait_for_player(int32 &, int32 *);
635 	mcodeFunctionReturnCodes fn_set_mega_off_camera_hold(int32 &, int32 *);
636 	mcodeFunctionReturnCodes fn_set_mega_slice_hold(int32 &, int32 *);
637 	mcodeFunctionReturnCodes fn_set_mesh(int32 &, int32 *);
638 	mcodeFunctionReturnCodes fn_sync_with_mega(int32 &, int32 *);
639 	mcodeFunctionReturnCodes fn_laser_route(int32 &, int32 *);
640 	mcodeFunctionReturnCodes fn_prop_crouch_interact(int32 &, int32 *);
641 	mcodeFunctionReturnCodes fn_preload_sting(int32 &, int32 *);
642 	mcodeFunctionReturnCodes fn_play_sting(int32 &, int32 *);
643 	mcodeFunctionReturnCodes fn_stop_sting(int32 &, int32 *);
644 	mcodeFunctionReturnCodes fn_set_sleep(int32 &, int32 *);
645 
646 	mcodeFunctionReturnCodes speak_allocate_music(int32 &, int32 *);
647 	mcodeFunctionReturnCodes speak_preload_music(int32 &, int32 *);
648 	mcodeFunctionReturnCodes speak_play_music(int32 &, int32 *);
649 	mcodeFunctionReturnCodes speak_stop_music(int32 &, int32 *);
650 	mcodeFunctionReturnCodes speak_end_music(int32 &, int32 *);
651 
652 	mcodeFunctionReturnCodes fn_set_sfx(int32 &, int32 *);
653 	mcodeFunctionReturnCodes fn_wait_for_button(int32 &, int32 *);
654 	mcodeFunctionReturnCodes fn_set_as_player(int32 &, int32 *);
655 
656 	mcodeFunctionReturnCodes fn_lock_y(int32 &, int32 *);
657 	mcodeFunctionReturnCodes fn_unlock_y(int32 &, int32 *);
658 	mcodeFunctionReturnCodes fn_is_current_location(int32 &, int32 *);
659 	mcodeFunctionReturnCodes fn_flip_pan(int32 &, int32 *);
660 	mcodeFunctionReturnCodes fn_snap_to_ladder_bottom(int32 &, int32 *);
661 	mcodeFunctionReturnCodes fn_snap_to_ladder_top(int32 &, int32 *);
662 
663 	mcodeFunctionReturnCodes fn_set_feet_to_pan(int32 &, int32 *);
664 	mcodeFunctionReturnCodes fn_room_route(int32 &, int32 *);
665 	mcodeFunctionReturnCodes fn_hard_load_generic_anim(int32 &, int32 *);
666 	mcodeFunctionReturnCodes fn_hard_load_custom_anim(int32 &, int32 *);
667 
668 	mcodeFunctionReturnCodes fn_face_camera(int32 &, int32 *);
669 
670 	mcodeFunctionReturnCodes fn_activate_sparkle(int32 &, int32 *);
671 	mcodeFunctionReturnCodes fn_deactivate_sparkle(int32 &, int32 *);
672 
673 	void Set_script(const char *script_name);
674 	void Context_check(uint32 script_name);
675 	void Shut_down_object();
676 	void Shut_down_object(const char *ascii);
677 	bool8 Console_shut_down_object(const char *name);
678 	void Console_shut_down_all_objects();
679 	void Console_shut_down_all_mega_objects();
680 	bool8 Free_object(const char *name);
681 	void Shut_down_id(uint32 id);
682 	void Set_objects_conversation_uid(uint32 id, uint32 uid);
683 	uint32 Return_objects_conversation_uid(uint32 id);
684 	void List_session_mega_objects();
685 
686 	bool8 Call_socket(uint32 id, const char *script, int32 *retval);
687 	uint32 socket_id;
688 	c_game_object *socket_object;
689 
690 	void Create_initial_route(__rtype type);
691 
692 	bool8 Process_route();
693 	void Reset_route_manager();
694 	uint32 Animate_points(_route_description *route); // the mega character route animator
695 	void Calc_dist_and_pan(PXreal x, PXreal z, _route_description *route);
696 
697 	void Calc_dist_and_target_pan(PXreal x, PXreal z, _route_description *route);
698 	bool8 Calc_target_pan(PXreal x, PXreal z, PXreal x2, PXreal z2);
699 	bool8 Calc_target_pan_no_bones(PXreal x, PXreal z, PXreal x2, PXreal z2);
700 
701 	void Animate_turn_to_pan(__mega_set_names anim_type, uint32 speedup);
702 
703 	void Advance_auto_pan();
704 
705 	bool8 Is_route_required(PXreal startx, PXreal startz, PXreal destx, PXreal destz);
706 
707 	bool8 Setup_route(int32 &result, int32 corex, int32 corez, int32 runs, __rtype type, int32 end_on_stand);
708 	_route_description *Fetch_route_desc(uint32 id);
709 
710 	// primitive line router service object
711 	_prim_route_builder troute;
712 
713 	mcodeFunctionReturnCodes Route_to_near_mega_core(const char *name, int32 run, int32 initial_turn, uint32 dist, int32 walk_to_run, int32 &result);
714 
715 	void Start_new_router_game_cycle();
716 	void Set_router_busy();
717 	bool8 Is_router_busy();
718 	bool8 router_busy;
719 
720 	char speech_conv_name[ENGINE_STRING_LEN];
721 
722 	__conversation speech_info[1];
723 
724 	uint32 total_convs;
725 
726 	uint32 conv_focus; // which conversation has the view/listen focus
727 
728 	uint32 conv; // number of currently processed conversation
729 
730 	text_sprite *text_bloc; // render bloc for remora speech
731 	text_sprite *text_speech_bloc;
732 
733 #define S speech_info[0]
734 #define CONV_ID 0
735 
736 	uint32 menu_number;
737 	uint32 no_click_zone; // cant click past text until this reaches a certain number
738 
739 	// The object ID of the currently highlighted prop
740 	int32 selected_prop_id;
741 	// The object ID of the currently highlighted mega
742 	int32 selected_mega_id;
743 
744 	void Service_speech();
745 	void End_conversation(uint32 uid);
746 	void Exit_speech(uint32 id);
747 	void Render_speech(text_sprite *bloc);
748 
749 	void Format_remora_text(const char *pcText, int32 nLineSpacing, int32 nCharSpacing, uint32 nMaxWidth);
750 	void Create_remora_text(uint32 x, uint32 y, const char *ascii,
751 	                        int32 margin, _pin_position pin_pos, int32 lineSpacing, int32 charSpacing,
752 	                        uint32 maxWidth,
753 	                        bool8 analysisAlreadyDone = FALSE8,
754 	                        int32 stopAtLine = -1);
755 	void Kill_remora_text();
756 
757 	uint32 Fetch_no_barriers();
758 
759 	uint32 Fetch_no_megas_barriers();
760 	uint32 Fetch_no_megas_nudge_barriers();
761 
762 	uint32 Fetch_megas_barrier_number(uint32 barrier);
763 	uint32 Fetch_megas_nudge_barrier_number(uint32 barrier);
764 
765 	uint32 External_fetch_no_megas_barriers(uint32 id);
766 	uint32 External_fetch_no_megas_nudge_barriers(uint32 id);
767 	uint32 External_fetch_no_megas_anim_barriers(uint32 id);
768 	uint32 External_fetch_megas_barrier(uint32 id, uint32 barrier);
769 	uint32 External_fetch_megas_nudge_barrier(uint32 id, uint32 barrier);
770 
771 	PXfloat adjusted_pan;
772 	bool8 made_adjust;
773 	PXfloat normalAngle;
774 	__barrier_result Check_barrier_bump_and_bounce(PXreal newx, PXreal newy, PXreal newz, PXreal oldx, PXreal oldy, PXreal oldz, bool8 player);
775 
776 	__barrier_result Check_this_barrier(_route_barrier *bar, PXreal newx, PXreal newz, PXreal oldx, PXreal oldz, PXreal bar_close, int32 *ignore);
777 
778 	void Prepare_megas_route_barriers(bool8 player);
779 	void Prepare_megas_abarriers(uint32 slice_number, uint32 parent_number);
780 	void Fetch_mega_barriers_for_player();
781 
782 	// animation
783 	bool8 Advance_frame_and_motion(__mega_set_names anim_type, bool8 player, uint8 nFrames);
784 	__barrier_result Core_advance(__mega_set_names anim_type, bool8 player, uint8 nFrames);
785 	bool8 Easy_frame_and_motion(__mega_set_names anim_type, bool8 player, uint8 nFrames);
786 	bool8 Easy_frame_motion_and_pan(__mega_set_names anim_type, bool8 player);
787 	bool8 Reverse_frame_and_motion(__mega_set_names anim_type, bool8 player, uint8 nFrames);
788 	__barrier_result Core_reverse(__mega_set_names anim_type, bool8 player, uint8 nFrames);
789 
790 	void Normalise_anim_pc();
791 
792 	void Soft_start_with_single_link(__mega_set_names link_anim, __mega_set_names next_anim);
793 	void Soft_start_with_double_link(__mega_set_names link_one, __mega_set_names link_two, __mega_set_names next_anim);
794 	void Soft_start_single_anim(__mega_set_names next_anim);
795 	int32 Soften_up_anim_file(__mega_set_names link, int32 diff);
796 
797 	void Hard_start_single_anim(__mega_set_names next_anim);
798 	bool8 Play_anim();
799 	bool8 Play_reverse_anim();
800 	bool8 Play_anim_with_no_movement();
801 	bool8 fast_face_object(uint32 id, uint32 speed);
802 	bool8 Need_to_turn_to_face_object(uint32 id);
803 	bool8 fast_face_rnd(uint32 speed);
804 
805 	bool8 Find_interact_marker_in_anim(__mega_set_names anim, PXreal *xoff, PXreal *zoff);
806 	bool8 Compute_target_interaction_coordinate(__mega_set_names anim, PXreal *destx, PXreal *destz);
807 
808 	void Set_pose(__weapon weapon);
809 	void Set_motion(__motion motion);
810 	__motion Get_motion();
811 	void Change_pose_in_current_anim_set();
812 
813 	bool8 Start_generic_ascii_anim(const char *ascii_name);
814 	__mega_set_names Fetch_generic_anim_from_ascii(const char *ascii_name);
815 
816 	bool8 Fetch_cur_megas_armed_status();
817 	__weapon Fetch_cur_megas_pose();
818 	bool8 Fetch_custom();
819 	void Reset_cur_megas_custom_type();
820 	const char *Fetch_cur_megas_custom_text();
821 	uint32 Fetch_last_frame(__mega_set_names anim);
822 
823 	bool8 speech_face_object(uint32 tar_id);
824 
825 	mcodeFunctionReturnCodes Core_prop_interact(int32 &result, int32 *params, bool8 custom, bool8 coord_correction);
826 
Fetch_number_of_megas()827 	uint32 Fetch_number_of_megas() const {
828 		return (number_of_voxel_ids);
829 	}
Fetch_voxel_object_id(uint32 i)830 	uint32 Fetch_voxel_object_id(uint32 i) const {
831 		return (voxel_id_list[i]);
832 	}
833 
834 	void Snap_to_ladder(_stair *lad, uint32 dist);
835 	void Set_init_voxel_floors();
836 	void Idle_manager();
837 
838 	uint32 cur_camera_number;
839 	uint32 anchor_floor; // the floor number that the object was on when the camera changed - used for rubber-banding when moving off
840 
841 	uint32 wa_number; // number of current wa camera
842 	PXreal wa_pin_x;
843 	PXreal wa_pin_y;
844 	PXreal wa_pin_z;
845 
846 	char manual_camera_name[ENGINE_STRING_LEN]; // saved for save game
847 
848 	uint32 num_cameras;
849 	char *camera_name_list[64];
850 	char *camera_cluster_list[64];
851 
852 	uint32 floor_to_camera_index[MAX_floors];
853 	_floor_cam_list cam_floor_list[MAX_floors];
854 
855 	void Build_camera_table();
856 	void Camera_director();
857 	void Reset_camera_director();
858 	bool8 Object_visible_to_camera(uint32 id);
859 	bool8 Process_wa_list();
860 	void Prepare_camera_floors();
861 
862 	bool8 chi_interacts(int32 id, const char *script_name);
863 	__chi_think_mode fn_fetch_chi_mode();
864 	bool8 Make_floor_coordinate(PXreal *x, PXreal *z);
865 	bool8 Find_a_chi_target();
866 	void Chi_leaves_fight_mode();
867 	void Set_chi_permission();
868 	bool8 Process_chi();
869 	PXreal Cord_dist();
870 
871 	_history history[MAX_player_history];
872 	uint32 cur_history; // players current position
873 	uint32 chi_history; // chi's current position
874 	uint32 pre_interact_floor; // floor we were on before going up stair or ladder -
875 	__chi_think_mode chi_think_mode;
876 	__chi_do_mode chi_do_mode;
877 	uint32 chi_id; // id of chi object
878 	uint32 chi_next_move; // counts down to chi's next move
879 	_local_history local_history[MAX_local_history];
880 	uint32 local_history_count; // how many moves this floor
881 	uint32 next_local;
882 	uint32 local_count_down;
883 	PXreal hist_pin_x;
884 	PXreal hist_pin_y;
885 	PXreal hist_pin_z;
886 
887 	uint32 chi_target_id; // id of target
888 	bool8 chi_has_target; // has a valid target yes or no
889 	uint8 fight_pause; // time to next move
890 	bool8 permission_to_fire; // only after player has shot
891 	PXreal chi_catch_up_dist;
892 	PXreal chi_lost_dist;
893 
894 	_local_history spectre_hist[MAX_floors];
895 
896 	void Process_conveyors();
897 	_conveyor conveyors[MAX_conveyors];
898 
899 	_lift_platform lifts[MAX_lift_platforms];
900 	uint8 num_lifts;
901 
902 	void Draw_health_bar();
903 	uint32 health_time;
904 
905 	bool8 alert_list[MAX_voxel_list];
906 	void Process_guard_alert(__alert alert_type);
907 	void Reset_guard_alert();
908 	void Signal_to_guards();
909 	void Signal_to_other_guards();
910 
911 	_player_stat player_stat_was; // asyncer remembers previous player state - ready for change
912 	_player_stat player_stat_use; // use this which has skipped the linking status
913 	void Service_generic_async();
914 	bool8 Route_async_ready(bool8 run, bool8 turn);
915 
916 	bool8 init_asyncs;
917 	uint32 cur_sync_set;
918 	bool8 caching;
919 	_vox_image sync_set[4];
920 
921 	void Async_helper();
922 	int32 async_counter;
923 	int32 async_off;
924 
925 	uint32 num_stairs;
926 	_stair stairs[MAX_stairs];
927 	uint32 Register_stair_or_ladder(const char *target, bool8 top, uint32 length, bool8 stair, uint32 stepcms);
928 
929 	void Set_state_of_stair_or_ladder(uint32 nIndex, bool8 bState);
930 
931 	uint32 prop_state_table[MAX_session_objects]; // pointer to pc's of props for current session
932 
933 	_set set; // the set object
934 
935 	// floor definitions
936 	_floor_world *floor_def; // pointer to a _floor_world object
937 	// floor viewer and room router
938 	// route barriers
939 	_barrier_handler *session_barriers; // pointer to _barrier_handler object - loads file so must be pointer
940 
941 	// game object stuff - objects.linked
942 	_linked_data_file *objects;
943 	uint32 total_objects; // number of objects in the objects.object file - pulled out at session start for convenience
944 	_logic *logic_structs[MAX_session_objects]; // pointers to current sessions logic structs
945 	uint32 num_megas; // keeps a running total of megas initialised - used when assigning megas structures
946 	uint32 num_vox_images; // as above but for vox_images - in theory these 2 counters are the same thing but that would be an assumption too far tbh
947 
948 	// and the scripts.linked file
949 	_linked_data_file *scripts;
950 
951 	// handles player object and user interface
952 	_player player;
953 	PXreal prop_interact_dist; // distance to prop player is going to interact with - needed by sony door functions
954 
955 	// map markers
956 	_marker markers;
957 
958 	// initial map tag positions of props, people, etc.
959 	_linked_data_file *features;
960 
961 	// ascii speech text
962 	_linked_data_file *text;
963 
964 	// list of auto interact objects
965 	uint8 auto_interact_list[MAX_auto_interact];
966 
967 	// speech text font
968 	char speech_font_one[ENGINE_STRING_LEN];
969 	char remora_font[ENGINE_STRING_LEN];
970 	uint32 speech_font_one_hash; // the hash value of the speech_font_one string
971 	uint32 remora_font_hash;     // the hash value of the speech_font_one string
972 
973 	// prop animations
974 	_linked_data_file *prop_anims; // prop anims are loaded into the special private_session_resman
975 
976 	// make los_timing be global so we can print it at a global level
977 	uint32 los_time;
978 
979 	uint32 total_was; // how many individual walk-areas
980 	_linked_data_file *walk_areas;
981 	const __aWalkArea *wa_list[MAX_was]; // walk areas
982 
983 	bool8 manual_camera; // overiden by a script command
984 	bool8 camera_lock; // lock camera director - used to fix ladder problems (easier to fix like this than at animation end)
985 	bool8 wa_camera; // currently using a wa camera
986 	bool8 wa_tied_to_pin;
987 	bool8 wa_tied_to_exit_pin;
988 	bool8 is_there_a_chi; // yes or no
989 	bool8 first_session_cycle;
990 
991 private:
992 	char session_name[ENGINE_STRING_LEN];
993 	char h_session_name[ENGINE_STRING_LEN];
994 	char session_cluster[ENGINE_STRING_LEN];
995 
996 	uint32 session_cluster_hash; // the hash value of the session_cluster string
997 	char session_h_name[8];      // filename equivalent of the hash'ed version of session
998 
999 	uint32 total_props; // holds number of props in current session
1000 
1001 	// speech
1002 
1003 	// logic cycle stuff
1004 	// all these are of course available to fn_functions and associated engine modules
1005 	uint32 cur_id; // number of current object
1006 	_logic *L; // current objects logic structure
1007 	_vox_image *I; // pointer to current objects _voxel_image structure - megas only
1008 	_mega *M; // pointer to current objects _mega struct - megas only
1009 	c_game_object *object; // represents the current game object at logic run time
1010 	uint32 script_var_value; // holds script variables passed back via fn_pass_flag_to_engine
1011 
1012 	// list of ids that are voxel characters - built per game cycle
1013 	uint8 voxel_id_list[MAX_voxel_list];
1014 	uint32 number_of_voxel_ids; // kept for safety
1015 
1016 	// prop state dummy object vars
1017 	uint32 number_of_missing_objects;
1018 	char missing_obs[MAX_missing_objects][MAX_missing_object_name_length];
1019 	uint8 missing_ob_prop_states[MAX_missing_objects];
1020 
1021 	// FOOTSTEPS for mega:
1022 	void UpdateFootstep();
1023 
1024 	// cartridge case for mega
1025 	void UpdateCartridgeCase();
1026 
1027 	uint32 defaultFootSfx;
1028 	uint32 specialFootSfx;
1029 	uint32 ladderFootSfx;
1030 	uint32 floorFootSfx[MAX_footstepFloors][2]; // gives number of floor (0) and hash of sfx to use (1)...
1031 	int32 numFloorFootSfx;
1032 
1033 	// Block use of the copy constructor and the default '='.
1034 	_game_session(const _game_session &);
1035 	void operator=(const _game_session &) { ; }
1036 };
1037 
Fetch_script_var()1038 inline uint32 _game_session::Fetch_script_var() {
1039 	return (script_var_value);
1040 }
1041 
Fetch_number_of_props()1042 inline uint32 _game_session::Fetch_number_of_props() {
1043 	return (total_props);
1044 }
1045 
Fetch_number_of_objects()1046 inline uint32 _game_session::Fetch_number_of_objects() {
1047 	return (total_objects);
1048 }
1049 
Fetch_object_struct(uint32 id)1050 inline _logic *_game_session::Fetch_object_struct(uint32 id) {
1051 	assert(id < total_objects);
1052 
1053 	return (logic_structs[id]);
1054 }
1055 
Force_context_check(uint32 id)1056 inline void _game_session::Force_context_check(uint32 id) {
1057 	assert(id < total_objects);
1058 
1059 	logic_structs[id]->context_request = TRUE8;
1060 }
1061 
Fetch_object_status(uint32 id)1062 inline _object_status _game_session::Fetch_object_status(uint32 id) {
1063 	assert(id < total_objects);
1064 
1065 	return (logic_structs[id]->ob_status);
1066 }
1067 
Set_object_status(uint32 id,_object_status val)1068 inline void _game_session::Set_object_status(uint32 id, _object_status val) {
1069 	assert(id < total_objects);
1070 
1071 	logic_structs[id]->ob_status = val;
1072 }
1073 
Fetch_object_name(uint32 id)1074 inline const char *_game_session::Fetch_object_name(uint32 id) {
1075 	assert(id < total_objects);
1076 
1077 	return ((const char *)(logic_structs[id]->GetName()));
1078 }
1079 
Fetch_cur_id()1080 inline uint32 _game_session::Fetch_cur_id() {
1081 	return (cur_id);
1082 }
1083 
Fetch_no_barriers()1084 inline uint32 _game_session::Fetch_no_barriers() {
1085 	// return number of current player barriers
1086 	return (L->mega->number_of_barriers);
1087 }
1088 
Fetch_no_megas_barriers()1089 inline uint32 _game_session::Fetch_no_megas_barriers() {
1090 	// return number of current player barriers
1091 	return (M->number_of_barriers);
1092 }
1093 
Fetch_no_megas_nudge_barriers()1094 inline uint32 _game_session::Fetch_no_megas_nudge_barriers() {
1095 	// return number of current player barriers
1096 	return (M->number_of_nudge);
1097 }
1098 
External_fetch_no_megas_barriers(uint32 id)1099 inline uint32 _game_session::External_fetch_no_megas_barriers(uint32 id) {
1100 	// return number of current barriers
1101 	// we are not in logic loop so cant rely on M, I, L etc.
1102 
1103 	return (logic_structs[id]->mega->number_of_barriers);
1104 }
1105 
External_fetch_no_megas_anim_barriers(uint32 id)1106 inline uint32 _game_session::External_fetch_no_megas_anim_barriers(uint32 id) {
1107 	// return number of current barriers
1108 	// we are not in logic loop so cant rely on M, I, L etc.
1109 
1110 	return (logic_structs[id]->mega->number_of_animating);
1111 }
1112 
External_fetch_no_megas_nudge_barriers(uint32 id)1113 inline uint32 _game_session::External_fetch_no_megas_nudge_barriers(uint32 id) {
1114 	// return number of current special player nudgebarriers
1115 	// we are not in logic loop so cant rely on M, I, L etc.
1116 
1117 	return (logic_structs[id]->mega->number_of_nudge);
1118 }
1119 
Fetch_megas_barrier_number(uint32 barrier)1120 inline uint32 _game_session::Fetch_megas_barrier_number(uint32 barrier) {
1121 	// can only be called within logic loop
1122 
1123 	assert(barrier < M->number_of_barriers + M->number_of_animating);
1124 
1125 	return M->barrier_list[barrier];
1126 }
1127 
Fetch_megas_nudge_barrier_number(uint32 barrier)1128 inline uint32 _game_session::Fetch_megas_nudge_barrier_number(uint32 barrier) {
1129 	// can only be called within logic loop
1130 
1131 	assert(barrier < M->number_of_nudge);
1132 
1133 	return M->nudge_list[barrier];
1134 }
1135 
External_fetch_megas_barrier(uint32 id,uint32 barrier)1136 inline uint32 _game_session::External_fetch_megas_barrier(uint32 id, uint32 barrier) {
1137 	// can only be called within logic loop
1138 	assert(barrier < (logic_structs[id]->mega->number_of_barriers) + (logic_structs[id]->mega->number_of_animating));
1139 
1140 	return logic_structs[id]->mega->barrier_list[barrier];
1141 }
1142 
External_fetch_megas_nudge_barrier(uint32 id,uint32 barrier)1143 inline uint32 _game_session::External_fetch_megas_nudge_barrier(uint32 id, uint32 barrier) {
1144 	// can only be called within logic loop
1145 	assert(barrier < logic_structs[id]->mega->number_of_nudge);
1146 
1147 	return logic_structs[id]->mega->nudge_list[barrier];
1148 }
1149 
Set_objects_conversation_uid(uint32 id,uint32 uid)1150 inline void _game_session::Set_objects_conversation_uid(uint32 id, uint32 uid) {
1151 	if (id >= total_objects)
1152 		Fatal_error("Object id %d out-of-range (total_objects=%d)", id, total_objects);
1153 
1154 	logic_structs[id]->conversation_uid = uid;
1155 }
1156 
Return_objects_conversation_uid(uint32 id)1157 inline uint32 _game_session::Return_objects_conversation_uid(uint32 id) {
1158 	assert(id < total_objects);
1159 
1160 	return (logic_structs[id]->conversation_uid);
1161 }
1162 
Fetch_session_name()1163 inline const char *_game_session::Fetch_session_name() {
1164 	return ((const char *)session_name);
1165 }
1166 
Fetch_session_cluster()1167 inline const char *_game_session::Fetch_session_cluster() {
1168 	return ((const char *)session_cluster);
1169 }
1170 
Fetch_session_h_name()1171 inline const char *_game_session::Fetch_session_h_name() {
1172 	return ((const char *)session_h_name);
1173 }
1174 
Fetch_h_session_name()1175 inline const char *_game_session::Fetch_h_session_name() {
1176 	return ((const char *)h_session_name);
1177 }
1178 
Fetch_session_cluster_hash()1179 inline uint32 _game_session::Fetch_session_cluster_hash() {
1180 	return (session_cluster_hash);
1181 }
1182 
Fetch_object_integer_variable(const char * pcName,const char * pcVar)1183 inline uint32 _game_session::Fetch_object_integer_variable(const char *pcName, const char *pcVar) const {
1184 	int32 nVariableNumber;
1185 	c_game_object *pGameObject;
1186 
1187 	// Get the object itself.
1188 	pGameObject = (c_game_object *)objects->Fetch_item_by_name(pcName);
1189 
1190 	if (!pGameObject)
1191 		Fatal_error("_game_session::Fetch_object_integer_variable( %s, %s ) couldn't find object", pcName, pcVar);
1192 
1193 	// Find the position of the requested variable.
1194 	nVariableNumber = pGameObject->GetVariable(pcVar);
1195 
1196 	if (nVariableNumber == -1)
1197 		Fatal_error("_game_session::Fetch_object_integer_variable( %s, %s ) couldn't find variable", pcName, pcVar);
1198 
1199 	// Get the lvar.
1200 	return (pGameObject->GetIntegerVariable(nVariableNumber));
1201 }
1202 
GetCamera()1203 inline PXcamera &_game_session::GetCamera() { return set.GetCamera(); }
1204 
SetOK()1205 inline int32 _game_session::SetOK() { return set.OK(); }
1206 
SetReset()1207 inline void _game_session::SetReset() { set.Reset(); }
1208 
1209 } // End of namespace ICB
1210 
1211 #endif
1212