Hey, I just had a great idea. The SPECIAL() macro (and corresponding calls) for special procedure now has 4 arguments instead of 3. The new (2nd) argument is void *me, which is a pointer to the mob/room/obj whose specproc has been activated (kind of like the "this" pointer in C++). The purpose is simply to make coding easier for specprocs such as the receptionist and shopkeepers. The current method is to messily search through the room for a MOB with the appropriate spec-proc; now, you just use the 'me' pointer instead. As before, the value of 'ch' is a pointer to the MOB for pulse-activated spec-procs, and the char responsible for specproc activation for interpreter-activated specprocs. The 'me' pointer is the MOB for pulse-activated (just like ch); the win comes with interpreter-activated specprocs when 'me' is a pointer to the mob. Okay, maybe this isn't clear, so I'll demonstrate with some "before" and "after" code: BEFORE: SPECIAL(gen_receptionist) { struct char_data *temp, *recep = NULL; for (temp = world[ch->in_room].people; temp&!recep; temp=temp->next_in_room) if (IS_MOB(temp) && mob_index[temp->nr].funct == gen_receptionist) recep = temp; if (!recep) log("Ingen recep"); act("$n says hi to $N.", TRUE, recep, 0, ch, TO_ROOM); } AFTER: SPECIAL(gen_receptionist) { struct char_data *recep = (struct char_data *)me; act("$n says hi to $N.", TRUE, recep, 0, ch, TO_ROOM); } Comments? =je
This archive was generated by hypermail 2b30 : 12/07/00 PST