int *NPC_Util_getEnemy( int meindex, int charaindex) { int i; char argstr[NPC_UTIL_GETARGSTR_BUFSIZE]; char buf[64]; int ret; int bigcnt; int insert; NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)); for( i = 0; i < NPC_ENEMY_ENEMYNUMBER+1; i ++ ) { NPCUtil_enemytbl[i] = -1; } if( NPC_Util_GetStrFromStrWithDelim( argstr, "enemyno", buf, sizeof( buf)) == NULL ) { return NULL; } bigcnt = 0; insert = 0; for( i = 0; i < NPC_ENEMY_ENEMYNUMBER; i ++ ) { int curEnemy; int et_array; char data[128]; ret = getStringFromIndexWithDelim( buf,",", i + 1,data, sizeof(data)); if( ret == FALSE) { break; } curEnemy = ENEMY_getEnemyArrayFromId( atoi( data)); if( !ENEMY_CHECKINDEX( curEnemy) ) continue; et_array = ENEMYTEMP_getEnemyTempArray( curEnemy ); if( ENEMYTEMP_getInt( et_array, E_T_SIZE ) == E_T_SIZE_BIG) { if( bigcnt >= 5 ) { continue; } if( insert > 4 ) { int target_et_array; int flg = FALSE; int j; for( j = 0; j < 5; j ++ ) { /* ���л��¼����ƾ����� */ if( !ENEMY_CHECKINDEX( NPCUtil_enemytbl[j])) break; target_et_array = ENEMYTEMP_getEnemyTempArray( NPCUtil_enemytbl[j]); /* �ƾ����� */ if( !ENEMYTEMP_CHECKINDEX( target_et_array)) break; if( ENEMYTEMP_getInt( target_et_array, E_T_SIZE) == E_T_SIZE_NORMAL ) { flg = TRUE; break; } } if( !flg) continue; NPCUtil_enemytbl[insert] = NPCUtil_enemytbl[j]; NPCUtil_enemytbl[j] = curEnemy; } else { NPCUtil_enemytbl[insert] = curEnemy; } bigcnt ++; } else { NPCUtil_enemytbl[insert] = curEnemy; } insert ++; } return NPCUtil_enemytbl; }
BOOL NPC_NPCEnemyInit( int meindex ) { char argstr1[NPC_UTIL_GETARGSTR_BUFSIZE]; char *argstr; char buf[64]; int tmp, gym; if((argstr = NPC_Util_GetArgStr( meindex, argstr1, sizeof( argstr1))) == NULL ) { print("Can't GetArgStr !!"); return FALSE; } if( NPC_Util_GetStrFromStrWithDelim( argstr, "sktype", buf, sizeof( buf)) != NULL ){ CHAR_setWorkInt( meindex, CHAR_WORK_BATTLETYPE, atoi( buf)); }else{ CHAR_setWorkInt( meindex, CHAR_WORK_BATTLETYPE, 0); } if( NPC_Util_GetStrFromStrWithDelim( argstr, "enemyno", buf, sizeof( buf)) == NULL ){ char filename[256]; NPC_Util_CheckAssignArgFile( meindex, filename); print( "NPCEnemy: nothing parameter [enemyno]:\n%s\n", filename); return FALSE; }else { int i; for( i = 0; i < NPC_ENEMY_ENEMYNUMBER; i ++ ) { int curEnemy; char data[128]; int ret; ret = getStringFromIndexWithDelim( buf,",", i + 1, data, sizeof(data)); if( ret == FALSE) break; curEnemy = ENEMY_getEnemyArrayFromId( atoi( data)); if( !ENEMY_CHECKINDEX( curEnemy) ) { char filename[256]; NPC_Util_CheckAssignArgFile( meindex, filename); print( "NPCEnemy: invalid param [enemyno:%d data:%s curEnemy:%d]\nfile:%s\n",i+1, data, curEnemy, filename ); return FALSE; } } } if( NPC_Util_GetStrFromStrWithDelim( argstr, "steal", buf, sizeof( buf)) != NULL ) { if( NPC_Util_GetStrFromStrWithDelim( argstr, "item", buf, sizeof( buf)) == NULL ) { print( "NPCEnemy:有指定steal而沒有指定item,很奇怪\n"); return FALSE; } } gym = NPC_Util_GetNumFromStrWithDelim( argstr, "gym"); if( gym > 0 ){ CHAR_setInt( meindex, CHAR_BASEBASEIMAGENUMBER, gymbody[RAND( 0, arraysizeof( gymbody ) - 1)] ); CHAR_setInt( meindex, CHAR_BASEIMAGENUMBER, CHAR_getInt( meindex, CHAR_BASEBASEIMAGENUMBER ) ); CHAR_setInt( meindex, CHAR_LV, gym ); } tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "dieact"); if( tmp != 1 ) tmp = 0; CHAR_setWorkInt( meindex, CHAR_WORK_DIEACT, tmp); if( strstr( argstr, "NEWNPCENEMY") != 0 ) { CHAR_setWorkInt( meindex, CHAR_WORK_WARP_FLOOR, 0 ); CHAR_setWorkInt( meindex, CHAR_WORK_WARP_Y, 0 ); CHAR_setWorkInt( meindex, CHAR_WORK_WARP_X, 0 ); }else { if( CHAR_getWorkInt( meindex, CHAR_WORK_DIEACT) == 1 ) { char buff1[256]; if( NPC_Util_GetStrFromStrWithDelim( argstr, "warpfl", buff1, sizeof( buff1) ) == NULL) { print( "NPCENEMY: nothing warp_floor %s\n", buff1); return FALSE; } tmp = atoi( buff1); CHAR_setWorkInt( meindex, CHAR_WORK_WARP_FLOOR, tmp); if( NPC_Util_GetStrFromStrWithDelim( argstr, "warpx", buff1, sizeof( buff1) ) == NULL) { print( "NPCENEMY: nothing warp_x\n"); return FALSE; } tmp = atoi( buff1); CHAR_setWorkInt( meindex, CHAR_WORK_WARP_X, tmp); if( NPC_Util_GetStrFromStrWithDelim( argstr, "warpy", buff1, sizeof( buff1) ) == NULL) { print( "NPCENEMY: nothing warp_y\n"); return FALSE; } tmp = atoi( buff1); CHAR_setWorkInt( meindex, CHAR_WORK_WARP_Y, tmp); if( MAP_IsValidCoordinate( CHAR_getWorkInt( meindex, CHAR_WORK_WARP_FLOOR), CHAR_getWorkInt( meindex, CHAR_WORK_WARP_X), CHAR_getWorkInt( meindex, CHAR_WORK_WARP_Y) ) == FALSE ){ char filename[256]; NPC_Util_CheckAssignArgFile( meindex, filename); print( "NPCENEMY: %s: .\n %s.\nInvalid fl=%d,x=%d,y=%d\n", filename, argstr, CHAR_getWorkInt( meindex, CHAR_WORK_WARP_FLOOR), CHAR_getWorkInt( meindex, CHAR_WORK_WARP_X), CHAR_getWorkInt( meindex, CHAR_WORK_WARP_Y) ); return FALSE; } } } //andy_end tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "entype"); if( tmp != 1 && tmp != 2) tmp = 0; CHAR_setWorkInt( meindex, CHAR_WORK_ENCOUNTTYPE, tmp); tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "onebattle"); if( tmp != 1 ) tmp = 0; CHAR_setWorkInt( meindex, CHAR_WORK_ONEBATTLE, tmp); tmp = NPC_Util_GetNumFromStrWithDelim( argstr, "time"); if( tmp == -1 ) tmp = NPC_ENEMY_REVIVALTIMA_DEFAULT; CHAR_setWorkInt( meindex, CHAR_WORK_REVIVALTIME, tmp); CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPENPCENEMY ); CHAR_setWorkInt( meindex, CHAR_WORKEVENTTYPE, CHAR_EVENT_ENEMY); CHAR_setWorkInt( meindex, CHAR_WORK_BASEIMGBAK, CHAR_getInt( meindex, CHAR_BASEIMAGENUMBER)); return TRUE; }
int NPC_Lua_NLG_CreateBattle(lua_State *_NLL) { CheckEx2(_NLL, 2, 7); CheckIndexNull(_NLL, 1); CheckIndexNull(_NLL, 2); int TM_Top = lua_gettop(_NLL); int TM_i = 0; int TM_Flg = 0; CREATEENEMY TM_CreateEnemy[BATTLE_ENTRY_MAX]; int TM_ArLen = 0; memset(&TM_CreateEnemy, NULL, sizeof(TM_CreateEnemy)); int TM_CharIndex = (int)lua_tointeger(_NLL, 1); int TM_NpcIndex = (int)lua_tointeger(_NLL, 2); char *TM_DoFunc = NULL; if(TM_Top >= 3) { TM_DoFunc = lua_tostring(_NLL, 3); } if(TM_Top >= 5) { TM_ArLen = luaL_getn(_NLL, 5); TM_ArLen = min(TM_ArLen, BATTLE_ENTRY_MAX); for(TM_i = 1; TM_i <= TM_ArLen; TM_i++) { lua_rawgeti(_NLL, 5, TM_i); TM_CreateEnemy[TM_i - 1].BaseLevel = (int)lua_tointeger(_NLL, -1); lua_pop(_NLL, 1); } } if(TM_Top >= 6) { TM_ArLen = luaL_getn(_NLL, 6); TM_ArLen = min(TM_ArLen, BATTLE_ENTRY_MAX); for(TM_i = 1; TM_i <= TM_ArLen; TM_i++) { lua_rawgeti(_NLL, 6, TM_i); TM_CreateEnemy[TM_i - 1].SkillType = (int)lua_tointeger(_NLL, -1); lua_pop(_NLL, 1); } } if(TM_Top >= 7) { TM_Flg = (int)lua_tointeger(_NLL, 7); } //这个要放在最后 if(TM_Top >= 4) { TM_ArLen = luaL_getn(_NLL, 4); TM_ArLen = min(TM_ArLen, BATTLE_ENTRY_MAX); for(TM_i = 1; TM_i <= TM_ArLen; TM_i++) { lua_rawgeti(_NLL, 4, TM_i); TM_CreateEnemy[TM_i - 1].EnemyId = ENEMY_getEnemyArrayFromId((int)lua_tointeger(_NLL, -1)); lua_pop(_NLL, 1); } } //然后再调用创建战斗的函数 int TM_Ret = NPC_Lua_CreateVsEnemy(_NLL, TM_CharIndex, TM_NpcIndex, TM_DoFunc, &TM_CreateEnemy, TM_ArLen, TM_Flg); //返回负数表示失败 LRetInt(_NLL, TM_Ret); }