source: abuse/tags/pd/macabuse/src/clisp.c @ 49

Last change on this file since 49 was 49, checked in by Sam Hocevar, 12 years ago
  • Imported original public domain release, for future reference.
  • Property svn:keywords set to Id
File size: 79.9 KB
RevLine 
[49]1#include "ant.hpp"
2#include "lisp.hpp"
3#include "game.hpp"
4#include "jrand.hpp"
5#include "dev.hpp"
6#include "pcxread.hpp"
7#include "menu.hpp"
8#include "dprint.hpp"
9#include "clisp.hpp"
10#include "chars.hpp"
11#include "lisp_gc.hpp"
12#include "cop.hpp"
13#include "loadgame.hpp"
14#include "nfserver.hpp"
15#include "joy.hpp"
16#include "demo.hpp"
17#include "chat.hpp"
18#include "text_gui.hpp"
19#include "jdir.hpp"
20#include "netcfg.hpp"
21
22#ifdef __WATCOMC__
23#include <direct.h>
24#endif
25
26extern uchar major_version;
27extern uchar minor_version;
28extern int has_joystick;
29
30// the following are references to lisp symbols
31void *l_difficulty,*l_easy,*l_hard,*l_medium,*l_main_menu,*l_extreme,
32     *l_logo,*l_state_art,*l_abilities,*l_state_sfx,
33     *l_song_list,*l_filename,*l_sfx_directory,*l_max_hp,*l_default_font,
34     *l_morph,*l_max_power,*l_default_abilities,*l_default_ai_function,
35     *l_tile_files,*l_empty_cache,*l_range,*l_hurt_all,*l_death_handler,
36     *l_title_screen,*l_console_font,*l_fields,*l_dist,*l_pushx,*l_pushy,
37     *l_object,*l_tile,*l_fire_object,*l_FIRE,*l_cop_dead_parts,*l_restart_player,
38     *l_help_screens,*l_player_draw,*l_sneaky_draw,*l_health_image,*l_fly_image,
39     *l_sneaky_image,*l_draw_fast,*l_player_tints,*l_save_order,*l_next_song,
40     *l_level_load_start,
41     *l_level_load_end,     *l_cdc_logo,
42     *l_keep_backup,
43     *l_switch_to_powerful,
44     *l_mouse_can_switch,
45     *l_ask_save_slot,
46     *l_get_local_input,
47     *l_post_render,
48     *l_chat_input,
49     *l_player_text_color,
50     *l_level_loaded,        // called when a new level is loaded
51
52                 *l_up_key,
53                 *l_down_key,
54                 *l_left_key,
55                 *l_right_key,
56     *l_weapon_left_key,
57           *l_weapon_right_key,
58           *l_special_key;
59
60char game_name[50];
61void *sensor_ai();
62
63// variables for the status bar
64void        *l_statbar_ammo_x,*l_statbar_ammo_y,
65            *l_statbar_ammo_w,*l_statbar_ammo_h,
66            *l_statbar_ammo_bg_color,
67
68            *l_statbar_health_x,*l_statbar_health_y,
69            *l_statbar_health_w,*l_statbar_health_h,
70            *l_statbar_health_bg_color,
71
72            *l_statbar_logo_x,*l_statbar_logo_y;
73uchar chatting_enabled=0;
74
75extern void scatter_line(int x1, int y1, int x2, int y2, int c, int s);
76extern void ascatter_line(int x1, int y1, int x2, int y2, int c1, int c2, int s);
77extern void show_end();
78
79extern int registered;
80
81view *lget_view(void *arg, char *msg)
82{
83  game_object *o=(game_object *)lpointer_value(arg);
84  view *c=o->controller();
85  if (!c)
86  {
87    dprintf("%s : object does not have a view\n",msg);
88    lbreak("");
89    exit(0);
90  }
91  return c;
92}
93
94extern int get_option(char *name);
95extern void set_login(char *name);
96
97void clisp_init()                            // call by lisp_init, defines symbols and functions
98                                             // to irnterface with c
99{
100  l_easy=make_find_symbol("easy");
101  l_medium=make_find_symbol("medium");
102  l_hard=make_find_symbol("hard");
103  l_extreme=make_find_symbol("extreme");
104
105  l_logo=make_find_symbol("logo");
106  l_morph=make_find_symbol("morph");
107
108  l_pushx=make_find_symbol("pushx");
109  l_pushy=make_find_symbol("pushy");
110
111  l_dist=make_find_symbol("dist");
112  l_state_art=make_find_symbol("state_art");
113  l_abilities=make_find_symbol("abilities");
114  l_default_abilities=make_find_symbol("default_abilities");
115  l_state_sfx=make_find_symbol("state_sfx");
116  l_filename=make_find_symbol("filename");
117  l_sfx_directory=make_find_symbol("sfx_directory");
118  l_default_font=make_find_symbol("default_font");
119  l_console_font=make_find_symbol("console_font");
120  l_default_ai_function=make_find_symbol("default_ai");
121  l_tile_files=make_find_symbol("tile_files");
122  l_empty_cache=make_find_symbol("empty_cache");
123  l_range=make_find_symbol("range");
124  l_difficulty=make_find_symbol("difficulty");
125  l_death_handler=make_find_symbol("death_handler");
126  l_title_screen=make_find_symbol("title_screen");
127  l_fields=make_find_symbol("fields");
128  l_FIRE=make_find_symbol("FIRE");
129  l_fire_object=make_find_symbol("fire_object");
130  l_fire_object=make_find_symbol("fire_object");
131  l_cop_dead_parts=make_find_symbol("cop_dead_parts");
132  l_restart_player=make_find_symbol("restart_player");
133  l_help_screens=make_find_symbol("help_screens");
134  l_save_order=make_find_symbol("save_order");
135  l_next_song=make_find_symbol("next_song");
136  l_player_draw=make_find_symbol("player_draw");
137  l_sneaky_draw=make_find_symbol("sneaky_draw");
138  l_keep_backup=make_find_symbol("keep_backup");
139  l_level_loaded=make_find_symbol("level_loaded");
140
141  l_draw_fast=make_find_symbol("draw_fast");
142  l_player_tints=make_find_symbol("player_tints");
143
144  l_max_hp=make_find_symbol("max_hp");
145  set_symbol_number(l_max_hp,200);
146  l_max_power=make_find_symbol("max_power");
147  l_main_menu=make_find_symbol("main_menu");
148  set_symbol_number(l_max_power,999);
149
150  set_symbol_number(make_find_symbol("run_state"),RUN_STATE);
151  set_symbol_number(make_find_symbol("pause_state"),PAUSE_STATE);
152  set_symbol_number(make_find_symbol("menu_state"),MENU_STATE);
153  set_symbol_number(make_find_symbol("scene_state"),SCENE_STATE);
154
155  l_statbar_ammo_x=make_find_symbol("statbar_ammo_x");
156  l_statbar_ammo_y=make_find_symbol("statbar_ammo_y");
157  l_statbar_ammo_w=make_find_symbol("statbar_ammo_w");
158  l_statbar_ammo_h=make_find_symbol("statbar_ammo_h");
159  l_statbar_ammo_bg_color=make_find_symbol("statbar_ammo_bg_color");
160
161  l_statbar_health_x=make_find_symbol("statbar_health_x");
162  l_statbar_health_y=make_find_symbol("statbar_health_y");
163  l_statbar_health_w=make_find_symbol("statbar_health_w");
164  l_statbar_health_h=make_find_symbol("statbar_health_h");
165  l_statbar_health_bg_color=make_find_symbol("statbar_health_bg_color");
166
167  l_statbar_logo_x=make_find_symbol("statbar_logo_x");
168  l_statbar_logo_y=make_find_symbol("statbar_logo_y");
169  l_object=make_find_symbol("object");
170  l_tile=make_find_symbol("tile");
171  l_cdc_logo=make_find_symbol("logo");
172
173  l_switch_to_powerful=make_find_symbol("switch_to_powerful");
174  l_mouse_can_switch=make_find_symbol("mouse_can_switch");
175  l_ask_save_slot=make_find_symbol("ask_save_slot");
176
177  l_level_load_start=make_find_symbol("level_load_start");
178  l_level_load_end=make_find_symbol("level_load_end");
179  l_get_local_input=make_find_symbol("get_local_input");
180  l_chat_input=make_find_symbol("chat_input");
181  l_player_text_color=make_find_symbol("player_text_color");
182 
183        l_up_key                                                =       make_find_symbol("up_key");
184        l_down_key                                      =       make_find_symbol("down_key");
185        l_left_key              =       make_find_symbol("left_key");
186        l_right_key             =       make_find_symbol("right_key");
187        l_weapon_left_key       =       make_find_symbol("weapon_left_key");
188        l_weapon_right_key      =       make_find_symbol("weapon_right_key");   
189        l_special_key           =       make_find_symbol("special_key");
190
191  int i;
192  for (i=0;i<MAX_STATE;i++)
193    set_symbol_number(make_find_symbol(state_names[i]),i);
194  for (i=0;i<TOTAL_ABILITIES;i++)
195    set_symbol_number(make_find_symbol(ability_names[i]),i);
196  for (i=0;i<TOTAL_CFLAGS;i++)
197    set_symbol_number(make_find_symbol(cflag_names[i]),i);
198
199  l_song_list=make_find_symbol("song_list"); 
200  l_post_render=make_find_symbol("post_render");
201
202  add_c_function("distx",0,0,                   1);
203  add_c_function("disty",0,0,                   2);
204  add_c_bool_fun("key_pressed",1,1,             3);
205  add_c_bool_fun("local_key_pressed",1,1,       4);
206
207  add_c_function("bg_state",0,0,                5);
208  add_c_function("aitype",0,0,                  6);
209  add_c_function("aistate",0,0,                 7);
210  add_c_function("set_aistate",1,1,             8);
211  add_c_function("random",1,1,                  9);
212  add_c_function("state_time",0,0,             10);
213  add_c_function("state",0,0,                  11);
214  add_c_function("toward",0,0,                 12);
215  add_c_function("move",3,3,                   13);
216  add_c_function("facing",0,0,                 14);
217  add_c_function("otype",0,0,                  15);
218  add_c_bool_fun("next_picture",0,0,           16);
219  add_c_bool_fun("set_fade_dir",1,1,           17);
220  add_c_function("mover",3,3,                  18);
221  add_c_bool_fun("set_fade_count",1,1,         19);
222  add_c_function("fade_count",0,0,             20);
223  add_c_function("fade_dir",0,0,               21);
224  add_c_bool_fun("touching_bg",0,0,            22);
225  add_c_function("add_power",1,1,              23);
226  add_c_function("add_hp",1,1,                 24);
227
228  add_c_bool_fun("draw",0,0,                   27);
229  add_c_bool_fun("edit_mode",0,0,              28);
230  add_c_bool_fun("draw_above",0,0,             29);
231  add_c_function("x",0,0,                      30);
232  add_c_function("y",0,0,                      31);
233  add_c_bool_fun("set_x",1,1,                  32);
234  add_c_bool_fun("set_y",1,1,                  33); 
235  add_c_bool_fun("push_characters",2,2,        34);
236
237
238
239  add_c_bool_fun("set_state",1,1,              37);
240  add_c_function("bg_x",0,0,                   38);
241  add_c_function("bg_y",0,0,                   39);
242  add_c_bool_fun("set_aitype",1,1,             40);
243
244  add_c_function("xvel",0,0,                   42);
245  add_c_function("yvel",0,0,                   43);
246  add_c_bool_fun("set_xvel",1,1,               44);
247  add_c_bool_fun("set_yvel",1,1,               45);
248  add_c_function("away",0,0,                   46);
249  add_c_bool_fun("blocked_left",1,1,           47);
250  add_c_bool_fun("blocked_right",1,1,          48);
251
252  add_c_function("add_palette",1,-1,           50);    // name, w,h,x,y,scale, tiles
253  add_c_bool_fun("screen_shot",1,1,            51);    // filename
254
255  add_c_bool_fun("set_zoom",1,1,               52);
256  add_c_function("show_help",1,1,              55);    // type, x,y
257  add_c_function("direction",0,0,              56);
258  add_c_function("set_direction",1,1,          57);
259
260  add_c_bool_fun("freeze_player",1,1,          58);   // freeze time
261
262  add_c_function("menu",1,-1,                  59);
263  add_c_bool_fun("do_command",1,1,             60);   // command string
264  add_c_bool_fun("set_game_state",1,1,         61);
265 
266
267// scene control functions, game must first be set to scene mode.
268  add_c_bool_fun("scene:set_text_region",4,4,  62);
269  add_c_bool_fun("scene:set_frame_speed",1,1,  63);
270  add_c_bool_fun("scene:set_scroll_speed",1,1, 64);
271  add_c_bool_fun("scene:set_pan_speed",1,1,    65);
272  add_c_bool_fun("scene:scroll_text",1,1,      66);
273  add_c_bool_fun("scene:pan",3,3,              67);
274  add_c_bool_fun("scene:wait",1,1,             68);
275
276  add_c_bool_fun("level:new",3,3,              74);    // width, height, name
277
278  add_c_bool_fun("do_damage",2,4,              75);    // amount, to_object, [pushx pushy]
279  add_c_function("hp",0,0,                     76);
280  add_c_bool_fun("set_shift_down",2,2,         77);
281  add_c_bool_fun("set_shift_right",2,2,        78);
282  add_c_bool_fun("set_gravity",1,1,            79);
283  add_c_function("tick",0,0,                   80);
284
285  add_c_bool_fun("set_xacel",1,1,              81);
286  add_c_bool_fun("set_yacel",1,1,              82);
287  add_c_bool_fun("set_local_players",1,1,      84);   // set # of players on this machine, unsupported?
288  add_c_function("local_players",0,0,          85);
289
290  add_c_bool_fun("set_light_detail",1,1,       86);
291  add_c_function("light_detail",0,0,           87);
292  add_c_bool_fun("set_morph_detail",1,1,       88);
293  add_c_function("morph_detail",0,0,           89);
294  add_c_bool_fun("morph_into",3,3,             90);       // type aneal frames
295  add_c_bool_fun("link_object",1,1,            91);
296
297  add_c_bool_fun("draw_line",5,5,              92);
298  add_c_function("dark_color",0,0,             93);
299  add_c_function("medium_color",0,0,           94);
300  add_c_function("bright_color",0,0,           95);
301
302  add_c_bool_fun("remove_object",1,1,          99);
303  add_c_bool_fun("link_light",1,1,            100); 
304  add_c_bool_fun("remove_light",1,1,          101);
305  add_c_function("total_objects",0,0,         102);
306  add_c_function("total_lights",0,0,          103);
307
308  add_c_bool_fun("set_light_r1",2,2,          104);
309  add_c_bool_fun("set_light_r2",2,2,          105);
310  add_c_bool_fun("set_light_x",2,2,           106);
311  add_c_bool_fun("set_light_y",2,2,           107);
312  add_c_bool_fun("set_light_xshift",2,2,      108);
313  add_c_bool_fun("set_light_yshift",2,2,      109);
314
315  add_c_function("light_r1",1,1,              110);
316  add_c_function("light_r2",1,1,              111);
317  add_c_function("light_x",1,1,               112);
318  add_c_function("light_y",1,1,               113);
319  add_c_function("light_xshift",1,1,          114);
320  add_c_function("light_yshift",1,1,          115);
321
322  add_c_function("xacel",0,0,                 116);
323  add_c_function("yacel",0,0,                 117);
324  add_c_bool_fun("delete_light",1,1,          118);
325
326  add_c_bool_fun("set_fx",1,1,                119);
327  add_c_bool_fun("set_fy",1,1,                120);
328  add_c_bool_fun("set_fxvel",1,1,             121);
329  add_c_bool_fun("set_fyvel",1,1,             122);
330  add_c_bool_fun("set_fxacel",1,1,            123);
331  add_c_bool_fun("set_fyacel",1,1,            124);
332  add_c_function("picture_width",0,0,         125);
333  add_c_function("picture_height",0,0,        126);
334  add_c_bool_fun("trap",0,0,                  127);
335  add_c_bool_fun("platform_push",2,2,         128);
336
337  add_c_function("def_sound",1,2,             133);  // symbol, filename [ or just filenmae]
338  add_c_bool_fun("play_sound",1,4,            134);
339
340  add_c_function("def_particle",2,2,          137);  // symbol, filename
341  add_c_function("add_panim",4,4,             138);  // id, x, y, dir
342
343  add_c_function("weapon_to_type",1,1,        142);  // returns total for type weapon
344  add_c_bool_fun("hurt_radius",6,6,           143);  // x y radius max_damage exclude_object max_push
345
346  add_c_bool_fun("add_ammo",2,2,              144);  // weapon_type, amount
347  add_c_function("ammo_total",1,1,            145);  // returns total for type weapon
348  add_c_function("current_weapon",0,0,        146);  // weapon_type, amount
349  add_c_function("current_weapon_type",0,0,   147);  // returns total for type weapon
350
351  add_c_bool_fun("blocked_up",1,1,            148);
352  add_c_bool_fun("blocked_down",1,1,          149);
353  add_c_bool_fun("give_weapon",1,1,           150);  // type
354  add_c_function("get_ability",1,1,           151);
355  add_c_bool_fun("reset_player",0,0,          152);
356  add_c_function("site_angle",1,1,            153);
357  add_c_bool_fun("set_course",2,2,            154);  // angle, magnitude
358  add_c_bool_fun("set_frame_angle",3,3,       155);  // ang1,ang2, ang
359  add_c_bool_fun("jump_state",1,1,            156);  // don't reset current_frame 
360
361  add_c_bool_fun("morphing",0,0,              168);
362  add_c_bool_fun("damage_fun",6,6,            169);
363  add_c_bool_fun("gravity",0,0,               170);
364  add_c_bool_fun("make_view_solid",1,1,       171);
365  add_c_function("find_rgb",3,3,              172);
366
367  add_c_function("player_x_suggest",0,0,      173);  // return player "joystick" x
368  add_c_function("player_y_suggest",0,0,      174);
369  add_c_function("player_b1_suggest",0,0,     175);
370  add_c_function("player_b2_suggest",0,0,     176);
371  add_c_function("player_b3_suggest",0,0,     177);
372
373  add_c_bool_fun("set_bg_scroll",4,4,         178);  // xmul xdiv ymul ydiv
374  add_c_bool_fun("set_ambient_light",2,2,     179);  // player, 0..63 (out of bounds ignored)
375  add_c_function("ambient_light",1,1,         180);  // player
376  add_c_bool_fun("has_object",1,1,            181);  // true if linked with object x
377  add_c_bool_fun("set_otype",1,1,             182);  // otype
378
379  add_c_function("current_frame",0,0,         184); 
380  add_c_function("fx",0,0,                    185);
381  add_c_function("fy",0,0,                    186);
382  add_c_function("fxvel",0,0,                 187);
383  add_c_function("fyvel",0,0,                 188);
384  add_c_function("fxacel",0,0,                189);
385  add_c_function("fyacel",0,0,                190);
386  add_c_bool_fun("set_stat_bar",2,2,          191);  // filename, object
387  add_c_bool_fun("set_fg_tile",3,3,           192);  // x,y, tile #
388  add_c_function("fg_tile",2,2,               193);  // x,y
389  add_c_bool_fun("set_bg_tile",3,3,           194);  // x,y, tile #
390  add_c_function("bg_tile",2,2,               195);  // x,y
391  add_c_bool_fun("load_tiles",1,-1,           196);  // filename1, filename2...
392  add_c_bool_fun("load_palette",1,1,          197);  // filename
393  add_c_bool_fun("load_color_filter",1,1,     198);  // filename
394  add_c_bool_fun("create_players",1,1,        199);  // player type, returns true if game is networked
395  add_c_bool_fun("try_move",2,3,              200);  // xv yv (check_top=t) -> returns T if not blocked
396  add_c_function("sequence_length",1,1,       201);  // sequence number
397  add_c_bool_fun("can_see",5,5,               202);  // x1,y1, x2,y2, chars_block
398  add_c_function("load_big_font",2,2,         203);  // filename, name
399  add_c_function("load_small_font",2,2,       204);  // filename, name
400  add_c_function("load_console_font",2,2,     205);  // filename, name
401  add_c_function("set_current_frame",1,1,     206); 
402
403  add_c_bool_fun("draw_transparent",2,2,      208);  // count, max
404  add_c_bool_fun("draw_tint",1,1,             209);  // tint id number
405  add_c_bool_fun("draw_predator",0,0,         210);  // tint_number
406
407  add_c_function("shift_down",1,1,            211);  // player
408  add_c_function("shift_right",1,1,           212);  // player
409  add_c_bool_fun("set_no_scroll_range",5,5,   213);  // player, x1,y1,x2,y2
410
411  add_c_function("def_image",2,2,             215);  // filename,name
412  add_c_bool_fun("put_image",3,3,             216);  // x,y,id
413  add_c_function("view_x1",0,0,               217);
414  add_c_function("view_y1",0,0,               218);
415  add_c_function("view_x2",0,0,               219);
416  add_c_function("view_y2",0,0,               220);
417  add_c_function("view_push_down",1,1,        221);
418  add_c_bool_fun("local_player",0,0,          222);
419  add_c_bool_fun("save_game",1,1,             223);  // filename
420  add_c_bool_fun("set_hp",1,1,                224);
421  add_c_bool_fun("request_level_load",1,1,    225);  // filename
422  add_c_bool_fun("set_first_level",1,1,       226);  // filename
423  add_c_function("def_tint",1,1,              227);  // filename
424  add_c_function("tint_palette",3,3,          228);  // radd,gadd,badd
425  add_c_function("player_number",0,0,         229); 
426  add_c_bool_fun("set_current_weapon",1,1,    230);  // type
427  add_c_bool_fun("has_weapon",1,1,            231);  // type
428  add_c_bool_fun("ambient_ramp",1,1,          232);
429  add_c_function("total_players",0,0,         233);
430  add_c_bool_fun("scatter_line",6,6,          234);  // x1,y1,x2,y2, color, scatter value
431  add_c_function("game_tick",0,0,             235);
432  add_c_bool_fun("isa_player",0,0,            236);
433  add_c_bool_fun("shift_rand_table",1,1,      237);  // amount
434  add_c_function("total_frames",0,0,          238);
435  add_c_function("raise",0,0,                 239);  // call only from reload constructor!
436  add_c_function("lower",0,0,                 240);  // call only from reload constructor!
437
438  add_c_function("player_pointer_x",0,0,      241);
439  add_c_function("player_pointer_y",0,0,      242);
440  add_c_bool_fun("frame_panic",0,0,           243);
441  add_c_bool_fun("ascatter_line",7,7,         244);  // x1,y1,x2,y2, color1, color2, scatter value
442  add_c_function("rand_on",0,0,               245);
443  add_c_function("set_rand_on",1,1,           246);
444  add_c_function("bar",5,5,                   247);
445  add_c_function("argc",0,0,                  248);
446  add_c_bool_fun("play_song",1,1,             249);  // filename
447  add_c_bool_fun("stop_song",0,0,             250);
448  add_c_bool_fun("targetable",0,0,            251);
449  add_c_bool_fun("set_targetable",1,1,        252);  // T or nil
450  add_c_bool_fun("show_stats",0,0,            253);
451
452  add_c_function("kills",0,0,                 254);
453  add_c_function("tkills",0,0,                255);
454  add_c_function("secrets",0,0,               256);
455  add_c_function("tsecrets",0,0,              257);
456
457  add_c_bool_fun("set_kills",1,1,             258);
458  add_c_bool_fun("set_tkills",1,1,            259);
459  add_c_bool_fun("set_secrets",1,1,           260);
460  add_c_bool_fun("set_tsecrets",1,1,          261);
461  add_c_bool_fun("request_end_game",0,0,      262);
462  add_c_function("get_save_slot",0,0,         263);
463  add_c_bool_fun("mem_report",0,0,            264);
464  add_c_function("major_version",0,0,         265);
465  add_c_function("minor_version",0,0,         266);
466  add_c_bool_fun("draw_double_tint",2,2,      267);  // tint1 id number, tint 2 id number
467  add_c_function("image_width",1,1,           268);  // image number
468  add_c_function("image_height",1,1,          269);  // image number
469  add_c_function("foreground_width",0,0,      270);
470  add_c_function("foreground_height",0,0,     271);
471  add_c_function("background_width",0,0,      272);
472  add_c_function("background_height",0,0,     273);
473  add_c_function("get_key_code",1,1,          274);  // name of key, returns code that can be used with keypressed
474  add_c_bool_fun("set_cursor_shape",3,3,      275);  // image id, x hot, y hot
475  add_c_bool_fun("start_server",0,0,          276);
476  add_c_bool_fun("put_string",4,5,            277);  // font,x,y,string, [color]
477  add_c_function("font_width",1,1,            278);  // font
478  add_c_function("font_height",1,1,           279);  // font
479  add_c_bool_fun("chat_print",1,1,            280);  // chat string
480  add_c_bool_fun("set_player_name",1,1,       281);  // name
481  add_c_bool_fun("draw_bar",5,5,              282);  // x1,y1,x2,y2,color
482  add_c_bool_fun("draw_rect",5,5,             283);  // x1,y1,x2,y2,color
483  add_c_bool_fun("get_option",1,1,            284);
484  add_c_bool_fun("dir_exsist",1,1,            285);
485  add_c_bool_fun("chdir",1,1,                 286);
486  add_c_bool_fun("nice_copy",3,3,             287);  // source file, dest file
487  add_c_bool_fun("set_delay_on",1,1,          288);  // T or nil
488  add_c_bool_fun("set_login",1,1,             289);  // name
489  add_c_bool_fun("enable_chatting",0,0,       290);
490  add_c_bool_fun("demo_break_enable",0,0,     291);
491  add_c_bool_fun("am_a_client",0,0,           292);
492  add_c_bool_fun("time_for_next_level",0,0,   293);
493  add_c_bool_fun("reset_kills",0,0,           294);
494  add_c_bool_fun("set_game_name",1,1,         295);  // name
495  add_c_bool_fun("set_net_min_players",1,1,   296);
496 
497
498  add_lisp_function("go_state",1,1,              0);
499  add_lisp_function("with_object",2,-1,          1);
500  add_lisp_function("bmove",0,1,                 2);   // returns true=unblocked, nil=block, or object
501  add_lisp_function("me",0,0,                    3);
502  add_lisp_function("bg",0,0,                    4);
503  add_lisp_function("find_closest",1,1,          5);
504  add_lisp_function("find_xclosest",1,1,         6);
505  add_lisp_function("find_xrange",2,2,           7);
506  add_lisp_function("add_object",3,4,            8);    // type, x,y (type)
507  add_lisp_function("first_focus",0,0,           9);
508  add_lisp_function("next_focus",1,1,           10);
509  add_lisp_function("get_object",1,1,           11);
510  add_lisp_function("get_light",1,1,            12);
511  add_lisp_function("with_objects",1,1,         13);
512  add_lisp_function("add_light",7,7,            14);   // type, x, y, r1, r2, xshift, yshift
513  add_lisp_function("find_enemy",1,1,           15);   // exclude
514  add_lisp_function("user_fun",0,-1,            16);   // calls anobject's user function
515  add_lisp_function("time",2,2,                 17);   // returns a fixed point (times and operation)
516  add_lisp_function("name",0,0,                 18);   // returns current object's name (for debugin)
517  add_lisp_function("float_tick",0,0,           19);
518  add_lisp_function("find_object_in_area",5,5,  20);  // x1, y1, x2, y2  type_list
519  add_lisp_function("find_object_in_angle",3,3, 21);  // start_angle end_angle type_list
520  add_lisp_function("add_object_after",3,4,     22);  // type, x,y (type)
521  add_lisp_function("def_char",2,-1,            23);  // needs at least 2 parms
522  add_lisp_function("see_dist",4,4,             24);  // returns longest unblocked path from x1,y1,x2,y2
523  add_lisp_function("platform",0,0,             25);
524  add_lisp_function("level_name",0,0,           26);
525  add_lisp_function("ant_ai",0,0,               27);
526  add_lisp_function("sensor_ai",0,0,            28);
527  add_lisp_function("dev_draw",0,0,             29);
528  add_lisp_function("top_ai",0,0,               30);
529  add_lisp_function("laser_ufun",2,2,           31);
530  add_lisp_function("top_ufun",2,2,             32);
531
532  add_lisp_function("player_rocket_ufun",2,2,   34);
533
534  if (registered)
535  {
536    add_lisp_function("plaser_ufun",2,2,          33);
537    add_lisp_function("lsaber_ufun",2,2,          35);
538  }
539
540
541  add_lisp_function("cop_mover",3,3,            36);
542  add_lisp_function("latter_ai",0,0,            37);
543  add_lisp_function("with_obj0",-1,-1,          38);
544  add_lisp_function("activated",0,0,            39);
545  add_lisp_function("top_draw",0,0,             40);
546  add_lisp_function("bottom_draw",0,0,          41);
547  add_lisp_function("mover_ai",0,0,             42);
548  add_lisp_function("sgun_ai",0,0,              43);
549  add_lisp_function("last_savegame_name",0,0,   44);
550  add_lisp_function("next_savegame_name",0,0,   45);
551  add_lisp_function("argv",1,1,                 46);
552  add_lisp_function("joy_stat",0,0,             47);  // xm ym b1 b2 b3
553  add_lisp_function("mouse_stat",0,0,           48);  // mx my b1 b2 b3
554  add_lisp_function("mouse_to_game",2,2,        49);  // pass in x,y -> x,y
555  add_lisp_function("game_to_mouse",2,2,        50);  // pass in x,y -> x,y
556  add_lisp_function("get_main_font",0,0,        51);
557  add_lisp_function("player_name",0,0,          52);
558  add_lisp_function("nice_input",3,3,           53);  // title, prompt, default -> returns input
559  add_lisp_function("get_cwd",0,0,              54);
560  add_lisp_function("system",1,1,               55);
561  add_lisp_function("convert_slashes",2,2,      56);
562  add_lisp_function("show_yes_no",4,4,          57);
563  add_lisp_function("get_directory",1,1,        58);  // path
564  add_lisp_function("nice_menu",3,3,            59);  // title, menu_title, list -> return selection number
565  add_lisp_function("respawn_ai",0,0,           60);
566
567  add_lisp_function("score_draw",0,0,           61);
568  add_lisp_function("show_kills",0,0,           62);
569  add_lisp_function("mkptr",1,1,                63); 
570  add_lisp_function("seq",3,3,                  64);
571}
572
573
574// Note : args for l_caller have not been evaluated yet!
575void *l_caller(long number, void *args)
576{
577  p_ref r1(args);
578  switch (number)
579  {
580    case 0 :
581    {
582      current_object->set_aistate(lnumber_value(eval(CAR(args))));
583      current_object->set_aistate_time(0);
584      void *ai=figures[current_object->otype]->get_fun(OFUN_AI);
585      if (!ai)
586      {
587                                lbreak("hrump... call to go_state, and no ai function defined?\n"
588                                       "Are you calling from move function (not mover)?\n");
589                                exit(0);
590      }
591      return eval_function((lisp_symbol *)ai,NULL);
592    } break;
593    case 1 :
594    {
595      game_object *old_cur=current_object;
596      current_object=(game_object *)lpointer_value(eval(CAR(args)));
597      void *ret=eval_block(CDR(args));
598      current_object=old_cur;
599      return ret;
600    }  break;
601
602
603    case 2 :
604    {
605      int whit;
606      game_object *o;
607      if (args)
608        o=(game_object *)lpointer_value(eval(CAR(args)));
609      else o=current_object;
610      game_object *hit=current_object->bmove(whit,o);
611      if (hit)
612        return new_lisp_pointer(hit);
613      else if (whit) return NULL;
614      else return true_symbol;
615    } break;
616
617    case 3 : return new_lisp_pointer(current_object); break;
618    case 4 :
619    { if (player_list->next)
620        return new_lisp_pointer(current_level->attacker(current_object));
621      else return new_lisp_pointer(player_list->focus); } break;
622    case 5 : return new_lisp_pointer(current_level->find_closest(current_object->x,
623                                                                 current_object->y,
624                                                       lnumber_value(eval(CAR(args))),
625                                                       current_object)); break;
626    case 6 : return new_lisp_pointer(current_level->find_xclosest(current_object->x,
627                                                                  current_object->y,
628                                                                  lnumber_value(eval(CAR(args))),
629                                                                  current_object
630                                                                  )); break;
631    case 7 :
632    {
633      long n1=lnumber_value(eval(CAR(args)));
634      long n2=lnumber_value(eval(CAR(CDR(args))));
635      return new_lisp_pointer(current_level->find_xrange(current_object->x,
636                                                         current_object->y,
637                                                         n1,
638                                                         n2
639                                                         ));
640    } break;
641    case 8 :
642    {
643      int type=lnumber_value(eval(CAR(args)));          args=CDR(args);
644      long x=lnumber_value(eval(CAR(args)));       args=CDR(args);
645      long y=lnumber_value(eval(CAR(args)));  args=CDR(args);
646      game_object *o;
647      if (args)
648        o=create(type,x,y,0,lnumber_value(eval(CAR(args))));
649      else
650        o=create(type,x,y);
651      if (current_level)
652        current_level->add_object(o);
653      return new_lisp_pointer(o);
654    } break;
655    case 22 :
656    {
657      int type=lnumber_value(eval(CAR(args)));          args=CDR(args);
658      long x=lnumber_value(eval(CAR(args)));       args=CDR(args);
659      long y=lnumber_value(eval(CAR(args)));  args=CDR(args);
660      game_object *o;
661      if (args)
662        o=create(type,x,y,0,lnumber_value(eval(CAR(args))));
663      else
664        o=create(type,x,y);
665      if (current_level)
666        current_level->add_object_after(o,current_object);
667      return new_lisp_pointer(o);
668    } break;
669
670    case 9 : return new_lisp_pointer(the_game->first_view->focus); break;
671    case 10 :
672    {
673      view *v=((game_object *)lpointer_value(eval(CAR(args))))->controller()->next;
674      if (v)
675        return new_lisp_pointer(v->focus);
676      else return NULL;
677    } break;
678    case 11 :
679    {
680      return new_lisp_pointer
681      ((void *)current_object->get_object(lnumber_value(eval(CAR(args)))));
682    } break;
683    case 12 :
684    {
685      return new_lisp_pointer
686      ((void *)current_object->get_light(lnumber_value(eval(CAR(args)))));
687    } break;
688    case 13 :
689    {
690      game_object *old_cur=current_object;
691      void *ret=NULL;
692      for (int i=0;i<old_cur->total_objects();i++)
693      {
694                                current_object=old_cur->get_object(i);
695                                ret=eval(CAR(args));
696      }
697      current_object=old_cur;
698      return ret;
699    } break;
700    case 14 :
701    {
702      int t=lnumber_value(eval(CAR(args))); args=lcdr(args);
703      int x=lnumber_value(eval(CAR(args))); args=lcdr(args);
704      int y=lnumber_value(eval(CAR(args))); args=lcdr(args);
705      int r1=lnumber_value(eval(CAR(args))); args=lcdr(args);
706      int r2=lnumber_value(eval(CAR(args))); args=lcdr(args);
707      int xs=lnumber_value(eval(CAR(args))); args=lcdr(args);
708      int ys=lnumber_value(eval(CAR(args)));
709      return new_lisp_pointer(add_light_source(t,x,y,r1,r2,xs,ys));
710    } break;
711    case 15 :
712    {
713//      return current_lev shit
714    } break;
715    case 16 :
716    {
717      void *f=figures[current_object->otype]->get_fun(OFUN_USER_FUN);
718      if (!f) return NULL;
719      return eval_function((lisp_symbol *)f,args);     
720    } break;
721    case 17 :
722    {
723      long trials=lnumber_value(eval(CAR(args)));
724      args=CDR(args);
725      time_marker start;
726      for (int x=0;x<trials;x++)
727      {
728                                clear_tmp();
729                                eval(CAR(args));
730      }
731      time_marker end;
732      return new_lisp_fixed_point((long)(end.diff_time(&start)*(1<<16)));
733    } break;
734    case 18 :
735    { return new_lisp_string(object_names[current_object->otype]); } break;
736    case 19 :
737    { return current_object->float_tick(); } break;
738    case 20 :
739    {
740      long x1=lnumber_value(eval(CAR(args))); args=CDR(args);
741      long y1=lnumber_value(eval(CAR(args))); args=CDR(args);
742      long x2=lnumber_value(eval(CAR(args))); args=CDR(args);
743      long y2=lnumber_value(eval(CAR(args))); args=CDR(args);
744
745      void *list=eval(CAR(args));
746      game_object *find=current_level->find_object_in_area(current_object->x,
747                                              current_object->y,
748                                              x1,y1,x2,y2,list,current_object);
749      if (find) return new_lisp_pointer(find);
750      else return NULL;
751    } break;
752
753    case 21 :
754    {
755      long a1=lnumber_value(eval(CAR(args))); args=CDR(args);
756      long a2=lnumber_value(eval(CAR(args))); args=CDR(args);
757
758      void *list=eval(CAR(args));
759      p_ref r1(list);
760      game_object *find=current_level->find_object_in_angle(current_object->x,
761                                                        current_object->y,
762                                                        a1,a2,list,current_object);
763      if (find) return new_lisp_pointer(find);
764      else return NULL;
765    } break;
766    case 23 :         // def_character
767    {
768      lisp_symbol *sym=(lisp_symbol *)lcar(args);
769      if (item_type(sym)!=L_SYMBOL)
770      {
771                                lbreak("expecting first arg to def-character to be a symbol!\n");
772                                exit(0);
773      }
774      int sp=current_space;
775      current_space=PERM_SPACE;
776      set_symbol_number(sym,total_objects);   // set the symbol value to the object number
777      current_space=sp;
778      if (!total_objects)
779      {
780        object_names=(char **)jmalloc(sizeof(char *)*(total_objects+1),"object name list");
781                                figures=(character_type **)jmalloc(sizeof(character_type *)*(total_objects+1),"character types");
782      }
783      else
784      {
785        object_names=(char **)jrealloc(object_names,sizeof(char *)*(total_objects+1),
786                                       "object name list");
787                                figures=(character_type **)jrealloc(figures,sizeof(character_type *)*(total_objects+1),
788                                            "character types");
789      }
790
791      object_names[total_objects]=strcpy(
792                                  (char *)jmalloc(strlen(lstring_value(symbol_name(sym)))+1,"object name"),
793                                         lstring_value(symbol_name(sym)));
794      figures[total_objects]=new character_type(CDR(args),sym);
795      total_objects++;
796      return new_lisp_number(total_objects-1);
797    } break;
798    case 24 :
799    {
800      long x1=lnumber_value(eval(CAR(args)));  args=CDR(args);
801      long y1=lnumber_value(eval(CAR(args)));  args=CDR(args);
802      long x2=lnumber_value(eval(CAR(args)));  args=CDR(args);
803      long y2=lnumber_value(eval(CAR(args)));
804      current_level->foreground_intersect(x1,y1,x2,y2);
805      void *ret=NULL;
806      push_onto_list(new_lisp_number(y2),ret);
807      push_onto_list(new_lisp_number(x2),ret);
808      return ret;
809    } break;
810    case 25 :
811    {
812#ifdef __WATCOMC__
813      return make_find_symbol("WATCOM");
814#endif
815#ifdef __linux__
816      return make_find_symbol("LINUX");
817#endif
818
819#ifdef __sgi
820      return make_find_symbol("IRIX");
821#endif
822
823#ifdef __MAC__
824      return make_find_symbol("MAC");
825#endif
826
827    } break;
828    case 26 :
829    {
830      return new_lisp_string(current_level->name());
831    } break;
832    case 27 : return ant_ai(); break;
833    case 28 : return sensor_ai(); break;
834    case 29 : if (dev&EDIT_MODE) current_object->drawer(); break;
835    case 30 : return top_ai(); break;
836    case 31 : return laser_ufun(args); break;
837    case 32 : return top_ufun(args); break;
838    case 33 : return plaser_ufun(args); break;
839    case 34 : return player_rocket_ufun(args); break;
840    case 35 : return lsaber_ufun(args); break;
841    case 36 :
842    {
843     
844      long xm,ym,but;
845      xm=lnumber_value(CAR(args)); args=CDR(args);
846      ym=lnumber_value(CAR(args)); args=CDR(args);
847      but=lnumber_value(CAR(args));
848      return cop_mover(xm,ym,but);
849    } break;
850    case 37 : return ladder_ai(); break;
851    case 38 :
852    {
853      game_object *old_cur=current_object;
854      current_object=current_object->get_object(0);
855      void *ret=eval_block(args);
856      current_object=old_cur;
857      return ret;
858    }  break;
859    case 39 :
860    {
861      if (current_object->total_objects()==0)
862        return true_symbol;
863      else if (current_object->get_object(0)->aistate())
864        return true_symbol;
865      else return NULL;
866    } break;
867    case 40 : top_draw(); break;
868    case 41 : bottom_draw(); break;
869    case 42 : return mover_ai(); break;
870    case 43 : return sgun_ai();
871    case 44 :
872    {
873      char nm[50];
874      last_savegame_name(nm);
875      return new_lisp_string(nm);
876    } break;
877    case 45 :
878    {
879      char nm[50];
880      sprintf(nm,"save%04d.pcx",load_game(1,symbol_str("LOAD")));
881//      get_savegame_name(nm);
882      the_game->reset_keymap();
883      return new_lisp_string(nm);
884    } break;
885    case 46 :
886    {
887      return new_lisp_string(start_argv[lnumber_value(eval(CAR(args)))]);
888    } break;
889    case 47 :
890    {
891      int xv,yv,b1,b2,b3;
892      if (has_joystick)
893        joy_status(b1,b2,b3,xv,yv);
894      else b1=b2=b3=xv=yv=0;
895
896      void *ret=NULL;
897      p_ref r1(ret);
898      push_onto_list(new_lisp_number(b3),ret);
899      push_onto_list(new_lisp_number(b2),ret);
900      push_onto_list(new_lisp_number(b1),ret);
901      push_onto_list(new_lisp_number(yv),ret);
902      push_onto_list(new_lisp_number(xv),ret);
903      return ret;
904    } break;
905    case 48 :
906    {
907      void *ret=NULL;
908      {
909        p_ref r1(ret);
910        push_onto_list(new_lisp_number((last_demo_mbut&4)==4),ret);
911        push_onto_list(new_lisp_number((last_demo_mbut&2)==2),ret);
912        push_onto_list(new_lisp_number((last_demo_mbut&1)==1),ret);
913        push_onto_list(new_lisp_number(last_demo_my),ret);
914        push_onto_list(new_lisp_number(last_demo_mx),ret);
915      }
916      return ret;
917    } break;
918    case 49 :
919    {
920      long x=lnumber_value(eval(CAR(args))); args=CDR(args);
921      long y=lnumber_value(eval(CAR(args))); args=CDR(args);
922
923      long rx,ry;
924      the_game->mouse_to_game(x,y,rx,ry);
925      void *ret=NULL;
926      {
927        p_ref r1(ret);
928        push_onto_list(new_lisp_number(ry),ret);
929        push_onto_list(new_lisp_number(rx),ret);
930      }
931      return ret;
932    } break;
933    case 50 :
934    {
935      long x=lnumber_value(eval(CAR(args))); args=CDR(args);
936      long y=lnumber_value(eval(CAR(args))); args=CDR(args);
937
938      long rx,ry;
939      the_game->game_to_mouse(x,y,current_view,rx,ry);
940      void *ret=NULL;
941      {
942        p_ref r1(ret);
943        push_onto_list(new_lisp_number(ry),ret);
944        push_onto_list(new_lisp_number(rx),ret);
945      }
946      return ret;
947    } break;
948    case 51 :   return new_lisp_pointer(eh->font()); break;
949    case 52 :
950    {
951      view *c=current_object->controller();
952      if (!c)
953        lbreak("object is not a player, cannot return name");
954      else
955        return new_lisp_string(c->name);
956    } break;
957    case 53 :
958    {
959      char tit[100],prompt[100],def[100];
960      strcpy(tit,lstring_value(eval(CAR(args))));  args=CDR(args);
961      strcpy(prompt,lstring_value(eval(CAR(args))));  args=CDR(args);
962      strcpy(def,lstring_value(eval(CAR(args))));  args=CDR(args);
963      return nice_input(tit,prompt,def);
964    } break;
965    case 54 :
966    {
967      char cd[150];
968      getcwd(cd,100);
969      return new_lisp_string(cd);
970    } break;
971    case 55 :
972    { system(lstring_value(eval(CAR(args)))); } break;
973    case 56 :
974    {
975      void *fn=eval(CAR(args)); args=CDR(args);
976      char tmp[200];
977      {
978        p_ref r1(fn);
979        char *slash=lstring_value(eval(CAR(args)));
980        char *filename=lstring_value(fn);
981
982        char *s=filename,*tp;
983       
984        for (tp=tmp;*s;s++,tp++)
985        {
986          if (*s=='/' || *s=='\\')
987          *tp=*slash;
988          else *tp=*s;
989        }
990        *tp=0;
991      }
992      return new_lisp_string(tmp);
993    } break;
994    case 57 :
995    {
996      return show_yes_no(CAR(args),CAR(CDR(args)),CAR(CDR(CDR(args))),CAR(CDR(CDR(CDR(args)))));
997    } break;
998    case 58 :
999    {
1000      char **files,**dirs;
1001      int tfiles,tdirs,i;
1002
1003      get_directory(lstring_value(eval(CAR(args))),files,tfiles,dirs,tdirs);
1004      void *fl=NULL,*dl=NULL,*rl=NULL;
1005      {
1006        p_ref r1(fl),r2(dl);
1007       
1008        for (i=tfiles-1;i>=0;i--) { push_onto_list(new_lisp_string(files[i]),fl); jfree(files[i]); }
1009        jfree(files);
1010
1011        for (i=tdirs-1;i>=0;i--) { push_onto_list(new_lisp_string(dirs[i]),dl); jfree(dirs[i]); }
1012        jfree(dirs);
1013       
1014        push_onto_list(dl,rl);
1015        push_onto_list(fl,rl);
1016      }
1017     
1018      return rl;
1019    } break;
1020    case 59 :
1021    {
1022      return nice_menu(CAR(args),CAR(CDR(args)),CAR(CDR(CDR(args))));
1023    } break;
1024    case 60 : return respawn_ai(); break;
1025    case 61 : return score_draw();  break;
1026    case 62 : return show_kills(); break;
1027    case 63 :
1028    {
1029        long x;
1030        sscanf(lstring_value(eval(CAR(args))),"%x",&x);
1031        return new_lisp_pointer((void *)x);
1032    } break;
1033    case 64 :
1034    {
1035      char name[256],name2[256];
1036      strcpy(name,lstring_value(eval(CAR(args))));  args=CDR(args);
1037      long first=lnumber_value(eval(CAR(args)));  args=CDR(args);
1038      long last=lnumber_value(eval(CAR(args)));
1039      long i;
1040      void *ret=NULL;
1041      p_ref r1(ret);
1042
1043      if (last>=first)
1044      {
1045        for (i=last;i>=first;i--)
1046        {
1047          sprintf(name2,"%s%04d.pcx",name,i);
1048          push_onto_list(new_lisp_string(name2),ret);
1049        }
1050      } else
1051      {
1052        for (i=last;i<=first;i++)
1053        {
1054          sprintf(name2,"%s%04d.pcx",name,i);
1055          push_onto_list(new_lisp_string(name2),ret);
1056        }
1057      }     
1058      return ret;
1059    }
1060  }
1061  return NULL;
1062}
1063
1064//extern bFILE *rcheck,*rcheck_lp;
1065
1066// arguments have already been evaled..
1067long c_caller(long number, void *args)
1068{
1069  p_ref r1(args);
1070  switch (number)
1071  {
1072
1073    case 1 :
1074    { return abs(current_object->x-current_level->attacker(current_object)->x); } break;
1075    case 2 : return abs(current_object->y-current_level->attacker(current_object)->y); break;
1076    case 3 :
1077    {
1078      if (!current_object->controller())
1079        lbreak("object is not a player, cannot determine keypresses");
1080      else
1081        return current_object->controller()->key_down(lnumber_value(CAR(args)));
1082    } break;
1083    case 4 : return the_game->key_down(lnumber_value(CAR(args)));  break;
1084
1085    case 5 : return current_level->attacker(current_object)->state; break;
1086    case 6 : return current_object->aitype(); break;
1087    case 7 :
1088    {
1089      if (!current_object->keep_ai_info())
1090        current_object->set_aistate(0);
1091      return current_object->aistate();
1092    } break;
1093    case 8 :
1094    {
1095      int ns=lnumber_value(CAR(args));
1096      current_object->set_aistate_time(0);     
1097      current_object->set_aistate(ns); return 1;
1098    } break;
1099    case 9 :
1100    {
1101/*      if (rcheck_lp)
1102      {
1103        char str[100];
1104        sprintf(str,"\n\nTick %d, Rand_on %d\n",current_level->tick_counter(),rand_on);
1105        rcheck_lp->write(str,strlen(str)+1);
1106        current_print_file=rcheck_lp;
1107        print_trace_stack(6);
1108        current_print_file=NULL;
1109      }*/
1110
1111      return jrandom(lnumber_value(CAR(args)));
1112    } break;
1113    case 10 : return current_object->aistate_time(); break;
1114    case 11 : return current_object->state; break;
1115    case 12 : if (current_level->attacker(current_object)->x>current_object->x) return 1;
1116              else return -1; break;
1117    case 13 : return current_object->move(lnumber_value(CAR(args)),lnumber_value(CAR(CDR(args))),
1118                                   lnumber_value(CAR(CDR(CDR(args))))); break;
1119    case 14 : if (current_object->direction>0) return 1; else return -1; break;
1120    case 15 : return current_object->otype; break;
1121    case 16 : return current_object->next_picture(); break;
1122    case 17 : current_object->set_fade_dir(lnumber_value(CAR(args))); return 1; break;
1123    case 18 :
1124    {
1125      int cx=lnumber_value(CAR(args));
1126      args=CDR(args);
1127      int cy=lnumber_value(CAR(args));
1128      args=CDR(args);
1129      int but=lnumber_value(CAR(args));
1130      return current_object->mover(cx,cy,but);
1131    } break;
1132    case 19 : current_object->set_fade_count(lnumber_value(CAR(args))); return 1; break;
1133    case 20 : return current_object->fade_count(); break;
1134    case 21 : return current_object->fade_dir(); break;
1135    case 22 :
1136    {
1137      long x1,y1,x2,y2,xp1,yp1,xp2,yp2;
1138      current_level->attacker(current_object)->picture_space(x1,y1,x2,y2);
1139      current_object->picture_space(xp1,yp1,xp2,yp2);
1140      if (xp1>x2 || xp2<x1 || yp1>y2 || yp2<y1) return 0;
1141      else return 1;
1142    } break;
1143    case 23 : current_object->add_power(lnumber_value(CAR(args))); break;
1144    case 24 : current_object->add_hp(lnumber_value(CAR(args))); break;
1145
1146    case 27 :
1147    { current_object->drawer(); return 1; } break;
1148    case 28 :
1149    { return (dev & EDIT_MODE); } break;
1150    case 29 :
1151    { current_object->draw_above(current_view); return 1; } break;
1152    case 30 : return current_object->x; break;
1153    case 31 : return current_object->y; break;
1154    case 32 :
1155    { long v=lnumber_value(CAR(args));
1156      current_object->x=v;
1157//      current_object->last_x=v;
1158      return 1;
1159    } break;
1160    case 33 :
1161    { long v=lnumber_value(CAR(args));
1162      current_object->y=v;
1163//      current_object->last_y=v;
1164      return 1;
1165    } break;
1166
1167    case 34 : { return current_level->push_characters(current_object,lnumber_value(CAR(args)),
1168                                            lnumber_value(CAR(CDR(args))));
1169              } break;
1170
1171    case 37 :
1172    {
1173      long s=lnumber_value(CAR(args));
1174      current_object->set_state((character_state)s);
1175      return (s==current_object->state);
1176    } break;
1177
1178    case 38 : return current_level->attacker(current_object)->x; break;
1179    case 39 : return current_level->attacker(current_object)->y; break;
1180    case 40 : current_object->change_aitype(lnumber_value(CAR(args))); return 1; break;
1181
1182    case 42 : return current_object->xvel(); break;
1183    case 43 : return current_object->yvel(); break;
1184    case 44 : current_object->set_xvel(lnumber_value(CAR(args))); return 1; break;
1185    case 45 : current_object->set_yvel(lnumber_value(CAR(args))); return 1; break;
1186    case 46 : if (current_level->attacker(current_object)->x>current_object->x) return -1;
1187              else return 1; break;
1188    case 47 : return lnumber_value(CAR(args))&BLOCKED_LEFT; break;
1189    case 48 : return lnumber_value(CAR(args))&BLOCKED_RIGHT; break;
1190
1191    case 50 : dev_cont->add_palette(args); break;
1192    case 51 : write_PCX(screen,pal,lstring_value(CAR(args))); break;
1193
1194    case 52 : the_game->zoom=lnumber_value(CAR(args)); the_game->draw(); break;
1195    case 55 : the_game->show_help(lstring_value(CAR(args))); break;
1196
1197    case 56 : return current_object->direction; break;
1198    case 57 : current_object->direction=lnumber_value(CAR(args)); break;
1199    case 58 :
1200    {
1201      int x1=lnumber_value(CAR(args));
1202      if (!current_object->controller())     
1203      { lbreak("set_freeze_time : object is not a focus\n"); }
1204      else current_object->controller()->freeze_time=x1; return 1;
1205    } break;
1206    case 59 : return menu(args,big_font); break;
1207    case 60 :
1208    { event ev; dev_cont->do_command(lstring_value(CAR(args)),ev); return 1; } break;
1209    case 61 : the_game->set_state(lnumber_value(CAR(args))); break;
1210
1211    case 62 :
1212    {
1213      int x1=lnumber_value(CAR(args)); args=CDR(args);
1214      int y1=lnumber_value(CAR(args)); args=CDR(args);
1215      int x2=lnumber_value(CAR(args)); args=CDR(args);
1216      int y2=lnumber_value(CAR(args));
1217      scene_director.set_text_region(x1,y1,x2,y2);
1218    } break;
1219    case 63 : scene_director.set_frame_speed(lnumber_value(CAR(args))); break;
1220    case 64 : scene_director.set_scroll_speed(lnumber_value(CAR(args))); break;
1221    case 65 : scene_director.set_pan_speed(lnumber_value(CAR(args))); break;
1222    case 66 : scene_director.scroll_text(lstring_value(CAR(args))); break;
1223    case 67 : scene_director.set_pan(lnumber_value(CAR(args)),
1224                                 lnumber_value(CAR(CDR(args))),
1225                                 lnumber_value(CAR(CDR(CDR(args))))); break;
1226    case 68 : scene_director.wait(CAR(args)); break;
1227
1228
1229    case 73 : the_game->set_level(new level(lnumber_value(CAR(args)),
1230                                            lnumber_value(CAR(CDR(args))),
1231                                            lstring_value(CAR(CDR(CDR(args)))))); break;
1232    case 74 :
1233    { if (current_level) delete current_level;
1234      current_level=new level(100,100,"new_level");
1235    } break;
1236    case 75 :
1237    {
1238      int amount=lnumber_value(CAR(args)); args=CDR(args);
1239      game_object *o=((game_object *)lpointer_value(CAR(args))); args=CDR(args);
1240      int xv=0,yv=0;
1241      if (args)
1242      {
1243        xv=lnumber_value(CAR(args)); args=CDR(args);
1244        yv=lnumber_value(CAR(args));
1245      }
1246      o->do_damage(amount,current_object,current_object->x,current_object->y,xv,yv);
1247    } break;
1248    case 76 : return current_object->hp(); break;
1249    case 77 :
1250    {
1251      game_object *o=(game_object *)lpointer_value(CAR(args));
1252      if (!o->controller())     
1253                                dprintf("set shift : object is not a focus\n");
1254      else o->controller()->shift_down=lnumber_value(CAR(CDR(args))); return 1;
1255    } break;
1256    case 78 :
1257    {
1258      game_object *o=(game_object *)lpointer_value(CAR(args));
1259      if (!o->controller())     
1260                                dprintf("set shift : object is not a focus\n");
1261      else o->controller()->shift_right=lnumber_value(CAR(CDR(args))); return 1;
1262    } break;
1263    case 79 : current_object->set_gravity(lnumber_value(CAR(args))); return 1; break;
1264    case 80 : return current_object->tick(); break;
1265    case 81 : current_object->set_xacel((lnumber_value(CAR(args)))); return 1; break;
1266    case 82 : current_object->set_yacel((lnumber_value(CAR(args)))); return 1; break;
1267    case 84 : set_local_players(lnumber_value(CAR(args))); return 1; break;
1268    case 85 : return total_local_players(); break;
1269    case 86 : light_detail=lnumber_value(CAR(args)); return 1; break;
1270    case 87 : return light_detail; break;
1271    case 88 : morph_detail=lnumber_value(CAR(args)); return 1; break;
1272    case 89 : return morph_detail; break;
1273    case 90 : current_object->morph_into(lnumber_value(CAR(args)),NULL,
1274                                         lnumber_value(CAR(CDR(args))),
1275                                         lnumber_value(CAR(CDR(CDR(args))))); return 1; break;
1276    case 91 : current_object->add_object((game_object *)lpointer_value(CAR(args))); return 1; break;
1277    case 92 :
1278    {
1279      long cx1,x1=lnumber_value(CAR(args)); args=lcdr(args);
1280      long cy1,y1=lnumber_value(CAR(args)); args=lcdr(args);
1281      long cx2,x2=lnumber_value(CAR(args)); args=lcdr(args);
1282      long cy2,y2=lnumber_value(CAR(args)); args=lcdr(args);
1283      long c=lnumber_value(CAR(args));
1284      the_game->game_to_mouse(x1,y1,current_view,cx1,cy1);
1285      the_game->game_to_mouse(x2,y2,current_view,cx2,cy2);
1286      screen->line(cx1,cy1,cx2,cy2,c);
1287      return 1;
1288    } break;
1289    case 93 : return eh->dark_color(); break;
1290    case 94 : return eh->medium_color(); break;
1291    case 95 : return eh->bright_color(); break;
1292
1293    case 99 : current_object->remove_object((game_object *)lpointer_value(CAR(args))); return 1; break;
1294    case 100 : current_object->add_light((light_source *)lpointer_value(CAR(args))); return 1; break;
1295    case 101 : current_object->remove_light((light_source *)lpointer_value(CAR(args))); return 1; break;
1296    case 102 : return current_object->total_objects(); break;
1297    case 103 : return current_object->total_lights(); break;
1298
1299    case 104 : 
1300    { light_source *l=(light_source *)lpointer_value(CAR(args));
1301      long x=lnumber_value(CAR(CDR(args)));
1302      if (x>=1)
1303        l->inner_radius=x;
1304      l->calc_range();
1305      return 1;
1306    } break;
1307    case 105 : 
1308    { light_source *l=(light_source *)lpointer_value(CAR(args));
1309      long x=lnumber_value(CAR(CDR(args)));
1310      if (x>l->inner_radius)
1311        l->outer_radius=x;
1312      l->calc_range();
1313      return 1;
1314    } break;
1315    case 106 : 
1316    { light_source *l=(light_source *)lpointer_value(CAR(args));
1317      l->x=lnumber_value(CAR(CDR(args)));
1318      l->calc_range();
1319      return 1;
1320    } break;
1321    case 107 : 
1322    { light_source *l=(light_source *)lpointer_value(CAR(args));
1323      l->y=lnumber_value(CAR(CDR(args)));
1324      l->calc_range();
1325      return 1;
1326    } break;
1327    case 108 : 
1328    { light_source *l=(light_source *)lpointer_value(CAR(args));
1329      l->xshift=lnumber_value(CAR(CDR(args)));
1330      l->calc_range();
1331      return 1;
1332    } break;
1333    case 109 : 
1334    { light_source *l=(light_source *)lpointer_value(CAR(args));
1335      l->yshift=lnumber_value(CAR(CDR(args)));
1336      l->calc_range();
1337      return 1;
1338    } break;
1339    case 110 : return ((light_source *)lpointer_value(CAR(args)))->inner_radius; break;
1340    case 111 : return ((light_source *)lpointer_value(CAR(args)))->outer_radius; break;
1341    case 112 : return ((light_source *)lpointer_value(CAR(args)))->x; break;
1342    case 113 : return ((light_source *)lpointer_value(CAR(args)))->y; break;
1343    case 114 : return ((light_source *)lpointer_value(CAR(args)))->xshift; break;
1344    case 115 : return ((light_source *)lpointer_value(CAR(args)))->yshift; break;
1345    case 116 : return current_object->xacel(); break;
1346    case 117 : return current_object->yacel(); break;
1347    case 118 : current_level->remove_light((light_source *)lpointer_value(CAR(args))); break;
1348    case 119 : current_object->set_fx(lnumber_value(CAR(args))); break;
1349    case 120 : current_object->set_fy(lnumber_value(CAR(args))); break;
1350    case 121 : current_object->set_fxvel(lnumber_value(CAR(args))); break;
1351    case 122 : current_object->set_fyvel(lnumber_value(CAR(args))); break;
1352    case 123 : current_object->set_fxacel(lnumber_value(CAR(args))); break;
1353    case 124 : current_object->set_fyacel(lnumber_value(CAR(args))); break;
1354    case 125 : return current_object->picture()->width(); break;
1355    case 126 : return current_object->picture()->height(); break;
1356    case 127 : { dprintf("trap\n"); } break;   // I use this to set gdb break points
1357    case 128 : { return current_level->platform_push(current_object,lnumber_value(CAR(args)),
1358                                            lnumber_value(CAR(CDR(args))));
1359                                            } break;
1360    case 133 :  // def_sound
1361    {
1362      lisp_symbol *sym=NULL;
1363      if (CDR(args))
1364      {
1365        sym=(lisp_symbol *)lcar(args);
1366        if (item_type(sym)!=L_SYMBOL)
1367        {
1368          lbreak("expecting first arg to def-character to be a symbol!\n");
1369          exit(0);
1370        }
1371        args=CDR(args);
1372      }
1373
1374      int sp=current_space;
1375      current_space=PERM_SPACE;
1376      int id=cash.reg(lstring_value(lcar(args)),NULL,SPEC_EXTERN_SFX,1);
1377      if (sym)
1378        set_symbol_number(sym,id);    // set the symbol value to sfx id                             
1379      current_space=sp;
1380      return id;
1381    } break;
1382    case 134 :  // play_sound
1383    {
1384      void *a=args;
1385      p_ref r1(a);
1386      int id=lnumber_value(lcar(a));
1387      if (id<0) return 0;
1388      a=CDR(a);
1389      if (!a)
1390        cash.sfx(id)->play(127);
1391      else
1392      {
1393        int vol=lnumber_value(lcar(a)); a=CDR(a);
1394        if (a)
1395        {
1396          long x=lnumber_value(lcar(a)); a=CDR(a);
1397          if (!a)
1398          {
1399            lprint(args);
1400            lbreak("expecting y after x in play_sound\n");
1401            exit(1);
1402          }
1403          long y=lnumber_value(lcar(a));
1404          the_game->play_sound(id,vol,x,y);
1405        } else cash.sfx(id)->play(vol);       
1406      }
1407
1408    } break;
1409
1410    case 137 : return defun_pseq(args); break;
1411    case 138 :
1412    { int id=lnumber_value(CAR(args)); args=CDR(args);
1413      long x=lnumber_value(CAR(args)); args=CDR(args);
1414      long y=lnumber_value(CAR(args)); args=CDR(args);
1415      long dir=lnumber_value(CAR(args));
1416      add_panim(id,x,y,dir);
1417    } break;
1418    case 142 :
1419    {
1420      long x=lnumber_value(CAR(args)); args=CDR(args);
1421      if (x<0 || x>=total_weapons)
1422      {
1423        lbreak("weapon out of range (%d)\n",x);
1424        exit(0);
1425      }
1426      return weapon_types[x];
1427    } break;
1428    case 143 :
1429    {
1430      long x=lnumber_value(CAR(args)); args=CDR(args);
1431      long y=lnumber_value(CAR(args)); args=CDR(args);
1432      long r=lnumber_value(CAR(args)); args=CDR(args);
1433      long m=lnumber_value(CAR(args)); args=CDR(args);
1434      game_object *o=(game_object *)lpointer_value(CAR(args)); args=CDR(args);
1435      long mp=lnumber_value(CAR(args));
1436      current_level->hurt_radius(x,y,r,m,current_object,o,mp);
1437    } break;
1438
1439    case 144 :
1440    {
1441      view *v=current_object->controller();
1442      if (!v) dprintf("Can't add weapons for non-players\n");
1443      else
1444      {
1445        long x=lnumber_value(CAR(args)); args=CDR(args);
1446        long y=lnumber_value(CAR(args)); args=CDR(args);
1447        if (x<0 || x>=total_weapons)
1448        { lbreak("weapon out of range (%d)\n",x); exit(0); }
1449        v->add_ammo(x,y);
1450      }     
1451    } break;
1452    case 145 :
1453    {
1454      view *v=current_object->controller();
1455      if (!v) return 0;
1456      else return v->weapon_total(lnumber_value(CAR(args)));
1457    } break;
1458    case 146 :
1459    {
1460      view *v=current_object->controller();
1461      if (!v) return 0; else return v->current_weapon;
1462    } break;
1463    case 147 :
1464    {
1465      view *v=current_object->controller();
1466      if (!v) { lbreak("current_weapon_type : object cannot hold weapons\n");
1467                return 0; }
1468      else return v->current_weapon;
1469    } break;
1470    case 148 : return lnumber_value(CAR(args))&BLOCKED_UP; break;
1471    case 149 : return lnumber_value(CAR(args))&BLOCKED_DOWN; break;
1472    case 150 :
1473    {
1474      view *v=current_object->controller();
1475      int x=lnumber_value(CAR(args));
1476      if (x<0 || x>=total_weapons)
1477      { lbreak("weapon out of range (%d)\n",x); exit(0); }
1478      if (v) v->give_weapon(x);
1479    } break;
1480    case 151 :
1481    {
1482      int a=lnumber_value(CAR(args));
1483      if (a<0 || a>=TOTAL_ABILITIES)
1484      {
1485        lprint(args);
1486        lbreak("bad ability number for get_ability, should be 0..%d, not %d\n",
1487                TOTAL_ABILITIES,a);
1488        exit(0);
1489      }
1490      return get_ability(current_object->otype,(ability)a);
1491    } break;
1492    case 152 :
1493    {
1494      view *v=current_object->controller();
1495      if (!v) dprintf("Can't use reset_player on non-players\n");
1496      else
1497        v->reset_player();           
1498    } break;
1499    case 153 :
1500    {
1501      game_object *o=(game_object *)lpointer_value(CAR(args));
1502      long x=o->x-current_object->x,
1503        y=-(o->y-o->picture()->height()/2-(current_object->y-(current_object->picture()->height()/2)));
1504      return lisp_atan2(y,x);
1505    } break;
1506    case 154 :
1507    {
1508      long ang=lnumber_value(CAR(args)); args=CDR(args);
1509      long mag=lfixed_point_value(CAR(args));
1510      long xvel=(lisp_cos(ang)>>8)*(mag>>8);
1511      current_object->set_xvel(xvel>>16);
1512      current_object->set_fxvel((xvel&0xffff)>>8);
1513      long yvel=-(lisp_sin(ang)>>8)*(mag>>8);
1514      current_object->set_yvel(yvel>>16);
1515      current_object->set_fyvel((yvel&0xffff)>>8);     
1516    } break;
1517    case 155 :
1518    {
1519      int tframes=current_object->total_frames(),f;
1520
1521      long ang1=lnumber_value(CAR(args)); args=CDR(args);     
1522      if (ang1<0) ang1=(ang1%360)+360;
1523      else if (ang1>=360) ang1=ang1%360;
1524      long ang2=lnumber_value(CAR(args)); args=CDR(args);     
1525      if (ang2<0) ang2=(ang2%360)+360;
1526      else if (ang2>=360) ang2=ang2%360;
1527
1528      long ang=(lnumber_value(CAR(args))+90/tframes)%360;
1529      if (ang1>ang2)
1530      {
1531        if (ang<ang1 && ang>ang2)       
1532          return 0;
1533        else if (ang>=ang1)     
1534          f=(ang-ang1)*tframes/(359-ang1+ang2+1);
1535        else
1536          f=(359-ang1+ang)*tframes/(359-ang1+ang2+1);
1537      } else if (ang<ang1 || ang>ang2)
1538        return 0;
1539      else f=(ang-ang1)*tframes/(ang2-ang1+1);
1540      if (current_object->direction>0)
1541        current_object->current_frame=f;
1542      else
1543        current_object->current_frame=tframes-f-1;
1544      return 1;
1545    } break;
1546    case 156 :
1547    {
1548      int x=current_object->current_frame;
1549      current_object->set_state((character_state)lnumber_value(CAR(args)));
1550      current_object->current_frame=x;
1551    } break;
1552
1553    case 168 : if (current_object->morph_status()) return 1; else return 0; break;
1554    case 169 :
1555    {
1556      long am=lnumber_value(CAR(args)); args=CDR(args);
1557      game_object *from=(game_object *)lpointer_value(CAR(args)); args=CDR(args);
1558      long hitx=lnumber_value(CAR(args)); args=CDR(args);     
1559      long hity=lnumber_value(CAR(args)); args=CDR(args);     
1560      long px=lnumber_value(CAR(args)); args=CDR(args);     
1561      long py=lnumber_value(CAR(args)); args=CDR(args);
1562      current_object->damage_fun(am,from,hitx,hity,px,py);
1563    } break;
1564    case 170 : return current_object->gravity(); break;
1565    case 171 :
1566    {
1567      view *v=current_object->controller();
1568      if (!v) dprintf("make_view_solid : object has no view\n");
1569      else
1570        v->draw_solid=lnumber_value(CAR(args));     
1571    } break;
1572    case 172 :
1573    {
1574      void *a=args;
1575      int r=lnumber_value(CAR(a)); a=CDR(a);
1576      int g=lnumber_value(CAR(a)); a=CDR(a);
1577      int b=lnumber_value(CAR(a));
1578      if (r<0 || b<0 || g<0 || r>255 || g>255 || b>255)
1579      {
1580        lprint(args);
1581        lbreak("color out of range (0..255) in color lookup\n");
1582        exit(0);
1583      }
1584      return color_table->lookup_color(r>>3,g>>3,b>>3);
1585    } break;
1586    case 173 :
1587    {
1588      view *v=current_object->controller();
1589      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
1590      else return v->x_suggestion;
1591    } break;
1592    case 174 :
1593    {
1594      view *v=current_object->controller();
1595      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
1596      else return v->y_suggestion;
1597    } break;
1598    case 175 :
1599    {
1600      view *v=current_object->controller();
1601      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
1602      else return v->b1_suggestion;
1603    } break;
1604    case 176 :
1605    {
1606      view *v=current_object->controller();
1607      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
1608      else return v->b2_suggestion;
1609    } break;
1610    case 177 :
1611    {
1612      view *v=current_object->controller();
1613      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
1614      else return v->b3_suggestion;
1615    } break;
1616    case 178 :
1617    {
1618      bg_xmul=lnumber_value(CAR(args)); args=CDR(args);
1619      bg_xdiv=lnumber_value(CAR(args)); args=CDR(args);
1620      bg_ymul=lnumber_value(CAR(args)); args=CDR(args);
1621      bg_ydiv=lnumber_value(CAR(args));
1622      if (bg_xdiv==0) { bg_xdiv=1; lprint(args); dprintf("bg_set_scroll : cannot set xdiv to 0\n"); }
1623      if (bg_ydiv==0) { bg_ydiv=1; lprint(args); dprintf("bg_set_scroll : cannot set ydiv to 0\n"); }
1624    } break;
1625    case 179 :
1626    {
1627      view *v=lget_view(CAR(args),"set_ambient_light");       args=CDR(args);
1628      long x=lnumber_value(CAR(args));
1629      if (x>=0 && x<64) v->ambient=x;
1630    } break;
1631    case 180 : return lget_view(CAR(args),"ambient_light")->ambient; break;
1632    case 181 :
1633    {
1634      int x=current_object->total_objects();
1635      game_object *who=(game_object *)lpointer_value(CAR(args));
1636      for (int i=0;i<x;i++)
1637        if (current_object->get_object(i)==who) return 1;
1638      return 0;
1639    } break;
1640    case 182 : current_object->change_type(lnumber_value(CAR(args))); break;
1641    case 184 : return current_object->current_frame; break;
1642
1643    case 185 : return current_object->fx(); break;
1644    case 186 : return current_object->fy(); break;
1645    case 187 : return current_object->fxvel(); break;
1646    case 188 : return current_object->fyvel(); break;
1647    case 189 : return current_object->fxacel(); break;
1648    case 190 : return current_object->fyacel(); break;
1649    case 191 :
1650    {
1651      char *fn=lstring_value(CAR(args)); args=CDR(args);     
1652//      stat_bar=cash.reg_object(fn,CAR(args),SPEC_IMAGE,1);
1653    } break;
1654    case 192 :
1655    {     
1656      long x=lnumber_value(CAR(args)); args=CDR(args);
1657      long y=lnumber_value(CAR(args)); args=CDR(args);
1658      long type=lnumber_value(CAR(args));
1659      if (x<0 || y<0 || x>=current_level->foreground_width() || y>=current_level->foreground_width())
1660        lbreak("%d %d is out of range of fg map",x,y);
1661      else     
1662        current_level->put_fg(x,y,type);
1663    } break;
1664    case 193 :
1665    {
1666      long x=lnumber_value(CAR(args)); args=CDR(args);
1667      long y=lnumber_value(CAR(args));
1668      if (x<0 || y<0 || x>=current_level->foreground_width() || y>=current_level->foreground_width())
1669        lbreak("%d %d is out of range of fg map",x,y);
1670      else return current_level->get_fg(x,y);
1671    } break;
1672    case 194 :
1673    {     
1674      long x=lnumber_value(CAR(args)); args=CDR(args);
1675      long y=lnumber_value(CAR(args)); args=CDR(args);
1676      long type=lnumber_value(CAR(args));
1677      if (x<0 || y<0 || x>=current_level->background_width() || y>=current_level->background_width())
1678        lbreak("%d %d is out of range of fg map",x,y);
1679      else     
1680        current_level->put_bg(x,y,type);
1681    } break;
1682    case 195 :
1683    {
1684      long x=lnumber_value(CAR(args)); args=CDR(args);
1685      long y=lnumber_value(CAR(args));
1686      if (x<0 || y<0 || x>=current_level->background_width() || y>=current_level->background_width())
1687        lbreak("%d %d is out of range of fg map",x,y);
1688      else return current_level->get_bg(x,y);
1689    } break;
1690    case 196 : load_tiles(args); break;
1691    case 197 :
1692    {
1693      bFILE *fp=open_file(lstring_value(CAR(args)),"rb");
1694      if (fp->open_failure())
1695      {
1696        delete fp;
1697        lbreak("load_palette : could not open file %s for reading",lstring_value(CAR(args)));
1698        exit(1);
1699      } else
1700      {
1701        spec_directory sd(fp);
1702        spec_entry *se=sd.find(SPEC_PALETTE);
1703        if (!se) lbreak("File %s has no palette!\n",lstring_value(CAR(args)));
1704        else
1705        {
1706          if (pal) delete pal;
1707          pal=new palette(se,fp);
1708        }
1709        delete fp;
1710      }
1711    } break;
1712    case 198 :
1713    {
1714      bFILE *fp=open_file(lstring_value(CAR(args)),"rb");
1715      if (fp->open_failure())
1716      {
1717        delete fp;
1718        lbreak("load_color_filter : could not open file %s for reading",lstring_value(CAR(args)));
1719        exit(1);
1720      } else
1721      {
1722        spec_directory sd(fp);
1723        spec_entry *se=sd.find(SPEC_COLOR_TABLE);
1724        if (!se) lbreak("File %s has no color filter!",lstring_value(CAR(args)));
1725        else
1726        {
1727          if (color_table) delete color_table;
1728          color_table=new color_filter(se,fp);
1729        }
1730        delete fp;
1731      }
1732    } break;
1733    case 199 :
1734    {
1735      current_start_type=lnumber_value(CAR(args));
1736      set_local_players(1);
1737    } break;
1738    case 200 :
1739    {
1740      long xv=lnumber_value(CAR(args));  args=CDR(args);
1741      long yv=lnumber_value(CAR(args));  args=CDR(args);
1742      int top=2;
1743      if (args)
1744        if (!CAR(args)) top=0;
1745       
1746      long oxv=xv,oyv=yv;
1747      current_object->try_move(current_object->x,current_object->y,xv,yv,1|top);
1748      current_object->x+=xv;
1749      current_object->y+=yv;
1750      return (oxv==xv && oyv==yv);
1751    } break;
1752    case 201 :
1753    {
1754      long x=lnumber_value(CAR(args));
1755      return figures[current_object->otype]->get_sequence((character_state)x)->length();
1756    } break;
1757    case 202 :
1758    {
1759      long x1=lnumber_value(CAR(args)); args=CDR(args);
1760      long y1=lnumber_value(CAR(args)); args=CDR(args);
1761      long x2=lnumber_value(CAR(args)); args=CDR(args);
1762      long y2=lnumber_value(CAR(args)); args=CDR(args);
1763      void *block_all=CAR(args);
1764      long nx2=x2,ny2=y2;
1765      current_level->foreground_intersect(x1,y1,x2,y2);
1766      if (x2!=nx2 || y2!=ny2) return 0;
1767     
1768      if (block_all)
1769        current_level->all_boundary_setback(current_object,x1,y1,x2,y2);
1770      else
1771        current_level->boundary_setback(current_object,x1,y1,x2,y2);
1772      return (x2==nx2 && y2==ny2);
1773
1774    } break;
1775    case 203 :
1776    {
1777      char *fn=lstring_value(CAR(args)); args=CDR(args);
1778      char *name=lstring_value(CAR(args));
1779      big_font_pict=cash.reg(fn,name,SPEC_IMAGE,1);     
1780    } break;
1781    case 204 :
1782    {
1783      char *fn=lstring_value(CAR(args)); args=CDR(args);
1784      char *name=lstring_value(CAR(args));
1785      small_font_pict=cash.reg(fn,name,SPEC_IMAGE,1);     
1786    } break;
1787    case 205 :
1788    {
1789      char *fn=lstring_value(CAR(args)); args=CDR(args);
1790      char *name=lstring_value(CAR(args));
1791      console_font_pict=cash.reg(fn,name,SPEC_IMAGE,1);     
1792    } break;
1793    case 206 :
1794    {
1795      long x=lnumber_value(CAR(args));
1796      if (x<current_object->total_frames())
1797        current_object->current_frame=x;
1798      else     
1799        lbreak("%d out of range for set_current_frame",x);
1800    } break;
1801   
1802    case 208 :
1803    {
1804      current_object->draw_trans(lnumber_value(CAR(args)),lnumber_value(CAR(CDR(args))));
1805    } break;
1806    case 209 :
1807    {
1808      current_object->draw_tint(lnumber_value(CAR(args)));
1809    } break;
1810    case 210 :
1811    {
1812      current_object->draw_predator();
1813    } break;
1814    case 211:
1815    { return lget_view(CAR(args),"shift_down")->shift_right; } break;
1816    case 212:
1817    { return lget_view(CAR(args),"shift_right")->shift_down; } break;
1818    case 213 :
1819    { view *v=lget_view(CAR(args),"set_no_scroll_range"); args=CDR(args);
1820      v->no_xleft=lnumber_value(CAR(args)); args=CDR(args);
1821      v->no_ytop=lnumber_value(CAR(args));  args=CDR(args);
1822      v->no_xright=lnumber_value(CAR(args)); args=CDR(args);
1823      v->no_ybottom=lnumber_value(CAR(args));
1824    } break;
1825    case 215 :
1826    {
1827      char *fn=lstring_value(CAR(args)); args=CDR(args);
1828      char *name=lstring_value(CAR(args)); args=CDR(args);
1829      return cash.reg(fn,name,SPEC_IMAGE,1);
1830    } break;
1831    case 216 :
1832    {
1833      long x1=lnumber_value(CAR(args)); args=lcdr(args);
1834      long y1=lnumber_value(CAR(args)); args=lcdr(args);
1835      long id=lnumber_value(CAR(args));
1836      cash.img(id)->put_image(screen,x1,y1,1);
1837    } break;
1838    case 217 :
1839    {
1840      view *v=current_object->controller();
1841      if (!v) lbreak("object has no view : view_x1");
1842      else return v->cx1;
1843    } break;
1844    case 218 :
1845    {
1846      view *v=current_object->controller();
1847      if (!v) lbreak("object has no view : view_x1");
1848      else return v->cy1;
1849    } break;
1850    case 219 :
1851    {
1852      view *v=current_object->controller();
1853      if (!v) lbreak("object has no view : view_x1");
1854      else return v->cx2;
1855    } break;
1856    case 220 :
1857    {
1858      view *v=current_object->controller();
1859      if (!v) lbreak("object has no view : view_x1");
1860      else return v->cy2;
1861    } break;
1862    case 221 :
1863    {
1864      view *v=current_object->controller();
1865      if (!v) lbreak("object has no view : view_push_down");
1866      else v->last_y-=lnumber_value(CAR(args));
1867    } break;
1868    case 222 :
1869    {
1870      view *v=current_object->controller();
1871      if (!v) lbreak("object has no view : local_player");
1872      else return v->local_player();
1873    } break;
1874    case 223 :
1875    {
1876      char *fn=lstring_value(CAR(args));
1877      current_level->save(fn,1);
1878    } break;
1879    case 224 :
1880    {
1881      current_object->set_hp(lnumber_value(CAR(args)));   
1882    } break;
1883    case 225 :
1884    {
1885      char *fn=lstring_value(CAR(args));
1886      the_game->request_level_load(fn);
1887    } break;
1888    case 226 :
1889    {
1890      strcpy(level_file,lstring_value(CAR(args)));
1891    } break;
1892    case 227 :   
1893    {
1894      return cash.reg(lstring_value(CAR(args)),"palette",SPEC_PALETTE,1);
1895    } break;
1896    case 228 :
1897    {
1898      palette *p=pal->copy();
1899      uchar *addr=(uchar *)p->addr();
1900      int r,g,b;
1901      int ra=lnumber_value(CAR(args)); args=CDR(args);
1902      int ga=lnumber_value(CAR(args)); args=CDR(args);
1903      int ba=lnumber_value(CAR(args));
1904      for (int i=0;i<256;i++)
1905      {
1906        r=(int)*addr+ra; if (r>255) r=255; else if (r<0) r=0; *addr=(uchar)r; addr++;
1907        g=(int)*addr+ga; if (g>255) g=255; else if (g<0) g=0; *addr=(uchar)g; addr++;
1908        b=(int)*addr+ba; if (b>255) b=255; else if (b<0) b=0; *addr=(uchar)b; addr++;
1909      }
1910      p->load();
1911      delete p;
1912    } break;
1913    case 229 :
1914    {
1915      view *v=current_object->controller();
1916      if (!v) lbreak("object has no view : local_player");
1917      else return v->player_number;
1918    } break;
1919    case 230 :
1920    {
1921      view *v=current_object->controller();
1922      if (!v) lbreak("object has no view : local_player");
1923      else
1924      {
1925        long x=lnumber_value(CAR(args));
1926        if (x<0 || x>=total_weapons)
1927        { lbreak("weapon out of range (%d)\n",x); exit(0); }
1928        v->current_weapon=x;   
1929      }
1930    } break;
1931    case 231 :
1932    {
1933      view *v=current_object->controller();
1934      if (!v) lbreak("object has no view : local_player");
1935      else return v->has_weapon(lnumber_value(CAR(args)));
1936    } break;
1937    case 232 :
1938    {
1939      ambient_ramp+=lnumber_value(CAR(args));
1940    } break;
1941
1942    case 233 :
1943    { int x=0; view *v=player_list; for (;v;v=v->next,x++); return x; } break;
1944
1945    case 234 :
1946    {
1947      long cx1,x1=lnumber_value(CAR(args)); args=lcdr(args);
1948      long cy1,y1=lnumber_value(CAR(args)); args=lcdr(args);
1949      long cx2,x2=lnumber_value(CAR(args)); args=lcdr(args);
1950      long cy2,y2=lnumber_value(CAR(args)); args=lcdr(args);
1951      long c=lnumber_value(CAR(args)); args=lcdr(args);
1952      long s=lnumber_value(CAR(args));
1953      the_game->game_to_mouse(x1,y1,current_view,cx1,cy1);
1954      the_game->game_to_mouse(x2,y2,current_view,cx2,cy2);
1955      scatter_line(cx1,cy1,cx2,cy2,c,s);
1956      return 1;
1957
1958    } break;
1959    case 235 :
1960    { if (current_level) return current_level->tick_counter();
1961      else return 0; } break;
1962    case 236 :
1963    {
1964      return current_object->controller()!=NULL;
1965    } break;
1966    case 237 :
1967    {
1968      rand_on+=lnumber_value(CAR(args)); return 1;
1969    } break;
1970    case 238 :
1971    {
1972      return current_object->total_frames();
1973    } break;
1974    case 239 :
1975    { current_level->to_front(current_object); } break;
1976    case 240 :
1977    { current_level->to_back(current_object); } break;
1978    case 241 :
1979    {
1980      view *v=current_object->controller();
1981      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
1982      else return v->pointer_x;
1983    } break;
1984    case 242 :
1985    {
1986      view *v=current_object->controller();
1987      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
1988      else return v->pointer_y;
1989    } break;
1990    case 243 :
1991    {
1992      if (player_list->next || demo_man.current_state()!=demo_manager::NORMAL)
1993        return 0;
1994      else
1995        return (frame_panic>10);
1996    } break;
1997    case 244 :
1998    {
1999      long cx1,x1=lnumber_value(CAR(args)); args=lcdr(args);
2000      long cy1,y1=lnumber_value(CAR(args)); args=lcdr(args);
2001      long cx2,x2=lnumber_value(CAR(args)); args=lcdr(args);
2002      long cy2,y2=lnumber_value(CAR(args)); args=lcdr(args);
2003      long c1=lnumber_value(CAR(args)); args=lcdr(args);
2004      long c2=lnumber_value(CAR(args)); args=lcdr(args);
2005      long s=lnumber_value(CAR(args));
2006      the_game->game_to_mouse(x1,y1,current_view,cx1,cy1);
2007      the_game->game_to_mouse(x2,y2,current_view,cx2,cy2);
2008      ascatter_line(cx1,cy1,cx2,cy2,c1,c2,s);
2009      return 1;
2010
2011    } break;
2012    case 245 :
2013    {
2014      return rand_on;
2015    } break;
2016    case 246 :
2017    {
2018      rand_on=lnumber_value(CAR(args));
2019    } break;
2020    case 247 :
2021    {
2022      long cx1=lnumber_value(CAR(args)); args=lcdr(args);
2023      long cy1=lnumber_value(CAR(args)); args=lcdr(args);
2024      long cx2=lnumber_value(CAR(args)); args=lcdr(args);
2025      long cy2=lnumber_value(CAR(args)); args=lcdr(args);
2026      long c1=lnumber_value(CAR(args)); args=lcdr(args);     
2027      screen->bar(cx1,cy1,cx2,cy2,c1);
2028    } break;
2029    case 248 :
2030    {
2031      return start_argc;
2032    } break;
2033    case 249 :
2034    {
2035      if ((sound_avail&MUSIC_INITIALIZED))
2036      {
2037        char *fn=lstring_value(CAR(args));
2038        if (current_song)
2039        {
2040          if (current_song->playing())
2041          current_song->stop();
2042          delete current_song;
2043        }
2044        current_song=new song(fn);
2045        current_song->play(music_volume);
2046        dprintf("Playing %s at volume %d\n",fn,music_volume);
2047      }
2048    } break;
2049    case 250 :
2050    {
2051      if (current_song && current_song->playing())
2052        current_song->stop();
2053      delete current_song;
2054      current_song=NULL;
2055    } break;
2056    case 251 : return current_object->targetable(); break;
2057    case 252 : current_object->set_targetable( CAR(args)==NULL ? 0 : 1); break;
2058    case 253 : show_stats(); break;
2059    case 254 :
2060    {
2061      view *v=current_object->controller();
2062      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
2063      else return v->kills;
2064    } break;
2065    case 255 :
2066    {
2067      view *v=current_object->controller();
2068      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
2069      else return v->tkills;
2070    } break;
2071    case 256 :
2072    {
2073      view *v=current_object->controller();
2074      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
2075      else return v->secrets;
2076    } break;
2077    case 257 :
2078    {
2079      view *v=current_object->controller();
2080      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
2081      else return v->tsecrets;
2082    } break;
2083    case 258 :
2084    {
2085      view *v=current_object->controller();
2086      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
2087      else v->kills=lnumber_value(CAR(args));
2088    } break;
2089    case 259 :
2090    {
2091      view *v=current_object->controller();
2092      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
2093      else v->tkills=lnumber_value(CAR(args));
2094    } break;
2095    case 260 :
2096    {
2097      view *v=current_object->controller();
2098      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
2099      else v->secrets=lnumber_value(CAR(args));
2100    } break;
2101    case 261 :
2102    {
2103      view *v=current_object->controller();
2104      if (!v) { lprint(args); dprintf("get_player_inputs : object has no view!\n"); }
2105      else v->tsecrets=lnumber_value(CAR(args));
2106    } break;
2107    case 262 :
2108    {
2109      the_game->request_end();
2110    } break;
2111    case 263 :
2112    {
2113      the_game->reset_keymap();
2114      return load_game(1,symbol_str("SAVE")); //get_save_spot(); shit
2115    } break;
2116    case 264 :
2117    {
2118      mem_report("mem.rep");
2119    } break;
2120    case 265 :
2121    {
2122      return major_version;
2123    } break;
2124    case 266 :
2125    {
2126      return minor_version;
2127    } break;
2128    case 267 :
2129    {
2130      current_object->draw_double_tint(lnumber_value(CAR(args)),lnumber_value(CAR(CDR(args))));
2131    } break;
2132    case 268 :
2133    {
2134      return cash.img(lnumber_value(CAR(args)))->width();
2135    } break;
2136    case 269 :
2137    {
2138      return cash.img(lnumber_value(CAR(args)))->height();
2139    } break;
2140    case 270 :
2141    {
2142      return current_level->foreground_width();
2143    } break;
2144    case 271 :
2145    {
2146      return current_level->foreground_height();
2147    } break;
2148    case 272 :
2149    {
2150      return current_level->background_width();
2151    } break;
2152    case 273 :
2153    {
2154      return current_level->background_height();
2155    } break;
2156    case 274 :
2157    {
2158      return get_keycode(lstring_value(CAR(args)));
2159    }
2160    case 275 :
2161    {
2162      int id=lnumber_value(CAR(args));  args=CDR(args);
2163      int x=lnumber_value(CAR(args));  args=CDR(args);
2164      int y=lnumber_value(CAR(args));
2165      c_target=id;
2166      if (screen)
2167        eh->set_mouse_shape(cash.img(c_target)->copy(),x,y);
2168    } break;
2169    case 276 :
2170    {     
2171      if (!main_net_cfg) return 0;
2172      return become_server(game_name);
2173    } break;
2174    case 277 :
2175    {
2176      JCFont *fnt=(JCFont *)lpointer_value(CAR(args)); args=CDR(args);
2177      long x=lnumber_value(CAR(args));       args=CDR(args);
2178      long y=lnumber_value(CAR(args));       args=CDR(args);
2179      char *st=lstring_value(CAR(args));     args=CDR(args);
2180      int color=-1;
2181      if (args)
2182        color=lnumber_value(CAR(args));
2183      fnt->put_string(screen,x,y,st,color);
2184    } break;
2185    case 278 : return ((JCFont *)lpointer_value(CAR(args)))->width(); break;
2186    case 279 : return ((JCFont *)lpointer_value(CAR(args)))->height(); break;
2187    case 280 : if (chat) chat->put_all(lstring_value(CAR(args))); break;
2188    case 281 :
2189    {
2190      view *v=current_object->controller();
2191      if (!v) { lbreak("get_player_name : object has no view!\n"); }
2192      else strcpy(v->name,lstring_value(CAR(args)));
2193    } break;
2194    case 282 :
2195    {
2196      long x1=lnumber_value(CAR(args));   args=CDR(args);
2197      long y1=lnumber_value(CAR(args));   args=CDR(args);
2198      long x2=lnumber_value(CAR(args));   args=CDR(args);
2199      long y2=lnumber_value(CAR(args));   args=CDR(args);
2200      long c=lnumber_value(CAR(args));
2201      screen->bar(x1,y1,x2,y2,c);
2202    } break;
2203    case 283 :
2204    {
2205      long x1=lnumber_value(CAR(args));   args=CDR(args);
2206      long y1=lnumber_value(CAR(args));   args=CDR(args);
2207      long x2=lnumber_value(CAR(args));   args=CDR(args);
2208      long y2=lnumber_value(CAR(args));   args=CDR(args);
2209      long c=lnumber_value(CAR(args));
2210      screen->rectangle(x1,y1,x2,y2,c);
2211    } break;
2212    case 284 :
2213    {
2214      if (get_option(lstring_value(CAR(args))))
2215        return 1;
2216      else return 0;
2217    } break;
2218    case 285 :
2219    {
2220      char cd[100];
2221      getcwd(cd,100);
2222      int t=change_dir(lstring_value(CAR(args)));
2223      change_dir(cd);
2224      return t;
2225    } break;
2226    case 286 :
2227    {
2228      if (change_dir(lstring_value(CAR(args))))
2229        return 1;
2230      else return 0;     
2231    } break;
2232    case 287 :
2233    {
2234      void *title=CAR(args); args=CDR(args);
2235      void *source=CAR(args); args=CDR(args);
2236      void *dest=CAR(args); args=CDR(args);
2237
2238      return nice_copy(lstring_value(title),lstring_value(source),lstring_value(dest));     
2239    } break;
2240    case 288 :
2241    {
2242      if (CAR(args)) the_game->set_delay(1); else the_game->set_delay(0);
2243    } break;
2244    case 289 :
2245    {
2246      set_login(lstring_value(CAR(args)));   
2247    } break;
2248    case 290 :
2249    {
2250      chatting_enabled=1;
2251    } break;
2252    case 291 :
2253    {
2254      demo_start=1;
2255    } break;
2256    case 292 :
2257    {
2258      if (main_net_cfg && main_net_cfg->state==net_configuration::CLIENT)
2259        return 1;
2260    } break;
2261    case 293 :
2262    {
2263      if (main_net_cfg && (main_net_cfg->state==net_configuration::CLIENT || main_net_cfg->state==net_configuration::SERVER))
2264      {
2265        view *v=player_list;
2266        for (;v;v=v->next)
2267           if (v->kills>=main_net_cfg->kills)
2268             return 1;
2269       
2270
2271      } else return 0;
2272    } break;
2273    case 294 :
2274    {
2275      view *v=player_list;
2276      for (;v;v=v->next)
2277      {
2278        v->tkills+=v->kills;
2279
2280        v->kills=0;
2281        game_object *o=current_object;
2282        current_object=v->focus;
2283
2284        eval_function((lisp_symbol *)l_restart_player,NULL);
2285        v->reset_player();
2286        v->focus->set_aistate(0);
2287        current_object=o;       
2288      }
2289
2290    } break;
2291    case 295 :
2292    {
2293      strncpy(game_name,lstring_value(CAR(args)),sizeof(game_name));
2294      game_name[sizeof(game_name)-1]=0;
2295
2296    } break;
2297    case 296 :
2298    {
2299      if (main_net_cfg)
2300        main_net_cfg->min_players=lnumber_value(CAR(args));
2301    } break;
2302
2303
2304    default :
2305      dprintf("Undefined c function %d\n",number);
2306      return 0;
2307  }
2308  return 0;
2309}
2310
2311int get_lprop_number(void *symbol, int def)  // returns def if symbol undefined or not number type
2312{
2313  void *v=symbol_value(symbol);
2314  if (v)
2315  {
2316    switch (item_type(v))
2317    {
2318      case L_FIXED_POINT :
2319      case L_NUMBER :
2320      { return lnumber_value(v); } break;
2321      default : return def;                   
2322    }
2323  } else return def;
2324}
2325
2326
Note: See TracBrowser for help on using the repository browser.