InputAxis* AxisFactory::create_button_axis(SCM lst) { InputButton* left = ButtonFactory::create(gh_car(lst)); InputButton* right = ButtonFactory::create(gh_cadr(lst)); return new ButtonAxis(left, right); }
InputAxis* AxisFactory::create_joystick_axis(SCM lst) { int device_num = gh_scm2int(gh_car(lst)); int axis_num = gh_scm2int(gh_cadr(lst)); if (device_num >= 0 && device_num < CL_Joystick::get_device_count()) return new InputAxisInputDevice(CL_Joystick::get_device(device_num), axis_num); else { throw FeuerkraftError("Error: AxisFactory::create_joystick_axis: " + Guile::scm2string(lst)); return 0; } }
int building_create_type(const char* name, SCM lst) { AList alist; while(!gh_null_p(lst)) { SCM key = gh_car(lst); if (gh_null_p(gh_cdr(lst))) { std::cout << "Missing argument to keyword!" << std::endl; } SCM value = gh_cadr(lst); if (gh_boolean_p(value)) { alist.set_bool(Guile::keyword2string(key), gh_scm2bool(value)); } else if (gh_number_p(value)) { alist.set_int(Guile::keyword2string(key), gh_scm2int(value)); } else if (gh_string_p(value)) { alist.set_string(Guile::keyword2string(key), Guile::scm2string(value)); } else { std::cout << "BuildingCommands: unknown argumnent type" << std::endl; } lst = gh_cddr(lst); } return BuildingTypeManager::current()->register_factory(new CustomBuildingFactory(name, alist)); }
/** ** Parse the player configuration. ** ** @param list Tagged list of all informations. */ local SCM CclPlayer(SCM list) { SCM value; SCM sublist; Player* player; int i; char* str; i=gh_scm2int(gh_car(list)); player=&Players[i]; if( NumPlayers<=i ) { NumPlayers=i+1; } player->Player = i; player->Color=PlayerColors[i]; if( !(player->Units=(Unit**)calloc(UnitMax,sizeof(Unit*))) ) { DebugLevel0("Not enough memory to create player %d.\n" _C_ i); return SCM_UNSPECIFIED; } list=gh_cdr(list); // // Parse the list: (still everything could be changed!) // while( !gh_null_p(list) ) { value=gh_car(list); list=gh_cdr(list); if( gh_eq_p(value,gh_symbol2scm("name")) ) { player->Name=gh_scm2newstr(gh_car(list),NULL); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("type")) ) { 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("person")) ) { player->Type=PlayerPerson; } 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")) ) { str=gh_scm2newstr(gh_car(list),NULL); if( RaceWcNames ) { for( i=0; RaceWcNames[i]; ++i ) { if( !strcmp(str,RaceWcNames[i]) ) { player->RaceName=RaceWcNames[i]; player->Race=i; break; } } } free(str); if( !RaceWcNames || !RaceWcNames[i] ) { // FIXME: this leaves a half initialized player errl("Unsupported tag",gh_car(list)); } #if 0 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)); } #endif list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("ai")) ) { player->AiNum=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("team")) ) { player->Team=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("enemy")) ) { 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")) ) { 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("shared-vision")) ) { str=gh_scm2newstr(gh_car(list),NULL); list=gh_cdr(list); for( i=0; i<PlayerMax && *str; ++i,++str ) { if( *str=='-' || *str=='_' || *str==' ' ) { player->SharedVision&=~(1<<i); } else { player->SharedVision|=(1<<i); } } } else if( gh_eq_p(value,gh_symbol2scm("start")) ) { value=gh_car(list); list=gh_cdr(list); player->StartX=gh_scm2int(gh_car(value)); player->StartY=gh_scm2int(gh_cadr(value)); } else if( gh_eq_p(value,gh_symbol2scm("resources")) ) { 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((char*)DefaultResourceNames[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")) ) { 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((char*)DefaultResourceNames[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")) ) { player->AiEnabled=1; } else if( gh_eq_p(value,gh_symbol2scm("ai-disabled")) ) { player->AiEnabled=0; } else if( gh_eq_p(value,gh_symbol2scm("food")) ) { player->Food=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("food-unit-limit")) ) { player->FoodUnitLimit=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("building-limit")) ) { player->BuildingLimit=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("total-unit-limit")) ) { player->TotalUnitLimit=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("score")) ) { player->Score=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("total-units")) ) { player->TotalUnits=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("total-buildings")) ) { player->TotalBuildings=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("total-razings")) ) { player->TotalRazings=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("total-kills")) ) { player->TotalKills=gh_scm2int(gh_car(list)); list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("total-resources")) ) { sublist=gh_car(list); list=gh_cdr(list); i=gh_length(sublist); if( i!=MaxCosts ) { fprintf(stderr,"Wrong number of total-resources %d\n",i); } i=0; while( !gh_null_p(sublist) ) { if( i<MaxCosts ) { player->TotalResources[i]=gh_scm2int(gh_car(sublist)); } sublist=gh_cdr(sublist); ++i; } player->TotalUnits=gh_scm2int(gh_car(list)); } else if( gh_eq_p(value,gh_symbol2scm("timers")) ) { 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); } } return SCM_UNSPECIFIED; }