// вывод списка неодобренных имму void NewNameShow(CHAR_DATA * ch) { if (NewNameList.empty()) return; std::ostringstream buffer; buffer << "\r\nИгроки, ждущие одобрения имени (имя <игрок> одобрить/запретить/удалить):\r\n" << CCWHT(ch, C_NRM); for (NewNameListType::const_iterator it = NewNameList.begin(); it != NewNameList.end(); ++it) buffer << "Имя: " << it->first << " " << it->second->name0 << "/" << it->second->name1 << "/" << it->second->name2 << "/" << it->second->name3 << "/" << it->second->name4 << "/" << it->second->name5 << " Email: &S" << (GET_GOD_FLAG(ch, GF_DEMIGOD) ? "неопределен" : it->second->email) << "&s Пол: " << genders[it->second->sex] << "\r\n"; buffer << CCNRM(ch, C_NRM); send_to_char(buffer.str(), ch); }
int day_spell_modifier(CHAR_DATA * ch, int spellnum, int type, int value) { int modi = value; if (IS_NPC(ch) || IN_ROOM(ch) == NOWHERE) return (modi); switch (type) { case GAPPLY_SPELL_SUCCESS: modi = modi * (100 + moon_modifiers[weather_info.moon_day]) / 100; break; case GAPPLY_SPELL_EFFECT: break; } if (IS_IMMORTAL(ch) || GET_GOD_FLAG(ch, GF_GODSLIKE)) modi = MAX(modi, value); return (modi); }
void update_clan_exp(CHAR_DATA *ch, int gain) { if (CLAN(ch) && gain != 0) { // экспа для уровня клана (+ только на праве, - любой, но /5) if (gain < 0 || GET_GOD_FLAG(ch, GF_REMORT)) { int tmp = gain > 0 ? gain : gain / 5; CLAN(ch)->SetClanExp(ch, tmp); } // экспа для топа кланов за месяц (учитываются все + и -) CLAN(ch)->last_exp.add_temp(gain); // экспа для топа кланов за все время (учитываются все + и -) CLAN(ch)->AddTopExp(ch, gain); // экспа для авто-очистки кланов (учитываются только +) if (gain > 0) { CLAN(ch)->exp_history.add_exp(gain); } } }
void gain_exp(CHAR_DATA * ch, int gain) { int is_altered = FALSE; int num_levels = 0; char buf[128]; if (IS_NPC(ch)) { ch->set_exp(ch->get_exp() + gain); return; } else { ch->dps_add_exp(gain); ZoneExpStat::add(zone_table[world[IN_ROOM(ch)]->zone].number, gain); } if (!IS_NPC(ch) && ((GET_LEVEL(ch) < 1 || GET_LEVEL(ch) >= LVL_IMMORT))) return; if (gain > 0 && GET_LEVEL(ch) < LVL_IMMORT) { gain = MIN(max_exp_gain_pc(ch), gain); // put a cap on the max gain per kill ch->set_exp(ch->get_exp() + gain); if (GET_EXP(ch) >= level_exp(ch, LVL_IMMORT)) { if (!GET_GOD_FLAG(ch, GF_REMORT) && GET_REMORT(ch) < MAX_REMORT) { if (Remort::can_remort_now(ch)) { send_to_char(ch, "%sПоздравляем, вы получили право на перевоплощение!%s\r\n", CCIGRN(ch, C_NRM), CCNRM(ch, C_NRM)); } else { send_to_char(ch, "%sПоздравляем, вы набрали максимальное количество опыта!\r\n" "%s%s\r\n", CCIGRN(ch, C_NRM), Remort::WHERE_TO_REMORT_STR.c_str(), CCNRM(ch, C_NRM)); } SET_GOD_FLAG(ch, GF_REMORT); } } ch->set_exp(MIN(GET_EXP(ch), level_exp(ch, LVL_IMMORT) - 1)); while (GET_LEVEL(ch) < LVL_IMMORT && GET_EXP(ch) >= level_exp(ch, GET_LEVEL(ch) + 1)) { ch->set_level(ch->get_level() + 1); num_levels++; sprintf(buf, "%sВы достигли следующего уровня!%s\r\n", CCWHT(ch, C_NRM), CCNRM(ch, C_NRM)); send_to_char(buf, ch); advance_level(ch); is_altered = TRUE; } if (is_altered) { sprintf(buf, "%s advanced %d level%s to level %d.", GET_NAME(ch), num_levels, num_levels == 1 ? "" : "s", GET_LEVEL(ch)); mudlog(buf, BRF, LVL_IMPL, SYSLOG, TRUE); } } else if (gain < 0 && GET_LEVEL(ch) < LVL_IMMORT) { gain = MAX(-max_exp_loss_pc(ch), gain); // Cap max exp lost per death ch->set_exp(ch->get_exp() + gain); while (GET_LEVEL(ch) > 1 && GET_EXP(ch) < level_exp(ch, GET_LEVEL(ch))) { ch->set_level(ch->get_level() - 1); num_levels++; sprintf(buf, "%sВы потеряли уровень. Вам должно быть стыдно!%s\r\n", CCIRED(ch, C_NRM), CCNRM(ch, C_NRM)); send_to_char(buf, ch); decrease_level(ch); is_altered = TRUE; } if (is_altered) { sprintf(buf, "%s decreases %d level%s to level %d.", GET_NAME(ch), num_levels, num_levels == 1 ? "" : "s", GET_LEVEL(ch)); mudlog(buf, BRF, LVL_IMPL, SYSLOG, TRUE); } } if ((GET_EXP(ch) < level_exp(ch, LVL_IMMORT) - 1) && GET_GOD_FLAG(ch, GF_REMORT) && gain && (GET_LEVEL(ch) < LVL_IMMORT)) { if (Remort::can_remort_now(ch)) { send_to_char(ch, "%sВы потеряли право на перевоплощение!%s\r\n", CCIRED(ch, C_NRM), CCNRM(ch, C_NRM)); } CLR_GOD_FLAG(ch, GF_REMORT); } char_stat::add_class_exp(GET_CLASS(ch), gain); update_clan_exp(ch, gain); }
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); } } }