ef2gamesource/dlls/game/bg_public.h

588 lines
18 KiB
C

//-----------------------------------------------------------------------------
//
// $Logfile:: /Code/DLLs/game/bg_public.h $
// $Revision:: 112 $
// $Author:: Steven $
// $Date:: 5/10/03 2:02p $
//
// Copyright (C) 1998 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
//
// DESCRIPTION:
// Definitions shared by both the server game and client game modules
#ifndef __BG_PUBLIC_H__
#define __BG_PUBLIC_H__
#ifdef __cplusplus
extern "C" {
#endif
// because games can change separately from the main system version, we need a
// second version that must match between game and cgame
#define GAME_VERSION "EF2-base-1"
#define DEFAULT_GRAVITY 800
// CS_SERVERINFO and CS_SYSTEMINFO and CS_NAME are defined in q_shared.h
#define CS_SOUNDTRACK 8
#define CS_FOGINFO 9
#define CS_SKYINFO 10
#define CS_GAME_VERSION 11
#define CS_LEVEL_START_TIME 12 // so the timer only shows the current level
#define CS_TERRAININFO 13
#define CS_ENTITYFADEINFO 14
#define CS_DEBUGINFO 15
#define CS_MODELS 32
#define CS_SOUNDS (CS_MODELS+MAX_MODELS)
#define CS_IMAGES (CS_SOUNDS+MAX_SOUNDS)
#define CS_LIGHTSTYLES (CS_IMAGES+MAX_IMAGES)
#define CS_PLAYERS (CS_LIGHTSTYLES+MAX_LIGHTSTYLES)
#define CS_ITEMS (CS_PLAYERS+MAX_CLIENTS) // strings for item names
#define CS_AMMO (CS_ITEMS+MAX_ITEMS) // strings for ammo names
#define CS_LOCATIONS (CS_AMMO+MAX_AMMO)
#define CS_NUM_ARENAS (CS_LOCATIONS+MAX_LOCATIONS)
#define CS_ARENA_INFO (CS_NUM_ARENAS+1)
#define CS_NUM_TEAMS (CS_ARENA_INFO+MAX_ARENA_INFO)
#define CS_TEAM_INFO (CS_NUM_TEAMS+1)
#define CS_ARCHETYPE (CS_TEAM_INFO + MAX_TEAM_INFO)
#define CS_FAILEDREASON (CS_ARCHETYPE + MAX_ARCHETYPES)
#define CS_OBJECTIVE_NAME (CS_FAILEDREASON+1)
#define CS_BOTINFO (CS_OBJECTIVE_NAME + MAX_OBJECTIVE_NAMES) // used for bot code
#define CS_GENERAL_STRINGS (CS_BOTINFO + 2)
#define CS_MAX (CS_GENERAL_STRINGS + MAX_GENERAL_STRINGS) // 2 because that's what q3ta defined, haven't looked why yet
#if (CS_MAX) > MAX_CONFIGSTRINGS
#error overflow: (CS_MAX) > MAX_CONFIGSTRINGS
#endif
// BOTLIB needed for bot code
typedef enum {
TEAM_FREE,
TEAM_RED,
TEAM_BLUE,
TEAM_SPECTATOR,
TEAM_NUM_TEAMS
} team_t;
//
// scale to use when evaluating constantLight scale
//
#define CONSTANTLIGHT_RADIUS_SCALE 8
/*
===================================================================================
PMOVE MODULE
The pmove code takes a player_state_t and a usercmd_t and generates a new player_state_t
and some other output data. Used for local prediction on the client game and true
movement on the server game.
===================================================================================
*/
#define MAX_CLIP_PLANES 5
#define MIN_WALK_NORMAL 0.65f // can't walk on very steep slopes
#define STEPSIZE 33.0f
#define MINS_X -22
#define MINS_Y -22
#define MAXS_X 22
#define MAXS_Y 22
#define MINS_Z 0
#define MAXS_Z 96
#define DEAD_MINS_Z 32
#define CROUCH_MAXS_Z 49
//#define DEFAULT_VIEWHEIGHT 85
#define CROUCH_VIEWHEIGHT ( CROUCH_MAXS_Z - 6 )
#define DEAD_VIEWHEIGHT ( MAXS_Z - 6 )
#define WATER_TURBO_SPEED 1.35f
#define WATER_TURBO_TIME 1200
#define MINIMUM_RUNNING_TIME 800
#define MINIMUM_WATER_FOR_TURBO 90
#define OVERCLIP 1.001f
typedef enum {
PM_NORMAL, // normal movement mode
PM_NOCLIP, // noclip movement
PM_DEAD, // no acceleration or turning, but free falling
PM_SIDESTRAFE, // Player can only strafe side to side
PM_FORWARDSTRAFE, // Player can only move forward and back, but the strafe keys will be overloaded to do so
PM_SPECTATOR,
PM_SPECTATOR_FOLLOW,
PM_SECRET_MOVE_MODE,
PM_3RD_PERSON,
PM_NONE
} pmtype_t;
// entityState_t->event values
// entity events are for effects that take place reletive
// to an existing entities origin. Very network efficient.
typedef enum {
EV_NONE,
EV_FALL_VERY_SHORT,
EV_FALL_SHORT,
EV_FALL_MEDIUM,
EV_FALL_FAR,
EV_FALL_VERY_FAR,
EV_FALL_FATAL,
EV_TERMINAL_VELOCITY,
EV_WATER_TOUCH, // foot touches
EV_WATER_LEAVE, // foot leaves
EV_WATER_UNDER, // head touches
EV_WATER_CLEAR, // head leaves
EV_LAST_PREDICTED // just a marker point
// events generated by non-players or never predicted
} entity_event_t;
// pmove->pm_flags
#define PMF_DUCKED ( 1<<0 ) // player is ducked
#define PMF_TIME_JUMP_START ( 1<<1 )
#define PMF_TIME_KNOCKBACK ( 1<<2 ) // pm_time is an air-accelerate only time
#define PMF_TIME_WATERJUMP ( 1<<3 ) // pm_time is waterjump
#define PMF_TIME_TELEPORT ( 1<<4 ) // pm_time is teleport
#define PMF_NO_PREDICTION ( 1<<5 ) // no prediction
#define PMF_FROZEN ( 1<<6 ) // player cannot move or look around
#define PMF_INTERMISSION ( 1<<7 ) // intermission view
//
// the following flag is required by the server and cannot be changed
//
#define PMF_CAMERA_VIEW ( 1<<8 ) // use camera view instead of ps view
#define PMF_NO_MOVE ( 1<<9 ) // player cannot move but can still look around
#define PMF_HAVETARGET ( 1<<10 ) // player has a target in the crosshairs
#define PMF_TIME_STUCKJUMP ( 1<<11 ) // pm_time is stuckjump
#define PMF_LEVELEXIT ( 1<<12 ) // player is near an exit
#define PMF_NO_GRAVITY ( 1<<13 ) // do not apply gravity to the player
#define PMF_JUMP_HELD ( 1<<14 ) // Jump held
#define PMF_FLIGHT ( 1<<15 ) // Flight Powerup
#define PMF_ENEMY_TARGETED ( 1<<16 ) // An enemy is targeted.
#define PMF_RADAR_MODE ( 1<<17 ) // the mode of the radar ( simple: 0, detailed : 1)
#define PMF_DISABLE_INVENTORY ( 1<<18 ) // disables the player's inventory
#define PMF_SCANNER ( 1<<22 ) // has a scanner
#define PMF_ZOOM ( 1<<23 ) // zoom is active
#define PMF_LEAN_LEFT ( 1<<24 ) // player is leaning left
#define PMF_LEAN_RIGHT ( 1<<25 ) // player is leaning right
#define PMF_TIME_CROUCH_JUMP ( 1<<26 ) // crouch jump
#define PMF_NIGHTVISION ( 1<<27 ) // night vision
#define PMF_DAMAGE_FRONT ( 1<<28 )
#define PMF_DAMAGE_BACK ( 1<<29 )
#define PMF_DAMAGE_LEFT ( 1<<30 )
#define PMF_DAMAGE_RIGHT ( 1<<31 )
#define PMF_ALL_TIMES (PMF_TIME_WATERJUMP|PMF_TIME_JUMP_START|PMF_TIME_KNOCKBACK|PMF_TIME_TELEPORT|PMF_TIME_STUCKJUMP|PMF_TIME_CROUCH_JUMP)
#define MAXTOUCH 32
#define MOVERESULT_NONE 0 // nothing blocking
#define MOVERESULT_TURNED 1 // move blocked, but player turned to avoid it
#define MOVERESULT_BLOCKED 2 // move blocked by slope or wall
#define MOVERESULT_HITWALL 3 // player ran into wall
typedef struct {
// state (in / out)
playerState_t *ps;
// command (in)
usercmd_t cmd;
int tracemask; // collide against these types of surfaces
int debugLevel; // if set, diagnostic output will be printed
qboolean noFootsteps; // if the game is setup for no footsteps by the server
// results (out)
int numtouch;
int touchents[MAXTOUCH];
int moveresult; // indicates whether 2the player's movement was blocked and how
qboolean landed;
float landedVelocity;
qboolean stepped; // made a non-smooth step that can be
// smoothed on the client side
int pmoveEvent; // events predicted on client side
vec3_t mins, maxs; // bounding box size
int watertype;
int waterlevel;
// callbacks to test the world
// these will be different functions during game and cgame
void (*trace)( trace_t *result, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int passEntityNum, int contentMask, qboolean cylinder );
int (*pointcontents)( const vec3_t point, int passEntityNum );
qboolean (*trypush)( int entnum, vec3_t move_origin, vec3_t move_end );
} pmove_t;
// if a full pmove isn't done on the client, you can just update the angles
void PM_UpdateViewAngles( playerState_t *ps, const usercmd_t *cmd );
void Pmove_GroundTrace( pmove_t *pmove );
void Pmove (pmove_t *pmove);
//===================================================================================
// content masks
#define MASK_ALL (-1)
#define MASK_SOLID (CONTENTS_SOLID)
#define MASK_USABLE (CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_USABLE)
#define MASK_PLAYERSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_BODY|CONTENTS_SETCLIP)
#define MASK_DEADSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_SETCLIP)
#define MASK_MONSTERSOLID (CONTENTS_SOLID|CONTENTS_MONSTERCLIP|CONTENTS_BODY|CONTENTS_SETCLIP)
#define MASK_WATER (CONTENTS_WATER|CONTENTS_LAVA|CONTENTS_SLIME)
#define MASK_OPAQUE (CONTENTS_SOLID|CONTENTS_SLIME|CONTENTS_LAVA|CONTENTS_CAMERACLIP)
#define MASK_SHOT (CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_CORPSE|CONTENTS_WEAPONCLIP|CONTENTS_SHOOTABLE_ONLY|CONTENTS_SETCLIP)
#define MASK_PROJECTILE (CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_WEAPONCLIP|CONTENTS_SHOOTABLE_ONLY)
#define MASK_PROJECTILE_NOTSHOOTABLE (CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_WEAPONCLIP)
#define MASK_MELEE (CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_CORPSE|CONTENTS_WEAPONCLIP|CONTENTS_SHOOTABLE_ONLY)
#define MASK_PATHSOLID (CONTENTS_SOLID|CONTENTS_MONSTERCLIP|CONTENTS_SETCLIP)
#define MASK_CAMERASOLID (CONTENTS_SOLID|CONTENTS_CAMERACLIP|CONTENTS_BODY|CONTENTS_SETCLIP|MASK_WATER)
#define MASK_SETCLIP (CONTENTS_BODY)
#define MASK_CURRENT (CONTENTS_CURRENT_0|CONTENTS_CURRENT_90|CONTENTS_CURRENT_180|CONTENTS_CURRENT_270|CONTENTS_CURRENT_UP|CONTENTS_CURRENT_DOWN)
// player_state->persistant[] indexes
// these fields are the only part of player_state that isn't
// cleared on respawn
typedef enum {
PERS_SCORE, // !!! MUST NOT CHANGE, SERVER AND GAME BOTH REFERENCE !!!
PERS_TEAM
} persEnum_t;
// entityState_t->eFlags
#define EF_EVENT_BIT1 0x00000001 // toggled every time an event changes
#define EF_EVENT_BIT2 0x00000002 // toggled every time an event changes
#define EF_EVENT_BITS (EF_EVENT_BIT1|EF_EVENT_BIT2)
#define EF_TELEPORT_BIT (1<<2) // toggled every time the origin abruptly changes
#define EF_EVERYFRAME (1<<3) // def commands will be run every client frame
#define EF_FRIEND (1<<4) // the entity is a friend
#define EF_ENEMY (1<<5) // the entity is a enemy
#define EF_DONT_PROCESS_COMMANDS (1<<6) // don't process client commands for this entity
#define EF_EFFECT_CUSTOM (1<<7) // Custom effect, look at the entitystate for the shader to use
#define EF_EMITTER_CUSTOM (1<<8) // Custom emitter, look at the entitystate for the emitter name to use
#define EF_DISPLAY_INFO (1<<9)
#define EF_DISPLAY_DESC1 (1<<10) // Display description 1
#define EF_DISPLAY_DESC2 (1<<11) // Display description 2
#define EF_DISPLAY_DESC3 (1<<12) // Display description 3
#define EF_EFFECT_ELECTRIC (1<<14) // Transport effect
#define EF_BEHAVIOR_FAILURE (1<<15) // Behavior Failure Effect
#define EF_EFFECTS ( EF_EFFECT_CUSTOM | EF_EFFECT_ELECTRIC | EF_BEHAVIOR_FAILURE )
// flip the togglebit every time an animation
// changes so a restart of the same anim can be detected
#define ANIM_TOGGLEBIT (1<<9)
#define ANIM_BLEND (1<<10)
#define ANIM_NUMBITS 11
// server side anim bits
#define ANIM_SERVER_EXITCOMMANDS_PROCESSED (1<<12)
#define ANIM_MASK ( ~( ANIM_TOGGLEBIT | ANIM_BLEND | ANIM_SERVER_EXITCOMMANDS_PROCESSED ) )
// if FRAME_EXPLICIT is set, don't auto animate
#define FRAME_NUMBITS 14
#define FRAME_EXPLICIT ( 1 << 13 )
#define FRAME_MASK ( ~FRAME_EXPLICIT )
//
// Tag specific flags
//
#define TAG_NUMBITS 10 // number of bits required to send over network
#define TAG_MASK ( ( 1 << 10 ) - 1 )
//
// Camera Flags
//
#define CF_CAMERA_ANGLES_ABSOLUTE ( 1 << 0 )
#define CF_CAMERA_ANGLES_IGNORE_PITCH ( 1 << 1 )
#define CF_CAMERA_ANGLES_IGNORE_YAW ( 1 << 2 )
#define CF_CAMERA_ANGLES_ALLOWOFFSET ( 1 << 3 )
#define CF_CAMERA_CUT_BIT ( 1 << 7 ) // this bit gets toggled everytime we do a hard camera cut
typedef enum {
MOD_NONE,
MOD_DROWN,
MOD_SUICIDE,
MOD_CRUSH,
MOD_CRUSH_EVERY_FRAME,
MOD_TELEFRAG,
MOD_LAVA,
MOD_SLIME,
MOD_FALLING,
MOD_LAST_SELF_INFLICTED,
MOD_EXPLOSION,
MOD_EXPLODEWALL,
MOD_ELECTRIC,
MOD_ELECTRICWATER,
MOD_THROWNOBJECT,
MOD_BEAM,
MOD_ROCKET,
MOD_IMPACT,
MOD_GAS,
MOD_GAS_BLOCKABLE,
MOD_ACID,
MOD_SWORD,
MOD_PLASMA,
MOD_PLASMABEAM,
MOD_PLASMASHOTGUN,
MOD_STING,
MOD_STING2,
MOD_SLING,
MOD_BULLET,
MOD_FAST_BULLET,
MOD_VEHICLE,
MOD_FIRE,
MOD_FIRE_BLOCKABLE,
MOD_VORTEX,
MOD_LIFEDRAIN,
MOD_FLASHBANG,
MOD_POO_EXPLOSION,
MOD_AXE,
MOD_CHAINSWORD,
MOD_ON_FIRE,
MOD_FIRESWORD,
MOD_ELECTRICSWORD,
MOD_CIRCLEOFPROTECTION,
MOD_RADIATION,
MOD_LIGHTSWORD,
MOD_GIB,
MOD_IMPALE,
MOD_UPPERCUT,
MOD_POISON,
MOD_EAT,
MOD_REDEMPTION,
MOD_STASIS,
// Added for EF
MOD_PHASER,
MOD_VAPORIZE,
MOD_COMP_RIFLE,
MOD_VAPORIZE_COMP,
MOD_IMOD_PRIMARY,
MOD_IMOD_SECONDARY,
MOD_SMALL_EXPLOSION,
MOD_TETRYON,
MOD_DISRUPTOR,
MOD_VAPORIZE_DISRUPTOR,
MOD_VAPORIZE_PHOTON,
MOD_SNIPER,
MOD_MELEE,
MOD_ALIEN_MELEE,
MOD_KLINGON_MELEE,
MOD_TURRET,
// Powerups/runes
MOD_DEATH_QUAD,
MOD_EMPATHY_SHIELD,
MOD_ARMOR_PIERCING,
MOD_TOTAL_NUMBER
} meansOfDeath_t;
// If you add to the enum above go add a string to the means_of_death_strings in g_utils.cpp
extern char means_of_death_strings[ MOD_TOTAL_NUMBER ][ 32 ];
// Context Dialog
// To add a new context, you must add the context in 4 places ( Yes, I know ). You must add
// an enumeration to the dialogContexts_t and a corresponding string in context_strings ( inside g_utils.cpp )
// That will "create" the context ( though you still need to implement the usage ). To make the context useful
// you will need to add a SOUNDTYPE for it as well -- Which means adding a string to soundtype_strings
// ( also in g_utils.cpp ).
//
// In short, to add a context put it in the following places
// 1: dialogContexts_t ( enumerated ID )
// 2: context_strings ( string form of ID )
// 3: soundType ( soundType for context )
// 4 soundtype_strings ( string of the soundType )
//
typedef enum
{
CONTEXT_SPOTTED_ENEMY,
CONTEXT_INJURED,
CONTEXT_IN_COMBAT,
CONTEXT_WEAPON_USELESS,
CONTEXT_INVESTIGATING,
CONTEXT_TOTAL_NUMBER
} dialogContexts_t;
typedef enum
{
// General Sound Types
SOUNDTYPE_NONE,
SOUNDTYPE_GENERAL,
SOUNDTYPE_EXPLOSION,
SOUNDTYPE_WEAPONFIRE,
SOUNDTYPE_ALERT,
SOUNDTYPE_FOOTSTEPS_WALK,
SOUNDTYPE_FOOTSTEPS_RUN,
SOUNDTYPE_FALL,
// Context Dialog Sound Types
SOUNDTYPE_DIALOG_CONTEXT_SPOTTED_ENEMY,
SOUNDTYPE_DIALOG_CONTEXT_INJURED,
SOUNDTYPE_DIALOG_CONTEXT_IN_COMBAT,
SOUNDTYPE_DIALOG_CONTEXT_WEAPON_USELESS,
SOUNDTYPE_DIALOG_CONTEXT_INVESTIGATING,
SOUNDTYPE_TOTAL_NUMBER
} soundType;
// If you add to the enum above go add a string to the soundtype_strings in g_utils.cpp
extern char soundtype_strings[ SOUNDTYPE_TOTAL_NUMBER ][ 32 ];
extern char context_strings[CONTEXT_TOTAL_NUMBER][32];
//---------------------------------------------------------
// mp_flags->integer flags
#define MP_FLAG_NO_HEALTH (1<<0)
#define MP_FLAG_NO_POWERUPS (1<<1)
#define MP_FLAG_WEAPONS_STAY (1<<2)
#define MP_FLAG_NO_FALLING (1<<3)
#define MP_FLAG_INSTANT_ITEMS (1<<4)
#define MP_FLAG_SAME_LEVEL (1<<5)
#define MP_FLAG_SKINTEAMS (1<<6)
#define MP_FLAG_MODELTEAMS (1<<7)
#define MP_FLAG_FRIENDLY_FIRE (1<<8)
#define MP_FLAG_SPAWN_FARTHEST (1<<9)
#define MP_FLAG_FORCE_RESPAWN (1<<10)
#define MP_FLAG_NO_ARMOR (1<<11)
#define MP_FLAG_FAST_WEAPONS (1<<12)
#define MP_FLAG_NOEXIT (1<<13)
#define MP_FLAG_INFINITE_AMMO (1<<14)
#define MP_FLAG_FIXED_FOV (1<<15)
#define MP_FLAG_NO_DROP_WEAPONS (1<<16)
#define MP_FLAG_NO_FOOTSTEPS (1<<17)
#define MP_FLAG_DONT_ALLOW_VOTE (1<<18)
#define MP_FLAG_FULL_COLLISION (1<<19)
#define MP_FLAG_NO_AUTO_JOIN_TEAM (1<<20)
#define MP_FLAG_AUTO_BALANCE_TEAMS (1<<21)
#define MP_FLAG_FORCE_DEFAULT_MODEL (1<<22)
// teamflags->integer flags
#define TF_TEAMPLAY 1
#define TF_NO_FRIENDLY_FIRE 2
//
// entityState_t->eType
//
typedef enum {
ET_MODELANIM,
ET_PLAYER,
ET_ITEM,
ET_GENERAL,
ET_MISSILE,
ET_MOVER,
ET_BEAM,
ET_MULTIBEAM,
ET_SPRITE,
ET_PORTAL,
ET_EVENT_ONLY,
ET_RAIN,
ET_LEAF,
ET_SPEAKER,
ET_PUSH_TRIGGER,
ET_TELEPORT_TRIGGER,
ET_DECAL,
ET_EMITTER,
ET_ROPE,
ET_EVENTS
} entityType_t;
void EvaluateTrajectory( const trajectory_t *tr, int atTime, vec3_t result );
void EvaluateTrajectoryDelta( const trajectory_t *tr, int atTime, vec3_t result );
#define MAX_LETTERBOX_SIZE 0x7fff
#define ITEM_NAME_AMMO_LEFT 0
#define ITEM_NAME_AMMO_RIGHT 1
#define ITEM_NAME_WEAPON_LEFT 2
#define ITEM_NAME_WEAPON_RIGHT 3
#define ITEM_NAME_WEAPON_DUAL 4
// added for bot code BOTLIB
#define ARENAS_PER_TIER 4
#define MAX_ARENAS 1024
#define MAX_ARENAS_TEXT 8192
#define MAX_BOTS 1024
#define MAX_BOTS_TEXT 8192
typedef enum {
GTS_RED_CAPTURE,
GTS_BLUE_CAPTURE,
GTS_RED_RETURN,
GTS_BLUE_RETURN,
GTS_RED_TAKEN,
GTS_BLUE_TAKEN,
GTS_REDOBELISK_ATTACKED,
GTS_BLUEOBELISK_ATTACKED,
GTS_REDTEAM_SCORED,
GTS_BLUETEAM_SCORED,
GTS_REDTEAM_TOOK_LEAD,
GTS_BLUETEAM_TOOK_LEAD,
GTS_TEAMS_ARE_TIED,
GTS_KAMIKAZE
} global_team_sound_t;
//team task
typedef enum {
TEAMTASK_NONE,
TEAMTASK_OFFENSE,
TEAMTASK_DEFENSE,
TEAMTASK_PATROL,
TEAMTASK_FOLLOW,
TEAMTASK_RETRIEVE,
TEAMTASK_ESCORT,
TEAMTASK_CAMP
} teamtask_t;
// end bot additions
typedef enum {
UNKNOWN,
OBJECT_LOCATION,
OBJECT_NONINTERACTIVE,
OBJECT_USABLE,
OBJECT_DESTRUCTABLE,
ACTOR_FRIENDLY,
ACTOR_ENEMY,
ACTOR_TEAMMATE
} EntityType;
typedef enum
{
HEALTHY_STATUS = 0,
INJURED_STATUS,
CRITICAL_STATUS
} TeammateStatus;
#define MAX_GAMEPLAY_STRING_LENGTH 256
#ifdef __cplusplus
}
#endif
#endif // __BG_PUBLIC_H__