package com.planet_ink.coffee_mud.Items.Basic;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;
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.StdPortal;
import com.planet_ink.coffee_mud.Items.Basic.StdRideable;
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.*;
/*
Copyright 2016-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 StdGrapples extends StdPortal
{
public StdGrapples()
{
super();
setName("a set of ship grapples");
setDisplayText("a set of ship grapples lie here.");
setDescription("They look like long metal chains with long curved hooks.");
basePhyStats().setAbility(0);
basePhyStats().setLevel(0);
basePhyStats.setWeight(50);
basePhyStats().setAttackAdjustment(0);
basePhyStats().setDamage(0);
setRawProperLocationBitmap(Wearable.WORN_HELD);
//basePhyStats().setSensesMask(basePhyStats().sensesMask()|PhyStats.SENSE_ITEMNOTGET);
baseGoldValue=15;
recoverPhyStats();
setRiderCapacity(0);
material=RawMaterial.RESOURCE_IRON;
wornLogicalAnd = false;
}
protected volatile Room sourceR = null;
protected volatile Room targetR = null;
@Override
public int maxRange()
{
return 0;
}
protected void ungrappleCheck()
{
final Room sourceR=this.sourceR;
final Room targetR=this.targetR;
if((sourceR!=null)&&(targetR!=null))
{
if((amDestroyed()||(owner()!=sourceR)||(!targetR.isContent(this))||(!sourceR.isContent(this))))
{
ungrapple();
return;
}
final Area sourceA=sourceR.getArea();
final Area targetA=targetR.getArea();
if((sourceA==targetA)
||(!(sourceA instanceof BoardableShip))
||(!(targetA instanceof BoardableShip)))
{
ungrapple();
return;
}
final BoardableShip sourceS=(BoardableShip)sourceA;
final BoardableShip targetS=(BoardableShip)targetA;
final Room sourceShipR=CMLib.map().roomLocation(sourceS.getShipItem());
final Room targetShipR=CMLib.map().roomLocation(targetS.getShipItem());
if((sourceShipR==null)||(sourceShipR!=targetShipR))
{
ungrapple();
return;
}
}
}
protected void ungrapple()
{
final Room targetR=this.targetR;
if(targetR!=null)
{
while(targetR.isContent(this))
targetR.delItem(this);
}
this.targetR=null;
this.sourceR=null;
}
@Override
public void destroy()
{
ungrapple();
super.destroy();
}
@Override
public void executeMsg(final Environmental myHost, final CMMsg msg)
{
super.executeMsg(myHost,msg);
ungrappleCheck();
switch(msg.targetMinor())
{
case CMMsg.TYP_GET:
case CMMsg.TYP_DROP:
{
ungrapple();
break;
}
case CMMsg.TYP_ENTER:
break;
case CMMsg.TYP_THROW:
{
final Room sourceRoom=CMLib.map().roomLocation(msg.source());
if(msg.target() instanceof Room)
{
final Room targetRoom=(Room)msg.target();
if((sourceRoom!=null)
&&(targetRoom!=null)
&&(sourceRoom.getArea()!=targetRoom.getArea())
&&(sourceRoom.getArea() instanceof BoardableShip)
&&(targetRoom.getArea() instanceof BoardableShip))
{
final StdGrapples me=this;
msg.addTrailerRunnable(new Runnable()
{
@Override
public void run()
{
me.sourceR=sourceRoom;
me.targetR=targetRoom;
sourceRoom.moveItemTo(me);
if(!targetRoom.isContent(me))
targetRoom.addItem(me);
me.setOwner(sourceRoom);
}
});
}
}
break;
}
}
}
@Override
public boolean okMessage(final Environmental myHost, final CMMsg msg)
{
switch(msg.targetMinor())
{
case CMMsg.TYP_ADVANCE:
{
this.ungrappleCheck();
final Room sourceR=this.sourceR;
final Room targetR=this.targetR;
if((sourceR!=null)&&(targetR!=null))
{
final Area sourceA=sourceR.getArea();
final Area targetA=targetR.getArea();
if((sourceA instanceof BoardableShip)
&&(targetA instanceof BoardableShip))
{
final BoardableShip sourceS=(BoardableShip)sourceA;
final BoardableShip targetS=(BoardableShip)targetA;
if((msg.source().riding()==sourceS.getShipItem())
&&(sourceS.getShipArea()!=null))
{
for(final Enumeration<Room> r=sourceS.getShipArea().getProperMap();r.hasMoreElements();)
{
final Room R=r.nextElement();
if((R!=null) && ((R.domainType()&Room.INDOORS)==0))
R.showHappens(CMMsg.MSG_OK_VISUAL, L("Your ship is grappled to @x1 and cannot move.",targetS.getShipItem().name()));
}
return false;
}
if((msg.source().riding()==targetS.getShipItem())
&&(targetS.getShipArea()!=null))
{
for(final Enumeration<Room> r=targetS.getShipArea().getProperMap();r.hasMoreElements();)
{
final Room R=r.nextElement();
if((R!=null) && ((R.domainType()&Room.INDOORS)==0))
R.showHappens(CMMsg.MSG_OK_VISUAL, L("Your ship is grappled to @x1 and cannot move.",sourceS.getShipItem().name()));
}
return false;
}
}
}
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)
{
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;
}
if(!super.okMessage(myHost,msg))
return false;
return true;
}
@Override
protected Room getDestinationRoom(final Room fromRoom)
{
if(fromRoom == sourceR)
return targetR;
else
if(fromRoom == targetR)
return sourceR;
return null;
}
@Override
public StringBuilder viewableText(final MOB mob, final Room myRoom)
{
final Room room=this.getDestinationRoom(myRoom);
if(room==null)
return new StringBuilder(this.displayText(mob));
return super.viewableText(mob, myRoom);
}
}