/***************************************************************************
* file: structs.h , Structures Part of DIKUMUD *
* Usage: Declarations of central data structures *
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
* *
* Copyright (C) 1992, 1993 Michael Chastain, Michael Quan, Mitchell Tse *
* Performance optimization and bug fixes by MERC Industries. *
* You can use our stuff in any way you like whatsoever so long as this *
* copyright notice remains intact. If you like it please drop a line *
* to mec@garnet.berkeley.edu. *
* *
* This is free software and you are benefitting. We hope that you *
* share your changes too. What goes around, comes around. *
***************************************************************************/
/* For 'char_player_data' */
#define MAX_TONGUE 3 /* Used in CHAR_FILE_U *DO*NOT*CHANGE* */
#define MAX_SKILLS 400 /* Used in CHAR_FILE_U *DO*NOT*CHANGE* */
#define MAX_WEAR 18
#define MAX_AFFECT 25 /* Used in CHAR_FILE_U *DO*NOT*CHANGE* */
#define DRUNK 0
#define FULL 1
#define THIRST 2
/* Bitvector for 'affected_by' */
#define AFF_BLIND 1
#define AFF_INVISIBLE 2
#define AFF_DETECT_EVIL 4
#define AFF_DETECT_INVISIBLE 8
#define AFF_DETECT_MAGIC 16
#define AFF_SENSE_LIFE 32
#define AFF_HOLD 64
#define AFF_SANCTUARY 128
#define AFF_GROUP 256
#define AFF_CURSE 1024
#define AFF_FLAMING 2048
#define AFF_POISON 4096
#define AFF_PROTECT_EVIL 8192
#define AFF_PARALYSIS 16384
#define AFF_MORDEN_SWORD 32768
#define AFF_FLAMING_SWORD 65536
#define AFF_SLEEP 131072
#define AFF_DODGE 262144
#define AFF_SNEAK 524288
#define AFF_HIDE 1048576
#define AFF_FEAR 2097152
#define AFF_CHARM 4194304
#define AFF_FOLLOW 8388608
#define AFF_WIMPY 16777216
#define AFF_INFRARED 33554432
#define AFF_THIEF 67108864
#define AFF_KILLER 134217728
#define AFF_FLYING 268435456
#define AFF_PLAGUE 536870912
/* modifiers to char's abilities */
#define APPLY_NONE 0
#define APPLY_STR 1
#define APPLY_DEX 2
#define APPLY_INT 3
#define APPLY_WIS 4
#define APPLY_CON 5
#define APPLY_SEX 6
#define APPLY_CLASS 7
#define APPLY_LEVEL 8
#define APPLY_AGE 9
#define APPLY_CHAR_WEIGHT 10
#define APPLY_CHAR_HEIGHT 11
#define APPLY_MANA 12
#define APPLY_HIT 13
#define APPLY_MOVE 14
#define APPLY_GOLD 15
#define APPLY_EXP 16
#define APPLY_AC 17
#define APPLY_ARMOR 17
#define APPLY_HITROLL 18
#define APPLY_DAMROLL 19
#define APPLY_SAVING_PARA 20
#define APPLY_SAVING_ROD 21
#define APPLY_SAVING_PETRI 22
#define APPLY_SAVING_BREATH 23
#define APPLY_SAVING_SPELL 24
/* 'class' for PC's */
#define CLASS_MAGIC_USER 1
#define CLASS_CLERIC 2
#define CLASS_THIEF 3
#define CLASS_WARRIOR 4
/* 'class' for NPC's */
#define CLASS_OTHER 0 /* These are not yet used! */
#define CLASS_UNDEAD 1 /* But may soon be so */
#define CLASS_HUMANOID 2 /* Idea is to use general */
#define CLASS_ANIMAL 3 /* monster classes */
#define CLASS_DRAGON 4 /* Then for example a weapon */
#define CLASS_GIANT 5 /* of dragon slaying is pos. */
/* sex */
#define SEX_NEUTRAL 0
#define SEX_MALE 1
#define SEX_FEMALE 2
/* positions */
#define POSITION_DEAD 0
#define POSITION_MORTALLYW 1
#define POSITION_INCAP 2
#define POSITION_STUNNED 3
#define POSITION_SLEEPING 4
#define POSITION_RESTING 5
#define POSITION_SITTING 6
#define POSITION_FIGHTING 7
#define POSITION_STANDING 8
/* for mobile actions: specials.act */
#define ACT_SPEC 1 /* special routine to be called if exist */
#define ACT_SENTINEL 2 /* this mobile not to be moved */
#define ACT_SCAVENGER 4 /* pick up stuff lying around */
#define ACT_ISNPC 8 /* This bit is set for use with IS_NPC() */
#define ACT_NICE_THIEF 16 /* Set if a thief should NOT be killed */
#define ACT_AGGRESSIVE 32 /* Set if automatic attack on NPC's */
#define ACT_STAY_ZONE 64 /* MOB Must stay inside its own zone */
#define ACT_WIMPY 128 /* MOB Will flee when injured, and if */
/* aggressive only attack sleeping players */
#define ACT_2ND_ATTACK 256 /* Set this mobile to have 2nd attack */
#define ACT_3RD_ATTACK 512 /* Set this mobile to have 3rd attack */
#define ACT_4TH_ATTACK 1024 /* Set this mobile to have 4th attack */
/* Each attack bit must be set to get up */
/* 4 attacks */
/*
* For ACT_AGGRESSIVE_XXX, you must also set ACT_AGGRESSIVE
* These switches can be combined, if none are selected, then
* the mobile will attack any alignment (same as if all 3 were set)
*/
#define ACT_AGGR_EVIL 2048 /* Auto attack evil PC's */
#define ACT_AGGR_GOOD 4096 /* Auto attack good PC's */
#define ACT_AGGR_NEUT 8192 /* Auto attack neutral PC's */
#define ACT_AGGR_ALL (ACT_AGGR_EVIL|ACT_AGGR_GOOD|ACT_AGGR_NEUT)
#define ACT_UNDEAD 16384 /* The undead flag */
/* For players : specials.act */
#define PLR_BRIEF 1
#define PLR_NOSHOUT 2
#define PLR_COMPACT 4
#define PLR_DONTSET 8 /* Dont EVER set */
#define PLR_NOTELL 16
#define PLR_NOEMOTE 32
#define PLR_LOG 64 /* log activities of this player. */
#define PLR_FREEZE 128 /* No commands available */
struct char_player_data
{
char *name; /* PC / NPC s name (kill ... ) */
char *short_descr; /* for 'actions' */
char *long_descr; /* for 'look'.. Only here for testing */
char *description; /* Extra descriptions */
char *title; /* PC / NPC s title */
byte sex; /* PC / NPC s sex */
byte class; /* PC s class or NPC alignment */
byte level; /* PC / NPC s level */
int hometown; /* PC s Hometown (zone) */
bool talks[MAX_TONGUE]; /* PC s Tounges 0 for NPC */
struct time_data time; /* PC s AGE in days */
struct time_data tmptime; /* PC s AGE in days, modified */
ubyte weight; /* PC / NPC s weight */
ubyte height; /* PC / NPC s height */
};
/* Used in CHAR_FILE_U *DO*NOT*CHANGE* */
struct char_ability_data
{
sbyte str;
sbyte unused;
sbyte intel;
sbyte wis;
sbyte dex;
sbyte con;
};
/* Used in CHAR_FILE_U *DO*NOT*CHANGE* */
struct char_point_data
{
short mana;
short max_mana; /* Not useable */
short hit;
short max_hit; /* Max hit for NPC */
short move;
short max_move; /* Max move for NPC */
short armor; /* Internal -100..100, external -10..10 AC */
int gold; /* Money carried */
int exp; /* The experience of the player */
sbyte hitroll; /* Any bonus or penalty to the hit roll */
sbyte damroll; /* Any bonus or penalty to the damage roll */
};
struct char_special_data
{
CHAR_DATA *fighting; /* Opponent */
CHAR_DATA *hunting; /* Hunting person. */
long affected_by; /* Bitvector for spells/skills affected by */
byte position; /* Standing or ... */
byte default_pos; /* Default position for NPC */
ubyte act; /* flags for NPC behavior */
ubyte practices; /* How many can you learn yet this level */
int carry_weight; /* Carried weight */
byte carry_items; /* Number of items carried */
int timer; /* Timer for update */
short was_in_room; /* storage of location for linkdead people */
short apply_saving_throw[5]; /* Saving throw (Bonuses) */
sbyte conditions[3]; /* Drunk full etc. */
byte damnodice; /* The number of damage dice's */
byte damsizedice; /* The size of the damage dice's */
byte last_direction; /* The last direction the monster went */
int attack_type; /* The Attack Type Bitvector for NPC's */
int alignment; /* +-1000 for alignments */
bool holyLite; /* Holy lite mode */
bool wizInvis; /* If on, people can't see you. */
bool unused;
};
/* Used in CHAR_FILE_U *DO*NOT*CHANGE* */
struct char_skill_data
{
byte learned; /* % chance for success 0 = not learned */
bool recognise; /* If you can recognise the scroll etc. */
};
/* Used in CHAR_FILE_U *DO*NOT*CHANGE* */
struct affected_type
{
sbyte type; /* The type of spell that caused this */
short duration; /* For how long its effects will last */
sbyte modifier; /* This is added to apropriate ability */
byte location; /* Tells which ability to change(APPLY_XXX)*/
long bitvector; /* Tells which bits to set (AFF_XXX) */
struct affected_type *next;
};
struct follow_type
{
struct char_data *follower;
struct follow_type *next;
};
struct char_data
{
short nr; /* monster nr (pos in file) */
short in_room; /* Location */
char pwd[11]; /* Password */
struct char_player_data player; /* Normal data */
struct char_ability_data abilities; /* Abilities */
struct char_ability_data tmpabilities;/* The abilities we will use */
struct char_point_data points; /* Points */
struct char_special_data specials; /* Special plaing constants */
struct char_skill_data skills[MAX_SKILLS]; /* Skills */
struct affected_type *affected; /* affected by what spells */
struct obj_data *equipment[MAX_WEAR]; /* Equipment array */
struct obj_data *carrying; /* Head of list */
struct descriptor_data *desc; /* NULL for mobiles */
CHAR_DATA *next; /* Next anywhere in game */
CHAR_DATA *next_in_room; /* Next in room */
CHAR_DATA *next_fighting; /* Next fighting */
struct follow_type *followers; /* List of chars followers */
struct char_data *master; /* Who is char following? */
};
/*
* File element for player file.
* BEWARE: changing it will ruin the file.
*/
struct char_file_u
{
int version;
byte sex;
byte class;
byte level;
time_t birth; /* Time of birth of character */
int played; /* Number of secs played in total */
ubyte weight;
ubyte height;
char title[80];
short hometown;
char description[240];
bool talks[MAX_TONGUE];
short load_room; /* Which room to place char in */
struct char_ability_data abilities;
struct char_point_data points;
struct char_skill_data skills[MAX_SKILLS];
struct affected_type affected[MAX_AFFECT];
/* specials */
ubyte practices;
int alignment;
time_t last_logon; /* Time (in secs) of last logon */
ubyte act; /* ACT Flags */
/* char data */
char name[20];
char pwd[11];
short apply_saving_throw[5];
int conditions[3];
int unused[100];
};