public void update() //gathers input, updates positions, and handles combat { //update inputs oldMouse = mouseState; mouseState = Mouse.GetState(); oldKeyboardState = keyboardState; keyboardState = Keyboard.GetState(); Rectangle endTurn = new Rectangle(918, 818, 268, 69); Rectangle toggleGrid = new Rectangle(1076, 70, 115, 20); Rectangle mouse = new Rectangle(mouseState.X, mouseState.Y, 1, 1); //TODO find unspent unit //click toggle grid button if (mouse.Intersects(toggleGrid) && mouseState.LeftButton == ButtonState.Pressed && oldMouse.LeftButton != ButtonState.Pressed) gridOn = !gridOn; if (controlState == ControlState.selectUnit) { //change scroll-over display based on mouse coordinates scrolledOver = mouseOverTile(); //if click and scrolled over friendly unit set unit to selected and change state to choose option if (mouseState.LeftButton == ButtonState.Pressed) { if (mouse.Intersects(endTurn) && oldMouse.LeftButton != ButtonState.Pressed) { //if end turn is clicked then refresh armies and switch players controlState = ControlState.endTurn; } else { if (mouseState.X < 900 && mouseState.Y < 900 && scrolledOver != null && !scrolledOver.isEmpty()) { if((scrolledOver.getResident().getFaction().Equals("RED") && isPlayer1Turn) || (scrolledOver.getResident().getFaction().Equals("BLUE") && !isPlayer1Turn)) { if (!scrolledOver.getResident().hasPieceAttacked()) { selectedTile = scrolledOver; selectedUnit = scrolledOver.getResident(); selectionTiles = map.getValidMoves(); controlState = ControlState.chooseOption; //hide mouse mouseVisible = false; } else status = "Unit is spent for this turn"; } } } } if (keyboardState.IsKeyDown(Keys.K)) //test win screen { status = "Nobody wins! YAY!"; controlState = ControlState.endGame; } } else if (controlState == ControlState.chooseOption) { //if keyboardState has a button pressed coressponding to the options then change state and show mouse TODO if (keyboardState.IsKeyDown(Keys.W) && !selectedUnit.hasPieceMoved()) //move { mouseVisible = true; selectionTiles = map.findValidMoves(selectedUnit); controlState = ControlState.move; } else if (keyboardState.IsKeyDown(Keys.A) && !selectedUnit.hasPieceAttacked()) //attack { mouseVisible = true; currentAbility = new Attack(selectedUnit); selectionTiles = map.checkRange(selectedTile, currentAbility, currentAbility.getRange(), selectedUnit); //if no targets in range status "says so" and don't change state controlState = ControlState.selectTarget; } else if (keyboardState.IsKeyDown(Keys.T)) //end turn { //selectedUnit.move(); selectedUnit.attack(); //TODO mouseVisible = true; controlState = ControlState.selectUnit; } else if (keyboardState.IsKeyDown(Keys.Space) && !oldKeyboardState.IsKeyDown(Keys.Space)) { mouseVisible = true; controlState = ControlState.selectUnit; } //space = cancel, go back to selectUnit } else if (controlState == ControlState.move) { //change scroll-over display based on mouse coordinates scrolledOver = mouseOverTile(); //if click and mouse XY corresponds to valid tile then move unit and return to chooseoption TODO if (selectionTiles.Contains(mouseOverTile()) && mouseState.LeftButton == ButtonState.Pressed) { map.movePiece(selectedTile, scrolledOver, selectedUnit); selectedTile = scrolledOver; selectedUnit.move(); status = selectedUnit.getName() + " has moved."; mouseVisible = false; controlState = ControlState.chooseOption; } else if (keyboardState.IsKeyDown(Keys.Space) && !oldKeyboardState.IsKeyDown(Keys.Space)) { mouseVisible = false; controlState = ControlState.chooseOption; } //space = cancel, go back to chooseOption } else if (controlState == ControlState.selectTarget) { //change scroll-over display based on mouse coordinates scrolledOver = mouseOverTile(); //if click and tile is in target list than initiate combat between selected unit and target, show mouse, return to select unit TODO if (mouseState.LeftButton == ButtonState.Pressed) { //if scrolled over tile is within targetTiles then initiate combat if(selectionTiles.Contains(scrolledOver)) { //change status to combat result string status = currentAbility.execute(selectedUnit, scrolledOver.getResident()); selectedUnit.attack(); //remove dead units if (selectedUnit.getHealth() < 1) selectedTile.removePiece(); if (scrolledOver.getResident().getHealth() < 1) scrolledOver.removePiece(); controlState = ControlState.selectUnit; //status = "attack"; } } else if (keyboardState.IsKeyDown(Keys.Space) && !oldKeyboardState.IsKeyDown(Keys.Space)) { currentAbility = null; mouseVisible = false; controlState = ControlState.chooseOption; } //space = cancel, go back to chooseOption } else if (controlState == ControlState.endTurn) { if (keyboardState.IsKeyDown(Keys.Y)) { refreshArmy(); isPlayer1Turn = !isPlayer1Turn; //refreshArmy(); status = "Turn ended, next player's turn begins"; controlState = ControlState.selectUnit; } else if (keyboardState.IsKeyDown(Keys.Space)) { controlState = ControlState.selectUnit; } } else if(controlState == ControlState.endGame) { //continue if (keyboardState.IsKeyDown(Keys.Space)) { endBattle(); } } if (isArmyDead(player1Army)) { status = "Blue Player 2 Wins!"; } else if (isArmyDead(player2Army)) { status = "Red Player 1 Wins!"; } }
public String movePiece(Tile origin, Tile destination, Piece piece) { if (piece.validMoves.Contains(destination)) { origin.removePiece(); origin.enterPiece(piece); // promptAbility(); piece.move(); piece.validMoves = null; return piece.getName() + " has moved"; } else return "invalid location"; }