#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#ifdef SYSV
#include <dirent.h>
#else
#include <sys/dir.h>
#endif
#include "structs.h"
#include "utils.h"
#include "handler.h"
#include "comm.h"
#include "interpreter.h"
#include "db.h"
extern struct room_data *world;
extern int revdir[];
#ifdef NEEDS_STRDUP
char *strdup(char *s);
#endif
void do_save(struct char_data *ch, char *argument, int cmd)
{
act("Save at Midgaard Bank!",TRUE,ch,0,0,TO_CHAR);
act("$n just typed save! The fool!",TRUE,ch,0,0,TO_ROOM);
}
void do_mod(struct char_data *ch, char *argument, int cmd)
{
int i,j,room,dir,oroom,odir;
char buf[MAX_STRING_LENGTH], buf2[MAX_STRING_LENGTH];
char what[MAX_STRING_LENGTH], stuff[MAX_STRING_LENGTH];
char keyword[MAX_STRING_LENGTH], dirstring[MAX_STRING_LENGTH];
struct room_data *rm;
extern int top_of_world;
extern struct index_data *obj_index;
extern char *room_bits[];
room = ch->in_room;
rm = &world[room];
if((GET_LEVEL(ch) < (IMO+99))&&
(!IS_SET(ch->specials.act,PLR_BUILDER) ||
!IS_SET(rm->room_flags,MODROOM))){
send_to_char("You can't modify this room.\n\r",ch);
return;
}
argument=one_argument(argument,what);
if(*what == 'e'){ /* exit */
sprintf(buf2,"Hmm, game got <%s>, has <%s>.\n\r",what,argument);
send_to_char(buf2,ch);
half_chop(argument,keyword,dirstring);
if(!*keyword || !*dirstring){
sprintf(buf,"Usage: mod exit name direction.\n\r");
send_to_char(buf,ch);
return;
}
dir = atoi(dirstring);
if((dir < 0)||(dir > 5)){
send_to_char("Illegal direction!\n\r",ch);
return;
}
if(!world[room].dir_option[dir]){
send_to_char("There's no there there.\n\r",ch);
return;
}
if(world[room].dir_option[dir]->keyword){
send_to_char("Damn, already a door there!\n\r",ch);
return;
}
sprintf(buf,"You are making an exit <%s> in direction %d\n\r",
keyword,dir);
act(buf,TRUE,ch,0,0,TO_CHAR);
world[room].dir_option[dir]->keyword=strdup(keyword);
world[room].dir_option[dir]->exit_info=(EX_ISDOOR | EX_CLOSED);
oroom=world[room].dir_option[dir]->to_room;
odir=revdir[dir];
if(world[oroom].dir_option[odir]){
if(world[oroom].dir_option[odir]->to_room==room){
if(!world[oroom].dir_option[odir]->keyword){
world[oroom].dir_option[odir]->keyword=strdup(keyword);
world[oroom].dir_option[odir]->exit_info=(EX_ISDOOR | EX_CLOSED);
}
}
}
} else if(*what == 'n'){ /* name */
if(!argument[0]){
send_to_char("Usage: mod name short_name_of_room\n\r",ch);
return;
}
free(world[room].name);
if(argument)
for(;isspace(*argument);++argument);
world[room].name=strdup(argument);
} else if(*what == 'd'){ /* description */
if(!argument[0]){
if(ch->desc->str)
free(ch->desc->str);
ch->desc->str = &world[room].description;
if(*ch->desc->str)
free(*ch->desc->str);
*ch->desc->str = 0;
ch->desc->max_str = 255;
return;
}
free(world[room].description);
world[room].description=strdup(argument);
} else if(*what == 'f'){ /* flags */
if(!*argument){
sprintf(buf,"Current room flags are %d = ",(long) rm->room_flags);
send_to_char(buf,ch);
sprintbit((long) rm->room_flags,room_bits,buf);
strcat(buf,"\n\r");
send_to_char(buf,ch);
return;
}
i=atoi(argument);
if(i < 0){
send_to_char("Room NOT set.\n\r",ch);
return;
}
if(GET_LEVEL(ch) < IMO){
/*
i |= MODROOM;
*/
i &= 0x7fff;
}
world[ch->in_room].room_flags=i;
send_to_char("Room set.\n\r",ch);
return;
} else {
send_to_char("You can only modify NAME, EXIT, FLAGS and DESCR.\n\r",ch);
return;
}
send_to_char("Yo dude.\n\r",ch);
}