home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / ABUSESRC.ZIP / AbuseSrc / macabuse / src / clisp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-20  |  82.2 KB  |  2,327 lines

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