source: Daodan/src/Daodan_BSL.c@ 477

Last change on this file since 477 was 476, checked in by gumby, 15 years ago

Added Weapon information for dropped weapons
Started on adding new dsay colors

File size: 23.6 KB
Line 
1#include <stdio.h>
2#include <stdbool.h>
3#include <time.h>
4#include <ffi.h>
5
6#include "inifile.h"
7
8#include "Daodan_BSL.h"
9#include "Daodan_Utility.h"
10#include "Daodan_Patch.h"
11#include "Daodan_Console.h"
12#include "BFW_ScriptLang.h"
13#include "Oni.h"
14#include "Oni_Character.h"
15#include "oni_gl.h"
16#include "dSFMT\dSFMT.h"
17#include "Daodan_Character.h"
18
19uint16_t ONICALL bsl_int32mul(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
20{
21 ret->value_int32 = args[0].value_int32 * args[1].value_int32;
22 ret->type = sl_int32;
23 return 0;
24}
25
26uint16_t ONICALL bsl_mul(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
27{
28 double val1;
29 double val2;
30
31 if (args[0].type == sl_int32)
32 val1 = args[0].value_int32;
33 else
34 val1 = args[0].value_float;
35
36 if (args[1].type == sl_int32)
37 val2 = args[1].value_int32;
38 else
39 val2 = args[1].value_float;
40
41 ret->value_float = (float)(val1 * val2);
42 ret->type = sl_float;
43 return 0;
44}
45
46uint16_t ONICALL bsl_int32div(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
47{
48 ret->value_int32 = args[0].value_int32 / args[1].value_int32;
49 ret->type = sl_int32;
50 return 0;
51}
52
53uint16_t ONICALL bsl_div(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
54{
55 double val1;
56 double val2;
57
58 if (args[0].type == sl_int32)
59 val1 = args[0].value_int32;
60 else
61 val1 = args[0].value_float;
62
63 if (args[1].type == sl_int32)
64 val2 = args[1].value_int32;
65 else
66 val2 = args[1].value_float;
67
68 ret->value_float = (float)(val1 / val2);
69 ret->type = sl_float;
70 return 0;
71}
72
73uint16_t ONICALL bsl_int32rand(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
74{
75 int32_t start = 0;
76 int32_t end = 0;
77
78 if (args[0].value_int32 == args[1].value_int32)
79 return 1;
80 else if (args[0].value_int32 > args[1].value_int32)
81 {
82 start = args[1].value_int32;
83 end = args[0].value_int32;
84 }
85 else
86 {
87 start = args[0].value_int32;
88 end = args[1].value_int32;
89 }
90
91 ret->value_int32 = start + (dsfmt_gv_genrand_uint32() % (uint32_t)(end - start + 1));
92 ret->type = sl_int32;
93 return 0;
94}
95
96uint16_t ONICALL bsl_getkills(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
97{
98 int index;
99 if (numargs == 0) index = 0;
100 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
101 else index = args[0].value_int32;
102 int* killcount = ONgGameState + index * 0x16A0 + 0x1260 + 0x1670;
103 ret->value_int32 = *killcount;
104 ret->type = sl_int32;
105 return 0;
106}
107
108uint16_t ONICALL bsl_getdamage(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
109{
110 int index;
111 if (numargs == 0) index = 0;
112 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
113 else index = args[0].value_int32;
114 int* killcount = ONgGameState + index * 0x16A0 + 0x1260 + 0x1674;
115 ret->value_int32 = *killcount;
116 ret->type = sl_int32;
117 return 0;
118}
119
120uint16_t ONICALL bsl_returnoffset(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
121{
122 //int offset = 140;
123 //if (== 1) offset = 148;
124 //else index = args[0].value_int32;
125 int* killcount = ONgGameState + args[0].value_int32;
126 ret->value_int32 = *killcount;
127 ret->type = sl_int32;
128 return 0;
129}
130
131
132uint16_t ONICALL bsl_powerup(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
133{
134 int index;
135 if (numargs < 2 || args[1].type != sl_str32) return 1;
136 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
137 else index = args[0].value_int32;
138 void* returnval;
139 bool is_lsi = 0;
140 Character* Chr = ONgGameState + 0x1260;
141 if(!strcmp(args[1].value_str32,"ammo"))
142 {
143 returnval = &(Chr[index].Inventory_.AmmoUsed);
144 }
145 else if(!strcmp(args[1].value_str32,"hypo"))
146 {
147 returnval = &(Chr[index].Inventory_.HypoUsed);
148 }
149 else if(!strcmp(args[1].value_str32,"cells"))
150 {
151 returnval = &(Chr[index].Inventory_.CellsUsed);
152 }
153 else if(!strcmp(args[1].value_str32,"invis"))
154 {
155 returnval = &(Chr[index].Inventory_.CloakUsed);
156 }
157 else if(!strcmp(args[1].value_str32,"shield"))
158 {
159 returnval = &(Chr[index].Inventory_.ShieldUsed);
160 }
161 else if(!strcmp(args[1].value_str32,"lsi"))
162 {
163 returnval = &(Chr[index].Inventory_.hasLSI);
164 is_lsi = 1;
165 }
166// else if(!strcmp(args[1].value_str32,"bossshield"))
167// {
168// ret->value_int32 = Chr[index].Flags & char_bossshield;
169// ret->type = sl_int32;
170// if (numargs >=3) {
171// if (Chr[index].Flags & char_bossshield) Chr[index].Flags = Chr[index].Flags & ~char_bossshield;
172// else Chr[index].Flags = Chr[index].Flags | char_bossshield;
173// }
174// return 0;
175// }
176 else return 1;
177 //todo, add setting
178
179 if(is_lsi) ret->value_int32 = (int)*(bool*)returnval;
180 else ret->value_int32 = *(int*)returnval;
181 ret->type = sl_int32;
182
183 if (numargs >= 3)
184 {
185 if(is_lsi) *(bool*)returnval = args[2].value_int32;
186 else *(int*)returnval = args[2].value_int32;
187 }
188
189
190 return 0;
191}
192
193uint16_t ONICALL bsl_health(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
194{
195 int index;
196 if (numargs == 0) index = 0;
197 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
198 else index = args[0].value_int32;
199 Character* Chr = ONgGameState + 0x1260 ;
200 int* health = &Chr[index].Health;
201
202 ret->value_int32 = *health;
203 ret->type = sl_int32;
204
205 if (numargs >= 2) {
206 *health = args[1].value_int32;
207 }
208 ret->value_int32 = *health;
209 ret->type = sl_int32;
210 return 0;
211}
212
213uint16_t ONICALL bsl_regen(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
214{
215 int index;
216 if (numargs == 0) index = 0;
217 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
218 else index = args[0].value_int32;
219 Character* Chr = ONgGameState + 0x1260 ;
220 int* health = (int*)&Chr[index] + 0x144;
221
222 ret->value_int32 = *health;
223 ret->type = sl_int32;
224
225 if (numargs >= 2) {
226 *health = args[1].value_int32;
227 }
228 ret->value_int32 = *health;
229 ret->type = sl_int32;
230 return 0;
231}
232
233
234uint16_t ONICALL bsl_maxhealth(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
235{
236 int index;
237 if (numargs == 0) index = 0;
238 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
239 else index = args[0].value_int32;
240 Character* Chr = ONgGameState + 0x1260 ;
241 int* maxhealth = &Chr[index].MaxHealth;
242 int oldmaxhealth = Chr[index].MaxHealth;
243 int oldhealth = Chr->Health;
244 if (numargs >= 2) {
245 *maxhealth = args[1].value_int32;
246 }
247 if (numargs >= 3 && args[2].value_bool) {
248 Chr->Health = (int)(((float)args[1].value_int32 / (float)oldmaxhealth) * (float)oldhealth);
249 }
250 ret->value_int32 = oldmaxhealth;
251 ret->type = sl_int32;
252 return 0;
253}
254
255uint16_t ONICALL bsl_getattacker(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
256{
257 //broken
258
259 int index;
260 if (numargs == 0) index = 0;
261 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
262 else index = args[0].value_int32;
263
264 Character* Chr = ONgGameState + 0x1260;
265 ActiveCharacter* Active = (ActiveCharacter*)ONrGetActiveCharacter(&Chr[index]);
266 if ((int)Active == 0) return 1;
267// ret->value_int32 = Active->LastDamageSourceCharacter;
268 ret->type = sl_int32;
269 return 0;
270}
271
272
273
274uint16_t ONICALL bsl_chrname(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
275{
276 int index;
277 if (numargs == 0) index = 0;
278 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
279 else index = args[0].value_int32;
280 if (index == -1) {
281 ret->type = sl_str32;
282 ret->value_str32 = "NULL";
283 return 0;
284 }
285 char* name = ONgGameState + 0x1260 + index * 0x16A0 + 0x14;
286 if (numargs == 2) {
287 strncpy(name, (char*)args[1].value_str32, 31);
288 }
289
290 ret->type = sl_str32;
291 ret->value_str32 = name;
292
293 return 0;
294}
295
296
297uint16_t ONICALL bsl_count(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
298{
299 //testing numargs...
300 ret->type = sl_int32;
301 ret->value_int32 = numargs;
302 return 0;
303}
304
305uint16_t ONICALL bsl_dprintcolored(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
306{
307 //TODO: figure out why our implementation of dprint shows after dev mode is turned off
308 RGBA color;
309 RGBA shade;
310
311 if(numargs == 0) return 0;
312 if(numargs > 1 ) color.R = (char)args[1].value_int32;
313 else color.R = 255;
314 if(numargs > 2 ) color.G = (char)args[2].value_int32;
315 else color.G = 255;
316 if(numargs > 3 ) color.B = (char)args[3].value_int32;
317 else color.B = 255;
318 color.A = 0;
319 if(numargs > 5 ) shade.R = (char)args[5].value_int32;
320 else shade.R = 0x3F;
321 if(numargs > 6 ) shade.G = (char)args[6].value_int32;
322 else shade.G = 0x3F;
323 if(numargs > 7 ) shade.B = (char)args[7].value_int32;
324 else shade.B = 0x3F;
325 shade.A = 0;
326
327 DDrConsole_PrintColored(args[0].value_str32, 1, color, shade);
328 return 0;
329}
330
331
332uint16_t ONICALL bsl_nametoindex(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
333{
334 ret->type = sl_int32;
335 ret->value_int32 = DDrGetCharacterIndexFromName(args[0].value_str32);
336 return 0;
337}
338
339uint16_t ONICALL bsl_getactiveoffset(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
340{
341 DDrConsole_PrintF("Character: 0x%x",(int)ONgGameState + 0x1260);
342 DDrConsole_PrintF("ActiveChar: 0x%x",(int)ONrGetActiveCharacter((void*)((int)ONgGameState + 0x1260)));
343 return 0;
344}
345typedef struct {
346char Name[16];
347int Bit;
348} KeyBit;
349
350KeyBit Actions1[32] = {
351 {"Escape", Action_Escape},
352 {"Console", Action_Console},
353 {"PauseScreen", Action_PauseScreen},
354 {"Cutscene1", Action_Cutscene_1 },
355 {"Cutscene2", Action_Cutscene_2 },
356 {"F4", Action_F4 },
357 {"F5", Action_F5 },
358 {"F6", Action_F6 },
359 {"F7", Action_F7 },
360 {"F8", Action_F8 },
361 {"StartRecorn", Action_StartRecord },
362 {"StopRecord", Action_StopRecord },
363 {"PlayRecord", Action_PlayRecord },
364 {"F12", Action_F12 },
365 {"Unknown1", Action_Unknown1 },
366 {"LookMode", Action_LookMode },
367 {"Screenshot", Action_Screenshot },
368 {"Unknown2", Action_Unknown2 },
369 {"Unknown3", Action_Unknown3 },
370 {"Unknown4", Action_Unknown4 },
371 {"Unknown5", Action_Unknown5 },
372 {"Forward", Action_Forward },
373 {"Backward", Action_Backward },
374 {"TurnLeft", Action_TurnLeft },
375 {"TurnRight", Action_TurnRight },
376 {"StepLeft", Action_StepLeft },
377 {"StepRight", Action_StepRight },
378 {"Jump", Action_Jump },
379 {"Crouch", Action_Crouch },
380 {"Punch",Action_Punch },
381 {"Kick", Action_Kick },
382 {"Block", Action_Block }
383};
384
385KeyBit Actions2[9] = {
386 {"Walk", Action2_Walk},
387 {"Action", Action2_Action},
388 {"Hypo", Action2_Hypo},
389 {"Reload", Action2_Reload },
390 {"Swap", Action2_Swap },
391 {"Drop", Action2_Drop },
392 {"Fire1", Action2_Fire1 },
393 {"Fire2", Action2_Fire2 },
394 {"Fire3", Action2_Fire3 }
395};
396uint16_t ONICALL bsl_holdkey(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
397 {
398 int index;
399 if (numargs < 4) index = 0;
400 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
401 else index = args[0].value_int32;
402
403 Character* Chr = ONgGameState + 0x1260;
404 ActiveCharacter* Active = (ActiveCharacter*)ONrGetActiveCharacter(&Chr[index]);
405 if ((int)Active == 0) return 1;
406 int i = 2;
407 int j = 0;
408 int Input1 = 0;
409 int Input2 = 0;
410 for(i = 1; i < numargs; i++) {
411 for(j = 0; j < 32; j++) {
412 if(strcmp(args[i].value_str32, Actions1[j].Name)) Input1 = Input1 | Actions1[j].Bit;
413 DDrConsole_PrintF("Testing %s against %s 0x%x", args[i].value_str32, Actions1[j].Name, Actions1[j].Bit);
414 }
415 for(j = 0; j < 9; j++) {
416 if(!strcmp(args[i].value_str32, Actions2[j].Name)) Input2 = Input2 | Actions2[j].Bit;
417
418 }
419 }
420 for(i = 0; i < numargs; i++) {
421 DDrConsole_PrintF("%s", args[i].value_str32);
422 }
423// if
424 return 0;
425}
426
427uint16_t ONICALL bsl_isheld(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
428 {
429// int index;
430// if (numargs < 4) index = 0;
431// else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
432// else index = args[0].value_int32;
433
434// Character* Chr = ONgGameState + 0x1260;
435// ActiveCharacter* Active = (ActiveCharacter*)ONrGetActiveCharacter(&Chr[index]);
436// if ((int)Active == 0) return 1;
437 int i = 2;
438 int j = 0;
439 int Input1 = 0;
440 int Input2 = 0;
441 for(i = 0; i < numargs; i++) {
442 for(j = 0; j < 32; j++) {
443 //DDrConsole_PrintF("Testing %s against %s 0x%x", args[i].value_str32, Actions1[j].Name, Actions1[j].Bit);
444 if(!strcmp(args[i].value_str32, Actions1[j].Name)) {
445 Input1 = Input1 | Actions1[j].Bit;
446 //DDrConsole_PrintF("Success!");
447 }
448
449 }
450 for(j = 0; j < 9; j++) {
451 if(!strcmp(args[i].value_str32, Actions2[j].Name)) Input2 = Input2 | Actions2[j].Bit;
452
453 }
454 }
455 //DDrConsole_PrintF("Testing: 0x%x Input: 0x%x",Input1, *(int*)(ONgGameState + 0xB8 + 0x10));
456 ret->value_int32 = 0;
457 ret->type = sl_int32;
458 if ( ((*(int*)(ONgGameState + 0xB8 + 0x10) & Input1) == Input1) && ((*(int*)(ONgGameState + 0xB8 + 0x14) & Input2) == Input2)) ret->value_int32 = 1;
459 return 0;
460}
461
462uint16_t ONICALL bsl_waitforkey(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
463 {
464// int index;
465// if (numargs < 4) index = 0;
466// else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
467// else index = args[0].value_int32;
468
469// Character* Chr = ONgGameState + 0x1260;
470// ActiveCharacter* Active = (ActiveCharacter*)ONrGetActiveCharacter(&Chr[index]);
471// if ((int)Active == 0) return 1;
472 int i = 2;
473 int j = 0;
474 int Input1 = 0;
475 int Input2 = 0;
476 for(i = 0; i < numargs; i++) {
477 for(j = 0; j < 32; j++) {
478 //DDrConsole_PrintF("Testing %s against %s 0x%x", args[i].value_str32, Actions1[j].Name, Actions1[j].Bit);
479 if(!strcmp(args[i].value_str32, Actions1[j].Name)) {
480 Input1 = Input1 | Actions1[j].Bit;
481 //DDrConsole_PrintF("Success!");
482 }
483
484 }
485 for(j = 0; j < 9; j++) {
486 if(!strcmp(args[i].value_str32, Actions2[j].Name)) Input2 = Input2 | Actions2[j].Bit;
487
488 }
489 }
490 //DDrConsole_PrintF("Waiting...");
491 if ( ((*(int*)(ONgGameState + 0xB8 + 0x10) & Input1) == Input1) && ((*(int*)(ONgGameState + 0xB8 + 0x14) & Input2) == Input2)) {
492 }
493 else {
494 //else (int)*ret = 1;
495 *dontuse2 = 1;
496 *dontuse1 = 1;
497 }
498/*
499 __asm__(
500 "movl 0x10(%esp), %edx\n\t"
501 "movl $1,(%eax)\n\t"
502 );
503 //ret->type = sl_void
504*/ return 0;
505}
506
507/*
508uint16_t ONICALL bsl_sprintf(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
509{
510 if (numargs < 2)
511 return 1;
512
513 char output[255];
514 int i;
515 for(i = 1; i < numargs; i++) {
516 sprintf(output, args[0].value_str32, args[i].value_str32);
517 }
518
519 ret->value_str32 = output;
520 ret->type = sl_str32;
521 return 0;
522}
523*/
524uint16_t ONICALL bsl_sprintf(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
525{
526 if (numargs < 1 || args[0].type != sl_str32)
527 {
528 DDrConsole_PrintF("Func \"%s\", File \"%s\", Line %d: semantic error, \"%s\": parameter list does not match: format:string arg1 arg2 ...", callinfo->name, callinfo->calllocation, callinfo->linenumber, callinfo->name);
529 return 0;
530 }
531
532 if (!args[0].value_str32)
533 args[0].value_str32 = "";
534
535 int ffi_ret;
536 char* str = NULL;
537 int size = 0;
538
539 ffi_cif cif;
540 ffi_type* ffi_args[256];
541 void* values[256];
542
543 ffi_args[0] = &ffi_type_pointer;
544 values[0] = &str;
545 ffi_args[1] = &ffi_type_uint32;
546 values[1] = &size;
547
548 int i;
549 for(i = 2; i < numargs + 2; i ++)
550 {
551 if (args[i - 2].type == sl_float)
552 {
553 float value_float = args[i - 2].value_float;
554 double* value_double = (double*)&(args[i - 2]);
555 *value_double = value_float;
556
557 ffi_args[i] = &ffi_type_double;
558 values[i] = value_double;
559 }
560 else
561 {
562 ffi_args[i] = &ffi_type_pointer;
563 values[i] = &(args[i - 2].value);
564 }
565 }
566
567 if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, i, &ffi_type_sint32, ffi_args) != FFI_OK)
568 return 1;
569 ffi_call(&cif, (void*)snprintf, (void*)&ffi_ret, values);
570 str = malloc(ffi_ret + 1);
571 size = ffi_ret + 1;
572 ffi_call(&cif, (void*)snprintf, (void*)&ffi_ret, values);
573 ret->value_str32 = str;
574 ret->type = sl_str32;
575 return 0;
576}
577
578// Widescreen patch for talking heads.
579uint16_t ONICALL cinematic_start_patch(sl_callinfo* callinfo, unsigned int numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
580{
581 args[1].value_int32 = (double)args[1].value_int32 / (double)(gl->DisplayMode.Width) * (4.0 / 3.0 * (double)(gl->DisplayMode.Height));
582 return ((sl_func)(OniExe + 0x000f3830))(callinfo, numargs, args, dontuse1, dontuse2, ret);
583}
584
585bool ini_inbsl = false;
586bool SLrIniCallback(char* section, bool newsection, char* name, char* value)
587{
588 if (newsection && !stricmp(section, "bsl"))
589 ini_inbsl = true;
590
591 if (ini_inbsl)
592 {
593 bool isptr = false;
594 sl_type bsl_type;
595
596 if (value[0] == 'p' && value[1] == 't' && value[2] == 'r' && value[3] == ':')
597 {
598 isptr = true;
599 value += 4;
600 }
601
602 char* type = value;
603
604 for (; *type; type++)
605 if (*type == ':')
606 {
607 *type = '\0';
608 type++;
609 break;
610 }
611
612 if (!*type)
613 DDrStartupMessage("badly formed bsl definition for \"%s\"", name);
614
615 if (!strcmp(type, "int"))
616 bsl_type = sl_int32;
617 else if (!strcmp(type, "string"))
618 bsl_type = sl_str32;
619 else if (!strcmp(type, "float"))
620 bsl_type = sl_float;
621 else if (!strcmp(type, "bool"))
622 bsl_type = sl_bool;
623 else
624 {
625 DDrStartupMessage("unknown type in bsl definition for \"%s\"", name);
626 return true;
627 }
628
629 if (isptr)
630 {
631 char* bsl_var = malloc(strlen(name) + 1);
632 memcpy(bsl_var, name, strlen(name) + 1);
633 switch (bsl_type)
634 {
635 case sl_int32:
636 SLrGlobalVariable_Register_Int32(bsl_var, "see daodan.ini", (int32_t*)(uint32_t)inifile_parseint(value, false));
637 break;
638 case sl_float:
639 SLrGlobalVariable_Register_Float(bsl_var, "see daodan.ini", (float*)(uint32_t)inifile_parseint(value, false));
640 break;
641 default:
642 break;
643 }
644 }
645 else
646 {
647 char* bsl_var = malloc(strlen(name) + 1 + sizeof(int32_t));
648 int32_t* bsl_val = (int32_t*)bsl_var;
649 bsl_var += sizeof(int32_t);
650 memcpy(bsl_var, name, strlen(name) + 1);
651
652 switch (bsl_type)
653 {
654 case sl_int32:
655 *bsl_val = inifile_parseint(value, false);
656 SLrGlobalVariable_Register_Int32(bsl_var, "see daodan.ini", bsl_val);
657 break;
658 case sl_float:
659 break;
660 default:
661 break;
662 }
663 }
664 }
665 return true;
666}
667
668void SLrConfig()
669{
670 DDrStartupMessage("re-parsing daodan.ini for bsl...");
671 inifile_read("daodan.ini", SLrIniCallback);
672 DDrStartupMessage("finished parsing");
673}
674
675uint16_t ONICALL bsl_findmsg(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
676{
677 //DDrMake_Weapon_Message(args[0].value_str32);
678 return false;
679}
680void SLrDaodan_Initalize()
681{
682
683 //const char regen_patch[] = {0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90};
684 //DDrPatch_Const(OniExe + 0x0011BB6D, regen_patch);
685
686 //This one should work but doesn't.
687 //const char regen_patch[] ={0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x8B, 0x86, 0x44};
688 //DDrPatch_Const(OniExe + 0x0011BB64, regen_patch);
689
690 SLrConfig();
691 SLrScript_Command_Register_ReturnType("d_wp", "Shows weapon message", "wpn:string", sl_void, bsl_findmsg);
692
693 SLrScript_Command_Register_ReturnType("int32mul", "Multiplies two numbers", "n1:int n2:int", sl_int32, bsl_int32mul);
694 SLrScript_Command_Register_ReturnType("mul", "Multiplies two numbers", "[int1:int|float1:float] [int2:int|float2:float]", sl_float, bsl_mul);
695
696 SLrScript_Command_Register_ReturnType("int32div", "Divides two numbers", "n1:int n2:int", sl_int32, bsl_int32div);
697 SLrScript_Command_Register_ReturnType("div", "Divides two numbers", "[int1:int|float1:float] [int2:int|float2:float]", sl_float, bsl_div);
698
699 dsfmt_gv_init_gen_rand((uint32_t)time(NULL));
700 SLrScript_Command_Register_ReturnType("int32rand", "Returns a pseudo-random number between two numbers (inclusive).", "start:int end:int", sl_int32, bsl_int32rand);
701
702 SLrScript_Command_Register_ReturnType("d_getkills","Gets the number of kills a character has", "[ai_name:str | script_id:int]", sl_int32, bsl_getkills);
703 SLrScript_Command_Register_ReturnType("d_getdamage","Gets the amount of damage a character has caused", "[ai_name:string | script_id:int]", sl_int32, bsl_getdamage);
704 SLrScript_Command_Register_ReturnType("d_name","Gets or sets a character's name", "[ai_name:str | script_id:int] [newname:string]", sl_str32, bsl_chrname);
705 SLrScript_Command_Register_ReturnType("d_getindex","Converts a character's name to its index", "script_id:int", sl_int32, bsl_nametoindex);
706 SLrScript_Command_Register_ReturnType("d_health","Gets or sets a character's health", "[ai_name:str | script_id:int] [newhealth:int]", sl_str32, bsl_health);
707 SLrScript_Command_Register_ReturnType("d_regen","Gets or sets a character's health", "[ai_name:str | script_id:int] [newhealth:int]", sl_str32, bsl_regen);
708 SLrScript_Command_Register_ReturnType("d_maxhealth","Gets or sets a character's maximum health", "[ai_name:str | script_id:int] [newmaxhealth:int] [scalehealth:bool]", sl_str32, bsl_maxhealth);
709 SLrScript_Command_Register_ReturnType("d_powerup","Gets or sets a character's powerups", "ai_name:str|script_id:int powerup:str", sl_int32, bsl_powerup);
710 SLrScript_Command_Register_ReturnType("d_holdkey","Makes an AI hold a key", "[ai_name:string | script_id:int] keys", sl_int32, bsl_holdkey);
711 SLrScript_Command_Register_ReturnType("d_isheld","Checks for a held key", "keys", sl_int32, bsl_isheld);
712 SLrScript_Command_Register_Void("d_waitforkey","Waits for a keypress.", "keys", bsl_waitforkey);
713
714 //broken. sometimes crashes, and sometimes returns a string... : /
715 SLrScript_Command_Register_ReturnType("d_getattacker","Gets the last person to hurt a character", "[ai_name:string | script_id:int]", sl_int32, bsl_getattacker);
716
717 SLrScript_Command_Register_ReturnType("d_active","Gets the last person to hurt a character", "[ai_name:string | script_id:int]", sl_int32, bsl_getactiveoffset);
718
719 SLrScript_Command_Register_ReturnType("sprintf", "C-style sprintf.", "format:string arg1 arg2 ...", sl_str32, bsl_sprintf);
720
721 SLrScript_Command_Register_ReturnType("d_dprint", "prints to console in color", "text:string [color: r b g] [color: r b g]", sl_void, bsl_dprintcolored);
722
723 //SLrScript_Command_Register_ReturnType("d_offset", "a test", "thing:int", sl_int32, bsl_returnoffset);
724}
725
726void SLrDaodan_Patch()
727{
728 DDrPatch_Int32(OniExe + 0x000f3755, (int)cinematic_start_patch);
729}
Note: See TracBrowser for help on using the repository browser.