For what it's worth, here is my code for a shadow SPECIAL. Upon sunrise, if the mob isn't in a DARK room, it dies. Setup requires the usual: SPECIAL(shadow); and ASSIGNMOB( xxxx, shadow ); in spec_assign.c. spec_procs.c requires a reference to the external fn die(): void die( struct char_data * ch ); I believe that I have tested this for all situations except for what would happen if the sun rose during a fight. Let me know if you dig up any bugs I missed. Thanks, Jared --------------------------------------------------------------------- SPECIAL( shadow ) { /* Having the shadow's special proc make a call to destroy itself is tricky. The values passed into the ch and me parameters of the fn, differ depending on what caused the call. If the SPECIAL is called as a result of a player's action, the value of ch references the player, and me references the mob. However, if the call is made from mobile_activity() in mobact.c or another similar fn, both ch and me reference the mob. Care must be taken not to accidently kill the player or other mobs in the room. Also mobile_activity() causes the mud to crash when the mob it called a special for is extracted. For this reason, if the call originated from mobile_activity(), we mortally wound the mob and leave it for dead. It is assumed that if ch references a mob, then we need to avoid calling die(). Note this might break down if this mob is fighting another mob. (see below) This has not been tested under fighting conditions; I don't know what will happen if you're fighting a shadow when the sun comes up. When fight calls the mob special proc it passes ch and me the reference to the mob, similar to mobile_activity(). ( perform_violence in fight.c ) -jrb 8/28/97 */ struct char_data *npc; int player_cmd; /* start off by assuming this call is a result of mobile_activity() */ player_cmd = 0; npc = ch; /* check our assumption and modify premise if necessary */ if ( !IS_NPC(npc) ) { npc = me; player_cmd = 1; } /* Is it night or is the mob in a dark room? */ if ( (time_info.hours < 6) || (time_info.hours > 20 ) || IS_DARK( npc->in_room ) ) { return( FALSE ); } /* if exposed to light of day...kill mob */ if ( !player_cmd ) { GET_HIT( npc ) = -10; GET_POS( npc ) = POS_MORTALLYW; } else { act( "$n hisses in agony and withers away as the sun hits $e!", FALSE, npc, 0, 0, TO_ROOM ); die( npc ); } return( FALSE ); } +------------------------------------------------------------+ | 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/08/00 PST