package com.planet_ink.coffee_mud.Commands; import com.planet_ink.coffee_mud.core.interfaces.*; import com.planet_ink.coffee_mud.core.*; import com.planet_ink.coffee_mud.Libraries.interfaces.*; 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.Locales.interfaces.*; import com.planet_ink.coffee_mud.MOBS.interfaces.*; import com.planet_ink.coffee_mud.Races.interfaces.*; import java.util.*; /* Copyright 2000-2006 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 Go extends StdCommand { public Go(){} private String[] access={"GO","WALK"}; public String[] getAccessWords(){return access;} public int energyExpenseFactor(){return 1;} public void ridersBehind(Vector riders, Room sourceRoom, Room destRoom, int directionCode, boolean flee) { if(riders!=null) for(int r=0;r<riders.size();r++) { Rider rider=(Rider)riders.elementAt(r); if(rider instanceof MOB) { MOB rMOB=(MOB)rider; if((rMOB.location()==sourceRoom) ||(rMOB.location()==destRoom)) { boolean fallOff=false; if(rMOB.location()==sourceRoom) { if(rMOB.riding()!=null) rMOB.tell(getScr("Movement","youride",rMOB.riding().name(),Directions.getDirectionName(directionCode))); if(!move(rMOB,directionCode,flee,false,true,false)) fallOff=true; } if(fallOff) { if(rMOB.riding()!=null) rMOB.tell(getScr("Movement","youfalloff",rMOB.riding().name())); rMOB.setRiding(null); } } else rMOB.setRiding(null); } else if(rider instanceof Item) { Item rItem=(Item)rider; if((rItem.owner()==sourceRoom) ||(rItem.owner()==destRoom)) destRoom.bringItemHere(rItem,-1,false); else rItem.setRiding(null); } } } public static Vector addRiders(Rider theRider, Rideable riding, Vector riders) { if((riding!=null)&&(riding.mobileRideBasis())) for(int r=0;r<riding.numRiders();r++) { Rider rider=riding.fetchRider(r); if((rider!=null) &&(rider!=theRider) &&(!riders.contains(rider))) { riders.addElement(rider); if(rider instanceof Rideable) addRiders(theRider,(Rideable)rider,riders); } } return riders; } public Vector ridersAhead(Rider theRider, Room sourceRoom, Room destRoom, int directionCode, boolean flee) { Vector riders=new Vector(); Rideable riding=theRider.riding(); Vector rideables=new Vector(); while((riding!=null)&&(riding.mobileRideBasis())) { rideables.addElement(riding); addRiders(theRider,riding,riders); if((riding instanceof Rider)&&((Rider)riding).riding()!=theRider.riding()) riding=((Rider)riding).riding(); else riding=null; } if(theRider instanceof Rideable) addRiders(theRider,(Rideable)theRider,riders); for(int r=riders.size()-1;r>=0;r--) { Rider R=(Rider)riders.elementAt(r); if((R instanceof Rideable)&&(((Rideable)R).numRiders()>0)) { if(!rideables.contains(R)) rideables.addElement(R); riders.removeElement(R); } } for(int r=0;r<rideables.size();r++) { riding=(Rideable)rideables.elementAt(r); if((riding instanceof Item) &&((sourceRoom).isContent((Item)riding))) destRoom.bringItemHere((Item)riding,-1,false); else if((riding instanceof MOB) &&((sourceRoom).isInhabitant((MOB)riding))) { ((MOB)riding).tell(getScr("Movement","youridden",Directions.getDirectionName(directionCode))); if(!move(((MOB)riding),directionCode,false,false,true,false)) { if(theRider instanceof MOB) ((MOB)theRider).tell(getScr("Movement","rideerr1",((MOB)riding).name())); r=r-1; for(;r>=0;r--) { riding=(Rideable)rideables.elementAt(r); if((riding instanceof Item) &&((destRoom).isContent((Item)riding))) sourceRoom.bringItemHere((Item)riding,-1,false); else if((riding instanceof MOB) &&(((MOB)riding).isMonster()) &&((destRoom).isInhabitant((MOB)riding))) sourceRoom.bringMobHere((MOB)riding,false); } return null; } } } return riders; } public boolean move(MOB mob, int directionCode, boolean flee, boolean nolook, boolean noriders) { return move(mob,directionCode,flee,nolook,noriders,false); } public boolean move(MOB mob, int directionCode, boolean flee, boolean nolook, boolean noriders, boolean always) { if(directionCode<0) return false; if(mob==null) return false; Room thisRoom=mob.location(); if(thisRoom==null) return false; Room destRoom=thisRoom.getRoomInDir(directionCode); Exit exit=thisRoom.getExitInDir(directionCode); if(destRoom==null) { mob.tell(getScr("Movement","moveerr1")); return false; } Exit opExit=thisRoom.getReverseExit(directionCode); String directionName=(directionCode==Directions.GATE)&&(exit!=null)?"through "+exit.name():Directions.getDirectionName(directionCode); String otherDirectionName=(Directions.getOpDirectionCode(directionCode)==Directions.GATE)&&(exit!=null)?exit.name():Directions.getFromDirectionName(Directions.getOpDirectionCode(directionCode)); int generalMask=always?CMMsg.MASK_ALWAYS:0; int leaveCode=generalMask|CMMsg.MSG_LEAVE; if(flee) leaveCode=generalMask|CMMsg.MSG_FLEE; CMMsg enterMsg=null; CMMsg leaveMsg=null; if((mob.riding()!=null)&&(mob.riding().mobileRideBasis())) { enterMsg=CMClass.getMsg(mob,destRoom,exit,generalMask|CMMsg.MSG_ENTER,null,CMMsg.MSG_ENTER,null,CMMsg.MSG_ENTER,getScr("Movement","sridesin",mob.riding().name(),otherDirectionName)); leaveMsg=CMClass.getMsg(mob,thisRoom,opExit,leaveCode,((flee)?getScr("Movement","youflee",directionName):null),leaveCode,null,leaveCode,((flee)?getScr("Movement","sfleeswith",mob.riding().name(),directionName):getScr("Movement","srides",mob.riding().name(),directionName))); } else { enterMsg=CMClass.getMsg(mob,destRoom,exit,generalMask|CMMsg.MSG_ENTER,null,CMMsg.MSG_ENTER,null,CMMsg.MSG_ENTER,getScr("Movement","senter",CMLib.flags().dispositionString(mob,CMFlagLibrary.flag_arrives),otherDirectionName)); leaveMsg=CMClass.getMsg(mob,thisRoom,opExit,leaveCode,((flee)?getScr("Movement","youflee",directionName):null),leaveCode,null,leaveCode,((flee)?getScr("Movement","sflees",directionName):getScr("Movement","sleaves",CMLib.flags().dispositionString(mob,CMFlagLibrary.flag_leaves),directionName))); } boolean gotoAllowed=CMSecurity.isAllowed(mob,destRoom,"GOTO"); if((exit==null)&&(!gotoAllowed)) { mob.tell(getScr("Movement","moveerr1")); return false; } else if(exit==null) thisRoom.showHappens(CMMsg.MSG_OK_VISUAL,getScr("Movement","stwitch",directionName)); else if((exit!=null)&&(!exit.okMessage(mob,enterMsg))&&(!gotoAllowed)) return false; else if(!leaveMsg.target().okMessage(mob,leaveMsg)&&(!gotoAllowed)) return false; else if((opExit!=null)&&(!opExit.okMessage(mob,leaveMsg))&&(!gotoAllowed)) return false; else if(!enterMsg.target().okMessage(mob,enterMsg)&&(!gotoAllowed)) return false; else if(!mob.okMessage(mob,enterMsg)&&(!gotoAllowed)) return false; if(mob.riding()!=null) { if((!mob.riding().okMessage(mob,enterMsg))&&(!gotoAllowed)) return false; } else { if(!mob.isMonster()) for(int i=0;i<energyExpenseFactor();i++) mob.curState().expendEnergy(mob,mob.maxState(),true); if((!flee)&&(!mob.curState().adjMovement(-1,mob.maxState()))&&(!gotoAllowed)) { mob.tell(getScr("Movement","tootired")); return false; } if((mob.soulMate()==null)&&(mob.playerStats()!=null)&&(mob.riding()==null)&&(mob.location()!=null)) mob.playerStats().adjHygiene(mob.location().pointsPerMove(mob)); } Vector riders=null; if(!noriders) { riders=ridersAhead(mob,(Room)leaveMsg.target(),(Room)enterMsg.target(),directionCode,flee); if(riders==null) return false; } if(exit!=null) exit.executeMsg(mob,enterMsg); if(mob.location()!=null) mob.location().delInhabitant(mob); ((Room)leaveMsg.target()).send(mob,leaveMsg); if(enterMsg.target()==null) { ((Room)leaveMsg.target()).bringMobHere(mob,false); mob.tell(getScr("Movement","moveerr1")); return false; } mob.setLocation((Room)enterMsg.target()); ((Room)enterMsg.target()).addInhabitant(mob); ((Room)enterMsg.target()).send(mob,enterMsg); if(opExit!=null) opExit.executeMsg(mob,leaveMsg); if(!nolook) { CMLib.commands().postLook(mob,true); if((!mob.isMonster()) &&(CMath.bset(mob.getBitmap(),MOB.ATT_AUTOWEATHER)) &&(thisRoom!=null) &&(((Room)enterMsg.target())!=null) &&((thisRoom.domainType()&Room.INDOORS)>0) &&((((Room)enterMsg.target()).domainType()&Room.INDOORS)==0) &&(((Room)enterMsg.target()).getArea().getClimateObj().weatherType(((Room)enterMsg.target()))!=Climate.WEATHER_CLEAR) &&(((Room)enterMsg.target()).isInhabitant(mob))) mob.tell("\n\r"+((Room)enterMsg.target()).getArea().getClimateObj().weatherDescription(((Room)enterMsg.target()))); } if(!noriders) ridersBehind(riders,(Room)leaveMsg.target(),(Room)enterMsg.target(),directionCode,flee); if(!flee) for(int f=0;f<mob.numFollowers();f++) { MOB follower=mob.fetchFollower(f); if(follower!=null) { if((follower.amFollowing()==mob) &&((follower.location()==thisRoom)||(follower.location()==destRoom))) { if((follower.location()==thisRoom) &&(CMLib.flags().aliveAwakeMobile(follower,true)) &&(!CMath.bset(follower.getBitmap(),MOB.ATT_AUTOGUARD))) { follower.tell(getScr("Movement","youfollow",mob.name(),Directions.getDirectionName(directionCode))); if(!move(follower,directionCode,false,false,false,false)) { //follower.setFollowing(null); } } } //else // follower.setFollowing(null); } } return true; } protected Command stander=null; protected Vector ifneccvec=null; public void standIfNecessary(MOB mob) throws java.io.IOException { if((ifneccvec==null)||(ifneccvec.size()!=2)) { ifneccvec=new Vector(); ifneccvec.addElement("STAND"); ifneccvec.addElement("IFNECESSARY"); } if(stander==null) stander=CMClass.getCommand("Stand"); if((stander!=null)&&(ifneccvec!=null)) stander.execute(mob,ifneccvec); } public boolean execute(MOB mob, Vector commands) throws java.io.IOException { standIfNecessary(mob); if((commands.size()>3) &&(commands.firstElement() instanceof Integer)) { return move(mob, ((Integer)commands.elementAt(0)).intValue(), ((Boolean)commands.elementAt(1)).booleanValue(), ((Boolean)commands.elementAt(2)).booleanValue(), ((Boolean)commands.elementAt(3)).booleanValue(),false); } int direction=Directions.getGoodDirectionCode(CMParms.combine(commands,1)); if((direction<0)&&(mob.location().fetchFromRoomFavorItems(null,CMParms.combine(commands,1),Item.WORNREQ_UNWORNONLY) instanceof Rideable)) { Command C=CMClass.getCommand("Enter"); return C.execute(mob,commands); } String doing=(String)commands.elementAt(0); if(direction>=0) move(mob,direction,false,false,false,false); else { boolean doneAnything=false; if(commands.size()>2) for(int v=1;v<commands.size();v++) { int num=1; String s=(String)commands.elementAt(v); if(CMath.s_int(s)>0) { num=CMath.s_int(s); v++; if(v<commands.size()) s=(String)commands.elementAt(v); } else if(("NSEWUDnsewud".indexOf(s.charAt(s.length()-1))>=0) &&(CMath.s_int(s.substring(0,s.length()-1))>0)) { num=CMath.s_int(s.substring(0,s.length()-1)); s=s.substring(s.length()-1); } direction=Directions.getGoodDirectionCode(s); if(direction>=0) { doneAnything=true; for(int i=0;i<num;i++) { if(mob.isMonster()) { if(!move(mob,direction,false,false,false,false)) return false; } else { Vector V=new Vector(); V.addElement(doing); V.addElement(Directions.getDirectionName(direction)); mob.enqueCommand(V,0); } } } else break; } if(!doneAnything) mob.tell(CMStrings.capitalizeAndLower(doing)+" "+getScr("Movement","goerr")); } return false; } public double actionsCost(){return CMath.div(CMProps.getIntVar(CMProps.SYSTEMI_DEFCMDTIME),100.0);} public boolean canBeOrdered(){return true;} }