68 return *( (
string*) vi->
object );
74 void Mission::doCall_toxml(
string module,
varInst *ovi )
76 if (module ==
"_olist")
78 else if (module ==
"_unit")
87 vi = call_unit( node, mode );
88 }
else if (module_id ==
CMT_STD) {
93 vi = callRnd( node, mode );
95 vi = callGetGameTime( node, mode );
97 vi = callResetTimeCompression( node, mode );
99 vi = callGetSystemName( node, mode );
101 vi = callGetSystemFile( node, mode );
103 vi = callGetCurrentAIUnit( node, mode );
105 vi = callGetCurrentAIOrder( node, mode );
107 vi = call_isNull( node, mode );
109 vi = call_setNull( node, mode );
111 vi = call_isequal( node, mode );
113 vi = call_float_cast( node, mode );
115 vi = call_int_cast( node, mode );
117 vi = callGetGalaxyProperty( node, mode );
119 vi = call_musicAddList( node, mode );
121 vi = call_musicPlaySong( node, mode );
123 vi = call_musicPlayList( node, mode );
129 float diff = getFloatArg( node, mode, 0 );
135 vi = callGetNumAdjacentSystems( node, mode );
137 vi = callGetAdjacentSystem( node, mode );
139 vi = call_terminateMission( node, mode );
141 std::string soundName = getStringArgument( node, mode, 0 );
143 loc.i = getFloatArg( node, mode, 1 );
144 loc.j = getFloatArg( node, mode, 2 );
145 loc.k = getFloatArg( node, mode, 3 );
148 speed.i = getFloatArg( node, mode, 4 );
149 speed.j = getFloatArg( node, mode, 5 );
150 speed.k = getFloatArg( node, mode, 6 );
155 std::string soundName = getStringArgument( node, mode, 0 );
157 std::string aniName = getStringArgument( node, mode, 0 );
159 loc.i = getFloatArg( node, mode, 1 );
160 loc.j = getFloatArg( node, mode, 2 );
161 loc.k = getFloatArg( node, mode, 3 );
166 vi = call_olist( node, mode );
168 vi = call_omap( node, mode );
170 vi = call_order( node, mode );
172 vi = call_string( node, mode );
173 }
else if (module_id ==
CMT_IO) {
174 if (method ==
"PrintFloats")
175 vi = callPrintFloats( node, mode );
176 else if (method ==
"printf")
177 vi = call_io_printf( node, mode );
178 else if (method ==
"sprintf")
179 vi = call_io_sprintf( node, mode );
180 else if (method ==
"message")
181 vi = call_io_message( node, mode );
182 else if (method ==
"printMsgList")
183 vi = call_io_printmsglist( node, mode );
185 vi = call_briefing( node, mode );
197 if (
object.empty() && module.empty() ) {
198 fatalError( node, mode,
"you have to give a callback object or module" );
201 if ( name.empty() ) {
202 fatalError( node, mode,
"you have to give a callback name" );
211 if ( module.empty() ) {
217 fatalError( node, mode,
"no object found with name "+
object );
221 fatalError( node, mode,
"given variable"+
object+
" is not an object" );
225 if ( module.empty() ) {
226 fatalError( node, mode,
"object "+
object+
" not yet initialized" );
233 vi = doCall( node, mode, module, method );
235 fatalError( node, mode,
"no such callback named "+module+
"."+node->
script.
name );
244 varInst *ovi = getObjectArg( node, mode );
254 varInst *ovi = getObjectArg( node, mode );
264 getBoolArg( node, mode, 0 );
275 int intval = checkIntExpr( snode, mode );
285 double floatval = checkFloatExpr( snode, mode );
294 varInst *ovi = getObjectArg( node, mode );
295 missionNode *other_node = getArgument( node, mode, 1 );
296 varInst *other_vi = checkObjectExpr( other_node, mode );
337 string sysname = ssystem->
getName();
338 vi = call_string_new( node, mode, sysname );
353 vi = call_string_new( node, mode, sysname );
363 string str = getStringArgument( node, mode, 0 );
364 int which = (
int) getIntArg( node, mode, 1 );
368 vi = call_string_new( node, mode, sysname );
378 string sys = getStringArgument( node, mode, 0 );
379 string prop = getStringArgument( node, mode, 1 );
383 vi = call_string_new( node, mode, sysname );
390 string sysname = getStringArgument( node, mode, 0 );
405 while (
msgcenter->
last( i, msg, std::vector< std::string > () ) && i < 7.0) {
406 cout<<
"MESSAGE"<<msg.
message<<endl;
420 int delay = (
int) getIntArg( node, mode, 0 );
421 for (
int i = 0; i < 3; i++) {
422 args[i] = getArgument( node, mode, i+1 );
423 args_vi[i] = checkObjectExpr( args[i], mode );
425 args_str[i] = call_string_getstring( node, mode, args_vi[i] );
429 msgcenter->
add( args_str[0], args_str[1], args_str[2], delay );
436 string Mission::replaceNewline(
string origstr )
438 string ostr = origstr;
439 int breakpos = ostr.find(
"\\n", 0 );
441 string newstr = ostr.replace( breakpos, 2,
"\n" );
442 return replaceNewline( newstr );
451 missionNode *outstr_node = getArgument( node, mode, 0 );
452 varInst *outstr_vi = checkObjectExpr( outstr_node, mode );
453 string *outstrptr = getStringObject( outstr_node, mode, outstr_vi );
454 char outbuffer[1024];
456 missionNode *stringnode = getArgument( node, mode, 1 );
458 fatalError( node, mode,
"only const string allowed for second arg of sprintf" );
461 varInst *str_vi = checkObjectExpr( stringnode, mode );
463 fatalError( node, mode,
"io.sprintf needs string object as second arg" );
466 int nr_of_args = node->
subnodes.size();
468 string *fullstringptr;
470 fullstringptr = (
string*) str_vi->
object;
471 fullstring = *fullstringptr;
472 fullstring = replaceNewline( fullstring );
473 string endstring = fullstring;
474 while (current_arg < nr_of_args) {
475 int breakpos = endstring.find(
"%", 0 );
476 string beforestring = endstring.substr( 0, breakpos );
477 string breakstring = endstring.substr( breakpos, 2 );
478 if (breakstring[1] ==
'f') {
479 missionNode *anode = getArgument( node, mode, current_arg );
480 double res = checkFloatExpr( anode, mode );
482 sprintf( outbuffer,
"%s", beforestring.c_str() );
483 outstring += outbuffer;
484 sprintf( outbuffer,
"%f", res );
485 outstring += outbuffer;
487 }
else if (breakstring[1] ==
'd') {
488 missionNode *anode = getArgument( node, mode, current_arg );
489 int res = checkIntExpr( anode, mode );
491 sprintf( outbuffer,
"%s", beforestring.c_str() );
492 outstring += outbuffer;
493 sprintf( outbuffer,
"%d", res );
494 outstring += outbuffer;
496 }
else if (breakstring[1] ==
's') {
497 missionNode *anode = getArgument( node, mode, current_arg );
498 varInst *res_vi = doObjectVar( anode, mode );
501 fatalError( node, mode,
"io.printf needs string object as some arg" );
504 string *strptr = (
string*) res_vi->
object;
505 sprintf( outbuffer,
"%s", beforestring.c_str() );
506 outstring += outbuffer;
507 sprintf( outbuffer,
"%s", strptr->c_str() );
508 outstring += outbuffer;
512 endstring = endstring.substr( breakpos+2, endstring.size()-(breakpos+2) );
516 sprintf( outbuffer,
"%s", endstring.c_str() );
517 outstring += outbuffer;
518 (*outstrptr) = outstring;
530 missionNode *stringnode = getArgument( node, mode, 0 );
532 fatalError( node, mode,
"only const string allowed for first arg of printf" );
535 varInst *str_vi = checkObjectExpr( stringnode, mode );
537 fatalError( node, mode,
"io.printf needs string object as first arg" );
540 int nr_of_args = node->
subnodes.size();
542 string *fullstringptr;
544 fullstringptr = (
string*) str_vi->
object;
545 fullstring = *fullstringptr;
546 fullstring = replaceNewline( fullstring );
547 string endstring = fullstring;
548 while (current_arg < nr_of_args) {
549 int breakpos = endstring.find(
"%", 0 );
550 string beforestring = endstring.substr( 0, breakpos );
551 string breakstring = endstring.substr( breakpos, 2 );
552 if (breakstring[1] ==
'f') {
553 missionNode *anode = getArgument( node, mode, current_arg );
554 double res = checkFloatExpr( anode, mode );
556 printf(
"%s", beforestring.c_str() );
559 }
else if (breakstring[1] ==
'd') {
560 missionNode *anode = getArgument( node, mode, current_arg );
561 int res = checkIntExpr( anode, mode );
563 printf(
"%s", beforestring.c_str() );
566 }
else if (breakstring[1] ==
'b') {
567 missionNode *anode = getArgument( node, mode, current_arg );
568 bool res = checkBoolExpr( anode, mode );
570 printf(
"%s", beforestring.c_str() );
576 }
else if (breakstring[1] ==
's') {
577 missionNode *anode = getArgument( node, mode, current_arg );
578 varInst *res_vi = doObjectVar( anode, mode );
581 fatalError( node, mode,
"io.printf needs string object as some arg" );
584 string *strptr = (
string*) res_vi->
object;
586 printf(
"%s", beforestring.c_str() );
587 printf(
"%s", strptr->c_str() );
591 endstring = endstring.substr( breakpos+2, endstring.size()-(breakpos+2) );
595 printf(
"%s", endstring.c_str() );
632 for (
int i = 0; i < len; i++) {
635 cout<<
" "<<res<<
" ,";
650 vi->
object = (
void*) current_ai_unit;
660 vi->
object = (
void*) current_ai_order;
672 sprintf( buffer,
"rnd returning %f", (vi->
float_val) );
673 debug( 7, node, mode, buffer );
681 fatalError( node, mode, method_str( node )+
" needs an object as first argument" );
685 varInst *ovi = doObjectVar( snode, mode );
687 debug( 3, node, mode, node->
attr_value(
"module" )+
"."+node->
attr_value(
"name" )+
" object: " );
688 printVarInst( 3, ovi );
698 bool Mission::getBoolArg(
missionNode *node,
int mode,
int arg_nr )
700 missionNode *val_node = getArgument( node, mode, arg_nr );
701 bool res = checkBoolExpr( val_node, mode );
705 double Mission::getFloatArg(
missionNode *node,
int mode,
int arg_nr )
707 missionNode *val_node = getArgument( node, mode, arg_nr );
708 return checkFloatExpr( val_node, mode );
711 int Mission::getIntArg(
missionNode *node,
int mode,
int arg_nr )
713 missionNode *val_node = getArgument( node, mode, arg_nr );
714 int res = checkIntExpr( val_node, mode );
722 missionNode *unit_node = getArgument( node, mode, arg_nr );
723 varInst *unit_vi = checkObjectExpr( unit_node, mode );
726 ret = getUnitObject( unit_node, mode, unit_vi );
728 printf(
"Error: Unit died prematurely\n" );
738 missionNode *pos_node = getArgument( node, mode, arg_nr );
739 varInst *pos_vi = checkObjectExpr( pos_node, mode );
743 vec3 = call_olist_tovector( pos_node, mode, pos_vi );
750 if ( node->
subnodes.size() < (
unsigned int) (arg_nr+1) ) {
752 sprintf( buf,
" needs at least %d arguments", arg_nr+1 );
753 fatalError( node, mode, method_str( node )+buf );
761 void Mission::initCallbackMaps()
763 module_map[
"_io"] =
CMT_IO;