CleanUp
This commit is contained in:
parent
f10d5c5c8e
commit
43a340ee34
8 changed files with 368 additions and 362 deletions
|
@ -5,12 +5,12 @@
|
|||
// /_______ /|__| |__| (____ /__| (____ /\___ /|____//____ >
|
||||
// \/ \/ \//_____/ \/
|
||||
// ______________________ ______________________
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
//
|
||||
/**@name astar.c - The a* path finder routines. */
|
||||
/**@name astar.c - The a* path finder routines. */
|
||||
//
|
||||
// (c) Copyright 1999-2003 by Lutz Sammer,Fabrice Rossi, Russell Smith
|
||||
// (c) Copyright 1999-2003 by Lutz Sammer,Fabrice Rossi, Russell Smith
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -26,12 +26,12 @@
|
|||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
// 02111-1307, USA.
|
||||
//
|
||||
// $Id$
|
||||
// $Id$
|
||||
|
||||
//@{
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Includes
|
||||
-- Includes
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -45,20 +45,20 @@
|
|||
#include "pathfinder.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Declarations
|
||||
-- Declarations
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
typedef struct _node_ {
|
||||
char Direction; /// Direction for trace back
|
||||
char InGoal; /// is this point in the goal
|
||||
int CostFromStart; /// Real costs to reach this point
|
||||
char Direction; ///< Direction for trace back
|
||||
char InGoal; ///< is this point in the goal
|
||||
int CostFromStart; ///< Real costs to reach this point
|
||||
} Node;
|
||||
|
||||
typedef struct _open_ {
|
||||
int X; /// X coordinate
|
||||
int Y; /// Y coordinate
|
||||
int O; /// Offset into matrix
|
||||
int Costs; /// complete costs to goal
|
||||
int X; ///< X coordinate
|
||||
int Y; ///< Y coordinate
|
||||
int O; ///< Offset into matrix
|
||||
int Costs; ///< complete costs to goal
|
||||
} Open;
|
||||
|
||||
/// heuristic cost fonction for a star
|
||||
|
@ -68,11 +68,11 @@ typedef struct _open_ {
|
|||
// #define AStarCosts(sx,sy,ex,ey) isqrt((abs(sx-ex)*abs(sx-ex))+(abs(sy-ey)*abs(sy-ey)))
|
||||
// #define AStarCosts(sx,sy,ex,ey) max(abs(sx-ex),abs(sy-ey))
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Variables
|
||||
-- Variables
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
// Convert heading into direction.
|
||||
// // N NE E SE S SW W NW
|
||||
// // N NE E SE S SW W NW
|
||||
const int Heading2X[9] = { 0,+1,+1,+1, 0,-1,-1,-1, 0 };
|
||||
const int Heading2Y[9] = { -1,-1, 0,+1,+1,+1, 0,-1, 0 };
|
||||
const int XY2Heading[3][3] = { {7,6,5},{0,0,4},{1,2,3}};
|
||||
|
@ -84,7 +84,7 @@ static int Threshold;
|
|||
static int OpenSetMaxSize;
|
||||
static int AStarMatrixSize;
|
||||
#define MAX_CLOSE_SET_RATIO 4
|
||||
#define MAX_OPEN_SET_RATIO 8 // 10,16 to small
|
||||
#define MAX_OPEN_SET_RATIO 8 // 10,16 to small
|
||||
|
||||
/// see pathfinder.h
|
||||
int AStarFixedUnitCrossingCost = MaxMapWidth * MaxMapHeight;
|
||||
|
@ -93,9 +93,9 @@ int AStarKnowUnknown = 0;
|
|||
int AStarUnknownTerrainCost = 2;
|
||||
|
||||
/**
|
||||
** The Open set is handled by a Heap stored in a table
|
||||
** 0 is the root
|
||||
** node i left son is at 2*i+1 and right son is at 2*i+2
|
||||
** The Open set is handled by a Heap stored in a table
|
||||
** 0 is the root
|
||||
** node i left son is at 2*i+1 and right son is at 2*i+2
|
||||
*/
|
||||
|
||||
/// The set of Open nodes
|
||||
|
@ -104,7 +104,7 @@ static Open* OpenSet;
|
|||
static int OpenSetSize;
|
||||
|
||||
/**
|
||||
** Init A* data structures
|
||||
** Init A* data structures
|
||||
*/
|
||||
void InitAStar(void)
|
||||
{
|
||||
|
@ -119,7 +119,7 @@ void InitAStar(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Free A* data structure
|
||||
** Free A* data structure
|
||||
*/
|
||||
void FreeAStar(void)
|
||||
{
|
||||
|
@ -132,7 +132,7 @@ void FreeAStar(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Prepare path finder.
|
||||
** Prepare path finder.
|
||||
*/
|
||||
static void AStarPrepare(void)
|
||||
{
|
||||
|
@ -140,7 +140,7 @@ static void AStarPrepare(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Clean up the AStarMatrix
|
||||
** Clean up the AStarMatrix
|
||||
*/
|
||||
static void AStarCleanUp(int num_in_close)
|
||||
{
|
||||
|
@ -157,9 +157,9 @@ static void AStarCleanUp(int num_in_close)
|
|||
}
|
||||
|
||||
/**
|
||||
** Find the best node in the current open node set
|
||||
** Returns the position of this node in the open node set (always 0 in the
|
||||
** current heap based implementation)
|
||||
** Find the best node in the current open node set
|
||||
** Returns the position of this node in the open node set (always 0 in the
|
||||
** current heap based implementation)
|
||||
*/
|
||||
#define AStarFindMinimum() 0
|
||||
#if 0
|
||||
|
@ -170,8 +170,8 @@ static int AStarFindMinimum()
|
|||
#endif
|
||||
|
||||
/**
|
||||
** Remove the minimum from the open node set (and update the heap)
|
||||
** pos is the position of the minimum (0 in the heap based implementation)
|
||||
** Remove the minimum from the open node set (and update the heap)
|
||||
** pos is the position of the minimum (0 in the heap based implementation)
|
||||
*/
|
||||
static void AStarRemoveMinimum(int pos)
|
||||
{
|
||||
|
@ -204,8 +204,8 @@ static void AStarRemoveMinimum(int pos)
|
|||
}
|
||||
|
||||
/**
|
||||
** Add a new node to the open set (and update the heap structure)
|
||||
** Returns Pathfinder failed
|
||||
** Add a new node to the open set (and update the heap structure)
|
||||
** Returns Pathfinder failed
|
||||
*/
|
||||
static int AStarAddNode(int x, int y, int o, int costs)
|
||||
{
|
||||
|
@ -240,8 +240,8 @@ static int AStarAddNode(int x, int y, int o, int costs)
|
|||
}
|
||||
|
||||
/**
|
||||
** Change the cost associated to an open node. The new cost MUST BE LOWER
|
||||
** than the old one in the current heap based implementation.
|
||||
** Change the cost associated to an open node. The new cost MUST BE LOWER
|
||||
** than the old one in the current heap based implementation.
|
||||
*/
|
||||
static void AStarReplaceNode(int pos, int costs)
|
||||
{
|
||||
|
@ -267,8 +267,8 @@ static void AStarReplaceNode(int pos, int costs)
|
|||
|
||||
|
||||
/**
|
||||
** Check if a node is already in the open set.
|
||||
** Return -1 if not found and the position of the node in the table if found.
|
||||
** Check if a node is already in the open set.
|
||||
** Return -1 if not found and the position of the node in the table if found.
|
||||
*/
|
||||
static int AStarFindNode(int eo)
|
||||
{
|
||||
|
@ -283,10 +283,10 @@ static int AStarFindNode(int eo)
|
|||
}
|
||||
|
||||
/**
|
||||
** Compute the cost of crossing tile (dx,dy)
|
||||
** -1 -> impossible to cross
|
||||
** 0 -> no induced cost, except move
|
||||
** >0 -> costly tile
|
||||
** Compute the cost of crossing tile (dx,dy)
|
||||
** -1 -> impossible to cross
|
||||
** 0 -> no induced cost, except move
|
||||
** >0 -> costly tile
|
||||
*/
|
||||
static int CostMoveTo(Unit* unit, int ex, int ey, int mask, int current_cost) {
|
||||
int j;
|
||||
|
@ -332,7 +332,7 @@ static int CostMoveTo(Unit* unit, int ex, int ey, int mask, int current_cost) {
|
|||
}
|
||||
|
||||
/**
|
||||
** MarkAStarGoal
|
||||
** MarkAStarGoal
|
||||
*/
|
||||
static int AStarMarkGoal(Unit* unit, int gx, int gy, int gw, int gh, int minrange, int maxrange,
|
||||
int mask, int* num_in_close)
|
||||
|
@ -506,7 +506,7 @@ static int AStarMarkGoal(Unit* unit, int gx, int gy, int gw, int gh, int minrang
|
|||
return goal_reachable;
|
||||
}
|
||||
/**
|
||||
** Find path.
|
||||
** Find path.
|
||||
*/
|
||||
int AStarFindPath(Unit* unit, int gx, int gy, int gw, int gh, int minrange, int maxrange, char* path)
|
||||
{
|
||||
|
@ -583,7 +583,7 @@ int AStarFindPath(Unit* unit, int gx, int gy, int gw, int gh, int minrange, int
|
|||
|
||||
while( 1 ) {
|
||||
//
|
||||
// Find the best node of from the open set
|
||||
// Find the best node of from the open set
|
||||
//
|
||||
shortest=AStarFindMinimum();
|
||||
x=OpenSet[shortest].X;
|
||||
|
@ -594,7 +594,7 @@ int AStarFindPath(Unit* unit, int gx, int gy, int gw, int gh, int minrange, int
|
|||
AStarRemoveMinimum(shortest);
|
||||
|
||||
//
|
||||
// If we have reached the goal, then exit.
|
||||
// If we have reached the goal, then exit.
|
||||
if( AStarMatrix[o].InGoal==1 ) {
|
||||
ex=x;
|
||||
ey=y;
|
||||
|
@ -602,19 +602,19 @@ int AStarFindPath(Unit* unit, int gx, int gy, int gw, int gh, int minrange, int
|
|||
}
|
||||
|
||||
//
|
||||
// If we have looked too long, then exit.
|
||||
// If we have looked too long, then exit.
|
||||
//
|
||||
if( !counter-- ) {
|
||||
//
|
||||
// Select a "good" point from the open set.
|
||||
// Nearest point to goal.
|
||||
// Select a "good" point from the open set.
|
||||
// Nearest point to goal.
|
||||
DebugPrint("%d way too long\n" _C_ UnitNumber(unit));
|
||||
AStarCleanUp(num_in_close);
|
||||
return PF_FAILED;
|
||||
}
|
||||
|
||||
//
|
||||
// Generate successors of this node.
|
||||
// Generate successors of this node.
|
||||
|
||||
// Node that this node was generated from.
|
||||
px=x-Heading2X[(int)AStarMatrix[x+TheMap.Width*y].Direction];
|
||||
|
@ -631,7 +631,7 @@ int AStarFindPath(Unit* unit, int gx, int gy, int gw, int gh, int minrange, int
|
|||
continue;
|
||||
}
|
||||
//
|
||||
// Outside the map or can't be entered.
|
||||
// Outside the map or can't be entered.
|
||||
//
|
||||
if( ex<0 || ex>=TheMap.Width ) {
|
||||
continue;
|
||||
|
@ -685,7 +685,7 @@ int AStarFindPath(Unit* unit, int gx, int gy, int gw, int gh, int minrange, int
|
|||
// we don't have to add this point to the close set
|
||||
}
|
||||
}
|
||||
if( OpenSetSize<=0 ) { // no new nodes generated
|
||||
if( OpenSetSize<=0 ) { // no new nodes generated
|
||||
AStarCleanUp(num_in_close);
|
||||
return PF_UNREACHABLE;
|
||||
}
|
||||
|
@ -733,14 +733,14 @@ int AStarFindPath(Unit* unit, int gx, int gy, int gw, int gh, int minrange, int
|
|||
}
|
||||
|
||||
/**
|
||||
** Returns the next element of a path.
|
||||
** Returns the next element of a path.
|
||||
**
|
||||
** @param unit Unit that wants the path element.
|
||||
** @param pxd Pointer for the x direction.
|
||||
** @param pyd Pointer for the y direction.
|
||||
** @param unit Unit that wants the path element.
|
||||
** @param pxd Pointer for the x direction.
|
||||
** @param pyd Pointer for the y direction.
|
||||
**
|
||||
** @return >0 remaining path length, 0 wait for path, -1
|
||||
** reached goal, -2 can't reach the goal.
|
||||
** @return >0 remaining path length, 0 wait for path, -1
|
||||
** reached goal, -2 can't reach the goal.
|
||||
*/
|
||||
int NextPathElement(Unit* unit,int* pxd,int *pyd)
|
||||
{
|
||||
|
|
|
@ -5,14 +5,14 @@
|
|||
// /_______ /|__| |__| (____ /__| (____ /\___ /|____//____ >
|
||||
// \/ \/ \//_____/ \/
|
||||
// ______________________ ______________________
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
//
|
||||
/**@name pathfinder.c - The path finder routines. */
|
||||
/**@name pathfinder.c - The path finder routines. */
|
||||
//
|
||||
// I use breadth-first.
|
||||
// I use breadth-first.
|
||||
//
|
||||
// (c) Copyright 1998,2000-2003 by Lutz Sammer,Russell Smith
|
||||
// (c) Copyright 1998,2000-2003 by Lutz Sammer,Russell Smith
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -28,12 +28,12 @@
|
|||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
// 02111-1307, USA.
|
||||
//
|
||||
// $Id$
|
||||
// $Id$
|
||||
|
||||
//@{
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Includes
|
||||
-- Includes
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
|
|
@ -5,12 +5,12 @@
|
|||
// /_______ /|__| |__| (____ /__| (____ /\___ /|____//____ >
|
||||
// \/ \/ \//_____/ \/
|
||||
// ______________________ ______________________
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
//
|
||||
/**@name splitter.c - Map splitter into regions. */
|
||||
/**@name splitter.c - Map splitter into regions. */
|
||||
//
|
||||
// (c) Copyright 1999-2003 by Ludovic Pollet
|
||||
// (c) Copyright 1999-2003 by Ludovic Pollet
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -26,14 +26,14 @@
|
|||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
// 02111-1307, USA.
|
||||
//
|
||||
// $Id$
|
||||
|
||||
//@{
|
||||
// $Id$
|
||||
|
||||
#ifdef MAP_REGIONS
|
||||
|
||||
//@{
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Includes
|
||||
-- Includes
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -49,7 +49,7 @@
|
|||
#include "splitter_local.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Variables
|
||||
-- Variables
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
|
@ -66,17 +66,17 @@ int ZoneNeedRefresh;
|
|||
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Functions
|
||||
-- Functions
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/**
|
||||
** Unassign a tile to a region.
|
||||
** Connections are not updated here
|
||||
** Unassign a tile to a region.
|
||||
** Connections are not updated here
|
||||
**
|
||||
** @param region the region ID
|
||||
** @param x X coord of the tile
|
||||
** @param y Y coord of the tile
|
||||
** @param region The region ID
|
||||
** @param x X coord of the tile
|
||||
** @param y Y coord of the tile
|
||||
*/
|
||||
void RegionUnassignTile(RegionId region, int x, int y)
|
||||
{
|
||||
|
@ -144,12 +144,12 @@ void RegionUnassignTile(RegionId region, int x, int y)
|
|||
}
|
||||
|
||||
/**
|
||||
** Assign a tile to a region.
|
||||
** Connections are not updated here
|
||||
** Assign a tile to a region.
|
||||
** Connections are not updated here
|
||||
**
|
||||
** @param region the region ID
|
||||
** @param x X coord of the tile
|
||||
** @param y Y coord of the tile
|
||||
** @param region The region ID
|
||||
** @param x X coord of the tile
|
||||
** @param y Y coord of the tile
|
||||
*/
|
||||
void RegionAssignTile(RegionId region, int x, int y)
|
||||
{
|
||||
|
@ -196,10 +196,10 @@ void RegionAssignTile(RegionId region, int x, int y)
|
|||
}
|
||||
|
||||
/**
|
||||
** Allocate a new region
|
||||
** Allocate a new region
|
||||
**
|
||||
** @param iswater Indicate if the region is water/sea/...
|
||||
** @return the new RegionID
|
||||
** @param iswater Indicate if the region is water/sea/...
|
||||
** @return the new RegionID
|
||||
*/
|
||||
RegionId NewRegion(int iswater)
|
||||
{
|
||||
|
@ -241,9 +241,9 @@ RegionId NewRegion(int iswater)
|
|||
}
|
||||
|
||||
/**
|
||||
** Free a region
|
||||
** Free a region
|
||||
**
|
||||
** @param regid The region to free
|
||||
** @param regid The region to free
|
||||
*/
|
||||
void RegionFree(RegionId regid)
|
||||
{
|
||||
|
@ -273,7 +273,7 @@ void RegionFree(RegionId regid)
|
|||
}
|
||||
|
||||
/**
|
||||
** Update connections for all regions (slow)
|
||||
** Update connections for all regions (slow)
|
||||
**
|
||||
*/
|
||||
void UpdateConnections(void)
|
||||
|
@ -293,12 +293,12 @@ void UpdateConnections(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Split region according to the content of the "TempStorage"
|
||||
** All tile with equal value will go in the same region
|
||||
** Split region according to the content of the "TempStorage"
|
||||
** All tile with equal value will go in the same region
|
||||
**
|
||||
** @param reg The region to split
|
||||
** @param nbarea The number of area
|
||||
** @param updateConnections indicate if connection should be updated
|
||||
** @param reg The region to split
|
||||
** @param nbarea The number of area
|
||||
** @param updateConnections Indicate if connection should be updated
|
||||
*/
|
||||
void RegionSplitUsingTemp(RegionId reg, int nbarea, int updateConnections)
|
||||
{
|
||||
|
@ -394,10 +394,10 @@ void RegionSplitUsingTemp(RegionId reg, int nbarea, int updateConnections)
|
|||
}
|
||||
|
||||
/**
|
||||
** Join to region into only one. Either a or b is destroyed
|
||||
** Join to region into only one. Either a or b is destroyed
|
||||
**
|
||||
** @param a One of the two regions
|
||||
** @param b One of the two regions
|
||||
** @param a One of the two regions
|
||||
** @param b One of the two regions
|
||||
*/
|
||||
void RegionJoin(RegionId a, RegionId b)
|
||||
{
|
||||
|
@ -443,10 +443,10 @@ void RegionJoin(RegionId a, RegionId b)
|
|||
}
|
||||
|
||||
/**
|
||||
** Split a region in two parts
|
||||
** Split a region in two parts
|
||||
**
|
||||
** @param regid the region to broke
|
||||
** @param updateConnections indicate if connection should be updated as well
|
||||
** @param regid the region to broke
|
||||
** @param updateConnections indicate if connection should be updated as well
|
||||
*/
|
||||
void RegionSplit(RegionId regid, int updateConnections)
|
||||
{
|
||||
|
@ -461,7 +461,7 @@ void RegionSplit(RegionId regid, int updateConnections)
|
|||
int blocker;
|
||||
int oldZoneNeedRefresh;
|
||||
int i;
|
||||
CircularFiller fillers[2]; // We have 2 concurrent floodfiller
|
||||
CircularFiller fillers[2]; // We have 2 concurrent floodfiller
|
||||
|
||||
oldZoneNeedRefresh = ZoneNeedRefresh;
|
||||
|
||||
|
@ -557,10 +557,10 @@ void RegionSplit(RegionId regid, int updateConnections)
|
|||
}
|
||||
|
||||
/**
|
||||
** Check that the given region is 8 - connex
|
||||
** ( all its tiles are reachable )
|
||||
** Check that the given region is 8 - connex
|
||||
** (all its tiles are reachable)
|
||||
**
|
||||
** @param reg the region ID
|
||||
** @param reg the region ID
|
||||
*/
|
||||
void RegionCheckConnex(RegionId reg)
|
||||
{
|
||||
|
@ -607,12 +607,13 @@ void RegionCheckConnex(RegionId reg)
|
|||
}
|
||||
|
||||
/**
|
||||
** Called when a tile should no more belong to any regions
|
||||
** Called when a tile should no more belong to any regions
|
||||
**
|
||||
** @param x x position of the tile
|
||||
** @param y y position of the tile
|
||||
** @param x x position of the tile
|
||||
** @param y y position of the tile
|
||||
*/
|
||||
static void MapSplitterTileOccuped(int x, int y) {
|
||||
static void MapSplitterTileOccuped(int x, int y)
|
||||
{
|
||||
RegionId reg;
|
||||
int tx;
|
||||
int ty;
|
||||
|
@ -669,14 +670,15 @@ static void MapSplitterTileOccuped(int x, int y) {
|
|||
}
|
||||
|
||||
/**
|
||||
** Add a rectangle of tiles to region mapping. Called when map change
|
||||
** Add a rectangle of tiles to region mapping. Called when map change
|
||||
**
|
||||
** @param x0 x0 coord of the changed rectangle
|
||||
** @param y0 y0 coord of the changed rectangle
|
||||
** @param x1 x1 coord of the changed rectangle
|
||||
** @param y1 y1 coord of the changed rectangle
|
||||
** @param x0 x0 coord of the changed rectangle
|
||||
** @param y0 y0 coord of the changed rectangle
|
||||
** @param x1 x1 coord of the changed rectangle
|
||||
** @param y1 y1 coord of the changed rectangle
|
||||
*/
|
||||
void MapSplitterTilesCleared(int x0, int y0, int x1, int y1) {
|
||||
void MapSplitterTilesCleared(int x0, int y0, int x1, int y1)
|
||||
{
|
||||
static int directions[5][2] = {{1,0},{0,1},{-1,0},{0,-1},{0,0}};
|
||||
int x;
|
||||
int y;
|
||||
|
@ -774,12 +776,12 @@ void MapSplitterTilesCleared(int x0, int y0, int x1, int y1) {
|
|||
}
|
||||
|
||||
/**
|
||||
** Remove a rectangle of tiles from region mapping. Called when map change
|
||||
** Remove a rectangle of tiles from region mapping. Called when map change
|
||||
**
|
||||
** @param x0 x0 coord of the changed rectangle
|
||||
** @param y0 y0 coord of the changed rectangle
|
||||
** @param x1 x1 coord of the changed rectangle
|
||||
** @param y1 y1 coord of the changed rectangle
|
||||
** @param x0 x0 coord of the changed rectangle
|
||||
** @param y0 y0 coord of the changed rectangle
|
||||
** @param x1 x1 coord of the changed rectangle
|
||||
** @param y1 y1 coord of the changed rectangle
|
||||
*/
|
||||
void MapSplitterTilesOccuped(int x0, int y0, int x1, int y1)
|
||||
{
|
||||
|
@ -798,7 +800,7 @@ void MapSplitterTilesOccuped(int x0, int y0, int x1, int y1)
|
|||
}
|
||||
|
||||
/**
|
||||
** Decide if region should be broken, regarding size & nb of tiles
|
||||
** Decide if region should be broken, regarding size & nb of tiles
|
||||
**
|
||||
*/
|
||||
static int ShouldBreakRegion(int x0, int y0, int x1, int y1, int tilecount, int hardlimit)
|
||||
|
@ -825,7 +827,7 @@ static int ShouldBreakRegion(int x0, int y0, int x1, int y1, int tilecount, int
|
|||
}
|
||||
|
||||
/**
|
||||
** Extend A segment, fill it.
|
||||
** Extend A segment, fill it.
|
||||
**
|
||||
*/
|
||||
static void FindHExtent(int x, int y, int* vx0, int* vx1, int water)
|
||||
|
@ -858,7 +860,7 @@ static void FindHExtent(int x, int y, int* vx0, int* vx1, int water)
|
|||
}
|
||||
|
||||
/**
|
||||
** Flood fill a region in the mapping area
|
||||
** Flood fill a region in the mapping area
|
||||
*/
|
||||
static void RegionFloodFill(int x0, int x1, int starty, int RegId, int IsWater)
|
||||
{
|
||||
|
@ -909,8 +911,8 @@ static void RegionFloodFill(int x0, int x1, int starty, int RegId, int IsWater)
|
|||
}
|
||||
|
||||
/**
|
||||
** Initialise the region mapping ( map tile => regions )
|
||||
** Need an already initialised map to work correctly
|
||||
** Initialise the region mapping ( map tile => regions )
|
||||
** Need an already initialised map to work correctly
|
||||
*/
|
||||
void InitaliseMapping(void)
|
||||
{
|
||||
|
@ -981,15 +983,15 @@ void InitaliseMapping(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Find a point of connexion between two zone.
|
||||
** The point closer to (refx,refy) in (a) is returned
|
||||
** Find a point of connexion between two zone.
|
||||
** The point closer to (refx,refy) in (a) is returned
|
||||
**
|
||||
** @param a a zone number
|
||||
** @param b the other zone number
|
||||
** @param refx Search closest to (refx,refy)
|
||||
** @param refy Search closest to (refx,refy)
|
||||
** @param rsltx Will hold result X
|
||||
** @param rsltx Will hold result Y
|
||||
** @param a a zone number
|
||||
** @param b The other zone number
|
||||
** @param refx Search closest to (refx,refy)
|
||||
** @param refy Search closest to (refx,refy)
|
||||
** @param rsltx Will hold result X
|
||||
** @param rsltx Will hold result Y
|
||||
*/
|
||||
void ZoneFindConnexion(int a, int b, int refx, int refy, int* rsltx, int* rslty)
|
||||
{
|
||||
|
@ -1051,7 +1053,7 @@ void ZoneFindConnexion(int a, int b, int refx, int refy, int* rsltx, int* rslty)
|
|||
}
|
||||
|
||||
/**
|
||||
** Refresh connection between zones
|
||||
** Refresh connection between zones
|
||||
*/
|
||||
static void RefreshZones(void)
|
||||
{
|
||||
|
@ -1114,7 +1116,7 @@ static void RefreshZones(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Allocate space for tile=>region mapping
|
||||
** Allocate space for tile=>region mapping
|
||||
*/
|
||||
static void AllocateMapping(void)
|
||||
{
|
||||
|
@ -1128,7 +1130,7 @@ static void AllocateMapping(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Initialise all data structures of the MapSplitter
|
||||
** Initialise all data structures of the MapSplitter
|
||||
**
|
||||
*/
|
||||
void MapSplitterInit(void)
|
||||
|
@ -1144,7 +1146,7 @@ void MapSplitterInit(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Free all structure owned by the MapSplitter
|
||||
** Free all structure owned by the MapSplitter
|
||||
**
|
||||
*/
|
||||
void MapSplitterClean(void)
|
||||
|
@ -1154,7 +1156,7 @@ void MapSplitterClean(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Called each cycle to maintain correctness of the mapping
|
||||
** Called each cycle to maintain correctness of the mapping
|
||||
**
|
||||
*/
|
||||
void MapSplitterEachCycle(void)
|
||||
|
@ -1240,16 +1242,16 @@ void MapSplitterEachCycle(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Can the unit 'src' reach the place x,y.
|
||||
** Can the unit 'src' reach the place x,y.
|
||||
**
|
||||
** @param src Unit for the path.
|
||||
** @param x Map X tile position.
|
||||
** @param y Map Y tile position.
|
||||
** @param w Width of Goal
|
||||
** @param h Height of Goal
|
||||
** @param range Range to the tile.
|
||||
** @param src Unit for the path.
|
||||
** @param x Map X tile position.
|
||||
** @param y Map Y tile position.
|
||||
** @param w Width of Goal
|
||||
** @param h Height of Goal
|
||||
** @param range Range to the tile.
|
||||
**
|
||||
** @return Distance to place.
|
||||
** @return Distance to place.
|
||||
*/
|
||||
int PlaceReachable(Unit* src, int goal_x, int goal_y, int w, int h, int minrange, int maxrange)
|
||||
{
|
||||
|
@ -1271,7 +1273,7 @@ int PlaceReachable(Unit* src, int goal_x, int goal_y, int w, int h, int minrange
|
|||
}
|
||||
|
||||
/**
|
||||
** Check if zone connections need a refresh & do it
|
||||
** Check if zone connections need a refresh & do it
|
||||
*/
|
||||
void ClearZoneNeedRefresh(void)
|
||||
{
|
||||
|
@ -1281,5 +1283,7 @@ void ClearZoneNeedRefresh(void)
|
|||
}
|
||||
}
|
||||
|
||||
#endif // MAP_REGIONS
|
||||
//@}
|
||||
|
||||
#endif // MAP_REGIONS
|
||||
|
||||
|
|
|
@ -5,12 +5,12 @@
|
|||
// /_______ /|__| |__| (____ /__| (____ /\___ /|____//____ >
|
||||
// \/ \/ \//_____/ \/
|
||||
// ______________________ ______________________
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
//
|
||||
/**@name splitter.h - The map splitter headerfile. */
|
||||
/**@name splitter.h - The map splitter headerfile. */
|
||||
//
|
||||
// (c) Copyright 1998-2003 by Ludovic Pollet
|
||||
// (c) Copyright 1998-2003 by Ludovic Pollet
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -26,7 +26,7 @@
|
|||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
// 02111-1307, USA.
|
||||
//
|
||||
// $Id$
|
||||
// $Id$
|
||||
|
||||
#ifndef __SPLITTER_H__
|
||||
#define __SPLITTER_H__
|
||||
|
@ -38,10 +38,10 @@
|
|||
----------------------------------------------------------------------------*/
|
||||
|
||||
// Should be enough for every one :-)
|
||||
#define MaxZoneNumber 512 /// Max number of zone ( separated area )
|
||||
#define MaxRegionNumber 4096 /// Max number of regions ( divisions of zones )
|
||||
#define MaxZoneNumber 512 ///< Max number of zone ( separated area )
|
||||
#define MaxRegionNumber 4096 ///< Max number of regions ( divisions of zones )
|
||||
|
||||
#define NoRegion ((RegionId)~0UL)
|
||||
#define NoRegion ((RegionId)~0UL)
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Structures
|
||||
|
|
|
@ -5,12 +5,12 @@
|
|||
// /_______ /|__| |__| (____ /__| (____ /\___ /|____//____ >
|
||||
// \/ \/ \//_____/ \/
|
||||
// ______________________ ______________________
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
//
|
||||
/**@name splitter_debug.c - Map splitter into regions - debugging. */
|
||||
/**@name splitter_debug.c - Map splitter into regions - debugging. */
|
||||
//
|
||||
// (c) Copyright 1999-2003 by Ludovic Pollet
|
||||
// (c) Copyright 1999-2003 by Ludovic Pollet
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -26,13 +26,13 @@
|
|||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
// 02111-1307, USA.
|
||||
//
|
||||
// $Id$
|
||||
// $Id$
|
||||
//@{
|
||||
|
||||
#ifdef MAP_REGIONS
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Includes
|
||||
-- Includes
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -49,12 +49,12 @@
|
|||
#include "splitter_local.h"
|
||||
|
||||
/**
|
||||
** Start an xpm file for storing map representation (debug only)
|
||||
** Start an xpm file for storing map representation (debug only)
|
||||
**
|
||||
** @param f Output file
|
||||
** @param sx Image size (X)
|
||||
** @param sy Image size (Y)
|
||||
** @param nbcols Max number of colors
|
||||
** @param f Output file
|
||||
** @param sx Image size (X)
|
||||
** @param sy Image size (Y)
|
||||
** @param nbcols Max number of colors
|
||||
*/
|
||||
static void StartXpm(FILE * f, int sx,int sy, int nbcols)
|
||||
{
|
||||
|
@ -92,8 +92,8 @@ static void StartXpm(FILE * f, int sx,int sy, int nbcols)
|
|||
}
|
||||
|
||||
/**
|
||||
** Assign each region a color in such a way that
|
||||
** two adjacents regions will never have the same color
|
||||
** Assign each region a color in such a way that
|
||||
** two adjacents regions will never have the same color
|
||||
*/
|
||||
static void RegionAssignColor(void)
|
||||
{
|
||||
|
@ -119,9 +119,9 @@ static void RegionAssignColor(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Full Debug
|
||||
** Create a "debugregions.xpm" containing the splitted map
|
||||
** Also call some debug functions
|
||||
** Full Debug
|
||||
** Create a "debugregions.xpm" containing the splitted map
|
||||
** Also call some debug functions
|
||||
*/
|
||||
void MapSplitterDebug(void)
|
||||
{
|
||||
|
@ -220,9 +220,9 @@ void MapSplitterDebug(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Check that not mappable tile are not mapped,
|
||||
** check that water is mapped in watter region,
|
||||
** ...
|
||||
** Check that not mappable tile are not mapped,
|
||||
** check that water is mapped in watter region,
|
||||
** ...
|
||||
*/
|
||||
void RegionDebugWater(void)
|
||||
{
|
||||
|
@ -242,10 +242,10 @@ void RegionDebugWater(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Check existing connections for a given region
|
||||
** and compare with existing values
|
||||
** Check existing connections for a given region
|
||||
** and compare with existing values
|
||||
**
|
||||
** @param reg the region
|
||||
** @param reg the region
|
||||
*/
|
||||
static void RegionDebugConnexion(RegionId reg)
|
||||
{
|
||||
|
@ -254,12 +254,12 @@ static void RegionDebugConnexion(RegionId reg)
|
|||
int Connections[MaxRegionNumber];
|
||||
int ConnectionsCount[MaxRegionNumber];
|
||||
int ConnectionNb;
|
||||
// RegionDefinition * adef;
|
||||
// RegionDefinition * adef;
|
||||
|
||||
int tx,ty;
|
||||
int x,y;
|
||||
int i,j;
|
||||
// int found;
|
||||
// int found;
|
||||
|
||||
seg = Regions[reg].FirstSegment;
|
||||
ConnectionNb = 0;
|
||||
|
@ -327,7 +327,7 @@ static void RegionDebugConnexion(RegionId reg)
|
|||
}
|
||||
|
||||
/**
|
||||
** Find all existing connections between regions & compare to dynamic structure
|
||||
** Find all existing connections between regions & compare to dynamic structure
|
||||
**
|
||||
*/
|
||||
void RegionDebugAllConnexions(void)
|
||||
|
|
|
@ -5,12 +5,12 @@
|
|||
// /_______ /|__| |__| (____ /__| (____ /\___ /|____//____ >
|
||||
// \/ \/ \//_____/ \/
|
||||
// ______________________ ______________________
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
//
|
||||
/**@name splitter_local.h - The map headerfile. */
|
||||
//
|
||||
// (c) Copyright 1998-2003 by Ludovic Pollet
|
||||
// (c) Copyright 1998-2003 by Ludovic Pollet
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -26,7 +26,7 @@
|
|||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
// 02111-1307, USA.
|
||||
//
|
||||
// $Id$
|
||||
// $Id$
|
||||
|
||||
#ifndef __SPLITTER_LOCAL_H__
|
||||
#define __SPLITTER_LOCAL_H__
|
||||
|
@ -46,9 +46,9 @@ struct _region_line_{
|
|||
};
|
||||
|
||||
typedef struct _region_definition_{
|
||||
int TileCount; ///< Nb of tile assigned to it
|
||||
int MinX, MinY; ///< Upper left corner
|
||||
int MaxX, MaxY; ///< Bottom right corner
|
||||
int TileCount; ///< Nb of tile assigned to it
|
||||
int MinX, MinY; ///< Upper left corner
|
||||
int MaxX, MaxY; ///< Bottom right corner
|
||||
|
||||
long SumX, SumY; ///< May limit map to ~512x512
|
||||
|
||||
|
@ -84,7 +84,7 @@ typedef struct _circular_filler_{
|
|||
/*----------------------------------------------------------------------------
|
||||
-- Macros
|
||||
----------------------------------------------------------------------------*/
|
||||
#define MaxZone 1024
|
||||
#define MaxZone 1024
|
||||
#define InMap(x,y) (((unsigned)(x)<(unsigned)TheMap.Width)&&(((unsigned)(y)<(unsigned)TheMap.Height)))
|
||||
#define MapFlag(x,y) TheMap.Fields[x + TheMap.Width * y].Flags
|
||||
#define RegionMapping(x,y) (RegionMappingStorage[(x) + TheMap.Width * (y)])
|
||||
|
|
|
@ -5,12 +5,12 @@
|
|||
// /_______ /|__| |__| (____ /__| (____ /\___ /|____//____ >
|
||||
// \/ \/ \//_____/ \/
|
||||
// ______________________ ______________________
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
//
|
||||
/**@name splitter_lowlevel.c - Low level funcs for Regions. */
|
||||
/**@name splitter_lowlevel.c - Low level funcs for Regions. */
|
||||
//
|
||||
// (c) Copyright 1999-2003 by Ludovic Pollet
|
||||
// (c) Copyright 1999-2003 by Ludovic Pollet
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -26,14 +26,14 @@
|
|||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
// 02111-1307, USA.
|
||||
//
|
||||
// $Id$
|
||||
|
||||
//@{
|
||||
// $Id$
|
||||
|
||||
#ifdef MAP_REGIONS
|
||||
|
||||
//@{
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Includes
|
||||
-- Includes
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -50,10 +50,10 @@
|
|||
#include "splitter_local.h"
|
||||
|
||||
/**
|
||||
** Remove a segment from a region
|
||||
** Remove a segment from a region
|
||||
**
|
||||
** @param def the RegionDefinition structure
|
||||
** @param seg the segment to remove
|
||||
** @param def The RegionDefinition structure
|
||||
** @param seg The segment to remove
|
||||
*/
|
||||
void RegionDelSegment(RegionDefinition* def, RegionSegment* seg)
|
||||
{
|
||||
|
@ -73,12 +73,12 @@ void RegionDelSegment(RegionDefinition* def, RegionSegment* seg)
|
|||
}
|
||||
|
||||
/**
|
||||
** Add a segment to a region
|
||||
** Add a segment to a region
|
||||
**
|
||||
** @param def the RegionDefinition structure
|
||||
** @param seg the segment to add
|
||||
** @param def The RegionDefinition structure
|
||||
** @param seg The segment to add
|
||||
*/
|
||||
void RegionAddSegment(RegionDefinition * def,int x0,int x1,int y)
|
||||
void RegionAddSegment(RegionDefinition* def,int x0,int x1,int y)
|
||||
{
|
||||
RegionSegment* seg;
|
||||
seg = (RegionSegment*) malloc(sizeof(RegionSegment));
|
||||
|
@ -99,14 +99,14 @@ void RegionAddSegment(RegionDefinition * def,int x0,int x1,int y)
|
|||
}
|
||||
|
||||
/**
|
||||
** Add a segment to a region. Eventually, existing segment are collapsed
|
||||
** Add a segment to a region. Eventually, existing segment are collapsed
|
||||
**
|
||||
** @param def the RegionDefinition structure
|
||||
** @param x0 Minimum x of the segment
|
||||
** @param x0 Maximum x of the segment
|
||||
** @param y Y coord of the segment
|
||||
** @param def The RegionDefinition structure
|
||||
** @param x0 Minimum x of the segment
|
||||
** @param x1 Maximum x of the segment
|
||||
** @param y Y coord of the segment
|
||||
*/
|
||||
void RegionAppendSegment(RegionDefinition * def,int x0,int x1,int y)
|
||||
void RegionAppendSegment(RegionDefinition* def, int x0, int x1, int y)
|
||||
{
|
||||
RegionSegment* seg;
|
||||
seg = def->FirstSegment;
|
||||
|
@ -125,11 +125,11 @@ void RegionAppendSegment(RegionDefinition * def,int x0,int x1,int y)
|
|||
}
|
||||
|
||||
/**
|
||||
** Update min & max in a region
|
||||
** Update min & max in a region
|
||||
**
|
||||
** @param def the RegionDefinition structure
|
||||
** @param x X coord of a cell
|
||||
** @param y Y coord of a cell
|
||||
** @param def The RegionDefinition structure
|
||||
** @param x X coord of a cell
|
||||
** @param y Y coord of a cell
|
||||
*/
|
||||
void RegionUpdateMinMax(RegionDefinition* adef,int x,int y)
|
||||
{
|
||||
|
@ -156,14 +156,14 @@ void RegionUpdateMinMax(RegionDefinition* adef,int x,int y)
|
|||
|
||||
|
||||
/**
|
||||
** Find A point one a region, closest to a given vertical line (x)
|
||||
** Find A point one a region, closest to a given vertical line (x)
|
||||
**
|
||||
** @param def the RegionDefinition structure
|
||||
** @param x x coord of the vertical line
|
||||
** @param vx X result value
|
||||
** @param vy Y result value
|
||||
** @param def The RegionDefinition structure
|
||||
** @param x x coord of the vertical line
|
||||
** @param vx X result value
|
||||
** @param vy Y result value
|
||||
*/
|
||||
void RegionFindPointOnX(RegionDefinition * def,int x,int * vx,int * vy)
|
||||
void RegionFindPointOnX(RegionDefinition* def,int x,int * vx,int * vy)
|
||||
{
|
||||
RegionSegment *cur;
|
||||
int bestx, besty, bestxdelta, bestydelta;
|
||||
|
@ -209,14 +209,14 @@ void RegionFindPointOnX(RegionDefinition * def,int x,int * vx,int * vy)
|
|||
}
|
||||
|
||||
/**
|
||||
** Find A point one a region, closest to a given horizontal line (y)
|
||||
** Find A point one a region, closest to a given horizontal line (y)
|
||||
**
|
||||
** @param def the RegionDefinition structure
|
||||
** @param x y coord of the horizontal line
|
||||
** @param vx X result value
|
||||
** @param vy Y result value
|
||||
** @param def The RegionDefinition structure
|
||||
** @param x y coord of the horizontal line
|
||||
** @param vx X result value
|
||||
** @param vy Y result value
|
||||
*/
|
||||
void RegionFindPointOnY(RegionDefinition * def,int y,int * vx,int * vy)
|
||||
void RegionFindPointOnY(RegionDefinition* def,int y,int * vx,int * vy)
|
||||
{
|
||||
RegionSegment *cur;
|
||||
int bestx, besty, bestxdelta, bestydelta;
|
||||
|
@ -262,7 +262,7 @@ void RegionFindPointOnY(RegionDefinition * def,int y,int * vx,int * vy)
|
|||
}
|
||||
|
||||
/**
|
||||
** Allocate the temp storage area
|
||||
** Allocate the temp storage area
|
||||
*/
|
||||
void RegionTempStorageAllocate(void)
|
||||
{
|
||||
|
@ -270,7 +270,7 @@ void RegionTempStorageAllocate(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Free the temp storage area
|
||||
** Free the temp storage area
|
||||
*/
|
||||
void RegionTempStorageFree(void)
|
||||
{
|
||||
|
@ -278,10 +278,10 @@ void RegionTempStorageFree(void)
|
|||
}
|
||||
|
||||
/**
|
||||
** Fill a region in the temp storage area
|
||||
** Fill a region in the temp storage area
|
||||
**
|
||||
** @param adef the region definition
|
||||
** @param value value to fill with
|
||||
** @param adef The region definition
|
||||
** @param value Value to fill with
|
||||
*/
|
||||
void RegionTempStorageFillRegion(RegionDefinition* adef,int value)
|
||||
{
|
||||
|
@ -304,10 +304,10 @@ void RegionTempStorageFillRegion(RegionDefinition* adef,int value)
|
|||
}
|
||||
|
||||
/**
|
||||
** Unmark points of a regions in the temp storage area
|
||||
** Unmark points of a regions in the temp storage area
|
||||
**
|
||||
** @param regid the regiond ID
|
||||
** @param markvalue cells with value == markvalue will become 0
|
||||
** @param regid The regiond ID
|
||||
** @param markvalue Cells with value == markvalue will become 0
|
||||
*/
|
||||
void RegionTempStorageUnmarkPoints(RegionId regid, int markvalue)
|
||||
{
|
||||
|
@ -333,16 +333,16 @@ void RegionTempStorageUnmarkPoints(RegionId regid, int markvalue)
|
|||
}
|
||||
|
||||
/**
|
||||
** Mark some points of a region in the temp storage area
|
||||
** Mark some points of a region in the temp storage area
|
||||
**
|
||||
** @param regid the regiond ID
|
||||
** @param points MapPoint array
|
||||
** @param nbpoint MapPoint array size
|
||||
** @param maxmak Maximum number of point to mark
|
||||
** @param markvalu points get marked with this value
|
||||
** @return The number of points marked
|
||||
** @param regid The regiond ID
|
||||
** @param points MapPoint array
|
||||
** @param nbpoint MapPoint array size
|
||||
** @param maxmak Maximum number of point to mark
|
||||
** @param markvalue Points get marked with this value
|
||||
** @return The number of points marked
|
||||
*/
|
||||
static int RegionTempStorageMarkPoints(RegionId regid, MapPoint * points, int nbpoints, int maxmark,int markvalue)
|
||||
static int RegionTempStorageMarkPoints(RegionId regid, MapPoint* points, int nbpoints, int maxmark, int markvalue)
|
||||
{
|
||||
int id;
|
||||
int rslt;
|
||||
|
@ -374,11 +374,11 @@ static int RegionTempStorageMarkPoints(RegionId regid, MapPoint * points, int nb
|
|||
}
|
||||
|
||||
/**
|
||||
** Mark limits of a regions in the temp storage area
|
||||
** Mark limits of a regions in the temp storage area
|
||||
**
|
||||
** @param regid the regiond ID
|
||||
** @param maxmak Maximum number of point to mark
|
||||
** @param markvalu points get marked with this value
|
||||
** @param regid The regiond ID
|
||||
** @param maxmak Maximum number of point to mark
|
||||
** @param markvalue Points get marked with this value
|
||||
*/
|
||||
int RegionTempStorageMarkObstacle(RegionId regid, int maxmark,int markvalue)
|
||||
{
|
||||
|
@ -472,19 +472,19 @@ int RegionTempStorageMarkObstacle(RegionId regid, int maxmark,int markvalue)
|
|||
}
|
||||
|
||||
/**
|
||||
** Make marked points bigger ( mark their adjacent with markvalue + 1 )
|
||||
** Multiple invoquation lead to bigger marks
|
||||
** Make marked points bigger ( mark their adjacent with markvalue + 1 )
|
||||
** Multiple invoquation lead to bigger marks
|
||||
**
|
||||
** @param regid the regiond ID
|
||||
** @param maxmak Maximum number of point to mark
|
||||
** @param markvalu points marked with this value will be "grown"
|
||||
** @param regid The regiond ID
|
||||
** @param maxmak Maximum number of point to mark
|
||||
** @param markvalue Points marked with this value will be "grown"
|
||||
*/
|
||||
int RegionTempStorageEmbossObstacle(RegionId regid, int maxmark,int markvalue)
|
||||
{
|
||||
int markednb;
|
||||
RegionDefinition * adef;
|
||||
RegionSegment * seg;
|
||||
MapPoint * marked;
|
||||
RegionDefinition* adef;
|
||||
RegionSegment* seg;
|
||||
MapPoint* marked;
|
||||
int x,y;
|
||||
int tx,ty;
|
||||
int i;
|
||||
|
@ -535,15 +535,15 @@ int RegionTempStorageEmbossObstacle(RegionId regid, int maxmark,int markvalue)
|
|||
}
|
||||
|
||||
/**
|
||||
** Set the connection count in rega for regb to value
|
||||
** Set the connection count in rega for regb to value
|
||||
**
|
||||
** @param rega The region to change connection value
|
||||
** @param regb Other region in the connection
|
||||
** @param value The new connection count between the two regions
|
||||
** @param rega The region to change connection value
|
||||
** @param regb Other region in the connection
|
||||
** @param value The new connection count between the two regions
|
||||
*/
|
||||
void RegionSetConnection(RegionId rega, RegionId regb, int value)
|
||||
{
|
||||
RegionDefinition * adef;
|
||||
RegionDefinition* adef;
|
||||
int j;
|
||||
|
||||
adef = Regions + rega;
|
||||
|
@ -582,11 +582,11 @@ void RegionSetConnection(RegionId rega, RegionId regb, int value)
|
|||
}
|
||||
|
||||
/**
|
||||
** Add to the connection count in rega for regb to value
|
||||
** Add to the connection count in rega for regb to value
|
||||
**
|
||||
** @param rega The region to change connection value
|
||||
** @param regb Other region in the connection
|
||||
** @param value The value to add to the connection count between the two regions
|
||||
** @param rega The region to change connection value
|
||||
** @param regb Other region in the connection
|
||||
** @param value The value to add to the connection count between the two regions
|
||||
*/
|
||||
void RegionAddConnection(RegionId rega, RegionId regb,int value)
|
||||
{
|
||||
|
@ -627,11 +627,11 @@ void RegionAddConnection(RegionId rega, RegionId regb,int value)
|
|||
}
|
||||
|
||||
/**
|
||||
** Add a value to a connection count between two regions (symetrical)
|
||||
** Add a value to a connection count between two regions (symetrical)
|
||||
**
|
||||
** @param rega On of the region to change connection value
|
||||
** @param regb Other region in the connection
|
||||
** @param value The value to add to the connection count between the two regions
|
||||
** @param rega On of the region to change connection value
|
||||
** @param regb Other region in the connection
|
||||
** @param value The value to add to the connection count between the two regions
|
||||
*/
|
||||
void RegionAddBidirConnection(RegionId rega, RegionId regb,int value)
|
||||
{
|
||||
|
@ -640,13 +640,13 @@ void RegionAddBidirConnection(RegionId rega, RegionId regb,int value)
|
|||
}
|
||||
|
||||
/**
|
||||
** Initialise a "CircularFiller", which fill points in the temp storage area.
|
||||
** Initialise a "CircularFiller", which fill points in the temp storage area.
|
||||
**
|
||||
** @param filler pointer to a CircularFiller structure
|
||||
** @param region region to fill
|
||||
** @param startx start point x coord
|
||||
** @param starty start point y coord
|
||||
** @param value value it will fill with
|
||||
** @param filler pointer to a CircularFiller structure
|
||||
** @param region region to fill
|
||||
** @param startx start point x coord
|
||||
** @param starty start point y coord
|
||||
** @param value value it will fill with
|
||||
*/
|
||||
void CircularFillerInit(CircularFiller* filler, RegionId region, int startx, int starty, int value)
|
||||
{
|
||||
|
@ -663,9 +663,9 @@ void CircularFillerInit(CircularFiller* filler, RegionId region, int startx, int
|
|||
}
|
||||
|
||||
/**
|
||||
** Free a CircularFiller private structures
|
||||
** Free a CircularFiller private structures
|
||||
**
|
||||
** @param filler the filler to free
|
||||
** @param filler the filler to free
|
||||
*/
|
||||
void CircularFillerDone(CircularFiller * filler)
|
||||
{
|
||||
|
@ -673,10 +673,10 @@ void CircularFillerDone(CircularFiller * filler)
|
|||
}
|
||||
|
||||
/**
|
||||
** Mark one point with a circularefiller
|
||||
** Mark one point with a circularefiller
|
||||
**
|
||||
** @param filler the filler
|
||||
** @return 1 if one point marked, 0 else
|
||||
** @param filler the filler
|
||||
** @return 1 if one point marked, 0 else
|
||||
*/
|
||||
int CircularFillerStep(CircularFiller * filler)
|
||||
{
|
||||
|
@ -725,9 +725,9 @@ int CircularFillerStep(CircularFiller * filler)
|
|||
}
|
||||
|
||||
/**
|
||||
** Rescan a region to update its connections
|
||||
** Rescan a region to update its connections
|
||||
**
|
||||
** @param regid the region to scan
|
||||
** @param regid the region to scan
|
||||
*/
|
||||
void RegionRescanAdjacents(RegionId regid)
|
||||
{
|
||||
|
@ -810,16 +810,16 @@ void RegionRescanAdjacents(RegionId regid)
|
|||
}
|
||||
|
||||
/**
|
||||
** Adjust the connections of the given region, when taking cell x,y into account
|
||||
** This function updates connections and eventually mark the region for a connex check
|
||||
** Adjust the connections of the given region, when taking cell x,y into account
|
||||
** This function updates connections and eventually mark the region for a connex check
|
||||
**
|
||||
** @param reg the region
|
||||
** @param x X coord of the cell
|
||||
** @param y Y coord of the cell
|
||||
** @param add 1 if cell is added to the region, 0 else
|
||||
** @param bidir Operate in both directions
|
||||
** @param reg the region
|
||||
** @param x X coord of the cell
|
||||
** @param y Y coord of the cell
|
||||
** @param add 1 if cell is added to the region, 0 else
|
||||
** @param bidir Operate in both directions
|
||||
*/
|
||||
void RegionUpdateConnection(RegionId reg,int x,int y,int add,int bidir)
|
||||
void RegionUpdateConnection(RegionId reg, int x, int y, int add, int bidir)
|
||||
{
|
||||
int adj;
|
||||
int ax, ay;
|
||||
|
@ -846,6 +846,7 @@ void RegionUpdateConnection(RegionId reg,int x,int y,int add,int bidir)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
#endif // MAP_REGIONS
|
||||
//@}
|
||||
|
||||
#endif // MAP_REGIONS
|
||||
|
||||
|
|
|
@ -5,12 +5,12 @@
|
|||
// /_______ /|__| |__| (____ /__| (____ /\___ /|____//____ >
|
||||
// \/ \/ \//_____/ \/
|
||||
// ______________________ ______________________
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
// T H E W A R B E G I N S
|
||||
// Stratagus - A free fantasy real time strategy game engine
|
||||
//
|
||||
/**@name splitter_zoneset.c - Manipulation of zone set. */
|
||||
/**@name splitter_zoneset.c - Manipulation of zone set. */
|
||||
//
|
||||
// (c) Copyright 1999-2003 by Ludovic Pollet
|
||||
// (c) Copyright 1999-2003 by Ludovic Pollet
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
|
@ -26,14 +26,14 @@
|
|||
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
// 02111-1307, USA.
|
||||
//
|
||||
// $Id$
|
||||
|
||||
//@{
|
||||
// $Id$
|
||||
|
||||
#ifdef MAP_REGIONS
|
||||
|
||||
//@{
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
-- Includes
|
||||
-- Includes
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -51,10 +51,10 @@
|
|||
|
||||
|
||||
/**
|
||||
** Clear a ZoneSet structure (make it ready for usage)
|
||||
** Only first call eats CPU cycle.
|
||||
** Clear a ZoneSet structure (make it ready for usage)
|
||||
** Only first call eats CPU cycle.
|
||||
**
|
||||
** @param m pointer to a ZoneSet structure
|
||||
** @param m pointer to a ZoneSet structure
|
||||
*/
|
||||
void ZoneSetClear(ZoneSet* m)
|
||||
{
|
||||
|
@ -74,11 +74,11 @@ void ZoneSetClear(ZoneSet* m)
|
|||
}
|
||||
|
||||
/**
|
||||
** Add a zone to a ZoneSet structure
|
||||
** Add a zone to a ZoneSet structure
|
||||
**
|
||||
** @param m pointer to a ZoneSet structure
|
||||
** @param zone zone to add
|
||||
** @return 1 if the zone is new in the set
|
||||
** @param m Pointer to a ZoneSet structure
|
||||
** @param zone Zone to add
|
||||
** @return 1 if the zone is new in the set
|
||||
*/
|
||||
int ZoneSetAddZone(ZoneSet * m, int zone)
|
||||
{
|
||||
|
@ -91,10 +91,10 @@ int ZoneSetAddZone(ZoneSet * m, int zone)
|
|||
}
|
||||
|
||||
/**
|
||||
** Make a union of two ZoneSet
|
||||
** Make a union of two ZoneSet
|
||||
**
|
||||
** @param dst ZoneSet which will be modifier
|
||||
** @param src ZoneSet which will be added into dst
|
||||
** @param dst ZoneSet which will be modifier
|
||||
** @param src ZoneSet which will be added into dst
|
||||
*/
|
||||
void ZoneSetAddSet(ZoneSet* dst, ZoneSet* src)
|
||||
{
|
||||
|
@ -106,11 +106,11 @@ void ZoneSetAddSet(ZoneSet* dst, ZoneSet* src)
|
|||
}
|
||||
|
||||
/**
|
||||
** Check if two ZoneSet have at least one common zone
|
||||
** Check if two ZoneSet have at least one common zone
|
||||
**
|
||||
** @param dst pointer to a ZoneSet structure
|
||||
** @param src pointer to a ZoneSet structure
|
||||
** @return 1 if a common zone was found, 0 else
|
||||
** @param dst pointer to a ZoneSet structure
|
||||
** @param src pointer to a ZoneSet structure
|
||||
** @return 1 if a common zone was found, 0 else
|
||||
*/
|
||||
int ZoneSetHasIntersect(ZoneSet* dst, ZoneSet* src)
|
||||
{
|
||||
|
@ -124,10 +124,10 @@ int ZoneSetHasIntersect(ZoneSet* dst, ZoneSet* src)
|
|||
}
|
||||
|
||||
/**
|
||||
** Compute the intersection of two ZoneSet structure
|
||||
** Compute the intersection of two ZoneSet structure
|
||||
**
|
||||
** @param dst pointer to the ZoneSet which will hold the result
|
||||
** @param src other ZoneSet in the operation
|
||||
** @param dst pointer to the ZoneSet which will hold the result
|
||||
** @param src other ZoneSet in the operation
|
||||
*/
|
||||
void ZoneSetIntersect(ZoneSet* dst, ZoneSet* src)
|
||||
{
|
||||
|
@ -154,13 +154,13 @@ void ZoneSetIntersect(ZoneSet* dst, ZoneSet* src)
|
|||
}
|
||||
|
||||
/**
|
||||
** Add the zone of a map cell into a ZoneSet
|
||||
** Add the zone of a map cell into a ZoneSet
|
||||
**
|
||||
** @param zs pointer to a ZoneSet structure
|
||||
** @param x X coord of the map cell
|
||||
** @param y Y coord of the map cell
|
||||
** @param zs pointer to a ZoneSet structure
|
||||
** @param x X coord of the map cell
|
||||
** @param y Y coord of the map cell
|
||||
*/
|
||||
void ZoneSetAddCell(ZoneSet * zs,int x,int y)
|
||||
void ZoneSetAddCell(ZoneSet* zs, int x, int y)
|
||||
{
|
||||
RegionId region;
|
||||
|
||||
|
@ -174,31 +174,31 @@ void ZoneSetAddCell(ZoneSet * zs,int x,int y)
|
|||
}
|
||||
|
||||
/**
|
||||
** Check if a ZoneSet contains a given zone
|
||||
** Check if a ZoneSet contains a given zone
|
||||
**
|
||||
** @param zs pointer to the ZoneSet
|
||||
** @param zone the zone
|
||||
** @return 1 if zs contains the zone, 0 else
|
||||
** @param zs pointer to the ZoneSet
|
||||
** @param zone The zone
|
||||
** @return 1 if zs contains the zone, 0 else
|
||||
*/
|
||||
int ZoneSetContains(ZoneSet * zs,int zone)
|
||||
int ZoneSetContains(ZoneSet* zs, int zone)
|
||||
{
|
||||
return zs->Marks[zone] == zs->Id;
|
||||
}
|
||||
|
||||
/**
|
||||
** Add a rectangle (not filled) of tile, if they are accessible regarding the mask
|
||||
** Add a rectangle (not filled) of tile, if they are accessible regarding the mask
|
||||
**
|
||||
** @param zs pointer to a ZoneSet
|
||||
** @param x0 Rectangle coordinate
|
||||
** @param y0 Rectangle coordinate
|
||||
** @param x1 Rectangle coordinate
|
||||
** @param y1 Rectangle coordinate
|
||||
** @param range Range around the rectangle
|
||||
** @param mask Mask to check cell for
|
||||
** @param zs pointer to a ZoneSet
|
||||
** @param x0 Rectangle coordinate
|
||||
** @param y0 Rectangle coordinate
|
||||
** @param x1 Rectangle coordinate
|
||||
** @param y1 Rectangle coordinate
|
||||
** @param range Range around the rectangle
|
||||
** @param mask Mask to check cell for
|
||||
*/
|
||||
static void ZoneSetAddPassableRange(ZoneSet * zs,int x0,int y0,int x1,int y1,int range,int mask)
|
||||
static void ZoneSetAddPassableRange(ZoneSet* zs, int x0, int y0, int x1, int y1, int range, int mask)
|
||||
{
|
||||
static int turn[5][2]={{1,0},{0,1},{-1,0},{0,-1}};
|
||||
static const int turn[5][2] = {{1,0},{0,1},{-1,0},{0,-1}};
|
||||
int x,y;
|
||||
int dir;
|
||||
|
||||
|
@ -219,15 +219,15 @@ static void ZoneSetAddPassableRange(ZoneSet * zs,int x0,int y0,int x1,int y1,int
|
|||
dir++;
|
||||
}
|
||||
x += turn[dir][0];
|
||||
y += turn[dir][1];
|
||||
y += turn[dir][1];
|
||||
} while (dir < 4);
|
||||
}
|
||||
|
||||
/**
|
||||
** Add the zone(s) accessible by an unit
|
||||
** Add the zone(s) accessible by an unit
|
||||
**
|
||||
** @param source pointer to a ZoneSet
|
||||
** @param src pointer to an unit
|
||||
** @param source Pointer to a ZoneSet
|
||||
** @param src Pointer to an unit
|
||||
*/
|
||||
void ZoneSetAddUnitZones(ZoneSet * source,Unit * src)
|
||||
{
|
||||
|
@ -257,16 +257,16 @@ void ZoneSetAddUnitZones(ZoneSet * source,Unit * src)
|
|||
}
|
||||
|
||||
/**
|
||||
** Add a unit's goal to a zoneset. The goal is checked with the unit's movement mask
|
||||
** Add a unit's goal to a zoneset. The goal is checked with the unit's movement mask
|
||||
**
|
||||
** @param dest pointer to a ZoneSet
|
||||
** @param src pointer to an unit
|
||||
** @param goal_x coordinate of the goal
|
||||
** @param goal_y coordinate of the goal
|
||||
** @param w width in cell of the goal
|
||||
** @param h height in cell of the goal
|
||||
** @param minrange minrange to the goal
|
||||
** @param maxrange maxrange to the goal
|
||||
** @param dest pointer to a ZoneSet
|
||||
** @param src pointer to an unit
|
||||
** @param goal_x coordinate of the goal
|
||||
** @param goal_y coordinate of the goal
|
||||
** @param w width in cell of the goal
|
||||
** @param h height in cell of the goal
|
||||
** @param minrange minrange to the goal
|
||||
** @param maxrange maxrange to the goal
|
||||
*/
|
||||
void ZoneSetAddGoalZones(ZoneSet* dest,Unit* src, int goal_x, int goal_y,int w,int h,int minrange,int maxrange)
|
||||
{
|
||||
|
@ -309,11 +309,11 @@ void ZoneSetAddGoalZones(ZoneSet* dest,Unit* src, int goal_x, int goal_y,int w,i
|
|||
}
|
||||
|
||||
/**
|
||||
** Add To a ZoneSet zone which can be reached in one step from zone.
|
||||
** Only Water-to-Land connexion are taken into account.
|
||||
** Add To a ZoneSet zone which can be reached in one step from zone.
|
||||
** Only Water-to-Land connexion are taken into account.
|
||||
**
|
||||
** @param dst pointer to a ZoneSet
|
||||
** @param zone the zone which adjacent are searched
|
||||
** @param dst pointer to a ZoneSet
|
||||
** @param zone The zone which adjacent are searched
|
||||
*/
|
||||
static void ZoneSetAddZoneAdjacents(ZoneSet * dst, int zone)
|
||||
{
|
||||
|
@ -335,10 +335,10 @@ static void ZoneSetAddZoneAdjacents(ZoneSet * dst, int zone)
|
|||
}
|
||||
|
||||
/**
|
||||
** Add to a ZoneSet all zone which are directly connected zones
|
||||
** Add to a ZoneSet all zone which are directly connected zones
|
||||
**
|
||||
** @param dst ZoneSet to add zones to
|
||||
** @param src Zones for which connected zones are searched
|
||||
** @param dst ZoneSet to add zones to
|
||||
** @param src Zones for which connected zones are searched
|
||||
*/
|
||||
void ZoneSetAddConnected(ZoneSet* dst, ZoneSet * src)
|
||||
{
|
||||
|
@ -349,17 +349,17 @@ void ZoneSetAddConnected(ZoneSet* dst, ZoneSet * src)
|
|||
}
|
||||
|
||||
/**
|
||||
** Find a path throught zones (for transporters, ...)
|
||||
** Find a path throught zones (for transporters, ...)
|
||||
**
|
||||
** @param src Starting zones
|
||||
** @param dst Destination zones
|
||||
** @param path will hold the zones
|
||||
** @param pathlen will hold the path length
|
||||
** @param src Starting zones
|
||||
** @param dst Destination zones
|
||||
** @param path will hold the zones
|
||||
** @param pathlen will hold the path length
|
||||
*/
|
||||
int ZoneSetFindPath(ZoneSet* src,ZoneSet* dst,int * path,int * pathlen)
|
||||
int ZoneSetFindPath(ZoneSet* src, ZoneSet* dst, int* path, int* pathlen)
|
||||
{
|
||||
static ZoneSet current={0};
|
||||
static ZoneSet newzones={0};
|
||||
static ZoneSet current = {0};
|
||||
static ZoneSet newzones = {0};
|
||||
int zonedst[MaxZoneNumber];
|
||||
int zonenext[MaxZoneNumber];
|
||||
int i, j, curdst;
|
||||
|
@ -425,6 +425,7 @@ int ZoneSetFindPath(ZoneSet* src,ZoneSet* dst,int * path,int * pathlen)
|
|||
} while(1);
|
||||
}
|
||||
|
||||
#endif // MAP_REGIONS
|
||||
//@}
|
||||
|
||||
#endif // MAP_REGIONS
|
||||
|
||||
|
|
Loading…
Reference in a new issue