//
// $Id: HDirectionState.m,v 1.2 1997/10/31 03:38:02 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: HDirectionState.m,v 1.2 1997/10/31 03:38:02 nygard Exp $");

#import "HDirectionState.h"

#import "Human.h"
#import "MapView.h"
#import "Unit.h"

#import "../Orders.subproj/Orders.h"

//======================================================================
// Allow the user to select a direction for continuously moving the
// currently selected unit.  The user may use the keyboard, or click
// in the adjacent squares to select a direction.
//======================================================================

@implementation HDirectionState

//======================================================================
// Subclass responsibilities
//======================================================================

- (NSString *) stateName
{
    return @"Direction";
}
  
//----------------------------------------------------------------------

- (NSString *) stateKey
{
    return HS_DIRECTION;
}
  
//----------------------------------------------------------------------

- (void) stateEntered:(Human *)context
{
    MapView *mapView = [context mapView];
  
    // Set cursor
    [mapView useDirectionCursor];
    [mapView setCursorEnabled:YES];

    // Disable both buttons
    [context enableContinueButton:NO];
    [context enableEndTurnButton:NO];
}
  
//----------------------------------------------------------------------

- (void) mouseDown:(Human *)context:(unsigned int)modifierFlags atLocation:(EMMapLocation)target
{
    int delta_row, delta_col;
    Unit *unit = [context selectedUnit];
    Direction delta_to_dir[9] = {d_northwest, d_north, d_northeast, d_west, d_none, d_east, d_southwest, d_south, d_southeast};
    Direction dir;
    EMMapLocation unitLocation = [unit unitLocation];

    delta_row = target.row - unitLocation.row;
    delta_col = target.column - unitLocation.column;
  
    if (delta_row >= -1 && delta_row <= 1 && delta_col >= -1 && delta_col <= 1)
    {
        dir = delta_to_dir[3 * (delta_row + 1) + delta_col + 1];

        if (dir != d_none)
        {
            Order *order = [[[ODirection alloc] initForUnit:unit direction:dir] autorelease];
            [unit setOrder:order];
            [context setStatusLine:[unit statusLine]];
        }

        [context restoreState];
    }
}
  
//----------------------------------------------------------------------

- (void) keyDown:(Human *)context:(NSEvent *)theEvent
{
    NSString *eventCharacters = [theEvent characters];
    unichar uc = [eventCharacters characterAtIndex:0];
    Direction dir = d_none;

    switch (uc)
    {
      case '1':
          dir = d_southwest;
          break;
      
      case NSDownArrowFunctionKey:
      case '2':
          dir = d_south;
          break;
      
      case '3':
          dir = d_southeast;
          break;
      
      case NSLeftArrowFunctionKey:
      case '4':
          dir = d_west;
          break;
      
      case NSRightArrowFunctionKey:
      case '6':
          dir = d_east;
          break;
      
      case '7':
          dir = d_northwest;
          break;
      
      case NSUpArrowFunctionKey:
      case '8':
          dir = d_north;
          break;
      
      case '9':
          dir = d_northeast;
          break;
      
      default:
          [super keyDown:context:theEvent];
          break;
    }

    if (dir != d_none)
    {
        Unit *unit = [context selectedUnit];
        Order *order = [[[ODirection alloc] initForUnit:unit direction:dir] autorelease];
        [unit setOrder:order];
        [context setStatusLine:[unit statusLine]];
    }

    [context restoreState];
}

@end
