Installation for CircleMud
--------------------------
1. In the Makefile.in file, find:
#flags for profiling (see hacker.doc for more information)
PROFILE =
Directly below that, add:
#I3 - Comment out to disable I3 support
I3 = 1
Below the CXREF_FILES section, add the following:
[Note: BSD users - put a period in front of the word ifdef, and in front of the word endif]
ifdef I3
CXREF_FILES += i3.c
OBJFILES += i3.o
CFLAGS += -DI3 -DI3CIRCLE
endif
Directly below the following:
weather.o: weather.c conf.h sysdep.h structs.h utils.h comm.h handler.h \
interpreter.h db.h
$(CC) -c $(CFLAGS) weather.c
Add the following:
i3.o: i3.c conf.h sysdep.h structs.h utils.h comm.h db.h handler.h \
interpreter.h i3.h i3cfg.h
$(CC) -c $(CFLAGS) i3.c
2. Open act.social.c and find the following:
struct social_messg {
int act_nr;
int hide;
int min_victim_position; /* Position of victim */
/* No argument was supplied */
char *char_no_arg;
char *others_no_arg;
/* An argument was there, and a victim was found */
char *char_found; /* if NULL, read no further, ignore args */
char *others_found;
char *vict_found;
/* An argument was there, but no victim was found */
char *not_found;
/* The victim turned out to be the character */
char *char_auto;
char *others_auto;
} *soc_mess_list;
Below that, add the following:
/* For I3 */
struct social_messg *find_social( const char *name )
{
int cmd, socidx;
if( ( cmd = find_command( name ) ) < 0 )
return NULL;
if( ( socidx = find_action( cmd ) ) < 0 )
return NULL;
return &soc_mess_list[socidx];
}
3. Open comm.c and locate the following:
#ifdef HAVE_ARPA_TELNET_H
#include <arpa/telnet.h>
#else
#include "telnet.h"
#endif
Directly below that, add the following:
#ifdef I3
#include "i3.h"
#endif
Locate function init_game, and find the following:
log("Opening mother connection.");
mother_desc = init_socket(port);
boot_db();
Directly below that, add the following:
#ifdef I3
/* Initialize and connect to Intermud-3 */
I3_main( FALSE, port, FALSE );
#endif
Locate the following:
CLOSE_SOCKET(mother_desc);
fclose(player_fl);
Directly below that, add the following:
#ifdef I3
I3_shutdown( 0 );
#endif
Locate game_loop and find the following:
/* If we missed more than 30 seconds worth of pulses, just do 30 secs */
if (missed_pulses > 30 RL_SEC) {
log("SYSERR: Missed %d seconds worth of pulses.", missed_pulses / PASSES_PER_SEC);
missed_pulses = 30 RL_SEC;
}
Directly below that, add the following:
#ifdef I3
I3_loop();
#endif
*** For Circle 3.1 compatibility only *** - Support conjured by Rogel
In game_loop, find:
/* Sleep if we don't have any connections */
if (descriptor_list == NULL) {
log("No connections. Going to sleep.");
FD_ZERO(&input_set);
FD_SET(mother_desc, &input_set);
if (select(mother_desc + 1, &input_set, (fd_set *) 0, (fd_set *) 0, NULL) < 0) {
Replace with:
/* Sleep if we don't have any connections */
if (descriptor_list == NULL) {
#ifdef I3
int top_desc = this_i3mud != NULL ? MAX( mother_desc, this_i3mud->desc ) : mother_desc;
#else
int top_desc = mother_desc;
#endif
log("No connections. Going to sleep.");
FD_ZERO(&input_set);
FD_SET(mother_desc, &input_set);
#ifdef I3
if ( this_i3mud != NULL )
FD_SET(this_i3mud->desc, &input_set);
#endif
if (select(top_desc + 1, &input_set, (fd_set *) 0, (fd_set *) 0, NULL) < 0) {
4. Open db.c and find the following:
#include "interpreter.h"
#include "house.h"
#include "constants.h"
Directly below that, add:
#ifdef I3
#include "i3.h"
#endif
Locate the following:
void log_zone_error(zone_rnum zone, int cmd_no, const char *message);
void reset_time(void);
long get_ptable_by_name(char *name);
Directly below that, add the following:
#ifdef I3
void load_i3_pfile( struct char_data *ch );
char *i3_fread_word( char *buf, size_t len, FILE *fp );
#endif
Locate the following:
char *get_name_by_id(long id)
{
int i;
for (i = 0; i <= top_of_p_table; i++)
if (player_table[i].id == id)
return (player_table[i].name);
return (NULL);
}
Directly below that, add the following:
#ifdef I3
void save_i3_pfile(struct char_data *ch)
{
FILE *fl;
char filename[PATH_MAX];
#if _CIRCLEMUD < CIRCLEMUD_VERSION(3,0,21)
if (!get_filename(GET_PC_NAME(ch), filename, I3_FILE))
return;
#else
if (!get_filename(filename, sizeof(filename), I3_FILE, GET_PC_NAME(ch)))
return;
#endif
if (!(fl = fopen(filename, "w")))
{
if (errno != ENOENT)
log("SYSERR: opening I3 file '%s' for writing: %s", filename, strerror(errno));
return;
}
i3_savechar(ch, fl);
fclose(fl);
}
void load_i3_pfile(struct char_data *ch)
{
FILE *fl;
char filename[PATH_MAX];
char word[READ_SIZE];
#if _CIRCLEMUD < CIRCLEMUD_VERSION(3,0,21)
if (!get_filename(GET_PC_NAME(ch), filename, I3_FILE))
return;
#else
if (!get_filename(filename, sizeof(filename), I3_FILE, GET_PC_NAME(ch)))
return;
#endif
if (!(fl = fopen(filename, "r")))
{
if (errno != ENOENT)
log("SYSERR: opening I3 file '%s' for reading: %s", filename, strerror(errno));
return;
}
for (;;)
{
i3_fread_word(word, sizeof(word), fl);
if (*word != 'I')
break;
i3load_char(ch, fl, word);
}
fclose(fl);
}
#endif
Locate the following code in store_to_char:
/* Add all spell effects */
for (i = 0; i < MAX_AFFECT; i++) {
if (st->affected[i].type)
affect_to_char(ch, &st->affected[i]);
}
Directly below that, add:
#ifdef I3
i3init_char( ch );
load_i3_pfile(ch);
#endif
Locate the following in char_to_store:
if (GET_TITLE(ch))
strcpy(st->title, GET_TITLE(ch));
else
*st->title = '\0';
Directly below that, add:
#ifdef I3
save_i3_pfile(ch);
#endif
Locate the following in free_char:
int i;
struct alias_data *a;
if (ch->player_specials != NULL && ch->player_specials != &dummy_mob) {
Directly below that, add:
#ifdef I3
free_i3chardata( ch );
#endif
Scroll to the end of db.c and add the following function:
#ifdef I3
/*
* Grab one word, ignoring preceding whitespace. Will
* eat a single whitespace immediately after the word.
*/
char *i3_fread_word( char *buf, size_t len, FILE *fp )
{
size_t copied = 0;
char cur_char;
if( !buf || len == 0 )
return buf;
*buf = '\0';
do
{
cur_char = fgetc( fp );
}
while( isspace( cur_char ) );
if( cur_char == EOF )
return buf;
do
{
buf[copied++] = cur_char;
cur_char = fgetc( fp );
}
while( copied < len && !isspace( cur_char ) && cur_char != EOF );
return buf;
}
#endif
5. Open db.h and locate the following:
#define LIB_PLROBJS ":plrobjs:"
#define LIB_PLRALIAS ":plralias:"
Directly below that, add:
#define LIB_PLRI3 ":plri3:"
Then locate the following:
#define LIB_PLROBJS "plrobjs/"
#define LIB_PLRALIAS "plralias/"
Directly below that, add:
#define LIB_PLRI3 "plri3/"
Then locate the following:
#define SUF_OBJS "objs"
#define SUF_TEXT "text"
#define SUF_ALIAS "alias"
Directly below that, add:
#define SUF_I3 "i3"
6. Open interpreter.c and locate the following:
#include "handler.h"
#include "mail.h"
#include "screen.h"
Directly below that, add:
#ifdef I3
#include "i3.h"
#endif
Then locate the following in command_interpreter:
if (*cmd_info[cmd].command == '\n')
send_to_char("Huh?!?\r\n", ch);
Change it to read as follows:
if ( *cmd_info[cmd].command == '\n' )
#ifdef I3
{
if( !I3_command_hook(ch, arg, line) )
#endif
send_to_char("WTF?!?\r\n", ch);
#ifdef I3
}
#endif
7. Open structs.h and locate the following:
char *poofin; /* Description on arrival of a god. */
char *poofout; /* Description upon a god's exit. */
struct alias_data *aliases; /* Character's aliases */
long last_tell; /* idnum of last tell from */
void *last_olc_targ; /* olc control */
int last_olc_mode; /* olc control */
Directly below that, add:
#ifdef I3
struct i3char_data *i3chardata;
#endif
8. Open utils.c and locate the following:
case ETEXT_FILE:
prefix = LIB_PLRTEXT;
suffix = SUF_TEXT;
break;
Directly below that, add:
case I3_FILE:
prefix = LIB_PLRI3;
suffix = SUF_I3;
break;
9. Open utils.h and locate the following:
/* get_filename() */
#define CRASH_FILE 0
#define ETEXT_FILE 1
#define ALIAS_FILE 2
Directly below that, add:
#define I3_FILE 3
10. From the main directory, under lib, make a directory named plri3
Inside the plri3 directory, issue the following command:
mkdir A-E F-J K-O P-T U-Z ZZZ
11. Run your configure script according to the directions that came with Circle.
Return to the main I3.txt file and continue where you left off.