struct char_data *get_random_pc(struct char_data *ch, struct area_data *area) { struct char_data *vch = NULL; struct char_data *wch; int count = 0; for (wch = char_list; wch != NULL; wch = wch->next) { if (!IS_NPC(wch) && can_see(ch, wch) && wch->in_room != NULL && !IS_SET(wch->in_room->room_flags, ROOM_NORANDOM) && (area == NULL || wch->in_room->area == area) && wch != ch && get_trust(wch) < get_trust(ch) && number_range(0, count) == 0) { vch = wch; count++; } } return vch; }
void check_mount( char_data* ch ) { if( ch->rider != NULL ) ch = ch->rider; if( ch->mount == NULL ) return; if( number_range( -10, 20 ) < ch->shdata->skill[SKILL_RIDING] +ch->shdata->skill[SKILL_MOUNTED_FIGHTING] ) return; send( ch, "You are thrown from your mount.\r\n" ); fsend_seen( ch, "%s is thrown from %s which %s was riding.", ch, ch->mount, ch->He_She( ) ); ch->mount->rider = NULL; ch->mount = NULL; ch->position = POS_RESTING; return; }
void shop_update( void ) { mob_data* keeper; obj_data* obj; for( int i = 0; i < mob_list; i++ ) { keeper = mob_list[i]; if( keeper->pShop == NULL || keeper->reset == NULL || player_in_room( keeper->in_room ) ) continue; reset_shop( keeper ); for( int j = keeper->contents-1; j >= 0; j-- ) { obj = (obj_data*) keeper->contents[j]; for( int k = obj->number; k > 0; k-- ) if( number_range( 0, 10 ) == 0 && --obj->number == 0 ) obj->Extract( ); } } }
bool spec_thief( CHAR_DATA *ch ) { CHAR_DATA * victim; CHAR_DATA *v_next; if ( ch->position != POS_STANDING ) { return FALSE; } for ( victim = ch->in_room->people; victim != NULL; victim = v_next ) { v_next = victim->next_in_room; if ( IS_NPC( victim ) || is_safe( ch, victim, TRUE ) || victim->level >= LEVEL_IMMORTAL || number_bits( 5 ) != 0 || !can_see( ch, victim ) || money_count_copper( victim ) == 0 ) { continue; } if ( IS_AWAKE( victim ) && number_range( 0, ch->level ) == 0 ) { act( "Odkrywasz rêke $z w swojej kieszeni!", ch, NULL, victim, TO_VICT ); act( "$N odkrywa rêke $z w swojej kieszeni!", ch, NULL, victim, TO_NOTVICT ); return TRUE; } else { money_steal( ch, victim ); return TRUE; } } return FALSE; }
char * get_master_defend(sh_int masterform, int index) { int formmultiplier = 0; int i = 0; char buf[256]; if (index < 0 || index > 11) { sprintf(buf, "GetMasterAttack: index invalid: %d{x",index); wiznet(buf,NULL,NULL,WIZ_SECURE,0,0); index = number_range(0,11); } for (i = 0; i < MASTERFORMS; i++) { if (masterformslookup_table[i].gsn == masterform) { formmultiplier = masterformslookup_table[i].formindex; break; } } return masterforms_table[(formmultiplier * MOVES_PER_FORM) + index].defensestring; }
/* * Drain XP, MANA, HP. * Caster gains HP. */ void Character::spell_energy_drain (int sn, int lvl, void *vo) { Character *victim = (Character *) vo; int dam; if (victim->saves_spell (lvl)) return; alignment = std::max (-1000, alignment - 200); if (victim->level <= 2) { dam = hit + 1; } else { victim->gain_exp(0 - number_range (lvl / 2, 3 * lvl / 2)); victim->mana /= 2; victim->move /= 2; dam = dice (1, lvl); hit += dam; } damage (this, victim, dam, sn); return; }
void area_update( void ) { area_data* area; room_data* room; struct timeval start; bool save = TRUE; gettimeofday( &start, NULL ); for( int i = 0; i < max_clan; i++ ) if( clan_list[i]->modified ) save_clans( clan_list[i] ); for( area = area_list; area != NULL; area = area->next ) { if( ++area->age < 15 && ( area->nplayer != 0 || area->age < 5 ) ) continue; for( room = area->room_first; room != NULL; room = room->next ) if( !player_in_room( room ) ) { reset_room( room ); save_room_items( room ); } area->age = number_range( 0, 3 ); if( save && area->modified ) { save_area( area ); save = FALSE; } } shop_update( ); pulse_time[ TIME_RESET ] = stop_clock( start ); return; }
void Character::spell_frost_breath (int sn, int lvl, void *vo) { Character *victim = (Character *) vo; if (number_percent () < 2 * lvl && !victim->saves_spell (lvl)) { Object *obj_lose; ObjIter o, onext; for (o = victim->carrying.begin(); o != victim->carrying.end(); o = onext) { obj_lose = *o; onext = ++o; const char *msg; if (number_percent() <= 75) continue; switch (obj_lose->item_type) { default: continue; case ITEM_CONTAINER: case ITEM_DRINK_CON: case ITEM_POTION: msg = "$p freezes and shatters!"; break; } victim->act (msg, obj_lose, NULL, TO_CHAR); obj_lose->extract_obj (); } } int hpch = std::max (10, hit); int dam = number_range (hpch / 16 + 1, hpch / 8); if (victim->saves_spell (lvl)) dam /= 2; damage (this, victim, dam, sn); return; }
char *randcolor( char *string ) { char buf[MAX_STRING_LENGTH]; char *c; int i; if ( !string ) return 0; strip_color(string); for ( c = string, i = 0; *c; c++ ) { if ( *c == ' ' || *c == '\n' || *c == '\r' ) { buf[i++] = *c; continue; } if ( number_range(1,4) == 1 || c == string ) { buf[i++] = '#'; buf[i++] = 's'; } if ( *c == '#' ) { if ( *(c+1) == '#' ) { buf[i++] = *c; c++; } else buf[i++] = '#'; } buf[i++] = *c; } buf[i] = '\0'; strcpy(string,buf); return string; }
Direction::Value Weave::PopNextDirection(const ROOM_INDEX_DATA & room, std::vector<Direction::Value> & directions) { // Sanity check if (directions.empty()) return Direction::Max; // Loop for skipping for (unsigned int i(0); i < 10; ++i) { // Choose a random direction and check it for skipping unsigned int index(number_range(0, directions.size() - 1)); Direction::Value result(directions[index]); if (number_percent() < static_cast<int>(Fount::SkipChance(Direction::Adjacent(room, result)->fount_frequency))) continue; // Direction chosen, pop it from the set directions[index] = directions[directions.size() - 1]; directions.pop_back(); return result; } // No valid result found return Direction::Max; }
void crusade_reward( CHAR_DATA *ch ) { char buf[MSL]; int reward = 0; ch->pcdata->records->crusade++; reward = quest_object->value[0]; snprintf( buf, MSL, "You receive %d quest points!\r\n", reward ); send_to_char( buf, ch ); ch->pcdata->quest_points += reward; ch->pcdata->records->qp_tot += reward; if ( ch->pcdata->quest_points > ch->pcdata->records->qp ) { send_to_char("@@yYou've broken your quest point record!@@N\r\n", ch); ch->pcdata->records->qp = ch->pcdata->quest_points; } reward = quest_object->value[1]; snprintf( buf, MSL, "You receive %d practices!\r\n", reward ); send_to_char( buf, ch ); ch->pcdata->practice += reward; reward = (exp_mob_base(quest_mob->level) * sysdata.killperlev); reward = number_range(static_cast<int>(reward * 0.02), static_cast<int>(reward * 0.04)); snprintf( buf, MSL, "You receive %d experience points!\r\n", reward ); send_to_char( buf, ch ); ch->exp += reward; reward = quest_object->value[2]; snprintf( buf, MSL, "You receive %s!\r\n", cost_to_money( reward ) ); send_to_char( buf, ch ); join_money( round_money( reward, TRUE ), ch->money ); return; }
int generate_itemlevel( AREA_DATA * pArea, OBJ_INDEX_DATA * pObjIndex ) { int olevel; int min = UMAX( pArea->low_soft_range, 1 ); int max = UMIN( pArea->hi_soft_range, min + 15 ); if ( pObjIndex->level > 0 ) olevel = UMIN( pObjIndex->level, MAX_LEVEL ); else switch ( pObjIndex->item_type ) { default: olevel = 0; break; case ITEM_PILL: olevel = number_range( min, max ); break; case ITEM_POTION: olevel = number_range( min, max ); break; case ITEM_SCROLL: olevel = pObjIndex->value[0]; break; case ITEM_WAND: olevel = number_range( min + 4, max + 1 ); break; case ITEM_STAFF: olevel = number_range( min + 9, max + 5 ); break; case ITEM_ARMOR: olevel = number_range( min + 4, max + 1 ); break; case ITEM_WEAPON: olevel = number_range( min + 4, max + 1 ); break; } return olevel; }
void ask_quest_question( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; buf[0] = '\0'; if ( !quest || IS_NPC( ch ) ) return; if ( ( !str_cmp( argument, "who is the thief?" ) ) || ( !str_cmp( argument, "who was the thief?" ) ) || ( !str_cmp( argument, "what mob?" ) ) || ( !str_cmp( argument, "who stole the item?" ) ) ) { if ( quest_mob ) { if ( quest_timer < 7 ) { snprintf( buf, MSL, "@@eI don't even know who stole it yet!@@N" ); } else if ( quest_object && quest_target ) { snprintf( buf, MSL, "@@NIt was %s @@N who stole my %s@@N.", quest_target->get_name(), quest_object->short_descr ); } } else if ( quest_object ) { snprintf( buf, MSL, "@@NDon't worry about who stole my %s@@N, he has recieved his just reward!", quest_object->short_descr ); } if ( quest_mob != NULL ) do_crusade( quest_mob, buf ); return; } if ( !str_cmp( argument, "what item?" ) ) { if ( quest_mob && quest_object ) { snprintf( buf, MSL, "@@NMy %s @@Nwas stolen from me.", quest_object->short_descr ); do_crusade( quest_mob, buf ); return; } } if ( !str_cmp( argument, "where are you?" ) ) if ( quest_mob ) { snprintf( buf, MSL, "@@NYou can find me in %s@@N, please hurry!!", quest_mob->in_room->area->name ); do_crusade( quest_mob, buf ); return; } if ( !str_cmp( argument, "where is the thief?" ) ) { if ( quest_mob ) { if ( ( quest_target ) && ( quest_timer > 7 ) ) { if ( quest_timer < 10 ) { snprintf( buf, MSL, "@@NI don't really know where %s@@N is, let me try and find out.", quest_target->get_name() ); } else if ( quest_target ) { snprintf( buf, MSL, "@@NI'm not really sure, but I THINK %s@@N is in %s@@N", quest_target->get_name(), quest_target->in_room->area->name ); } } else if ( ( quest_target ) && ( quest_timer <= 7 ) ) { snprintf( buf, MSL, "@@eI don't even know who stole it yet!@@N" ); } else { snprintf( buf, MSL, "@@NDon't worry about where the thief who stole my %s@@N is, he has recieved his just reward", quest_object->short_descr ); } do_crusade( quest_mob, buf ); } } if ( !str_cmp( argument, "what level are you?" ) ) if ( quest_mob ) { int lvl = number_range( (quest_mob->level - 3), (quest_mob->level + 3) ); snprintf( buf, MSL, "@@NI am somewhere around the level of %d!", lvl > 0 ? lvl : 1 ); do_crusade( quest_mob, buf ); } return; }
std::string Drakes::BuildDescription(CHAR_DATA & ch, const char * stoneName, Age age) { std::ostringstream result; // Devise a random seed based on caster and stone type unsigned int seed(ch.id); for (size_t i(0); stoneName[i] != '\0'; ++i) seed += stoneName[i]; // Determine the random words const char * strata("banded with"); srand(seed); switch (number_range(0, 4)) { case 0: strata = "banded with"; break; case 1: strata = "lined in"; break; case 2: strata = "shot through with streaks of"; break; case 3: strata = "speckled with"; break; case 4: strata = "marked with bands of"; break; } srand(time(0)); switch (age) { case Hatchling: result << "A drake hatchling is here, " << strata << ' ' << stoneName << ". "; result << "Pale scrapings of the stone curl all over its mineral flesh, lending it an almost downy appearance. "; result << "With its tiny fangs and complete absence of wings, the drake seems to be quite young."; break; case Youngling: result << "A drake youngling is here, " << strata << ' ' << stoneName << ". "; result << "The early stubs of its wings have begun to develop, tipped in small claws. "; result << "The " << stoneName << " in its flesh is starting to show early signs of deepening in hue."; break; case Fledgling: result << "A drake fledgling is here, " << strata << ' ' << stoneName << ". "; result << "Though still clearly a juvenile, the plates of stone which make up its flesh have "; result << "taken on nearly the deeper hue associated with adults of its kind. "; result << "Claw-tipped wings sprout from its sides, almost fully-developed."; break; case Wingborne: result << "A full-grown drake is here, " << strata << ' ' << stoneName << ". "; result << "Sharp fangs protrude from its maw, complementing the curved claws extending from its wings. "; result << "Stony scale plates armor its body, their weight balanced by a ridged tail."; break; case Greater: result << "A greater drake is here, " << strata << ' ' << stoneName << ". "; result << "Though similar in appearance to the rest of its kind, this beast is unusually large, bearing "; result << "pronounced fangs and powerful claw-tipped wings."; break; case Elder: result << "An elder drake is here, " << strata << ' ' << stoneName << ". "; result << "Thick, tough plates of stone armor adorn its body, protruding out in spikes at sharp angles. "; result << "Its eyes are dark and focused, taking in the world about it with their steely gaze."; break; case Ancient: result << "An ancient drake is here, " << strata << ' ' << stoneName << ". "; result << "The thick plates of its stony hide have fused together over time and sprouted sharp spikes, which "; result << "jut out at a odd angles from its body and tail. With powerful fangs and long claws on the ends of "; result << "mighty wings, this beast seems formidable indeed."; break; } // Format the string before returning // All the memory manipulation issues are to support the awkward API of format_string char * descIn(str_dup(result.str().c_str())); char * resultDesc(format_string(descIn)); std::string desc(resultDesc); free_string(resultDesc); return desc; }
int main(int argc, char* argv[]) { int randnum = 0; char* nvram = NULL, *value = NULL; char* delimiter = NULL, *tmp, *del; int position=0, c, i = 0, func = 0, val; char help_msg[2048] = "Usage: xobjconf [-s | -x <nvram variable>] {[-a | -m <values> -p <position>] | [ -n <to get # of digits>] | [-i <position>] | [-v <value>] | [-e <value>] | [ -r <position>] | [ -o <new delimiter>]} [-d delimiter]\n\n"; init_gen( ); strcat(help_msg, "xobjconf command summary\n"); strcat(help_msg, "\txobjconf is a function to insert/delete/modify/view nvram variable by delimiter(s).\n"); strcat(help_msg, "\t<nvram variable>:input a nvram variable.\n"); strcat(help_msg, "\tdelimiter:a delimiter which is a seperator.\n"); strcat(help_msg, "\t-s : to specify a nvram variable.\n"); strcat(help_msg, "\t-x : to get total counts of token by specified delimiter.\n"); strcat(help_msg, "\t-d : to specify a delimiter.\n"); strcat(help_msg, "\t-a:insert a value to the nvram variable by delimiter.\n"); strcat(help_msg, "\t-r : remove a value from a nvram variable by specfied position.\n"); strcat(help_msg, "\t-v : remove a value from a nvram variable by specfied value.\n"); strcat(help_msg, "\t-e : to check a value in a nvram variable is exist or not.\n"); strcat(help_msg, "\t-o : to replace delimiters in a token list by new delimiters.\n"); strcat(help_msg, "\t-n : to get digits in a nvram variable by speficied counts.\n"); strcat(help_msg, "\t-m : to change a value by spcified position from a nvram variable.\n"); strcat(help_msg, "\t-i : to return the value which is at the specified position from a nvram variable by delimiter.\n\n"); if(argc <= 1 || ((isgraph(*argv[1]) || ispunct(*argv[1])) && *argv[1]!='-')){ fprintf(stderr, "%s", help_msg); exit(0); } while ((c = getopt(argc, argv, "a:d:e:i:m:n:o:p:r:v:s:x:h")) != -1){ switch (c) { case 'a': func = 1; value = optarg; break; case 'r': func = 2; position = atoi(optarg); break; case 'm': func = 3; value = optarg; break; case 's': nvram = optarg; break; case 'i': func = 4; position = atoi(optarg); break; case 'v': func = 5; value = optarg; position = 1; break; case 'x': func = 6; nvram = optarg; break; case 'e': func = 7; value = optarg; position = 1; break; case 'n': func = 8; val = atoi(optarg); position = 1; break; case 'o': func = 9; value = optarg; break; case 'p': position = atoi(optarg); break; case 'd': delimiter = optarg; break; case 'h': fprintf(stderr, "%s", help_msg); exit(0); break; default: fprintf(stderr, "%s", help_msg); exit(0); break; } } if(nvram_get(nvram) == NULL && delimiter != NULL && nvram != NULL){ if(func == 1 && value != NULL){ nvram_set(nvram, ""); //printf("Inserting '%s' at position 1 ...\n", value); //tmp = StrDup(nvram_get(nvram)); //value = insert_str(tmp, value, delimiter, 1); //tmp = StrDup(insert_str(nvram_get(nvram), value, delimiter, 1)); //nvram_set(nvram, value); nvram_set(nvram, StrDup(insert_str(nvram_get(nvram), value, delimiter, 1))); printf("%s\n", nvram_get(nvram)); } else{ fprintf(stderr, "%s", help_msg); exit(0); } } else if(delimiter != NULL && position > 0 && nvram != NULL){ if(func == 1 && value != NULL){ //printf("Inserting %s at position %d ...\n", value, position); //tmp = StrDup(nvram_get(nvram)); //value = insert_str(tmp, value, delimiter, 1); //nvram_set(nvram, value); nvram_set(nvram, insert_str(nvram_get(nvram), value, delimiter, position)); printf("%s\n", nvram_get(nvram)); } else if(func == 2){ //printf("Deleting position %d of %s ... \n", position, nvram); //tmp = StrDup(nvram_get(nvram)); //value = delete_str(nvram_get(nvram), delimiter, position); //nvram_set(nvram, value); nvram_set(nvram, delete_str(nvram_get(nvram), delimiter, position)); printf("%s\n", nvram_get(nvram)); } else if(func == 3 && value != NULL){ //printf("Modifying position %d by %s ... \n", position, value); //tmp = StrDup(nvram_get(nvram)); //value = modify_str(nvram_get(nvram), value, delimiter, position); //nvram_set(nvram, value); nvram_set(nvram, StrDup(modify_str(nvram_get(nvram), value, delimiter, position))); printf("%s\n", nvram_get(nvram)); } else if(func == 4){ //printf("\nReading the values from nvram variable %s ... \n", nvram); tmp = StrDup(nvram_get(nvram)); printf("%s\n", index_str(tmp, delimiter, position)); } else if(func == 5){ /*c = matchStrPosAt(delimiter, StrDup(nvram_get(nvram)), -1) + 1; for (i = 1; i <= c ; i++) { tmp = StrDup(nvram_get(nvram)); printf("tmp = %s\n", tmp); del = StrDup(index_str(tmp, delimiter, i)); printf("%s[%d] = %s\n", nvram, i, del); if(!strcmp(del, value)){ printf("value %s is matched in %s\n", value, nvram_get(nvram)); nvram_set(nvram, delete_str(nvram_get(nvram), delimiter, i)); printf("delete '%s' which is spcified at position %d\n", value, i); break; } }*/ nvram_set(nvram, delete_val(nvram_get(nvram), value, delimiter)); printf("%s\n", nvram_get(nvram)); } else if(func == 7){ tmp = StrDup(nvram_get(nvram)); if(val_exist(tmp, value, delimiter)) printf("%s is exist\n", value); else printf("%s is not exist\n", value); } else if(func == 8){ tmp = StrDup(nvram_get(nvram)); printf("%s\n", str2digits(tmp, delimiter, val)); } else{ fprintf(stderr, "%s", help_msg); exit(0); } } else if(func == 6 && delimiter != NULL && nvram != NULL){ position = matchStrPosAt(delimiter, nvram_get(nvram), -1) + 1; printf("%d\n", position); /*printf("Number of token counts is %d\n", position); for(i = 1; i <= position; i++){ tmp = StrDup(nvram_get(nvram)); printf("\t%s\n", index_str(tmp, delimiter, i)); }*/ } else if(func == 9 && delimiter != NULL && nvram != NULL && value != NULL){ /* this code section is fix the old delimiter(s) is a subset of new delimiter(s) issue */ randnum = number_range(6, 16); tmp = StrDup(nvram_get(nvram)); if(strstr(value, delimiter) && strlen(value) > strlen(delimiter)){ char temp_deli[]="olddeliisasubsetofnewdeli"; random_string(temp_deli, randnum); nvram_set(nvram, replaceall(tmp, delimiter, temp_deli, -2, matchStrPosAt(delimiter, tmp, -1))); strcpy(tmp, nvram_get(nvram)); nvram_set(nvram, replaceall(tmp, temp_deli, value, -2, matchStrPosAt(temp_deli, tmp, -1))); } else nvram_set(nvram, replaceall(tmp, delimiter, value, -2, matchStrPosAt(delimiter, tmp, -1))); printf("%s\n", nvram_get(nvram)); } else{ fprintf(stderr, "%s", help_msg); exit(0); } //StrFree(tmp); return 0; }
void do_heavenlyrain(CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; char arg1[MAX_INPUT_LENGTH]; int dam; argument = one_argument(argument, arg1); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_SKYBLADE)) { stc("Huh?\n\r",ch); return; } if (ch->pcdata->powers[SKYBLADE_MAGIC] < 3) { send_to_char("You haven't mastered that magic yet.\n\r",ch); return; } if (( victim = get_char_room(ch, NULL, arg1)) == NULL) { if (( victim = ch->fighting) == NULL) { send_to_char("Call heavenlyrain upon whom?\n\r",ch); return; } else victim = ch->fighting; } if (is_safe(ch, victim)) { send_to_char("They are safe from such a hostile action.\n\r",ch); return; } if (ch->mana < 5000) { send_to_char("You do not have the 5000 mana required to call on the dragon.\n\r",ch); return; } if (ch->pcdata->powers[SKYBLADE_MAGIC] >= 4) dam = number_range(5000, 7000); else dam = number_range(3000, 5000); if (!IS_NPC(victim) && victim->alignment == 1000) dam *= .5; if (IS_NPC(victim)) dam += victim->hit/10; xprintf(buf, "#CYou call upon a heavenly rain to harm your opponent!#W[%d]\n\r",dam); stc(buf,ch); xprintf(buf, "#C%s calls upon a heavenly rain to harm you!#W[%d]\n\r",ch->name,dam); stc(buf,victim); act("#C$n calls upon a heavenly rain to harm $N!#n\n\r",ch,NULL,victim,TO_NOTVICT); ch->mana -= 5000; if (number_range(1,4) == 4){ if (ch->pcdata->powers[SKYBLADE_MAGIC] >= 4) ch->hit += dam; else ch->hit += dam/2; stc ("#LYour heavenly rain has healed you.#n\n\r",ch);} hurt_person(ch, victim, dam); if (victim->hit < -10) victim->hit = -10; WAIT_STATE(ch, 8); if (ch->fighting == NULL) ch->fighting = victim; return; }
void do_dragonx (CHAR_DATA *ch, char *argument) { CHAR_DATA *victim; char arg1[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int dam; argument = one_argument(argument, arg1); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_SKYBLADE)) { stc("Huh?\n\r",ch); return; } if (ch->pcdata->powers[SKYBLADE_SKILLS] < 8) { send_to_char("You haven't mastered that skill yet.\n\r",ch); return; } if (ch->pcdata->powers[SKYBLADE_DTIMER] != 10) { send_to_char("Your dragon power has not fully charged.\n\r",ch); return; } if (( victim = get_char_room(ch, NULL, arg1)) == NULL) { if (( victim = ch->fighting) == NULL) { send_to_char("Use the power of the dragon on whom?\n\r",ch); return; } else victim = ch->fighting; } if (is_safe(ch, victim)) { send_to_char("They are safe from such a hostile action.\n\r",ch); return; } if (ch->mana < 10000) { send_to_char("You do not have the 10000 mana required to call on the dragon.\n\r",ch); return; } dam = victim->hit/3; if (IS_NPC(victim)) dam = victim->hit * .9; if (ch->pcdata->powers[SKYBLADE_MAGIC] >= 5) dam *= 1.5; if (IS_NPC(victim)) { if (dam > 15000) dam = 5000 + (number_range(1,5) * number_range(1,7)); } else { if (dam > 6000) dam = 6000 + (number_range(1,5) * number_range(1,7)); } do_say(ch, "#LMighty dragon give me your POWER!!!!!!#n"); act("#C$n #Lleaps high into the air.......#n\n\r",ch,NULL,victim,TO_ROOM); stc("#LYou leap high into the air!#n\n\r",ch); act("#0The #ylightning crackles#0 as a large dragon is seen in the horizon.#n\n\r",ch,NULL,victim,TO_ROOM); WAIT_STATE(ch, 6); WAIT_STATE(victim, 6); stc("#LYou charge down upon your victim riding a huge dragon!#n\n\r",ch); act("#C$n #0charges down upon you, riding a huge dragon!#n\n\r",ch,NULL,victim,TO_VICT); act("#C$n #0charges down upon $N, riding a huge dragon!#n\n\r",ch,NULL,victim,TO_NOTVICT); ch->mana -= 10000; ch->pcdata->powers[SKYBLADE_DTIMER] = 0; WAIT_STATE(ch, 12); WAIT_STATE(victim, 12); xprintf(buf, "#LYou return to the ground and your dragon fades away.#W[%d]\n\r",dam); stc(buf,ch); xprintf(buf, "#L%s returns to the ground and the dragon fades away.#W[%d]\n\r",ch->name,dam); stc(buf, victim); hurt_person(ch, victim, dam); WAIT_STATE(ch, 8); if (ch->fighting == NULL) ch->fighting = victim; return; }
bool spec_random_orc (CHAR_DATA * ch) { char mob_long[MSL]; char mob_name[MSL]; char mob_short[MSL]; int name_range = number_range(1, MAX_RMOB_ORC_NAME - 1); int long_range = number_range(1, MAX_RMOB_ORC_LONG - 1); int other_range = number_range(1, MAX_RMOB_OTHER - 1); if(ch->wimpy != 0) { if(IS_SET(ch->act, ACT_THIEF)) return spec_thief(ch); if(IS_SET(ch->act, ACT_MAGE)) return spec_cast_mage(ch); return false; } /* Wimpy isn't used by mobs, so we'll use this as a check. if Wimpy == 1, dont do the script prevents mobs from changing every 8 pulses. */ ch->wimpy = 1; /* Select Keyword/Short/long */ sprintf (mob_name, "%s orc warrior", rmob_orc_name_table[name_range].name); // Set keywords sprintf (mob_short, "The orc, %s", rmob_orc_name_table[name_range].name); // Set Short_descr sprintf (mob_long, "%s", rmob_orc_long_table[long_range].long_descr); // Set Long_descr /* Now set the names */ ReplaceString(ch->name, mob_name); ReplaceString(ch->short_descr, mob_short); ReplaceString(ch->long_descr, mob_long); // ch->name = str_dup (mob_name); // ch->short_descr = str_dup (mob_short); // ch->long_descr = str_dup (mob_long); /* play with level ranges a bit, dont want static mobs */ int level_range = number_range( rmob_orc_other_table[other_range].low_level_range, rmob_orc_other_table[other_range].hig_level_range ); ch->level += level_range; /* Set hitroll/dam/affected flags */ ch->hitroll = number_range( rmob_orc_other_table[other_range].l_hitroll, rmob_orc_other_table[other_range].h_hitroll ); ch->damroll = number_range( rmob_orc_other_table[other_range].l_damroll, rmob_orc_other_table[other_range].h_damroll ); ch->affected_by = 0; ch->affected_by = rmob_orc_other_table[other_range].affect_flags; // Set Hitpoints/mana/move int hit_points = dice(ch->level, rmob_orc_other_table[other_range].hit_dice); ch->hit = hit_points; ch->max_hit = hit_points; ch->mana = 100; ch->max_mana = 100; ch->move = 100; ch->max_move = 100; // Give them a Randomized Dam message. I would of put this in a table, but thats overkill switch (number_range (1, 3)) { case (1): ch->dam_type = 3; break; /* slash */ case (2): ch->dam_type = 7; break; /* pound */ case (3): ch->dam_type = 11; break; /* pierce */ } // And were done! return TRUE; }
void do_gbanish( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; CHAR_DATA *mount; char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; int dam; argument = one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!IS_CLASS(ch, CLASS_ANGEL)) { send_to_char("Huh?\n\r",ch); return; } if (ch->pcdata->powers[ANGEL_HARMONY] < 3) { send_to_char("Your not in contact with your inner harmonies.\n\r",ch); return; } if ((victim = get_char_room(ch, arg)) == NULL) { send_to_char("They are not here.\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char("Not on mobiles.\n\r",ch); return; } if (is_safe(ch,victim)) return; if (victim == ch) { send_to_char("That doesn't seem like a good idea.\n\r",ch); return; } if (victim->alignment > 500) { send_to_char("They are not evil, you cannot punish them.\n\r",ch); return; } if (victim->alignment > 0) dam = 500; else if (victim->alignment > - 500) dam = 1000; else dam = 1500; sprintf(buf,"Your call for God to banish $N and $S is hurt [%d]",dam); act(buf,ch,NULL,victim,TO_CHAR); sprintf(buf,"$n calls for God to banish you, and it hurts BAD! [%d]",dam); act(buf,ch,NULL,victim,TO_VICT); sprintf(buf,"$n calls for God to Banish $N."); act(buf,ch,NULL,victim,TO_NOTVICT); hurt_person(ch,victim,dam); if (number_range(1,10) > 7) { act( "$n is flung into a vortex and disappears.", victim, NULL, NULL, TO_ROOM ); char_from_room( victim ); char_to_room( victim, get_room_index(ROOM_VNUM_HELL)); act( "$n is flung out of a vortex.", victim, NULL, NULL, TO_ROOM ); do_look(victim, "auto"); if ((mount = victim->mount) == NULL) return; char_from_room( mount ); char_to_room(mount, victim->in_room); do_look(mount, "auto"); return; } if (victim->position > POS_STUNNED) { if (victim->fighting == NULL) set_fighting(victim, ch); if (ch->fighting == NULL) set_fighting(ch, victim); } WAIT_STATE(ch,18); return; }
void hint_update( void ) { CHAR_DATA * ch; CHAR_DATA *ch_next; for ( ch = char_list;ch != NULL;ch = ch_next ) { ch_next = ch->next; if ( !IS_NPC( ch ) && IS_SET( ch->comm, COMM_HINT ) ) { send_to_char( "{R[PORADA]: ", ch ); switch ( number_range( 0, 52 ) ) { default: send_to_char( "{YJe¶li czego¶ nie wiesz, skorzystaj na pocz±tku z pomocy, komenda {Ghelp{Y (polskie: {Gpomoc{Y). Je¶li nie znajdziesz tam odpowiedzi na swoje pytanie, mo¿esz zadaæ je innym graczom - wpisz znak zapytania i tre¶æ pytania (np. ?jak napiæ siê wody?).{x", ch ); break; case 1: send_to_char( "{YJe¶li nie chcesz traciæ ekwipunku, kiedy wychodzisz z gry musisz siê przej¶æ do jednej z gospod i wynaj±æ pokój. Wpisz {Grent{Y (polskie: {Gwynajmij{Y), kiedy ju¿ jeste¶ w gospodzie.{x", ch ); break; case 2: send_to_char( "{YKomenda {Goffer{Y (polskie: {Goferta{Y) poka¿e ci ile bêdziesz p³aci<&³/³a/³o> za przechowywanie swojego ekwipunku w gospodzie. Mo¿e okazaæ siê, ze szkoda pieniêdzy na niektóre jego czê¶ci. Sprzedaj je wtedy lub te¿ po prostu wyrzuæ.{x", ch ); break; case 3: send_to_char( "{YPamiêtaj, ¿e czasami, kiedy chodzisz w grupie z innymi graczami ³atwiej jest sobie poradziæ z niektórymi potworami. Praca zespo³owa czyni cuda.{x", ch ); break; case 4: send_to_char( "{YJe¶li nie masz wystarczaj±co du¿o pieniêdzy na przechowywanie ekwipunku w gospodzie, pomy¶l nad sprzedaniem go czy tez innymi podobnymi rozwi±zaniami. Mo¿esz przechowywaæ tylko tyle dni na ile ciê staæ, potem ca³y ekwipunek przepada.{x", ch ); break; case 5: send_to_char( "{YZawsze, kiedy chcesz siê zmierzyæ z ró¿nymi potworami mo¿esz wpisaæ {Gconsider imiê potwora{Y (polskie: {Goceñ{Y), (na przyk³ad {Gconsider troll{Y). Pozwoli ci to w przybli¿eniu oceniæ czy poradzisz sobie z jak±¶ besti± czy nie. Czasami po prostu nie warto ryzykowaæ walki praktycznie z góry skazanej na pora¿kê.{x", ch ); break; case 6: send_to_char( "{YJe¶li nie wiesz jak u¿yæ jakiej¶ komendy spróbuj wpisaæ {Ghelp komenda{Y (polskie: {Gpomoc{Y). Pomoc powinna mniej wiêcej podpowiedzieæ ci do czego dana komenda s³u¿y.{x", ch ); break; case 7: send_to_char( "{YSzybciej odnawiaj± siê twoje si³y ¿yciowe, kiedy jeste¶ najedzony i napity. Warto wiec zawsze mieæ ze sob± jaki¶ pojemnik z wod± i prowiant.{x", ch ); break; case 8: send_to_char( "{YJe¶li jeste¶ wypoczêty lepiej walczysz, niewyspany stajesz siê nieprecyzyjny. Pamiêtaj o tym. Kiedy d³uga przygoda da ci czasami szansê odpoczynku, korzystaj z niego.{x", ch ); break; case 9: send_to_char( "{YJe¶li widzisz, ¿e walka jest praktycznie dla ciebie przegrana spróbuj uciec walcz±cemu z tob± przeciwnikowi. Pomocna bêdzie komenda {Gflee{Y (polskie: {Guciekaj{Y).{x", ch ); break; case 10: send_to_char( "{YCzasami zwyczajnie nie warto ryzykowaæ straty du¿ej partii punktów do¶wiadczenia, kiedy do ukoñczenia kolejnego etapu przygody (poziomu do¶wiadczenia) pozosta³o ci ju¿ naprawdê niewiele, ale... Wszystko zale¿y od ciebie.{x", ch ); break; case 11: send_to_char( "{YJedna osoba nie mo¿e graæ w jednym momencie dwiema postaciami. Je¶li taki proceder zostanie wykryty spodziewaj siê kary... £±cznie z tymi najsurowszymi.{x", ch ); break; case 12: send_to_char( "{YPamiêtaj, ¿e imiê twojej postaci musi spe³niaæ postawione przez twórców tego muda i umieszczone na etapie tworzenia postaci kryteria. Je¶li ich nie przeczyta³e¶ - zrób to.{x", ch ); break; case 13: print_char( ch, "{YTroche informacji o naszym mudzie, mudach w ogóle i innych rzeczach, jakie mog± ciê zainteresowaæ mo¿esz znale¼æ na stronie naszego muda pod adresem: %s{x", WWW_ADDRESS ); break; case 14: send_to_char( "{YPamiêtaj, ze kiedy rozmawiasz z jednym z w³adców (Nie¶miertelnych) tego muda mo¿esz zachowywaæ siê tak jak to uwa¿asz za stosowne, ale... Pamiêtaj tez, ¿e i ów w³adca zrobi z tob± to, co uwa¿a za stosowne i we¼mie pod uwagê to jak siê zachowywa³e¶. Jak wszêdzie – chamstwo, wrzaskliwo¶æ i temu podobne niechlubne zachowania na pewno nie zostan± docenione.{x", ch ); break; case 15: send_to_char( "{YKiedy wpiszesz komendê {Gsave{Y (polskie: {Gzapisz{Y) dane twojej postaci zostan± zachowane na serwerze muda. Co jaki¶ czas jednak mud zachowuje te dane automatycznie.{x", ch ); break; case 16: send_to_char( "{YZapoznaj siê dok³adnie z komend± {Gconfig{Y (polskie: {Gopcje{Y). Pozwala ona wy¶wietliæ i ustawiæ parametry gry oraz automatyczne zachowania Twojej postaci. Dok³adniejsze informacje znajduj± siê w pomocy do tej komendy ({Ghelp config{Y lub {Gpomoc opcje{Y).{x", ch ); break; case 17: send_to_char( "{YKiedy chcesz zaatakowaæ jakiego¶ potwora wpisz {Gkill potwór{Y (polskie: {Gzabij{Y). Nie zawsze bêdzie dane ci wygraæ. Mierz si³y na zamiary. Ale... Jak zwykle, wszystko zale¿y od ciebie.{x", ch ); break; case 18: send_to_char( "{YMo¿esz zg³osiæ literówkê za pomoc± komendy {Gtypo{Y (polskie: {Gliterówka{Y).{x", ch ); break; case 19: send_to_char( "{YJe¶li chcesz zg³osiæ b³±d wpisz {Gbug{Y (polskie: {Gb³±d{Y) i krótki jego opis. {x", ch ); break; case 20: send_to_char( "{YJe¶li masz jaki¶ pomys³ wpisz {Gidea{Y i krótko wyja¶nij na czym ten pomys³ polega.{x", ch ); break; case 21: send_to_char( "{YKomenda {Geat{Y (polskie: {Gzjedz{Y) pozwoli ci spo¿yæ co¶ co znajduje siê w twoim inwentarzu. Niektóre rzeczy mog± byæ truj±ce, a trucizny z kolei ¶miertelne. Na ogó³ jednak sporo rzeczy sprzedawanych w sklepach i na straganach zgodnie ze swoim przeznaczeniem do zjedzenia siê nadaje… Do czasu jednak, po pewnym czasie wiêkszo¶æ siê psuje.{x", ch ); break; case 22: send_to_char( "{YKiedy widzisz opis jakiego¶ kierunku w nawiasie zwyk³ym, na przyk³ad (E) oznacza to, ze w tym kierunku s± drzwi. Mo¿esz spróbowaæ je otworzyæ komend± {Gopen kierunek{Y (polskie: {Gotwórz{Y). Do otwarcia niektórych drzwi jednak potrzebny bêdzie klucz.{x", ch ); break; case 23: send_to_char( "{YOtwarcie drzwi zamkniêtych na klucz nie jest rzecz± skomplikowan±. Wystarczy wpisaæ {Gunlock kierunek{Y, b±d¼ te¿ {Gunlock nazwa drzwi{Y (polskie: {Godklucz{Y). Przedtem musisz jednak zdobyæ odpowiedni klucz i trzymaæ go w swoim inwentarzu.{x", ch ); break; case 24: send_to_char( "{YKiedy ¶pisz twoje si³y ¿yciowe szybciej do ciebie wracaj±. Korzystaj z tego.{x", ch ); break; case 25: send_to_char( "{YPamiêtaj, ze mo¿esz byæ zaatakowany, kiedy ¶pisz lub te¿ odpoczywasz w niebezpiecznych miejscach. O ile to w ogóle mo¿liwe próbuj czasami spaæ w miejscach o mniejszym stopniu ryzyka.{x", ch ); break; case 26: send_to_char( "{YKiedy odpoczywasz szybciej wracaj± ci si³y ¿yciowe. Nie tak szybko wprawdzie jak podczas snu, ale zawsze. Dodatkowo podczas odpoczynku profesje czaruj±ce mog± zapamiêtywaæ zaklêcia.{x", ch ); break; case 27: send_to_char( "{YNie ka¿dy typ terenu jest dla ciebie równie ³atwy do pokonania. Wiêcej energii bêdzie trzeba w³o¿yæ na terenach górzystych ni¿ na prostej drodze. Jednak czasami mo¿na dosi±¶æ jakiego¶ wierzchowca, a czasami dziêki uprzejmo¶ci jakiego¶ maga nawet polewitowaæ w powietrzu.{x", ch ); break; case 28: send_to_char( "{YTwoja postaæ bêdzie posiada³a wiele umiejêtno¶ci. Na pocz±tku niektóre ze wzglêdu na mizerny poziom wytrenowania nie na wiele siê zdadz±. Rozwijaj je, byæ mo¿e przydadz± siê w przysz³o¶ci.{x", ch ); break; case 29: send_to_char( "{YKiedy chodzisz na bosaka twoje stopy s± podatniejsze na zranienie. Zawsze nawet najgorsze buciory mog± siê na co¶ przydaæ.{x", ch ); break; case 30: send_to_char( "{YCzê¶æ pieniêdzy mo¿esz przechowywaæ w banku. Zwyczaj taki mo¿e ciê uratowaæ przed ¶mierci± g³odow±, kiedy kto¶ ciê napadnie i ograbi na rozstajach dróg.{x", ch ); break; case 31: send_to_char( "{YZawsze mo¿esz skasowaæ postaæ, która ciê znudzi³a, b±d¼ tez sta³a siê dla ciebie bezu¿yteczna (opcja kasowania postaci w menu przy wchodzeniu do gry).{x", ch ); break; case 32: send_to_char( "{YMniej siê mêczysz przemierzaj±c ¶wiat na grzbiecie wierzchowca. Niektóre kosztuj±, ale... s± po¿yteczne.{x", ch ); break; case 33: send_to_char( "{YKiedy u¿ywasz ró¿nych swoich umiejêtno¶ci zdobywasz w nich punkty wytrenowania. Je¶li ich trochê uzbierasz mo¿esz siê przej¶æ do odpowiedniego nauczyciela a on nauczy ciê o danej umiejêtno¶ci czego¶ wiêcej.{x", ch ); break; case 34: send_to_char( "{YKiedy wychodzisz prawid³owo z muda i zachowujesz ekwipunek komend± {Grent{Y zapoznaj siê z informacj± na ile dni wystarczy ci pieniêdzy na przechowywanie i wróæ przed up³ywem tego terminu, aby ekwipunek ci nie przepad³.{x", ch ); break; case 35: send_to_char( "{YNiektóre potwory s± zbyt silne aby walczyæ z nimi samotnie. Zapoznaj siê z komend± {Ggroup{Y (help group) (polskie: {Ggrupa{Y) i spróbuj wybraæ siê na takiego potwora w towarzystwie dru¿yny.{x", ch ); break; case 36: send_to_char( "{YRó¿ne postaci posiadaj± odmienne umiejêtno¶ci. Mo¿e siê okazaæ, ¿e po³±czone umiejêtno¶ci w dru¿ynie s± w stanie zdzia³aæ cuda.{x", ch ); break; case 37: send_to_char( "{YKiedy zginiesz twoje cia³o bêdzie le¿a³o tam, gdzie kto¶ lub co¶ ciê zabi³o. Musisz wróciæ po cia³o, aby odzyskaæ rzeczy jakie nosi³<&e¶/a¶/e¶> przed ¶mierci±.{x", ch ); break; case 38: send_to_char( "{YCzasami mo¿e siê zdarzyæ, ¿e zginiesz z miejscu, z którego nie ma wyj¶cia (np. przepa¶cie). Lepiej nie wracaj tam po swój ekwipunek chyba, ¿e chcesz zgin±æ kolejny raz. Czasem trzeba pogodziæ siê ze strat± ca³ego dobytku.{x", ch ); break; case 39: send_to_char( "{YKiedy zginiesz i masz niewiele punktów do¶wiadczenia mo¿esz straciæ poziom do¶wiadczenia, punkty ¿yciowe i kilka innych rzeczy. Zachowuj ostro¿no¶æ.{x", ch ); break; case 40: send_to_char( "{YNie wykorzystuj b³êdów w grze, mo¿esz za to ponie¶æ karê. B³êdy nale¿y zg³aszaæ komenda {Gbug{Y (polskie: {Gb³±d{Y).{x", ch ); break; case 41: send_to_char( "{YPamiêtaj, ¿e niektóre produkty psuj± siê, kiedy d³ugo je nosisz ze sob± i nie zjadasz. Uwa¿aj na to, gdy¿ mo¿esz siê zatruæ.{x", ch ); break; case 42: send_to_char( "{YKiedy u¿ywasz jakiej¶ umiejêtno¶ci rozwijasz j±, aby jednak zamieniæ wszystkie twoje ogólne spostrze¿enia i przyzwyczajenia na rzeczywist± wiedzê musisz przej¶æ siê do okre¶lonego nauczyciela danej umiejêtno¶ci i pobraæ u niego nauki. S³u¿y do tego komenda {Glearn{Y (polskie: {Gucz{Y).{x", ch ); break; case 43: send_to_char( "{YJe¶li twoja profesja jest tak zwan± profesj± czaruj±c± mo¿esz uczyæ siê ni± ró¿nych zaklêæ. Niektórych z nich mo¿esz nauczyæ siê u nauczycieli porozrzucanych po ca³ym ¶wiecie. Niektórych trzeba naprawdê szukaæ, szukaæ, szukaæ. Magia w koñcu nie jest czym¶ pospolitym.{x", ch ); break; case 44: send_to_char( "{YUczenia siê danego czaru u danego nauczyciela mo¿esz spróbowaæ tylko raz na poziom do¶wiadczenia, je¶li ci siê nie uda, nastêpna próba odbywa siê dopiero na nastêpnym levelu. Mo¿esz te¿ poszukaæ innego nauczciela tego czaru.{x", ch ); break; case 45: send_to_char( "{YNie wszystkich czarów mo¿na siê nauczyæ u nauczycieli, niektóre znajdziesz w ksiêgach i zwojach, które czêsto bêdzie trudno znale¼æ i zdobyæ. Do nauki czarów z ksi±g s³u¿y komenda {Gstudy{Y (polskie: {Gstudiuj{Y){x", ch ); break; case 46: send_to_char( "{YMagowie nie najlepiej nadaj± siê na ¿ywe tarcze, dlatego czêsto bêd± potrzebowali do dru¿yny wojownika czy innego wytrzyma³ego specjalisty od nadstawiania twarzy.{x", ch ); break; case 47: send_to_char( "{YDobry mag powinien troszczyæ siê o osobnika, który broni go przed wszelkimi formami bezpo¶redniego starcia. Czary ochronne powinny byæ tu bardzo przydatne.{x", ch ); break; case 48: send_to_char( "{YGrupie wyprawiaj±cej siê w zapomniane przez ¶wiat ostêpy, zamieszka³e przez tajemnicze i bardzo gro¼ne bestie przyda siê kleryk, bêdzie leczy³ rany w krytycznych chwilach i zajmowa³ siê rannymi w czasie odpoczynku.{x", ch ); break; case 49: send_to_char( "{YBarbarzyñcy nie mog± co prawda nosiæ wszystkich rodzajów zbroi i nie s± tak opancerzeni jak paladyni czy wojownicy, ale ich dziki hart ducha i wrodzona wytrzyma³o¶æ rekompensuj± te braki.{x", ch ); break; case 50: send_to_char( "{YDobra grupa jest jak palce jednej rêki, warto czasami przemy¶leæ i skoordynowaæ przysz³e dzia³ania, aby z sukcesem dokonaæ rzeczy niebezpiecznych.{x", ch ); break; case 51: send_to_char( "{YWarto pamiêtaæ, ¿e do¶wiadczenie mo¿na zdobyæ nie tylko walcz±c i zabijaj±c. Rozwi±zywanie zadañ mo¿e siê nierzadko okazaæ nie tylko op³acalne, ale i bardzo interesuj±ce.{x", ch ); break; case 52: send_to_char( "{YJe¶li potrzebujesz pomocy mo¿esz zadaæ pytanie bardziej do¶wiadczonym graczom. Aby to zrobiæ wpisz znak zapytania a za nim tre¶æ pytania (np. ?jak napiæ siê wody?). Mo¿e siê zdarzyæ, ¿e w grze nie bêdzie nikogo kto zna³by odpowied¼ lub chcia³by odpowiedzieæ. U¿ywaj tej funkcji {Rz umiarem{Y.{x", ch ); break; } send_to_char( " {yAby wy³±czyæ porady wpisz: {Gconfig hints{Y (polskie: {Gopcje{Y).{x\n\r", ch ); } } return ; }
static const char * ChooseAdjective(const char ** adjectives, size_t count) { return adjectives[number_range(0, count - 1)]; }
/* * Set off a trap (obj) upon character (ch) - Thoric */ ch_ret spring_trap( char_data * ch, obj_data * obj ) { int dam, typ, lev; const char *txt; ch_ret retcode; typ = obj->value[1]; lev = obj->value[2]; retcode = rNONE; switch ( typ ) { default: txt = "hit by a trap"; break; case TRAP_TYPE_POISON_GAS: txt = "surrounded by a green cloud of gas"; break; case TRAP_TYPE_POISON_DART: txt = "hit by a dart"; break; case TRAP_TYPE_POISON_NEEDLE: txt = "pricked by a needle"; break; case TRAP_TYPE_POISON_DAGGER: txt = "stabbed by a dagger"; break; case TRAP_TYPE_POISON_ARROW: txt = "struck with an arrow"; break; case TRAP_TYPE_BLINDNESS_GAS: txt = "surrounded by a red cloud of gas"; break; case TRAP_TYPE_SLEEPING_GAS: txt = "surrounded by a yellow cloud of gas"; break; case TRAP_TYPE_FLAME: txt = "struck by a burst of flame"; break; case TRAP_TYPE_EXPLOSION: txt = "hit by an explosion"; break; case TRAP_TYPE_ACID_SPRAY: txt = "covered by a spray of acid"; break; case TRAP_TYPE_ELECTRIC_SHOCK: txt = "suddenly shocked"; break; case TRAP_TYPE_BLADE: txt = "sliced by a razor sharp blade"; break; case TRAP_TYPE_SEX_CHANGE: txt = "surrounded by a mysterious aura"; break; } dam = number_range( obj->value[4], obj->value[5] ); act_printf( AT_HITME, ch, NULL, NULL, TO_CHAR, "You are %s!", txt ); act_printf( AT_ACTION, ch, NULL, NULL, TO_ROOM, "$n is %s.", txt ); --obj->value[0]; if( obj->value[0] <= 0 ) obj->extract( ); switch ( typ ) { default: case TRAP_TYPE_BLADE: retcode = damage( ch, ch, dam, TYPE_UNDEFINED ); break; case TRAP_TYPE_POISON_DART: case TRAP_TYPE_POISON_NEEDLE: case TRAP_TYPE_POISON_DAGGER: case TRAP_TYPE_POISON_ARROW: retcode = obj_cast_spell( gsn_poison, lev, ch, ch, NULL ); if( retcode == rNONE ) retcode = damage( ch, ch, dam, TYPE_UNDEFINED ); break; case TRAP_TYPE_POISON_GAS: retcode = obj_cast_spell( gsn_poison, lev, ch, ch, NULL ); break; case TRAP_TYPE_BLINDNESS_GAS: retcode = obj_cast_spell( gsn_blindness, lev, ch, ch, NULL ); break; case TRAP_TYPE_SLEEPING_GAS: retcode = obj_cast_spell( skill_lookup( "sleep" ), lev, ch, ch, NULL ); break; case TRAP_TYPE_ACID_SPRAY: retcode = obj_cast_spell( skill_lookup( "acid blast" ), lev, ch, ch, NULL ); break; case TRAP_TYPE_SEX_CHANGE: retcode = obj_cast_spell( skill_lookup( "change sex" ), lev, ch, ch, NULL ); break; case TRAP_TYPE_FLAME: retcode = obj_cast_spell( skill_lookup( "flamestrike" ), lev, ch, ch, NULL ); break; case TRAP_TYPE_EXPLOSION: retcode = obj_cast_spell( gsn_fireball, lev, ch, ch, NULL ); break; case TRAP_TYPE_ELECTRIC_SHOCK: retcode = obj_cast_spell( skill_lookup( "lightning bolt" ), lev, ch, ch, NULL ); break; } return retcode; }
void generate_auto_quest( ) { DESCRIPTOR_DATA *d; int hunt_flags = 0; char new_long_desc[MAX_STRING_LENGTH]; short loop_counter = 0; int a = 140; int b = 0; short player_count = 0, average_level = 0, total_levels = 0; /* * generate a new quest! */ if ( quest ) { return; } /* * Work out levels of currently playing folks */ if ( first_desc && first_desc->connected == CON_PLAYING ) { for ( d = first_desc; d; d = d->next ) { if ( d->connected != CON_PLAYING ) continue; if ( IS_IMMORTAL(d->character) ) /* Imms shouldn't count against the quest level. --Kline */ continue; player_count++; total_levels += d->character->level; } player_count = UMAX( 1, player_count ); if ( total_levels > 0 ) /* If we don't have any players on, don't want a div by 0 error. --Kline */ average_level = ( total_levels / player_count ); else average_level = 1; quest_mob = NULL; quest_target = NULL; if ( average_level < 20 ) { a = number_range( 5, 25 ); b = number_range( 30, 45 ); hunt_flags = HUNT_WORLD | HUNT_OPENDOOR; quest_personality = 1; } else if ( average_level < 65 ) { a = number_range( 40, 55 ); b = number_range( 60, 84 ); hunt_flags = HUNT_WORLD | HUNT_OPENDOOR | HUNT_PICKDOOR; quest_personality = 2; } else { a = number_range( 100, 110 ); b = number_range( 115, 140 ); hunt_flags = HUNT_WORLD | HUNT_OPENDOOR | HUNT_PICKDOOR | HUNT_UNLOCKDOOR; quest_personality = 3; } while ( ( quest_mob == NULL ) && ( loop_counter < 500 ) ) { loop_counter++; quest_mob = get_quest_giver( a, b ); if ( ( quest_mob == NULL ) || ( ( h_find_dir( get_room_index( ROOM_VNUM_TEMPLE ), quest_mob->in_room, hunt_flags ) < 0 ) ) ) quest_mob = NULL; } if ( quest_mob == NULL ) { quest = FALSE; quest_wait = number_range( 1, 3 ); return; } loop_counter = 0; while ( ( quest_target == NULL ) && ( loop_counter < 500 ) ) { loop_counter++; quest_target = get_quest_target( a, b ); if ( ( quest_target == NULL ) || ( ( h_find_dir( get_room_index( ROOM_VNUM_TEMPLE ), quest_target->in_room, hunt_flags ) < 0 ) ) || ( quest_target == quest_mob ) ) quest_target = NULL; } if ( quest_target == NULL ) { quest = FALSE; quest_wait = number_range( 1, 3 ); return; } quest_object = load_quest_object( quest_target ); if ( quest_object == NULL ) { quest = FALSE; quest_wait = number_range( 1, 3 ); return; } /* * Set values on quest item for Qp, Pracs, Exp, Gold */ quest_object->value[0] = UMAX( 1, ( quest_target->level / 20 ) ); quest_object->value[1] = UMAX( 1, ( quest_target->level / 18 ) ); quest_object->value[2] = ( quest_target->level * 20 ); quest_object->value[3] = average_level; if ( number_percent() < 10 ) quest_object->value[0] *= 2; if ( number_percent() < 10 ) quest_object->value[1] *= 2; if ( number_percent() < 10 ) quest_object->value[2] *= 2; quest_timer = 0; quest = TRUE; new_long_desc[0] = '\0'; quest_mob->long_descr_orig = quest_mob->long_descr; snprintf( new_long_desc, MSL, "%s @@Nsays have you found my %s ?", quest_mob->get_name(), quest_object->short_descr ); quest_mob->long_descr = new_long_desc; quest_mob->act.set(ACT_NO_SUMMON ); quest_mob->act.set(ACT_NO_VISIT ); quest_mob->act.set(ACT_NO_BLOOD ); new_long_desc[0] = '\0'; quest_target->long_descr_orig = quest_target->long_descr; snprintf( new_long_desc, MSL, "%s @@Nsays I stole the %s !!!", quest_target->get_name(), quest_object->short_descr ); quest_target->long_descr = new_long_desc; quest_target->act.set(ACT_NO_SUMMON ); quest_target->act.set(ACT_NO_VISIT ); quest_target->act.set(ACT_NO_BLOOD ); return; } }
void shock_effect(void *vo,int level, int dam, int target) { if (target == TARGET_ROOM) { ROOM_INDEX_DATA *room = (ROOM_INDEX_DATA *) vo; OBJ_DATA *obj, *obj_next; for (obj = room->contents; obj != NULL; obj = obj_next) { obj_next = obj->next_content; shock_effect(obj,level,dam,TARGET_OBJ); } return; } if (target == TARGET_CHAR) { CHAR_DATA *victim = (CHAR_DATA *) vo; OBJ_DATA *obj, *obj_next; /* daze and confused? */ if (!saves_spell(level/4 + dam/20,victim,DAM_LIGHTNING)) { send_to_char("Your muscles stop responding.\n\r",victim); DAZE_STATE(victim,UMAX(12,level/4 + dam/20)); } /* toast some gear */ for (obj = victim->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; shock_effect(obj,level,dam,TARGET_OBJ); } return; } if (target == TARGET_OBJ) { OBJ_DATA *obj = (OBJ_DATA *) vo; int chance = level / 4 + dam / 10; char *msg; if (IS_OBJ_STAT(obj,ITEM_BURN_PROOF) || IS_OBJ_STAT(obj,ITEM_NOPURGE) || number_range(0,4) == 0) return; if (chance > 25) chance = (chance - 25) / 2 + 25; if (chance > 50) chance = (chance - 50) /2 + 50; if (IS_OBJ_STAT(obj,ITEM_BLESS)) chance -= 5; chance -= obj->level * 2; switch(obj->item_type) { default: return; case ITEM_WAND: case ITEM_STAFF: chance += 10; msg = "$p overloads and explodes!"; break; case ITEM_JEWELRY: chance -= 10; msg = "$p is fused into a worthless lump."; } chance = URANGE(5,chance,95); if (number_percent() > chance) return; if (obj->carried_by != NULL) act(msg,obj->carried_by,obj,NULL,TO_ALL); else if (obj->in_room != NULL && obj->in_room->people != NULL) act(msg,obj->in_room->people,obj,NULL,TO_ALL); extract_obj(obj); return; } }
/* * How mental state could affect finding an object - Thoric * Used by get/drop/put/quaff/recite/etc * Increasingly freaky based on mental state and drunkeness */ bool ms_find_obj( char_data * ch ) { int ms = ch->mental_state; int drunk = ch->isnpc( )? 0 : ch->pcdata->condition[COND_DRUNK]; const char *t; /* * we're going to be nice and let nothing weird happen unless * you're a tad messed up */ drunk = UMAX( 1, drunk ); if( abs( ms ) + ( drunk / 3 ) < 30 ) return false; if( ( number_percent( ) + ( ms < 0 ? 15 : 5 ) ) > abs( ms ) / 2 + drunk / 4 ) return false; if( ms > 15 ) /* range 1 to 20 -- feel free to add more */ switch ( number_range( UMAX( 1, ( ms / 5 - 15 ) ), ( ms + 4 ) / 5 ) ) { default: case 1: t = "As you reach for it, you forgot what it was...\r\n"; break; case 2: t = "As you reach for it, something inside stops you...\r\n"; break; case 3: t = "As you reach for it, it seems to move out of the way...\r\n"; break; case 4: t = "You grab frantically for it, but can't seem to get a hold of it...\r\n"; break; case 5: t = "It disappears as soon as you touch it!\r\n"; break; case 6: t = "You would if it would stay still!\r\n"; break; case 7: t = "Whoa! It's covered in blood! Ack! Ick!\r\n"; break; case 8: t = "Wow... trails!\r\n"; break; case 9: t = "You reach for it, then notice the back of your hand is growing something!\r\n"; break; case 10: t = "As you grasp it, it shatters into tiny shards which bite into your flesh!\r\n"; break; case 11: t = "What about that huge dragon flying over your head?!?!?\r\n"; break; case 12: t = "You stratch yourself instead...\r\n"; break; case 13: t = "You hold the universe in the palm of your hand!\r\n"; break; case 14: t = "You're too scared.\r\n"; break; case 15: t = "Your mother smacks your hand... 'NO!'\r\n"; break; case 16: t = "Your hand grasps the worst pile of revoltingness that you could ever imagine!\r\n"; break; case 17: t = "You stop reaching for it as it screams out at you in pain!\r\n"; break; case 18: t = "What about the millions of burrow-maggots feasting on your arm?!?!\r\n"; break; case 19: t = "That doesn't matter anymore... you've found the true answer to everything!\r\n"; break; case 20: t = "A supreme entity has no need for that.\r\n"; break; } else { int sub = URANGE( 1, abs( ms ) / 2 + drunk, 60 ); switch ( number_range( 1, sub / 10 ) ) { default: case 1: t = "In just a second...\r\n"; break; case 2: t = "You can't find that...\r\n"; break; case 3: t = "It's just beyond your grasp...\r\n"; break; case 4: t = "...but it's under a pile of other stuff...\r\n"; break; case 5: t = "You go to reach for it, but pick your nose instead.\r\n"; break; case 6: t = "Which one?!? I see two... no three...\r\n"; break; } } ch->print( t ); return true; }
void do_quest( CHAR_DATA *ch, char *argument ) { extern bool quest; extern bool auto_quest; extern CHAR_DATA *quest_mob; extern CHAR_DATA *quest_target; extern OBJ_DATA *quest_object; extern int quest_timer; extern int quest_wait; char buf[MAX_STRING_LENGTH]; char new_long_desc[MAX_STRING_LENGTH]; if ( argument[0] == '\0' ) /* Display status */ { if ( !quest ) { send_to_char( "There is no quest currently running.\n\r", ch ); if ( auto_quest ) send_to_char( "Quests are currently running automatically.\n\r", ch ); if ( quest_wait > 0 ) { sprintf( buf, "The next quest may occur in %d minutes.\n\r", (quest_wait * 2) ); send_to_char( buf, ch ); } return; } else send_to_char( "There is currently a quest running ", ch ); if ( auto_quest ) send_to_char( "(Automatically)", ch ); send_to_char( "\n\rQuest Details:\n\r\n\r", ch ); if ( quest_mob ) { sprintf( buf, "The questing mobile is: {x%s{x [In Room %d]\n\r", quest_mob->short_descr, quest_mob->in_room->vnum ); send_to_char( buf, ch ); } else { send_to_char( "The questing mobile is dead!\n\r", ch ); } if ( quest_target ) { sprintf( buf, "Target Mobile is: {x%s{x [In Room %d]\n\r", quest_target->short_descr, quest_target->in_room->vnum ); send_to_char( buf, ch ); } else send_to_char( "The target mobile is dead!\n\r", ch ); sprintf( buf, "Target Object is: {x%s{x.\n\r", quest_object->short_descr ); send_to_char( buf, ch ); sprintf( buf, "Quest Object is worth: %d QP, %d XP, %d raise points and %d GP\n\r", quest_object->value[0], (ch->level < LVL_MOBXPCAP) ? quest_object->value[1] : 0, quest_object->value[4], quest_object->value[2]); send_to_char( buf, ch ); sprintf( buf, "The Quest has been running for %d/30 minutes.\n\r", (quest_timer * 2) ); send_to_char( buf, ch ); return; } if ( !strcmp( argument, "stop" ) ) { if ( quest ) { /* sprintf( buf, "@@NThe quest has been stopped by an {mImmortal@@N. Please speak up if you have already gotten the item.\n\r" ); do_gecho( ch, buf ); */ clear_quest(); } return; } if ( !strcmp( argument, "start" ) ) { DESCRIPTOR_DATA *d; int a = 80; int b = 0; sh_int player_count = 0, average_level= 0, total_levels = 0; /* generate a new quest! */ if ( quest ) { send_to_char( "There is already a quest running...\n\r", ch ); return; } if ( auto_quest ) { auto_quest = FALSE; send_to_char( "Automatic Quests now OFF.\n\r", ch ); } /* Work out levels of currently playing folks */ for ( d = descriptor_list; d; d = d->next ) { if ( ( d->connected != CON_PLAYING ) || ( IS_IMMORTAL( d->character ) ) ) continue; player_count += 1; total_levels += d->character->level; } average_level = ( ( ( total_levels == 0 ) ? 30 : total_levels ) / ( ( player_count == 0 ) ? 1 : player_count ) ); a = average_level - 20; b = average_level + 20; sprintf(buf, "Mob lLevel: %d hLevel: %d\n\r", a, b); stc(buf,ch); quest_mob = get_quest_giver(a, b); if ( quest_mob == NULL ) { send_to_char( "Failed to find a quest mob\n\r", ch ); return; } b = UMIN( b, 110 ); a = UMAX( 20, a ); quest_target = get_quest_target( a, b ); if ( ( quest_target == NULL ) || ( quest_target == quest_mob ) ) { send_to_char( "Failed to find a quest target\n\r", ch ); return; } quest_object = load_quest_object( quest_target ); if ( quest_object == NULL ) { send_to_char( "An invalid quest object was encountered. Check log files.\n\r", ch ); quest = FALSE; return; } /* Set values on quest item for Qp, Pracs, Exp, Gold */ quest_object->value[0] = UMAX( 1, ( quest_target->level / 3) ); quest_object->value[1] = number_range(1, 60); quest_object->value[2] = ( quest_target->level * 100 ); quest_object->value[4] = 2; if ( number_percent() < 10 ) { quest_object->value[0] += 2; quest_object->value[1] += 3; quest_object->value[2] *= 2; quest_object->value[4] *= 3; } quest_timer = 0; quest = TRUE; new_long_desc[0] = '\0'; if ( quest_mob->pIndexData->long_descr_orig != NULL ) free_string( quest_mob->pIndexData->long_descr_orig ); quest_mob->pIndexData->long_descr_orig = str_dup(quest_mob->long_descr ); sprintf( new_long_desc, "%s {xsays have you found %s?\n\r", quest_mob->pIndexData->short_descr, quest_object->short_descr ); if ( quest_mob->long_descr != NULL ) free_string( quest_mob->long_descr ); quest_mob->long_descr = str_dup( new_long_desc ); SET_BIT( quest_mob->act, PLR_NOSUMMON ); REMOVE_BIT(quest_mob->act, ACT_AGGRESSIVE); /* T!!! */ new_long_desc[0] = '\0'; if ( quest_target->pIndexData->long_descr_orig != NULL ) free_string( quest_target->pIndexData->long_descr_orig ); quest_target->pIndexData->long_descr_orig = str_dup( quest_target->long_descr ); sprintf( new_long_desc, "%s {xsays I stole the {x%s{x!\n\r", quest_target->pIndexData->short_descr, quest_object->short_descr ); if ( quest_target->long_descr != NULL ) free_string( quest_target->long_descr ); quest_target->long_descr = str_dup( new_long_desc ); SET_BIT( quest_target->act, PLR_NOSUMMON ); send_to_char( "QUEST STARTED!\n\r\n\r", ch ); sprintf( buf, "The questing mobile is: {x%s{x [In Room %d]\n\r", quest_mob->pIndexData->short_descr, quest_mob->in_room->vnum ); send_to_char( buf, ch ); sprintf( buf, "Target Mobile is: {x%s{x [In Room %d]\n\r", quest_target->pIndexData->short_descr, quest_target->in_room->vnum ); send_to_char( buf, ch ); sprintf( buf, "Target Object is: {x%s{x.\n\r", quest_object->short_descr ); send_to_char( buf, ch ); sprintf( buf, "Quest Object is worth: %d QP, %d XP, %d raise points and %d GP\n\r", quest_object->value[0], quest_object->value[1], quest_object->value[4], quest_object->value[2] ); send_to_char( buf, ch ); return; } if ( !str_cmp( argument, "auto" ) ) { send_to_char( "AutoQuest now initiated!\n\r", ch ); auto_quest = TRUE; quest_wait = 360; return; } return; }
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; }
CHAR_DATA *get_quest_target( int min_level, int max_level ) { CHAR_DATA *target; extern CHAR_DATA *quest_mob; int min_index = 0; /* the minimum number of times to go through the list */ /* int min_distance = 50; unused */ /* char *dirs = NULL; unused */ if ( max_level > 140 ) max_level = 140; min_index = number_range(1, 1000); for ( target = char_list; target != NULL; target = target->next ) { if ( !IS_NPC( target ) ) continue; min_index -= 1; if ( min_index > 0 ) continue; /* * Check if mobile is suitable for the quest - * Ignore mobs that are likely to be in well known places, such * as train/prac mobs, healers, etc */ if ( ( target->level < min_level ) || ( target->level > max_level ) || ( IS_SET( target->act, ACT_SENTINEL ) ) || ( IS_SET( target->act, ACT_PET ) ) || ( target->in_room->area == quest_mob->in_room->area ) || ( target->in_room->area->vnum == 0 ) || ( target->in_room->area->vnum == 1 ) || ( target->in_room->area->vnum == 2 ) || ( target->in_room->area->vnum == 3 ) || ( target->in_room->area->vnum == 4 ) || ( target->in_room->area->vnum == 6 ) || ( target->in_room->area->vnum == 12 ) || ( target->in_room->area->vnum == 13 ) || ( target->in_room->area->vnum == 15 ) || ( target->in_room->area->vnum == 18 ) || ( target->in_room->area->vnum == 19 ) || ( target->in_room->area->vnum == 24 ) || ( target->in_room->area->vnum == 25 ) || ( target->in_room->area->vnum == 33 ) || ( target->in_room->area->vnum == 35 ) || ( target->in_room->area->vnum == 41 ) || ( target->in_room->area->vnum == 80 ) || ( target->in_room->area->vnum == 81 ) || ( target->in_room->area->vnum == 86 ) || ( target->in_room->area->vnum == 89 ) || ( target->in_room->area->vnum == 90 ) || ( target->in_room->area->vnum == 93 ) || ( target->in_room->area->vnum == 94 ) || ( target->in_room->area->vnum == 95 ) || ( target->in_room->area->vnum == 96 ) || ( target->in_room->area->vnum == 97 ) || ( target->in_room->area->vnum == 98 ) || ( target->in_room->area->vnum == 99 ) || ( target->in_room->area->vnum == 100 ) || ( target->in_room->area->vnum == 101 ) || ( target->in_room->area->vnum == 102 ) || ( target->in_room->area->vnum == 103 ) || ( target->in_room->area->vnum == 104 ) || ( target->in_room->area->vnum == 105 ) || ( target->in_room->area->vnum == 106 ) || ( target->in_room->area->vnum == 107 ) || ( target->in_room->area->vnum == 108 ) || ( target->in_room->area->vnum == 109 ) || ( target->in_room->area->vnum == 110 ) || ( target->in_room->area->vnum == 91 ) || ( target->in_room->area->vnum == 38 ) ) /* || ( !strcmp(spec_name(target->spec_fun), "spec_guard_kael") ) || ( !strcmp(spec_name(target->spec_fun), "spec_guard_evil") ) || ( !strcmp(spec_name(target->spec_fun), "spec_guard_tier") ) || ( !strcmp(spec_name(target->spec_fun), "spec_guard_tier2") ) || ( !strcmp(spec_name(target->spec_fun), "spec_guard_cairn") ) ) */ continue; /* Lastly, some random choice */ if ( number_percent() < 2 ) break; } return target; }
void Forge::CompleteWeapon(CHAR_DATA & ch, ForgeContext & context) { // Determine the number of bonus points to spend bool forgeMaster(false); int bonusPoints(ch.level / 2); if (number_percent() <= get_skill(&ch, gsn_forgemaster)) { check_improve(&ch, NULL, gsn_forgemaster, true, 4); forgeMaster = true; bonusPoints += 10; } else check_improve(&ch, NULL, gsn_forgemaster, false, 4); if (ch.in_room != NULL && room_is_affected(ch.in_room, gsn_lavaforge)) bonusPoints += 20; if (context.named) bonusPoints += 60; bonusPoints -= context.flaws * 20; switch (Luck::Check(ch)) { case Luck::Lucky: bonusPoints += 5; break; case Luck::Unlucky: bonusPoints -= 5; break; default: break; } bonusPoints = UMAX(0, bonusPoints); // Build the special odds ranges from the weapon and base objects std::vector<std::pair<unsigned int, const SpecialInfo *> > specials; unsigned int nextIndex(0); for (SpecialMap::const_iterator iter(Specials().begin()); iter != Specials().end(); ++iter) { // Make sure there are sufficient points for at least 1 level of this special if (bonusPoints < iter->second.cost) continue; // Calculate odds unsigned int oddsRange(CalculateOddsRange(iter->second, context.weaponInfo->weapon, context.materials)); if (oddsRange == 0) continue; // Add in the range specials.push_back(std::make_pair(nextIndex, &iter->second)); nextIndex += oddsRange; } // Now choose the special types, up to three std::vector<const SpecialInfo *> chosenSpecials; if (nextIndex > 0) { for (size_t i(0); i < 3; ++i) { // Choose an index at random and find the associated special unsigned int index(number_range(0, nextIndex - 1)); for (size_t j(0); j + 1 < specials.size(); ++j) { if (specials[j].first <= index && specials[j + 1].first > index) { // Found the matching special, now verify that it is acceptable in the face of other chosen ones const SpecialInfo * chosenSpecial(specials[j].second); for (size_t k(0); k < chosenSpecials.size(); ++k) { // No duplicates and no more than one uniqueclass if (chosenSpecials[k] == chosenSpecial || (chosenSpecials[k]->uniqueClass && chosenSpecial->uniqueClass)) { chosenSpecial = NULL; break; } } if (chosenSpecial != NULL) chosenSpecials.push_back(chosenSpecial); break; } } } } // Create the base object OBJ_DATA * obj(create_object(get_obj_index(OBJ_VNUM_FORGEWEAPON), 0)); if (obj == NULL) { bug("Forge weapon failed due to bad obj creation", 0); send_to_char("An error has occurred, please contact the gods.\n", &ch); return; } // Fill out the basic info; use the first material as the object's material obj->level = ch.level; obj->weight = number_range(context.weaponInfo->minWeight, (context.weaponInfo->minWeight * 23) / 20); obj->weight = UMIN(obj->weight, context.weight); obj->size = context.weaponInfo->objSize; obj->cost = ((bonusPoints * bonusPoints) / 2) + number_range(0, 300); if (!context.materials.empty()) obj->material = context.materials[0]; if (!context.weaponInfo->damverbs.empty()) copy_string(obj->obj_str, context.weaponInfo->damverbs[number_range(0, context.weaponInfo->damverbs.size() - 1)].c_str()); obj->value[0] = context.weaponInfo->type; obj->value[1] = 10 + (ch.level / 10) + context.weaponInfo->dammod + (context.named ? 1 : 0); obj->value[2] = 2; obj->value[3] = context.weaponInfo->damtype; if (context.weaponInfo->twohanded) SET_BIT(obj->value[4], WEAPON_TWO_HANDS); // Now choose from the selected specials at random until out of points or possible specials while (bonusPoints > 0 && !chosenSpecials.empty()) { // Choose a special and add it in size_t index(number_range(0, chosenSpecials.size() - 1)); chosenSpecials[index]->callback(*obj); bonusPoints -= UMAX(1, chosenSpecials[index]->cost); // Remove the special if too costly for the remaining points or only one allowed if (bonusPoints < chosenSpecials[index]->cost || !chosenSpecials[index]->multipleAllowed) { chosenSpecials[index] = chosenSpecials[chosenSpecials.size() - 1]; chosenSpecials.pop_back(); } } // Compensate for bad luck with increased damage if (context.named && bonusPoints >= 10) ++obj->value[1]; // Choose an adjective from the set of common adjectives plus the weapon-specific adjectives WordList adjectives(Adjectives()); for (size_t i(0); i < context.weaponInfo->adjectives.size(); ++i) adjectives.push_back(context.weaponInfo->adjectives[i]); std::string adjective; if (!adjectives.empty()) adjective = adjectives[number_range(0, adjectives.size() - 1)]; // Break down the material set to only unique materials std::set<int> materials; for (size_t i(0); i < context.materials.size(); ++i) materials.insert(context.materials[i]); std::string materialAdjective; switch (materials.size()) { case 0: break; case 1: materialAdjective = material_table[context.materials[0]].name; break; case 2: { std::set<int>::iterator iter(materials.begin()); materialAdjective = material_table[*iter].name; materialAdjective += '-'; ++iter; materialAdjective += material_table[*iter].name; break; } default: materialAdjective = material_table[context.materials[0]].name; materialAdjective += "-alloyed"; break; } // Build the short desc std::ostringstream shortDesc; if (!adjective.empty()) shortDesc << adjective << ' '; if (!materialAdjective.empty()) shortDesc << materialAdjective << ' '; shortDesc << context.weaponInfo->name; std::string weaponShort(shortDesc.str()); if (!weaponShort.empty()) weaponShort = std::string(indefiniteArticleFor(weaponShort[0])) + ' ' + weaponShort; SetBasicDescs(*obj, weaponShort.c_str(), false); // Set up the exdesc std::ostringstream exdesc; switch (number_range(0, 2)) { case 0: exdesc << "Forged"; break; case 1: exdesc << "Formed"; break; default: exdesc << "Wrought"; break; } exdesc << " from "; switch (materials.size()) { case 0: exdesc << " pure metal"; break; case 1: exdesc << " pure " << material_table[context.materials[0]].name; break; case 2: { std::set<int>::iterator iter(materials.begin()); exdesc << "an alloy of " << material_table[*iter].name << " and "; ++iter; exdesc << material_table[*iter].name; break; } default: exdesc << " a metal alloy"; break; } exdesc << ", this "; if (!adjective.empty()) exdesc << adjective << ' '; exdesc << context.weaponInfo->name; if (IS_OBJ_STAT(obj, ITEM_GLOW)) exdesc << " gleams brightly."; else if (IS_OBJ_STAT(obj, ITEM_DARK)) exdesc << " seems to drink the light into its dark surface."; else if (IS_OBJ_STAT(obj, ITEM_HUM)) exdesc << " hums faintly."; else if (IS_OBJ_STAT(obj, ITEM_NODESTROY)) exdesc << " seems nearly indestructible."; else if (context.named) exdesc << " radiates an aura of power."; else if (forgeMaster) exdesc << " has been masterfully crafted."; else exdesc << " has been well-crafted."; exdesc << ' '; switch (number_range(0, 5)) { case 0: exdesc << "The bands of metal which comprise it have been folded over and over to toughen the final product."; break; case 1: exdesc << "Bands of metal flash-forged together serve to harden the weapon against wear."; break; case 2: exdesc << "Carved into the weapon's length are small straight-lined runes, etched with obvious care."; break; case 3: exdesc << "Folds of the metal have been beaten into the weapon's surface, reinforcing the craftsmanship."; break; case 4: exdesc << "Ornate filigree runs the length of the weapon, decorating it in gleaming metal."; break; default: exdesc << "The lines of the weapon are simple and unadorned, lending it a certain grim elegance."; break; } if (!context.weaponInfo->sentences.empty() && number_bits(1) == 0) exdesc << ' ' << context.weaponInfo->sentences[number_range(0, context.weaponInfo->sentences.size() - 1)]; if (TraitCount(*obj, Trait_Parry) > 0) exdesc << " Forged with unusual precision, the balance of this piece lends itself well to parrying blows."; if (TraitCount(*obj, Trait_Casting) > 0) exdesc << " A sense of focus permeates this piece, as though it has been well-prepared for the channeling of mystical energies."; switch (context.flaws) { case 0: switch (number_range(0, 3)) { case 0: exdesc << " The work is flawless, bearing no sign of weakness."; break; case 1: exdesc << " Clearly well-fashioned, this " << context.weaponInfo->name << " has been made to stand the test of time."; break; case 2: exdesc << " No trace of imperfection mars the surface of this beautiful " << context.weaponInfo->name << '.'; break; default: exdesc << " There is no sign of seam or solder, as though the weapon was cast as a single, perfect unit."; break; } break; case 1: switch (number_range(0, 2)) { case 0: exdesc << " A few minor imperfections mar the otherwise smooth surface of the " << context.weaponInfo->name << '.'; break; case 1: exdesc << " Though not immediately-visible, a couple of minor flaws are evident upon closer inspection."; break; default: exdesc << " Some dents remain from the original crafting, slightly weakening the metalwork."; break; } break; default: switch (number_range(0, 2)) { case 0: exdesc << " Significant flaws are evident along the " << context.weaponInfo->name << "'s length."; break; default: exdesc << " Several seams show clearly on the weapon's surface, evidence of clumsy forgework."; break; } break; } // Apply the desc exdesc << '\n'; EXTRA_DESCR_DATA * extraDesc(new_extra_descr()); copy_string(extraDesc->keyword, obj->name); copy_string(extraDesc->description, exdesc.str().c_str()); extraDesc->description = format_string(extraDesc->description); extraDesc->next = obj->extra_descr; obj->extra_descr = extraDesc; // Give the object to the char obj_to_char(obj, &ch); // Echoes (and charge max mana for the naming, if present) act("You quench the metalwork, now shaped into $p.", &ch, obj, NULL, TO_CHAR); act("$n quenches the metalwork, now shaped into $p.", &ch, obj, NULL, TO_ROOM); if (context.named) { act("You can feel the air about it charged with power drained from your very being, as the newly-forged weapon lies waiting to receive its true Name.", &ch, obj, NULL, TO_CHAR); ch.max_mana = UMAX(0, ch.max_mana - NamingManaCost); if (!IS_NPC(&ch)) ch.pcdata->perm_mana = UMAX(0, ch.pcdata->perm_mana - NamingManaCost); ch.mana = UMIN(ch.mana, ch.max_mana); // Add an effect to the char to indicate he can name the object AFFECT_DATA af = {0}; af.where = TO_AFFECTS; af.type = gsn_forgeweapon; af.location = APPLY_HIDE; af.duration = -1; af.point = obj; af.level = ch.level; affect_to_char(&ch, &af); } }
void generate_auto_quest() { extern bool quest; extern CHAR_DATA *quest_mob; extern CHAR_DATA *quest_target; extern OBJ_DATA *quest_object; extern int quest_timer; extern int quest_wait; extern sh_int quest_personality; // int hunt_flags = 0; char new_long_desc[MAX_STRING_LENGTH]; sh_int loop_counter = 0; int a = 140; int b = 0; sh_int average_level= 0; /* generate a new quest! */ if ( quest ) { return; } #if 0 /* Work out levels of currently playing folks */ if ( descriptor_list && descriptor_list->connected == CON_PLAYING ) { for ( d = descriptor_list; d; d = d->next ) { if ( d->connected != CON_PLAYING ) continue; if (IS_IMMORTAL(d->character)) continue; player_count += 1; total_levels += d->character->level; } player_count = UMAX( 1, player_count ); average_level = ( total_levels / player_count ); #endif quest_mob = NULL; quest_target = NULL; average_level = number_range( 0, 65 ); if ( average_level < 20 ) { a = number_range( 5, 25 ); b = number_range( 30, 45 ); // hunt_flags = HUNT_WORLD | HUNT_OPENDOOR ; quest_personality = 1; } else if ( average_level < 40 ) { a = number_range( 30, 40 ); b = number_range( 40, 55 ); // hunt_flags = HUNT_WORLD | HUNT_OPENDOOR | HUNT_PICKDOOR; quest_personality = 2; } else { a = number_range( 50, 55 ); b = number_range( 56, 99 ); // hunt_flags = HUNT_WORLD | HUNT_OPENDOOR | HUNT_PICKDOOR | HUNT_UNLOCKDOOR; quest_personality = 3; } if (quest_personality == 0 ) quest_personality = 1; while ( ( quest_mob == NULL ) && ( loop_counter < 500 ) ) { loop_counter++; quest_mob = get_quest_giver(a, b); } if ( quest_mob == NULL ) { quest = FALSE; quest_wait = number_range( 1, 3 ); return; } loop_counter = 0; while ( ( quest_target == NULL ) && ( loop_counter < 500 ) ) { loop_counter++; quest_target = get_quest_target( a, b ); if ( ( quest_target == NULL ) || ( quest_target == quest_mob ) ) quest_target = NULL; } if ( quest_target == NULL ) { quest = FALSE; quest_wait = number_range( 1, 3 ); return; } quest_object = load_quest_object( quest_target ); if ( quest_object == NULL ) { quest = FALSE; quest_wait = number_range( 1, 3 ); return; } /* Set values on quest item for Qp, Pracs, Exp, Gold */ quest_object->value[0] = UMAX( 1, ( quest_target->level / 3 ) ); quest_object->value[1] = number_range(1, 60); quest_object->value[2] = ( quest_target->level * 100 ); quest_object->value[3] = average_level; quest_object->value[4] = 2; if ( number_percent() < 10 ) { quest_object->value[0] += 2; quest_object->value[1] += 3; quest_object->value[2] *= 2; quest_object->value[4] *= 3; } quest_timer = 0; quest = TRUE; new_long_desc[0] = '\0'; if ( quest_mob->pIndexData->long_descr_orig != NULL ) free_string( quest_mob->pIndexData->long_descr_orig ); quest_mob->pIndexData->long_descr_orig = str_dup(quest_mob->long_descr ); sprintf( new_long_desc, "{x%s{x says have you found {x%s{x?\n\r", quest_mob->short_descr, quest_object->short_descr ); if ( quest_mob->long_descr != NULL ) free_string( quest_mob->long_descr ); quest_mob->long_descr = str_dup( new_long_desc ); SET_BIT( quest_mob->act, PLR_NOSUMMON ); REMOVE_BIT(quest_mob->act, ACT_AGGRESSIVE); new_long_desc[0] = '\0'; if ( quest_target->pIndexData->long_descr_orig != NULL ) free_string( quest_target->pIndexData->long_descr_orig ); quest_target->pIndexData->long_descr_orig = str_dup( quest_target->long_descr ); sprintf( new_long_desc, "{x%s{x says I stole {x%s{x!\n\r", quest_target->pIndexData->short_descr, quest_object->short_descr ); if ( quest_target->long_descr != NULL ) free_string( quest_target->long_descr ); quest_target->long_descr = str_dup( new_long_desc ); SET_BIT( quest_target->act, PLR_NOSUMMON ); return; }