Installation for Merc
---------------------
1. In your Makefile, above the list of O_FILES,
include the following:
#I3 - Comment out to disable I3 support
I3 = 1
Then directly below the list of O_FILES, add the following:
[Note: BSD users - put a period in front of the word ifdef, and in front of the word endif]
ifdef I3
O_FILES := i3.o $(O_FILES)
C_FLAGS := $(C_FLAGS) -DI3 -DI3MERC
endif
2. Open merc.h and locate the following code:
#define PULSE_PER_SECOND 4
#define PULSE_VIOLENCE ( 3 * PULSE_PER_SECOND)
#define PULSE_MOBILE ( 4 * PULSE_PER_SECOND)
#define PULSE_TICK (30 * PULSE_PER_SECOND)
#define PULSE_AREA (60 * PULSE_PER_SECOND)
Directly below that, add the following:
#ifdef I3
#include "i3.h"
#endif
3. Locate your pc_data struct, which should be in one of your main *.h files.
Add the following to the end of it:
#ifdef I3
I3_CHARDATA *i3chardata;
#endif
4. Open interp.c and locate the following section:
if ( !check_social( ch, command, argument )
Add the following condition to whatever series of ifchecks exist there:
#ifdef I3
&& !I3_command_hook( ch, command, argument )
#endif
5. Open comm.c and locate main():
A. If your mud uses copyover/hotboot, find this section( it may not look EXACTLY like this, adjust as needed ):
If your mud does NOT use copyover/hotboot, move to B.
if( argv[2] && argv[2][0] )
{
fCopyOver = TRUE;
control = atoi( argv[3] );
}
else
fCopyOver = FALSE;
Change it to read as( while adjusting as needed ):
if( argv[2] && argv[2][0] )
{
fCopyOver = TRUE;
control = atoi( argv[3] );
#ifdef I3
I3_socket = atoi( argv[4] );
#endif
}
else
fCopyOver = FALSE;
This next part is somewhat tricky. If copyover_recover is called in db.c as is the usual case in
most default installs, you need to place the following BEFORE the boot_db call. If it is listed
somewhere here in comm.c, the following needs to be placed ABOVE it. Either way, I3_main needs
to be called BEFORE copyover_recover or your mud WILL crash every time you do a copyover.
#ifdef I3
/* Initialize and connect to Intermud-3 */
I3_main( FALSE, port, fCopyOver );
#endif
B. If your mud is NOT using copyover/hotboot:
Locate the following:
#if defined(unix)
control = init_socket( port );
boot_db( );
sprintf( log_buf, "Merc is ready to rock on port %d.", port );
log_string( log_buf );
Add the following beneath that:
#ifdef I3
/* Initialize and connect to Intermud-3 */
I3_main( FALSE, port, FALSE );
#endif
C. ALL MUDS CONTINUE HERE:
Then further down in main(), locate the following:
while ( descriptor_list )
close_socket( descriptor_list );
Add the following beneath that:
#ifdef I3
I3_shutdown( 0 );
#endif
Then in game_loop_unix(), locate the following:
/*
* Autonomous game motion.
*/
update_handler( );
Directly ABOVE that, add the following:
#ifdef I3
I3_loop();
#endif
Then locate function act, and find the following code:
switch ( *str )
{
default: log_error( "Act: bad code %c.", *str );
log_error( "Act: Bad code came from %s", ch->name );
i = " <@@@> "; break;
Directly below that, add the following:
#ifdef I3
case '$':
i = "$";
break;
#endif
6. Open save.c and locate fread_char:
Find:
case 'L':
KEY( "Level", ch->level, fread_number( fp ) );
KEY( "LongDescr", ch->long_descr, fread_string( fp ) );
break;
*ABOVE* that, add:
case 'I':
#ifdef I3
if( ( fMatch = i3_loadchar( ch, fp, word ) ) )
break;
#endif
break;
Then in fwrite_char, locate:
fprintf( fp, "End\n\n" );
Directly ABOVE that, add:
#ifdef I3
i3save_char( ch, fp );
#endif
Then in load_char_obj(), locate the following:
found = FALSE;
fclose( fpReserve );
/* parsed player file directories by Yaz of 4th Realm */
/* decompress if .gz file exists - Thx Alander */
Directly ABOVE that, add the following:
#ifdef I3
i3init_char( ch );
#endif
7. Open db.c
Locate free_char:
Under the following block of code:
free_string( ch->pcdata->pwd );
free_string( ch->pcdata->bamfin );
free_string( ch->pcdata->bamfout );
free_string( ch->pcdata->title );
Add:
#ifdef I3
free_i3chardata( ch );
#endif
8. For users of copyover only - Target code may not be exact:
In function do_copyover, locate the following code:
DESCRIPTOR_DATA *d, *de_next;
char buf [100], buf2[100], buf3[100], buf4[100], buf5[100];
Directly below that, add:
char buf6[100];
Then further down, find the following:
/* exec - descriptors are inherited */
sprintf( buf, "%d", port );
sprintf( buf2, "%d", control );
sprintf( buf3, "%d", control2 );
sprintf( buf4, "%d", conclient );
sprintf( buf5, "%d", conjava );
execl( EXE_FILE, "merc", buf, "hotboot", buf2, buf3, buf4, buf5, (char *)NULL );
Change that to read as follows:
#ifdef I3
if( I3_is_connected() )
{
I3_savechanlist();
I3_savemudlist();
I3_savehistory();
}
#endif
/* exec - descriptors are inherited */
sprintf( buf, "%d", port );
sprintf( buf2, "%d", control );
sprintf( buf3, "%d", control2 );
sprintf( buf4, "%d", conclient );
sprintf( buf5, "%d", conjava );
#ifdef I3
snprintf( buf6, 100, "%d", I3_socket );
#else
strncpy( buf6, "-1", 100 );
#endif
execl( EXE_FILE, "merc", buf, "hotboot", buf2, buf3, buf4, buf5, buf6, (char *)NULL );
8b. Envy 2.2 ONLY:
Go back to save.c, and locate the following in fread_char:
else
{
sprintf( buf, "fread_char: Unknown key '%s' in pfile.", word );
log_error( buf, 0 );
fread_to_eol( fp );
}
Directly ABOVE that, add:
#ifdef I3
else if( i3_loadchar( ch, fp, word ) )
;
#endif
8c. NiMud 4 ONLY:
For the db.c section, apply the changes to free_char in mem.c
In i3.c, under the #ifdef I3MERC section near the top, change:
#include "merc.h"
To:
#include "mud.h"
8d. EOS2 ONLY:
In i3.c, function i3log, find:
log_string( buf );
Replace with:
log_string( buf, CHANNEL_LOG, -1 );
Return to the main I3.txt file and continue where you left off.