source: abuse/branches/lol/src/clisp.cpp @ 732

Last change on this file since 732 was 732, checked in by Sam Hocevar, 8 years ago

build: SDL2 compilation fixes.

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