// This is the room inheritable for rooms of ships.
#include <mudlib.h>
#include <darkwind.h>
inherit VEHICLE_ROOM;
#define TP this_player()
#define RN TP->query_real_name()
#define DW_PORT WHARF + "port"
#define DW_HIDDEN_PORT WHARF + "hidden_port"
// Variables
object ship_ob;
void reset(int arg) {
::reset(arg);
if (arg) return;
set_no_teleport();
}
void init_room(object ob) {
::init_room(ob);
ship_ob = ob;
}
void init() {
::init();
add_action("quit","quit");
ship_ob->inc_players();
}
void exit() {
ship_ob->dec_players();
}
int quit() {
if (ship_ob->query_captains(RN)) {
if (sizeof(ship_ob->captains_onboard()) == 1) {
if (ship_ob->query_target()) ship_ob->sink();
else ship_ob->reset_ship();
}
}
return 0;
}
int exit_func() {
if (!ship_ob->query_docked()) {
write("You cannot leave the ship until it has docked.\n");
return 1;
}
if (environment(ship_ob) == find_object(DW_HIDDEN_PORT)) {
move_object(ship_ob, DW_PORT);
::leave_func();
move_object(ship_ob, DW_HIDDEN_PORT);
} else ::leave_func();
return (1);
}
object query_ship() { return(query_vehicle()); }
void vehicle_move_success(string str) {
write ("You sail "+vehicle -> short() +" to the "+str+".\n");
say (this_player()->query_name()+" sails "+vehicle->short() +
" to the "+str+".\n");
vehicle->tell_vehicle(this_player()->query_name() +" sails "+
vehicle -> short()+" to the "+str+".\n",({ query_room_name() }) );
return;
}
int move_func(string str) {
int cost, returned;
switch(str) {
case "n" : str = "north"; break;
case "s" : str = "south"; break;
case "e" : str = "east"; break;
case "w" : str = "west"; break;
case "ne" : str = "northeast"; break;
case "nw" : str = "northwest"; break;
case "se" : str = "southeast"; break;
case "sw" : str = "southwest"; break;
}
if (!ship_ob->crew_check()) return 1;
if (ship_ob->query_target()) {
write("You're engaged in combat! You must disengage first.\n");
return 1;
}
cost = ship_ob->query_move_cost();
if (!ship_ob->query_sp()) cost *= 2;
if (cost < 1) cost = 1;
if (cost > ship_ob->query_provisions()) {
write("The ship doesn't have the provisions to do that!\n");
return 1;
}
returned = ship_ob->move_vehicle(str);
if (returned != 1) {
switch (returned) {
case 0: write("Sail in what direction?\n"); break;
case -1: write(vehicle->short()+" can't sail in that terrain.\n");
break;
case -2: write(vehicle -> short()+" won't sail that way.\n");
break;
}
return 1;
}
ship_ob->restore_provisions(-cost);
ship_ob->inc_distance();
ship_ob->save_ship();
vehicle_move_success(str);
if(this_player()->query_brief())
write(environment(vehicle)->short() + "\n");
else
environment(vehicle)->long(0);
outer_inven();
return 1;
}