#ifndef XWEAPONDEF_H
#define XWEAPONDEF_H

#include "xasset.h"
#include "xmodel.h"
#include "xsoundaliaslist.h"
#include "xweaponenums.h"
#include "xfxeffectdef.h"

#include <QVector>

class XWeaponDef : public XAsset
{
public:
    explicit XWeaponDef();
    ~XWeaponDef();

    void ParseData(QDataStream *aStream) override;
    void Clear() override;

private:
    QString mInternalName;
    QString mDisplayName;
    QString mOverlayName;
    QVector<XModel> mGunXModel;

    XModel mHandXModel;
    QStringList mXAnims;
    QString mModeName;

    quint32 mHideTags[8];
    quint32 mNotetrackSoundMapKeys[16];
    quint32 mNotetrackSoundMapValues[16];
    int mPlayerAnimType;
    XWeaponType mWeapType;
    XWeaponClass mWeapClass;
    XPenetrateType mPenetrateType;
    XImpactType mImpactType;
    XWeaponInventoryType mInventoryType;
    XWeaponFireType mFireType;
    XOffhandClass mOffhandClass;
    XWeaponStance mStance;

    XFxEffectDef mViewFlashEffect;
    XFxEffectDef mWorldFlashEffect;
    XSoundAliasList mPickupSound;
    XSoundAliasList mPickupSoundPlayer;
    XSoundAliasList mAmmoPickupSound;
    XSoundAliasList mAmmoPickupSoundPlayer;
    XSoundAliasList mProjectileSound;
    XSoundAliasList mPullbackSound;
    XSoundAliasList mPullbackSoundPlayer;
    XSoundAliasList mFireSound;
    XSoundAliasList mFireSoundPlayer;
    XSoundAliasList mFireLoopSound;
    XSoundAliasList mFireLoopSoundPlayer;
    XSoundAliasList mFireStopSound;
    XSoundAliasList mFireStopSoundPlayer;
    XSoundAliasList mFireLastSound;
    XSoundAliasList mFireLastSoundPlayer;
    XSoundAliasList mEmptyFireSound;
    XSoundAliasList mEmptyFireSoundPlayer;
    XSoundAliasList mMeleeSwipeSound;
    XSoundAliasList mMeleeSwipeSoundPlayer;
    XSoundAliasList mMeleeHitSound;
    XSoundAliasList mMeleeMissSound;
    XSoundAliasList mEechamberSound;
    XSoundAliasList mRechamberSoundPlayer;
    XSoundAliasList mReloadSound;
    XSoundAliasList mReloadSoundPlayer;
    XSoundAliasList mReloadEmptySound;
    XSoundAliasList mReloadEmptySoundPlayer;
    XSoundAliasList mReloadStartSound;
    XSoundAliasList mReloadStartSoundPlayer;
    XSoundAliasList mReloadEndSound;
    XSoundAliasList mReloadEndSoundPlayer;
    XSoundAliasList mDetonateSound;
    XSoundAliasList mDetonateSoundPlayer;
    XSoundAliasList mNightVisionWearSound;
    XSoundAliasList mNightVisionWearSoundPlayer;
    XSoundAliasList mNightVisionRemoveSound;
    XSoundAliasList mNightVisionRemoveSoundPlayer;
    XSoundAliasList mAltSwitchSound;
    XSoundAliasList mAltSwitchSoundPlayer;
    XSoundAliasList mRaiseSound;
    XSoundAliasList mRaiseSoundPlayer;
    XSoundAliasList mFirstRaiseSound;
    XSoundAliasList mFirstRaiseSoundPlayer;
    XSoundAliasList mPutawaySound;
    XSoundAliasList mPutawaySoundPlayer;
    XSoundAliasList *mBounceSound;
    XFxEffectDef mViewShellEjectEffect;
    XFxEffectDef mWorldShellEjectEffect;
    XFxEffectDef mViewLastShotEjectEffect;
    XFxEffectDef mWorldLastShotEjectEffect;
    XMaterial mReticleCenter;
    XMaterial mReticleSide;

    int mReticleCenterSize;
    int mReticleSideSize;
    int mReticleMinOfs;
    XActiveReticleType mActiveReticleType;
    float mStandMove[3];
    float mStandRot[3];
    float mDuckedOfs[3];
    float mDuckedMove[3];
    float mDuckedRot[3];
    float mProneOfs[3];
    float mProneMove[3];
    float mProneRot[3];
    float mPosMoveRate;
    float mPosProneMoveRate;
    float mStandMoveMinSpeed;
    float mDuckedMoveMinSpeed;
    float mProneMoveMinSpeed;
    float mPosRotRate;
    float mPosProneRotRate;
    float mStandRotMinSpeed;
    float mDuckedRotMinSpeed;
    float mProneRotMinSpeed;

    QVector<XModel> mWorldModel;
    XModel mWorldClipModel;
    XModel mWocketModel;
    XModel mKnifeModel;
    XModel mWorldKnifeModel;
    XMaterial mHudIcon;
    XWeaponIconRatioType mHudIconRatio;
    XMaterial mAmmoCounterIcon;

    XWeaponIconRatioType mAmmoCounterIconRatio;
    XAmmoCounterClipType mAmmoCounterClip;
    int mStartAmmo;

    QString mAmmoName;
    int mAmmoIndex;
    QString mClipName;

    int mClipIndex;
    int mMaxAmmo;
    int mClipSize;
    int mShotCount;

    QString mSharedAmmoCapName;

    int mSharedAmmoCapIndex;
    int mSharedAmmoCap;
    int mDamage;
    int mPlayerDamage;
    int mMeleeDamage;
    int mDamageType;
    int mFireDelay;
    int mMeleeDelay;
    int mMeleeChargeDelay;
    int mDetonateDelay;
    int mFireTime;
    int mRechamberTime;
    int mRechamberBoltTime;
    int mHoldFireTime;
    int mDetonateTime;
    int mMeleeTime;
    int mMeleeChargeTime;
    int mReloadTime;
    int mReloadShowRocketTime;
    int mReloadEmptyTime;
    int mReloadAddTime;
    int mReloadStartTime;
    int mReloadStartAddTime;
    int mReloadEndTime;
    int mDropTime;
    int mRaiseTime;
    int mAltDropTime;
    int mAltRaiseTime;
    int mQuickDropTime;
    int mQuickRaiseTime;
    int mFirstRaiseTime;
    int mEmptyRaiseTime;
    int mEmptyDropTime;
    int mSprintInTime;
    int mSprintLoopTime;
    int mSprintOutTime;
    int mNightVisionWearTime;
    int mNightVisionWearTimeFadeOutEnd;
    int mNightVisionWearTimePowerUp;
    int mNightVisionRemoveTime;
    int mNightVisionRemoveTimePowerDown;
    int mNightVisionRemoveTimeFadeInStart;
    int mFuseTime;
    int mAiFuseTime;
    int mRequireLockonToFire;
    int mNoAdsWhenMagEmpty;
    int mAvoidDropCleanup;
    float mAutoAimRange;
    float mAimAssistRange;
    float mAimAssistRangeAds;
    float mAimPadding;
    float mEnemyCrosshairRange;
    int mCrosshairColorChange;
    float mMoveSpeedScale;
    float mAdsMoveSpeedScale;
    float mSprintDurationScale;
    float mAdsZoomFov;
    float mAdsZoomInFrac;
    float mAdsZoomOutFrac;

    XMaterial mOverlayMaterial;
    XMaterial mOverlayMaterialLowRes;

    XWeaponOverlayReticle mOverlayReticle;
    XWeaponOverlayInteface mOverlayInterface;

    float mOverlayWidth;
    float mOverlayHeight;
    float mAdsBobFactor;
    float mAdsViewBobMult;
    float mHipSpreadStandMin;
    float mHipSpreadDuckedMin;
    float mHipSpreadProneMin;
    float mHipSpreadStandMax;
    float mHipSpreadDuckedMax;
    float mHipSpreadProneMax;
    float mHipSpreadDecayRate;
    float mHipSpreadFireAdd;
    float mHipSpreadTurnAdd;
    float mHipSpreadMoveAdd;
    float mHipSpreadDuckedDecay;
    float mHipSpreadProneDecay;
    float mHipReticleSidePos;
    int mAdsTransInTime;
    int mAdsTransOutTime;
    float mAdsIdleAmount;
    float mHipIdleAmount;
    float mAdsIdleSpeed;
    float mHipIdleSpeed;
    float mIdleCrouchFactor;
    float mIdleProneFactor;
    float mGunMaxPitch;
    float mGunMaxYaw;
    float mSwayMaxAngle;
    float mSwayLerpSpeed;
    float mSwayPitchScale;
    float mSwayYawScale;
    float mSwayHorizScale;
    float mSwayVertScale;
    float mSwayShellShockScale;
    float mAdsSwayMaxAngle;
    float mAdsSwayLerpSpeed;
    float mAdsSwayPitchScale;
    float mAdsSwayYawScale;
    float mAdsSwayHorizScale;
    float mAdsSwayVertScale;
    int mRifleBullet;
    int mArmorPiercing;
    int mBoltAction;
    int mAimDownSight;
    int mRechamberWhileAds;
    float mAdsViewErrorMin;
    float mAdsViewErrorMax;
    int mCookOffHold;
    int mClipOnly;
    int mAdsFireOnly;
    int mCancelAutoHolsterWhenEmpty;
    int mSuppressAmmoReserveDisplay;
    int mEnhanced;
    int mLaserSightDuringNightvision;

    XMaterial mKillIcon;
    XWeaponIconRatioType mKillIconRatio;
    int mFlipKillIcon;

    XMaterial mDpadIcon;

    XWeaponIconRatioType mDpadIconRatio;
    int mNoPartialReload;
    int mSegmentedReload;
    int mReloadAmmoAdd;
    int mReloadStartAdd;

    QString mAltWeaponName;

    uint mAltWeaponIndex;
    int mDropAmmoMin;
    int mDropAmmoMax;
    int mBlocksProne;
    int mSilenced;
    int mExplosionRadius;
    int mExplosionRadiusMin;
    int mExplosionInnerDamage;
    int mExplosionOuterDamage;
    float mDamageConeAngle;
    int mProjectileSpeed;
    int mProjectileSpeedUp;
    int mProjectileSpeedForward;
    int mProjectileActivateDist;
    float mProjLifetime;
    float mTimeToAccelerate;
    float mProjectileCurvature;

    XModel mProjectileModel;
    XWeaponProjExposion mProjExplosion;

    XFxEffectDef mProjExplosionEffect;
    int mProjExplosionEffectForceNormalUp;

    XFxEffectDef mProjDudEffect;
    XSoundAliasList mProjExplosionSound;
    XSoundAliasList mProjDudSound;

    int mProjImpactExplode;
    XWeaponStickinessType mStickiness;
    int mHasDetonator;
    int mTimedDetonation;
    int mRotate;
    int mHoldButtonToThrow;
    int mFreezeMovementWhenFiring;
    float mLowAmmoWarningThreshold;
    float mParallelBounce[29];
    float mPerpendicularBounce[29];

    XFxEffectDef mProjTrailEffect;

    float mProjectileColor[3];
    XGuidedMissileType mGuidedMissileType;
    float mMaxSteeringAccel;
    int mProjIgnitionDelay;
    XFxEffectDef mProjIgnitionEffect;

    XSoundAliasList mProjIgnitionSound;

    float mAdsAimPitch;
    float mAdsCrosshairInFrac;
    float mAdsCrosshairOutFrac;
    int mAdsGunKickReducedKickBullets;
    float mAdsGunKickReducedKickPercent;
    float mAdsGunKickPitchMin;
    float mAdsGunKickPitchMax;
    float mAdsGunKickYawMin;
    float mAdsGunKickYawMax;
    float mAdsGunKickAccel;
    float mAdsGunKickSpeedMax;
    float mAdsGunKickSpeedDecay;
    float mAdsGunKickStaticDecay;
    float mAdsViewKickPitchMin;
    float mAdsViewKickPitchMax;
    float mAdsViewKickYawMin;
    float mAdsViewKickYawMax;
    float mAdsViewKickCenterSpeed;
    float mAdsViewScatterMin;
    float mAdsViewScatterMax;
    float mAdsSpread;
    int mHipGunKickReducedKickBullets;
    float mHipGunKickReducedKickPercent;
    float mHipGunKickPitchMin;
    float mHipGunKickPitchMax;
    float mHipGunKickYawMin;
    float mHipGunKickYawMax;
    float mHipGunKickAccel;
    float mHipGunKickSpeedMax;
    float mHipGunKickSpeedDecay;
    float mHipGunKickStaticDecay;
    float mHipViewKickPitchMin;
    float mHipViewKickPitchMax;
    float mHipViewKickYawMin;
    float mHipViewKickYawMax;
    float mHipViewKickCenterSpeed;
    float mHipViewScatterMin;
    float mHipViewScatterMax;
    float mMightDist;
    float mMaxDist;

    QString mAccuracyGraphName[2];
    float mAccuracyGraphKnots[2];
    float mOriginalAccuracyGraphKnots[2];

    int mAccuracyGraphKnotCount[2];
    int mOriginalAccuracyGraphKnotCount[2];
    int mPositionReloadTransTime;
    float mLeftArc;
    float mRightArc;
    float mTopArc;
    float mBottomArc;
    float mAccuracy;
    float mAiSpread;
    float mPlayerSpread;
    float mMinTurnSpeed[2];
    float mMaxTurnSpeed[2];
    float mPitchConvergenceTime;
    float mYawConvergenceTime;
    float mSuppressTime;
    float mMaxRange;
    float mAnimHorRotateInc;
    float mPlayerPositionDist;

    QString mUseHintString;
    QString mDropHintString;

    int mUseHintStringIndex;
    int mDropHintStringIndex;
    float mHorizViewJitter;
    float mVertViewJitter;

    QString mScript;

    float mPosAnimLength[2];
    int mMinDamage;
    int mMinPlayerDamage;
    float mMaxDamageRange;
    float mMinDamageRange;
    float mDestabilizationRateTime;
    float mDestabilizationCurvatureMax;
    int mDestabilizeDistance;
    float mLocationDamageMultipliers[19];

    QString mFireRumble;
    QString mMeleeImpactRumble;

    float mAdsDofStart;
    float mAdsDofEnd;
};

#endif // XWEAPONDEF_H










