source: Daodan/src/Daodan_BSL.c@ 450

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

Started Bink.h...I probably did it all wrong. :p
Some minor BSL stuff.

File size: 14.1 KB
Line 
1#include <stdio.h>
2#include <time.h>
3#include <ffi.h>
4
5#include "Daodan_BSL.h"
6#include "Daodan_Utility.h"
7#include "Daodan_Patch.h"
8#include "Daodan_Console.h"
9#include "BFW_ScriptLang.h"
10#include "Oni.h"
11#include "Oni_Character.h"
12#include "oni_gl.h"
13#include "dSFMT\dSFMT.h"
14#include "Daodan_Character.h"
15
16uint16_t ONICALL bsl_int32mul(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
17{
18 ret->value_int32 = args[0].value_int32 * args[1].value_int32;
19 ret->type = sl_int32;
20 return 0;
21}
22
23uint16_t ONICALL bsl_mul(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
24{
25 double val1;
26 double val2;
27
28 if (args[0].type == sl_int32)
29 val1 = args[0].value_int32;
30 else
31 val1 = args[0].value_float;
32
33 if (args[1].type == sl_int32)
34 val2 = args[1].value_int32;
35 else
36 val2 = args[1].value_float;
37
38 ret->value_float = (float)(val1 * val2);
39 ret->type = sl_float;
40 return 0;
41}
42
43uint16_t ONICALL bsl_int32div(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
44{
45 ret->value_int32 = args[0].value_int32 / args[1].value_int32;
46 ret->type = sl_int32;
47 return 0;
48}
49
50uint16_t ONICALL bsl_div(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
51{
52 double val1;
53 double val2;
54
55 if (args[0].type == sl_int32)
56 val1 = args[0].value_int32;
57 else
58 val1 = args[0].value_float;
59
60 if (args[1].type == sl_int32)
61 val2 = args[1].value_int32;
62 else
63 val2 = args[1].value_float;
64
65 ret->value_float = (float)(val1 / val2);
66 ret->type = sl_float;
67 return 0;
68}
69
70uint16_t ONICALL bsl_int32rand(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
71{
72 int32_t start = 0;
73 int32_t end = 0;
74
75 if (args[0].value_int32 == args[1].value_int32)
76 return 1;
77 else if (args[0].value_int32 > args[1].value_int32)
78 {
79 start = args[1].value_int32;
80 end = args[0].value_int32;
81 }
82 else
83 {
84 start = args[0].value_int32;
85 end = args[1].value_int32;
86 }
87
88 ret->value_int32 = start + (dsfmt_gv_genrand_uint32() % (uint32_t)(end - start + 1));
89 ret->type = sl_int32;
90 return 0;
91}
92
93uint16_t ONICALL bsl_getkills(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
94{
95 int index;
96 if (numargs == 0) index = 0;
97 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
98 else index = args[0].value_int32;
99 int* killcount = ONgGameState + index * 0x16A0 + 0x1260 + 0x1670;
100 ret->value_int32 = *killcount;
101 ret->type = sl_int32;
102 return 0;
103}
104
105uint16_t ONICALL bsl_getdamage(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
106{
107 int index;
108 if (numargs == 0) index = 0;
109 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
110 else index = args[0].value_int32;
111 int* killcount = ONgGameState + index * 0x16A0 + 0x1260 + 0x1674;
112 ret->value_int32 = *killcount;
113 ret->type = sl_int32;
114 return 0;
115}
116
117uint16_t ONICALL bsl_powerup(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
118{
119 int index;
120 if (numargs < 2 || args[1].type != sl_str32) return 1;
121 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
122 else index = args[0].value_int32;
123 void* returnval;
124 bool is_lsi = 0;
125 Character* Chr = ONgGameState + 0x1260;
126 if(!strcmp(args[1].value_str32,"ammo"))
127 {
128 returnval = &(Chr[index].Inventory_.AmmoUsed);
129 }
130 else if(!strcmp(args[1].value_str32,"hypo"))
131 {
132 returnval = &(Chr[index].Inventory_.HypoUsed);
133 }
134 else if(!strcmp(args[1].value_str32,"cells"))
135 {
136 returnval = &(Chr[index].Inventory_.CellsUsed);
137 }
138 else if(!strcmp(args[1].value_str32,"invis"))
139 {
140 returnval = &(Chr[index].Inventory_.CloakUsed);
141 }
142 else if(!strcmp(args[1].value_str32,"shield"))
143 {
144 returnval = &(Chr[index].Inventory_.ShieldUsed);
145 }
146 else if(!strcmp(args[1].value_str32,"lsi"))
147 {
148 returnval = &(Chr[index].Inventory_.hasLSI);
149 is_lsi = 1;
150 }
151 else if(!strcmp(args[1].value_str32,"bossshield"))
152 {
153 ret->value_int32 = Chr[index].Flags & char_bossshield;
154 ret->type = sl_int32;
155 if (numargs >=3) {
156 if (Chr[index].Flags & char_bossshield) Chr[index].Flags = Chr[index].Flags & ~char_bossshield;
157 else Chr[index].Flags = Chr[index].Flags | char_bossshield;
158 }
159 return 0;
160 }
161 else return 1;
162 //todo, add setting
163
164 if(is_lsi) ret->value_int32 = (int)*(bool*)returnval;
165 else ret->value_int32 = *(int*)returnval;
166 ret->type = sl_int32;
167
168 if (numargs >= 3)
169 {
170 if(is_lsi) *(bool*)returnval = args[2].value_int32;
171 else *(int*)returnval = args[2].value_int32;
172 }
173
174
175 return 0;
176}
177
178uint16_t ONICALL bsl_health(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
179{
180 int index;
181 if (numargs == 0) index = 0;
182 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
183 else index = args[0].value_int32;
184 Character* Chr = ONgGameState + 0x1260 ;
185 int* health = &Chr[index].Health;
186
187 ret->value_int32 = *health;
188 ret->type = sl_int32;
189
190 if (numargs >= 2) {
191 *health = args[1].value_int32;
192 }
193 ret->value_int32 = *health;
194 ret->type = sl_int32;
195 return 0;
196}
197
198uint16_t ONICALL bsl_maxhealth(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
199{
200 int index;
201 if (numargs == 0) index = 0;
202 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
203 else index = args[0].value_int32;
204 Character* Chr = ONgGameState + 0x1260 ;
205 int* maxhealth = &Chr[index].MaxHealth;
206 int oldmaxhealth = Chr[index].MaxHealth;
207 int oldhealth = Chr->Health;
208 if (numargs >= 2) {
209 *maxhealth = args[1].value_int32;
210 }
211 if (numargs >= 3 && args[2].value_bool) {
212 Chr->Health = (int)(((float)args[1].value_int32 / (float)oldmaxhealth) * (float)oldhealth);
213 }
214 ret->value_int32 = oldmaxhealth;
215 ret->type = sl_int32;
216 return 0;
217}
218
219uint16_t ONICALL bsl_getattacker(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
220{
221 //broken...not only does it sometimes blam, but it returns a string when i want an int so i can study it :<
222 int index;
223 if (numargs == 0) index = 0;
224 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
225 else index = args[0].value_int32;
226
227 Character* Chr = ONgGameState + 0x1260;
228 ActiveCharacter* Active = (ActiveCharacter*)ONrGetActiveCharacter(&Chr[index]);
229 if ((int)Active == 0) return 1;
230 ret->value_int32 = Active->LastDamageSourceCharacter;
231 ret->type = sl_int32;
232 return 0;
233}
234
235
236
237uint16_t ONICALL bsl_chrname(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
238{
239 int index;
240 if (numargs == 0) index = 0;
241 else if (args[0].type == sl_str32) index = DDrGetCharacterIndexFromName(args[0].value_str32);
242 else index = args[0].value_int32;
243 if (index == -1) {
244 ret->type = sl_str32;
245 ret->value_str32 = "NULL";
246 return 0;
247 }
248 char* name = ONgGameState + 0x1260 + index * 0x16A0 + 0x14;
249 if (numargs == 2) {
250 strncpy(name, (char*)args[1].value_str32, 31);
251 }
252
253 ret->type = sl_str32;
254 ret->value_str32 = name;
255
256 return 0;
257}
258
259
260uint16_t ONICALL bsl_count(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
261{
262 //testing numargs...
263 ret->type = sl_int32;
264 ret->value_int32 = numargs;
265 return 0;
266}
267
268uint16_t ONICALL bsl_dprintcolored(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
269{
270 //TODO: figure out why our implementation of dprint shows after dev mode is turned off
271 RGBA color;
272 RGBA shade;
273
274 if(numargs == 0) return 0;
275 if(numargs > 1 ) color.R = (char)args[1].value_int32;
276 else color.R = 255;
277 if(numargs > 2 ) color.G = (char)args[2].value_int32;
278 else color.G = 255;
279 if(numargs > 3 ) color.B = (char)args[3].value_int32;
280 else color.B = 255;
281 color.A = 0;
282 if(numargs > 5 ) shade.R = (char)args[5].value_int32;
283 else shade.R = 0x3F;
284 if(numargs > 6 ) shade.G = (char)args[6].value_int32;
285 else shade.G = 0x3F;
286 if(numargs > 7 ) shade.B = (char)args[7].value_int32;
287 else shade.B = 0x3F;
288 shade.A = 0;
289
290 DDrConsole_PrintColored(args[0].value_str32, 1, color, shade);
291 return 0;
292}
293
294
295uint16_t ONICALL bsl_nametoindex(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
296{
297 ret->type = sl_int32;
298 ret->value_int32 = DDrGetCharacterIndexFromName(args[0].value_str32);
299 return 0;
300}
301
302uint16_t ONICALL bsl_getactiveoffset(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
303{
304 DDrConsole_PrintF("Character: 0x%x",(int)ONgGameState + 0x1260);
305 DDrConsole_PrintF("ActiveChar: 0x%x",(int)ONrGetActiveCharacter((void*)((int)ONgGameState + 0x1260)));
306 return 0;
307}
308/*
309uint16_t ONICALL bsl_sprintf(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
310{
311 if (numargs < 2)
312 return 1;
313
314 char output[255];
315 int i;
316 for(i = 1; i < numargs; i++) {
317 sprintf(output, args[0].value_str32, args[i].value_str32);
318 }
319
320 ret->value_str32 = output;
321 ret->type = sl_str32;
322 return 0;
323}
324*/
325uint16_t ONICALL bsl_sprintf(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
326{
327 DDrConsole_PrintF("%d", numargs);
328
329 if (numargs < 1 || args[0].type != sl_str32)
330 {
331 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);
332 return 0;
333 }
334
335 if (!args[0].value_str32)
336 args[0].value_str32 = "";
337
338 int ffi_ret;
339 char* str = NULL;
340 int size = 0;
341
342 ffi_cif cif;
343 ffi_type* ffi_args[256];
344 void* values[256];
345
346 ffi_args[0] = &ffi_type_pointer;
347 values[0] = &str;
348 ffi_args[1] = &ffi_type_uint32;
349 values[1] = &size;
350
351 int i;
352 for(i = 2; i < numargs + 2; i ++)
353 {
354 if (args[i - 2].type == sl_float)
355 {
356 float value_float = args[i - 2].value_float;
357 double* value_double = (double*)&(args[i - 2]);
358 *value_double = value_float;
359
360 ffi_args[i] = &ffi_type_double;
361 values[i] = value_double;
362 }
363 else
364 {
365 ffi_args[i] = &ffi_type_pointer;
366 values[i] = &(args[i - 2].value);
367 }
368 }
369
370 if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, i, &ffi_type_sint32, ffi_args) != FFI_OK)
371 return 1;
372 ffi_call(&cif, (void*)snprintf, (void*)&ffi_ret, values);
373 str = malloc(ffi_ret + 1);
374 size = ffi_ret + 1;
375 ffi_call(&cif, (void*)snprintf, (void*)&ffi_ret, values);
376 ret->value_str32 = str;
377 ret->type = sl_str32;
378 return 0;
379}
380
381// Widescreen patch for talking heads.
382uint16_t ONICALL cinematic_start_patch(sl_callinfo* callinfo, unsigned int numargs, sl_arg args[], void* dontuse1, void* dontuse2, sl_arg* ret)
383{
384 args[1].value_int32 = (double)args[1].value_int32 / (double)(gl->DisplayMode.Width) * (4.0 / 3.0 * (double)(gl->DisplayMode.Height));
385 return ((sl_func)(OniExe + 0x000f3830))(callinfo, numargs, args, dontuse1, dontuse2, ret);
386}
387
388void SLrDaodan_Initalize()
389{
390 SLrScript_Command_Register_ReturnType("int32mul", "Multiplies two numbers", "n1:int n2:int", sl_int32, bsl_int32mul);
391 SLrScript_Command_Register_ReturnType("mul", "Multiplies two numbers", "[int1:int|float1:float] [int2:int|float2:float]", sl_float, bsl_mul);
392
393 SLrScript_Command_Register_ReturnType("int32div", "Divides two numbers", "n1:int n2:int", sl_int32, bsl_int32div);
394 SLrScript_Command_Register_ReturnType("div", "Divides two numbers", "[int1:int|float1:float] [int2:int|float2:float]", sl_float, bsl_div);
395
396 dsfmt_gv_init_gen_rand((uint32_t)time(NULL));
397 SLrScript_Command_Register_ReturnType("int32rand", "Returns a pseudo-random number between two numbers (inclusive).", "start:int end:int", sl_int32, bsl_int32rand);
398
399 SLrScript_Command_Register_ReturnType("d_getkills","Gets the number of kills a character has", "[ai_name:str | script_id:int]", sl_int32, bsl_getkills);
400 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);
401 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);
402 SLrScript_Command_Register_ReturnType("d_getindex","Converts a character's name to its index", "script_id:int", sl_int32, bsl_nametoindex);
403 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);
404 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);
405 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);
406 //broken. sometimes crashes, and sometimes returns a string... : /
407 SLrScript_Command_Register_ReturnType("d_getattacker","Gets the last person to hurt a character", "[ai_name:string | script_id:int]", sl_int32, bsl_getattacker);
408
409 SLrScript_Command_Register_ReturnType("d_active","Gets the last person to hurt a character", "[ai_name:string | script_id:int]", sl_int32, bsl_getactiveoffset);
410
411 SLrScript_Command_Register_ReturnType("sprintf", "C-style sprintf.", "format:string arg1 arg2 ...", sl_str32, bsl_sprintf);
412 SLrScript_Command_Register_ReturnType("dprintcolor", "prints to console in color", "text:string [color: r b g] [color: r b g]", sl_void, bsl_dprintcolored);
413
414
415
416 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);
417}
418void SLrDaodan_Patch()
419{
420 DDrPatch_Int32(OniExe + 0x000f3755, (int)cinematic_start_patch);
421}
422
Note: See TracBrowser for help on using the repository browser.