source: abuse/trunk/src/clisp.cpp @ 2

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