|
@@ -0,0 +1,77 @@
|
|
|
|
|
+package org.leumasjaffe.charsheet.model.equip;
|
|
|
|
|
+
|
|
|
|
|
+import java.util.Collections;
|
|
|
|
|
+import java.util.EnumMap;
|
|
|
|
|
+import java.util.Map;
|
|
|
|
|
+
|
|
|
|
|
+import com.fasterxml.jackson.annotation.JsonValue;
|
|
|
|
|
+
|
|
|
|
|
+import lombok.AccessLevel;
|
|
|
|
|
+import lombok.Data;
|
|
|
|
|
+import lombok.experimental.FieldDefaults;
|
|
|
|
|
+
|
|
|
|
|
+@Data
|
|
|
|
|
+@FieldDefaults(level=AccessLevel.PRIVATE)
|
|
|
|
|
+public class DDEquipment {
|
|
|
|
|
+ Map<EquipmentSlot, DDItem> equipment = new EnumMap<>(EquipmentSlot.class);
|
|
|
|
|
+
|
|
|
|
|
+ @JsonValue
|
|
|
|
|
+ Map<EquipmentSlot, String> getSerializable() {
|
|
|
|
|
+ Map<EquipmentSlot, String> m = new EnumMap<>(EquipmentSlot.class);
|
|
|
|
|
+ equipment.entrySet().stream().forEach( e -> m.put(e.getKey(), e.getValue().getName()));
|
|
|
|
|
+ return m;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public Map<EquipmentSlot, DDItem> getEquipment() {
|
|
|
|
|
+ return Collections.unmodifiableMap(equipment);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public boolean canEquip( final DDItem item ) {
|
|
|
|
|
+ return canEquip( item.getSlot() );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private boolean canEquip( final EquipmentSlot slot ) {
|
|
|
|
|
+ switch ( slot ) {
|
|
|
|
|
+ case NONE: return false;
|
|
|
|
|
+ case TWO_HANDS: return canEquip( EquipmentSlot.MAIN_HAND ) &&
|
|
|
|
|
+ canEquip( EquipmentSlot.OFF_HAND );
|
|
|
|
|
+ case ONE_HAND: return canEquip( EquipmentSlot.MAIN_HAND ) ||
|
|
|
|
|
+ canEquip( EquipmentSlot.OFF_HAND );
|
|
|
|
|
+ case RING: return canEquip( EquipmentSlot.RING1 ) ||
|
|
|
|
|
+ canEquip( EquipmentSlot.RING2 );
|
|
|
|
|
+ default:
|
|
|
|
|
+ return equipment.containsKey(slot);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public void equip( final EquipmentSlot slot, final DDItem item ) {
|
|
|
|
|
+ switch ( slot ) {
|
|
|
|
|
+ case NONE:
|
|
|
|
|
+ case ONE_HAND:
|
|
|
|
|
+ case RING:
|
|
|
|
|
+ throw new IllegalArgumentException("Cannot equip directly to slot:" + slot);
|
|
|
|
|
+ case TWO_HANDS:
|
|
|
|
|
+ equip( EquipmentSlot.MAIN_HAND, item );
|
|
|
|
|
+ equip( EquipmentSlot.OFF_HAND, item );
|
|
|
|
|
+ break;
|
|
|
|
|
+ default:
|
|
|
|
|
+ equipment.put(slot, item);
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public void unequip( final EquipmentSlot slot ) {
|
|
|
|
|
+ switch ( slot ) {
|
|
|
|
|
+ case NONE:
|
|
|
|
|
+ case ONE_HAND:
|
|
|
|
|
+ case RING:
|
|
|
|
|
+ throw new IllegalArgumentException("Cannot unequip directly to slot:" + slot);
|
|
|
|
|
+ case TWO_HANDS:
|
|
|
|
|
+ unequip( EquipmentSlot.MAIN_HAND );
|
|
|
|
|
+ unequip( EquipmentSlot.OFF_HAND );
|
|
|
|
|
+ break;
|
|
|
|
|
+ default:
|
|
|
|
|
+ equipment.remove(slot);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|