void get_up( CHAR_DATA * ch, int current_state ) { if ( current_state == POS_SLEEPING ) do_wake( ch, "" ); else if ( current_state == POS_RESTING ) do_stand( ch, "" ); return; }
void respond_summon( char_data* victim, char_data* ch, char*, int, int ) { int nation = ch->species->nation; int group = ch->species->group; if( victim->pcdata != NULL || victim->position < POS_RESTING || !is_set( &victim->species->act_flags, ACT_ASSIST_GROUP ) ) return; if( ( nation == NATION_NONE || nation != victim->species->nation ) && ( group == GROUP_NONE || group != victim->species->group ) ) return; set_bit( &victim->status, STAT_ALERT ); if( is_set( &victim->species->act_flags, ACT_SUMMONABLE ) ) { if( victim->position == POS_RESTING ) do_stand( victim, "" ); add_path( victim, ch ); } }
void hear_whistle( char_data* victim, char_data* ch, char*, int dir, int ) { if( victim->position == POS_EXTRACTED || !can_hear( victim ) ) return; send( victim, "You hear a whistle from somewhere %s.\r\n", dir_table[dir].where ); if( victim->pcdata != NULL || !is_set( &victim->status, STAT_PET ) || victim->leader != ch ) return; if( victim->position == POS_RESTING ) do_stand( victim, "" ); if( is_set( &victim->status, STAT_FAMILIAR ) ) send( ch, "You sense your familiar heard you.\r\n" ); add_path( victim, ch ); }
/* RT Enter portals */ void do_enter( CHAR_DATA *ch, char *argument) { ROOM_INDEX_DATA *location; if ( ch->fighting != NULL ) return; /* nifty portal stuff */ if (argument[0] != '\0') { ROOM_INDEX_DATA *old_room; OBJ_DATA *portal; CHAR_DATA *fch, *fch_next; old_room = ch->in_room; portal = get_obj_list( ch, argument, ch->in_room->contents ); if (portal == NULL) { send_to_char("You don't see that here.\n\r",ch); return; } if (portal->item_type != ITEM_PORTAL || (IS_SET(portal->value[1],EX_CLOSED) && !IS_TRUSTED(ch,KNIGHT))) { send_to_char("You can't seem to find a way in.\n\r",ch); return; } if (!IS_TRUSTED(ch,KNIGHT) && !IS_SET(portal->value[2],GATE_NOCURSE) && IS_AFFECTED(ch,AFF_CURSE) ) { send_to_char("Something prevents you from leaving...\n\r",ch); return; } if (IS_SET(portal->value[2],GATE_RANDOM) || portal->value[3] == -1) { location = get_random_room(ch); portal->value[3] = location->vnum; /* for record keeping :) */ } else if (IS_SET(portal->value[2],GATE_BUGGY) && (number_percent() < 5)) location = get_random_room(ch); else location = get_room_index(portal->value[3]); if (location == NULL || location == old_room || !can_see_room(ch,location) || (room_is_private(ch,location) && !IS_TRUSTED(ch,IMPLEMENTOR))) { act("$p doesn't seem to go anywhere.",ch,portal,NULL,TO_CHAR); return; } if (IS_NPC(ch) && IS_SET(ch->act,ACT_AGGRESSIVE) && IS_SET(location->room_flags,ROOM_LAW)) { send_to_char("Something prevents you from leaving...\n\r",ch); return; } act("$n steps into $p.",ch,portal,NULL,TO_ROOM); if (IS_SET(portal->value[2],GATE_NORMAL_EXIT)) act("You enter $p.",ch,portal,NULL,TO_CHAR); else act("You walk through $p and find yourself somewhere else...", ch,portal,NULL,TO_CHAR); char_from_room(ch); char_to_room(ch, location); if (IS_SET(portal->value[2],GATE_GOWITH)) /* take the gate along */ { obj_from_room(portal); obj_to_room(portal,location); } if (IS_SET(portal->value[2],GATE_NORMAL_EXIT)) act("$n has arrived.",ch,portal,NULL,TO_ROOM); else act("$n has arrived through $p.",ch,portal,NULL,TO_ROOM); do_look(ch,"auto"); /* charges */ if (portal->value[0] > 0) { portal->value[0]--; if (portal->value[0] == 0) portal->value[0] = -1; } /* protect against circular follows */ if (old_room == location) return; for ( fch = old_room->people; fch != NULL; fch = fch_next ) { fch_next = fch->next_in_room; if (portal == NULL || portal->value[0] == -1) /* no following through dead portals */ continue; if ( fch->master == ch && IS_AFFECTED(fch,AFF_CHARM) && fch->position < POS_STANDING) do_stand(fch,""); if ( fch->master == ch && fch->position == POS_STANDING) { if (IS_SET(ch->in_room->room_flags,ROOM_LAW) && (IS_NPC(fch) && IS_SET(fch->act,ACT_AGGRESSIVE))) { act("You can't bring $N into the city.", ch,NULL,fch,TO_CHAR); act("You aren't allowed in the city.", fch,NULL,NULL,TO_CHAR); continue; } act( "You follow $N.", fch, NULL, ch, TO_CHAR ); do_enter(fch,argument); } } if (portal != NULL && portal->value[0] == -1) { act("$p fades out of existence.",ch,portal,NULL,TO_CHAR); if (ch->in_room == old_room) act("$p fades out of existence.",ch,portal,NULL,TO_ROOM); else if (old_room->people != NULL) { act("$p fades out of existence.", old_room->people,portal,NULL,TO_CHAR); act("$p fades out of existence.", old_room->people,portal,NULL,TO_ROOM); } extract_obj(portal); } /* * If someone is following the char, these triggers get activated * for the followers before the char, but it's safer this way... */ if ( IS_NPC( ch ) && HAS_TRIGGER( ch, TRIG_ENTRY ) ) mp_percent_trigger( ch, NULL, NULL, NULL, TRIG_ENTRY ); if ( !IS_NPC( ch ) ) mp_greet_trigger( ch ); return; } send_to_char("Nope, can't do it.\n\r",ch); return; }
/** Wierzchowce i wszystkie moby z mountable. W dzisiejszych czasach u¿ywa siê ich jako przeno¶ne stoiska z floatem, dlatego chcia³bym poruszyæ pare spraw, które byæ mo¿e zaprocentuj± kiedy¶ zmianami w systemie wierzchowców. ¯eby nie przeci±¿aæ systemu, zmiany mo¿na by wprowadzaæ po kolei: I. Zmêczenie Konie powinny mieæ swoj± pule mv, które traci³y by przy przechodzeniu z lokacji do lokacji. Gracz niewprawiony w je¼dzie konnej ( i nie tylko konnej ) oczywi¶cie te¿ by siê mêczy³, ale do¶wiadczony je¼dzieæ traci³by mv bardzo wolno. Maj±c mistrza w Ridingu, stosunek by³by 10:1 - czyli 10 mv wierzchowca na 1 mv je¼dzca. Koñ który straci³by ca³e mv, musia³by odpocz±æ, tak samo jak cz³owiek ( chocia¿ si³y regenerowa³ by szybciej ). ¯eby nie bawiæ siê w dodatkowe pola, mv moba by³y by naliczane na podstawie jego kondycji, rasy i size'u. Komendy: mount <nazwa> rest, mount <nazwa> stand Zmiany: Riding, Mount. II. Opieka nad Wierzchowcem Oprócz oczywistych rzeczy, takich jak odpoczynek, koñ ( czy ichnia bestia ) potrzebuje jedzenia i picia. Z piciem jest ³atwo, starczy trafiæ na jak±¶ rzeczke przep³ywaj±c± przez trakt czy zaprowadziæ konia do koryta w stajni ( nie radze poiæ z buk³aków ). Jednak z jedzeniem s± ju¿ pewne komplikacje. Wyró¼niamy podzia³ na pare typów: 1. herbivorous - ro¶lino¿erne, pare sektorów naturalnych lub pasza. 2. carnivorous - mieso¿erne, trup animala lub surowe miêso. 3. omnivorous - wszystko¿erne, sektory naturalne, pasza, miêso lub trup zwierzecia. 4. unfeedable - Nie potrzebuje je¶æ i piæ, dotyczy istot pozasferowych, nieo¿ywionych czy przywo³anych. Oprócz tego w zale¿no¶ci od size moba, jedzenie czy picie bêdzie uzupe³niaæ pewien procent paska. Np. koñ o size normal jedz±c pasze uzupe³ni 50% paska g³odu, inny koñ o size large uzupe³ni ju¿ tylko 40%. Gdyby by³ jaki¶ koñ o size gigant, pasza uzupe³ni³a by mu tylko 10%. Dzia³a te¿ w drug± strone. Tak wiêc trzeba by by³o dbaæ o wieszchowca, by on by³ zdatny do ¿ycia. Oczywi¶cie nie musze dodawaæ, ¿e g³odny i spragniony wierzchowiec wolniej regenerowa³ by mv? Komendy: mount <nazwa> feed, mount <nazwa> feed <item>, mount <nazwa> water, mount <nazwa> water <item> Zmiany: Mount, Otype food ( dodaæ podzia³ na rodzaj po¿ywienia, np. miêso, pasza, zielenina, racja podró¼na ), naliczanie g³odu i pragnienia, size. */ void do_mount( CHAR_DATA *ch, char *argument ){ char horsename [ MAX_STRING_LENGTH ]; char order [ MAX_STRING_LENGTH ]; char item [ MAX_STRING_LENGTH ]; CHAR_DATA *horse = NULL; argument = one_argument( argument, horsename ); argument = one_argument( argument, order ); argument = one_argument( argument, item ); horse = get_char_room( ch, horsename ); if(!horse){ print_char(ch, "Nie ma tu nikogo takiego!\n\r"); return; } if ( !IS_NPC(horse) || !EXT_IS_SET(horse->act, ACT_MOUNTABLE ) ) { print_char(ch, "Czy %s wygl±da jak co¶, na czym mo¿na je¼dziæ?!\n\r", horse->short_descr ); return; } //jesli tylko jeden argument, to normalny mount if(!strcmp(order, "")){ //V. Stajnie // if(str_prefix(horsename, "list")) // do_mount_list(ch); // if(str_prefix(horsename, "offer")) // do_mount_offer(ch); // else do_mount_on(ch, horse); } else { //I. Zmêczenie if(!str_prefix(order, "stand")){ if(horse->mounting){ print_char(ch, "Przecie¿ %s ma je¼d¼ca!\n\r", horse->name2 ); return; } do_stand(horse, ""); horse->default_pos = POS_STANDING; } else if(!str_prefix(order, "rest")){ if(ch->mount){ print_char(ch, "Zsi±d¼ najpierw z %s!\n\r", horse->name2 ); return; } if(horse->mounting){ print_char(ch, "Przecie¿ %s ma je¼d¼ca!\n\r", horse->name2 ); return; } do_rest(horse, ""); horse->default_pos = POS_RESTING; } //II. Opieka nad Wierzchowcem else if(!str_prefix(order, "feed")){ do_feed_body(ch, horse->name, item); } else if(!str_prefix(order, "water")) do_water_body(ch, horse->name, item); //III. Prowadzenie wierzchowca // else if(str_prefix(order, "follow")) // do_rest(horse, ""); // else if(str_prefix(order, "nofollow")) // do_rest(horse, ""); // else if(str_prefix(order, "stay")) // do_rest(horse, ""); //IV. Przedmioty // else if(str_prefix(order, "check")) // do_rest(horse, ""); // else if(str_prefix(order, "put")) // do_rest(horse, ""); // else if(str_prefix(order, "get")) // do_rest(horse, ""); // else if(str_prefix(order, "equip")) // do_rest(horse, ""); // else if(str_prefix(order, "remove")) // do_rest(horse, ""); //V. Stajnie // else if(str_prefix(order, "rent")) // do_rest(horse, ""); // else if(str_prefix(order, "bring")) // do_rest(horse, ""); else print_char(ch, "Co?!\n\r" ); } }
void mob_group_follow( CHAR_DATA * ch, CHAR_DATA * target ) { char buf[MAX_STRING_LENGTH]; CHAR_DATA *vch; int num; if ( ( ch == NULL ) || ( target == NULL ) ) { snprintf( buf, MSL, "%s", "Null ch and/or target in mob_group_follow, exiting." ); monitor_chan( buf, MONITOR_MOB ); return; } snprintf( buf, MSL, "Ok guys, let's all follow %s.", target->get_name() ); do_say( ch, buf ); for ( vch = ch->in_room->first_person; vch != NULL; vch = vch->next_in_room ) { if ( ( ch != vch ) && ( AI_MOB( vch ) ) && ( is_same_group( ch, vch ) ) ) { if ( vch->position != POS_STANDING ) do_stand( vch, "" ); num = number_percent( ); // WAIT_STATE( vch, 275 ); if ( num > 85 ) do_say( vch, "Ok boss. Whatever you say." ); else if ( num > 70 ) do_say( vch, "Alright! More people, more power!" ); else if ( num > 55 ) do_say( vch, "Whoo Hooo!" ); else if ( num > 35 ) do_say( vch, "Sure thing." ); else if ( num > 29 ) { if ( num > 32 ) snprintf( buf, MSL, "Man I don't want to join %s's group!", target->get_name() ); else snprintf( buf, MSL, "I hate big groups." ); do_say( vch, buf ); do_follow( vch, const_cast<char *>(vch->name.c_str()) ); do_say( vch, "I'm outta here." ); do_recall( vch, "" ); continue; } if ( !can_see( vch, target ) ) { vch->master = target; vch->leader = NULL; } else { do_follow( vch, const_cast<char *>(target->name.c_str()) ); } do_group( target, "all" ); } } return; }
/* i have condensed this function to just three states: MOB_FIGHTING, * MOB_RESTING/ MOB_SLEEPING, and MOB_STANDING. each of these three states * will call it's appropriate function. */ void int_group_handler( NPC_GROUP_DATA * ngroup ) { CHAR_DATA *follower = NULL; CHAR_DATA *leader = ngroup->leader; DL_LIST *follower_ptr; // short followers_want = GRP_STATE_NO_CHANGE; short leader_wants = GRP_STATE_NO_CHANGE; short group_count = 1; // start with leader char monbuf[MSL]; if ( leader == NULL ) { monitor_chan( "No Leader in NPC_GROUP", MONITOR_MOB ); return; } // check for followers needs for ( follower_ptr = ngroup->first_follower; follower_ptr; follower_ptr = follower_ptr->next ) { // check for needing healing, levelling follower = (CHAR_DATA *)follower_ptr->this_one; group_count++; continue; } // check for leader's needs if ( leader->hit < leader->max_hit * 25 / 100 ) { leader_wants = GRP_STATE_CRIT_HEAL; } else if ( leader->mana < leader->max_mana * 25 / 100 ) { leader_wants = GRP_STATE_CRIT_MANA; } else if ( leader->hit < leader->max_hit * 60 / 100 ) { leader_wants = GRP_STATE_NORM_HEAL; } else if ( leader->mana < leader->max_mana * 50 / 100 ) { leader_wants = GRP_STATE_NORM_MANA; } else if ( able_to_level( leader ) ) { leader_wants = GRP_STATE_LEVELING; } snprintf( monbuf, MSL, "NPC Group Handler, Leader is %s, state is %s", ngroup->leader->name.c_str(), group_state_table[ngroup->state] ); monitor_chan( monbuf, MONITOR_MOB ); switch ( ngroup->state ) { case GRP_STATE_CRIT_HEAL: case GRP_STATE_CRIT_MANA: case GRP_STATE_NORM_HEAL: case GRP_STATE_NORM_MANA: { bool everyone_ready = TRUE; bool room_ready = FALSE; // ready_heal_room( leader ); if ( ( leader->mana < leader->max_mana * 85 / 100 ) || ( leader->hit < leader->max_hit * 85 / 100 ) ) { everyone_ready = FALSE; if ( ( ( room_ready = ready_heal_room( leader ) ) == TRUE ) || ( leader->mana < leader->max_mana * 20 / 100 ) ) { do_sleep( leader, "" ); } } else { do_stand( leader, "" ); } for ( follower_ptr = ngroup->first_follower; follower_ptr; follower_ptr = follower_ptr->next ) { follower = (CHAR_DATA *)follower_ptr->this_one; if ( ( follower->mana < follower->max_mana * 75 / 100 ) || ( follower->hit < follower->max_hit * 75 / 100 ) ) { everyone_ready = FALSE; do_sleep( follower, "" ); } else { do_stand( follower, "" ); } } if ( everyone_ready == TRUE ) { ngroup->state = GRP_STATE_IDLE; } break; } case GRP_STATE_FIGHT: { // violence_update will handle if ( ( leader_wants < GRP_STATE_HUNTING ) || ( leader->fighting == NULL ) ) { bool someone_still_fighting = FALSE; ngroup->state = GRP_STATE_FLEE; for ( follower_ptr = ngroup->first_follower; follower_ptr; follower_ptr = follower_ptr->next ) { follower = (CHAR_DATA *)follower_ptr->this_one; if ( follower->fighting != NULL ) { do_flee( follower, "" ); someone_still_fighting = TRUE; } } if ( someone_still_fighting == FALSE ) { ngroup->state = GRP_STATE_REFORM; } if ( leader->fighting != NULL ) { do_flee( leader, "" ); } } break; } case GRP_STATE_FLEE: { bool someone_still_fighting = FALSE; for ( follower_ptr = ngroup->first_follower; follower_ptr; follower_ptr = follower_ptr->next ) { follower = (CHAR_DATA *)follower_ptr->this_one; if ( follower->fighting != NULL ) { do_flee( follower, "" ); someone_still_fighting = TRUE; } } if ( leader->fighting != NULL ) { do_flee( leader, "" ); someone_still_fighting = TRUE; } if ( someone_still_fighting == FALSE ) { ngroup->state = GRP_STATE_REFORM; } break; } case GRP_STATE_IDLE: { // check_re_equip( leader ); // check_rewield( leader ); if ( leader_wants < GRP_STATE_NO_CHANGE ) { ngroup->state = leader_wants; break; } else if ( number_percent( ) < 40 ) { select_target( ngroup->leader ); ngroup->state = GRP_STATE_HUNTING; break; } } case GRP_STATE_HUNTING: { // poll followers later short move_dir; if ( leader->fighting != NULL ) { ngroup->state = GRP_STATE_FIGHT; break; } if ( leader->hunting == NULL ) { // snprintf( monbuf, MSL, "Leader %s not hunting anything in GRP_STATE_HUNTING", // leader->name ); // monitor_chan( monbuf, MONITOR_MOB ); select_target( ngroup->leader ); break; } if ( leader->in_room == leader->hunting->in_room ) { ngroup->state = GRP_STATE_FIGHT; one_hit( leader, leader->hunting, TYPE_UNDEFINED ); break; } move_dir = h_find_dir( leader->in_room, leader->hunting->in_room, HUNT_WORLD | HUNT_OPENDOOR | HUNT_UNLOCKDOOR | HUNT_PICKDOOR ); if ( move_dir < 0 ) // can't get there from here { ngroup->state = GRP_STATE_LOST; break; } hunt_move( leader, move_dir ); break; } case GRP_STATE_LEVELING: { char_from_room( leader ); char_to_room( leader, get_room_index( 3758 ) ); if ( able_to_level( leader ) ) { gain_level( leader ); } for ( follower_ptr = ngroup->first_follower; follower_ptr; follower_ptr = follower_ptr->next ) { follower = (CHAR_DATA *)follower_ptr->this_one; if ( able_to_level( follower ) ) { gain_level( follower ); } } ngroup->state = GRP_STATE_IDLE; break; } case GRP_STATE_REFORM: { bool all_are_here = TRUE; for ( follower_ptr = ngroup->first_follower; follower_ptr; follower_ptr = follower_ptr->next ) { follower = (CHAR_DATA *)follower_ptr->this_one; if ( follower->in_room != leader->in_room ) { short move_dir; all_are_here = FALSE; move_dir = h_find_dir( follower->in_room, leader->in_room, HUNT_WORLD | HUNT_OPENDOOR | HUNT_UNLOCKDOOR | HUNT_PICKDOOR ); if ( move_dir < 0 ) // can't get there from here { ngroup->state = GRP_STATE_LOST; break; } hunt_move( follower, move_dir ); } } if ( all_are_here == TRUE ) { ngroup->state = GRP_STATE_IDLE; } break; } } }