From: Jaco van Iterson Subject: Proposal for character related structures I'd like to see circles character related structures being cleaned up. There are a few things that are confusing, things that have different meaning for PC's or NPC's, like name, short_description, long_description, and description. I don't know exactly anymore but I think name is the PC's name and the NPC's name list, short_description is the NPC's name and nothing for the PC, long_description is the NPC's description and nothing for the PC, and description is the PC's description and the NPC's description for the default position. I probably have some things wrong but the point is this can be made less confusing and complex. There are also a few things that take unneccesary memory, like the mob_specials which are also in the PC's data structures. Pointers to these structures could be used that are only alocated for NPC. There are a few things that need to be saved seperate into the player file. (sex, level, weight, height, etc.) These could be put in a structure and saved that way. Also not all data has a macro, and not always the macro is used in the code. (very anoying if you want to change the structures) So these things are the things I'd like to see changed in the circle code. Instead of telling how I'd like to see the structures changed I've changed the relevant parts of structs.h and utils.h and added them here. It makes this mail quiet a bit longer but it will be a lot easyer to read than my english (for coders anyway). Most changes are just name changes, some things had the wrong name or were double. (like the name and description strings I mentioned above) (most name changes are just changes to my taste, like struct char_data to struct character etc.) Another change is the proto type table. It exists of 3 elements now and makes the mob_index table obsolete. A bigger part of the NPC data is now only to be find in the proto table (was index table) this saves memory. The macro name have the CHAR_ prefix for NPC and PC data, NPC_ for NPC-only data and PC_ for PC-only data. The GET_ prefix is only used when the macro can't be used for a l-value. I hope you all like the structures suggested by me and that someone is willing to put them into circle (I have some tips to do it fast but it will still be a lot of work). I apologize for the long mail (please be careful not to include it all in a reply). Jaco. #################################################################### /* * char-related structures (structs.h) */ /* strings for both PC's and NPC's */ struct char_strings { char *name_list; char *short_description; char *long_description; }; /* strings for PC's */ struct player_strings { char *title; char *poofin; char *poofout; }; /* strings for NPC's */ struct npc_strings { char *default_line; }; /* data for both PC's and NPC's, is saved in player file */ struct saved_char { byte sex; byte class; byte level; ubyte weight; ubyte height; short alignment; char armor_class; byte hitroll; byte damroll; int gold; int bank_gold; }; /* data for PC's, is saved in player file */ struct saved_player { byte hometown; byte clan; byte guild; }; /* abilities for PC's and NPC's, is saved in player file */ struct saved_abilities { byte str; byte str_add; byte intel; byte wis; byte dex; byte con; byte cha; }; /* points for PC's and NPC's, is saved in player file */ struct saved_points { short hit; short max_hit; short mana; short max_mana; short move; short max_move; int experience; }; /* specials for PC's and NPC's, is saved in player file */ struct saved_char_specials { /* idnum this is probably a PC only thing, I'm not sure */ long idnum; struct char_affections affected_by; }; /* specials for PC's, is saved in player file */ struct saved_player_specials { room_num load_room; byte invis_level; byte bad_pws; byte wimp_level; byte spells_to_learn; char freeze_level; byte conditions[3]; byte skills[MAX_SKILLS+1]; bool talks[MAX_TONGUE]; struct time_data time; struct preferances pref; struct player_flags flag; }; /* An affect structure, is saved in player file */ struct affected_type { /* no more next pointer, changed from linked list to * (growing and shrinking) table (saves bytes, smaller pfile) */ short type; short duration; ubyte location; byte modifier; struct char_affections bitvector; }; struct affections_list { /* head of affections table and number of elements */ ubyte number_of_affections; struct affected_type *affect; }; /* Structure used for chars following other chars */ struct follow_type { struct character *follower; struct follow_type *next; }; /* all PC only data */ struct pc_only { int file_position; room_num was_in_room; /* for linkdead */ void *last_olc_targ; int last_olc_mode; struct alias *aliases; struct character *last_tell; struct player_strings string; struct saved_player data; struct saved_player_specials specials; struct saved_abilities base_abilities; }; /* data that doesn't need to be copied for new mobiles */ struct npc_only_shared { int virtual_number; short index_number; int total_in_game; byte default_pos; byte attack_type; byte damnodice; byte damsizedice; SPEC_PROCIAL(*func); }; /* all NPC only data */ struct npc_only { struct npc_strings string; struct character *fighting[3]; struct mobflags flag; byte last_direction; memory_rec *memory; struct npc_only_shared *shared; }; /* ================== Structure for player/non-player ===================== */ struct character { room_num in_room; byte position; byte lost_time; byte carry_items; byte num_affections; int carry_weight; int idle_timer; short apply[4]; short apply_saving_throw[5]; struct saved_char data; struct saved_char_specials specials; struct saved_points points; struct char_strings string; struct affections_list affections; struct saved_abilities abilities; struct pc_only *pc; struct npc_only *npc; struct obj_data *equipment[NUM_WEARS]; struct obj_data *carrying; struct descriptor_data *desc; struct character *next_in_room; struct character *next; struct character *next_fighting; struct character *fighting; struct character *hunting; struct follow_type *followers; struct character *master; struct mob_prog_act_list *mpact; int mpactnum; }; /* File Structure for Player. BEWARE: Changing it will ruin the playerfile */ struct char_file_u { /* strings */ char name[MAX_NAME_LENGTH+1]; char password[MAX_PWD_LENGTH+1]; char description[EXDSCR_LENGTH]; char title[MAX_TITLE_LENGTH+1]; char host[HOST_LENGTH+1]; char poofin[MAX_TITLE_LENGTH+1]; char poofout[MAX_TITLE_LENGTH+1]; /* structures */ struct saved_char char_data; struct saved_player player_data; struct saved_char_specials char_specials; struct saved_player_specials player_specials; struct saved_abilities abilities; struct saved_points points; struct player_flags flag; struct affected_type affect[MAX_AFFECT]; }; /* npc prototype table element */ struct npc { /* replaces mob_proto and mob_index */ struct character character; struct npc_only npc_only; struct npc_only_shared npc_only_shared; }; #################################################################### /* character related macros in utils.h */ /* character strings */ #define CHAR_NAME_LIST(ch) (ch)->string.name_list #define CHAR_NAME(ch) (ch)->string.short_description #define CHAR_DESCRIPTION(ch) (ch)->string.long_description /* pc only strings strings */ #define PC_TITLE(ch) (ch)->pc->string.title #define PC_POOFIN(ch) (ch)->pc->string.poofin #define PC_POOFOUT(ch) (ch)->pc->string.poofout /* npc only strings strings */ #define NPC_DEFAULT_LINE(ch) (ch)->npc->string.default_line /* character data */ #define CHAR_SEX(ch) (ch)->data.sex #define CHAR_CLASS(ch) (ch)->data.class #define CHAR_LEVEL(ch) (ch)->data.level #define CHAR_HEIGHT(ch) (ch)->data.height #define CHAR_WEIGHT(ch) (ch)->data.weight #define CHAR_ALIGNMENT(ch) (ch)->data.alignment #define CHAR_AC(ch) (ch)->data.armor_class #define CHAR_HITROLL(ch) (ch)->data.hitroll #define CHAR_DAMROLL(ch) (ch)->data.damroll #define CHAR_GOLD(ch) (ch)->data.gold #define CHAR_BANK_GOLD(ch) (ch)->data.bank_gold /* pc only data */ #define PC_HOMETOWN(ch) (ch)->pc->data.hometown #define PC_CLAN(ch) (ch)->pc->data.clan #define PC_GUILD(ch) (ch)->pc->data.guild /* character abilities */ #define CHAR_STR(ch) (ch)->abilities.str #define CHAR_ADD(ch) (ch)->abilities.str_add #define CHAR_DEX(ch) (ch)->abilities.dex #define CHAR_INT(ch) (ch)->abilities.intel #define CHAR_WIS(ch) (ch)->abilities.wis #define CHAR_CON(ch) (ch)->abilities.con #define CHAR_CHA(ch) (ch)->abilities.cha /* character points */ #define CHAR_HIT(ch) (ch)->points.hit #define CHAR_MAX_HIT(ch) (ch)->points.max_hit #define CHAR_MANA(ch) (ch)->points.mana #define CHAR_MAX_MANA(ch) (ch)->points.max_mana #define CHAR_MOVE(ch) (ch)->points.move #define CHAR_MAX_MOVE(ch) (ch)->points.max_move #define CHAR_EXP(ch) (ch)->points.experience /* character specials */ #define CHAR_IDNUM(ch) (ch)->specials.idnum #define AFF_FLAGS(ch) (ch)->specials.affected_by /* pc only specials */ #define PC_LOADROOM(ch) (ch)->pc->specials.load_room #define PC_INVIS_LEV(ch) (ch)->pc->specials.invis_level #define PC_BAD_PWS(ch) (ch)->pc->specials.bad_pws #define PC_WIMP_LEV(ch) (ch)->pc->specials.wimp_level #define PC_PRACTICES(ch) (ch)->pc->specials.spells_to_learn #define PC_FREEZE_LEV(ch) (ch)->pc->specials.freeze_level #define CHAR_COND(ch, i) (ch)->pc->specials.conditions[(i)] #define PC_SKILL(ch, i) (ch)->pc->specials.skills[(i)] #define PC_TALK(ch, i) (ch)->pc->specials.talks[(i)] #define PC_BORN(ch) (ch)->pc->specials.time.birth #define PC_PLAYED(ch) (ch)->pc->specials.time.played #define PC_LOGON(ch) (ch)->pc->specials.time.logon #define PRF_FLAGS(ch) (ch)->pc->specials.pref #define PLR_FLAGS(ch) (ch)->pc->specials.flag /* character affection list */ #define CHAR_AF_NUM(ch) (ch)->affections.number_of_affections #define CHAR_AFFECTIONS(ch) (ch)->affections.affect #define CHAR_AFFECTION(ch, i) CHAR_AFFECTIONS(ch)[(i)] #define CHAR_AF_TYPE(ch, i) CHAR_AFFECTION((ch),(i)).type #define CHAR_AF_DURATION(ch, i) CHAR_AFFECTION((ch),(i)).duration #define CHAR_AF_LOCATION(ch, i) CHAR_AFFECTION((ch),(i)).location #define CHAR_AF_MODIFIER(ch, i) CHAR_AFFECTION((ch),(i)).modifier #define CHAR_AF_BITVECTOR(ch, i) CHAR_AFFECTION((ch),(i)).bitvector /* pc base abilities */ #define PC_BASE_ABILITIES(ch) (ch)->pc->base_abilities #define PC_BASE_STR(ch) (ch)->pc->base_abilities.str #define PC_BASE_ADD(ch) (ch)->pc->base_abilities.str_add #define PC_BASE_DEX(ch) (ch)->pc->base_abilities.dex #define PC_BASE_INT(ch) (ch)->pc->base_abilities.intel #define PC_BASE_WIS(ch) (ch)->pc->base_abilities.wis #define PC_BASE_CON(ch) (ch)->pc->base_abilities.con #define PC_BASE_CHA(ch) (ch)->pc->base_abilities.cha /* other pc only data */ #define PC_FILE_POSITION(ch) (ch)->pc->file_position #define PC_WAS_IN(ch) (ch)->pc->was_in_room #define PC_ALIASES(ch) (ch)->pc->aliases #define PC_LAST_TELL(ch) (ch)->pc->last_tell /* shared npc only data */ #define NPC_VNUM(ch) (ch)->npc->shared->virtual_number #define NPC_INDEX(ch) (ch)->npc->shared->index_number #define NPC_TOTAL(ch) (ch)->npc->shared->total_in_game #define NPC_DEFAULT_POS(ch) (ch)->npc->shared->default_pos #define NPC_ATTACK_TYPE(ch) (ch)->npc->shared->attack_type #define NPC_ATTACK_N_O_DICE(ch) (ch)->npc->shared->damnodice #define NPC_ATTACK_SIZEDICE(ch) (ch)->npc->shared->damsizedice #define NPC_SPEC_PROC(ch) (ch)->npc->shared->func /* other npc only data */ #define NPC_SHARED(ch) (ch)->npc->shared #define NPC_FLAGS(ch) (ch)->npc->flag /* last_direction */ #define NPC_MEMORY(ch) (ch)->npc->memory /* other common character data */ #define CHAR_IN_ROOM(ch) (ch)->in_room #define CHAR_POSITION(ch) (ch)->position #define CHAR_PENALTY(ch) (ch)->lost_time #define CHAR_WEIGHT_CARRYING(ch) (ch)->carry_items #define CHAR_ITEMS_CARRYING(ch) (ch)->carry_weight #define CHAR_IDLE(ch) (ch)->idle_timer #define CHAR_APPLY(ch, i) (ch)->apply[(i)] #define CHAR_SAVE(ch, i) (ch)->apply_saving_throw[(i)] /* data, specials, points, string, affections */ #define CHAR_ABILITIES(ch) (ch)->abilities #define CHAR_PC(ch) (ch)->pc #define CHAR_NPC(ch) (ch)->npc /* *equipment[NUM_WEARS], *carrying, *carrying */ /* *next_in_room, *next, *next_fighting */ #define FIGHTING(ch) (ch)->fighting #define HUNTING(ch) (ch)->hunting /* *followers, *master, *mpact, mpactnum */ /* npc table elements */ #define NPC_TABLE_CHAR(i) (&(npc_proto[(i)].character)) #define NPC_TABLE_NPC(i) (&(npc_proto[(i)].npc_only)) #define NPC_TABLE_SHARED(i) (&(npc_proto[(i)].npc_only_shared)) ###################################################################