/////////////////////
// Sidney Chang    //
// 6.837 Project 1 //
// TA: Jacob F11   //
// 9/28/98         //
/////////////////////

import java.awt.*;
import java.awt.image.*;

public class Viking extends AnimatedSprite {

  public static final int WALKING_RIGHT = 0;
  public static final int WALKING_LEFT = 1;
  public static final int JUMPING_LEFT = 2;
  public static final int JUMPING_RIGHT = 3;
  public static final int BIG_WALK = 4;
  public static final int STANDING = 5;
  public static final int COLLISION = 6;

  // Variables
  public int state;
  public int lastState;
  boolean stopJumpFlag;

  // Constructors
  public Viking(Image images, int xPos, int yPos) {
   super(images,20,xPos,yPos);

    state = STANDING;
    lastState = STANDING;
    stopJumpFlag = false;

    // track for walking
    addFrame(0,1);
    addFrame(0,2);

    // track for big walking
    addFrame(1,0);
    addFrame(1,10);

    // track for jump left
    addFrame(2,3);
    addFrame(2,4);
    addFrame(2,5);
    addFrame(2,6);
    addFrame(2,7);
    addFrame(2,8);
    addFrame(2,9);

    // track for jump right
    addFrame(3,13);
    addFrame(3,14);
    addFrame(3,15);
    addFrame(3,16);
    addFrame(3,17);
    addFrame(3,18);
    addFrame(3,19);

    // track for standing
    addFrame(4,1);
  }

  // Methods
  public void Draw(Raster bgnd) {
    updateState();
    super.Draw(bgnd);
    if (stopJumpFlag) {
      setState(STANDING);
      stopJumpFlag = false;
    }
  }

  public void setState(int s) {
    lastState = state;
    state = s;
    setFrame(0);
  }

  public void updateState() {

    switch (state) {
      
    case (WALKING_RIGHT) : {
      currentTrack = 0;
      x = x + 5;
      return;
    }
    case (WALKING_LEFT) : {
      currentTrack = 0;
      x = x - 5;
      return;
    }
    case (JUMPING_LEFT) : {
      currentTrack = 2;
      x = x - 2;
      if (currentFrame == 6)
	stopJumpFlag = true;
      return;
    }
    case (JUMPING_RIGHT) : {
      currentTrack = 3;
      x = x + 2;
      if (currentFrame == 6)
	stopJumpFlag = true;
      return;
    }
    case (BIG_WALK) : {
      currentTrack = 1;
      return;
    }
    case (STANDING) : {
      currentTrack = 4;
      return;
    }
    case (COLLISION) : 
      if (lastState == WALKING_RIGHT) {
	x = x - 10;
	setState(JUMPING_LEFT);
      }
      else if (lastState == WALKING_LEFT) {
	x = x + 10;
	setState(JUMPING_RIGHT);
      }
      else if (lastState == STANDING)
	setState(WALKING_RIGHT);
      else if (lastState == JUMPING_LEFT)
	setState(JUMPING_RIGHT);
      else if (lastState == JUMPING_RIGHT)
	setState(JUMPING_LEFT);
    return;
    }
  }
}

