if (!("OzLibConstantFolding" in ROOT))
{
    ::OzLibConstantFolding <- true
	foreach (enum_table in ROOT.Constants)
    {
		foreach (name, value in enum_table)
		{
			if (value == null)
				value = 0
			CONST[name] <- value
			ROOT[name] <- value
		}
    }
    foreach(clazz in [NetProps, Entities, EntityOutputs, ROOT.NavMesh, Convars])
        foreach(memberName, member in clazz.getclass())
		    if (!(memberName in ROOT) && memberName != "IsValid")
                ROOT[memberName] <- member.bindenv(clazz)
}

const TF_TEAM_HALLOWEEN = 5
const TF_TEAM_NPC = 5
CONST.TF_TEAM_UNASSIGNED <- TEAM_UNASSIGNED
CONST.TF_TEAM_SPECTATOR <- TEAM_SPECTATOR
CONST.TF_CLASS_HEAVY <- TF_CLASS_HEAVYWEAPONS
CONST.MAX_CLIENTS <- MaxClients().tointeger()


TF_CLASS_NAMES <- [
    "undefined",
    "scout",
    "sniper",
    "soldier",
    "demo",
    "medic",
    "heavy",
    "pyro",
    "spy",
    "engineer",
    "civilian"
]

TF_CLASS_MAXHEALTH <- [
    125, //UNDEFINED
    125, //SCOUT
    125, //SNIPER
    200, //SOLDIER
    175, //DEMO
    150, //MEDIC
    300, //HEAVY
    175, //PYRO
    125, //SPY
    125, //ENGINEER
    125  //CIVLIAN
]

TF_CLASS_MOVESPEED <- [
    1.33, //UNDEFINED
    1.33, //SCOUT
    1.0,  //SNIPER
    0.8,  //SOLDIER
    0.93, //DEMO
    1.07, //MEDIC
    0.77, //HEAVY
    1.0,  //PYRO
    1.07, //SPY
    1.0,  //ENGINEER
    1.0   //CIVILIAN
]

TF_CLASS_AMMO <- [
    [0, 32, 36, 100, 1, 1, 1],   //UNDEFINED
    [0, 32, 36, 100, 1, 1, 1],   //SCOUT
    [0, 25, 75, 100, 1, 0, 0],   //SNIPER
    [0, 20, 32, 100, 1, 1, 1],   //SOLDIER
    [0, 16, 24, 100, 1, 1, 1],   //DEMO
    [0, 150, 150, 100, 0, 0, 0], //MEDIC
    [0, 200, 32, 100, 1, 1, 1],  //HEAVY
    [0, 200, 32, 100, 1, 0, 0],  //PYRO
    [0, 20, 24, 100, 0, 1, 1],   //SPY
    [0, 32, 200, 200, 1, 1, 1],  //ENGINEER
    [0, 32, 36, 100, 1, 1, 1]    //CIVILIAN
]

TF_CLASS_AMMO_TYPES <- [
    null,
    "hidden primary max ammo bonus",
    "hidden secondary max ammo penalty",
    "maxammo metal increased",
    "maxammo grenades1 increased",
    null,
    null
]

TF_DMG_DECAPITATION_CUSTOMS <- [
    TF_DMG_CUSTOM_DECAPITATION,
    TF_DMG_CUSTOM_TAUNTATK_BARBARIAN_SWING,
    TF_DMG_CUSTOM_DECAPITATION_BOSS,
    TF_DMG_CUSTOM_HEADSHOT_DECAPITATION,
    TF_DMG_CUSTOM_MERASMUS_DECAPITATION
]

const SND_NOFLAGS = 0
const SND_CHANGE_VOL = 1
const SND_CHANGE_PITCH = 2
const SND_STOP = 4
const SND_SPAWNING = 8
const SND_DELAY = 16
const SND_STOP_LOOPING = 32
const SND_SPEAKER = 64
const SND_SHOULDPAUSE = 128
const SND_IGNORE_PHONEMES = 256
const SND_IGNORE_NAME = 512
const SND_DO_NOT_OVERWRITE_EXISTING_ON_CHANNEL = 1024

const MAX_CONTROL_POINTS = 8

const CHAN_REPLACE = -1
const CHAN_AUTO = 0
const CHAN_WEAPON = 1
const CHAN_VOICE = 2
const CHAN_ITEM = 3
const CHAN_BODY = 4
const CHAN_STREAM = 5
const CHAN_STATIC = 6
const CHAN_VOICE2 = 7
const CHAN_ANNOUNCER = 7
const CHAN_VOICE_BASE = 8
const CHAN_USER_BASE = 136

CONST.DMG_MELEE <- DMG_CLUB
CONST.DMG_TRAIN <- DMG_VEHICLE
CONST.DMG_SAWBLADE <- DMG_NERVEGAS
CONST.DMG_CRIT <- DMG_ACID
CONST.DMG_USEDISTANCEMOD <- DMG_SLOWBURN
CONST.DMG_NOCLOSEDISTANCEMOD <- DMG_POISON

//While VScript integers use 64 bits on a 64-bit build of the game,
// both the game's c++ code and other vscript scripts define INT_MAX assuming the 32 bit limit.
const INT_MAX = 2147483647
const FLT_MAX = 3.402823466e+38

const MAX_WEAPON_COUNT = 8
const TFCOLLISION_GROUP_RESPAWNROOMS = 25

CONST.MASK_PLAYERSOLID_BRUSHONLY <- CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_PLAYERCLIP|CONTENTS_GRATE
const TFBOT_IGNORE_ALL_EXCEPT_SENTRY = 511

const TF_FLAGEVENT_PICKUP = 1
const TF_FLAGEVENT_CAPTURE = 2
const TF_FLAGEVENT_DEFEND = 3
const TF_FLAGEVENT_DROPPED = 4
const TF_FLAGEVENT_RETURNED = 5

const MISSION_SNIPER = 3

const MASK_VISIBLE_AND_NPCS = 33579137
const MASK_PLAYERSOLID_BRUSHONLY = 81931

const PLAYER_HEIGHT = 83

CONST.MASK_VISIBLE_AND_NPCS_OR_CONTENTS_MOVEABLE <- MASK_VISIBLE_AND_NPCS | CONTENTS_MOVEABLE

const TF_WEAPONSLOT_PRIMARY = 0
const TF_WEAPONSLOT_SECONDARY = 1
const TF_WEAPONSLOT_MELEE = 2
const TF_WEAPONSLOT_PDA = 3
const TF_WEAPONSLOT_PDA2 = 4
const TF_WEAPONSLOT_INVIS_WATCH = 4
const TF_WEAPONSLOT_TOOLBOX = 5
const TF_WEAPONSLOT_MISC = 6

const TF_WEAPON_RESTRICTION_ANY_WEAPON = 0
const TF_WEAPON_RESTRICTION_PRIMARY_ONLY = 2
const TF_WEAPON_RESTRICTION_SECONDARY_ONLY = 4
const TF_WEAPON_RESTRICTION_MELEE_ONLY = 1

const MISSION_SNIPER = 3
const MISSION_SPY = 4

const OBJ_SENTRYGUN = 2

const TF_FLAGINFO_NONE = 0

function PrecacheParticle(effect)
{
    PrecacheEntityFromTable(
    {
        classname = "info_particle_system",
        effect_name = effect
    })
}

function PrecacheSound(sound)
{
    ::PrecacheSound(sound)
    PrecacheScriptSound(sound)
}