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

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