ftp.nice.ch/pub/next/games/board/RiskPlayers.1.0.NIHS.bs.tar.gz#/RiskPlayers/Haudruf.cp/Haudruf.m

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.