Adds item storage and more NPC behavior
Makes NPC look for and pick up items of specified types. Adds a Backpack and IContainer interface. Lets items use separate sounds. Not completed.
This commit is contained in:
parent
d1b4f4a316
commit
7d0f0dc4f8
@ -2,6 +2,7 @@ package inf101.v18.rogue101.enemies;
|
|||||||
|
|
||||||
import inf101.v18.grid.GridDirection;
|
import inf101.v18.grid.GridDirection;
|
||||||
import inf101.v18.rogue101.game.IGame;
|
import inf101.v18.rogue101.game.IGame;
|
||||||
|
import inf101.v18.rogue101.items.*;
|
||||||
import inf101.v18.rogue101.objects.IItem;
|
import inf101.v18.rogue101.objects.IItem;
|
||||||
import inf101.v18.rogue101.objects.INonPlayer;
|
import inf101.v18.rogue101.objects.INonPlayer;
|
||||||
import inf101.v18.rogue101.shared.NPC;
|
import inf101.v18.rogue101.shared.NPC;
|
||||||
@ -9,6 +10,7 @@ import inf101.v18.rogue101.states.Age;
|
|||||||
import inf101.v18.rogue101.states.Occupation;
|
import inf101.v18.rogue101.states.Occupation;
|
||||||
import inf101.v18.rogue101.states.Personality;
|
import inf101.v18.rogue101.states.Personality;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
@ -23,11 +25,13 @@ public class Girl implements INonPlayer {
|
|||||||
private int attack;
|
private int attack;
|
||||||
private int defence;
|
private int defence;
|
||||||
private int visibility;
|
private int visibility;
|
||||||
private IItem equipped;
|
private Backpack<IItem> backpack = new Backpack<>();
|
||||||
private static final Random random = new Random();
|
private static final Random random = new Random();
|
||||||
|
private List<Class<?>> validItems;
|
||||||
|
|
||||||
public Girl() {
|
public Girl() {
|
||||||
setStats();
|
setStats();
|
||||||
|
setValidItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setStats() {
|
private void setStats() {
|
||||||
@ -63,7 +67,7 @@ public class Girl implements INonPlayer {
|
|||||||
visibility = 2;
|
visibility = 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (occupation == Occupation.MAGE) {
|
if (occupation == Occupation.KNIGHT) {
|
||||||
attack += 10; //Knights are quite powerful.
|
attack += 10; //Knights are quite powerful.
|
||||||
}
|
}
|
||||||
if (occupation == Occupation.MAGE) {
|
if (occupation == Occupation.MAGE) {
|
||||||
@ -75,6 +79,24 @@ public class Girl implements INonPlayer {
|
|||||||
defence += (int)(random.nextGaussian() * 5);
|
defence += (int)(random.nextGaussian() * 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specified which items the current Girl should be able to pick up.
|
||||||
|
*/
|
||||||
|
private void setValidItems() {
|
||||||
|
validItems = new ArrayList<>();
|
||||||
|
switch (occupation) {
|
||||||
|
case BOWSMAN:
|
||||||
|
validItems.add(IRangedWeapon.class);
|
||||||
|
break;
|
||||||
|
case MAGE:
|
||||||
|
validItems.add(IMagicWeapon.class);
|
||||||
|
break;
|
||||||
|
case KNIGHT:
|
||||||
|
validItems.add(IMeleeWeapon.class);
|
||||||
|
}
|
||||||
|
validItems.add(IBuffItem.class);
|
||||||
|
}
|
||||||
|
|
||||||
private String randomName() {
|
private String randomName() {
|
||||||
//TODO: Choose from a list of names, or generate name.
|
//TODO: Choose from a list of names, or generate name.
|
||||||
return "Girl";
|
return "Girl";
|
||||||
@ -82,45 +104,24 @@ public class Girl implements INonPlayer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void doTurn(IGame game) {
|
public void doTurn(IGame game) {
|
||||||
if (equipped == null) {
|
if (!backpack.isFull()) {
|
||||||
//TODO: Check if there is a item on the ground to pick up.
|
IItem item = NPC.pickUp(game, validItems);
|
||||||
|
if (item != null) {
|
||||||
|
backpack.add(item);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (NPC.trackItem(game, validItems)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean attack = false;
|
if (personality == Personality.AFRAID && NPC.flee(game)) {
|
||||||
switch (personality) {
|
|
||||||
case CALM:
|
|
||||||
if (hp < maxhp) {
|
|
||||||
attack = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AFRAID:
|
|
||||||
if (NPC.flee(game)) {
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
attack = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case AGRESSIVE:
|
|
||||||
attack = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (attack) {
|
|
||||||
switch (occupation) {
|
|
||||||
case KNIGHT:
|
|
||||||
if (NPC.tryAttack(game)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
case MAGE:
|
if (willAttack(game) && attack(game)) {
|
||||||
if (NPC.tryAttackRanged(game, 2)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case BOWSMAN:
|
|
||||||
if (NPC.tryAttackRanged(game, 4)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
List<GridDirection> possibleMoves = game.getPossibleMoves();
|
List<GridDirection> possibleMoves = game.getPossibleMoves();
|
||||||
if (!possibleMoves.isEmpty()) {
|
if (!possibleMoves.isEmpty()) {
|
||||||
@ -129,6 +130,62 @@ public class Girl implements INonPlayer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tries to attack with an attack specified by the Girl's occupation
|
||||||
|
*
|
||||||
|
* @param game An IGame object
|
||||||
|
* @return True if an attack occurred. False otherwise
|
||||||
|
*/
|
||||||
|
private boolean attack(IGame game) {
|
||||||
|
switch (occupation) {
|
||||||
|
case KNIGHT:
|
||||||
|
if (NPC.tryAttack(game)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MAGE:
|
||||||
|
if (NPC.tryAttackRanged(game, 2)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case BOWSMAN:
|
||||||
|
if (NPC.tryAttackRanged(game, 4)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the current girl will try to attack.
|
||||||
|
*
|
||||||
|
* @param game An IGame object
|
||||||
|
* @return True if the girl will attack. False otherwise
|
||||||
|
*/
|
||||||
|
private boolean willAttack(IGame game) {
|
||||||
|
boolean attack = false;
|
||||||
|
switch (personality) {
|
||||||
|
case CALM:
|
||||||
|
if (hp < maxhp) {
|
||||||
|
attack = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case AFRAID:
|
||||||
|
if (game.getPossibleMoves().isEmpty()) {
|
||||||
|
attack = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case AGRESSIVE:
|
||||||
|
attack = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return attack;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves a girl's occupation.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
public Occupation getOccupation() {
|
public Occupation getOccupation() {
|
||||||
return occupation;
|
return occupation;
|
||||||
}
|
}
|
||||||
@ -165,7 +222,7 @@ public class Girl implements INonPlayer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getSize() {
|
public int getSize() {
|
||||||
return 8;
|
return 30;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package inf101.v18.rogue101.examples;
|
package inf101.v18.rogue101.examples;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -13,6 +14,10 @@ import inf101.v18.rogue101.shared.NPC;
|
|||||||
public class Rabbit implements INonPlayer {
|
public class Rabbit implements INonPlayer {
|
||||||
private int food = 0;
|
private int food = 0;
|
||||||
private int hp = getMaxHealth();
|
private int hp = getMaxHealth();
|
||||||
|
private static List<Class<?>> validItems = new ArrayList<>();
|
||||||
|
static {
|
||||||
|
validItems.add(Carrot.class);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void doTurn(IGame game) {
|
public void doTurn(IGame game) {
|
||||||
@ -42,7 +47,7 @@ public class Rabbit implements INonPlayer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NPC.trackItem(game, Carrot.class)) {
|
if (NPC.trackItem(game, validItems)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ import inf101.v18.rogue101.enemies.Girl;
|
|||||||
import inf101.v18.rogue101.examples.Carrot;
|
import inf101.v18.rogue101.examples.Carrot;
|
||||||
import inf101.v18.rogue101.items.Manga;
|
import inf101.v18.rogue101.items.Manga;
|
||||||
import inf101.v18.rogue101.examples.Rabbit;
|
import inf101.v18.rogue101.examples.Rabbit;
|
||||||
|
import inf101.v18.rogue101.items.Sword;
|
||||||
import inf101.v18.rogue101.map.GameMap;
|
import inf101.v18.rogue101.map.GameMap;
|
||||||
import inf101.v18.rogue101.map.IGameMap;
|
import inf101.v18.rogue101.map.IGameMap;
|
||||||
import inf101.v18.rogue101.map.IMapView;
|
import inf101.v18.rogue101.map.IMapView;
|
||||||
@ -124,8 +125,10 @@ public class Game implements IGame {
|
|||||||
if (!map.has(loc, target)) {
|
if (!map.has(loc, target)) {
|
||||||
throw new IllegalMoveException("Target isn't there!");
|
throw new IllegalMoveException("Target isn't there!");
|
||||||
}
|
}
|
||||||
|
//TODO: Add attack and defence power when appropriate items are equipped.
|
||||||
int damage = currentActor.getAttack() + random.nextInt(20) + 1;
|
int damage = currentActor.getAttack() + random.nextInt(20) + 1;
|
||||||
if (damage >= target.getDefence() + 10) {
|
int defence = target.getDefence() + 10;
|
||||||
|
if (damage >= defence) {
|
||||||
int actualDamage = target.handleDamage(this, target, damage);
|
int actualDamage = target.handleDamage(this, target, damage);
|
||||||
formatMessage("%s hits %s for %d damage", currentActor.getName(), target.getName(), actualDamage);
|
formatMessage("%s hits %s for %d damage", currentActor.getName(), target.getName(), actualDamage);
|
||||||
} else {
|
} else {
|
||||||
@ -268,6 +271,7 @@ public class Game implements IGame {
|
|||||||
itemFactories.put("M", Manga::new);
|
itemFactories.put("M", Manga::new);
|
||||||
itemFactories.put("G", Girl::new);
|
itemFactories.put("G", Girl::new);
|
||||||
itemFactories.put(".", Dust::new);
|
itemFactories.put(".", Dust::new);
|
||||||
|
itemFactories.put("S", Sword::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
129
src/inf101/v18/rogue101/items/Backpack.java
Normal file
129
src/inf101/v18/rogue101/items/Backpack.java
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
package inf101.v18.rogue101.items;
|
||||||
|
|
||||||
|
import inf101.v18.rogue101.game.IGame;
|
||||||
|
import inf101.v18.rogue101.objects.IItem;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Backpack<T extends IItem> implements IContainer {
|
||||||
|
/**
|
||||||
|
* A list containing everything in the backpack.
|
||||||
|
*/
|
||||||
|
private List<T> content = new ArrayList<>();
|
||||||
|
/**
|
||||||
|
* The maximum amount of items allowed in a single backpack.
|
||||||
|
*/
|
||||||
|
private final int MAX_SIZE = 5;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getCurrentHealth() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDefence() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMaxHealth() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "Backpack";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSize() {
|
||||||
|
return 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSymbol() {
|
||||||
|
return "B";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int handleDamage(IGame game, IItem source, int amount) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the current size of the Backpack.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public int size() {
|
||||||
|
return content.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the Backpack is empty
|
||||||
|
*
|
||||||
|
* @return True if empty. False otherwise
|
||||||
|
*/
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return content.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tries to add an item to the Backpack
|
||||||
|
*
|
||||||
|
* @param item The item to add
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean add(T item) {
|
||||||
|
if (content.size() < MAX_SIZE) {
|
||||||
|
content.add(item);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes an element at index i
|
||||||
|
*
|
||||||
|
* @param i The index of an element
|
||||||
|
*/
|
||||||
|
public void remove(int i) {
|
||||||
|
content.remove(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a T at index i,
|
||||||
|
*
|
||||||
|
* @param i The index of an element
|
||||||
|
* @return An object of type T
|
||||||
|
*/
|
||||||
|
public T get(int i) {
|
||||||
|
return content.get(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the content List for direct manipulation.
|
||||||
|
*
|
||||||
|
* @return A list of T
|
||||||
|
*/
|
||||||
|
public List<T> getContent() {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isFull() {
|
||||||
|
if (content.size() >= MAX_SIZE) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//This shows as an error, but is necessary to compile.
|
||||||
|
@Override
|
||||||
|
public int compareTo(Object o) {
|
||||||
|
return compareTo((IItem)o);
|
||||||
|
}
|
||||||
|
}
|
@ -2,7 +2,7 @@ package inf101.v18.rogue101.items;
|
|||||||
|
|
||||||
import inf101.v18.rogue101.objects.IItem;
|
import inf101.v18.rogue101.objects.IItem;
|
||||||
|
|
||||||
interface IBuffItem extends IItem {
|
public interface IBuffItem extends IItem {
|
||||||
/**
|
/**
|
||||||
* Retrieve damage increase done by the buff item.
|
* Retrieve damage increase done by the buff item.
|
||||||
*
|
*
|
||||||
|
38
src/inf101/v18/rogue101/items/IContainer.java
Normal file
38
src/inf101/v18/rogue101/items/IContainer.java
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package inf101.v18.rogue101.items;
|
||||||
|
|
||||||
|
import inf101.v18.rogue101.objects.IItem;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A container for storing anything extending IItem.
|
||||||
|
*
|
||||||
|
* @param <T> The item type to store
|
||||||
|
*/
|
||||||
|
public interface IContainer<T extends IItem> extends IItem {
|
||||||
|
/**
|
||||||
|
* Retrieves an item from a container in index i
|
||||||
|
*
|
||||||
|
* @param i The index of an element
|
||||||
|
* @return An IItem
|
||||||
|
* @throws IndexOutOfBoundsException If the index is out of range.
|
||||||
|
*/
|
||||||
|
IItem get(int i);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a list with everything inside a container.
|
||||||
|
*
|
||||||
|
* @return A list of Objects extending IItem
|
||||||
|
*/
|
||||||
|
List<T> getContent();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if we can add anything at all to the container.
|
||||||
|
*
|
||||||
|
* @return True if it has no space left
|
||||||
|
*/
|
||||||
|
boolean isFull();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -1,12 +1,12 @@
|
|||||||
package inf101.v18.rogue101.items;
|
package inf101.v18.rogue101.items;
|
||||||
|
|
||||||
import inf101.v18.rogue101.objects.IItem;
|
|
||||||
|
|
||||||
interface IMagicWeapon extends IItem {
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the damage points of a weapon.
|
* An interface to extinguish different weapons for specific NPC.
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
int getWeaponDamage();
|
public interface IMagicWeapon extends IWeapon {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default String getSound() {
|
||||||
|
return "audio/Bow_Fire_Arrow-Stephan_Schutze-2133929391.wav";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
package inf101.v18.rogue101.items;
|
package inf101.v18.rogue101.items;
|
||||||
|
|
||||||
import inf101.v18.rogue101.objects.IItem;
|
|
||||||
|
|
||||||
interface IMeleeWeapon extends IItem {
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the damage points of a weapon.
|
* An interface to extinguish different weapons for specific NPC.
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
int getWeaponDamage();
|
public interface IMeleeWeapon extends IWeapon {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default String getSound() {
|
||||||
|
return "audio/Sword Swing-SoundBible.com-639083727.wav";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
package inf101.v18.rogue101.items;
|
package inf101.v18.rogue101.items;
|
||||||
|
|
||||||
import inf101.v18.rogue101.objects.IItem;
|
|
||||||
|
|
||||||
interface IRangedWeapon extends IItem {
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the damage points of a weapon.
|
* An interface to extinguish different weapons for specific NPC.
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
int getWeaponDamage();
|
public interface IRangedWeapon extends IWeapon {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
default String getSound() {
|
||||||
|
return "audio/Bow_Fire_Arrow-Stephan_Schutze-2133929391.wav";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
19
src/inf101/v18/rogue101/items/IWeapon.java
Normal file
19
src/inf101/v18/rogue101/items/IWeapon.java
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package inf101.v18.rogue101.items;
|
||||||
|
|
||||||
|
import inf101.v18.rogue101.objects.IItem;
|
||||||
|
|
||||||
|
public interface IWeapon extends IItem {
|
||||||
|
/**
|
||||||
|
* Retrieves the damage points of a weapon.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
int getWeaponDamage();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the string path of the sound to play upon an attack.
|
||||||
|
*
|
||||||
|
* @return A string path
|
||||||
|
*/
|
||||||
|
String getSound();
|
||||||
|
}
|
@ -7,7 +7,7 @@
|
|||||||
# #
|
# #
|
||||||
############### # #
|
############### # #
|
||||||
# # #
|
# # #
|
||||||
# # #
|
# S # #
|
||||||
# @ ####################### #
|
# @ ####################### #
|
||||||
# # #
|
# # #
|
||||||
# # #
|
# # #
|
||||||
|
@ -3,6 +3,7 @@ package inf101.v18.rogue101.objects;
|
|||||||
import inf101.v18.grid.GridDirection;
|
import inf101.v18.grid.GridDirection;
|
||||||
import inf101.v18.grid.ILocation;
|
import inf101.v18.grid.ILocation;
|
||||||
import inf101.v18.rogue101.game.IGame;
|
import inf101.v18.rogue101.game.IGame;
|
||||||
|
import inf101.v18.rogue101.items.Backpack;
|
||||||
import inf101.v18.rogue101.shared.NPC;
|
import inf101.v18.rogue101.shared.NPC;
|
||||||
import javafx.scene.input.KeyCode;
|
import javafx.scene.input.KeyCode;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -10,7 +11,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public class Player implements IPlayer {
|
public class Player implements IPlayer {
|
||||||
private int hp = getMaxHealth();
|
private int hp = getMaxHealth();
|
||||||
private final List<IItem> equipped = new ArrayList<>();
|
private final Backpack<IItem> equipped = new Backpack<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void keyPressed(IGame game, KeyCode key) {
|
public void keyPressed(IGame game, KeyCode key) {
|
||||||
@ -82,7 +83,7 @@ public class Player implements IPlayer {
|
|||||||
|
|
||||||
private void showStatus(IGame game) {
|
private void showStatus(IGame game) {
|
||||||
List<String> items = new ArrayList<>();
|
List<String> items = new ArrayList<>();
|
||||||
for (IItem item : equipped) {
|
for (IItem item : equipped.getContent()) {
|
||||||
String name = item.getName();
|
String name = item.getName();
|
||||||
items.add(Character.toUpperCase(name.charAt(0)) + name.substring(1));
|
items.add(Character.toUpperCase(name.charAt(0)) + name.substring(1));
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package inf101.v18.rogue101.shared;
|
|||||||
import inf101.v18.grid.GridDirection;
|
import inf101.v18.grid.GridDirection;
|
||||||
import inf101.v18.grid.ILocation;
|
import inf101.v18.grid.ILocation;
|
||||||
import inf101.v18.rogue101.enemies.Girl;
|
import inf101.v18.rogue101.enemies.Girl;
|
||||||
|
import inf101.v18.rogue101.examples.Carrot;
|
||||||
import inf101.v18.rogue101.game.IGame;
|
import inf101.v18.rogue101.game.IGame;
|
||||||
import inf101.v18.rogue101.objects.IActor;
|
import inf101.v18.rogue101.objects.IActor;
|
||||||
import inf101.v18.rogue101.objects.IItem;
|
import inf101.v18.rogue101.objects.IItem;
|
||||||
@ -13,6 +14,9 @@ import javafx.scene.media.MediaPlayer;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A holder class for methods used by IActors.
|
||||||
|
*/
|
||||||
public class NPC {
|
public class NPC {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -80,18 +84,20 @@ public class NPC {
|
|||||||
* Tries to find and reach an item of a specified class.
|
* Tries to find and reach an item of a specified class.
|
||||||
*
|
*
|
||||||
* @param game An IGame object
|
* @param game An IGame object
|
||||||
* @param element The class of the objects we are looking for
|
* @param validItems A list of classes the NPC should look for
|
||||||
* @return True if an appropriate item was found in the range of the current actor. False otherwise.
|
* @return True if an appropriate item was found in the range of the current actor. False otherwise.
|
||||||
*/
|
*/
|
||||||
public static boolean trackItem(IGame game, Class<?> element) {
|
public static boolean trackItem(IGame game, List<Class<?>> validItems) {
|
||||||
List<ILocation> neighbours = game.getVisible();
|
List<ILocation> neighbours = game.getVisible();
|
||||||
for (ILocation neighbour : neighbours) {
|
for (ILocation neighbour : neighbours) {
|
||||||
boolean hasItem = false;
|
boolean hasItem = false;
|
||||||
for (IItem item : game.getMap().getAll(neighbour)) {
|
for (IItem item : game.getMap().getAll(neighbour)) {
|
||||||
if (element.isInstance(item)) {
|
for (Class<?> validItem : validItems) {
|
||||||
|
if (validItem.isInstance(item)) {
|
||||||
hasItem = true;
|
hasItem = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (hasItem) {
|
if (hasItem) {
|
||||||
ILocation current = game.getLocation();
|
ILocation current = game.getLocation();
|
||||||
GridDirection dir = game.locationDirection(current, neighbour);
|
GridDirection dir = game.locationDirection(current, neighbour);
|
||||||
@ -104,6 +110,31 @@ public class NPC {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Picks up an item of one of the specified class types.
|
||||||
|
*
|
||||||
|
* @param game An IGame object
|
||||||
|
* @param validItems A list of classes the NPC should accept
|
||||||
|
* @return An item if it was successfully picked up. Null otherwise
|
||||||
|
*/
|
||||||
|
public static IItem pickUp(IGame game, List<Class<?>> validItems) {
|
||||||
|
for (IItem item : game.getLocalItems()) {
|
||||||
|
for (Class<?> validItem : validItems) {
|
||||||
|
if (validItem.isInstance(item)) {
|
||||||
|
return game.pickUp(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes an IActor go to the opposite direction of the closest enemy.
|
||||||
|
* Will return false if there are no visible enemies.
|
||||||
|
*
|
||||||
|
* @param game An IGame object
|
||||||
|
* @return True if the IActor fled. False otherwise
|
||||||
|
*/
|
||||||
public static boolean flee(IGame game) {
|
public static boolean flee(IGame game) {
|
||||||
List<ILocation> neighbours = game.getVisible();
|
List<ILocation> neighbours = game.getVisible();
|
||||||
for (ILocation neighbour : neighbours) {
|
for (ILocation neighbour : neighbours) {
|
||||||
@ -119,6 +150,12 @@ public class NPC {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverses the main four directions.
|
||||||
|
*
|
||||||
|
* @param dir A direction
|
||||||
|
* @return An opposite direction
|
||||||
|
*/
|
||||||
private static GridDirection reverseDir(GridDirection dir) {
|
private static GridDirection reverseDir(GridDirection dir) {
|
||||||
if (dir == GridDirection.SOUTH) {
|
if (dir == GridDirection.SOUTH) {
|
||||||
return GridDirection.NORTH;
|
return GridDirection.NORTH;
|
||||||
@ -131,6 +168,11 @@ public class NPC {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plays a sound.
|
||||||
|
*
|
||||||
|
* @param filename The String path of the audio file to play
|
||||||
|
*/
|
||||||
public static void playSound(String filename) {
|
public static void playSound(String filename) {
|
||||||
Media sound = new Media(new File(filename).toURI().toString());
|
Media sound = new Media(new File(filename).toURI().toString());
|
||||||
MediaPlayer mediaPlayer = new MediaPlayer(sound);
|
MediaPlayer mediaPlayer = new MediaPlayer(sound);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user