This is HState.m in view mode; [Download] [Up]
// // $Id: HState.m,v 1.2 1997/10/31 03:38:26 nygard Exp $ // // // This file is a part of Empire, a game of exploration and conquest. // Copyright (C) 1996 Steve Nygard // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // You may contact the author by: // e-mail: nygard@telusplanet.net // #import "Empire.h" RCSID ("$Id: HState.m,v 1.2 1997/10/31 03:38:26 nygard Exp $"); #import "HState.h" #import "DistributedGameManager.h" #import "HSMarquee.h" #import "Human.h" #import "Map.h" #import "MapView.h" #import "Unit.h" #import <AppKit/psopsNeXT.h> //====================================================================== // This is an abstract class that provides methods that any of its // subclasses will require. Subclasses just need to implement the // methods they require. It is used by the Human player as part // of the State pattern, which simplifies state changes and separates // the implementation of all the different states. // // The Human passes itself as the context of the state in all messages // is sends to state objects. // // This also implements a simple marquee that is used by more than one // state. // // I've made a diagram (StateChanges.diagram2) that shows the valid // state changes. // //====================================================================== @implementation HState - initWithGameManager:(GameManager *)theGameManager { [super init]; gameManager = theGameManager; marqueeTimer = nil; marqueeLocation.row = -1; marqueeLocation.column = -1; offset = 0; return self; } //---------------------------------------------------------------------- - (void) dealloc { if (marqueeTimer != nil) [marqueeTimer invalidate]; SNRelease (marqueeTimer); [super dealloc]; } //---------------------------------------------------------------------- - (void) continueWithContext:(Human *)context { [context performSelector:@selector (continue:) withObject:nil afterDelay:0.1]; } //====================================================================== // Subclass responsibilities //====================================================================== //---------------------------------------------------------------------- // This is the name describing the state and is shown on screen. //---------------------------------------------------------------------- - (NSString *) stateName { return @"HState"; } //---------------------------------------------------------------------- // This is used as the key to a dictionary of states. //---------------------------------------------------------------------- - (NSString *) stateKey { return nil; } //---------------------------------------------------------------------- - (void) stateEntered:(Human *)context { } //---------------------------------------------------------------------- - (void) stateExited:(Human *)context { } //---------------------------------------------------------------------- - (void) beginTurn:(Human *)context { // Beep as default behaviour? NSBeep (); } //---------------------------------------------------------------------- - (void) endTurn:(Human *)context { NSBeep (); } //---------------------------------------------------------------------- - (void) continue:(Human *)context { NSBeep (); } //---------------------------------------------------------------------- - (void) mouseDown:(Human *)context:(unsigned int)modifierFlags atLocation:(EMMapLocation)target { } //---------------------------------------------------------------------- - (void) mouseUp:(Human *)context:(unsigned int)modifierFlags atLocation:(EMMapLocation)target { } //---------------------------------------------------------------------- - (void) rightMouseDown:(Human *)context:(unsigned int)modifierFlags atLocation:(EMMapLocation)target { } //---------------------------------------------------------------------- - (void) rightMouseUp:(Human *)context:(unsigned int)modifierFlags atLocation:(EMMapLocation)target { } //---------------------------------------------------------------------- - (void) keyDown:(Human *)context:(NSEvent *)theEvent { NSString *eventCharacters = [theEvent characters]; unichar uc = [eventCharacters characterAtIndex:0]; if (uc == 3) { [context clickActiveButton]; } else { [[[context mapView] nextResponder] keyDown:theEvent]; } } //---------------------------------------------------------------------- // This report can be shown from the Survey state. //---------------------------------------------------------------------- - (void) combatReport:(Human *)context { } //---------------------------------------------------------------------- // The final maps can be viewed from the Game Over state. //---------------------------------------------------------------------- - (void) showFinalMap:(Human *)context forPlayer:(Player)number { } //====================================================================== // Commands //====================================================================== - (void) moveMode:(Human *)context { } //---------------------------------------------------------------------- - (void) surveyMode:(Human *)context { } //---------------------------------------------------------------------- - (void) groupMode:(Human *)context { } //---------------------------------------------------------------------- - (void) wait:(Human *)context unit:(Unit *)aUnit { } //---------------------------------------------------------------------- - (void) flightPathMode:(Human *)context { } //---------------------------------------------------------------------- - (void) activate:(Human *)context unit:(Unit *)aUnit { } //---------------------------------------------------------------------- - (void) centerScreen:(Human *)context mapView:(MapView *)mapView { } //---------------------------------------------------------------------- - (void) centerCursor:(Human *)context mapView:(MapView *)mapView { } //---------------------------------------------------------------------- - (void) centerSelected:(Human *)context mapView:(MapView *)mapView { } //---------------------------------------------------------------------- - (void) productionMap:(Human *)context { } //====================================================================== // Orders //====================================================================== - (void) goDirection:(Human *)context { NSBeep (); } //---------------------------------------------------------------------- - (void) goHome:(Human *)context unit:(Unit *)aUnit { } //---------------------------------------------------------------------- - (void) goRandom:(Human *)context unit:(Unit *)aUnit { } //---------------------------------------------------------------------- - (void) moveTo:(Human *)context { } //---------------------------------------------------------------------- - (void) patrolTo:(Human *)context { } //---------------------------------------------------------------------- - (void) escortShip:(Human *)context { } //---------------------------------------------------------------------- - (void) explore:(Human *)context unit:(Unit *)unit { } //---------------------------------------------------------------------- - (void) sentry:(Human *)context unit:(Unit *)aUnit { } //---------------------------------------------------------------------- - (void) clearOrders:(Human *)context unit:(Unit *)aUnit { } //---------------------------------------------------------------------- - (void) clearOrders:(Human *)context city:(City *)aCity { } //---------------------------------------------------------------------- - (void) loadShip:(Human *)context unit:(Unit *)aUnit { } //---------------------------------------------------------------------- - (void) unloadShip:(Human *)context unit:(Unit *)aUnit { } //---------------------------------------------------------------------- - (void) skipMove:(Human *)context unit:(Unit *)aUnit { } //====================================================================== // Interface Management //====================================================================== - (BOOL) validateMenuItem:(Human *)context:(NSMenuItem *)menuCell { SEL action = [menuCell action]; BOOL valid = NO; if (action == @selector(centerScreen:) || action == @selector(centerCursor:)) { valid = [[context mapView] cursorEnabled]; } return valid; } //---------------------------------------------------------------------- // The Show Production state needs to know if you update the production // of a city. //---------------------------------------------------------------------- - (void) cityProductionChanged:(Human *)context city:(City *)theCity { } //---------------------------------------------------------------------- // Select the thing at the given location, and optionally inspect it. // This has to be careful not to leak information from unexplored // territory (such as whether there is a city at the given location.) //---------------------------------------------------------------------- - (void) selectThing:(Human *)context atLocation:(EMMapLocation)target andInspect:(BOOL)inspectFlag { id anObject = nil; MapToken mapToken = [[context map] tokenAtLocation:target]; Terrain terrain; Player player; Icon icon; BOOL explored; [[context mapView] positionCursorAtLocation:target]; [context selectUnit:nil]; [context selectCity:nil]; EMMapTokenComponents (mapToken, &terrain, &player, &icon, &explored); if (terrain == t_city && explored == YES) { City *city = [context cityAtLocation:target]; anObject = city; [context selectCity:city]; } else if (player == [context playerNumber] && icon != i_none && explored == YES) { Unit *unit = [context unitWithType:EMConvertIconToUnitType (icon) atLocation:target]; anObject = unit; [context selectUnit:unit]; [context setStatusLine:[unit statusLine]]; } if (anObject == nil || [anObject isKindOfClass:[Unit class]] == NO) [context setStatusLine:[NSString stringWithFormat:@"Loc: %d,%d", target.row, target.column]]; if (inspectFlag == YES) { [context selectThing:anObject]; } } //====================================================================== // Marquee //====================================================================== //---------------------------------------------------------------------- // Update the marquee, executed by the timer. //---------------------------------------------------------------------- - (void) showMarquee:(NSTimer *)aTimer { Human *context = [aTimer userInfo]; MapView *mapView = [context mapView]; Unit *selectedUnit = [context selectedUnit]; NSPoint a; EMMapLocation unitLocation = [selectedUnit unitLocation]; a = [mapView getCenterPointForLocation:unitLocation]; [mapView scrollLocationToVisible:unitLocation]; [mapView lockFocus]; PSnewinstance (); PSsetinstance (YES); HSDrawMarquee (a.x - 8, a.y - 7, a.x + 7, a.y + 8, 5 - offset); PSsetinstance (NO); [mapView unlockFocus]; offset = (offset + 1) % 6; } //---------------------------------------------------------------------- // Set up a timer for a simple marquee around the given location. //---------------------------------------------------------------------- - (void) showMarquee:(Human *)context atLocation:(EMMapLocation)target { [self stopMarquee:context]; marqueeLocation = target; // set up a timer until first mouseDown: marqueeTimer = [[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector (showMarquee:) userInfo:context repeats:YES] retain]; } //---------------------------------------------------------------------- // Stop the timer and remove the marquee from the screen. //---------------------------------------------------------------------- - (void) stopMarquee:(Human *)context { if (marqueeTimer != nil) { MapView *mapView = [context mapView]; [marqueeTimer invalidate]; SNRelease (marqueeTimer); marqueeLocation.row = -1; marqueeLocation.column = -1; [mapView lockFocus]; PSnewinstance (); [mapView unlockFocus]; } } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.