package com.planet_ink.coffee_mud.Items.Basic; import com.planet_ink.coffee_mud.core.interfaces.*; import com.planet_ink.coffee_mud.core.*; import com.planet_ink.coffee_mud.Abilities.interfaces.*; import com.planet_ink.coffee_mud.Areas.interfaces.*; import com.planet_ink.coffee_mud.Behaviors.interfaces.*; import com.planet_ink.coffee_mud.CharClasses.interfaces.*; import com.planet_ink.coffee_mud.Commands.interfaces.*; import com.planet_ink.coffee_mud.Common.interfaces.*; import com.planet_ink.coffee_mud.Exits.interfaces.*; import com.planet_ink.coffee_mud.Items.interfaces.*; import com.planet_ink.coffee_mud.Locales.interfaces.*; import com.planet_ink.coffee_mud.MOBS.interfaces.*; import com.planet_ink.coffee_mud.Races.interfaces.*; import java.util.*; public class StdLimb extends StdItem { public String ID(){ return "StdLimb";} protected int partnum=-1; protected long wearplace=-1; public StdLimb() { super(); setName("a false limb"); baseEnvStats.setWeight(1); setDisplayText("a false limb is here."); setDescription("Looks like a false limb."); properWornBitmap=Item.WORN_HELD|Item.WORN_FLOATING_NEARBY; wornLogicalAnd=false; baseGoldValue=10; material=RawMaterial.RESOURCE_MEAT; recoverEnvStats(); } public void setName(String name) { super.setName(name); wearplace=-1; partnum=-1; } public void setSecretIdentity(String id) { super.setSecretIdentity(id); wearplace=-1; partnum=-1; } protected int partNum() { if(partnum>=0) return partnum; for(int i=0;i<Race.BODYPARTSTR.length;i++) if((name().toUpperCase().endsWith(Race.BODYPARTSTR[i])) ||(rawSecretIdentity().toUpperCase().endsWith(Race.BODYPARTSTR[i]))) { partnum=i; break; } return partnum; } private long wearPlace() { if(wearplace>=0) return wearplace; int num=partNum(); if(num<0) wearplace=0; else wearplace=Race.BODY_WEARVECTOR[num]; return wearplace; } public void affectCharStats(MOB affected, CharStats affectableStats) { super.affectCharStats(affected,affectableStats); if((!amWearingAt(Item.IN_INVENTORY)) &&(!amWearingAt(Item.WORN_HELD)) &&(!amWearingAt(Item.WORN_FLOATING_NEARBY)) &&(!amWearingAt(Item.WORN_WIELD))) { if(affected.charStats().getBodyPart(partNum())<affected.charStats().getMyRace().bodyMask()[partNum()]) affectableStats.alterBodypart(partNum(),envStats().ability()); else setRawWornCode(0); } } public boolean canWear(MOB mob, long where) { if(where==Item.WORN_HELD) return super.canWear(mob,where); if(where==Item.WORN_FLOATING_NEARBY) return false; if(partNum()<0) return false; if((where!=0)&&(where!=wearPlace())) return false; int numRacialTotal=mob.charStats().getMyRace().bodyMask()[partNum()]; int numWorkingParts=mob.charStats().getBodyPart(partNum()); // now add in other NON-FUNCTIONAL limb things worn // FUNCTIONAL limbs are already included in numWorkingParts for(int i=0;i<mob.inventorySize();i++) { Item I=mob.fetchInventory(i); if((I instanceof StdLimb) &&(((StdLimb)I).partNum()==partNum()) &&(I.amWearingAt(wearPlace())) &&(I.container()==null)) numWorkingParts++; } if(numWorkingParts>=numRacialTotal) return false; return true; } public boolean fitsOn(long wornCode) { if(wornCode==Item.WORN_HELD) return super.fitsOn(wornCode); if(wornCode==Item.WORN_FLOATING_NEARBY) return false; if(wornCode<=0) return true; return wearPlace()==wornCode; } protected boolean canWearComplete(MOB mob) { if(partNum()<0) { mob.tell("This limb looks malformed."); return false; } if(!canWear(mob,0)) { mob.tell("You don't have any empty sockets to wear "+name()+" on."); return false; } return true; } }