#include <lib.h>
#include <medium.h>
#include <daemons.h>
#include <position.h>
#include <armor_types.h>
#include <message_class.h>
#include <vision.h>
#include "include/npc.h"
private int Mount;
object *Riders = ({});
mixed direct_ride_str(){
return this_object()->GetMount();
}
mixed direct_ride_word_str(){
return this_object()->GetMount();
}
mixed direct_mount_liv(){
return this_object()->GetMount();
}
mixed direct_dismount_liv(){
return this_object()->GetMount();
}
mixed direct_dismount_from_liv(){
return this_object()->GetMount();
}
int eventRide(string direction){
string travel_cmd, s1, s2;
object *guys = get_livings(this_object());
if(interactive(this_object())) return 0;
if(sscanf(direction,"%s %s",s1,s2) == 2){
if(s1 == "enter" || s1 == "into") travel_cmd = "enter";
}
if(!s1 || s1 == "") switch(this_object()->GetPosition()){
case POSITION_STANDING : travel_cmd = "go";break;
case POSITION_SITTING : travel_cmd = "crawl";break;
case POSITION_LYING : travel_cmd = "crawl";break;
case POSITION_FLYING : travel_cmd = "fly";break;
default : travel_cmd = "go";
}
else direction = s2;
this_object()->eventForce(travel_cmd+" "+direction);
return 1;
}
object *AddRider(object ob){
Riders += ({ ob });
}
object *RemoveRider(object ob){
Riders -= ({ ob });
}
object *GetRiders(){
object *ret = ({});
if(Riders && sizeof(Riders)){
foreach(mixed rider in Riders){
if(!rider) RemoveRider(rider);
else if(environment(rider) == this_object()) ret += ({ rider });
else RemoveRider(rider);
}
}
return ret;
}
int SetMount(int x){
Mount = x;
if(Mount) this_object()->SetNoClean(1);
return Mount;
}
int GetMount(){ return Mount; }
varargs mixed eventMount(object who, int quiet, int forced){
int rider_weight;
string weight = "weight";
if(!who){
return 0;
}
if(environment() && environment()->GetMedium() == MEDIUM_SPACE){
weight = "mass";
}
rider_weight = who->GetMass();
if(!environment(this_object())){
return 0;
}
if(environment(who) && environment(who) == this_object()){
if(!forced && !quiet){
return who->eventPrint("You are already mounted.", MSG_ERROR);
}
}
if((rider_weight + this_object()->GetCarriedMass()) >
this_object()->GetMaxCarry()){
if(!forced && !quiet){
return write(this_object()->GetShort()+
" cannot handle that much "+weight+".");
}
}
if(this_object()->GetMountOwner() != who){
if(!forced && !quiet){
write(this_object()->GetName()+" doesn't know you well "
"enough to let you ride "+objective(this_object())+".");
return 0;
}
}
this_object()->SetNoClean(1);
if(!quiet){
write("You mount "+this_object()->GetShort()+".");
say(who->GetName()+" mounts "+this_object()->GetShort()+".");
}
who->SetProperty("mount", this_object());
if(who->eventMove(this_object())) return AddRider(who);
if(forced) return AddRider(who);
else return 0;
}
varargs mixed eventDismount(object who, int quiet, int forced){
int rider_weight;
rider_weight = who->GetMass();
if(!environment(this_object())) return 0;
if(environment(who) && environment(who) != this_object()){
if(!forced || !quiet){
return who->eventPrint("You are already dismounted.", MSG_ERROR);
}
}
else {
if(!quiet){
write("You dismount from "+this_object()->GetPlainShort()+".");
tell_room(environment(this_object()),who->GetName()+" dismounts from " +this_object()->GetPlainShort()+".", ({ this_object(), who }));
}
who->RemoveProperty("mount");
if(who->eventMove(environment(this_object()))) return RemoveRider(who);
else return 0;
}
}
mixed eventBuck(object who){
int rider_weight;
rider_weight = (who->GetCarriedMass()) + (who->GetMass() || 2000);
if(!environment(this_object())) return 0;
if(environment(who) && environment(who) != this_object()){
return 0;
}
else {
tell_player(who,"You are thrown from "+
(this_object()->GetPlainShort() || this_object()->GetShort())+"!");
tell_room(environment(this_object()),who->GetName()+
" is thrown from "+(this_object()->GetPlainShort() ||
this_object()->GetShort())+"!", ({ this_object(), who }));
who->RemoveProperty("mount");
who->SetPosition(POSITION_LYING);
if(who->eventMove(environment(this_object()))) return RemoveRider(who);
else return 0;
}
}