This is ArmyPlacementValidator.m in view mode; [Download] [Up]
// // This file is a part of Risk by Mike Ferris. // #import "Risk.h" RCSID ("$Id: ArmyPlacementValidator.m,v 1.2 1997/12/15 07:43:36 nygard Exp $"); #import "ArmyPlacementValidator.h" #import "RiskWorld.h" #import "Country.h" //====================================================================== // The ArmyPlacementValidator controls the placement of armies during // the game -- for initial army placement, normal army placement, after // a successful attack and during the fortification phase. //====================================================================== #define ArmyPlacementValidator_VERSION 1 @implementation ArmyPlacementValidator + (void) initialize { if (self == [ArmyPlacementValidator class]) { [self setVersion:ArmyPlacementValidator_VERSION]; } } //---------------------------------------------------------------------- - initWithRiskWorld:(RiskWorld *)aWorld { if ([super init] == nil) return nil; world = [aWorld retain]; sourceCountry = nil; destinationCountry = nil; armyPlacementType = PlaceInAnyCountry; playerNumber = 0; primaryCountries = nil; secondaryCountries = nil; return self; } //---------------------------------------------------------------------- - (void) dealloc { SNRelease (world); SNRelease (sourceCountry); SNRelease (destinationCountry); SNRelease (primaryCountries); SNRelease (secondaryCountries); [super dealloc]; } //---------------------------------------------------------------------- - (void) _reset { SNRelease (sourceCountry); SNRelease (destinationCountry); SNRelease (primaryCountries); SNRelease (secondaryCountries); } //---------------------------------------------------------------------- - (Country *) sourceCountry { return sourceCountry; } //---------------------------------------------------------------------- - (Country *) destinationCountry { return destinationCountry; } //---------------------------------------------------------------------- // All of these methods deal only with the given player's countries. // They include the source country. //---------------------------------------------------------------------- //---------------------------------------------------------------------- // Armies may be placed in any country of the given player. //---------------------------------------------------------------------- - (void) placeInAnyCountryForPlayerNumber:(Player)number { [self _reset]; playerNumber = number; armyPlacementType = PlaceInAnyCountry; primaryCountries = [[world countriesForPlayer:playerNumber] retain]; } //---------------------------------------------------------------------- // Armies may be placed in either of the two specified countries. //---------------------------------------------------------------------- - (void) placeInEitherCountry:(Country *)source orCountry:(Country *)other forPlayerNumber:(Player)number { [self _reset]; playerNumber = number; armyPlacementType = PlaceInTwoCountries; sourceCountry = [source retain]; destinationCountry = [other retain]; primaryCountries = [[NSSet setWithObjects:source, other, nil] retain]; } //---------------------------------------------------------------------- // Armies may be placed in either the source country, or exactly one // of it's neighbors controlled by the same player. //---------------------------------------------------------------------- - (void) placeInOneNeighborOfCountry:(Country *)source forPlayerNumber:(Player)number { [self _reset]; playerNumber = number; armyPlacementType = PlaceInOneNeighborCountry; sourceCountry = [source retain]; primaryCountries = [[NSMutableSet setWithObject:source] retain]; secondaryCountries = [[NSMutableSet setWithSet:[source ourNeighborCountries]] retain]; } //---------------------------------------------------------------------- // Armies may be placed in either the source country or any of it's // neighboring countries that are controlled by the same player. //---------------------------------------------------------------------- - (void) placeInAnyNeighborOfCountry:(Country *)source forPlayerNumber:(Player)number { [self _reset]; playerNumber = number; armyPlacementType = PlaceInAnyNeighborCountry; sourceCountry = [source retain]; primaryCountries = [[NSMutableSet setWithSet:[source ourNeighborCountries]] retain]; [primaryCountries addObject:source]; } //---------------------------------------------------------------------- // Armies may be place in either the source country or any country // that is connected to it by countries controlled by the same player. //---------------------------------------------------------------------- - (void) placeInConnectedCountries:(Country *)source forPlayerNumber:(Player)number { [self _reset]; playerNumber = number; armyPlacementType = PlaceInAnyConnectedCountry; sourceCountry = [source retain]; primaryCountries = [[source ourConnectedCountries] retain]; } //---------------------------------------------------------------------- - (BOOL) validatePlacement:(Country *)target { BOOL valid; valid = YES; NSAssert ([target playerNumber] != 0, @"Expected army to be in target country."); if ([target playerNumber] != playerNumber) { valid = NO; } else { valid = [primaryCountries member:target] != nil || [secondaryCountries member:target] != nil; } return valid; } //---------------------------------------------------------------------- - (BOOL) placeArmies:(int)count inCountry:(Country *)target { BOOL valid; valid = [self validatePlacement:target]; if (valid == YES) { // Place the armies NSAssert ([target playerNumber] != 0, @"Expected army to be in target country."); [target addTroops:count]; if (armyPlacementType == PlaceInOneNeighborCountry && [secondaryCountries member:target] != nil) { [primaryCountries addObject:target]; [secondaryCountries removeAllObjects]; } } return valid; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.