rogue25b2/gods/
rogue25b2/player/
rogue25b2/space/planets/
rogue25b2/space/prototypes/
rogue25b2/space/ships/
rogue25b2/src/
/***************************************************************************\
[*]    ___    ____   ____   __   __  ____ [*]   ROGUE: ROM With Attitude  [*]
[*]   /#/ )  /#/  ) /#/  ) /#/  /#/ /#/   [*]    All rights reserved      [*]
[*]  /#/ <  /#/  / /#/ _  /#/  /#/ /#/--  [*]   Copyright(C) 2000-2003    [*]
[*] /#/   \(#(__/ (#(__/ (#(__/#/ (#(___  [*] Kenneth Conley (Mendanbar)  [*]
[*]  Expression of Digital Creativity..   [*]  roguemud@yahoogroups.com   [*]
[-]---------------------------------------+-+-----------------------------[-]
[*] File: feats.h                                                         [*]
[*] Usage: Definitions for feats                                          [*]
\***************************************************************************/

#ifndef __FEATS_H__
#define __FEATS_H__

#include "stl.llist.h"

#define FEAT_FILE "../data/feats.txt"
#define FEATS_FILE "../data/feats.txt"

enum FeatTypes {
    GeneralFeat,
    SpecialFeat,
    MetaMagicFeat,
    ItemCreationFeat
};

enum Feats {
    FEAT_RESERVED = 0,
    FEAT_ALERTNESS,
    FEAT_AMBIDEXTERITY,
    FEAT_ARMOR_PROFICIENCY_HEAVY,
    FEAT_ARMOR_PROFICIENCY_LIGHT,
    FEAT_ARMOR_PROFICIENCY_MEDIUM,
    FEAT_BLIND_FIGHT,
    FEAT_BREW_POTION,
    FEAT_CLEAVE,
    FEAT_COMBAT_CASTING,
    FEAT_COMBAT_REFLEXES,
    FEAT_CRAFT_MAGIC_ARMS,
    FEAT_CRAFT_ROD,
    FEAT_CRAFT_STAFF,
    FEAT_CRAFT_WAND,
    FEAT_CRAFT_WONDEROUS_ITEM,
    FEAT_DEFLECT_ARROWS,
    FEAT_DODGE,
    FEAT_EMPOWER_SPELL,
    FEAT_ENDURANCE,
    FEAT_ENLARGE_SPELL,
    FEAT_EXOTIC_WEAPON,
    FEAT_EXPERTISE,
    FEAT_EXTEND_SPELL,
    FEAT_EXTRA_TURNING,
    FEAT_EAR_SHOT,
    FEAT_FORGE_RING,
    FEAT_GREAT_CLEAVE,
    FEAT_GREAT_FORTITUDE,
    FEAT_HEIGHTEN_SPELL,
    FEAT_IMPROVED_BULL_RUSH,
    FEAT_IMPROVED_CRITICAL,
    FEAT_IMPROVED_DISARM,
    FEAT_IMPROVED_INITIATIVE,
    FEAT_IMPROVED_TRIP,
    FEAT_IMPROVED_TWO_WEAPON_FIGHTING,
    FEAT_IMPROVED_UNARMED_STRIKE,
    FEAT_IRON_WILL,
    FEAT_LEADERSHIP,
    FEAT_LIGHTNING_REFLEXES,
    FEAT_MARTIAL_WEAPON,
    FEAT_MAXIMIZE_SPELL,
    FEAT_MOBILITY,
    FEAT_MOUNTED_ARCHERY,
    FEAT_MOUNTED_COMBAT,
    FEAT_POINT_BLANK_SHOT,
    FEAT_POWER_ATTACK,
    FEAT_PRECISE_SHOT,
    FEAT_QUICK_DRAW,
    FEAT_QUICKEN_SPELL,
    FEAT_RAPID_SHOT,
    FEAT_RIDE_BY_ATTACK,
    FEAT_RUN,
    FEAT_SCRIBE_SCROLL,
    FEAT_SHIELD_PROFICIENCY,
    FEAT_SHOT_ON_THE_RUN,
    FEAT_SILENT_SPELL,
    FEAT_SIMPLE_WEAPON,
    FEAT_SKILL_FOCUS,
    FEAT_SPELL_FOCUS,
    FEAT_SPELL_MASTERY,
    FEAT_SPELL_PENETRATION,
    FEAT_SPIRITED_CHARGE,
    FEAT_SPRING_ATTACK,
    FEAT_STILL_SPELL,
    FEAT_STUNNING_FIST,
    FEAT_SUNDER,
    FEAT_TOUGHNESS,
    FEAT_TRACK,
    FEAT_TRAMPLE,
    FEAT_TWO_WEAPON_FIGHTING,
    FEAT_WEAPON_FINESSE,
    FEAT_WEAPON_FOCUS,
    FEAT_WEAPON_SPECIALIZATION,
    FEAT_WHIRLWIND_ATTACK
};

enum ReqType {
    ReqNone,
    ReqAttr,
    ReqFeat,
    ReqSkill,
    ReqClass,
    ReqBonus
};

enum ApplyType {
    ApplyNone,
    ApplyAttr,
    ApplySkill
};

class TempReq {
public:
    TempReq(void);
    ~TempReq(void);

    static void		Apply(void);

    VNum		vnum;		// location of req in feat_index
    ReqType		type;
    UInt32		where;		// Attr, Skill, Bonus locator
    UInt32		value;		// requirement value (+2 or -1)
    char *		featName;	// if it has a feat requirement name it
};

class FeatReq {
public:
    FeatReq(void);
    ~FeatReq(void);

    ReqType	type;
    UInt32	where;
    UInt32	requirement;
};

class FeatAffect {
public:
    FeatAffect(void);
    FeatAffect(FeatAffect *aff, CHAR_DATA *ch);
    ~FeatAffect(void);

    void	ToChar(CHAR_DATA *ch);
    void	Remove(CHAR_DATA *ch);
    bool	HasFeat(CHAR_DATA *ch, ApplyType type);

    ApplyType	type;
    UInt32	location;
    UInt32	modifier;
};

class FeatData {
public:
	FeatData(void);
	~FeatData(void);

	bool	AddAffect(FeatTypes type, UInt32 loc, UInt32 mod);

	VNum			vnum;
	char *			name;
	char *			description;

	SInt32			type;
	SInt32			level;

	LList<FeatReq *>	reqs;
	LList<FeatAffect *>	affects;
};

RNum real_feat(VNum vnum);
RNum find_feat_by_name(char *name);
FeatData *get_feat_data(char *name);

void feats_save_to_disk(void);

#endif