#include <ctype.h> #include <sys/types.h> #include <stdio.h> #include <syslog.h> #include "define.h" #include "struct.h" /* * TRACK_DATA CLASS */ typedef class Track_Data track_data; class Track_Data { public: track_data* next; int race; int to_dir; long decay_time; Track_Data( ); ~Track_Data( ); }; Track_Data :: Track_Data( ) { record_new( sizeof( track_data ), MEM_TRACK ); return; } Track_Data :: ~Track_Data( ) { record_delete( sizeof( track_data ), MEM_TRACK ); return; } /* * DO_TRACK ROUTINE */ void do_track( char_data* ch, char* ) { if( is_mob( ch ) ) return; if( !ch->check_skill( SKILL_TRACK ) > 0 ) { send( ch, "You don't know how to track\n\r" ); return; } switch_bit( ch->pcdata->pfile->flags, PLR_TRACK ); if( is_set( ch->pcdata->pfile->flags, PLR_TRACK ) ) { send( ch, "You are now tracking.\n\r" ); send( ch, "[ Costs more movement points per move. ]\n\r" ); } else send( ch, "You stop tracking.\n\r" ); return; } /* * MAKE TRACK ROUTINE */ void make_tracks( char_data* ch, room_data* room, int door ) { track_data* track; track_data* next; track_data* prev; if( ch->mount != NULL ) ch = ch->mount; if( ch->can_fly( ) || water_logged( room ) ) return; track = new track_data; track->decay_time = current_time+number_range( 300,1000 ); track->to_dir = door; track->race = ch->shdata->race; track->next = room->track; room->track = track; for( prev = NULL; track != NULL; track = next ) { next = track->next; if( ( track->decay_time -= 150 ) < current_time ) { if( prev == NULL ) room->track = next; else prev->next = next; delete track; } else prev = track; } return; } /* * SHOW TRACK ROUTINE */ void show_tracks( char_data* ch ) { room_data* room = ch->in_room; track_data* track; int time; bool found = FALSE; if( ch->species != NULL || !is_set( ch->pcdata->pfile->flags, PLR_TRACK ) || !ch->in_room->Seen( ch ) ) return; time = current_time+750-75*ch->shdata->skill[ SKILL_TRACK ]; for( track = room->track; track != NULL; track = track->next ) { if( track->decay_time > time ) { send( ch, "%sYou see %s tracks heading %s.\n\r", found ? "" : "\n\r", race_table[ track->race ].name, dir_table[ track->to_dir ].name ); found = TRUE; } } return; }