Ladies and gentlemen:
Been messing with this one off and on for a while, and I think the
problem is a flying pointer somewhere outside the function that
corrupts the number.
What I'm trying to accomplish is a simple teleport to a room within a
given zone (46, in this case) Neither one of these works.. am I missing
something simple, or do you think it is memory as I supposed above?
Using gdb and printing to_room after it has been assigned usually gives
me a number upward of 100000 (i.e garbage).
Attempt 1:
----------
SPECIAL(whirlpool)
{
int room;
struct char_data *vict;
int spec_occured = FALSE, to_room = 0, i = 0;
struct char_data *mobile = (struct char_data *) me;
if (!ch) return FALSE;
room = ch->in_room;
for (vict = world[room].people; vict; vict = vict->next_in_room)
if (GET_LEVEL(vict) < LVL_IMMORT && vict !=mobile){
char_from_room(ch);
for (i = 0; i <= top_of_zone_table; i++)
if (zone_table[i].number == 46)
break;
if (i >= 0 && i <= top_of_zone_table)
{
do
{
to_room = number(0, top_of_world);
/* start hack that doesn't fix the problem anyway */
/* dunno why, but i gets corrupted in
* number()?, so reset it */
for (i = 0; i <= top_of_zone_table; i++)
if (zone_table[i].number == 46)
break;
/* end hack that doesn't fix the problem anyway */
}
while( (IS_SET(world[to_room].room_flags,ROOM_PRIVATE))
||(IS_SET(world[to_room].room_flags,ROOM_GODROOM))
||(IS_SET(world[to_room].room_flags,ROOM_DEATH))
||(IS_SET(world[to_room].room_flags,ROOM_NOMOB))
||(world[to_room].zone != zone_table[i].number) );
}
char_to_room(ch, to_room);
send_to_char("A ravaging whirlpool sucks you under!\n\r", ch);
send_to_char("You finally surface, sputtering...\n\r", ch);
do_look(ch, NULL, 0, 0);
spec_occured = TRUE;
}
return(spec_occured);
}
----------
Attempt 2:
----------
SPECIAL(whirlpool)
{
int room;
struct char_data *vict;
int spec_occured = FALSE, to_room = 0;
struct char_data *mobile = (struct char_data *) me;
if (!ch)
return FALSE;
room = ch->in_room;
for (vict = world[room].people; vict; vict = vict->next_in_room)
if (GET_LEVEL(vict) < LVL_IMMORT && vict !=mobile){
char_from_room(ch);
do
{
to_room = number(real_room(4600), real_room(4699));
}
while( (IS_SET(world[to_room].room_flags,ROOM_PRIVATE))
||(IS_SET(world[to_room].room_flags,ROOM_GODROOM))
||(IS_SET(world[to_room].room_flags,ROOM_DEATH))
||(IS_SET(world[to_room].room_flags,ROOM_NOMOB)));
char_to_room(ch, to_room);
send_to_char("A ravaging whirlpool sucks you under!\n\r", ch);
send_to_char("You finally surface, sputtering...\n\r", ch);
do_look(ch, NULL, 0, 0);
spec_occured = TRUE;
}
return(spec_occured);
}
----------
Any light you can shed would be appreciated.
-D
--
-- dkarnes@mystech.com
-- Serapis, Imp of Dark Pawns
-- Back up this weekend if all goes well :)
+-----------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://cspo.queensu.ca/~fletcher/Circle/list_faq.html |
+-----------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/18/00 PST