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 flag_show_scores(void) { FlagPlayer **scores, *p; int players = theGame.gold.size + theGame.black.size + theGame.rogue.size; int count = 0, gc = 0, bc = 0, gk = 0, bk = 0, gr = 0, br = 0; /* print out the headers */ quest_echo("&14 Name "); quest_echo("&07|&14 Kills &07|&14 Caps &07|&14 Rets&00\r\n"); quest_echo("&07-----------------------------------"); quest_echo("+-------+-------+-------&00\r\n"); /* sort all players by #kills, via insert sort */ /* (very small n suggests O(n^2) may be close to O(nlogn) here) */ scores = (FlagPlayer **)malloc(players * sizeof(FlagPlayer *)); for (p = theGame.gold.players; p; p = p->next) flag_insert_score(scores, count++, p); for (p = theGame.black.players; p; p = p->next) flag_insert_score(scores, count++, p); for (p = theGame.rogue.players; p; p = p->next) flag_insert_score(scores, count++, p); /* now dump that list of scores via quest_echo() */ for (count = 0; count < players; count++) { char nbuf[MAX_NAME_LENGTH + 9]; sprintf(nbuf, "%s %s", GET_NAME(scores[count]->ch), flag_get_team_name(scores[count]->ch)); sprintf(buf, " %-40s&07|&00 %-3d &07|&00 %-3d &07|&00 %d\r\n", nbuf, scores[count]->kills, scores[count]->caps, scores[count]->returns); quest_echo(buf); if (PRF_FLAGGED(scores[count]->ch, PRF_GOLD_TEAM)) { gc += scores[count]->caps; gk += scores[count]->kills; gr += scores[count]->returns; } else if (PRF_FLAGGED(scores[count]->ch, PRF_BLACK_TEAM)) { bc += scores[count]->caps; bk += scores[count]->kills; br += scores[count]->returns; } } quest_echo("&07-----------------------------------"); quest_echo("+-------+-------+-------&00\r\n"); quest_echo("&03 Gold team total &07|&00 "); sprintf(buf, "%-3d &07|&00 %-3d &07|&00 %-3d\r\n", gk, gc, gr); quest_echo(buf); quest_echo("&05 Black team total &07|&00 "); sprintf(buf, "%-3d &07|&00 %-3d &07|&00 %-3d\r\n", bk, bc, br); quest_echo(buf); free(scores); }
static char *flag_get_team_name(CharData *ch) { static char *black = "&05(black)&00"; static char *gold = "&03(gold) &00"; static char *rogue = "&08(rogue)&00"; static char *none = " "; if (PRF_FLAGGED(ch, PRF_GOLD_TEAM)) return gold; if (PRF_FLAGGED(ch, PRF_BLACK_TEAM)) return black; if (PRF_FLAGGED(ch, PRF_ROGUE_TEAM)) return rogue; return none; }
bool can_see_creature(struct creature * self, struct creature * vict) { // Can always see self if (self == vict) return true; // Immortals players can always see non-immortal players if (IS_IMMORT(self) && !IS_IMMORT(vict)) return true; //only immortals can see utility mobs if (IS_NPC(vict) && NPC_FLAGGED(vict, NPC_UTILITY) && !IS_IMMORT(self)) { return false; } // Nothing at all gets through immort invis if (IS_IMMORT(vict) && GET_LEVEL(self) < GET_INVIS_LVL(vict)) return false; if (PRF_FLAGGED(self, PRF_HOLYLIGHT)) return true; if (!check_sight_self(self)) return false; if (!check_sight_room(self, vict->in_room)) return false; if (!check_sight_vict(self, vict)) return false; return true; }
// Returns true if a creature can see an object bool check_sight_object(struct creature * self, struct obj_data * obj) { if (PRF_FLAGGED(self, PRF_HOLYLIGHT)) return true; if (!OBJ_APPROVED(obj) && !NPC2_FLAGGED(self, NPC2_UNAPPROVED) && !IS_IMMORT(self) && !is_authorized(self, TESTER, NULL)) return false; if (IS_OBJ_STAT(obj, ITEM_TRANSPARENT) && !(AFF3_FLAGGED(self, AFF3_SONIC_IMAGERY) || AFF_FLAGGED(self, AFF_RETINA) || affected_by_spell(self, ZEN_AWARENESS))) return false; if (AFF_FLAGGED(self, AFF_DETECT_INVIS) || AFF2_FLAGGED(self, AFF2_TRUE_SEEING)) return true; if (IS_OBJ_STAT(obj, ITEM_INVISIBLE)) return false; return true; }
void Character::SendTell(Character *target, char *arg) { target->send(COLOR_RED(target, CL_NORMAL)); sprintf(buf, "$n tells you, '%s'", (char*)this->ScrambleSpeech(arg, target).c_str()); Act(buf, FALSE, this, 0, target, TO_VICT | TO_SLEEP); target->send(COLOR_NORMAL(target, CL_NORMAL)); if(!IS_NPC(target) && NEWB_FLAGGED(target, NEW_TELL) && !IS_NPC(this)) { REMOVE_BIT_AR(NEWB_FLAGS(target), NEW_TELL); target->NewbieTip("You can reply to %s by typing 'reply' followed by the message you wish to send.\r\n", GET_NAME(this), GET_NAME(this)); } if (!IS_NPC(this) && PRF_FLAGGED(this, PRF_NOREPEAT)) this->send(OK); else { CommManager::GetManager().SaveComm(std::string("tell"), arg, this, this->in_room->getVnum(), target); sprintf(buf, "You tell $N, '%s'", arg); Act(buf, FALSE, this, 0, target, TO_CHAR); if(IS_NPC(target) && !IS_NPC(this)) MudLog(CMP, MAX(GET_LEVEL(this), LVL_GOD), TRUE, "%s tells %s '%s' in room %d.", GET_NAME(this), GET_NAME(target), arg, this->in_room->getVnum()); if(this->IsIgnoring(target->player.name)) this->RemoveIgnore(target->player.name); } if (!IS_NPC(target) && !IS_NPC(this)) target->last_tell = this->player.idnum; js_tell_triggers(this, target, arg); }
bool has_dark_sight(struct creature * self) { return (AFF_FLAGGED(self, AFF_INFRAVISION) || PRF_FLAGGED(self, PRF_HOLYLIGHT) || AFF3_FLAGGED(self, AFF3_SONIC_IMAGERY) || AFF_FLAGGED(self, AFF_RETINA) || CHECK_SKILL(self, SKILL_NIGHT_VISION)); }
struct char_data *get_char_room_vis(struct char_data * ch, char *name) { struct char_data *i; int j = 0, number; char tmpname[MAX_INPUT_LENGTH]; char *tmp = tmpname; /* JE 7/18/94 :-) :-) */ if (!str_cmp(name, "self") || !str_cmp(name, "me")) return ch; strcpy(tmp, name); if (!(number = get_number(&tmp))) { number = 1; tmp = name; } for (i = world[ch->in_room].people; i && j <= number; i = i->next_in_room) { if (PRF_FLAGGED(i, PRF_NOTSELF) && !PRF_FLAGGED(ch, PRF_DETECT) && !IS_NPC(ch)) { if (isname(tmp, i->char_specials.name_dis)) if (CAN_SEE(ch, i)) if (++j == number) return i; } else if (!IS_APPROVED(i) && !IS_NPC(i)) { GET_NAME(i, chname); if ((isname(tmp, current_short_desc(i)) || isname(tmp, chname)) && CAN_SEE(ch, i)) if (++j == number) return (i); FREE_NAME(chname); } else { if (isname(tmp, i->player.name)) if (CAN_SEE(ch, i)) if (++j == number) return i; } } return NULL; }
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); }
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); }
struct char_data *get_char_vis(struct char_data *ch, char *name, int where) { struct char_data *i; int j = 0, number; char tmpname[MAX_INPUT_LENGTH]; char *tmp = tmpname; /* check the room first */ if (where == FIND_CHAR_ROOM) return get_char_room_vis(ch, name); else if (where == FIND_CHAR_WORLD) { if ((i = get_char_room_vis(ch, name)) != NULL) return (i); strcpy(tmp, name); if (!(number = get_number(&tmp))) return get_player_vis(ch, tmp, 0); for (i = character_list; i && (j <= number); i = i->next) { if (PRF_FLAGGED(i, PRF_NOTSELF) && !PRF_FLAGGED(ch, PRF_DETECT) && !IS_NPC(ch)) { if (isname(tmp, i->char_specials.name_dis) && CAN_SEE(ch, i)) if (++j == number) return (i); } else if (!IS_APPROVED(i) && !IS_NPC(i)) { GET_NAME(i, chname); if ((isname(tmp, current_short_desc(i)) || isname(tmp, chname)) && CAN_SEE(ch, i)) if (++j == number) return (i); FREE_NAME(chname); } else { if (isname(tmp, i->player.name) && CAN_SEE(ch, i)) if (++j == number) return (i); } } } return (NULL); }
struct char_data *get_player_vis(struct char_data * ch, char *name, int inroom) { struct char_data *i; for (i = character_list; i; i = i->next) { if (PRF_FLAGGED(i, PRF_NOTSELF) && !PRF_FLAGGED(ch, PRF_DETECT) && !IS_NPC(ch)) { if (!IS_NPC(i) && (!inroom || i->in_room == ch->in_room) && !str_cmp(i->char_specials.name_dis, name) && CAN_SEE(ch, i)) return i; } else { if (!IS_NPC(i) && (!inroom || i->in_room == ch->in_room) && !str_cmp(i->player.name, name)) return i; } } return NULL; }
// Returns true if a creature can see another creature bool check_sight_vict(struct creature * self, struct creature * vict) { // Immortals players can always see non-immortal players if (IS_IMMORT(self) && !IS_IMMORT(vict)) return true; // Nothing at all gets through immort invis if (IS_PC(self) && IS_IMMORT(vict) && GET_LEVEL(self) < GET_INVIS_LVL(vict)) return false; // Mortals can't see unapproved mobs if (!NPC2_FLAGGED(self, NPC2_UNAPPROVED) && NPC2_FLAGGED(vict, NPC2_UNAPPROVED) && !IS_IMMORT(self) && !is_authorized(self, TESTER, NULL)) return false; // Non-tester mortal players can't see testers if (!IS_IMMORT(self) && !IS_NPC(self) && !IS_IMMORT(vict) && !is_authorized(self, TESTER, NULL) && is_authorized(vict, TESTER, NULL)) return false; // Holy is the light that shines on the chosen if (PRF_FLAGGED(self, PRF_HOLYLIGHT)) return true; // Sonic imagery and retina detects transparent creatures if (AFF2_FLAGGED(vict, AFF2_TRANSPARENT) && !(AFF3_FLAGGED(self, AFF3_SONIC_IMAGERY) || AFF_FLAGGED(self, AFF_RETINA) || affected_by_spell(self, ZEN_AWARENESS))) return false; // True seeing and detect invisibility counteract all magical invis if (AFF2_FLAGGED(self, AFF2_TRUE_SEEING) || AFF_FLAGGED(self, AFF_DETECT_INVIS)) return true; // Invis/Transparent if (AFF_FLAGGED(vict, AFF_INVISIBLE)) return false; // Invis to Undead if (IS_UNDEAD(self) && AFF2_FLAGGED(vict, AFF2_INVIS_TO_UNDEAD)) return false; return true; }
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; }
/* Display a string with the map beside it */ void str_and_map(char *str, struct char_data *ch, room_vnum target_room ) { int size, centre, x, y, min, max, char_size; int ew_size=0, ns_size=0; bool worldmap; /* Check MUDs map config options - if disabled, just show room decsription */ if (!can_see_map(ch)) { send_to_char(ch, "%s", strfrmt(str, GET_SCREEN_WIDTH(ch), 1, FALSE, FALSE, FALSE)); return; } worldmap = show_worldmap(ch); if(!PRF_FLAGGED(ch, PRF_AUTOMAP)) { send_to_char(ch, "%s", strfrmt(str, GET_SCREEN_WIDTH(ch), 1, FALSE, FALSE, FALSE)); return; } size = CONFIG_MINIMAP_SIZE; centre = MAX_MAP/2; min = centre - 2*size; max = centre + 2*size; for (x = 0; x < MAX_MAP; ++x) for (y = 0; y < MAX_MAP; ++y) map[x][y]= (!(y%2) && !worldmap) ? DOOR_NONE : SECT_EMPTY; /* starts the mapping with the center room */ MapArea(target_room, ch, centre, centre, min, max, ns_size/2, ew_size/2, worldmap ); map[centre][centre] = SECT_HERE; /* char_size = rooms + doors + padding */ if(worldmap) char_size = size * 4 + 5; else char_size = 3*(size+1) + (size) + 4; if(worldmap) send_to_char(ch, "%s", WorldMap(centre, size, MAP_CIRCLE, MAP_COMPACT)); // send_to_char(ch, "%s", strpaste(strfrmt(str, GET_SCREEN_WIDTH(ch) - char_size, size*2 + 1, // FALSE, TRUE, TRUE), WorldMap(centre, size, MAP_CIRCLE, MAP_COMPACT), " \tn")); else send_to_char(ch, "%s", strpaste(strfrmt(str, GET_SCREEN_WIDTH(ch) - char_size, size*2 + 1, FALSE, TRUE, TRUE), CompactStringMap(centre, size), " \tn")); }
void perform_tell(struct char_data *ch, struct char_data *vict, char *arg) { struct descriptor_data *i; send_to_char(CCRED(vict, C_NRM), vict); sprintf(buf, "$n tells you, '%s'", arg); if (GET_LEVEL(ch) >= LVL_IMMORT) sprintf(buf1, "%s tells you, '%s'", CAN_SEE(vict, ch) ? GET_NAME(ch) : "An Immortal", arg); else sprintf(buf1, "%s tells you, '%s'", CAN_SEE(vict, ch) ? GET_NAME(ch) : "Someone", arg); logthistory(buf1, vict); act(buf, FALSE, ch, 0, vict, TO_VICT | TO_SLEEP); send_to_char(CCNRM(vict, C_NRM), vict); if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOREPEAT)) send_to_char(OK, ch); else { send_to_char(CCRED(ch, C_CMP), ch); sprintf(buf, "You tell $N, '%s'", arg); if (GET_LEVEL(vict) < LVL_IMMORT) sprintf(buf1, "You tell %s, '%s'", CAN_SEE(ch, vict) ? GET_NAME(vict) : "Someone",arg); else sprintf(buf1, "You tell %s, '%s'", CAN_SEE(ch, vict) ? GET_NAME(vict) : "An Immortal",arg); logthistory(buf1, ch); act(buf, FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); send_to_char(CCNRM(ch, C_CMP), ch); } for (i = descriptor_list; i; i = i->next) if (STATE(i) == CON_PLAYING && i != ch->desc && i != vict->desc && PRF_FLAGGED2(i->character, PRF2_HEARALLTELL) && GET_LEVEL(i->character) == LVL_IMPL && !IS_NPC(ch) && !IS_NPC(vict)) { send_to_char(CCRED(i->character, C_CMP), i->character); sprintf(buf, ">> %s tells %s, '%s'\r\n", GET_NAME(ch), GET_NAME(vict), arg); send_to_char(buf, i->character); send_to_char(CCNRM(i->character, C_CMP), i->character); } if (!IS_NPC(vict) && !IS_NPC(ch)) GET_LAST_TELL(vict) = GET_IDNUM(ch); }
static void perform_tell(struct char_data *ch, struct char_data *vict, char *arg) { char buf[MAX_STRING_LENGTH], *msg; snprintf(buf, sizeof(buf), "%s$n tells you, '%s'%s", CCRED(vict, C_NRM), arg, CCNRM(vict, C_NRM)); msg = act(buf, FALSE, ch, 0, vict, TO_VICT | TO_SLEEP); add_history(vict, msg, HIST_TELL); if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOREPEAT)) send_to_char(ch, "%s", CONFIG_OK); else { snprintf(buf, sizeof(buf), "%sYou tell $N, '%s'%s", CCRED(ch, C_NRM), arg, CCNRM(ch, C_NRM)); msg = act(buf, FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); add_history(ch, msg, HIST_TELL); } if (!IS_NPC(vict) && !IS_NPC(ch)) GET_LAST_TELL(vict) = GET_IDNUM(ch); }
/* make ch remember victim */ void remember(struct char_data *ch, struct char_data *victim) { memory_rec *tmp; bool present = FALSE; if (!IS_NPC(ch) || IS_NPC(victim) || PRF_FLAGGED(victim, PRF_NOHASSLE)) return; for (tmp = MEMORY(ch); tmp && !present; tmp = tmp->next) if (tmp->id == GET_IDNUM(victim)) present = TRUE; if (!present) { CREATE(tmp, memory_rec, 1); tmp->next = MEMORY(ch); tmp->id = GET_IDNUM(victim); MEMORY(ch) = tmp; } }
void perform_tell(struct char_data *ch, struct char_data *vict, char *arg) { char buf[MAX_STRING_LENGTH]; send_to_char(vict, "%s", CCRED(vict, C_NRM)); snprintf(buf, sizeof(buf), "$n tells you, '%s'", arg); act(buf, FALSE, ch, 0, vict, TO_VICT | TO_SLEEP); send_to_char(vict, "%s", CCNRM(vict, C_NRM)); if (!IS_NPC(ch) && PRF_FLAGGED(ch, PRF_NOREPEAT)) send_to_char(ch, "%s", OK); else { send_to_char(ch, "%s", CCRED(ch, C_CMP)); snprintf(buf, sizeof(buf), "You tell $N, '%s'", arg); act(buf, FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP); send_to_char(ch, "%s", CCNRM(ch, C_CMP)); } if (!IS_NPC(vict) && !IS_NPC(ch)) GET_LAST_TELL(vict) = GET_IDNUM(ch); }
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); }
/* * 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); } }
/* Only player characters should be using OLC anyway. */ void clear_screen(struct descriptor_data *d) { if (PRF_FLAGGED(d->character, PRF_CLS)) write_to_output(d, "[H[J"); }
/* MapArea function - create the actual map */ static void MapArea(room_rnum room, struct char_data *ch, int x, int y, int min, int max, sh_int xpos, sh_int ypos, bool worldmap) { room_rnum prospect_room; struct room_direction_data *pexit; int door, ew_size=0, ns_size=0, x_exit_pos=0, y_exit_pos=0; sh_int prospect_xpos, prospect_ypos; if (map[x][y] < 0) return; /* this is a door */ /* marks the room as visited */ if(room == IN_ROOM(ch)) map[x][y] = SECT_HERE; else map[x][y] = SECT(room); if ( (x < min) || ( y < min) || ( x > max ) || ( y > max) ) return; /* Check for exits */ for ( door = 0; door < MAX_MAP_DIR; door++ ) { if( door < MAX_MAP_FOLLOW && xpos+door_offsets[door][0] >= 0 && xpos+door_offsets[door][0] <= ns_size && ypos+door_offsets[door][1] >= 0 && ypos+door_offsets[door][1] <= ew_size) { /* Virtual exit */ map[x+door_offsets[door][0]][y+door_offsets[door][1]] = vdoor_marks[door] ; if (map[x+offsets[door][0]][y+offsets[door][1]] == SECT_EMPTY ) MapArea(room,ch,x + offsets[door][0], y + offsets[door][1], min, max, xpos+door_offsets[door][0], ypos+door_offsets[door][1], worldmap); continue; } if ( (pexit = world[room].dir_option[door]) != NULL && (pexit->to_room > 0 ) && (pexit->to_room != NOWHERE) && (!IS_SET(pexit->exit_info, EX_CLOSED)) && (!IS_SET(pexit->exit_info, EX_HIDDEN) || PRF_FLAGGED(ch, PRF_HOLYLIGHT)) ) { /* A real exit */ /* But is the door here... */ switch (door) { case NORTH: if(xpos > 0 || ypos!=y_exit_pos) continue; break; case SOUTH: if(xpos < ns_size || ypos!=y_exit_pos) continue; break; case EAST: if(ypos < ew_size || xpos!=x_exit_pos) continue; break; case WEST: if(ypos > 0 || xpos!=x_exit_pos) continue; break; case NORTHWEST: if(xpos > 0 || ypos!=y_exit_pos || ypos > 0 || xpos!=x_exit_pos) continue; break; case NORTHEAST: if(xpos > 0 || ypos!=y_exit_pos || ypos < ew_size || xpos!=x_exit_pos) continue; break; case SOUTHEAST: if(xpos < ns_size || ypos!=y_exit_pos || ypos < ew_size || xpos!=x_exit_pos) continue; break; case SOUTHWEST: if(xpos < ns_size || ypos!=y_exit_pos || ypos > 0 || xpos!=x_exit_pos) continue; break; } /* if ( (x < min) || ( y < min) || ( x > max ) || ( y > max) ) return;*/ prospect_room = pexit->to_room; /* one way into area OR maze */ if ( world[prospect_room].dir_option[rev_dir[door]] && world[prospect_room].dir_option[rev_dir[door]]->to_room != room) { map[x][y] = SECT_STRANGE; return; } if(!worldmap) { if ((map[x+door_offsets[door][0]][y+door_offsets[door][1]] == DOOR_NONE) || (map[x+door_offsets[door][0]][y+door_offsets[door][1]] == SECT_EMPTY) ) { map[x+door_offsets[door][0]][y+door_offsets[door][1]] = door_marks[door]; } else { if ( ((door == NORTHEAST) && (map[x+door_offsets[door][0]][y+door_offsets[door][1]] == DOOR_UP)) || ((door == UP) && (map[x+door_offsets[door][0]][y+door_offsets[door][1]] == DOOR_DIAGNE)) ) { map[x+door_offsets[door][0]][y+door_offsets[door][1]] = DOOR_UP_AND_NE; } else if ( ((door == SOUTHEAST) && (map[x+door_offsets[door][0]][y+door_offsets[door][1]] == DOOR_DOWN)) || ((door == DOWN) && (map[x+door_offsets[door][0]][y+door_offsets[door][1]] == DOOR_DIAGNW)) ) { map[x+door_offsets[door][0]][y+door_offsets[door][1]] = DOOR_DOWN_AND_SE; } } } prospect_xpos = prospect_ypos = 0; switch (door) { case NORTH: prospect_xpos = ns_size; case SOUTH: prospect_ypos = world[prospect_room].dir_option[rev_dir[door]] ? y_exit_pos : ew_size/2; break; case WEST: prospect_ypos = ew_size; case EAST: prospect_xpos = world[prospect_room].dir_option[rev_dir[door]] ? x_exit_pos : ns_size/2; break; case NORTHEAST: case NORTHWEST: case SOUTHEAST: case SOUTHWEST: prospect_xpos = world[prospect_room].dir_option[rev_dir[door]] ? x_exit_pos : ns_size/2; prospect_ypos = world[prospect_room].dir_option[rev_dir[door]] ? y_exit_pos : ew_size/2; break; } if(worldmap) { if ( door < MAX_MAP_FOLLOW && map[x+offsets_worldmap[door][0]][y+offsets_worldmap[door][1]] == SECT_EMPTY ) MapArea(pexit->to_room,ch,x + offsets_worldmap[door][0], y + offsets_worldmap[door][1], min, max, prospect_xpos, prospect_ypos, worldmap); } else { if ( door < MAX_MAP_FOLLOW && map[x+offsets[door][0]][y+offsets[door][1]] == SECT_EMPTY ) MapArea(pexit->to_room,ch,x + offsets[door][0], y + offsets[door][1], min, max, prospect_xpos, prospect_ypos, worldmap); } } /* end if exit there */ } return; }
void check_idling( CharData * ch ) { #define VOID_TIME 8 #define EXTRACT_TIME 32 void Crash_rentsave(CharData *ch, int cost); void Crash_cryosave(CharData *ch, int cost); /* ** CONJURED timer */ int i = 0; for(;i < 4;i++) { if( GET_CONJ_CNT(ch, i) > 0) { SET_CONJ_CNT(ch, i) -= 1; if(SET_CONJ_CNT(ch, i) == 0) switch(GET_CLASS(ch)) { case CLASS_RANGER: sendChar( ch, "The creatures of the wild will answer your call again.\r\n" ); break; case CLASS_NECROMANCER: sendChar(ch, "The dead will heed your summons once more.\r\n"); case CLASS_MAGIC_USER: switch(i) { case TIMER_GATE: sendChar(ch, "Demons will answer your summons again.\r\n"); break; case TIMER_MONSTER: sendChar(ch, "Monsters will answer your summons again.\r\n"); break; case TIMER_ELEMENTAL: sendChar(ch, "Elementals will answer your summons again.\r\n"); break; } break; default: sendChar( ch, "Conjured creatures will answer your summons again.\r\n" ); } } } /* ** HUNTED timer */ if( IS_SET_AR( PLR_FLAGS(ch), PLR_HUNTED ) && ch->desc && (--(ch)->player_specials->saved.phunt_countdown <= 0)) { sendChar( ch, "You are no longer hunted.\r\n" ); unset_hunted_player(ch); } /* ** THIEF timer */ if( IS_SET_AR(PLR_FLAGS(ch), PLR_THIEF) && ch->desc && (--(ch)->player_specials->saved.pthief_countdown <= 0)) { REMOVE_BIT_AR(PLR_FLAGS(ch), PLR_THIEF); send_to_char("You are no longer a registered thief.\r\n", ch); (ch)->player_specials->saved.pthief_countdown = 0; } /* KILLER timer */ if (IS_SET_AR(PLR_FLAGS(ch), PLR_KILLER) && (--(ch)->player_specials->saved.pkill_countdown <= 0)) { REMOVE_BIT_AR(PLR_FLAGS(ch), PLR_KILLER); send_to_char("You are no longer a registered killer.\r\n", ch); (ch)->player_specials->saved.pkill_countdown = 0; } /* JAILED timer */ if (IS_SET_AR(PLR_FLAGS(ch), PLR_JAILED) && (--(ch)->player_specials->saved.jail_timer <= 0)) { int jail_exit_room; REMOVE_BIT_AR(PLR_FLAGS(ch), PLR_JAILED); if (PRF_FLAGGED(ch, PRF_GOLD_TEAM) && IN_ROOM(ch) == real_room(GOLD_TEAM_JAIL)) { jail_exit_room = real_room(GOLD_TEAM_START_ROOM); GET_HIT(ch) = GET_MAX_HIT(ch); GET_MANA(ch) = GET_MAX_MANA(ch); GET_MOVE(ch) = GET_MAX_MOVE(ch); char_from_room(ch); char_to_room(ch, jail_exit_room); look_at_room(ch, 0); } if (PRF_FLAGGED(ch, PRF_BLACK_TEAM) && IN_ROOM(ch) == real_room(BLACK_TEAM_JAIL)) { jail_exit_room = real_room(BLACK_TEAM_START_ROOM); GET_HIT(ch) = GET_MAX_HIT(ch); GET_MANA(ch) = GET_MAX_MANA(ch); GET_MOVE(ch) = GET_MAX_MOVE(ch); char_from_room(ch); char_to_room(ch, jail_exit_room); look_at_room(ch, 0); } if (PRF_FLAGGED(ch, PRF_ROGUE_TEAM) && IN_ROOM(ch) == real_room(ROGUE_TEAM_JAIL)) { jail_exit_room = real_room(ROGUE_TEAM_START_ROOM); GET_HIT(ch) = GET_MAX_HIT(ch); GET_MANA(ch) = GET_MAX_MANA(ch); GET_MOVE(ch) = GET_MAX_MOVE(ch); char_from_room(ch); char_to_room(ch, jail_exit_room); look_at_room(ch, 0); } sendChar(ch, "Your imprisonement is over.\r\n"); // if (PRF_FLAGGED(ch, PRF_GOLD_TEAM)) // jail_exit_room = IN_ROOM(ch); // else if (PRF_FLAGGED(ch, PRF_BLACK_TEAM)) // jail_exit_room = IN_ROOM(ch); // else if (PRF_FLAGGED(ch, PRF_ROGUE_TEAM)) // jail_exit_room = IN_ROOM(ch); // else // jail_exit_room = getStartRoom(ch); // char_to_room(ch, jail_exit_room); // look_at_room(ch, 0); } /* ** If your hunted there is NO escape. */ if(( ++(ch->char_specials.timer) > VOID_TIME ) && !IS_SET_AR(PLR_FLAGS(ch), PLR_HUNTED)) { if (GET_WAS_IN(ch) == NOWHERE && ch->in_room != NOWHERE) { GET_WAS_IN(ch) = ch->in_room; end_fight(ch); act("$n disappears into the void.", TRUE, ch, 0, 0, TO_ROOM); send_to_char("You have been idle, and are pulled into a void.\r\n", ch); save_char(ch, NOWHERE); Crash_crashsave(ch); GET_WAS_IN(ch) = ch->in_room; char_from_room(ch); char_to_room(ch, 1); } //else if (ch->char_specials.timer > EXTRACT_TIME) //{ //if (ch->in_room != NOWHERE) //char_from_room(ch); //char_to_room(ch, 1); //if (ch->desc) //SET_DCPENDING(ch->desc); //ch->desc = NULL; //Crash_idlesave(ch); /* apparently causing problems? */ //crashRentSave(ch, -1); //mudlog( NRM, LVL_LRGOD, TRUE, "%s force-rented and extracted (idle).", GET_NAME(ch)); //extract_char(ch); //} } #undef VOID_TIME #undef EXTRACT_TIME }
/* * Only player characters should be using OLC anyway. */ void clear_screen(struct descriptor_data *d) { if (PRF_FLAGGED(d->character, PRF_CLS)) send_to_char(d->character, "[H[J"); }
void go_name(CHAR_DATA* ch, CHAR_DATA* vict, int action) { int god_level = PRF_FLAGGED(ch, PRF_CODERINFO) ? LVL_IMPL : GET_LEVEL(ch); if (GET_LEVEL(vict) > god_level) { send_to_char("А он ведь старше вас...\r\n", ch); return; } // одобряем или нет int lev = NAME_GOD(vict); if (lev > 1000) lev = lev - 1000; if (lev > god_level) { send_to_char("Об этом имени уже позаботился бог старше вас.\r\n", ch); return; } if (lev == god_level) if (NAME_ID_GOD(vict) != GET_IDNUM(ch)) send_to_char("Об этом имени уже позаботился другой бог вашего уровня.\r\n", ch); if (action == NAME_AGREE) { NAME_GOD(vict) = god_level + 1000; NAME_ID_GOD(vict) = GET_IDNUM(ch); //send_to_char("Имя одобрено!\r\n", ch); send_to_char(vict, "&GВаше имя одобрено!&n\r\n"); agree_name(vict, GET_NAME(ch), god_level); if(GET_SEX(ch) == 0) sprintf(buf, "&c%s одобрило имя игрока %s.&n\r\n", GET_NAME(ch), GET_NAME(vict)); if(GET_SEX(ch) == 1) sprintf(buf, "&c%s одобрил имя игрока %s.&n\r\n", GET_NAME(ch), GET_NAME(vict)); if(GET_SEX(ch) == 2) sprintf(buf, "&c%s одобрила имя игрока %s.&n\r\n", GET_NAME(ch), GET_NAME(vict)); if(GET_SEX(ch) == 3) sprintf(buf, "&c%s одобрили имя игрока %s.&n\r\n", GET_NAME(ch), GET_NAME(vict)); send_to_gods(buf, true); // В этом теперь нет смысла //mudlog(buf, CMP, LVL_GOD, SYSLOG, TRUE); } else { NAME_GOD(vict) = god_level; NAME_ID_GOD(vict) = GET_IDNUM(ch); //send_to_char("Имя запрещено!\r\n", ch); send_to_char(vict, "&RВаше имя запрещено!&n\r\n"); disagree_name(vict, GET_NAME(ch), god_level); if(GET_SEX(ch) ==0) sprintf(buf, "&c%s запретило имя игрока %s.&n\r\n", GET_NAME(ch), GET_NAME(vict)); if(GET_SEX(ch) ==1) sprintf(buf, "&c%s запретил имя игрока %s.&n\r\n", GET_NAME(ch), GET_NAME(vict)); if(GET_SEX(ch) ==2) sprintf(buf, "&c%s запретила имя игрока %s.&n\r\n", GET_NAME(ch), GET_NAME(vict)); if(GET_SEX(ch) ==3) sprintf(buf, "&c%s запретили имя игрока %s.&n\r\n", GET_NAME(ch), GET_NAME(vict)); send_to_gods(buf, true); //mudlog(buf, CMP, LVL_GOD, SYSLOG, TRUE); } }
static int find_door(struct char_data *ch, const char *type, char *dir, const char *cmdname) { int door; if (*dir) { /* a direction was specified */ if ((door = search_block(dir, dirs, FALSE)) == -1) { /* Partial Match */ if ((door = search_block(dir, autoexits, FALSE)) == -1) { /* Check 'short' dirs too */ send_to_char(ch, "That's not a direction.\r\n"); return (-1); } } if (EXIT(ch, door)) { /* Braces added according to indent. -gg */ if (EXIT(ch, door)->keyword) { if (is_name(type, EXIT(ch, door)->keyword)) return (door); else { send_to_char(ch, "I see no %s there.\r\n", type); return (-1); } } else return (door); } else { send_to_char(ch, "I really don't see how you can %s anything there.\r\n", cmdname); return (-1); } } else { /* try to locate the keyword */ if (!*type) { send_to_char(ch, "What is it you want to %s?\r\n", cmdname); return (-1); } for (door = 0; door < DIR_COUNT; door++) { if (EXIT(ch, door)) { if (EXIT(ch, door)->keyword) { if (isname(type, EXIT(ch, door)->keyword)) { if ((!IS_NPC(ch)) && (!PRF_FLAGGED(ch, PRF_AUTODOOR))) return door; else if (is_abbrev(cmdname, "open")) { if (IS_SET(EXIT(ch, door)->exit_info, EX_CLOSED)) return door; else if (IS_SET(EXIT(ch, door)->exit_info, EX_LOCKED)) return door; } else if ((is_abbrev(cmdname, "close")) && (!(IS_SET(EXIT(ch, door)->exit_info, EX_CLOSED))) ) return door; else if ((is_abbrev(cmdname, "lock")) && (!(IS_SET(EXIT(ch, door)->exit_info, EX_LOCKED))) ) return door; else if ((is_abbrev(cmdname, "unlock")) && (IS_SET(EXIT(ch, door)->exit_info, EX_LOCKED)) ) return door; else if ((is_abbrev(cmdname, "pick")) && (IS_SET(EXIT(ch, door)->exit_info, EX_LOCKED)) ) return door; } } } } if ((!IS_NPC(ch)) && (!PRF_FLAGGED(ch, PRF_AUTODOOR))) send_to_char(ch, "There doesn't seem to be %s %s here.\r\n", AN(type), type); else if (is_abbrev(cmdname, "open")) send_to_char(ch, "There doesn't seem to be %s %s that can be opened.\r\n", AN(type), type); else if (is_abbrev(cmdname, "close")) send_to_char(ch, "There doesn't seem to be %s %s that can be closed.\r\n", AN(type), type); else if (is_abbrev(cmdname, "lock")) send_to_char(ch, "There doesn't seem to be %s %s that can be locked.\r\n", AN(type), type); else if (is_abbrev(cmdname, "unlock")) send_to_char(ch, "There doesn't seem to be %s %s that can be unlocked.\r\n", AN(type), type); else send_to_char(ch, "There doesn't seem to be %s %s that can be picked.\r\n", AN(type), type); return (-1); } }
int perform_move(struct char_data *ch, int dir, int need_specials_check) { room_rnum was_in; struct follow_type *k, *next; if (ch == NULL || dir < 0 || dir >= NUM_OF_DIRS || FIGHTING(ch)) return (0); else if (!CONFIG_DIAGONAL_DIRS && IS_DIAGONAL(dir)) send_to_char(ch, "Alas, you cannot go that way...\r\n"); else if ((!EXIT(ch, dir) && !buildwalk(ch, dir)) || EXIT(ch, dir)->to_room == NOWHERE) send_to_char(ch, "Alas, you cannot go that way...\r\n"); else if (EXIT_FLAGGED(EXIT(ch, dir), EX_CLOSED) && (GET_ADMLEVEL(ch) < ADMLVL_IMMORT || (!IS_NPC(ch) && !PRF_FLAGGED(ch, PRF_NOHASSLE)))) { if (EXIT(ch, dir)->keyword) send_to_char(ch, "The %s seems to be closed.\r\n", fname(EXIT(ch, dir)->keyword)); else send_to_char(ch, "It seems to be closed.\r\n"); } else { if (!ch->followers) return (do_simple_move(ch, dir, need_specials_check)); was_in = IN_ROOM(ch); if (!do_simple_move(ch, dir, need_specials_check)) return (0); for (k = ch->followers; k; k = next) { next = k->next; if ((IN_ROOM(k->follower) == was_in) && (GET_POS(k->follower) >= POS_STANDING)) { act("You follow $N.\r\n", FALSE, k->follower, 0, ch, TO_CHAR); perform_move(k->follower, dir, 1); } } return (1); } return (0); }
/** Move a PC/NPC character from their current location to a new location. This * is the standard movement locomotion function that all normal walking * movement by characters should be sent through. This function also defines * the move cost of normal locomotion as: * ( (move cost for source room) + (move cost for destination) ) / 2 * * @pre Function assumes that ch has no master controlling character, that * ch has no followers (in other words followers won't be moved by this * function) and that the direction traveled in is one of the valid, enumerated * direction. * @param ch The character structure to attempt to move. * @param dir The defined direction (NORTH, SOUTH, etc...) to attempt to * move into. * @param need_specials_check If TRUE will cause * @retval int 1 for a successful move (ch is now in a new location) * or 0 for a failed move (ch is still in the original location). */ int do_simple_move(struct char_data *ch, int dir, int need_specials_check) { /* Begin Local variable definitions */ /*---------------------------------------------------------------------*/ /* Used in our special proc check. By default, we pass a NULL argument * when checking for specials */ char spec_proc_args[MAX_INPUT_LENGTH] = ""; /* The room the character is currently in and will move from... */ room_rnum was_in = IN_ROOM(ch); /* ... and the room the character will move into. */ room_rnum going_to = EXIT(ch, dir)->to_room; /* How many movement points are required to travel from was_in to going_to. * We redefine this later when we need it. */ int need_movement = 0; /* Contains the "leave" message to display to the was_in room. */ char leave_message[SMALL_BUFSIZE]; /*---------------------------------------------------------------------*/ /* End Local variable definitions */ /* Begin checks that can prevent a character from leaving the was_in room. */ /* Future checks should be implemented within this section and return 0. */ /*---------------------------------------------------------------------*/ /* Check for special routines that might activate because of the move and * also might prevent the movement. Special requires commands, so we pass * in the "command" equivalent of the direction (ie. North is '1' in the * command list, but NORTH is defined as '0'). * Note -- only check if following; this avoids 'double spec-proc' bug */ if (need_specials_check && special(ch, dir + 1, spec_proc_args)) return 0; /* Leave Trigger Checks: Does a leave trigger block exit from the room? */ if (!leave_mtrigger(ch, dir) || IN_ROOM(ch) != was_in) /* prevent teleport crashes */ return 0; if (!leave_wtrigger(&world[IN_ROOM(ch)], ch, dir) || IN_ROOM(ch) != was_in) /* prevent teleport crashes */ return 0; if (!leave_otrigger(&world[IN_ROOM(ch)], ch, dir) || IN_ROOM(ch) != was_in) /* prevent teleport crashes */ return 0; /* Charm effect: Does it override the movement? */ if (AFF_FLAGGED(ch, AFF_CHARM) && ch->master && was_in == IN_ROOM(ch->master)) { send_to_char(ch, "The thought of leaving your master makes you weep.\r\n"); act("$n bursts into tears.", FALSE, ch, 0, 0, TO_ROOM); return (0); } /* Water, No Swimming Rooms: Does the deep water prevent movement? */ if ((SECT(was_in) == SECT_WATER_NOSWIM) || (SECT(going_to) == SECT_WATER_NOSWIM)) { if (!has_boat(ch)) { send_to_char(ch, "You need a boat to go there.\r\n"); return (0); } } /* Flying Required: Does lack of flying prevent movement? */ if ((SECT(was_in) == SECT_FLYING) || (SECT(going_to) == SECT_FLYING)) { if (!has_flight(ch)) { send_to_char(ch, "You need to be flying to go there!\r\n"); return (0); } } /* Underwater Room: Does lack of underwater breathing prevent movement? */ if ((SECT(was_in) == SECT_UNDERWATER) || (SECT(going_to) == SECT_UNDERWATER)) { if (!has_scuba(ch) && !IS_NPC(ch) && !PRF_FLAGGED(ch, PRF_NOHASSLE)) { send_to_char(ch, "You need to be able to breathe water to go there!\r\n"); return (0); } } /* Houses: Can the player walk into the house? */ if (ROOM_FLAGGED(was_in, ROOM_ATRIUM)) { if (!House_can_enter(ch, GET_ROOM_VNUM(going_to))) { send_to_char(ch, "That's private property -- no trespassing!\r\n"); return (0); } } /* Check zone level recommendations */ if ((ZONE_MINLVL(GET_ROOM_ZONE(going_to)) != -1) && ZONE_MINLVL(GET_ROOM_ZONE(going_to)) > GET_LEVEL(ch)) { send_to_char(ch, "This zone is above your recommended level.\r\n"); } /* Check zone flag restrictions */ if (ZONE_FLAGGED(GET_ROOM_ZONE(going_to), ZONE_CLOSED)) { send_to_char(ch, "A mysterious barrier forces you back! That area is off-limits.\r\n"); return (0); } if (ZONE_FLAGGED(GET_ROOM_ZONE(going_to), ZONE_NOIMMORT) && (GET_ADMLEVEL(ch) >= ADMLVL_IMMORT) && (GET_ADMLEVEL(ch) < ADMLVL_GRGOD)) { send_to_char(ch, "A mysterious barrier forces you back! That area is off-limits.\r\n"); return (0); } /* Room Size Capacity: Is the room full of people already? */ if (ROOM_FLAGGED(going_to, ROOM_TUNNEL) && num_pc_in_room(&(world[going_to])) >= CONFIG_TUNNEL_SIZE) { if (CONFIG_TUNNEL_SIZE > 1) send_to_char(ch, "There isn't enough room for you to go there!\r\n"); else send_to_char(ch, "There isn't enough room there for more than one person!\r\n"); return (0); } /* Room Level Requirements: Is ch privileged enough to enter the room? */ if (ROOM_FLAGGED(going_to, ROOM_GODROOM) && GET_ADMLEVEL(ch) < ADMLVL_GOD) { send_to_char(ch, "You aren't godly enough to use that room!\r\n"); return (0); } /* All checks passed, nothing will prevent movement now other than lack of * move points. */ /* move points needed is avg. move loss for src and destination sect type */ need_movement = (movement_loss[SECT(was_in)] + movement_loss[SECT(going_to)]) / 2; /* Move Point Requirement Check */ if (GET_MOVE(ch) < need_movement && !IS_NPC(ch)) { if (need_specials_check && ch->master) send_to_char(ch, "You are too exhausted to follow.\r\n"); else send_to_char(ch, "You are too exhausted.\r\n"); return (0); } /*---------------------------------------------------------------------*/ /* End checks that can prevent a character from leaving the was_in room. */ /* Begin: the leave operation. */ /*---------------------------------------------------------------------*/ /* If applicable, subtract movement cost. */ if (GET_ADMLEVEL(ch) < ADMLVL_IMMORT && !IS_NPC(ch)) GET_MOVE(ch) -= need_movement; /* Generate the leave message and display to others in the was_in room. */ if (!AFF_FLAGGED(ch, AFF_SNEAK)) { snprintf(leave_message, sizeof(leave_message), "$n leaves %s.", dirs[dir]); act(leave_message, TRUE, ch, 0, 0, TO_ROOM); } char_from_room(ch); char_to_room(ch, going_to); /*---------------------------------------------------------------------*/ /* End: the leave operation. The character is now in the new room. */ /* Begin: Post-move operations. */ /*---------------------------------------------------------------------*/ /* Post Move Trigger Checks: Check the new room for triggers. * Assumptions: The character has already truly left the was_in room. If * the entry trigger "prevents" movement into the room, it is the triggers * job to provide a message to the original was_in room. */ if (!entry_mtrigger(ch) || !enter_wtrigger(&world[going_to], ch, dir)) { char_from_room(ch); char_to_room(ch, was_in); return 0; } /* Display arrival information to anyone in the destination room... */ if (!AFF_FLAGGED(ch, AFF_SNEAK)) act("$n has arrived.", TRUE, ch, 0, 0, TO_ROOM); /* ... and the room description to the character. */ if (ch->desc != NULL) look_at_room(ch, 0); /* ... and Kill the player if the room is a death trap. */ if (ROOM_FLAGGED(going_to, ROOM_DEATH) && GET_ADMLEVEL(ch) < ADMLVL_IMMORT) { mudlog(BRF, ADMLVL_IMMORT, TRUE, "%s hit death trap #%d (%s)", GET_NAME(ch), GET_ROOM_VNUM(going_to), world[going_to].name); death_cry(ch); extract_char(ch); return (0); } /* At this point, the character is safe and in the room. */ /* Fire memory and greet triggers, check and see if the greet trigger * prevents movement, and if so, move the player back to the previous room. */ entry_memory_mtrigger(ch); if (!greet_mtrigger(ch, dir)) { char_from_room(ch); char_to_room(ch, was_in); look_at_room(ch, 0); /* Failed move, return a failure */ return (0); } else greet_memory_mtrigger(ch); /*---------------------------------------------------------------------*/ /* End: Post-move operations. */ /* Only here is the move successful *and* complete. Return success for * calling functions to handle post move operations. */ return (1); }
/* * 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); }