void perform_tell(CHAR_DATA * ch, CHAR_DATA * vict, char *arg) { // shapirus: не позволим телять, если жертва не видит и включила // соответствующий режим; имморталы могут телять всегда if (PRF_FLAGGED(vict, PRF_NOINVISTELL) && !CAN_SEE(vict, ch) && GET_LEVEL(ch) < LVL_IMMORT && !PRF_FLAGGED(ch, PRF_CODERINFO)) { act("$N не любит разговаривать с теми, кого не видит.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); return; } // TODO: если в act() останется показ иммов, то это и эхо ниже переделать на act() if (tell_can_see(ch, vict)) { snprintf(buf, MAX_STRING_LENGTH, "%s сказал%s вам : '%s'", GET_NAME(ch), GET_CH_SUF_1(ch), arg); } else { snprintf(buf, MAX_STRING_LENGTH, "Кто-то сказал вам : '%s'", arg); } snprintf(buf1, MAX_STRING_LENGTH, "%s%s%s\r\n", CCICYN(vict, C_NRM), CAP(buf), CCNRM(vict, C_NRM)); send_to_char(buf1, vict); if (!IS_NPC(vict)) { vict->remember_add(buf1, Remember::ALL); } if (!IS_NPC(vict) && !IS_NPC(ch)) { snprintf(buf, MAX_STRING_LENGTH, "%s%s : '%s'%s\r\n", CCICYN(ch, C_NRM), tell_can_see(ch, vict) ? GET_NAME(ch) : "Кто-то", arg, CCNRM(ch, C_NRM)); vict->remember_add(buf, Remember::PERSONAL); } if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOREPEAT)) { send_to_char(OK, ch); } else { snprintf(buf, MAX_STRING_LENGTH, "%sВы сказали %s : '%s'%s\r\n", CCICYN(ch, C_NRM), tell_can_see(vict, ch) ? vict->player_data.PNames[2] : "кому-то", arg, CCNRM(ch, C_NRM)); send_to_char(buf, ch); if (!IS_NPC(ch)) { ch->remember_add(buf, Remember::ALL); } } if (!IS_NPC(vict) && !IS_NPC(ch)) { vict->set_answer_id(GET_IDNUM(ch)); } }
void handle_recall_spells(CHAR_DATA* ch) { AFFECT_DATA* aff = NULL; for(AFFECT_DATA* af = ch->affected; af; af = af->next) if (af->type == SPELL_RECALL_SPELLS) { aff = af; break; } if (!aff) return; //максимальный доступный чару круг unsigned max_slot = get_max_slot(ch); //обрабатываем только каждые RECALL_SPELLS_INTERVAL секунд int secs_left = (SECS_PER_PLAYER_AFFECT*aff->duration)/SECS_PER_MUD_HOUR -SECS_PER_PLAYER_AFFECT; if (secs_left / RECALL_SPELLS_INTERVAL < max_slot -aff->modifier || secs_left <= 2) { int slot_to_restore = aff->modifier++; bool found_spells = false; struct spell_mem_queue_item *next = NULL, *prev=NULL, *i = ch->MemQueue.queue; while (i) { next = i->link; if (spell_info[i->spellnum].slot_forc[(int) GET_CLASS(ch)][(int) GET_KIN(ch)] == slot_to_restore) { if (!found_spells) { send_to_char("Ваша голова прояснилась, в памяти всплыло несколько новых заклинаний.\r\n", ch); found_spells = true; } if (prev) prev->link = next; if (i == ch->MemQueue.queue) { ch->MemQueue.queue = next; GET_MEM_COMPLETED(ch) = 0; } GET_MEM_TOTAL(ch) = MAX(0, GET_MEM_TOTAL(ch) - mag_manacost(ch, i->spellnum)); sprintf(buf, "Вы вспомнили заклинание \"%s%s%s\".\r\n", CCICYN(ch, C_NRM), spell_info[i->spellnum].name, CCNRM(ch, C_NRM)); send_to_char(buf, ch); GET_SPELL_MEM(ch, i->spellnum)++; free(i); } else prev = i; i = next; } } }