diff --git a/src/ai/ai.cpp b/src/ai/ai.cpp index 56eb88188..389df75ea 100644 --- a/src/ai/ai.cpp +++ b/src/ai/ai.cpp @@ -62,91 +62,7 @@ global PlayerAi* AiPlayer; /// Current AI player /** ** W*rCr*ft number to internal ai-type name. */ -local char* AiTypeWcNames[] = { - "land-attack", - "passive", - "orc-03", - "hum-04", - "orc-04", - "hum-05", - "orc-05", - "hum-06", - "orc-06", - "hum-07", - "orc-07", - "hum-08", - "orc-08", - "hum-09", - "orc-09", - "hum-10", - "orc-10", - "hum-11", - "orc-11", - "hum-12", - "orc-12", - "hum-13", - "orc-13", - "hum-14-orange", - "orc-14-blue", - "sea-attack", - "air-attack", - "hum-14-red", - "hum-14-white", - "hum-14-black", - "orc-14-green", - "orc-14-white", - "orc-exp-04", - "orc-exp-05", - "orc-exp-07a", - "orc-exp-09", - "orc-exp-10", - "orc-exp-12", - "orc-exp-06a", - "orc-exp-06b", - "orc-exp-11a", - "orc-exp-11b", - "hum-exp-02a-red", - "hum-exp-02b-black", - "hum-exp-02c-yellow", - "hum-exp-03a-orange", - "hum-exp-03b-red", - "hum-exp-03c-violet", - "hum-exp-04a-black", - "hum-exp-04b-red", - "hum-exp-04c-white", - "hum-exp-05a-green", - "hum-exp-05b-orange", - "hum-exp-05c-violet", - "hum-exp-05d-yellow", - "hum-exp-06a-green", - "hum-exp-06b-black", - "hum-exp-06c-orange", - "hum-exp-06d-red", - "hum-exp-08a-white", - "hum-exp-08b-yellow", - "hum-exp-08c-violet", - "hum-exp-09a-black", - "hum-exp-09b-red", - "hum-exp-09c-green", - "hum-exp-09d-white", - "hum-exp-10a-violet", - "hum-exp-10b-green", - "hum-exp-10c-black", - "hum-exp-11a", - "hum-exp-11b", - "hum-exp-12a", - "orc-exp-05b", - "hum-exp-07a", - "hum-exp-07b", - "hum-exp-07c", - "orc-exp-12a", - "orc-exp-12b", - "orc-exp-12c", - "orc-exp-12d", - "orc-exp-02", - "orc-exp-07b", - "orc-exp-03", -}; +global char** AiTypeWcNames; /*---------------------------------------------------------------------------- -- Lowlevel functions @@ -317,10 +233,29 @@ local void AiCheckUnits(void) */ global void SaveAi(FILE* file) { + char** cp; + int i; + fprintf(file,"\n;;; -----------------------------------------\n"); fprintf(file,";;; MODULE: AI $Id$\n\n"); DebugLevel0Fn("FIXME: Saving AI isn't supported\n"); + + // + // Dump table wc2 race numbers -> internal symbol. + // + if( (cp=AiTypeWcNames) ) { + fprintf(file,"(define-ai-wc-names"); + + i=90; + while( *cp ) { + if( i+strlen(*cp)>79 ) { + i=fprintf(file,"\n "); + } + i+=fprintf(file," '%s",*cp++); + } + fprintf(file,")\n\n"); + } } /** @@ -344,18 +279,14 @@ global void AiInit(Player* player) pai->Player=player; ait=AiTypes; - ainame=NULL; - if( player->AiNum<sizeof(AiTypeWcNames)/sizeof(*AiTypeWcNames) ) { - ainame=AiTypeWcNames[player->AiNum]; - } - + ainame=AiTypeWcNames[player->AiNum]; DebugLevel0(" %s\n",ainame); // // Search correct AI type. // for( ;; ) { - if( ait->Race && strcmp(ait->Race,player->RaceName) ) { + if( ait->Race && strcmp(ait->Race,player->RaceName) ) { ait=ait->Next; if( !ait && ainame ) { ainame=NULL; @@ -398,6 +329,7 @@ global void CleanAi(void) void* temp; AiType* aitype; AiBuildQueue* queue; + char** cp; for( p=0; p<PlayerMax; ++p ) { if( (pai=Players[p].Ai) ) { @@ -505,6 +437,17 @@ global void CleanAi(void) free(AiHelpers.Equiv); memset(&AiHelpers,0,sizeof(AiHelpers)); + + // + // Mapping original AI numbers in puds to our internal strings + // + if( (cp=AiTypeWcNames) ) { // Free all old names + while( *cp ) { + free(*cp++); + } + free(AiTypeWcNames); + AiTypeWcNames=NULL; + } } /*---------------------------------------------------------------------------- diff --git a/src/ai/ai_local.h b/src/ai/ai_local.h index 962ba8c57..deb35ff86 100644 --- a/src/ai/ai_local.h +++ b/src/ai/ai_local.h @@ -326,6 +326,7 @@ extern AiType* AiTypes; /// List of all AI types extern AiHelper AiHelpers; /// AI helper variables extern PlayerAi* AiPlayer; /// Current AI player +extern char** AiTypeWcNames; /// pud num to internal string mapping /*---------------------------------------------------------------------------- -- Functions diff --git a/src/ai/script_ai.cpp b/src/ai/script_ai.cpp index 4106729e7..7807e9533 100644 --- a/src/ai/script_ai.cpp +++ b/src/ai/script_ai.cpp @@ -920,6 +920,37 @@ local SCM CclAiDump(void) return SCM_BOOL_F; } +/** +** Define AI mapping from original number to internal symbol +** +** @param list List of all names. +*/ +local SCM CclDefineAiWcNames(SCM list) +{ + int i; + char** cp; + + if( (cp=AiTypeWcNames) ) { // Free all old names + while( *cp ) { + free(*cp++); + } + free(AiTypeWcNames); + } + + // + // Get new table. + // + i=gh_length(list); + AiTypeWcNames=cp=malloc((i+1)*sizeof(char*)); + while( i-- ) { + *cp++=gh_scm2newstr(gh_car(list),NULL); + list=gh_cdr(list); + } + *cp=NULL; + + return SCM_UNSPECIFIED; +} + #else /** @@ -972,6 +1003,8 @@ global void AiCclRegister(void) gh_new_procedure1_0("ai:set-reserve!",CclAiSetReserve); gh_new_procedure0_0("ai:dump",CclAiDump); + + gh_new_procedureN("define-ai-wc-names",CclDefineAiWcNames); #endif } diff --git a/src/stratagus/player.cpp b/src/stratagus/player.cpp index c3ee39d89..b54253d40 100644 --- a/src/stratagus/player.cpp +++ b/src/stratagus/player.cpp @@ -110,7 +110,7 @@ global void CleanPlayers(void) for( p=0; p<PlayerMax; ++p ) { if( Players[p].Name ) { - free(Players[p].Name); + free(Players[p].Name); } if( Players[p].Units ) { free(Players[p].Units); @@ -764,15 +764,18 @@ global void PlayersEachSecond(void) int player; int res; - for( player=0; player<NumPlayers; ++player ) { - if ( (FrameCounter / FRAMES_PER_SECOND) % 10 == 0 ) { - for( res = 0; res < MaxCosts; res++ ) { - Players[player].Revenue[res] = Players[player].Resources[res] - Players[player].LastResources[res]; - Players[player].Revenue[res] *= 6; // estimate per minute - Players[player].LastResources[res] = Players[player].Resources[res]; - } - } - if( Players[player].AiEnabled ) { + for (player = 0; player < NumPlayers; ++player) { + if ((FrameCounter / FRAMES_PER_SECOND) % 10 == 0) { + for (res = 0; res < MaxCosts; res++) { + Players[player].Revenue[res] = + Players[player].Resources[res] - + Players[player].LastResources[res]; + Players[player].Revenue[res] *= 6; // estimate per minute + Players[player].LastResources[res] = + Players[player].Resources[res]; + } + } + if (Players[player].AiEnabled) { AiEachSecond(&Players[player]); } }