This is RiskWorld.m in view mode; [Download] [Up]
//
// This file is a part of Risk by Mike Ferris.
//
#import "Risk.h"
RCSID ("$Id: RiskWorld.m,v 1.3 1997/12/15 07:44:15 nygard Exp $");
#import "RiskWorld.h"
#import "Country.h"
#import "RiskNeighbor.h"
#import "Continent.h"
#import "NSObjectExtensions.h"
#import "RiskCard.h"
//======================================================================
// A RiskWorld has a name, continents with countries, and neighboring
// country data.
//
// If multiple RiskWorlds are allowed, each world could be a bundle
// that has the images for each card, as well as the encoded data for
// the world and the RiskMapView background image.
//======================================================================
#define RISKWORLD_DATAFILE @"RiskWorld"
#define RiskWorld_VERSION 1
@implementation RiskWorld
+ (void) initialize
{
if (self == [RiskWorld class])
{
[self setVersion:RiskWorld_VERSION];
}
}
//----------------------------------------------------------------------
+ defaultRiskWorld
{
NSBundle *thisBundle;
NSString *path;
RiskWorld *riskWorld;
// Load default countries/shapes...
thisBundle = [NSBundle bundleForClass:[self class]];
NSAssert (thisBundle != nil, @"Could not get this bundle.");
path = [thisBundle pathForResource:RISKWORLD_DATAFILE ofType:@"data"];
NSAssert (path != nil, @"Could not get path to data file.");
riskWorld = [NSUnarchiver unarchiveObjectWithFile:path];
//NSLog (@"default risk world: %@", riskWorld);
return riskWorld;
}
//----------------------------------------------------------------------
+ riskWorldWithContinents:(NSDictionary *)theContinents countryNeighbors:(NSArray *)neighbors cards:(NSArray *)theCards
{
return [[[RiskWorld alloc] initWithContinents:theContinents countryNeighbors:neighbors cards:theCards] autorelease];
}
//----------------------------------------------------------------------
- initWithContinents:(NSDictionary *)theContinents countryNeighbors:(NSArray *)neighbors cards:(NSArray *)theCards
{
if ([super init] == nil)
return nil;
allCountries = [[NSMutableSet set] retain];
countryNeighbors = [neighbors retain];
continents = [theContinents retain];
cards = [theCards retain];
[self _buildAllCountries];
return self;
}
//----------------------------------------------------------------------
- (void) dealloc
{
[self _disconnectCountries];
SNRelease (allCountries);
SNRelease (countryNeighbors);
SNRelease (continents);
SNRelease (cards);
[super dealloc];
}
//----------------------------------------------------------------------
- (void) encodeWithCoder:(NSCoder *)aCoder
{
NSEnumerator *neighborEnumerator;
RiskNeighbor *riskNeighbor;
NSEnumerator *cardEnumerator;
RiskCard *card;
int count;
int cardType;
[super encodeWithCoder:aCoder];
[aCoder encodeObject:continents];
count = [countryNeighbors count];
[aCoder encodeValueOfObjCType:@encode (int) at:&count];
neighborEnumerator = [countryNeighbors objectEnumerator];
while (riskNeighbor = [neighborEnumerator nextObject])
{
[aCoder encodeObject:[[riskNeighbor country1] countryName]];
[aCoder encodeObject:[[riskNeighbor country2] countryName]];
}
count = [cards count];
[aCoder encodeValueOfObjCType:@encode (int) at:&count];
cardEnumerator = [cards objectEnumerator];
while (card = [cardEnumerator nextObject])
{
[aCoder encodeObject:[[card country] countryName]];
cardType = [card cardType];
[aCoder encodeValueOfObjCType:@encode (RiskCardType) at:&cardType];
[aCoder encodeObject:[card imageName]];
}
}
//----------------------------------------------------------------------
- initWithCoder:(NSCoder *)aDecoder
{
NSMutableDictionary *countryDictionary;
NSEnumerator *countryEnumerator;
Country *country1, *country2;
NSString *name1, *name2;
int l, count;
NSMutableArray *tmpCountryNeighbors;
NSMutableArray *tmpCards;
RiskCardType cardType;
NSString *imageName;
if ([super initWithCoder:aDecoder] == nil)
return nil;
continents = [[aDecoder decodeObject] retain];
allCountries = [[NSMutableSet set] retain];
[self _buildAllCountries];
// Set up country dictionary keyed on name
countryDictionary = [NSMutableDictionary dictionary];
countryEnumerator = [allCountries objectEnumerator];
while (country1 = [countryEnumerator nextObject])
{
[countryDictionary setObject:country1 forKey:[country1 countryName]];
}
tmpCountryNeighbors = [NSMutableArray array];
[aDecoder decodeValueOfObjCType:@encode (int) at:&count];
for (l = 0; l < count; l++)
{
name1 = [aDecoder decodeObject];
name2 = [aDecoder decodeObject];
country1 = [countryDictionary objectForKey:name1];
country2 = [countryDictionary objectForKey:name2];
[tmpCountryNeighbors addObject:[RiskNeighbor riskNeighborWithCountries:country1:country2]];
}
countryNeighbors = [tmpCountryNeighbors retain];
tmpCards = [NSMutableArray array];
[aDecoder decodeValueOfObjCType:@encode (int) at:&count];
for (l = 0; l < count; l++)
{
name1 = [aDecoder decodeObject];
country1 = [countryDictionary objectForKey:name1];
[aDecoder decodeValueOfObjCType:@encode (RiskCardType) at:&cardType];
imageName = [aDecoder decodeObject];
[tmpCards addObject:[RiskCard riskCardType:cardType withCountry:country1 imageNamed:imageName]];
}
cards = [[NSArray alloc] initWithArray:tmpCards];
[self _connectCountries];
return self;
}
//----------------------------------------------------------------------
- (void) _buildAllCountries
{
NSEnumerator *continentEnumerator;
Continent *continent;
[allCountries removeAllObjects];
continentEnumerator = [continents objectEnumerator];
while (continent = [continentEnumerator nextObject])
{
[allCountries unionSet:[continent countries]];
}
}
//----------------------------------------------------------------------
- (void) _connectCountries
{
NSEnumerator *neighborEnumerator;
RiskNeighbor *neighbor;
Country *country1, *country2;
if (countryNeighbors != nil)
{
neighborEnumerator = [countryNeighbors objectEnumerator];
while (neighbor = [neighborEnumerator nextObject])
{
country1 = [neighbor country1];
country2 = [neighbor country2];
[country1 setAdjacentToCountry:country2];
[country2 setAdjacentToCountry:country1];
}
}
}
//----------------------------------------------------------------------
// Remove adjacency dependencies.
- (void) _disconnectCountries
{
NSEnumerator *countryEnumerator;
Country *country;
if (allCountries != nil)
{
countryEnumerator = [allCountries objectEnumerator];
while (country = [countryEnumerator nextObject])
{
[country resetAdjacentCountries];
}
}
}
//----------------------------------------------------------------------
- (NSSet *) allCountries
{
return allCountries;
}
//----------------------------------------------------------------------
- (Continent *) continentNamed:(NSString *)continentName
{
return [continents objectForKey:continentName];
}
//----------------------------------------------------------------------
- (NSDictionary *) continents
{
return continents;
}
//----------------------------------------------------------------------
- (NSArray *) cards
{
return cards;
}
//----------------------------------------------------------------------
// Calculate the number of bonus armies earned for a player at the
// beginning of a turn based on the continents that they completely
// occupy.
//----------------------------------------------------------------------
- (int) continentBonusArmiesForPlayer:(Player)number
{
NSEnumerator *continentEnumerator;
Continent *continent;
int bonus = 0;
continentEnumerator = [continents objectEnumerator];
while (continent = [continentEnumerator nextObject])
{
bonus += [continent bonusArmiesForPlayer:number];
}
return bonus;
}
//----------------------------------------------------------------------
- (NSSet *) countriesForPlayer:(Player)number
{
return RWcountriesForPlayerNumber (allCountries, number);
}
@end
//======================================================================
// Some utility functions.
//======================================================================
NSSet *RWcountriesForPlayerNumber (NSSet *source, Player number)
{
NSMutableSet *newSet;
NSEnumerator *countryEnumerator;
Country *country;
newSet = [NSMutableSet set];
countryEnumerator = [source objectEnumerator];
while (country = [countryEnumerator nextObject])
{
if ([country playerNumber] == number)
[newSet addObject:country];
}
return newSet;
}
//----------------------------------------------------------------------
NSSet *RWcountriesInContinentNamed (NSSet *source, NSString *continentName)
{
NSMutableSet *newSet;
NSEnumerator *countryEnumerator;
Country *country;
newSet = [NSMutableSet set];
countryEnumerator = [source objectEnumerator];
while (country = [countryEnumerator nextObject])
{
if ([[country continentName] isEqualToString:continentName] == YES)
[newSet addObject:country];
}
return newSet;
}
//----------------------------------------------------------------------
NSSet *RWcountriesWithArmies (NSSet *source)
{
NSMutableSet *newSet;
NSEnumerator *countryEnumerator;
Country *country;
newSet = [NSMutableSet set];
countryEnumerator = [source objectEnumerator];
while (country = [countryEnumerator nextObject])
{
if ([country troopCount] > 0)
[newSet addObject:country];
}
return newSet;
}
//----------------------------------------------------------------------
NSSet *RWneighborsOfCountries (NSSet *source)
{
NSMutableSet *newSet;
NSEnumerator *countryEnumerator;
Country *country;
newSet = [NSMutableSet set];
countryEnumerator = [source objectEnumerator];
while (country = [countryEnumerator nextObject])
{
[newSet unionSet:[country neighborCountries]];
}
return newSet;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.