/*****************************************************************************
* *
* Project : Diku-Mud-World-Creator *
* *
* Program : Diku-Mud-World-Simulator *
* Version : 1.0 *
* Last changed on: 27.7.93 *
* *
* Code by: Georg Essl (essl@fstgds06.tu-graz.ac.at) *
* *
*****************************************************************************/
/******* SIMULATION ******/
/***** Original Includes *****/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
/****** Project Includes *****/
#include "strext.h"
#include "dutil.h"
#include "dikusim.h"
#include "iedit.h"
#include "medit.h"
#include "zedit.h"
/****** DEFINES *****/
/* Diku-Sim */
#define SIM_MAXSTRLEN 128
#define SIM_M_QUIT 0
#define REAL 0
#define VIRTUAL 1
/***** ERROR-DEFINES *****/
#define SIM_ERR_NOERROR 0
/***** TYPEDEFS *****/
typedef signed char sbyte;
typedef unsigned char ubyte;
#if !defined(sgi) && !defined(m88k) &&!defined(_AIX)
typedef unsigned long ulong;
#endif
typedef signed short sh_int;
/***** Structs *****/
struct dirs
{
int isset; /* Is this direction defined ? */
char *gen_desc; /* What look <direction> gives */
char *doorname; /* Key words for the door name */
ulong doorflag; /* Bit vector for the door flags */
int keynumber; /* Key number (itemno/level) */
int toroomno; /* Where does it lead ? */
};
struct extra_desc
{
char *key; /* Keyword for the extra objects */
char *desc; /* Description of the the object */
struct extra_desc *next; /* Next in list */
};
struct room_data
{
int room_number;
int virt_number;
char *name; /* Name of the room */
char *description; /* Room description */
int zone_nr; /* Number of the zone it belongs to */
ulong flags; /* Bitvector for room flags */
int sector; /* Sector Type of the room */
struct dirs exits[6]; /* Union containing info about exits */
/* 0=N,1=E,2=S,3=W,4=U,5=D */
struct extra_desc *extra; /* Union for the extra objects */
};
/***** Global Vars *****/
int sim_curroom;
int sim_currzone;
/***** EXTERNS *****/
extern int zw_max;
extern char **zw_str;
extern char **zd_str;
extern const char *direction[6];
extern struct zone_data *ze_activezone;
/***** Vars from db.c from original DikuMud! *****/
extern struct index_data *room_index; /* index table for room file */
/*** PROTOS ***/
struct room_data *read_room(int,int);
void free_room(struct room_data *);
/*** FUNCTIONS ***/
int sim_get_curr_room(void)
{
return(sim_curroom);
}
void sim_set_curr_room(int wint)
{
sim_curroom=wint;
}
void sim_lookdir(struct ze_zone *zone,struct room_data *room,int dir)
{
if((room->exits[dir].isset==1) && (room->exits[dir].gen_desc!=NULL))
{
printf("%s\n",room->exits[dir].gen_desc);
}
else
printf("You see nothing special.\n");
if(room->exits[dir].doorname!=NULL)
{
printf("Door (%s) ",room->exits[dir].doorname);
if(room->exits[dir].keynumber!=-1)
printf("Key [%d]",room->exits[dir].keynumber);
if(zone!=NULL)
{
printf(" is %s.\n",zd_str[zone->door[dir]]);
}
else
printf(" is %s.\n",zd_str[0]);
}
}
void sim_look(struct room_data *room)
{
int wint;
int wint2;
char *buf;
printf("%s [%d]\n",room->name,room->virt_number);
printf(room->description);
if(ze_activezone!=NULL && ze_activezone->zone!=NULL)
{
for(wint2=0;wint2<ze_activezone->zonemax;wint2++)
{
if(ze_activezone->zone[wint2].room_nr==room->virt_number) break;
}
if(wint2!=ze_activezone->zonemax)
{
for(wint=0;wint<ze_activezone->zone[wint2].mob_count;wint++)
{
buf=me_ReadLDesc(ze_activezone->zone[wint2].mobs[wint].nr);
if(buf!=NULL)
{
printf("%s",buf);
free(buf);
}
else
printf("Nonexisting Mob [%d].",ze_activezone->zone[wint2].mobs[wint].nr);
}
for(wint=0;wint<ze_activezone->zone[wint2].obj_count;wint++)
{
buf=ie_ReadLDesc(ze_activezone->zone[wint2].objs[wint].nr);
if(buf!=NULL)
{
printf("%s\n",buf);
free(buf);
}
else
printf("Nonexisting Obj [%d].\n",ze_activezone->zone[wint2].objs[wint].nr);
}
}
}
}
void sim_lookinv(int *inv,int inv_count)
{
int i;
char *name;
for(i=0;i<inv_count;i++)
{
name=ie_ReadSDesc(inv[i]);
if(name!=NULL)
{
printf("%s\n",name);
free(name);
}
else
{
printf("Nonexisting Obj [%d].\n",inv[i]);
}
}
}
void sim_exits(struct room_data *room)
{
int wint;
int wint2=0;
printf("Exits:\n");
for(wint=0;wint<6;wint++)
{
printf("%s: ",direction[wint]);
if(room->exits[wint].isset==1)
{
printf("[%d]",room->exits[wint].toroomno);
}
else
printf("None");
if(room->exits[wint].isset!=0 && room->exits[wint].doorname!=NULL)
{
printf(" (Description Set)\n");
}
else
{
printf("\n");
}
}
}
/* Look at Mobile for DikuCli */
void sim_LookMobile(int nr)
{
int i,i2;
char *name;
struct ze_zone *room;
if((room=ze_getroom(ze_activezone,sim_get_curr_room()))!=NULL)
{
printf("The Mobile has equipted:\n");
for(i=0;i<room->mobs[nr].eq_count;i++)
{
i2=room->mobs[nr].eq[i].pos;
name=ie_ReadSDesc(room->mobs[nr].eq[i].obj);
if(i2<1 || i2>zw_max)
printf("On invalid position: ");
else
printf("%s : ",zw_str[i2]);
if(name!=NULL)
{
printf("%s\n",name);
free(name);
}
else
printf("Nonexisting Obj [%d].\n",room->mobs[nr].eq[i].obj);
}
printf("You peek into the inventory:\n");
sim_lookinv(room->mobs[nr].inv,room->mobs[nr].inv_count);
}
}
/* Look at Item for DikuCli */
void sim_LookItem(int nr)
{
struct ze_zone *room;
if((room=ze_getroom(ze_activezone,sim_get_curr_room()))!=NULL)
{
printf("The Item contains:\n");
sim_lookinv(room->objs[nr].inv,room->objs[nr].inv_count);
}
}
/* Look in Direction for DikuCli */
void sim_LookDir(int dir)
{
struct ze_zone *room;
struct room_data *wroom;
room=ze_getroom(ze_activezone,sim_get_curr_room());
wroom=read_room(sim_get_curr_room(),VIRTUAL);
sim_lookdir(room,wroom,dir);
free_room(wroom);
}
/* Look for DikuCli */
void sim_DoLook(int nr)
{
struct room_data *wroom;
wroom=read_room(nr,REAL);
if(wroom->zone_nr!=sim_currzone)
{
ze_LoadZone(wroom->zone_nr);
sim_currzone=wroom->zone_nr;
}
sim_look(wroom);
free_room(wroom);
}
/* Goto for DikuCli */
void sim_DoGoto(int nr)
{
sim_set_curr_room(room_index[nr].virtual);
sim_DoLook(nr);
}
/* Exits for DikuCli */
void sim_DoExits(int nr)
{
struct room_data *wroom;
wroom=read_room(nr,REAL);
sim_exits(wroom);
free_room(wroom);
}
/* Get Exit Room Nr for DikuCli */
int sim_GetExit(int nr,int dir)
{
struct room_data *wroom;
int wint;
wroom=read_room(nr,REAL);
if(wroom->exits[dir].isset==1)
{
wint=wroom->exits[dir].toroomno;
free_room(wroom);
return(wint);
}
else
{
free_room(wroom);
return(-1);
}
}
/* Initialize the DikuSim vars */
void sim_InitDikuSim(void)
{
sim_curroom=room_index->virtual;
sim_currzone= -1;
}