#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"
#ifndef NEW_WORLD
bool
is_boat_empty (SINGLE_OBJECT * boat)
{
int cnt;
if (!boat->boat)
return TRUE;
for (cnt = 0; cnt < 8; cnt++)
{
if (boat->boat->in_boat[cnt] != NULL)
return FALSE;
}
return TRUE;
}
bool
is_in_same_boat (CHAR_DATA * ch, CHAR_DATA * victim)
{
int cnt;
if (!victim->ced || !ch->ced)
return FALSE;
if (!IS_IN_BOAT (victim) || !IS_IN_BOAT (ch))
return FALSE;
if (!ch->ced->in_boat->boat)
return FALSE;
for (cnt = 0; cnt < 8; cnt++)
{
if (ch->ced->in_boat->boat->in_boat[cnt] == victim)
return TRUE;
}
return FALSE;
}
void
char_from_boat (CHAR_DATA * ch, SINGLE_OBJECT * boat)
{
int cnt;
if (!ch->ced)
return;
if (!boat->boat)
return;
for (cnt = 0; cnt < 8; cnt++)
{
if (boat->boat->in_boat[cnt] == ch)
boat->boat->in_boat[cnt] = NULL;
}
if (boat->boat->navigator == ch)
boat->boat->navigator = NULL;
ch->ced->in_boat = NULL;
return;
}
void
char_to_boat (CHAR_DATA * ch, SINGLE_OBJECT * boat)
{
int cnt;
if (!boat->boat)
return;
check_ced (ch);
for (cnt = 0; cnt < 8; cnt++)
{
if (boat->boat->in_boat[cnt] == NULL)
{
boat->boat->in_boat[cnt] = ch;
break;
}
}
ch->ced->in_boat = boat;
return;
}
bool
has_boat_space (CHAR_DATA * ch, SINGLE_OBJECT * boat)
{
int whities;
int darkies;
int cnt;
darkies = 0;
whities = 0;
if (!boat->boat)
return FALSE;
for (cnt = 0; cnt < 8; cnt++)
{
if (boat->boat->in_boat[cnt] != NULL)
{
if (IS_EVIL (boat->boat->in_boat[cnt]))
darkies++;
if (!IS_EVIL (boat->boat->in_boat[cnt]))
whities++;
}
}
if (IS_EVIL (ch) && darkies > 3)
return FALSE;
if (!IS_EVIL (ch) && whities > 3)
return FALSE;
if (darkies + whities > 7)
return FALSE;
if (RIDING (ch) != NULL)
do_dismount (ch, "");
return TRUE;
}
void
send_to_boat (CHAR_DATA * ch, SINGLE_OBJECT * boat, char *to_send)
{
CHAR_DATA *to_char;
check_room_more (ch->in_room);
for (to_char = ch->in_room->more->people; to_char != NULL; to_char = to_char->next_in_room)
{
if (to_char->ced && to_char->ced->in_boat != boat)
continue;
send_to_char (to_send, to_char);
}
return;
}
void
do_disembark (CHAR_DATA * ch, char *argy)
{
SINGLE_OBJECT *boat;
char buffr[500];
DEFINE_COMMAND ("disembark", do_disembark, POSITION_STANDING, 0, LOG_NORMAL, "Allows you to disembark from a sea-faring vessel.")
#ifdef NEW_WORLD
do_leave (ch, argy);
return;
#endif
if (!ch->ced)
return;
if (ch->ced->in_boat == NULL)
{
send_to_char ("You aren't in a boat!\n\r", ch);
return;
}
if (ch->in_room->sector_type == SECT_WATER_NOSWIM)
{
send_to_char ("You are still in deep, deep water... You can't disembark!\n\r", ch);
return;
}
if (FIGHTING (ch) != NULL)
{
if (number_range (1, 2) == 1)
{
send_to_char ("Due to combat, you were unable to disembark the vessel!\n\r", ch);
return;
}
stop_fighting (ch, TRUE);
}
boat = ch->ced->in_boat;
char_from_boat (ch, ch->ced->in_boat);
send_to_char ("You disembark from the boat...\n\r", ch);
sprintf (buffr, "%s disembarks...\n\r", NAME (ch));
send_to_boat (ch, boat, buffr);
return;
}
void
do_board (CHAR_DATA * ch, char *argy)
{
int cnt;
SINGLE_OBJECT *obj;
SINGLE_OBJECT *boat_to_board;
SINGLE_OBJECT *boat_in_now;
char which_boat;
char output[500];
DEFINE_COMMAND ("board", do_board, POSITION_STANDING, 0, LOG_NORMAL, "Allows you to enter a sea faring vessel.")
check_ced (ch);
boat_to_board = NULL;
boat_in_now = ch->ced->in_boat;
if (argy[0] >= '1' && argy[0] <= '9')
{
which_boat = argy[0] - '1' + 1;
argy += 2;
}
else
which_boat = 1;
cnt = 0;
check_room_more (ch->in_room);
for (obj = ch->in_room->more->contents; obj != NULL; obj = obj->next_content)
{
if (obj == boat_in_now)
continue;
if (obj->pIndexData->item_type == ITEM_BOAT && (is_name (argy, obj->pIndexData->name) || argy == "" || argy == NULL || argy[0] == '\0' || argy[0] == '\n'))
cnt++;
if (cnt == which_boat)
{
boat_to_board = obj;
break;
}
}
if (boat_to_board == NULL)
{
if (boat_in_now != NULL)
{
send_to_char ("You are already in a boat, and there is no other boat here!\n\r", ch);
return;
}
send_to_char ("There is no boat here to board...\n\r", ch);
return;
}
if (!has_boat_space (ch, boat_to_board))
{
send_to_char ("There isn't enough room on that vessel to board it!\n\r", ch);
return;
}
if (ch->position == POSITION_BASHED)
{
send_to_char ("You are bashed to the ground!\n\r", ch);
return;
}
if (ch->position == POSITION_GROUNDFIGHTING)
{
send_to_char ("You are groundfighting!\n\r", ch);
return;
}
if (ch->position == POSITION_FIGHTING && FIGHTING (ch) != NULL)
{
if (number_range (1, 2) == 1)
{
send_to_char ("You couldn't manage to get away during combat to board that vessel!\n\r", ch);
return;
}
send_to_char ("You've managed to board the vessel successfully during combat!\n\r", ch);
if (FIGHTING (ch) != NULL)
{
send_to_char ("Your opponent has managed to escape and board another vessel!!\n\r", FIGHTING (ch));
}
stop_fighting (ch, TRUE);
}
if (boat_in_now != NULL)
{
sprintf (output, "%s leaves the boat and boards %s!\n\r",
NAME (ch),
STR (boat_to_board, short_descr));
char_from_boat (ch, boat_in_now);
send_to_boat (ch, boat_in_now, output);
}
sprintf (output, "%s has boarded the vessel!\n\r", NAME (ch));
send_to_boat (ch, boat_to_board, output);
char_to_boat (ch, boat_to_board);
send_to_char ("You board the vessel!\n\r", ch);
return;
}
#endif
void
disengage (CHAR_DATA * ch, char *argy)
{
DEFINE_COMMAND ("disengage", disengage, POSITION_FIGHTING, 0, LOG_NORMAL, "Allows you to disengage from battle if someone is not directly hitting you.")
if (FIGHTING (ch) == NULL)
{
send_to_char ("You aren't fighting anything or anyone!\n\r", ch);
return;
}
if (ch->fgt && ch->fgt->fighting && ch->fgt->fighting->fgt &&
ch->fgt->fighting->fgt->fighting == ch)
{
send_to_char ("Your opponent is attacking YOU! You can't disengage!\n\r", ch);
return;
}
if (ch->fgt)
ch->fgt->fighting = NULL;
ch->position = POSITION_STANDING;
WAIT_STATE (ch, 4 * PULSE_VIOLENCE);
return;
}