SHARE
TWEET

Untitled

a guest Jun 15th, 2019 74 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package com.planet_ink.coffee_mud.Abilities.Spells;
  2. import com.planet_ink.coffee_mud.core.interfaces.*;
  3. import com.planet_ink.coffee_mud.core.*;
  4. import com.planet_ink.coffee_mud.core.collections.*;
  5. import com.planet_ink.coffee_mud.Abilities.interfaces.*;
  6. import com.planet_ink.coffee_mud.Areas.interfaces.*;
  7. import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
  8. import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
  9. import com.planet_ink.coffee_mud.Commands.interfaces.*;
  10. import com.planet_ink.coffee_mud.Common.interfaces.*;
  11. import com.planet_ink.coffee_mud.Exits.interfaces.*;
  12. import com.planet_ink.coffee_mud.Items.interfaces.*;
  13. import com.planet_ink.coffee_mud.Libraries.interfaces.ExpertiseLibrary;
  14. import com.planet_ink.coffee_mud.Libraries.interfaces.LegalLibrary;
  15. import com.planet_ink.coffee_mud.Locales.interfaces.*;
  16. import com.planet_ink.coffee_mud.MOBS.interfaces.*;
  17. import com.planet_ink.coffee_mud.Races.interfaces.*;
  18.  
  19. import java.util.*;
  20.  
  21. /*
  22.    Copyright 2002-2018 Bo Zimmerman
  23.  
  24.    Licensed under the Apache License, Version 2.0 (the "License");
  25.    you may not use this file except in compliance with the License.
  26.    You may obtain a copy of the License at
  27.  
  28.        http://www.apache.org/licenses/LICENSE-2.0
  29.  
  30.    Unless required by applicable law or agreed to in writing, software
  31.    distributed under the License is distributed on an "AS IS" BASIS,
  32.    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  33.    See the License for the specific language governing permissions and
  34.    limitations under the License.
  35. */
  36.  
  37. public class Spell_Wish extends Spell
  38. {
  39.  
  40.     @Override
  41.     public String ID()
  42.     {
  43.         return "Spell_Wish";
  44.     }
  45.  
  46.     private final static String localizedName = CMLib.lang().L("Wish");
  47.  
  48.     @Override
  49.     public String name()
  50.     {
  51.         return localizedName;
  52.     }
  53.  
  54.     @Override
  55.     protected int canTargetCode()
  56.     {
  57.         return 0;
  58.     }
  59.  
  60.     @Override
  61.     public int classificationCode()
  62.     {
  63.         return Ability.ACODE_SPELL | Ability.DOMAIN_ALTERATION;
  64.     }
  65.  
  66.     @Override
  67.     public int enchantQuality()
  68.     {
  69.         return Ability.QUALITY_INDIFFERENT;
  70.     }
  71.  
  72.     @Override
  73.     public int abstractQuality()
  74.     {
  75.         return Ability.QUALITY_INDIFFERENT;
  76.     }
  77.  
  78.     @Override
  79.     public long flags()
  80.     {
  81.         return Ability.FLAG_NOORDERING;
  82.     }
  83.  
  84.     @Override
  85.     protected int overrideMana()
  86.     {
  87.         return Ability.COST_ALL;
  88.     }
  89.  
  90.     protected Physical maybeAdd(MOB mob, Physical E, List<Physical> foundAll, Physical foundThang)
  91.     {
  92.         final Room R=CMLib.map().roomLocation(E);
  93.         if((E!=null)
  94.         &&(!(E instanceof ArchonOnly))
  95.         &&(!(E instanceof ClanItem))
  96.         &&((R==null)||(CMLib.law().getLandTitle(R)==null)||(CMLib.law().doesHavePriviledgesHere(mob, R)))
  97.         &&((foundThang==null)
  98.            ||((foundThang.ID().equals(E.ID()))&&(foundThang.name().equals(E.name())))))
  99.         {
  100.             if(foundThang==null)
  101.                 foundThang=E;
  102.             foundAll.add(E);
  103.         }
  104.         return foundThang;
  105.     }
  106.  
  107.     private void bringThangHere(MOB mob, Room here, Physical target)
  108.     {
  109.         if(target instanceof MOB)
  110.         {
  111.             mob.location().show((MOB)target,null,CMMsg.MSG_OK_VISUAL,L("<S-NAME> teleport(s) to @x1.",here.displayText()));
  112.             here.bringMobHere((MOB)target,false);
  113.             if(here.isInhabitant((MOB)target))
  114.                 here.show((MOB)target,null,CMMsg.MSG_OK_VISUAL,L("<S-NAME> appear(s) out of nowhere."));
  115.         }
  116.         else
  117.         if(target instanceof Item)
  118.         {
  119.             final Item item=(Item)target;
  120.             mob.location().show(mob,target,CMMsg.MSG_OK_VISUAL,L("<T-NAME> is teleported to @x1!",here.displayText()));
  121.             item.unWear();
  122.             item.setContainer(null);
  123.             item.removeFromOwnerContainer();
  124.             here.addItem(item,ItemPossessor.Expire.Player_Drop);
  125.             mob.location().show(mob,target,CMMsg.MSG_OK_VISUAL,L("<T-NAME> appears out of the Java Plane!"));
  126.         }
  127.     }
  128.  
  129.     public void wishDrain(MOB mob, int expLoss, boolean conLoss)
  130.     {
  131.         if(mob==null)
  132.             return;
  133.         expLoss=getXPCOSTAdjustment(mob,expLoss);
  134.         if(expLoss > mob.getExperience())
  135.             expLoss=mob.getExperience();
  136.         CMLib.leveler().postExperience(mob,null,null,-expLoss,false);
  137.         if(conLoss)
  138.         {
  139.             mob.tell(L("Your wish drains you of @x1 experience points and a point of constitution.",""+(expLoss)));
  140.             mob.baseCharStats().setStat(CharStats.STAT_CONSTITUTION,mob.baseCharStats().getStat(CharStats.STAT_CONSTITUTION)-1);
  141.             mob.baseCharStats().setStat(CharStats.STAT_MAX_CONSTITUTION_ADJ,mob.baseCharStats().getStat(CharStats.STAT_MAX_CONSTITUTION_ADJ)-1);
  142.             mob.recoverCharStats();
  143.             if(mob.charStats().getStat(CharStats.STAT_CONSTITUTION)<1)
  144.                 CMLib.combat().postDeath(mob,mob,null);
  145.         }
  146.         else
  147.             mob.tell(L("Your wish drains @x1 experience points.",""+(expLoss)));
  148.     }
  149.  
  150.     public void age(MOB mob)
  151.     {
  152.         final Ability A=CMClass.getAbility("Chant_SpeedAging");
  153.         if (A != null)
  154.         {
  155.             A.setAbilityCode(65536);
  156.             A.invoke(mob, mob, true, 0);
  157.         }
  158.     }
  159.  
  160.     @Override
  161.     public boolean invoke(MOB mob, List<String> commands, Physical givenTarget, boolean auto, int asLevel)
  162.     {
  163.         if(mob.isMonster())
  164.         {
  165.             mob.location().show(mob,null,CMMsg.MSG_NOISE,L("<S-NAME> sigh(s)."));
  166.             CMLib.commands().postSay(mob,null,L("My wishes never seem to come true."),false,false);
  167.             return false;
  168.         }
  169.  
  170.         String myWish=CMParms.combine(commands,0);
  171.         if(((!auto)&&(mob.phyStats().level()<20))||(mob.charStats().getStat(CharStats.STAT_CONSTITUTION)<2))
  172.         {
  173.             mob.tell(L("You are too weak to wish."));
  174.             return false;
  175.         }
  176.         if(myWish.toUpperCase().trim().startsWith("FOR "))
  177.             myWish=myWish.trim().substring(3);
  178.         if(myWish.length()==0)
  179.         {
  180.             mob.tell(L("What would you like to wish for?"));
  181.             return false;
  182.         }
  183.  
  184.         if(!super.invoke(mob,commands,givenTarget,auto,asLevel))
  185.             return false;
  186.  
  187.         int baseLoss=25;
  188.         final CMMsg msg=CMClass.getMsg(mob,null,this,verbalCastCode(mob,null,auto),L("^S<S-NAME> wish(es) for '@x1'!!^?",myWish));
  189.         final boolean success=proficiencyCheck(mob,0,auto);
  190.         if(!success)
  191.         {
  192.             baseLoss=getXPCOSTAdjustment(mob,baseLoss);
  193.             CMLib.leveler().postExperience(mob,null,null,-baseLoss,false);
  194.             beneficialWordsFizzle(mob,null,L("<S-NAME> wish(es) for '@x1', but the spell fizzles.",myWish));
  195.             return false;
  196.         }
  197.         else
  198.         if(mob.location().okMessage(mob,msg))
  199.         {
  200.             // cast wish bless were cast on me
  201.             // cast wish to have restoration cast on me
  202.             // cast wish to cast bless on me
  203.             // cast wish to cast disintegrate on orc
  204.             // cast wish to cast geas on orc to kill bob
  205.             Log.sysOut("Wish",mob.Name()+" wished for "+myWish+".");
  206.  
  207.             mob.location().send(mob,msg);
  208.             final StringBuffer wish=new StringBuffer(myWish);
  209.             for(int i=0;i<wish.length();i++)
  210.             {
  211.                 if(!Character.isLetterOrDigit(wish.charAt(i)))
  212.                     wish.setCharAt(i,' ');
  213.             }
  214.             myWish=wish.toString().trim().toUpperCase();
  215.             final List<String> wishV=CMParms.parse(myWish);
  216.             myWish=" "+myWish+" ";
  217.             if(wishV.size()==0)
  218.             {
  219.                 baseLoss=getXPCOSTAdjustment(mob,baseLoss);
  220.                 CMLib.leveler().postExperience(mob,null,null,-baseLoss,false);
  221.                 beneficialWordsFizzle(mob,null,L("<S-NAME> make(s) a wish comes true! Nothing happens!"));
  222.                 return false;
  223.             }
  224.  
  225.             // do locate object first.. its the most likely
  226.             String objectWish=myWish;
  227.             final String[] redundantStarts={
  228.                 "CREATE",
  229.                 "TO CREATE",
  230.                 "ANOTHER",
  231.                 "THERE WAS",
  232.                 "I HAD",
  233.                 "I COULD HAVE",
  234.                 "MAY I HAVE",
  235.                 "CAN I HAVE",
  236.                 "CAN YOU",
  237.                 "CAN I",
  238.                 "MAKE",
  239.                 "TO MAKE",
  240.                 "GIVE",
  241.                 "ME",
  242.                 "TO HAVE",
  243.                 "TO GET",
  244.                 "A NEW",
  245.                 "SOME MORE",
  246.                 "MY OWN",
  247.                 "A",
  248.                 "PLEASE",
  249.                 "THE",
  250.                 "I OWNED",
  251.                 "FOR"
  252.             };
  253.             final String[] redundantEnds=
  254.             {
  255.                 "TO APPEAR",
  256.                 "OF MY OWN",
  257.                 "FOR ME",
  258.                 "BE",
  259.                 "CREATED",
  260.                 "PLEASE",
  261.                 "HERE"
  262.             };
  263.             final String[] wearableEnds=
  264.             {
  265.                 "WAS WEARABLE",
  266.                 "COULD BE WORN",
  267.                 "WAS USABLE",
  268.                 "COULD BE USED"
  269.             };
  270.             int i=0;
  271.             boolean wearableEnd=false;
  272.             while(i<redundantStarts.length)
  273.             {
  274.                 if(objectWish.startsWith(" "+redundantStarts[i]+" "))
  275.                 {
  276.                     objectWish = objectWish.substring(1 + redundantStarts[i].length());
  277.                     i = -1;
  278.                 }
  279.                 i++;
  280.             }
  281.             i=0;
  282.             while(i<redundantEnds.length)
  283.             {
  284.                 if(objectWish.endsWith(" "+redundantEnds[i]+" "))
  285.                 {
  286.                     objectWish = objectWish.substring(0, objectWish.length() - (1 + redundantEnds[i].length()));
  287.                     i = -1;
  288.                 }
  289.                 i++;
  290.             }
  291.             i=0;
  292.             while(i<wearableEnds.length)
  293.             {
  294.                 if(objectWish.endsWith(" "+wearableEnds[i]+" "))
  295.                 {
  296.                     objectWish = objectWish.substring(0, objectWish.length() - (1 + redundantEnds[i].length()));
  297.                     wearableEnd=true;
  298.                     i = -1;
  299.                 }
  300.                 i++;
  301.             }
  302.             String goldWish=objectWish.toUpperCase();
  303.             objectWish=objectWish.toLowerCase().trim();
  304.  
  305.             final String[] redundantGoldStarts=
  306.             {
  307.                 "A PILE OF",
  308.                 "A STACK OF",
  309.                 "PILE OF",
  310.                 "STACK OF"
  311.             };
  312.             i=0;
  313.             while(i<redundantGoldStarts.length)
  314.             {
  315.                 if(goldWish.startsWith(" "+redundantGoldStarts[i]+" "))
  316.                 {
  317.                     goldWish = goldWish.substring(1 + redundantGoldStarts[i].length());
  318.                     i = -1;
  319.                 }
  320.                 i++;
  321.             }
  322.             final List<String> goldCheck=CMParms.parse(goldWish.trim().toLowerCase());
  323.             if((goldCheck.size()>1)
  324.             &&(CMath.isNumber(goldCheck.get(0)))
  325.             &&(CMath.s_int(goldCheck.get(0))>0)
  326.             &&(CMLib.english().matchAnyCurrencySet(CMParms.combine(goldCheck,1))!=null))
  327.             {
  328.                 final Coins newItem=(Coins)CMClass.getItem("StdCoins");
  329.                 newItem.setCurrency(CMLib.english().matchAnyCurrencySet(CMParms.combine(goldCheck,1)));
  330.                 newItem.setDenomination(CMLib.english().matchAnyDenomination(newItem.getCurrency(),CMParms.combine(goldCheck,1)));
  331.                 final long goldCoins=CMath.s_long(goldCheck.get(0));
  332.                 newItem.setNumberOfCoins(goldCoins);
  333.                 int experienceRequired=Math.max((int)Math.round(CMath.div(newItem.getTotalValue(),10.0)),0);
  334.                 while((experienceRequired > mob.getExperience())
  335.                 && (experienceRequired > 0)
  336.                 && (newItem.getNumberOfCoins() > 1))
  337.                 {
  338.                     final int difference=experienceRequired-mob.getExperience();
  339.                     final double diffPct=CMath.div(difference, experienceRequired);
  340.                     long numCoinsToLose=Math.round(CMath.mul(diffPct, newItem.getNumberOfCoins()));
  341.                     if(numCoinsToLose<1)
  342.                         numCoinsToLose=1;
  343.                     newItem.setNumberOfCoins(newItem.getNumberOfCoins()-numCoinsToLose);
  344.                     experienceRequired=Math.max((int)Math.round(CMath.div(newItem.getTotalValue(),10.0)),0);
  345.                 }
  346.                 newItem.setContainer(null);
  347.                 newItem.wearAt(0);
  348.                 newItem.recoverPhyStats();
  349.                 mob.location().addItem(newItem,ItemPossessor.Expire.Player_Drop);
  350.                 mob.location().showHappens(CMMsg.MSG_OK_ACTION,L("Suddenly, @x1 drops from the sky.",newItem.name()));
  351.                 mob.location().recoverRoomStats();
  352.                 wishDrain(mob,(baseLoss+experienceRequired),false);
  353.                 return true;
  354.             }
  355.  
  356.             final List<Physical> thangsFound=new ArrayList<Physical>();
  357.             Physical foundThang=null;
  358.             final Physical P=mob.location().fetchFromRoomFavorItems(null,objectWish);
  359.             foundThang=maybeAdd(mob,P,thangsFound,foundThang);
  360.             try
  361.             {
  362.                 final List<Environmental> items=new LinkedList<Environmental>();
  363.                 items.addAll(CMLib.map().findRoomItems(CMLib.map().rooms(), mob,objectWish,true,10));
  364.                 items.addAll(CMLib.map().findInhabitants(CMLib.map().rooms(), mob,objectWish,10));
  365.                 items.addAll(CMLib.map().findInventory(CMLib.map().rooms(), mob,objectWish,10));
  366.                 items.addAll(CMLib.map().findShopStock(CMLib.map().rooms(), mob,objectWish,10));
  367.                 for(final Environmental O : items)
  368.                 {
  369.                     if(O instanceof Physical)
  370.                         foundThang=maybeAdd(mob,((Physical)O),thangsFound,foundThang);
  371.                 }
  372.                 if(objectWish.equals("LAND")
  373.                 ||objectWish.equals("A HOUSE")
  374.                 ||objectWish.equals("HOUSE")
  375.                 ||objectWish.equals("A HOME")
  376.                 ||objectWish.equals("HOME")
  377.                 ||objectWish.equals("REAL ESTATE")
  378.                 ||objectWish.equals("SOME REAL ESTATE")
  379.                 ||objectWish.equals("PROPERTY")
  380.                 ||objectWish.equals("SOME PROPERTY")
  381.                 ||objectWish.equals("SOME LAND"))
  382.                 {
  383.                     final LegalLibrary law=CMLib.law();
  384.                     for(final Enumeration<Room> r=CMLib.map().rooms();r.hasMoreElements();)
  385.                     {
  386.                         final Room R=r.nextElement();
  387.                         if((R!=null)&&(!(R.getArea() instanceof BoardableShip)))
  388.                         {
  389.                             final LandTitle title = law.getLandTitle(R);
  390.                             if((title!=null)
  391.                             &&(title.getOwnerName().length()==0))
  392.                             {
  393.                                 LandTitle T=(LandTitle)CMClass.getItem("GenTitle");
  394.                                 T.setLandPropertyID(title.landPropertyID());
  395.                                 T.text();
  396.                                 items.add(T);
  397.                             }
  398.                         }
  399.                     }
  400.                 }
  401.             }
  402.             catch (final NoSuchElementException nse)
  403.             {
  404.             }
  405.  
  406.             if(foundThang instanceof PackagedItems)
  407.                 foundThang = ((PackagedItems)foundThang).peekFirstItem();
  408.  
  409.             if((thangsFound.size()>0)&&(foundThang!=null))
  410.             {
  411.                 // yea, we get to DO something!
  412.                 int experienceRequired=100*(foundThang.phyStats().level()-1);
  413.                 if(foundThang instanceof MOB)
  414.                 {
  415.                     final MOB foundMOB=(MOB)foundThang;
  416.                     MOB newMOB;
  417.                     final boolean isPlayer=foundMOB.playerStats()!=null;
  418.                     if(isPlayer && (!foundMOB.isMonster()) && CMLib.flags().isInTheGame(foundMOB, true))
  419.                     {
  420.                         newMOB=foundMOB;
  421.                         mob.location().bringMobHere(newMOB, false);
  422.                     }
  423.                     else
  424.                     {
  425.                         if(isPlayer)
  426.                         {
  427.                             newMOB=CMClass.getMOB("GenMOB");
  428.                             newMOB.setName(L("CopyOf@x1",foundThang.Name()));
  429.                             newMOB.setDisplayText(((MOB) foundThang).displayText(mob));
  430.                             newMOB.setDescription(foundThang.description());
  431.                         }
  432.                         else
  433.                             newMOB=(MOB)foundMOB.copyOf();
  434.                         newMOB.setStartRoom(null);
  435.                         newMOB.setLocation(mob.location());
  436.                         newMOB.recoverCharStats();
  437.                         newMOB.recoverPhyStats();
  438.                         newMOB.recoverMaxState();
  439.                         newMOB.resetToMaxState();
  440.                         newMOB.bringToLife(mob.location(),true);
  441.                     }
  442.                     newMOB.location().showOthers(newMOB,null,CMMsg.MSG_OK_ACTION,L("<S-NAME> appears!"));
  443.                     mob.location().show(mob,null,CMMsg.MSG_OK_ACTION,L("Suddenly, @x1 instantiates from the Java Plane.",newMOB.name()));
  444.                     newMOB.setFollowing(mob);
  445.                     if(experienceRequired<=0)
  446.                         experienceRequired=0;
  447.                     wishDrain(mob,(baseLoss+experienceRequired),false);
  448.                     return true;
  449.                 }
  450.                 else
  451.                 if((foundThang instanceof Item)
  452.                 &&(!(foundThang instanceof ArchonOnly))
  453.                 &&(!(foundThang instanceof ClanItem))
  454.                 &&(!CMath.bset(foundThang.phyStats().sensesMask(), PhyStats.SENSE_ITEMNOWISH)))
  455.                 {
  456.                     if(wearableEnd)
  457.                     {
  458.                         Ability wearableProblemA=null;
  459.                         for(final Enumeration<Ability> a=foundThang.effects();a.hasMoreElements();)
  460.                         {
  461.                             final Ability pA=a.nextElement();
  462.                             if(pA.ID().endsWith("Zapper"))
  463.                                 wearableProblemA=pA;
  464.                         }
  465.                         int levelProblem=(foundThang.phyStats().level()-mob.phyStats().level());
  466.                         if((wearableProblemA != null)||(levelProblem>0))
  467.                         {
  468.                             experienceRequired = 0;
  469.                             if(wearableProblemA != null)
  470.                             {
  471.                                 foundThang.delEffect(wearableProblemA);
  472.                                 experienceRequired=10*(foundThang.phyStats().level()-1);
  473.                             }
  474.                             if(levelProblem>0)
  475.                             {
  476.                                 experienceRequired+=50*levelProblem;
  477.                                 CMLib.itemBuilder().itemFix((Item)foundThang, mob.phyStats().level(), new StringBuffer(""));
  478.                             }
  479.                             wishDrain(mob,(baseLoss+experienceRequired),false);
  480.                             return true;
  481.                         }
  482.                     }
  483.                     final Item newItem=(Item)foundThang.copyOf();
  484.                     experienceRequired+=newItem.value();
  485.                     if(newItem instanceof LandTitle)
  486.                         ((LandTitle)newItem).setOwnerName(mob.Name());
  487.                     if(experienceRequired>mob.getExpPrevLevel())
  488.                         experienceRequired=mob.getExpPrevLevel();
  489.                     newItem.setContainer(null);
  490.                     newItem.wearAt(0);
  491.                     mob.location().addItem(newItem,ItemPossessor.Expire.Player_Drop);
  492.                     mob.location().showHappens(CMMsg.MSG_OK_ACTION,L("Suddenly, @x1 drops from the sky.",newItem.name()));
  493.                     mob.location().recoverRoomStats();
  494.                     if(experienceRequired<=0)
  495.                         experienceRequired=0;
  496.                     wishDrain(mob,(baseLoss+experienceRequired),false);
  497.                     return true;
  498.                 }
  499.             }
  500.  
  501.             boolean onFlag=false;
  502.             // anything else may refer to another person or item
  503.             Physical target=null;
  504.             String possName=wishV.get(0).trim();
  505.             if(wishV.size()>2)
  506.             {
  507.                 possName=CMParms.combine(wishV,0,2);
  508.                 target=mob.location().fetchFromRoomFavorMOBs(null,possName);
  509.                 if(target==null)
  510.                     target=mob.findItem(possName);
  511.                 if(target==null)
  512.                     possName=wishV.get(0).trim();
  513.             }
  514.             if(target==null)
  515.                 target=mob.location().fetchFromRoomFavorMOBs(null,possName);
  516.             if(target==null)
  517.                 target=mob.findItem(possName);
  518.             if((target==null)
  519.             ||(possName.equalsIgnoreCase("FOR"))
  520.             ||(possName.equalsIgnoreCase("TO"))
  521.             ||(possName.equalsIgnoreCase("BE"))
  522.             ||(possName.equalsIgnoreCase("WOULD"))
  523.             ||(possName.equalsIgnoreCase("A"))
  524.             ||(possName.equalsIgnoreCase("THE"))
  525.             ||(possName.equalsIgnoreCase("AN"))
  526.             ||(possName.equalsIgnoreCase("I")))
  527.             {
  528.                 if(possName.equalsIgnoreCase("I"))
  529.                 {
  530.                     wishV.remove(0);
  531.                     myWish=" "+CMParms.combine(wishV,0).toUpperCase()+" ";
  532.                 }
  533.                 if((wishV.size()>3)&&(wishV.get(wishV.size()-2).equals("ON")))
  534.                 {
  535.                     possName=wishV.get(wishV.size()-1);
  536.                     if(possName.equals("SELF")
  537.                     ||possName.equals("ME")
  538.                     ||possName.equals("MYSELF"))
  539.                         target=mob;
  540.                     if(target==null)
  541.                         target=mob.location().fetchFromRoomFavorMOBs(null,possName);
  542.                     if(target==null)
  543.                         target=mob.findItem(possName);
  544.                     if(target!=null)
  545.                     {
  546.                         wishV.remove(wishV.size()-1);
  547.                         wishV.remove(wishV.size()-1);
  548.                         onFlag=true;
  549.                         myWish=" "+CMParms.combine(wishV,0).toUpperCase().trim()+" ";
  550.                     }
  551.                 }
  552.                 if(target==null)
  553.                     target=mob;
  554.             }
  555.             else
  556.             {
  557.                 wishV.remove(0);
  558.                 myWish=" "+CMParms.combine(wishV,0).toUpperCase().trim()+" ";
  559.             }
  560.            
  561.             if(target instanceof PackagedItems)
  562.                 target = ((PackagedItems)target).peekFirstItem();
  563.  
  564.             if((target instanceof ArchonOnly)
  565.             ||(target instanceof ClanItem))
  566.                 target=null;
  567.  
  568.             if((target!=null)
  569.             &&(target!=mob)
  570.             &&(target instanceof MOB)
  571.             &&(!((MOB)target).isMonster())
  572.             &&(!mob.mayIFight((MOB)target)))
  573.             {
  574.                 mob.tell(L("You cannot cast wish on @x1 until @x2 permits you. You must both toggle your playerkill flags on.",target.name(mob),mob.charStats().heshe()));
  575.                 return false;
  576.             }
  577.  
  578.             // a wish for recall
  579.             if((myWish.startsWith(" TO BE RECALLED "))
  580.             ||(myWish.startsWith(" TO RECALL "))
  581.             ||(myWish.startsWith(" RECALL "))
  582.             ||(myWish.startsWith(" BE RECALLED "))
  583.             ||(myWish.startsWith(" WAS RECALLED "))
  584.             ||(myWish.startsWith(" WOULD RECALL "))
  585.             ||(myWish.endsWith(" WAS RECALLED "))
  586.             ||(myWish.endsWith(" WOULD RECALL "))
  587.             ||(myWish.endsWith(" TO RECALL "))
  588.             ||(myWish.endsWith(" BE RECALLED "))
  589.             ||(myWish.endsWith(" RECALL ")&&(!myWish.endsWith(" OF RECALL "))))
  590.             {
  591.                 Room recallRoom=mob.getStartRoom();
  592.                 if((recallRoom==null)&&(target instanceof MOB)&&(((MOB)target).getStartRoom()!=null))
  593.                     recallRoom=((MOB)target).getStartRoom();
  594.                 if(recallRoom!=null)
  595.                 {
  596.                     wishDrain(mob,baseLoss,false);
  597.                     bringThangHere(mob,recallRoom,target);
  598.                     return true;
  599.                 }
  600.             }
  601.  
  602.             // a wish for death or destruction
  603.             if((myWish.startsWith(" TO DIE "))
  604.             ||(myWish.startsWith(" TO BE DESTROYED "))
  605.             ||(myWish.startsWith(" TO CROAK "))
  606.             ||(myWish.startsWith(" WAS DEAD "))
  607.             ||(myWish.startsWith(" WAS GONE "))
  608.             ||(myWish.startsWith(" WOULD GO AWAY "))
  609.             ||(myWish.startsWith(" WAS BANISHED "))
  610.             ||(myWish.startsWith(" WOULD DIE "))
  611.             ||(myWish.startsWith(" WOULD BE DEAD "))
  612.             ||(myWish.startsWith(" WAS DESTROYED "))
  613.             ||(myWish.startsWith(" DEATH "))
  614.             ||(myWish.startsWith(" FOR DEATH "))
  615.             ||(myWish.startsWith(" DESTRUCTION "))
  616.             ||(myWish.startsWith(" TO BE BANISHED "))
  617.             ||(myWish.startsWith(" TO BE DEAD "))
  618.             ||(myWish.startsWith(" TO BE GONE "))
  619.             ||(myWish.startsWith(" TO DISAPPEAR "))
  620.             ||(myWish.startsWith(" TO VANISH "))
  621.             ||(myWish.startsWith(" TO BE INVISIBLE "))
  622.             ||(myWish.startsWith(" TO GO AWAY "))
  623.             ||(myWish.startsWith(" TO GO TO HELL ")))
  624.             {
  625.                 if(target instanceof Item)
  626.                 {
  627.                     mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 quietly vanishes.",target.name()));
  628.                     ((Item)target).destroy();
  629.                 }
  630.                 else
  631.                 if(target instanceof MOB)
  632.                 {
  633.                     final int exp=mob.getExperience();
  634.                     CMLib.combat().postDeath(mob,(MOB)target,null);
  635.                     if((!CMSecurity.isDisabled(CMSecurity.DisFlag.EXPERIENCE))
  636.                     &&!mob.charStats().getCurrentClass().expless()
  637.                     &&!mob.charStats().getMyRace().expless()
  638.                     &&(mob.getExperience()>exp))
  639.                         baseLoss=mob.getExperience()-exp;
  640.                 }
  641.                 wishDrain(mob,baseLoss*2,false);
  642.                 return true;
  643.             }
  644.  
  645.             // a wish for movement
  646.             String locationWish=myWish;
  647.             final String[] redundantStarts2={
  648.                     "TO GO TO",
  649.                   "TO TELEPORT TO",
  650.                   "TO TRANSPORT TO",
  651.                   "TO TRANSFER TO",
  652.                   "TO PORTAL TO",
  653.                   "WOULD TELEPORT TO",
  654.                   "WOULD TRANSPORT TO",
  655.                   "WOULD TRANSFER TO",
  656.                   "WOULD PORTAL TO",
  657.                   "WOULD GO TO",
  658.                   "TO PORTAL TO",
  659.                   "TO BE TELEPORTED TO",
  660.                   "TO BE TRANSPORTED TO",
  661.                   "TO BE TRANSFERRED TO",
  662.                   "TO BE PORTALLED TO",
  663.                   "TO BE PORTALED TO",
  664.                   "TO BE TELEPORTED",
  665.                   "TO BE TRANSPORTED",
  666.                   "TO BE TRANSFERRED",
  667.                   "TO BE PORTALLED",
  668.                   "TO BE PORTALED",
  669.                   "TO APPEAR IN ",
  670.                   "TO BE IN",
  671.                   "TO APPEAR AT",
  672.                   "TO BE AT",
  673.                   "TO GO",
  674.                   "TO MOVE TO",
  675.                   "TO MOVE",
  676.                   "TO BE AT",
  677.                   "TO BE IN",
  678.                   "TO BE",
  679.                   "TO TRAVEL",
  680.                   "TO WALK TO",
  681.                   "TO WALK",
  682.                   "TO TRAVEL TO",
  683.                   "TO GOTO",
  684.                   "TELEPORTATION TO",
  685.                   "TRANSPORTED TO",
  686.                   "TELEPORTED TO",
  687.                   "TRANSFERRED TO",
  688.                   "WAS TRANSPORTED TO",
  689.                   "WAS TELEPORTED TO",
  690.                   "WAS TRANSFERRED TO",
  691.                   "TELEPORT",
  692.                   "GO",
  693.                   "GO TO",
  694.                   "GOTO",
  695.                   "TRANSFER",
  696.                   "PORTAL",
  697.                   "TELEPORTATION"};
  698.             final String[] redundantEnds2={"IMMEDIATELY","PLEASE","NOW","AT ONCE"};
  699.             boolean validStart=false;
  700.             i=0;
  701.             while(i<redundantStarts2.length)
  702.             {
  703.                 if(locationWish.startsWith(" "+redundantStarts2[i]+" "))
  704.                 {
  705.                     validStart=true;
  706.                     locationWish=locationWish.substring(1+redundantStarts2[i].length());
  707.                     i=-1;
  708.                 }
  709.                 i++;
  710.             }
  711.             i=0;
  712.             while(i<redundantEnds2.length)
  713.             {
  714.                 if(locationWish.endsWith(" "+redundantEnds2[i]+" "))
  715.                 {
  716.                     locationWish=locationWish.substring(0,locationWish.length()-(1+redundantEnds2[i].length()));
  717.                     i=-1;
  718.                 }
  719.                 i++;
  720.             }
  721.  
  722.             // a wish for teleportation
  723.             if(validStart)
  724.             {
  725.                 Room newRoom=null;
  726.                 final int dir=CMLib.directions().getGoodDirectionCode(wishV.get(wishV.size()-1));
  727.                 if(dir>=0)
  728.                     newRoom=mob.location().getRoomInDir(dir);
  729.                 if(newRoom==null)
  730.                 {
  731.                     try
  732.                     {
  733.                         final List<Room> rooms=CMLib.map().findRooms(CMLib.map().rooms(), mob, locationWish.trim(), true, 10);
  734.                         if(rooms.size()>0)
  735.                             newRoom=rooms.get(CMLib.dice().roll(1,rooms.size(),-1));
  736.                     }
  737.                     catch (final NoSuchElementException nse)
  738.                     {
  739.                     }
  740.                 }
  741.                 if(newRoom!=null)
  742.                 {
  743.                     bringThangHere(mob,newRoom,target);
  744.                     newRoom.show(mob, null, CMMsg.MSG_OK_VISUAL, L("<S-NAME> appears!"));
  745.                     wishDrain(mob,baseLoss,false);
  746.                     return true;
  747.                 }
  748.             }
  749.  
  750.             if((target instanceof MOB)
  751.             &&((myWish.indexOf(" END PREGNANCY ")>=0)
  752.                 ||(myWish.indexOf(" FINISH PREGNANCY ")>=0)
  753.                 ||(myWish.indexOf(" ABORT PREGNANCY ")>=0)
  754.                 ||(myWish.indexOf(" ABORTION ")>=0)))
  755.             {
  756.                 Ability A=target.fetchEffect("Pregnancy");
  757.                 if(A != null)
  758.                 {
  759.                     A.unInvoke();
  760.                     target.delEffect(A);
  761.                     A.setAffectedOne(null);
  762.                     mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 loses @x2 baby!",target.name(),((MOB)target).charStats().hisher()));
  763.                     wishDrain(mob,baseLoss,false);
  764.                     return true;
  765.                 }
  766.             }
  767.  
  768.             if((target instanceof MOB)
  769.             &&((myWish.indexOf(" GIVE BIRTH ")>=0)
  770.                 ||(myWish.indexOf(" COME TO TERM ")>=0)
  771.                 ||(myWish.indexOf(" HAVE BABY ")>=0)
  772.                 ||(myWish.indexOf(" HAVE HER BABY ")>=0)
  773.                 ||(myWish.indexOf(" COME TO FULL TERM ")>=0)))
  774.             {
  775.                 Ability A=target.fetchEffect("Pregnancy");
  776.                 if(A != null)
  777.                 {
  778.                     long pregStart = CMath.s_long(A.getStat("PREGSTART"));
  779.                     long pregEnd = CMath.s_long(A.getStat("PREGEND"));
  780.                     if((pregStart>=0)&&(pregEnd>=0))
  781.                     {
  782.                         long diff = pregEnd - System.currentTimeMillis() + 10000;
  783.                         mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 start(s) going into labor!",target.name()));
  784.                         A.setStat("PREGSTART", ""+(pregStart - diff));
  785.                         A.setStat("PREGEND", ""+(pregEnd - diff));
  786.                         wishDrain(mob,baseLoss,false);
  787.                         return true;
  788.                     }
  789.                 }
  790.                
  791.             }
  792.  
  793.             if(((target instanceof MOB)
  794.                 ||(target instanceof CagedAnimal))
  795.             &&(target != null)
  796.             &&((myWish.indexOf(" GROW UP ")>=0)
  797.                 ||(myWish.indexOf(" BE OLDER ")>=0)
  798.                 ||(myWish.indexOf(" GROW OLDER ")>=0)))
  799.             {
  800.                 final Ability A=target.fetchEffect("Age");
  801.                 if((target instanceof MOB)
  802.                 &&((A==null)||(A.displayText().length()==0)))
  803.                 {
  804.                     final MOB M=(MOB)target;
  805.                     mob.location().show(M,null,CMMsg.MSG_OK_VISUAL,L("<S-NAME> age(s) a bit."));
  806.                     int ageCat = M.baseCharStats().ageCategory();
  807.                     if(ageCat < Race.AGE_ANCIENT)
  808.                     {
  809.                         while((M.baseCharStats().ageCategory() == ageCat)
  810.                         ||(M.baseCharStats().ageCategory() < Race.AGE_YOUNGADULT))
  811.                         {
  812.                             M.baseCharStats().setStat(CharStats.STAT_AGE, M.baseCharStats().getStat(CharStats.STAT_AGE)+1);
  813.                             if(M.playerStats()!=null)
  814.                                 M.playerStats().getBirthday()[PlayerStats.BIRTHDEX_YEAR]--;
  815.                             CMLib.commands().tickAging(M,60000);
  816.                             M.recoverCharStats();
  817.                         }
  818.                         wishDrain(mob,baseLoss,false);
  819.                         return true;
  820.                     }
  821.                 }
  822.                 else
  823.                 {
  824.                     long start=CMath.s_long(A.text());
  825.                     long age=System.currentTimeMillis()-start;
  826.                     final long millisPerMudday=CMProps.getIntVar(CMProps.Int.TICKSPERMUDDAY)*CMProps.getTickMillis();
  827.                     if(age<millisPerMudday)
  828.                         age=millisPerMudday;
  829.                     final long millisPerMonth=CMLib.time().globalClock().getDaysInMonth() * millisPerMudday;
  830.                     final long millisPerYear=CMLib.time().globalClock().getMonthsInYear() * millisPerMonth;
  831.                     int ageYears = (int)(age / millisPerYear);
  832.                     final CharStats stats = (CharStats)CMClass.getCommon("DefaultCharStats");
  833.                     stats.setStat(CharStats.STAT_AGE,ageYears);
  834.                     int ageCat = stats.ageCategory();
  835.                     if(ageCat < Race.AGE_ANCIENT)
  836.                     {
  837.                         while((stats.ageCategory() == ageCat)
  838.                         ||(stats.ageCategory() < Race.AGE_YOUNGADULT))
  839.                         {
  840.                             stats.setStat(CharStats.STAT_AGE, stats.getStat(CharStats.STAT_AGE)+1);
  841.                             start -= millisPerYear;
  842.                             A.setMiscText(""+start);
  843.                             target.recoverPhyStats();
  844.                             if(target instanceof MOB)
  845.                                 ((MOB)target).recoverCharStats();
  846.                             if(target instanceof MOB)
  847.                                 ((MOB)target).recoverPhyStats();
  848.                         }
  849.                         if(target instanceof MOB)
  850.                             mob.location().show((MOB)target,null,CMMsg.MSG_OK_VISUAL,L("<S-NAME> age(s) a bit."));
  851.                         else
  852.                             mob.location().showHappens(CMMsg.MSG_OK_VISUAL,L("@x1 ages a bit.",target.name()));
  853.                         target.recoverPhyStats();
  854.                         wishDrain(mob,baseLoss,false);
  855.                         return true;
  856.                     }
  857.                 }
  858.                
  859.             }
  860.  
  861.             // temporary stat changes
  862.             if((target instanceof MOB)
  863.             &&((myWish.indexOf(" MORE ")>=0)
  864.             ||(myWish.indexOf(" HIGHER ")>=0)
  865.             ||(myWish.indexOf(" BIGGER ")>=0)
  866.             ||(myWish.indexOf(" TO HAVE ")>=0)))
  867.             {
  868.                 final MOB tm=(MOB)target;
  869.                 if((myWish.indexOf("HIT POINT")>=0)&&(tm.curState().getHitPoints()<tm.maxState().getHitPoints()))
  870.                 {
  871.                     mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 is healthier!",target.name()));
  872.                     tm.curState().setHitPoints(tm.maxState().getHitPoints());
  873.                     wishDrain(mob,baseLoss,false);
  874.                     return true;
  875.                 }
  876.                 else
  877.                 if(myWish.indexOf("HIT POINT")>=0)
  878.                 {
  879.                     mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 is healthier!",target.name()));
  880.                     tm.baseState().setHitPoints(tm.baseState().getHitPoints()+2);
  881.                     tm.recoverMaxState();
  882.                     wishDrain(mob,baseLoss,true);
  883.                     return true;
  884.                 }
  885.                 if((myWish.indexOf("MANA")>=0)&&(tm.curState().getMana()<tm.maxState().getMana()))
  886.                 {
  887.                     mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 has more mana!",target.name()));
  888.                     tm.curState().setMana(tm.maxState().getMana());
  889.                     wishDrain(mob,baseLoss,false);
  890.                     return true;
  891.                 }
  892.                 else
  893.                 if(myWish.indexOf("MANA")>=0)
  894.                 {
  895.                     mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 has more mana!",target.name()));
  896.                     tm.baseState().setMana(tm.baseState().getMana()+2);
  897.                     tm.recoverMaxState();
  898.                     wishDrain(mob,baseLoss,true);
  899.                     return true;
  900.                 }
  901.                 if((myWish.indexOf("MOVE")>=0)&&(tm.curState().getMovement()<tm.maxState().getMovement()))
  902.                 {
  903.                     mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 has more move points!",target.name()));
  904.                     tm.curState().setMovement(tm.maxState().getMovement());
  905.                     wishDrain(mob,baseLoss,false);
  906.                     return true;
  907.                 }
  908.                 else
  909.                 if(myWish.indexOf("MOVE")>=0)
  910.                 {
  911.                     mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 has more move points!",target.name()));
  912.                     tm.baseState().setMovement(tm.baseState().getMovement()+5);
  913.                     tm.recoverMaxState();
  914.                     wishDrain(mob,baseLoss,true);
  915.                     return true;
  916.                 }
  917.  
  918.             }
  919.             if((target instanceof MOB)
  920.             &&(((MOB)target).charStats().getStat(CharStats.STAT_GENDER)!='M')
  921.             &&((myWish.indexOf(" BECOME ")>=0)
  922.             ||(myWish.indexOf(" TURN INTO ")>=0)
  923.             ||(myWish.indexOf(" CHANGE")>=0)
  924.             ||(myWish.indexOf(" BE A")>=0)
  925.             ||(myWish.indexOf(" WAS A")>=0)
  926.             ||(myWish.indexOf(" TRANSFORM")>=0))
  927.             &&((myWish.indexOf(" MALE ")>=0)
  928.             ||(myWish.indexOf(" MAN ")>=0)
  929.             ||(myWish.indexOf(" BOY ")>=0)))
  930.             {
  931.                 wishDrain(mob,baseLoss,true);
  932.                 ((MOB)target).baseCharStats().setStat(CharStats.STAT_GENDER,'M');
  933.                 ((MOB)target).recoverCharStats();
  934.                 mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 is now male!",target.name()));
  935.                 return true;
  936.             }
  937.  
  938.             if((target instanceof MOB)
  939.             &&((myWish.indexOf(" BECOME ")>=0)
  940.             ||(myWish.indexOf(" WAS ")>=0))
  941.             &&((myWish.indexOf(" LIGHTER ")>=0)
  942.             ||(myWish.indexOf(" LOSE WEIGHT ")>=0)))
  943.             {
  944.                 wishDrain(mob,baseLoss,true);
  945.                 int weight=((MOB)target).basePhyStats().weight();
  946.                 weight-=50;
  947.                 if(weight<=0)
  948.                     weight=1;
  949.                 ((MOB)target).basePhyStats().setWeight(weight);
  950.                 ((MOB)target).recoverPhyStats();
  951.                 mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 is now lighter!",target.name()));
  952.                 return true;
  953.             }
  954.             if((target instanceof MOB)
  955.             &&((myWish.indexOf(" BECOME ")>=0)
  956.             ||(myWish.indexOf(" WAS ")>=0))
  957.             &&((myWish.indexOf(" HEAVIER ")>=0)
  958.             ||(myWish.indexOf(" GAIN WEIGHT ")>=0)))
  959.             {
  960.                 wishDrain(mob,baseLoss,true);
  961.                 int weight=((MOB)target).basePhyStats().weight();
  962.                 weight+=50;
  963.                 ((MOB)target).basePhyStats().setWeight(weight);
  964.                 ((MOB)target).recoverPhyStats();
  965.                 mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 is now heavier!",target.name()));
  966.                 return true;
  967.             }
  968.             if((target instanceof MOB)
  969.             &&((myWish.indexOf(" EXP ")>=0)
  970.             ||(myWish.indexOf(" EXPERIENCE ")>=0)))
  971.             {
  972.                 int x=myWish.indexOf(" EXP");
  973.                 final String wsh=myWish.substring(0,x).trim();
  974.                 x=wsh.lastIndexOf(' ');
  975.                 int amount=25;
  976.                 if((x>=0)&&(CMath.isNumber(wsh.substring(x).trim())))
  977.                     amount=CMath.s_int(wsh.substring(x).trim());
  978.                 if((amount*4)>mob.getExperience())
  979.                     amount=mob.getExperience()/4;
  980.  
  981.                 CMLib.leveler().postExperience(mob,null,null,-(amount*4),false);
  982.                 mob.tell(L("Your wish has drained you of @x1 experience points.",""+(amount*4)));
  983.                 CMLib.leveler().postExperience((MOB)target,null,null,amount,false);
  984.                 mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 gains experience!",target.name()));
  985.                 return true;
  986.             }
  987.  
  988.             if((target!=null)
  989.             &&((myWish.indexOf(" LOWER ")>=0)
  990.                 ||(myWish.indexOf(" LOSE ")>=0)
  991.                 ||(myWish.indexOf(" GAIN ")>=0)
  992.                 ||(myWish.indexOf(" HIGHER ")>=0)
  993.                 ||(myWish.indexOf(" WAS ")>=0)
  994.                 ||(myWish.indexOf(" WOULD BE ")>=0)
  995.                 ||(myWish.indexOf(" WOULD BECOME ")>=0)
  996.                 ||(myWish.indexOf(" BECAME ")>=0))
  997.             &&((myWish.indexOf(" LEVEL ")>=0)
  998.                 ||(myWish.indexOf(" LEVELS ")>=0))
  999.             &&(!CMSecurity.isDisabled(CMSecurity.DisFlag.LEVELS)))
  1000.             {
  1001.                 int level=0;
  1002.                 if(myWish.indexOf(" LOWER ")>=0)
  1003.                     level=-1;
  1004.                 else
  1005.                 if(myWish.indexOf(" HIGHER" )>=0)
  1006.                     level=1;
  1007.                 else
  1008.                 if(myWish.indexOf(" GAIN ")>=0)
  1009.                 {
  1010.                     level=1;
  1011.                     final List<String> V=CMParms.parse(myWish);
  1012.                     for(int i2=1;i2<V.size();i2++)
  1013.                     {
  1014.                         if(V.get(i2).equalsIgnoreCase("LEVELS"))
  1015.                         {
  1016.                             final String s=V.get(i2-1);
  1017.                             if(CMath.isNumber(s)
  1018.                             &&((CMath.s_int(s)!=0)||(s.equalsIgnoreCase("0"))))
  1019.                             {
  1020.                                 level=CMath.s_int(s);
  1021.                                 break;
  1022.                             }
  1023.                         }
  1024.                     }
  1025.                 }
  1026.                 else
  1027.                 if(myWish.indexOf(" LOSE" )>=0)
  1028.                 {
  1029.                     level=-1;
  1030.                     final List<String> V=CMParms.parse(myWish);
  1031.                     for(int i2=1;i2<V.size();i2++)
  1032.                     {
  1033.                         if(V.get(i2).equalsIgnoreCase("LEVELS"))
  1034.                         {
  1035.                             final String s=V.get(i2);
  1036.                             if(CMath.isNumber(s)
  1037.                             &&((CMath.s_int(s)!=0)||(s.equalsIgnoreCase("0"))))
  1038.                             {
  1039.                                 level=-CMath.s_int(s);
  1040.                                 break;
  1041.                             }
  1042.                         }
  1043.                     }
  1044.                 }
  1045.                 else
  1046.                 {
  1047.                     final List<String> V=CMParms.parse(myWish);
  1048.                     for(int i2=0;i2<V.size()-1;i2++)
  1049.                     {
  1050.                         if(V.get(i2).equalsIgnoreCase("LEVEL"))
  1051.                         {
  1052.                             final String s=V.get(i2+1);
  1053.                             if(CMath.isNumber(s)
  1054.                             &&((CMath.s_int(s)!=0)||(s.equalsIgnoreCase("0"))))
  1055.                             {
  1056.                                 level=CMath.s_int(s)-target.basePhyStats().level();
  1057.                                 break;
  1058.                             }
  1059.                         }
  1060.                     }
  1061.                 }
  1062.                 if(level!=0)
  1063.                 {
  1064.                     int levelsLost=level;
  1065.                     if(levelsLost<0)
  1066.                         levelsLost=levelsLost*-1;
  1067.                     int levelsGained=levelsLost;
  1068.                     levelsLost*=4;
  1069.                     if(levelsLost>=mob.basePhyStats().level())
  1070.                     {
  1071.                         levelsLost=mob.basePhyStats().level()-1;
  1072.                         levelsGained=levelsLost/4;
  1073.                         if(level>0)
  1074.                             level=levelsGained;
  1075.                         else level=-levelsGained;
  1076.                     }
  1077.                     final int newLevel=target.basePhyStats().level()+level;
  1078.                     if(target instanceof MOB)
  1079.                     {
  1080.                         if(((newLevel>CMProps.getIntVar(CMProps.Int.LASTPLAYERLEVEL))
  1081.                             ||(((MOB)target).charStats().getCurrentClass().leveless())
  1082.                             ||(((MOB)target).charStats().isLevelCapped(((MOB)target).charStats().getCurrentClass()))
  1083.                             ||(((MOB)target).charStats().getMyRace().leveless()))
  1084.                         &&(newLevel>target.basePhyStats().level()))
  1085.                         {
  1086.                             wishDrain(mob,baseLoss,false);
  1087.                             mob.tell(L("That's beyond your power, but you lost exp even for trying."));
  1088.                             return false;
  1089.                         }
  1090.                     }
  1091.  
  1092.                     if(target instanceof MOB)
  1093.                     {
  1094.                         final MOB MT=(MOB)target;
  1095.                         if(level>0)
  1096.                         {
  1097.                             for(int i2=0;i2<levelsGained;i2++)
  1098.                             {
  1099.                                 CMLib.leveler().level(MT);
  1100.                                 MT.recoverPhyStats();
  1101.                                 MT.setExperience(CMLib.leveler().getLevelExperience(MT.basePhyStats().level()-1));
  1102.                             }
  1103.                         }
  1104.                         else
  1105.                         {
  1106.                             while(MT.basePhyStats().level()>newLevel)
  1107.                             {
  1108.                                 CMLib.leveler().unLevel(MT);
  1109.                                 MT.setExperience(CMLib.leveler().getLevelExperience(MT.basePhyStats().level()-1));
  1110.                                 MT.recoverPhyStats();
  1111.                             }
  1112.                         }
  1113.                     }
  1114.                     else
  1115.                     {
  1116.                         target.basePhyStats().setLevel(newLevel);
  1117.                         target.recoverPhyStats();
  1118.                     }
  1119.                     wishDrain(mob,baseLoss*levelsLost,true);
  1120.                     if((mob!=target)||(level>0))
  1121.                     {
  1122.                         msg.source().tell(L("Your wish also causes you to lose @x1 levels.",""+levelsLost));
  1123.                         for(int i2=0;i2<levelsLost;i2++)
  1124.                         {
  1125.                             CMLib.leveler().unLevel(mob);
  1126.                             mob.setExperience(CMLib.leveler().getLevelExperience(mob.basePhyStats().level()-1));
  1127.                         }
  1128.                     }
  1129.                     mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 is now level @x2!",target.name(),""+target.phyStats().level()));
  1130.                 }
  1131.                 return true;
  1132.             }
  1133.  
  1134.             if((target instanceof MOB)
  1135.             &&((myWish.indexOf(" BECOME ")>=0)
  1136.             ||(myWish.indexOf(" WAS ")>=0))
  1137.             &&((myWish.indexOf(" SMALL ")>=0)
  1138.             ||(myWish.indexOf(" SHORT ")>=0)
  1139.             ||(myWish.indexOf(" LITTLE ")>=0)))
  1140.             {
  1141.                 wishDrain(mob,baseLoss,true);
  1142.                 int weight=((MOB)target).basePhyStats().height();
  1143.                 weight-=12;
  1144.                 if(weight<=0)
  1145.                     weight=5;
  1146.                 ((MOB)target).basePhyStats().setHeight(weight);
  1147.                 ((MOB)target).recoverPhyStats();
  1148.                 mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 is now shorter!",target.name()));
  1149.                 return true;
  1150.             }
  1151.             if((target instanceof MOB)
  1152.             &&((myWish.indexOf(" BECOME ")>=0)
  1153.             ||(myWish.indexOf(" WAS ")>=0))
  1154.             &&((myWish.indexOf(" LARGE ")>=0)
  1155.             ||(myWish.indexOf(" BIG ")>=0)
  1156.             ||(myWish.indexOf(" TALL ")>=0)))
  1157.             {
  1158.                 wishDrain(mob,baseLoss,true);
  1159.                 int weight=((MOB)target).basePhyStats().height();
  1160.                 weight+=12;
  1161.                 ((MOB)target).basePhyStats().setHeight(weight);
  1162.                 ((MOB)target).recoverPhyStats();
  1163.                 mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 is now taller!",target.name()));
  1164.                 return true;
  1165.             }
  1166.  
  1167.             if((target instanceof MOB)
  1168.             &&(((MOB)target).charStats().getStat(CharStats.STAT_GENDER)!='F')
  1169.             &&((myWish.indexOf(" BECOME ")>=0)
  1170.             ||(myWish.indexOf(" TURN INTO ")>=0)
  1171.             ||(myWish.indexOf(" CHANGE")>=0)
  1172.             ||(myWish.indexOf(" BE A")>=0)
  1173.             ||(myWish.indexOf(" WAS A")>=0)
  1174.             ||(myWish.indexOf(" TRANSFORM")>=0))
  1175.             &&((myWish.indexOf(" FEMALE ")>=0)
  1176.             ||(myWish.indexOf(" WOMAN ")>=0)
  1177.             ||(myWish.indexOf(" GIRL ")>=0)))
  1178.             {
  1179.                 wishDrain(mob,baseLoss,true);
  1180.                 ((MOB)target).baseCharStats().setStat(CharStats.STAT_GENDER,'F');
  1181.                 ((MOB)target).recoverCharStats();
  1182.                 mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 is now female!",target.name()));
  1183.                 return true;
  1184.             }
  1185.  
  1186.             // change race
  1187.             if((target instanceof MOB)
  1188.             &&((myWish.indexOf(" BECOME ")>=0)
  1189.             ||(myWish.indexOf(" TURN INTO ")>=0)
  1190.             ||(myWish.indexOf(" CHANGE")>=0)
  1191.             ||(myWish.indexOf(" BE A")>=0)
  1192.             ||(myWish.indexOf(" WAS A")>=0)
  1193.             ||(myWish.indexOf(" TRANSFORM")>=0)))
  1194.             {
  1195.                 final Race R=CMClass.findRace(wishV.get(wishV.size()-1));
  1196.                 if((R!=null)
  1197.                 && (CMath.bset(R.availabilityCode(),Area.THEME_FANTASY))
  1198.                 &&(!R.ID().equalsIgnoreCase("StdRace"))
  1199.                 &&(!R.ID().equalsIgnoreCase("Unique")))
  1200.                 {
  1201.                     if(!((MOB)target).isMonster())
  1202.                     {
  1203.                         baseLoss+=500;
  1204.                         CMLib.leveler().unLevel(mob);
  1205.                         mob.setExperience(CMLib.leveler().getLevelExperience(mob.basePhyStats().level()-1));
  1206.                     }
  1207.                     wishDrain(mob,baseLoss,true);
  1208.                     if(!((MOB)target).isMonster())
  1209.                         msg.source().tell(L("Your wish also causes you lose a level."));
  1210.                     final int oldCat=((MOB)target).baseCharStats().ageCategory();
  1211.                     ((MOB)target).baseCharStats().setMyRace(R);
  1212.                     ((MOB)target).baseCharStats().getMyRace().startRacing(((MOB)target),true);
  1213.                     ((MOB)target).baseCharStats().getMyRace().setHeightWeight(((MOB)target).basePhyStats(),(char)((MOB)target).baseCharStats().getStat(CharStats.STAT_GENDER));
  1214.                     ((MOB)target).recoverCharStats();
  1215.                     ((MOB)target).recoverPhyStats();
  1216.                     CMLib.utensils().confirmWearability((MOB)target);
  1217.                     if(!((MOB)target).isMonster())
  1218.                         ((MOB)target).baseCharStats().setStat(CharStats.STAT_AGE,R.getAgingChart()[oldCat]);
  1219.                     mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 is now a @x2!",target.name(),R.name()));
  1220.                     return true;
  1221.                 }
  1222.             }
  1223.  
  1224.             // change class
  1225.             if((target instanceof MOB)
  1226.             &&((myWish.indexOf(" BECOME ")>=0)
  1227.             ||(myWish.indexOf(" TURN INTO ")>=0)
  1228.             ||(myWish.indexOf(" CHANGE")>=0)
  1229.             ||(myWish.indexOf(" LEARN TO BE")>=0)
  1230.             ||(myWish.indexOf(" BE A")>=0)
  1231.             ||(myWish.indexOf(" WAS A")>=0)
  1232.             ||(myWish.indexOf(" TRANSFORM")>=0)))
  1233.             {
  1234.                 final CharClass C=CMClass.findCharClass(wishV.get(wishV.size()-1));
  1235.                 if((C!=null)&&(CMath.bset(C.availabilityCode(),Area.THEME_FANTASY)))
  1236.                 {
  1237.                     final CharClass oldC=mob.baseCharStats().getCurrentClass();
  1238.                     baseLoss+=1000;
  1239.                     wishDrain(mob,baseLoss,true);
  1240.                     msg.source().tell(L("Your wish also causes you lose 3 levels."));
  1241.                     CMLib.leveler().unLevel(mob);
  1242.                     CMLib.leveler().unLevel(mob);
  1243.                     CMLib.leveler().unLevel(mob);
  1244.                     mob.setExperience(CMLib.leveler().getLevelExperience(mob.basePhyStats().level()-1));
  1245.                     final StringBuffer str=new StringBuffer("");
  1246.                     for(final int trait: CharStats.CODES.BASECODES())
  1247.                     {
  1248.                         final int newVal=C.maxStatAdjustments()[trait];
  1249.                         final int amountToLose=oldC.maxStatAdjustments()[trait]-newVal;
  1250.                         if((amountToLose>0)&&(mob.baseCharStats().getStat(trait)>amountToLose))
  1251.                         {
  1252.                             mob.baseCharStats().setStat(trait,mob.baseCharStats().getStat(trait)-amountToLose);
  1253.                             str.append(L("\n\rYou lost @x1 points of @x2.",""+amountToLose,CharStats.CODES.DESC(trait).toLowerCase()));
  1254.                         }
  1255.                     }
  1256.                     mob.tell(str.toString()+"\n\r");
  1257.                     ((MOB)target).baseCharStats().setCurrentClass(C);
  1258.                     if((!((MOB)target).isMonster())&&(((MOB)target).soulMate()==null))
  1259.                         CMLib.coffeeTables().bump(target,CoffeeTableRow.STAT_CLASSCHANGE);
  1260.                     ((MOB)target).baseCharStats().getCurrentClass().startCharacter((MOB)target,false,true);
  1261.                     ((MOB)target).recoverCharStats();
  1262.                     ((MOB)target).recoverPhyStats();
  1263.                     mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 is now a @x2!",target.name(),C.name(((MOB)target).baseCharStats().getCurrentClassLevel())));
  1264.                     return true;
  1265.                 }
  1266.             }
  1267.  
  1268.             // gaining new abilities!
  1269.             if(target instanceof MOB)
  1270.             {
  1271.                 int code=-1;
  1272.                 int x = myWish.indexOf(" KNOW ");
  1273.                 if ((x >= 0) && (x + 5 > code))
  1274.                     code = x + 5;
  1275.                 x = myWish.indexOf(" KNEW ");
  1276.                 if ((x >= 0) && (x + 5 > code))
  1277.                     code = x + 5;
  1278.                 x = myWish.indexOf(" LEARN ");
  1279.                 if ((x >= 0) && (x + 6 > code))
  1280.                     code = x + 6;
  1281.                 x = myWish.indexOf(" COULD ");
  1282.                 if ((x >= 0) && (x + 6 > code))
  1283.                     code = x + 6;
  1284.                 x = myWish.indexOf(" GAIN ");
  1285.                 if ((x >= 0) && (x + 5 > code))
  1286.                     code = x + 5;
  1287.                 x = myWish.indexOf(" BE TAUGHT ");
  1288.                 if ((x >= 0) && (x + 10 > code))
  1289.                     code = x + 10;
  1290.                 x = myWish.indexOf(" HOW TO ");
  1291.                 if ((x >= 0) && (x + 7 > code))
  1292.                     code = x + 7;
  1293.                 x = myWish.indexOf(" ABLE TO ");
  1294.                 if ((x >= 0) && (x + 8 > code))
  1295.                     code = x + 8;
  1296.                 x = myWish.indexOf(" CAST ");
  1297.                 if ((x >= 0) && (x + 5 > code))
  1298.                     code = x + 5;
  1299.                 x = myWish.indexOf(" SING ");
  1300.                 if ((x >= 0) && (x + 5 > code))
  1301.                     code = x + 5;
  1302.                 x = myWish.indexOf(" PRAY FOR ");
  1303.                 if ((x >= 0) && (x + 9 > code))
  1304.                     code = x + 9;
  1305.                 if((code>=0)&&(code<myWish.length()))
  1306.                 {
  1307.                     final MOB tm=(MOB)target;
  1308.                     Ability A=CMClass.findAbility(myWish.substring(code).trim());
  1309.                     if((A!=null)
  1310.                     &&(CMLib.ableMapper().lowestQualifyingLevel(A.ID())>0)
  1311.                     &&(!CMath.bset(A.classificationCode(),Ability.DOMAIN_ARCHON)))
  1312.                     {
  1313.                         if(CMLib.ableMapper().lowestQualifyingLevel(A.ID())>=25)
  1314.                         {
  1315.                             baseLoss=getXPCOSTAdjustment(mob,baseLoss);
  1316.                             CMLib.leveler().postExperience(mob,null,null,-baseLoss,false);
  1317.                             mob.tell(L("Your wish has drained you of @x1 experience points, but that is beyond your wishing ability.",""+baseLoss));
  1318.                             return false;
  1319.                         }
  1320.                         if(tm.fetchAbility(A.ID())!=null)
  1321.                         {
  1322.                             baseLoss=getXPCOSTAdjustment(mob,baseLoss);
  1323.                             A=tm.fetchAbility(A.ID());
  1324.                             CMLib.leveler().postExperience(mob,null,null,-baseLoss,false);
  1325.                             mob.tell(L("Your wish has drained you of @x1 experience points.",""+baseLoss));
  1326.                         }
  1327.                         else
  1328.                         {
  1329.                             if(((myWish.indexOf(" CAST ")>=0)
  1330.                                 ||(myWish.indexOf(" PRAY ")>=0)
  1331.                                 ||(myWish.indexOf(" SING ")>=0))
  1332.                             &&(onFlag)
  1333.                             &&(target!=mob)&&(!A.isAutoInvoked()))
  1334.                             {
  1335.                                 A.setProficiency(100);
  1336.                                 A.invoke(mob, target, true, asLevel);
  1337.                                 A=null;
  1338.                             }
  1339.                             else
  1340.                             {
  1341.                                 tm.addAbility(A);
  1342.                                 baseLoss+=500;
  1343.                                 wishDrain(mob,baseLoss,true);
  1344.                                 msg.source().tell(L("Your wish also causes you lose 2 levels."));
  1345.                                 CMLib.leveler().unLevel(mob);
  1346.                                 CMLib.leveler().unLevel(mob);
  1347.                             }
  1348.                             mob.setExperience(CMLib.leveler().getLevelExperience(mob.basePhyStats().level()-1));
  1349.                         }
  1350.                         if(A!=null)
  1351.                         {
  1352.                             A=tm.fetchAbility(A.ID());
  1353.                             A.setProficiency(100);
  1354.                             A.autoInvocation(tm, false);
  1355.                             mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 now knows @x2!",target.name(),A.name()));
  1356.                             final Ability A2=tm.fetchEffect(A.ID());
  1357.                             if(A2!=null)
  1358.                                 A2.setProficiency(100);
  1359.                         }
  1360.                         return true;
  1361.                     }
  1362.                 }
  1363.                 code=-1;
  1364.                 x = myWish.indexOf(" FORGOT ");
  1365.                 if ((x >= 0) && (x + 7 > code))
  1366.                     code = x + 7;
  1367.                 x = myWish.indexOf(" LOST ");
  1368.                 if ((x >= 0) && (x + 5 > code))
  1369.                     code = x + 5;
  1370.                 x = myWish.indexOf(" LOSE ");
  1371.                 if ((x >= 0) && (x + 5 > code))
  1372.                     code = x + 5;
  1373.                 x = myWish.indexOf(" REVOKE ");
  1374.                 if ((x >= 0) && (x + 7 > code))
  1375.                     code = x + 7;
  1376.                 x = myWish.indexOf(" REVOKED ");
  1377.                 if ((x >= 0) && (x + 8 > code))
  1378.                     code = x + 8;
  1379.                 x = myWish.indexOf(" DIDN`T KNOW ");
  1380.                 if ((x >= 0) && (x + 12 > code))
  1381.                     code = x + 12;
  1382.                 x = myWish.indexOf(" DID NOT KNOW ");
  1383.                 if ((x >= 0) && (x + 13 > code))
  1384.                     code = x + 13;
  1385.                 if(code>=0)
  1386.                 {
  1387.                     x = myWish.indexOf(" ABILITY TO ");
  1388.                     if ((x >= 0) && (x + 12 > code))
  1389.                         code = x + 12;
  1390.                     x = myWish.indexOf(" KNOWLEDGE OF ");
  1391.                     if ((x >= 0) && (x + 13 > code))
  1392.                         code = x + 13;
  1393.                     x = myWish.indexOf(" CAST ");
  1394.                     if ((x >= 0) && (x + 5 > code))
  1395.                         code = x + 5;
  1396.                     x = myWish.indexOf(" SING ");
  1397.                     if ((x >= 0) && (x + 5 > code))
  1398.                         code = x + 5;
  1399.                     x = myWish.indexOf(" PRAY FOR ");
  1400.                     if ((x >= 0) && (x + 9 > code))
  1401.                         code = x + 9;
  1402.                 }
  1403.                 if((code>=0)&&(code<myWish.length()))
  1404.                 {
  1405.                     final MOB tm=(MOB)target;
  1406.                     Ability A=CMClass.findAbility(myWish.substring(code).trim());
  1407.                     if((A!=null)
  1408.                     &&(CMLib.ableMapper().lowestQualifyingLevel(A.ID())>0))
  1409.                     {
  1410.                         if(tm.fetchAbility(A.ID())!=null)
  1411.                         {
  1412.                             mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 no longer knows @x2!",target.name(),A.name()));
  1413.                             tm.delAbility(A);
  1414.                         }
  1415.                         else
  1416.                         if(tm.fetchEffect(A.ID())!=null)
  1417.                         {
  1418.                             mob.location().show(mob,null,CMMsg.MSG_OK_VISUAL,L("@x1 is no longer under @x2!",target.name(),A.name()));
  1419.                         }
  1420.                         else
  1421.                         {
  1422.                             A=null;
  1423.                         }
  1424.                         if(A!=null)
  1425.                         {
  1426.                             baseLoss=getXPCOSTAdjustment(mob,baseLoss);
  1427.                             CMLib.leveler().postExperience(mob,null,null,-baseLoss,false);
  1428.                             mob.tell(L("Your wish has drained you of @x1 experience points.",""+baseLoss));
  1429.                             A=tm.fetchEffect(A.ID());
  1430.                             if(A!=null)
  1431.                             {
  1432.                                 A.unInvoke();
  1433.                                 tm.delEffect(A);
  1434.                             }
  1435.                             return true;
  1436.                         }
  1437.                     }
  1438.                 }
  1439.             }
  1440.  
  1441.             // attributes will be hairy
  1442.             int foundAttribute=-1;
  1443.             for(final int attributes : CharStats.CODES.ALLCODES())
  1444.             {
  1445.                 if(CMLib.english().containsString(myWish,CharStats.CODES.DESC(attributes)))
  1446.                 {
  1447.                     foundAttribute = attributes;
  1448.                     break;
  1449.                 }
  1450.             }
  1451.             if(myWish.indexOf("STRONG")>=0)
  1452.                 foundAttribute=CharStats.STAT_STRENGTH;
  1453.             if(myWish.indexOf(" INTELLIGEN")>=0)
  1454.                 foundAttribute=CharStats.STAT_INTELLIGENCE;
  1455.             if(myWish.indexOf(" SMART")>=0)
  1456.                 foundAttribute=CharStats.STAT_INTELLIGENCE;
  1457.             if(myWish.indexOf(" WISE")>=0)
  1458.                 foundAttribute=CharStats.STAT_WISDOM;
  1459.             if(myWish.indexOf(" FAST")>=0)
  1460.                 foundAttribute=CharStats.STAT_DEXTERITY;
  1461.             if(myWish.indexOf(" DEXTROUS")>=0)
  1462.                 foundAttribute=CharStats.STAT_DEXTERITY;
  1463.             if(myWish.indexOf(" HEALTH")>=0)
  1464.                 foundAttribute=CharStats.STAT_CONSTITUTION;
  1465.             if(myWish.indexOf(" PRETTY")>=0)
  1466.                 foundAttribute=CharStats.STAT_CHARISMA;
  1467.             if(myWish.indexOf(" NICE")>=0)
  1468.                 foundAttribute=CharStats.STAT_CHARISMA;
  1469.             if(myWish.indexOf(" PRETTIER")>=0)
  1470.                 foundAttribute=CharStats.STAT_CHARISMA;
  1471.             if((myWish.indexOf("RESIST")>=0)
  1472.             ||(myWish.indexOf("IMMUN")>=0))
  1473.             {
  1474.                 for(final int saveStat : CharStats.CODES.SAVING_THROWS())
  1475.                 {
  1476.                     if(myWish.indexOf(" "+CharStats.CODES.DESC(saveStat))>=0)
  1477.                         foundAttribute=saveStat;
  1478.                 }
  1479.                 if(foundAttribute<0)
  1480.                 {
  1481.                     for(final int saveStat : CharStats.CODES.SAVING_THROWS())
  1482.                     {
  1483.                         if(myWish.indexOf(" "+CharStats.CODES.NAME(saveStat))>=0)
  1484.                             foundAttribute=saveStat;
  1485.                     }
  1486.                 }
  1487.                 if(myWish.indexOf(" PARALY")>=0)
  1488.                     foundAttribute=CharStats.STAT_SAVE_PARALYSIS;
  1489.                 if(myWish.indexOf(" FIRE")>=0)
  1490.                     foundAttribute=CharStats.STAT_SAVE_FIRE;
  1491.                 if(myWish.indexOf(" FLAMES")>=0)
  1492.                     foundAttribute=CharStats.STAT_SAVE_FIRE;
  1493.                 if(myWish.indexOf(" COLD")>=0)
  1494.                     foundAttribute=CharStats.STAT_SAVE_COLD;
  1495.                 if(myWish.indexOf(" FROST")>=0)
  1496.                     foundAttribute=CharStats.STAT_SAVE_COLD;
  1497.                 if(myWish.indexOf(" GAS")>=0)
  1498.                     foundAttribute=CharStats.STAT_SAVE_GAS;
  1499.                 if(myWish.indexOf(" ACID")>=0)
  1500.                     foundAttribute=CharStats.STAT_SAVE_ACID;
  1501.                 if(myWish.indexOf(" SPELL ")>=0)
  1502.                     foundAttribute=CharStats.STAT_SAVE_MAGIC;
  1503.                 if(myWish.indexOf(" TRAPS ")>=0)
  1504.                     foundAttribute=CharStats.STAT_SAVE_TRAPS;
  1505.                 if(myWish.indexOf(" SPELLS ")>=0)
  1506.                     foundAttribute=CharStats.STAT_SAVE_MAGIC;
  1507.                 if(myWish.indexOf(" SONGS")>=0)
  1508.                     foundAttribute=CharStats.STAT_SAVE_MIND;
  1509.                 if(myWish.indexOf(" CHARMS")>=0)
  1510.                     foundAttribute=CharStats.STAT_SAVE_MIND;
  1511.                 if(myWish.indexOf(" ELECTRI")>=0)
  1512.                     foundAttribute=CharStats.STAT_SAVE_ELECTRIC;
  1513.                 if(myWish.indexOf(" POISON")>=0)
  1514.                     foundAttribute=CharStats.STAT_SAVE_POISON;
  1515.                 if(myWish.indexOf(" DEATH")>=0)
  1516.                     foundAttribute=CharStats.STAT_SAVE_UNDEAD;
  1517.                 if(myWish.indexOf(" DISEASE")>=0)
  1518.                     foundAttribute=CharStats.STAT_SAVE_DISEASE;
  1519.                 if(myWish.indexOf(" PLAGUE")>=0)
  1520.                     foundAttribute=CharStats.STAT_SAVE_DISEASE;
  1521.                 if(myWish.indexOf(" COLDS ")>=0)
  1522.                     foundAttribute=CharStats.STAT_SAVE_DISEASE;
  1523.                 if(myWish.indexOf(" SICK")>=0)
  1524.                     foundAttribute=CharStats.STAT_SAVE_DISEASE;
  1525.                 if(myWish.indexOf(" UNDEAD")>=0)
  1526.                     foundAttribute=CharStats.STAT_SAVE_UNDEAD;
  1527.                 if(myWish.indexOf(" EVIL")>=0)
  1528.                     foundAttribute=CharStats.STAT_SAVE_UNDEAD;
  1529.             }
  1530.             if((foundAttribute>=0)
  1531.             &&(target instanceof MOB)
  1532.             &&((myWish.indexOf(" LESS ")>=0)
  1533.             ||(myWish.indexOf(" LOWER ")>=0)
  1534.             ||(myWish.indexOf(" LESS RESIST")>=0)
  1535.             ||(myWish.indexOf(" LESS IMMUN")>=0)
  1536.             ||(myWish.indexOf(" NO RESIST")>=0)
  1537.             ||(myWish.indexOf(" NO IMMUN")>=0)
  1538.             ||(myWish.indexOf(" LOSE ")>=0)))
  1539.             {
  1540.                 if(CharStats.CODES.isBASE(foundAttribute))
  1541.                     baseLoss-=1000;
  1542.                 else
  1543.                     baseLoss-=10;
  1544.                 wishDrain(mob,baseLoss,true);
  1545.                 if(foundAttribute<=6)
  1546.                     ((MOB)target).baseCharStats().setStat(foundAttribute,((MOB)target).baseCharStats().getStat(foundAttribute)-1);
  1547.                 else
  1548.                     ((MOB)target).baseCharStats().setStat(foundAttribute,((MOB)target).baseCharStats().getStat(foundAttribute)-33);
  1549.                 ((MOB)target).recoverCharStats();
  1550.                 mob.recoverCharStats();
  1551.                 mob.location().show(mob,null,CMMsg.MSG_OK_ACTION,L("@x1 has lost @x2.",target.name(),CharStats.CODES.DESC(foundAttribute).toLowerCase()));
  1552.                 return true;
  1553.             }
  1554.  
  1555.             if((foundAttribute>=0)
  1556.             &&(target instanceof MOB)
  1557.             &&((myWish.indexOf(" MORE ")>=0)
  1558.             ||(myWish.indexOf(" HIGHER ")>=0)
  1559.             ||(myWish.indexOf("RESIST")>=0)
  1560.             ||(myWish.indexOf("IMMUN")>=0)
  1561.             ||(myWish.indexOf(" BIGGER ")>=0)
  1562.             ||(myWish.indexOf(" TO HAVE ")>=0)
  1563.             ||(myWish.indexOf(" GAIN ")>=0)
  1564.             ||(myWish.indexOf(" WAS ")>=0)
  1565.             ||(myWish.indexOf(" TO BE ")>=0)))
  1566.             {
  1567.                 switch(foundAttribute)
  1568.                 {
  1569.                 case CharStats.STAT_CHARISMA:
  1570.                 case CharStats.STAT_CONSTITUTION:
  1571.                 case CharStats.STAT_DEXTERITY:
  1572.                 case CharStats.STAT_INTELLIGENCE:
  1573.                 case CharStats.STAT_STRENGTH:
  1574.                 case CharStats.STAT_WISDOM:
  1575.                 {
  1576.                     int trainsRequired=CMLib.login().getTrainingCost(mob, foundAttribute, true);
  1577.                     if(trainsRequired<0)
  1578.                         trainsRequired=-trainsRequired;
  1579.                     if(trainsRequired>100)
  1580.                         trainsRequired=100;
  1581.                     baseLoss+=((CMLib.leveler().getLevelExperienceJustThisLevel(mob.basePhyStats().level())/5)*(1+trainsRequired));
  1582.                     break;
  1583.                 }
  1584.                 default:
  1585.                     baseLoss+=10;
  1586.                     break;
  1587.                 }
  1588.                 wishDrain(mob,baseLoss,true);
  1589.                 if(!CMSecurity.isDisabled(CMSecurity.DisFlag.LEVELS))
  1590.                 {
  1591.                     msg.source().tell(L("Your wish causes you lose a level."));
  1592.                     CMLib.leveler().unLevel(mob);
  1593.                     mob.setExperience(CMLib.leveler().getLevelExperience(mob.basePhyStats().level()-1));
  1594.                 }
  1595.                 if(foundAttribute<=6)
  1596.                     ((MOB)target).baseCharStats().setStat(foundAttribute,((MOB)target).baseCharStats().getStat(foundAttribute)+1);
  1597.                 else
  1598.                     ((MOB)target).baseCharStats().setStat(foundAttribute,((MOB)target).baseCharStats().getStat(foundAttribute)+10);
  1599.                 mob.recoverCharStats();
  1600.                 ((MOB)target).recoverCharStats();
  1601.                 mob.location().show(mob,null,CMMsg.MSG_OK_ACTION,L("@x1 has gained @x2.",target.name(),CharStats.CODES.DESC(foundAttribute).toLowerCase()));
  1602.                 return true;
  1603.             }
  1604.  
  1605.             baseLoss=getXPCOSTAdjustment(mob,baseLoss);
  1606.             CMLib.leveler().postExperience(mob,null,null,-baseLoss,false);
  1607.             Log.sysOut("Wish",mob.Name()+" unsuccessfully wished for '"+CMParms.combine(commands,0)+"'");
  1608.             mob.tell(L("Your attempted wish has cost you @x1 experience points, but it did not come true.  You might try rewording your wish next time.",""+baseLoss));
  1609.             return false;
  1610.         }
  1611.         return success;
  1612.     }
  1613. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top