diff -urpN src/act_wiz.c new/act_wiz.c
--- src/act_wiz.c Thu Feb 11 14:39:58 1999
+++ new/act_wiz.c Sat May 17 19:01:45 2003
@@ -1327,7 +1327,13 @@ void do_ostat( CHAR_DATA *ch, char *argu
send_to_char(buf,ch);
break;
-
+ case ITEM_BEACON:
+ if(obj->value[1] == 0)
+ strcpy(buf,"It is disabled.\n\r");
+ else
+ sprintf(buf,"It transmits to %s vnum %d.\n\r",
+ obj->value[1] == 1 ? "room" : "object", obj->value[0]);
+ send_to_char(buf, ch);
case ITEM_WEAPON:
send_to_char("Weapon type is ",ch);
switch (obj->value[0])
diff -urpN src/bit.c new/bit.c
--- src/bit.c Sun Feb 7 10:13:50 1999
+++ new/bit.c Sat May 17 19:01:41 2003
@@ -294,6 +294,7 @@ const struct flag_type type_flags[] =
{ "clothing", ITEM_CLOTHING, TRUE },
{ "protect", ITEM_PROTECT, TRUE },
{ "map", ITEM_MAP, TRUE },
+ { "beacon", ITEM_BEACON, TRUE },
{ "", 0, 0 }
};
diff -urpN src/comm.c new/comm.c
--- src/comm.c Wed Feb 3 17:18:20 1999
+++ new/comm.c Sat May 17 19:46:02 2003
@@ -2481,22 +2481,114 @@ void fix_sex(CHAR_DATA *ch)
ch->sex = IS_NPC(ch) ? 0 : ch->pcdata->true_sex;
}
-void act_new( const char *format, CHAR_DATA *ch, const void *arg1,
- const void *arg2, int type, int min_pos)
+bool send_ok(int type, int min_pos, CHAR_DATA *to, CHAR_DATA *ch, CHAR_DATA *vch)
+{
+ if ( to->desc == NULL || to->position < min_pos )
+ return FALSE;
+ if ( (type == TO_CHAR) && to != ch )
+ return FALSE;
+ if ( type == TO_VICT && ( to != vch || to == ch ) )
+ return FALSE;
+ if ( type == TO_ROOM && to == ch )
+ return FALSE;
+ if ( type == TO_NOTVICT && (to == ch || to == vch) )
+ return FALSE;
+
+ return TRUE;
+}
+
+void write_act(const char *format, CHAR_DATA *to, CHAR_DATA *ch, const void *arg1, const void *arg2)
{
static char * const he_she [] = { "it", "he", "she" };
static char * const him_her [] = { "it", "him", "her" };
static char * const his_her [] = { "its", "his", "her" };
-
- char buf[MAX_STRING_LENGTH];
- char fname[MAX_INPUT_LENGTH];
- CHAR_DATA *to;
CHAR_DATA *vch = (CHAR_DATA *) arg2;
OBJ_DATA *obj1 = (OBJ_DATA *) arg1;
OBJ_DATA *obj2 = (OBJ_DATA *) arg2;
+ char buf[MAX_STRING_LENGTH];
+ char fname[MAX_INPUT_LENGTH];
const char *str;
const char *i;
char *point;
+
+ point = buf;
+ str = format;
+ while ( *str != '\0' )
+ {
+ if ( *str != '$' )
+ {
+ *point++ = *str++;
+ continue;
+ }
+ ++str;
+
+ if ( arg2 == NULL && *str >= 'A' && *str <= 'Z' )
+ {
+ bug( "Act: missing arg2 for code %d.", *str );
+ i = " <@@@> ";
+ }
+ else
+ {
+ switch ( *str )
+ {
+ default: bug( "Act: bad code %d.", *str );
+ i = " <@@@> "; break;
+ /* Thx alex for 't' idea */
+ case 't': i = (char *) arg1; break;
+ case 'T': i = (char *) arg2; break;
+ case 'n': i = PERS( ch, to ); break;
+ case 'N': i = PERS( vch, to ); break;
+ case 'e': i = he_she [URANGE(0, ch ->sex, 2)]; break;
+ case 'E': i = he_she [URANGE(0, vch ->sex, 2)]; break;
+ case 'm': i = him_her [URANGE(0, ch ->sex, 2)]; break;
+ case 'M': i = him_her [URANGE(0, vch ->sex, 2)]; break;
+ case 's': i = his_her [URANGE(0, ch ->sex, 2)]; break;
+ case 'S': i = his_her [URANGE(0, vch ->sex, 2)]; break;
+
+ case 'p':
+ i = can_see_obj( to, obj1 )
+ ? obj1->short_descr
+ : "something";
+ break;
+
+ case 'P':
+ i = can_see_obj( to, obj2 )
+ ? obj2->short_descr
+ : "something";
+ break;
+
+ case 'd':
+ if ( arg2 == NULL || ((char *) arg2)[0] == '\0' )
+ {
+ i = "door";
+ }
+ else
+ {
+ one_argument( (char *) arg2, fname );
+ i = fname;
+ }
+ break;
+ }
+ }
+
+ ++str;
+ while ( ( *point = *i ) != '\0' )
+ ++point, ++i;
+ }
+
+ *point++ = '\n';
+ *point++ = '\r';
+ buf[0] = UPPER(buf[0]);
+ write_to_buffer( to->desc, buf, point - buf );
+}
+
+void act_new( const char *format, CHAR_DATA *ch, const void *arg1,
+ const void *arg2, int type, int min_pos)
+{
+ CHAR_DATA *to;
+ CHAR_DATA *vch = (CHAR_DATA *) arg2;
+ OBJ_DATA *obj1, *obj2;
+ ROOM_INDEX_DATA *room;
/*
* Discard null and zero-length messages.
@@ -2505,10 +2597,10 @@ void act_new( const char *format, CHAR_D
return;
/* discard null rooms and chars */
- if (ch == NULL || ch->in_room == NULL)
+ if (ch == NULL || (room = ch->in_room) == NULL)
return;
- to = ch->in_room->people;
+ to = room->people;
if ( type == TO_VICT )
{
if ( vch == NULL )
@@ -2517,97 +2609,72 @@ void act_new( const char *format, CHAR_D
return;
}
- if (vch->in_room == NULL)
- return;
+ if ((room = vch->in_room) == NULL)
+ return;
- to = vch->in_room->people;
+ to = room->people;
}
for ( ; to != NULL; to = to->next_in_room )
{
- if ( to->desc == NULL || to->position < min_pos )
- continue;
-
- if ( (type == TO_CHAR) && to != ch )
- continue;
- if ( type == TO_VICT && ( to != vch || to == ch ) )
- continue;
- if ( type == TO_ROOM && to == ch )
- continue;
- if ( type == TO_NOTVICT && (to == ch || to == vch) )
- continue;
-
- point = buf;
- str = format;
- while ( *str != '\0' )
- {
- if ( *str != '$' )
- {
- *point++ = *str++;
- continue;
- }
- ++str;
-
- if ( arg2 == NULL && *str >= 'A' && *str <= 'Z' )
- {
- bug( "Act: missing arg2 for code %d.", *str );
- i = " <@@@> ";
- }
- else
- {
- switch ( *str )
- {
- default: bug( "Act: bad code %d.", *str );
- i = " <@@@> "; break;
- /* Thx alex for 't' idea */
- case 't': i = (char *) arg1; break;
- case 'T': i = (char *) arg2; break;
- case 'n': i = PERS( ch, to ); break;
- case 'N': i = PERS( vch, to ); break;
- case 'e': i = he_she [URANGE(0, ch ->sex, 2)]; break;
- case 'E': i = he_she [URANGE(0, vch ->sex, 2)]; break;
- case 'm': i = him_her [URANGE(0, ch ->sex, 2)]; break;
- case 'M': i = him_her [URANGE(0, vch ->sex, 2)]; break;
- case 's': i = his_her [URANGE(0, ch ->sex, 2)]; break;
- case 'S': i = his_her [URANGE(0, vch ->sex, 2)]; break;
-
- case 'p':
- i = can_see_obj( to, obj1 )
- ? obj1->short_descr
- : "something";
- break;
-
- case 'P':
- i = can_see_obj( to, obj2 )
- ? obj2->short_descr
- : "something";
- break;
-
- case 'd':
- if ( arg2 == NULL || ((char *) arg2)[0] == '\0' )
- {
- i = "door";
- }
- else
- {
- one_argument( (char *) arg2, fname );
- i = fname;
- }
- break;
- }
- }
-
- ++str;
- while ( ( *point = *i ) != '\0' )
- ++point, ++i;
- }
-
- *point++ = '\n';
- *point++ = '\r';
- buf[0] = UPPER(buf[0]);
- write_to_buffer( to->desc, buf, point - buf );
+
+ if(!send_ok(type, min_pos, to, ch, vch))
+ continue;
+
+ write_act(format, to, ch, arg1, arg2);
}
-
+
+ /* check for beacons */
+ for(obj1 = room->contents; obj1; obj1 = obj1->next_content)
+ {
+ if(obj1->item_type == ITEM_BEACON && obj1->value[0] > 0
+ && obj1->value[1] > 0)
+ {
+ CHAR_DATA *bch;
+
+ if(obj1->value[1] == 1)
+ {
+ ROOM_INDEX_DATA *bRoom = get_room_index(obj1->value[0]);
+ if(bRoom != NULL)
+ {
+ for(bch = bRoom->people; bch; bch = bch->next_in_room)
+ {
+ if(!send_ok(type, min_pos, bch, ch, vch))
+ continue;
+
+ send_to_char("....", bch);
+ write_act(format, bch, ch, arg1, arg2);
+ }
+ }
+ else
+ obj1->value[0] = 0;
+ }
+ else if(obj1->value[1] >= 2)
+ {
+ DESCRIPTOR_DATA *d;
+
+ for(d = descriptor_list; d; d = d->next)
+ {
+ if((bch = d->character) == NULL)
+ continue;
+
+ if(!send_ok(type, min_pos, bch, ch, vch))
+ continue;
+
+ for(obj2 = vch->carrying; obj2; obj2 = obj2->next_content)
+ if(obj2->pIndexData->vnum == obj1->value[0])
+ break;
+
+ if(!obj2)
+ continue;
+
+ write_act("A strange light emits from $p, you sense a presence...",
+ bch, ch, obj2, arg2);
+ write_act(format, bch, ch, arg1, arg2);
+ }
+ }
+ }
+ }
return;
}
diff -urpN src/const.c new/const.c
--- src/const.c Sat Feb 6 15:37:06 1999
+++ new/const.c Sat May 17 19:01:33 2003
@@ -69,6 +69,7 @@ const struct item_type item_table [] =
{ ITEM_GEM, "gem" },
{ ITEM_JEWELRY, "jewelry" },
{ ITEM_JUKEBOX, "jukebox" },
+ { ITEM_BEACON, "beacon" },
{ 0, NULL }
};
diff -urpN src/db.c new/db.c
--- src/db.c Thu Feb 11 14:31:29 1999
+++ new/db.c Sat May 17 19:48:56 2003
@@ -1621,6 +1621,7 @@ OBJ_DATA *create_object( OBJ_INDEX_DATA
case ITEM_ROOM_KEY:
case ITEM_GEM:
case ITEM_JEWELRY:
+ case ITEM_BEACON:
break;
case ITEM_JUKEBOX:
diff -urpN src/db2.c new/db2.c
--- src/db2.c Wed Feb 10 15:09:32 1999
+++ new/db2.c Sat May 17 19:01:46 2003
@@ -414,6 +414,14 @@ void load_objects( FILE *fp )
pObjIndex->value[3] = fread_number(fp);
pObjIndex->value[4] = fread_number(fp);
break;
+ case ITEM_BEACON:
+ pObjIndex->value[0] = fread_number(fp);
+ pObjIndex->value[1] = fread_number(fp);
+ pObjIndex->value[2] = fread_number(fp);
+ pObjIndex->value[3] = fread_number(fp);
+ pObjIndex->value[4] = fread_number(fp);
+ break;
+
case ITEM_DRINK_CON:
case ITEM_FOUNTAIN:
pObjIndex->value[0] = fread_number(fp);
@@ -742,6 +750,7 @@ void convert_object( OBJ_INDEX_DATA *pOb
case ITEM_MAP:
case ITEM_CLOTHING:
case ITEM_SCROLL:
+ case ITEM_BEACON:
break;
case ITEM_WAND:
diff -urpN src/merc.h new/merc.h
--- src/merc.h Sun Feb 7 10:26:34 1999
+++ new/merc.h Sat May 17 19:01:30 2003
@@ -919,6 +919,7 @@ struct kill_data
#define ITEM_GEM 32
#define ITEM_JEWELRY 33
#define ITEM_JUKEBOX 34
+#define ITEM_BEACON 35
/*
* Material types
diff -urpN src/olc_act.c new/olc_act.c
--- src/olc_act.c Mon Feb 8 18:51:15 1999
+++ new/olc_act.c Sat May 17 19:04:54 2003
@@ -2180,6 +2180,17 @@ void show_obj_values( CHAR_DATA *ch, OBJ
send_to_char( buf, ch );
break;
+ case ITEM_BEACON:
+ sprintf( buf,
+ "[v0] Vnum: [%d]\n\r"
+ "[v1] Pointer: [%d]\n\r"
+ " 0 == off.\n\r"
+ " 1 == room.\n\r"
+ " 2 == object.\n\r",
+ obj->value[0], obj->value[1]);
+ send_to_char(buf, ch);
+ break;
+
case ITEM_DRINK_CON:
sprintf( buf,
"[v0] Liquid Total: [%d]\n\r"
@@ -2413,6 +2424,23 @@ bool set_obj_values( CHAR_DATA *ch, OBJ_
break;
}
break;
+
+ case ITEM_BEACON:
+ switch ( value_num )
+ {
+ default:
+ do_help( ch, "ITEM_BEACON" );
+ return FALSE;
+ case 0:
+ send_to_char( "VNUM SET.\n\r\n\r", ch);
+ pObj->value[0] = atoi( argument );
+ break;
+ case 1:
+ send_to_char( "POINTER SET.\n\r\n\r", ch);
+ pObj->value[1] = atoi( argument );
+ break;
+ }
+ break;
case ITEM_FOOD:
switch ( value_num )
diff -urpN src/olc_save.c new/olc_save.c
--- src/olc_save.c Thu Feb 11 14:49:19 1999
+++ new/olc_save.c Sat May 17 19:01:38 2003
@@ -284,6 +284,11 @@ void save_object( FILE *fp, OBJ_INDEX_DA
: pObjIndex->value[2] );
break;
+ case ITEM_BEACON:
+ fprintf(fp, "%d %d 0 0 0\n",
+ pObjIndex->value[0], pObjIndex->value[1]);
+ break;
+
case ITEM_PILL:
case ITEM_POTION:
case ITEM_SCROLL: