package com.planet_ink.coffee_mud.Exits; 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.Basic.GenContainer; import com.planet_ink.coffee_mud.Items.interfaces.*; import com.planet_ink.coffee_mud.Libraries.interfaces.GenericBuilder; 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 2001-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. */ public class GenExit extends StdExit implements Modifiable { protected String name = "a walkway"; protected String description = "Looks like an ordinary path from here to there."; protected String displayText = ""; protected String closedText = "A barrier blocks the way."; protected String doorName = "door"; protected String closeName = "close"; protected String openName = "open"; protected boolean hasADoor = false; protected boolean doorDefaultsClosed = true; protected boolean hasALock = false; protected boolean doorDefaultsLocked = false; protected boolean isReadable = false; protected int openDelayTicks = 45; protected String keyName = ""; @Override public String ID() { return "GenExit"; } public GenExit() { super(); name="a walkway"; description="An ordinary looking way from here to there."; displayText=""; closedText="a closed exit"; doorName="exit"; openName="open"; closeName="close"; keyName=""; hasADoor=false; isOpen=true; hasALock=false; isLocked=false; doorDefaultsClosed=false; doorDefaultsLocked=false; openDelayTicks=45; } @Override public boolean isGeneric() { return true; } @Override public String text() { return CMLib.coffeeMaker().getPropertiesStr(this,false); } @Override public void setMiscText(final String newText) { CMLib.coffeeMaker().setPropertiesStr(this,newText,false); recoverPhyStats(); isOpen=!doorDefaultsClosed; isLocked=doorDefaultsLocked; } @Override public String Name() { return name; } @Override public void setName(final String newName) { name=newName; } @Override public String displayText() { return displayText; } @Override public void setDisplayText(final String newDisplayText) { displayText=newDisplayText; } @Override public String description() { return description; } @Override public void setDescription(final String newDescription) { description=newDescription; } @Override public boolean hasADoor() { return hasADoor; } @Override public boolean hasALock() { return hasALock; } @Override public boolean defaultsLocked() { return doorDefaultsLocked; } @Override public boolean defaultsClosed() { return doorDefaultsClosed; } @Override public void setDoorsNLocks(final boolean newHasADoor, final boolean newIsOpen, final boolean newDefaultsClosed, final boolean newHasALock, final boolean newIsLocked, final boolean newDefaultsLocked) { isOpen=newIsOpen; isLocked=newIsLocked; hasADoor=newHasADoor; hasALock=newHasALock; doorDefaultsClosed=newDefaultsClosed; doorDefaultsLocked=newDefaultsLocked; } @Override public boolean isReadable() { return isReadable; } @Override public String doorName() { return doorName; } @Override public String closeWord() { return closeName; } @Override public String openWord() { return openName; } @Override public String closedText() { return closedText; } @Override public void setExitParams(final String newDoorName, final String newCloseWord, final String newOpenWord, final String newClosedText) { doorName=newDoorName; closeName=newCloseWord; openName=newOpenWord; closedText=newClosedText; } @Override public String readableText() { return (isReadable?keyName:""); } @Override public void setReadable(final boolean isTrue) { isReadable=isTrue; } @Override public void setReadableText(final String text) { keyName=temporaryDoorLink()+text; } @Override public String keyName() { return keyName; } @Override public void setKeyName(final String newKeyName) { keyName=temporaryDoorLink()+newKeyName; } @Override public int openDelayTicks() { return openDelayTicks; } @Override public void setOpenDelayTicks(final int numTicks) { openDelayTicks=numTicks; } @Override public String temporaryDoorLink() { if(keyName.startsWith("{#")) { final int x=keyName.indexOf("#}"); if(x>=0) return keyName.substring(2,x); } return ""; } @Override public void setTemporaryDoorLink(final String link) { if(link.startsWith("{{#")) { super.setTemporaryDoorLink(link); return; } if(keyName.startsWith("{#")) { final int x=keyName.indexOf("#}"); if(x>=0) keyName=keyName.substring(x+2); } if(link.length()>0) keyName="{#"+link+"#}"+keyName; } @Override public int getSaveStatIndex() { return getStatCodes().length; } private static final String[] CODES={ "CLASS", "NAME", "DISPLAY", "DESCRIPTION", "DOOR", "LEVEL", "ABILITY", "ISREADABLE", "AFFBEHAV", "DISPOSITION", "READABLETEXT", "HASADOOR", "DEFCLOSED", "HASALOCK", "DEFLOCKED", "KEYNAME", "RESETTIME","CLOSEWORD","OPENWORD","CLOSEDTEXT" }; @Override public String[] getStatCodes() { return CODES; } @Override public boolean isStat(final String code) { return CMParms.indexOf(getStatCodes(),code.toUpperCase().trim())>=0; } @Override protected int getCodeNum(final String code) { for(int i=0;i<CODES.length;i++) { if(code.equalsIgnoreCase(CODES[i])) return i; } return -1; } @Override public String getStat(final String code) { switch(getCodeNum(code)) { case 0: return ID(); // class case 1: return name(); // name case 2: return displayText(); // display case 3: return description(); // description case 4: return doorName(); // door case 5: return "" + basePhyStats().level(); // level case 6: return "" + basePhyStats().ability(); // ability case 7: return "" + isReadable(); // isreadable case 8: return CMLib.coffeeMaker().getExtraEnvPropertiesStr(this); // affbehav case 9: return "" + basePhyStats().disposition(); // disposition case 10: return "" + readableText(); // readabletext case 11: return "" + hasADoor(); // hasadoor case 12: return "" + defaultsClosed(); // defclosed case 13: return "" + hasALock(); // hasalock case 14: return "" + defaultsLocked(); // deflocked case 15: return "" + keyName(); // keyname case 16: return "" + openDelayTicks(); // open ticks case 17: return this.closeWord(); case 18: return this.openWord(); case 19: return this.closedText(); } return ""; } @Override public void setStat(final String code, String val) { switch(getCodeNum(code)) { case 0: return; case 1: setName(val); break; // name case 2: setDisplayText(val); break; // display case 3: setDescription(val); break; // description case 4: doorName = val; break; // door case 5: basePhyStats().setLevel(CMath.parseIntExpression(val)); break; // level case 6: basePhyStats().setAbility(CMath.parseIntExpression(val)); break; // ability case 7: setReadable(CMath.s_bool(val)); break; // isreadable case 8: { // affbehav delAllEffects(true); delAllBehaviors(); CMLib.coffeeMaker().setExtraEnvProperties(this, CMLib.xml().parseAllXML(val)); // affbehav break; } // affbehav case 9: { // disposition if (CMath.isInteger(val) || (val.trim().length() == 0)) basePhyStats().setDisposition(CMath.s_parseIntExpression(val)); // disposition else { basePhyStats().setDisposition(0); final List<String> V = CMParms.parseCommas(val, true); for (final Iterator<String> e = V.iterator(); e.hasNext();) { val = e.next(); final int dispIndex = CMParms.indexOfIgnoreCase(PhyStats.IS_CODES, val); if (dispIndex >= 0) basePhyStats().setDisposition(basePhyStats().disposition() | (int) CMath.pow(2, dispIndex)); } } break; } // disposition case 10: setReadableText(val); break; // readabletext case 11: hasADoor = CMath.s_bool(val); break; // hasadoor case 12: doorDefaultsClosed = CMath.s_bool(val); break; // defclosed case 13: hasALock = CMath.s_bool(val); break; // hasalock case 14: doorDefaultsLocked = CMath.s_bool(val); break; // deflocked case 15: setKeyName(val); break; // keyname case 16: setOpenDelayTicks(CMath.s_parseIntExpression(val)); break; // openticks case 17: this.closeName = val; break; case 18: this.openName = val; break; case 19: this.closedText = val; break; } } @Override public boolean sameAs(final Environmental E) { if(!(E instanceof GenExit)) return false; final String[] codes=getStatCodes(); for(int i=0;i<codes.length;i++) { if(!E.getStat(codes[i]).equals(getStat(codes[i]))) return false; } return true; } }