package com.planet_ink.coffee_mud.Abilities.Properties;
import com.planet_ink.coffee_mud.Libraries.interfaces.*;
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.*;
/**
* <p>
* Title: False Realities Flavored CoffeeMUD
* </p>
* <p>
* Description: The False Realities Version of CoffeeMUD
* </p>
* <p>
* Copyright: Copyright (c) 2003 Jeremy Vyska
* </p>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* <p>
* you may not use this file except in compliance with the License.
* <p>
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* <p>
* distributed under the License is distributed on an "AS IS" BASIS,
* <p>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* <p>
* See the License for the specific language governing permissions and
* <p>
* limitations under the License.
* <p>
* Company: http://www.falserealities.com
* </p>
*
* @author FR - Jeremy Vyska; CM - Bo Zimmerman
* @version 1.0.0.0
*/
public class Prop_ClanEquipment extends Property
{
public String ID()
{
return "Prop_ClanEquipment";
}
public String name()
{
return "Clan Equipment";
}
public boolean bubbleAffect()
{
return true;
}
protected int canAffectCode()
{
return Ability.CAN_ITEMS;
}
protected boolean activated=false;
protected String type="";
protected int TypeOfEffect=0;
protected int WeaponType=0;
protected int PowerLevel=0;
protected long LastChecked=0;
protected boolean notAgain=false;
protected String clanName="";
protected String clanType="";
String lastMessage=null;
protected CharStats EQadjCharStats=null;
public static final String[] words={"ZAP","ZAP","ZAP","ZOT","ZIT","ZEK","ZOM","ZUP","ZET","ZYT","ZVP","ZOP","ZYV","ZAL"};
protected String secretWord=words[CMLib.dice().roll(1,words.length,0)-1];
public String accountForYourself()
{
// My slightly complicated way of showing the clan effect when ID'd
StringBuffer id=new StringBuffer(clanType+" "+clanName+" Bonus: ");
if((affected instanceof Weapon)&&(!(affected instanceof Wand))&&(TypeOfEffect<1000))
{
id.append("Does "+(1*PowerLevel)+"-"+(6*PowerLevel)+" additional "+type.toLowerCase()+" damage.");
}else
if((affected instanceof Armor)&&(TypeOfEffect<1000)&&(!(affected instanceof Shield)))
{
id.append("Raises "+type.toLowerCase()+" resistance by "+(PowerLevel*5)+".");
}
if((affected instanceof Armor)&&(TypeOfEffect<1000)&&(affected instanceof Shield))
{
id.append("Causes "+(1*PowerLevel)+"-"+(3*PowerLevel)+" "+type.toLowerCase()+" damage to melee attackers.");
}
if((affected instanceof Wand)&&(TypeOfEffect<1000))
{
id.append("Does "+(1*PowerLevel)+"-"+(6*PowerLevel)+" "+type.toLowerCase()+" damage when the user says `"+secretWord+"` to the target.");
}
return id.toString();
}
public void setMiscText(String text)
{
super.setMiscText(text);
Vector V=CMParms.parse(text);
if(V.size()<4)
{
return;
}
type=(String)V.elementAt(0);
PowerLevel=new Integer((String)V.elementAt(1)).intValue();
clanName=(String)V.elementAt(2);
clanType=(String)V.elementAt(3);
secretWord=getWandWord(text); // try to randomize the spell word a
// little
// Armor
this.EQadjCharStats=(CharStats)CMClass.getCommon("DefaultCharStats");
initAdjustments(EQadjCharStats);
if(type.equalsIgnoreCase("PARALYSIS"))
{
TypeOfEffect=CMMsg.TYP_PARALYZE;
WeaponType=Weapon.TYPE_STRIKING;
this.EQadjCharStats.setStat(CharStats.STAT_SAVE_PARALYSIS,PowerLevel*5);
}else
if(type.equalsIgnoreCase("FIRE"))
{
TypeOfEffect=CMMsg.TYP_FIRE;
WeaponType=Weapon.TYPE_BURNING;
this.EQadjCharStats.setStat(CharStats.STAT_SAVE_FIRE,PowerLevel*5);
}else
if(type.equalsIgnoreCase("COLD"))
{
TypeOfEffect=CMMsg.TYP_COLD;
WeaponType=Weapon.TYPE_FROSTING;
this.EQadjCharStats.setStat(CharStats.STAT_SAVE_COLD,PowerLevel*5);
}else
if(type.equalsIgnoreCase("WATER"))
{
TypeOfEffect=CMMsg.TYP_WATER;
WeaponType=Weapon.TYPE_SLASHING;
this.EQadjCharStats.setStat(CharStats.STAT_SAVE_WATER,PowerLevel*5);
}else
if(type.equalsIgnoreCase("GAS"))
{
TypeOfEffect=CMMsg.TYP_GAS;
WeaponType=Weapon.TYPE_GASSING;
this.EQadjCharStats.setStat(CharStats.STAT_SAVE_GAS,PowerLevel*5);
}else
if(type.equalsIgnoreCase("MIND"))
{
TypeOfEffect=CMMsg.TYP_MIND;
WeaponType=Weapon.TYPE_STRIKING;
this.EQadjCharStats.setStat(CharStats.STAT_SAVE_MIND,PowerLevel*5);
}else
if(type.equalsIgnoreCase("ACID"))
{
TypeOfEffect=CMMsg.TYP_ACID;
WeaponType=Weapon.TYPE_MELTING;
this.EQadjCharStats.setStat(CharStats.STAT_SAVE_ACID,PowerLevel*5);
}else
if(type.equalsIgnoreCase("ELECTRIC"))
{
TypeOfEffect=CMMsg.TYP_ELECTRIC;
WeaponType=Weapon.TYPE_BURNING;
this.EQadjCharStats.setStat(CharStats.STAT_SAVE_ELECTRIC,PowerLevel*5);
}else
if(type.equalsIgnoreCase("POISON"))
{
TypeOfEffect=CMMsg.TYP_POISON;
WeaponType=Weapon.TYPE_STRIKING;
this.EQadjCharStats.setStat(CharStats.STAT_SAVE_POISON,PowerLevel*5);
}else
if(type.equalsIgnoreCase("DISEASE"))
{
TypeOfEffect=CMMsg.TYP_DISEASE;
WeaponType=Weapon.TYPE_STRIKING;
this.EQadjCharStats.setStat(CharStats.STAT_SAVE_DISEASE,PowerLevel*5);
}else
if(type.equalsIgnoreCase("HEALTH"))
{
TypeOfEffect=1001;
WeaponType=Weapon.TYPE_BURSTING;
}else
if(type.equalsIgnoreCase("MAGIC"))
{
TypeOfEffect=1002;
WeaponType=Weapon.TYPE_BURSTING;
}else
if(type.equalsIgnoreCase("SPEED"))
{
TypeOfEffect=1003;
}
}
public boolean useAsWand(MOB mob, int level)
{
int manaRequired=50;
// For simplicity, there's no charges BUT use costs a flat 10% mana
manaRequired=(int)CMath.div(mob.maxState().getMana(),10);
manaRequired-=(5*level);
if(manaRequired<5) manaRequired=5;
if(manaRequired>mob.curState().getMana())
{
mob.tell("You don't have enough mana.");
return false;
}
mob.curState().adjMana(-manaRequired,mob.maxState());
return true;
}
public static String getWandWord(String from)
{
int hash=from.hashCode();
if(hash<0)
{
hash=hash*-1;
}
return words[hash%words.length];
}
/*
* ********************** Staff/Wand Clan Eq **********************
*/
public void waveIfAble(MOB mob, Environmental afftarget, String message, Wand me)
{
if((mob.isMine(me))&&(afftarget!=null)&&(afftarget instanceof MOB)&&(!me.amWearingAt(Item.IN_INVENTORY)))
{
MOB target=null;
if((mob.location()!=null))
{
target=(MOB)afftarget;
}
int x=message.toUpperCase().indexOf(secretWord.toUpperCase());
if(x>=0)
{
message=message.substring(x+secretWord.length());
int y=message.indexOf("'");
if(y>=0)
{
message=message.substring(0,y);
}
message=message.trim();
Ability wandUse=mob.fetchAbility("Skill_WandUse");
if((wandUse==null)||(!wandUse.proficiencyCheck(mob,0,false)))
{
mob.tell(me.name()+" glows faintly for a moment, then fades.");
}else
{
wandUse.setInvoker(mob);
if(useAsWand(mob,wandUse.abilityCode()))
{
mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,me.name()+" glows brightly.");
int flameDamage=CMLib.dice().roll(1,6,0);
flameDamage*=PowerLevel;
CMLib.combat().postDamage(mob,target,null,flameDamage,CMMsg.MASK_MALICIOUS|CMMsg.MASK_ALWAYS|TypeOfEffect,WeaponType,
"^F^<FIGHT^>The magic of "+clanName+" <DAMAGE> <T-NAME>!^</FIGHT^>^?");
wandUse.helpProficiency(mob);
return;
}
}
}
}
}
public static void initAdjustments(CharStats adjCharStats)
{
// ensure we get no NULL errors
adjCharStats.setStat(CharStats.STAT_SAVE_MAGIC,0);
adjCharStats.setStat(CharStats.STAT_SAVE_GAS,0);
adjCharStats.setStat(CharStats.STAT_SAVE_FIRE,0);
adjCharStats.setStat(CharStats.STAT_SAVE_ELECTRIC,0);
adjCharStats.setStat(CharStats.STAT_SAVE_MIND,0);
adjCharStats.setStat(CharStats.STAT_SAVE_JUSTICE,0);
adjCharStats.setStat(CharStats.STAT_SAVE_COLD,0);
adjCharStats.setStat(CharStats.STAT_SAVE_ACID,0);
adjCharStats.setStat(CharStats.STAT_SAVE_WATER,0);
adjCharStats.setStat(CharStats.STAT_SAVE_UNDEAD,0);
adjCharStats.setStat(CharStats.STAT_SAVE_DISEASE,0);
adjCharStats.setStat(CharStats.STAT_SAVE_POISON,0);
adjCharStats.setStat(CharStats.STAT_SAVE_PARALYSIS,0);
adjCharStats.setStat(CharStats.STAT_SAVE_TRAPS,0);
}
public void affectCharStats(MOB affectedMOB, CharStats affectedStats)
{
if(EQadjCharStats==null)
{
setMiscText(text());
/*
* ************************* Armor-based Resistances
* *************************
*/
}
if((affected!=null)&&(affected instanceof Armor)&&(!(affected instanceof Shield))&&(activated)
&&(!((Armor)affected).amWearingAt(Item.IN_INVENTORY)))
{
for(int i=0;i<Prop_HaveResister.stats.length;i++)
affectedStats.setStat(((Integer)Prop_HaveResister.stats[i][0]).intValue(),affectedStats
.getStat(((Integer)Prop_HaveResister.stats[i][0]).intValue())
+EQadjCharStats.getStat(((Integer)Prop_HaveResister.stats[i][0]).intValue()));
}
super.affectCharStats(affectedMOB,affectedStats);
}
public void executeMsg(Environmental myHost, CMMsg msg)
{
super.executeMsg(myHost,msg);
if(((System.currentTimeMillis()-LastChecked)>TimeManager.MILI_HOUR)&&(affected!=null))
{
if((clanName!=null)&&(clanName.length()>0)&&(CMLib.clans().getClan(clanName)==null)) affected.delEffect(this);
LastChecked=System.currentTimeMillis();
}
MOB mob=null;
MOB source=null;
if((affected!=null)&&(affected instanceof Item))
{
if((((Item)affected).owner()!=null)&&((Item)affected).owner() instanceof MOB)
{
mob=(MOB)((Item)affected).owner();
}
}
// if held by the wrong clan, it is inactive.
if((mob!=null)&&(mob.getClanID().equalsIgnoreCase(clanName)))
activated=true;
else
activated=false;
if(!activated) return;
if(msg.source()!=null)
{
source=msg.source();
/*
* ********************** Weapon addtl. Damage
* **********************
*/
}
if((msg.source().location()!=null)&&(msg.targetMinor()==CMMsg.TYP_DAMAGE)&&(msg.value()>0)&&(msg.tool()==affected)&&(!notAgain)
&&(msg.target() instanceof MOB)&&(msg.tool() instanceof Weapon)&&(!(msg.tool() instanceof Wand))&&(TypeOfEffect<1000)
&&(!((MOB)msg.target()).amDead()))
{
double flameDamage=new Integer(CMLib.dice().roll(1,6,0)).doubleValue();
for(int i=0;i<PowerLevel;i++)
flameDamage=flameDamage*1.5;
String str="^F^<FIGHT^>The magic of "+clanName+" <DAMAGE> <T-NAME>!^</FIGHT^>^?";
CMLib.combat().postDamage(msg.source(),(MOB)msg.target(),null,(int)Math.round(flameDamage),
CMMsg.MASK_MALICIOUS|CMMsg.MASK_ALWAYS|TypeOfEffect,WeaponType,str);
}
/*
* ********************** Shield Thorns Damage **********************
*/
if((mob!=null)&&(msg.amITarget(mob))&&(affected instanceof Shield)&&(TypeOfEffect<1000))
{
if((CMLib.dice().rollPercentage()>32+msg.source().charStats().getStat(CharStats.STAT_DEXTERITY))&&(msg.source().rangeToTarget()==0)
&&((lastMessage==null)||(lastMessage.indexOf("The magic around")<0))
&&((CMath.bset(msg.targetMajor(),CMMsg.MASK_HANDS))||(CMath.bset(msg.targetMajor(),CMMsg.MASK_MOVE))))
{
CMMsg msg2=CMClass.getMsg(mob,source,this,CMMsg.MSG_CAST_ATTACK_VERBAL_SPELL,null);
if(source.location().okMessage(source,msg2))
{
source.location().send(source,msg2);
if(msg2.value()<=0)
{
int damage=CMLib.dice().roll(1,3,0);
damage*=PowerLevel;
CMLib.combat().postDamage(mob,source,this,damage,CMMsg.MASK_MALICIOUS|CMMsg.MASK_ALWAYS|TypeOfEffect,WeaponType,
"^F^<FIGHT^>The magic of "+clanName+" around <S-NAME> <DAMAGE> <T-NAME>!^</FIGHT^>^?");
}
}
}
}
/*
* ************************* Staff/Wand Message Watch
* *************************
*/
if(affected instanceof Wand)
switch(msg.targetMinor())
{
case CMMsg.TYP_WAND_USE:
if(msg.amITarget(this)) waveIfAble(mob,msg.tool(),msg.targetMessage(),(Wand)affected);
break;
case CMMsg.TYP_SPEAK:
if(msg.sourceMinor()==CMMsg.TYP_SPEAK)
msg.addTrailerMsg(CMClass.getMsg(msg.source(),this,msg.target(),CMMsg.NO_EFFECT,null,CMMsg.MASK_ALWAYS|CMMsg.TYP_WAND_USE,msg
.targetMessage(),CMMsg.NO_EFFECT,null));
break;
default:
break;
}
}
}