/*
* mud.h
* Defines required by the rest of the program.
* ____ _
* | _ \ ___ __ _| |_ __ ___ ___
* | |_) / _ \/ _` | | '_ ` _ \/ __|
* | _ < __/ (_| | | | | | | \__ \
* |_| \_\___|\__,_|_|_| |_| |_|___/
*
* Permission to use, modify and distribute is granted via the
* Creative Commons - Attribution - Non Commercial - Share Alike 3.0 License
* http://creativecommons.org/licenses/by-nc-sa/3.0/
*
* Copyright (C) 2007-2012 Jason Mitchell, Randi Mitchell
* Contributions by Tim Callahan, Jonathan Hseu
* Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman
*
*/
#ifndef MUD_H
#define MUD_H
// Other includes are at the end of the file to make sure all defines and such in this
// file are visible
#ifndef PYTHON_CODE_GEN
#include <Python.h> // Python!
#endif
#include "bstring.h"
#include "global.h"
#ifndef READCFG
#define READCFG
#endif // READCFG
#ifndef FALSE
#define FALSE (0)
#endif
#ifndef TRUE
#define TRUE (!FALSE)
#endif
// File permissions
//#define S_IWRITE 00660
//#define S_IREAD 00006
#ifndef O_BINARY
#define O_BINARY 0
#endif
#define ACC 00666
// Daily use variables
#define DL_BROAD 0 // Daily broadcasts
#define DL_ENCHA 1 // Daily enchants
#define DL_FHEAL 2 // Daily heals
#define DL_TRACK 3 // Daily track spells
#define DL_DEFEC 4 // Daily defecations
#define DL_RCHRG 5 // Daily wand recharges
#define DL_TELEP 6 // Daily tports
#define DL_BROAE 7 // Daily broademotes
#define DL_ETRVL 8 // Daily ethereal travels
#define DL_HANDS 9 // Daily Lay on Hands
#define DL_RESURRECT 10 // Daily resurrections
#define DL_SCARES 11 // Daily scare casts
#define DL_SILENCE 12
#define DL_HARM 13 // Daily harm casts
#define DAILYLAST 13
// Object Last-time stuff
#define LT_ENCHA 0
#define LT_ENVEN 1
#define DONT_USE 2
// Last-time specifications
#define OLD_LT_INVISIBILITY 0
#define OLD_LT_PROTECTION 1
#define OLD_LT_BLESS 2
#define OLD_LT_INFRAVISION 13
#define OLD_LT_DETECT_INVIS 17
#define OLD_LT_DETECT_MAGIC 18
#define OLD_LT_LEVITATE 21
#define OLD_LT_HEAT_PROTECTION 23
#define OLD_LT_FLY 24
#define OLD_LT_RESIST_MAGIC 25
#define OLD_LT_KNOW_AURA 27
#define OLD_LT_RESIST_COLD 29
#define OLD_LT_BREATHE_WATER 30
#define OLD_LT_EARTH_SHIELD 31
#define OLD_LT_RESIST_WATER 52
#define OLD_LT_RESIST_FIRE 53
#define OLD_LT_RESIST_AIR 54
#define OLD_LT_RESIST_EARTH 55
#define OLD_LT_REFLECT_MAGIC 56
#define OLD_LT_TRUE_SIGHT 60
#define OLD_LT_CAMOUFLAGE 61
#define OLD_LT_DRAIN_SHIELD 63
#define OLD_LT_UNDEAD_WARD 65
#define OLD_LT_RESIST_ELEC 66
#define OLD_LT_WARMTH 67
#define OLD_LT_HASTE 71
#define OLD_LT_SLOW 72
#define OLD_LT_STRENGTH 78
#define OLD_LT_ENFEEBLEMENT 79
#define OLD_LT_DARKNESS 88
#define OLD_LT_TONGUES 90
#define OLD_LT_INSIGHT 93
#define OLD_LT_FEEBLEMIND 94
#define OLD_LT_PRAYER 95
#define OLD_LT_DAMNATION 96
#define OLD_LT_FORTITUDE 97
#define OLD_LT_WEAKNESS 98
#define OLD_LT_PASS_WITHOUT_TRACE 99
#define OLD_LT_COMPREHEND_LANGUAGES 74
#define OLD_LT_FARSIGHT 102
#define OLD_LT_HOLD_PERSON 75
#define OLD_LT_CONFUSED 80
#define OLD_LT_TEMP_BLIND 45 // Was LT_CHARM which wasn't being used.
#define OLD_LT_SILENCE 34
#define OLD_LT_ARMOR 39
#define OLD_LT_ATTACK 3
// free 0
// free 1
// free 2
#define LT_AGGRO_ACTION 3
#define LT_TRACK 4
#define LT_MON_SCAVANGE 4
#define LT_STEAL 5
#define LT_PICKLOCK 6
#define LT_MON_WANDER 6
#define LT_SEARCH 7
#define LT_TICK 8 // Hp/Poison ticking timer
#define LT_SPELL 9
#define LT_PEEK 10
#define LT_SNEAK 11
#define LT_READ_SCROLL 12
// free 13
#define LT_HIDE 14
#define LT_TURN 15
#define LT_FRENZY 16
// free 17
// free 18
#define LT_PRAY 19
#define LT_PREPARE 20
// free 21
#define LT_PLAYER_SAVE 22
// free 23
// free 24
// free 25
#define LT_MOVED 26
// free 27
#define LT_AGE 28
// free 29
// free 30
// free 31
#define LT_SONG_PLAYED 33
#define LT_SING 35
#define LT_CHARMED 36
#define LT_MEDITATE 37
#define LT_TOUCH_OF_DEATH 38
// free 38
#define LT_BLOOD_SACRIFICE 40
#define LT_MOB_THIEF 41
#define LT_INVOKE 42
#define LT_SCOUT 43
#define LT_BERSERK 44
#define LT_REGENERATE 46
#define LT_DRAIN_LIFE 47
#define LT_HYPNOTIZE 48
#define LT_PLAYER_BITE 49
#define LT_FREE_ACTION 50
#define LT_PLAYER_SEND 51
// free 52
// free 53
// free 54
// free 55
// free 56
#define LT_IDENTIFY 57
#define LT_FOCUS 58
#define LT_PLAYER_STUNNED 59
// free 60
// free 61
#define LT_RP_AWARDED 62
// free 63
#define LT_UNCONSCIOUS 64
// free 65
// free 66
// free 67
// free 68
#define LT_MOB_JAILED 69
#define LT_LAY_HANDS 70
// free 71
// free 72
#define LT_NO_PKILL 73
#define LT_MOB_RENOUNCE 74
#define LT_SAVES 76
#define LT_NO_BROADCAST 77
// free 78
// free 79
// free 80
#define LT_NOMPTICK 81
#define LT_NOHPTICK 82
// free 83
#define LT_KILL_DOCTOR 84
// free 85
#define LT_LEVEL_DRAIN 86
#define LT_HOWLS 87
// free 88
#define LT_SKILL_INCREASE 89
// free 90
#define LT_ENLARGE_REDUCE 91
#define LT_ANCHOR 92
// free 93
// free 94
// free 95
// free 96
// free 97
// free 98
// free 99
#define LT_TICK_SECONDARY 100 // Mp/Focus ticking
#define LT_TICK_HARMFUL 101 // Poison/Pharm etc
#define MAX_LT 103 // Incriment when you add any new LTs.
#define LT_JAILED 127 // Higher than max LT so it "ticks" when player is offline.
#define LT_MOBDEATH 126 // Ticks down offline
// Max possible LT is 126 currently. LT 127 is used for *jail - TC
#define TOTAL_LTS 127
//#define LT_MOB_PASV_GUARD LT_UNCONSCIOUS // Mobs use LT_UNCONSCIOUS cuz they don't need it anywhere else
#define LT_RENOUNCE LT_TOUCH_OF_DEATH
#define LT_HOLYWORD LT_FOCUS
#define LT_SMOTHER LT_FOCUS
// BUG: Animate & tail slap both use LT_FOCUS -> high level animate tail slaps
#define LT_ANIMATE LT_FOCUS
#define LT_MOB_BASH LT_IDENTIFY
#define LT_RIPOSTE LT_MON_SCAVANGE
#define LT_DISARM LT_FOCUS
#define LT_TAIL_SLAP LT_FOCUS // Mobs use LT_FOCUS on tail slap since they don't ever use focus.
#define LT_DEATH_SCREAM LT_BERSERK // Mobs use LT_BERSERK for death scream since they don't ever berserk.
#define LT_OUTLAW LT_MOB_THIEF
#define LT_KICK LT_IDENTIFY // No one that kicks also identifies.
#define LT_MAUL LT_IDENTIFY // No one that mauls also identifies
#define LT_MIST LT_MOB_THIEF
#define LT_BARKSKIN LT_FOCUS
#define LT_PETRIFYING_GAZE LT_MOB_JAILED
#define LT_MISTBANE LT_FOCUS
#define LT_MOB_BREATH LT_HYPNOTIZE
#define LT_MOB_TRAMPLE LT_ARMOR
#define LT_ENDURANCE LT_FREE_ACTION
#define LT_M_AURA_ATTACK LT_NO_PKILL
#define OLD_LT_STONESKIN LT_MON_WANDER
// Song flags
#define SONG_HEAL 0 // Healing
#define SONG_MP 1 // Magic-Restoration
#define SONG_RESTORE 2 // Restoration
#define SONG_DESTRUCTION 3 // Destruction
#define SONG_MASS_DESTRUCTION 4 // Mass Destruction
#define SONG_BLESS 5 // Room-Bless
#define SONG_PROTECTION 6 // Room-Protection
#define SONG_FLIGHT 7 // Song of Flight
#define SONG_RECALL 8 // Song of Recall
#define SONG_SAFETY 9 // Song of Safety
#include "flags.h"
#define RETURN(a,b,c) Ply[a].io->fn = b; Ply[a].io->fnparam = c; return
#define BOOL(a) ((a) ? 1 : 0)
// Minimum and maximum values a `signed int' can hold.
#ifndef __INT_MAX__
#define __INT_MAX__ 2147483647
#endif
#undef INT_MIN
#define INT_MIN (-INT_MAX-1)
#undef INT_MAX
#define INT_MAX __INT_MAX__
// Maximum value an `unsigned int' can hold. (Minimum is 0).
#undef UINT_MAX
#define UINT_MAX (INT_MAX * 2U + 1)
#ifndef MAXINT
#define MAXINT INT_MAX
#endif //MAXINT
// if ltime is 0, assume uninitialized and return MAXINT. This is so monsters
// can have spell flags set and have them be permanent.
#define LT(a,b) ((a)->lasttime[(b)].ltime ? (a)->lasttime[(b)].ltime + (a)->lasttime[(b)].interval : MAXINT)
//#define WISDOM(a) ((bonus((int)(a)->intelligence.getCur())+bonus[(int)(a)->piety.getCur()])/2)
//#define AWARENESS(a) ((bonus((int)(a)->intelligence.getCur())+bonus[(int)(a)->dexterity.getCur()])/2)
#define mrand(a,b) ((a)+(rand()%((b)*10-(a)*10+10))/10)
#define MIN(a,b) (((a)<(b)) ? (a):(b))
#define MAX(a,b) (((a)>(b)) ? (a):(b))
#define PLYCRT(p) ((p)->isPlayer() ? "Player" : "Monster")
#define AC(p) ((int)((p)->getArmor()) / 10)
//*********************************************************************
// Below this line are customizable options for the mud
//*********************************************************************
#define MINSHOPLEVEL 16
#define SURNAME_LEVEL 13
#define ALIGNMENT_LEVEL 6
#define SUNRISE 6
#define SUNSET 20
#define ROOM_BOUND_FAILURE 2 // room to go to if getBound fails
/* Web Editor
* _ _ ____ _______ ______
* | \ | |/ __ \__ __| ____|
* | \| | | | | | | | |__
* | . ` | | | | | | | __|
* | |\ | |__| | | | | |____
* |_| \_|\____/ |_| |______|
*
* If you change anything here, make sure the changes are reflected in the web
* editor! Either edit the PHP yourself or tell Dominus to make the changes.
*/
#define MAX_DIMEN_ANCHORS 3
// toll to charge in case none is set on exit
#define DEFAULT_TOLL 100
#define MAX_MOBS_IN_ROOM 200
// For various effects that create objects
#define SHIT_OBJ 349
#define CORPSE_OBJ 800
#define BODYPART_OBJ 21
#define STATUE_OBJ 39
#define MONEY_OBJ 0
#define TICKET_OBJ 200
// When a player forces a pet to cast, this is the delay.
#define PET_CAST_DELAY 4
//
//// If a player dies X times in X hours, they don't lose exp for that death.
//// LUCKY_DEATHS should be defined as x - 1: if they get a free restore after
//// 3 deaths in 24 hours, enter 2. Set LUCKY_DEATH_HOURS to 0 to disable
//// lucky dying.
//#define LUCKY_DEATHS 2
//#define LUCKY_DEATH_HOURS 24
// C includes
#ifndef PYTHON_CODE_GEN
#include <fcntl.h>
#endif
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
// C++ Includes
#include <list>
// Mud Includes
#include "os.h"
// Custom comparison operator to sort by the numeric id instead of standard string comparison
struct idComp : public std::binary_function<const bstring&, const bstring&, bool> {
bool operator() (const bstring& lhs, const bstring& rhs) const;
};
#include "alphanum.hpp"
#include "catRef.h"
#include "swap.h"
#include "structs.h"
#include "range.h"
#include "carry.h"
#include "container.h"
#include "xml.h"
#include "size.h"
#include "socket.h"
#include "stats.h"
#include "rooms.h"
#include "objects.h"
#include "timer.h"
#include "skills.h"
#include "magic.h"
#include "fighters.h"
#include "creatures.h"
//#include "bans.h"
//#include "guilds.h"
//#include "factions.h"
#include "catRefInfo.h"
#include "startlocs.h"
#include "raceData.h"
#include "deityData.h"
#include "playerTitle.h"
#include "skillGain.h"
#include "levelGain.h"
#include "playerClass.h"
#include "fishing.h"
#include "server.h"
#include "proxy.h"
#include "config.h"
// Pointer to config and server objects
extern Config *gConfig;
extern Server *gServer;
extern int bHavePort;
typedef int (*SONGFN)();
#ifndef MIGNORE
extern int Crash;
/* configurable */
extern int PORTNUM;
extern char auth_questions_email[80];
extern char questions_to_email[80];
extern char register_questions_email[80];
extern const int GUILD_NONE, GUILD_INVITED, GUILD_INVITED_OFFICER, GUILD_INVITED_BANKER,
GUILD_PEON, GUILD_OFFICER, GUILD_BANKER, GUILD_MASTER;
extern const int GUILD_JOIN, GUILD_REMOVE, GUILD_LEVEL, GUILD_DIE;
extern int Tablesize;
extern int Cmdnum;
extern long StartTime;
extern struct lasttime Shutdown;
extern struct lasttime Weather[5];
extern int Numlockedout;
extern class_stats_struct class_stats[CLASS_COUNT];
extern char allowedClassesStr[CLASS_COUNT + 4][16];
extern char conjureTitles[][3][10][30];
extern char bardConjureTitles[][10][35];
extern char mageConjureTitles[][10][35];
extern creatureStats conjureStats[3][40];
extern short multiHpMpAdj[MAX_MULTICLASS][2];
extern short multiStatCycle[MAX_MULTICLASS][10];
extern short multiSaveCycle[MAX_MULTICLASS][10];
extern char scrollDesc [][10][20];
extern char scrollType [][2][20];
//Ansi/Mirc Settings
extern int Ansi[12];
extern int Mirc[9];
//extern int MAX_QUEST;
extern struct osp_t ospell[];
//extern short level_cycle[][10];
extern short saving_throw_cycle[][10];
//extern short thaco_list[][30];
extern int statBonus[40];
extern char lev_title[][10][20];
extern char article[][10];
extern long needed_exp[];
extern long last_dust_output;
extern Dice monk_dice[41];
extern Dice wolf_dice[41];
extern int numQuests;
extern char *dmname[];
extern int numBans;
//extern int maxGuild;
extern int SUPPORT_REQUIRED;
extern unsigned short Port;
extern struct osong_t osong[];
#endif
#include "proto.h"
#include "help.h"
#include "paths.h"
#ifdef PYTHON_CODE_GEN
// Generate effects bindings as well
#include <effects.h>
#include <songs.h>
void broadcast(Socket* ignore, BaseRoom* room, const char *fmt, ...);
void broadcast(Socket* ignore1, Socket* ignore2, BaseRoom* room, const char *fmt, ...);
void broadcast(bool showTo(Socket*), Socket*, BaseRoom* room, const char *fmt, ...);
//void doBroadCast(bool showTo(Socket*), bool showAlso(Socket*), const char *fmt, va_list ap, Creature* player = NULL);
void broadcast(const char *fmt, ...);
void broadcast(int color, const char *fmt,...);
void broadcast(bool showTo(Socket*), bool showAlso(Socket*), const char *fmt,...);
void broadcast(bool showTo(Socket*), const char *fmt,...);
void broadcast(bool showTo(Socket*), int color, const char *fmt,...);
void broadcast(Creature* player, bool showTo(Socket*), int color, const char *fmt,...);
void broadcast_wc(int color,const char *fmt, ...);
void broadcast_login(Player* player, int login);
void broadcast_rom_LangWc(int face, int color, int lang, Socket* ignore, AreaRoom* aRoom, CatRef cr, const char *fmt,...);
void broadcastGroup(bool dropLoot, Creature* player, const char *fmt, ...);
#endif
#endif