From 15cffab1abbb28829020283f76313627145e9beb Mon Sep 17 00:00:00 2001 From: johns <> Date: Mon, 4 Jun 2001 15:13:20 +0000 Subject: [PATCH] Parsing (player) completed. --- src/stratagus/script_player.cpp | 137 +++++++++++++++++++++++++++----- 1 file changed, 119 insertions(+), 18 deletions(-) diff --git a/src/stratagus/script_player.cpp b/src/stratagus/script_player.cpp index 05c6e07e1..818edc297 100644 --- a/src/stratagus/script_player.cpp +++ b/src/stratagus/script_player.cpp @@ -58,10 +58,21 @@ local SCM CclPlayer(SCM list) { SCM value; SCM data; + SCM sublist; Player* player; - //char* str; + int i; + char* str; - player=&Players[gh_scm2int(gh_car(list))]; + i=gh_scm2int(gh_car(list)); + player=&Players[i]; + if( NumPlayers<=i ) { + NumPlayers=i+1; + } + if( !(player->Units=(Unit**)calloc(UnitMax,sizeof(Unit*))) ) { + DebugLevel0("Not enough memory to create player %d.\n",i); + + return SCM_UNSPECIFIED; + } list=gh_cdr(list); // @@ -76,51 +87,141 @@ local SCM CclPlayer(SCM list) player->Name=gh_scm2newstr(data=gh_car(list),NULL); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("type")) ) { - DebugLevel0Fn("FIXME:\n"); + value=gh_car(list); list=gh_cdr(list); + if( gh_eq_p(value,gh_symbol2scm("neutral")) ) { + player->Type=PlayerNeutral; + } else if( gh_eq_p(value,gh_symbol2scm("nobody")) ) { + player->Type=PlayerNobody; + } else if( gh_eq_p(value,gh_symbol2scm("computer")) ) { + player->Type=PlayerComputer; + } else if( gh_eq_p(value,gh_symbol2scm("human")) ) { + player->Type=PlayerHuman; + } else if( gh_eq_p(value,gh_symbol2scm("rescue-passive")) ) { + player->Type=PlayerRescuePassive; + } else if( gh_eq_p(value,gh_symbol2scm("rescue-active")) ) { + player->Type=PlayerRescueActive; + } else { + // FIXME: this leaves a half initialized player + errl("Unsupported tag",value); + } } else if( gh_eq_p(value,gh_symbol2scm("race")) ) { - DebugLevel0Fn("FIXME:\n"); + player->RaceName=str=gh_scm2newstr(gh_car(list),NULL); + if( !strcmp(str,"human") ) { + player->Race=PlayerRaceHuman; + } else if( !strcmp(str,"orc") ) { + player->Race=PlayerRaceOrc; + } else if( !strcmp(str,"neutral") ) { + player->Race=PlayerRaceNeutral; + } else { + // FIXME: this leaves a half initialized player + errl("Unsupported tag",gh_car(list)); + } list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("ai")) ) { - DebugLevel0Fn("FIXME:\n"); + player->AiNum=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("team")) ) { - DebugLevel0Fn("FIXME:\n"); + player->Team=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("enemy")) ) { - DebugLevel0Fn("FIXME:\n"); + str=gh_scm2newstr(gh_car(list),NULL); list=gh_cdr(list); + for( i=0; i<PlayerMax && *str; ++i,++str ) { + if( *str=='-' || *str=='_' || *str==' ' ) { + player->Enemy&=~(1<<i); + } else { + player->Enemy|=(1<<i); + } + } } else if( gh_eq_p(value,gh_symbol2scm("allied")) ) { - DebugLevel0Fn("FIXME:\n"); + str=gh_scm2newstr(gh_car(list),NULL); list=gh_cdr(list); + for( i=0; i<PlayerMax && *str; ++i,++str ) { + if( *str=='-' || *str=='_' || *str==' ' ) { + player->Allied&=~(1<<i); + } else { + player->Allied|=(1<<i); + } + } } else if( gh_eq_p(value,gh_symbol2scm("start")) ) { - DebugLevel0Fn("FIXME:\n"); + value=gh_car(list); list=gh_cdr(list); + player->X=gh_scm2int(gh_car(value)); + player->Y=gh_scm2int(gh_cadr(value)); } else if( gh_eq_p(value,gh_symbol2scm("resources")) ) { - DebugLevel0Fn("FIXME:\n"); + sublist=gh_car(list); list=gh_cdr(list); + while( !gh_null_p(sublist) ) { + + value=gh_car(sublist); + sublist=gh_cdr(sublist); + + for( i=0; i<MaxCosts; ++i ) { + if( gh_eq_p(value,gh_symbol2scm(DEFAULT_NAMES[i])) ) { + player->Resources[i]=gh_scm2int(gh_car(sublist)); + break; + } + } + if( i==MaxCosts ) { + // FIXME: this leaves a half initialized player + errl("Unsupported tag",value); + } + sublist=gh_cdr(sublist); + } } else if( gh_eq_p(value,gh_symbol2scm("incomes")) ) { - DebugLevel0Fn("FIXME:\n"); + sublist=gh_car(list); list=gh_cdr(list); + while( !gh_null_p(sublist) ) { + + value=gh_car(sublist); + sublist=gh_cdr(sublist); + + for( i=0; i<MaxCosts; ++i ) { + if( gh_eq_p(value,gh_symbol2scm(DEFAULT_NAMES[i])) ) { + player->Incomes[i]=gh_scm2int(gh_car(sublist)); + break; + } + } + if( i==MaxCosts ) { + // FIXME: this leaves a half initialized player + errl("Unsupported tag",value); + } + sublist=gh_cdr(sublist); + } } else if( gh_eq_p(value,gh_symbol2scm("ai-enabled")) ) { - DebugLevel0Fn("FIXME:\n"); + player->AiEnabled=1; } else if( gh_eq_p(value,gh_symbol2scm("ai-disabled")) ) { - DebugLevel0Fn("FIXME:\n"); + player->AiEnabled=0; } else if( gh_eq_p(value,gh_symbol2scm("food-unit-limit")) ) { - DebugLevel0Fn("FIXME:\n"); + player->FoodUnitLimit=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("building-limit")) ) { - DebugLevel0Fn("FIXME:\n"); + player->BuildingLimit=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("total-unit-limit")) ) { - DebugLevel0Fn("FIXME:\n"); + player->TotalUnitLimit=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("score")) ) { - DebugLevel0Fn("FIXME:\n"); + player->Score=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("timers")) ) { - DebugLevel0Fn("FIXME:\n"); + sublist=gh_car(list); list=gh_cdr(list); + i=gh_length(sublist); + if( i!=UpgradeMax ) { + fprintf(stderr,"Wrong upgrade timer length %d\n",i); + } + + i=0; + while( !gh_null_p(sublist) ) { + if( i<UpgradeMax ) { + player->UpgradeTimers.Upgrades[i]= + gh_scm2int(gh_car(sublist)); + } + sublist=gh_cdr(sublist); + ++i; + } } else { // FIXME: this leaves a half initialized player errl("Unsupported tag",value);