#pragma once

#ifdef GAMEQC
MODEL(CRYLINK_VIEW, W_Model("h_crylink.iqm"));
MODEL(CRYLINK_WORLD, W_Model("v_crylink.md3"));
MODEL(CRYLINK_ITEM, W_Model("g_crylink.md3"));

SOUND(CRYLINK_FIRE2, W_Sound("crylink_fire2"));
SOUND(CRYLINK_FIRE, W_Sound("crylink_fire"));
SOUND(CRYLINK_IMPACT2, W_Sound("crylink_impact2"));
SOUND(CRYLINK_IMPACT, W_Sound("crylink_impact"));
SOUND(CRYLINK_LINKJOIN, W_Sound("crylink_linkjoin"));
#endif

CLASS(Crylink, Weapon)
#ifdef GAMEQC
/* spawnfunc */ ATTRIB(Crylink, m_canonical_spawnfunc, string, "weapon_crylink");
/* rating    */ ATTRIB(Crylink, bot_pickupbasevalue, float, 6000);
#endif
/* ammotype  */ ATTRIB(Crylink, ammo_type, Resource, RES_CELLS);
/* impulse   */ ATTRIB(Crylink, impulse, int, 6);
/* flags     */ ATTRIB(Crylink, spawnflags, int, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_SPLASH | WEP_FLAG_CANCLIMB);
/* color     */ ATTRIB(Crylink, m_color, vector, '0.918 0.435 0.976');
#ifdef GAMEQC
/* modelname */ ATTRIB(Crylink, mdl, string, "crylink");
/* model     */ ATTRIB(Crylink, m_model, Model, MDL_CRYLINK_ITEM);
/* flash mdl */ ATTRIB(Crylink, m_muzzlemodel, Model, MDL_Null);
/* flash eff */ ATTRIB(Crylink, m_muzzleeffect, entity, EFFECT_CRYLINK_MUZZLEFLASH);
#endif
#ifdef CSQC
/* crosshair */ ATTRIB(Crylink, w_crosshair, string, "gfx/crosshaircrylink");
/* crosshair */ ATTRIB(Crylink, w_crosshair_size, float, 0.5);
#endif
/* wepimg    */ ATTRIB(Crylink, model2, string, "weaponcrylink");
/* refname   */ ATTRIB(Crylink, netname, string, "crylink");
/* wepname   */ ATTRIB(Crylink, m_name, string, _("Crylink"));

#define X(BEGIN, P, END, class, prefix) \
	BEGIN(class) \
		P(class, prefix, ammo, float, BOTH) \
		P(class, prefix, animtime, float, BOTH) \
		P(class, prefix, bouncedamagefactor, float, BOTH) \
		P(class, prefix, bounces, float, BOTH) \
		P(class, prefix, damage, float, BOTH) \
		P(class, prefix, edgedamage, float, BOTH) \
		P(class, prefix, force, float, BOTH) \
		P(class, prefix, joindelay, float, BOTH) \
		P(class, prefix, joinexplode, float, BOTH) \
		P(class, prefix, joinexplode_damage, float, BOTH) \
		P(class, prefix, joinexplode_edgedamage, float, BOTH) \
		P(class, prefix, joinexplode_force, float, BOTH) \
		P(class, prefix, joinexplode_radius, float, BOTH) \
		P(class, prefix, joinspread, float, BOTH) \
		P(class, prefix, linkexplode, float, BOTH) \
		P(class, prefix, middle_fadetime, float, BOTH) \
		P(class, prefix, middle_lifetime, float, BOTH) \
		P(class, prefix, other_fadetime, float, BOTH) \
		P(class, prefix, other_lifetime, float, BOTH) \
		P(class, prefix, pickup_ammo, float, NONE) \
		P(class, prefix, radius, float, BOTH) \
		P(class, prefix, refire, float, BOTH) \
		P(class, prefix, reload_ammo, float, NONE) \
		P(class, prefix, reload_time, float, NONE) \
		P(class, prefix, secondary, float, NONE) \
		P(class, prefix, shots, float, BOTH) \
		P(class, prefix, speed, float, BOTH) \
		P(class, prefix, spreadtype, float, SEC) \
		P(class, prefix, spread, float, BOTH) \
		P(class, prefix, switchdelay_drop, float, NONE) \
		P(class, prefix, switchdelay_raise, float, NONE) \
		P(class, prefix, weaponreplace, string, NONE) \
		P(class, prefix, weaponstartoverride, float, NONE) \
		P(class, prefix, weaponstart, float, NONE) \
		P(class, prefix, weaponthrowable, float, NONE) \
	END()
	W_PROPS(X, Crylink, crylink)
#undef X

ENDCLASS(Crylink)
REGISTER_WEAPON(CRYLINK, NEW(Crylink));

SPAWNFUNC_WEAPON(weapon_crylink, WEP_CRYLINK)

#ifdef SVQC
.float gravity;
.float crylink_waitrelease;
.entity crylink_lastgroup;

.entity crylink_owner; // we can't use realowner, as that's subject to change

.entity queuenext;
.entity queueprev;

void W_Crylink_Dequeue(entity e);
#endif
