/*
* Seven Kingdoms: Ancient Adversaries
*
* Copyright 1997,1998 Enlight Software Ltd.
*
* 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
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* 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, see .
*
*/
//Filename : OSPATHS2.H
//Description : Header file of Object SeekPathS2
//Owner : Alex
#ifndef __OSPATHS2_H
#define __OSPATHS2_H
#ifndef __OSPATH_H
#include
#endif
class NodeS2
{
public:
short node_x, node_y;
int node_f, node_h;// could be replaced by "unsigned short" to reduce memory, set all member vars to "unsigned short" for consistency
short node_g;
char node_type; // the type of the node, total 16 different type, 4 points in a 2x2 node, blocked/non-blocked, so there are 2^4 combinations
char enter_direction;
// enter_direction -- 1-8 for eight directions, 0 for the starting node
//
// 8 7 6
// 1 x 5 where x is the reference point
// 2 3 4
NodeS2* parent_node;
NodeS2* child_node[MAX_CHILD_NODE];
NodeS2* next_node;
public:
short generate_successors(short);//, short, short);
short generate_succ(short x, short y, short direction, short cost);
void propagate_down();
};
//------- Define struct ResultNode --------//
/*struct ResultNode
{
public:
short node_x, node_y;
};*/
//---------- Define class StackS2 ----------//
struct StackS2
{
NodeS2 *old_parent_node_ptr;
NodeS2 *node_ptr;
StackS2 *next_stack_ptr;
};
//--------- Define class SeekPathS2 --------//
class SeekPathS2
{
friend class NodeS2;
public:
char path_status;
short real_sour_x, real_sour_y; // the actual coordinate of the starting point
short real_dest_x, real_dest_y; // the actual coordinate of the destination point
short dest_x, dest_y; // the coordinate of the destination represented in 2x2 node form
char is_dest_blocked;
//char source_locate_type;
//char dest_locate_type;
short border_x1, border_y1, border_x2, border_y2;
//short vir_border_x2, vir_border_y2;
NodeS2* open_node_list;
NodeS2* closed_node_list;
short* node_matrix;
NodeS2* node_array;
int max_node;
int node_count;
NodeS2* result_node_ptr;
private:
ResultNode* max_size_result_node_ptr; // point to the temprory result node list
ResultNode* parent_result_node_ptr; // the parent node of the currently node pointed by max_size_result_node_ptr
int upper_left_x; // x coord. of upper left corner of the 2x2 node
int upper_left_y; // y coord. of upper left corner of the 2x2 node
public:
SeekPathS2() { node_array=NULL; }
~SeekPathS2() { deinit(); }
void init(int maxNode);
void deinit();
void set_node_matrix(short reuseNodeMatrix[]);
void reset();
inline void add_result_node(ResultNode** curPtr, ResultNode** prePtr, int& count);
int seek(int sx,int sy,int dx,int dy,DWORD groupId, char mobileType,short searchMode=1, short miscNo=0,int maxTries=0,int borderX1=0, int borderY1=0, int borderX2=MAX_WORLD_X_LOC-1, int borderY2=MAX_WORLD_Y_LOC-1);
int continue_seek(int,char=0);
ResultNode* get_result(int& resultNodeCount, short& pathDist);
NodeS2* return_closest_node();
ResultNode* smooth_the_path(ResultNode* nodeArray, int& nodeCount); // smoothing the path
private:
NodeS2* return_best_node();
void insert_open_node(NodeS2 *succNode);
void process_start_node(int xLoc, int yLoc, char nodeType, char exitDirection, int &nodeCount);
void process_end_node(int xLoc, int yLoc, char nodeType, char enterDirection, int &nodeCount);
void get_real_result_node(int &count, short enterDirection, short exitDirection, short nodeType, short xCoord, short yCoord);
// function used to get the actual shortest path out of the 2x2 node path
};
extern SeekPathS2 seek_path_s2, seek_path_continue_s2;
//-----------------------------------------//
#endif