/*\ * Tired.txt Written by Steve Bretzke (ammoski@aol.com) and Jef Waite * (secondary-weapon check) for Adventures Unlimited. * The idea was first seen by the author on Aeon mud (no longer exists). * This code makes PC's fall asleep on their feet if they go too long * without normal sleep. Players that are too tired will drop their weapon, * and secondary weapon (if your code supports this) or held item. Recovery * rate for sleep will have to be set by you. I have it based on current con, * the same for the rate at which the player gets tired. Anyhow, if you use, * please drop me a mail and let me know. If you make a help file for this * a mention in the code would be nice but not necessary. Read it THOROUGHLY * before you add it. If you don't understand it, don't add it. Updated * June 2001 for ROM 2.4b6. Remove references to secondary if your code does * not support secondary weapons. \*/ /*** In merc.h ***/ Add this with the rest of the conditions: #define COND_TIRED 4 /*** In update.c add these lines ***/ /*** In gain_condition after case COND_DRUNK ***/ case COND_TIRED: if ( condition != 0 ) send_to_char( "You are getting {mtired{x.\n\r", ch); break; /*** In char_update ***/ At the top of the function add: OBJ_DATA *wield; OBJ_DATA *secondary; OBJ_DATA *hold; Right after the if ( ++ch->timer >= 12 ), send-character-to-the-void stuff add: if ( !IS_NPC(ch) && ch->position > POS_SLEEPING && ch->pcdata->condition[COND_TIRED] == 0 && ch->timer < 12 && ch->desc ) /*so they don't lose stuff in the void*/ { wield = get_eq_char( ch, WEAR_WIELD ); secondary = get_eq_char( ch, WEAR_SECONDARY ); hold = get_eq_char( ch, WEAR_HOLD ); act( "{w$n is sleeping on $s feet!{x",ch,NULL,NULL,TO_ROOM); if ( wield ) { act( "{w$p {wclatters to the ground.",ch,wield,NULL,TO_ROOM ); send_to_char( "{wSomething clatters to the ground waking you.{x\n\r", ch ); obj_from_char( wield ); obj_to_room( wield, ch->in_room ); } if( secondary && !wield ) { act( "{w$p {wclatters to the ground.",ch,secondary,NULL,TO_ROOM ); send_to_char( "{wSomething clatters to the ground waking you.{x\n\r", ch ); obj_from_char( secondary ); obj_to_room( secondary, ch->in_room ); } if( hold && !wield && !secondary ) { act( "{w$p {wclatters to the ground.",ch,hold,NULL,TO_ROOM ); send_to_char( "{wSomething clatters to the ground waking you.{x\n\r", ch ); obj_from_char( hold ); obj_to_room( hold, ch->in_room ); } } After gain_condition( ch, COND_DRUNK, -1 ); gain_condition( ch, COND_FULL, ch->size > SIZE_MEDIUM ? -4 : -2 ); gain_condition( ch, COND_THIRST, -1 ); gain_condition( ch, COND_HUNGER, ch->size > SIZE_MEDIUM ? -2 : -1); Add: if ( !IS_NPC(ch) && !IS_IMMORTAL(ch) ) { if ( ch->position == POS_RESTING ) gain_condition( ch, COND_TIRED, 0 ); else if (ch->position == POS_SLEEPING ) gain_condition( ch, COND_TIRED, get_curr_stat(ch,STAT_CON) / 2 ); else gain_condition( ch, COND_TIRED, get_curr_stat(ch,STAT_CON) > 19 ? -1 : -2 ); } /*** That's all for update.c ***/ /*** act_info.c ***/ At the top of the do_score function add: int percent; <--only if you don't already have this there /*** In act_info.c under do_score add these lines under the thirsty message ***/ if ( ch->pcdata->condition[COND_TIRED] > 0 ) percent = ( 100 * ch->pcdata->condition[COND_TIRED] / 48 ); else percent = -1; if ( percent >= 90 ) send_to_char( "You are well rested.\n\r", ch ); else if ( percent >= 75 ) send_to_char( "You feel rested.\n\r", ch ); else if ( percent >= 50 ) send_to_char( "You are a bit tired.\n\r", ch ); else if ( percent >= 25 ) send_to_char( "You feel fatigued.\n\r", ch ); else if ( percent >= 7 ) send_to_char( "You are tired.\n\r", ch ); else send_to_char( "You are asleep on your feet!\n\r", ch ); /*** act_wiz.c ***/ Change this in do_mstat: if ( !IS_NPC(victim) ) { sprintf( buf, "Thirst: %d Hunger: %d Full: %d Drunk: %d Tired: %d\n\r", <--added tired victim->pcdata->condition[COND_THIRST], victim->pcdata->condition[COND_HUNGER], victim->pcdata->condition[COND_FULL], victim->pcdata->condition[COND_DRUNK], + victim->pcdata->condition[COND_TIRED] ); send_to_char( buf, ch ); } In do_restore: Add tired updates for the three restore types. In do_mset add this after the cond_hunger stuff: if ( !str_prefix( arg2, "tired" ) ) { if ( IS_NPC(victim) ) { send_to_char( "Not on NPC's.\n\r", ch ); return; } if ( value < -1 || value > 48 ) { send_to_char( "Tired range is -1 to 48.\n\r", ch ); return; } victim->pcdata->condition[COND_TIRED] = value; return; } /*** In save.c ***/ Under load_char_obj add this: ch->pcdata->condition[COND_THIRST] = 48; ch->pcdata->condition[COND_FULL] = 48; ch->pcdata->condition[COND_HUNGER] = 48; + ch->pcdata->condition[COND_TIRED] = 48; Also, where it reads and writes under Cnd, add appropriate lines. i.e. ch->pcdata->condition[4]; That should do it for the snippet. I also made the refresh spell add a couple points to the tired condition too. Hope you enjoy. /*** END ***/