package com.planet_ink.coffee_mud.Items.Basic;
import com.planet_ink.coffee_mud.core.interfaces.*;
import com.planet_ink.coffee_mud.core.*;
import com.planet_ink.coffee_mud.core.collections.*;
import com.planet_ink.coffee_mud.Abilities.interfaces.*;
import com.planet_ink.coffee_mud.Areas.interfaces.*;
import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
import com.planet_ink.coffee_mud.Commands.interfaces.*;
import com.planet_ink.coffee_mud.Common.interfaces.*;
import com.planet_ink.coffee_mud.Exits.interfaces.*;
import com.planet_ink.coffee_mud.Items.interfaces.*;
import com.planet_ink.coffee_mud.Libraries.interfaces.*;
import com.planet_ink.coffee_mud.Locales.interfaces.*;
import com.planet_ink.coffee_mud.MOBS.interfaces.*;
import com.planet_ink.coffee_mud.Races.interfaces.*;
import java.util.*;
/*
Copyright 2004-2019 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.
*/
@SuppressWarnings("unchecked")
public class StdPortal extends StdContainer implements Rideable, Exit
{
protected String doorName = "";
protected String closedText = "";
protected String putString = "";
protected String rideString = "";
protected String stateString = "";
protected String stateSubjectStr = "";
protected String mountString = "";
protected String dismountString = "";
@Override
public String ID()
{
return "StdPortal";
}
public StdPortal()
{
super();
setName("a portal");
setDisplayText("a portal is here.");
setDescription("It's difficult to see where it leads. Try ENTER and find out!");
basePhyStats().setWeight(10000);
recoverPhyStats();
capacity=10000;
material=RawMaterial.RESOURCE_NOTHING;
}
// common item/mob stuff
@Override
public boolean isMobileRideBasis()
{
return false;
}
@Override
public int rideBasis()
{
return Rideable.RIDEABLE_ENTERIN;
}
@Override
public void setRideBasis(final int basis)
{
}
@Override
public int riderCapacity()
{
return 1;
}
@Override
public void setRiderCapacity(final int newCapacity)
{
}
@Override
public int numRiders()
{
return 0;
}
@Override
public Enumeration<Rider> riders()
{
return EmptyEnumeration.INSTANCE;
}
@Override
public Rider fetchRider(final int which)
{
return null;
}
@Override
public void addRider(final Rider mob)
{
}
@Override
public void delRider(final Rider mob)
{
}
@Override
public void recoverPhyStats()
{
CMLib.flags().setReadable(this, false);
super.recoverPhyStats();
}
@Override
public Set<MOB> getRideBuddies(final Set<MOB> list)
{
return list;
}
@Override
public boolean mobileRideBasis()
{
return false;
}
@Override
public String stateString(final Rider R)
{
if((R==null)||(stateString.length()==0))
return "in";
return stateString;
}
@Override
public String getStateString()
{
return stateString;
}
@Override
public void setStateString(final String str)
{
if((str==null)||(str.trim().length()==0))
stateString="";
else
{
if(str.equalsIgnoreCase(this.stateString(null)))
stateString="";
else
stateString=str.trim();
}
}
@Override
public String putString(final Rider R)
{
if((R==null)||(putString.length()==0))
return "in";
return putString;
}
@Override
public String getPutString()
{
return putString;
}
@Override
public void setPutString(final String str)
{
if((str==null)||(str.trim().length()==0))
putString="";
else
{
if(str.equalsIgnoreCase(this.putString(null)))
putString="";
else
putString=str.trim();
}
}
@Override
public String mountString(final int commandType, final Rider R)
{
if((R==null)||(mountString.length()==0))
return "enter(s)";
return mountString;
}
@Override
public String getMountString()
{
return mountString;
}
@Override
public void setMountString(final String str)
{
if((str==null)||(str.trim().length()==0))
mountString="";
else
{
if(str.equalsIgnoreCase(this.mountString(0,null)))
mountString="";
else
mountString=str.trim();
}
}
@Override
public String dismountString(final Rider R)
{
if((R==null)||(dismountString.length()==0))
return "emerge(s) from";
return dismountString;
}
@Override
public String getDismountString()
{
return dismountString;
}
@Override
public void setDismountString(final String str)
{
if((str==null)||(str.trim().length()==0))
dismountString="";
else
{
if(str.equalsIgnoreCase(this.dismountString(null)))
dismountString="";
else
dismountString=str.trim();
}
}
@Override
public String stateStringSubject(final Rider R)
{
if((R==null)||(stateSubjectStr.length()==0))
return "occupied by";
return stateSubjectStr;
}
@Override
public String getStateStringSubject()
{
return stateSubjectStr;
}
@Override
public void setStateStringSubject(final String str)
{
if((str==null)||(str.trim().length()==0))
this.stateSubjectStr="";
else
{
if(str.equalsIgnoreCase(this.stateStringSubject(null)))
stateSubjectStr="";
else
stateSubjectStr=str.trim();
}
}
@Override
public String rideString(final Rider R)
{
if((R==null)||(rideString.length()==0))
return "enter(s)";
return rideString;
}
@Override
public String getRideString()
{
return rideString;
}
@Override
public void setRideString(final String str)
{
if((str==null)||(str.trim().length()==0))
rideString="";
else
{
if(str.equalsIgnoreCase(this.rideString(null)))
rideString="";
else
rideString=str.trim();
}
}
@Override
public short exitUsage(final short change)
{
return 0;
}
@Override
public String displayText()
{
return displayText;
}
@Override
public boolean amRiding(final Rider mob)
{
return false;
}
@Override
public boolean okMessage(final Environmental myHost, final CMMsg msg)
{
if(!super.okMessage(myHost,msg))
return false;
switch(msg.targetMinor())
{
case CMMsg.TYP_DISMOUNT:
if(msg.amITarget(this))
{
// protects from standard item rejection
return true;
}
break;
case CMMsg.TYP_SIT:
if(msg.amITarget(this))
{
if(msg.sourceMessage().indexOf(mountString(CMMsg.TYP_SIT,msg.source()))>0)
{
if(getDestinationRoom(msg.source().location())==null)
{
msg.source().tell(L("This portal is broken.. nowhere to go!"));
return false;
}
if(hasADoor()&&(!isOpen()))
{
msg.source().tell(L("@x1 is closed.",name()));
return false;
}
msg.modify(msg.source(),msg.target(),msg.tool(),
msg.sourceMajor()|CMMsg.TYP_ENTER,msg.sourceMessage(),
msg.targetMajor()|CMMsg.TYP_ENTER,msg.targetMessage(),
msg.othersMajor()|CMMsg.TYP_ENTER,null);
return true;
}
msg.source().tell(L("You cannot sit on @x1.",name()));
return false;
}
break;
case CMMsg.TYP_SLEEP:
if(msg.amITarget(this))
{
msg.source().tell(L("You cannot sleep on @x1.",name()));
return false;
}
break;
case CMMsg.TYP_MOUNT:
if(msg.amITarget(this))
{
msg.source().tell(L("You cannot mount @x1, try Enter.",name()));
return false;
}
break;
}
return true;
}
protected Room getDestinationRoom(final Room fromRoom)
{
Room R=null;
final List<String> V=CMParms.parseSemicolons(readableText(),true);
if(V.size()>0)
R=CMLib.map().getRoom(V.get(CMLib.dice().roll(1,V.size(),-1)));
return R;
}
@Override
public Room lastRoomUsedFrom(final Room fromRoom)
{
return getDestinationRoom(fromRoom);
}
@Override
public void executeMsg(final Environmental myHost, final CMMsg msg)
{
super.executeMsg(myHost,msg);
switch(msg.targetMinor())
{
case CMMsg.TYP_DISMOUNT:
break;
case CMMsg.TYP_ENTER:
if(msg.amITarget(this))
{
if(msg.sourceMessage().indexOf(mountString(CMMsg.TYP_SIT,msg.source()))>0)
{
final Room thisRoom=msg.source().location();
Room R=getDestinationRoom(thisRoom);
if(R==null)
R=thisRoom;
final Exit E2=CMClass.getExit("OpenPrepositional");
final Exit E=CMClass.getExit("OpenPrepositional");
try
{
synchronized(("GATE_"+CMLib.map().getExtendedTwinRoomIDs(thisRoom,R)).intern())
{
E.setMiscText(name());
E2.setMiscText(name());
final Exit oldE=thisRoom.getRawExit(Directions.GATE);
final Room oldR=thisRoom.rawDoors()[Directions.GATE];
final Exit oldE2=R.getRawExit(Directions.GATE);
thisRoom.rawDoors()[Directions.GATE]=R;
thisRoom.setRawExit(Directions.GATE,E);
E2.basePhyStats().setDisposition(PhyStats.IS_NOT_SEEN);
R.setRawExit(Directions.GATE,E2);
CMLib.tracking().walk(msg.source(),Directions.GATE,false,false,false);
thisRoom.rawDoors()[Directions.GATE]=oldR;
thisRoom.setRawExit(Directions.GATE,oldE);
R.setRawExit(Directions.GATE,oldE2);
}
}
finally
{
E.destroy();
E2.destroy();
}
msg.setTarget(null);
}
}
break;
case CMMsg.TYP_LEAVE:
case CMMsg.TYP_FLEE:
case CMMsg.TYP_SLEEP:
case CMMsg.TYP_MOUNT:
case CMMsg.TYP_SIT:
break;
}
}
@Override
public boolean hasADoor()
{
return super.hasADoor();
}
@Override
public boolean defaultsLocked()
{
return super.hasALock();
}
@Override
public boolean defaultsClosed()
{
return super.hasADoor();
}
@Override
public void setDoorsNLocks(final boolean hasADoor, final boolean isOpen, final boolean defaultsClosed, final boolean hasALock, final boolean isLocked, final boolean defaultsLocked)
{
super.setDoorsNLocks(hasADoor, isOpen, defaultsClosed, hasALock, isLocked, defaultsLocked);
}
@Override
public boolean isReadable()
{
return false;
}
@Override
public void setReadable(final boolean isTrue)
{
}
private static final StringBuilder empty=new StringBuilder("");
@Override
public StringBuilder viewableText(final MOB mob, final Room myRoom)
{
Room room=this.getDestinationRoom(myRoom);
if(room == null)
room = myRoom;
if(room==null)
return empty;
final StringBuilder Say=new StringBuilder("");
if(mob.isAttributeSet(MOB.Attrib.SYSOPMSGS))
{
Say.append("^H("+CMLib.map().getExtendedRoomID(room)+")^? "+room.displayText(mob)+CMLib.flags().getDispositionBlurbs(room,mob)+" ");
Say.append("via ^H("+ID()+")^? "+(isOpen()?name():closedText()));
}
else
if(( CMLib.flags().canBeSeenBy(this,mob)|| (isOpen()&&hasADoor()))
&&(CMLib.flags().isSeeable(this)))
{
if(isOpen())
{
if(!CMLib.flags().canBeSeenBy(room,mob))
Say.append("darkness");
else
Say.append(name()+CMLib.flags().getDispositionBlurbs(this,mob));
}
else
if((CMLib.flags().canBeSeenBy(this,mob))&&(closedText().trim().length()>0))
Say.append(closedText()+CMLib.flags().getDispositionBlurbs(this,mob));
}
return Say;
}
@Override
public String doorName()
{
return doorName;
}
@Override
public String closedText()
{
return closedText;
}
@Override
public String closeWord()
{
return "close";
}
@Override
public String openWord()
{
return "open";
}
@Override
public void setExitParams(final String newDoorName,
final String newCloseWord,
final String newOpenWord,
final String newClosedText)
{
doorName=newDoorName;
closedText=newClosedText;
}
@Override
public int openDelayTicks()
{
return 0;
}
@Override
public void setOpenDelayTicks(final int numTicks)
{
}
@Override
public String temporaryDoorLink()
{
return "";
}
@Override
public void setTemporaryDoorLink(final String link)
{
}
}