Commit 9f3a7097 authored by progs's avatar progs

Meta-serveur, algo de recherche du chemin le plus rapide, police fixed,...

Meta-serveur, algo de recherche du chemin le plus rapide, police fixed, possibilité d'annuler le mouvement d'une unité


git-svn-id: svn://svn.gna.org/svn/menareants/trunk@867 6832cf7c-ce15-0410-9f4e-c008ec2580bf
parent daba15e0
......@@ -15,6 +15,7 @@ Sommaire:
6) Etat d'une partie
7) Intelligence Artificielle
8) Entités Conteneurs
9) Meta serveur
1) Principe du jeu
......@@ -116,6 +117,7 @@ Sommaire:
)<entité> :s'envoyer dans une unité conteneur (voir 8. Entités Conteneurs)
(<pos> :sortir d'une unité conteneur (voir 8. Entités Conteneurs)
° :upgrader
C :annuler les déplacements
4) Modes
La commande SET nécessite l'utilisation de modes, semblables à l'IRC.
......@@ -212,4 +214,35 @@ Sommaire:
Il faut que le conteneur gère le fait que si celui ci bouge il faut que son contenu bouge aussi (seulement son pointeur
case et non se mettre dans la liste des entités d'une case, vu qu'elle ne doit plsu exister).
Il faut également que la taille maximale à contenir soit proportionnel au "nombre" du conteneur.
\ No newline at end of file
Il faut également que la taille maximale à contenir soit proportionnel au "nombre" du conteneur.
9) Meta serveur
Le meta-server permet de constituer une liste des serveurs lancés. Chaque serveur au démarrage se connecte au meta-serveur et
le restera jusqu'à son extinction. A chaque evenement il envoie des informations, tels que le nombre de joueurs connectés, le
nom de la carte, etc.
Le client, quant à lui, se connecte au meta-serveur pour obtenir cette liste.
a) Meta-server -> Serveur
HEL <prog> <version> :Dit bonjour, s'informe sur son type et sa version de protocole
b) Serveur -> Meta-server
IAM <name> <prog> <version> :Donne son nom, son prog et sa version
SET <modes> [<args> ..] :Change un paramètre
+p <nb players> :- nombre de players actuellement
+P <max players> :- max players
+g <nb games> :- nombre de jeux
+G <max games> :- max jeux
+w <nb waiting games> :- nombre de jeux en attente
+v <version> :- version du protocole
+i <port> :- port
c) Meta-server <-> Client
> HEL <prog> <version> :Dit bonjour, s'informe sur son type et sa version de protocole
< IAM <name> <prog> <version> :Donne son nom, son prog et sa version
> LSP <ip:port> <nom> <+/-> <nbjoueurs> :liste une partie
<nbmax> <nbgames> <maxgames> <proto>
> EOL :fin du listing
\ No newline at end of file
2006-12-23 Romain Bignon <progs@headfucking.net>
* src/Sockets.cpp: EC_Client est maintenant utilisable pour plusieurs fins (meta-server et menareantsd).
* src/Login.cpp (TListServerForm): Récupération et affichage d'une liste de serveurs depuis un meta-serveur, spécifié dans la conf.
2006-12-22 Romain Bignon <progs@headfucking.net>
* src/data/fonts/: Changement pour une font fixed.
* meta-server: Création d'un daemon meta-serveur qui permet de recenser tous les serveurs lancés. Le client se connecte dessus d'abord pour obtenir une liste avec des informations, puis
choisis le serveur.
* server/*: Utilisation du meta-serveur.
2006-12-08 Romain Bignon <progs@headfucking.net>
* src/Sockets.cpp: Résolution du problème qui faisait crasher lorsqu'il ne trouvait pas une dns.
* server/Map.cpp, server/Channels.cpp: Récupération de la partie de la fonction EChannel::RemovePlayer() qui supprimait les evenements des entités, création
de la fonction ECEntity::CancelEvents().
* API, server/InGame.cpp, src/InGame.cpp: Gestion de l'annulation pour les unités.
2006-12-05 Romain Bignon <progs@headfucking.net>
* lib/Map.h: Implémentation d'un algorithme de recherche du chemin le plus court (A*).
* server/IA.cpp: Application dans la fonction TIA::WantMoveTo(), qui passe de 150 lignes à 25 lignes !
* src/InGame.cpp: Application lors du clique, permettant un clique direct en diagonale.
2006-12-04 Romain Bignon <progs@headfucking.net>
* src/InGame.cpp: Correction du crash de don de territoire.
......
INSTALL_SERVER=@INSTALL_SERVER@
INSTALL_GAME=@INSTALL_GAME@
SUBDIRS = lib ${INSTALL_SERVER} ${INSTALL_GAME}
INSTALL_META_SERVER=@INSTALL_META_SERVER@
SUBDIRS = lib ${INSTALL_META_SERVER} ${INSTALL_SERVER} ${INSTALL_GAME}
AUTOMAKE_OPTIONS = foreign
......@@ -10,11 +11,11 @@ doxygen:
update:
@echo "Updating.."
@svn update
@svn update
@echo "Compilation.."
@./config.status --recheck > /dev/null && make > /dev/null
@echo "MenAreAnts is Up-to-date !"
@echo "You have to reinstall (with make install) this game."
clean-generic:
-rm -f .#* *~
......@@ -97,6 +97,7 @@ ECHO_T = @ECHO_T@
EXEEXT = @EXEEXT@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_GAME = @INSTALL_GAME@
INSTALL_META_SERVER = @INSTALL_META_SERVER@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_SERVER = @INSTALL_SERVER@
......@@ -175,7 +176,7 @@ target_alias = @target_alias@
target_cpu = @target_cpu@
target_os = @target_os@
target_vendor = @target_vendor@
SUBDIRS = lib ${INSTALL_SERVER} ${INSTALL_GAME}
SUBDIRS = lib ${INSTALL_META_SERVER} ${INSTALL_SERVER} ${INSTALL_GAME}
AUTOMAKE_OPTIONS = foreign
all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive
......@@ -607,7 +608,7 @@ doxygen:
update:
@echo "Updating.."
@svn update
@svn update
@echo "Compilation.."
@./config.status --recheck > /dev/null && make > /dev/null
@echo "MenAreAnts is Up-to-date !"
......
......@@ -3,25 +3,41 @@ Note: Lire le fichier DEVELOPPEURS pour participer
À faire:
* En cours
-pouvoir faire des déplacements en diagonal en un clique
-finir la connexion à un serveur, selectionné dans la liste reçue du meta-server
-améliorer le find fast path pour, si la case d'arrivée est inacessible, aller jusqu'à la case accessible
la plus proche de la case d'arrivée.
* Urgent
-vérifier l'arme nucléaire (il avait pas l'air de supprimer toutes les unités de la case)
-> il faut améliorer le système d'attaques pour vérifier *qui* est sur la case à ce moment là.
tout du moins, il faut voir pour gérer, coté serveur le fait que ça soit l'entité qui envoye les informations
de changement de nb ou de suppression.
-pouvoir envoyer un changement de niveau via le protocole
-pouvoir jarter musique/effet dans les options, ainsi que changer de chanson
-limiter le nombre d'unités à construire sur batiments
-pouvoir envoyer de ses propres maps au serveur pendant la création de la partie
** Objectifs pour la version 0.4
-> Multiplier les unités
-> Sauvegarder les parties
-> Language de scripting opérationnel pour les missions
-> Création de quelques missions
-> Création d'un tutoriel, obligatoire au premier lancement du jeu
-> Modification fondamentale du système des attaques: permettre plusieurs attaques implicites d'affilé
(mon char avance de 3 cases, et rencontre d'abord une unité enemie. Il y a combat. Si mon unité gagne,
elle continue son chemin. Il est possible qu'elle rencontre encore une unité enemie. Il y a recombat.
Si je gagne, on continue encore).
-> Un Fast Find Path qui marche avec une recherche de la case accessible la plus proche de la case voulue (si non accessible)
[DONE] Pouvoir annuler les actions d'une unité
* Après
-faire une mission de tutoriel
-pouvoir annuler
-à la fin des parties, sauvegarder l'etat de la carte pour ensuite afficher un tableau des parties avec les scores
-bug qui fait qu'en plein écran sous windows on ne voye pas la souris.
-permettre d'ajouter de l'infanterie dans un bateau qui contient déjà de l'infanterie du même type
-pouvoir définir une cible sur plusieurs tours
-afficher les deplacements anticipés de ses alliés (peut etre)
-lier par fleche deux cases, affiché chez les alliés, pour faire des strategies
-pouvoir envoyer de ses propres maps au serveur pendant la création de la partie
-ordre des animations (important pour MOVE -> CONTAINING -> MOVE, et les unions)
* Bof
......@@ -37,19 +53,17 @@ Note: Lire le fichier DEVELOPPEURS pour participer
présents dans ses mouvements. Je proposerais une annulation du mouvement et un appel arbitraire à
ARMCommand::Exec pour ne pas avoir à réécrire tout le code.
** Objectif actuel
-Multiplier les unités
** Unités
- Tout le monde
- batiment qui permet de ne pas avoir le semi brouillard
- char qui permet de tirer à une ou deux cases d'interval..
- batiment qui permet de ne pas avoir le semi brouillard (premiere version, toutes les cases -1 passent en 0, et upgrade pour tout tout voir)
- upgrades de la caserne et de l'usine d'armement
- unité Dorian qui vend de l'alcool: les unités touchées se dirigent n'importe comment !
- unité Gay
- unité Zidane qui fou des coups de boule
- unité Handicap International qui permet de déminer
- batiment ou unité ou upgrade du lance missile qui tire un champ electrique
- "unité" mur
- barbelés
- déchets radioactifs après une bombe nucléaire
- sous marins
- lance missile marin
......
......@@ -653,6 +653,7 @@ RANLIB
WIN32_TRUE
WIN32_FALSE
INSTALL_SERVER
INSTALL_META_SERVER
INSTALL_GAME
SDL_CONFIG
CC
......@@ -1261,6 +1262,7 @@ Optional Features:
--disable-dependency-tracking speeds up one-time build
--enable-dependency-tracking do not reject slow dependency extractors
--enable-server compilation of Men Are Ants' server
--enable-meta-server compilation of Men Are Ants' meta-server
--disable-game compilation without Men Are Ants' game
--disable-sdltest Do not try to compile and run a test SDL program
--enable-warnings enable warnings during compilation (-Wall)
......@@ -3311,6 +3313,18 @@ if test "${enable_server+set}" = set; then
fi
# Check whether --enable-meta-server was given.
if test "${enable_meta_server+set}" = set; then
enableval=$enable_meta_server;
if test "x${enableval}" != "xno"; then
INSTALL_META_SERVER=meta-server
fi
fi
# NE PAS COMPILER ET INSTALLER LE JEU
INSTALL_GAME_Q=1
......@@ -4994,7 +5008,8 @@ echo "${ECHO_T}$gccver" >&6; }
# en reserve: -Weffc++ (il fait bien mal aux variables non initialises)
# -pedantic (il trouve rien part une rptition de ;; dans SDL_ttf.h)
# -Wold-style-cast (prohibe les anciens styles de conversions)
GCC_FLAGS="-Wall -ansi -Wstrict-null-sentinel"
GCC_FLAGS="-Wall -ansi"
CXXFLAGS="$CXXFLAGS -Wstrict-null-sentinel"
if test "$gccvernum" -ge "400"; then
GCC_FLAGS="$GCC_FLAGS -Wextra"
......@@ -5031,7 +5046,7 @@ MAP_FILES=`echo $MAP_FILES`
ac_config_files="$ac_config_files Makefile src/Makefile src/data/Makefile lib/Makefile server/Makefile server/menareantsd.conf server/maps/Makefile"
ac_config_files="$ac_config_files Makefile src/Makefile src/data/Makefile lib/Makefile server/Makefile server/menareantsd.conf server/maps/Makefile meta-server/Makefile"
cat >confcache <<\_ACEOF
......@@ -5620,6 +5635,7 @@ do
"server/Makefile") CONFIG_FILES="$CONFIG_FILES server/Makefile" ;;
"server/menareantsd.conf") CONFIG_FILES="$CONFIG_FILES server/menareantsd.conf" ;;
"server/maps/Makefile") CONFIG_FILES="$CONFIG_FILES server/maps/Makefile" ;;
"meta-server/Makefile") CONFIG_FILES="$CONFIG_FILES meta-server/Makefile" ;;
*) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
......@@ -5772,13 +5788,13 @@ RANLIB!$RANLIB$ac_delim
WIN32_TRUE!$WIN32_TRUE$ac_delim
WIN32_FALSE!$WIN32_FALSE$ac_delim
INSTALL_SERVER!$INSTALL_SERVER$ac_delim
INSTALL_META_SERVER!$INSTALL_META_SERVER$ac_delim
INSTALL_GAME!$INSTALL_GAME$ac_delim
SDL_CONFIG!$SDL_CONFIG$ac_delim
CC!$CC$ac_delim
CFLAGS!$CFLAGS$ac_delim
ac_ct_CC!$ac_ct_CC$ac_delim
CCDEPMODE!$CCDEPMODE$ac_delim
am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
_ACEOF
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
......@@ -5820,6 +5836,7 @@ _ACEOF
ac_delim='%!_!# '
for ac_last_try in false false false false false :; do
cat >conf$$subs.sed <<_ACEOF
am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
SDL_CFLAGS!$SDL_CFLAGS$ac_delim
SDL_LIBS!$SDL_LIBS$ac_delim
......@@ -5829,7 +5846,7 @@ LIBOBJS!$LIBOBJS$ac_delim
LTLIBOBJS!$LTLIBOBJS$ac_delim
_ACEOF
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 7; then
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 8; then
break
elif $ac_last_try; then
{ { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
......
......@@ -36,6 +36,17 @@ AC_ARG_ENABLE( server,
],
)
AC_ARG_ENABLE( meta-server,
[AC_HELP_STRING([--enable-meta-server],[compilation of Men Are Ants' meta-server])],
[
if test "x${enableval}" != "xno"; then
INSTALL_META_SERVER=meta-server
AC_SUBST(INSTALL_META_SERVER)
fi
],
)
# NE PAS COMPILER ET INSTALLER LE JEU
INSTALL_GAME_Q=1
......@@ -163,7 +174,8 @@ if test "x$GCC" = "xyes"; then
# en reserve: -Weffc++ (il fait bien mal aux variables non initialises)
# -pedantic (il trouve rien part une rptition de ;; dans SDL_ttf.h)
# -Wold-style-cast (prohibe les anciens styles de conversions)
GCC_FLAGS="-Wall -ansi -Wstrict-null-sentinel"
GCC_FLAGS="-Wall -ansi"
CXXFLAGS="$CXXFLAGS -Wstrict-null-sentinel"
dnl Enable *more* warnings
if test "$gccvernum" -ge "400"; then
......@@ -203,7 +215,7 @@ MAP_FILES=`echo $MAP_FILES`
AC_SUBST([MAP_FILES])
AC_CONFIG_FILES(Makefile src/Makefile src/data/Makefile lib/Makefile server/Makefile server/menareantsd.conf server/maps/Makefile)
AC_CONFIG_FILES(Makefile src/Makefile src/data/Makefile lib/Makefile server/Makefile server/menareantsd.conf server/maps/Makefile meta-server/Makefile)
AC_OUTPUT
......@@ -38,8 +38,6 @@ typedef std::vector<ECBEntity*> BEntityVector;
class ECBPlayer;
typedef std::vector<ECBPlayer*> BPlayerVector;
/********************************************************************************************
* ECBPlayer *
********************************************************************************************/
......
......@@ -28,14 +28,25 @@
#define COUNTRY_CHARS "azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN"
#define IA_CHAR '&'
#define SERV_SMALLNAME "MenAreAntsD"
#define CLIENT_SMALLNAME "MenAreAnts"
#define MS_SMALLNAME "MenAreAntsMS"
#define SERV_DEFPORT 5461
#define MSERV_DEFPORT 5460
/* Version protocolaire
* incrmenter en cas de modification du protocole
*/
#define APP_PVERSION "10"
#define APP_PVERSION "11"
#define APP_MSPROTO "1"
/* Version du jeu (forme alpha.beta[-patch]) */
#define APP_VERSION_ALPHA "0"
#define APP_VERSION_BETA "3.3"
#define APP_VERSION_BETA "4"
/* Definir si c'est une version instable (ne peut compiler qu'avec --enable-debug) */
#define UNSTABLE
/* Dfinir un (seul) des "patch" suivant (ou aucun) */
#if 1
......@@ -46,6 +57,8 @@
#define APP_VERSION_PATCH "pre3" /* troisime pr release */
#endif
#ifdef __cplusplus
/* Tailles de variables */
const unsigned int NICKLEN=10;
const unsigned int GAMELEN=20;
......@@ -71,5 +84,6 @@ const unsigned int GAMELEN=20;
#define FORit(T, v, x) \
for(std::vector<T>::iterator (x) = (v).begin(); (x) != (v).end(); ++(x))
#endif /* __cplusplus */
#endif /* ECLIB_Defines_h */
......@@ -93,6 +93,7 @@ ECHO_T = @ECHO_T@
EXEEXT = @EXEEXT@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_GAME = @INSTALL_GAME@
INSTALL_META_SERVER = @INSTALL_META_SERVER@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_SERVER = @INSTALL_SERVER@
......
......@@ -353,6 +353,182 @@ std::string ECBEntity::LongName()
return std::string(Owner() ? Owner()->GetNick() : "*") + "!" + ID();
}
/********************************************************************************************
* ECBFindFastPath *
********************************************************************************************/
bool ECBFindFastPath::FindPath()
{
ECBCase* courant = from_case;
noeud depart;
depart.parent = 0;
/* ajout de courant dans la liste ouverte */
liste_ouverte[courant]=depart;
ajouter_liste_fermee(courant);
ajouter_cases_adjacentes(courant);
/* tant que la destination n'a pas t atteinte et qu'il reste des noeuds explorer dans la liste ouverte */
while(courant != to_case && !liste_ouverte.empty())
{
/* on cherche le meilleur noeud de la liste ouverte, on sait qu'elle n'est pas vide donc il existe */
courant = meilleur_noeud(liste_ouverte);
/* on le passe dans la liste fermee, il ne peut pas dj y tre */
ajouter_liste_fermee(courant);
/* on recommence la recherche des noeuds adjacents */
ajouter_cases_adjacentes(courant);
}
/* si la destination est atteinte, on remonte le chemin */
if (courant == to_case)
{
retrouver_chemin();
return true;
}
return false;
}
bool ECBFindFastPath::deja_present_dans_liste(ECBCase* n, l_noeud& l)
{
l_noeud::iterator i = l.find(n);
if (i==l.end())
return false;
else
return true;
}
void ECBFindFastPath::ajouter_cases_adjacentes(ECBCase* n)
{
noeud tmp;
/* on met tous les noeud adjacents dans la liste ouverte (+vrif) */
for (int _i=n->X()-1; _i<=int(n->X()+1); _i++)
{
if ((_i<0) || (_i >= (int)map->Width())) /* en dehors de l'image, on oublie */
continue;
uint i = _i;
for (int _j=n->Y()-1; _j<=int(n->Y()+1); _j++)
{
if ((_j<0) || (_j>=(int)map->Height())) /* en dehors de l'image, on oublie */
continue;
uint j = _j;
if(!((i==n->X()) ^ (j==n->Y()))) // Case actuelle ou diagonale
continue;
ECBCase* it = (*map)(i,j);
if (entity->CanWalkOn(it) == false)
/* obstace, terrain non franchissable, on oublie */
continue;
if (!deja_present_dans_liste(it, liste_fermee))
{
/* le noeud n'est pas dj prsent dans la liste ferme */
/* calcul du cout G du noeud en cours d'tude : cout du parent + distance jusqu'au parent */
tmp.cout_g = liste_fermee[n].cout_g + n->Delta(it);
/* calcul du cout H du noeud la destination */
tmp.cout_h = it->Delta(to_case);
tmp.cout_f = tmp.cout_g + tmp.cout_h;
tmp.parent = n;
if (deja_present_dans_liste(it, liste_ouverte))
{
/* le noeud est dj prsent dans la liste ouverte, il faut comparer les couts */
if (tmp.cout_f < liste_ouverte[it].cout_f){
/* si le nouveau chemin est meilleur, on met jour */
liste_ouverte[it]=tmp;
}
/* le noeud courant a un moins bon chemin, on ne change rien */
}else{
/* le noeud n'est pas prsent dans la liste ouverte, on l'y ajoute */
liste_ouverte[it]=tmp;
}
}
}
}
}
ECBCase* ECBFindFastPath::meilleur_noeud(l_noeud& l)
{
float m_coutf = l.begin()->second.cout_f;
ECBCase* m_noeud = l.begin()->first;
for (l_noeud::iterator i = l.begin(); i!=l.end(); i++)
if (i->second.cout_f< m_coutf)
{
m_coutf = i->second.cout_f;
m_noeud = i->first;
}
return m_noeud;
}
void ECBFindFastPath::ajouter_liste_fermee(ECBCase* p)
{
noeud n = liste_ouverte[p];
liste_fermee[p]=n;
/* il faut le supprimer de la liste ouverte, ce n'est plus une solution explorable */
if (liste_ouverte.erase(p)==0)
throw ECExcept("", "Erreur, le noeud n'apparait pas dans la liste ouverte, impossible supprimer");
return;
}
ECBMove::E_Move ECBFindFastPath::find_movement(ECBCase* from, ECBCase* to)
{
if(from->X() == to->X())
{
if(from->Y() > to->Y())
return ECBMove::Up;
else
return ECBMove::Down;
}
else if(from->Y() == to->Y())
{
if(from->X() > to->X())
return ECBMove::Left;
else
return ECBMove::Right;
}
else
throw ECExcept(VIName(from->X()) VIName(from->Y()) VIName(to->X()) VIName(to->Y()), "Mouvement introuvable");
}
void ECBFindFastPath::retrouver_chemin()
{
noeud& tmp = liste_fermee[to_case];
ECBCase* n = to_case;
ECBCase* prec = tmp.parent;
//moves.push(find_movement(n, ));
while (prec)
{
moves.push(find_movement(prec, n));
n = prec;
tmp = liste_fermee[tmp.parent];
prec = tmp.parent;
}
}
bool ECBEntity::FindFastPath(ECBCase* dest, std::stack<ECBMove::E_Move>& move, ECBCase* from)
{
ECBFindFastPath fastpath(this, dest, from ? from : Case());
if(fastpath.FindPath() == false) return false;
move = fastpath.Moves();
return true;
}
/********************************************************************************************
* ECBCountry *
********************************************************************************************/
......@@ -562,7 +738,7 @@ void ECBMap::Init()
std::string ligne;
bool recv_map = false;
bool recv_map = false, recv_scripting = false;
uint _x = 0, _y = 0, num_player = 0;
for(std::vector<std::string>::iterator it = map_file.begin(); it != map_file.end(); ++it)
......@@ -570,7 +746,7 @@ void ECBMap::Init()
ligne = (*it);
if(ligne[0] == '#' || ligne[0] == '\0') continue; /* Commentaire */
if(ligne[ligne.size()-1] == '\r')
ligne.resize(ligne.size()-1);
ligne.resize(ligne.size()-1);
if(ligne == "EOM")
{
if(_y < y)
......@@ -578,7 +754,14 @@ void ECBMap::Init()
recv_map = false;
continue;
}
if(!recv_map)
else if(ligne == "STOP_SCRIPTING")
{
recv_scripting = false;
continue;
}
else if(recv_scripting)
scripting.push_back(ligne);
else if(!recv_map)
{
SeeMapLine(ligne);
std::string key = stringtok(ligne, " ");
......@@ -603,7 +786,8 @@ void ECBMap::Init()
mp->SetNick(ligne);
}
else if(key == "MAP") recv_map = true;
else if(key == "BEGIN") {}
else if(key == "START_SCRIPTING") recv_scripting = true;
else if(key == "BEGIN") {} // compatibilit
else if(key == "CITY") city_money = atoi(ligne.c_str());
else if(key == "MIN") min = atoi(ligne.c_str());
else if(key == "MAX") max = atoi(ligne.c_str());
......
......@@ -24,6 +24,8 @@
#include <string>
#include <vector>
#include <stack>
#include <map>
#include "Outils.h"
/** @page Map_structure Map structure
......@@ -316,6 +318,13 @@ public:
/** Does this entity like an other entity ? */
bool Like(const ECBEntity* e) const;
/** Find the fast path...
* @param dest this is the destination of the target
* @param moves a list of movements (usage of ECBMove::E_Move)
* @return true if there is a path, and false if there isn't any solution.
*/
bool FindFastPath(ECBCase* dest, std::stack<ECBMove::E_Move>& moves, ECBCase* from = 0);
/* Attributs */
public:
......@@ -578,6 +587,58 @@ public:
}
};
/********************************************************************************************
* ECBFindFastPath *
********************************************************************************************/
class ECBFindFastPath
{
/* Variables prives */
private:
struct noeud
{
noeud() : cout_g(0), cout_h(0), cout_f(0), parent(0) {}
float cout_g, cout_h, cout_f;
ECBCase* parent;
};
typedef std::map<ECBCase*, noeud> l_noeud;
ECBMap* map;
ECBEntity* entity;
ECBCase* to_case;
ECBCase* from_case;
l_noeud liste_fermee;
l_noeud liste_ouverte;
std::stack<ECBMove::E_Move> moves;
/* Constructeur */
public:
ECBFindFastPath(ECBEntity* _entity, ECBCase* _c, ECBCase* _from)
: map(_entity->Map()), entity(_entity), to_case(_c), from_case(_from)
{}
/* Methodes */
public:
bool FindPath();
/* Attributs */
public:
std::stack<ECBMove::E_Move> Moves() const { return moves; }
/* Methodes prives */
private:
bool deja_present_dans_liste(ECBCase* n, l_noeud& l);
void ajouter_cases_adjacentes(ECBCase* n);
ECBCase* meilleur_noeud(l_noeud& l);
void ajouter_liste_fermee(ECBCase* p);
ECBMove::E_Move find_movement(ECBCase* from, ECBCase* to);
void retrouver_chemin();
};
/********************************************************************************************
* ECBCountry *
********************************************************************************************/
......@@ -782,6 +843,8 @@ protected:
std::vector<std::string> map_infos;
std::vector<std::string> scripting;
ECList<ECBEntity*> entities;
ECList<ECBEntity*> neutres;
......
INCLUDES = -I. -I$(top_srcdir) -I$(top_srcdir)/lib
bin_PROGRAMS = menareants-meta-server
menareants_meta_server_SOURCES = \
main.c \
sockets.c \
servers.c \
clients.c
clean-generic:
-rm -f .#* *~
This diff is collapsed.
/* meta-server/clients.c - About clients
*
* Copyright (C) 2006 Romain Bignon <Progs@headfucking.net>
*
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* $Id: Timer.h 824 2006-09-11 21:39:58Z progs $