int Game::SetupFaction( Faction *pFac ) { pFac->unclaimed = Globals->START_MONEY + TurnNumber() * 50; if (pFac->noStartLeader) return 1; // // Set up first unit. // Unit *temp2 = GetNewUnit( pFac ); temp2->SetMen(I_LEADERS, 1); pFac->DiscoverItem(I_LEADERS, 0, 1); temp2->reveal = REVEAL_FACTION; if (TurnNumber() >= 12) { temp2->type = U_MAGE; temp2->Study(S_PATTERN, 30); temp2->Study(S_SPIRIT, 30); temp2->Study(S_GATE_LORE, 30); } if (Globals->UPKEEP_MINIMUM_FOOD > 0) { if (!(ItemDefs[I_FOOD].flags & ItemType::DISABLED)) { temp2->items.SetNum(I_FOOD, 6); pFac->DiscoverItem(I_FOOD, 0, 1); } else if (!(ItemDefs[I_FISH].flags & ItemType::DISABLED)) { temp2->items.SetNum(I_FISH, 6); pFac->DiscoverItem(I_FISH, 0, 1); } else if (!(ItemDefs[I_LIVESTOCK].flags & ItemType::DISABLED)) { temp2->items.SetNum(I_LIVESTOCK, 6); pFac->DiscoverItem(I_LIVESTOCK, 0, 1); } else if (!(ItemDefs[I_GRAIN].flags & ItemType::DISABLED)) { temp2->items.SetNum(I_GRAIN, 2); pFac->DiscoverItem(I_GRAIN, 0, 1); } temp2->items.SetNum(I_SILVER, 10); } ARegion *reg = NULL; if (pFac->pStartLoc) { reg = pFac->pStartLoc; } else if (!Globals->MULTI_HEX_NEXUS) { reg = (ARegion *)(regions.First()); } else { ARegionArray *pArr = regions.GetRegionArray(ARegionArray::LEVEL_NEXUS); while(!reg) { reg = pArr->GetRegion(getrandom(pArr->x), getrandom(pArr->y)); } } temp2->MoveUnit( reg->GetDummy() ); return( 1 ); }
int Game::SetupFaction( Faction *pFac ) { pFac->unclaimed = Globals->START_MONEY + TurnNumber() * 50; if (pFac->noStartLeader) return 1; // // Set up first unit. // Unit *temp2 = GetNewUnit( pFac ); temp2->SetMen(I_LEADERS, 1); pFac->DiscoverItem(I_LEADERS, 0, 1); temp2->reveal = REVEAL_FACTION; temp2->type = U_MAGE; temp2->Study(S_PATTERN, 30); temp2->Study(S_SPIRIT, 30); temp2->Study(S_GATE_LORE, 30); if (TurnNumber() >= 25) { temp2->Study(S_PATTERN, 60); temp2->Study(S_SPIRIT, 60); temp2->Study(S_FORCE, 90); temp2->Study(S_COMBAT, 30); } if (Globals->UPKEEP_MINIMUM_FOOD > 0) { if (!(ItemDefs[I_FOOD].flags & ItemType::DISABLED)) { temp2->items.SetNum(I_FOOD, 6); pFac->DiscoverItem(I_FOOD, 0, 1); } else if (!(ItemDefs[I_FISH].flags & ItemType::DISABLED)) { temp2->items.SetNum(I_FISH, 6); pFac->DiscoverItem(I_FISH, 0, 1); } else if (!(ItemDefs[I_LIVESTOCK].flags & ItemType::DISABLED)) { temp2->items.SetNum(I_LIVESTOCK, 6); pFac->DiscoverItem(I_LIVESTOCK, 0, 1); } else if (!(ItemDefs[I_GRAIN].flags & ItemType::DISABLED)) { temp2->items.SetNum(I_GRAIN, 2); pFac->DiscoverItem(I_GRAIN, 0, 1); } temp2->items.SetNum(I_SILVER, 10); } ARegion *reg = NULL; if (pFac->pStartLoc) { reg = pFac->pStartLoc; } else if (!Globals->MULTI_HEX_NEXUS) { reg = (ARegion *)(regions.First()); } else { ARegionArray *pArr = regions.GetRegionArray(ARegionArray::LEVEL_NEXUS); while(!reg) { reg = pArr->GetRegion(getrandom(pArr->x), getrandom(pArr->y)); } } temp2->MoveUnit( reg->GetDummy() ); if (Globals->LAIR_MONSTERS_EXIST || Globals->WANDERING_MONSTERS_EXIST) { // Try to auto-declare all player factions unfriendly // to Creatures, since all they do is attack you. pFac->SetAttitude(monfaction, A_UNFRIENDLY); } return( 1 ); }
ARegion *ARegionList::GetStartingCity( ARegion *AC, int i, int level, int maxX, int maxY ) { ARegionArray *pArr = pRegionArrays[ level ]; ARegion * reg = 0; if( pArr->x < maxX ) maxX = pArr->x; if( pArr->y < maxY ) maxY = pArr->y; int tries = 0; while (!reg && tries < 10000) { // // We'll just let AC exits be all over the map. // int x = getrandom( maxX ); int y = 2 * getrandom( maxY / 2 ) + x % 2; reg = pArr->GetRegion( x, y); if(!reg || !reg->CanBeStartingCity( pArr )) { reg = 0; tries++; continue; } for (int j=0; j<i; j++) { if(!AC->neighbors[j]) continue; if (GetDistance(reg,AC->neighbors[j]) < maxY / 10 + 2 ) { reg = 0; tries++; break; } } } // Okay, we failed to find something that normally would work // we'll just take anything that's of the right distance tries = 0; while (!reg && tries < 10000) { // // We couldn't find a normal starting city, let's just go for ANY // city // int x = getrandom( maxX ); int y = 2 * getrandom( maxY / 2 ) + x % 2; reg = pArr->GetRegion( x, y); if(!reg || reg->type == R_OCEAN) { tries++; reg = 0; continue; } for (int j=0; j<i; j++) { if(!AC->neighbors[j]) continue; if (GetDistance(reg,AC->neighbors[j]) < maxY / 10 + 2 ) { reg = 0; tries++; break; } } } // Okay, if we still don't have anything, we're done. return reg; }