void check_killer(struct char_data *ch, struct char_data *vict) { if (PLR_FLAGGED(vict, PLR_KILLER) || PLR_FLAGGED(vict, PLR_THIEF)) return; if (PLR_FLAGGED(ch, PLR_KILLER) || IS_NPC(ch) || IS_NPC(vict) || ch == vict) return; SET_BIT(PLR_FLAGS(ch), PLR_KILLER); send_to_char(ch, "If you want to be a PLAYER KILLER, so be it...\r\n"); mudlog(BRF, LVL_IMMORT, TRUE, "PC Killer bit set on %s for initiating attack on %s at %s.", GET_NAME(ch), GET_NAME(vict), world[IN_ROOM(vict)].name); }
/* I'm not particularly pleased with the MOB/PLR hoops that have to be jumped * through but it hardly calls for a completely new variable. Ideally it would * be its own list, but that would change the '->next' pointer, potentially * confusing some code. -gg This doesn't handle recursive extractions. */ void extract_pending_chars(void) { struct char_data *vict, *next_vict, *prev_vict; if (extractions_pending < 0) log("SYSERR: Negative (%d) extractions pending.", extractions_pending); for (vict = character_list, prev_vict = NULL; vict && extractions_pending; vict = next_vict) { next_vict = vict->next; if (MOB_FLAGGED(vict, MOB_NOTDEADYET)) REMOVE_BIT_AR(MOB_FLAGS(vict), MOB_NOTDEADYET); else if (PLR_FLAGGED(vict, PLR_NOTDEADYET)) REMOVE_BIT_AR(PLR_FLAGS(vict), PLR_NOTDEADYET); else { /* Last non-free'd character to continue chain from. */ prev_vict = vict; continue; } extract_char_final(vict); extractions_pending--; if (prev_vict) prev_vict->next = next_vict; else character_list = next_vict; } if (extractions_pending > 0) log("SYSERR: Couldn't find %d extractions as counted.", extractions_pending); extractions_pending = 0; }
void gain_condition(struct char_data * ch, int condition, int value) { bool intoxicated; if (IS_NPC(ch) || GET_COND(ch, condition) == -1) /* No change */ return; intoxicated = (GET_COND(ch, DRUNK) > 0); GET_COND(ch, condition) += value; GET_COND(ch, condition) = MAX(0, GET_COND(ch, condition)); GET_COND(ch, condition) = MIN(24, GET_COND(ch, condition)); if (GET_COND(ch, condition) || PLR_FLAGGED(ch, PLR_WRITING)) return; switch (condition) { case FULL: send_to_char("You are hungry.\r\n", ch); return; case THIRST: send_to_char("You are thirsty.\r\n", ch); return; case DRUNK: if (intoxicated) send_to_char("You are now sober.\r\n", ch); return; default: break; } }
/* * subtracts amount of hitpoints from ch's current and starts points event */ void alter_hit(struct char_data *ch, int amount) { struct regen_event_obj *regen; long time; int gain; GET_HIT(ch) = MIN(GET_HIT(ch) - amount, GET_MAX_HIT(ch)); if (GET_HIT(ch) <= HIT_INCAP||IS_AFFECTED(ch,AFF_TRAMORTITO)) return; if (PLR_FLAGGED(ch, PLR_FANTASMA) && amount > 0) return; if (GET_HIT(ch) < GET_MAX_HIT(ch) && !GET_POINTS_EVENT(ch, REGEN_HIT)) { CREATE(regen, struct regen_event_obj, 1); regen->ch = ch; regen->type = REGEN_HIT; gain = hit_gain(ch); time = PULSES_PER_MUD_HOUR / (gain ? gain : 1); GET_POINTS_EVENT(ch, REGEN_HIT) = event_create(points_event, regen, time); if (amount >= 0) { /* * if the character gained hp, update position and * restart mana and move regeneration if needed. */ update_pos(ch); alter_mana(ch, 0); alter_move(ch, 0); } }
/* say_spell erodes buf, buf1, buf2 */ void say_spell(struct char_data *ch, struct spell_info_type *sptr, struct char_data *tch, struct obj_data *tobj) { char lbuf[256]; const char *format; struct char_data *i; int j, ofs = 0; *buf = '\0'; sprintf(lbuf, "%s", LOWERALL(sptr->name)); while (lbuf[ofs]) { for (j = 0; *(syls[j].org); j++) { if (!strncmp(syls[j].org, lbuf + ofs, strlen(syls[j].org))) { strcat(buf, syls[j].news); ofs += strlen(syls[j].org); break; } } /* i.e., we didn't find a match in syls[] */ if (!*syls[j].org) { extended_mudlog(NRM, SYSL_BUGS, TRUE, "No entry in syllable table for substring of '%s'", lbuf); ofs++; } } if (tch != NULL && IN_ROOM(tch) == IN_ROOM(ch)) { if (tch == ch) format = "$n closes $s eyes and utters the words, '&W%s&n'."; else format = "$n stares at $N and utters the words, '&W%s&n'."; } else if (tobj != NULL && ((IN_ROOM(tobj) == IN_ROOM(ch)) || (tobj->carried_by == ch))) format = "$n stares at $p and utters the words, '&W%s&n'."; else format = "$n utters the words, '&W%s&n'."; sprintf(buf1, format, sptr->name); sprintf(buf2, format, buf); for (i = world[IN_ROOM(ch)].people; i; i = i->next_in_room) { if (i == ch || i == tch || !i->desc || !AWAKE(i) || IN_OLC(i->desc) || PLR_FLAGGED(i, PLR_WRITING)) continue; if (GET_CLASS(ch) == GET_CLASS(i)) perform_act(buf1, ch, tobj, tch, i, 0); else perform_act(buf2, ch, tobj, tch, i, 0); } if (tch != NULL && tch != ch && IN_ROOM(tch) == IN_ROOM(ch)) { sprintf(buf1, "$n stares at you and utters the words, '&W%s&n'.", GET_CLASS(ch) == GET_CLASS(tch) ? sptr->name : buf); act(buf1, FALSE, ch, NULL, tch, TO_VICT); } }
void gain_condition(CharData * ch, int condition, int value) { bool intoxicated = (GET_COND(ch, DRUNK) > 0); if (GET_COND(ch, condition) == -1) /* No change */ return; GET_COND(ch, condition) += value; GET_COND(ch, condition) = MAX(0, GET_COND(ch, condition)); if(condition == THIRST && IS_VAMPIRE(ch)) GET_COND(ch, condition) = MIN(48, GET_COND(ch, condition)); else GET_COND(ch, condition) = MIN(24, GET_COND(ch, condition)); // Do not spam hungry players who are trying to write. if (PLR_FLAGGED(ch, PLR_WRITING)) return; if( GET_COND(ch, condition) == 2){ switch (condition) { case HUNGER: send_to_char("You begin to experience hunger pangs.\r\n", ch); return; case THIRST: send_to_char("Your mouth is as dry as a desert.\r\n", ch); return; default: return; } } if(GET_COND(ch, condition) >= 1) return; switch (condition) { case HUNGER: send_to_char("Your stomach grumbles loudly.\r\n", ch); return; case THIRST: if (IS_VAMPIRE(ch)) { send_to_char("Your desire for &08blood&00 consumes you.\r\n", ch); return; } else { send_to_char("You are parched.\r\n", ch); return; } case DRUNK: if(intoxicated) send_to_char("You are now sober.\r\n", ch); return; default: break; } }
int is_tell_ok(CHAR_DATA * ch, CHAR_DATA * vict) { if (ch == vict) { send_to_char("Вы начали потихоньку разговаривать с самим собой.\r\n", ch); return (FALSE); } else if (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_DUMB)) { send_to_char("Вам запрещено обращаться к другим игрокам.\r\n", ch); return (FALSE); } else if (!IS_NPC(vict) && !vict->desc) /* linkless */ { act("$N потерял$G связь в этот момент.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); return (FALSE); } else if (PLR_FLAGGED(vict, PLR_WRITING)) { act("$N пишет сообщение - повторите попозже.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); return (FALSE); } if (IS_GOD(ch) || Privilege::check_flag(ch, Privilege::KRODER)) return (TRUE); if (ROOM_FLAGGED(ch->in_room, ROOM_SOUNDPROOF)) send_to_char("Стены заглушили Ваши слова.\r\n", ch); else if ((!IS_NPC(vict) && (PRF_FLAGGED(vict, PRF_NOTELL) || ignores(vict, ch, IGNORE_TELL))) || ROOM_FLAGGED(vict->in_room, ROOM_SOUNDPROOF)) act("$N не сможет Вас услышать.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); else if (GET_POS(vict) < POS_RESTING || AFF_FLAGGED(vict, AFF_DEAFNESS)) act("$N Вас не услышит.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); else return (TRUE); return (FALSE); }
void Crash_save_all(void) { struct descriptor_data *d; for (d = descriptor_list; d; d = d->next) { if ((d->connected == CON_PLAYING) && !IS_NPC(d->character)) { if (PLR_FLAGGED(d->character, PLR_CRASH)) { Crash_crashsave(d->character); save_char(d->character, d->character->in_room); REMOVE_BIT(PLR_FLAGS(d->character), PLR_CRASH); } } } }
int calc_loadroom(CHAR_DATA * ch, int bplace_mode = BIRTH_PLACE_UNDEFINED) { int loadroom; if (IS_IMMORTAL(ch)) return (immort_start_room); else if (PLR_FLAGGED(ch, PLR_FROZEN)) return (frozen_start_room); else { loadroom = BirthPlace::GetLoadRoom(bplace_mode); if (loadroom != BIRTH_PLACE_UNDEFINED) return loadroom; } return (mortal_start_room); }
int is_tell_ok(struct char_data *ch, struct char_data *vict) { if (ch == vict) send_to_char(ch, "You try to tell yourself something.\r\n"); else if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOTELL)) send_to_char(ch, "You can't tell other people while you have notell on.\r\n"); else if (ROOM_FLAGGED(IN_ROOM(ch), ROOM_SOUNDPROOF)) send_to_char(ch, "The walls seem to absorb your words.\r\n"); else if (!IS_NPC(vict) && !vict->desc) /* linkless */ act("$E's linkless at the moment.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); else if (PLR_FLAGGED(vict, PLR_WRITING)) act("$E's writing a message right now; try again later.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); else if ((!IS_NPC(vict) && PRF_FLAGGED(vict, PRF_NOTELL)) || ROOM_FLAGGED(IN_ROOM(vict), ROOM_SOUNDPROOF)) act("$E can't hear you.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); else return (TRUE); return (FALSE); }
bool is_npk_combat(struct creature * ch, struct creature * vict) { if (!ch || !vict) { return false; } if (IS_NPC(ch) || IS_NPC(vict)) return false; if (PLR_FLAGGED(vict, PLR_HARDCORE)) return false; if (vict->in_room->zone->pk_style == ZONE_NEUTRAL_PK) { return true; } return false; }
int is_tell_ok(struct char_data *ch, struct char_data *vict) { /*if (ch == vict) send_to_char("You try to tell yourself something.\r\n", ch);*/ if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOTELL)) send_to_char("You can't tell other people while you have notell on.\r\n", ch); else if (!IS_NPC(vict) && !vict->desc) /* linkless */ act("$E's linkless at the moment.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); else if (PLR_FLAGGED(vict, PLR_WRITING)) act("$E's writing a message right now; try again later.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); else if ((!IS_NPC(vict) && PRF_FLAGGED(vict, PRF_NOTELL))) act("$E can't hear you.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); else { if (PRF_FLAGGED(vict, PRF_AFK)) act("$E's afk right now and might not get this message.",FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); return (TRUE); } return (FALSE); }
int calc_loadroom(struct char_data *ch) { if (IS_IMMORTAL(ch)) return (immort_start_room); else if (PLR_FLAGGED(ch, PLR_FROZEN)) return (frozen_start_room); else if (GET_LEVEL(ch) < 15) {switch(GET_RACE(ch)) { case CLASS_SEVERANE: return START_ROOM; break; case CLASS_POLANE: return 5000; break; case CLASS_KRIVICHI: return START_ROOM; break; case CLASS_VATICHI: return 5000; break; case CLASS_VELANE: return START_ROOM; break; case CLASS_DREVLANE: return 5000; break; } } return (mortal_start_room); }
//Sets a character's default skills, such as languages. void Character::SetSkillDefaults() { if( IS_NPC(this) || IS_HUMAN(this) || IS_DREADLORD(this) || IS_DREADGUARD(this) || IS_FADE(this) || IS_GREYMAN(this) || IS_SEANCHAN(this) || IS_AIEL(this)) SET_SKILL(this, SKILL_NEW_TONGUE, 100); if(IS_NPC(this) || IS_TROLLOC(this) || PLR_FLAGGED(this, PLR_DARKFRIEND)) SET_SKILL(this, SKILL_TROLL_TONGUE, 100); SET_SKILL(this, SKILL_BAREHANDS, 100); if( !IS_NPC(this) && !this->userClans.empty() ) { Clan *clan; for(auto userClanIter = userClans.begin();userClanIter != userClans.end();++userClanIter) { UserClan *userClan = (*userClanIter); clan = ClanUtil::getClan(userClan->getClanId()); if(userClan->getRank() >= clan->bonus_skill_rank) SET_SKILL(this, clan->bonus_skill, clan->bonus_skill_val); } } }
void gain_condition(CHAR_DATA * ch, unsigned condition, int value) { if (condition >= ch->player_specials->saved.conditions.size()) { log("SYSERROR : condition=%d (%s:%d)", condition, __FILE__, __LINE__); return; } if (IS_NPC(ch) || GET_COND(ch, condition) == -1) { return; } bool intoxicated = (GET_COND(ch, DRUNK) >= CHAR_DRUNKED); GET_COND(ch, condition) += value; GET_COND(ch, condition) = MAX(0, GET_COND(ch, condition)); GET_COND(ch, condition) = MIN(MAX_COND_VALUE, GET_COND(ch, condition)); if (GET_COND(ch, condition) || PLR_FLAGGED(ch, PLR_WRITING)) return; switch (condition) { case FULL: send_to_char("Вы голодны.\r\n", ch); return; case THIRST: send_to_char("Вас мучает жажда.\r\n", ch); return; case DRUNK: if (intoxicated && GET_COND(ch, DRUNK) < CHAR_DRUNKED) send_to_char("Наконец-то вы протрезвели.\r\n", ch); GET_DRUNK_STATE(ch) = 0; return; default: break; } }
/* * auction_output : takes two strings and dispenses them to everyone connected * based on if they have color on or not. Note that the buf's are * commonly used *color and *black so I allocate my own buffer. */ void auction_output(char *color, char *black) { char buffer[MAX_STRING_LENGTH]; struct descriptor_data *d; if (!auction.auctioneer) auction.auctioneer = str_dup(DEFAULT_AUCTIONEER); for (d = descriptor_list; d; d = d->next) if (!d->connected && d->character && !PLR_FLAGGED(d->character, PLR_WRITING) && !PRF_FLAGGED(d->character, PRF_NOAUCT) && !ROOM_FLAGGED(d->character->in_room, ROOM_SOUNDPROOF) && !ROOM_FLAGGED(d->character->in_room, ROOM_PRISON)) { sprintf(buffer, "%s%s%s auctions, '%s%s%s'%s\r\n", CCMAG(d->character,C_NRM), auction.auctioneer, CCCYN(d->character,C_NRM), CCNRM(d->character,C_NRM), (COLOR_LEV(d->character) > C_NRM) ? color : black, CCMAG(d->character,C_NRM),CCNRM(d->character,C_NRM)); send_to_char(buffer, d->character); } }
int is_tell_ok(Character *ch, Character *vict) { if( ch->IsPurged() ) return FALSE; else if( vict->IsPurged() ) ch->send(NOPERSON); else if(GET_RACE(vict) != GET_RACE(ch) && GET_LEVEL(ch) < LVL_IMMORT && GET_LEVEL(vict) < LVL_IMMORT && !IS_NPC(ch)) ch->send(NOPERSON); else if (ch == vict) ch->send("You try to tell yourself something.\r\n"); else if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOTELL)) ch->send("You can't tell other people while you have notell on.\r\n"); else if ( AFF_FLAGGED(ch, AFF_SILENCE) && GET_LEVEL(ch) <= LVL_IMMORT ) ch->send("You try to speak, but nothing comes out!\r\n"); /*else if(ch->in_room == ch->StartRoom() && GET_LEVEL(ch) < LVL_IMMORT && GET_LEVEL(vict) < LVL_IMMORT && GET_LEVEL(ch) > 5) ch->send("Your attempt to communicate into the Pattern fails.\r\n");*/ // else if(vict->in_room == vict->StartRoom() && GET_LEVEL(vict) < LVL_IMMORT && GET_LEVEL(ch) < LVL_IMMORT) // ch->send("Your attempt to communicate outside of the Pattern fails.\r\n"); else if (ROOM_FLAGGED(ch->in_room, ROOM_SOUNDPROOF)) ch->send("The walls seem to absorb your words.\r\n"); else if (!IS_NPC(vict) && !vict->desc) /* linkless */ Act("$E's linkless at the moment.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); else if (PRF_FLAGGED(ch, PRF_TELL_MUTE)) ch->send("You are mute to tells. You need an immortal to remove this.\r\n"); else if (PRF_FLAGGED(vict, PRF_TELL_MUTE)) Act("$E's is mute to tells... Try again later.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); else if (PLR_FLAGGED(vict, PLR_WRITING)) Act("$E's writing a message right now; try again later.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); else if ((!IS_NPC(vict) && PRF_FLAGGED(vict, PRF_NOTELL)) || ROOM_FLAGGED(vict->in_room, ROOM_SOUNDPROOF) || vict->IsIgnoring(GET_NAME(ch))) Act("$E can't hear you.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); else return TRUE; return FALSE; }
void affect_from_char_II(struct char_data * ch, int skill, int type, int action) { struct affected_type *aff, *next; struct affected_type *temp; struct affected_type af[3]; int i, k; bool accum_affect = FALSE, accum_duration = FALSE; for (aff = ch->affected; aff; aff = next) { next = aff->next; if (aff->type == type) { affect_modify(ch, aff->location, aff->modifier, aff->bitvector, FALSE); REMOVE_FROM_LIST(aff, ch->affected, next); free(aff); affect_total(ch); } } if (action == 2) { switch (skill) { case SPELL_POLYMORPH: if (PLR_FLAGGED(ch, PLR_RABBIT)){ REMOVE_BIT(PLR_FLAGS(ch), PLR_RABBIT); REMOVE_BIT(PRF_FLAGS(ch), PRF_NOTSELF); send_to_char("You feel yourself growing, and your ears shrinking. You no longer feel like a rabbit.\r\n", ch); act("$n's body grows, $s ears shrinking. $n no longer looks like a rabbit.\r\n", 0, ch, 0, 0, TO_ROOM); } if (PLR_FLAGGED(ch, PLR_BIRD)) { REMOVE_BIT(PLR_FLAGS(ch), PLR_BIRD); REMOVE_BIT(PRF_FLAGS(ch), PRF_NOTSELF); send_to_char("You feel yourself growing and your feathers falling away. You no longer feel like a bird.\r\n", ch); act("$n's body grows, $s feathers falling away as it expands. $n no longer looks like a bird.\r\n", 0, ch, 0, 0, TO_ROOM); } if (PLR_FLAGGED(ch, PLR_WOLF)) { REMOVE_BIT(PLR_FLAGS(ch), PLR_WOLF); REMOVE_BIT(PRF_FLAGS(ch), PRF_NOTSELF); send_to_char("You feel your your fur shed and your teeth shrink. You no longer feel like a wolf.\r\n", ch); act("$n's teeth shrink, $s fur shedding. $n no longer looks like a wolf.\r\n", 0, ch, 0, 0, TO_ROOM); } if (PLR_FLAGGED(ch, PLR_BEAR)) { REMOVE_BIT(PLR_FLAGS(ch), PLR_BEAR); REMOVE_BIT(PRF_FLAGS(ch), PRF_NOTSELF); send_to_char("Your claws shrink as does the rest of your body. You no longer feel like a bear.\r\n", ch); act("$n's claws shrink as does the rest of $s body. $n no longer looks like a bear.\r\n", 0, ch, 0, 0, TO_ROOM); } if (PLR_FLAGGED(ch, PLR_CAT)){ REMOVE_BIT(PLR_FLAGS(ch), PLR_CAT); REMOVE_BIT(PRF_FLAGS(ch), PRF_NOTSELF); send_to_char("You feel your body growing, and your fur shedding. You no longer feel like a cat.\r\n", ch); act("$n's body slowly grows, $s fur shedding. $n no longer looks like a cat.\r\n", 0, ch, 0, 0, TO_ROOM); } for (k = 0; k < NUM_WEARS; k++) if (GET_EQ(ch, k)){ GET_OBJ_DISGUISE(GET_EQ(ch, k)) = 0; } if (affected_by_spell(ch, SPELL_FLIGHT)) affect_from_char_II(ch, SPELL_FLIGHT, SPELL_FLIGHT, 1); if (affected_by_spell(ch, SPELL_HASTE)) affect_from_char_II(ch, SPELL_HASTE, SPELL_HASTE, 1); break; case SKILL_STANCE: if (!AFF_FLAGGED(ch, AFF_TIRED)) { for (i = 0; i < 3; i++) { af[0].type = SPELL_DONTUSEME; af[0].location = APPLY_HITROLL; af[0].modifier = 2; af[0].duration = 7; af[0].bitvector = AFF_STANCE; af[1].type = SPELL_DONTUSEME; af[1].location = APPLY_AC; af[1].modifier = -50; af[1].duration = 7; af[1].bitvector = AFF_STANCE; af[2].type = SPELL_DONTUSEME; af[2].location = APPLY_STR; af[2].modifier = 2; af[2].duration = 7; af[2].bitvector = AFF_STANCE; if (af[i].bitvector || (af[i].location != APPLY_NONE)) { affect_join(ch, af+i, accum_duration, FALSE, accum_affect, FALSE); } } } break; default: break; } } }
void save_player_to_file(struct creature *ch, const char *path) { void expire_old_grievances(struct creature *); // Save vital statistics FILE *ouf; char *tmp_path; struct alias_data *cur_alias; int idx; int hit = GET_HIT(ch), mana = GET_MANA(ch), move = GET_MOVE(ch); tmp_path = tmp_sprintf("%s.tmp", path); ouf = fopen(tmp_path, "w"); if (!ouf) { fprintf(stderr, "Unable to open XML player file for save.[%s] (%s)\n", path, strerror(errno)); return; } struct aff_stash *aff_stash = stash_creature_affects(ch); expire_old_grievances(ch); fprintf(ouf, "<creature name=\"%s\" idnum=\"%ld\">\n", GET_NAME(ch), ch->char_specials.saved.idnum); fprintf(ouf, "<points hit=\"%d\" mana=\"%d\" move=\"%d\" maxhit=\"%d\" maxmana=\"%d\" maxmove=\"%d\"/>\n", ch->points.hit, ch->points.mana, ch->points.move, ch->points.max_hit, ch->points.max_mana, ch->points.max_move); fprintf(ouf, "<money gold=\"%" PRId64 "\" cash=\"%" PRId64 "\" xp=\"%d\"/>\n", ch->points.gold, ch->points.cash, ch->points.exp); fprintf(ouf, "<stats level=\"%d\" sex=\"%s\" race=\"%s\" height=\"%d\" weight=\"%f\" align=\"%d\"/>\n", GET_LEVEL(ch), genders[(int)GET_SEX(ch)], race_name_by_idnum(GET_RACE(ch)), GET_HEIGHT(ch), GET_WEIGHT(ch), GET_ALIGNMENT(ch)); fprintf(ouf, "<class name=\"%s\"", class_names[GET_CLASS(ch)]); if (GET_REMORT_CLASS(ch) != CLASS_UNDEFINED) fprintf(ouf, " remort=\"%s\"", class_names[GET_REMORT_CLASS(ch)]); if (GET_REMORT_GEN(ch) > 0) fprintf(ouf, " gen=\"%d\"", GET_REMORT_GEN(ch)); if (IS_CYBORG(ch)) { if (GET_OLD_CLASS(ch) != -1) fprintf(ouf, " subclass=\"%s\"", borg_subchar_class_names[GET_OLD_CLASS(ch)]); if (GET_TOT_DAM(ch)) fprintf(ouf, " total_dam=\"%d\"", GET_TOT_DAM(ch)); if (GET_BROKE(ch)) fprintf(ouf, " broken=\"%d\"", GET_BROKE(ch)); } if (GET_CLASS(ch) == CLASS_MAGE && GET_SKILL(ch, SPELL_MANA_SHIELD) > 0) { fprintf(ouf, " manash_low=\"%ld\" manash_pct=\"%ld\"", ch->player_specials->saved.mana_shield_low, ch->player_specials->saved.mana_shield_pct); } fprintf(ouf, "/>\n"); fprintf(ouf, "<time birth=\"%ld\" death=\"%ld\" played=\"%ld\" last=\"%ld\"/>\n", ch->player.time.birth, ch->player.time.death, ch->player.time.played, ch->player.time.logon); fprintf(ouf, "<carnage pkills=\"%d\" akills=\"%d\" mkills=\"%d\" deaths=\"%d\" reputation=\"%d\"", GET_PKILLS(ch), GET_ARENAKILLS(ch), GET_MOBKILLS(ch), GET_PC_DEATHS(ch), ch->player_specials->saved.reputation); fprintf(ouf, "/>\n"); fprintf(ouf, "<attr str=\"%d\" int=\"%d\" wis=\"%d\" dex=\"%d\" con=\"%d\" cha=\"%d\"/>\n", ch->real_abils.str, ch->real_abils.intel, ch->real_abils.wis, ch->real_abils.dex, ch->real_abils.con, ch->real_abils.cha); fprintf(ouf, "<condition hunger=\"%d\" thirst=\"%d\" drunk=\"%d\"/>\n", GET_COND(ch, FULL), GET_COND(ch, THIRST), GET_COND(ch, DRUNK)); fprintf(ouf, "<player wimpy=\"%d\" lp=\"%d\" clan=\"%d\"/>\n", GET_WIMP_LEV(ch), GET_LIFE_POINTS(ch), GET_CLAN(ch)); if (ch->desc) ch->player_specials->desc_mode = ch->desc->input_mode; if (ch->player_specials->rentcode == RENT_CREATING || ch->player_specials->rentcode == RENT_REMORTING) { fprintf(ouf, "<rent code=\"%d\" perdiem=\"%d\" " "currency=\"%d\" state=\"%s\"/>\n", ch->player_specials->rentcode, ch->player_specials->rent_per_day, ch->player_specials->rent_currency, desc_modes[(int)ch->player_specials->desc_mode]); } else { fprintf(ouf, "<rent code=\"%d\" perdiem=\"%d\" currency=\"%d\"/>\n", ch->player_specials->rentcode, ch->player_specials->rent_per_day, ch->player_specials->rent_currency); } fprintf(ouf, "<home town=\"%d\" homeroom=\"%d\" loadroom=\"%d\"/>\n", GET_HOME(ch), GET_HOMEROOM(ch), GET_LOADROOM(ch)); fprintf(ouf, "<quest"); if (GET_QUEST(ch)) fprintf(ouf, " current=\"%d\"", GET_QUEST(ch)); if (GET_LEVEL(ch) >= LVL_IMMORT) fprintf(ouf, " allowance=\"%d\"", GET_QUEST_ALLOWANCE(ch)); if (GET_IMMORT_QP(ch) != 0) fprintf(ouf, " points=\"%d\"", GET_IMMORT_QP(ch)); fprintf(ouf, "/>\n"); fprintf(ouf, "<bits flag1=\"%" PRIx32 "\" flag2=\"%" PRIx32 "\"/>\n", ch->char_specials.saved.act, ch->player_specials->saved.plr2_bits); if (PLR_FLAGGED(ch, PLR_FROZEN)) { fprintf(ouf, "<frozen thaw_time=\"%d\" freezer_id=\"%d\"/>\n", ch->player_specials->thaw_time, ch->player_specials->freezer_id); } fprintf(ouf, "<prefs flag1=\"%" PRIx32 "\" flag2=\"%" PRIx32 "\" tongue=\"%s\"/>\n", ch->player_specials->saved.pref, ch->player_specials->saved.pref2, tongue_name(GET_TONGUE(ch))); fprintf(ouf, "<affects flag1=\"%" PRIx32 "\" flag2=\"%" PRIx32 "\" flag3=\"%" PRIx32 "\"/>\n", ch->char_specials.saved.affected_by, ch->char_specials.saved.affected2_by, ch->char_specials.saved.affected3_by); for (idx = 0; idx < MAX_WEAPON_SPEC; idx++) { if (GET_WEAP_SPEC(ch, idx).level > 0) fprintf(ouf, "<weaponspec vnum=\"%d\" level=\"%d\"/>\n", GET_WEAP_SPEC(ch, idx).vnum, GET_WEAP_SPEC(ch, idx).level); } if (GET_TITLE(ch) && *GET_TITLE(ch)) { fprintf(ouf, "<title>%s</title>\n", xmlEncodeTmp(GET_TITLE(ch))); } if (GET_LEVEL(ch) >= 50) { fprintf(ouf, "<immort badge=\"%s\" qlog=\"%d\" invis=\"%d\"/>\n", xmlEncodeSpecialTmp(BADGE(ch)), GET_QLOG_LEVEL(ch), GET_INVIS_LVL(ch)); if (POOFIN(ch) && *POOFIN(ch)) fprintf(ouf, "<poofin>%s</poofin>\n", xmlEncodeTmp(POOFIN(ch))); if (POOFOUT(ch) && *POOFOUT(ch)) fprintf(ouf, "<poofout>%s</poofout>\n", xmlEncodeTmp(POOFOUT(ch))); } if (ch->player.description && *ch->player.description) { fprintf(ouf, "<description>%s</description>\n", xmlEncodeTmp(tmp_gsub(tmp_gsub(ch->player.description, "\r\n", "\n"), "\r", ""))); } for (cur_alias = ch->player_specials->aliases; cur_alias; cur_alias = cur_alias->next) fprintf(ouf, "<alias type=\"%d\" alias=\"%s\" replace=\"%s\"/>\n", cur_alias->type, xmlEncodeSpecialTmp(cur_alias->alias), xmlEncodeSpecialTmp(cur_alias->replacement)); for (struct affected_type *cur_aff = aff_stash->saved_affs; cur_aff; cur_aff = cur_aff->next) fprintf(ouf, "<affect type=\"%d\" duration=\"%d\" modifier=\"%d\" location=\"%d\" level=\"%d\" instant=\"%s\" affbits=\"%lx\" index=\"%d\" owner=\"%ld\"/>\n", cur_aff->type, cur_aff->duration, cur_aff->modifier, cur_aff->location, cur_aff->level, (cur_aff->is_instant) ? "yes" : "no", cur_aff->bitvector, cur_aff->aff_index, cur_aff->owner); if (!IS_IMMORT(ch)) { for (idx = 0; idx < MAX_SKILLS; idx++) if (ch->player_specials->saved.skills[idx] > 0) fprintf(ouf, "<skill name=\"%s\" level=\"%d\"/>\n", spell_to_str(idx), GET_SKILL(ch, idx)); write_tongue_xml(ch, ouf); for (GList * it = GET_RECENT_KILLS(ch); it; it = it->next) { struct kill_record *kill = it->data; fprintf(ouf, "<recentkill vnum=\"%d\" times=\"%d\"/>\n", kill->vnum, kill->times); } for (GList * it = GET_GRIEVANCES(ch); it; it = it->next) { struct grievance *grievance = it->data; fprintf(ouf, "<grievance time=\"%lu\" player=\"%d\" reputation=\"%d\" kind=\"%s\"/>\n", (long unsigned)grievance->time, grievance->player_id, grievance->rep, grievance_kind_descs[grievance->grievance]); } } if (IS_PC(ch) && ch->player_specials->tags) { GHashTableIter iter; char *key; g_hash_table_iter_init(&iter, ch->player_specials->tags); while (g_hash_table_iter_next(&iter, (gpointer *)&key, NULL)) { fprintf(ouf, "<tag tag=\"%s\"/>\n", key); } } fprintf(ouf, "</creature>\n"); fclose(ouf); // on success, move temp file on top of the old file rename(tmp_path, path); restore_creature_affects(ch, aff_stash); free(aff_stash); GET_HIT(ch) = MIN(GET_MAX_HIT(ch), hit); GET_MANA(ch) = MIN(GET_MAX_MANA(ch), mana); GET_MOVE(ch) = MIN(GET_MAX_MOVE(ch), move); }
/* * Alert: As of bpl14, this function returns the following codes: * < 0 Victim died. * = 0 No damage. * > 0 How much damage done. */ int damage(struct char_data *ch, struct char_data *victim, int dam, int attacktype) { if (GET_POS(victim) <= POS_DEAD) { /* This is "normal"-ish now with delayed extraction. -gg 3/15/2001 */ if (PLR_FLAGGED(victim, PLR_NOTDEADYET) || MOB_FLAGGED(victim, MOB_NOTDEADYET)) return (-1); log("SYSERR: Attempt to damage corpse '%s' in room #%d by '%s'.", GET_NAME(victim), GET_ROOM_VNUM(IN_ROOM(victim)), GET_NAME(ch)); die(victim); return (-1); /* -je, 7/7/92 */ } /* peaceful rooms */ if (ch != victim && ROOM_FLAGGED(IN_ROOM(ch), ROOM_PEACEFUL)) { send_to_char(ch, "This room just has such a peaceful, easy feeling...\r\n"); return (0); } /* shopkeeper protection */ if (!ok_damage_shopkeeper(ch, victim)) return (0); /* You can't damage an immortal! */ if (!IS_NPC(victim) && (GET_LEVEL(victim) >= LVL_IMMORT)) dam = 0; if (victim != ch) { /* Start the attacker fighting the victim */ if (GET_POS(ch) > POS_STUNNED && (FIGHTING(ch) == NULL)) set_fighting(ch, victim); /* Start the victim fighting the attacker */ if (GET_POS(victim) > POS_STUNNED && (FIGHTING(victim) == NULL)) { set_fighting(victim, ch); if (MOB_FLAGGED(victim, MOB_MEMORY) && !IS_NPC(ch)) remember(victim, ch); } } /* If you attack a pet, it hates your guts */ if (victim->master == ch) stop_follower(victim); /* If the attacker is invisible, he becomes visible */ if (AFF_FLAGGED(ch, AFF_INVISIBLE | AFF_HIDE)) appear(ch); /* Cut damage in half if victim has sanct, to a minimum 1 */ if (AFF_FLAGGED(victim, AFF_SANCTUARY) && dam >= 2) dam /= 2; /* Check for PK if this is not a PK MUD */ if (!pk_allowed) { check_killer(ch, victim); if (PLR_FLAGGED(ch, PLR_KILLER) && (ch != victim)) dam = 0; } /* Set the maximum damage per round and subtract the hit points */ dam = MAX(MIN(dam, 100), 0); GET_HIT(victim) -= dam; /* Gain exp for the hit */ if (ch != victim) gain_exp(ch, GET_LEVEL(victim) * dam); update_pos(victim); /* * skill_message sends a message from the messages file in lib/misc. * dam_message just sends a generic "You hit $n extremely hard.". * skill_message is preferable to dam_message because it is more * descriptive. * * If we are _not_ attacking with a weapon (i.e. a spell), always use * skill_message. If we are attacking with a weapon: If this is a miss or a * death blow, send a skill_message if one exists; if not, default to a * dam_message. Otherwise, always send a dam_message. */ if (!IS_WEAPON(attacktype)) skill_message(dam, ch, victim, attacktype); else { if (GET_POS(victim) == POS_DEAD || dam == 0) { if (!skill_message(dam, ch, victim, attacktype)) dam_message(dam, ch, victim, attacktype); } else { dam_message(dam, ch, victim, attacktype); } } /* Use send_to_char -- act() doesn't send message if you are DEAD. */ switch (GET_POS(victim)) { case POS_MORTALLYW: act("$n is mortally wounded, and will die soon, if not aided.", TRUE, victim, 0, 0, CommTarget::TO_ROOM); send_to_char(victim, "You are mortally wounded, and will die soon, if not aided.\r\n"); break; case POS_INCAP: act("$n is incapacitated and will slowly die, if not aided.", TRUE, victim, 0, 0, CommTarget::TO_ROOM); send_to_char(victim, "You are incapacitated an will slowly die, if not aided.\r\n"); break; case POS_STUNNED: act("$n is stunned, but will probably regain consciousness again.", TRUE, victim, 0, 0, CommTarget::TO_ROOM); send_to_char(victim, "You're stunned, but will probably regain consciousness again.\r\n"); break; case POS_DEAD: act("$n is dead! R.I.P.", FALSE, victim, 0, 0, CommTarget::TO_ROOM); send_to_char(victim, "You are dead! Sorry...\r\n"); break; default: /* >= POSITION SLEEPING */ if (dam > (GET_MAX_HIT(victim) / 4)) send_to_char(victim, "That really did HURT!\r\n"); if (GET_HIT(victim) < (GET_MAX_HIT(victim) / 4)) { send_to_char(victim, "%sYou wish that your wounds would stop BLEEDING so much!%s\r\n", CCRED(victim, C_SPR), CCNRM(victim, C_SPR)); if (ch != victim && MOB_FLAGGED(victim, MOB_WIMPY)) do_flee(victim, NULL, 0, 0); } if (!IS_NPC(victim) && GET_WIMP_LEV(victim) && (victim != ch) && GET_HIT(victim) < GET_WIMP_LEV(victim) && GET_HIT(victim) > 0) { send_to_char(victim, "You wimp out, and attempt to flee!\r\n"); do_flee(victim, NULL, 0, 0); } break; } /* Help out poor linkless people who are attacked */ if (!IS_NPC(victim) && !(victim->desc) && GET_POS(victim) > POS_STUNNED) { do_flee(victim, NULL, 0, 0); if (!FIGHTING(victim)) { act("$n is rescued by divine forces.", FALSE, victim, 0, 0, CommTarget::TO_ROOM); GET_WAS_IN(victim) = IN_ROOM(victim); char_from_room(victim); char_to_room(victim, 0); } } /* stop someone from fighting if they're stunned or worse */ if (GET_POS(victim) <= POS_STUNNED && FIGHTING(victim) != NULL) stop_fighting(victim); /* Uh oh. Victim died. */ if (GET_POS(victim) == POS_DEAD) { if (ch != victim && (IS_NPC(victim) || victim->desc)) { if (AFF_FLAGGED(ch, AFF_GROUP)) group_gain(ch, victim); else solo_gain(ch, victim); } if (!IS_NPC(victim)) { mudlog(BRF, LVL_IMMORT, TRUE, "%s killed by %s at %s", GET_NAME(victim), GET_NAME(ch), world[IN_ROOM(victim)].name); if (MOB_FLAGGED(ch, MOB_MEMORY)) forget(ch, victim); } die(victim); return (-1); } return (dam); }
/* * This function controls the change to maxmove, maxmana, and maxhp for * each char_class every time they gain a level. */ void advance_level(struct creature *ch, int8_t keep_internal) { int add_hp[2], add_mana[2], add_move[2], i, char_class; char *msg; add_hp[0] = add_hp[1] = constitution_hitpoint_bonus(GET_CON(ch)); add_mana[0] = add_mana[1] = wisdom_mana_bonus(GET_WIS(ch)); add_move[0] = add_move[1] = MAX(0, GET_CON(ch) - 15); for (i = 0; i < 2; i++) { if (i == 0) char_class = MIN(GET_CLASS(ch), NUM_CLASSES - 1); else char_class = MIN(GET_REMORT_CLASS(ch), NUM_CLASSES - 1); if (char_class < 0) continue; switch (char_class) { case CLASS_MAGIC_USER: add_hp[i] /= 5; add_hp[i] += number(3, 10); add_mana[i] += number(1, 11) + (GET_LEVEL(ch) / 3); add_move[i] += number(1, 3); break; case CLASS_CLERIC: add_hp[i] /= 2; add_hp[i] += number(5, 11); add_mana[i] += number(1, 10) + (GET_LEVEL(ch) / 5); add_move[i] += number(1, 4); break; case CLASS_BARD: add_hp[i] = add_hp[i] / 3; add_hp[i] += number(5, 10); add_mana[i] += number(1, 4) + (GET_LEVEL(ch) / 10); add_move[i] += number(10, 18); break; case CLASS_THIEF: add_hp[i] /= 3; add_hp[i] += number(4, 10); add_mana[i] = add_mana[i] * 3 / 10; add_move[i] += number(2, 6); break; case CLASS_MERCENARY: add_hp[i] += number(6, 14); add_mana[i] = add_mana[i] * 5 / 10; add_mana[i] += number(1, 5) + GET_LEVEL(ch) / 10; add_move[i] += number(3, 9); break; case CLASS_WARRIOR: add_hp[i] += number(10, 15); add_mana[i] = add_mana[i] * 4 / 10; add_mana[i] += number(1, 5); add_move[i] += number(5, 10); break; case CLASS_BARB: add_hp[i] += number(13, 18); add_mana[i] = add_mana[i] * 3 / 10; add_mana[i] += number(0, 3); add_move[i] += number(5, 10); break; case CLASS_KNIGHT: add_hp[i] += number(7, 13); add_mana[i] = add_mana[i] * 7 / 10; add_mana[i] += number(1, 4) + (GET_LEVEL(ch) / 15); add_move[i] += number(3, 8); break; case CLASS_RANGER: add_hp[i] += number(4, 11); add_mana[i] = add_mana[i] * 6 / 10; add_mana[i] += number(1, 6) + (GET_LEVEL(ch) / 8); add_move[i] += number(6, 14); break; case CLASS_PSIONIC: add_hp[i] /= 3; add_hp[i] += number(3, 8); add_mana[i] = add_mana[i] * 6 / 10; add_mana[i] += number(1, 7) + (GET_LEVEL(ch) / 5); add_move[i] += number(2, 6); break; case CLASS_PHYSIC: add_hp[i] /= 4; add_hp[i] += number(4, 9); add_mana[i] = add_mana[i] * 6 / 10; add_mana[i] += number(1, 6) + (GET_LEVEL(ch) / 3); add_move[i] += number(2, 10); break; case CLASS_CYBORG: add_hp[i] /= 2; add_hp[i] += number(6, 14); add_mana[i] = add_mana[i] * 3 / 10; add_mana[i] += number(1, 2) + (GET_LEVEL(ch) / 15); add_move[i] += number(5, 8); break; case CLASS_MONK: add_hp[i] /= 3; add_hp[i] += number(6, 12); add_mana[i] = add_mana[i] * 3 / 10; add_mana[i] += number(1, 2) + (GET_LEVEL(ch) / 22); add_move[i] += number(6, 9); break; default: add_hp[i] /= 2; add_hp[i] += number(5, 16); add_mana[i] = add_mana[i] * 5 / 10; add_mana[i] += number(1, 13) + (GET_LEVEL(ch) / 4); add_move[i] += number(7, 15); break; } } if (IS_RACE(ch, RACE_HALF_ORC) || IS_RACE(ch, RACE_ORC)) { add_move[0] *= 2; add_move[1] *= 2; } ch->points.max_hit += MAX(1, add_hp[0]); ch->points.max_move += MAX(1, add_move[0]); if (GET_LEVEL(ch) > 1) ch->points.max_mana += add_mana[0]; GET_LIFE_POINTS(ch) += (GET_LEVEL(ch) * (GET_WIS(ch) + GET_CON(ch))) / 300; if (PLR_FLAGGED(ch, PLR_HARDCORE)) GET_LIFE_POINTS(ch) += 1; if (IS_REMORT(ch) && GET_REMORT_GEN(ch)) { if (add_hp[0] < 0 || add_hp[1] < 0) { errlog("remort level (%s) add_hp: [0]=%d,[1]=%d", GET_NAME(ch), add_hp[0], add_hp[1]); } ch->points.max_hit += add_hp[1] / 4; ch->points.max_mana += add_mana[1] / 2; ch->points.max_move += add_move[1] / 4; } if (GET_LEVEL(ch) >= LVL_AMBASSADOR) { for (i = 0; i < 3; i++) GET_COND(ch, i) = -1; SET_BIT(PRF_FLAGS(ch), PRF_HOLYLIGHT); SET_BIT(PRF_FLAGS(ch), PRF_NOHASSLE); } if (GET_LEVEL(ch) == 10) SET_BIT(PRF2_FLAGS(ch), PRF2_NEWBIE_HELPER); // special section for improving read_scrolls and use_wands if (CHECK_SKILL(ch, SKILL_READ_SCROLLS) > 10) SET_SKILL(ch, SKILL_READ_SCROLLS, MIN(100, CHECK_SKILL(ch, SKILL_READ_SCROLLS) + MIN(10, number(1, GET_INT(ch) / 2)))); if (CHECK_SKILL(ch, SKILL_USE_WANDS) > 10) SET_SKILL(ch, SKILL_USE_WANDS, MIN(100, CHECK_SKILL(ch, SKILL_USE_WANDS) + MIN(10, number(1, GET_INT(ch) / 2)))); crashsave(ch); int rid = -1; if (ch->in_room != NULL) rid = ch->in_room->number; msg = tmp_sprintf("%s advanced to level %d in room %d%s", GET_NAME(ch), GET_LEVEL(ch), rid, is_tester(ch) ? " <TESTER>" : ""); if (keep_internal) slog("%s", msg); else mudlog(GET_INVIS_LVL(ch), BRF, true, "%s", msg); }
void beat_punish(CHAR_DATA * i) { int restore; // Проверяем на выпуск чара из кутузки if (PLR_FLAGGED(i, PLR_HELLED) && HELL_DURATION(i) && HELL_DURATION(i) <= time(NULL)) { restore = PLR_TOG_CHK(i, PLR_HELLED); if (HELL_REASON(i)) free(HELL_REASON(i)); HELL_REASON(i) = 0; GET_HELL_LEV(i) = 0; HELL_GODID(i) = 0; HELL_DURATION(i) = 0; send_to_char("Вас выпустили из темницы.\r\n", i); if ((restore = GET_LOADROOM(i)) == NOWHERE) restore = calc_loadroom(i); restore = real_room(restore); if (restore == NOWHERE) { if (GET_LEVEL(i) >= LVL_IMMORT) restore = r_immort_start_room; else restore = r_mortal_start_room; } char_from_room(i); char_to_room(i, restore); look_at_room(i, restore); act("Насвистывая \"От звонка до звонка...\", $n появил$u в центре комнаты.", FALSE, i, 0, 0, TO_ROOM); } if (PLR_FLAGGED(i, PLR_NAMED) && NAME_DURATION(i) && NAME_DURATION(i) <= time(NULL)) { restore = PLR_TOG_CHK(i, PLR_NAMED); if (NAME_REASON(i)) free(NAME_REASON(i)); NAME_REASON(i) = 0; GET_NAME_LEV(i) = 0; NAME_GODID(i) = 0; NAME_DURATION(i) = 0; send_to_char("Вас выпустили из КОМНАТЫ ИМЕНИ.\r\n", i); if ((restore = GET_LOADROOM(i)) == NOWHERE) restore = calc_loadroom(i); restore = real_room(restore); if (restore == NOWHERE) { if (GET_LEVEL(i) >= LVL_IMMORT) restore = r_immort_start_room; else restore = r_mortal_start_room; } char_from_room(i); char_to_room(i, restore); look_at_room(i, restore); act("С ревом \"Имья, сестра, имья...\", $n появил$u в центре комнаты.", FALSE, i, 0, 0, TO_ROOM); } if (PLR_FLAGGED(i, PLR_MUTE) && MUTE_DURATION(i) != 0 && MUTE_DURATION(i) <= time(NULL)) { restore = PLR_TOG_CHK(i, PLR_MUTE); if (MUTE_REASON(i)) free(MUTE_REASON(i)); MUTE_REASON(i) = 0; GET_MUTE_LEV(i) = 0; MUTE_GODID(i) = 0; MUTE_DURATION(i) = 0; send_to_char("Вы можете орать.\r\n", i); } if (PLR_FLAGGED(i, PLR_DUMB) && DUMB_DURATION(i) != 0 && DUMB_DURATION(i) <= time(NULL)) { restore = PLR_TOG_CHK(i, PLR_DUMB); if (DUMB_REASON(i)) free(DUMB_REASON(i)); DUMB_REASON(i) = 0; GET_DUMB_LEV(i) = 0; DUMB_GODID(i) = 0; DUMB_DURATION(i) = 0; send_to_char("Вы можете говорить.\r\n", i); } if (!PLR_FLAGGED(i, PLR_REGISTERED) && UNREG_DURATION(i) != 0 && UNREG_DURATION(i) <= time(NULL)) { restore = PLR_TOG_CHK(i, PLR_REGISTERED); if (UNREG_REASON(i)) free(UNREG_REASON(i)); UNREG_REASON(i) = 0; GET_UNREG_LEV(i) = 0; UNREG_GODID(i) = 0; UNREG_DURATION(i) = 0; send_to_char("Ваша регистрация восстановлена.\r\n", i); if (IN_ROOM(i) == r_unreg_start_room) { if ((restore = GET_LOADROOM(i)) == NOWHERE) restore = calc_loadroom(i); restore = real_room(restore); if (restore == NOWHERE) { if (GET_LEVEL(i) >= LVL_IMMORT) restore = r_immort_start_room; else restore = r_mortal_start_room; } char_from_room(i); char_to_room(i, restore); look_at_room(i, restore); act("$n появил$u в центре комнаты, с гордостью показывая всем штампик регистрации!", FALSE, i, 0, 0, TO_ROOM); }; } if (GET_GOD_FLAG(i, GF_GODSLIKE) && GCURSE_DURATION(i) != 0 && GCURSE_DURATION(i) <= time(NULL)) { CLR_GOD_FLAG(i, GF_GODSLIKE); send_to_char("Вы более не под защитой Богов.\r\n", i); } if (GET_GOD_FLAG(i, GF_GODSCURSE) && GCURSE_DURATION(i) != 0 && GCURSE_DURATION(i) <= time(NULL)) { CLR_GOD_FLAG(i, GF_GODSCURSE); send_to_char("Боги более не в обиде на вас.\r\n", i); } if (PLR_FLAGGED(i, PLR_FROZEN) && FREEZE_DURATION(i) != 0 && FREEZE_DURATION(i) <= time(NULL)) { restore = PLR_TOG_CHK(i, PLR_FROZEN); if (FREEZE_REASON(i)) free(FREEZE_REASON(i)); FREEZE_REASON(i) = 0; GET_FREEZE_LEV(i) = 0; FREEZE_GODID(i) = 0; FREEZE_DURATION(i) = 0; send_to_char("Вы оттаяли.\r\n", i); Glory::remove_freeze(GET_UNIQUE(i)); } // Проверяем а там ли мы где должны быть по флагам. if (IN_ROOM(i) == STRANGE_ROOM) restore = i->get_was_in_room(); else restore = IN_ROOM(i); if (PLR_FLAGGED(i, PLR_HELLED)) { if (restore != r_helled_start_room) { if (IN_ROOM(i) == STRANGE_ROOM) i->set_was_in_room(r_helled_start_room); else { send_to_char("Чья-то злая воля вернула вас в темницу.\r\n", i); act("$n возвращен$a в темницу.", FALSE, i, 0, 0, TO_ROOM); char_from_room(i); char_to_room(i, r_helled_start_room); look_at_room(i, r_helled_start_room); i->set_was_in_room(NOWHERE); }; } } else if (PLR_FLAGGED(i, PLR_NAMED)) { if (restore != r_named_start_room) { if (IN_ROOM(i) == STRANGE_ROOM) i->set_was_in_room(r_named_start_room); else { send_to_char("Чья-то злая воля вернула вас в комнату имени.\r\n", i); act("$n возвращен$a в комнату имени.", FALSE, i, 0, 0, TO_ROOM); char_from_room(i); char_to_room(i, r_named_start_room); look_at_room(i, r_named_start_room); i->set_was_in_room(NOWHERE); }; }; } else if (!RegisterSystem::is_registered(i) && i->desc && STATE(i->desc) == CON_PLAYING) { if (restore != r_unreg_start_room && !RENTABLE(i) && !DeathTrap::is_slow_dt(IN_ROOM(i)) && !check_dupes_host(i->desc, 1)) { if (IN_ROOM(i) == STRANGE_ROOM) i->set_was_in_room(r_unreg_start_room); else { act("$n водворен$a в комнату для незарегистрированных игроков, играющих через прокси.\r\n", FALSE, i, 0, 0, TO_ROOM); char_from_room(i); char_to_room(i, r_unreg_start_room); look_at_room(i, r_unreg_start_room); i->set_was_in_room(NOWHERE); }; } else if (restore == r_unreg_start_room && check_dupes_host(i->desc, 1) && !IS_IMMORTAL(i)) { send_to_char("Неведомая вытолкнула вас из комнаты для незарегистрированных игроков.\r\n", i); act("$n появил$u в центре комнаты, правда без штампика регистрации...\r\n", FALSE, i, 0, 0, TO_ROOM); restore = i->get_was_in_room(); if (restore == NOWHERE || restore == r_unreg_start_room) { restore = GET_LOADROOM(i); if (restore == NOWHERE) restore = calc_loadroom(i); restore = real_room(restore); } char_from_room(i); char_to_room(i, restore); look_at_room(i, restore); i->set_was_in_room(NOWHERE); } } }
/* * Remove an affected_type structure from a char (called when duration * reaches zero). Pointer *af must never be NIL! Frees mem and calls * affect_location_apply */ void affect_remove(struct char_data * ch, struct affected_type * af, int output) { struct affected_type *temp; struct affected_type aff; bool accum_affect = FALSE; int k; if (ch->affected == NULL) { core_dump(); return; } switch (af->type) { case SPELL_CHARM: { struct char_data* victim = ch->master; if (output == 0) break; affect_modify(ch, af->location, af->modifier, af->bitvector, FALSE); REMOVE_FROM_LIST(af, ch->affected, next); free(af); affect_total(ch); if (ch->master) { stop_follower(ch); } if (victim) { if(IS_NPC(ch)) { SET_BIT(MOB_FLAGS(ch), MOB_AGGRESSIVE | MOB_MEMORY); } if (mag_savingthrow(victim, SAVING_SPELL)) { hit(victim, ch, TYPE_UNDEFINED); } } return; } case SPELL_LIGHT: if (output == 0) break; if (!af->next || (af->next->type != af->type) || (af->next->duration > 0)) { if (world[ch->in_room].name != (char*) NULL) { world[ch->in_room].light -= 10; } } break; case SPELL_DARKNESS: if (output == 0) break; if (!af->next || (af->next->type != af->type) || (af->next->duration > 0)) { if (world[ch->in_room].name != (char*) NULL) { world[ch->in_room].light += 10; } } break; case SPELL_BLACK_PLAGUE: mag_affects(30, ch, ch, SPELL_BREATH_OF_LIFE, SAVING_SPELL); break; case SPELL_CALL_ANIMAL_SPIRIT: case SPELL_ANIMAL_SUMMONING: case SPELL_ANIMAL_SUMMONING_II: case SPELL_ANIMAL_SUMMONING_III: case SPELL_CONJURE_ELEMENTAL: case SPELL_GREATER_ELEMENTAL: case SPELL_DUST_DEVIL: case SPELL_STICKS_TO_SNAKES: case SPELL_SUMMON_INSECTS: case SPELL_AERIAL_SERVANT: case SPELL_SUMMON_GUARD: if (IS_NPC(ch)) { if (GET_POS(ch) > POS_DEAD) { if (output == 1) { affect_modify(ch, af->location, af->modifier, af->bitvector, FALSE); REMOVE_FROM_LIST(af, ch->affected, next); free(af); affect_total(ch); GET_NAME(ch, chname); stop_fighting(ch); /*Fighting Bug Fix Jasrags*/ sprintf(buf, "%s disappears into thin air as the summoning ends.", chname); act(buf, FALSE, world[ch->in_room].people, 0, 0, TO_ROOM); FREE_NAME(chname); extract_char(ch); ch = NULL; return; } } } break; case SPELL_POLYMORPH: if (!PRF_FLAGGED(ch, PRF_NOTSELF)) { affect_modify(ch, af->location, af->modifier, af->bitvector, FALSE); REMOVE_FROM_LIST(af, ch->affected, next); free(af); affect_total(ch); return; } break; case SPELL_DONTUSEME: if(AFF_FLAGGED(ch, AFF_STANCE) && !AFF_FLAGGED(ch, AFF_TIRED)) { aff.type = SKILL_STANCE; aff.duration = 2; aff.location = APPLY_STR; aff.modifier = -2; aff.bitvector = AFF_TIRED; accum_affect = FALSE; affect_to_char(ch, &aff); } break; default: break; } if (output && (af->type > 0) && (af->type <= MAX_SPELLS) && af->type != SPELL_POLYMORPH && af->type != SPELL_DONTUSEME) { if (!af->next || (af->next->type != af->type) || (af->next->duration > 0)) { if (*spell_wear_off_msg[af->type]) { send_to_char(spell_wear_off_msg[af->type], ch); send_to_char("\r\n", ch); } } } if (output && (af->type > 0) && (af->type <= MAX_SPELLS) && af->type == SPELL_POLYMORPH) { if (!af->next || (af->next->type != af->type) || (af->next->duration > 0)) { if (PLR_FLAGGED(ch, PLR_RABBIT)){ REMOVE_BIT(PLR_FLAGS(ch), PLR_RABBIT); REMOVE_BIT(PRF_FLAGS(ch), PRF_NOTSELF); send_to_char("You feel yourself growing, and your ears shrinking. You no longer feel like a rabbit.\r\n", ch); act("$n's body grows, $s ears shrinking. $n no longer looks like a rabbit.\r\n", 0, ch, 0, 0, TO_ROOM); } if (PLR_FLAGGED(ch, PLR_BIRD)) { REMOVE_BIT(PLR_FLAGS(ch), PLR_BIRD); REMOVE_BIT(PRF_FLAGS(ch), PRF_NOTSELF); send_to_char("You feel yourself growing and your feathers falling away. You no longer feel like a bird.\r\n", ch); act("$n's body grows, $s feathers falling away as it expands. $n no longer looks like a bird.\r\n", 0, ch, 0, 0, TO_ROOM); } if (PLR_FLAGGED(ch, PLR_WOLF)) { REMOVE_BIT(PLR_FLAGS(ch), PLR_WOLF); REMOVE_BIT(PRF_FLAGS(ch), PRF_NOTSELF); send_to_char("You feel your your fur shed and your teeth shrink. You no longer feel like a wolf.\r\n", ch); act("$n's teeth shrink, $s fur shedding. $n no longer looks like a wolf.\r\n", 0, ch, 0, 0, TO_ROOM); } if (PLR_FLAGGED(ch, PLR_BEAR)) { REMOVE_BIT(PLR_FLAGS(ch), PLR_BEAR); REMOVE_BIT(PRF_FLAGS(ch), PRF_NOTSELF); send_to_char("Your claws shrink as does the rest of your body. You no longer feel like a bear.\r\n", ch); act("$n's claws shrink as does the rest of $s body. $n no longer looks like a bear.\r\n", 0, ch, 0, 0, TO_ROOM); } if (PLR_FLAGGED(ch, PLR_CAT)){ REMOVE_BIT(PLR_FLAGS(ch), PLR_CAT); REMOVE_BIT(PRF_FLAGS(ch), PRF_NOTSELF); send_to_char("You feel your body growing, and your fur shedding. You no longer feel like a cat.\r\n", ch); act("$n's body slowly grows, $s fur shedding. $n no longer looks like a cat.\r\n", 0, ch, 0, 0, TO_ROOM); } for (k = 0; k < NUM_WEARS; k++) if (GET_EQ(ch, k)){ GET_OBJ_DISGUISE(GET_EQ(ch, k)) = 0; } } } affect_modify(ch, af->location, af->modifier, af->bitvector, FALSE); REMOVE_FROM_LIST(af, ch->affected, next); free(af); affect_total(ch); }