diff -ur old/act_comm.c new/act_comm.c
--- old/act_comm.c 1998-05-27 16:23:48.000000000 -0700
+++ new/act_comm.c 2007-02-03 08:34:13.000000000 -0800
@@ -753,6 +753,18 @@
act( "$n says '$T'", ch, NULL, argument, TO_ROOM );
act( "You say '$T'", ch, NULL, argument, TO_CHAR );
+
+ if ( !IS_NPC(ch) )
+ {
+ CHAR_DATA *mob, *mob_next;
+ for ( mob = ch->in_room->people; mob != NULL; mob = mob_next )
+ {
+ mob_next = mob->next_in_room;
+ if ( IS_NPC(mob) && HAS_TRIGGER( mob, TRIG_SPEECH )
+ && mob->position == mob->pIndexData->default_pos )
+ mp_act_trigger( argument, mob, ch, NULL, NULL, TRIG_SPEECH );
+ }
+ }
return;
}
@@ -893,6 +905,9 @@
act_new("$n tells you '$t'",ch,argument,victim,TO_VICT,POS_DEAD);
victim->reply = ch;
+ if ( !IS_NPC(ch) && IS_NPC(victim) && HAS_TRIGGER(victim,TRIG_SPEECH) )
+ mp_act_trigger( argument, victim, ch, NULL, NULL, TRIG_SPEECH );
+
return;
}
@@ -1018,8 +1033,10 @@
return;
}
+ MOBtrigger = FALSE;
act( "$n $T", ch, NULL, argument, TO_ROOM );
act( "$n $T", ch, NULL, argument, TO_CHAR );
+ MOBtrigger = TRUE;
return;
}
@@ -1052,7 +1069,9 @@
if ((letter = strstr(argument,vch->name)) == NULL)
{
+ MOBtrigger = FALSE;
act("$N $t",vch,argument,ch,TO_CHAR);
+ MOBtrigger = TRUE;
continue;
}
@@ -1102,7 +1121,9 @@
name = vch->name;
}
+ MOBtrigger = FALSE;
act("$N $t",vch,temp,ch,TO_CHAR);
+ MOBtrigger = TRUE;
}
return;
@@ -1619,7 +1640,7 @@
argument = one_argument( argument, arg );
one_argument(argument,arg2);
- if (!str_cmp(arg2,"delete"))
+ if (!str_cmp(arg2,"delete") || !str_cmp(arg2,"mob"))
{
send_to_char("That will NOT be done.\n\r",ch);
return;
diff -ur old/act_enter.c new/act_enter.c
--- old/act_enter.c 1998-05-27 17:37:33.000000000 -0700
+++ new/act_enter.c 2007-02-03 08:34:13.000000000 -0800
@@ -206,6 +206,16 @@
}
extract_obj(portal);
}
+
+ /*
+ * If someone is following the char, these triggers get activated
+ * for the followers before the char, but it's safer this way...
+ */
+ if ( IS_NPC( ch ) && HAS_TRIGGER( ch, TRIG_ENTRY ) )
+ mp_percent_trigger( ch, NULL, NULL, NULL, TRIG_ENTRY );
+ if ( !IS_NPC( ch ) )
+ mp_greet_trigger( ch );
+
return;
}
diff -ur old/act_info.c new/act_info.c
--- old/act_info.c 2007-02-03 07:14:32.000000000 -0800
+++ new/act_info.c 2007-02-03 08:34:13.000000000 -0800
@@ -1027,7 +1027,8 @@
/* 'look' or 'look auto' */
send_to_char( ch->in_room->name, ch );
- if (IS_IMMORTAL(ch) && (IS_NPC(ch) || IS_SET(ch->act,PLR_HOLYLIGHT)))
+ if ( (IS_IMMORTAL(ch) && (IS_NPC(ch) || IS_SET(ch->act,PLR_HOLYLIGHT)))
+ || IS_BUILDER(ch, ch->in_room->area) )
{
sprintf(buf," [Room %d]",ch->in_room->vnum);
send_to_char(buf,ch);
diff -ur old/act_move.c new/act_move.c
--- old/act_move.c 1998-05-27 17:40:32.000000000 -0700
+++ new/act_move.c 2007-02-03 08:34:13.000000000 -0800
@@ -76,6 +76,12 @@
return;
}
+ /*
+ * Exit trigger, if activated, bail out. Only PCs are triggered.
+ */
+ if ( !IS_NPC(ch) && mp_exit_trigger( ch, door ) )
+ return;
+
in_room = ch->in_room;
if ( ( pexit = in_room->exit[door] ) == NULL
|| ( to_room = pexit->u1.to_room ) == NULL
@@ -231,6 +237,15 @@
}
}
+ /*
+ * If someone is following the char, these triggers get activated
+ * for the followers before the char, but it's safer this way...
+ */
+ if ( IS_NPC( ch ) && HAS_TRIGGER( ch, TRIG_ENTRY ) )
+ mp_percent_trigger( ch, NULL, NULL, NULL, TRIG_ENTRY );
+ if ( !IS_NPC( ch ) )
+ mp_greet_trigger( ch );
+
return;
}
diff -ur old/act_obj.c new/act_obj.c
--- old/act_obj.c 2007-02-03 07:15:18.000000000 -0800
+++ new/act_obj.c 2007-02-03 08:34:13.000000000 -0800
@@ -721,6 +721,12 @@
sprintf(buf,"You give $N %d %s.",amount, silver ? "silver" : "gold");
act( buf, ch, NULL, victim, TO_CHAR );
+ /*
+ * Bribe trigger
+ */
+ if ( IS_NPC(victim) && HAS_TRIGGER( victim, TRIG_BRIBE ) )
+ mp_bribe_trigger( victim, ch, silver ? amount : amount * 100 );
+
if (IS_NPC(victim) && IS_SET(victim->act,ACT_IS_CHANGER))
{
int change;
@@ -816,9 +822,18 @@
obj_from_char( obj );
obj_to_char( obj, victim );
+ MOBtrigger = FALSE;
act( "$n gives $p to $N.", ch, obj, victim, TO_NOTVICT );
act( "$n gives you $p.", ch, obj, victim, TO_VICT );
act( "You give $p to $N.", ch, obj, victim, TO_CHAR );
+ MOBtrigger = TRUE;
+
+ /*
+ * Give trigger
+ */
+ if ( IS_NPC(victim) && HAS_TRIGGER( victim, TRIG_GIVE ) )
+ mp_give_trigger( victim, ch, obj );
+
return;
}
diff -ur old/act_wiz.c new/act_wiz.c
--- old/act_wiz.c 1998-05-28 13:14:17.000000000 -0700
+++ new/act_wiz.c 2007-02-03 08:34:13.000000000 -0800
@@ -1692,6 +1692,12 @@
victim->pet ? victim->pet->name : "(none)");
send_to_char( buf, ch );
+ if (!IS_NPC(victim))
+ {
+ sprintf( buf, "Security: %d.\n\r", victim->pcdata->security ); /* OLC */
+ send_to_char( buf, ch ); /* OLC */
+ }
+
sprintf( buf, "Short description: %s\n\rLong description: %s",
victim->short_descr,
victim->long_descr[0] != '\0' ? victim->long_descr : "(none)\n\r" );
@@ -3343,6 +3349,7 @@
send_to_char( " str int wis dex con sex class level\n\r", ch );
send_to_char( " race group gold silver hp mana move prac\n\r",ch);
send_to_char( " align train thirst hunger drunk full\n\r", ch );
+ send_to_char( " security\n\r", ch );
return;
}
@@ -3378,6 +3385,38 @@
return;
}
+ if ( !str_cmp( arg2, "security" ) ) /* OLC */
+ {
+ if ( IS_NPC(ch) )
+ {
+ send_to_char( "Si, claro.\n\r", ch );
+ return;
+ }
+
+ if ( IS_NPC( victim ) )
+ {
+ send_to_char( "Not on NPC's.\n\r", ch );
+ return;
+ }
+
+ if ( value > ch->pcdata->security || value < 0 )
+ {
+ if ( ch->pcdata->security != 0 )
+ {
+ sprintf( buf, "Valid security is 0-%d.\n\r",
+ ch->pcdata->security );
+ send_to_char( buf, ch );
+ }
+ else
+ {
+ send_to_char( "Valid security is 0 only.\n\r", ch );
+ }
+ return;
+ }
+ victim->pcdata->security = value;
+ return;
+ }
+
if ( !str_cmp( arg2, "int" ) )
{
if ( value < 3 || value > get_max_train(victim,STAT_INT) )
@@ -4103,7 +4142,7 @@
one_argument(argument,arg2);
- if (!str_cmp(arg2,"delete"))
+ if (!str_cmp(arg2,"delete") || !str_prefix(arg2,"mob"))
{
send_to_char("That will NOT be done.\n\r",ch);
return;
Only in new: bit.c
diff -ur old/comm.c new/comm.c
--- old/comm.c 2007-02-03 07:16:38.000000000 -0800
+++ new/comm.c 2007-02-03 08:44:56.000000000 -0800
@@ -56,6 +56,8 @@
#include <string.h>
#include <stdlib.h>
#include <time.h>
+#include <unistd.h> /* OLC -- for close read write etc */
+#include <stdarg.h> /* printf_to_char */
#include "merc.h"
#include "interp.h"
@@ -173,11 +175,11 @@
int close args( ( int fd ) );
int gettimeofday args( ( struct timeval *tp, struct timezone *tzp ) );
-int read args( ( int fd, char *buf, int nbyte ) );
+/* int read args( ( int fd, char *buf, int nbyte ) ); */
int select args( ( int width, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout ) );
int socket args( ( int domain, int type, int protocol ) );
-int write args( ( int fd, char *buf, int nbyte ) );
+/* int write args( ( int fd, char *buf, int nbyte ) ); */ /* read,write in unistd.h */
#endif
#if defined(macintosh)
@@ -305,7 +307,7 @@
bool newlock; /* Game is newlocked */
char str_boot_time[MAX_INPUT_LENGTH];
time_t current_time; /* time of this pulse */
-
+bool MOBtrigger = TRUE; /* act() switch */
/*
@@ -516,6 +518,9 @@
dcon.next = descriptor_list;
dcon.showstr_head = NULL;
dcon.showstr_point = NULL;
+ dcon.pEdit = NULL; /* OLC */
+ dcon.pString = NULL; /* OLC */
+ dcon.editor = 0; /* OLC */
descriptor_list = &dcon;
/*
@@ -573,10 +578,23 @@
d->fcommand = TRUE;
stop_idling( d->character );
- if ( d->connected == CON_PLAYING )
- substitute_alias( d, d->incomm );
- else
- nanny( d, d->incomm );
+ /* OLC */
+ if ( d->showstr_point )
+ show_string( d, d->incomm );
+ else
+ if ( d->pString )
+ string_add( d->character, d->incomm );
+ else
+ switch ( d->connected )
+ {
+ case CON_PLAYING:
+ if ( !run_olc_editor( d ) )
+ substitute_alias( d, d->incomm );
+ break;
+ default:
+ nanny( d, d->incomm );
+ break;
+ }
d->incomm[0] = '\0';
}
@@ -762,12 +780,23 @@
d->fcommand = TRUE;
stop_idling( d->character );
- if (d->showstr_point)
- show_string(d,d->incomm);
- else if ( d->connected == CON_PLAYING )
- substitute_alias( d, d->incomm );
- else
+ /* OLC */
+ if ( d->showstr_point )
+ show_string( d, d->incomm );
+ else
+ if ( d->pString )
+ string_add( d->character, d->incomm );
+ else
+ switch ( d->connected )
+ {
+ case CON_PLAYING:
+ if ( !run_olc_editor( d ) )
+ substitute_alias( d, d->incomm );
+ break;
+ default:
nanny( d, d->incomm );
+ break;
+ }
d->incomm[0] = '\0';
}
@@ -892,6 +921,9 @@
dnew->showstr_head = NULL;
dnew->showstr_point = NULL;
dnew->outsize = 2000;
+ dnew->pEdit = NULL; /* OLC */
+ dnew->pString = NULL; /* OLC */
+ dnew->editor = 0; /* OLC */
dnew->outbuf = alloc_mem( dnew->outsize );
size = sizeof(sock);
@@ -1221,79 +1253,80 @@
/*
* Bust a prompt.
*/
- if (!merc_down && d->showstr_point)
- write_to_buffer(d,"[Hit Return to continue]\n\r",0);
- else if (fPrompt && !merc_down && d->connected == CON_PLAYING)
- {
- CHAR_DATA *ch;
- CHAR_DATA *victim;
-
- ch = d->character;
-
- /* battle prompt */
- if ((victim = ch->fighting) != NULL && can_see(ch,victim))
- {
- int percent;
- char wound[100];
- char buf[MAX_STRING_LENGTH];
+ if ( !merc_down )
+ { if ( d->showstr_point )
+ write_to_buffer( d, "[Hit Return to continue]\n\r", 0 );
+ else if ( fPrompt && d->pString && d->connected == CON_PLAYING )
+ write_to_buffer( d, "> ", 2 );
+ else if ( fPrompt && d->connected == CON_PLAYING )
+ {
+ CHAR_DATA *ch;
+ CHAR_DATA *victim;
+
+ ch = d->character;
+
+ /* battle prompt */
+ if ((victim = ch->fighting) != NULL && can_see(ch,victim))
+ { int percent;
+ char wound[100];
+ char buf[MAX_STRING_LENGTH];
- if (victim->max_hit > 0)
- percent = victim->hit * 100 / victim->max_hit;
- else
- percent = -1;
+ if (victim->max_hit > 0)
+ percent = victim->hit * 100 / victim->max_hit;
+ else
+ percent = -1;
- if (percent >= 100)
- sprintf(wound,"is in excellent condition.");
- else if (percent >= 90)
- sprintf(wound,"has a few scratches.");
- else if (percent >= 75)
- sprintf(wound,"has some small wounds and bruises.");
- else if (percent >= 50)
- sprintf(wound,"has quite a few wounds.");
- else if (percent >= 30)
- sprintf(wound,"has some big nasty wounds and scratches.");
- else if (percent >= 15)
- sprintf(wound,"looks pretty hurt.");
- else if (percent >= 0)
- sprintf(wound,"is in awful condition.");
- else
- sprintf(wound,"is bleeding to death.");
+ if (percent >= 100)
+ sprintf(wound,"is in excellent condition.");
+ else if (percent >= 90)
+ sprintf(wound,"has a few scratches.");
+ else if (percent >= 75)
+ sprintf(wound,"has some small wounds and bruises.");
+ else if (percent >= 50)
+ sprintf(wound,"has quite a few wounds.");
+ else if (percent >= 30)
+ sprintf(wound,"has some big nasty wounds and scratches.");
+ else if (percent >= 15)
+ sprintf(wound,"looks pretty hurt.");
+ else if (percent >= 0)
+ sprintf(wound,"is in awful condition.");
+ else
+ sprintf(wound,"is bleeding to death.");
- sprintf(buf,"%s %s \n\r",
+ sprintf(buf,"%s %s \n\r",
IS_NPC(victim) ? victim->short_descr : victim->name,wound);
- buf[0] = UPPER(buf[0]);
- write_to_buffer( d, buf, 0);
- }
-
-
- ch = d->original ? d->original : d->character;
- if (!IS_SET(ch->comm, COMM_COMPACT) )
- write_to_buffer( d, "\n\r", 2 );
+ buf[0] = UPPER(buf[0]);
+ write_to_buffer( d, buf, 0);
+ }
- if ( IS_SET(ch->comm, COMM_PROMPT) )
- bust_a_prompt( d->character );
+ ch = d->original ? d->original : d->character;
+ if (!IS_SET(ch->comm, COMM_COMPACT) )
+ write_to_buffer( d, "\n\r", 2 );
- if (IS_SET(ch->comm,COMM_TELNET_GA))
- write_to_buffer(d,go_ahead_str,0);
- }
- /*
- * Short-circuit if nothing to write.
- */
- if ( d->outtop == 0 )
- return TRUE;
+ if ( IS_SET(ch->comm, COMM_PROMPT) )
+ bust_a_prompt( d->character );
- /*
- * Snoop-o-rama.
- */
- if ( d->snoop_by != NULL )
- {
- if (d->character != NULL)
- write_to_buffer( d->snoop_by, d->character->name,0);
- write_to_buffer( d->snoop_by, "> ", 2 );
- write_to_buffer( d->snoop_by, d->outbuf, d->outtop );
- }
+ if (IS_SET(ch->comm,COMM_TELNET_GA))
+ write_to_buffer(d,go_ahead_str,0);
+ }
+ }
+ /*
+ * Short-circuit if nothing to write.
+ */
+ if ( d->outtop == 0 )
+ return TRUE;
+
+ /*
+ * Snoop-o-rama.
+ */
+ if ( d->snoop_by != NULL )
+ { if (d->character != NULL)
+ write_to_buffer( d->snoop_by, d->character->name,0);
+ write_to_buffer( d->snoop_by, "> ", 2 );
+ write_to_buffer( d->snoop_by, d->outbuf, d->outtop );
+ }
/*
* OS-dependent output.
@@ -1440,6 +1473,12 @@
case '%' :
sprintf( buf2, "%%" );
i = buf2; break;
+ case 'o' :
+ sprintf( buf2, "%s", olc_ed_name(ch) );
+ i = buf2; break;
+ case 'O' :
+ sprintf( buf2, "%s", olc_ed_vnum(ch) );
+ i = buf2; break;
}
++str;
while( (*point = *i) != '\0' )
@@ -2146,7 +2185,7 @@
* Reserved words.
*/
if (is_exact_name(name,
- "all auto immortal self someone something the you loner"))
+ "all auto immortal self someone something the you loner none"))
{
return FALSE;
}
@@ -2472,7 +2511,9 @@
for ( ; to != NULL; to = to->next_in_room )
{
- if ( to->desc == NULL || to->position < min_pos )
+ if ( (!IS_NPC(to) && to->desc == NULL )
+ || ( IS_NPC(to) && !HAS_TRIGGER(to, TRIG_ACT) )
+ || to->position < min_pos )
continue;
if ( (type == TO_CHAR) && to != ch )
@@ -2551,10 +2592,14 @@
*point++ = '\n';
*point++ = '\r';
+ *point = '\0';
buf[0] = UPPER(buf[0]);
+ if ( to->desc != NULL )
write_to_buffer( to->desc, buf, point - buf );
+ else
+ if ( MOBtrigger )
+ mp_act_trigger( buf, to, ch, arg1, arg2, TRIG_ACT );
}
-
return;
}
@@ -2570,3 +2615,27 @@
tp->tv_usec = 0;
}
#endif
+
+/* source: EOD, by John Booth <???> */
+
+void printf_to_char (CHAR_DATA *ch, char *fmt, ...)
+{
+ char buf [MAX_STRING_LENGTH];
+ va_list args;
+ va_start (args, fmt);
+ vsprintf (buf, fmt, args);
+ va_end (args);
+
+ send_to_char (buf, ch);
+}
+
+void bugf (char * fmt, ...)
+{
+ char buf [2*MSL];
+ va_list args;
+ va_start (args, fmt);
+ vsprintf (buf, fmt, args);
+ va_end (args);
+
+ bug (buf, 0);
+}
diff -ur old/db2.c new/db2.c
--- old/db2.c 1998-05-23 15:27:26.000000000 -0700
+++ new/db2.c 2007-02-03 08:34:13.000000000 -0800
@@ -39,8 +39,10 @@
#include "merc.h"
#include "db.h"
+#include "tables.h"
#include "lookup.h"
+extern int flag_lookup args((const char *name, const struct flag_type *flag_table));
/* values for db2.c */
struct social_type social_table [MAX_SOCIALS];
@@ -188,6 +190,12 @@
{
MOB_INDEX_DATA *pMobIndex;
+ if ( !area_last ) /* OLC */
+ {
+ bug( "Load_mobiles: no #AREA seen yet.", 0 );
+ exit( 1 );
+ }
+
for ( ; ; )
{
sh_int vnum;
@@ -215,6 +223,7 @@
pMobIndex = alloc_perm( sizeof(*pMobIndex) );
pMobIndex->vnum = vnum;
+ pMobIndex->area = area_last; /* OLC */
pMobIndex->new_format = TRUE;
newmobs++;
pMobIndex->player_name = fread_string( fp );
@@ -287,7 +296,8 @@
pMobIndex->parts = fread_flag( fp )
| race_table[pMobIndex->race].parts;
/* size */
- pMobIndex->size = size_lookup(fread_word(fp));
+ CHECK_POS( pMobIndex->size, size_lookup(fread_word(fp)), "size" );
+/* pMobIndex->size = size_lookup(fread_word(fp)); */
pMobIndex->material = str_dup(fread_word( fp ));
for ( ; ; )
@@ -324,6 +334,26 @@
exit(1);
}
}
+ else if ( letter == 'M' )
+ {
+ MPROG_LIST *pMprog;
+ char *word;
+ int trigger = 0;
+
+ pMprog = alloc_perm(sizeof(*pMprog));
+ word = fread_word( fp );
+ if ( (trigger = flag_lookup( word, mprog_flags )) == NO_FLAG )
+ {
+ bug("MOBprogs: invalid trigger.",0);
+ exit(1);
+ }
+ SET_BIT( pMobIndex->mprog_flags, trigger );
+ pMprog->trig_type = trigger;
+ pMprog->vnum = fread_number( fp );
+ pMprog->trig_phrase = fread_string( fp );
+ pMprog->next = pMobIndex->mprogs;
+ pMobIndex->mprogs = pMprog;
+ }
else
{
ungetc(letter,fp);
@@ -335,6 +365,8 @@
pMobIndex->next = mob_index_hash[iHash];
mob_index_hash[iHash] = pMobIndex;
top_mob_index++;
+ top_vnum_mob = top_vnum_mob < vnum ? vnum : top_vnum_mob; /* OLC */
+ assign_area_vnum( vnum ); /* OLC */
kill_table[URANGE(0, pMobIndex->level, MAX_LEVEL-1)].number++;
}
@@ -348,6 +380,12 @@
{
OBJ_INDEX_DATA *pObjIndex;
+ if ( !area_last ) /* OLC */
+ {
+ bug( "Load_objects: no #AREA seen yet.", 0 );
+ exit( 1 );
+ }
+
for ( ; ; )
{
sh_int vnum;
@@ -375,6 +413,7 @@
pObjIndex = alloc_perm( sizeof(*pObjIndex) );
pObjIndex->vnum = vnum;
+ pObjIndex->area = area_last; /* OLC */
pObjIndex->new_format = TRUE;
pObjIndex->reset_num = 0;
newobjs++;
@@ -382,8 +421,8 @@
pObjIndex->short_descr = fread_string( fp );
pObjIndex->description = fread_string( fp );
pObjIndex->material = fread_string( fp );
-
- pObjIndex->item_type = item_lookup(fread_word( fp ));
+
+ CHECK_POS(pObjIndex->item_type, item_lookup(fread_word( fp )), "item_type" );
pObjIndex->extra_flags = fread_flag( fp );
pObjIndex->wear_flags = fread_flag( fp );
switch(pObjIndex->item_type)
@@ -406,7 +445,7 @@
case ITEM_FOUNTAIN:
pObjIndex->value[0] = fread_number(fp);
pObjIndex->value[1] = fread_number(fp);
- pObjIndex->value[2] = liq_lookup(fread_word(fp));
+ CHECK_POS(pObjIndex->value[2], liq_lookup(fread_word(fp)), "liq_lookup" );
pObjIndex->value[3] = fread_number(fp);
pObjIndex->value[4] = fread_number(fp);
break;
@@ -534,8 +573,351 @@
pObjIndex->next = obj_index_hash[iHash];
obj_index_hash[iHash] = pObjIndex;
top_obj_index++;
+ top_vnum_obj = top_vnum_obj < vnum ? vnum : top_vnum_obj; /* OLC */
+ assign_area_vnum( vnum ); /* OLC */
}
return;
}
+/*****************************************************************************
+ Name: convert_objects
+ Purpose: Converts all old format objects to new format
+ Called by: boot_db (db.c).
+ Note: Loops over all resets to find the level of the mob
+ loaded before the object to determine the level of
+ the object.
+ It might be better to update the levels in load_resets().
+ This function is not pretty.. Sorry about that :)
+ Author: Hugin
+ ****************************************************************************/
+void convert_objects( void )
+{
+ int vnum;
+ AREA_DATA *pArea;
+ RESET_DATA *pReset;
+ MOB_INDEX_DATA *pMob = NULL;
+ OBJ_INDEX_DATA *pObj;
+ ROOM_INDEX_DATA *pRoom;
+
+ if ( newobjs == top_obj_index ) return; /* all objects in new format */
+
+ for ( pArea = area_first; pArea; pArea = pArea->next )
+ {
+ for ( vnum = pArea->min_vnum; vnum <= pArea->max_vnum; vnum++ )
+ {
+ if ( !( pRoom = get_room_index( vnum ) ) ) continue;
+
+ for ( pReset = pRoom->reset_first; pReset; pReset = pReset->next )
+ {
+ switch ( pReset->command )
+ {
+ case 'M':
+ if ( !( pMob = get_mob_index( pReset->arg1 ) ) )
+ bug( "Convert_objects: 'M': bad vnum %d.", pReset->arg1 );
+ break;
+
+ case 'O':
+ if ( !( pObj = get_obj_index( pReset->arg1 ) ) )
+ {
+ bug( "Convert_objects: 'O': bad vnum %d.", pReset->arg1 );
+ break;
+ }
+
+ if ( pObj->new_format )
+ continue;
+
+ if ( !pMob )
+ {
+ bug( "Convert_objects: 'O': No mob reset yet.", 0 );
+ break;
+ }
+
+ pObj->level = pObj->level < 1 ? pMob->level - 2
+ : UMIN(pObj->level, pMob->level - 2);
+ break;
+
+ case 'P':
+ {
+ OBJ_INDEX_DATA *pObj, *pObjTo;
+
+ if ( !( pObj = get_obj_index( pReset->arg1 ) ) )
+ {
+ bug( "Convert_objects: 'P': bad vnum %d.", pReset->arg1 );
+ break;
+ }
+
+ if ( pObj->new_format )
+ continue;
+
+ if ( !( pObjTo = get_obj_index( pReset->arg3 ) ) )
+ {
+ bug( "Convert_objects: 'P': bad vnum %d.", pReset->arg3 );
+ break;
+ }
+
+ pObj->level = pObj->level < 1 ? pObjTo->level
+ : UMIN(pObj->level, pObjTo->level);
+ }
+ break;
+
+ case 'G':
+ case 'E':
+ if ( !( pObj = get_obj_index( pReset->arg1 ) ) )
+ {
+ bug( "Convert_objects: 'E' or 'G': bad vnum %d.", pReset->arg1 );
+ break;
+ }
+
+ if ( !pMob )
+ {
+ bug( "Convert_objects: 'E' or 'G': null mob for vnum %d.",
+ pReset->arg1 );
+ break;
+ }
+
+ if ( pObj->new_format )
+ continue;
+
+ if ( pMob->pShop )
+ {
+ switch ( pObj->item_type )
+ {
+ default:
+ pObj->level = UMAX(0, pObj->level);
+ break;
+ case ITEM_PILL:
+ case ITEM_POTION:
+ pObj->level = UMAX(5, pObj->level);
+ break;
+ case ITEM_SCROLL:
+ case ITEM_ARMOR:
+ case ITEM_WEAPON:
+ pObj->level = UMAX(10, pObj->level);
+ break;
+ case ITEM_WAND:
+ case ITEM_TREASURE:
+ pObj->level = UMAX(15, pObj->level);
+ break;
+ case ITEM_STAFF:
+ pObj->level = UMAX(20, pObj->level);
+ break;
+ }
+ }
+ else
+ pObj->level = pObj->level < 1 ? pMob->level
+ : UMIN( pObj->level, pMob->level );
+ break;
+ } /* switch ( pReset->command ) */
+ }
+ }
+ }
+
+ /* do the conversion: */
+
+ for ( pArea = area_first; pArea ; pArea = pArea->next )
+ for ( vnum = pArea->min_vnum; vnum <= pArea->max_vnum; vnum++ )
+ if ( (pObj = get_obj_index( vnum )) )
+ if ( !pObj->new_format )
+ convert_object( pObj );
+
+ return;
+}
+
+
+
+/*****************************************************************************
+ Name: convert_object
+ Purpose: Converts an old_format obj to new_format
+ Called by: convert_objects (db2.c).
+ Note: Dug out of create_obj (db.c)
+ Author: Hugin
+ ****************************************************************************/
+void convert_object( OBJ_INDEX_DATA *pObjIndex )
+{
+ int level;
+ int number, type; /* for dice-conversion */
+
+ if ( !pObjIndex || pObjIndex->new_format ) return;
+
+ level = pObjIndex->level;
+
+ pObjIndex->level = UMAX( 0, pObjIndex->level ); /* just to be sure */
+ pObjIndex->cost = 10*level;
+
+ switch ( pObjIndex->item_type )
+ {
+ default:
+ bug( "Obj_convert: vnum %d bad type.", pObjIndex->item_type );
+ break;
+
+ case ITEM_LIGHT:
+ case ITEM_TREASURE:
+ case ITEM_FURNITURE:
+ case ITEM_TRASH:
+ case ITEM_CONTAINER:
+ case ITEM_DRINK_CON:
+ case ITEM_KEY:
+ case ITEM_FOOD:
+ case ITEM_BOAT:
+ case ITEM_CORPSE_NPC:
+ case ITEM_CORPSE_PC:
+ case ITEM_FOUNTAIN:
+ case ITEM_MAP:
+ case ITEM_CLOTHING:
+ case ITEM_SCROLL:
+ break;
+
+ case ITEM_WAND:
+ case ITEM_STAFF:
+ pObjIndex->value[2] = pObjIndex->value[1];
+ break;
+
+ case ITEM_WEAPON:
+
+ /*
+ * The conversion below is based on the values generated
+ * in one_hit() (fight.c). Since I don't want a lvl 50
+ * weapon to do 15d3 damage, the min value will be below
+ * the one in one_hit, and to make up for it, I've made
+ * the max value higher.
+ * (I don't want 15d2 because this will hardly ever roll
+ * 15 or 30, it will only roll damage close to 23.
+ * I can't do 4d8+11, because one_hit there is no dice-
+ * bounus value to set...)
+ *
+ * The conversion below gives:
+
+ level: dice min max mean
+ 1: 1d8 1( 2) 8( 7) 5( 5)
+ 2: 2d5 2( 3) 10( 8) 6( 6)
+ 3: 2d5 2( 3) 10( 8) 6( 6)
+ 5: 2d6 2( 3) 12(10) 7( 7)
+ 10: 4d5 4( 5) 20(14) 12(10)
+ 20: 5d5 5( 7) 25(21) 15(14)
+ 30: 5d7 5(10) 35(29) 20(20)
+ 50: 5d11 5(15) 55(44) 30(30)
+
+ */
+
+ number = UMIN(level/4 + 1, 5);
+ type = (level + 7)/number;
+
+ pObjIndex->value[1] = number;
+ pObjIndex->value[2] = type;
+ break;
+
+ case ITEM_ARMOR:
+ pObjIndex->value[0] = level / 5 + 3;
+ pObjIndex->value[1] = pObjIndex->value[0];
+ pObjIndex->value[2] = pObjIndex->value[0];
+ break;
+
+ case ITEM_POTION:
+ case ITEM_PILL:
+ break;
+
+ case ITEM_MONEY:
+ pObjIndex->value[0] = pObjIndex->cost;
+ break;
+ }
+
+ pObjIndex->new_format = TRUE;
+ ++newobjs;
+
+ return;
+}
+
+
+
+
+/*****************************************************************************
+ Name: convert_mobile
+ Purpose: Converts an old_format mob into new_format
+ Called by: load_old_mob (db.c).
+ Note: Dug out of create_mobile (db.c)
+ Author: Hugin
+ ****************************************************************************/
+void convert_mobile( MOB_INDEX_DATA *pMobIndex )
+{
+ int i;
+ int type, number, bonus;
+ int level;
+
+ if ( !pMobIndex || pMobIndex->new_format ) return;
+
+ level = pMobIndex->level;
+
+ pMobIndex->act |= ACT_WARRIOR;
+
+ /*
+ * Calculate hit dice. Gives close to the hitpoints
+ * of old format mobs created with create_mobile() (db.c)
+ * A high number of dice makes for less variance in mobiles
+ * hitpoints.
+ * (might be a good idea to reduce the max number of dice)
+ *
+ * The conversion below gives:
+
+ level: dice min max diff mean
+ 1: 1d2+6 7( 7) 8( 8) 1( 1) 8( 8)
+ 2: 1d3+15 16( 15) 18( 18) 2( 3) 17( 17)
+ 3: 1d6+24 25( 24) 30( 30) 5( 6) 27( 27)
+ 5: 1d17+42 43( 42) 59( 59) 16( 17) 51( 51)
+ 10: 3d22+96 99( 95) 162( 162) 63( 67) 131( )
+ 15: 5d30+161 166(159) 311( 311) 145( 150) 239( )
+ 30: 10d61+416 426(419) 1026(1026) 600( 607) 726( )
+ 50: 10d169+920 930(923) 2610(2610) 1680(1688) 1770( )
+
+ The values in parenthesis give the values generated in create_mobile.
+ Diff = max - min. Mean is the arithmetic mean.
+ (hmm.. must be some roundoff error in my calculations.. smurfette got
+ 1d6+23 hp at level 3 ? -- anyway.. the values above should be
+ approximately right..)
+ */
+ type = level*level*27/40;
+ number = UMIN(type/40 + 1, 10); /* how do they get 11 ??? */
+ type = UMAX(2, type/number);
+ bonus = UMAX(0, level*(8 + level)*.9 - number*type);
+
+ pMobIndex->hit[DICE_NUMBER] = number;
+ pMobIndex->hit[DICE_TYPE] = type;
+ pMobIndex->hit[DICE_BONUS] = bonus;
+
+ pMobIndex->mana[DICE_NUMBER] = level;
+ pMobIndex->mana[DICE_TYPE] = 10;
+ pMobIndex->mana[DICE_BONUS] = 100;
+
+ /*
+ * Calculate dam dice. Gives close to the damage
+ * of old format mobs in damage() (fight.c)
+ */
+ type = level*7/4;
+ number = UMIN(type/8 + 1, 5);
+ type = UMAX(2, type/number);
+ bonus = UMAX(0, level*9/4 - number*type);
+
+ pMobIndex->damage[DICE_NUMBER] = number;
+ pMobIndex->damage[DICE_TYPE] = type;
+ pMobIndex->damage[DICE_BONUS] = bonus;
+
+ switch ( number_range( 1, 3 ) )
+ {
+ case (1): pMobIndex->dam_type = 3; break; /* slash */
+ case (2): pMobIndex->dam_type = 7; break; /* pound */
+ case (3): pMobIndex->dam_type = 11; break; /* pierce */
+ }
+
+ for (i = 0; i < 3; i++)
+ pMobIndex->ac[i] = interpolate( level, 100, -100);
+ pMobIndex->ac[3] = interpolate( level, 100, 0); /* exotic */
+
+ pMobIndex->wealth /= 100;
+ pMobIndex->size = SIZE_MEDIUM;
+ pMobIndex->material = str_dup("none");
+
+ pMobIndex->new_format = TRUE;
+ ++newmobs;
+
+ return;
+}
diff -ur old/db.c new/db.c
--- old/db.c 2007-02-03 07:47:55.000000000 -0800
+++ new/db.c 2007-02-03 08:46:00.000000000 -0800
@@ -42,8 +42,9 @@
#include "db.h"
#include "recycle.h"
#include "music.h"
+#include "tables.h"
#include "lookup.h"
-
+#include "olc.h"
#if !defined(macintosh)
extern int _filbuf args( (FILE *) );
@@ -72,11 +73,15 @@
HELP_DATA * help_first;
HELP_DATA * help_last;
+HELP_AREA * had_list;
+
SHOP_DATA * shop_first;
SHOP_DATA * shop_last;
NOTE_DATA * note_free;
+MPROG_CODE * mprog_list;
+
char bug_buf [2*MAX_INPUT_LENGTH];
CHAR_DATA * char_list;
char * help_greeting;
@@ -154,6 +159,7 @@
AREA_DATA * area_first;
AREA_DATA * area_last;
+AREA_DATA * current_area;
char * string_space;
char * top_string;
@@ -169,6 +175,10 @@
int top_reset;
int top_room;
int top_shop;
+int top_vnum_room; /* OLC */
+int top_vnum_mob; /* OLC */
+int top_vnum_obj; /* OLC */
+int top_mprog_index; /* OLC */
int mobile_count = 0;
int newmobs = 0;
int newobjs = 0;
@@ -210,7 +220,8 @@
*/
void init_mm args( ( void ) );
void load_area args( ( FILE *fp ) );
-void load_helps args( ( FILE *fp ) );
+void new_load_area args( ( FILE *fp ) ); /* OLC */
+void load_helps args( ( FILE *fp, char *fname ) );
void load_old_mob args( ( FILE *fp ) );
void load_mobiles args( ( FILE *fp ) );
void load_old_obj args( ( FILE *fp ) );
@@ -222,8 +233,10 @@
void load_specials args( ( FILE *fp ) );
void load_notes args( ( void ) );
void load_bans args( ( void ) );
+void load_mobprogs args( ( FILE *fp ) );
void fix_exits args( ( void ) );
+void fix_mobprogs args( ( void ) );
void reset_area args( ( AREA_DATA * pArea ) );
@@ -332,6 +345,8 @@
}
}
+ current_area = NULL;
+
for ( ; ; )
{
char *word;
@@ -346,9 +361,11 @@
if ( word[0] == '$' ) break;
else if ( !str_cmp( word, "AREA" ) ) load_area (fpArea);
- else if ( !str_cmp( word, "HELPS" ) ) load_helps (fpArea);
+ /* OLC */ else if ( !str_cmp( word, "AREADATA" ) ) new_load_area(fpArea);
+ else if ( !str_cmp( word, "HELPS" ) ) load_helps (fpArea, strArea);
else if ( !str_cmp( word, "MOBOLD" ) ) load_old_mob (fpArea);
else if ( !str_cmp( word, "MOBILES" ) ) load_mobiles (fpArea);
+ else if ( !str_cmp( word, "MOBPROGS" ) ) load_mobprogs(fpArea);
else if ( !str_cmp( word, "OBJOLD" ) ) load_old_obj (fpArea);
else if ( !str_cmp( word, "OBJECTS" ) ) load_objects (fpArea);
else if ( !str_cmp( word, "RESETS" ) ) load_resets (fpArea);
@@ -378,7 +395,9 @@
*/
{
fix_exits( );
+ fix_mobprogs( );
fBootDb = FALSE;
+ convert_objects( ); /* ROM OLC */
area_update( );
load_notes( );
load_bans();
@@ -398,9 +417,13 @@
AREA_DATA *pArea;
pArea = alloc_perm( sizeof(*pArea) );
- pArea->reset_first = NULL;
- pArea->reset_last = NULL;
pArea->file_name = fread_string(fp);
+
+ pArea->area_flags = AREA_LOADING; /* OLC */
+ pArea->security = 9; /* OLC */ /* 9 -- Hugin */
+ pArea->builders = str_dup( "None" ); /* OLC */
+ pArea->vnum = top_area; /* OLC */
+
pArea->name = fread_string( fp );
pArea->credits = fread_string( fp );
pArea->min_vnum = fread_number(fp);
@@ -409,33 +432,186 @@
pArea->nplayer = 0;
pArea->empty = FALSE;
- if ( area_first == NULL )
+ if ( !area_first )
area_first = pArea;
- if ( area_last != NULL )
+ if ( area_last )
+ {
area_last->next = pArea;
- area_last = pArea;
- pArea->next = NULL;
+ REMOVE_BIT(area_last->area_flags, AREA_LOADING); /* OLC */
+ }
+ area_last = pArea;
+ pArea->next = NULL;
+ current_area = pArea;
top_area++;
return;
}
+/*
+ * OLC
+ * Use these macros to load any new area formats that you choose to
+ * support on your MUD. See the new_load_area format below for
+ * a short example.
+ */
+#if defined(KEY)
+#undef KEY
+#endif
+
+#define KEY( literal, field, value ) \
+ if ( !str_cmp( word, literal ) ) \
+ { \
+ field = value; \
+ fMatch = TRUE; \
+ break; \
+ }
+
+#define SKEY( string, field ) \
+ if ( !str_cmp( word, string ) ) \
+ { \
+ free_string( field ); \
+ field = fread_string( fp ); \
+ fMatch = TRUE; \
+ break; \
+ }
+
+
+/* OLC
+ * Snarf an 'area' header line. Check this format. MUCH better. Add fields
+ * too.
+ *
+ * #AREAFILE
+ * Name { All } Locke Newbie School~
+ * Repop A teacher pops in the room and says, 'Repop coming!'~
+ * Recall 3001
+ * End
+ */
+void new_load_area( FILE *fp )
+{
+ AREA_DATA *pArea;
+ char *word;
+ bool fMatch;
+
+ pArea = alloc_perm( sizeof(*pArea) );
+ pArea->age = 15;
+ pArea->nplayer = 0;
+ pArea->file_name = str_dup( strArea );
+ pArea->vnum = top_area;
+ pArea->name = str_dup( "New Area" );
+ pArea->builders = str_dup( "" );
+ pArea->security = 9; /* 9 -- Hugin */
+ pArea->min_vnum = 0;
+ pArea->max_vnum = 0;
+ pArea->area_flags = 0;
+/* pArea->recall = ROOM_VNUM_TEMPLE; ROM OLC */
+
+ for ( ; ; )
+ {
+ word = feof( fp ) ? "End" : fread_word( fp );
+ fMatch = FALSE;
+
+ switch ( UPPER(word[0]) )
+ {
+ case 'N':
+ SKEY( "Name", pArea->name );
+ break;
+ case 'S':
+ KEY( "Security", pArea->security, fread_number( fp ) );
+ break;
+ case 'V':
+ if ( !str_cmp( word, "VNUMs" ) )
+ {
+ pArea->min_vnum = fread_number( fp );
+ pArea->max_vnum = fread_number( fp );
+ }
+ break;
+ case 'E':
+ if ( !str_cmp( word, "End" ) )
+ {
+ fMatch = TRUE;
+ if ( area_first == NULL )
+ area_first = pArea;
+ if ( area_last != NULL )
+ area_last->next = pArea;
+ area_last = pArea;
+ pArea->next = NULL;
+ current_area = pArea;
+ top_area++;
+
+ return;
+ }
+ break;
+ case 'B':
+ SKEY( "Builders", pArea->builders );
+ break;
+ case 'C':
+ SKEY( "Credits", pArea->credits );
+ break;
+ }
+ }
+}
+
+/*
+ * Sets vnum range for area using OLC protection features.
+ */
+void assign_area_vnum( int vnum )
+{
+ if ( area_last->min_vnum == 0 || area_last->max_vnum == 0 )
+ area_last->min_vnum = area_last->max_vnum = vnum;
+ if ( vnum != URANGE( area_last->min_vnum, vnum, area_last->max_vnum ) )
+ { if ( vnum < area_last->min_vnum )
+ area_last->min_vnum = vnum;
+ else
+ area_last->max_vnum = vnum;
+ }
+ return;
+}
/*
* Snarf a help section.
*/
-void load_helps( FILE *fp )
+void load_helps( FILE *fp, char *fname )
{
HELP_DATA *pHelp;
+ int level;
+ char *keyword;
for ( ; ; )
{
- pHelp = alloc_perm( sizeof(*pHelp) );
- pHelp->level = fread_number( fp );
- pHelp->keyword = fread_string( fp );
- if ( pHelp->keyword[0] == '$' )
- break;
+ HELP_AREA * had;
+
+ level = fread_number( fp );
+ keyword = fread_string( fp );
+
+ if ( keyword[0] == '$' )
+ break;
+
+ if ( !had_list )
+ {
+ had = new_had ();
+ had->filename = str_dup( fname );
+ had->area = current_area;
+ if ( current_area )
+ current_area->helps = had;
+ had_list = had;
+ }
+ else
+ if ( str_cmp( fname, had_list->filename ) )
+ {
+ had = new_had ();
+ had->filename = str_dup( fname );
+ had->area = current_area;
+ if ( current_area )
+ current_area->helps = had;
+ had->next = had_list;
+ had_list = had;
+ }
+ else
+ had = had_list;
+
+ pHelp = new_help( );
+ pHelp->level = level;
+ pHelp->keyword = keyword;
pHelp->text = fread_string( fp );
if ( !str_cmp( pHelp->keyword, "greeting" ) )
@@ -446,8 +622,18 @@
if ( help_last != NULL )
help_last->next = pHelp;
- help_last = pHelp;
- pHelp->next = NULL;
+ help_last = pHelp;
+ pHelp->next = NULL;
+
+ if ( !had->first )
+ had->first = pHelp;
+ if ( !had->last )
+ had->last = pHelp;
+
+ had->last->next_area = pHelp;
+ had->last = pHelp;
+ pHelp->next_area = NULL;
+
top_help++;
}
@@ -466,6 +652,12 @@
int race;
char name[MAX_STRING_LENGTH];
+ if ( !area_last ) /* OLC */
+ {
+ bug( "Load_mobiles: no #AREA seen yet.", 0 );
+ exit( 1 );
+ }
+
for ( ; ; )
{
sh_int vnum;
@@ -493,6 +685,7 @@
pMobIndex = alloc_perm( sizeof(*pMobIndex) );
pMobIndex->vnum = vnum;
+ pMobIndex->area = area_last; /* OLC */
pMobIndex->new_format = FALSE;
pMobIndex->player_name = fread_string( fp );
pMobIndex->short_descr = fread_string( fp );
@@ -573,10 +766,14 @@
exit( 1 );
}
+ convert_mobile( pMobIndex ); /* ROM OLC */
+
iHash = vnum % MAX_KEY_HASH;
pMobIndex->next = mob_index_hash[iHash];
mob_index_hash[iHash] = pMobIndex;
top_mob_index++;
+ top_vnum_mob = top_vnum_mob < vnum ? vnum : top_vnum_mob; /* OLC */
+ assign_area_vnum( vnum ); /* OLC */
kill_table[URANGE(0, pMobIndex->level, MAX_LEVEL-1)].number++;
}
@@ -590,6 +787,12 @@
{
OBJ_INDEX_DATA *pObjIndex;
+ if ( !area_last ) /* OLC */
+ {
+ bug( "Load_objects: no #AREA seen yet.", 0 );
+ exit( 1 );
+ }
+
for ( ; ; )
{
sh_int vnum;
@@ -617,6 +820,7 @@
pObjIndex = alloc_perm( sizeof(*pObjIndex) );
pObjIndex->vnum = vnum;
+ pObjIndex->area = area_last; /* OLC */
pObjIndex->new_format = FALSE;
pObjIndex->reset_num = 0;
pObjIndex->name = fread_string( fp );
@@ -724,14 +928,42 @@
pObjIndex->next = obj_index_hash[iHash];
obj_index_hash[iHash] = pObjIndex;
top_obj_index++;
+ top_vnum_obj = top_vnum_obj < vnum ? vnum : top_vnum_obj; /* OLC */
+ assign_area_vnum( vnum ); /* OLC */
}
return;
}
+/*
+ * Adds a reset to a room. OLC
+ * Similar to add_reset in olc.c
+ */
+void new_reset( ROOM_INDEX_DATA *pR, RESET_DATA *pReset )
+{
+ RESET_DATA *pr;
+
+ if ( !pR )
+ return;
+ pr = pR->reset_last;
+ if ( !pr )
+ {
+ pR->reset_first = pReset;
+ pR->reset_last = pReset;
+ }
+ else
+ {
+ pR->reset_last->next = pReset;
+ pR->reset_last = pReset;
+ pR->reset_last->next = NULL;
+ }
+/* top_reset++; no estamos asignando memoria!!!! */
+
+ return;
+}
/*
* Snarf a reset section.
@@ -739,8 +971,11 @@
void load_resets( FILE *fp )
{
RESET_DATA *pReset;
+ EXIT_DATA *pexit;
+ ROOM_INDEX_DATA *pRoomIndex;
+ int rVnum = -1;
- if ( area_last == NULL )
+ if ( !area_last )
{
bug( "Load_resets: no #AREA seen yet.", 0 );
exit( 1 );
@@ -748,10 +983,7 @@
for ( ; ; )
{
- ROOM_INDEX_DATA *pRoomIndex;
- EXIT_DATA *pexit;
char letter;
- OBJ_INDEX_DATA *temp_index;
if ( ( letter = fread_letter( fp ) ) == 'S' )
break;
@@ -762,7 +994,7 @@
continue;
}
- pReset = alloc_perm( sizeof(*pReset) );
+ pReset = new_reset_data();
pReset->command = letter;
/* if_flag */ fread_number( fp );
pReset->arg1 = fread_number( fp );
@@ -773,87 +1005,61 @@
? fread_number(fp) : 0;
fread_to_eol( fp );
- /*
- * Validate parameters.
- * We're calling the index functions for the side effect.
- */
- switch ( letter )
+ switch( pReset->command )
{
- default:
- bug( "Load_resets: bad command '%c'.", letter );
- exit( 1 );
- break;
-
- case 'M':
- get_mob_index ( pReset->arg1 );
- get_room_index ( pReset->arg3 );
- break;
-
- case 'O':
- temp_index = get_obj_index ( pReset->arg1 );
- temp_index->reset_num++;
- get_room_index ( pReset->arg3 );
- break;
-
- case 'P':
- temp_index = get_obj_index ( pReset->arg1 );
- temp_index->reset_num++;
- get_obj_index ( pReset->arg3 );
- break;
-
- case 'G':
- case 'E':
- temp_index = get_obj_index ( pReset->arg1 );
- temp_index->reset_num++;
- break;
-
- case 'D':
- pRoomIndex = get_room_index( pReset->arg1 );
-
- if ( pReset->arg2 < 0
- || pReset->arg2 > 5
- || ( pexit = pRoomIndex->exit[pReset->arg2] ) == NULL
- || !IS_SET( pexit->exit_info, EX_ISDOOR ) )
- {
- bug( "Load_resets: 'D': exit %d not door.", pReset->arg2 );
- exit( 1 );
- }
-
- if ( pReset->arg3 < 0 || pReset->arg3 > 2 )
- {
- bug( "Load_resets: 'D': bad 'locks': %d.", pReset->arg3 );
- exit( 1 );
- }
+ case 'M':
+ case 'O':
+ rVnum = pReset->arg3;
+ break;
- break;
+ case 'P':
+ case 'G':
+ case 'E':
+ break;
- case 'R':
- pRoomIndex = get_room_index( pReset->arg1 );
+ case 'D':
+ pRoomIndex = get_room_index( (rVnum = pReset->arg1) );
+ if ( pReset->arg2 < 0
+ || pReset->arg2 >= MAX_DIR
+ || !pRoomIndex
+ || !( pexit = pRoomIndex->exit[pReset->arg2] )
+ || !IS_SET( pexit->rs_flags, EX_ISDOOR ) )
+ {
+ bugf( "Load_resets: 'D': exit %d, room %d not door.", pReset->arg2, pReset->arg1 );
+ exit( 1 );
+ }
- if ( pReset->arg2 < 0 || pReset->arg2 > 6 )
- {
- bug( "Load_resets: 'R': bad exit %d.", pReset->arg2 );
- exit( 1 );
- }
+ switch ( pReset->arg3 )
+ {
+ default: bug( "Load_resets: 'D': bad 'locks': %d." , pReset->arg3); break;
+ case 0: break;
+ case 1: SET_BIT( pexit->rs_flags, EX_CLOSED );
+ SET_BIT( pexit->exit_info, EX_CLOSED ); break;
+ case 2: SET_BIT( pexit->rs_flags, EX_CLOSED | EX_LOCKED );
+ SET_BIT( pexit->exit_info, EX_CLOSED | EX_LOCKED ); break;
+ }
+ break;
- break;
+ case 'R':
+ rVnum = pReset->arg1;
+ break;
}
- if ( area_last->reset_first == NULL )
- area_last->reset_first = pReset;
- if ( area_last->reset_last != NULL )
- area_last->reset_last->next = pReset;
-
- area_last->reset_last = pReset;
- pReset->next = NULL;
- top_reset++;
+ if ( rVnum == -1 )
+ {
+ bugf( "load_resets : rVnum == -1" );
+ exit(1);
+ }
+
+ if ( pReset->command != 'D' )
+ new_reset( get_room_index(rVnum), pReset );
+ else
+ free_reset_data( pReset );
}
return;
}
-
-
/*
* Snarf a room section.
*/
@@ -956,21 +1162,26 @@
pexit->description = fread_string( fp );
pexit->keyword = fread_string( fp );
pexit->exit_info = 0;
+ pexit->rs_flags = 0; /* OLC */
locks = fread_number( fp );
pexit->key = fread_number( fp );
pexit->u1.vnum = fread_number( fp );
+ pexit->orig_door = door; /* OLC */
switch ( locks )
{
- case 1: pexit->exit_info = EX_ISDOOR; break;
- case 2: pexit->exit_info = EX_ISDOOR | EX_PICKPROOF; break;
- case 3: pexit->exit_info = EX_ISDOOR | EX_NOPASS; break;
+ case 1: pexit->exit_info = EX_ISDOOR;
+ pexit->rs_flags = EX_ISDOOR; break;
+ case 2: pexit->exit_info = EX_ISDOOR | EX_PICKPROOF;
+ pexit->rs_flags = EX_ISDOOR | EX_PICKPROOF; break;
+ case 3: pexit->exit_info = EX_ISDOOR | EX_NOPASS;
+ pexit->rs_flags = EX_ISDOOR | EX_NOPASS; break;
case 4: pexit->exit_info = EX_ISDOOR|EX_NOPASS|EX_PICKPROOF;
+ pexit->rs_flags = EX_ISDOOR|EX_NOPASS|EX_PICKPROOF;
break;
}
pRoomIndex->exit[door] = pexit;
- pRoomIndex->old_exit[door] = pexit;
top_exit++;
}
else if ( letter == 'E' )
@@ -1007,6 +1218,8 @@
pRoomIndex->next = room_index_hash[iHash];
room_index_hash[iHash] = pRoomIndex;
top_room++;
+ top_vnum_room = top_vnum_room < vnum ? vnum : top_vnum_room; /* OLC */
+ assign_area_vnum( vnum ); /* OLC */
}
return;
@@ -1105,6 +1318,8 @@
ROOM_INDEX_DATA *to_room;
EXIT_DATA *pexit;
EXIT_DATA *pexit_rev;
+ RESET_DATA *pReset;
+ ROOM_INDEX_DATA *iLastRoom, *iLastObj;
int iHash;
int door;
@@ -1116,6 +1331,64 @@
{
bool fexit;
+ iLastRoom = iLastObj = NULL;
+
+ /* OLC : nuevo chequeo de resets */
+ for ( pReset = pRoomIndex->reset_first; pReset; pReset = pReset->next )
+ {
+ switch( pReset->command )
+ {
+ default:
+ bugf( "fix_exits : cuarto %d con reset cmd %c", pRoomIndex->vnum, pReset->command );
+ exit(1);
+ break;
+
+ case 'M':
+ get_mob_index( pReset->arg1 );
+ iLastRoom = get_room_index( pReset->arg3 );
+ break;
+
+ case 'O':
+ get_obj_index( pReset->arg1 );
+ iLastObj = get_room_index( pReset->arg3 );
+ break;
+
+ case 'P':
+ get_obj_index( pReset->arg1 );
+ if (iLastObj == NULL)
+ {
+ bugf( "fix_exits : reset en cuarto %d con iLastObj NULL", pRoomIndex->vnum );
+ exit(1);
+ }
+ break;
+
+ case 'G':
+ case 'E':
+ get_obj_index( pReset->arg1 );
+ if (iLastRoom == NULL)
+ {
+ bugf( "fix_exits : reset en cuarto %d con iLastRoom NULL", pRoomIndex->vnum );
+ exit(1);
+ }
+ iLastObj = iLastRoom;
+ break;
+
+ case 'D':
+ bugf( "???" );
+ break;
+
+ case 'R':
+ get_room_index( pReset->arg1 );
+ if ( pReset->arg2 < 0 || pReset->arg2 > MAX_DIR )
+ {
+ bugf( "fix_exits : reset en cuarto %d con arg2 %d >= MAX_DIR",
+ pRoomIndex->vnum, pReset->arg2 );
+ exit(1);
+ }
+ break;
+ } /* switch */
+ } /* for */
+
fexit = FALSE;
for ( door = 0; door <= 5; door++ )
{
@@ -1164,6 +1437,87 @@
return;
}
+/*
+ * Load mobprogs section
+ */
+void load_mobprogs( FILE *fp )
+{
+ MPROG_CODE *pMprog;
+
+ if ( area_last == NULL )
+ {
+ bug( "Load_mobprogs: no #AREA seen yet.", 0 );
+ exit( 1 );
+ }
+
+ for ( ; ; )
+ {
+ sh_int vnum;
+ char letter;
+
+ letter = fread_letter( fp );
+ if ( letter != '#' )
+ {
+ bug( "Load_mobprogs: # not found.", 0 );
+ exit( 1 );
+ }
+
+ vnum = fread_number( fp );
+ if ( vnum == 0 )
+ break;
+
+ fBootDb = FALSE;
+ if ( get_mprog_index( vnum ) != NULL )
+ {
+ bug( "Load_mobprogs: vnum %d duplicated.", vnum );
+ exit( 1 );
+ }
+ fBootDb = TRUE;
+
+ pMprog = alloc_perm( sizeof(*pMprog) );
+ pMprog->vnum = vnum;
+ pMprog->code = fread_string( fp );
+ if ( mprog_list == NULL )
+ mprog_list = pMprog;
+ else
+ {
+ pMprog->next = mprog_list;
+ mprog_list = pMprog;
+ }
+ top_mprog_index++;
+ }
+ return;
+}
+
+/*
+ * Translate mobprog vnums pointers to real code
+ */
+void fix_mobprogs( void )
+{
+ MOB_INDEX_DATA *pMobIndex;
+ MPROG_LIST *list;
+ MPROG_CODE *prog;
+ int iHash;
+
+ for ( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
+ {
+ for ( pMobIndex = mob_index_hash[iHash];
+ pMobIndex != NULL;
+ pMobIndex = pMobIndex->next )
+ {
+ for( list = pMobIndex->mprogs; list != NULL; list = list->next )
+ {
+ if ( ( prog = get_mprog_index( list->vnum ) ) != NULL )
+ list->code = prog->code;
+ else
+ {
+ bug( "Fix_mobprogs: code vnum %d not found.", list->vnum );
+ exit( 1 );
+ }
+ }
+ }
+ }
+}
/*
@@ -1205,57 +1559,76 @@
return;
}
-
-
-/*
- * Reset one area.
+/* OLC
+ * Reset one room. Called by reset_area and olc.
*/
-void reset_area( AREA_DATA *pArea )
+void reset_room( ROOM_INDEX_DATA *pRoom )
{
- RESET_DATA *pReset;
- CHAR_DATA *mob;
+ RESET_DATA *pReset;
+ CHAR_DATA *pMob;
+ CHAR_DATA *mob;
+ OBJ_DATA *pObj;
+ CHAR_DATA *LastMob = NULL;
+ OBJ_DATA *LastObj = NULL;
+ int iExit;
+ int level = 0;
bool last;
- int level;
- mob = NULL;
- last = TRUE;
- level = 0;
- for ( pReset = pArea->reset_first; pReset != NULL; pReset = pReset->next )
+ if ( !pRoom )
+ return;
+
+ pMob = NULL;
+ last = FALSE;
+
+ for ( iExit = 0; iExit < MAX_DIR; iExit++ )
{
- ROOM_INDEX_DATA *pRoomIndex;
- MOB_INDEX_DATA *pMobIndex;
- OBJ_INDEX_DATA *pObjIndex;
- OBJ_INDEX_DATA *pObjToIndex;
- EXIT_DATA *pexit;
- OBJ_DATA *obj;
- OBJ_DATA *obj_to;
- int count, limit;
+ EXIT_DATA *pExit;
+ if ( ( pExit = pRoom->exit[iExit] )
+ /* && !IS_SET( pExit->exit_info, EX_BASHED ) ROM OLC */ )
+ {
+ pExit->exit_info = pExit->rs_flags;
+ if ( ( pExit->u1.to_room != NULL )
+ && ( ( pExit = pExit->u1.to_room->exit[rev_dir[iExit]] ) ) )
+ {
+ /* nail the other side */
+ pExit->exit_info = pExit->rs_flags;
+ }
+ }
+ }
- switch ( pReset->command )
- {
- default:
- bug( "Reset_area: bad command %c.", pReset->command );
- break;
+ for ( pReset = pRoom->reset_first; pReset != NULL; pReset = pReset->next )
+ {
+ MOB_INDEX_DATA *pMobIndex;
+ OBJ_INDEX_DATA *pObjIndex;
+ OBJ_INDEX_DATA *pObjToIndex;
+ ROOM_INDEX_DATA *pRoomIndex;
+ char buf[MAX_STRING_LENGTH];
+ int count,limit=0;
- case 'M':
- if ( ( pMobIndex = get_mob_index( pReset->arg1 ) ) == NULL )
- {
- bug( "Reset_area: 'M': bad vnum %d.", pReset->arg1 );
- continue;
- }
+ switch ( pReset->command )
+ {
+ default:
+ bug( "Reset_room: bad command %c.", pReset->command );
+ break;
+
+ case 'M':
+ if ( !( pMobIndex = get_mob_index( pReset->arg1 ) ) )
+ {
+ bug( "Reset_room: 'M': bad vnum %d.", pReset->arg1 );
+ continue;
+ }
if ( ( pRoomIndex = get_room_index( pReset->arg3 ) ) == NULL )
{
bug( "Reset_area: 'R': bad vnum %d.", pReset->arg3 );
continue;
}
-
- if ( pMobIndex->count >= pReset->arg2 )
- {
- last = FALSE;
- break;
- }
-
+ if ( pMobIndex->count >= pReset->arg2 )
+ {
+ last = FALSE;
+ break;
+ }
+/* */
count = 0;
for (mob = pRoomIndex->people; mob != NULL; mob = mob->next_in_room)
if (mob->pIndexData == pMobIndex)
@@ -1271,66 +1644,80 @@
if (count >= pReset->arg4)
break;
- mob = create_mobile( pMobIndex );
+/* */
- /*
- * Check for pet shop.
- */
- {
- ROOM_INDEX_DATA *pRoomIndexPrev;
- pRoomIndexPrev = get_room_index( pRoomIndex->vnum - 1 );
- if ( pRoomIndexPrev != NULL
- && IS_SET(pRoomIndexPrev->room_flags, ROOM_PET_SHOP) )
- SET_BIT(mob->act, ACT_PET);
- }
+ pMob = create_mobile( pMobIndex );
- /* set area */
- mob->zone = pRoomIndex->area;
+ /*
+ * Some more hard coding.
+ */
+ if ( room_is_dark( pRoom ) )
+ SET_BIT(pMob->affected_by, AFF_INFRARED);
+
+ /*
+ * Pet shop mobiles get ACT_PET set.
+ */
+ {
+ ROOM_INDEX_DATA *pRoomIndexPrev;
- char_to_room( mob, pRoomIndex );
- level = URANGE( 0, mob->level - 2, LEVEL_HERO - 1 );
- last = TRUE;
- break;
+ pRoomIndexPrev = get_room_index( pRoom->vnum - 1 );
+ if ( pRoomIndexPrev
+ && IS_SET( pRoomIndexPrev->room_flags, ROOM_PET_SHOP ) )
+ SET_BIT( pMob->act, ACT_PET);
+ }
- case 'O':
- if ( ( pObjIndex = get_obj_index( pReset->arg1 ) ) == NULL )
- {
- bug( "Reset_area: 'O': bad vnum %d.", pReset->arg1 );
- continue;
- }
+ char_to_room( pMob, pRoom );
- if ( ( pRoomIndex = get_room_index( pReset->arg3 ) ) == NULL )
- {
- bug( "Reset_area: 'R': bad vnum %d.", pReset->arg3 );
- continue;
- }
+ LastMob = pMob;
+ level = URANGE( 0, pMob->level - 2, LEVEL_HERO - 1 ); /* -1 ROM */
+ last = TRUE;
+ break;
+
+ case 'O':
+ if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
+ {
+ bug( "Reset_room: 'O' 1 : bad vnum %d", pReset->arg1 );
+ sprintf (buf,"%d %d %d %d",pReset->arg1, pReset->arg2, pReset->arg3,
+ pReset->arg4 );
+ bug(buf,1);
+ continue;
+ }
+
+ if ( !( pRoomIndex = get_room_index( pReset->arg3 ) ) )
+ {
+ bug( "Reset_room: 'O' 2 : bad vnum %d.", pReset->arg3 );
+ sprintf (buf,"%d %d %d %d",pReset->arg1, pReset->arg2, pReset->arg3,
+ pReset->arg4 );
+ bug(buf,1);
+ continue;
+ }
- if ( pArea->nplayer > 0
- || count_obj_list( pObjIndex, pRoomIndex->contents ) > 0 )
+ if ( pRoom->area->nplayer > 0
+ || count_obj_list( pObjIndex, pRoom->contents ) > 0 )
{
last = FALSE;
break;
}
- obj = create_object( pObjIndex, UMIN(number_fuzzy(level),
- LEVEL_HERO - 1) );
- obj->cost = 0;
- obj_to_room( obj, pRoomIndex );
+ pObj = create_object( pObjIndex, /* UMIN - ROM OLC */
+ UMIN(number_fuzzy( level ), LEVEL_HERO -1) );
+ pObj->cost = 0;
+ obj_to_room( pObj, pRoom );
last = TRUE;
- break;
+ break;
- case 'P':
- if ( ( pObjIndex = get_obj_index( pReset->arg1 ) ) == NULL )
- {
- bug( "Reset_area: 'P': bad vnum %d.", pReset->arg1 );
- continue;
- }
+ case 'P':
+ if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
+ {
+ bug( "Reset_room: 'P': bad vnum %d.", pReset->arg1 );
+ continue;
+ }
- if ( ( pObjToIndex = get_obj_index( pReset->arg3 ) ) == NULL )
- {
- bug( "Reset_area: 'P': bad vnum %d.", pReset->arg3 );
- continue;
- }
+ if ( !( pObjToIndex = get_obj_index( pReset->arg3 ) ) )
+ {
+ bug( "Reset_room: 'P': bad vnum %d.", pReset->arg3 );
+ continue;
+ }
if (pReset->arg2 > 50) /* old format */
limit = 6;
@@ -1339,60 +1726,62 @@
else
limit = pReset->arg2;
- if (pArea->nplayer > 0
- || (obj_to = get_obj_type( pObjToIndex ) ) == NULL
- || (obj_to->in_room == NULL && !last)
- || ( pObjIndex->count >= limit && number_range(0,4) != 0)
- || (count = count_obj_list(pObjIndex,obj_to->contains))
- > pReset->arg4 )
+ if ( pRoom->area->nplayer > 0
+ || ( LastObj = get_obj_type( pObjToIndex ) ) == NULL
+ || ( LastObj->in_room == NULL && !last)
+ || ( pObjIndex->count >= limit /* && number_range(0,4) != 0 */ )
+ || ( count = count_obj_list( pObjIndex, LastObj->contains ) ) > pReset->arg4 )
{
last = FALSE;
break;
}
+ /* lastObj->level - ROM */
while (count < pReset->arg4)
{
- obj = create_object( pObjIndex, number_fuzzy(obj_to->level) );
- obj_to_obj( obj, obj_to );
+ pObj = create_object( pObjIndex, number_fuzzy( LastObj->level ) );
+ obj_to_obj( pObj, LastObj );
count++;
if (pObjIndex->count >= limit)
break;
}
+
/* fix object lock state! */
- obj_to->value[1] = obj_to->pIndexData->value[1];
+ LastObj->value[1] = LastObj->pIndexData->value[1];
last = TRUE;
- break;
+ break;
- case 'G':
- case 'E':
- if ( ( pObjIndex = get_obj_index( pReset->arg1 ) ) == NULL )
- {
- bug( "Reset_area: 'E' or 'G': bad vnum %d.", pReset->arg1 );
- continue;
- }
+ case 'G':
+ case 'E':
+ if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) )
+ {
+ bug( "Reset_room: 'E' or 'G': bad vnum %d.", pReset->arg1 );
+ continue;
+ }
- if ( !last )
- break;
+ if ( !last )
+ break;
- if ( mob == NULL )
- {
- bug( "Reset_area: 'E' or 'G': null mob for vnum %d.",
- pReset->arg1 );
- last = FALSE;
- break;
- }
+ if ( !LastMob )
+ {
+ bug( "Reset_room: 'E' or 'G': null mob for vnum %d.",
+ pReset->arg1 );
+ last = FALSE;
+ break;
+ }
- if ( mob->pIndexData->pShop != NULL )
- {
- int olevel = 0,i,j;
+ if ( LastMob->pIndexData->pShop ) /* Shop-keeper? */
+ {
+ int olevel=0,i,j;
if (!pObjIndex->new_format)
- switch ( pObjIndex->item_type )
- {
- case ITEM_PILL:
- case ITEM_POTION:
- case ITEM_SCROLL:
- olevel = 53;
+ switch ( pObjIndex->item_type )
+ {
+ default: olevel = 0; break;
+ case ITEM_PILL:
+ case ITEM_POTION:
+ case ITEM_SCROLL:
+ olevel = 53;
for (i = 1; i < 5; i++)
{
if (pObjIndex->value[i] > 0)
@@ -1408,108 +1797,121 @@
olevel = UMAX(0,(olevel * 3 / 4) - 2);
break;
- case ITEM_WAND: olevel = number_range( 10, 20 ); break;
- case ITEM_STAFF: olevel = number_range( 15, 25 ); break;
- case ITEM_ARMOR: olevel = number_range( 5, 15 ); break;
- case ITEM_WEAPON: olevel = number_range( 5, 15 ); break;
- case ITEM_TREASURE: olevel = number_range( 10, 20 ); break;
- }
+
+ case ITEM_WAND: olevel = number_range( 10, 20 ); break;
+ case ITEM_STAFF: olevel = number_range( 15, 25 ); break;
+ case ITEM_ARMOR: olevel = number_range( 5, 15 ); break;
+ /* ROM patch weapon, treasure */
+ case ITEM_WEAPON: olevel = number_range( 5, 15 ); break;
+ case ITEM_TREASURE: olevel = number_range( 10, 20 ); break;
+
+#if 0 /* envy version */
+ case ITEM_WEAPON: if ( pReset->command == 'G' )
+ olevel = number_range( 5, 15 );
+ else
+ olevel = number_fuzzy( level );
+#endif /* envy version */
- obj = create_object( pObjIndex, olevel );
- SET_BIT( obj->extra_flags, ITEM_INVENTORY );
- }
+ break;
+ }
- else
+ pObj = create_object( pObjIndex, olevel );
+ SET_BIT( pObj->extra_flags, ITEM_INVENTORY ); /* ROM OLC */
+
+#if 0 /* envy version */
+ if ( pReset->command == 'G' )
+ SET_BIT( pObj->extra_flags, ITEM_INVENTORY );
+#endif /* envy version */
+
+ }
+ else /* ROM OLC else version */
{
- if (pReset->arg2 > 50) /* old format */
+ int limit;
+ if (pReset->arg2 > 50 ) /* old format */
limit = 6;
- else if (pReset->arg2 == -1) /* no limit */
+ else if ( pReset->arg2 == -1 || pReset->arg2 == 0 ) /* no limit */
limit = 999;
else
limit = pReset->arg2;
- if (pObjIndex->count < limit || number_range(0,4) == 0)
+ if ( pObjIndex->count < limit || number_range(0,4) == 0 )
{
- obj=create_object(pObjIndex,UMIN(number_fuzzy(level),
- LEVEL_HERO - 1));
+ pObj = create_object( pObjIndex,
+ UMIN( number_fuzzy( level ), LEVEL_HERO - 1 ) );
/* error message if it is too high */
- if (obj->level > mob->level + 3
- || (obj->item_type == ITEM_WEAPON
+ if (pObj->level > LastMob->level + 3
+ || (pObj->item_type == ITEM_WEAPON
&& pReset->command == 'E'
- && obj->level < mob->level -5 && obj->level < 45))
+ && pObj->level < LastMob->level -5 && pObj->level < 45))
fprintf(stderr,
"Err: obj %s (%d) -- %d, mob %s (%d) -- %d\n",
- obj->short_descr,obj->pIndexData->vnum,obj->level,
- mob->short_descr,mob->pIndexData->vnum,mob->level);
+ pObj->short_descr,pObj->pIndexData->vnum,pObj->level,
+ LastMob->short_descr,LastMob->pIndexData->vnum,LastMob->level);
}
else
break;
}
- obj_to_char( obj, mob );
- if ( pReset->command == 'E' )
- equip_char( mob, obj, pReset->arg3 );
- last = TRUE;
- break;
-
- case 'D':
- if ( ( pRoomIndex = get_room_index( pReset->arg1 ) ) == NULL )
- {
- bug( "Reset_area: 'D': bad vnum %d.", pReset->arg1 );
- continue;
- }
+
+#if 0 /* envy else version */
+ else
+ {
+ pObj = create_object( pObjIndex, number_fuzzy( level ) );
+ }
+#endif /* envy else version */
- if ( ( pexit = pRoomIndex->exit[pReset->arg2] ) == NULL )
- break;
+ obj_to_char( pObj, LastMob );
+ if ( pReset->command == 'E' )
+ equip_char( LastMob, pObj, pReset->arg3 );
+ last = TRUE;
+ break;
- switch ( pReset->arg3 )
- {
- case 0:
- REMOVE_BIT( pexit->exit_info, EX_CLOSED );
- REMOVE_BIT( pexit->exit_info, EX_LOCKED );
- break;
+ case 'D':
+ break;
- case 1:
- SET_BIT( pexit->exit_info, EX_CLOSED );
- REMOVE_BIT( pexit->exit_info, EX_LOCKED );
- break;
+ case 'R':
+ if ( !( pRoomIndex = get_room_index( pReset->arg1 ) ) )
+ {
+ bug( "Reset_room: 'R': bad vnum %d.", pReset->arg1 );
+ continue;
+ }
- case 2:
- SET_BIT( pexit->exit_info, EX_CLOSED );
- SET_BIT( pexit->exit_info, EX_LOCKED );
- break;
- }
+ {
+ EXIT_DATA *pExit;
+ int d0;
+ int d1;
- last = TRUE;
- break;
+ for ( d0 = 0; d0 < pReset->arg2 - 1; d0++ )
+ {
+ d1 = number_range( d0, pReset->arg2-1 );
+ pExit = pRoomIndex->exit[d0];
+ pRoomIndex->exit[d0] = pRoomIndex->exit[d1];
+ pRoomIndex->exit[d1] = pExit;
+ }
+ }
+ break;
+ }
+ }
- case 'R':
- if ( ( pRoomIndex = get_room_index( pReset->arg1 ) ) == NULL )
- {
- bug( "Reset_area: 'R': bad vnum %d.", pReset->arg1 );
- continue;
- }
+ return;
+}
- {
- int d0;
- int d1;
+/* OLC
+ * Reset one area.
+ */
+void reset_area( AREA_DATA *pArea )
+{
+ ROOM_INDEX_DATA *pRoom;
+ int vnum;
- for ( d0 = 0; d0 < pReset->arg2 - 1; d0++ )
- {
- d1 = number_range( d0, pReset->arg2-1 );
- pexit = pRoomIndex->exit[d0];
- pRoomIndex->exit[d0] = pRoomIndex->exit[d1];
- pRoomIndex->exit[d1] = pexit;
- }
- }
- break;
- }
+ for ( vnum = pArea->min_vnum; vnum <= pArea->max_vnum; vnum++ )
+ {
+ if ( ( pRoom = get_room_index(vnum) ) )
+ reset_room(pRoom);
}
return;
}
-
-
/*
* Create an instance of a mobile.
*/
@@ -1531,13 +1933,14 @@
mob->pIndexData = pMobIndex;
- mob->name = pMobIndex->player_name;
+ mob->name = str_dup( pMobIndex->player_name ); /* OLC */
+ mob->short_descr = str_dup( pMobIndex->short_descr ); /* OLC */
+ mob->long_descr = str_dup( pMobIndex->long_descr ); /* OLC */
+ mob->description = str_dup( pMobIndex->description ); /* OLC */
mob->id = get_mob_id();
- mob->short_descr = pMobIndex->short_descr;
- mob->long_descr = pMobIndex->long_descr;
- mob->description = pMobIndex->description;
mob->spec_fun = pMobIndex->spec_fun;
mob->prompt = NULL;
+ mob->mprog_target = NULL;
if (pMobIndex->wealth == 0)
{
@@ -1845,9 +2248,9 @@
obj->level = UMAX(0,level);
obj->wear_loc = -1;
- obj->name = pObjIndex->name;
- obj->short_descr = pObjIndex->short_descr;
- obj->description = pObjIndex->description;
+ obj->name = str_dup( pObjIndex->name ); /* OLC */
+ obj->short_descr = str_dup( pObjIndex->short_descr ); /* OLC */
+ obj->description = str_dup( pObjIndex->description ); /* OLC */
obj->material = str_dup(pObjIndex->material);
obj->item_type = pObjIndex->item_type;
obj->extra_flags = pObjIndex->extra_flags;
@@ -2140,6 +2543,17 @@
return NULL;
}
+MPROG_CODE *get_mprog_index( int vnum )
+{
+ MPROG_CODE *prg;
+ for( prg = mprog_list; prg; prg = prg->next )
+ {
+ if ( prg->vnum == vnum )
+ return( prg );
+ }
+ return NULL;
+}
+
/*
diff -ur old/db.h new/db.h
--- old/db.h 1998-05-23 15:27:21.000000000 -0700
+++ new/db.h 2007-02-03 08:34:13.000000000 -0800
@@ -50,3 +50,12 @@
/* Magic number for memory allocation */
#define MAGIC_NUM 52571214
+
+/* func from db.c */
+extern void assign_area_vnum( int vnum ); /* OLC */
+
+/* from db2.c */
+
+void convert_mobile( MOB_INDEX_DATA *pMobIndex ); /* OLC ROM */
+void convert_objects( void ); /* OLC ROM */
+void convert_object( OBJ_INDEX_DATA *pObjIndex ); /* OLC ROM */
diff -ur old/fight.c new/fight.c
--- old/fight.c 2007-02-03 07:20:15.000000000 -0800
+++ new/fight.c 2007-02-03 08:34:13.000000000 -0800
@@ -70,7 +70,7 @@
CHAR_DATA *ch_next;
CHAR_DATA *victim;
- for ( ch = char_list; ch != NULL; ch = ch->next )
+ for ( ch = char_list; ch != NULL; ch = ch_next )
{
ch_next = ch->next;
@@ -89,6 +89,14 @@
* Fun for the whole family!
*/
check_assist(ch,victim);
+
+ if ( IS_NPC( ch ) )
+ {
+ if ( HAS_TRIGGER( ch, TRIG_FIGHT ) )
+ mp_percent_trigger( ch, victim, NULL, NULL, TRIG_FIGHT );
+ if ( HAS_TRIGGER( ch, TRIG_HPCNT ) )
+ mp_hprct_trigger( ch, victim );
+ }
}
return;
@@ -722,7 +730,11 @@
if ( victim->position > POS_STUNNED )
{
if ( victim->fighting == NULL )
+ {
set_fighting( victim, ch );
+ if ( IS_NPC( victim ) && HAS_TRIGGER( victim, TRIG_KILL ) )
+ mp_percent_trigger( victim, ch, NULL, NULL, TRIG_KILL );
+ }
if (victim->timer <= 4)
victim->position = POS_FIGHTING;
}
@@ -893,6 +905,15 @@
else
wiznet(log_buf,NULL,NULL,WIZ_DEATHS,0,0);
+ /*
+ * Death trigger
+ */
+ if ( IS_NPC( victim ) && HAS_TRIGGER( victim, TRIG_DEATH) )
+ {
+ victim->position = POS_STANDING;
+ mp_percent_trigger( victim, ch, NULL, NULL, TRIG_DEATH );
+ }
+
raw_kill( victim );
/* dump the flags */
if (ch != victim && !IS_NPC(ch) && !is_same_clan(ch,victim))
@@ -3047,7 +3068,27 @@
return;
}
+void do_surrender( CHAR_DATA *ch, char *argument )
+{
+ CHAR_DATA *mob;
+ if ( (mob = ch->fighting) == NULL )
+ {
+ send_to_char( "But you're not fighting!\n\r", ch );
+ return;
+ }
+ act( "You surrender to $N!", ch, NULL, mob, TO_CHAR );
+ act( "$n surrenders to you!", ch, NULL, mob, TO_VICT );
+ act( "$n tries to surrender to $N!", ch, NULL, mob, TO_NOTVICT );
+ stop_fighting( ch, TRUE );
+ if ( !IS_NPC( ch ) && IS_NPC( mob )
+ && ( !HAS_TRIGGER( mob, TRIG_SURR )
+ || !mp_percent_trigger( mob, ch, NULL, NULL, TRIG_SURR ) ) )
+ {
+ act( "$N seems to ignore your cowardly act!", ch, NULL, mob, TO_CHAR );
+ multi_hit( mob, ch, TYPE_UNDEFINED );
+ }
+}
void do_sla( CHAR_DATA *ch, char *argument )
{
diff -ur old/flags.c new/flags.c
--- old/flags.c 1998-05-23 15:27:35.000000000 -0700
+++ new/flags.c 2007-02-03 08:34:13.000000000 -0800
@@ -203,7 +203,8 @@
break;
pos = flag_lookup(word,flag_table);
- if (pos == 0)
+
+ if (pos == NO_FLAG)
{
send_to_char("That flag doesn't exist!\n\r",ch);
return;
diff -ur old/handler.c new/handler.c
--- old/handler.c 2007-02-03 07:20:44.000000000 -0800
+++ new/handler.c 2007-02-03 08:34:13.000000000 -0800
@@ -112,35 +112,6 @@
return 0;
}
-/* returns race number */
-int race_lookup (const char *name)
-{
- int race;
-
- for ( race = 0; race_table[race].name != NULL; race++)
- {
- if (LOWER(name[0]) == LOWER(race_table[race].name[0])
- && !str_prefix( name,race_table[race].name))
- return race;
- }
-
- return 0;
-}
-
-int liq_lookup (const char *name)
-{
- int liq;
-
- for ( liq = 0; liq_table[liq].liq_name != NULL; liq++)
- {
- if (LOWER(name[0]) == LOWER(liq_table[liq].liq_name[0])
- && !str_prefix(name,liq_table[liq].liq_name))
- return liq;
- }
-
- return -1;
-}
-
int weapon_lookup (const char *name)
{
int type;
@@ -169,21 +140,6 @@
return WEAPON_EXOTIC;
}
-
-int item_lookup(const char *name)
-{
- int type;
-
- for (type = 0; item_table[type].name != NULL; type++)
- {
- if (LOWER(name[0]) == LOWER(item_table[type].name[0])
- && !str_prefix(name,item_table[type].name))
- return item_table[type].type;
- }
-
- return -1;
-}
-
char *item_name(int item_type)
{
int type;
@@ -1974,6 +1930,8 @@
{
if ( wch->reply == ch )
wch->reply = NULL;
+ if ( ch->mprog_target == wch )
+ wch->mprog_target = NULL;
}
if ( ch == char_list )
Only in new: hedit.c
diff -ur old/interp.c new/interp.c
--- old/interp.c 1998-05-25 00:12:59.000000000 -0700
+++ new/interp.c 2007-02-03 08:34:13.000000000 -0800
@@ -246,9 +246,15 @@
{ "murde", do_murde, POS_FIGHTING, 0, LOG_NORMAL, 0 },
{ "murder", do_murder, POS_FIGHTING, 5, LOG_ALWAYS, 1 },
{ "rescue", do_rescue, POS_FIGHTING, 0, LOG_NORMAL, 0 },
+ { "surrender", do_surrender, POS_FIGHTING, 0, LOG_NORMAL, 1 },
{ "trip", do_trip, POS_FIGHTING, 0, LOG_NORMAL, 1 },
/*
+ * Mob command interpreter (placed here for faster scan...)
+ */
+ { "mob", do_mob, POS_DEAD, 0, LOG_NEVER, 0 },
+
+ /*
* Miscellaneous commands.
*/
{ "enter", do_enter, POS_STANDING, 0, LOG_NORMAL, 1 },
@@ -350,6 +356,22 @@
{ "smote", do_smote, POS_DEAD, IM, LOG_NORMAL, 1 },
{ "prefi", do_prefi, POS_DEAD, IM, LOG_NORMAL, 0 },
{ "prefix", do_prefix, POS_DEAD, IM, LOG_NORMAL, 1 },
+ { "mpdump", do_mpdump, POS_DEAD, IM, LOG_NEVER, 1 },
+ { "mpstat", do_mpstat, POS_DEAD, IM, LOG_NEVER, 1 },
+
+ /*
+ * OLC
+ */
+ { "edit", do_olc, POS_DEAD, 0, LOG_NORMAL, 1 },
+ { "asave", do_asave, POS_DEAD, 0, LOG_NORMAL, 1 },
+ { "alist", do_alist, POS_DEAD, 0, LOG_NORMAL, 1 },
+ { "resets", do_resets, POS_DEAD, 0, LOG_NORMAL, 1 },
+ { "redit", do_redit, POS_DEAD, 0, LOG_NORMAL, 1 },
+ { "medit", do_medit, POS_DEAD, 0, LOG_NORMAL, 1 },
+ { "aedit", do_aedit, POS_DEAD, 0, LOG_NORMAL, 1 },
+ { "oedit", do_oedit, POS_DEAD, 0, LOG_NORMAL, 1 },
+ { "mpedit", do_mpedit, POS_DEAD, 0, LOG_NORMAL, 1 },
+ { "hedit", do_hedit, POS_DEAD, 0, LOG_NORMAL, 1 },
/*
* End of list.
diff -ur old/interp.h new/interp.h
--- old/interp.h 1998-05-27 17:44:20.000000000 -0700
+++ new/interp.h 2007-02-03 08:34:13.000000000 -0800
@@ -166,7 +166,10 @@
DECLARE_DO_FUN( do_mset );
DECLARE_DO_FUN( do_mstat );
DECLARE_DO_FUN( do_mwhere );
+DECLARE_DO_FUN( do_mob );
DECLARE_DO_FUN( do_motd );
+DECLARE_DO_FUN( do_mpstat );
+DECLARE_DO_FUN( do_mpdump );
DECLARE_DO_FUN( do_murde );
DECLARE_DO_FUN( do_murder );
DECLARE_DO_FUN( do_music );
@@ -263,6 +266,7 @@
DECLARE_DO_FUN( do_steal );
DECLARE_DO_FUN( do_story );
DECLARE_DO_FUN( do_string );
+DECLARE_DO_FUN( do_surrender );
DECLARE_DO_FUN( do_switch );
DECLARE_DO_FUN( do_tell );
DECLARE_DO_FUN( do_time );
@@ -296,3 +300,13 @@
DECLARE_DO_FUN( do_yell );
DECLARE_DO_FUN( do_zap );
DECLARE_DO_FUN( do_zecho );
+DECLARE_DO_FUN( do_olc );
+DECLARE_DO_FUN( do_asave );
+DECLARE_DO_FUN( do_alist );
+DECLARE_DO_FUN( do_resets );
+DECLARE_DO_FUN( do_redit );
+DECLARE_DO_FUN( do_aedit );
+DECLARE_DO_FUN( do_medit );
+DECLARE_DO_FUN( do_oedit );
+DECLARE_DO_FUN( do_mpedit );
+DECLARE_DO_FUN( do_hedit );
diff -ur old/lookup.c new/lookup.c
--- old/lookup.c 1998-05-23 15:27:42.000000000 -0700
+++ new/lookup.c 2007-02-03 08:34:13.000000000 -0800
@@ -32,6 +32,7 @@
#endif
#include <stdio.h>
#include <time.h>
+#include <string.h>
#include "merc.h"
#include "tables.h"
@@ -46,7 +47,7 @@
return flag_table[flag].bit;
}
- return 0;
+ return NO_FLAG;
}
int clan_lookup(const char *name)
@@ -104,3 +105,80 @@
return -1;
}
+
+/* returns race number */
+int race_lookup (const char *name)
+{
+ int race;
+
+ for ( race = 0; race_table[race].name != NULL; race++)
+ {
+ if (LOWER(name[0]) == LOWER(race_table[race].name[0])
+ && !str_prefix( name,race_table[race].name))
+ return race;
+ }
+
+ return 0;
+}
+
+int item_lookup(const char *name)
+{
+ int type;
+
+ for (type = 0; item_table[type].name != NULL; type++)
+ {
+ if (LOWER(name[0]) == LOWER(item_table[type].name[0])
+ && !str_prefix(name,item_table[type].name))
+ return item_table[type].type;
+ }
+
+ return -1;
+}
+
+int liq_lookup (const char *name)
+{
+ int liq;
+
+ for ( liq = 0; liq_table[liq].liq_name != NULL; liq++)
+ {
+ if (LOWER(name[0]) == LOWER(liq_table[liq].liq_name[0])
+ && !str_prefix(name,liq_table[liq].liq_name))
+ return liq;
+ }
+
+ return -1;
+}
+
+HELP_DATA * help_lookup( char *keyword )
+{
+ HELP_DATA *pHelp;
+ char temp[MIL], argall[MIL];
+
+ argall[0] = '\0';
+
+ while (keyword[0] != '\0' )
+ {
+ keyword = one_argument(keyword, temp);
+ if (argall[0] != '\0')
+ strcat(argall," ");
+ strcat(argall, temp);
+ }
+
+ for ( pHelp = help_first; pHelp != NULL; pHelp = pHelp->next )
+ if ( is_name( argall, pHelp->keyword ) )
+ return pHelp;
+
+ return NULL;
+}
+
+HELP_AREA * had_lookup( char *arg )
+{
+ HELP_AREA * temp;
+ extern HELP_AREA * had_list;
+
+ for ( temp = had_list; temp; temp = temp->next )
+ if ( !str_cmp( arg, temp->filename ) )
+ return temp;
+
+ return NULL;
+}
diff -ur old/lookup.h new/lookup.h
--- old/lookup.h 1998-05-23 15:27:43.000000000 -0700
+++ new/lookup.h 2007-02-03 08:34:13.000000000 -0800
@@ -30,3 +30,6 @@
int position_lookup args( (const char *name) );
int sex_lookup args( (const char *name) );
int size_lookup args( (const char *name) );
+int flag_lookup args( (const char *, const struct flag_type *) );
+HELP_DATA * help_lookup args( (char *) );
+HELP_AREA * had_lookup args( (char *) );
diff -ur old/Makefile new/Makefile
--- old/Makefile 2007-02-03 07:17:07.000000000 -0800
+++ new/Makefile 2007-02-03 08:41:10.000000000 -0800
@@ -1,5 +1,5 @@
CC = gcc
-PROF = -O -g
+PROF = -O -ggdb
NOCRYPT =
C_FLAGS = -Wall $(PROF) $(NOCRYPT)
L_FLAGS = $(PROF)
@@ -8,7 +8,8 @@
alias.o ban.o comm.o const.o db.o db2.o effects.o fight.o flags.o \
handler.o healer.o interp.o note.o lookup.o magic.o magic2.o \
music.o recycle.o save.o scan.o skills.o special.o tables.o \
- update.o -lcrypt
+ update.o mob_cmds.o mob_prog.o olc.o olc_act.o olc_save.o bit.o \
+ mem.o string.o olc_mpcode.o hedit.o -lcrypt
rom: $(O_FILES)
rm -f rom
diff -ur old/Makefile.linux new/Makefile.linux
--- old/Makefile.linux 1998-05-25 00:24:59.000000000 -0700
+++ new/Makefile.linux 2007-02-03 08:34:13.000000000 -0800
@@ -9,7 +9,8 @@
alias.o ban.o comm.o const.o db.o db2.o effects.o fight.o flags.o \
handler.o healer.o interp.o note.o lookup.o magic.o magic2.o \
music.o recycle.o save.o scan.o skills.o special.o tables.o \
- update.o
+ update.o mob_cmds.o mob_prog.o olc.o olc_act.o olc_save.o bit.o \
+ mem.o string.o olc_mpcode.o hedit.o
rom: $(O_FILES)
rm -f rom
diff -ur old/Makefile.normal new/Makefile.normal
--- old/Makefile.normal 1998-04-13 19:52:21.000000000 -0700
+++ new/Makefile.normal 2007-02-03 08:34:13.000000000 -0800
@@ -8,7 +8,8 @@
alias.o ban.o comm.o const.o db.o db2.o effects.o fight.o flags.o \
handler.o healer.o interp.o note.o lookup.o magic.o magic2.o \
music.o recycle.o save.o scan.o skills.o special.o tables.o \
- update.o
+ update.o mob_cmds.o mob_prog.o olc.o olc_act.o olc_save.o bit.o \
+ mem.o string.o olc_mpcode.o hedit.o
rom: $(O_FILES)
rm -f rom
diff -ur old/Makefile.solaris new/Makefile.solaris
--- old/Makefile.solaris 1998-04-13 20:36:40.000000000 -0700
+++ new/Makefile.solaris 2007-02-03 08:34:13.000000000 -0800
@@ -9,7 +9,8 @@
alias.o ban.o comm.o const.o db.o db2.o effects.o fight.o flags.o \
handler.o healer.o interp.o note.o lookup.o magic.o magic2.o \
music.o recycle.o save.o scan.o skills.o special.o tables.o \
- update.o
+ update.o mob_cmds.o mob_prog.o olc.o olc_act.o olc_save.o bit.o \
+ mem.o string.o olc_mpcode.o hedit.o
rom: $(O_FILES)
rm -f rom
Only in new: mem.c
diff -ur old/merc.h new/merc.h
--- old/merc.h 1998-05-25 13:48:53.000000000 -0700
+++ new/merc.h 2007-02-03 08:34:13.000000000 -0800
@@ -72,7 +72,9 @@
typedef unsigned char bool;
#endif
-
+/* ea */
+#define MSL MAX_STRING_LENGTH
+#define MIL MAX_INPUT_LENGTH
/*
* Structure types.
@@ -86,6 +88,7 @@
typedef struct exit_data EXIT_DATA;
typedef struct extra_descr_data EXTRA_DESCR_DATA;
typedef struct help_data HELP_DATA;
+typedef struct help_area_data HELP_AREA;
typedef struct kill_data KILL_DATA;
typedef struct mem_data MEM_DATA;
typedef struct mob_index_data MOB_INDEX_DATA;
@@ -99,7 +102,8 @@
typedef struct shop_data SHOP_DATA;
typedef struct time_info_data TIME_INFO_DATA;
typedef struct weather_data WEATHER_DATA;
-
+typedef struct mprog_list MPROG_LIST;
+typedef struct mprog_code MPROG_CODE;
/*
@@ -267,6 +271,9 @@
int outtop;
char * showstr_head;
char * showstr_point;
+ void * pEdit; /* OLC */
+ char ** pString; /* OLC */
+ int editor; /* OLC */
};
@@ -322,11 +329,21 @@
struct help_data
{
HELP_DATA * next;
+ HELP_DATA * next_area;
sh_int level;
char * keyword;
char * text;
};
+struct help_area_data
+{
+ HELP_AREA * next;
+ HELP_DATA * first;
+ HELP_DATA * last;
+ AREA_DATA * area;
+ char * filename;
+ bool changed;
+};
/*
@@ -1300,6 +1317,8 @@
MOB_INDEX_DATA * next;
SPEC_FUN * spec_fun;
SHOP_DATA * pShop;
+ MPROG_LIST * mprogs;
+ AREA_DATA * area; /* OLC */
sh_int vnum;
sh_int group;
bool new_format;
@@ -1332,6 +1351,7 @@
long parts;
sh_int size;
char * material;
+ long mprog_flags;
};
@@ -1365,6 +1385,7 @@
CHAR_DATA * fighting;
CHAR_DATA * reply;
CHAR_DATA * pet;
+ CHAR_DATA * mprog_target;
MEM_DATA * memory;
SPEC_FUN * spec_fun;
MOB_INDEX_DATA * pIndexData;
@@ -1443,6 +1464,8 @@
sh_int dam_type;
sh_int start_pos;
sh_int default_pos;
+
+ sh_int mprog_delay;
};
@@ -1476,6 +1499,7 @@
bool confirm_delete;
char * alias[MAX_ALIAS];
char * alias_sub[MAX_ALIAS];
+ int security; /* OLC */ /* Builder security */
};
/* Data for generating characters -- only used during generation */
@@ -1525,6 +1549,7 @@
OBJ_INDEX_DATA * next;
EXTRA_DESCR_DATA * extra_descr;
AFFECT_DATA * affected;
+ AREA_DATA * area; /* OLC */
bool new_format;
char * name;
char * short_descr;
@@ -1595,6 +1620,9 @@
sh_int key;
char * keyword;
char * description;
+ EXIT_DATA * next; /* OLC */
+ int rs_flags; /* OLC */
+ int orig_door; /* OLC */
};
@@ -1633,8 +1661,7 @@
struct area_data
{
AREA_DATA * next;
- RESET_DATA * reset_first;
- RESET_DATA * reset_last;
+ HELP_AREA * helps;
char * file_name;
char * name;
char * credits;
@@ -1645,6 +1672,10 @@
sh_int min_vnum;
sh_int max_vnum;
bool empty;
+ char * builders; /* OLC */ /* Listing of */
+ int vnum; /* OLC */ /* Area vnum */
+ int area_flags; /* OLC */
+ int security; /* OLC */ /* Value 1-9 */
};
@@ -1660,7 +1691,8 @@
EXTRA_DESCR_DATA * extra_descr;
AREA_DATA * area;
EXIT_DATA * exit [6];
- EXIT_DATA * old_exit[6];
+ RESET_DATA * reset_first; /* OLC */
+ RESET_DATA * reset_last; /* OLC */
char * name;
char * description;
char * owner;
@@ -1730,7 +1762,42 @@
char * spells[MAX_IN_GROUP];
};
+/*
+ * MOBprog definitions
+ */
+#define TRIG_ACT (A)
+#define TRIG_BRIBE (B)
+#define TRIG_DEATH (C)
+#define TRIG_ENTRY (D)
+#define TRIG_FIGHT (E)
+#define TRIG_GIVE (F)
+#define TRIG_GREET (G)
+#define TRIG_GRALL (H)
+#define TRIG_KILL (I)
+#define TRIG_HPCNT (J)
+#define TRIG_RANDOM (K)
+#define TRIG_SPEECH (L)
+#define TRIG_EXIT (M)
+#define TRIG_EXALL (N)
+#define TRIG_DELAY (O)
+#define TRIG_SURR (P)
+
+struct mprog_list
+{
+ int trig_type;
+ char * trig_phrase;
+ sh_int vnum;
+ char * code;
+ MPROG_LIST * next;
+ bool valid;
+};
+struct mprog_code
+{
+ sh_int vnum;
+ char * code;
+ MPROG_CODE * next;
+};
/*
* These are skill_lookup return values for common skills and spells.
@@ -1806,8 +1873,13 @@
#define IS_SET(flag, bit) ((flag) & (bit))
#define SET_BIT(var, bit) ((var) |= (bit))
#define REMOVE_BIT(var, bit) ((var) &= ~(bit))
-
-
+#define IS_NULLSTR(str) ((str) == NULL || (str)[0] == '\0')
+#define ENTRE(min,num,max) ( ((min) < (num)) && ((num) < (max)) )
+#define CHECK_POS(a, b, c) { \
+ (a) = (b); \
+ if ( (a) < 0 ) \
+ bug( "CHECK_POS : " c " == %d < 0", a ); \
+ } \
/*
* Character macros.
@@ -1846,6 +1918,13 @@
#define act(format,ch,arg1,arg2,type)\
act_new((format),(ch),(arg1),(arg2),(type),POS_RESTING)
+#define HAS_TRIGGER(ch,trig) (IS_SET((ch)->pIndexData->mprog_flags,(trig)))
+#define IS_SWITCHED( ch ) ( ch->desc && ch->desc->original )
+#define IS_BUILDER(ch, Area) ( !IS_NPC(ch) && !IS_SWITCHED( ch ) && \
+ ( ch->pcdata->security >= Area->security \
+ || strstr( Area->builders, ch->name ) \
+ || strstr( Area->builders, "All" ) ) )
+
/*
* Object macros.
*/
@@ -1919,6 +1998,8 @@
extern DESCRIPTOR_DATA * descriptor_list;
extern OBJ_DATA * object_list;
+extern MPROG_CODE * mprog_list;
+
extern char bug_buf [];
extern time_t current_time;
extern bool fLogAll;
@@ -1927,6 +2008,7 @@
extern char log_buf [];
extern TIME_INFO_DATA time_info;
extern WEATHER_DATA weather_info;
+extern bool MOBtrigger;
/*
* OS-dependent declarations.
@@ -2071,6 +2153,7 @@
#define RID ROOM_INDEX_DATA
#define SF SPEC_FUN
#define AD AFFECT_DATA
+#define MPC MPROG_CODE
/* act_comm.c */
void check_sex args( ( CHAR_DATA *ch) );
@@ -2091,6 +2174,7 @@
/* act_obj.c */
bool can_loot args( (CHAR_DATA *ch, OBJ_DATA *obj) );
+void wear_obj args( (CHAR_DATA *ch, OBJ_DATA *obj, bool fReplace) );
void get_obj args( ( CHAR_DATA *ch, OBJ_DATA *obj,
OBJ_DATA *container ) );
@@ -2116,8 +2200,12 @@
void act_new args( ( const char *format, CHAR_DATA *ch,
const void *arg1, const void *arg2, int type,
int min_pos) );
+void printf_to_char args( ( CHAR_DATA *, char *, ... ) );
+void bugf args( ( char *, ... ) );
/* db.c */
+void reset_area args( ( AREA_DATA * pArea ) ); /* OLC */
+void reset_room args( ( ROOM_INDEX_DATA *pRoom ) ); /* OLC */
char * print_flags args( ( int flag ));
void boot_db args( ( void ) );
void area_update args( ( void ) );
@@ -2130,6 +2218,7 @@
MID * get_mob_index args( ( int vnum ) );
OID * get_obj_index args( ( int vnum ) );
RID * get_room_index args( ( int vnum ) );
+MPC * get_mprog_index args( ( int vnum ) );
char fread_letter args( ( FILE *fp ) );
int fread_number args( ( FILE *fp ) );
long fread_flag args( ( FILE *fp ) );
@@ -2190,15 +2279,12 @@
void deduct_cost args( (CHAR_DATA *ch, int cost) );
void affect_enchant args( (OBJ_DATA *obj) );
int check_immune args( (CHAR_DATA *ch, int dam_type) );
-int liq_lookup args( ( const char *name) );
int material_lookup args( ( const char *name) );
int weapon_lookup args( ( const char *name) );
int weapon_type args( ( const char *name) );
char *weapon_name args( ( int weapon_Type) );
-int item_lookup args( ( const char *name) );
char *item_name args( ( int item_type) );
int attack_lookup args( ( const char *name) );
-int race_lookup args( ( const char *name) );
long wiznet_lookup args( ( const char *name) );
int class_lookup args( ( const char *name) );
bool is_clan args( (CHAR_DATA *ch) );
@@ -2272,7 +2358,6 @@
char * comm_bit_name args( ( int comm_flags ) );
char * cont_bit_name args( ( int cont_flags) );
-
/* interp.c */
void interpret args( ( CHAR_DATA *ch, char *argument ) );
bool is_number args( ( char *arg ) );
@@ -2288,6 +2373,23 @@
bool saves_spell args( ( int level, CHAR_DATA *victim, int dam_type ) );
void obj_cast_spell args( ( int sn, int level, CHAR_DATA *ch,
CHAR_DATA *victim, OBJ_DATA *obj ) );
+
+/* mob_prog.c */
+void program_flow args( ( sh_int vnum, char *source, CHAR_DATA *mob, CHAR_DATA *ch,
+ const void *arg1, const void *arg2 ) );
+void mp_act_trigger args( ( char *argument, CHAR_DATA *mob, CHAR_DATA *ch,
+ const void *arg1, const void *arg2, int type ) );
+bool mp_percent_trigger args( ( CHAR_DATA *mob, CHAR_DATA *ch,
+ const void *arg1, const void *arg2, int type ) );
+void mp_bribe_trigger args( ( CHAR_DATA *mob, CHAR_DATA *ch, int amount ) );
+bool mp_exit_trigger args( ( CHAR_DATA *ch, int dir ) );
+void mp_give_trigger args( ( CHAR_DATA *mob, CHAR_DATA *ch, OBJ_DATA *obj ) );
+void mp_greet_trigger args( ( CHAR_DATA *ch ) );
+void mp_hprct_trigger args( ( CHAR_DATA *mob, CHAR_DATA *ch ) );
+
+/* mob_cmds.c */
+void mob_interpret args( ( CHAR_DATA *ch, char *argument ) );
+
/* save.c */
void save_char_obj args( ( CHAR_DATA *ch ) );
bool load_char_obj args( ( DESCRIPTOR_DATA *d, char *name ) );
@@ -2318,6 +2420,26 @@
void gain_condition args( ( CHAR_DATA *ch, int iCond, int value ) );
void update_handler args( ( void ) );
+/* string.c */
+void string_edit args( ( CHAR_DATA *ch, char **pString ) );
+void string_append args( ( CHAR_DATA *ch, char **pString ) );
+char * string_replace args( ( char * orig, char * old, char * new ) );
+void string_add args( ( CHAR_DATA *ch, char *argument ) );
+char * format_string args( ( char *oldstring /*, bool fSpace */ ) );
+char * first_arg args( ( char *argument, char *arg_first, bool fCase ) );
+char * string_unpad args( ( char * argument ) );
+char * string_proper args( ( char * argument ) );
+
+/* olc.c */
+bool run_olc_editor args( ( DESCRIPTOR_DATA *d ) );
+char *olc_ed_name args( ( CHAR_DATA *ch ) );
+char *olc_ed_vnum args( ( CHAR_DATA *ch ) );
+
+/* lookup.c */
+int race_lookup args( ( const char *name) );
+int item_lookup args( ( const char *name) );
+int liq_lookup args( ( const char *name) );
+
#undef CD
#undef MID
#undef OD
@@ -2325,3 +2447,59 @@
#undef RID
#undef SF
#undef AD
+
+/*****************************************************************************
+ * OLC *
+ *****************************************************************************/
+
+/*
+ * Object defined in limbo.are
+ * Used in save.c to load objects that don't exist.
+ */
+#define OBJ_VNUM_DUMMY 30
+
+/*
+ * Area flags.
+ */
+#define AREA_NONE 0
+#define AREA_CHANGED 1 /* Area has been modified. */
+#define AREA_ADDED 2 /* Area has been added to. */
+#define AREA_LOADING 4 /* Used for counting in db.c */
+
+#define MAX_DIR 6
+#define NO_FLAG -99 /* Must not be used in flags or stats. */
+
+/*
+ * Global Constants
+ */
+extern char * const dir_name [];
+extern const sh_int rev_dir []; /* sh_int - ROM OLC */
+extern const struct spec_type spec_table [];
+
+/*
+ * Global variables
+ */
+extern AREA_DATA * area_first;
+extern AREA_DATA * area_last;
+extern SHOP_DATA * shop_last;
+
+extern int top_affect;
+extern int top_area;
+extern int top_ed;
+extern int top_exit;
+extern int top_help;
+extern int top_mob_index;
+extern int top_obj_index;
+extern int top_reset;
+extern int top_room;
+extern int top_shop;
+
+extern int top_vnum_mob;
+extern int top_vnum_obj;
+extern int top_vnum_room;
+
+extern char str_empty [1];
+
+extern MOB_INDEX_DATA * mob_index_hash [MAX_KEY_HASH];
+extern OBJ_INDEX_DATA * obj_index_hash [MAX_KEY_HASH];
+extern ROOM_INDEX_DATA * room_index_hash [MAX_KEY_HASH];
Only in new: mob_cmds.c
Only in new: mob_cmds.h
Only in new: mob_prog.c
Only in new: olc_act.c
Only in new: olc.c
Only in new: olc.h
Only in new: olc_mpcode.c
Only in new: olc_save.c
Only in new: patch.olc
diff -ur old/recycle.c new/recycle.c
--- old/recycle.c 1998-05-23 15:27:55.000000000 -0700
+++ new/recycle.c 2007-02-03 08:34:13.000000000 -0800
@@ -639,14 +639,81 @@
return buffer->string;
}
-
+/* stuff for recycling mobprograms */
+MPROG_LIST *mprog_free;
-
+MPROG_LIST *new_mprog(void)
+{
+ static MPROG_LIST mp_zero;
+ MPROG_LIST *mp;
+
+ if (mprog_free == NULL)
+ mp = alloc_perm(sizeof(*mp));
+ else
+ {
+ mp = mprog_free;
+ mprog_free=mprog_free->next;
+ }
+
+ *mp = mp_zero;
+ mp->vnum = 0;
+ mp->trig_type = 0;
+ mp->code = str_dup("");
+ VALIDATE(mp);
+ return mp;
+}
+
+void free_mprog(MPROG_LIST *mp)
+{
+ if (!IS_VALID(mp))
+ return;
+
+ INVALIDATE(mp);
+ mp->next = mprog_free;
+ mprog_free = mp;
+}
+HELP_AREA * had_free;
+HELP_AREA * new_had ( void )
+{
+ HELP_AREA * had;
+static HELP_AREA zHad;
+
+ if ( had_free )
+ {
+ had = had_free;
+ had_free = had_free->next;
+ }
+ else
+ had = alloc_perm( sizeof( *had ) );
+ *had = zHad;
+ return had;
+}
+HELP_DATA * help_free;
+HELP_DATA * new_help ( void )
+{
+ HELP_DATA * help;
+
+ if ( help_free )
+ {
+ help = help_free;
+ help_free = help_free->next;
+ }
+ else
+ help = alloc_perm( sizeof( *help ) );
+ return help;
+}
+void free_help(HELP_DATA *help)
+{
+ free_string(help->keyword);
+ free_string(help->text);
+ help->next = help_free;
+ help_free = help;
+}
diff -ur old/recycle.h new/recycle.h
--- old/recycle.h 1998-05-23 15:27:56.000000000 -0700
+++ new/recycle.h 2007-02-03 08:34:13.000000000 -0800
@@ -103,10 +103,13 @@
#undef MD
/* buffer procedures */
-
BUFFER *new_buf args( (void) );
BUFFER *new_buf_size args( (int size) );
void free_buf args( (BUFFER *buffer) );
bool add_buf args( (BUFFER *buffer, char *string) );
void clear_buf args( (BUFFER *buffer) );
char *buf_string args( (BUFFER *buffer) );
+
+HELP_AREA * new_had args( ( void ) );
+HELP_DATA * new_help args( ( void ) );
+void free_help args( ( HELP_DATA * ) );
diff -ur old/save.c new/save.c
--- old/save.c 1998-05-24 23:25:25.000000000 -0700
+++ new/save.c 2007-02-03 08:34:13.000000000 -0800
@@ -37,15 +37,15 @@
#include <malloc.h>
#include "merc.h"
#include "recycle.h"
-#include "lookup.h"
#include "tables.h"
+#include "lookup.h"
#if !defined(macintosh)
extern int _filbuf args( (FILE *) );
#endif
-int rename(const char *oldfname, const char *newfname);
+/* int rename(const char *oldfname, const char *newfname); viene en stdio.h */
char *print_flags(int flag)
{
@@ -188,6 +188,7 @@
fprintf( fp, "Levl %d\n", ch->level );
if (ch->trust != 0)
fprintf( fp, "Tru %d\n", ch->trust );
+ fprintf( fp, "Sec %d\n", ch->pcdata->security ); /* OLC */
fprintf( fp, "Plyd %d\n",
ch->played + (int) (current_time - ch->logon) );
fprintf( fp, "Not %ld %ld %ld %ld %ld\n",
@@ -567,6 +568,7 @@
ch->pcdata->condition[COND_THIRST] = 48;
ch->pcdata->condition[COND_FULL] = 48;
ch->pcdata->condition[COND_HUNGER] = 48;
+ ch->pcdata->security = 0; /* OLC */
found = FALSE;
fclose( fpReserve );
@@ -1051,6 +1053,7 @@
KEY( "Sex", ch->sex, fread_number( fp ) );
KEY( "ShortDescr", ch->short_descr, fread_string( fp ) );
KEY( "ShD", ch->short_descr, fread_string( fp ) );
+ KEY( "Sec", ch->pcdata->security, fread_number( fp ) ); /* OLC */
KEY( "Silv", ch->silver, fread_number( fp ) );
@@ -1339,7 +1342,7 @@
}
}
-
+extern OBJ_DATA *obj_free;
void fread_obj( CHAR_DATA *ch, FILE *fp )
{
@@ -1492,14 +1495,20 @@
if ( !str_cmp( word, "End" ) )
{
- if ( !fNest || !fVnum || obj->pIndexData == NULL)
+ if ( !fNest || ( fVnum && obj->pIndexData == NULL ) )
{
bug( "Fread_obj: incomplete object.", 0 );
free_obj(obj);
return;
}
else
- {
+ {
+ if ( !fVnum )
+ {
+ free_obj( obj );
+ obj = create_object( get_obj_index( OBJ_VNUM_DUMMY ), 0 );
+ }
+
if (!new_format)
{
obj->next = object_list;
Only in new: string.c
diff -ur old/tables.c new/tables.c
--- old/tables.c 1998-05-23 15:28:04.000000000 -0700
+++ new/tables.c 2007-02-03 08:34:13.000000000 -0800
@@ -306,17 +306,481 @@
{ NULL, 0, 0 }
};
+const struct flag_type mprog_flags[] =
+{
+ { "act", TRIG_ACT, TRUE },
+ { "bribe", TRIG_BRIBE, TRUE },
+ { "death", TRIG_DEATH, TRUE },
+ { "entry", TRIG_ENTRY, TRUE },
+ { "fight", TRIG_FIGHT, TRUE },
+ { "give", TRIG_GIVE, TRUE },
+ { "greet", TRIG_GREET, TRUE },
+ { "grall", TRIG_GRALL, TRUE },
+ { "kill", TRIG_KILL, TRUE },
+ { "hpcnt", TRIG_HPCNT, TRUE },
+ { "random", TRIG_RANDOM, TRUE },
+ { "speech", TRIG_SPEECH, TRUE },
+ { "exit", TRIG_EXIT, TRUE },
+ { "exall", TRIG_EXALL, TRUE },
+ { "delay", TRIG_DELAY, TRUE },
+ { "surr", TRIG_SURR, TRUE },
+ { NULL, 0, TRUE }
+};
+
+const struct flag_type area_flags[] =
+{
+ { "none", AREA_NONE, FALSE },
+ { "changed", AREA_CHANGED, TRUE },
+ { "added", AREA_ADDED, TRUE },
+ { "loading", AREA_LOADING, FALSE },
+ { NULL, 0, 0 }
+};
+
+
+
+const struct flag_type sex_flags[] =
+{
+ { "male", SEX_MALE, TRUE },
+ { "female", SEX_FEMALE, TRUE },
+ { "neutral", SEX_NEUTRAL, TRUE },
+ { "random", 3, TRUE }, /* ROM */
+ { "none", SEX_NEUTRAL, TRUE },
+ { NULL, 0, 0 }
+};
+const struct flag_type exit_flags[] =
+{
+ { "door", EX_ISDOOR, TRUE },
+ { "closed", EX_CLOSED, TRUE },
+ { "locked", EX_LOCKED, TRUE },
+ { "pickproof", EX_PICKPROOF, TRUE },
+ { "nopass", EX_NOPASS, TRUE },
+ { "easy", EX_EASY, TRUE },
+ { "hard", EX_HARD, TRUE },
+ { "infuriating", EX_INFURIATING, TRUE },
+ { "noclose", EX_NOCLOSE, TRUE },
+ { "nolock", EX_NOLOCK, TRUE },
+ { NULL, 0, 0 }
+};
+const struct flag_type door_resets[] =
+{
+ { "open and unlocked", 0, TRUE },
+ { "closed and unlocked", 1, TRUE },
+ { "closed and locked", 2, TRUE },
+ { NULL, 0, 0 }
+};
+const struct flag_type room_flags[] =
+{
+ { "dark", ROOM_DARK, TRUE },
+ { "no_mob", ROOM_NO_MOB, TRUE },
+ { "indoors", ROOM_INDOORS, TRUE },
+ { "private", ROOM_PRIVATE, TRUE },
+ { "safe", ROOM_SAFE, TRUE },
+ { "solitary", ROOM_SOLITARY, TRUE },
+ { "pet_shop", ROOM_PET_SHOP, TRUE },
+ { "no_recall", ROOM_NO_RECALL, TRUE },
+ { "imp_only", ROOM_IMP_ONLY, TRUE },
+ { "gods_only", ROOM_GODS_ONLY, TRUE },
+ { "heroes_only", ROOM_HEROES_ONLY, TRUE },
+ { "newbies_only", ROOM_NEWBIES_ONLY, TRUE },
+ { "law", ROOM_LAW, TRUE },
+ { "nowhere", ROOM_NOWHERE, TRUE },
+ { NULL, 0, 0 }
+};
+const struct flag_type sector_flags[] =
+{
+ { "inside", SECT_INSIDE, TRUE },
+ { "city", SECT_CITY, TRUE },
+ { "field", SECT_FIELD, TRUE },
+ { "forest", SECT_FOREST, TRUE },
+ { "hills", SECT_HILLS, TRUE },
+ { "mountain", SECT_MOUNTAIN, TRUE },
+ { "swim", SECT_WATER_SWIM, TRUE },
+ { "noswim", SECT_WATER_NOSWIM, TRUE },
+ { "unused", SECT_UNUSED, TRUE },
+ { "air", SECT_AIR, TRUE },
+ { "desert", SECT_DESERT, TRUE },
+ { NULL, 0, 0 }
+};
+
+const struct flag_type type_flags[] =
+{
+ { "light", ITEM_LIGHT, TRUE },
+ { "scroll", ITEM_SCROLL, TRUE },
+ { "wand", ITEM_WAND, TRUE },
+ { "staff", ITEM_STAFF, TRUE },
+ { "weapon", ITEM_WEAPON, TRUE },
+ { "treasure", ITEM_TREASURE, TRUE },
+ { "armor", ITEM_ARMOR, TRUE },
+ { "potion", ITEM_POTION, TRUE },
+ { "furniture", ITEM_FURNITURE, TRUE },
+ { "trash", ITEM_TRASH, TRUE },
+ { "container", ITEM_CONTAINER, TRUE },
+ { "drinkcontainer", ITEM_DRINK_CON, TRUE },
+ { "key", ITEM_KEY, TRUE },
+ { "food", ITEM_FOOD, TRUE },
+ { "money", ITEM_MONEY, TRUE },
+ { "boat", ITEM_BOAT, TRUE },
+ { "npccorpse", ITEM_CORPSE_NPC, TRUE },
+ { "pc corpse", ITEM_CORPSE_PC, FALSE },
+ { "fountain", ITEM_FOUNTAIN, TRUE },
+ { "pill", ITEM_PILL, TRUE },
+ { "protect", ITEM_PROTECT, TRUE },
+ { "map", ITEM_MAP, TRUE },
+ { "portal", ITEM_PORTAL, TRUE },
+ { "warpstone", ITEM_WARP_STONE, TRUE },
+ { "roomkey", ITEM_ROOM_KEY, TRUE },
+ { "gem", ITEM_GEM, TRUE },
+ { "jewelry", ITEM_JEWELRY, TRUE },
+ { "jukebox", ITEM_JUKEBOX, TRUE },
+ { NULL, 0, 0 }
+};
+
+
+const struct flag_type extra_flags[] =
+{
+ { "glow", ITEM_GLOW, TRUE },
+ { "hum", ITEM_HUM, TRUE },
+ { "dark", ITEM_DARK, TRUE },
+ { "lock", ITEM_LOCK, TRUE },
+ { "evil", ITEM_EVIL, TRUE },
+ { "invis", ITEM_INVIS, TRUE },
+ { "magic", ITEM_MAGIC, TRUE },
+ { "nodrop", ITEM_NODROP, TRUE },
+ { "bless", ITEM_BLESS, TRUE },
+ { "antigood", ITEM_ANTI_GOOD, TRUE },
+ { "antievil", ITEM_ANTI_EVIL, TRUE },
+ { "antineutral", ITEM_ANTI_NEUTRAL, TRUE },
+ { "noremove", ITEM_NOREMOVE, TRUE },
+ { "inventory", ITEM_INVENTORY, TRUE },
+ { "nopurge", ITEM_NOPURGE, TRUE },
+ { "rotdeath", ITEM_ROT_DEATH, TRUE },
+ { "visdeath", ITEM_VIS_DEATH, TRUE },
+ { "nonmetal", ITEM_NONMETAL, TRUE },
+ { "meltdrop", ITEM_MELT_DROP, TRUE },
+ { "hadtimer", ITEM_HAD_TIMER, TRUE },
+ { "sellextract", ITEM_SELL_EXTRACT, TRUE },
+ { "burnproof", ITEM_BURN_PROOF, TRUE },
+ { "nouncurse", ITEM_NOUNCURSE, TRUE },
+ { NULL, 0, 0 }
+};
+
+
+
+const struct flag_type wear_flags[] =
+{
+ { "take", ITEM_TAKE, TRUE },
+ { "finger", ITEM_WEAR_FINGER, TRUE },
+ { "neck", ITEM_WEAR_NECK, TRUE },
+ { "body", ITEM_WEAR_BODY, TRUE },
+ { "head", ITEM_WEAR_HEAD, TRUE },
+ { "legs", ITEM_WEAR_LEGS, TRUE },
+ { "feet", ITEM_WEAR_FEET, TRUE },
+ { "hands", ITEM_WEAR_HANDS, TRUE },
+ { "arms", ITEM_WEAR_ARMS, TRUE },
+ { "shield", ITEM_WEAR_SHIELD, TRUE },
+ { "about", ITEM_WEAR_ABOUT, TRUE },
+ { "waist", ITEM_WEAR_WAIST, TRUE },
+ { "wrist", ITEM_WEAR_WRIST, TRUE },
+ { "wield", ITEM_WIELD, TRUE },
+ { "hold", ITEM_HOLD, TRUE },
+ { "nosac", ITEM_NO_SAC, TRUE },
+ { "wearfloat", ITEM_WEAR_FLOAT, TRUE },
+/* { "twohands", ITEM_TWO_HANDS, TRUE }, */
+ { NULL, 0, 0 }
+};
+
+/*
+ * Used when adding an affect to tell where it goes.
+ * See addaffect and delaffect in act_olc.c
+ */
+const struct flag_type apply_flags[] =
+{
+ { "none", APPLY_NONE, TRUE },
+ { "strength", APPLY_STR, TRUE },
+ { "dexterity", APPLY_DEX, TRUE },
+ { "intelligence", APPLY_INT, TRUE },
+ { "wisdom", APPLY_WIS, TRUE },
+ { "constitution", APPLY_CON, TRUE },
+ { "sex", APPLY_SEX, TRUE },
+ { "class", APPLY_CLASS, TRUE },
+ { "level", APPLY_LEVEL, TRUE },
+ { "age", APPLY_AGE, TRUE },
+ { "height", APPLY_HEIGHT, TRUE },
+ { "weight", APPLY_WEIGHT, TRUE },
+ { "mana", APPLY_MANA, TRUE },
+ { "hp", APPLY_HIT, TRUE },
+ { "move", APPLY_MOVE, TRUE },
+ { "gold", APPLY_GOLD, TRUE },
+ { "experience", APPLY_EXP, TRUE },
+ { "ac", APPLY_AC, TRUE },
+ { "hitroll", APPLY_HITROLL, TRUE },
+ { "damroll", APPLY_DAMROLL, TRUE },
+ { "saves", APPLY_SAVES, TRUE },
+ { "savingpara", APPLY_SAVING_PARA, TRUE },
+ { "savingrod", APPLY_SAVING_ROD, TRUE },
+ { "savingpetri", APPLY_SAVING_PETRI, TRUE },
+ { "savingbreath", APPLY_SAVING_BREATH, TRUE },
+ { "savingspell", APPLY_SAVING_SPELL, TRUE },
+ { "spellaffect", APPLY_SPELL_AFFECT, FALSE },
+ { NULL, 0, 0 }
+};
+
+
+
+/*
+ * What is seen.
+ */
+const struct flag_type wear_loc_strings[] =
+{
+ { "in the inventory", WEAR_NONE, TRUE },
+ { "as a light", WEAR_LIGHT, TRUE },
+ { "on the left finger", WEAR_FINGER_L, TRUE },
+ { "on the right finger", WEAR_FINGER_R, TRUE },
+ { "around the neck (1)", WEAR_NECK_1, TRUE },
+ { "around the neck (2)", WEAR_NECK_2, TRUE },
+ { "on the body", WEAR_BODY, TRUE },
+ { "over the head", WEAR_HEAD, TRUE },
+ { "on the legs", WEAR_LEGS, TRUE },
+ { "on the feet", WEAR_FEET, TRUE },
+ { "on the hands", WEAR_HANDS, TRUE },
+ { "on the arms", WEAR_ARMS, TRUE },
+ { "as a shield", WEAR_SHIELD, TRUE },
+ { "about the shoulders", WEAR_ABOUT, TRUE },
+ { "around the waist", WEAR_WAIST, TRUE },
+ { "on the left wrist", WEAR_WRIST_L, TRUE },
+ { "on the right wrist", WEAR_WRIST_R, TRUE },
+ { "wielded", WEAR_WIELD, TRUE },
+ { "held in the hands", WEAR_HOLD, TRUE },
+ { "floating nearby", WEAR_FLOAT, TRUE },
+ { NULL, 0 , 0 }
+};
+
+
+const struct flag_type wear_loc_flags[] =
+{
+ { "none", WEAR_NONE, TRUE },
+ { "light", WEAR_LIGHT, TRUE },
+ { "lfinger", WEAR_FINGER_L, TRUE },
+ { "rfinger", WEAR_FINGER_R, TRUE },
+ { "neck1", WEAR_NECK_1, TRUE },
+ { "neck2", WEAR_NECK_2, TRUE },
+ { "body", WEAR_BODY, TRUE },
+ { "head", WEAR_HEAD, TRUE },
+ { "legs", WEAR_LEGS, TRUE },
+ { "feet", WEAR_FEET, TRUE },
+ { "hands", WEAR_HANDS, TRUE },
+ { "arms", WEAR_ARMS, TRUE },
+ { "shield", WEAR_SHIELD, TRUE },
+ { "about", WEAR_ABOUT, TRUE },
+ { "waist", WEAR_WAIST, TRUE },
+ { "lwrist", WEAR_WRIST_L, TRUE },
+ { "rwrist", WEAR_WRIST_R, TRUE },
+ { "wielded", WEAR_WIELD, TRUE },
+ { "hold", WEAR_HOLD, TRUE },
+ { "floating", WEAR_FLOAT, TRUE },
+ { NULL, 0, 0 }
+};
+
+const struct flag_type container_flags[] =
+{
+ { "closeable", 1, TRUE },
+ { "pickproof", 2, TRUE },
+ { "closed", 4, TRUE },
+ { "locked", 8, TRUE },
+ { "puton", 16, TRUE },
+ { NULL, 0, 0 }
+};
+
+/*****************************************************************************
+ ROM - specific tables:
+ ****************************************************************************/
+
+
+
+
+const struct flag_type ac_type[] =
+{
+ { "pierce", AC_PIERCE, TRUE },
+ { "bash", AC_BASH, TRUE },
+ { "slash", AC_SLASH, TRUE },
+ { "exotic", AC_EXOTIC, TRUE },
+ { NULL, 0, 0 }
+};
+
+
+const struct flag_type size_flags[] =
+{
+ { "tiny", SIZE_TINY, TRUE },
+ { "small", SIZE_SMALL, TRUE },
+ { "medium", SIZE_MEDIUM, TRUE },
+ { "large", SIZE_LARGE, TRUE },
+ { "huge", SIZE_HUGE, TRUE },
+ { "giant", SIZE_GIANT, TRUE },
+ { NULL, 0, 0 },
+};
+
+
+const struct flag_type weapon_class[] =
+{
+ { "exotic", WEAPON_EXOTIC, TRUE },
+ { "sword", WEAPON_SWORD, TRUE },
+ { "dagger", WEAPON_DAGGER, TRUE },
+ { "spear", WEAPON_SPEAR, TRUE },
+ { "mace", WEAPON_MACE, TRUE },
+ { "axe", WEAPON_AXE, TRUE },
+ { "flail", WEAPON_FLAIL, TRUE },
+ { "whip", WEAPON_WHIP, TRUE },
+ { "polearm", WEAPON_POLEARM, TRUE },
+ { NULL, 0, 0 }
+};
+
+
+const struct flag_type weapon_type2[] =
+{
+ { "flaming", WEAPON_FLAMING, TRUE },
+ { "frost", WEAPON_FROST, TRUE },
+ { "vampiric", WEAPON_VAMPIRIC, TRUE },
+ { "sharp", WEAPON_SHARP, TRUE },
+ { "vorpal", WEAPON_VORPAL, TRUE },
+ { "twohands", WEAPON_TWO_HANDS, TRUE },
+ { "shocking", WEAPON_SHOCKING, TRUE },
+ { "poison", WEAPON_POISON, TRUE },
+ { NULL, 0, 0 }
+};
+
+const struct flag_type res_flags[] =
+{
+ { "summon", RES_SUMMON, TRUE },
+ { "charm", RES_CHARM, TRUE },
+ { "magic", RES_MAGIC, TRUE },
+ { "weapon", RES_WEAPON, TRUE },
+ { "bash", RES_BASH, TRUE },
+ { "pierce", RES_PIERCE, TRUE },
+ { "slash", RES_SLASH, TRUE },
+ { "fire", RES_FIRE, TRUE },
+ { "cold", RES_COLD, TRUE },
+ { "lightning", RES_LIGHTNING, TRUE },
+ { "acid", RES_ACID, TRUE },
+ { "poison", RES_POISON, TRUE },
+ { "negative", RES_NEGATIVE, TRUE },
+ { "holy", RES_HOLY, TRUE },
+ { "energy", RES_ENERGY, TRUE },
+ { "mental", RES_MENTAL, TRUE },
+ { "disease", RES_DISEASE, TRUE },
+ { "drowning", RES_DROWNING, TRUE },
+ { "light", RES_LIGHT, TRUE },
+ { "sound", RES_SOUND, TRUE },
+ { "wood", RES_WOOD, TRUE },
+ { "silver", RES_SILVER, TRUE },
+ { "iron", RES_IRON, TRUE },
+ { NULL, 0, 0 }
+};
+
+
+const struct flag_type vuln_flags[] =
+{
+ { "summon", VULN_SUMMON, TRUE },
+ { "charm", VULN_CHARM, TRUE },
+ { "magic", VULN_MAGIC, TRUE },
+ { "weapon", VULN_WEAPON, TRUE },
+ { "bash", VULN_BASH, TRUE },
+ { "pierce", VULN_PIERCE, TRUE },
+ { "slash", VULN_SLASH, TRUE },
+ { "fire", VULN_FIRE, TRUE },
+ { "cold", VULN_COLD, TRUE },
+ { "lightning", VULN_LIGHTNING, TRUE },
+ { "acid", VULN_ACID, TRUE },
+ { "poison", VULN_POISON, TRUE },
+ { "negative", VULN_NEGATIVE, TRUE },
+ { "holy", VULN_HOLY, TRUE },
+ { "energy", VULN_ENERGY, TRUE },
+ { "mental", VULN_MENTAL, TRUE },
+ { "disease", VULN_DISEASE, TRUE },
+ { "drowning", VULN_DROWNING, TRUE },
+ { "light", VULN_LIGHT, TRUE },
+ { "sound", VULN_SOUND, TRUE },
+ { "wood", VULN_WOOD, TRUE },
+ { "silver", VULN_SILVER, TRUE },
+ { "iron", VULN_IRON, TRUE },
+ { NULL, 0, 0 }
+};
+
+const struct flag_type position_flags[] =
+{
+ { "dead", POS_DEAD, FALSE },
+ { "mortal", POS_MORTAL, FALSE },
+ { "incap", POS_INCAP, FALSE },
+ { "stunned", POS_STUNNED, FALSE },
+ { "sleeping", POS_SLEEPING, TRUE },
+ { "resting", POS_RESTING, TRUE },
+ { "sitting", POS_SITTING, TRUE },
+ { "fighting", POS_FIGHTING, FALSE },
+ { "standing", POS_STANDING, TRUE },
+ { NULL, 0, 0 }
+};
+
+const struct flag_type portal_flags[]=
+{
+ { "normal_exit", GATE_NORMAL_EXIT, TRUE },
+ { "no_curse", GATE_NOCURSE, TRUE },
+ { "go_with", GATE_GOWITH, TRUE },
+ { "buggy", GATE_BUGGY, TRUE },
+ { "random", GATE_RANDOM, TRUE },
+ { NULL, 0, 0 }
+};
+
+const struct flag_type furniture_flags[]=
+{
+ { "stand_at", STAND_AT, TRUE },
+ { "stand_on", STAND_ON, TRUE },
+ { "stand_in", STAND_IN, TRUE },
+ { "sit_at", SIT_AT, TRUE },
+ { "sit_on", SIT_ON, TRUE },
+ { "sit_in", SIT_IN, TRUE },
+ { "rest_at", REST_AT, TRUE },
+ { "rest_on", REST_ON, TRUE },
+ { "rest_in", REST_IN, TRUE },
+ { "sleep_at", SLEEP_AT, TRUE },
+ { "sleep_on", SLEEP_ON, TRUE },
+ { "sleep_in", SLEEP_IN, TRUE },
+ { "put_at", PUT_AT, TRUE },
+ { "put_on", PUT_ON, TRUE },
+ { "put_in", PUT_IN, TRUE },
+ { "put_inside", PUT_INSIDE, TRUE },
+ { NULL, 0, 0 }
+};
+
+const struct flag_type apply_types [] =
+{
+ { "affects", TO_AFFECTS, TRUE },
+ { "object", TO_OBJECT, TRUE },
+ { "immune", TO_IMMUNE, TRUE },
+ { "resist", TO_RESIST, TRUE },
+ { "vuln", TO_VULN, TRUE },
+ { "weapon", TO_WEAPON, TRUE },
+ { NULL, 0, TRUE }
+};
+
+const struct bit_type bitvector_type [] =
+{
+ { affect_flags, "affect" },
+ { apply_flags, "apply" },
+ { imm_flags, "imm" },
+ { res_flags, "res" },
+ { vuln_flags, "vuln" },
+ { weapon_type2, "weapon" }
+};
diff -ur old/tables.h new/tables.h
--- old/tables.h 2007-02-03 07:13:46.000000000 -0800
+++ new/tables.h 2007-02-03 08:37:45.000000000 -0800
@@ -56,6 +56,12 @@
char *name;
};
+struct bit_type
+{
+ const struct flag_type * table;
+ char * help;
+};
+
/* game tables */
extern const struct clan_type clan_table[MAX_CLAN];
extern const struct position_type position_table[];
@@ -78,4 +84,24 @@
extern const struct flag_type portal_flags[];
extern const struct flag_type room_flags[];
extern const struct flag_type exit_flags[];
-
+extern const struct flag_type mprog_flags[];
+extern const struct flag_type area_flags[];
+extern const struct flag_type sector_flags[];
+extern const struct flag_type door_resets[];
+extern const struct flag_type wear_loc_strings[];
+extern const struct flag_type wear_loc_flags[];
+extern const struct flag_type res_flags[];
+extern const struct flag_type imm_flags[];
+extern const struct flag_type vuln_flags[];
+extern const struct flag_type type_flags[];
+extern const struct flag_type apply_flags[];
+extern const struct flag_type sex_flags[];
+extern const struct flag_type furniture_flags[];
+extern const struct flag_type weapon_class[];
+extern const struct flag_type apply_types[];
+extern const struct flag_type weapon_type2[];
+extern const struct flag_type apply_types[];
+extern const struct flag_type size_flags[];
+extern const struct flag_type position_flags[];
+extern const struct flag_type ac_type[];
+extern const struct bit_type bitvector_type[];
diff -ur old/update.c new/update.c
--- old/update.c 1998-05-27 17:35:35.000000000 -0700
+++ new/update.c 2007-02-03 08:38:34.000000000 -0800
@@ -402,6 +402,28 @@
ch->gold += ch->pIndexData->wealth * number_range(1,20)/5000000;
ch->silver += ch->pIndexData->wealth * number_range(1,20)/50000;
}
+
+ /*
+ * Check triggers only if mobile still in default position
+ */
+ if ( ch->position == ch->pIndexData->default_pos )
+ {
+ /* Delay */
+ if ( HAS_TRIGGER( ch, TRIG_DELAY)
+ && ch->mprog_delay > 0 )
+ {
+ if ( --ch->mprog_delay <= 0 )
+ {
+ mp_percent_trigger( ch, NULL, NULL, NULL, TRIG_DELAY );
+ continue;
+ }
+ }
+ if ( HAS_TRIGGER( ch, TRIG_RANDOM) )
+ {
+ if( mp_percent_trigger( ch, NULL, NULL, NULL, TRIG_RANDOM ) )
+ continue;
+ }
+ }
/* That's all for sleeping / busy monster, and empty zones */