package com.planet_ink.coffee_mud.Common;
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.CatalogLibrary;
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.*;
// requires nothing to load
/*
Copyright 2005-2016 Bo Zimmerman
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 DefaultSocial implements Social
{
protected String Social_name;
protected String You_see;
protected String Third_party_sees;
protected String Target_sees;
protected String See_when_no_target;
private String MSPfile = "";
protected int sourceCode = CMMsg.MSG_OK_ACTION;
protected int othersCode = CMMsg.MSG_OK_ACTION;
protected int targetCode = CMMsg.MSG_OK_ACTION;
@Override
public String ID()
{
return "DefaultSocial";
}
@Override
public String name()
{
return Social_name;
}
@Override
public String Name()
{
return name();
}
@Override
public String baseName()
{
final int x = name().indexOf(' ');
if (x < 0)
return name();
return name().substring(0, x);
}
@Override
public String L(final String str, final String... xs)
{
return CMLib.lang().fullSessionTranslation(str, xs);
}
@Override
public void setName(String newName)
{
Social_name = newName;
}
@Override
public String You_see()
{
return You_see;
}
@Override
public String Third_party_sees()
{
return Third_party_sees;
}
@Override
public String Target_sees()
{
return Target_sees;
}
@Override
public String See_when_no_target()
{
return See_when_no_target;
}
@Override
public int sourceCode()
{
return sourceCode;
}
@Override
public int othersCode()
{
return othersCode;
}
@Override
public int targetCode()
{
return targetCode;
}
@Override
public void setYou_see(String str)
{
You_see = str;
}
@Override
public void setThird_party_sees(String str)
{
Third_party_sees = str;
}
@Override
public void setTarget_sees(String str)
{
Target_sees = str;
}
@Override
public void setSee_when_no_target(String str)
{
See_when_no_target = str;
}
@Override
public void setSourceCode(int code)
{
sourceCode = code;
}
@Override
public void setOthersCode(int code)
{
othersCode = code;
}
@Override
public void setTargetCode(int code)
{
targetCode = code;
}
@Override
public int getTickStatus()
{
return Tickable.STATUS_NOT;
}
@Override
public String MSPfile()
{
return MSPfile;
}
@Override
public void setMSPfile(String newFile)
{
MSPfile = newFile;
}
@Override
public long expirationDate()
{
return 0;
}
@Override
public void setExpirationDate(long time)
{
}
@Override
public boolean targetable(Environmental E)
{
if (E == null)
return name().endsWith("-NAME>");
if (E instanceof MOB)
return name().endsWith(" <T-NAME>");
if ((E instanceof Item) && (((Item) E).container() == null))
{
final Item I = (Item) E;
if (I.owner() instanceof Room)
{
if((I.displayText().length()==0)
&&(!CMLib.flags().isGettable(I))
&&((targetCode==CMMsg.MSG_NOISYMOVEMENT)||(targetCode==CMMsg.MSG_HANDS)))
return false; // added so that touch didn't work on wallpaper
return name().endsWith(" <I-NAME>");
}
if (I.owner() instanceof MOB)
{
if (I.amWearingAt(Wearable.IN_INVENTORY))
return name().endsWith(" <V-NAME>");
else
return name().endsWith(" <E-NAME>");
}
}
return false;
}
@Override
public boolean invoke(MOB mob, List<String> commands, Physical target, boolean auto)
{
if(mob == null)
return false;
final Room R = mob.location();
if(R== null)
return false;
String targetStr = "";
if ((commands.size() > 1)
&& (!commands.get(1).equalsIgnoreCase("SELF"))
&& (!commands.get(1).equalsIgnoreCase("ALL")))
targetStr = commands.get(1);
Physical targetE = target;
if (targetE == null)
{
targetE = R.fetchFromMOBRoomFavorsMOBs(mob, null, targetStr, Wearable.FILTER_ANY);
if ((targetE != null) && (!CMLib.flags().canBeSeenBy(targetE, mob)))
targetE = null;
else
if ((targetE != null) && (!targetable(targetE)))
{
final Social S = CMLib.socials().fetchSocial(baseName(), targetE, true);
if (S != null)
return S.invoke(mob, commands, targetE, auto);
}
}
final String mspFile = ((MSPfile != null) && (MSPfile.length() > 0)) ? CMLib.protocol().msp(MSPfile, 10) : "";
String You_see = You_see();
if ((You_see != null) && (You_see.trim().length() == 0))
You_see = null;
String Third_party_sees = Third_party_sees();
if ((Third_party_sees != null) && (Third_party_sees.trim().length() == 0))
Third_party_sees = null;
String Target_sees = Target_sees();
if ((Target_sees != null) && (Target_sees.trim().length() == 0))
Target_sees = null;
String See_when_no_target = See_when_no_target();
if ((See_when_no_target != null) && (See_when_no_target.trim().length() == 0))
See_when_no_target = null;
if (((targetE == null) && (targetable(null)))
|| ((targetE != null) && (!targetable(targetE))))
{
final CMMsg msg = CMClass.getMsg(mob, null, this,
(auto ? CMMsg.MASK_ALWAYS : 0) | sourceCode(), See_when_no_target,
CMMsg.NO_EFFECT, null,
CMMsg.NO_EFFECT, null);
if (R.okMessage(mob, msg))
R.send(mob, msg);
}
else
if (targetE == null)
{
final CMMsg msg = CMClass.getMsg(mob, null, this,
(auto ? CMMsg.MASK_ALWAYS : 0) | sourceCode(), (You_see == null) ? null : You_see + mspFile,
CMMsg.NO_EFFECT, null,
othersCode(), (Third_party_sees == null) ? null : Third_party_sees + mspFile);
if (R.okMessage(mob, msg))
R.send(mob, msg);
}
else
{
final CMMsg msg = CMClass.getMsg(mob, targetE, this,
(auto ? CMMsg.MASK_ALWAYS : 0) | sourceCode(), (You_see == null) ? null : You_see + mspFile,
targetCode(), (Target_sees == null) ? null : Target_sees + mspFile,
othersCode(), (Third_party_sees == null) ? null : Third_party_sees + mspFile);
if (R.okMessage(mob, msg))
{
R.send(mob, msg);
if (target instanceof MOB)
{
final MOB tmob = (MOB) target;
if ((name().toUpperCase().startsWith("SMILE"))
&& (mob.charStats().getStat(CharStats.STAT_CHARISMA) >= 16)
&& (mob.charStats().getMyRace().ID().equals(tmob.charStats().getMyRace().ID()))
&& (CMLib.dice().rollPercentage() == 1)
&& (mob.charStats().getStat(CharStats.STAT_GENDER) != ('N'))
&& (tmob.charStats().getStat(CharStats.STAT_GENDER) != ('N'))
&& (mob.charStats().getStat(CharStats.STAT_GENDER) != tmob.charStats().getStat(CharStats.STAT_GENDER))
&& (!CMSecurity.isDisabled(CMSecurity.DisFlag.AUTODISEASE)))
{
final Ability A = CMClass.getAbility("Disease_Smiles");
if ((A != null) && (target.fetchEffect(A.ID()) == null))
A.invoke(tmob, tmob, true, 0);
}
}
}
}
return true;
}
@Override
public CMMsg makeChannelMsg(MOB mob, int channelInt, String channelName, List<String> commands, boolean makeTarget)
{
final String channelColor = "^Q";
final String str = makeTarget ? "" : (channelColor + "^<CHANNEL \"" + channelName + "\"^>[" + channelName + "] ");
final String end = makeTarget ? "" : "^</CHANNEL^>^N^.";
return makeMessage(mob, str, end, CMMsg.MASK_CHANNEL, CMMsg.MASK_CHANNEL | (CMMsg.TYP_CHANNEL + channelInt), commands, channelName, makeTarget);
}
@Override
public CMMsg makeMessage(MOB mob, String str, String end, int srcMask, int fullCode, List<String> commands, String I3channelName, boolean makeTarget)
{
String targetStr = "";
if ((commands.size() > 1)
&& (!commands.get(1).equalsIgnoreCase("SELF"))
&& (!commands.get(1).equalsIgnoreCase("ALL")))
targetStr = commands.get(1);
Environmental target = null;
if (targetStr.length() > 0)
{
String targetMud = "";
if (targetStr.indexOf('@') > 0)
targetMud = targetStr.substring(targetStr.indexOf('@') + 1);
else
{
target = CMLib.players().getPlayer(targetStr);
if ((target == null) && (!makeTarget))
{
final MOB possTarget = CMLib.catalog().getCatalogMob(targetStr);
if (possTarget != null)
{
final CatalogLibrary.CataData data = CMLib.catalog().getCatalogData(possTarget);
if (data != null)
target = data.getLiveReference();
}
}
}
if (((target == null) && (makeTarget))
|| ((targetMud.length() > 0)
&& (I3channelName != null)
&& (CMLib.intermud().i3online())
&& (CMLib.intermud().isI3channel(I3channelName))))
{
target = CMClass.getFactoryMOB();
target.setName(targetStr);
((MOB) target).setLocation(CMLib.map().getRandomRoom());
}
else
if ((target != null)
&& (!CMLib.flags().isInTheGame(target, true)))
target = null;
if ((target != null)
&& (target instanceof Physical)
&& (!CMLib.flags().isSeeable((Physical) target)))
target = null;
}
String mspFile = ((MSPfile != null) && (MSPfile.length() > 0)) ? CMLib.protocol().msp(MSPfile, 10) : "";
if (end.length() == 0)
mspFile = "";
int targetCode = fullCode;
int otherCode = fullCode;
int srcCode = srcMask | sourceCode();
String You_see = You_see();
if ((You_see != null)
&& (You_see.trim().length() == 0))
{
You_see = null;
srcCode = CMMsg.NO_EFFECT;
}
else
You_see = str + You_see + end + mspFile;
String Third_party_sees = Third_party_sees();
if ((Third_party_sees != null)
&& (Third_party_sees.trim().length() == 0))
{
Third_party_sees = null;
otherCode = CMMsg.NO_EFFECT;
}
else
Third_party_sees = str + Third_party_sees + end + mspFile;
String Target_sees = Target_sees();
if ((Target_sees != null)
&& (Target_sees.trim().length() == 0))
{
Target_sees = null;
targetCode = CMMsg.NO_EFFECT;
}
else
Target_sees = str + Target_sees + end + mspFile;
String See_when_no_target = See_when_no_target();
if ((See_when_no_target != null)
&& (See_when_no_target.trim().length() == 0))
See_when_no_target = null;
else
See_when_no_target = str + See_when_no_target + end;
CMMsg msg = null;
if (((target == null) && (targetable(null)))
|| ((target != null) && (!targetable(target))))
msg = CMClass.getMsg(mob, null, this, srcCode, See_when_no_target, CMMsg.NO_EFFECT, null, CMMsg.NO_EFFECT, null);
else
if (target == null)
msg = CMClass.getMsg(mob, null, this, srcCode, You_see, CMMsg.NO_EFFECT, null, otherCode, Third_party_sees);
else
msg = CMClass.getMsg(mob, target, this, srcCode, You_see, targetCode, Target_sees, otherCode, Third_party_sees);
return msg;
}
@Override
public String description()
{
return "";
}
@Override
public void setDescription(String str)
{
}
@Override
public String displayText()
{
return "";
}
@Override
public void setDisplayText(String str)
{
}
@Override
public CMObject newInstance()
{
return new DefaultSocial();
}
@Override
public void initializeClass()
{
}
@Override
public int compareTo(CMObject o)
{
return CMClass.classID(this).compareToIgnoreCase(CMClass.classID(o));
}
protected boolean amDestroyed = false;
@Override
public void destroy()
{
amDestroyed = true;
}
@Override
public boolean amDestroyed()
{
return amDestroyed;
}
@Override
public boolean isSavable()
{
return true;
}
@Override
public void setSavable(boolean truefalse)
{
}
@Override
public int getSaveStatIndex()
{
return getStatCodes().length;
}
private static final String[] CODES = { "CLASS", "NAME" };
@Override
public String[] getStatCodes()
{
return CODES;
}
@Override
public boolean isStat(String code)
{
return CMParms.indexOf(getStatCodes(), code.toUpperCase().trim()) >= 0;
}
protected int getCodeNum(String code)
{
for (int i = 0; i < CODES.length; i++)
if (code.equalsIgnoreCase(CODES[i]))
return i;
return -1;
}
@Override
public String getStat(String code)
{
switch (getCodeNum(code))
{
case 0:
return ID();
case 1:
return name();
}
return "";
}
@Override
public void setStat(String code, String val)
{
switch (getCodeNum(code))
{
case 0:
return;
case 1:
setName(val);
break;
}
}
@Override
public boolean sameAs(Environmental E)
{
if (!(E instanceof Social))
return false;
final String name = Social_name.toUpperCase().trim();
if (!(((Social) E).name().toUpperCase().equals(name.trim())))
return false;
if (((You_see == null) != (((Social) E).You_see() == null))
|| ((You_see != null) && (!You_see.equals(((Social) E).You_see()))))
return false;
if (this.sourceCode != ((Social) E).sourceCode())
return false;
if (this.targetCode != ((Social) E).targetCode())
return false;
if (this.othersCode != ((Social) E).othersCode())
return false;
if (((Third_party_sees == null) != (((Social) E).Third_party_sees() == null))
|| ((Third_party_sees != null) && (!Third_party_sees.equals(((Social) E).Third_party_sees()))))
return false;
if (((Target_sees == null) != (((Social) E).Target_sees() == null))
|| ((Target_sees != null) && (!Target_sees.equals(((Social) E).Target_sees()))))
return false;
if (((See_when_no_target == null) != (((Social) E).See_when_no_target() == null))
|| ((See_when_no_target != null) && (!See_when_no_target.equals(((Social) E).See_when_no_target()))))
return false;
if (((MSPfile == null) != (((Social) E).MSPfile() == null))
|| ((MSPfile != null) && (!MSPfile.equals(((Social) E).MSPfile()))))
return false;
return true;
}
protected void cloneFix(Social E)
{
}
@Override
public CMObject copyOf()
{
try
{
final DefaultSocial E = (DefaultSocial) this.clone();
E.cloneFix(this);
return E;
}
catch (final CloneNotSupportedException e)
{
return this.newInstance();
}
}
@Override
public void setMiscText(String newMiscText)
{
}
@Override
public String text()
{
return "";
}
@Override
public String miscTextFormat()
{
return CMParms.FORMAT_UNDEFINED;
}
@Override
public void affectPhyStats(Physical affected, PhyStats affectableStats)
{
}
@Override
public void affectCharStats(MOB affectedMob, CharStats affectableStats)
{
}
@Override
public void affectCharState(MOB affectedMob, CharState affectableMaxState)
{
}
@Override
public void executeMsg(final Environmental myHost, final CMMsg msg)
{
}
@Override
public boolean okMessage(final Environmental myHost, final CMMsg msg)
{
return true;
}
@Override
public boolean tick(Tickable ticking, int tickID)
{
return true;
}
@Override
public int maxRange()
{
return Integer.MAX_VALUE;
}
@Override
public int minRange()
{
return 0;
}
@Override
public String image()
{
return "";
}
@Override
public String rawImage()
{
return "";
}
@Override
public void setImage(String newImage)
{
}
@Override
public boolean isGeneric()
{
return false;
}
@Override
public double actionsCost(final MOB mob, final List<String> cmds)
{
return CMProps.getSocialActionCost(baseName());
}
@Override
public double combatActionsCost(MOB mob, List<String> cmds)
{
return CMProps.getSocialCombatActionCost(baseName());
}
@Override
public double checkedActionsCost(final MOB mob, final List<String> cmds)
{
if (mob != null)
return mob.isInCombat() ? combatActionsCost(mob, cmds) : actionsCost(mob, cmds);
return actionsCost(mob, cmds);
}
}