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

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