package com.planet_ink.coffee_mud.Behaviors; 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.TrackingLibrary; import com.planet_ink.coffee_mud.Libraries.interfaces.TrackingLibrary.TrackingFlag; import com.planet_ink.coffee_mud.Libraries.interfaces.TrackingLibrary.TrackingFlags; 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 2014-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 TaxiBehavior extends Concierge { @Override public String ID() { return "TaxiBehavior"; } @Override protected int canImproveCode() { return Behavior.CAN_ITEMS | Behavior.CAN_MOBS; } protected volatile Ability isEnRouter = null; protected Room returnToRoom = null; protected Room destRoom = null; protected MOB riderM = null; protected List<Room> trailTo = null; protected List<Rider> defaultRiders = null; @Override public String accountForYourself() { return "taking you from here to there"; } @Override protected String getGiveMoneyMessage(Environmental observer, Environmental destination, String moneyName) { if(observer instanceof MOB) return L("I can take you to @x1, but you'll need to give me @x2 first.",getDestinationName(destination),moneyName); else if(observer instanceof Container) return L("I can take you to @x1, but you'll need to put @x2 into @x3 first.",getDestinationName(destination),moneyName,observer.name()); else return L("I can take you to @x1, but you'll need to drop @x2 first.",getDestinationName(destination),moneyName); } @Override protected void giveMerchandise(MOB whoM, Room destR, Environmental observer, Room room, TrackingFlags trackingFlags) { MOB fromM=getTalker(observer,room); final ArrayList<Room> set=new ArrayList<Room>(); CMLib.tracking().getRadiantRooms(fromM.location(),set,roomRadiusFlags,null,maxRange,null); trailTo=CMLib.tracking().findBastardTheBestWay(fromM.location(), destR, trackingFlags, maxRange); thingsToSay.addElement(whoM,L("OK, we're now on our way to @x1.",getDestinationName(destR))); this.returnToRoom=fromM.location(); this.isEnRouter=CMClass.getAbility("Prop_Adjuster"); this.isEnRouter.setMiscText("sen+"+PhyStats.CAN_NOT_TRACK); this.destRoom = destR; this.riderM = whoM; if(observer instanceof Affectable) ((Affectable)observer).addNonUninvokableEffect(this.isEnRouter); } @Override protected boolean disableComingsAndGoings() { return (isEnRouter!=null); } @Override protected final MOB getTalker(Environmental o, Room room) { if(o instanceof Rideable) { if(defaultRiders == null) defaultRiders = new XVector<Rider>(((Rideable)o).riders()); } return super.getTalker(o, room); } private void endTheRide(Environmental observer) { if(this.isEnRouter != null) { final Room room=CMLib.map().roomLocation(observer); MOB conciergeM=this.getTalker(observer,room); if(room==this.destRoom) CMLib.commands().postSay(conciergeM,null,L("We're here. Best of luck!."),false,false); else CMLib.commands().postSay(conciergeM,null,L("This is as far as I can go. Best of luck!."),false,false); Rideable rideable = null; if(observer instanceof Rideable) rideable = (Rideable)observer; else if((observer instanceof Rider)&&(((Rider)observer).riding()!=null)) rideable=((Rider)observer).riding(); if((rideable!=null)&&(room!=null)) { MOB mob=this.getTalker(observer, room); for(final Enumeration<Rider> r = rideable.riders(); r.hasMoreElements(); ) { final Rider rider=r.nextElement(); if(!defaultRiders.contains(rider)) { if(rider instanceof MOB) room.show((MOB)rider, rideable, mob, CMMsg.MASK_ALWAYS|CMMsg.MSG_DISMOUNT, L("<S-NAME> @x1 from <T-NAME>.",rideable.dismountString(rider))); else room.show(mob, rideable, rider, CMMsg.MASK_ALWAYS|CMMsg.MSG_DISMOUNT, L("<S-NAME> help(s) <O-NAME> off of <T-NAME>.")); rider.setRiding(null); } } } if(returnToRoom != null) { if(observer instanceof MOB) CMLib.tracking().wanderFromTo((MOB)observer, returnToRoom, false ); else if((observer instanceof Item)&&(room != null)) { room.showHappens(CMMsg.MSG_OK_ACTION, L("@x1 heads off.",observer.name())); returnToRoom.moveItemTo((Item)observer); } } if(isEnRouter != null) { if(isEnRouter.affecting() != null) isEnRouter.affecting().delEffect(isEnRouter); } isEnRouter = null; returnToRoom = null; destRoom = null; trailTo= null; riderM = null; } } @Override public boolean tick(Tickable ticking, int tickID) { if(!super.tick(ticking, tickID)) return false; if((ticking instanceof Environmental) && (isEnRouter != null)) { final Environmental observer=(Environmental)ticking; if((ticking instanceof MOB) && (!super.canFreelyBehaveNormal(ticking))) endTheRide(observer); else { final Room locR=CMLib.map().roomLocation(observer); if(locR==destRoom) endTheRide(observer); else if(locR!=null) { final int nextDirection=CMLib.tracking().trackNextDirectionFromHere(trailTo, locR, true); final Room nextR=locR.getRoomInDir(nextDirection); final Exit nextE=locR.getExitInDir(nextDirection); if((nextR != null) && (nextE != null) && (nextE.isOpen())) { if((trackingFlags.contains(TrackingFlag.OUTDOORONLY))&&((nextR.domainType()&Room.INDOORS)!=0)) endTheRide(observer); else if(observer instanceof MOB) { if(!CMLib.tracking().walk((MOB)observer, nextDirection,false,false)) endTheRide(observer); } else if(observer instanceof Item) { if(!CMLib.tracking().walk((Item)observer, nextDirection)) endTheRide(observer); } } else endTheRide(observer); } else endTheRide(observer); } } return true; } @Override protected void resetDefaults() { super.resetDefaults(); greeting="Need a lift? If so, come aboard."; mountStr=L("Where are you headed?"); isEnRouter = null; returnToRoom = null; destRoom = null; trailTo= null; riderM = null; basePrice=10.0; perRoomPrice=1.0; } @Override public void startBehavior(PhysicalAgent behaving) { super.startBehavior(behaving); if((talkerName.length()==0) && (behaving instanceof Item)) talkerName="the driver"; } @Override protected void resetFlags() { trackingFlags = CMLib.tracking().newFlags().plus(TrackingLibrary.TrackingFlag.NOEMPTYGRIDS); trackingFlags.plus(TrackingFlag.OPENONLY); trackingFlags.plus(TrackingFlag.OUTDOORONLY); roomRadiusFlags = CMLib.tracking().newFlags(); roomRadiusFlags.plus(TrackingFlag.OPENONLY); trackingFlags.plus(TrackingFlag.OUTDOORONLY); } @Override public void setParms(String newParm) { super.setParms(newParm); if(roomRadiusFlags.contains(TrackingFlag.AREAONLY)) trackingFlags.add(TrackingFlag.AREAONLY); } }