fix link errors on compilers with strict "extern" enforcement
[rofl0r-openbor.git] / openborscript.c
bloba486f1bfa53a3f9d1faba851afb23fd8222edd40
1 /*
2 * OpenBOR - http://www.LavaLit.com
3 * -----------------------------------------------------------------------
4 * Licensed under the BSD licence, see LICENSE in OpenBOR root for details.
6 * Copyright (c) 2004 - 2011 OpenBOR Team
7 */
9 /* This file include all script methods used by openbor engine
11 Notice: Make sure to null *pretvar when you about to return E_FAIL,
12 Or the engine might crash.
14 Notice: Every new ScriptVariant must be initialized when you first alloc it by
15 ScriptVariant_Init immediately, memset it all to zero should also work by now,
16 unless VT_EMPTY is changed.
18 If you want to reset a ScriptVariant to empty, you must use ScriptVariant_Clear instead.
19 ScriptVariant_Init or memset must be called only ONCE, later you should use ScriptVariant_Clear.
21 Besure to call ScriptVariant_Clear if you want to use free to delete those variants.
23 If you want to copy a ScriptVariant from another, use ScriptVariant_Copy instead of assignment,
24 not because it is faster, but this method is neccessary for string types.
26 If you want to change types of an ScriptVariant, use ScriptVariant_ChangeType, don't change vt directly.
30 #include "data.h"
31 #include "openborscript.h"
32 #include "openbor.h"
33 #include "soundmix.h"
34 #include "globals.h"
35 #include "ImportCache.h"
36 #include "models.h"
37 #include "commands.h"
39 // Define macro for string mapping
40 #define MAPSTRINGS(VAR, LIST, MAXINDEX, FAILMSG) \
41 if(VAR->vt == VT_STR) { \
42 propname = (char*)StrCache_Get(VAR->strVal); \
43 prop = searchList(LIST, propname, MAXINDEX); \
44 if(prop >= 0) { \
45 ScriptVariant_ChangeType(VAR, VT_INTEGER); \
46 VAR->lVal = prop; \
47 } else { printf(FAILMSG, propname); } \
50 extern int MAX_WALL_HEIGHT;
51 extern int current_palette;
52 extern s_player player[4];
53 extern s_savedata savedata;
54 extern s_savelevel savelevel[MAX_DIFFICULTIES];
55 extern s_savescore savescore;
56 extern s_level *level;
57 extern entity *self;
59 extern int noshare;
60 extern int credits;
61 extern char musicname[128];
62 extern float musicfade[2];
63 extern int musicloop;
64 extern u32 musicoffset;
65 extern int models_cached;
67 extern unsigned char *blendings[MAX_BLENDINGS];
68 extern int current_palette;
69 s_variantnode **global_var_list = NULL;
70 Script *pcurrentscript = NULL; //used by local script functions
71 List theFunctionList;
72 static List scriptheap;
73 static s_spawn_entry spawnentry;
74 static s_drawmethod drawmethod;
76 int max_global_var_index = -1;
78 ScriptVariant *indexed_var_list = NULL;
79 int max_global_vars = MAX_GLOBAL_VAR;
80 int max_indexed_vars = 0;
81 int max_entity_vars = 0;
82 int max_script_vars = 0;
85 //this function should be called before all script methods, for once
86 void Script_Global_Init() {
87 ptrdiff_t i;
88 size_t csize, psize;
89 if(max_global_vars > 0) {
90 psize = (sizeof(s_variantnode *) * max_global_vars);
91 csize = psize + (sizeof(s_variantnode) * max_global_vars);
92 global_var_list = malloc(csize);
93 assert(global_var_list != NULL);
94 memset(global_var_list, 0, csize);
95 for(i = 0; i < max_global_vars; i++) {
96 global_var_list[i] =
97 (s_variantnode *) (((char *) global_var_list) + psize + (i * sizeof(s_variantnode)));
101 for(i=0; i<max_global_vars; i++)
103 global_var_list[i] = malloc(sizeof(s_variantnode));
104 assert(global_var_list[i] != NULL);
105 memset(global_var_list[i], 0, sizeof(s_variantnode));
106 } */
107 max_global_var_index = -1;
108 memset(&spawnentry, 0, sizeof(s_spawn_entry)); //clear up the spawn entry
109 drawmethod = plainmethod;
111 if(max_indexed_vars > 0) {
112 csize = sizeof(ScriptVariant) * (max_indexed_vars + 1);
113 indexed_var_list = (ScriptVariant *) malloc(csize);
114 assert(indexed_var_list != NULL);
115 memset(indexed_var_list, 0, csize);
117 List_Init(&theFunctionList);
118 Script_LoadSystemFunctions();
119 List_Init(&scriptheap);
120 ImportCache_Init();
123 //this function should only be called when the engine is shutting down
124 void Script_Global_Clear() {
125 int i, size;
126 List_Clear(&theFunctionList);
127 // dump all un-freed variants
128 size = List_GetSize(&scriptheap);
129 if(size > 0)
130 printf("\nWarning: %d script variants are not freed, dumping...\n", size);
131 for(i = 0, List_Reset(&scriptheap); i < size; List_GotoNext(&scriptheap), i++) {
132 printf("%s\n", List_GetName(&scriptheap));
133 free(List_Retrieve(&scriptheap));
135 List_Clear(&scriptheap);
136 // clear the global list
137 if(global_var_list) {
138 for(i = 0; i < max_global_vars; i++) {
139 if(global_var_list[i] != NULL) {
140 ScriptVariant_Clear(&(global_var_list[i]->value));
141 //free(global_var_list[i]);
143 //global_var_list[i] = NULL;
145 free(global_var_list);
146 global_var_list = NULL;
148 if(indexed_var_list) {
149 for(i = 0; i < max_indexed_vars; i++)
150 ScriptVariant_Clear(indexed_var_list + i);
151 free(indexed_var_list);
153 indexed_var_list = NULL;
154 max_global_var_index = -1;
155 memset(&spawnentry, 0, sizeof(s_spawn_entry)); //clear up the spawn entry
156 StrCache_Clear();
157 ImportCache_Clear();
161 ScriptVariant *Script_Get_Global_Variant(char *theName) {
162 int i;
164 if(!theName || !theName[0])
165 return NULL;
167 for(i = 0; i <= max_global_var_index; i++) {
168 if(!global_var_list[i]->owner && strcmp(theName, global_var_list[i]->key) == 0)
169 return &(global_var_list[i]->value);
172 return NULL;
175 // local function
176 int _set_var(char *theName, ScriptVariant * var, Script * owner) {
177 int i;
178 s_variantnode *tempnode;
179 if(!theName[0] || !theName || (owner && !owner->initialized))
180 return 0;
181 // search the name
182 for(i = 0; i <= max_global_var_index; i++) {
183 if(global_var_list[i]->owner == owner && !strcmp(theName, global_var_list[i]->key)) {
184 if(var->vt != VT_EMPTY)
185 ScriptVariant_Copy(&(global_var_list[i]->value), var);
186 else // set to null, so remove this value
188 /// re-adjust bounds, swap with last node
189 if(i != max_global_var_index) {
190 tempnode = global_var_list[i];
191 global_var_list[i] = global_var_list[max_global_var_index];
192 global_var_list[max_global_var_index] = tempnode;
194 max_global_var_index--;
196 return 1;
199 if(var->vt == VT_EMPTY)
200 return 1;
201 // all slots are taken
202 if(max_global_var_index >= max_global_vars - 1)
203 return 0;
204 // so out of bounds, find another slot
205 else {
206 ++max_global_var_index;
207 ScriptVariant_Copy(&(global_var_list[max_global_var_index]->value), var);
208 global_var_list[max_global_var_index]->owner = owner;
209 strcpy(global_var_list[max_global_var_index]->key, theName);
210 return 1;
212 } // end of _set_var
214 int Script_Set_Global_Variant(char *theName, ScriptVariant * var) {
215 return _set_var(theName, var, NULL);
218 void Script_Local_Clear() {
219 int i;
220 s_variantnode *tempnode;
221 if(!pcurrentscript)
222 return;
223 for(i = 0; i <= max_global_var_index; i++) {
224 if(global_var_list[i]->owner == pcurrentscript) {
225 if(i != max_global_var_index) {
226 tempnode = global_var_list[i];
227 global_var_list[i] = global_var_list[max_global_var_index];
228 global_var_list[max_global_var_index] = tempnode;
230 max_global_var_index--;
233 if(pcurrentscript->vars)
234 for(i = 0; i < max_script_vars; i++)
235 ScriptVariant_Clear(pcurrentscript->vars + i);
239 ScriptVariant *Script_Get_Local_Variant(char *theName) {
240 int i;
242 if(!pcurrentscript || !pcurrentscript->initialized || !theName || !theName[0])
243 return NULL;
245 for(i = 0; i <= max_global_var_index; i++) {
246 if(global_var_list[i]->owner == pcurrentscript && strcmp(theName, global_var_list[i]->key) == 0)
247 return &(global_var_list[i]->value);
250 return NULL;
253 int Script_Set_Local_Variant(char *theName, ScriptVariant * var) {
254 if(!pcurrentscript)
255 return 0;
256 return _set_var(theName, var, pcurrentscript);
259 Script *alloc_script() {
260 int i;
261 Script *pscript = (Script *) malloc(sizeof(Script));
262 memset(pscript, 0, sizeof(Script));
263 if(max_script_vars > 0) {
264 pscript->vars = (ScriptVariant *) malloc(sizeof(ScriptVariant) * max_script_vars);
265 for(i = 0; i < max_script_vars; i++)
266 ScriptVariant_Init(pscript->vars + i);
268 return pscript;
271 void Script_Init(Script * pscript, char *theName, int first) {
272 int i;
273 if(first) {
274 memset(pscript, 0, sizeof(Script));
275 if(max_script_vars > 0) {
276 pscript->vars = (ScriptVariant *) malloc(sizeof(ScriptVariant) * max_script_vars);
277 for(i = 0; i < max_script_vars; i++)
278 ScriptVariant_Init(pscript->vars + i);
281 if(!theName || !theName[0])
282 return; // if no name specified, only alloc the variants
283 pcurrentscript = pscript; //used by local script functions
284 pscript->pinterpreter = (Interpreter *) malloc(sizeof(Interpreter));
285 Interpreter_Init(pscript->pinterpreter, theName, &theFunctionList);
286 pscript->interpreterowner = 1; // this is the owner, important
287 pscript->initialized = 1;
290 //safe copy method
291 void Script_Copy(Script * pdest, Script * psrc, int localclear) {
292 if(!psrc->initialized)
293 return;
294 if(pdest->initialized)
295 Script_Clear(pdest, localclear);
296 pdest->pinterpreter = psrc->pinterpreter;
297 pdest->interpreterowner = 0; // dont own it
298 pdest->initialized = psrc->initialized; //just copy, it should be 1
301 void Script_Clear(Script * pscript, int localclear) {
302 Script *temp;
303 int i;
304 ScriptVariant *pvars;
305 if(localclear == 2 && pscript->vars) {
306 for(i = 0; i < max_script_vars; i++) {
307 ScriptVariant_Clear(pscript->vars + i);
309 free(pscript->vars);
310 pscript->vars = NULL;
312 if(!pscript->initialized)
313 return;
314 temp = pcurrentscript;
315 pcurrentscript = pscript; //used by local script functions
316 //if it is the owner, free the interpreter
317 if(pscript->pinterpreter && pscript->interpreterowner) {
318 Interpreter_Clear(pscript->pinterpreter);
319 free(pscript->pinterpreter);
320 pscript->pinterpreter = NULL;
322 if(localclear)
323 Script_Local_Clear();
324 pvars = pscript->vars; // in game clear(localclear!=2) just keep this value
325 memset(pscript, 0, sizeof(Script));
326 pscript->vars = pvars; // copy it back
327 pcurrentscript = temp;
330 //append part of the script
331 //Because the script might not be initialized in 1 time.
332 int Script_AppendText(Script * pscript, char *text, char *path) {
333 int success;
335 pcurrentscript = pscript; //used by local script functions
336 //printf(text);
337 Interpreter_Reset(pscript->pinterpreter);
339 success = SUCCEEDED(Interpreter_ParseText(pscript->pinterpreter, text, 1, path));
341 return success;
344 //return name of function from pointer to function
345 const char *Script_GetFunctionName(void *functionRef) {
346 if(functionRef == ((void *) system_isempty))
347 return "isempty";
348 else if(functionRef == ((void *) system_NULL))
349 return "NULL";
350 else if(functionRef == ((void *) system_rand))
351 return "rand";
352 else if(functionRef == ((void *) system_maxglobalvarindex))
353 return "maxglobalvarindex";
354 else if(functionRef == ((void *) system_getglobalvar))
355 return "getglobalvar";
356 else if(functionRef == ((void *) system_setglobalvar))
357 return "setglobalvar";
358 else if(functionRef == ((void *) system_getlocalvar))
359 return "getlocalvar";
360 else if(functionRef == ((void *) system_setlocalvar))
361 return "setlocalvar";
362 else if(functionRef == ((void *) system_clearglobalvar))
363 return "clearglobalvar";
364 else if(functionRef == ((void *) system_clearindexedvar))
365 return "clearindexedvar";
366 else if(functionRef == ((void *) system_clearlocalvar))
367 return "clearlocalvar";
368 else if(functionRef == ((void *) system_free))
369 return "free";
370 else if(functionRef == ((void *) openbor_systemvariant))
371 return "openborvariant";
372 else if(functionRef == ((void *) openbor_changesystemvariant))
373 return "changeopenborvariant";
374 else if(functionRef == ((void *) openbor_drawstring))
375 return "drawstring";
376 else if(functionRef == ((void *) openbor_drawstringtoscreen))
377 return "drawstringtoscreen";
378 else if(functionRef == ((void *) openbor_log))
379 return "log";
380 else if(functionRef == ((void *) openbor_drawbox))
381 return "drawbox";
382 else if(functionRef == ((void *) openbor_drawboxtoscreen))
383 return "drawboxtoscreen";
384 else if(functionRef == ((void *) openbor_drawline))
385 return "drawline";
386 else if(functionRef == ((void *) openbor_drawlinetoscreen))
387 return "drawlinetoscreen";
388 else if(functionRef == ((void *) openbor_drawsprite))
389 return "drawsprite";
390 else if(functionRef == ((void *) openbor_drawspritetoscreen))
391 return "drawspritetoscreen";
392 else if(functionRef == ((void *) openbor_drawdot))
393 return "drawdot";
394 else if(functionRef == ((void *) openbor_drawdottoscreen))
395 return "drawdottoscreen";
396 else if(functionRef == ((void *) openbor_drawscreen))
397 return "drawscreen";
398 else if(functionRef == ((void *) openbor_changeplayerproperty))
399 return "changeplayerproperty";
400 else if(functionRef == ((void *) openbor_changeentityproperty))
401 return "changeentityproperty";
402 else if(functionRef == ((void *) openbor_getplayerproperty))
403 return "getplayerproperty";
404 else if(functionRef == ((void *) openbor_getentityproperty))
405 return "getentityproperty";
406 else if(functionRef == ((void *) openbor_tossentity))
407 return "tossentity";
408 else if(functionRef == ((void *) openbor_clearspawnentry))
409 return "clearspawnentry";
410 else if(functionRef == ((void *) openbor_setspawnentry))
411 return "setspawnentry";
412 else if(functionRef == ((void *) openbor_spawn))
413 return "spawn";
414 else if(functionRef == ((void *) openbor_projectile))
415 return "projectile";
416 else if(functionRef == ((void *) openbor_transconst))
417 return "openborconstant";
418 else if(functionRef == ((void *) openbor_playmusic))
419 return "playmusic";
420 else if(functionRef == ((void *) openbor_fademusic))
421 return "fademusic";
422 else if(functionRef == ((void *) openbor_setmusicvolume))
423 return "setmusicvolume";
424 else if(functionRef == ((void *) openbor_setmusictempo))
425 return "setmusictempo";
426 else if(functionRef == ((void *) openbor_pausemusic))
427 return "pausemusic";
428 else if(functionRef == ((void *) openbor_playsample))
429 return "playsample";
430 else if(functionRef == ((void *) openbor_loadsample))
431 return "loadsample";
432 else if(functionRef == ((void *) openbor_unloadsample))
433 return "unloadsample";
434 else if(functionRef == ((void *) openbor_fadeout))
435 return "fadeout";
436 else if(functionRef == ((void *) openbor_playerkeys))
437 return "playerkeys";
438 else if(functionRef == ((void *) openbor_changepalette))
439 return "changepalette";
440 else if(functionRef == ((void *) openbor_damageentity))
441 return "damageentity";
442 else if(functionRef == ((void *) openbor_killentity))
443 return "killentity";
444 else if(functionRef == ((void *) openbor_findtarget))
445 return "findtarget";
446 else if(functionRef == ((void *) openbor_checkrange))
447 return "checkrange";
448 else if(functionRef == ((void *) openbor_gettextobjproperty))
449 return "gettextobjproperty";
450 else if(functionRef == ((void *) openbor_changetextobjproperty))
451 return "changetextobjproperty";
452 else if(functionRef == ((void *) openbor_settextobj))
453 return "settextobj";
454 else if(functionRef == ((void *) openbor_cleartextobj))
455 return "cleartextobj";
456 else if(functionRef == ((void *) openbor_getbglayerproperty))
457 return "getbglayerproperty";
458 else if(functionRef == ((void *) openbor_changebglayerproperty))
459 return "changebglayerproperty";
460 else if(functionRef == ((void *) openbor_getfglayerproperty))
461 return "getfglayerproperty";
462 else if(functionRef == ((void *) openbor_changefglayerproperty))
463 return "changefglayerproperty";
464 else if(functionRef == ((void *) openbor_getlevelproperty))
465 return "getlevelproperty";
466 else if(functionRef == ((void *) openbor_changelevelproperty))
467 return "changelevelproperty";
468 else if(functionRef == ((void *) openbor_checkhole))
469 return "checkhole";
470 else if(functionRef == ((void *) openbor_checkwall))
471 return "checkwall";
472 else if(functionRef == ((void *) openbor_checkplatformbelow))
473 return "checkplatformbelow";
474 else if(functionRef == ((void *) openbor_openfilestream))
475 return "openfilestream";
476 else if(functionRef == ((void *) openbor_getfilestreamline))
477 return "getfilestreamline";
478 else if(functionRef == ((void *) openbor_getfilestreamargument))
479 return "getfilestreamargument";
480 else if(functionRef == ((void *) openbor_filestreamnextline))
481 return "filestreamnextline";
482 else if(functionRef == ((void *) openbor_getfilestreamposition))
483 return "getfilestreamposition";
484 else if(functionRef == ((void *) openbor_setfilestreamposition))
485 return "setfilestreamposition";
486 else if(functionRef == ((void *) openbor_filestreamappend))
487 return "filestreamappend";
488 else if(functionRef == ((void *) openbor_createfilestream))
489 return "createfilestream";
490 else if(functionRef == ((void *) openbor_savefilestream))
491 return "savefilestream";
492 else if(functionRef == ((void *) openbor_getindexedvar))
493 return "getindexedvar";
494 else if(functionRef == ((void *) openbor_setindexedvar))
495 return "setindexedvar";
496 else if(functionRef == ((void *) openbor_getscriptvar))
497 return "getscriptvar";
498 else if(functionRef == ((void *) openbor_setscriptvar))
499 return "setscriptvar";
500 else if(functionRef == ((void *) openbor_getentityvar))
501 return "getentityvar";
502 else if(functionRef == ((void *) openbor_setentityvar))
503 return "setentityvar";
504 else if(functionRef == ((void *) openbor_jumptobranch))
505 return "jumptobranch";
506 else if(functionRef == ((void *) openbor_changelight))
507 return "changelight";
508 else if(functionRef == ((void *) openbor_changeshadowcolor))
509 return "changeshadowcolor";
510 else if(functionRef == ((void *) openbor_bindentity))
511 return "bindentity";
512 else if(functionRef == ((void *) openbor_allocscreen))
513 return "allocscreen";
514 else if(functionRef == ((void *) openbor_clearscreen))
515 return "clearscreen";
516 else if(functionRef == ((void *) openbor_setdrawmethod))
517 return "setdrawmethod";
518 else if(functionRef == ((void *) openbor_updateframe))
519 return "updateframe";
520 else if(functionRef == ((void *) openbor_performattack))
521 return "performattack";
522 else if(functionRef == ((void *) openbor_setidle))
523 return "setidle";
524 else if(functionRef == ((void *) openbor_getentity))
525 return "getentity";
526 else if(functionRef == ((void *) openbor_loadmodel))
527 return "loadmodel";
528 else if(functionRef == ((void *) openbor_loadsprite))
529 return "loadsprite";
530 else if(functionRef == ((void *) openbor_playgif))
531 return "playgif";
532 else if(functionRef == ((void *) openbor_strinfirst))
533 return "strinfirst";
534 else if(functionRef == ((void *) openbor_strinlast))
535 return "strinlast";
536 else if(functionRef == ((void *) openbor_strleft))
537 return "strleft";
538 else if(functionRef == ((void *) openbor_strlength))
539 return "strlength";
540 else if(functionRef == ((void *) openbor_strright))
541 return "strright";
542 else if(functionRef == ((void *) openbor_getmodelproperty))
543 return "getmodelproperty";
544 else if(functionRef == ((void *) openbor_changemodelproperty))
545 return "changemodelproperty";
546 else if(functionRef == ((void *) openbor_rgbcolor))
547 return "rgbcolor";
548 else
549 return "<unknown function>";
552 //return string mapping function corresponding to a given function
553 void *Script_GetStringMapFunction(void *functionRef) {
554 if(functionRef == ((void *) openbor_systemvariant))
555 return (void *) mapstrings_systemvariant;
556 else if(functionRef == ((void *) openbor_changesystemvariant))
557 return (void *) mapstrings_changesystemvariant;
558 else if(functionRef == ((void *) openbor_getentityproperty))
559 return (void *) mapstrings_getentityproperty;
560 else if(functionRef == ((void *) openbor_changeentityproperty))
561 return (void *) mapstrings_changeentityproperty;
562 else if(functionRef == ((void *) openbor_getplayerproperty))
563 return (void *) mapstrings_getplayerproperty;
564 else if(functionRef == ((void *) openbor_changeplayerproperty))
565 return (void *) mapstrings_changeplayerproperty;
566 else if(functionRef == ((void *) openbor_setspawnentry))
567 return (void *) mapstrings_setspawnentry;
568 else if(functionRef == ((void *) openbor_transconst))
569 return (void *) mapstrings_transconst;
570 else if(functionRef == ((void *) openbor_playerkeys))
571 return (void *) mapstrings_playerkeys;
572 else if(functionRef == ((void *) openbor_gettextobjproperty))
573 return (void *) mapstrings_gettextobjproperty;
574 else if(functionRef == ((void *) openbor_changetextobjproperty))
575 return (void *) mapstrings_changetextobjproperty;
576 else if(functionRef == ((void *) openbor_getbglayerproperty))
577 return (void *) mapstrings_getbglayerproperty;
578 else if(functionRef == ((void *) openbor_changebglayerproperty))
579 return (void *) mapstrings_changebglayerproperty;
580 else if(functionRef == ((void *) openbor_getfglayerproperty))
581 return (void *) mapstrings_getfglayerproperty;
582 else if(functionRef == ((void *) openbor_changefglayerproperty))
583 return (void *) mapstrings_changefglayerproperty;
584 else
585 return NULL;
588 /* Replace string constants with enum constants at compile time to speed up
589 script execution. */
590 int Script_MapStringConstants(Script * pscript) {
591 Interpreter *pinterpreter = pscript->pinterpreter;
592 Instruction *pInstruction, *pInstruction2;
593 ScriptVariant **params;
594 //ScriptVariant* var;
595 void (*pMapstrings) (ScriptVariant **, int);
596 int i, j, k, size, paramCount;
598 size = pinterpreter->theSolidListOfInstructionList->size;
599 for(i = 0; i < size; i++) {
600 pInstruction = (Instruction *) (pinterpreter->theSolidListOfInstructionList->solidlist[i]);
601 if(pInstruction->functionRef) {
602 params =
603 pInstruction->theSolidListOfRefList ? (ScriptVariant **) pInstruction->
604 theSolidListOfRefList->solidlist : NULL;
605 paramCount = (int) pInstruction->theRef->lVal;
607 // Get the pointer to the correct mapstrings function, if one exists.
608 pMapstrings = Script_GetStringMapFunction(pInstruction->functionRef);
609 if(pMapstrings) {
610 // Call the mapstrings function.
611 pMapstrings(params, paramCount);
613 // Find the instruction containing each constant and update its value.
614 for(j = 0; j < paramCount; j++) {
615 for(k = i; k > 0; k--) {
616 pInstruction2 =
617 (Instruction *) (pinterpreter->theSolidListOfInstructionList->
618 solidlist[k]);
619 if(pInstruction2->theVal2 == params[j]) {
620 ScriptVariant_Copy(pInstruction2->theVal,
621 pInstruction2->theVal2);
622 break;
625 if(k < 0)
626 return 0;
632 return 1;
635 // replaces the entire instruction list with a new instruction list after optimization
636 int Script_ReplaceInstructionList(Interpreter * pInterpreter, List * newList) {
637 int i, j, newSize = List_GetSize(newList);
638 Instruction *pInstruction, *pTarget;
639 Instruction **oldList = (Instruction **) pInterpreter->theSolidListOfInstructionList->solidlist;
640 SolidList *nl = SolidListFromList(newList);
642 char buf[256];
644 for(i = 0; i < newSize; i++) {
645 pInstruction = (Instruction *) nl->solidlist[i];
646 if(pInstruction->theJumpTargetIndex >= 0) {
647 pTarget = (Instruction *) oldList[pInstruction->theJumpTargetIndex];
648 for(j = 0; j < newSize; j++) {
649 if(nl->solidlist[j] == pTarget) {
650 pInstruction->theJumpTargetIndex = j;
651 break;
654 // if the jump target isn't found, it must have been removed in an optimization - whoops!
655 if(j == newSize) {
656 Instruction_ToString(pTarget, buf);
657 printf("Error: jump target %i (%s) not found - overzealous optimization!\n",
658 pInstruction->theJumpTargetIndex, buf);
659 return 0;
664 // replace new list with old list
665 List_Clear(&(pInterpreter->theInstructionList));
666 freeSolidList(pInterpreter->theSolidListOfInstructionList);
667 pInterpreter->theSolidListOfInstructionList = nl;
669 return 1;
672 // prints lots of debugging stuff about optimizations that can be made
673 void Script_LowerConstants(Script * pscript) {
674 Interpreter *pinterpreter = pscript->pinterpreter;
675 Instruction *pInstruction, *pInstruction2;
676 List *newInstructionList = malloc(sizeof(List));
677 int i, j, size;
679 List_Init(newInstructionList);
681 size = pinterpreter->theSolidListOfInstructionList->size;
683 for(i = 0; i < size; i++) {
684 pInstruction = (Instruction *) (pinterpreter->theSolidListOfInstructionList->solidlist[i]);
685 if(pInstruction->OpCode == DATA) {
686 int numRefs = 0;
687 for(j = 0; j < size; j++) {
688 pInstruction2 =
689 (Instruction *) (pinterpreter->theSolidListOfInstructionList->solidlist[j]);
690 if(pInstruction2->OpCode == LOAD && pInstruction2->theRef == pInstruction->theVal)
691 numRefs++;
693 //printf("Variable declared, %i references\n", numRefs, pInstruction->theToken->theSource);
694 //printf("DATA (theVal=0x%08X, theRef=0x%08X)\n", pInstruction->theVal, pInstruction->theRef);
695 if(numRefs > 0)
696 List_InsertAfter(newInstructionList, pInstruction, NULL);
697 else {
698 printf("Unused variable\n");
699 free(pInstruction);
701 } else
702 List_InsertAfter(newInstructionList, pInstruction, NULL);
703 #define ISCONST(x) ((x) && ((x->OpCode==CONSTINT)||(x->OpCode==CONSTSTR)||(x->OpCode==CONSTDBL)))
704 // Look for constant binary ops
705 if(pInstruction->OpCode == ADD) {
706 Instruction *pSrc1 = NULL, *pSrc2 = NULL;
707 char buf[1024], buf2[1024], buf3[1024];
708 for(j = 0; j < size; j++) {
709 Instruction *tmp =
710 (Instruction *) (pinterpreter->theSolidListOfInstructionList->solidlist[j]);
711 if(tmp->theVal == pInstruction->theRef || tmp->theVal2 == pInstruction->theRef)
712 pSrc1 = tmp;
713 if(tmp->theVal == pInstruction->theRef2 || tmp->theVal2 == pInstruction->theRef2)
714 pSrc2 = tmp;
717 if(ISCONST(pSrc1) && ISCONST(pSrc2)) {
718 ScriptVariant *sum = ScriptVariant_Add(pSrc1->theVal2, pSrc2->theVal2);
719 ScriptVariant_ToString(pSrc1->theVal2, buf);
720 ScriptVariant_ToString(pSrc2->theVal2, buf2);
721 ScriptVariant_ToString(sum, buf3);
722 //printf("ADD 0x%08X: %s + %s = %s\n", pInstruction, buf, buf2, buf3);
724 #if 0
725 else if(pSrc1 && pSrc2) {
726 Instruction_ToString(pSrc1, buf);
727 Instruction_ToString(pSrc2, buf2);
728 printf("ADD 0x%08X: %s + %s\n", pInstruction, buf, buf2);
729 } else
730 printf("ADD 0x%08X: Non-constant addition?\n");
731 #endif
733 #undef ISCONST
736 // replace old instruction list with optimized one (TODO: enable when this function actually does optimizations)
737 //Script_ReplaceInstructionList(pinterpreter, &newInstructionList);
740 // detect unused functions in scripts (to save memory)
741 int Script_DetectUnusedFunctions(Script * pScript) {
742 Interpreter *pInterpreter = pScript->pinterpreter;
743 Instruction *pInstruction, *pInstruction2, **instructionList =
744 (Instruction **) pInterpreter->theSolidListOfInstructionList->solidlist;
745 List newInstructionList;
746 int i, size = List_GetSize(&(pInterpreter->theInstructionList));
747 int res;
749 List_Init(&newInstructionList);
751 for(i = 0; i < size; i++) {
752 pInstruction = instructionList[i];
753 // detect function declarations (FIXME: should have an opcode for function declarations other than NOOP)
754 if(pInstruction->OpCode == NOOP && pInstruction->theToken
755 && strlen(pInstruction->theToken->theSource) > 0) {
756 int j, numCalls = 0;
758 // find all calls to this function
759 for(j = 0; j < size; j++) {
760 pInstruction2 = instructionList[j];
761 if(pInstruction2->OpCode == CALL && pInstruction2->theJumpTargetIndex == i)
762 numCalls++;
765 if(numCalls == 0 && strcmp(pInstruction->theToken->theSource, "main") != 0) {
766 printf("Unused function %s()\n", pInstruction->theToken->theSource);
767 while(instructionList[i]->OpCode != RET) // skip function without adding to new instruction list
769 free(instructionList[i++]);
770 if(i >= size) {
771 List_Clear(&newInstructionList);
772 return 0;
773 } // this shouldn't happen!
775 free(instructionList[i]); // free the final RET instruction too
776 } else
777 List_InsertAfter(&newInstructionList, pInstruction, NULL);
778 } else
779 List_InsertAfter(&newInstructionList, pInstruction, NULL);
781 List_InsertAfter(&newInstructionList, pInstruction, NULL);
783 //if(pInstruction->theToken) {free(pInstruction->theToken); pInstruction->theToken=NULL;} // TODO: move somewhere else
786 res = Script_ReplaceInstructionList(pInterpreter, &newInstructionList);
787 List_Clear(&newInstructionList);
788 return res;
791 //should be called only once after parsing text
792 int Script_Compile(Script * pscript) {
793 int result;
794 if(!pscript || !pscript->pinterpreter)
795 return 1;
796 //Interpreter_OutputPCode(pscript->pinterpreter, "code");
797 result = SUCCEEDED(Interpreter_CompileInstructions(pscript->pinterpreter));
798 if(!result) {
799 Script_Clear(pscript, 1);
800 shutdown(1, "Can't compile script!\n");
802 result = Script_MapStringConstants(pscript);
803 if(!result) {
804 Script_Clear(pscript, 1);
805 shutdown(1, "Can't compile script!\n");
807 //result = Script_DetectUnusedFunctions(pscript);
808 //if(!result) {Script_Clear(pscript, 1);shutdown(1, "Script optimization failed!\n");}
809 //Script_LowerConstants(pscript);
811 return result;
814 int Script_IsInitialized(Script * pscript) {
815 if(pscript && pscript->initialized)
816 pcurrentscript = pscript; //used by local script functions
817 return pscript->initialized;
820 //execute the script
821 int Script_Execute(Script * pscript) {
822 int result = S_OK;
823 Script *temp = pcurrentscript;
824 pcurrentscript = pscript; //used by local script functions
825 Interpreter_Reset(pscript->pinterpreter);
826 result = (int) SUCCEEDED(Interpreter_EvaluateImmediate(pscript->pinterpreter));
827 pcurrentscript = temp;
828 if(!result)
829 shutdown(1, "There's an exception while executing script '%s'.\n",
830 pscript->pinterpreter->theSymbolTable.name);
831 return result;
834 #ifndef COMPILED_SCRIPT
835 //this method is for debug purpose
836 int Script_Call(Script * pscript, char *method, ScriptVariant * pretvar) {
837 pcurrentscript = pscript; //used by local script functions
838 Interpreter_Reset(pscript->pinterpreter);
839 return (int) SUCCEEDED(Interpreter_Call(pscript->pinterpreter, method, pretvar));
841 #endif
843 //used by Script_Global_Init
844 void Script_LoadSystemFunctions() {
845 //printf("Loading system script functions....");
846 //load system functions if we need
847 List_Reset(&theFunctionList);
849 List_InsertAfter(&theFunctionList, (void *) system_isempty, "isempty");
850 List_InsertAfter(&theFunctionList, (void *) system_NULL, "NULL");
851 List_InsertAfter(&theFunctionList, (void *) system_rand, "rand");
852 List_InsertAfter(&theFunctionList, (void *) system_maxglobalvarindex, "maxglobalvarindex");
853 List_InsertAfter(&theFunctionList, (void *) system_getglobalvar, "getglobalvar");
854 List_InsertAfter(&theFunctionList, (void *) system_setglobalvar, "setglobalvar");
855 List_InsertAfter(&theFunctionList, (void *) system_getlocalvar, "getlocalvar");
856 List_InsertAfter(&theFunctionList, (void *) system_setlocalvar, "setlocalvar");
857 List_InsertAfter(&theFunctionList, (void *) system_clearglobalvar, "clearglobalvar");
858 List_InsertAfter(&theFunctionList, (void *) system_clearindexedvar, "clearindexedvar");
859 List_InsertAfter(&theFunctionList, (void *) system_clearlocalvar, "clearlocalvar");
860 List_InsertAfter(&theFunctionList, (void *) system_free, "free");
861 List_InsertAfter(&theFunctionList, (void *) openbor_systemvariant, "openborvariant");
862 List_InsertAfter(&theFunctionList, (void *) openbor_changesystemvariant, "changeopenborvariant");
863 List_InsertAfter(&theFunctionList, (void *) openbor_drawstring, "drawstring");
864 List_InsertAfter(&theFunctionList, (void *) openbor_drawstringtoscreen, "drawstringtoscreen");
865 List_InsertAfter(&theFunctionList, (void *) openbor_log, "log");
866 List_InsertAfter(&theFunctionList, (void *) openbor_drawbox, "drawbox");
867 List_InsertAfter(&theFunctionList, (void *) openbor_drawboxtoscreen, "drawboxtoscreen");
868 List_InsertAfter(&theFunctionList, (void *) openbor_drawline, "drawline");
869 List_InsertAfter(&theFunctionList, (void *) openbor_drawlinetoscreen, "drawlinetoscreen");
870 List_InsertAfter(&theFunctionList, (void *) openbor_drawsprite, "drawsprite");
871 List_InsertAfter(&theFunctionList, (void *) openbor_drawspritetoscreen, "drawspritetoscreen");
872 List_InsertAfter(&theFunctionList, (void *) openbor_drawdot, "drawdot");
873 List_InsertAfter(&theFunctionList, (void *) openbor_drawdottoscreen, "drawdottoscreen");
874 List_InsertAfter(&theFunctionList, (void *) openbor_drawscreen, "drawscreen");
875 List_InsertAfter(&theFunctionList, (void *) openbor_changeplayerproperty, "changeplayerproperty");
876 List_InsertAfter(&theFunctionList, (void *) openbor_changeentityproperty, "changeentityproperty");
877 List_InsertAfter(&theFunctionList, (void *) openbor_getplayerproperty, "getplayerproperty");
878 List_InsertAfter(&theFunctionList, (void *) openbor_getentityproperty, "getentityproperty");
879 List_InsertAfter(&theFunctionList, (void *) openbor_tossentity, "tossentity");
880 List_InsertAfter(&theFunctionList, (void *) openbor_clearspawnentry, "clearspawnentry");
881 List_InsertAfter(&theFunctionList, (void *) openbor_setspawnentry, "setspawnentry");
882 List_InsertAfter(&theFunctionList, (void *) openbor_spawn, "spawn");
883 List_InsertAfter(&theFunctionList, (void *) openbor_projectile, "projectile");
884 List_InsertAfter(&theFunctionList, (void *) openbor_transconst, "openborconstant");
885 List_InsertAfter(&theFunctionList, (void *) openbor_playmusic, "playmusic");
886 List_InsertAfter(&theFunctionList, (void *) openbor_fademusic, "fademusic");
887 List_InsertAfter(&theFunctionList, (void *) openbor_setmusicvolume, "setmusicvolume");
888 List_InsertAfter(&theFunctionList, (void *) openbor_setmusictempo, "setmusictempo");
889 List_InsertAfter(&theFunctionList, (void *) openbor_pausemusic, "pausemusic");
890 List_InsertAfter(&theFunctionList, (void *) openbor_playsample, "playsample");
891 List_InsertAfter(&theFunctionList, (void *) openbor_loadsample, "loadsample");
892 List_InsertAfter(&theFunctionList, (void *) openbor_unloadsample, "unloadsample");
893 List_InsertAfter(&theFunctionList, (void *) openbor_fadeout, "fadeout");
894 List_InsertAfter(&theFunctionList, (void *) openbor_playerkeys, "playerkeys");
895 List_InsertAfter(&theFunctionList, (void *) openbor_changepalette, "changepalette");
896 List_InsertAfter(&theFunctionList, (void *) openbor_damageentity, "damageentity");
897 List_InsertAfter(&theFunctionList, (void *) openbor_killentity, "killentity");
898 List_InsertAfter(&theFunctionList, (void *) openbor_findtarget, "findtarget");
899 List_InsertAfter(&theFunctionList, (void *) openbor_checkrange, "checkrange");
900 List_InsertAfter(&theFunctionList, (void *) openbor_gettextobjproperty, "gettextobjproperty");
901 List_InsertAfter(&theFunctionList, (void *) openbor_changetextobjproperty, "changetextobjproperty");
902 List_InsertAfter(&theFunctionList, (void *) openbor_settextobj, "settextobj");
903 List_InsertAfter(&theFunctionList, (void *) openbor_cleartextobj, "cleartextobj");
904 List_InsertAfter(&theFunctionList, (void *) openbor_getbglayerproperty, "getbglayerproperty");
905 List_InsertAfter(&theFunctionList, (void *) openbor_changebglayerproperty, "changebglayerproperty");
906 List_InsertAfter(&theFunctionList, (void *) openbor_getfglayerproperty, "getfglayerproperty");
907 List_InsertAfter(&theFunctionList, (void *) openbor_changefglayerproperty, "changefglayerproperty");
908 List_InsertAfter(&theFunctionList, (void *) openbor_getlevelproperty, "getlevelproperty");
909 List_InsertAfter(&theFunctionList, (void *) openbor_changelevelproperty, "changelevelproperty");
910 List_InsertAfter(&theFunctionList, (void *) openbor_checkhole, "checkhole");
911 List_InsertAfter(&theFunctionList, (void *) openbor_checkwall, "checkwall");
912 List_InsertAfter(&theFunctionList, (void *) openbor_checkplatformbelow, "checkplatformbelow");
913 List_InsertAfter(&theFunctionList, (void *) openbor_openfilestream, "openfilestream");
914 List_InsertAfter(&theFunctionList, (void *) openbor_getfilestreamline, "getfilestreamline");
915 List_InsertAfter(&theFunctionList, (void *) openbor_getfilestreamargument, "getfilestreamargument");
916 List_InsertAfter(&theFunctionList, (void *) openbor_filestreamnextline, "filestreamnextline");
917 List_InsertAfter(&theFunctionList, (void *) openbor_getfilestreamposition, "getfilestreamposition");
918 List_InsertAfter(&theFunctionList, (void *) openbor_setfilestreamposition, "setfilestreamposition");
919 List_InsertAfter(&theFunctionList, (void *) openbor_filestreamappend, "filestreamappend");
920 List_InsertAfter(&theFunctionList, (void *) openbor_createfilestream, "createfilestream");
921 List_InsertAfter(&theFunctionList, (void *) openbor_savefilestream, "savefilestream");
922 List_InsertAfter(&theFunctionList, (void *) openbor_getindexedvar, "getindexedvar");
923 List_InsertAfter(&theFunctionList, (void *) openbor_setindexedvar, "setindexedvar");
924 List_InsertAfter(&theFunctionList, (void *) openbor_getscriptvar, "getscriptvar");
925 List_InsertAfter(&theFunctionList, (void *) openbor_setscriptvar, "setscriptvar");
926 List_InsertAfter(&theFunctionList, (void *) openbor_getentityvar, "getentityvar");
927 List_InsertAfter(&theFunctionList, (void *) openbor_setentityvar, "setentityvar");
928 List_InsertAfter(&theFunctionList, (void *) openbor_jumptobranch, "jumptobranch");
929 List_InsertAfter(&theFunctionList, (void *) openbor_changelight, "changelight");
930 List_InsertAfter(&theFunctionList, (void *) openbor_changeshadowcolor, "changeshadowcolor");
931 List_InsertAfter(&theFunctionList, (void *) openbor_bindentity, "bindentity");
932 List_InsertAfter(&theFunctionList, (void *) openbor_allocscreen, "allocscreen");
933 List_InsertAfter(&theFunctionList, (void *) openbor_clearscreen, "clearscreen");
934 List_InsertAfter(&theFunctionList, (void *) openbor_setdrawmethod, "setdrawmethod");
935 List_InsertAfter(&theFunctionList, (void *) openbor_updateframe, "updateframe");
936 List_InsertAfter(&theFunctionList, (void *) openbor_performattack, "performattack");
937 List_InsertAfter(&theFunctionList, (void *) openbor_setidle, "setidle");
938 List_InsertAfter(&theFunctionList, (void *) openbor_getentity, "getentity");
939 List_InsertAfter(&theFunctionList, (void *) openbor_loadmodel, "loadmodel");
940 List_InsertAfter(&theFunctionList, (void *) openbor_loadsprite, "loadsprite");
941 List_InsertAfter(&theFunctionList, (void *) openbor_playgif, "playgif");
942 List_InsertAfter(&theFunctionList, (void *) openbor_strinfirst, "strinfirst");
943 List_InsertAfter(&theFunctionList, (void *) openbor_strinlast, "strinlast");
944 List_InsertAfter(&theFunctionList, (void *) openbor_strleft, "strleft");
945 List_InsertAfter(&theFunctionList, (void *) openbor_strlength, "strlength");
946 List_InsertAfter(&theFunctionList, (void *) openbor_strright, "strright");
947 List_InsertAfter(&theFunctionList, (void *) openbor_getmodelproperty, "getmodelproperty");
948 List_InsertAfter(&theFunctionList, (void *) openbor_changemodelproperty, "changemodelproperty");
949 List_InsertAfter(&theFunctionList, (void *) openbor_rgbcolor, "rgbcolor");
950 //printf("Done!\n");
954 //////////////////////////////////////////////////////////
955 //////////// system functions
956 //////////////////////////////////////////////////////////
957 //isempty(var);
958 s32 system_isempty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
959 *pretvar = NULL;
960 if(paramCount != 1)
961 return E_FAIL;
963 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
964 (*pretvar)->lVal = (s32) ((varlist[0])->vt == VT_EMPTY);
966 return S_OK;
969 //NULL();
970 s32 system_NULL(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
971 ScriptVariant_Clear(*pretvar);
973 return S_OK;
975 s32 system_rand(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
976 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
977 (*pretvar)->lVal = (s32) rand32();
978 return S_OK;
981 //getglobalvar(varname);
982 s32 system_getglobalvar(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
983 ScriptVariant *ptmpvar;
984 if(paramCount != 1) {
985 *pretvar = NULL;
986 return E_FAIL;
988 if(varlist[0]->vt != VT_STR) {
989 printf("Function getglobalvar must have a string parameter.\n");
990 *pretvar = NULL;
991 return E_FAIL;
993 ptmpvar = Script_Get_Global_Variant(StrCache_Get(varlist[0]->strVal));
994 if(ptmpvar)
995 ScriptVariant_Copy(*pretvar, ptmpvar);
996 else
997 ScriptVariant_ChangeType(*pretvar, VT_EMPTY);
998 return S_OK;
1001 //maxglobalvarindex();
1002 s32 system_maxglobalvarindex(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1003 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
1004 (*pretvar)->lVal = (s32) max_global_var_index;
1005 return S_OK;
1008 //setglobalvar(varname, value);
1009 s32 system_setglobalvar(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1010 if(paramCount != 2) {
1011 *pretvar = NULL;
1012 return E_FAIL;
1014 if(varlist[0]->vt != VT_STR) {
1015 printf("Function setglobalvar's first parameter must be a string value.\n");
1016 *pretvar = NULL;
1017 return E_FAIL;
1019 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
1021 (*pretvar)->lVal = (s32) Script_Set_Global_Variant(StrCache_Get(varlist[0]->strVal), (varlist[1]));
1023 return S_OK;
1026 //getlocalvar(varname);
1027 s32 system_getlocalvar(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1028 ScriptVariant *ptmpvar;
1030 if(paramCount != 1) {
1031 *pretvar = NULL;
1032 return E_FAIL;
1034 if(varlist[0]->vt != VT_STR) {
1035 printf("Function getlocalvar must have a string parameter.\n");
1036 *pretvar = NULL;
1037 return E_FAIL;
1039 ptmpvar = Script_Get_Local_Variant(StrCache_Get(varlist[0]->strVal));
1040 if(ptmpvar)
1041 ScriptVariant_Copy(*pretvar, ptmpvar);
1042 else
1043 ScriptVariant_ChangeType(*pretvar, VT_EMPTY);
1044 return S_OK;
1047 //setlocalvar(varname, value);
1048 s32 system_setlocalvar(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1049 if(paramCount < 2) {
1050 *pretvar = NULL;
1051 return E_FAIL;
1053 if(varlist[0]->vt != VT_STR) {
1054 printf("Function setlocalvar's first parameter must be a string value.\n");
1055 *pretvar = NULL;
1056 return E_FAIL;
1058 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
1060 (*pretvar)->lVal = (s32) Script_Set_Local_Variant(StrCache_Get(varlist[0]->strVal), varlist[1]);
1062 return S_OK;;
1065 //clearlocalvar();
1066 s32 system_clearlocalvar(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1067 *pretvar = NULL;
1068 Script_Local_Clear();
1069 return S_OK;
1072 //clearglobalvar();
1073 s32 system_clearglobalvar(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1074 *pretvar = NULL;
1075 max_global_var_index = -1;
1076 return S_OK;
1079 //clearindexedvar();
1080 s32 system_clearindexedvar(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1081 int i;
1082 *pretvar = NULL;
1083 for(i = 0; i < max_indexed_vars; i++)
1084 ScriptVariant_Clear(indexed_var_list + i);
1085 return S_OK;
1088 //free();
1089 s32 system_free(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1090 *pretvar = NULL;
1091 if(paramCount < 1)
1092 return E_FAIL;
1093 if(List_Includes(&scriptheap, varlist[0]->ptrVal)) {
1094 free(List_Retrieve(&scriptheap));
1095 List_Remove(&scriptheap);
1096 return S_OK;
1098 return E_FAIL;
1101 //////////////////////////////////////////////////////////
1102 //////////// openbor functions
1103 //////////////////////////////////////////////////////////
1105 // ===== openborvariant =====
1106 void mapstrings_systemvariant(ScriptVariant ** varlist, int paramCount) {
1107 char *propname;
1108 int prop;
1110 // This enum is replicated in getsyspropertybyindex in openbor.c. If you
1111 // change one, you must change the other as well!!!!
1112 enum systemvariant_enum {
1113 _sv_branchname,
1114 _sv_count_enemies,
1115 _sv_count_entities,
1116 _sv_count_npcs,
1117 _sv_count_players,
1118 _sv_current_level,
1119 _sv_current_palette,
1120 _sv_current_set,
1121 _sv_current_stage,
1122 _sv_elapsed_time,
1124 _sv_ent_max,
1125 _sv_game_paused,
1126 _sv_game_speed,
1127 _sv_gfx_y_offset,
1128 _sv_hResolution,
1129 _sv_in_level,
1130 _sv_in_selectscreen,
1131 _sv_lasthita,
1132 _sv_lasthitc,
1133 _sv_lasthitt,
1134 _sv_lasthitx,
1135 _sv_lasthitz,
1136 _sv_levelheight,
1137 _sv_levelwidth,
1138 _sv_lightx,
1139 _sv_lightz,
1140 _sv_maxentityvars,
1141 _sv_maxglobalvars,
1142 _sv_maxindexedvars,
1143 _sv_maxplayers,
1144 _sv_maxscriptvars,
1145 _sv_models_cached,
1146 _sv_models_loaded,
1147 _sv_numpalettes,
1148 _sv_pixelformat,
1149 _sv_player,
1150 _sv_player1,
1151 _sv_player2,
1152 _sv_player3,
1153 _sv_player4,
1154 _sv_player_max_z,
1155 _sv_player_min_z,
1156 _sv_shadowalpha,
1157 _sv_shadowcolor,
1158 _sv_slowmotion,
1159 _sv_slowmotion_duration,
1160 _sv_totalram,
1161 _sv_freeram,
1162 _sv_usedram,
1163 _sv_vResolution,
1164 _sv_xpos,
1165 _sv_ypos,
1166 _sv_the_end,
1169 // arranged list, for searching
1170 static const char *proplist[] = {
1171 "branchname",
1172 "count_enemies",
1173 "count_entities",
1174 "count_npcs",
1175 "count_players",
1176 "current_level",
1177 "current_palette",
1178 "current_set",
1179 "current_stage",
1180 "elapsed_time",
1181 "ent_max",
1182 "game_paused",
1183 "game_speed",
1184 "gfx_y_offset",
1185 "hResolution",
1186 "in_level",
1187 "in_selectscreen",
1188 "lasthita",
1189 "lasthitc",
1190 "lasthitt",
1191 "lasthitx",
1192 "lasthitz",
1193 "levelheight",
1194 "levelwidth",
1195 "lightx",
1196 "lightz",
1197 "maxentityvars",
1198 "maxglobalvars",
1199 "maxindexedvars",
1200 "maxplayers",
1201 "maxscriptvars",
1202 "models_cached",
1203 "models_loaded",
1204 "numpalettes",
1205 "pixelformat",
1206 "player",
1207 "player1",
1208 "player2",
1209 "player3",
1210 "player4",
1211 "player_max_z",
1212 "player_min_z",
1213 "shadowalpha",
1214 "shadowcolor",
1215 "slowmotion",
1216 "slowmotion_duration",
1217 "totalram",
1218 "freeram",
1219 "usedram",
1220 "vResolution",
1221 "xpos",
1222 "ypos",
1225 MAPSTRINGS(varlist[0], proplist, _sv_the_end, "openborvariant: System variable name not found: '%s'\n");
1228 //sample function, used for getting a system variant
1229 //openborvariant(varname);
1230 s32 openbor_systemvariant(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1231 //used for getting the index from the enum of properties
1232 int variantindex = -1;
1233 //the paramCount used for checking.
1234 //check it first so the engine wont crash if the list is empty
1235 if(paramCount != 1)
1236 goto systemvariant_error;
1237 //call this function's mapstrings function to map string constants to enum values
1238 mapstrings_systemvariant(varlist, paramCount);
1239 //the variant name should be here
1240 //you can check the argument type if you like
1241 if(varlist[0]->vt == VT_INTEGER)
1242 variantindex = varlist[0]->lVal;
1243 else
1244 goto systemvariant_error;
1245 ///////these should be your get method, ///////
1246 ScriptVariant_Clear(*pretvar);
1247 if(getsyspropertybyindex(*pretvar, variantindex)) {
1248 return S_OK;
1250 //else if
1251 //////////////////////////////////////////////
1252 systemvariant_error:
1253 *pretvar = NULL;
1254 // we have finshed, so return
1255 return E_FAIL;
1259 // ===== changeopenborvariant =====
1260 void mapstrings_changesystemvariant(ScriptVariant ** varlist, int paramCount) {
1261 char *propname;
1262 int prop;
1264 // This enum is replicated in changesyspropertybyindex in openbor.c. If you
1265 // change one, you must change the other as well!!!!
1266 enum changesystemvariant_enum {
1267 _csv_blockade,
1268 _csv_elapsed_time,
1269 _csv_lasthita,
1270 _csv_lasthitc,
1271 _csv_lasthitt,
1272 _csv_lasthitx,
1273 _csv_lasthitz,
1274 _csv_levelpos,
1275 _csv_scrollmaxz,
1276 _csv_scrollminz,
1277 _csv_slowmotion,
1278 _csv_slowmotion_duration,
1279 _csv_smartbomber,
1280 _csv_textbox,
1281 _csv_xpos,
1282 _csv_ypos,
1283 _csv_the_end,
1286 // arranged list, for searching
1287 static const char *proplist[] = {
1288 "blockade",
1289 "elapsed_time",
1290 "lasthita",
1291 "lasthitc",
1292 "lasthitt",
1293 "lasthitx",
1294 "lasthitz",
1295 "levelpos",
1296 "scrollmaxz",
1297 "scrollminz",
1298 "slowmotion",
1299 "slowmotion_duration",
1300 "smartbomber",
1301 "textbox",
1302 "xpos",
1303 "ypos",
1306 MAPSTRINGS(varlist[0], proplist, _csv_the_end, "changeopenborvariant: System variable name not found: '%s'\n");
1309 //used for changing a system variant
1310 //changeopenborvariant(varname, value);
1311 s32 openbor_changesystemvariant(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1312 //used for getting the enum constant corresponding to the desired variable
1313 int variantindex = 0;
1314 //reference to the arguments
1315 ScriptVariant *arg = NULL;
1316 //the paramCount used for checking.
1317 //check it first so the engine wont crash if the list is empty
1318 if(paramCount != 2)
1319 goto changesystemvariant_error;
1320 // map string constants to enum constants for speed
1321 mapstrings_changesystemvariant(varlist, paramCount);
1322 //get the 1st argument
1323 arg = varlist[0];
1324 //the variant name should be here
1325 //you can check the argument type if you like
1326 if(arg->vt == VT_INTEGER)
1327 variantindex = arg->lVal;
1328 else
1329 goto changesystemvariant_error;
1331 if(changesyspropertybyindex(variantindex, varlist[1])) {
1332 return S_OK;
1334 changesystemvariant_error:
1335 *pretvar = NULL;
1336 // we have finshed, so return
1337 return E_FAIL;
1341 // use font_printf to draw string
1342 //drawstring(x, y, font, string, z);
1343 s32 openbor_drawstring(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1344 int i;
1345 char buf[256];
1346 s32 value[4];
1347 *pretvar = NULL;
1349 if(paramCount < 4)
1350 goto drawstring_error;
1352 for(i = 0; i < 3; i++) {
1353 if(FAILED(ScriptVariant_IntegerValue(varlist[i], value + i)))
1354 goto drawstring_error;
1356 if(paramCount > 4) {
1357 if(FAILED(ScriptVariant_IntegerValue(varlist[4], value + 3)))
1358 goto drawstring_error;
1359 } else
1360 value[3] = 0;
1361 ScriptVariant_ToString(varlist[3], buf);
1362 font_printf((int) value[0], (int) value[1], (int) value[2], (int) value[3], "%s", buf);
1363 return S_OK;
1365 drawstring_error:
1366 printf
1367 ("First 3 values must be integer values and 4th value a string: drawstring(int x, int y, int font, value)\n");
1368 return E_FAIL;
1371 //use screen_printf
1372 //drawstringtoscreen(screen, x, y, font, string);
1373 s32 openbor_drawstringtoscreen(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1374 int i;
1375 s_screen *scr;
1376 char buf[256];
1377 s32 value[3];
1378 *pretvar = NULL;
1380 if(paramCount != 5)
1381 goto drawstring_error;
1383 if(varlist[0]->vt != VT_PTR)
1384 goto drawstring_error;
1385 scr = (s_screen *) varlist[0]->ptrVal;
1386 if(!scr)
1387 goto drawstring_error;
1389 for(i = 0; i < 3; i++) {
1390 if(FAILED(ScriptVariant_IntegerValue(varlist[i + 1], value + i)))
1391 goto drawstring_error;
1394 ScriptVariant_ToString(varlist[4], buf);
1395 screen_printf(scr, (int) value[0], (int) value[1], (int) value[2], "%s", buf);
1396 return S_OK;
1398 drawstring_error:
1399 printf
1400 ("Function needs a valid screen handle, 3 integers and a string value: drawstringtoscreen(screen, int font, value)\n");
1401 return E_FAIL;
1404 // debug purpose
1405 //log(string);
1406 s32 openbor_log(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1407 char buf[256];
1408 *pretvar = NULL;
1410 if(paramCount != 1)
1411 goto drawstring_error;
1413 ScriptVariant_ToString(varlist[0], buf);
1414 printf("%s", buf);
1415 return S_OK;
1417 drawstring_error:
1418 printf("Function needs 1 parameter: log(value)\n");
1419 return E_FAIL;
1422 //drawbox(x, y, width, height, z, color, lut);
1423 s32 openbor_drawbox(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1424 int i;
1425 s32 value[6], l;
1426 *pretvar = NULL;
1428 if(paramCount < 6)
1429 goto drawbox_error;
1431 for(i = 0; i < 6; i++) {
1432 if(FAILED(ScriptVariant_IntegerValue(varlist[i], value + i)))
1433 goto drawbox_error;
1436 if(paramCount > 6) {
1437 if(FAILED(ScriptVariant_IntegerValue(varlist[6], &l)))
1438 goto drawbox_error;
1439 } else
1440 l = -1;
1442 if(l >= 0) {
1443 l %= MAX_BLENDINGS + 1;
1445 spriteq_add_box((int) value[0], (int) value[1], (int) value[2], (int) value[3], (int) value[4], (int) value[5],
1448 return S_OK;
1450 drawbox_error:
1451 printf
1452 ("Function requires 6 integer values: drawbox(int x, int y, int width, int height, int z, int color, int lut)\n");
1453 return E_FAIL;
1456 //drawboxtoscreen(screen, x, y, width, height, color, lut);
1457 s32 openbor_drawboxtoscreen(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1458 int i;
1459 s_screen *s;
1460 s32 value[5], l;
1461 *pretvar = NULL;
1463 if(paramCount < 6)
1464 goto drawbox_error;
1466 s = (s_screen *) varlist[0]->ptrVal;
1468 if(!s)
1469 goto drawbox_error;
1471 for(i = 1; i < 6; i++) {
1472 if(FAILED(ScriptVariant_IntegerValue(varlist[i], value + i - 1)))
1473 goto drawbox_error;
1476 if(paramCount > 6) {
1477 if(FAILED(ScriptVariant_IntegerValue(varlist[6], &l)))
1478 goto drawbox_error;
1479 } else
1480 l = -1;
1482 if(l >= 0) {
1483 l %= MAX_BLENDINGS + 1;
1485 switch (s->pixelformat) {
1486 case PIXEL_8:
1487 drawbox((int) value[0], (int) value[1], (int) value[2], (int) value[3], (int) value[4], s, l);
1488 break;
1489 case PIXEL_16:
1490 drawbox16((int) value[0], (int) value[1], (int) value[2], (int) value[3], (int) value[4], s, l);
1491 break;
1492 case PIXEL_32:
1493 drawbox32((int) value[0], (int) value[1], (int) value[2], (int) value[3], (int) value[4], s, l);
1494 break;
1497 return S_OK;
1499 drawbox_error:
1500 printf
1501 ("Function requires a screen handle and 5 integer values, 7th integer value is optional: drawboxtoscreen(screen, int x, int y, int width, int height, int color, int lut)\n");
1502 return E_FAIL;
1505 //drawline(x1, y1, x2, y2, z, color, lut);
1506 s32 openbor_drawline(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1507 int i;
1508 s32 value[6], l;
1509 *pretvar = NULL;
1511 if(paramCount < 6)
1512 goto drawline_error;
1514 for(i = 0; i < 6; i++) {
1515 if(FAILED(ScriptVariant_IntegerValue(varlist[i], value + i)))
1516 goto drawline_error;
1519 if(paramCount > 6) {
1520 if(FAILED(ScriptVariant_IntegerValue(varlist[6], &l)))
1521 goto drawline_error;
1522 } else
1523 l = -1;
1525 if(l >= 0) {
1526 l %= MAX_BLENDINGS + 1;
1528 spriteq_add_line((int) value[0], (int) value[1], (int) value[2], (int) value[3], (int) value[4], (int) value[5],
1531 return S_OK;
1533 drawline_error:
1534 printf
1535 ("Function requires 6 integer values, 7th integer value is optional: drawline(int x1, int y1, int x2, int y2, int z, int color, int lut)\n");
1536 return E_FAIL;
1539 //drawlinetoscreen(screen, x1, y1, x2, y2, color, lut);
1540 s32 openbor_drawlinetoscreen(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1541 int i;
1542 s32 value[5], l;
1543 s_screen *s;
1544 *pretvar = NULL;
1546 if(paramCount < 6)
1547 goto drawline_error;
1549 s = (s_screen *) varlist[0]->ptrVal;
1551 if(!s)
1552 goto drawline_error;
1554 for(i = 1; i < 6; i++) {
1555 if(FAILED(ScriptVariant_IntegerValue(varlist[i], value + i - 1)))
1556 goto drawline_error;
1559 if(paramCount > 6) {
1560 if(FAILED(ScriptVariant_IntegerValue(varlist[6], &l)))
1561 goto drawline_error;
1562 } else
1563 l = -1;
1565 if(l >= 0) {
1566 l %= MAX_BLENDINGS + 1;
1568 switch (s->pixelformat) {
1569 case PIXEL_8:
1570 line((int) value[0], (int) value[1], (int) value[2], (int) value[3], (int) value[4], s, l);
1571 break;
1572 case PIXEL_16:
1573 line16((int) value[0], (int) value[1], (int) value[2], (int) value[3], (int) value[4], s, l);
1574 break;
1575 case PIXEL_32:
1576 line32((int) value[0], (int) value[1], (int) value[2], (int) value[3], (int) value[4], s, l);
1577 break;
1580 return S_OK;
1581 drawline_error:
1582 printf
1583 ("Function requires a screen handle and 5 integer values, 7th integer value is optional: drawlinetoscreen(screen, int x1, int y1, int x2, int y2, int color, int lut)\n");
1584 return E_FAIL;
1587 //drawsprite(sprite, x, y, z, sortid);
1588 s32 openbor_drawsprite(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1589 int i;
1590 s32 value[4];
1591 s_sprite *spr;
1592 *pretvar = NULL;
1594 if(paramCount < 4)
1595 goto drawsprite_error;
1596 if(varlist[0]->vt != VT_PTR)
1597 goto drawsprite_error;
1599 spr = varlist[0]->ptrVal;
1600 if(!spr)
1601 goto drawsprite_error;
1603 value[3] = (s32) 0;
1604 for(i = 1; i < paramCount && i < 5; i++) {
1605 if(FAILED(ScriptVariant_IntegerValue(varlist[i], value + i - 1)))
1606 goto drawsprite_error;
1609 spriteq_add_frame((int) value[0], (int) value[1], (int) value[2], spr, &drawmethod, (int) value[3]);
1611 return S_OK;
1613 drawsprite_error:
1614 printf
1615 ("Function requires a valid sprite handle 3 integer values, 5th integer value is optional: drawsprite(sprite, int x, int y, int z, int sortid)\n");
1616 return E_FAIL;
1619 //drawspritetoscreen(sprite, screen, x, y);
1620 s32 openbor_drawspritetoscreen(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1621 int i;
1622 s32 value[2];
1623 s_sprite *spr;
1624 s_screen *scr;
1625 *pretvar = NULL;
1627 if(paramCount < 4)
1628 goto drawsprite_error;
1629 if(varlist[0]->vt != VT_PTR)
1630 goto drawsprite_error;
1631 spr = varlist[0]->ptrVal;
1632 if(!spr)
1633 goto drawsprite_error;
1635 if(varlist[1]->vt != VT_PTR)
1636 goto drawsprite_error;
1637 scr = varlist[1]->ptrVal;
1638 if(!scr)
1639 goto drawsprite_error;
1641 for(i = 2; i < paramCount && i < 4; i++) {
1642 if(FAILED(ScriptVariant_IntegerValue(varlist[i], value + i - 2)))
1643 goto drawsprite_error;
1646 putsprite((int) value[0], (int) value[1], spr, scr, &drawmethod);
1648 return S_OK;
1650 drawsprite_error:
1651 printf
1652 ("Function requires a valid sprite handle, a valid screen handle and 2 integer values: drawspritetoscreen(sprite, screen, int x, int y)\n");
1653 return E_FAIL;
1656 //drawdot(x, y, z, color, lut);
1657 s32 openbor_drawdot(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1658 int i;
1659 s32 value[4], l;
1660 *pretvar = NULL;
1662 if(paramCount < 4)
1663 goto drawdot_error;
1665 for(i = 0; i < 4; i++) {
1666 if(FAILED(ScriptVariant_IntegerValue(varlist[i], value + i)))
1667 goto drawdot_error;
1670 if(paramCount > 4) {
1671 if(FAILED(ScriptVariant_IntegerValue(varlist[4], &l)))
1672 goto drawdot_error;
1673 } else
1674 l = -1;
1676 if(l >= 0) {
1677 l %= MAX_BLENDINGS + 1;
1679 spriteq_add_dot((int) value[0], (int) value[1], (int) value[2], (int) value[3], l);
1681 return S_OK;
1683 drawdot_error:
1684 printf
1685 ("Function requires 4 integer values, 5th integer value is optional: drawdot(int x, int y, int z, int color, int lut)\n");
1686 return E_FAIL;
1689 //drawdottoscreen(screen, x, y, color, lut);
1690 s32 openbor_drawdottoscreen(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1691 int i;
1692 s32 value[3], l;
1693 s_screen *s;
1694 *pretvar = NULL;
1696 if(paramCount < 4)
1697 goto drawdot_error;
1699 s = (s_screen *) varlist[0]->ptrVal;
1701 if(!s)
1702 goto drawdot_error;
1704 for(i = 1; i < 4; i++) {
1705 if(FAILED(ScriptVariant_IntegerValue(varlist[i], value + i - 1)))
1706 goto drawdot_error;
1709 if(paramCount > 4) {
1710 if(FAILED(ScriptVariant_IntegerValue(varlist[4], &l)))
1711 goto drawdot_error;
1712 } else
1713 l = -1;
1715 if(l >= 0) {
1716 l %= MAX_BLENDINGS + 1;
1718 switch (s->pixelformat) {
1719 case PIXEL_8:
1720 putpixel((int) value[0], (int) value[1], (int) value[2], s, l);
1721 break;
1722 case PIXEL_16:
1723 putpixel16((int) value[0], (int) value[1], (int) value[2], s, l);
1724 break;
1725 case PIXEL_32:
1726 putpixel32((int) value[0], (int) value[1], (int) value[2], s, l);
1727 break;
1730 return S_OK;
1732 drawdot_error:
1733 printf
1734 ("Function requires a screen handle and 3 integer values, 5th integer value is optional: dottoscreen(screen, int x, int y, int color, int lut)\n");
1735 return E_FAIL;
1739 //drawscreen(screen, x, y, z, lut);
1740 s32 openbor_drawscreen(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1741 int i;
1742 s32 value[3], l;
1743 s_screen *s;
1744 s_drawmethod screenmethod;
1745 *pretvar = NULL;
1747 if(paramCount < 4)
1748 goto drawscreen_error;
1750 s = (s_screen *) varlist[0]->ptrVal;
1752 if(!s)
1753 goto drawscreen_error;
1755 for(i = 1; i < 4; i++) {
1756 if(FAILED(ScriptVariant_IntegerValue(varlist[i], value + i - 1)))
1757 goto drawscreen_error;
1760 if(paramCount > 4) {
1761 if(FAILED(ScriptVariant_IntegerValue(varlist[4], &l)))
1762 goto drawscreen_error;
1763 } else
1764 l = -1;
1766 if(l >= 0) {
1767 l %= MAX_BLENDINGS + 1;
1769 if(paramCount <= 4)
1770 screenmethod = drawmethod;
1771 else {
1772 screenmethod = plainmethod;
1773 screenmethod.alpha = l;
1774 screenmethod.transbg = 1;
1776 spriteq_add_screen((int) value[0], (int) value[1], (int) value[2], s, &screenmethod, 0);
1778 return S_OK;
1780 drawscreen_error:
1781 printf
1782 ("Function requires a screen handle and 3 integer values, 5th integer value is optional: drawscreen(screen, int x, int y, int z, int lut)\n");
1783 return E_FAIL;
1786 //getindexedvar(int index);
1787 s32 openbor_getindexedvar(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1788 s32 ind;
1790 if(paramCount < 1 || max_indexed_vars <= 0) {
1791 *pretvar = NULL;
1792 return E_FAIL;
1795 ScriptVariant_Clear(*pretvar);
1797 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &ind))) {
1798 printf("Function requires 1 numberic value: getindexedvar(int index)\n");
1799 *pretvar = NULL;
1800 return E_FAIL;
1803 if(ind < 0 || ind >= max_indexed_vars)
1804 return S_OK;
1806 ScriptVariant_Copy(*pretvar, indexed_var_list + ind);
1808 return S_OK;
1811 //setindexedvar(int index, var);
1812 s32 openbor_setindexedvar(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1813 s32 ind;
1815 if(paramCount < 2 || max_indexed_vars <= 0) {
1816 *pretvar = NULL;
1817 return E_FAIL;
1820 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &ind))) {
1821 printf("Function's 1st argument must be a numberic value: setindexedvar(int index, var)\n");
1822 *pretvar = NULL;
1823 return E_FAIL;
1826 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
1828 if(ind < 0 || ind >= max_indexed_vars) {
1829 (*pretvar)->lVal = 0;
1830 return S_OK;
1833 ScriptVariant_Copy(indexed_var_list + ind, varlist[1]);
1834 (*pretvar)->lVal = 1;
1836 return S_OK;
1839 //getscriptvar(int index);
1840 s32 openbor_getscriptvar(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1841 s32 ind;
1843 if(paramCount < 1 || max_script_vars <= 0 || !pcurrentscript || !pcurrentscript->vars) {
1844 *pretvar = NULL;
1845 return E_FAIL;
1848 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &ind))) {
1849 printf("Function requires 1 numberic value: getscriptvar(int index)\n");
1850 *pretvar = NULL;
1851 return E_FAIL;
1854 ScriptVariant_Clear(*pretvar);
1856 if(ind < 0 || ind >= max_script_vars)
1857 return S_OK;
1859 ScriptVariant_Copy(*pretvar, pcurrentscript->vars + ind);
1861 return S_OK;
1864 //setscriptvar(int index, var);
1865 s32 openbor_setscriptvar(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1866 s32 ind;
1868 if(paramCount < 2 || max_script_vars <= 0 || !pcurrentscript || !pcurrentscript->vars) {
1869 *pretvar = NULL;
1870 return E_FAIL;
1873 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &ind))) {
1874 printf("Function's 1st argument must be a numberic value: setscriptvar(int index, var)\n");
1875 *pretvar = NULL;
1876 return E_FAIL;
1879 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
1881 if(ind < 0 || ind >= max_script_vars) {
1882 (*pretvar)->lVal = 0;
1883 return S_OK;
1886 ScriptVariant_Copy(pcurrentscript->vars + ind, varlist[1]);
1887 (*pretvar)->lVal = 1;
1889 return S_OK;
1892 //getentityvar(entity, int index);
1893 s32 openbor_getentityvar(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1894 ScriptVariant *arg = NULL;
1895 s32 ind;
1896 entity *ent;
1898 if(paramCount < 2 || max_entity_vars <= 0) {
1899 *pretvar = NULL;
1900 return E_FAIL;
1904 arg = varlist[0];
1906 ScriptVariant_Clear(*pretvar);
1907 if(arg->vt == VT_EMPTY)
1908 ent = NULL;
1909 else if(arg->vt == VT_PTR)
1910 ent = (entity *) arg->ptrVal;
1911 else {
1912 printf
1913 ("Function's 1st argument must be a valid entity handle value or empty value: getentityvar(entity, int index)\n");
1914 *pretvar = NULL;
1915 return E_FAIL;
1917 if(!ent || !ent->entvars)
1918 return S_OK;
1920 if(FAILED(ScriptVariant_IntegerValue(varlist[1], &ind))) {
1921 printf("Function's 2nd argument must be a numberic value: getentityvar(entity, int index)\n");
1922 *pretvar = NULL;
1923 return E_FAIL;
1926 if(ind < 0 || ind >= max_entity_vars)
1927 return S_OK;
1929 ScriptVariant_Copy(*pretvar, ent->entvars + ind);
1931 return S_OK;
1934 //setentityvar(int index, var);
1935 s32 openbor_setentityvar(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1936 ScriptVariant *arg = NULL;
1937 s32 ind;
1938 entity *ent;
1940 if(paramCount < 3 || max_entity_vars <= 0) {
1941 *pretvar = NULL;
1942 return E_FAIL;
1945 arg = varlist[0];
1947 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
1948 (*pretvar)->lVal = 0;
1950 if(arg->vt == VT_EMPTY)
1951 ent = NULL;
1952 else if(arg->vt == VT_PTR)
1953 ent = (entity *) arg->ptrVal;
1954 else {
1955 printf
1956 ("Function's 1st argument must be a valid entity handle value or empty value: setentityvar(entity, int index, var)\n");
1957 *pretvar = NULL;
1958 return E_FAIL;
1960 if(!ent || !ent->entvars)
1961 return S_OK;
1963 if(FAILED(ScriptVariant_IntegerValue(varlist[1], &ind))) {
1964 printf("Function's 2nd argument must be a numberic value: setentityvar(entity, int index, var)\n");
1965 *pretvar = NULL;
1966 return E_FAIL;
1969 if(ind < 0 || ind >= max_entity_vars)
1970 return S_OK;
1972 ScriptVariant_Copy(ent->entvars + ind, varlist[2]);
1973 (*pretvar)->lVal = 1;
1975 return S_OK;
1978 //strinfirst(char string, char search_string);
1979 s32 openbor_strinfirst(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
1980 char *tempstr = NULL;
1982 if(paramCount < 2) {
1983 *pretvar = NULL;
1984 return E_FAIL;
1987 ScriptVariant_Clear(*pretvar);
1989 if(varlist[0]->vt != VT_STR || varlist[1]->vt != VT_STR) {
1990 printf
1991 ("\n Error, strinfirst({string}, {search string}): Strinfirst must be passed valid {string} and {search string}. \n");
1994 tempstr = strstr((char *) StrCache_Get(varlist[0]->strVal), (char *) StrCache_Get(varlist[1]->strVal));
1996 if(tempstr != NULL) {
1997 ScriptVariant_ChangeType(*pretvar, VT_STR);
1998 strcpy(StrCache_Get((*pretvar)->strVal), tempstr);
1999 } else {
2000 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2001 (*pretvar)->lVal = -1;
2003 return S_OK;
2006 //strinlast(char string, char search_string);
2007 s32 openbor_strinlast(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
2008 char *tempstr = NULL;
2010 if(paramCount < 2) {
2011 *pretvar = NULL;
2012 return E_FAIL;
2015 ScriptVariant_Clear(*pretvar);
2017 if(varlist[0]->vt != VT_STR || varlist[1]->vt != VT_STR) {
2018 printf
2019 ("\n Error, strinlast({string}, {search string}): Strinlast must be passed valid {string} and {search string}. \n");
2022 tempstr = strrchr((char *) StrCache_Get(varlist[0]->strVal), varlist[1]->strVal);
2024 if(tempstr != NULL) {
2025 ScriptVariant_ChangeType(*pretvar, VT_STR);
2026 strcpy(StrCache_Get((*pretvar)->strVal), tempstr);
2027 } else {
2028 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2029 (*pretvar)->lVal = -1;
2031 return S_OK;
2034 //strleft(char string, int i);
2035 s32 openbor_strleft(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
2036 char tempstr[66] = { 0 };
2038 if(paramCount < 2) {
2039 *pretvar = NULL;
2040 return E_FAIL;
2042 if(varlist[0]->vt != VT_STR || varlist[1]->vt != VT_INTEGER) {
2043 printf
2044 ("\n Error, strleft({string}, {characters}): Invalid or missing parameter. Strleft must be passed valid {string} and number of {characters}.\n");
2047 strncpy(tempstr, (char *) StrCache_Get(varlist[0]->strVal), varlist[1]->lVal);
2048 ScriptVariant_Clear(*pretvar);
2050 if(tempstr != NULL) {
2051 ScriptVariant_ChangeType(*pretvar, VT_STR);
2052 strcpy(StrCache_Get((*pretvar)->strVal), tempstr);
2053 } else {
2054 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2055 (*pretvar)->lVal = -1;
2058 return S_OK;
2061 //strlength(char string);
2062 s32 openbor_strlength(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
2063 if(paramCount < 1) {
2064 *pretvar = NULL;
2065 return E_FAIL;
2068 ScriptVariant_Clear(*pretvar);
2070 if(varlist[0]->vt != VT_STR) {
2071 printf
2072 ("Error, strlength({string}): Invalid or missing parameter. Strlength must be passed a valid {string}.\n");
2075 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2076 (*pretvar)->lVal = strlen((char *) StrCache_Get(varlist[0]->strVal));
2077 return S_OK;
2080 //strright(char string, int i);
2081 s32 openbor_strright(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
2082 char *tempstr = NULL;
2084 if(paramCount < 2) {
2085 *pretvar = NULL;
2086 return E_FAIL;
2089 if(varlist[0]->vt != VT_STR || varlist[1]->vt != VT_INTEGER) {
2090 printf
2091 ("\n Error, strright({string}, {characters}): Invalid or missing parameter. Strright must be passed valid {string} and number of {characters}.\n");
2094 ScriptVariant_Clear(*pretvar);
2095 tempstr = (char *) StrCache_Get(varlist[0]->strVal);
2097 if(tempstr != NULL || strlen(tempstr) > 0) {
2098 ScriptVariant_ChangeType(*pretvar, VT_STR);
2099 strcpy(StrCache_Get((*pretvar)->strVal), &tempstr[varlist[1]->lVal]);
2100 } else {
2101 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2102 (*pretvar)->lVal = -1;
2105 return S_OK;
2108 s32 openbor_getmodelproperty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
2109 int iArg;
2111 if(paramCount < 2) {
2112 *pretvar = NULL;
2113 return E_FAIL;
2116 if(varlist[0]->vt != VT_INTEGER || varlist[1]->vt != VT_INTEGER) {
2117 printf
2118 ("\n Error, getmodelproperty({model}, {property}): Invalid or missing parameter. Getmodelproperty must be passed valid {model} and {property} indexes.\n");
2121 iArg = varlist[0]->lVal;
2123 switch (varlist[1]->lVal) {
2124 case 0: //Loaded?
2126 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2127 (*pretvar)->lVal = (s32) model_cache[iArg].loadflag;
2128 break;
2130 case 1:
2132 ScriptVariant_ChangeType(*pretvar, VT_PTR);
2133 (*pretvar)->ptrVal = (void*) model_cache[iArg].model;
2135 case 2:
2137 ScriptVariant_ChangeType(*pretvar, VT_STR);
2138 strcpy(StrCache_Get((*pretvar)->strVal), model_cache[iArg].name);
2139 break;
2141 case 3:
2143 ScriptVariant_ChangeType(*pretvar, VT_STR);
2144 strcpy(StrCache_Get((*pretvar)->strVal), model_cache[iArg].path);
2145 break;
2147 case 4: //Loaded?
2149 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2150 (*pretvar)->lVal = (s32) model_cache[iArg].selectable;
2151 break;
2155 return S_OK;
2158 s32 openbor_changemodelproperty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
2159 int iArg;
2160 s32 ltemp;
2162 if(paramCount < 2) {
2163 *pretvar = NULL;
2164 return E_FAIL;
2167 if(varlist[0]->vt != VT_INTEGER || varlist[1]->vt != VT_INTEGER) {
2168 printf
2169 ("\n Error, changemodelproperty({model}, {property}, {value}): Invalid or missing parameter. Changemodelproperty must be passed valid {model}, {property} and {value}.\n");
2172 iArg = varlist[0]->lVal;
2174 switch (varlist[1]->lVal) {
2175 case 0: //Loaded?
2178 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
2179 model_cache[iArg].loadflag = (int)ltemp;
2180 else (*pretvar)->lVal = (s32)0;
2181 break;
2184 case 1:
2187 if(varlist[2]->vt != VT_STR)
2189 printf("You must give a string value for {value}.\n");
2190 goto changeentityproperty_error;
2192 strcpy(model_cache[iArg].model, (char*)StrCache_Get(varlist[2]->strVal));
2193 (*pretvar)->lVal = (s32)1;
2194 break;
2197 case 2:
2200 if(varlist[2]->vt != VT_STR)
2202 printf("You must give a string value for {value}.\n");
2203 goto changeentityproperty_error;
2205 strcpy(model_cache[iArg].name, (char*)StrCache_Get(varlist[2]->strVal));
2206 (*pretvar)->lVal = (s32)1;
2207 break;
2210 case 3:
2213 if(varlist[2]->vt != VT_STR)
2215 printf("You must give a string value for {value}.\n");
2216 goto changeentityproperty_error;
2218 strcpy(model_cache[iArg].path, (char*)StrCache_Get(varlist[2]->strVal));
2219 (*pretvar)->lVal = (s32)1;
2220 break;
2223 case 4:
2225 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
2226 model_cache[iArg].selectable = (int) ltemp;
2227 else
2228 (*pretvar)->lVal = (s32) 0;
2229 break;
2233 return S_OK;
2236 // ===== getentityproperty =====
2237 enum getentityproperty_enum {
2238 _gep_a,
2239 _gep_aggression,
2240 _gep_aiattack,
2241 _gep_aiflag,
2242 _gep_aimove,
2243 _gep_alpha,
2244 _gep_animal,
2245 _gep_animating,
2246 _gep_animation,
2247 _gep_animationid,
2248 _gep_animheight,
2249 _gep_animhits,
2250 _gep_animnum,
2251 _gep_animpos,
2252 _gep_animvalid,
2253 _gep_antigravity,
2254 _gep_attack,
2255 _gep_attacking,
2256 _gep_attackid,
2257 _gep_autokill,
2258 _gep_base,
2259 _gep_bbox,
2260 _gep_blink,
2261 _gep_blockback,
2262 _gep_blockpain,
2263 _gep_bounce,
2264 _gep_chargerate,
2265 _gep_colourmap,
2266 _gep_colourtable,
2267 _gep_damage_on_landing,
2268 _gep_dead,
2269 _gep_defaultmodel,
2270 _gep_defaultname,
2271 _gep_defense,
2272 _gep_detect,
2273 _gep_direction,
2274 _gep_dot,
2275 _gep_dropframe,
2276 _gep_edelay,
2277 _gep_energycost,
2278 _gep_exists,
2279 _gep_falldie,
2280 _gep_flash,
2281 _gep_freezetime,
2282 _gep_frozen,
2283 _gep_gfxshadow,
2284 _gep_grabbing,
2285 _gep_guardpoints,
2286 _gep_health,
2287 _gep_height,
2288 _gep_hitbyid,
2289 _gep_hmapl,
2290 _gep_hmapu,
2291 _gep_icon,
2292 _gep_invincible,
2293 _gep_invinctime,
2294 _gep_jugglepoints,
2295 _gep_knockdowncount,
2296 _gep_komap,
2297 _gep_landframe,
2298 _gep_lifespancountdown,
2299 _gep_link,
2300 _gep_map,
2301 _gep_mapcount,
2302 _gep_mapdefault,
2303 _gep_maxguardpoints,
2304 _gep_maxhealth,
2305 _gep_maxjugglepoints,
2306 _gep_maxmp,
2307 _gep_model,
2308 _gep_mp,
2309 _gep_mpdroprate,
2310 _gep_mprate,
2311 _gep_mpstable,
2312 _gep_mpstableval,
2313 _gep_name,
2314 _gep_nextanim,
2315 _gep_nextthink,
2316 _gep_no_adjust_base,
2317 _gep_noaicontrol,
2318 _gep_nodieblink,
2319 _gep_nodrop,
2320 _gep_nograb,
2321 _gep_nopain,
2322 _gep_offense,
2323 _gep_opponent,
2324 _gep_owner,
2325 _gep_parent,
2326 _gep_path,
2327 _gep_playerindex,
2328 _gep_projectile,
2329 _gep_range,
2330 _gep_running,
2331 _gep_rush_count,
2332 _gep_rush_tally,
2333 _gep_rush_time,
2334 _gep_scroll,
2335 _gep_seal,
2336 _gep_sealtime,
2337 _gep_setlayer,
2338 _gep_spawntype,
2339 _gep_speed,
2340 _gep_sprite,
2341 _gep_stalltime,
2342 _gep_stats,
2343 _gep_staydown,
2344 _gep_staydownatk,
2345 _gep_stealth,
2346 _gep_subentity,
2347 _gep_subject_to_gravity,
2348 _gep_subject_to_hole,
2349 _gep_subject_to_maxz,
2350 _gep_subject_to_minz,
2351 _gep_subject_to_obstacle,
2352 _gep_subject_to_platform,
2353 _gep_subject_to_screen,
2354 _gep_subject_to_wall,
2355 _gep_subtype,
2356 _gep_throwdamage,
2357 _gep_throwdist,
2358 _gep_throwframewait,
2359 _gep_throwheight,
2360 _gep_tosstime,
2361 _gep_tossv,
2362 _gep_type,
2363 _gep_weapent,
2364 _gep_x,
2365 _gep_xdir,
2366 _gep_z,
2367 _gep_zdir,
2368 _gep_the_end,
2371 enum gep_edelay_enum {
2372 _gep_edelay_cap_max,
2373 _gep_edelay_cap_min,
2374 _gep_edelay_factor,
2375 _gep_edelay_mode,
2376 _gep_edelay_range_max,
2377 _gep_edelay_range_min,
2378 _gep_edelay_the_end,
2382 enum gep_aiflag_enum {
2383 _gep_aiflag_animating,
2384 _gep_aiflag_attacking,
2385 _gep_aiflag_autokill,
2386 _gep_aiflag_blink,
2387 _gep_aiflag_blocking,
2388 _gep_aiflag_charging,
2389 _gep_aiflag_dead,
2390 _gep_aiflag_drop,
2391 _gep_aiflag_falling,
2392 _gep_aiflag_freezetime,
2393 _gep_aiflag_frozen,
2394 _gep_aiflag_getting,
2395 _gep_aiflag_idling,
2396 _gep_aiflag_inpain,
2397 _gep_aiflag_invincible,
2398 _gep_aiflag_jumping,
2399 _gep_aiflag_projectile,
2400 _gep_aiflag_running,
2401 _gep_aiflag_toexplode,
2402 _gep_aiflag_turning,
2403 _gep_aiflag_the_end,
2406 enum _gep_defense_enum {
2407 _gep_defense_blockpower,
2408 _gep_defense_blockratio,
2409 _gep_defense_blockthreshold,
2410 _gep_defense_blocktype,
2411 _gep_defense_factor,
2412 _gep_defense_knockdown,
2413 _gep_defense_pain,
2414 _gep_defense_the_end,
2417 enum gep_running_enum {
2418 _gep_running_jumpx,
2419 _gep_running_jumpy,
2420 _gep_running_land,
2421 _gep_running_movez,
2422 _gep_running_speed,
2423 _gep_running_the_end,
2426 enum gep_dot_enum {
2427 _gep_dot_force,
2428 _gep_dot_mode,
2429 _gep_dot_owner,
2430 _gep_dot_rate,
2431 _gep_dot_time,
2432 _gep_dot_type,
2433 _gep_dot_the_end,
2436 enum gep_attack_enum {
2437 _gep_attack_blast,
2438 _gep_attack_blockflash,
2439 _gep_attack_blocksound,
2440 _gep_attack_coords,
2441 _gep_attack_counterattack,
2442 _gep_attack_direction,
2443 _gep_attack_dol,
2444 _gep_attack_dot,
2445 _gep_attack_dotforce,
2446 _gep_attack_dotindex,
2447 _gep_attack_dotrate,
2448 _gep_attack_dottime,
2449 _gep_attack_drop,
2450 _gep_attack_dropv,
2451 _gep_attack_force,
2452 _gep_attack_forcemap,
2453 _gep_attack_freeze,
2454 _gep_attack_freezetime,
2455 _gep_attack_grab,
2456 _gep_attack_grabdistance,
2457 _gep_attack_guardcost,
2458 _gep_attack_hitflash,
2459 _gep_attack_hitsound,
2460 _gep_attack_jugglecost,
2461 _gep_attack_maptime,
2462 _gep_attack_noblock,
2463 _gep_attack_noflash,
2464 _gep_attack_nopain,
2465 _gep_attack_otg,
2466 _gep_attack_pause,
2467 _gep_attack_seal,
2468 _gep_attack_sealtime,
2469 _gep_attack_staydown,
2470 _gep_attack_steal,
2471 _gep_attack_type,
2472 _gep_attack_the_end,
2475 enum gep_range_enum {
2476 _gep_range_amax,
2477 _gep_range_amin,
2478 _gep_range_bmax,
2479 _gep_range_bmin,
2480 _gep_range_xmax,
2481 _gep_range_xmin,
2482 _gep_range_zmax,
2483 _gep_range_zmin,
2484 _gep_range_the_end,
2487 void mapstrings_getentityproperty(ScriptVariant ** varlist, int paramCount) {
2488 char *propname;
2489 int prop;
2491 // arranged list, for searching
2492 static const char *proplist[] = {
2493 "a",
2494 "aggression",
2495 "aiattack",
2496 "aiflag",
2497 "aimove",
2498 "alpha",
2499 "animal",
2500 "animating",
2501 "animation",
2502 "animationid",
2503 "animheight",
2504 "animhits",
2505 "animnum",
2506 "animpos",
2507 "animvalid",
2508 "antigravity",
2509 "attack",
2510 "attacking",
2511 "attackid",
2512 "autokill",
2513 "base",
2514 "bbox",
2515 "blink",
2516 "blockback",
2517 "blockpain",
2518 "bounce",
2519 "chargerate",
2520 "colourmap",
2521 "colourtable",
2522 "damage_on_landing",
2523 "dead",
2524 "defaultmodel",
2525 "defaultname",
2526 "defense",
2527 "detect",
2528 "direction",
2529 "dot",
2530 "dropframe",
2531 "edelay",
2532 "energycost",
2533 "exists",
2534 "falldie",
2535 "flash",
2536 "freezetime",
2537 "frozen",
2538 "gfxshadow",
2539 "grabbing",
2540 "guardpoints",
2541 "health",
2542 "height",
2543 "hitbyid",
2544 "hmapl",
2545 "hmapu",
2546 "icon",
2547 "invincible",
2548 "invinctime",
2549 "jugglepoints",
2550 "knockdowncount",
2551 "komap",
2552 "landframe",
2553 "lifespancountdown",
2554 "link",
2555 "map",
2556 "mapcount",
2557 "mapdefault",
2558 "maxguardpoints",
2559 "maxhealth",
2560 "maxjugglepoints",
2561 "maxmp",
2562 "model",
2563 "mp",
2564 "mpdroprate",
2565 "mprate",
2566 "mpstable",
2567 "mpstableval",
2568 "name",
2569 "nextanim",
2570 "nextthink",
2571 "no_adjust_base",
2572 "noaicontrol",
2573 "nodieblink",
2574 "nodrop",
2575 "nograb",
2576 "nopain",
2577 "offense",
2578 "opponent",
2579 "owner",
2580 "parent",
2581 "path",
2582 "playerindex",
2583 "projectile",
2584 "range",
2585 "running",
2586 "rush_count",
2587 "rush_tally",
2588 "rush_time",
2589 "scroll",
2590 "seal",
2591 "sealtime",
2592 "setlayer",
2593 "spawntype",
2594 "speed",
2595 "sprite",
2596 "stalltime",
2597 "stats",
2598 "staydown",
2599 "staydownatk",
2600 "stealth",
2601 "subentity",
2602 "subject_to_gravity",
2603 "subject_to_hole",
2604 "subject_to_maxz",
2605 "subject_to_minz",
2606 "subject_to_obstacle",
2607 "subject_to_platform",
2608 "subject_to_screen",
2609 "subject_to_wall",
2610 "subtype",
2611 "throwdamage",
2612 "throwdist",
2613 "throwframewait",
2614 "throwheight",
2615 "tosstime",
2616 "tossv",
2617 "type",
2618 "weapent",
2619 "x",
2620 "xdir",
2621 "z",
2622 "zdir",
2625 static const char *proplist_edelay[] = {
2626 "cap_max",
2627 "cap_min",
2628 "factor",
2629 "mode",
2630 "range_max",
2631 "range_min",
2634 static const char *proplist_aiflag[] = {
2635 "animating",
2636 "attacking",
2637 "autokill",
2638 "blink",
2639 "blocking",
2640 "charging",
2641 "dead",
2642 "drop",
2643 "falling",
2644 "freezetime",
2645 "frozen",
2646 "getting",
2647 "idling",
2648 "inpain",
2649 "invincible",
2650 "jumping",
2651 "projectile",
2652 "running",
2653 "toexplode",
2654 "turning",
2657 static const char *proplist_defense[] = {
2658 "blockpower",
2659 "blockratio",
2660 "blockthreshold",
2661 "blocktype",
2662 "factor",
2663 "knockdown",
2664 "pain",
2667 static const char *proplist_running[] = {
2668 "jumpx",
2669 "jumpy",
2670 "land",
2671 "movez",
2672 "speed",
2675 static const char *proplist_dot[] = {
2676 "force",
2677 "mode",
2678 "owner",
2679 "rate",
2680 "time",
2681 "type",
2684 static const char *proplist_attack[] = {
2685 "blast",
2686 "blockflash",
2687 "blocksound",
2688 "coords",
2689 "counterattack",
2690 "direction",
2691 "dol",
2692 "dot",
2693 "dotforce",
2694 "dotindex",
2695 "dotrate",
2696 "dottime",
2697 "drop",
2698 "dropv",
2699 "force",
2700 "forcemap",
2701 "freeze",
2702 "freezetime",
2703 "grab",
2704 "grabdistance",
2705 "guardcost",
2706 "hitflash",
2707 "hitsound",
2708 "jugglecost",
2709 "maptime",
2710 "noblock",
2711 "noflash",
2712 "nopain",
2713 "otg",
2714 "pause",
2715 "seal",
2716 "sealtime",
2717 "staydown",
2718 "steal",
2719 "type",
2722 static const char *proplist_range[] = {
2723 "amax",
2724 "amin",
2725 "bmax",
2726 "bmin",
2727 "xmax",
2728 "xmin",
2729 "zmax",
2730 "zmin",
2733 if(paramCount < 2)
2734 return;
2736 // map entity properties
2737 MAPSTRINGS(varlist[1], proplist, _gep_the_end,
2738 "Property name '%s' is not supported by function getentityproperty.\n");
2740 if(paramCount < 3)
2741 return;
2743 // map subproperties of edelay property
2744 if((varlist[1]->vt == VT_INTEGER) && (varlist[1]->lVal == _gep_edelay)) {
2745 MAPSTRINGS(varlist[2], proplist_edelay, _gep_edelay_the_end,
2746 "'%s' is not a known subproperty of 'edelay'.\n");
2748 // map subproperties of aiflag property
2749 if((varlist[1]->vt == VT_INTEGER) && (varlist[1]->lVal == _gep_aiflag)) {
2750 MAPSTRINGS(varlist[2], proplist_aiflag, _gep_aiflag_the_end,
2751 "'%s' is not a known subproperty of 'aiflag'.\n");
2753 // map subproperties of defense property
2754 if((varlist[1]->vt == VT_INTEGER) && (varlist[1]->lVal == _gep_defense)) {
2755 if(paramCount >= 4) {
2756 MAPSTRINGS(varlist[3], proplist_defense, _gep_defense_the_end,
2757 "'%s' is not a known subproperty of 'defense'.\n");
2760 // map subproperties of running
2761 if((varlist[1]->vt == VT_INTEGER) && (varlist[1]->lVal == _gep_running)) {
2762 MAPSTRINGS(varlist[2], proplist_running, _gep_running_the_end,
2763 "Property name '%s' is not a known subproperty of 'running'.\n");
2765 // map subproperties of DOT
2766 if((varlist[1]->vt == VT_INTEGER) && (varlist[1]->lVal == _gep_dot)) {
2767 MAPSTRINGS(varlist[2], proplist_dot, _gep_dot_the_end,
2768 "Property name '%s' is not a known subproperty of 'dot'.\n");
2770 // map subproperties of Attack
2771 if((varlist[1]->vt == VT_INTEGER) && (varlist[1]->lVal == _gep_attack)) {
2772 MAPSTRINGS(varlist[2], proplist_attack, _gep_attack_the_end,
2773 "Property name '%s' is not a known subproperty of 'attack'.\n");
2775 // map subproperties of Range
2776 if((varlist[1]->vt == VT_INTEGER) && (varlist[1]->lVal == _gep_range)) {
2777 MAPSTRINGS(varlist[2], proplist_range, _gep_range_the_end,
2778 "Property name '%s' is not a known subproperty of 'range'.\n");
2782 //getentityproperty(pentity, propname);
2783 s32 openbor_getentityproperty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
2784 entity *ent = NULL;
2785 char *tempstr = NULL;
2786 ScriptVariant *arg = NULL;
2787 ScriptVariant *arg1 = NULL;
2788 s_sprite *spr;
2789 s_attack *attack;
2790 s32 ltemp;
2791 int i = 0;
2792 int propind;
2793 int tempint = 0;
2794 short *coords;
2796 if(paramCount < 2) {
2797 *pretvar = NULL;
2798 return E_FAIL;
2801 ScriptVariant_Clear(*pretvar);
2802 mapstrings_getentityproperty(varlist, paramCount);
2804 arg = varlist[0];
2805 if(arg->vt != VT_PTR && arg->vt != VT_EMPTY) {
2806 printf("Function getentityproperty must have a valid entity handle.\n");
2807 *pretvar = NULL;
2808 return E_FAIL;
2810 ent = (entity *) arg->ptrVal; //retrieve the entity
2811 if(!ent)
2812 return S_OK;
2814 arg = varlist[1];
2815 if(arg->vt != VT_INTEGER) {
2816 printf("Function getentityproperty must have a string property name.\n");
2819 propind = arg->lVal;
2821 switch (propind) {
2822 case _gep_model:
2824 ScriptVariant_ChangeType(*pretvar, VT_STR);
2825 strcpy(StrCache_Get((*pretvar)->strVal), ent->model->name);
2826 break;
2828 case _gep_animal:
2830 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2831 (*pretvar)->lVal = (s32) ent->modeldata.animal;
2832 break;
2834 case _gep_spawntype:
2836 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2837 (*pretvar)->lVal = (s32) ent->spawntype;
2838 break;
2840 case _gep_maxhealth:
2842 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2843 (*pretvar)->lVal = (s32) ent->modeldata.health;
2844 break;
2846 case _gep_health:
2848 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2849 (*pretvar)->lVal = (s32) ent->health;
2850 break;
2852 case _gep_animhits:
2854 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2855 (*pretvar)->lVal = (s32) ent->animation->animhits;
2856 break;
2858 case _gep_nextanim:
2860 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2861 (*pretvar)->lVal = (s32) ent->nextanim;
2862 break;
2864 case _gep_nextthink:
2866 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2867 (*pretvar)->lVal = (s32) ent->nextthink;
2868 break;
2870 case _gep_tosstime:
2872 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2873 (*pretvar)->lVal = (s32) ent->toss_time;
2874 break;
2876 case _gep_mp:
2878 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2879 (*pretvar)->lVal = (s32) ent->mp;
2880 break;
2882 case _gep_maxmp:
2884 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2885 (*pretvar)->lVal = (s32) ent->modeldata.mp;
2886 break;
2888 case _gep_mpstableval:
2890 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2891 (*pretvar)->lVal = (s32) ent->modeldata.mpstableval;
2892 break;
2894 case _gep_mpstable:
2896 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2897 (*pretvar)->lVal = (s32) ent->modeldata.mpstable;
2898 break;
2900 case _gep_mprate:
2902 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2903 (*pretvar)->lVal = (s32) ent->modeldata.mprate;
2904 break;
2906 case _gep_mpdroprate:
2908 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2909 (*pretvar)->lVal = (s32) ent->modeldata.mpdroprate;
2910 break;
2912 case _gep_chargerate:
2914 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2915 (*pretvar)->lVal = (s32) ent->modeldata.chargerate;
2916 break;
2918 case _gep_guardpoints:
2920 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2921 (*pretvar)->lVal = (s32) ent->modeldata.guardpoints[0];
2922 break;
2924 case _gep_maxguardpoints:
2926 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2927 (*pretvar)->lVal = (s32) ent->modeldata.guardpoints[1];
2928 break;
2930 case _gep_jugglepoints:
2932 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2933 (*pretvar)->lVal = (s32) ent->modeldata.jugglepoints[0];
2934 break;
2936 case _gep_maxjugglepoints:
2938 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2939 (*pretvar)->lVal = (s32) ent->modeldata.jugglepoints[1];
2940 break;
2942 case _gep_alpha:
2944 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2945 (*pretvar)->lVal = (s32) ent->modeldata.alpha;
2946 break;
2948 case _gep_height:
2950 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2951 (*pretvar)->lVal = (s32) ent->modeldata.height;
2952 break;
2954 case _gep_setlayer:
2956 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2957 (*pretvar)->lVal = (s32) ent->modeldata.setlayer;
2958 break;
2960 case _gep_speed:
2962 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
2963 (*pretvar)->dblVal = (double) ent->modeldata.speed;
2964 break;
2966 case _gep_sprite:
2968 ScriptVariant_ChangeType(*pretvar, VT_PTR);
2969 i = ent->animation->sprite[ent->animpos];
2970 spr = sprite_map[i].sprite;
2971 spr->centerx = sprite_map[i].centerx;
2972 spr->centery = sprite_map[i].centery;
2973 (*pretvar)->ptrVal = (void*) (spr);
2974 break;
2976 case _gep_playerindex:
2978 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2979 (*pretvar)->lVal = (s32) ent->playerindex;
2980 //printf("%d %s %d\n", ent->sortid, ent->name, ent->playerindex);
2981 break;
2983 case _gep_colourmap:
2985 ScriptVariant_ChangeType(*pretvar, VT_PTR);
2986 (*pretvar)->ptrVal = (void*) (ent->colourmap);
2987 break;
2989 case _gep_colourtable:
2991 ScriptVariant_ChangeType(*pretvar, VT_PTR);
2992 (*pretvar)->ptrVal = (void*) (ent->modeldata.colourmap[varlist[2]->lVal]);
2993 break;
2995 case _gep_map:
2997 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
2998 (*pretvar)->lVal = (s32) 0;
2999 for(i = 0; i < ent->modeldata.maps_loaded; i++) {
3000 if(ent->colourmap == ent->modeldata.colourmap[i]) {
3001 (*pretvar)->lVal = (s32) (i + 1);
3002 break;
3005 break;
3007 case _gep_mapcount:
3009 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3010 (*pretvar)->lVal = (s32) (ent->modeldata.maps_loaded + 1);
3011 break;
3013 case _gep_mapdefault:
3015 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3016 (*pretvar)->lVal = (s32) (ent->map);
3017 break;
3019 case _gep_hmapl:
3021 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3022 (*pretvar)->lVal = (s32) ent->modeldata.hmap1;
3023 break;
3025 case _gep_hmapu:
3027 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3028 (*pretvar)->lVal = (s32) ent->modeldata.hmap2;
3029 break;
3031 case _gep_icon:
3033 if(paramCount < 3)
3034 break;
3035 arg = varlist[2];
3036 if(arg->vt != VT_INTEGER) {
3037 printf
3038 ("Error, getentityproperty({ent}, 'icon', {type}): {type} parameter missing or invalid. \n {type}: \n 0 = Icon \n 1 = Icondie \n 2 = Iconget \n 3 = Iconmphigh \n 4 = Iconmphalf \n 5 = Iconmplow \n 6 = Iconpain \n 7 = Iconw \n 8 = Iconx \n 9 = Icony \n");
3039 return E_FAIL;
3042 switch (arg->lVal) {
3043 default:
3044 i = ent->modeldata.icon;
3045 break;
3046 case 1:
3047 i = ent->modeldata.icondie;
3048 break;
3049 case 2:
3050 i = ent->modeldata.iconget;
3051 break;
3052 case 3:
3053 i = ent->modeldata.iconmp[0];
3054 break;
3055 case 4:
3056 i = ent->modeldata.iconmp[1];
3057 break;
3058 case 5:
3059 i = ent->modeldata.iconmp[2];
3060 break;
3061 case 6:
3062 i = ent->modeldata.iconpain;
3063 break;
3064 case 7:
3065 i = ent->modeldata.iconw;
3066 break;
3067 case 8:
3068 i = ent->modeldata.iconx;
3069 break;
3070 case 9:
3071 i = ent->modeldata.icony;
3072 break;
3075 if(i >= 0) {
3076 ScriptVariant_ChangeType(*pretvar, VT_PTR);
3077 spr = sprite_map[i].sprite;
3078 spr->centerx = sprite_map[i].centerx;
3079 spr->centery = sprite_map[i].centery;
3080 (*pretvar)->ptrVal = (void*) (spr);
3081 } else {
3082 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3083 (*pretvar)->lVal = -1;
3085 break;
3087 case _gep_name:
3089 ScriptVariant_ChangeType(*pretvar, VT_STR);
3090 strcpy(StrCache_Get((*pretvar)->strVal), ent->name);
3091 break;
3093 case _gep_defaultname:
3094 case _gep_defaultmodel:
3096 ScriptVariant_ChangeType(*pretvar, VT_STR);
3097 strcpy(StrCache_Get((*pretvar)->strVal), ent->defaultmodel->name);
3098 break;
3100 case _gep_x:
3102 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
3103 (*pretvar)->dblVal = (double) ent->x;
3104 break;
3106 case _gep_z:
3108 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
3109 (*pretvar)->dblVal = (double) ent->z;
3110 break;
3112 case _gep_a:
3114 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
3115 (*pretvar)->dblVal = (double) ent->a;
3116 break;
3118 case _gep_xdir:
3120 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
3121 (*pretvar)->dblVal = (double) ent->xdir;
3122 break;
3124 case _gep_zdir:
3126 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
3127 (*pretvar)->dblVal = (double) ent->zdir;
3128 break;
3130 case _gep_tossv:
3132 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
3133 (*pretvar)->dblVal = (double) ent->tossv;
3134 break;
3136 case _gep_base:
3138 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
3139 (*pretvar)->dblVal = (double) ent->base;
3140 break;
3142 case _gep_direction:
3144 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3145 (*pretvar)->lVal = (s32) ent->direction;
3146 break;
3148 case _gep_exists:
3150 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3151 (*pretvar)->lVal = (s32) ent->exists;
3152 break;
3154 case _gep_edelay:
3156 arg = varlist[2];
3157 if(arg->vt != VT_INTEGER) {
3158 if(arg->vt != VT_STR)
3159 printf("You must give a string name for edelay property.\n");
3160 return E_FAIL;
3162 ltemp = arg->lVal;
3163 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3165 switch (ltemp) {
3166 case _gep_edelay_mode:
3168 (*pretvar)->lVal = (s32) ent->modeldata.edelay.mode;
3169 break;
3171 case _gep_edelay_factor:
3173 (*pretvar)->dblVal = (float) ent->modeldata.edelay.factor;
3174 break;
3176 case _gep_edelay_cap_min:
3178 (*pretvar)->lVal = (s32) ent->modeldata.edelay.cap_min;
3179 break;
3181 case _gep_edelay_cap_max:
3183 (*pretvar)->lVal = (s32) ent->modeldata.edelay.cap_max;
3184 break;
3186 case _gep_edelay_range_min:
3188 (*pretvar)->lVal = (s32) ent->modeldata.edelay.range_min;
3189 break;
3191 case _gep_edelay_range_max:
3193 (*pretvar)->lVal = (s32) ent->modeldata.edelay.range_max;
3194 break;
3196 default:
3197 ScriptVariant_Clear(*pretvar);
3198 return E_FAIL;
3200 break;
3202 case _gep_energycost:
3204 if(paramCount != 4 //Validate parameter count and types.
3205 || varlist[2]->vt != VT_INTEGER || varlist[3]->vt != VT_INTEGER) {
3206 printf
3207 ("\n Error, getentityproperty({ent}, 'energycost', {animation}, {argument}): Missing or invalid parameter. \n");
3208 return E_FAIL;
3211 i = varlist[2]->lVal; //Animation.
3213 if(!validanim(ent, i)) //Bad or missing animation = instant crash, let's validate and pass user friendly error.
3215 printf
3216 ("\n Error, getentityproperty({ent}, 'energycost', {animation}, {argument}): {animation} argument invalid. Make sure the animation exists. \n");
3217 return E_FAIL;
3220 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3221 (*pretvar)->lVal = (s32) ent->modeldata.animation[i]->energycost[varlist[3]->lVal];
3222 break;
3224 case _gep_dropframe:
3226 ltemp = 0;
3227 if(paramCount == 3) {
3228 arg = varlist[2];
3229 if(FAILED(ScriptVariant_IntegerValue(arg, &ltemp)))
3230 ltemp = (s32) 0;
3232 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3233 (*pretvar)->lVal = (s32) ent->modeldata.animation[ltemp]->dropframe;
3234 break;
3236 case _gep_landframe:
3238 ltemp = 0;
3239 if(paramCount == 3) {
3240 arg = varlist[2];
3241 if(FAILED(ScriptVariant_IntegerValue(arg, &ltemp)))
3242 ltemp = (s32) 0;
3244 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3245 (*pretvar)->lVal = (s32) ent->modeldata.animation[ltemp]->landframe[0];
3246 break;
3248 case _gep_type:
3250 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3251 (*pretvar)->lVal = (s32) ent->modeldata.type;
3252 break;
3254 case _gep_subtype:
3256 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3257 (*pretvar)->lVal = (s32) ent->modeldata.subtype;
3258 break;
3260 case _gep_throwdamage:
3262 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3263 (*pretvar)->lVal = (s32) ent->modeldata.throwdamage;
3264 break;
3266 case _gep_throwdist:
3268 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
3269 (*pretvar)->dblVal = (double) ent->modeldata.throwdist;
3270 break;
3272 case _gep_throwframewait:
3274 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3275 (*pretvar)->lVal = (s32) ent->modeldata.throwframewait;
3276 break;
3278 case _gep_throwheight:
3280 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
3281 (*pretvar)->dblVal = (double) ent->modeldata.throwheight;
3282 break;
3284 case _gep_aiflag:
3286 if(paramCount < 3)
3287 break;
3288 arg = varlist[2];
3289 if(arg->vt != VT_INTEGER) {
3290 printf("You must give a string name for aiflag.\n");
3291 return E_FAIL;
3293 ltemp = arg->lVal;
3294 switch (ltemp) {
3295 case _gep_aiflag_dead:
3297 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3298 (*pretvar)->lVal = (s32) ent->dead;
3299 break;
3301 case _gep_aiflag_jumping:
3303 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3304 (*pretvar)->lVal = (s32) ent->jumping;
3305 break;
3307 case _gep_aiflag_idling:
3309 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3310 (*pretvar)->lVal = (s32) ent->idling;
3311 break;
3313 case _gep_aiflag_drop:
3315 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3316 (*pretvar)->lVal = (s32) ent->drop;
3317 break;
3319 case _gep_aiflag_attacking:
3321 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3322 (*pretvar)->lVal = (s32) ent->attacking;
3323 break;
3325 case _gep_aiflag_getting:
3327 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3328 (*pretvar)->lVal = (s32) ent->getting;
3329 break;
3331 case _gep_aiflag_turning:
3333 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3334 (*pretvar)->lVal = (s32) ent->turning;
3335 break;
3337 case _gep_aiflag_charging:
3339 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3340 (*pretvar)->lVal = (s32) ent->charging;
3341 break;
3343 case _gep_aiflag_blocking:
3345 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3346 (*pretvar)->lVal = (s32) ent->blocking;
3347 break;
3349 case _gep_aiflag_falling:
3351 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3352 (*pretvar)->lVal = (s32) ent->falling;
3353 break;
3355 case _gep_aiflag_running:
3357 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3358 (*pretvar)->lVal = (s32) ent->running;
3359 break;
3361 case _gep_aiflag_inpain:
3363 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3364 (*pretvar)->lVal = (s32) ent->inpain;
3365 break;
3367 case _gep_aiflag_projectile:
3369 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3370 (*pretvar)->lVal = (s32) ent->projectile;
3371 break;
3373 case _gep_aiflag_frozen:
3375 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3376 (*pretvar)->lVal = (s32) ent->frozen;
3377 break;
3379 case _gep_aiflag_freezetime:
3381 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3382 (*pretvar)->lVal = (s32) ent->freezetime;
3383 break;
3385 case _gep_aiflag_toexplode:
3387 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3388 (*pretvar)->lVal = (s32) ent->toexplode;
3389 break;
3391 case _gep_aiflag_animating:
3393 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3394 (*pretvar)->lVal = (s32) ent->animating;
3395 break;
3397 case _gep_aiflag_blink:
3399 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3400 (*pretvar)->lVal = (s32) ent->blink;
3401 break;
3403 case _gep_aiflag_invincible:
3405 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3406 (*pretvar)->lVal = (s32) ent->invincible;
3407 break;
3409 case _gep_aiflag_autokill:
3411 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3412 (*pretvar)->lVal = (s32) ent->autokill;
3413 break;
3415 default:
3416 ScriptVariant_Clear(*pretvar);
3417 return E_FAIL;
3419 break;
3421 case _gep_animation:
3423 ScriptVariant_ChangeType(*pretvar, VT_PTR);
3424 (*pretvar)->ptrVal = (void*) ent->animation;
3425 break;
3427 case _gep_animnum:
3428 case _gep_animationid:
3430 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3431 (*pretvar)->lVal = (s32) ent->animnum;
3432 break;
3434 case _gep_animpos:
3436 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3437 (*pretvar)->lVal = (s32) ent->animpos;
3438 break;
3440 case _gep_animvalid:
3442 ltemp = 0;
3443 if(paramCount == 3) {
3444 arg = varlist[2];
3445 if(FAILED(ScriptVariant_IntegerValue(arg, &ltemp)))
3446 ltemp = (s32) 0;
3448 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3449 (*pretvar)->lVal = (s32) validanim(ent, ltemp);
3450 break;
3452 case _gep_animheight:
3454 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3455 (*pretvar)->lVal = (s32) ent->animation->height;
3456 break;
3458 case _gep_animating:
3460 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3461 (*pretvar)->lVal = (s32) ent->animating;
3462 break;
3464 case _gep_invincible:
3466 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3467 (*pretvar)->lVal = (s32) ent->invincible;
3468 break;
3470 case _gep_invinctime:
3472 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3473 (*pretvar)->lVal = (s32) ent->invinctime;
3474 break;
3476 case _gep_rush_count:
3478 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3479 (*pretvar)->lVal = (s32) ent->rush[0];
3480 break;
3482 case _gep_rush_tally:
3484 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3485 (*pretvar)->lVal = (s32) ent->rush[1];
3486 break;
3488 case _gep_rush_time:
3490 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3491 (*pretvar)->lVal = (s32) ent->rushtime;
3492 break;
3494 case _gep_knockdowncount:
3496 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
3497 (*pretvar)->dblVal = (double) ent->knockdowncount;
3498 break;
3500 case _gep_komap:
3502 if(paramCount < 3)
3503 break;
3504 arg = varlist[2];
3505 if(arg->vt != VT_INTEGER) {
3506 printf
3507 ("You must provide a Komap parameter index: \n 0 = Komap \n 1 = Komap type \n");
3508 return E_FAIL;
3511 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3512 (*pretvar)->lVal = (s32) ent->modeldata.komap[arg->lVal];
3513 break;
3515 case _gep_lifespancountdown:
3517 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
3518 (*pretvar)->dblVal = (double) ent->lifespancountdown;
3519 break;
3521 case _gep_blink:
3523 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3524 (*pretvar)->lVal = (s32) ent->blink;
3525 break;
3527 case _gep_subject_to_screen:
3529 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3530 (*pretvar)->lVal = (s32) ent->modeldata.subject_to_screen;
3531 break;
3533 case _gep_subject_to_minz:
3535 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3536 (*pretvar)->lVal = (s32) ent->modeldata.subject_to_minz;
3537 break;
3539 case _gep_subject_to_maxz:
3541 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3542 (*pretvar)->lVal = (s32) ent->modeldata.subject_to_maxz;
3543 break;
3545 case _gep_subject_to_wall:
3547 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3548 (*pretvar)->lVal = (s32) ent->modeldata.subject_to_wall;
3549 break;
3551 case _gep_subject_to_hole:
3553 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3554 (*pretvar)->lVal = (s32) ent->modeldata.subject_to_hole;
3555 break;
3557 case _gep_subject_to_gravity:
3559 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3560 (*pretvar)->lVal = (s32) ent->modeldata.subject_to_gravity;
3561 break;
3563 case _gep_subject_to_obstacle:
3565 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3566 (*pretvar)->lVal = (s32) ent->modeldata.subject_to_obstacle;
3567 break;
3569 case _gep_subject_to_platform:
3571 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3572 (*pretvar)->lVal = (s32) ent->modeldata.subject_to_platform;
3573 break;
3575 case _gep_defense:
3577 ltemp = 0;
3578 if(paramCount == 3) {
3579 arg = varlist[2];
3580 if(FAILED(ScriptVariant_IntegerValue(arg, &ltemp)))
3581 ltemp = (s32) 0;
3584 arg = varlist[3];
3585 if(arg->vt != VT_INTEGER) {
3586 if(arg->vt != VT_STR)
3587 printf("You must give a string name for defense property.\n");
3588 return E_FAIL;
3590 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
3592 switch (arg->lVal) {
3593 case _gep_defense_factor:
3595 (*pretvar)->dblVal =
3596 (float) ent->modeldata.defense_factors[(int) ltemp];
3597 break;
3599 case _gep_defense_blockpower:
3601 (*pretvar)->dblVal =
3602 (double) ent->modeldata.defense_blockpower[(int) ltemp];
3603 break;
3605 case _gep_defense_blockratio:
3607 (*pretvar)->dblVal =
3608 (double) ent->modeldata.defense_blockratio[(int) ltemp];
3609 break;
3611 case _gep_defense_blockthreshold:
3613 (*pretvar)->dblVal =
3614 (double) ent->modeldata.defense_blockthreshold[(int) ltemp];
3615 break;
3617 case _gep_defense_blocktype:
3619 (*pretvar)->dblVal =
3620 (double) ent->modeldata.defense_blocktype[(int) ltemp];
3621 break;
3623 case _gep_defense_knockdown:
3625 (*pretvar)->dblVal =
3626 (double) ent->modeldata.defense_knockdown[(int) ltemp];
3627 break;
3629 case _gep_defense_pain:
3631 (*pretvar)->dblVal =
3632 (double) ent->modeldata.defense_pain[(int) ltemp];
3633 break;
3635 default:
3636 return E_FAIL;
3638 break;
3640 case _gep_no_adjust_base:
3642 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3643 (*pretvar)->lVal = (s32) ent->modeldata.no_adjust_base;
3644 break;
3646 case _gep_noaicontrol:
3648 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3649 (*pretvar)->lVal = (s32) ent->noaicontrol;
3650 break;
3652 case _gep_nodieblink:
3654 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3655 (*pretvar)->lVal = (s32) ent->modeldata.nodieblink;
3656 break;
3658 case _gep_bounce:
3660 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3661 (*pretvar)->lVal = (s32) ent->modeldata.bounce;
3662 break;
3664 case _gep_falldie:
3666 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3667 (*pretvar)->lVal = (s32) ent->modeldata.falldie;
3668 break;
3670 case _gep_attackid:
3672 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3673 (*pretvar)->lVal = (s32) ent->attack_id;
3674 break;
3676 case _gep_hitbyid:
3678 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3679 (*pretvar)->lVal = (s32) ent->hit_by_attack_id;
3680 break;
3682 case _gep_bbox:
3684 if(paramCount < 6)
3685 break;
3687 if(varlist[2]->vt != VT_INTEGER
3688 || varlist[3]->vt != VT_INTEGER
3689 || varlist[4]->vt != VT_INTEGER || varlist[5]->vt != VT_INTEGER) {
3690 printf
3691 ("\n Error, getentityproperty({ent}, 'bbox', {index}, {animation}, {frame}, {arg}): {index}, {Animation}, {frame}, or {arg} parameter is missing or invalid. \n");
3692 return E_FAIL;
3694 //varlist[3]->lval; //bbox index (multiple bbox support).
3695 i = varlist[3]->lVal; //Animation parameter.
3696 tempint = varlist[4]->lVal; //Frame parameter.
3698 if(!ent->modeldata.animation[i]->bbox_coords) {
3699 break;
3702 coords = ent->modeldata.animation[i]->bbox_coords[tempint];
3704 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3705 (*pretvar)->lVal = (s32) coords[varlist[5]->lVal];
3706 break;
3708 case _gep_range:
3710 if(paramCount < 4)
3711 break;
3713 if(varlist[2]->vt != VT_INTEGER || varlist[3]->vt != VT_INTEGER) {
3714 printf
3715 ("\n Error, getentityproperty({ent}, 'range', {sub property}, {animation}): {Sub property} or {Animation} parameter is missing or invalid. \n");
3716 return E_FAIL;
3718 ltemp = varlist[2]->lVal; //Subproperty.
3719 i = varlist[3]->lVal; //Animation.
3721 if(!validanim(ent, i)) //Verify animation.
3723 break;
3726 switch (ltemp) {
3727 case _gep_range_amax:
3728 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3729 (*pretvar)->lVal = (s32) ent->modeldata.animation[i]->range[5];
3730 break;
3731 case _gep_range_amin:
3732 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3733 (*pretvar)->lVal = (s32) ent->modeldata.animation[i]->range[4];
3734 break;
3735 case _gep_range_bmax:
3736 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3737 (*pretvar)->lVal = (s32) ent->modeldata.animation[i]->range[7];
3738 break;
3739 case _gep_range_bmin:
3740 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3741 (*pretvar)->lVal = (s32) ent->modeldata.animation[i]->range[6];
3742 break;
3743 case _gep_range_xmax:
3744 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3745 (*pretvar)->lVal = (s32) ent->modeldata.animation[i]->range[1];
3746 break;
3747 case _gep_range_xmin:
3748 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3749 (*pretvar)->lVal = (s32) ent->modeldata.animation[i]->range[0];
3750 break;
3751 case _gep_range_zmax:
3752 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3753 (*pretvar)->lVal = (s32) ent->modeldata.animation[i]->range[3];
3754 break;
3755 case _gep_range_zmin:
3756 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3757 (*pretvar)->lVal = (s32) ent->modeldata.animation[i]->range[2];
3758 break;
3759 default:
3760 ScriptVariant_Clear(*pretvar);
3761 return E_FAIL;
3763 break;
3765 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3766 (*pretvar)->lVal = (s32) coords[varlist[4]->lVal];
3767 break;
3769 case _gep_attack:
3771 if(paramCount < 6)
3772 break;
3773 arg = varlist[2];
3774 if(arg->vt != VT_INTEGER) {
3775 printf
3776 ("Error, getentityproperty({ent}, 'attack', {sub property}, {index}, {animation}, {frame}): You must give a string name for {sub property}.\n");
3777 return E_FAIL;
3779 ltemp = arg->lVal;
3781 if(varlist[3]->vt != VT_INTEGER
3782 || varlist[4]->vt != VT_INTEGER || varlist[5]->vt != VT_INTEGER) {
3783 printf
3784 ("\n Error, getentityproperty({ent}, 'attack', {sub property}, {index}, {animation}, {frame}): {Animation} or {frame} parameter is missing or invalid. \n");
3785 return E_FAIL;
3787 //varlist[3]->lval //Attack box index (multiple attack boxes).
3788 i = varlist[4]->lVal; //Animation parameter.
3789 tempint = varlist[5]->lVal; //Frame parameter.
3791 if(!validanim(ent, i) || !ent->modeldata.animation[i]->attacks || !ent->modeldata.animation[i]->attacks[tempint]) //Verify animation and active attack on frame.
3793 break;
3796 attack = ent->modeldata.animation[i]->attacks[tempint]; //Get attack struct.
3798 switch (ltemp) {
3799 case _gep_attack_blockflash:
3800 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3801 (*pretvar)->lVal = (s32) attack->blockflash;
3802 break;
3803 case _gep_attack_blocksound:
3804 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3805 (*pretvar)->lVal = (s32) attack->blocksound;
3806 break;
3807 case _gep_attack_coords:
3808 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3809 (*pretvar)->lVal = (s32) attack->attack_coords[varlist[6]->lVal];
3810 break;
3811 case _gep_attack_counterattack:
3812 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3813 (*pretvar)->lVal = (s32) attack->counterattack;
3814 break;
3815 case _gep_attack_direction:
3816 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3817 (*pretvar)->lVal = (s32) attack->force_direction;
3818 break;
3819 case _gep_attack_dol:
3820 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3821 (*pretvar)->lVal = (s32) attack->damage_on_landing;
3822 break;
3823 case _gep_attack_dot:
3824 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3825 (*pretvar)->lVal = (s32) attack->dot;
3826 break;
3827 case _gep_attack_dotforce:
3828 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3829 (*pretvar)->lVal = (s32) attack->dot_force;
3830 break;
3831 case _gep_attack_dotindex:
3832 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3833 (*pretvar)->lVal = (s32) attack->dot_index;
3834 break;
3835 case _gep_attack_dotrate:
3836 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3837 (*pretvar)->lVal = (s32) attack->dot_rate;
3838 break;
3839 case _gep_attack_dottime:
3840 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3841 (*pretvar)->lVal = (s32) attack->dot_time;
3842 break;
3843 case _gep_attack_drop:
3844 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3845 (*pretvar)->lVal = (s32) attack->attack_drop;
3846 break;
3847 case _gep_attack_dropv:
3848 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
3849 (*pretvar)->dblVal = (double) attack->dropv[varlist[6]->lVal];
3850 break;
3851 case _gep_attack_force:
3852 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3853 (*pretvar)->lVal = (s32) attack->attack_force;
3854 break;
3855 case _gep_attack_forcemap:
3856 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3857 (*pretvar)->lVal = (s32) attack->forcemap;
3858 break;
3859 case _gep_attack_freeze:
3860 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3861 (*pretvar)->lVal = (s32) attack->freeze;
3862 break;
3863 case _gep_attack_freezetime:
3864 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3865 (*pretvar)->lVal = (s32) attack->freezetime;
3866 break;
3867 case _gep_attack_grab:
3868 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3869 (*pretvar)->lVal = (s32) attack->grab;
3870 break;
3871 case _gep_attack_grabdistance:
3872 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3873 (*pretvar)->lVal = (s32) attack->grab_distance;
3874 break;
3875 case _gep_attack_guardcost:
3876 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3877 (*pretvar)->lVal = (s32) attack->guardcost;
3878 break;
3879 case _gep_attack_hitflash:
3880 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3881 (*pretvar)->lVal = (s32) attack->hitflash;
3882 break;
3883 case _gep_attack_hitsound:
3884 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3885 (*pretvar)->lVal = (s32) attack->hitsound;
3886 break;
3887 case _gep_attack_jugglecost:
3888 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3889 (*pretvar)->lVal = (s32) attack->jugglecost;
3890 break;
3891 case _gep_attack_maptime:
3892 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3893 (*pretvar)->lVal = (s32) attack->maptime;
3894 break;
3895 case _gep_attack_noblock:
3896 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3897 (*pretvar)->lVal = (s32) attack->no_block;
3898 break;
3899 case _gep_attack_noflash:
3900 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3901 (*pretvar)->lVal = (s32) attack->no_flash;
3902 break;
3903 case _gep_attack_nopain:
3904 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3905 (*pretvar)->lVal = (s32) attack->no_pain;
3906 break;
3907 case _gep_attack_otg:
3908 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3909 (*pretvar)->lVal = (s32) attack->otg;
3910 break;
3911 case _gep_attack_pause:
3912 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3913 (*pretvar)->lVal = (s32) attack->pause_add;
3914 break;
3915 case _gep_attack_seal:
3916 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3917 (*pretvar)->lVal = (s32) attack->seal;
3918 break;
3919 case _gep_attack_sealtime:
3920 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3921 (*pretvar)->lVal = (s32) attack->sealtime;
3922 break;
3923 case _gep_attack_staydown:
3924 ScriptVariant_ChangeType(*pretvar, VT_PTR);
3925 (*pretvar)->ptrVal = (void*) attack->staydown;
3926 break;
3927 case _gep_attack_steal:
3928 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3929 (*pretvar)->lVal = (s32) attack->steal;
3930 break;
3931 case _gep_attack_type:
3932 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3933 (*pretvar)->lVal = (s32) attack->attack_type;
3934 break;
3935 default:
3936 ScriptVariant_Clear(*pretvar);
3937 return E_FAIL;
3939 break;
3941 case _gep_flash:
3943 arg = varlist[2];
3944 if(paramCount < 3 || arg->vt != VT_INTEGER) {
3945 printf
3946 ("Error, getentityproperty({ent}, 'flash', {argument}): Missing or invalid parameter. \n {argument}: \n 0 = Flash \n 1 = Noatflash \n 2=bflash \n");
3947 return E_FAIL;
3950 switch (arg->lVal) {
3951 default:
3952 i = ent->modeldata.flash;
3953 break;
3954 case 1:
3955 i = ent->modeldata.noatflash;
3956 break;
3957 case 2:
3958 i = ent->modeldata.bflash;
3959 break;
3961 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3962 (*pretvar)->lVal = (s32) i;
3963 break;
3965 case _gep_freezetime:
3967 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3968 (*pretvar)->lVal = (s32) ent->freezetime;
3969 break;
3971 case _gep_frozen:
3973 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3974 (*pretvar)->lVal = (s32) ent->frozen;
3975 break;
3977 case _gep_nodrop:
3979 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3980 (*pretvar)->lVal = (s32) ent->modeldata.nodrop;
3981 break;
3983 case _gep_nograb:
3985 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3986 (*pretvar)->lVal = (s32) ent->nograb;
3987 break;
3989 case _gep_nopain:
3991 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
3992 (*pretvar)->lVal = (s32) ent->modeldata.nopain;
3993 break;
3995 case _gep_offense:
3997 ltemp = 0;
3998 if(paramCount >= 3) {
3999 arg = varlist[2];
4000 if(FAILED(ScriptVariant_IntegerValue(arg, &ltemp)))
4001 ltemp = (s32) 0;
4003 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
4004 (*pretvar)->dblVal = (double) ent->modeldata.offense_factors[(int) ltemp];
4005 break;
4007 case _gep_antigravity:
4009 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
4010 (*pretvar)->dblVal = (double) ent->antigravity;
4011 break;
4013 case _gep_owner:
4015 if(ent->owner) // always return an empty var if it is NULL
4017 ScriptVariant_ChangeType(*pretvar, VT_PTR);
4018 (*pretvar)->ptrVal = (void*) ent->owner;
4020 break;
4022 case _gep_parent:
4024 if(ent->parent) // always return an empty var if it is NULL
4026 ScriptVariant_ChangeType(*pretvar, VT_PTR);
4027 (*pretvar)->ptrVal = (void*) ent->parent;
4029 break;
4031 case _gep_path:
4033 ScriptVariant_ChangeType(*pretvar, VT_STR);
4034 tempstr = ent->modeldata.path;
4036 strcpy(StrCache_Get((*pretvar)->strVal), tempstr);
4037 break;
4039 case _gep_subentity:
4041 if(ent->subentity) // always return an empty var if it is NULL
4043 ScriptVariant_ChangeType(*pretvar, VT_PTR);
4044 (*pretvar)->ptrVal = (void*) ent->subentity;
4046 break;
4048 case _gep_opponent:
4050 if(ent->opponent) // always return an empty var if it is NULL
4052 ScriptVariant_ChangeType(*pretvar, VT_PTR);
4053 (*pretvar)->ptrVal = (void*) ent->opponent;
4055 break;
4057 case _gep_grabbing:
4059 if(ent->grabbing) // always return an empty var if it is NULL
4061 ScriptVariant_ChangeType(*pretvar, VT_PTR);
4062 (*pretvar)->ptrVal = (void*) ent->grabbing;
4064 break;
4066 case _gep_link:
4068 if(ent->link) // always return an empty var if it is NULL
4070 ScriptVariant_ChangeType(*pretvar, VT_PTR);
4071 (*pretvar)->ptrVal = (void*) ent->link;
4073 break;
4075 case _gep_aimove:
4077 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4078 (*pretvar)->lVal = (s32) ent->modeldata.aimove;
4079 break;
4081 case _gep_aggression:
4083 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4084 (*pretvar)->lVal = (s32) ent->modeldata.aggression;
4085 break;
4087 case _gep_aiattack:
4089 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4090 (*pretvar)->lVal = (s32) ent->modeldata.aiattack;
4091 break;
4093 case _gep_attacking:
4095 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4096 (*pretvar)->lVal = (s32) ent->attacking;
4097 break;
4099 case _gep_autokill:
4101 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4102 (*pretvar)->lVal = (s32) ent->autokill;
4103 break;
4105 case _gep_scroll:
4107 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
4108 (*pretvar)->dblVal = (double) ent->modeldata.scroll;
4109 break;
4111 case _gep_damage_on_landing:
4113 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4114 (*pretvar)->lVal = (s32) ent->damage_on_landing;
4115 break;
4117 case _gep_dead:
4119 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4120 (*pretvar)->lVal = (s32) ent->dead;
4121 break;
4123 case _gep_detect:
4125 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4126 (*pretvar)->lVal = (s32) ent->modeldata.stealth[1];
4127 break;
4129 case _gep_stealth:
4131 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4132 (*pretvar)->lVal = (s32) ent->modeldata.stealth[0];
4133 break;
4135 case _gep_stalltime:
4137 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4138 (*pretvar)->lVal = (s32) ent->stalltime;
4139 break;
4141 case _gep_stats:
4143 if(paramCount < 4)
4144 break;
4145 arg = varlist[2];
4146 arg1 = varlist[3];
4148 if(arg->vt != VT_INTEGER || arg1->vt != VT_INTEGER) {
4149 printf
4150 ("Incorrect parameters: getentityproperty({ent}, 'stats', {type}, {index}) \n {type}: \n 0 = Model. \n 1 = Entity. \n");
4151 return E_FAIL;
4154 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
4156 switch (arg->lVal) {
4157 default:
4158 if(ent->modeldata.stats[arg1->lVal]) {
4159 (*pretvar)->dblVal = (double) ent->modeldata.stats[arg1->lVal];
4161 break;
4162 case 1:
4163 if(ent->stats[arg1->lVal]) {
4164 (*pretvar)->dblVal = (double) ent->stats[arg1->lVal];
4166 break;
4168 break;
4170 case _gep_staydown:
4172 if(paramCount < 4)
4173 break;
4174 arg = varlist[3];
4175 if(arg->vt != VT_INTEGER) {
4176 printf
4177 ("Incorrect parameters: getentityproperty({ent}, 'staydown', {type}) \n {type}: \n 0 = Staydown. \n 1 = Staydownatk. \n");
4178 return E_FAIL;
4181 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
4182 (*pretvar)->dblVal = (double) ent->staydown[arg->lVal];
4184 case _gep_gfxshadow:
4186 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4187 (*pretvar)->lVal = (s32) ent->modeldata.gfxshadow;
4188 break;
4191 case _gep_projectile:
4193 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4194 (*pretvar)->lVal = (s32) ent->projectile;
4195 break;
4197 case _gep_running:
4199 if(paramCount < 3)
4200 break;
4201 arg = varlist[2];
4202 if(arg->vt != VT_INTEGER) {
4203 if(arg->vt != VT_STR)
4204 printf("You must give a string name for running property.\n");
4205 return E_FAIL;
4207 ltemp = arg->lVal;
4208 switch (ltemp) {
4209 case _gep_running_speed:
4211 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
4212 (*pretvar)->dblVal = (double) ent->modeldata.runspeed;
4213 break;
4215 case _gep_running_jumpy:
4217 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
4218 (*pretvar)->dblVal = (double) ent->modeldata.runjumpheight;
4219 break;
4221 case _gep_running_jumpx:
4223 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
4224 (*pretvar)->dblVal = (double) ent->modeldata.runjumpdist;
4225 break;
4227 case _gep_running_land:
4229 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4230 (*pretvar)->lVal = (s32) ent->modeldata.runhold;
4231 break;
4233 case _gep_running_movez:
4235 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4236 (*pretvar)->lVal = (s32) ent->modeldata.runupdown;
4237 break;
4240 break;
4242 case _gep_seal:
4244 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4245 (*pretvar)->lVal = (s32) ent->seal;
4246 break;
4248 case _gep_sealtime:
4250 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4251 (*pretvar)->lVal = (s32) ent->sealtime;
4252 break;
4254 case _gep_dot:
4256 if(paramCount < 4)
4257 break;
4259 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
4260 i = (int) ltemp;
4262 arg = varlist[3];
4263 if(arg->vt != VT_INTEGER) {
4264 if(arg->vt != VT_STR)
4265 printf("You must give a string name for dot property.\n");
4266 return E_FAIL;
4268 switch (arg->lVal) {
4269 case _gep_dot_time:
4271 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4272 (*pretvar)->lVal = (s32) ent->dot_time[i];
4273 break;
4275 case _gep_dot_mode:
4277 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4278 (*pretvar)->lVal = (s32) ent->dot[i];
4279 break;
4281 case _gep_dot_force:
4284 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4285 (*pretvar)->lVal = (s32) ent->dot_force[i];
4286 break;
4288 case _gep_dot_rate:
4290 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4291 (*pretvar)->lVal = (s32) ent->dot_rate[i];
4292 break;
4294 case _gep_dot_type:
4296 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4297 (*pretvar)->lVal = (s32) ent->dot_atk[i];
4298 break;
4300 case _gep_dot_owner:
4302 ScriptVariant_ChangeType(*pretvar, VT_PTR);
4303 (*pretvar)->ptrVal = (void*) ent->dot_owner[i];
4304 break;
4306 break;
4309 case _gep_blockback:
4311 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
4312 ent->modeldata.blockback = (int) ltemp;
4313 break;
4315 case _gep_blockpain:
4317 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
4318 ent->modeldata.blockpain = (int) ltemp;
4319 break;
4321 case _gep_weapent:
4323 ScriptVariant_ChangeType(*pretvar, VT_PTR);
4324 (*pretvar)->ptrVal = (void*) ent->weapent;
4325 break;
4327 default:
4328 //printf("Property name '%s' is not supported by function getentityproperty.\n", propname);
4329 *pretvar = NULL;
4330 return E_FAIL;
4331 break;
4334 return S_OK;
4337 // ===== changeentityproperty =====
4338 enum changeentityproperty_enum {
4339 _cep_aggression,
4340 _cep_aiattack,
4341 _cep_aiflag,
4342 _cep_aimove,
4343 _cep_alpha,
4344 _cep_animation,
4345 _cep_animhits,
4346 _cep_animpos,
4347 _cep_antigrab,
4348 _cep_antigravity,
4349 _cep_attacking,
4350 _cep_attackid,
4351 _cep_autokill,
4352 _cep_base,
4353 _cep_blink,
4354 _cep_blockback,
4355 _cep_blockpain,
4356 _cep_bounce,
4357 _cep_candamage,
4358 _cep_combostep,
4359 _cep_colourmap,
4360 _cep_damage_on_landing,
4361 _cep_dead,
4362 _cep_defaultname,
4363 _cep_defense,
4364 _cep_detect,
4365 _cep_direction,
4366 _cep_dot,
4367 _cep_edelay,
4368 _cep_energycost,
4369 _cep_falldie,
4370 _cep_freezetime,
4371 _cep_frozen,
4372 _cep_gfxshadow,
4373 _cep_grabforce,
4374 _cep_guardpoints,
4375 _cep_health,
4376 _cep_hitbyid,
4377 _cep_hmapl,
4378 _cep_hmapu,
4379 _cep_hostile,
4380 _cep_iconposition,
4381 _cep_invincible,
4382 _cep_invinctime,
4383 _cep_jugglepoints,
4384 _cep_komap,
4385 _cep_lifeposition,
4386 _cep_lifespancountdown,
4387 _cep_map,
4388 _cep_maptime,
4389 _cep_maxguardpoints,
4390 _cep_maxhealth,
4391 _cep_maxjugglepoints,
4392 _cep_maxmp,
4393 _cep_model,
4394 _cep_mp,
4395 _cep_mpset,
4396 _cep_name,
4397 _cep_nameposition,
4398 _cep_nextanim,
4399 _cep_nextthink,
4400 _cep_no_adjust_base,
4401 _cep_noaicontrol,
4402 _cep_nodieblink,
4403 _cep_nodrop,
4404 _cep_nograb,
4405 _cep_nopain,
4406 _cep_offense,
4407 _cep_opponent,
4408 _cep_owner,
4409 _cep_parent,
4410 _cep_position,
4411 _cep_projectile,
4412 _cep_projectilehit,
4413 _cep_running,
4414 _cep_rush_count,
4415 _cep_rush_tally,
4416 _cep_rush_time,
4417 _cep_scroll,
4418 _cep_seal,
4419 _cep_sealtime,
4420 _cep_setlayer,
4421 _cep_speed,
4422 _cep_stalltime,
4423 _cep_stats,
4424 _cep_staydown,
4425 _cep_staydownatk,
4426 _cep_stealth,
4427 _cep_subentity,
4428 _cep_subject_to_gravity,
4429 _cep_subject_to_hole,
4430 _cep_subject_to_maxz,
4431 _cep_subject_to_minz,
4432 _cep_subject_to_obstacle,
4433 _cep_subject_to_platform,
4434 _cep_subject_to_screen,
4435 _cep_subject_to_wall,
4436 _cep_takeaction,
4437 _cep_think,
4438 _cep_throwdamage,
4439 _cep_throwdist,
4440 _cep_throwframewait,
4441 _cep_throwheight,
4442 _cep_tosstime,
4443 _cep_trymove,
4444 _cep_type,
4445 _cep_velocity,
4446 _cep_weapon,
4447 _cep_the_end,
4450 enum cep_takeaction_enum {
4451 _cep_ta_bomb_explode,
4452 _cep_ta_common_attack_proc,
4453 _cep_ta_common_block,
4454 _cep_ta_common_drop,
4455 _cep_ta_common_fall,
4456 _cep_ta_common_get,
4457 _cep_ta_common_grab,
4458 _cep_ta_common_grabattack,
4459 _cep_ta_common_grabbed,
4460 _cep_ta_common_jump,
4461 _cep_ta_common_land,
4462 _cep_ta_common_lie,
4463 _cep_ta_common_pain,
4464 _cep_ta_common_prejump,
4465 _cep_ta_common_rise,
4466 _cep_ta_common_spawn,
4467 _cep_ta_common_turn,
4468 _cep_ta_common_vault,
4469 _cep_ta_normal_prepare,
4470 _cep_ta_npc_warp,
4471 _cep_ta_player_blink,
4472 _cep_ta_suicide,
4473 _cep_ta_the_end,
4476 enum _cep_think_enum { // 2011_03_03, DC: Think types.
4477 _cep_th_common_think,
4478 _cep_th_player_think,
4479 _cep_th_steam_think,
4480 _cep_th_steamer_think,
4481 _cep_th_text_think,
4482 _cep_th_trap_think,
4483 _cep_th_the_end,
4486 enum cep_hostile_candamage_enum {
4487 _cep_hcd_ground,
4488 _cep_hcd_type_enemy,
4489 _cep_hcd_type_npc,
4490 _cep_hcd_type_obstacle,
4491 _cep_hcd_type_player,
4492 _cep_hcd_type_shot,
4493 _cep_hcd_the_end,
4496 enum cep_aiflag_enum {
4497 _cep_aiflag_animating,
4498 _cep_aiflag_attacking,
4499 _cep_aiflag_autokill,
4500 _cep_aiflag_blink,
4501 _cep_aiflag_blocking,
4502 _cep_aiflag_charging,
4503 _cep_aiflag_dead,
4504 _cep_aiflag_drop,
4505 _cep_aiflag_falling,
4506 _cep_aiflag_frozen,
4507 _cep_aiflag_getting,
4508 _cep_aiflag_idling,
4509 _cep_aiflag_inpain,
4510 _cep_aiflag_invincible,
4511 _cep_aiflag_jumping,
4512 _cep_aiflag_projectile,
4513 _cep_aiflag_running,
4514 _cep_aiflag_toexplode,
4515 _cep_aiflag_turning,
4516 _cep_aiflag_the_end,
4519 void mapstrings_changeentityproperty(ScriptVariant ** varlist, int paramCount) {
4520 char *propname;
4521 int prop, i;
4523 static const char *proplist[] = {
4524 "aggression",
4525 "aiattack",
4526 "aiflag",
4527 "aimove",
4528 "alpha",
4529 "animation",
4530 "animhits",
4531 "animpos",
4532 "antigrab",
4533 "antigravity",
4534 "attacking",
4535 "attackid",
4536 "autokill",
4537 "base",
4538 "blink",
4539 "blockback",
4540 "blockpain",
4541 "bounce",
4542 "candamage",
4543 "combostep",
4544 "colourmap",
4545 "damage_on_landing",
4546 "dead",
4547 "defaultname",
4548 "defense",
4549 "detect",
4550 "direction",
4551 "dot",
4552 "edelay",
4553 "energycost",
4554 "falldie",
4555 "freezetime",
4556 "frozen",
4557 "gfxshadow",
4558 "grabforce",
4559 "guardpoints",
4560 "health",
4561 "hitbyid",
4562 "hmapl",
4563 "hmapu",
4564 "hostile",
4565 "iconposition",
4566 "invincible",
4567 "invinctime",
4568 "jugglepoints",
4569 "komap",
4570 "lifeposition",
4571 "lifespancountdown",
4572 "map",
4573 "maptime",
4574 "maxguardpoints",
4575 "maxhealth",
4576 "maxjugglepoints",
4577 "maxmp",
4578 "model",
4579 "mp",
4580 "mpset",
4581 "name",
4582 "nameposition",
4583 "nextanim",
4584 "nextthink",
4585 "no_adjust_base",
4586 "noaicontrol",
4587 "nodieblink",
4588 "nodrop",
4589 "nograb",
4590 "nopain",
4591 "offense",
4592 "opponent",
4593 "owner",
4594 "parent",
4595 "position",
4596 "projectile",
4597 "projectilehit",
4598 "running",
4599 "rush_count",
4600 "rush_tally",
4601 "rush_time",
4602 "scroll",
4603 "seal",
4604 "sealtime",
4605 "setlayer",
4606 "speed",
4607 "stalltime",
4608 "stats",
4609 "staydown",
4610 "staydownatk",
4611 "stealth",
4612 "subentity",
4613 "subject_to_gravity",
4614 "subject_to_hole",
4615 "subject_to_maxz",
4616 "subject_to_minz",
4617 "subject_to_obstacle",
4618 "subject_to_platform",
4619 "subject_to_screen",
4620 "subject_to_wall",
4621 "takeaction",
4622 "think",
4623 "throwdamage",
4624 "throwdist",
4625 "throwframewait",
4626 "throwheight",
4627 "tosstime",
4628 "trymove",
4629 "type",
4630 "velocity",
4631 "weapon",
4634 static const char *proplist_takeaction[] = {
4635 "bomb_explode",
4636 "common_attack_proc",
4637 "common_block",
4638 "common_drop",
4639 "common_fall",
4640 "common_get",
4641 "common_grab",
4642 "common_grabattack",
4643 "common_grabbed",
4644 "common_jump",
4645 "common_land",
4646 "common_lie",
4647 "common_pain",
4648 "common_prejump",
4649 "common_rise",
4650 "common_spawn",
4651 "common_turn",
4652 "common_vault",
4653 "normal_prepare",
4654 "npc_warp",
4655 "player_blink",
4656 "suicide",
4659 static const char *proplist_think[] = { // 2011_03_03, DC: Think types.
4660 "common_think",
4661 "player_think",
4662 "steam_think",
4663 "steamer_think",
4664 "text_think",
4665 "trap_think",
4668 static const char *proplist_aiflag[] = {
4669 "animating",
4670 "attacking",
4671 "autokill",
4672 "blink",
4673 "blocking",
4674 "charging",
4675 "dead",
4676 "drop",
4677 "falling",
4678 "frozen",
4679 "getting",
4680 "idling",
4681 "inpain",
4682 "invincible",
4683 "jumping",
4684 "projectile",
4685 "running",
4686 "toexplode",
4687 "turning",
4690 static const char *proplist_hostile_candamage[] = {
4691 "ground",
4692 "type_enemy",
4693 "type_npc",
4694 "type_obstacle",
4695 "type_player",
4696 "type_shot",
4699 if(paramCount < 3)
4700 return;
4702 // property name
4703 MAPSTRINGS(varlist[1], proplist, _cep_the_end,
4704 "Property name '%s' is not supported by function changeentityproperty.\n");
4706 // action for takeaction
4707 if((varlist[1]->vt == VT_INTEGER) && (varlist[1]->lVal == _cep_takeaction)) {
4708 MAPSTRINGS(varlist[2], proplist_takeaction, _cep_ta_the_end,
4709 "Action '%s' is not supported by 'takeaction'.\n");
4711 // 2011_03_13, DC: Think sets for think.
4712 if((varlist[1]->vt == VT_INTEGER) && (varlist[1]->lVal == _cep_think)) {
4713 MAPSTRINGS(varlist[2], proplist_think, _cep_th_the_end, "Set '%s' is not supported by 'think'.\n");
4715 // entity type(s) for hostile, candamage, and projectilehit.
4716 if((varlist[1]->vt == VT_INTEGER) &&
4717 ((varlist[1]->lVal == _cep_hostile) || (varlist[1]->lVal == _cep_candamage)
4718 || (varlist[1]->lVal == _cep_projectilehit))) {
4719 for(i = 2; i < paramCount; i++) {
4720 MAPSTRINGS(varlist[i], proplist_hostile_candamage, _cep_hcd_the_end,
4721 "Entity type '%s' is not supported by 'hostile', 'candamage', or 'projectilehit'\n");
4724 // AI flag name for aiflag
4725 if((varlist[1]->vt == VT_INTEGER) && (varlist[1]->lVal == _cep_aiflag)) {
4726 MAPSTRINGS(varlist[2], proplist_aiflag, _cep_aiflag_the_end,
4727 "Flag '%s' is not supported by 'aiflag'.\n");
4731 //changeentityproperty(pentity, propname, value1[ ,value2, value3, ...]);
4732 s32 openbor_changeentityproperty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
4733 entity *ent = NULL;
4734 s_model *tempmodel;
4735 char *tempstr = NULL;
4736 s32 ltemp, ltemp2;
4737 double dbltemp;
4738 int propind;
4739 int i = 0;
4740 static const void *think[] = { // 2011_03_03, DC: Think types.
4741 common_think,
4742 player_think,
4743 steam_think,
4744 steamer_think,
4745 text_think,
4746 trap_think,
4748 static const void *actions[] = { // for takeaction
4749 bomb_explode,
4750 common_attack_proc,
4751 common_block,
4752 common_drop,
4753 common_fall,
4754 common_get,
4755 common_grab,
4756 common_grabattack,
4757 common_grabbed,
4758 common_jump,
4759 common_land,
4760 common_lie,
4761 common_pain,
4762 common_prejump,
4763 common_rise,
4764 common_spawn,
4765 common_turn,
4766 common_vault,
4767 normal_prepare,
4768 npc_warp,
4769 player_blink,
4770 suicide,
4773 static const int entitytypes[] = {
4774 0, // "ground"; not a real entity type
4775 TYPE_ENEMY,
4776 TYPE_NPC,
4777 TYPE_OBSTACLE,
4778 TYPE_PLAYER,
4779 TYPE_SHOT,
4782 if(paramCount < 3) {
4783 printf("Function changeentityproperty must have have at least 3 parameters.");
4784 goto changeentityproperty_error;
4787 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
4788 (*pretvar)->lVal = (s32) 0;
4789 mapstrings_changeentityproperty(varlist, paramCount);
4791 if(varlist[0]->vt != VT_PTR && varlist[0]->vt != VT_EMPTY) {
4792 printf("Function changeentityproperty must have a valid entity handle.");
4793 goto changeentityproperty_error;
4795 ent = (entity *) varlist[0]->ptrVal; //retrieve the entity
4796 if(!ent) {
4797 (*pretvar)->lVal = (s32) 0;
4798 return S_OK;
4801 if(varlist[1]->vt != VT_INTEGER) {
4802 if(varlist[1]->vt != VT_STR)
4803 printf("Function changeentityproperty must have a string property name.\n");
4804 goto changeentityproperty_error;
4807 propind = varlist[1]->lVal;
4809 switch (propind) {
4810 case _cep_takeaction:
4812 if(varlist[2]->vt == VT_STR) { // not a known action; if it were it would been mapped by mapstrings
4813 ent->takeaction = NULL;
4814 break;
4815 } else if(varlist[2]->vt != VT_INTEGER) {
4816 printf("You must give a string value for action type.\n");
4817 goto changeentityproperty_error;
4819 // otherwise, the parameter is a known action
4820 ltemp = varlist[2]->lVal;
4821 if((ltemp >= 0) && (ltemp < _cep_ta_the_end)) {
4822 ent->takeaction = actions[(int) ltemp];
4825 break;
4827 case _cep_think:
4829 if(varlist[2]->vt == VT_STR) { // not a known action; if it were it would been mapped by mapstrings
4830 //ent->think = NULL;
4831 break;
4832 } else if(varlist[2]->vt != VT_INTEGER) {
4833 printf("You must give a string value for think type.\n");
4834 goto changeentityproperty_error;
4836 // otherwise, the parameter is a known action
4837 ltemp = varlist[2]->lVal;
4838 if((ltemp >= 0) && (ltemp < _cep_th_the_end)) {
4839 ent->think = think[(int) ltemp];
4842 break;
4844 case _cep_type:
4846 if(varlist[2]->vt != VT_INTEGER) {
4847 printf("You must provide a type constant for type.\n");
4848 goto changeentityproperty_error;
4851 ltemp = varlist[2]->lVal;
4852 ent->modeldata.type = (int) ltemp;
4854 break;
4856 case _cep_candamage:
4858 ent->modeldata.candamage = 0;
4860 for(i = 2; i < paramCount; i++) {
4861 if(varlist[i]->vt == VT_INTEGER) // known entity type
4863 ltemp = varlist[i]->lVal;
4864 if(ltemp == _cep_hcd_ground) // "ground" - not needed?
4865 ent->modeldata.ground = 1;
4866 else
4867 ent->modeldata.candamage |= entitytypes[(int) ltemp];
4868 } else {
4869 printf("You must pass one or more string constants for entity type.\n");
4870 goto changeentityproperty_error;
4873 break;
4875 case _cep_hostile:
4878 ent->modeldata.hostile = 0;
4880 for(i = 2; i < paramCount; i++) {
4881 if(varlist[i]->vt == VT_INTEGER) // known entity type
4883 ltemp = varlist[i]->lVal;
4884 ent->modeldata.hostile |= entitytypes[(int) ltemp];
4885 } else {
4886 printf("You must pass one or more string constants for entity type.\n");
4887 goto changeentityproperty_error;
4891 break;
4893 case _cep_projectilehit:
4896 ent->modeldata.projectilehit = 0;
4898 for(i = 2; i < paramCount; i++) {
4899 if(varlist[i]->vt == VT_INTEGER) // known entity type
4901 ltemp = varlist[i]->lVal;
4902 ent->modeldata.projectilehit |= entitytypes[(int) ltemp];
4903 } else {
4904 printf("You must pass one or more string constants for entity type.\n");
4905 goto changeentityproperty_error;
4909 break;
4912 case _cep_model:
4914 if(varlist[2]->vt != VT_STR) {
4915 printf("You must give a string value for model name.\n");
4916 goto changeentityproperty_error;
4918 tempstr = (char *) StrCache_Get(varlist[2]->strVal);
4919 if(paramCount > 3) {
4920 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
4921 (*pretvar)->lVal = (s32) 1;
4922 } else {
4923 ltemp = (s32) 0;
4924 (*pretvar)->lVal = (s32) 1;
4926 if((*pretvar)->lVal == (s32) 1)
4927 set_model_ex(ent, tempstr, -1, NULL, (int) ltemp);
4928 if(!ent->weapent)
4929 ent->weapent = ent;
4930 break;
4932 case _cep_weapon:
4934 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
4935 if(paramCount > 3) {
4936 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp2)))
4937 (*pretvar)->lVal = (s32) 1;
4938 } else {
4939 ltemp2 = (s32) 0;
4940 (*pretvar)->lVal = (s32) 1;
4942 set_weapon(ent, (int) ltemp, (int) ltemp2);
4943 (*pretvar)->lVal = (s32) 1;
4945 break;
4947 case _cep_maxhealth:
4949 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
4950 (*pretvar)->lVal = (s32) 1;
4951 ent->modeldata.health = (int) ltemp;
4952 if(ent->modeldata.health < 0)
4953 ent->modeldata.health = 0; //OK, no need to have ot below 0
4955 break;
4957 case _cep_health:
4959 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
4960 ent->health = (int) ltemp;
4961 if(ent->health > ent->modeldata.health)
4962 ent->health = ent->modeldata.health;
4963 else if(ent->health < 0)
4964 ent->health = 0;
4965 (*pretvar)->lVal = (s32) 1;
4967 break;
4969 case _cep_maxmp:
4971 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
4972 ent->modeldata.mp = (int) ltemp;
4973 if(ent->modeldata.mp < 0)
4974 ent->modeldata.mp = 0; //OK, no need to have ot below 0
4975 (*pretvar)->lVal = (s32) 1;
4977 break;
4979 case _cep_mp:
4981 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
4982 ent->mp = (int) ltemp;
4983 if(ent->mp > ent->modeldata.mp)
4984 ent->mp = ent->modeldata.mp;
4985 else if(ent->mp < 0)
4986 ent->mp = 0;
4987 (*pretvar)->lVal = (s32) 1;
4989 break;
4991 case _cep_setlayer:
4993 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
4994 ent->modeldata.setlayer = (int) ltemp;
4995 (*pretvar)->lVal = (s32) 1;
4997 break;
4999 case _cep_speed:
5001 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
5002 (*pretvar)->lVal = (s32) 1;
5003 ent->modeldata.speed = (float) dbltemp;
5005 break;
5007 case _cep_throwdamage:
5009 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5010 ent->modeldata.throwdamage = (int) ltemp;
5011 (*pretvar)->lVal = (s32) 1;
5013 break;
5015 case _cep_throwdist:
5017 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
5018 (*pretvar)->lVal = (s32) 1;
5019 ent->modeldata.throwdist = (float) dbltemp;
5021 break;
5023 case _cep_throwframewait:
5025 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5026 ent->modeldata.throwframewait = (int) ltemp;
5027 (*pretvar)->lVal = (s32) 1;
5029 break;
5031 case _cep_throwheight:
5033 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
5034 (*pretvar)->lVal = (s32) 1;
5035 ent->modeldata.throwheight = (float) dbltemp;
5037 break;
5039 case _cep_animhits:
5041 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5042 (*pretvar)->lVal = (s32) 1;
5043 ent->animation->animhits = (int) ltemp;
5045 break;
5047 case _cep_alpha:
5049 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5050 (*pretvar)->lVal = (s32) 1;
5051 ent->modeldata.alpha = (int) ltemp;
5053 break;
5055 case _cep_guardpoints:
5057 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5058 (*pretvar)->lVal = (s32) 1;
5059 ent->modeldata.guardpoints[0] = (int) ltemp;
5061 break;
5063 case _cep_maxguardpoints:
5065 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5066 (*pretvar)->lVal = (s32) 1;
5067 ent->modeldata.guardpoints[1] = (int) ltemp;
5069 break;
5071 case _cep_jugglepoints:
5073 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5074 (*pretvar)->lVal = (s32) 1;
5075 ent->modeldata.jugglepoints[0] = (int) ltemp;
5077 break;
5079 case _cep_komap:
5081 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5082 (*pretvar)->lVal = (s32) 1;
5083 ent->modeldata.komap[0] = (int) ltemp;
5085 if(paramCount >= 4 && (*pretvar)->lVal == (s32) 1) {
5086 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5087 ent->modeldata.komap[1] = (int) ltemp;
5088 else
5089 (*pretvar)->lVal = (s32) 0;
5091 break;
5093 case _cep_maxjugglepoints:
5095 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5096 (*pretvar)->lVal = (s32) 1;
5097 ent->modeldata.jugglepoints[1] = (int) ltemp;
5099 break;
5101 case _cep_antigravity:
5103 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
5104 (*pretvar)->lVal = (s32) 1;
5105 ent->modeldata.antigravity = (float) dbltemp;
5107 break;
5109 case _cep_map:
5111 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5112 ent_set_colourmap(ent, (int) ltemp);
5113 (*pretvar)->lVal = (s32) 1;
5115 break;
5117 case _cep_maptime:
5119 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5120 (*pretvar)->lVal = (s32) 1;
5121 ent->maptime = (int) ltemp;
5123 break;
5125 case _cep_colourmap:
5127 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5128 (*pretvar)->lVal = (s32) 1;
5129 self->colourmap = self->modeldata.colourmap[ltemp - 1];
5131 break;
5133 case _cep_hmapl:
5135 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5136 (*pretvar)->lVal = (s32) 1;
5137 self->modeldata.hmap1 = ltemp;
5138 break;
5140 case _cep_hmapu:
5142 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5143 (*pretvar)->lVal = (s32) 1;
5144 self->modeldata.hmap2 = ltemp;
5145 break;
5147 case _cep_name:
5149 if(varlist[2]->vt != VT_STR) {
5150 printf("You must give a string value for entity name.\n");
5151 goto changeentityproperty_error;
5153 strcpy(ent->name, (char *) StrCache_Get(varlist[2]->strVal));
5154 (*pretvar)->lVal = (s32) 1;
5155 break;
5157 case _cep_defaultname:
5159 if(varlist[2]->vt != VT_STR) {
5160 printf("You must give a string value for entity name.\n");
5161 goto changeentityproperty_error;
5163 tempmodel = findmodel((char *) StrCache_Get(varlist[2]->strVal));
5164 if(!tempmodel) {
5165 printf
5166 ("Use must give an existing model's name for entity's default model name.\n");
5167 goto changeentityproperty_error;
5169 ent->defaultmodel = tempmodel;
5170 (*pretvar)->lVal = (s32) 1;
5171 break;
5173 case _cep_position:
5175 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
5176 (*pretvar)->lVal = (s32) 1;
5177 ent->x = (float) dbltemp;
5179 if(paramCount >= 4 && (*pretvar)->lVal == (s32) 1) {
5180 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[3], &dbltemp)))
5181 ent->z = (float) dbltemp;
5182 else
5183 (*pretvar)->lVal = (s32) 0;
5185 if(paramCount >= 5 && (*pretvar)->lVal == (s32) 1) {
5186 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[4], &dbltemp)))
5187 ent->a = (float) dbltemp;
5188 else
5189 (*pretvar)->lVal = (s32) 0;
5191 break;
5193 case _cep_base:
5195 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
5196 ent->base = (float) dbltemp;
5197 (*pretvar)->lVal = (s32) 1;
5199 break;
5201 case _cep_direction:
5203 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
5204 ent->direction = (int) dbltemp;
5205 (*pretvar)->lVal = (s32) 1;
5207 break;
5209 case _cep_trymove:
5211 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5212 (*pretvar)->lVal = (s32) 1;
5213 if(ltemp == 1)
5214 ent->trymove = common_trymove;
5215 else if(ltemp == 2)
5216 ent->trymove = player_trymove;
5217 else
5218 ent->trymove = NULL;
5220 break;
5222 case _cep_nextanim:
5224 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5225 (*pretvar)->lVal = (s32) 1;
5226 ent->nextanim = (int) ltemp;
5228 break;
5230 case _cep_nextthink:
5232 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5233 (*pretvar)->lVal = (s32) 1;
5234 ent->nextthink = (int) ltemp;
5236 break;
5238 case _cep_tosstime:
5240 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5241 (*pretvar)->lVal = (s32) 1;
5242 ent->toss_time = (int) ltemp;
5244 break;
5246 case _cep_velocity:
5248 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
5249 (*pretvar)->lVal = (s32) 1;
5250 ent->xdir = (float) dbltemp;
5252 if(paramCount >= 4 && (*pretvar)->lVal == (s32) 1) {
5253 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[3], &dbltemp)))
5254 ent->zdir = (float) dbltemp;
5255 else
5256 (*pretvar)->lVal = (s32) 0;
5258 if(paramCount >= 5 && (*pretvar)->lVal == (s32) 1) {
5259 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[4], &dbltemp)))
5260 ent->tossv = (float) dbltemp;
5261 else
5262 (*pretvar)->lVal = (s32) 0;
5264 break;
5266 case _cep_defense:
5268 if(paramCount >= 4 &&
5269 SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)) &&
5270 ltemp < (s32) MAX_ATKS && ltemp >= (s32) 0) {
5271 (*pretvar)->lVal = (s32) 1;
5273 if((*pretvar)->lVal == (s32) 1) {
5274 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[3], &dbltemp)))
5275 ent->modeldata.defense_factors[(int) ltemp] = (float) dbltemp;
5276 else
5277 (*pretvar)->lVal = (s32) 0;
5279 if(paramCount >= 5 && (*pretvar)->lVal == (s32) 1) {
5280 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[4], &dbltemp)))
5281 ent->modeldata.defense_pain[(int) ltemp] = (float) dbltemp;
5282 else
5283 (*pretvar)->lVal = (s32) 0;
5285 if(paramCount >= 6 && (*pretvar)->lVal == (s32) 1) {
5286 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[5], &dbltemp)))
5287 ent->modeldata.defense_knockdown[(int) ltemp] = (float) dbltemp;
5288 else
5289 (*pretvar)->lVal = (s32) 0;
5291 if(paramCount >= 7 && (*pretvar)->lVal == (s32) 1) {
5292 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[6], &dbltemp)))
5293 ent->modeldata.defense_blockpower[(int) ltemp] = (float) dbltemp;
5294 else
5295 (*pretvar)->lVal = (s32) 0;
5297 if(paramCount >= 8 && (*pretvar)->lVal == (s32) 1) {
5298 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[7], &dbltemp)))
5299 ent->modeldata.defense_blockthreshold[(int) ltemp] = (float) dbltemp;
5300 else
5301 (*pretvar)->lVal = (s32) 0;
5303 if(paramCount >= 9 && (*pretvar)->lVal == (s32) 1) {
5304 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[8], &dbltemp)))
5305 ent->modeldata.defense_blockratio[(int) ltemp] = (float) dbltemp;
5306 else
5307 (*pretvar)->lVal = (s32) 0;
5309 if(paramCount >= 10 && (*pretvar)->lVal == (s32) 1) {
5310 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[9], &dbltemp)))
5311 ent->modeldata.defense_blocktype[(int) ltemp] = (float) dbltemp;
5312 else
5313 (*pretvar)->lVal = (s32) 0;
5315 break;
5317 case _cep_offense:
5319 if(paramCount >= 4 &&
5320 SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)) &&
5321 ltemp < (s32) MAX_ATKS && ltemp >= (s32) 0) {
5322 (*pretvar)->lVal = (s32) 1;
5324 if((*pretvar)->lVal == (s32) 1) {
5325 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[3], &dbltemp)))
5326 ent->modeldata.offense_factors[(int) ltemp] = (float) dbltemp;
5327 else
5328 (*pretvar)->lVal = (s32) 0;
5330 break;
5332 case _cep_grabforce:
5334 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5335 ent->model->grabforce = (int) ltemp;
5336 break;
5338 case _cep_antigrab:
5340 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5341 ent->model->antigrab = (int) ltemp;
5342 break;
5344 case _cep_nodrop:
5346 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5347 ent->modeldata.nodrop = (int) ltemp;
5348 break;
5350 case _cep_nopain:
5352 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5353 ent->modeldata.nopain = (int) ltemp;
5354 break;
5356 case _cep_nograb:
5358 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5359 ent->nograb = (int) ltemp;
5360 break;
5362 case _cep_no_adjust_base:
5364 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5365 ent->modeldata.no_adjust_base = (int) ltemp;
5366 break;
5368 case _cep_noaicontrol:
5370 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5371 ent->noaicontrol = (int) ltemp;
5372 break;
5374 case _cep_nodieblink:
5376 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5377 ent->modeldata.nodieblink = (int) ltemp;
5378 break;
5380 case _cep_falldie:
5382 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5383 ent->modeldata.falldie = (int) ltemp;
5384 break;
5386 case _cep_freezetime:
5388 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5389 ent->freezetime = (int) ltemp;
5390 break;
5392 case _cep_frozen:
5394 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5395 ent->frozen = (int) ltemp;
5396 break;
5398 case _cep_bounce:
5400 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5401 ent->modeldata.bounce = (int) ltemp;
5402 break;
5404 case _cep_aiflag:
5406 if(varlist[2]->vt != VT_INTEGER) {
5407 if(varlist[2]->vt != VT_STR)
5408 printf("You must give a string value for AI flag name.\n");
5409 goto changeentityproperty_error;
5411 if(paramCount < 4)
5412 break;
5414 switch (varlist[2]->lVal) {
5415 case _cep_aiflag_dead:
5417 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5418 ent->dead = (int) ltemp;
5419 break;
5421 case _cep_aiflag_jumping:
5423 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5424 ent->jumping = (int) ltemp;
5425 break;
5427 case _cep_aiflag_idling:
5429 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5430 ent->idling = (int) ltemp;
5431 break;
5433 case _cep_aiflag_drop:
5435 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5436 ent->drop = (int) ltemp;
5437 break;
5439 case _cep_aiflag_attacking:
5441 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5442 ent->attacking = (int) ltemp;
5443 break;
5445 case _cep_aiflag_getting:
5447 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5448 ent->getting = (int) ltemp;
5449 break;
5451 case _cep_aiflag_turning:
5453 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5454 ent->turning = (int) ltemp;
5455 break;
5457 case _cep_aiflag_charging:
5459 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5460 ent->charging = (int) ltemp;
5461 break;
5463 case _cep_aiflag_blocking:
5465 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5466 ent->blocking = (int) ltemp;
5467 break;
5469 case _cep_aiflag_falling:
5471 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5472 ent->falling = (int) ltemp;
5473 break;
5475 case _cep_aiflag_running:
5477 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5478 ent->running = (int) ltemp;
5479 break;
5481 case _cep_aiflag_inpain:
5483 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5484 ent->inpain = (int) ltemp;
5485 break;
5487 case _cep_aiflag_projectile:
5489 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5490 ent->projectile = (int) ltemp;
5491 break;
5493 case _cep_aiflag_frozen:
5495 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5496 ent->frozen = (int) ltemp;
5497 break;
5499 case _cep_aiflag_toexplode:
5501 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5502 ent->toexplode = (int) ltemp;
5503 break;
5505 case _cep_aiflag_animating:
5507 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5508 ent->animating = (int) ltemp;
5509 break;
5511 case _cep_aiflag_blink:
5513 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5514 ent->blink = (int) ltemp;
5515 break;
5517 case _cep_aiflag_invincible:
5519 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5520 ent->invincible = (int) ltemp;
5521 break;
5523 case _cep_aiflag_autokill:
5525 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5526 ent->autokill = (int) ltemp;
5527 break;
5529 default:
5530 printf("Unknown AI flag.\n");
5531 goto changeentityproperty_error;
5533 break;
5535 case _cep_animation:
5537 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5538 (*pretvar)->lVal = (s32) 1;
5539 if(paramCount >= 4) {
5540 if(FAILED(ScriptVariant_IntegerValue(varlist[3], &ltemp2)))
5541 (*pretvar)->lVal = (s32) 0;
5542 } else
5543 ltemp2 = (s32) 1;
5544 if((*pretvar)->lVal == (s32) 1) {
5545 ent_set_anim(ent, (int) ltemp, (int) ltemp2);
5547 break;
5549 case _cep_animpos:
5551 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5552 ent->animpos = (int) ltemp;
5553 break;
5555 case _cep_invincible:
5557 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5558 ent->invincible = (int) ltemp;
5559 (*pretvar)->lVal = (s32) 1;
5561 break;
5563 case _cep_invinctime:
5565 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5566 ent->invinctime = (int) ltemp;
5567 break;
5569 case _cep_rush_count:
5571 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5572 (*pretvar)->lVal = (s32) 1;
5573 ent->rush[0] = (int) ltemp;
5575 break;
5577 case _cep_rush_tally:
5579 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5580 (*pretvar)->lVal = (s32) 1;
5581 ent->rush[1] = (int) ltemp;
5583 break;
5585 case _cep_rush_time:
5587 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5588 ent->rushtime = (int) ltemp;
5589 break;
5591 case _cep_iconposition:
5593 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5594 ent->modeldata.iconx = (int) ltemp;
5595 if(paramCount > 3 && SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5596 ent->modeldata.icony = (int) ltemp;
5597 break;
5599 case _cep_lifeposition:
5601 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5602 ent->modeldata.hpx = (int) ltemp;
5603 if(paramCount > 3 && SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5604 ent->modeldata.hpy = (int) ltemp;
5605 break;
5607 case _cep_nameposition:
5609 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5610 ent->modeldata.namex = (int) ltemp;
5611 if(paramCount > 3 && SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5612 ent->modeldata.namey = (int) ltemp;
5613 break;
5615 case _cep_lifespancountdown:
5617 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp)))
5618 ent->lifespancountdown = (float) dbltemp;
5619 break;
5621 case _cep_blink:
5623 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5624 ent->blink = (int) ltemp;
5625 (*pretvar)->lVal = (s32) 1;
5627 break;
5629 case _cep_subject_to_screen:
5631 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5632 ent->modeldata.subject_to_screen = (int) ltemp;
5633 (*pretvar)->lVal = (s32) 1;
5635 break;
5637 case _cep_subject_to_maxz:
5639 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5640 ent->modeldata.subject_to_maxz = (int) ltemp;
5641 (*pretvar)->lVal = (s32) 1;
5643 break;
5645 case _cep_subject_to_minz:
5647 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5648 ent->modeldata.subject_to_minz = (int) ltemp;
5649 (*pretvar)->lVal = (s32) 1;
5651 break;
5653 case _cep_subject_to_wall:
5655 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5656 ent->modeldata.subject_to_wall = (int) ltemp;
5657 (*pretvar)->lVal = (s32) 1;
5659 break;
5661 case _cep_subject_to_obstacle:
5663 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5664 ent->modeldata.subject_to_obstacle = (int) ltemp;
5665 (*pretvar)->lVal = (s32) 1;
5667 break;
5669 case _cep_subject_to_platform:
5671 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5672 ent->modeldata.subject_to_platform = (int) ltemp;
5673 (*pretvar)->lVal = (s32) 1;
5675 break;
5677 case _cep_subject_to_gravity:
5679 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5680 ent->modeldata.subject_to_gravity = (int) ltemp;
5681 (*pretvar)->lVal = (s32) 1;
5683 break;
5685 case _cep_subject_to_hole:
5687 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5688 ent->modeldata.subject_to_hole = (int) ltemp;
5689 (*pretvar)->lVal = (s32) 1;
5691 break;
5693 case _cep_owner:
5695 ent->owner = (entity *) varlist[2]->ptrVal;
5696 break;
5698 case _cep_parent:
5700 ent->parent = (entity *) varlist[2]->ptrVal;
5701 break;
5703 case _cep_opponent:
5705 ent->opponent = (entity *) varlist[2]->ptrVal;
5706 break;
5708 case _cep_subentity:
5710 if(ent->subentity)
5711 ent->subentity->parent = NULL;
5712 ent->subentity = (entity *) varlist[2]->ptrVal;
5713 if(ent->subentity)
5714 ent->subentity->parent = ent;
5715 break;
5717 case _cep_aimove:
5719 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5720 ent->modeldata.aimove = (int) ltemp;
5721 break;
5723 case _cep_aggression:
5725 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5726 ent->modeldata.aggression = (int) ltemp;
5727 break;
5729 case _cep_aiattack:
5731 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5732 ent->modeldata.aiattack = (int) ltemp;
5733 break;
5735 case _cep_combostep:
5737 if(paramCount >= 4 && SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5738 (*pretvar)->lVal = (s32) 1;
5740 if((*pretvar)->lVal == (s32) 1) {
5741 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp2)))
5742 ent->combostep[(int) ltemp] = (int) ltemp2;
5743 else
5744 (*pretvar)->lVal = (s32) 0;
5746 break;
5748 case _cep_attacking:
5750 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5751 ent->attacking = (int) ltemp;
5752 (*pretvar)->lVal = (s32) 1;
5754 break;
5756 case _cep_scroll:
5758 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
5759 (*pretvar)->lVal = (s32) 1;
5760 ent->modeldata.scroll = (float) dbltemp;
5762 break;
5764 case _cep_autokill:
5766 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5767 ent->autokill = (int) ltemp;
5768 (*pretvar)->lVal = (s32) 1;
5770 break;
5772 case _cep_damage_on_landing:
5774 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5775 ent->damage_on_landing = (int) ltemp;
5776 break;
5778 case _cep_dead:
5780 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5781 ent->dead = (int) ltemp;
5782 break;
5784 case _cep_detect:
5786 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5787 ent->modeldata.stealth[1] = (int) ltemp;
5788 break;
5790 case _cep_stalltime:
5792 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5793 ent->stalltime = (int) ltemp;
5794 break;
5796 case _cep_stats:
5798 if(paramCount < 4)
5799 break;
5801 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp))) {
5802 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[4], &dbltemp))) {
5803 switch (varlist[2]->lVal) {
5804 default:
5805 ent->modeldata.stats[(int) ltemp] = (float) dbltemp;
5806 break;
5807 case 1:
5808 ent->stats[(int) ltemp] = (float) dbltemp;
5809 break;
5813 break;
5815 case _cep_attackid:
5817 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5818 ent->attack_id = (int) ltemp;
5819 break;
5821 case _cep_hitbyid:
5823 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5824 ent->hit_by_attack_id = (int) ltemp;
5825 break;
5827 case _cep_staydown:
5829 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5830 (*pretvar)->lVal = (s32) 1;
5831 ent->staydown[0] = (int) ltemp;
5833 if(paramCount >= 4 && (*pretvar)->lVal == (s32) 1) {
5834 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
5835 ent->staydown[1] = (int) ltemp;
5838 case _cep_stealth:
5840 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5841 ent->modeldata.stealth[0] = (int) ltemp;
5842 break;
5844 case _cep_gfxshadow:
5846 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5847 ent->modeldata.gfxshadow = (int) ltemp;
5848 break;
5850 case _cep_projectile:
5852 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5853 ent->projectile = (int) ltemp;
5854 break;
5856 case _cep_running:
5858 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
5859 (*pretvar)->lVal = (s32) 1;
5860 ent->modeldata.runspeed = (float) dbltemp;
5862 if(paramCount >= 4 && (*pretvar)->lVal == (s32) 1) {
5863 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[3], &dbltemp)))
5864 ent->modeldata.runjumpheight = (float) dbltemp;
5866 if(paramCount >= 5 && (*pretvar)->lVal == (s32) 1) {
5867 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[4], &dbltemp)))
5868 ent->modeldata.runjumpdist = (float) dbltemp;
5870 if(paramCount >= 6 && (*pretvar)->lVal == (s32) 1) {
5871 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[5], &dbltemp)))
5872 ent->modeldata.runhold = (int) dbltemp;
5874 if(paramCount >= 7 && (*pretvar)->lVal == (s32) 1) {
5875 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[6], &dbltemp)))
5876 ent->modeldata.runupdown = (int) dbltemp;
5879 break;
5881 case _cep_seal:
5883 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5884 ent->seal = (int) ltemp;
5885 break;
5887 case _cep_sealtime:
5889 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
5890 ent->sealtime = (int) ltemp;
5891 break;
5893 case _cep_dot:
5895 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5896 i = (int) ltemp;
5898 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[3], &dbltemp))) {
5899 (*pretvar)->lVal = (s32) 1;
5900 ent->dot_time[i] = (int) dbltemp;
5902 if(paramCount >= 5 && (*pretvar)->lVal == (s32) 1) {
5903 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[4], &dbltemp)))
5904 ent->dot[i] = (int) dbltemp;
5905 else
5906 (*pretvar)->lVal = (s32) 0;
5908 if(paramCount >= 6 && (*pretvar)->lVal == (s32) 1) {
5909 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[5], &dbltemp)))
5910 ent->dot_force[i] = (int) dbltemp;
5911 else
5912 (*pretvar)->lVal = (s32) 0;
5914 if(paramCount >= 7 && (*pretvar)->lVal == (s32) 1) {
5915 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[6], &dbltemp)))
5916 ent->dot_rate[i] = (int) dbltemp;
5917 else
5918 (*pretvar)->lVal = (s32) 0;
5920 if(paramCount >= 8 && (*pretvar)->lVal == (s32) 1) {
5921 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[7], &dbltemp)))
5922 ent->dot_atk[i] = (int) dbltemp;
5923 else
5924 (*pretvar)->lVal = (s32) 0;
5926 if(paramCount >= 9) {
5927 ent->dot_owner[i] = (entity *) varlist[8]->ptrVal;
5929 break;
5931 case _cep_edelay:
5933 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5934 (*pretvar)->lVal = (s32) 1;
5935 ent->modeldata.edelay.mode = (int) ltemp;
5937 if(paramCount >= 3 && (*pretvar)->lVal == (s32) 1) {
5938 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[4], &dbltemp)))
5939 ent->modeldata.edelay.factor = (float) dbltemp;
5941 if(paramCount >= 4 && (*pretvar)->lVal == (s32) 1) {
5942 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[4], &ltemp)))
5943 ent->modeldata.edelay.cap_min = (int) ltemp;
5944 else
5945 (*pretvar)->lVal = (s32) 0;
5947 if(paramCount >= 5 && (*pretvar)->lVal == (s32) 1) {
5948 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[5], &ltemp)))
5949 ent->modeldata.edelay.cap_max = (int) ltemp;
5950 else
5951 (*pretvar)->lVal = (s32) 0;
5953 if(paramCount >= 6 && (*pretvar)->lVal == (s32) 1) {
5954 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[6], &ltemp)))
5955 ent->modeldata.edelay.range_min = (int) ltemp;
5956 else
5957 (*pretvar)->lVal = (s32) 0;
5959 if(paramCount >= 7 && (*pretvar)->lVal == (s32) 1) {
5960 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[7], &ltemp)))
5961 ent->modeldata.edelay.range_max = (int) ltemp;
5962 else
5963 (*pretvar)->lVal = (s32) 0;
5965 break;
5967 case _cep_energycost:
5969 if(paramCount != 6) {
5970 printf
5971 ("\n Error, changeentityproperty({ent}, 'energycost', {animation}, {cost}, {mponly}, {disable}): Invalid or missing parameter. \n");
5972 goto changeentityproperty_error;
5975 (*pretvar)->lVal = (s32) 1;
5977 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
5978 i = (int) ltemp;
5981 if(!validanim(ent, i)) {
5982 printf
5983 ("\n Error, changeentityproperty({ent}, 'energycost', {animation}, {cost}, {mponly}, {disable}): {animation} parameter invalid. Make sure the animation exists. \n");
5984 goto changeentityproperty_error;
5987 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp))) {
5988 ent->modeldata.animation[i]->energycost[0] = (int) ltemp;
5991 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[4], &ltemp))) {
5992 ent->modeldata.animation[i]->energycost[1] = (int) ltemp;
5995 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[5], &ltemp))) {
5996 ent->modeldata.animation[i]->energycost[2] = (int) ltemp;
5999 break;
6001 case _cep_mpset:
6003 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
6004 (*pretvar)->lVal = (s32) 1;
6005 ent->modeldata.mp = (int) dbltemp;
6007 if(paramCount >= 4 && (*pretvar)->lVal == (s32) 1) {
6008 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[3], &dbltemp)))
6009 ent->modeldata.mpstable = (int) dbltemp;
6011 if(paramCount >= 5 && (*pretvar)->lVal == (s32) 1) {
6012 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[4], &dbltemp)))
6013 ent->modeldata.mpstableval = (int) dbltemp;
6015 if(paramCount >= 6 && (*pretvar)->lVal == (s32) 1) {
6016 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[5], &dbltemp)))
6017 ent->modeldata.mprate = (int) dbltemp;
6019 if(paramCount >= 7 && (*pretvar)->lVal == (s32) 1) {
6020 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[6], &dbltemp)))
6021 ent->modeldata.mpdroprate = (int) dbltemp;
6023 if(paramCount >= 8 && (*pretvar)->lVal == (s32) 1) {
6024 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[7], &dbltemp)))
6025 ent->modeldata.chargerate = (int) dbltemp;
6027 break;
6029 case _cep_blockback:
6031 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
6032 ent->modeldata.blockback = (int) ltemp;
6033 break;
6035 case _cep_blockpain:
6037 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
6038 ent->modeldata.blockpain = (int) ltemp;
6039 break;
6041 default:
6042 //printf("Property name '%s' is not supported by function changeentityproperty.\n", propname);
6043 goto changeentityproperty_error;
6044 break;
6047 return S_OK;
6048 changeentityproperty_error:
6049 *pretvar = NULL;
6050 return E_FAIL;
6053 //tossentity(entity, height, speedx, speedz)
6054 s32 openbor_tossentity(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6055 entity *ent = NULL;
6056 double height = 0, speedx = 0, speedz = 0;
6058 if(paramCount < 1) {
6059 *pretvar = NULL;
6060 return E_FAIL;
6063 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6064 (*pretvar)->lVal = (s32) 1;
6066 ent = (entity *) varlist[0]->ptrVal; //retrieve the entity
6067 if(!ent) {
6068 (*pretvar)->lVal = (s32) 0;
6070 return S_OK;
6073 if(paramCount >= 2) {
6074 if(FAILED(ScriptVariant_DecimalValue(varlist[1], &height))) {
6075 (*pretvar)->lVal = (s32) 0;
6076 return S_OK;
6079 if(paramCount >= 3) {
6080 if(FAILED(ScriptVariant_DecimalValue(varlist[2], &speedx))) {
6081 (*pretvar)->lVal = (s32) 0;
6082 return S_OK;
6085 if(paramCount >= 4) {
6086 if(FAILED(ScriptVariant_DecimalValue(varlist[3], &speedz))) {
6087 (*pretvar)->lVal = (s32) 0;
6088 return S_OK;
6091 ent->xdir = (float) speedx;
6092 ent->zdir = (float) speedz;
6093 toss(ent, (float) height);
6094 return S_OK;
6097 // ===== getplayerproperty =====
6098 enum getplayerproperty_enum {
6099 _gpp_credits,
6100 _gpp_ent,
6101 _gpp_entity,
6102 _gpp_keys,
6103 _gpp_lives,
6104 _gpp_name,
6105 _gpp_playkeys,
6106 _gpp_score,
6107 _gpp_weaponum,
6108 _gpp_the_end,
6111 void mapstrings_getplayerproperty(ScriptVariant ** varlist, int paramCount) {
6112 char *propname;
6113 int prop;
6115 static const char *proplist[] = {
6116 "credits",
6117 "ent",
6118 "entity",
6119 "keys",
6120 "lives",
6121 "name",
6122 "playkeys",
6123 "score",
6124 "weaponum"
6127 if(paramCount < 2)
6128 return;
6130 // property name
6131 MAPSTRINGS(varlist[1], proplist, _gpp_the_end,
6132 "Property name '%s' is not supported by function getplayerproperty.\n");
6135 //getplayerproperty(index, propname);
6136 s32 openbor_getplayerproperty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6137 s32 ltemp;
6138 int index;
6139 entity *ent = NULL;
6140 int prop = -1;
6141 ScriptVariant *arg = NULL;
6143 if(paramCount < 2) {
6144 *pretvar = NULL;
6145 return E_FAIL;
6148 mapstrings_getplayerproperty(varlist, paramCount);
6149 ScriptVariant_Clear(*pretvar);
6151 arg = varlist[0];
6152 if(FAILED(ScriptVariant_IntegerValue(arg, &ltemp))) {
6153 index = 0;
6154 } else
6155 index = (int) ltemp;
6156 if(!(ent = player[index].ent)) //this player is not selected, so just return
6158 return S_OK; //return S_OK, to tell the engine it is not a FATAL error
6161 arg = varlist[1];
6162 if(arg->vt != VT_INTEGER) {
6163 if(arg->vt != VT_STR)
6164 printf
6165 ("Function call getplayerproperty has invalid propery name parameter, it must be a string value.\n");
6166 *pretvar = NULL;
6167 return E_FAIL;
6169 prop = arg->lVal;
6171 //change the model
6172 switch (prop) {
6173 case _gpp_ent:
6174 case _gpp_entity:
6176 ScriptVariant_ChangeType(*pretvar, VT_PTR);
6177 (*pretvar)->ptrVal = (void*) ent;
6178 break;
6180 case _gpp_name:
6182 ScriptVariant_ChangeType(*pretvar, VT_STR);
6183 strncpy(StrCache_Get((*pretvar)->strVal), (char *) player[index].name, MAX_STR_VAR_LEN);
6184 break;
6186 case _gpp_score:
6188 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6189 (*pretvar)->lVal = (s32) player[index].score;
6190 break;
6192 case _gpp_lives:
6194 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6195 (*pretvar)->lVal = (s32) player[index].lives;
6196 break;
6198 case _gpp_playkeys:
6200 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6201 (*pretvar)->lVal = (s32) player[index].playkeys;
6202 break;
6204 case _gpp_keys:
6206 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6207 (*pretvar)->lVal = (s32) player[index].keys;
6208 break;
6210 case _gpp_credits:
6212 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6213 if(noshare)
6214 (*pretvar)->lVal = (s32) player[index].credits;
6215 else
6216 (*pretvar)->lVal = credits;
6217 break;
6219 case _gpp_weaponum:
6221 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6222 (*pretvar)->lVal = (s32) player[index].weapnum;
6223 break;
6225 //this property is not known
6226 //default:{
6227 // .....
6230 return S_OK;
6233 // ===== changeplayerproperty =====
6234 enum changeplayerproperty_enum {
6235 _cpp_credits,
6236 _cpp_lives,
6237 _cpp_name,
6238 _cpp_playkeys,
6239 _cpp_score,
6240 _cpp_weapon,
6241 _cpp_the_end,
6244 void mapstrings_changeplayerproperty(ScriptVariant ** varlist, int paramCount) {
6245 char *propname;
6246 int prop;
6248 static const char *proplist[] = {
6249 "credits",
6250 "lives",
6251 "name",
6252 "playkeys",
6253 "score",
6254 "weapon",
6257 if(paramCount < 3)
6258 return;
6260 // property name
6261 MAPSTRINGS(varlist[1], proplist, _cpp_the_end,
6262 "Property name '%s' is not supported by function changeplayerproperty.\n");
6265 //changeplayerproperty(index, propname, value[, value2, value3,...]);
6266 s32 openbor_changeplayerproperty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6267 s32 ltemp, ltemp2;
6268 int index;
6269 entity *ent = NULL;
6270 int prop = -1;
6271 char *tempstr = NULL;
6272 ScriptVariant *arg = NULL;
6274 if(paramCount < 3) {
6275 *pretvar = NULL;
6276 return E_FAIL;
6279 mapstrings_changeplayerproperty(varlist, paramCount);
6280 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6281 (*pretvar)->lVal = (s32) 1;
6282 arg = varlist[0];
6283 if(FAILED(ScriptVariant_IntegerValue(arg, &ltemp))) {
6284 index = 0;
6285 } else
6286 index = (int) ltemp;
6288 if(!(ent = player[index].ent)) //this player is not selected, so just return
6290 return S_OK; //return S_OK, to tell the engine it is not a FATAL error
6293 if(varlist[1]->vt != VT_INTEGER) {
6294 if(varlist[1]->vt != VT_STR)
6295 printf("You must give a string value for player property name.\n");
6296 return E_FAIL;
6298 prop = varlist[1]->lVal;
6300 arg = varlist[2];
6302 //change the model
6303 switch (prop) {
6304 case _cpp_weapon:
6306 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp))) {
6307 if(paramCount > 3) {
6308 arg = varlist[3];
6309 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp2)))
6310 (*pretvar)->lVal = (s32) 1;
6311 } else {
6312 ltemp2 = (s32) 0;
6313 (*pretvar)->lVal = (s32) 1;
6315 set_weapon(player[index].ent, (int) ltemp, (int) ltemp2);
6316 (*pretvar)->lVal = (s32) 1;
6317 } else
6318 (*pretvar)->lVal = (s32) 0;
6319 break;
6321 case _cpp_name:
6323 if(arg->vt != VT_STR) {
6324 //printf();
6325 return E_FAIL;
6327 tempstr = (char *) StrCache_Get(arg->strVal);
6328 strcpy(player[index].name, tempstr);
6329 (*pretvar)->lVal = (s32) 1;
6330 break;
6332 case _cpp_score:
6334 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp))) {
6335 if(ltemp < 0)
6336 ltemp = 0;
6337 else if(ltemp > 999999999)
6338 ltemp = 999999999;
6339 player[index].score = (unsigned int) ltemp;
6340 } else
6341 (*pretvar)->lVal = (s32) 0;
6342 break;
6344 case _cpp_lives:
6346 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
6347 player[index].lives = (int) ltemp;
6348 else
6349 (*pretvar)->lVal = (s32) 0;
6350 break;
6352 case _cpp_playkeys:
6354 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
6355 player[index].playkeys = (int) ltemp;
6356 else
6357 (*pretvar)->lVal = (s32) 0;
6358 break;
6360 case _cpp_credits:
6362 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp))) {
6363 if(noshare)
6364 player[index].credits = (int) ltemp;
6365 else
6366 credits = (int) ltemp;
6367 } else
6368 (*pretvar)->lVal = (s32) 0;
6369 break;
6371 //this property is not known, so return 0
6372 //default:
6373 // (*pretvar)->lVal = (s32)0;
6376 return S_OK;
6379 //checkhole(x,z), return 1 if there's hole here
6380 s32 openbor_checkhole(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6381 ScriptVariant *arg = NULL;
6382 double x, z;
6384 if(paramCount < 2) {
6385 *pretvar = NULL;
6386 return E_FAIL;
6389 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6390 (*pretvar)->lVal = (s32) 0;
6392 arg = varlist[0];
6393 if(FAILED(ScriptVariant_DecimalValue(arg, &x)))
6394 return S_OK;
6396 arg = varlist[1];
6397 if(FAILED(ScriptVariant_DecimalValue(arg, &z)))
6398 return S_OK;
6400 (*pretvar)->lVal = (s32) (checkhole((float) x, (float) z) && checkwall((float) x, (float) z) < 0);
6401 return S_OK;
6404 //checkwall(x,z), return wall height, or 0
6405 s32 openbor_checkwall(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6406 ScriptVariant *arg = NULL;
6407 double x, z;
6408 int wall;
6410 if(paramCount < 2) {
6411 *pretvar = NULL;
6412 return E_FAIL;
6415 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
6416 (*pretvar)->dblVal = (double) 0;
6418 arg = varlist[0];
6419 if(FAILED(ScriptVariant_DecimalValue(arg, &x)))
6420 return S_OK;
6422 arg = varlist[1];
6423 if(FAILED(ScriptVariant_DecimalValue(arg, &z)))
6424 return S_OK;
6426 if((wall = checkwall_below((float) x, (float) z, 100000)) >= 0) {
6427 (*pretvar)->dblVal = (double) level->walls[wall].alt;
6429 return S_OK;
6432 //checkplatformbelow(x,z,a), return the highest platfrom entity below
6433 s32 openbor_checkplatformbelow(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6434 ScriptVariant *arg = NULL;
6435 double x, z, a;
6437 if(paramCount < 3) {
6438 *pretvar = NULL;
6439 return E_FAIL;
6442 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
6443 (*pretvar)->dblVal = (double) 0;
6445 arg = varlist[0];
6446 if(FAILED(ScriptVariant_DecimalValue(arg, &x)))
6447 return S_OK;
6449 arg = varlist[1];
6450 if(FAILED(ScriptVariant_DecimalValue(arg, &z)))
6451 return S_OK;
6453 arg = varlist[2];
6454 if(FAILED(ScriptVariant_DecimalValue(arg, &a)))
6455 return S_OK;
6457 ScriptVariant_ChangeType(*pretvar, VT_PTR);
6458 (*pretvar)->ptrVal = (void*) check_platform_below((float) x, (float) z, (float) a);
6459 return S_OK;
6462 s32 openbor_openfilestream(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6463 char *filename = NULL;
6464 ScriptVariant *arg = NULL;
6465 s32 location = 0;
6467 int disCcWarns;
6468 FILE *handle = NULL;
6469 char path[128] = { "" };
6470 long size;
6472 if(paramCount < 1) {
6473 *pretvar = NULL;
6474 return E_FAIL;
6477 ScriptVariant_Clear(*pretvar);
6479 arg = varlist[0];
6480 if(arg->vt != VT_STR) {
6481 printf("Filename for openfilestream must be a string.\n");
6482 *pretvar = NULL;
6483 return E_FAIL;
6486 filename = (char *) StrCache_Get(arg->strVal);
6488 if(paramCount > 1) {
6489 arg = varlist[1];
6490 if(FAILED(ScriptVariant_IntegerValue(arg, &location)))
6491 return S_OK;
6494 if(!level->numfilestreams)
6495 level->numfilestreams = 0;
6496 else if(level->numfilestreams == LEVEL_MAX_FILESTREAMS) {
6497 printf("Maximum file streams exceeded.\n");
6498 *pretvar = NULL;
6499 return E_FAIL;
6501 // Load file from saves directory if specified
6502 if(location) {
6503 getBasePath(path, "Saves", 0);
6504 strcat(path, "/");
6505 strcat(path, filename);
6506 #ifndef DC
6507 if(!(fileExists(path))) {
6508 printf("Openfilestream - file specified does not exist.\n");
6509 return E_FAIL;
6511 #endif
6512 handle = fopen(path, "rb");
6513 if(handle == NULL)
6514 return E_FAIL;
6515 fseek(handle, 0, SEEK_END);
6516 size = ftell(handle);
6517 rewind(handle);
6518 level->filestreams[level->numfilestreams].buf = (char *) malloc(sizeof(char) * size);
6519 if(level->filestreams[level->numfilestreams].buf == NULL)
6520 return E_FAIL;
6521 disCcWarns = fread(level->filestreams[level->numfilestreams].buf, 1, size, handle);
6522 } else
6523 if(buffer_pakfile
6524 (filename, &level->filestreams[level->numfilestreams].buf,
6525 &level->filestreams[level->numfilestreams].size) != 1) {
6526 printf("Invalid filename used in openfilestream.\n");
6527 *pretvar = NULL;
6528 return E_FAIL;
6531 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6532 (*pretvar)->lVal = (s32) level->numfilestreams;
6534 level->filestreams[level->numfilestreams].pos = 0;
6535 level->numfilestreams++;
6536 return S_OK;
6539 s32 openbor_getfilestreamline(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6540 char line[MAX_STR_VAR_LEN];
6541 int length;
6542 ScriptVariant *arg = NULL;
6543 s32 filestreamindex;
6545 if(paramCount < 1) {
6546 *pretvar = NULL;
6547 return E_FAIL;
6550 arg = varlist[0];
6551 if(FAILED(ScriptVariant_IntegerValue(arg, &filestreamindex)))
6552 return S_OK;
6554 ScriptVariant_Clear(*pretvar);
6555 ScriptVariant_ChangeType(*pretvar, VT_STR);
6557 length = 0;
6558 strncpy(line, "it's initialized now", MAX_STR_VAR_LEN);
6560 while(level->filestreams[filestreamindex].buf[level->filestreams[filestreamindex].pos + length]
6561 && level->filestreams[filestreamindex].buf[level->filestreams[filestreamindex].pos + length] != '\n'
6562 && level->filestreams[filestreamindex].buf[level->filestreams[filestreamindex].pos + length] != '\r')
6563 ++length;
6564 if(length >= MAX_STR_VAR_LEN)
6565 strncpy(StrCache_Get((*pretvar)->strVal),
6566 (char *) (level->filestreams[filestreamindex].buf + level->filestreams[filestreamindex].pos),
6567 MAX_STR_VAR_LEN);
6568 else {
6569 strncpy(line,
6570 (char *) (level->filestreams[filestreamindex].buf + level->filestreams[filestreamindex].pos),
6571 length);
6572 line[length] = '\0';
6573 strncpy(StrCache_Get((*pretvar)->strVal), line, MAX_STR_VAR_LEN);
6575 return S_OK;
6578 s32 openbor_getfilestreamargument(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6579 ScriptVariant *arg = NULL;
6580 s32 filestreamindex, argument;
6581 char *argtype = NULL;
6583 if(paramCount < 3) {
6584 *pretvar = NULL;
6585 return E_FAIL;
6588 arg = varlist[0];
6589 if(FAILED(ScriptVariant_IntegerValue(arg, &filestreamindex)))
6590 return S_OK;
6592 arg = varlist[1];
6593 if(FAILED(ScriptVariant_IntegerValue(arg, &argument)))
6594 return S_OK;
6595 ScriptVariant_Clear(*pretvar);
6597 if(varlist[2]->vt != VT_STR) {
6598 printf
6599 ("You must give a string value specifying what kind of value you want the argument converted to.\n");
6600 return E_FAIL;
6602 argtype = (char *) StrCache_Get(varlist[2]->strVal);
6604 if(stricmp(argtype, "string") == 0) {
6605 ScriptVariant_ChangeType(*pretvar, VT_STR);
6606 strncpy(StrCache_Get((*pretvar)->strVal),
6607 (char *) findarg(level->filestreams[filestreamindex].buf +
6608 level->filestreams[filestreamindex].pos, argument), MAX_STR_VAR_LEN);
6609 } else if(stricmp(argtype, "int") == 0) {
6610 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6611 (*pretvar)->lVal =
6612 (s32)
6613 atoi(findarg
6614 (level->filestreams[filestreamindex].buf + level->filestreams[filestreamindex].pos, argument));
6615 } else if(stricmp(argtype, "float") == 0) {
6616 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
6617 (*pretvar)->dblVal =
6618 (double)
6619 atof(findarg
6620 (level->filestreams[filestreamindex].buf + level->filestreams[filestreamindex].pos, argument));
6621 } else {
6622 printf("Invalid type for argument converted to (getfilestreamargument).\n");
6623 return E_FAIL;
6626 return S_OK;
6629 s32 openbor_filestreamnextline(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6630 ScriptVariant *arg = NULL;
6631 s32 filestreamindex;
6633 if(paramCount < 1) {
6634 *pretvar = NULL;
6635 return E_FAIL;
6638 arg = varlist[0];
6639 if(FAILED(ScriptVariant_IntegerValue(arg, &filestreamindex)))
6640 return S_OK;
6641 while(level->filestreams[filestreamindex].buf[level->filestreams[filestreamindex].pos]
6642 && level->filestreams[filestreamindex].buf[level->filestreams[filestreamindex].pos] != '\n'
6643 && level->filestreams[filestreamindex].buf[level->filestreams[filestreamindex].pos] != '\r')
6644 ++level->filestreams[filestreamindex].pos;
6645 while(level->filestreams[filestreamindex].buf[level->filestreams[filestreamindex].pos] == '\n'
6646 || level->filestreams[filestreamindex].buf[level->filestreams[filestreamindex].pos] == '\r')
6647 ++level->filestreams[filestreamindex].pos;
6649 return S_OK;
6652 s32 openbor_getfilestreamposition(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6653 ScriptVariant *arg = NULL;
6654 s32 filestreamindex;
6656 if(paramCount < 1) {
6657 *pretvar = NULL;
6658 return E_FAIL;
6661 arg = varlist[0];
6662 if(FAILED(ScriptVariant_IntegerValue(arg, &filestreamindex)))
6663 return S_OK;
6665 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6666 (*pretvar)->lVal = (s32) level->filestreams[filestreamindex].pos;
6667 return S_OK;
6670 s32 openbor_setfilestreamposition(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6671 ScriptVariant *arg = NULL;
6672 s32 filestreamindex, position;
6675 if(paramCount < 2) {
6676 *pretvar = NULL;
6677 return E_FAIL;
6680 arg = varlist[0];
6681 if(FAILED(ScriptVariant_IntegerValue(arg, &filestreamindex)))
6682 return S_OK;
6684 arg = varlist[1];
6685 if(FAILED(ScriptVariant_IntegerValue(arg, &position)))
6686 return S_OK;
6688 level->filestreams[filestreamindex].pos = position;
6689 return S_OK;
6692 s32 openbor_filestreamappend(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6693 s32 filestreamindex;
6694 ScriptVariant *arg = NULL;
6695 s32 appendtype;
6696 s32 ltemp;
6697 double dbltemp;
6698 char *temp;
6699 char append[MAX_STR_VAR_LEN];
6702 if(paramCount < 3) {
6703 *pretvar = NULL;
6704 return E_FAIL;
6707 ScriptVariant_Clear(*pretvar);
6709 arg = varlist[0];
6710 if(FAILED(ScriptVariant_IntegerValue(arg, &filestreamindex)))
6711 return S_OK;
6713 arg = varlist[1];
6714 if(arg->vt == VT_STR) {
6715 strcpy(append, StrCache_Get(arg->strVal));
6716 } else if(arg->vt == VT_INTEGER) {
6717 if(FAILED(ScriptVariant_IntegerValue(arg, &ltemp)))
6718 return S_OK;
6719 sprintf(append, "%d", (int) ltemp);
6720 } else if(arg->vt == VT_DECIMAL) {
6721 if(FAILED(ScriptVariant_DecimalValue(arg, &dbltemp)))
6722 return S_OK;
6723 sprintf(append, "%f", dbltemp);
6724 } else {
6725 printf("Filename for filestreamappend must be a string.\n");
6726 *pretvar = NULL;
6727 return E_FAIL;
6732 arg = varlist[2];
6733 if(FAILED(ScriptVariant_IntegerValue(arg, &appendtype)))
6734 return S_OK;
6736 temp = (char *) malloc(sizeof(char) * (strlen(level->filestreams[filestreamindex].buf) + strlen(append) + 4));
6737 strcpy(temp, level->filestreams[filestreamindex].buf);
6739 if(appendtype == 0) {
6740 strcat(temp, "\r\n");
6741 strcat(temp, append);
6742 temp[strlen(level->filestreams[filestreamindex].buf) + strlen(append) + 2] = ' ';
6743 temp[strlen(level->filestreams[filestreamindex].buf) + strlen(append) + 3] = '\0';
6744 } else if(appendtype == 1) {
6745 strcat(temp, append);
6746 temp[strlen(level->filestreams[filestreamindex].buf) + strlen(append)] = ' ';
6747 temp[strlen(level->filestreams[filestreamindex].buf) + strlen(append) + 1] = '\0';
6749 free(level->filestreams[filestreamindex].buf);
6750 level->filestreams[filestreamindex].buf = temp;
6752 return S_OK;
6755 s32 openbor_createfilestream(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6756 ScriptVariant_Clear(*pretvar);
6758 if(!level->numfilestreams)
6759 level->numfilestreams = 0;
6760 else if(level->numfilestreams == LEVEL_MAX_FILESTREAMS) {
6761 printf("Maximum file streams exceeded.\n");
6762 *pretvar = NULL;
6763 return E_FAIL;
6766 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6767 (*pretvar)->lVal = (s32) level->numfilestreams;
6769 // Initialize the new filestream
6770 level->filestreams[level->numfilestreams].pos = 0;
6771 level->filestreams[level->numfilestreams].buf = (char *) malloc(sizeof(char) * 128);
6772 level->filestreams[level->numfilestreams].buf[0] = '\0';
6773 level->numfilestreams++;
6774 return S_OK;
6777 s32 openbor_savefilestream(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6778 int i, x, y;
6779 s32 filestreamindex;
6780 ScriptVariant *arg = NULL;
6781 int disCcWarns;
6782 FILE *handle = NULL;
6783 char path[128] = { "" };
6784 char tmpname[128] = { "" };
6785 char mod[256] = { "" };
6787 if(paramCount < 1) {
6788 *pretvar = NULL;
6789 return E_FAIL;
6792 ScriptVariant_Clear(*pretvar);
6794 arg = varlist[0];
6795 if(FAILED(ScriptVariant_IntegerValue(arg, &filestreamindex)))
6796 return S_OK;
6798 arg = varlist[1];
6799 if(arg->vt != VT_STR) {
6800 printf("Filename for savefilestream must be a string.\n");
6801 *pretvar = NULL;
6802 return E_FAIL;
6804 // Get the saves directory
6805 getBasePath(path, "Saves/", 0);
6807 // get the packfile's name by chopping off the rest of the path
6808 strncpy(mod, packfile, strlen(packfile) - 4);
6809 x = 0;
6810 for(i = 0; i < (int) strlen(mod); i++) {
6811 if((mod[i] == '/') || (mod[i] == '\\'))
6812 x = i;
6814 y = 0;
6815 for(i = 0; i < (int) strlen(mod); i++) {
6816 // For packfiles without '/'
6817 if(x == 0) {
6818 tmpname[y] = mod[i];
6819 y++;
6821 // For packfiles with '/'
6822 if(x != 0 && i > x) {
6823 tmpname[y] = mod[i];
6824 y++;
6828 // Make ./Saves/PAKNAME if it doesn't exist
6829 strcat(path, tmpname);
6830 #ifndef DC
6831 dirExists(path, 1);
6832 #endif
6834 // Add user's filename to path and write the filestream to it
6835 strcat(path, "/");
6836 strcat(path, (char *) StrCache_Get(arg->strVal));
6837 handle = fopen(path, "wb");
6838 if(handle == NULL)
6839 return E_FAIL;
6840 disCcWarns =
6841 fwrite(level->filestreams[filestreamindex].buf, 1, strlen(level->filestreams[filestreamindex].buf), handle);
6843 // add blank line so it can be read successfully
6844 fwrite("\r\n", 1, 2, handle);
6845 fclose(handle);
6847 return S_OK;
6850 //damageentity(entity, other, force, drop, type)
6851 s32 openbor_damageentity(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6852 entity *ent = NULL;
6853 entity *other = NULL;
6854 entity *temp = NULL;
6855 s32 force, drop, type;
6856 s_attack attack;
6858 if(paramCount < 1) {
6859 *pretvar = NULL;
6860 return E_FAIL;
6863 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6864 (*pretvar)->lVal = (s32) 0;
6866 ent = (entity *) (varlist[0])->ptrVal; //retrieve the entity
6867 if(!ent)
6868 return S_OK;
6870 other = ent;
6871 force = (s32) 1;
6872 drop = (s32) 0;
6873 type = (s32) ATK_NORMAL;
6875 if(paramCount >= 2) {
6876 other = (entity *) (varlist[1])->ptrVal;
6877 if(!other)
6878 return S_OK;
6880 if(paramCount >= 3) {
6881 if(FAILED(ScriptVariant_IntegerValue((varlist[2]), &force)))
6882 return S_OK;
6885 if(!ent->takedamage) {
6886 ent->health -= force;
6887 if(ent->health <= 0)
6888 kill(ent);
6889 (*pretvar)->lVal = (s32) 1;
6890 return S_OK;
6893 if(paramCount >= 4) {
6894 if(FAILED(ScriptVariant_IntegerValue((varlist[3]), &drop)))
6895 return S_OK;
6897 if(paramCount >= 5) {
6898 if(FAILED(ScriptVariant_IntegerValue((varlist[4]), &type)))
6899 return S_OK;
6902 temp = self;
6903 self = ent;
6904 attack = emptyattack;
6905 attack.attack_force = force;
6906 attack.attack_drop = drop;
6907 if(drop) {
6908 attack.dropv[0] = (float) 3;
6909 attack.dropv[1] = (float) 1.2;
6910 attack.dropv[2] = (float) 0;
6912 attack.attack_type = type;
6913 self->takedamage(other, &attack);
6914 self = temp;
6915 return S_OK;
6918 //killentity(entity)
6919 s32 openbor_killentity(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6920 entity *ent = NULL;
6922 if(paramCount < 1) {
6923 *pretvar = NULL;
6924 return E_FAIL;
6927 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6929 ent = (entity *) (varlist[0])->ptrVal; //retrieve the entity
6930 if(!ent) {
6931 (*pretvar)->lVal = (s32) 0;
6932 return S_OK;
6934 kill(ent);
6935 (*pretvar)->lVal = (s32) 1;
6936 return S_OK;
6939 //findtarget(entity, int animation);
6940 s32 openbor_findtarget(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6941 entity *ent = NULL;
6942 entity *tempself, *target;
6943 s32 anim = -1;
6945 if(paramCount < 1) {
6946 *pretvar = NULL;
6947 return E_FAIL;
6950 ScriptVariant_ChangeType(*pretvar, VT_PTR);
6952 ent = (entity *) (varlist[0])->ptrVal; //retrieve the entity
6953 if(!ent) {
6954 ScriptVariant_Clear(*pretvar);
6955 return S_OK;
6957 if(paramCount > 1 && FAILED(ScriptVariant_IntegerValue(varlist[1], &anim)))
6958 return E_FAIL;
6959 tempself = self;
6960 self = ent;
6961 target = normal_find_target((int) anim);
6962 if(!target)
6963 ScriptVariant_Clear(*pretvar);
6964 else
6965 (*pretvar)->ptrVal = (void*) target;
6966 self = tempself;
6967 return S_OK;
6970 //checkrange(entity, target, int ani);
6971 s32 openbor_checkrange(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
6972 entity *ent = NULL, *target = NULL;
6973 s32 ani = 0;
6975 if(paramCount < 2)
6976 goto checkrange_error;
6978 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
6980 if(varlist[0]->vt != VT_PTR || varlist[1]->vt != VT_PTR)
6981 goto checkrange_error;
6983 ent = (entity *) (varlist[0])->ptrVal; //retrieve the entity
6984 target = (entity *) (varlist[1])->ptrVal; //retrieve the target
6986 if(!ent || !target)
6987 goto checkrange_error;
6989 if(paramCount > 2 && FAILED(ScriptVariant_IntegerValue(varlist[2], &ani)))
6990 goto checkrange_error;
6991 else if(paramCount <= 2)
6992 ani = ent->animnum;
6994 if(ani < 0 || ani >= dyn_anim_custom_maxvalues.max_animations) {
6995 printf("Animation id out of range: %d / %d.\n", (int) ani, dyn_anim_custom_maxvalues.max_animations);
6996 goto checkrange_error;
6999 (*pretvar)->lVal = check_range(ent, target, ani);
7001 return S_OK;
7003 checkrange_error:
7004 printf
7005 ("Function needs at least 2 valid entity handles, the third parameter is optional: checkrange(entity, target, int animnum)\n");
7006 *pretvar = NULL;
7007 return E_FAIL;
7010 //clearspawnentry();
7011 s32 openbor_clearspawnentry(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
7012 *pretvar = NULL;
7013 memset(&spawnentry, 0, sizeof(s_spawn_entry));
7014 spawnentry.index = spawnentry.itemindex = spawnentry.weaponindex = -1;
7015 return S_OK;
7018 // ===== setspawnentry =====
7019 enum setspawnentry_enum {
7020 _sse_2phealth,
7021 _sse_2pitem,
7022 _sse_3phealth,
7023 _sse_3pitem,
7024 _sse_4phealth,
7025 _sse_4pitem,
7026 _sse_aggression,
7027 _sse_alias,
7028 _sse_alpha,
7029 _sse_boss,
7030 _sse_coords,
7031 _sse_credit,
7032 _sse_dying,
7033 _sse_flip,
7034 _sse_health,
7035 _sse_item,
7036 _sse_itemalias,
7037 _sse_itemhealth,
7038 _sse_itemmap,
7039 _sse_map,
7040 _sse_mp,
7041 _sse_multiple,
7042 _sse_name,
7043 _sse_nolife,
7044 _sse_weapon,
7045 _sse_the_end,
7048 void mapstrings_setspawnentry(ScriptVariant ** varlist, int paramCount) {
7049 char *propname;
7050 int prop;
7051 static const char *proplist[] = {
7052 "2phealth",
7053 "2pitem",
7054 "3phealth",
7055 "3pitem",
7056 "4phealth",
7057 "4pitem",
7058 "aggression",
7059 "alias",
7060 "alpha",
7061 "boss",
7062 "coords",
7063 "credit",
7064 "dying",
7065 "flip",
7066 "health",
7067 "item",
7068 "itemalias",
7069 "itemhealth",
7070 "itemmap",
7071 "map",
7072 "mp",
7073 "multiple",
7074 "name",
7075 "nolife",
7076 "weapon",
7079 MAPSTRINGS(varlist[0], proplist, _sse_the_end, "Property name '%s' is not supported by setspawnentry.\n");
7082 //setspawnentry(propname, value1[, value2, value3, ...]);
7083 s32 openbor_setspawnentry(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
7084 s32 ltemp;
7085 s_model *tempmodel;
7086 double dbltemp;
7087 int temp, prop;
7088 ScriptVariant *arg = NULL;
7090 if(paramCount < 2) {
7091 *pretvar = NULL;
7092 return E_FAIL;
7095 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
7096 (*pretvar)->lVal = (s32) 1;
7098 mapstrings_setspawnentry(varlist, paramCount);
7099 if(varlist[0]->vt != VT_INTEGER) {
7100 if(varlist[0]->vt != VT_STR)
7101 printf("You must give a string value for spawn entry property name.\n");
7102 *pretvar = NULL;
7103 return E_FAIL;
7106 prop = varlist[0]->lVal;
7108 arg = varlist[1];
7110 switch (prop) {
7111 case _sse_name:
7112 if(arg->vt != VT_STR) {
7113 printf
7114 ("You must use a string value for spawn entry's name property: function setspawnentry.\n");
7115 goto setspawnentry_error;
7117 spawnentry.model = findmodel((char *) StrCache_Get(arg->strVal));
7118 break;
7119 case _sse_alias:
7120 if(arg->vt != VT_STR)
7121 goto setspawnentry_error;
7122 strcpy(spawnentry.alias, (char *) StrCache_Get(arg->strVal));
7123 break;
7124 case _sse_item:
7125 if(arg->vt != VT_STR)
7126 goto setspawnentry_error;
7127 spawnentry.itemmodel = findmodel((char *) StrCache_Get(arg->strVal));
7128 spawnentry.item = spawnentry.itemmodel->name;
7129 spawnentry.itemindex = get_cached_model_index(spawnentry.item);
7130 spawnentry.itemplayer_count = 0;
7131 break;
7132 case _sse_2pitem:
7133 if(arg->vt != VT_STR)
7134 goto setspawnentry_error;
7135 tempmodel = findmodel((char *) StrCache_Get(arg->strVal));
7136 if(!tempmodel)
7137 spawnentry.item = NULL;
7138 else
7139 spawnentry.item = tempmodel->name;
7140 spawnentry.itemplayer_count = 1;
7141 break;
7142 case _sse_3pitem:
7143 if(arg->vt != VT_STR)
7144 goto setspawnentry_error;
7145 spawnentry.itemmodel = findmodel((char *) StrCache_Get(arg->strVal));
7146 spawnentry.itemplayer_count = 2;
7147 break;
7148 case _sse_4pitem:
7149 if(arg->vt != VT_STR)
7150 goto setspawnentry_error;
7151 spawnentry.itemmodel = findmodel((char *) StrCache_Get(arg->strVal));
7152 spawnentry.itemplayer_count = 3;
7153 break;
7154 case _sse_health:
7155 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7156 spawnentry.health[0] = (int) ltemp;
7157 else
7158 (*pretvar)->lVal = (s32) 0;
7159 break;
7160 case _sse_itemhealth:
7161 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7162 spawnentry.itemhealth = (int) ltemp;
7163 else
7164 (*pretvar)->lVal = (s32) 0;
7165 break;
7166 case _sse_itemalias:
7167 if(arg->vt != VT_STR)
7168 return E_FAIL;
7169 strcpy(spawnentry.itemalias, (char *) StrCache_Get(arg->strVal));
7170 break;
7171 case _sse_2phealth:
7172 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7173 spawnentry.health[1] = (int) ltemp;
7174 else
7175 (*pretvar)->lVal = (s32) 0;
7176 break;
7177 case _sse_3phealth:
7178 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7179 spawnentry.health[2] = (int) ltemp;
7180 else
7181 (*pretvar)->lVal = (s32) 0;
7182 break;
7183 case _sse_4phealth:
7184 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7185 spawnentry.health[3] = (int) ltemp;
7186 else
7187 (*pretvar)->lVal = (s32) 0;
7188 break;
7189 case _sse_coords:
7190 temp = 1;
7191 if(SUCCEEDED(ScriptVariant_DecimalValue(arg, &dbltemp)))
7192 spawnentry.x = (float) dbltemp;
7193 else
7194 temp = 0;
7195 if(paramCount >= 3 && temp) {
7196 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp)))
7197 spawnentry.z = (float) dbltemp;
7198 else
7199 temp = 0;
7201 if(paramCount >= 4 && temp) {
7202 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[3], &dbltemp)))
7203 spawnentry.a = (float) dbltemp;
7204 else
7205 temp = 0;
7207 (*pretvar)->lVal = (s32) temp;
7208 break;
7209 case _sse_mp:
7210 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7211 spawnentry.mp = (int) ltemp;
7212 else
7213 (*pretvar)->lVal = (s32) 0;
7214 break;
7215 case _sse_map:
7216 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7217 spawnentry.colourmap = (int) ltemp;
7218 else
7219 (*pretvar)->lVal = (s32) 0;
7220 break;
7221 case _sse_itemmap:
7222 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7223 spawnentry.itemmap = (int) ltemp;
7224 else
7225 (*pretvar)->lVal = (s32) 0;
7226 break;
7227 case _sse_alpha:
7228 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7229 spawnentry.alpha = (int) ltemp;
7230 else
7231 (*pretvar)->lVal = (s32) 0;
7232 break;
7233 case _sse_multiple:
7234 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7235 spawnentry.multiple = (int) ltemp;
7236 else
7237 (*pretvar)->lVal = (s32) 0;
7238 break;
7239 case _sse_dying:
7240 temp = 1;
7241 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7242 spawnentry.dying = (int) ltemp;
7243 else
7244 temp = 0;
7245 if(paramCount >= 3 && temp) {
7246 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp)))
7247 spawnentry.per1 = (int) ltemp;
7248 else
7249 temp = 0;
7251 if(paramCount >= 4 && temp) {
7252 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp)))
7253 spawnentry.per2 = (int) ltemp;
7254 else
7255 temp = 0;
7257 (*pretvar)->lVal = (s32) temp;
7258 break;
7259 case _sse_nolife:
7260 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7261 spawnentry.nolife = (int) ltemp;
7262 else
7263 (*pretvar)->lVal = (s32) 0;
7264 break;
7265 case _sse_boss:
7266 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7267 spawnentry.boss = (int) ltemp;
7268 else
7269 (*pretvar)->lVal = (s32) 0;
7270 break;
7271 case _sse_flip:
7272 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7273 spawnentry.flip = (int) ltemp;
7274 else
7275 (*pretvar)->lVal = (s32) 0;
7276 break;
7277 case _sse_credit:
7278 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7279 spawnentry.credit = (int) ltemp;
7280 else
7281 (*pretvar)->lVal = (s32) 0;
7282 break;
7283 case _sse_aggression:
7284 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
7285 spawnentry.aggression = (int) ltemp;
7286 else
7287 (*pretvar)->lVal = (s32) 0;
7288 break;
7289 case _sse_weapon:
7290 if(arg->vt != VT_STR)
7291 goto setspawnentry_error;
7292 spawnentry.weaponmodel = findmodel((char *) StrCache_Get(arg->strVal));
7293 break;
7294 default:
7295 //printf("Property name '%s' is not supported by setspawnentry.\n", propname);
7296 goto setspawnentry_error;
7299 return S_OK;
7300 setspawnentry_error:
7301 *pretvar = NULL;
7302 return E_FAIL;
7305 //spawn();
7306 s32 openbor_spawn(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
7307 entity *ent;
7309 ent = smartspawn(&spawnentry);
7311 if(ent) {
7312 ScriptVariant_ChangeType(*pretvar, VT_PTR);
7313 (*pretvar)->ptrVal = (void*) ent;
7314 } else
7315 ScriptVariant_Clear(*pretvar);
7317 return S_OK;
7320 //entity * projectile(char *name, float x, float z, float a, int direction, int type, int ptype, int map);
7321 s32 openbor_projectile(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
7322 int i;
7323 s32 value[7];
7324 entity *ent;
7325 char name[64] = { "" };
7327 if(paramCount != 8)
7328 goto projectile_error;
7329 if(varlist[0]->vt != VT_STR)
7330 goto projectile_error;
7332 ScriptVariant_Clear(*pretvar);
7334 strncpy(name, StrCache_Get(varlist[0]->strVal), MAX_STR_VAR_LEN);
7336 for(i = 1; i <= 7; i++) {
7337 if(FAILED(ScriptVariant_IntegerValue(varlist[i], &value[i - 1])))
7338 goto projectile_error;
7341 switch ((int) value[5]) {
7342 default:
7343 case 0:
7344 ent =
7345 knife_spawn(name, -1, (float) value[0], (float) value[1], (float) value[2], (int) value[3],
7346 (int) value[4], (int) value[6]);
7347 break;
7348 case 1:
7349 ent =
7350 bomb_spawn(name, -1, (float) value[0], (float) value[1], (float) value[2], (int) value[3],
7351 (int) value[6]);
7352 break;
7355 ScriptVariant_ChangeType(*pretvar, VT_PTR);
7356 (*pretvar)->ptrVal = (void*) ent;
7358 return S_OK;
7360 projectile_error:
7361 printf
7362 ("Function requires 8 values: entity * projectile(char *name, float x, float z, float a, int direction, int type, int ptype, int map)\n");
7363 return E_FAIL;
7366 #define SAMPLE_GO samples.go
7367 #define SAMPLE_BEAT samples.beat
7368 #define SAMPLE_BLOCK samples.block
7369 #define SAMPLE_INDIRECT samples.indirect
7370 #define SAMPLE_GET samples.get
7371 #define SAMPLE_GET2 samples.get2
7372 #define SAMPLE_FALL samples.fall
7373 #define SAMPLE_JUMP samples.jump
7374 #define SAMPLE_PUNCH samples.punch
7375 #define SAMPLE_1UP samples.oneup
7376 #define SAMPLE_TIMEOVER samples.timeover
7377 #define SAMPLE_BEEP samples.beep
7378 #define SAMPLE_BEEP2 samples.beep2
7379 #define SAMPLE_BIKE samples.bike
7382 // ===== openborconstant =====
7384 #define ICMPCONST(x) \
7385 case CMD_SCRIPT_CONSTANT_ ##x: \
7386 value = x; break;
7387 void mapstrings_transconst(ScriptVariant ** varlist, int paramCount) {
7388 char *constname = NULL;
7389 scriptConstantsCommands cmd;
7390 VARTYPE vartype;
7391 long value;
7393 if(paramCount < 1)
7394 return;
7396 if(varlist[0]->vt == VT_STR) {
7397 constname = (char *) StrCache_Get(varlist[0]->strVal);
7398 cmd = getScriptConstantsCommand(scriptConstantsCommandList, constname);
7399 vartype = ScriptVariant_GetType(varlist[0]);
7400 ScriptVariant_ChangeType(varlist[0], VT_INTEGER);
7401 switch(cmd) {
7402 ICMPCONST(COMPATIBLEVERSION);
7403 ICMPCONST(PIXEL_8);
7404 ICMPCONST(PIXEL_x8);
7405 ICMPCONST(PIXEL_16);
7406 ICMPCONST(PIXEL_32);
7407 ICMPCONST(CV_SAVED_GAME);
7408 ICMPCONST(CV_HIGH_SCORE);
7409 ICMPCONST(THINK_SPEED);
7410 ICMPCONST(COUNTER_SPEED);
7411 ICMPCONST(MAX_ENTS);
7412 ICMPCONST(MAX_PANELS);
7413 ICMPCONST(MAX_WEAPONS);
7414 ICMPCONST(MAX_COLOUR_MAPS);
7415 ICMPCONST(MAX_NAME_LEN);
7416 ICMPCONST(LEVEL_MAX_SPAWNS);
7417 ICMPCONST(LEVEL_MAX_PANELS);
7418 ICMPCONST(LEVEL_MAX_HOLES);
7419 ICMPCONST(LEVEL_MAX_WALLS);
7420 ICMPCONST(MAX_LEVELS);
7421 ICMPCONST(MAX_DIFFICULTIES);
7422 ICMPCONST(MAX_SPECIALS);
7423 ICMPCONST(MAX_ATCHAIN);
7424 ICMPCONST(MAX_ATTACKS);
7425 ICMPCONST(MAX_FOLLOWS);
7426 ICMPCONST(MAX_PLAYERS);
7427 ICMPCONST(MAX_ARG_LEN);
7428 ICMPCONST(FLAG_ESC);
7429 ICMPCONST(FLAG_START);
7430 ICMPCONST(FLAG_MOVELEFT);
7431 ICMPCONST(FLAG_MOVERIGHT);
7432 ICMPCONST(FLAG_MOVEUP);
7433 ICMPCONST(FLAG_MOVEDOWN);
7434 ICMPCONST(FLAG_ATTACK);
7435 ICMPCONST(FLAG_ATTACK2);
7436 ICMPCONST(FLAG_ATTACK3);
7437 ICMPCONST(FLAG_ATTACK4);
7438 ICMPCONST(FLAG_JUMP);
7439 ICMPCONST(FLAG_SPECIAL);
7440 ICMPCONST(FLAG_SCREENSHOT);
7441 ICMPCONST(FLAG_ANYBUTTON);
7442 ICMPCONST(FLAG_FORWARD);
7443 ICMPCONST(FLAG_BACKWARD);
7444 ICMPCONST(SDID_MOVEUP);
7445 ICMPCONST(SDID_MOVEDOWN);
7446 ICMPCONST(SDID_MOVELEFT);
7447 ICMPCONST(SDID_MOVERIGHT);
7448 ICMPCONST(SDID_SPECIAL);
7449 ICMPCONST(SDID_ATTACK);
7450 ICMPCONST(SDID_ATTACK2);
7451 ICMPCONST(SDID_ATTACK3);
7452 ICMPCONST(SDID_ATTACK4);
7453 ICMPCONST(SDID_JUMP);
7454 ICMPCONST(SDID_START);
7455 ICMPCONST(SDID_SCREENSHOT);
7456 ICMPCONST(TYPE_NONE);
7457 ICMPCONST(TYPE_PLAYER);
7458 ICMPCONST(TYPE_ENEMY);
7459 ICMPCONST(TYPE_ITEM);
7460 ICMPCONST(TYPE_OBSTACLE);
7461 ICMPCONST(TYPE_STEAMER);
7462 ICMPCONST(TYPE_SHOT);
7463 ICMPCONST(TYPE_TRAP);
7464 ICMPCONST(TYPE_TEXTBOX);
7465 ICMPCONST(TYPE_ENDLEVEL);
7466 ICMPCONST(TYPE_NPC);
7467 ICMPCONST(TYPE_PANEL);
7468 ICMPCONST(SUBTYPE_NONE);
7469 ICMPCONST(SUBTYPE_BIKER);
7470 ICMPCONST(SUBTYPE_NOTGRAB);
7471 ICMPCONST(SUBTYPE_ARROW);
7472 ICMPCONST(SUBTYPE_TOUCH);
7473 ICMPCONST(SUBTYPE_WEAPON);
7474 ICMPCONST(SUBTYPE_NOSKIP);
7475 ICMPCONST(SUBTYPE_FLYDIE);
7476 ICMPCONST(SUBTYPE_BOTH);
7477 ICMPCONST(SUBTYPE_PROJECTILE);
7478 ICMPCONST(SUBTYPE_FOLLOW);
7479 ICMPCONST(SUBTYPE_CHASE);
7480 ICMPCONST(AIMOVE1_NORMAL);
7481 ICMPCONST(AIMOVE1_CHASE);
7482 ICMPCONST(AIMOVE1_CHASEZ);
7483 ICMPCONST(AIMOVE1_CHASEX);
7484 ICMPCONST(AIMOVE1_AVOID);
7485 ICMPCONST(AIMOVE1_AVOIDZ);
7486 ICMPCONST(AIMOVE1_AVOIDX);
7487 ICMPCONST(AIMOVE1_WANDER);
7488 ICMPCONST(AIMOVE1_NOMOVE);
7489 ICMPCONST(AIMOVE1_BIKER);
7490 ICMPCONST(AIMOVE1_STAR);
7491 ICMPCONST(AIMOVE1_ARROW);
7492 ICMPCONST(AIMOVE1_BOMB);
7493 ICMPCONST(AIMOVE2_NORMAL);
7494 ICMPCONST(AIMOVE2_IGNOREHOLES);
7495 ICMPCONST(AIATTACK1_NORMAL);
7496 ICMPCONST(AIATTACK1_LONG);
7497 ICMPCONST(AIATTACK1_MELEE);
7498 ICMPCONST(AIATTACK1_NOATTACK);
7499 ICMPCONST(AIATTACK2_NORMAL);
7500 ICMPCONST(AIATTACK2_DODGE);
7501 ICMPCONST(AIATTACK2_DODGEMOVE);
7502 ICMPCONST(FRONTPANEL_Z);
7503 ICMPCONST(HOLE_Z);
7504 ICMPCONST(NEONPANEL_Z);
7505 ICMPCONST(SHADOW_Z);
7506 ICMPCONST(SCREENPANEL_Z);
7507 ICMPCONST(PANEL_Z);
7508 ICMPCONST(MIRROR_Z);
7509 ICMPCONST(PIT_DEPTH);
7510 ICMPCONST(P2_STATS_DIST);
7511 ICMPCONST(CONTACT_DIST_H);
7512 ICMPCONST(CONTACT_DIST_V);
7513 ICMPCONST(GRAB_DIST);
7514 ICMPCONST(GRAB_STALL);
7515 ICMPCONST(ATK_NORMAL);
7516 ICMPCONST(ATK_NORMAL2);
7517 ICMPCONST(ATK_NORMAL3);
7518 ICMPCONST(ATK_NORMAL4);
7519 ICMPCONST(ATK_BLAST);
7520 ICMPCONST(ATK_BURN);
7521 ICMPCONST(ATK_FREEZE);
7522 ICMPCONST(ATK_SHOCK);
7523 ICMPCONST(ATK_STEAL);
7524 ICMPCONST(ATK_NORMAL5);
7525 ICMPCONST(ATK_NORMAL6);
7526 ICMPCONST(ATK_NORMAL7);
7527 ICMPCONST(ATK_NORMAL8);
7528 ICMPCONST(ATK_NORMAL9);
7529 ICMPCONST(ATK_NORMAL10);
7530 ICMPCONST(ATK_ITEM);
7531 ICMPCONST(SCROLL_RIGHT);
7532 ICMPCONST(SCROLL_DOWN);
7533 ICMPCONST(SCROLL_LEFT);
7534 ICMPCONST(SCROLL_UP);
7535 ICMPCONST(SCROLL_BOTH);
7536 ICMPCONST(SCROLL_LEFTRIGHT);
7537 ICMPCONST(SCROLL_RIGHTLEFT);
7538 ICMPCONST(SCROLL_INWARD);
7539 ICMPCONST(SCROLL_OUTWARD);
7540 ICMPCONST(SCROLL_INOUT);
7541 ICMPCONST(SCROLL_OUTIN);
7542 ICMPCONST(SCROLL_UPWARD);
7543 ICMPCONST(SCROLL_DOWNWARD);
7544 ICMPCONST(ANI_IDLE);
7545 ICMPCONST(ANI_WALK);
7546 ICMPCONST(ANI_JUMP);
7547 ICMPCONST(ANI_LAND);
7548 ICMPCONST(ANI_PAIN);
7549 ICMPCONST(ANI_FALL);
7550 ICMPCONST(ANI_RISE);
7551 //ICMPCONST(ANI_ATTACK1);// move these below because we have some dynamic animation ids
7552 //ICMPCONST(ANI_ATTACK2);
7553 //ICMPCONST(ANI_ATTACK3);
7554 //ICMPCONST(ANI_ATTACK4);
7555 ICMPCONST(ANI_UPPER);
7556 ICMPCONST(ANI_BLOCK);
7557 ICMPCONST(ANI_JUMPATTACK);
7558 ICMPCONST(ANI_JUMPATTACK2);
7559 ICMPCONST(ANI_GET);
7560 ICMPCONST(ANI_GRAB);
7561 ICMPCONST(ANI_GRABATTACK);
7562 ICMPCONST(ANI_GRABATTACK2);
7563 ICMPCONST(ANI_THROW);
7564 ICMPCONST(ANI_SPECIAL);
7565 //ICMPCONST(ANI_FREESPECIAL);// move these below because we have some dynamic animation ids
7566 ICMPCONST(ANI_SPAWN);
7567 ICMPCONST(ANI_DIE);
7568 ICMPCONST(ANI_PICK);
7569 //ICMPCONST(ANI_FREESPECIAL2);
7570 ICMPCONST(ANI_JUMPATTACK3);
7571 //ICMPCONST(ANI_FREESPECIAL3);
7572 ICMPCONST(ANI_UP);
7573 ICMPCONST(ANI_DOWN);
7574 ICMPCONST(ANI_SHOCK);
7575 ICMPCONST(ANI_BURN);
7577 ICMPCONST(ANI_SHOCKPAIN);
7578 ICMPCONST(ANI_BURNPAIN);
7579 ICMPCONST(ANI_GRABBED);
7580 ICMPCONST(ANI_SPECIAL2);
7581 ICMPCONST(ANI_RUN);
7582 ICMPCONST(ANI_RUNATTACK);
7583 ICMPCONST(ANI_RUNJUMPATTACK);
7584 ICMPCONST(ANI_ATTACKUP);
7585 ICMPCONST(ANI_ATTACKDOWN);
7586 ICMPCONST(ANI_ATTACKFORWARD);
7587 ICMPCONST(ANI_ATTACKBACKWARD);
7588 //ICMPCONST(ANI_FREESPECIAL4);
7589 //ICMPCONST(ANI_FREESPECIAL5);
7590 //ICMPCONST(ANI_FREESPECIAL6);
7591 //ICMPCONST(ANI_FREESPECIAL7);
7592 //ICMPCONST(ANI_FREESPECIAL8);
7593 ICMPCONST(ANI_RISEATTACK);
7594 ICMPCONST(ANI_DODGE);
7595 ICMPCONST(ANI_ATTACKBOTH);
7596 ICMPCONST(ANI_GRABFORWARD);
7597 ICMPCONST(ANI_GRABFORWARD2);
7598 ICMPCONST(ANI_JUMPFORWARD);
7599 ICMPCONST(ANI_GRABDOWN);
7600 ICMPCONST(ANI_GRABDOWN2);
7601 ICMPCONST(ANI_GRABUP);
7602 ICMPCONST(ANI_GRABUP2);
7603 ICMPCONST(ANI_SELECT);
7604 ICMPCONST(ANI_DUCK);
7605 ICMPCONST(ANI_FAINT);
7606 ICMPCONST(ANI_CANT);
7607 ICMPCONST(ANI_THROWATTACK);
7608 ICMPCONST(ANI_CHARGEATTACK);
7609 ICMPCONST(ANI_VAULT);
7610 ICMPCONST(ANI_JUMPCANT);
7611 ICMPCONST(ANI_JUMPSPECIAL);
7612 ICMPCONST(ANI_BURNDIE);
7613 ICMPCONST(ANI_SHOCKDIE);
7614 ICMPCONST(ANI_PAIN2);
7615 ICMPCONST(ANI_PAIN3);
7616 ICMPCONST(ANI_PAIN4);
7617 ICMPCONST(ANI_FALL2);
7618 ICMPCONST(ANI_FALL3);
7619 ICMPCONST(ANI_FALL4);
7620 ICMPCONST(ANI_DIE2);
7621 ICMPCONST(ANI_DIE3);
7622 ICMPCONST(ANI_DIE4);
7623 ICMPCONST(ANI_CHARGE);
7624 ICMPCONST(ANI_BACKWALK);
7625 ICMPCONST(ANI_SLEEP);
7626 //ICMPCONST(ANI_FOLLOW1); // move these below because we have some dynamic animation ids
7627 //ICMPCONST(ANI_FOLLOW2);
7628 //ICMPCONST(ANI_FOLLOW3);
7629 //ICMPCONST(ANI_FOLLOW4);
7630 ICMPCONST(ANI_PAIN5);
7631 ICMPCONST(ANI_PAIN6);
7632 ICMPCONST(ANI_PAIN7);
7633 ICMPCONST(ANI_PAIN8);
7634 ICMPCONST(ANI_PAIN9);
7635 ICMPCONST(ANI_PAIN10);
7636 ICMPCONST(ANI_FALL5);
7637 ICMPCONST(ANI_FALL6);
7638 ICMPCONST(ANI_FALL7);
7639 ICMPCONST(ANI_FALL8);
7640 ICMPCONST(ANI_FALL9);
7641 ICMPCONST(ANI_FALL10);
7642 ICMPCONST(ANI_DIE5);
7643 ICMPCONST(ANI_DIE6);
7644 ICMPCONST(ANI_DIE7);
7645 ICMPCONST(ANI_DIE8);
7646 ICMPCONST(ANI_DIE9);
7647 ICMPCONST(ANI_DIE10);
7648 ICMPCONST(ANI_TURN);
7649 ICMPCONST(ANI_RESPAWN);
7650 ICMPCONST(ANI_FORWARDJUMP);
7651 ICMPCONST(ANI_RUNJUMP);
7652 ICMPCONST(ANI_JUMPLAND);
7653 ICMPCONST(ANI_JUMPDELAY);
7654 ICMPCONST(ANI_HITWALL);
7655 ICMPCONST(ANI_GRABBACKWARD);
7656 ICMPCONST(ANI_GRABBACKWARD2);
7657 ICMPCONST(ANI_GRABWALK);
7658 ICMPCONST(ANI_GRABBEDWALK);
7659 ICMPCONST(ANI_GRABWALKUP);
7660 ICMPCONST(ANI_GRABBEDWALKUP);
7661 ICMPCONST(ANI_GRABWALKDOWN);
7662 ICMPCONST(ANI_GRABBEDWALKDOWN);
7663 ICMPCONST(ANI_GRABTURN);
7664 ICMPCONST(ANI_GRABBEDTURN);
7665 ICMPCONST(ANI_GRABBACKWALK);
7666 ICMPCONST(ANI_GRABBEDBACKWALK);
7667 ICMPCONST(ANI_SLIDE);
7668 ICMPCONST(ANI_RUNSLIDE);
7669 ICMPCONST(ANI_BLOCKPAIN);
7670 ICMPCONST(ANI_DUCKATTACK);
7671 ICMPCONST(MAX_ANIS);
7672 ICMPCONST(PLAYER_MIN_Z);
7673 ICMPCONST(PLAYER_MAX_Z);
7674 ICMPCONST(BGHEIGHT);
7675 ICMPCONST(MAX_WALL_HEIGHT);
7676 ICMPCONST(SAMPLE_GO);
7677 ICMPCONST(SAMPLE_BEAT);
7678 ICMPCONST(SAMPLE_BLOCK);
7679 ICMPCONST(SAMPLE_INDIRECT);
7680 ICMPCONST(SAMPLE_GET);
7681 ICMPCONST(SAMPLE_GET2);
7682 ICMPCONST(SAMPLE_FALL);
7683 ICMPCONST(SAMPLE_JUMP);
7684 ICMPCONST(SAMPLE_PUNCH);
7685 ICMPCONST(SAMPLE_1UP);
7686 ICMPCONST(SAMPLE_TIMEOVER);
7687 ICMPCONST(SAMPLE_BEEP);
7688 ICMPCONST(SAMPLE_BEEP2);
7689 ICMPCONST(SAMPLE_BIKE);
7690 ICMPCONST(ANI_RISE2);
7691 ICMPCONST(ANI_RISE3);
7692 ICMPCONST(ANI_RISE4);
7693 ICMPCONST(ANI_RISE5);
7694 ICMPCONST(ANI_RISE6);
7695 ICMPCONST(ANI_RISE7);
7696 ICMPCONST(ANI_RISE8);
7697 ICMPCONST(ANI_RISE9);
7698 ICMPCONST(ANI_RISE10);
7699 ICMPCONST(ANI_RISEB);
7700 ICMPCONST(ANI_RISES);
7701 ICMPCONST(ANI_BLOCKPAIN2);
7702 ICMPCONST(ANI_BLOCKPAIN3);
7703 ICMPCONST(ANI_BLOCKPAIN4);
7704 ICMPCONST(ANI_BLOCKPAIN5);
7705 ICMPCONST(ANI_BLOCKPAIN6);
7706 ICMPCONST(ANI_BLOCKPAIN7);
7707 ICMPCONST(ANI_BLOCKPAIN8);
7708 ICMPCONST(ANI_BLOCKPAIN9);
7709 ICMPCONST(ANI_BLOCKPAIN10);
7710 ICMPCONST(ANI_BLOCKPAINB);
7711 ICMPCONST(ANI_BLOCKPAINS);
7712 ICMPCONST(ANI_CHIPDEATH);
7713 ICMPCONST(ANI_GUARDBREAK);
7714 ICMPCONST(ANI_RISEATTACK2);
7715 ICMPCONST(ANI_RISEATTACK3);
7716 ICMPCONST(ANI_RISEATTACK4);
7717 ICMPCONST(ANI_RISEATTACK5);
7718 ICMPCONST(ANI_RISEATTACK6);
7719 ICMPCONST(ANI_RISEATTACK7);
7720 ICMPCONST(ANI_RISEATTACK8);
7721 ICMPCONST(ANI_RISEATTACK9);
7722 ICMPCONST(ANI_RISEATTACK10);
7723 ICMPCONST(ANI_RISEATTACKB);
7724 ICMPCONST(ANI_RISEATTACKS);
7725 default:
7726 ScriptVariant_ChangeType(varlist[0], vartype);
7727 return;
7730 varlist[0]->lVal = value;
7734 #undef ICMPCONST
7736 static const int ani_translate[] = {
7737 CMD_SCRIPT_CONSTANT_ANI_DOWN,
7738 CMD_SCRIPT_CONSTANT_ANI_UP,
7739 CMD_SCRIPT_CONSTANT_ANI_BACKWALK,
7740 CMD_SCRIPT_CONSTANT_ANI_WALK,
7741 CMD_SCRIPT_CONSTANT_ANI_IDLE,
7742 CMD_SCRIPT_CONSTANT_ANI_FALL,
7743 CMD_SCRIPT_CONSTANT_ANI_ATTACK,
7744 CMD_SCRIPT_CONSTANT_ANI_FOLLOW,
7745 CMD_SCRIPT_CONSTANT_ANI_RISE,
7746 CMD_SCRIPT_CONSTANT_ANI_RISEATTACK,
7747 CMD_SCRIPT_CONSTANT_ANI_PAIN,
7748 CMD_SCRIPT_CONSTANT_ANI_DIE,
7749 CMD_SCRIPT_CONSTANT_ANI_FREESPECIAL,
7752 static int** ani_targets[] = {
7753 &dyn_anims.animdowns,
7754 &dyn_anims.animups,
7755 &dyn_anims.animbackwalks,
7756 &dyn_anims.animwalks,
7757 &dyn_anims.animidles,
7758 &dyn_anims.animfalls,
7759 &dyn_anims.animattacks,
7760 &dyn_anims.animfollows,
7761 &dyn_anims.animrises,
7762 &dyn_anims.animriseattacks,
7763 &dyn_anims.animpains,
7764 &dyn_anims.animdies,
7765 &dyn_anims.animspecials,
7768 #define ani_num_translations (ARRAY_SIZE(ani_targets))
7770 //openborconstant(constname);
7771 //translate a constant by string, used to retrieve a constant or macro of openbor
7772 s32 openbor_transconst(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
7773 char *constname = NULL;
7774 int temp;
7775 char const_name_cp[64];
7776 unsigned got_num = 0, l;
7777 int check_type;
7778 scriptConstantsCommands cmd;
7781 if(paramCount < 1) {
7782 *pretvar = NULL;
7783 return E_FAIL;
7786 mapstrings_transconst(varlist, paramCount);
7787 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
7789 if(varlist[0]->vt == VT_INTEGER) // return value already determined by mapstrings
7791 (*pretvar)->lVal = varlist[0]->lVal;
7792 return S_OK;
7793 } else if(varlist[0]->vt != VT_STR) {
7794 *pretvar = NULL;
7795 return E_FAIL;
7797 // if we get to this point, it's a dynamic animation id
7798 constname = StrCache_Get(varlist[0]->strVal);
7799 for(l = 0; l < sizeof(const_name_cp) - 1; l++) {
7800 switch(constname[l]) {
7801 case '0': case '1': case '2':
7802 case '3': case '4': case '5':
7803 case '6': case '7': case '8':
7804 case '9':
7805 got_num = l;
7806 const_name_cp[l] = constname[l];
7807 break;
7808 case 0:
7809 const_name_cp[l] = constname[l];
7810 goto out_1;
7811 default:
7812 const_name_cp[l] = constname[l];
7813 break;
7816 out_1:
7818 if(got_num && got_num == l - 1) {
7819 if(isdigit(constname[got_num -1])) got_num--;
7820 const_name_cp[got_num] = 0;
7821 cmd = getScriptConstantsCommand(scriptConstantsCommandList, const_name_cp);
7823 temp = atoi(constname + got_num);
7824 switch(cmd) {
7825 case CMD_SCRIPT_CONSTANT_ANI_DOWN:
7826 case CMD_SCRIPT_CONSTANT_ANI_UP:
7827 case CMD_SCRIPT_CONSTANT_ANI_BACKWALK:
7828 case CMD_SCRIPT_CONSTANT_ANI_WALK:
7829 case CMD_SCRIPT_CONSTANT_ANI_IDLE:
7830 case CMD_SCRIPT_CONSTANT_ANI_FALL:
7831 case CMD_SCRIPT_CONSTANT_ANI_ATTACK:
7832 case CMD_SCRIPT_CONSTANT_ANI_FOLLOW:
7833 check_type = 0;
7834 break;
7835 case CMD_SCRIPT_CONSTANT_ANI_RISE:
7836 case CMD_SCRIPT_CONSTANT_ANI_RISEATTACK:
7837 case CMD_SCRIPT_CONSTANT_ANI_PAIN:
7838 case CMD_SCRIPT_CONSTANT_ANI_DIE:
7839 check_type = 1;
7840 break;
7841 case CMD_SCRIPT_CONSTANT_ANI_FREESPECIAL:
7842 check_type = 2;
7843 break;
7844 default:
7845 check_type = -1;
7846 break;
7848 if(check_type >= 0) {
7849 for(l = 0; l < ani_num_translations; l++)
7850 if(ani_translate[l] == cmd) {
7851 if(check_type == 1) {
7852 if(temp < MAX_ATKS - STA_ATKS + 1)
7853 temp = MAX_ATKS - STA_ATKS + 1; // just in case
7854 } else if(check_type == 2) {
7855 if(temp < 1)
7856 temp = 1;
7858 (*pretvar)->lVal = (s32) ((*ani_targets[l])[temp - 1]);
7859 return S_OK;
7864 ScriptVariant_Clear(*pretvar);
7865 return S_OK;
7868 //int rgbcolor(int r, int g, int b);
7869 s32 openbor_rgbcolor(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
7870 s32 r, g, b;
7872 if(paramCount != 3)
7873 goto rgbcolor_error;
7874 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &r)))
7875 goto rgbcolor_error; // decimal/integer value for red?
7876 if(FAILED(ScriptVariant_IntegerValue(varlist[1], &g)))
7877 goto rgbcolor_error; // decimal/integer value for green?
7878 if(FAILED(ScriptVariant_IntegerValue(varlist[2], &b)))
7879 goto rgbcolor_error; // decimal/integer value for blue?
7881 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
7882 (*pretvar)->lVal = _makecolour(r, g, b);
7883 return S_OK;
7885 rgbcolor_error:
7886 *pretvar = NULL;
7887 return E_FAIL;
7890 // ===== playerkeys =====
7891 enum playerkeys_enum {
7892 _pk_anybutton,
7893 _pk_attack,
7894 _pk_attack2,
7895 _pk_attack3,
7896 _pk_attack4,
7897 _pk_esc,
7898 _pk_jump,
7899 _pk_movedown,
7900 _pk_moveleft,
7901 _pk_moveright,
7902 _pk_moveup,
7903 _pk_screenshot,
7904 _pk_special,
7905 _pk_start,
7906 _pk_the_end,
7909 void mapstrings_playerkeys(ScriptVariant ** varlist, int paramCount) {
7910 char *propname = NULL;
7911 int i, prop;
7913 static const char *proplist[] = // for args 2+
7915 "anybutton",
7916 "attack",
7917 "attack2",
7918 "attack3",
7919 "attack4",
7920 "esc",
7921 "jump",
7922 "movedown",
7923 "moveleft",
7924 "moveright",
7925 "moveup",
7926 "screenshot",
7927 "special",
7928 "start",
7931 for(i = 2; i < paramCount; i++) {
7932 MAPSTRINGS(varlist[i], proplist, _pk_the_end, "Button name '%s' is not supported by playerkeys.");
7936 //playerkeys(playerindex, newkey?, key1, key2, ...);
7937 s32 openbor_playerkeys(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
7938 s32 ltemp;
7939 int index, newkey;
7940 int i;
7941 u32 keys;
7942 ScriptVariant *arg = NULL;
7944 if(paramCount < 3) {
7945 *pretvar = NULL;
7946 return E_FAIL;
7949 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
7950 (*pretvar)->lVal = (s32) 1;
7952 mapstrings_playerkeys(varlist, paramCount);
7954 if(FAILED(ScriptVariant_IntegerValue((varlist[0]), &ltemp))) {
7955 index = 0;
7956 } else
7957 index = (int) ltemp;
7959 if(SUCCEEDED(ScriptVariant_IntegerValue((varlist[1]), &ltemp)))
7960 newkey = (int) ltemp;
7961 else
7962 newkey = 0;
7964 if(newkey == 1)
7965 keys = player[index].newkeys;
7966 else if(newkey == 2)
7967 keys = player[index].releasekeys;
7968 else
7969 keys = player[index].keys;
7971 for(i = 2; i < paramCount; i++) {
7972 arg = varlist[i];
7973 if(arg->vt == VT_INTEGER) {
7974 switch (arg->lVal) {
7975 case _pk_jump:
7976 (*pretvar)->lVal = (s32) (keys & FLAG_JUMP);
7977 break;
7978 case _pk_attack:
7979 (*pretvar)->lVal = (s32) (keys & FLAG_ATTACK);
7980 break;
7981 case _pk_attack2:
7982 (*pretvar)->lVal = (s32) (keys & FLAG_ATTACK2);
7983 break;
7984 case _pk_attack3:
7985 (*pretvar)->lVal = (s32) (keys & FLAG_ATTACK3);
7986 break;
7987 case _pk_attack4:
7988 (*pretvar)->lVal = (s32) (keys & FLAG_ATTACK4);
7989 break;
7990 case _pk_special:
7991 (*pretvar)->lVal = (s32) (keys & FLAG_SPECIAL);
7992 break;
7993 case _pk_esc:
7994 (*pretvar)->lVal = (s32) (keys & FLAG_ESC);
7995 break;
7996 case _pk_start:
7997 (*pretvar)->lVal = (s32) (keys & FLAG_START);
7998 break;
7999 case _pk_moveleft:
8000 (*pretvar)->lVal = (s32) (keys & FLAG_MOVELEFT);
8001 break;
8002 case _pk_moveright:
8003 (*pretvar)->lVal = (s32) (keys & FLAG_MOVERIGHT);
8004 break;
8005 case _pk_moveup:
8006 (*pretvar)->lVal = (s32) (keys & FLAG_MOVEUP);
8007 break;
8008 case _pk_movedown:
8009 (*pretvar)->lVal = (s32) (keys & FLAG_MOVEDOWN);
8010 break;
8011 case _pk_screenshot:
8012 (*pretvar)->lVal = (s32) (keys & FLAG_SCREENSHOT);
8013 break;
8014 case _pk_anybutton:
8015 (*pretvar)->lVal = (s32) (keys & FLAG_ANYBUTTON);
8016 break;
8017 default:
8018 (*pretvar)->lVal = (s32) 0;
8020 } else
8021 (*pretvar)->lVal = (s32) 0;
8022 if(!((*pretvar)->lVal))
8023 break;
8026 return S_OK;
8029 //playmusic(name, loop)
8030 s32 openbor_playmusic(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8031 int loop = 0;
8032 s32 offset = 0;
8033 char *thename = NULL;
8035 *pretvar = NULL;
8036 if(paramCount < 1) {
8037 sound_close_music();
8038 return S_OK;
8040 if(varlist[0]->vt != VT_STR) {
8041 //printf("");
8042 return E_FAIL;
8044 thename = StrCache_Get(varlist[0]->strVal);
8046 if(paramCount > 1) {
8047 loop = (int) ScriptVariant_IsTrue(varlist[1]);
8050 if(paramCount > 2) {
8051 if(FAILED(ScriptVariant_IntegerValue(varlist[2], &offset)))
8052 return E_FAIL;
8056 music(thename, loop, offset);
8057 return S_OK;
8060 //fademusic(fade, name, loop, offset)
8061 s32 openbor_fademusic(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8062 double value = 0;
8063 s32 values[2] = { 0, 0 };
8064 *pretvar = NULL;
8065 if(paramCount < 1)
8066 goto fademusic_error;
8067 if(FAILED(ScriptVariant_DecimalValue(varlist[0], &value)))
8068 goto fademusic_error;
8069 musicfade[0] = value;
8070 musicfade[1] = (float) savedata.musicvol;
8072 if(paramCount == 4) {
8073 strncpy(musicname, StrCache_Get(varlist[1]->strVal), 128);
8074 if(FAILED(ScriptVariant_IntegerValue(varlist[2], &values[0])))
8075 goto fademusic_error;
8076 if(FAILED(ScriptVariant_IntegerValue(varlist[3], &values[1])))
8077 goto fademusic_error;
8078 musicloop = values[0];
8079 musicoffset = values[1];
8081 return S_OK;
8083 fademusic_error:
8084 printf
8085 ("Function requires 1 value, with an optional 3 for music triggering: fademusic_error(float fade, char name, int loop, unsigned long offset)\n");
8086 return E_FAIL;
8089 //setmusicvolume(left, right)
8090 s32 openbor_setmusicvolume(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8091 s32 channels[2];
8093 if(paramCount < 1) {
8094 return S_OK;
8097 if(FAILED(ScriptVariant_IntegerValue(varlist[0], channels)))
8098 goto setmusicvolume_error;
8100 if(paramCount > 1) {
8101 if(FAILED(ScriptVariant_IntegerValue(varlist[1], channels + 1)))
8102 goto setmusicvolume_error;
8103 } else
8104 channels[1] = channels[0];
8106 sound_volume_music((int) channels[0], (int) channels[1]);
8107 return S_OK;
8109 setmusicvolume_error:
8110 printf("values must be integers: setmusicvolume(int left, (optional)int right)\n");
8111 return E_FAIL;
8114 //setmusicvolume(left, right)
8115 s32 openbor_setmusictempo(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8116 s32 new_tempo;
8118 if(paramCount < 1) {
8119 return S_OK;
8122 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &new_tempo)))
8123 return E_FAIL;
8125 sound_music_tempo(new_tempo);
8126 return S_OK;
8129 //pausemusic(value)
8130 s32 openbor_pausemusic(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8131 int pause = 0;
8132 if(paramCount < 1) {
8133 return S_OK;
8136 pause = (int) ScriptVariant_IsTrue(varlist[0]);
8138 sound_pause_music(pause);
8139 return S_OK;
8142 //playsample(id, priority, lvolume, rvolume, speed, loop)
8143 s32 openbor_playsample(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8144 int i;
8145 s32 value[6];
8147 if(paramCount != 6)
8148 goto playsample_error;
8150 *pretvar = NULL;
8151 for(i = 0; i < 6; i++) {
8152 if(FAILED(ScriptVariant_IntegerValue(varlist[i], value + i)))
8153 goto playsample_error;
8155 if((int) value[0] < 0) {
8156 printf("Invalid Id for playsample(id=%d, priority=%d, lvolume=%d, rvolume=%d, speed=%d, loop=%d)\n",
8157 (int) value[0], (unsigned int) value[1], (int) value[2], (int) value[3], (unsigned int) value[4],
8158 (int) value[5]);
8159 return E_FAIL;
8161 if((int) value[5])
8162 sound_loop_sample((int) value[0], (unsigned int) value[1], (int) value[2], (int) value[3],
8163 (unsigned int) value[4]);
8164 else
8165 sound_play_sample((int) value[0], (unsigned int) value[1], (int) value[2], (int) value[3],
8166 (unsigned int) value[4]);
8167 return S_OK;
8169 playsample_error:
8171 printf
8172 ("Function requires 6 integer values: playsample(int id, unsigned int priority, int lvolume, int rvolume, unsigned int speed, int loop)\n");
8173 return E_FAIL;
8176 // int loadsample(filename, log)
8177 s32 openbor_loadsample(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8178 int arg = 0;
8180 if(paramCount < 1) {
8181 goto loadsample_error;
8183 if(varlist[0]->vt != VT_STR)
8184 goto loadsample_error;
8186 if(paramCount > 1) {
8187 if(varlist[1]->vt == VT_INTEGER) {
8188 arg = varlist[1]->lVal;
8189 } else {
8190 goto loadsample_error;
8194 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8195 (*pretvar)->lVal = (s32) sound_load_sample(StrCache_Get(varlist[0]->strVal), packfile, arg);
8196 return S_OK;
8198 loadsample_error:
8199 printf
8200 ("Function requires 1 string value and optional log value: loadsample(string {filename} integer {log})\n");
8201 *pretvar = NULL;
8202 return E_FAIL;
8205 // void unloadsample(id)
8206 s32 openbor_unloadsample(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8207 s32 id;
8208 *pretvar = NULL;
8209 if(paramCount != 1)
8210 goto unloadsample_error;
8212 if(FAILED(ScriptVariant_IntegerValue((varlist[0]), &id)))
8213 goto unloadsample_error;
8215 sound_unload_sample((int) id);
8216 return S_OK;
8218 unloadsample_error:
8219 printf("Function requires 1 integer value: unloadsample(int id)\n");
8220 return E_FAIL;
8223 //fadeout(type, speed);
8224 s32 openbor_fadeout(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8225 s32 type;
8226 s32 speed;
8227 *pretvar = NULL;
8228 if(paramCount < 1)
8229 goto fade_out_error;
8231 if(FAILED(ScriptVariant_IntegerValue((varlist[0]), &type)))
8232 goto fade_out_error;
8233 if(FAILED(ScriptVariant_IntegerValue((varlist[1]), &speed)))
8235 fade_out((int) type, (int) speed);
8236 return S_OK;
8238 fade_out_error:
8239 printf("Function requires 2 integer values: fade_out(int type, int speed)\n");
8240 return E_FAIL;
8243 //changepalette(index);
8244 s32 openbor_changepalette(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8245 s32 index;
8247 *pretvar = NULL;
8249 if(paramCount < 1)
8250 goto changepalette_error;
8252 if(FAILED(ScriptVariant_IntegerValue((varlist[0]), &index)))
8253 goto changepalette_error;
8255 change_system_palette((int) index);
8257 return S_OK;
8259 changepalette_error:
8260 printf("Function requires 1 integer value: changepalette(int index)\n");
8261 return E_FAIL;
8264 //changelight(x, z);
8265 s32 openbor_changelight(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8266 s32 x, z;
8267 extern int light[2];
8268 ScriptVariant *arg = NULL;
8270 *pretvar = NULL;
8271 if(paramCount < 2)
8272 goto changelight_error;
8274 arg = varlist[0];
8275 if(arg->vt != VT_EMPTY) {
8276 if(FAILED(ScriptVariant_IntegerValue(arg, &x)))
8277 goto changelight_error;
8278 light[0] = (int) x;
8281 arg = varlist[1];
8282 if(arg->vt != VT_EMPTY) {
8283 if(FAILED(ScriptVariant_IntegerValue(arg, &z)))
8284 goto changelight_error;
8285 light[1] = (int) z;
8288 return S_OK;
8289 changelight_error:
8290 printf("Function requires 2 integer values: changepalette(int x, int z)\n");
8291 return E_FAIL;
8294 //changeshadowcolor(color, alpha);
8295 // color = 0 means no gfxshadow, -1 means don't fill the shadow with colour
8296 // alpha default to 2, <=0 means no alpha effect
8297 s32 openbor_changeshadowcolor(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8298 s32 c, a;
8299 extern int shadowalpha;
8301 *pretvar = NULL;
8302 if(paramCount < 1)
8303 goto changeshadowcolor_error;
8305 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &c)))
8306 goto changeshadowcolor_error;
8308 colors.shadow = (int) c;
8310 if(paramCount > 1) {
8311 if(FAILED(ScriptVariant_IntegerValue(varlist[1], &a)))
8312 goto changeshadowcolor_error;
8313 shadowalpha = (int) a;
8316 return S_OK;
8317 changeshadowcolor_error:
8318 printf
8319 ("Function requires at least 1 integer value, the 2nd integer parameter is optional: changepalette(int colorindex, int alpha)\n");
8320 return E_FAIL;
8323 // ===== gettextobjproperty(name, value) =====
8324 enum gtop_enum {
8325 _gtop_font,
8326 _gtop_text,
8327 _gtop_time,
8328 _gtop_x,
8329 _gtop_y,
8330 _gtop_z,
8331 _gtop_the_end,
8334 void mapstrings_gettextobjproperty(ScriptVariant ** varlist, int paramCount) {
8335 char *propname = NULL;
8336 int prop;
8338 static const char *proplist[] = {
8339 "font",
8340 "text",
8341 "time" "x",
8342 "y",
8343 "z",
8346 if(paramCount < 2)
8347 return;
8349 MAPSTRINGS(varlist[1], proplist, _gtop_the_end,
8350 "Property name '%s' is not supported by function gettextobjproperty.\n");
8353 s32 openbor_gettextobjproperty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8354 s32 ind;
8355 int propind;
8357 if(paramCount < 2)
8358 goto gettextobjproperty_error;
8361 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &ind))) {
8362 printf("Function's 1st argument must be a numeric value: gettextproperty(int index, \"property\")\n");
8363 goto gettextobjproperty_error;
8366 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8367 mapstrings_gettextobjproperty(varlist, paramCount);
8369 if(ind < 0 || ind >= LEVEL_MAX_TEXTOBJS) {
8370 (*pretvar)->lVal = 0;
8371 return S_OK;
8374 if(varlist[1]->vt != VT_INTEGER) {
8375 if(varlist[1]->vt != VT_STR)
8376 printf("Function gettextobjproperty must have a string property name.\n");
8377 goto gettextobjproperty_error;
8380 propind = varlist[1]->lVal;
8382 switch (propind) {
8383 case _gtop_font:
8385 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8386 (*pretvar)->lVal = (s32) level->textobjs[ind].font;
8387 break;
8389 case _gtop_text:
8391 ScriptVariant_ChangeType(*pretvar, VT_STR);
8392 strcpy(StrCache_Get((*pretvar)->strVal), level->textobjs[ind].text);
8393 break;
8395 case _gtop_time:
8397 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8398 (*pretvar)->lVal = (s32) level->textobjs[ind].t;
8399 break;
8401 case _gtop_x:
8403 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8404 (*pretvar)->lVal = (s32) level->textobjs[ind].x;
8405 break;
8407 case _gtop_y:
8409 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8410 (*pretvar)->lVal = (s32) level->textobjs[ind].y;
8411 break;
8413 case _gtop_z:
8415 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8416 (*pretvar)->lVal = (s32) level->textobjs[ind].z;
8417 break;
8419 default:
8420 //printf("Property name '%s' is not supported by function gettextobjproperty.\n", propname);
8421 goto gettextobjproperty_error;
8422 break;
8425 return S_OK;
8427 gettextobjproperty_error:
8428 *pretvar = NULL;
8429 return E_FAIL;
8432 // ===== changetextobjproperty(name, value) =====
8433 enum ctop_enum {
8434 _ctop_font,
8435 _ctop_text,
8436 _ctop_time,
8437 _ctop_x,
8438 _ctop_y,
8439 _ctop_z,
8440 _ctop_the_end,
8443 void mapstrings_changetextobjproperty(ScriptVariant ** varlist, int paramCount) {
8444 char *propname = NULL;
8445 int prop;
8447 static const char *proplist[] = {
8448 "font",
8449 "text",
8450 "time",
8451 "x",
8452 "y",
8453 "z",
8456 if(paramCount < 2)
8457 return;
8458 MAPSTRINGS(varlist[1], proplist, _ctop_the_end,
8459 "Property name '%s' is not supported by function changetextobjproperty.\n");
8462 s32 openbor_changetextobjproperty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8463 s32 ind;
8464 int propind;
8465 s32 ltemp;
8467 if(paramCount < 3)
8468 goto changetextobjproperty_error;
8471 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &ind))) {
8472 printf
8473 ("Function's 1st argument must be a numeric value: changetextobjproperty(int index, \"property\", value)\n");
8474 goto changetextobjproperty_error;
8477 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8478 mapstrings_changetextobjproperty(varlist, paramCount);
8480 if(ind < 0 || ind >= LEVEL_MAX_TEXTOBJS) {
8481 (*pretvar)->lVal = 0;
8482 return S_OK;
8485 if(varlist[1]->vt != VT_INTEGER) {
8486 if(varlist[1]->vt != VT_STR)
8487 printf("Function changetextobjproperty must have a string property name.\n");
8488 goto changetextobjproperty_error;
8491 propind = varlist[1]->lVal;
8493 switch (propind) {
8494 case _ctop_font:
8496 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
8497 (*pretvar)->lVal = (s32) 1;
8498 level->textobjs[ind].font = (int) ltemp;
8500 break;
8502 case _ctop_text:
8504 if(varlist[2]->vt != VT_STR) {
8505 printf("You must give a string value for textobj text.\n");
8506 goto changetextobjproperty_error;
8508 if(!level->textobjs[ind].text) {
8509 level->textobjs[ind].text = (char *) malloc(MAX_STR_VAR_LEN);
8511 strncpy(level->textobjs[ind].text, (char *) StrCache_Get(varlist[2]->strVal),
8512 MAX_STR_VAR_LEN);
8513 //level->textobjs[ind].text = (char*)StrCache_Get(varlist[2]->strVal);
8514 (*pretvar)->lVal = (s32) 1;
8515 break;
8517 case _ctop_time:
8519 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
8520 (*pretvar)->lVal = (s32) 1;
8521 level->textobjs[ind].t = (int) ltemp;
8523 break;
8525 case _ctop_x:
8527 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
8528 (*pretvar)->lVal = (s32) 1;
8529 level->textobjs[ind].x = (int) ltemp;
8531 break;
8533 case _ctop_y:
8535 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
8536 (*pretvar)->lVal = (s32) 1;
8537 level->textobjs[ind].y = (int) ltemp;
8539 break;
8541 case _ctop_z:
8543 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
8544 (*pretvar)->lVal = (s32) 1;
8545 level->textobjs[ind].z = (int) ltemp;
8547 break;
8549 default:
8550 //printf("Property name '%s' is not supported by function changetextobjproperty.\n", propname);
8551 goto changetextobjproperty_error;
8552 break;
8555 return S_OK;
8557 changetextobjproperty_error:
8558 *pretvar = NULL;
8559 return E_FAIL;
8562 // changelevelproperty(name, value)
8563 s32 openbor_settextobj(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8564 s32 ind;
8565 s32 ltemp;
8567 if(paramCount < 6)
8568 goto settextobj_error;
8570 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &ind))) {
8571 printf
8572 ("Function's 1st argument must be a numeric value: settextobj(int index, int x, int y, int font, int z, char text, int time {optional})\n");
8573 goto settextobj_error;
8576 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8578 if(ind < 0 || ind >= LEVEL_MAX_TEXTOBJS) {
8579 (*pretvar)->lVal = 0;
8580 return S_OK;
8583 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[1], &ltemp))) {
8584 (*pretvar)->lVal = (s32) 1;
8585 level->textobjs[ind].x = (int) ltemp;
8588 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
8589 (*pretvar)->lVal = (s32) 1;
8590 level->textobjs[ind].y = (int) ltemp;
8593 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[3], &ltemp))) {
8594 (*pretvar)->lVal = (s32) 1;
8595 level->textobjs[ind].font = (int) ltemp;
8598 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[4], &ltemp))) {
8599 (*pretvar)->lVal = (s32) 1;
8600 level->textobjs[ind].z = (int) ltemp;
8603 if(varlist[5]->vt != VT_STR) {
8604 printf("You must give a string value for textobj text.\n");
8605 goto settextobj_error;
8608 if(paramCount >= 7) {
8609 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[6], &ltemp))) {
8610 (*pretvar)->lVal = (s32) 1;
8611 level->textobjs[ind].t = (int) ltemp;
8615 if(!level->textobjs[ind].text) {
8616 level->textobjs[ind].text = (char *) malloc(MAX_STR_VAR_LEN);
8618 strncpy(level->textobjs[ind].text, (char *) StrCache_Get(varlist[5]->strVal), MAX_STR_VAR_LEN);
8619 (*pretvar)->lVal = (s32) 1;
8621 return S_OK;
8623 settextobj_error:
8624 *pretvar = NULL;
8625 return E_FAIL;
8628 s32 openbor_cleartextobj(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8629 s32 ind;
8631 if(paramCount < 1)
8632 goto cleartextobj_error;
8635 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &ind))) {
8636 printf("Function's 1st argument must be a numeric value: cleartextobj(int index)\n");
8637 goto cleartextobj_error;
8640 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8642 if(ind < 0 || ind >= LEVEL_MAX_TEXTOBJS) {
8643 (*pretvar)->lVal = 0;
8644 return S_OK;
8647 level->textobjs[ind].t = 0;
8648 level->textobjs[ind].x = 0;
8649 level->textobjs[ind].y = 0;
8650 level->textobjs[ind].font = 0;
8651 level->textobjs[ind].z = 0;
8652 if(level->textobjs[ind].text)
8653 free(level->textobjs[ind].text);
8654 level->textobjs[ind].text = NULL;
8655 return S_OK;
8657 cleartextobj_error:
8658 *pretvar = NULL;
8659 return E_FAIL;
8663 // ===== getbglayerproperty ======
8664 enum getbglp_enum {
8665 _gbglp_alpha,
8666 _gbglp_amplitude,
8667 _gbglp_bgspeedratio,
8668 _gbglp_enabled,
8669 _gbglp_transparency,
8670 _gbglp_watermode,
8671 _gbglp_wavelength,
8672 _gbglp_wavespeed,
8673 _gbglp_xoffset,
8674 _gbglp_xratio,
8675 _gbglp_xrepeat,
8676 _gbglp_xspacing,
8677 _gbglp_zoffset,
8678 _gbglp_zratio,
8679 _gbglp_zrepeat,
8680 _gbglp_zspacing,
8681 _gbglp_the_end,
8684 void mapstrings_getbglayerproperty(ScriptVariant ** varlist, int paramCount) {
8685 char *propname = NULL;
8686 int prop;
8688 static const char *proplist[] = {
8689 "alpha",
8690 "amplitude",
8691 "bgspeedratio",
8692 "enabled",
8693 "transparency",
8694 "watermode",
8695 "wavelength",
8696 "wavespeed",
8697 "xoffset",
8698 "xratio",
8699 "xrepeat",
8700 "xspacing",
8701 "zoffset",
8702 "zratio",
8703 "zrepeat",
8704 "zspacing",
8707 if(paramCount < 2)
8708 return;
8709 MAPSTRINGS(varlist[1], proplist, _gbglp_the_end,
8710 "Property name '%s' is not supported by function getbglayerproperty.\n");
8713 s32 openbor_getbglayerproperty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8714 s32 ind;
8715 int propind;
8717 if(paramCount < 2)
8718 goto getbglayerproperty_error;
8720 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &ind))) {
8721 printf
8722 ("Function's 1st argument must be a numeric value: getbglayerproperty(int index, \"property\", value)\n");
8723 goto getbglayerproperty_error;
8726 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8727 mapstrings_getbglayerproperty(varlist, paramCount);
8729 if(ind < 0 || ind >= level->numbglayers) {
8730 (*pretvar)->lVal = 0;
8731 return S_OK;
8734 if(varlist[1]->vt != VT_INTEGER) {
8735 printf("Function getbglayerproperty must have a string property name.\n");
8736 goto getbglayerproperty_error;
8739 propind = varlist[1]->lVal;
8741 switch (propind) {
8742 case _gbglp_alpha:
8744 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8745 (*pretvar)->lVal = (s32) level->bglayers[ind].alpha;
8746 break;
8748 case _gbglp_amplitude:
8750 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8751 (*pretvar)->lVal = (s32) level->bglayers[ind].amplitude;
8752 break;
8754 case _gbglp_bgspeedratio:
8756 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
8757 (*pretvar)->dblVal = (double) level->bglayers[ind].bgspeedratio;
8758 break;
8760 case _gbglp_enabled:
8762 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8763 (*pretvar)->lVal = (s32) level->bglayers[ind].enabled;
8764 break;
8766 case _gbglp_transparency:
8768 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8769 (*pretvar)->lVal = (s32) level->bglayers[ind].transparency;
8770 break;
8772 case _gbglp_watermode:
8774 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8775 (*pretvar)->lVal = (s32) level->bglayers[ind].watermode;
8776 break;
8779 case _gbglp_wavelength:
8781 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8782 (*pretvar)->lVal = (s32) level->bglayers[ind].wavelength;
8783 break;
8785 case _gbglp_wavespeed:
8787 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
8788 (*pretvar)->dblVal = (double) level->bglayers[ind].wavespeed;
8789 break;
8791 case _gbglp_xoffset:
8793 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8794 (*pretvar)->lVal = (s32) level->bglayers[ind].xoffset;
8795 break;
8797 case _gbglp_xratio:
8799 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
8800 (*pretvar)->dblVal = (double) level->bglayers[ind].xratio;
8801 break;
8803 case _gbglp_xrepeat:
8805 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8806 (*pretvar)->lVal = (s32) level->bglayers[ind].xrepeat;
8807 break;
8809 case _gbglp_xspacing:
8811 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8812 (*pretvar)->lVal = (s32) level->bglayers[ind].xspacing;
8813 break;
8815 case _gbglp_zoffset:
8817 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8818 (*pretvar)->lVal = (s32) level->bglayers[ind].zoffset;
8819 break;
8821 case _gbglp_zratio:
8823 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
8824 (*pretvar)->dblVal = (double) level->bglayers[ind].zratio;
8825 break;
8827 case _gbglp_zrepeat:
8829 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8830 (*pretvar)->lVal = (s32) level->bglayers[ind].zrepeat;
8831 break;
8833 case _gbglp_zspacing:
8835 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8836 (*pretvar)->lVal = (s32) level->bglayers[ind].zspacing;
8837 break;
8839 default:
8840 //printf("Property name '%s' is not supported by function getbglayerproperty.\n", propname);
8841 goto getbglayerproperty_error;
8842 break;
8845 return S_OK;
8847 getbglayerproperty_error:
8848 *pretvar = NULL;
8849 return E_FAIL;
8852 // ===== changebglayerproperty =====
8853 enum cbglp_enum {
8854 _cbglp_alpha,
8855 _cbglp_amplitude,
8856 _cbglp_bgspeedratio,
8857 _cbglp_enabled,
8858 _cbglp_transparency,
8859 _cbglp_watermode,
8860 _cbglp_wavelength,
8861 _cbglp_wavespeed,
8862 _cbglp_xoffset,
8863 _cbglp_xratio,
8864 _cbglp_xrepeat,
8865 _cbglp_xspacing,
8866 _cbglp_zoffset,
8867 _cbglp_zratio,
8868 _cbglp_zrepeat,
8869 _cbglp_zspacing,
8870 _cbglp_the_end,
8873 void mapstrings_changebglayerproperty(ScriptVariant ** varlist, int paramCount) {
8874 char *propname = NULL;
8875 int prop;
8877 static const char *proplist[] = {
8878 "alpha",
8879 "amplitude",
8880 "bgspeedratio",
8881 "enabled",
8882 "transparency",
8883 "watermode",
8884 "wavelength",
8885 "wavespeed",
8886 "xoffset",
8887 "xratio",
8888 "xrepeat",
8889 "xspacing",
8890 "zoffset",
8891 "zratio",
8892 "zrepeat",
8893 "zspacing",
8896 if(paramCount < 2)
8897 return;
8898 MAPSTRINGS(varlist[1], proplist, _cbglp_the_end,
8899 "Property name '%s' is not supported by function changebglayerproperty.\n");
8902 s32 openbor_changebglayerproperty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
8903 s32 ind;
8904 int propind;
8905 s32 ltemp;
8906 double dbltemp;
8908 if(paramCount < 3)
8909 goto changebglayerproperty_error;
8912 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &ind))) {
8913 printf
8914 ("Function's 1st argument must be a numeric value: changebglayerproperty(int index, \"property\", value)\n");
8915 goto changebglayerproperty_error;
8918 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
8919 mapstrings_changebglayerproperty(varlist, paramCount);
8921 if(ind < 0 || ind >= level->numbglayers) {
8922 (*pretvar)->lVal = 0;
8923 return S_OK;
8926 if(varlist[1]->vt != VT_INTEGER) {
8927 printf("Function changebglayerproperty must have a string property name.\n");
8928 goto changebglayerproperty_error;
8931 propind = varlist[1]->lVal;
8933 switch (propind) {
8934 case _cbglp_alpha:
8936 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
8937 (*pretvar)->lVal = (s32) 1;
8938 level->bglayers[ind].alpha = (int) ltemp;
8940 break;
8942 case _cbglp_amplitude:
8944 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
8945 (*pretvar)->lVal = (s32) 1;
8946 level->bglayers[ind].amplitude = (int) ltemp;
8948 break;
8950 case _cbglp_bgspeedratio:
8952 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
8953 (*pretvar)->lVal = (s32) 1;
8954 level->bglayers[ind].bgspeedratio = (float) dbltemp;
8956 break;
8958 case _cbglp_enabled:
8960 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
8961 (*pretvar)->lVal = (s32) 1;
8962 level->bglayers[ind].enabled = (int) ltemp;
8964 break;
8966 case _cbglp_transparency:
8968 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
8969 (*pretvar)->lVal = (s32) 1;
8970 level->bglayers[ind].transparency = (int) ltemp;
8972 break;
8974 case _cbglp_watermode:
8976 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
8977 (*pretvar)->lVal = (s32) 1;
8978 level->bglayers[ind].watermode = (int) ltemp;
8980 break;
8983 case _cbglp_wavelength:
8985 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
8986 (*pretvar)->lVal = (s32) 1;
8987 level->bglayers[ind].wavelength = (int) ltemp;
8989 break;
8991 case _cbglp_wavespeed:
8993 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
8994 (*pretvar)->lVal = (s32) 1;
8995 level->bglayers[ind].wavespeed = (float) dbltemp;
8997 break;
8999 case _cbglp_xoffset:
9001 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9002 (*pretvar)->lVal = (s32) 1;
9003 level->bglayers[ind].xoffset = (int) ltemp;
9005 break;
9007 case _cbglp_xratio:
9009 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
9010 (*pretvar)->lVal = (s32) 1;
9011 level->bglayers[ind].xratio = (float) dbltemp;
9013 break;
9015 case _cbglp_xrepeat:
9017 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9018 (*pretvar)->lVal = (s32) 1;
9019 level->bglayers[ind].xrepeat = (int) ltemp;
9021 break;
9023 case _cbglp_xspacing:
9025 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9026 (*pretvar)->lVal = (s32) 1;
9027 level->bglayers[ind].xspacing = (int) ltemp;
9029 break;
9031 case _cbglp_zoffset:
9033 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9034 (*pretvar)->lVal = (s32) 1;
9035 level->bglayers[ind].zoffset = (int) ltemp;
9037 break;
9039 case _cbglp_zratio:
9041 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
9042 (*pretvar)->lVal = (s32) 1;
9043 level->bglayers[ind].zratio = (float) dbltemp;
9045 break;
9047 case _cbglp_zrepeat:
9049 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9050 (*pretvar)->lVal = (s32) 1;
9051 level->bglayers[ind].zrepeat = (int) ltemp;
9053 break;
9055 case _cbglp_zspacing:
9057 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9058 (*pretvar)->lVal = (s32) 1;
9059 level->bglayers[ind].zspacing = (int) ltemp;
9061 break;
9063 default:
9064 //printf("Property name '%s' is not supported by function changebglayerproperty.\n", propname);
9065 goto changebglayerproperty_error;
9066 break;
9069 return S_OK;
9071 changebglayerproperty_error:
9072 *pretvar = NULL;
9073 return E_FAIL;
9076 // ===== getfglayerproperty =====
9077 enum gfglp_enum {
9078 _gfglp_alpha,
9079 _gfglp_amplitude,
9080 _gfglp_bgspeedratio,
9081 _gfglp_enabled,
9082 _gfglp_transparency,
9083 _gfglp_watermode,
9084 _gfglp_wavelength,
9085 _gfglp_wavespeed,
9086 _gfglp_xoffset,
9087 _gfglp_xratio,
9088 _gfglp_xrepeat,
9089 _gfglp_xspacing,
9090 _gfglp_zoffset,
9091 _gfglp_zratio,
9092 _gfglp_zrepeat,
9093 _gfglp_zspacing,
9094 _gfglp_the_end,
9097 void mapstrings_getfglayerproperty(ScriptVariant ** varlist, int paramCount) {
9098 char *propname = NULL;
9099 int prop;
9101 static const char *proplist[] = {
9102 "alpha",
9103 "amplitude",
9104 "bgspeedratio",
9105 "enabled",
9106 "transparency",
9107 "watermode",
9108 "wavelength",
9109 "wavespeed",
9110 "xoffset",
9111 "xratio",
9112 "xrepeat",
9113 "xspacing",
9114 "zoffset",
9115 "zratio",
9116 "zrepeat",
9117 "zspacing",
9120 if(paramCount < 2)
9121 return;
9122 MAPSTRINGS(varlist[1], proplist, _gfglp_the_end,
9123 "Property name '%s' is not supported by function getfglayerproperty.\n");
9126 s32 openbor_getfglayerproperty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
9127 s32 ind;
9128 int propind;
9130 if(paramCount < 2)
9131 goto getfglayerproperty_error;
9134 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &ind))) {
9135 printf
9136 ("Function's 1st argument must be a numeric value: getfglayerproperty(int index, \"property\", value)\n");
9137 goto getfglayerproperty_error;
9140 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9141 mapstrings_getfglayerproperty(varlist, paramCount);
9143 if(ind < 0 || ind >= level->numfglayers) {
9144 (*pretvar)->lVal = 0;
9145 return S_OK;
9148 if(varlist[1]->vt != VT_INTEGER) {
9149 printf("Function getfglayerproperty must have a string property name.\n");
9150 goto getfglayerproperty_error;
9153 propind = varlist[1]->lVal;
9155 switch (propind) {
9156 case _gfglp_alpha:
9158 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9159 (*pretvar)->lVal = (s32) level->fglayers[ind].alpha;
9160 break;
9162 case _gfglp_amplitude:
9164 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9165 (*pretvar)->lVal = (s32) level->fglayers[ind].amplitude;
9166 break;
9168 case _gfglp_bgspeedratio:
9170 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
9171 (*pretvar)->dblVal = (double) level->fglayers[ind].bgspeedratio;
9172 break;
9174 case _gfglp_enabled:
9176 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9177 (*pretvar)->lVal = (s32) level->fglayers[ind].enabled;
9178 break;
9180 case _gfglp_transparency:
9182 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9183 (*pretvar)->lVal = (s32) level->fglayers[ind].transparency;
9184 break;
9186 case _gfglp_watermode:
9188 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9189 (*pretvar)->lVal = (s32) level->fglayers[ind].watermode;
9190 break;
9193 case _gfglp_wavelength:
9195 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9196 (*pretvar)->lVal = (s32) level->fglayers[ind].wavelength;
9197 break;
9199 case _gfglp_wavespeed:
9201 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
9202 (*pretvar)->dblVal = (double) level->fglayers[ind].wavespeed;
9203 break;
9205 case _gfglp_xoffset:
9207 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9208 (*pretvar)->lVal = (s32) level->fglayers[ind].xoffset;
9209 break;
9211 case _gfglp_xratio:
9213 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
9214 (*pretvar)->dblVal = (double) level->fglayers[ind].xratio;
9215 break;
9217 case _gfglp_xrepeat:
9219 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9220 (*pretvar)->lVal = (s32) level->fglayers[ind].xrepeat;
9221 break;
9223 case _gfglp_xspacing:
9225 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9226 (*pretvar)->lVal = (s32) level->fglayers[ind].xspacing;
9227 break;
9229 case _gfglp_zoffset:
9231 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9232 (*pretvar)->lVal = (s32) level->fglayers[ind].zoffset;
9233 break;
9235 case _gfglp_zratio:
9237 ScriptVariant_ChangeType(*pretvar, VT_DECIMAL);
9238 (*pretvar)->dblVal = (double) level->fglayers[ind].zratio;
9239 break;
9241 case _gfglp_zrepeat:
9243 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9244 (*pretvar)->lVal = (s32) level->fglayers[ind].zrepeat;
9245 break;
9247 case _gfglp_zspacing:
9249 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9250 (*pretvar)->lVal = (s32) level->fglayers[ind].zspacing;
9251 break;
9253 default:
9254 //printf("Property name '%s' is not supported by function getfglayerproperty.\n", propname);
9255 goto getfglayerproperty_error;
9256 break;
9259 return S_OK;
9261 getfglayerproperty_error:
9262 *pretvar = NULL;
9263 return E_FAIL;
9266 // ===== changefglayerproperty =====
9267 typedef enum {
9268 _cfglp_alpha,
9269 _cfglp_amplitude,
9270 _cfglp_bgspeedratio,
9271 _cfglp_enabled,
9272 _cfglp_transparency,
9273 _cfglp_watermode,
9274 _cfglp_wavelength,
9275 _cfglp_wavespeed,
9276 _cfglp_xoffset,
9277 _cfglp_xratio,
9278 _cfglp_xrepeat,
9279 _cfglp_xspacing,
9280 _cfglp_zoffset,
9281 _cfglp_zratio,
9282 _cfglp_zrepeat,
9283 _cfglp_zspacing,
9284 _cfglp_the_end,
9285 } prop_enum;
9287 void mapstrings_changefglayerproperty(ScriptVariant ** varlist, int paramCount) {
9288 char *propname = NULL;
9289 int prop;
9291 static const char *proplist[] = {
9292 "alpha",
9293 "amplitude",
9294 "bgspeedratio",
9295 "enabled",
9296 "transparency",
9297 "watermode",
9298 "wavelength",
9299 "wavespeed",
9300 "xoffset",
9301 "xratio",
9302 "xrepeat",
9303 "xspacing",
9304 "zoffset",
9305 "zratio",
9306 "zrepeat",
9307 "zspacing",
9310 if(paramCount < 2)
9311 return;
9312 MAPSTRINGS(varlist[1], proplist, _cfglp_the_end,
9313 "Property name '%s' is not supported by function changefglayerproperty.\n");
9316 s32 openbor_changefglayerproperty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
9317 s32 ind;
9318 int propind;
9319 s32 ltemp;
9320 double dbltemp;
9322 if(paramCount < 3)
9323 goto changefglayerproperty_error;
9325 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &ind))) {
9326 printf
9327 ("Function's 1st argument must be a numeric value: changefglayerproperty(int index, \"property\", value)\n");
9328 goto changefglayerproperty_error;
9331 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9332 mapstrings_changefglayerproperty(varlist, paramCount);
9334 if(ind < 0 || ind >= level->numfglayers) {
9335 (*pretvar)->lVal = 0;
9336 return S_OK;
9339 if(varlist[1]->vt != VT_INTEGER) {
9340 printf("Function changefglayerproperty must have a string property name.\n");
9341 goto changefglayerproperty_error;
9344 propind = varlist[1]->lVal;
9346 switch (propind) {
9347 case _cfglp_alpha:
9349 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9350 (*pretvar)->lVal = (s32) 1;
9351 level->fglayers[ind].alpha = (int) ltemp;
9353 break;
9355 case _cfglp_amplitude:
9357 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9358 (*pretvar)->lVal = (s32) 1;
9359 level->fglayers[ind].amplitude = (int) ltemp;
9361 break;
9363 case _cfglp_bgspeedratio:
9365 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
9366 (*pretvar)->lVal = (s32) 1;
9367 level->fglayers[ind].bgspeedratio = (float) dbltemp;
9369 break;
9371 case _cfglp_enabled:
9373 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9374 (*pretvar)->lVal = (s32) 1;
9375 level->fglayers[ind].enabled = (int) ltemp;
9377 break;
9379 case _cfglp_transparency:
9381 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9382 (*pretvar)->lVal = (s32) 1;
9383 level->fglayers[ind].transparency = (int) ltemp;
9385 break;
9387 case _cfglp_watermode:
9389 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9390 (*pretvar)->lVal = (s32) 1;
9391 level->fglayers[ind].watermode = (int) ltemp;
9393 break;
9396 case _cfglp_wavelength:
9398 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9399 (*pretvar)->lVal = (s32) 1;
9400 level->fglayers[ind].wavelength = (int) ltemp;
9402 break;
9404 case _cfglp_wavespeed:
9406 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
9407 (*pretvar)->lVal = (s32) 1;
9408 level->fglayers[ind].wavespeed = (float) dbltemp;
9410 break;
9412 case _cfglp_xoffset:
9414 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9415 (*pretvar)->lVal = (s32) 1;
9416 level->fglayers[ind].xoffset = (int) ltemp;
9418 break;
9420 case _cfglp_xratio:
9422 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
9423 (*pretvar)->lVal = (s32) 1;
9424 level->fglayers[ind].xratio = (float) dbltemp;
9426 break;
9428 case _cfglp_xrepeat:
9430 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9431 (*pretvar)->lVal = (s32) 1;
9432 level->fglayers[ind].xrepeat = (int) ltemp;
9434 break;
9436 case _cfglp_xspacing:
9438 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9439 (*pretvar)->lVal = (s32) 1;
9440 level->fglayers[ind].xspacing = (int) ltemp;
9442 break;
9444 case _cfglp_zoffset:
9446 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9447 (*pretvar)->lVal = (s32) 1;
9448 level->fglayers[ind].zoffset = (int) ltemp;
9450 break;
9452 case _cfglp_zratio:
9454 if(SUCCEEDED(ScriptVariant_DecimalValue(varlist[2], &dbltemp))) {
9455 (*pretvar)->lVal = (s32) 1;
9456 level->fglayers[ind].zratio = (float) dbltemp;
9458 break;
9460 case _cfglp_zrepeat:
9462 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9463 (*pretvar)->lVal = (s32) 1;
9464 level->fglayers[ind].zrepeat = (int) ltemp;
9466 break;
9468 case _cfglp_zspacing:
9470 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[2], &ltemp))) {
9471 (*pretvar)->lVal = (s32) 1;
9472 level->fglayers[ind].zspacing = (int) ltemp;
9474 break;
9476 default:
9477 //printf("Property name '%s' is not supported by function changefglayerproperty.\n", propname);
9478 goto changefglayerproperty_error;
9479 break;
9482 return S_OK;
9484 changefglayerproperty_error:
9485 *pretvar = NULL;
9486 return E_FAIL;
9489 s32 openbor_getlevelproperty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
9490 char *propname = NULL;
9491 int propind;
9493 static const char *proplist[] = {
9494 "bgspeed",
9495 "cameraxoffset",
9496 "camerazoffset",
9499 typedef enum {
9500 _lp_bgspeed,
9501 _lp_cameraxoffset,
9502 _lp_camerazoffset,
9503 _lp_the_end, // lol
9504 } prop_enum;
9508 if(varlist[0]->vt != VT_STR) {
9509 printf("Function getlevelproperty must have a string property name.\n");
9510 goto getlevelproperty_error;
9514 propname = (char *) StrCache_Get(varlist[0]->strVal); //see what property it is
9516 propind = searchList(proplist, propname, _lp_the_end);
9518 switch (propind) {
9519 case _lp_bgspeed:
9521 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9522 (*pretvar)->lVal = (s32) level->bgspeed;
9523 break;
9525 case _lp_cameraxoffset:
9527 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9528 (*pretvar)->lVal = (s32) level->cameraxoffset;
9529 break;
9531 case _lp_camerazoffset:
9533 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9534 (*pretvar)->lVal = (s32) level->camerazoffset;
9535 break;
9537 default:
9538 printf("Property name '%s' is not supported by function getlevelproperty.\n", propname);
9539 goto getlevelproperty_error;
9540 break;
9543 return S_OK;
9545 getlevelproperty_error:
9546 *pretvar = NULL;
9547 return E_FAIL;
9550 //changelevelproperty(name, value)
9551 s32 openbor_changelevelproperty(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
9552 char *propname = NULL;
9553 s32 ltemp;
9554 ScriptVariant *arg = NULL;
9556 if(paramCount < 2) {
9557 *pretvar = NULL;
9558 return E_FAIL;
9561 if(varlist[0]->vt != VT_STR) {
9562 *pretvar = NULL;
9563 return E_FAIL;
9566 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
9567 (*pretvar)->lVal = (s32) 1;
9569 propname = (char *) StrCache_Get(varlist[0]->strVal);
9571 arg = varlist[1];
9573 if(strcmp(propname, "rock") == 0) {
9574 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
9575 level->rocking = (int) ltemp;
9576 else
9577 (*pretvar)->lVal = (s32) 0;
9578 } else if(strcmp(propname, "bgspeed") == 0) {
9579 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
9580 level->bgspeed = (float) ltemp;
9581 else
9582 (*pretvar)->lVal = (s32) 0;
9583 } else if(strcmp(propname, "cameraxoffset") == 0) {
9584 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
9585 level->cameraxoffset = (int) ltemp;
9586 else
9587 (*pretvar)->lVal = (s32) 0;
9588 } else if(strcmp(propname, "camerazoffset") == 0) {
9589 if(SUCCEEDED(ScriptVariant_IntegerValue(arg, &ltemp)))
9590 level->camerazoffset = (int) ltemp;
9591 else
9592 (*pretvar)->lVal = (s32) 0;
9595 return S_OK;
9598 //jumptobranch(name, immediate)
9599 s32 openbor_jumptobranch(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
9600 s32 ltemp;
9601 extern char branch_name[MAX_NAME_LEN + 1];
9602 extern int endgame;
9604 *pretvar = NULL;
9605 if(paramCount < 1)
9606 goto jumptobranch_error;
9607 if(varlist[0]->vt != VT_STR)
9608 goto jumptobranch_error;
9610 strncpy(branch_name, StrCache_Get(varlist[0]->strVal), MIN(MAX_NAME_LEN, MAX_STR_VAR_LEN)); // copy the string value to branch name
9612 if(paramCount >= 2) {
9613 if(SUCCEEDED(ScriptVariant_IntegerValue(varlist[1], &ltemp))) {
9614 endgame = (int) ltemp;
9615 // 1 means goto that level immediately, or, wait until the level is complete
9616 } else
9617 goto jumptobranch_error;
9620 return S_OK;
9621 jumptobranch_error:
9622 printf
9623 ("Function requires 1 string value, the second argument is optional(int): jumptobranch(name, immediate)\n");
9624 return E_FAIL;
9627 //bindentity(entity, target, x, z, a, direction, bindanim);
9628 //bindentity(entity, NULL()); // unbind
9629 s32 openbor_bindentity(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
9630 entity *ent = NULL;
9631 entity *other = NULL;
9632 ScriptVariant *arg = NULL;
9633 void adjust_bind(entity * e);
9634 s32 x = 0, z = 0, a = 0, dir = 0, anim = 0;
9636 *pretvar = NULL;
9637 if(paramCount < 2) {
9638 return E_FAIL;
9641 ent = (entity *) (varlist[0])->ptrVal; //retrieve the entity
9642 if(!ent)
9643 return S_OK;
9645 other = (entity *) (varlist[1])->ptrVal;
9646 if(!other) {
9647 ent->bound = NULL;
9648 return S_OK;
9651 ent->bound = other;
9653 if(paramCount < 3)
9654 goto BIND;
9655 // x
9656 arg = varlist[2];
9657 if(arg->vt != VT_EMPTY) {
9658 if(FAILED(ScriptVariant_IntegerValue(arg, &x)))
9659 return E_FAIL;
9661 ent->bindoffset[0] = (int) x;
9663 if(paramCount < 4)
9664 goto BIND;
9665 // z
9666 arg = varlist[3];
9667 if(arg->vt != VT_EMPTY) {
9668 if(FAILED(ScriptVariant_IntegerValue(arg, &z)))
9669 return E_FAIL;
9670 ent->bindoffset[1] = (int) z;
9672 if(paramCount < 5)
9673 goto BIND;
9674 // a
9675 arg = varlist[4];
9676 if(arg->vt != VT_EMPTY) {
9677 if(FAILED(ScriptVariant_IntegerValue(arg, &a)))
9678 return E_FAIL;
9679 ent->bindoffset[2] = (int) a;
9681 if(paramCount < 6)
9682 goto BIND;
9683 // direction
9684 arg = varlist[5];
9685 if(arg->vt != VT_EMPTY) {
9686 if(FAILED(ScriptVariant_IntegerValue(arg, &dir)))
9687 return E_FAIL;
9688 ent->bindoffset[3] = (int) dir;
9690 if(paramCount < 7)
9691 goto BIND;
9692 // animation
9693 arg = varlist[6];
9694 if(arg->vt != VT_EMPTY) {
9695 if(FAILED(ScriptVariant_IntegerValue(arg, &anim)))
9696 return E_FAIL;
9697 ent->bindanim = (int) anim;
9700 BIND:
9701 adjust_bind(ent);
9703 return S_OK;
9706 //allocscreen(int w, int h);
9707 s32 openbor_allocscreen(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
9708 s32 w, h;
9709 s_screen *screen;
9711 if(paramCount < 2)
9712 goto allocscreen_error;
9714 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &w)))
9715 goto allocscreen_error;
9716 if(FAILED(ScriptVariant_IntegerValue(varlist[1], &h)))
9717 goto allocscreen_error;
9720 ScriptVariant_ChangeType(*pretvar, VT_PTR);
9721 screen = allocscreen((int) w, (int) h, screenformat);
9722 if(screen)
9723 clearscreen(screen);
9724 (*pretvar)->ptrVal = (void*) screen;
9726 if((*pretvar)->ptrVal == NULL) {
9727 printf("Not enough memory: allocscreen(%d, %d)\n", (int) w, (int) h);
9728 (*pretvar) = NULL;
9729 return E_FAIL;
9731 List_InsertAfter(&scriptheap, (void *) ((*pretvar)->ptrVal), "openbor_allocscreen");
9732 return S_OK;
9734 allocscreen_error:
9735 printf("Function requires 2 int values: allocscreen(int width, int height)\n");
9736 (*pretvar) = NULL;
9737 return E_FAIL;
9740 //clearscreen(s_screen* screen)
9741 s32 openbor_clearscreen(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
9742 s_screen *screen;
9744 *pretvar = NULL;
9745 if(paramCount != 1)
9746 goto clearscreen_error;
9747 if(varlist[0]->vt != VT_PTR)
9748 goto clearscreen_error;
9750 screen = (s_screen *) varlist[0]->ptrVal;
9752 if(screen == NULL) {
9753 printf("Error: NULL pointer passed to clearscreen(void screen)\n");
9754 *pretvar = NULL;
9755 return E_FAIL;
9757 clearscreen(screen);
9758 return S_OK;
9760 clearscreen_error:
9761 printf("Function requires a screen pointer: clearscreen(void screen)\n");
9762 return E_FAIL;
9765 //setdrawmethod(entity, int flag, int scalex, int scaley, int flipx, int flipy, int shiftx, int alpha, int remap, int fillcolor, int rotate, int fliprotate, int transparencybg, void* colourmap);
9766 s32 openbor_setdrawmethod(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
9767 s32 value[12];
9768 entity *e;
9769 s_drawmethod *pmethod;
9770 int i;
9772 *pretvar = NULL;
9773 if(paramCount < 2)
9774 goto setdrawmethod_error;
9776 if(varlist[0]->vt == VT_EMPTY)
9777 e = NULL;
9778 else if(varlist[0]->vt == VT_PTR)
9779 e = (entity *) varlist[0]->ptrVal;
9780 else
9781 goto setdrawmethod_error;
9783 if(e)
9784 pmethod = &(e->drawmethod);
9785 else
9786 pmethod = &(drawmethod);
9788 memset(value, 0, sizeof(s32) * 12);
9789 for(i = 1; i < paramCount && i < 13; i++) {
9790 if(FAILED(ScriptVariant_IntegerValue(varlist[i], value + i - 1)))
9791 goto setdrawmethod_error;
9794 if(paramCount >= 15 && varlist[13]->vt != VT_PTR && varlist[13]->vt != VT_EMPTY)
9795 goto setdrawmethod_error;
9797 pmethod->flag = (int) value[0];
9798 pmethod->scalex = (int) value[1];
9799 pmethod->scaley = (int) value[2];
9800 pmethod->flipx = (int) value[3];
9801 pmethod->flipy = (int) value[4];
9802 pmethod->shiftx = (int) value[5];
9803 pmethod->alpha = (int) value[6];
9804 pmethod->remap = (int) value[7];
9805 pmethod->fillcolor = (int) value[8];
9806 pmethod->rotate = ((int) value[9]) % 360;
9807 pmethod->fliprotate = (int) value[10];
9808 pmethod->transbg = (int) value[11];
9809 if(paramCount >= 14)
9810 pmethod->table = (unsigned char *) varlist[13]->ptrVal;
9812 if(pmethod->rotate) {
9813 if(pmethod->rotate < 0)
9814 pmethod->rotate += 360;
9816 return S_OK;
9818 setdrawmethod_error:
9819 printf
9820 ("Function need a valid entity handle and at least 1 interger parameter, all other parameters should be integers: setdrawmethod(entity, int flag, int scalex, int scaley, int flipx, int flipy, int shiftx, int alpha, int remap, int fillcolor, int rotate, int fliprotate, int transparencybg, void* colourmap)\n");
9821 return E_FAIL;
9824 //updateframe(entity, int frame);
9825 s32 openbor_updateframe(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
9826 s32 f;
9827 entity *e;
9828 void update_frame(entity * ent, int f);
9830 *pretvar = NULL;
9831 if(paramCount < 2)
9832 goto updateframe_error;
9834 if(varlist[0]->vt == VT_EMPTY)
9835 e = NULL;
9836 else if(varlist[0]->vt == VT_PTR)
9837 e = (entity *) varlist[0]->ptrVal;
9838 else
9839 goto updateframe_error;
9841 if(!e)
9842 goto updateframe_error;
9844 if(FAILED(ScriptVariant_IntegerValue(varlist[1], &f)))
9845 goto updateframe_error;
9847 update_frame(e, (int) f);
9849 return S_OK;
9851 updateframe_error:
9852 printf("Function need a valid entity handle and at an interger parameter: updateframe(entity, int frame)\n");
9853 return E_FAIL;
9856 //performattack(entity, int anim, int resetable);
9857 s32 openbor_performattack(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
9858 s32 anim, resetable = 0;
9859 entity *e;
9861 *pretvar = NULL;
9862 if(paramCount < 1)
9863 goto performattack_error;
9865 if(varlist[0]->vt == VT_EMPTY)
9866 e = NULL;
9867 else if(varlist[0]->vt == VT_PTR)
9868 e = (entity *) varlist[0]->ptrVal;
9869 else
9870 goto performattack_error;
9872 if(!e)
9873 goto performattack_error;
9875 e->takeaction = common_attack_proc;
9876 e->attacking = 1;
9877 e->idling = 0;
9878 e->drop = 0;
9879 e->falling = 0;
9880 e->inpain = 0;
9881 e->blocking = 0;
9883 if(paramCount == 1)
9884 return S_OK;
9886 if(paramCount > 1 && FAILED(ScriptVariant_IntegerValue(varlist[1], &anim)))
9887 goto performattack_error;
9888 if(paramCount > 2 && FAILED(ScriptVariant_IntegerValue(varlist[2], &resetable)))
9889 goto performattack_error;
9890 ent_set_anim(e, (int) anim, (int) resetable);
9892 return S_OK;
9894 performattack_error:
9895 printf
9896 ("Function need a valid entity handle, the other 2 integer parameters are optional: performattack(entity, int anim, int resetable)\n");
9897 return E_FAIL;
9900 //setidle(entity, int anim, int resetable, int stalladd);
9901 s32 openbor_setidle(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
9902 s32 anim, resetable = 0, stalladd;
9903 entity *e;
9905 *pretvar = NULL;
9906 if(paramCount < 1)
9907 goto setidle_error;
9909 if(varlist[0]->vt == VT_EMPTY)
9910 e = NULL;
9911 else if(varlist[0]->vt == VT_PTR)
9912 e = (entity *) varlist[0]->ptrVal;
9913 else
9914 goto setidle_error;
9916 if(!e)
9917 goto setidle_error;
9919 e->takeaction = NULL;
9920 e->attacking = 0;
9921 e->idling = 1;
9922 e->drop = 0;
9923 e->falling = 0;
9924 e->inpain = 0;
9925 e->blocking = 0;
9926 e->nograb = 0;
9928 if(paramCount == 1)
9929 return S_OK;
9931 if(paramCount > 1 && FAILED(ScriptVariant_IntegerValue(varlist[1], &anim)))
9932 goto setidle_error;
9933 if(paramCount > 2 && FAILED(ScriptVariant_IntegerValue(varlist[2], &resetable)))
9934 goto setidle_error;
9935 if(paramCount > 3 && FAILED(ScriptVariant_IntegerValue(varlist[3], &stalladd)))
9936 goto setidle_error;
9937 ent_set_anim(e, (int) anim, (int) resetable);
9939 if(stalladd > 0)
9940 e->stalltime = borTime + stalladd;
9942 return S_OK;
9944 setidle_error:
9945 printf
9946 ("Function need a valid entity handle, the other 2 integer parameters are optional: setidle(entity, int anim, int resetable, int stalladd)\n");
9947 return E_FAIL;
9950 //getentity(int index_from_list)
9951 s32 openbor_getentity(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
9952 s32 ind;
9953 extern entity *ent_list[MAX_ENTS];
9955 if(paramCount != 1)
9956 goto getentity_error;
9958 if(FAILED(ScriptVariant_IntegerValue(varlist[0], &ind)))
9959 goto getentity_error;
9961 ScriptVariant_Clear(*pretvar);
9963 if((int) ind < MAX_ENTS && (int) ind >= 0) {
9964 ScriptVariant_ChangeType(*pretvar, VT_PTR);
9965 (*pretvar)->ptrVal = (void*) ent_list[(int) ind];
9967 //else, it should return an empty value
9968 return S_OK;
9970 getentity_error:
9971 printf("Function need an integer parameter: getentity(int index_in_list)\n");
9972 *pretvar = NULL;
9973 return E_FAIL;
9977 //loadmodel(name)
9978 s32 openbor_loadmodel(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
9979 s32 unload = 0;
9980 if(paramCount < 1)
9981 goto loadmodel_error;
9982 if(varlist[0]->vt != VT_STR)
9983 goto loadmodel_error;
9985 ScriptVariant_ChangeType(*pretvar, VT_PTR);
9986 if(paramCount == 2)
9987 if(FAILED(ScriptVariant_IntegerValue(varlist[1], &unload)))
9988 goto loadmodel_error;
9990 (*pretvar)->ptrVal =
9991 (void*) load_cached_model(StrCache_Get(varlist[0]->strVal), "openbor_loadmodel", (char) unload);
9992 //else, it should return an empty value
9993 return S_OK;
9995 loadmodel_error:
9996 printf("Function needs a string and boolean parameters: loadmodel(name, unload)\n");
9997 ScriptVariant_Clear(*pretvar);
9998 *pretvar = NULL;
9999 return E_FAIL;
10002 // load a sprite which doesn't belong to the sprite_cache
10003 // loadsprite(path)
10004 s32 openbor_loadsprite(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
10005 extern s_sprite *loadsprite2(char *filename, int *width, int *height);
10006 if(paramCount != 1)
10007 goto loadsprite_error;
10009 if(varlist[0]->vt != VT_STR)
10010 goto loadsprite_error;
10012 ScriptVariant_ChangeType(*pretvar, VT_PTR);
10013 if(((*pretvar)->ptrVal = (void*) loadsprite2(StrCache_Get(varlist[0]->strVal), NULL, NULL))) {
10014 List_InsertAfter(&scriptheap, (void *) ((*pretvar)->ptrVal), "openbor_loadsprite");
10016 //else, it should return an empty value
10017 return S_OK;
10019 loadsprite_error:
10020 printf("Function need a string parameter: loadsprite(path)\n");
10021 ScriptVariant_Clear(*pretvar);
10022 *pretvar = NULL;
10023 return E_FAIL;
10026 //playgif(path, int x, int y, int noskip)
10027 s32 openbor_playgif(ScriptVariant ** varlist, ScriptVariant ** pretvar, int paramCount) {
10028 s32 temp[3] = { 0, 0, 0 }; //x,y,noskip
10029 int i;
10030 extern unsigned char pal[1024];
10031 extern int playgif(char *filename, int x, int y, int noskip);
10032 if(paramCount < 1)
10033 goto playgif_error;
10035 if(varlist[0]->vt != VT_STR)
10036 goto playgif_error;
10038 ScriptVariant_ChangeType(*pretvar, VT_INTEGER);
10039 for(i = 0; i < 3 && i < paramCount - 1; i++) {
10040 if(FAILED(ScriptVariant_IntegerValue(varlist[i + 1], temp + i)))
10041 goto playgif_error;
10043 (*pretvar)->lVal =
10044 (s32) playgif(StrCache_Get(varlist[0]->strVal), (int) (temp[0]), (int) (temp[1]), (int) (temp[2]));
10045 palette_set_corrected(pal, savedata.gamma, savedata.gamma, savedata.gamma, savedata.brightness,
10046 savedata.brightness, savedata.brightness);
10047 return S_OK;
10049 playgif_error:
10050 printf
10051 ("Function need a string parameter, other parameters are optional: playgif(path, int x, int y, int noskip)\n");
10052 *pretvar = NULL;
10053 return E_FAIL;