www.pudn.com > Sterren_ASe_Explorer.rar > ase_threatboard.h


/* Copyright (C) William van der Sterren, 2002.  
 * All rights reserved worldwide. 
 * 
 * This software is provided "as is" without express or implied 
 * warranties. You may freely copy and compile this source into 
 * applications you distribute provided that the copyright text 
 * below is included in the resulting source code, for example: 
 * "Portions Copyright (C) William van der Sterren, 2002" 
 */ 
 
/***************************************************************************   
 *                                                                             
 *     purpose: threat and line-of-fire lookup table and overlay 
*/ 
 
#ifndef _ASE_THREATBOARD_H_ 
#define _ASE_THREATBOARD_H_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif 
 
 
#include "ase_board.h" 
#include "ase_threat.h" 
#include "ase_coordpair.h" 
#include "ase_piescan.h" 
#include  
 
// forward decls 
class ASE_TerrainBoard; 
 
 
class ASE_ThreatBoard : public ASE_Board 
{ 
  public: 
    ASE_ThreatBoard(unsigned int            aNumberOfRows,  
                    unsigned int            aNumberOfColumns, 
                    const ASE_TerrainBoard* theTerrain 
                   ); 
    virtual ~ASE_ThreatBoard(); 
 
    //! manipulation 
    void  MarkThreatPosition(int aRow, int aCol); 
    void  ClearThreatPosition(int aRow, int aCol); 
 
    bool  IsThreatPosition(int aRow, int aCol) const; 
    bool  IsThreatPosition(unsigned int anIndex) const; 
 
    // threat positions 
    void  GetThreatPositions(CoordPairList& thePositions /*! out */) const; 
 
    // los template 
    const ASE_PieScan* GetLineOfSightTemplate() const; 
 
    //! risk modus 
    enum RiskModus 
      {  
        eAnyLineOfFire, 
        eMinLineOfFireDistance, 
        eMinLineOfFireCount, 
        eMinLineOfFireCountAndDistance 
      }; 
    void         SetRiskModus(RiskModus aRiskModus); 
    RiskModus    GetRiskModus() const; 
 
    float        GetRiskValue(int aRow, int aCol) const; 
    float        GetRiskValue(unsigned int anIndex) const; 
    float        GetMaxRiskValue() const; 
 
    int          GetMaxThreatReach() const; 
 
    //! initialization upon map load 
    void         InitializeLinesOfFire(); 
    //! line-of-fire expansion 
    void         ComputeLinesOfFire(); 
 
    // threat movement 
    unsigned int GetAssumedThreatMovement() const; 
    void         SetAssumedThreatMovement(unsigned int theAssumedThreatMovement); 
 
    // visualization 
    COLORREF     GetCellColorForOffset(unsigned int anIndex, CellValue anOffset) const; 
 
    COLORREF     GetLineOfFireColor() const; 
 
    // support for LOS approximation board 
    void ComputeLinesOfFireFromCell(unsigned int   aRow,  
                                    unsigned int   aCol, 
                                    CoordPairList& theCoveredPositions /*! in+out */ 
                                   ) const; 
 
  protected: 
    void         FillOutPalette(); 
 
  protected: 
    void ClearLinesOfFire(); 
    void ConstructPossibleThreatPositions(unsigned int   aRow,  
                                          unsigned int   aCol,  
                                          unsigned int   aMaximumMovement, 
                                          CoordPairList& thePositions 
                                         ) const; 
    void ComputeLinesOfFireForMovingThreat(unsigned int   aRow,  
                                           unsigned int   aCol,  
                                           unsigned int   aMaximumMovement 
                                          ); 
    void ComputeLinesOfFireFromCellTowardsCell(float          aSourceXPos,  
                                               float          aSourceYPos, 
                                               float          aDestinationXPos,  
                                               float          aDestinationYPos, 
                                               float          aMaximumDistance, 
                                               CoordPairList& theCoveredPositions /*! in+out */ 
                                              ) const; 
 
    CellValue DetermineLineOfFireRiskAnyLOF(unsigned int anIndex) const; 
    CellValue DetermineLineOfFireRiskMinDistance(unsigned int anIndex) const; 
    CellValue DetermineLineOfFireRiskLOFCount(unsigned int anIndex) const; 
    CellValue DetermineLineOfFireRiskDistanceLOFCount(unsigned int anIndex) const; 
 
  protected: // keep track of actual locations covered by threat 
    typedef std::vector ThreatList; 
    ThreatList         m_Threats; 
 
    void AddThreat(ASE_Threat* theThreat); 
    void RemoveThreat(unsigned int aLocation); 
    bool DoesSomeThreatOccupyLocation(unsigned int aLocation) const; 
 
    ASE_Threat* GetThreatForLocation(unsigned int aLocation) const; 
 
    void ObtainAllThreatsFromBoard(); 
    void RemoveAllThreats(); 
 
  protected:  
    ASE_PieScan             m_PieTemplate;     //!< object containing template rays 
 
  protected: 
    RiskModus               m_RiskModus;       //!< determines what cell value means 
    const ASE_TerrainBoard* m_kTerrainBoard;   //!< terrain object 
    float                   m_LineOfFireReach; //!< maximum reach of fire/sight 
    float                   m_RiskFactor;      //!< multiplier for costs of being in lof 
 
  private: 
    const  CellValue        m_kThreatPosition; 
    const  CellValue        m_kThreatLineOfFire; 
 
    const  float            m_kBaseRisk;       //!< minimum risk value for being in the lof 
    const  CellValue        m_kMaxLOFCount;    //!< maximum number of lof counts that is considered 
 
    unsigned int            m_ThreatMovement; 
 
    COLORREF*               m_ThreatBrushes; 
}; 
 
 
#endif // _ASE_THREATBOARD_H_