bool check_dismiss_part(CHAR_DATA *victim, int RACE ) { if ( ! IS_SET( race_table[ victim->race ].type, RACE ) ) return TRUE; if ( ! EXT_IS_SET( victim->act, ACT_NO_EXP ) ) return TRUE; if ( ! IS_NPC( victim ) ) return TRUE; return FALSE; // czaruje }
/** * funkcja pomocnicza, tylko do autosplita */ void money_split_auto ( CHAR_DATA *ch, OBJ_DATA *obj ) { if ( !IS_NPC( ch ) && EXT_IS_SET( ch->act, PLR_AUTOSPLIT ) ) { money_split( ch, UMAX( 0, obj->value[ 0 ] ), NOMINATION_COPPER, FALSE, FALSE, TRUE ); money_split( ch, UMAX( 0, obj->value[ 1 ] ), NOMINATION_SILVER, FALSE, FALSE, TRUE ); money_split( ch, UMAX( 0, obj->value[ 2 ] ), NOMINATION_GOLD, FALSE, FALSE, TRUE ); money_split( ch, UMAX( 0, obj->value[ 3 ] ), NOMINATION_MITHRIL, FALSE, FALSE, TRUE ); } }
bool spec_executioner( CHAR_DATA *ch ) { char buf[ MAX_STRING_LENGTH ]; CHAR_DATA *victim; CHAR_DATA *v_next; char *crime; if ( !IS_AWAKE( ch ) || ch->fighting != NULL ) return FALSE; crime = ""; for ( victim = ch->in_room->people; victim != NULL; victim = v_next ) { v_next = victim->next_in_room; if ( !IS_NPC( victim ) && EXT_IS_SET( victim->act, PLR_KILLER ) && can_see( ch, victim ) ) { crime = "KILLER"; break; } if ( !IS_NPC( victim ) && EXT_IS_SET( victim->act, PLR_THIEF ) && can_see( ch, victim ) ) { crime = "THIEF"; break; } } if ( victim == NULL ) return FALSE; sprintf( buf, "%s is a %s! BRONIÆ NIEWINNYCH! KRRRRWII!!!", victim->name, crime ); REMOVE_BIT( ch->comm, COMM_NOSHOUT ); do_function( ch, &do_yell, buf ); multi_hit( ch, victim, TYPE_UNDEFINED ); return TRUE; }
bool room_trap_handler( CHAR_DATA *ch ) { TRAP_DATA * trap; int chance = 50; char buf[ MAX_INPUT_LENGTH ]; if ( IS_NPC( ch ) ) return FALSE; if ( !ch || !ch->in_room ) return FALSE; if ( ( trap = get_trap_index( ch->in_room->trap ) ) == NULL ) return FALSE; if ( !trap->active || !EXT_IS_SET( ch->in_room->room_flags, ROOM_TRAP ) ) return FALSE; chance += 5 * trap->level; switch ( ch->class ) { case CLASS_THIEF: chance -= 2*ch->level; chance -= UMAX( 0, get_curr_stat_deprecated( ch, STAT_DEX ) - 18 ) *5; break; default: chance -= ch->level;break; } chance = URANGE( 10, chance, 95 ); if ( number_percent() > chance ) return FALSE; if ( !supermob ) init_supermob(); char_from_room ( supermob ); char_to_room( supermob, ch->in_room ); EXT_REMOVE_BIT( ch->in_room->room_flags, ROOM_TRAP ); sprintf( buf, "trap%d", trap->vnum ); create_rprog_env( buf, trap->triggered, ch->in_room, ch, NULL, NULL, NULL, NULL ); program_flow(); release_supermob(); return TRUE; }
bool check_dismiss(CHAR_DATA *ch, CHAR_DATA *victim, int type, int spell) { CHAR_DATA *victim_next; int found = 0; //true nie czaruje, false czaruje for ( victim = ch->in_room->people; victim; victim = victim_next ) { victim_next = victim->next_in_room; if ( EXT_IS_SET( victim->act, ACT_NO_EXP ) ) ++found; } if ( found == 0 ) return TRUE; return FALSE; }
/* * Zwraca oddzielone spacjami nazwy zapalonych na fladze bit�w */ char * ext_flag_string( const struct ext_flag_type *ext_flag_table, long * ext_bits ) { static char buf[ 2 ][ 512 ]; static int cnt = 0; int flag; if ( ++cnt > 1 ) cnt = 0; buf[ cnt ][ 0 ] = '\0'; for ( flag = 0; ext_flag_table[ flag ].name != NULL; flag++ ) { if ( EXT_IS_SET( ext_bits, (*ext_flag_table[ flag ].bitvect) ) ) { strcat( buf[ cnt ], " " ); strcat( buf[ cnt ], ext_flag_table[ flag ].name ); } } return ( buf[ cnt ][ 0 ] != '\0' ) ? buf[ cnt ] + 1 : "none"; }
void do_pipe ( CHAR_DATA *ch, char *argument ) { OBJ_DATA * pObj; OBJ_DATA * qObj; char *pipe_name; char pipe_name_2[MAX_INPUT_LENGTH]; int amount, range, weed_amount, weed_type, dex, wis, con; AFFECT_DATA *old_smoke, *old_poison; AFFECT_DATA new_smoke, poison; int dur = 1, old_dur = 0, old_level = 0, level = 1; char buf[ MAX_INPUT_LENGTH ]; char arg1[ MAX_INPUT_LENGTH ]; char arg2[ MAX_INPUT_LENGTH ]; char arg3[ MAX_INPUT_LENGTH ]; char arg4[ MAX_INPUT_LENGTH ]; // mobom dziêkujemy bez komunikatu if ( IS_NPC( ch ) ) { return ; } // w czasie walki dziêkujemy z komunikatem if ( ch->position == POS_FIGHTING || ch->fighting != NULL ) { send_to_char( "Lepiej skup siê na walce.\n\r", ch ); return; } argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); argument = one_argument( argument, arg4 ); pObj = get_obj_carry( ch, arg2, ch ); if ( arg1[ 0 ] == '\0' ) { send_to_char( "Co takiego chcesz zrobiæ z fajk±?\n\r", ch ); send_to_char( "{R[PORADA]:{y 'Je¿eli nie wiesz, co mo¿esz, wpisz {Rhelp pipe{x / {Cpomoc fajka{x.{Y'{x\n\r", ch ); return; } if ( !str_prefix( arg1, "smoke" ) || !str_prefix( arg1, "pal" )) { if ( arg2[ 0 ] == '\0' ) { send_to_char( "Paliæ co?\n\r", ch ); return ; } // je¿eli obiekt nieistnieje w inventory, to mo¿e kto¶ co¶ takiego trzyma if ( pObj == NULL ) pObj = get_eq_char( ch, WEAR_HOLD ); if ( pObj == NULL ) { send_to_char( "Potrzebujesz fajki ¿eby paliæ ziele fajkowe.\n\r", ch ); return ; } /*if ( ( pObj = get_obj_carry( ch, arg2, ch ) ) == NULL ) { send_to_char( "Potrzebujesz fajki ¿eby paliæ ziele fajkowe.\n\r", ch ); return ; }*/ if ( pObj->item_type != ITEM_PIPE ) { send_to_char( "Potrzebujesz fajki ¿eby paliæ ziele fajkowe.\n\r", ch ); return ; } /* Gdy fajka jest pusta... */ if ( pObj->value[ 1 ] <= 0 ) { act( "W $j nie ma niczego, co móg³by¶ paliæ! Jest pusta.", ch, pObj, NULL, TO_CHAR ); act( "$n spogl±da z dziwnym smutkiem na $h.", ch, pObj, NULL, TO_ROOM ); return ; } /* Gdy fajka jest zgaszona*/ if ( pObj->value[ 0 ] == 0 ) { act( "Przecie¿ $p jest zgaszona!", ch, pObj, NULL, TO_CHAR ); return ; } /* Flaga informujaca o tym, ze gracz sobie pociagnal dymka... */ if ( !EXT_IS_SET( ch->act, PLR_SMOKED ) ) EXT_SET_BIT( ch->act, PLR_SMOKED ); if ( is_affected( ch, gsn_on_smoke ) ) { old_smoke = affect_find( ch->affected, gsn_on_smoke ); old_dur = old_smoke->duration; old_level = old_smoke->level; affect_strip( ch, gsn_on_smoke ); } level = weed_table[ pObj->value[2] ].weed_affect[0]; dur += old_dur; level += old_level; new_smoke.where = TO_AFFECTS; new_smoke.type = gsn_on_smoke; new_smoke.level = level; new_smoke.duration = UMIN( dur, number_range( 5, 7 ) ); new_smoke.rt_duration = 0; new_smoke.location = APPLY_NONE; new_smoke.modifier = 0; new_smoke.bitvector = &AFF_NONE; if ( level > number_range( 5, 7 ) && weed_table[ pObj->value[2] ].weed_affect[0] && number_percent() < weed_table[ pObj->value[2] ].weed_affect[1] ) { send_to_char( "\n\rZaczynasz czuæ siê jako¶ dziwnie. Przed oczyma zaczynaj± lataæ ci kolorowe plamki.\n\r", ch ); act( "\n\r$n zaczyna wygl±dajaæ jako¶ dziwnie blado.", ch, pObj, NULL, TO_ROOM ); if ( dice( 1, 2 ) == 1 ) new_smoke.bitvector = &AFF_HALLUCINATIONS_NEGATIVE; else new_smoke.bitvector = &AFF_HALLUCINATIONS_POSITIVE; } new_smoke.visible = FALSE; affect_to_char( ch, &new_smoke, NULL, FALSE ); if ( number_percent() < weed_table[ pObj->value[2] ].weed_affect[2] ) { if( is_affected(ch,gsn_poison )) { old_poison = affect_find( ch->affected, gsn_poison ); old_poison->duration += stat_throw(ch,STAT_CON) ? number_range(2,4) : number_range(4,8); if( old_poison->level < UMIN( weed_table[ pObj->value[2] ].weed_affect[0], 3) ) old_poison->level = UMIN( weed_table[ pObj->value[2] ].weed_affect[0], 3); act( "$n jeszcze bardziej zielenieje na twarzy.", ch, pObj, NULL, TO_ROOM ); send_to_char( "Czujesz siê jeszcze gorzej.\n\r", ch ); } else { poison.where = TO_AFFECTS; poison.type = gsn_poison; poison.level = UMIN( weed_table[ pObj->value[2] ].weed_affect[0], 3); poison.duration = stat_throw(ch,STAT_CON) ? number_range(2,4) : number_range(4,8); poison.rt_duration = 0; poison.location = APPLY_NONE; poison.modifier = 0; poison.bitvector = &AFF_NONE; poison.visible = FALSE; affect_to_char( ch, &poison, NULL, FALSE ); send_to_char( "Momentalnie zaczynasz czuæ siê jako¶ niedobrze. Bardzo niedobrze.\n\r", ch ); act( "$n widocznie zielenieje na twarzy.", ch, pObj, NULL, TO_ROOM ); } } /* Troche losowosci */ range = number_range( 1, 9 ); switch ( range ) { case 1: act( "$n zaci±ga siê g³êboko $j.", ch, pObj, NULL, TO_ROOM ); act( "Zaci±gasz siê g³êboko $j.", ch, pObj, NULL, TO_CHAR ); break; case 2: act( "$n pyka sobie $h przez chwilê.", ch, pObj, NULL, TO_ROOM ); act( "Pykasz sobie $h przez chwilê.", ch, pObj, NULL, TO_CHAR ); break; case 3: act( "$n wci±ga gwa³townie dym z $f.", ch, pObj, NULL, TO_ROOM ); act( "Wci±gasz gwa³townie dym z $f.", ch, pObj, NULL, TO_CHAR ); break; case 4: act( "$n zaci±ga siê delikatnie $j.", ch, pObj, NULL, TO_ROOM ); act( "Zaci±gasz siê delikatnie $j.", ch, pObj, NULL, TO_CHAR ); break; case 5: act( "Widzisz jak $n zaci±ga siê lekko $j.", ch, pObj, NULL, TO_ROOM ); act( "Zaci±gasz siê lekko $j.", ch, pObj, NULL, TO_CHAR ); break; case 6: act( "Dostrzegasz, jak $n z wpraw± zaci±ga siê dymkiem z $f.", ch, pObj, NULL, TO_ROOM ); act( "Z wielk± wpraw± zaci±gasz siê dymkiem z $f.", ch, pObj, NULL, TO_CHAR ); break; case 7: act( "$n jakby od niechcenia pali przez chwilê swoj± $h.", ch, pObj, NULL, TO_ROOM ); act( "Przez chwilkê machinalnie palisz sobie swoj± $h.", ch, pObj, NULL, TO_CHAR ); break; case 8: act( "$n z u¶miechem kurzy sobie $h.", ch, pObj, NULL, TO_ROOM ); act( "Kurzysz sobiê $h, u¶miechaj±c siê przy tym b³ogo.", ch, pObj, NULL, TO_CHAR ); break; default: act( "$n pali sobie przez chwilkê $h.", ch, pObj, NULL, TO_ROOM ); act( "Palisz sobie przez chwilkê $h.", ch, pObj, NULL, TO_CHAR ); break; } amount = number_range( 1, 3 ); // moze sie palic szybciej, lub wolniej (o 1, 2 lub o 3) if ( pObj->value[ 0 ] == 1 ) // sprawdzamy czy fajeczka jest zapalona { pObj->value[ 1 ] -= amount; // wypalamy zawartosc fajeczki //pObj->short_descr = capitalize(pObj->short_descr ); amount = number_range( 1, 7 ); switch ( amount ) { case 1: act( "Nad $j trzyman± przez $z unosi siê w±ska stru¿ka dymu.", ch, pObj, NULL, TO_ROOM ); act( "Nad $j unosi siê w±ska stru¿ka dymu.", ch, pObj, NULL, TO_CHAR ); break; case 2: act( "Nad $j $z unosz± siê ma³e, ciemne chmurki dymu.", ch, pObj, NULL, TO_ROOM ); act( "Nad $j unosz± siê ma³e, ciemne chmurki dymu.", ch, pObj, NULL, TO_CHAR ); break; case 3: act( "Widzisz jak w $f $z tl± siê ma³e, jasne iskierki.", ch, pObj, NULL, TO_ROOM ); act( "Widzisz kilka ma³ych, jasnych iskierek tl±cych siê w $k.", ch, pObj, NULL, TO_CHAR ); break; case 4: act( "Dostrzegasz, ¿e nad $f trzyman± przez $z unosi siê gêsta smuga dymu.", ch, pObj, NULL, TO_ROOM ); act( "Dosrzegasz unosz±c± siê nad $f gêst± smugê dymu.", ch, pObj, NULL, TO_CHAR ); break; case 5: act( "S³yszysz jak zawarto¶æ $f $z lekko syczy tl±c siê.", ch, pObj, NULL, TO_ROOM ); act( "S³yszysz jak zawarto¶æ $f lekko syczy tl±c siê.", ch, pObj, NULL, TO_CHAR ); break; case 6: act( "Czujesz delikatny aromat jakoby zio³owego dymu, bij±cy od $z i jego $f.", ch, pObj, NULL, TO_ROOM ); act( "Czujesz bij±cy od $f lekki, jakby zio³owy aromat.", ch, pObj, NULL, TO_CHAR ); break; default: act( "Zawarto¶æ $f nale¿±cej do $z tli siê lekko.", ch, pObj, NULL, TO_ROOM ); act( "Zawarto¶æ $f tli siê lekko.", ch, pObj, NULL, TO_CHAR ); break; } if ( pObj->value[ 1 ] <= 0 ) { act( "Ostatnie, tl±ce siê iskierki gasn±, kiedy wypali³a siê ca³a zawarto¶æ $f.", ch, pObj, NULL, TO_CHAR ); act( "Widzisz jak $p $z ga¶nie z lekkim sykiem.", ch, pObj, NULL, TO_ROOM ); pObj->value[ 0 ] = 0; pObj->value[ 1 ] = 0; pObj->value [ 2 ] = 0; } } return ; } if ( !str_prefix( arg1, "exhale" ) || !str_prefix( arg1, "wydech" )) { // Potrzebne staty do testow na 'triki'... dex = get_curr_stat_deprecated(ch,STAT_DEX); con = get_curr_stat_deprecated(ch,STAT_CON); wis = get_curr_stat_deprecated(ch,STAT_WIS); /* Zeby "wydychac" flaga palenia musi byc nalozona na gracza - sprawdzanie */ if ( !EXT_IS_SET( ch->act, PLR_SMOKED ) ) { send_to_char( "Jak chcesz to zrobiæ? Najpierw musisz zaci±gn±æ siê dymem!\n\r", ch ); return ; } /* Pomocy! if ( !str_prefix( arg2, "help" ) || !str_prefix( arg2, "pomoc" )) { act( "{R[PORADA]:{x\n\r", ch, NULL, NULL, TO_CHAR ); act( "{YZanim bêdziesz <&móg³/mog³a/mog³o> wydychaæ dym musisz paliæ fajkê.{x", ch, NULL, NULL, TO_CHAR ); act( "{YPo tym jak skoñczysz rozkoszowaæ siê bogatym smakiem ziela fajkowego...{x", ch, NULL, NULL, TO_CHAR ); act( "{YMo¿esz wydychaæ tytoniowy dym na ró¿ne sposoby, ¿eby uatrakcyjniæ palenie.{x", ch, NULL, NULL, TO_CHAR ); act( "{YSpróbuj tych oto typów wydechu, aby zadziwiæ znajomych:{x \n\r", ch, NULL, NULL, TO_CHAR ); act( "Angielskie komendy: RINGS, LINES, SPHERE, WEB, PHOENIX, HORNS, NAME", ch, NULL, NULL, TO_CHAR ); act( "Polskie komendy: KO£A, LINIE, KULA, SIEÆ, FENIKS, ROGI, IMIÊ\n\r", ch, NULL, NULL, TO_CHAR ); act( "\n\r{YSk³adnia angielska: {Gpipe exhale <nazwa figury>{x.", ch, NULL, NULL, TO_CHAR ); act( "{YSk³adnia polska: {Gfajka wydech <nazwa figury>{x.\n\r", ch, NULL, NULL, TO_CHAR ); return ; }*/ if ( arg2[ 0 ] == '\0' ) { switch ( number_range ( 1, 5 ) ) { case 1: act( "$n wydycha ustami ob³ok bladego, szarego dymu.", ch, NULL, NULL, TO_ROOM ); act( "Wydychasz ustami ob³ok szarego, bladego dymu.", ch, NULL, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); return ; case 2: act( "$n wydycha nosem ob³ok bladego, szarego dymu.", ch, NULL, NULL, TO_ROOM ); act( "Wydychasz nosem ob³ok szarego, bladego dymu.", ch, NULL, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); return ; case 3: act( "$n spokojnie wydycha ustami ob³ok bladego, szarego dymu.", ch, NULL, NULL, TO_ROOM ); act( "Spokojnie wydychasz ustami ob³ok szarego, bladego dymu.", ch, NULL, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); return ; case 4: act( "$n spokojnie wydycha nosem ob³ok bladego, szarego dymu.", ch, NULL, NULL, TO_ROOM ); act( "Spokojnie wydychasz nosem ob³ok szarego, bladego dymu.", ch, NULL, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); return ; default: act( "$n wydycha ob³ok bladego, szarego dymu.", ch, NULL, NULL, TO_ROOM ); act( "Wydychasz ob³ok szarego, bladego dymu.", ch, NULL, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); return ; } } else if ( !str_prefix( arg2, "ko³a" ) || !str_prefix( arg2, "rings" ) ) { if ( dice( 2, dex - 10 ) >= 4 && dice( 2, con - 6 ) > 6 ) { act( "$n niespodziewanie wypuszcza z ust kilka du¿ych, zadziwiaj±co okr±g³ych kó³ z dymu, które uk³adaj± siê w ¶mieszny tunel zawieszony w powietrzu!", ch, NULL, NULL, TO_ROOM ); act( "Wypuszczasz z ust kilka du¿ych, zadziwiaj±co okr±g³ych kó³ z dymu, które uk³adaj± siê w ¶mieszny tunel zawieszony w powietrzu!", ch, NULL, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); return ; } else { switch ( number_range ( 1, 4 ) ) { case 1: act( "$n nagle robi dziwn± minê, po czym momentalnie dostaje ataku kaszlu.", ch, pObj, NULL, TO_ROOM ); act( "Próbujesz zrobiæ sztuczkê, jednak w ostatniej chwili dym zacz±³ gry¼æ ciê w gar³o i <&dosta³e¶/dosta³a¶/dosta³o¶> ataku kaszlu!", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 2: act( "Widzisz jak $n koncentruje siê przez chwilkê, aby po chwili wypu¶ciæ z ust niekszta³tn± chmurê dymu.", ch, pObj, NULL, TO_ROOM ); act( "Koncentrujesz siê przez chwilkê, chc±c wypu¶ciæ z ust chmurê dymu w kszta³cie ko³a, jednak nie udaje ci siê to.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 3: act( "$n nagle zielenieje na twarzy, a z jego nosa zaczynaj± wylatywaæ szare stru¿ki dymu.", ch, pObj, NULL, TO_ROOM ); act( "W ostatniej chwili przygotowañ do zrobienia sztuczki krztusisz siê i bezwiednie wypuszczasz dym nosem.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; default: EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); act( "$n próbuje zrobiæ jak±¶ sztuczkê z wypuszczeniem z ust dymu, jednak udaje mu siê jedynie uformowaæ dym w bezkszta³tn± chmurê.", ch, pObj, NULL, TO_ROOM ); act( "Starasz siê wypu¶ciæ z ust kilka kszta³tnych kó³, jednak nie udaje ci siê, a dym przybiera kszta³t nieforemnej chmury.", ch, pObj, NULL, TO_CHAR ); break; } } } else if ( !str_prefix( arg2, "linie" ) || !str_prefix( arg2, "lines" )) { if ( dice( 2, dex - 10 ) > 5 && dice( 2, con - 8 ) >= 5 ) { act( "$n wydycha d³ug± smugê dymu w kszta³cie piêknej, prostej linii, zdaj±c± siê pi±æ w kierunku nieba!", ch, NULL, NULL, TO_ROOM ); act( "Wydychasz d³ug± smugê dymu w kszta³cie piêknej, prostej linii, zdaj±c± siê pi±æ w kierunku nieba!", ch, NULL, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); return ; } else { switch ( number_range ( 1, 5 ) ) { case 1: act( "$n nagle robi dziwn± minê, po czym momentalnie dostaje ataku kaszlu.", ch, pObj, NULL, TO_ROOM ); act( "Próbujesz zrobiæ sztuczkê, jednak w ostatniej chwili dym zacz±³ gry¼æ ciê w gar³o i <&dosta³e¶/dosta³a¶/dosta³o¶> ataku kaszlu!", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 2: act( "Widzisz jak $n koncentruje siê przez chwilkê, aby po chwili wypu¶ciæ z ust niekszta³tn± chmurê dymu.", ch, pObj, NULL, TO_ROOM ); act( "Koncentrujesz siê przez chwilkê, chc±c wypu¶ciæ z ust chmurê dymu w kszta³cie linii, jednak nie udaje ci siê to.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 3: act( "$n nagle zielenieje na twarzy, a z jego nosa zaczynaj± wylatywaæ szare stru¿ki dymu.", ch, pObj, NULL, TO_ROOM ); act( "W ostatniej chwili przygotowañ do zrobienia sztuczki krztusisz siê i bezwiednie wypuszczasz dym nosem.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 4: act( "$n z gracj± zaczyna wypuszczaæ z ust kilka chmurek dymu, które niespodziewanie szybko rozp³ywaj± siê w powietrzu.", ch, pObj, NULL, TO_ROOM ); act( "W skupieniu wypuszczasz z ust kilka chmurek dymu, te jednak rozp³ywaj± siê szybko w powietrzu zanim zd±zy³y siê uformowaæ w jaki¶ kszta³t.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; default: act( "$n próbuje zrobiæ jak±¶ sztuczkê z wypuszczeniem z ust dymu, jednak udaje mu siê jedynie uformowaæ dym w bezkszta³tn± chmurê.", ch, pObj, NULL, TO_ROOM ); act( "Starasz siê wypu¶ciæ z ust prost± liniê dymu, jednak nie udaje ci siê, a dym przybiera kszta³t nieforemnej chmury.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; } } } else if ( !str_prefix( arg2, "kula" ) || !str_prefix( arg2, "sphere" )) { if ( dice( 2, dex - 5 ) >= 7 && dice( 3, con - 2 ) > 15 ) { act( "$n wypuszcza z ust jedn±, niesamowicie okr±g³a, chmurê dymu w kszta³cie idealnej kuli!", ch, NULL, NULL, TO_ROOM ); act( "Wypuszczasz z ust du¿±, niesamowicie okr±g³±, chmurê dymu w kszta³cie idealnej kuli!", ch, NULL, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); return ; } else { switch ( number_range ( 1, 5 ) ) { case 1: act( "$n nagle robi dziwn± minê, po czym momentalnie dostaje ataku kaszlu.", ch, pObj, NULL, TO_ROOM ); act( "Próbujesz zrobiæ sztuczkê, jednak w ostatniej chwili dym zacz±³ gry¼æ ciê w gar³o i <&dosta³e¶/dosta³a¶/dosta³o¶> ataku kaszlu!", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 2: act( "Widzisz jak $n koncentruje siê przez chwilkê, aby po chwili wypu¶ciæ z ust niekszta³tn± chmurê dymu.", ch, pObj, NULL, TO_ROOM ); act( "Koncentrujesz siê przez chwilkê, chc±c wypu¶ciæ z ust chmurê dymu w kszta³cie kuli, jednak nie udaje ci siê to.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 3: act( "$n nagle zielenieje na twarzy, a z jego nosa zaczynaj± wylatywaæ szare stru¿ki dymu.", ch, pObj, NULL, TO_ROOM ); act( "W ostatniej chwili przygotowañ do zrobienia sztuczki krztusisz siê i bezwiednie wypuszczasz dym nosem.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 4: act( "$n nagle zaczyna kaszlaæ dymem, a dym który ulatuje z jego ust tworzy dziwn± chmurkê.", ch, pObj, NULL, TO_ROOM ); act( "Niespodziewanie co¶ ci nie wychodzi, krztusisz siê i kaszlaj±c panicznie wypuszczasz z ust resztki dymu.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; default: act( "$n próbuje zrobiæ jak±¶ sztuczkê z wypuszczeniem z ust dymu, jednak udaje mu siê jedynie uformowaæ dym w bezkszta³tn± chmurê.", ch, pObj, NULL, TO_ROOM ); act( "Starasz siê wypu¶ciæ z ust kulê dymu, jednak nie udaje ci siê, a dym przybiera kszta³t nieforemnej chmury.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; } } } else if ( !str_prefix( arg2, "sieæ" ) || !str_prefix( arg2, "web" )) { if ( dice( 2, dex - 5 ) >= 15 && dice( 2, con - 8 ) > 6 ) { act( "$n wydycha kilkana¶cie cieniutkich, zwiewnych pasemek dymu, które niespodziewanie ³±cz± siê tworz±c delikatn±, prawie pajêcz±, sieæ w powietrzu!", ch, NULL, NULL, TO_ROOM ); act( "Wydychasz kilkana¶cie cieniutkich, zwiewnych pasemek dymu, które niespodziewanie ³±cz± siê tworz±c delikatn±, prawie pajêcz±, sieæ w powietrzu!", ch, NULL, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); return ; } else { switch ( number_range ( 1, 5 ) ) { case 1: act( "$n nagle robi dziwn± minê, po czym momentalnie dostaje ataku kaszlu.", ch, pObj, NULL, TO_ROOM ); act( "Próbujesz zrobiæ sztuczkê, jednak w ostatniej chwili dym zacz±³ gry¼æ ciê w gar³o i <&dosta³e¶/dosta³a¶/dosta³o¶> ataku kaszlu!", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 2: act( "Widzisz jak $n koncentruje siê przez chwilkê, aby po chwili wypu¶ciæ z ust niekszta³tn± chmurê dymu.", ch, pObj, NULL, TO_ROOM ); act( "Koncentrujesz siê przez chwilkê, chc±c wypu¶ciæ z ust chmurê dymu w kszta³cie kuli, jednak nie udaje ci siê to.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 3: act( "$n nagle zielenieje na twarzy, a z jego nosa zaczynaj± wylatywaæ szare stru¿ki dymu.", ch, pObj, NULL, TO_ROOM ); act( "W ostatniej chwili przygotowañ do zrobienia sztuczki krztusisz siê i bezwiednie wypuszczasz dym nosem.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 4: act( "$n wydycha szybk± seriê w±skich dymków, które wydaj± siê pe³zaæ w powietrzu jak niepos³usze robaczki, szybko rozp³ywaj±ce siê w powietrzu.", ch, pObj, NULL, TO_ROOM ); act( "Szybko wydychasz seriê w±skich dymków chc±c z nich uformowaæ pajêczynê, te jednak szybko rozp³ywaj± siê w powietrzu.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; default: act( "$n próbuje zrobiæ jak±¶ sztuczkê z wypuszczeniem z ust dymu, jednak udaje mu siê jedynie uformowaæ dym w bezkszta³tn± chmurê.", ch, pObj, NULL, TO_ROOM ); act( "Starasz siê wypu¶ciæ z ust seriê dymków, jednak nie udaje ci siê, a sam dym przybiera kszta³t nieforemnej chmury.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; } } } else if ( !str_prefix( arg2, "feniks" ) || !str_prefix( arg2, "phoenix" ) || !str_prefix( arg2, "fenix" ) ) { if ( dice( 2, dex - 10 ) >= 8 && dice( 2, con - 10 ) >= 8 && dice( 2, wis - 10 ) >= 5 ) { act( "$n wydycha serie ma³ych chmurek dymu, które na chwilê uk³adaj± siê w wizerunek feniksa, tylko po to, aby chwilê pó¼niej rozp³ynê³y siê, niczym proch.", ch, NULL, NULL, TO_ROOM ); act( "Wydychasz serie ma³ych chmurek dymu, które na chwilê uk³adaj± siê w wizerunek feniksa, tylko po to, aby chwilê pó¼niej rozp³ynê³y siê, niczym proch.", ch, NULL, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); return ; } else { switch ( number_range ( 1, 7 ) ) { case 1: act( "$n nagle robi dziwn± minê, po czym momentalnie dostaje ataku kaszlu.", ch, pObj, NULL, TO_ROOM ); act( "Próbujesz zrobiæ sztuczkê, jednak w ostatniej chwili dym zacz±³ gry¼æ ciê w gar³o i <&dosta³e¶/dosta³a¶/dosta³o¶> ataku kaszlu!", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 2: act( "Widzisz jak $n koncentruje siê przez chwilkê, aby po chwili wypu¶ciæ z ust niekszta³tn± chmurê dymu.", ch, pObj, NULL, TO_ROOM ); act( "Koncentrujesz siê przez chwilkê, chc±c wypu¶ciæ z ust chmurê dymu w kszta³cie linii, jednak nie udaje ci siê to.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 3: act( "$n nagle zielenieje na twarzy, a z jego nosa zaczynaj± wylatywaæ szare stru¿ki dymu.", ch, pObj, NULL, TO_ROOM ); act( "W ostatniej chwili przygotowañ do zrobienia sztuczki krztusisz siê i bezwiednie wypuszczasz dym nosem.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 4: act( "$n w wielkim skupieniu wydycha kilkana¶cie dymków, które zaczynaj± uk³adaæ siê w powietrzu w co¶ przypominaj±cego hybrydê szczura z ludzkimi nogami... Czy to by³o zamierzone?", ch, pObj, NULL, TO_ROOM ); act( "W wielkim skupieniu wydychasz kilkana¶cie dymków, które niespodziewanie zamiast feniksa uk³adaj± siê w co¶ przypominaj±cego po³±czenie szczura z ludzkimi nogami! Okropne.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 5: act( "$n, z grymasem na twarzy, wypuszcza z ust kilkana¶cie dymków, które uk³adaj± siê w powietrzu w jaki¶ dziwny ptakopodobny twór, wygl±daj±cy dosyæ ohydnie.", ch, pObj, NULL, TO_ROOM ); act( "Czuj±c, ¿e co¶ pójdzie ¼le wypuszczasz z ust kilkana¶cie dymków, które uk³adaj± siê w powietrzu w jaki¶ bezkszta³tny, ptakopodobny twór.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 6: act( "$n, z wyrazem pewno¶ci siebie na twarzy, wydycha seriê ma³ych dymków, które nagle ³±cz± siê w powietrzu tworz±c pewien du¿y, oble¶ny kszta³t... Hmm, to ciekawe. K±tem oka widzisz, ¿e $n siê rumieni na widok swojego dzie³a.", ch, pObj, NULL, TO_ROOM ); act( "Wypuszczasz z ust kilkana¶cie ma³ych dymków, które nagle ³±cz± siê w powietrzu, tworz±c naprawdê du¿y, oble¶ny kszta³t. Chyba siê zaraz spalisz ze wstydu!", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; default: act( "$n próbuje zrobiæ jak±¶ sztuczkê z wypuszczeniem z ust dymu, jednak udaje mu siê jedynie uformowaæ dym w bezkszta³tn± chmurê.", ch, pObj, NULL, TO_ROOM ); act( "Starasz siê wypu¶ciæ z ust kilkana¶cie dymków, jednak nie udaje ci siê, a sam dym przybiera kszta³t nieforemnej chmury.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; } } } else if ( !str_prefix( arg2, "rogi" ) || !str_prefix( arg2, "horns" )) { if ( dice( 2, dex - 10 ) >= 9 && dice( 2, con - 6 ) >= 10 ) { act( "$n wydycha dwie grube smugi dymu, które uk³adaj± siê nad $m niczym para wielkich rogów!", ch, NULL, NULL, TO_ROOM ); act( "Wydychasz dwie grube smugi dymu, które uk³adaj± sie nad tob± niczym para wielkich rogów!", ch, NULL, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); return ; } else { switch ( number_range ( 1, 4 ) ) { case 1: act( "$n nagle robi dziwn± minê, po czym momentalnie dostaje ataku kaszlu.", ch, pObj, NULL, TO_ROOM ); act( "Próbujesz zrobiæ sztuczkê, jednak w ostatniej chwili dym zacz±³ gry¼æ ciê w gar³o i <&dosta³e¶/dosta³a¶/dosta³o¶> ataku kaszlu!", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 2: act( "Widzisz jak $n koncentruje siê przez chwilkê, aby po chwili wypu¶ciæ z ust niekszta³tn± chmurê dymu.", ch, pObj, NULL, TO_ROOM ); act( "Koncentrujesz siê przez chwilkê, chc±c wypu¶ciæ z ust chmurê dymu w kszta³cie linii, jednak nie udaje ci siê to.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 3: act( "$n nagle zielenieje na twarzy, a z jego nosa zaczynaj± wylatywaæ szare stru¿ki dymu.", ch, pObj, NULL, TO_ROOM ); act( "W ostatniej chwili przygotowañ do zrobienia sztuczki krztusisz siê i bezwiednie wypuszczasz dym nosem.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; default: act( "$n próbuje zrobiæ jak±¶ sztuczkê z wypuszczeniem z ust dymu, jednak udaje mu siê jedynie uformowaæ dym w bezkszta³tn± chmurê.", ch, pObj, NULL, TO_ROOM ); act( "Starasz siê wypu¶ciæ z ust prost± liniê dymu, jednak nie udaje ci siê, a dym przybiera kszta³t nieforemnej chmury.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; } } } else if ( !str_prefix( arg2, "imiê" ) || !str_prefix( arg2, "name" )) { if ( dice( 2, dex - 10 ) >= 8 && dice( 2, con - 8 ) >= 9 && dice( 2, wis - 10 ) > 6 ) { act( "$n wypuszcza z ust kilkana¶cie ma³ych dymków, które niespodziewanie tworz± w powietrzu napis '$n'! Niesamowite!", ch, NULL, NULL, TO_ROOM ); act( "Wypuszczasz z ust kilkana¶cie ma³ych dymków, które niespodziewanie tworz± w powietrzu napis '$n'! ¦wietnie!", ch, NULL, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); return ; } else { switch ( number_range ( 1, 6 ) ) { case 1: act( "$n nagle robi dziwn± minê, po czym momentalnie dostaje ataku kaszlu.", ch, pObj, NULL, TO_ROOM ); act( "Próbujesz zrobiæ sztuczkê, jednak w ostatniej chwili dym zacz±³ gry¼æ ciê w gar³o i <&dosta³e¶/dosta³a¶/dosta³o¶> ataku kaszlu!", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 2: act( "Widzisz jak $n koncentruje siê przez chwilkê, aby po chwili wypu¶ciæ z ust niekszta³tn± chmurê dymu.", ch, pObj, NULL, TO_ROOM ); act( "Koncentrujesz siê przez chwilkê, chc±c wypu¶ciæ z ust chmurê dymu w kszta³cie linii, jednak nie udaje ci siê to.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 3: act( "$n nagle zielenieje na twarzy, a z jego nosa zaczynaj± wylatywaæ szare stru¿ki dymu.", ch, pObj, NULL, TO_ROOM ); act( "W ostatniej chwili przygotowañ do zrobienia sztuczki krztusisz siê i bezwiednie wypuszczasz dym nosem.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 4: act( "$n, z wyrazem pewno¶ci siebie na twarzy, wydycha seriê ma³ych dymków, które nagle ³±cz± siê w powietrzu tworz±c pewien du¿y, oble¶ny kszta³t... Hmm, to ciekawe. K±tem oka widzisz, ¿e $n siê rumieni na widok swojego dzie³a.", ch, pObj, NULL, TO_ROOM ); act( "Wypuszczasz z ust kilkana¶cie ma³ych dymków, które nagle ³±cz± siê w powietrzu, tworz±c naprawdê du¿y, oble¶ny kszta³t. Chyba siê zaraz spalisz ze wstydu!", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; case 5: print_char( ch, "Wydychasz w wielkim skupieniu kilkana¶cie szarych dymków, które niespodziewanie tworz± w powietrzu bezsensowny napis '%s'!", gen_random_str( 4, 8 ) ); sprintf( buf, "$n wydycha w wielkim skupieniu kilkana¶cie szarych dymków, które niespodziewanie tworz± w powietrzu bezsensowny napis '%s'!\n\r", gen_random_str( 4, 8 ) ); act( buf, ch, NULL, NULL, TO_ROOM ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; default: act( "$n próbuje zrobiæ jak±¶ sztuczkê z wypuszczeniem z ust dymu, jednak udaje mu siê jedynie uformowaæ dym w bezkszta³tn± chmurê.", ch, pObj, NULL, TO_ROOM ); act( "Starasz siê wypu¶ciæ z ust kilka dziwnych chmurek dymu, jednak nie udaje ci siê, a dym przybiera kszta³t nieforemnej chmury.", ch, pObj, NULL, TO_CHAR ); EXT_REMOVE_BIT( ch->act, PLR_SMOKED ); break; } } } else { send_to_char( "Huh?! Nie znasz takiej sztuczki!\n\r", ch ); return; } } // Nabijanie fajki if ( !str_prefix( arg1, "tamp" ) || !str_prefix( arg1, "nabij" )) { // Seria zabezpieczen... if ( pObj == NULL ) pObj = get_eq_char( ch, WEAR_HOLD ); if ( pObj == NULL ) { act( "Co chcesz nabiæ?", ch, pObj, NULL, TO_CHAR ); return ; } if ( pObj->item_type != ITEM_PIPE ) { send_to_char( "Mo¿esz nabijaæ jedynie fajki!\n\r", ch ); return ; } if ( ( qObj = get_obj_carry( ch, arg3, ch ) ) == NULL ) { act( "Czym chcesz nabiæ $h?", ch, pObj, NULL, TO_CHAR ); return ; } if ( qObj->item_type != ITEM_WEED ) { pipe_name = capitalize( pObj->name4 ); sprintf( pipe_name_2, "%s mo¿esz nabiæ jedynie jakim¶ rodzajem ziela.", pipe_name ); act( pipe_name_2, ch, pObj, NULL, TO_CHAR ); } else if ( pObj->value[ 0 ] == 1 ) { pipe_name = capitalize( pObj->short_descr ); sprintf( pipe_name_2, "%s jest zapalona, nie mo¿esz jej teraz nabijaæ!", pipe_name ); act( pipe_name_2, ch, pObj, NULL, TO_CHAR ); return ; } else if ( pObj->value[ 1 ] > 0 ) { pipe_name = capitalize( pObj->short_descr ); sprintf( pipe_name_2, "%s jest ju¿ czym¶ nabita. Przed ponownym nabiciem opró¿nij j±.", pipe_name ); act( pipe_name_2, ch, pObj, NULL, TO_CHAR ); return ; } else { // Nabijanie fajki, przepisywanie wartosci ziela do fajeczki. weed_amount = qObj->value [ 0 ]; weed_type = qObj->value [ 1 ]; pObj->value [ 1 ] = weed_amount; pObj->value [ 2 ] = weed_type; print_char( ch, "Nabijasz %s %s.\n\r", pObj->name4, qObj->name5 ); sprintf( buf, "$n nabija %s %s.\n\r", pObj->name4, qObj->name5 ); act( buf, ch, NULL, NULL, TO_ROOM ); extract_obj( qObj ); return ; } } // zapalanie if ( !str_prefix( arg1, "light" ) || !str_prefix( arg1, "zapal" )) { pObj = get_obj_carry( ch, arg2, ch ); if ( pObj == NULL ) pObj = get_eq_char( ch, WEAR_HOLD ); if ( pObj == NULL ) { act( "Co chcesz zapaliæ?", ch, pObj, NULL, TO_CHAR ); return ; } if ( pObj->item_type != ITEM_PIPE ) { send_to_char( "Mo¿esz zapalaæ jedynie fajki!\n\r", ch ); return ; } else if ( pObj->value[ 0 ] == 1 ) { pipe_name = capitalize( pObj->short_descr ); sprintf( pipe_name_2, "%s jest ju¿ zapalona.", pipe_name ); act( pipe_name_2, ch, pObj, NULL, TO_CHAR ); return ; } else if ( pObj->value[ 2 ] == 4 ) { act( "Zawarto¶æ $f jest mokra! Nie dasz rady tego zapaliæ.", ch, pObj, NULL, TO_CHAR ); act( "Lepiej wyczy¶æ $h i nape³nij j± czym¶ suchym, najlepiej zielem fajkowym.", ch, pObj, NULL, TO_CHAR ); return ; } else { pObj->value [ 0 ] = 1; act( "Zapalaj±c $h zaczynasz czuæ przyjemny, delikatny zapach palonego ziela.", ch, pObj, NULL, TO_CHAR ); act( "$n zapala $h. Czujesz jak w powietrzu zaczyna unosiæ siê lekki zapach palonego ziela.", ch, pObj, NULL, TO_ROOM ); return ; } } // gaszenie if ( !str_prefix( arg1, "extinguish" ) || !str_prefix( arg1, "zga¶" )) { /*if ( ( pObj = get_obj_carry( ch, arg2, ch ) ) == NULL ) { act( "Co chcesz zgasiæ?", ch, pObj, NULL, TO_CHAR ); return ; }*/ if ( pObj == NULL ) pObj = get_eq_char( ch, WEAR_HOLD ); if ( pObj == NULL ) { act( "Co chcesz zgasiæ?", ch, pObj, NULL, TO_CHAR ); return ; } if ( pObj->item_type != ITEM_PIPE ) { send_to_char( "Mo¿esz gasiæ jedynie fajki!\n\r", ch ); return ; } else if ( pObj->value[ 0 ] == 0 ) { pipe_name = capitalize( pObj->short_descr ); sprintf( pipe_name_2, "%s jest ju¿ zgaszona.", pipe_name ); act( pipe_name_2, ch, pObj, NULL, TO_CHAR ); return ; } else { pObj->value [ 0 ] = 0; act( "Gasz±c $h widzisz jak ostatnie iskierki ognia bledn± i znikaj±.", ch, pObj, NULL, TO_CHAR ); act( "$n gasi $h.", ch, pObj, NULL, TO_ROOM ); return ; } } // czyszczenie / opró¿nianie if ( !str_prefix( arg1, "clean" ) || !str_prefix( arg1, "wyczy¶æ" )) { /*if ( ( pObj = get_obj_carry( ch, arg2, ch ) ) == NULL ) { act( "Co chcesz wyczy¶ciæ?", ch, pObj, NULL, TO_CHAR ); return ; }*/ if ( pObj == NULL ) pObj = get_eq_char( ch, WEAR_HOLD ); if ( pObj == NULL ) { act( "Co chcesz wyczy¶ciæ?", ch, pObj, NULL, TO_CHAR ); return ; } if ( pObj->item_type != ITEM_PIPE ) { send_to_char( "Mo¿esz czy¶ciæ jedynie fajki!\n\r", ch ); return ; } else if ( pObj->value[ 0 ] == 1 ) { act( "Mo¿e lepiej najpierw zga¶ $h?", ch, pObj, NULL, TO_CHAR ); return ; } else if ( pObj->value[ 1 ] == 0 ) { act( "Ogl±dasz z dum± $h, po czym pucujesz j± dok³adnie rêkawem. Teraz jest naprawdê czysta!", ch, pObj, NULL, TO_CHAR ); act( "$n z dum± pucuje $h, u¶miechaj±c siê przy tym tajemniczo.", ch, pObj, NULL, TO_ROOM ); return ; } else { pObj->value [ 1 ] = 0; pObj->value [ 2 ] = 0; act( "Wysypujesz zawarto¶æ $f. Teraz jest pusta.", ch, pObj, NULL, TO_CHAR ); act( "$n wysypuje zawarto¶æ $f.", ch, pObj, NULL, TO_ROOM ); return ; } } send_to_char( "Huh?\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 do_mount_on( CHAR_DATA *ch, CHAR_DATA *horse ) { bool show; int skill = get_skill( ch, gsn_riding ); if ( ch->mount ) { print_char(ch, "Przecie¿ dosiadasz ju¿ %s!\n\r", ch->mount->name4); return; } if ( horse == ch ) { send_to_char( "Czego chcesz dosi±¶æ?\n\r", ch ); return; } if ( !IS_NPC(horse) || !EXT_IS_SET(horse->act, ACT_MOUNTABLE ) ) { print_char(ch, "Nie mo¿esz dosi±¶æ %s!\n\r", horse->name2 ); return; } if ( horse->mounting ) { print_char(ch, "%s ju¿ ma je¼dzca.\n\r", horse->short_descr ); return; } if ( horse->master && horse->master != ch ) { act("$N nie pozwala ci na to.", ch, NULL, horse->master, TO_CHAR ); return; } if ( horse->position < POS_STANDING ) { send_to_char( "Wierzchowiec musi staæ, aby mo¿na by³o na niego wsi±¶æ.\n\r", ch ); return; } if ( horse->fighting ) { print_char(ch, "%s teraz walczy, nie dasz rady wsi±¶æ.\n\r", horse->short_descr ); return; } if ( is_fearing( horse, ch ) ) { print_char(ch, "%s zbyt siê ciebie boi, nie dasz rady wsi±¶æ.\n\r", horse->short_descr ); if ( number_percent() < 5 ) { one_hit( horse, ch, TYPE_UNDEFINED, FALSE ); } return; } if ( ch->move <= 0 ) { act( "Jeste¶ zbyt zmêczon<&y/a/e> by dosi±¶æ wierzchowca.", ch, NULL, horse, TO_CHAR ); return; } if (IS_AFFECTED(ch, AFF_SNEAK) || IS_AFFECTED(ch, AFF_HIDE)) { switch (horse->sex) { case SEX_NEUTRAL: act( "Próbujesz dosi±¶æ $C, ale robisz to tak niespodziewanie, ¿e $N umyka przestraszone.", ch, NULL, horse, TO_CHAR ); break; case SEX_MALE: act( "Próbujesz dosi±¶æ $C, ale robisz to tak niespodziewanie, ¿e $N umyka przestraszony.", ch, NULL, horse, TO_CHAR ); break; case SEX_FEMALE: default : act( "Próbujesz dosi±¶æ $C, ale robisz to tak niespodziewanie, ¿e $N umyka przestraszona.", ch, NULL, horse, TO_CHAR ); break; } ch->move -= number_range(1,4); if ( ch->move < 0 ) { ch->move = 0; } return; } if(IS_AFFECTED(ch, AFF_FLYING)) { affect_strip(ch, gsn_fly); } if(IS_AFFECTED(ch, AFF_FLOAT)) { affect_strip(ch, gsn_float); } if ( skill == 0 || number_percent() > skill + 5 ) { act( "Nieudolnie próbujesz dosi±¶æ $C i po chwili l±dujesz na ziemi.", ch, NULL, horse, TO_CHAR ); act( "$n nieudolnie próbuje dosi±¶æ $C i po chwili l±duje na ziemi.", ch, NULL, horse, TO_NOTVICT ); ch->position = POS_SITTING; ch->move -= number_range(0,4); if ( ch->weight > 900 ) { ch->move -= number_range(0,2); } ch->move = UMAX(0,ch->move); check_improve( ch, NULL, gsn_riding, TRUE, 70 ); return; } ch->mount = horse; horse->mounting = ch; horse->default_pos = POS_STANDING; horse->position = POS_STANDING; show = TRUE; if ( IS_NPC( horse ) && HAS_TRIGGER( horse, TRIG_MOUNT ) ) { show = !mp_percent_trigger( horse, ch, NULL, NULL, &TRIG_MOUNT ); } if ( IS_NPC( horse ) && HAS_TRIGGER( horse, TRIG_DISMOUNT ) ) { show = FALSE; } if ( show ) { act( "Umiejêtnie dosiadasz $C.", ch, NULL, horse, TO_CHAR ); act( "$n umiejêtnie dosiada $C.", ch, NULL, horse, TO_NOTVICT ); check_improve( ch, NULL, gsn_riding, TRUE, 10 ); } return; }
void hunt_victim( CHAR_DATA *ch ) { CHAR_DATA *tmp; int dir,chance; bool found; if ( !ch || !ch->hunting ) { return; } /* * Make sure the victim still exists. */ for ( found = FALSE, tmp = char_list; tmp && !found; tmp = tmp->next ) { if ( ch->hunting == tmp ) { found = TRUE; } } if ( !can_move( ch) || !found || !can_see( ch, ch->hunting ) ) { stop_hunting( ch ); return; } if ( ch->in_room == ch->hunting->in_room ) { if ( ch->fighting ) return; found_prey( ch, ch->hunting ); return; } if ( !IS_NPC ( ch ) ) { WAIT_STATE( ch, skill_table[gsn_track].beats ); } dir = find_path( ch->in_room->vnum, ch->hunting->in_room->vnum, ch, -40000, TRUE ); if ( dir < 0 || dir >= MAX_DIR ) { stop_hunting( ch ); return; } /* * Give a random direction if the mob misses the die roll. * * 20% for PC * 2% for NPC */ chance = IS_NPC ( ch ) ? 2 : 20; if ( number_percent( ) < chance + 1 ) { do { dir = number_door( ); } while ( !( ch->in_room->exit[dir] ) || !( ch->in_room->exit[dir]->u1.to_room ) ); } if ( IS_SET(ch->in_room->exit[dir]->exit_info, EX_SECRET) && !IS_SET(ch->in_room->exit[dir]->exit_info, EX_HIDDEN) && IS_AFFECTED(ch, AFF_DETECT_HIDDEN) ) { // do_secret(ch, (char *)dir_name[dir]); return; } if ( IS_SET( ch->in_room->exit[dir]->exit_info, EX_CLOSED ) ) { do_open( ch, (char *) dir_name[dir] ); return; } if( IS_SET(sector_table[ch->in_room->exit[dir]->u1.to_room->sector_type].flag, SECT_UNDERWATER) || IS_SET(ch->in_room->exit[dir]->exit_info, EX_NO_MOB) || EXT_IS_SET(ch->in_room->exit[dir]->u1.to_room->room_flags, ROOM_NO_MOB) || ( EXT_IS_SET(ch->act, ACT_STAY_AREA) && ch->in_room->exit[dir]->u1.to_room->area != ch->in_room->area ) || ( EXT_IS_SET(ch->act, ACT_STAY_SECTOR) && ch->in_room->exit[dir]->u1.to_room->sector_type != ch->in_room->sector_type ) || ( EXT_IS_SET(ch->act, ACT_OUTDOORS) && EXT_IS_SET(ch->in_room->exit[dir]->u1.to_room->room_flags,ROOM_INDOORS)) || ( EXT_IS_SET(ch->act, ACT_INDOORS) && EXT_IS_SET(ch->in_room->exit[dir]->u1.to_room->room_flags,ROOM_INDOORS))) return; move_char( ch, dir, FALSE, NULL ); if ( !ch->hunting ) { if ( !ch->in_room ) { char buf [ MAX_STRING_LENGTH ]; sprintf( buf, "Hunt_victim: no ch->in_room! Mob #%d, name: %s. Placing mob in limbo (char_to_room).", ch->pIndexData->vnum, ch->name ); bug( buf, 0 ); char_to_room( ch, get_room_index( ROOM_VNUM_LIMBO ) ); return; } return; } if ( ch->in_room == ch->hunting->in_room ) found_prey( ch, ch->hunting ); return; }
void do_track( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; char arg [ MAX_STRING_LENGTH ]; CHAR_DATA *victim; int direction, skill; bool fArea=TRUE; skill=get_skill(ch, gsn_track); if (IS_NPC(ch)) { return; } if ( ch->mount ) { send_to_char( "Najpierw zsi±d¼ ze swojego wierzchowca.\n\r", ch ); return; } if ( !IS_IMMORTAL( ch ) && IS_AFFECTED( ch, AFF_BLIND ) ) { act("$n klêka i bezradnie potrz±sa g³ow±.",ch,NULL,NULL,TO_ROOM); send_to_char("Klekasz, ale przecie¿ niczego nie widzisz.\n\r",ch); return; } if ( room_is_dark( ch, ch->in_room ) && !(IS_AFFECTED( ch, AFF_DARK_VISION ) || IS_IMMORTAL( ch ) )) { send_to_char("Klekasz, ale jest tu tak ciemno, ¿e niczego nie widzisz.\n\r",ch); return; } // wycinamy niektóre ze sektorów switch ( ch->in_room->sector_type ) { case 6: //woda p³yw case 7: //woda niep case 19: //rzeka case 20: //jezioro case 21: //morze case 22: //ocean case 23: //lawa case 24: //ruchome piaski case 25: //gor±ce ¼ród³o case 34: //pod wod± case 37: //ciemna woda case 39: //podziemne jezioro send_to_char( "Tutaj chyba nie da siê szukaæ ¶ladów.\n\r", ch ); return; } // komunikaty dla tych, którzy nie umiej± szukaæ ¶ladów if ( skill == 0 ) { switch (number_range(1,7)) { case 1: act("$n klêka i nie wie co robiæ dalej.",ch,NULL,NULL,TO_ROOM); send_to_char("Klêkasz i nie za bardzo wiesz co robiæ dalej.\n\r",ch); break; case 2: act("$n klêka i niczego nie widzi.",ch,NULL,NULL,TO_ROOM); send_to_char("Klêkasz i niczego nie widzisz.\n\r",ch); break; case 3: act("$n mocno tupie, klêka i przygl±da siê ¶ladom.",ch,NULL,NULL,TO_ROOM); send_to_char("Mocno tupiesz, klêkasz i przygl±dasz siê ¶ladom.\n\r",ch); break; case 4: act("$n klêka i ¶ledzi tropy, ale nie ma o tym zielonego pojêcia.",ch,NULL,NULL,TO_ROOM); send_to_char("Klêkasz i ¶ledzisz tropy, choæ nie masz o tym zielonego pojêcia.\n\r",ch); break; case 5: act("$n klêka i robi nieszczê¶liw± minê.",ch,NULL,NULL,TO_ROOM); send_to_char("Klêkasz i robisz nieszczê¶liw± minê.\n\r",ch); break; case 6: act("$n rozgl±da siê dooko³a.",ch,NULL,NULL,TO_ROOM); send_to_char("Rozgl±dasz siê dooko³a, ale to nie pomaga.\n\r",ch); break; case 7: act("$n zastanawia siê nad tym, ¿e tropienie to niez³a umiejêtno¶æ.",ch,NULL,NULL,TO_ROOM); send_to_char("Zastanawiasz siê nad tym, ¿e tropienie to niez³a umiejêtno¶æ.\n\r",ch); break; default : send_to_char( "Nie masz pojêcia jak to siê robi.\n\r", ch ); act("$n klêka i ¶ledzi tropy, ale nie ma o tym zielonego pojêcia.",ch,NULL,NULL,TO_ROOM); break; } return; } // bonus/kara od dobrej lokacji s± wiêksze ni¿ od z³ej if ( EXT_IS_SET( ch->in_room->room_flags, ROOM_CONSECRATE )) { if (IS_EVIL( ch ) ) skill -= number_range(1,5); if (IS_GOOD( ch ) ) skill += number_range(1,5); } if ( EXT_IS_SET( ch->in_room->room_flags, ROOM_DESECRATE )) { if (IS_EVIL( ch ) ) skill += number_range(0,4); if (IS_GOOD( ch ) ) skill -= number_range(0,4); } // sprawdzamy czy skill nie zrobi³ siê nam mniejszy ni¿ 1 if (skill < 1) { skill = 1; } // no to zaczynamy w³a¶ciwe trackowanie :D one_argument( argument, arg ); #ifdef ENABLE_NEW_TRACK if(MAX_TRACK_LEN > 0) { track_new(ch, skill, argument); return; } #endif if ( arg[0] == '\0' ) { act("$n klêka i zaczyna z uwag± przygl±daæ siê ¶ladom.",ch,NULL,NULL,TO_ROOM); act("Klêkasz i z uwag± przygl±dasz siê ¶ladom.",ch,NULL,NULL,TO_CHAR); return; } if ( fArea ) { victim = get_char_area( ch, arg ); } else { victim = get_char_world( ch, arg ); } if ( !victim ) { act("$n klêka i zaczyna z uwag± przygl±daæ siê ¶ladom.",ch,NULL,NULL,TO_ROOM); act("Klêkasz, przygl±dasz siê ¶ladom, ale nie znajdujesz ¿adnego tropu.",ch,NULL,NULL,TO_CHAR); WAIT_STATE( ch, skill_table[gsn_track].beats ); return; } if(victim==ch) { act("Zastanawiasz siê przez chwilê czy to ma sens, no có¿...",ch,NULL,NULL,TO_CHAR); return; } if ( ch->in_room == victim->in_room ) { act( "Klêkasz i badasz trop, po chwili zdajesz sobie sprawê, ¿e $N stoi ko³o ciebie.", ch, NULL, victim, TO_CHAR ); act("$n klêka i zaczyna z uwag± przygl±daæ siê ¶ladom.",ch,NULL,NULL,TO_ROOM); return; } if ( skill < number_range( 20, 40 ) ) { act("$n klêka i zaczyna z uwag± przygl±daæ siê ¶ladom.",ch,NULL,NULL,TO_ROOM); act("Klêkasz, przygl±dasz siê ¶ladom, ale nie znajdujesz ¿adnego tropu.",ch,NULL,NULL,TO_CHAR); WAIT_STATE( ch, skill_table[gsn_track].beats ); check_improve(ch, NULL, gsn_track, FALSE, 12); return; } if ( IS_AFFECTED ( victim, AFF_SPIRIT_WALK ) ) { act("$n klêka i zaczyna z uwag± przygl±daæ siê ¶ladom.",ch,NULL,NULL,TO_ROOM); act("Klêkasz, przygl±dasz siê ¶ladom, ale nie znajdujesz ¿adnego tropu.",ch,NULL,NULL,TO_CHAR); WAIT_STATE( ch, skill_table[gsn_track].beats ); return; } else { act("$n klêka i zaczyna z uwag± przygl±daæ siê ¶ladom.",ch,NULL,NULL,TO_ROOM); act("Klêkasz i przygladasz siê ¶ladom, chyba widzisz jaki¶ trop.",ch,NULL,NULL,TO_CHAR); } WAIT_STATE( ch, skill_table[gsn_track].beats ); direction = find_path( ch->in_room->vnum, victim->in_room->vnum, ch, -40000, fArea ); if ( direction == -1 ) { act( "Niestety, nie mo¿esz nic wiêcej odczytaæ ze ¶ladów.", ch, NULL, victim, TO_CHAR ); return; } if ( direction < 0 || direction >= MAX_DIR ) { send_to_char( "Hmm... co¶ jest nie tak.\n\r", ch ); return; } /* * Give a random direction if the player misses the die roll. */ if ( number_percent() > skill ) { do { direction = number_door( ); } while ( !( ch->in_room->exit[direction] ) || !( ch->in_room->exit[direction]->u1.to_room ) ); } check_improve(ch, NULL, gsn_track, TRUE, 9); /* * Display the results of the search. */ sprintf( buf, "Znajdujesz ¶lady $Z prowadz±ce na %s.", direction == 4 ? "górê" : dir_name[direction] ); act( buf, ch, NULL, victim, TO_CHAR ); return; }
bool spec_patrolman( CHAR_DATA *ch ) { CHAR_DATA * vch, *victim = NULL; OBJ_DATA *obj; char *message; int count = 0; if ( !IS_AWAKE( ch ) || IS_AFFECTED( ch, AFF_CALM ) || ch->in_room == NULL || IS_AFFECTED( ch, AFF_CHARM ) || ch->fighting != NULL || !can_move( ch ) ) return FALSE; /* look for a fight in the room */ for ( vch = ch->in_room->people; vch != NULL; vch = vch->next_in_room ) { if ( vch == ch ) continue; /*No to tak - bije sie gracz vs gracz - nic nie robi - bije sie mob vs mob - nic nie robi - bije sie gracz vs mob z masterem albo charmem - nic nie robi - bije sie gracz vs mob z aggressivem - bije moba - bije sie gracz vs mob samotny - bije gracza*/ if ( vch->fighting != NULL ) /* break it up! */ { if ( number_range( 0, count ) == 0 ) { if ( ( IS_NPC(vch) && !IS_NPC(vch->fighting ) ) || ( !IS_NPC(vch) && IS_NPC(vch->fighting ) ) ) { if ( IS_NPC(vch) ) { if( EXT_IS_SET( vch->act, ACT_AGGRESSIVE ) && vch->master == NULL && !IS_AFFECTED(vch, AFF_CHARM ) ) victim = vch; else if( vch->master == NULL && !IS_AFFECTED(vch, AFF_CHARM)) victim = vch->fighting; else victim = NULL; } else if ( IS_NPC(vch->fighting) ) { if( EXT_IS_SET( vch->fighting->act, ACT_AGGRESSIVE ) && vch->fighting->master == NULL && !IS_AFFECTED(vch->fighting,AFF_CHARM) ) victim = vch->fighting; if( vch->fighting->master == NULL && !IS_AFFECTED(vch->fighting,AFF_CHARM)) victim = vch; else victim = NULL; } } else victim = NULL; } count++; } else if ( EXT_IS_SET( vch->act, ACT_AGGRESSIVE ) && vch->master == NULL && !IS_AFFECTED(vch, AFF_CHARM ) ) { victim = vch; } } if ( victim == NULL || IS_NPC( victim )) return FALSE; if ( ( ( obj = get_eq_char( ch, WEAR_NECK_1 ) ) != NULL && obj->pIndexData->vnum == OBJ_VNUM_WHISTLE ) || ( ( obj = get_eq_char( ch, WEAR_NECK_2 ) ) != NULL && obj->pIndexData->vnum == OBJ_VNUM_WHISTLE ) ) { act( "Nabierasz g³êboko powietrza w p³uca i mocno dmuchasz w $g.", ch, obj, NULL, TO_CHAR ); act( "$n mocno dmucha w $g, ***PFFFIIIIIIIIIIIIT***", ch, obj, NULL, TO_ROOM ); for ( vch = char_list; vch != NULL; vch = vch->next ) { if ( vch->in_room == NULL ) continue; if ( vch->in_room != ch->in_room && vch->in_room->area == ch->in_room->area ) send_to_char( "S³yszysz dono¶ny, ¶wiszcz±cy d¼wiêk.\n\r", vch ); } } switch ( number_range( 0, 6 ) ) { default: message = NULL; break; case 0: message = "$n wrzeszczy 'Co to za bójki?! Przerwaæ natychymiast tê walkê!'"; break; case 1: message = "$n mówi 'To okropne ¿yæ w czasach, kiedy króluje chaos i przemoc...'"; break; case 2: message = "$n mamrocze 'Cholerne dzieciaki, wszystko za³atwia³yby przemoc±!'"; break; case 3: message = "$n wrzeszczy 'Natychmiast przestañ! Natychmiast przestaæ!!' i atakuje."; break; case 4: message = "$n prostuje siê, chrz±ka i idzie do pracy."; break; case 5: message = "$n wzdycha z rezygnacj± i próbuje przerwaæ walkê."; break; case 6: message = "$n mówi 'Uspokójcie siê! Banda ³obuzów!'"; break; } if ( message != NULL ) act( message, ch, NULL, NULL, TO_ALL ); multi_hit( ch, victim, TYPE_UNDEFINED ); return TRUE; }
int scan_room( CHAR_DATA *ch, const ROOM_INDEX_DATA *room, char *buf, int distance ) { CHAR_DATA *target = room->people; int number_found = 0; AFFECT_DATA *dazzling; if ( EXT_IS_SET( room->room_flags, ROOM_MAGICDARK ) ) { return -1; } while ( target ) { if ( !IS_NPC( target ) && target->invis_level > get_trust( ch ) ) { target = target->next_in_room; continue; } if ( target == ch && ( IS_NPC( ch ) || ( !IS_NPC( ch ) && !ch->pcdata->mind_in ) ) ) { target = target->next_in_room; continue; } if ( can_see( ch, target ) ) { strcat ( buf, " " ); if ( ( IS_NPC(target) || target->ss_data ) && !is_affected(target, gsn_fetch) ) { strcat ( buf, "{y"); strcat ( buf, capitalize(target->short_descr) ); strcat ( buf, "{x{c"); } else { strcat ( buf, "{Y"); strcat ( buf, capitalize(target->name) ); strcat ( buf, "{x{c"); } if ( IS_AFFECTED( target, AFF_INVISIBLE ) ) strcat( buf, " (niewidzialny)" ); else if( is_affected( ch, gsn_dazzling_flash) && affect_find( ch->affected, gsn_dazzling_flash)->level == 0 && is_affected( target, gsn_dazzling_flash) && !IS_AFFECTED( ch, AFF_PERFECT_SENSES) && ( !IS_AFFECTED(ch,AFF_DETECT_INVIS) || IS_AFFECTED(target,AFF_NONDETECTION)) ) { for( dazzling = target->affected ; dazzling; dazzling = dazzling->next ) { if( dazzling->level == 1 && affect_find( ch->affected, gsn_dazzling_flash)->modifier == dazzling->modifier ) strcat( buf, " (niewidzialny)" ); } } if ( IS_AFFECTED( target, AFF_HIDE ) ) { strcat( buf, " (ukryty)" ); } if (( EXT_IS_SET( target->act, ACT_AGGRESSIVE )) && IS_AFFECTED( ch, AFF_DETECT_AGGRESSIVE ) ) { if( ch->level + 10 > target->level ) { strcat( buf, " {R(agresywny){x" ); } else if ( dice(1,3) == 1 ) { strcat( buf, " {R(agresywny){x" ); } } else if ( IS_AFFECTED( ch, AFF_DETECT_AGGRESSIVE ) && ( ch->level + 10 < target->level ) ) { if ( dice(1,3) == 1 ) { strcat( buf, " {R(agresywny){x" ); } } if (( is_undead(target) ) && IS_AFFECTED( ch, AFF_DETECT_UNDEAD ) ) { if( ch->level + 10 > target->level ) { strcat( buf, " {D(nieumar³y){x" ); } else if ( dice(1,3) == 1 ) { strcat( buf, " {D(nieumar³y){x" ); } } else if ( IS_AFFECTED( ch, AFF_DETECT_UNDEAD ) && ( ch->level + 10 < target->level ) ) { if ( dice(1,3) == 1 ) { strcat( buf, " {D(nieumar³y){x" ); } } switch ( distance ) { case 0: strcat ( buf, " jest tutaj." ); break; case 1: strcat ( buf, " zaraz obok." ); break; case 2: strcat ( buf, " niedaleko." ); break; case 3: strcat ( buf, " daleko." ); break; case 4: strcat ( buf, " ca³kiem daleko." ); break; case 5: strcat ( buf, " bardzo daleko." ); break; case 6: strcat ( buf, " niesamowicie daleko." ); break; default: strcat ( buf, " dziwnie daleko." ); break; } strcat ( buf, "\n\r" ); number_found++; } target = target->next_in_room; } return number_found; }
void do_scan( CHAR_DATA *ch, char *argument ) { EXIT_DATA *pexit; ROOM_INDEX_DATA *room; ROOM_INDEX_DATA *in_room; DESCRIPTOR_DATA * d; extern char *const dir_name[]; char buf[ MAX_STRING_LENGTH ]; char exitname[ MAX_STRING_LENGTH ]; int lookdoor, door, iter; int distance, max_dist; int mob_count, mob_count_new; bool darkness = FALSE; const char *dir_long_name[] = { "pó³noc", "wschód", "po³udnie", "zachód", "góra", "dó³" }; lookdoor = -1; door = -1; if ( !IS_NPC( ch ) && ch->pcdata->mind_in ) { in_room = ch->pcdata->mind_in; } else { if ( !check_blind( ch ) ) { return ; } in_room = ch->in_room; } if ( argument[0] != '\0' ) { if ( IS_AFFECTED( ch, AFF_MAZE ) ) { send_to_char("Nie bardzo wiesz w która stronê popatrzeæ.\n\r", ch); return; } //wieza obserwacyjna if( !str_prefix( argument, "around" ) ) { if ( !EXT_IS_SET( ch->in_room->room_flags, ROOM_WATCH_TOWER ) ) { send_to_char( "Musisz byæ na szczycie wie¿y obserwacyjnej.\n\r", ch ); return; } if ( ch->position != POS_STANDING ) { send_to_char( "Najpierw wstañ.\n\r", ch ); return; } send_to_char( "Ze szczytu wie¿y ogl±dasz uwa¿nie ca³± okolicê.\n\r", ch ); act( "Stoj±c na szczycie wie¿y $n uwa¿nie omiata wzrokiem ca³± okolicê.", ch, NULL, NULL, TO_ROOM ); for ( d = descriptor_list; d != NULL; d = d->next ) { if ( !d->character || d->connected < 0 ) { continue; } if( d->connected != CON_PLAYING || d->character == ch || d->character->in_room == NULL ) { continue; } if ( !SAME_AREA( d->character->in_room->area, ch->in_room->area ) || !SAME_AREA_PART( d->character, ch ) ) { continue; } if ( !can_see( ch, d->character ) ) { continue; } if ( EXT_IS_SET( d->character->in_room->room_flags, ROOM_INDOORS ) || IS_SET( sector_table[ d->character->in_room->sector_type ].flag, SECT_NOWEATHER ) ) { continue; } if ( ch->in_room == d->character->in_room ) { continue; } print_char( ch, "{x%s - Widzisz tam {C%s{x.\n\r", d->character->in_room->name, d->character->name4 ); } return; } door = get_door( ch, argument ); if ( door >= 0 && check_vname( ch, door, FALSE ) ) { send_to_char("W ktorym kierunku chcesz siê rozejrzeæ?\n\r", ch); return; } if ( door < 0 ) { door = -1; for ( iter = 0; iter <= 5; iter++ ) { if ( ( pexit = in_room->exit[iter] ) != NULL && !str_prefix( argument, pexit->vName ) && !( (IS_SET(pexit->exit_info, EX_SECRET) || IS_SET(pexit->exit_info, EX_HIDDEN))&& !IS_AFFECTED(ch,AFF_DETECT_HIDDEN) ) ) { door = iter; break; } } } if ( door < 0 || in_room->exit[door] == NULL ) { send_to_char("W ktorym kierunku chcesz siê rozejrzeæ?\n\r", ch); return; } lookdoor = door; door = -1; } if ( lookdoor < 0 ) { if ( IS_NPC( ch ) || !ch->pcdata->mind_in ) { act("$n rozgl±da siê dooko³a.", ch, NULL, NULL, TO_ROOM); } send_to_char("Rozgl±daj±c siê dooko³a widzisz:\n\r", ch); sprintf( buf, "{CTutaj{x\n\r" ); mob_count = 0; mob_count_new = scan_room (ch, in_room, buf, 0); if ( mob_count_new < 0 ) { send_to_char( "{CTutaj{x{c - nieprzenikniona ciemno¶æ.{x\n\r", ch ); darkness = TRUE; } else { mob_count += mob_count_new; } strcat(buf, "{x"); if ( mob_count > 0 ) { send_to_char ( buf, ch ); } else { if ( mob_count == 0 && !darkness) { send_to_char( "{CTutaj{x{c - nikogo nie ma.{x\n\r", ch ); } } } darkness = FALSE; if ( !IS_NPC( ch ) && !EXT_IS_SET( ch->act, PLR_HOLYLIGHT ) ) { if ( room_is_dark(ch, in_room) && !IS_AFFECTED(ch, AFF_INFRARED) ) { send_to_char("Jest tutaj zbyt ciemno aby powiedzieæ co¶ o okolicy.\n\r", ch); return; } } for ( door = 0; door < MAX_DIR; door++ ) { room = in_room; if ( lookdoor >= 0 && door != lookdoor ) { continue; } if ( ( pexit = room->exit[door] ) == NULL ) { continue; } if ( lookdoor >= 0 || !( ( IS_SET(pexit->exit_info, EX_SECRET) && !IS_SET(pexit->exit_info, EX_HIDDEN) ) || ( IS_SET(pexit->exit_info, EX_HIDDEN) && !IS_AFFECTED(ch,AFF_DETECT_HIDDEN) ) ) ) { if ( pexit ) { if ( pexit->vName && pexit->vName[0] != '\0' ) { sprintf( exitname, "%s", pexit->vName ); } else { if ( IS_AFFECTED( ch, AFF_MAZE ) ) { sprintf ( exitname, "%s", capitalize( dir_long_name[ number_range( 0, 5 ) ] ) ); } else { sprintf( exitname, "%s", capitalize( dir_name[door] ) ); } } } else { exitname[0] = '\0'; } if ( !room_is_dark( ch, in_room ) ) { if ( IS_SET( pexit->exit_info, EX_HIDDEN ) ) { sprintf( buf, "{C%s{x{c - kto¶ stara³ siê ukryæ to przej¶cie.{x\n\r", exitname ); send_to_char( buf, ch ); continue; } else if ( IS_SET( pexit->exit_info, EX_CLOSED ) && !IS_AFFECTED(ch, AFF_PIERCING_SIGHT) ) { if ( pexit->biernik != NULL && pexit->biernik[ 0 ] != '\0' && pexit->biernik[ 0 ] != ' ' ) { if( !pexit->liczba_mnoga ) { sprintf( buf, "{C%s{x{c - nic nie widzisz przez zamkniêt± %s.{x\n\r", exitname, pexit->biernik ); } else { sprintf( buf, "{C%s{x{c - nic nie widzisz przez zamkniête %s.{x\n\r", exitname, pexit->biernik ); } send_to_char( buf, ch ); } else { sprintf( buf, "{C%s{x{c - nic nie widzisz przez zamkniête drzwi.{x\n\r", exitname ); send_to_char( buf, ch ); } continue; } else if ( IS_SET( pexit->exit_info, EX_WALL_OF_MIST ) && !IS_AFFECTED(ch, AFF_PIERCING_SIGHT) ) { sprintf( buf, "{C%s{x{c - ¶ciana mg³y zas³ania ci widoczno¶æ.{x\n\r", exitname ); send_to_char( buf, ch ); continue; } } buf[0] = '\0'; mob_count = 0; max_dist = (lookdoor < 0)? 2:4; /** * imorovmen range for elfs * http://forum.mud.pl/viewtopic.php?t=5457 */ if(!str_cmp( race_table[ GET_RACE(ch) ].name, "elf" )) { max_dist += number_range(0, 2); } for ( distance = 1 ; distance < max_dist; distance++ ) { pexit = room->exit[door]; if ( !pexit || !pexit->u1.to_room || ( IS_SET( pexit->exit_info, EX_CLOSED ) && !IS_AFFECTED(ch, AFF_PIERCING_SIGHT) ) || ( IS_SET( pexit->exit_info, EX_WALL_OF_MIST ) && !IS_AFFECTED(ch, AFF_PIERCING_SIGHT) )) { break; } darkness = FALSE; mob_count_new = scan_room ( ch, pexit->u1.to_room, buf, distance); if ( mob_count_new < 0) { printf_to_char( ch, "{C%s{x{c - panuje tam nieprzenikniona ciemno¶æ.{x\n\r", exitname ); darkness = TRUE; } else { mob_count += mob_count_new; } room = pexit->u1.to_room; } strcat(buf, "{x"); if ( mob_count > 0 && !darkness ) { if ( room_is_dark( ch, in_room ) ) { printf_to_char( ch, "{C%s{x{c - widaæ tam chyba kogo¶.{x\n\r", exitname ); } else { print_char( ch, "{C%s{x\n\r", exitname ); send_to_char ( buf, ch ); } } else if ( !room_is_dark( ch, in_room ) && !darkness ) { if ( mob_count == 0 && in_room->exit[door]) { printf_to_char( ch, "{C%s{x{c - nikogo tam nie widaæ.{x\n\r", exitname ); } } darkness = FALSE; } } if ( room_is_dark( ch, in_room ) ) { send_to_char("\n\rJest tutaj zbyt ciemno aby powiedzieæ co¶ dok³adniej o okolicy.\n\r", ch); return; } return; }