/* Required headers... */ /************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*************************************************************************** * ROM 2.4 is copyright 1993-1995 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@pacinfo.com) * * Gabrielle Taylor (gtaylor@pacinfo.com) * * Brian Moore (rom@rom.efn.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * ***************************************************************************/ /*************************************************************************** * ROT 1.4 is copyright 1996-1997 by Russ Walsh * * By using this code, you have agreed to follow the terms of the * * ROT license, in the file doc/rot.license * ***************************************************************************/ /* CLAN CODE HEADERS by Nico/Zarko(Deryck Arnold) - if it breaks, you know who to blame! * Written exclusively for Asgardian Nightmares - point system idea by Solphor. * Definitions for newclan.c. * * Put #include "newclan.h" in all files bar merc.h that are listed here: act_wiz.c: In do_copyover: save_all_clans( ); save_all_rosters( ); comm.c: In do_crashsave: save_all_clans( ); save_all_rosters( ); In nanny: update_roster( d->character, FALSE ); In copyover_recover for each pc character: update_roster( d->character, FALSE ); In close_socket: update_roster( d->character, TRUE ); In bust_a_prompt: case ED_CEDIT: sprintf( buf, "{B[ {GCEDIT {B- {WNo. {R%d {B- {x%s {B]{x\n\r", ((CLAN_DATA *) ch->desc->pCedit)->id, ((CLAN_DATA *) ch->desc->pCedit)->c_name ); break; case ED_MCEDIT: sprintf( buf, "{B[ {MM{GCEDIT {B- {x%s {B-{w %s {B]{x\n\r", ((CLAN_DATA *) ch->desc->pCedit)->c_name, ((MOB_INDEX_DATA *) ch->desc->pEdit)->short_descr ); break; case ED_OCEDIT: sprintf( buf, "{B[ {CO{GCEDIT {B- {x%s {B-{w %s {B]{x\n\r", ((CLAN_DATA *) ch->desc->pCedit)->c_name, ((OBJ_INDEX_DATA *) ch->desc->pEdit)->short_descr ); break; case ED_RCEDIT: sprintf( buf, "{B[ {RR{GCEDIT {B- {x%s {B-{w %s {B]{x\n\r", ((CLAN_DATA *) ch->desc->pCedit)->c_name, ((ROOM_INDEX_DATA *) ch->desc->pEdit)->name ); break; case ED_SCEDIT: sprintf( buf, "{B[ {YS{GCEDIT {B- {WNo. {R%d {B- {x%s {B]{x\n\r", ((CLAN_DATA *) ch->desc->pCedit)->id, ((CLAN_DATA *) ch->desc->pCedit)->c_name ); break; db.c: In boot_db: log_string( "Loading Clans." ); load_all_clans( ); log_string( "Loading Player Rosters." ); load_all_rosters( ); log_string( "Loading PK History Table." ); load_pkhist_data( ); log_string( "Fixing Clan Data." ); fix_clan_boot( ); fight.c: In is_safe_new: return !can_pkill_other( ch, victim, !show ); handler.c: In can_pkill: return can_pkill_other( ch, victim, TRUE ); In is_pkill replace with: return can_pkill_other( ch, victim, FALSE ); interp.c: Command table entries: { "bounty", do_bounty, POS_SLEEPING, 0, 1, LOG_NORMAL, 1 }, { "cedit", do_cedit, POS_RESTING, 0, 1, LOG_ALWAYS, 1 }, { "clan", do_ctalk, POS_SLEEPING, 0, 1, LOG_NORMAL, 1 }, { "clist", do_clist, POS_SLEEPING, 0, 1, LOG_NORMAL, 1 }, { "loner", do_loner, POS_SLEEPING, 0, 1, LOG_NORMAL, 1 }, { "notnewbie", do_notnewbie, POS_SLEEPING, 0, 1, LOG_NORMAL, 1 }, { "petition", do_petition, POS_SLEEPING, 0, 1, LOG_NORMAL, 1 }, { "pkhist", do_pk_history, POS_SLEEPING, 0, 1, LOG_NORMAL, 1 }, { "pkill", do_go_pkill, POS_SLEEPING, 0, 1, LOG_NORMAL, 1 }, { "rank", do_rank, POS_SLEEPING, 0, 1, LOG_NORMAL, 1 }, { "roster", do_clan_roster, POS_SLEEPING, 0, 1, LOG_NORMAL, 1 }, In interpret, alter dispatching of normal command and disabled check to fit and add: if ( !found ) cSkillFound = interpret_clan_cmd( ch, command ); merc.h This needs to go in MOB/OBJ/ROOM_INDEX_DATA union { CLAN_DATA * data; int id; } clan_data; ********************************* NO NEED FOR THIS UNION ANYMORE!!! In typedef statements: typedef struct clan_data CLAN_DATA; typedef struct roster_data ROSTER_DATA; Add to the rename function something to rename roster data. Add free_roster_data( roster ) to the delete command and save_all_rosters( ). Stuff to test: - PK checks - PK rank checks - Clan creation/deletion - Clan depositing - Clan member management/exile - Clan equipment wearing - Clan skills - Clan purchases/upgrades - Mob/obj/room clan checks - Reboots/copyovers/crashes While wizlocked for testing, put in comm.c =~ 2692: write_to_buffer( d, "The game is wizlocked at the moment.\n\r" ); write_to_buffer( d, "The new clan system is being tested.\n\r" ); write_to_buffer( d, "Thank you for your patience.\n\r" ); * * */ /*********************************** DEFINED VALUES ***********************************/ /* Time defines in time_t */ #define TIME_SECOND 1 // Duh #define TIME_MINUTE (60 * TIME_SECOND) #define TIME_HOUR (60 * TIME_MINUTE) #define TIME_DAY (24 * TIME_HOUR) #define TIME_WEEK (7 * TIME_DAY) #define TIME_ROSTER_DELETE (8 * TIME_WEEK) #define TIME_ROSTER_UPD_TICK (10 * TIME_MINUTE) #define TIME_NEWBIE_GRACE (4 * TIME_WEEK) #define TIME_ROSTER_PEN_TICK (TIME_HOUR) #define TIME_SPAMKILL_LIMIT (TIME_HOUR) /* Area vnum defines */ #define VNUM_CLAN_LOWER 60100 // Lower clan area vnum #define VNUM_CLAN_UPPER 70000 // Upper clan area vnum #define VNUM_CLAN_BLOCK 50 // Number of vnums per clan #define VNUM_STOCK_LOWER 60000 // Lower stock vnum #define VNUM_STOCK_UPPER 60099 // Upper stock vnum #define VNUM_MARKET_SQUARE 3014 // Vnum of the market square #define VNUM_CLAN_PET_ROOM 70000 /* Mob vnum defines */ #define VNUM_STOCK_MOB_GUARD 60000 // Stock clan guard vnum #define VNUM_STOCK_MOB_MAGE 60001 // Stock clan mage vnum #define VNUM_STOCK_MOB_MASON 60002 // Stock clan mason vnum #define VNUM_STOCK_MOB_TRAINER 60003 // Stock clan trainer vnum #define VNUM_STOCK_MOB_SMITH 60004 // Stock clan blacksmith vnum #define VNUM_STOCK_MOB_BREWER 60005 // Stock clan brewer vnum #define VNUM_STOCK_MOB_BAKER 60006 // Stock clan baker vnum #define VNUM_STOCK_MOB_GPRIEST 60007 // Stock clan good priest vnum #define VNUM_STOCK_MOB_EPRIEST 60008 // Stock clan evil priest vnum #define VNUM_STOCK_MOB_HEALER 60009 // Stock clan healer vnum #define VNUM_STOCK_MOB_SHOPKEEP 60010 // Stock clan shopkeep vnum #define VNUM_STOCK_MOB_PET 60011 // Stock clan pet vnum #define VNUM_STOCK_MOB_TANNER 60012 // Stock clan tanner vnum #define VNUM_STOCK_MOB_QUESTOR 60013 // Stock clan quest master vnum /* Obj vnum defines */ #define VNUM_STOCK_OBJ_FURNITURE 60000 // Stock clan furniture vnum #define VNUM_STOCK_OBJ_PORTAL 60001 // Stock clan portal vnum #define VNUM_STOCK_OBJ_SCROLL 60002 // Stock clan scroll vnum #define VNUM_STOCK_OBJ_WAND 60003 // Stock clan wand vnum #define VNUM_STOCK_OBJ_STAFF 60004 // Stock clan staff vnum #define VNUM_STOCK_OBJ_WEAPON 60005 // Stock clan weapon vnum #define VNUM_STOCK_OBJ_ARMOUR 60006 // Stock clan armour vnum #define VNUM_STOCK_OBJ_POTION 60007 // Stock clan potion vnum #define VNUM_STOCK_OBJ_CONTAINER 60008 // Stock clan container vnum #define VNUM_STOCK_OBJ_DCONTAINER 60009 // Stock clan drink container vnum #define VNUM_STOCK_OBJ_FOOD 60010 // Stock clan food vnum #define VNUM_STOCK_OBJ_BOAT 60011 // Stock clan board vnum #define VNUM_STOCK_OBJ_FOUNTAIN 60012 // Stock clan fountain vnum #define VNUM_STOCK_OBJ_SLOT_MACHINE 60013 // Stock clan slot machine vnum #define VNUM_STOCK_OBJ_PILL 60014 // Stock clan pill vnum #define VNUM_STOCK_OBJ_WARP_STONE 60015 // Stock clan warp stone vnum #define VNUM_STOCK_OBJ_DEMON_STONE 60016 // Stock clan demon stone vnum #define VNUM_STOCK_OBJ_LIGHT 60017 // Stock clan light vnum /* Room vnum defines */ #define VNUM_STOCK_ROOM_RECALL 60000 // Stock main clan hall #define VNUM_STOCK_ROOM_SMITHY 60001 // Stock smithy #define VNUM_STOCK_ROOM_WORKSHOP 60002 // Stock mage's workshop #define VNUM_STOCK_ROOM_GSHRINE 60003 // Stock good priest's shrine #define VNUM_STOCK_ROOM_ESHRINE 60004 // Stock evil priest's shrine #define VNUM_STOCK_ROOM_SHOP 60005 // Stock clan shop #define VNUM_STOCK_ROOM_TROOM 60006 // Stock clan trainers room #define VNUM_STOCK_ROOM_STABLE 60007 // Stock clan stable #define VNUM_STOCK_ROOM_BAKERY 60008 // Stock clan bakery #define VNUM_STOCK_ROOM_BREWERY 60009 // Stock clan brewery #define VNUM_STOCK_ROOM_TANNERY 60010 // Stock clan tannery /* Special Clan indices */ #define CLAN_NONE 0 // Non-clanned nonpk clan #define CLAN_LONER 1 // Non-clanned pk clan #define CLAN_PK_OUTCAST 2 // Exiled pk players go here #define CLAN_NONPK_OUTCAST 3 // Exiled non-pk players go here #define CLAN_IMMORTAL 4 // Immortal clan /* Clan mob types - don't forget cmob_name table */ #define CMOB_GUARD 0 // Clan guard #define CMOB_MAGE 1 // Clan mage #define CMOB_MASON 2 // Clan mason #define CMOB_TRAINER 3 // Clan trainer #define CMOB_SMITH 4 // Clan blacksmith #define CMOB_BREWER 5 // Clan brewer #define CMOB_BAKER 6 // Clan baker #define CMOB_GPRIEST 7 // Clan good priest -> has to be next to and before epriest #define CMOB_EPRIEST 8 // Clan evil priest -> has to be directly after gpriest #define CMOB_HEALER 9 // Clan healer #define CMOB_SHOPKEEP 10 // Clan shopkeep #define CMOB_PET 11 // Clan pet #define CMOB_TANNER 12 // Clan tanner #define CMOB_QUESTOR 13 // Clan questor #define CMOB_MAX 14 // Number of (referenced) clan mobs /* Clan room types */ #define CROOM_RECALL 0 // Recall room #define CROOM_SMITHY 1 // Smithy room #define CROOM_WORKSHOP 2 // Workshop room #define CROOM_GSHRINE 3 // Good shrine room -> has to be next to and before eshrine #define CROOM_ESHRINE 4 // Evil shrine room -> has to be directly after gshrine #define CROOM_SHOP 5 // Shop room #define CROOM_TROOM 6 // Trainers room #define CROOM_STABLE 7 // Stable for a pet #define CROOM_BAKERY 8 // Bakery for a baker #define CROOM_BREWERY 9 // Brewery for a brewer #define CROOM_TANNERY 10 // Tannery for a tanner #define CROOM_MAX 11 // Number of (referenced) clan rooms /* Rank stuff */ #define RANK_MEMBER 0 // <- Lowest intra-clan rank #define RANK_RECRUIT 4000 // There will be no leader or vice-leader #define RANK_SOLDIER 16000 // ranks. There will only be one designated #define RANK_LIEUTENANT 48000 // leader who will make the decisions, but #define RANK_COMMANDER 128000 // still has to gain points for skills/eq #define RANK_ECAPTAIN 512000 // <- Highest intra-clan rank /* Clan limits */ #define TOTAL_CLAN_RANK 6 // Total intra-clan ranks (expandable) #define MAX_PK_CLAN_MEMBERS 4 // Clan limit for pk clans #define MAX_NONPK_CLAN_MEMBERS 6 // Clan limit for non-pk clans #define MAX_CLAN_WHO_LENGTH 12 // Max length of colour name #define MAX_CLAN_RANK_LENGTH 17 // Max length of clan rank names /* Player flags in ROSTER_DATA */ #define ROST_AWAY (B) // Stops player from being penalised if inactive #define ROST_REROLL (C) // Deletes roster data if person doesn't finish for an extended period of time #define ROST_INACTIVE (D) // Activates after a certain amount of time, earlier for leaders #define ROST_CONFIRM_NEW (E) // Confirm creation of clan #define ROST_CONFIRM_PK (F) // Confirm choice to go pk #define ROST_CONFIRM_LONER (G) // Confirm choice to loner #define ROST_NEWBIE (H) // Marks player as a newbie #define ROST_EXILE_GRACE (I) // Grace period where player can leave clan without losing too much #define ROST_DELETED (J) // Marks the roster as deleted #define ROST_IMMORTAL (K) // Immortals /* PKHIST_DATA flags */ #define PKHIST_INVALID (A) // If the victim attacks the killer within the time limit #define PKHIST_CHINVALID (B) // If a member of the victim's clan attacks the killer, this gets flagged allowing entry into the victim's clan hall #define PKHIST_ARENA (C) // Arena or not. /* Log entry types */ #define ENTRY_DEPOSIT 0 // Clan deposits #define ENTRY_DELETE 1 // Clan deletion #define ENTRY_UPGRADE 2 // Clan upgrades #define ENTRY_CREATE 3 // Clan creation #define ENTRY_ACCEPT 4 // Petition accepted #define ENTRY_GUILD 5 // Remove/add via the guild command #define ENTRY_TRUST 6 // Trusting a member #define ENTRY_EXILE 7 // Clan exiles #define ENTRY_WAR 8 // Clan wars #define ENTRY_CHANGED 9 // Clan data changes /* Log filter types */ #define FILTER_NONE 0 // No filter #define FILTER_NAME 1 // Filter by name #define FILTER_TYPE 2 // Filter by type of entry #define FILTER_TIME 3 // Filter by time (everything starting from time specified) #define FILTER_KEYWORD 4 // Filter by keyword in entry string /* Editor types */ #if !defined(ED_NONE) #define ED_NONE 0 // Not editing anything #endif #define ED_CEDIT 8 // Main clan editor #define ED_MCEDIT 9 // Clan mob editor #define ED_OCEDIT 10 // Clan object editor #define ED_RCEDIT 11 // Clan room editor #define ED_SCEDIT 12 // Clan skill editor /* CEDIT trusts - note these are different to clan ranks */ #define TRUST_NONE -1 // No one can use the command #define TRUST_ALL 0 // Anyone, including those not in the clan can use the command #define TRUST_MEMBER 1 // Anyone in the clan #define TRUST_VLR 4 // Vice-leaders up #define TRUST_LDR 5 // Only leaders /* Point values for aqp and platinum */ #define POINT_VALUE_QP 4 // Aqp:point ratio #define POINT_VALUE_PLATINUM 1 // Platinum:point ratio /* Upgrade return states */ #define UPGRADE_SUCCESS 0 // Clan upgrade was a success - deduct money #define UPGRADE_FAIL 1 // Clan upgrade failed - report it #define UPGRADE_REQ_ARG 2 // Clan upgrade needs more arguments to execute /* COST_DATA flags */ #define UPGD_FLAG (A) // Clan upgrade is a flag type of upgrade #define UPGD_NO_BULK (B) // Clan upgrade cannot be bought in bulk #define UPGD_ROOM_OBJ (C) // Clan object isn't sold, but is placed in a room #define UPGD_XCOST (D) // Upgrade has a variable price /* XCOST_DATA flags */ #define XUPGD_IMM_SPECIAL (A) // For the only-one-allowed immunities #define XUPGD_MOB (B) // Can be applied to mobs #define XUPGD_OBJ (C) // Can be applied to objects #define BIT_AFFECT 0 // Affect bit #define BIT_SHIELD 1 // Shield bit /* Spell xcost types */ #define SPELL_DEFENSIVE 0 // Defensive spells like armour #define SPELL_OFFENSIVE 1 // Offensive spells like magic missile #define SPELL_MISC 2 // Misc spells like animate /* COST_DATA max value stuff */ #define MAX_NONE -1 // No max value #define MAX_SPECIAL -2 // Use max_func to calc special max value /* Misc prices */ #define PRICE_CLAN_QP 0 // Aqp price for a clan - need to have platinum too #define PRICE_CLAN_PLATINUM 30000 // Platinum price for a clan - need to have aquest points too #define PRICE_SKILL_MINOR_QP 2500 // Aqp price for a minor clan skill #define PRICE_SKILL_MINOR_PLAT 10000 // Platinum price for a minor clan skill #define PRICE_SKILL_MAJOR_QP 7500 // Aqp price for a major clan skill #define PRICE_SKILL_MAJOR_PLAT 15000 // Platinum price for a major clan skill /* File/Folder definitions */ #define CLAN_DATA_FOLDER "../data/clans/" // Clan data folder #define CLAN_HISTORY_FOLDER "../data/clans/history/" // Clan transactions (donations/punishments/upgrades) #define CLAN_DATA_LIST "../data/clans/clan.lst" // Clan data list #define TEST_CLAN_DATA_FOLDER "../data/clanstest/" // Clan data folder #define TEST_CLAN_HISTORY_FOLDER "../data/clanstest/history/" // Clan transactions (donations/punishments/upgrades) #define TEST_CLAN_DATA_LIST "../data/clanstest/clan.lst" // Clan data list #define ROSTER_DATA_FOLDER "../data/rosters/" // Roster data folder #define ROSTER_DATA_LIST "../data/rosters/roster.lst" // Roster data list #define TEST_ROSTER_DATA_FOLDER "../data/rosterstest/" // Roster data folder #define TEST_ROSTER_DATA_LIST "../data/rosterstest/roster.lst" // Roster data list #define PKHIST_DATA_FILE "../data/spamkill.dat" // Spam kill data file #if !defined(TEMP_FILE) // Define a temp file if not already defined #define TEMP_FILE "../player/romtmp" #endif /* Macros */ // Check whether the person has roster data #define HAS_ROSTER( Ch ) ( ((Ch) && (Ch)->pcdata && (Ch)->pcdata->roster \ && (Ch)->pcdata->roster->clan) ? TRUE : FALSE ) // Retrieve the person's roster data #define GET_ROSTER( Ch, Roster ) \ if ((Ch) && (Ch)->pcdata) { \ if ((Ch)->pcdata->roster == NULL) \ update_roster((Ch), FALSE); \ (Roster) = (Ch)->pcdata->roster; \ (Roster)->character = (Ch); \ } else \ (Roster) = NULL; #define SET_ROSTER( Ch, Roster ) ( (Roster) ? \ ((Ch)->pcdata->roster = (Roster)) : \ ((Ch)->pcdata->roster = NULL) ) #define EDIT_CLAN( Ch, Clan ) ( !((Ch)->desc->pCedit) ? \ ((Clan) = NULL) : \ ((Clan) = (CLAN_DATA *) (Ch)->desc->pCedit) ) #define IS_EDITING_CLAN( Ch, Clan ) ( (Ch)->desc->editor >= ED_CEDIT \ && (Ch)->desc->editor <= ED_SCEDIT \ && (Ch)->desc->pCedit == (void *) (Clan) ) // Macroise these so that the locations can be changed easily #define SET_EDIT_CLAN( Ch, Clan ) ( (Ch)->desc->pCedit = (void *) (Clan) ) // Sets what clan the person is editing #define SET_EDIT_ITEM( Ch, Item ) ( (Ch)->desc->pEdit = (void *) (Item) ) // Sets what item(e.g piece of eq) the person is editing #define SET_EDIT_TYPE( Ch, Type ) ( (Ch)->desc->editor = (Type) ) // Sets the type of editor(e.g. obj cedit) /************************************** TYPEDEFS **************************************/ //typedef struct clan_data CLAN_DATA; typedef const struct cost_data COST_DATA; typedef struct pkill_data PKILL_DATA; //typedef struct roster_data ROSTER_DATA; typedef struct pkhist_data PKHIST_DATA; typedef struct xcost_data XCOST_DATA; typedef int CALC ( CHAR_DATA *ch, COST_DATA *upgrade ); // Value retrieval function for price stuff #define CALC_FUN( fun ) int fun ( CHAR_DATA *ch, COST_DATA *upgrade ) #define DECLARE_CALC_FUN( fun ) CALC fun typedef bool CEDIT ( CHAR_DATA *ch, char *argument ); // Cedit olc type #define CEDIT_FUN( fun ) bool fun ( CHAR_DATA *ch, char *argument ) #define DECLARE_CEDIT_FUN( fun ) CEDIT fun typedef int UPGD ( CHAR_DATA *ch, char *argument, COST_DATA *upgrade, XCOST_DATA *xupgrade ); // Object upgrade function #define UPGD_FUN( fun ) int fun ( CHAR_DATA *ch, char *argument, COST_DATA *upgrade, XCOST_DATA *xupgrade ) #define DECLARE_UPGD_FUN( fun ) UPGD fun /************************************* STRUCTURES *************************************/ /* PKILL_DATA structure: * Usage: CLAN_DATA as *pkilldata * ROSTER_DATA as *pkilldata * * - For both pk data and arena data. * * - Records kills, deaths, wins and losses. * * - Differences between wins and kills / deaths and losses will * become more apparent in arena matches(team efforts). * * - Records overall points gained from pk/arena fights. * * - Points determine overall clan rank in CLAN_DATA context * and individual rank in ROSTER_DATA context. * */ struct pkill_data { PKILL_DATA * next; // For free list long kPoints; // Points (based on gains from kills) int kills; // Number of kills int deaths; // Number of deaths int wins; // Number of wins int losses; // Number of losses bool valid; // Memory management - indicates whether freed or not }; /* COST_DATA structure: * - Stores costs of clan items, rooms, mobs, upgrades. * * - Level requirements of mobs are also there. * * - Max overall limit only - too hard to keep track of max-per-mob * without making things too overly complex, so the 6-portal rule * will no longer be applicable. * * - Specific: Mobiles - 0=CMOB index, 1=CROOM index of reset room. * Objects - 0=stock vnum. * Rooms - 0=CROOM index. * MUpgrd - 0=CMOB index for specific upgrades. * OUpgrd - 0=item type for specific upgrades. * RUpgrd - 0=room flags if applicable. */ struct cost_data { char * name; // Name of item/upgrade char * descr; // Short description of the upgrade UPGD * func; // Pointer to function of upgrade/whatever CALC * curr_value; // Pointer to function to retrieve current value of clan's upgrade CALC * max_func; // Pointer to function to retrieve special max values XCOST_DATA * xcost; // Any extra tables long flags; // Any flags int quantity; // Quantity of items or modifier for effects int max; // Max limit(-1 for none) int specific[2]; // Specific type, i.e. item type (-1 for none) int qps; // Cost in questpoints int platinum; // Cost in platinum sh_int xreq1; // Mob index of req 1 for xcost sh_int xreq2; // Ditto for req 2 sh_int cMob[CMOB_MAX]; // Clan mob levels required bool cRoom[CROOM_MAX]; // Clan rooms required }; /* XCOST_DATA structure: * - Extra prices, e.g. spell types for scrolls * * - Bit member will hold skill gsns, wpn flags, wpn damtypes */ struct xcost_data { char * name; // Name of item long bit; // Loaded in at boot(if required) to speed up lookups (e.g. skill gsn, wpn flag..) int flags; // Special flags int qps; // Cost in questpoints int platinum; // Cost in platinum sh_int type; // Spell defensive, etc. sh_int req1; // Requirement one (e.g mage level) sh_int req2; // Requirement two (e.g smithy level) }; /* CLAN_DATA structure: * Usage: PCDATA *clan_data * * - Linked list design * * - Holds all the info on a clan. */ struct clan_data { CLAN_DATA * next; // Linked-list design for easier memory management CLAN_DATA * enemy; // Clan war enemy - more points for kills union { CLAN_DATA * data; // Clan data of petitioned enemy int id; // Id of clan petitioned for war } Penemy; PKILL_DATA * pkilldata; // PK data or arena data(in the case of nonpk clan) COST_DATA * upgrade; // Next upgrade pending confirmation MOB_INDEX_DATA * cMob[CMOB_MAX]; // Pointers to clan mob id data ROOM_INDEX_DATA * cRoom[CROOM_MAX]; // Pointers to clan room id data XCOST_DATA * xupgrade; // Points to selected xcost table ROSTER_DATA * u_rost; // Points to the person selecting the upgrade char * name; // Name of clan to be used as keyword char * c_name; // Coloured name of clan (No reference to black people here!) char * r_name[TOTAL_CLAN_RANK];// Rank names char * r_who[TOTAL_CLAN_RANK]; // Rank names on who char * description; // Clan description long platinum; // Platinum in clan account long qps; // Quest points in clan account time_t exit_changed; // Last time entrance/exit of clan hall was changed time_t edit_time; // Time period in which clan data can be edited. int u_quantity; // Quantity of pending upgrade desired int id; // Reference number int members; // Number of members in the clan int vnum[2]; // Lower and upper clan area vnums for the specific clan int entrance_vnum; // Room outside the entrance bool pkill; // TRUE for pkill clans, FALSE for nonpkill clans bool independent; // For clans like loner or no clan bool valid; // Memory management - indicates whether freed or not int skills[2]; // Major and minor clanskills. }; /* ROSTER_DATA structure: * Usage: PCDATA as *roster * * - Linked-list design. * * - Provides the roster for clans. * * - Individual player scores are stored here. * */ struct roster_data { ROSTER_DATA * next; // Linked-list design for easier memory management CHAR_DATA * character; // Pointer back to character CLAN_DATA * clan; // Player clan (even if none) CLAN_DATA * petition; // Clan petitioned for membership PKILL_DATA * pkilldata; // Individual scores char * name; // Name of player time_t last_login; // Last login time - inactive people will be booted time_t penalty_time; // Clan punishments - will work with flags long dPoints; // Points based on donations long flags; // Flags e.g CLAN_LEADER for leader long bounty; // Bounty on head int id; // Unique id number int trust; // Clan trust - assignable by clan leader bool valid; // Memory management - indicates whether freed or not }; /* PKHIST_DATA structure * - Table design * * - Records pkills - prevents spamkilling by recording time * * - Players can view whos killed who * */ struct pkhist_data { ROSTER_DATA * victim; // Data of victim ROSTER_DATA * killer; // Data of killer CLAN_DATA * vClan; // Current clan of vicitm CLAN_DATA * kClan; // Current clan of killer time_t time; // Time of death long flags; // Flags like invalid flags int vLevel; // Level of victim int kLevel; // Level of killer }; /* struct log_type * - For clan logs * * - Display name and keyword */ struct log_type { char * keyword; // Keyword of the item char * display; // Display name of the item }; /* struct vnum_table * - Stores names/vnums of referenced rooms/mobs */ struct vnum_table { char * name; // Name of type int vnum; // Vnum of type }; /* struct clan_ranks: * - Contains the default clan ranks and points required for each. * - Might enable it to be changable via OLC later. * - Clan leaders will be able to customise their clan's ranks. */ struct clan_ranks { char * name; // DEFAULT name of rank char * who_name; // Three letter(minus colours) name that shows on who int points; // Number of points to reach rank }; /* struct cedit_cmd_type: * - New OLC command table for mortals * - Allows implementation of DIY clans */ struct cedit_cmd_type { char * cmd; // Command name CEDIT * func; // Functionimmt the clan code has over 1600 lines of pure tables sh_int trust; // Trust required for immortals to edit sh_int m_trust; // Trust required for mortals to edit(clan trust for cedit) char * description; // Description of the command. }; /* struct clan_skill_cmds: * - For a clan skill command table. * - Improves performance by taking load off interpret for non-clanned characters. * - Easier administration of clan skills. * - Prevents conflicts with existing commands. * - Clan data part will need to be dynamic */ struct clan_skill_cmds { char * cmd; // Command name char * name; // Fancy name with colour for displays char * description; // Description of what it does int points; // Player clan points required to use int qps; // Aqp cost int platinum; // Platinum cost sh_int * gsn; // Affect gsn for auto stripping of skills on sell bool major; // Major skill sh_int position; // Min pos required DO_FUN * func; // Function name }; /******************************** FUNCTION PROTOTYPES *********************************/ /* Memory management */ PKILL_DATA * new_pkill_data ( void ); void free_pkill_data ( PKILL_DATA *pkilldata ); CLAN_DATA * new_clan_data ( bool get_id ); void free_clan_data ( CLAN_DATA *clan ); ROSTER_DATA * new_roster_data ( bool get_id ); void free_roster_data ( ROSTER_DATA *roster ); /* Helper functions */ char * vnum_lookup ( const struct vnum_table *table, int vnum ); int generate_clan_id ( void ); long get_total_points ( ROSTER_DATA *roster ); int get_r_rank_index ( ROSTER_DATA *roster ); int get_p_rank_index ( long points ); CLAN_DATA * get_clan_by_id ( int id ); CLAN_DATA * get_clan_by_name ( char *name ); CLAN_DATA * clan_lookup ( char *name ); CLAN_DATA * get_clan_by_vnum ( int vnum ); CLAN_DATA * get_clan_by_ch ( CHAR_DATA *ch ); ROOM_INDEX_DATA * get_clan_deathroom ( CHAR_DATA *ch ); int generate_roster_id ( void ); ROSTER_DATA * get_roster_by_id ( int id ); ROSTER_DATA * get_roster_by_name ( char *name, bool prefix ); void update_roster ( CHAR_DATA *ch, bool quit ); void update_all_rosters ( void ); void mark_delete_roster ( ROSTER_DATA *roster ); void append_clan_log ( CLAN_DATA *clan, int type, char *name, char *string ); void parse_clan_log ( CHAR_DATA *ch, CLAN_DATA *clan, void *filter, int ftype ); char * strip_spaces ( char *str ); char * strip_bespaces ( char *str ); char * strip_spec_char_col ( char *str ); char * process_name ( char *str ); char * get_pen_code ( ROSTER_DATA *roster ); AREA_DATA * get_clan_area ( void ); int get_clan_mvnum ( CLAN_DATA *clan ); int get_clan_ovnum ( CLAN_DATA *clan ); int get_clan_rvnum ( CLAN_DATA *clan ); void assign_clan_vnums ( CLAN_DATA *clan ); int clan_eq_wear_max ( CHAR_DATA *ch ); bool check_path ( ROOM_INDEX_DATA *end ); void reset_clan_mob ( MOB_INDEX_DATA *pMob, bool delete ); void reset_clan_obj ( OBJ_INDEX_DATA *pObj, bool delete ); /* Saving/Loading */ void load_clan_data ( FILE *fp ); void load_all_clans ( void ); void save_clan_data ( CLAN_DATA *clan ); void save_all_clans ( void ); void load_roster_data ( FILE *fp ); void load_all_rosters ( void ); void save_roster_data ( ROSTER_DATA *roster ); void save_all_rosters ( void ); void load_pkhist_data ( void ); void save_pkhist_data ( void ); void fix_clan_boot ( void ); /* Upgrade functions */ bool upgrade_req_pass ( CHAR_DATA *ch, COST_DATA *table, bool showHave ); bool upgrade_process ( CHAR_DATA *ch, char *argument, COST_DATA *table, bool buy ); void upgrade_list_table ( CHAR_DATA *ch, COST_DATA *table ); void xupgrade_list_table ( CHAR_DATA *ch, COST_DATA *table ); DECLARE_DO_FUN ( upgd_handler ); DECLARE_CALC_FUN ( mval_xcost_count ); DECLARE_CALC_FUN ( cval_mob_normal ); DECLARE_UPGD_FUN ( mob_normal ); DECLARE_CALC_FUN ( cval_obj_normal ); DECLARE_CALC_FUN ( mval_obj_normal ); DECLARE_UPGD_FUN ( obj_normal ); DECLARE_CALC_FUN ( cval_room_normal ); DECLARE_UPGD_FUN ( room_normal ); DECLARE_UPGD_FUN ( room_recall ); DECLARE_CALC_FUN ( cval_room_hall_entrance ); DECLARE_CALC_FUN ( mval_room_hall_entrance ); DECLARE_UPGD_FUN ( room_hall_entrance ); DECLARE_CALC_FUN ( cval_mob_upgd_level ); DECLARE_CALC_FUN ( mval_mob_upgd_level ); DECLARE_UPGD_FUN ( mob_upgd_level ); DECLARE_CALC_FUN ( cval_mob_upgd_hp ); DECLARE_UPGD_FUN ( mob_upgd_hp ); DECLARE_CALC_FUN ( cval_mob_upgd_mana ); DECLARE_UPGD_FUN ( mob_upgd_mana ); DECLARE_CALC_FUN ( cval_mob_upgd_damage ); DECLARE_CALC_FUN ( mval_mob_upgd_damage ); DECLARE_UPGD_FUN ( mob_upgd_damage ); DECLARE_CALC_FUN ( cval_mob_upgd_imm ); DECLARE_UPGD_FUN ( mob_upgd_imm ); DECLARE_CALC_FUN ( cval_mob_upgd_res ); DECLARE_UPGD_FUN ( mob_upgd_res ); DECLARE_CALC_FUN ( cval_mob_upgd_off ); DECLARE_UPGD_FUN ( mob_upgd_off ); DECLARE_CALC_FUN ( cval_mob_upgd_damtype ); DECLARE_UPGD_FUN ( mob_upgd_damtype ); DECLARE_CALC_FUN ( cval_mob_upgd_ac ); DECLARE_UPGD_FUN ( mob_upgd_ac ); DECLARE_CALC_FUN ( cval_mob_upgd_perm ); DECLARE_UPGD_FUN ( mob_upgd_perm ); DECLARE_UPGD_FUN ( obj_upgd_furn_capacity ); DECLARE_CALC_FUN ( cval_obj_upgd_v0 ); DECLARE_UPGD_FUN ( obj_upgd_v0 ); DECLARE_CALC_FUN ( cval_obj_upgd_v2 ); DECLARE_UPGD_FUN ( obj_upgd_v2 ); DECLARE_CALC_FUN ( cval_obj_upgd_v3 ); DECLARE_UPGD_FUN ( obj_upgd_v3 ); DECLARE_CALC_FUN ( cval_obj_upgd_v4 ); DECLARE_UPGD_FUN ( obj_upgd_v4 ); DECLARE_CALC_FUN ( cval_obj_upgd_add1_spell ); DECLARE_UPGD_FUN ( obj_upgd_add1_spell ); DECLARE_CALC_FUN ( cval_obj_upgd_add3_spell ); DECLARE_UPGD_FUN ( obj_upgd_add3_spell ); DECLARE_UPGD_FUN ( obj_upgd_charges ); DECLARE_UPGD_FUN ( obj_upgd_damage ); DECLARE_CALC_FUN ( cval_obj_upgd_damtype ); DECLARE_UPGD_FUN ( obj_upgd_damtype ); DECLARE_CALC_FUN ( cval_obj_upgd_wpnflag ); DECLARE_UPGD_FUN ( obj_upgd_wpnflag ); DECLARE_UPGD_FUN ( obj_upgd_cont_capacity ); DECLARE_CALC_FUN ( cval_obj_upgd_affected ); DECLARE_UPGD_FUN ( obj_upgd_affected ); DECLARE_CALC_FUN ( cval_obj_upgd_objflag ); DECLARE_UPGD_FUN ( obj_upgd_objflag ); DECLARE_CALC_FUN ( cval_obj_upgd_wearloc ); DECLARE_UPGD_FUN ( obj_upgd_wearloc ); DECLARE_CALC_FUN ( cval_room_upgd_hpregen ); DECLARE_UPGD_FUN ( room_upgd_hpregen ); DECLARE_CALC_FUN ( cval_room_upgd_manaregen ); DECLARE_UPGD_FUN ( room_upgd_manaregen ); DECLARE_CALC_FUN ( cval_room_upgd_flag ); DECLARE_UPGD_FUN ( room_upgd_flag ); /* OLC */ void cedit_done ( CHAR_DATA *ch ); void show_cedit_commands ( CHAR_DATA *ch, char *argument, const struct cedit_cmd_type *table ); MOB_INDEX_DATA * get_cmob_by_type_name ( CHAR_DATA *ch, char *name ); DECLARE_CEDIT_FUN( cedit_create ); DECLARE_CEDIT_FUN( cedit_delete ); DECLARE_CEDIT_FUN( cedit_deposit ); DECLARE_CEDIT_FUN( cedit_desc ); DECLARE_CEDIT_FUN( cedit_guild ); DECLARE_CEDIT_FUN( cedit_indep ); DECLARE_CEDIT_FUN( cedit_log ); DECLARE_CEDIT_FUN( cedit_member ); DECLARE_CEDIT_FUN( cedit_mob ); DECLARE_CEDIT_FUN( cedit_name ); DECLARE_CEDIT_FUN( cedit_obj ); DECLARE_CEDIT_FUN( cedit_petition ); DECLARE_CEDIT_FUN( cedit_pkill ); DECLARE_CEDIT_FUN( cedit_rank ); DECLARE_CEDIT_FUN( cedit_room ); DECLARE_CEDIT_FUN( cedit_show ); DECLARE_CEDIT_FUN( cedit_skill ); DECLARE_CEDIT_FUN( cedit_time ); DECLARE_CEDIT_FUN( cedit_war ); DECLARE_CEDIT_FUN( mcedit_buy ); DECLARE_CEDIT_FUN( mcedit_desc ); DECLARE_CEDIT_FUN( mcedit_long ); DECLARE_CEDIT_FUN( mcedit_short ); DECLARE_CEDIT_FUN( mcedit_show ); DECLARE_CEDIT_FUN( ocedit_buy ); DECLARE_CEDIT_FUN( ocedit_long ); DECLARE_CEDIT_FUN( ocedit_sell ); DECLARE_CEDIT_FUN( ocedit_short ); DECLARE_CEDIT_FUN( ocedit_show ); DECLARE_CEDIT_FUN( rcedit_buy ); DECLARE_CEDIT_FUN( rcedit_desc ); DECLARE_CEDIT_FUN( rcedit_exdesc ); DECLARE_CEDIT_FUN( rcedit_name ); DECLARE_CEDIT_FUN( rcedit_sell ); DECLARE_CEDIT_FUN( rcedit_show ); DECLARE_CEDIT_FUN( scedit_buy ); DECLARE_CEDIT_FUN( scedit_sell ); DECLARE_CEDIT_FUN( scedit_show ); DECLARE_DO_FUN ( cedit ); DECLARE_DO_FUN ( mcedit ); DECLARE_DO_FUN ( ocedit ); DECLARE_DO_FUN ( rcedit ); DECLARE_DO_FUN ( scedit ); DECLARE_DO_FUN ( do_cedit ); /* Clan management */ DECLARE_DO_FUN ( do_guild ); DECLARE_DO_FUN ( do_newbie ); DECLARE_DO_FUN ( do_notnewbie ); DECLARE_DO_FUN ( do_go_pkill ); DECLARE_DO_FUN ( do_petition ); DECLARE_DO_FUN ( do_loner ); bool exile_player ( ROSTER_DATA *roster ); /* General commands */ DECLARE_DO_FUN ( do_ctalk ); DECLARE_DO_FUN ( do_bounty ); /* Charts */ DECLARE_DO_FUN ( do_clist ); DECLARE_DO_FUN ( do_clan_roster ); DECLARE_DO_FUN ( do_rank ); DECLARE_DO_FUN ( do_pk_history ); /* Checks */ bool is_enemy ( CHAR_DATA *ch, CHAR_DATA *vch ); bool clan_can_use ( CHAR_DATA *ch, OBJ_DATA *obj ); bool is_clan_obj ( OBJ_DATA *obj ); bool is_clan_obj_ind ( OBJ_INDEX_DATA *pObj ); bool is_clead ( CHAR_DATA *ch ); bool is_clan ( CHAR_DATA *ch ); bool is_pkill ( CHAR_DATA *ch ); bool is_indep ( CHAR_DATA *ch ); bool is_full_clan_obj_index ( OBJ_INDEX_DATA *pObj, CLAN_DATA *clan, bool checkclan ); bool is_full_clan_obj ( OBJ_DATA *obj, CLAN_DATA *clan, bool checkclan ); bool is_clan_mob_index ( MOB_INDEX_DATA *pMob, CLAN_DATA *clan, bool checkclan ); bool is_clan_mob ( CHAR_DATA *mob, CLAN_DATA *clan, bool checkclan ); bool is_clan_mob_type ( CHAR_DATA *mob, CLAN_DATA *clan, int type ); bool is_clan_room ( ROOM_INDEX_DATA *pRoom, CLAN_DATA *clan, bool checkclan ); bool is_same_clan ( CHAR_DATA *ch, CHAR_DATA *vch ); bool can_pkill ( CHAR_DATA *ch, CHAR_DATA *vch ); bool can_wear_clan_eq ( CHAR_DATA *ch, OBJ_DATA *obj, bool remove ); void update_pkhist ( ROSTER_DATA *chRoster, ROSTER_DATA *vchRoster, bool arena ); int rank_kill_ch (CHAR_DATA *ch, CHAR_DATA *vch, bool arena, bool simulate); int rank_kill ( ROSTER_DATA *chRoster, ROSTER_DATA *vchRoster, bool arena, bool simulate ); void clan_entry_trigger ( CHAR_DATA *ch, bool greet ); bool clan_has_skill(CLAN_DATA *clan, int skill); /* Clan skills */ bool interpret_clan_cmd ( CHAR_DATA *ch, char *command, char *argument ); DECLARE_DO_FUN ( do_adrenaline ); DECLARE_DO_FUN ( do_battle_fury ); DECLARE_DO_FUN ( do_bloodlust ); DECLARE_DO_FUN ( do_conceal ); DECLARE_DO_FUN ( do_cripple ); DECLARE_DO_FUN ( do_divide ); DECLARE_DO_FUN ( do_faith ); DECLARE_DO_FUN ( do_modi ); DECLARE_DO_FUN ( do_shadow_form ); DECLARE_DO_FUN ( do_solar_flare ); DECLARE_DO_FUN ( do_vmight ); DECLARE_DO_FUN ( do_wform ); /* Integration functions */ DECLARE_DO_FUN ( make_rosters ); /*************************************** TABLES ***************************************/ extern const struct log_type log_entry_string[]; extern const struct clan_ranks clan_rank_table[]; extern const struct vnum_table cmob_table[]; extern const struct vnum_table croom_table[]; extern const struct vnum_table portloc_table[]; extern const char * process_name_word[]; extern const struct cedit_cmd_type main_cedit_table[]; extern const struct cedit_cmd_type mob_cedit_table[]; extern const struct cedit_cmd_type obj_cedit_table[]; extern const struct cedit_cmd_type room_cedit_table[]; extern const struct cedit_cmd_type skill_cedit_table[]; extern struct clan_skill_cmds clan_skill_table[]; extern COST_DATA mob_prices[]; extern COST_DATA obj_prices[]; extern COST_DATA room_prices[]; extern COST_DATA mob_upgd_prices[]; extern COST_DATA obj_upgd_prices[]; extern COST_DATA room_upgd_prices[]; extern XCOST_DATA spell_prices[]; extern XCOST_DATA bitaf_prices[]; extern XCOST_DATA wpnflag_prices[]; extern XCOST_DATA objflag_prices[]; extern XCOST_DATA damtype_prices[]; extern XCOST_DATA res_prices[]; extern XCOST_DATA imm_prices[]; extern XCOST_DATA off_prices[]; /********************************** GLOBAL VARIABLES **********************************/ extern PKHIST_DATA * pkhist_table; // Spamkill data table extern int max_pkhist_entries; // Number of entries in the spamkill table extern PKILL_DATA * pkill_data_free; // Pointer to PKILL_DATA free list extern CLAN_DATA * clan_list; // Pointer to clan list extern CLAN_DATA * clan_free; // Pointer to CLAN_DATA free list extern int max_clan; // Number of present clans extern ROSTER_DATA * roster_list; // Pointer to roster list extern ROSTER_DATA * roster_free; // Pointer to ROSTER_DATA free list extern time_t roster_next_update; // Time of next update to make sure rosters update every so often extern time_t roster_next_penalty; // Time of next penalty check to make sure people are penalised for stuff every so often (heh)