#include "merc.h"
#include "clans.h"
#include "interp.h"
SInt32 start_rooms[MAX_PC_RACE] = {
0, // Null Race
3054, // Humans
3054, // Elves
3054, // Dwarves
3054 // Giants
};
SInt32 newbie_start_rooms[MAX_PC_RACE] = {
0, // NULL Race
3700, // Humans
3700, // Elves
3700, // Dwarves
3700 // Giants
};
ROOM_INDEX_DATA *StartRoom( CHAR_DATA *ch ) {
ROOM_INDEX_DATA *load_room = NULL;
if (MOB_FLAGGED(ch, ACT_PET) && ch->master)
load_room = StartRoom(ch->master);
if ((load_room == NULL) && !ch->level)
load_room = get_room_index(newbie_start_rooms[GET_RACE(ch)]);
if ((load_room == NULL) && PLR_FLAGGED(ch, PLR_LOADROOM))
load_room = get_room_index(GET_LOADROOM(ch));
if ((load_room == NULL) && GET_CLAN(ch) && GET_CLAN_RANK(ch) > CLAN_APPLY)
load_room = get_room_index(CLAN_RECALL(GET_CLAN(ch)));
if ((load_room == NULL) && IS_STAFF(ch))
load_room = get_room_index(ROOM_VNUM_STAFF);
if (load_room == NULL)
load_room = get_room_index(start_rooms[GET_RACE(ch)]);
if (load_room == NULL)
load_room = get_room_index(ROOM_VNUM_TEMPLE);
if (!IS_NPC(ch) && !PLR_FLAGGED(ch, PLR_LOADROOM))
GET_LOADROOM(ch) = 0;
if (PLR_FLAGGED(ch, PLR_FREEZE))
load_room = get_room_index(ROOM_VNUM_FROZEN);
return load_room;
}
int find_align(CHAR_DATA *ch) {
if (IS_GOOD(ch))
return 3;
if (IS_EVIL(ch))
return 2;
if (IS_NEUTRAL(ch))
return 1;
return 0;
}
Relation CHAR_DATA::GetRelation(CHAR_DATA *target) {
int chClan, tarClan;
int chalign, taralign;
if (NO_STAFF_HASSLE(this) || NO_STAFF_HASSLE(target))
return RELATION_FRIEND;
if (IS_TRAITOR(this) ^ IS_TRAITOR(target))
return RELATION_ENEMY;
chClan = ((GET_CLAN_RANK(this) > CLAN_APPLY) || IS_NPC(this)) ? real_clan(GET_CLAN(this)) : -1;
tarClan = ((GET_CLAN_RANK(target) > CLAN_APPLY) || IS_NPC(target)) ? real_clan(GET_CLAN(target)) : -1;
chalign = find_align(this);
taralign = find_align(target);
if ((chClan != -1) && (chClan == tarClan))
return RELATION_FRIEND;
if (!IS_NEUTRAL(this) ? (chalign != taralign) : !IS_NEUTRAL(target)) {
if ((chClan != -1) && (chClan == tarClan))
return RELATION_FRIEND;
if (IS_NEUTRAL(this) || IS_NEUTRAL(target))
return RELATION_NEUTRAL;
return RELATION_ENEMY;
}
if ((chClan != -1) && (tarClan != -1) && (chClan != tarClan))
return RELATION_NEUTRAL;
return RELATION_FRIEND;
}
#define OBJ_ANTI_FLAGS(obj, flags) (IS_SET((obj)->extra_flags, (flags)))
bool CHAR_DATA::CanUse(OBJ_DATA *obj) {
if (NO_STAFF_HASSLE(this))
return TRUE;
if (this->level < obj->level) {
this->Send("You must be level %d to use this object.\n\r", obj->level);
return FALSE;
}
return !(
(OBJ_ANTI_FLAGS(obj, ITEM_ANTI_BARBARIAN) && IS_BARBARIAN(this)) ||
(OBJ_ANTI_FLAGS(obj, ITEM_ANTI_CLERIC) && IS_CLERIC(this)) ||
(OBJ_ANTI_FLAGS(obj, ITEM_ANTI_DRUID) && IS_DRUID(this)) ||
(OBJ_ANTI_FLAGS(obj, ITEM_ANTI_FIGHTER) && IS_FIGHTER(this)) ||
(OBJ_ANTI_FLAGS(obj, ITEM_ANTI_PALADIN) && IS_PALADIN(this)) ||
(OBJ_ANTI_FLAGS(obj, ITEM_ANTI_RANGER) && IS_RANGER(this)) ||
(OBJ_ANTI_FLAGS(obj, ITEM_ANTI_ROGUE) && IS_ROGUE(this)) ||
(OBJ_ANTI_FLAGS(obj, ITEM_ANTI_WIZARD) && IS_WIZARD(this)));
}
const char *EXIT_DATA::GetDesc(const char *def = NULL) const {
return (*this->description ? this->description : def);
}
void roll_temp_abils(CHAR_DATA *ch) {
int roll = 0;
for (roll = 0; roll < MAX_STATS; roll++)
ch->temp_stat[roll] = dice(3, 6);
ch->roll_stat = ch->temp_stat;
return;
}