/*
* movement.c
*
* Contains movement and display code
* for the world map.
*/
#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
/* including main header file */
#include "mud.h"
struct sector_type sector_table[] =
{ /*# Red Grn Blu */
{"Mountain", "#D^", 0, 128, 128, 128, TRUE, TRUE }, /* 0 */
{"Grass", "#g.", 1, 255, 255, 255, TRUE, TRUE }, /* 1 */
{"River", "#C~", 2, 0, 255, 255, TRUE, TRUE }, /* 2 */
{"Ocean", "#b~", 3, 0, 0, 255, TRUE, TRUE }, /* 3 */
{"Beach", "#y.", 4, 0, 0, 0, TRUE, TRUE }, /* 4 */
{"Desert", "#y^", 5, 255, 255, 0, TRUE, TRUE }, /* 5 */
{"Hills", "#w^", 6, 192, 192, 192, TRUE, TRUE }, /* 6 */
{"Tree", "#G*", 7, 0, 255, 0, TRUE, TRUE }, /* 7 */
{"Swamp", "#g&", 8, 0, 128, 128, TRUE, TRUE }, /* 8 */
{"Swamp", "#g&", 9, 0, 128, 128, TRUE, TRUE }, /* 9 */
{"Ground", "#D*", 10, 178, 147, 4, TRUE, TRUE }, /* 10 */
{"CityWall|", "#D|", 11, 100, 200, 0, FALSE, FALSE}, /* 11 */
{"CityWall-", "#D-", 12, 255, 0, 255, FALSE, FALSE}, /* 12 */
{"City_Street", "#w.", 13, 200, 0, 0, TRUE, TRUE }, /* 13 */
{"Door", "#y+", 14, 200, 200, 0, FALSE, FALSE}, /* 14 */
{"Fountain", "#C%", 15, 128, 64, 0, TRUE, TRUE }, /* 15 */
{"Inside", "#g.", 16, 235, 235, 235, TRUE, TRUE }, /* 16 */
{"unused", "#G*", 17, 0, 128, 0, TRUE, TRUE }, /* 17 */
{"CTree", "#G*", 18, 0, 128, 0, TRUE, TRUE }, /* 18 */
{"Door-open", "#y.", 19, 2, 2, 2, TRUE, TRUE }, /* 19 */
{"Nothing", " ", 20, 3, 4, 5, FALSE, FALSE}, /* 20 */
{"Another_Char","#W@", 21, 4, 5, 6, FALSE, FALSE}, /* 21 */
{"Test", "#1 #n", 22, 4, 5, 6, FALSE, FALSE}, /* 22 */
{"LetA", "A", 23, 9, 9, 9, TRUE, TRUE}, /* 23 */
{"LetB", "B", 24, 9, 9, 9, TRUE, TRUE}, /* 24 */
{"LetC", "C", 25, 9, 9, 9, TRUE, TRUE}, /* 25 */
{"LetD", "D", 26, 9, 9, 9, TRUE, TRUE}, /* 26 */
{"LetE", "E", 27, 9, 9, 9, TRUE, TRUE}, /* 27 */
{"LetF", "F", 28, 9, 9, 9, TRUE, TRUE}, /* 28 */
{"LetG", "G", 29, 9, 9, 9, TRUE, TRUE}, /* 29 */
{"LetH", "H", 30, 9, 9, 9, TRUE, TRUE}, /* 30 */
{"LetI", "I", 31, 9, 9, 9, TRUE, TRUE}, /* 31 */
{"LetJ", "J", 32, 9, 9, 9, TRUE, TRUE}, /* 32 */
{"LetK", "K", 33, 9, 9, 9, TRUE, TRUE}, /* 33 */
{"LetL", "L", 34, 9, 9, 9, TRUE, TRUE}, /* 34 */
{"LetM", "M", 35, 9, 9, 9, TRUE, TRUE}, /* 35 */
{"LetN", "N", 36, 9, 9, 9, TRUE, TRUE}, /* 36 */
{"LetO", "O", 37, 9, 9, 9, TRUE, TRUE}, /* 37 */
{"LetP", "P", 38, 9, 9, 9, TRUE, TRUE}, /* 38 */
{"LetQ", "Q", 39, 9, 9, 9, TRUE, TRUE}, /* 39 */
{"LetR", "R", 40, 9, 9, 9, TRUE, TRUE}, /* 40 */
{"LetS", "S", 41, 9, 9, 9, TRUE, TRUE}, /* 41 */
{"LetT", "T", 42, 9, 9, 9, TRUE, TRUE}, /* 42 */
{"LetU", "U", 43, 9, 9, 9, TRUE, TRUE}, /* 43 */
{"LetV", "V", 44, 9, 9, 9, TRUE, TRUE}, /* 44 */
{"LetW", "W", 45, 9, 9, 9, TRUE, TRUE}, /* 45 */
{"LetX", "X", 46, 9, 9, 9, TRUE, TRUE}, /* 46 */
{"LetY", "Y", 47, 9, 9, 9, TRUE, TRUE}, /* 47 */
{"LetZ", "Z", 48, 9, 9, 9, TRUE, TRUE}, /* 48 */
{"Temp Wall", "#D-", 49, 128, 128, 128, FALSE, FALSE}, /* 49 */
{"Temp Wall", "#D|", 50, 64, 0, 255, FALSE, FALSE}, /* 50 */
{NULL,"#R+", 17, 1, 2, 3, TRUE, TRUE}, /* END */
};
/*
* Display.c
*
* Contains Display Commands and Supporting
* functions.
*/
#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
/* including main header file */
#include "mud.h"
/*
* cmd_look()
*
* The look command
*/
void cmd_look(D_MOBILE * ch, char * arg)
{
int x = 0;
int y = 0;
int viewx = ch->view_x;
int viewy = ch->view_y;
static int small_map[21][81];
int start_x = (ch->x - (viewx / 2));
int start_y = (ch->y - (viewy / 2));
int sm_x = 0;
int sm_y = 0;
D_MOBILE *xMob;
D_SOCKET *dsock;
BUFFER *buf = buffer_new(MAX_BUFFER);
if (IS_SET(ch->player_flags, PLR_CLEAR_SCREEN))
stc(CLEAR_SCREEN, ch);
cmd_where(ch, "");
/* Zero Small map array */
for (y = 0; y < viewy; y++)
{
for (x = 0; x < viewx; x++)
{
small_map[y][x] = 1;
}
}
/* Build the Terrain */
for (y = start_y; y != (start_y + viewy); y++)
{
for (x = start_x; x != (start_x + viewx); x++)
{
if (y == ch->y && x == ch->x)
small_map[sm_y][sm_x] = SECTOR_CHAR;
else
{
if (can_see_to(ch, x, y) == FALSE && !IS_SET (ch->immortal_flags, IMMORTAL_OMNI_VIEW))
small_map[sm_y][sm_x] = SECTOR_NOTHING;
else
small_map[sm_y][sm_x] = return_number_of_map(map[y][x]);
/* Build other Players && mobs */
for (dsock = dsock_list; dsock; dsock = dsock->next)
{
if (dsock->state != STATE_PLAYING)
continue; /* Must be playing*/
if ((xMob = dsock->player) == NULL)
continue; /* Must be valid */
if ((xMob == ch))
continue; /* Must not be CH */
/* Ok lets see if this guys in the area.. */
if ((xMob->x == x) && (xMob->y == y))
{
small_map[sm_y][sm_x] = SECTOR_CHAR;
}
}
}
sm_x++;
if (sm_x == viewx)
{
sm_x = 0;
}
}
sm_y++;
}
/* Display Final Small map */
for (y = 0; y != (viewy); y++)
{
for (x = 0; x != (viewx); x++)
{
if (y == (ch->y - y) && x == (ch->x - x))
bprintf(buf, "#R@");
else
{
bprintf(buf, "%s", return_symbol(small_map[y][x]));
}
if (x == viewx - 1)
bprintf(buf, "\n\r");
}
}
/*
for (y = start_y; y != (start_y + viewy); y++)
{
for (x = start_x; x != (start_x + viewx); x++)
{
if (y == ch->y && x == ch->x && z == ch->z)
bprintf(buf, "#R@");
else
{
if (can_see_to(ch, x, y) == FALSE &&
!IS_SET (ch->immortal_flags, IMMORTAL_OMNI_VIEW))
bprintf(buf, " ");
else
bprintf(buf, "%s", return_symbol(map[y][x]));
}
if (x == start_x + viewx - 1)
bprintf(buf, "\n\r");
}
}
*/
text_to_mobile(ch, buf->data);
buffer_free(buf);
}
int sector_number (int number)
{
int x;
for (x = 0; x != MAX_SECTOR; x++)
{
if (sector_table[x].sector == number)
return number;
}
return SECTOR_NOTHING;
}
/*
* can_see_to()
*
* Returns TRUE if the sector is visable
* Returns FALSE if its blocked anywhere in between
*/
bool can_see_to (D_M * ch, int target_x, int target_y)
{
int x = ch->x;
int y = ch->y;
if (y < target_y && x < target_x)
{
for (y = ch->y; y != target_y; y++)
{
for (x = ch->x; x != target_x; x++)
{
if (sector_table[map[y][x]].can_see_through != TRUE)
return FALSE;
}
}
}
else if (y > target_y && x > target_x)
{
for (y = ch->y; y != target_y; y--)
{
for (x = ch->x; x != target_x; x--)
{
if (sector_table[map[y][x]].can_see_through != TRUE)
return FALSE;
}
}
}
else if (y < target_y && x > target_x)
{
for (y = ch->y; y != target_y; y++)
{
for (x = ch->x; x != target_x; x--)
{
if (sector_table[map[y][x]].can_see_through != TRUE)
return FALSE;
}
}
}
else if (y > target_y && x < target_x)
{
for (y = ch->y; y != target_y; y--)
{
for (x = ch->x; x != target_x; x++)
{
if (sector_table[map[y][x]].can_see_through != TRUE)
return FALSE;
}
}
}
else if (target_y == y && x > target_x)
{
for (x = ch->x; x != target_x; x--)
{
if (sector_table[map[y][x]].can_see_through != TRUE)
return FALSE;
}
}
else if (target_y == y && x < target_x)
{
for (x = ch->x; x != target_x; x++)
{
if (sector_table[map[y][x]].can_see_through != TRUE)
return FALSE;
}
}
else if (target_x == x && y < target_y)
{
for (y = ch->y; y != target_y; y++)
{
if (sector_table[map[y][x]].can_see_through != TRUE)
return FALSE;
}
}
else if (target_x == x && y > target_y)
{
for (y = ch->y; y != target_y; y--)
{
if (sector_table[map[y][x]].can_see_through != TRUE)
return FALSE;
}
}
else
return TRUE;
return TRUE;
}
/*
* return_symbol()
*
* Returns sector symbol from sector_table
* used in cmd_look()
*/
char * return_symbol(int location)
{
int i = 0;
static char buf[1024];
for (i = 0; i <= MAX_SECTOR; i++)
{
if (sector_table[i].sector == location)
{
sprintf(buf, "%s", sector_table[i].char_sm);
break;
}
else
sprintf(buf, "#R+");
}
return buf;
}
int return_number_of_map(int location)
{
int i = 0;
int bob;
for (i = 0; i <= MAX_SECTOR; i++)
{
if (sector_table[i].sector == location)
{
bob = sector_table[i].sector;
break;
}
}
return bob;
}
/* Movement commands */
void cmd_north(D_MOBILE * ch, char *arg)
{
if (check_move_ok(ch, DIR_NORTH) == TRUE)
ch->y--;
else
stc("You cannot move that direction.\n\r", ch);
cmd_look(ch, "");
}
void cmd_south(D_MOBILE * ch, char *arg)
{
if (check_move_ok(ch, DIR_SOUTH) == TRUE)
ch->y++;
else
stc("You cannot move that direction.\n\r", ch);
cmd_look(ch, "");
}
void cmd_west(D_MOBILE * ch, char *arg)
{
if (check_move_ok(ch, DIR_WEST) == TRUE)
ch->x--;
else
stc("You cannot move that direction.\n\r", ch);
cmd_look(ch, "");
}
void cmd_east(D_MOBILE * ch, char *arg)
{
if (check_move_ok(ch, DIR_EAST) == TRUE)
ch->x++;
else
stc("You cannot move that direction.\n\r", ch);
cmd_look(ch, "");
}
void cmd_up (D_MOBILE * ch, char *arg)
{
if (check_move_ok(ch, DIR_UP) == TRUE)
ch->z++;
else
stc("You cannot move that direction.\n\r", ch);
cmd_look(ch, "");
}
void cmd_down (D_MOBILE * ch, char *arg)
{
if (check_move_ok(ch, DIR_DOWN) == TRUE)
ch->z--;
else
stc("You cannot move that direction.\n\r", ch);
cmd_look(ch, "");
}
bool check_move_ok (D_M * ch, int direction)
{
bool can_move = TRUE;
int next_x = (ch->x);
int next_y = (ch->y);
int next_z = (ch->z);
switch(direction)
{ default:
stc("*** BUG *** check_move_ok: Invalid direction\n\r", ch);
break;
case DIR_NORTH:
if (ch->y != 20)
can_move = FALSE;
next_y--;
break;
case DIR_SOUTH:
if (ch->y != (MAX_Y - 20))
can_move = FALSE;
next_y++;
break;
case DIR_WEST:
if (ch->x != 20)
can_move = FALSE;
next_x--;
break;
case DIR_EAST:
if (ch->x != (MAX_X - 20))
can_move = FALSE;
next_x++;
break;
case DIR_UP:
if (ch->z != 11)
can_move = FALSE;
next_z++;
break;
case DIR_DOWN:
if (ch->z != 0)
can_move = FALSE;
next_z--;
break;
}
/* Pass door for imms */
if (!IS_SET (ch->immortal_flags, IMMORTAL_PASS_DOOR))
{
if (sector_table[map[next_y][next_x]].passable == FALSE)
{
stc("You cannot move that way!\n\r", ch);
return FALSE;
}
else
{
return TRUE;
}
}
else
{
return TRUE;
}
return TRUE;
}
/*
* cmd_open()
*
* Basic command to open a door in given
* direction.
*/
void cmd_open (D_MOBILE * ch, char *argument)
{
char arg[MAX_BUFFER];
int x = ch->x;
int y = ch->y;
one_arg (argument, arg);
if (arg[0] == '\0')
{
send_to_char ("Open what direction?\n\r", ch);
return;
}
if (!str_prefix(arg, "north"))
{
y--;
if (map[y][x] != 14)
{
stc("There is no door there!\n\r", ch);
return;
}
map[y][x] = 19;
cmd_look(ch, "");
stc("Opening door..\n\r", ch);
return;
}
else if (!str_prefix(arg, "south"))
{
y++;
if (map[y][x] != 14)
{
stc("There is no door there!\n\r", ch);
return;
}
map[y][x] = 19;
cmd_look(ch, "");
stc("Opening door..\n\r", ch);
return;
}
else if (!str_prefix(arg, "west"))
{
x--;
if (map[y][x] != 14)
{
stc("There is no door there!\n\r", ch);
return;
}
map[y][x] = 19;
cmd_look(ch, "");
stc("Opening door..\n\r", ch);
return;
}
else if (!str_prefix(arg, "east"))
{
x++;
if (map[y][x] != 14)
{
stc("There is no door there!\n\r", ch);
return;
}
map[y][x] = 19;
cmd_look(ch, "");
stc("Opening door..\n\r", ch);
return;
}
else
{
stc("Open door in what direction?\n\r", ch);
return;
}
}
/*
* cmd_close()
*
* Basic command to close a door in given direction
*/
void cmd_close (D_MOBILE * ch, char *argument)
{
char arg[MAX_BUFFER];
int x = ch->x;
int y = ch->y;
one_arg (argument, arg);
if (arg[0] == '\0')
{
send_to_char ("Open what direction?\n\r", ch);
return;
}
if (!str_prefix(arg, "north"))
{
y--;
if (map[y][x] != 19)
{
stc("There is no door there!\n\r", ch);
return;
}
map[y][x] = 14;
cmd_look(ch, "");
stc("Opening door..\n\r", ch);
return;
}
else if (!str_prefix(arg, "south"))
{
y++;
if (map[y][x] != 19)
{
stc("There is no door there!\n\r", ch);
return;
}
map[y][x] = 14;
cmd_look(ch, "");
stc("Opening door..\n\r", ch);
return;
}
else if (!str_prefix(arg, "west"))
{
x--;
if (map[y][x] != 19)
{
stc("There is no door there!\n\r", ch);
return;
}
map[y][x] = 14;
cmd_look(ch, "");
stc("Opening door..\n\r", ch);
return;
}
else if (!str_prefix(arg, "east"))
{
x++;
if (map[y][x] != 19)
{
stc("There is no door there!\n\r", ch);
return;
}
map[y][x] = 14;
cmd_look(ch, "");
stc("Opening door..\n\r", ch);
return;
}
else
{
stc("Open door in what direction?\n\r", ch);
return;
}
}
int return_distance(D_M * ch, D_M * victim)
{
int x, y;
x = 0;
y = 0;
if ( ch->x == victim->x
&& ch->y == victim->y)
{
return 0;
}
if (ch->x <= victim->x)
x = (victim->x - ch->x);
else if (ch->x >= victim->x)
x = (ch->x - victim->x);
else if (ch->x == victim->x)
x = 0;
else
x = -200;
if (ch->y <= victim->y)
y = (victim->y - ch->y);
else if (ch->y >= victim->y)
y = (ch->y - victim->y);
else if (ch->y == victim->y)
y = 0;
else
y = -100;
return (x + y);
}