Installation for tbaMud-3.56
————————–
1. In the Makefile.in file, find:
#flags for profiling (see hacker.doc for more information)
PROFILE =
Directly below that, add:
#IMC2 - Comment out to disable IMC2 support
IMC = 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 IMC
CXREF_FILES += imc.c sha256.c
OBJFILES += imc.o sha256.o
CFLAGS += -DIMC -DIMCCIRCLE
endif
2. Open act.social.c and at the bottom, add the following:
/* For IMC */
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 IMC
#include "structs.h"
#include "imc/imc.h"
#endif
Locate function init_game, and find the following:
/* set up hash table for find_char() */
init_lookup_table();
boot_db();
Directly below that, add the following:
#ifdef IMC
imc_startup(FALSE, -1, FALSE); // FALSE arg, so the autoconnect setting can govern it.
#endif
Locate the following:
log("Closing all sockets.");
while (descriptor_list)
close_socket(descriptor_list);
CLOSE_SOCKET(mother_desc);
Directly below that, add the following:
#ifdef IMC
imc_shutdown(FALSE);
#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 IMC
imc_loop();
#endif
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 IMC
int top_desc = this_imcmud != NULL ? MAX( mother_desc, this_imcmud->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 IMC
if ( this_imcmud != NULL && this_imcmud->desc != -1 )
FD_SET(this_imcmud->desc, &input_set);
#endif
if (select(top_desc + 1, &input_set, (fd_set *) 0, (fd_set *) 0, NULL) < 0) {
4. Open db.c and locate the following:
#include "dg_scripts.h"
#include "dg_event.h"
#ifdef IMC
#include "imc/imc.h"
#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 IMC
imc_freechardata(ch);
#endif
5. Open db.h and locate the following:
#define LIB_PLROBJS ":plrobjs:"
#define LIB_PLRVARS ":plrvars:"
Directly below that, add:
#define LIB_PLRIMC ":plrimc:"
Then locate the following:
#define LIB_PLROBJS "plrobjs/"
#define LIB_PLRVARS "plrvars/"
Directly below that, add:
#define LIB_PLRIMC "plrimc/"
Then locate the following:
#define SUF_OBJS "objs"
#define SUF_TEXT "text"
#define SUF_MEM "mem"
Directly below that, add:
#define SUF_IMC "imc"
6. Open interpreter.c and locate the following:
#include "improved-edit.h"
#include "dg_scripts.h"
#include "constants.h"
Directly below that, add:
#ifdef IMC
#include "imc/imc.h"
#endif
Then locate the following in command_interpreter:
if (*complete_cmd_info[cmd].command == '\n') {
int found = 0;
send_to_char(ch, "Huh!?!\r\n");
Change it to read as follows:
if (*complete_cmd_info[cmd].command == '\n') {
int found = 0;
#ifdef IMC
if( !imc_command_hook(ch, arg, line) ) {
#endif
send_to_char(ch, "Huh!?!\r\n");
locate the following:
send_to_char(ch, " %s\r\n", cmd_info[cmd].command);
}
}
}
Directly below that, add:
#ifdef IMC
}
#endif
locate the following:
init_char(d->character);
Directly below that, add:
#ifdef IMC
imc_initchar(d->character);
#endif
7. Open players.c and locate the following:
#include "dg_scripts.h"
#include "comm.h"
#include "interpreter.h"
Directly below that, add:
#ifdef IMC
#include "imc/imc.h"
#endif
Locate the following:
void load_HMVS(struct char_data *ch, const char *line, int mode);
void write_aliases_ascii(FILE *file, struct char_data *ch);
void read_aliases_ascii(FILE *file, struct char_data *ch, int count);
Directly below that, add the following:
#ifdef IMC
void load_imc_pfile( struct char_data *ch );
char *imc_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 IMC
void save_imc_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, IMC_FILE))
return;
#else
if (!get_filename(filename, sizeof(filename), IMC_FILE, GET_PC_NAME(ch)))
return;
#endif
if (!(fl = fopen(filename, "w")))
{
if (errno != ENOENT)
log("SYSERR: opening IMC2 file '%s' for writing: %s", filename, strerror(errno));
return;
}
imc_savechar(ch, fl);
fclose(fl);
}
void load_imc_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, IMC_FILE))
return;
#else
if (!get_filename(filename, sizeof(filename), IMC_FILE, GET_PC_NAME(ch)))
return;
#endif
if (!(fl = fopen(filename, "r")))
{
if (errno != ENOENT)
log("SYSERR: opening IMC2 file '%s' for reading: %s", filename, strerror(errno));
return;
}
for (;;)
{
imc_fread_word(word, sizeof(word), fl);
if (*word != 'I')
break;
imc_loadchar(ch, fl, word);
}
fclose(fl);
}
#endif
Locate the following code in load_char:
GET_COND(ch, DRUNK) = -1;
}
fclose(fl);
Directly below that, add:
#ifdef IMC
imc_initchar(ch);
load_imc_pfile(ch);
#endif
Locate the following in save_char:
/* More char_to_store code to add spell and eq affections back in. */
for (i = 0; i < MAX_AFFECT; i++) {
if (tmp_aff[i].type)
affect_to_char(ch, &tmp_aff[i]);
}
Directly below that, add:
#ifdef IMC
save_imc_pfile(ch);
#endif
Scroll to the end of player.c and add the following function:
#ifdef IMC
/*
* Grab one word, ignoring preceding whitespace. Will
* eat a single whitespace immediately after the word.
*/
char *imc_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
8. 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 */
char *host; /* player host */
Directly below that, add:
#ifdef IMC
struct imcchar_data *imcchardata;
#endif
locate the following:
#define _TBAMUD
add the following:
*/ we will need this untill imc is rewritten for tbaMUD, otherwise find all
_CIRCLEMUD in the code and change to _TBAMUD
*/
#define _CIRCLEMUD _TBAMUD
9. Open utils.c and locate the following:
case SCRIPT_VARS_FILE:
prefix = LIB_PLRVARS;
suffix = SUF_MEM;
break;
Directly below that, add:
case IMC_FILE:
prefix = LIB_PLRIMC;
suffix = SUF_IMC;
break;
10. Open utils.h and locate the following:
#define ETEXT_FILE 1
#define SCRIPT_VARS_FILE 2
#define PLR_FILE 3
Directly below that, add:
#define IMC_FILE 4
change:
#define MAX_FILES 4
to:
#define MAX_FILES 5
imccfg.h
locate
/*
* This should be in an act.social.h, if it existed. Introducing
* it in an IMC patch would be too intrusive.
*/
struct social_messg
{
int act_nr;
int hide;
int min_victim_position;
char *char_no_arg;
char *others_no_arg;
char *char_found;
char *others_found;
char *vict_found;
char *not_found;
char *char_auto;
char *others_auto;
};
/*
* UNCOMMENT if mud has Ascii Pfile code installed.
*/
/*
* #include "diskio.h"
*/
and delete it.
11. From the main directory, under lib, make a directory named plrimc
Inside the plrimc directory, issue the following command:
mkdir A-E F-J K-O P-T U-Z ZZZ
12. I am not sure this is the best solution, but it seems to work.
Open imc.c and locate
else if( iErr == EAGAIN )
break;
And change to:
else if( iErr == EAGAIN || iErr == EWOULDBLOCK )
break;
13. place imc.c, imc.h, sha26.c, sha26.h and imccfg.h in src/imc folder
14. in imc.c
find
#if defined(IMCCIRCLE)
#include "conf.h"
#include "sysdep.h"
#include "structs.h"
#include "utils.h"
#include "comm.h"
#include "db.h"
#include "handler.h"
#include "interpreter.h"
#include "imc.h"
#endif
change to
#if defined(IMCCIRCLE)
#include "../conf.h"
#include "../sysdep.h"
#include "../structs.h"
#include "../utils.h"
#include "../comm.h"
#include "../db.h"
#include "../handler.h"
#include "../interpreter.h"
#include "imc.h"
#endif
15. in imc.h
change
#define IMC_DIR "imc/"
to
#define IMC_DIR "../imc/"
16. Run your configure script according to the directions that came with tbaMUD.
Return to the main IMC.txt file and continue where you left off.