/
rogue25b1/
rogue25b1/space/planets/
rogue25b1/space/prototypes/
rogue25b1/space/ships/
#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;
}