//= Improve the script engine - Change the hardcoded commands [KeyWorld] //= Requirement: // jump_nonzero() - inverse of jump_zero. BUILDIN_DEF(jump_nonzero,"il") BUILDIN_FUNC(jump_nonzero) { if( script_getnum(st,2) ) { if( !data_islabel(script_getdata(st,3)) ){ ShowError("script: jump_zero: not label !\n"); st->state=END; return 1; } st->pos= script_getnum(st,3); st->state=GOTO; } return 0; } // goto_ifexist() - Jump to a label if it exist (required a string !) BUILDIN_DEF(goto_ifexist,"s") BUILDIN_FUNC(goto_ifexist) { int n = search_str( script_getstr(st,2) ); if( n == -1 || str_data[n].type != C_POS ) {// label not found return 0; } st->pos = str_data[n].label; st->state = GOTO; return 0; } /*********************** ** FOR **************** **********************/ // NPC script for ( ; ; ) { ; } // Current: ; __FR%x_J: jump_zero( , __FR%x_FIN ); goto __FR%x_BGN; __FR%x_NXT: ; goto __FR%x_BGN; __FR%x_BGN: ; goto __FR%x_NXT; __FR%x_FIN : // Modification: ; jump_zero( , __FR%x_FIN ); __FR%x_J: ; __FR%x_NXT: ; jump_nonzero( , __FR%x_J ); __FR%x_FIN: /*********************** ** WHILE ************** **********************/ // NPC Script while ( ) { } // Current: __WL%x_NXT: jump_zero( , __WL%x_FIN ); goto __WL%x_NXT; __WL%x_FIN: // Modification: goto __WL%x_NXT; __WL%x_BGN: ; __WL%x_NXT: jump_nonzero( , __WL%x_BGN ); __WL%x_FIN: /*********************** ** DO WHILE *********** **********************/ // Npc Script do { } while( ); // Current: __DO%x_BGN: ; __DO%x_NXT: jump_zero( , __DO%x_FIN ); goto __DO%x_BGN; __DO%x_FIN: // Modification: __DO%x_BGN: ; __DO%x_NXT: jump_nonzero( , __DO%x_BGN ); __DO%x_FIN: /*********************** ** Switch ************* **********************/ // Npc script switch() { case 1: break; default: } // Current: (simplify.............) set $@__SW%x_VAL, ; goto __SW%x_%xJ; __SW%x_%xJ: __SW%x_%x: if(%d != $@__SW%x_VAL) goto __SW%x_%x; ; goto __SW%x_FIN; // break __SW%x_%x: goto __SW%x_DEF; __SW%x_DEF: ; set $@__SW%x_VAL,0; goto __SW%x_FIN; __SW%x_FIN: // Modification: goto_ifexist("__SW%x_" + ); goto_ifexist("__SW%x_DEF"); goto __SW%x_FIN; __SW%x_1: goto __SW%x_FIN; // break; __SW%x_DEF: __SW%x_FIN: