package std.game.objects.bodyparts; import std.game.objects.trappings.AbstractWeapon; import std.game.objects.trappings.Holdable; import std.game.objects.trappings.Wearable; import org.groovymud.object.MudObject; import std.game.races.Statistics import std.game.objects.containers.ContainerImpl import org.groovymud.object.registry.InventoryHandler; /** * Copyright 2008 Matthew Corby-Eaglen * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ class BodyPart extends ContainerImpl { boolean canHold = false boolean holding = false Set defences; // defences are cumulative Set attacks; // attacks that you are not using but // still exist if unwielding items InventoryHandler linkedParts // for a pair of arms, legs, etc - // could be more than one linked!! InventoryHandler heldItem String partShortName public boolean checkCanAddItem(MudObject object) { if (object instanceof Wearable) { Wearable wearable = (Wearable) object; if (wearable.getNumberOfBodyPartsRequired() > 1 && linkedParts.size() < wearable.getNumberOfBodyPartsRequired() - 1) { return false; } // if the body part's names matched the items bodypartfor class // object then say yes if (wearable.getBodyPartNameFor().equals(getName())) { int containsAmount = getInventoryHandler().getMudObject(wearable.getBodyPartNameFor()).size(); if (containsAmount < wearable.getMaxWearable()) { return superCheckCanAddItem(object); } } } return false; } public void addItem(MudObject object) { Wearable item = (Wearable) object; if (item.getNumberOfBodyPartsRequired() > 1) { HashSet<MudObject> linkedParts = getLinkedParts().getMudObjects(); int amount = item.getNumberOfBodyPartsRequired(); Iterator i = linkedParts.iterator(); while (i.hasNext() && amount > 0) { BodyPart obj = (BodyPart) i.next(); obj.addItem(object); amount--; } } super.addItem(object); } public MudObject removeItem(MudObject object) { HashSet<MudObject> linkedParts = getLinkedParts().getMudObjects(); Iterator i = linkedParts.iterator(); while (i.hasNext()) { BodyPart obj = (BodyPart) i.next(); obj.removeItem(object); } return super.removeItem(object); } public boolean holdItem(Holdable item) { if (holding || !canHold) { return false; } heldItem.addMudObject((MudObject)item); holding = true; return holding; // make sure we return the old item, can only hold one // thing at a time in this part } public MudObject lowerItem(Holdable item) { item = (Holdable) heldItem.removeMudObject(item); holding = false; return item; } boolean superCheckCanAddItem(MudObject object) { return super.checkCanAddItem(object); } boolean canHold() { return canHold; } void setCanHold(boolean holdable) { this.canHold = holdable; } Set getDefences() { Set defences = this.defences; if (holding) { Holdable item = getHeldItem(); defences.addAll(item.getDefences()); } Set wearing = getInventoryHandler().getItemsOfClass(Wearable.class); for (MudObject obj : wearing) { Wearable wearable = (Wearable) obj; defences.addAll(wearable.getDefences()); } return defences; } Set getAttacks() { if (holding) { Holdable item = getHeldItem(); if (item instanceof AbstractWeapon) { AbstractWeapon weapon = (AbstractWeapon) item; return weapon.getAttacks(); } // holding none weapons renders the limb useless return new HashSet(); } return attacks; } Holdable getHeldItem() { return ((Holdable) heldItem.getMudObjects().toArray()[0]); } /** * defers modding of character stats to worn/held items * * @param moddedStats */ public void modifyStatistics(Statistics moddedStats) { if (holding) { Holdable item = getHeldItem(); item.modifyStatistics(moddedStats); } for (MudObject obj : getInventoryHandler().getMudObjects()) { obj.modifyStatistics(moddedStats); } } public InventoryHandler getLinkedParts() { if (linkedParts == null) { linkedParts = new InventoryHandler(); } return linkedParts; } public void setLinkedParts(Set<BodyPart> linkedParts) { for (BodyPart part : linkedParts) { getLinkedParts().addMudObject(part); } } }