This is Haudruf.m in view mode; [Download] [Up]
#import "Haudruf.h"
#import <appkit/Application.h>
#import <appkit/Form.h>
#import <appkit/Button.h>
#import <appkit/Text.h>
#import <appkit/ScrollView.h>
#import <appkit/Panel.h>
#import <objc/List.h>
#import <appkit/publicWraps.h>
#import <string.h>
#define NIBFILE "Haudruf.cp/Haudruf.nib"
#define SCHEISSE 10
#define MIN(x,y) (x<y)?(x):(y)
const int countriesPerContinent[6] = {9, 4, 7, 6, 12, 4};
@implementation Haudruf
+ initialize
{
if (self = [Haudruf class])
[self setVersion:1];
return self;
}
- initPlayerNum:(int)pnum mover:mover gameSetup:gamesetup mapView:mapview
cardManager:cardmanager
{
int i;
[super initPlayerNum:pnum mover:mover gameSetup:gamesetup mapView:mapview
cardManager:cardmanager];
[NXApp loadNibSection:NIBFILE owner:self];
[myPlayerNumForm setIntValue:myPlayerNum at:0];
[haudrufPanel setBecomeKeyOnlyIfNeeded:YES];
[haudrufPanel orderFront:self];
for (i=0; i<6; i++)
gotContinent[i] = NO;
initialContinent = 1;
return self;
}
- free
{
[haudrufPanel free];
return [super free];
}
// *****************subclass responsibilities*********************
- yourChooseCountry
{
// choose a random country
id unoccList = [self unoccupiedCountries];
id country;
if ([unoccList count]==0)
return nil;
country = [unoccList objectAt:[rng randMax:[unoccList count]-1]];
[self setNotes:"sent by -yourChooseCountry. "
"yourChooseCountry chose a country at random."];
[self occupyCountry:country];
[unoccList free];
return self;
}
- yourInitialPlaceArmies:(int)numArmies
{
if (![self calcNumCountriesPerContinent])
{
NXRunAlertPanel("BUG", NULL, NULL,NULL, NULL);
return nil;
}
round = 0;
if(numCountriesPerContinent[initialContinent = AUSTRALIA] >= 2)
[self placeArmies:numArmies inCountry:[self bestCountryFor:AUSTRALIA]];
else if(numCountriesPerContinent[initialContinent = SOUTH_AMERICA] >= 2)
[self placeArmies:numArmies inCountry:[self bestCountryFor:SOUTH_AMERICA]];
else if(numCountriesPerContinent[initialContinent = NORTH_AMERICA] >= 4)
[self placeArmies:numArmies inCountry:[self bestCountryFor:NORTH_AMERICA]];
else if(numCountriesPerContinent[initialContinent = AFRICA] >= 3)
[self placeArmies:numArmies inCountry:[self bestCountryFor:AFRICA]];
else if(numCountriesPerContinent[initialContinent = SOUTH_AMERICA] >= 1)
[self placeArmies:numArmies inCountry:[self bestCountryFor:SOUTH_AMERICA]];
else if(numCountriesPerContinent[initialContinent = AUSTRALIA] >= 1)
[self placeArmies:numArmies inCountry:[self bestCountryFor:AUSTRALIA]];
else if(numCountriesPerContinent[initialContinent = NORTH_AMERICA] >= 2)
[self placeArmies:numArmies inCountry:[self bestCountryFor:NORTH_AMERICA]];
else if(numCountriesPerContinent[initialContinent = AFRICA] >= 2)
[self placeArmies:numArmies inCountry:[self bestCountryFor:AFRICA]];
else if(numCountriesPerContinent[initialContinent = NORTH_AMERICA] >= 1)
[self placeArmies:numArmies inCountry:[self bestCountryFor:NORTH_AMERICA]];
else
[self placeArmies:numArmies inCountry:[self bestCountryFor:SCHEISSE]];
return self;
}
- yourTurnWithArmies:(int)numArmies andCards:(int)numCards
{
id mycountries = [self myCountries];
id attackCountry = nil;
int i, numArmiesLeft;
round++;
turn=0;
numArmiesLeft = numArmies;
if ([mycountries count]==0)
return nil;
[mycountries free];
numArmiesLeft += [self turnInCards];
// Verteidigung vorhandener Kontinente
for (i=0; i<6; i++)
{
if (gotContinent[i])
numArmiesLeft -= [self defendContinent:i:numArmiesLeft];
}
// Stabilisierung
if (numArmiesLeft)
{
// Kontinent finden, wo viele armien stehen zum Angriff
numArmiesLeft -= [self stabilizeContinents:numArmiesLeft];
// Kontinent finden, der "leicht" erobert werden kann
numArmiesLeft -= [self conquerContinents:numArmiesLeft];
}
numArmiesLeft -= [self checkInitialContinent:numArmiesLeft];
if (numArmiesLeft)
{
// armeen in armeenreichstes Land mit Nachbarn
attackCountry = [self klotzArmies:numArmiesLeft];
}
while (attackCountry = [self findBestVictimFor:attackCountry])
;
[self fortifyPosition];
return self;
}
- youWereAttacked:country by:(int)player
{
// do nothing. these methods are for advanced players only.
// but we do set the notes and pause if we should.
[self setNotes:"-youWereAttacked: by: was called."];
[self clearArgForms];
[functionCalledForm setStringValue:""];
[returnValueForm setStringValue:""];
if ([pauseContinueButton state] == 1) {
[self waitForContinue];
}
return self;
}
- youLostCountry:country to:(int)player
{
// do nothing. these methods are for advanced players only.
// but we do set the notes and pause if we should.
[self setNotes:"-youLostCountry: to: was called."];
[self clearArgForms];
[functionCalledForm setStringValue:""];
[returnValueForm setStringValue:""];
if ([pauseContinueButton state] == 1) {
[self waitForContinue];
}
return self;
}
// *****************country utilities*********************
- (BOOL)occupyCountry:country
{
BOOL retVal;
retVal = [super occupyCountry:country];
[self clearArgForms];
[functionCalledForm setStringValue:"(BOOL)occupyCountry:" at:0];
[args1Form setTitle:"country" at:0];
if (country == nil) {
[args1Form setStringValue:"nil" at:0];
} else {
[args1Form setStringValue:[(Country *)country name] at:0];
}
if (retVal) {
[returnValueForm setStringValue:"YES" at:0];
} else {
[returnValueForm setStringValue:"NO" at:0];
}
[haudrufPanel orderFront:self];
if ([pauseContinueButton state] == 1) {
[self waitForContinue];
}
return retVal;
}
// *****************card utilities*********************
- (int)playCards:cardList
{
int retVal;
retVal = [super playCards:cardList];
[self clearArgForms];
[functionCalledForm setStringValue:"(int)playCards:" at:0];
[args1Form setTitle:"cardList" at:0];
if (cardList == nil) {
[args1Form setStringValue:"nil" at:0];
} else {
[args1Form setStringValue:"list of cards" at:0];
}
[returnValueForm setIntValue:retVal at:0];
[haudrufPanel orderFront:self];
if ([pauseContinueButton state] == 1) {
[self waitForContinue];
}
return retVal;
}
// *****************place army utilities*********************
- (BOOL)placeArmies:(int)numArmies inCountry:country
{
BOOL retVal;
retVal = [super placeArmies:numArmies inCountry:country];
[self clearArgForms];
[functionCalledForm setStringValue:"(BOOL)placeArmies: inCountry:" at:0];
[args1Form setTitle:"numArmies" at:0];
[args1Form setIntValue:numArmies at:0];
[args1Form setTitle:"country" at:1];
if (country == nil) {
[args1Form setStringValue:"nil" at:1];
} else {
[args1Form setStringValue:[(Country *)country name] at:1];
}
if (retVal) {
[returnValueForm setStringValue:"YES" at:0];
} else {
[returnValueForm setStringValue:"NO" at:0];
}
[haudrufPanel orderFront:self];
if ([pauseContinueButton state] == 1) {
[self waitForContinue];
}
return retVal;
}
// *****************attack utilities*********************
- (BOOL)attackOnceFrom:fromCountry to:toCountry
victory:(BOOL *)victory fromArmies:(int *)fromArmies
toArmies:(int *)toArmies vanquished:(BOOL *)vanquished
weWin:(BOOL *)wewin
{
BOOL retVal;
retVal = [super attackOnceFrom:fromCountry to:toCountry
victory:victory fromArmies:fromArmies
toArmies:toArmies vanquished:vanquished
weWin:wewin];
[self clearArgForms];
[functionCalledForm setStringValue:"(BOOL)attackOnceFrom: to: victory: "
"fromArmies: toArmies: vanquished: weWin:" at:0];
[args1Form setTitle:"fromCountry" at:0];
if (fromCountry == nil) {
[args1Form setStringValue:"nil" at:0];
} else {
[args1Form setStringValue:[(Country *)fromCountry name] at:0];
}
[args1Form setTitle:"toCountry" at:1];
if (toCountry == nil) {
[args1Form setStringValue:"nil" at:1];
} else {
[args1Form setStringValue:[(Country *)toCountry name] at:1];
}
[args1Form setTitle:"victory" at:2];
if (*victory) {
[args1Form setStringValue:"YES" at:2];
} else {
[args1Form setStringValue:"NO" at:2];
}
[args1Form setTitle:"fromArmies" at:3];
[args1Form setIntValue:*fromArmies at:3];
[args2Form setTitle:"toArmies" at:0];
[args2Form setIntValue:*toArmies at:0];
[args2Form setTitle:"vanquished" at:1];
if (*vanquished) {
[args2Form setStringValue:"YES" at:1];
} else {
[args2Form setStringValue:"NO" at:1];
}
[args2Form setTitle:"weWin" at:2];
if (*wewin) {
[args2Form setStringValue:"YES" at:2];
} else {
[args2Form setStringValue:"NO" at:2];
}
if (retVal) {
[returnValueForm setStringValue:"YES" at:0];
} else {
[returnValueForm setStringValue:"NO" at:0];
}
[haudrufPanel orderFront:self];
if ([pauseContinueButton state] == 1) {
[self waitForContinue];
}
return retVal;
}
- (BOOL)attackTimes:(int)times from:fromCountry to:toCountry
victory:(BOOL *)victory fromArmies:(int *)fromArmies
toArmies:(int *)toArmies vanquished:(BOOL *)vanquished
weWin:(BOOL *)wewin
{
BOOL retVal;
retVal = [super attackTimes:times from:fromCountry to:toCountry
victory:victory fromArmies:fromArmies
toArmies:toArmies vanquished:vanquished
weWin:wewin];
[self clearArgForms];
[functionCalledForm setStringValue:"(BOOL)attackTimes: from: to: victory: "
"fromArmies: toArmies: vanquished: weWin:" at:0];
[args1Form setTitle:"times" at:0];
[args1Form setIntValue:times at:0];
[args1Form setTitle:"fromCountry" at:1];
if (fromCountry == nil) {
[args1Form setStringValue:"nil" at:1];
} else {
[args1Form setStringValue:[(Country *)fromCountry name] at:1];
}
[args1Form setTitle:"toCountry" at:2];
if (toCountry == nil) {
[args1Form setStringValue:"nil" at:2];
} else {
[args1Form setStringValue:[(Country *)toCountry name] at:2];
}
[args1Form setTitle:"victory" at:3];
if (*victory) {
[args1Form setStringValue:"YES" at:3];
} else {
[args1Form setStringValue:"NO" at:3];
}
[args2Form setTitle:"fromArmies" at:0];
[args2Form setIntValue:*fromArmies at:0];
[args2Form setTitle:"toArmies" at:1];
[args2Form setIntValue:*toArmies at:1];
[args2Form setTitle:"vanquished" at:2];
if (*vanquished) {
[args2Form setStringValue:"YES" at:2];
} else {
[args2Form setStringValue:"NO" at:2];
}
[args2Form setTitle:"weWin" at:3];
if (*wewin) {
[args2Form setStringValue:"YES" at:3];
} else {
[args2Form setStringValue:"NO" at:3];
}
if (retVal) {
[returnValueForm setStringValue:"YES" at:0];
} else {
[returnValueForm setStringValue:"NO" at:0];
}
[haudrufPanel orderFront:self];
if ([pauseContinueButton state] == 1) {
[self waitForContinue];
}
return retVal;
}
- (BOOL)attackUntilLeft:(int)untilLeft from:fromCountry to:toCountry
victory:(BOOL *)victory fromArmies:(int *)fromArmies
toArmies:(int *)toArmies vanquished:(BOOL *)vanquished
weWin:(BOOL *)wewin
{
BOOL retVal;
retVal = [super attackUntilLeft:untilLeft from:fromCountry to:toCountry
victory:victory fromArmies:fromArmies
toArmies:toArmies vanquished:vanquished
weWin:wewin];
[self clearArgForms];
[functionCalledForm setStringValue:"(BOOL)attackUntilLeft: from: to: "
"victory: fromArmies: toArmies: vanquished: weWin:" at:0];
[args1Form setTitle:"untilLeft" at:0];
[args1Form setIntValue:untilLeft at:0];
[args1Form setTitle:"fromCountry" at:1];
if (fromCountry == nil) {
[args1Form setStringValue:"nil" at:1];
} else {
[args1Form setStringValue:[(Country *)fromCountry name] at:1];
}
[args1Form setTitle:"toCountry" at:2];
if (toCountry == nil) {
[args1Form setStringValue:"nil" at:2];
} else {
[args1Form setStringValue:[(Country *)toCountry name] at:2];
}
[args1Form setTitle:"victory" at:3];
if (*victory) {
[args1Form setStringValue:"YES" at:3];
} else {
[args1Form setStringValue:"NO" at:3];
}
[args2Form setTitle:"fromArmies" at:0];
[args2Form setIntValue:*fromArmies at:0];
[args2Form setTitle:"toArmies" at:1];
[args2Form setIntValue:*toArmies at:1];
[args2Form setTitle:"vanquished" at:2];
if (*vanquished) {
[args2Form setStringValue:"YES" at:2];
} else {
[args2Form setStringValue:"NO" at:2];
}
[args2Form setTitle:"weWin" at:3];
if (*wewin) {
[args2Form setStringValue:"YES" at:3];
} else {
[args2Form setStringValue:"NO" at:3];
}
if (retVal) {
[returnValueForm setStringValue:"YES" at:0];
} else {
[returnValueForm setStringValue:"NO" at:0];
}
[haudrufPanel orderFront:self];
if ([pauseContinueButton state] == 1) {
[self waitForContinue];
}
return retVal;
}
- (BOOL)attackUntilCantFrom:fromCountry to:toCountry
victory:(BOOL *)victory fromArmies:(int *)fromArmies
toArmies:(int *)toArmies vanquished:(BOOL *)vanquished
weWin:(BOOL *)wewin
{
BOOL retVal;
retVal = [super attackUntilCantFrom:fromCountry to:toCountry
victory:victory fromArmies:fromArmies
toArmies:toArmies vanquished:vanquished
weWin:wewin];
[self clearArgForms];
[functionCalledForm setStringValue:"(BOOL)attackUntilCantFrom: to: "
"victory: fromArmies: toArmies: vanquished: weWin:" at:0];
[args1Form setTitle:"fromCountry" at:0];
if (fromCountry == nil) {
[args1Form setStringValue:"nil" at:0];
} else {
[args1Form setStringValue:[(Country *)fromCountry name] at:0];
}
[args1Form setTitle:"toCountry" at:1];
if (toCountry == nil) {
[args1Form setStringValue:"nil" at:1];
} else {
[args1Form setStringValue:[(Country *)toCountry name] at:1];
}
[args1Form setTitle:"victory" at:2];
if (*victory) {
[args1Form setStringValue:"YES" at:2];
} else {
[args1Form setStringValue:"NO" at:2];
}
[args1Form setTitle:"fromArmies" at:3];
[args1Form setIntValue:*fromArmies at:3];
[args2Form setTitle:"toArmies" at:0];
[args2Form setIntValue:*toArmies at:0];
[args2Form setTitle:"vanquished" at:1];
if (*vanquished) {
[args2Form setStringValue:"YES" at:1];
} else {
[args2Form setStringValue:"NO" at:1];
}
[args2Form setTitle:"weWin" at:2];
if (*wewin) {
[args2Form setStringValue:"YES" at:2];
} else {
[args2Form setStringValue:"NO" at:2];
}
if (retVal) {
[returnValueForm setStringValue:"YES" at:0];
} else {
[returnValueForm setStringValue:"NO" at:0];
}
[haudrufPanel orderFront:self];
if ([pauseContinueButton state] == 1) {
[self waitForContinue];
}
return retVal;
}
// *****************post-attack & fortify utilities*********************
- (BOOL)moveArmies:(int)numArmies from:fromCountry to:toCountry
{
BOOL retVal;
retVal = [super moveArmies:numArmies from:fromCountry to:toCountry];
[self clearArgForms];
[functionCalledForm setStringValue:"(BOOL)moveArmies: from: to:" at:0];
[args1Form setTitle:"numArmies" at:0];
[args1Form setIntValue:numArmies at:0];
[args1Form setTitle:"fromCountry" at:1];
if (fromCountry == nil) {
[args1Form setStringValue:"nil" at:1];
} else {
[args1Form setStringValue:[(Country *)fromCountry name] at:1];
}
[args1Form setTitle:"toCountry" at:1];
if (toCountry == nil) {
[args1Form setStringValue:"nil" at:1];
} else {
[args1Form setStringValue:[(Country *)toCountry name] at:1];
}
if (retVal) {
[returnValueForm setStringValue:"YES" at:0];
} else {
[returnValueForm setStringValue:"NO" at:0];
}
[haudrufPanel orderFront:self];
if ([pauseContinueButton state] == 1) {
[self waitForContinue];
}
return retVal;
}
// *****************special haudruf methods*********************
- waitForContinue
{
int retVal;
NXBeep();
if (![haudrufPanel isVisible]) [haudrufPanel orderFront:self];
[pauseContinueButton setEnabled:NO];
retVal = [NXApp runModalFor:haudrufPanel];
return self;
}
- continueAction:sender
{
[NXApp stopModal];
[pauseContinueButton setEnabled:YES];
return self;
}
- checkAction:sender
{
if ([sender state] == 1) {
[continueButton setEnabled:YES];
} else {
[continueButton setEnabled:NO];
}
return self;
}
- clearArgForms
{
[args1Form setTitle:"arg1:" at:0];
[args1Form setTitle:"arg2:" at:1];
[args1Form setTitle:"arg3:" at:2];
[args1Form setTitle:"arg4:" at:3];
[args2Form setTitle:"arg5:" at:0];
[args2Form setTitle:"arg6:" at:1];
[args2Form setTitle:"arg7:" at:2];
[args2Form setTitle:"arg8:" at:3];
[args1Form setStringValue:"" at:0];
[args1Form setStringValue:"" at:1];
[args1Form setStringValue:"" at:2];
[args1Form setStringValue:"" at:3];
[args2Form setStringValue:"" at:0];
[args2Form setStringValue:"" at:1];
[args2Form setStringValue:"" at:2];
[args2Form setStringValue:"" at:3];
return self;
}
- setNotes:(const char *)noteText
{
[[notesScrollText docView] setText:noteText];
return self;
}
- calcNumCountriesPerContinent
{
int i,j,k, numContCountries, numMyCountries, tmp;
id countryList;
id mycountries = [self myCountries];
if ((numMyCountries=[mycountries count])==0)
return nil;
numGotContinents = 0;
for (i=0; i<6; i++)
numCountriesPerContinent[i] = 0;
for (i=0; i<6; i++)
{
countryList = [self countriesInContinent:i];
numContCountries = [countryList count];
for (j=0; j<numMyCountries; j++)
{
for (k=0; k<numContCountries; k++)
{
if ([[mycountries objectAt:j] idNum] == [[countryList objectAt:k] idNum])
{
tmp = numCountriesPerContinent[i]++;
countriesInContinent[i][tmp] = [[countryList objectAt:k] idNum];
}
}
}
if(numCountriesPerContinent[i] == countriesPerContinent[i])
{
gotContinent[i]= YES;
numGotContinents++;
}
[countryList free];
}
[mycountries free];
return self;
}
- bestCountryFor:(int)continent
{
id countryList = [self countriesInContinent:continent];
id retCountry;
int i;
for (i=0; i<[countryList count]; i++)
{
if ([[countryList objectAt:i] idNum] == countriesInContinent[continent][0])
{
retCountry = [countryList objectAt:i];
[countryList free];
return retCountry;
}
}
[countryList free];
return nil;
}
- (BOOL)countryInContinent:country :(int)continent
{
id contlist = [self countriesInContinent:continent];
int i, num;
num = [contlist count];
for (i=0; i<num; i++)
{
if([[contlist objectAt:i] idNum] == [country idNum])
{
[contlist free];
return YES;
}
}
[contlist free];
return NO;
}
- (int)turnInCards
{
id cardSet;
int temp, numArmies = 0;
cardSet = [self bestSet];
while (cardSet != nil)
{
temp = [self playCards:cardSet];
[cardSet free];
if (temp == -1)
{
NXRunAlertPanel("Debug", "bestSet returned an invalid cardset",
"OK", NULL, NULL);
cardSet=nil;
}
else
{
numArmies += temp;
cardSet = [self bestSet];
}
}
return numArmies;
}
- (int)defendContinent:(int)continent:(int)armiesLeft
{
// id maxCountry;
fprintf(stderr, "defend:%d with:%d\n", continent, armiesLeft);
// return maxCountry;
// maxCountry = [self getMaxArmyCountry];
if (continent == AUSTRALIA)
{
fprintf(stderr, "defend Australia:%d with:%d\n", continent, armiesLeft);
[self placeArmies:MIN(armiesLeft,5) inCountry:[self getCountryNamed:"Indonesia"]];
return MIN(armiesLeft,5);
}
else if (continent == SOUTH_AMERICA)
{
[self placeArmies:MIN(armiesLeft,5) inCountry:[self getCountryNamed:"Brazil"]];
[self placeArmies:MIN(armiesLeft,5) inCountry:[self getCountryNamed:"Venezuela"]];
return MIN(armiesLeft,5);
}
else if (continent == NORTH_AMERICA)
{
[self placeArmies:MIN(armiesLeft,5) inCountry:[self getCountryNamed:"Alaska"]];
[self placeArmies:MIN(armiesLeft,5) inCountry:[self getCountryNamed:"Greenland"]];
[self placeArmies:MIN(armiesLeft,5) inCountry:[self getCountryNamed:"Central America"]];
return MIN(armiesLeft,5);
}
return 0;
}
- (int)stabilizeContinents:(int)armiesLeft
{
return 0;
}
- (int)conquerContinents:(int)armiesLeft
{
return 0;
}
- klotzArmies:(int)armiesLeft
{
id maxCountry;
[self placeArmies:armiesLeft inCountry:maxCountry=[self getMaxArmyCountry]];
// fprintf(stderr, "armeen:%d in:%s\n", armiesLeft, [maxCountry name]);
return maxCountry;
}
- findBestVictimFor:country
{
id enemyList = [self enemyNeighborsTo:country];
int i, min=10000, fromArmies, toArmies;
BOOL victory, weWin, vanquished;
id minEnemy=nil;
if ([country armies]<4)
return nil;
turn++;
if (enemyList)
{
for (i=[enemyList count]-1;i>=0;i--)
{
if ([[enemyList objectAt:i] armies] < min)
{
minEnemy = [enemyList objectAt:i];
min = [minEnemy armies];
}
}
if ([self attackUntilLeft:3 from:country to:minEnemy victory:&victory
fromArmies:&fromArmies toArmies: &toArmies vanquished:&vanquished
weWin:&weWin])
[self moveArmies:fromArmies-((round>25)?4:1) from:country to:minEnemy];
[enemyList free];
if ((round > 20) && (turn<10))
{
if (enemyList=[self neighborsTo:minEnemy])
{
[enemyList free];
return minEnemy;
}
}
}
return nil;
}
- fortifyPosition
{
id tmp, maxCountry;
if ([tmp=[self enemyNeighborsTo:maxCountry=[self getMaxArmyCountry]] count])
{
[tmp free];
return self;
}
[tmp free];
tmp = [self neighborsTo:maxCountry];
// fprintf(stderr, "armies:%d from:%s to:%s",
// [maxCountry armies], [maxCountry name],[[tmp objectAt:1] name]);
[self moveArmies:[maxCountry armies]-1 from:maxCountry to:[tmp objectAt:[rng randMax:[tmp count]-1]]];
[tmp free];
return self;
}
- enemyNeighborsTo:country
{
id en = [self neighborsTo:country];
int i;
// NXRunAlertPanel("44", NULL, NULL,NULL, NULL);
for (i=[en count]-1;i>=0;i--)
{
if ([[en objectAt:i] player] == myPlayerNum)
[en removeObjectAt:i];
}
if ([en count]==0)
{
[en free];
return nil;
}
else
return en;
}
- getMaxArmyWithEnemyCountry
{
id armieCountries;
int cnt, i, max=0;
id maxCountry=nil;
id preventJunk=nil;
if (!(armieCountries=[self myCountriesWithAvailableArmies]))
armieCountries=[self countryList];
cnt = [armieCountries count];
for (i=0; i<cnt; i++)
{
// Falls armeen vorhanden und Feinde da
if( ([[armieCountries objectAt:i] armies] > max) &&
(preventJunk=[self enemyNeighborsTo:[armieCountries objectAt:i]]))
{
max = [[armieCountries objectAt:i] armies];
maxCountry = [armieCountries objectAt:i];
}
}
[preventJunk free];
[armieCountries free];
return maxCountry;
}
- getMaxArmyCountry
{
id armieCountries;
int cnt, i, max=0;
id maxCountry=nil;
if (!(armieCountries=[self myCountriesWithAvailableArmies]))
armieCountries=[self countryList];
cnt = [armieCountries count];
for (i=0; i<cnt; i++)
{
if([[armieCountries objectAt:i] armies] > max)
{
max = [[armieCountries objectAt:i] armies];
maxCountry = [armieCountries objectAt:i];
}
}
[armieCountries free];
return maxCountry;
}
- getCountryNamed:(char*)name
{
id countryList = [self myCountries];
int i,cnt = [countryList count];
for (i=0; i<cnt; i++)
{
if (!strcmp(name, [(Country *)[countryList objectAt:i] name]))
{
// fprintf(stderr, "Got:%s Wanted:%s\n",[[countryList objectAt:i] name], name);
return [countryList objectAt:i];
}
}
return nil;
}
- (int) checkInitialContinent:(int) numArmies
{
int i, fromArmies, toArmies;
// int i, min=10000, fromArmies, toArmies;
BOOL victory, weWin, vanquished;
id minEnemy=nil;
id maxCountry = [self getMaxArmyCountry];
if (gotContinent[initialContinent])
return 0;
if (numCountriesPerContinent[initialContinent] == 0)
return 0;
if ([self countryInContinent:maxCountry:initialContinent])
{
id enemyList = [self enemyNeighborsTo:maxCountry];
if (enemyList)
{
if (numCountriesPerContinent[initialContinent] + [enemyList count] ==
countriesPerContinent[initialContinent])
{
for (i=[enemyList count]-1;i>=0;i--)
{
if ([self attackUntilLeft:3 from:maxCountry to:[enemyList objectAt:i] victory:&victory
fromArmies:&fromArmies toArmies: &toArmies vanquished:&vanquished
weWin:&weWin])
[self moveArmies:fromArmies-((round>25)?4:1) from:maxCountry to:minEnemy];
}
}
[enemyList free];
}
}
return 0; // added by Don Yacktman to supress warnings...
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.