/* Copyright (c) 2002-2012 Croteam Ltd. 
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as published by
the Free Software Foundation


This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */

603
%{
#include "StdH.h"
%}

// input parameter for spawning a blood spray
event ESpawnSpray {
  enum SprayParticlesType sptType, // type of particles
  FLOAT fDamagePower,              // factor saying how powerfull damage has been
  FLOAT fSizeMultiplier,           // stretch factor
  FLOAT3D vDirection,              // dammage direction  
  CEntityPointer penOwner,         // who spawned the spray
  COLOR colCentralColor,           // central color of particles that is randomized a little
  FLOAT fLaunchPower,
  COLOR colBurnColor,              // burn color
};

class CBloodSpray: CRationalEntity {
name      "Blood Spray";
thumbnail "";
features  "CanBePredictable";

properties:

  1 enum SprayParticlesType m_sptType = SPT_NONE,                    // type of particles
  2 FLOAT m_tmStarted = 0.0f,                                        // time when spawned
  3 FLOAT3D m_vDirection = FLOAT3D(0,0,0),                           // dammage direction
  5 CEntityPointer m_penOwner,                                       // who spawned the spray
  6 FLOAT m_fDamagePower = 1.0f,                                     // power of inflicted damage
  8 FLOATaabbox3D m_boxSizedOwner = FLOATaabbox3D(FLOAT3D(0,0,0), 0.01f), // bounding box of blood spray's owner
  9 FLOAT3D m_vGDir = FLOAT3D(0,0,0),                                // gravity direction
  10 FLOAT m_fGA = 0.0f,                                             // gravity strength
  11 FLOAT m_fLaunchPower = 1.0f,
  12 COLOR m_colCentralColor = COLOR(C_WHITE|CT_OPAQUE),
  13 FLOATaabbox3D m_boxOriginalOwner = FLOATaabbox3D(FLOAT3D(0,0,0), 0.01f),
  14 COLOR m_colBurnColor = COLOR(C_WHITE|CT_OPAQUE),


components:
  1 model   MODEL_MARKER     "Models\\Editor\\Axis.mdl",
  2 texture TEXTURE_MARKER   "Models\\Editor\\Vector.tex"

functions:

  // particles
  void RenderParticles(void)
  {
    switch( m_sptType)
    {
    case SPT_BLOOD:
    case SPT_BONES:
    case SPT_FEATHER:
    case SPT_STONES:
    case SPT_WOOD:
    case SPT_SLIME:
    case SPT_LAVA_STONES:
    case SPT_SMALL_LAVA_STONES:
    case SPT_BEAST_PROJECTILE_SPRAY:
    case SPT_AIRSPOUTS:
    case SPT_GOO:
    {
      Particles_BloodSpray(m_sptType, GetLerpedPlacement().pl_PositionVector, m_vGDir, m_fGA,
        m_boxSizedOwner, m_vDirection, m_tmStarted, m_fDamagePower, m_colBurnColor);
      break;
    }
    case SPT_COLOREDSTONE:
      {
        Particles_BloodSpray(m_sptType, GetLerpedPlacement().pl_PositionVector, m_vGDir, m_fGA,
          m_boxSizedOwner, m_vDirection, m_tmStarted, m_fDamagePower, MulColors(m_colCentralColor, m_colBurnColor) );
        break;
      }
    case SPT_TREE01:
      Particles_BloodSpray(SPT_WOOD, GetLerpedPlacement().pl_PositionVector, m_vGDir, m_fGA/1.5f,
        m_boxSizedOwner, m_vDirection, m_tmStarted, m_fDamagePower/2.0f, m_colBurnColor);
      Particles_Leaves(m_penOwner, m_boxOriginalOwner, GetLerpedPlacement().pl_PositionVector,
        m_fDamagePower, m_fDamagePower*m_fLaunchPower, m_vGDir,
        m_fGA/2.0f, m_tmStarted, MulColors(m_colCentralColor,m_colBurnColor));
      break;
    case SPT_PLASMA:
        Particles_BloodSpray(m_sptType, GetLerpedPlacement().pl_PositionVector, m_vGDir, m_fGA,
          m_boxSizedOwner, m_vDirection, m_tmStarted, m_fDamagePower);
        Particles_DamageSmoke(this, m_tmStarted, m_boxSizedOwner, m_fDamagePower);
        Particles_ElectricitySparks( this, m_tmStarted, 5.0f, 0.0f, 32);
      break;
    case SPT_ELECTRICITY_SPARKS:
      {
        Particles_MetalParts(this, m_tmStarted, m_boxSizedOwner, m_fDamagePower);
        Particles_DamageSmoke(this, m_tmStarted, m_boxSizedOwner, m_fDamagePower);
        Particles_BloodSpray(SPT_BLOOD, GetLerpedPlacement().pl_PositionVector, m_vGDir, m_fGA,
          m_boxSizedOwner, m_vDirection, m_tmStarted, m_fDamagePower/2.0f, C_WHITE|CT_OPAQUE);
        Particles_ElectricitySparks( this, m_tmStarted, 5.0f, 0.0f, 32);
        break;
      }
    case SPT_ELECTRICITY_SPARKS_NO_BLOOD:
      {
        Particles_MetalParts(this, m_tmStarted, m_boxSizedOwner, m_fDamagePower);
        Particles_DamageSmoke(this, m_tmStarted, m_boxSizedOwner, m_fDamagePower);
        Particles_ElectricitySparks( this, m_tmStarted, 5.0f, 0.0f, 32);        
      }
    }
  };

/************************************************************
 *                          MAIN                            *
 ************************************************************/

procedures:

  Main( ESpawnSpray eSpawn)
  {
    InitAsEditorModel();
    SetPhysicsFlags(EPF_MODEL_IMMATERIAL);
    SetCollisionFlags(ECF_IMMATERIAL);
    SetPredictable(TRUE);

    // set appearance
    SetModel(MODEL_MARKER);
    SetModelMainTexture(TEXTURE_MARKER);

    // setup variables
    m_sptType = eSpawn.sptType;
    m_vDirection = eSpawn.vDirection;
    m_penOwner = eSpawn.penOwner;
    m_fDamagePower = eSpawn.fDamagePower;
    m_fLaunchPower = eSpawn.fLaunchPower;
    m_colBurnColor = eSpawn.colBurnColor;
    m_tmStarted = _pTimer->CurrentTick();
    m_colCentralColor = eSpawn.colCentralColor;

    // if owner doesn't exist (could be destroyed in initialization)
    if( eSpawn.penOwner==NULL || eSpawn.penOwner->en_pmoModelObject == NULL)
    {
      // don't do anything
      Destroy();
      return;
    }

    if(eSpawn.penOwner->en_RenderType == RT_SKAMODEL) {
      eSpawn.penOwner->GetModelInstance()->GetCurrentColisionBox( m_boxSizedOwner);
    } else {
      eSpawn.penOwner->en_pmoModelObject->GetCurrentFrameBBox( m_boxSizedOwner);
      m_boxOriginalOwner=m_boxSizedOwner;
      m_boxSizedOwner.StretchByVector(eSpawn.penOwner->en_pmoModelObject->mo_Stretch*eSpawn.fSizeMultiplier);
      m_boxOriginalOwner.StretchByVector(eSpawn.penOwner->en_pmoModelObject->mo_Stretch);
    }

      if (m_penOwner->GetPhysicsFlags()&EPF_MOVABLE) {
      m_vGDir = ((CMovableEntity *)&*m_penOwner)->en_vGravityDir;
      m_fGA = ((CMovableEntity *)&*m_penOwner)->en_fGravityA;
    } else {
      FLOATmatrix3D &m = m_penOwner->en_mRotation;
      m_vGDir = FLOAT3D(-m(1,2), -m(2,2), -m(3,2));
      m_fGA = 30.0f;
    }

    FLOAT fWaitTime = 4.0f;
    if( m_sptType==SPT_ELECTRICITY_SPARKS || m_sptType==SPT_ELECTRICITY_SPARKS_NO_BLOOD)
    {
      fWaitTime = 4.0f;
    }
    autowait(fWaitTime);
    Destroy();

    return;
  }
};