On 4/28/98 3:41 AM, Mark Gerritsen (m.p.h.gerritsen@STUDENT.UTWENTE.NL) stated: >If that is_in wasn't there to reset ch->room to the actual room the char is >in after every direction, you'd scan around corners, or even in circles. >For instance, if your skill would grant you a distance of 2, your >"scan-path" would be this: > > [ ]>[ ]>[ ] > ^ v Followed by a double overview of the > [ ] [ ] 2 rooms above you, since you scan up > ^ v first, then down from there. > [x]<[ ]<[ ] > >This is provided you can go in those directions and have the 6 stock exits, >of course. That's what the is_in is there for. Why move the character to another room? Also along the same line, in look_at_room(ch), why not call yet another function, look_at_rnum(ch, room) ? It makes for any instance where you want the character to look at a room, but don't want to move them there (this was necessary for the vehicles patch, otherwise it would kill the player when they looked out of the vehicle and it was a DT, or drove into a DT, since it shows the description - vehicles are supposed to protect chars from DTs), and also saves just a bit of extra work by not needing to save/restore or even mess with ch->in_room. Heres some extra code from my MUD (note it isn't plug-and-play, you'll have to adapt it - a lot) used for our scanning. (You'll note some usage of a template here, LList<>, and a lot of class usage. I'll be sending LList<> along in another post shortly after this one.) *** Begin Snippet *** void look_in_direction(CharData * ch, int dir) { int distance; RNum room, nextroom, orig_room = IN_ROOM(ch); void look_in_direction(CharData * ch, SInt32 dir, SInt32 maxDist) { int distance; RNum room, nextroom, orig_room = IN_ROOM(ch); if (EXIT(ch, dir)) { send_to_char(EXIT(ch, dir)->GetDesc("You see nothing special.\r\n"), ch); if (EXIT(ch, dir)->GetKeyword()) { if (EXIT_FLAGGED(EXIT(ch, dir), EX_CLOSED)) act("The $T is closed.\r\n", FALSE, ch, 0, fname(EXIT(ch, dir)->GetKeyword()), TO_CHAR); else if (EXIT_FLAGGED(EXIT(ch, dir), EX_ISDOOR)) act("The $T is open.\r\n", FALSE, ch, 0, fname(EXIT(ch, dir)->GetKeyword()), TO_CHAR); } nextroom = CAN_GO2(orig_room, dir) ? EXIT2(orig_room, dir)->to_room : NOWHERE; for (distance = 0; ((nextroom != NOWHERE) && (distance < maxDist)); distance++) { list_scanned_chars(world[nextroom].people, ch, distance, dir); room = nextroom; nextroom = CAN_GO2(room, dir) ? EXIT2(room, dir)->to_room : NOWHERE; } } else send_to_char("Nothing special there...\r\n", ch); } void list_scanned_chars(LList<CharData *> &list, CharData * ch, int distance, int door) { const char * how_far[] = { "close by", "nearby", "to the", "far off", "far in the distance" }; char relation; CharData * i; UInt32 count = 0, one_sent = 0; LListIterator<CharData *> iter(list); while((i = iter.Peek())) { if (ch->CanSee(i)) count++; } if (!count) return; iter.Reset(); while((i = iter.Peek())) { if (!ch->CanSee(i)) continue; relation = relation_colors[ch->GetRelation(i)]; if (!one_sent) ch->send("You see `%c%s", relation, i->GetName()); else ch->send("`%c%s", relation, i->GetName()); if (--count > 1) send_to_char("`n, ", ch); else if (count == 1) send_to_char(" `nand ", ch); else ch->send(" `n%s %s.\r\n", how_far[distance], dirs[door]); one_sent++; } } *** End Snippet *** +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST