package ring.mobiles;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;
import ring.mobiles.backbone.Bank;
import ring.mobiles.backbone.Equipment;
import ring.mobiles.backbone.Inventory;
import ring.mobiles.senses.SensesGroup;
import ring.movement.Room;
import ring.persistence.RingConstants;
/**
* This class represents data of a mobile that changes rather frequently,
* but is categorized as combat data. Things such as money amount, inventory,
* weight carried, etc go here.
* @author projectmoon
*/
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlRootElement
@XmlType(
namespace = RingConstants.RING_NAMESPACE,
propOrder= {
"money", "bankAccount", "inventory", "equipment", "weightCarried", "currentMV",
"maxMV", "movementMultiplier", "speed"
})
public class MobileDynamicModel {
//Where the mobile is.
private Room currLocation;
//Money on the mobile, and money in its bank account.
private Bank money = new Bank();
private Bank bankAccount = new Bank();
//Inventory and equipment.
private Inventory inventory = new Inventory();
private Equipment equipment = new Equipment();
private double weightCarried;
//Senses for this mobile: How the mobile interacts with and perceives the world
private SensesGroup sensesGroup;
public void setSensesGroup(SensesGroup group) { sensesGroup = group; }
@XmlTransient public SensesGroup getSensesGroup() { return sensesGroup; }
public void setCurrLocation(Room room) {
currLocation = room;
}
@XmlTransient
public Room getCurrLocation() {
return currLocation;
}
public void setMoney(Bank money) {
this.money = money;
}
@XmlElement
public Bank getMoney() {
return money;
}
public void setBankAccount(Bank bankAccount) {
this.bankAccount = bankAccount;
}
@XmlElement
public Bank getBankAccount() {
return bankAccount;
}
public void setInventory(Inventory inventory) {
this.inventory = inventory;
}
@XmlElement
public Inventory getInventory() {
return inventory;
}
public void setEquipment(Equipment equipment) {
this.equipment = equipment;
}
@XmlElement
public Equipment getEquipment() {
return equipment;
}
public void setWeightCarried(double weightCarried) {
this.weightCarried = weightCarried;
}
@XmlElement
public double getWeightCarried() {
return weightCarried;
}
//Movement-related variables.
//The current movement points (MV) of the mobile.
private int currentMV;
@XmlElement public int getCurrentMV() { return currentMV; }
public void setCurrentMV(int mv) { currentMV = mv; }
public void changeCurrentMV(int amount) { currentMV += amount; }
//The maximum movement points (MV) of the mobile.
//This number is calculated as follows:
//BASE_MAXMV + (10 * con mod). BASE_MAXMV is currently 100.
private int maxMV;
@XmlElement public int getMaxMV() { return maxMV; }
public void setMaxMV(int mv) {
maxMV = mv;
if (maxMV < currentMV) {
currentMV = maxMV;
}
}
//subtract an extra amount of MV per room move equal to this * default move
//amount.
private int movementMultiplier;
@XmlElement public int getMovementMultiplier() { return movementMultiplier; }
public void setMovementMultiplier(int mov) { movementMultiplier = mov; }
public void increaseMovementMultiplier(int mov) { movementMultiplier += mov; }
public void resetMovementMultiplier() { movementMultiplier = 0; }
//The speed of the mobile in feet.
private int speed;
@XmlElement public int getSpeed() { return speed; }
public void setSpeed(int speed) { this.speed = speed; }
public void changeSpeed(int change) { speed += change; }
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((bankAccount == null) ? 0 : bankAccount.hashCode());
result = prime * result + currentMV;
result = prime * result
+ ((equipment == null) ? 0 : equipment.hashCode());
result = prime * result
+ ((inventory == null) ? 0 : inventory.hashCode());
result = prime * result + maxMV;
result = prime * result + ((money == null) ? 0 : money.hashCode());
result = prime * result + movementMultiplier;
result = prime * result
+ ((sensesGroup == null) ? 0 : sensesGroup.hashCode());
result = prime * result + speed;
long temp;
temp = Double.doubleToLongBits(weightCarried);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MobileDynamicModel other = (MobileDynamicModel) obj;
if (bankAccount == null) {
if (other.bankAccount != null)
return false;
} else if (!bankAccount.equals(other.bankAccount))
return false;
if (currentMV != other.currentMV)
return false;
if (equipment == null) {
if (other.equipment != null)
return false;
} else if (!equipment.equals(other.equipment))
return false;
if (inventory == null) {
if (other.inventory != null)
return false;
} else if (!inventory.equals(other.inventory))
return false;
if (maxMV != other.maxMV)
return false;
if (money == null) {
if (other.money != null)
return false;
} else if (!money.equals(other.money))
return false;
if (movementMultiplier != other.movementMultiplier)
return false;
if (sensesGroup == null) {
if (other.sensesGroup != null)
return false;
} else if (!sensesGroup.equals(other.sensesGroup))
return false;
if (speed != other.speed)
return false;
if (Double.doubleToLongBits(weightCarried) != Double
.doubleToLongBits(other.weightCarried))
return false;
return true;
}
}