www.pudn.com > Sterren_ASe_Explorer.rar > ase_losapproxboard.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: approximated line-of-sight lookup table and overlay 
*/ 
 
 
#ifndef _ASE_LOSAPPROXBOARD_H_ 
#define _ASE_LOSAPPROXBOARD_H_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif 
 
 
#include "ase_board.h" 
#include "ase_losscan.h" 
#include "ase_coordpair.h" 
#include  
 
// forward decls 
class ASE_TerrainBoard; 
class ASE_ThreatBoard; 
 
 
class ASE_LOSApproximationBoard : public ASE_Board 
{ 
  public: 
    ASE_LOSApproximationBoard(unsigned int            aNumberOfRows,  
                              unsigned int            aNumberOfColumns, 
                              const ASE_TerrainBoard* theTerrainBoard, 
                              const ASE_ThreatBoard*  theThreatBoard 
                             ); 
    virtual ~ASE_LOSApproximationBoard(); 
 
    //! inits board and change area 
    void         Clear(); 
 
    //! signalling of terrain/threat modification 
    void         ApplyTerrainModification(int anX, int aY); 
    void         ApplyThreatModification(int anX, int aY); 
 
    //! approximation 
    void         ComputeLinesOfFireApproximation(); 
 
    float        GetRiskValue(int aRow, int aCol) const; 
    float        GetRiskValue(unsigned int anIndex) const; 
 
    //! obtaining values for drawing 
    COLORREF     GetCellColorForOffset(unsigned int anIndex, CellValue anOffset) const; 
 
  protected: 
    void         PrepareListOfObstacles(); 
    bool         IsAnyObstacleWithinRange(int x, int y, int theRange) const; 
    bool         IsAnyObstacleWithinRangeAndSector(int x, int y, int theRange, unsigned int aSector) const; 
    unsigned int GetDistanceToNearestObstacleWithinRangeAndSector(int x, int y, int theRange, unsigned int aSector) const; 
     
    void         SetLocationAsLackingAnyCover(int x, int y); 
    void         ApproximateLOFForLocationBySector(int x, int y);  
 
    void         ComputeSectorLOSForLocation(int x, int y, unsigned int aSector, unsigned int aRange); 
 
    void         UpdateBoard();   
 
  protected: 
    void         InitChangeRange(); 
    void         ResetChangeRange(); 
    void         GetChangeRange(int& aMinX, int& aMinY, int& aMaxX, int& aMaxY); 
    bool         DidAnythingChange() const; 
 
    bool         IsPositionInRangeOfAnyThreat(int anX, int aY, int& /*!out*/ theDistance); 
                   // LineOfSightScanInfos; 
    LineOfSightScanInfos    m_LineOfSightScanInfos; 
 
    const ASE_TerrainBoard* m_kTerrainBoard;                   //!< terrain object 
    const ASE_ThreatBoard*  m_kThreatBoard;                    //!< threat object 
 
    CoordPairList           m_ObstaclePositions; 
 
    const CellValue         m_kDangerFromFarThreats; 
    const CellValue         m_kDangerFromNearThreats; 
    const CellValue         m_kDangerFromNearAndFarThreats; 
 
    int                     m_MinThreatX; 
    int                     m_MinThreatY; 
    int                     m_MaxThreatX; 
    int                     m_MaxThreatY; 
    int                     m_MinTerrainX; 
    int                     m_MinTerrainY; 
    int                     m_MaxTerrainX; 
    int                     m_MaxTerrainY; 
 
    static COLORREF         m_LOSApproximationBrushes[]; 
}; 
 
 
#endif // _ASE_LOSAPPROXBOARD_H_