package com.planet_ink.coffee_mud.Abilities.Thief;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.core.*;
import com.planet_ink.coffee_mud.core.collections.*;
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.Libraries.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.*;
/*
* Copyright 2000-2019 Bo Zimmerman, Lee Fox 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.
*/
public class Thief_Racketeer extends ThiefSkill
{
@Override
public int classificationCode()
{
return Ability.ACODE_THIEF_SKILL|Ability.DOMAIN_CRIMINAL;
}
@Override
public String ID()
{
return "Thief_Racketeer";
}
@Override
public String name()
{
return "Racketeer";
}
@Override
public String displayText()
{
return "";
}
@Override
protected int canAffectCode()
{
return CAN_MOBS;
}
@Override
protected int canTargetCode()
{
return CAN_MOBS;
}
@Override
public int abstractQuality()
{
return Ability.QUALITY_MALICIOUS;
}
private static final String[] triggerStrings={"RACKETEER"};
@Override
public String[] triggerStrings()
{
return triggerStrings;
}
@Override
public boolean disregardsArmorCheck(final MOB mob)
{
return true;
}
public Vector<MOB> mobs=new Vector<MOB>();
@Override
public boolean okMessage(final Environmental myHost, final CMMsg msg)
{
if(!super.okMessage(myHost,msg))
{
return false;
}
final MOB source=msg.source();
if((!msg.source().Name().equals(text()))
&&((msg.source().getClanRole(text())==null))
&&(msg.tool() instanceof Ability)
&&(msg.target()==affected)
&&((((Ability)msg.tool()).classificationCode()&Ability.ALL_ACODES)==Ability.ACODE_THIEF_SKILL)
&&(msg.sourceMinor()!=CMMsg.TYP_TEACH))
{
if(invoker()==source)
{
source.tell(L("@x1 is currently under your protection.",((Physical)msg.target()).name(source)));
}else
{
source.tell(L("@x1 is under @x2's protection.",((Physical)msg.target()).name(source),invoker().name(source)));
invoker().tell(L("Word on the street is that @x1 is hassling @x2 who is under your protection.",source.name(invoker()),((Physical)msg.target()).name(invoker())));
}
return false;
}
return true;
}
@Override
public int castingQuality(final MOB mob, final Physical target)
{
if(mob!=null)
{
if(mob.isInCombat())
return Ability.QUALITY_INDIFFERENT;
if(target instanceof PhysicalAgent)
{
final PhysicalAgent AE=(PhysicalAgent)target;
if((CMLib.coffeeShops().getShopKeeper(target)==null)&&(AE.fetchBehavior("MoneyChanger")==null)
&&(AE.fetchBehavior("ItemMender")==null)&&(AE.fetchBehavior("ItemIdentifier")==null)
&&(AE.fetchBehavior("ItemRefitter")==null))
return Ability.QUALITY_INDIFFERENT;
if(target.fetchEffect(ID())!=null)
return Ability.QUALITY_INDIFFERENT;
if((target instanceof MOB)&&(!((MOB)target).mayIFight(mob)))
return Ability.QUALITY_INDIFFERENT;
}
}
return super.castingQuality(mob,target);
}
@Override
public boolean invoke(final MOB mob, final List<String> commands, final Physical givenTarget, final boolean auto, final int asLevel)
{
if((commands.size()<1)&&(givenTarget==null))
{
mob.tell(L("Get protection money from whom?"));
return false;
}
MOB target=null;
if((givenTarget!=null)&&(givenTarget instanceof MOB))
target=(MOB)givenTarget;
else
target=mob.location().fetchInhabitant(CMParms.combine(commands,0));
if((target==null)||(target.amDead())||(!CMLib.flags().canBeSeenBy(target,mob)))
{
mob.tell(L("You don't see '@x1' here.",CMParms.combine(commands,1)));
return false;
}
if(mob.isInCombat())
{
mob.tell(L("You are too busy to racketeer right now."));
return false;
}
if((CMLib.coffeeShops().getShopKeeper(target)==null)
&&(target.fetchBehavior("MoneyChanger")==null)
&&(target.fetchBehavior("ItemMender")==null)
&&(target.fetchBehavior("ItemIdentifier")==null)
&&(target.fetchBehavior("ItemRefitter")==null))
{
mob.tell(L("You can't get protection money from @x1.",target.name(mob)));
return false;
}
final Ability A=target.fetchEffect(ID());
if(A!=null)
{
if(A.invoker()==mob)
mob.tell(L("@x1 has already been extracted from today.",target.name(mob)));
else
{
mob.tell(L("@x1 is already under @x2's protection.",target.name(mob),A.invoker().name(mob)));
A.invoker().tell(L("Word on the street is that @x1 is trying to push into your business with @x2.",mob.name(A.invoker()),target.name()));
}
return false;
}
final int levelDiff=target.phyStats().level()-(mob.phyStats().level()+(2*getXLEVELLevel(mob)));
if(!target.mayIFight(mob))
{
mob.tell(L("You cannot racketeer @x1.",target.charStats().himher()));
return false;
}
if(!super.invoke(mob,commands,givenTarget,auto,asLevel))
return false;
final double amount=CMLib.dice().roll(proficiency(),target.phyStats().level(),0);
final boolean success=proficiencyCheck(mob,-(levelDiff),auto);
final Room R=mob.location();
if((success)&&(R!=null))
{
final CMMsg msg=CMClass.getMsg(mob,target,this,(auto?CMMsg.MASK_ALWAYS:0)|CMMsg.MSG_THIEF_ACT,L("<S-NAME> extract(s) @x1 of protection money from <T-NAME>.",CMLib.beanCounter().nameCurrencyShort(target,amount)));
if(R.okMessage(mob,msg))
{
R.send(mob,msg);
final TimeClock timeObj = R.getArea().getTimeObj();
final int hoursInMonth = timeObj.getHoursInDay() * timeObj.getDaysInMonth();
final int tickDown = (int)(((CMProps.getMillisPerMudHour()) * hoursInMonth) / (CMProps.getTickMillis()) );
beneficialAffect( mob, target, asLevel, tickDown);
final Coins C=CMLib.beanCounter().makeBestCurrency(target,amount);
if(C!=null)
{
R.addItem(C,ItemPossessor.Expire.Player_Drop);
CMLib.commands().postGet(mob,null,C,true);
}
}
}else
maliciousFizzle(mob,target,L("<T-NAME> seem(s) unintimidated by <S-NAME>."));
return success;
}
}